prime-ui-kit 0.13.1 → 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 (609) hide show
  1. package/README.md +20 -20
  2. package/dist/chunks/{chunk-XNOJEX55.js → chunk-2IKH55MI.js} +1 -1
  3. package/dist/chunks/{chunk-JV2KB5JZ.js → chunk-THFZIHKU.js} +3761 -3041
  4. package/dist/chunks/{chunk-PK2GC77E.js → chunk-XJAVS6FH.js} +213 -188
  5. package/dist/color-picker.js +2 -2
  6. package/dist/components/banner/Banner.d.ts +5 -2
  7. package/dist/components/chart-frame/ChartFrame.d.ts +19 -6
  8. package/dist/components/chat/Chat.d.ts +2 -2
  9. package/dist/components/chat/ChatPinned.d.ts +2 -2
  10. package/dist/components/chat/MessageList.d.ts +1 -1
  11. package/dist/components/chat/chatContext.d.ts +1 -1
  12. package/dist/components/dnd/Dnd.d.ts +1 -1
  13. package/dist/components/field-list/FieldList.d.ts +90 -0
  14. package/dist/components/index.d.ts +3 -1
  15. package/dist/components/input/Input.d.ts +2 -2
  16. package/dist/components/kanban/Kanban.d.ts +6 -3
  17. package/dist/components/login-form/LoginForm.d.ts +5 -1
  18. package/dist/components/page-content/PageContent.d.ts +55 -4
  19. package/dist/components/sparkline/Sparkline.d.ts +64 -15
  20. package/dist/components/sparkline/geometry.d.ts +26 -0
  21. package/dist/components/tooltip/Tooltip.d.ts +5 -2
  22. package/dist/hooks/usePosition.d.ts +15 -4
  23. package/dist/index.css +1 -1
  24. package/dist/index.js +4 -2
  25. package/dist/internal/ChartTooltip.d.ts +26 -0
  26. package/dist/internal/FieldAction.d.ts +6 -7
  27. package/dist/internal/fieldCell.d.ts +21 -0
  28. package/dist/internal/messageList.d.ts +2 -2
  29. package/dist/internal/palette.d.ts +7 -0
  30. package/dist/internal/swatch.d.ts +6 -2
  31. package/dist/layout/app-header/AppHeader.d.ts +9 -28
  32. package/dist/layout/index.d.ts +1 -1
  33. package/dist/skill/SKILL.md +32 -20
  34. package/dist/skill/anti-slop.md +77 -4
  35. package/dist/skill/api-contract.md +2 -2
  36. package/dist/skill/cheatsheet.md +33 -7
  37. package/dist/skill/checklist.md +28 -6
  38. package/dist/skill/choosing.md +17 -14
  39. package/dist/skill/components.md +9 -15
  40. package/dist/skill/composition.md +301 -61
  41. package/dist/skill/foundations.md +9 -7
  42. package/dist/skill/layouts.md +70 -37
  43. package/dist/skill/reference/components/avatar/COMPONENT.md +4 -4
  44. package/dist/skill/reference/components/avatar/examples/presence.tsx +1 -1
  45. package/dist/skill/reference/components/avatar/examples/states.tsx +5 -5
  46. package/dist/skill/reference/components/badge/examples/applied-filters.tsx +13 -19
  47. package/dist/skill/reference/components/badge/examples/examples.module.css +1 -8
  48. package/dist/skill/reference/components/badge/examples/server-tags.tsx +2 -6
  49. package/dist/skill/reference/components/banner/COMPONENT.md +6 -6
  50. package/dist/skill/reference/components/banner/examples/dismissible.tsx +22 -11
  51. package/dist/skill/reference/components/banner/examples/examples.module.css +4 -8
  52. package/dist/skill/reference/components/banner/examples/narrow.tsx +1 -1
  53. package/dist/skill/reference/components/banner/examples/page-strip.tsx +16 -22
  54. package/dist/skill/reference/components/breadcrumb/COMPONENT.md +5 -4
  55. package/dist/skill/reference/components/breadcrumb/examples/ellipsis.tsx +2 -2
  56. package/dist/skill/reference/components/breadcrumb/examples/overflow.tsx +1 -1
  57. package/dist/skill/reference/components/button-group/COMPONENT.md +2 -2
  58. package/dist/skill/reference/components/button-group/examples/in-form.tsx +22 -2
  59. package/dist/skill/reference/components/button-group/examples/states.tsx +10 -1
  60. package/dist/skill/reference/components/card/COMPONENT.md +7 -5
  61. package/dist/skill/reference/components/card/examples/examples.module.css +0 -28
  62. package/dist/skill/reference/components/card/examples/kpi-media.tsx +13 -11
  63. package/dist/skill/reference/components/card/examples/narrow.tsx +1 -1
  64. package/dist/skill/reference/components/card/examples/panel-chart.tsx +45 -22
  65. package/dist/skill/reference/components/card/examples/screen.module.css +14 -0
  66. package/dist/skill/reference/components/card/examples/screen.tsx +362 -0
  67. package/dist/skill/reference/components/card/examples/variants.tsx +15 -1
  68. package/dist/skill/reference/components/chart-frame/COMPONENT.md +12 -8
  69. package/dist/skill/reference/components/chart-frame/examples/fill-height.tsx +119 -0
  70. package/dist/skill/reference/components/chart-frame/examples/states.tsx +3 -1
  71. package/dist/skill/reference/components/chart-frame/examples/tooltip.tsx +20 -24
  72. package/dist/skill/reference/components/chat/COMPONENT.md +6 -4
  73. package/dist/skill/reference/components/chat/examples/group-chat.tsx +15 -2
  74. package/dist/skill/reference/components/chat/examples/reactions.tsx +121 -0
  75. package/dist/skill/reference/components/chat/examples/screen.module.css +9 -0
  76. package/dist/skill/{patterns/chat.tsx → reference/components/chat/examples/screen.tsx} +187 -350
  77. package/dist/skill/reference/components/chat/examples/search.tsx +1 -1
  78. package/dist/skill/reference/components/chat-list/COMPONENT.md +2 -1
  79. package/dist/skill/reference/components/chat-list/examples/links.tsx +72 -0
  80. package/dist/skill/reference/components/checkbox/COMPONENT.md +1 -1
  81. package/dist/skill/reference/components/checkbox/examples/examples.module.css +5 -1
  82. package/dist/skill/reference/components/checkbox/examples/indicator.tsx +37 -9
  83. package/dist/skill/reference/components/checkbox/examples/states.tsx +6 -1
  84. package/dist/skill/reference/components/color-field/COMPONENT.md +1 -1
  85. package/dist/skill/reference/components/color-picker/COMPONENT.md +6 -5
  86. package/dist/skill/reference/components/color-picker/examples/controlled-open.tsx +37 -0
  87. package/dist/skill/reference/components/color-picker/examples/presets.tsx +2 -2
  88. package/dist/skill/reference/components/color-picker/examples/states.tsx +23 -14
  89. package/dist/skill/reference/components/color-swatches/COMPONENT.md +1 -0
  90. package/dist/skill/reference/components/composer/COMPONENT.md +2 -1
  91. package/dist/skill/reference/components/composer/examples/attach-menu.tsx +78 -0
  92. package/dist/skill/reference/components/composer/examples/attachments.tsx +2 -2
  93. package/dist/skill/reference/components/crossfade/COMPONENT.md +1 -0
  94. package/dist/skill/{patterns/screen-states.module.css → reference/components/crossfade/examples/screen.module.css} +3 -17
  95. package/dist/skill/reference/components/crossfade/examples/screen.tsx +197 -0
  96. package/dist/skill/reference/components/data-table/COMPONENT.md +3 -2
  97. package/dist/skill/reference/components/data-table/examples/detail-panel.tsx +36 -37
  98. package/dist/skill/reference/components/data-table/examples/examples.module.css +0 -12
  99. package/dist/skill/reference/components/data-table/examples/numeric.tsx +36 -4
  100. package/dist/skill/reference/components/data-table/examples/overview.tsx +1 -0
  101. package/dist/skill/reference/components/data-table/examples/row-open.tsx +7 -36
  102. package/dist/skill/{patterns/list-page.module.css → reference/components/data-table/examples/screen.module.css} +1 -7
  103. package/dist/skill/{patterns/list-page.tsx → reference/components/data-table/examples/screen.tsx} +84 -64
  104. package/dist/skill/reference/components/datepicker/COMPONENT.md +6 -4
  105. package/dist/skill/reference/components/datepicker/examples/examples.module.css +2 -6
  106. package/dist/skill/reference/components/datepicker/examples/in-form.tsx +47 -55
  107. package/dist/skill/reference/components/datepicker/examples/locale.tsx +35 -0
  108. package/dist/skill/reference/components/datepicker/examples/range-presets.tsx +11 -2
  109. package/dist/skill/reference/components/datepicker/examples/states.tsx +9 -1
  110. package/dist/skill/reference/components/description-list/COMPONENT.md +1 -0
  111. package/dist/skill/{patterns/detail-page.module.css → reference/components/description-list/examples/screen.module.css} +2 -12
  112. package/dist/skill/reference/components/description-list/examples/screen.tsx +214 -0
  113. package/dist/skill/reference/components/description-list/examples/structure.tsx +1 -1
  114. package/dist/skill/reference/components/digit-input/COMPONENT.md +3 -1
  115. package/dist/skill/reference/components/digit-input/examples/states.tsx +3 -1
  116. package/dist/skill/reference/components/digit-input/examples/without-focus-ring.tsx +13 -0
  117. package/dist/skill/reference/components/divider/examples/with-icon.tsx +2 -2
  118. package/dist/skill/reference/components/dnd/COMPONENT.md +7 -5
  119. package/dist/skill/reference/components/dnd/examples/drop-zones.tsx +82 -49
  120. package/dist/skill/reference/components/dnd/examples/examples.module.css +50 -0
  121. package/dist/skill/reference/components/dnd/examples/states.tsx +54 -0
  122. package/dist/skill/reference/components/dnd/examples/table.tsx +113 -0
  123. package/dist/skill/reference/components/drawer/COMPONENT.md +1 -0
  124. package/dist/skill/reference/components/drawer/examples/dismiss.tsx +5 -3
  125. package/dist/skill/reference/components/drawer/examples/examples.module.css +0 -13
  126. package/dist/skill/reference/components/drawer/examples/header-actions.tsx +5 -9
  127. package/dist/skill/reference/components/drawer/examples/overview.tsx +6 -18
  128. package/dist/skill/reference/components/drawer/examples/screen.tsx +298 -0
  129. package/dist/skill/reference/components/dropdown/examples/examples.module.css +1 -5
  130. package/dist/skill/reference/components/empty-page/COMPONENT.md +1 -1
  131. package/dist/skill/reference/components/empty-page/examples/region-error.tsx +8 -2
  132. package/dist/skill/reference/components/example-frame/COMPONENT.md +3 -2
  133. package/dist/skill/reference/components/example-frame/examples/initial-view.tsx +44 -0
  134. package/dist/skill/reference/components/field-list/COMPONENT.md +165 -0
  135. package/dist/skill/reference/components/field-list/examples/base-row.tsx +76 -0
  136. package/dist/skill/reference/components/field-list/examples/controlled.tsx +72 -0
  137. package/dist/skill/reference/components/field-list/examples/errors.tsx +88 -0
  138. package/dist/skill/reference/components/field-list/examples/examples.module.css +34 -0
  139. package/dist/skill/reference/components/field-list/examples/limits.tsx +55 -0
  140. package/dist/skill/reference/components/field-list/examples/locked.tsx +139 -0
  141. package/dist/skill/reference/components/field-list/examples/narrow.tsx +68 -0
  142. package/dist/skill/reference/components/field-list/examples/overview.tsx +66 -0
  143. package/dist/skill/reference/components/field-list/examples/reorder.tsx +42 -0
  144. package/dist/skill/reference/components/field-list/examples/screen.module.css +18 -0
  145. package/dist/skill/reference/components/field-list/examples/screen.tsx +316 -0
  146. package/dist/skill/reference/components/field-list/examples/sizes.tsx +42 -0
  147. package/dist/skill/reference/components/field-list/examples/states.tsx +51 -0
  148. package/dist/skill/reference/components/file-upload/COMPONENT.md +7 -6
  149. package/dist/skill/reference/components/file-upload/examples/custom-body.tsx +2 -1
  150. package/dist/skill/reference/components/file-upload/examples/examples.module.css +1 -7
  151. package/dist/skill/reference/components/file-upload/examples/file-cards.tsx +10 -1
  152. package/dist/skill/reference/components/file-upload/examples/gallery.tsx +2 -2
  153. package/dist/skill/reference/components/file-upload/examples/in-form.tsx +4 -9
  154. package/dist/skill/reference/components/file-upload/examples/overview.tsx +5 -1
  155. package/dist/skill/reference/components/file-upload/examples/row-parts.tsx +24 -1
  156. package/dist/skill/{patterns/media-library.module.css → reference/components/file-upload/examples/screen.module.css} +2 -23
  157. package/dist/skill/reference/components/file-upload/examples/screen.tsx +646 -0
  158. package/dist/skill/reference/components/file-upload/examples/states.tsx +6 -2
  159. package/dist/skill/reference/components/file-upload/examples/validation.tsx +11 -2
  160. package/dist/skill/reference/components/file-upload/examples/variants.tsx +3 -20
  161. package/dist/skill/reference/components/gantt/COMPONENT.md +2 -1
  162. package/dist/skill/reference/components/gantt/examples/screen.module.css +14 -0
  163. package/dist/skill/{patterns/schedule.tsx → reference/components/gantt/examples/screen.tsx} +174 -170
  164. package/dist/skill/reference/components/gantt/examples/states.tsx +6 -2
  165. package/dist/skill/reference/components/input/COMPONENT.md +2 -2
  166. package/dist/skill/reference/components/input/examples/examples.module.css +2 -13
  167. package/dist/skill/reference/components/input/examples/in-form.tsx +1 -9
  168. package/dist/skill/reference/components/input/examples/password-strength.tsx +34 -8
  169. package/dist/skill/reference/components/input/examples/states.tsx +6 -1
  170. package/dist/skill/reference/components/kanban/COMPONENT.md +16 -11
  171. package/dist/skill/reference/components/kanban/examples/columns.tsx +8 -5
  172. package/dist/skill/reference/components/kanban/examples/limits.tsx +2 -1
  173. package/dist/skill/reference/components/kanban/examples/screen.module.css +17 -0
  174. package/dist/skill/{patterns/kanban-board.tsx → reference/components/kanban/examples/screen.tsx} +132 -172
  175. package/dist/skill/reference/components/kanban/examples/states.tsx +17 -6
  176. package/dist/skill/reference/components/kanban/examples/variants.tsx +16 -8
  177. package/dist/skill/reference/components/list/COMPONENT.md +1 -1
  178. package/dist/skill/reference/components/login-form/COMPONENT.md +6 -5
  179. package/dist/skill/reference/components/login-form/examples/examples.module.css +2 -21
  180. package/dist/skill/reference/components/login-form/examples/forgot-password.tsx +28 -32
  181. package/dist/skill/reference/components/login-form/examples/narrow.tsx +1 -1
  182. package/dist/skill/reference/components/login-form/examples/overview.tsx +45 -47
  183. package/dist/skill/reference/components/login-form/examples/register.tsx +64 -68
  184. package/dist/skill/reference/components/login-form/examples/reset-password.tsx +50 -47
  185. package/dist/skill/reference/components/login-form/examples/sizes.tsx +4 -6
  186. package/dist/skill/reference/components/login-form/examples/states.tsx +53 -57
  187. package/dist/skill/reference/components/login-form/examples/structure.tsx +18 -22
  188. package/dist/skill/reference/components/login-form/examples/verification-code.tsx +41 -45
  189. package/dist/skill/reference/components/media-viewer/COMPONENT.md +3 -3
  190. package/dist/skill/reference/components/media-viewer/examples/dismiss.tsx +5 -1
  191. package/dist/skill/reference/components/message/COMPONENT.md +6 -5
  192. package/dist/skill/reference/components/message/examples/file.tsx +5 -1
  193. package/dist/skill/reference/components/message/examples/media-open.tsx +48 -0
  194. package/dist/skill/reference/components/message/examples/status.tsx +21 -3
  195. package/dist/skill/reference/components/message/examples/text-formatting.tsx +7 -1
  196. package/dist/skill/reference/components/modal/COMPONENT.md +2 -1
  197. package/dist/skill/reference/components/modal/examples/custom-container.tsx +20 -20
  198. package/dist/skill/reference/components/modal/examples/dismiss.tsx +5 -3
  199. package/dist/skill/reference/components/modal/examples/enter-key.tsx +116 -0
  200. package/dist/skill/reference/components/modal/examples/examples.module.css +7 -13
  201. package/dist/skill/reference/components/modal/examples/structure.tsx +5 -2
  202. package/dist/skill/reference/components/native-select/COMPONENT.md +1 -1
  203. package/dist/skill/reference/components/native-select/examples/states.tsx +5 -1
  204. package/dist/skill/reference/components/notification/COMPONENT.md +2 -1
  205. package/dist/skill/reference/components/notification/examples/dismiss.tsx +2 -2
  206. package/dist/skill/reference/components/page-content/COMPONENT.md +71 -14
  207. package/dist/skill/reference/components/page-content/examples/grid.tsx +107 -0
  208. package/dist/skill/reference/components/page-content/examples/list-detail.tsx +0 -3
  209. package/dist/skill/reference/components/page-content/examples/overview.tsx +2 -2
  210. package/dist/skill/{patterns/settings-page.module.css → reference/components/page-content/examples/screen.module.css} +1 -21
  211. package/dist/skill/{patterns/settings-page.tsx → reference/components/page-content/examples/screen.tsx} +61 -82
  212. package/dist/skill/reference/components/page-content/examples/sections.tsx +81 -0
  213. package/dist/skill/reference/components/page-content/examples/variants.tsx +4 -11
  214. package/dist/skill/reference/components/page-toolbar/COMPONENT.md +18 -16
  215. package/dist/skill/reference/components/page-toolbar/examples/narrow.tsx +6 -3
  216. package/dist/skill/reference/components/pagination/examples/controlled.tsx +29 -29
  217. package/dist/skill/reference/components/pagination/examples/examples.module.css +0 -2
  218. package/dist/skill/reference/components/progress-bar/COMPONENT.md +1 -1
  219. package/dist/skill/reference/components/progress-bar/examples/segments.tsx +2 -2
  220. package/dist/skill/reference/components/progress-circle/COMPONENT.md +1 -1
  221. package/dist/skill/reference/components/progress-circle/examples/segments.tsx +8 -3
  222. package/dist/skill/reference/components/radio/COMPONENT.md +1 -0
  223. package/dist/skill/reference/components/radio/examples/examples.module.css +14 -0
  224. package/dist/skill/reference/components/radio/examples/in-form.tsx +45 -0
  225. package/dist/skill/reference/components/scroll-container/COMPONENT.md +1 -0
  226. package/dist/skill/reference/components/scroll-container/examples/auto-scroll.tsx +3 -3
  227. package/dist/skill/reference/components/scroll-container/examples/chat.tsx +3 -3
  228. package/dist/skill/reference/components/scroll-container/examples/edges.tsx +6 -3
  229. package/dist/skill/reference/components/scroll-container/examples/examples.module.css +4 -17
  230. package/dist/skill/reference/components/scroll-container/examples/load-more.tsx +51 -0
  231. package/dist/skill/reference/components/scroll-container/examples/lock.tsx +3 -5
  232. package/dist/skill/reference/components/scroll-container/examples/overscroll.tsx +3 -3
  233. package/dist/skill/reference/components/scroll-container/examples/overview.tsx +3 -3
  234. package/dist/skill/reference/components/scroll-container/examples/scrollbar.tsx +13 -7
  235. package/dist/skill/reference/components/scroll-container/examples/variants.tsx +13 -7
  236. package/dist/skill/reference/components/segmented-control/COMPONENT.md +3 -2
  237. package/dist/skill/reference/components/segmented-control/examples/in-form.tsx +5 -1
  238. package/dist/skill/reference/components/segmented-control/examples/states.tsx +10 -1
  239. package/dist/skill/reference/components/select/COMPONENT.md +5 -3
  240. package/dist/skill/reference/components/select/examples/examples.module.css +2 -7
  241. package/dist/skill/reference/components/select/examples/icon-only.tsx +38 -0
  242. package/dist/skill/reference/components/select/examples/states.tsx +13 -1
  243. package/dist/skill/reference/components/sheet/COMPONENT.md +2 -0
  244. package/dist/skill/reference/components/sheet/examples/guard.tsx +72 -0
  245. package/dist/skill/reference/components/sheet/examples/header-actions.tsx +56 -0
  246. package/dist/skill/reference/components/slider/COMPONENT.md +2 -1
  247. package/dist/skill/reference/components/slider/examples/examples.module.css +8 -0
  248. package/dist/skill/reference/components/slider/examples/in-form.tsx +47 -0
  249. package/dist/skill/reference/components/slider/examples/states.tsx +4 -1
  250. package/dist/skill/reference/components/smart-filter/COMPONENT.md +1 -1
  251. package/dist/skill/reference/components/smart-filter/examples/controlled.tsx +3 -3
  252. package/dist/skill/reference/components/smart-filter/examples/ranges.tsx +44 -10
  253. package/dist/skill/reference/components/sparkline/COMPONENT.md +83 -30
  254. package/dist/skill/reference/components/sparkline/examples/compact.tsx +1 -1
  255. package/dist/skill/reference/components/sparkline/examples/curve.tsx +28 -0
  256. package/dist/skill/reference/components/sparkline/examples/gaps.tsx +33 -0
  257. package/dist/skill/reference/components/sparkline/examples/overview.tsx +11 -2
  258. package/dist/skill/reference/components/sparkline/examples/period.tsx +7 -2
  259. package/dist/skill/reference/components/sparkline/examples/reference.tsx +38 -0
  260. package/dist/skill/reference/components/sparkline/examples/variants.tsx +2 -2
  261. package/dist/skill/reference/components/tabs/COMPONENT.md +1 -1
  262. package/dist/skill/reference/components/tabs/examples/examples.module.css +0 -6
  263. package/dist/skill/reference/components/tabs/examples/in-drawer.tsx +11 -13
  264. package/dist/skill/reference/components/tabs/examples/sizes.tsx +1 -1
  265. package/dist/skill/reference/components/tag-select/COMPONENT.md +1 -1
  266. package/dist/skill/reference/components/tag-select/examples/states.tsx +8 -1
  267. package/dist/skill/reference/components/textarea/COMPONENT.md +1 -1
  268. package/dist/skill/reference/components/textarea/examples/examples.module.css +0 -6
  269. package/dist/skill/reference/components/textarea/examples/in-form.tsx +1 -9
  270. package/dist/skill/reference/components/textarea/examples/states.tsx +2 -1
  271. package/dist/skill/reference/components/thumbnail/COMPONENT.md +2 -1
  272. package/dist/skill/reference/components/thumbnail/examples/examples.module.css +1 -1
  273. package/dist/skill/reference/components/thumbnail/examples/fit.tsx +24 -0
  274. package/dist/skill/reference/components/thumbnail/examples/video.tsx +20 -1
  275. package/dist/skill/reference/components/timeline/COMPONENT.md +1 -1
  276. package/dist/skill/reference/components/timeline/examples/examples.module.css +0 -8
  277. package/dist/skill/reference/components/timeline/examples/links.tsx +55 -14
  278. package/dist/skill/reference/components/timeline/examples/narrow.tsx +2 -2
  279. package/dist/skill/reference/components/timeline/examples/sizes.tsx +3 -3
  280. package/dist/skill/reference/components/timeline/examples/variants.tsx +4 -4
  281. package/dist/skill/reference/components/tooltip/COMPONENT.md +7 -5
  282. package/dist/skill/reference/components/tooltip/examples/placement.tsx +2 -1
  283. package/dist/skill/reference/components/tooltip/examples/toolbar.tsx +2 -2
  284. package/dist/skill/reference/components/typography/examples/weights.tsx +3 -0
  285. package/dist/skill/reference/components/video-note/COMPONENT.md +3 -3
  286. package/dist/skill/reference/components/video-note/examples/controlled.tsx +19 -2
  287. package/dist/skill/reference/components/video-note/examples/in-message.tsx +5 -2
  288. package/dist/skill/reference/components/visually-hidden/COMPONENT.md +2 -1
  289. package/dist/skill/reference/components/visually-hidden/examples/assertive.tsx +39 -0
  290. package/dist/skill/reference/components/voice-player/COMPONENT.md +3 -3
  291. package/dist/skill/reference/components/voice-player/examples/call-recording.tsx +19 -9
  292. package/dist/skill/reference/components/voice-player/examples/controlled.tsx +20 -3
  293. package/dist/skill/reference/layout/app-header/COMPONENT.md +46 -63
  294. package/dist/skill/reference/layout/app-header/examples/breadcrumbs.tsx +10 -9
  295. package/dist/skill/reference/layout/app-header/examples/examples.module.css +1 -1
  296. package/dist/skill/reference/layout/app-header/examples/in-app-shell.tsx +2 -3
  297. package/dist/skill/reference/layout/app-header/examples/narrow.tsx +4 -5
  298. package/dist/skill/reference/layout/app-header/examples/overview.tsx +8 -10
  299. package/dist/skill/reference/layout/app-header/examples/page-title.tsx +3 -10
  300. package/dist/skill/reference/layout/app-shell/COMPONENT.md +5 -4
  301. package/dist/skill/reference/layout/app-shell/examples/footer.tsx +2 -2
  302. package/dist/skill/reference/layout/app-shell/examples/overview.tsx +17 -32
  303. package/dist/skill/{patterns/app-shell.module.css → reference/layout/app-shell/examples/screen.module.css} +1 -8
  304. package/dist/skill/reference/layout/app-shell/examples/screen.tsx +262 -0
  305. package/dist/skill/reference/layout/app-shell/examples/template.tsx +31 -11
  306. package/dist/skill/reference/layout/bottom-nav/examples/floating-action.tsx +2 -2
  307. package/dist/skill/reference/layout/bottom-nav/examples/floating.tsx +2 -2
  308. package/dist/skill/reference/layout/bottom-nav/examples/in-app-shell.tsx +2 -2
  309. package/dist/skill/reference/layout/sidebar/COMPONENT.md +7 -4
  310. package/dist/skill/reference/layout/sidebar/examples/account.tsx +2 -2
  311. package/dist/skill/reference/layout/sidebar/examples/collapsible-groups.tsx +12 -4
  312. package/dist/skill/reference/layout/sidebar/examples/custom-part.tsx +53 -0
  313. package/dist/skill/reference/layout/sidebar/examples/examples.module.css +5 -0
  314. package/dist/skill/reference/layout/sidebar/examples/narrow.tsx +53 -0
  315. package/dist/skill/reference/layout/sidebar/examples/persist.tsx +57 -0
  316. package/dist/skill/reference/layout/sidebar/examples/router.tsx +14 -2
  317. package/dist/skill/reference/layout/sidebar/examples/structure.tsx +7 -2
  318. package/dist/skill/responsive.md +7 -5
  319. package/dist/skill/ux.md +145 -0
  320. package/dist/tokens/semantic.d.ts +2 -0
  321. package/package.json +1 -1
  322. package/src/components/avatar/COMPONENT.md +4 -4
  323. package/src/components/avatar/examples/presence.tsx +1 -1
  324. package/src/components/avatar/examples/states.tsx +5 -5
  325. package/src/components/badge/examples/applied-filters.tsx +13 -19
  326. package/src/components/badge/examples/examples.module.css +1 -8
  327. package/src/components/badge/examples/server-tags.tsx +2 -6
  328. package/src/components/banner/COMPONENT.md +6 -6
  329. package/src/components/banner/examples/dismissible.tsx +22 -11
  330. package/src/components/banner/examples/examples.module.css +4 -8
  331. package/src/components/banner/examples/narrow.tsx +1 -1
  332. package/src/components/banner/examples/page-strip.tsx +16 -22
  333. package/src/components/breadcrumb/COMPONENT.md +5 -4
  334. package/src/components/breadcrumb/examples/ellipsis.tsx +2 -2
  335. package/src/components/breadcrumb/examples/overflow.tsx +1 -1
  336. package/src/components/button-group/COMPONENT.md +2 -2
  337. package/src/components/button-group/examples/in-form.tsx +22 -2
  338. package/src/components/button-group/examples/states.tsx +10 -1
  339. package/src/components/card/COMPONENT.md +7 -5
  340. package/src/components/card/examples/examples.module.css +0 -28
  341. package/src/components/card/examples/kpi-media.tsx +13 -11
  342. package/src/components/card/examples/narrow.tsx +1 -1
  343. package/src/components/card/examples/panel-chart.tsx +45 -22
  344. package/src/components/card/examples/screen.module.css +14 -0
  345. package/src/components/card/examples/screen.tsx +362 -0
  346. package/src/components/card/examples/variants.tsx +15 -1
  347. package/src/components/chart-frame/COMPONENT.md +12 -8
  348. package/src/components/chart-frame/examples/fill-height.tsx +119 -0
  349. package/src/components/chart-frame/examples/states.tsx +3 -1
  350. package/src/components/chart-frame/examples/tooltip.tsx +20 -24
  351. package/src/components/chat/COMPONENT.md +6 -4
  352. package/src/components/chat/examples/group-chat.tsx +15 -2
  353. package/src/components/chat/examples/reactions.tsx +121 -0
  354. package/src/components/chat/examples/screen.module.css +9 -0
  355. package/src/components/chat/examples/screen.tsx +718 -0
  356. package/src/components/chat/examples/search.tsx +1 -1
  357. package/src/components/chat-list/COMPONENT.md +2 -1
  358. package/src/components/chat-list/examples/links.tsx +72 -0
  359. package/src/components/checkbox/COMPONENT.md +1 -1
  360. package/src/components/checkbox/examples/examples.module.css +5 -1
  361. package/src/components/checkbox/examples/indicator.tsx +37 -9
  362. package/src/components/checkbox/examples/states.tsx +6 -1
  363. package/src/components/color-field/COMPONENT.md +1 -1
  364. package/src/components/color-picker/COMPONENT.md +6 -5
  365. package/src/components/color-picker/examples/controlled-open.tsx +37 -0
  366. package/src/components/color-picker/examples/presets.tsx +2 -2
  367. package/src/components/color-picker/examples/states.tsx +23 -14
  368. package/src/components/color-swatches/COMPONENT.md +1 -0
  369. package/src/components/composer/COMPONENT.md +2 -1
  370. package/src/components/composer/examples/attach-menu.tsx +78 -0
  371. package/src/components/composer/examples/attachments.tsx +2 -2
  372. package/src/components/crossfade/COMPONENT.md +1 -0
  373. package/src/components/crossfade/examples/screen.module.css +40 -0
  374. package/src/components/crossfade/examples/screen.tsx +197 -0
  375. package/src/components/data-table/COMPONENT.md +3 -2
  376. package/src/components/data-table/examples/detail-panel.tsx +36 -37
  377. package/src/components/data-table/examples/examples.module.css +0 -12
  378. package/src/components/data-table/examples/numeric.tsx +36 -4
  379. package/src/components/data-table/examples/overview.tsx +1 -0
  380. package/src/components/data-table/examples/row-open.tsx +7 -36
  381. package/src/components/data-table/examples/screen.module.css +13 -0
  382. package/src/components/data-table/examples/screen.tsx +354 -0
  383. package/src/components/datepicker/COMPONENT.md +6 -4
  384. package/src/components/datepicker/examples/examples.module.css +2 -6
  385. package/src/components/datepicker/examples/in-form.tsx +47 -55
  386. package/src/components/datepicker/examples/locale.tsx +35 -0
  387. package/src/components/datepicker/examples/range-presets.tsx +11 -2
  388. package/src/components/datepicker/examples/states.tsx +9 -1
  389. package/src/components/description-list/COMPONENT.md +1 -0
  390. package/src/components/description-list/examples/screen.module.css +64 -0
  391. package/src/components/description-list/examples/screen.tsx +214 -0
  392. package/src/components/description-list/examples/structure.tsx +1 -1
  393. package/src/components/digit-input/COMPONENT.md +3 -1
  394. package/src/components/digit-input/examples/states.tsx +3 -1
  395. package/src/components/digit-input/examples/without-focus-ring.tsx +13 -0
  396. package/src/components/divider/examples/with-icon.tsx +2 -2
  397. package/src/components/dnd/COMPONENT.md +7 -5
  398. package/src/components/dnd/examples/drop-zones.tsx +82 -49
  399. package/src/components/dnd/examples/examples.module.css +50 -0
  400. package/src/components/dnd/examples/states.tsx +54 -0
  401. package/src/components/dnd/examples/table.tsx +113 -0
  402. package/src/components/drawer/COMPONENT.md +1 -0
  403. package/src/components/drawer/examples/dismiss.tsx +5 -3
  404. package/src/components/drawer/examples/examples.module.css +0 -13
  405. package/src/components/drawer/examples/header-actions.tsx +5 -9
  406. package/src/components/drawer/examples/overview.tsx +6 -18
  407. package/src/components/drawer/examples/screen.module.css +14 -0
  408. package/src/components/drawer/examples/screen.tsx +298 -0
  409. package/src/components/dropdown/examples/examples.module.css +1 -5
  410. package/src/components/empty-page/COMPONENT.md +1 -1
  411. package/src/components/empty-page/examples/region-error.tsx +8 -2
  412. package/src/components/example-frame/COMPONENT.md +3 -2
  413. package/src/components/example-frame/examples/initial-view.tsx +44 -0
  414. package/src/components/field-list/COMPONENT.md +165 -0
  415. package/src/components/field-list/examples/base-row.tsx +76 -0
  416. package/src/components/field-list/examples/controlled.tsx +72 -0
  417. package/src/components/field-list/examples/errors.tsx +88 -0
  418. package/src/components/field-list/examples/examples.module.css +34 -0
  419. package/src/components/field-list/examples/limits.tsx +55 -0
  420. package/src/components/field-list/examples/locked.tsx +139 -0
  421. package/src/components/field-list/examples/narrow.tsx +68 -0
  422. package/src/components/field-list/examples/overview.tsx +66 -0
  423. package/src/components/field-list/examples/reorder.tsx +42 -0
  424. package/src/components/field-list/examples/screen.module.css +18 -0
  425. package/src/components/field-list/examples/screen.tsx +316 -0
  426. package/src/components/field-list/examples/sizes.tsx +42 -0
  427. package/src/components/field-list/examples/states.tsx +51 -0
  428. package/src/components/file-upload/COMPONENT.md +7 -6
  429. package/src/components/file-upload/examples/custom-body.tsx +2 -1
  430. package/src/components/file-upload/examples/examples.module.css +1 -7
  431. package/src/components/file-upload/examples/file-cards.tsx +10 -1
  432. package/src/components/file-upload/examples/gallery.tsx +2 -2
  433. package/src/components/file-upload/examples/in-form.tsx +4 -9
  434. package/src/components/file-upload/examples/overview.tsx +5 -1
  435. package/src/components/file-upload/examples/row-parts.tsx +24 -1
  436. package/src/components/file-upload/examples/screen.module.css +45 -0
  437. package/src/components/file-upload/examples/screen.tsx +646 -0
  438. package/src/components/file-upload/examples/states.tsx +6 -2
  439. package/src/components/file-upload/examples/validation.tsx +11 -2
  440. package/src/components/file-upload/examples/variants.tsx +3 -20
  441. package/src/components/gantt/COMPONENT.md +2 -1
  442. package/src/components/gantt/examples/screen.module.css +14 -0
  443. package/src/components/gantt/examples/screen.tsx +726 -0
  444. package/src/components/gantt/examples/states.tsx +6 -2
  445. package/src/components/input/COMPONENT.md +2 -2
  446. package/src/components/input/examples/examples.module.css +2 -13
  447. package/src/components/input/examples/in-form.tsx +1 -9
  448. package/src/components/input/examples/password-strength.tsx +34 -8
  449. package/src/components/input/examples/states.tsx +6 -1
  450. package/src/components/kanban/COMPONENT.md +16 -11
  451. package/src/components/kanban/examples/columns.tsx +8 -5
  452. package/src/components/kanban/examples/limits.tsx +2 -1
  453. package/src/components/kanban/examples/screen.module.css +17 -0
  454. package/src/components/kanban/examples/screen.tsx +572 -0
  455. package/src/components/kanban/examples/states.tsx +17 -6
  456. package/src/components/kanban/examples/variants.tsx +16 -8
  457. package/src/components/list/COMPONENT.md +1 -1
  458. package/src/components/login-form/COMPONENT.md +6 -5
  459. package/src/components/login-form/examples/examples.module.css +2 -21
  460. package/src/components/login-form/examples/forgot-password.tsx +28 -32
  461. package/src/components/login-form/examples/narrow.tsx +1 -1
  462. package/src/components/login-form/examples/overview.tsx +45 -47
  463. package/src/components/login-form/examples/register.tsx +64 -68
  464. package/src/components/login-form/examples/reset-password.tsx +50 -47
  465. package/src/components/login-form/examples/sizes.tsx +4 -6
  466. package/src/components/login-form/examples/states.tsx +53 -57
  467. package/src/components/login-form/examples/structure.tsx +18 -22
  468. package/src/components/login-form/examples/verification-code.tsx +41 -45
  469. package/src/components/media-viewer/COMPONENT.md +3 -3
  470. package/src/components/media-viewer/examples/dismiss.tsx +5 -1
  471. package/src/components/message/COMPONENT.md +6 -5
  472. package/src/components/message/examples/file.tsx +5 -1
  473. package/src/components/message/examples/media-open.tsx +48 -0
  474. package/src/components/message/examples/status.tsx +21 -3
  475. package/src/components/message/examples/text-formatting.tsx +7 -1
  476. package/src/components/modal/COMPONENT.md +2 -1
  477. package/src/components/modal/examples/custom-container.tsx +20 -20
  478. package/src/components/modal/examples/dismiss.tsx +5 -3
  479. package/src/components/modal/examples/enter-key.tsx +116 -0
  480. package/src/components/modal/examples/examples.module.css +7 -13
  481. package/src/components/modal/examples/structure.tsx +5 -2
  482. package/src/components/native-select/COMPONENT.md +1 -1
  483. package/src/components/native-select/examples/states.tsx +5 -1
  484. package/src/components/notification/COMPONENT.md +2 -1
  485. package/src/components/notification/examples/dismiss.tsx +2 -2
  486. package/src/components/page-content/COMPONENT.md +71 -14
  487. package/src/components/page-content/examples/grid.tsx +107 -0
  488. package/src/components/page-content/examples/list-detail.tsx +0 -3
  489. package/src/components/page-content/examples/overview.tsx +2 -2
  490. package/src/components/page-content/examples/screen.module.css +27 -0
  491. package/src/components/page-content/examples/screen.tsx +196 -0
  492. package/src/components/page-content/examples/sections.tsx +81 -0
  493. package/src/components/page-content/examples/variants.tsx +4 -11
  494. package/src/components/page-toolbar/COMPONENT.md +18 -16
  495. package/src/components/page-toolbar/examples/narrow.tsx +6 -3
  496. package/src/components/pagination/examples/controlled.tsx +29 -29
  497. package/src/components/pagination/examples/examples.module.css +0 -2
  498. package/src/components/progress-bar/COMPONENT.md +1 -1
  499. package/src/components/progress-bar/examples/segments.tsx +2 -2
  500. package/src/components/progress-circle/COMPONENT.md +1 -1
  501. package/src/components/progress-circle/examples/segments.tsx +8 -3
  502. package/src/components/radio/COMPONENT.md +1 -0
  503. package/src/components/radio/examples/examples.module.css +14 -0
  504. package/src/components/radio/examples/in-form.tsx +45 -0
  505. package/src/components/scroll-container/COMPONENT.md +1 -0
  506. package/src/components/scroll-container/examples/auto-scroll.tsx +3 -3
  507. package/src/components/scroll-container/examples/chat.tsx +3 -3
  508. package/src/components/scroll-container/examples/edges.tsx +6 -3
  509. package/src/components/scroll-container/examples/examples.module.css +4 -17
  510. package/src/components/scroll-container/examples/load-more.tsx +51 -0
  511. package/src/components/scroll-container/examples/lock.tsx +3 -5
  512. package/src/components/scroll-container/examples/overscroll.tsx +3 -3
  513. package/src/components/scroll-container/examples/overview.tsx +3 -3
  514. package/src/components/scroll-container/examples/scrollbar.tsx +13 -7
  515. package/src/components/scroll-container/examples/variants.tsx +13 -7
  516. package/src/components/segmented-control/COMPONENT.md +3 -2
  517. package/src/components/segmented-control/examples/in-form.tsx +5 -1
  518. package/src/components/segmented-control/examples/states.tsx +10 -1
  519. package/src/components/select/COMPONENT.md +5 -3
  520. package/src/components/select/examples/examples.module.css +2 -7
  521. package/src/components/select/examples/icon-only.tsx +38 -0
  522. package/src/components/select/examples/states.tsx +13 -1
  523. package/src/components/sheet/COMPONENT.md +2 -0
  524. package/src/components/sheet/examples/guard.tsx +72 -0
  525. package/src/components/sheet/examples/header-actions.tsx +56 -0
  526. package/src/components/slider/COMPONENT.md +2 -1
  527. package/src/components/slider/examples/examples.module.css +8 -0
  528. package/src/components/slider/examples/in-form.tsx +47 -0
  529. package/src/components/slider/examples/states.tsx +4 -1
  530. package/src/components/smart-filter/COMPONENT.md +1 -1
  531. package/src/components/smart-filter/examples/controlled.tsx +3 -3
  532. package/src/components/smart-filter/examples/ranges.tsx +44 -10
  533. package/src/components/sparkline/COMPONENT.md +83 -30
  534. package/src/components/sparkline/examples/compact.tsx +1 -1
  535. package/src/components/sparkline/examples/curve.tsx +28 -0
  536. package/src/components/sparkline/examples/gaps.tsx +33 -0
  537. package/src/components/sparkline/examples/overview.tsx +11 -2
  538. package/src/components/sparkline/examples/period.tsx +7 -2
  539. package/src/components/sparkline/examples/reference.tsx +38 -0
  540. package/src/components/sparkline/examples/variants.tsx +2 -2
  541. package/src/components/tabs/COMPONENT.md +1 -1
  542. package/src/components/tabs/examples/examples.module.css +0 -6
  543. package/src/components/tabs/examples/in-drawer.tsx +11 -13
  544. package/src/components/tabs/examples/sizes.tsx +1 -1
  545. package/src/components/tag-select/COMPONENT.md +1 -1
  546. package/src/components/tag-select/examples/states.tsx +8 -1
  547. package/src/components/textarea/COMPONENT.md +1 -1
  548. package/src/components/textarea/examples/examples.module.css +0 -6
  549. package/src/components/textarea/examples/in-form.tsx +1 -9
  550. package/src/components/textarea/examples/states.tsx +2 -1
  551. package/src/components/thumbnail/COMPONENT.md +2 -1
  552. package/src/components/thumbnail/examples/examples.module.css +1 -1
  553. package/src/components/thumbnail/examples/fit.tsx +24 -0
  554. package/src/components/thumbnail/examples/video.tsx +20 -1
  555. package/src/components/timeline/COMPONENT.md +1 -1
  556. package/src/components/timeline/examples/examples.module.css +0 -8
  557. package/src/components/timeline/examples/links.tsx +55 -14
  558. package/src/components/timeline/examples/narrow.tsx +2 -2
  559. package/src/components/timeline/examples/sizes.tsx +3 -3
  560. package/src/components/timeline/examples/variants.tsx +4 -4
  561. package/src/components/tooltip/COMPONENT.md +7 -5
  562. package/src/components/tooltip/examples/placement.tsx +2 -1
  563. package/src/components/tooltip/examples/toolbar.tsx +2 -2
  564. package/src/components/typography/examples/weights.tsx +3 -0
  565. package/src/components/video-note/COMPONENT.md +3 -3
  566. package/src/components/video-note/examples/controlled.tsx +19 -2
  567. package/src/components/video-note/examples/in-message.tsx +5 -2
  568. package/src/components/visually-hidden/COMPONENT.md +2 -1
  569. package/src/components/visually-hidden/examples/assertive.tsx +39 -0
  570. package/src/components/voice-player/COMPONENT.md +3 -3
  571. package/src/components/voice-player/examples/call-recording.tsx +19 -9
  572. package/src/components/voice-player/examples/controlled.tsx +20 -3
  573. package/src/layout/app-header/COMPONENT.md +46 -63
  574. package/src/layout/app-header/examples/breadcrumbs.tsx +10 -9
  575. package/src/layout/app-header/examples/examples.module.css +1 -1
  576. package/src/layout/app-header/examples/in-app-shell.tsx +2 -3
  577. package/src/layout/app-header/examples/narrow.tsx +4 -5
  578. package/src/layout/app-header/examples/overview.tsx +8 -10
  579. package/src/layout/app-header/examples/page-title.tsx +3 -10
  580. package/src/layout/app-shell/COMPONENT.md +5 -4
  581. package/src/layout/app-shell/examples/footer.tsx +2 -2
  582. package/src/layout/app-shell/examples/overview.tsx +17 -32
  583. package/src/layout/app-shell/examples/screen.module.css +11 -0
  584. package/src/layout/app-shell/examples/screen.tsx +262 -0
  585. package/src/layout/app-shell/examples/template.tsx +31 -11
  586. package/src/layout/bottom-nav/examples/floating-action.tsx +2 -2
  587. package/src/layout/bottom-nav/examples/floating.tsx +2 -2
  588. package/src/layout/bottom-nav/examples/in-app-shell.tsx +2 -2
  589. package/src/layout/sidebar/COMPONENT.md +7 -4
  590. package/src/layout/sidebar/examples/account.tsx +2 -2
  591. package/src/layout/sidebar/examples/collapsible-groups.tsx +12 -4
  592. package/src/layout/sidebar/examples/custom-part.tsx +53 -0
  593. package/src/layout/sidebar/examples/examples.module.css +5 -0
  594. package/src/layout/sidebar/examples/narrow.tsx +53 -0
  595. package/src/layout/sidebar/examples/persist.tsx +57 -0
  596. package/src/layout/sidebar/examples/router.tsx +14 -2
  597. package/src/layout/sidebar/examples/structure.tsx +7 -2
  598. package/src/styles/theme-light.css +1 -0
  599. package/dist/skill/patterns/app-shell.tsx +0 -301
  600. package/dist/skill/patterns/chat.module.css +0 -8
  601. package/dist/skill/patterns/dashboard.module.css +0 -44
  602. package/dist/skill/patterns/dashboard.tsx +0 -326
  603. package/dist/skill/patterns/detail-page.tsx +0 -209
  604. package/dist/skill/patterns/form-drawer.tsx +0 -240
  605. package/dist/skill/patterns/kanban-board.module.css +0 -28
  606. package/dist/skill/patterns/media-library.tsx +0 -638
  607. package/dist/skill/patterns/schedule.module.css +0 -22
  608. package/dist/skill/patterns/screen-states.tsx +0 -186
  609. /package/dist/skill/{patterns/form-drawer.module.css → reference/components/drawer/examples/screen.module.css} +0 -0
