themelia-react-ui 1.0.1 → 2.0.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 (640) hide show
  1. package/CHANGELOG.md +417 -0
  2. package/README.md +67 -16
  3. package/dist/{accordion-B-5Focs8.js → accordion-CQXVcd7Q.js} +15 -15
  4. package/dist/accordion-CQXVcd7Q.js.map +1 -0
  5. package/dist/action-menu-BTpyPWJ2.js +264 -0
  6. package/dist/action-menu-BTpyPWJ2.js.map +1 -0
  7. package/dist/affordance-geometry.generated-CCIXb2A1.js +68 -0
  8. package/dist/affordance-geometry.generated-CCIXb2A1.js.map +1 -0
  9. package/dist/{ai-artifact-B5tPpXnS.js → ai-artifact-2PQ2fItc.js} +206 -215
  10. package/dist/ai-artifact-2PQ2fItc.js.map +1 -0
  11. package/dist/{app-shell-at8Kt4l_.js → app-shell-BE_j8-AT.js} +11 -10
  12. package/dist/app-shell-BE_j8-AT.js.map +1 -0
  13. package/dist/{attachment-BO2R47wn.js → attachment-q69dlt5Y.js} +14 -14
  14. package/dist/attachment-q69dlt5Y.js.map +1 -0
  15. package/dist/auth-M3vGMgDR.js +723 -0
  16. package/dist/auth-M3vGMgDR.js.map +1 -0
  17. package/dist/{avatar-Bpzty83c.js → avatar-djdaaQ_s.js} +15 -13
  18. package/dist/avatar-djdaaQ_s.js.map +1 -0
  19. package/dist/{badge-BZXZT9wd.js → badge-0tATj-tW.js} +9 -9
  20. package/dist/badge-0tATj-tW.js.map +1 -0
  21. package/dist/base/accordion.js +1 -1
  22. package/dist/base/action-menu.js +1 -1
  23. package/dist/base/attachment.js +1 -1
  24. package/dist/base/avatar.js +1 -1
  25. package/dist/base/badge.js +1 -1
  26. package/dist/base/buttons.js +3 -2
  27. package/dist/base/cards.js +3 -3
  28. package/dist/base/carousel.js +33 -35
  29. package/dist/base/carousel.js.map +1 -1
  30. package/dist/base/cascader.js +246 -222
  31. package/dist/base/cascader.js.map +1 -1
  32. package/dist/base/chart.js +1 -1
  33. package/dist/base/choice-inputs.js +2 -2
  34. package/dist/base/code-block.js +1 -1
  35. package/dist/base/combobox.js +1 -1
  36. package/dist/base/command.js +1 -1
  37. package/dist/base/copyable.js +1 -1
  38. package/dist/base/date-pickers.js +3 -3
  39. package/dist/base/display.js +7 -7
  40. package/dist/base/feedback.js +4 -4
  41. package/dist/base/forms-numeric.js +1 -1
  42. package/dist/base/forms.js +2 -2
  43. package/dist/base/inline-edit.js +94 -92
  44. package/dist/base/inline-edit.js.map +1 -1
  45. package/dist/base/item.js +1 -1
  46. package/dist/base/media-gallery.js +1 -1
  47. package/dist/base/navigation.js +6 -6
  48. package/dist/base/popover-menu.js +1 -1
  49. package/dist/base/popover.js +1 -1
  50. package/dist/base/qr-code.js +7 -4
  51. package/dist/base/qr-code.js.map +1 -1
  52. package/dist/base/repeaters.js +53 -53
  53. package/dist/base/repeaters.js.map +1 -1
  54. package/dist/base/sheet.js +1 -1
  55. package/dist/base/sidebar.js +1 -1
  56. package/dist/base/signature-pad.js +84 -82
  57. package/dist/base/signature-pad.js.map +1 -1
  58. package/dist/base/skeleton.js +1 -1
  59. package/dist/base/spinner.js +1 -1
  60. package/dist/base/structure.js +1 -1
  61. package/dist/base/table.js +1 -1
  62. package/dist/base/text-inputs.js +2 -2
  63. package/dist/base/toaster.js +7 -7
  64. package/dist/base/toaster.js.map +1 -1
  65. package/dist/base/tree.js +1 -1
  66. package/dist/base/upload-queue.js +1 -1
  67. package/dist/base/upload.js +3 -3
  68. package/dist/base/value-inputs.js +1 -1
  69. package/dist/blocks/admin.js +228 -219
  70. package/dist/blocks/admin.js.map +1 -1
  71. package/dist/blocks/ai.js +182 -212
  72. package/dist/blocks/ai.js.map +1 -1
  73. package/dist/blocks/analytics/usage-card.js +1 -1
  74. package/dist/blocks/analytics.js +665 -620
  75. package/dist/blocks/analytics.js.map +1 -1
  76. package/dist/blocks/collaboration.js +2 -2
  77. package/dist/blocks/commerce/receipt.js +1 -1
  78. package/dist/blocks/commerce.js +1439 -1553
  79. package/dist/blocks/commerce.js.map +1 -1
  80. package/dist/blocks/data-display.js +1 -1
  81. package/dist/blocks/onboarding.js +6 -6
  82. package/dist/blocks/onboarding.js.map +1 -1
  83. package/dist/blocks/planning.js +88 -97
  84. package/dist/blocks/planning.js.map +1 -1
  85. package/dist/blocks/timelines.js +1 -1
  86. package/dist/{breadcrumbs-DdQ_I5ra.js → breadcrumbs-BG_FfMK4.js} +10 -9
  87. package/dist/breadcrumbs-BG_FfMK4.js.map +1 -0
  88. package/dist/button-BS3KDg00.js +674 -0
  89. package/dist/button-BS3KDg00.js.map +1 -0
  90. package/dist/{button-BS6l5JUw.js → button-R9CCoH7A.js} +3 -3
  91. package/dist/button-R9CCoH7A.js.map +1 -0
  92. package/dist/buttons-DS0ZIwJ_.js +99 -0
  93. package/dist/buttons-DS0ZIwJ_.js.map +1 -0
  94. package/dist/{cards-Cum56XOF.js → cards-QoJ4syG9.js} +12 -12
  95. package/dist/{cards-Cum56XOF.js.map → cards-QoJ4syG9.js.map} +1 -1
  96. package/dist/chart-DwYRKKc-.js +152 -0
  97. package/dist/chart-DwYRKKc-.js.map +1 -0
  98. package/dist/checkbox-B7ygNTYp.js +35 -0
  99. package/dist/checkbox-B7ygNTYp.js.map +1 -0
  100. package/dist/choice-inputs-DrJ17tpL.js +752 -0
  101. package/dist/choice-inputs-DrJ17tpL.js.map +1 -0
  102. package/dist/{code-block-xHKbAJDj.js → code-block-CD0B7M93.js} +27 -27
  103. package/dist/code-block-CD0B7M93.js.map +1 -0
  104. package/dist/{collapsible-DsnktFNv.js → collapsible-oMUGM4tr.js} +3 -3
  105. package/dist/{collapsible-DsnktFNv.js.map → collapsible-oMUGM4tr.js.map} +1 -1
  106. package/dist/{collection-content-C4fthJV_.js → collection-content-Ys-OZOkY.js} +3 -3
  107. package/dist/{collection-content-C4fthJV_.js.map → collection-content-Ys-OZOkY.js.map} +1 -1
  108. package/dist/combobox-6dvVny2q.js +272 -0
  109. package/dist/combobox-6dvVny2q.js.map +1 -0
  110. package/dist/combobox-CB7039j7.js +865 -0
  111. package/dist/combobox-CB7039j7.js.map +1 -0
  112. package/dist/{command-C0xe7u9B.js → command-kPMPjIxJ.js} +35 -31
  113. package/dist/command-kPMPjIxJ.js.map +1 -0
  114. package/dist/{comments-DviPLnwy.js → comments-You0Bzbr.js} +434 -409
  115. package/dist/comments-You0Bzbr.js.map +1 -0
  116. package/dist/components/base/accordion/accordion-variants.d.ts +3 -3
  117. package/dist/components/base/action-menu/action-menu.d.ts +7 -2
  118. package/dist/components/base/avatar/stacked-avatars.d.ts +5 -4
  119. package/dist/components/base/badge/badge.d.ts +1 -1
  120. package/dist/components/base/badge/badge.recipes.d.ts +4 -4
  121. package/dist/components/base/buttons/base-button.d.ts +7 -0
  122. package/dist/components/base/buttons/button-group.recipes.d.ts +2 -2
  123. package/dist/components/base/buttons/button.recipes.d.ts +10 -19
  124. package/dist/components/base/buttons/button.variants.d.ts +1 -0
  125. package/dist/components/base/buttons/loader-button.d.ts +3 -1
  126. package/dist/components/base/buttons/text-button.d.ts +2 -2
  127. package/dist/components/base/buttons/use-pending-button-focus.d.ts +3 -0
  128. package/dist/components/base/cards/card.recipes.d.ts +13 -5
  129. package/dist/components/base/cards/partials/card-primitives.d.ts +9 -4
  130. package/dist/components/base/cards/smart-card.types.d.ts +1 -1
  131. package/dist/components/base/carousel/carousel.d.ts +3 -1
  132. package/dist/components/base/chart/chart.d.ts +7 -7
  133. package/dist/components/base/choice-inputs/checkbox.d.ts +6 -7
  134. package/dist/components/base/choice-inputs/choice-types.d.ts +10 -1
  135. package/dist/components/base/choice-inputs/pill-radio-group.d.ts +9 -0
  136. package/dist/components/base/choice-inputs/select-popup.d.ts +9 -1
  137. package/dist/components/base/choice-inputs/switch-card.d.ts +1 -1
  138. package/dist/components/base/date-pickers/date-picker-field.d.ts +23 -0
  139. package/dist/components/base/date-pickers/date-picker.recipes.d.ts +5 -18
  140. package/dist/components/base/date-pickers/datepicker.types.d.ts +16 -3
  141. package/dist/components/base/display/alert-dialog.d.ts +8 -2
  142. package/dist/components/base/display/content-block.d.ts +4 -2
  143. package/dist/components/base/display/date-block.d.ts +1 -1
  144. package/dist/components/base/display/dialog.d.ts +12 -5
  145. package/dist/components/base/display/surface-title.d.ts +6 -1
  146. package/dist/components/base/feedback/alert.d.ts +1 -1
  147. package/dist/components/base/feedback/state-display.d.ts +5 -4
  148. package/dist/components/base/forms/form-field.d.ts +1 -0
  149. package/dist/components/base/forms/form-sizing.d.ts +35 -3
  150. package/dist/components/base/forms/workflow.d.ts +2 -0
  151. package/dist/components/base/forms-numeric/coordinates-input.d.ts +3 -0
  152. package/dist/components/base/forms-numeric/rounding-mode-select.d.ts +4 -1
  153. package/dist/components/base/navigation/dropdown-menu.d.ts +2 -2
  154. package/dist/components/base/navigation/language-switcher.d.ts +4 -1
  155. package/dist/components/base/navigation/overflow-tab-bar.d.ts +7 -0
  156. package/dist/components/base/navigation/page-header/page-header.d.ts +4 -1
  157. package/dist/components/base/navigation/tabs.d.ts +3 -5
  158. package/dist/components/base/popover/popover.recipes.d.ts +3 -3
  159. package/dist/components/base/qr-code/qr-code.d.ts +2 -0
  160. package/dist/components/base/sheet/index.d.ts +29 -1
  161. package/dist/components/base/sheet/sheet.d.ts +14 -5
  162. package/dist/components/base/spinner/spinner.d.ts +3 -2
  163. package/dist/components/base/structure/structure.types.d.ts +1 -1
  164. package/dist/components/base/table/index.d.ts +1 -1
  165. package/dist/components/base/text-inputs/clear-native-field.d.ts +2 -0
  166. package/dist/components/base/text-inputs/input-group.d.ts +2 -2
  167. package/dist/components/base/text-inputs/input-trailing-action.d.ts +3 -0
  168. package/dist/components/base/upload/upload.recipes.d.ts +11 -0
  169. package/dist/components/base/value-inputs/date-time-input.d.ts +4 -2
  170. package/dist/components/base/value-inputs/tags-input.d.ts +2 -0
  171. package/dist/components/blocks/admin/api-key-list/api-key-list.types.d.ts +1 -1
  172. package/dist/components/blocks/analytics/format-metric-value.d.ts +11 -1
  173. package/dist/components/blocks/analytics/index.d.ts +1 -1
  174. package/dist/components/blocks/analytics/types.d.ts +1 -1
  175. package/dist/components/blocks/analytics/use-metric-format-options.d.ts +3 -0
  176. package/dist/components/blocks/collaboration/message/message.recipes.d.ts +12 -0
  177. package/dist/components/blocks/commerce/address-card/address-card.d.ts +1 -1
  178. package/dist/components/blocks/commerce/address-card/types.d.ts +3 -1
  179. package/dist/components/blocks/commerce/booking-calendar-event-card/booking-calendar-event-card.d.ts +4 -0
  180. package/dist/components/blocks/commerce/booking-calendar-event-card/booking-calendar-event-card.types.d.ts +2 -2
  181. package/dist/components/blocks/commerce/discount-stack/types.d.ts +1 -1
  182. package/dist/components/blocks/commerce/inventory-section/types.d.ts +4 -1
  183. package/dist/components/blocks/commerce/loyalty-points/types.d.ts +1 -1
  184. package/dist/components/blocks/commerce/order-status/types.d.ts +4 -0
  185. package/dist/components/blocks/commerce/payment-method/payment-method.d.ts +1 -1
  186. package/dist/components/blocks/commerce/payment-method/types.d.ts +3 -1
  187. package/dist/components/blocks/commerce/seo-listing/seo-listing-card.d.ts +1 -1
  188. package/dist/components/blocks/commerce/seo-listing/types.d.ts +3 -1
  189. package/dist/components/blocks/commerce/vendor-profile/types.d.ts +4 -1
  190. package/dist/components/blocks/data-display/dense-info-card/dense-info.strings.d.ts +4 -1
  191. package/dist/components/blocks/data-display/empty-state/partials/illustrations/document-stack.d.ts +1 -4
  192. package/dist/components/blocks/data-display/empty-state/partials/illustrations/inbox-clean.d.ts +1 -4
  193. package/dist/components/blocks/data-display/empty-state/partials/illustrations/index.d.ts +3 -3
  194. package/dist/components/blocks/data-display/empty-state/partials/illustrations/stacked-cards.d.ts +1 -6
  195. package/dist/components/blocks/data-display/inline-stat/inline-stat.d.ts +4 -1
  196. package/dist/components/features/combobox/components/error-message.d.ts +1 -1
  197. package/dist/components/features/comments/hooks/use-attachment-upload.d.ts +5 -0
  198. package/dist/components/features/filters/facets/search-facet.d.ts +0 -12
  199. package/dist/components/features/filters/facets/tags-facet.d.ts +1 -1
  200. package/dist/components/features/global-search/partials/global-search-idle-state.d.ts +1 -1
  201. package/dist/components/features/media-library/media-library.d.ts +1 -1
  202. package/dist/components/features/media-library/media-library.types.d.ts +9 -1
  203. package/dist/components/features/media-library/partials/media-library-partials.d.ts +1 -1
  204. package/dist/components/features/overlays/alert-dialog.d.ts +1 -1
  205. package/dist/components/features/overlays/drawer.d.ts +1 -1
  206. package/dist/components/features/overlays/hooks/use-overlay-actions.d.ts +2 -2
  207. package/dist/components/features/overlays/hooks/use-overlay-visibility.d.ts +11 -4
  208. package/dist/components/features/overlays/hooks/use-pending-overlay-focus.d.ts +2 -0
  209. package/dist/components/features/overlays/overlay-tone-icon.d.ts +37 -0
  210. package/dist/components/features/overlays/overlays.types.d.ts +46 -22
  211. package/dist/components/features/products/components/product-variants-manager.d.ts +1 -1
  212. package/dist/components/features/products/partials/index.d.ts +1 -1
  213. package/dist/components/features/products/partials/product-metric-tile.d.ts +6 -0
  214. package/dist/components/features/products/partials/product-tone.d.ts +11 -1
  215. package/dist/components/features/products/products.types.d.ts +2 -1
  216. package/dist/components/features/rich-text-editor/rich-text-editor.recipes.d.ts +2 -1
  217. package/dist/components/features/table/data-table.d.ts +1 -1
  218. package/dist/components/features/table/partials/cell-renderers.d.ts +1 -1
  219. package/dist/components/features/table/table.types.d.ts +1 -1
  220. package/dist/components/features/theme-tweaker/theme-provider-settings.d.ts +3 -1
  221. package/dist/components/layout/auth/auth.types.d.ts +1 -0
  222. package/dist/components/layout/page/index.d.ts +1 -1
  223. package/dist/components/layout/page/page.d.ts +0 -1
  224. package/dist/components/layout/page/page.types.d.ts +62 -6
  225. package/dist/components/layout/page/partials/page-header-commands.d.ts +13 -0
  226. package/dist/components/layout/page/partials/page-header.d.ts +1 -1
  227. package/dist/components/layout/sidebar/sidebar.context.d.ts +1 -1
  228. package/dist/components/layout/sidebar/sidebar.types.d.ts +4 -0
  229. package/dist/components/layout/workspace/workspace.types.d.ts +3 -0
  230. package/dist/components/primitives/date.d.ts +16 -3
  231. package/dist/components/primitives/dimensions.d.ts +6 -0
  232. package/dist/components/primitives/duration.d.ts +6 -0
  233. package/dist/components/primitives/file-size.d.ts +6 -0
  234. package/dist/components/primitives/index.d.ts +1 -1
  235. package/dist/components/primitives/initials.d.ts +11 -2
  236. package/dist/components/primitives/link.d.ts +7 -0
  237. package/dist/components/primitives/money.d.ts +29 -7
  238. package/dist/components/primitives/number.d.ts +17 -0
  239. package/dist/components/primitives/value-typography.d.ts +54 -0
  240. package/dist/components/primitives/value.d.ts +31 -6
  241. package/dist/components/typography/heading.d.ts +13 -2
  242. package/dist/components/typography/index.d.ts +1 -1
  243. package/dist/components/typography/label.d.ts +3 -0
  244. package/dist/components/typography/running-text.d.ts +12 -0
  245. package/dist/components/typography/text-link.d.ts +23 -1
  246. package/dist/components/typography/text.d.ts +12 -0
  247. package/dist/components/typography/text.styles.d.ts +37 -5
  248. package/dist/components/ui/button.d.ts +1 -1
  249. package/dist/components/ui/checkbox.d.ts +5 -0
  250. package/dist/components/ui/overlay.recipes.d.ts +15 -2
  251. package/dist/components/ui/popover.d.ts +1 -1
  252. package/dist/components/ui/select.d.ts +3 -1
  253. package/dist/components/ui/sidebar.d.ts +1 -1
  254. package/dist/components/ui/switch.d.ts +5 -0
  255. package/dist/components/ui/table.d.ts +2 -1
  256. package/dist/container.recipes-D9t8MHR3.js +27 -0
  257. package/dist/container.recipes-D9t8MHR3.js.map +1 -0
  258. package/dist/{containers-6s-ucRQQ.js → containers-D_L4mTVb.js} +34 -57
  259. package/dist/containers-D_L4mTVb.js.map +1 -0
  260. package/dist/control-group-recipes-DBXmfh2E.js +21 -0
  261. package/dist/control-group-recipes-DBXmfh2E.js.map +1 -0
  262. package/dist/{copyable-B7SBXJMr.js → copyable-DDjTeW_j.js} +6 -6
  263. package/dist/{copyable-B7SBXJMr.js.map → copyable-DDjTeW_j.js.map} +1 -1
  264. package/dist/data-display-3xWQUnMA.js +1335 -0
  265. package/dist/data-display-3xWQUnMA.js.map +1 -0
  266. package/dist/date-picker-DrDFj8Lo.js +1527 -0
  267. package/dist/date-picker-DrDFj8Lo.js.map +1 -0
  268. package/dist/date-pickers-CnFCb0n2.js +174 -0
  269. package/dist/date-pickers-CnFCb0n2.js.map +1 -0
  270. package/dist/date-uf3z37Nm.js +144 -0
  271. package/dist/date-uf3z37Nm.js.map +1 -0
  272. package/dist/{display-CFM5myut.js → display-DrdvPwF0.js} +25 -25
  273. package/dist/display-DrdvPwF0.js.map +1 -0
  274. package/dist/{dropdown-menu-BlnyHr-9.js → dropdown-menu-CURh59jb.js} +22 -15
  275. package/dist/dropdown-menu-CURh59jb.js.map +1 -0
  276. package/dist/features/activities.js +177 -163
  277. package/dist/features/activities.js.map +1 -1
  278. package/dist/features/ai-chat.js +187 -183
  279. package/dist/features/ai-chat.js.map +1 -1
  280. package/dist/features/async-preview.js +9 -9
  281. package/dist/features/async-preview.js.map +1 -1
  282. package/dist/features/combobox.js +1 -1
  283. package/dist/features/comments.js +1 -1
  284. package/dist/features/data-view.js +25 -23
  285. package/dist/features/data-view.js.map +1 -1
  286. package/dist/features/email-composer/engine.js +1 -1
  287. package/dist/features/email-composer.js +353 -355
  288. package/dist/features/email-composer.js.map +1 -1
  289. package/dist/features/event-calendar.js +346 -354
  290. package/dist/features/event-calendar.js.map +1 -1
  291. package/dist/features/filters.js +1 -1
  292. package/dist/features/global-search.js +225 -227
  293. package/dist/features/global-search.js.map +1 -1
  294. package/dist/features/kanban.js +29 -29
  295. package/dist/features/kanban.js.map +1 -1
  296. package/dist/features/map.js +59 -58
  297. package/dist/features/map.js.map +1 -1
  298. package/dist/features/media-library.js +898 -900
  299. package/dist/features/media-library.js.map +1 -1
  300. package/dist/features/mentions.js +1 -1
  301. package/dist/features/overlays.js +1 -1
  302. package/dist/features/products.js +1412 -1444
  303. package/dist/features/products.js.map +1 -1
  304. package/dist/features/questionnaire.js +51 -49
  305. package/dist/features/questionnaire.js.map +1 -1
  306. package/dist/features/resource-assignment.js +103 -97
  307. package/dist/features/resource-assignment.js.map +1 -1
  308. package/dist/features/resource.js +13 -13
  309. package/dist/features/resource.js.map +1 -1
  310. package/dist/features/rich-text-editor.js +2 -2
  311. package/dist/features/schema-form.js +187 -183
  312. package/dist/features/schema-form.js.map +1 -1
  313. package/dist/features/suggestions.js +3 -3
  314. package/dist/features/sync.js +7 -7
  315. package/dist/features/sync.js.map +1 -1
  316. package/dist/features/table.js +1 -1
  317. package/dist/features/theme-tweaker.js +508 -503
  318. package/dist/features/theme-tweaker.js.map +1 -1
  319. package/dist/{feedback-DWUkgEjR.js → feedback-C7nR0UtT.js} +30 -31
  320. package/dist/feedback-C7nR0UtT.js.map +1 -0
  321. package/dist/field-affordance-recipes-CkOCdE2y.js +46 -0
  322. package/dist/field-affordance-recipes-CkOCdE2y.js.map +1 -0
  323. package/dist/{field-state-recipes-CBTRt9Bt.js → field-state-recipes-C-MFBX_8.js} +5 -5
  324. package/dist/field-state-recipes-C-MFBX_8.js.map +1 -0
  325. package/dist/{filters-BhsUtsxW.js → filters-Da-gNPsE.js} +760 -765
  326. package/dist/filters-Da-gNPsE.js.map +1 -0
  327. package/dist/{form-field-Bn7ZH1rA.js → form-field-VZRULhUK.js} +20 -12
  328. package/dist/form-field-VZRULhUK.js.map +1 -0
  329. package/dist/form-sizing-uWP4lzVh.js +126 -0
  330. package/dist/form-sizing-uWP4lzVh.js.map +1 -0
  331. package/dist/{forms-B7pzS25o.js → forms-DDeEnXSY.js} +38 -38
  332. package/dist/forms-DDeEnXSY.js.map +1 -0
  333. package/dist/forms-numeric-D3CO60IF.js +905 -0
  334. package/dist/forms-numeric-D3CO60IF.js.map +1 -0
  335. package/dist/{header-C59QZyxV.js → header-2ycNqGOR.js} +42 -37
  336. package/dist/header-2ycNqGOR.js.map +1 -0
  337. package/dist/{hooks-CM1Vp9Pe.js → hooks-DQ5SPwZw.js} +2 -2
  338. package/dist/{hooks-CM1Vp9Pe.js.map → hooks-DQ5SPwZw.js.map} +1 -1
  339. package/dist/{http-CLTVJc5I.js → http-CdEIHyQf.js} +2 -2
  340. package/dist/http-CdEIHyQf.js.map +1 -0
  341. package/dist/{icon-badge-Dv0RYQwj.js → icon-badge-DKlaKXoo.js} +4 -4
  342. package/dist/{icon-badge-Dv0RYQwj.js.map → icon-badge-DKlaKXoo.js.map} +1 -1
  343. package/dist/index.js +2 -2
  344. package/dist/input-BoLm9Hks.js +20 -0
  345. package/dist/input-BoLm9Hks.js.map +1 -0
  346. package/dist/input-DhQdBnV3.js +255 -0
  347. package/dist/input-DhQdBnV3.js.map +1 -0
  348. package/dist/item-xzh8Df65.js +264 -0
  349. package/dist/item-xzh8Df65.js.map +1 -0
  350. package/dist/layout/app-shell.js +1 -1
  351. package/dist/layout/auth.js +1 -1
  352. package/dist/layout/containers.js +1 -1
  353. package/dist/layout/header.js +1 -1
  354. package/dist/layout/hooks.js +1 -1
  355. package/dist/layout/navigation.js +1 -1
  356. package/dist/layout/page.js +1 -1
  357. package/dist/layout/settings.js +1 -1
  358. package/dist/layout/sidebar.js +2 -2
  359. package/dist/layout/workspace.js +1 -1
  360. package/dist/layout.js +10 -10
  361. package/dist/lib/affordance-geometry.generated.d.ts +46 -10
  362. package/dist/lib/control-group-recipes.d.ts +22 -0
  363. package/dist/lib/field-affordance-recipes.d.ts +70 -2
  364. package/dist/lib/field-state-recipes.d.ts +6 -4
  365. package/dist/lib/format.d.ts +9 -0
  366. package/dist/lib/money-format.d.ts +30 -0
  367. package/dist/lib/navigation-row-recipes.d.ts +3 -2
  368. package/dist/lib/overlay-anatomy-recipes.d.ts +2 -2
  369. package/dist/lib/surface-recipes.d.ts +13 -8
  370. package/dist/lib/token-merge.generated.d.ts +144 -2
  371. package/dist/lib/track-recipes.d.ts +1 -1
  372. package/dist/lib/ui-provider/provider.d.ts +7 -2
  373. package/dist/lib/ui-provider/store.d.ts +6 -2
  374. package/dist/lib/ui-provider/types.d.ts +9 -4
  375. package/dist/lib/use-prefers-reduced-motion.d.ts +2 -0
  376. package/dist/lib/utils.js +1 -1
  377. package/dist/media-gallery-DQUQ0m3O.js +201 -0
  378. package/dist/media-gallery-DQUQ0m3O.js.map +1 -0
  379. package/dist/{mentions-B8Ko-fhS.js → mentions-DwnO1hh4.js} +40 -39
  380. package/dist/{mentions-B8Ko-fhS.js.map → mentions-DwnO1hh4.js.map} +1 -1
  381. package/dist/message-YfFmbXNP.js +127 -0
  382. package/dist/message-YfFmbXNP.js.map +1 -0
  383. package/dist/{navigation-BUIn2Qxx.js → navigation-Cbp5V8gG.js} +27 -28
  384. package/dist/navigation-Cbp5V8gG.js.map +1 -0
  385. package/dist/navigation-Cs1npsPm.js +300 -0
  386. package/dist/navigation-Cs1npsPm.js.map +1 -0
  387. package/dist/{navigation-row-recipes-GVh11KiT.js → navigation-row-recipes-DlU-4QYO.js} +3 -3
  388. package/dist/navigation-row-recipes-DlU-4QYO.js.map +1 -0
  389. package/dist/number-CKRBYmZK.js +352 -0
  390. package/dist/number-CKRBYmZK.js.map +1 -0
  391. package/dist/overlay.recipes-CNO2S9V6.js +34 -0
  392. package/dist/overlay.recipes-CNO2S9V6.js.map +1 -0
  393. package/dist/overlays-DhZO7N-I.js +994 -0
  394. package/dist/overlays-DhZO7N-I.js.map +1 -0
  395. package/dist/page-C6R_8jFt.js +325 -0
  396. package/dist/page-C6R_8jFt.js.map +1 -0
  397. package/dist/{page-header-DQRa0jug.js → page-header-hUTzcRZX.js} +12 -12
  398. package/dist/page-header-hUTzcRZX.js.map +1 -0
  399. package/dist/{pagination-C29vvt3I.js → pagination-Cm0jqa3I.js} +21 -21
  400. package/dist/pagination-Cm0jqa3I.js.map +1 -0
  401. package/dist/{popover-CoLDEg19.js → popover-Dcv_9jxr.js} +23 -22
  402. package/dist/popover-Dcv_9jxr.js.map +1 -0
  403. package/dist/{popover-menu-GLIQTJTx.js → popover-menu-DnRFKnHP.js} +6 -6
  404. package/dist/{popover-menu-GLIQTJTx.js.map → popover-menu-DnRFKnHP.js.map} +1 -1
  405. package/dist/{popover.recipes-zgBhMlUu.js → popover.recipes-wmbvL8Ah.js} +5 -5
  406. package/dist/popover.recipes-wmbvL8Ah.js.map +1 -0
  407. package/dist/primitives-BHrwQXFC.js +379 -0
  408. package/dist/primitives-BHrwQXFC.js.map +1 -0
  409. package/dist/primitives.js +5 -5
  410. package/dist/{progress-BOe8l_FZ.js → progress-Br9WTFya.js} +12 -11
  411. package/dist/progress-Br9WTFya.js.map +1 -0
  412. package/dist/{receipt-BM8xsGFy.js → receipt-CV89q1fs.js} +8 -8
  413. package/dist/{receipt-BM8xsGFy.js.map → receipt-CV89q1fs.js.map} +1 -1
  414. package/dist/rich-text-editor-CF8QYt5p.js +574 -0
  415. package/dist/rich-text-editor-CF8QYt5p.js.map +1 -0
  416. package/dist/{rich-text-editor.recipes-DxvOE0Lp.js → rich-text-editor.recipes-CnrbmTS1.js} +35 -26
  417. package/dist/rich-text-editor.recipes-CnrbmTS1.js.map +1 -0
  418. package/dist/{rich-text-B7sBAdDG.js → rich-text-j-FGAeZW.js} +4 -4
  419. package/dist/{rich-text-B7sBAdDG.js.map → rich-text-j-FGAeZW.js.map} +1 -1
  420. package/dist/{scroll-area-BheMQ270.js → scroll-area-DRdr16Pt.js} +3 -3
  421. package/dist/scroll-area-DRdr16Pt.js.map +1 -0
  422. package/dist/{separator-DO0EbCEm.js → separator-BMEvwnSX.js} +2 -2
  423. package/dist/{separator-DO0EbCEm.js.map → separator-BMEvwnSX.js.map} +1 -1
  424. package/dist/{separator-Gk_WXH-l.js → separator-Do5GWDYi.js} +4 -4
  425. package/dist/separator-Do5GWDYi.js.map +1 -0
  426. package/dist/services/actions/action-adapters.d.ts +4 -0
  427. package/dist/services/actions.js +8 -3
  428. package/dist/services/actions.js.map +1 -1
  429. package/dist/{settings-BnCyyPOJ.js → settings-DHk0L2MF.js} +20 -19
  430. package/dist/settings-DHk0L2MF.js.map +1 -0
  431. package/dist/sheet-DRFNY1_D.js +207 -0
  432. package/dist/sheet-DRFNY1_D.js.map +1 -0
  433. package/dist/sidebar-Cb8WzOvE.js +511 -0
  434. package/dist/sidebar-Cb8WzOvE.js.map +1 -0
  435. package/dist/{sidebar-DPR7fmqN.js → sidebar-Crc9M9JV.js} +220 -201
  436. package/dist/sidebar-Crc9M9JV.js.map +1 -0
  437. package/dist/{skeleton-CmT1ppqb.js → skeleton-DVMXr15h.js} +5 -5
  438. package/dist/{skeleton-CmT1ppqb.js.map → skeleton-DVMXr15h.js.map} +1 -1
  439. package/dist/smart-card-Bek-TwUp.js +599 -0
  440. package/dist/smart-card-Bek-TwUp.js.map +1 -0
  441. package/dist/{spinner-BY9HbUEh.js → spinner-CmTAbEp0.js} +8 -6
  442. package/dist/spinner-CmTAbEp0.js.map +1 -0
  443. package/dist/{structure-MvKVq-oL.js → structure-hzCW-XsV.js} +3 -3
  444. package/dist/{structure-MvKVq-oL.js.map → structure-hzCW-XsV.js.map} +1 -1
  445. package/dist/{structure.recipes-Bqhf9oIh.js → structure.recipes-EPz60cU8.js} +37 -19
  446. package/dist/structure.recipes-EPz60cU8.js.map +1 -0
  447. package/dist/style.css +1 -1
  448. package/dist/surface-recipes-DOdoBXGm.js +28 -0
  449. package/dist/surface-recipes-DOdoBXGm.js.map +1 -0
  450. package/dist/table-D6zKeYQX.js +162 -0
  451. package/dist/table-D6zKeYQX.js.map +1 -0
  452. package/dist/table-Dn4XSrSB.js +1444 -0
  453. package/dist/table-Dn4XSrSB.js.map +1 -0
  454. package/dist/tabs-Dk8E_knt.js +189 -0
  455. package/dist/tabs-Dk8E_knt.js.map +1 -0
  456. package/dist/text-inputs-BFpku0Qd.js +331 -0
  457. package/dist/text-inputs-BFpku0Qd.js.map +1 -0
  458. package/dist/{text.styles-BwB7vAF2.js → text.styles-g4He6UIW.js} +26 -15
  459. package/dist/text.styles-g4He6UIW.js.map +1 -0
  460. package/dist/theme.css +90 -124
  461. package/dist/themes/green.css +24 -0
  462. package/dist/{timelines-B9ICkQcV.js → timelines-CxuAFIc2.js} +97 -104
  463. package/dist/timelines-CxuAFIc2.js.map +1 -0
  464. package/dist/track-recipes-CDcKmndW.js +10 -0
  465. package/dist/track-recipes-CDcKmndW.js.map +1 -0
  466. package/dist/{tree-BdWSaoFT.js → tree-BotPlyiD.js} +13 -13
  467. package/dist/{tree-BdWSaoFT.js.map → tree-BotPlyiD.js.map} +1 -1
  468. package/dist/typography/rich-text.js +1 -1
  469. package/dist/typography-CAr3dQhX.js +116 -0
  470. package/dist/typography-CAr3dQhX.js.map +1 -0
  471. package/dist/typography.js +2 -2
  472. package/dist/{ui-provider-CftIB6TY.js → ui-provider-D2_TeLqw.js} +22 -22
  473. package/dist/ui-provider-D2_TeLqw.js.map +1 -0
  474. package/dist/ui-provider.js +1 -1
  475. package/dist/{upload-D8Za5x_c.js → upload-B0WHW7ak.js} +278 -274
  476. package/dist/upload-B0WHW7ak.js.map +1 -0
  477. package/dist/{upload-queue-hIIYBLS7.js → upload-queue-BHZ_wBfd.js} +72 -75
  478. package/dist/upload-queue-BHZ_wBfd.js.map +1 -0
  479. package/dist/{usage-card-DnmnJ58D.js → usage-card-U0YBLTNT.js} +31 -33
  480. package/dist/usage-card-U0YBLTNT.js.map +1 -0
  481. package/dist/utils-Cospvlj1.js +4445 -0
  482. package/dist/utils-Cospvlj1.js.map +1 -0
  483. package/dist/value-inputs-CjfzGMsN.js +854 -0
  484. package/dist/value-inputs-CjfzGMsN.js.map +1 -0
  485. package/dist/value-typography-Deb3yQZg.js +116 -0
  486. package/dist/value-typography-Deb3yQZg.js.map +1 -0
  487. package/dist/{workspace-C1PZmk8L.js → workspace-YoFjXi6i.js} +97 -105
  488. package/dist/workspace-YoFjXi6i.js.map +1 -0
  489. package/docs/consumer-skill/SKILL.md +123 -119
  490. package/docs/consumer-skill/examples/analytics.tsx +34 -0
  491. package/docs/consumer-skill/examples/app-layout.tsx +42 -14
  492. package/docs/consumer-skill/examples/detail.tsx +20 -5
  493. package/docs/consumer-skill/examples/edit.tsx +1 -1
  494. package/docs/consumer-skill/examples/layout-blocks.tsx +20 -0
  495. package/docs/consumer-skill/examples/manifest.json +37 -3
  496. package/docs/consumer-skill/examples/scoped-directory.tsx +2 -2
  497. package/docs/consumer-skill/examples/website.tsx +56 -0
  498. package/docs/consumer-skill/references/analytics.md +70 -0
  499. package/docs/consumer-skill/references/composition.md +195 -9
  500. package/docs/consumer-skill/references/design-contract.md +33 -7
  501. package/docs/consumer-skill/references/discovery.md +80 -5
  502. package/docs/consumer-skill/references/installation.md +22 -0
  503. package/docs/consumer-skill/references/integration.md +46 -1
  504. package/docs/consumer-skill/references/public-api.json +2083 -237
  505. package/docs/consumer-skill/references/review.md +74 -6
  506. package/docs/consumer-skill/references/theming.md +59 -8
  507. package/docs/consumer-skill/references/tokens.json +180 -9
  508. package/docs/consumer-skill/references/workflows.md +34 -0
  509. package/docs/consumer-skill/scripts/check-composition.mjs +1 -1
  510. package/docs/consumer-skill/scripts/composition-policy.mjs +271 -18
  511. package/docs/consumer-skill/scripts/discovery.mjs +69 -9
  512. package/docs/consumer-skill/scripts/pin-button-defaults.mjs +95 -0
  513. package/docs/consumer-skill/scripts/surface-policy.mjs +44 -0
  514. package/package.json +11 -6
  515. package/dist/accordion-B-5Focs8.js.map +0 -1
  516. package/dist/action-menu-Cx3SdfbN.js +0 -265
  517. package/dist/action-menu-Cx3SdfbN.js.map +0 -1
  518. package/dist/affordance-geometry.generated-D8Jcfb0G.js +0 -32
  519. package/dist/affordance-geometry.generated-D8Jcfb0G.js.map +0 -1
  520. package/dist/ai-artifact-B5tPpXnS.js.map +0 -1
  521. package/dist/app-shell-at8Kt4l_.js.map +0 -1
  522. package/dist/attachment-BO2R47wn.js.map +0 -1
  523. package/dist/auth-OFwWSAap.js +0 -704
  524. package/dist/auth-OFwWSAap.js.map +0 -1
  525. package/dist/avatar-Bpzty83c.js.map +0 -1
  526. package/dist/badge-BZXZT9wd.js.map +0 -1
  527. package/dist/breadcrumbs-DdQ_I5ra.js.map +0 -1
  528. package/dist/button-BS6l5JUw.js.map +0 -1
  529. package/dist/buttons-Co6GavvM.js +0 -674
  530. package/dist/buttons-Co6GavvM.js.map +0 -1
  531. package/dist/chart-DVfcwQu6.js +0 -149
  532. package/dist/chart-DVfcwQu6.js.map +0 -1
  533. package/dist/checkbox-BavDRjF7.js +0 -34
  534. package/dist/checkbox-BavDRjF7.js.map +0 -1
  535. package/dist/choice-inputs-CC7XqPQO.js +0 -619
  536. package/dist/choice-inputs-CC7XqPQO.js.map +0 -1
  537. package/dist/code-block-xHKbAJDj.js.map +0 -1
  538. package/dist/combobox-DEbdr-3u.js +0 -273
  539. package/dist/combobox-DEbdr-3u.js.map +0 -1
  540. package/dist/combobox-xv3yJbzl.js +0 -850
  541. package/dist/combobox-xv3yJbzl.js.map +0 -1
  542. package/dist/command-C0xe7u9B.js.map +0 -1
  543. package/dist/comments-DviPLnwy.js.map +0 -1
  544. package/dist/containers-6s-ucRQQ.js.map +0 -1
  545. package/dist/data-display-cWIRdeaf.js +0 -1129
  546. package/dist/data-display-cWIRdeaf.js.map +0 -1
  547. package/dist/date-BFNMnrS5.js +0 -140
  548. package/dist/date-BFNMnrS5.js.map +0 -1
  549. package/dist/date-picker-CA6ogMQB.js +0 -1521
  550. package/dist/date-picker-CA6ogMQB.js.map +0 -1
  551. package/dist/date-pickers-BPIKLdsD.js +0 -224
  552. package/dist/date-pickers-BPIKLdsD.js.map +0 -1
  553. package/dist/display-CFM5myut.js.map +0 -1
  554. package/dist/dropdown-menu-BlnyHr-9.js.map +0 -1
  555. package/dist/feedback-DWUkgEjR.js.map +0 -1
  556. package/dist/field-affordance-recipes-IjzPrCTw.js +0 -17
  557. package/dist/field-affordance-recipes-IjzPrCTw.js.map +0 -1
  558. package/dist/field-state-recipes-CBTRt9Bt.js.map +0 -1
  559. package/dist/filters-BhsUtsxW.js.map +0 -1
  560. package/dist/form-field-Bn7ZH1rA.js.map +0 -1
  561. package/dist/form-sizing-BWs70_a2.js +0 -100
  562. package/dist/form-sizing-BWs70_a2.js.map +0 -1
  563. package/dist/format-iamDSqs2.js +0 -110
  564. package/dist/format-iamDSqs2.js.map +0 -1
  565. package/dist/forms-B7pzS25o.js.map +0 -1
  566. package/dist/forms-numeric-BUBxELBv.js +0 -867
  567. package/dist/forms-numeric-BUBxELBv.js.map +0 -1
  568. package/dist/header-C59QZyxV.js.map +0 -1
  569. package/dist/http-CLTVJc5I.js.map +0 -1
  570. package/dist/input-WwYQZJzG.js +0 -202
  571. package/dist/input-WwYQZJzG.js.map +0 -1
  572. package/dist/input-ci9fIgFH.js +0 -20
  573. package/dist/input-ci9fIgFH.js.map +0 -1
  574. package/dist/item-pJ0GsOiJ.js +0 -257
  575. package/dist/item-pJ0GsOiJ.js.map +0 -1
  576. package/dist/media-gallery-DhDRgnVZ.js +0 -200
  577. package/dist/media-gallery-DhDRgnVZ.js.map +0 -1
  578. package/dist/message-COsdEvXT.js +0 -108
  579. package/dist/message-COsdEvXT.js.map +0 -1
  580. package/dist/navigation-BUIn2Qxx.js.map +0 -1
  581. package/dist/navigation-DBEu4POU.js +0 -267
  582. package/dist/navigation-DBEu4POU.js.map +0 -1
  583. package/dist/navigation-row-recipes-GVh11KiT.js.map +0 -1
  584. package/dist/number-BNT_BIzJ.js +0 -269
  585. package/dist/number-BNT_BIzJ.js.map +0 -1
  586. package/dist/overlay.recipes-BxW5FIfK.js +0 -6
  587. package/dist/overlay.recipes-BxW5FIfK.js.map +0 -1
  588. package/dist/overlays-B11wZka6.js +0 -982
  589. package/dist/overlays-B11wZka6.js.map +0 -1
  590. package/dist/page-BV6ioQg3.js +0 -202
  591. package/dist/page-BV6ioQg3.js.map +0 -1
  592. package/dist/page-header-DQRa0jug.js.map +0 -1
  593. package/dist/pagination-C29vvt3I.js.map +0 -1
  594. package/dist/popover-CoLDEg19.js.map +0 -1
  595. package/dist/popover.recipes-zgBhMlUu.js.map +0 -1
  596. package/dist/primitives-DKPOGVpj.js +0 -330
  597. package/dist/primitives-DKPOGVpj.js.map +0 -1
  598. package/dist/progress-BOe8l_FZ.js.map +0 -1
  599. package/dist/rich-text-editor-CoVrTiSv.js +0 -575
  600. package/dist/rich-text-editor-CoVrTiSv.js.map +0 -1
  601. package/dist/rich-text-editor.recipes-DxvOE0Lp.js.map +0 -1
  602. package/dist/scroll-area-BheMQ270.js.map +0 -1
  603. package/dist/select-B2mb-qN2.js +0 -108
  604. package/dist/select-B2mb-qN2.js.map +0 -1
  605. package/dist/separator-Gk_WXH-l.js.map +0 -1
  606. package/dist/settings-BnCyyPOJ.js.map +0 -1
  607. package/dist/sheet-B-q914Ad.js +0 -205
  608. package/dist/sheet-B-q914Ad.js.map +0 -1
  609. package/dist/sidebar-C_2p3Tfj.js +0 -501
  610. package/dist/sidebar-C_2p3Tfj.js.map +0 -1
  611. package/dist/sidebar-DPR7fmqN.js.map +0 -1
  612. package/dist/smart-card-CYLn46e6.js +0 -578
  613. package/dist/smart-card-CYLn46e6.js.map +0 -1
  614. package/dist/spinner-BY9HbUEh.js.map +0 -1
  615. package/dist/structure.recipes-Bqhf9oIh.js.map +0 -1
  616. package/dist/surface-recipes-CQfRr-VL.js +0 -27
  617. package/dist/surface-recipes-CQfRr-VL.js.map +0 -1
  618. package/dist/table-BS39xnlq.js +0 -1424
  619. package/dist/table-BS39xnlq.js.map +0 -1
  620. package/dist/table-DnlAJ-xR.js +0 -146
  621. package/dist/table-DnlAJ-xR.js.map +0 -1
  622. package/dist/tabs-B5cNMWiP.js +0 -187
  623. package/dist/tabs-B5cNMWiP.js.map +0 -1
  624. package/dist/text-inputs-Dh9XGyiS.js +0 -331
  625. package/dist/text-inputs-Dh9XGyiS.js.map +0 -1
  626. package/dist/text.styles-BwB7vAF2.js.map +0 -1
  627. package/dist/timelines-B9ICkQcV.js.map +0 -1
  628. package/dist/track-recipes-LLPNVwFg.js +0 -10
  629. package/dist/track-recipes-LLPNVwFg.js.map +0 -1
  630. package/dist/typography-Cv8MT-82.js +0 -96
  631. package/dist/typography-Cv8MT-82.js.map +0 -1
  632. package/dist/ui-provider-CftIB6TY.js.map +0 -1
  633. package/dist/upload-D8Za5x_c.js.map +0 -1
  634. package/dist/upload-queue-hIIYBLS7.js.map +0 -1
  635. package/dist/usage-card-DnmnJ58D.js.map +0 -1
  636. package/dist/utils-C2EKeIw3.js +0 -72
  637. package/dist/utils-C2EKeIw3.js.map +0 -1
  638. package/dist/value-inputs-DX2dbxjj.js +0 -824
  639. package/dist/value-inputs-DX2dbxjj.js.map +0 -1
  640. package/dist/workspace-C1PZmk8L.js.map +0 -1
