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
@@ -13,7 +13,7 @@
13
13
  - A tile that is itself the way to its details — a KPI that opens its report, a project tile (`asChild` with a link or a button).
14
14
 
15
15
  ## When not to use
16
- - A whole page region with a title and description → [PageContent](../page-content/COMPONENT.md) sections; do not wrap every section in a card.
16
+ - A whole page region with a title and description → [Page](../../layout/page/COMPONENT.md) sections (`Page.Section`); do not wrap every section in a card.
17
17
  - Tabular data → use [DataTable](../data-table/COMPONENT.md) (it has its own fill).
18
18
  - A message about the page state → [Banner](../banner/COMPONENT.md); nothing to show yet → [EmptyPage](../empty-page/COMPONENT.md).
19
19
  - Content that floats over the page → [Popover](../popover/COMPONENT.md), [Modal](../modal/COMPONENT.md) or [Drawer](../drawer/COMPONENT.md).
@@ -47,6 +47,7 @@ Card.Root asChild <a> or <button> (the only child) holding the pa
47
47
  |---|---|---|---|
48
48
  | `variant` | `"panel" \| "mini" \| "stat-trend" \| "split" \| "cta" \| "list" \| "cover"` | `"panel"` | Structural template: titled block with zones (`panel`), KPI tiles, a call to action, a list or a cover tile. |
49
49
  | `flat` | `boolean` | `false` | No raised shadow: a flat tile for dense grids. |
50
+ | `loading` | `boolean` | `false` | The KPI is loading: `Card.Value`, `Card.Delta` and `Card.Meta` show a Skeleton in their own geometry and the root sets `aria-busy`; the data fades in when it arrives. Labels and titles stay. |
50
51
  | `asChild` | `boolean` | `false` | The whole card is one link or button: pass that element as the only child with the parts inside it; it gets hover, press and the focus ring. Nothing interactive may sit inside it. |
51
52
  | `…rest` | `HTMLAttributes<HTMLDivElement>` | — | `className`, `role` + `aria-labelledby` for a landmark block, and the other div attributes. |
52
53
 
@@ -101,7 +102,7 @@ Card.Root asChild <a> or <button> (the only child) holding the pa
101
102
  | `…rest` | `HTMLAttributes<HTMLElement>` | — | `children`, `className` and the other attributes of the element. |
102
103
 
103
104
  ### Card.Label · Card.Value
104
- `ref` → `HTMLSpanElement`. Metric text: the label (body-s, truncates) and the value (tabular, sized by the template and the card width).
105
+ `ref` → `HTMLSpanElement`. Metric text: the label (body-s; truncates, wraps in a `mini` tile and a `split` cell) and the value (tabular, sized by the template and the card width).
105
106
 
106
107
  | Prop | Type | Default | Description |
107
108
  |---|---|---|---|
@@ -154,6 +155,7 @@ Card.Root asChild <a> or <button> (the only child) holding the pa
154
155
  | Value | Looks like | Use when | Default |
155
156
  |---|---|---|---|
156
157
  | `flat` | same fill, no shadow | dense grids of tiles | `false` |
158
+ | `loading` | `Card.Value`, `Card.Delta` and `Card.Meta` hold a Skeleton in their own geometry (the value a bar one line of its role high); the data fades in under the same element | a KPI waits for its report | `false` |
157
159
  | `asChild` | the card is the link or button it wraps: lifts on hover (raised → overlay shadow), presses, focus ring | the whole tile opens its details | `false` |
158
160
 
159
161
  ## States
@@ -161,6 +163,7 @@ Card.Root asChild <a> or <button> (the only child) holding the pa
161
163
  |---|---|---|
162
164
  | template | `variant` | `data-variant` |
163
165
  | flat | `flat` | `data-flat` |
166
+ | loading | `loading` | `aria-busy` on the root; `data-loading` on `Card.Value`, `Card.Delta`, `Card.Meta`, each holding a `Skeleton`; on `false` the data fades in (`useSwapIn`, foundation §1 rule 7) |
164
167
  | depth | nesting: one above the nearest surface (the page and the AppShell panel are 0) | `data-depth` (`1`–`4`, `floating-1`/`floating-2` inside a floating layer); the fill is `--prime-color-layer-current`, the shadow only at depth 1 |