@@ -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.Section 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,16 +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" ? (
420
+ // `plain` (the default): the board is the page's main region, so the stages are no
421
+ // boxes — their headers and the deal cards stand on the page, one level of nesting.
446
422
  <Kanban.Root
447
423
  aria-label="Воронка продаж"
448
- className={styles.board}
449
424
  columns={STAGES}
450
425
  items={deals}
451
426
  getId={(item) => item.id}
@@ -463,12 +438,6 @@ export default function KanbanBoardPattern() {
463
438
  }
464
439
  setPlacement(next);
465
440
  }}
466
- reorderableColumns
467
- columnOrder={stageOrder}
468
- onColumnOrderChange={async (next) => {
469
- await saveStageOrder();
470
- setStageOrder(next);
471
- }}
472
441
  renderColumnMeta={figures}
473
442
  loading={loading}
474
443
  onItemClick={(item) => openDeal(item.id)}
@@ -478,20 +447,7 @@ export default function KanbanBoardPattern() {
478
447
  <Kanban.ItemDescription>
479
448
  {RUBLES.format(item.amount)} · до {DAY.format(new Date(item.due))}
480
449
  </Kanban.ItemDescription>
481
- <Kanban.ItemBadges>
482
- {item.tags.map((tag) => (
483
- <Badge.Root key={tag.text} color={tag.color}>
484
- {tag.text}
485
- </Badge.Root>
486
- ))}
487
- </Kanban.ItemBadges>
488
- <Kanban.ItemFooter>
489
- <Kanban.ItemCount>
490
- <Icon name="object.message" />
491
- {item.comments}
492
- </Kanban.ItemCount>
493
- {ownerAvatar(item.owner)}
494
- </Kanban.ItemFooter>
450
+ <Kanban.ItemFooter>{ownerAvatar(item.owner)}</Kanban.ItemFooter>
495
451
  </Kanban.Item>
496
452
  )}
