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
@@ -3,16 +3,16 @@
3
3
  **Category:** page
4
4
  **Kind:** layout
5
5
 
6
- > The app frame: a content panel that is the page itself and a navigation rail one layer above it.
6
+ > The app frame — navigation and the page: a content panel that is the page itself and a navigation rail one layer above it.
7
7
 
8
8
  ## When to use
9
- - The root layout of an application: navigation column, an optional AppHeader, scrolling main column, a bottom bar for phone navigation.
9
+ - The root layout of an application: navigation column, the scrolling main where the page renders, a bottom bar for phone navigation.
10
10
  - Any page that needs the kit's responsive gutters and the surface ladder for cards and fields.
11
11
 
12
12
  ## When not to use
13
13
  - The navigation itself → use [Sidebar](../sidebar/COMPONENT.md) inside `AppShell.Nav`, [BottomNav](../bottom-nav/COMPONENT.md) inside `AppShell.Footer`.
14
- - The page's top bar (the page title, its tools, the menu button) → use [AppHeader](../app-header/COMPONENT.md) anywhere in the shell: it renders in the shell's header row.
15
- - Page heading, actions and sections inside main → use [PageContent](../../components/page-content/COMPONENT.md).
14
+ - Anything at the top of the page — the title, its actions and tools, the phone menu button → the page's own top bar, [Page](../page/COMPONENT.md) `Page.TopBar`; the shell has no header.
15
+ - Page heading, actions and sections inside main → use [Page](../page/COMPONENT.md).
16
16
  - A temporary side panel over the page → use [Drawer](../../components/drawer/COMPONENT.md).
17
17
  - A scroll region inside a page → use [ScrollContainer](../../components/scroll-container/COMPONENT.md).
18
18
 
@@ -25,25 +25,24 @@ import { AppShell } from "prime-ui-kit";
25
25
  ```
26
26
  AppShell.Root grid: nav column | content panel (the page, layer 0)
27
27
  ├─ AppShell.Nav navigation column (usually Sidebar.Root, a surface one layer above the page)
28
- ├─ (header row) the panel's top: the latest AppHeader.Root in the shell renders here
29
- ├─ AppShell.Main <main>, scrolls, carries the gutters
28
+ ├─ AppShell.Main <main>, scrolls; hands the page (Page.Root) its gutters and top air
30
29
  └─ AppShell.Footer sticky bottom bar of the panel (usually BottomNav.Root)
31
- AppShell.Template Root + Nav + the header + Main + Footer in one component
30
+ AppShell.Template Root + Nav + Main + Footer in one component
32
31
  useAppShellNav() the navigation the Sidebar publishes, for triggers outside the rail
33
32
  ```
34
- Every child of Root that is not `AppShell.Nav` is placed into the content panel. An `AppHeader.Root` anywhere in the shell — a child of Root, `Template.header`, a page's own one in main — renders in the header row; the latest one on screen wins, so a page's header replaces the default while that page is shown.
33
+ Every child of Root that is not `AppShell.Nav` is placed into the content panel. Everything at the top of the panel belongs to the page: its `Page.TopBar` sticks to the top of main.
35
34
 
36
35
  ## API
37
36
 
38
37
  <!-- Generated from api.ts by `bun run docs:build`. Edit api.ts, not this section. -->
39
38
 
40
39
  ### AppShell.Root
41
- `ref` → `HTMLDivElement`. Grid of the nav column and the content panel (the page itself); every child but `AppShell.Nav` goes into the panel. Owns the navigation its Sidebar publishes (`useAppShellNav`) and the header row an `AppHeader.Root` anywhere in it renders in.
40
+ `ref` → `HTMLDivElement`. Grid of the nav column and the content panel (the page itself); every child but `AppShell.Nav` goes into the panel. Owns the navigation its Sidebar publishes (`useAppShellNav`).
42
41
 
43
42
  | Prop | Type | Default | Description |
44
43
  |---|---|---|---|
45
44
  | `fillViewport` | `boolean` | `false` | The shell is exactly the viewport high and only `AppShell.Main` scrolls; otherwise the document scrolls and the nav is sticky. |
46
- | `…rest` | `HTMLAttributes<HTMLDivElement>` | — | `children` (Nav, `AppHeader.Root`, Main, Footer), `className` and the other div attributes. |
45
+ | `…rest` | `HTMLAttributes<HTMLDivElement>` | — | `children` (Nav, Main, Footer), `className` and the other div attributes. |
47
46
 
48
47
  ### AppShell.Nav
49
48
  `ref` → `HTMLDivElement`. The navigation column slot (not a landmark: Sidebar renders the `<nav>`).
@@ -53,11 +52,10 @@ Every child of Root that is not `AppShell.Nav` is placed into the content panel.
53
52
  | `…rest` | `HTMLAttributes<HTMLDivElement>` | — | `children` (usually `Sidebar.Root`), `className` and the other div attributes. |
54
53
 
