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
@@ -1,4 +1,4 @@
1
- /** A default field next to a disabled and a read-only one — `disabled`, `readOnly`. */
1
+ /** A default field next to a disabled, a read-only and an invalid one with no message — `disabled`, `readOnly`, `invalid`. */
2
2
  import { Icon, Input } from "prime-ui-kit";
3
3
 
4
4
  export default function InputStatesExample() {
@@ -22,6 +22,11 @@ export default function InputStatesExample() {
22
22
  </Input.Icon>
23
23
  </Input.Wrapper>
24
24
  </Input.Root>
25
+ <Input.Root label="invalid" invalid>
26
+ <Input.Wrapper>
27
+ <Input.Field type="tel" defaultValue="+7 900 12" />
28
+ </Input.Wrapper>
29
+ </Input.Root>
25
30
  </>
26
31
  );
27
32
  }
@@ -222,12 +222,13 @@ A card's own `onKeyDown` runs before the board's: `preventDefault()` in it keeps
222
222
  | [structure.tsx](examples/structure.tsx) | Cards take only the parts they need: a title alone, a meta line, labels, a footer with counts and an assignee — `Kanban.ItemTitle`, `Kanban.ItemDescription`, `Kanban.ItemBadges`, `Kanban.ItemFooter`, `Kanban.ItemCount`. |
223
223
  | [cards.tsx](examples/cards.tsx) | Three kinds of cards on one board: a plain note, a ticket with a header row of key and priority, a design task with a cover — `Kanban.ItemHeader`, `Thumbnail`, `Kanban.ItemFooter`. |
224
224
  | [limits.tsx](examples/limits.tsx) | A support queue with a work-in-progress limit and a workflow rule, its columns drawn as wells so each reads as a bounded queue: a full column and a blocked ticket are refused before the release with the reason under the card, from the keyboard too — `limit`, `canDrop`, `variant`. |
225
- | [columns.tsx](examples/columns.tsx) | A sales pipeline whose stages move by the grip in their header while the first and the last stay locked; each stage carries its color on the count, a rule and its figures under the title, and is edited in a popover — `reorderableColumns`, `onColumnOrderChange`, `locked`, `color`, `description`, `renderColumnMeta`, `renderColumnActions`. |
225
+ | [columns.tsx](examples/columns.tsx) | A sales pipeline whose stages move by the grip in their header while the first and the last stay locked; each stage carries its color on the count, a rule and its figures under the title, and is edited in a popover; the page keeps the order — `reorderableColumns`, `columnOrder`, `onColumnOrderChange`, `locked`, `color`, `description`, `renderColumnMeta`, `renderColumnActions`. |
226
226
  | [saving.tsx](examples/saving.tsx) | Every move is saved on the server: the card waits busy in its new place, and an invoice the server refuses to close glides back to its column — `onValueChange`. |
227
227
  | [item-link.tsx](examples/item-link.tsx) | Tickets that open: each card is a link to its page, so ⌘-click or a middle click opens a new tab, a plain click, Enter or Space opens it in place, and a drag only moves it — `getItemHref`, `onItemClick`. |
228
- | [states.tsx](examples/states.tsx) | Loading draws skeleton cards in the card geometry and cross-fades the cards in; an empty column keeps its drop area; a read-only board drags nothing — `loading`, `disabled`. |
228
+ | [states.tsx](examples/states.tsx) | Loading draws skeleton cards in the card geometry and cross-fades the cards in; an empty column keeps its drop area; a closed order stays in place while the rest move; a read-only board drags nothing — `loading`, `disabled`. |
229
229
  | [controlled.tsx](examples/controlled.tsx) | The placement lives in the parent: every move arrives with its source, target and position to save, and a button resets the board — `value`, `onValueChange`. |
230
230
  | [narrow.tsx](examples/narrow.tsx) | On a phone-width screen a column takes 85% of the board and snaps into place, so the next one peeks; the strip scrolls inside the board, never the page. |
