prime-ui-kit 0.16.0 → 0.18.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 (477) hide show
  1. package/README.md +15 -18
  2. package/dist/chunks/{chunk-A7OQWH6R.js → chunk-IVS3J7AS.js} +1 -1
  3. package/dist/chunks/{chunk-6TPHKCUJ.js → chunk-MB4CXSLL.js} +27732 -26723
  4. package/dist/chunks/{chunk-4PSQ64S4.js → chunk-OAXJWF3L.js} +6818 -6264
  5. package/dist/chunks/{chunk-U3Q2I3MY.js → chunk-QFHE5GKW.js} +3 -2
  6. package/dist/chunks/{chunk-HDBQICPW.js → chunk-X3JT5CLR.js} +60 -20
  7. package/dist/color-picker.d.ts +1 -1
  8. package/dist/color-picker.js +3 -3
  9. package/dist/components/badge/Badge.d.ts +17 -0
  10. package/dist/components/breadcrumb/Breadcrumb.d.ts +12 -3
  11. package/dist/components/button/Button.d.ts +1 -1
  12. package/dist/components/button-group/ButtonGroup.d.ts +1 -1
  13. package/dist/components/card/Card.d.ts +8 -4
  14. package/dist/components/chart-frame/ChartFrame.d.ts +1 -1
  15. package/dist/components/chat/Chat.d.ts +3 -3
  16. package/dist/components/chat/ChatRows.d.ts +5 -1
  17. package/dist/components/chat/MessageList.d.ts +5 -1
  18. package/dist/components/chat/groupMessages.d.ts +12 -4
  19. package/dist/components/chat-list/ChatList.d.ts +18 -9
  20. package/dist/components/chat-list/formatChatTime.d.ts +3 -3
  21. package/dist/components/checkbox/Checkbox.d.ts +6 -1
  22. package/dist/components/color-field/ColorField.d.ts +1 -1
  23. package/dist/components/color-picker/ColorPicker.d.ts +23 -1
  24. package/dist/components/color-picker/ColorPresets.d.ts +9 -1
  25. package/dist/components/crossfade/Crossfade.d.ts +1 -1
  26. package/dist/components/data-table/DataTable.d.ts +3 -1
  27. package/dist/components/data-table/Head.d.ts +3 -1
  28. package/dist/components/data-table/types.d.ts +5 -0
  29. package/dist/components/digit-input/DigitInput.d.ts +1 -1
  30. package/dist/components/drawer/Drawer.d.ts +3 -2
  31. package/dist/components/field-list/FieldList.d.ts +18 -6
  32. package/dist/components/hint/Hint.d.ts +8 -2
  33. package/dist/components/index.d.ts +6 -7
  34. package/dist/components/input/Input.d.ts +27 -5
  35. package/dist/components/input/inputSuggestions.d.ts +39 -0
  36. package/dist/components/kanban/Kanban.d.ts +4 -9
  37. package/dist/components/list/List.d.ts +19 -5
  38. package/dist/components/message/Message.d.ts +15 -3
  39. package/dist/components/message/MessageSticker.d.ts +27 -0
  40. package/dist/components/message/formatMessageTime.d.ts +5 -2
  41. package/dist/components/modal/Modal.d.ts +3 -2
  42. package/dist/components/native-select/NativeSelect.d.ts +1 -1
  43. package/dist/components/pagination/Pagination.d.ts +5 -1
  44. package/dist/components/popover/Popover.d.ts +1 -1
  45. package/dist/components/radio/Radio.d.ts +11 -2
  46. package/dist/components/rich-text/RichText.d.ts +23 -0
  47. package/dist/components/scroll-container/ScrollContainer.d.ts +1 -1
  48. package/dist/components/scroll-container/scrollGlide.d.ts +26 -0
  49. package/dist/components/scroll-container/useScrollMotion.d.ts +25 -0
  50. package/dist/components/segmented-control/SegmentedControl.d.ts +1 -1
  51. package/dist/components/select/selectContext.d.ts +7 -0
  52. package/dist/components/slider/Slider.d.ts +2 -2
  53. package/dist/components/smart-filter/SmartFilter.d.ts +4 -5
  54. package/dist/components/switch/Switch.d.ts +6 -1
  55. package/dist/components/tag-select/TagSelect.d.ts +1 -1
  56. package/dist/components/textarea/Textarea.d.ts +6 -1
  57. package/dist/components/timeline/Timeline.d.ts +1 -1
  58. package/dist/icon-set.js +2 -2
  59. package/dist/index.css +1 -1
  60. package/dist/index.js +7 -9
  61. package/dist/internal/ChoiceField.d.ts +3 -1
  62. package/dist/internal/FieldFrame.d.ts +8 -2
  63. package/dist/internal/barPlan.d.ts +44 -0
  64. package/dist/internal/fieldCell.d.ts +1 -1
  65. package/dist/internal/formatClock.d.ts +23 -2
  66. package/dist/internal/leaveGuard.d.ts +21 -0
  67. package/dist/internal/messageList.d.ts +2 -0
  68. package/dist/internal/overlay/DialogParts.d.ts +27 -2
  69. package/dist/internal/overlay/FloatingPanel.d.ts +1 -1
  70. package/dist/internal/overlay/focus.d.ts +3 -2
  71. package/dist/internal/parts.d.ts +1 -1
  72. package/dist/internal/slot.d.ts +0 -30
  73. package/dist/internal/swatch.d.ts +5 -0
  74. package/dist/internal/tokenDefaults.d.ts +1 -0
  75. package/dist/layout/app-shell/AppShell.d.ts +19 -38
  76. package/dist/layout/index.d.ts +3 -3
  77. package/dist/layout/page/Page.d.ts +302 -0
  78. package/dist/layout/sidebar/Sidebar.d.ts +1 -1
  79. package/dist/skill/SKILL.md +10 -10
  80. package/dist/skill/anti-slop.md +106 -5
  81. package/dist/skill/api-contract.md +15 -8
  82. package/dist/skill/cheatsheet.md +46 -26
  83. package/dist/skill/checklist.md +12 -3
  84. package/dist/skill/choosing.md +34 -20
  85. package/dist/skill/components.md +4 -5
  86. package/dist/skill/composition.md +193 -154
  87. package/dist/skill/foundations.md +9 -9
  88. package/dist/skill/layouts.md +42 -99
  89. package/dist/skill/reference/components/avatar/COMPONENT.md +2 -2
  90. package/dist/skill/reference/components/avatar/examples/team-group.tsx +1 -1
  91. package/dist/skill/reference/components/badge/COMPONENT.md +14 -1
  92. package/dist/skill/reference/components/badge/examples/examples.module.css +7 -0
  93. package/dist/skill/reference/components/badge/examples/tag-row.tsx +34 -0
  94. package/dist/skill/reference/components/banner/COMPONENT.md +4 -4
  95. package/dist/skill/reference/components/banner/examples/examples.module.css +6 -1
  96. package/dist/skill/reference/components/banner/examples/page-strip.tsx +24 -22
  97. package/dist/skill/reference/components/breadcrumb/COMPONENT.md +18 -12
  98. package/dist/skill/reference/components/breadcrumb/examples/router.tsx +17 -0
  99. package/dist/skill/reference/components/button/COMPONENT.md +2 -1
  100. package/dist/skill/reference/components/button/examples/hold-to-confirm.tsx +1 -1
  101. package/dist/skill/reference/components/button/examples/on-colored-host.tsx +8 -8
  102. package/dist/skill/reference/components/button-group/COMPONENT.md +1 -0
  103. package/dist/skill/reference/components/card/COMPONENT.md +14 -8
  104. package/dist/skill/reference/components/card/examples/screen.module.css +1 -1
  105. package/dist/skill/reference/components/card/examples/screen.tsx +184 -198
  106. package/dist/skill/reference/components/card/examples/states.tsx +59 -0
  107. package/dist/skill/reference/components/chart-frame/COMPONENT.md +1 -1
  108. package/dist/skill/reference/components/chart-frame/examples/fill-height.tsx +9 -9
  109. package/dist/skill/reference/components/chat/COMPONENT.md +8 -5
  110. package/dist/skill/reference/components/chat/examples/screen.module.css +1 -1
  111. package/dist/skill/reference/components/chat/examples/screen.tsx +110 -117
  112. package/dist/skill/reference/components/chat/examples/time-zone.tsx +83 -0
  113. package/dist/skill/reference/components/chat-list/COMPONENT.md +14 -8
  114. package/dist/skill/reference/components/chat-list/examples/controlled.tsx +2 -2
  115. package/dist/skill/reference/components/chat-list/examples/examples.module.css +8 -0
  116. package/dist/skill/reference/components/chat-list/examples/links.tsx +1 -1
  117. package/dist/skill/reference/components/chat-list/examples/router.tsx +63 -0
  118. package/dist/skill/reference/components/checkbox/COMPONENT.md +1 -0
  119. package/dist/skill/reference/components/checkbox/examples/examples.module.css +3 -2
  120. package/dist/skill/reference/components/code-block/COMPONENT.md +1 -1
  121. package/dist/skill/reference/components/code-block/examples/color-scheme.tsx +2 -4
  122. package/dist/skill/reference/components/code-block/examples/examples.module.css +0 -11
  123. package/dist/skill/reference/components/color-field/COMPONENT.md +2 -1
  124. package/dist/skill/reference/components/color-picker/COMPONENT.md +31 -11
  125. package/dist/skill/reference/components/color-picker/examples/examples.module.css +2 -5
  126. package/dist/skill/reference/components/color-picker/examples/overview.tsx +5 -10
  127. package/dist/skill/reference/components/color-picker/examples/presets-custom.tsx +31 -0
  128. package/dist/skill/reference/components/color-picker/examples/sizes.tsx +4 -8
  129. package/dist/skill/reference/components/color-swatches/COMPONENT.md +1 -0
  130. package/dist/skill/reference/components/crossfade/COMPONENT.md +3 -3
  131. package/dist/skill/reference/components/crossfade/examples/screen.tsx +107 -112
  132. package/dist/skill/reference/components/data-table/COMPONENT.md +12 -7
  133. package/dist/skill/reference/components/data-table/examples/examples.module.css +9 -0
  134. package/dist/skill/reference/components/data-table/examples/numeric.tsx +9 -2
  135. package/dist/skill/reference/components/data-table/examples/screen.tsx +42 -52
  136. package/dist/skill/reference/components/data-table/examples/server.tsx +6 -2
  137. package/dist/skill/reference/components/datepicker/COMPONENT.md +3 -1
  138. package/dist/skill/reference/components/datepicker/examples/deadline.tsx +33 -0
  139. package/dist/skill/reference/components/datepicker/examples/examples.module.css +6 -0
  140. package/dist/skill/reference/components/datepicker/examples/inline-panel.tsx +3 -1
  141. package/dist/skill/reference/components/description-list/COMPONENT.md +1 -1
  142. package/dist/skill/reference/components/description-list/examples/screen.tsx +120 -127
  143. package/dist/skill/reference/components/digit-input/COMPONENT.md +1 -0
  144. package/dist/skill/reference/components/digit-input/examples/grouped.tsx +4 -4
  145. package/dist/skill/reference/components/digit-input/examples/validation.tsx +1 -1
  146. package/dist/skill/reference/components/divider/COMPONENT.md +2 -2
  147. package/dist/skill/reference/components/divider/examples/examples.module.css +4 -1
  148. package/dist/skill/reference/components/divider/examples/vertical.tsx +22 -9
  149. package/dist/skill/reference/components/dnd/examples/examples.module.css +3 -1
  150. package/dist/skill/reference/components/drawer/COMPONENT.md +16 -3
  151. package/dist/skill/reference/components/drawer/examples/client-card.tsx +32 -8
  152. package/dist/skill/reference/components/drawer/examples/placement.tsx +26 -31
  153. package/dist/skill/reference/components/drawer/examples/screen.tsx +137 -160
  154. package/dist/skill/reference/components/dropdown/COMPONENT.md +1 -1
  155. package/dist/skill/reference/components/example-frame/COMPONENT.md +3 -3
  156. package/dist/skill/reference/components/field-list/COMPONENT.md +15 -3
  157. package/dist/skill/reference/components/field-list/examples/saving.tsx +83 -0
  158. package/dist/skill/reference/components/field-list/examples/screen.module.css +1 -1
  159. package/dist/skill/reference/components/field-list/examples/screen.tsx +19 -19
  160. package/dist/skill/reference/components/field-list/examples/totals.tsx +82 -0
  161. package/dist/skill/reference/components/fieldset/COMPONENT.md +1 -1
  162. package/dist/skill/reference/components/fieldset/examples/states.tsx +1 -1
  163. package/dist/skill/reference/components/file-upload/COMPONENT.md +2 -1
  164. package/dist/skill/reference/components/file-upload/examples/screen.module.css +2 -2
  165. package/dist/skill/reference/components/file-upload/examples/screen.tsx +65 -81
  166. package/dist/skill/reference/components/gallery/COMPONENT.md +1 -0
  167. package/dist/skill/reference/components/gantt/COMPONENT.md +1 -1
  168. package/dist/skill/reference/components/gantt/examples/screen.module.css +1 -1
  169. package/dist/skill/reference/components/gantt/examples/screen.tsx +55 -73
  170. package/dist/skill/reference/components/hint/COMPONENT.md +16 -2
  171. package/dist/skill/reference/components/hint/examples/examples.module.css +10 -1
  172. package/dist/skill/reference/components/hint/examples/overview.tsx +1 -1
  173. package/dist/skill/reference/components/hint/examples/variants.tsx +48 -0
  174. package/dist/skill/reference/components/input/COMPONENT.md +39 -9
  175. package/dist/skill/reference/components/input/examples/affixes.tsx +4 -2
  176. package/dist/skill/reference/components/input/examples/dismiss.tsx +29 -0
  177. package/dist/skill/reference/components/input/examples/suggestions.tsx +26 -0
  178. package/dist/skill/reference/components/input/examples/time.tsx +24 -0
  179. package/dist/skill/reference/components/input/examples/with-select.tsx +44 -0
  180. package/dist/skill/reference/components/kanban/COMPONENT.md +7 -7
  181. package/dist/skill/reference/components/kanban/examples/columns.tsx +4 -2
  182. package/dist/skill/reference/components/kanban/examples/screen.module.css +1 -1
  183. package/dist/skill/reference/components/kanban/examples/screen.tsx +50 -65
  184. package/dist/skill/reference/components/kbd/COMPONENT.md +1 -1
  185. package/dist/skill/reference/components/label/examples/examples.module.css +12 -1
  186. package/dist/skill/reference/components/label/examples/overview.tsx +1 -1
  187. package/dist/skill/reference/components/list/COMPONENT.md +26 -10
  188. package/dist/skill/reference/components/list/examples/row-controls.tsx +80 -0
  189. package/dist/skill/reference/components/list/examples/with-icon.tsx +23 -2
  190. package/dist/skill/reference/components/login-form/COMPONENT.md +8 -7
  191. package/dist/skill/reference/components/login-form/examples/states.tsx +12 -14
  192. package/dist/skill/reference/components/media-viewer/examples/controlled.tsx +16 -16
  193. package/dist/skill/reference/components/media-viewer/examples/examples.module.css +1 -3
  194. package/dist/skill/reference/components/message/COMPONENT.md +30 -9
  195. package/dist/skill/reference/components/message/examples/preview.tsx +28 -0
  196. package/dist/skill/reference/components/message/examples/sticker.tsx +35 -0
  197. package/dist/skill/reference/components/modal/COMPONENT.md +15 -3
  198. package/dist/skill/reference/components/modal/examples/long-content.tsx +37 -18
  199. package/dist/skill/reference/components/native-select/COMPONENT.md +1 -0
  200. package/dist/skill/reference/components/notification/COMPONENT.md +1 -1
  201. package/dist/skill/reference/components/pagination/COMPONENT.md +11 -3
  202. package/dist/skill/reference/components/pagination/examples/controlled.tsx +2 -1
  203. package/dist/skill/reference/components/popover/COMPONENT.md +3 -2
  204. package/dist/skill/reference/components/popover/examples/width.tsx +13 -1
  205. package/dist/skill/reference/components/radio/COMPONENT.md +2 -0
  206. package/dist/skill/reference/components/rich-text/COMPONENT.md +93 -0
  207. package/dist/skill/reference/components/rich-text/examples/overview.tsx +19 -0
  208. package/dist/skill/reference/components/scroll-container/COMPONENT.md +8 -5
  209. package/dist/skill/reference/components/segmented-control/COMPONENT.md +1 -0
  210. package/dist/skill/reference/components/segmented-control/examples/in-form.tsx +1 -1
  211. package/dist/skill/reference/components/select/COMPONENT.md +7 -3
  212. package/dist/skill/reference/components/slider/COMPONENT.md +4 -3
  213. package/dist/skill/reference/components/slider/examples/controlled.tsx +1 -1
  214. package/dist/skill/reference/components/slider/examples/states.tsx +14 -10
  215. package/dist/skill/reference/components/smart-filter/COMPONENT.md +13 -13
  216. package/dist/skill/reference/components/smart-filter/examples/examples.module.css +3 -0
  217. package/dist/skill/reference/components/smart-filter/examples/many-values.tsx +12 -8
  218. package/dist/skill/reference/components/smart-filter/examples/sizes.tsx +7 -3
  219. package/dist/skill/reference/components/sparkline/COMPONENT.md +1 -0
  220. package/dist/skill/reference/components/sparkline/examples/curve.tsx +16 -11
  221. package/dist/skill/reference/components/sparkline/examples/states.tsx +14 -10
  222. package/dist/skill/reference/components/switch/COMPONENT.md +2 -1
  223. package/dist/skill/reference/components/tabs/COMPONENT.md +1 -1
  224. package/dist/skill/reference/components/tag-select/COMPONENT.md +1 -0
  225. package/dist/skill/reference/components/textarea/COMPONENT.md +1 -0
  226. package/dist/skill/reference/components/timeline/COMPONENT.md +3 -3
  227. package/dist/skill/reference/components/timeline/examples/structure.tsx +2 -1
  228. package/dist/skill/reference/components/typography/COMPONENT.md +2 -2
  229. package/dist/skill/reference/foundation.md +15 -11
  230. package/dist/skill/reference/layout/app-shell/COMPONENT.md +25 -38
  231. package/dist/skill/reference/layout/app-shell/examples/footer.tsx +10 -10
  232. package/dist/skill/reference/layout/app-shell/examples/overview.tsx +20 -22
  233. package/dist/skill/reference/layout/app-shell/examples/screen.module.css +2 -2
  234. package/dist/skill/reference/layout/app-shell/examples/screen.tsx +25 -30
  235. package/dist/skill/reference/layout/app-shell/examples/template.tsx +13 -17
  236. package/dist/skill/reference/layout/bottom-nav/COMPONENT.md +4 -3
  237. package/dist/skill/reference/layout/bottom-nav/examples/floating-action.tsx +10 -19
  238. package/dist/skill/reference/layout/bottom-nav/examples/floating.tsx +10 -19
  239. package/dist/skill/reference/layout/bottom-nav/examples/in-app-shell.tsx +11 -19
  240. package/dist/skill/reference/layout/page/COMPONENT.md +382 -0
  241. package/dist/skill/reference/layout/page/examples/actions-collapse.tsx +45 -0
  242. package/dist/skill/reference/layout/page/examples/collapse.tsx +68 -0
  243. package/dist/skill/reference/layout/page/examples/examples.module.css +92 -0
  244. package/{src/components/page-content → dist/skill/reference/layout/page}/examples/grid.tsx +15 -15
  245. package/dist/skill/reference/layout/page/examples/guard.tsx +87 -0
  246. package/dist/skill/reference/{components/page-content → layout/page}/examples/list-detail.tsx +14 -14
  247. package/dist/skill/reference/layout/page/examples/loading.tsx +57 -0
  248. package/dist/skill/reference/layout/page/examples/narrow.tsx +75 -0
  249. package/dist/skill/reference/layout/page/examples/overview.tsx +57 -0
  250. package/dist/skill/reference/{components/page-content → layout/page}/examples/screen.module.css +1 -1
  251. package/{src/components/page-content → dist/skill/reference/layout/page}/examples/screen.tsx +29 -19
  252. package/dist/skill/reference/{components/page-content → layout/page}/examples/sections.tsx +17 -24
  253. package/dist/skill/reference/layout/page/examples/structure.tsx +41 -0
  254. package/dist/skill/reference/{components/page-toolbar/examples/narrow.tsx → layout/page/examples/tools.tsx} +38 -35
  255. package/dist/skill/reference/layout/page/examples/top-bar.tsx +85 -0
  256. package/dist/skill/reference/{components/page-content → layout/page}/examples/variants.tsx +7 -7
  257. package/dist/skill/reference/layout/sidebar/COMPONENT.md +6 -4
  258. package/dist/skill/reference/layout/sidebar/examples/dismiss.tsx +10 -7
  259. package/dist/skill/reference/layout/sidebar/examples/narrow.tsx +11 -8
  260. package/dist/skill/responsive.md +94 -75
  261. package/dist/skill/ux.md +5 -3
  262. package/dist/tokens/layers.d.ts +2 -0
  263. package/dist/tokens/primitives.d.ts +12 -2
  264. package/dist/tokens/semantic.d.ts +9 -0
  265. package/dist/tokens/themes/dark.d.ts +7 -2
  266. package/package.json +2 -2
  267. package/src/components/avatar/COMPONENT.md +2 -2
  268. package/src/components/avatar/examples/team-group.tsx +1 -1
  269. package/src/components/badge/COMPONENT.md +14 -1
  270. package/src/components/badge/examples/examples.module.css +7 -0
  271. package/src/components/badge/examples/tag-row.tsx +34 -0
  272. package/src/components/banner/COMPONENT.md +4 -4
  273. package/src/components/banner/examples/examples.module.css +6 -1
  274. package/src/components/banner/examples/page-strip.tsx +24 -22
  275. package/src/components/breadcrumb/COMPONENT.md +18 -12
  276. package/src/components/breadcrumb/examples/router.tsx +17 -0
  277. package/src/components/button/COMPONENT.md +2 -1
  278. package/src/components/button/examples/hold-to-confirm.tsx +1 -1
  279. package/src/components/button/examples/on-colored-host.tsx +8 -8
  280. package/src/components/button-group/COMPONENT.md +1 -0
  281. package/src/components/card/COMPONENT.md +14 -8
  282. package/src/components/card/examples/screen.module.css +1 -1
  283. package/src/components/card/examples/screen.tsx +184 -198
  284. package/src/components/card/examples/states.tsx +59 -0
  285. package/src/components/chart-frame/COMPONENT.md +1 -1
  286. package/src/components/chart-frame/examples/fill-height.tsx +9 -9
  287. package/src/components/chat/COMPONENT.md +8 -5
  288. package/src/components/chat/examples/screen.module.css +1 -1
  289. package/src/components/chat/examples/screen.tsx +110 -117
  290. package/src/components/chat/examples/time-zone.tsx +83 -0
  291. package/src/components/chat-list/COMPONENT.md +14 -8
  292. package/src/components/chat-list/examples/controlled.tsx +2 -2
  293. package/src/components/chat-list/examples/examples.module.css +8 -0
  294. package/src/components/chat-list/examples/links.tsx +1 -1
  295. package/src/components/chat-list/examples/router.tsx +63 -0
  296. package/src/components/checkbox/COMPONENT.md +1 -0
  297. package/src/components/checkbox/examples/examples.module.css +3 -2
  298. package/src/components/code-block/COMPONENT.md +1 -1
  299. package/src/components/code-block/examples/color-scheme.tsx +2 -4
  300. package/src/components/code-block/examples/examples.module.css +0 -11
  301. package/src/components/color-field/COMPONENT.md +2 -1
  302. package/src/components/color-picker/COMPONENT.md +31 -11
  303. package/src/components/color-picker/examples/examples.module.css +2 -5
  304. package/src/components/color-picker/examples/overview.tsx +5 -10
  305. package/src/components/color-picker/examples/presets-custom.tsx +31 -0
  306. package/src/components/color-picker/examples/sizes.tsx +4 -8
  307. package/src/components/color-swatches/COMPONENT.md +1 -0
  308. package/src/components/crossfade/COMPONENT.md +3 -3
  309. package/src/components/crossfade/examples/screen.tsx +107 -112
  310. package/src/components/data-table/COMPONENT.md +12 -7
  311. package/src/components/data-table/examples/examples.module.css +9 -0
  312. package/src/components/data-table/examples/numeric.tsx +9 -2
  313. package/src/components/data-table/examples/screen.tsx +42 -52
  314. package/src/components/data-table/examples/server.tsx +6 -2
  315. package/src/components/datepicker/COMPONENT.md +3 -1
  316. package/src/components/datepicker/examples/deadline.tsx +33 -0
  317. package/src/components/datepicker/examples/examples.module.css +6 -0
  318. package/src/components/datepicker/examples/inline-panel.tsx +3 -1
  319. package/src/components/description-list/COMPONENT.md +1 -1
  320. package/src/components/description-list/examples/screen.tsx +120 -127
  321. package/src/components/digit-input/COMPONENT.md +1 -0
  322. package/src/components/digit-input/examples/grouped.tsx +4 -4
  323. package/src/components/digit-input/examples/validation.tsx +1 -1
  324. package/src/components/divider/COMPONENT.md +2 -2
  325. package/src/components/divider/examples/examples.module.css +4 -1
  326. package/src/components/divider/examples/vertical.tsx +22 -9
  327. package/src/components/dnd/examples/examples.module.css +3 -1
  328. package/src/components/drawer/COMPONENT.md +16 -3
  329. package/src/components/drawer/examples/client-card.tsx +32 -8
  330. package/src/components/drawer/examples/placement.tsx +26 -31
  331. package/src/components/drawer/examples/screen.tsx +137 -160
  332. package/src/components/dropdown/COMPONENT.md +1 -1
  333. package/src/components/example-frame/COMPONENT.md +3 -3
  334. package/src/components/field-list/COMPONENT.md +15 -3
  335. package/src/components/field-list/examples/saving.tsx +83 -0
  336. package/src/components/field-list/examples/screen.module.css +1 -1
  337. package/src/components/field-list/examples/screen.tsx +19 -19
  338. package/src/components/field-list/examples/totals.tsx +82 -0
  339. package/src/components/fieldset/COMPONENT.md +1 -1
  340. package/src/components/fieldset/examples/states.tsx +1 -1
  341. package/src/components/file-upload/COMPONENT.md +2 -1
  342. package/src/components/file-upload/examples/screen.module.css +2 -2
  343. package/src/components/file-upload/examples/screen.tsx +65 -81
  344. package/src/components/gallery/COMPONENT.md +1 -0
  345. package/src/components/gantt/COMPONENT.md +1 -1
  346. package/src/components/gantt/examples/screen.module.css +1 -1
  347. package/src/components/gantt/examples/screen.tsx +55 -73
  348. package/src/components/hint/COMPONENT.md +16 -2
  349. package/src/components/hint/examples/examples.module.css +10 -1
  350. package/src/components/hint/examples/overview.tsx +1 -1
  351. package/src/components/hint/examples/variants.tsx +48 -0
  352. package/src/components/input/COMPONENT.md +39 -9
  353. package/src/components/input/examples/affixes.tsx +4 -2
  354. package/src/components/input/examples/dismiss.tsx +29 -0
  355. package/src/components/input/examples/suggestions.tsx +26 -0
  356. package/src/components/input/examples/time.tsx +24 -0
  357. package/src/components/input/examples/with-select.tsx +44 -0
  358. package/src/components/kanban/COMPONENT.md +7 -7
  359. package/src/components/kanban/examples/columns.tsx +4 -2
  360. package/src/components/kanban/examples/screen.module.css +1 -1
  361. package/src/components/kanban/examples/screen.tsx +50 -65
  362. package/src/components/kbd/COMPONENT.md +1 -1
  363. package/src/components/label/examples/examples.module.css +12 -1
  364. package/src/components/label/examples/overview.tsx +1 -1
  365. package/src/components/list/COMPONENT.md +26 -10
  366. package/src/components/list/examples/row-controls.tsx +80 -0
  367. package/src/components/list/examples/with-icon.tsx +23 -2
  368. package/src/components/login-form/COMPONENT.md +8 -7
  369. package/src/components/login-form/examples/states.tsx +12 -14
  370. package/src/components/media-viewer/examples/controlled.tsx +16 -16
  371. package/src/components/media-viewer/examples/examples.module.css +1 -3
  372. package/src/components/message/COMPONENT.md +30 -9
  373. package/src/components/message/examples/preview.tsx +28 -0
  374. package/src/components/message/examples/sticker.tsx +35 -0
  375. package/src/components/modal/COMPONENT.md +15 -3
  376. package/src/components/modal/examples/long-content.tsx +37 -18
  377. package/src/components/native-select/COMPONENT.md +1 -0
  378. package/src/components/notification/COMPONENT.md +1 -1
  379. package/src/components/pagination/COMPONENT.md +11 -3
  380. package/src/components/pagination/examples/controlled.tsx +2 -1
  381. package/src/components/popover/COMPONENT.md +3 -2
  382. package/src/components/popover/examples/width.tsx +13 -1
  383. package/src/components/radio/COMPONENT.md +2 -0
  384. package/src/components/rich-text/COMPONENT.md +93 -0
  385. package/src/components/rich-text/examples/overview.tsx +19 -0
  386. package/src/components/scroll-container/COMPONENT.md +8 -5
  387. package/src/components/segmented-control/COMPONENT.md +1 -0
  388. package/src/components/segmented-control/examples/in-form.tsx +1 -1
  389. package/src/components/select/COMPONENT.md +7 -3
  390. package/src/components/slider/COMPONENT.md +4 -3
  391. package/src/components/slider/examples/controlled.tsx +1 -1
  392. package/src/components/slider/examples/states.tsx +14 -10
  393. package/src/components/smart-filter/COMPONENT.md +13 -13
  394. package/src/components/smart-filter/examples/examples.module.css +3 -0
  395. package/src/components/smart-filter/examples/many-values.tsx +12 -8
  396. package/src/components/smart-filter/examples/sizes.tsx +7 -3
  397. package/src/components/sparkline/COMPONENT.md +1 -0
  398. package/src/components/sparkline/examples/curve.tsx +16 -11
  399. package/src/components/sparkline/examples/states.tsx +14 -10
  400. package/src/components/switch/COMPONENT.md +2 -1
  401. package/src/components/tabs/COMPONENT.md +1 -1
  402. package/src/components/tag-select/COMPONENT.md +1 -0
  403. package/src/components/textarea/COMPONENT.md +1 -0
  404. package/src/components/timeline/COMPONENT.md +3 -3
  405. package/src/components/timeline/examples/structure.tsx +2 -1
  406. package/src/components/typography/COMPONENT.md +2 -2
  407. package/src/layout/app-shell/COMPONENT.md +25 -38
  408. package/src/layout/app-shell/examples/footer.tsx +10 -10
  409. package/src/layout/app-shell/examples/overview.tsx +20 -22
  410. package/src/layout/app-shell/examples/screen.module.css +2 -2
  411. package/src/layout/app-shell/examples/screen.tsx +25 -30
  412. package/src/layout/app-shell/examples/template.tsx +13 -17
  413. package/src/layout/bottom-nav/COMPONENT.md +4 -3
  414. package/src/layout/bottom-nav/examples/floating-action.tsx +10 -19
  415. package/src/layout/bottom-nav/examples/floating.tsx +10 -19
  416. package/src/layout/bottom-nav/examples/in-app-shell.tsx +11 -19
  417. package/src/layout/page/COMPONENT.md +382 -0
  418. package/src/layout/page/examples/actions-collapse.tsx +45 -0
  419. package/src/layout/page/examples/collapse.tsx +68 -0
  420. package/src/layout/page/examples/examples.module.css +92 -0
  421. package/{dist/skill/reference/components/page-content → src/layout/page}/examples/grid.tsx +15 -15
  422. package/src/layout/page/examples/guard.tsx +87 -0
  423. package/src/{components/page-content → layout/page}/examples/list-detail.tsx +14 -14
  424. package/src/layout/page/examples/loading.tsx +57 -0
  425. package/src/layout/page/examples/narrow.tsx +75 -0
  426. package/src/layout/page/examples/overview.tsx +57 -0
  427. package/src/{components/page-content → layout/page}/examples/screen.module.css +1 -1
  428. package/{dist/skill/reference/components/page-content → src/layout/page}/examples/screen.tsx +29 -19
  429. package/src/{components/page-content → layout/page}/examples/sections.tsx +17 -24
  430. package/src/layout/page/examples/structure.tsx +41 -0
  431. package/src/{components/page-toolbar/examples/narrow.tsx → layout/page/examples/tools.tsx} +38 -35
  432. package/src/layout/page/examples/top-bar.tsx +85 -0
  433. package/src/{components/page-content → layout/page}/examples/variants.tsx +7 -7
  434. package/src/layout/sidebar/COMPONENT.md +6 -4
  435. package/src/layout/sidebar/examples/dismiss.tsx +10 -7
  436. package/src/layout/sidebar/examples/narrow.tsx +11 -8
  437. package/src/styles/theme-dark.css +12 -10
  438. package/src/styles/theme-light.css +4 -0
  439. package/src/styles/tokens.css +3 -1
  440. package/dist/components/page-content/PageContent.d.ts +0 -192
  441. package/dist/components/page-toolbar/PageToolbar.d.ts +0 -55
  442. package/dist/components/scroll-container/useWheelToInline.d.ts +0 -10
  443. package/dist/layout/app-header/AppHeader.d.ts +0 -118
  444. package/dist/skill/reference/components/page-content/COMPONENT.md +0 -264
  445. package/dist/skill/reference/components/page-content/examples/examples.module.css +0 -56
  446. package/dist/skill/reference/components/page-content/examples/narrow.tsx +0 -25
  447. package/dist/skill/reference/components/page-content/examples/overview.tsx +0 -41
  448. package/dist/skill/reference/components/page-toolbar/COMPONENT.md +0 -147
  449. package/dist/skill/reference/components/page-toolbar/examples/examples.module.css +0 -16
  450. package/dist/skill/reference/components/page-toolbar/examples/overview.tsx +0 -113
  451. package/dist/skill/reference/components/page-toolbar/examples/save-changes.tsx +0 -43
  452. package/dist/skill/reference/components/page-toolbar/examples/without-search.tsx +0 -60
  453. package/dist/skill/reference/layout/app-header/COMPONENT.md +0 -187
  454. package/dist/skill/reference/layout/app-header/examples/breadcrumbs.tsx +0 -37
  455. package/dist/skill/reference/layout/app-header/examples/examples.module.css +0 -28
  456. package/dist/skill/reference/layout/app-header/examples/in-app-shell.tsx +0 -67
  457. package/dist/skill/reference/layout/app-header/examples/narrow.tsx +0 -66
  458. package/dist/skill/reference/layout/app-header/examples/overview.tsx +0 -34
  459. package/dist/skill/reference/layout/app-header/examples/page-title.tsx +0 -78
  460. package/dist/skill/reference/layout/app-shell/examples/contained.tsx +0 -30
  461. package/src/components/page-content/COMPONENT.md +0 -264
  462. package/src/components/page-content/examples/examples.module.css +0 -56
  463. package/src/components/page-content/examples/narrow.tsx +0 -25
  464. package/src/components/page-content/examples/overview.tsx +0 -41
  465. package/src/components/page-toolbar/COMPONENT.md +0 -147
  466. package/src/components/page-toolbar/examples/examples.module.css +0 -16
  467. package/src/components/page-toolbar/examples/overview.tsx +0 -113
  468. package/src/components/page-toolbar/examples/save-changes.tsx +0 -43
  469. package/src/components/page-toolbar/examples/without-search.tsx +0 -60
  470. package/src/layout/app-header/COMPONENT.md +0 -187
  471. package/src/layout/app-header/examples/breadcrumbs.tsx +0 -37
  472. package/src/layout/app-header/examples/examples.module.css +0 -28
  473. package/src/layout/app-header/examples/in-app-shell.tsx +0 -67
  474. package/src/layout/app-header/examples/narrow.tsx +0 -66
  475. package/src/layout/app-header/examples/overview.tsx +0 -34
  476. package/src/layout/app-header/examples/page-title.tsx +0 -78
  477. package/src/layout/app-shell/examples/contained.tsx +0 -30
