themelia-react-ui 2.0.0 → 2.0.1
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.
- package/CHANGELOG.md +351 -0
- package/README.md +26 -13
- package/dist/{accordion-CQXVcd7Q.js → accordion-B6a3vVgA.js} +84 -82
- package/dist/accordion-B6a3vVgA.js.map +1 -0
- package/dist/action-menu-TzCoSlwL.js +280 -0
- package/dist/action-menu-TzCoSlwL.js.map +1 -0
- package/dist/{affordance-geometry.generated-CCIXb2A1.js → affordance-geometry.generated-B5iu-Mkr.js} +3 -2
- package/dist/affordance-geometry.generated-B5iu-Mkr.js.map +1 -0
- package/dist/{ai-artifact-2PQ2fItc.js → ai-artifact-BMJdv-6q.js} +379 -376
- package/dist/ai-artifact-BMJdv-6q.js.map +1 -0
- package/dist/{app-shell-BE_j8-AT.js → app-shell-ZK5RWdo6.js} +4 -4
- package/dist/{app-shell-BE_j8-AT.js.map → app-shell-ZK5RWdo6.js.map} +1 -1
- package/dist/attachment-BtfhGm8i.js +245 -0
- package/dist/attachment-BtfhGm8i.js.map +1 -0
- package/dist/{auth-M3vGMgDR.js → auth-CYxKfo69.js} +237 -235
- package/dist/auth-CYxKfo69.js.map +1 -0
- package/dist/{avatar-djdaaQ_s.js → avatar-BBnEJIx8.js} +66 -65
- package/dist/avatar-BBnEJIx8.js.map +1 -0
- package/dist/badge-MrKVNzW9.js +93 -0
- package/dist/badge-MrKVNzW9.js.map +1 -0
- package/dist/base/accordion.js +1 -1
- package/dist/base/action-menu.js +1 -1
- package/dist/base/attachment.js +1 -1
- package/dist/base/avatar.js +1 -1
- package/dist/base/badge.js +1 -1
- package/dist/base/batch-action-bar.js +3 -0
- package/dist/base/buttons.js +2 -3
- package/dist/base/cards.js +2 -2
- package/dist/base/carousel.js +13 -13
- package/dist/base/carousel.js.map +1 -1
- package/dist/base/cascader.js +103 -115
- package/dist/base/cascader.js.map +1 -1
- package/dist/base/chart.js +1 -1
- package/dist/base/choice-inputs.js +3 -3
- package/dist/base/code-block.js +1 -1
- package/dist/base/combobox.js +1 -1
- package/dist/base/command.js +1 -1
- package/dist/base/copyable.js +1 -1
- package/dist/base/date-pickers.js +2 -2
- package/dist/base/display.js +7 -7
- package/dist/base/feedback.js +3 -3
- package/dist/base/forms-numeric.js +1 -1
- package/dist/base/forms.js +2 -2
- package/dist/base/inline-edit.js +17 -17
- package/dist/base/inline-edit.js.map +1 -1
- package/dist/base/item.js +1 -1
- package/dist/base/media-gallery.js +1 -1
- package/dist/base/metadata-list.js +3 -0
- package/dist/base/navigation.js +7 -7
- package/dist/base/popover-menu.js +1 -1
- package/dist/base/popover.js +1 -1
- package/dist/base/qr-code.js +1 -1
- package/dist/base/repeaters.js +171 -170
- package/dist/base/repeaters.js.map +1 -1
- package/dist/base/sheet.js +1 -1
- package/dist/base/sidebar.js +1 -1
- package/dist/base/signature-pad.js +147 -137
- package/dist/base/signature-pad.js.map +1 -1
- package/dist/base/skeleton.js +1 -1
- package/dist/base/spinner.js +1 -1
- package/dist/base/structure.js +1 -1
- package/dist/base/table.js +1 -1
- package/dist/base/text-inputs.js +2 -2
- package/dist/base/toaster.js +2 -2
- package/dist/base/tree.js +1 -1
- package/dist/base/upload-queue.js +1 -1
- package/dist/base/upload.js +3 -3
- package/dist/base/value-inputs.js +2 -2
- package/dist/batch-action-bar-BZGDG-Si.js +104 -0
- package/dist/batch-action-bar-BZGDG-Si.js.map +1 -0
- package/dist/blocks/admin.js +173 -171
- package/dist/blocks/admin.js.map +1 -1
- package/dist/blocks/ai.js +266 -263
- package/dist/blocks/ai.js.map +1 -1
- package/dist/blocks/analytics/usage-card.js +1 -1
- package/dist/blocks/analytics.js +440 -438
- package/dist/blocks/analytics.js.map +1 -1
- package/dist/blocks/collaboration.js +1 -1
- package/dist/blocks/commerce/receipt.js +1 -1
- package/dist/blocks/commerce.js +1945 -1266
- package/dist/blocks/commerce.js.map +1 -1
- package/dist/blocks/data-display.js +3 -2
- package/dist/blocks/onboarding.js +50 -49
- package/dist/blocks/onboarding.js.map +1 -1
- package/dist/blocks/planning.js +25 -25
- package/dist/blocks/planning.js.map +1 -1
- package/dist/blocks/timelines.js +1 -1
- package/dist/breadcrumbs-D5t7I023.js +129 -0
- package/dist/breadcrumbs-D5t7I023.js.map +1 -0
- package/dist/{button-R9CCoH7A.js → button-QYwiyhD2.js} +15 -14
- package/dist/button-QYwiyhD2.js.map +1 -0
- package/dist/{button-BS3KDg00.js → buttons-SbIcm1HJ.js} +200 -213
- package/dist/buttons-SbIcm1HJ.js.map +1 -0
- package/dist/{cards-QoJ4syG9.js → cards-CiiHpKYd.js} +8 -8
- package/dist/cards-CiiHpKYd.js.map +1 -0
- package/dist/{chart-DwYRKKc-.js → chart-QfrARkXl.js} +5 -5
- package/dist/{chart-DwYRKKc-.js.map → chart-QfrARkXl.js.map} +1 -1
- package/dist/checkbox-DhB6K0bK.js +36 -0
- package/dist/checkbox-DhB6K0bK.js.map +1 -0
- package/dist/choice-inputs-t6w3ATNz.js +766 -0
- package/dist/choice-inputs-t6w3ATNz.js.map +1 -0
- package/dist/code-block-Dgbu-CU3.js +185 -0
- package/dist/code-block-Dgbu-CU3.js.map +1 -0
- package/dist/{collapsible-oMUGM4tr.js → collapsible-D8AEGU1-.js} +4 -4
- package/dist/{collapsible-oMUGM4tr.js.map → collapsible-D8AEGU1-.js.map} +1 -1
- package/dist/{collection-content-Ys-OZOkY.js → collection-content-uK16Grv0.js} +3 -3
- package/dist/{collection-content-Ys-OZOkY.js.map → collection-content-uK16Grv0.js.map} +1 -1
- package/dist/{combobox-6dvVny2q.js → combobox-2Ic8N9bL.js} +74 -68
- package/dist/combobox-2Ic8N9bL.js.map +1 -0
- package/dist/{combobox-CB7039j7.js → combobox-DLl0bfiq.js} +307 -305
- package/dist/combobox-DLl0bfiq.js.map +1 -0
- package/dist/{command-kPMPjIxJ.js → command-kNR20o7x.js} +7 -7
- package/dist/{command-kPMPjIxJ.js.map → command-kNR20o7x.js.map} +1 -1
- package/dist/{comments-You0Bzbr.js → comments-BpDuCUUu.js} +341 -339
- package/dist/comments-BpDuCUUu.js.map +1 -0
- package/dist/components/base/action-menu/action-menu.d.ts +21 -4
- package/dist/components/base/action-menu/action-menu.recipes.d.ts +21 -0
- package/dist/components/base/action-menu/index.d.ts +1 -0
- package/dist/components/base/badge/badge.recipes.d.ts +4 -4
- package/dist/components/base/batch-action-bar/batch-action-bar.d.ts +50 -0
- package/dist/components/base/batch-action-bar/batch-action-bar.strings.d.ts +20 -0
- package/dist/components/base/batch-action-bar/index.d.ts +8 -0
- package/dist/components/base/buttons/button-group.recipes.d.ts +1 -1
- package/dist/components/base/buttons/button.recipes.d.ts +2 -2
- package/dist/components/base/choice-inputs/checkbox.d.ts +2 -2
- package/dist/components/base/choice-inputs/choice-types.d.ts +18 -6
- package/dist/components/base/display/alert-dialog.d.ts +6 -5
- package/dist/components/base/display/dialog.d.ts +4 -8
- package/dist/components/base/display/icon-badge/icon-badge.d.ts +1 -1
- package/dist/components/base/forms/form-sizing.d.ts +15 -12
- package/dist/components/base/metadata-list/index.d.ts +12 -0
- package/dist/components/{blocks/data-display/metadata → base/metadata-list}/metadata-list.d.ts +28 -25
- package/dist/components/{blocks/data-display/metadata → base/metadata-list}/metadata-value.d.ts +2 -2
- package/dist/components/base/navigation/index.d.ts +1 -1
- package/dist/components/base/navigation/page-header/index.d.ts +1 -0
- package/dist/components/base/navigation/page-header/page-header-commands.d.ts +73 -0
- package/dist/components/base/navigation/page-header/page-header.d.ts +26 -3
- package/dist/components/base/sheet/sheet.d.ts +4 -8
- package/dist/components/base/signature-pad/signature-pad.types.d.ts +5 -1
- package/dist/components/base/signature-pad/signature-pad.utils.d.ts +11 -3
- package/dist/components/base/text-inputs/field-clear-button.d.ts +6 -0
- package/dist/components/base/upload/upload.recipes.d.ts +25 -3
- package/dist/components/base/value-inputs/index.d.ts +5 -5
- package/dist/components/base/value-inputs/tags-input.d.ts +36 -12
- package/dist/components/blocks/commerce/address-card/address-card.d.ts +1 -1
- package/dist/components/blocks/commerce/address-card/types.d.ts +2 -1
- package/dist/components/blocks/commerce/cart-summary/cart-summary.d.ts +3 -1
- package/dist/components/blocks/commerce/cart-summary/index.d.ts +2 -2
- package/dist/components/blocks/commerce/cart-summary/types.d.ts +6 -1
- package/dist/components/blocks/commerce/discount-stack/discount-stack.d.ts +3 -1
- package/dist/components/blocks/commerce/discount-stack/index.d.ts +2 -2
- package/dist/components/blocks/commerce/discount-stack/types.d.ts +16 -4
- package/dist/components/blocks/commerce/fulfillment-group/fulfillment-group.d.ts +5 -0
- package/dist/components/blocks/commerce/fulfillment-group/index.d.ts +2 -0
- package/dist/components/blocks/commerce/fulfillment-group/types.d.ts +43 -0
- package/dist/components/blocks/commerce/index.d.ts +13 -5
- package/dist/components/blocks/commerce/invoice-header/invoice-header.d.ts +1 -1
- package/dist/components/blocks/commerce/invoice-header/types.d.ts +4 -2
- package/dist/components/blocks/commerce/invoice-mini/invoice-mini.d.ts +1 -1
- package/dist/components/blocks/commerce/invoice-mini/types.d.ts +2 -1
- package/dist/components/blocks/commerce/order-customer/index.d.ts +2 -0
- package/dist/components/blocks/commerce/order-customer/order-customer.d.ts +5 -0
- package/dist/components/blocks/commerce/order-customer/types.d.ts +48 -0
- package/dist/components/blocks/commerce/order-header/index.d.ts +2 -0
- package/dist/components/blocks/commerce/order-header/order-header.d.ts +5 -0
- package/dist/components/blocks/commerce/order-header/types.d.ts +37 -0
- package/dist/components/blocks/commerce/order-line-item/index.d.ts +2 -0
- package/dist/components/blocks/commerce/order-line-item/order-line-item.d.ts +5 -0
- package/dist/components/blocks/commerce/order-line-item/types.d.ts +46 -0
- package/dist/components/blocks/commerce/order-summary/index.d.ts +2 -0
- package/dist/components/blocks/commerce/order-summary/order-summary.d.ts +5 -0
- package/dist/components/blocks/commerce/order-summary/types.d.ts +42 -0
- package/dist/components/blocks/commerce/order-transactions/index.d.ts +2 -0
- package/dist/components/blocks/commerce/order-transactions/order-transactions.d.ts +5 -0
- package/dist/components/blocks/commerce/order-transactions/types.d.ts +46 -0
- package/dist/components/blocks/commerce/payment-method/index.d.ts +2 -2
- package/dist/components/blocks/commerce/payment-method/payment-method.d.ts +9 -1
- package/dist/components/blocks/commerce/payment-method/types.d.ts +12 -1
- package/dist/components/blocks/commerce/refund-status/index.d.ts +2 -2
- package/dist/components/blocks/commerce/refund-status/refund-status.d.ts +3 -1
- package/dist/components/blocks/commerce/refund-status/types.d.ts +6 -3
- package/dist/components/blocks/commerce/shared/address-lines.d.ts +21 -0
- package/dist/components/blocks/commerce/shared/line-thumbnail.d.ts +9 -0
- package/dist/components/blocks/commerce/shared/order-status.d.ts +51 -0
- package/dist/components/blocks/commerce/shipment-tracking/shipment-tracking.d.ts +1 -1
- package/dist/components/blocks/commerce/shipment-tracking/types.d.ts +27 -6
- package/dist/components/blocks/commerce/summary-panel/amount-row.d.ts +2 -0
- package/dist/components/blocks/commerce/summary-panel/index.d.ts +3 -0
- package/dist/components/blocks/commerce/summary-panel/summary-panel.d.ts +2 -0
- package/dist/components/blocks/commerce/summary-panel/types.d.ts +26 -0
- package/dist/components/blocks/commerce/tax-breakdown/tax-breakdown.d.ts +1 -1
- package/dist/components/blocks/commerce/tax-breakdown/types.d.ts +2 -1
- package/dist/components/blocks/data-display/metadata/index.d.ts +30 -4
- package/dist/components/features/activities/partials/activity-row.d.ts +6 -2
- package/dist/components/features/activities/partials/tone-tokens.d.ts +0 -6
- package/dist/components/features/global-search/partials/global-search-group-heading.d.ts +15 -0
- package/dist/components/features/global-search/partials/tone-palettes.d.ts +0 -5
- package/dist/components/features/kanban/kanban.d.ts +1 -1
- package/dist/components/features/kanban/kanban.strings.d.ts +1 -1
- package/dist/components/features/kanban/kanban.types.d.ts +2 -2
- package/dist/components/features/media-library/hooks/use-media-library.d.ts +1 -1
- package/dist/components/features/media-library/index.d.ts +1 -1
- package/dist/components/features/media-library/media-library.d.ts +1 -1
- package/dist/components/features/media-library/media-library.strings.d.ts +4 -0
- package/dist/components/features/media-library/media-library.types.d.ts +74 -1
- package/dist/components/features/media-library/partials/media-library-partials.d.ts +3 -3
- package/dist/components/features/mentions/partials/mention-kind-toggles.d.ts +16 -0
- package/dist/components/features/overlays/alert-dialog.d.ts +1 -1
- package/dist/components/features/overlays/dialog.d.ts +1 -1
- package/dist/components/features/overlays/index.d.ts +1 -1
- package/dist/components/features/overlays/overlay-tone-icon.d.ts +3 -3
- package/dist/components/features/overlays/overlays.types.d.ts +20 -0
- package/dist/components/features/products/components/product-contract-overview.d.ts +5 -0
- package/dist/components/features/products/components/product-details-card.d.ts +5 -0
- package/dist/components/features/products/components/product-operations-card.d.ts +5 -0
- package/dist/components/features/products/components/product-option-action-menu.d.ts +5 -0
- package/dist/components/features/products/components/product-options-summary.d.ts +5 -0
- package/dist/components/features/products/components/product-policies-card.d.ts +5 -0
- package/dist/components/features/products/components/product-quote-preview-card.d.ts +5 -0
- package/dist/components/features/products/components/product-readiness-card.d.ts +5 -0
- package/dist/components/features/products/components/product-structure-card.d.ts +5 -0
- package/dist/components/features/products/components/product-variant-action-menu.d.ts +23 -1
- package/dist/components/features/products/products.types.d.ts +9 -2
- package/dist/components/features/resource/index.d.ts +1 -1
- package/dist/components/features/resource/resource.d.ts +1 -1
- package/dist/components/features/resource/resource.types.d.ts +34 -6
- package/dist/components/features/rich-text-editor/index.d.ts +2 -1
- package/dist/components/features/rich-text-editor/partials/image-nodes.d.ts +13 -0
- package/dist/components/features/rich-text-editor/partials/image-uploads.d.ts +66 -0
- package/dist/components/features/rich-text-editor/partials/inline-reference-node.d.ts +19 -0
- package/dist/components/features/rich-text-editor/rich-text-editor.recipes.d.ts +1 -1
- package/dist/components/features/rich-text-editor/rich-text-editor.strings.d.ts +14 -0
- package/dist/components/features/rich-text-editor/rich-text-editor.types.d.ts +45 -0
- package/dist/components/features/rich-text-editor/use-rich-text-images.d.ts +18 -0
- package/dist/components/features/sync/index.d.ts +26 -3
- package/dist/components/features/table/data-table.d.ts +1 -1
- package/dist/components/features/table/table.types.d.ts +32 -7
- package/dist/components/layout/page/index.d.ts +1 -1
- package/dist/components/layout/page/page.types.d.ts +33 -36
- package/dist/components/layout/page/partials/page-actions.d.ts +1 -0
- package/dist/components/layout/page/partials/page-header.d.ts +1 -1
- package/dist/components/layout/settings/settings.d.ts +16 -2
- package/dist/components/layout/workspace/workspace.types.d.ts +21 -4
- package/dist/components/typography/rich-text/index.d.ts +1 -1
- package/dist/components/typography/rich-text/rich-text-tree.d.ts +19 -0
- package/dist/components/typography/rich-text/rich-text.d.ts +16 -0
- package/dist/components/typography/text-link.d.ts +4 -3
- package/dist/components/ui/checkbox.d.ts +4 -3
- package/dist/components/ui/overlay.recipes.d.ts +0 -9
- package/dist/components/ui/switch.d.ts +2 -2
- package/dist/{containers-D_L4mTVb.js → containers-DmWiJa2I.js} +36 -35
- package/dist/containers-DmWiJa2I.js.map +1 -0
- package/dist/{copyable-DDjTeW_j.js → copyable-B3Gwgdqc.js} +6 -6
- package/dist/{copyable-DDjTeW_j.js.map → copyable-B3Gwgdqc.js.map} +1 -1
- package/dist/data-display-DafIvCl5.js +960 -0
- package/dist/data-display-DafIvCl5.js.map +1 -0
- package/dist/{date-uf3z37Nm.js → date-BgK3bTdo.js} +5 -5
- package/dist/{date-uf3z37Nm.js.map → date-BgK3bTdo.js.map} +1 -1
- package/dist/date-picker-CF-DtUpF.js +1529 -0
- package/dist/date-picker-CF-DtUpF.js.map +1 -0
- package/dist/{date-pickers-CnFCb0n2.js → date-pickers-BmzxJl5l.js} +19 -19
- package/dist/{date-pickers-CnFCb0n2.js.map → date-pickers-BmzxJl5l.js.map} +1 -1
- package/dist/{display-DrdvPwF0.js → display-DsQTVzMz.js} +88 -87
- package/dist/display-DsQTVzMz.js.map +1 -0
- package/dist/{dropdown-menu-CURh59jb.js → dropdown-menu-E2qmdC7o.js} +7 -7
- package/dist/{dropdown-menu-CURh59jb.js.map → dropdown-menu-E2qmdC7o.js.map} +1 -1
- package/dist/features/activities.js +414 -501
- package/dist/features/activities.js.map +1 -1
- package/dist/features/ai-chat.js +170 -169
- package/dist/features/ai-chat.js.map +1 -1
- package/dist/features/async-preview.js +8 -8
- package/dist/features/async-preview.js.map +1 -1
- package/dist/features/combobox.js +1 -1
- package/dist/features/comments.js +1 -1
- package/dist/features/data-view.js +139 -138
- package/dist/features/data-view.js.map +1 -1
- package/dist/features/email-composer/engine.js +1 -1
- package/dist/features/email-composer.js +73 -71
- package/dist/features/email-composer.js.map +1 -1
- package/dist/features/event-calendar.js +278 -275
- package/dist/features/event-calendar.js.map +1 -1
- package/dist/features/filters.js +1 -1
- package/dist/features/global-search.js +307 -310
- package/dist/features/global-search.js.map +1 -1
- package/dist/features/kanban.js +95 -97
- package/dist/features/kanban.js.map +1 -1
- package/dist/features/map.js +56 -57
- package/dist/features/map.js.map +1 -1
- package/dist/features/media-library.js +918 -825
- package/dist/features/media-library.js.map +1 -1
- package/dist/features/mentions.js +1 -1
- package/dist/features/overlays.js +1 -1
- package/dist/features/products.js +1115 -1122
- package/dist/features/products.js.map +1 -1
- package/dist/features/questionnaire.js +202 -194
- package/dist/features/questionnaire.js.map +1 -1
- package/dist/features/resource-assignment.js +25 -25
- package/dist/features/resource-assignment.js.map +1 -1
- package/dist/features/resource.js +77 -69
- package/dist/features/resource.js.map +1 -1
- package/dist/features/rich-text-editor.js +30 -11
- package/dist/features/rich-text-editor.js.map +1 -1
- package/dist/features/schema-form.js +33 -33
- package/dist/features/schema-form.js.map +1 -1
- package/dist/features/suggestions.js +3 -3
- package/dist/features/sync.js +3 -3
- package/dist/features/table.js +1 -1
- package/dist/features/theme-tweaker.js +397 -396
- package/dist/features/theme-tweaker.js.map +1 -1
- package/dist/{feedback-C7nR0UtT.js → feedback-qNuMBtRH.js} +84 -83
- package/dist/feedback-qNuMBtRH.js.map +1 -0
- package/dist/{field-affordance-recipes-CkOCdE2y.js → field-affordance-recipes-qQeIf4lG.js} +8 -6
- package/dist/field-affordance-recipes-qQeIf4lG.js.map +1 -0
- package/dist/field-state-recipes-BVA2CWHo.js +12 -0
- package/dist/field-state-recipes-BVA2CWHo.js.map +1 -0
- package/dist/{filters-Da-gNPsE.js → filters-BkHH53uv.js} +565 -563
- package/dist/filters-BkHH53uv.js.map +1 -0
- package/dist/focus-recipes-B653VaLq.js +12 -0
- package/dist/focus-recipes-B653VaLq.js.map +1 -0
- package/dist/{form-field-VZRULhUK.js → form-field-DUt4UxSV.js} +4 -4
- package/dist/{form-field-VZRULhUK.js.map → form-field-DUt4UxSV.js.map} +1 -1
- package/dist/{form-sizing-uWP4lzVh.js → form-sizing-By94KzXE.js} +19 -15
- package/dist/form-sizing-By94KzXE.js.map +1 -0
- package/dist/{forms-DDeEnXSY.js → forms-Bzha-Y3B.js} +22 -22
- package/dist/{forms-DDeEnXSY.js.map → forms-Bzha-Y3B.js.map} +1 -1
- package/dist/{forms-numeric-D3CO60IF.js → forms-numeric-C0bvjRPZ.js} +265 -264
- package/dist/forms-numeric-C0bvjRPZ.js.map +1 -0
- package/dist/{header-2ycNqGOR.js → header-BOefOKd1.js} +47 -51
- package/dist/header-BOefOKd1.js.map +1 -0
- package/dist/{hooks-DQ5SPwZw.js → hooks-9k_TtmKh.js} +2 -2
- package/dist/{hooks-DQ5SPwZw.js.map → hooks-9k_TtmKh.js.map} +1 -1
- package/dist/{http-CdEIHyQf.js → http-D_6rOnzU.js} +2 -2
- package/dist/{http-CdEIHyQf.js.map → http-D_6rOnzU.js.map} +1 -1
- package/dist/icon-badge-CAuKupo9.js +55 -0
- package/dist/icon-badge-CAuKupo9.js.map +1 -0
- package/dist/index.js +7 -7
- package/dist/input-DWhBBBww.js +262 -0
- package/dist/input-DWhBBBww.js.map +1 -0
- package/dist/{input-BoLm9Hks.js → input-Ddi_LSYv.js} +3 -3
- package/dist/{input-BoLm9Hks.js.map → input-Ddi_LSYv.js.map} +1 -1
- package/dist/interaction-recipes-CHr0dJUs.js +24 -0
- package/dist/interaction-recipes-CHr0dJUs.js.map +1 -0
- package/dist/{item-xzh8Df65.js → item-DEmDiTlD.js} +98 -97
- package/dist/item-DEmDiTlD.js.map +1 -0
- package/dist/layer-recipes-CCpklYME.js +13 -0
- package/dist/layer-recipes-CCpklYME.js.map +1 -0
- package/dist/layout/app-shell.js +1 -1
- package/dist/layout/auth.js +1 -1
- package/dist/layout/containers.js +1 -1
- package/dist/layout/header.js +1 -1
- package/dist/layout/hooks.js +1 -1
- package/dist/layout/navigation.js +1 -1
- package/dist/layout/page.js +1 -1
- package/dist/layout/settings.js +1 -1
- package/dist/layout/sidebar.js +2 -2
- package/dist/layout/workspace.js +1 -1
- package/dist/layout.js +10 -10
- package/dist/lib/affordance-geometry.generated.d.ts +1 -0
- package/dist/lib/field-affordance-recipes.d.ts +6 -1
- package/dist/lib/field-state-recipes.d.ts +9 -8
- package/dist/lib/focus-recipes.d.ts +24 -0
- package/dist/lib/interaction-recipes.d.ts +35 -0
- package/dist/lib/layer-recipes.d.ts +19 -0
- package/dist/lib/motion-recipes.d.ts +1 -0
- package/dist/lib/overlay-anatomy-recipes.d.ts +1 -0
- package/dist/lib/safe-image-src.d.ts +10 -0
- package/dist/lib/sanitize-html.d.ts +15 -3
- package/dist/lib/surface-recipes.d.ts +47 -7
- package/dist/lib/token-merge.generated.d.ts +9 -6
- package/dist/lib/tone-recipes.d.ts +79 -0
- package/dist/lib/ui-provider/hooks.d.ts +2 -1
- package/dist/lib/ui-provider/index.d.ts +2 -2
- package/dist/lib/ui-provider/types.d.ts +9 -0
- package/dist/lib/utils.js +1 -1
- package/dist/media-gallery-DcTtAaeC.js +203 -0
- package/dist/media-gallery-DcTtAaeC.js.map +1 -0
- package/dist/mentions-D-uyCh01.js +568 -0
- package/dist/mentions-D-uyCh01.js.map +1 -0
- package/dist/{message-YfFmbXNP.js → message-CdHgIWKf.js} +5 -5
- package/dist/{message-YfFmbXNP.js.map → message-CdHgIWKf.js.map} +1 -1
- package/dist/metadata-list-X5rYAKSB.js +394 -0
- package/dist/metadata-list-X5rYAKSB.js.map +1 -0
- package/dist/{motion-recipes-B6jKXEcN.js → motion-recipes-ChBg4HBq.js} +3 -2
- package/dist/{motion-recipes-B6jKXEcN.js.map → motion-recipes-ChBg4HBq.js.map} +1 -1
- package/dist/navigation-D3KwXmaq.js +145 -0
- package/dist/navigation-D3KwXmaq.js.map +1 -0
- package/dist/navigation-HJf5zxlH.js +268 -0
- package/dist/navigation-HJf5zxlH.js.map +1 -0
- package/dist/{navigation-row-recipes-DlU-4QYO.js → navigation-row-recipes-BVowojQw.js} +2 -2
- package/dist/{navigation-row-recipes-DlU-4QYO.js.map → navigation-row-recipes-BVowojQw.js.map} +1 -1
- package/dist/{number-CKRBYmZK.js → number-DMhe-Vsk.js} +5 -5
- package/dist/{number-CKRBYmZK.js.map → number-DMhe-Vsk.js.map} +1 -1
- package/dist/overflow-tab-bar-sQHXLlwQ.js +280 -0
- package/dist/overflow-tab-bar-sQHXLlwQ.js.map +1 -0
- package/dist/overlay.recipes-8GHqmlb4.js +6 -0
- package/dist/overlay.recipes-8GHqmlb4.js.map +1 -0
- package/dist/overlays-I0axtYA6.js +999 -0
- package/dist/overlays-I0axtYA6.js.map +1 -0
- package/dist/page-B5dTH9gE.js +224 -0
- package/dist/page-B5dTH9gE.js.map +1 -0
- package/dist/page-header-commands-DjzFEq3E.js +126 -0
- package/dist/page-header-commands-DjzFEq3E.js.map +1 -0
- package/dist/{pagination-Cm0jqa3I.js → pagination-3bPA_a6K.js} +15 -15
- package/dist/{pagination-Cm0jqa3I.js.map → pagination-3bPA_a6K.js.map} +1 -1
- package/dist/{popover-Dcv_9jxr.js → popover-Di55PyAI.js} +8 -8
- package/dist/popover-Di55PyAI.js.map +1 -0
- package/dist/{popover-menu-DnRFKnHP.js → popover-menu-B71Tn2Qz.js} +6 -6
- package/dist/{popover-menu-DnRFKnHP.js.map → popover-menu-B71Tn2Qz.js.map} +1 -1
- package/dist/{popover.recipes-wmbvL8Ah.js → popover.recipes-Bdyhj2db.js} +2 -2
- package/dist/{popover.recipes-wmbvL8Ah.js.map → popover.recipes-Bdyhj2db.js.map} +1 -1
- package/dist/{primitives-BHrwQXFC.js → primitives-B-CkiEMU.js} +5 -5
- package/dist/{primitives-BHrwQXFC.js.map → primitives-B-CkiEMU.js.map} +1 -1
- package/dist/primitives.js +4 -4
- package/dist/{progress-Br9WTFya.js → progress-rnS8-uAW.js} +9 -9
- package/dist/{progress-Br9WTFya.js.map → progress-rnS8-uAW.js.map} +1 -1
- package/dist/{receipt-CV89q1fs.js → receipt-D0oswZ0p.js} +6 -6
- package/dist/{receipt-CV89q1fs.js.map → receipt-D0oswZ0p.js.map} +1 -1
- package/dist/rich-text-DvGulsNJ.js +78 -0
- package/dist/rich-text-DvGulsNJ.js.map +1 -0
- package/dist/rich-text-editor-sMU_Scqm.js +1204 -0
- package/dist/rich-text-editor-sMU_Scqm.js.map +1 -0
- package/dist/rich-text-editor.recipes-CadiF_Uu.js +88 -0
- package/dist/rich-text-editor.recipes-CadiF_Uu.js.map +1 -0
- package/dist/rich-text-editor.strings-CB59ekH2.js +38 -0
- package/dist/rich-text-editor.strings-CB59ekH2.js.map +1 -0
- package/dist/safe-image-src-C6kQSMBZ.js +17 -0
- package/dist/safe-image-src-C6kQSMBZ.js.map +1 -0
- package/dist/sanitize-html-DsQmI48u.js +92 -0
- package/dist/sanitize-html-DsQmI48u.js.map +1 -0
- package/dist/scroll-area-Bt_vXY2b.js +48 -0
- package/dist/scroll-area-Bt_vXY2b.js.map +1 -0
- package/dist/{separator-Do5GWDYi.js → separator-C8DlRGwF.js} +3 -3
- package/dist/{separator-Do5GWDYi.js.map → separator-C8DlRGwF.js.map} +1 -1
- package/dist/{separator-BMEvwnSX.js → separator-CYHnjsAb.js} +2 -2
- package/dist/{separator-BMEvwnSX.js.map → separator-CYHnjsAb.js.map} +1 -1
- package/dist/services/actions/action-adapters.d.ts +18 -0
- package/dist/services/actions/index.d.ts +1 -1
- package/dist/services/actions.js +16 -4
- package/dist/services/actions.js.map +1 -1
- package/dist/settings-CQW3b-Cu.js +170 -0
- package/dist/settings-CQW3b-Cu.js.map +1 -0
- package/dist/sheet-4SEvVYzA.js +210 -0
- package/dist/sheet-4SEvVYzA.js.map +1 -0
- package/dist/{sidebar-Crc9M9JV.js → sidebar-C7WWR29L.js} +180 -179
- package/dist/sidebar-C7WWR29L.js.map +1 -0
- package/dist/{sidebar-Cb8WzOvE.js → sidebar-d7Dg80ln.js} +16 -16
- package/dist/sidebar-d7Dg80ln.js.map +1 -0
- package/dist/{skeleton-DVMXr15h.js → skeleton-Cz890JZF.js} +9 -9
- package/dist/{skeleton-DVMXr15h.js.map → skeleton-Cz890JZF.js.map} +1 -1
- package/dist/smart-card-lFKxn5Hu.js +595 -0
- package/dist/smart-card-lFKxn5Hu.js.map +1 -0
- package/dist/{spinner-CmTAbEp0.js → spinner-fa3h1Aif.js} +7 -7
- package/dist/{spinner-CmTAbEp0.js.map → spinner-fa3h1Aif.js.map} +1 -1
- package/dist/{structure-hzCW-XsV.js → structure-DC2dygdA.js} +2 -2
- package/dist/{structure-hzCW-XsV.js.map → structure-DC2dygdA.js.map} +1 -1
- package/dist/style.css +1 -1
- package/dist/surface-recipes-BKRVW8Os.js +43 -0
- package/dist/surface-recipes-BKRVW8Os.js.map +1 -0
- package/dist/{table-D6zKeYQX.js → table-CIKyLUsy.js} +59 -58
- package/dist/table-CIKyLUsy.js.map +1 -0
- package/dist/table-CrcLN9Io.js +1458 -0
- package/dist/table-CrcLN9Io.js.map +1 -0
- package/dist/{tabs-Dk8E_knt.js → tabs-DwBJfjxX.js} +58 -57
- package/dist/tabs-DwBJfjxX.js.map +1 -0
- package/dist/{text-inputs-BFpku0Qd.js → text-inputs-aaK9wcDT.js} +74 -79
- package/dist/text-inputs-aaK9wcDT.js.map +1 -0
- package/dist/theme.css +3 -3
- package/dist/{timelines-CxuAFIc2.js → timelines-C_SBwHNP.js} +153 -150
- package/dist/timelines-C_SBwHNP.js.map +1 -0
- package/dist/tone-recipes-CPoExcTE.js +70 -0
- package/dist/tone-recipes-CPoExcTE.js.map +1 -0
- package/dist/tooltip-CsfgrfS7.js +111 -0
- package/dist/tooltip-CsfgrfS7.js.map +1 -0
- package/dist/{tree-BotPlyiD.js → tree-BiKhg8AY.js} +68 -66
- package/dist/tree-BiKhg8AY.js.map +1 -0
- package/dist/typography/rich-text.js +1 -1
- package/dist/typography-DTRkE9zL.js +117 -0
- package/dist/typography-DTRkE9zL.js.map +1 -0
- package/dist/typography.js +1 -1
- package/dist/{ui-provider-D2_TeLqw.js → ui-provider-1D_NSYzO.js} +11 -3
- package/dist/ui-provider-1D_NSYzO.js.map +1 -0
- package/dist/ui-provider.js +3 -3
- package/dist/{upload-B0WHW7ak.js → upload-BO8-CLN6.js} +209 -209
- package/dist/upload-BO8-CLN6.js.map +1 -0
- package/dist/{upload-queue-BHZ_wBfd.js → upload-queue-EOC8g1gf.js} +109 -111
- package/dist/upload-queue-EOC8g1gf.js.map +1 -0
- package/dist/upload.recipes-BbxTqrCT.js +61 -0
- package/dist/upload.recipes-BbxTqrCT.js.map +1 -0
- package/dist/{usage-card-U0YBLTNT.js → usage-card-obRaBskq.js} +46 -46
- package/dist/{usage-card-U0YBLTNT.js.map → usage-card-obRaBskq.js.map} +1 -1
- package/dist/{utils-Cospvlj1.js → utils-l5LpDw2z.js} +56 -24
- package/dist/utils-l5LpDw2z.js.map +1 -0
- package/dist/value-inputs-TAYMX111.js +947 -0
- package/dist/value-inputs-TAYMX111.js.map +1 -0
- package/dist/{value-typography-Deb3yQZg.js → value-typography-b8wpz1eX.js} +2 -2
- package/dist/{value-typography-Deb3yQZg.js.map → value-typography-b8wpz1eX.js.map} +1 -1
- package/dist/workspace-DH0v0KcB.js +407 -0
- package/dist/workspace-DH0v0KcB.js.map +1 -0
- package/docs/consumer-skill/SKILL.md +19 -20
- package/docs/consumer-skill/examples/app-layout.tsx +1 -1
- package/docs/consumer-skill/examples/composition.tsx +3 -3
- package/docs/consumer-skill/examples/detail.tsx +59 -12
- package/docs/consumer-skill/examples/edit.tsx +1 -1
- package/docs/consumer-skill/examples/receipt.tsx +2 -2
- package/docs/consumer-skill/examples/scoped-directory.tsx +1 -1
- package/docs/consumer-skill/examples/website.tsx +1 -1
- package/docs/consumer-skill/references/agents-md.md +33 -0
- package/docs/consumer-skill/references/analytics.md +1 -1
- package/docs/consumer-skill/references/composition.md +51 -8
- package/docs/consumer-skill/references/design-contract.md +12 -3
- package/docs/consumer-skill/references/installation.md +11 -1
- package/docs/consumer-skill/references/public-api.json +847 -447
- package/docs/consumer-skill/references/review.md +25 -5
- package/docs/consumer-skill/references/theming.md +8 -4
- package/docs/consumer-skill/references/tokens.json +1 -1
- package/docs/consumer-skill/references/workflows.md +29 -10
- package/docs/consumer-skill/scripts/composition-policy.mjs +41 -11
- package/docs/consumer-skill/scripts/surface-policy.mjs +139 -5
- package/package.json +10 -2
- package/dist/accordion-CQXVcd7Q.js.map +0 -1
- package/dist/action-menu-BTpyPWJ2.js +0 -264
- package/dist/action-menu-BTpyPWJ2.js.map +0 -1
- package/dist/affordance-geometry.generated-CCIXb2A1.js.map +0 -1
- package/dist/ai-artifact-2PQ2fItc.js.map +0 -1
- package/dist/attachment-q69dlt5Y.js +0 -244
- package/dist/attachment-q69dlt5Y.js.map +0 -1
- package/dist/auth-M3vGMgDR.js.map +0 -1
- package/dist/avatar-djdaaQ_s.js.map +0 -1
- package/dist/badge-0tATj-tW.js +0 -92
- package/dist/badge-0tATj-tW.js.map +0 -1
- package/dist/breadcrumbs-BG_FfMK4.js +0 -128
- package/dist/breadcrumbs-BG_FfMK4.js.map +0 -1
- package/dist/button-BS3KDg00.js.map +0 -1
- package/dist/button-R9CCoH7A.js.map +0 -1
- package/dist/buttons-DS0ZIwJ_.js +0 -99
- package/dist/buttons-DS0ZIwJ_.js.map +0 -1
- package/dist/cards-QoJ4syG9.js.map +0 -1
- package/dist/checkbox-B7ygNTYp.js +0 -35
- package/dist/checkbox-B7ygNTYp.js.map +0 -1
- package/dist/choice-inputs-DrJ17tpL.js +0 -752
- package/dist/choice-inputs-DrJ17tpL.js.map +0 -1
- package/dist/code-block-CD0B7M93.js +0 -183
- package/dist/code-block-CD0B7M93.js.map +0 -1
- package/dist/combobox-6dvVny2q.js.map +0 -1
- package/dist/combobox-CB7039j7.js.map +0 -1
- package/dist/comments-You0Bzbr.js.map +0 -1
- package/dist/components/layout/page/partials/page-header-commands.d.ts +0 -13
- package/dist/containers-D_L4mTVb.js.map +0 -1
- package/dist/data-display-3xWQUnMA.js +0 -1335
- package/dist/data-display-3xWQUnMA.js.map +0 -1
- package/dist/date-picker-DrDFj8Lo.js +0 -1527
- package/dist/date-picker-DrDFj8Lo.js.map +0 -1
- package/dist/display-DrdvPwF0.js.map +0 -1
- package/dist/feedback-C7nR0UtT.js.map +0 -1
- package/dist/field-affordance-recipes-CkOCdE2y.js.map +0 -1
- package/dist/field-state-recipes-C-MFBX_8.js +0 -11
- package/dist/field-state-recipes-C-MFBX_8.js.map +0 -1
- package/dist/filters-Da-gNPsE.js.map +0 -1
- package/dist/form-sizing-uWP4lzVh.js.map +0 -1
- package/dist/forms-numeric-D3CO60IF.js.map +0 -1
- package/dist/header-2ycNqGOR.js.map +0 -1
- package/dist/icon-badge-DKlaKXoo.js +0 -53
- package/dist/icon-badge-DKlaKXoo.js.map +0 -1
- package/dist/input-DhQdBnV3.js +0 -255
- package/dist/input-DhQdBnV3.js.map +0 -1
- package/dist/item-xzh8Df65.js.map +0 -1
- package/dist/media-gallery-DQUQ0m3O.js +0 -201
- package/dist/media-gallery-DQUQ0m3O.js.map +0 -1
- package/dist/mentions-DwnO1hh4.js +0 -564
- package/dist/mentions-DwnO1hh4.js.map +0 -1
- package/dist/navigation-Cbp5V8gG.js +0 -264
- package/dist/navigation-Cbp5V8gG.js.map +0 -1
- package/dist/navigation-Cs1npsPm.js +0 -300
- package/dist/navigation-Cs1npsPm.js.map +0 -1
- package/dist/overlay.recipes-CNO2S9V6.js +0 -34
- package/dist/overlay.recipes-CNO2S9V6.js.map +0 -1
- package/dist/overlays-DhZO7N-I.js +0 -994
- package/dist/overlays-DhZO7N-I.js.map +0 -1
- package/dist/page-C6R_8jFt.js +0 -325
- package/dist/page-C6R_8jFt.js.map +0 -1
- package/dist/page-header-hUTzcRZX.js +0 -112
- package/dist/page-header-hUTzcRZX.js.map +0 -1
- package/dist/popover-Dcv_9jxr.js.map +0 -1
- package/dist/rich-text-editor-CF8QYt5p.js +0 -574
- package/dist/rich-text-editor-CF8QYt5p.js.map +0 -1
- package/dist/rich-text-editor.recipes-CnrbmTS1.js +0 -81
- package/dist/rich-text-editor.recipes-CnrbmTS1.js.map +0 -1
- package/dist/rich-text-editor.strings-BpnIQgMl.js +0 -25
- package/dist/rich-text-editor.strings-BpnIQgMl.js.map +0 -1
- package/dist/rich-text-j-FGAeZW.js +0 -32
- package/dist/rich-text-j-FGAeZW.js.map +0 -1
- package/dist/sanitize-html-BG9FGe-j.js +0 -64
- package/dist/sanitize-html-BG9FGe-j.js.map +0 -1
- package/dist/scroll-area-DRdr16Pt.js +0 -47
- package/dist/scroll-area-DRdr16Pt.js.map +0 -1
- package/dist/settings-DHk0L2MF.js +0 -161
- package/dist/settings-DHk0L2MF.js.map +0 -1
- package/dist/sheet-DRFNY1_D.js +0 -207
- package/dist/sheet-DRFNY1_D.js.map +0 -1
- package/dist/sidebar-Cb8WzOvE.js.map +0 -1
- package/dist/sidebar-Crc9M9JV.js.map +0 -1
- package/dist/smart-card-Bek-TwUp.js +0 -599
- package/dist/smart-card-Bek-TwUp.js.map +0 -1
- package/dist/surface-recipes-DOdoBXGm.js +0 -28
- package/dist/surface-recipes-DOdoBXGm.js.map +0 -1
- package/dist/table-D6zKeYQX.js.map +0 -1
- package/dist/table-Dn4XSrSB.js +0 -1444
- package/dist/table-Dn4XSrSB.js.map +0 -1
- package/dist/tabs-Dk8E_knt.js.map +0 -1
- package/dist/text-inputs-BFpku0Qd.js.map +0 -1
- package/dist/timelines-CxuAFIc2.js.map +0 -1
- package/dist/tree-BotPlyiD.js.map +0 -1
- package/dist/typography-CAr3dQhX.js +0 -116
- package/dist/typography-CAr3dQhX.js.map +0 -1
- package/dist/ui-provider-D2_TeLqw.js.map +0 -1
- package/dist/upload-B0WHW7ak.js.map +0 -1
- package/dist/upload-queue-BHZ_wBfd.js.map +0 -1
- package/dist/use-file-drop-target-BX7GnhoQ.js +0 -39
- package/dist/use-file-drop-target-BX7GnhoQ.js.map +0 -1
- package/dist/utils-Cospvlj1.js.map +0 -1
- package/dist/value-inputs-CjfzGMsN.js +0 -854
- package/dist/value-inputs-CjfzGMsN.js.map +0 -1
- package/dist/workspace-YoFjXi6i.js +0 -394
- package/dist/workspace-YoFjXi6i.js.map +0 -1
- /package/dist/components/{blocks/data-display/metadata → base/metadata-list}/metadata-list.strings.d.ts +0 -0
|
@@ -1,12 +1,17 @@
|
|
|
1
|
+
import { useState, type ReactNode } from 'react';
|
|
1
2
|
import { Button } from 'themelia-react-ui/base/buttons';
|
|
2
3
|
import { Card } from 'themelia-react-ui/base/cards';
|
|
3
|
-
import { MetadataList } from 'themelia-react-ui/
|
|
4
|
+
import { MetadataList } from 'themelia-react-ui/base/metadata-list';
|
|
5
|
+
import { ConfirmDialog, useOverlayVisibility } from 'themelia-react-ui/features/overlays';
|
|
6
|
+
import { Page, type PageHeaderAction } from 'themelia-react-ui/layout/page';
|
|
4
7
|
import { Date, Email, Money, Value } from 'themelia-react-ui/primitives';
|
|
5
|
-
import {
|
|
8
|
+
import { Text } from 'themelia-react-ui/typography';
|
|
6
9
|
|
|
7
10
|
export interface AccountDetailRecord {
|
|
8
11
|
id: string; name: string; email: string | null;
|
|
9
12
|
createdAt: string | null; balanceMinor: number | null; currency: string;
|
|
13
|
+
/** Shown as the one status badge beside the title. */
|
|
14
|
+
overdue?: boolean;
|
|
10
15
|
}
|
|
11
16
|
export interface AccountDetailProps {
|
|
12
17
|
account: AccountDetailRecord;
|
|
@@ -14,21 +19,63 @@ export interface AccountDetailProps {
|
|
|
14
19
|
onBack: () => void;
|
|
15
20
|
}
|
|
16
21
|
|
|
17
|
-
|
|
22
|
+
/** One framed subject for a drawer or dashboard: one quick control, no page chrome. */
|
|
23
|
+
export function AccountDetail({ account, onEdit }: AccountDetailProps) {
|
|
18
24
|
return <Card title={account.name} headerPlacement="frame"
|
|
19
|
-
headerAction={<Button
|
|
20
|
-
footerSlot={<Button tone="secondary" buttonStyle="outline" onClick={onBack}>Back to accounts</Button>}>
|
|
25
|
+
headerAction={<Button onClick={() => onEdit(account.id)}>Edit</Button>}>
|
|
21
26
|
<AccountFacts account={account}/>
|
|
22
27
|
</Card>;
|
|
23
28
|
}
|
|
24
29
|
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
30
|
+
export type AccountSection = 'overview' | 'invoices' | 'activity';
|
|
31
|
+
|
|
32
|
+
export interface AccountDetailPageProps extends AccountDetailProps {
|
|
33
|
+
section: AccountSection;
|
|
34
|
+
onSectionChange: (section: AccountSection) => void;
|
|
35
|
+
invoiceCount: number;
|
|
36
|
+
onSendStatement: (id: string) => void;
|
|
37
|
+
/** Reject on failure; the confirmation stays open and shows the error. */
|
|
38
|
+
onDelete: (id: string) => Promise<void>;
|
|
39
|
+
/** The app's invoice table or activity log for the other sections. */
|
|
40
|
+
children?: ReactNode;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
/**
|
|
44
|
+
* A record route: Page owns the title, status, commands and section tabs.
|
|
45
|
+
* Commands carry roles, not colours; the header places them.
|
|
46
|
+
*/
|
|
47
|
+
export function AccountDetailPage({ account, onEdit, onBack, section, onSectionChange,
|
|
48
|
+
invoiceCount, onSendStatement, onDelete, children }: AccountDetailPageProps) {
|
|
49
|
+
const deletion = useOverlayVisibility();
|
|
50
|
+
const [error, setError] = useState<string>();
|
|
51
|
+
const commands: PageHeaderAction[] = [
|
|
52
|
+
{ label: 'Send statement', onClick: () => onSendStatement(account.id) },
|
|
53
|
+
{ label: 'Delete account', destructive: true, onClick: () => { setError(undefined); deletion.show(); } },
|
|
54
|
+
];
|
|
55
|
+
return <Page header={{
|
|
56
|
+
title: account.name, onBack, backLabel: 'Back to accounts',
|
|
57
|
+
titleBadges: account.overdue ? [{ label: 'Overdue', tone: 'warning' }] : undefined,
|
|
58
|
+
primaryAction: { label: 'Edit account', onClick: () => onEdit(account.id) },
|
|
59
|
+
secondaryActions: commands,
|
|
60
|
+
tabs: {
|
|
61
|
+
label: 'Account sections', value: section,
|
|
62
|
+
onValueChange: id => onSectionChange(id as AccountSection),
|
|
63
|
+
items: [
|
|
64
|
+
{ id: 'overview', label: 'Overview' },
|
|
65
|
+
{ id: 'invoices', label: 'Invoices', badge: invoiceCount },
|
|
66
|
+
{ id: 'activity', label: 'Activity' },
|
|
67
|
+
],
|
|
68
|
+
},
|
|
69
|
+
}}>
|
|
70
|
+
{section === 'overview'
|
|
71
|
+
? <Card title="Contact and billing" headerPlacement="frame"><AccountFacts account={account}/></Card>
|
|
72
|
+
: children}
|
|
73
|
+
<ConfirmDialog {...deletion.overlayProps} destructive
|
|
74
|
+
title={`Delete ${account.name}?`} description="This permanently removes the account."
|
|
75
|
+
onAsyncConfirm={() => onDelete(account.id)}
|
|
76
|
+
onError={() => setError('Deletion failed. The account is kept; retry or cancel.')}>
|
|
77
|
+
{error && <Text role="alert" type="error">{error}</Text>}
|
|
78
|
+
</ConfirmDialog>
|
|
32
79
|
</Page>;
|
|
33
80
|
}
|
|
34
81
|
|
|
@@ -53,7 +53,7 @@ export function AccountEdit({ initial, onSave, onCancel }: AccountEditProps) {
|
|
|
53
53
|
{saved && <Text role="status">Account saved.</Text>}
|
|
54
54
|
<Stack direction={{ base: 'vertical', sm: 'horizontal' }} gap="sm">
|
|
55
55
|
<Button tone="primary" type="submit" loading={pending} strings={{ loading: 'Saving account…' }}>Save account</Button>
|
|
56
|
-
<Button type="button"
|
|
56
|
+
<Button type="button" disabled={pending} onClick={onCancel}>Cancel edit</Button>
|
|
57
57
|
</Stack>
|
|
58
58
|
</Stack>
|
|
59
59
|
</form>
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { Receipt, ReceiptItems, type ReceiptLineItem } from 'themelia-react-ui/blocks/commerce/receipt';
|
|
2
|
-
import { MetadataList } from 'themelia-react-ui/
|
|
2
|
+
import { MetadataList } from 'themelia-react-ui/base/metadata-list';
|
|
3
3
|
import { Money } from 'themelia-react-ui/primitives';
|
|
4
4
|
import { Separator } from 'themelia-react-ui/base/display';
|
|
5
5
|
import { Stack } from 'themelia-react-ui/base/structure';
|
|
@@ -13,7 +13,7 @@ export function PurchaseReceipt({ items, total, reference }: { items: readonly R
|
|
|
13
13
|
<Separator dashed />
|
|
14
14
|
<ReceiptItems items={items} currency="EUR" unit="minor" />
|
|
15
15
|
<Separator dashed />
|
|
16
|
-
<MetadataList layout="rows" items={[{ label: 'Total', value: <Money tag="div" className="block" amount={total} currency="EUR" unit="minor" weight="semibold" /> }]} />
|
|
16
|
+
<MetadataList layout="rows" valueAlign="end" items={[{ label: 'Total', value: <Money tag="div" className="block" amount={total} currency="EUR" unit="minor" weight="semibold" /> }]} />
|
|
17
17
|
</Stack>
|
|
18
18
|
</Receipt>;
|
|
19
19
|
}
|
|
@@ -70,7 +70,7 @@ export function ScopedDirectory(props: ScopedDirectoryProps) {
|
|
|
70
70
|
props.state.status === 'error' ? 'Contacts could not be loaded.' :
|
|
71
71
|
props.filters.length ? 'No contacts match these criteria.' : 'No contacts in this business yet.'}
|
|
72
72
|
emptyStateAction={props.state.status === 'error' ? <Stack gap="dense"><Text role="alert" type="error">{props.state.message}</Text>
|
|
73
|
-
<Button
|
|
73
|
+
<Button onClick={props.onRetry}>Retry contacts</Button></Stack> : undefined}
|
|
74
74
|
rowActions={rowActions} />
|
|
75
75
|
</FilterProvider>
|
|
76
76
|
</Page>;
|
|
@@ -43,7 +43,7 @@ export function WebsiteLandingPage({ title, description, actionLabel, actionHref
|
|
|
43
43
|
<Heading tag="h2" size="2xl" id={servicesId}>{servicesTitle}</Heading>
|
|
44
44
|
<Grid columns={{ base: 1, md: 2, lg: 3 }} gap="xl">
|
|
45
45
|
{offers.map(offer => <Card key={offer.id} title={offer.title} description={offer.description}
|
|
46
|
-
footerSlot={<Button href={offer.href}
|
|
46
|
+
footerSlot={<Button href={offer.href}>{offer.actionLabel}</Button>}>
|
|
47
47
|
<Stack gap="dense">
|
|
48
48
|
<Money {...offer.price} locale={locale} align="left" weight="semibold" />
|
|
49
49
|
<Text type="secondary" size="xs">{offer.priceNote}</Text>
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
# Project instructions block
|
|
2
|
+
|
|
3
|
+
Agents load a skill only when they decide to, and often never open it. Paste this
|
|
4
|
+
block into the consuming app's `AGENTS.md`, which Codex, Cursor, Copilot and
|
|
5
|
+
Claude Code read; in a project that has only `CLAUDE.md`, paste it there. It
|
|
6
|
+
points agents at this installed skill and states when UI work is done.
|
|
7
|
+
|
|
8
|
+
```md
|
|
9
|
+
<!-- themelia-react-ui:start 2.0.1 -->
|
|
10
|
+
## UI built with themelia-react-ui
|
|
11
|
+
Before writing UI, read node_modules/themelia-react-ui/docs/consumer-skill/SKILL.md and the
|
|
12
|
+
installed declarations; prefer them over memory. Find the owner for a task with:
|
|
13
|
+
node node_modules/themelia-react-ui/docs/consumer-skill/scripts/find-components.mjs <task nouns>
|
|
14
|
+
Rules: one Page per route, whose title is the h1. Commands go in header.primaryAction
|
|
15
|
+
(one) and ordered header.secondaryActions; destructive ones confirm with ConfirmDialog.
|
|
16
|
+
A record's sections go in header.tabs. Space siblings with Stack/Grid gap; write copy
|
|
17
|
+
with Heading/Text and values with Money/Date/Number; use semantic colors; badges stay
|
|
18
|
+
neutral unless they state status; dialogs come only from themelia-react-ui/features/overlays.
|
|
19
|
+
Done means: node node_modules/themelia-react-ui/docs/consumer-skill/scripts/check-composition.mjs <changed files>
|
|
20
|
+
reports no errors (fix and re-run, at most three rounds), then the app's typecheck, lint
|
|
21
|
+
and tests pass. Hand back each check as run or not run, and every kept warning with
|
|
22
|
+
file:line and its reason.
|
|
23
|
+
<!-- themelia-react-ui:end -->
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
- Keep the block between its markers and replace all of it after an upgrade. The
|
|
27
|
+
start marker records the package version it was generated for; app rules belong
|
|
28
|
+
outside the markers.
|
|
29
|
+
- It names only the Node scripts that ship in `docs/consumer-skill/scripts`, so
|
|
30
|
+
every agent can run them without a plugin, MCP server or global CLI.
|
|
31
|
+
- The done condition is the agent's, not the build's: app CI can stay
|
|
32
|
+
non-blocking on checker warnings. See [review](review.md#done-means) for the
|
|
33
|
+
hand-back and the checker's coverage.
|
|
@@ -15,7 +15,7 @@ application data and never fetch or define a business metric.
|
|
|
15
15
|
| Current versus previous metric | `MetricComparison` from `themelia-react-ui/blocks/analytics` | Uses current/previous `MetricData`; app defines the comparison baseline. |
|
|
16
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
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/
|
|
18
|
+
| Several facts about one record | `MetadataList` from `themelia-react-ui/base/metadata-list` | Card-free; value primitives own formatting. |
|
|
19
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
20
|
|
|
21
21
|
Start with these subject owners before constructing a Card with a number and
|
|
@@ -35,7 +35,12 @@ a detail workspace or a form; they need different information hierarchies.
|
|
|
35
35
|
|
|
36
36
|
For a DataTable composition, put queries in `topbarContent`, exports or collection
|
|
37
37
|
tools in `topbarEnd`, selection commands in `bulkActions`, and record commands
|
|
38
|
-
in `rowActions`.
|
|
38
|
+
in `rowActions`. `bulkActions` render in the shared `BatchActionBar`, docked to
|
|
39
|
+
the viewport while rows are selected (`selectionToolbarPlacement="inline"` keeps
|
|
40
|
+
it in flow); they need no disabled state for an empty selection. Any other list
|
|
41
|
+
with a selection mounts `BatchActionBar` from
|
|
42
|
+
`themelia-react-ui/base/batch-action-bar` rather than a hand-built selection
|
|
43
|
+
toolbar. Other arrangements are valid when the product has a distinct
|
|
39
44
|
query region; choose one owner deliberately and keep queries close to their
|
|
40
45
|
results. DataView already owns coordinated filtering; do not add a second filter
|
|
41
46
|
store around it without inspecting its contract.
|
|
@@ -57,8 +62,10 @@ and CellStack where its smaller secondary-value contract fits.
|
|
|
57
62
|
Commands need explicit importance as well as scope. Describe page commands by
|
|
58
63
|
role in Page's header: `primaryAction` is the route's one main command, and
|
|
59
64
|
`secondaryActions` lists supporting commands in priority order. The header owns
|
|
60
|
-
their treatment
|
|
61
|
-
actions menu for overflow, destructive commands and narrow screens
|
|
65
|
+
their treatment and order: outline secondary buttons, the solid primary button,
|
|
66
|
+
then a More actions menu for overflow, destructive commands and narrow screens,
|
|
67
|
+
which always ends the row. WorkspaceRecordHeader, ResourceHeader, the resource
|
|
68
|
+
shells and SettingsShell take the same props and render the same row. Choosing which
|
|
62
69
|
command is primary, which are `destructive`, and which are `visible` remains an
|
|
63
70
|
application decision; confirm destructive commands in their handler. Use
|
|
64
71
|
`actions` only for non-command controls such as a period select. A back link,
|
|
@@ -75,6 +82,29 @@ export and destructive command should not all inherit the same visual emphasis.
|
|
|
75
82
|
}}>{/* route content */}</Page>
|
|
76
83
|
```
|
|
77
84
|
|
|
85
|
+
A record split into sections adds `header.tabs`. The tabs sit under the header's
|
|
86
|
+
copy and commands, a `badge` shows a count, tabs that do not fit move into a More
|
|
87
|
+
menu, and `onValueChange` switches the section or routes. Labels name the
|
|
88
|
+
command; an icon on every command repeats it, so keep `+` on an add command and
|
|
89
|
+
leave the others plain.
|
|
90
|
+
|
|
91
|
+
```tsx
|
|
92
|
+
<Page header={{
|
|
93
|
+
title: member.name,
|
|
94
|
+
titleBadges: [{ label: 'Needs attention', tone: 'warning' }],
|
|
95
|
+
primaryAction: { label: 'Generate report', onClick: onReport },
|
|
96
|
+
secondaryActions: [
|
|
97
|
+
{ label: 'Update profile', onClick: onEdit },
|
|
98
|
+
{ label: 'Record membership decision', onClick: onDecision },
|
|
99
|
+
],
|
|
100
|
+
tabs: { value: section, onValueChange: setSection, items: [
|
|
101
|
+
{ id: 'documents', label: 'Documents', badge: documents.length },
|
|
102
|
+
{ id: 'hours', label: 'CPD hours', badge: hours },
|
|
103
|
+
{ id: 'privacy', label: 'Privacy' },
|
|
104
|
+
] },
|
|
105
|
+
}}>{/* active section */}</Page>
|
|
106
|
+
```
|
|
107
|
+
|
|
78
108
|
| Drift | Better decision |
|
|
79
109
|
| --- | --- |
|
|
80
110
|
| Same parent named in header, context strip and fixed filter | One contextual lead; repeat only where it clarifies a separate task |
|
|
@@ -154,6 +184,13 @@ is appropriate only for inline content. The allowlist strips arbitrary styling,
|
|
|
154
184
|
embedded media and unsafe links; it is not a Markdown parser or email-layout
|
|
155
185
|
renderer. Keep outer width/padding on the surrounding structure. RichTextEditor
|
|
156
186
|
owns editing; EmailComposer owns structured email/variable/delivery contracts.
|
|
187
|
+
Images are opt-in on both: create one object with `useRichTextImages({ upload,
|
|
188
|
+
renderImage })` from `features/rich-text-editor` and pass it as `images` to the
|
|
189
|
+
editor and to RichText. Your `upload(file, { signal })` stores the file and
|
|
190
|
+
resolves `{ src, alt?, width?, height? }`; the editor owns insertion, the upload
|
|
191
|
+
placeholder, retry, alt text and the source policy (http, https, `blob:` and
|
|
192
|
+
relative sources only), and `renderImage` draws read-only images with your
|
|
193
|
+
component.
|
|
157
194
|
Read the relevant declarations and [integration](integration.md) before choosing
|
|
158
195
|
the content owner. Embedded React UI can opt out of reading rhythm through
|
|
159
196
|
`not-typeset` or `data-not-typeset` on its subtree; those opt-outs do not bypass
|
|
@@ -200,6 +237,9 @@ should stay off: separate a card's sections with `contentGap` or a Stack gap
|
|
|
200
237
|
clearly larger than the row gap (`2xl` between sections). UIProvider can configure
|
|
201
238
|
`card.defaultHeaderDivider` and `card.defaultFooterDivider`; explicit per-card
|
|
202
239
|
booleans win. Header/footer-only cards still render one shared divider.
|
|
240
|
+
Overlays are the exception: `ActionDialog`, `ActionDrawer` and `ConfirmDialog`
|
|
241
|
+
draw one rule between header, body and footer (one rule when there is no body),
|
|
242
|
+
owned by the overlay; do not add borders to their content.
|
|
203
243
|
|
|
204
244
|
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.
|
|
205
245
|
|
|
@@ -256,7 +296,7 @@ peer rhythm, and a horizontal Stack wraps footer actions. The app supplies the
|
|
|
256
296
|
subjects and commands. For viewport-responsive columns use Grid; for available
|
|
257
297
|
parent width use AdaptiveGrid or `TwoColumnLayout adaptTo="container"`.
|
|
258
298
|
|
|
259
|
-
MetadataList owns
|
|
299
|
+
MetadataList owns semibold labels and normal-weight routine values. Its
|
|
260
300
|
compact density tightens gaps/rows without shrinking primary values. Plain values
|
|
261
301
|
and typed descriptors retain the shared roles; React nodes, `display` and `render`
|
|
262
302
|
preserve supplied typography. Keep custom formatted values consistent with value
|
|
@@ -285,12 +325,14 @@ PopoverContent defaults to display/default; Command defaults to compact. An expl
|
|
|
285
325
|
|
|
286
326
|
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.
|
|
287
327
|
|
|
288
|
-
Input frames
|
|
328
|
+
Input frames and outline buttons share the input semantic token; collection dividers use border/60; focus uses ring separately and draws one indicator everywhere (a full-strength edge inside a soft halo). Equal responsibilities share recipes, while different semantic roles retain their own treatment. CommandInput keeps its existing onValueChange search contract and native refs; use the actual public Input through its default composition rather than restyling an unframed native field.
|
|
289
329
|
|
|
290
330
|
ActionMenu density="table" remains a legacy table/overflow adapter. AsyncPreview padding="lg" owns a compatibility content boundary. Neither expands the default/compact surface vocabulary.
|
|
291
331
|
|
|
292
332
|
Button separates tone from buttonStyle (solid, outline, ghost). ActionButtons renders the same definitions as ActionMenu. Badge tones describe actual states, not a decorative palette.
|
|
293
333
|
|
|
334
|
+
Overflow menus use ActionMenu's own trigger: the ⋯ glyph named "More actions", context="inline" (default) for the ghost square in rows, cards and footers, context="commands" for the outline square beside outline commands. Pass buttonProps.size only to match the controls beside it; otherwise it follows the provider scale. Place the menu after the row's primary command and keep destructive entries last. Do not pass a MoreVertical icon, buttonStyle, tone or size-action classes to restyle it.
|
|
335
|
+
|
|
294
336
|
## Migration
|
|
295
337
|
|
|
296
338
|
Use exact themelia-react-ui paths. Presentation imports use blocks/<family>, replacing composed/<family>. Raw UI, Radix, cmdk and routers are not consumer foundations. Read installed types instead of assuming historical CSS-kit props.
|
|
@@ -422,9 +464,10 @@ TwoColumnLayout. A wide comparison/directory can deliberately use `maxWidth="ful
|
|
|
422
464
|
Setting full on every route defeats the resource measure. Do not remove Page's
|
|
423
465
|
gutters to make its title touch the sidebar; align the header and body through
|
|
424
466
|
the same Page. Density, container measure and page inset are separate choices.
|
|
425
|
-
The [detail recipe](../examples/detail.tsx) includes `AccountDetailPage`:
|
|
426
|
-
|
|
427
|
-
and MetadataList facts, with no duplicated subject
|
|
467
|
+
The [detail recipe](../examples/detail.tsx) includes `AccountDetailPage`: the
|
|
468
|
+
default record measure, a status badge, route-level commands and section tabs in
|
|
469
|
+
the header, and MetadataList facts in one framed Card, with no duplicated subject
|
|
470
|
+
header or gutter.
|
|
428
471
|
|
|
429
472
|
Compose HeaderUserMenu in topbar `slots.headerEnd` or a local toolbar, and
|
|
430
473
|
SidebarNavigationUser in AppSidebar `slots.footer` when account access belongs
|
|
@@ -31,9 +31,17 @@ than rebuilding its accessible interaction behavior.
|
|
|
31
31
|
| Action geometry and centered text | Button/IconButton/Badge recipes | Supported size/tone/style/variant |
|
|
32
32
|
| Row labels, icons and selection indicators | Item and collection recipes | Supported row content, descriptions and density |
|
|
33
33
|
| Semantic surfaces and states | Central theme and family state recipes | Theme foreground/surface pairs and supported tone/state props |
|
|
34
|
+
| Hover, selection, current, pressed and disabled states | Shared interaction recipes: rows and selection use `--accent`, toggles hover with `--muted`, tables use a quieter muted ladder, disabled content dims to 50% | Theme `--accent`, `--muted` and `--card`; supported `active`, `selected`, `pressed` and `disabled` props |
|
|
35
|
+
| Status tints | One tint scale per tone (wash, tint, edge, halo, line), contrast-tested with its ink | `tone` on Badge, Alert, IconBadge, StackedAvatars and toned blocks; the theme's tone colours |
|
|
36
|
+
| Neutral regions, chips and elevation | One neutral strength per role (quiet wash, header band, track, chip) and one theme shadow per role (resting, card, raised, lifted, modal) | Theme `--muted`, `--foreground` and the `--shadow-*` ladder; supported surface variants |
|
|
34
37
|
| Corners and elevation | Shared radius and theme shadow ladder | Theme roots and supported surface variants |
|
|
35
38
|
| Presence, dismissal and focus | Base UI plus library overlay/motion owners | Public open/state/dismissal callbacks and library overlays |
|
|
36
39
|
|
|
40
|
+
Restyle states through the theme roles so every family moves together: a
|
|
41
|
+
darker `--accent` changes every row hover and selection at once. Passing
|
|
42
|
+
`bg-success/15` or `hover:bg-muted/40` to one library row creates a second scale
|
|
43
|
+
that the contrast contract does not test.
|
|
44
|
+
|
|
37
45
|
An inset has one owner. A searchable menu needs the search region's outer inset
|
|
38
46
|
and the Input's inner text inset; it does not need a third padded wrapper. A
|
|
39
47
|
card-free block can be framed by a Card at its composition boundary.
|
|
@@ -96,9 +104,10 @@ a divider, or recolor a divider to simulate focus. Theme status colors keep thei
|
|
|
96
104
|
foreground pairs; a status tone is not a decorative brand palette.
|
|
97
105
|
|
|
98
106
|
Native fields, field-shaped triggers and compound field frames share the same
|
|
99
|
-
focus and invalid treatment.
|
|
100
|
-
|
|
101
|
-
|
|
107
|
+
focus and invalid treatment. Every focused element draws one indicator: a 1px
|
|
108
|
+
`ring` edge inside a soft 3px halo. Invalid state marks the frame and error copy
|
|
109
|
+
(and tints the halo while focused); editable values keep their normal semantic
|
|
110
|
+
foreground. Compound fields show one outer focus frame. Use validation and disabled/loading props instead of supplying a
|
|
102
111
|
second local state recipe. Selected rows retain the owning primitive's indicator;
|
|
103
112
|
highlighted, selected and destructive states are distinct responsibilities.
|
|
104
113
|
|
|
@@ -47,7 +47,11 @@ if (fs.realpathSync(selectedSkill) !== fs.realpathSync(installedSkill)) {
|
|
|
47
47
|
}
|
|
48
48
|
compareAssets(installedSkill);
|
|
49
49
|
}
|
|
50
|
-
|
|
50
|
+
// The app's project instructions block records the version it was pasted from.
|
|
51
|
+
const instructions = ['AGENTS.md', 'CLAUDE.md'].find(file => fs.existsSync(file));
|
|
52
|
+
const marker = instructions && fs.readFileSync(instructions, 'utf8').match(/<!-- themelia-react-ui:start (\S+) -->/);
|
|
53
|
+
const agentsBlock = !marker ? 'missing' : marker[1] === manifest.version ? 'current' : `stale (${marker[1]})`;
|
|
54
|
+
console.log(JSON.stringify({ package: manifest.name, version: manifest.version, root, skill: selectedSkill, agentsBlock }, null, 2));
|
|
51
55
|
JS
|
|
52
56
|
```
|
|
53
57
|
|
|
@@ -64,6 +68,12 @@ files or publisher markers in the copy are not checked. Keep local product polic
|
|
|
64
68
|
outside the package guidance. Recopy the complete folder after upgrades, and
|
|
65
69
|
read declarations from the installed package.
|
|
66
70
|
|
|
71
|
+
`agentsBlock` reports whether the app's `AGENTS.md` (or `CLAUDE.md`) carries the
|
|
72
|
+
[project instructions block](agents-md.md) for the installed version: `missing`,
|
|
73
|
+
`current` or `stale` with the version it was pasted from. Paste or replace the
|
|
74
|
+
whole block between its markers; it is how agents that never open a skill still
|
|
75
|
+
find this one and its done condition.
|
|
76
|
+
|
|
67
77
|
## Upgrading to the neutral button default
|
|
68
78
|
|
|
69
79
|
An untoned `Button` is now the neutral outline (`tone="secondary"`,
|