231
+ | [screen.tsx](examples/screen.tsx) | A sales pipeline as a work screen: the title with the open deals and their sum, search, filter, the board / list switch and the one primary action in the app header, a full-height Kanban of deals by stage with totals, moves saved on the server that can be refused, and the deal in a Drawer — `value`, `onValueChange`, `renderColumnMeta`, `onItemClick`. |
231
232
 
232
233
  ## Mistakes
233
234
  - Returning something other than `Kanban.Item` from `renderItem` → the card does not drag and Alt + arrows do nothing.
@@ -1,4 +1,4 @@
1
- /** A sales pipeline whose stages move by the grip in their header while the first and the last stay locked; each stage carries its color on the count, a rule and its figures under the title, and is edited in a popover — `reorderableColumns`, `onColumnOrderChange`, `locked`, `color`, `description`, `renderColumnMeta`, `renderColumnActions`. */
1
+ /** A sales pipeline whose stages move by the grip in their header while the first and the last stay locked; each stage carries its color on the count, a rule and its figures under the title, and is edited in a popover; the page keeps the order — `reorderableColumns`, `columnOrder`, `onColumnOrderChange`, `locked`, `color`, `description`, `renderColumnMeta`, `renderColumnActions`. */
2
2
  import {
3
3
  Button,
4
4
  ColorSwatches,
@@ -52,6 +52,8 @@ const DEALS: Deal[] = [
52
52
  { id: "DL-296", client: "ГК «Меридиан»", amount: 2_750_000 },
53
53
  ];
54
54
 
55
+ const INITIAL_ORDER = COLUMNS.map((column) => column.id);
56
+
55
57
  const PLACEMENT: KanbanValue = {
56
58
  lead: ["DL-318", "DL-322"],
57
59
  demo: ["DL-309"],
@@ -77,7 +79,7 @@ const dealsWord = (count: number) => {
77
79
  export default function KanbanColumnsExample() {
78
80
  const [columns, setColumns] = React.useState(COLUMNS);
79
81
  const [placement, setPlacement] = React.useState<KanbanValue>(PLACEMENT);
80
- const [savedOrder, setSavedOrder] = React.useState<readonly string[] | null>(null);
82
+ const [order, setOrder] = React.useState<readonly string[]>(INITIAL_ORDER);
81
83
 
82
84
  const updateColumn = (id: string, patch: Partial<KanbanColumn>) =>
83
85
  setColumns((current) =>
@@ -95,8 +97,8 @@ export default function KanbanColumnsExample() {
95
97
  return (
96
98
  <div className={styles.stage}>
97
99
  <Typography as="span" variant="body-s" tone="muted" aria-live="polite">
98
- {savedOrder
99
- ? `Порядок этапов сохранён: ${savedOrder.map(titleOf).filter(Boolean).join(" → ")}`
100
+ {order !== INITIAL_ORDER
101
+ ? `Порядок этапов сохранён: ${order.map(titleOf).filter(Boolean).join(" → ")}`
100
102
  : "Перетащите этап за ручку в шапке или нажмите на ней Alt + ← / →"}
101
103
  </Typography>
102
104
  <Kanban.Root
@@ -109,7 +111,8 @@ export default function KanbanColumnsExample() {
109
111
  value={placement}
110
112
  onValueChange={setPlacement}
111
113
  reorderableColumns
112
- onColumnOrderChange={setSavedOrder}
114
+ columnOrder={order}
115
+ onColumnOrderChange={setOrder}
113
116
  renderColumnMeta={figures}
114
117
  renderColumnActions={(column) => (
115
118
  <Popover.Root>
@@ -0,0 +1,17 @@
1
+ /* Kanban board: a work screen — the header carries the title and the tools, the page fills the app
2
+ panel (`AppShell.Root fillViewport` + `PageContent.Root fill`) and the board or the list takes
3
+ the free height; every column scrolls inside the board, never the page. */
4
+
5
+ /* Company cell: the name over the deal id. */
6
+ .company {
7
+ display: grid;
8
+ white-space: nowrap;
9
+ }
10
+
11
+ /* Owner: avatar, then the name. */
12
+ .owner {
13
+ display: inline-flex;
14
+ align-items: center;
15
+ gap: var(--prime-space-2);
16
+ white-space: nowrap;
17
+ }
@@ -1,5 +1,6 @@
1
- /** A sales pipeline board: header with one primary action, search and filter with a board / list switch, a Kanban of deals by stage with totals, moves saved on the server that can be refused, movable stages and the deal in a Drawer. */
1
+ /** A sales pipeline as a work screen: the title with the open deals and their sum, search, filter, the board / list switch and the one primary action in the app header, a full-height Kanban of deals by stage with totals, moves saved on the server that can be refused, and the deal in a Drawer — `value`, `onValueChange`, `renderColumnMeta`, `onItemClick`. */
2
2
  import {
3
+ AppHeader,
3
4
  Avatar,
4
5
  Badge,
5
6
  Button,
@@ -27,7 +28,7 @@ import {
27
28
  } from "prime-ui-kit";
28
29
  import * as React from "react";
29
30
 
30
- import styles from "./kanban-board.module.css";
31
+ import styles from "./screen.module.css";
31
32
 
32
33
  type Owner = { name: string; initials: string; color: PaletteColor };
33
34
 
@@ -41,25 +42,17 @@ type Deal = {
41
42
  source: string;
42
43
  probability: number;
43
44
  contract: boolean;
44
- comments: number;
45
- tags: { text: string; color: PaletteColor }[];
46
45
  };
47
46
 
48
47
  type DealRow = Deal & { stage: string };
49
48
 
50
- /** The stages of the pipeline; the first and the last are system stages and stay in place. */
49
+ /** The stages of the pipeline, in order; the stage color repeats on its count and its Badge. */
51
50
  const STAGES: KanbanColumn[] = [
52
- {
53
- id: "new",
54
- title: "Новая",
55
- description: "Связаться в течение дня",
56
- color: "blue",
57
- locked: true,
58
- },
59
- { id: "qualified", title: "Квалификация", description: "Бюджет и сроки", color: "purple" },
60
- { id: "proposal", title: "Предложение", description: "КП отправлено", color: "orange" },
61
- { id: "negotiation", title: "Переговоры", description: "Условия договора", color: "yellow" },
62
- { id: "won", title: "Выиграна", description: "Договор подписан", color: "green", locked: true },
51
+ { id: "new", title: "Новая", color: "blue" },
52
+ { id: "qualified", title: "Квалификация", color: "purple" },
53
+ { id: "proposal", title: "Предложение", color: "orange" },
54
+ { id: "negotiation", title: "Переговоры", color: "yellow" },
55
+ { id: "won", title: "Выиграна", color: "green" },
63
56
  ];
64
57
 
65
58
  const ANNA: Owner = { name: "Анна Климова", initials: "АК", color: "purple" };
@@ -77,8 +70,6 @@ const DEALS: Deal[] = [
77
70
  source: "Сайт",
78
71
  probability: 20,
79
72
  contract: false,
80
- comments: 2,
81
- tags: [{ text: "Входящая", color: "sky" }],
82
73
  },
83
74
  {
84
75
  id: "DL-338",
@@ -90,8 +81,6 @@ const DEALS: Deal[] = [
90
81
  source: "Выставка",
91
82
  probability: 25,
92
83
  contract: false,
93
- comments: 0,
94
- tags: [{ text: "Тендер", color: "blue" }],
95
84
  },
96
85
  {
97
86
  id: "DL-332",
@@ -103,8 +92,6 @@ const DEALS: Deal[] = [
103
92
  source: "Рекомендация",
104
93
  probability: 40,
105
94
  contract: false,
106
- comments: 4,
107
- tags: [{ text: "Повторная", color: "green" }],
108
95
  },
109
96
  {
110
97
  id: "DL-327",
@@ -116,8 +103,6 @@ const DEALS: Deal[] = [
116
103
  source: "Сайт",
117
104
  probability: 40,
118
105
  contract: false,
119
- comments: 1,
120
- tags: [{ text: "Просрочена", color: "red" }],
121
106
  },
122
107
  {
123
108
  id: "DL-321",
@@ -129,8 +114,6 @@ const DEALS: Deal[] = [
129
114
  source: "Холодный звонок",
130
115
  probability: 60,
131
116
  contract: false,
132
- comments: 6,
133
- tags: [{ text: "Горячая", color: "orange" }],
134
117
  },
135
118
  {
136
119
  id: "DL-316",
@@ -142,11 +125,6 @@ const DEALS: Deal[] = [
142
125
  source: "Рекомендация",
143
126
  probability: 75,
144
127
  contract: true,
145
- comments: 9,
146
- tags: [
147
- { text: "Тендер", color: "blue" },
148
- { text: "Горячая", color: "orange" },
149
- ],
150
128
  },
151
129
  {
152
130
  id: "DL-309",
@@ -158,8 +136,6 @@ const DEALS: Deal[] = [
158
136
  source: "Выставка",
159
137
  probability: 80,
160
138
  contract: false,
161
- comments: 3,
162
- tags: [{ text: "Ждём подпись", color: "yellow" }],
163
139
  },
164
140
  {
165
141
  id: "DL-298",
@@ -171,8 +147,6 @@ const DEALS: Deal[] = [
171
147
  source: "Сайт",
172
148
  probability: 100,
173
149
  contract: true,
174
- comments: 2,
175
- tags: [{ text: "Повторная", color: "green" }],
176
150
  },
177
151
  ];
178
152
 
@@ -246,11 +220,6 @@ function saveStage(deal: Deal, to: string) {
246
220
  });
247
221
  }
248
222
 
249
- /** The server's answer to a new order of the stages. */
250
- function saveStageOrder() {
251
- return new Promise<void>((resolve) => window.setTimeout(resolve, SAVE_MS));
252
- }
253
-
254
223
  const ownerAvatar = (owner: Owner) => (
255
224
  <Avatar.Root size="s" color={owner.color} aria-label={owner.name}>
256
225
  <Avatar.Fallback>{owner.initials}</Avatar.Fallback>
@@ -310,16 +279,13 @@ const COLUMNS: DataTableColumn<DealRow>[] = [
310
279
  },
311
280
  ];
312
281
 
313
- export default function KanbanBoardPattern() {
282
+ export default function KanbanScreenExample() {
314
283
  const { notify } = useNotifications();
315
284
  const [loading, setLoading] = React.useState(true);
316
285
  const [view, setView] = React.useState("board");
317
286
  const [filter, setFilter] = React.useState<SmartFilterValue>({});
318
287
  const [search, setSearch] = React.useState("");
319
288
  const [placement, setPlacement] = React.useState(PLACEMENT);
320
- const [stageOrder, setStageOrder] = React.useState<readonly string[]>(
321
- STAGES.map((stage) => stage.id),
322
- );
323
289
  const [openId, setOpenId] = React.useState<string | null>(null);
324
290
  const [drawerOpen, setDrawerOpen] = React.useState(false);
325
291
  const [saving, setSaving] = React.useState(false);
@@ -339,6 +305,11 @@ export default function KanbanBoardPattern() {
339
305
  );
340
306
  const rows: DealRow[] = deals.map((deal) => ({ ...deal, stage: stageOf(placement, deal.id) }));
341
307
  const shown = new Set(deals.map((deal) => deal.id));
308
+ // The header's data line: what the filtered pipeline holds, open deals only.
309
+ const inWork = deals.filter((deal) => stageOf(placement, deal.id) !== "won");
310
+ const pipeline = `${inWork.length} ${dealsWord(inWork.length)} в работе · ${RUBLES.format(
311
+ inWork.reduce((total, deal) => total + deal.amount, 0),
312
+ )}`;
342
313
 
343
314
  const figures = (column: KanbanColumn) => {
344
315
  const ids = (placement[column.id] ?? []).filter((id) => shown.has(id));
@@ -383,32 +354,22 @@ export default function KanbanBoardPattern() {
383
354
 
384
355
  const deal = openId === null ? undefined : BY_ID.get(openId);
385
356
  const dealStage = deal ? stageOf(placement, deal.id) : "new";
386
- const nextStage = STAGE_BY_ID.get(stageOrder[stageOrder.indexOf(dealStage) + 1] ?? "");
357
+ const nextStage = STAGES[STAGES.findIndex((stage) => stage.id === dealStage) + 1];
387
358
 
388
359
  return (
389
- <PageContent.Page aria-labelledby="deals-title">
390
- <PageContent.Header>
391
- <PageContent.Title id="deals-title">Сделки</PageContent.Title>
392
- <PageContent.Description>
393
- Воронка отдела продаж: перетащите сделку на следующий этап или откройте её карточку.
394
- </PageContent.Description>
395
- <PageContent.Actions>
396
- <Button.Root variant="soft" tone="neutral">
397
- <Button.Icon>
398
- <Icon name="action.download" />
399
- </Button.Icon>
400
- Экспорт
401
- </Button.Root>
402
- <Button.Root>
403
- <Button.Icon>
404
- <Icon name="action.add" />
405
- </Button.Icon>
406
- Новая сделка
407
- </Button.Root>
408
- </PageContent.Actions>
409
- </PageContent.Header>
410
- <PageContent.Body>
411
- <div className={styles.workspace}>
360
+ <>
361
+ {/* A work screen: in an app this header fills the shell's `header` slot and carries the page —
362
+ the only h1 and the page's tools; main has no PageContent.Header. */}
363
+ <AppHeader.Root>
364
+ <AppHeader.Start>
365
+ <AppHeader.Title>
366
+ Сделки
367
+ <AppHeader.Description>
368
+ {loading ? "Загружаем воронку…" : pipeline}
369
+ </AppHeader.Description>
370
+ </AppHeader.Title>
371
+ </AppHeader.Start>
372
+ <AppHeader.Tools>
412
373
  <SmartFilter.Root
413
374
  fields={FIELDS}
414
375
  value={filter}
@@ -436,18 +397,30 @@ export default function KanbanBoardPattern() {
436
397
  </SegmentedControl.Item>
437
398
  </SegmentedControl.Root>
438
399
  </PageToolbar.View>
400
+ <PageToolbar.Actions>
401
+ <Button.Root>
402
+ <Button.Icon>
403
+ <Icon name="action.add" />
404
+ </Button.Icon>
405
+ Новая сделка
406
+ </Button.Root>
407
+ </PageToolbar.Actions>
439
408
  <PageToolbar.Chips>
440
409
  <SmartFilter.Chips />
441
410
  </PageToolbar.Chips>
442
411
  </PageToolbar.Root>
443
412
  </SmartFilter.Root>
444
- <Crossfade state={view}>
413
+ </AppHeader.Tools>
414
+ </AppHeader.Root>
415
+
416
+ <PageContent.Root fill>
417
+ <PageContent.Body>
418
+ <Crossfade state={view} fill>
445
419
  {view === "board" ? (
446
420
  // `plain` (the default): the board is the page's main region, so the stages are no
447
421
  // boxes — their headers and the deal cards stand on the page, one level of nesting.
448
422
  <Kanban.Root
449
423
  aria-label="Воронка продаж"
450
- className={styles.board}
451
424
  columns={STAGES}
452
425
  items={deals}
453
426
  getId={(item) => item.id}
@@ -465,12 +438,6 @@ export default function KanbanBoardPattern() {
465
438
  }
466
439
  setPlacement(next);
467
440
  }}
468
- reorderableColumns
469
- columnOrder={stageOrder}
470
- onColumnOrderChange={async (next) => {
471
- await saveStageOrder();
472
- setStageOrder(next);
473
- }}
474
441
  renderColumnMeta={figures}
475
442
  loading={loading}
476
443
  onItemClick={(item) => openDeal(item.id)}
@@ -480,20 +447,7 @@ export default function KanbanBoardPattern() {
480
447
  <Kanban.ItemDescription>
481
448
  {RUBLES.format(item.amount)} · до {DAY.format(new Date(item.due))}
482
449
  </Kanban.ItemDescription>
483
- <Kanban.ItemBadges>
484
- {item.tags.map((tag) => (
485
- <Badge.Root key={tag.text} color={tag.color}>
486
- {tag.text}
487
- </Badge.Root>
488
- ))}
489
- </Kanban.ItemBadges>
490
- <Kanban.ItemFooter>
491
- <Kanban.ItemCount>
492
- <Icon name="object.message" />
493
- {item.comments}
494
- </Kanban.ItemCount>
495
- {ownerAvatar(item.owner)}
496
- </Kanban.ItemFooter>
450
+ <Kanban.ItemFooter>{ownerAvatar(item.owner)}</Kanban.ItemFooter>
497
451
  </Kanban.Item>
498
452
  )}
499
453
  />
@@ -505,7 +459,9 @@ export default function KanbanBoardPattern() {
505
459
  getRowKey={(row) => row.id}
506
460
  getRowLabel={(row) => row.company}
507
461
  onRowClick={(row) => openDeal(row.id)}
508
- pageSize={8}
462
+ paging="none"
463
+ scrollHeight="fill"
464
+ stickyHeader
509
465
  defaultSort={{ columnId: "due", order: "asc" }}
510
466
  empty={
511
467
  <EmptyPage.Root size="s" role="status" aria-labelledby="deals-empty">
@@ -528,87 +484,89 @@ export default function KanbanBoardPattern() {
528
484
  />
529
485
  )}
530
486
  </Crossfade>
531
- </div>
532
- <Drawer.Root open={drawerOpen} onOpenChange={setDrawerOpen}>
533
- <Drawer.Content>
534
- <Drawer.Guard busy={saving} />
535
- <Drawer.Header>
536
- <Drawer.Title>{deal?.company}</Drawer.Title>
537
- <Drawer.Description>
538
- {deal?.id} · {STAGE_BY_ID.get(dealStage)?.title}
539
- </Drawer.Description>
540
- </Drawer.Header>
541
- <Drawer.Body>
542
- {deal ? (
543
- <DescriptionList.Root>
544
- <DescriptionList.Item label="Этап">{stageBadge(dealStage)}</DescriptionList.Item>
545
- <DescriptionList.Item label="Сумма">
546
- {RUBLES.format(deal.amount)}
547
- </DescriptionList.Item>
548
- <DescriptionList.Item label="Вероятность">
549
- {deal.probability} %
550
- </DescriptionList.Item>
551
- <DescriptionList.Item label="Срок закрытия">
552
- {DAY.format(new Date(deal.due))}
553
- </DescriptionList.Item>
554
- <DescriptionList.Item label="Ответственный">
555
- <span className={styles.owner}>
556
- {ownerAvatar(deal.owner)}
557
- {deal.owner.name}
558
- </span>
559
- </DescriptionList.Item>
560
- <DescriptionList.Item label="Контакт">{deal.contact}</DescriptionList.Item>
561
- <DescriptionList.Item label="Источник">{deal.source}</DescriptionList.Item>
562
- <DescriptionList.Item label="Договор">
563
- {deal.contract ? (
564
- <Badge.Root color="green">Подписан</Badge.Root>
565
- ) : (
566
- <Badge.Root color="gray">Не подписан</Badge.Root>
567
- )}
568
- </DescriptionList.Item>
569
- </DescriptionList.Root>
570
- ) : null}
571
- </Drawer.Body>
572
- <Drawer.Footer>
573
- <Drawer.Close>
574
- <Button.Root variant="outline" tone="neutral">
575
- Закрыть
576
- </Button.Root>
577
- </Drawer.Close>
578
- <Dropdown.Root>
579
- <Dropdown.Trigger>
580
- <Button.Root variant="soft" tone="neutral" disabled={saving}>
581
- Сменить этап
487
+ <Drawer.Root open={drawerOpen} onOpenChange={setDrawerOpen}>
488
+ <Drawer.Content>
489
+ <Drawer.Guard busy={saving} />
490
+ <Drawer.Header>
491
+ <Drawer.Title>{deal?.company}</Drawer.Title>
492
+ <Drawer.Description>
493
+ {deal?.id} · {STAGE_BY_ID.get(dealStage)?.title}
494
+ </Drawer.Description>
495
+ </Drawer.Header>
496
+ <Drawer.Body>
497
+ {deal ? (
498
+ <DescriptionList.Root>
499
+ <DescriptionList.Item label="Этап">
500
+ {stageBadge(dealStage)}
501
+ </DescriptionList.Item>
502
+ <DescriptionList.Item label="Сумма">
503
+ {RUBLES.format(deal.amount)}
504
+ </DescriptionList.Item>
505
+ <DescriptionList.Item label="Вероятность">
506
+ {deal.probability} %
507
+ </DescriptionList.Item>
508
+ <DescriptionList.Item label="Срок закрытия">
509
+ {DAY.format(new Date(deal.due))}
510
+ </DescriptionList.Item>
511
+ <DescriptionList.Item label="Ответственный">
512
+ <span className={styles.owner}>
513
+ {ownerAvatar(deal.owner)}
514
+ {deal.owner.name}
515
+ </span>
516
+ </DescriptionList.Item>
517
+ <DescriptionList.Item label="Контакт">{deal.contact}</DescriptionList.Item>
518
+ <DescriptionList.Item label="Источник">{deal.source}</DescriptionList.Item>
519
+ <DescriptionList.Item label="Договор">
520
+ {deal.contract ? (
521
+ <Badge.Root color="green">Подписан</Badge.Root>
522
+ ) : (
523
+ <Badge.Root color="gray">Не подписан</Badge.Root>
524
+ )}
525
+ </DescriptionList.Item>
526
+ </DescriptionList.Root>
527
+ ) : null}
528
+ </Drawer.Body>
529
+ <Drawer.Footer>
530
+ <Drawer.Close>
531
+ <Button.Root variant="outline" tone="neutral">
532
+ Закрыть
582
533
  </Button.Root>
583
- </Dropdown.Trigger>
584
- <Dropdown.Content>
585
- {stageOrder.map((id) => (
586
- <Dropdown.Item
587
- key={id}
588
- disabled={id === dealStage}
589
- onSelect={() => {
590
- if (deal) void moveDeal(deal, id);
591
- }}
592
- >
593
- {STAGE_BY_ID.get(id)?.title}
594
- </Dropdown.Item>
595
- ))}
596
- </Dropdown.Content>
597
- </Dropdown.Root>
598
- {nextStage ? (
599
- <Button.Root
600
- loading={saving}
601
- onClick={() => {
602
- if (deal) void moveDeal(deal, nextStage.id);
603
- }}
604
- >
605
- В «{nextStage.title}»
606
- </Button.Root>
607
- ) : null}
608
- </Drawer.Footer>
609
- </Drawer.Content>
610
- </Drawer.Root>
611
- </PageContent.Body>
612
- </PageContent.Page>
534
+ </Drawer.Close>
535
+ <Dropdown.Root>
536
+ <Dropdown.Trigger>
537
+ <Button.Root variant="soft" tone="neutral" disabled={saving}>
538
+ Сменить этап
539
+ </Button.Root>
540
+ </Dropdown.Trigger>
541
+ <Dropdown.Content>
542
+ {STAGES.map((stage) => (
543
+ <Dropdown.Item
544
+ key={stage.id}
545
+ disabled={stage.id === dealStage}
546
+ onSelect={() => {
547
+ if (deal) void moveDeal(deal, stage.id);
548
+ }}
549
+ >
550
+ {stage.title}
551
+ </Dropdown.Item>
552
+ ))}
553
+ </Dropdown.Content>
554
+ </Dropdown.Root>
555
+ {nextStage ? (
556
+ <Button.Root
557
+ loading={saving}
558
+ onClick={() => {
559
+ if (deal) void moveDeal(deal, nextStage.id);
560
+ }}
561
+ >
562
+ В «{nextStage.title}»
563
+ </Button.Root>
564
+ ) : null}
565
+ </Drawer.Footer>
566
+ </Drawer.Content>
567
+ </Drawer.Root>
568
+ </PageContent.Body>
569
+ </PageContent.Root>
570
+ </>
613
571
  );
614
572
  }
@@ -1,10 +1,10 @@
1
- /** Loading draws skeleton cards in the card geometry and cross-fades the cards in; an empty column keeps its drop area; a read-only board drags nothing — `loading`, `disabled`. */
2
- import { Button, Icon, Kanban, Switch } from "prime-ui-kit";
1
+ /** Loading draws skeleton cards in the card geometry and cross-fades the cards in; an empty column keeps its drop area; a closed order stays in place while the rest move; a read-only board drags nothing — `loading`, `disabled`. */
2
+ import { Badge, Button, Icon, Kanban, Switch } 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 Order = { id: string; title: string; total: string };
7
+ type Order = { id: string; title: string; total: string; closed?: boolean };
8
8
 
9
9
  const COLUMNS = [
10
10
  { id: "new", title: "Новые" },
@@ -12,13 +12,19 @@ const COLUMNS = [
12
12
  { id: "shipped", title: "Отгружены" },
13
13
  ];
14
14
 
15
+ /** A closed order has signed documents: its card stays where it is. */
15
16
  const ORDERS: Order[] = [
16
17
  { id: "ORD-5531", title: "ООО «Север» · 12 позиций", total: "48 300 ₽" },
17
18
  { id: "ORD-5529", title: "ИП Лебедев · 3 позиции", total: "7 950 ₽" },
18
- { id: "ORD-5524", title: "АО «Гранит» · 40 позиций", total: "212 000 ₽" },
19
+ { id: "ORD-5524", title: "АО «Гранит» · 40 позиций", total: "212 000 ₽", closed: true },
20
+ { id: "ORD-5518", title: "ООО «Вектор» · 6 позиций", total: "31 400 ₽" },
19
21
  ];
20
22
 
21
- const PLACEMENT = { new: ["ORD-5531", "ORD-5529"], packing: [], shipped: ["ORD-5524"] };
23
+ const PLACEMENT = {
24
+ new: ["ORD-5531", "ORD-5529"],
25
+ packing: [],
26
+ shipped: ["ORD-5524", "ORD-5518"],
27
+ };
22
28
 
23
29
  const LOAD_MS = 1200;
24
30
 
@@ -62,11 +68,16 @@ export default function KanbanStatesExample() {
62
68
  loading={loading}
63
69
  disabled={readOnly}
64
70
  renderItem={(order) => (
65
- <Kanban.Item>
71
+ <Kanban.Item disabled={order.closed}>
66
72
  <Kanban.ItemTitle>{order.id}</Kanban.ItemTitle>
67
73
  <Kanban.ItemDescription>
68
74
  {order.title} · {order.total}
69
75
  </Kanban.ItemDescription>
76
+ {order.closed ? (
77
+ <Kanban.ItemBadges>
78
+ <Badge.Root color="gray">Закрыт</Badge.Root>
79
+ </Kanban.ItemBadges>
80
+ ) : null}
70
81
  </Kanban.Item>
71
82
  )}
72
83
  />