497
453
  />
@@ -503,7 +459,9 @@ export default function KanbanBoardPattern() {
503
459
  getRowKey={(row) => row.id}
504
460
  getRowLabel={(row) => row.company}
505
461
  onRowClick={(row) => openDeal(row.id)}
506
- pageSize={8}
462
+ paging="none"
463
+ scrollHeight="fill"
464
+ stickyHeader
507
465
  defaultSort={{ columnId: "due", order: "asc" }}
508
466
  empty={
509
467
  <EmptyPage.Root size="s" role="status" aria-labelledby="deals-empty">
@@ -526,87 +484,89 @@ export default function KanbanBoardPattern() {
526
484
  />
527
485
  )}
528
486
  </Crossfade>
529
- </div>
530
- <Drawer.Root open={drawerOpen} onOpenChange={setDrawerOpen}>
531
- <Drawer.Content>
532
- <Drawer.Guard busy={saving} />
533
- <Drawer.Header>
534
- <Drawer.Title>{deal?.company}</Drawer.Title>
535
- <Drawer.Description>
536
- {deal?.id} · {STAGE_BY_ID.get(dealStage)?.title}
537
- </Drawer.Description>
538
- </Drawer.Header>
539
- <Drawer.Body>
540
- {deal ? (
541
- <DescriptionList.Root>
542
- <DescriptionList.Item label="Этап">{stageBadge(dealStage)}</DescriptionList.Item>
543
- <DescriptionList.Item label="Сумма">
544
- {RUBLES.format(deal.amount)}
545
- </DescriptionList.Item>
546
- <DescriptionList.Item label="Вероятность">
547
- {deal.probability} %
548
- </DescriptionList.Item>
549
- <DescriptionList.Item label="Срок закрытия">
550
- {DAY.format(new Date(deal.due))}
551
- </DescriptionList.Item>
552
- <DescriptionList.Item label="Ответственный">
553
- <span className={styles.owner}>
554
- {ownerAvatar(deal.owner)}
555
- {deal.owner.name}
556
- </span>
557
- </DescriptionList.Item>
558
- <DescriptionList.Item label="Контакт">{deal.contact}</DescriptionList.Item>
559
- <DescriptionList.Item label="Источник">{deal.source}</DescriptionList.Item>
560
- <DescriptionList.Item label="Договор">
561
- {deal.contract ? (
562
- <Badge.Root color="green">Подписан</Badge.Root>
563
- ) : (
564
- <Badge.Root color="gray">Не подписан</Badge.Root>
565
- )}
566
- </DescriptionList.Item>
567
- </DescriptionList.Root>
568
- ) : null}
569
- </Drawer.Body>
570
- <Drawer.Footer>
571
- <Drawer.Close>
572
- <Button.Root variant="outline" tone="neutral">
573
- Закрыть
574
- </Button.Root>
575
- </Drawer.Close>
576
- <Dropdown.Root>
577
- <Dropdown.Trigger>
578
- <Button.Root variant="soft" tone="neutral" disabled={saving}>
579
- Сменить этап
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
+ Закрыть
580
533
  </Button.Root>
581
- </Dropdown.Trigger>
582
- <Dropdown.Content>
583
- {stageOrder.map((id) => (
584
- <Dropdown.Item
585
- key={id}
586
- disabled={id === dealStage}
587
- onSelect={() => {
588
- if (deal) void moveDeal(deal, id);
589
- }}
590
- >
591
- {STAGE_BY_ID.get(id)?.title}
592
- </Dropdown.Item>
593
- ))}
594
- </Dropdown.Content>
595
- </Dropdown.Root>
596
- {nextStage ? (
597
- <Button.Root
598
- loading={saving}
599
- onClick={() => {
600
- if (deal) void moveDeal(deal, nextStage.id);
601
- }}
602
- >
603
- В «{nextStage.title}»
604
- </Button.Root>
605
- ) : null}
606
- </Drawer.Footer>
607
- </Drawer.Content>
608
- </Drawer.Root>
609
- </PageContent.Body>
610
- </PageContent.Section>
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
+ </>
611
571
  );