55
54
  ### AppShell.Main
56
- `ref` → `HTMLElement`. The `<main>` with the canonical gutters: a vertical `ScrollContainer`.
55
+ `ref` → `HTMLElement`. The `<main>` where the page renders: a vertical `ScrollContainer` that hands `Page.Root` the gutters and top air (`--page-gutter`, `--page-top`).
57
56
 
58
57
  | Prop | Type | Default | Description |
59
58
  |---|---|---|---|
60
- | `contentWidth` | `"contained" \| "full"` | `"full"` | `full` — the whole panel with gutters; `contained` — a centred column up to `--prime-layout-content-max-width`. |
61
59
  | `…rest` | `HTMLAttributes<HTMLElement>` | — | `children`, `className` and the other attributes. |
62
60
 
63
61
  ### AppShell.Footer
@@ -68,17 +66,16 @@ Every child of Root that is not `AppShell.Nav` is placed into the content panel.
68
66
  | `…rest` | `HTMLAttributes<HTMLDivElement>` | — | `children` (usually `BottomNav.Root`), `className` and the other div attributes. |
69
67
 
70
68
  ### AppShell.Template
71
- `ref` → the `<main>`. Root + Nav + the header + Main + Footer in one; main scrolls to the top when `scrollResetKey` changes.
69
+ `ref` → the `<main>`. Root + Nav + Main + Footer in one; main scrolls to the top when `scrollResetKey` changes.
72
70
 
73
71
  | Prop | Type | Default | Description |
74
72
  |---|---|---|---|
75
73
  | `fillViewport` | `boolean` | `false` | As on `AppShell.Root`: only `<main>` scrolls. |
76
74
  | `nav` | `ReactNode` | — | Navigation column content; without it the panel takes the full width. |
77
- | `header` | `ReactNode` | — | The default header row, an `AppHeader.Root`: a page that renders its own header replaces it while that page is on screen. |
78
75
  | `footer` | `ReactNode` | — | Footer content (`BottomNav`); no footer when omitted. |
79
- | `mainProps` | `Omit<AppShellMainProps, "children">` | — | Props for Main (e.g. `contentWidth`). |
76
+ | `mainProps` | `Omit<AppShellMainProps, "children">` | — | Props for Main (`id`, `tabIndex` for a skip link). |
80
77
  | `scrollResetKey` | `unknown` | — | Main scrolls back to the top whenever this value changes; pass the router pathname. |
81
- | `children` | `ReactNode` | — | Page content inside Main. |
78
+ | `children` | `ReactNode` | — | The page inside Main (`Page.Root`). |
82
79
  | `…rest` | `Omit<AppShellRootProps, "children">` | — | Root props: `fillViewport`, `className` and the div attributes. |
83
80
 
84
81
  ### Types
