prime-ui-kit 0.15.0 → 0.16.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (1105) hide show
  1. package/README.md +72 -63
  2. package/dist/chunks/{chunk-XJAVS6FH.js → chunk-4PSQ64S4.js} +3094 -1750
  3. package/dist/chunks/{chunk-THFZIHKU.js → chunk-6TPHKCUJ.js} +9392 -9225
  4. package/dist/chunks/{chunk-6TI4DSM5.js → chunk-A7OQWH6R.js} +1 -1
  5. package/dist/chunks/{chunk-2IKH55MI.js → chunk-HDBQICPW.js} +170 -138
  6. package/dist/chunks/{chunk-Q3BFRQHZ.js → chunk-U3Q2I3MY.js} +169 -10
  7. package/dist/color-picker.js +3 -3
  8. package/dist/components/accordion/Accordion.d.ts +52 -5
  9. package/dist/components/avatar/Avatar.d.ts +31 -8
  10. package/dist/components/badge/Badge.d.ts +93 -25
  11. package/dist/components/banner/Banner.d.ts +17 -10
  12. package/dist/components/breadcrumb/Breadcrumb.d.ts +18 -5
  13. package/dist/components/button/Button.d.ts +102 -43
  14. package/dist/components/button-group/ButtonGroup.d.ts +32 -8
  15. package/dist/components/card/Card.d.ts +15 -9
  16. package/dist/components/chart-frame/ChartFrame.d.ts +58 -51
  17. package/dist/components/chat/Chat.d.ts +77 -38
  18. package/dist/components/chat/ChatPinned.d.ts +20 -8
  19. package/dist/components/chat/ChatRows.d.ts +3 -0
  20. package/dist/components/chat/MessageList.d.ts +14 -19
  21. package/dist/components/chat/chatContext.d.ts +3 -3
  22. package/dist/components/chat/messageFlow.d.ts +1 -1
  23. package/dist/components/chat-list/ChatList.d.ts +88 -34
  24. package/dist/components/checkbox/Checkbox.d.ts +61 -12
  25. package/dist/components/code-block/CodeBlock.d.ts +11 -5
  26. package/dist/components/color-field/ColorField.d.ts +54 -14
  27. package/dist/components/color-picker/ColorPicker.d.ts +64 -30
  28. package/dist/components/color-picker/ColorPresets.d.ts +68 -13
  29. package/dist/components/color-swatches/ColorSwatches.d.ts +90 -18
  30. package/dist/components/command-menu/CommandMenu.d.ts +86 -27
  31. package/dist/components/composer/Composer.d.ts +82 -41
  32. package/dist/components/composer/useRecorder.d.ts +0 -2
  33. package/dist/components/confirm-dialog/ConfirmDialog.d.ts +40 -16
  34. package/dist/components/crossfade/Crossfade.d.ts +5 -8
  35. package/dist/components/data-table/ColumnsMenu.d.ts +6 -2
  36. package/dist/components/data-table/DataTable.d.ts +157 -58
  37. package/dist/components/data-table/Footer.d.ts +2 -4
  38. package/dist/components/data-table/Row.d.ts +1 -1
  39. package/dist/components/data-table/StateRows.d.ts +2 -2
  40. package/dist/components/data-table/reorder.d.ts +10 -10
  41. package/dist/components/data-table/types.d.ts +5 -0
  42. package/dist/components/data-table/useInfiniteRows.d.ts +3 -3
  43. package/dist/components/datepicker/Datepicker.d.ts +61 -12
  44. package/dist/components/datepicker/DatepickerPanel.d.ts +76 -16
  45. package/dist/components/datepicker/panelLayout.d.ts +6 -11
  46. package/dist/components/description-list/DescriptionList.d.ts +40 -11
  47. package/dist/components/digit-input/DigitInput.d.ts +50 -19
  48. package/dist/components/divider/Divider.d.ts +15 -5
  49. package/dist/components/dnd/Dnd.d.ts +152 -41
  50. package/dist/components/dnd/geometry.d.ts +0 -8
  51. package/dist/components/dnd/labels.d.ts +1 -1
  52. package/dist/components/dnd/useDropTarget.d.ts +0 -2
  53. package/dist/components/dnd/useSortableList.d.ts +6 -1
  54. package/dist/components/drawer/Drawer.d.ts +39 -18
  55. package/dist/components/dropdown/Dropdown.d.ts +90 -19
  56. package/dist/components/empty-page/EmptyPage.d.ts +14 -15
  57. package/dist/components/example-frame/ExampleFrame.d.ts +38 -8
  58. package/dist/components/field-list/FieldList.d.ts +57 -19
  59. package/dist/components/fieldset/Fieldset.d.ts +12 -7
  60. package/dist/components/file-upload/FileUpload.d.ts +119 -42
  61. package/dist/components/gallery/Gallery.d.ts +44 -16
  62. package/dist/components/gallery/layout.d.ts +4 -1
  63. package/dist/components/gantt/Gantt.d.ts +69 -34
  64. package/dist/components/gantt/GanttRow.d.ts +2 -2
  65. package/dist/components/hint/Hint.d.ts +10 -4
  66. package/dist/components/index.d.ts +19 -18
  67. package/dist/components/input/Input.d.ts +78 -25
  68. package/dist/components/kanban/Kanban.d.ts +64 -36
  69. package/dist/components/kbd/Kbd.d.ts +3 -1
  70. package/dist/components/label/Label.d.ts +33 -4
  71. package/dist/components/link-button/LinkButton.d.ts +40 -10
  72. package/dist/components/list/List.d.ts +48 -26
  73. package/dist/components/login-form/LoginForm.d.ts +66 -7
  74. package/dist/components/media-viewer/MediaViewer.d.ts +46 -18
  75. package/dist/components/media-viewer/physics.d.ts +0 -2
  76. package/dist/components/media-viewer/viewerEngine.d.ts +0 -1
  77. package/dist/components/message/Message.d.ts +27 -16
  78. package/dist/components/message/MessageCards.d.ts +49 -10
  79. package/dist/components/message/MessageFile.d.ts +19 -5
  80. package/dist/components/message/MessageParts.d.ts +44 -18
  81. package/dist/components/message/MessageReactionBar.d.ts +3 -1
  82. package/dist/components/message/MessageTyping.d.ts +10 -6
  83. package/dist/components/message/bubbleMorph.d.ts +2 -0
  84. package/dist/components/modal/Modal.d.ts +6 -6
  85. package/dist/components/native-select/NativeSelect.d.ts +22 -7
  86. package/dist/components/notification/Notification.d.ts +35 -11
  87. package/dist/components/notification/NotificationStore.d.ts +12 -3
  88. package/dist/components/page-content/PageContent.d.ts +56 -37
  89. package/dist/components/page-toolbar/PageToolbar.d.ts +7 -6
  90. package/dist/components/pagination/Pagination.d.ts +25 -6
  91. package/dist/components/popover/Popover.d.ts +54 -31
  92. package/dist/components/progress-bar/ProgressBar.d.ts +37 -12
  93. package/dist/components/progress-circle/ProgressCircle.d.ts +32 -13
  94. package/dist/components/radio/Radio.d.ts +58 -15
  95. package/dist/components/scroll-container/ScrollContainer.d.ts +28 -14
  96. package/dist/components/scroll-container/useScrollEdges.d.ts +1 -24
  97. package/dist/components/segmented-control/SegmentedControl.d.ts +73 -15
  98. package/dist/components/select/Select.d.ts +104 -30
  99. package/dist/components/select/SelectItem.d.ts +35 -8
  100. package/dist/components/select/selectContext.d.ts +7 -19
  101. package/dist/components/sheet/Sheet.d.ts +32 -15
  102. package/dist/components/skeleton/Skeleton.d.ts +9 -3
  103. package/dist/components/slider/Slider.d.ts +55 -15
  104. package/dist/components/smart-filter/SmartFilter.d.ts +39 -12
  105. package/dist/components/sparkline/Sparkline.d.ts +42 -19
  106. package/dist/components/spinner/Spinner.d.ts +11 -5
  107. package/dist/components/stepper/Stepper.d.ts +41 -19
  108. package/dist/components/switch/Switch.d.ts +37 -12
  109. package/dist/components/tabs/Tabs.d.ts +61 -18
  110. package/dist/components/tag-select/TagSelect.d.ts +74 -20
  111. package/dist/components/textarea/Textarea.d.ts +52 -25
  112. package/dist/components/thumbnail/Thumbnail.d.ts +50 -20
  113. package/dist/components/timeline/Timeline.d.ts +85 -66
  114. package/dist/components/tooltip/Tooltip.d.ts +47 -17
  115. package/dist/components/typography/Typography.d.ts +32 -6
  116. package/dist/components/video-note/VideoNote.d.ts +7 -1
  117. package/dist/{internal → components/visually-hidden}/VisuallyHidden.d.ts +5 -5
  118. package/dist/components/voice-player/VoicePlayer.d.ts +16 -3
  119. package/dist/hooks/breakpoints.d.ts +10 -0
  120. package/dist/hooks/floatingPosition.d.ts +42 -0
  121. package/dist/hooks/useDraft.d.ts +12 -0
  122. package/dist/hooks/useEdgeOverflow.d.ts +5 -3
  123. package/dist/hooks/useElementSize.d.ts +31 -0
  124. package/dist/hooks/useEnterConfirm.d.ts +2 -1
  125. package/dist/hooks/useImageStatus.d.ts +12 -5
  126. package/dist/hooks/useLoadMore.d.ts +28 -0
  127. package/dist/hooks/useMediaQuery.d.ts +1 -3
  128. package/dist/hooks/useMergedRefs.d.ts +10 -4
  129. package/dist/hooks/useModalLayer.d.ts +13 -7
  130. package/dist/hooks/usePosition.d.ts +4 -42
  131. package/dist/hooks/usePresence.d.ts +4 -7
  132. package/dist/hooks/useScrollRegion.d.ts +28 -0
  133. package/dist/hooks/useStableValue.d.ts +6 -0
  134. package/dist/hooks/useSwipeDismiss.d.ts +38 -17
  135. package/dist/hooks/useVirtualRows.d.ts +9 -3
  136. package/dist/icon-set.js +2 -2
  137. package/dist/icons/Icon.d.ts +1 -1
  138. package/dist/icons/glyph.d.ts +9 -2
  139. package/dist/index.css +1 -1
  140. package/dist/index.js +13 -3
  141. package/dist/internal/AnchorRectContext.d.ts +2 -1
  142. package/dist/internal/ChartTooltip.d.ts +1 -1
  143. package/dist/internal/CheckMark.d.ts +2 -2
  144. package/dist/internal/ChoiceField.d.ts +29 -10
  145. package/dist/internal/ControlSizeContext.d.ts +16 -0
  146. package/dist/internal/Disclosure.d.ts +38 -9
  147. package/dist/internal/FieldAction.d.ts +20 -12
  148. package/dist/internal/FieldCommit.d.ts +8 -11
  149. package/dist/internal/FieldFrame.d.ts +100 -21
  150. package/dist/internal/MenuGroup.d.ts +3 -1
  151. package/dist/internal/MorphText.d.ts +2 -1
  152. package/dist/internal/ProgressLegend.d.ts +3 -2
  153. package/dist/internal/RegionSwap.d.ts +41 -0
  154. package/dist/internal/RollingNumber.d.ts +10 -1
  155. package/dist/internal/RowAction.d.ts +26 -0
  156. package/dist/internal/SwitcherScroller.d.ts +11 -0
  157. package/dist/internal/attachmentTile.d.ts +1 -1
  158. package/dist/internal/audio.d.ts +13 -0
  159. package/dist/{components/badge/tier.d.ts → internal/chipTier.d.ts} +7 -5
  160. package/dist/internal/context.d.ts +10 -1
  161. package/dist/internal/controlValue.d.ts +7 -0
  162. package/dist/internal/edgeAutoScroll.d.ts +43 -25
  163. package/dist/internal/fieldCell.d.ts +4 -3
  164. package/dist/internal/fieldClasses.d.ts +15 -2
  165. package/dist/internal/fileSize.d.ts +5 -1
  166. package/dist/internal/formatClock.d.ts +2 -0
  167. package/dist/internal/formatNumber.d.ts +6 -0
  168. package/dist/internal/glyphSwap.d.ts +5 -9
  169. package/dist/internal/hasContent.d.ts +6 -0
  170. package/dist/internal/highlightTsx.d.ts +12 -0
  171. package/dist/internal/iconBox.d.ts +6 -0
  172. package/dist/internal/iconLayout.d.ts +2 -1
  173. package/dist/internal/imageSlot.d.ts +6 -1
  174. package/dist/internal/interactiveElement.d.ts +41 -0
  175. package/dist/internal/labels.d.ts +6 -0
  176. package/dist/internal/leaveInPlace.d.ts +6 -5
  177. package/dist/internal/listPresence.d.ts +32 -0
  178. package/dist/internal/listbox.d.ts +71 -31
  179. package/dist/internal/longPress.d.ts +42 -0
  180. package/dist/internal/mediaDisk.d.ts +7 -4
  181. package/dist/internal/mediaPlayer.d.ts +91 -27
  182. package/dist/internal/mediaSession.d.ts +0 -6
  183. package/dist/internal/messageList.d.ts +4 -3
  184. package/dist/internal/motionTiming.d.ts +34 -0
  185. package/dist/internal/namedRole.d.ts +13 -0
  186. package/dist/internal/nodeText.d.ts +6 -0
  187. package/dist/{components/modal → internal/overlay}/DialogGuard.d.ts +3 -5
  188. package/dist/{components/modal → internal/overlay}/DialogParts.d.ts +86 -89
  189. package/dist/internal/overlay/FloatingPanel.d.ts +27 -5
  190. package/dist/internal/overlay/ModalDialog.d.ts +59 -0
  191. package/dist/internal/overlay/focus.d.ts +29 -5
  192. package/dist/internal/overlay/layerStack.d.ts +8 -5
  193. package/dist/internal/overlay/useAnchorName.d.ts +14 -0
  194. package/dist/internal/overlay/useContainScroll.d.ts +7 -0
  195. package/dist/internal/overlay/useFloatingLayer.d.ts +43 -14
  196. package/dist/internal/overlay/useOpenState.d.ts +22 -0
  197. package/dist/internal/partPresence.d.ts +31 -0
  198. package/dist/internal/parts.d.ts +39 -0
  199. package/dist/internal/progressSegments.d.ts +52 -12
  200. package/dist/internal/richText.d.ts +6 -34
  201. package/dist/internal/ring.d.ts +18 -8
  202. package/dist/internal/rovingFocus.d.ts +10 -5
  203. package/dist/{components/data-table/rowEvents.d.ts → internal/rowLink.d.ts} +0 -5
  204. package/dist/internal/scrollAncestors.d.ts +14 -0
  205. package/dist/internal/selectionIndicator.d.ts +27 -0
  206. package/dist/internal/slot.d.ts +53 -5
  207. package/dist/internal/states.d.ts +61 -0
  208. package/dist/internal/sticky.d.ts +5 -1
  209. package/dist/internal/swallowNextClick.d.ts +9 -0
  210. package/dist/internal/swatch.d.ts +59 -15
  211. package/dist/internal/textFormatting.d.ts +2 -1
  212. package/dist/internal/textFormattingToolbar.d.ts +3 -2
  213. package/dist/internal/tokenDefaults.d.ts +21 -0
  214. package/dist/internal/touchTarget.d.ts +5 -0
  215. package/dist/internal/transcript.d.ts +19 -18
  216. package/dist/internal/transfer.d.ts +22 -8
  217. package/dist/internal/transferDisk.d.ts +2 -3
  218. package/dist/internal/useFlipList.d.ts +44 -0
  219. package/dist/internal/useNearView.d.ts +4 -3
  220. package/dist/internal/usePendingChanges.d.ts +23 -0
  221. package/dist/internal/useRangeSelection.d.ts +2 -1
  222. package/dist/layout/app-header/AppHeader.d.ts +29 -20
  223. package/dist/layout/app-shell/AppShell.d.ts +72 -8
  224. package/dist/layout/bottom-nav/BottomNav.d.ts +58 -22
  225. package/dist/layout/index.d.ts +2 -2
  226. package/dist/layout/sidebar/Sidebar.d.ts +232 -101
  227. package/dist/skill/SKILL.md +10 -10
  228. package/dist/skill/anti-slop.md +105 -24
  229. package/dist/skill/api-contract.md +115 -35
  230. package/dist/skill/cheatsheet.md +37 -37
  231. package/dist/skill/checklist.md +57 -89
  232. package/dist/skill/choosing.md +23 -25
  233. package/dist/skill/components.md +50 -48
  234. package/dist/skill/composition.md +68 -58
  235. package/dist/skill/foundations.md +31 -24
  236. package/dist/skill/layouts.md +81 -83
  237. package/dist/skill/motion.md +26 -31
  238. package/dist/skill/reference/components/accordion/COMPONENT.md +16 -9
  239. package/dist/skill/reference/components/accordion/examples/overview.tsx +2 -2
  240. package/dist/skill/reference/components/accordion/examples/sizes.tsx +6 -8
  241. package/dist/skill/reference/components/accordion/examples/states.tsx +27 -24
  242. package/dist/skill/reference/components/accordion/examples/variants.tsx +6 -8
  243. package/dist/skill/reference/components/accordion/examples/with-icon.tsx +22 -19
  244. package/dist/skill/reference/components/avatar/COMPONENT.md +23 -16
  245. package/dist/skill/reference/components/avatar/examples/examples.module.css +1 -4
  246. package/dist/skill/reference/components/avatar/examples/overview.tsx +3 -3
  247. package/dist/skill/reference/components/avatar/examples/presence.tsx +4 -4
  248. package/dist/skill/reference/components/avatar/examples/src-from-state.tsx +3 -3
  249. package/dist/skill/reference/components/avatar/examples/states.tsx +4 -4
  250. package/dist/skill/reference/components/avatar/examples/team-group.tsx +2 -2
  251. package/dist/skill/reference/components/badge/COMPONENT.md +66 -34
  252. package/dist/skill/reference/components/badge/examples/controlled.tsx +32 -0
  253. package/dist/skill/reference/components/badge/examples/examples.module.css +2 -2
  254. package/dist/skill/reference/components/badge/examples/filter-values.tsx +4 -6
  255. package/dist/skill/reference/components/badge/examples/in-controls.tsx +1 -1
  256. package/dist/skill/reference/components/badge/examples/overview.tsx +6 -5
  257. package/dist/skill/reference/components/badge/examples/square.tsx +21 -0
  258. package/dist/skill/reference/components/badge/examples/states.tsx +4 -4
  259. package/dist/skill/reference/components/badge/examples/with-icon.tsx +10 -1
  260. package/dist/skill/reference/components/banner/COMPONENT.md +9 -5
  261. package/dist/skill/reference/components/banner/examples/dismissible.tsx +3 -19
  262. package/dist/skill/reference/components/banner/examples/overview.tsx +1 -1
  263. package/dist/skill/reference/components/breadcrumb/COMPONENT.md +17 -11
  264. package/dist/skill/reference/components/breadcrumb/examples/examples.module.css +1 -1
  265. package/dist/skill/reference/components/breadcrumb/examples/overflow.tsx +1 -1
  266. package/dist/skill/reference/components/breadcrumb/examples/sizes.tsx +6 -8
  267. package/dist/skill/reference/components/breadcrumb/examples/with-icon.tsx +15 -8
  268. package/dist/skill/reference/components/button/COMPONENT.md +66 -30
  269. package/dist/skill/reference/components/button/examples/align.tsx +25 -0
  270. package/dist/skill/reference/components/button/examples/controlled.tsx +21 -0
  271. package/dist/skill/reference/components/button/examples/density.tsx +45 -0
  272. package/dist/skill/reference/components/button/examples/examples.module.css +14 -25
  273. package/dist/skill/reference/components/button/examples/label-morph.tsx +1 -1
  274. package/dist/skill/reference/components/button/examples/on-colored-host.tsx +19 -19
  275. package/dist/skill/reference/components/button/examples/over-media.tsx +7 -1
  276. package/dist/skill/reference/components/button/examples/toggle.tsx +2 -10
  277. package/dist/skill/reference/components/button-group/COMPONENT.md +21 -15
  278. package/dist/skill/reference/components/button-group/examples/controlled.tsx +1 -1
  279. package/dist/skill/reference/components/card/COMPONENT.md +16 -5
  280. package/dist/skill/reference/components/card/examples/content-templates.tsx +8 -2
  281. package/dist/skill/reference/components/card/examples/examples.module.css +4 -16
  282. package/dist/skill/reference/components/card/examples/overview.tsx +11 -11
  283. package/dist/skill/reference/components/card/examples/screen.tsx +9 -8
  284. package/dist/skill/reference/components/card/examples/variants.tsx +74 -47
  285. package/dist/skill/reference/components/chart-frame/COMPONENT.md +24 -28
  286. package/dist/skill/reference/components/chart-frame/examples/controlled.tsx +9 -7
  287. package/dist/skill/reference/components/chart-frame/examples/fill-height.tsx +4 -6
  288. package/dist/skill/reference/components/chart-frame/examples/narrow.tsx +24 -5
  289. package/dist/skill/reference/components/chart-frame/examples/overview.tsx +5 -2
  290. package/dist/skill/reference/components/chart-frame/examples/states.tsx +72 -64
  291. package/dist/skill/reference/components/chart-frame/examples/tooltip.tsx +27 -26
  292. package/dist/skill/reference/components/chat/COMPONENT.md +35 -22
  293. package/dist/skill/reference/components/chat/examples/group-chat.tsx +2 -2
  294. package/dist/skill/reference/components/chat/examples/overview.tsx +119 -130
  295. package/dist/skill/reference/components/chat/examples/reactions.tsx +18 -23
  296. package/dist/skill/reference/components/chat/examples/screen.tsx +108 -131
  297. package/dist/skill/reference/components/chat/examples/states.tsx +23 -22
  298. package/dist/skill/reference/components/chat-list/COMPONENT.md +10 -5
  299. package/dist/skill/reference/components/chat-list/examples/examples.module.css +0 -8
  300. package/dist/skill/reference/components/chat-list/examples/live.tsx +29 -22
  301. package/dist/skill/reference/components/chat-list/examples/sizes.tsx +6 -8
  302. package/dist/skill/reference/components/chat-list/examples/states.tsx +42 -38
  303. package/dist/skill/reference/components/checkbox/COMPONENT.md +27 -14
  304. package/dist/skill/reference/components/checkbox/examples/controlled.tsx +18 -16
  305. package/dist/skill/reference/components/checkbox/examples/examples.module.css +14 -56
  306. package/dist/skill/reference/components/checkbox/examples/in-form.tsx +16 -16
  307. package/dist/skill/reference/components/checkbox/examples/indicator.tsx +19 -64
  308. package/dist/skill/reference/components/checkbox/examples/overview.tsx +1 -1
  309. package/dist/skill/reference/components/checkbox/examples/states.tsx +1 -1
  310. package/dist/skill/reference/components/checkbox/examples/without-label.tsx +1 -1
  311. package/dist/skill/reference/components/code-block/COMPONENT.md +16 -12
  312. package/dist/skill/reference/components/code-block/examples/examples.module.css +5 -2
  313. package/dist/skill/reference/components/code-block/examples/narrow.tsx +1 -1
  314. package/dist/skill/reference/components/color-field/COMPONENT.md +15 -9
  315. package/dist/skill/reference/components/color-field/examples/examples.module.css +4 -5
  316. package/dist/skill/reference/components/color-field/examples/in-form.tsx +15 -13
  317. package/dist/skill/reference/components/color-field/examples/sizes.tsx +5 -1
  318. package/dist/skill/reference/components/color-field/examples/states.tsx +15 -3
  319. package/dist/skill/reference/components/color-picker/COMPONENT.md +55 -19
  320. package/dist/skill/reference/components/color-picker/examples/controlled.tsx +16 -5
  321. package/dist/skill/reference/components/color-picker/examples/examples.module.css +6 -7
  322. package/dist/skill/reference/components/color-picker/examples/in-form.tsx +24 -22
  323. package/dist/skill/reference/components/color-picker/examples/overview.tsx +1 -1
  324. package/dist/skill/reference/components/color-picker/examples/panel.tsx +1 -1
  325. package/dist/skill/reference/components/color-picker/examples/sizes.tsx +9 -11
  326. package/dist/skill/reference/components/color-picker/examples/states.tsx +28 -23
  327. package/dist/skill/reference/components/color-swatches/COMPONENT.md +22 -8
  328. package/dist/skill/reference/components/color-swatches/examples/examples.module.css +3 -4
  329. package/dist/skill/reference/components/color-swatches/examples/in-form.tsx +19 -17
  330. package/dist/skill/reference/components/color-swatches/examples/palette.tsx +24 -0
  331. package/dist/skill/reference/components/color-swatches/examples/wrapping.tsx +17 -2
  332. package/dist/skill/reference/components/command-menu/COMPONENT.md +60 -20
  333. package/dist/skill/reference/components/command-menu/examples/sizes.tsx +20 -15
  334. package/dist/skill/reference/components/command-menu/examples/states.tsx +46 -24
  335. package/dist/skill/reference/components/composer/COMPONENT.md +42 -24
  336. package/dist/skill/reference/components/composer/examples/examples.module.css +0 -9
  337. package/dist/skill/reference/components/composer/examples/narrow.tsx +1 -1
  338. package/dist/skill/reference/components/composer/examples/reply-edit.tsx +3 -3
  339. package/dist/skill/reference/components/composer/examples/sizes.tsx +3 -5
  340. package/dist/skill/reference/components/composer/examples/states.tsx +4 -6
  341. package/dist/skill/reference/components/confirm-dialog/COMPONENT.md +26 -13
  342. package/dist/skill/reference/components/confirm-dialog/examples/dismiss.tsx +27 -0
  343. package/dist/skill/reference/components/confirm-dialog/examples/failure.tsx +9 -16
  344. package/dist/skill/reference/components/crossfade/COMPONENT.md +11 -5
  345. package/dist/skill/reference/components/crossfade/examples/examples.module.css +1 -40
  346. package/dist/skill/reference/components/crossfade/examples/fill.tsx +16 -19
  347. package/dist/skill/reference/components/crossfade/examples/overview.tsx +14 -16
  348. package/dist/skill/reference/components/crossfade/examples/record-switch.tsx +6 -11
  349. package/dist/skill/reference/components/crossfade/examples/screen.module.css +1 -24
  350. package/dist/skill/reference/components/crossfade/examples/screen.tsx +14 -25
  351. package/dist/skill/reference/components/data-table/COMPONENT.md +31 -21
  352. package/dist/skill/reference/components/data-table/examples/controlled.tsx +14 -2
  353. package/dist/skill/reference/components/data-table/examples/examples.module.css +1 -9
  354. package/dist/skill/reference/components/data-table/examples/narrow.tsx +5 -1
  355. package/dist/skill/reference/components/data-table/examples/row-link.tsx +2 -1
  356. package/dist/skill/reference/components/data-table/examples/screen.module.css +2 -2
  357. package/dist/skill/reference/components/data-table/examples/screen.tsx +11 -10
  358. package/dist/skill/reference/components/data-table/examples/sizes.tsx +17 -17
  359. package/dist/skill/reference/components/data-table/examples/states.tsx +37 -29
  360. package/dist/skill/reference/components/datepicker/COMPONENT.md +53 -22
  361. package/dist/skill/reference/components/datepicker/examples/dismiss.tsx +15 -0
  362. package/dist/skill/reference/components/datepicker/examples/examples.module.css +3 -2
  363. package/dist/skill/reference/components/datepicker/examples/in-form.tsx +33 -25
  364. package/dist/skill/reference/components/datepicker/examples/sizes.tsx +2 -2
  365. package/dist/skill/reference/components/datepicker/examples/states.tsx +2 -2
  366. package/dist/skill/reference/components/datepicker/examples/validation.tsx +3 -3
  367. package/dist/skill/reference/components/description-list/COMPONENT.md +24 -9
  368. package/dist/skill/reference/components/description-list/examples/examples.module.css +4 -24
  369. package/dist/skill/reference/components/description-list/examples/narrow.tsx +1 -1
  370. package/dist/skill/reference/components/description-list/examples/screen.module.css +0 -18
  371. package/dist/skill/reference/components/description-list/examples/screen.tsx +19 -27
  372. package/dist/skill/reference/components/description-list/examples/sizes.tsx +2 -4
  373. package/dist/skill/reference/components/description-list/examples/structure.tsx +6 -7
  374. package/dist/skill/reference/components/description-list/examples/totals.tsx +40 -0
  375. package/dist/skill/reference/components/digit-input/COMPONENT.md +12 -6
  376. package/dist/skill/reference/components/digit-input/examples/examples.module.css +2 -2
  377. package/dist/skill/reference/components/digit-input/examples/in-form.tsx +1 -1
  378. package/dist/skill/reference/components/digit-input/examples/sizes.tsx +5 -3
  379. package/dist/skill/reference/components/digit-input/examples/states.tsx +14 -6
  380. package/dist/skill/reference/components/divider/COMPONENT.md +26 -12
  381. package/dist/skill/reference/components/divider/examples/align.tsx +2 -4
  382. package/dist/skill/reference/components/divider/examples/examples.module.css +13 -17
  383. package/dist/skill/reference/components/divider/examples/or-separator.tsx +3 -5
  384. package/dist/skill/reference/components/divider/examples/overview.tsx +18 -16
  385. package/dist/skill/reference/components/divider/examples/vertical.tsx +5 -1
  386. package/dist/skill/reference/components/divider/examples/with-icon.tsx +1 -1
  387. package/dist/skill/reference/components/dnd/COMPONENT.md +52 -34
  388. package/dist/skill/reference/components/dnd/examples/drop-zones.tsx +1 -1
  389. package/dist/skill/reference/components/dnd/examples/examples.module.css +4 -6
  390. package/dist/skill/reference/components/dnd/examples/states.tsx +41 -35
  391. package/dist/skill/reference/components/drawer/COMPONENT.md +37 -14
  392. package/dist/skill/reference/components/drawer/examples/guard.tsx +1 -3
  393. package/dist/skill/reference/components/drawer/examples/header-actions.tsx +1 -1
  394. package/dist/skill/reference/components/drawer/examples/in-form.tsx +31 -31
  395. package/dist/skill/reference/components/drawer/examples/placement.tsx +31 -26
  396. package/dist/skill/reference/components/drawer/examples/sizes.tsx +32 -27
  397. package/dist/skill/reference/components/dropdown/COMPONENT.md +58 -23
  398. package/dist/skill/reference/components/dropdown/examples/context-menu.tsx +75 -0
  399. package/dist/skill/reference/components/dropdown/examples/examples.module.css +1 -1
  400. package/dist/skill/reference/components/dropdown/examples/sizes.tsx +39 -34
  401. package/dist/skill/reference/components/dropdown/examples/states.tsx +37 -29
  402. package/dist/skill/reference/components/empty-page/COMPONENT.md +20 -9
  403. package/dist/skill/reference/components/empty-page/examples/compact.tsx +28 -18
  404. package/dist/skill/reference/components/empty-page/examples/examples.module.css +0 -43
  405. package/dist/skill/reference/components/empty-page/examples/narrow.tsx +3 -3
  406. package/dist/skill/reference/components/empty-page/examples/region-error.tsx +6 -11
  407. package/dist/skill/reference/components/empty-page/examples/sizes.tsx +13 -13
  408. package/dist/skill/reference/components/empty-page/examples/variants.tsx +34 -30
  409. package/dist/skill/reference/components/example-frame/COMPONENT.md +21 -9
  410. package/dist/skill/reference/components/example-frame/examples/controlled.tsx +3 -3
  411. package/dist/skill/reference/components/field-list/COMPONENT.md +14 -8
  412. package/dist/skill/reference/components/field-list/examples/sizes.tsx +32 -26
  413. package/dist/skill/reference/components/field-list/examples/states.tsx +37 -31
  414. package/dist/skill/reference/components/fieldset/COMPONENT.md +10 -5
  415. package/dist/skill/reference/components/fieldset/examples/examples.module.css +1 -1
  416. package/dist/skill/reference/components/file-upload/COMPONENT.md +67 -29
  417. package/dist/skill/reference/components/file-upload/examples/avatar-upload.tsx +5 -5
  418. package/dist/skill/reference/components/file-upload/examples/custom-body.tsx +12 -7
  419. package/dist/skill/reference/components/file-upload/examples/examples.module.css +4 -4
  420. package/dist/skill/reference/components/file-upload/examples/narrow.tsx +1 -1
  421. package/dist/skill/reference/components/file-upload/examples/row-parts.tsx +4 -4
  422. package/dist/skill/reference/components/file-upload/examples/screen.module.css +2 -2
  423. package/dist/skill/reference/components/file-upload/examples/screen.tsx +6 -4
  424. package/dist/skill/reference/components/file-upload/examples/sizes.tsx +1 -3
  425. package/dist/skill/reference/components/file-upload/examples/states.tsx +1 -3
  426. package/dist/skill/reference/components/file-upload/examples/variants.tsx +13 -7
  427. package/dist/skill/reference/components/gallery/COMPONENT.md +16 -7
  428. package/dist/skill/reference/components/gallery/examples/album-sizes.tsx +52 -0
  429. package/dist/skill/reference/components/gallery/examples/controlled.tsx +40 -0
  430. package/dist/skill/reference/components/gallery/examples/examples.module.css +1 -1
  431. package/dist/skill/reference/components/gallery/examples/overview.tsx +15 -43
  432. package/dist/skill/reference/components/gallery/examples/transfer.tsx +22 -13
  433. package/dist/skill/reference/components/gantt/COMPONENT.md +21 -15
  434. package/dist/skill/reference/components/gantt/examples/examples.module.css +0 -16
  435. package/dist/skill/reference/components/gantt/examples/occupancy.tsx +2 -2
  436. package/dist/skill/reference/components/gantt/examples/screen.tsx +2 -2
  437. package/dist/skill/reference/components/gantt/examples/sizes.tsx +16 -16
  438. package/dist/skill/reference/components/gantt/examples/states.tsx +34 -30
  439. package/dist/skill/reference/components/gantt/examples/variants.tsx +27 -25
  440. package/dist/skill/reference/components/hint/COMPONENT.md +24 -14
  441. package/dist/skill/reference/components/hint/examples/examples.module.css +1 -1
  442. package/dist/skill/reference/components/hint/examples/hint-or-error.tsx +2 -2
  443. package/dist/skill/reference/components/hint/examples/overview.tsx +9 -10
  444. package/dist/skill/reference/components/hint/examples/sizes.tsx +1 -1
  445. package/dist/skill/reference/components/input/COMPONENT.md +10 -6
  446. package/dist/skill/reference/components/input/examples/affixes.tsx +2 -2
  447. package/dist/skill/reference/components/input/examples/examples.module.css +1 -1
  448. package/dist/skill/reference/components/input/examples/sizes.tsx +9 -5
  449. package/dist/skill/reference/components/input/examples/states.tsx +39 -23
  450. package/dist/skill/reference/components/input/examples/with-icon.tsx +24 -16
  451. package/dist/skill/reference/components/kanban/COMPONENT.md +30 -24
  452. package/dist/skill/reference/components/kanban/examples/columns.tsx +14 -19
  453. package/dist/skill/reference/components/kanban/examples/item-link.tsx +2 -2
  454. package/dist/skill/reference/components/kanban/examples/limits.tsx +1 -1
  455. package/dist/skill/reference/components/kanban/examples/narrow.tsx +1 -1
  456. package/dist/skill/reference/components/kanban/examples/screen.module.css +1 -3
  457. package/dist/skill/reference/components/kanban/examples/screen.tsx +6 -4
  458. package/dist/skill/reference/components/kanban/examples/states.tsx +37 -58
  459. package/dist/skill/reference/components/kanban/examples/variants.tsx +0 -3
  460. package/dist/skill/reference/components/kbd/COMPONENT.md +10 -6
  461. package/dist/skill/reference/components/kbd/examples/examples.module.css +1 -20
  462. package/dist/skill/reference/components/kbd/examples/in-controls.tsx +2 -2
  463. package/dist/skill/reference/components/kbd/examples/shortcut-list.tsx +14 -26
  464. package/dist/skill/reference/components/label/COMPONENT.md +26 -11
  465. package/dist/skill/reference/components/label/examples/examples.module.css +3 -11
  466. package/dist/skill/reference/components/label/examples/overview.tsx +5 -9
  467. package/dist/skill/reference/components/label/examples/structure.tsx +2 -2
  468. package/dist/skill/reference/components/link-button/COMPONENT.md +33 -20
  469. package/dist/skill/reference/components/link-button/examples/as-child.tsx +1 -1
  470. package/dist/skill/reference/components/link-button/examples/external-link.tsx +1 -1
  471. package/dist/skill/reference/components/link-button/examples/overview.tsx +4 -2
  472. package/dist/skill/reference/components/link-button/examples/variants.tsx +2 -2
  473. package/dist/skill/reference/components/list/COMPONENT.md +24 -16
  474. package/dist/skill/reference/components/list/examples/examples.module.css +0 -8
  475. package/dist/skill/reference/components/list/examples/overflow.tsx +1 -1
  476. package/dist/skill/reference/components/list/examples/overview.tsx +31 -30
  477. package/dist/skill/reference/components/list/examples/sizes.tsx +23 -23
  478. package/dist/skill/reference/components/list/examples/states.tsx +38 -21
  479. package/dist/skill/reference/components/list/examples/with-icon.tsx +16 -14
  480. package/dist/skill/reference/components/login-form/COMPONENT.md +69 -16
  481. package/dist/skill/reference/components/login-form/examples/narrow.tsx +1 -1
  482. package/dist/skill/reference/components/login-form/examples/register.tsx +1 -1
  483. package/dist/skill/reference/components/media-viewer/COMPONENT.md +12 -8
  484. package/dist/skill/reference/components/media-viewer/examples/examples.module.css +2 -2
  485. package/dist/skill/reference/components/media-viewer/examples/video.tsx +1 -1
  486. package/dist/skill/reference/components/message/COMPONENT.md +102 -46
  487. package/dist/skill/reference/components/message/examples/typing.tsx +5 -5
  488. package/dist/skill/reference/components/modal/COMPONENT.md +71 -37
  489. package/dist/skill/reference/components/modal/examples/dismiss.tsx +35 -27
  490. package/dist/skill/reference/components/modal/examples/enter-key.tsx +22 -25
  491. package/dist/skill/reference/components/modal/examples/examples.module.css +0 -7
  492. package/dist/skill/reference/components/modal/examples/guard.tsx +2 -4
  493. package/dist/skill/reference/components/modal/examples/in-form.tsx +28 -28
  494. package/dist/skill/reference/components/modal/examples/long-content.tsx +6 -4
  495. package/dist/skill/reference/components/modal/examples/sizes.tsx +36 -31
  496. package/dist/skill/reference/components/modal/examples/structure.tsx +1 -1
  497. package/dist/skill/reference/components/native-select/COMPONENT.md +7 -3
  498. package/dist/skill/reference/components/native-select/examples/examples.module.css +3 -3
  499. package/dist/skill/reference/components/native-select/examples/in-form.tsx +28 -29
  500. package/dist/skill/reference/components/native-select/examples/sizes.tsx +2 -2
  501. package/dist/skill/reference/components/native-select/examples/states.tsx +2 -2
  502. package/dist/skill/reference/components/notification/COMPONENT.md +36 -31
  503. package/dist/skill/reference/components/notification/examples/examples.module.css +1 -2
  504. package/dist/skill/reference/components/notification/examples/in-form.tsx +28 -20
  505. package/dist/skill/reference/components/notification/examples/sizes.tsx +16 -12
  506. package/dist/skill/reference/components/notification/examples/undo.tsx +7 -15
  507. package/dist/skill/reference/components/page-content/COMPONENT.md +21 -29
  508. package/dist/skill/reference/components/page-content/examples/examples.module.css +3 -16
  509. package/dist/skill/reference/components/page-content/examples/grid.tsx +3 -1
  510. package/dist/skill/reference/components/page-content/examples/list-detail.tsx +55 -49
  511. package/dist/skill/reference/components/page-content/examples/narrow.tsx +1 -1
  512. package/dist/skill/reference/components/page-content/examples/overview.tsx +2 -2
  513. package/dist/skill/reference/components/page-content/examples/variants.tsx +7 -7
  514. package/dist/skill/reference/components/page-toolbar/COMPONENT.md +10 -6
  515. package/dist/skill/reference/components/page-toolbar/examples/overview.tsx +1 -1
  516. package/dist/skill/reference/components/page-toolbar/examples/save-changes.tsx +25 -22
  517. package/dist/skill/reference/components/pagination/COMPONENT.md +20 -17
  518. package/dist/skill/reference/components/pagination/examples/narrow.tsx +5 -5
  519. package/dist/skill/reference/components/popover/COMPONENT.md +43 -20
  520. package/dist/skill/reference/components/popover/examples/controlled-open.tsx +6 -4
  521. package/dist/skill/reference/components/popover/examples/dismiss.tsx +37 -28
  522. package/dist/skill/reference/components/popover/examples/examples.module.css +2 -2
  523. package/dist/skill/reference/components/popover/examples/sizes.tsx +32 -27
  524. package/dist/skill/reference/components/popover/examples/width.tsx +45 -0
  525. package/dist/skill/reference/components/progress-bar/COMPONENT.md +21 -29
  526. package/dist/skill/reference/components/progress-bar/examples/examples.module.css +1 -1
  527. package/dist/skill/reference/components/progress-circle/COMPONENT.md +21 -29
  528. package/dist/skill/reference/components/progress-circle/examples/examples.module.css +1 -1
  529. package/dist/skill/reference/components/progress-circle/examples/on-color.tsx +16 -0
  530. package/dist/skill/reference/components/progress-circle/examples/variants.tsx +1 -0
  531. package/dist/skill/reference/components/radio/COMPONENT.md +13 -4
  532. package/dist/skill/reference/components/radio/examples/examples.module.css +1 -1
  533. package/dist/skill/reference/components/scroll-container/COMPONENT.md +18 -12
  534. package/dist/skill/reference/components/scroll-container/examples/auto-scroll.tsx +8 -4
  535. package/dist/skill/reference/components/scroll-container/examples/edges.tsx +4 -4
  536. package/dist/skill/reference/components/scroll-container/examples/examples.module.css +7 -51
  537. package/dist/skill/reference/components/scroll-container/examples/load-more.tsx +4 -4
  538. package/dist/skill/reference/components/scroll-container/examples/lock.tsx +4 -4
  539. package/dist/skill/reference/components/scroll-container/examples/log.tsx +97 -0
  540. package/dist/skill/reference/components/scroll-container/examples/overscroll.tsx +4 -4
  541. package/dist/skill/reference/components/scroll-container/examples/overview.tsx +5 -5
  542. package/dist/skill/reference/components/scroll-container/examples/scrollbar.tsx +4 -4
  543. package/dist/skill/reference/components/scroll-container/examples/snap.tsx +2 -2
  544. package/dist/skill/reference/components/scroll-container/examples/variants.tsx +1 -0
  545. package/dist/skill/reference/components/segmented-control/COMPONENT.md +24 -12
  546. package/dist/skill/reference/components/segmented-control/examples/controlled.tsx +2 -4
  547. package/dist/skill/reference/components/segmented-control/examples/examples.module.css +0 -8
  548. package/dist/skill/reference/components/segmented-control/examples/scroll.tsx +1 -1
  549. package/dist/skill/reference/components/select/COMPONENT.md +33 -9
  550. package/dist/skill/reference/components/select/examples/dismiss.tsx +26 -0
  551. package/dist/skill/reference/components/select/examples/examples.module.css +1 -1
  552. package/dist/skill/reference/components/select/examples/server-search.tsx +6 -2
  553. package/dist/skill/reference/components/select/examples/sizes.tsx +2 -2
  554. package/dist/skill/reference/components/select/examples/states.tsx +2 -2
  555. package/dist/skill/reference/components/select/examples/with-icon.tsx +20 -18
  556. package/dist/skill/reference/components/sheet/COMPONENT.md +44 -21
  557. package/dist/skill/reference/components/sheet/examples/header-actions.tsx +23 -4
  558. package/dist/skill/reference/components/sheet/examples/overview.tsx +25 -10
  559. package/dist/skill/reference/components/skeleton/COMPONENT.md +8 -4
  560. package/dist/skill/reference/components/skeleton/examples/examples.module.css +1 -13
  561. package/dist/skill/reference/components/skeleton/examples/with-crossfade.tsx +7 -7
  562. package/dist/skill/reference/components/slider/COMPONENT.md +10 -5
  563. package/dist/skill/reference/components/slider/examples/examples.module.css +6 -7
  564. package/dist/skill/reference/components/slider/examples/hint-and-error.tsx +3 -5
  565. package/dist/skill/reference/components/slider/examples/in-form.tsx +21 -19
  566. package/dist/skill/reference/components/smart-filter/COMPONENT.md +32 -12
  567. package/dist/skill/reference/components/smart-filter/examples/examples.module.css +0 -21
  568. package/dist/skill/reference/components/smart-filter/examples/ranges.tsx +2 -1
  569. package/dist/skill/reference/components/smart-filter/examples/sizes.tsx +2 -4
  570. package/dist/skill/reference/components/sparkline/COMPONENT.md +7 -3
  571. package/dist/skill/reference/components/sparkline/examples/examples.module.css +1 -1
  572. package/dist/skill/reference/components/sparkline/examples/signed-bars.tsx +2 -2
  573. package/dist/skill/reference/components/spinner/COMPONENT.md +15 -9
  574. package/dist/skill/reference/components/spinner/examples/examples.module.css +2 -14
  575. package/dist/skill/reference/components/spinner/examples/overview.tsx +1 -1
  576. package/dist/skill/reference/components/stepper/COMPONENT.md +50 -41
  577. package/dist/skill/reference/components/stepper/examples/examples.module.css +1 -6
  578. package/dist/skill/reference/components/stepper/examples/narrow.tsx +1 -1
  579. package/dist/skill/reference/components/stepper/examples/sizes.tsx +6 -8
  580. package/dist/skill/reference/components/stepper/examples/states.tsx +44 -43
  581. package/dist/skill/reference/components/stepper/examples/with-icon.tsx +19 -17
  582. package/dist/skill/reference/components/switch/COMPONENT.md +21 -8
  583. package/dist/skill/reference/components/switch/examples/examples.module.css +2 -2
  584. package/dist/skill/reference/components/switch/examples/states.tsx +3 -3
  585. package/dist/skill/reference/components/tabs/COMPONENT.md +21 -16
  586. package/dist/skill/reference/components/tabs/examples/in-drawer.tsx +1 -1
  587. package/dist/skill/reference/components/tabs/examples/sizes.tsx +5 -10
  588. package/dist/skill/reference/components/tabs/examples/variants.tsx +19 -23
  589. package/dist/skill/reference/components/tag-select/COMPONENT.md +19 -6
  590. package/dist/skill/reference/components/tag-select/examples/creatable.tsx +2 -2
  591. package/dist/skill/reference/components/tag-select/examples/dismiss.tsx +23 -0
  592. package/dist/skill/reference/components/tag-select/examples/examples.module.css +3 -3
  593. package/dist/skill/reference/components/tag-select/examples/in-form.tsx +31 -32
  594. package/dist/skill/reference/components/tag-select/examples/sizes.tsx +2 -2
  595. package/dist/skill/reference/components/tag-select/examples/states.tsx +2 -2
  596. package/dist/skill/reference/components/textarea/COMPONENT.md +10 -6
  597. package/dist/skill/reference/components/textarea/examples/examples.module.css +3 -10
  598. package/dist/skill/reference/components/textarea/examples/in-form.tsx +3 -3
  599. package/dist/skill/reference/components/textarea/examples/sizes.tsx +10 -7
  600. package/dist/skill/reference/components/textarea/examples/states.tsx +29 -13
  601. package/dist/skill/reference/components/textarea/examples/validation.tsx +45 -36
  602. package/dist/skill/reference/components/thumbnail/COMPONENT.md +17 -13
  603. package/dist/skill/reference/components/thumbnail/examples/examples.module.css +1 -1
  604. package/dist/skill/reference/components/thumbnail/examples/states.tsx +1 -1
  605. package/dist/skill/reference/components/thumbnail/examples/variants.tsx +12 -1
  606. package/dist/skill/reference/components/timeline/COMPONENT.md +51 -35
  607. package/dist/skill/reference/components/timeline/examples/links.tsx +14 -14
  608. package/dist/skill/reference/components/timeline/examples/narrow.tsx +6 -6
  609. package/dist/skill/reference/components/timeline/examples/overview.tsx +6 -6
  610. package/dist/skill/reference/components/timeline/examples/sizes.tsx +28 -23
  611. package/dist/skill/reference/components/timeline/examples/structure.tsx +30 -30
  612. package/dist/skill/reference/components/timeline/examples/variants.tsx +40 -28
  613. package/dist/skill/reference/components/tooltip/COMPONENT.md +10 -6
  614. package/dist/skill/reference/components/tooltip/examples/examples.module.css +1 -5
  615. package/dist/skill/reference/components/tooltip/examples/non-interactive-trigger.tsx +1 -1
  616. package/dist/skill/reference/components/tooltip/examples/sizes.tsx +17 -10
  617. package/dist/skill/reference/components/typography/COMPONENT.md +17 -2
  618. package/dist/skill/reference/components/typography/examples/examples.module.css +3 -6
  619. package/dist/skill/reference/components/typography/examples/numeric.tsx +16 -0
  620. package/dist/skill/reference/components/video-note/COMPONENT.md +11 -7
  621. package/dist/skill/reference/components/visually-hidden/COMPONENT.md +8 -4
  622. package/dist/skill/reference/components/visually-hidden/examples/assertive.tsx +1 -1
  623. package/dist/skill/reference/components/visually-hidden/examples/overview.tsx +17 -7
  624. package/dist/skill/reference/components/voice-player/COMPONENT.md +15 -7
  625. package/dist/skill/reference/foundation.md +564 -0
  626. package/dist/skill/reference/layout/app-header/COMPONENT.md +27 -26
  627. package/dist/skill/reference/layout/app-header/examples/examples.module.css +4 -23
  628. package/dist/skill/reference/layout/app-header/examples/in-app-shell.tsx +3 -5
  629. package/dist/skill/reference/layout/app-header/examples/narrow.tsx +58 -20
  630. package/dist/skill/reference/layout/app-shell/COMPONENT.md +40 -10
  631. package/dist/skill/reference/layout/app-shell/examples/examples.module.css +2 -22
  632. package/dist/skill/reference/layout/app-shell/examples/footer.tsx +2 -2
  633. package/dist/skill/reference/layout/app-shell/examples/overview.tsx +3 -5
  634. package/dist/skill/reference/layout/app-shell/examples/screen.tsx +27 -21
  635. package/dist/skill/reference/layout/app-shell/examples/template.tsx +3 -3
  636. package/dist/skill/reference/layout/bottom-nav/COMPONENT.md +27 -17
  637. package/dist/skill/reference/layout/bottom-nav/examples/examples.module.css +2 -7
  638. package/dist/skill/reference/layout/bottom-nav/examples/floating-action.tsx +2 -2
  639. package/dist/skill/reference/layout/bottom-nav/examples/floating.tsx +2 -2
  640. package/dist/skill/reference/layout/bottom-nav/examples/in-app-shell.tsx +2 -2
  641. package/dist/skill/reference/layout/bottom-nav/examples/router.tsx +6 -5
  642. package/dist/skill/reference/layout/sidebar/COMPONENT.md +50 -40
  643. package/dist/skill/reference/layout/sidebar/examples/account.tsx +1 -3
  644. package/dist/skill/reference/layout/sidebar/examples/brand-header.tsx +1 -3
  645. package/dist/skill/reference/layout/sidebar/examples/collapsible-groups.tsx +1 -3
  646. package/dist/skill/reference/layout/sidebar/examples/controlled-open.tsx +1 -3
  647. package/dist/skill/reference/layout/sidebar/examples/controlled.tsx +1 -3
  648. package/dist/skill/reference/layout/sidebar/examples/custom-part.tsx +1 -3
  649. package/dist/skill/reference/layout/sidebar/examples/dismiss.tsx +47 -0
  650. package/dist/skill/reference/layout/sidebar/examples/examples.module.css +7 -32
  651. package/dist/skill/reference/layout/sidebar/examples/narrow.tsx +44 -42
  652. package/dist/skill/reference/layout/sidebar/examples/nested-items.tsx +1 -3
  653. package/dist/skill/reference/layout/sidebar/examples/overview.tsx +1 -3
  654. package/dist/skill/reference/layout/sidebar/examples/persist.tsx +1 -3
  655. package/dist/skill/reference/layout/sidebar/examples/router.tsx +12 -13
  656. package/dist/skill/reference/layout/sidebar/examples/sizes.tsx +6 -6
  657. package/dist/skill/responsive.md +48 -51
  658. package/dist/skill/ux.md +21 -9
  659. package/dist/theme/applyTheme.d.ts +7 -6
  660. package/dist/tokens/hues.d.ts +8 -0
  661. package/dist/tokens/layers.d.ts +3 -16
  662. package/dist/tokens/offGrid.d.ts +7 -0
  663. package/dist/tokens/primitives.d.ts +22 -7
  664. package/dist/tokens/semantic.d.ts +201 -51
  665. package/dist/tokens/themes/dark.d.ts +32 -31
  666. package/package.json +5 -3
  667. package/src/components/accordion/COMPONENT.md +16 -9
  668. package/src/components/accordion/examples/overview.tsx +2 -2
  669. package/src/components/accordion/examples/sizes.tsx +6 -8
  670. package/src/components/accordion/examples/states.tsx +27 -24
  671. package/src/components/accordion/examples/variants.tsx +6 -8
  672. package/src/components/accordion/examples/with-icon.tsx +22 -19
  673. package/src/components/avatar/COMPONENT.md +23 -16
  674. package/src/components/avatar/examples/examples.module.css +1 -4
  675. package/src/components/avatar/examples/overview.tsx +3 -3
  676. package/src/components/avatar/examples/presence.tsx +4 -4
  677. package/src/components/avatar/examples/src-from-state.tsx +3 -3
  678. package/src/components/avatar/examples/states.tsx +4 -4
  679. package/src/components/avatar/examples/team-group.tsx +2 -2
  680. package/src/components/badge/COMPONENT.md +66 -34
  681. package/src/components/badge/examples/controlled.tsx +32 -0
  682. package/src/components/badge/examples/examples.module.css +2 -2
  683. package/src/components/badge/examples/filter-values.tsx +4 -6
  684. package/src/components/badge/examples/in-controls.tsx +1 -1
  685. package/src/components/badge/examples/overview.tsx +6 -5
  686. package/src/components/badge/examples/square.tsx +21 -0
  687. package/src/components/badge/examples/states.tsx +4 -4
  688. package/src/components/badge/examples/with-icon.tsx +10 -1
  689. package/src/components/banner/COMPONENT.md +9 -5
  690. package/src/components/banner/examples/dismissible.tsx +3 -19
  691. package/src/components/banner/examples/overview.tsx +1 -1
  692. package/src/components/breadcrumb/COMPONENT.md +17 -11
  693. package/src/components/breadcrumb/examples/examples.module.css +1 -1
  694. package/src/components/breadcrumb/examples/overflow.tsx +1 -1
  695. package/src/components/breadcrumb/examples/sizes.tsx +6 -8
  696. package/src/components/breadcrumb/examples/with-icon.tsx +15 -8
  697. package/src/components/button/COMPONENT.md +66 -30
  698. package/src/components/button/examples/align.tsx +25 -0
  699. package/src/components/button/examples/controlled.tsx +21 -0
  700. package/src/components/button/examples/density.tsx +45 -0
  701. package/src/components/button/examples/examples.module.css +14 -25
  702. package/src/components/button/examples/label-morph.tsx +1 -1
  703. package/src/components/button/examples/on-colored-host.tsx +19 -19
  704. package/src/components/button/examples/over-media.tsx +7 -1
  705. package/src/components/button/examples/toggle.tsx +2 -10
  706. package/src/components/button-group/COMPONENT.md +21 -15
  707. package/src/components/button-group/examples/controlled.tsx +1 -1
  708. package/src/components/card/COMPONENT.md +16 -5
  709. package/src/components/card/examples/content-templates.tsx +8 -2
  710. package/src/components/card/examples/examples.module.css +4 -16
  711. package/src/components/card/examples/overview.tsx +11 -11
  712. package/src/components/card/examples/screen.tsx +9 -8
  713. package/src/components/card/examples/variants.tsx +74 -47
  714. package/src/components/chart-frame/COMPONENT.md +24 -28
  715. package/src/components/chart-frame/examples/controlled.tsx +9 -7
  716. package/src/components/chart-frame/examples/fill-height.tsx +4 -6
  717. package/src/components/chart-frame/examples/narrow.tsx +24 -5
  718. package/src/components/chart-frame/examples/overview.tsx +5 -2
  719. package/src/components/chart-frame/examples/states.tsx +72 -64
  720. package/src/components/chart-frame/examples/tooltip.tsx +27 -26
  721. package/src/components/chat/COMPONENT.md +35 -22
  722. package/src/components/chat/examples/group-chat.tsx +2 -2
  723. package/src/components/chat/examples/overview.tsx +119 -130
  724. package/src/components/chat/examples/reactions.tsx +18 -23
  725. package/src/components/chat/examples/screen.tsx +108 -131
  726. package/src/components/chat/examples/states.tsx +23 -22
  727. package/src/components/chat-list/COMPONENT.md +10 -5
  728. package/src/components/chat-list/examples/examples.module.css +0 -8
  729. package/src/components/chat-list/examples/live.tsx +29 -22
  730. package/src/components/chat-list/examples/sizes.tsx +6 -8
  731. package/src/components/chat-list/examples/states.tsx +42 -38
  732. package/src/components/checkbox/COMPONENT.md +27 -14
  733. package/src/components/checkbox/examples/controlled.tsx +18 -16
  734. package/src/components/checkbox/examples/examples.module.css +14 -56
  735. package/src/components/checkbox/examples/in-form.tsx +16 -16
  736. package/src/components/checkbox/examples/indicator.tsx +19 -64
  737. package/src/components/checkbox/examples/overview.tsx +1 -1
  738. package/src/components/checkbox/examples/states.tsx +1 -1
  739. package/src/components/checkbox/examples/without-label.tsx +1 -1
  740. package/src/components/code-block/COMPONENT.md +16 -12
  741. package/src/components/code-block/examples/examples.module.css +5 -2
  742. package/src/components/code-block/examples/narrow.tsx +1 -1
  743. package/src/components/color-field/COMPONENT.md +15 -9
  744. package/src/components/color-field/examples/examples.module.css +4 -5
  745. package/src/components/color-field/examples/in-form.tsx +15 -13
  746. package/src/components/color-field/examples/sizes.tsx +5 -1
  747. package/src/components/color-field/examples/states.tsx +15 -3
  748. package/src/components/color-picker/COMPONENT.md +55 -19
  749. package/src/components/color-picker/examples/controlled.tsx +16 -5
  750. package/src/components/color-picker/examples/examples.module.css +6 -7
  751. package/src/components/color-picker/examples/in-form.tsx +24 -22
  752. package/src/components/color-picker/examples/overview.tsx +1 -1
  753. package/src/components/color-picker/examples/panel.tsx +1 -1
  754. package/src/components/color-picker/examples/sizes.tsx +9 -11
  755. package/src/components/color-picker/examples/states.tsx +28 -23
  756. package/src/components/color-swatches/COMPONENT.md +22 -8
  757. package/src/components/color-swatches/examples/examples.module.css +3 -4
  758. package/src/components/color-swatches/examples/in-form.tsx +19 -17
  759. package/src/components/color-swatches/examples/palette.tsx +24 -0
  760. package/src/components/color-swatches/examples/wrapping.tsx +17 -2
  761. package/src/components/command-menu/COMPONENT.md +60 -20
  762. package/src/components/command-menu/examples/sizes.tsx +20 -15
  763. package/src/components/command-menu/examples/states.tsx +46 -24
  764. package/src/components/composer/COMPONENT.md +42 -24
  765. package/src/components/composer/examples/examples.module.css +0 -9
  766. package/src/components/composer/examples/narrow.tsx +1 -1
  767. package/src/components/composer/examples/reply-edit.tsx +3 -3
  768. package/src/components/composer/examples/sizes.tsx +3 -5
  769. package/src/components/composer/examples/states.tsx +4 -6
  770. package/src/components/confirm-dialog/COMPONENT.md +26 -13
  771. package/src/components/confirm-dialog/examples/dismiss.tsx +27 -0
  772. package/src/components/confirm-dialog/examples/failure.tsx +9 -16
  773. package/src/components/crossfade/COMPONENT.md +11 -5
  774. package/src/components/crossfade/examples/examples.module.css +1 -40
  775. package/src/components/crossfade/examples/fill.tsx +16 -19
  776. package/src/components/crossfade/examples/overview.tsx +14 -16
  777. package/src/components/crossfade/examples/record-switch.tsx +6 -11
  778. package/src/components/crossfade/examples/screen.module.css +1 -24
  779. package/src/components/crossfade/examples/screen.tsx +14 -25
  780. package/src/components/data-table/COMPONENT.md +31 -21
  781. package/src/components/data-table/examples/controlled.tsx +14 -2
  782. package/src/components/data-table/examples/examples.module.css +1 -9
  783. package/src/components/data-table/examples/narrow.tsx +5 -1
  784. package/src/components/data-table/examples/row-link.tsx +2 -1
  785. package/src/components/data-table/examples/screen.module.css +2 -2
  786. package/src/components/data-table/examples/screen.tsx +11 -10
  787. package/src/components/data-table/examples/sizes.tsx +17 -17
  788. package/src/components/data-table/examples/states.tsx +37 -29
  789. package/src/components/datepicker/COMPONENT.md +53 -22
  790. package/src/components/datepicker/examples/dismiss.tsx +15 -0
  791. package/src/components/datepicker/examples/examples.module.css +3 -2
  792. package/src/components/datepicker/examples/in-form.tsx +33 -25
  793. package/src/components/datepicker/examples/sizes.tsx +2 -2
  794. package/src/components/datepicker/examples/states.tsx +2 -2
  795. package/src/components/datepicker/examples/validation.tsx +3 -3
  796. package/src/components/description-list/COMPONENT.md +24 -9
  797. package/src/components/description-list/examples/examples.module.css +4 -24
  798. package/src/components/description-list/examples/narrow.tsx +1 -1
  799. package/src/components/description-list/examples/screen.module.css +0 -18
  800. package/src/components/description-list/examples/screen.tsx +19 -27
  801. package/src/components/description-list/examples/sizes.tsx +2 -4
  802. package/src/components/description-list/examples/structure.tsx +6 -7
  803. package/src/components/description-list/examples/totals.tsx +40 -0
  804. package/src/components/digit-input/COMPONENT.md +12 -6
  805. package/src/components/digit-input/examples/examples.module.css +2 -2
  806. package/src/components/digit-input/examples/in-form.tsx +1 -1
  807. package/src/components/digit-input/examples/sizes.tsx +5 -3
  808. package/src/components/digit-input/examples/states.tsx +14 -6
  809. package/src/components/divider/COMPONENT.md +26 -12
  810. package/src/components/divider/examples/align.tsx +2 -4
  811. package/src/components/divider/examples/examples.module.css +13 -17
  812. package/src/components/divider/examples/or-separator.tsx +3 -5
  813. package/src/components/divider/examples/overview.tsx +18 -16
  814. package/src/components/divider/examples/vertical.tsx +5 -1
  815. package/src/components/divider/examples/with-icon.tsx +1 -1
  816. package/src/components/dnd/COMPONENT.md +52 -34
  817. package/src/components/dnd/examples/drop-zones.tsx +1 -1
  818. package/src/components/dnd/examples/examples.module.css +4 -6
  819. package/src/components/dnd/examples/states.tsx +41 -35
  820. package/src/components/drawer/COMPONENT.md +37 -14
  821. package/src/components/drawer/examples/guard.tsx +1 -3
  822. package/src/components/drawer/examples/header-actions.tsx +1 -1
  823. package/src/components/drawer/examples/in-form.tsx +31 -31
  824. package/src/components/drawer/examples/placement.tsx +31 -26
  825. package/src/components/drawer/examples/sizes.tsx +32 -27
  826. package/src/components/dropdown/COMPONENT.md +58 -23
  827. package/src/components/dropdown/examples/context-menu.tsx +75 -0
  828. package/src/components/dropdown/examples/examples.module.css +1 -1
  829. package/src/components/dropdown/examples/sizes.tsx +39 -34
  830. package/src/components/dropdown/examples/states.tsx +37 -29
  831. package/src/components/empty-page/COMPONENT.md +20 -9
  832. package/src/components/empty-page/examples/compact.tsx +28 -18
  833. package/src/components/empty-page/examples/examples.module.css +0 -43
  834. package/src/components/empty-page/examples/narrow.tsx +3 -3
  835. package/src/components/empty-page/examples/region-error.tsx +6 -11
  836. package/src/components/empty-page/examples/sizes.tsx +13 -13
  837. package/src/components/empty-page/examples/variants.tsx +34 -30
  838. package/src/components/example-frame/COMPONENT.md +21 -9
  839. package/src/components/example-frame/examples/controlled.tsx +3 -3
  840. package/src/components/field-list/COMPONENT.md +14 -8
  841. package/src/components/field-list/examples/sizes.tsx +32 -26
  842. package/src/components/field-list/examples/states.tsx +37 -31
  843. package/src/components/fieldset/COMPONENT.md +10 -5
  844. package/src/components/fieldset/examples/examples.module.css +1 -1
  845. package/src/components/file-upload/COMPONENT.md +67 -29
  846. package/src/components/file-upload/examples/avatar-upload.tsx +5 -5
  847. package/src/components/file-upload/examples/custom-body.tsx +12 -7
  848. package/src/components/file-upload/examples/examples.module.css +4 -4
  849. package/src/components/file-upload/examples/narrow.tsx +1 -1
  850. package/src/components/file-upload/examples/row-parts.tsx +4 -4
  851. package/src/components/file-upload/examples/screen.module.css +2 -2
  852. package/src/components/file-upload/examples/screen.tsx +6 -4
  853. package/src/components/file-upload/examples/sizes.tsx +1 -3
  854. package/src/components/file-upload/examples/states.tsx +1 -3
  855. package/src/components/file-upload/examples/variants.tsx +13 -7
  856. package/src/components/gallery/COMPONENT.md +16 -7
  857. package/src/components/gallery/examples/album-sizes.tsx +52 -0
  858. package/src/components/gallery/examples/controlled.tsx +40 -0
  859. package/src/components/gallery/examples/examples.module.css +1 -1
  860. package/src/components/gallery/examples/overview.tsx +15 -43
  861. package/src/components/gallery/examples/transfer.tsx +22 -13
  862. package/src/components/gantt/COMPONENT.md +21 -15
  863. package/src/components/gantt/examples/examples.module.css +0 -16
  864. package/src/components/gantt/examples/occupancy.tsx +2 -2
  865. package/src/components/gantt/examples/screen.tsx +2 -2
  866. package/src/components/gantt/examples/sizes.tsx +16 -16
  867. package/src/components/gantt/examples/states.tsx +34 -30
  868. package/src/components/gantt/examples/variants.tsx +27 -25
  869. package/src/components/hint/COMPONENT.md +24 -14
  870. package/src/components/hint/examples/examples.module.css +1 -1
  871. package/src/components/hint/examples/hint-or-error.tsx +2 -2
  872. package/src/components/hint/examples/overview.tsx +9 -10
  873. package/src/components/hint/examples/sizes.tsx +1 -1
  874. package/src/components/input/COMPONENT.md +10 -6
  875. package/src/components/input/examples/affixes.tsx +2 -2
  876. package/src/components/input/examples/examples.module.css +1 -1
  877. package/src/components/input/examples/sizes.tsx +9 -5
  878. package/src/components/input/examples/states.tsx +39 -23
  879. package/src/components/input/examples/with-icon.tsx +24 -16
  880. package/src/components/kanban/COMPONENT.md +30 -24
  881. package/src/components/kanban/examples/columns.tsx +14 -19
  882. package/src/components/kanban/examples/item-link.tsx +2 -2
  883. package/src/components/kanban/examples/limits.tsx +1 -1
  884. package/src/components/kanban/examples/narrow.tsx +1 -1
  885. package/src/components/kanban/examples/screen.module.css +1 -3
  886. package/src/components/kanban/examples/screen.tsx +6 -4
  887. package/src/components/kanban/examples/states.tsx +37 -58
  888. package/src/components/kanban/examples/variants.tsx +0 -3
  889. package/src/components/kbd/COMPONENT.md +10 -6
  890. package/src/components/kbd/examples/examples.module.css +1 -20
  891. package/src/components/kbd/examples/in-controls.tsx +2 -2
  892. package/src/components/kbd/examples/shortcut-list.tsx +14 -26
  893. package/src/components/label/COMPONENT.md +26 -11
  894. package/src/components/label/examples/examples.module.css +3 -11
  895. package/src/components/label/examples/overview.tsx +5 -9
  896. package/src/components/label/examples/structure.tsx +2 -2
  897. package/src/components/link-button/COMPONENT.md +33 -20
  898. package/src/components/link-button/examples/as-child.tsx +1 -1
  899. package/src/components/link-button/examples/external-link.tsx +1 -1
  900. package/src/components/link-button/examples/overview.tsx +4 -2
  901. package/src/components/link-button/examples/variants.tsx +2 -2
  902. package/src/components/list/COMPONENT.md +24 -16
  903. package/src/components/list/examples/examples.module.css +0 -8
  904. package/src/components/list/examples/overflow.tsx +1 -1
  905. package/src/components/list/examples/overview.tsx +31 -30
  906. package/src/components/list/examples/sizes.tsx +23 -23
  907. package/src/components/list/examples/states.tsx +38 -21
  908. package/src/components/list/examples/with-icon.tsx +16 -14
  909. package/src/components/login-form/COMPONENT.md +69 -16
  910. package/src/components/login-form/examples/narrow.tsx +1 -1
  911. package/src/components/login-form/examples/register.tsx +1 -1
  912. package/src/components/media-viewer/COMPONENT.md +12 -8
  913. package/src/components/media-viewer/examples/examples.module.css +2 -2
  914. package/src/components/media-viewer/examples/video.tsx +1 -1
  915. package/src/components/message/COMPONENT.md +102 -46
  916. package/src/components/message/examples/typing.tsx +5 -5
  917. package/src/components/modal/COMPONENT.md +71 -37
  918. package/src/components/modal/examples/dismiss.tsx +35 -27
  919. package/src/components/modal/examples/enter-key.tsx +22 -25
  920. package/src/components/modal/examples/examples.module.css +0 -7
  921. package/src/components/modal/examples/guard.tsx +2 -4
  922. package/src/components/modal/examples/in-form.tsx +28 -28
  923. package/src/components/modal/examples/long-content.tsx +6 -4
  924. package/src/components/modal/examples/sizes.tsx +36 -31
  925. package/src/components/modal/examples/structure.tsx +1 -1
  926. package/src/components/native-select/COMPONENT.md +7 -3
  927. package/src/components/native-select/examples/examples.module.css +3 -3
  928. package/src/components/native-select/examples/in-form.tsx +28 -29
  929. package/src/components/native-select/examples/sizes.tsx +2 -2
  930. package/src/components/native-select/examples/states.tsx +2 -2
  931. package/src/components/notification/COMPONENT.md +36 -31
  932. package/src/components/notification/examples/examples.module.css +1 -2
  933. package/src/components/notification/examples/in-form.tsx +28 -20
  934. package/src/components/notification/examples/sizes.tsx +16 -12
  935. package/src/components/notification/examples/undo.tsx +7 -15
  936. package/src/components/page-content/COMPONENT.md +21 -29
  937. package/src/components/page-content/examples/examples.module.css +3 -16
  938. package/src/components/page-content/examples/grid.tsx +3 -1
  939. package/src/components/page-content/examples/list-detail.tsx +55 -49
  940. package/src/components/page-content/examples/narrow.tsx +1 -1
  941. package/src/components/page-content/examples/overview.tsx +2 -2
  942. package/src/components/page-content/examples/variants.tsx +7 -7
  943. package/src/components/page-toolbar/COMPONENT.md +10 -6
  944. package/src/components/page-toolbar/examples/overview.tsx +1 -1
  945. package/src/components/page-toolbar/examples/save-changes.tsx +25 -22
  946. package/src/components/pagination/COMPONENT.md +20 -17
  947. package/src/components/pagination/examples/narrow.tsx +5 -5
  948. package/src/components/popover/COMPONENT.md +43 -20
  949. package/src/components/popover/examples/controlled-open.tsx +6 -4
  950. package/src/components/popover/examples/dismiss.tsx +37 -28
  951. package/src/components/popover/examples/examples.module.css +2 -2
  952. package/src/components/popover/examples/sizes.tsx +32 -27
  953. package/src/components/popover/examples/width.tsx +45 -0
  954. package/src/components/progress-bar/COMPONENT.md +21 -29
  955. package/src/components/progress-bar/examples/examples.module.css +1 -1
  956. package/src/components/progress-circle/COMPONENT.md +21 -29
  957. package/src/components/progress-circle/examples/examples.module.css +1 -1
  958. package/src/components/progress-circle/examples/on-color.tsx +16 -0
  959. package/src/components/progress-circle/examples/variants.tsx +1 -0
  960. package/src/components/radio/COMPONENT.md +13 -4
  961. package/src/components/radio/examples/examples.module.css +1 -1
  962. package/src/components/scroll-container/COMPONENT.md +18 -12
  963. package/src/components/scroll-container/examples/auto-scroll.tsx +8 -4
  964. package/src/components/scroll-container/examples/edges.tsx +4 -4
  965. package/src/components/scroll-container/examples/examples.module.css +7 -51
  966. package/src/components/scroll-container/examples/load-more.tsx +4 -4
  967. package/src/components/scroll-container/examples/lock.tsx +4 -4
  968. package/src/components/scroll-container/examples/log.tsx +97 -0
  969. package/src/components/scroll-container/examples/overscroll.tsx +4 -4
  970. package/src/components/scroll-container/examples/overview.tsx +5 -5
  971. package/src/components/scroll-container/examples/scrollbar.tsx +4 -4
  972. package/src/components/scroll-container/examples/snap.tsx +2 -2
  973. package/src/components/scroll-container/examples/variants.tsx +1 -0
  974. package/src/components/segmented-control/COMPONENT.md +24 -12
  975. package/src/components/segmented-control/examples/controlled.tsx +2 -4
  976. package/src/components/segmented-control/examples/examples.module.css +0 -8
  977. package/src/components/segmented-control/examples/scroll.tsx +1 -1
  978. package/src/components/select/COMPONENT.md +33 -9
  979. package/src/components/select/examples/dismiss.tsx +26 -0
  980. package/src/components/select/examples/examples.module.css +1 -1
  981. package/src/components/select/examples/server-search.tsx +6 -2
  982. package/src/components/select/examples/sizes.tsx +2 -2
  983. package/src/components/select/examples/states.tsx +2 -2
  984. package/src/components/select/examples/with-icon.tsx +20 -18
  985. package/src/components/sheet/COMPONENT.md +44 -21
  986. package/src/components/sheet/examples/header-actions.tsx +23 -4
  987. package/src/components/sheet/examples/overview.tsx +25 -10
  988. package/src/components/skeleton/COMPONENT.md +8 -4
  989. package/src/components/skeleton/examples/examples.module.css +1 -13
  990. package/src/components/skeleton/examples/with-crossfade.tsx +7 -7
  991. package/src/components/slider/COMPONENT.md +10 -5
  992. package/src/components/slider/examples/examples.module.css +6 -7
  993. package/src/components/slider/examples/hint-and-error.tsx +3 -5
  994. package/src/components/slider/examples/in-form.tsx +21 -19
  995. package/src/components/smart-filter/COMPONENT.md +32 -12
  996. package/src/components/smart-filter/examples/examples.module.css +0 -21
  997. package/src/components/smart-filter/examples/ranges.tsx +2 -1
  998. package/src/components/smart-filter/examples/sizes.tsx +2 -4
  999. package/src/components/sparkline/COMPONENT.md +7 -3
  1000. package/src/components/sparkline/examples/examples.module.css +1 -1
  1001. package/src/components/sparkline/examples/signed-bars.tsx +2 -2
  1002. package/src/components/spinner/COMPONENT.md +15 -9
  1003. package/src/components/spinner/examples/examples.module.css +2 -14
  1004. package/src/components/spinner/examples/overview.tsx +1 -1
  1005. package/src/components/stepper/COMPONENT.md +50 -41
  1006. package/src/components/stepper/examples/examples.module.css +1 -6
  1007. package/src/components/stepper/examples/narrow.tsx +1 -1
  1008. package/src/components/stepper/examples/sizes.tsx +6 -8
  1009. package/src/components/stepper/examples/states.tsx +44 -43
  1010. package/src/components/stepper/examples/with-icon.tsx +19 -17
  1011. package/src/components/switch/COMPONENT.md +21 -8
  1012. package/src/components/switch/examples/examples.module.css +2 -2
  1013. package/src/components/switch/examples/states.tsx +3 -3
  1014. package/src/components/tabs/COMPONENT.md +21 -16
  1015. package/src/components/tabs/examples/in-drawer.tsx +1 -1
  1016. package/src/components/tabs/examples/sizes.tsx +5 -10
  1017. package/src/components/tabs/examples/variants.tsx +19 -23
  1018. package/src/components/tag-select/COMPONENT.md +19 -6
  1019. package/src/components/tag-select/examples/creatable.tsx +2 -2
  1020. package/src/components/tag-select/examples/dismiss.tsx +23 -0
  1021. package/src/components/tag-select/examples/examples.module.css +3 -3
  1022. package/src/components/tag-select/examples/in-form.tsx +31 -32
  1023. package/src/components/tag-select/examples/sizes.tsx +2 -2
  1024. package/src/components/tag-select/examples/states.tsx +2 -2
  1025. package/src/components/textarea/COMPONENT.md +10 -6
  1026. package/src/components/textarea/examples/examples.module.css +3 -10
  1027. package/src/components/textarea/examples/in-form.tsx +3 -3
  1028. package/src/components/textarea/examples/sizes.tsx +10 -7
  1029. package/src/components/textarea/examples/states.tsx +29 -13
  1030. package/src/components/textarea/examples/validation.tsx +45 -36
  1031. package/src/components/thumbnail/COMPONENT.md +17 -13
  1032. package/src/components/thumbnail/examples/examples.module.css +1 -1
  1033. package/src/components/thumbnail/examples/states.tsx +1 -1
  1034. package/src/components/thumbnail/examples/variants.tsx +12 -1
  1035. package/src/components/timeline/COMPONENT.md +51 -35
  1036. package/src/components/timeline/examples/links.tsx +14 -14
  1037. package/src/components/timeline/examples/narrow.tsx +6 -6
  1038. package/src/components/timeline/examples/overview.tsx +6 -6
  1039. package/src/components/timeline/examples/sizes.tsx +28 -23
  1040. package/src/components/timeline/examples/structure.tsx +30 -30
  1041. package/src/components/timeline/examples/variants.tsx +40 -28
  1042. package/src/components/tooltip/COMPONENT.md +10 -6
  1043. package/src/components/tooltip/examples/examples.module.css +1 -5
  1044. package/src/components/tooltip/examples/non-interactive-trigger.tsx +1 -1
  1045. package/src/components/tooltip/examples/sizes.tsx +17 -10
  1046. package/src/components/typography/COMPONENT.md +17 -2
  1047. package/src/components/typography/examples/examples.module.css +3 -6
  1048. package/src/components/typography/examples/numeric.tsx +16 -0
  1049. package/src/components/video-note/COMPONENT.md +11 -7
  1050. package/src/components/visually-hidden/COMPONENT.md +8 -4
  1051. package/src/components/visually-hidden/examples/assertive.tsx +1 -1
  1052. package/src/components/visually-hidden/examples/overview.tsx +17 -7
  1053. package/src/components/voice-player/COMPONENT.md +15 -7
  1054. package/src/layout/app-header/COMPONENT.md +27 -26
  1055. package/src/layout/app-header/examples/examples.module.css +4 -23
  1056. package/src/layout/app-header/examples/in-app-shell.tsx +3 -5
  1057. package/src/layout/app-header/examples/narrow.tsx +58 -20
  1058. package/src/layout/app-shell/COMPONENT.md +40 -10
  1059. package/src/layout/app-shell/examples/examples.module.css +2 -22
  1060. package/src/layout/app-shell/examples/footer.tsx +2 -2
  1061. package/src/layout/app-shell/examples/overview.tsx +3 -5
  1062. package/src/layout/app-shell/examples/screen.tsx +27 -21
  1063. package/src/layout/app-shell/examples/template.tsx +3 -3
  1064. package/src/layout/bottom-nav/COMPONENT.md +27 -17
  1065. package/src/layout/bottom-nav/examples/examples.module.css +2 -7
  1066. package/src/layout/bottom-nav/examples/floating-action.tsx +2 -2
  1067. package/src/layout/bottom-nav/examples/floating.tsx +2 -2
  1068. package/src/layout/bottom-nav/examples/in-app-shell.tsx +2 -2
  1069. package/src/layout/bottom-nav/examples/router.tsx +6 -5
  1070. package/src/layout/sidebar/COMPONENT.md +50 -40
  1071. package/src/layout/sidebar/examples/account.tsx +1 -3
  1072. package/src/layout/sidebar/examples/brand-header.tsx +1 -3
  1073. package/src/layout/sidebar/examples/collapsible-groups.tsx +1 -3
  1074. package/src/layout/sidebar/examples/controlled-open.tsx +1 -3
  1075. package/src/layout/sidebar/examples/controlled.tsx +1 -3
  1076. package/src/layout/sidebar/examples/custom-part.tsx +1 -3
  1077. package/src/layout/sidebar/examples/dismiss.tsx +47 -0
  1078. package/src/layout/sidebar/examples/examples.module.css +7 -32
  1079. package/src/layout/sidebar/examples/narrow.tsx +44 -42
  1080. package/src/layout/sidebar/examples/nested-items.tsx +1 -3
  1081. package/src/layout/sidebar/examples/overview.tsx +1 -3
  1082. package/src/layout/sidebar/examples/persist.tsx +1 -3
  1083. package/src/layout/sidebar/examples/router.tsx +12 -13
  1084. package/src/layout/sidebar/examples/sizes.tsx +6 -6
  1085. package/src/styles/controls.css +2 -2
  1086. package/src/styles/fonts.css +22 -0
  1087. package/src/styles/globals.css +89 -12
  1088. package/src/styles/theme-dark.css +13 -14
  1089. package/src/styles/theme-light.css +67 -23
  1090. package/src/styles/tokens.css +14 -4
  1091. package/dist/components/dnd/useFlipList.d.ts +0 -17
  1092. package/dist/components/gantt/useEdgeAutoScroll.d.ts +0 -12
  1093. package/dist/components/modal/ModalDialog.d.ts +0 -46
  1094. package/dist/hooks/useStateSwap.d.ts +0 -8
  1095. package/dist/internal/highlightTsxHtml.d.ts +0 -2
  1096. package/dist/internal/layoutPxFromPrimitives.d.ts +0 -6
  1097. package/dist/internal/mergeRefs.d.ts +0 -6
  1098. package/dist/skill/reference/components/drawer/examples/examples.module.css +0 -8
  1099. package/dist/skill/reference/components/popover/examples/match-trigger-width.tsx +0 -23
  1100. package/dist/skill/reference/components/scroll-container/examples/chat.tsx +0 -101
  1101. package/dist/skill/reference/components/spinner/examples/loading-region.tsx +0 -22
  1102. package/src/components/drawer/examples/examples.module.css +0 -8
  1103. package/src/components/popover/examples/match-trigger-width.tsx +0 -23
  1104. package/src/components/scroll-container/examples/chat.tsx +0 -101
  1105. package/src/components/spinner/examples/loading-region.tsx +0 -22