612
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
  />
@@ -1,11 +1,11 @@
1
- /** The same release board in both looks: columns as filled wells, and bare columns where the header and wider cards carry each column — `variant`. */
2
- import { Kanban, type KanbanVariant, Typography } from "prime-ui-kit";
1
+ /** The same release board in three looks: no wells with a header plate, no wells with a header over a line, and columns as filled wells holding their cards — `variant`. */
2
+ import { Badge, Kanban, type KanbanVariant, Typography } from "prime-ui-kit";
3
3
 
4
4
  import styles from "./examples.module.css";
5
5
 
6
- type Task = { id: string; title: string; due: string };
6
+ type Task = { id: string; title: string; due: string; label: string };
7
7
 
8
- const VARIANTS: KanbanVariant[] = ["well", "plain"];
8
+ const VARIANTS: KanbanVariant[] = ["plain", "line", "well"];
9
9
 
10
10
  const COLUMNS = [
11
11
  { id: "todo", title: "К выполнению", description: "Берём после планирования" },
@@ -14,10 +14,15 @@ const COLUMNS = [
14
14
  ];
15
15
 
16
16
  const TASKS: Task[] = [
17
- { id: "PRJ-214", title: "Экспорт счетов в CSV для бухгалтерии", due: "14 окт" },
18
- { id: "PRJ-221", title: "Фильтр заказов по складу", due: "17 окт" },
19
- { id: "PRJ-198", title: "Повторная отправка приглашений в команду", due: "10 окт" },
20
- { id: "PRJ-176", title: "Онбординг нового проекта", due: "3 окт" },
17
+ { id: "PRJ-214", title: "Экспорт счетов в CSV для бухгалтерии", due: "14 окт", label: "Финансы" },
18
+ { id: "PRJ-221", title: "Фильтр заказов по складу", due: "17 окт", label: "Заказы" },
19
+ {
20
+ id: "PRJ-198",
21
+ title: "Повторная отправка приглашений в команду",
22
+ due: "10 окт",
23
+ label: "Команда",
24
+ },
25
+ { id: "PRJ-176", title: "Онбординг нового проекта", due: "3 окт", label: "Проекты" },
21
26
  ];
22
27
 
23
28
  const PLACEMENT = {
@@ -45,6 +50,9 @@ export default function KanbanVariantsExample() {
45
50
  <Kanban.ItemDescription>
46
51
  {task.id} · до {task.due}
47
52
  </Kanban.ItemDescription>
53
+ <Kanban.ItemBadges>
54
+ <Badge.Root>{task.label}</Badge.Root>
55
+ </Kanban.ItemBadges>
48
56
  </Kanban.Item>
49
57
  )}
50
58
  />
@@ -134,7 +134,7 @@ A second line or an avatar makes a row taller than the one-line height; the vert
134
134
  | current | `current` | `aria-current="true"` (button) or `"page"` (link); `fill-muted-hover` fill, primary text |
135
135
  | focus-visible | keyboard | the focus ring inside the row edge |
136
136
  | disabled | `disabled` | `disabled` on a button; `aria-disabled="true"`, no `href` on a link, `tabindex="-1"` on an `asChild` element; `data-disabled="true"`; disabled text; in a reorderable list the handle is disabled and the row holds its place |
137
- | reorderable | `onReorder` | `data-reorderable="true"` on the root (a `Dnd.Sortable` `<ul>`); each `<li>` is a sortable item (`data-dnd-item` = `value`) with a leading `Dnd.Handle`; drag by the handle (a touch hold on touch), Alt + ↑ / ↓ from the handle or the row; a lifted row leaves a dashed gap, its neighbours glide, the copy follows the pointer and sets down in its new place |
137
+ | reorderable | `onReorder` | `data-reorderable="true"` on the root (a `Dnd.Sortable` `<ul>`); each `<li>` is a sortable item (`data-dnd-item` = `value`) with a leading `Dnd.Handle`; drag by the handle (a touch hold on touch), Alt + ↑ / ↓ from the handle or the row; a lifted row leaves a dashed gap in the row's radius, its neighbours glide, the copy (handle and row, in the row's padding and radius) follows the pointer and sets down in its new place without a jump |
138
138
  | saving a move | `onReorder` returned a pending promise | the row stays in its new place, `aria-busy="true"`, a `Spinner` stands in for the handle, the row content dims to 0.6 (`--prime-motion-duration-fast` both ways); a rejection glides the row back |
