prime-ui-kit 0.14.0 → 0.15.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 (490) hide show
  1. package/README.md +13 -14
  2. package/dist/chunks/{chunk-P6ZO37JM.js → chunk-2IKH55MI.js} +1 -1
  3. package/dist/chunks/{chunk-SYEX7OVT.js → chunk-THFZIHKU.js} +276 -263
  4. package/dist/chunks/{chunk-WXKRUVSE.js → chunk-XJAVS6FH.js} +49 -48
  5. package/dist/color-picker.js +2 -2
  6. package/dist/components/dnd/Dnd.d.ts +1 -1
  7. package/dist/components/login-form/LoginForm.d.ts +5 -1
  8. package/dist/index.css +1 -1
  9. package/dist/index.js +2 -2
  10. package/dist/internal/swatch.d.ts +6 -2
  11. package/dist/layout/app-header/AppHeader.d.ts +9 -28
  12. package/dist/layout/index.d.ts +1 -1
  13. package/dist/skill/SKILL.md +9 -7
  14. package/dist/skill/api-contract.md +2 -2
  15. package/dist/skill/cheatsheet.md +9 -2
  16. package/dist/skill/checklist.md +9 -5
  17. package/dist/skill/choosing.md +7 -9
  18. package/dist/skill/components.md +5 -12
  19. package/dist/skill/composition.md +281 -54
  20. package/dist/skill/foundations.md +1 -1
  21. package/dist/skill/layouts.md +70 -37
  22. package/dist/skill/reference/components/avatar/examples/states.tsx +4 -4
  23. package/dist/skill/reference/components/badge/examples/applied-filters.tsx +13 -19
  24. package/dist/skill/reference/components/badge/examples/examples.module.css +1 -8
  25. package/dist/skill/reference/components/badge/examples/server-tags.tsx +2 -6
  26. package/dist/skill/reference/components/banner/examples/examples.module.css +1 -5
  27. package/dist/skill/reference/components/banner/examples/page-strip.tsx +16 -22
  28. package/dist/skill/reference/components/breadcrumb/COMPONENT.md +4 -3
  29. package/dist/skill/reference/components/breadcrumb/examples/ellipsis.tsx +2 -2
  30. package/dist/skill/reference/components/button-group/COMPONENT.md +2 -2
  31. package/dist/skill/reference/components/button-group/examples/in-form.tsx +22 -2
  32. package/dist/skill/reference/components/button-group/examples/states.tsx +10 -1
  33. package/dist/skill/reference/components/card/COMPONENT.md +2 -1
  34. package/dist/skill/reference/components/card/examples/screen.tsx +362 -0
  35. package/dist/skill/reference/components/card/examples/variants.tsx +15 -1
  36. package/dist/skill/reference/components/chart-frame/COMPONENT.md +2 -1
  37. package/dist/skill/reference/components/chart-frame/examples/fill-height.tsx +119 -0
  38. package/dist/skill/reference/components/chart-frame/examples/states.tsx +3 -1
  39. package/dist/skill/reference/components/chat/COMPONENT.md +3 -1
  40. package/dist/skill/reference/components/chat/examples/group-chat.tsx +15 -2
  41. package/dist/skill/reference/components/chat/examples/reactions.tsx +121 -0
  42. package/dist/skill/reference/components/chat/examples/screen.module.css +9 -0
  43. package/dist/skill/{patterns/chat.tsx → reference/components/chat/examples/screen.tsx} +170 -351
  44. package/dist/skill/reference/components/chat-list/COMPONENT.md +1 -0
  45. package/dist/skill/reference/components/chat-list/examples/links.tsx +72 -0
  46. package/dist/skill/reference/components/checkbox/COMPONENT.md +1 -1
  47. package/dist/skill/reference/components/checkbox/examples/examples.module.css +5 -1
  48. package/dist/skill/reference/components/checkbox/examples/indicator.tsx +13 -7
  49. package/dist/skill/reference/components/checkbox/examples/states.tsx +6 -1
  50. package/dist/skill/reference/components/color-field/COMPONENT.md +1 -1
  51. package/dist/skill/reference/components/color-picker/COMPONENT.md +4 -3
  52. package/dist/skill/reference/components/color-picker/examples/controlled-open.tsx +37 -0
  53. package/dist/skill/reference/components/color-picker/examples/presets.tsx +2 -2
  54. package/dist/skill/reference/components/color-picker/examples/states.tsx +23 -14
  55. package/dist/skill/reference/components/composer/COMPONENT.md +2 -1
  56. package/dist/skill/reference/components/composer/examples/attach-menu.tsx +78 -0
  57. package/dist/skill/reference/components/composer/examples/attachments.tsx +2 -2
  58. package/dist/skill/reference/components/crossfade/COMPONENT.md +1 -0
  59. package/dist/skill/reference/components/crossfade/examples/screen.tsx +197 -0
  60. package/dist/skill/reference/components/data-table/COMPONENT.md +3 -2
  61. package/dist/skill/reference/components/data-table/examples/detail-panel.tsx +36 -37
  62. package/dist/skill/reference/components/data-table/examples/examples.module.css +0 -12
  63. package/dist/skill/reference/components/data-table/examples/numeric.tsx +36 -4
  64. package/dist/skill/reference/components/data-table/examples/overview.tsx +1 -0
  65. package/dist/skill/reference/components/data-table/examples/row-open.tsx +7 -36
  66. package/dist/skill/{patterns/list-page.module.css → reference/components/data-table/examples/screen.module.css} +1 -7
  67. package/dist/skill/{patterns/list-page.tsx → reference/components/data-table/examples/screen.tsx} +84 -64
  68. package/dist/skill/reference/components/datepicker/COMPONENT.md +5 -4
  69. package/dist/skill/reference/components/datepicker/examples/examples.module.css +2 -6
  70. package/dist/skill/reference/components/datepicker/examples/in-form.tsx +47 -55
  71. package/dist/skill/reference/components/datepicker/examples/locale.tsx +35 -0
  72. package/dist/skill/reference/components/datepicker/examples/range-presets.tsx +11 -2
  73. package/dist/skill/reference/components/datepicker/examples/states.tsx +9 -1
  74. package/dist/skill/reference/components/description-list/COMPONENT.md +1 -0
  75. package/dist/skill/{patterns/detail-page.module.css → reference/components/description-list/examples/screen.module.css} +2 -9
  76. package/dist/skill/reference/components/description-list/examples/screen.tsx +214 -0
  77. package/dist/skill/reference/components/description-list/examples/structure.tsx +1 -1
  78. package/dist/skill/reference/components/digit-input/COMPONENT.md +3 -1
  79. package/dist/skill/reference/components/digit-input/examples/states.tsx +3 -1
  80. package/dist/skill/reference/components/digit-input/examples/without-focus-ring.tsx +13 -0
  81. package/dist/skill/reference/components/divider/examples/with-icon.tsx +2 -2
  82. package/dist/skill/reference/components/dnd/COMPONENT.md +4 -2
  83. package/dist/skill/reference/components/dnd/examples/drop-zones.tsx +82 -49
  84. package/dist/skill/reference/components/dnd/examples/examples.module.css +50 -0
  85. package/dist/skill/reference/components/dnd/examples/states.tsx +54 -0
  86. package/dist/skill/reference/components/dnd/examples/table.tsx +113 -0
  87. package/dist/skill/reference/components/drawer/COMPONENT.md +1 -0
  88. package/dist/skill/reference/components/drawer/examples/dismiss.tsx +5 -3
  89. package/dist/skill/reference/components/drawer/examples/examples.module.css +0 -13
  90. package/dist/skill/reference/components/drawer/examples/header-actions.tsx +5 -9
  91. package/dist/skill/reference/components/drawer/examples/overview.tsx +6 -18
  92. package/dist/skill/reference/components/drawer/examples/screen.tsx +298 -0
  93. package/dist/skill/reference/components/dropdown/examples/examples.module.css +1 -5
  94. package/dist/skill/reference/components/empty-page/COMPONENT.md +1 -1
  95. package/dist/skill/reference/components/empty-page/examples/region-error.tsx +8 -2
  96. package/dist/skill/reference/components/example-frame/COMPONENT.md +3 -2
  97. package/dist/skill/reference/components/example-frame/examples/initial-view.tsx +44 -0
  98. package/dist/skill/reference/components/field-list/COMPONENT.md +2 -1
  99. package/dist/skill/reference/components/field-list/examples/errors.tsx +5 -2
  100. package/dist/skill/{patterns/record-editor.tsx → reference/components/field-list/examples/screen.tsx} +3 -43
  101. package/dist/skill/reference/components/file-upload/COMPONENT.md +7 -6
  102. package/dist/skill/reference/components/file-upload/examples/custom-body.tsx +2 -1
  103. package/dist/skill/reference/components/file-upload/examples/examples.module.css +1 -7
  104. package/dist/skill/reference/components/file-upload/examples/file-cards.tsx +10 -1
  105. package/dist/skill/reference/components/file-upload/examples/gallery.tsx +2 -2
  106. package/dist/skill/reference/components/file-upload/examples/in-form.tsx +4 -9
  107. package/dist/skill/reference/components/file-upload/examples/overview.tsx +5 -1
  108. package/dist/skill/reference/components/file-upload/examples/row-parts.tsx +24 -1
  109. package/dist/skill/{patterns/media-library.module.css → reference/components/file-upload/examples/screen.module.css} +2 -1
  110. package/dist/skill/reference/components/file-upload/examples/screen.tsx +646 -0
  111. package/dist/skill/reference/components/file-upload/examples/states.tsx +6 -2
  112. package/dist/skill/reference/components/file-upload/examples/validation.tsx +11 -2
  113. package/dist/skill/reference/components/file-upload/examples/variants.tsx +3 -20
  114. package/dist/skill/reference/components/gantt/COMPONENT.md +2 -1
  115. package/dist/skill/reference/components/gantt/examples/screen.module.css +14 -0
  116. package/dist/skill/{patterns/schedule.tsx → reference/components/gantt/examples/screen.tsx} +174 -170
  117. package/dist/skill/reference/components/gantt/examples/states.tsx +6 -2
  118. package/dist/skill/reference/components/input/COMPONENT.md +2 -2
  119. package/dist/skill/reference/components/input/examples/examples.module.css +0 -6
  120. package/dist/skill/reference/components/input/examples/in-form.tsx +1 -9
  121. package/dist/skill/reference/components/input/examples/password-strength.tsx +34 -8
  122. package/dist/skill/reference/components/input/examples/states.tsx +6 -1
  123. package/dist/skill/reference/components/kanban/COMPONENT.md +3 -2
  124. package/dist/skill/reference/components/kanban/examples/columns.tsx +8 -5
  125. package/dist/skill/reference/components/kanban/examples/screen.module.css +17 -0
  126. package/dist/skill/{patterns/kanban-board.tsx → reference/components/kanban/examples/screen.tsx} +130 -172
  127. package/dist/skill/reference/components/kanban/examples/states.tsx +17 -6
  128. package/dist/skill/reference/components/login-form/COMPONENT.md +6 -5
  129. package/dist/skill/reference/components/login-form/examples/examples.module.css +2 -21
  130. package/dist/skill/reference/components/login-form/examples/forgot-password.tsx +28 -32
  131. package/dist/skill/reference/components/login-form/examples/narrow.tsx +1 -1
  132. package/dist/skill/reference/components/login-form/examples/overview.tsx +45 -47
  133. package/dist/skill/reference/components/login-form/examples/register.tsx +64 -68
  134. package/dist/skill/reference/components/login-form/examples/reset-password.tsx +50 -47
  135. package/dist/skill/reference/components/login-form/examples/sizes.tsx +4 -6
  136. package/dist/skill/reference/components/login-form/examples/states.tsx +53 -57
  137. package/dist/skill/reference/components/login-form/examples/structure.tsx +18 -22
  138. package/dist/skill/reference/components/login-form/examples/verification-code.tsx +41 -45
  139. package/dist/skill/reference/components/media-viewer/COMPONENT.md +1 -1
  140. package/dist/skill/reference/components/media-viewer/examples/dismiss.tsx +5 -1
  141. package/dist/skill/reference/components/message/COMPONENT.md +4 -3
  142. package/dist/skill/reference/components/message/examples/file.tsx +5 -1
  143. package/dist/skill/reference/components/message/examples/media-open.tsx +48 -0
  144. package/dist/skill/reference/components/message/examples/status.tsx +21 -3
  145. package/dist/skill/reference/components/message/examples/text-formatting.tsx +7 -1
  146. package/dist/skill/reference/components/modal/COMPONENT.md +2 -1
  147. package/dist/skill/reference/components/modal/examples/custom-container.tsx +20 -20
  148. package/dist/skill/reference/components/modal/examples/dismiss.tsx +5 -3
  149. package/dist/skill/reference/components/modal/examples/enter-key.tsx +116 -0
  150. package/dist/skill/reference/components/modal/examples/examples.module.css +7 -13
  151. package/dist/skill/reference/components/modal/examples/structure.tsx +5 -2
  152. package/dist/skill/reference/components/native-select/COMPONENT.md +1 -1
  153. package/dist/skill/reference/components/native-select/examples/states.tsx +5 -1
  154. package/dist/skill/reference/components/notification/COMPONENT.md +1 -1
  155. package/dist/skill/reference/components/notification/examples/dismiss.tsx +2 -2
  156. package/dist/skill/reference/components/page-content/COMPONENT.md +1 -0
  157. package/dist/skill/reference/components/page-content/examples/list-detail.tsx +0 -3
  158. package/dist/skill/{patterns/settings-page.tsx → reference/components/page-content/examples/screen.tsx} +3 -3
  159. package/dist/skill/reference/components/page-content/examples/variants.tsx +4 -11
  160. package/dist/skill/reference/components/page-toolbar/COMPONENT.md +17 -15
  161. package/dist/skill/reference/components/page-toolbar/examples/narrow.tsx +6 -3
  162. package/dist/skill/reference/components/pagination/examples/controlled.tsx +29 -29
  163. package/dist/skill/reference/components/pagination/examples/examples.module.css +0 -2
  164. package/dist/skill/reference/components/progress-bar/COMPONENT.md +1 -1
  165. package/dist/skill/reference/components/progress-bar/examples/segments.tsx +2 -2
  166. package/dist/skill/reference/components/progress-circle/COMPONENT.md +1 -1
  167. package/dist/skill/reference/components/progress-circle/examples/segments.tsx +8 -3
  168. package/dist/skill/reference/components/radio/COMPONENT.md +1 -0
  169. package/dist/skill/reference/components/radio/examples/examples.module.css +14 -0
  170. package/dist/skill/reference/components/radio/examples/in-form.tsx +45 -0
  171. package/dist/skill/reference/components/scroll-container/COMPONENT.md +1 -0
  172. package/dist/skill/reference/components/scroll-container/examples/auto-scroll.tsx +3 -3
  173. package/dist/skill/reference/components/scroll-container/examples/chat.tsx +3 -3
  174. package/dist/skill/reference/components/scroll-container/examples/edges.tsx +6 -3
  175. package/dist/skill/reference/components/scroll-container/examples/examples.module.css +4 -17
  176. package/dist/skill/reference/components/scroll-container/examples/load-more.tsx +51 -0
  177. package/dist/skill/reference/components/scroll-container/examples/lock.tsx +3 -5
  178. package/dist/skill/reference/components/scroll-container/examples/overscroll.tsx +3 -3
  179. package/dist/skill/reference/components/scroll-container/examples/overview.tsx +3 -3
  180. package/dist/skill/reference/components/scroll-container/examples/scrollbar.tsx +13 -7
  181. package/dist/skill/reference/components/scroll-container/examples/variants.tsx +13 -7
  182. package/dist/skill/reference/components/segmented-control/COMPONENT.md +2 -2
  183. package/dist/skill/reference/components/segmented-control/examples/in-form.tsx +5 -1
  184. package/dist/skill/reference/components/segmented-control/examples/states.tsx +10 -1
  185. package/dist/skill/reference/components/select/COMPONENT.md +1 -1
  186. package/dist/skill/reference/components/select/examples/examples.module.css +2 -7
  187. package/dist/skill/reference/components/select/examples/states.tsx +13 -1
  188. package/dist/skill/reference/components/sheet/COMPONENT.md +2 -0
  189. package/dist/skill/reference/components/sheet/examples/guard.tsx +72 -0
  190. package/dist/skill/reference/components/sheet/examples/header-actions.tsx +56 -0
  191. package/dist/skill/reference/components/slider/COMPONENT.md +2 -1
  192. package/dist/skill/reference/components/slider/examples/examples.module.css +8 -0
  193. package/dist/skill/reference/components/slider/examples/in-form.tsx +47 -0
  194. package/dist/skill/reference/components/slider/examples/states.tsx +4 -1
  195. package/dist/skill/reference/components/smart-filter/COMPONENT.md +1 -1
  196. package/dist/skill/reference/components/smart-filter/examples/controlled.tsx +3 -3
  197. package/dist/skill/reference/components/smart-filter/examples/ranges.tsx +44 -10
  198. package/dist/skill/reference/components/sparkline/COMPONENT.md +1 -1
  199. package/dist/skill/reference/components/sparkline/examples/reference.tsx +2 -1
  200. package/dist/skill/reference/components/tabs/COMPONENT.md +1 -1
  201. package/dist/skill/reference/components/tabs/examples/sizes.tsx +1 -1
  202. package/dist/skill/reference/components/tag-select/COMPONENT.md +1 -1
  203. package/dist/skill/reference/components/tag-select/examples/states.tsx +8 -1
  204. package/dist/skill/reference/components/textarea/COMPONENT.md +1 -1
  205. package/dist/skill/reference/components/textarea/examples/examples.module.css +0 -6
  206. package/dist/skill/reference/components/textarea/examples/in-form.tsx +1 -9
  207. package/dist/skill/reference/components/textarea/examples/states.tsx +2 -1
  208. package/dist/skill/reference/components/thumbnail/COMPONENT.md +2 -1
  209. package/dist/skill/reference/components/thumbnail/examples/examples.module.css +1 -1
  210. package/dist/skill/reference/components/thumbnail/examples/fit.tsx +24 -0
  211. package/dist/skill/reference/components/thumbnail/examples/video.tsx +20 -1
  212. package/dist/skill/reference/components/timeline/COMPONENT.md +1 -1
  213. package/dist/skill/reference/components/timeline/examples/links.tsx +55 -14
  214. package/dist/skill/reference/components/tooltip/COMPONENT.md +1 -1
  215. package/dist/skill/reference/components/tooltip/examples/toolbar.tsx +2 -2
  216. package/dist/skill/reference/components/typography/examples/weights.tsx +3 -0
  217. package/dist/skill/reference/components/video-note/COMPONENT.md +2 -2
  218. package/dist/skill/reference/components/video-note/examples/controlled.tsx +19 -2
  219. package/dist/skill/reference/components/video-note/examples/in-message.tsx +5 -2
  220. package/dist/skill/reference/components/visually-hidden/COMPONENT.md +2 -1
  221. package/dist/skill/reference/components/visually-hidden/examples/assertive.tsx +39 -0
  222. package/dist/skill/reference/components/voice-player/COMPONENT.md +2 -2
  223. package/dist/skill/reference/components/voice-player/examples/call-recording.tsx +19 -9
  224. package/dist/skill/reference/components/voice-player/examples/controlled.tsx +20 -3
  225. package/dist/skill/reference/layout/app-header/COMPONENT.md +46 -63
  226. package/dist/skill/reference/layout/app-header/examples/breadcrumbs.tsx +10 -9
  227. package/dist/skill/reference/layout/app-header/examples/examples.module.css +1 -1
  228. package/dist/skill/reference/layout/app-header/examples/in-app-shell.tsx +0 -1
  229. package/dist/skill/reference/layout/app-header/examples/narrow.tsx +4 -5
  230. package/dist/skill/reference/layout/app-header/examples/overview.tsx +8 -10
  231. package/dist/skill/reference/layout/app-header/examples/page-title.tsx +3 -10
  232. package/dist/skill/reference/layout/app-shell/COMPONENT.md +4 -3
  233. package/dist/skill/reference/layout/app-shell/examples/overview.tsx +15 -30
  234. package/dist/skill/reference/layout/app-shell/examples/screen.tsx +262 -0
  235. package/dist/skill/reference/layout/app-shell/examples/template.tsx +29 -9
  236. package/dist/skill/reference/layout/sidebar/COMPONENT.md +7 -4
  237. package/dist/skill/reference/layout/sidebar/examples/account.tsx +2 -2
  238. package/dist/skill/reference/layout/sidebar/examples/collapsible-groups.tsx +12 -4
  239. package/dist/skill/reference/layout/sidebar/examples/custom-part.tsx +53 -0
  240. package/dist/skill/reference/layout/sidebar/examples/examples.module.css +5 -0
  241. package/dist/skill/reference/layout/sidebar/examples/narrow.tsx +53 -0
  242. package/dist/skill/reference/layout/sidebar/examples/persist.tsx +57 -0
  243. package/dist/skill/reference/layout/sidebar/examples/router.tsx +14 -2
  244. package/dist/skill/reference/layout/sidebar/examples/structure.tsx +7 -2
  245. package/dist/skill/responsive.md +2 -2
  246. package/package.json +1 -1
  247. package/src/components/avatar/examples/states.tsx +4 -4
  248. package/src/components/badge/examples/applied-filters.tsx +13 -19
  249. package/src/components/badge/examples/examples.module.css +1 -8
  250. package/src/components/badge/examples/server-tags.tsx +2 -6
  251. package/src/components/banner/examples/examples.module.css +1 -5
  252. package/src/components/banner/examples/page-strip.tsx +16 -22
  253. package/src/components/breadcrumb/COMPONENT.md +4 -3
  254. package/src/components/breadcrumb/examples/ellipsis.tsx +2 -2
  255. package/src/components/button-group/COMPONENT.md +2 -2
  256. package/src/components/button-group/examples/in-form.tsx +22 -2
  257. package/src/components/button-group/examples/states.tsx +10 -1
  258. package/src/components/card/COMPONENT.md +2 -1
  259. package/src/components/card/examples/screen.module.css +14 -0
  260. package/src/components/card/examples/screen.tsx +362 -0
  261. package/src/components/card/examples/variants.tsx +15 -1
  262. package/src/components/chart-frame/COMPONENT.md +2 -1
  263. package/src/components/chart-frame/examples/fill-height.tsx +119 -0
  264. package/src/components/chart-frame/examples/states.tsx +3 -1
  265. package/src/components/chat/COMPONENT.md +3 -1
  266. package/src/components/chat/examples/group-chat.tsx +15 -2
  267. package/src/components/chat/examples/reactions.tsx +121 -0
  268. package/src/components/chat/examples/screen.module.css +9 -0
  269. package/src/components/chat/examples/screen.tsx +718 -0
  270. package/src/components/chat-list/COMPONENT.md +1 -0
  271. package/src/components/chat-list/examples/links.tsx +72 -0
  272. package/src/components/checkbox/COMPONENT.md +1 -1
  273. package/src/components/checkbox/examples/examples.module.css +5 -1
  274. package/src/components/checkbox/examples/indicator.tsx +13 -7
  275. package/src/components/checkbox/examples/states.tsx +6 -1
  276. package/src/components/color-field/COMPONENT.md +1 -1
  277. package/src/components/color-picker/COMPONENT.md +4 -3
  278. package/src/components/color-picker/examples/controlled-open.tsx +37 -0
  279. package/src/components/color-picker/examples/presets.tsx +2 -2
  280. package/src/components/color-picker/examples/states.tsx +23 -14
  281. package/src/components/composer/COMPONENT.md +2 -1
  282. package/src/components/composer/examples/attach-menu.tsx +78 -0
  283. package/src/components/composer/examples/attachments.tsx +2 -2
  284. package/src/components/crossfade/COMPONENT.md +1 -0
  285. package/src/components/crossfade/examples/screen.module.css +40 -0
  286. package/src/components/crossfade/examples/screen.tsx +197 -0
  287. package/src/components/data-table/COMPONENT.md +3 -2
  288. package/src/components/data-table/examples/detail-panel.tsx +36 -37
  289. package/src/components/data-table/examples/examples.module.css +0 -12
  290. package/src/components/data-table/examples/numeric.tsx +36 -4
  291. package/src/components/data-table/examples/overview.tsx +1 -0
  292. package/src/components/data-table/examples/row-open.tsx +7 -36
  293. package/src/components/data-table/examples/screen.module.css +13 -0
  294. package/src/components/data-table/examples/screen.tsx +354 -0
  295. package/src/components/datepicker/COMPONENT.md +5 -4
  296. package/src/components/datepicker/examples/examples.module.css +2 -6
  297. package/src/components/datepicker/examples/in-form.tsx +47 -55
  298. package/src/components/datepicker/examples/locale.tsx +35 -0
  299. package/src/components/datepicker/examples/range-presets.tsx +11 -2
  300. package/src/components/datepicker/examples/states.tsx +9 -1
  301. package/src/components/description-list/COMPONENT.md +1 -0
  302. package/src/components/description-list/examples/screen.module.css +64 -0
  303. package/src/components/description-list/examples/screen.tsx +214 -0
  304. package/src/components/description-list/examples/structure.tsx +1 -1
  305. package/src/components/digit-input/COMPONENT.md +3 -1
  306. package/src/components/digit-input/examples/states.tsx +3 -1
  307. package/src/components/digit-input/examples/without-focus-ring.tsx +13 -0
  308. package/src/components/divider/examples/with-icon.tsx +2 -2
  309. package/src/components/dnd/COMPONENT.md +4 -2
  310. package/src/components/dnd/examples/drop-zones.tsx +82 -49
  311. package/src/components/dnd/examples/examples.module.css +50 -0
  312. package/src/components/dnd/examples/states.tsx +54 -0
  313. package/src/components/dnd/examples/table.tsx +113 -0
  314. package/src/components/drawer/COMPONENT.md +1 -0
  315. package/src/components/drawer/examples/dismiss.tsx +5 -3
  316. package/src/components/drawer/examples/examples.module.css +0 -13
  317. package/src/components/drawer/examples/header-actions.tsx +5 -9
  318. package/src/components/drawer/examples/overview.tsx +6 -18
  319. package/src/components/drawer/examples/screen.module.css +14 -0
  320. package/src/components/drawer/examples/screen.tsx +298 -0
  321. package/src/components/dropdown/examples/examples.module.css +1 -5
  322. package/src/components/empty-page/COMPONENT.md +1 -1
  323. package/src/components/empty-page/examples/region-error.tsx +8 -2
  324. package/src/components/example-frame/COMPONENT.md +3 -2
  325. package/src/components/example-frame/examples/initial-view.tsx +44 -0
  326. package/src/components/field-list/COMPONENT.md +2 -1
  327. package/src/components/field-list/examples/errors.tsx +5 -2
  328. package/src/components/field-list/examples/screen.module.css +18 -0
  329. package/src/components/field-list/examples/screen.tsx +316 -0
  330. package/src/components/file-upload/COMPONENT.md +7 -6
  331. package/src/components/file-upload/examples/custom-body.tsx +2 -1
  332. package/src/components/file-upload/examples/examples.module.css +1 -7
  333. package/src/components/file-upload/examples/file-cards.tsx +10 -1
  334. package/src/components/file-upload/examples/gallery.tsx +2 -2
  335. package/src/components/file-upload/examples/in-form.tsx +4 -9
  336. package/src/components/file-upload/examples/overview.tsx +5 -1
  337. package/src/components/file-upload/examples/row-parts.tsx +24 -1
  338. package/src/components/file-upload/examples/screen.module.css +45 -0
  339. package/src/components/file-upload/examples/screen.tsx +646 -0
  340. package/src/components/file-upload/examples/states.tsx +6 -2
  341. package/src/components/file-upload/examples/validation.tsx +11 -2
  342. package/src/components/file-upload/examples/variants.tsx +3 -20
  343. package/src/components/gantt/COMPONENT.md +2 -1
  344. package/src/components/gantt/examples/screen.module.css +14 -0
  345. package/src/components/gantt/examples/screen.tsx +726 -0
  346. package/src/components/gantt/examples/states.tsx +6 -2
  347. package/src/components/input/COMPONENT.md +2 -2
  348. package/src/components/input/examples/examples.module.css +0 -6
  349. package/src/components/input/examples/in-form.tsx +1 -9
  350. package/src/components/input/examples/password-strength.tsx +34 -8
  351. package/src/components/input/examples/states.tsx +6 -1
  352. package/src/components/kanban/COMPONENT.md +3 -2
  353. package/src/components/kanban/examples/columns.tsx +8 -5
  354. package/src/components/kanban/examples/screen.module.css +17 -0
  355. package/src/components/kanban/examples/screen.tsx +572 -0
  356. package/src/components/kanban/examples/states.tsx +17 -6
  357. package/src/components/login-form/COMPONENT.md +6 -5
  358. package/src/components/login-form/examples/examples.module.css +2 -21
  359. package/src/components/login-form/examples/forgot-password.tsx +28 -32
  360. package/src/components/login-form/examples/narrow.tsx +1 -1
  361. package/src/components/login-form/examples/overview.tsx +45 -47
  362. package/src/components/login-form/examples/register.tsx +64 -68
  363. package/src/components/login-form/examples/reset-password.tsx +50 -47
  364. package/src/components/login-form/examples/sizes.tsx +4 -6
  365. package/src/components/login-form/examples/states.tsx +53 -57
  366. package/src/components/login-form/examples/structure.tsx +18 -22
  367. package/src/components/login-form/examples/verification-code.tsx +41 -45
  368. package/src/components/media-viewer/COMPONENT.md +1 -1
  369. package/src/components/media-viewer/examples/dismiss.tsx +5 -1
  370. package/src/components/message/COMPONENT.md +4 -3
  371. package/src/components/message/examples/file.tsx +5 -1
  372. package/src/components/message/examples/media-open.tsx +48 -0
  373. package/src/components/message/examples/status.tsx +21 -3
  374. package/src/components/message/examples/text-formatting.tsx +7 -1
  375. package/src/components/modal/COMPONENT.md +2 -1
  376. package/src/components/modal/examples/custom-container.tsx +20 -20
  377. package/src/components/modal/examples/dismiss.tsx +5 -3
  378. package/src/components/modal/examples/enter-key.tsx +116 -0
  379. package/src/components/modal/examples/examples.module.css +7 -13
  380. package/src/components/modal/examples/structure.tsx +5 -2
  381. package/src/components/native-select/COMPONENT.md +1 -1
  382. package/src/components/native-select/examples/states.tsx +5 -1
  383. package/src/components/notification/COMPONENT.md +1 -1
  384. package/src/components/notification/examples/dismiss.tsx +2 -2
  385. package/src/components/page-content/COMPONENT.md +1 -0
  386. package/src/components/page-content/examples/list-detail.tsx +0 -3
  387. package/src/components/page-content/examples/screen.module.css +27 -0
  388. package/src/components/page-content/examples/screen.tsx +196 -0
  389. package/src/components/page-content/examples/variants.tsx +4 -11
  390. package/src/components/page-toolbar/COMPONENT.md +17 -15
  391. package/src/components/page-toolbar/examples/narrow.tsx +6 -3
  392. package/src/components/pagination/examples/controlled.tsx +29 -29
  393. package/src/components/pagination/examples/examples.module.css +0 -2
  394. package/src/components/progress-bar/COMPONENT.md +1 -1
  395. package/src/components/progress-bar/examples/segments.tsx +2 -2
  396. package/src/components/progress-circle/COMPONENT.md +1 -1
  397. package/src/components/progress-circle/examples/segments.tsx +8 -3
  398. package/src/components/radio/COMPONENT.md +1 -0
  399. package/src/components/radio/examples/examples.module.css +14 -0
  400. package/src/components/radio/examples/in-form.tsx +45 -0
  401. package/src/components/scroll-container/COMPONENT.md +1 -0
  402. package/src/components/scroll-container/examples/auto-scroll.tsx +3 -3
  403. package/src/components/scroll-container/examples/chat.tsx +3 -3
  404. package/src/components/scroll-container/examples/edges.tsx +6 -3
  405. package/src/components/scroll-container/examples/examples.module.css +4 -17
  406. package/src/components/scroll-container/examples/load-more.tsx +51 -0
  407. package/src/components/scroll-container/examples/lock.tsx +3 -5
  408. package/src/components/scroll-container/examples/overscroll.tsx +3 -3
  409. package/src/components/scroll-container/examples/overview.tsx +3 -3
  410. package/src/components/scroll-container/examples/scrollbar.tsx +13 -7
  411. package/src/components/scroll-container/examples/variants.tsx +13 -7
  412. package/src/components/segmented-control/COMPONENT.md +2 -2
  413. package/src/components/segmented-control/examples/in-form.tsx +5 -1
  414. package/src/components/segmented-control/examples/states.tsx +10 -1
  415. package/src/components/select/COMPONENT.md +1 -1
  416. package/src/components/select/examples/examples.module.css +2 -7
  417. package/src/components/select/examples/states.tsx +13 -1
  418. package/src/components/sheet/COMPONENT.md +2 -0
  419. package/src/components/sheet/examples/guard.tsx +72 -0
  420. package/src/components/sheet/examples/header-actions.tsx +56 -0
  421. package/src/components/slider/COMPONENT.md +2 -1
  422. package/src/components/slider/examples/examples.module.css +8 -0
  423. package/src/components/slider/examples/in-form.tsx +47 -0
  424. package/src/components/slider/examples/states.tsx +4 -1
  425. package/src/components/smart-filter/COMPONENT.md +1 -1
  426. package/src/components/smart-filter/examples/controlled.tsx +3 -3
  427. package/src/components/smart-filter/examples/ranges.tsx +44 -10
  428. package/src/components/sparkline/COMPONENT.md +1 -1
  429. package/src/components/sparkline/examples/reference.tsx +2 -1
  430. package/src/components/tabs/COMPONENT.md +1 -1
  431. package/src/components/tabs/examples/sizes.tsx +1 -1
  432. package/src/components/tag-select/COMPONENT.md +1 -1
  433. package/src/components/tag-select/examples/states.tsx +8 -1
  434. package/src/components/textarea/COMPONENT.md +1 -1
  435. package/src/components/textarea/examples/examples.module.css +0 -6
  436. package/src/components/textarea/examples/in-form.tsx +1 -9
  437. package/src/components/textarea/examples/states.tsx +2 -1
  438. package/src/components/thumbnail/COMPONENT.md +2 -1
  439. package/src/components/thumbnail/examples/examples.module.css +1 -1
  440. package/src/components/thumbnail/examples/fit.tsx +24 -0
  441. package/src/components/thumbnail/examples/video.tsx +20 -1
  442. package/src/components/timeline/COMPONENT.md +1 -1
  443. package/src/components/timeline/examples/links.tsx +55 -14
  444. package/src/components/tooltip/COMPONENT.md +1 -1
  445. package/src/components/tooltip/examples/toolbar.tsx +2 -2
  446. package/src/components/typography/examples/weights.tsx +3 -0
  447. package/src/components/video-note/COMPONENT.md +2 -2
  448. package/src/components/video-note/examples/controlled.tsx +19 -2
  449. package/src/components/video-note/examples/in-message.tsx +5 -2
  450. package/src/components/visually-hidden/COMPONENT.md +2 -1
  451. package/src/components/visually-hidden/examples/assertive.tsx +39 -0
  452. package/src/components/voice-player/COMPONENT.md +2 -2
  453. package/src/components/voice-player/examples/call-recording.tsx +19 -9
  454. package/src/components/voice-player/examples/controlled.tsx +20 -3
  455. package/src/layout/app-header/COMPONENT.md +46 -63
  456. package/src/layout/app-header/examples/breadcrumbs.tsx +10 -9
  457. package/src/layout/app-header/examples/examples.module.css +1 -1
  458. package/src/layout/app-header/examples/in-app-shell.tsx +0 -1
  459. package/src/layout/app-header/examples/narrow.tsx +4 -5
  460. package/src/layout/app-header/examples/overview.tsx +8 -10
  461. package/src/layout/app-header/examples/page-title.tsx +3 -10
  462. package/src/layout/app-shell/COMPONENT.md +4 -3
  463. package/src/layout/app-shell/examples/overview.tsx +15 -30
  464. package/src/layout/app-shell/examples/screen.module.css +11 -0
  465. package/src/layout/app-shell/examples/screen.tsx +262 -0
  466. package/src/layout/app-shell/examples/template.tsx +29 -9
  467. package/src/layout/sidebar/COMPONENT.md +7 -4
  468. package/src/layout/sidebar/examples/account.tsx +2 -2
  469. package/src/layout/sidebar/examples/collapsible-groups.tsx +12 -4
  470. package/src/layout/sidebar/examples/custom-part.tsx +53 -0
  471. package/src/layout/sidebar/examples/examples.module.css +5 -0
  472. package/src/layout/sidebar/examples/narrow.tsx +53 -0
  473. package/src/layout/sidebar/examples/persist.tsx +57 -0
  474. package/src/layout/sidebar/examples/router.tsx +14 -2
  475. package/src/layout/sidebar/examples/structure.tsx +7 -2
  476. package/dist/skill/patterns/app-shell.tsx +0 -303
  477. package/dist/skill/patterns/chat.module.css +0 -8
  478. package/dist/skill/patterns/dashboard.tsx +0 -340
  479. package/dist/skill/patterns/detail-page.tsx +0 -206
  480. package/dist/skill/patterns/form-drawer.tsx +0 -240
  481. package/dist/skill/patterns/kanban-board.module.css +0 -28
  482. package/dist/skill/patterns/media-library.tsx +0 -637
  483. package/dist/skill/patterns/schedule.module.css +0 -22
  484. package/dist/skill/patterns/screen-states.tsx +0 -187
  485. /package/dist/skill/{patterns/dashboard.module.css → reference/components/card/examples/screen.module.css} +0 -0
  486. /package/dist/skill/{patterns/screen-states.module.css → reference/components/crossfade/examples/screen.module.css} +0 -0
  487. /package/dist/skill/{patterns/form-drawer.module.css → reference/components/drawer/examples/screen.module.css} +0 -0
  488. /package/dist/skill/{patterns/record-editor.module.css → reference/components/field-list/examples/screen.module.css} +0 -0
  489. /package/dist/skill/{patterns/settings-page.module.css → reference/components/page-content/examples/screen.module.css} +0 -0
  490. /package/dist/skill/{patterns/app-shell.module.css → reference/layout/app-shell/examples/screen.module.css} +0 -0