165
168
  | card width | container queries | `split` stacks below 22rem, `Header` wraps below 22rem (a header control under its description), the `stat-trend` value changes at 20rem / 36rem |
166
169
  | hover | `asChild`, a fine pointer | the fill stays (a whole surface never changes its fill, foundation §8); the shadow lifts to `--prime-shadow-overlay` over `fast` |
@@ -170,11 +173,11 @@ Card.Root asChild <a> or <button> (the only child) holding the pa
170
173
  Without `asChild` a card is static: no hover, focus or press of its own. With it: `data-interactive` on the element.
171
174
 
172
175
  ## Layout & spacing
173
- - Cards on a page: one `PageContent.Grid` with a `PageContent.Cell span` per card (16 on both axes, the cards of a row share one height); a grid inside one block is the block's own intrinsic `auto-fill` grid on the tile width of the layout tokens (a lone card keeps its column width), gap `--prime-space-4`.
176
+ - Cards on a page: one `Page.Grid` with a `Page.Cell span` per card (16 on both axes, the cards of a row share one height); a grid inside one block is the block's own intrinsic `auto-fill` grid on the tile width of the layout tokens (a lone card keeps its column width), gap `--prime-space-4`.
174
177
  - Radius `--prime-card-radius`, no border. In `panel` and `list` the `Header` is a padded zone with a faint inset hairline below; in `stat-trend` it can pair a leading Badge or icon with a compact `Card.Value`.
175
178
  - Padding `--prime-card-padding-m` (20); `Body` gap `--prime-card-gap` (16); fields inside `Body` 20 apart, one ladder step off the card.
176
179
  - Depth comes from nesting (foundation §4): on the page — the AppShell panel is the page — a card is layer 1 (white in light) with the raised whisper; inside another card it is the next layer, a flat tile. The ladder stops at layer 4.
177
- - Long values wrap, labels truncate; a chart SVG needs a CSS height.
180
+ - Long values wrap; labels truncate, except in a `mini` tile and a `split` cell, where a label beside the icon wraps instead; a chart SVG needs a CSS height.
178
181
  - In a `Header` the title takes the free width; a control or a caption after it sits at the end without a wrapper. A `Card.Description` in the header stacks under the title, 4 apart; the control stays at the end, centred on both lines.
179
182
  - `Card.Meta` in `stat-trend` takes the bottom of the tile (`margin-top: auto`), so tiles of one row line their meta up; in `mini` and a `split` cell it sits in the text column under the value.
180
183
 
@@ -195,6 +198,7 @@ Without `asChild` a card is static: no hover, focus or press of its own. With it
195
198
  - `Card.Root` is a plain `<div>`; give it `role="region"` + `aria-labelledby` only when it is a landmark-worthy block.
196
199
  - `Card.Title` renders `<h3>`; directly under the page title pass `as="h2"`.
197
200
  - Decorative icons in `Card.Icon` and cover images in `Card.Media` get `aria-hidden`; controls in `Card.Header` need their own names.
201
+ - A `loading` card sets `aria-busy` on its root; the Skeletons are decorative (`aria-hidden`).
198
202
 
199
203
  ### Labels
200
204
  <!-- Generated from api.ts by `bun run docs:build`. Edit api.ts, not this section. -->
@@ -211,12 +215,13 @@ No `labels`.
211
215
  | [interactive.tsx](examples/interactive.tsx) | Whole cards as links to their reports: one tab stop each, a lift on hover, a press and the focus ring — `asChild`. |
212
216
  | [content-templates.tsx](examples/content-templates.tsx) | Content templates: a call to action, an events list and a campaign tile with a cover — `Card.Footer`, `Card.List`, `Card.Media`. |
213
217
  | [flat.tsx](examples/flat.tsx) | A flat tile without the raised shadow next to the default one, for dense grids — `flat`. |
218
+ | [states.tsx](examples/states.tsx) | A KPI tile while its report loads next to the loaded one, in the `stat-trend` and `mini` templates — `loading`. |
214
219
  | [narrow.tsx](examples/narrow.tsx) | The card is a size container: the split template stacks its cells below 22rem and the trend value shrinks below 20rem — `variant`. |