139
139
 
140
140
  Root attribute: `data-size`. The fill changes on `background-color` with `--prime-motion-duration-xfast` both ways (0 under reduced motion).
@@ -1,6 +1,6 @@
1
1
  # LoginForm
2
2
 
3
- **Category:** composition
3
+ **Category:** page
4
4
  **Kind:** composite
5
5
 
6
6
  > A sign-in card with a logo, title, provider buttons and a form; covers sign-in, sign-up, password reset and code confirmation.
@@ -54,7 +54,7 @@ Every part is optional except `Root`, `Title` and `Form`. Fields, buttons, divid
54
54
  `ref` → `HTMLElement`. `<header>` with the logo, title and description, laid out by Root `align`. Native props.
55
55
 
56
56
  ### LoginForm.Logo
57
- `ref` → `HTMLDivElement`. A tile for the product mark or an icon (accent tile with `start`, round with `center`); decorative unless it has an `aria-label`. Native `<div>` props.
57
+ `ref` → `HTMLDivElement`. A tile for the product mark or an icon (accent tile with `start`, round with `center`); decorative unless it has an `aria-label` — then it is the product mark image (`role="img"`). Native `<div>` props.
58
58
 
59
59
  ### LoginForm.Title
60
60
  `ref` → `HTMLHeadingElement`. The heading (kit Typography, text role by the tier).