@@ -0,0 +1,45 @@
1
+ /** Choices of an order form: a required group shows its error after a submit without a choice, an optional one is marked — `name`, `required`, `optional`, `error`. */
2
+ import { Button, Radio } from "prime-ui-kit";
3
+ import * as React from "react";
4
+
5
+ import styles from "./examples.module.css";
6
+
7
+ export default function RadioInFormExample() {
8
+ const [error, setError] = React.useState<string>();
9
+
10
+ const submit = (event: React.FormEvent<HTMLFormElement>) => {
11
+ event.preventDefault();
12
+ const chosen = new FormData(event.currentTarget).get("delivery");
13
+ setError(chosen ? undefined : "Выберите способ доставки");
14
+ };
15
+
16
+ return (
17
+ <form className={styles.form} noValidate onSubmit={submit}>
18
+ <Radio.Group
19
+ label="Способ доставки"
20
+ name="delivery"
21
+ required
22
+ error={error}
23
+ onValueChange={() => setError(undefined)}
24
+ >
25
+ <Radio.Root value="courier">
26
+ <Radio.Label>Курьером до склада</Radio.Label>
27
+ </Radio.Root>
28
+ <Radio.Root value="pickup">
29
+ <Radio.Label>Самовывоз с терминала</Radio.Label>
30
+ </Radio.Root>
31
+ </Radio.Group>
32
+ <Radio.Group label="Упаковка" name="packing" optional>
33
+ <Radio.Root value="pallet">
34
+ <Radio.Label>На паллетах</Radio.Label>
35
+ </Radio.Root>
36
+ <Radio.Root value="crate">
37
+ <Radio.Label>В обрешётке</Radio.Label>
38
+ </Radio.Root>
39
+ </Radio.Group>
40
+ <div className={styles.formActions}>
41
+ <Button.Root type="submit">Оформить заказ</Button.Root>
42
+ </div>
43
+ </form>
44
+ );
45
+ }
@@ -160,6 +160,7 @@ No `labels`.
160
160
  | [auto-scroll.tsx](examples/auto-scroll.tsx) | A task dragged to the top or bottom edge of a scrolling list scrolls it, faster the closer it comes — `ScrollContainer`, `Dnd.Sortable`. |
