@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,66 @@
1
+ # Undo and destructive actions
2
+
3
+ Decide between Undo after the fact and a confirmation before it, using one test: can the action be reversed, and who else does it reach?
4
+
5
+ Kind: pattern · Group: Patterns: general
6
+
7
+ **Problem:** Confirming everything trains people to click Yes without reading; confirming nothing loses data. Teams pick differently on every screen.
8
+
9
+ **Solution:** Reversible actions run at once and offer Undo in a toast and with ⌘Z. Irreversible actions, or ones that reach people outside the workspace, confirm in a dialog that states the consequence, with the safe option focused.
10
+
11
+ **Built from:** Toast, Confirmation dialog, Bulk action bar, Button, Keyboard shortcut hint
12
+
13
+ ## How it works
14
+
15
+ 1. Ask: can TwoUX reverse this fully? Extending, renaming, archiving and moving can be reversed; deleting, emailing candidates and closing a listing that has notified applicants cannot.
16
+ 2. Reversible: run it, then show a toast such as "2 listings extended" with Undo. ⌘Z undoes the last action too.
17
+ 3. Irreversible: open a confirmation dialog titled with the action and count, stating what happens and what is kept.
18
+ 4. Buttons name the outcome: the safe option ("Keep open") and the action ("Close listings"). Focus starts on the safe option.
19
+ 5. For severe actions that also remove related records, such as deleting a workspace, ask the person to type the name.
20
+
21
+ ## When to use
22
+
23
+ - Undo: for every reversible change made by a person or applied by the assistant.
24
+ - Dialog: for deletion, sending to people outside the workspace, and actions that cascade.
25
+
26
+ ## When not to use
27
+
28
+ - Don't confirm routine reversible actions; offer Undo instead.
29
+ - Don't use a toast as the only record of something important; important outcomes also appear in the record's activity.
30
+
31
+ ## Guidelines
32
+
33
+ - Scale friction to severity: none for low-risk, one dialog for high-risk, typed confirmation only for the rarest, most damaging actions.
34
+ - The dialog body names the items, the consequence and what stays: "The 140 people who already applied stay in your pipeline."
35
+ - Undo stays reachable after the toast goes: ⌘Z and the record's activity both reverse the last action.
36
+ - An Undo toast stays while hovered or focused and does not close while the person is reading it.
37
+ - The action button uses the danger style and sits to the right of the safe option, never on its own.
38
+
39
+ ## Content
40
+
41
+ - Dialog title is a question with the count: "Close 2 listings?"
42
+ - Never "Are you sure?", "Yes" or "OK". Use outcome labels.
43
+ - Toast: past tense plus Undo: "Listing archived. Undo".
44
+
45
+ ## Accessibility
46
+
47
+ - Confirmation dialogs use role alertdialog with aria-labelledby and aria-describedby.
48
+ - Focus moves to the least destructive button, Tab is trapped, Esc cancels and focus returns to the trigger.
49
+ - Toasts are announced as status messages; Undo also has a keyboard path (⌘Z) because toast actions are hard to reach with a keyboard.
50
+
51
+ ## Do
52
+
53
+ - Do offer Undo after every reversible change, including bulk and assistant changes.
54
+ - Do state the consequence in the dialog body.
55
+
56
+ ## Don't
57
+
58
+ - Don't focus the destructive button by default.
59
+
60
+ ## Related
61
+
62
+ - Selection and bulk actions
63
+ - Propose, then apply
64
+ - Notifications: inbox, bell, toast or email digest
65
+ - Toast
66
+ - Confirmation dialog
@@ -0,0 +1,71 @@
1
+ # Unsaved changes
2
+
3
+ Don't let people lose work by accident: save drafts of long text automatically, and ask before discarding a changed form only when there really are changes.
4
+
5
+ Kind: pattern · Group: Patterns: general
6
+
7
+ **Problem:** Someone writing a job description clicks a breadcrumb or closes the tab and loses twenty minutes of work. The opposite failure is a "Discard changes?" dialog that appears when nothing changed, which trains people to click through it.
8
+
9
+ **Solution:** Track whether a form is dirty. Long text (job descriptions, email templates) saves a draft as people type. A changed form that would be lost by leaving asks once, in TwoUX's confirmation dialog, with Keep editing as the safe default. Browser-level exits use the browser's own prompt.
10
+
11
+ **Built from:** Confirmation dialog, Side panel (drawer), Button, Text input, Timestamp, Banner (inline alert)
12
+
13
+ ## How it works
14
+
15
+ 1. Track a dirty flag per form: true once a value differs from what was loaded, false again after save or if the person changes it back.
16
+ 2. For long text, save a draft every few seconds after typing stops and show "Draft saved 10 seconds ago" near the actions. A form whose draft is saved is not at risk, so no prompt is needed.
17
+ 3. When an in-app action would throw unsaved changes away (Cancel, a breadcrumb, a side navigation link, J or K to the next record, Esc on a panel form), open the confirmation dialog.
18
+ 4. While the form is dirty, register a beforeunload handler so closing or reloading the tab shows the browser's own prompt; remove it as soon as the form is clean.
19
+ 5. After the person chooses Discard, carry out the action they started; after Keep editing, return focus to where they were.
20
+
21
+ ## When to use
22
+
23
+ - Create listing, Edit listing and other multi-field forms with a Save button.
24
+ - Forms inside the side panel, where J, K or Esc would move away from the edit.
25
+ - Long text such as a job description or an email template, where autosaved drafts replace the prompt.
26
+
27
+ ## When not to use
28
+
29
+ - Inline edits in the data grid or side panel fields, which save on Enter or blur; there is never an unsaved state to lose.
30
+ - When nothing has changed, everything is already saved, or the action opens a new tab.
31
+ - When opening or closing a disclosure inside the same form, such as a Show advanced options section.
32
+
33
+ ## Guidelines
34
+
35
+ - Ask every time there is a risk of loss, whatever the size of the change; consistency means people never have to guess.
36
+ - Never offer "Don't ask again" on this dialog; there would be no way to turn it back on.
37
+ - Discarding typed work cannot be undone, so this is one of the few places TwoUX confirms instead of offering Undo.
38
+ - Mark a dirty form in text near the Save button ("Unsaved changes"), not only with a dot.
39
+ - If a save fails, keep the form dirty and its values in place, with the error in a banner above the actions.
40
+
41
+ ## Content
42
+
43
+ - Dialog title: "Discard changes to this listing?" Body: "Your changes to Junior Product Designer haven't been saved."
44
+ - Buttons: "Keep editing" (safe, focused) and "Discard changes" (destructive). Not Yes and No.
45
+ - Draft status: "Draft saved 10 seconds ago", or "Saving draft" while it saves.
46
+
47
+ ## Accessibility
48
+
49
+ - The dialog follows the alert dialog pattern: focus moves to Keep editing, Tab is trapped, Esc means Keep editing.
50
+ - Draft saved status updates in a polite live region, at most once per save, so screen readers aren't flooded.
51
+ - The browser's own beforeunload prompt is accessible by default; don't try to replace it with custom text.
52
+
53
+ ## Do
54
+
55
+ - Do save drafts of long text automatically.
56
+ - Do ask only when the form is dirty.
57
+ - Do make Keep editing the default.
58
+
59
+ ## Don't
60
+
61
+ - Don't keep the beforeunload handler on a clean form.
62
+ - Don't ask when someone opens a section inside the same form.
63
+ - Don't add "Don't ask again".
64
+
65
+ ## Related
66
+
67
+ - Undo and destructive actions
68
+ - Inline editing and validation
69
+ - Record detail: side panel, overlay or full page
70
+ - Confirmation dialog
71
+ - Timestamp
@@ -0,0 +1,80 @@
1
+ # Usage meter
2
+
3
+ Credits or seats used against a limit, when it resets, and what used them. An upgrade link appears only near the limit.
4
+
5
+ Kind: component · Group: Feedback and overlays · Status: built, import from @twoux/ui
6
+
7
+ ## When to use
8
+
9
+ - Showing consumption against a plan limit, such as credits or seats.
10
+ - A measured value within a known range.
11
+
12
+ ## When not to use
13
+
14
+ - Progress of a task. Use a progress indicator (nng-progress).
15
+ - A permanent plan promotion. Upgrade is not an always-visible bright button.
16
+
17
+ ## Structure
18
+
19
+ 1. Name of the unit and "used of limit"
20
+ 2. Meter bar
21
+ 3. Warning from 80% (what stops at the limit)
22
+ 4. Resets date
23
+ 5. What used them link
24
+ 6. Add more link (only near the limit)
25
+
26
+ ## Guidelines
27
+
28
+ - Say "13.2k of 20k credits": used, limit and unit.
29
+ - Say when it resets, for example "Resets 1 Dec".
30
+ - Link "What used them" to a breakdown, so people can reduce usage.
31
+ - From 80% used, warn and say what stops at the limit: "Agents pause until 1 Dec".
32
+ - Show the upgrade link only near the limit. Never a permanent bright button.
33
+ - Use role="meter" with min, max and now values, and a name.
34
+ - Never use colour alone: the warning has an icon and words as well as the amber bar.
35
+
36
+ ## Content
37
+
38
+ - "86% used. Agents pause until 1 Dec."
39
+ - Link: "Add more", not "Upgrade now".
40
+
41
+ ## Accessibility
42
+
43
+ - role="meter" with aria-valuemin, aria-valuemax, aria-valuenow and an accessible name (APG meter, SC 4.1.2).
44
+ - Warning is text with an icon, so it does not depend on colour (SC 1.4.1).
45
+ - The bar meets 3:1 against its track (SC 1.4.11).
46
+
47
+ ## Keyboard
48
+
49
+ | Keys | Action |
50
+ |---|---|
51
+ | Tab | Move to What used them and Add more |
52
+ | Enter | Open the breakdown or the upgrade options |
53
+
54
+ ## Examples
55
+
56
+ ### states
57
+
58
+ ```tsx
59
+ import { toast, UsageMeter } from "@twoux/ui";
60
+
61
+ export const meta = { title: "Plenty, close, and at the limit", description: "The upgrade link appears from 80% used, and the warning says what stops. Colour is never the only signal.", order: 1 };
62
+
63
+ export default function Example() {
64
+ const common = { unit: "credits", limit: 20000, resets: "1 Dec", atLimit: "Agents pause until 1 Dec", onDetails: () => toast("Opens the usage breakdown"), onUpgrade: () => toast("Opens the plans") };
65
+ return (
66
+ <div className="grid w-full max-w-xs gap-6">
67
+ <UsageMeter {...common} used={8400} />
68
+ <UsageMeter {...common} used={17200} />
69
+ <UsageMeter {...common} used={20000} />
70
+ </div>
71
+ );
72
+ }
73
+ ```
74
+
75
+ ## Related
76
+
77
+ - Stat card with comparison
78
+ - Banner (inline alert)
79
+ - Empty state
80
+ - Status badge
@@ -0,0 +1,71 @@
1
+ # Collecting product feedback
2
+
3
+ Ask "Was this helpful?" in a quiet spot after people have read or used something, record the Yes or No straight away, then offer one short optional question.
4
+
5
+ Kind: pattern · Group: Patterns: general
6
+
7
+ **Problem:** Feedback pop-ups mid-task annoy people and get dismissed, long surveys get abandoned, and a free-text box in a hiring tool invites people to paste candidate names and other personal data.
8
+
9
+ **Solution:** Use the feedback prompt at the end of help topics, reports and new features. A Yes or No vote is sent on its own. An optional follow-up of one to three questions appears after the vote, with a reminder not to include personal data.
10
+
11
+ **Built from:** Feedback prompt, Help panel, Button, Text input, Radio, Checkbox
12
+
13
+ ## How it works
14
+
15
+ 1. Place the prompt at the end of the content, after people have read or used it: the foot of a help topic, the end of a report, the side of a new feature's page.
16
+ 2. Ask one specific question about that content: "Was this helpful?" with Yes and No.
17
+ 3. Send the vote as soon as it is chosen. Show a loading state on the button, then a short thank you with the chosen answer.
18
+ 4. After the vote, reveal an optional follow-up: one to three fields, such as "What was missing?". Send it separately.
19
+ 5. If sending fails, say so beside the prompt and offer Try again.
20
+
21
+ ## When to use
22
+
23
+ - At the end of each help topic and help centre article.
24
+ - On a feature in beta, such as a new pipeline report, to learn whether it is useful.
25
+ - After a new workflow is used for the first time, such as the first bulk extend, as a quiet line in the result banner rather than a pop-up.
26
+
27
+ ## When not to use
28
+
29
+ - On assistant answers. They have their own good and bad controls next to the origin label.
30
+ - In a dialog or pop-up that interrupts a task.
31
+ - For more than three questions. Link to a separate survey page instead.
32
+
33
+ ## Guidelines
34
+
35
+ - Never interrupt. The prompt sits in the page flow, never as a modal or a toast.
36
+ - One prompt per page, with at most one follow-up form.
37
+ - Keep the follow-up to three questions or fewer; more lowers response and adds data to process.
38
+ - Free text carries a privacy line, and the feedback store strips email addresses and phone numbers before saving.
39
+ - In a side panel, place the expanding follow-up so the page doesn't jump; on narrow screens, the prompt moves to the end of the content.
40
+ - Don't promise a reply. Only say "We'll get back to you" if someone really will.
41
+
42
+ ## Content
43
+
44
+ - Question: "Was this helpful?" or "Was this report useful?". Answers: "Yes" and "No".
45
+ - Thank you: "Thanks, your feedback is recorded." with the chosen answer shown as selected.
46
+ - Privacy line under free text: "Don't include candidate names or other personal details."
47
+
48
+ ## Accessibility
49
+
50
+ - Yes and No are buttons with visible text, not icon-only thumbs.
51
+ - After a successful vote, focus moves to the thank you message so it isn't lost.
52
+ - Send errors are announced through a live region.
53
+
54
+ ## Do
55
+
56
+ - Do record the vote before asking anything else.
57
+ - Do ask about the specific content, not "How are we doing?".
58
+ - Do keep the prompt in the page flow, at the end of the content.
59
+
60
+ ## Don't
61
+
62
+ - Don't show a feedback pop-up during a task.
63
+ - Don't put two follow-up forms on one page.
64
+ - Don't collect personal data in feedback free text.
65
+
66
+ ## Related
67
+
68
+ - Contextual help
69
+ - Labelling AI output
70
+ - Feedback prompt
71
+ - Help panel
@@ -0,0 +1,60 @@
1
+ # Voice and tone
2
+
3
+ TwoUX sounds like a capable colleague who knows the data: precise, calm, candid and respectful of people's expertise. The voice is the same on every screen and in the assistant. The tone moves with the moment, from strictly practical in an error to one sentence warmer when someone is starting out or has just finished.
4
+
5
+ Kind: foundation · Group: Key principles
6
+
7
+ ## Principles
8
+
9
+ - Precise. Name the thing, the number and the result: '3 listings closed', not 'Items updated'. Translate system detail into what it means for the person's work.
10
+ - Calm. Use the same level voice for success and failure. Excitement comes from what happened, not from punctuation or adjectives: no exclamation marks, no hype, no apologies.
11
+ - Candid. Say what is known and what is not, what can't be undone, and what the assistant did. Never promise more than the product does.
12
+ - Respectful of expertise. Write for people who do this work every day. Teach only on first run, in empty states and when help is asked for. Never say a task is easy, quick or simple.
13
+
14
+ ## Guidelines
15
+
16
+ - Voice is fixed; tone varies. Before writing, ask three questions: how does the person probably feel, how often will they see this, and what is at stake? The answers set the tone, never the voice.
17
+ - TwoUX sits at one end of three of the four common tone dimensions: serious, not funny; respectful, not irreverent; matter-of-fact, not enthusiastic. On formal to casual it sits in the middle: plain and conversational, with common contractions and no slang. Tone moves within this range, never outside it.
18
+ - Inform to build trust: the default for every screen. Statuses, warnings, errors and assistant caveats say what happened, what it affects and what to do next, and only what is needed now. Banner, ErrorState, ConfidenceNote, AiOrigin.
19
+ - Empower to act: wherever a decision is needed. State the consequence and both choices plainly and leave the choice to the person; never nudge. ConfirmationDialog, PlanCard, approval cards, AgentPermissions.
20
+ - Encourage people along the path: wherever work is stuck or partly done. Say how much is done, what is left and one way forward. EmptyState, RunStatusBar, CsvImport, SetupChecklist.
21
+ - Motivate by showing possibilities: only where someone is starting something. Say what it lets them do in their own terms, as an outcome, never a superlative. OnboardingStep, empty workspace, FeatureLabel popover, ConnectorPicker.
22
+ - Satisfy by meeting expectations: the routine. Saves, completions and toasts are short, past tense, with a count and Undo. Nothing more is added.
23
+ - Delight: in TwoUX, delight comes from speed and precision, not from words. A quiet line is allowed at a real milestone people reach rarely, such as a finished setup checklist or an empty Inbox ('You're all caught up.'). Never in errors, never on repeated messages, never a joke, pun or emoji.
24
+ - Tone by person: experienced, daily users get the short form. First-run screens, empty states and help get one more sentence saying why. Both use the same words for the same things; there is no beginner vocabulary.
25
+ - Tone by stakes: the higher the stakes (money, people outside the workspace, decisions about candidates, permanent deletes), the plainer and more complete the copy. Never soften a risky action with 'just', 'quickly' or 'simply'.
26
+ - Address the person as 'you'. The product does not say 'we' or 'I': in a shared workspace 'we' could mean the vendor or the team. State the event instead: 'Listing not saved', not 'We couldn't save your listing'.
27
+ - The assistant speaks in the same voice. It opens with the answer, does not greet, praise the question or claim feelings ('I'd love to'), uses 'I' only for what it did ('I drafted 3 replies'), and states its limits as one specific caveat.
28
+ - When an agent or model writes copy, give it these four traits and a short sample of existing TwoUX copy, not a single adjective such as 'friendly'. Models exaggerate a single tone word; then edit the result by hand.
29
+
30
+ ## Content
31
+
32
+ - Words to cut: just, simply, easy, quick (unless measured), seamless, powerful, robust, smart, magic, AI-powered, awesome, great, oops, whoops, sorry, please, successfully, exclamation marks. 'twoux check' warns on the most common ones.
33
+ - Common contractions (can't, don't, isn't, you're) are fine because they read as speech. Avoid unusual ones (it'd, mustn't, should've). Write 'not' in full when the negative is the point and could be missed: 'Do not close this window while the import runs.'
34
+
35
+ ## Accessibility
36
+
37
+ - Plain, literal words translate and read aloud well. Avoid idioms, wordplay and cultural references, which screen reader users, people reading in a second language and translation tools often get wrong.
38
+ - Tone never replaces information: a reassuring sentence does not stand in for the cause and the fix an error must give.
39
+
40
+ ## Do
41
+
42
+ - Error, inform: 'Listing not published. The closing date is in the past. Change the date and publish again.'
43
+ - Stuck, encourage: '12 of 240 rows have no email. Import the other 228, or fix them first.'
44
+ - Starting, motivate: 'Connect your calendar to offer candidates interview times that are really free.'
45
+ - Routine, satisfy: '3 candidates moved to Interview. Undo'
46
+ - High stakes, empower: 'Delete 3 candidates permanently? Their CVs and notes are erased. Interview history stays.'
47
+
48
+ ## Don't
49
+
50
+ - Don't celebrate routine work: 'Woohoo! Your listing was successfully published!'
51
+ - Don't be playful when work is blocked: 'Uh-oh, our robots tripped over your file.'
52
+ - Don't minimise effort: 'Just connect your ATS, it's easy.'
53
+ - Don't make the assistant perform: 'Great question! I'd be happy to help you with that.'
54
+
55
+ ## Related
56
+
57
+ - Writing
58
+ - Error messages
59
+ - Labelling AI output
60
+ - Consistency
@@ -0,0 +1,93 @@
1
+ # Why this choice
2
+
3
+ A small Why? control beside a choice an agent made. On demand, it names the deciding factors and the options that lost, then offers Change this or Keep it.
4
+
5
+ Kind: component · Group: AI and agents · Status: built, import from @twoux/ui
6
+
7
+ ## When to use
8
+
9
+ - When an agent picked between options for the person: a time, a supplier, a template, a route, a recipient list.
10
+ - When a requirement could not be met and the person should know.
11
+ - When the choice is easy to change and people may want to change it after seeing why.
12
+
13
+ ## When not to use
14
+
15
+ - By default, on every output. Explanations on demand keep the screen quiet; use the origin label (ai-origin-label) to say where something came from.
16
+ - Sources for a claim. Use Citations and sources (citations-sources).
17
+ - Risks or doubt about the output. Use a Confidence note (confidence-note).
18
+
19
+ ## Structure
20
+
21
+ 1. Why? link beside the choice
22
+ 2. Popover ("Why <choice>", deciding factors)
23
+ 3. Not chosen (each option and why it lost)
24
+ 4. Couldn't meet (a requirement that was dropped, if any)
25
+ 5. Footer (Change this, Keep it)
26
+
27
+ ## Guidelines
28
+
29
+ - Show the reasoning on demand, from a Why? link. Do not show it by default.
30
+ - Name the deciding factors in plain language, with the most important first.
31
+ - Name the options that lost and why, so the person can see the alternatives were considered.
32
+ - Say if a requirement could not be met ("Couldn't meet: no room free before 10:00"), not only what was satisfied.
33
+ - End with Change this and Keep it, so the explanation leads to control.
34
+ - Store the reasoning with the choice when it is made. Do not rebuild it later, or the explanation can drift from what actually happened.
35
+
36
+ ## Content
37
+
38
+ - Title the popover "Why <the choice>": "Why Thursday at 14:00".
39
+ - Write each factor as a fact the person could check: "Everyone invited is free", not "Best fit".
40
+ - Write each lost option as its name, then the reason: "Wednesday 10:00: Imogen is out until 11:00".
41
+ - Keep buttons as verbs: "Change this" opens the choice for editing; "Keep it" closes the popover.
42
+
43
+ ## Accessibility
44
+
45
+ - The control is a button with the hidden text "Why <choice>", so it is not just "Why?" out of context (SC 2.4.6, 4.1.2).
46
+ - The popover is a non-modal dialog opened by the button; Escape closes it and focus returns to the button (APG dialog).
47
+ - Deciding factors use a check icon and text, and the icon is hidden from assistive technology (SC 1.4.1).
48
+ - The target is padded to at least 24 by 24 CSS pixels (SC 2.5.8).
49
+
50
+ ## Keyboard
51
+
52
+ | Keys | Action |
53
+ |---|---|
54
+ | Enter / Space | Open the Why? popover |
55
+ | Tab | Move through Change this and Keep it |
56
+ | Esc | Close the popover and return focus to Why? |
57
+
58
+ ## Examples
59
+
60
+ ### why
61
+
62
+ ```tsx
63
+ import { WhyChoice, toast } from "@twoux/ui";
64
+
65
+ export const meta = { title: "Why the agent picked this", description: "A Why? link beside the choice. On demand it names the factors, the options that lost and what could not be met, then offers Change this or Keep it.", order: 1 };
66
+
67
+ export default function Example() {
68
+ return (
69
+ <div className="flex w-full max-w-xl items-center gap-2 rounded-sm border border-line bg-surface px-3 py-2.5 text-base text-ink">
70
+ <span className="min-w-0 flex-1">Interview scheduled for <span className="font-medium">Thursday 14:00</span></span>
71
+ <WhyChoice
72
+ choice="Thursday at 14:00"
73
+ factors={["Everyone invited is free", "It is inside the applicant's availability window", "Room 2 is booked for the full hour"]}
74
+ alternatives={[
75
+ { name: "Wednesday 10:00", why: "Imogen Hart is out until 11:00" },
76
+ { name: "Friday 09:30", why: "Falls after the applicant's deadline to reply" },
77
+ ]}
78
+ dropped="No slot was free before 12:00, which you asked for."
79
+ onChange={() => toast("Opened the schedule for editing")}
80
+ onKeep={() => toast("Kept Thursday at 14:00")}
81
+ />
82
+ </div>
83
+ );
84
+ }
85
+ ```
86
+
87
+ ## Related
88
+
89
+ - Citations and sources
90
+ - Confidence note
91
+ - AI origin label
92
+ - Agent run timeline
93
+ - Change review
@@ -0,0 +1,74 @@
1
+ # Onboarding to an empty workspace
2
+
3
+ A new workspace shows a short setup checklist in the sidebar and empty states that each offer one way in: create, import or start from a template.
4
+
5
+ Kind: pattern · Group: Patterns: general
6
+
7
+ **Problem:** A new team lands on empty tables and a blank assistant. Product tours get skipped and forgotten, and each feature invents its own first-run screen.
8
+
9
+ **Solution:** "Get set up 3 / 5" sits in the sidebar until done or dismissed. Each empty page explains what goes there and offers the fastest way in. Templates open as drafts, never run on their own.
10
+
11
+ **Built from:** App shell and sidebar navigation, Empty state, Templates gallery, Connected tools, Assistant side panel, Button, Setup checklist, Onboarding step
12
+
13
+ ## How it works
14
+
15
+ 1. Show a setup checklist in the sidebar with a count ("Get set up 3 / 5") and the next step underneath.
16
+ 2. Each step is an action people need anyway: connect your careers page, invite the team, create a first listing, set team instructions, try a saved task.
17
+ 3. Steps complete themselves when the thing is done anywhere in the product.
18
+ 4. Each empty page explains what will appear and offers one primary way in, with import or a template as the second.
19
+ 5. Templates open as an editable draft that names the tools it uses. Nothing runs until the person chooses Run.
20
+ 6. The checklist can be dismissed and reopened from Settings.
21
+
22
+ ## When to use
23
+
24
+ - For a new workspace, and for a feature someone opens for the first time (a blank slate).
25
+
26
+ ## When not to use
27
+
28
+ - Don't open a product tour or deck of cards on first login; show help when people reach the feature.
29
+ - For a list that is empty because of filters. Use the zero results state.
30
+
31
+ ## Guidelines
32
+
33
+ - Keep the checklist to five steps or fewer, ordered by value to the team.
34
+ - Offer starter content (sample listings) only if it is clearly marked and easy to remove; keep a plain empty state for when it is gone.
35
+ - Show help in context and on request, not up front.
36
+ - The assistant's empty state offers two or three tasks based on what is on screen, not a blank "How can I help?".
37
+ - Say early what the assistant can and can't do with the workspace's data.
38
+ - Track checklist steps as tasks done or not done, not progress inside a task. A step left halfway still shows as not done.
39
+ - Recommend a setting when it helps, but never stop people choosing another one. Warn only when their choice blocks the goal of the step.
40
+ - Show steps that can't start yet and say what they need first, such as "Connect your careers page first". Don't hide them.
41
+ - Support both people who read first and people who try first: a short line and Learn more on each step, and an action that starts the task straight away.
42
+ - Once the checklist is dismissed it stays dismissed on every page until reopened from Settings.
43
+
44
+ ## Content
45
+
46
+ - Blank slate titles invite the action: "Create your first listing". Body says why in one sentence.
47
+ - Checklist steps start with a verb and say the benefit: "Connect your careers page to import roles automatically".
48
+
49
+ ## Accessibility
50
+
51
+ - The checklist progress is text ("3 of 5 done"), not only a ring.
52
+ - Completing a step is announced as a status message.
53
+ - Recommendation popovers attached to a step open one at a time, never on their own, and close with Esc.
54
+
55
+ ## Do
56
+
57
+ - Do show progress through setup.
58
+ - Do give every empty page a way in.
59
+
60
+ ## Don't
61
+
62
+ - Don't block the product behind a setup wizard.
63
+ - Don't run a template without the person choosing Run.
64
+
65
+ ## Related
66
+
67
+ - Empty, loading and error states
68
+ - Saved tasks and schedules
69
+ - Ask about what's on screen
70
+ - Empty state
71
+ - Templates gallery
72
+ - Onboarding step
73
+ - Setup checklist
74
+ - Sign in
@@ -0,0 +1,48 @@
1
+ # Writing
2
+
3
+ TwoUX speaks plain UK English. Buttons start with a verb, everything is in sentence case, and every message says what happened and what to do next. AI is described by what it does, never as smart or magic. How the copy should sound is set in Voice and tone.
4
+
5
+ Kind: foundation · Group: Key principles
6
+
7
+ ## Principles
8
+
9
+ - Plain English first.
10
+ - Say what happened, then what to do. Error messages should state the problem in plain language and point to a fix.
11
+ - Verbs on actions. Lead buttons with a verb that says what will happen.
12
+ - Same thing, same word, everywhere.
13
+
14
+ ## Guidelines
15
+
16
+ - UK English spelling and conventions: organise, colour, licence (noun); dates as 6 November 2026 with no ordinal; numerals for all numbers including 2 to 9; commas in numbers over 999.
17
+ - Sentence case for everything: headings, buttons, tabs, menu items, column headers.
18
+ - Buttons: verb first, 2 to 4 words, a noun when the target is unclear. 'Close listing', 'Extend 30 days', 'Export CSV'. Never 'OK'; name the action.
19
+ - Errors and empty states: what happened, why if useful, one action. 'No listings match these filters. Clear filters.' Do not blame the user.
20
+ - Confirmations: past tense and a count. '3 listings closed. Undo'.
21
+ - Device-independent words: select or choose, not click.
22
+ - No exclamation marks and no 'please'.
23
+ - AI: describe the job, not the technology. 'Ask', 'Draft a reply', 'Summarise applicants'. Mark generated output with AiOrigin ('Assistant · from …') beside it, never a 'Generated by AI' badge or an AI colour. Do not write AI-powered, magic, smart or intelligent.
24
+ - Common contractions (can't, isn't, you're) are fine. Write 'not' in full when the negative is the point and could be missed: 'Do not close this window while the import runs.'
25
+
26
+ ## Accessibility
27
+
28
+ - Error messages include a suggested fix when one is known.
29
+ - Button text and accessible names match, so speech users can say what they see.
30
+ - Never refer to things by position or colour alone ('the red one', 'above'); avoid directional language.
31
+
32
+ ## Do
33
+
34
+ - 'Listing closed. It no longer appears on your careers page.'
35
+ - 'Couldn't save' becomes 'Changes not saved. Check your connection and try again.'
36
+
37
+ ## Don't
38
+
39
+ - Do not write 'Oops! Something went wrong.'
40
+ - Do not write 'Smart suggestions' or 'AI-powered search'.
41
+ - Do not use Title Case In Buttons.
42
+
43
+ ## Related
44
+
45
+ - Voice and tone
46
+ - Consistency
47
+ - Iconography
48
+ - Accessibility