@@ -119,7 +119,7 @@ Root carries `data-size`, `data-align` and `data-flat`.
119
119
  ## Layout & spacing
120
120
  - header → body `--prime-space-8` (gap on Root); provider buttons → divider → form `--prime-space-4`; field → field → submit `--prime-space-5`; submit → back action `--prime-space-3`; form → footer `--prime-space-6`.
121
121
  - Spacing is `gap` on parents; no margins between parts.
122
- - The card has no border and is capped at the small modal width. To center it on a page, wrap it in your own flex container on the page.
122
+ - The card has no border, takes the full width up to the small modal width. To center it on a page, wrap it in your own flex container on the page.
123
123
  - The form is a layer of the surface ladder like Card (`data-depth`): on the page it is white in light with the raised whisper, fields inside are one step off it.
124
124
 
125
125
  ## Accessibility
@@ -129,6 +129,7 @@ No keyboard interaction.
129
129
 
130
130
  ### ARIA
131
131
  - The title is a real heading (`h1` by default) and the form is a native `<form>`: Enter submits.
132
+ - The logo is decorative; with an `aria-label` it is the product mark image (`role="img"`).
132
133
  - Give `LoginForm.Form` an `aria-label` (or `aria-labelledby` pointing to the title id) so the form is a landmark.
