@twoux/ui 0.0.0-stage → 0.1.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.
Files changed (325) hide show
  1. package/LICENSE.md +61 -0
  2. package/LICENSES/Apache-2.0.txt +202 -0
  3. package/NOTICE.md +64 -0
  4. package/README.md +211 -2
  5. package/SHADCN-DIFF.md +228 -0
  6. package/agent/AGENTS.md +358 -0
  7. package/agent/docs-md/accessibility.md +49 -0
  8. package/agent/docs-md/action-catalogue.md +81 -0
  9. package/agent/docs-md/actions.md +74 -0
  10. package/agent/docs-md/agent-activity-log.md +70 -0
  11. package/agent/docs-md/agent-permissions.md +82 -0
  12. package/agent/docs-md/agent-run.md +90 -0
  13. package/agent/docs-md/agents-on-behalf.md +74 -0
  14. package/agent/docs-md/ai-column.md +85 -0
  15. package/agent/docs-md/ai-origin-label.md +70 -0
  16. package/agent/docs-md/announcing-features.md +73 -0
  17. package/agent/docs-md/answer-actions.md +81 -0
  18. package/agent/docs-md/app-shell.md +114 -0
  19. package/agent/docs-md/artifact-card.md +89 -0
  20. package/agent/docs-md/ask-on-screen.md +72 -0
  21. package/agent/docs-md/assistant-page.md +100 -0
  22. package/agent/docs-md/assistant-panel.md +142 -0
  23. package/agent/docs-md/avatar.md +82 -0
  24. package/agent/docs-md/banner.md +106 -0
  25. package/agent/docs-md/board.md +163 -0
  26. package/agent/docs-md/breadcrumb.md +89 -0
  27. package/agent/docs-md/breakdown-table.md +97 -0
  28. package/agent/docs-md/bulk-action-bar.md +112 -0
  29. package/agent/docs-md/button.md +293 -0
  30. package/agent/docs-md/card.md +115 -0
  31. package/agent/docs-md/change-list.md +99 -0
  32. package/agent/docs-md/change-request.md +166 -0
  33. package/agent/docs-md/chart-area.md +87 -0
  34. package/agent/docs-md/chart-bar.md +100 -0
  35. package/agent/docs-md/chart-box-plot.md +88 -0
  36. package/agent/docs-md/chart-bullet.md +89 -0
  37. package/agent/docs-md/chart-candlestick.md +112 -0
  38. package/agent/docs-md/chart-card-line.md +120 -0
  39. package/agent/docs-md/chart-donut.md +90 -0
  40. package/agent/docs-md/chart-drill-down.md +72 -0
  41. package/agent/docs-md/chart-funnel.md +71 -0
  42. package/agent/docs-md/chart-heatmap.md +76 -0
  43. package/agent/docs-md/chart-histogram.md +81 -0
  44. package/agent/docs-md/chart-map.md +165 -0
  45. package/agent/docs-md/chart-mixed.md +88 -0
  46. package/agent/docs-md/chart-price.md +92 -0
  47. package/agent/docs-md/chart-radial-bars.md +109 -0
  48. package/agent/docs-md/chart-radial-lines.md +111 -0
  49. package/agent/docs-md/chart-sankey.md +104 -0
  50. package/agent/docs-md/chart-scatter.md +87 -0
  51. package/agent/docs-md/chart-share-bar.md +89 -0
  52. package/agent/docs-md/chart-treemap.md +98 -0
  53. package/agent/docs-md/chart-waterfall.md +93 -0
  54. package/agent/docs-md/checkbox.md +131 -0
  55. package/agent/docs-md/choosing-selection-control.md +71 -0
  56. package/agent/docs-md/citations-sources.md +79 -0
  57. package/agent/docs-md/citing-sources.md +63 -0
  58. package/agent/docs-md/clarify-before-acting.md +69 -0
  59. package/agent/docs-md/clarifying-question.md +92 -0
  60. package/agent/docs-md/code-block.md +174 -0
  61. package/agent/docs-md/colours.md +87 -0
  62. package/agent/docs-md/columns-menu.md +140 -0
  63. package/agent/docs-md/combobox.md +161 -0
  64. package/agent/docs-md/command-palette.md +126 -0
  65. package/agent/docs-md/confidence-note.md +87 -0
  66. package/agent/docs-md/configurable-dashboard.md +76 -0
  67. package/agent/docs-md/confirmation-dialog.md +93 -0
  68. package/agent/docs-md/connected-tools.md +80 -0
  69. package/agent/docs-md/connector-picker.md +127 -0
  70. package/agent/docs-md/consistency.md +53 -0
  71. package/agent/docs-md/content-density.md +61 -0
  72. package/agent/docs-md/conversation-history.md +78 -0
  73. package/agent/docs-md/create-record.md +80 -0
  74. package/agent/docs-md/csv-import.md +88 -0
  75. package/agent/docs-md/dashboard-items.md +78 -0
  76. package/agent/docs-md/data-export.md +61 -0
  77. package/agent/docs-md/data-grid.md +137 -0
  78. package/agent/docs-md/data-vis-colours.md +76 -0
  79. package/agent/docs-md/data-visualisation.md +76 -0
  80. package/agent/docs-md/date-picker.md +178 -0
  81. package/agent/docs-md/delete-record.md +75 -0
  82. package/agent/docs-md/dense-table.md +495 -0
  83. package/agent/docs-md/design-tokens.md +53 -0
  84. package/agent/docs-md/disabled-read-only.md +75 -0
  85. package/agent/docs-md/drag-and-drop.md +74 -0
  86. package/agent/docs-md/dropdown-menu.md +137 -0
  87. package/agent/docs-md/edit-record.md +73 -0
  88. package/agent/docs-md/empty-loading-error.md +78 -0
  89. package/agent/docs-md/empty-state.md +128 -0
  90. package/agent/docs-md/error-messages.md +75 -0
  91. package/agent/docs-md/error-state.md +123 -0
  92. package/agent/docs-md/export-menu.md +86 -0
  93. package/agent/docs-md/feedback-prompt.md +88 -0
  94. package/agent/docs-md/field-mapping.md +78 -0
  95. package/agent/docs-md/file-drop.md +110 -0
  96. package/agent/docs-md/filter-bar.md +138 -0
  97. package/agent/docs-md/filter-panel.md +103 -0
  98. package/agent/docs-md/filtering-search.md +79 -0
  99. package/agent/docs-md/follow-ups-starters.md +79 -0
  100. package/agent/docs-md/form-validation.md +95 -0
  101. package/agent/docs-md/generated-columns.md +65 -0
  102. package/agent/docs-md/generated-drafts-files.md +71 -0
  103. package/agent/docs-md/grouped-list.md +89 -0
  104. package/agent/docs-md/guide-cue.md +170 -0
  105. package/agent/docs-md/help-panel.md +103 -0
  106. package/agent/docs-md/help-system.md +74 -0
  107. package/agent/docs-md/iconography.md +49 -0
  108. package/agent/docs-md/inbox.md +108 -0
  109. package/agent/docs-md/inline-editing-validation.md +80 -0
  110. package/agent/docs-md/inline-input-in-answer.md +70 -0
  111. package/agent/docs-md/items-palette.md +116 -0
  112. package/agent/docs-md/keyboard-model.md +47 -0
  113. package/agent/docs-md/keyboard-navigation.md +68 -0
  114. package/agent/docs-md/keyboard-shortcut-hint.md +87 -0
  115. package/agent/docs-md/keyboard-shortcut-sheet.md +90 -0
  116. package/agent/docs-md/labelling-ai-output.md +66 -0
  117. package/agent/docs-md/layout.md +47 -0
  118. package/agent/docs-md/list-table.md +254 -0
  119. package/agent/docs-md/loading-skeleton.md +91 -0
  120. package/agent/docs-md/managing-agents.md +71 -0
  121. package/agent/docs-md/message-composer.md +105 -0
  122. package/agent/docs-md/migrating.md +49 -0
  123. package/agent/docs-md/motion.md +93 -0
  124. package/agent/docs-md/navigation.md +76 -0
  125. package/agent/docs-md/notification-channels.md +65 -0
  126. package/agent/docs-md/notifications-decision.md +100 -0
  127. package/agent/docs-md/onboarding-step.md +114 -0
  128. package/agent/docs-md/order-book.md +108 -0
  129. package/agent/docs-md/page-header.md +96 -0
  130. package/agent/docs-md/pagination.md +88 -0
  131. package/agent/docs-md/pane-layout.md +105 -0
  132. package/agent/docs-md/period-comparison.md +66 -0
  133. package/agent/docs-md/plan-card.md +120 -0
  134. package/agent/docs-md/popover-rules.md +88 -0
  135. package/agent/docs-md/prompt-editor.md +90 -0
  136. package/agent/docs-md/propose-apply.md +65 -0
  137. package/agent/docs-md/provider-logo.md +97 -0
  138. package/agent/docs-md/radio.md +83 -0
  139. package/agent/docs-md/ranked-list.md +102 -0
  140. package/agent/docs-md/reasoning-progress.md +72 -0
  141. package/agent/docs-md/record-detail.md +71 -0
  142. package/agent/docs-md/regenerating-answers.md +70 -0
  143. package/agent/docs-md/run-status-bar.md +94 -0
  144. package/agent/docs-md/saved-tasks-schedules.md +63 -0
  145. package/agent/docs-md/saved-views.md +149 -0
  146. package/agent/docs-md/saving-views.md +68 -0
  147. package/agent/docs-md/scheduler.md +258 -0
  148. package/agent/docs-md/secondary-panels.md +72 -0
  149. package/agent/docs-md/segmented-control.md +88 -0
  150. package/agent/docs-md/selection-bulk-actions.md +70 -0
  151. package/agent/docs-md/separator.md +75 -0
  152. package/agent/docs-md/setup-checklist.md +92 -0
  153. package/agent/docs-md/shape-elevation.md +55 -0
  154. package/agent/docs-md/sheet-grid.md +211 -0
  155. package/agent/docs-md/side-panel.md +134 -0
  156. package/agent/docs-md/sign-in.md +114 -0
  157. package/agent/docs-md/spacing.md +55 -0
  158. package/agent/docs-md/split-button.md +100 -0
  159. package/agent/docs-md/stat-compare.md +82 -0
  160. package/agent/docs-md/static-dashboard.md +75 -0
  161. package/agent/docs-md/status-badge.md +140 -0
  162. package/agent/docs-md/step-card.md +75 -0
  163. package/agent/docs-md/stepper.md +92 -0
  164. package/agent/docs-md/suggested-changes.md +91 -0
  165. package/agent/docs-md/switch.md +78 -0
  166. package/agent/docs-md/table-settings.md +81 -0
  167. package/agent/docs-md/tabs.md +85 -0
  168. package/agent/docs-md/tag-input.md +108 -0
  169. package/agent/docs-md/tag.md +79 -0
  170. package/agent/docs-md/task-builder.md +87 -0
  171. package/agent/docs-md/team-instructions.md +72 -0
  172. package/agent/docs-md/templates-gallery.md +85 -0
  173. package/agent/docs-md/text-input.md +160 -0
  174. package/agent/docs-md/thinking-steps.md +89 -0
  175. package/agent/docs-md/timeline.md +189 -0
  176. package/agent/docs-md/timestamp.md +84 -0
  177. package/agent/docs-md/timestamps.md +70 -0
  178. package/agent/docs-md/toast.md +117 -0
  179. package/agent/docs-md/tooltip.md +90 -0
  180. package/agent/docs-md/typography.md +62 -0
  181. package/agent/docs-md/undo-destructive.md +66 -0
  182. package/agent/docs-md/unsaved-changes.md +71 -0
  183. package/agent/docs-md/usage-meter.md +80 -0
  184. package/agent/docs-md/user-feedback.md +71 -0
  185. package/agent/docs-md/voice-and-tone.md +60 -0
  186. package/agent/docs-md/why-choice.md +93 -0
  187. package/agent/docs-md/workspace-onboarding.md +74 -0
  188. package/agent/docs-md/writing.md +48 -0
  189. package/agent/llms-full.txt +18369 -0
  190. package/agent/llms.txt +198 -0
  191. package/agent/skills/twoux-audit/SKILL.md +49 -0
  192. package/agent/skills/twoux-build/SKILL.md +39 -0
  193. package/agent/skills/twoux-design/SKILL.md +54 -0
  194. package/agent/skills/twoux-write/SKILL.md +32 -0
  195. package/bin/check.mjs +123 -0
  196. package/bin/docs.mjs +24 -0
  197. package/bin/guard.mjs +27 -0
  198. package/bin/init.mjs +113 -0
  199. package/bin/knowledge.mjs +87 -0
  200. package/bin/mcp.mjs +116 -0
  201. package/bin/theme.mjs +168 -0
  202. package/bin/twoux.mjs +25 -0
  203. package/package.json +80 -3
  204. package/registry/jobs.json +1028 -0
  205. package/registry/palette.json +770 -0
  206. package/registry/rules.json +913 -0
  207. package/src/components/agent-review.tsx +364 -0
  208. package/src/components/ai-basics.tsx +212 -0
  209. package/src/components/ai-work.tsx +304 -0
  210. package/src/components/ai.tsx +227 -0
  211. package/src/components/alert-dialog.tsx +203 -0
  212. package/src/components/alert.tsx +86 -0
  213. package/src/components/avatar.tsx +114 -0
  214. package/src/components/badge.tsx +59 -0
  215. package/src/components/board.tsx +397 -0
  216. package/src/components/breadcrumb.tsx +114 -0
  217. package/src/components/button-group.tsx +90 -0
  218. package/src/components/button.tsx +109 -0
  219. package/src/components/calendar.tsx +247 -0
  220. package/src/components/card.tsx +102 -0
  221. package/src/components/chart-map.tsx +336 -0
  222. package/src/components/charts-more.tsx +1331 -0
  223. package/src/components/charts-radial.tsx +328 -0
  224. package/src/components/charts.tsx +390 -0
  225. package/src/components/checkbox.tsx +40 -0
  226. package/src/components/code.tsx +139 -0
  227. package/src/components/collapsible.tsx +37 -0
  228. package/src/components/combobox.tsx +339 -0
  229. package/src/components/command-extras.tsx +11 -0
  230. package/src/components/command.tsx +196 -0
  231. package/src/components/data-grid.tsx +213 -0
  232. package/src/components/data-table.tsx +334 -0
  233. package/src/components/data-views.tsx +740 -0
  234. package/src/components/date-picker.tsx +686 -0
  235. package/src/components/dense-table.tsx +207 -0
  236. package/src/components/dialog.tsx +162 -0
  237. package/src/components/dropdown-menu.tsx +264 -0
  238. package/src/components/empty.tsx +114 -0
  239. package/src/components/feedback-prompt.tsx +80 -0
  240. package/src/components/field.tsx +254 -0
  241. package/src/components/fields.tsx +112 -0
  242. package/src/components/flow.tsx +840 -0
  243. package/src/components/guide-cue.tsx +273 -0
  244. package/src/components/inbox.tsx +113 -0
  245. package/src/components/input-group.tsx +176 -0
  246. package/src/components/input.tsx +26 -0
  247. package/src/components/kbd.tsx +34 -0
  248. package/src/components/label.tsx +27 -0
  249. package/src/components/labels.tsx +176 -0
  250. package/src/components/motion.tsx +136 -0
  251. package/src/components/onboarding.tsx +454 -0
  252. package/src/components/order-book.tsx +185 -0
  253. package/src/components/pane-layout.tsx +417 -0
  254. package/src/components/popover.tsx +96 -0
  255. package/src/components/provider-logos.data.ts +49 -0
  256. package/src/components/radio-group.tsx +52 -0
  257. package/src/components/scheduler.tsx +997 -0
  258. package/src/components/segmented-control.tsx +28 -0
  259. package/src/components/select.tsx +195 -0
  260. package/src/components/separator.tsx +31 -0
  261. package/src/components/sheet.tsx +148 -0
  262. package/src/components/shell.tsx +426 -0
  263. package/src/components/shortcut-sheet.tsx +83 -0
  264. package/src/components/skeleton.tsx +18 -0
  265. package/src/components/sonner.tsx +107 -0
  266. package/src/components/spinner.tsx +13 -0
  267. package/src/components/split-button.tsx +58 -0
  268. package/src/components/stepper.tsx +78 -0
  269. package/src/components/switch.tsx +43 -0
  270. package/src/components/table.tsx +126 -0
  271. package/src/components/tabs.tsx +118 -0
  272. package/src/components/tag-input.tsx +253 -0
  273. package/src/components/textarea.tsx +21 -0
  274. package/src/components/theme.tsx +80 -0
  275. package/src/components/timeline.tsx +408 -0
  276. package/src/components/toggle-group.tsx +87 -0
  277. package/src/components/toggle.tsx +54 -0
  278. package/src/components/tooltip.tsx +65 -0
  279. package/src/components/workspace-actions.tsx +294 -0
  280. package/src/components/workspace-import.tsx +465 -0
  281. package/src/components/workspace.tsx +1884 -0
  282. package/src/index.ts +80 -0
  283. package/src/lib/active-indicator.tsx +53 -0
  284. package/src/lib/chart-kit.tsx +72 -0
  285. package/src/lib/cn.ts +6 -0
  286. package/src/lib/shortcuts.tsx +61 -0
  287. package/src/lib/workspace.tsx +10 -0
  288. package/src/shadcn/alert-dialog.tsx +196 -0
  289. package/src/shadcn/alert.tsx +65 -0
  290. package/src/shadcn/avatar.tsx +108 -0
  291. package/src/shadcn/badge.tsx +47 -0
  292. package/src/shadcn/breadcrumb.tsx +108 -0
  293. package/src/shadcn/button-group.tsx +83 -0
  294. package/src/shadcn/button.tsx +63 -0
  295. package/src/shadcn/calendar.tsx +220 -0
  296. package/src/shadcn/card.tsx +91 -0
  297. package/src/shadcn/checkbox.tsx +31 -0
  298. package/src/shadcn/collapsible.tsx +33 -0
  299. package/src/shadcn/command.tsx +184 -0
  300. package/src/shadcn/dialog.tsx +158 -0
  301. package/src/shadcn/dropdown-menu.tsx +256 -0
  302. package/src/shadcn/empty.tsx +103 -0
  303. package/src/shadcn/field.tsx +248 -0
  304. package/src/shadcn/input-group.tsx +170 -0
  305. package/src/shadcn/input.tsx +20 -0
  306. package/src/shadcn/kbd.tsx +28 -0
  307. package/src/shadcn/label.tsx +23 -0
  308. package/src/shadcn/popover.tsx +88 -0
  309. package/src/shadcn/radio-group.tsx +44 -0
  310. package/src/shadcn/select.tsx +189 -0
  311. package/src/shadcn/separator.tsx +27 -0
  312. package/src/shadcn/sheet.tsx +142 -0
  313. package/src/shadcn/skeleton.tsx +13 -0
  314. package/src/shadcn/sonner.tsx +40 -0
  315. package/src/shadcn/switch.tsx +34 -0
  316. package/src/shadcn/table.tsx +115 -0
  317. package/src/shadcn/tabs.tsx +90 -0
  318. package/src/shadcn/textarea.tsx +17 -0
  319. package/src/shadcn/toggle-group.tsx +83 -0
  320. package/src/shadcn/toggle.tsx +46 -0
  321. package/src/shadcn/tooltip.tsx +56 -0
  322. package/src/styles/palette.css +127 -0
  323. package/src/styles/theme.css +35 -0
  324. package/src/styles/twoux.css +236 -0
  325. package/theme.json +14 -0
