@agent-native/core 0.101.14 → 0.102.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/corpus/README.md +1 -1
- package/corpus/core/CHANGELOG.md +12 -0
- package/corpus/core/package.json +1 -1
- package/corpus/core/src/cli/templates-meta.ts +13 -0
- package/corpus/core/src/client/agent-page/AgentTabsPage.tsx +1 -1
- package/corpus/core/src/client/org/OrgSwitcher.tsx +2 -0
- package/corpus/templates/analytics/changelog/2026-07-15-fixed-the-agent-discarding-a-successful-dashboard-edit-and-r.md +6 -0
- package/corpus/templates/analytics/server/lib/real-data-actions.ts +30 -1
- package/corpus/templates/analytics/server/plugins/agent-chat.ts +15 -0
- package/corpus/templates/content/actions/_database-source-utils.ts +59 -4
- package/corpus/templates/content/actions/prepare-builder-source-review.ts +9 -0
- package/corpus/templates/content/actions/preview-builder-source-review.ts +6 -4
- package/corpus/templates/content/app/components/editor/DescriptionField.tsx +10 -2
- package/corpus/templates/content/app/components/editor/database/DatabaseView.tsx +4 -0
- package/corpus/templates/content/changelog/2026-07-15-page-and-database-descriptions-now-use-a-clean-single-line-f.md +6 -0
- package/corpus/templates/content/changelog/2026-07-15-selected-builder-reviews-now-load-only-the-chosen-rows-avoid.md +6 -0
- package/corpus/templates/content/shared/api.ts +1 -0
- package/corpus/templates/tasks/.agents/commands/visual-plan.md +9 -0
- package/corpus/templates/tasks/.agents/commands/visual-recap.md +8 -0
- package/corpus/templates/tasks/.agents/skills/actions/SKILL.md +492 -0
- package/corpus/templates/tasks/.agents/skills/adding-a-feature/SKILL.md +189 -0
- package/corpus/templates/tasks/.agents/skills/agent-native-docs/SKILL.md +76 -0
- package/corpus/templates/tasks/.agents/skills/agent-watchdog/README.md +43 -0
- package/corpus/templates/tasks/.agents/skills/agent-watchdog/SKILL.md +110 -0
- package/corpus/templates/tasks/.agents/skills/agent-watchdog/agents/openai.yaml +4 -0
- package/corpus/templates/tasks/.agents/skills/capture-learnings/SKILL.md +89 -0
- package/corpus/templates/tasks/.agents/skills/change-summary/SKILL.md +83 -0
- package/corpus/templates/tasks/.agents/skills/create-skill/SKILL.md +221 -0
- package/corpus/templates/tasks/.agents/skills/delegate-to-agent/SKILL.md +263 -0
- package/corpus/templates/tasks/.agents/skills/efficient-fable/README.md +75 -0
- package/corpus/templates/tasks/.agents/skills/efficient-fable/SKILL.md +95 -0
- package/corpus/templates/tasks/.agents/skills/efficient-frontier/README.md +53 -0
- package/corpus/templates/tasks/.agents/skills/efficient-frontier/SKILL.md +73 -0
- package/corpus/templates/tasks/.agents/skills/frontend-design/SKILL.md +112 -0
- package/corpus/templates/tasks/.agents/skills/plan-arbiter/README.md +41 -0
- package/corpus/templates/tasks/.agents/skills/plan-arbiter/SKILL.md +114 -0
- package/corpus/templates/tasks/.agents/skills/plan-arbiter/agents/openai.yaml +4 -0
- package/corpus/templates/tasks/.agents/skills/plow-ahead/README.md +42 -0
- package/corpus/templates/tasks/.agents/skills/plow-ahead/SKILL.md +104 -0
- package/corpus/templates/tasks/.agents/skills/plow-ahead/agents/openai.yaml +4 -0
- package/corpus/templates/tasks/.agents/skills/quick-recap/README.md +55 -0
- package/corpus/templates/tasks/.agents/skills/quick-recap/SKILL.md +54 -0
- package/corpus/templates/tasks/.agents/skills/read-the-damn-docs/README.md +54 -0
- package/corpus/templates/tasks/.agents/skills/read-the-damn-docs/SKILL.md +126 -0
- package/corpus/templates/tasks/.agents/skills/read-the-damn-docs/agents/openai.yaml +4 -0
- package/corpus/templates/tasks/.agents/skills/real-time-sync/SKILL.md +232 -0
- package/corpus/templates/tasks/.agents/skills/security/SKILL.md +280 -0
- package/corpus/templates/tasks/.agents/skills/self-modifying-code/SKILL.md +106 -0
- package/corpus/templates/tasks/.agents/skills/shadcn-ui/SKILL.md +95 -0
- package/corpus/templates/tasks/.agents/skills/stay-within-limits/README.md +61 -0
- package/corpus/templates/tasks/.agents/skills/stay-within-limits/SKILL.md +83 -0
- package/corpus/templates/tasks/.agents/skills/upgrade-agent-native/SKILL.md +87 -0
- package/corpus/templates/tasks/.agents/skills/visual-plan/SKILL.md +547 -0
- package/corpus/templates/tasks/.agents/skills/visual-plan/agent-native-skill.json +12 -0
- package/corpus/templates/tasks/.agents/skills/visual-plan/references/canvas.md +121 -0
- package/corpus/templates/tasks/.agents/skills/visual-plan/references/document-quality.md +178 -0
- package/corpus/templates/tasks/.agents/skills/visual-plan/references/exemplar.md +62 -0
- package/corpus/templates/tasks/.agents/skills/visual-plan/references/wireframe.md +264 -0
- package/corpus/templates/tasks/.agents/skills/visual-recap/SKILL.md +634 -0
- package/corpus/templates/tasks/.agents/skills/visual-recap/agent-native-skill.json +12 -0
- package/corpus/templates/tasks/.agents/skills/visual-recap/references/wireframe.md +264 -0
- package/corpus/templates/tasks/.claude/commands/visual-plan.md +9 -0
- package/corpus/templates/tasks/.claude/commands/visual-recap.md +8 -0
- package/corpus/templates/tasks/.env.example +5 -0
- package/corpus/templates/tasks/.ignore +0 -0
- package/corpus/templates/tasks/.prettierrc +5 -0
- package/corpus/templates/tasks/AGENTS.md +158 -0
- package/corpus/templates/tasks/DEVELOPING.md +185 -0
- package/corpus/templates/tasks/README.md +16 -0
- package/corpus/templates/tasks/actions/bulk-delete-inbox-items.ts +24 -0
- package/corpus/templates/tasks/actions/bulk-delete-tasks.ts +21 -0
- package/corpus/templates/tasks/actions/bulk-mark-inbox-items-ready.ts +27 -0
- package/corpus/templates/tasks/actions/bulk-update-tasks.ts +35 -0
- package/corpus/templates/tasks/actions/create-custom-field.ts +22 -0
- package/corpus/templates/tasks/actions/create-inbox-item.ts +30 -0
- package/corpus/templates/tasks/actions/create-task.ts +33 -0
- package/corpus/templates/tasks/actions/delete-custom-field.ts +19 -0
- package/corpus/templates/tasks/actions/delete-inbox-item.ts +17 -0
- package/corpus/templates/tasks/actions/delete-task.ts +17 -0
- package/corpus/templates/tasks/actions/lib/boolean-query-param.ts +30 -0
- package/corpus/templates/tasks/actions/list-custom-fields.ts +18 -0
- package/corpus/templates/tasks/actions/list-inbox-items.ts +16 -0
- package/corpus/templates/tasks/actions/list-tasks.ts +52 -0
- package/corpus/templates/tasks/actions/list-visible-task-fields.ts +18 -0
- package/corpus/templates/tasks/actions/mark-inbox-item-ready.ts +31 -0
- package/corpus/templates/tasks/actions/navigate.ts +51 -0
- package/corpus/templates/tasks/actions/reorder-custom-fields.ts +27 -0
- package/corpus/templates/tasks/actions/reorder-inbox-items.ts +24 -0
- package/corpus/templates/tasks/actions/reorder-tasks.ts +29 -0
- package/corpus/templates/tasks/actions/run.ts +2 -0
- package/corpus/templates/tasks/actions/update-custom-field.ts +33 -0
- package/corpus/templates/tasks/actions/update-inbox-item.ts +24 -0
- package/corpus/templates/tasks/actions/update-task.ts +68 -0
- package/corpus/templates/tasks/actions/update-visible-task-fields.ts +27 -0
- package/corpus/templates/tasks/actions/view-screen-helpers.ts +68 -0
- package/corpus/templates/tasks/actions/view-screen.ts +207 -0
- package/corpus/templates/tasks/app/components/custom-fields/FieldCreateBar.tsx +121 -0
- package/corpus/templates/tasks/app/components/custom-fields/FieldListRow.tsx +116 -0
- package/corpus/templates/tasks/app/components/custom-fields/FieldsList.tsx +225 -0
- package/corpus/templates/tasks/app/components/custom-fields/FieldsListSkeleton.tsx +18 -0
- package/corpus/templates/tasks/app/components/custom-fields/FieldsPage.tsx +42 -0
- package/corpus/templates/tasks/app/components/custom-fields/editor/FieldEditorSidebar.tsx +69 -0
- package/corpus/templates/tasks/app/components/custom-fields/editor/FieldTitleSection.tsx +32 -0
- package/corpus/templates/tasks/app/components/custom-fields/editor/config/CurrencyConfigControl.tsx +49 -0
- package/corpus/templates/tasks/app/components/custom-fields/editor/config/FieldConfigControl.tsx +56 -0
- package/corpus/templates/tasks/app/components/custom-fields/editor/config/NumberConfigControl.tsx +52 -0
- package/corpus/templates/tasks/app/components/custom-fields/editor/config/PercentConfigControl.tsx +30 -0
- package/corpus/templates/tasks/app/components/custom-fields/editor/config/SelectConfigControl.tsx +135 -0
- package/corpus/templates/tasks/app/components/custom-fields/editor/config/select-colors.ts +23 -0
- package/corpus/templates/tasks/app/components/custom-fields/editor/config/utils.ts +52 -0
- package/corpus/templates/tasks/app/components/custom-fields/editor/types.ts +7 -0
- package/corpus/templates/tasks/app/components/dnd/SortableItem.tsx +72 -0
- package/corpus/templates/tasks/app/components/dnd/SortableList.tsx +136 -0
- package/corpus/templates/tasks/app/components/dnd/reorder-moving-items.ts +160 -0
- package/corpus/templates/tasks/app/components/dnd/sortable-drag-props.ts +60 -0
- package/corpus/templates/tasks/app/components/inbox/InboxList.tsx +222 -0
- package/corpus/templates/tasks/app/components/inbox/InboxListPage.tsx +39 -0
- package/corpus/templates/tasks/app/components/inbox/InboxListRow.tsx +122 -0
- package/corpus/templates/tasks/app/components/layout/Header.tsx +55 -0
- package/corpus/templates/tasks/app/components/layout/HeaderActions.tsx +84 -0
- package/corpus/templates/tasks/app/components/layout/Layout.tsx +134 -0
- package/corpus/templates/tasks/app/components/layout/Sidebar.tsx +211 -0
- package/corpus/templates/tasks/app/components/shared/AddListItemInput.tsx +57 -0
- package/corpus/templates/tasks/app/components/shared/AlertDialog.tsx +53 -0
- package/corpus/templates/tasks/app/components/shared/BulkDeleteDialog.tsx +76 -0
- package/corpus/templates/tasks/app/components/shared/ChipSelect.tsx +240 -0
- package/corpus/templates/tasks/app/components/shared/DeleteItemDialog.tsx +40 -0
- package/corpus/templates/tasks/app/components/shared/InlineEditable.tsx +166 -0
- package/corpus/templates/tasks/app/components/shared/ListEmptyState.tsx +13 -0
- package/corpus/templates/tasks/app/components/shared/ListErrorMessage.tsx +15 -0
- package/corpus/templates/tasks/app/components/shared/ListViewHeader.tsx +75 -0
- package/corpus/templates/tasks/app/components/shared/PageHeader.tsx +25 -0
- package/corpus/templates/tasks/app/components/shared/RowActionsMenu.tsx +42 -0
- package/corpus/templates/tasks/app/components/shared/SidePanel.tsx +99 -0
- package/corpus/templates/tasks/app/components/shared/dnd/ListRowPreview.tsx +37 -0
- package/corpus/templates/tasks/app/components/shared/list/List.tsx +63 -0
- package/corpus/templates/tasks/app/components/shared/list/ListRow.tsx +159 -0
- package/corpus/templates/tasks/app/components/shared/list/ListRowDragHandle.tsx +52 -0
- package/corpus/templates/tasks/app/components/shared/list/ListSkeletonRows.tsx +11 -0
- package/corpus/templates/tasks/app/components/shared/list/SortableListItemShell.tsx +32 -0
- package/corpus/templates/tasks/app/components/shared/list/types.ts +1 -0
- package/corpus/templates/tasks/app/components/shared/selection/ListSelectionBar.tsx +158 -0
- package/corpus/templates/tasks/app/components/shared/selection/ListSelectionHeaderToggle.tsx +28 -0
- package/corpus/templates/tasks/app/components/shared/selection/ListSelectionToolbar.tsx +81 -0
- package/corpus/templates/tasks/app/components/shared/selection/get-list-row-selection-ui.ts +41 -0
- package/corpus/templates/tasks/app/components/shared/selection/use-list-selection.ts +196 -0
- package/corpus/templates/tasks/app/components/tasks/TaskList.tsx +333 -0
- package/corpus/templates/tasks/app/components/tasks/TaskListHeaderRow.tsx +46 -0
- package/corpus/templates/tasks/app/components/tasks/TaskListPage.tsx +115 -0
- package/corpus/templates/tasks/app/components/tasks/TaskListRow.css +49 -0
- package/corpus/templates/tasks/app/components/tasks/TaskListRow.tsx +307 -0
- package/corpus/templates/tasks/app/components/tasks/fields/TaskFieldsSidebar.tsx +102 -0
- package/corpus/templates/tasks/app/components/tasks/fields/TaskTitleSection.tsx +27 -0
- package/corpus/templates/tasks/app/components/tasks/fields/controls/DateValueControl.tsx +21 -0
- package/corpus/templates/tasks/app/components/tasks/fields/controls/FieldValueControl.tsx +76 -0
- package/corpus/templates/tasks/app/components/tasks/fields/controls/MultiSelectValueControl.tsx +52 -0
- package/corpus/templates/tasks/app/components/tasks/fields/controls/NumberValueControl.tsx +56 -0
- package/corpus/templates/tasks/app/components/tasks/fields/controls/RichTextValueControl.tsx +115 -0
- package/corpus/templates/tasks/app/components/tasks/fields/controls/SingleSelectValueControl.tsx +61 -0
- package/corpus/templates/tasks/app/components/tasks/fields/controls/TextValueControl.tsx +20 -0
- package/corpus/templates/tasks/app/components/tasks/use-task-row-completion-animation.ts +181 -0
- package/corpus/templates/tasks/app/components/ui/accordion.tsx +56 -0
- package/corpus/templates/tasks/app/components/ui/alert-dialog.tsx +1 -0
- package/corpus/templates/tasks/app/components/ui/alert.tsx +1 -0
- package/corpus/templates/tasks/app/components/ui/aspect-ratio.tsx +5 -0
- package/corpus/templates/tasks/app/components/ui/avatar.tsx +1 -0
- package/corpus/templates/tasks/app/components/ui/badge.tsx +1 -0
- package/corpus/templates/tasks/app/components/ui/breadcrumb.tsx +115 -0
- package/corpus/templates/tasks/app/components/ui/button.tsx +1 -0
- package/corpus/templates/tasks/app/components/ui/calendar.tsx +70 -0
- package/corpus/templates/tasks/app/components/ui/card.tsx +1 -0
- package/corpus/templates/tasks/app/components/ui/carousel.tsx +260 -0
- package/corpus/templates/tasks/app/components/ui/chart.tsx +379 -0
- package/corpus/templates/tasks/app/components/ui/checkbox.tsx +1 -0
- package/corpus/templates/tasks/app/components/ui/collapsible.tsx +1 -0
- package/corpus/templates/tasks/app/components/ui/command.tsx +1 -0
- package/corpus/templates/tasks/app/components/ui/context-menu.tsx +1 -0
- package/corpus/templates/tasks/app/components/ui/dialog.tsx +1 -0
- package/corpus/templates/tasks/app/components/ui/drawer.tsx +1 -0
- package/corpus/templates/tasks/app/components/ui/dropdown-menu.tsx +1 -0
- package/corpus/templates/tasks/app/components/ui/form.tsx +177 -0
- package/corpus/templates/tasks/app/components/ui/hover-card.tsx +27 -0
- package/corpus/templates/tasks/app/components/ui/input-otp.tsx +69 -0
- package/corpus/templates/tasks/app/components/ui/input.tsx +1 -0
- package/corpus/templates/tasks/app/components/ui/label.tsx +1 -0
- package/corpus/templates/tasks/app/components/ui/menubar.tsx +254 -0
- package/corpus/templates/tasks/app/components/ui/navigation-menu.tsx +128 -0
- package/corpus/templates/tasks/app/components/ui/pagination.tsx +121 -0
- package/corpus/templates/tasks/app/components/ui/popover.tsx +1 -0
- package/corpus/templates/tasks/app/components/ui/progress.tsx +1 -0
- package/corpus/templates/tasks/app/components/ui/radio-group.tsx +1 -0
- package/corpus/templates/tasks/app/components/ui/resizable.tsx +43 -0
- package/corpus/templates/tasks/app/components/ui/scroll-area.tsx +1 -0
- package/corpus/templates/tasks/app/components/ui/select.tsx +1 -0
- package/corpus/templates/tasks/app/components/ui/separator.tsx +1 -0
- package/corpus/templates/tasks/app/components/ui/sheet.tsx +1 -0
- package/corpus/templates/tasks/app/components/ui/sidebar.tsx +782 -0
- package/corpus/templates/tasks/app/components/ui/skeleton.tsx +1 -0
- package/corpus/templates/tasks/app/components/ui/slider.tsx +1 -0
- package/corpus/templates/tasks/app/components/ui/sonner.tsx +1 -0
- package/corpus/templates/tasks/app/components/ui/spinner.tsx +1 -0
- package/corpus/templates/tasks/app/components/ui/switch.tsx +1 -0
- package/corpus/templates/tasks/app/components/ui/table.tsx +1 -0
- package/corpus/templates/tasks/app/components/ui/tabs.tsx +1 -0
- package/corpus/templates/tasks/app/components/ui/textarea.tsx +1 -0
- package/corpus/templates/tasks/app/components/ui/toast.tsx +1 -0
- package/corpus/templates/tasks/app/components/ui/toaster.tsx +1 -0
- package/corpus/templates/tasks/app/components/ui/toggle-group.tsx +1 -0
- package/corpus/templates/tasks/app/components/ui/toggle.tsx +43 -0
- package/corpus/templates/tasks/app/components/ui/tooltip.tsx +1 -0
- package/corpus/templates/tasks/app/components/ui/use-toast.ts +3 -0
- package/corpus/templates/tasks/app/entry.client.tsx +19 -0
- package/corpus/templates/tasks/app/entry.server.tsx +10 -0
- package/corpus/templates/tasks/app/global.css +93 -0
- package/corpus/templates/tasks/app/hooks/cache.ts +31 -0
- package/corpus/templates/tasks/app/hooks/use-custom-fields.ts +93 -0
- package/corpus/templates/tasks/app/hooks/use-inbox-items.ts +196 -0
- package/corpus/templates/tasks/app/hooks/use-mobile.tsx +21 -0
- package/corpus/templates/tasks/app/hooks/use-navigation-state.ts +40 -0
- package/corpus/templates/tasks/app/hooks/use-tasks.ts +276 -0
- package/corpus/templates/tasks/app/hooks/use-toast.ts +188 -0
- package/corpus/templates/tasks/app/hooks/use-visible-task-fields.ts +140 -0
- package/corpus/templates/tasks/app/lib/app-config.ts +11 -0
- package/corpus/templates/tasks/app/lib/tab-id.ts +1 -0
- package/corpus/templates/tasks/app/lib/utils.ts +1 -0
- package/corpus/templates/tasks/app/root.tsx +130 -0
- package/corpus/templates/tasks/app/routes/_index.tsx +22 -0
- package/corpus/templates/tasks/app/routes/extensions.$id.$slug.tsx +2 -0
- package/corpus/templates/tasks/app/routes/extensions.$id.tsx +11 -0
- package/corpus/templates/tasks/app/routes/extensions._index.tsx +11 -0
- package/corpus/templates/tasks/app/routes/extensions.tsx +5 -0
- package/corpus/templates/tasks/app/routes/fields.tsx +16 -0
- package/corpus/templates/tasks/app/routes/inbox.tsx +16 -0
- package/corpus/templates/tasks/app/routes/tasks.tsx +17 -0
- package/corpus/templates/tasks/app/routes/team.tsx +17 -0
- package/corpus/templates/tasks/app/routes.ts +4 -0
- package/corpus/templates/tasks/app/vite-env.d.ts +6 -0
- package/corpus/templates/tasks/components.json +20 -0
- package/corpus/templates/tasks/data/sync-config.json +1 -0
- package/corpus/templates/tasks/docs/features/README.md +81 -0
- package/corpus/templates/tasks/docs/features/f1-tasks.mdx +67 -0
- package/corpus/templates/tasks/docs/features/f2-custom-fields.mdx +68 -0
- package/corpus/templates/tasks/docs/features/f3-projects.mdx +33 -0
- package/corpus/templates/tasks/docs/features/f4-inbox.mdx +55 -0
- package/corpus/templates/tasks/docs/features/f5-views.mdx +65 -0
- package/corpus/templates/tasks/docs/features/f6-search.mdx +43 -0
- package/corpus/templates/tasks/docs/features/f7-first-run.mdx +66 -0
- package/corpus/templates/tasks/docs/features/f8-chat.mdx +120 -0
- package/corpus/templates/tasks/e2e/global-setup.ts +42 -0
- package/corpus/templates/tasks/e2e/helpers/inbox.ts +71 -0
- package/corpus/templates/tasks/e2e/helpers/tasks.ts +99 -0
- package/corpus/templates/tasks/learnings.defaults.md +5 -0
- package/corpus/templates/tasks/netlify.toml +10 -0
- package/corpus/templates/tasks/package.json +104 -0
- package/corpus/templates/tasks/playwright.config.ts +34 -0
- package/corpus/templates/tasks/public/agent-native-icon-dark.svg +10 -0
- package/corpus/templates/tasks/public/agent-native-icon-light.svg +10 -0
- package/corpus/templates/tasks/public/agent-native-logo-dark.svg +21 -0
- package/corpus/templates/tasks/public/agent-native-logo-light.svg +21 -0
- package/corpus/templates/tasks/public/favicon.svg +1 -0
- package/corpus/templates/tasks/public/icon-180.svg +1 -0
- package/corpus/templates/tasks/public/icon-192.svg +1 -0
- package/corpus/templates/tasks/public/icon-512.svg +1 -0
- package/corpus/templates/tasks/public/manifest.json +21 -0
- package/corpus/templates/tasks/react-router.config.ts +7 -0
- package/corpus/templates/tasks/server/custom-fields/normalize.ts +163 -0
- package/corpus/templates/tasks/server/custom-fields/parse.ts +146 -0
- package/corpus/templates/tasks/server/custom-fields/schema.ts +147 -0
- package/corpus/templates/tasks/server/custom-fields/store.ts +425 -0
- package/corpus/templates/tasks/server/custom-fields/task-fields.ts +104 -0
- package/corpus/templates/tasks/server/custom-fields/types.ts +98 -0
- package/corpus/templates/tasks/server/custom-fields/validate.ts +210 -0
- package/corpus/templates/tasks/server/custom-fields/values/store.ts +386 -0
- package/corpus/templates/tasks/server/db/bulk-write.ts +30 -0
- package/corpus/templates/tasks/server/db/index.ts +5 -0
- package/corpus/templates/tasks/server/db/record-utils.ts +7 -0
- package/corpus/templates/tasks/server/db/schema.ts +67 -0
- package/corpus/templates/tasks/server/db/test-tasks-table.ts +76 -0
- package/corpus/templates/tasks/server/db/transaction.ts +6 -0
- package/corpus/templates/tasks/server/errors.ts +31 -0
- package/corpus/templates/tasks/server/inbox/store.ts +216 -0
- package/corpus/templates/tasks/server/middleware/auth.ts +15 -0
- package/corpus/templates/tasks/server/plugins/agent-chat.ts +46 -0
- package/corpus/templates/tasks/server/plugins/auth.ts +15 -0
- package/corpus/templates/tasks/server/plugins/db.ts +90 -0
- package/corpus/templates/tasks/server/routes/[...page].get.ts +5 -0
- package/corpus/templates/tasks/server/stored-items/store.ts +548 -0
- package/corpus/templates/tasks/server/tasks/store.ts +306 -0
- package/corpus/templates/tasks/server/user-config/store.ts +138 -0
- package/corpus/templates/tasks/shared/app-state-tabs.ts +15 -0
- package/corpus/templates/tasks/shared/boolean-param.ts +22 -0
- package/corpus/templates/tasks/shared/bulk-limits.ts +7 -0
- package/corpus/templates/tasks/shared/list-screen-snapshot.ts +90 -0
- package/corpus/templates/tasks/shared/navigation.ts +104 -0
- package/corpus/templates/tasks/shared/visible-task-fields.ts +2 -0
- package/corpus/templates/tasks/ssr-entry.ts +15 -0
- package/corpus/templates/tasks/tsconfig.json +24 -0
- package/corpus/templates/tasks/vite.config.ts +19 -0
- package/corpus/templates/tasks/vitest.config.ts +8 -0
- package/dist/cli/templates-meta.d.ts.map +1 -1
- package/dist/cli/templates-meta.js +13 -0
- package/dist/cli/templates-meta.js.map +1 -1
- package/dist/client/agent-page/AgentTabsPage.js +1 -1
- package/dist/client/agent-page/AgentTabsPage.js.map +1 -1
- package/dist/client/org/OrgSwitcher.d.ts.map +1 -1
- package/dist/client/org/OrgSwitcher.js +2 -1
- package/dist/client/org/OrgSwitcher.js.map +1 -1
- package/dist/collab/routes.d.ts +1 -1
- package/dist/collab/struct-routes.d.ts +1 -1
- package/dist/notifications/routes.d.ts +2 -2
- package/dist/observability/routes.d.ts +5 -5
- package/dist/resources/handlers.d.ts +3 -3
- package/dist/secrets/routes.d.ts +9 -9
- package/dist/server/agent-engine-api-key-route.d.ts +1 -1
- package/dist/server/transcribe-voice.d.ts +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
# Canvas & artboard placement — single source of truth
|
|
2
|
+
|
|
3
|
+
This file is the canonical guide for how the visual-plan canvas works: artboard
|
|
4
|
+
placement, lane layout, annotations, patching, and the legacy kit tree. Read it
|
|
5
|
+
in full before authoring or editing any canvas/artboard content; do not author
|
|
6
|
+
canvas layouts from memory or paraphrase these rules per mode.
|
|
7
|
+
|
|
8
|
+
<!-- SHARED-CORE:canvas-surface START -->
|
|
9
|
+
|
|
10
|
+
**The coordinate rule.** The `surface` locks each artboard's footprint and
|
|
11
|
+
aspect — never set artboard width/height and never use coordinates inside the
|
|
12
|
+
wireframe HTML; board-level artboard `x`/`y` IS allowed when it creates clear
|
|
13
|
+
lanes. Let canvas auto-placement handle simple one-row boards.
|
|
14
|
+
|
|
15
|
+
**Lay out mixed canvases in lanes.** When a canvas contains broad browser /
|
|
16
|
+
desktop frames plus compact `mobile`, `popover`, or `panel` surfaces, do not put
|
|
17
|
+
everything in one horizontal strip. Use board-level artboard `x`/`y` to reserve
|
|
18
|
+
lanes with generous empty space: main flow on one row, compact surfaces in their
|
|
19
|
+
own column or row, and loading/error states in a lower row. Keep at least 96px
|
|
20
|
+
between rendered artboard rectangles plus room for annotation gutters; when a
|
|
21
|
+
broad browser/desktop frame sits beside a compact panel/popover, leave at least
|
|
22
|
+
160px so frame borders, labels, and hover controls never touch. Connect only
|
|
23
|
+
neighboring steps; never draw a long connector that skips across unrelated
|
|
24
|
+
frames. Connector labels must sit in open canvas space. If the label would touch
|
|
25
|
+
or cross either artboard, remove the label and explain the transition with a
|
|
26
|
+
nearby annotation instead. Before handoff, inspect the top canvas at default zoom
|
|
27
|
+
and move any frame whose label, connector, or annotation crosses another frame.
|
|
28
|
+
|
|
29
|
+
**Canvas annotations are designer notes on the artboard.** When a top canvas is
|
|
30
|
+
present, sprinkle Figma-style notes near the frames they explain: a short
|
|
31
|
+
heading, supporting text, and bullets — plain text layers, never bordered or
|
|
32
|
+
shadowed cards, and never a box around a frame. The renderer spaces notes away
|
|
33
|
+
from frames, so place each note by the frame it describes. Use an arrow only to
|
|
34
|
+
point at one specific control or transition; for a broad frame-level note, write
|
|
35
|
+
text beside the frame with no connector. Connectors are for real sequences only —
|
|
36
|
+
never fake "Step 1 → Step 2" lines between independent states.
|
|
37
|
+
|
|
38
|
+
**Do not create overlapping annotations.** Anchor each ordinary note to the
|
|
39
|
+
frame it explains with `targetId` + `placement` (top/right/bottom/left), and
|
|
40
|
+
omit `type` or use `type: "note"`. The renderer parks notes in a gutter beside
|
|
41
|
+
the frame and lays them out automatically. Do not use `type: "callout"`,
|
|
42
|
+
`type: "text"`, `type: "arrow"`, x/y, or points for ordinary notes; those are
|
|
43
|
+
freeform review-markup layers and must be reserved for intentional markup in
|
|
44
|
+
open canvas space. Reserve arrows for a note that must point at one specific
|
|
45
|
+
control inside a frame; a note that simply sits beside its frame needs no arrow.
|
|
46
|
+
|
|
47
|
+
**Patching.** Edit one wireframe, canvas annotation, diagram, or block with targeted `contentPatches`
|
|
48
|
+
(for example `patch-wireframe-html`, `patch-diagram-html`, `update-block`,
|
|
49
|
+
`replace-blocks`, `update-canvas-annotation`) rather
|
|
50
|
+
than regenerating the whole plan. `contentPatches` are part of the public MCP
|
|
51
|
+
action schema, so Claude Code, Codex, Cursor, and other hosts can make surgical
|
|
52
|
+
edits. If an agent is working from exported source files, use
|
|
53
|
+
`read-visual-plan-source` / `patch-visual-plan-source`: `plan.mdx` holds
|
|
54
|
+
frontmatter plus markdown/document blocks, `canvas.mdx` holds
|
|
55
|
+
`<DesignBoard>/<Section>/<Artboard>/<Screen>/<Annotation>/<Connector>`, and the
|
|
56
|
+
patch action normalizes the MDX back into the same JSON runtime model. JSON is
|
|
57
|
+
the canonical runtime shape; MDX is the repo-friendly authoring/export surface.
|
|
58
|
+
In the browser, humans edit `rich-text` prose inline; agents should still use
|
|
59
|
+
`update-rich-text` content patches or source patches for prose, and use
|
|
60
|
+
comments/structured patches for canvas, artboard, wireframe, and diagram edits.
|
|
61
|
+
Never send a partial top-level `content` object as a shortcut to add a canvas,
|
|
62
|
+
frame, or block: `content` is a full structured replacement, so omitted blocks
|
|
63
|
+
or surfaces can disappear. If a full replacement is truly unavoidable, read the
|
|
64
|
+
complete source/JSON first, include every existing block and surface in the new
|
|
65
|
+
payload, and verify the source/export immediately after the update.
|
|
66
|
+
|
|
67
|
+
**Never emit a titled artboard with no interior wireframe content.** Every artboard
|
|
68
|
+
you place on the canvas must carry an `html` wireframe or reference a wireframe
|
|
69
|
+
block via `blockId`; when using `blockId`, the referenced `wireframe` /
|
|
70
|
+
`legacy-wireframe` block must remain in the plan. If you remove a duplicate
|
|
71
|
+
wireframe from the document body, first move its `data` inline onto the
|
|
72
|
+
corresponding `content.canvas.frames[*].wireframe` / `legacyWireframe`. A
|
|
73
|
+
label-only frame or a frame pointing at a deleted block renders empty and is
|
|
74
|
+
rejected at parse time. If you only have a title, write it as a section header or
|
|
75
|
+
annotation, not an empty artboard.
|
|
76
|
+
|
|
77
|
+
**UI mockups belong in the top visual review area.** Static UI/product visuals
|
|
78
|
+
live on the canvas; multi-step UI flows get both canvas wireframes and a
|
|
79
|
+
prototype. When the user asks for a mockup, UI state, loading state, layout,
|
|
80
|
+
screen, or visual comparison, make the canvas the primary home for that static
|
|
81
|
+
visual. When the user asks for a prototype or the plan contains a sequence the
|
|
82
|
+
reviewer must feel, keep the canvas artboards and add `content.prototype` so the
|
|
83
|
+
top surface shows Wireframes / Prototype tabs. Architecture/code diagrams stay
|
|
84
|
+
inline in the document (the SKILL.md Visual Surface Choice section owns that
|
|
85
|
+
rule) unless the user explicitly asks for a spatial board. Document blocks
|
|
86
|
+
can explain, compare, or map implementation, but they should not host the
|
|
87
|
+
primary UI mockup or prototype just because `custom-html`, screenshots, or prose
|
|
88
|
+
are easier to produce. If the canvas/prototype surface cannot represent the
|
|
89
|
+
requested UI fidelity, still keep the closest top-surface representation and
|
|
90
|
+
call out or extend the needed renderer capability. A skeleton/loading mockup
|
|
91
|
+
also lives in a canvas artboard — never move a mockup out of the canvas.
|
|
92
|
+
|
|
93
|
+
**Storyboards are canvas artifacts, not document diagrams.** When the requested
|
|
94
|
+
output is a product flow, onboarding journey, "light storyboard", or canvas
|
|
95
|
+
wireframe, author the flow as multiple top-canvas artboards with real screen
|
|
96
|
+
content and neighboring connectors. Keep document-body `diagram` blocks for
|
|
97
|
+
architecture and mechanics that are not themselves user-visible screens. A
|
|
98
|
+
storyboard made from a single inline HTML diagram is the wrong surface.
|
|
99
|
+
|
|
100
|
+
For abstract product concepts, use the canvas to create the first "I get it"
|
|
101
|
+
moment: one real app state near the top showing how the concept appears to a
|
|
102
|
+
user, followed by separate annotations or diagrams for mechanics. Do not make
|
|
103
|
+
the first artboard a hybrid of app UI and architecture notes; the app screen
|
|
104
|
+
should be inspectable as product UI on its own.
|
|
105
|
+
|
|
106
|
+
**Legacy kit tree.** Older plans set a `screen` array of `{ el, ...props }` kit
|
|
107
|
+
nodes instead of `html`; the renderer still accepts and displays it so saved
|
|
108
|
+
plans round-trip, but new plans emit `html`. Do not author fresh kit-tree
|
|
109
|
+
screens, and do not put nested kit components such as `<FrameScreen>`, `<Card>`,
|
|
110
|
+
`<Row>`, `<Title>`, or `<Btn>` inside a canvas `<Screen>`. A new canvas artboard
|
|
111
|
+
with kit-tree children is a defect: replace it with
|
|
112
|
+
`<Screen surface="..." html={...} />` using the HTML wireframe rules. The HTML
|
|
113
|
+
path is the one that gets the renderer-owned surface sizing, theme tokens,
|
|
114
|
+
sketch/clean toggle, and safe text layout used by good document-body
|
|
115
|
+
wireframes. Likewise, old or imported plans may carry coordinate-based regions
|
|
116
|
+
or free-float x/y on notes; those are legacy escape hatches the renderer still
|
|
117
|
+
shows but you must never produce. The gutter parks notes by `targetId` +
|
|
118
|
+
`placement`, and the coordinate rule at the top of this file governs all
|
|
119
|
+
new-plan placement.
|
|
120
|
+
|
|
121
|
+
<!-- SHARED-CORE:canvas-surface END -->
|
|
@@ -0,0 +1,178 @@
|
|
|
1
|
+
# Plan document quality — single source of truth
|
|
2
|
+
|
|
3
|
+
This file is the canonical quality bar for the plan document below the canvas:
|
|
4
|
+
how it reads, which blocks to use, how open questions are surfaced, and the
|
|
5
|
+
pre-handoff check. Read it in full before authoring the plan document; it is the
|
|
6
|
+
quality bar. Do not write the document from memory or paraphrase these rules per
|
|
7
|
+
mode.
|
|
8
|
+
|
|
9
|
+
<!-- SHARED-CORE:document-quality START -->
|
|
10
|
+
|
|
11
|
+
**The document is a serious technical plan, not marketing.** Write it the way a
|
|
12
|
+
strong Claude or Codex implementation plan reads: outcome-first, prose-first,
|
|
13
|
+
self-contained, and specific. State the objective and what "done" means, the
|
|
14
|
+
scope and non-goals, the proposed approach with the key decisions and their
|
|
15
|
+
rationale, ordered steps that name real files, symbols, actions, and data
|
|
16
|
+
shapes, the risks, and a closing verification step (tests, build, or a checkable
|
|
17
|
+
behavior). Replace vague prose with specifics; never ship a step like "make it
|
|
18
|
+
work." No hero art, gradients, logos, nav bars, slogans, value props, giant
|
|
19
|
+
landing-page headings, or marketing cards unless the user explicitly asks.
|
|
20
|
+
|
|
21
|
+
**Every published plan must stand alone.** Even when the agent is revising an
|
|
22
|
+
existing plan, the output is a plan to do the work, not a changelog of the
|
|
23
|
+
conversation. Do not write phrases like "preserve the previous plan", "do not
|
|
24
|
+
drop the old idea", "as discussed above", "this revision", "unlike the prior
|
|
25
|
+
version", or "correction from the earlier plan". Fold the right decisions into
|
|
26
|
+
the plan as normal objective, architecture, scope, and roadmap prose. A reviewer
|
|
27
|
+
who opens the plan from a link with no chat history should understand it. Avoid
|
|
28
|
+
negative framing that only makes sense against absent context ("not the old
|
|
29
|
+
mode", "not just X") unless the contrast is defined in the plan and genuinely
|
|
30
|
+
helps; state the positive model directly.
|
|
31
|
+
|
|
32
|
+
**Make abstract plans instantly legible.** If the idea is broad, strategic, or
|
|
33
|
+
intended for a third-party reviewer, put one concrete product snapshot near the
|
|
34
|
+
top before dense architecture, mode tables, manifests, or roadmaps. For
|
|
35
|
+
UI-capable concepts, that snapshot is usually a top-canvas app state plus a
|
|
36
|
+
short paragraph that says what the user sees and what changes under the hood.
|
|
37
|
+
Then put mechanics, data flow, sync boundaries, and implementation detail in
|
|
38
|
+
separate diagrams or document sections.
|
|
39
|
+
|
|
40
|
+
**Preserve the user's level of abstraction.** A motivating use case is not
|
|
41
|
+
automatically the architecture. When the prompt describes a broader framework,
|
|
42
|
+
product mode, or reusable primitive, separate the reusable core from specific
|
|
43
|
+
apps, providers, customers, scripts, or launch examples. Use the concrete
|
|
44
|
+
example to make the plan understandable, then make clear which parts are core,
|
|
45
|
+
which are app-specific adapters, and which are future examples.
|
|
46
|
+
|
|
47
|
+
**When top visuals exist, they and the document never duplicate each other.**
|
|
48
|
+
For UI work, the UI story lives in the top visual surface: canvas artboards for
|
|
49
|
+
static inspection, plus prototype tabs when the flow should be functional. The
|
|
50
|
+
document carries the technical depth the visuals cannot show — concrete
|
|
51
|
+
file/symbol maps, API and data contracts, code snippets, migration or
|
|
52
|
+
implementation phases, risks, and validation. For architecture/code reviews,
|
|
53
|
+
invert that: the document is the visual surface, and each recommendation
|
|
54
|
+
carries its own nearby inline `diagram` / `data-model` block plus file
|
|
55
|
+
evidence (the `diagram` bullet below owns how to author those diagrams).
|
|
56
|
+
Repeat a wireframe in the document only for a genuinely new detail view or
|
|
57
|
+
comparison. Skip the visual surface entirely for non-visual work and write a
|
|
58
|
+
clean rich document. For a simple binary UI visual choice, show the two
|
|
59
|
+
directions in the canvas only; do not repeat the same options as body
|
|
60
|
+
wireframes or prose. Put the actual choice in the bottom "Open Questions" form.
|
|
61
|
+
|
|
62
|
+
**Use the right block, and make it carry substance.** For the authoritative,
|
|
63
|
+
machine-checked list of block types and their data schemas, call `get-plan-blocks`
|
|
64
|
+
— it returns the live registry vocabulary (type, MDX tag, placement, key fields)
|
|
65
|
+
so you never emit a block the editor cannot render or round-trip:
|
|
66
|
+
|
|
67
|
+
- `rich-text` for plan prose with real bold/italic/code/links and nested lists.
|
|
68
|
+
- `annotated-code` for the file map: when a load-bearing file is worth
|
|
69
|
+
highlighting, prefer the annotated walkthrough over a bare `code` block — carry
|
|
70
|
+
the real, syntax-highlighted code AND anchor short margin notes to the lines
|
|
71
|
+
that actually change (the new action, the changed schema, the wiring point), so
|
|
72
|
+
the reader sees what matters and why instead of code for code's sake. Each
|
|
73
|
+
annotation is `{ lines: "12" | "12-18"; label?; note }`; keep a few high-signal
|
|
74
|
+
notes per file, not one per line. Highlight only the files worth reading; never
|
|
75
|
+
an exhaustive list of every touched file, and never a prose-only description of
|
|
76
|
+
a file. Drop to a plain `code` block only for a throwaway snippet with nothing
|
|
77
|
+
to call out. When more than one file matters, group the blocks in a vertical
|
|
78
|
+
`tabs` block (the standard tab primitive) rather than a bespoke container. If
|
|
79
|
+
the exact code is unknown, show the smallest plausible planned shape or a
|
|
80
|
+
commented stub naming what to fill in. (`code-tabs` and `implementation-map`
|
|
81
|
+
are legacy: their renderers stay for old plans, but do not author new ones.)
|
|
82
|
+
- For a decision: if the reviewer must still pick between a genuinely-open
|
|
83
|
+
either/or, put it in the bottom Open Questions `question-form` as a `single`
|
|
84
|
+
question — one option per real alternative, each with a short detail and
|
|
85
|
+
`recommended: true` on the one you would choose; do not also restate the same
|
|
86
|
+
choice elsewhere. If you have already committed to an approach, state it as
|
|
87
|
+
settled prose or a `callout` with `tone="decision"`, optionally with a
|
|
88
|
+
`columns` block for a side-by-side comparison of the options you weighed — not
|
|
89
|
+
as a confusing mid-document form for a question you have already answered.
|
|
90
|
+
- `columns` for side-by-side before/after or current/target comparisons where
|
|
91
|
+
each side needs real nested blocks; label the columns clearly and avoid
|
|
92
|
+
stacking comparison blocks vertically when parallel reading is the point.
|
|
93
|
+
- `diagram` for two-dimensional architecture, dependency, data-flow, or state
|
|
94
|
+
relationships, only when it clarifies something real. Prefer standard
|
|
95
|
+
two-dimensional layouts — paired before/after panels, layered diagrams,
|
|
96
|
+
swimlanes, dependency maps, matrices, or grouped regions; do not default to
|
|
97
|
+
left-to-right chains, and use a line only when the relationship is truly a
|
|
98
|
+
sequence. Do not use a body `diagram` as the primary artifact for a requested
|
|
99
|
+
product canvas, light storyboard, UI flow, screen flow, or wireframe; those
|
|
100
|
+
belong in the top canvas as artboards with `Screen` wireframes first. Use
|
|
101
|
+
diagrams below that canvas only for architecture, data flow, or implementation
|
|
102
|
+
mechanics. For architecture/code
|
|
103
|
+
diagrams, prefer `data.html` / `data.css` with semantic HTML and inline SVG so
|
|
104
|
+
the diagram can use panels, layers, matrices, arrows, annotations, and
|
|
105
|
+
responsive layout directly. Author diagram HTML with renderer-owned primitives
|
|
106
|
+
like `.diagram-panel`, `.diagram-card`, `.diagram-node`, `.diagram-box`,
|
|
107
|
+
`.diagram-pill`, `.diagram-muted`, and `[data-rough]`; they map to the plan's
|
|
108
|
+
Tailwind theme variables through `--wf-ink`, `--wf-muted`, `--wf-line`,
|
|
109
|
+
`--wf-paper`, `--wf-card`, `--wf-accent`, `--wf-accent-soft`, `--wf-warn`, and
|
|
110
|
+
`--wf-ok`, and switch to Excalifont plus rough.js outlines in sketchy mode. Do not
|
|
111
|
+
set `font-family` and do not hard-code hex, rgb, or hsl colors in diagram HTML
|
|
112
|
+
or CSS. Leave room for the sketch font: keep labels short, give nodes generous
|
|
113
|
+
width, and place boundary/annotation labels in unused space instead of over
|
|
114
|
+
nodes; labels must not overlap nodes, connectors, or each other. For small
|
|
115
|
+
text/SVG changes to an existing HTML diagram, use `patch-diagram-html` with a
|
|
116
|
+
unique `find`/`replace` snippet instead of resending the whole `data.html`
|
|
117
|
+
string. Use legacy `nodes` / `edges` only for small previews or truly
|
|
118
|
+
sequential flows. In architecture/code plans, prefer a repeated section rhythm:
|
|
119
|
+
recommendation title, confidence and category badges, code-path evidence, a
|
|
120
|
+
local before/after or current/target spatial diagram, then concise
|
|
121
|
+
Problem/Solution/Why text.
|
|
122
|
+
- `tabs` for multiple states, directions, or comparisons. A tab that reveals
|
|
123
|
+
only prose usually means the plan is under-specified — include a relevant
|
|
124
|
+
visual unless the tab is intentionally document-only.
|
|
125
|
+
- `table`, `checklist`, `callout` for scannable structure.
|
|
126
|
+
|
|
127
|
+
**Open questions live at the bottom as a form when answers would change the
|
|
128
|
+
plan.** Surface answerable unresolved decisions in a final `question-form`
|
|
129
|
+
block titled "Open Questions" so the renderer presents it as a distinct section.
|
|
130
|
+
That bottom form is the ONLY place that enumerates the open questions: never add
|
|
131
|
+
a second "Open Questions" heading, list, or recap of the same questions earlier
|
|
132
|
+
in the document. A one-line pointer in the overview prose ("a few decisions are
|
|
133
|
+
still open — see Open Questions below") is fine, but do not reproduce the
|
|
134
|
+
question list or a parallel questions/decisions section above it.
|
|
135
|
+
Use `single` or `multi` for clear choices, `freeform` for constraints,
|
|
136
|
+
`recommended: true` for the default you would pick, and option `wireframe` /
|
|
137
|
+
`diagram` previews only when the options are not already visible in the top
|
|
138
|
+
canvas. `single` and `multi` questions always render a write-in field so a
|
|
139
|
+
reviewer can answer with a custom option — never add an explicit "Other" option
|
|
140
|
+
yourself; set `allowOther: false` only when a free-text answer makes no sense.
|
|
141
|
+
Keep non-answerable assumptions or risks as concise `callout` blocks in
|
|
142
|
+
the relevant section. Never bury a questions/decisions wall inside the plan
|
|
143
|
+
narrative, and never ask the same question twice.
|
|
144
|
+
|
|
145
|
+
For complex plans, do not end without an open-question audit. If architecture,
|
|
146
|
+
scope, UX, data shape, rollout, provider mapping, or ownership still depends on
|
|
147
|
+
a choice, either commit to a recommendation with rationale or add it to the
|
|
148
|
+
bottom form with a recommended default. A complex plan with no open questions is
|
|
149
|
+
fine only when every meaningful decision has been explicitly made.
|
|
150
|
+
|
|
151
|
+
**Verification must exercise the real workflow.** The final verification section
|
|
152
|
+
should go beyond typecheck/unit tests when the plan changes UI, local files,
|
|
153
|
+
sync, providers, browser behavior, or multi-app flows. Include at least one
|
|
154
|
+
end-to-end smoke that matches the user journey, such as a fresh repo/folder,
|
|
155
|
+
real manifest or data fixture, browser interaction, save/sync action, and an
|
|
156
|
+
on-disk or database assertion. Name the command or manual browser path when it
|
|
157
|
+
is known.
|
|
158
|
+
|
|
159
|
+
**`custom-html` is a bounded escape hatch only** — a single complete fragment
|
|
160
|
+
inside a block, never `html`/`head`/`body`/`script` tags, never a generic
|
|
161
|
+
placeholder, density demo, or proof that custom HTML works. Prefer the native
|
|
162
|
+
blocks for normal plans. For architecture/code reviews, use `diagram`
|
|
163
|
+
`data.html` / `data.css` for rich local HTML/SVG diagrams instead of
|
|
164
|
+
`custom-html`. For UI/product work, `custom-html` is never the primary home for a
|
|
165
|
+
requested mockup, UI state, or visual comparison. If UI fidelity requires
|
|
166
|
+
HTML/CSS, image capture, or real React/CSS, the product fix is canvas support
|
|
167
|
+
for that artifact type, not moving the mockup into the document.
|
|
168
|
+
When `custom-html` is genuinely needed, author it against the sandbox-provided
|
|
169
|
+
theme tokens (`--wf-paper`, `--wf-card`, `--wf-ink`, `--wf-muted`,
|
|
170
|
+
`--wf-line`, `--wf-radius`, and the matching `--plan-*` aliases). Do not hardcode
|
|
171
|
+
hex/rgb/hsl light palettes such as white cards with dark ink; the same fragment
|
|
172
|
+
must read in dark mode without a plan-specific patch.
|
|
173
|
+
|
|
174
|
+
**Before handoff, open the plan and check it.** Fix overlap, excessive
|
|
175
|
+
whitespace, clipped fragments, misleading inactive controls, poor contrast, and
|
|
176
|
+
unreadable diagrams before asking for approval.
|
|
177
|
+
|
|
178
|
+
<!-- SHARED-CORE:document-quality END -->
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
# Good vs. bad exemplar — single source of truth
|
|
2
|
+
|
|
3
|
+
This file is the canonical worked example of a great plan (and the anti-patterns
|
|
4
|
+
to avoid). Read it alongside the document-quality and canvas references before
|
|
5
|
+
authoring a plan; it is the bar these plans must clear.
|
|
6
|
+
|
|
7
|
+
<!-- SHARED-CORE:exemplar START -->
|
|
8
|
+
|
|
9
|
+
**GOOD.** A UI-first plan for a todo app: a canvas with a `desktop` artboard whose
|
|
10
|
+
`data.html` is a real flex layout — a sidebar of links (`Inbox 12`, `Today 4`,
|
|
11
|
+
`Done`), a main column with an `<h1>Today</h1>`, accent `.wf-pill`s for the
|
|
12
|
+
filters, a muted section label `OVERDUE`, and `.wf-card` task rows carrying real
|
|
13
|
+
titles, due dates, and a primary `button.primary` — styled only through bare
|
|
14
|
+
elements, helper classes, and `--wf-*` tokens, so the renderer applies the
|
|
15
|
+
correct desktop footprint, theme, and one subtle whole-frame wobble. Plain-text
|
|
16
|
+
designer notes sit spaced off the frame, pointing only at the controls that need
|
|
17
|
+
explanation. Below it, a Claude/Codex-grade document: objective and
|
|
18
|
+
done-criteria, a few `code` blocks (grouped in a vertical `tabs` block when
|
|
19
|
+
more than one) showing the real shape of the load-bearing files, a `callout`
|
|
20
|
+
with `tone="decision"` stating the chosen approach with a `columns` block
|
|
21
|
+
weighing the two real options behind it,
|
|
22
|
+
and a validation step — none of it repeating the canvas. If the task also
|
|
23
|
+
changes a multi-step completion flow, the same top area includes a Prototype tab
|
|
24
|
+
whose screens use the same labels and states as the canvas artboards, with
|
|
25
|
+
`data-goto` controls for the sequence. This is the bar.
|
|
26
|
+
|
|
27
|
+
**GOOD.** A broad product-architecture plan opens with a plain recommendation
|
|
28
|
+
and one concrete app state before the abstraction. The first canvas artboard is
|
|
29
|
+
pure product UI that matches the current app shell; nearby notes explain the
|
|
30
|
+
user-visible delta. A separate diagram below shows the mechanics, such as file
|
|
31
|
+
or data flow. The document then separates the reusable core from app/provider
|
|
32
|
+
adapters and examples, covers contracts, folder or schema shape, sync
|
|
33
|
+
boundaries, roadmap, non-goals, a bottom Open Questions form for unresolved
|
|
34
|
+
decisions, and a verification section with at least one realistic end-to-end
|
|
35
|
+
smoke. A reviewer who was not in the chat gets the idea from the top snapshot
|
|
36
|
+
before reading the technical plan.
|
|
37
|
+
|
|
38
|
+
**GOOD.** A `/visual-plan` for a backend architecture review: no top canvas.
|
|
39
|
+
The document opens with context and a legend, then repeats recommendation cards:
|
|
40
|
+
title, confidence/category badges, a monospace grid of real file paths, one
|
|
41
|
+
inline two-dimensional before/after or layered architecture diagram, and terse
|
|
42
|
+
Problem/Solution/Why bullets using the codebase's vocabulary. The diagram uses
|
|
43
|
+
space to show boundaries, layers, and ownership; it is not a default
|
|
44
|
+
left-to-right chain. The plan ends with a top recommendation and a bottom
|
|
45
|
+
question-form only if the next architecture direction is genuinely open. This is
|
|
46
|
+
better than a top canvas because each diagram is local to the claim it supports.
|
|
47
|
+
|
|
48
|
+
**BAD.** A `data.html` with hard-coded hex colors, a `font-family`, or fixed
|
|
49
|
+
pixel width/height; gray placeholder bars "insinuating" text on a non-skeleton
|
|
50
|
+
frame; a forced desktop + mobile pair for a popover; floating bordered
|
|
51
|
+
annotation cards hugging the frames; a fresh hand-authored kit-tree `screen`
|
|
52
|
+
instead of `html`; a multi-step UI flow with only static frames and no prototype
|
|
53
|
+
tab; a mockup escaped into a document `custom-html` block; and a marketing-style
|
|
54
|
+
document with a hero heading and value props that just restates what the canvas
|
|
55
|
+
already shows. Also bad: an architecture-only plan forced into a top canvas of
|
|
56
|
+
labeled boxes with overlapping text, where the actual code evidence and
|
|
57
|
+
recommendations live elsewhere; a product wireframe that mixes a real screen
|
|
58
|
+
with repo names, file-contract arrows, architecture explanations, or a made-up
|
|
59
|
+
permanent inspector; and a plan that describes itself as a revision of a prior
|
|
60
|
+
conversation instead of a standalone proposal. Never produce this.
|
|
61
|
+
|
|
62
|
+
<!-- SHARED-CORE:exemplar END -->
|
|
@@ -0,0 +1,264 @@
|
|
|
1
|
+
# HTML wireframe quality — single source of truth
|
|
2
|
+
|
|
3
|
+
This file is the canonical quality bar for HTML wireframes / `<Screen>` /
|
|
4
|
+
`WireframeBlock` content, shared word for word by `/visual-plan` and
|
|
5
|
+
`/visual-recap`. Read it in full before authoring ANY wireframe; do not
|
|
6
|
+
author wireframes from memory or paraphrase these rules per command.
|
|
7
|
+
|
|
8
|
+
<!-- SHARED-CORE:wireframe-quality START -->
|
|
9
|
+
|
|
10
|
+
**A wireframe is an HTML mockup. The renderer owns the look; you write the
|
|
11
|
+
content.** Set `data.html` to a self-contained, semantic HTML fragment of the
|
|
12
|
+
screen and set `data.surface`. The renderer owns the surface footprint/aspect,
|
|
13
|
+
the dark/light theme, the hand-drawn font, and the rough.js sketch overlay — you
|
|
14
|
+
never write `<html>`/`<body>`/`<script>`/`<style>` tags or any
|
|
15
|
+
width/height/coordinates. You write real HTML layout and real product
|
|
16
|
+
content; the renderer styles and roughens it.
|
|
17
|
+
|
|
18
|
+
**A wireframe block's data is an HTML screen plus a surface:**
|
|
19
|
+
|
|
20
|
+
```json
|
|
21
|
+
{
|
|
22
|
+
"surface": "browser",
|
|
23
|
+
"html": "<div style=\"display:flex;flex-direction:column;gap:10px;padding:16px;height:100%\"><h1>Sign in</h1><p class=\"wf-muted\">Use your work email to continue.</p><div class=\"wf-card\" style=\"display:flex;flex-direction:column;gap:10px\"><label>Email<input value=\"jane@acme.co\" /></label><label>Password<input value=\"••••••••\" /></label><label style=\"display:flex;align-items:center;gap:8px\"><input type=\"checkbox\" checked /> Remember me</label><button class=\"primary\">Sign in</button></div><a href=\"#\">Forgot password?</a></div>"
|
|
24
|
+
}
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
**Write PLAIN semantic HTML and let the renderer style it.** Bare elements
|
|
28
|
+
(`h1`/`h2`/`h3`, `p`, `button`, `input`, `<input type="checkbox">`, `a`, `hr`)
|
|
29
|
+
are auto-themed — no classes needed. Helper classes carry the rest:
|
|
30
|
+
|
|
31
|
+
- `.wf-card` / `.wf-box` — a bordered, padded container (a panel, a list item).
|
|
32
|
+
- `.wf-pill` / `.wf-chip` — a rounded tag or filter; add `.accent`
|
|
33
|
+
(`<span class="wf-pill accent">`) for the accent-filled variant.
|
|
34
|
+
- `.wf-muted` — secondary/muted text (or use `<small>`).
|
|
35
|
+
- `button.primary` or any element with `[data-primary]` — the accent-filled
|
|
36
|
+
primary button.
|
|
37
|
+
|
|
38
|
+
**No decorative shadows around mockups.** Do not put `box-shadow`, `filter:
|
|
39
|
+
drop-shadow(...)`, Tailwind `shadow-*` classes, or other fake depth effects on a
|
|
40
|
+
wireframe frame, root container, `.wf-card` / `.wf-box`, or canvas artboard.
|
|
41
|
+
Mockups should read as flat, bordered surfaces; use spacing, borders, labels,
|
|
42
|
+
and annotations for separation. Only show a shadow when the real product UI
|
|
43
|
+
already has that shadow and it is essential to the change being reviewed.
|
|
44
|
+
|
|
45
|
+
**Use renderer icons, not visible icon words.** For icon-only buttons or leading
|
|
46
|
+
icons inside fields, chips, menu items, and toolbars, write an empty marker such
|
|
47
|
+
as `<span data-icon="mail" aria-label="Email"></span>` or
|
|
48
|
+
`<i data-icon="lock"></i>`. The renderer replaces it with a Tabler-style SVG and
|
|
49
|
+
the `.wf-icon` class sizes it to the surrounding text. Supported names and
|
|
50
|
+
aliases: `mail`/`email`, `lock`/`password`, `search`, `plus`/`add`, `x`/`close`,
|
|
51
|
+
`check`, `chevronDown`, `chevronUp`, `chevronLeft`, `chevronRight`, `dots`/`more`,
|
|
52
|
+
`chevron`/`caret`/`dropdown` (down chevron), `user`, `settings`, `calendar`,
|
|
53
|
+
`bell`, `send`, `edit`, `arrowLeft`, and `arrowRight`. Do not put visible words
|
|
54
|
+
like "email", "lock", "search", "chevron", or "more" where the product UI would
|
|
55
|
+
show an icon; use text only when it is a real label a user would read.
|
|
56
|
+
|
|
57
|
+
**Use the `--wf-*` tokens for any custom color, never hex.** The renderer flips
|
|
58
|
+
these on light/dark, so reading them is what keeps a mockup correct in both
|
|
59
|
+
themes. For any inline border, background, or text color, reference a token:
|
|
60
|
+
`style="border:1.4px solid var(--wf-line)"`. The tokens are `--wf-ink` (text),
|
|
61
|
+
`--wf-muted` (secondary text), `--wf-line` (borders/dividers), `--wf-paper`
|
|
62
|
+
(page background), `--wf-card` (container surface), `--wf-accent` /
|
|
63
|
+
`--wf-accent-fg` / `--wf-accent-soft` (brand action), `--wf-warn`, `--wf-ok`,
|
|
64
|
+
and `--wf-radius`. Never hard-code a hex color and never set `font-family` — the
|
|
65
|
+
renderer owns the sketch/clean font.
|
|
66
|
+
|
|
67
|
+
**Lay out with inline `style` flex/grid.** You write the real layout —
|
|
68
|
+
`display:flex; flex-direction:column; gap:10px; padding:16px` and so on — and the
|
|
69
|
+
renderer never repositions anything. Compose the actual product: reproduce the
|
|
70
|
+
current screen, then show the modification. Real labels, real counts, real dates,
|
|
71
|
+
real button text grounded in the screen you read; not lorem or gray bars.
|
|
72
|
+
|
|
73
|
+
**Surface presets — match the real footprint, never default to desktop+mobile.**
|
|
74
|
+
Pick the `surface` that matches what the user will actually see:
|
|
75
|
+
|
|
76
|
+
- `browser`: a web page that needs a browser chrome frame around it.
|
|
77
|
+
- `desktop`: a full desktop app page or app shell.
|
|
78
|
+
- `mobile`: a phone screen, only when the work is genuinely mobile.
|
|
79
|
+
- `popover`: a small floating menu, dropdown, or inline popover.
|
|
80
|
+
- `panel`: a side panel, inspector, or sidebar widget.
|
|
81
|
+
|
|
82
|
+
A sidebar popover renders as a small surface, not a desktop page and a phone
|
|
83
|
+
frame. Do not emit `desktop` + `mobile` variants unless responsive behavior
|
|
84
|
+
actually changes the layout. For a component or widget, show one broader
|
|
85
|
+
app-context frame only when placement affects understanding, then the focused
|
|
86
|
+
component states.
|
|
87
|
+
|
|
88
|
+
**Model the actual component shell for small surfaces.** A rendered UI change
|
|
89
|
+
belongs in a wireframe; reserve `diagram` for architecture, dependency, state,
|
|
90
|
+
or data-flow relationships. Popovers, dropdown menus, command palettes, and
|
|
91
|
+
context menus use `surface: "popover"` unless the surrounding page placement is
|
|
92
|
+
the point of the change. Dialogs, sheets, inspectors, sidebars, and long
|
|
93
|
+
property panels use the matching `panel` / `desktop` surface as appropriate.
|
|
94
|
+
Show the real chrome: trigger or anchor when it matters, title/header row,
|
|
95
|
+
top-right actions, separators, fields, options, selected states, body content,
|
|
96
|
+
and footer actions that are visible in the workflow.
|
|
97
|
+
|
|
98
|
+
**Modify, don't redesign.** When the task changes an existing screen, reproduce
|
|
99
|
+
the current screen's real layout and footprint FIRST, then change only the delta
|
|
100
|
+
and call it out with a single annotation. Do not restack the page into a new
|
|
101
|
+
layout. For net-new surfaces, compose from the real app shell. Inspect the
|
|
102
|
+
actual app components before drawing an existing product: sidebar density,
|
|
103
|
+
toolbar actions, overflow menus, property panels, and framework chrome should
|
|
104
|
+
match the product unless the plan intentionally changes them.
|
|
105
|
+
|
|
106
|
+
**Keep product screens pure.** A product wireframe shows the app state a user
|
|
107
|
+
would actually see. Do not embed file contracts, architecture arrows, repo pills,
|
|
108
|
+
mode explanations, or implementation callouts inside the screen just to explain
|
|
109
|
+
the plan. Put those in canvas annotations, a separate diagram, or the document
|
|
110
|
+
body. Secondary UI such as properties, history, sync, export, or agent controls
|
|
111
|
+
should appear where the real product would put them: an overflow popover, sheet,
|
|
112
|
+
panel, or separate framework sidebar state, not a generic permanent right
|
|
113
|
+
inspector unless that inspector is the actual design.
|
|
114
|
+
|
|
115
|
+
**Classify mockup scope before implementation.** Before turning a plan mockup
|
|
116
|
+
into source code, decide whether each artboard represents the whole page/app
|
|
117
|
+
shell, a route body inside an existing shell, or a component/sub-surface. If an
|
|
118
|
+
artboard includes navigation, sidebars, auth banners, or a signup/login form,
|
|
119
|
+
map those pieces to the real shared shell/auth components instead of nesting the
|
|
120
|
+
entire mockup inside the current page. When a mockup references the product's
|
|
121
|
+
standard signup/login page, find and reuse that existing implementation; do not
|
|
122
|
+
approximate it from the wireframe.
|
|
123
|
+
|
|
124
|
+
**Zoom in on sub-surfaces, don't redraw the page.** For a small sub-surface (a
|
|
125
|
+
popover, menu, dialog, toast), show the full screen once, then add a small
|
|
126
|
+
separate artboard whose `html` contains ONLY that sub-surface — do not re-draw
|
|
127
|
+
the whole page around it, and do not scale a duplicate up. Pick the matching
|
|
128
|
+
`surface` (e.g. `popover`) so the footprint is right; never widen a popover to
|
|
129
|
+
page width.
|
|
130
|
+
|
|
131
|
+
**Loading / skeleton states.** Set `data.skeleton: true` on the wireframe and
|
|
132
|
+
fill the `html` with neutral, textless placeholder geometry — boxes and bars
|
|
133
|
+
built as `<div>`s with `background:var(--wf-line)` and explicit heights/widths,
|
|
134
|
+
no labels or copy. The renderer drops borders, sketch, and color into the
|
|
135
|
+
skeleton register automatically. Never escape to a `custom-html` document block
|
|
136
|
+
to fake a loader.
|
|
137
|
+
|
|
138
|
+
**Editing an existing mockup.** In hosted mode, to change one element, text, or
|
|
139
|
+
color in an existing html mockup, do not regenerate the frame — call
|
|
140
|
+
`update-visual-plan` with
|
|
141
|
+
`contentPatches: [{ op: "patch-wireframe-html", blockId, edits: [{ find,
|
|
142
|
+
replace }] }]`. Each `find` is a unique snippet of the current html (read it
|
|
143
|
+
first with `get-visual-plan`); set `all: true` on an edit to replace every
|
|
144
|
+
occurrence. The result is re-sanitized. In local-files privacy mode, do not call
|
|
145
|
+
hosted Plan tools; edit the local MDX source directly and rerun the local
|
|
146
|
+
check/serve or verify command for `<plan-dir>`.
|
|
147
|
+
|
|
148
|
+
**Treat the wireframe border as part of the visible design.** Always wrap HTML
|
|
149
|
+
wireframe content in a root container with real inner padding before drawing
|
|
150
|
+
cards, fields, pills, labels, or controls. Use at least 14-16px of padding,
|
|
151
|
+
`box-sizing: border-box`, `height: 100%`, and `gap` between child rows so the
|
|
152
|
+
first row never sits flush against the screen border. Keep text away from
|
|
153
|
+
borders: every container, field, button, menu item, and annotation needs enough
|
|
154
|
+
padding and line-height to read cleanly in the rendered Plan view.
|
|
155
|
+
|
|
156
|
+
**Lay out children safely so they never collide.** Use HTML flex/grid with
|
|
157
|
+
`gap`, `min-width: 0`, and sensible overflow. Avoid negative margins, absolute
|
|
158
|
+
positioning, or fixed child widths that can collide when the renderer switches
|
|
159
|
+
between light/dark, sketch/clean, or different zoom levels.
|
|
160
|
+
|
|
161
|
+
**Do not wrap intentionally single-line labels.** For toolbars, tab rails,
|
|
162
|
+
breadcrumbs, chip/filter rows, branch and file names, file chips, and code
|
|
163
|
+
filenames — any deliberately single-line row — do not let long text wrap. Put
|
|
164
|
+
`white-space: nowrap` on the row (and `overflow: hidden; text-overflow: ellipsis`
|
|
165
|
+
on the individual labels that can grow), so the wireframe demonstrates the actual
|
|
166
|
+
layout behavior instead of producing ugly stacked or vertical text. Use
|
|
167
|
+
horizontally scrollable or clipped rails for overflow.
|
|
168
|
+
|
|
169
|
+
**Fill the frame; keep labels short.** Each artboard is a fixed-size surface — compose enough realistic HTML to fill it top to bottom with even vertical rhythm; never leave a large empty band. On desktop/app-shell sidebars, let the nav stack flex to fill (`flex:1`) and add any persistent bottom action/status after it so the rail reads complete in taller frames. On mobile especially, flow real rows down the whole screen (status bar, header, then list/detail content) rather than a header floating above a gap. Keep every label short enough to sit on one line within its column — shorten the copy rather than relying on the frame to absorb it (long labels wrap or clip).
|
|
170
|
+
|
|
171
|
+
**Persistent chrome bars span the full frame width.** Top bars, app headers,
|
|
172
|
+
toolbars, and bottom tab/nav bars are full-width chrome, not centered content.
|
|
173
|
+
Lay each one out as a single flex row that fills the frame
|
|
174
|
+
(`style="display:flex;align-items:center;width:100%"`) and push trailing actions
|
|
175
|
+
to the right edge with a flex spacer (`<div style="flex:1"></div>`) between the
|
|
176
|
+
leading group and the trailing group — never center a bar inside a narrow,
|
|
177
|
+
centered block, and never let it collapse to the width of its contents. In a
|
|
178
|
+
Before/After pair the bar stays full-width in BOTH states even when one state has
|
|
179
|
+
fewer controls; the spacer absorbs the difference so the remaining controls hold
|
|
180
|
+
their edge alignment instead of sliding to the center.
|
|
181
|
+
|
|
182
|
+
**Pin bottom bars to the bottom of the frame.** For mobile tab bars, footers, and
|
|
183
|
+
any persistent bottom action row, make the frame itself a flex column at
|
|
184
|
+
`height:100%` (`style="display:flex;flex-direction:column;height:100%"`), give the
|
|
185
|
+
scrolling body `flex:1` so it absorbs the slack, and place the bar as the LAST
|
|
186
|
+
child of the frame (or set `margin-top:auto` on it). The bar then sits flush at
|
|
187
|
+
the bottom of the surface instead of floating directly under the content with an
|
|
188
|
+
empty band beneath it.
|
|
189
|
+
|
|
190
|
+
**Before / after must be comparable.** When showing a state change, preserve the
|
|
191
|
+
unchanged controls in both states so the reviewer can see exactly what moved or
|
|
192
|
+
appeared; do not show an added control as a generic box floating elsewhere in
|
|
193
|
+
the surface. Place the new/changed affordance where the implementation puts it —
|
|
194
|
+
for example, a new `Edit with AI` action in a popover header belongs in the
|
|
195
|
+
top-right header slot, aligned with the title, not in the body or footer. Use
|
|
196
|
+
the same frame size, scale, outer padding, border radius, and visual density on
|
|
197
|
+
both sides unless the change itself alters those properties, and let the frame
|
|
198
|
+
height fit the content rather than leaving a tall empty lower half.
|
|
199
|
+
|
|
200
|
+
**Name the states with the column header, never inside the frame.** For
|
|
201
|
+
document-body wireframes (recaps), put the two
|
|
202
|
+
states in a `columns` block and set each column's `label` to `Before` and
|
|
203
|
+
`After` — the renderer draws that label as an `h4` heading above each frame. Do
|
|
204
|
+
NOT bake a `Before`/`After` pill, title, or heading into the wireframe `html`: a
|
|
205
|
+
label placed inside reads as part of the product UI, lands in a random corner,
|
|
206
|
+
and clutters the comparison. The column header is the one and only place the
|
|
207
|
+
state name belongs. On a canvas, place the two state artboards as neighbors with
|
|
208
|
+
frame labels — never encode Before/After inside the html.
|
|
209
|
+
|
|
210
|
+
**Let the surface choose side-by-side vs. stacked.** For document-body
|
|
211
|
+
wireframes (recaps), the `columns` renderer lays
|
|
212
|
+
narrow surfaces (`mobile`, `popover`, `panel`) out side by side, and
|
|
213
|
+
automatically stacks wide surfaces (`desktop`, `browser`) vertically at full
|
|
214
|
+
document width so a large frame is never crushed into a half-width column and
|
|
215
|
+
cropped. Author both wireframes with the real `surface` and the matching
|
|
216
|
+
`Before`/`After` column labels; do not hand-stack the pair into separate
|
|
217
|
+
top-level wireframes or duplicate the state name as body content.
|
|
218
|
+
|
|
219
|
+
**Good example — a contacts list, surface `browser`.** A small, real screen
|
|
220
|
+
composed from the helper classes and tokens, layout in inline flex, no fonts or
|
|
221
|
+
hex colors:
|
|
222
|
+
|
|
223
|
+
```html
|
|
224
|
+
<div
|
|
225
|
+
style="display:flex;flex-direction:column;gap:12px;padding:16px;height:100%"
|
|
226
|
+
>
|
|
227
|
+
<div style="display:flex;align-items:center;justify-content:space-between">
|
|
228
|
+
<h1>Contacts</h1>
|
|
229
|
+
<button class="primary">New contact</button>
|
|
230
|
+
</div>
|
|
231
|
+
<div style="display:flex;gap:6px">
|
|
232
|
+
<span class="wf-pill accent">All 128</span>
|
|
233
|
+
<span class="wf-pill">Favorites</span>
|
|
234
|
+
<span class="wf-pill">Archived</span>
|
|
235
|
+
</div>
|
|
236
|
+
<div
|
|
237
|
+
class="wf-card"
|
|
238
|
+
style="display:flex;flex-direction:column;gap:0;padding:0"
|
|
239
|
+
>
|
|
240
|
+
<div
|
|
241
|
+
style="display:flex;align-items:center;gap:10px;padding:10px 12px;border-bottom:1.4px solid var(--wf-line)"
|
|
242
|
+
>
|
|
243
|
+
<div
|
|
244
|
+
style="width:32px;height:32px;border-radius:999px;background:var(--wf-accent-soft)"
|
|
245
|
+
></div>
|
|
246
|
+
<div style="flex:1">
|
|
247
|
+
<strong>Jane Cooper</strong><br /><small>jane@acme.co</small>
|
|
248
|
+
</div>
|
|
249
|
+
<span class="wf-pill">Lead</span>
|
|
250
|
+
</div>
|
|
251
|
+
<div style="display:flex;align-items:center;gap:10px;padding:10px 12px">
|
|
252
|
+
<div
|
|
253
|
+
style="width:32px;height:32px;border-radius:999px;background:var(--wf-accent-soft)"
|
|
254
|
+
></div>
|
|
255
|
+
<div style="flex:1">
|
|
256
|
+
<strong>Marcus Lee</strong><br /><small>marcus@globex.io</small>
|
|
257
|
+
</div>
|
|
258
|
+
<span class="wf-pill">Customer</span>
|
|
259
|
+
</div>
|
|
260
|
+
</div>
|
|
261
|
+
</div>
|
|
262
|
+
```
|
|
263
|
+
|
|
264
|
+
<!-- SHARED-CORE:wireframe-quality END -->
|