@@ -1,8 +1,8 @@
1
- /** A phone-width column: search and filter on top, the primary action on its own row under them, then the active filters, the sections and the period, every row 12 apart — `PageToolbar.Root`. */
1
+ /** The orders page's tools in its top bar: sections with counts, search and filter, the period, in the order written; the active filters on a line under everything — `Page.Tools`, `Page.Chips`. */
2
2
  import {
3
3
  Button,
4
4
  Icon,
5
- PageToolbar,
5
+ Page,
6
6
  SegmentedControl,
7
7
  Select,
8
8
  SmartFilter,
@@ -11,17 +11,17 @@ import {
11
11
  } from "prime-ui-kit";
12
12
  import * as React from "react";
13
13
 
14
- import styles from "./examples.module.css";
15
-
16
14
  const SECTIONS = [
17
15
  { value: "all", label: "Все", count: 128 },
18
16
  { value: "active", label: "В работе", count: 12 },
19
17
  { value: "done", label: "Доставлены", count: 96 },
18
+ { value: "cancelled", label: "Отменены", count: 20 },
20
19
  ];
21
20
 
22
21
  const PERIODS = [
23
22
  { value: "7d", label: "7 дней" },
24
23
  { value: "30d", label: "30 дней" },
24
+ { value: "quarter", label: "Квартал" },
25
25
  ];
26
26
 
27
27
  const FIELDS: SmartFilterField[] = [
@@ -31,38 +31,42 @@ const FIELDS: SmartFilterField[] = [
31
31
  options: [
32
32
  { value: "msk", label: "Москва" },
33
33
  { value: "spb", label: "Санкт-Петербург" },
34
+ { value: "kzn", label: "Казань" },
35
+ ],
36
+ },
37
+ {
38
+ key: "payment",
39
+ label: "Оплата",
40
+ options: [
41
+ { value: "card", label: "Картой" },
42
+ { value: "invoice", label: "По счёту" },
34
43
  ],
35
44
  },
36
45
  ];
37
46
 
38
- export default function PageToolbarNarrowExample() {
47
+ export default function PageToolsExample() {
39
48
  const [section, setSection] = React.useState("all");
40
- const [period, setPeriod] = React.useState("7d");
49
+ const [period, setPeriod] = React.useState("30d");
41
50
  const [filter, setFilter] = React.useState<SmartFilterValue>({
42
51
  city: { include: ["msk"], exclude: [] },
43
52
  });
44
53
  const [search, setSearch] = React.useState("");
45
54
 
46
55
  return (
47
- <div className={styles.phone}>
48
- <SmartFilter.Root
49
- fields={FIELDS}
50
- value={filter}
51
- onValueChange={setFilter}
52
- search={search}
53
- onSearchChange={setSearch}
54
- >
55
- <PageToolbar.Root aria-label="Заказы">
56
- <PageToolbar.Tools>
57
- <SmartFilter.Toolbar />
58
- </PageToolbar.Tools>
59
- <PageToolbar.Sections>
60
- <SegmentedControl.Root
61
- fullWidth
62
- value={section}
63
- onValueChange={setSection}
64
- aria-label="Раздел"
65
- >
56
+ <SmartFilter.Root
57
+ fields={FIELDS}
58
+ value={filter}
59
+ onValueChange={setFilter}
60
+ search={search}
61
+ onSearchChange={setSearch}
62
+ >
63
+ <Page.Root>
64
+ <Page.TopBar sticky={false}>
65
+ <Page.Heading>
66
+ <Page.Title>Заказы</Page.Title>
67
+ </Page.Heading>
68
+ <Page.Tools aria-label="Заказы">
69
+ <SegmentedControl.Root value={section} onValueChange={setSection} aria-label="Раздел">
66
70
  {SECTIONS.map((item) => (
67
71
  <SegmentedControl.Item key={item.value} value={item.value}>
68
72
  {item.label}
@@ -70,8 +74,7 @@ export default function PageToolbarNarrowExample() {
70
74
  </SegmentedControl.Item>
71
75
  ))}
72
76
  </SegmentedControl.Root>
73
- </PageToolbar.Sections>
74
- <PageToolbar.View>
77
+ <SmartFilter.Toolbar />
75
78
  <Select.Root value={period} onValueChange={setPeriod}>
76
79
  <Select.Trigger aria-label="Период">
77
80
  <Select.TriggerIcon>
@@ -87,20 +90,20 @@ export default function PageToolbarNarrowExample() {
87
90
  ))}
88
91
  </Select.Content>
89
92
  </Select.Root>
90
- </PageToolbar.View>
91
- <PageToolbar.Actions>
93
+ </Page.Tools>
94
+ <Page.Actions>
92
95
  <Button.Root>
93
96
  <Button.Icon>
94
97
  <Icon name="action.add" />
95
98
  </Button.Icon>
96
99
  Новый заказ
97
100
  </Button.Root>
98
- </PageToolbar.Actions>
99
- <PageToolbar.Chips>
101
+ </Page.Actions>
102
+ <Page.Chips>
100
103
  <SmartFilter.Chips />
101
- </PageToolbar.Chips>
102
- </PageToolbar.Root>
103
- </SmartFilter.Root>
104
- </div>
104
+ </Page.Chips>
105
+ </Page.TopBar>
106
+ </Page.Root>
107
+ </SmartFilter.Root>
105
108
  );
106
109
  }
@@ -0,0 +1,85 @@
1
+ /** A nested record in the top bar: the path ending in the title, a line of data, the page's tools and its buttons — `Page.TopBar`, `Page.Heading`, `Page.Tools`, `Page.Actions`. */
2
+ import { Breadcrumb, Button, Icon, Input, Page, SegmentedControl } from "prime-ui-kit";
3
+ import * as React from "react";
4
+
5
+ const SECTIONS = [
6
+ { value: "all", label: "Все" },
7
+ { value: "mine", label: "Мои" },
8
+ { value: "overdue", label: "Просрочены" },
9
+ ];
10
+
11
+ const VIEWS = [
12
+ { value: "board", label: "Доска" },
13
+ { value: "list", label: "Список" },
14
+ ];
15
+
16
+ export default function PageTopBarExample() {
17
+ const [section, setSection] = React.useState("all");
18
+ const [view, setView] = React.useState("board");
19
+ const [query, setQuery] = React.useState("");
20
+
21
+ return (
22
+ <Page.Root>
23
+ <Page.TopBar sticky={false}>
24
+ <Page.Heading>
25
+ <Breadcrumb.Root>
26
+ <Breadcrumb.Item href="#clients">Клиенты</Breadcrumb.Item>
27
+ <Breadcrumb.Item href="#north">ООО «Север»</Breadcrumb.Item>
28
+ </Breadcrumb.Root>
29
+ <Page.Title>Сделка № 2026-418</Page.Title>
30
+ <Page.Description>7 в работе · 6,5 млн ₽ · обновлено 9:40</Page.Description>
31
+ </Page.Heading>
32
+ <Page.Tools aria-label="Сделка № 2026-418">
33
+ <SegmentedControl.Root value={section} onValueChange={setSection} aria-label="Раздел">
34
+ {SECTIONS.map((item) => (
35
+ <SegmentedControl.Item key={item.value} value={item.value}>
36
+ {item.label}
37
+ </SegmentedControl.Item>
38
+ ))}
39
+ </SegmentedControl.Root>
40
+ <Input.Root>
41
+ <Input.Wrapper>
42
+ <Input.Icon side="start">
43
+ <Icon name="action.search" tone="secondary" />
44
+ </Input.Icon>
45
+ <Input.Field
46
+ type="search"
47
+ aria-label="Поиск по задачам"
48
+ placeholder="Поиск"
49
+ value={query}
50
+ onValueChange={setQuery}
51
+ />
52
+ </Input.Wrapper>
53
+ </Input.Root>
54
+ <SegmentedControl.Root value={view} onValueChange={setView} aria-label="Вид">
55
+ {VIEWS.map((item) => (
56
+ <SegmentedControl.Item key={item.value} value={item.value}>
57
+ {item.label}
58
+ </SegmentedControl.Item>
59
+ ))}
60
+ </SegmentedControl.Root>
61
+ </Page.Tools>
62
+ <Page.Actions>
63
+ <Button.Root variant="soft" tone="neutral">
64
+ <Button.Icon>
65
+ <Icon name="action.forward" />
66
+ </Button.Icon>
67
+ Поделиться
68
+ </Button.Root>
69
+ <Button.Root variant="soft" tone="neutral">
70
+ <Button.Icon>
71
+ <Icon name="action.download" />
72
+ </Button.Icon>
73
+ Экспорт
74
+ </Button.Root>
75
+ <Button.Root>
76
+ <Button.Icon>
77
+ <Icon name="action.add" />
78
+ </Button.Icon>
79
+ Новая сделка
80
+ </Button.Root>
81
+ </Page.Actions>
82
+ </Page.TopBar>
83
+ </Page.Root>
84
+ );
85
+ }
@@ -1,5 +1,5 @@
1
- /** The same page column at three caps: the whole main, a wide dashboard column, a reading column — `maxWidth`. */
2
- import { Card, PageContent, Typography } from "prime-ui-kit";
1
+ /** The same page at three caps: the whole main, a wide dashboard column, a reading column — `maxWidth`. */
2
+ import { Card, Page, Typography } from "prime-ui-kit";
3
3
 
4
4
  import styles from "./examples.module.css";
5
5
 
@@ -9,13 +9,13 @@ const WIDTHS = [
9
9
  { value: "readable", text: "Условия использования: не шире колонки для чтения, по центру." },
10
10
  ] as const;
11
11
 
12
- export default function PageContentVariantsExample() {
12
+ export default function PageVariantsExample() {
13
13
  return (
14
14
  <>
15
15
  {WIDTHS.map(({ value, text }) => (
16
16
  <div key={value} className={styles.main}>
17
- <PageContent.Root maxWidth={value}>
18
- <PageContent.Body>
17
+ <Page.Root maxWidth={value}>
18
+ <Page.Body>
19
19
  <Card.Root>
20
20
  <Card.Body>
21
21
  <Typography variant="body-s" tone="secondary">
@@ -23,8 +23,8 @@ export default function PageContentVariantsExample() {
23
23
  </Typography>
24
24
  </Card.Body>
25
25
  </Card.Root>
26
- </PageContent.Body>
27
- </PageContent.Root>
26
+ </Page.Body>
27
+ </Page.Root>
28
28
  </div>
29
29
  ))}
30
30
  </>
@@ -89,7 +89,7 @@ useSidebar() state hook for custom parts inside Root (useA
89
89
  | `onModeChange` | `(mode: SidebarMode) => void` | — | Called with the new mode (Toggle, `useSidebar().setMode`). |
90
90
  | `open` | `boolean` | — | Off-canvas panel on narrow viewports (controlled). |
91
91
  | `defaultOpen` | `boolean` | `false` | Initial off-canvas state (uncontrolled). |
92
- | `onOpenChange` | `(open: boolean) => void` | — | Off-canvas open / close: Toggle, the AppHeader menu button, scrim, Escape, an activated item, leaving the narrow viewport. |
92
+ | `onOpenChange` | `(open: boolean) => void` | — | Off-canvas open / close: Toggle, the menu button of `Page.TopBar`, scrim, Escape, an activated item, leaving the narrow viewport. |
93
93
  | `offCanvas` | `"auto" \| "always" \| "never"` | `"auto"` | When the rail becomes an off-canvas panel opened by `open`: `auto` — below 768px (viewport); `always` — at any width; `never` — always a rail. |
94
94
  | `closeOnOutsideClick` | `boolean` | `true` | A press on the scrim (outside the off-canvas panel) closes the panel. |
95
95
  | `closeOnEscape` | `boolean` | `true` | Escape closes the off-canvas panel. |
@@ -294,13 +294,15 @@ The rail width does not depend on `size`.
294
294
  | `closeOnEscape` (Root) | Escape closes the off-canvas panel | default; turn off with `closeOnOutsideClick` for a panel only its toggle closes | on |
295
295
  | `asChild` (ItemAction) | the row action is the consumer's link with the button look | the action opens a page or `mailto:` | off |
296
296
 
297
- Put `<Sidebar.Toggle variant="header" />` next to `Sidebar.Brand` in the header, or `Sidebar.Toggle` in the footer for a rail without a brand. Inside an `AppShell` the Sidebar publishes its navigation to the shell: on phones (`offCanvas="auto"`) or always (`offCanvas="always"`) the `AppHeader` draws the menu button that opens the panel by itself, a `Sidebar.Toggle` outside the rail brings back a hidden one, and other triggers (a BottomNav «Ещё») read `useAppShellNav()`. One current item at a time; give every top-level item an icon when the rail can go compact (child items need none).
297
+ Put `<Sidebar.Toggle variant="header" />` next to `Sidebar.Brand` in the header, or `Sidebar.Toggle` in the footer for a rail without a brand. Inside an `AppShell` the Sidebar publishes its navigation to the shell: on phones (`offCanvas="auto"`) or always (`offCanvas="always"`) the page's `Page.TopBar` draws the menu button that opens the panel by itself, a `Sidebar.Toggle` outside the rail brings back a hidden one, and other triggers (a BottomNav «Ещё») read `useAppShellNav()`. One current item at a time; give every top-level item an icon when the rail can go compact (child items need none).
298
298
 
299
299
  ## States
300
300
  | State | Driven by | DOM |
301
301
  |---|---|---|
302
+ | held | a `Page.Guard` that is `busy` or `dirty` on the page | a press on `Sidebar.Item` or `Sidebar.Brand` stops before it navigates (a router link included) and the panel stays; `dirty` asks first, then repeats it |
302
303
  | mode | `mode` / `defaultMode` | Root `data-mode`, `data-panel-mode` (the last visible mode while hidden); `<nav inert>` while hidden |
303
304
  | off-canvas | `offCanvas="always"`, or `"auto"` + viewport < 768px | Root `data-off-canvas`, `data-state="open" \| "closed"`; `<nav inert>` while closed; the kit scrim (`role="presentation"`) while open; in an `AppShell` the shell Root `data-off-canvas` |
305
+ | placing | the viewport crossed the off-canvas breakpoint (not a person's choice) | Root `data-placing` for one painted frame: the rail lands at its new width with no motion (no growing from 0, no folding rows, no sliding panel) |
304
306
  | dismiss | `closeOnOutsideClick`, `closeOnEscape` | a press on the scrim / Escape closes the open panel, or not |
305
307
  | current | `current` or a router's `aria-current` | Item `aria-current="page"`, `data-state="active"` |
306
308
  | active path | a child of a Sub (or an item of a Group) is current | SubTrigger (or the `…` row of a folded Group) `data-active-path`; a closed Sub opens, a closed Group opens off the compact rail |
@@ -364,7 +366,7 @@ Leaving the narrow viewport closes the off-canvas panel; activating an item (a l
364
366
  - A row action is its own button next to the item (never nested), named by `label` with a tooltip.
365
367
  - The account avatar is hidden from screen readers; the name and the muted line name the button.
366
368
  - Off-canvas: a decorative scrim (a press on it is a press outside, `closeOnOutsideClick`), focus trap and Escape (`closeOnEscape`); focus returns to the opener.
367
- - Toggle, the AppHeader menu button and `useAppShellNav` triggers: `aria-expanded`, `aria-controls` → the `<nav>`, label from `labels`.
369
+ - Toggle, the menu button of `Page.TopBar` and `useAppShellNav` triggers: `aria-expanded`, `aria-controls` → the `<nav>`, label from `labels`.
368
370
 
369
371
  ### Labels
370
372
  <!-- Generated from api.ts by `bun run docs:build`. Edit api.ts, not this section. -->
@@ -392,7 +394,7 @@ Leaving the narrow viewport closes the off-canvas panel; activating an item (a l
392
394
  | [dismiss.tsx](examples/dismiss.tsx) | An off-canvas panel only its own toggle closes: a press on the scrim and Escape leave it open, a picked item still closes it — `closeOnOutsideClick`, `closeOnEscape`. |
393
395
  | [controlled.tsx](examples/controlled.tsx) | The parent owns the rail mode: expanded, an icon rail with tooltips, or hidden; every switch is one synchronous movement — `mode`, `onModeChange`. |
394
396
  | [controlled-open.tsx](examples/controlled-open.tsx) | Navigation behind a menu button at any width: the parent opens the off-canvas panel, the scrim, Escape, the header toggle or a navigation closes it — `offCanvas`, `open`, `onOpenChange`. |
395
- | [narrow.tsx](examples/narrow.tsx) | Below 768px the rail leaves the layout and slides in over the page from the menu button the header draws by itself; from 768px it is the rail again, and the button leaves — `AppShell`, `labels`. |
397
+ | [narrow.tsx](examples/narrow.tsx) | Below 768px the rail leaves the layout and slides in over the page from the menu button the page top bar draws by itself; from 768px it is the rail again, and the button leaves — `AppShell`, `labels`. |
396
398
 
397
399
  ## Mistakes
398
400
  - `icon={…}` / `badge={…}` props → use the `Sidebar.ItemIcon` and `Sidebar.ItemCount` parts.
@@ -1,5 +1,5 @@
1
1
  /** An off-canvas panel only its own toggle closes: a press on the scrim and Escape leave it open, a picked item still closes it — `closeOnOutsideClick`, `closeOnEscape`. */
2
- import { AppHeader, AppShell, Icon, Sidebar } from "prime-ui-kit";
2
+ import { AppShell, Icon, Page, Sidebar } from "prime-ui-kit";
3
3
 
4
4
  import styles from "./examples.module.css";
5
5
 
@@ -35,12 +35,15 @@ export default function SidebarDismissExample() {
35
35
  </Sidebar.Content>
36
36
  </Sidebar.Root>
37
37
  </AppShell.Nav>
38
- <AppHeader.Root>
39
- <AppHeader.Start>
40
- <AppHeader.Title>Сборка заказов</AppHeader.Title>
41
- </AppHeader.Start>
42
- </AppHeader.Root>
43
- <AppShell.Main />
38
+ <AppShell.Main>
39
+ <Page.Root>
40
+ <Page.TopBar>
41
+ <Page.Heading>
42
+ <Page.Title>Сборка заказов</Page.Title>
43
+ </Page.Heading>
44
+ </Page.TopBar>
45
+ </Page.Root>
46
+ </AppShell.Main>
44
47
  </AppShell.Root>
45
48
  </div>
46
49
  );
@@ -1,5 +1,5 @@
1
- /** Below 768px the rail leaves the layout and slides in over the page from the menu button the header draws by itself; from 768px it is the rail again, and the button leaves — `AppShell`, `labels`. */
2
- import { AppHeader, AppShell, Icon, Sidebar } from "prime-ui-kit";
1
+ /** Below 768px the rail leaves the layout and slides in over the page from the menu button the page top bar draws by itself; from 768px it is the rail again, and the button leaves — `AppShell`, `labels`. */
2
+ import { AppShell, Icon, Page, Sidebar } from "prime-ui-kit";
3
3
 
4
4
  import styles from "./examples.module.css";
5
5
 
@@ -43,12 +43,15 @@ export default function SidebarNarrowExample() {
43
43
  </Sidebar.Content>
44
44
  </Sidebar.Root>
45
45
  </AppShell.Nav>
46
- <AppHeader.Root>
47
- <AppHeader.Start>
48
- <AppHeader.Title>Сделки</AppHeader.Title>
49
- </AppHeader.Start>
50
- </AppHeader.Root>
51
- <AppShell.Main />
46
+ <AppShell.Main>
47
+ <Page.Root>
48
+ <Page.TopBar>
49
+ <Page.Heading>
50
+ <Page.Title>Сделки</Page.Title>
51
+ </Page.Heading>
52
+ </Page.TopBar>
53
+ </Page.Root>
54
+ </AppShell.Main>
52
55
  </AppShell.Root>
53
56
  </div>
54
57
  );
@@ -38,7 +38,7 @@ everything inside a page breaks by its container.
38
38
  - CSS custom properties cannot be used inside media / container conditions: write the number.
39
39
  - Inside your own blocks prefer container queries: `container-type: inline-size` on the block,
40
40
  `@container (min-width: 30rem)` inside it.
41
- - The app takes the full width; cap only text (`PageContent.Root maxWidth="readable"`).
41
+ - The app takes the full width; cap only text (`Page.Root maxWidth="readable"`).
42
42
  - Required minimum: `<meta name="viewport" content="width=device-width, initial-scale=1">`, no
43
43
  `user-scalable=no`, no horizontal page scroll at 320px.
44
44
 
@@ -46,9 +46,10 @@ everything inside a page breaks by its container.
46
46
 
47
47
  A layout inside a page needs no breakpoint: it takes its columns from the room it has.
48
48
 
49
- - The tiles of a page (KPI cards, charts, panels) are one `PageContent.Grid` with a
50
- `PageContent.Cell span` per tile: it folds by its own width (below 30rem every tile takes the row,
51
- then small tiles pair up, from 64rem each its span).
49
+ - The tiles of a page (KPI cards, charts, panels) are one `Page.Grid` with a
50
+ `Page.Cell span` per tile: it folds by its own width (below 30rem every tile takes the row,
51
+ then small tiles pair up, from 64rem each its span). Write a wide tile (`span` 7–11) next to a
52
+ narrow one (4–5): between 40 and 64rem the two pair up as 2/3 + 1/3, so an 8 + 4 row keeps no hole.
52
53
  - A grid inside one block (thumbnails, short fields of one record) is the block's own
53
54
  `grid-template-columns: repeat(auto-fill, minmax(min(100%, var(--prime-layout-tile-min-width)), 1fr))`
54
55
  — `auto-fill`, so a lone item keeps its column width instead of stretching across the row.
@@ -61,43 +62,49 @@ Use these as they are; never wrap them in your own breakpoints.
61
62
 
62
63
  | Need | Built in |
63
64
  |---|---|
64
- | app frame | AppShell gutters 16 → 24 → 32; `AppHeader` un-sticks on screens lower than 480px, respects safe areas and, below 36rem of its width, drops the title icon, the title and its line of data truncate |
65
- | app navigation | Sidebar: on-canvas from 768px, an off-canvas panel below (`offCanvas="auto"`) opened by the menu button the AppHeader draws by itself while the Sidebar is off-canvas; `BottomNav` in `AppShell.Footer` for 2–6 app sections on phones — flat or a floating glass capsule (`floating`) with an optional round `BottomNav.Action`, icons with or without labels (`iconOnly`); the shell hides it by itself while the Sidebar rail is on screen (from 768px with `offCanvas="auto"`) |
66
- | page panel | `PageToolbar` — search and filter first, one row when wide, stacked rows when narrow, the primary action on its own row when the search would get less than 18rem beside it ([below](#page-panel--pagetoolbar)) |
67
- | page header | `AppHeader`: the page's tools wrap under the title (`AppHeader.Tools`); a document page's `PageContent.Header`: actions wrap under the title |
65
+ | app frame | `AppShell.Main` hands the page its gutters 16 → 24 → 32, top air 24 → 32 and bottom air 64 (the gutter under a `fill` page; above a floating BottomNav it keeps the capsule's room); `Page.TopBar` un-sticks on screens lower than 480px and respects the top safe area |
66
+ | app navigation | Sidebar: on-canvas from 768px, an off-canvas panel below (`offCanvas="auto"`) opened by the menu button `Page.TopBar` draws by itself while the Sidebar is off-canvas; `BottomNav` in `AppShell.Footer` for 2–6 app sections on phones — flat or a floating glass capsule (`floating`) with an optional round `BottomNav.Action`, icons with or without labels (`iconOnly`); the shell hides it by itself while the Sidebar rail is on screen (from 768px with `offCanvas="auto"`) |
67
+ | page top bar | `Page.TopBar` lays out its groups from their natural widths: one line while they fit, then the tools on a line of their own, then icon-only buttons, then «⋯», and the heading gives last ([below](#the-pages-top-bar--pagetopbar)). `Page.Header` in the flow: actions wrap under the title |
68
68
  | switchers | [Switchers](#switchers) never wrap or truncate: they scroll inside themselves |
69
69
  | tables | DataTable scrolls inside itself, edge shadows show hidden columns, `stickyFirstColumn`, `DataTable.ColumnsMenu` for a column chooser, the toolbar stacks below a 30rem table, sticky head off on short screens |
70
70
  | floating layers | Popover (opened from a Trigger), Dropdown, Select (and Datepicker, ColorPresets) never wider than the viewport − 16, 8 from the edges, flip when out of room; below 640 they open as a bottom sheet — scrim, grab handle, swipe down to close, page scroll locked; Tooltip and TagSelect stay anchored |
71
71
  | dialogs | Modal is a bottom sheet with a handle below 640 (swipe down closes it while `closeOnOutsideClick` allows); footer actions stack on phones and in a dialog narrower than 360px; `Sheet` is a bottom sheet for a short task at every width (centred at 560 on a tablet or desktop) and closes with a swipe down from its handle or header; a Drawer has no swipe — buttons, Escape and the scrim close it |
72
72
  | date picking | Datepicker shows two months and side presets only when they fit; otherwise one month and presets above |
73
73
  | system messages | Banner actions move under the text in a narrow container; Notification stays within the viewport with safe-area insets |
74
- | chat | `Message` bubbles fit their content in CSS and cap at 30rem and 85% of the chat column, file / contact / location cards at 16rem and 75%, a round video at its size token × 1.15 and the row width (the Composer's recording preview at 70%), so a chat works from 320px; the message menu is a bottom sheet below 640, the reaction bar opens on a long press; `Composer` takes its container's width, keeps 16px text and 44px hit areas on touch, and the recording bar covers the field without changing the row height; `VoicePlayer` shrinks its waveform to fit; `Chat` fills its pane, a chat beside its dialogs is `PageContent.Split` (one pane at a time when narrow); `Chat.Header` keeps the avatar, a title that truncates and icon-only actions, `Chat.Search` puts its counter and arrows after a shrinking field, `Chat.Pinned` truncates its line, the «к последним» button floats inside the thread at its bottom-end, and the Composer stays one row (paperclip · field · button) from 320px with its bars above it |
74
+ | chat | `Message` bubbles fit their content in CSS and cap at 30rem and 85% of the chat column, file / contact / location cards at 16rem and 75%, a round video at its size token × 1.15 and the row width (the Composer's recording preview at 70%), so a chat works from 320px; the message menu is a bottom sheet below 640, the reaction bar opens on a long press; `Composer` takes its container's width, keeps 16px text and 44px hit areas on touch, and the recording bar covers the field without changing the row height; `VoicePlayer` shrinks its waveform to fit; `Chat` fills its pane, a chat beside its dialogs is `Page.Split` (one pane at a time when narrow); `Chat.Header` keeps the avatar, a title that truncates and icon-only actions, `Chat.Search` puts its counter and arrows after a shrinking field, `Chat.Pinned` truncates its line, the «к последним» button floats inside the thread at its bottom-end, and the Composer stays one row (paperclip · field · button) from 320px with its bars above it |
75
75
  | schedules and boards | `Gantt` scrolls inside itself with the header and the first column pinned; the first column narrows (12 → 10 → 6rem by the chart's width, or only the avatar); a long press on touch creates a one-unit bar; rows and days are virtualized. `Kanban` columns are 18rem from 40rem of board width, below that 85% of it with snapping so the next column peeks; the strip scrolls sideways inside the board |
76
76
  | cards and properties | Card templates stack and wrap in a narrow container; `DescriptionList` stacks label over value below 24rem of its width; FileUpload `layout="grid"` shows 5 · 4 · 3 · 2 tiles across by its own width |
77
77
  | fields | text ≥ 16px under a coarse pointer (no iOS zoom on focus); labels above fields; affixes in the field row |
78
78
  | codes | DigitInput cells 36–64px, `fullWidth` cells share a phone column |
79
79
  | touch | hover effects only under `(hover: hover)`; under `(pointer: coarse)` small controls get a 44px hit area; nothing is hover-only |
80
80
 
81
- ## Page panel — `PageToolbar`
81
+ ## The page's top bar — `Page.TopBar`
82
82
 
83
- One strip at the top of the page — on an app page, the page's tools row in `AppHeader.Tools` — holds
84
- up to five slots. It renders them in one fixed order whatever the JSX order (that is also the Tab
85
- order) and lays them out from its own width; how each slot moves at every width is in
86
- [PageToolbar COMPONENT.md → Layout by width](reference/components/page-toolbar/COMPONENT.md#layout-by-width).
83
+ The bar holds up to four groups ([what goes in each](composition.md#the-top-bar)) and lays them out
84
+ by one plan chosen from their natural widths. As the width runs out it gives way in five steps, always
85
+ in this order, and nothing ever overflows:
87
86
 
88
- | Slot | Holds |
89
- |---|---|
90
- | `PageToolbar.Tools` | search + filter button: `SmartFilter.Toolbar` |
91
- | `PageToolbar.Sections` | sections of the page: a `fullWidth` SegmentedControl with counts |
92
- | `PageToolbar.View` | period, table / cards, columns |
93
- | `PageToolbar.Actions` | the primary action («Создать», «Сохранить 3 изменения») |
94
- | `PageToolbar.Chips` | active filters: `SmartFilter.Chips` |
87
+ 1. **One line** — `Page.Heading`, `Page.Tools` and `Page.Actions` side by side while they fit.
88
+ 2. **Tools below** — the tools take a line of their own under the first one and fill its width: a
89
+ search (`SmartFilter.Toolbar`, `Input.Root`) grows first, the switchers and a period
90
+ (`Datepicker.Root`) share the rest and wrap when one line is not enough. Beside a search that
91
+ would get too little room the SmartFilter button shows only its icon and count, on the same row.
92
+ The actions stay on the first line beside the heading at every width.
93
+ 3. **Icons** — every Button with an icon shows only the icon, the secondary ones first, then the
94
+ primary; its label stays its accessible name and becomes its tooltip.
95
+ 4. **«⋯»** — the secondary Buttons fold into a menu (`labels.more`); the primary always stays.
96
+ 5. **The heading gives** — only after every button step: the middle levels of the path fold into
97
+ «…»; a heading with a path that still does not fit stacks (the path on its own line over the
98
+ title, the title and its description wrapping), so no level is cut to a fragment; a heading without a path truncates.
99
+
100
+ `Page.Chips` is always a line of its own under everything, gone while no filter is set. The heading
101
+ keeps its natural width: the bar sizes the title, so there is nothing to tune.
95
102
 
96
103
  ```tsx
97
104
  import {
98
105
  Button,
99
106
  Icon,
100
- PageToolbar,
107
+ Page,
101
108
  SegmentedControl,
102
109
  Select,
103
110
  SmartFilter,
@@ -110,7 +117,7 @@ const FIELDS: SmartFilterField[] = [
110
117
  { key: "city", label: "Город", options: [{ value: "msk", label: "Москва" }] },
111
118
  ];
112
119
 
113
- export function OrdersPanel() {
120
+ export function OrdersPage() {
114
121
  const [section, setSection] = useState("all");
115
122
  const [period, setPeriod] = useState("30d");
116
123
  const [filter, setFilter] = useState<SmartFilterValue>({});
@@ -124,63 +131,75 @@ export function OrdersPanel() {
124
131
  search={search}
125
132
  onSearchChange={setSearch}
126
133
  >
127
- <PageToolbar.Root aria-label="Заказы">
128
- <PageToolbar.Tools>
129
- <SmartFilter.Toolbar />
130
- </PageToolbar.Tools>
131
- <PageToolbar.Sections>
132
- <SegmentedControl.Root fullWidth value={section} onValueChange={setSection} aria-label="Раздел">
133
- <SegmentedControl.Item value="all">
134
- Все<SegmentedControl.Count>128</SegmentedControl.Count>
135
- </SegmentedControl.Item>
136
- <SegmentedControl.Item value="active">
137
- В работе<SegmentedControl.Count>12</SegmentedControl.Count>
138
- </SegmentedControl.Item>
139
- </SegmentedControl.Root>
140
- </PageToolbar.Sections>
141
- <PageToolbar.View>
142
- <Select.Root value={period} onValueChange={setPeriod}>
143
- <Select.Trigger aria-label="Период">
144
- <Select.Value />
145
- </Select.Trigger>
146
- <Select.Content>
147
- <Select.Item value="7d">7 дней</Select.Item>
148
- <Select.Item value="30d">30 дней</Select.Item>
149
- </Select.Content>
150
- </Select.Root>
151
- </PageToolbar.View>
152
- <PageToolbar.Actions>
153
- <Button.Root>
154
- <Button.Icon>
155
- <Icon name="action.add" />
156
- </Button.Icon>
157
- Новый заказ
158
- </Button.Root>
159
- </PageToolbar.Actions>
160
- <PageToolbar.Chips>
161
- <SmartFilter.Chips />
162
- </PageToolbar.Chips>
163
- </PageToolbar.Root>
134
+ <Page.Root>
135
+ <Page.TopBar>
136
+ <Page.Heading>
137
+ <Page.Title>Заказы</Page.Title>
138
+ <Page.Description>128 в работе · 6 ждут оплаты</Page.Description>
139
+ </Page.Heading>
140
+ <Page.Tools aria-label="Заказы">
141
+ <SegmentedControl.Root value={section} onValueChange={setSection} aria-label="Раздел">
142
+ <SegmentedControl.Item value="all">
143
+ Все<SegmentedControl.Count>128</SegmentedControl.Count>
144
+ </SegmentedControl.Item>
145
+ <SegmentedControl.Item value="active">
146
+ В работе<SegmentedControl.Count>12</SegmentedControl.Count>
147
+ </SegmentedControl.Item>
148
+ </SegmentedControl.Root>
149
+ <SmartFilter.Toolbar />
150
+ <Select.Root value={period} onValueChange={setPeriod}>
151
+ <Select.Trigger aria-label="Период">
152
+ <Select.Value />
153
+ </Select.Trigger>
154
+ <Select.Content>
155
+ <Select.Item value="7d">7 дней</Select.Item>
156
+ <Select.Item value="30d">30 дней</Select.Item>
157
+ </Select.Content>
158
+ </Select.Root>
159
+ </Page.Tools>
160
+ <Page.Actions>
161
+ <Button.Root variant="soft" tone="neutral">
162
+ <Button.Icon>
163
+ <Icon name="action.download" />
164
+ </Button.Icon>
165
+ Экспорт
166
+ </Button.Root>
167
+ <Button.Root>
168
+ <Button.Icon>
169
+ <Icon name="action.add" />
170
+ </Button.Icon>
171
+ Новый заказ
172
+ </Button.Root>
173
+ </Page.Actions>
174
+ <Page.Chips>
175
+ <SmartFilter.Chips />
176
+ </Page.Chips>
177
+ </Page.TopBar>
178
+ <Page.Body>{/* the orders table */}</Page.Body>
179
+ </Page.Root>
164
180
  </SmartFilter.Root>
165
181
  );
166
182
  }
167
183
  ```
168
184
 
169
- - One tier for the whole panel (default `m`): never `size` on one control inside — wrapped rows must
170
- stay level. A denser page wraps the toolbar in `<ControlSizeProvider value="s">`; every kit control
185
+ - One tier for the whole bar (default `m`): never `size` on one control inside — wrapped lines must
186
+ stay level. A denser page wraps the bar in `<ControlSizeProvider value="s">`; every kit control
171
187
  inside takes that tier.
172
- - The primary action is always there: on a phone it may take its own row or become icon-only with
173
- `aria-label`; it never disappears.
188
+ - A Button without an icon keeps its label at every step and leaves the bar less room before it
189
+ folds: give each one a `Button.Icon`.
190
+ - A SegmentedControl or a Datepicker in `Page.Tools` needs no `fullWidth`: the bar sets it.
191
+ - The primary action is on screen at every width — as its icon at the narrowest; it never folds and
192
+ never disappears.
174
193
  - Section totals go into `SegmentedControl.Count`, not into stat cards above the table.
175
- - A long form saves through the panel's action with a count («Сохранить 3 изменения»), never a sticky
176
- bar at the bottom of a phone screen.
177
- - Do not duplicate search: if the panel has one, the list below filters by it.
194
+ - A long form saves through the bar's primary action with a count («Сохранить 3 изменения»), never a
195
+ sticky bar at the bottom of a phone screen.
196
+ - Do not duplicate search: if the bar has one, the list below filters by it.
178
197
 
179
198
  ## Switchers
180
199
 
181
- - **Three width modes:** by content (`fullWidth` off), full width (`fullWidth`), full width only when
182
- narrow (a `fullWidth` SegmentedControl inside `PageToolbar.Sections` — the toolbar decides).
183
- - Sections of a page → SegmentedControl in `PageToolbar.Sections`; panels inside a card or a section →
200
+ - **Three width modes:** by content (`fullWidth` off), full width (`fullWidth`), full width only on
201
+ a line of its own (a SegmentedControl in `Page.Tools` — the bar decides).
202
+ - Sections of a page → SegmentedControl in `Page.Tools`; panels inside a card or a section →
184
203
  Tabs (the folder look belongs to its panel).
185
204
  - Every switcher — Tabs, SegmentedControl, a horizontal ButtonGroup and BottomNav — scrolls inside
186
205
  itself when its items do not fit: never a second line, never a truncated item. Its hidden edges
@@ -195,9 +214,9 @@ export function OrdersPanel() {
195
214
 
196
215
  ## List + details, side panels
197
216
 
198
- - A list people work through record by record (mail, a messenger, tickets) is `PageContent.Split`:
199
- the list in a 16–20rem column with the details beside it from 48rem of the split's own width, one
200
- pane at a time with `PageContent.BackButton` below it. Details opened now and then from a table
217
+ - A list people work through record by record (mail, a messenger, tickets) is `Page.Split`:
218
+ the list (`Page.List`) in a 16–20rem column with the details (`Page.Detail`) beside it from 48rem
219
+ of the split's own width, one pane at a time with `Page.BackButton` below it. Details opened now and then from a table
201
220
  open in a Drawer.
202
221
  - A side panel of details becomes full-screen on a phone (`Drawer.Content` is full width below 640).
203
222
  - Its period / view controls stay visible on every tab of the panel.
@@ -205,7 +224,7 @@ export function OrdersPanel() {
205
224
  ## Components on narrow widths — what you still decide
206
225
 
207
226
  **Tables.** Let DataTable scroll inside itself; offer a column chooser (`DataTable.ColumnsMenu` in
208
- `toolbar`; the key column `hideable: false`); `stickyFirstColumn` for the name. On phones a table / cards switch in `PageToolbar.View` is fine — silently dropping columns
227
+ `toolbar`; the key column `hideable: false`); `stickyFirstColumn` for the name. On phones a table / cards switch in `Page.Tools` is fine — silently dropping columns
209
228
  by breakpoint is not. Never ask to rotate the phone.
210
229
 
211
230
  **Card grids.** [Intrinsic grids](#intrinsic-grids), never a breakpoint. Tiles of a row share one
@@ -257,7 +276,7 @@ Target CLS ≤ 0.1: nothing moves while loading or when a filter changes.
257
276
  Drag the window through 320, 390, 768, 1024, 1280 and 1920px — continuously, not only at these points.
258
277
 
259
278
  - [ ] No horizontal page scroll at any width (tables and switchers scroll inside themselves).
260
- - [ ] The primary action is on screen at every width — never hidden ([the page panel](#page-panel--pagetoolbar)).
279
+ - [ ] The primary action is on screen at every width — never hidden ([the page's top bar](#the-pages-top-bar--pagetopbar)).
261
280
  - [ ] Every item alone in its row stretches; items of stretched switchers are equal.
262
281
  - [ ] All controls in a row share one height; no «staircase» after a wrap.
263
282
  - [ ] Text never overlaps and is cut only at its own block's edge; cut text has a tooltip or `title`.