@@ -0,0 +1,70 @@
1
+ # Metrics and statistics
2
+
3
+ Use this reference for dashboard KPIs, revenue overviews, statistic cards and
4
+ usage summaries. The finder returns exact owners, relevant symbols and recipe
5
+ reads; declarations establish the current props. These components present
6
+ application data and never fetch or define a business metric.
7
+
8
+ ## Select the subject owner
9
+
10
+ | Subject | Public owner | Frame and lifecycle |
11
+ | --- | --- | --- |
12
+ | One KPI with value, trend or sparkline | `Metric` from `themelia-react-ui/blocks/analytics` | `variant="card"` owns its Card; default/compact/minimal support lower-level composition. Has loading/error presentation. |
13
+ | Peer dashboard KPIs or revenue figures | `MetricGrid` from `themelia-react-ui/blocks/analytics` | Defaults to card metrics; owns gaps and columns responding to its parent. `columns` is a maximum. Has loading, while error/retry/empty remain app-owned. |
14
+ | Metrics sharing one strip and period action | `MetricBar` from `themelia-react-ui/blocks/analytics` | One strip from `MetricData[]`; period callback requests the current period value. App owns choosing/fetching periods and request states. |
15
+ | Current versus previous metric | `MetricComparison` from `themelia-react-ui/blocks/analytics` | Uses current/previous `MetricData`; app defines the comparison baseline. |
16
+ | Used/limit quotas with shares, daily values and period selection | `UsageCard` from `themelia-react-ui/blocks/analytics/usage-card` | Owns a Card and ready/loading/error/empty presentation with retry/period callbacks. No optional chart peer. |
17
+ | One plain label/value fact | `InlineStat` from `themelia-react-ui/blocks/data-display` | Card-free; app chooses whether this subject needs a Card. |
18
+ | Several facts about one record | `MetadataList` from `themelia-react-ui/blocks/data-display` | Card-free; value primitives own formatting. |
19
+ | Caller-owned chart series | `ChartCard` from `themelia-react-ui/blocks/analytics` | Card-free chart composition; caller supplies chart content and an optional Card boundary. |
20
+
21
+ Start with these subject owners before constructing a Card with a number and
22
+ supporting text. Reuse their formatting, hierarchy and relevant states when
23
+ the contract fits. A custom Card remains appropriate for a distinct subject
24
+ or task with content/coordination these owners do not represent; keep their
25
+ supported lower owners where useful. Do not put another Card around an owner
26
+ that already renders its own surface.
27
+
28
+ ## Dashboard and revenue data
29
+
30
+ [Analytics recipe](../examples/analytics.tsx) exports `RevenueOverview`,
31
+ `RevenueMetric` and `PlainStatistic`. The overview accepts discriminated request
32
+ state: loading renders MetricGrid skeletons, error replaces data with retry,
33
+ and a ready empty array renders EmptyState. The parent supplies labels/IDs for
34
+ loading metrics, accepts server data, executes retry and ignores stale results.
35
+ It adds no implicit Card around the grid. The other exports show a standalone
36
+ Metric and a plain factual InlineStat.
37
+
38
+ `MetricData` requires stable `id`, `label` and `value`. Numeric currency values
39
+ use `valueType="currency"` plus `currency`; pass major currency units, rather
40
+ than a Money primitive's `unit="minor"` contract. Percentage values follow the
41
+ shared formatter's ratio contract (0.12 renders 12%). `null` is unavailable;
42
+ zero is real data. A string is already display data. `change.value` is caller
43
+ copy, `change.direction` describes movement, and `trend` can override whether
44
+ movement is positive, negative or neutral. A decline in churn can be positive.
45
+ Keep the selected period and baseline clear in application context.
46
+
47
+ `MetricGrid` forwards one `variant`, size and state recipe to its peers. Its
48
+ default `gap="xl"` and Card insets remain independent from text/media `size`.
49
+ Narrow parents reduce track count even on a wide viewport. Use `columns` and
50
+ the public variants rather than overriding its internal grid, Card padding,
51
+ value typography or sparkline geometry.
52
+
53
+ The analytics family declaration/runtime graph requires the optional `recharts`
54
+ peer even when a selected presentation hides its sparkline. Read the finder
55
+ result's peers and installed declarations. UsageCard has a focused leaf import;
56
+ its quota model differs from general MetricData.
57
+
58
+ ## Usage, facts and verification
59
+
60
+ For `UsageCard` period/loading/error/retry and quota meaning, read
61
+ [usage workflow](workflows.md#task-summaries-usage-and-inline-editing) and its
62
+ [workspace summary recipe](../examples/planning-usage-edit.tsx).
63
+ For record facts, choose MetadataList and primitives through the
64
+ [detail recipe](../examples/detail.tsx), then decide Page and Card boundaries
65
+ using [composition](composition.md#compose-from-the-task).
66
+
67
+ Verify zero/unavailable values, loading/error/retry/empty, accepted period data,
68
+ long labels/amounts, narrow parent widths and light/dark surfaces. Run the app's
69
+ types and behavior checks; discovery and typechecking do not prove rendered
70
+ geometry, keyboard callbacks or business-data correctness.
@@ -30,6 +30,7 @@ a detail workspace or a form; they need different information hierarchies.
30
30
  | ResourceCell | Identity inside a table cell | Item for independent list entries; MetadataList for label/value facts about one subject |
31
31
  | Page / application shell | Route identity, navigation, content bounds and page commands | Card for an independent subject within that route; do not repeat the same heading merely to frame a table |
32
32
  | Card | One subject needs a frame and headed regions | `surface="flat" padding="none"` inside an existing boundary; nested DataTable uses its own `surface="flat"` |
33
+ | Metric / MetricGrid / MetricBar | A KPI needs formatted value, comparison/trend or peer layout | UsageCard for used/limit quotas; InlineStat for one plain fact, MetadataList for several record facts |
33
34
  | FormField / InlineEdit | A field needs label/hint/error, or isolated save/cancel | Complete feature/overlay for a workflow; app form owns whole-record submission |
34
35
 
35
36
  For a DataTable composition, put queries in `topbarContent`, exports or collection
@@ -53,11 +54,26 @@ accessibility needs and the task can justify richer rows. Explain the priority.
53
54
  Custom ResourceCell metadata is caller content; use shared supporting typography
54
55
  and CellStack where its smaller secondary-value contract fits.
55
56
 
56
- Commands need explicit importance as well as scope. PageActions does not infer
57
- primary tone from a label such as “New contact”; choose `tone="primary"` when
58
- that is the route's main command. Permissions and destructive intent remain
59
- application decisions. A back link, export and destructive command should not
60
- all inherit the same visual emphasis by accident.
57
+ Commands need explicit importance as well as scope. Describe page commands by
58
+ role in Page's header: `primaryAction` is the route's one main command, and
59
+ `secondaryActions` lists supporting commands in priority order. The header owns
60
+ their treatment: a solid primary button, outline secondary buttons, and a More
61
+ actions menu for overflow, destructive commands and narrow screens. Choosing which
62
+ command is primary, which are `destructive`, and which are `visible` remains an
63
+ application decision; confirm destructive commands in their handler. Use
64
+ `actions` only for non-command controls such as a period select. A back link,
65
+ export and destructive command should not all inherit the same visual emphasis.
66
+
67
+ ```tsx
68
+ <Page header={{
69
+ title: 'Contacts',
70
+ primaryAction: { label: 'New contact', icon: Plus, onClick: onCreate },
71
+ secondaryActions: [
72
+ { label: 'Export', onClick: onExport },
73
+ { label: 'Delete list', destructive: true, onClick: confirmDelete },
74
+ ],
75
+ }}>{/* route content */}</Page>
76
+ ```
61
77
 
62
78
  | Drift | Better decision |
63
79
  | --- | --- |
@@ -74,6 +90,48 @@ and public anatomy, not imitate one screenshot.
74
90
 
75
91
  Use the exact family declarations from public-api.json. Catalogue URLs and source folders are not import contracts.
76
92
 
93
+ For dashboard KPIs, revenue and statistic cards, read the focused
94
+ [analytics selection and recipe](analytics.md). Metric's card variant,
95
+ MetricGrid's default peers and UsageCard own their surfaces. A distinct custom
96
+ Card subject remains valid; compare the complete subject contract before rebuilding
97
+ formatting, hierarchy or request-state presentation from lower text primitives.
98
+
99
+ For rows, grids, main/aside regions and matching peer gaps, use the
100
+ [layout-owner map](#structure-and-spacing).
101
+
102
+ ### Headed blocks inside surfaces
103
+
104
+ AddressCard, PaymentMethod, SeoListingCard and ProductVariantsManager accept
105
+ Card's `surface`, `padding` and `headerDivider` props. Use `surface="card"` when
106
+ that owner is the framed subject; it supplies the header and aligned body insets
107
+ and inherits provider dividers. Do not add an untitled padded Card around it.
108
+ Omit surface for an unframed embedded subject; its header rule defaults off.
109
+ An explicit divider still wins. ProductVariantsManager also forwards
110
+ `footerDivider` for its footer slot. Separate reusable body content can still be
111
+ composed in a caller-owned Card; choose one owner for each headed boundary.
112
+
113
+ ## Public websites and service overviews
114
+
115
+ Compose a landing page or public website from its content. `Container` owns the
116
+ centered measure and inline gutters; `Section` owns semantic content groups and
117
+ their sibling rhythm. Stack/Grid arrange copy, actions and peer subjects. Shared
118
+ Heading/Text roles preserve typography while heading tags express document order.
119
+ Choose `Page` when its route identity, commands and composition slots fit; choose
120
+ Container/Section when content leads. AppLayout supplies application chrome when
121
+ the product needs it. These are application choices, not required website shells.
122
+
123
+ The app owns section order, hero content, media, link destinations, responsive
124
+ placement and brand theming through existing semantic roots. Keep one inset owner:
125
+ Container supplies inline gutters, a site boundary may supply semantic block
126
+ padding, and each independently framed subject keeps Card's default inset.
127
+
128
+ A service offer or pricing option is a legitimate Card subject. Put its name and
129
+ description in the header, price through Money, and navigation in the footer seam.
130
+ Metric/MetricGrid represent observed KPIs and comparisons; a selling price belongs
131
+ to the offer's content. Preserve application-owned currency, billing terms and
132
+ destinations. See the typed [website recipe](../examples/website.tsx), which uses
133
+ ordinary document scrolling and a responsive service grid with real link actions.
134
+
77
135
  ## Typography and rich content
78
136
 
79
137
  Choose Heading, Text, DisplayLabel, Label and TextLink from the published
@@ -101,24 +159,108 @@ the content owner. Embedded React UI can opt out of reading rhythm through
101
159
  `not-typeset` or `data-not-typeset` on its subtree; those opt-outs do not bypass
102
160
  HTML sanitization or establish a separate typography system.
103
161
 
162
+ ### Visual heading emphasis
163
+
164
+ `Heading tag="h1"` preserves the compact admin default. For website/hero copy,
165
+ choose `size="3xl"` or `size="4xl"`; sections may use `size="xl"` or `"2xl"`.
166
+ The semantic tag, visual size and surrounding Section/Stack gap are independent.
167
+ Existing text-size classes remain supported overrides. Section owns rhythm,
168
+ Container owns measure/gutters, and application utilities may own a hero's outer
169
+ padding or background. No additional section/hero theme tokens are required.
170
+ See the [website example](../examples/website.tsx) for both hero and section emphasis.
171
+
172
+
104
173
  ## Card anatomy
105
174
 
106
175
  Card surface="card" is the ordinary bordered surface; surface="framed" retains its ring recipe; surface="flat" padding="none" composes within an existing boundary. headerPlacement="frame" places title/icon/actions above an inset body, retaining default corners and using rounded-inner on that body.
107
176
 
177
+ Choose one ordinary Card surface through UIProvider's `card.defaultSurface` and
178
+ let sibling subjects inherit it. Explicit per-card surfaces win: mixing `card`
179
+ and `framed` intentionally changes their visible treatment. Header placement is
180
+ independent: `inside` keeps the heading with the body; `frame` puts context and
181
+ commands on the outer frame above the inset body. A Card title needs no icon;
182
+ pass `icon={<Icon />}` only when the glyph carries meaning (state, a brand, a type
183
+ users scan for), never as raw SVG in title JSX. Custom titles remain appropriate
184
+ for richer content. Facts and rows follow the same rule: one glyph repeated on
185
+ every MetadataList item or Item row is decoration, so leave `icon`/media empty.
186
+
108
187
  Card `gap` owns spacing between regions; `contentGap` owns direct body-child
109
188
  spacing; `textGap` owns title/supporting-copy rhythm. Region spacing defaults to
110
189
  `xl` (`md` for `padding="none"`). Use a semantic region gap for compact cards
111
190
  instead of resetting padding or adding local margins.
112
191
 
192
+ Ordinary independent cards omit `padding` and retain `md` (the full surface
193
+ inset, 20px at default roots). `sm` is half that inset (10px), for a deliberately
194
+ compact subject; it is not the default for forms, settings, metrics or resource
195
+ pages. Component size and
196
+ density do not choose Card padding. `lg` uses 1.8 times the inset (36px), while
197
+ `none` removes it. All sizes follow the surface roots and space-scale.
198
+ Dividers are off by default and
199
+ should stay off: separate a card's sections with `contentGap` or a Stack gap
200
+ clearly larger than the row gap (`2xl` between sections). UIProvider can configure
201
+ `card.defaultHeaderDivider` and `card.defaultFooterDivider`; explicit per-card
202
+ booleans win. Header/footer-only cards still render one shared divider.
203
+
113
204
  Use titleSuffix for status/count/version badges. Long titles/suffixes wrap through the shared owner; no literal spaces/local margins to manufacture gaps. headerAction/actions are trailing controls, headerStart pre-title context. footerSlot/footer definitions own card-level actions; footerDivider owns the rule and inset. Do not simulate a footer inside children. SmartCard and ContentBlock are deprecated migration names; use Card in new code.
114
205
 
115
206
  Reusable blocks/features stay card-free unless their explicit purpose is a card. Frame them at the composition boundary.
116
207
 
117
208
  ## Structure and spacing
118
209
 
119
- Shells own gutters, surfaces own padding, sections own rhythm, Stack/Grid own sibling gaps, typography owns none. Prefer gap/padding/size props to local appearance overrides.
210
+ Choose the smallest owner that describes the region. These layout blocks are
211
+ published primitives and layouts, not the domain compositions under `blocks/*`.
120
212
 
121
- Grid exposes viewport columns; AdaptiveGrid responds to parent width and a semantic minimum column size. GridCell spans belong to the nearest Grid. Keep narrow DOM order meaningful. Horizontal Stack wraps by default; disable it only when overflow is intentionally handled. Tailwind is appropriate for min-w-0, positioning, overflow and drawing geometry.
213
+ | Responsibility | Exact family and owner | Contract to preserve |
214
+ | --- | --- | --- |
215
+ | Vertical siblings or an action row | `base/structure`: Stack | Vertical by default; `direction="horizontal"` creates a row and wraps by default. Default gap is `md` (8px). There is no separate Row export. |
216
+ | Known responsive tracks | `base/structure`: Grid | Scalar columns are literal; use `columns={{base:1,lg:3}}` for breakpoints. Omitted columns use one, then two from md. Default gap is `xl` (16px). |
217
+ | Track spans | `base/structure`: GridCell | Use `span={{base:1,lg:2}}` inside the nearest Grid; keep meaningful DOM order. |
218
+ | Equal tiles that fit their parent | `base/structure`: AdaptiveGrid | Select `minColumnWidth`; tracks follow available width. Use Grid for prescribed breakpoints or TwoColumnLayout for a supporting rail. |
219
+ | Centered measure and inline gutters | `layout/containers`: Container | Defaults to xl measure and md gutter. Owns no vertical inset, scrolling or surface chrome. |
220
+ | A semantic content section | `layout/containers`: Section | Owns sibling rhythm, default `xl`; it adds no Card frame or page gutter. |
221
+ | Main content with a supporting rail | `layout/containers`: TwoColumnLayout | Owns header/main/aside/footer order and `2xl` gaps (24px). Main/aside contents choose their own Stack gaps. Page rhythm (header to body, major Sections) uses `3xl` (32px). |
222
+ | A bounded page scroll region | `layout/containers`: PageViewport | Owns scrolling and query containment, with no padding. AppLayout already supplies one. |
223
+ | Route title, commands and page content | `layout/page`: Page | Owns measure, inline/block gutters and header/body rhythm. Use `narrow` for a focused resource. |
224
+ | Application header/sidebar chrome | `layout/app-shell`: AppLayout | Select the shell variant, compose slots and router callbacks, and let its viewport contain Page. |
225
+ | A framed subject | `base/cards`: Card | Owns surface padding, header/body/footer alignment and separators; layout blocks own the space between Cards. |
226
+
227
+ See the typed [layout-block composition](../examples/layout-blocks.tsx) when composing these owners.
228
+
229
+ Use these public structures for repeated passive composition rather than
230
+ rebuilding the same flex/grid spacing on divs. Tailwind remains appropriate for
231
+ positioning, overflow, chart/table geometry and custom intrinsic tracks. Structure
232
+ preserves child identity; it does not inspect, clone, reorder or frame children.
233
+
234
+ ### Main and aside Card gaps
235
+
236
+ Peer Cards in a Page/TwoColumnLayout workspace use `gap="2xl"` on both main and
237
+ aside Stacks to match its 24px grid gap. Give a peer Grid the same gap when it
238
+ belongs to that rhythm. A compact local card grid may deliberately keep Grid's
239
+ 16px default. Stack's 8px default is general sibling spacing, not an automatic
240
+ Card rhythm; choose the role explicitly. Values above use shipped roots and
241
+ scale through the existing space-scale contract.
242
+
243
+ The [region recipe](../examples/layout-blocks.tsx) keeps both inner Stacks on that same peer gap.
244
+
245
+ Use `textGap="normal"|"dense"` for title/description copy; keep action gaps,
246
+ form groups, peer regions and surface insets independent. Do not use small copy
247
+ gaps between independent Cards or shrink Card padding to match control density.
248
+ Framed Card rings extend outside layout rectangles: inspect visible clearance
249
+ in both axes as well as computed gaps.
250
+
251
+ ### Horizontal rows
252
+
253
+ See the typed [layout-block composition](../examples/layout-blocks.tsx): Page
254
+ supplies its boundary, TwoColumnLayout splits the regions, inner Stacks share
255
+ peer rhythm, and a horizontal Stack wraps footer actions. The app supplies the
256
+ subjects and commands. For viewport-responsive columns use Grid; for available
257
+ parent width use AdaptiveGrid or `TwoColumnLayout adaptTo="container"`.
258
+
259
+ MetadataList owns medium-weight labels and normal-weight routine values. Its
260
+ compact density tightens gaps/rows without shrinking primary values. Plain values
261
+ and typed descriptors retain the shared roles; React nodes, `display` and `render`
262
+ preserve supplied typography. Keep custom formatted values consistent with value
263
+ primitives rather than replacing labels and values with undifferentiated Text.
122
264
 
123
265
  ## Menus and controls
124
266
 
@@ -132,6 +274,13 @@ PopoverContent type="display" owns substantive-content padding; type="menu" comp
132
274
  | density="compact" / "default" / "comfortable" | Collection row block rhythm, independent from inline spacing |
133
275
  | size="sm" / "md" / "lg" | Supported control's scale; consult its declaration and provider precedence |
134
276
 
277
+ Input, Button, Select and filter-facet triggers share bounded inner corners
278
+ and corresponding heights; Card and popup shells use the global outer radius. Omitted sizes inherit the provider; explicit sizes win.
279
+ Keep action/control roots equal when those controls adjoin. Compact menu rows,
280
+ surface insets and control sizes remain independent; density can tighten the
281
+ inner-radius height bound without changing outer corners.
282
+ Inset segmented children use the supported compound owner's same-height frame.
283
+
135
284
  PopoverContent defaults to display/default; Command defaults to compact. An explicit PopoverContent type controls anatomy; explicit inset controls padding and takes precedence over the type's inferred inset. Without type, compact implies menu, other insets imply display. Put type="menu" inset="flush" on PopoverContent for a headed searchable picker. Popover is the interaction root and receives no surface props. PopoverMenu already assembles that picker anatomy; use its declared selection/search props. ComboboxPopup is flush because ComboboxList owns its inset. Do not add another wrapper inset around a normal collection list.
136
285
 
137
286
  At shipped roots, compact shell padding is 8px; row inline padding is 12px; default row block padding is 8px and minimum height 36px. Compact/comfortable rows use 6/10px block padding and 32/40px minimum heights. Content can grow when it wraps. These are token-derived measurements, not app constants. Flush compact header/footer shell padding matches the list (8px inline). Header text bodies without a leading control and footer captions add the row inset once, aligning text at 20px. Actions keep the 8px shell edge. Nested public slots do not repeat these insets.
@@ -150,8 +299,8 @@ Use exact themelia-react-ui paths. Presentation imports use blocks/<family>, rep
150
299
  ## Copy rhythm
151
300
 
152
301
  For title/supporting-copy rhythm use `textGap="normal" | "dense"` on Card,
153
- PageHeading and public surface headers; normal is 8px and dense is 4px before
154
- spacing scaling. Item/ItemContent and menu popover headers default to dense.
302
+ PageHeading and public surface headers. The installed token reference records
303
+ their unscaled defaults. Item/ItemContent and menu popover headers default to dense.
155
304
  Stack/Grid accept the same semantic gaps, including responsive objects and
156
305
  axis overrides. Keep surface insets and action-cluster gaps on their owners;
157
306
  do not add a second margin to descriptions.
@@ -257,6 +406,43 @@ parent width while preserving main-before-aside DOM/focus order.
257
406
 
258
407
  See the installed [workspace recipe](../examples/app-layout.tsx).
259
408
 
409
+ PageViewport owns scrolling and adds no padding. Page defaults to `gutter="lg"`
410
+ and `padding="lg"` (36px at shipped roots), so it owns inline/block space once.
411
+ `narrow` selects centered `md` width; explicit `maxWidth` wins. Header copy
412
+ defaults to dense; `textGap="normal"` is an explicit alternative. Do not assume
413
+ an app shell supplies gutters because it supplies a viewport. Set `gutter="none"`
414
+ only when an actual parent Container/surface supplies the inline inset, such as
415
+ StackedLayout's contained mode. Block padding remains independent.
416
+ That contained measure uses the same large gutter as Page; ordinary Container
417
+ defaults remain unchanged.
418
+
419
+ Select width from the task: a single focused resource/form can use `narrow`;
420
+ a record with a supporting aside can retain the default `lg` measure and use
421
+ TwoColumnLayout. A wide comparison/directory can deliberately use `maxWidth="full"`.
422
+ Setting full on every route defeats the resource measure. Do not remove Page's
423
+ gutters to make its title touch the sidebar; align the header and body through
424
+ the same Page. Density, container measure and page inset are separate choices.
425
+ The [detail recipe](../examples/detail.tsx) includes `AccountDetailPage`: a
426
+ centered resource measure, route-level commands, native Card icon/frame anatomy
427
+ and MetadataList facts, with no duplicated subject header or gutter.
428
+
429
+ Compose HeaderUserMenu in topbar `slots.headerEnd` or a local toolbar, and
430
+ SidebarNavigationUser in AppSidebar `slots.footer` when account access belongs
431
+ in navigation. Use SidebarWorkspaceDropdown for workspace links, or add a
432
+ custom control through `slots.headerEnd` alongside the logo. `headerStart` and
433
+ `headerEnd` stay inside the padded, fixed header; `slots.header` replaces it all.
434
+ `beforeNavigation` scrolls with the links. SidebarFooter owns its rule and inset.
435
+ LayoutSidebarProvider defaults to compact row gaps; explicit density still wins.
436
+ WorkspaceLayout owns its own bounded content inset; do not add a padded Page
437
+ inside it. WorkspaceRecordHeader and WorkspaceLocaleStrip align to the same
438
+ large inline surface role. Record copy supports textGap with a dense default.
439
+ Below 80rem of its own width, WorkspaceLayout scrolls header and body together;
440
+ above that boundary its main region scrolls beside the sidebar. Its rail appears
441
+ at 96rem. Supply header/drawer access to essential hidden regions on narrow
442
+ screens; this passive layout does not create a complete mobile workflow.
443
+ Do not infer workspace/user menus from a generic Avatar: choose their actual
444
+ published owners and supply permitted callbacks. The app owns user/workspace data.
445
+
260
446
  ## Task and usage summaries, editable fields
261
447
 
262
448
  | Intent | Public owner | Composition boundary |
@@ -57,15 +57,36 @@ an explicitly expandable card retains its collapse region.
57
57
  | `--space-scale` | Shared gaps, inline insets and surface padding | Row block/control-height density |
58
58
  | `--density-scale` | Action/control heights and row block padding | Inline room or primary text hierarchy |
59
59
 
60
- `--gap-normal` and `--gap-dense` default to 0.5rem and 0.25rem. Their utilities
60
+ `--gap-normal` and `--gap-dense` default to 0.25rem and 0.125rem. Their utilities
61
61
  multiply once by `--space-scale`. Descriptions have no extra margin. These are
62
62
  copy gaps; larger section and action-cluster gaps remain on their own owners.
63
63
  The [token reference](tokens.json) records the installed defaults and vocabulary.
64
64
 
65
- Use `rounded-radius` for ordinary controls and shells; `rounded-inner` is an
66
- intentional nested role. Density does not change radius. Circular indicators and
67
- avatars retain their shape. Elevation uses the existing shadow ladder, with
68
- family recipes selecting the tier; do not add a separate card/menu shadow root.
65
+ Outer Card, popup and Command shells use `rounded-radius`: the shadcn root,
66
+ 12px by default. Input, Button, Select/facet triggers, collection highlights,
67
+ navigation rows and intentional nested bodies use the shared `rounded-inner`
68
+ role, 9px by default. It derives at 0.75× and is bounded by one quarter of the
69
+ smaller action/control base height, scaled by density. A larger global root
70
+ therefore cannot turn short controls into capsules. See [the exact theme
71
+ recipe](theming.md). Density can tighten the inner bound; it does not change
72
+ outer corners. Spacing scale and padding do not select another radius tier.
73
+
74
+ Use the public component defaults instead of adding radius classes to callers.
75
+ Joined edges may reset their meeting corners. Circular indicators and avatars
76
+ retain their shape; Badge retains its root-based recipe. Elevation uses the
77
+ existing shadow ladder, with family recipes selecting the tier; neither a
78
+ card/menu radius root nor a separate shadow root is needed.
79
+
80
+ For appearance feedback, compare the actual open/focused state with the requested
81
+ theme value. Inspect CSS radius resolution, dimensions, clipping, borders and
82
+ rings as well as the computed root. Correct the visible problem at its owner;
83
+ matching radius values alone do not establish that the result looks right.
84
+
85
+ For adjoining fields and actions, keep `--height-action` and `--height-control`
86
+ equal and choose corresponding supported sizes. Omit `size` to inherit the
87
+ provider scale; an explicit prop intentionally takes precedence. Feature wrappers
88
+ should preserve that inheritance rather than force `md` on one facet while its
89
+ neighbor inherits `sm`. Deliberately different action/field roots remain supported.
69
90
 
70
91
  Structural dividers use one private recipe owner with explicit frame, anchored
71
92
  and modal roles. They share the semantic `border` root; their established strength
@@ -102,12 +123,17 @@ for logical geometry, keyboard navigation and anchored positioning; see
102
123
  3. Change an existing shared root at the intended [theme boundary](theming.md) when several related components should move together.
103
124
  4. If the public API cannot express a recurring composition, request an additive seam at that owner. Keep genuinely application-specific geometry namespaced in the application.
104
125
 
105
- Do not fix a shared mismatch with padding on Popover, Command, Select popup or
106
- Combobox anatomy, including `contentClassName`, inline styles, descendants and
126
+ Use Card's `padding` and slots, and Popover/Command/Select/Combobox's supported
127
+ inset and region props to correct shared padding. Preserve their internal recipe
128
+ instead of replacing it through `contentClassName`, inline styles, descendants and
107
129
  forwarding wrappers. Likewise, do not locally replace fixed control typography
108
130
  or make descriptions carry surrounding margins. The same restriction applies
109
131
  to token-backed overrides: a semantic utility can still be used on the wrong owner.
110
132
 
133
+ For custom copy, use `<Stack gap="dense">` around a title and description rather
134
+ than `className="mt-space-sm"` on the description's Text. Preserve Text/Heading's
135
+ size and semantic-element APIs; move surrounding margins to the structure owner.
136
+
111
137
  Theme inheritance belongs to CSS. Use ThemeScope for scoped portals; an explicit
112
138
  portal container must live in the intended boundary. Provider defaults and app
113
139
  callbacks do not form a parallel JavaScript styling system. Opening a popup is
@@ -14,11 +14,22 @@ node node_modules/themelia-react-ui/docs/consumer-skill/scripts/find-components.
14
14
 
15
15
  For a copied skill, replace the script path with that copy's `scripts/find-components.mjs`. Copy the complete skill folder: the script resolves its adjacent `references/public-api.json` relative to itself, regardless of the working directory. It needs Node compatible with the package's engine requirement, not an npm/global CLI or extra dependency.
16
16
 
17
- Queries accept multiple words, quoted or separate. Every term must match candidate metadata; an unknown term produces empty results. Exact imports and exported symbols rank first. `--layer` filters the technical package layer: `foundations`, `base`, `layout`, `blocks` or `features`. This is independent of responsibility-based browse sections: `themelia-react-ui/base/structure` browses Foundations but filters under `--layer base`; a theme-tweaker recipe browses Recipes but filters under `--layer features`. `--limit` is an integer from 1 to 100 and defaults to 5. Unknown flags, duplicate options, missing values and incompatible/malformed indexes exit nonzero with an error on stderr.
17
+ Queries accept multiple words, quoted or separate. Every term must match metadata
18
+ as a word; `stat` does not match `state` or `status`. An unknown term produces
19
+ empty results. Exact imports and case-exact exported names such as `Table` or
20
+ `Empty` select their precise contract. Ordinary task nouns `table` and `empty`
21
+ retain DataTable/DataView and EmptyState alongside the base anatomy. Exported
22
+ types and helper symbols remain available by their exact API name; documented
23
+ component symbols and curated aliases drive task recommendations.
24
+ `--layer` filters the technical package layer: `foundations`, `base`, `layout`,
25
+ `blocks` or `features`. This differs from browse sections: Structure browses
26
+ Foundations but filters under `--layer base`. `--limit` accepts 1–100 and defaults
27
+ to 5. Invalid flags/options or incompatible indexes exit nonzero on stderr.
18
28
 
19
29
  If a query returns no results, shorten it to the main responsibility or an exact
20
- symbol, then remove the layer filter. Read choose/avoid guidance and alternatives
21
- before selecting the owner. For routine compact searchable selection, search
30
+ symbol, then remove the layer filter. No result does not prove the package lacks
31
+ that responsibility. Read the selected result's choose/avoid guidance and
32
+ alternatives, then follow `nextReads`; do not load every reference. For routine compact searchable selection, search
22
33
  `PopoverMenu` or `compact searchable selection`; surface adjectives describe
23
34
  variants, not permission to rebuild the owner's padding.
24
35
 
@@ -35,13 +46,77 @@ or `theme boundary`. Read choose/avoid and app-owned responsibilities before
35
46
  deciding; a directory result does not require DataView when its workflow differs.
36
47
  Unknown terms still return no result; no fuzzy API or guessed prop is invented.
37
48
 
38
- Output is deterministic JSON: package/version, query/options, total matching families and a bounded `results` list. Each result includes exact `import`, packaged `declaration`, technical `layer`, responsibility, required `optionalPeers`, match kind, exact matched symbols and up to three relevant guidance entries. Family `sections` and guidance `section` reflect responsibility-based documentation placement. Guidance carries jobs, tags, aliases, selection/avoidance, application ownership, canonical browse group/domain plus catalogue category/collection, search-section labels/symbols and alternatives resolved to exact published imports. Read the [full index](public-api.json) for all symbols/guidance. A result suggests an owner; declarations establish its actual props and behavior.
49
+ Task language also includes `dashboard KPIs`, `dashboard metrics`, `revenue
50
+ overview`, `statistic cards`, `usage statistics` and `single resource page`.
51
+ `dark header` and `light header` select AppLayout shell composition.
52
+ KPI peers select MetricGrid/MetricBar guidance; one statistic card selects Metric;
53
+ usage quotas select the focused UsageCard leaf; a record route selects Page.
54
+ The [analytics reference](analytics.md) explains their boundary with simple
55
+ InlineStat facts, MetadataList and legitimate custom Card subjects.
56
+
57
+ `kpi`, `metric card`, `number card`, `statistics` and `stat` expose Metric.
58
+ `key value` and `details` retain MetadataList and InlineStat before helper rows.
59
+ `chat` includes Message/MessageBubble as well as AiChat: choose message presentation
60
+ or the complete prompt/conversation workflow according to the task. `markdown`
61
+ routes to RichText's sanitized `html` display contract; the application converts
62
+ Markdown to HTML. It does not introduce a Markdown parser or an invented renderer.
63
+
64
+ For `website landing page`, `public website` or `service overview`, discovery
65
+ selects Container/Section and the focused [website composition](composition.md#public-websites-and-service-overviews)
66
+ recipe. Choose Page instead when its route identity/command contract fits the
67
+ content; application chrome and analytics are separate responsibilities.
68
+
69
+ For geometry, `radius`, `border radius`, `control corners` and `control heights` select the existing UIProvider/theme
70
+ boundary guidance; `copy gaps` selects Structure. Their focused references explain
71
+ outer/inner corner roles, corresponding sizes, inherited defaults and normal/dense
72
+ copy rhythm even when no executable recipe matches the query. `page padding`
73
+ selects Page; `card padding` selects Card. Read those owners before adding local
74
+ gutters, reducing normal Card insets or rebuilding their headers/footers.
75
+
76
+ Output is deterministic JSON: package/version, query/options, total matching
77
+ families and bounded `results`. Each result includes exact `import`, packaged
78
+ `declaration`, technical `layer`, responsibility, required `optionalPeers`, match
79
+ kind, exact `matchedSymbols`, `relevantSymbols`, `nextReads` and up to three
80
+ relevant guidance entries. Exact symbol queries keep that symbol; intent queries
81
+ derive relevantSymbols from selected catalogue API sections and current public
82
+ exports. An exact family import retains the complete public symbol vocabulary.
83
+ Deprecated migration names such as `SmartCard` or `ContentBlockProps` never
84
+ appear in intent recommendations. When a result touches one, its `deprecated`
85
+ map names the replacement, for example `{ "SmartCard": "Use Card." }`; write
86
+ new code with the replacement. The public index carries the same map per family.
87
+ Exact guide aliases precede generic overlap, and unrelated family pages
88
+ do not fill the result merely to reach three entries.
89
+
90
+ `nextReads.declaration` is relative to the installed package root.
91
+ `nextReads.references` and `nextReads.examples[].file` are relative to this
92
+ skill folder, so they also work with a complete copied skill. Examples report
93
+ their actual exported recipe names and the selected public symbols they use.
94
+ Recipe selection requires symbol overlap, not just a common family import.
95
+ This prevents a PageHeader selection from inheriting Page-only recipes. A
96
+ recipe's `optionalPeers` comes from its manifest and can include other families'
97
+ requirements beyond the selected owner's peers. Inspect it before copying. A
98
+ selected family with no matching recipe reports empty references/examples;
99
+ use its declaration and the [full index](public-api.json), without guessing.
100
+
101
+ Family sections/guidance placement follows browse responsibility. Guidance
102
+ carries jobs, tags, aliases, choose/avoid, app ownership, browse context, API
103
+ sections/symbols and alternatives resolved to exact imports. Results suggest
104
+ owners and focused reads; declarations establish actual props and behavior.
39
105
 
40
106
  Read each declaration relative to the installed package root, for example `node_modules/themelia-react-ui/dist/components/base/cards/index.d.ts`, following its relative exports as needed. Copying this skill copies metadata, not the declaration tree: use declarations from the same installed package version. Never combine metadata from one version with another version's declarations.
41
107
 
42
108
  `ThemeScope` has distinct contracts. Root and `themelia-react-ui/ui-provider` export the basic CSS-inheritance boundary with native div/style props and portal hosting. `themelia-react-ui/features/theme-tweaker` exports the advanced theme-definition scope. Inspect the result's responsibility and that exact family's declaration before selecting props.
43
109
 
44
- The index retains `schemaVersion: 1` and adds `discoveryVersion: 1`. Package name/version and peer ranges come from the published manifest; symbols and declaration paths come from live public exports; jobs and guidance come from the live consumer catalogue. Utility/root responsibilities have explicit owners when no catalogue family represents them. Optional peer requirements follow transitive local source imports, including type-only and resolved `@types` peers; the manifest supplies their compatible ranges. This describes whole-family declaration/runtime requirements, not the smaller graph a bundler may obtain after tree shaking.
110
+ The index retains schemaVersion/discoveryVersion 1; optional family `recipes` and `references`
111
+ are compatible additions. Package identity/peers derive from the published
112
+ manifest, symbols/declarations from live exports, and jobs/guidance from the
113
+ consumer catalogue. Recipe metadata derives from the existing example manifest,
114
+ each export's actual use of exact public imports and reference-to-recipe section links; it adds no
115
+ independent task taxonomy. Older matching indexes without recipes still work
116
+ and return empty recipe reads. Utility/root responsibilities have explicit
117
+ owners when no catalogue family represents them. Optional peer requirements
118
+ follow transitive local imports, including type-only and resolved `@types` peers.
119
+ These describe whole-family requirements; tree shaking may produce a smaller graph.
45
120
 
46
121
  Routing, records, translation, permissions and backend effects stay in the application. Discovery grants no publication or global installation authority.
47
122
 
@@ -64,6 +64,28 @@ files or publisher markers in the copy are not checked. Keep local product polic
64
64
  outside the package guidance. Recopy the complete folder after upgrades, and
65
65
  read declarations from the installed package.
66
66
 
67
+ ## Upgrading to the neutral button default
68
+
69
+ An untoned `Button` is now the neutral outline (`tone="secondary"`,
70
+ `buttonStyle="outline"`); a Button with a `tone` and no `buttonStyle` stays
71
+ solid. Screens that relied on untoned Buttons being the solid primary can keep
72
+ their look with the bundled codemod. It reports by default and edits only with
73
+ `--write`; review the diff before committing:
74
+
75
+ ```sh
76
+ node node_modules/themelia-react-ui/docs/consumer-skill/scripts/pin-button-defaults.mjs src
77
+ node node_modules/themelia-react-ui/docs/consumer-skill/scripts/pin-button-defaults.mjs --write src
78
+ ```
79
+
80
+ It adds `tone="primary"` to every Button, BaseButton or BaseButtonLink imported
81
+ from the package without a `tone`. Add `--solid-only` to skip untoned outline
82
+ and ghost Buttons so they turn neutral instead of keeping the brand color.
83
+ Buttons whose props come from a spread are listed as `unresolved` for review.
84
+ Apps that already set `UIProvider` `button.defaultTone` keep that tone and do not
85
+ need the codemod; `button: { defaultTone: 'primary', defaultButtonStyle: 'solid' }`
86
+ restores the previous default app-wide. Afterwards, demote extra primaries so
87
+ each page or surface keeps one.
88
+
67
89
  ## Manual skill copying
68
90
 
69
91
  1. Choose an agent skill destination in the user's configured skills directory,
@@ -18,6 +18,20 @@ Load intentional, scoped app overrides after the package stylesheet. Keep broad
18
18
 
19
19
  UIProvider supplies stable mount-time defaults: explicit prop, provider default, fallback. Per-mount requests/data/callbacks stay on components. ThemeScope from themelia-react-ui/ui-provider places descendant portals inside its CSS boundary. A styled div does not relocate body portals; explicit Base UI portal containers take precedence.
20
20
 
21
+ For separated card regions, configure the single application provider with
22
+ `card: { defaultSurface: 'card', defaultHeaderDivider: true, defaultFooterDivider: true }`.
23
+ Explicit Card booleans, including false, override these defaults. Ordinary card
24
+ padding remains md, independent of density. The typed [workspace recipe](../examples/app-layout.tsx)
25
+ exports `workspaceUIDefaults` for that root configuration and composes the public
26
+ workspace/user controls. It does not mount another UIProvider inside the app.
27
+
28
+ Page owns inline/block insets and offers `narrow` for a centered resource page.
29
+ PageViewport owns scroll containment only. Check actual padding before passing
30
+ `gutter="none"`; a local guide claiming all shell viewports are padded contradicts
31
+ the installed contract. Fix that app policy through its own review rather than
32
+ compensating with card or field padding. Bounded AppSidebar instances use h-full
33
+ inside the shell's constrained column; standalone sidebars may use viewport height.
34
+
21
35
  For RTL, pair the native DOM direction with `DirectionProvider` from the same
22
36
  entrypoint. Native `dir` owns text flow and logical CSS geometry; the provider
23
37
  owns Base UI keyboard navigation and popup positioning. It does not set `dir`.
@@ -36,7 +50,38 @@ does not replace the single mount-time UIProvider configuration boundary.
36
50
 
37
51
  Routing comes through href, callbacks or Base UI render composition. React Router is not required. Component chunks preserve client boundaries; pure utilities remain separate.
38
52
 
39
- Use ActionDialog, ActionDrawer, ConfirmDialog and useOverlayVisibility from features/overlays. Pass overlayProps for visibility. onAsyncConfirm awaits the operation; onError reports failure. Do not also pass onConfirm, which takes precedence. Sheet is structural infrastructure, not another workflow API.
53
+ ## Dialogs, confirmations and drawers
54
+
55
+ Every dialog-like surface comes from `themelia-react-ui/features/overlays`; it is
56
+ the only modal system. The overlay owners hold focus entry and trapping, Escape
57
+ and outside-click dismissal, focus return to the trigger, pending and error
58
+ states, portal theming and the shared scrim (a plain tint, never a blur).
59
+
60
+ | Need | Owner |
61
+ | --- | --- |
62
+ | A focused edit or form with confirm/cancel | `ActionDialog` |
63
+ | A yes/no question, or a destructive confirmation | `ConfirmDialog` (destructive tone for irreversible actions) |
64
+ | A longer form, filters or record details beside the page | `ActionDrawer` |
65
+ | Open state, triggers and several overlays on one screen | `useOverlayVisibility` (`overlayProps`, `show`, `hide`) |
66
+
67
+ Pass `overlayProps` for visibility. `onAsyncConfirm` awaits the operation and
68
+ keeps the overlay open on failure; `onError` reports it. Do not also pass
69
+ `onConfirm`, which takes precedence. Each overlay owns one primary command, its
70
+ confirm button; compose the body with the ordinary Stack, FormField and Card
71
+ anatomy and leave its insets to the overlay.
72
+
73
+ Do not hand-roll a modal (a `fixed inset-0` scrim, `role="dialog"`,
74
+ `aria-modal`), do not import the lower-level `Dialog`, `AlertDialog` or `Sheet`
75
+ building blocks, and do not add another modal library (Radix Dialog,
76
+ react-modal, vaul, Headless UI or React Aria dialogs). The optional checker
77
+ warns on each of these. Popovers, menus, selects and tooltips are anchored
78
+ surfaces, not dialogs: use their own owners.
79
+
80
+ To show a table full screen, use `DataTable`'s own mode (`fullscreen` or
81
+ `defaultFullscreen`, `onFullscreenChange`, `showFullscreenToggle`) instead of
82
+ moving the table into a dialog. It maximises the table in place, so scroll
83
+ position, focus and column state survive; Escape leaves, Tab stays inside and
84
+ focus returns to the toggle.
40
85
 
41
86
  PlaceAutocomplete from themelia-react-ui/features/map uses Photon by default. Supply a stable or useCallback-memoized searchPlaces: PlaceSearchCallback to use your geocoder; it receives PlaceSearchOptions and an AbortSignal and returns Promise<PlaceFeature[]>. Adapt provider results to the existing place shape and OSM identifiers (duplicates are removed by osm_id). Changing provider identity or search options cancels the old lookup and searches the current query. Respect the signal; superseded responses are ignored even if a provider cannot cancel. Keep provider identity stable during ordinary renders. Notification callbacks may be inline. onSearchError reports current failures; the built-in Retry action repeats the lookup and strings.retry localizes its label.
42
87