215
- | [screen.tsx](examples/screen.tsx) | A dashboard: the title, a line of data, the period switch and the report in the app header; one grid of KPI tiles that cross-fade to the new period, a revenue trend, invoiced against paid beside two panels, and the latest payments with a link to the list — `AppHeader.Tools`, `PageContent.Grid`. |
220
+ | [screen.tsx](examples/screen.tsx) | A dashboard: the title and a line of data in the page flow, the period switch and the report in the top bar that keeps the title once it scrolls away; one grid of KPI tiles that cross-fade to the new period, a revenue trend, invoiced against paid beside two panels, and the latest payments with a link to the list — `collapse`, `Page.Grid`. |
216
221
 
217
222
  ## Mistakes
218
223
  - A `<div>` with a border styled as a card → use `Card.Root`; depth comes from fill, not lines.
219
- - Wrapping every page section in a card → use PageContent sections.
224
+ - Wrapping every page section in a card → use `Page.Section`.
220
225
  - `Card.Delta tone="success"` for every «+» → choose the tone by meaning.
221
226
  - Custom padding on a `panel` root → padding belongs to `Header` / `Body` / `Footer`.
222
227
  - A wrapper `<div>` around the label and the value of `mini` → put `Icon`, `Label`, `Value` straight into the root (or into a `split` cell); the template lays them out.
@@ -225,7 +230,8 @@ No `labels`.
225
230
  - A clickable `<div>` card with `onClick` → `asChild` with a real `<a href>` (Cmd-click, a new tab) or a `<button>`.
226
231
  - Buttons or links inside an `asChild` card → nested interactive elements; move them out of the card.
227
232
  - The reference figures written into `Card.Delta` or `Card.Label` → `Card.Meta`.
233
+ - Skeletons placed by hand inside `Card.Value` → `Card.Root loading`; keep the parts mounted while loading so each holds its place.
228
234
 
229
235
  ## Related
230
- - **Built from:** —
231
- - **See also:** [PageContent](../page-content/COMPONENT.md), [DescriptionList](../description-list/COMPONENT.md) (record details inside a `Card.Body`), [Fieldset](../fieldset/COMPONENT.md) (groups of fields inside a settings card), [DataTable](../data-table/COMPONENT.md), [Badge](../badge/COMPONENT.md), [ProgressBar](../progress-bar/COMPONENT.md), [SegmentedControl](../segmented-control/COMPONENT.md), [Sparkline](../sparkline/COMPONENT.md) (a trend with its total inside a `panel`), [ChartFrame](../chart-frame/COMPONENT.md) (a full chart with legend and states)
236
+ - **Built from:** [Skeleton](../skeleton/COMPONENT.md)
237
+ - **See also:** [Page](../../layout/page/COMPONENT.md), [DescriptionList](../description-list/COMPONENT.md) (record details inside a `Card.Body`), [Fieldset](../fieldset/COMPONENT.md) (groups of fields inside a settings card), [DataTable](../data-table/COMPONENT.md), [Badge](../badge/COMPONENT.md), [ProgressBar](../progress-bar/COMPONENT.md), [SegmentedControl](../segmented-control/COMPONENT.md), [Sparkline](../sparkline/COMPONENT.md) (a trend with its total inside a `panel`), [ChartFrame](../chart-frame/COMPONENT.md) (a full chart with legend and states)
@@ -1,4 +1,4 @@
1
- /* Dashboard: the board of tiles is PageContent.Grid; here only the inside of the tiles. */
1
+ /* Dashboard: the board of tiles is Page.Grid; here only the inside of the tiles. */
2
2
 
3
3
  /* Bars inside a panel: 20 apart, like fields. */