133
134
  - Fields use `autoComplete` (`email`, `current-password`, `new-password`, `one-time-code`) so password managers and OTP autofill work.
134
135
  - Server errors in a Banner need `role="alert"`; field errors come from the fields (`aria-invalid`, described by the error).
@@ -141,9 +142,9 @@ No `labels`.
141
142
  ## Examples
142
143
  | Example | Shows |
143
144
  |---|---|
144
- | [overview.tsx](examples/overview.tsx) | Sign in with a provider button, e-mail and password, a «forgot password» link and a sign-up link under a centered header — `align`, `LoginForm.Actions`, `LoginForm.Form`, `LoginForm.Footer`. |
145
+ | [overview.tsx](examples/overview.tsx) | Sign in with a provider button, e-mail and password, a «forgot password» link and a sign-up link under a centered header with the product's named mark — `align`, `LoginForm.Logo`, `LoginForm.Actions`, `LoginForm.Form`, `LoginForm.Footer`. |
145
146
  | [sizes.tsx](examples/sizes.tsx) | Padding, gaps and text roles of the card follow the tier; the fields and buttons take the same one — `size`. |
146
- | [structure.tsx](examples/structure.tsx) | The minimal form: no logo, description or footer, and no shadow for a host that already is a surface — `flat`. |
147
+ | [structure.tsx](examples/structure.tsx) | The minimal form: no logo, description or footer, no shadow for a host that already is a surface and a second-level title under the host page's own heading — `flat`, `as`. |
147
148
  | [register.tsx](examples/register.tsx) | Sign-up: five fields in one column, a strength meter on the new password and a mismatch shown as the field error — `strength`, `error`, `LoginForm.Form`. |