@@ -0,0 +1,97 @@
1
+ # Provider logo
2
+
3
+ The official mark of a service people sign in with or connect, shown unaltered on a white tile beside the service's name.
4
+
5
+ Kind: component · Group: Content · Status: built, import from @twoux/ui
6
+
7
+ ## When to use
8
+
9
+ - Identifying a service someone signs in with, such as Google or Microsoft.
10
+ - Identifying a service someone connects, such as Slack or Google Drive, in a list or a connection dialog.
11
+
12
+ ## When not to use
13
+
14
+ - Marking a competitor or a product we studied as a reference. Those get a text name only.
15
+ - Decoration, avatars or a stand-in for our own brand. Use Avatar (avatar) for people and the product mark for us.
16
+ - Logos of services that are not connectable. A mark implies the connection exists.
17
+
18
+ ## Structure
19
+
20
+ 1. Tile (white in both themes, hairline border)
21
+ 2. Official mark (unaltered)
22
+ 3. Name or label beside it
23
+
24
+ ## Guidelines
25
+
26
+ - Use the official mark only for third-party services people sign in with or connect. Never for competitors or reference products.
27
+ - Show the mark unaltered: no recolouring, no cropping, no effects, no new background shapes.
28
+ - Put the mark beside the service's name. When it stands alone, give it a label so the service is still named.
29
+ - Keep the tile white in light and dark themes so dark marks, such as GitHub and Notion, stay visible.
30
+ - To add a provider, add a line to the list in scripts/provider-logos.mjs and run node scripts/provider-logos.mjs. Check the brand's own page for permitted use first.
31
+ - The icon sources are licensed for reuse: Iconify's logos set is CC0, vscode-icons and thesvg-color are MIT. Trademarks stay with their owners, so show a mark only to identify that service.
32
+
33
+ ## Content
34
+
35
+ - "Continue with Google" and "Connect Slack": the name is always in words, never only in the mark.
36
+ - When alone, label it with the service name only, for example "Google Drive".
37
+
38
+ ## Accessibility
39
+
40
+ - Beside a visible name the mark is decorative and hidden from assistive technology. Alone, it has role="img" and an aria-label with the service name (SC 1.1.1).
41
+ - The tile keeps the mark's edges distinct from either theme (SC 1.4.11).
42
+
43
+ ## Keyboard
44
+
45
+ | Keys | Action |
46
+ |---|---|
47
+ | None | Not focusable. The button or row that contains it is the focus stop. |
48
+
49
+ ## Examples
50
+
51
+ ### alone-and-sizes
52
+
53
+ ```tsx
54
+ import { ProviderLogo } from "@twoux/ui";
55
+
56
+ export const meta = { title: "Alone, with a label", description: "When the mark has no name beside it, give it a label. Three sizes; the mark inside is never changed.", order: 2 };
57
+
58
+ export default function Example() {
59
+ return (
60
+ <div className="flex items-center gap-4">
61
+ <ProviderLogo provider="slack" size="sm" label="Slack" />
62
+ <ProviderLogo provider="slack" size="md" label="Slack" />
63
+ <ProviderLogo provider="slack" size="lg" label="Slack" />
64
+ </div>
65
+ );
66
+ }
67
+ ```
68
+
69
+ ### beside-name
70
+
71
+ ```tsx
72
+ import { PROVIDERS, ProviderLogo, type ProviderId } from "@twoux/ui";
73
+
74
+ export const meta = { title: "Beside the name", description: "The mark identifies the service and the name says it. On a white tile in both themes, so dark marks stay visible.", order: 1 };
75
+
76
+ const SHOWN: ProviderId[] = ["google", "microsoft", "github", "slack", "notion", "google-drive"];
77
+
78
+ export default function Example() {
79
+ return (
80
+ <ul className="grid w-full max-w-md gap-1">
81
+ {SHOWN.map((p) => (
82
+ <li key={p} className="flex items-center gap-3 rounded-xs px-1 py-1.5">
83
+ <ProviderLogo provider={p} />
84
+ <span className="text-base text-ink">{PROVIDERS[p].label}</span>
85
+ </li>
86
+ ))}
87
+ </ul>
88
+ );
89
+ }
90
+ ```
91
+
92
+ ## Related
93
+
94
+ - Connector picker
95
+ - Sign in
96
+ - Connected tools
97
+ - Avatar and avatar stack
@@ -0,0 +1,83 @@
1
+ # Radio
2
+
3
+ Lets people choose exactly one option from a short, visible list in a form.
4
+
5
+ Kind: component · Group: Actions and inputs · Status: built, import from @twoux/ui
6
+
7
+ ## When to use
8
+
9
+ - To pick one option from two to seven, when seeing all options helps the decision: Full time or Part time.
10
+ - When both choices need a visible explanation, which a single checkbox cannot give.
11
+ - Inside a form that is applied with a Save or Publish button.
12
+
13
+ ## When not to use
14
+
15
+ - For eight or more options. Use a select or Dropdown menu.
16
+ - For several choices at once. Use Checkbox.
17
+ - To switch the view of data outside a form. Use Segmented control.
18
+ - For a single on/off setting. Use Checkbox or Switch.
19
+
20
+ ## Structure
21
+
22
+ 1. Group label (legend)
23
+ 2. Radio circle (15px)
24
+ 3. Option label
25
+ 4. Option hint (optional)
26
+
27
+ ## Guidelines
28
+
29
+ - Circle is 15px; selected shows a thick primary ring.
30
+ - Preselect the most likely or safest option. Never preselect a risky one.
31
+ - Add None when no choice is valid, since a radio group cannot be cleared.
32
+ - Stack options vertically. Inline is allowed for two short options, as in Full time / Part time.
33
+ - Order from most to least likely, or least to most risky.
34
+
35
+ ## Content
36
+
37
+ - Labels short and parallel, ideally under three words.
38
+ - The legend asks or names the choice: Contract type.
39
+ - Avoid overlapping ranges in number options.
40
+
41
+ ## Accessibility
42
+
43
+ - Native radios share a name, wrapped in fieldset and legend (or role="radiogroup" with a label).
44
+ - Tab enters the group on the selected option; arrow keys move and select.
45
+ - Labels are clickable so the target exceeds the 15px circle.
46
+ - Ring and border have 3:1 contrast against white.
47
+
48
+ ## Keyboard
49
+
50
+ | Keys | Action |
51
+ |---|---|
52
+ | Tab | Move into the group, onto the selected option |
53
+ | Arrow keys | Move to and select the next or previous option |
54
+ | Space | Select the focused option if not selected |
55
+
56
+ ## Examples
57
+
58
+ ### group
59
+
60
+ ```tsx
61
+ import { RadioField, RadioGroup } from "@twoux/ui";
62
+ export const meta = {"title": "Radio group", "description": "One choice from a short, visible list. Arrow keys move and select; Tab leaves the group.", "order": 1};
63
+
64
+ export default function Example() {
65
+ return (
66
+ <fieldset className="grid gap-2">
67
+ <legend className="mb-1 text-sm font-medium text-ink">Contract</legend>
68
+ <RadioGroup defaultValue="full">
69
+ <RadioField id="r-full" value="full" label="Full time" />
70
+ <RadioField id="r-part" value="part" label="Part time" hint="Under 30 hours a week." />
71
+ <RadioField id="r-fixed" value="fixed" label="Fixed term" />
72
+ <RadioField id="r-zero" value="zero" label="Zero hours" disabled />
73
+ </RadioGroup>
74
+ </fieldset>
75
+ );
76
+ }
77
+ ```
78
+
79
+ ## Related
80
+
81
+ - Checkbox
82
+ - Segmented control
83
+ - Form validation
@@ -0,0 +1,102 @@
1
+ # Ranked list
2
+
3
+ Ranked rows with a series dot or icon, name, value and change, optionally a sparkline. Beside a stacked chart it is the chart's legend; each row links to the record.
4
+
5
+ Kind: component · Group: Data visualisation · Status: built, import from @twoux/ui
6
+
7
+ ## When to use
8
+
9
+ - As the legend of a stacked chart when people also need the ranking and values for the latest period.
10
+ - A dashboard list of the top items by one measure, each opening its record.
11
+
12
+ ## When not to use
13
+
14
+ - To compare many attributes per row or sort by them. Use the TwoUX List table.
15
+ - For a price or index list where the code and unit matter. Use the TwoUX Change list.
16
+
17
+ ## Structure
18
+
19
+ 1. Heading that names the moment, such as Top models on 28 Apr
20
+ 2. Rank
21
+ 3. Series dot (or icon)
22
+ 4. Name
23
+ 5. Optional sparkline
24
+ 6. Value, tabular
25
+ 7. Change: arrow, sign and percentage
26
+
27
+ ## Guidelines
28
+
29
+ - Rank by the value shown, highest first, and say which period ranks it in the heading.
30
+ - When the list is a legend, each dot keeps its series colour from the chart; never recolour by rank.
31
+ - Show change with an arrow and a sign; colour it green or red only when the direction means good or bad, otherwise grey.
32
+ - Hovering or focusing a row highlights that series in the chart, and the chart's crosshair can highlight the row.
33
+ - Each row is one link or one button for the whole row, never several actions.
34
+
35
+ ## Content
36
+
37
+ - Values carry their unit (bn tokens, £); changes say the comparison in the heading or subtitle.
38
+ - Keep names short enough to fit; the full name goes in the record.
39
+
40
+ ## Accessibility
41
+
42
+ - 1.4.1 Use of Color: change is an arrow, a sign and a word read out (up or down), not colour.
43
+ - 1.3.1 Info and Relationships: the list is an ordered list, so rank is announced.
44
+ - 4.1.2 Name, Role, Value: each row is a single link or button whose name includes the label, value and change.
45
+ - 2.4.7 Focus Visible: rows show the focus ring inside their edge.
46
+
47
+ ## Keyboard
48
+
49
+ | Keys | Action |
50
+ |---|---|
51
+ | Tab | Move to the next row |
52
+ | Enter | Open the row's record |
53
+
54
+ ## Examples
55
+
56
+ ### top-models
57
+
58
+ ```tsx
59
+ import { useState } from "react";
60
+ import { CartesianChart, ChartFrame, type ChartSeries, chartTable, RankedList } from "@twoux/ui";
61
+
62
+ export const meta = { title: "Top models beside a stacked chart", description: "The ranked list is the legend: each row's dot matches its series, ranked by the last day, with the change since the week before.", order: 1 };
63
+
64
+ const DAYS = ["22 Apr", "23 Apr", "24 Apr", "25 Apr", "26 Apr", "27 Apr", "28 Apr"];
65
+ const SERIES: ChartSeries[] = [
66
+ { id: "atlas", label: "Atlas 3", data: [3.1, 3.4, 3.3, 3.8, 2.9, 2.6, 4.2] },
67
+ { id: "nimbus", label: "Nimbus Pro", data: [2.4, 2.5, 2.7, 2.6, 2.1, 1.9, 2.8] },
68
+ { id: "kestrel", label: "Kestrel 2", data: [1.2, 1.4, 1.5, 1.7, 1.3, 1.2, 1.9] },
69
+ { id: "orbit", label: "Orbit Mini", data: [1.6, 1.5, 1.4, 1.4, 1.1, 1.0, 1.3] },
70
+ { id: "other", label: "Others", data: [0.9, 0.9, 1.0, 1.1, 0.8, 0.7, 1.0] },
71
+ ];
72
+ const CHANGE = [12.4, 6.1, 31.0, -9.7, 4.2];
73
+ const tokens = (n: number) => `${n.toFixed(1)}bn`;
74
+
75
+ export default function Example() {
76
+ const [active, setActive] = useState<string | null>(null);
77
+ return (
78
+ <ChartFrame className="w-full" title="Tokens by model" description="Daily tokens, last 7 days" table={chartTable("Day", DAYS, SERIES)}>
79
+ <div className="grid grid-cols-[minmax(0,1fr)_minmax(0,18rem)] gap-6 max-lg:grid-cols-1">
80
+ <CartesianChart kind="bar" stacked x={DAYS} series={SERIES} format={(n) => `${n}bn`} aria-label="Tokens by model, stacked by day" />
81
+ <div className="grid content-start gap-1">
82
+ <h4 className="px-2 text-sm font-medium text-ink-2">Top models on 28 Apr</h4>
83
+ <RankedList
84
+ aria-label="Top models on 28 April, by tokens"
85
+ items={SERIES.map((s, i) => ({ id: s.id, label: s.label, value: s.data[6] ?? 0, change: CHANGE[i], colorIndex: i, href: `#${s.id}` }))}
86
+ format={tokens}
87
+ upIs="neutral"
88
+ activeId={active}
89
+ onActiveChange={setActive}
90
+ />
91
+ </div>
92
+ </div>
93
+ </ChartFrame>
94
+ );
95
+ }
96
+ ```
97
+
98
+ ## Related
99
+
100
+ - Stacked area chart
101
+ - Change list
102
+ - Stat card with comparison
@@ -0,0 +1,72 @@
1
+ # Showing reasoning and progress
2
+
3
+ While working, say the current step in words with a running timer and a Stop; when done, collapse to "Thought for 2.1s · 4 steps" that opens on request.
4
+
5
+ Kind: pattern · Group: Patterns: AI
6
+
7
+ **Problem:** A bare spinner for ten seconds makes people think the assistant is stuck, and a wall of reasoning buries the answer. Without one rule, each surface shows progress differently.
8
+
9
+ **Solution:** Thinking shows "Thinking" with a timer, then step titles with one line of detail. Send becomes Stop. When the answer starts, the steps collapse into one summary line that stays in the history.
10
+
11
+ **Built from:** Thinking and steps, Assistant side panel, Agent run timeline, Step card, Message composer
12
+
13
+ ## How it works
14
+
15
+ 1. Under about one second, show nothing; stream the answer straight away.
16
+ 2. Otherwise show "Thinking" with a running timer and the send button becomes Stop.
17
+ 3. Each step appears with a short title and one line of detail: "Reading 9 listings".
18
+ 4. Beyond about ten seconds, show the current step with an estimate, or a progress bar when the total is known ("3 of 50 rows").
19
+ 5. When the answer starts, collapse to "Thought for 2.1s · 4 steps", expandable on click.
20
+ 6. Stop keeps what was done so far, marks the run as stopped, and offers Regenerate.
21
+
22
+ ## When to use
23
+
24
+ - Any assistant answer, agent run or AI column run that takes more than a second.
25
+
26
+ ## When not to use
27
+
28
+ - To justify an answer. Step text is a progress report, not proof; use citations for evidence.
29
+
30
+ ## Guidelines
31
+
32
+ - Show what was read and done, with counts and time, in neutral words. No first-person "I'm thinking hard".
33
+ - Keep proposed, done and evidence apart: plan steps, completed steps, and citations are three different things.
34
+ - Step states have one look everywhere: queued, running, waiting for you, done, skipped, failed, stopped.
35
+ - Stop is always visible while anything runs and acts at once.
36
+ - Never show credentials, token counts or raw system prompts in steps.
37
+ - Collapsed by default in the side panel, where the answer is the main content.
38
+ - Two stages: working (nothing to show yet: step text and timer) and writing (the answer streams). Keep a small working indicator until the last part has arrived, so a pause in streaming doesn't look like the end.
39
+ - Stream only prose. Tables, lists of records and files render in place as a skeleton with "Loading 12 listings" until complete, then appear whole.
40
+ - Thinking is reasoning; steps that read or change data are execution. Execution goes in the agent run or step card, never inside "Thinking".
41
+ - Offer "Answer now" only when a useful answer exists from the work so far; what was done stays visible.
42
+ - Show thinking expanded by default only where the answer isn't the main content, such as a generated column cell's detail.
43
+ - Summaries count honestly: "2 of 5 steps" for steps in order, "3 done · 1 running · 1 queued" for parallel steps; add failed and stopped only when non-zero, and end with why it stopped: "2 of 5 steps · stopped".
44
+ - A group's status is its most urgent child's: failed over waiting over running over done. Nest steps two levels at most.
45
+
46
+ ## Content
47
+
48
+ - Step titles are present participles while running ("Reading 9 listings") and past tense when done ("Read 9 listings").
49
+ - Duration uses rounded values: "Thought for 7s".
50
+
51
+ ## Accessibility
52
+
53
+ - Announce the current step politely and the finished state once; don't announce every token.
54
+ - Step state uses icon shape as well as colour.
55
+ - The working label stays the same text ("Thinking") while it runs, so screen readers aren't re-reading a changing label.
56
+
57
+ ## Do
58
+
59
+ - Do name the current step in words.
60
+ - Do keep the collapsed summary in the conversation history.
61
+
62
+ ## Don't
63
+
64
+ - Don't show a bare looping animation for long waits.
65
+ - Don't swap the label for streaming reasoning text; it flickers.
66
+
67
+ ## Related
68
+
69
+ - Propose, then apply
70
+ - Agents acting on your behalf
71
+ - Generated table columns and enrichment
72
+ - Thinking and steps
@@ -0,0 +1,71 @@
1
+ # Record detail: side panel, overlay or full page
2
+
3
+ Open a record in a side panel that pushes the list by default, overlay it on narrow or wide-content pages, and go to the full page for deep work.
4
+
5
+ Kind: pattern · Group: Patterns: general
6
+
7
+ **Problem:** Opening records in modals hides the list people compare against; opening a full page every time loses their place. Teams pick a different container on every screen.
8
+
9
+ **Solution:** Enter or a click opens the side panel in push mode. J and K move to the next record and the panel follows. Esc closes. Open (⇧↵) goes to the full page. Overlay replaces push below about 1100px or when the content needs width.
10
+
11
+ **Built from:** Side panel (drawer), List table, Data grid, Page header, Breadcrumb, Tabs (underline)
12
+
13
+ ## How it works
14
+
15
+ 1. Enter or a click on a row opens the side panel. The row stays highlighted and the list stays usable.
16
+ 2. The panel has a control bar (previous, next, position, open full page, close), then ID, title and status, then tabs and sections.
17
+ 3. J and K move to the next or previous row; the panel follows without closing.
18
+ 4. Open (⇧↵) moves to the full record page, with breadcrumbs back to the list and the same filters.
19
+ 5. Esc closes the panel and returns focus to the row that opened it.
20
+
21
+ ## When to use
22
+
23
+ - Push side panel: on list pages people work through one record after another (listings, candidates, inbox).
24
+ - Overlay side panel: when the page is narrower than about 1100px, or holds wide tables or dashboards that pushing would crush.
25
+ - Full page: for long records, history, or editing many related sections.
26
+
27
+ ## When not to use
28
+
29
+ - Don't use a modal dialog for record detail; it hides the rows people compare against. Modals are for confirmations.
30
+ - Don't open the detail inline as an expanding row; expanded rows pile up and clutter the table.
31
+
32
+ ## Guidelines
33
+
34
+ - A split view never replaces the full page; the panel is for deciding the next step, the page is for everything about one record.
35
+ - Only one secondary panel of a kind at a time; the assistant and record detail share the same side panel slot.
36
+ - Keep the identifying columns visible next to a pushed panel so people know which row they are on.
37
+ - People can switch push and overlay with ⇧P, and the choice is remembered.
38
+ - With several rows selected, the panel shows a useful summary of the selection, not a list of names.
39
+ - The side panel shares the single right-hand slot with the assistant and help panels; opening one replaces the other, and closing it restores the previous one.
40
+ - If a form in the panel has unsaved changes, J, K, Esc and close ask before discarding (see Unsaved changes). Single-field edits save on Enter and never ask.
41
+ - Section actions sit in each section's header on the right ("Edit details"); record-wide actions sit in the panel footer.
42
+ - The Details section shows absolute timestamps with their source: "Created 6 November 2026, 09:14 GMT by Priya Shah".
43
+
44
+ ## Content
45
+
46
+ - Empty fields say "Add", so the gap is also the way to fill it.
47
+ - Timestamps are relative with the exact date on hover.
48
+ - Fields the person can't edit are shown as read-only text with the reason on hover, such as "Set by the job board feed".
49
+
50
+ ## Accessibility
51
+
52
+ - A push panel is non-modal: it sits in the focus order after the list and never traps focus.
53
+ - An overlay panel that covers content behaves as a modal dialog: focus moves in, Tab is trapped, Esc closes and focus returns.
54
+ - The panel must not fully hide the focused row.
55
+
56
+ ## Do
57
+
58
+ - Do keep J/K working while the panel is open.
59
+ - Do return focus to the row on close.
60
+
61
+ ## Don't
62
+
63
+ - Don't open record detail in a centred modal.
64
+ - Don't open a second panel on top of the first.
65
+
66
+ ## Related
67
+
68
+ - Keyboard-first navigation
69
+ - Inline editing and validation
70
+ - Ask about what's on screen
71
+ - Side panel (drawer)
@@ -0,0 +1,70 @@
1
+ # Regenerating an answer
2
+
3
+ Regenerate reruns the same question with the same context and replaces the latest answer, keeping the earlier version one step away. It never touches changes already applied.
4
+
5
+ Kind: pattern · Group: Patterns: AI
6
+
7
+ **Problem:** The first answer sometimes takes the wrong angle: too long, the wrong listings, the wrong period. Typing "try again" sends a new message, so the thread fills with near-duplicates and the assistant reads the bad answer as context.
8
+
9
+ **Solution:** Put a Regenerate button in the answer actions of the latest answer. It reruns the original question with the same context chips and settings, and the new answer takes the old one's place with a "2 / 2" switch to go back. It works the same after a finished answer and after Stop.
10
+
11
+ **Built from:** Answer actions, Assistant side panel, Message composer, Thinking and steps, Suggested changes, AI origin label
12
+
13
+ ## How it works
14
+
15
+ 1. While the assistant works, the send button becomes Stop. Stop acts at once and keeps what was written so far, marked "Stopped".
16
+ 2. Under the latest answer, finished or stopped, show Regenerate in the answer actions next to Copy and feedback.
17
+ 3. Regenerate sends the same question with the same context chips, team files and Quick or Thorough setting. Nothing new is typed into the thread.
18
+ 4. The new answer replaces the old one in place. A "2 / 2" control under it switches between versions; the thread continues from the version on screen.
19
+ 5. If regenerating fails, keep the earlier version on screen and show the error under it with Try again.
20
+
21
+ ## When to use
22
+
23
+ - When the person asked a question and wants a different take on the same request, such as a shorter summary of why LST-1044 has few applicants.
24
+ - After Stop, when the answer was heading the wrong way and the question itself was fine.
25
+ - For drafts the person will review anyway, such as a job description or an interview question set.
26
+
27
+ ## When not to use
28
+
29
+ - To change the question. Edit the question or send a new message; regenerate repeats the input exactly.
30
+ - On agent runs or scheduled tasks that changed data. Run them again as a new run under the same permissions.
31
+ - On a single generated table cell. Use Try again on the cell (see Generated table columns).
32
+
33
+ ## Guidelines
34
+
35
+ - Offer Regenerate on the latest answer only. Regenerating an earlier answer would drop everything after it, which the person can't see coming.
36
+ - Only answers the person asked for get Regenerate. Starters, notices and approval results don't.
37
+ - Regenerating never undoes or repeats applied changes. Changes already applied stay applied; reversing them is Undo's job.
38
+ - Suggested changes in the replaced version are dropped if not yet applied; the new version brings its own proposal.
39
+ - Each version keeps its own citations and origin label, so switching versions never mixes sources.
40
+
41
+ ## Content
42
+
43
+ - Button tooltip and accessible name: "Regenerate answer". Version control: "2 / 2", with "Previous version" and "Next version" as names.
44
+ - A stopped answer ends with "Stopped" in muted text, not an apology.
45
+ - Failure: "Couldn't regenerate. Your earlier answer is still here." then Try again.
46
+
47
+ ## Accessibility
48
+
49
+ - Regenerate sits in the answer actions, which follow the answer in tab order, so it is reached right after reading.
50
+ - Focus stays on Regenerate while the new answer is written; announce "Regenerating" and then the finished answer once.
51
+ - The version switch announces the version on screen: "Version 1 of 2".
52
+
53
+ ## Do
54
+
55
+ - Do let people stop at once and regenerate straight after.
56
+ - Do keep the earlier version reachable.
57
+ - Do keep the same context chips for the rerun, visibly.
58
+
59
+ ## Don't
60
+
61
+ - Don't put a confirmation or delay on Stop.
62
+ - Don't show Regenerate on every answer in the thread.
63
+ - Don't let regenerate reverse or repeat applied changes.
64
+
65
+ ## Related
66
+
67
+ - Showing reasoning and progress
68
+ - Propose, then apply
69
+ - Generated drafts and files
70
+ - Answer actions
@@ -0,0 +1,94 @@
1
+ # Run status bar
2
+
3
+ The bottom bar of a sheet: Table up to date, or how far the run is with a meter, the credits spent so far and Stop; run history; and Auto-run with its cost per row.
4
+
5
+ Kind: component · Group: Data · Status: built, import from @twoux/ui
6
+
7
+ ## When to use
8
+
9
+ - At the bottom of a sheet with computed columns, so people always see what is running and what it costs.
10
+
11
+ ## When not to use
12
+
13
+ - For credits against a monthly limit. Use the Usage meter.
14
+ - For one agent run with steps. Use Agent run.
15
+
16
+ ## Structure
17
+
18
+ 1. Status: icon, words, rows done of total, percentage and meter
19
+ 2. Credits so far
20
+ 3. Errors link
21
+ 4. Stop while running, or Run remaining with its cost
22
+ 5. Auto-run switch with the cost per row
23
+ 6. History popover
24
+
25
+ ## Guidelines
26
+
27
+ - Stop is always available while anything runs, and stopping keeps the finished cells.
28
+ - Show progress as rows and a percentage, with a meter, never a bare spinner.
29
+ - State the credits spent so far while running, and the cost of Run remaining before it starts.
30
+ - Auto-run states its cost per row next to the switch, before anyone turns it on.
31
+ - History lists each run with rows, credits, outcome and when.
32
+
33
+ ## Content
34
+
35
+ - Running: "1,240 of 2,000 rows · 62%". Stopped: "Stopped at 62%". Done: "Table up to date".
36
+ - Costs use the unit: "≈ 1.5 credits / row".
37
+
38
+ ## Accessibility
39
+
40
+ - The progress is a progressbar with its value; the status line is a live region.
41
+ - Errors are words with an icon, not a red dot.
42
+
43
+ ## Keyboard
44
+
45
+ | Keys | Action |
46
+ |---|---|
47
+ | Tab | Reach Stop, Auto-run and History |
48
+
49
+ ## Examples
50
+
51
+ ### running
52
+
53
+ ```tsx
54
+ import { RunStatusBar, Timestamp } from "@twoux/ui";
55
+ import { useEffect, useState } from "react";
56
+
57
+ export const meta = { title: "A run with cost and Stop", description: "Progress, credits so far and Stop while running. Stop keeps finished rows; Run remaining states its cost first. Auto-run shows its cost per row before it is turned on.", order: 1 };
58
+
59
+ const TOTAL = 2000;
60
+
61
+ export default function Example() {
62
+ const [done, setDone] = useState(1240);
63
+ const [running, setRunning] = useState(true);
64
+ const [autoRun, setAutoRun] = useState(false);
65
+ useEffect(() => {
66
+ if (!running) return;
67
+ const t = window.setInterval(() => setDone((d) => { const n = Math.min(TOTAL, d + 20); if (n === TOTAL) setRunning(false); return n; }), 300);
68
+ return () => window.clearInterval(t);
69
+ }, [running]);
70
+ return (
71
+ <RunStatusBar
72
+ className="w-full rounded-sm border border-line"
73
+ running={running}
74
+ label="Work email"
75
+ done={done}
76
+ total={TOTAL}
77
+ errors={3}
78
+ creditsUsed={done * 0.5}
79
+ costPerRow={0.5}
80
+ onStop={() => setRunning(false)}
81
+ onRunRemaining={() => setRunning(true)}
82
+ autoRun={autoRun}
83
+ onAutoRunChange={setAutoRun}
84
+ history={[{ id: "1", label: "Work email · test on 10 rows", rows: 10, credits: 5, outcome: "Done", when: <Timestamp value={new Date(Date.now() - 3600_000)} /> }]}
85
+ />
86
+ );
87
+ }
88
+ ```
89
+
90
+ ## Related
91
+
92
+ - Sheet grid
93
+ - Usage meter
94
+ - Agent run timeline
@@ -0,0 +1,63 @@
1
+ # Saved tasks and schedules
2
+
3
+ Turn repeated requests into a task sentence with editable slots, test it once, then save it and optionally run it on a schedule.
4
+
5
+ Kind: pattern · Group: Patterns: AI
6
+
7
+ **Problem:** Teams retype the same long prompt every Monday, with slightly different wording each time and different results. Scheduled automation that has never been tested surprises people.
8
+
9
+ **Solution:** The task builder writes the task as a sentence with slots ("Find [Live listings] with [apply rate under 3%]..."). Slots reuse filter values. An empty slot blocks Run and says which one. Test runs once in the assistant; Save as task adds an optional schedule.
10
+
11
+ **Built from:** Task builder, Templates gallery, Prompt editor with fields, Agent run timeline, Agent permissions, Previous conversations
12
+
13
+ ## How it works
14
+
15
+ 1. Start from a template, a past answer ("Save as task") or a blank builder.
16
+ 2. The task is a sentence with slots; slots reuse filter values and record pickers.
17
+ 3. An empty slot is dashed and blocks Run, with a message naming it: "Choose who gets the titles before you run this."
18
+ 4. Run once (⌘↵) to test. The result arrives as a normal answer with proposals.
19
+ 5. Save as task, then optionally add a schedule ("Every Monday") and check the permissions the task will use.
20
+ 6. Scheduled runs appear first in previous conversations, notify before changing anything, and wait in the Inbox when they need approval.
21
+
22
+ ## When to use
23
+
24
+ - For tasks repeated with the same structure and different values: weekly reviews, renaming, chasing hiring managers.
25
+
26
+ ## When not to use
27
+
28
+ - For one-off questions; just ask.
29
+
30
+ ## Guidelines
31
+
32
+ - Slots are the parts that change; the rest of the sentence is fixed so results are consistent.
33
+ - Keep slots few; too many raise effort and reduce quality.
34
+ - A task must run successfully once before it can be scheduled.
35
+ - Scheduled tasks use the same agent permissions, shown explicitly when the schedule is set; changes default to Ask first.
36
+ - Picking a template opens it as a draft task, never runs it.
37
+
38
+ ## Content
39
+
40
+ - Tasks read as one sentence starting with a verb: "Find ..., then suggest ... and send them to ...".
41
+
42
+ ## Accessibility
43
+
44
+ - Each slot is a button with its field name and current value, and opens a popover with one field.
45
+ - Empty required slots are announced with the error message, not only shown dashed.
46
+
47
+ ## Do
48
+
49
+ - Do reuse filter values in slots.
50
+ - Do test before scheduling.
51
+
52
+ ## Don't
53
+
54
+ - Don't save free prompts as scheduled tasks.
55
+ - Don't let a schedule change records without a notice or approval.
56
+
57
+ ## Related
58
+
59
+ - Agents acting on your behalf
60
+ - Onboarding to an empty workspace
61
+ - Propose, then apply
62
+ - Task builder
63
+ - Templates gallery