@twoux/ui 0.0.0-stage → 0.1.0
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/LICENSE.md +61 -0
- package/LICENSES/Apache-2.0.txt +202 -0
- package/NOTICE.md +64 -0
- package/SHADCN-DIFF.md +228 -0
- package/agent/AGENTS.md +358 -0
- package/agent/docs-md/accessibility.md +49 -0
- package/agent/docs-md/action-catalogue.md +81 -0
- package/agent/docs-md/actions.md +74 -0
- package/agent/docs-md/agent-activity-log.md +70 -0
- package/agent/docs-md/agent-permissions.md +82 -0
- package/agent/docs-md/agent-run.md +90 -0
- package/agent/docs-md/agents-on-behalf.md +74 -0
- package/agent/docs-md/ai-column.md +85 -0
- package/agent/docs-md/ai-origin-label.md +70 -0
- package/agent/docs-md/announcing-features.md +73 -0
- package/agent/docs-md/answer-actions.md +81 -0
- package/agent/docs-md/app-shell.md +114 -0
- package/agent/docs-md/artifact-card.md +89 -0
- package/agent/docs-md/ask-on-screen.md +72 -0
- package/agent/docs-md/assistant-page.md +100 -0
- package/agent/docs-md/assistant-panel.md +142 -0
- package/agent/docs-md/avatar.md +82 -0
- package/agent/docs-md/banner.md +106 -0
- package/agent/docs-md/board.md +163 -0
- package/agent/docs-md/breadcrumb.md +89 -0
- package/agent/docs-md/breakdown-table.md +97 -0
- package/agent/docs-md/bulk-action-bar.md +112 -0
- package/agent/docs-md/button.md +293 -0
- package/agent/docs-md/card.md +115 -0
- package/agent/docs-md/change-list.md +99 -0
- package/agent/docs-md/change-request.md +166 -0
- package/agent/docs-md/chart-area.md +87 -0
- package/agent/docs-md/chart-bar.md +100 -0
- package/agent/docs-md/chart-box-plot.md +88 -0
- package/agent/docs-md/chart-bullet.md +89 -0
- package/agent/docs-md/chart-candlestick.md +112 -0
- package/agent/docs-md/chart-card-line.md +120 -0
- package/agent/docs-md/chart-donut.md +90 -0
- package/agent/docs-md/chart-drill-down.md +72 -0
- package/agent/docs-md/chart-funnel.md +71 -0
- package/agent/docs-md/chart-heatmap.md +76 -0
- package/agent/docs-md/chart-histogram.md +81 -0
- package/agent/docs-md/chart-map.md +165 -0
- package/agent/docs-md/chart-mixed.md +88 -0
- package/agent/docs-md/chart-price.md +92 -0
- package/agent/docs-md/chart-radial-bars.md +109 -0
- package/agent/docs-md/chart-radial-lines.md +111 -0
- package/agent/docs-md/chart-sankey.md +104 -0
- package/agent/docs-md/chart-scatter.md +87 -0
- package/agent/docs-md/chart-share-bar.md +89 -0
- package/agent/docs-md/chart-treemap.md +98 -0
- package/agent/docs-md/chart-waterfall.md +93 -0
- package/agent/docs-md/checkbox.md +131 -0
- package/agent/docs-md/choosing-selection-control.md +71 -0
- package/agent/docs-md/citations-sources.md +79 -0
- package/agent/docs-md/citing-sources.md +63 -0
- package/agent/docs-md/clarify-before-acting.md +69 -0
- package/agent/docs-md/clarifying-question.md +92 -0
- package/agent/docs-md/code-block.md +174 -0
- package/agent/docs-md/colours.md +87 -0
- package/agent/docs-md/columns-menu.md +140 -0
- package/agent/docs-md/combobox.md +161 -0
- package/agent/docs-md/command-palette.md +126 -0
- package/agent/docs-md/confidence-note.md +87 -0
- package/agent/docs-md/configurable-dashboard.md +76 -0
- package/agent/docs-md/confirmation-dialog.md +93 -0
- package/agent/docs-md/connected-tools.md +80 -0
- package/agent/docs-md/connector-picker.md +127 -0
- package/agent/docs-md/consistency.md +53 -0
- package/agent/docs-md/content-density.md +61 -0
- package/agent/docs-md/conversation-history.md +78 -0
- package/agent/docs-md/create-record.md +80 -0
- package/agent/docs-md/csv-import.md +88 -0
- package/agent/docs-md/dashboard-items.md +78 -0
- package/agent/docs-md/data-export.md +61 -0
- package/agent/docs-md/data-grid.md +137 -0
- package/agent/docs-md/data-vis-colours.md +76 -0
- package/agent/docs-md/data-visualisation.md +76 -0
- package/agent/docs-md/date-picker.md +178 -0
- package/agent/docs-md/delete-record.md +75 -0
- package/agent/docs-md/dense-table.md +495 -0
- package/agent/docs-md/design-tokens.md +53 -0
- package/agent/docs-md/disabled-read-only.md +75 -0
- package/agent/docs-md/drag-and-drop.md +74 -0
- package/agent/docs-md/dropdown-menu.md +137 -0
- package/agent/docs-md/edit-record.md +73 -0
- package/agent/docs-md/empty-loading-error.md +78 -0
- package/agent/docs-md/empty-state.md +128 -0
- package/agent/docs-md/error-messages.md +75 -0
- package/agent/docs-md/error-state.md +123 -0
- package/agent/docs-md/export-menu.md +86 -0
- package/agent/docs-md/feedback-prompt.md +88 -0
- package/agent/docs-md/field-mapping.md +78 -0
- package/agent/docs-md/file-drop.md +110 -0
- package/agent/docs-md/filter-bar.md +138 -0
- package/agent/docs-md/filter-panel.md +103 -0
- package/agent/docs-md/filtering-search.md +79 -0
- package/agent/docs-md/follow-ups-starters.md +79 -0
- package/agent/docs-md/form-validation.md +95 -0
- package/agent/docs-md/generated-columns.md +65 -0
- package/agent/docs-md/generated-drafts-files.md +71 -0
- package/agent/docs-md/grouped-list.md +89 -0
- package/agent/docs-md/guide-cue.md +170 -0
- package/agent/docs-md/help-panel.md +103 -0
- package/agent/docs-md/help-system.md +74 -0
- package/agent/docs-md/iconography.md +49 -0
- package/agent/docs-md/inbox.md +108 -0
- package/agent/docs-md/inline-editing-validation.md +80 -0
- package/agent/docs-md/inline-input-in-answer.md +70 -0
- package/agent/docs-md/items-palette.md +116 -0
- package/agent/docs-md/keyboard-model.md +47 -0
- package/agent/docs-md/keyboard-navigation.md +68 -0
- package/agent/docs-md/keyboard-shortcut-hint.md +87 -0
- package/agent/docs-md/keyboard-shortcut-sheet.md +90 -0
- package/agent/docs-md/labelling-ai-output.md +66 -0
- package/agent/docs-md/layout.md +47 -0
- package/agent/docs-md/list-table.md +254 -0
- package/agent/docs-md/loading-skeleton.md +91 -0
- package/agent/docs-md/managing-agents.md +71 -0
- package/agent/docs-md/message-composer.md +105 -0
- package/agent/docs-md/migrating.md +49 -0
- package/agent/docs-md/motion.md +93 -0
- package/agent/docs-md/navigation.md +76 -0
- package/agent/docs-md/notification-channels.md +65 -0
- package/agent/docs-md/notifications-decision.md +100 -0
- package/agent/docs-md/onboarding-step.md +114 -0
- package/agent/docs-md/order-book.md +108 -0
- package/agent/docs-md/page-header.md +96 -0
- package/agent/docs-md/pagination.md +88 -0
- package/agent/docs-md/pane-layout.md +105 -0
- package/agent/docs-md/period-comparison.md +66 -0
- package/agent/docs-md/plan-card.md +120 -0
- package/agent/docs-md/popover-rules.md +88 -0
- package/agent/docs-md/prompt-editor.md +90 -0
- package/agent/docs-md/propose-apply.md +65 -0
- package/agent/docs-md/provider-logo.md +97 -0
- package/agent/docs-md/radio.md +83 -0
- package/agent/docs-md/ranked-list.md +102 -0
- package/agent/docs-md/reasoning-progress.md +72 -0
- package/agent/docs-md/record-detail.md +71 -0
- package/agent/docs-md/regenerating-answers.md +70 -0
- package/agent/docs-md/run-status-bar.md +94 -0
- package/agent/docs-md/saved-tasks-schedules.md +63 -0
- package/agent/docs-md/saved-views.md +149 -0
- package/agent/docs-md/saving-views.md +68 -0
- package/agent/docs-md/scheduler.md +258 -0
- package/agent/docs-md/secondary-panels.md +72 -0
- package/agent/docs-md/segmented-control.md +88 -0
- package/agent/docs-md/selection-bulk-actions.md +70 -0
- package/agent/docs-md/separator.md +75 -0
- package/agent/docs-md/setup-checklist.md +92 -0
- package/agent/docs-md/shape-elevation.md +55 -0
- package/agent/docs-md/sheet-grid.md +211 -0
- package/agent/docs-md/side-panel.md +134 -0
- package/agent/docs-md/sign-in.md +114 -0
- package/agent/docs-md/spacing.md +55 -0
- package/agent/docs-md/split-button.md +100 -0
- package/agent/docs-md/stat-compare.md +82 -0
- package/agent/docs-md/static-dashboard.md +75 -0
- package/agent/docs-md/status-badge.md +140 -0
- package/agent/docs-md/step-card.md +75 -0
- package/agent/docs-md/stepper.md +92 -0
- package/agent/docs-md/suggested-changes.md +91 -0
- package/agent/docs-md/switch.md +78 -0
- package/agent/docs-md/table-settings.md +81 -0
- package/agent/docs-md/tabs.md +85 -0
- package/agent/docs-md/tag-input.md +108 -0
- package/agent/docs-md/tag.md +79 -0
- package/agent/docs-md/task-builder.md +87 -0
- package/agent/docs-md/team-instructions.md +72 -0
- package/agent/docs-md/templates-gallery.md +85 -0
- package/agent/docs-md/text-input.md +160 -0
- package/agent/docs-md/thinking-steps.md +89 -0
- package/agent/docs-md/timeline.md +189 -0
- package/agent/docs-md/timestamp.md +84 -0
- package/agent/docs-md/timestamps.md +70 -0
- package/agent/docs-md/toast.md +117 -0
- package/agent/docs-md/tooltip.md +90 -0
- package/agent/docs-md/typography.md +62 -0
- package/agent/docs-md/undo-destructive.md +66 -0
- package/agent/docs-md/unsaved-changes.md +71 -0
- package/agent/docs-md/usage-meter.md +80 -0
- package/agent/docs-md/user-feedback.md +71 -0
- package/agent/docs-md/voice-and-tone.md +60 -0
- package/agent/docs-md/why-choice.md +93 -0
- package/agent/docs-md/workspace-onboarding.md +74 -0
- package/agent/docs-md/writing.md +48 -0
- package/agent/llms-full.txt +18369 -0
- package/agent/llms.txt +198 -0
- package/agent/skills/twoux-audit/SKILL.md +49 -0
- package/agent/skills/twoux-build/SKILL.md +39 -0
- package/agent/skills/twoux-design/SKILL.md +54 -0
- package/agent/skills/twoux-write/SKILL.md +32 -0
- package/bin/check.mjs +123 -0
- package/bin/docs.mjs +24 -0
- package/bin/guard.mjs +27 -0
- package/bin/init.mjs +113 -0
- package/bin/knowledge.mjs +87 -0
- package/bin/mcp.mjs +116 -0
- package/bin/theme.mjs +168 -0
- package/bin/twoux.mjs +25 -0
- package/package.json +80 -3
- package/registry/jobs.json +1028 -0
- package/registry/palette.json +770 -0
- package/registry/rules.json +913 -0
- package/src/components/agent-review.tsx +364 -0
- package/src/components/ai-basics.tsx +212 -0
- package/src/components/ai-work.tsx +304 -0
- package/src/components/ai.tsx +227 -0
- package/src/components/alert-dialog.tsx +203 -0
- package/src/components/alert.tsx +86 -0
- package/src/components/avatar.tsx +114 -0
- package/src/components/badge.tsx +59 -0
- package/src/components/board.tsx +397 -0
- package/src/components/breadcrumb.tsx +114 -0
- package/src/components/button-group.tsx +90 -0
- package/src/components/button.tsx +109 -0
- package/src/components/calendar.tsx +247 -0
- package/src/components/card.tsx +102 -0
- package/src/components/chart-map.tsx +336 -0
- package/src/components/charts-more.tsx +1331 -0
- package/src/components/charts-radial.tsx +328 -0
- package/src/components/charts.tsx +390 -0
- package/src/components/checkbox.tsx +40 -0
- package/src/components/code.tsx +139 -0
- package/src/components/collapsible.tsx +37 -0
- package/src/components/combobox.tsx +339 -0
- package/src/components/command-extras.tsx +11 -0
- package/src/components/command.tsx +196 -0
- package/src/components/data-grid.tsx +213 -0
- package/src/components/data-table.tsx +334 -0
- package/src/components/data-views.tsx +740 -0
- package/src/components/date-picker.tsx +686 -0
- package/src/components/dense-table.tsx +207 -0
- package/src/components/dialog.tsx +162 -0
- package/src/components/dropdown-menu.tsx +264 -0
- package/src/components/empty.tsx +114 -0
- package/src/components/feedback-prompt.tsx +80 -0
- package/src/components/field.tsx +254 -0
- package/src/components/fields.tsx +112 -0
- package/src/components/flow.tsx +840 -0
- package/src/components/guide-cue.tsx +273 -0
- package/src/components/inbox.tsx +113 -0
- package/src/components/input-group.tsx +176 -0
- package/src/components/input.tsx +26 -0
- package/src/components/kbd.tsx +34 -0
- package/src/components/label.tsx +27 -0
- package/src/components/labels.tsx +176 -0
- package/src/components/motion.tsx +136 -0
- package/src/components/onboarding.tsx +454 -0
- package/src/components/order-book.tsx +185 -0
- package/src/components/pane-layout.tsx +417 -0
- package/src/components/popover.tsx +96 -0
- package/src/components/provider-logos.data.ts +49 -0
- package/src/components/radio-group.tsx +52 -0
- package/src/components/scheduler.tsx +997 -0
- package/src/components/segmented-control.tsx +28 -0
- package/src/components/select.tsx +195 -0
- package/src/components/separator.tsx +31 -0
- package/src/components/sheet.tsx +148 -0
- package/src/components/shell.tsx +426 -0
- package/src/components/shortcut-sheet.tsx +83 -0
- package/src/components/skeleton.tsx +18 -0
- package/src/components/sonner.tsx +107 -0
- package/src/components/spinner.tsx +13 -0
- package/src/components/split-button.tsx +58 -0
- package/src/components/stepper.tsx +78 -0
- package/src/components/switch.tsx +43 -0
- package/src/components/table.tsx +126 -0
- package/src/components/tabs.tsx +118 -0
- package/src/components/tag-input.tsx +253 -0
- package/src/components/textarea.tsx +21 -0
- package/src/components/theme.tsx +80 -0
- package/src/components/timeline.tsx +408 -0
- package/src/components/toggle-group.tsx +87 -0
- package/src/components/toggle.tsx +54 -0
- package/src/components/tooltip.tsx +65 -0
- package/src/components/workspace-actions.tsx +294 -0
- package/src/components/workspace-import.tsx +465 -0
- package/src/components/workspace.tsx +1884 -0
- package/src/index.ts +80 -0
- package/src/lib/active-indicator.tsx +53 -0
- package/src/lib/chart-kit.tsx +72 -0
- package/src/lib/cn.ts +6 -0
- package/src/lib/shortcuts.tsx +61 -0
- package/src/lib/workspace.tsx +10 -0
- package/src/shadcn/alert-dialog.tsx +196 -0
- package/src/shadcn/alert.tsx +65 -0
- package/src/shadcn/avatar.tsx +108 -0
- package/src/shadcn/badge.tsx +47 -0
- package/src/shadcn/breadcrumb.tsx +108 -0
- package/src/shadcn/button-group.tsx +83 -0
- package/src/shadcn/button.tsx +63 -0
- package/src/shadcn/calendar.tsx +220 -0
- package/src/shadcn/card.tsx +91 -0
- package/src/shadcn/checkbox.tsx +31 -0
- package/src/shadcn/collapsible.tsx +33 -0
- package/src/shadcn/command.tsx +184 -0
- package/src/shadcn/dialog.tsx +158 -0
- package/src/shadcn/dropdown-menu.tsx +256 -0
- package/src/shadcn/empty.tsx +103 -0
- package/src/shadcn/field.tsx +248 -0
- package/src/shadcn/input-group.tsx +170 -0
- package/src/shadcn/input.tsx +20 -0
- package/src/shadcn/kbd.tsx +28 -0
- package/src/shadcn/label.tsx +23 -0
- package/src/shadcn/popover.tsx +88 -0
- package/src/shadcn/radio-group.tsx +44 -0
- package/src/shadcn/select.tsx +189 -0
- package/src/shadcn/separator.tsx +27 -0
- package/src/shadcn/sheet.tsx +142 -0
- package/src/shadcn/skeleton.tsx +13 -0
- package/src/shadcn/sonner.tsx +40 -0
- package/src/shadcn/switch.tsx +34 -0
- package/src/shadcn/table.tsx +115 -0
- package/src/shadcn/tabs.tsx +90 -0
- package/src/shadcn/textarea.tsx +17 -0
- package/src/shadcn/toggle-group.tsx +83 -0
- package/src/shadcn/toggle.tsx +46 -0
- package/src/shadcn/tooltip.tsx +56 -0
- package/src/styles/palette.css +127 -0
- package/src/styles/theme.css +35 -0
- package/src/styles/twoux.css +236 -0
- package/theme.json +14 -0
- package/README.md +0 -3
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
# Page actions and row actions
|
|
2
|
+
|
|
3
|
+
Actions that affect the page or many records sit in the page header or the bulk action bar; one or two frequent actions also sit on each row, and every row action is reachable from the selection too.
|
|
4
|
+
|
|
5
|
+
Kind: pattern · Group: Patterns: general
|
|
6
|
+
|
|
7
|
+
**Problem:** If row actions and page actions live in different places on every screen, people miss them. Rows crowded with buttons are noisy, and actions that exist only on hover can't be found by keyboard or touch users.
|
|
8
|
+
|
|
9
|
+
**Solution:** Global actions (Create listing, Export, actions on a selection) live in the page header and the bulk action bar. In-context actions live with the thing they change: a row's last column, a card or section header. The full set is always available globally; in-context copies are shortcuts for the common ones.
|
|
10
|
+
|
|
11
|
+
**Built from:** Page header, Bulk action bar, List table, Data grid, Dropdown menu, Button, Command palette (⌘K)
|
|
12
|
+
|
|
13
|
+
## How it works
|
|
14
|
+
|
|
15
|
+
1. List every action and who it acts on: the page or collection (Create listing, Export), a selection (Close, Extend), or one record (Edit, Duplicate).
|
|
16
|
+
2. Put page actions in the page header: up to four buttons, with the single primary action last on the right; more go in a More actions menu.
|
|
17
|
+
3. Put selection actions in the bulk action bar. Any action that can apply to many records is offered there, so nobody repeats it row by row.
|
|
18
|
+
4. On rows, keep one or two of the most used actions as icon buttons and the rest in a More actions menu in the last column. Choose them from usage data.
|
|
19
|
+
5. Put actions for a section or card in that section's header, on the right.
|
|
20
|
+
|
|
21
|
+
## When to use
|
|
22
|
+
|
|
23
|
+
- Global: creating a record, exporting, importing, and any action on selected rows.
|
|
24
|
+
- In-context: frequent one-record actions such as Duplicate listing or Copy link, and section actions such as Edit details in the side panel.
|
|
25
|
+
- Section actions: Edit details on a side panel section, Add interviewer on an interview card.
|
|
26
|
+
|
|
27
|
+
## When not to use
|
|
28
|
+
|
|
29
|
+
- Row menus for bulk actions. Bulk work belongs in the bulk action bar.
|
|
30
|
+
- A primary button inside a row. Rows use icon buttons or a menu, never filled buttons.
|
|
31
|
+
- Hover-only actions with no menu fallback; touch and keyboard users would never find them.
|
|
32
|
+
|
|
33
|
+
## Guidelines
|
|
34
|
+
|
|
35
|
+
- One primary action per view, in the page header.
|
|
36
|
+
- Header order from left to right: status actions (Pause, Reopen), View, Edit, other actions, Delete, then the primary action.
|
|
37
|
+
- Row menus hold up to seven items, most used first, with destructive items last after a separator.
|
|
38
|
+
- The More actions button on each row is always visible; quick icon buttons may appear on row hover or focus, and always on touch screens.
|
|
39
|
+
- Keep the actions column sticky on wide tables so actions stay in view while scrolling sideways.
|
|
40
|
+
- When an action depends on status, such as Reopen on a Closed listing, show the Status column so people see why it is offered.
|
|
41
|
+
- Every action is also in the command palette (⌘K) with its shortcut.
|
|
42
|
+
|
|
43
|
+
## Content
|
|
44
|
+
|
|
45
|
+
- Button labels are a verb, plus a noun when the verb alone is unclear: "Create listing", "Export", "Close 2 listings".
|
|
46
|
+
- Menu buttons name their set: "More actions", not "Options" or an unlabelled dots icon.
|
|
47
|
+
- No end punctuation in button or menu labels.
|
|
48
|
+
|
|
49
|
+
## Accessibility
|
|
50
|
+
|
|
51
|
+
- Icon-only row actions have an accessible name that includes the record: "Duplicate Junior Product Designer".
|
|
52
|
+
- The More actions button follows the menu button pattern: Enter or Space opens, arrows move, Esc closes and returns focus.
|
|
53
|
+
- Hover-revealed icons also appear when the row has keyboard focus.
|
|
54
|
+
|
|
55
|
+
## Do
|
|
56
|
+
|
|
57
|
+
- Do keep the full action set in the header, bulk bar and ⌘K.
|
|
58
|
+
- Do limit rows to one or two visible actions.
|
|
59
|
+
- Do put the primary action last on the right.
|
|
60
|
+
|
|
61
|
+
## Don't
|
|
62
|
+
|
|
63
|
+
- Don't make hover the only way to find a row action.
|
|
64
|
+
- Don't put two primary buttons on one page.
|
|
65
|
+
- Don't put actions for the whole table in a row menu.
|
|
66
|
+
|
|
67
|
+
## Related
|
|
68
|
+
|
|
69
|
+
- Selection and bulk actions
|
|
70
|
+
- Disabled and read-only states
|
|
71
|
+
- Keyboard-first navigation
|
|
72
|
+
- Page header
|
|
73
|
+
- Bulk action bar
|
|
74
|
+
- Dropdown menu
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
# Agent activity log
|
|
2
|
+
|
|
3
|
+
A chronological list of what agents and the assistant did across runs: time, an icon with a word for the outcome, a past-tense label that links to the run or message, grouped by day.
|
|
4
|
+
|
|
5
|
+
Kind: pattern · Group: Patterns: AI
|
|
6
|
+
|
|
7
|
+
**Problem:** A single run shows its own steps, but people ask broader questions: what did the listings agent do this week, which run changed LST-1044, when did someone approve that. Without a log they search through conversations and inbox items from memory.
|
|
8
|
+
|
|
9
|
+
**Solution:** An activity log on each agent and on the assistant page lists events in time order, newest last within each day, grouped under Today, Yesterday and dated dividers. Each event has a time, a status icon with a word, and a past-tense label that opens the run step, message or record it refers to. A filter narrows by agent, event type or outcome.
|
|
10
|
+
|
|
11
|
+
**Built from:** Agent run timeline, Grouped list, Filter pills and filter bar, Status badge, Separator, Side panel (drawer), Assistant page
|
|
12
|
+
|
|
13
|
+
## How it works
|
|
14
|
+
|
|
15
|
+
1. Group events by day with a labelled divider: Today, Yesterday, then dates such as "Tue 4 Nov 2026".
|
|
16
|
+
2. Each row: time in a fixed-width column, outcome icon with a word, a past-tense label, and who started it.
|
|
17
|
+
3. The label links to where it happened: the run step, the conversation message or the record.
|
|
18
|
+
4. Filter by agent, event type (read, changed, waited, failed) or outcome using the filter bar.
|
|
19
|
+
5. On a long conversation, the assistant page can show the same list as an outline whose rows jump to each message.
|
|
20
|
+
|
|
21
|
+
## When to use
|
|
22
|
+
|
|
23
|
+
- On each agent's detail to answer "what did it do and when".
|
|
24
|
+
- On a long task conversation, as an outline to move between key moments.
|
|
25
|
+
- When someone needs to trace which run changed a listing, for example during a review of closing dates.
|
|
26
|
+
|
|
27
|
+
## When not to use
|
|
28
|
+
|
|
29
|
+
- While a single run is in progress. Use the agent run timeline with its live steps and Stop.
|
|
30
|
+
- For a record's own change history. Use the record's history, which also shows changes people made.
|
|
31
|
+
- As a notification feed. Things that need someone go to the Inbox.
|
|
32
|
+
|
|
33
|
+
## Guidelines
|
|
34
|
+
|
|
35
|
+
- Every event an agent took is in the log: what it read, changed, waited for and failed, with who started the run.
|
|
36
|
+
- Use the same step states and icons as the run timeline; outcome is a word plus an icon, never colour alone.
|
|
37
|
+
- Mark events a person did differently from agent events, with the person's avatar, so approvals and rejections stand out.
|
|
38
|
+
- Omit the time column where the label already links to a timestamped message.
|
|
39
|
+
- Don't auto-scroll to new events unless the person is already at the end of the list.
|
|
40
|
+
|
|
41
|
+
## Content
|
|
42
|
+
|
|
43
|
+
- Agent events in the past tense: "Changed closing date on LST-1044", "Read 9 listings".
|
|
44
|
+
- Person events start with the verb: "Approved 2 changes", "Rejected sending to Leeds team".
|
|
45
|
+
- Times in the person's local time, with the full date and time on hover.
|
|
46
|
+
|
|
47
|
+
## Accessibility
|
|
48
|
+
|
|
49
|
+
- Day groups are lists with a heading each, so screen reader users can jump by day.
|
|
50
|
+
- New events in an open log are announced politely, at most once every few seconds.
|
|
51
|
+
- Outcome icons have text equivalents; the word is visible, not only in a tooltip.
|
|
52
|
+
|
|
53
|
+
## Do
|
|
54
|
+
|
|
55
|
+
- Do link every event to where it happened.
|
|
56
|
+
- Do group by day once activity spans dates.
|
|
57
|
+
- Do mark events people did with their avatar.
|
|
58
|
+
|
|
59
|
+
## Don't
|
|
60
|
+
|
|
61
|
+
- Don't pull people to the bottom while they read older events.
|
|
62
|
+
- Don't leave out failed or skipped events to make the log look tidy.
|
|
63
|
+
- Don't show a time column when the label already links to a timestamped message.
|
|
64
|
+
|
|
65
|
+
## Related
|
|
66
|
+
|
|
67
|
+
- Agents acting on your behalf
|
|
68
|
+
- Showing reasoning and progress
|
|
69
|
+
- Saved tasks and schedules
|
|
70
|
+
- Agent run timeline
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
# Agent permissions
|
|
2
|
+
|
|
3
|
+
Per-action access set in plain words with three levels, Off, Ask first and Allow, grouped into Read and Change.
|
|
4
|
+
|
|
5
|
+
Kind: component · Group: AI and agents · Status: built, import from @twoux/ui
|
|
6
|
+
|
|
7
|
+
## When to use
|
|
8
|
+
|
|
9
|
+
- Setting what an agent may read and change before it runs.
|
|
10
|
+
- Adjusting automation per action as trust grows.
|
|
11
|
+
|
|
12
|
+
## When not to use
|
|
13
|
+
|
|
14
|
+
- Approving one specific change. Use Suggested changes (suggested-changes).
|
|
15
|
+
- Connecting an outside account. Use Connected tools (connected-tools).
|
|
16
|
+
|
|
17
|
+
## Structure
|
|
18
|
+
|
|
19
|
+
1. Group header (Read, Change) with summary level
|
|
20
|
+
2. Permission rows (action, what it covers, Off / Ask first / Allow segmented control)
|
|
21
|
+
|
|
22
|
+
## Guidelines
|
|
23
|
+
|
|
24
|
+
- Three levels per action: Off, Ask first, Allow.
|
|
25
|
+
- Defaults: reading Allow, changes Ask first, anything that reaches people outside the workspace Off.
|
|
26
|
+
- Group by Read and Change and describe each in plain words ("Sends from your address").
|
|
27
|
+
- Ask first is just-in-time consent: the agent pauses with a proposal. Set up front only the default, not a one-off decision.
|
|
28
|
+
- Remind people of the setting when it blocks a step ("Email is Off in permissions") with a link to change it.
|
|
29
|
+
- Candidate data is personal data; keep it Ask first so a person reviews each use.
|
|
30
|
+
- Per-run choices ("Allow once", "Allow in this conversation") never change the saved level; only "Always allow" does, and it shows here as Allow with who set it and when.
|
|
31
|
+
- Allow is never preselected or focused when a level is offered for a risky action.
|
|
32
|
+
|
|
33
|
+
## Content
|
|
34
|
+
|
|
35
|
+
- Name actions, not systems: "Edit, extend or close listings", "Email candidates".
|
|
36
|
+
- Detail line says what it covers or what happens ("Shows a proposal before each change").
|
|
37
|
+
|
|
38
|
+
## Accessibility
|
|
39
|
+
|
|
40
|
+
- Each segmented control is a group labelled by its row, with toggle buttons using aria-pressed (APG button).
|
|
41
|
+
- Alternatively use a radiogroup with arrow keys; pick one and use it consistently (SC 3.2.4).
|
|
42
|
+
- Changing a level must not change context (SC 3.2.2).
|
|
43
|
+
- The selected state is shown with more than colour (SC 1.4.1, 1.4.11).
|
|
44
|
+
|
|
45
|
+
## Keyboard
|
|
46
|
+
|
|
47
|
+
| Keys | Action |
|
|
48
|
+
|---|---|
|
|
49
|
+
| Tab | Move between permission rows |
|
|
50
|
+
| Enter / Space | Set the focused level |
|
|
51
|
+
|
|
52
|
+
## Examples
|
|
53
|
+
|
|
54
|
+
### levels
|
|
55
|
+
|
|
56
|
+
```tsx
|
|
57
|
+
import { AgentPermissions, type Permission } from "@twoux/ui";
|
|
58
|
+
import { useState } from "react";
|
|
59
|
+
|
|
60
|
+
export const meta = { title: "Off, Ask first or Allow", description: "Reading defaults to Allow, changes to Ask first, anything that reaches people outside the workspace to Off. Decisions about candidates can never be set to Allow.", order: 1 };
|
|
61
|
+
|
|
62
|
+
export default function Example() {
|
|
63
|
+
const [items, setItems] = useState<Permission[]>([
|
|
64
|
+
{ id: "r1", group: "Read", action: "Read listings and applicants", covers: "Titles, descriptions, stages and counts", level: "allow" },
|
|
65
|
+
{ id: "r2", group: "Read", action: "Read team files", covers: "Salary bands and the hiring handbook", level: "allow" },
|
|
66
|
+
{ id: "c1", group: "Change", action: "Edit listings", covers: "Titles, descriptions, closing dates", level: "ask" },
|
|
67
|
+
{ id: "c2", group: "Change", action: "Move candidates between stages", covers: "Screen, interview, offer, reject", level: "ask", neverAllow: true },
|
|
68
|
+
{ id: "c3", group: "Change", action: "Email candidates", covers: "Sends from your address", level: "off" },
|
|
69
|
+
]);
|
|
70
|
+
return <div className="w-full max-w-2xl"><AgentPermissions items={items} onChange={(id, level) => setItems((x) => x.map((p) => (p.id === id ? { ...p, level } : p)))} /></div>;
|
|
71
|
+
}
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
## Related
|
|
75
|
+
|
|
76
|
+
- Agent run timeline
|
|
77
|
+
- Suggested changes
|
|
78
|
+
- Connected tools
|
|
79
|
+
- Segmented control
|
|
80
|
+
- Plan preview
|
|
81
|
+
- Change review
|
|
82
|
+
- Connector picker
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
# Agent run timeline
|
|
2
|
+
|
|
3
|
+
The steps of an agent run with state in shape and colour, the filter each step used, a highlighted waiting step and Stop always visible.
|
|
4
|
+
|
|
5
|
+
Kind: component · Group: AI and agents · Status: built, import from @twoux/ui
|
|
6
|
+
|
|
7
|
+
## When to use
|
|
8
|
+
|
|
9
|
+
- Watching or reviewing an agent run, scheduled or started from a task.
|
|
10
|
+
- When a run is waiting for approval, to show what it needs.
|
|
11
|
+
|
|
12
|
+
## When not to use
|
|
13
|
+
|
|
14
|
+
- A single answer. Use Thinking and steps (thinking-steps).
|
|
15
|
+
- Applying a proposal you just approved. Use the Step card (step-card).
|
|
16
|
+
- Listing everything that needs you across runs. Use the Inbox (inbox).
|
|
17
|
+
|
|
18
|
+
## Structure
|
|
19
|
+
|
|
20
|
+
1. Header (task name, status badge, Stop)
|
|
21
|
+
2. Step rows (state icon, title, detail, action)
|
|
22
|
+
3. Footer (started by, when, schedule)
|
|
23
|
+
|
|
24
|
+
## Guidelines
|
|
25
|
+
|
|
26
|
+
- Every step has a state: done, running, waiting for you, skipped, failed.
|
|
27
|
+
- Steps that pick rows show the filter used and open it as a view.
|
|
28
|
+
- A waiting step is highlighted and holds its action (Review).
|
|
29
|
+
- Stop is always visible and in the same place.
|
|
30
|
+
- Skipped steps say why and link to the setting.
|
|
31
|
+
- Record who started it, when and on what schedule, and keep the log.
|
|
32
|
+
- In parallel steps, a failed step shows its own error and Retry on its row while the rest keep running; the run isn't shown as blocked.
|
|
33
|
+
- Failed and stopped steps are never counted as done; the counts add up to the steps shown.
|
|
34
|
+
|
|
35
|
+
## Content
|
|
36
|
+
|
|
37
|
+
- Step titles say what happened in past tense with counts ("Found 2 live listings under 3%").
|
|
38
|
+
- Badge text is a state, not a mood: "Needs you", "Done", "Failed".
|
|
39
|
+
|
|
40
|
+
## Accessibility
|
|
41
|
+
|
|
42
|
+
- States combine an icon shape, colour and text (SC 1.4.1, 1.4.11).
|
|
43
|
+
- Use a list with each step as a list item so the order is exposed (SC 1.3.1).
|
|
44
|
+
- Announce new steps and a change to "Needs you" as status messages (SC 4.1.3).
|
|
45
|
+
- Running runs are auto-updating content in parallel with the page; Stop meets SC 2.2.2.
|
|
46
|
+
|
|
47
|
+
## Keyboard
|
|
48
|
+
|
|
49
|
+
| Keys | Action |
|
|
50
|
+
|---|---|
|
|
51
|
+
| Tab | Move through step actions |
|
|
52
|
+
| Enter | Open the step's view or Review |
|
|
53
|
+
| Enter on Stop | Stop the run |
|
|
54
|
+
|
|
55
|
+
## Examples
|
|
56
|
+
|
|
57
|
+
### run
|
|
58
|
+
|
|
59
|
+
```tsx
|
|
60
|
+
import { AgentRun, Button } from "@twoux/ui";
|
|
61
|
+
|
|
62
|
+
export const meta = { title: "One run, step by step", description: "Every step has a state in shape and words. A step that picked rows names its filter; the waiting step is highlighted and holds its action.", order: 1 };
|
|
63
|
+
|
|
64
|
+
export default function Example() {
|
|
65
|
+
return (
|
|
66
|
+
<div className="w-full max-w-xl">
|
|
67
|
+
<AgentRun
|
|
68
|
+
task="Weekly listing check"
|
|
69
|
+
status="Needs you"
|
|
70
|
+
meta="Started by Priya Shah · Monday 09:00 · Every Monday"
|
|
71
|
+
steps={[
|
|
72
|
+
{ title: "Found listings closing within 7 days", detail: "Filter: Closes is in the next 7 days · 3 listings", state: "done", action: <Button variant="ghost" size="xs">Open as view</Button> },
|
|
73
|
+
{ title: "Compared applicants with similar listings", state: "done" },
|
|
74
|
+
{ title: "Proposed extending 2 listings by 30 days", detail: "Waiting for your review", state: "waiting", action: <Button size="xs">Review</Button> },
|
|
75
|
+
{ title: "Post a summary to #hiring", state: "skipped", detail: "Skipped until the review is done" },
|
|
76
|
+
]}
|
|
77
|
+
/>
|
|
78
|
+
</div>
|
|
79
|
+
);
|
|
80
|
+
}
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
## Related
|
|
84
|
+
|
|
85
|
+
- Agent permissions
|
|
86
|
+
- Task builder
|
|
87
|
+
- Step card
|
|
88
|
+
- Inbox (triage)
|
|
89
|
+
- Plan preview
|
|
90
|
+
- Change review
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
# Agents acting on your behalf
|
|
2
|
+
|
|
3
|
+
Agents work within permissions set per action (Off, Ask first, Allow), show every run as a list of steps, stop to wait for you through the Inbox, and can always be stopped.
|
|
4
|
+
|
|
5
|
+
Kind: pattern · Group: Patterns: AI
|
|
6
|
+
|
|
7
|
+
**Problem:** An agent that renames listings or emails candidates on a schedule acts while nobody watches. Without clear permissions, run history and a single place to approve, people either don't trust agents or are surprised by them.
|
|
8
|
+
|
|
9
|
+
**Solution:** Permissions are set up front per action in plain words, with safe defaults. Each run is a timeline of steps with state. A step that needs approval waits, is marked Needs you and appears in the Inbox. Stop is always visible.
|
|
10
|
+
|
|
11
|
+
**Built from:** Agent permissions, Agent run timeline, Inbox (triage), Suggested changes, Connected tools, Clarifying question card
|
|
12
|
+
|
|
13
|
+
## How it works
|
|
14
|
+
|
|
15
|
+
1. Set permissions per action before the first run: Read defaults to Allow, changes to Ask first, anything that reaches people outside the workspace to Off.
|
|
16
|
+
2. The run shows each step with its state in shape and colour: done, running, waiting for you, skipped, failed.
|
|
17
|
+
3. Steps that pick rows show the filter they used and open it as a view.
|
|
18
|
+
4. A step that needs approval holds its action, is highlighted, says which permission caused it ("Edit listings is set to Ask first") and appears in the Inbox as Needs you.
|
|
19
|
+
5. Approve in the Inbox detail without leaving; the run continues. Rejecting is acknowledged in the run ("Skipped").
|
|
20
|
+
6. Stop is always visible. A stopped run keeps what it did and says what it didn't.
|
|
21
|
+
|
|
22
|
+
## When to use
|
|
23
|
+
|
|
24
|
+
- For multi-step work that runs without the person watching: scheduled tasks, long enrichment, follow-ups.
|
|
25
|
+
|
|
26
|
+
## When not to use
|
|
27
|
+
|
|
28
|
+
- For high-risk actions where silence would count as consent. Those stay Off or Ask first, never notice-only.
|
|
29
|
+
|
|
30
|
+
## Guidelines
|
|
31
|
+
|
|
32
|
+
- Permissions are explicit, editable and never buried in setup; changing one is one click from the run that hit it.
|
|
33
|
+
- Each permission says in plain words what it allows: "Sends from your address".
|
|
34
|
+
- Before a scheduled run makes changes, a notice lets people review or cancel.
|
|
35
|
+
- Every run records who started it, when, what it read and changed, in an activity log that can be queried.
|
|
36
|
+
- A request waiting for approval never blocks forever; it expires and reports that nothing ran.
|
|
37
|
+
- Start with low automation; people raise it per action once they trust the results.
|
|
38
|
+
- Agents are never disabled or deleted without someone choosing to.
|
|
39
|
+
- When a run needs approval in a conversation, show an approval card above the composer with what will run, in plain words, and the tool name in code style.
|
|
40
|
+
- For a tool the run will call again, offer "Allow once" and "Allow in this conversation". "Always allow" changes the agent's permission to Allow and is offered only for Read and reversible changes inside the workspace.
|
|
41
|
+
- Before approval, say whether it can be undone and who else will see it: "Can be undone for 7 days. Applicants won't be notified."
|
|
42
|
+
- After a decision the card closes at once and the thread keeps a resolved line: Approved, Rejected, Approved automatically, or Expired with "Nothing was sent."
|
|
43
|
+
- If the person rejects, the assistant acknowledges it and carries on without that step: "Skipped emailing the Leeds team."
|
|
44
|
+
- Irreversible actions use the confirmation dialog; when one record is affected the person types its name, when several the dialog lists them. Never both.
|
|
45
|
+
|
|
46
|
+
## Content
|
|
47
|
+
|
|
48
|
+
- Run titles say the goal: "Rename low-performing listings". Footer: "Started by Rahul S. · 2 min ago · Every Monday".
|
|
49
|
+
- Decisions are logged in past tense: "Approved", "Skipped: email hiring managers. Email is Off in permissions."
|
|
50
|
+
|
|
51
|
+
## Accessibility
|
|
52
|
+
|
|
53
|
+
- Step states use icon shape and a word, not colour alone.
|
|
54
|
+
- The approval card is not a modal: focus moves to its heading, not to Allow, and the thread stays reachable.
|
|
55
|
+
- Resolved states are text, and an expiry is posted as a message in reading order.
|
|
56
|
+
|
|
57
|
+
## Do
|
|
58
|
+
|
|
59
|
+
- Do default anything that reaches people outside the workspace to Off.
|
|
60
|
+
- Do show which permission made a step wait or skip, with a Change link.
|
|
61
|
+
|
|
62
|
+
## Don't
|
|
63
|
+
|
|
64
|
+
- Don't hide permissions in settings only.
|
|
65
|
+
- Don't treat silence as consent for risky actions.
|
|
66
|
+
|
|
67
|
+
## Related
|
|
68
|
+
|
|
69
|
+
- Propose, then apply
|
|
70
|
+
- Notifications: inbox, bell, toast or email digest
|
|
71
|
+
- Saved tasks and schedules
|
|
72
|
+
- Showing reasoning and progress
|
|
73
|
+
- Agent permissions
|
|
74
|
+
- Agent run timeline
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
# AI column
|
|
2
|
+
|
|
3
|
+
A generated table column that fills one row at a time, cites each row, shows when it was written and never overwrites real data.
|
|
4
|
+
|
|
5
|
+
Kind: component · Group: AI and agents · Status: built, import from @twoux/ui
|
|
6
|
+
|
|
7
|
+
## When to use
|
|
8
|
+
|
|
9
|
+
- Adding a judgement or summary per row, such as "Likely reason" for a low apply rate.
|
|
10
|
+
- When people need to compare many rows on the same question.
|
|
11
|
+
|
|
12
|
+
## When not to use
|
|
13
|
+
|
|
14
|
+
- Changing real fields such as title or closing date. Use Suggested changes (suggested-changes).
|
|
15
|
+
- One-off questions. Use the Assistant side panel (assistant-panel).
|
|
16
|
+
- Decisions about candidates that would filter or rank them for hiring. These are high-risk; keep them as human decisions with the assistant as a reference only.
|
|
17
|
+
|
|
18
|
+
## Structure
|
|
19
|
+
|
|
20
|
+
1. Header (assistant mark, name, "2 min ago", Refresh)
|
|
21
|
+
2. Cells (value and citation, writing state, failed state with Try again)
|
|
22
|
+
3. Add a column menu (suggested columns, Describe your own…)
|
|
23
|
+
|
|
24
|
+
## Guidelines
|
|
25
|
+
|
|
26
|
+
- Mark the header once and show when the column was written.
|
|
27
|
+
- Never overwrite real data; the column is separate and can be removed.
|
|
28
|
+
- Cells fill one by one with a visible state and a Stop. A failed cell says why ("The listing has no description") and offers Try again.
|
|
29
|
+
- Each cell cites its record.
|
|
30
|
+
- When source data changes, mark the column out of date instead of silently rewriting.
|
|
31
|
+
- Show the cost per row before running on the whole table, and test on a few rows first.
|
|
32
|
+
|
|
33
|
+
## Content
|
|
34
|
+
|
|
35
|
+
- Name columns by the question they answer ("Likely reason", "Risk of closing empty").
|
|
36
|
+
- Cell text is short and leads with the judgement: "Many views, few applies."
|
|
37
|
+
- Failed cells explain in plain words and say what to do.
|
|
38
|
+
|
|
39
|
+
## Accessibility
|
|
40
|
+
|
|
41
|
+
- Follow the grid pattern: arrow keys move between cells, Enter or F2 to act, Esc to return (APG grid).
|
|
42
|
+
- Header is a columnheader; the Refresh button has a name ("Refresh column") (SC 4.1.2).
|
|
43
|
+
- Announce progress and completion ("12 of 24 written") as a status message (SC 4.1.3); filling cells is auto-updating content that needs Stop (SC 2.2.2).
|
|
44
|
+
- Writing, failed and out-of-date states use text, not colour alone (SC 1.4.1).
|
|
45
|
+
|
|
46
|
+
## Keyboard
|
|
47
|
+
|
|
48
|
+
| Keys | Action |
|
|
49
|
+
|---|---|
|
|
50
|
+
| Arrow keys | Move between cells |
|
|
51
|
+
| Enter / F2 | Act on the cell, for example Try again |
|
|
52
|
+
| Esc | Return to grid navigation |
|
|
53
|
+
|
|
54
|
+
## Examples
|
|
55
|
+
|
|
56
|
+
### summaries
|
|
57
|
+
|
|
58
|
+
```tsx
|
|
59
|
+
import { AiCell, type AiCellState, AiColumnHeader, Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from "@twoux/ui";
|
|
60
|
+
import { useEffect, useState } from "react";
|
|
61
|
+
|
|
62
|
+
export const meta = { title: "A generated column", description: "Marked once in the header with when it was written. Cells fill one at a time, each cites its record, and a failed cell says why with Try again. Real data is never overwritten.", order: 1 };
|
|
63
|
+
|
|
64
|
+
const ROWS = [["LST-1040", "Junior Product Designer", "Portfolio, Figma, hybrid in Leeds"], ["LST-1041", "Frontend Engineer", "React and TypeScript, 3+ years"], ["LST-1043", "Recruitment Coordinator", ""], ["LST-1045", "QA Engineer", "Playwright, CI, test plans"]];
|
|
65
|
+
|
|
66
|
+
export default function Example() {
|
|
67
|
+
const [n, setN] = useState(0);
|
|
68
|
+
useEffect(() => { if (n < ROWS.length) { const t = setTimeout(() => setN((x) => x + 1), 600); return () => clearTimeout(t); } }, [n]);
|
|
69
|
+
const cell = (i: number): AiCellState => (i > n ? { state: "queued" } : i === n ? { state: "writing" } : ROWS[i][2] ? { state: "done", value: ROWS[i][2], source: ROWS[i][0] } : { state: "failed", reason: "The listing has no description" });
|
|
70
|
+
return (
|
|
71
|
+
<div className="w-full overflow-hidden rounded-sm border border-line">
|
|
72
|
+
<Table aria-label="Listings with requirements summary">
|
|
73
|
+
<TableHeader><TableRow><TableHead>Listing</TableHead><TableHead className="bg-primary-soft/40"><AiColumnHeader name="Key requirements" written={n >= ROWS.length ? "just now" : "writing"} onRefresh={() => setN(0)} /></TableHead></TableRow></TableHeader>
|
|
74
|
+
<TableBody>{ROWS.map((r, i) => <TableRow key={r[0]}><TableCell className="font-medium text-ink">{r[1]}</TableCell><TableCell className="max-w-72 bg-primary-soft/20"><AiCell cell={cell(i)} onRetry={() => setN(i)} /></TableCell></TableRow>)}</TableBody>
|
|
75
|
+
</Table>
|
|
76
|
+
</div>
|
|
77
|
+
);
|
|
78
|
+
}
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
## Related
|
|
82
|
+
|
|
83
|
+
- Prompt editor with fields
|
|
84
|
+
- Citations and sources
|
|
85
|
+
- AI origin label
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
# AI origin label
|
|
2
|
+
|
|
3
|
+
One small mark and short text on generated content, such as "Assistant · from your workspace data". No sparkle on every button and no separate AI colour.
|
|
4
|
+
|
|
5
|
+
Kind: component · Group: AI and agents · Status: built, import from @twoux/ui
|
|
6
|
+
|
|
7
|
+
## When to use
|
|
8
|
+
|
|
9
|
+
- Under every assistant answer, with the feedback actions.
|
|
10
|
+
- On a generated column header, once for the group, not on every cell.
|
|
11
|
+
- Where generated and human content sit together, so people can tell them apart.
|
|
12
|
+
|
|
13
|
+
## When not to use
|
|
14
|
+
|
|
15
|
+
- On buttons that start an action. Name the action instead ("Draft titles"), and keep the mark for content.
|
|
16
|
+
- As decoration or branding across the product.
|
|
17
|
+
- To say where a value came from. Use Citations and sources (citations-sources).
|
|
18
|
+
|
|
19
|
+
## Structure
|
|
20
|
+
|
|
21
|
+
1. Assistant mark (icon)
|
|
22
|
+
2. Text (who and from what)
|
|
23
|
+
3. Optional time ("2 min ago")
|
|
24
|
+
|
|
25
|
+
## Guidelines
|
|
26
|
+
|
|
27
|
+
- Label the origin, not the feature. Say what produced it and from what.
|
|
28
|
+
- One mark per group of generated content: a column header, an answer.
|
|
29
|
+
- No separate AI colour. TwoUX uses its neutral palette plus a faint tint on generated columns, always with the mark and text.
|
|
30
|
+
- Do not use the sparkle as the universal AI sign; it loses meaning when it is everywhere.
|
|
31
|
+
- Generated output must also be machine-detectable as generated, for example a data attribute or metadata on the record.
|
|
32
|
+
|
|
33
|
+
## Content
|
|
34
|
+
|
|
35
|
+
- "Assistant · from your workspace data". Never "AI-powered", "smart" or "magic".
|
|
36
|
+
- When a person edits generated text, the label goes; the history keeps the original.
|
|
37
|
+
|
|
38
|
+
## Accessibility
|
|
39
|
+
|
|
40
|
+
- The mark is decorative (aria-hidden) and the text carries the meaning (SC 1.3.1, 1.4.1).
|
|
41
|
+
- The tint on generated columns must keep text contrast; the column header text identifies it (SC 1.4.11 for the mark).
|
|
42
|
+
- Use the same wording everywhere (SC 3.2.4).
|
|
43
|
+
|
|
44
|
+
## Examples
|
|
45
|
+
|
|
46
|
+
### labels
|
|
47
|
+
|
|
48
|
+
```tsx
|
|
49
|
+
import { AiOrigin } from "@twoux/ui";
|
|
50
|
+
|
|
51
|
+
export const meta = { title: "Say what made it, from what", description: "One small mark and plain words, once per group of generated content. No separate AI colour, no gradients.", order: 1 };
|
|
52
|
+
|
|
53
|
+
export default function Example() {
|
|
54
|
+
return (
|
|
55
|
+
<div className="grid gap-3">
|
|
56
|
+
<AiOrigin from="your workspace data" time="2 min ago" />
|
|
57
|
+
<AiOrigin from="24 listings and the 2026 salary bands" />
|
|
58
|
+
<div className="rounded-sm border border-line bg-surface p-3"><AiOrigin from="the job description" /><p className="mt-1.5 text-base text-ink">Junior designer with a portfolio of 2 or 3 product case studies; Figma required; hybrid in Leeds.</p></div>
|
|
59
|
+
</div>
|
|
60
|
+
);
|
|
61
|
+
}
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
## Related
|
|
65
|
+
|
|
66
|
+
- Assistant side panel
|
|
67
|
+
- AI column
|
|
68
|
+
- Citations and sources
|
|
69
|
+
- Confidence note
|
|
70
|
+
- Why this choice
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
# Announcing new and beta features
|
|
2
|
+
|
|
3
|
+
Mark new or beta things where people meet them, with a small text label that opens a short explanation. Keep a What's new list for the rest. Never use toasts or banners for announcements.
|
|
4
|
+
|
|
5
|
+
Kind: pattern · Group: Patterns: general
|
|
6
|
+
|
|
7
|
+
**Problem:** Launch messages compete with the messages people need to act on. Banners about a new report push down the list, popovers open on page load, and New labels stay for months until nobody notices them.
|
|
8
|
+
|
|
9
|
+
**Solution:** A New or Beta text label sits next to the new thing for 30 days. Pressing it opens a popover of one or two sentences and Learn more. A What's new list in the Help menu keeps the last 90 days. Beta pages also carry "Beta" after the page title and a feedback link. Status messages always come first.
|
|
10
|
+
|
|
11
|
+
**Built from:** App shell and sidebar navigation, Page header, Popover rules, Banner (inline alert), Tabs (underline), List table
|
|
12
|
+
|
|
13
|
+
## How it works
|
|
14
|
+
|
|
15
|
+
1. Decide the size of the change. A new page or area: label in the sidebar. A new tab, column, field or option: label next to its name. A small fix: no label, What's new only.
|
|
16
|
+
2. Add a text label "New" (or "Beta") after the name. It is a button that opens a popover: a heading, one or two sentences on what it does for the team, and Learn more.
|
|
17
|
+
3. Remove New labels after 30 days. Beta labels stay until the feature is generally available.
|
|
18
|
+
4. Add the item to What's new in the Help menu, which shows an unread dot until opened.
|
|
19
|
+
5. For a beta page, add "Beta" after the page title too, since people arrive by links, with a line on what may change and a Send feedback link.
|
|
20
|
+
|
|
21
|
+
## When to use
|
|
22
|
+
|
|
23
|
+
- New: a whole new page, tab, column, field or option that changes what people can do.
|
|
24
|
+
- Beta: a feature that may change, may be removed, or is not yet suitable for decisions that matter, such as an early AI shortlist summary.
|
|
25
|
+
- A banner on Home only when the whole product or workspace is in beta. It cannot be dismissed on Home and can be elsewhere.
|
|
26
|
+
|
|
27
|
+
## When not to use
|
|
28
|
+
|
|
29
|
+
- Not for bug fixes, speed improvements or small layout changes.
|
|
30
|
+
- Never as a toast, an auto-opening popover or a page banner for a single feature. Those slots are for status.
|
|
31
|
+
- Don't mark something both New and Beta. Beta wins.
|
|
32
|
+
|
|
33
|
+
## Guidelines
|
|
34
|
+
|
|
35
|
+
- Status messages always win. If a page has an error or a warning, no announcement appears beside it.
|
|
36
|
+
- The label is plain text in the accent colour at the caption size, not a status badge or a tag, so it is never mistaken for a record's state or a category.
|
|
37
|
+
- Label each new page, never a group heading, so the label never competes with the group's own toggle.
|
|
38
|
+
- Explanations lead with what the person can now do: "Compare time to hire across teams." Not the feature's name or the release.
|
|
39
|
+
- Beta explanations say what that means for the work: "Results may change. Check them before you use them in a hiring decision."
|
|
40
|
+
- Plan the end: a beta popover says when general availability is expected, if known.
|
|
41
|
+
|
|
42
|
+
## Content
|
|
43
|
+
|
|
44
|
+
- Labels are one word: "New" or "Beta". TwoUX has no "Preview" state.
|
|
45
|
+
- Popover heading names the capability: "Interview load by person". Not "Introducing...".
|
|
46
|
+
- Beta page title: "Pipeline forecast" followed by the Beta label, not "Pipeline forecast (Beta version)".
|
|
47
|
+
|
|
48
|
+
## Accessibility
|
|
49
|
+
|
|
50
|
+
- The label is a button with an accessible name such as "New: Interview load, more information", and opens its popover on Enter or Space.
|
|
51
|
+
- The popover closes on Esc and returns focus to the label; it never opens on hover or page load.
|
|
52
|
+
- The label is text, readable at the caption size against the sidebar background.
|
|
53
|
+
|
|
54
|
+
## Do
|
|
55
|
+
|
|
56
|
+
- Do announce in the place where the feature is used.
|
|
57
|
+
- Do keep each explanation to two sentences and a link.
|
|
58
|
+
- Do give every beta a way to send feedback.
|
|
59
|
+
|
|
60
|
+
## Don't
|
|
61
|
+
|
|
62
|
+
- Don't open an announcement on page load.
|
|
63
|
+
- Don't leave New labels beyond 30 days.
|
|
64
|
+
- Don't rely on email or release notes alone to tell people a feature is in beta.
|
|
65
|
+
|
|
66
|
+
## Related
|
|
67
|
+
|
|
68
|
+
- Onboarding to an empty workspace
|
|
69
|
+
- Navigation: what goes in the sidebar and the top bar
|
|
70
|
+
- Notifications: inbox, bell, toast or email digest
|
|
71
|
+
- Labelling AI output
|
|
72
|
+
- Banner (inline alert)
|
|
73
|
+
- Popover rules
|