148
149
  | [forgot-password.tsx](examples/forgot-password.tsx) | Password reset request: one field, the primary action and a quiet way back — `LoginForm.Actions`. |
149
150
  | [reset-password.tsx](examples/reset-password.tsx) | A new password after the e-mail link: a strength meter on the first field and a mismatch error under the second one — `strength`, `error`. |
@@ -1,25 +1,6 @@
1
1
  /* Layout helpers for the LoginForm examples. Semantic tokens only. */
2
2
 
3
- /* Centers one card on the stage (the card itself is capped at the modal width). */
4
- .stage {
5
- display: flex;
6
- justify-content: center;
7
- width: 100%;
8
- min-width: 0;
9
- }
10
-
11
- /* Several cards side by side, wrapping on narrow stages. */
12
- .row {
13
- display: flex;
14
- flex-wrap: wrap;
15
- align-items: flex-start;
16
- justify-content: center;
17
- gap: var(--prime-space-6);
18
- width: 100%;
19
- min-width: 0;
20
- }
21
-
22
- /* A field with a link under it, aligned to the field's end edge. */
3
+ /* overview.tsx: a field with a link under it, aligned to the field's end edge. */
23
4
  .withLink {
24
5
  display: flex;
25
6
  flex-direction: column;
@@ -31,7 +12,7 @@
31
12
  align-self: stretch;
32
13
  }
33
14
 
34
- /* narrow.tsx: a phone-width stage. */
15
+ /* narrow.tsx: a phone-width stage (320). */
35
16
  .narrow {
36
17
  display: flex;
37
18
  justify-content: center;