@@ -15,8 +15,8 @@ reference is each component's `COMPONENT.md` ([components.md](components.md)), t
15
15
 
16
16
  - Omit `size` for the default `m` — never write `size="m"`.
17
17
  - Set `size` on the root (`Input.Root size="s"`, `Select.Root size="s"`) — not on `Input.Field` or `Select.Trigger`.
18
- - One tier for a whole region: `<ControlSizeProvider value="s">` around a dense toolbar — not `size="s"` on one control to make it fit. Select, NativeSelect, TagSelect, Datepicker, Tabs and SmartFilter do not read the host tier: give them the same `size` yourself.
19
- - Inside a host (Popover, Banner, LoginForm, the DataTable `toolbar`) leave `Button.Root`, `Input.Root`, `Textarea.Root`, `Checkbox.Root`, `DigitInput` and the other host-reading controls without `size` — the host passes its tier ([full list](api-contract.md)).
18
+ - One tier for a whole region: `<ControlSizeProvider value="s">` around a dense toolbar — not `size="s"` on one control to make it fit.
19
+ - Inside a sized host (Popover, Banner, LoginForm, the DataTable `toolbar`) leave the kit controls without `size` — the host passes its tier ([the host tier](api-contract.md#size-and-the-host-tier)).
20
20
  - A control in a table cell or a card header row is one tier down: `<Button.Root size="s" variant="ghost" tone="neutral">`.
21
21
 
22
22
  ## Structure
@@ -28,9 +28,9 @@ reference is each component's `COMPONENT.md` ([components.md](components.md)), t
28
28
  ## Fields
29
29
 
30
30
  - Frame a field with props on the root: `<Input.Root label="Почта" hint="…" error="…" required>` — not a separate `Label` / `Hint` next to it.
31
- - Mark the minority: `required` when most fields are optional, `optional` when most are required — not both everywhere.
31
+ - Mark the minority, never both everywhere ([the rule](api-contract.md#forms)).
32
32
  - Placeholder is an example value (`name@company.ru`) — never the label.
33
- - Checkbox, Switch, Radio: the text is the part `<Checkbox.Label>`, `hint` / `error` sit on `Checkbox.Root` — not a `label` prop.
33
+ - Checkbox, Switch, Radio: the text is the part `<Checkbox.Label>`, `hint` / `error` sit on `Checkbox.Root` — and a radio choice's on `Radio.Group` ([choice controls](api-contract.md#choice-controls)) — not a `label` prop.
34
34
  - Show `error` after blur or on submit; `<form noValidate onSubmit>` + `<Button.Root type="submit" loading>` — not validation on every keystroke.
35
35
  - Groups of fields: `<Fieldset label="Контакты" disabled={saving}>` with the submit `<Button.Root loading>` outside it — not a hand-reset `<fieldset>` with a `Typography` heading, not `disabled` on every field while saving. One choice with a heading (`Radio.Group label`) needs no Fieldset.
36
36
  - Uploads: `const queue = useUploadQueue({ upload })` → `<FileUpload.Root queue={queue} />` (`FileUpload.Queue` when the picker lives elsewhere) — progress, «В очереди», the reason of a failure, retry and remove come with it (three at once by default, `concurrency`); not a hand-kept list of files with own progress bars. A photo appears at once from its local preview.
@@ -49,7 +49,7 @@ reference is each component's `COMPONENT.md` ([components.md](components.md)), t
49
49
  - Uncontrolled by default: `defaultValue`, `defaultChecked`, `defaultOpen`.
50
50
  - Controlled triads, same names everywhere: `value` / `onValueChange`, `checked` / `onCheckedChange`, `open` / `onOpenChange` — not `onChange(event)` (except the native `Input.Field` / Textarea `onChange`), `isOpen`, `onToggle`.
51
51
  - Selection count is `multiple` (`Select.Root multiple`) — not `type="multiple"`.
52
- - A slow or risky action is an async event: return the request's Promise from `onConfirm`, `onCommit`, `onReorder`, `onBarChange`, `onSend`, a Switch's `onCheckedChange`, a Slider's `onCommit`, a DigitInput's `onComplete`, a Kanban or FileUpload change, a Badge `onRemove`, TagSelect `onCreate`… — the component shows pending, keeps the change on resolve and rolls it back on reject; not `true` / `false`, not your own pending flag, no `onBeforeX`.
52
+ - A slow or risky action is an async event: return the request's Promise from `onConfirm`, `onCommit`, `onReorder`, `onBarChange`, `onSend`, a Switch's `onCheckedChange`, a Slider's `onCommit`, a DigitInput's `onComplete`, a Kanban or FileUpload change, a Badge `onRemove`, TagSelect `onCreate`… — the component shows pending, keeps the change on resolve and undoes it on reject (each component's COMPONENT.md says how); not `true` / `false`, not your own pending flag, no `onBeforeX`.
53
53
  - A Select that saves on pick: return the save's Promise from `onValueChange` — the value shows at once with a Spinner on the trigger and a rejection rolls it back (`labels.changeFailed`); never reset the value by hand. A «Новый клиент» row in the list is `Select.Action` (`onSelect`), never a fake `Select.Item` with a sentinel value or a button under the field.
54
54
  - An option reads its parts by element type: put `Avatar.Root`, `Thumbnail.Root`, `Badge.Root` and `Select.Item*` straight in the item and call your helper as a function (`{clientAvatar(c)}`), not as `<ClientAvatar />`; anything else trailing goes in `Select.ItemMeta`.
55
55
  - Create from a search: one `persistent` `CommandMenu.Item` at the end («Создать клиента «{query}»», while the query is not empty) — it stays when a namesake matches; `CommandMenu.Empty` holds only the text.
@@ -86,58 +86,58 @@ reference is each component's `COMPONENT.md` ([components.md](components.md)), t
86
86
  ## Cards and surfaces
87
87
 
88
88
  - `Card.Root` only for a bounded block with its own title: a KPI tile (`variant="stat-trend"`), a settings panel (`variant="panel"`), side facts — not around a whole section, a form field or a page.
89
- - Never a card in a card, and never a `DataTable` inside a Card — the table is already a filled block.
89
+ - Never a `DataTable` inside a Card — the table is already a filled block; a card in a card only sparingly ([the rule](foundations.md#card-in-a-card)).
90
90
  - Section without a card: `<PageContent.Section label="…">` + the content (a link or button beside the heading in `PageContent.Actions`) — not a hand-made `<section>` + `Typography as="h2"` + own gap.
91
- - The tiles of a screen (KPI cards, charts, panels): one `<PageContent.Grid>` with a `<PageContent.Cell span>` per tile — not an `auto-fit` grid per row (the rows would stand 24 apart instead of 16).
91
+ - The tiles of a screen (KPI cards, charts, panels): one `<PageContent.Grid>` with a `<PageContent.Cell span>` per tile — not a grid per row (the rows would stand 24 apart instead of 16).
92
92
  - Depth from fill, not lines: no borders around blocks; `<Divider />` only inside a block.
93
93
  - Every scroll region is a `ScrollContainer` — never `overflow: auto` on a `div`: its hidden edges fade by themselves (`edges="shadow"` on a filled surface, `"none"` only for a page column), `scrollbar="hidden"` on strips, `snap` on strips of cards, `lock` to hold a list still, `anchor="end"` for a log. Kit components already scroll through it; do not wrap them again.
94
94
  - Tabs are a bar, not a container: `Tabs.Root` stands in the host's padding and the panel content goes straight into `Tabs.Panel` — never a Card or a padded `div` around the tabs or inside a panel. In a Modal / Drawer, `Tabs.Root` wraps `X.Header` + `X.Body` and `Tabs.List` goes last into the header — not a tab strip at the top of the body.
95
95
 
96
96
  ## Tables
97
97
 
98
- - A list page is `<DataTable columns rows getRowKey toolbar={…}>` with `<SmartFilter.Root fields value onValueChange>` + `<SmartFilter.Toolbar />` + `<SmartFilter.Chips />` in `toolbar`; filter rows with `matchesSmartFilter` — not a search Input and a row of Selects above the table.
98
+ - A list page is a `<DataTable columns rows getRowKey>` under the page's `<SmartFilter.Root fields value onValueChange>` with `<SmartFilter.Toolbar />` + `<SmartFilter.Chips />` in its `PageToolbar` ([where the filters go](composition.md#where-the-filters-go)); filter rows with `matchesSmartFilter` — not a search Input and a row of Selects above the table.
99
99
  - Search over a table or a list page is always SmartFilter, even with no filter fields yet (`fields={[]}` is a plain search that grows into filters). A search `Input` only outside a filtered list: inside a picker, a settings section, a panel.
100
100
  - Paging is built in: `paging="pages"` (default) with `pageSize`, `paging="infinite"` for feeds, `paging="none"` for short lists — not a separate `<Pagination>` under a DataTable.
101
101
  - Long lists are virtualized inside the kit: pass the whole array to `DataTable` (with `scrollHeight` or `paging="infinite"`; over 100 rows — grouped, `onReorder` and `renderExpanded` bodies render every row, keep those short or paged), `TagSelect options`, `Chat.Messages items`, `Gantt rows` — never slice it by hand, never wrap a kit list in react-window / react-virtual or your own windowing. Big remote data is still paged or loaded on scroll by the server (`source="server"`, `onLoadMore`).
102
102
  - Data the server sorts and pages (thousands of records): `source="server"` + `rowCount`, controlled `sort` / `page` as the request, `page` back to 1 on a new search or filter, old rows kept with `loading` while the next page loads — not a server page passed to the default client mode, and not `rows={[]}` between pages.
103
- - Categories (sources, platforms, regions) get `color` and the same order of `chartColors` in charts; statuses and meanings get `tone` — never paint categories with tones.
104
- - A chart with axes or several series: `<ChartFrame.Root series state>` around the library (or your SVG) with `ChartFrame.Plot renderPlot`, `Legend`, `Table` — not a hand-made Card with a grey box while loading and a legend of colored dots.
103
+ - Categories (sources, platforms, regions, teams) get `color` and the same order of `chartColors` in charts; statuses and meanings get `tone` — never paint a status with a palette hue or a category with a tone.
104
+ - A chart with axes or several series: `<ChartFrame.Root series rows state>` around the library (or your SVG) with `ChartFrame.Plot renderPlot` and `Legend`; `rows` is the data table screen readers get — not a hand-made Card with a grey box while loading and a legend of colored dots.
105
105
  - A tooltip on your own SVG chart: `<ChartFrame.Tooltip point={{ x, y }} items>` with the pointer in plot coordinates — not a `foreignObject` or a div placed and clamped by hand; it flips only when out of room.
106
- - Amounts, counts and dates are `numeric` columns; statuses are `Badge.Root color` from one status → color map.
106
+ - Amounts, counts and dates are `numeric` columns; statuses are `Badge.Root tone` from one status → tone map.
107
107
  - Rows people order by hand: `onReorder(id, beforeId)` (apply it with `moveBefore`, return the save's Promise) — not a Dnd list rebuilt next to the table.
108
108
  - A short list of records people order by hand (stages, priorities) is `<List.Root onReorder>` with `List.Item value` — not up / down buttons or a hand-made `Dnd.Sortable`.
109
109
  - Groups that fold: pass `defaultCollapsedGroups={[]}` (or the controlled `collapsedGroups` + `onCollapsedGroupsChange`) — not your own button in `renderGroupHeader` or filtering `rows`. One heatmap over several columns: the same `scale: { min, max }` on each.
110
110
  - A trend in a table row is `<Sparkline layout="compact">` in the column's `cell` (a column `width`, series built once, not inline, the same `min` / `max` on every row when rows compare by size); the number itself goes in its own column. A missing day is `value: null`, never `0`.
111
111
  - Properties of one record: `<DescriptionList.Root>` of `DescriptionList.Item` — not a hand-made grid of label / value text, not a one-row DataTable.
112
112
  - Who is busy when, a plan with dates: `Gantt` with `onBarChange` / `onBarCreate` — not bars drawn by hand or a DataTable of start and end dates. Statuses moved by hand: `Kanban` — `plain` (default, a header plate) or `line` (a header over a line) for a board that is the page's main region, `variant="well"` only when columns must read as bounded queues (WIP limits, sparse columns); never a Card or a filled box around a column.
113
- - Open a board card with `Kanban.Root onItemClick` (click, Enter, Space, never after a drag) or `getItemHref`; a Gantt row with `onRowClick` / `getRowHref` (the DataTable contract), a bar with `onSelect`; more facts in a bar tooltip with `renderBarTooltip` (it adds lines under the dates). A legend of hues is a row of `Badge.Root color` + `Badge.Dot` in the host's `toolbar`, the category also in text. Hour slots (bookings, appointments) are not Gantt — its unit is a calendar day.
113
+ - Open a board card with `Kanban.Root onItemOpen` (click, Enter, Space, never after a drag) or `getItemHref`; a Gantt row with `onRowClick` / `getRowHref` (the DataTable contract), a bar with `onItemOpen`; more facts in a bar tooltip with `renderBarTooltip` (it adds lines under the dates). A legend of hues is a row of `Badge.Root color` + `Badge.Dot` in the host's `toolbar`, the category also in text. Hour slots (bookings, appointments) are not Gantt — its unit is a calendar day.
114
114
 
115
115
  ## Chat
116
116
 
117
117
  - A conversation is `Chat`: `<Chat.Root typing selected search>` with `Chat.Header` (avatar, `Chat.Title`, `Chat.Description`, `Chat.Actions` + `Chat.SearchButton`), `Chat.Search`, `Chat.Pinned`, `<Chat.Messages items getKey getAuthor getDate renderMessage>` and `<Chat.Footer><Composer.Root /></Chat.Footer>` — not a header, a ScrollContainer and a list of your own, not Cards or a Timeline styled as bubbles, not a Textarea with a send button. A list without the rest is `Chat.Root` with `Chat.Messages` alone; one message on its own is `Message.Root`.
118
118
  - The list of conversations is `ChatList` — not a `List` or Cards with your own preview, unread counts and «печатает…». Back button and avatar in the chat header are plain children of `Chat.Header`: it lays them out side by side.
119
119
  - A dialog loading is `<Chat.Messages loading>` (bubble skeletons that cross-fade into the list) — not a Spinner or grey boxes. A bot's buttons under a message are `Message.Actions` rows of `Button.Root variant="soft" tone="neutral"` (`asChild` for links), never buttons inside `Message.Text`.
120
- - `renderMessage` returns a `Message.Root` (its `value` and `position` are set for you) or a `Chat.Service`; keep it stable with `useCallback` (other messages it looks up through a ref) — an item renders again only when it, its place or the function changes. Dates, runs and the unread band (`unread={key}`) come from the list.
121
- - A group chat is `<Chat.Messages type="group">`: put `Message.Author` (`color={hueOf(user.id)}`, `tag`, `Message.AuthorIcon` for a crown) and `Message.Avatar` on every message — the list shows the header on the first of a run and the avatar on the last; a direct chat shows neither.
120
+ - `renderMessage` returns a `Message.Root` (its `value` and `position` are set for you) or a `Chat.Service`; an inline function is fine: an item renders again only when it or its place changes, so a row shows what its item holds, and another message (a reply's original) comes from `entry.find(key)`. Dates, runs and the unread band (`unread={key}`) come from the list.
121
+ - A group chat is `<Chat.Messages group>`: put `Message.Author` (`color={hueOf(user.id)}`, `tag`, `Message.AuthorIcon` for a crown) and `Message.Avatar` on every message — the list shows the header on the first of a run and the avatar on the last; a direct chat shows neither.
122
122
  - A voice message is `VoicePlayer` inside `Message.Root`; a round video is `VideoNote` inside `Message.Root`; photos, files, places and contacts are `Message` parts — not FileUpload rows or Cards. The same album outside a chat is `Gallery`. The two players share one API: learn one, use both.
123
123
  - A transfer either way is one prop set on every message content (VoicePlayer, VideoNote, `Message.File`, `Message.Media` / `Gallery` items): `transfer` (`remote` · `queued` · `loading` · `failed` · `done`), `transferProgress`, `transferDirection` (`upload` / `download` — the words only), `onCancel` / `onRetry` / `onDownload` (a Promise keeps the disk pending, a rejection is announced; on `Message.Media` / `Gallery` they sit on the root and get the item's index). A `useUploadQueue` item maps as is: `transfer={item.status} transferProgress={item.progress}`. Never your own spinner, bar or ring over media.
124
124
  - Send optimistically: `onSend` adds the message with `status="sending"` under a client id and returns; patch `status` to `sent` / `read` / `failed` as the server answers. Keep the row's `key` and `value` when the server id arrives — a re-keyed row enters a second time. Give `Message.Root` `onRetry` for `failed`.
125
- - A reply or an edit: `<Composer.Context value={id}>` — `onSend` gets `replyTo` / `editOf` and the bar closes itself after the send; never read the replied message from a closure. ↑ in an empty field is `onEditLast`.
125
+ - A reply or an edit: `<Composer.Context messageId={id}>` — `onSend` gets `replyTo` / `editOf` and the bar closes itself after the send; never read the replied message from a closure. ↑ in an empty field is `onEditLast`.
126
126
  - «печатает…» on the other side: `Composer onActivityChange` (`typing` / `voice` / `video` / `null`, on a change only) → your socket; on the receiving side `<Chat.Root typing={activity === "typing"}>` (the header's status and the list's typing bubble together). Never send it from `onValueChange`.
127
127
  - Appearance: messages that are new at the end enter by themselves — mine and theirs float up a little from below and fade in; the first render, history loaded above and rows scrolled into view never animate. Do not add your own enter animation or `scrollTop = scrollHeight`.
128
128
  - `Chat.Messages` scrolls to my message, stays at the end for theirs while the reader is there, and otherwise shows the «N новых» button; `onNewMessage(value, { direction })` is for a sound or a counter, `onRead(values)` for read receipts (only what was really seen). The first unread is `unread={key}`; older history is `hasOlder` + `onLoadOlder`.
129
- - Jump to a message: `Message.Reply target={id}`, a press on `Chat.Pinned`, or `Chat.Root current={id}` (the chat scrolls to it and the message blinks); search: `Chat.SearchButton` + `Chat.Search` mark, count and step through the matches in texts and transcripts, keeping the others stepped back. Never an outline or a wash of your own on the target or on selected messages. Never `scrollIntoView` or your own transforms on rows.
129
+ - Jump to a message: `Message.Reply target={id}`, a press on `Chat.Pinned`, or `Chat.Root jumpTo={id}` (the chat scrolls to it and the message blinks); search: `Chat.SearchButton` + `Chat.Search` mark, count and step through the matches in texts and transcripts, keeping the others stepped back. Never an outline or a wash of your own on the target or on selected messages. Never `scrollIntoView` or your own transforms on rows.
130
130
  - A long history (thousands of messages): nothing to switch on — `Chat.Messages` renders only the rows around the view and keeps the reader's place. With children, every top-level child is one row (a `Message.Root`, or a fragment / your own row component keyed by the message `value`); give pictures their `width` / `height` so a row's size is final before load; jumps, search, selection and the keyboard still reach every message. Not a hand-rolled window, `content-visibility` on rows or a measured bubble.
131
131
  - A message's layout is CSS: the bubble fits its content and the time sits at the end of the last line (or of the reactions row). Every size change of a message (reactions, a transcript, an edit, an upload) plays as one built-in stroke, width and height together; a reaction grows the message upward with the time still, the rows above gliding as one block. Never size, measure or animate a bubble yourself; an own content part declares itself with the kit's part contract instead of a wrapper.
132
132
  - One sound at a time is built in: a voice message, a video message and a chat video pause each other; `playing` / `onPlayingChange` on `VoicePlayer` or `VideoNote` when the app needs to know. A round video never plays or loops before a press. A recorded voice message without levels gets them from `getWaveform(blob)` once, stored with the message.
133
- - Transcripts: `transcript="…"` on `VoicePlayer` or `VideoNote` when the text is known, or `onTranscribe={() => api.transcribe(id)}` returning a Promise of the text; the button, the skeleton, the bubble's one-stroke growth and the rollback on a rejection are built in. Store the resolved text with the message. Not a `Message.Text` under the voice message, not a disclosure of your own.
133
+ - Transcripts: `transcript="…"` on `VoicePlayer` or `VideoNote` when the text is known, or `onTranscribe={() => api.transcribe(id)}` returning a Promise of the text; the button and its pending state, the bubble's one-stroke growth and the rollback on a rejection are built in. Store the resolved text with the message. Not a `Message.Text` under the voice message, not a disclosure of your own.
134
134
 
135
135
  ## Overlays
136
136
 
137
137
  - Blocking decision or ≤ 4 fields → `Modal` (`<Modal.Content size="s">` for a confirm); long form, filters, details → `Drawer`; a short task that ends by itself (a date, an action, a note) → `Sheet`; small panel at a control → `Popover`; list of actions → `Dropdown`; a field value → `Select`; a name for an icon button → `Tooltip`; ⌘K → `CommandMenu`; a photo, a scan or a video full screen from its thumbnail → `MediaViewer` (an album in a grid is `Gallery`, which opens it for you; a standalone viewer keeps `open` and `index` in two states) — not a Modal with an `<img>`.
138
138
  - A record's drawer or modal shows its person or object as `Drawer.Icon` / `Modal.Icon` around `Avatar.Root` / `Thumbnail.Root`. A confirm that asks for input (a reason) is a `Modal size="s"` with the field, `Modal.Confirm` and `Modal.Guard busy` — `ConfirmDialog` is a question only.
139
139
  - Never a hand-made `div` backdrop, dialog, menu or tooltip.
140
- - Every Modal and Drawer has all three zones: `Header` (title, ×) · `Body` (content, scrolls) · `Footer` (actions). Details: `<Drawer.Footer><Drawer.Close><Button.Root variant="outline" tone="neutral">Закрыть</Button.Root></Drawer.Close></Drawer.Footer>`, plus the main action last; a form: «Отмена» + submit. Not a drawer that ends with the body, not Save at the bottom of the body. A `Sheet` (from the bottom edge) is the opposite: no footer by default — a pick or a swipe ends it — and its header is optional: keep it when the content needs a title, drop it (× and hairline go too) when the content speaks for itself, with `aria-label` on `Sheet.Content`. Never `Drawer.Content side="bottom"`.
140
+ - Every Modal and Drawer has its `Header` (title, ×); `Body` (content, scrolls) and `Footer` (actions) are there when it has content and actions. Actions always go into the `Footer`: details `<Drawer.Footer><Drawer.Close><Button.Root variant="outline" tone="neutral">Закрыть</Button.Root></Drawer.Close></Drawer.Footer>`, plus the main action last; a form: «Отмена» + submit — not Save at the bottom of the body. A `Sheet` (from the bottom edge) is the opposite: no footer by default — a pick or a swipe ends it — and its header is optional: keep it when the content needs a title, drop it (× and hairline go too) when the content speaks for itself, with `aria-label` on `Sheet.Content`. Never `Drawer.Content side="bottom"`.
141
141
  - Content inside a Drawer, a Sheet or a Card is the host's own: a calendar is `Datepicker.Panel` straight in the body, across its width — no card, no padded box around it.
142
142
  - A destructive confirm is `<ConfirmDialog.Root title description confirmLabel onConfirm={remove}>` with a `ConfirmDialog.Trigger` — not a Modal assembled as a confirm with your own pending state; a reversible delete offers «Отменить» in the notification instead.
143
143
  - Overlays close smoothly only if they stay mounted: render the `Root` always and drive visibility with `open` alone — never `{open && <Drawer.Root>}`, never a changing `key` on the Root. The kit keeps the last content on screen while the exit plays.
@@ -153,7 +153,7 @@ reference is each component's `COMPONENT.md` ([components.md](components.md)), t
153
153
  - One ring in the kit: a share → `ProgressCircle value` (`null` while unknown, `spin` while it grows); an anonymous busy mark → `Spinner`; a ring you press → circle Button `progress`. Never your own `@keyframes` ring or conic gradient.
154
154
  - A single destructive action that is easy to redo by hand (clear a draft, revoke a token), no list and no dialog: `<Button.Root tone="danger" variant="soft" holdToConfirm onConfirm={remove}>` — the action in `onConfirm`, not `onClick`. A row in a list: delete at once and offer «Отменить» in the notification.
155
155
  - Counts: a number child of `Badge` rolls its digits — not a string you re-render with your own fade.
156
- - New password: `<Input.Root strength>`; steps of a whole: `<ProgressBar steps value={2} max={5} />`; a trend tile: `<Sparkline data label formatValue />`.
156
+ - New password: `<Input.Root strength>`; steps of a whole: `<ProgressBar label="Шаги настройки" steps value={2} max={5} />`; a trend tile: `<Sparkline data label formatValue />`.
157
157
  - A rare milestone only: `celebrate({ origin: event.currentTarget })` — never for a saved form.
158
158
  - No motion on keyboard-driven or high-frequency actions; tokens only, no bounce. Full guide: [motion.md](motion.md).
159
159
 
@@ -165,15 +165,15 @@ State change is continuous in the whole kit: every region that changes what it s
165
165
  - Region loading: `<Skeleton>` in the geometry of the data — same rows, same gaps (`<Skeleton />` for a text line, `shape="circle"` for an avatar, `shape="control"` for a field, `shape="block"` for an image or chart) — not a spinner in an empty card, not a grey box or shimmer you draw.
166
166
  - `Spinner` only where there is no shape to hold (a running job, a status line); a busy button is `<Button.Root loading>`.
167
167
  - Refreshing data already on screen: keep it, set `aria-busy` — not back to a skeleton on every refetch.
168
- - Table states in place: `loading` (+ `loadingRows`), `empty`, `error` on `DataTable` — the head and toolbar stay.
168
+ - Table states in place: `loading` (+ `loadingRows`), `empty`, `loadError` on `DataTable` — the head and toolbar stay.
169
169
  - First run of a page or region: `EmptyPage.Root` + `EmptyPage.Icon` + `EmptyPage.Title` + `EmptyPage.Description` + `EmptyPage.Actions` with one action — not «Здесь пока ничего нет».
170
170
  - Page-level persistent problem: `<Banner.Root tone="danger">` first in `PageContent.Body`; the result of an action: `useNotifications().notify({ tone, title })`.
171
171
 
172
172
  ## Sidebar
173
173
 
174
174
  - Brand header: `Sidebar.Header` > `Sidebar.Brand href description` (with `Sidebar.BrandLogo`) + `<Sidebar.Toggle variant="header" />` — not a Toggle in the footer when the rail has a brand.
175
- - Off-canvas: `offCanvas="auto"` (default, below 768px) with `open` / `onOpenChange` and a menu button that opens it; `offCanvas="always"` for navigation behind a menu at any width; `offCanvas="never"` for a rail that always stays.
176
- - Every item has `Sidebar.ItemIcon` (compact mode shows only icons) and is a link: `href` or `asChild` with the router `NavLink`; `current` marks the page.
175
+ - Off-canvas: `offCanvas="auto"` (default, below 768px), `"always"` for navigation behind a menu at any width, `"never"` for a rail that always stays; the AppHeader draws the menu button that opens it — no menu state of your own; another trigger reads `useAppShellNav()`.
176
+ - Every item is a link (`href` or `asChild` with the router `NavLink`; `current` marks the page), with a `Sidebar.ItemIcon` on the [top-level items and sub-list parents](layouts.md#sidebar-icons).
177
177
  - The signed-in user: `Sidebar.Account` inside `Dropdown.Trigger` at the end of `Sidebar.Footer`.
178
178
  - Structure: everyday places on top without a label, categories as `Sidebar.Group label collapsible` (one short word, 3–7 items), views of one section as `Sidebar.Sub` (one level, the parent only discloses) — not every group folded, not a sub-list inside a sub-list.
179
179
  - Counts: plain `Sidebar.ItemCount` for information; `color` only when it needs action — it becomes a dot on the rail and on folded parents.
@@ -183,9 +183,9 @@ State change is continuous in the whole kit: every region that changes what it s
183
183
 
184
184
  Full rules: [responsive.md](responsive.md).
185
185
 
186
- - The page panel is `<PageToolbar.Root>` with, in this order, `Tools` (`SmartFilter.Toolbar`: search, then filter), `Sections` (a `fullWidth` SegmentedControl), `View`, `Actions`, `Chips` — the active filters sit under the top row, never under the sections; on a phone the primary action takes its own row by itself when the search would be squeezed; not a hand-made flex row of tabs, search and buttons.
186
+ - The page panel is `<PageToolbar.Root>` with `Tools` (`SmartFilter.Toolbar`), `Sections` (a `fullWidth` SegmentedControl), `View`, `Actions`, `Chips` — it orders and wraps them itself ([the page panel](responsive.md#page-panel--pagetoolbar)); not a hand-made flex row of tabs, search and buttons.
187
187
  - Rearrange, never hide: every desktop function is on the phone, in another place or a menu — not `display: none` below a breakpoint.
188
- - Breakpoints 640 · 768 · 1024 · 1280 only for the app frame; inside a page — intrinsic grids (`auto-fill, minmax`) and container queries.
188
+ - Breakpoints only in [their scope](responsive.md#breakpoints); inside a page — [intrinsic grids](responsive.md#intrinsic-grids) and container queries.
189
189
  - A wide table scrolls inside itself; offer `DataTable.ColumnsMenu` in its `toolbar` — never drop columns by breakpoint, never hand-build the chooser.
190
190
  - A row that opens a record page is `getRowHref` (a real link: ⌘-click, new tab), a row that opens a drawer is `onRowClick` — never `navigate()` in `onRowClick`, never your own `event.target` checks for buttons in the row.
191
191
  - A list + detail screen is `PageContent.Split` in a `PageContent.Root fill` page, its records a `List` (`current` on the open one) — never ghost Buttons with a soft current; a full-height table is `scrollHeight="fill"` — never a height computed from `100vh`.
@@ -198,7 +198,7 @@ Full rules: [responsive.md](responsive.md).
198
198
 
199
199
  - Gaps are `gap` on the parent with `--prime-space-N` (N × 4px): 8 in a row of buttons, 16 tile → tile, 20 field → field, 32 group → group; `PageContent` already spaces blocks 24 and sections 40 — not margins, not outer padding.
200
200
  - Tokens only: `var(--prime-space-4)`, `var(--prime-color-text-secondary)`, `var(--prime-radius-m)` — never raw `px` / `rem` / hex, never `--prime-ref-*`, never inline `style`.
201
- - Text through `Typography` roles (`title-m`, `title-s`, `body-m`, `caption`) and `tone="secondary" | "muted"` — not `font-size` or `color` in CSS.
201
+ - Text through `Typography` roles (`title-m`, `title-s`, `body-m`, `caption`) and its `tone` — not `font-size` or `color` in CSS ([text colour](foundations.md#text-colour)).
202
202
 
203
203
  ## UX — what goes on the screen
204
204
 
@@ -207,11 +207,11 @@ Full rules: [responsive.md](responsive.md).
207
207
  - Every label carries something new: once per column, never numbered, never repeating its heading; no hint that explains what the layout shows (a lock already says «закреплено»).
208
208
  - Buttons say the verb and the object («Выставить счёт»), errors say how to fix it («Формат: +7 912 404-18-20»), empty states offer the next step — not «ОК», «Ошибка», «Нет данных».
209
209
  - Money, numbers and dates through `Intl` (`ru-RU`); «ёлочки», `…`, a non-breaking space before a unit — not `toFixed` and string glue.
210
- - Friction matches the cost: a reversible action at once with «Отменить» in a `Notification`; `ConfirmDialog` only for irreversible or weighty ones, naming the thing and the loss — not «Вы уверены?» on every delete.
210
+ - Friction matches the cost of a mistake ([the ladder](ux.md#5-friction-matches-the-cost-of-a-mistake)) — not «Вы уверены?» on every delete.
211
211
  - A disabled control says why when the reason is not on screen; an action without permission is hidden.
212
212
  - Tabs, filters, search, page and the open record live in the URL.
213
213
  - Changing a screen that exists: audit it against [ux.md](ux.md), [checklist.md](checklist.md) and [anti-slop.md](anti-slop.md) first, fix the shape, then make the change.
214
- - Before handing over, look at it in a browser: both themes, 1280 and 375 px, every text read aloud.
214
+ - Before handing over, look at it in a browser ([the visual check](ux.md#9-look-at-it-before-handing-it-over)).
215
215
 
216
216
  ## Anti-slop
217
217
 
@@ -228,8 +228,8 @@ import { applyTheme } from "prime-ui-kit";
228
228
  applyTheme("light");
229
229
  ```
230
230
 
231
- The frame itself (providers, `AppShell` with `Sidebar` and the phone menu button) is built once too:
232
- copy it from [layouts.md](layouts.md#app-frame-once-per-app).
231
+ The frame itself (providers, `AppShell` with the `Sidebar`) is built once too: copy it from
232
+ [layouts.md](layouts.md#app-frame-once-per-app).
233
233
 
234
234
  A document page (a form) — its title is in main, its header carries none:
235
235
 
@@ -262,10 +262,10 @@ export function ProfilePage() {
262
262
  ```
263
263
 
264
264
  A region with all its states — loading, data, empty, error — that flow into each other. Copy this
265
- shape for every block that fetches data (a table uses DataTable `loading` / `empty` / `error` instead):
265
+ shape for every block that fetches data (a table uses DataTable `loading` / `empty` / `loadError` instead):
266
266
 
267
267
  ```tsx
268
- import { Button, Card, Crossfade, EmptyPage, Icon, Skeleton, Typography } from "prime-ui-kit";
268
+ import { Card, Crossfade, EmptyPage, Icon, Skeleton, Typography } from "prime-ui-kit";
269
269
  import styles from "./InvoicesCard.module.css";
270
270
  // .rows { display: grid; gap: var(--prime-space-3); margin: 0; padding: 0; list-style: none; }
271
271
  // .row { display: flex; align-items: center; justify-content: space-between; gap: var(--prime-space-4); }
@@ -276,7 +276,8 @@ type Invoice = { id: string; client: string; amount: string };
276
276
  type InvoicesCardProps = {
277
277
  status: "loading" | "ready" | "error";
278
278
  invoices: Invoice[];
279
- onRetry: () => void;
279
+ /** Loads the invoices again; the retry button stays busy until the Promise settles. */
280
+ onRetry: () => Promise<void>;
280
281
  };
281
282
 
282
283
  const PLACEHOLDER_ROWS = ["a", "b", "c"];
@@ -329,8 +330,9 @@ export function InvoicesCard({ status, invoices, onRetry }: InvoicesCardProps) {
329
330
  </EmptyPage.Root>
330
331
  ) : null}
331
332
  {state === "error" ? (
332
- <EmptyPage.Root size="s" role="alert" aria-labelledby="invoices-error">
333
- <EmptyPage.Icon tone="danger">
333
+ // tone="danger": the danger tile, and the region announces itself (role="alert").
334
+ <EmptyPage.Root size="s" tone="danger" aria-labelledby="invoices-error">
335
+ <EmptyPage.Icon>
334
336
  <Icon name="status.danger" />
335
337
  </EmptyPage.Icon>
336
338
  <EmptyPage.Title as="h3" id="invoices-error">
@@ -338,9 +340,7 @@ export function InvoicesCard({ status, invoices, onRetry }: InvoicesCardProps) {
338
340
  </EmptyPage.Title>
339
341
  <EmptyPage.Description>Сервер не ответил. Данные не потеряны.</EmptyPage.Description>
340
342
  <EmptyPage.Actions>
341
- <Button.Root variant="soft" tone="neutral" onClick={onRetry}>
342
- Повторить
343
- </Button.Root>
343
+ <EmptyPage.RetryButton onRetry={onRetry} />
344
344
  </EmptyPage.Actions>
345
345
  </EmptyPage.Root>
346
346
  ) : null}
@@ -1,113 +1,81 @@
1
1
  # Checklist before handing over a screen
2
2
 
3
- Answer every item yes or no. Any «no» is fixed before handing over.
3
+ Answer every item yes or no. Any «no» is fixed before handing over. Each item links to the rule it
4
+ checks.
4
5
 
5
6
  ## Composition
6
- - [ ] The screen starts from the closest screen in [composition.md](composition.md#screens) (list, detail,
7
- settings, form in a Drawer, dashboard, states, messenger) and keeps its skeleton.
8
- - [ ] The page titles itself in its `AppHeader`: `AppHeader.Title`, a line of data in
9
- `AppHeader.Description`, the page's tools in `AppHeader.Tools` (`PageToolbar`); main has no
10
- `PageContent.Header`. Only a document page (settings, a long form, help) has `PageContent.Header`
11
- and no title in the header. Blocks in `PageContent.Body`.
12
- - [ ] The header row holds only what this page needs: no global search, no app-wide buttons.
13
- - [ ] Cards only for standalone blocks; no card around a table, a single field or the whole page.
7
+ - [ ] The screen starts from the closest working screen and keeps its skeleton ([screens](composition.md#screens)).
8
+ - [ ] An app page titles itself in its `AppHeader`; only a document page has `PageContent.Header` ([page skeleton](composition.md#1-page-skeleton)).
9
+ - [ ] The header row holds only this page's title, buttons and tools — nothing app-wide ([page skeleton](composition.md#1-page-skeleton)).
10
+ - [ ] A Card only for a standalone titled block — never around a table, a single field or the page ([surfaces](composition.md#4-surfaces)).
14
11
 
15
12
  ## UX ([ux.md](ux.md))
16
- - [ ] I wrote the brief first: who and what for, the data and its shape, the main action, the states, the narrow screen.
17
- - [ ] Every entity is laid out by its shape: one record is one row or one block, never split over lines;
18
- records a person edits are a `FieldList`, records a person reads a `DataTable`.
19
- - [ ] Labels on a form of rows ≤ columns + the list label: no label repeated per row, none numbered
20
- («Пункт 1»), none repeating its heading; a unit in one place (the field's affix).
21
- - [ ] No text that explains the layout; every hint says what the person cannot see.
22
- - [ ] Buttons say the verb and the object; errors say how to fix it; empty states offer the next step.
23
- - [ ] Money, numbers and dates through `Intl` with `ru-RU`; «ёлочки», `…`, a non-breaking space before units.
24
- - [ ] Friction matches the cost: reversible → do it and offer «Отменить»; irreversible → `ConfirmDialog`
25
- naming the thing and the loss; bulk → the count.
26
- - [ ] A disabled control says why when the reason is off screen; an action without permission is hidden.
27
- - [ ] Defaults prefill what the system knows; each field has the control and `inputMode` its data needs;
28
- rare settings sit behind a disclosure.
29
- - [ ] Tabs, filters, search, page and the open record are in the URL.
30
- - [ ] I looked at the screen in a browser: both themes, 1280 and 375 px, the longest real values, an
31
- empty list, an error on every field.
13
+ - [ ] I wrote the five-line brief before the JSX ([brief](ux.md#1-brief-before-code)).
14
+ - [ ] Every entity is laid out by its shape: a record is one row or one block ([data shape](ux.md#2-the-shape-of-the-data-decides-the-layout)).
15
+ - [ ] Labels on a form of rows ≤ columns + the list label; none repeated, numbered or repeating its heading ([label economy](ux.md#3-label-economy)).
16
+ - [ ] No text explains the layout; every hint says what the person cannot see ([label economy](ux.md#3-label-economy)).
17
+ - [ ] Buttons say the verb and the object, errors say how to fix it, empty states offer the next step ([words](ux.md#4-words)).
18
+ - [ ] Money, numbers and dates go through `Intl` with `ru-RU`, in Russian typography ([words](ux.md#4-words)).
19
+ - [ ] The friction of every action matches the cost of a mistake ([friction](ux.md#5-friction-matches-the-cost-of-a-mistake)).
20
+ - [ ] A disabled control says why when the reason is off screen; an action without permission is hidden ([nothing to guess](ux.md#6-nothing-to-guess)).
21
+ - [ ] A request a value starts — a simulated one too — is cancelled when the value changes again ([nothing to guess](ux.md#6-nothing-to-guess)).
22
+ - [ ] Tabs, filters, search, page and the open record are in the URL ([nothing to guess](ux.md#6-nothing-to-guess)).
23
+ - [ ] Defaults prefill what the system knows; each field has the control and `inputMode` of its data ([ask less](ux.md#7-ask-less)).
24
+ - [ ] I looked at the screen in a browser, filled badly ([the visual check](ux.md#9-look-at-it-before-handing-it-over)).
32
25
 
33
26
  ## Grid and spacing
34
- - [ ] Every spacing, size and gap in my CSS is a `--prime-space-*` (or another `--prime-*`) token on the 4px grid.
35
- - [ ] Spacing is `gap` on the parent; no margins on children; no outer padding duplicating `AppShell.Main` / `PageContent.Body`.
36
- - [ ] Proximity holds: inline controls 8, tile→tile 16 (one `PageContent.Grid`), field→field 20, block→block 24, group→group 32, section→section 40 (`PageContent.Section`).
37
- - [ ] Inside a group things are visibly closer than between groups.
27
+ - [ ] Every length in my CSS is a `--prime-*` token on the 4px grid ([grid](foundations.md#1-4px-grid)).
28
+ - [ ] Spacing is `gap` on the parent; no margins, no outer padding of my own ([rhythm](composition.md#2-rhythm--the-4px-grid)).
29
+ - [ ] The proximity scale holds: closer inside a group than between groups ([proximity](foundations.md#2-proximity-scale)).
38
30
 
39
31
  ## Sizes and alignment
40
- - [ ] Default size `m`, unless the whole region is deliberately dense (`s`) or prominent (`l`).
41
- - [ ] Every row of controls uses one size; their heights line up.
42
- - [ ] Icon-only buttons are square (round `shape="circle"` only for media and transfer actions) and have
43
- `aria-label`.
44
- - [ ] Controls inside table cells are one tier below the table; no CSS sets table row or cell heights.
32
+ - [ ] Default size `m`; a tier changes for a whole region, never for one control ([the host tier](api-contract.md#size-and-the-host-tier)).
33
+ - [ ] Every row of controls uses one size and its heights line up ([density](composition.md#5-density-and-size)).
34
+ - [ ] Controls in table cells are one tier below the table; no CSS sets row or cell heights ([size axis](foundations.md#3-size-axis)).
35
+ - [ ] Icon-only buttons are square (round only for media and transfers) and named ([icons](api-contract.md#icons)).
45
36
 
46
37
  ## Text
47
- - [ ] Every text goes through a kit component or `Typography` with a role; no custom font sizes/weights.
48
- - [ ] One page title, one `<h1>` (`AppHeader.Title`, or `PageContent.Title` on a document page);
49
- headings descend without skipping levels (`Card.Title as="h2"` directly under the page title).
50
- - [ ] Secondary text uses `tone="secondary"`/`"muted"`; numbers in tables and prices are tabular.
51
- - [ ] No filler copy, no emoji, no text that restates the heading.
38
+ - [ ] Every text goes through a kit part or a `Typography` role ([typography](foundations.md#7-typography)).
39
+ - [ ] One page title, one `<h1>`; headings descend without skipping levels ([hierarchy](composition.md#3-hierarchy--air-first-then-type)).
40
+ - [ ] Text colour comes from `tone`; numbers in tables and prices are tabular ([text colour](foundations.md#text-colour)).
41
+ - [ ] No filler copy, no emoji, no text that restates the heading ([decoration](anti-slop.md#8-decoration-and-filler)).
52
42
 
53
43
  ## Tokens and surfaces
54
- - [ ] No raw px/rem/hex, no `--prime-ref-*`, no inline `style`, no overrides of kit internals
55
- (allowed: `@media` conditions and length props a COMPONENT.md documents, like DataTable column `width`).
56
- - [ ] Every scroll region is a `ScrollContainer` (no `overflow: auto` of my own); kit components are not
57
- wrapped in another one.
58
- - [ ] Blocks are separated by fill and air, not borders; no card inside a card without reason.
59
- - [ ] My own bounded blocks are `Card`s (or plain tiles on `--prime-color-layer-nested` +
60
- `--prime-card-radius`); no hard-coded `--prime-color-layer-<n>-*`.
61
- - [ ] Hover never merges: a whole clickable card lifts (`--prime-shadow-overlay`) instead of a wash;
62
- a part touching its surface's edge hovers with `--prime-color-fill-muted-hover`;
63
- `--prime-color-fill-subtle` only on transparent, padded rows and ghost controls. Checked in both
64
- themes, on the page and inside a card.
44
+ - [ ] No raw values, `--prime-ref-*`, inline `style` or overrides of kit internals ([styling](api-contract.md#styling-your-own-wrappers)).
45
+ - [ ] Every scroll region is a `ScrollContainer`; kit components are not wrapped in another one ([ready components](anti-slop.md#7-div-instead-of-a-ready-component)).
46
+ - [ ] Blocks are separated by fill and air; a card in a card only as a deliberate next layer ([card in a card](foundations.md#card-in-a-card)).
47
+ - [ ] My own bounded blocks are `Card`s or the plain nested tile ([your own block](foundations.md#your-own-bounded-block)).
48
+ - [ ] No hover merges with its neighbour, in both themes, on the page and in a card ([hover](anti-slop.md#3a-hover-that-merges-with-the-neighbour)).
65
49
 
66
50
  ## Reuse
67
- - [ ] Every repeated-looking element is one component (kit or `shared/ui`), not copies.
68
- - [ ] No `div` where a kit component exists (Divider, Kbd, Badge, Card, LinkButton, Typography).
69
- - [ ] Every overlay (Modal, ConfirmDialog, Drawer, Sheet, Popover, Dropdown, Tooltip, CommandMenu, Select, MediaViewer) is a kit component.
70
- - [ ] Properties of one record are a `DescriptionList`, uploads go through `useUploadQueue`, a chat is
71
- `Chat` (`Chat.Messages` of `Message.Root`, `Chat.Footer` with `Composer.Root`), an album is `Gallery`,
72
- a schedule is `Gantt` — no hand-made copies of them.
51
+ - [ ] Every repeated-looking element is one component, not copies ([missing components](composition.md#14-when-the-kit-has-no-ready-component)).
52
+ - [ ] No `div` where a kit component exists ([ready components](anti-slop.md#7-div-instead-of-a-ready-component)).
53
+ - [ ] Every overlay is a kit component ([overlays](composition.md#10-overlays)).
54
+ - [ ] Record properties, uploads, a chat, an album and a schedule are the kit's components ([choosing](choosing.md#2-inside-a-category)).
73
55
 
74
56
  ## Hierarchy
75
- - [ ] One primary action per area (an empty state's action replaces the header's, not duplicates it);
76
- others `soft`/`ghost`/`outline` neutral; destructive is `tone="danger"`.
77
- - [ ] The same action has the same label everywhere on the screen.
78
- - [ ] Primary action is last in action rows (forms, modals).
57
+ - [ ] One primary action per area, last in its row; the rest `soft` / `ghost` / `outline` neutral ([actions](composition.md#6-actions)).
58
+ - [ ] The same action has the same label and variant everywhere on the screen ([secondary actions](api-contract.md#secondary-actions)).
79
59
 
80
60
  ## States
81
- - [ ] Hover / focus-visible come from the kit (nothing removed).
82
- - [ ] Disabled controls use `disabled`; async actions use `loading` (no hand-made spinners).
83
- - [ ] Fields show `hint` and `error` (a non-empty `error` is already invalid); only the minority is marked `required` or `optional`.
84
- - [ ] Data blocks have loading, empty and error states (DataTable `loading` / `empty` / `error`, EmptyPage).
85
- - [ ] Every region swaps its states through `Crossfade` (nothing flips, the page below does not jump);
86
- loading is a `Skeleton` in the data's geometry, a `Spinner` only where there is no shape to hold.
87
- - [ ] While a form saves, its submit button is `loading` and its fields are disabled by `Fieldset
88
- disabled` (the submit button outside the Fieldset).
89
- - [ ] Destructive irreversible actions confirm in a `ConfirmDialog` (async `onConfirm`), reversible ones
90
- offer «Отменить» instead; a form that stays on screen after saving says
91
- «Сохранено» on its button, a form that goes away (closes, navigates) shows a Notification; failures
92
- always show a Notification or a field `error` (instant toggles show one only on failure).
93
- - [ ] Overlays are always mounted and driven by `open` only (no `{open && …}`, no changing `key`), so they
94
- close smoothly.
95
- - [ ] No hand-written animation on kit parts; custom motion uses motion tokens, `transform`/`opacity` only.
96
- - [ ] Every glyph comes from the kit — `<Icon name>`, else `prime-ui-kit/icons`, `createIcon` only for one
97
- neither has; no raw `lucide-react` in JSX, no other icon library, no inline `<svg>`, no icon
98
- animated by hand.
99
- - [ ] Every state change moves through the kit ([motion.md](motion.md)): a changed button label is new
100
- children (it morphs), a long action is `progress`, a counter is a number (it rolls), a new password
101
- has `strength`, an accepted code is `success`; nothing moves on frequent or keyboard actions.
61
+ - [ ] Hover and focus-visible come from the kit, nothing removed ([focus](foundations.md#10-focus-and-motion)).
62
+ - [ ] Busy controls use `loading`, unavailable ones `disabled` — no hand-made spinners ([loading](api-contract.md#loading-without-datatable)).
63
+ - [ ] Fields show `hint` and `error`; only the minority is marked `required` or `optional` ([forms](api-contract.md#forms)).
64
+ - [ ] Every data block has its loading, empty and error states ([feedback](composition.md#9-feedback)).
65
+ - [ ] Every region swaps its states through `Crossfade`, loading is a `Skeleton` of the data ([continuity](foundations.md#11-state-changes-are-continuous)).
66
+ - [ ] While a form saves, its submit is `loading` and its fields sit in a `Fieldset disabled` ([forms](api-contract.md#forms)).
67
+ - [ ] A save that stays says «Сохранено» on its button, one that goes away notifies, a failure always shows ([feedback](composition.md#9-feedback)).
68
+ - [ ] Overlays stay mounted and are driven by `open` only ([motion mistakes](motion.md#6-mistakes)).
69
+ - [ ] No hand-written animation on kit parts; my own motion uses the motion tokens ([your own motion](motion.md#4-rules-for-your-own-motion)).
70
+ - [ ] Every glyph comes from the kit, none animated by hand ([icons](api-contract.md#icons)).
71
+ - [ ] Every state change moves through the kit ([what the kit animates](motion.md#1-what-the-kit-already-animates--do-not-rebuild-it)).
102
72
 
103
73
  ## Themes and widths
104
- - [ ] Screen checked with `data-theme="dark"`: no hard-coded colors, everything readable.
105
- - [ ] Screen works at 320px: no horizontal page scroll, grids collapse, toolbars rearrange (`PageToolbar`) and switchers scroll, long text truncates or wraps.
106
- - [ ] The responsive checklist in [responsive.md](responsive.md#checklist-before-handing-a-screen-over) passes: widths 320 · 390 · 768 · 1024 · 1280 · 1920, the primary action in the top row, one height per row, no hover-only functions, zoom 400%.
107
- - [ ] Below 768px `AppHeader.MenuButton` opens the Sidebar; the page title stays in the header on every width, the page's tools wrap under it.
74
+ - [ ] The screen passes the responsive checklist in both themes ([responsive](responsive.md#checklist-before-handing-a-screen-over)).
75
+ - [ ] On a phone the Sidebar opens from the menu button the header draws; the page title stays in the header ([app frame](layouts.md#app-frame-once-per-app)).
108
76
 
109
77
  ## Keyboard and a11y
110
- - [ ] Every action is reachable by Tab in a logical order and works with Enter/Space.
111
- - [ ] Every field has a label (visible, or `aria-label` for toolbar search); icons are `aria-hidden` or labelled.
112
- - [ ] Meaning is never color-only (status badges have text, errors have a message).
113
- - [ ] Custom `labels` are passed where default Russian strings do not fit the context.
78
+ - [ ] Every action is reachable by Tab in reading order and works with Enter / Space ([interaction](responsive.md#interaction-and-accessibility)).
79
+ - [ ] Every field has a label (visible, or `aria-label` for a toolbar search) ([forms](api-contract.md#forms)).
80
+ - [ ] Meaning is never colour alone ([tone and color](foundations.md#6-tone-and-color)).
81
+ - [ ] Custom `labels` replace the default Russian strings where they do not fit ([system strings](api-contract.md#shared-vocabulary-exported-types)).
@@ -55,8 +55,8 @@ contacts, specs, prices by period) → FieldList: one row per record, the headin
55
55
  | any color as a field of a form (swatch + hex, picker in a popover) | ColorField |
56
56
  | any color in a panel of its own (hex, eyedropper, channels) | ColorPicker |
57
57
 
58
- **Data.** Status, count, removable value or applied filter → Badge (`onRemove` to remove, `onPress` to
59
- toggle). Person or organization → Avatar. Object (product, vehicle, file, cover) → Thumbnail with a
58
+ **Data.** Status, count, removable value or applied filter → Badge (`tone` for a status, `color` for a
59
+ category, `onRemove` to remove, `pressed` / `onPressedChange` to toggle). Person or organization → Avatar. Object (product, vehicle, file, cover) → Thumbnail with a
60
60
  `ratio` — never a round Avatar for things. Keyboard shortcut → Kbd. One block of related
61
61
  numbers/content → Card (pick the template; a whole tile that opens its details → `Card.Root asChild`
62
62
  with a link). Read-only properties of one record («label — value») → DescriptionList, never a
@@ -80,7 +80,7 @@ the rest (comments as a chat, a read-only history) → `Chat.Root` with `Chat.Me
80
80
  message on its own → `Message.Root`. The list of conversations beside the chat (the dialogs pane of a
81
81
  messenger or an inbox) → `ChatList` (`items`, `renderItem` with `ChatList.Item`, `value`): unread
82
82
  counts, «печатает…», drafts, ticks, a row menu and search come with it — never `List` with a hand-made
83
- count and preview; `List` stays for records that are not conversations (tickets, letters, invoices). A group chat → `Chat.Messages type="group"`: `Message.Author`
83
+ count and preview; `List` stays for records that are not conversations (tickets, letters, invoices). A group chat → `Chat.Messages group`: `Message.Author`
84
84
  (`tag`, `Message.AuthorIcon`) and `Message.Avatar` on every message, the list shows them on the
85
85
  first and the last of a run. A voice message → `VoicePlayer` inside `Message.Root`; a call recording
86
86
  outside a chat → `VoicePlayer` alone. A round video message → `VideoNote` inside `Message.Root`
@@ -91,7 +91,7 @@ the transcript and the `transfer` set); only VoicePlayer has `waveform` and a ra
91
91
  comment, a report) → `Gallery`; one picture of an object → `Thumbnail`. A video with controls →
92
92
  `Message.Media` or `Thumbnail.Video`, not VideoNote. «Печатает…» → `Chat.Root typing` (or
93
93
  `Message.Typing`), never a text row; a jump to a message → `Message.Reply target`, `Chat.Pinned` or
94
- `Chat.Root current`, never `scrollIntoView`; search inside a chat → `Chat.Search`. Files, photos,
94
+ `Chat.Root jumpTo`, never `scrollIntoView`; search inside a chat → `Chat.Search`. Files, photos,
95
95
  places and contacts sent in a chat → the `Message` parts, not FileUpload rows or Cards.
96
96
 
97
97
  **Status and loading.** See the pair below. Progress of a single task → ProgressBar `value`; parts of a whole →
@@ -108,11 +108,10 @@ show → EmptyPage; a region that failed to load → EmptyPage `tone="danger"` w
108
108
  loading, data, empty and error, or showing one record at a time → its content in
109
109
  `Crossfade state={status}`, with a Skeleton as the loading state (DataTable's body does both by itself).
110
110
 
111
- **Overlays.** See the pairs below. Global search over commands and pages (⌘K) → CommandMenu. A short
112
- task that ends by itself (a date, an action on a record, a short note) raised from the bottom edge →
113
- Sheet. Menus, selects, pickers and Modal turn into bottom sheets below 640px by themselves — never
114
- build your own. A photo, a scan or a video opened full screen from its thumbnail (a Gallery tile, a
115
- Thumbnail button) → MediaViewer, never a Modal with an `<img>`.
111
+ **Overlays.** See the pairs below. Global search over commands and pages (⌘K) → CommandMenu. Menus,
112
+ selects, pickers and Modal turn into bottom sheets below 640px by themselves — never build your own.
113
+ A photo, a scan or a video opened full screen from its thumbnail (a Gallery tile, a Thumbnail button)
114
+ → MediaViewer, never a Modal with an `<img>`.
116
115
 
117
116
  **Phone navigation.** App navigation is Sidebar on a wide screen and `BottomNav` in `AppShell.Footer`
118
117
  on a phone for 2–6 main sections (the shell hides it by itself while the Sidebar rail is on screen;
@@ -122,31 +121,30 @@ Drawer menu.
122
121
  **App frame.** Sidebar collapse control: `Sidebar.Toggle variant="header"` next to `Sidebar.Brand` in
123
122
  `Sidebar.Header` — at the header's end while expanded, a small round button on the rail's edge while
124
123
  compact (the default for a branded rail); `Sidebar.Toggle` (`variant="item"`) in `Sidebar.Footer` when
125
- the rail has no brand header. On phones neither replaces `AppHeader.MenuButton` that
126
- opens the off-canvas Sidebar (`open` / `onOpenChange`). The bar at the top of the panel is the page's
127
- `AppHeader`: the page title (`AppHeader.Title` + a line of data), the page's own buttons and its
128
- tools — a `PageToolbar` in `AppHeader.Tools` when the page has several tools above its data (sections,
129
- search and filters, a view switch, the primary action) that must rearrange on a phone; one search or one
130
- filter above a single table goes into the DataTable `toolbar` instead. Only a document page (settings,
131
- a long form, help) has its title in main, `PageContent.Header`, and no title in the header. A record
132
- opened from a table: its own page → DataTable `getRowHref`; in place → `onRowClick` + Drawer; a list
133
- worked through record by record (mail, chat, tickets) → `PageContent.Split` with a `List` of the records
134
- (`current` on the open one). Sections of a long rail → `Sidebar.Group
135
- collapsible`; a section with sub-pages → `Sidebar.Sub`; the signed-in user → `Sidebar.Account` in a
136
- `Dropdown.Trigger` at the bottom of `Sidebar.Footer`.
124
+ the rail has no brand header. On phones the off-canvas Sidebar opens from the menu button the
125
+ `AppHeader` draws by itself; a trigger of your own reads `useAppShellNav()`. The bar at the top of the
126
+ panel is the page's `AppHeader`: the page title (`AppHeader.Title` + a line of data), the page's own
127
+ buttons and its tools — [where the tools and filters go](composition.md#where-the-filters-go). Only a
128
+ document page (settings, a long form, help) has its title in main, `PageContent.Header`, and no title
129
+ in the header. A record opened from a table: its own page → DataTable `getRowHref`; in place →
130
+ `onRowClick` + Drawer; a list worked through record by record → `PageContent.Split` with a `List` of
131
+ the records (tickets, letters, invoices; `current` on the open one) or a `ChatList` of the
132
+ conversations. Sections of a long rail → `Sidebar.Group collapsible`; a section with sub-pages →
133
+ `Sidebar.Sub`; the signed-in user → `Sidebar.Account` in a `Dropdown.Trigger` at the bottom of
134
+ `Sidebar.Footer`.
137
135
 
138
136
  ## 3. Pairs that are easy to confuse
139
137
 
140
138
  | Pair | Rule |
141
139
  |---|---|
142
- | List / Sidebar / Tabs / Card list / DataTable | List: the records of a list + detail screen (dialogs, tickets, mail), one open at a time (`current`), each row a button or a link with a text line, a preview, meta and a count. Sidebar: the sections of the **app**. Tabs: panels of **one screen**. `Card.List` (`variant="list"`): static facts in a card, nothing opens. DataTable: many records compared by columns, sorted, filtered, selected in bulk. |
140
+ | List / ChatList / Sidebar / Tabs / Card list / DataTable | List: the records of a list + detail screen that are not conversations (tickets, letters, invoices), one open at a time (`current`), each row a button or a link with a text line, a preview, meta and a count. ChatList: the conversations of a messenger or an inbox. Sidebar: the sections of the **app**. Tabs: panels of **one screen**. `Card.List` (`variant="list"`): static facts in a card, nothing opens. DataTable: many records compared by columns, sorted, filtered, selected in bulk. |
143
141
  | FieldList / DataTable / Fieldset / TagSelect | FieldList: records of one shape a person **edits** in a form, a row of fields each, added and removed by hand, up to four short fields per row. DataTable: records a person **reads**, sorts, filters and selects; edits open a Drawer. Fieldset: **one** record's fields under a heading. TagSelect: values **picked** from options, shown as tags. One value in several units is none of them — fields in one row under one heading. |
144
142
  | Tabs / SegmentedControl | Tabs switch **panels of content** (navigation inside a screen). SegmentedControl switches a **value or mode** of the same content (period, view mode, filter). |
145
143
  | Modal / Drawer / Sheet / Popover / Tooltip | Modal: blocking decision or a short form (≤ 4 fields) that needs full attention. Drawer: long form, filters, record details beside the page, while keeping page context. Sheet: a short task that ends by itself — a pick, an action, a short note — raised from the bottom edge. Popover: small non-modal panel anchored to a control (quick edit, explanation with a link). Tooltip: a few words naming or explaining a control, no interactive content. |
146
144
  | Select / NativeSelect | Select: the kit's floating list — icons, descriptions, groups, search, `multiple`, `clearable`. NativeSelect: a plain text list where the OS picker is better (phones) or the value must post with a form by `name`. |
147
145
  | Select / Dropdown / CommandMenu / TagSelect | Select picks a **value** for a field (form data). Dropdown runs **actions** (Edit, Duplicate, Delete). CommandMenu searches commands and pages across the app (locally or on the server) — it is not a field. TagSelect picks **several values** as tags. |
148
- | SmartFilter / Select in a toolbar | One field with a few options → SegmentedControl or Select in the table toolbar. Several fields, search, include / exclude → SmartFilter. |
149
- | Badge / Button | A badge labels or holds a value (status, filter, keyword): `onRemove` drops it, `onPress` toggles it. A command (save, open, go) is always a Button. |
146
+ | SmartFilter / SegmentedControl / Select | Search and filters over a list → SmartFilter (`fields={[]}` for a search alone), even with one field. A switch of what the same data shows (sections with counts, a period, a view) → SegmentedControl, or a Select when the options are many. |
147
+ | Badge / Button | A badge labels or holds a value (status, filter, keyword): `onRemove` drops it, `pressed` toggles it. A command (save, open, go) is always a Button. |
150
148
  | Banner / Notification / Hint | Banner: persistent message in the page flow about a page/section state (sync failed, trial ends). Notification: transient toast about the result of an action (saved, failed). Hint / `error`: help or validation text under one field. |
151
149
  | ProgressBar / ProgressCircle / Spinner | ProgressBar: a share with width to spare and words beside it (an upload row, an import, a quota line). ProgressCircle: a share on the data scale (24–80) where width is short or a ring reads better (a KPI goal, a ring breakdown, a named import card); `value={null}` while the share is unknown, `spin` while a share grows, an icon in the centre. Spinner: an anonymous «busy» on the icon scale inside a control or a status line, no share, no name of its own. A ring you can press (cancel, retry, download a transfer) → Button `shape="circle"` with `progress`, not any of the three. |
152
150
  | Button / LinkButton | Button does something (submit, open, delete). LinkButton goes somewhere (a URL, «Подробнее», «Все заказы»). |
@@ -163,7 +161,7 @@ collapsible`; a section with sub-pages → `Sidebar.Sub`; the signed-in user →
163
161
  | Stepper / Tabs | Stepper for a sequential process with completion status; Tabs for non-sequential views. |
164
162
  | Gantt / Timeline / Kanban / DataTable | Gantt: records with a start and an end compared across time (who is busy when, a plan with phases and milestones), moved, stretched and drawn by hand (`onBarChange`, `onBarCreate`). Timeline: a history of events at points in time, read top to bottom. Kanban: work items moved between statuses, time does not matter. DataTable: many records compared by many attributes, sorted, filtered and selected — dates are only columns. |
165
163
  | DescriptionList / DataTable / Card | DescriptionList: the properties of **one** record as «label — value» pairs (requisites, deal terms, a summary before a confirm). DataTable: **many** records with the same properties. Card: the bounded block they sit in, or one headline number (`mini`, `stat-trend`) — a DescriptionList inside a `Card.Body`, never a Card per property. |
166
- | ConfirmDialog / Modal / `holdToConfirm` / undo | A row or item in a list that can be restored → delete at once and offer «Отменить» in the Notification. One standalone destructive action that is easy to redo by hand, no list (clear a draft, revoke a token) → `Button.Root holdToConfirm` with the action in `onConfirm`. Irreversible loss of work or a weighty action (delete a project, send an invoice) → ConfirmDialog (`onConfirm` returns the request; pending, failure and dismiss rules are built in). Unsaved changes in a Modal or Drawer form → `Modal.Guard` / `Drawer.Guard dirty`. A form, a choice or more than a sentence of content → Modal; never a Modal hand-built as a confirm. |
164
+ | ConfirmDialog / Modal / `holdToConfirm` / undo | Which of them an action deserves is its cost: [ux.md → friction](ux.md#5-friction-matches-the-cost-of-a-mistake). ConfirmDialog only asks a question (`onConfirm` returns the request; pending, failure and dismiss rules are built in); a form, a choice or more than a sentence of content → Modal; never a Modal hand-built as a confirm. |
167
165
  | Composer / Textarea | Composer: the message input of a conversation — Enter sends, attachments, a reply or edit bar, voice and round video. Textarea: long text saved with a form (a description, a comment field) by its submit button. |
168
166
  | Chat / Message / Gallery | Chat: a conversation — the header, search, pinned, the one message list (dates, runs, selection, jumps, read receipts, typing) and the Composer in its footer; a list without the rest is `Chat.Root` with `Chat.Messages`. Message: one message and its content parts — a row of that list, or a bubble on its own (a quoted reply in a ticket). Gallery: an album of photos and videos laid out by their ratios — `Message.Media` in a message, `Gallery` anywhere else (a post, a comment, a report). |
169
167
  | Message / Timeline / Notification | Message: what people say to each other in a conversation, in bubbles. Timeline: what happened to a record (status changes, an audit log). Notification: the result of the user's own action, for a few seconds. A chat event («Анна добавила Олега») is `Chat.Service`, not a Notification. |