themelia-react-ui 2.0.5 → 2.0.6
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 +76 -0
- package/MIGRATION.md +119 -0
- package/README.md +13 -6
- package/dist/{accordion-B9MHG0cT.js → accordion-0tQUZ20r.js} +7 -7
- package/dist/accordion-0tQUZ20r.js.map +1 -0
- package/dist/{action-menu-Dr8K-ghE.js → action-menu-C0gjzLyE.js} +7 -7
- package/dist/{action-menu-Dr8K-ghE.js.map → action-menu-C0gjzLyE.js.map} +1 -1
- package/dist/{ai-artifact-C58tQcBy.js → ai-artifact-CGGpQryR.js} +172 -157
- package/dist/ai-artifact-CGGpQryR.js.map +1 -0
- package/dist/{app-shell-B_IuNWOo.js → app-shell-EHuuRDGy.js} +5 -5
- package/dist/{app-shell-B_IuNWOo.js.map → app-shell-EHuuRDGy.js.map} +1 -1
- package/dist/{attachment-Dg_69lPS.js → attachment-BCpA4e7i.js} +8 -8
- package/dist/{attachment-Dg_69lPS.js.map → attachment-BCpA4e7i.js.map} +1 -1
- package/dist/{auth-DTkkshS8.js → auth-B0girIk_.js} +15 -15
- package/dist/auth-B0girIk_.js.map +1 -0
- package/dist/{avatar-CeZaFmNH.js → avatar-B9Jnp-T-.js} +3 -3
- package/dist/{avatar-CeZaFmNH.js.map → avatar-B9Jnp-T-.js.map} +1 -1
- package/dist/{badge-xIiV_E7f.js → badge-wWauMgAt.js} +3 -3
- package/dist/{badge-xIiV_E7f.js.map → badge-wWauMgAt.js.map} +1 -1
- 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 +1 -1
- package/dist/base/buttons.js +1 -1
- package/dist/base/cards.js +2 -2
- package/dist/base/carousel.js +3 -3
- package/dist/base/cascader.js +1 -1
- package/dist/base/chart.js +1 -1
- package/dist/base/choice-inputs.js +2 -2
- 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 +6 -6
- package/dist/base/feedback.js +4 -4
- package/dist/base/forms-numeric.js +1 -1
- package/dist/base/forms.js +2 -2
- package/dist/base/inline-edit.js +8 -8
- package/dist/base/item.js +1 -1
- package/dist/base/media-gallery.js +1 -1
- package/dist/base/metadata-list.js +1 -1
- package/dist/base/navigation.js +6 -6
- 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 +195 -188
- package/dist/base/repeaters.js.map +1 -1
- package/dist/base/sheet.js +1 -1
- package/dist/base/sidebar.js +2 -2
- package/dist/base/signature-pad.js +7 -7
- package/dist/base/skeleton.js +1 -1
- package/dist/base/spinner.js +5 -5
- package/dist/base/spinner.js.map +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 +1 -1
- 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 +1 -1
- package/dist/{batch-action-bar-Cb8cuvyy.js → batch-action-bar-BoqWIIpV.js} +5 -5
- package/dist/{batch-action-bar-Cb8cuvyy.js.map → batch-action-bar-BoqWIIpV.js.map} +1 -1
- package/dist/blocks/admin.js +17 -17
- package/dist/blocks/ai.js +227 -221
- package/dist/blocks/ai.js.map +1 -1
- package/dist/blocks/analytics/usage-card.js +1 -1
- package/dist/blocks/analytics.js +424 -449
- 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 +225 -220
- package/dist/blocks/commerce.js.map +1 -1
- package/dist/blocks/data-display.js +2 -2
- package/dist/blocks/onboarding.js +5 -5
- package/dist/blocks/planning.js +11 -11
- package/dist/blocks/timelines.js +1 -1
- package/dist/{breadcrumbs-J-K2kl4c.js → breadcrumbs-Bp9Ke7kd.js} +4 -4
- package/dist/breadcrumbs-Bp9Ke7kd.js.map +1 -0
- package/dist/{button-S2Cubiiz.js → button-ChBovTx0.js} +2 -2
- package/dist/{button-S2Cubiiz.js.map → button-ChBovTx0.js.map} +1 -1
- package/dist/{buttons-BedGfygC.js → buttons-DeW0bQeK.js} +6 -6
- package/dist/{buttons-BedGfygC.js.map → buttons-DeW0bQeK.js.map} +1 -1
- package/dist/{cards-rNX1M4Xn.js → cards-CNXnmvV5.js} +8 -8
- package/dist/{cards-rNX1M4Xn.js.map → cards-CNXnmvV5.js.map} +1 -1
- package/dist/{cascader-B1MiqkBq.js → cascader-CrAl9zD5.js} +15 -15
- package/dist/{cascader-B1MiqkBq.js.map → cascader-CrAl9zD5.js.map} +1 -1
- package/dist/{chart-Darg_0Kv.js → chart-I7ROnsl8.js} +5 -5
- package/dist/{chart-Darg_0Kv.js.map → chart-I7ROnsl8.js.map} +1 -1
- package/dist/{checkbox-fflqmODR.js → checkbox-MoyHIAPs.js} +3 -3
- package/dist/{checkbox-fflqmODR.js.map → checkbox-MoyHIAPs.js.map} +1 -1
- package/dist/{choice-inputs-zUgBZfE4.js → choice-inputs-DHGtx0QV.js} +122 -110
- package/dist/choice-inputs-DHGtx0QV.js.map +1 -0
- package/dist/{code-block-BzmM9Eig.js → code-block-BSJyq9e-.js} +7 -7
- package/dist/{code-block-BzmM9Eig.js.map → code-block-BSJyq9e-.js.map} +1 -1
- package/dist/{collapsible-BkAI_XD4.js → collapsible-BzJ91LUG.js} +3 -3
- package/dist/{collapsible-BkAI_XD4.js.map → collapsible-BzJ91LUG.js.map} +1 -1
- package/dist/{collection-content-gDh1v6O4.js → collection-content-CSnwtOTH.js} +3 -3
- package/dist/{collection-content-gDh1v6O4.js.map → collection-content-CSnwtOTH.js.map} +1 -1
- package/dist/{combobox-BEx0vJgF.js → combobox-Bcvu5J8O.js} +11 -10
- package/dist/{combobox-BEx0vJgF.js.map → combobox-Bcvu5J8O.js.map} +1 -1
- package/dist/combobox-C2JiSQPc.js +915 -0
- package/dist/combobox-C2JiSQPc.js.map +1 -0
- package/dist/{command-CrlPIL6m.js → command-9e52NPgK.js} +6 -6
- package/dist/{command-CrlPIL6m.js.map → command-9e52NPgK.js.map} +1 -1
- package/dist/{comments-Dmpp0YIc.js → comments-BsgErEqd.js} +33 -28
- package/dist/comments-BsgErEqd.js.map +1 -0
- package/dist/components/base/choice-inputs/choice-types.d.ts +4 -0
- package/dist/components/base/choice-inputs/pill-radio-group.d.ts +7 -6
- package/dist/components/base/combobox/combobox-field.d.ts +2 -2
- package/dist/components/base/date-pickers/date-picker-internals.d.ts +3 -1
- package/dist/components/base/date-pickers/datepicker.types.d.ts +10 -4
- package/dist/components/base/date-pickers/time-picker.d.ts +17 -3
- package/dist/components/base/feedback/state-display.d.ts +5 -1
- package/dist/components/base/feedback/state-display.strings.d.ts +9 -0
- package/dist/components/base/forms/form-field.d.ts +7 -2
- package/dist/components/base/forms-numeric/coordinates-input.d.ts +4 -1
- package/dist/components/base/forms-numeric/decimal-input.d.ts +2 -2
- package/dist/components/base/forms-numeric/dimensions-input.d.ts +4 -1
- package/dist/components/base/forms-numeric/numeric-composite-field.d.ts +12 -0
- package/dist/components/base/forms-numeric/weight-input.d.ts +6 -1
- package/dist/components/base/navigation/language-switcher.d.ts +12 -4
- package/dist/components/base/repeaters/key-value-editor.d.ts +2 -1
- package/dist/components/base/sidebar/sidebar.d.ts +2 -0
- package/dist/components/base/upload/avatar-upload.d.ts +2 -1
- package/dist/components/base/upload/image-upload.d.ts +2 -1
- package/dist/components/blocks/ai/ai-citation/types.d.ts +2 -0
- package/dist/components/blocks/ai/ai-reasoning/types.d.ts +2 -0
- package/dist/components/blocks/ai/ai-sources/types.d.ts +2 -0
- package/dist/components/blocks/ai/ai-tool-call/types.d.ts +2 -0
- package/dist/components/blocks/analytics/metric/metric.d.ts +4 -0
- package/dist/components/blocks/analytics/metric-comparison/metric-comparison.d.ts +2 -0
- package/dist/components/blocks/analytics/metric-grid/metric-grid.d.ts +4 -5
- package/dist/components/blocks/analytics/types.d.ts +2 -2
- package/dist/components/blocks/commerce/order-status/types.d.ts +4 -0
- package/dist/components/blocks/data-display/empty-state/empty-state.types.d.ts +4 -3
- package/dist/components/features/activities/activities.types.d.ts +18 -11
- package/dist/components/features/activities/hooks/use-activity-resources.d.ts +2 -1
- package/dist/components/features/ai-chat/hooks/use-ai-chat-scroll.d.ts +1 -1
- package/dist/components/features/appointment-calendar/appointment-calendar.d.ts +1 -1
- package/dist/components/features/appointment-calendar/appointment-calendar.types.d.ts +4 -2
- package/dist/components/features/combobox/async-resource-combobox.d.ts +2 -2
- package/dist/components/features/combobox/combobox.d.ts +2 -2
- package/dist/components/features/combobox/hooks/use-combobox-core.d.ts +2 -1
- package/dist/components/features/combobox/hooks/use-combobox-state.d.ts +1 -0
- package/dist/components/features/combobox/hooks/use-load-more.d.ts +1 -0
- package/dist/components/features/combobox/types.d.ts +37 -8
- package/dist/components/features/email-composer/types.d.ts +3 -1
- package/dist/components/features/filters/facets/date-facet.d.ts +4 -2
- package/dist/components/features/filters/facets/range-facet.d.ts +12 -0
- package/dist/components/features/filters/filters.types.d.ts +3 -3
- package/dist/components/features/filters/partials/date-filter-content.d.ts +3 -2
- package/dist/components/features/filters/partials/filter-popover-content.d.ts +4 -2
- package/dist/components/features/filters/partials/range-filter-content.d.ts +12 -0
- package/dist/components/features/filters/utils/filter-utils.d.ts +5 -1
- package/dist/components/features/media-library/hooks/use-media-library.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 +6 -0
- package/dist/components/features/media-library/media-library.types.d.ts +36 -8
- package/dist/components/features/media-library/partials/media-library-partials.d.ts +3 -3
- package/dist/components/features/mentions/hooks/use-mentions.d.ts +16 -1
- package/dist/components/features/mentions/partials/mention-inline-suggestions.d.ts +5 -1
- package/dist/components/features/mentions/utils/split-html-by-mentions.d.ts +1 -7
- package/dist/components/features/overlays/hooks/use-overlay-visibility.d.ts +2 -2
- package/dist/components/features/products/products.types.d.ts +2 -2
- package/dist/components/features/questionnaire/questionnaire.types.d.ts +3 -0
- package/dist/components/features/resource/resource.d.ts +1 -1
- package/dist/components/features/resource/resource.types.d.ts +2 -0
- package/dist/components/features/rich-text-editor/form-rich-text-editor.d.ts +1 -1
- package/dist/components/features/rich-text-editor/partials/caret-helpers.d.ts +1 -1
- package/dist/components/features/rich-text-editor/partials/editor-field-aria.d.ts +14 -0
- package/dist/components/features/rich-text-editor/partials/rich-text-editor-toolbar.d.ts +3 -1
- 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.types.d.ts +17 -3
- package/dist/components/features/schema-form/hooks/use-schema-form.d.ts +5 -1
- package/dist/components/features/schema-form/partials/schema-form-field.d.ts +3 -1
- package/dist/components/features/schema-form/schema-form.utils.d.ts +1 -1
- package/dist/components/features/suggestions/suggestions.types.d.ts +1 -1
- package/dist/components/features/table/data-table.d.ts +1 -1
- package/dist/components/features/table/index.d.ts +1 -0
- package/dist/components/features/table/table-body.d.ts +1 -1
- package/dist/components/features/table/table-helpers.d.ts +6 -3
- package/dist/components/features/table/table.strings.d.ts +3 -0
- package/dist/components/features/table/table.types.d.ts +17 -1
- package/dist/components/layout/header/header.types.d.ts +3 -2
- package/dist/components/layout/layout.types.d.ts +5 -3
- package/dist/components/layout/navigation/side-nav.d.ts +3 -2
- package/dist/components/layout/normalize-layout-path.d.ts +1 -0
- package/dist/components/layout/settings/settings.d.ts +1 -1
- package/dist/components/layout/sidebar/app-sidebar.d.ts +1 -1
- package/dist/components/layout/sidebar/sidebar-navigation-rail.d.ts +3 -1
- package/dist/components/layout/sidebar/sidebar.context.d.ts +1 -0
- package/dist/components/layout/sidebar/sidebar.types.d.ts +2 -0
- package/dist/components/primitives/link.d.ts +3 -2
- package/dist/components/primitives/money.d.ts +1 -1
- package/dist/components/primitives/number.d.ts +1 -1
- package/dist/components/typography/rich-text/rich-text-tree.d.ts +7 -5
- package/dist/{containers-CIxwbZt5.js → containers-CSdc32h9.js} +2 -2
- package/dist/{containers-CIxwbZt5.js.map → containers-CSdc32h9.js.map} +1 -1
- package/dist/{copyable-DIznBqiT.js → copyable-3fdHfMR3.js} +4 -4
- package/dist/{copyable-DIznBqiT.js.map → copyable-3fdHfMR3.js.map} +1 -1
- package/dist/{data-display-BdgCAw8T.js → data-display-Cmj-xZYl.js} +16 -15
- package/dist/data-display-Cmj-xZYl.js.map +1 -0
- package/dist/{date-Cq8ioE4o.js → date-Br0FicVv.js} +4 -4
- package/dist/{date-Cq8ioE4o.js.map → date-Br0FicVv.js.map} +1 -1
- package/dist/date-picker-CyQlFYsP.js +1617 -0
- package/dist/date-picker-CyQlFYsP.js.map +1 -0
- package/dist/date-pickers-tj2MXmXd.js +185 -0
- package/dist/date-pickers-tj2MXmXd.js.map +1 -0
- package/dist/{display-KsZLw9Ov.js → display-CT_N2a3w.js} +7 -7
- package/dist/{display-KsZLw9Ov.js.map → display-CT_N2a3w.js.map} +1 -1
- package/dist/{dropdown-menu-CLs8Lihj.js → dropdown-menu-C08iIugv.js} +6 -6
- package/dist/{dropdown-menu-CLs8Lihj.js.map → dropdown-menu-C08iIugv.js.map} +1 -1
- package/dist/features/activities.js +283 -270
- package/dist/features/activities.js.map +1 -1
- package/dist/features/ai-chat.js +40 -27
- package/dist/features/ai-chat.js.map +1 -1
- package/dist/features/appointment-calendar.js +126 -126
- package/dist/features/appointment-calendar.js.map +1 -1
- package/dist/features/async-preview.js +9 -9
- package/dist/features/combobox.js +1 -1
- package/dist/features/comments.js +1 -1
- package/dist/features/data-view.js +10 -10
- package/dist/features/email-composer.js +24 -19
- package/dist/features/email-composer.js.map +1 -1
- package/dist/features/event-calendar.js +129 -125
- package/dist/features/event-calendar.js.map +1 -1
- package/dist/features/filters.js +2 -2
- package/dist/features/global-search.js +16 -20
- package/dist/features/global-search.js.map +1 -1
- package/dist/features/kanban.js +18 -28
- package/dist/features/kanban.js.map +1 -1
- package/dist/features/map/style.css +15 -0
- package/dist/features/map.js +331 -314
- package/dist/features/map.js.map +1 -1
- package/dist/features/media-library.js +1044 -866
- package/dist/features/media-library.js.map +1 -1
- package/dist/features/mentions.js +2 -2
- package/dist/features/overlays.js +1 -1
- package/dist/features/products.js +978 -964
- package/dist/features/products.js.map +1 -1
- package/dist/features/questionnaire.js +159 -152
- package/dist/features/questionnaire.js.map +1 -1
- package/dist/features/resource-assignment.js +8 -8
- package/dist/features/resource.js +74 -71
- package/dist/features/resource.js.map +1 -1
- package/dist/features/rich-text-editor.js +28 -19
- package/dist/features/rich-text-editor.js.map +1 -1
- package/dist/features/schema-form.js +297 -256
- package/dist/features/schema-form.js.map +1 -1
- package/dist/features/suggestions.js +57 -50
- package/dist/features/suggestions.js.map +1 -1
- package/dist/features/sync.js +3 -3
- package/dist/features/table.js +1 -1
- package/dist/features/theme-tweaker.js +400 -399
- package/dist/features/theme-tweaker.js.map +1 -1
- package/dist/feedback-Dzo1xtAU.js +246 -0
- package/dist/feedback-Dzo1xtAU.js.map +1 -0
- package/dist/{field-affordance-recipes-DWcNcOjh.js → field-affordance-recipes-D6H7tVJi.js} +2 -2
- package/dist/{field-affordance-recipes-DWcNcOjh.js.map → field-affordance-recipes-D6H7tVJi.js.map} +1 -1
- package/dist/field-control-attributes-B6i335wr.js +18 -0
- package/dist/field-control-attributes-B6i335wr.js.map +1 -0
- package/dist/{field-state-recipes-BVA2CWHo.js → field-state-recipes-7sza8QbC.js} +4 -2
- package/dist/{field-state-recipes-BVA2CWHo.js.map → field-state-recipes-7sza8QbC.js.map} +1 -1
- package/dist/{filters-DzgSJpMK.js → filters-Dl80yYtN.js} +763 -605
- package/dist/filters-Dl80yYtN.js.map +1 -0
- package/dist/form-field-CAPdwdnZ.js +74 -0
- package/dist/form-field-CAPdwdnZ.js.map +1 -0
- package/dist/{form-sizing-Bs2qFUeE.js → form-sizing-CgcrUbLU.js} +2 -2
- package/dist/{form-sizing-Bs2qFUeE.js.map → form-sizing-CgcrUbLU.js.map} +1 -1
- package/dist/{forms-C0RGnJTe.js → forms-B3W8CH7-.js} +8 -8
- package/dist/{forms-C0RGnJTe.js.map → forms-B3W8CH7-.js.map} +1 -1
- package/dist/forms-numeric-CwjQJe-O.js +991 -0
- package/dist/forms-numeric-CwjQJe-O.js.map +1 -0
- package/dist/{header-DMMxG__r.js → header-ZIIsRKxP.js} +113 -113
- package/dist/header-ZIIsRKxP.js.map +1 -0
- package/dist/hooks/use-files.d.ts +2 -0
- package/dist/{hooks-DB6CJ4MR.js → hooks-BitHSh-Y.js} +3 -3
- package/dist/{hooks-DB6CJ4MR.js.map → hooks-BitHSh-Y.js.map} +1 -1
- package/dist/{icon-badge-DZF-YjQp.js → icon-badge-npxF1SLX.js} +2 -2
- package/dist/{icon-badge-DZF-YjQp.js.map → icon-badge-npxF1SLX.js.map} +1 -1
- package/dist/index.js +1 -1
- package/dist/{input-CvyDQlY7.js → input-7KAc7XQL.js} +6 -6
- package/dist/{input-CvyDQlY7.js.map → input-7KAc7XQL.js.map} +1 -1
- package/dist/{input-DMBwAZmr.js → input-DIREVYHs.js} +3 -3
- package/dist/{input-DMBwAZmr.js.map → input-DIREVYHs.js.map} +1 -1
- package/dist/{interaction-recipes-XR9ZpVYL.js → interaction-recipes-4wZ2tvfb.js} +2 -2
- package/dist/{interaction-recipes-XR9ZpVYL.js.map → interaction-recipes-4wZ2tvfb.js.map} +1 -1
- package/dist/{item-DjCcM18E.js → item-FfWnaYST.js} +99 -98
- package/dist/item-FfWnaYST.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 +11 -11
- package/dist/layout.types-E_GAApzO.js +30 -0
- package/dist/layout.types-E_GAApzO.js.map +1 -0
- package/dist/lib/field-control-attributes.d.ts +11 -0
- package/dist/lib/field-state-recipes.d.ts +2 -0
- package/dist/lib/format.d.ts +1 -0
- package/dist/lib/surface-recipes.d.ts +1 -1
- package/dist/lib/token-merge.generated.d.ts +6 -6
- package/dist/lib/utils.js +1 -1
- package/dist/{media-gallery-C-vChPmE.js → media-gallery-C81DAnKI.js} +6 -6
- package/dist/{media-gallery-C-vChPmE.js.map → media-gallery-C81DAnKI.js.map} +1 -1
- package/dist/{mentions-0_4nWuI-.js → mentions-qOnedSt4.js} +236 -167
- package/dist/mentions-qOnedSt4.js.map +1 -0
- package/dist/message-BJHnn43M.js +135 -0
- package/dist/message-BJHnn43M.js.map +1 -0
- package/dist/{metadata-list-C3MkU-Om.js → metadata-list-XkqZ_UXH.js} +11 -11
- package/dist/{metadata-list-C3MkU-Om.js.map → metadata-list-XkqZ_UXH.js.map} +1 -1
- package/dist/{navigation-DaRjthVk.js → navigation-BgtPJAhi.js} +119 -119
- package/dist/navigation-BgtPJAhi.js.map +1 -0
- package/dist/{navigation-C90-oQFq.js → navigation-Bt-v7rWP.js} +52 -46
- package/dist/navigation-Bt-v7rWP.js.map +1 -0
- package/dist/normalize-layout-path-BmEgg6fu.js +14 -0
- package/dist/normalize-layout-path-BmEgg6fu.js.map +1 -0
- package/dist/{number-CRU3kGuk.js → number-CYqBcrSj.js} +78 -86
- package/dist/number-CYqBcrSj.js.map +1 -0
- package/dist/{overflow-tab-bar-IVFVQFV6.js → overflow-tab-bar-BQCA2Zn2.js} +7 -7
- package/dist/{overflow-tab-bar-IVFVQFV6.js.map → overflow-tab-bar-BQCA2Zn2.js.map} +1 -1
- package/dist/{overlays-BSgCtM2v.js → overlays-CC8zI3Du.js} +264 -260
- package/dist/overlays-CC8zI3Du.js.map +1 -0
- package/dist/{page-DUUKDAjo.js → page-BoQ1VaFJ.js} +13 -13
- package/dist/{page-DUUKDAjo.js.map → page-BoQ1VaFJ.js.map} +1 -1
- package/dist/{page-header-commands-7P3sfE9u.js → page-header-commands-DIKspJfx.js} +4 -4
- package/dist/{page-header-commands-7P3sfE9u.js.map → page-header-commands-DIKspJfx.js.map} +1 -1
- package/dist/{pagination-CgCjElfu.js → pagination-Br8TdV9A.js} +4 -4
- package/dist/{pagination-CgCjElfu.js.map → pagination-Br8TdV9A.js.map} +1 -1
- package/dist/{popover-B85RenIl.js → popover-k8TdUcAt.js} +10 -10
- package/dist/popover-k8TdUcAt.js.map +1 -0
- package/dist/{popover-menu-DlnQ2zlR.js → popover-menu-yn-o0kyA.js} +7 -7
- package/dist/{popover-menu-DlnQ2zlR.js.map → popover-menu-yn-o0kyA.js.map} +1 -1
- package/dist/{popover.recipes-DdiEp0rd.js → popover.recipes-DJ0AkUan.js} +2 -2
- package/dist/{popover.recipes-DdiEp0rd.js.map → popover.recipes-DJ0AkUan.js.map} +1 -1
- package/dist/{portal-recipes-BpsV_iRw.js → portal-recipes-DyUXqUtD.js} +2 -2
- package/dist/{portal-recipes-BpsV_iRw.js.map → portal-recipes-DyUXqUtD.js.map} +1 -1
- package/dist/{primitives-ByWgGUgt.js → primitives-BkkQjYl7.js} +22 -17
- package/dist/primitives-BkkQjYl7.js.map +1 -0
- package/dist/primitives.js +4 -4
- package/dist/{progress-BJhQP9WX.js → progress-DZFXXzPs.js} +4 -4
- package/dist/{progress-BJhQP9WX.js.map → progress-DZFXXzPs.js.map} +1 -1
- package/dist/{receipt-tOc7B3hw.js → receipt-C7LhOg7Q.js} +6 -6
- package/dist/{receipt-tOc7B3hw.js.map → receipt-C7LhOg7Q.js.map} +1 -1
- package/dist/rich-text-BnTzZjIo.js +45 -0
- package/dist/rich-text-BnTzZjIo.js.map +1 -0
- package/dist/rich-text-editor-CAurDwT5.js +1273 -0
- package/dist/rich-text-editor-CAurDwT5.js.map +1 -0
- package/dist/{rich-text-editor-toolbar-laT3tpBT.js → rich-text-editor-toolbar-DbXig7Jk.js} +36 -35
- package/dist/rich-text-editor-toolbar-DbXig7Jk.js.map +1 -0
- package/dist/rich-text-tree-BqyQ_7-R.js +66 -0
- package/dist/rich-text-tree-BqyQ_7-R.js.map +1 -0
- package/dist/{sanitize-html-DsQmI48u.js → sanitize-html-BWkH4dLM.js} +29 -16
- package/dist/sanitize-html-BWkH4dLM.js.map +1 -0
- package/dist/{scroll-area-B0dB2cBi.js → scroll-area-Bj6CRUif.js} +2 -2
- package/dist/{scroll-area-B0dB2cBi.js.map → scroll-area-Bj6CRUif.js.map} +1 -1
- package/dist/{separator-Bb17I4pu.js → separator-B9ewiCGO.js} +2 -2
- package/dist/{separator-Bb17I4pu.js.map → separator-B9ewiCGO.js.map} +1 -1
- package/dist/{separator-Ct_WSWTJ.js → separator-DM6gs2vu.js} +3 -3
- package/dist/{separator-Ct_WSWTJ.js.map → separator-DM6gs2vu.js.map} +1 -1
- package/dist/services/actions.js +1 -1
- package/dist/settings-DZPHgpx4.js +155 -0
- package/dist/settings-DZPHgpx4.js.map +1 -0
- package/dist/{sheet-BGPERY55.js → sheet-C4DHsgLk.js} +6 -6
- package/dist/{sheet-BGPERY55.js.map → sheet-C4DHsgLk.js.map} +1 -1
- package/dist/sidebar-C8BnDwTH.js +709 -0
- package/dist/sidebar-C8BnDwTH.js.map +1 -0
- package/dist/{sidebar-f9gRWXIR.js → sidebar-CmD6a-HK.js} +16 -13
- package/dist/sidebar-CmD6a-HK.js.map +1 -0
- package/dist/{skeleton-BapcJd9C.js → skeleton-DDgdhmu9.js} +5 -5
- package/dist/{skeleton-BapcJd9C.js.map → skeleton-DDgdhmu9.js.map} +1 -1
- package/dist/{smart-card-CW0hjetE.js → smart-card-B6vLxqa_.js} +8 -8
- package/dist/{smart-card-CW0hjetE.js.map → smart-card-B6vLxqa_.js.map} +1 -1
- package/dist/{structure-DuxKl954.js → structure-DZJ2wbAU.js} +2 -2
- package/dist/{structure-DuxKl954.js.map → structure-DZJ2wbAU.js.map} +1 -1
- package/dist/style.css +1 -1
- package/dist/{surface-recipes-BKRVW8Os.js → surface-recipes-C8mNycaY.js} +2 -2
- package/dist/{surface-recipes-BKRVW8Os.js.map → surface-recipes-C8mNycaY.js.map} +1 -1
- package/dist/{table-CFOWY9pQ.js → table-CBonSdTp.js} +534 -486
- package/dist/table-CBonSdTp.js.map +1 -0
- package/dist/{table-B4TE7iOV.js → table-CXSPHH25.js} +75 -71
- package/dist/table-CXSPHH25.js.map +1 -0
- package/dist/{tabs-e7ko9S2o.js → tabs-C4Kr_hCr.js} +50 -49
- package/dist/tabs-C4Kr_hCr.js.map +1 -0
- package/dist/{text-inputs-B1culiSK.js → text-inputs-jdkS3ReG.js} +9 -9
- package/dist/{text-inputs-B1culiSK.js.map → text-inputs-jdkS3ReG.js.map} +1 -1
- package/dist/{timelines-D3Sl9ueq.js → timelines-CoPwdJP0.js} +10 -10
- package/dist/{timelines-D3Sl9ueq.js.map → timelines-CoPwdJP0.js.map} +1 -1
- package/dist/{tooltip-8wz5S_Zr.js → tooltip-31NwIpTo.js} +4 -4
- package/dist/{tooltip-8wz5S_Zr.js.map → tooltip-31NwIpTo.js.map} +1 -1
- package/dist/{tree-CzUJHnFs.js → tree-CeYVzdFE.js} +6 -6
- package/dist/{tree-CzUJHnFs.js.map → tree-CeYVzdFE.js.map} +1 -1
- package/dist/typography/rich-text.js +1 -1
- package/dist/{typography-BQnine1k.js → typography-C7-YMW1S.js} +2 -2
- package/dist/{typography-BQnine1k.js.map → typography-C7-YMW1S.js.map} +1 -1
- package/dist/typography.js +1 -1
- package/dist/{upload-BOW6U2tI.js → upload-Hdm5gObf.js} +303 -291
- package/dist/upload-Hdm5gObf.js.map +1 -0
- package/dist/{upload-queue-qUXn1ykN.js → upload-queue-D0sYPuqo.js} +8 -8
- package/dist/{upload-queue-qUXn1ykN.js.map → upload-queue-D0sYPuqo.js.map} +1 -1
- package/dist/{usage-card-BeSLY0i0.js → usage-card-9s8hLDfn.js} +9 -9
- package/dist/{usage-card-BeSLY0i0.js.map → usage-card-9s8hLDfn.js.map} +1 -1
- package/dist/{utils-B6kKb8jB.js → utils-DhuoqFy4.js} +31 -37
- package/dist/utils-DhuoqFy4.js.map +1 -0
- package/dist/{value-inputs-skdVB2zh.js → value-inputs-D3aPgq9H.js} +15 -15
- package/dist/{value-inputs-skdVB2zh.js.map → value-inputs-D3aPgq9H.js.map} +1 -1
- package/dist/{value-typography-uAmWUAL1.js → value-typography-uSzzG9Gf.js} +32 -26
- package/dist/value-typography-uSzzG9Gf.js.map +1 -0
- package/dist/{workspace-DHeHv0qw.js → workspace-CC8Vchiu.js} +12 -12
- package/dist/{workspace-DHeHv0qw.js.map → workspace-CC8Vchiu.js.map} +1 -1
- package/docs/consumer-skill/examples/edit.tsx +3 -3
- package/docs/consumer-skill/references/agents-md.md +19 -19
- package/docs/consumer-skill/references/analytics.md +15 -0
- package/docs/consumer-skill/references/component-contracts.json +14724 -13057
- package/docs/consumer-skill/references/composition.md +21 -4
- package/docs/consumer-skill/references/design-contract.md +1 -0
- package/docs/consumer-skill/references/installation.md +51 -8
- package/docs/consumer-skill/references/integration.md +24 -1
- package/docs/consumer-skill/references/public-api.json +172 -34
- package/docs/consumer-skill/references/review.md +51 -11
- package/docs/consumer-skill/references/rhf-workflows.md +72 -0
- package/docs/consumer-skill/references/theming.md +7 -2
- package/docs/consumer-skill/references/tokens.json +1 -1
- package/docs/consumer-skill/scripts/composition-policy.mjs +144 -30
- package/docs/consumer-skill/scripts/setup-skills.mjs +46 -9
- package/package.json +4 -2
- package/templates/admin-shell-template.tsx +1 -2
- package/templates/customers-template.tsx +18 -16
- package/dist/accordion-B9MHG0cT.js.map +0 -1
- package/dist/ai-artifact-C58tQcBy.js.map +0 -1
- package/dist/auth-DTkkshS8.js.map +0 -1
- package/dist/breadcrumbs-J-K2kl4c.js.map +0 -1
- package/dist/choice-inputs-zUgBZfE4.js.map +0 -1
- package/dist/combobox-BwzoXFSG.js +0 -884
- package/dist/combobox-BwzoXFSG.js.map +0 -1
- package/dist/comments-Dmpp0YIc.js.map +0 -1
- package/dist/data-display-BdgCAw8T.js.map +0 -1
- package/dist/date-picker-RlIzKom_.js +0 -1551
- package/dist/date-picker-RlIzKom_.js.map +0 -1
- package/dist/date-pickers-DY-CpXS1.js +0 -179
- package/dist/date-pickers-DY-CpXS1.js.map +0 -1
- package/dist/feedback-Dm4izqFn.js +0 -240
- package/dist/feedback-Dm4izqFn.js.map +0 -1
- package/dist/filters-DzgSJpMK.js.map +0 -1
- package/dist/form-field-BriWAXyg.js +0 -63
- package/dist/form-field-BriWAXyg.js.map +0 -1
- package/dist/forms-numeric-DIhghX1Q.js +0 -910
- package/dist/forms-numeric-DIhghX1Q.js.map +0 -1
- package/dist/header-DMMxG__r.js.map +0 -1
- package/dist/item-DjCcM18E.js.map +0 -1
- package/dist/layout.types-Cn7aUzJp.js +0 -20
- package/dist/layout.types-Cn7aUzJp.js.map +0 -1
- package/dist/mentions-0_4nWuI-.js.map +0 -1
- package/dist/message-g8p7eVtN.js +0 -128
- package/dist/message-g8p7eVtN.js.map +0 -1
- package/dist/navigation-C90-oQFq.js.map +0 -1
- package/dist/navigation-DaRjthVk.js.map +0 -1
- package/dist/number-CRU3kGuk.js.map +0 -1
- package/dist/overlays-BSgCtM2v.js.map +0 -1
- package/dist/popover-B85RenIl.js.map +0 -1
- package/dist/primitives-ByWgGUgt.js.map +0 -1
- package/dist/rich-text-Dth5E882.js +0 -78
- package/dist/rich-text-Dth5E882.js.map +0 -1
- package/dist/rich-text-editor-C1fOjBTd.js +0 -1195
- package/dist/rich-text-editor-C1fOjBTd.js.map +0 -1
- package/dist/rich-text-editor-toolbar-laT3tpBT.js.map +0 -1
- package/dist/safe-image-src-C6kQSMBZ.js +0 -17
- package/dist/safe-image-src-C6kQSMBZ.js.map +0 -1
- package/dist/sanitize-html-DsQmI48u.js.map +0 -1
- package/dist/settings-Bar5wiSo.js +0 -167
- package/dist/settings-Bar5wiSo.js.map +0 -1
- package/dist/sidebar-D-JYMMbY.js +0 -686
- package/dist/sidebar-D-JYMMbY.js.map +0 -1
- package/dist/sidebar-f9gRWXIR.js.map +0 -1
- package/dist/table-B4TE7iOV.js.map +0 -1
- package/dist/table-CFOWY9pQ.js.map +0 -1
- package/dist/tabs-e7ko9S2o.js.map +0 -1
- package/dist/upload-BOW6U2tI.js.map +0 -1
- package/dist/utils-B6kKb8jB.js.map +0 -1
- package/dist/value-typography-uAmWUAL1.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"questionnaire.js","names":["_Fragment","resolveComponentScale","useDensityConfig","cn","Button","Text","Stack","Progress","formLabelSizeClasses","Input","FormField","Textarea","Select","CardRadioGroup","choiceControlTrackClasses","Checkbox","Fragment$1","QuestionnaireControl","context","checkTrack","defaultScale","common","error","labelId","descriptionId","question","answer","onAnswerChange","event","values","optionId","index","disabled","option","checked","entry","Label","defaultQuestionnaireStrings","current","total","getVisibleQuestions","questions","answers","getQuestionnaireAnswer","id","validateQuestion","value","empty","strings","selected","url","result","getSubmissionAnswers","emptyAnswers","Questionnaire","forwardRef","controlledValue","stringsProp","formProps","props","controlled","stepControlled","internalValue","setInternalValue","useState","defaultValue","answersRef","useRef","visible","internalId","setInternalId","defaultQuestionId","requestedId","questionId","position","errors","setErrors","submitError","setSubmitError","busy","setBusy","completed","setCompleted","submission","resetTimer","mounted","stageRef","useStrings","useId","locked","cancelReset","cancel","goTo","nextId","onQuestionChange","setAnswer","next","onValueChange","previous","useEffect","advance","submit","validation","firstInvalid","controller","snapshot","onSubmit","onComplete","formatSubmitError","onError","currentError","description","className","nativeEvent","initialVisible","initialQuestion","headerSlot","completionSlot","Heading","emptySlot"],"sources":["../../src/components/features/questionnaire/questionnaire-control.tsx","../../src/components/features/questionnaire/questionnaire.types.ts","../../src/components/features/questionnaire/questionnaire.utils.ts","../../src/components/features/questionnaire/questionnaire.tsx"],"sourcesContent":["import { CardRadioGroup, Checkbox, Select } from '../../base/choice-inputs';\nimport { choiceControlTrackClasses } from '../../base/choice-inputs/choice-types';\nimport { formLabelSizeClasses } from '../../base/forms/form-sizing';\nimport { Input, Textarea } from '../../base/text-inputs';\nimport { Stack } from '../../base/structure';\nimport { Label, Text } from '../../typography';\nimport { useDensityConfig } from '../../../lib/ui-provider';\nimport { resolveComponentScale } from '../../../lib/ui-provider/scale';\nimport { cn } from '../../../lib/utils';\nimport type { QuestionnaireQuestionContext } from './questionnaire.types';\n\n/** All interactive behavior remains with public Base UI-backed field owners. */\nexport function QuestionnaireControl({ question, answer, disabled, error, labelId, descriptionId, onAnswerChange, ...context }: QuestionnaireQuestionContext) {\n\tconst { defaultScale } = useDensityConfig();\n\t// Each checkbox sits in a track one Label line tall, so it centres on the\n\t// option's first line whether or not the label wraps.\n\tconst checkTrack = cn('questionnaire--check', choiceControlTrackClasses, formLabelSizeClasses[resolveComponentScale(undefined, defaultScale)]);\n\tconst common = { disabled, invalid: Boolean(error), 'aria-labelledby': labelId, 'aria-describedby': descriptionId, required: question.required };\n\tif (question.type === 'custom') return question.render({ ...context, question, answer, disabled, error, labelId, descriptionId, onAnswerChange });\n\tif (question.type === 'text') return <Input {...common} type={question.inputType ?? 'text'} maxLength={question.maxLength} placeholder={question.placeholder} value={typeof answer === 'string' ? answer : ''} onChange={(event) => onAnswerChange(event.target.value)} />;\n\tif (question.type === 'textarea') return <Textarea {...common} rows={question.rows ?? 4} maxLength={question.maxLength} placeholder={question.placeholder} value={typeof answer === 'string' ? answer : ''} onChange={(event) => onAnswerChange(event.target.value)} />;\n\tif (question.type === 'select') return <Select {...common} options={question.options} value={typeof answer === 'string' ? answer : null} onValueChange={onAnswerChange} />;\n\tif (question.type === 'single') return <fieldset aria-labelledby={labelId} aria-describedby={descriptionId} className=\"questionnaire--choices m-0 min-w-0 border-0 p-0\"><CardRadioGroup options={question.options} value={typeof answer === 'string' ? answer : ''} disabled={disabled} invalid={Boolean(error)} onValueChange={onAnswerChange} columns={1} /></fieldset>;\n\tif (question.type === 'multiple') return <fieldset aria-labelledby={labelId} aria-describedby={descriptionId} className=\"questionnaire--choices m-0 min-w-0 border-0 p-0\"><Stack gap=\"sm\">{question.options.map((option, index) => {\n\t\tconst values = Array.isArray(answer) ? answer : [];\n\t\tconst optionId = `${labelId}-option-${index}`;\n\t\treturn <Stack key={option.value} direction=\"horizontal\" align=\"start\" gap=\"sm\">\n\t\t\t<span className={checkTrack}><Checkbox id={optionId} disabled={disabled || option.disabled} aria-invalid={Boolean(error) || undefined} aria-describedby={[descriptionId, option.description ? `${optionId}-description` : undefined].filter(Boolean).join(' ') || undefined} checked={values.includes(option.value)} onCheckedChange={(checked) => onAnswerChange(checked ? [...values, option.value] : values.filter((entry) => entry !== option.value))} /></span>\n\t\t\t<Stack gap=\"dense\"><Label htmlFor={optionId} className=\"text-inherit\">{option.label}</Label>{option.description && <Text id={`${optionId}-description`} size=\"xs\" type=\"secondary\">{option.description}</Text>}</Stack>\n\t\t</Stack>;\n\t})}</Stack></fieldset>;\n\tif (question.type === 'boolean') return <Stack direction=\"horizontal\" align=\"start\" gap=\"sm\"><span className={checkTrack}><Checkbox {...common} aria-labelledby={undefined} id={`${labelId}-checkbox`} checked={answer === true} onCheckedChange={(checked) => onAnswerChange(checked)} /></span><Label htmlFor={`${labelId}-checkbox`} className=\"text-inherit\">{question.label ?? question.title}</Label></Stack>;\n\treturn null;\n}\n","import type { ComponentPropsWithoutRef, ReactNode } from 'react';\nimport type { StringsProp } from '../../../lib/strings';\n\nexport type QuestionnaireAnswer = string | string[] | boolean | undefined;\nexport type QuestionnaireAnswers = Record<string, QuestionnaireAnswer>;\nexport interface QuestionnaireOption { value: string; label: string; description?: string; disabled?: boolean }\nexport interface QuestionnaireQuestionBase {\n\t/** Unique stable key, used to retain answers across conditional visibility changes. */\n\tid: string;\n\ttitle: string;\n\tdescription?: string;\n\trequired?: boolean;\n\tdisabled?: boolean;\n\t/** Hidden answers are retained for editing, but excluded from validation/submission. */\n\twhen?: (answers: QuestionnaireAnswers) => boolean;\n\t/** Return an error message, or undefined/true for a valid answer. */\n\tvalidate?: (answer: QuestionnaireAnswer, answers: QuestionnaireAnswers) => string | true | undefined;\n}\nexport interface QuestionnaireTextQuestion extends QuestionnaireQuestionBase {\n\ttype: 'text' | 'textarea';\n\tplaceholder?: string;\n\t/** Native text input type. */\n\tinputType?: 'text' | 'email' | 'url' | 'tel';\n\trows?: number;\n\tmaxLength?: number;\n}\nexport interface QuestionnaireChoiceQuestion extends QuestionnaireQuestionBase {\n\ttype: 'single' | 'multiple' | 'select';\n\toptions: QuestionnaireOption[];\n}\nexport interface QuestionnaireBooleanQuestion extends QuestionnaireQuestionBase { type: 'boolean'; label?: string }\nexport interface QuestionnaireCustomQuestion extends QuestionnaireQuestionBase {\n\ttype: 'custom';\n\trender: (context: QuestionnaireQuestionContext) => ReactNode;\n}\nexport type QuestionnaireQuestion = QuestionnaireTextQuestion | QuestionnaireChoiceQuestion | QuestionnaireBooleanQuestion | QuestionnaireCustomQuestion;\nexport interface QuestionnaireQuestionContext {\n\tquestion: QuestionnaireQuestion;\n\tanswer: QuestionnaireAnswer;\n\tanswers: QuestionnaireAnswers;\n\tdisabled: boolean;\n\terror?: string;\n\t/** Connect custom controls to the visible title and description/error. */\n\tlabelId: string;\n\tdescriptionId?: string;\n\tonAnswerChange: (answer: QuestionnaireAnswer) => void;\n}\nexport interface QuestionnaireSubmitContext { signal: AbortSignal }\nexport interface QuestionnaireStrings {\n\tprevious: string; next: string; submit: string; retry: string; cancel: string;\n\tsubmitting: string; submitted: string; editAnswers: string; empty: string;\n\trequired: string; invalidChoice: string; invalidFormat: string; progress: string;\n\tstep: (current: number, total: number) => string;\n\tsubmitError: string;\n}\nexport const defaultQuestionnaireStrings: QuestionnaireStrings = {\n\tprevious: 'Previous', next: 'Next', submit: 'Submit answers', retry: 'Try again', cancel: 'Cancel submission',\n\tsubmitting: 'Submitting answers…', submitted: 'Your answers have been submitted.', editAnswers: 'Edit answers',\n\tempty: 'There are no questions to answer.', required: 'Please answer this question.', invalidChoice: 'Choose an available option.',\n\tinvalidFormat: 'Enter a valid answer.', progress: 'Questionnaire progress', step: (current, total) => `Question ${current} of ${total}`,\n\tsubmitError: 'Answers could not be submitted. Please try again.',\n};\nexport interface QuestionnaireProps extends Omit<ComponentPropsWithoutRef<'form'>, 'children' | 'onSubmit' | 'defaultValue' | 'onChange'> {\n\tquestions: readonly QuestionnaireQuestion[];\n\t/** Controlled answers. */\n\tvalue?: QuestionnaireAnswers;\n\t/** Initial answers for uncontrolled use. */\n\tdefaultValue?: QuestionnaireAnswers;\n\tonValueChange?: (answers: QuestionnaireAnswers) => void;\n\t/** Controlled active question key. */\n\tquestionId?: string;\n\tdefaultQuestionId?: string;\n\tonQuestionChange?: (id: string) => void;\n\tdisabled?: boolean;\n\t/** Receives only visible, enabled questions. Respect signal to cancel application requests. */\n\tonSubmit?: (answers: QuestionnaireAnswers, context: QuestionnaireSubmitContext) => void | Promise<void>;\n\tonComplete?: (answers: QuestionnaireAnswers) => void;\n\tonError?: (error: unknown) => void;\n\tformatSubmitError?: (error: unknown) => string;\n\theaderSlot?: ReactNode;\n\temptySlot?: ReactNode;\n\t/** Replaces the completion state; default includes an edit-answers action. */\n\tcompletionSlot?: ReactNode;\n\tstrings?: StringsProp<QuestionnaireStrings>;\n}\n","import type { QuestionnaireAnswers, QuestionnaireQuestion, QuestionnaireStrings } from './questionnaire.types';\n\nexport function getVisibleQuestions(questions: readonly QuestionnaireQuestion[], answers: QuestionnaireAnswers) {\n\treturn questions.filter((question) => !question.when || question.when(answers));\n}\nexport function getQuestionnaireAnswer(answers: QuestionnaireAnswers, id: string) {\n\treturn Object.hasOwn(answers, id) ? answers[id] : undefined;\n}\nexport function validateQuestion(question: QuestionnaireQuestion, answers: QuestionnaireAnswers, strings: QuestionnaireStrings): string | undefined {\n\tif (question.disabled) return;\n\tconst value = getQuestionnaireAnswer(answers, question.id);\n\tconst empty = value === undefined || (typeof value === 'string' && !value.trim()) || (Array.isArray(value) && value.length === 0);\n\tif (question.required && (empty || (question.type === 'boolean' && value !== true))) return strings.required;\n\tif (value !== undefined) {\n\t\tif ((question.type === 'text' || question.type === 'textarea') && typeof value !== 'string') return strings.invalidFormat;\n\t\tif (question.type === 'boolean' && typeof value !== 'boolean') return strings.invalidFormat;\n\t\tif ((question.type === 'multiple' && !Array.isArray(value)) || ((question.type === 'single' || question.type === 'select') && typeof value !== 'string')) return strings.invalidChoice;\n\t}\n\tif (!empty) {\n\t\tif (question.type === 'single' || question.type === 'select' || question.type === 'multiple') {\n\t\t\tconst selected = Array.isArray(value) ? value : [value];\n\t\t\tif ((question.type === 'multiple' ? !Array.isArray(value) : typeof value !== 'string') || selected.some((entry) => !question.options.some((option) => option.value === entry && !option.disabled))) return strings.invalidChoice;\n\t\t} else if (question.type === 'text' || question.type === 'textarea') {\n\t\t\tif (typeof value !== 'string' || (question.maxLength !== undefined && value.length > question.maxLength)) return strings.invalidFormat;\n\t\t\tif (question.inputType === 'email' && !/^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/.test(value)) return strings.invalidFormat;\n\t\t\tif (question.inputType === 'url') { try { const url = new URL(value); if (!url.host || !['http:', 'https:'].includes(url.protocol)) return strings.invalidFormat; } catch { return strings.invalidFormat; } }\n\t\t} else if (question.type === 'boolean' && typeof value !== 'boolean') return strings.invalidFormat;\n\t}\n\tconst result = question.validate?.(value, answers);\n\treturn typeof result === 'string' && result.length > 0 ? result : undefined;\n}\n\nexport function getSubmissionAnswers(questions: readonly QuestionnaireQuestion[], answers: QuestionnaireAnswers): QuestionnaireAnswers {\n\treturn Object.fromEntries(getVisibleQuestions(questions, answers).filter((question) => !question.disabled).map((question) => {\n\t\tconst answer = getQuestionnaireAnswer(answers, question.id);\n\t\treturn [question.id, Array.isArray(answer) ? [...answer] : answer];\n\t}));\n}\n","import { forwardRef, useEffect, useId, useRef, useState } from 'react';\nimport { Button } from '../../base/buttons';\nimport { FormField } from '../../base/forms/form-field';\nimport { Progress } from '../../base/feedback';\nimport { Stack } from '../../base/structure';\nimport { Heading, Text } from '../../typography';\nimport { useStrings } from '../../../lib/strings';\nimport { cn } from '../../../lib/utils';\nimport { QuestionnaireControl } from './questionnaire-control';\nimport { defaultQuestionnaireStrings, type QuestionnaireAnswer, type QuestionnaireAnswers, type QuestionnaireProps } from './questionnaire.types';\nimport { getQuestionnaireAnswer, getSubmissionAnswers, getVisibleQuestions, validateQuestion } from './questionnaire.utils';\n\nconst emptyAnswers: QuestionnaireAnswers = {};\n\nexport const Questionnaire = forwardRef<HTMLFormElement, QuestionnaireProps>(function Questionnaire(props, ref) {\n\tconst { questions, value: controlledValue, defaultValue = {}, onValueChange, questionId, defaultQuestionId, onQuestionChange,\n\t\tdisabled = false, onSubmit, onComplete, onError, formatSubmitError, headerSlot, emptySlot, completionSlot, strings: stringsProp,\n\t\tclassName, onReset, ...formProps } = props;\n\tconst controlled = Object.prototype.hasOwnProperty.call(props, 'value');\n\tconst stepControlled = Object.prototype.hasOwnProperty.call(props, 'questionId');\n\tconst [internalValue, setInternalValue] = useState<QuestionnaireAnswers>(defaultValue);\n\tconst answers = controlled ? controlledValue ?? emptyAnswers : internalValue;\n\tconst answersRef = useRef(answers); answersRef.current = answers;\n\tconst visible = getVisibleQuestions(questions, answers);\n\tconst [internalId, setInternalId] = useState<string | undefined>(defaultQuestionId ?? visible[0]?.id);\n\tconst requestedId = stepControlled ? questionId : internalId;\n\tconst current = visible.find((question) => question.id === requestedId) ?? visible[0];\n\tconst position = current ? visible.indexOf(current) : 0;\n\tconst [errors, setErrors] = useState<Record<string, string | undefined>>({});\n\tconst [submitError, setSubmitError] = useState<string>();\n\tconst [busy, setBusy] = useState(false);\n\tconst [completed, setCompleted] = useState(false);\n\tconst submission = useRef<AbortController | null>(null);\n\tconst resetTimer = useRef<ReturnType<typeof setTimeout> | undefined>(undefined);\n\tconst mounted = useRef(true);\n\tconst stageRef = useRef<HTMLDivElement>(null);\n\tconst strings = useStrings(defaultQuestionnaireStrings, stringsProp);\n\tconst id = useId();\n\tconst labelId = `${id}-title`;\n\tconst descriptionId = `${id}-description`;\n\tconst locked = busy || disabled;\n\tconst cancelReset = () => { clearTimeout(resetTimer.current); resetTimer.current = undefined; };\n\tconst cancel = () => { submission.current?.abort(); submission.current = null; setBusy(false); };\n\tconst goTo = (nextId: string) => { if (!stepControlled) setInternalId(nextId); onQuestionChange?.(nextId); };\n\tconst setAnswer = (answer: QuestionnaireAnswer) => {\n\t\tif (!current || current.disabled || locked) return;\n\t\tconst next = { ...answersRef.current, [current.id]: answer };\n\t\tif (!controlled) { answersRef.current = next; setInternalValue(next); }\n\t\tonValueChange?.(next);\n\t\tsetErrors((previous) => ({ ...previous, [current.id]: undefined })); setSubmitError(undefined); setCompleted(false);\n\t};\n\tuseEffect(() => { stageRef.current?.focus(); }, [current?.id, completed]);\n\tuseEffect(() => {\n\t\t// Replacing data/schema or disabling during a request invalidates that result.\n\t\tcancelReset(); cancel(); setErrors({}); setSubmitError(undefined); setCompleted(false);\n\t}, [answers, questions, disabled]);\n\tuseEffect(() => { mounted.current = true; return () => { mounted.current = false; cancelReset(); submission.current?.abort(); submission.current = null; }; }, []);\n\tconst advance = () => {\n\t\tif (!current || locked) return;\n\t\tconst error = validateQuestion(current, answersRef.current, strings);\n\t\tsetErrors((previous) => ({ ...previous, [current.id]: error }));\n\t\tif (error) { stageRef.current?.focus(); return; }\n\t\tif (visible[position + 1]) goTo(visible[position + 1].id);\n\t};\n\tconst submit = async () => {\n\t\tif (submission.current || disabled || !visible.length) return;\n\t\tconst validation = Object.fromEntries(visible.map((question) => [question.id, validateQuestion(question, answersRef.current, strings)]));\n\t\tsetErrors(validation);\n\t\tconst firstInvalid = visible.find((question) => validation[question.id]);\n\t\tif (firstInvalid) { goTo(firstInvalid.id); stageRef.current?.focus(); return; }\n\t\tconst controller = new AbortController(); submission.current = controller;\n\t\tsetSubmitError(undefined); setBusy(true);\n\t\tconst snapshot = getSubmissionAnswers(questions, answersRef.current);\n\t\ttry {\n\t\t\tawait onSubmit?.(snapshot, { signal: controller.signal });\n\t\t\tif (submission.current !== controller || controller.signal.aborted) return;\n\t\t\tsetCompleted(true); onComplete?.(snapshot);\n\t\t} catch (error) {\n\t\t\tif (submission.current !== controller || controller.signal.aborted) return;\n\t\t\tsetSubmitError(formatSubmitError?.(error) ?? strings.submitError); onError?.(error);\n\t\t} finally { if (submission.current === controller) { submission.current = null; setBusy(false); } }\n\t};\n\tconst currentError = current && Object.hasOwn(errors, current.id) ? errors[current.id] : undefined;\n\tconst description = current && (currentError || current.description);\n\treturn <form {...formProps} ref={ref} noValidate aria-busy={busy || undefined} className={cn('questionnaire--component min-w-0', className)} onSubmit={(event) => { event.preventDefault(); if (position < visible.length - 1) advance(); else void submit(); }} onReset={(event) => {\n\t\tonReset?.(event); const nativeEvent = event.nativeEvent;\n\t\t// Trusted events can run microtasks before native ancestor listeners have cancelled reset.\n\t\tcancelReset(); resetTimer.current = setTimeout(() => {\n\t\t\tresetTimer.current = undefined;\n\t\t\tif (!mounted.current || nativeEvent.defaultPrevented || disabled) return; cancel();\n\t\t\tif (!controlled) { answersRef.current = defaultValue; setInternalValue(defaultValue); } onValueChange?.(defaultValue);\n\t\t\tsetErrors({}); setSubmitError(undefined); setCompleted(false);\n\t\t\tconst initialVisible = getVisibleQuestions(questions, defaultValue);\n\t\t\tconst initialQuestion = initialVisible.find((question) => question.id === defaultQuestionId) ?? initialVisible[0];\n\t\t\tif (initialQuestion) goTo(initialQuestion.id); else if (!stepControlled) setInternalId(undefined);\n\t\t}, 0);\n\t}}>\n\t\t<Stack gap=\"lg\">\n\t\t\t{headerSlot}\n\t\t\t{!current ? emptySlot ?? <Text type=\"secondary\">{strings.empty}</Text> : completed ? completionSlot ?? <Stack gap=\"sm\"><Text type=\"inherit\" role=\"status\">{strings.submitted}</Text><Button disabled={disabled} type=\"button\" buttonStyle=\"outline\" onClick={() => { setCompleted(false); if (visible[0]) goTo(visible[0].id); }}>{strings.editAnswers}</Button></Stack> : <>\n\t\t\t\t<Progress value={position + 1} max={visible.length} label={strings.progress} valueSlot={<Text size=\"xs\" type=\"secondary\" aria-live=\"polite\">{strings.step(position + 1, visible.length)}</Text>} />\n\t\t\t\t<Stack ref={stageRef} gap=\"normal\" tabIndex={-1} role=\"group\" aria-labelledby={labelId} className=\"questionnaire--question outline-none\">\n\t\t\t\t\t<Heading className=\"text-inherit\" id={labelId} tag=\"h3\">{current.title}</Heading>\n\t\t\t\t\t<FormField required={current.required} error={currentError} hint={current.description} supportingTextId={descriptionId}>\n\t\t\t\t\t\t<QuestionnaireControl key={current.id} question={current} answer={getQuestionnaireAnswer(answers, current.id)} answers={answers} disabled={locked || Boolean(current.disabled)} error={currentError} labelId={labelId} descriptionId={description ? descriptionId : undefined} onAnswerChange={setAnswer} />\n\t\t\t\t\t</FormField>\n\t\t\t\t</Stack>\n\t\t\t\t{submitError && <Text role=\"alert\" type=\"error\">{submitError}</Text>}\n\t\t\t\t{busy && <Text role=\"status\" type=\"secondary\">{strings.submitting}</Text>}\n\t\t\t\t<Stack direction=\"horizontal\" gap=\"sm\" wrap>\n\t\t\t\t\t<Button type=\"button\" buttonStyle=\"outline\" disabled={locked || position === 0} onClick={() => { setSubmitError(undefined); goTo(visible[position - 1].id); }}>{strings.previous}</Button>\n\t\t\t\t\t{position < visible.length - 1 ? <Button tone=\"primary\" type=\"button\" disabled={locked} onClick={advance}>{strings.next}</Button> : <Button tone=\"primary\" type=\"submit\" disabled={locked}>{submitError ? strings.retry : strings.submit}</Button>}\n\t\t\t\t\t{busy && <Button type=\"button\" buttonStyle=\"outline\" disabled={disabled} onClick={cancel}>{strings.cancel}</Button>}\n\t\t\t\t</Stack>\n\t\t\t</>}\n\t\t</Stack>\n\t</form>;\n});\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"questionnaire.js","names":["_Fragment","resolveComponentScale","useDensityConfig","cn","Button","Text","Stack","Progress","formLabelSizeClasses","Input","FormField","Textarea","Select","CardRadioGroup","choiceControlTrackClasses","Checkbox","Fragment$1","QuestionnaireControl","context","checkTrack","defaultScale","common","error","labelId","descriptionId","question","answer","onAnswerChange","event","values","optionId","index","disabled","option","checked","entry","Label","defaultQuestionnaireStrings","current","total","getVisibleQuestions","questions","answers","getQuestionnaireAnswer","id","validateQuestion","value","empty","strings","selected","url","result","getSubmissionAnswers","emptyAnswers","Questionnaire","forwardRef","controlledValue","stringsProp","formProps","props","controlled","stepControlled","internalValue","setInternalValue","useState","defaultValue","answersRef","useRef","visible","internalId","setInternalId","defaultQuestionId","requestedId","questionId","position","errors","setErrors","submitError","setSubmitError","busy","setBusy","completed","setCompleted","currentQuestionId","previousStage","submission","resetTimer","mounted","stageRef","useStrings","useId","locked","cancelReset","cancel","goTo","nextId","onQuestionIdChange","onQuestionChange","setAnswer","next","onValueChange","previous","useEffect","advance","submit","validation","firstInvalid","controller","snapshot","onSubmit","onComplete","formatSubmitError","onError","currentError","description","className","nativeEvent","initialVisible","initialQuestion","headerSlot","completionSlot","Heading","emptySlot"],"sources":["../../src/components/features/questionnaire/questionnaire-control.tsx","../../src/components/features/questionnaire/questionnaire.types.ts","../../src/components/features/questionnaire/questionnaire.utils.ts","../../src/components/features/questionnaire/questionnaire.tsx"],"sourcesContent":["import { CardRadioGroup, Checkbox, Select } from '../../base/choice-inputs';\nimport { choiceControlTrackClasses } from '../../base/choice-inputs/choice-types';\nimport { formLabelSizeClasses } from '../../base/forms/form-sizing';\nimport { Input, Textarea } from '../../base/text-inputs';\nimport { Stack } from '../../base/structure';\nimport { Label, Text } from '../../typography';\nimport { useDensityConfig } from '../../../lib/ui-provider';\nimport { resolveComponentScale } from '../../../lib/ui-provider/scale';\nimport { cn } from '../../../lib/utils';\nimport type { QuestionnaireQuestionContext } from './questionnaire.types';\n\n/** All interactive behavior remains with public Base UI-backed field owners. */\nexport function QuestionnaireControl({ question, answer, disabled, error, labelId, descriptionId, onAnswerChange, ...context }: QuestionnaireQuestionContext) {\n\tconst { defaultScale } = useDensityConfig();\n\t// Each checkbox sits in a track one Label line tall, so it centres on the\n\t// option's first line whether or not the label wraps.\n\tconst checkTrack = cn('questionnaire--check', choiceControlTrackClasses, formLabelSizeClasses[resolveComponentScale(undefined, defaultScale)]);\n\tconst common = { disabled, invalid: Boolean(error), 'aria-labelledby': labelId, 'aria-describedby': descriptionId, required: question.required };\n\tif (question.type === 'custom') return question.render({ ...context, question, answer, disabled, error, labelId, descriptionId, onAnswerChange });\n\tif (question.type === 'text') return <Input {...common} type={question.inputType ?? 'text'} maxLength={question.maxLength} placeholder={question.placeholder} value={typeof answer === 'string' ? answer : ''} onChange={(event) => onAnswerChange(event.target.value)} />;\n\tif (question.type === 'textarea') return <Textarea {...common} rows={question.rows ?? 4} maxLength={question.maxLength} placeholder={question.placeholder} value={typeof answer === 'string' ? answer : ''} onChange={(event) => onAnswerChange(event.target.value)} />;\n\tif (question.type === 'select') return <Select {...common} options={question.options} value={typeof answer === 'string' ? answer : null} onValueChange={onAnswerChange} />;\n\tif (question.type === 'single') return <fieldset aria-labelledby={labelId} aria-describedby={descriptionId} className=\"questionnaire--choices m-0 min-w-0 border-0 p-0\"><CardRadioGroup options={question.options} value={typeof answer === 'string' ? answer : ''} disabled={disabled} invalid={Boolean(error)} onValueChange={onAnswerChange} columns={1} /></fieldset>;\n\tif (question.type === 'multiple') return <fieldset aria-labelledby={labelId} aria-describedby={descriptionId} className=\"questionnaire--choices m-0 min-w-0 border-0 p-0\"><Stack gap=\"sm\">{question.options.map((option, index) => {\n\t\tconst values = Array.isArray(answer) ? answer : [];\n\t\tconst optionId = `${labelId}-option-${index}`;\n\t\treturn <Stack key={option.value} direction=\"horizontal\" align=\"start\" gap=\"sm\">\n\t\t\t<span className={checkTrack}><Checkbox id={optionId} disabled={disabled || option.disabled} aria-invalid={Boolean(error) || undefined} aria-describedby={[descriptionId, option.description ? `${optionId}-description` : undefined].filter(Boolean).join(' ') || undefined} checked={values.includes(option.value)} onCheckedChange={(checked) => onAnswerChange(checked ? [...values, option.value] : values.filter((entry) => entry !== option.value))} /></span>\n\t\t\t<Stack gap=\"dense\"><Label htmlFor={optionId} className=\"text-inherit\">{option.label}</Label>{option.description && <Text id={`${optionId}-description`} size=\"xs\" type=\"secondary\">{option.description}</Text>}</Stack>\n\t\t</Stack>;\n\t})}</Stack></fieldset>;\n\tif (question.type === 'boolean') return <Stack direction=\"horizontal\" align=\"start\" gap=\"sm\"><span className={checkTrack}><Checkbox {...common} aria-labelledby={undefined} id={`${labelId}-checkbox`} checked={answer === true} onCheckedChange={(checked) => onAnswerChange(checked)} /></span><Label htmlFor={`${labelId}-checkbox`} className=\"text-inherit\">{question.label ?? question.title}</Label></Stack>;\n\treturn null;\n}\n","import type { ComponentPropsWithoutRef, ReactNode } from 'react';\nimport type { StringsProp } from '../../../lib/strings';\n\nexport type QuestionnaireAnswer = string | string[] | boolean | undefined;\nexport type QuestionnaireAnswers = Record<string, QuestionnaireAnswer>;\nexport interface QuestionnaireOption { value: string; label: string; description?: string; disabled?: boolean }\nexport interface QuestionnaireQuestionBase {\n\t/** Unique stable key, used to retain answers across conditional visibility changes. */\n\tid: string;\n\ttitle: string;\n\tdescription?: string;\n\trequired?: boolean;\n\tdisabled?: boolean;\n\t/** Hidden answers are retained for editing, but excluded from validation/submission. */\n\twhen?: (answers: QuestionnaireAnswers) => boolean;\n\t/** Return an error message, or undefined/true for a valid answer. */\n\tvalidate?: (answer: QuestionnaireAnswer, answers: QuestionnaireAnswers) => string | true | undefined;\n}\nexport interface QuestionnaireTextQuestion extends QuestionnaireQuestionBase {\n\ttype: 'text' | 'textarea';\n\tplaceholder?: string;\n\t/** Native text input type. */\n\tinputType?: 'text' | 'email' | 'url' | 'tel';\n\trows?: number;\n\tmaxLength?: number;\n}\nexport interface QuestionnaireChoiceQuestion extends QuestionnaireQuestionBase {\n\ttype: 'single' | 'multiple' | 'select';\n\toptions: QuestionnaireOption[];\n}\nexport interface QuestionnaireBooleanQuestion extends QuestionnaireQuestionBase { type: 'boolean'; label?: string }\nexport interface QuestionnaireCustomQuestion extends QuestionnaireQuestionBase {\n\ttype: 'custom';\n\trender: (context: QuestionnaireQuestionContext) => ReactNode;\n}\nexport type QuestionnaireQuestion = QuestionnaireTextQuestion | QuestionnaireChoiceQuestion | QuestionnaireBooleanQuestion | QuestionnaireCustomQuestion;\nexport interface QuestionnaireQuestionContext {\n\tquestion: QuestionnaireQuestion;\n\tanswer: QuestionnaireAnswer;\n\tanswers: QuestionnaireAnswers;\n\tdisabled: boolean;\n\terror?: string;\n\t/** Connect custom controls to the visible title and description/error. */\n\tlabelId: string;\n\tdescriptionId?: string;\n\tonAnswerChange: (answer: QuestionnaireAnswer) => void;\n}\nexport interface QuestionnaireSubmitContext { signal: AbortSignal }\nexport interface QuestionnaireStrings {\n\tprevious: string; next: string; submit: string; retry: string; cancel: string;\n\tsubmitting: string; submitted: string; editAnswers: string; empty: string;\n\trequired: string; invalidChoice: string; invalidFormat: string; progress: string;\n\tstep: (current: number, total: number) => string;\n\tsubmitError: string;\n}\nexport const defaultQuestionnaireStrings: QuestionnaireStrings = {\n\tprevious: 'Previous', next: 'Next', submit: 'Submit answers', retry: 'Try again', cancel: 'Cancel submission',\n\tsubmitting: 'Submitting answers…', submitted: 'Your answers have been submitted.', editAnswers: 'Edit answers',\n\tempty: 'There are no questions to answer.', required: 'Please answer this question.', invalidChoice: 'Choose an available option.',\n\tinvalidFormat: 'Enter a valid answer.', progress: 'Questionnaire progress', step: (current, total) => `Question ${current} of ${total}`,\n\tsubmitError: 'Answers could not be submitted. Please try again.',\n};\nexport interface QuestionnaireProps extends Omit<ComponentPropsWithoutRef<'form'>, 'children' | 'onSubmit' | 'defaultValue' | 'onChange'> {\n\tquestions: readonly QuestionnaireQuestion[];\n\t/** Controlled answers. */\n\tvalue?: QuestionnaireAnswers;\n\t/** Initial answers for uncontrolled use. */\n\tdefaultValue?: QuestionnaireAnswers;\n\tonValueChange?: (answers: QuestionnaireAnswers) => void;\n\t/** Controlled active question key. */\n\tquestionId?: string;\n\tdefaultQuestionId?: string;\n\t/** Fired when navigation requests a question. Takes precedence over `onQuestionChange`. */\n\tonQuestionIdChange?: (id: string) => void;\n\t/** Legacy alias for `onQuestionIdChange`. */\n\tonQuestionChange?: (id: string) => void;\n\tdisabled?: boolean;\n\t/** Receives only visible, enabled questions. Respect signal to cancel application requests. */\n\tonSubmit?: (answers: QuestionnaireAnswers, context: QuestionnaireSubmitContext) => void | Promise<void>;\n\tonComplete?: (answers: QuestionnaireAnswers) => void;\n\tonError?: (error: unknown) => void;\n\tformatSubmitError?: (error: unknown) => string;\n\theaderSlot?: ReactNode;\n\temptySlot?: ReactNode;\n\t/** Replaces the completion state; default includes an edit-answers action. */\n\tcompletionSlot?: ReactNode;\n\tstrings?: StringsProp<QuestionnaireStrings>;\n}\n","import type { QuestionnaireAnswers, QuestionnaireQuestion, QuestionnaireStrings } from './questionnaire.types';\n\nexport function getVisibleQuestions(questions: readonly QuestionnaireQuestion[], answers: QuestionnaireAnswers) {\n\treturn questions.filter((question) => !question.when || question.when(answers));\n}\nexport function getQuestionnaireAnswer(answers: QuestionnaireAnswers, id: string) {\n\treturn Object.hasOwn(answers, id) ? answers[id] : undefined;\n}\nexport function validateQuestion(question: QuestionnaireQuestion, answers: QuestionnaireAnswers, strings: QuestionnaireStrings): string | undefined {\n\tif (question.disabled) return;\n\tconst value = getQuestionnaireAnswer(answers, question.id);\n\tconst empty = value === undefined || (typeof value === 'string' && !value.trim()) || (Array.isArray(value) && value.length === 0);\n\tif (question.required && (empty || (question.type === 'boolean' && value !== true))) return strings.required;\n\tif (value !== undefined) {\n\t\tif ((question.type === 'text' || question.type === 'textarea') && typeof value !== 'string') return strings.invalidFormat;\n\t\tif (question.type === 'boolean' && typeof value !== 'boolean') return strings.invalidFormat;\n\t\tif ((question.type === 'multiple' && !Array.isArray(value)) || ((question.type === 'single' || question.type === 'select') && typeof value !== 'string')) return strings.invalidChoice;\n\t}\n\tif (!empty) {\n\t\tif (question.type === 'single' || question.type === 'select' || question.type === 'multiple') {\n\t\t\tconst selected = Array.isArray(value) ? value : [value];\n\t\t\tif ((question.type === 'multiple' ? !Array.isArray(value) : typeof value !== 'string') || selected.some((entry) => !question.options.some((option) => option.value === entry && !option.disabled))) return strings.invalidChoice;\n\t\t} else if (question.type === 'text' || question.type === 'textarea') {\n\t\t\tif (typeof value !== 'string' || (question.maxLength !== undefined && value.length > question.maxLength)) return strings.invalidFormat;\n\t\t\tif (question.inputType === 'email' && !/^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/.test(value)) return strings.invalidFormat;\n\t\t\tif (question.inputType === 'url') { try { const url = new URL(value); if (!url.host || !['http:', 'https:'].includes(url.protocol)) return strings.invalidFormat; } catch { return strings.invalidFormat; } }\n\t\t} else if (question.type === 'boolean' && typeof value !== 'boolean') return strings.invalidFormat;\n\t}\n\tconst result = question.validate?.(value, answers);\n\treturn typeof result === 'string' && result.length > 0 ? result : undefined;\n}\n\nexport function getSubmissionAnswers(questions: readonly QuestionnaireQuestion[], answers: QuestionnaireAnswers): QuestionnaireAnswers {\n\treturn Object.fromEntries(getVisibleQuestions(questions, answers).filter((question) => !question.disabled).map((question) => {\n\t\tconst answer = getQuestionnaireAnswer(answers, question.id);\n\t\treturn [question.id, Array.isArray(answer) ? [...answer] : answer];\n\t}));\n}\n","import { forwardRef, useEffect, useId, useRef, useState } from 'react';\nimport { Button } from '../../base/buttons';\nimport { FormField } from '../../base/forms/form-field';\nimport { Progress } from '../../base/feedback';\nimport { Stack } from '../../base/structure';\nimport { Heading, Text } from '../../typography';\nimport { useStrings } from '../../../lib/strings';\nimport { cn } from '../../../lib/utils';\nimport { QuestionnaireControl } from './questionnaire-control';\nimport { defaultQuestionnaireStrings, type QuestionnaireAnswer, type QuestionnaireAnswers, type QuestionnaireProps } from './questionnaire.types';\nimport { getQuestionnaireAnswer, getSubmissionAnswers, getVisibleQuestions, validateQuestion } from './questionnaire.utils';\n\nconst emptyAnswers: QuestionnaireAnswers = {};\n\nexport const Questionnaire = forwardRef<HTMLFormElement, QuestionnaireProps>(function Questionnaire(props, ref) {\n\tconst { questions, value: controlledValue, defaultValue = {}, onValueChange, questionId, defaultQuestionId, onQuestionIdChange, onQuestionChange,\n\t\tdisabled = false, onSubmit, onComplete, onError, formatSubmitError, headerSlot, emptySlot, completionSlot, strings: stringsProp,\n\t\tclassName, onReset, ...formProps } = props;\n\tconst controlled = Object.prototype.hasOwnProperty.call(props, 'value');\n\tconst stepControlled = Object.prototype.hasOwnProperty.call(props, 'questionId');\n\tconst [internalValue, setInternalValue] = useState<QuestionnaireAnswers>(defaultValue);\n\tconst answers = controlled ? controlledValue ?? emptyAnswers : internalValue;\n\tconst answersRef = useRef(answers); answersRef.current = answers;\n\tconst visible = getVisibleQuestions(questions, answers);\n\tconst [internalId, setInternalId] = useState<string | undefined>(defaultQuestionId ?? visible[0]?.id);\n\tconst requestedId = stepControlled ? questionId : internalId;\n\tconst current = visible.find((question) => question.id === requestedId) ?? visible[0];\n\tconst position = current ? visible.indexOf(current) : 0;\n\tconst [errors, setErrors] = useState<Record<string, string | undefined>>({});\n\tconst [submitError, setSubmitError] = useState<string>();\n\tconst [busy, setBusy] = useState(false);\n\tconst [completed, setCompleted] = useState(false);\n\tconst currentQuestionId = current?.id;\n\tconst previousStage = useRef({ questionId: currentQuestionId, completed });\n\tconst submission = useRef<AbortController | null>(null);\n\tconst resetTimer = useRef<ReturnType<typeof setTimeout> | undefined>(undefined);\n\tconst mounted = useRef(true);\n\tconst stageRef = useRef<HTMLDivElement>(null);\n\tconst strings = useStrings(defaultQuestionnaireStrings, stringsProp);\n\tconst id = useId();\n\tconst labelId = `${id}-title`;\n\tconst descriptionId = `${id}-description`;\n\tconst locked = busy || disabled;\n\tconst cancelReset = () => { clearTimeout(resetTimer.current); resetTimer.current = undefined; };\n\tconst cancel = () => { submission.current?.abort(); submission.current = null; setBusy(false); };\n\tconst goTo = (nextId: string) => { if (!stepControlled) setInternalId(nextId); (onQuestionIdChange ?? onQuestionChange)?.(nextId); };\n\tconst setAnswer = (answer: QuestionnaireAnswer) => {\n\t\tif (!current || current.disabled || locked) return;\n\t\tconst next = { ...answersRef.current, [current.id]: answer };\n\t\tif (!controlled) { answersRef.current = next; setInternalValue(next); }\n\t\tonValueChange?.(next);\n\t\tsetErrors((previous) => ({ ...previous, [current.id]: undefined })); setSubmitError(undefined); setCompleted(false);\n\t};\n\tuseEffect(() => {\n\t\tconst previous = previousStage.current;\n\t\tpreviousStage.current = { questionId: currentQuestionId, completed };\n\t\tif (previous.questionId === undefined ||\n\t\t\t(previous.questionId === currentQuestionId && previous.completed === completed)) return;\n\t\tstageRef.current?.focus();\n\t}, [currentQuestionId, completed]);\n\tuseEffect(() => {\n\t\t// Replacing data/schema or disabling during a request invalidates that result.\n\t\tcancelReset(); cancel(); setErrors({}); setSubmitError(undefined); setCompleted(false);\n\t}, [answers, questions, disabled]);\n\tuseEffect(() => { mounted.current = true; return () => { mounted.current = false; cancelReset(); submission.current?.abort(); submission.current = null; }; }, []);\n\tconst advance = () => {\n\t\tif (!current || locked) return;\n\t\tconst error = validateQuestion(current, answersRef.current, strings);\n\t\tsetErrors((previous) => ({ ...previous, [current.id]: error }));\n\t\tif (error) { stageRef.current?.focus(); return; }\n\t\tif (visible[position + 1]) goTo(visible[position + 1].id);\n\t};\n\tconst submit = async () => {\n\t\tif (submission.current || disabled || !visible.length) return;\n\t\tconst validation = Object.fromEntries(visible.map((question) => [question.id, validateQuestion(question, answersRef.current, strings)]));\n\t\tsetErrors(validation);\n\t\tconst firstInvalid = visible.find((question) => validation[question.id]);\n\t\tif (firstInvalid) { goTo(firstInvalid.id); stageRef.current?.focus(); return; }\n\t\tconst controller = new AbortController(); submission.current = controller;\n\t\tsetSubmitError(undefined); setBusy(true);\n\t\tconst snapshot = getSubmissionAnswers(questions, answersRef.current);\n\t\ttry {\n\t\t\tawait onSubmit?.(snapshot, { signal: controller.signal });\n\t\t\tif (submission.current !== controller || controller.signal.aborted) return;\n\t\t\tsetCompleted(true); onComplete?.(snapshot);\n\t\t} catch (error) {\n\t\t\tif (submission.current !== controller || controller.signal.aborted) return;\n\t\t\tsetSubmitError(formatSubmitError?.(error) ?? strings.submitError); onError?.(error);\n\t\t} finally { if (submission.current === controller) { submission.current = null; setBusy(false); } }\n\t};\n\tconst currentError = current && Object.hasOwn(errors, current.id) ? errors[current.id] : undefined;\n\tconst description = current && (currentError || current.description);\n\treturn <form {...formProps} ref={ref} noValidate aria-busy={busy || undefined} className={cn('questionnaire--component min-w-0', className)} onSubmit={(event) => { event.preventDefault(); if (position < visible.length - 1) advance(); else void submit(); }} onReset={(event) => {\n\t\tonReset?.(event); const nativeEvent = event.nativeEvent;\n\t\t// Trusted events can run microtasks before native ancestor listeners have cancelled reset.\n\t\tcancelReset(); resetTimer.current = setTimeout(() => {\n\t\t\tresetTimer.current = undefined;\n\t\t\tif (!mounted.current || nativeEvent.defaultPrevented || disabled) return; cancel();\n\t\t\tif (!controlled) { answersRef.current = defaultValue; setInternalValue(defaultValue); } onValueChange?.(defaultValue);\n\t\t\tsetErrors({}); setSubmitError(undefined); setCompleted(false);\n\t\t\tconst initialVisible = getVisibleQuestions(questions, defaultValue);\n\t\t\tconst initialQuestion = initialVisible.find((question) => question.id === defaultQuestionId) ?? initialVisible[0];\n\t\t\tif (initialQuestion) goTo(initialQuestion.id); else if (!stepControlled) setInternalId(undefined);\n\t\t}, 0);\n\t}}>\n\t\t<Stack gap=\"lg\">\n\t\t\t{headerSlot}\n\t\t\t{!current ? emptySlot ?? <Text type=\"secondary\">{strings.empty}</Text> : completed ? completionSlot ?? <Stack gap=\"sm\"><Text type=\"inherit\" role=\"status\">{strings.submitted}</Text><Button disabled={disabled} type=\"button\" buttonStyle=\"outline\" onClick={() => { setCompleted(false); if (visible[0]) goTo(visible[0].id); }}>{strings.editAnswers}</Button></Stack> : <>\n\t\t\t\t<Progress value={position + 1} max={visible.length} label={strings.progress} valueSlot={<Text size=\"xs\" type=\"secondary\" aria-live=\"polite\">{strings.step(position + 1, visible.length)}</Text>} />\n\t\t\t\t<Stack ref={stageRef} gap=\"normal\" tabIndex={-1} role=\"group\" aria-labelledby={labelId} className=\"questionnaire--question outline-none\">\n\t\t\t\t\t<Heading className=\"text-inherit\" id={labelId} tag=\"h3\">{current.title}</Heading>\n\t\t\t\t\t<FormField required={current.required} error={currentError} hint={current.description} supportingTextId={descriptionId}>\n\t\t\t\t\t\t<QuestionnaireControl key={current.id} question={current} answer={getQuestionnaireAnswer(answers, current.id)} answers={answers} disabled={locked || Boolean(current.disabled)} error={currentError} labelId={labelId} descriptionId={description ? descriptionId : undefined} onAnswerChange={setAnswer} />\n\t\t\t\t\t</FormField>\n\t\t\t\t</Stack>\n\t\t\t\t{submitError && <Text role=\"alert\" type=\"error\">{submitError}</Text>}\n\t\t\t\t{busy && <Text role=\"status\" type=\"secondary\">{strings.submitting}</Text>}\n\t\t\t\t<Stack direction=\"horizontal\" gap=\"sm\" wrap>\n\t\t\t\t\t<Button type=\"button\" buttonStyle=\"outline\" disabled={locked || position === 0} onClick={() => { setSubmitError(undefined); goTo(visible[position - 1].id); }}>{strings.previous}</Button>\n\t\t\t\t\t{position < visible.length - 1 ? <Button tone=\"primary\" type=\"button\" disabled={locked} onClick={advance}>{strings.next}</Button> : <Button tone=\"primary\" type=\"submit\" disabled={locked}>{submitError ? strings.retry : strings.submit}</Button>}\n\t\t\t\t\t{busy && <Button type=\"button\" buttonStyle=\"outline\" disabled={disabled} onClick={cancel}>{strings.cancel}</Button>}\n\t\t\t\t</Stack>\n\t\t\t</>}\n\t\t</Stack>\n\t</form>;\n});\n"],"mappings":"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"}
|
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
import { useStrings as e } from "../lib/strings.js";
|
|
3
|
-
import { t } from "../utils-
|
|
4
|
-
import { n } from "../buttons-
|
|
5
|
-
import { c as r, o as i } from "../typography-
|
|
6
|
-
import { t as a } from "../structure-
|
|
7
|
-
import { n as o } from "../cards-
|
|
8
|
-
import { r as s } from "../overlays-
|
|
9
|
-
import { n as c } from "../display-
|
|
10
|
-
import { s as l } from "../data-display-
|
|
3
|
+
import { t } from "../utils-DhuoqFy4.js";
|
|
4
|
+
import { n } from "../buttons-DeW0bQeK.js";
|
|
5
|
+
import { c as r, o as i } from "../typography-C7-YMW1S.js";
|
|
6
|
+
import { t as a } from "../structure-DZJ2wbAU.js";
|
|
7
|
+
import { n as o } from "../cards-CNXnmvV5.js";
|
|
8
|
+
import { r as s } from "../overlays-CC8zI3Du.js";
|
|
9
|
+
import { n as c } from "../display-CT_N2a3w.js";
|
|
10
|
+
import { s as l } from "../data-display-Cmj-xZYl.js";
|
|
11
11
|
import { useCallback as u, useEffect as d, useMemo as f, useRef as p, useState as m } from "react";
|
|
12
12
|
import { Fragment as h, jsx as g, jsxs as _ } from "react/jsx-runtime";
|
|
13
13
|
import { Eye as v, PackageOpen as y } from "lucide-react";
|
|
@@ -1,21 +1,22 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
import { useStrings as e } from "../lib/strings.js";
|
|
3
|
-
import { t } from "../utils-
|
|
4
|
-
import { c as n } from "../typography-
|
|
5
|
-
import { t as r } from "../structure-
|
|
6
|
-
import { n as i, t as a } from "../feedback-
|
|
3
|
+
import { t } from "../utils-DhuoqFy4.js";
|
|
4
|
+
import { c as n } from "../typography-C7-YMW1S.js";
|
|
5
|
+
import { t as r } from "../structure-DZJ2wbAU.js";
|
|
6
|
+
import { n as i, t as a } from "../feedback-Dzo1xtAU.js";
|
|
7
7
|
import { n as o, t as s } from "../composition.recipes-COdiFhxB.js";
|
|
8
|
-
import { u as c } from "../primitives-
|
|
9
|
-
import { t as l } from "../icon-badge-
|
|
10
|
-
import { i as u, n as d, s as f } from "../avatar-
|
|
11
|
-
import { n as p } from "../display-
|
|
12
|
-
import { t as m } from "../metadata-list-
|
|
13
|
-
import { t as h } from "../navigation-
|
|
14
|
-
import { t as g } from "../overflow-tab-bar-
|
|
15
|
-
import { s as _ } from "../data-display-
|
|
16
|
-
import {
|
|
8
|
+
import { u as c } from "../primitives-BkkQjYl7.js";
|
|
9
|
+
import { t as l } from "../icon-badge-npxF1SLX.js";
|
|
10
|
+
import { i as u, n as d, s as f } from "../avatar-B9Jnp-T-.js";
|
|
11
|
+
import { n as p } from "../display-CT_N2a3w.js";
|
|
12
|
+
import { t as m } from "../metadata-list-XkqZ_UXH.js";
|
|
13
|
+
import { t as h } from "../navigation-Bt-v7rWP.js";
|
|
14
|
+
import { t as g } from "../overflow-tab-bar-BQCA2Zn2.js";
|
|
15
|
+
import { s as _ } from "../data-display-Cmj-xZYl.js";
|
|
16
|
+
import { useState as v } from "react";
|
|
17
|
+
import { jsx as y, jsxs as b } from "react/jsx-runtime";
|
|
17
18
|
//#region src/components/features/resource/resource.strings.ts
|
|
18
|
-
var
|
|
19
|
+
var x = {
|
|
19
20
|
loadingLabel: "Loading resources",
|
|
20
21
|
loadingDescription: "Preparing the latest data for this view.",
|
|
21
22
|
emptyTitle: "No resources found",
|
|
@@ -27,40 +28,40 @@ var b = {
|
|
|
27
28
|
};
|
|
28
29
|
//#endregion
|
|
29
30
|
//#region src/components/features/resource/resource.tsx
|
|
30
|
-
function
|
|
31
|
-
let A = m, j = typeof e == "string" ? e : "", M = a ?? (o || p ? /* @__PURE__ */
|
|
31
|
+
function S({ title: e, description: n, eyebrow: i, media: a, avatarUrl: o, avatarAlt: s, avatarFallback: p, icon: m, iconTone: g = "neutral", badges: _, metadata: v, actions: x, primaryAction: S, secondaryActions: C, maxVisibleSecondaryActions: w, moreActionsLabel: T, renderLink: E, className: D, contentClassName: O, mediaClassName: k }) {
|
|
32
|
+
let A = m, j = typeof e == "string" ? e : "", M = a ?? (o || p ? /* @__PURE__ */ b(d, {
|
|
32
33
|
className: t("resource-header--avatar size-avatar-lg", k),
|
|
33
|
-
children: [!!o && /* @__PURE__ */
|
|
34
|
+
children: [!!o && /* @__PURE__ */ y(f, {
|
|
34
35
|
src: o,
|
|
35
36
|
alt: s ?? j
|
|
36
|
-
}), /* @__PURE__ */
|
|
37
|
+
}), /* @__PURE__ */ y(u, { children: p ?? /* @__PURE__ */ y(c, {
|
|
37
38
|
value: j,
|
|
38
39
|
strategy: "first-words"
|
|
39
40
|
}) })]
|
|
40
|
-
}) : A ? /* @__PURE__ */
|
|
41
|
+
}) : A ? /* @__PURE__ */ y(l, {
|
|
41
42
|
icon: A,
|
|
42
43
|
shape: "square",
|
|
43
44
|
tone: g,
|
|
44
45
|
className: t("resource-header--icon size-avatar-lg [&>svg]:size-icon-lg", k)
|
|
45
46
|
}) : null);
|
|
46
|
-
return /* @__PURE__ */
|
|
47
|
+
return /* @__PURE__ */ y(h, {
|
|
47
48
|
eyebrow: i,
|
|
48
49
|
title: e,
|
|
49
50
|
description: n,
|
|
50
51
|
leading: M,
|
|
51
|
-
titleSuffix: _ ? /* @__PURE__ */
|
|
52
|
+
titleSuffix: _ ? /* @__PURE__ */ y(r, {
|
|
52
53
|
"data-slot": "resource-header-badges",
|
|
53
54
|
direction: "horizontal",
|
|
54
55
|
gap: "sm",
|
|
55
56
|
className: "resource-header--badges shrink-0",
|
|
56
57
|
children: _
|
|
57
58
|
}) : void 0,
|
|
58
|
-
afterDescription:
|
|
59
|
+
afterDescription: v ? /* @__PURE__ */ y(r, {
|
|
59
60
|
"data-slot": "resource-header-metadata",
|
|
60
61
|
direction: "horizontal",
|
|
61
62
|
gap: "md",
|
|
62
63
|
className: "resource-header--metadata mt-space-sm",
|
|
63
|
-
children:
|
|
64
|
+
children: v
|
|
64
65
|
}) : void 0,
|
|
65
66
|
actions: x,
|
|
66
67
|
primaryAction: S,
|
|
@@ -77,12 +78,12 @@ function x({ title: e, description: n, eyebrow: i, media: a, avatarUrl: o, avata
|
|
|
77
78
|
actionsClassName: "resource-header--actions flex-wrap"
|
|
78
79
|
});
|
|
79
80
|
}
|
|
80
|
-
function
|
|
81
|
-
return /* @__PURE__ */
|
|
81
|
+
function C({ children: e, leading: n, trailing: i, sticky: a = !1, className: o }) {
|
|
82
|
+
return /* @__PURE__ */ y("div", {
|
|
82
83
|
"data-component": "resource-action-bar",
|
|
83
84
|
"data-slot": "resource-action-bar",
|
|
84
85
|
className: t("resource-action-bar--component box-border rounded-surface border border-border bg-card text-card-foreground px-surface py-row-y-lg shadow-xs", a && "sticky top-shell-header z-30", o),
|
|
85
|
-
children: /* @__PURE__ */
|
|
86
|
+
children: /* @__PURE__ */ b(r, {
|
|
86
87
|
direction: {
|
|
87
88
|
base: "vertical",
|
|
88
89
|
sm: "horizontal"
|
|
@@ -92,13 +93,13 @@ function S({ children: e, leading: n, trailing: i, sticky: a = !1, className: o
|
|
|
92
93
|
justify: { sm: "between" },
|
|
93
94
|
wrap: { sm: !1 },
|
|
94
95
|
className: "resource-action-bar--layout",
|
|
95
|
-
children: [/* @__PURE__ */
|
|
96
|
+
children: [/* @__PURE__ */ y(r, {
|
|
96
97
|
"data-slot": "resource-action-leading",
|
|
97
98
|
direction: "horizontal",
|
|
98
99
|
gap: "md",
|
|
99
100
|
className: "resource-action-bar--leading flex-1",
|
|
100
101
|
children: n ?? e
|
|
101
|
-
}), !!i && /* @__PURE__ */
|
|
102
|
+
}), !!i && /* @__PURE__ */ y(r, {
|
|
102
103
|
"data-slot": "resource-action-trailing",
|
|
103
104
|
direction: "horizontal",
|
|
104
105
|
gap: "md",
|
|
@@ -108,16 +109,16 @@ function S({ children: e, leading: n, trailing: i, sticky: a = !1, className: o
|
|
|
108
109
|
})
|
|
109
110
|
});
|
|
110
111
|
}
|
|
111
|
-
function
|
|
112
|
-
return /* @__PURE__ */
|
|
112
|
+
function w(e) {
|
|
113
|
+
return /* @__PURE__ */ y(_, {
|
|
113
114
|
...e,
|
|
114
115
|
"data-component": "resource-empty-state",
|
|
115
116
|
"data-slot": "resource-empty-state",
|
|
116
117
|
className: t("resource-empty-state--component", e.className)
|
|
117
118
|
});
|
|
118
119
|
}
|
|
119
|
-
function
|
|
120
|
-
let P = e(
|
|
120
|
+
function T({ children: n, title: c, description: l, actions: u, primaryAction: d, secondaryActions: f, maxVisibleSecondaryActions: p, moreActionsLabel: m, renderLink: h, toolbar: g, emptySlot: _, empty: v = !1, loading: C = !1, error: T, onRetry: E, slots: D, className: O, headerClassName: k, contentClassName: A, strings: j, asideClassName: M, variant: N }) {
|
|
121
|
+
let P = e(x, j), F = D?.header ?? (c ? /* @__PURE__ */ y(S, {
|
|
121
122
|
title: c,
|
|
122
123
|
description: l,
|
|
123
124
|
actions: u,
|
|
@@ -127,53 +128,53 @@ function w({ children: n, title: c, description: l, actions: u, primaryAction: d
|
|
|
127
128
|
moreActionsLabel: m,
|
|
128
129
|
renderLink: h,
|
|
129
130
|
className: k
|
|
130
|
-
}) : null), I = D?.toolbar ?? g, L = D?.loading ?? /* @__PURE__ */
|
|
131
|
+
}) : null), I = D?.toolbar ?? g, L = D?.loading ?? /* @__PURE__ */ y(i, {
|
|
131
132
|
variant: "panel",
|
|
132
133
|
label: P.loadingLabel,
|
|
133
134
|
description: P.loadingDescription,
|
|
134
135
|
skeleton: !0,
|
|
135
136
|
lines: 4,
|
|
136
137
|
className: "resource-shell--loading rounded-surface border border-border bg-card"
|
|
137
|
-
}), R = D?.empty ?? _ ?? /* @__PURE__ */
|
|
138
|
+
}), R = D?.empty ?? _ ?? /* @__PURE__ */ y(w, {
|
|
138
139
|
title: P.emptyTitle,
|
|
139
140
|
description: P.emptyDescription,
|
|
140
141
|
border: !0
|
|
141
|
-
}), z = /* @__PURE__ */
|
|
142
|
+
}), z = /* @__PURE__ */ y(a, {
|
|
142
143
|
title: P.errorTitle,
|
|
143
144
|
description: T instanceof Error ? T.message : typeof T == "string" || typeof T == "number" ? String(T) : P.errorDescription,
|
|
144
145
|
onRetry: E,
|
|
145
146
|
retryLabel: P.retryLabel
|
|
146
|
-
}), B = D?.error ?? (T && typeof T != "boolean" && typeof T != "string" && typeof T != "number" && !(T instanceof Error) ? T : z), V =
|
|
147
|
-
return /* @__PURE__ */
|
|
147
|
+
}), B = D?.error ?? (T && typeof T != "boolean" && typeof T != "string" && typeof T != "number" && !(T instanceof Error) ? T : z), V = C ? L : T ? B : v ? R : n;
|
|
148
|
+
return /* @__PURE__ */ b("section", {
|
|
148
149
|
"data-component": `resource-${N}-shell`,
|
|
149
150
|
"data-slot": `resource-${N}-shell`,
|
|
150
151
|
className: t(`resource-${N}-shell--component flex min-w-0 flex-col`, s.subjects, N === "index" && "@container/resource-index", N === "show" && "@container/resource-show", O),
|
|
151
152
|
children: [
|
|
152
|
-
!!F && /* @__PURE__ */
|
|
153
|
+
!!F && /* @__PURE__ */ y("div", {
|
|
153
154
|
"data-slot": `resource-${N}-header`,
|
|
154
155
|
className: `resource-${N}-shell--header`,
|
|
155
156
|
children: F
|
|
156
157
|
}),
|
|
157
|
-
!!I && /* @__PURE__ */
|
|
158
|
+
!!I && /* @__PURE__ */ y("div", {
|
|
158
159
|
"data-slot": `resource-${N}-toolbar`,
|
|
159
160
|
className: `resource-${N}-shell--toolbar`,
|
|
160
161
|
children: I
|
|
161
162
|
}),
|
|
162
|
-
/* @__PURE__ */
|
|
163
|
+
/* @__PURE__ */ b("div", {
|
|
163
164
|
"data-slot": `resource-${N}-layout`,
|
|
164
165
|
className: t(`resource-${N}-shell--layout grid min-w-0`, s.subjects, D?.aside && N === "show" && "@4xl/resource-show:grid-cols-[minmax(0,1fr)_var(--shell-sidebar-width)]", D?.aside && N === "index" && "@4xl/resource-index:grid-cols-[minmax(0,1fr)_var(--shell-sidebar-width)]"),
|
|
165
|
-
children: [/* @__PURE__ */
|
|
166
|
+
children: [/* @__PURE__ */ b(r, {
|
|
166
167
|
gap: o.subjects,
|
|
167
|
-
children: [/* @__PURE__ */
|
|
168
|
+
children: [/* @__PURE__ */ y("div", {
|
|
168
169
|
"data-slot": `resource-${N}-content`,
|
|
169
170
|
className: t(`resource-${N}-shell--content flex min-w-0 flex-col`, s.subjects, A),
|
|
170
171
|
children: V
|
|
171
|
-
}), !!D?.footer && /* @__PURE__ */
|
|
172
|
+
}), !!D?.footer && /* @__PURE__ */ y("div", {
|
|
172
173
|
"data-slot": `resource-${N}-footer`,
|
|
173
174
|
className: `resource-${N}-shell--footer`,
|
|
174
175
|
children: D.footer
|
|
175
176
|
})]
|
|
176
|
-
}), !!D?.aside && /* @__PURE__ */
|
|
177
|
+
}), !!D?.aside && /* @__PURE__ */ y("aside", {
|
|
177
178
|
"data-slot": `resource-${N}-aside`,
|
|
178
179
|
className: t(`resource-${N}-shell--aside flex min-w-0 flex-col`, s.subjects, M),
|
|
179
180
|
children: D.aside
|
|
@@ -182,47 +183,49 @@ function w({ children: n, title: c, description: l, actions: u, primaryAction: d
|
|
|
182
183
|
]
|
|
183
184
|
});
|
|
184
185
|
}
|
|
185
|
-
function
|
|
186
|
-
return /* @__PURE__ */
|
|
186
|
+
function E(e) {
|
|
187
|
+
return /* @__PURE__ */ y(T, {
|
|
187
188
|
...e,
|
|
188
189
|
variant: "index"
|
|
189
190
|
});
|
|
190
191
|
}
|
|
191
|
-
function
|
|
192
|
-
return /* @__PURE__ */
|
|
192
|
+
function D(e) {
|
|
193
|
+
return /* @__PURE__ */ y(T, {
|
|
193
194
|
...e,
|
|
194
195
|
variant: "show"
|
|
195
196
|
});
|
|
196
197
|
}
|
|
197
|
-
function
|
|
198
|
-
let
|
|
198
|
+
function O({ tabs: n, activeTab: i, defaultActiveTab: a, onTabChange: o, tabsClassName: s, moreLabel: c, tabsAriaLabel: l, toolbar: u, slots: d, className: f, strings: p, ...m }) {
|
|
199
|
+
let h = e(x, p), [_, S] = v(a), C = /* @__PURE__ */ b(r, {
|
|
199
200
|
gap: "lg",
|
|
200
201
|
"data-slot": "tabbed-resource-toolbar",
|
|
201
202
|
className: "tabbed-resource-shell--toolbar",
|
|
202
|
-
children: [/* @__PURE__ */
|
|
203
|
+
children: [/* @__PURE__ */ y(g, {
|
|
203
204
|
items: n,
|
|
204
|
-
value: i,
|
|
205
|
-
onValueChange:
|
|
206
|
-
|
|
205
|
+
value: i === void 0 ? _ : i,
|
|
206
|
+
onValueChange: (e) => {
|
|
207
|
+
i === void 0 && _ !== void 0 && S(e), o?.(e);
|
|
208
|
+
},
|
|
209
|
+
className: s,
|
|
207
210
|
strings: {
|
|
208
|
-
more:
|
|
209
|
-
navigationLabel:
|
|
211
|
+
more: c,
|
|
212
|
+
navigationLabel: l ?? h.tabsAriaLabel
|
|
210
213
|
}
|
|
211
|
-
}),
|
|
214
|
+
}), u]
|
|
212
215
|
});
|
|
213
|
-
return /* @__PURE__ */
|
|
214
|
-
...
|
|
215
|
-
strings:
|
|
216
|
-
className: t("tabbed-resource-shell--component",
|
|
217
|
-
toolbar:
|
|
216
|
+
return /* @__PURE__ */ y(D, {
|
|
217
|
+
...m,
|
|
218
|
+
strings: p,
|
|
219
|
+
className: t("tabbed-resource-shell--component", f),
|
|
220
|
+
toolbar: C,
|
|
218
221
|
slots: {
|
|
219
|
-
...
|
|
220
|
-
toolbar:
|
|
222
|
+
...d,
|
|
223
|
+
toolbar: d?.toolbar ?? C
|
|
221
224
|
}
|
|
222
225
|
});
|
|
223
226
|
}
|
|
224
|
-
function
|
|
225
|
-
return /* @__PURE__ */
|
|
227
|
+
function k({ title: e, description: n, actions: r, headerAction: i, children: a, footer: o, padding: s = "md", surface: c = "card", className: l, contentClassName: u, name: d }) {
|
|
228
|
+
return /* @__PURE__ */ y(p, {
|
|
226
229
|
"data-component": d,
|
|
227
230
|
"data-slot": d,
|
|
228
231
|
title: e,
|
|
@@ -237,13 +240,13 @@ function O({ title: e, description: n, actions: r, headerAction: i, children: a,
|
|
|
237
240
|
children: a
|
|
238
241
|
});
|
|
239
242
|
}
|
|
240
|
-
function
|
|
241
|
-
return /* @__PURE__ */
|
|
243
|
+
function A({ metadata: e, metadataColumns: r = 2, metadataDense: i = !1, body: a, help: o, children: s, contentClassName: c, ...l }) {
|
|
244
|
+
return /* @__PURE__ */ b(k, {
|
|
242
245
|
...l,
|
|
243
246
|
name: "resource-details-section",
|
|
244
247
|
contentClassName: t("resource-details-section--content grid gap-space-xl", c),
|
|
245
248
|
children: [
|
|
246
|
-
!!e?.length && /* @__PURE__ */
|
|
249
|
+
!!e?.length && /* @__PURE__ */ y(m, {
|
|
247
250
|
adaptTo: "container",
|
|
248
251
|
items: e,
|
|
249
252
|
columns: r,
|
|
@@ -251,7 +254,7 @@ function k({ metadata: e, metadataColumns: r = 2, metadataDense: i = !1, body: a
|
|
|
251
254
|
}),
|
|
252
255
|
a,
|
|
253
256
|
s,
|
|
254
|
-
!!o && /* @__PURE__ */
|
|
257
|
+
!!o && /* @__PURE__ */ y(n, {
|
|
255
258
|
size: "xs",
|
|
256
259
|
type: "secondary",
|
|
257
260
|
className: "resource-details-section--help",
|
|
@@ -261,6 +264,6 @@ function k({ metadata: e, metadataColumns: r = 2, metadataDense: i = !1, body: a
|
|
|
261
264
|
});
|
|
262
265
|
}
|
|
263
266
|
//#endregion
|
|
264
|
-
export {
|
|
267
|
+
export { C as ResourceActionBar, A as ResourceDetailsSection, w as ResourceEmptyState, S as ResourceHeader, E as ResourceIndexShell, D as ResourceShowShell, O as TabbedResourceShell, x as defaultResourceStrings };
|
|
265
268
|
|
|
266
269
|
//# sourceMappingURL=resource.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"resource.js","names":["Text","Stack","LoadingState","ErrorState","compositionRhythm","compositionClasses","Initials","IconBadge","AvatarFallback","Avatar","AvatarImage","ContentBlock","MetadataList","PageHeading","OverflowTabBar","EmptyState","defaultResourceStrings","ResourceHeader","Icon","icon","titleText","title","resolvedMedia","media","avatarUrl","avatarFallback","cn","mediaClassName","avatarAlt","iconTone","badges","metadata","className","ResourceActionBar","sticky","leading","children","trailing","ResourceEmptyState","props","ResourceShellFrame","emptyState","stringsProp","strings","useStrings","header","slots","headerClassName","toolbarNode","toolbar","loadingNode","emptyNode","emptySlot","defaultErrorNode","error","errorNode","body","loading","variant","contentClassName","asideClassName","ResourceIndexShell","ResourceShowShell","TabbedResourceShell","tabs","activeTab","onTabChange","tabsClassName","moreLabel","tabsAriaLabel","ResourceCard","name","footer","ResourceDetailsSection","metadataColumns","metadataDense","help"],"sources":["../../src/components/features/resource/resource.strings.ts","../../src/components/features/resource/resource.tsx"],"sourcesContent":["/** Default copy for state-aware resource workspace replacement states. */\nexport interface ResourceStrings {\n\tloadingLabel: string;\n\tloadingDescription: string;\n\temptyTitle: string;\n\temptyDescription: string;\n\terrorTitle: string;\n\terrorDescription: string;\n\tretryLabel: string;\n\ttabsAriaLabel: string;\n}\n\nexport const defaultResourceStrings: ResourceStrings = {\n\tloadingLabel: 'Loading resources',\n\tloadingDescription: 'Preparing the latest data for this view.',\n\temptyTitle: 'No resources found',\n\temptyDescription: 'There are no records available for this view.',\n\terrorTitle: 'Resources unavailable',\n\terrorDescription: 'The resource data could not be loaded.',\n\tretryLabel: 'Try again',\n\ttabsAriaLabel: 'Resource sections',\n};\n","/** State-aware resource workspace primitives for coordinated index/show surfaces. */\nimport { ContentBlock, IconBadge } from '../../base/display';\nimport { Avatar, AvatarFallback, AvatarImage } from '../../base/avatar';\nimport { ErrorState, LoadingState } from '../../base/feedback';\nimport { MetadataList } from '../../base/metadata-list';\nimport { EmptyState } from '../../blocks/data-display';\nimport { OverflowTabBar, PageHeading } from '../../base/navigation';\nimport { Stack } from '../../base/structure';\nimport {compositionClasses, compositionRhythm} from '../../base/structure/composition.recipes';\nimport { Initials } from '../../primitives';\nimport { Text } from '../../typography';\nimport { useStrings } from '../../../lib/strings';\nimport { cn } from '../../../lib/utils';\n\nimport { defaultResourceStrings } from './resource.strings';\nimport type {\n\tResourceActionBarProps,\n\tResourceDetailsSectionProps,\n\tResourceEmptyStateProps,\n\tResourceHeaderProps,\n\tResourceIndexShellProps,\n\tResourceShowShellProps,\n\tTabbedResourceShellProps,\n} from './resource.types';\n\n/** @deprecated Use Page from themelia-react-ui/layout/page; PageHeader is available for embedded headers. */\nexport function ResourceHeader({\n\ttitle,\n\tdescription,\n\teyebrow,\n\tmedia,\n\tavatarUrl,\n\tavatarAlt,\n\tavatarFallback,\n\ticon,\n\ticonTone = 'neutral',\n\tbadges,\n\tmetadata,\n\tactions,\n\tprimaryAction,\n\tsecondaryActions,\n\tmaxVisibleSecondaryActions,\n\tmoreActionsLabel,\n\trenderLink,\n\tclassName,\n\tcontentClassName,\n\tmediaClassName,\n}: ResourceHeaderProps) {\n\tconst Icon = icon;\n\tconst titleText = typeof title === 'string' ? title : '';\n\tconst resolvedMedia =\n\t\tmedia ??\n\t\t(avatarUrl || avatarFallback ? (\n\t\t\t<Avatar className={cn('resource-header--avatar size-avatar-lg', mediaClassName)}>\n\t\t\t\t{!!avatarUrl && <AvatarImage src={avatarUrl} alt={avatarAlt ?? titleText} />}\n\t\t\t\t<AvatarFallback>{avatarFallback ?? <Initials value={titleText} strategy=\"first-words\" />}</AvatarFallback>\n\t\t\t</Avatar>\n\t\t) : Icon ? (\n\t\t\t<IconBadge\n\t\t\t\ticon={Icon}\n\t\t\t\tshape=\"square\"\n\t\t\t\ttone={iconTone}\n\t\t\t\tclassName={cn('resource-header--icon size-avatar-lg [&>svg]:size-icon-lg', mediaClassName)}\n\t\t\t/>\n\t\t) : null);\n\n\treturn (\n\t\t<PageHeading\n\t\t\teyebrow={eyebrow}\n\t\t\ttitle={title}\n\t\t\tdescription={description}\n\t\t\tleading={resolvedMedia}\n\t\t\ttitleSuffix={\n\t\t\t\tbadges ? (\n\t\t\t\t\t<Stack\n\t\t\t\t\t\tdata-slot=\"resource-header-badges\"\n\t\t\t\t\t\tdirection=\"horizontal\"\n\t\t\t\t\t\tgap=\"sm\"\n\t\t\t\t\t\tclassName=\"resource-header--badges shrink-0\"\n\t\t\t\t\t>\n\t\t\t\t\t\t{badges}\n\t\t\t\t\t</Stack>\n\t\t\t\t) : undefined\n\t\t\t}\n\t\t\tafterDescription={\n\t\t\t\tmetadata ? (\n\t\t\t\t\t<Stack\n\t\t\t\t\t\tdata-slot=\"resource-header-metadata\"\n\t\t\t\t\t\tdirection=\"horizontal\"\n\t\t\t\t\t\tgap=\"md\"\n\t\t\t\t\t\tclassName=\"resource-header--metadata mt-space-sm\"\n\t\t\t\t\t>\n\t\t\t\t\t\t{metadata}\n\t\t\t\t\t</Stack>\n\t\t\t\t) : undefined\n\t\t\t}\n\t\t\tactions={actions}\n\t\t\tprimaryAction={primaryAction}\n\t\t\tsecondaryActions={secondaryActions}\n\t\t\tmaxVisibleSecondaryActions={maxVisibleSecondaryActions}\n\t\t\tmoreActionsLabel={moreActionsLabel}\n\t\t\trenderLink={renderLink}\n\t\t\twithSeparator={false}\n\t\t\tclassName={cn('resource-header--component', className)}\n\t\t\tcontentClassName={contentClassName}\n\t\t\teyebrowClassName=\"resource-header--eyebrow\"\n\t\t\ttitleClassName=\"resource-header--title truncate\"\n\t\t\tdescriptionClassName=\"resource-header--description max-w-3xl\"\n\t\t\tactionsClassName=\"resource-header--actions flex-wrap\"\n\t\t/>\n\t);\n}\n\nexport function ResourceActionBar({ children, leading, trailing, sticky = false, className }: ResourceActionBarProps) {\n\treturn (\n\t\t<div\n\t\t\tdata-component=\"resource-action-bar\"\n\t\t\tdata-slot=\"resource-action-bar\"\n\t\t\tclassName={cn(\n\t\t\t\t'resource-action-bar--component box-border rounded-surface border border-border bg-card text-card-foreground px-surface py-row-y-lg shadow-xs',\n\t\t\t\tsticky && 'sticky top-shell-header z-30',\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t>\n\t\t\t<Stack\n\t\t\t\tdirection={{ base: 'vertical', sm: 'horizontal' }}\n\t\t\t\tgap=\"lg\"\n\t\t\t\talign={{ sm: 'center' }}\n\t\t\t\tjustify={{ sm: 'between' }}\n\t\t\t\twrap={{ sm: false }}\n\t\t\t\tclassName=\"resource-action-bar--layout\"\n\t\t\t>\n\t\t\t\t<Stack\n\t\t\t\t\tdata-slot=\"resource-action-leading\"\n\t\t\t\t\tdirection=\"horizontal\"\n\t\t\t\t\tgap=\"md\"\n\t\t\t\t\tclassName=\"resource-action-bar--leading flex-1\"\n\t\t\t\t>\n\t\t\t\t\t{leading ?? children}\n\t\t\t\t</Stack>\n\t\t\t\t{!!trailing && (\n\t\t\t\t\t<Stack\n\t\t\t\t\t\tdata-slot=\"resource-action-trailing\"\n\t\t\t\t\t\tdirection=\"horizontal\"\n\t\t\t\t\t\tgap=\"md\"\n\t\t\t\t\t\tclassName=\"resource-action-bar--trailing shrink-0\"\n\t\t\t\t\t>\n\t\t\t\t\t\t{trailing}\n\t\t\t\t\t</Stack>\n\t\t\t\t)}\n\t\t\t</Stack>\n\t\t</div>\n\t);\n}\n\nexport function ResourceEmptyState(props: ResourceEmptyStateProps) {\n\treturn (\n\t\t<EmptyState\n\t\t\t{...props}\n\t\t\tdata-component=\"resource-empty-state\"\n\t\t\tdata-slot=\"resource-empty-state\"\n\t\t\tclassName={cn('resource-empty-state--component', props.className)}\n\t\t/>\n\t);\n}\n\nfunction ResourceShellFrame({\n\tchildren,\n\ttitle,\n\tdescription,\n\tactions,\n\tprimaryAction,\n\tsecondaryActions,\n\tmaxVisibleSecondaryActions,\n\tmoreActionsLabel,\n\trenderLink,\n\ttoolbar,\n\temptySlot,\n\tempty: emptyState = false,\n\tloading = false,\n\terror,\n\tonRetry,\n\tslots,\n\tclassName,\n\theaderClassName,\n\tcontentClassName,\n\tstrings: stringsProp,\n\tasideClassName,\n\tvariant,\n}: ResourceIndexShellProps & {\n\tasideClassName?: string;\n\tvariant: 'index' | 'show';\n}) {\n\tconst strings = useStrings(defaultResourceStrings, stringsProp);\n\tconst header =\n\t\tslots?.header ??\n\t\t(title ? (\n\t\t\t<ResourceHeader\n\t\t\t\ttitle={title}\n\t\t\t\tdescription={description}\n\t\t\t\tactions={actions}\n\t\t\t\tprimaryAction={primaryAction}\n\t\t\t\tsecondaryActions={secondaryActions}\n\t\t\t\tmaxVisibleSecondaryActions={maxVisibleSecondaryActions}\n\t\t\t\tmoreActionsLabel={moreActionsLabel}\n\t\t\t\trenderLink={renderLink}\n\t\t\t\tclassName={headerClassName}\n\t\t\t/>\n\t\t) : null);\n\tconst toolbarNode = slots?.toolbar ?? toolbar;\n\tconst loadingNode = slots?.loading ?? (\n\t\t<LoadingState\n\t\t\tvariant=\"panel\"\n\t\t\tlabel={strings.loadingLabel}\n\t\t\tdescription={strings.loadingDescription}\n\t\t\tskeleton\n\t\t\tlines={4}\n\t\t\tclassName=\"resource-shell--loading rounded-surface border border-border bg-card\"\n\t\t/>\n\t);\n\tconst emptyNode = slots?.empty ?? emptySlot ?? (\n\t\t<ResourceEmptyState title={strings.emptyTitle} description={strings.emptyDescription} border />\n\t);\n\tconst defaultErrorNode = (\n\t\t<ErrorState\n\t\t\ttitle={strings.errorTitle}\n\t\t\tdescription={\n\t\t\t\terror instanceof Error\n\t\t\t\t\t? error.message\n\t\t\t\t\t: typeof error === 'string' || typeof error === 'number'\n\t\t\t\t\t\t? String(error)\n\t\t\t\t\t\t: strings.errorDescription\n\t\t\t}\n\t\t\tonRetry={onRetry}\n\t\t\tretryLabel={strings.retryLabel}\n\t\t/>\n\t);\n\tconst errorNode =\n\t\tslots?.error ??\n\t\t(error &&\n\t\ttypeof error !== 'boolean' &&\n\t\ttypeof error !== 'string' &&\n\t\ttypeof error !== 'number' &&\n\t\t!(error instanceof Error)\n\t\t\t? error\n\t\t\t: defaultErrorNode);\n\tconst body = loading ? loadingNode : error ? errorNode : emptyState ? emptyNode : children;\n\n\treturn (\n\t\t<section\n\t\t\tdata-component={`resource-${variant}-shell`}\n\t\t\tdata-slot={`resource-${variant}-shell`}\n\t\t\tclassName={cn(\n\t\t\t\t`resource-${variant}-shell--component flex min-w-0 flex-col`, compositionClasses.subjects,\n\t\t\t\tvariant === 'index' && '@container/resource-index',\n\t\t\t\tvariant === 'show' && '@container/resource-show',\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t>\n\t\t\t{!!header && (\n\t\t\t\t<div data-slot={`resource-${variant}-header`} className={`resource-${variant}-shell--header`}>\n\t\t\t\t\t{header}\n\t\t\t\t</div>\n\t\t\t)}\n\t\t\t{!!toolbarNode && (\n\t\t\t\t<div data-slot={`resource-${variant}-toolbar`} className={`resource-${variant}-shell--toolbar`}>\n\t\t\t\t\t{toolbarNode}\n\t\t\t\t</div>\n\t\t\t)}\n\t\t\t<div\n\t\t\t\tdata-slot={`resource-${variant}-layout`}\n\t\t\t\tclassName={cn(\n\t\t\t\t\t`resource-${variant}-shell--layout grid min-w-0`, compositionClasses.subjects,\n\t\t\t\t\tslots?.aside &&\n\t\t\t\t\t\tvariant === 'show' &&\n\t\t\t\t\t\t'@4xl/resource-show:grid-cols-[minmax(0,1fr)_var(--shell-sidebar-width)]',\n\t\t\t\t\tslots?.aside &&\n\t\t\t\t\t\tvariant === 'index' &&\n\t\t\t\t\t\t'@4xl/resource-index:grid-cols-[minmax(0,1fr)_var(--shell-sidebar-width)]',\n\t\t\t\t)}\n\t\t\t>\n\t\t\t\t<Stack gap={compositionRhythm.subjects}>\n\t\t\t\t\t<div\n\t\t\t\t\t\tdata-slot={`resource-${variant}-content`}\n\t\t\t\t\t\tclassName={cn(`resource-${variant}-shell--content flex min-w-0 flex-col`, compositionClasses.subjects, contentClassName)}\n\t\t\t\t\t>\n\t\t\t\t\t\t{body}\n\t\t\t\t\t</div>\n\t\t\t\t\t{!!slots?.footer && (\n\t\t\t\t\t\t<div data-slot={`resource-${variant}-footer`} className={`resource-${variant}-shell--footer`}>\n\t\t\t\t\t\t\t{slots.footer}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t)}\n\t\t\t\t</Stack>\n\t\t\t\t{!!slots?.aside && (\n\t\t\t\t\t<aside\n\t\t\t\t\t\tdata-slot={`resource-${variant}-aside`}\n\t\t\t\t\t\tclassName={cn(`resource-${variant}-shell--aside flex min-w-0 flex-col`, compositionClasses.subjects, asideClassName)}\n\t\t\t\t\t>\n\t\t\t\t\t\t{slots.aside}\n\t\t\t\t\t</aside>\n\t\t\t\t)}\n\t\t\t</div>\n\t\t</section>\n\t);\n}\n\n/** @deprecated Use Page from themelia-react-ui/layout/page; PageHeader is available for embedded headers. */\nexport function ResourceIndexShell(props: ResourceIndexShellProps) {\n\treturn <ResourceShellFrame {...props} variant=\"index\" />;\n}\n\n/** @deprecated Use Page from themelia-react-ui/layout/page; PageHeader is available for embedded headers. */\nexport function ResourceShowShell(props: ResourceShowShellProps) {\n\treturn <ResourceShellFrame {...props} variant=\"show\" />;\n}\n\n/** @deprecated Use Page from themelia-react-ui/layout/page; PageHeader is available for embedded headers. */\nexport function TabbedResourceShell({\n\ttabs,\n\tactiveTab,\n\tonTabChange,\n\ttabsClassName,\n\tmoreLabel,\n\ttabsAriaLabel,\n\ttoolbar,\n\tslots,\n\tclassName,\n\tstrings: stringsProp,\n\t...props\n}: TabbedResourceShellProps) {\n\tconst strings = useStrings(defaultResourceStrings, stringsProp);\n\tconst toolbarNode = (\n\t\t<Stack gap=\"lg\" data-slot=\"tabbed-resource-toolbar\" className=\"tabbed-resource-shell--toolbar\">\n\t\t\t<OverflowTabBar\n\t\t\t\titems={tabs}\n\t\t\t\tvalue={activeTab}\n\t\t\t\tonValueChange={onTabChange}\n\t\t\t\tclassName={tabsClassName}\n\t\t\t\tstrings={{\n\t\t\t\t\tmore: moreLabel,\n\t\t\t\t\tnavigationLabel: tabsAriaLabel ?? strings.tabsAriaLabel,\n\t\t\t\t}}\n\t\t\t/>\n\t\t\t{toolbar}\n\t\t</Stack>\n\t);\n\n\treturn (\n\t\t<ResourceShowShell\n\t\t\t{...props}\n\t\t\tstrings={stringsProp}\n\t\t\tclassName={cn('tabbed-resource-shell--component', className)}\n\t\t\ttoolbar={toolbarNode}\n\t\t\tslots={{ ...slots, toolbar: slots?.toolbar ?? toolbarNode }}\n\t\t/>\n\t);\n}\n\nfunction ResourceCard({\n\ttitle,\n\tdescription,\n\tactions,\n\theaderAction,\n\tchildren,\n\tfooter,\n\tpadding = 'md',\n\tsurface = 'card',\n\tclassName,\n\tcontentClassName,\n\tname,\n}: ResourceDetailsSectionProps & { name: string }) {\n\treturn (\n\t\t<ContentBlock\n\t\t\tdata-component={name}\n\t\t\tdata-slot={name}\n\t\t\ttitle={title}\n\t\t\tdescription={description}\n\t\t\tactions={actions}\n\t\t\theaderAction={headerAction}\n\t\t\tfooterSlot={footer}\n\t\t\tpadding={padding}\n\t\t\tsurface={surface}\n\t\t\tclassName={cn(`${name}--component`, className)}\n\t\t\tcontentClassName={contentClassName}\n\t\t>\n\t\t\t{children}\n\t\t</ContentBlock>\n\t);\n}\n\nexport function ResourceDetailsSection({\n\tmetadata,\n\tmetadataColumns = 2,\n\tmetadataDense = false,\n\tbody,\n\thelp,\n\tchildren,\n\tcontentClassName,\n\t...props\n}: ResourceDetailsSectionProps) {\n\treturn (\n\t\t<ResourceCard\n\t\t\t{...props}\n\t\t\tname=\"resource-details-section\"\n\t\t\tcontentClassName={cn('resource-details-section--content grid gap-space-xl', contentClassName)}\n\t\t>\n\t\t\t{!!metadata?.length && (\n\t\t\t\t<MetadataList adaptTo=\"container\" items={metadata} columns={metadataColumns} density={metadataDense ? 'compact' : 'default'} />\n\t\t\t)}\n\t\t\t{body}\n\t\t\t{children}\n\t\t\t{!!help && (\n\t\t\t\t<Text size=\"xs\" type=\"secondary\" className=\"resource-details-section--help\">\n\t\t\t\t\t{help}\n\t\t\t\t</Text>\n\t\t\t)}\n\t\t</ResourceCard>\n\t);\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"resource.js","names":["Text","Stack","LoadingState","ErrorState","compositionRhythm","compositionClasses","Initials","IconBadge","AvatarFallback","Avatar","AvatarImage","ContentBlock","MetadataList","PageHeading","OverflowTabBar","EmptyState","defaultResourceStrings","ResourceHeader","Icon","icon","titleText","title","resolvedMedia","media","avatarUrl","avatarFallback","cn","mediaClassName","avatarAlt","iconTone","badges","metadata","className","ResourceActionBar","sticky","leading","children","trailing","ResourceEmptyState","props","ResourceShellFrame","emptyState","stringsProp","strings","useStrings","header","slots","headerClassName","toolbarNode","toolbar","loadingNode","emptyNode","emptySlot","defaultErrorNode","error","errorNode","body","loading","variant","contentClassName","asideClassName","ResourceIndexShell","ResourceShowShell","TabbedResourceShell","selectedTab","setSelectedTab","useState","defaultActiveTab","tabs","activeTab","id","onTabChange","tabsClassName","moreLabel","tabsAriaLabel","ResourceCard","name","footer","ResourceDetailsSection","metadataColumns","metadataDense","help"],"sources":["../../src/components/features/resource/resource.strings.ts","../../src/components/features/resource/resource.tsx"],"sourcesContent":["/** Default copy for state-aware resource workspace replacement states. */\nexport interface ResourceStrings {\n\tloadingLabel: string;\n\tloadingDescription: string;\n\temptyTitle: string;\n\temptyDescription: string;\n\terrorTitle: string;\n\terrorDescription: string;\n\tretryLabel: string;\n\ttabsAriaLabel: string;\n}\n\nexport const defaultResourceStrings: ResourceStrings = {\n\tloadingLabel: 'Loading resources',\n\tloadingDescription: 'Preparing the latest data for this view.',\n\temptyTitle: 'No resources found',\n\temptyDescription: 'There are no records available for this view.',\n\terrorTitle: 'Resources unavailable',\n\terrorDescription: 'The resource data could not be loaded.',\n\tretryLabel: 'Try again',\n\ttabsAriaLabel: 'Resource sections',\n};\n","/** State-aware resource workspace primitives for coordinated index/show surfaces. */\nimport { useState } from 'react';\n\nimport { ContentBlock, IconBadge } from '../../base/display';\nimport { Avatar, AvatarFallback, AvatarImage } from '../../base/avatar';\nimport { ErrorState, LoadingState } from '../../base/feedback';\nimport { MetadataList } from '../../base/metadata-list';\nimport { EmptyState } from '../../blocks/data-display';\nimport { OverflowTabBar, PageHeading } from '../../base/navigation';\nimport { Stack } from '../../base/structure';\nimport {compositionClasses, compositionRhythm} from '../../base/structure/composition.recipes';\nimport { Initials } from '../../primitives';\nimport { Text } from '../../typography';\nimport { useStrings } from '../../../lib/strings';\nimport { cn } from '../../../lib/utils';\n\nimport { defaultResourceStrings } from './resource.strings';\nimport type {\n\tResourceActionBarProps,\n\tResourceDetailsSectionProps,\n\tResourceEmptyStateProps,\n\tResourceHeaderProps,\n\tResourceIndexShellProps,\n\tResourceShowShellProps,\n\tTabbedResourceShellProps,\n} from './resource.types';\n\n/** @deprecated Use Page from themelia-react-ui/layout/page; PageHeader is available for embedded headers. */\nexport function ResourceHeader({\n\ttitle,\n\tdescription,\n\teyebrow,\n\tmedia,\n\tavatarUrl,\n\tavatarAlt,\n\tavatarFallback,\n\ticon,\n\ticonTone = 'neutral',\n\tbadges,\n\tmetadata,\n\tactions,\n\tprimaryAction,\n\tsecondaryActions,\n\tmaxVisibleSecondaryActions,\n\tmoreActionsLabel,\n\trenderLink,\n\tclassName,\n\tcontentClassName,\n\tmediaClassName,\n}: ResourceHeaderProps) {\n\tconst Icon = icon;\n\tconst titleText = typeof title === 'string' ? title : '';\n\tconst resolvedMedia =\n\t\tmedia ??\n\t\t(avatarUrl || avatarFallback ? (\n\t\t\t<Avatar className={cn('resource-header--avatar size-avatar-lg', mediaClassName)}>\n\t\t\t\t{!!avatarUrl && <AvatarImage src={avatarUrl} alt={avatarAlt ?? titleText} />}\n\t\t\t\t<AvatarFallback>{avatarFallback ?? <Initials value={titleText} strategy=\"first-words\" />}</AvatarFallback>\n\t\t\t</Avatar>\n\t\t) : Icon ? (\n\t\t\t<IconBadge\n\t\t\t\ticon={Icon}\n\t\t\t\tshape=\"square\"\n\t\t\t\ttone={iconTone}\n\t\t\t\tclassName={cn('resource-header--icon size-avatar-lg [&>svg]:size-icon-lg', mediaClassName)}\n\t\t\t/>\n\t\t) : null);\n\n\treturn (\n\t\t<PageHeading\n\t\t\teyebrow={eyebrow}\n\t\t\ttitle={title}\n\t\t\tdescription={description}\n\t\t\tleading={resolvedMedia}\n\t\t\ttitleSuffix={\n\t\t\t\tbadges ? (\n\t\t\t\t\t<Stack\n\t\t\t\t\t\tdata-slot=\"resource-header-badges\"\n\t\t\t\t\t\tdirection=\"horizontal\"\n\t\t\t\t\t\tgap=\"sm\"\n\t\t\t\t\t\tclassName=\"resource-header--badges shrink-0\"\n\t\t\t\t\t>\n\t\t\t\t\t\t{badges}\n\t\t\t\t\t</Stack>\n\t\t\t\t) : undefined\n\t\t\t}\n\t\t\tafterDescription={\n\t\t\t\tmetadata ? (\n\t\t\t\t\t<Stack\n\t\t\t\t\t\tdata-slot=\"resource-header-metadata\"\n\t\t\t\t\t\tdirection=\"horizontal\"\n\t\t\t\t\t\tgap=\"md\"\n\t\t\t\t\t\tclassName=\"resource-header--metadata mt-space-sm\"\n\t\t\t\t\t>\n\t\t\t\t\t\t{metadata}\n\t\t\t\t\t</Stack>\n\t\t\t\t) : undefined\n\t\t\t}\n\t\t\tactions={actions}\n\t\t\tprimaryAction={primaryAction}\n\t\t\tsecondaryActions={secondaryActions}\n\t\t\tmaxVisibleSecondaryActions={maxVisibleSecondaryActions}\n\t\t\tmoreActionsLabel={moreActionsLabel}\n\t\t\trenderLink={renderLink}\n\t\t\twithSeparator={false}\n\t\t\tclassName={cn('resource-header--component', className)}\n\t\t\tcontentClassName={contentClassName}\n\t\t\teyebrowClassName=\"resource-header--eyebrow\"\n\t\t\ttitleClassName=\"resource-header--title truncate\"\n\t\t\tdescriptionClassName=\"resource-header--description max-w-3xl\"\n\t\t\tactionsClassName=\"resource-header--actions flex-wrap\"\n\t\t/>\n\t);\n}\n\nexport function ResourceActionBar({ children, leading, trailing, sticky = false, className }: ResourceActionBarProps) {\n\treturn (\n\t\t<div\n\t\t\tdata-component=\"resource-action-bar\"\n\t\t\tdata-slot=\"resource-action-bar\"\n\t\t\tclassName={cn(\n\t\t\t\t'resource-action-bar--component box-border rounded-surface border border-border bg-card text-card-foreground px-surface py-row-y-lg shadow-xs',\n\t\t\t\tsticky && 'sticky top-shell-header z-30',\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t>\n\t\t\t<Stack\n\t\t\t\tdirection={{ base: 'vertical', sm: 'horizontal' }}\n\t\t\t\tgap=\"lg\"\n\t\t\t\talign={{ sm: 'center' }}\n\t\t\t\tjustify={{ sm: 'between' }}\n\t\t\t\twrap={{ sm: false }}\n\t\t\t\tclassName=\"resource-action-bar--layout\"\n\t\t\t>\n\t\t\t\t<Stack\n\t\t\t\t\tdata-slot=\"resource-action-leading\"\n\t\t\t\t\tdirection=\"horizontal\"\n\t\t\t\t\tgap=\"md\"\n\t\t\t\t\tclassName=\"resource-action-bar--leading flex-1\"\n\t\t\t\t>\n\t\t\t\t\t{leading ?? children}\n\t\t\t\t</Stack>\n\t\t\t\t{!!trailing && (\n\t\t\t\t\t<Stack\n\t\t\t\t\t\tdata-slot=\"resource-action-trailing\"\n\t\t\t\t\t\tdirection=\"horizontal\"\n\t\t\t\t\t\tgap=\"md\"\n\t\t\t\t\t\tclassName=\"resource-action-bar--trailing shrink-0\"\n\t\t\t\t\t>\n\t\t\t\t\t\t{trailing}\n\t\t\t\t\t</Stack>\n\t\t\t\t)}\n\t\t\t</Stack>\n\t\t</div>\n\t);\n}\n\nexport function ResourceEmptyState(props: ResourceEmptyStateProps) {\n\treturn (\n\t\t<EmptyState\n\t\t\t{...props}\n\t\t\tdata-component=\"resource-empty-state\"\n\t\t\tdata-slot=\"resource-empty-state\"\n\t\t\tclassName={cn('resource-empty-state--component', props.className)}\n\t\t/>\n\t);\n}\n\nfunction ResourceShellFrame({\n\tchildren,\n\ttitle,\n\tdescription,\n\tactions,\n\tprimaryAction,\n\tsecondaryActions,\n\tmaxVisibleSecondaryActions,\n\tmoreActionsLabel,\n\trenderLink,\n\ttoolbar,\n\temptySlot,\n\tempty: emptyState = false,\n\tloading = false,\n\terror,\n\tonRetry,\n\tslots,\n\tclassName,\n\theaderClassName,\n\tcontentClassName,\n\tstrings: stringsProp,\n\tasideClassName,\n\tvariant,\n}: ResourceIndexShellProps & {\n\tasideClassName?: string;\n\tvariant: 'index' | 'show';\n}) {\n\tconst strings = useStrings(defaultResourceStrings, stringsProp);\n\tconst header =\n\t\tslots?.header ??\n\t\t(title ? (\n\t\t\t<ResourceHeader\n\t\t\t\ttitle={title}\n\t\t\t\tdescription={description}\n\t\t\t\tactions={actions}\n\t\t\t\tprimaryAction={primaryAction}\n\t\t\t\tsecondaryActions={secondaryActions}\n\t\t\t\tmaxVisibleSecondaryActions={maxVisibleSecondaryActions}\n\t\t\t\tmoreActionsLabel={moreActionsLabel}\n\t\t\t\trenderLink={renderLink}\n\t\t\t\tclassName={headerClassName}\n\t\t\t/>\n\t\t) : null);\n\tconst toolbarNode = slots?.toolbar ?? toolbar;\n\tconst loadingNode = slots?.loading ?? (\n\t\t<LoadingState\n\t\t\tvariant=\"panel\"\n\t\t\tlabel={strings.loadingLabel}\n\t\t\tdescription={strings.loadingDescription}\n\t\t\tskeleton\n\t\t\tlines={4}\n\t\t\tclassName=\"resource-shell--loading rounded-surface border border-border bg-card\"\n\t\t/>\n\t);\n\tconst emptyNode = slots?.empty ?? emptySlot ?? (\n\t\t<ResourceEmptyState title={strings.emptyTitle} description={strings.emptyDescription} border />\n\t);\n\tconst defaultErrorNode = (\n\t\t<ErrorState\n\t\t\ttitle={strings.errorTitle}\n\t\t\tdescription={\n\t\t\t\terror instanceof Error\n\t\t\t\t\t? error.message\n\t\t\t\t\t: typeof error === 'string' || typeof error === 'number'\n\t\t\t\t\t\t? String(error)\n\t\t\t\t\t\t: strings.errorDescription\n\t\t\t}\n\t\t\tonRetry={onRetry}\n\t\t\tretryLabel={strings.retryLabel}\n\t\t/>\n\t);\n\tconst errorNode =\n\t\tslots?.error ??\n\t\t(error &&\n\t\ttypeof error !== 'boolean' &&\n\t\ttypeof error !== 'string' &&\n\t\ttypeof error !== 'number' &&\n\t\t!(error instanceof Error)\n\t\t\t? error\n\t\t\t: defaultErrorNode);\n\tconst body = loading ? loadingNode : error ? errorNode : emptyState ? emptyNode : children;\n\n\treturn (\n\t\t<section\n\t\t\tdata-component={`resource-${variant}-shell`}\n\t\t\tdata-slot={`resource-${variant}-shell`}\n\t\t\tclassName={cn(\n\t\t\t\t`resource-${variant}-shell--component flex min-w-0 flex-col`, compositionClasses.subjects,\n\t\t\t\tvariant === 'index' && '@container/resource-index',\n\t\t\t\tvariant === 'show' && '@container/resource-show',\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t>\n\t\t\t{!!header && (\n\t\t\t\t<div data-slot={`resource-${variant}-header`} className={`resource-${variant}-shell--header`}>\n\t\t\t\t\t{header}\n\t\t\t\t</div>\n\t\t\t)}\n\t\t\t{!!toolbarNode && (\n\t\t\t\t<div data-slot={`resource-${variant}-toolbar`} className={`resource-${variant}-shell--toolbar`}>\n\t\t\t\t\t{toolbarNode}\n\t\t\t\t</div>\n\t\t\t)}\n\t\t\t<div\n\t\t\t\tdata-slot={`resource-${variant}-layout`}\n\t\t\t\tclassName={cn(\n\t\t\t\t\t`resource-${variant}-shell--layout grid min-w-0`, compositionClasses.subjects,\n\t\t\t\t\tslots?.aside &&\n\t\t\t\t\t\tvariant === 'show' &&\n\t\t\t\t\t\t'@4xl/resource-show:grid-cols-[minmax(0,1fr)_var(--shell-sidebar-width)]',\n\t\t\t\t\tslots?.aside &&\n\t\t\t\t\t\tvariant === 'index' &&\n\t\t\t\t\t\t'@4xl/resource-index:grid-cols-[minmax(0,1fr)_var(--shell-sidebar-width)]',\n\t\t\t\t)}\n\t\t\t>\n\t\t\t\t<Stack gap={compositionRhythm.subjects}>\n\t\t\t\t\t<div\n\t\t\t\t\t\tdata-slot={`resource-${variant}-content`}\n\t\t\t\t\t\tclassName={cn(`resource-${variant}-shell--content flex min-w-0 flex-col`, compositionClasses.subjects, contentClassName)}\n\t\t\t\t\t>\n\t\t\t\t\t\t{body}\n\t\t\t\t\t</div>\n\t\t\t\t\t{!!slots?.footer && (\n\t\t\t\t\t\t<div data-slot={`resource-${variant}-footer`} className={`resource-${variant}-shell--footer`}>\n\t\t\t\t\t\t\t{slots.footer}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t)}\n\t\t\t\t</Stack>\n\t\t\t\t{!!slots?.aside && (\n\t\t\t\t\t<aside\n\t\t\t\t\t\tdata-slot={`resource-${variant}-aside`}\n\t\t\t\t\t\tclassName={cn(`resource-${variant}-shell--aside flex min-w-0 flex-col`, compositionClasses.subjects, asideClassName)}\n\t\t\t\t\t>\n\t\t\t\t\t\t{slots.aside}\n\t\t\t\t\t</aside>\n\t\t\t\t)}\n\t\t\t</div>\n\t\t</section>\n\t);\n}\n\n/** @deprecated Use Page from themelia-react-ui/layout/page; PageHeader is available for embedded headers. */\nexport function ResourceIndexShell(props: ResourceIndexShellProps) {\n\treturn <ResourceShellFrame {...props} variant=\"index\" />;\n}\n\n/** @deprecated Use Page from themelia-react-ui/layout/page; PageHeader is available for embedded headers. */\nexport function ResourceShowShell(props: ResourceShowShellProps) {\n\treturn <ResourceShellFrame {...props} variant=\"show\" />;\n}\n\n/** @deprecated Use Page from themelia-react-ui/layout/page; PageHeader is available for embedded headers. */\nexport function TabbedResourceShell({\n\ttabs,\n\tactiveTab,\n\tdefaultActiveTab,\n\tonTabChange,\n\ttabsClassName,\n\tmoreLabel,\n\ttabsAriaLabel,\n\ttoolbar,\n\tslots,\n\tclassName,\n\tstrings: stringsProp,\n\t...props\n}: TabbedResourceShellProps) {\n\tconst strings = useStrings(defaultResourceStrings, stringsProp);\n\tconst [selectedTab, setSelectedTab] = useState(defaultActiveTab);\n\tconst handleTabChange = (id: string) => {\n\t\t// A shell without an initial default has always left selection to its caller.\n\t\tif (activeTab === undefined && selectedTab !== undefined) setSelectedTab(id);\n\t\tonTabChange?.(id);\n\t};\n\n\tconst toolbarNode = (\n\t\t<Stack gap=\"lg\" data-slot=\"tabbed-resource-toolbar\" className=\"tabbed-resource-shell--toolbar\">\n\t\t\t<OverflowTabBar\n\t\t\t\titems={tabs}\n\t\t\t\tvalue={activeTab === undefined ? selectedTab : activeTab}\n\t\t\t\tonValueChange={handleTabChange}\n\t\t\t\tclassName={tabsClassName}\n\t\t\t\tstrings={{\n\t\t\t\t\tmore: moreLabel,\n\t\t\t\t\tnavigationLabel: tabsAriaLabel ?? strings.tabsAriaLabel,\n\t\t\t\t}}\n\t\t\t/>\n\t\t\t{toolbar}\n\t\t</Stack>\n\t);\n\n\treturn (\n\t\t<ResourceShowShell\n\t\t\t{...props}\n\t\t\tstrings={stringsProp}\n\t\t\tclassName={cn('tabbed-resource-shell--component', className)}\n\t\t\ttoolbar={toolbarNode}\n\t\t\tslots={{ ...slots, toolbar: slots?.toolbar ?? toolbarNode }}\n\t\t/>\n\t);\n}\n\nfunction ResourceCard({\n\ttitle,\n\tdescription,\n\tactions,\n\theaderAction,\n\tchildren,\n\tfooter,\n\tpadding = 'md',\n\tsurface = 'card',\n\tclassName,\n\tcontentClassName,\n\tname,\n}: ResourceDetailsSectionProps & { name: string }) {\n\treturn (\n\t\t<ContentBlock\n\t\t\tdata-component={name}\n\t\t\tdata-slot={name}\n\t\t\ttitle={title}\n\t\t\tdescription={description}\n\t\t\tactions={actions}\n\t\t\theaderAction={headerAction}\n\t\t\tfooterSlot={footer}\n\t\t\tpadding={padding}\n\t\t\tsurface={surface}\n\t\t\tclassName={cn(`${name}--component`, className)}\n\t\t\tcontentClassName={contentClassName}\n\t\t>\n\t\t\t{children}\n\t\t</ContentBlock>\n\t);\n}\n\nexport function ResourceDetailsSection({\n\tmetadata,\n\tmetadataColumns = 2,\n\tmetadataDense = false,\n\tbody,\n\thelp,\n\tchildren,\n\tcontentClassName,\n\t...props\n}: ResourceDetailsSectionProps) {\n\treturn (\n\t\t<ResourceCard\n\t\t\t{...props}\n\t\t\tname=\"resource-details-section\"\n\t\t\tcontentClassName={cn('resource-details-section--content grid gap-space-xl', contentClassName)}\n\t\t>\n\t\t\t{!!metadata?.length && (\n\t\t\t\t<MetadataList adaptTo=\"container\" items={metadata} columns={metadataColumns} density={metadataDense ? 'compact' : 'default'} />\n\t\t\t)}\n\t\t\t{body}\n\t\t\t{children}\n\t\t\t{!!help && (\n\t\t\t\t<Text size=\"xs\" type=\"secondary\" className=\"resource-details-section--help\">\n\t\t\t\t\t{help}\n\t\t\t\t</Text>\n\t\t\t)}\n\t\t</ResourceCard>\n\t);\n}\n"],"mappings":"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"}
|