@@ -108,38 +105,29 @@ The navigation of the nearest `AppShell.Root` for a trigger outside the rail (a
108
105
  | Value | Looks like | Use when | Default |
109
106
  |---|---|---|---|
110
107
  | `false` | Shell at least viewport high; the document scrolls; nav sticks to the top | Content sites, simple apps | yes |
111
- | `true` | Shell exactly viewport high; only Main scrolls; header and nav stay put | Dense apps with a fixed frame | |
112
-
113
- ### contentWidth (Main)
114
- | Value | Looks like | Use when | Default |
115
- |---|---|---|---|
116
- | `full` | Content spans the panel with responsive gutters | Tables, dashboards | yes |
117
- | `contained` | Centred column up to the content max width | Long-read pages | |
108
+ | `true` | Shell exactly viewport high; only Main scrolls; nav and the page's sticky top bar stay put | Dense apps with a fixed frame | |
118
109
 
119
110
  ### Structure
120
111
  | Value | Looks like | Use when | Default |
121
112
  |---|---|---|---|
122
113
  | with `AppShell.Nav` | Two columns: a rail one layer above the page + the panel that is the page | Apps with navigation | |
123
114
  | without Nav | Panel takes the full width | Single-page tools, auth screens | |
124
- | with `AppHeader.Root` | Sticky bar in the header row at the top of the panel, from anywhere in the shell | The page title (or the path and the record), the page's tools and buttons; on a phone it leads with the menu button | |
125
115
  | with `AppShell.Footer` | Sticky bar at the bottom of the panel, shown while no navigation column is on screen | BottomNav on a phone | |
126
116
 
127
- `AppShell.Template` with `nav={<Sidebar.Root …/>}` and `PageContent` inside is the standard app; `contentWidth="contained"` + `PageContent.Root maxWidth="readable"` for docs and articles.
117
+ `AppShell.Template` with `nav={<Sidebar.Root …/>}` and a `Page.Root` inside is the standard app; `Page.Root maxWidth="readable"` for docs and articles.
128
118
 
129
119
  ## States
130
120
  | State | Driven by | DOM |
131
121
  |---|---|---|
132
122
  | fixed frame | `fillViewport` | `data-fill-viewport="true"` on Root |
133
123
  | navigation column | an `AppShell.Nav` child | `data-nav="true"` on Root (two grid columns) |
134
- | content width | `contentWidth` | `data-content-width` on Main |
135
124
  | off-canvas navigation | the Sidebar publishes that it is an off-canvas panel (`offCanvas="auto"` on a phone, `"always"`) | `data-off-canvas="true"` on Root; `useAppShellNav()` reports `offCanvas`, `open`, `navId` |
136
125
  | footer bar | the navigation column: `AppShell.Nav` with a Sidebar that is not off-canvas | the footer is `display: none` while the rail is on screen; without Nav or with an off-canvas Sidebar it stays at any width |
137
- | header row | an `AppHeader.Root` in the shell | the latest one on screen renders at the top of the panel, before main |
138
126
 
139
127
  ## Layout & spacing
140
128
  - Two full-height planes edge to edge: no inset, radius, shadow or border — the boundary is the fill change (the Sidebar rail is layer 1, the panel the page: white rail beside a gray page in light, a rail one step lighter than the near-black page in dark).
141
- - Gutters in Main (and in the header row): the page gutter `--prime-layout-gutter` — `--prime-layout-gutter-s` (16) → `-m` (24) from 640px → `-l` (32) from 1024px. Main top padding `--prime-space-6` (24) → `--prime-space-8` (32) from 1024px; bottom `--prime-space-16`. Inside Main the page gutter is the small one again, so a frame nested in the page starts from its own gutter, not the shell's.
142
- - A page that fills the panel height (`PageContent.Root fill`): Main's bottom padding drops to the side gutter, so no long scroll tail stays under it.
129
+ - Main hands the page its edge air: `--page-gutter` is the page gutter `--prime-layout-gutter` — `--prime-layout-gutter-s` (16) → `-m` (24) from 640px → `-l` (32) from 1024px; `--page-top` is `--prime-space-6` (24) → `--prime-space-8` (32) from 1024px. `Page.Root` pads itself with them (its top bar steps out to the panel's edges). Main itself pads only the bottom: `--prime-space-16`, the scroll tail of a long page. Inside Main the page gutter is the small one again, so a frame nested in the page starts from its own gutter, not the shell's.
130
+ - A page that fills the panel height (`Page.Root fill`): Main's bottom padding drops to the side gutter, so no long scroll tail stays under it — beside the Sidebar rail too.
143
131
  - Main scrolls with `overscroll-behavior: contain`, so its scroll never chains to the document.
144
132
  - Nav column: sticky at the top, viewport high, `z-index: --prime-z-sticky` (above the panel, so the compact Sidebar toggle can ride the rail edge); with `fillViewport` it fills the shell height instead.
145
133
  - Footer: no padding of its own (BottomNav keeps the bottom safe-area inset), sticky at the bottom, `z-index: --prime-z-sticky`.
@@ -156,8 +144,8 @@ No keyboard interaction.
156
144
  ### ARIA
157
145
  <!-- Generated from api.ts by `bun run docs:build`. Edit api.ts, not this section. -->
158
146
 
159
- - Main is the `<main>` landmark; the banner comes from AppHeader (`<header>`), the navigation landmarks from Sidebar and BottomNav (`<nav>`).
160
- - One `<h1>` per page: `AppHeader.Title` on app pages, `PageContent.Title` on a document page (whose header then has no title).
147
+ - Main is the `<main>` landmark; the navigation landmarks come from Sidebar and BottomNav (`<nav>`). The page's top bar is a `<header>` inside main, not a banner.
148
+ - One `<h1>` per page: its `Page.Title`, in the top bar or in the flow.
161
149
 
162
150
  ### Labels
163
151
  <!-- Generated from api.ts by `bun run docs:build`. Edit api.ts, not this section. -->
@@ -167,21 +155,20 @@ No `labels`.
167
155
  ## Examples
168
156
  | Example | Shows |
169
157
  |---|---|
170
- | [overview.tsx](examples/overview.tsx) | The app frame: Sidebar in the nav column, the page title and its action in the AppHeader, the page in main; only main scrolls — `fillViewport`. |
171
- | [contained.tsx](examples/contained.tsx) | A shell without navigation whose main column is centred and capped for long reads — `contentWidth`. |
158
+ | [overview.tsx](examples/overview.tsx) | The app frame: Sidebar in the nav column, the page in main with its title and action in its top bar; only main scrolls — `fillViewport`. |
172
159
  | [footer.tsx](examples/footer.tsx) | A phone app without a Sidebar: the bar in the footer stays at the bottom while main scrolls under it — `AppShell.Footer`. |
173
- | [template.tsx](examples/template.tsx) | Root, nav, header and main in one component; main scrolls back to the top whenever the page changes — `AppShell.Template`, `scrollResetKey`. |
174
- | [screen.tsx](examples/screen.tsx) | The app frame for desktop and phone: the Sidebar rail on a wide screen, the floating BottomNav in the footer on a phone whose More item opens the Sidebar, the AppHeader with the menu button it draws by itself, the page title with a line of data, and a simple home page that swaps with the current section — `fillViewport`, `scrollResetKey`, `useAppShellNav`. |
160
+ | [template.tsx](examples/template.tsx) | Root, nav, main and footer in one component; main scrolls back to the top whenever the page changes — `AppShell.Template`, `scrollResetKey`. |
161
+ | [screen.tsx](examples/screen.tsx) | The app frame for desktop and phone: the Sidebar rail on a wide screen, the floating BottomNav in the footer on a phone whose More item opens the Sidebar, the page top bar with the menu button it draws by itself, the page title with a line of data, and a simple home page that swaps with the current section — `fillViewport`, `scrollResetKey`, `useAppShellNav`. |
175
162
 
176
163
  ## Mistakes
177
- - Adding padding around the page content → Main already has the gutters.
164
+ - Adding padding around the page content → `Page.Root` takes the gutters Main hands it.
178
165
  - Wrapping Main content in another scroll container → Main scrolls (with `fillViewport`) or the document does.
179
166
  - A border or shadow between nav and panel → the fill change is the boundary.
180
167
  - Putting the Sidebar directly in Root without `AppShell.Nav` → it lands inside the content panel.
181
168
  - BottomNav anywhere but `AppShell.Footer` → it stays next to the Sidebar rail on a desktop; the footer is what leaves while the rail is on screen.
182
169
  - `AppShell.Template` in a router app without `scrollResetKey` → a new page opens at the old scroll position; pass the pathname.
183
- - A hand-wired menu state shared by the Sidebar, a menu button and a BottomNav «Ещё» → the Sidebar publishes it to the shell: the AppHeader draws the menu button, other triggers read `useAppShellNav()`.
170
+ - A hand-wired menu state shared by the Sidebar, a menu button and a BottomNav «Ещё» → the Sidebar publishes it to the shell: the page's `Page.TopBar` draws the menu button, other triggers read `useAppShellNav()`.
184
171
 
185
172
  ## Related
186
173
  - **Built from:** [ScrollContainer](../../components/scroll-container/COMPONENT.md)
187
- - **See also:** [AppHeader](../app-header/COMPONENT.md), [Sidebar](../sidebar/COMPONENT.md), [BottomNav](../bottom-nav/COMPONENT.md), [PageContent](../../components/page-content/COMPONENT.md), [Breadcrumb](../../components/breadcrumb/COMPONENT.md)
174
+ - **See also:** [Page](../page/COMPONENT.md), [Sidebar](../sidebar/COMPONENT.md), [BottomNav](../bottom-nav/COMPONENT.md), [Breadcrumb](../../components/breadcrumb/COMPONENT.md)
@@ -1,5 +1,5 @@
1
1
  /** A phone app without a Sidebar: the bar in the footer stays at the bottom while main scrolls under it — `AppShell.Footer`. */
2
- import { AppHeader, AppShell, BottomNav, Icon, PageContent, Typography } from "prime-ui-kit";
2
+ import { AppShell, BottomNav, Icon, Page, Typography } from "prime-ui-kit";
3
3
 
4
4
  import styles from "./examples.module.css";
5
5
 
@@ -25,21 +25,21 @@ export default function AppShellFooterExample() {
25
25
  return (
26
26
  <div className={styles.phone}>
27
27
  <AppShell.Root fillViewport className={styles.shell}>
28
- <AppHeader.Root>
29
- <AppHeader.Start>
30
- <AppHeader.Title>Счета</AppHeader.Title>
31
- </AppHeader.Start>
32
- </AppHeader.Root>
33
28
  <AppShell.Main>
34
- <PageContent.Root as="section">
35
- <PageContent.Body>
29
+ <Page.Root>
30
+ <Page.TopBar>
31
+ <Page.Heading>
32
+ <Page.Title>Счета</Page.Title>
33
+ </Page.Heading>
34
+ </Page.TopBar>
35
+ <Page.Body>
36
36
  {INVOICES.map((invoice) => (
37
37
  <Typography key={invoice} variant="body-m">
38
38
  {invoice}
39
39
  </Typography>
40
40
  ))}
41
- </PageContent.Body>
42
- </PageContent.Root>
41
+ </Page.Body>
42
+ </Page.Root>
43
43
  </AppShell.Main>
44
44
  <AppShell.Footer>
45
45
  <BottomNav.Root>
@@ -1,5 +1,5 @@
1
- /** The app frame: Sidebar in the nav column, the page title and its action in the AppHeader, the page in main; only main scrolls — `fillViewport`. */
2
- import { AppHeader, AppShell, Button, Icon, PageContent, Sidebar, Typography } from "prime-ui-kit";
1
+ /** The app frame: Sidebar in the nav column, the page in main with its title and action in its top bar; only main scrolls — `fillViewport`. */
2
+ import { AppShell, Button, Icon, Page, Sidebar, Typography } from "prime-ui-kit";
3
3
 
4
4
  import styles from "./examples.module.css";
5
5
 
@@ -35,30 +35,28 @@ export default function AppShellOverviewExample() {
35
35
  </Sidebar.Content>
36
36
  </Sidebar.Root>
37
37
  </AppShell.Nav>
38
- <AppHeader.Root>
39
- <AppHeader.Start>
40
- <AppHeader.Title>
41
- Обзор
42
- <AppHeader.Description>Октябрь · 37 сделок в работе</AppHeader.Description>
43
- </AppHeader.Title>
44
- </AppHeader.Start>
45
- <AppHeader.Actions>
46
- <Button.Root>
47
- <Button.Icon>
48
- <Icon name="action.add" />
49
- </Button.Icon>
50
- Новая сделка
51
- </Button.Root>
52
- </AppHeader.Actions>
53
- </AppHeader.Root>
54
38
  <AppShell.Main>
55
- <PageContent.Root as="section">
56
- <PageContent.Body>
39
+ <Page.Root>
40
+ <Page.TopBar>
41
+ <Page.Heading>
42
+ <Page.Title>Обзор</Page.Title>
43
+ <Page.Description>Октябрь · 37 сделок в работе</Page.Description>
44
+ </Page.Heading>
45
+ <Page.Actions>
46
+ <Button.Root>
47
+ <Button.Icon>
48
+ <Icon name="action.add" />
49
+ </Button.Icon>
50
+ Новая сделка
51
+ </Button.Root>
52
+ </Page.Actions>
53
+ </Page.TopBar>
54
+ <Page.Body>
57
55
  <Typography variant="body-m" tone="secondary">
58
56
  Выручка за месяц — 4,8 млн ₽, на 12% больше, чем в сентябре.
59
57
  </Typography>
60
- </PageContent.Body>
61
- </PageContent.Root>
58
+ </Page.Body>
59
+ </Page.Root>
62
60
  </AppShell.Main>
63
61
  </AppShell.Root>
64
62
  </div>
@@ -1,5 +1,5 @@
1
- /* App shell: the frame (Sidebar / BottomNav / AppHeader) lays itself out; this file only places the
2
- home page's blocks. The rhythm comes from PageContent.Body, the tiles from PageContent.Grid. */
1
+ /* App shell: the frame (Sidebar / BottomNav / the page's top bar) lays itself out; this file only
2
+ places the home page's blocks. The rhythm comes from Page.Body, the tiles from Page.Grid. */
3
3
 
4
4
  /* A list row: the text at the start, the meta (time, sum) at the end. */
5
5
  .row {
@@ -1,6 +1,5 @@
1
- /** The app frame for desktop and phone: the Sidebar rail on a wide screen, the floating BottomNav in the footer on a phone whose More item opens the Sidebar, the AppHeader with the menu button it draws by itself, the page title with a line of data, and a simple home page that swaps with the current section — `fillViewport`, `scrollResetKey`, `useAppShellNav`. */
1
+ /** The app frame for desktop and phone: the Sidebar rail on a wide screen, the floating BottomNav in the footer on a phone whose More item opens the Sidebar, the page top bar with the menu button it draws by itself, the page title with a line of data, and a simple home page that swaps with the current section — `fillViewport`, `scrollResetKey`, `useAppShellNav`. */
2
2
  import {
3
- AppHeader,
4
3
  AppShell,
5
4
  BottomNav,
6
5
  Card,
@@ -8,7 +7,7 @@ import {
8
7
  Crossfade,
9
8
  Icon,
10
9
  type IconName,
11
- PageContent,
10
+ Page,
12
11
  Sidebar,
13
12
  Typography,
14
13
  useAppShellNav,
@@ -168,22 +167,6 @@ export default function AppShellScreenExample() {
168
167
  <Sidebar.Footer>{MORE.map(sidebarItem)}</Sidebar.Footer>
169
168
  </Sidebar.Root>
170
169
  }
171
- header={
172
- <AppHeader.Root>
173
- {/* On a phone the header leads with the menu button that opens the Sidebar by itself. */}
174
- <AppHeader.Start>
175
- {/* Every page titles itself here: the only h1 and a line of data under it. */}
176
- <AppHeader.Title>
177
- {section.label}
178
- <AppHeader.Description>
179
- {current === "today"
180
- ? `Среда, 14 октября · открытых задач: ${openTasks}`
181
- : PAGES[current].description}
182
- </AppHeader.Description>
183
- </AppHeader.Title>
184
- </AppHeader.Start>
185
- </AppHeader.Root>
186
- }
187
170
  footer={
188
171
  <BottomNav.Root floating>
189
172
  {MAIN.map((item) => (
@@ -202,23 +185,35 @@ export default function AppShellScreenExample() {
202
185
  </BottomNav.Root>
203
186
  }
204
187
  >
205
- {/* Another section is another page: it cross-fades instead of flipping. */}
206
- <Crossfade state={current}>
207
- <PageContent.Root as="section">
208
- <PageContent.Body>
188
+ <Page.Root>
189
+ {/* On a phone the bar leads with the menu button that opens the Sidebar by itself. */}
190
+ <Page.TopBar>
191
+ {/* Every page titles itself here: the only h1 and a line of data under it. */}
192
+ <Page.Heading>
193
+ <Page.Title>{section.label}</Page.Title>
194
+ <Page.Description>
195
+ {current === "today"
196
+ ? `Среда, 14 октября · открытых задач: ${openTasks}`
197
+ : PAGES[current].description}
198
+ </Page.Description>
199
+ </Page.Heading>
200
+ </Page.TopBar>
201
+ {/* Another section is another page: it cross-fades instead of flipping. */}
202
+ <Crossfade state={current}>
203
+ <Page.Body>
209
204
  {current === "today" ? (
210
205
  <>
211
- <PageContent.Grid>
206
+ <Page.Grid>
212
207
  {KPIS.map((kpi) => (
213
- <PageContent.Cell key={kpi.label} span={4}>
208
+ <Page.Cell key={kpi.label} span={4}>
214
209
  <Card.Root variant="stat-trend">
215
210
  <Card.Label>{kpi.label}</Card.Label>
216
211
  <Card.Value>{kpi.value}</Card.Value>
217
212
  <Card.Delta tone={kpi.tone}>{kpi.delta}</Card.Delta>
218
213
  </Card.Root>
219
- </PageContent.Cell>
214
+ </Page.Cell>
220
215
  ))}
221
- </PageContent.Grid>
216
+ </Page.Grid>
222
217
  <Card.Root variant="list">
223
218
  <Card.Header>
224
219
  <Card.Title as="h2">Задачи на сегодня</Card.Title>
@@ -260,9 +255,9 @@ export default function AppShellScreenExample() {
260
255
  </Card.List>
261
256
  </Card.Root>
262
257
  )}
263
- </PageContent.Body>
264
- </PageContent.Root>
265
- </Crossfade>
258
+ </Page.Body>
259
+ </Crossfade>
260
+ </Page.Root>
266
261
  </AppShell.Template>
267
262
  );
268
263
  }
@@ -1,5 +1,5 @@
1
- /** Root, nav, header and main in one component; main scrolls back to the top whenever the page changes — `AppShell.Template`, `scrollResetKey`. */
2
- import { AppHeader, AppShell, Icon, PageContent, Sidebar, Typography } from "prime-ui-kit";
1
+ /** Root, nav, main and footer in one component; main scrolls back to the top whenever the page changes — `AppShell.Template`, `scrollResetKey`. */
2
+ import { AppShell, Icon, Page, Sidebar, Typography } from "prime-ui-kit";
3
3
  import * as React from "react";
4
4
 
5
5
  import styles from "./examples.module.css";
@@ -33,7 +33,7 @@ export default function AppShellTemplateExample() {
33
33
  className={styles.shell}
34
34
  scrollResetKey={pageId}
35
35
  nav={
36
- <Sidebar.Root offCanvas="never">
36
+ <Sidebar.Root>
37
37
  <Sidebar.Content>
38
38
  {PAGES.map((item) => (
39
39
  <Sidebar.Item
@@ -50,24 +50,20 @@ export default function AppShellTemplateExample() {
50
50
  </Sidebar.Content>
51
51
  </Sidebar.Root>
52
52
  }
53
- header={
54
- <AppHeader.Root>
55
- <AppHeader.Start>
56
- <AppHeader.Title>
57
- {page.label}
58
- <AppHeader.Description>{page.text}</AppHeader.Description>
59
- </AppHeader.Title>
60
- </AppHeader.Start>
61
- </AppHeader.Root>
62
- }
63
53
  >
64
- <PageContent.Root as="section">
65
- <PageContent.Body>
54
+ <Page.Root>
55
+ <Page.TopBar>
56
+ <Page.Heading>
57
+ <Page.Title>{page.label}</Page.Title>
58
+ <Page.Description>{page.text}</Page.Description>
59
+ </Page.Heading>
60
+ </Page.TopBar>
61
+ <Page.Body>
66
62
  <Typography variant="body-m" tone="secondary">
67
63
  {page.note}
68
64
  </Typography>
69
- </PageContent.Body>
70
- </PageContent.Root>
65
+ </Page.Body>
66
+ </Page.Root>
71
67
  </AppShell.Template>
72
68
  </div>
73
69
  );
@@ -12,7 +12,7 @@
12
12
  ## When not to use
13
13
  - More than six destinations or nested sections → use [Sidebar](../sidebar/COMPONENT.md) (off-canvas on a phone), put the rest under «Ещё».
14
14
  - Switching views inside one page → use [Tabs](../../components/tabs/COMPONENT.md) or [SegmentedControl](../../components/segmented-control/COMPONENT.md).
15
- - Several actions (create, filter, export) → use [Button](../../components/button/COMPONENT.md) in the page header; the bar holds at most one main action (`BottomNav.Action`).
15
+ - Several actions (create, filter, export) → use [Button](../../components/button/COMPONENT.md) in the page's top bar ([Page](../page/COMPONENT.md): `Page.Actions`); the bar holds at most one main action (`BottomNav.Action`).
16
16
 
17
17
  ## Import
18
18
  ```tsx
@@ -107,6 +107,7 @@ Without flags the bar is flat at the screen edge on the surface, with a faint to
107
107
  | State | Driven by | DOM |
108
108
  |---|---|---|
109
109
  | current | `current` or a router link setting `aria-current` | `aria-current="page"` on the item; flat, its glyph on a `fill-muted` pill |
110
+ | held | a `Page.Guard` that is `busy` or `dirty` on the page | a press on an item stops before it navigates (a router link included); `dirty` asks first, then repeats it |
110
111
  | pressed | pointer down | the glyph scales to `--prime-motion-press-scale-compact` (`internal/press`), flat and floating |
111
112
  | overflow | items wider than the bar | the items scroll inside the bar with faded edges; no label is cut |
112
113
  | focus | keyboard | focus ring inside the item edge |
@@ -162,14 +163,14 @@ Motion: the color of the icon and the label and the flat pill change over `fast`
162
163
  | [floating.tsx](examples/floating.tsx) | A glass capsule over the page across the width: the client list scrolls under its blur, the selection glides to a tapped section, with labels or icons alone — `floating`, `iconOnly`. |
163
164
  | [floating-action.tsx](examples/floating-action.tsx) | A round action beside the glass capsule for the screen's main action, with labels or icons alone — `BottomNav.Action`, `floating`. |
164
165
  | [router.tsx](examples/router.tsx) | A router link as the item: the router marks the open section and the item shows it as current; render it inside a router — `asChild`. |
165
- | [in-app-shell.tsx](examples/in-app-shell.tsx) | The app frame on a phone: the AppHeader, the page and the bar in the footer, which gives way to the Sidebar rail once one is on screen — `AppShell.Footer`. |
166
+ | [in-app-shell.tsx](examples/in-app-shell.tsx) | The app frame on a phone: the page with its top bar and the bar in the footer, which gives way to the Sidebar rail once one is on screen — `AppShell.Footer`. |
166
167
 
167
168
  ## Mistakes
168
169
  - Seven or more items → keep 2–6; the rest goes to a «Ещё» section or Sidebar.
169
170
  - Long labels («Управление заказами») → one word; a long label widens its column and the bar scrolls.
170
171
  - `iconOnly` with icons that need a caption to be understood → keep the labels.
171
172
  - A floating bar outside a positioned container → it sits at the bottom of the nearest positioned ancestor; put it in `AppShell.Footer`.
172
- - An action as an item («Создать» among the sections) → items navigate; put the screen's one main action in `BottomNav.Action` beside the bar, the rest in the page header.
173
+ - An action as an item («Создать» among the sections) → items navigate; put the screen's one main action in `BottomNav.Action` beside the bar, the rest in the page's top bar.
173
174
  - `BottomNav.Action` without `aria-label` → the button has no name; it is required.
174
175
  - The bar outside `AppShell.Footer` (in Main, Root or `position: fixed` on the page) → it never leaves and shows next to the Sidebar on a desktop; put it in `AppShell.Footer` (or the Template `footer` prop).
175
176
  - Hiding the bar with your own media query → the shell already hides the footer while the Sidebar rail is on screen.
@@ -1,14 +1,5 @@
1
1
  /** A round action beside the glass capsule for the screen's main action, with labels or icons alone — `BottomNav.Action`, `floating`. */
2
- import {
3
- AppHeader,
4
- AppShell,
5
- Avatar,
6
- BottomNav,
7
- Icon,
8
- PageContent,
9
- Switch,
10
- Typography,
11
- } from "prime-ui-kit";
2
+ import { AppShell, Avatar, BottomNav, Icon, Page, Switch, Typography } from "prime-ui-kit";
12
3
  import * as React from "react";
13
4
 
14
5
  import styles from "./examples.module.css";
@@ -37,14 +28,14 @@ export default function BottomNavFloatingActionExample() {
37
28
  return (
38
29
  <div className={styles.phone}>
39
30
  <AppShell.Root fillViewport className={styles.shell}>
40
- <AppHeader.Root>
41
- <AppHeader.Start>
42
- <AppHeader.Title>Клиенты</AppHeader.Title>
43
- </AppHeader.Start>
44
- </AppHeader.Root>
45
31
  <AppShell.Main>
46
- <PageContent.Root as="section">
47
- <PageContent.Body>
32
+ <Page.Root>
33
+ <Page.TopBar>
34
+ <Page.Heading>
35
+ <Page.Title>Клиенты</Page.Title>
36
+ </Page.Heading>
37
+ </Page.TopBar>
38
+ <Page.Body>
48
39
  <div className={styles.options}>
49
40
  <Switch.Root checked={iconOnly} onCheckedChange={setIconOnly}>
50
41
  <Switch.Label>Только иконки</Switch.Label>
@@ -63,8 +54,8 @@ export default function BottomNavFloatingActionExample() {
63
54
  </div>
64
55
  </div>
65
56
  ))}
66
- </PageContent.Body>
67
- </PageContent.Root>
57
+ </Page.Body>
58
+ </Page.Root>
68
59
  </AppShell.Main>
69
60
  <AppShell.Footer>
70
61
  <BottomNav.Root floating iconOnly={iconOnly}>
@@ -1,14 +1,5 @@
1
1
  /** A glass capsule over the page across the width: the client list scrolls under its blur, the selection glides to a tapped section, with labels or icons alone — `floating`, `iconOnly`. */
2
- import {
3
- AppHeader,
4
- AppShell,
5
- Avatar,
6
- BottomNav,
7
- Icon,
8
- PageContent,
9
- Switch,
10
- Typography,
11
- } from "prime-ui-kit";
2
+ import { AppShell, Avatar, BottomNav, Icon, Page, Switch, Typography } from "prime-ui-kit";
12
3
  import * as React from "react";
13
4
 
14
5
  import styles from "./examples.module.css";
@@ -38,14 +29,14 @@ export default function BottomNavFloatingExample() {
38
29
  return (
39
30
  <div className={styles.phone}>
40
31
  <AppShell.Root fillViewport className={styles.shell}>
41
- <AppHeader.Root>
42
- <AppHeader.Start>
43
- <AppHeader.Title>Клиенты</AppHeader.Title>
44
- </AppHeader.Start>
45
- </AppHeader.Root>
46
32
  <AppShell.Main>
47
- <PageContent.Root as="section">
48
- <PageContent.Body>
33
+ <Page.Root>
34
+ <Page.TopBar>
35
+ <Page.Heading>
36
+ <Page.Title>Клиенты</Page.Title>
37
+ </Page.Heading>
38
+ </Page.TopBar>
39
+ <Page.Body>
49
40
  <div className={styles.options}>
50
41
  <Switch.Root checked={iconOnly} onCheckedChange={setIconOnly}>
51
42
  <Switch.Label>Только иконки</Switch.Label>
@@ -64,8 +55,8 @@ export default function BottomNavFloatingExample() {
64
55
  </div>
65
56
  </div>
66
57
  ))}
67
- </PageContent.Body>
68
- </PageContent.Root>
58
+ </Page.Body>
59
+ </Page.Root>
69
60
  </AppShell.Main>
70
61
  <AppShell.Footer>
71
62
  <BottomNav.Root floating iconOnly={iconOnly}>
@@ -1,13 +1,5 @@
1
- /** The app frame on a phone: the AppHeader, the page and the bar in the footer, which gives way to the Sidebar rail once one is on screen — `AppShell.Footer`. */
2
- import {
3
- AppHeader,
4
- AppShell,
5
- BottomNav,
6
- Button,
7
- Icon,
8
- PageContent,
9
- Typography,
10
- } from "prime-ui-kit";
1
+ /** The app frame on a phone: the page with its top bar and the bar in the footer, which gives way to the Sidebar rail once one is on screen — `AppShell.Footer`. */
2
+ import { AppShell, BottomNav, Button, Icon, Page, Typography } from "prime-ui-kit";
11
3
 
12
4
  import styles from "./examples.module.css";
13
5
 
@@ -24,14 +16,14 @@ export default function BottomNavInAppShellExample() {
24
16
  return (
25
17
  <div className={styles.phone}>
26
18
  <AppShell.Root fillViewport className={styles.shell}>
27
- <AppHeader.Root>
28
- <AppHeader.Start>
29
- <AppHeader.Title>Заказы</AppHeader.Title>
30
- </AppHeader.Start>
31
- </AppHeader.Root>
32
19
  <AppShell.Main>
33
- <PageContent.Root as="section">
34
- <PageContent.Body>
20
+ <Page.Root>
21
+ <Page.TopBar>
22
+ <Page.Heading>
23
+ <Page.Title>Заказы</Page.Title>
24
+ </Page.Heading>
25
+ </Page.TopBar>
26
+ <Page.Body>
35
27
  {ORDERS.map((order) => (
36
28
  <Typography key={order} variant="body-m">
37
29
  {order}
@@ -43,8 +35,8 @@ export default function BottomNavInAppShellExample() {
43
35
  </Button.Icon>
44
36
  Новый заказ
45
37
  </Button.Root>
46
- </PageContent.Body>
47
- </PageContent.Root>
38
+ </Page.Body>
39
+ </Page.Root>
48
40
  </AppShell.Main>
49
41
  <AppShell.Footer>
50
42
  <BottomNav.Root>