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,64 @@
1
+ /* Detail page: the header carries the title; two columns that wrap into one on narrow screens, no
2
+ breakpoints. */
3
+
4
+ /* Main column grows; the side column keeps ~18rem and drops below once main would get < 30rem. */
5
+ .columns {
6
+ display: flex;
7
+ flex-wrap: wrap;
8
+ align-items: flex-start;
9
+ gap: var(--prime-space-8) var(--prime-space-6);
10
+ }
11
+
12
+ .main {
13
+ flex: 999 1 calc(var(--prime-space-24) * 5);
14
+ }
15
+
16
+ .aside {
17
+ display: grid;
18
+ flex: 1 1 calc(var(--prime-space-24) * 3);
19
+ gap: var(--prime-space-4);
20
+ min-width: 0;
21
+ }
22
+
23
+ /* Totals under the table: the amounts end where the «Сумма» column ends (the table's cell padding). */
24
+ .totals {
25
+ display: grid;
26
+ gap: var(--prime-space-2);
27
+ justify-self: end;
28
+ width: min(100%, calc(var(--prime-space-24) * 3));
29
+ margin: 0;
30
+ padding-inline: var(--prime-table-cell-padding-x);
31
+ }
32
+
33
+ .totalRow {
34
+ display: flex;
35
+ justify-content: space-between;
36
+ gap: var(--prime-space-4);
37
+ }
38
+
39
+ .totalRow dd {
40
+ margin: 0;
41
+ }
42
+
43
+ .amount {
44
+ font-variant-numeric: tabular-nums;
45
+ white-space: nowrap;
46
+ }
47
+
48
+ /* Client card: who it is, then the facts as label → value pairs. */
49
+ .client {
50
+ display: grid;
51
+ gap: var(--prime-space-5);
52
+ }
53
+
54
+ .person {
55
+ display: flex;
56
+ align-items: center;
57
+ gap: var(--prime-space-3);
58
+ min-width: 0;
59
+ }
60
+
61
+ .personText {
62
+ display: grid;
63
+ min-width: 0;
64
+ }
@@ -0,0 +1,214 @@
1
+ /** A nested record: the path, the title with its status and due date and the record's actions by weight in the app header, a main column with the line items and a side column with the client's details and the history — `orientation`. */
2
+ import {
3
+ AppHeader,
4
+ Avatar,
5
+ Breadcrumb,
6
+ Button,
7
+ Card,
8
+ DataTable,
9
+ type DataTableColumn,
10
+ DescriptionList,
11
+ Dropdown,
12
+ Icon,
13
+ LinkButton,
14
+ PageContent,
15
+ PageToolbar,
16
+ Timeline,
17
+ Typography,
18
+ } from "prime-ui-kit";
19
+
20
+ import styles from "./screen.module.css";
21
+
22
+ type Line = { id: string; name: string; quantity: number; unit: string; price: number };
23
+
24
+ const LINES: Line[] = [
25
+ { id: "l1", name: "Лицензия CRM, тариф «Бизнес»", quantity: 25, unit: "мест", price: 12_000 },
26
+ { id: "l2", name: "Внедрение и настройка", quantity: 40, unit: "ч", price: 3_500 },
27
+ { id: "l3", name: "Обучение менеджеров", quantity: 2, unit: "дня", price: 18_000 },
28
+ ];
29
+
30
+ const HISTORY = [
31
+ { id: "h1", title: "Счёт открыт клиентом", date: "2 окт., 11:40" },
32
+ { id: "h2", title: "Отправлен на billing@veter.ru", date: "30 сент., 16:05" },
33
+ { id: "h3", title: "Создан · Анна Климова", date: "30 сент., 15:52" },
34
+ ];
35
+
36
+ const MONEY = new Intl.NumberFormat("ru-RU", {
37
+ style: "currency",
38
+ currency: "RUB",
39
+ maximumFractionDigits: 0,
40
+ });
41
+ const COUNT = new Intl.NumberFormat("ru-RU");
42
+
43
+ const NET = LINES.reduce((sum, line) => sum + line.quantity * line.price, 0);
44
+ const VAT = Math.round(NET * 0.2);
45
+
46
+ const TOTALS = [
47
+ { label: "Без НДС", value: MONEY.format(NET) },
48
+ { label: "НДС 20%", value: MONEY.format(VAT) },
49
+ ];
50
+
51
+ const COLUMNS: DataTableColumn<Line>[] = [
52
+ { id: "name", header: "Позиция", accessor: "name" },
53
+ {
54
+ id: "quantity",
55
+ header: "Кол-во",
56
+ numeric: true,
57
+ headerAlign: "end",
58
+ cell: (row) => `${COUNT.format(row.quantity)} ${row.unit}`,
59
+ },
60
+ {
61
+ id: "price",
62
+ header: "Цена",
63
+ numeric: true,
64
+ headerAlign: "end",
65
+ cell: (row) => MONEY.format(row.price),
66
+ },
67
+ {
68
+ id: "sum",
69
+ header: "Сумма",
70
+ numeric: true,
71
+ headerAlign: "end",
72
+ cell: (row) => MONEY.format(row.quantity * row.price),
73
+ },
74
+ ];
75
+
76
+ export default function DescriptionListScreenExample() {
77
+ return (
78
+ <>
79
+ {/* A nested record titles itself in the app header: the path up to the list, the record as the
80
+ only h1 with its status and due date under it, the record's actions in the tools row. */}
81
+ <AppHeader.Root>
82
+ <AppHeader.Start>
83
+ <Breadcrumb.Root>
84
+ <Breadcrumb.Item href="#invoices">Счета</Breadcrumb.Item>
85
+ </Breadcrumb.Root>
86
+ <AppHeader.Separator />
87
+ <AppHeader.Title>
88
+ Счёт № 2026-0418
89
+ <AppHeader.Description>Отправлен · оплатить до 14 октября</AppHeader.Description>
90
+ </AppHeader.Title>
91
+ </AppHeader.Start>
92
+ <AppHeader.Tools>
93
+ <PageToolbar.Root aria-label="Счёт № 2026-0418">
94
+ <PageToolbar.Actions>
95
+ <Dropdown.Root>
96
+ <Dropdown.Trigger>
97
+ <Button.Root variant="soft" tone="neutral" aria-label="Другие действия">
98
+ <Button.Icon>
99
+ <Icon name="action.more" />
100
+ </Button.Icon>
101
+ </Button.Root>
102
+ </Dropdown.Trigger>
103
+ <Dropdown.Content>
104
+ <Dropdown.Item>Дублировать</Dropdown.Item>
105
+ <Dropdown.Item>Скачать PDF</Dropdown.Item>
106
+ <Dropdown.Separator />
107
+ <Dropdown.Item tone="danger">Аннулировать счёт</Dropdown.Item>
108
+ </Dropdown.Content>
109
+ </Dropdown.Root>
110
+ <Button.Root variant="soft" tone="neutral" aria-label="Напомнить клиенту">
111
+ <Button.Icon>
112
+ <Icon name="action.send" />
113
+ </Button.Icon>
114
+ </Button.Root>
115
+ <Button.Root>Отметить оплату</Button.Root>
116
+ </PageToolbar.Actions>
117
+ </PageToolbar.Root>
118
+ </AppHeader.Tools>
119
+ </AppHeader.Root>
120
+
121
+ <PageContent.Root>
122
+ <PageContent.Body>
123
+ <div className={styles.columns}>
124
+ <PageContent.Section label="Позиции" className={styles.main}>
125
+ <DataTable
126
+ columns={COLUMNS}
127
+ rows={LINES}
128
+ getRowKey={(row) => row.id}
129
+ paging="none"
130
+ highlightRowOnHover={false}
131
+ />
132
+ {/* Totals line up with the «Сумма» column of the table above: a layout of its own. */}
133
+ <dl className={styles.totals}>
134
+ {TOTALS.map((row) => (
135
+ <div key={row.label} className={styles.totalRow}>
136
+ <dt>
137
+ <Typography variant="body-m" tone="secondary">
138
+ {row.label}
139
+ </Typography>
140
+ </dt>
141
+ <dd>
142
+ <Typography variant="body-m" className={styles.amount}>
143
+ {row.value}
144
+ </Typography>
145
+ </dd>
146
+ </div>
147
+ ))}
148
+ <div className={styles.totalRow}>
149
+ <dt>
150
+ <Typography variant="title-m">К оплате</Typography>
151
+ </dt>
152
+ <dd>
153
+ <Typography variant="title-m" className={styles.amount}>
154
+ {MONEY.format(NET + VAT)}
155
+ </Typography>
156
+ </dd>
157
+ </div>
158
+ </dl>
159
+ </PageContent.Section>
160
+ <aside className={styles.aside} aria-label="Клиент и история">
161
+ <Card.Root variant="panel">
162
+ <Card.Header>
163
+ <Card.Title as="h2">Клиент</Card.Title>
164
+ </Card.Header>
165
+ <Card.Body>
166
+ <div className={styles.client}>
167
+ <span className={styles.person}>
168
+ <Avatar.Root color="teal">
169
+ <Avatar.Fallback>СВ</Avatar.Fallback>
170
+ </Avatar.Root>
171
+ <span className={styles.personText}>
172
+ <Typography as="span" variant="title-s">
173
+ ООО «Северный ветер»
174
+ </Typography>
175
+ <Typography as="span" variant="caption" tone="muted">
176
+ ИНН 7704 512 908
177
+ </Typography>
178
+ </span>
179
+ </span>
180
+ <DescriptionList.Root orientation="vertical">
181
+ <DescriptionList.Item label="Контакт">
182
+ Ольга Мартынова, финансовый директор
183
+ </DescriptionList.Item>
184
+ <DescriptionList.Item label="Почта для счетов">
185
+ <LinkButton href="mailto:billing@veter.ru">billing@veter.ru</LinkButton>
186
+ </DescriptionList.Item>
187
+ </DescriptionList.Root>
188
+ </div>
189
+ </Card.Body>
190
+ </Card.Root>
191
+ <Card.Root variant="panel">
192
+ <Card.Header>
193
+ <Card.Title as="h2">История</Card.Title>
194
+ </Card.Header>
195
+ <Card.Body>
196
+ <Timeline.Root>
197
+ <Timeline.Group>
198
+ {HISTORY.map((event) => (
199
+ <Timeline.Item key={event.id}>
200
+ <Timeline.Title>{event.title}</Timeline.Title>
201
+ <Timeline.Meta>{event.date}</Timeline.Meta>
202
+ </Timeline.Item>
203
+ ))}
204
+ </Timeline.Group>
205
+ </Timeline.Root>
206
+ </Card.Body>
207
+ </Card.Root>
208
+ </aside>
209
+ </div>
210
+ </PageContent.Body>
211
+ </PageContent.Root>
212
+ </>
213
+ );
214
+ }
@@ -13,7 +13,7 @@ export default function DescriptionListStructureExample() {
13
13
  <DescriptionList.Item label="Договор">
14
14
  <LinkButton href="#contract-118">Договор № 118 от 12 марта</LinkButton>
15
15
  </DescriptionList.Item>
16
- <DescriptionList.Item label="Email">
16
+ <DescriptionList.Item label="Почта">
17
17
  finance@severny-veter.ru
18
18
  <DescriptionList.ItemAction
19
19
  label="Написать"
@@ -109,6 +109,7 @@ No `variant` or `tone`.
109
109
 
110
110
  ## Layout & spacing
111
111
  - The field hugs its cells (label left-aligned above them); with `fullWidth` it fills the container.
112
+ - The code is always one row: in a container narrower than the row the cells narrow and keep the tier height, so no digit or group wraps to a second line.
112
113
  - Label → cells: tier `label-gap`; cells → hint: tier `hint-gap` — the same rhythm as every field.
113
114
  - Put the submit button below or next to the code; with the same `size` it lines up with the cells.
114
115
 
@@ -145,11 +146,12 @@ No `variant` or `tone`.
145
146
  |---|---|
146
147
  | [overview.tsx](examples/overview.tsx) | A six-digit code from SMS with its label and a hint — `label`, `hint`, `length`. |
147
148
  | [sizes.tsx](examples/sizes.tsx) | Every size; the cell is a square on its own scale, two steps above the control heights — `size`. |
148
- | [states.tsx](examples/states.tsx) | A default code next to a disabled one — `disabled`. |
149
+ | [states.tsx](examples/states.tsx) | A default code next to a disabled one, an invalid one with no message and an accepted one — `disabled`, `invalid`, `success`. |
149
150
  | [validation.tsx](examples/validation.tsx) | A confirmation code checked once it is complete: a wrong code shakes in with one message and leaves as soon as you type again; a hint and an optional code — `required`, `optional`, `hint`, `error`. |
150
151
  | [grouped.tsx](examples/grouped.tsx) | A long code read in chunks with a wider gap between groups — `groupSize`. |
151
152
  | [full-width.tsx](examples/full-width.tsx) | Cells that share the container width and keep the tier height, above a full-width button — `fullWidth`. |
152
153
  | [on-complete.tsx](examples/on-complete.tsx) | The code is checked on the server as soon as the last cell is filled: the cells wait, a right one turns them success, a wrong one clears them and shakes in the reason — `onComplete`, `hint`. |
154
+ | [without-focus-ring.tsx](examples/without-focus-ring.tsx) | The one code on a pickup point screen, where the caret and the lighter fill of the entry cell show focus — `focusRing`. |
153
155
  | [controlled.tsx](examples/controlled.tsx) | The parent owns the code and clears it with a button — `value`, `onValueChange`. |
154
156
  | [in-form.tsx](examples/in-form.tsx) | A masked card PIN submitted with a form; a short or wrong PIN shakes in an error that leaves when you type again — `name`, `mask`, `required`, `error`. |
155
157
 
@@ -1,4 +1,4 @@
1
- /** A default code next to a disabled one — `disabled`. */
1
+ /** A default code next to a disabled one, an invalid one with no message and an accepted one — `disabled`, `invalid`, `success`. */
2
2
  import { DigitInput } from "prime-ui-kit";
3
3
 
4
4
  export default function DigitInputStatesExample() {
@@ -6,6 +6,8 @@ export default function DigitInputStatesExample() {
6
6
  <>
7
7
  <DigitInput label="default" defaultValue="42" />
8
8
  <DigitInput label="disabled" defaultValue="42" disabled />
9
+ <DigitInput label="invalid" defaultValue="4271" invalid />
10
+ <DigitInput label="success" defaultValue="4821" success hint="Код подтверждён" />
9
11
  </>
10
12
  );
11
13
  }
@@ -0,0 +1,13 @@
1
+ /** The one code on a pickup point screen, where the caret and the lighter fill of the entry cell show focus — `focusRing`. */
2
+ import { DigitInput } from "prime-ui-kit";
3
+
4
+ export default function DigitInputWithoutFocusRingExample() {
5
+ return (
6
+ <DigitInput
7
+ label="Код выдачи заказа"
8
+ hint="Покупатель называет его на кассе"
9
+ length={6}
10
+ focusRing={false}
11
+ />
12
+ );
13
+ }
@@ -10,7 +10,7 @@ export default function DividerWithIconExample() {
10
10
  Безопасность
11
11
  </Divider>
12
12
  <Typography as="span" variant="caption" tone="muted">
13
- иконка и подпись
13
+ Icon · children
14
14
  </Typography>
15
15
  </div>
16
16
  <div>
@@ -18,7 +18,7 @@ export default function DividerWithIconExample() {
18
18
  <Icon name="status.locked" />
19
19
  </Divider>
20
20
  <Typography as="span" variant="caption" tone="muted">
21
- только иконка
21
+ Icon · aria-label
22
22
  </Typography>
23
23
  </div>
24
24
  </div>
@@ -103,7 +103,7 @@ Generic `Dnd.Draggable<TData>`; `ref` → `HTMLElement`. An item carried onto a
103
103
  | `as` | `"div" \| "li" \| "span" \| "article" \| "section"` | `"div"` | Element. |
104
104
  | `onDragStart` | `(item, point, origin) => void` | — | Fired once the press became a drag. |
105
105
  | `onDragEnd` | `(item, outcome: "drop" \| "release" \| "cancel") => void` | — | Always fired at the end. |
106
- | `…rest` | `Omit<HTMLAttributes<HTMLElement>, "id">` | — | `className` and the other attributes. |
106
+ | `…rest` | `Omit<HTMLAttributes<HTMLElement>, "id" \| "onDragStart" \| "onDragEnd">` | — | `className` and the other attributes. |
107
107
 
108
108
  ### Dnd.DropZone
109
109
  Generic `Dnd.DropZone<TData>`; `ref` → `HTMLElement`. Renders the `as` element; state is mirrored by `data-dnd-over`, `data-dnd-reject`, `data-dnd-flash`. Where zones overlap, the innermost wins.
@@ -238,7 +238,9 @@ An item's own `onPointerDown` / `onKeyDown` run before the kit's: `preventDefaul
238
238
  | [grid.tsx](examples/grid.tsx) | Product photos in a wrapping grid: a photo carried across rows lands in reading order, the gap takes a cell, Alt + ← / → steps it one place — `axis`. |
239
239
  | [locked.tsx](examples/locked.tsx) | Sections of a workspace menu: the home section is pinned first with a lock in place of its grip, the rest reorder around nothing past it; each row is named by its visible title — `locked`, `handle`, `aria-labelledby`. |
240
240
  | [board.tsx](examples/board.tsx) | A ticket board: columns share one kind, so a ticket lands in another column at an exact position or moves there with Alt + ← / →, an empty column says so, and a full column refuses it before the release with the reason under the ticket — `kind`, `canDrop`, `empty`, `onReorder`. |
241
- | [drop-zones.tsx](examples/drop-zones.tsx) | Documents carried onto folders: a zone takes items by kind, a locked folder refuses before the release and says why under the carried file, the target flashes where the file landed — `Dnd.Draggable`, `Dnd.DropZone`, `canDrop`, `flashOnDrop`. |
241
+ | [drop-zones.tsx](examples/drop-zones.tsx) | Documents carried onto folders: a zone takes items by kind and gets the document as data, a locked folder refuses before the release and says why under the carried file, a syncing folder is no target at all, a document on signing stays put, the line above follows the drag, the target flashes where the file landed — `Dnd.Draggable`, `Dnd.DropZone`, `data`, `canDrop`, `disabled`, `onDragStart`, `onDragEnd`, `onEnter`, `onLeave`, `flashOnDrop`. |
242
+ | [table.tsx](examples/table.tsx) | A project estimate as a table: each stage is its own body of rows under a heading row that never moves, a row is carried by its grip within a stage or into another, and the rows stay table rows — `as`, `header`, `kind`, `handle`. |
243
+ | [states.tsx](examples/states.tsx) | A contract's approval route: a step already signed stays where it is while the rest reorder around it, and once the route is approved the whole list holds still — `Dnd.SortableItem`, `Dnd.Sortable`, `disabled`. |
242
244
  | [narrow.tsx](examples/narrow.tsx) | A row of status filters in a 320 px strip: tags reorder sideways and the strip scrolls when a tag is held near its edge — `axis`. |
243
245
 
244
246
  ## Mistakes
@@ -1,81 +1,114 @@
1
- /** Documents carried onto folders: a zone takes items by kind, a locked folder refuses before the release and says why under the carried file, the target flashes where the file landed — `Dnd.Draggable`, `Dnd.DropZone`, `canDrop`, `flashOnDrop`. */
1
+ /** Documents carried onto folders: a zone takes items by kind and gets the document as data, a locked folder refuses before the release and says why under the carried file, a syncing folder is no target at all, a document on signing stays put, the line above follows the drag, the target flashes where the file landed — `Dnd.Draggable`, `Dnd.DropZone`, `data`, `canDrop`, `disabled`, `onDragStart`, `onDragEnd`, `onEnter`, `onLeave`, `flashOnDrop`. */
2
2
  import { Badge, Dnd, Typography } from "prime-ui-kit";
3
3
  import * as React from "react";
4
4
 
5
5
  import styles from "./examples.module.css";
6
6
 
7
- type Folder = "inbox" | "contracts" | "archive";
8
- type Paper = { id: string; title: string; folder: Folder };
7
+ type Folder = "inbox" | "contracts" | "accounting" | "archive";
8
+ type Paper = { id: string; title: string; folder: Folder; signing?: boolean };
9
9
 
10
- const FOLDERS: { id: Folder; title: string; locked?: boolean }[] = [
10
+ /** `locked` refuses with a reason; `syncing` is no target at all while it syncs. */
11
+ const FOLDERS: { id: Folder; title: string; locked?: boolean; syncing?: boolean }[] = [
11
12
  { id: "contracts", title: "Договоры" },
13
+ { id: "accounting", title: "Бухгалтерия (синхронизация)", syncing: true },
12
14
  { id: "archive", title: "Архив (закрыт для записи)", locked: true },
13
15
  ];
14
16
 
15
17
  const DOCUMENTS: Paper[] = [
16
18
  { id: "d1", title: "Договор поставки № 14", folder: "inbox" },
17
19
  { id: "d2", title: "Акт сверки за квартал", folder: "inbox" },
18
- { id: "d3", title: "Счёт на оплату", folder: "inbox" },
20
+ { id: "d3", title: "Счёт на оплату № 482", folder: "inbox", signing: true },
19
21
  ];
20
22
 
21
23
  export default function DndDropZonesExample() {
22
24
  const [documents, setDocuments] = React.useState(DOCUMENTS);
25
+ const [carried, setCarried] = React.useState<string | null>(null);
26
+ const [target, setTarget] = React.useState<string | null>(null);
23
27
  const inFolder = (folder: Folder) => documents.filter((doc) => doc.folder === folder);
24
28
 
29
+ const status =
30
+ carried === null
31
+ ? "Перетащите документ в папку"
32
+ : target === null
33
+ ? `«${carried}» — отпустите над папкой`
34
+ : `«${carried}» → ${target}`;
35
+
25
36
  return (
26
37
  <Dnd.Root>
27
- <div className={styles.board}>
28
- <section className={styles.column} aria-label="Входящие">
29
- <div className={styles.columnHeader}>
30
- <Typography as="h4" variant="title-s">
31
- Входящие
32
- </Typography>
33
- <Badge.Root>{inFolder("inbox").length}</Badge.Root>
34
- </div>
35
- {inFolder("inbox").map((doc) => (
36
- <Dnd.Draggable
37
- key={doc.id}
38
- kind="document"
39
- id={doc.id}
40
- label={doc.title}
41
- className={styles.ticket}
42
- >
43
- <Typography as="span" variant="body-m">
44
- {doc.title}
45
- </Typography>
46
- </Dnd.Draggable>
47
- ))}
48
- </section>
49
- {FOLDERS.map((folder) => (
50
- <Dnd.DropZone
51
- key={folder.id}
52
- as="section"
53
- aria-label={folder.title}
54
- accepts="document"
55
- flashOnDrop
56
- className={styles.column}
57
- canDrop={() => (folder.locked ? "Архив только для чтения" : true)}
58
- onDrop={(item) =>
59
- setDocuments((current) =>
60
- current.map((doc) => (doc.id === item.id ? { ...doc, folder: folder.id } : doc)),
61
- )
62
- }
63
- >
38
+ <div className={styles.stage}>
39
+ <Typography as="p" variant="body-s" tone="muted">
40
+ {status}
41
+ </Typography>
42
+ <div className={styles.board}>
43
+ <section className={styles.column} aria-label="Входящие">
64
44
  <div className={styles.columnHeader}>
65
45
  <Typography as="h4" variant="title-s">
66
- {folder.title}
46
+ Входящие
67
47
  </Typography>
68
- <Badge.Root>{inFolder(folder.id).length}</Badge.Root>
48
+ <Badge.Root>{inFolder("inbox").length}</Badge.Root>
69
49
  </div>
70
- {inFolder(folder.id).map((doc) => (
71
- <div key={doc.id} className={styles.ticket}>
50
+ {inFolder("inbox").map((doc) => (
51
+ <Dnd.Draggable
52
+ key={doc.id}
53
+ kind="document"
54
+ id={doc.id}
55
+ data={doc}
56
+ label={doc.title}
57
+ disabled={doc.signing}
58
+ className={styles.ticket}
59
+ onDragStart={(item) => setCarried(item.label)}
60
+ onDragEnd={() => {
61
+ setCarried(null);
62
+ setTarget(null);
63
+ }}
64
+ >
72
65
  <Typography as="span" variant="body-m">
73
66
  {doc.title}
74
67
  </Typography>
75
- </div>
68
+ {doc.signing ? (
69
+ <Badge.Root color="orange" className={styles.badge}>
70
+ На подписи
71
+ </Badge.Root>
72
+ ) : null}
73
+ </Dnd.Draggable>
76
74
  ))}
77
- </Dnd.DropZone>
78
- ))}
75
+ </section>
76
+ {FOLDERS.map((folder) => (
77
+ <Dnd.DropZone<Paper>
78
+ key={folder.id}
79
+ as="section"
80
+ aria-label={folder.title}
81
+ accepts="document"
82
+ flashOnDrop
83
+ disabled={folder.syncing}
84
+ className={styles.column}
85
+ canDrop={() => (folder.locked ? "Архив только для чтения" : true)}
86
+ onEnter={() => setTarget(folder.title)}
87
+ onLeave={() => setTarget(null)}
88
+ onDrop={(item) =>
89
+ setDocuments((current) =>
90
+ current.map((doc) =>
91
+ doc.id === item.data.id ? { ...doc, folder: folder.id } : doc,
92
+ ),
93
+ )
94
+ }
95
+ >
96
+ <div className={styles.columnHeader}>
97
+ <Typography as="h4" variant="title-s">
98
+ {folder.title}
99
+ </Typography>
100
+ <Badge.Root>{inFolder(folder.id).length}</Badge.Root>
101
+ </div>
102
+ {inFolder(folder.id).map((doc) => (
103
+ <div key={doc.id} className={styles.ticket}>
104
+ <Typography as="span" variant="body-m">
105
+ {doc.title}
106
+ </Typography>
107
+ </div>
108
+ ))}
109
+ </Dnd.DropZone>
110
+ ))}
111
+ </div>
79
112
  </div>
80
113
  </Dnd.Root>
81
114
  );
@@ -48,6 +48,19 @@
48
48
  background: var(--prime-color-fill-muted);
49
49
  }
50
50
 
51
+ /* drop-zones.tsx: the drag status line above the board. */
52
+ .stage {
53
+ display: flex;
54
+ flex-direction: column;
55
+ gap: var(--prime-space-3);
56
+ width: 100%;
57
+ }
58
+
59
+ /* A status badge keeps its own width inside a ticket. */
60
+ .badge {
61
+ align-self: flex-start;
62
+ }
63
+
51
64
  .columnHeader {
52
65
  display: flex;
53
66
  align-items: center;
@@ -94,6 +107,43 @@
94
107
  text-align: center;
95
108
  }
96
109
 
110
+ /* table.tsx: a plain table whose bodies are sortable lists; rows sit on faint dividers. */
111
+ .table {
112
+ width: 100%;
113
+ max-width: calc(var(--prime-space-24) * 6);
114
+ border-collapse: collapse;
115
+ }
116
+
117
+ .caption {
118
+ padding-block-end: var(--prime-space-3);
119
+ text-align: start;
120
+ }
121
+
122
+ .cell,
123
+ .numeric,
124
+ .grip,
125
+ .groupCell {
126
+ padding: var(--prime-space-2) var(--prime-space-3);
127
+ border-block-end: var(--prime-border-width) solid var(--prime-color-border-subtle);
128
+ text-align: start;
129
+ vertical-align: middle;
130
+ }
131
+
132
+ .numeric {
133
+ text-align: end;
134
+ }
135
+
136
+ .grip {
137
+ inline-size: var(--prime-space-10);
138
+ padding-inline-end: 0;
139
+ }
140
+
141
+ /* A stage's heading row: a fill marks where a new stage starts. */
142
+ .groupCell {
143
+ padding-block-start: var(--prime-space-4);
144
+ background: var(--prime-color-fill-muted);
145
+ }
146
+
97
147
  /* 320 px strip; the padding keeps room for the focus ring of the first and last tag. */
98
148
  .strip {
99
149
  width: min(100%, calc(var(--prime-space-20) * 4));
@@ -0,0 +1,54 @@
1
+ /** A contract's approval route: a step already signed stays where it is while the rest reorder around it, and once the route is approved the whole list holds still — `Dnd.SortableItem`, `Dnd.Sortable`, `disabled`. */
2
+ import { Badge, Dnd, moveBefore, Switch, Typography } from "prime-ui-kit";
3
+ import * as React from "react";
4
+
5
+ import styles from "./examples.module.css";
6
+
7
+ type Step = { id: string; title: string; person: string; signed?: boolean };
8
+
9
+ const ROUTE: Step[] = [
10
+ { id: "lawyer", title: "Юрист", person: "Ольга Белова", signed: true },
11
+ { id: "finance", title: "Финансовый отдел", person: "Илья Петров" },
12
+ { id: "security", title: "Служба безопасности", person: "Марат Хасанов" },
13
+ { id: "director", title: "Директор", person: "Анна Климова" },
14
+ ];
15
+
16
+ export default function DndStatesExample() {
17
+ const [steps, setSteps] = React.useState(ROUTE);
18
+ const [approved, setApproved] = React.useState(false);
19
+
20
+ return (
21
+ <div className={styles.stage}>
22
+ <Switch.Root checked={approved} onCheckedChange={setApproved}>
23
+ <Switch.Label>Маршрут утверждён</Switch.Label>
24
+ </Switch.Root>
25
+ <Dnd.Root>
26
+ <Dnd.Sortable
27
+ as="ol"
28
+ aria-label="Маршрут согласования"
29
+ className={styles.list}
30
+ disabled={approved}
31
+ items={steps}
32
+ getId={(step) => step.id}
33
+ getLabel={(step) => step.title}
34
+ onReorder={(id, beforeId) =>
35
+ setSteps((current) => moveBefore(current, id, beforeId, (step) => step.id))
36
+ }
37
+ renderItem={(step) => (
38
+ <Dnd.SortableItem id={step.id} disabled={step.signed} className={styles.row}>
39
+ <span className={styles.rowText}>
40
+ <Typography as="span" variant="body-m">
41
+ {step.title}
42
+ </Typography>
43
+ <Typography as="span" variant="caption" tone="muted">
44
+ {step.person}
45
+ </Typography>
46
+ </span>
47
+ {step.signed ? <Badge.Root color="green">Подписано</Badge.Root> : null}
48
+ </Dnd.SortableItem>
49
+ )}
50
+ />
51
+ </Dnd.Root>
52
+ </div>
53
+ );
54
+ }