161
161
  | [overscroll.tsx](examples/overscroll.tsx) | At the end of the list the scroll passes on to the page instead of stopping — `overscrollBehavior`. |
162
162
  | [chat.tsx](examples/chat.tsx) | A support chat pinned to its last message: a sent message keeps it at the end, scrolling up loads older ones without moving what is on screen — `anchor`, `onReachStart`. |
163
+ | [load-more.tsx](examples/load-more.tsx) | An order log that loads the next page as the reader nears its end, with loading lines in the rows' place — `onReachEnd`. |
163
164
 
164
165
  ## Mistakes
165
166
  - `overflow: auto` on a plain `div` inside a flex column that never shrinks → use ScrollContainer (it sets `min-height: 0`).
@@ -22,9 +22,9 @@ export default function ScrollContainerAutoScrollExample() {
22
22
 
23
23
  return (
24
24
  <Card.Root role="region" className={styles.card} aria-label="План проекта">
25
- <Typography as="h3" variant="title-s" className={styles.cardTitle}>
26
- План проекта
27
- </Typography>
25
+ <Card.Header>
26
+ <Card.Title>План проекта</Card.Title>
27
+ </Card.Header>
28
28
  <ScrollContainer>
29
29
  <Dnd.Root>
30
30
  <Dnd.Sortable
@@ -57,9 +57,9 @@ export default function ScrollContainerChatExample() {
57
57
 
58
58
  return (
59
59
  <Card.Root className={styles.chat}>
60
- <Typography as="h3" variant="title-s" className={styles.cardTitle}>
61
- ООО «Гранит» · счёт № 4821
62
- </Typography>
60
+ <Card.Header>
61
+ <Card.Title>ООО «Гранит» · счёт № 4821</Card.Title>
62
+ </Card.Header>
63
63
  <ScrollContainer
64
64
  anchor="end"
65
65
  onReachStart={loadOlder}
@@ -22,9 +22,12 @@ export default function ScrollContainerEdgesExample() {
22
22
  <div className={styles.layout}>
23
23
  {EDGES.map((edges) => (
24
24
  <Card.Root key={edges} role="region" className={styles.card} aria-label={`Лента: ${edges}`}>
25
- <Typography as="h3" variant="title-s" className={styles.cardTitle}>
26
- {edges}
27
- </Typography>
25
+ <Card.Header>
26
+ <Card.Title>Лента событий</Card.Title>
27
+ <Typography as="span" variant="caption" tone="muted">
28
+ {edges}
29
+ </Typography>
30
+ </Card.Header>
28
31
  <ScrollContainer edges={edges}>
29
32
  <ul className={styles.list}>
30
33
  {EVENTS.map((event) => (
@@ -17,15 +17,11 @@
17
17
  width: auto;
18
18
  }
19
19
 
20
- .cardTitle {
21
- padding: var(--prime-space-3) var(--prime-space-4);
22
- }
23
-
24
20
  .list {
25
21
  display: flex;
26
22
  flex-direction: column;
27
23
  margin: 0;
28
- padding: 0 var(--prime-space-4) var(--prime-space-3);
24
+ padding: var(--prime-space-2) var(--prime-space-4) var(--prime-space-3);
29
25
  list-style: none;
30
26
  }
31
27
 
@@ -48,7 +44,7 @@
48
44
  }
49
45
 
50
46
  .messages {
51
- padding-top: var(--prime-space-2);
47
+ min-height: 0;
52
48
  }
53
49
 
54
50
  /* Older messages loading: lines in the messages' geometry, at the top where they will appear. */
@@ -77,7 +73,7 @@
77
73
 
78
74
  /* Two-axis scroller: the side padding lives on the scrolling element itself (foundation §7). */
79
75
  .canvas {
80
- padding: 0 var(--prime-space-4) var(--prime-space-3);
76
+ padding: var(--prime-space-3) var(--prime-space-4);
81
77
  }
82
78
 
83
79
  .grid {
@@ -94,15 +90,6 @@
94
90
  font-variant-numeric: tabular-nums;
95
91
  }
96
92
 
97
- /* lock.tsx: the title and the review button in one row above the queue. */
98
- .cardHeader {
99
- display: flex;
100
- align-items: center;
101
- justify-content: space-between;
102
- gap: var(--prime-space-3);
103
- padding: var(--prime-space-3) var(--prime-space-4);
104
- }
105
-
106
93
  /* snap.tsx: a row of fixed-width cards; the padding keeps the edge cards' rings unclipped. */
107
94
  .tiles {
108
95
  display: flex;
@@ -124,7 +111,7 @@
124
111
  flex-direction: column;
125
112
  gap: var(--prime-space-1);
126
113
  margin: 0;
127
- padding: 0 var(--prime-space-3) var(--prime-space-3);
114
+ padding: var(--prime-space-3);
128
115
  list-style: none;
129
116
  }
130
117
 
@@ -0,0 +1,51 @@
1
+ /** An order log that loads the next page as the reader nears its end, with loading lines in the rows' place — `onReachEnd`. */
2
+ import { Card, ScrollContainer, Skeleton, Typography } from "prime-ui-kit";
3
+ import * as React from "react";
4
+
5
+ import styles from "./examples.module.css";
6
+
7
+ const ORDERS = Array.from({ length: 40 }, (_, index) => ({
8
+ id: 2400 - index,
9
+ amount: `${(18 + ((index * 7) % 23)) * 1000} ₽`,
10
+ }));
11
+
12
+ const PAGE = 10;
13
+
14
+ export default function ScrollContainerLoadMoreExample() {
15
+ const [shown, setShown] = React.useState(PAGE);
16
+ const [loading, setLoading] = React.useState(false);
17
+ const done = shown >= ORDERS.length;
18
+
19
+ const loadMore = () => {
20
+ if (done) return;
21
+ setLoading(true);
22
+ // The promise keeps the region `aria-busy` and stops repeat calls until it settles.
23
+ return new Promise<void>((resolve) => {
24
+ window.setTimeout(() => {
25
+ setShown((count) => Math.min(count + PAGE, ORDERS.length));
26
+ setLoading(false);
27
+ resolve();
28
+ }, 800);
29
+ });
30
+ };
31
+
32
+ return (
33
+ <Card.Root role="region" className={styles.card} aria-label="Журнал заказов">
34
+ <Card.Header>
35
+ <Card.Title>Журнал заказов</Card.Title>
36
+ </Card.Header>
37
+ <ScrollContainer onReachEnd={loadMore} tabIndex={0} aria-label="Заказы">
38
+ <ul className={styles.list}>
39
+ {ORDERS.slice(0, shown).map((order) => (
40
+ <li key={order.id}>
41
+ <Typography as="span" variant="body-m" tone="secondary">
42
+ Заказ № {order.id} · {order.amount}
43
+ </Typography>
44
+ </li>
45
+ ))}
46
+ </ul>
47
+ {loading ? <Skeleton lines={3} className={styles.older} /> : null}
48
+ </ScrollContainer>
49
+ </Card.Root>
50
+ );
51
+ }
@@ -20,10 +20,8 @@ export default function ScrollContainerLockExample() {
20
20
 
21
21
  return (
22
22
  <Card.Root role="region" className={styles.card} aria-label="Очередь заказов">
23
- <div className={styles.cardHeader}>
24
- <Typography as="h3" variant="title-s">
25
- Очередь заказов
26
- </Typography>
23
+ <Card.Header>
24
+ <Card.Title>Очередь заказов</Card.Title>
27
25
  <Button.Root
28
26
  variant="soft"
29
27
  tone="neutral"
@@ -32,7 +30,7 @@ export default function ScrollContainerLockExample() {
32
30
  >
33
31
  {reviewing ? "Закрыть проверку" : "Проверить заказ"}
34
32
  </Button.Root>
35
- </div>
33
+ </Card.Header>
36
34
  <ScrollContainer lock={reviewing}>
37
35
  <ul className={styles.list}>
38
36
  {ORDERS.map((order) => (
@@ -8,9 +8,9 @@ const HOURS = Array.from({ length: 12 }, (_, index) => `${String(9 + index).padS
8
8
  export default function ScrollContainerOverscrollExample() {
9
9
  return (
10
10
  <Card.Root role="region" className={styles.card} aria-label="Журнал">
11
- <Typography as="h3" variant="title-s" className={styles.cardTitle}>
12
- Журнал выгрузок
13
- </Typography>
11
+ <Card.Header>
12
+ <Card.Title>Журнал выгрузок</Card.Title>
13
+ </Card.Header>
14
14
  <ScrollContainer overscrollBehavior="auto" tabIndex={0} aria-label="Журнал выгрузок">
15
15
  <ul className={styles.list}>
16
16
  {HOURS.map((hour) => (
@@ -8,9 +8,9 @@ const EVENTS = Array.from({ length: 16 }, (_, index) => `Заказ № ${1040 +
8
8
  export default function ScrollContainerOverviewExample() {
9
9
  return (
10
10
  <Card.Root role="region" className={styles.card} aria-label="Лента событий">
11
- <Typography as="h3" variant="title-s" className={styles.cardTitle}>
12
- Лента событий
13
- </Typography>
11
+ <Card.Header>
12
+ <Card.Title>Лента событий</Card.Title>
13
+ </Card.Header>
14
14
  <ScrollContainer>
15
15
  <ul className={styles.list}>
16
16
  {EVENTS.map((event) => (
@@ -20,9 +20,12 @@ export default function ScrollContainerScrollbarExample() {
20
20
  return (
21
21
  <div className={styles.layout}>
22
22
  <Card.Root role="region" className={styles.card} aria-label="Клиенты">
23
- <Typography as="h3" variant="title-s" className={styles.cardTitle}>
24
- thin
25
- </Typography>
23
+ <Card.Header>
24
+ <Card.Title>Клиенты</Card.Title>
25
+ <Typography as="span" variant="caption" tone="muted">
26
+ thin
27
+ </Typography>
28
+ </Card.Header>
26
29
  <ScrollContainer>
27
30
  <ul className={styles.list}>
28
31
  {CLIENTS.map((client) => (
@@ -35,10 +38,13 @@ export default function ScrollContainerScrollbarExample() {
35
38
  </ul>
36
39
  </ScrollContainer>
37
40
  </Card.Root>
38
- <Card.Root role="region" className={styles.card} aria-label="Фильтры заказов">
39
- <Typography as="h3" variant="title-s" className={styles.cardTitle}>
40
- hidden
41
- </Typography>
41
+ <Card.Root role="region" className={styles.card} aria-label="Статусы заказов">
42
+ <Card.Header>
43
+ <Card.Title>Статусы заказов</Card.Title>
44
+ <Typography as="span" variant="caption" tone="muted">
45
+ hidden
46
+ </Typography>
47
+ </Card.Header>
42
48
  <ScrollContainer axis="horizontal" scrollbar="hidden">
43
49
  <div className={styles.strip}>
44
50
  {TAGS.map((tag) => (
@@ -10,10 +10,13 @@ const ROOMS = Array.from({ length: 16 }, (_, index) => `Зал ${index + 1}`);
10
10
  export default function ScrollContainerVariantsExample() {
11
11
  return (
12
12
  <div className={styles.layout}>
13
- <Card.Root role="region" className={styles.card} aria-label="Фильтры">
14
- <Typography as="h3" variant="title-s" className={styles.cardTitle}>
15
- horizontal
16
- </Typography>
13
+ <Card.Root role="region" className={styles.card} aria-label="Статусы заказов">
14
+ <Card.Header>
15
+ <Card.Title>Статусы заказов</Card.Title>
16
+ <Typography as="span" variant="caption" tone="muted">
17
+ horizontal
18
+ </Typography>
19
+ </Card.Header>
17
20
  <ScrollContainer axis="horizontal">
18
21
  <div className={styles.strip}>
19
22
  {TAGS.map((tag) => (
@@ -23,9 +26,12 @@ export default function ScrollContainerVariantsExample() {
23
26
  </ScrollContainer>
24
27
  </Card.Root>
25
28
  <Card.Root role="region" className={styles.card} aria-label="Расписание залов">
26
- <Typography as="h3" variant="title-s" className={styles.cardTitle}>
27
- both
28
- </Typography>
29
+ <Card.Header>
30
+ <Card.Title>Расписание залов</Card.Title>
31
+ <Typography as="span" variant="caption" tone="muted">
32
+ both
33
+ </Typography>
34
+ </Card.Header>
29
35
  <ScrollContainer
30
36
  axis="both"
31
37
  tabIndex={0}
@@ -192,14 +192,14 @@ Item DOM: `data-state`, `data-disabled`, `data-icon-only`, `data-two-line`, `dat
192
192
  |---|---|
193
193
  | [overview.tsx](examples/overview.tsx) | One value out of a few, with a sliding thumb on the chosen segment — `defaultValue`, `aria-label`. |
194
194
  | [sizes.tsx](examples/sizes.tsx) | Every size tier; the outer height equals the control height of the same tier — `size`. |
195
- | [states.tsx](examples/states.tsx) | No selection yet, a disabled segment and a disabled group next to the default — `disabled`. |
195
+ | [states.tsx](examples/states.tsx) | No selection yet, an invalid group, a disabled segment and a disabled group next to the default — `invalid`, `disabled`. |
196
196
  | [with-icon.tsx](examples/with-icon.tsx) | An icon before the label and square icon-only segments named for screen readers — `SegmentedControl.Icon`, `aria-label`. |
197
197
  | [colors.tsx](examples/colors.tsx) | A status per option: a dot of its hue before the label and a tinted thumb when chosen — `color`. |
198
198
  | [full-width.tsx](examples/full-width.tsx) | The group fills its column; segments tend to equal widths and a long label keeps its own — `fullWidth`. |
199
199
  | [scroll.tsx](examples/scroll.tsx) | Segments never wrap: in a column narrower than the row it scrolls with edge fades and brings the chosen segment into view. |
200
200
  | [two-line.tsx](examples/two-line.tsx) | A label and a counter on the first line, a metric on the second — `SegmentedControl.Label`, `SegmentedControl.Count`, `SegmentedControl.Description`. |
201
201
  | [controlled.tsx](examples/controlled.tsx) | The parent owns the choice and updates other content from it — `value`, `onValueChange`. |
202
- | [in-form.tsx](examples/in-form.tsx) | An expense form: the choice is a labelled field with a hint, checked on submit, its error leaves as soon as a segment is chosen — `label`, `hint`, `required`, `error`. |
202
+ | [in-form.tsx](examples/in-form.tsx) | An expense form: the choice is a labelled field with a hint, checked on submit, its error leaves as soon as a segment is chosen; an optional choice beside it — `label`, `hint`, `required`, `error`, `optional`. |
203
203
 
204
204
  ## Mistakes
205
205
  - Using it as tabs that show different panels → use `Tabs`.
@@ -1,4 +1,4 @@
1
- /** An expense form: the choice is a labelled field with a hint, checked on submit, its error leaves as soon as a segment is chosen — `label`, `hint`, `required`, `error`. */
1
+ /** An expense form: the choice is a labelled field with a hint, checked on submit, its error leaves as soon as a segment is chosen; an optional choice beside it — `label`, `hint`, `required`, `error`, `optional`. */
2
2
  import { Button, Input, SegmentedControl } from "prime-ui-kit";
3
3
  import * as React from "react";
4
4
 
@@ -36,6 +36,10 @@ export default function SegmentedControlInFormExample() {
36
36
  <SegmentedControl.Item value="project">Проекта</SegmentedControl.Item>
37
37
  <SegmentedControl.Item value="personal">Личный</SegmentedControl.Item>
38
38
  </SegmentedControl.Root>
39
+ <SegmentedControl.Root label="Возмещение" optional defaultValue="salary">
40
+ <SegmentedControl.Item value="salary">С зарплатой</SegmentedControl.Item>
41
+ <SegmentedControl.Item value="card">На карту</SegmentedControl.Item>
42
+ </SegmentedControl.Root>
39
43
  <Button.Root type="submit">Сохранить расход</Button.Root>
40
44
  </form>
41
45
  );
@@ -1,4 +1,4 @@
1
- /** No selection yet, a disabled segment and a disabled group next to the default — `disabled`. */
1
+ /** No selection yet, an invalid group, a disabled segment and a disabled group next to the default — `invalid`, `disabled`. */
2
2
  import { SegmentedControl, Typography } from "prime-ui-kit";
3
3
 
4
4
  export default function SegmentedControlStatesExample() {
@@ -22,6 +22,15 @@ export default function SegmentedControlStatesExample() {
22
22
  empty
23
23
  </Typography>
24
24
  </div>
25
+ <div>
26
+ <SegmentedControl.Root invalid aria-label="Статус кампании">
27
+ <SegmentedControl.Item value="active">Активные</SegmentedControl.Item>
28
+ <SegmentedControl.Item value="archived">Архив</SegmentedControl.Item>
29
+ </SegmentedControl.Root>
30
+ <Typography as="span" variant="caption" tone="muted">
31
+ invalid
32
+ </Typography>
33
+ </div>
25
34
  <div>
26
35
  <SegmentedControl.Root defaultValue="active" aria-label="Статус кампании">
27
36
  <SegmentedControl.Item value="active">Активные</SegmentedControl.Item>
@@ -295,7 +295,7 @@ No `variant` or `tone`. The trigger is the field look (fill, inset control borde
295
295
  |---|---|
296
296
  | [overview.tsx](examples/overview.tsx) | A labelled field with a placeholder; picking an option closes the list and shows its label — `label`, `placeholder`. |
297
297
  | [sizes.tsx](examples/sizes.tsx) | Every size tier; the label, the list rows and the hint take the tier of the field — `size`. |
298
- | [states.tsx](examples/states.tsx) | A default field next to a disabled, a loading, an invalid one and a list with nothing in it — `disabled`, `loading`, `invalid`, `labels`. |
298
+ | [states.tsx](examples/states.tsx) | A default field next to a disabled, a loading, an invalid one, a list with nothing in it and a field whose focus shows without the ring — `disabled`, `loading`, `invalid`, `labels`, `focusRing`. |
299
299
  | [validation.tsx](examples/validation.tsx) | Live validation: unassigning the owner shakes the field and drops the error in, picking someone clears it; required and optional markers and a hint — `required`, `optional`, `hint`, `error`. |
300
300
  | [with-icon.tsx](examples/with-icon.tsx) | A leading icon in the trigger and an icon before every option label — `Select.TriggerIcon`, `Select.ItemIcon`. |
301
301
  | [multiple.tsx](examples/multiple.tsx) | Several values: checkboxes in the list, the list stays open on a pick, labels joined in the trigger — `multiple`. |
@@ -16,7 +16,8 @@
16
16
 
17
17
  .formFields {
18
18
  display: grid;
19
- grid-template-columns: repeat(2, minmax(0, 1fr));
19
+ /* Two columns while each keeps 12rem, one column in a narrower form — from its own width. */
20
+ grid-template-columns: repeat(auto-fit, minmax(min(100%, calc(var(--prime-space-16) * 3)), 1fr));
20
21
  align-items: start;
21
22
  gap: var(--prime-space-5) var(--prime-space-4);
22
23
  }
@@ -27,9 +28,3 @@
27
28
  justify-content: flex-end;
28
29
  gap: var(--prime-space-2);
29
30
  }
30
-
31
- @media (max-width: 639px) {
32
- .formFields {
33
- grid-template-columns: minmax(0, 1fr);
34
- }
35
- }
@@ -1,4 +1,4 @@
1
- /** A default field next to a disabled, a loading, an invalid one and a list with nothing in it — `disabled`, `loading`, `invalid`, `labels`. */
1
+ /** A default field next to a disabled, a loading, an invalid one, a list with nothing in it and a field whose focus shows without the ring — `disabled`, `loading`, `invalid`, `labels`, `focusRing`. */
2
2
  import { Select } from "prime-ui-kit";
3
3
 
4
4
  const ROLES = [
@@ -62,6 +62,18 @@ export default function SelectStatesExample() {
62
62
  </Select.Trigger>
63
63
  <Select.Content>{null}</Select.Content>
64
64
  </Select.Root>
65
+ <Select.Root label="focusRing={false}" defaultValue="editor" focusRing={false}>
66
+ <Select.Trigger>
67
+ <Select.Value />
68
+ </Select.Trigger>
69
+ <Select.Content>
70
+ {ROLES.map((role) => (
71
+ <Select.Item key={role.value} value={role.value}>
72
+ {role.label}
73
+ </Select.Item>
74
+ ))}
75
+ </Select.Content>
76
+ </Select.Root>
65
77
  </>
66
78
  );
67
79
  }
@@ -198,6 +198,8 @@ Motion: the scrim fades, the sheet slides up over `slow` and down over `base` (`
198
198
  |---|---|
199
199
  | [overview.tsx](examples/overview.tsx) | Actions with an order raised from the bottom edge: a header names the order, a column of actions follows, and each action closes the sheet — `Sheet.Trigger`, `Sheet.Header`, `Sheet.Close`. |
200
200
  | [structure.tsx](examples/structure.tsx) | The content alone: a date sheet with no header and no footer, the calendar across its width, named by `aria-label`; a pick or a swipe down closes it — `aria-label`, `Sheet.Body`. |
201
+ | [header-actions.tsx](examples/header-actions.tsx) | The courier is at the door: an icon tile heads the sheet, the payment status and a ⋯ menu sit before the close button, and two equal buttons fill the footer — `Sheet.Icon`, `Sheet.Actions`, `layout`. |
202
+ | [guard.tsx](examples/guard.tsx) | A review form that holds the sheet: after an edit a swipe, the scrim, Escape and Cancel ask before discarding and the footer says so; sending locks every way out — `Sheet.Guard`, `Sheet.Meta`. |
201
203
  | [dismiss.tsx](examples/dismiss.tsx) | A handover the courier must answer: no swipe, scrim or Escape closes the sheet, only its two buttons — `closeOnOutsideClick`, `closeOnEscape`. |
202
204
  | [controlled-open.tsx](examples/controlled-open.tsx) | The parent owns the state and raises the sheet from a link in the text, without a trigger — `open`, `onOpenChange`. |
203
205
  | [in-form.tsx](examples/in-form.tsx) | A short form that needs an explicit submit: the one case for a footer, Cancel and Send under the field, an empty comment keeps the sheet open — `Sheet.Footer`, `error`. |
@@ -0,0 +1,72 @@
1
+ /** A review form that holds the sheet: after an edit a swipe, the scrim, Escape and Cancel ask before discarding and the footer says so; sending locks every way out — `Sheet.Guard`, `Sheet.Meta`. */
2
+ import { Button, Fieldset, Sheet, Textarea } from "prime-ui-kit";
3
+ import * as React from "react";
4
+
5
+ import styles from "./examples.module.css";
6
+
7
+ /** Pretends to send the review. */
8
+ function sendReview() {
9
+ return new Promise((resolve) => setTimeout(resolve, 1200));
10
+ }
11
+
12
+ export default function SheetGuardExample() {
13
+ const formId = React.useId();
14
+ const [open, setOpen] = React.useState(false);
15
+ const [dirty, setDirty] = React.useState(false);
16
+ const [sending, setSending] = React.useState(false);
17
+
18
+ const submit = async (event: React.FormEvent<HTMLFormElement>) => {
19
+ event.preventDefault();
20
+ setSending(true);
21
+ await sendReview();
22
+ setSending(false);
23
+ setDirty(false);
24
+ setOpen(false);
25
+ };
26
+
27
+ return (
28
+ <Sheet.Root
29
+ open={open}
30
+ onOpenChange={(next) => {
31
+ setOpen(next);
32
+ if (!next) setDirty(false);
33
+ }}
34
+ >
35
+ <Sheet.Trigger>
36
+ <Button.Root variant="soft" tone="neutral">
37
+ Отзыв о доставке
38
+ </Button.Root>
39
+ </Sheet.Trigger>
40
+ <Sheet.Content>
41
+ <Sheet.Guard busy={sending} dirty={dirty} />
42
+ <Sheet.Header>
43
+ <Sheet.Title>Отзыв о доставке</Sheet.Title>
44
+ <Sheet.Description>Заказ № 1042 · курьер Олег Р.</Sheet.Description>
45
+ </Sheet.Header>
46
+ <Sheet.Body>
47
+ <form id={formId} className={styles.form} onSubmit={submit}>
48
+ <Fieldset disabled={sending}>
49
+ <Textarea.Root
50
+ label="Что понравилось или нет"
51
+ name="review"
52
+ placeholder="Привёз вовремя, помог занести коробки"
53
+ onValueChange={() => setDirty(true)}
54
+ />
55
+ </Fieldset>
56
+ </form>
57
+ </Sheet.Body>
58
+ <Sheet.Footer>
59
+ {dirty ? <Sheet.Meta>Есть несохранённые изменения</Sheet.Meta> : null}
60
+ <Sheet.Close>
61
+ <Button.Root variant="outline" tone="neutral">
62
+ Отмена
63
+ </Button.Root>
64
+ </Sheet.Close>
65
+ <Button.Root type="submit" form={formId} loading={sending} disabled={!dirty}>
66
+ Отправить
67
+ </Button.Root>
68
+ </Sheet.Footer>
69
+ </Sheet.Content>
70
+ </Sheet.Root>
71
+ );
72
+ }
@@ -0,0 +1,56 @@
1
+ /** The courier is at the door: an icon tile heads the sheet, the payment status and a ⋯ menu sit before the close button, and two equal buttons fill the footer — `Sheet.Icon`, `Sheet.Actions`, `layout`. */
2
+ import { Badge, Button, Dropdown, Icon, Sheet, Typography } from "prime-ui-kit";
3
+
4
+ export default function SheetHeaderActionsExample() {
5
+ return (
6
+ <Sheet.Root>
7
+ <Sheet.Trigger>
8
+ <Button.Root variant="soft" tone="neutral">
9
+ Курьер на месте
10
+ </Button.Root>
11
+ </Sheet.Trigger>
12
+ <Sheet.Content>
13
+ <Sheet.Header>
14
+ <Sheet.Icon tone="info">
15
+ <Icon name="object.truck" />
16
+ </Sheet.Icon>
17
+ <Sheet.Title>Курьер у двери</Sheet.Title>
18
+ <Sheet.Description>Заказ № 1042 · 3 коробки</Sheet.Description>
19
+ <Sheet.Actions>
20
+ <Badge.Root color="green">Оплачен</Badge.Root>
21
+ <Dropdown.Root>
22
+ <Dropdown.Trigger>
23
+ <Button.Root variant="ghost" tone="neutral" aria-label="Действия с заказом">
24
+ <Button.Icon>
25
+ <Icon name="action.more" />
26
+ </Button.Icon>
27
+ </Button.Root>
28
+ </Dropdown.Trigger>
29
+ <Dropdown.Content>
30
+ <Dropdown.Item>Позвонить курьеру</Dropdown.Item>
31
+ <Dropdown.Item>Перенести доставку</Dropdown.Item>
32
+ <Dropdown.Separator />
33
+ <Dropdown.Item tone="danger">Отказаться от заказа</Dropdown.Item>
34
+ </Dropdown.Content>
35
+ </Dropdown.Root>
36
+ </Sheet.Actions>
37
+ </Sheet.Header>
38
+ <Sheet.Body>
39
+ <Typography variant="body-m" tone="secondary">
40
+ Проверьте коробки при курьере: после приёмки претензии к упаковке не принимаются.
41
+ </Typography>
42
+ </Sheet.Body>
43
+ <Sheet.Footer layout="fill">
44
+ <Sheet.Close>
45
+ <Button.Root variant="outline" tone="neutral">
46
+ Позже
47
+ </Button.Root>
48
+ </Sheet.Close>
49
+ <Sheet.Close>
50
+ <Button.Root>Принять заказ</Button.Root>
51
+ </Sheet.Close>
52
+ </Sheet.Footer>
53
+ </Sheet.Content>
54
+ </Sheet.Root>
55
+ );
56
+ }
@@ -166,13 +166,14 @@ Controlled: `value` + `onValueChange`. Uncontrolled: `defaultValue` (falls back
166
166
  | [overview.tsx](examples/overview.tsx) | A labelled slider with its current value — `label`, `showValue`. |
167
167
  | [variants.tsx](examples/variants.tsx) | Every fill color; accent by default, semantic tones when the value carries meaning — `tone`. |
168
168
  | [sizes.tsx](examples/sizes.tsx) | Every size; the thumb, the label and the value grow with the tier — `size`. |
169
- | [states.tsx](examples/states.tsx) | The fill at both ends and a disabled slider — `disabled`. |
169
+ | [states.tsx](examples/states.tsx) | The fill at both ends, an invalid slider and a disabled one — `invalid`, `disabled`. |
170
170
  | [orientation.tsx](examples/orientation.tsx) | Notification levels as a row of upright sliders, minimum at the bottom — `orientation`. |
171
171
  | [value-format.tsx](examples/value-format.tsx) | Units in the shown value that are also read by screen readers — `formatValue`, `showValue`. |
172
172
  | [range-step.tsx](examples/range-step.tsx) | Own bounds and a coarse or fractional step; a slider without a visible label — `min`, `max`, `step`, `aria-label`. |
173
173
  | [hint-and-error.tsx](examples/hint-and-error.tsx) | A slider framed like every field: required marker, a hint, and an error in its place — `required`, `hint`, `error`, `optional`. |
174
174
  | [autosave.tsx](examples/autosave.tsx) | A setting saved once the thumb is let go, not on every step: the thumb waits dimmed while it saves, and a value the server refuses glides back — `onCommit`, `hint`, `error`. |
175
175
  | [controlled.tsx](examples/controlled.tsx) | The parent owns the value and shares it with a number field for exact entry — `value`, `onValueChange`. |
176
+ | [in-form.tsx](examples/in-form.tsx) | Campaign limits submitted with the form by `name`, a calm note confirms the save — `name`, `label`. |
176
177
 
177
178
  ## Mistakes
178
179
  - `<Slider.Root>` → the slider is a single export: `<Slider />`.
@@ -22,3 +22,11 @@
22
22
  display: flex;
23
23
  gap: var(--prime-space-8);
24
24
  }
25
+
26
+ /* in-form.tsx: the submit row after the fields, the note beside the button. */
27
+ .actions {
28
+ display: flex;
29
+ flex-wrap: wrap;
30
+ align-items: center;
31
+ gap: var(--prime-space-3);
32
+ }