4
4
  .bars {
@@ -1,6 +1,5 @@
1
- /** A dashboard: the title, a line of data, the period switch and the report in the app header; one grid of KPI tiles that cross-fade to the new period, a revenue trend, invoiced against paid beside two panels, and the latest payments with a link to the list — `AppHeader.Tools`, `PageContent.Grid`. */
1
+ /** A dashboard: the title and a line of data in the page flow, the period switch and the report in the top bar that keeps the title once it scrolls away; one grid of KPI tiles that cross-fade to the new period, a revenue trend, invoiced against paid beside two panels, and the latest payments with a link to the list — `collapse`, `Page.Grid`. */
2
2
  import {
3
- AppHeader,
4
3
  Badge,
5
4
  Button,
6
5
  Card,
@@ -12,8 +11,7 @@ import {
12
11
  type DataTableColumn,
13
12
  Icon,
14
13
  LinkButton,
15
- PageContent,
16
- PageToolbar,
14
+ Page,
17
15
  ProgressBar,
18
16
  type ProgressSegment,
19
17
  SegmentedControl,
@@ -158,206 +156,194 @@ export default function CardScreenExample() {
158
156
  const [period, setPeriod] = React.useState<Period>("month");
159
157
 
160
158
  return (
161
- <>
162
- {/* In an app this header fills the shell's `header` slot and carries the page: the only h1,
163
- a line of data under it and the page's tools; main has no PageContent.Header. */}
164
- <AppHeader.Root>
165
- <AppHeader.Start>
166
- <AppHeader.Title>
167
- Обзор
168
- <AppHeader.Description>Продажи и оплаты · на 8 октября, 9:40</AppHeader.Description>
169
- </AppHeader.Title>
170
- </AppHeader.Start>
171
- <AppHeader.Tools>
172
- <PageToolbar.Root aria-label="Обзор">
173
- <PageToolbar.View>
174
- <SegmentedControl.Root
175
- aria-label="Период"
176
- value={period}
177
- onValueChange={(next) => setPeriod(next as Period)}
178
- >
179
- <SegmentedControl.Item value="week">Неделя</SegmentedControl.Item>
180
- <SegmentedControl.Item value="month">Месяц</SegmentedControl.Item>
181
- <SegmentedControl.Item value="quarter">Квартал</SegmentedControl.Item>
182
- </SegmentedControl.Root>
183
- </PageToolbar.View>
184
- <PageToolbar.Actions>
185
- <Button.Root variant="soft" tone="neutral">
186
- <Button.Icon>
187
- <Icon name="action.download" />
188
- </Button.Icon>
189
- Отчёт
190
- </Button.Root>
191
- </PageToolbar.Actions>
192
- </PageToolbar.Root>
193
- </AppHeader.Tools>
194
- </AppHeader.Root>
159
+ <Page.Root>
160
+ {/* An overview: the large title in the flow; the bar keeps the period and the report in
161
+ reach and repeats the title once it scrolls away. */}
162
+ <Page.TopBar collapse>
163
+ <Page.Tools>
164
+ <SegmentedControl.Root
165
+ aria-label="Период"
166
+ value={period}
167
+ onValueChange={(next) => setPeriod(next as Period)}
168
+ >
169
+ <SegmentedControl.Item value="week">Неделя</SegmentedControl.Item>
170
+ <SegmentedControl.Item value="month">Месяц</SegmentedControl.Item>
171
+ <SegmentedControl.Item value="quarter">Квартал</SegmentedControl.Item>
172
+ </SegmentedControl.Root>
173
+ </Page.Tools>
174
+ <Page.Actions>
175
+ <Button.Root variant="soft" tone="neutral">
176
+ <Button.Icon>
177
+ <Icon name="action.download" />
178
+ </Button.Icon>
179
+ Отчёт
180
+ </Button.Root>
181
+ </Page.Actions>
182
+ </Page.TopBar>
183
+ <Page.Header>
184
+ <Page.Heading>
185
+ <Page.Title>Обзор</Page.Title>
186
+ <Page.Description>Продажи и оплаты · на 8 октября, 9:40</Page.Description>
187
+ </Page.Heading>
188
+ </Page.Header>
189
+ <Page.Body>
190
+ {/* One board: every tile of the screen in one grid, 16 apart on both axes. */}
191
+ <Page.Grid>
192
+ {KPIS[period].map((kpi) => (
193
+ <Page.Cell key={kpi.label} span={3}>
194
+ {/* Another period is another set of values: the tile cross-fades instead of flipping. */}
195
+ <Crossfade state={period}>
196
+ <Card.Root variant="stat-trend">
197
+ <Card.Label>{kpi.label}</Card.Label>
198
+ <Card.Value>{kpi.value}</Card.Value>
199
+ <Card.Delta tone={kpi.tone}>{kpi.delta}</Card.Delta>
200
+ </Card.Root>
201
+ </Crossfade>
202
+ </Page.Cell>
203
+ ))}
195
204
 
196
- <PageContent.Root>
197
- <PageContent.Body>
198
- {/* One board: every tile of the screen in one grid, 16 apart on both axes. */}
199
- <PageContent.Grid>
200
- {KPIS[period].map((kpi) => (
201
- <PageContent.Cell key={kpi.label} span={3}>
202
- {/* Another period is another set of values: the tile cross-fades instead of flipping. */}
203
- <Crossfade state={period}>
204
- <Card.Root variant="stat-trend">
205
- <Card.Label>{kpi.label}</Card.Label>
206
- <Card.Value>{kpi.value}</Card.Value>
207
- <Card.Delta tone={kpi.tone}>{kpi.delta}</Card.Delta>
208
- </Card.Root>
209
- </Crossfade>
210
- </PageContent.Cell>
211
- ))}
212
-
213
- <PageContent.Cell>
214
- <Card.Root variant="panel">
215
- <Card.Body>
216
- <Sparkline
217
- data={REVENUE[period]}
218
- label="Выручка по дням"
219
- summary="sum"
220
- formatValue={formatRubles}
221
- />
222
- </Card.Body>
223
- </Card.Root>
224
- </PageContent.Cell>
205
+ <Page.Cell>
206
+ <Card.Root variant="panel">
207
+ <Card.Body>
208
+ <Sparkline
209
+ data={REVENUE[period]}
210
+ label="Выручка по дням"
211
+ summary="sum"
212
+ formatValue={formatRubles}
213
+ />
214
+ </Card.Body>
215
+ </Card.Root>
216
+ </Page.Cell>
225
217
 
226
- {/* The chart spans two rows beside the two panels and fills their height. */}
227
- <PageContent.Cell span={8} rows={2}>
228
- <ChartFrame.Root
229
- series={BILLING_SERIES}
230
- formatValue={formatMillionsShort}
231
- rows={BILLING[period].map((row) => ({
232
- label: row.label,
233
- values: { invoiced: row.invoiced, paid: row.paid },
234
- }))}
235
- >
236
- <ChartFrame.Header>
237
- <ChartFrame.Title as="h2">Выставлено и оплачено</ChartFrame.Title>
238
- <ChartFrame.Description>Счета за период, млн ₽</ChartFrame.Description>
239
- </ChartFrame.Header>
240
- <ChartFrame.Plot
241
- height="fill"
242
- renderPlot={({ width, height, series }) => {
243
- const rows = BILLING[period];
244
- const top = Math.ceil(Math.max(...rows.map((row) => row.invoiced)));
245
- const innerH = height - BILLING_MARGIN.top - BILLING_MARGIN.bottom;
246
- const band = (width - BILLING_MARGIN.left) / rows.length;
247
- const bar = Math.min(28, (band - 16) / series.length);
248
- const y = (value: number) => BILLING_MARGIN.top + innerH * (1 - value / top);
249
- return (
250
- <svg width={width} height={height} aria-hidden="true">
251
- {[0, top / 2, top].map((tick) => (
252
- <g key={tick}>
253
- <line
254
- x1={BILLING_MARGIN.left}
255
- x2={width}
256
- y1={y(tick)}
257
- y2={y(tick)}
258
- stroke={tick === 0 ? chartColors.axis : chartColors.grid}
259
- />
260
- <text
261
- x={BILLING_MARGIN.left - 8}
262
- y={y(tick)}
263
- textAnchor="end"
264
- dominantBaseline="middle"
265
- >
266
- {tick.toLocaleString("ru-RU")}
218
+ {/* The chart spans two rows beside the two panels and fills their height. */}
219
+ <Page.Cell span={8} rows={2}>
220
+ <ChartFrame.Root
221
+ series={BILLING_SERIES}
222
+ formatValue={formatMillionsShort}
223
+ rows={BILLING[period].map((row) => ({
224
+ label: row.label,
225
+ values: { invoiced: row.invoiced, paid: row.paid },
226
+ }))}
227
+ >
228
+ <ChartFrame.Header>
229
+ <ChartFrame.Title as="h2">Выставлено и оплачено</ChartFrame.Title>
230
+ <ChartFrame.Description>Счета за период, млн ₽</ChartFrame.Description>
231
+ </ChartFrame.Header>
232
+ <ChartFrame.Plot
233
+ height="fill"
234
+ renderPlot={({ width, height, series }) => {
235
+ const rows = BILLING[period];
236
+ const top = Math.ceil(Math.max(...rows.map((row) => row.invoiced)));
237
+ const innerH = height - BILLING_MARGIN.top - BILLING_MARGIN.bottom;
238
+ const band = (width - BILLING_MARGIN.left) / rows.length;
239
+ const bar = Math.min(28, (band - 16) / series.length);
240
+ const y = (value: number) => BILLING_MARGIN.top + innerH * (1 - value / top);
241
+ return (
242
+ <svg width={width} height={height} aria-hidden="true">
243
+ {[0, top / 2, top].map((tick) => (
244
+ <g key={tick}>
245
+ <line
246
+ x1={BILLING_MARGIN.left}
247
+ x2={width}
248
+ y1={y(tick)}
249
+ y2={y(tick)}
250
+ stroke={tick === 0 ? chartColors.axis : chartColors.grid}
251
+ />
252
+ <text
253
+ x={BILLING_MARGIN.left - 8}
254
+ y={y(tick)}
255
+ textAnchor="end"
256
+ dominantBaseline="middle"
257
+ >
258
+ {tick.toLocaleString("ru-RU")}
259
+ </text>
260
+ </g>
261
+ ))}
262
+ {rows.map((row, i) => {
263
+ const center = BILLING_MARGIN.left + band * i + band / 2;
264
+ return (
265
+ <g key={row.label}>
266
+ {series.map((s, j) => {
267
+ const value = s.id === "paid" ? row.paid : row.invoiced;
268
+ return (
269
+ <rect
270
+ key={s.id}
271
+ data-hidden={s.hidden}
272
+ x={center - (bar * series.length) / 2 + bar * j}
273
+ y={y(value)}
274
+ width={bar - 2}
275
+ height={y(0) - y(value)}
276
+ rx={2}
277
+ fill={s.color}
278
+ />
279
+ );
280
+ })}
281
+ <text x={center} y={height - 4} textAnchor="middle">
282
+ {row.label}
267
283
  </text>
268
284
  </g>
269
- ))}
270
- {rows.map((row, i) => {
271
- const center = BILLING_MARGIN.left + band * i + band / 2;
272
- return (
273
- <g key={row.label}>
274
- {series.map((s, j) => {
275
- const value = s.id === "paid" ? row.paid : row.invoiced;
276
- return (
277
- <rect
278
- key={s.id}
279
- data-hidden={s.hidden}
280
- x={center - (bar * series.length) / 2 + bar * j}
281
- y={y(value)}
282
- width={bar - 2}
283
- height={y(0) - y(value)}
284
- rx={2}
285
- fill={s.color}
286
- />
287
- );
288
- })}
289
- <text x={center} y={height - 4} textAnchor="middle">
290
- {row.label}
291
- </text>
292
- </g>
293
- );
294
- })}
295
- </svg>
296
- );
297
- }}
298
- />
299
- <ChartFrame.Legend />
300
- </ChartFrame.Root>
301
- </PageContent.Cell>
285
+ );
286
+ })}
287
+ </svg>
288
+ );
289
+ }}
290
+ />
291
+ <ChartFrame.Legend />
292
+ </ChartFrame.Root>
293
+ </Page.Cell>
302
294
 
303
- <PageContent.Cell span={4}>
304
- <Card.Root variant="panel">
305
- <Card.Header>
306
- <Card.Title as="h2">План продаж</Card.Title>
307
- <Typography as="span" variant="caption" tone="muted">
308
- Октябрь
309
- </Typography>
310
- </Card.Header>
311
- <Card.Body>
312
- <div className={styles.bars}>
313
- {PLAN.map((row) => (
314
- <ProgressBar
315
- key={row.manager}
316
- value={row.value}
317
- label={row.manager}
318
- tone={row.value < 50 ? "warning" : "accent"}
319
- showValue
320
- />
321
- ))}
322
- </div>
323
- </Card.Body>
324
- </Card.Root>
325
- </PageContent.Cell>
295
+ <Page.Cell span={4}>
296
+ <Card.Root variant="panel">
297
+ <Card.Header>
298
+ <Card.Title as="h2">План продаж</Card.Title>
299
+ <Typography as="span" variant="caption" tone="muted">
300
+ Октябрь
301
+ </Typography>
302
+ </Card.Header>
303
+ <Card.Body>
304
+ <div className={styles.bars}>
305
+ {PLAN.map((row) => (
306
+ <ProgressBar
307
+ key={row.manager}
308
+ value={row.value}
309
+ label={row.manager}
310
+ tone={row.value < 50 ? "warning" : "accent"}
311
+ showValue
312
+ />
313
+ ))}
314
+ </div>
315
+ </Card.Body>
316
+ </Card.Root>
317
+ </Page.Cell>
326
318
 
327
- <PageContent.Cell span={4}>
328
- <Card.Root variant="panel">
329
- <Card.Header>
330
- <Card.Title as="h2">Дебиторка</Card.Title>
331
- <Typography as="span" variant="caption" tone="muted">
332
- 8,2 млн ₽
333
- </Typography>
334
- </Card.Header>
335
- <Card.Body>
336
- <ProgressBar
337
- segments={RECEIVABLES}
338
- label="По сроку оплаты"
339
- legend
340
- formatValue={formatMillions}
341
- />
342
- </Card.Body>
343
- </Card.Root>
344
- </PageContent.Cell>
345
- </PageContent.Grid>
319
+ <Page.Cell span={4}>
320
+ <Card.Root variant="panel">
321
+ <Card.Header>
322
+ <Card.Title as="h2">Дебиторка</Card.Title>
323
+ <Typography as="span" variant="caption" tone="muted">
324
+ 8,2 млн ₽
325
+ </Typography>
326
+ </Card.Header>
327
+ <Card.Body>
328
+ <ProgressBar
329
+ segments={RECEIVABLES}
330
+ label="По сроку оплаты"
331
+ legend
332
+ formatValue={formatMillions}
333
+ />
334
+ </Card.Body>
335
+ </Card.Root>
336
+ </Page.Cell>
337
+ </Page.Grid>
346
338
 
347
- {/* A new topic: a titled section, set off by more air than the tiles. */}
348
- <PageContent.Section label="Последние оплаты">
349
- <PageContent.Actions>
350
- <LinkButton href="#invoices">Все счета</LinkButton>
351
- </PageContent.Actions>
352
- <DataTable
353
- columns={COLUMNS}
354
- rows={PAYMENTS}
355
- getRowKey={(row) => row.id}
356
- paging="none"
357
- />
358
- </PageContent.Section>
359
- </PageContent.Body>
360
- </PageContent.Root>
361
- </>
339
+ {/* A new topic: a titled section, set off by more air than the tiles. */}
340
+ <Page.Section label="Последние оплаты">
341
+ <Page.Actions>
342
+ <LinkButton href="#invoices">Все счета</LinkButton>
343
+ </Page.Actions>
344
+ <DataTable columns={COLUMNS} rows={PAYMENTS} getRowKey={(row) => row.id} paging="none" />
345
+ </Page.Section>
346
+ </Page.Body>
347
+ </Page.Root>
362
348
  );
363
349
  }
@@ -0,0 +1,59 @@
1
+ /** A KPI tile while its report loads next to the loaded one, in the `stat-trend` and `mini` templates — `loading`. */
2
+ import { Card, Icon, Typography } from "prime-ui-kit";
3
+
4
+ export default function CardStatesExample() {
5
+ return (
6
+ <>
7
+ <div>
8
+ <div>
9
+ <Card.Root variant="stat-trend" loading>
10
+ <Card.Label>Выручка за месяц</Card.Label>
11
+ <Card.Value />
12
+ <Card.Delta />
13
+ <Card.Meta />
14
+ </Card.Root>
15
+ <Typography as="span" variant="caption" tone="muted">
16
+ stat-trend · loading
17
+ </Typography>
18
+ </div>
19
+ <div>
20
+ <Card.Root variant="stat-trend">
21
+ <Card.Label>Выручка за месяц</Card.Label>
22
+ <Card.Value>4,2 млн ₽</Card.Value>
23
+ <Card.Delta tone="success">+18% к сентябрю</Card.Delta>
24
+ <Card.Meta>Лидов 1 240 · сделок 186</Card.Meta>
25
+ </Card.Root>
26
+ <Typography as="span" variant="caption" tone="muted">
27
+ stat-trend
28
+ </Typography>
29
+ </div>
30
+ </div>
31
+ <div>
32
+ <div>
33
+ <Card.Root variant="mini" loading>
34
+ <Card.Icon>
35
+ <Icon name="object.users" />
36
+ </Card.Icon>
37
+ <Card.Label>Активные сессии</Card.Label>
38
+ <Card.Value />
39
+ </Card.Root>
40
+ <Typography as="span" variant="caption" tone="muted">
41
+ mini · loading
42
+ </Typography>
43
+ </div>
44
+ <div>
45
+ <Card.Root variant="mini">
46
+ <Card.Icon>
47
+ <Icon name="object.users" />
48
+ </Card.Icon>
49
+ <Card.Label>Активные сессии</Card.Label>
50
+ <Card.Value>1 248</Card.Value>
51
+ </Card.Root>
52
+ <Typography as="span" variant="caption" tone="muted">
53
+ mini
54
+ </Typography>
55
+ </div>
56
+ </div>
57
+ </>
58
+ );
59
+ }
@@ -105,7 +105,7 @@ ChartFrame.Root <figure>; surface of the depth ladder; state, serie
105
105
 
106
106
  | Prop | Type | Default | Description |
107
107
  |---|---|---|---|
108
- | `height` | `number \| "fill"` | `240`, `160` under `30rem` | Height of the plot area in px. `fill` takes the free height of a stretched panel (a `PageContent.Cell` with `rows`), the default height at least. |
108
+ | `height` | `number \| "fill"` | `240`, `160` under `30rem` | Height of the plot area in px. `fill` takes the free height of a stretched panel (a `Page.Cell` with `rows`), the default height at least. |
109
109
  | `renderPlot` | `(area: ChartFramePlotArea) => ReactNode` | — | Renders the chart at the measured `{ width, height }` with every series `{ id, label, color, hidden }` — for libraries that need explicit sizes (Chart.js, visx). |
110
110
  | `children` | `ReactNode` | — | A chart that sizes itself to its container (an SVG with a `viewBox`, `ResponsiveContainer`); it fills the area. |
111
111
  | `…rest` | `HTMLAttributes<HTMLDivElement>` | — | `className` and the other div attributes. |
@@ -1,5 +1,5 @@
1
1
  /** Revenue against the plan beside two KPI tiles: the plot takes the height of the stretched grid cell, and the plan line starts hidden until the legend turns it on — `height`, `defaultHiddenSeries`. */
2
- import { Card, ChartFrame, type ChartFrameSeries, chartColors, PageContent } from "prime-ui-kit";
2
+ import { Card, ChartFrame, type ChartFrameSeries, chartColors, Page } from "prime-ui-kit";
3
3
 
4
4
  const SERIES: ChartFrameSeries[] = [
5
5
  { id: "fact", label: "Факт" },
@@ -22,9 +22,9 @@ const formatMillions = (value: number) => `${value.toLocaleString("ru-RU")} мл
22
22
 
23
23
  export default function ChartFrameFillHeightExample() {
24
24
  return (
25
- <PageContent.Grid>
25
+ <Page.Grid>
26
26
  {/* The cell spans two rows beside the tiles; `height="fill"` takes all of it. */}
27
- <PageContent.Cell span={8} rows={2}>
27
+ <Page.Cell span={8} rows={2}>
28
28
  <ChartFrame.Root
29
29
  series={SERIES}
30
30
  defaultHiddenSeries={["plan"]}
@@ -95,23 +95,23 @@ export default function ChartFrameFillHeightExample() {
95
95
  />
96
96
  <ChartFrame.Legend />
97
97
  </ChartFrame.Root>
98
- </PageContent.Cell>
98
+ </Page.Cell>
99
99
 
100
- <PageContent.Cell span={4}>
100
+ <Page.Cell span={4}>
101
101
  <Card.Root variant="stat-trend">
102
102
  <Card.Label>Выполнение плана</Card.Label>
103
103
  <Card.Value>96%</Card.Value>
104
104
  <Card.Delta tone="warning">−4 п. п. за октябрь</Card.Delta>
105
105
  </Card.Root>
106
- </PageContent.Cell>
106
+ </Page.Cell>
107
107
 
108
- <PageContent.Cell span={4}>
108
+ <Page.Cell span={4}>
109
109
  <Card.Root variant="stat-trend">
110
110
  <Card.Label>Прогноз на год</Card.Label>
111
111
  <Card.Value>84 млн ₽</Card.Value>
112
112
  <Card.Delta>План — 86 млн ₽</Card.Delta>
113
113
  </Card.Root>
114
- </PageContent.Cell>
115
- </PageContent.Grid>
114
+ </Page.Cell>
115
+ </Page.Grid>
116
116
  );
117
117
  }