admin-ui-starter-kit 0.1.0 → 0.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.agents/skills/component-library-rules/SKILL.md +19 -0
- package/.agents/skills/component-library-rules/references/components/base__metadata-list.md +2 -2
- package/.agents/skills/component-library-rules/references/import-paths.md +21 -0
- package/AGENTS.md +3 -1
- package/INTEGRATION.md +29 -2
- package/PUBLISHING.md +2 -0
- package/README.md +24 -0
- package/dist/_shared/accordion-CztqyaIN.js +130 -0
- package/dist/_shared/accordion-CztqyaIN.js.map +1 -0
- package/dist/_shared/accordion-D5uTCLCB.cjs +2 -0
- package/dist/_shared/accordion-D5uTCLCB.cjs.map +1 -0
- package/dist/_shared/action-menu-Yrj6VzFS.js +96 -0
- package/dist/_shared/action-menu-Yrj6VzFS.js.map +1 -0
- package/dist/_shared/action-menu-eVP8GGlv.cjs +2 -0
- package/dist/_shared/action-menu-eVP8GGlv.cjs.map +1 -0
- package/dist/_shared/ai-artifact-DaHXJTKg.cjs +3 -0
- package/dist/_shared/ai-artifact-DaHXJTKg.cjs.map +1 -0
- package/dist/_shared/ai-artifact-DyLn3JAs.js +1068 -0
- package/dist/_shared/ai-artifact-DyLn3JAs.js.map +1 -0
- package/dist/_shared/alert-BVw4Mq6H.js +48 -0
- package/dist/_shared/alert-BVw4Mq6H.js.map +1 -0
- package/dist/_shared/alert-DXSlR9ja.cjs +2 -0
- package/dist/_shared/alert-DXSlR9ja.cjs.map +1 -0
- package/dist/_shared/avatar-CpBz9pTv.js +52 -0
- package/dist/_shared/avatar-CpBz9pTv.js.map +1 -0
- package/dist/_shared/avatar-dg20YFFs.cjs +2 -0
- package/dist/_shared/avatar-dg20YFFs.cjs.map +1 -0
- package/dist/_shared/badge-BVCh_hfL.js +108 -0
- package/dist/_shared/badge-BVCh_hfL.js.map +1 -0
- package/dist/_shared/badge-C49SSz-6.cjs +2 -0
- package/dist/_shared/badge-C49SSz-6.cjs.map +1 -0
- package/dist/_shared/breadcrumbs-Bo7j5Rhv.cjs +2 -0
- package/dist/_shared/breadcrumbs-Bo7j5Rhv.cjs.map +1 -0
- package/dist/_shared/breadcrumbs-Dc93fqqE.js +111 -0
- package/dist/_shared/breadcrumbs-Dc93fqqE.js.map +1 -0
- package/dist/_shared/button-2xglT7yf.cjs +2 -0
- package/dist/_shared/button-2xglT7yf.cjs.map +1 -0
- package/dist/_shared/button-ChCkwoOD.js +176 -0
- package/dist/_shared/button-ChCkwoOD.js.map +1 -0
- package/dist/_shared/button-D0nF99a9.cjs +2 -0
- package/dist/_shared/button-D0nF99a9.cjs.map +1 -0
- package/dist/_shared/button-DBR4QI9E.js +46 -0
- package/dist/_shared/button-DBR4QI9E.js.map +1 -0
- package/dist/_shared/buttons-Bcnt1md_.js +143 -0
- package/dist/_shared/buttons-Bcnt1md_.js.map +1 -0
- package/dist/_shared/buttons-km9xqXJv.cjs +2 -0
- package/dist/_shared/buttons-km9xqXJv.cjs.map +1 -0
- package/dist/_shared/card-radio-group-BGH93O5-.js +158 -0
- package/dist/_shared/card-radio-group-BGH93O5-.js.map +1 -0
- package/dist/_shared/card-radio-group-Vq741uhL.cjs +2 -0
- package/dist/_shared/card-radio-group-Vq741uhL.cjs.map +1 -0
- package/dist/_shared/combobox-BgXAxjU2.js +746 -0
- package/dist/_shared/combobox-BgXAxjU2.js.map +1 -0
- package/dist/_shared/combobox-DuIyh3xJ.cjs +2 -0
- package/dist/_shared/combobox-DuIyh3xJ.cjs.map +1 -0
- package/dist/_shared/command-BbiijN61.js +39 -0
- package/dist/_shared/command-BbiijN61.js.map +1 -0
- package/dist/_shared/command-D7zTvyBJ.cjs +2 -0
- package/dist/_shared/command-D7zTvyBJ.cjs.map +1 -0
- package/dist/_shared/command-DGNtTI-V.cjs +2 -0
- package/dist/_shared/command-DGNtTI-V.cjs.map +1 -0
- package/dist/_shared/command-jKbwFRtS.js +123 -0
- package/dist/_shared/command-jKbwFRtS.js.map +1 -0
- package/dist/_shared/comments-CNUsdwGW.cjs +2 -0
- package/dist/_shared/comments-CNUsdwGW.cjs.map +1 -0
- package/dist/_shared/comments-CvmS7zG3.js +945 -0
- package/dist/_shared/comments-CvmS7zG3.js.map +1 -0
- package/dist/_shared/containers-BFDv7cCV.cjs +2 -0
- package/dist/_shared/containers-BFDv7cCV.cjs.map +1 -0
- package/dist/_shared/containers-C1-A_2PT.js +19 -0
- package/dist/_shared/containers-C1-A_2PT.js.map +1 -0
- package/dist/_shared/content-container-CwqFnaI0.cjs +2 -0
- package/dist/_shared/content-container-CwqFnaI0.cjs.map +1 -0
- package/dist/_shared/content-container-D_3JGBSc.js +33 -0
- package/dist/_shared/content-container-D_3JGBSc.js.map +1 -0
- package/dist/_shared/copyable-CHhCGMfW.js +38 -0
- package/dist/_shared/copyable-CHhCGMfW.js.map +1 -0
- package/dist/_shared/copyable-ndaiocYq.cjs +2 -0
- package/dist/_shared/copyable-ndaiocYq.cjs.map +1 -0
- package/dist/_shared/date-picker-B8O_qbik.js +1353 -0
- package/dist/_shared/date-picker-B8O_qbik.js.map +1 -0
- package/dist/_shared/date-picker-BnOjyuKS.cjs +2 -0
- package/dist/_shared/date-picker-BnOjyuKS.cjs.map +1 -0
- package/dist/_shared/date-pickers-Cas9cPlj.js +330 -0
- package/dist/_shared/date-pickers-Cas9cPlj.js.map +1 -0
- package/dist/_shared/date-pickers-Dk-G3RMy.cjs +2 -0
- package/dist/_shared/date-pickers-Dk-G3RMy.cjs.map +1 -0
- package/dist/_shared/dialog-67GmkMLC.js +101 -0
- package/dist/_shared/dialog-67GmkMLC.js.map +1 -0
- package/dist/_shared/dialog-BF_4uAhE.cjs +2 -0
- package/dist/_shared/dialog-BF_4uAhE.cjs.map +1 -0
- package/dist/_shared/display-B9xVWboG.cjs +8 -0
- package/dist/_shared/display-B9xVWboG.cjs.map +1 -0
- package/dist/_shared/display-BM_GxDAo.js +1237 -0
- package/dist/_shared/display-BM_GxDAo.js.map +1 -0
- package/dist/_shared/dropdown-menu-4nxEBMnd.js +147 -0
- package/dist/_shared/dropdown-menu-4nxEBMnd.js.map +1 -0
- package/dist/_shared/dropdown-menu-DZlWHqWS.cjs +2 -0
- package/dist/_shared/dropdown-menu-DZlWHqWS.cjs.map +1 -0
- package/dist/_shared/form-field-BQlki-8s.js +319 -0
- package/dist/_shared/form-field-BQlki-8s.js.map +1 -0
- package/dist/_shared/form-field-DzpwVS99.cjs +2 -0
- package/dist/_shared/form-field-DzpwVS99.cjs.map +1 -0
- package/dist/_shared/form-sizing-CcbB-OHF.js +21 -0
- package/dist/_shared/form-sizing-CcbB-OHF.js.map +1 -0
- package/dist/_shared/form-sizing-Cw12UeI6.cjs +2 -0
- package/dist/_shared/form-sizing-Cw12UeI6.cjs.map +1 -0
- package/dist/_shared/format-B2AdSQVn.cjs +2 -0
- package/dist/_shared/format-B2AdSQVn.cjs.map +1 -0
- package/dist/_shared/format-CP65h1vK.js +48 -0
- package/dist/_shared/format-CP65h1vK.js.map +1 -0
- package/dist/_shared/forms-B8aaNG44.cjs +2 -0
- package/dist/_shared/forms-B8aaNG44.cjs.map +1 -0
- package/dist/_shared/forms-BusuTZZ2.js +3374 -0
- package/dist/_shared/forms-BusuTZZ2.js.map +1 -0
- package/dist/_shared/header-DWfOUjFL.cjs +2 -0
- package/dist/_shared/header-DWfOUjFL.cjs.map +1 -0
- package/dist/_shared/header-KpdoLtP9.js +369 -0
- package/dist/_shared/header-KpdoLtP9.js.map +1 -0
- package/dist/_shared/heading-BprqyzDs.js +39 -0
- package/dist/_shared/heading-BprqyzDs.js.map +1 -0
- package/dist/_shared/heading-mZc_jan1.cjs +2 -0
- package/dist/_shared/heading-mZc_jan1.cjs.map +1 -0
- package/dist/_shared/hooks-C-uWoRq5.cjs +2 -0
- package/dist/_shared/hooks-C-uWoRq5.cjs.map +1 -0
- package/dist/_shared/hooks-D5HJtvvP.js +118 -0
- package/dist/_shared/hooks-D5HJtvvP.js.map +1 -0
- package/dist/_shared/icon-badge-BBqDyAUz.cjs +2 -0
- package/dist/_shared/icon-badge-BBqDyAUz.cjs.map +1 -0
- package/dist/_shared/icon-badge-Bi63T-bj.js +52 -0
- package/dist/_shared/icon-badge-Bi63T-bj.js.map +1 -0
- package/dist/_shared/input-B2YXTHqz.cjs +2 -0
- package/dist/_shared/input-B2YXTHqz.cjs.map +1 -0
- package/dist/_shared/input-BJb10xb9.cjs +2 -0
- package/dist/_shared/input-BJb10xb9.cjs.map +1 -0
- package/dist/_shared/input-CZxP5Xgj.js +17 -0
- package/dist/_shared/input-CZxP5Xgj.js.map +1 -0
- package/dist/_shared/input-DQahu2sm.js +182 -0
- package/dist/_shared/input-DQahu2sm.js.map +1 -0
- package/dist/_shared/item-Cu5JbZyZ.js +224 -0
- package/dist/_shared/item-Cu5JbZyZ.js.map +1 -0
- package/dist/_shared/item-Cx_7QZ2o.cjs +2 -0
- package/dist/_shared/item-Cx_7QZ2o.cjs.map +1 -0
- package/dist/_shared/mentions-CS3rIhze.js +493 -0
- package/dist/_shared/mentions-CS3rIhze.js.map +1 -0
- package/dist/_shared/mentions-D7gnP3Nf.cjs +2 -0
- package/dist/_shared/mentions-D7gnP3Nf.cjs.map +1 -0
- package/dist/_shared/metadata-CRsVWE8Y.cjs +2 -0
- package/dist/_shared/metadata-CRsVWE8Y.cjs.map +1 -0
- package/dist/_shared/metadata-CfG0FdFZ.js +236 -0
- package/dist/_shared/metadata-CfG0FdFZ.js.map +1 -0
- package/dist/_shared/money-display-Bd0rkjc9.js +198 -0
- package/dist/_shared/money-display-Bd0rkjc9.js.map +1 -0
- package/dist/_shared/money-display-DSFft9Mi.cjs +2 -0
- package/dist/_shared/money-display-DSFft9Mi.cjs.map +1 -0
- package/dist/_shared/navigation-Do9k5Xh1.js +420 -0
- package/dist/_shared/navigation-Do9k5Xh1.js.map +1 -0
- package/dist/_shared/navigation-QAAD3HJd.cjs +2 -0
- package/dist/_shared/navigation-QAAD3HJd.cjs.map +1 -0
- package/dist/_shared/overlays-B8AH8fNv.js +633 -0
- package/dist/_shared/overlays-B8AH8fNv.js.map +1 -0
- package/dist/_shared/overlays-DOcoRy8k.cjs +2 -0
- package/dist/_shared/overlays-DOcoRy8k.cjs.map +1 -0
- package/dist/_shared/page-BPCeKX9X.js +263 -0
- package/dist/_shared/page-BPCeKX9X.js.map +1 -0
- package/dist/_shared/page-DMM32sxi.cjs +2 -0
- package/dist/_shared/page-DMM32sxi.cjs.map +1 -0
- package/dist/_shared/popover-B1f_EUQS.cjs +2 -0
- package/dist/_shared/popover-B1f_EUQS.cjs.map +1 -0
- package/dist/_shared/popover-CgRGcFk9.js +83 -0
- package/dist/_shared/popover-CgRGcFk9.js.map +1 -0
- package/dist/_shared/popover-menu-BEKIT3LR.cjs +2 -0
- package/dist/_shared/popover-menu-BEKIT3LR.cjs.map +1 -0
- package/dist/_shared/popover-menu-BHdHLEVL.js +95 -0
- package/dist/_shared/popover-menu-BHdHLEVL.js.map +1 -0
- package/dist/_shared/rich-text-editor-0uoIoYXU.js +608 -0
- package/dist/_shared/rich-text-editor-0uoIoYXU.js.map +1 -0
- package/dist/_shared/rich-text-editor-wTiARGuB.cjs +2 -0
- package/dist/_shared/rich-text-editor-wTiARGuB.cjs.map +1 -0
- package/dist/_shared/scroll-area-Bo17wtZD.cjs +2 -0
- package/dist/_shared/scroll-area-Bo17wtZD.cjs.map +1 -0
- package/dist/_shared/scroll-area-Cj-hmB5D.js +41 -0
- package/dist/_shared/scroll-area-Cj-hmB5D.js.map +1 -0
- package/dist/_shared/select-07RRiTWc.js +85 -0
- package/dist/_shared/select-07RRiTWc.js.map +1 -0
- package/dist/_shared/select-BfiU7a4n.cjs +2 -0
- package/dist/_shared/select-BfiU7a4n.cjs.map +1 -0
- package/dist/_shared/separator-CN9zAJfs.cjs +2 -0
- package/dist/_shared/separator-CN9zAJfs.cjs.map +1 -0
- package/dist/_shared/separator-DR0uUMKa.js +16 -0
- package/dist/_shared/separator-DR0uUMKa.js.map +1 -0
- package/dist/_shared/sheet-B5FoGJAZ.cjs +2 -0
- package/dist/_shared/sheet-B5FoGJAZ.cjs.map +1 -0
- package/dist/_shared/sheet-cUI8cypP.js +100 -0
- package/dist/_shared/sheet-cUI8cypP.js.map +1 -0
- package/dist/_shared/sidebar-Bq7yKLrG.cjs +2 -0
- package/dist/_shared/sidebar-Bq7yKLrG.cjs.map +1 -0
- package/dist/_shared/sidebar-Da20tCUc.cjs +2 -0
- package/dist/_shared/sidebar-Da20tCUc.cjs.map +1 -0
- package/dist/_shared/sidebar-Q6TYE8Ux.js +371 -0
- package/dist/_shared/sidebar-Q6TYE8Ux.js.map +1 -0
- package/dist/_shared/sidebar-WmnQ55YY.js +537 -0
- package/dist/_shared/sidebar-WmnQ55YY.js.map +1 -0
- package/dist/_shared/skeleton-B3HWEc6G.js +14 -0
- package/dist/_shared/skeleton-B3HWEc6G.js.map +1 -0
- package/dist/_shared/skeleton-Cz_l8-fc.cjs +2 -0
- package/dist/_shared/skeleton-Cz_l8-fc.cjs.map +1 -0
- package/dist/_shared/slot-BgnZtKR5.js +18 -0
- package/dist/_shared/slot-BgnZtKR5.js.map +1 -0
- package/dist/_shared/slot-Dac1ipUC.cjs +2 -0
- package/dist/_shared/slot-Dac1ipUC.cjs.map +1 -0
- package/dist/_shared/smart-card-Bm_VxYUG.cjs +2 -0
- package/dist/_shared/smart-card-Bm_VxYUG.cjs.map +1 -0
- package/dist/_shared/smart-card-MT6JjkoI.js +360 -0
- package/dist/_shared/smart-card-MT6JjkoI.js.map +1 -0
- package/dist/_shared/spinner-BQjxJ_Kx.js +67 -0
- package/dist/_shared/spinner-BQjxJ_Kx.js.map +1 -0
- package/dist/_shared/spinner-Dvaa6GUm.cjs +2 -0
- package/dist/_shared/spinner-Dvaa6GUm.cjs.map +1 -0
- package/dist/_shared/switch-C0yyhsXZ.js +51 -0
- package/dist/_shared/switch-C0yyhsXZ.js.map +1 -0
- package/dist/_shared/switch-DozkSQNn.cjs +2 -0
- package/dist/_shared/switch-DozkSQNn.cjs.map +1 -0
- package/dist/_shared/textarea-Cgl-FPwu.js +119 -0
- package/dist/_shared/textarea-Cgl-FPwu.js.map +1 -0
- package/dist/_shared/textarea-D8wC0XlZ.cjs +2 -0
- package/dist/_shared/textarea-D8wC0XlZ.cjs.map +1 -0
- package/dist/_shared/tooltip-Cws4BiPT.js +49 -0
- package/dist/_shared/tooltip-Cws4BiPT.js.map +1 -0
- package/dist/_shared/tooltip-DyUi-Tac.cjs +2 -0
- package/dist/_shared/tooltip-DyUi-Tac.cjs.map +1 -0
- package/dist/_shared/typography-BW7iZBx7.cjs +2 -0
- package/dist/_shared/typography-BW7iZBx7.cjs.map +1 -0
- package/dist/_shared/typography-a3hydyvI.js +102 -0
- package/dist/_shared/typography-a3hydyvI.js.map +1 -0
- package/dist/components/base/accordion/index.cjs +1 -1
- package/dist/components/base/accordion/index.js +1 -1
- package/dist/components/base/badge/index.cjs +1 -1
- package/dist/components/base/badge/index.js +1 -1
- package/dist/components/base/buttons/index.cjs +1 -1
- package/dist/components/base/buttons/index.js +2 -2
- package/dist/components/base/cards/index.cjs +1 -1
- package/dist/components/base/cards/index.js +1 -1
- package/dist/components/base/combobox/index.cjs +1 -1
- package/dist/components/base/combobox/index.js +1 -1
- package/dist/components/base/command/index.cjs +1 -1
- package/dist/components/base/command/index.js +2 -2
- package/dist/components/base/copyable/index.cjs +1 -1
- package/dist/components/base/copyable/index.js +1 -1
- package/dist/components/base/currency/index.cjs +1 -1
- package/dist/components/base/currency/index.js +1 -1
- package/dist/components/base/date-pickers/index.cjs +1 -1
- package/dist/components/base/date-pickers/index.js +2 -2
- package/dist/components/base/display/index.cjs +1 -1
- package/dist/components/base/display/index.js +12 -11
- package/dist/components/base/display/metadata/index.cjs +1 -0
- package/dist/components/base/display/metadata/index.js +2 -0
- package/dist/components/base/event-calendar/index.cjs +1 -1
- package/dist/components/base/event-calendar/index.cjs.map +1 -1
- package/dist/components/base/event-calendar/index.js +4 -4
- package/dist/components/base/forms/index.cjs +1 -1
- package/dist/components/base/forms/index.js +6 -6
- package/dist/components/base/item/index.cjs +1 -1
- package/dist/components/base/item/index.js +1 -1
- package/dist/components/base/map/index.cjs +1 -1
- package/dist/components/base/map/index.js +3 -3
- package/dist/components/base/navigation/index.cjs +1 -1
- package/dist/components/base/navigation/index.js +4 -4
- package/dist/components/base/popover/index.cjs +1 -1
- package/dist/components/base/popover/index.js +1 -1
- package/dist/components/base/popover-menu/index.cjs +1 -1
- package/dist/components/base/popover-menu/index.js +1 -1
- package/dist/components/base/sheet/index.cjs +1 -1
- package/dist/components/base/sheet/index.js +1 -1
- package/dist/components/base/sidebar/index.cjs +1 -1
- package/dist/components/base/sidebar/index.js +1 -1
- package/dist/components/base/spinner/index.cjs +1 -1
- package/dist/components/base/spinner/index.js +1 -1
- package/dist/components/base/table/index.cjs +1 -1
- package/dist/components/base/table/index.js +7 -7
- package/dist/components/composed/admin/index.cjs +1 -1
- package/dist/components/composed/admin/index.cjs.map +1 -1
- package/dist/components/composed/admin/index.js +12 -12
- package/dist/components/composed/ai/index.cjs +1 -1
- package/dist/components/composed/ai/index.js +9 -9
- package/dist/components/composed/analytics/index.cjs +1 -1
- package/dist/components/composed/analytics/index.cjs.map +1 -1
- package/dist/components/composed/analytics/index.js +4 -4
- package/dist/components/composed/cards/index.cjs +1 -1
- package/dist/components/composed/cards/index.cjs.map +1 -1
- package/dist/components/composed/cards/index.js +8 -8
- package/dist/components/composed/commerce/index.cjs +1 -1
- package/dist/components/composed/commerce/index.cjs.map +1 -1
- package/dist/components/composed/commerce/index.js +9 -9
- package/dist/components/composed/dark-surfaces/index.cjs +1 -1
- package/dist/components/composed/dark-surfaces/index.cjs.map +1 -1
- package/dist/components/composed/dark-surfaces/index.js +6 -6
- package/dist/components/composed/data-display/index.cjs +1 -1
- package/dist/components/composed/data-display/index.cjs.map +1 -1
- package/dist/components/composed/data-display/index.js +7 -7
- package/dist/components/composed/navigation/index.cjs +1 -1
- package/dist/components/composed/navigation/index.js +4 -4
- package/dist/components/composed/onboarding/index.cjs +1 -1
- package/dist/components/composed/onboarding/index.js +2 -2
- package/dist/components/composed/timelines/index.cjs +1 -1
- package/dist/components/composed/timelines/index.js +2 -2
- package/dist/components/features/activities/index.cjs +1 -1
- package/dist/components/features/activities/index.js +4 -4
- package/dist/components/features/ai-chat/index.cjs +1 -1
- package/dist/components/features/ai-chat/index.cjs.map +1 -1
- package/dist/components/features/ai-chat/index.js +6 -6
- package/dist/components/features/card/index.cjs +1 -1
- package/dist/components/features/card/index.js +3 -3
- package/dist/components/features/comments/index.cjs +1 -1
- package/dist/components/features/comments/index.js +2 -2
- package/dist/components/features/event-log/index.cjs +1 -1
- package/dist/components/features/event-log/index.js +3 -3
- package/dist/components/features/filters/index.cjs +1 -1
- package/dist/components/features/filters/index.js +9 -9
- package/dist/components/features/global-search/index.cjs +1 -1
- package/dist/components/features/global-search/index.js +2 -2
- package/dist/components/features/kanban/index.cjs +1 -1
- package/dist/components/features/kanban/index.js +1 -1
- package/dist/components/features/mentions/index.cjs +1 -1
- package/dist/components/features/mentions/index.js +1 -1
- package/dist/components/features/overlays/index.cjs +1 -1
- package/dist/components/features/overlays/index.js +1 -1
- package/dist/components/features/rich-text-editor/index.cjs +1 -1
- package/dist/components/features/rich-text-editor/index.js +1 -1
- package/dist/components/features/suggestions/index.cjs +1 -1
- package/dist/components/features/suggestions/index.js +1 -1
- package/dist/components/features/sync/index.cjs +1 -1
- package/dist/components/features/sync/index.js +2 -2
- package/dist/components/layout/containers/index.cjs +1 -1
- package/dist/components/layout/containers/index.js +2 -2
- package/dist/components/layout/header/index.cjs +1 -1
- package/dist/components/layout/header/index.js +1 -1
- package/dist/components/layout/hooks/index.cjs +1 -1
- package/dist/components/layout/hooks/index.js +1 -1
- package/dist/components/layout/index.cjs +1 -1
- package/dist/components/layout/index.js +6 -6
- package/dist/components/layout/page/index.cjs +1 -1
- package/dist/components/layout/page/index.js +1 -1
- package/dist/components/layout/sidebar/index.cjs +1 -1
- package/dist/components/layout/sidebar/index.js +2 -2
- package/dist/components/typography/index.cjs +1 -1
- package/dist/components/typography/index.js +3 -2
- package/dist/showcase/assets/AreaChart-CJ57G5Ub.js +6 -0
- package/dist/showcase/assets/CSPContext-BA7DfnCI.js +1 -0
- package/dist/showcase/assets/CompositeItem-PwzgE4va.js +1 -0
- package/dist/showcase/assets/CompositeRoot-Du4CMlK7.js +1 -0
- package/dist/showcase/assets/DialogTrigger-FkENgwo6.js +1 -0
- package/dist/showcase/assets/FormContext-ChygLayp.js +1 -0
- package/dist/showcase/assets/PreviewLayout-z6vpJJGt.js +1 -0
- package/dist/showcase/assets/RadioGroup-CcDmbxOw.js +1 -0
- package/dist/showcase/assets/Separator-Dk4eN76U.js +1 -0
- package/dist/showcase/assets/ToolbarRootContext-D_KAA5hZ.js +1 -0
- package/dist/showcase/assets/accordion-dQszzfmw.js +172 -0
- package/dist/showcase/assets/accordion-variants-Dp4wxic-.js +1 -0
- package/dist/showcase/assets/action-menu-CBi2Eiy0.js +1 -0
- package/dist/showcase/assets/activities-DoXsgP4G.js +501 -0
- package/dist/showcase/assets/activities-feed-card-xz5FtkOm.js +1 -0
- package/dist/showcase/assets/admin-CxklUqAG.js +80 -0
- package/dist/showcase/assets/ai-artifact-DkhUdEbM.js +2 -0
- package/dist/showcase/assets/ai-chat-B6PuqkEu.js +568 -0
- package/dist/showcase/assets/ai-elements-D_rpj_ds.js +379 -0
- package/dist/showcase/assets/ai-new-CUPrAbOK.js +167 -0
- package/dist/showcase/assets/ai-tool-call-CEr-dGVx.js +1 -0
- package/dist/showcase/assets/ai-zxF_msJF.js +41 -0
- package/dist/showcase/assets/alert-771BE3Ny.js +59 -0
- package/dist/showcase/assets/alert-CG42DAlX.js +1 -0
- package/dist/showcase/assets/api-key-list-D6jUN7Fq.js +73 -0
- package/dist/showcase/assets/arrow-down-CUoXUyN1.js +1 -0
- package/dist/showcase/assets/arrow-left-Cdq69X6h.js +1 -0
- package/dist/showcase/assets/arrow-right-i25q9L2H.js +1 -0
- package/dist/showcase/assets/arrow-up-pnezegnF.js +1 -0
- package/dist/showcase/assets/arrow-up-right-CK3XnMah.js +1 -0
- package/dist/showcase/assets/avatar-LPmQqZQv.js +1 -0
- package/dist/showcase/assets/avatar-ZVFIQouy.js +57 -0
- package/dist/showcase/assets/badge-DK4bsgZC.js +28 -0
- package/dist/showcase/assets/badge-check-Cw5gkVcG.js +1 -0
- package/dist/showcase/assets/bell-BvJELoaV.js +1 -0
- package/dist/showcase/assets/bot-DRj6sdSR.js +1 -0
- package/dist/showcase/assets/box-BNND3M2m.js +1 -0
- package/dist/showcase/assets/brain-Cy3o-12l.js +1 -0
- package/dist/showcase/assets/brand-DvipEpFn.js +40 -0
- package/dist/showcase/assets/breadcrumb-B-LNuOyv.js +1 -0
- package/dist/showcase/assets/breadcrumb-Lzpc0yo4.js +52 -0
- package/dist/showcase/assets/breadcrumbs-DD6msKFZ.js +1 -0
- package/dist/showcase/assets/briefcase-LcAwoEmu.js +1 -0
- package/dist/showcase/assets/button-CuwcGzk1.js +44 -0
- package/dist/showcase/assets/button-group-CAImjDrl.js +1 -0
- package/dist/showcase/assets/buttons-DTjNHCMl.js +259 -0
- package/dist/showcase/assets/calendar-B1zW0q6I.js +1 -0
- package/dist/showcase/assets/calendar-Dlv72ytt.js +1 -0
- package/dist/showcase/assets/calendar-ls2A08Pn.js +16 -0
- package/dist/showcase/assets/card-BhtkM1BT.js +1 -0
- package/dist/showcase/assets/cards-BRpRXzGk.js +328 -0
- package/dist/showcase/assets/chart-column-BpQkEi1H.js +1 -0
- package/dist/showcase/assets/chevron-down-DyObdfSb.js +1 -0
- package/dist/showcase/assets/chevron-left-T7dHNxYM.js +1 -0
- package/dist/showcase/assets/chevron-right-D_EcqHpT.js +1 -0
- package/dist/showcase/assets/chevron-up-B38ivdGO.js +1 -0
- package/dist/showcase/assets/chevrons-up-down-SdRARzoq.js +1 -0
- package/dist/showcase/assets/circle-BrCPAmDA.js +1 -0
- package/dist/showcase/assets/circle-alert-DdhzLPY_.js +1 -0
- package/dist/showcase/assets/circle-check-DlA6zidQ.js +1 -0
- package/dist/showcase/assets/circle-check-big-DFGJANQF.js +1 -0
- package/dist/showcase/assets/circle-dot-BKmnVUqM.js +1 -0
- package/dist/showcase/assets/circle-question-mark-BNREvgVC.js +1 -0
- package/dist/showcase/assets/circle-x-C45QjHEs.js +1 -0
- package/dist/showcase/assets/clock-D1nKQzQo.js +1 -0
- package/dist/showcase/assets/code-xml-B8N3GRSu.js +1 -0
- package/dist/showcase/assets/collapsible-4TfcWyNs.js +1 -0
- package/dist/showcase/assets/collapsible-CKbZtvTj.js +27 -0
- package/dist/showcase/assets/combobox-DTdGPaU0.js +622 -0
- package/dist/showcase/assets/command-DymTXwL1.js +1 -0
- package/dist/showcase/assets/command-ksVIHQKJ.js +45 -0
- package/dist/showcase/assets/comment-composer-DC9oS1Yy.js +1 -0
- package/dist/showcase/assets/comment-item-CAmKnJa7.js +1 -0
- package/dist/showcase/assets/comments-Benk-2mV.js +349 -0
- package/dist/showcase/assets/commerce-Qz-mq8mQ.js +78 -0
- package/dist/showcase/assets/commerce-extras-CQRc3Bna.js +179 -0
- package/dist/showcase/assets/composite-DBDXLPyz.js +1 -0
- package/dist/showcase/assets/contact-card-DkL2nI3r.js +65 -0
- package/dist/showcase/assets/content-container-mRm6oJEa.js +1 -0
- package/dist/showcase/assets/copyable-DmLlmwzy.js +96 -0
- package/dist/showcase/assets/course-card-CJJoeZj9.js +113 -0
- package/dist/showcase/assets/cpu-BXJnF2Xy.js +1 -0
- package/dist/showcase/assets/credit-card-BQK3KKb2.js +1 -0
- package/dist/showcase/assets/currency-DBPUh8ee.js +149 -0
- package/dist/showcase/assets/dark-surfaces-LpPuIeYy.js +90 -0
- package/dist/showcase/assets/database-BZerpzGE.js +1 -0
- package/dist/showcase/assets/date-block-iiHUpbNX.js +1 -0
- package/dist/showcase/assets/date-picker-BQeBGL7T.js +1 -0
- package/dist/showcase/assets/date-pickers-CKcUEMMF.js +110 -0
- package/dist/showcase/assets/dense-info-DATmxRU8.js +106 -0
- package/dist/showcase/assets/dialog-Bqu5KDYH.js +1 -0
- package/dist/showcase/assets/display-Bj7uPXD4.js +392 -0
- package/dist/showcase/assets/dist-QK7JxeYv.js +1 -0
- package/dist/showcase/assets/dollar-sign-DFZs6vfz.js +1 -0
- package/dist/showcase/assets/download-5oGw_WbW.js +1 -0
- package/dist/showcase/assets/dropdown-menu-1CJgYn0S.js +1 -0
- package/dist/showcase/assets/dropzone-Co1uhsDn.js +1 -0
- package/dist/showcase/assets/ellipsis-cKRcvuyL.js +1 -0
- package/dist/showcase/assets/ellipsis-vertical-B1RErEkj.js +1 -0
- package/dist/showcase/assets/empty-Y2-4nCBr.js +1 -0
- package/dist/showcase/assets/empty-item-USa6xcUv.js +49 -0
- package/dist/showcase/assets/empty-state-DfhZ9AT5.js +188 -0
- package/dist/showcase/assets/enhanced-activities-DmAPVUSu.js +359 -0
- package/dist/showcase/assets/esm-BeGQ_ZTM.js +2 -0
- package/dist/showcase/assets/event-calendar-D-jGrrZS.js +138 -0
- package/dist/showcase/assets/event-log-tA_i4eR9.js +326 -0
- package/dist/showcase/assets/example-6phCHGsN.js +1 -0
- package/dist/showcase/assets/external-link-BuVHkCy0.js +1 -0
- package/dist/showcase/assets/eye-DC5HfGm6.js +1 -0
- package/dist/showcase/assets/feature-announcement-DwvxLytd.js +34 -0
- package/dist/showcase/assets/file-D-xM4vLy.js +1 -0
- package/dist/showcase/assets/file-text-tmG5vNbr.js +1 -0
- package/dist/showcase/assets/filters-CrGRXmq6.js +78 -0
- package/dist/showcase/assets/flag-CWrEtkY5.js +1 -0
- package/dist/showcase/assets/folder-open-Br-x1pjP.js +1 -0
- package/dist/showcase/assets/form-sizing-Bb5hiM45.js +1 -0
- package/dist/showcase/assets/format-D_ETCyg4.js +1 -0
- package/dist/showcase/assets/forms-B_MkQ3rm.js +790 -0
- package/dist/showcase/assets/generic-CdmsyXV3.js +1 -0
- package/dist/showcase/assets/getPseudoElementBounds-CZnCbCFP.js +1 -0
- package/dist/showcase/assets/gift-NkuklfU2.js +1 -0
- package/dist/showcase/assets/giftcard-cards-BAvevZ0i.js +85 -0
- package/dist/showcase/assets/git-branch-B_CBqPeO.js +1 -0
- package/dist/showcase/assets/global-search-D9teAbPe.js +90 -0
- package/dist/showcase/assets/globe-gzw45GU2.js +1 -0
- package/dist/showcase/assets/gradient-card-Xk2r7R5H.js +58 -0
- package/dist/showcase/assets/header-notifications-_aZCpE5A.js +1 -0
- package/dist/showcase/assets/heart-CEMKbRaZ.js +1 -0
- package/dist/showcase/assets/house-BlGXAcMH.js +1 -0
- package/dist/showcase/assets/icon-badge-z6N9reH_.js +1 -0
- package/dist/showcase/assets/image-B8mzmVBr.js +1 -0
- package/dist/showcase/assets/inbox-qdSnP4UV.js +1 -0
- package/dist/showcase/assets/index-B4ubXfly.js +10 -0
- package/dist/showcase/assets/inertValue-D5Q8cLku.js +1 -0
- package/dist/showcase/assets/info-DBvvNjc_.js +1 -0
- package/dist/showcase/assets/inline-stat-Bm1zVT8D.js +1 -0
- package/dist/showcase/assets/input-CBQR0aeX.js +1 -0
- package/dist/showcase/assets/input-OrUzpI55.js +1 -0
- package/dist/showcase/assets/input-group-DhqOen2N.js +47 -0
- package/dist/showcase/assets/input-group-l8xa5nUq.js +1 -0
- package/dist/showcase/assets/inputs-DbiJ0qy2.js +49 -0
- package/dist/showcase/assets/invoice-header-C6youIbL.js +36 -0
- package/dist/showcase/assets/invoice-items-g6dgryF-.js +36 -0
- package/dist/showcase/assets/invoice-mini-0iWhufpt.js +14 -0
- package/dist/showcase/assets/invoice-table-Bvdh3rRq.js +30 -0
- package/dist/showcase/assets/isSameDay-BpZEtJe8.js +1 -0
- package/dist/showcase/assets/isToday-F0CS28oK.js +1 -0
- package/dist/showcase/assets/italic-CJOEwjdc.js +1 -0
- package/dist/showcase/assets/item-BiMm1PPB.js +1 -0
- package/dist/showcase/assets/item-CN0cwdj_.js +1 -0
- package/dist/showcase/assets/item-DNqEUYLT.js +117 -0
- package/dist/showcase/assets/kanban-DxePEUiQ.js +175 -0
- package/dist/showcase/assets/label-Dx4WO-fg.js +1 -0
- package/dist/showcase/assets/layout-containers-DDl8rG8S.js +96 -0
- package/dist/showcase/assets/layout-header-Bu6IcDWu.js +170 -0
- package/dist/showcase/assets/layout-page-D-88Qnoy.js +122 -0
- package/dist/showcase/assets/layout-sidebar-Ctft10pk.js +224 -0
- package/dist/showcase/assets/layout-users-DtbZduBG.js +104 -0
- package/dist/showcase/assets/lib-D9BoOYUd.js +1 -0
- package/dist/showcase/assets/lock-CHurDI0n.js +1 -0
- package/dist/showcase/assets/mail-DZ1o1RLW.js +1 -0
- package/dist/showcase/assets/map-C8xiyT9X.js +124 -0
- package/dist/showcase/assets/map-pin-CAKaoYod.js +1 -0
- package/dist/showcase/assets/menus-C6mnp636.js +89 -0
- package/dist/showcase/assets/message-square-Zo5J_zU1.js +1 -0
- package/dist/showcase/assets/metadata-list-W83-UMhc.js +278 -0
- package/dist/showcase/assets/metric-BSvxidIX.js +1 -0
- package/dist/showcase/assets/metric-grid-Dtqx_3Lg.js +1 -0
- package/dist/showcase/assets/metric-trend-chip-mtvcJ_M9.js +1 -0
- package/dist/showcase/assets/metrics-analytics-bar-DQbyss7i.js +44 -0
- package/dist/showcase/assets/metrics-analytics-cards-CEBu5Uw0.js +77 -0
- package/dist/showcase/assets/metrics-comparison-Bs-R6v4y.js +76 -0
- package/dist/showcase/assets/metrics-heatmap-BKHWH8sM.js +27 -0
- package/dist/showcase/assets/metrics-inline-badge-BxVn0Y2p.js +17 -0
- package/dist/showcase/assets/metrics-kpi-row-DtACYEds.js +31 -0
- package/dist/showcase/assets/metrics-micro-grid-BkwUGOUR.js +42 -0
- package/dist/showcase/assets/metrics-overview-BAtrlzsI.js +192 -0
- package/dist/showcase/assets/metrics-stat-cards-iCRCNyHY.js +54 -0
- package/dist/showcase/assets/minus-C6eBW-2t.js +1 -0
- package/dist/showcase/assets/money-display-DjGRJ16l.js +1 -0
- package/dist/showcase/assets/month-year-picker-DTDebPqf.js +1 -0
- package/dist/showcase/assets/navigation-BrG8Chig.js +86 -0
- package/dist/showcase/assets/navigation-CfXQJbyM.js +230 -0
- package/dist/showcase/assets/navigation-extras-D_gzLlZ5.js +43 -0
- package/dist/showcase/assets/onboarding-checklist-1EerUwAo.js +119 -0
- package/dist/showcase/assets/overlays-2AB9-S1Z.js +88 -0
- package/dist/showcase/assets/overlays-CYt9o3Xq.js +393 -0
- package/dist/showcase/assets/package-BJMP-Fcr.js +1 -0
- package/dist/showcase/assets/page-action-button-BZxJ0X1j.js +1 -0
- package/dist/showcase/assets/page-header-B_rqHJhe.js +1 -0
- package/dist/showcase/assets/pagination-BHiQvvka.js +1 -0
- package/dist/showcase/assets/pagination-Dq0GruQd.js +42 -0
- package/dist/showcase/assets/paperclip-BMYKrUQo.js +1 -0
- package/dist/showcase/assets/pencil-BJ3VS_FO.js +1 -0
- package/dist/showcase/assets/phone-CsRIyvep.js +1 -0
- package/dist/showcase/assets/plus-D2JuXYLg.js +1 -0
- package/dist/showcase/assets/popover-DNT9755r.js +1 -0
- package/dist/showcase/assets/popover-KvGgcPNg.js +1 -0
- package/dist/showcase/assets/popover-menu-CJx30R65.js +1 -0
- package/dist/showcase/assets/progress-B7WuXcJR.js +1 -0
- package/dist/showcase/assets/progress-CweCSAUv.js +18 -0
- package/dist/showcase/assets/props-table-uDY4eIzt.js +1 -0
- package/dist/showcase/assets/quote-DAyyfzQd.js +1 -0
- package/dist/showcase/assets/receipt-C0mMZGbF.js +1 -0
- package/dist/showcase/assets/refresh-cw-X06JbXb-.js +1 -0
- package/dist/showcase/assets/resolveValueLabel-Bks7UDko.js +1 -0
- package/dist/showcase/assets/rich-text-editor-QJsb-qIe.js +124 -0
- package/dist/showcase/assets/rich-text-editor-h07VBNI9.js +141 -0
- package/dist/showcase/assets/rotate-ccw-D84bdX_x.js +1 -0
- package/dist/showcase/assets/scroll-area-0rT06pXZ.js +1 -0
- package/dist/showcase/assets/scroll-area-YXwdzGpN.js +32 -0
- package/dist/showcase/assets/select-BoWQDtUf.js +1 -0
- package/dist/showcase/assets/send-DJsk3cr1.js +1 -0
- package/dist/showcase/assets/separator-CLSnRcJa.js +28 -0
- package/dist/showcase/assets/separator-DWv-twD-.js +1 -0
- package/dist/showcase/assets/settings-Cb2MsAmN.js +1 -0
- package/dist/showcase/assets/sheet-Dn1-MYus.js +1 -0
- package/dist/showcase/assets/shield-DwLjF5ch.js +1 -0
- package/dist/showcase/assets/shield-alert-D8i6gzMK.js +1 -0
- package/dist/showcase/assets/shield-check-D5YRSBIz.js +1 -0
- package/dist/showcase/assets/shopping-bag-BqlAP4vn.js +1 -0
- package/dist/showcase/assets/sidebar.context-BAp_pBEB.js +1 -0
- package/dist/showcase/assets/skeleton-CeNPp4hr.js +1 -0
- package/dist/showcase/assets/skeleton-QPsnM_NR.js +29 -0
- package/dist/showcase/assets/smart-card-BisUbLPt.js +1 -0
- package/dist/showcase/assets/sonner-B7GzbBK2.js +22 -0
- package/dist/showcase/assets/sortable.esm-BDcEOHT7.js +5 -0
- package/dist/showcase/assets/sparkles-CF9P5Tqh.js +1 -0
- package/dist/showcase/assets/spinner-BeamEyJd.js +49 -0
- package/dist/showcase/assets/spinner-DoYBfalR.js +1 -0
- package/dist/showcase/assets/spinner-UsLsOYzn.js +30 -0
- package/dist/showcase/assets/square-pen-BGTVdnt1.js +1 -0
- package/dist/showcase/assets/stacked-avatars-BWfVX1Ov.js +1 -0
- package/dist/showcase/assets/star-NsPNO9gR.js +1 -0
- package/dist/showcase/assets/startOfDay-zJBpxLuW.js +1 -0
- package/dist/showcase/assets/styles-DA7a7hVy.js +1 -0
- package/dist/showcase/assets/switch-C62S4U2o.js +1 -0
- package/dist/showcase/assets/switch-CYQcinJZ.js +1 -0
- package/dist/showcase/assets/table-w4IABkpa.js +1 -0
- package/dist/showcase/assets/table-xgB63UrY.js +390 -0
- package/dist/showcase/assets/tabs-BFTEaTXj.js +19 -0
- package/dist/showcase/assets/tabs-oMJn9Ujq.js +1 -0
- package/dist/showcase/assets/text-button-BgcutPuu.js +1 -0
- package/dist/showcase/assets/text-link-CS9thOWL.js +1 -0
- package/dist/showcase/assets/textarea-BOBx4EM6.js +1 -0
- package/dist/showcase/assets/textarea-CTzYZZqa.js +1 -0
- package/dist/showcase/assets/timelines-CK07mEBK.js +186 -0
- package/dist/showcase/assets/toggle-group-CSPdPT6G.js +1 -0
- package/dist/showcase/assets/toggles-DDSdl-gA.js +71 -0
- package/dist/showcase/assets/toggles-group-Y2BdKEFB.js +32 -0
- package/dist/showcase/assets/trash-2-C-FAptQP.js +1 -0
- package/dist/showcase/assets/trending-up-BmLhdF_w.js +1 -0
- package/dist/showcase/assets/truck-pZdUS_as.js +1 -0
- package/dist/showcase/assets/typography-CnBH2z7f.js +214 -0
- package/dist/showcase/assets/ui-badge-Cl6INRO5.js +28 -0
- package/dist/showcase/assets/ui-card-B5P-thNu.js +30 -0
- package/dist/showcase/assets/ui-table-B32RILKk.js +42 -0
- package/dist/showcase/assets/upload-tray-mu6bR2ZE.js +138 -0
- package/dist/showcase/assets/useAnchoredPopupScrollLock-CzDaXxmM.js +1 -0
- package/dist/showcase/assets/useCollapsiblePanel-B0DZvDFu.js +1 -0
- package/dist/showcase/assets/useCompositeItem-BVIVLT9X.js +1 -0
- package/dist/showcase/assets/useCompositeListItem-JEMeTFPx.js +1 -0
- package/dist/showcase/assets/useControlled-ZjqBfPCn.js +1 -0
- package/dist/showcase/assets/useLabelableId-D8CZq8Bm.js +1 -0
- package/dist/showcase/assets/useOpenInteractionType-CopGCf3q.js +1 -0
- package/dist/showcase/assets/useRender-zuKv6JQF.js +1 -0
- package/dist/showcase/assets/useRole-08KeyiD3.js +1 -0
- package/dist/showcase/assets/useTriggerFocusGuards-DEuz5CGe.js +1 -0
- package/dist/showcase/assets/useValueChanged-BxFi_qyj.js +1 -0
- package/dist/showcase/assets/user-Bgc2t2_e.js +1 -0
- package/dist/showcase/assets/user-plus-F_TfagnP.js +1 -0
- package/dist/showcase/assets/users-B7G4yTCR.js +1 -0
- package/dist/showcase/assets/vendor-profile-BTQmsKM6.js +37 -0
- package/dist/showcase/assets/wrench-BdzICmjR.js +1 -0
- package/dist/showcase/assets/x-B156Wr-5.js +1 -0
- package/dist/showcase/assets/zap-B3iByjNV.js +1 -0
- package/dist/showcase/index.html +1 -1
- package/package.json +10 -1
- package/dist/_shared/accordion-7rwpgJ1k.cjs +0 -2
- package/dist/_shared/accordion-7rwpgJ1k.cjs.map +0 -1
- package/dist/_shared/accordion-DcduCEIo.js +0 -130
- package/dist/_shared/accordion-DcduCEIo.js.map +0 -1
- package/dist/_shared/action-menu-D0u-q0q-.cjs +0 -2
- package/dist/_shared/action-menu-D0u-q0q-.cjs.map +0 -1
- package/dist/_shared/action-menu-DUBXdReV.js +0 -96
- package/dist/_shared/action-menu-DUBXdReV.js.map +0 -1
- package/dist/_shared/ai-artifact-C3R0god0.cjs +0 -3
- package/dist/_shared/ai-artifact-C3R0god0.cjs.map +0 -1
- package/dist/_shared/ai-artifact-DMjQv_Si.js +0 -1068
- package/dist/_shared/ai-artifact-DMjQv_Si.js.map +0 -1
- package/dist/_shared/alert-B2cuJGAA.cjs +0 -2
- package/dist/_shared/alert-B2cuJGAA.cjs.map +0 -1
- package/dist/_shared/alert-BKUmOI2e.js +0 -48
- package/dist/_shared/alert-BKUmOI2e.js.map +0 -1
- package/dist/_shared/avatar-BcYcRORH.cjs +0 -2
- package/dist/_shared/avatar-BcYcRORH.cjs.map +0 -1
- package/dist/_shared/avatar-CNzG6jSZ.js +0 -52
- package/dist/_shared/avatar-CNzG6jSZ.js.map +0 -1
- package/dist/_shared/badge-BbUN6W7E.js +0 -108
- package/dist/_shared/badge-BbUN6W7E.js.map +0 -1
- package/dist/_shared/badge-BjtDcU1M.cjs +0 -2
- package/dist/_shared/badge-BjtDcU1M.cjs.map +0 -1
- package/dist/_shared/breadcrumbs-DctwTld5.js +0 -111
- package/dist/_shared/breadcrumbs-DctwTld5.js.map +0 -1
- package/dist/_shared/breadcrumbs-m0-gCdNj.cjs +0 -2
- package/dist/_shared/breadcrumbs-m0-gCdNj.cjs.map +0 -1
- package/dist/_shared/button-BCABTFLE.js +0 -46
- package/dist/_shared/button-BCABTFLE.js.map +0 -1
- package/dist/_shared/button-Ck2qS42n.js +0 -176
- package/dist/_shared/button-Ck2qS42n.js.map +0 -1
- package/dist/_shared/button-DjJ-mDI1.cjs +0 -2
- package/dist/_shared/button-DjJ-mDI1.cjs.map +0 -1
- package/dist/_shared/button-DjacsNTg.cjs +0 -2
- package/dist/_shared/button-DjacsNTg.cjs.map +0 -1
- package/dist/_shared/buttons-BVnjQ-uE.js +0 -143
- package/dist/_shared/buttons-BVnjQ-uE.js.map +0 -1
- package/dist/_shared/buttons-BdY6igTr.cjs +0 -2
- package/dist/_shared/buttons-BdY6igTr.cjs.map +0 -1
- package/dist/_shared/card-radio-group--GP1xrz_.js +0 -158
- package/dist/_shared/card-radio-group--GP1xrz_.js.map +0 -1
- package/dist/_shared/card-radio-group-DnQsWozr.cjs +0 -2
- package/dist/_shared/card-radio-group-DnQsWozr.cjs.map +0 -1
- package/dist/_shared/combobox-DBrRE1Dr.cjs +0 -2
- package/dist/_shared/combobox-DBrRE1Dr.cjs.map +0 -1
- package/dist/_shared/combobox-DYztEJaw.js +0 -746
- package/dist/_shared/combobox-DYztEJaw.js.map +0 -1
- package/dist/_shared/command-COvgXQ8r.cjs +0 -2
- package/dist/_shared/command-COvgXQ8r.cjs.map +0 -1
- package/dist/_shared/command-CvZ6Emb8.js +0 -39
- package/dist/_shared/command-CvZ6Emb8.js.map +0 -1
- package/dist/_shared/command-DTFQIUVG.cjs +0 -2
- package/dist/_shared/command-DTFQIUVG.cjs.map +0 -1
- package/dist/_shared/command-Sq8XbHbA.js +0 -123
- package/dist/_shared/command-Sq8XbHbA.js.map +0 -1
- package/dist/_shared/comments-BOFU1GYY.js +0 -945
- package/dist/_shared/comments-BOFU1GYY.js.map +0 -1
- package/dist/_shared/comments-BbTYFzx6.cjs +0 -2
- package/dist/_shared/comments-BbTYFzx6.cjs.map +0 -1
- package/dist/_shared/containers-BthqdOhA.cjs +0 -2
- package/dist/_shared/containers-BthqdOhA.cjs.map +0 -1
- package/dist/_shared/containers-CD2xs1nk.js +0 -19
- package/dist/_shared/containers-CD2xs1nk.js.map +0 -1
- package/dist/_shared/content-container-CFfYbWoa.js +0 -33
- package/dist/_shared/content-container-CFfYbWoa.js.map +0 -1
- package/dist/_shared/content-container-CReiVugL.cjs +0 -2
- package/dist/_shared/content-container-CReiVugL.cjs.map +0 -1
- package/dist/_shared/copyable-CweQ72QI.cjs +0 -2
- package/dist/_shared/copyable-CweQ72QI.cjs.map +0 -1
- package/dist/_shared/copyable-JgsTp6ev.js +0 -38
- package/dist/_shared/copyable-JgsTp6ev.js.map +0 -1
- package/dist/_shared/date-picker-DI4b-SeE.cjs +0 -2
- package/dist/_shared/date-picker-DI4b-SeE.cjs.map +0 -1
- package/dist/_shared/date-picker-DTazvODY.js +0 -1352
- package/dist/_shared/date-picker-DTazvODY.js.map +0 -1
- package/dist/_shared/date-pickers-CLzuzmuc.cjs +0 -2
- package/dist/_shared/date-pickers-CLzuzmuc.cjs.map +0 -1
- package/dist/_shared/date-pickers-CWPxP3zy.js +0 -330
- package/dist/_shared/date-pickers-CWPxP3zy.js.map +0 -1
- package/dist/_shared/dialog-2MJmaj_d.js +0 -101
- package/dist/_shared/dialog-2MJmaj_d.js.map +0 -1
- package/dist/_shared/dialog-KKD0i1T8.cjs +0 -2
- package/dist/_shared/dialog-KKD0i1T8.cjs.map +0 -1
- package/dist/_shared/display-BCy1Ti7T.cjs +0 -8
- package/dist/_shared/display-BCy1Ti7T.cjs.map +0 -1
- package/dist/_shared/display-DUpkE2aS.js +0 -1462
- package/dist/_shared/display-DUpkE2aS.js.map +0 -1
- package/dist/_shared/dropdown-menu-BebBffUH.cjs +0 -2
- package/dist/_shared/dropdown-menu-BebBffUH.cjs.map +0 -1
- package/dist/_shared/dropdown-menu-xdGEynC8.js +0 -147
- package/dist/_shared/dropdown-menu-xdGEynC8.js.map +0 -1
- package/dist/_shared/form-field-rOj3cm6C.js +0 -319
- package/dist/_shared/form-field-rOj3cm6C.js.map +0 -1
- package/dist/_shared/form-field-rcyIIHjR.cjs +0 -2
- package/dist/_shared/form-field-rcyIIHjR.cjs.map +0 -1
- package/dist/_shared/form-sizing--bs_xPe2.cjs +0 -2
- package/dist/_shared/form-sizing--bs_xPe2.cjs.map +0 -1
- package/dist/_shared/form-sizing-CkKcs5fi.js +0 -21
- package/dist/_shared/form-sizing-CkKcs5fi.js.map +0 -1
- package/dist/_shared/format-BlVEsPyT.js +0 -48
- package/dist/_shared/format-BlVEsPyT.js.map +0 -1
- package/dist/_shared/format-DYVtSA2I.cjs +0 -2
- package/dist/_shared/format-DYVtSA2I.cjs.map +0 -1
- package/dist/_shared/forms-BAVsxxRk.js +0 -3374
- package/dist/_shared/forms-BAVsxxRk.js.map +0 -1
- package/dist/_shared/forms-DaZ3LsYc.cjs +0 -2
- package/dist/_shared/forms-DaZ3LsYc.cjs.map +0 -1
- package/dist/_shared/header-BtTMsQ5P.cjs +0 -2
- package/dist/_shared/header-BtTMsQ5P.cjs.map +0 -1
- package/dist/_shared/header-DpW4UWV6.js +0 -369
- package/dist/_shared/header-DpW4UWV6.js.map +0 -1
- package/dist/_shared/hooks-Bsm917yh.cjs +0 -2
- package/dist/_shared/hooks-Bsm917yh.cjs.map +0 -1
- package/dist/_shared/hooks-CX-SICd4.js +0 -118
- package/dist/_shared/hooks-CX-SICd4.js.map +0 -1
- package/dist/_shared/icon-badge-DGKpbo9_.cjs +0 -2
- package/dist/_shared/icon-badge-DGKpbo9_.cjs.map +0 -1
- package/dist/_shared/icon-badge-DoClA_9q.js +0 -52
- package/dist/_shared/icon-badge-DoClA_9q.js.map +0 -1
- package/dist/_shared/input-BXt-YtVs.cjs +0 -2
- package/dist/_shared/input-BXt-YtVs.cjs.map +0 -1
- package/dist/_shared/input-Bx4LeLhn.js +0 -17
- package/dist/_shared/input-Bx4LeLhn.js.map +0 -1
- package/dist/_shared/input-ChZGIhtS.cjs +0 -2
- package/dist/_shared/input-ChZGIhtS.cjs.map +0 -1
- package/dist/_shared/input-Cwv1-5jt.js +0 -182
- package/dist/_shared/input-Cwv1-5jt.js.map +0 -1
- package/dist/_shared/item-BmTYKzEb.js +0 -224
- package/dist/_shared/item-BmTYKzEb.js.map +0 -1
- package/dist/_shared/item-BtR-bz96.cjs +0 -2
- package/dist/_shared/item-BtR-bz96.cjs.map +0 -1
- package/dist/_shared/mentions-DVCjaO_z.cjs +0 -2
- package/dist/_shared/mentions-DVCjaO_z.cjs.map +0 -1
- package/dist/_shared/mentions-DzG8mX5H.js +0 -493
- package/dist/_shared/mentions-DzG8mX5H.js.map +0 -1
- package/dist/_shared/money-display-B5oxCs_0.cjs +0 -2
- package/dist/_shared/money-display-B5oxCs_0.cjs.map +0 -1
- package/dist/_shared/money-display-C0wI02ou.js +0 -198
- package/dist/_shared/money-display-C0wI02ou.js.map +0 -1
- package/dist/_shared/navigation-BA2nsTgU.cjs +0 -2
- package/dist/_shared/navigation-BA2nsTgU.cjs.map +0 -1
- package/dist/_shared/navigation-DHyaf-RZ.js +0 -420
- package/dist/_shared/navigation-DHyaf-RZ.js.map +0 -1
- package/dist/_shared/overlays-Kl6Gp6WR.js +0 -633
- package/dist/_shared/overlays-Kl6Gp6WR.js.map +0 -1
- package/dist/_shared/overlays-W6j-Pe1L.cjs +0 -2
- package/dist/_shared/overlays-W6j-Pe1L.cjs.map +0 -1
- package/dist/_shared/page-DROZhtWT.js +0 -263
- package/dist/_shared/page-DROZhtWT.js.map +0 -1
- package/dist/_shared/page-lh9Rcx_d.cjs +0 -2
- package/dist/_shared/page-lh9Rcx_d.cjs.map +0 -1
- package/dist/_shared/popover-BTEwjJZS.cjs +0 -2
- package/dist/_shared/popover-BTEwjJZS.cjs.map +0 -1
- package/dist/_shared/popover-CF9VWt-l.js +0 -83
- package/dist/_shared/popover-CF9VWt-l.js.map +0 -1
- package/dist/_shared/popover-menu-BYesl29w.js +0 -95
- package/dist/_shared/popover-menu-BYesl29w.js.map +0 -1
- package/dist/_shared/popover-menu-DF9sWz61.cjs +0 -2
- package/dist/_shared/popover-menu-DF9sWz61.cjs.map +0 -1
- package/dist/_shared/rich-text-editor-UZghkgsh.cjs +0 -2
- package/dist/_shared/rich-text-editor-UZghkgsh.cjs.map +0 -1
- package/dist/_shared/rich-text-editor-fUeuK-rY.js +0 -608
- package/dist/_shared/rich-text-editor-fUeuK-rY.js.map +0 -1
- package/dist/_shared/scroll-area-XJLcCczs.js +0 -41
- package/dist/_shared/scroll-area-XJLcCczs.js.map +0 -1
- package/dist/_shared/scroll-area-y8ZJoS97.cjs +0 -2
- package/dist/_shared/scroll-area-y8ZJoS97.cjs.map +0 -1
- package/dist/_shared/select-D8MYF4f7.js +0 -85
- package/dist/_shared/select-D8MYF4f7.js.map +0 -1
- package/dist/_shared/select-DxAiUfpM.cjs +0 -2
- package/dist/_shared/select-DxAiUfpM.cjs.map +0 -1
- package/dist/_shared/separator-BazqiQ9s.js +0 -16
- package/dist/_shared/separator-BazqiQ9s.js.map +0 -1
- package/dist/_shared/separator-DSkXMOXq.cjs +0 -2
- package/dist/_shared/separator-DSkXMOXq.cjs.map +0 -1
- package/dist/_shared/sheet-7iHOs-IU.js +0 -100
- package/dist/_shared/sheet-7iHOs-IU.js.map +0 -1
- package/dist/_shared/sheet-qKtoyxgi.cjs +0 -2
- package/dist/_shared/sheet-qKtoyxgi.cjs.map +0 -1
- package/dist/_shared/sidebar-CaTUJ3t-.js +0 -537
- package/dist/_shared/sidebar-CaTUJ3t-.js.map +0 -1
- package/dist/_shared/sidebar-DVjfsm-f.cjs +0 -2
- package/dist/_shared/sidebar-DVjfsm-f.cjs.map +0 -1
- package/dist/_shared/sidebar-aV5DVAVg.js +0 -371
- package/dist/_shared/sidebar-aV5DVAVg.js.map +0 -1
- package/dist/_shared/sidebar-mL0jSJ8u.cjs +0 -2
- package/dist/_shared/sidebar-mL0jSJ8u.cjs.map +0 -1
- package/dist/_shared/skeleton-Bwv_j9jJ.cjs +0 -2
- package/dist/_shared/skeleton-Bwv_j9jJ.cjs.map +0 -1
- package/dist/_shared/skeleton-DyKa-Ed-.js +0 -14
- package/dist/_shared/skeleton-DyKa-Ed-.js.map +0 -1
- package/dist/_shared/slot-ClIPTht1.cjs +0 -2
- package/dist/_shared/slot-ClIPTht1.cjs.map +0 -1
- package/dist/_shared/slot-CrS_VEVl.js +0 -18
- package/dist/_shared/slot-CrS_VEVl.js.map +0 -1
- package/dist/_shared/smart-card-Ddsjvf7r.cjs +0 -2
- package/dist/_shared/smart-card-Ddsjvf7r.cjs.map +0 -1
- package/dist/_shared/smart-card-hJ01usWt.js +0 -360
- package/dist/_shared/smart-card-hJ01usWt.js.map +0 -1
- package/dist/_shared/spinner-D-pcMBt1.js +0 -67
- package/dist/_shared/spinner-D-pcMBt1.js.map +0 -1
- package/dist/_shared/spinner-zbmhn0vE.cjs +0 -2
- package/dist/_shared/spinner-zbmhn0vE.cjs.map +0 -1
- package/dist/_shared/switch-C5J37LMI.cjs +0 -2
- package/dist/_shared/switch-C5J37LMI.cjs.map +0 -1
- package/dist/_shared/switch-ClGgHcEb.js +0 -51
- package/dist/_shared/switch-ClGgHcEb.js.map +0 -1
- package/dist/_shared/textarea-DeISZfHw.js +0 -119
- package/dist/_shared/textarea-DeISZfHw.js.map +0 -1
- package/dist/_shared/textarea-iR9txrty.cjs +0 -2
- package/dist/_shared/textarea-iR9txrty.cjs.map +0 -1
- package/dist/_shared/tooltip-CEqxHWxQ.js +0 -49
- package/dist/_shared/tooltip-CEqxHWxQ.js.map +0 -1
- package/dist/_shared/tooltip-DPv0LGr9.cjs +0 -2
- package/dist/_shared/tooltip-DPv0LGr9.cjs.map +0 -1
- package/dist/_shared/typography-BtPQBvSm.js +0 -135
- package/dist/_shared/typography-BtPQBvSm.js.map +0 -1
- package/dist/_shared/typography-DClleVWi.cjs +0 -2
- package/dist/_shared/typography-DClleVWi.cjs.map +0 -1
- package/dist/showcase/assets/AreaChart-D-RqNtqG.js +0 -6
- package/dist/showcase/assets/CSPContext-t69BXyB7.js +0 -1
- package/dist/showcase/assets/CompositeItem-DHNLgEeV.js +0 -1
- package/dist/showcase/assets/CompositeRoot-xq_0ZFev.js +0 -1
- package/dist/showcase/assets/DialogTrigger-Cl7n_3xX.js +0 -1
- package/dist/showcase/assets/FormContext-CXdwDz7F.js +0 -1
- package/dist/showcase/assets/PreviewLayout-BHemtKEf.js +0 -1
- package/dist/showcase/assets/RadioGroup-DXAt4VZN.js +0 -1
- package/dist/showcase/assets/Separator-C9vXwWmZ.js +0 -1
- package/dist/showcase/assets/ToolbarRootContext-iF4ctnIz.js +0 -1
- package/dist/showcase/assets/accordion-DzkNgNcB.js +0 -172
- package/dist/showcase/assets/accordion-variants-DP5-oxLe.js +0 -1
- package/dist/showcase/assets/action-menu-CyA2e9TF.js +0 -1
- package/dist/showcase/assets/activities-Dt-dO5ew.js +0 -501
- package/dist/showcase/assets/activities-feed-card-DZdFekXl.js +0 -1
- package/dist/showcase/assets/admin-C2SeJmE7.js +0 -80
- package/dist/showcase/assets/ai-Cwo0h_Xn.js +0 -41
- package/dist/showcase/assets/ai-artifact-3UJofyU5.js +0 -2
- package/dist/showcase/assets/ai-chat-CrFtG_Vg.js +0 -568
- package/dist/showcase/assets/ai-elements-iJ15Y7pS.js +0 -379
- package/dist/showcase/assets/ai-new-DuznZydd.js +0 -167
- package/dist/showcase/assets/ai-tool-call-CTcGGAQU.js +0 -1
- package/dist/showcase/assets/alert-CUGGckOX.js +0 -1
- package/dist/showcase/assets/alert-tWped3Sw.js +0 -59
- package/dist/showcase/assets/api-key-list-Q5LAqzMn.js +0 -73
- package/dist/showcase/assets/arrow-down-CfwCPcHL.js +0 -1
- package/dist/showcase/assets/arrow-left-BKx9qNX6.js +0 -1
- package/dist/showcase/assets/arrow-right-DlEpbqEk.js +0 -1
- package/dist/showcase/assets/arrow-up-BYQ4F9L1.js +0 -1
- package/dist/showcase/assets/arrow-up-right-C8r6vYfE.js +0 -1
- package/dist/showcase/assets/avatar-BuZ3zTbH.js +0 -57
- package/dist/showcase/assets/avatar-DR2mqPpY.js +0 -1
- package/dist/showcase/assets/badge-D1HLfP93.js +0 -28
- package/dist/showcase/assets/badge-check-oP2z_95u.js +0 -1
- package/dist/showcase/assets/bell-BTX2D-ES.js +0 -1
- package/dist/showcase/assets/bot-CKh5XgUG.js +0 -1
- package/dist/showcase/assets/box-F1uaZ6iw.js +0 -1
- package/dist/showcase/assets/brain-dD_ppLUa.js +0 -1
- package/dist/showcase/assets/brand-zisZOFKf.js +0 -40
- package/dist/showcase/assets/breadcrumb-C7vv0L8K.js +0 -52
- package/dist/showcase/assets/breadcrumb-fay5sLba.js +0 -1
- package/dist/showcase/assets/breadcrumbs-DklRXepp.js +0 -1
- package/dist/showcase/assets/briefcase-D9M4aNmi.js +0 -1
- package/dist/showcase/assets/button-DbhXfR1N.js +0 -44
- package/dist/showcase/assets/button-group-BpdhyMif.js +0 -1
- package/dist/showcase/assets/buttons-XexbmUtN.js +0 -259
- package/dist/showcase/assets/calendar-BADJgjpI.js +0 -16
- package/dist/showcase/assets/calendar-Djh3xLVx.js +0 -1
- package/dist/showcase/assets/calendar-dWZ2-0gU.js +0 -1
- package/dist/showcase/assets/card-BUSAPPkx.js +0 -1
- package/dist/showcase/assets/cards-DHBPe01w.js +0 -328
- package/dist/showcase/assets/chart-column-6l5wIZ0h.js +0 -1
- package/dist/showcase/assets/chevron-down-at2vrt1V.js +0 -1
- package/dist/showcase/assets/chevron-left-DIs3WYNO.js +0 -1
- package/dist/showcase/assets/chevron-right-BNy0Or0x.js +0 -1
- package/dist/showcase/assets/chevron-up-CX7619BJ.js +0 -1
- package/dist/showcase/assets/chevrons-up-down-Be6eciau.js +0 -1
- package/dist/showcase/assets/circle-C0Yd1DDS.js +0 -1
- package/dist/showcase/assets/circle-alert-DfQp_X3_.js +0 -1
- package/dist/showcase/assets/circle-check-BkqQe1tv.js +0 -1
- package/dist/showcase/assets/circle-check-big-BXxHUhuc.js +0 -1
- package/dist/showcase/assets/circle-dot-HeRgxZxN.js +0 -1
- package/dist/showcase/assets/circle-question-mark-BgS4fb6N.js +0 -1
- package/dist/showcase/assets/circle-x-CMzwDsaf.js +0 -1
- package/dist/showcase/assets/clock-ynCzs_rR.js +0 -1
- package/dist/showcase/assets/code-xml-B8aVstrJ.js +0 -1
- package/dist/showcase/assets/collapsible-C8CKdiRn.js +0 -27
- package/dist/showcase/assets/collapsible-u43HxDHB.js +0 -1
- package/dist/showcase/assets/combobox-D-6ff0VG.js +0 -622
- package/dist/showcase/assets/command-BsHudlBe.js +0 -1
- package/dist/showcase/assets/command-DZqmBolX.js +0 -45
- package/dist/showcase/assets/comment-composer-OnxlkC5y.js +0 -1
- package/dist/showcase/assets/comment-item-DmZ1AJ2Y.js +0 -1
- package/dist/showcase/assets/comments-BjIVksjE.js +0 -349
- package/dist/showcase/assets/commerce-3T1GxvrA.js +0 -78
- package/dist/showcase/assets/commerce-extras-CYv_uRQR.js +0 -179
- package/dist/showcase/assets/composite-mol0-2zZ.js +0 -1
- package/dist/showcase/assets/contact-card-CWAANJqn.js +0 -65
- package/dist/showcase/assets/content-container-D3Phw6h8.js +0 -1
- package/dist/showcase/assets/copyable-BdzUH3U3.js +0 -96
- package/dist/showcase/assets/course-card-Cb6Y2vJ6.js +0 -113
- package/dist/showcase/assets/cpu-CRrekbGQ.js +0 -1
- package/dist/showcase/assets/credit-card--5vg7bQy.js +0 -1
- package/dist/showcase/assets/currency-VuqnKj_Y.js +0 -149
- package/dist/showcase/assets/dark-surfaces-DEyBimFz.js +0 -90
- package/dist/showcase/assets/database-Bnvw0wVV.js +0 -1
- package/dist/showcase/assets/date-block-IhoCVl_d.js +0 -1
- package/dist/showcase/assets/date-picker-DnJpsnaF.js +0 -1
- package/dist/showcase/assets/date-pickers-CEbieq-R.js +0 -110
- package/dist/showcase/assets/dense-info-B04QmrOd.js +0 -106
- package/dist/showcase/assets/dialog-DotEO3IO.js +0 -1
- package/dist/showcase/assets/display-hK7Dtm-B.js +0 -392
- package/dist/showcase/assets/dist-DQgGKvzA.js +0 -1
- package/dist/showcase/assets/dollar-sign-gJtl-XaL.js +0 -1
- package/dist/showcase/assets/download-CMrNgeil.js +0 -1
- package/dist/showcase/assets/dropdown-menu-Cqv6D7Sb.js +0 -1
- package/dist/showcase/assets/dropzone-v69fWHZJ.js +0 -1
- package/dist/showcase/assets/ellipsis-CgqPlt6Z.js +0 -1
- package/dist/showcase/assets/ellipsis-vertical-CiJqC0n2.js +0 -1
- package/dist/showcase/assets/empty-DYHzk-Gb.js +0 -1
- package/dist/showcase/assets/empty-item-CTwvC_3M.js +0 -49
- package/dist/showcase/assets/empty-state-eUgJ4h41.js +0 -188
- package/dist/showcase/assets/enhanced-activities-XU2u5gO6.js +0 -359
- package/dist/showcase/assets/esm-B7xAMXnv.js +0 -2
- package/dist/showcase/assets/event-calendar-D2rjpzq1.js +0 -138
- package/dist/showcase/assets/event-log-BxER62Ds.js +0 -326
- package/dist/showcase/assets/example-DPfw-R7_.js +0 -1
- package/dist/showcase/assets/external-link-DJNGkjZ0.js +0 -1
- package/dist/showcase/assets/eye-BQU3UqWi.js +0 -1
- package/dist/showcase/assets/feature-announcement-CjGQEODB.js +0 -34
- package/dist/showcase/assets/file-DBpbC8g-.js +0 -1
- package/dist/showcase/assets/file-text-DokBif5V.js +0 -1
- package/dist/showcase/assets/filters-DM2olMKy.js +0 -78
- package/dist/showcase/assets/flag-hAuZbHU1.js +0 -1
- package/dist/showcase/assets/folder-open-DqubQ0ts.js +0 -1
- package/dist/showcase/assets/form-sizing-CfbZF8Ja.js +0 -1
- package/dist/showcase/assets/format-gCABLair.js +0 -1
- package/dist/showcase/assets/forms-FsAT0C-I.js +0 -790
- package/dist/showcase/assets/generic-BUuo7j09.js +0 -1
- package/dist/showcase/assets/getPseudoElementBounds-l8uxcPNL.js +0 -1
- package/dist/showcase/assets/gift-CS7Tg3kD.js +0 -1
- package/dist/showcase/assets/giftcard-cards-h1ffLs9F.js +0 -85
- package/dist/showcase/assets/git-branch-D4-6vv6t.js +0 -1
- package/dist/showcase/assets/global-search-BUyhhsQv.js +0 -90
- package/dist/showcase/assets/globe-CqLYhUfl.js +0 -1
- package/dist/showcase/assets/gradient-card-Bwr9OLIL.js +0 -58
- package/dist/showcase/assets/header-notifications-BWla1yhM.js +0 -1
- package/dist/showcase/assets/heart-DfZtXfIP.js +0 -1
- package/dist/showcase/assets/house-DhIReDt8.js +0 -1
- package/dist/showcase/assets/icon-badge-BgRFYZEc.js +0 -1
- package/dist/showcase/assets/image-D_eNEZWQ.js +0 -1
- package/dist/showcase/assets/inbox-5sFkO7gC.js +0 -1
- package/dist/showcase/assets/index-B-Z7p0So.js +0 -10
- package/dist/showcase/assets/inertValue-NU_Amr-x.js +0 -1
- package/dist/showcase/assets/info-DyB6KH3Z.js +0 -1
- package/dist/showcase/assets/inline-stat-D2aaM1Vt.js +0 -1
- package/dist/showcase/assets/input-BS64kyoq.js +0 -1
- package/dist/showcase/assets/input-DWLyniGt.js +0 -1
- package/dist/showcase/assets/input-group-BS8j5Eek.js +0 -47
- package/dist/showcase/assets/input-group-B_E_3EGS.js +0 -1
- package/dist/showcase/assets/inputs-DOQ2foig.js +0 -49
- package/dist/showcase/assets/invoice-header-C2-uQE_s.js +0 -36
- package/dist/showcase/assets/invoice-items-BUunRJqA.js +0 -36
- package/dist/showcase/assets/invoice-mini-BrLMrzN6.js +0 -14
- package/dist/showcase/assets/invoice-table-CaB9Z8jI.js +0 -30
- package/dist/showcase/assets/isSameDay-rwvIyLOL.js +0 -1
- package/dist/showcase/assets/isToday-CIAzBrb5.js +0 -1
- package/dist/showcase/assets/italic-B02a4PdD.js +0 -1
- package/dist/showcase/assets/item-C-0RObvI.js +0 -117
- package/dist/showcase/assets/item-CCu0Ufaq.js +0 -1
- package/dist/showcase/assets/item-DF4m_56j.js +0 -1
- package/dist/showcase/assets/kanban-BgW23a7P.js +0 -175
- package/dist/showcase/assets/label-MdV7pglj.js +0 -1
- package/dist/showcase/assets/layout-containers-nKVReEJB.js +0 -96
- package/dist/showcase/assets/layout-header-CKyxHHPC.js +0 -170
- package/dist/showcase/assets/layout-page-ClD2yMnK.js +0 -122
- package/dist/showcase/assets/layout-sidebar-jdQnYDiT.js +0 -224
- package/dist/showcase/assets/layout-users-Cv849xnU.js +0 -104
- package/dist/showcase/assets/lib-BHW4JERQ.js +0 -1
- package/dist/showcase/assets/lock-B8bfl9sZ.js +0 -1
- package/dist/showcase/assets/mail-DmOBTX4I.js +0 -1
- package/dist/showcase/assets/map-ButgRl8f.js +0 -124
- package/dist/showcase/assets/map-pin-o3egisLq.js +0 -1
- package/dist/showcase/assets/menus-DdXgYKVA.js +0 -89
- package/dist/showcase/assets/message-square-Bl6P4TA0.js +0 -1
- package/dist/showcase/assets/metadata-list-aXo96h_U.js +0 -278
- package/dist/showcase/assets/metric-BLHKuZtE.js +0 -1
- package/dist/showcase/assets/metric-grid-6Dpj5eV3.js +0 -1
- package/dist/showcase/assets/metric-trend-chip-m389ipmG.js +0 -1
- package/dist/showcase/assets/metrics-analytics-bar-B-1IUlHf.js +0 -44
- package/dist/showcase/assets/metrics-analytics-cards-B8tvK_RB.js +0 -77
- package/dist/showcase/assets/metrics-comparison-DKJ7Js3F.js +0 -76
- package/dist/showcase/assets/metrics-heatmap-BlRnJoI0.js +0 -27
- package/dist/showcase/assets/metrics-inline-badge-COI7f64X.js +0 -17
- package/dist/showcase/assets/metrics-kpi-row-LRfmKhsy.js +0 -31
- package/dist/showcase/assets/metrics-micro-grid-DmqIQVVR.js +0 -42
- package/dist/showcase/assets/metrics-overview-Dbf5RM2k.js +0 -192
- package/dist/showcase/assets/metrics-stat-cards-D5oevQvv.js +0 -54
- package/dist/showcase/assets/minus-D-jmUi0G.js +0 -1
- package/dist/showcase/assets/money-display-C__61373.js +0 -1
- package/dist/showcase/assets/month-year-picker-BfBQePUY.js +0 -1
- package/dist/showcase/assets/navigation-DUAe-sQV.js +0 -86
- package/dist/showcase/assets/navigation-extras-itSAf6QT.js +0 -43
- package/dist/showcase/assets/navigation-fAOvwIlP.js +0 -230
- package/dist/showcase/assets/onboarding-checklist-1gmzk3_J.js +0 -119
- package/dist/showcase/assets/overlays-BMTBOIEI.js +0 -88
- package/dist/showcase/assets/overlays-Lu16yJWM.js +0 -393
- package/dist/showcase/assets/package-BIa1hPVQ.js +0 -1
- package/dist/showcase/assets/page-action-button-C5NiQHnP.js +0 -1
- package/dist/showcase/assets/page-header-Cwf9DuhD.js +0 -1
- package/dist/showcase/assets/pagination-9iSNmdCx.js +0 -1
- package/dist/showcase/assets/pagination-MjniF-7j.js +0 -42
- package/dist/showcase/assets/paperclip-CaNLUOIA.js +0 -1
- package/dist/showcase/assets/pencil-DTLGPoc_.js +0 -1
- package/dist/showcase/assets/phone-XvU6LndA.js +0 -1
- package/dist/showcase/assets/plus-BDSCn8ol.js +0 -1
- package/dist/showcase/assets/popover-CvhuubS6.js +0 -1
- package/dist/showcase/assets/popover-DUQqLZN2.js +0 -1
- package/dist/showcase/assets/popover-menu-DVGBuFpL.js +0 -1
- package/dist/showcase/assets/progress-BQopCRpV.js +0 -1
- package/dist/showcase/assets/progress-CvSUR260.js +0 -18
- package/dist/showcase/assets/props-table-BzUnIcv-.js +0 -1
- package/dist/showcase/assets/quote-D55lkoXn.js +0 -1
- package/dist/showcase/assets/receipt-D3ilhl9U.js +0 -1
- package/dist/showcase/assets/refresh-cw-Csl2LQ4l.js +0 -1
- package/dist/showcase/assets/resolveValueLabel-CM5i142y.js +0 -1
- package/dist/showcase/assets/rich-text-editor-Bz7jWvPv.js +0 -124
- package/dist/showcase/assets/rich-text-editor-DWKFpgNI.js +0 -141
- package/dist/showcase/assets/rotate-ccw-BnkpK7eq.js +0 -1
- package/dist/showcase/assets/scroll-area-BTVLd58j.js +0 -1
- package/dist/showcase/assets/scroll-area-CgFEDepJ.js +0 -32
- package/dist/showcase/assets/select-B7-tZDlG.js +0 -1
- package/dist/showcase/assets/send-BhjEdZ06.js +0 -1
- package/dist/showcase/assets/separator-CJayjKGP.js +0 -28
- package/dist/showcase/assets/separator-CZ_sPWQj.js +0 -1
- package/dist/showcase/assets/settings-Duj7gAZe.js +0 -1
- package/dist/showcase/assets/sheet-BMabZ_Gj.js +0 -1
- package/dist/showcase/assets/shield-C22sWOf4.js +0 -1
- package/dist/showcase/assets/shield-alert-DgZ6UO46.js +0 -1
- package/dist/showcase/assets/shield-check-jGSgmijm.js +0 -1
- package/dist/showcase/assets/shopping-bag-Cd09Ga6D.js +0 -1
- package/dist/showcase/assets/sidebar.context-CXTHS3vn.js +0 -1
- package/dist/showcase/assets/skeleton-Dmp4eC1A.js +0 -1
- package/dist/showcase/assets/skeleton-FLNbc7QP.js +0 -29
- package/dist/showcase/assets/smart-card-50WN9sCI.js +0 -1
- package/dist/showcase/assets/sonner-DR_DYpqb.js +0 -22
- package/dist/showcase/assets/sortable.esm-C_l8_Iqt.js +0 -5
- package/dist/showcase/assets/sparkles-C-fyahzv.js +0 -1
- package/dist/showcase/assets/spinner-B8jgVQNj.js +0 -30
- package/dist/showcase/assets/spinner-C4zPRpI0.js +0 -49
- package/dist/showcase/assets/spinner-DFjHsQlR.js +0 -1
- package/dist/showcase/assets/square-pen-Dp7lCfI3.js +0 -1
- package/dist/showcase/assets/stacked-avatars-CTckbUiW.js +0 -1
- package/dist/showcase/assets/star-l00ivfkD.js +0 -1
- package/dist/showcase/assets/startOfDay-Xmododib.js +0 -1
- package/dist/showcase/assets/styles-zuwR0q1z.js +0 -1
- package/dist/showcase/assets/switch-D3LrIrTQ.js +0 -1
- package/dist/showcase/assets/switch-ylXVyh_N.js +0 -1
- package/dist/showcase/assets/table-Cn3-19zb.js +0 -1
- package/dist/showcase/assets/table-ao3IcAnF.js +0 -390
- package/dist/showcase/assets/tabs-CTLQKtiu.js +0 -19
- package/dist/showcase/assets/tabs-lc1fX94A.js +0 -1
- package/dist/showcase/assets/text-button-Fu8UY1A8.js +0 -1
- package/dist/showcase/assets/text-link--EyGasJN.js +0 -1
- package/dist/showcase/assets/textarea-BdhnlNrF.js +0 -1
- package/dist/showcase/assets/textarea-D1kG3a9B.js +0 -1
- package/dist/showcase/assets/timelines-DF3tNgyG.js +0 -186
- package/dist/showcase/assets/toggle-group-CfxuWsv9.js +0 -1
- package/dist/showcase/assets/toggles-CacdBPlV.js +0 -71
- package/dist/showcase/assets/toggles-group-CRhgTGmL.js +0 -32
- package/dist/showcase/assets/trash-2-B0_GprQM.js +0 -1
- package/dist/showcase/assets/trending-up-B202l1b6.js +0 -1
- package/dist/showcase/assets/truck-Bl1pNrHi.js +0 -1
- package/dist/showcase/assets/typography-DEtOxBlR.js +0 -214
- package/dist/showcase/assets/ui-badge-n4RA0J5b.js +0 -28
- package/dist/showcase/assets/ui-card-Ck-kzrTh.js +0 -30
- package/dist/showcase/assets/ui-table-gzOp82pf.js +0 -42
- package/dist/showcase/assets/upload-tray-VvKdTZSi.js +0 -138
- package/dist/showcase/assets/useAnchoredPopupScrollLock-Cu2ZwN7Z.js +0 -1
- package/dist/showcase/assets/useCollapsiblePanel-C6_cdQ7B.js +0 -1
- package/dist/showcase/assets/useCompositeItem-BfUPqXoj.js +0 -1
- package/dist/showcase/assets/useCompositeListItem-Cf2lpKB8.js +0 -1
- package/dist/showcase/assets/useControlled-C6q3nmcf.js +0 -1
- package/dist/showcase/assets/useLabelableId-CfPT16c1.js +0 -1
- package/dist/showcase/assets/useOpenInteractionType-CGeqRuuY.js +0 -1
- package/dist/showcase/assets/useRender-CoUlh0uZ.js +0 -1
- package/dist/showcase/assets/useRole-DSPUSyVX.js +0 -1
- package/dist/showcase/assets/useTriggerFocusGuards-BwZ1HD24.js +0 -1
- package/dist/showcase/assets/useValueChanged-Dej794I1.js +0 -1
- package/dist/showcase/assets/user-3L762Mec.js +0 -1
- package/dist/showcase/assets/user-plus-9WRYjS04.js +0 -1
- package/dist/showcase/assets/users-CxKZ7gt8.js +0 -1
- package/dist/showcase/assets/vendor-profile-BaCptdMF.js +0 -37
- package/dist/showcase/assets/wrench-Duh91tnW.js +0 -1
- package/dist/showcase/assets/x-t42iKYpL.js +0 -1
- package/dist/showcase/assets/zap-D0z3Tv_L.js +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"comments-CvmS7zG3.js","names":[],"sources":["../../src/components/features/comments/comments.strings.ts","../../src/components/features/comments/comments-provider.tsx","../../src/components/features/comments/partials/comment-attachment-chip.tsx","../../src/components/features/comments/hooks/use-attachment-upload.ts","../../src/components/features/comments/partials/comment-composer.tsx","../../src/components/features/comments/partials/comment-empty.tsx","../../src/components/features/comments/partials/comment-content.tsx","../../src/components/features/comments/partials/comment-item.tsx","../../src/components/features/comments/partials/comment-timeline.tsx","../../src/components/features/comments/comments.tsx","../../src/components/features/comments/hooks/use-comments.ts"],"sourcesContent":["/**\n * Strings for the Comments feature. Consumers override via the `strings`\n * prop on `<Comments>` / `<CommentsCard>` / sub-components — values are\n * deep-merged over these defaults.\n */\nexport interface CommentsStrings {\n /** Card title — usually \"Comments\". Set to \"\" to hide. */\n title: string;\n /** Subtitle under the card title — optional. */\n subtitle: string;\n /** Empty-state copy for the timeline. */\n empty: string;\n /** Empty-state secondary copy. */\n emptyHint: string;\n\n // Composer ---------------------------------------------------------\n /** Composer rich-text placeholder. */\n composerPlaceholder: string;\n /** Submit label for new comments. */\n composerSubmit: string;\n /** Submit label while pending. */\n composerSubmitting: string;\n /** Submit label when editing. */\n composerSave: string;\n /** Required-content error. */\n invalidContent: string;\n /** Cancel/dismiss draft. */\n composerCancel: string;\n /** \"Edit comment\" eyebrow shown above the composer in edit mode. */\n composerEditingEyebrow: string;\n /** \"Reply to {{name}}\" eyebrow shown above the composer in reply mode. */\n composerReplyingEyebrow: string;\n\n // Toolbar buttons --------------------------------------------------\n composerAttachmentLabel: string;\n composerReferenceLabel: string;\n composerReferenceMenuTitle: string;\n composerReferenceSearchPlaceholder: string;\n composerReferenceEmpty: string;\n composerReferenceLoading: string;\n\n // Item -------------------------------------------------------------\n fallbackAuthor: string;\n pinned: string;\n edited: string;\n /** Trash button aria-label / tooltip. */\n deleteLabel: string;\n /** Edit button label. */\n editLabel: string;\n /** Reply button label. */\n replyLabel: string;\n /** Pin/unpin button label. */\n pinLabel: string;\n unpinLabel: string;\n /** \"More actions\" trigger aria-label. */\n moreActionsLabel: string;\n /** Confirm-delete button label inside the action menu. */\n confirmDeleteLabel: string;\n\n // Attachments ------------------------------------------------------\n attachmentFallback: string;\n attachmentRemoveLabel: string;\n attachmentUploadingLabel: string;\n attachmentFailedLabel: string;\n attachmentTooLargeError: string;\n attachmentTooManyError: string;\n attachmentRetryLabel: string;\n attachmentDownloadLabel: string;\n\n // Reactions --------------------------------------------------------\n addReactionLabel: string;\n\n // Misc -------------------------------------------------------------\n showRepliesLabel: string;\n hideRepliesLabel: string;\n}\n\nexport const defaultCommentsStrings: CommentsStrings = {\n title: 'Comments',\n subtitle: '',\n empty: 'No comments yet.',\n emptyHint: 'Start the conversation — your team will see it instantly.',\n\n composerPlaceholder: 'Write a comment…',\n composerSubmit: 'Post comment',\n composerSubmitting: 'Posting…',\n composerSave: 'Save changes',\n invalidContent: 'Comment cannot be empty.',\n composerCancel: 'Cancel',\n composerEditingEyebrow: 'Editing comment',\n composerReplyingEyebrow: 'Replying to {{name}}',\n\n composerAttachmentLabel: 'Attach file',\n composerReferenceLabel: 'Mention or link',\n composerReferenceMenuTitle: 'Insert reference',\n composerReferenceSearchPlaceholder: 'Search…',\n composerReferenceEmpty: 'No matches.',\n composerReferenceLoading: 'Searching…',\n\n fallbackAuthor: 'Anonymous',\n pinned: 'Pinned',\n edited: 'edited',\n deleteLabel: 'Delete',\n editLabel: 'Edit',\n replyLabel: 'Reply',\n pinLabel: 'Pin',\n unpinLabel: 'Unpin',\n moreActionsLabel: 'More actions',\n confirmDeleteLabel: 'Delete comment',\n\n attachmentFallback: 'Attachment',\n attachmentRemoveLabel: 'Remove attachment',\n attachmentUploadingLabel: 'Uploading…',\n attachmentFailedLabel: 'Upload failed',\n attachmentTooLargeError: 'File is too large.',\n attachmentTooManyError: 'Too many attachments.',\n attachmentRetryLabel: 'Retry',\n attachmentDownloadLabel: 'Download',\n\n addReactionLabel: 'Add reaction',\n\n showRepliesLabel: 'Show replies',\n hideRepliesLabel: 'Hide replies',\n};\n\n/**\n * Tiny `{{token}}` interpolator used by templated strings like\n * `composerReplyingEyebrow`. No HTML escaping — treat values as plain text.\n */\nexport function interpolateString(\n template: string,\n values: Record<string, string | number | undefined>,\n): string {\n return template.replace(/\\{\\{(\\w+)\\}\\}/g, (_, key: string) => {\n const value = values[key];\n return value === undefined || value === null ? '' : String(value);\n });\n}\n","/**\n * Comments — internal helper hooks for resolving strings and accessors.\n *\n * Rationale: the previous `<CommentsProvider>` is gone. Library-wide\n * defaults now live in `<UIProvider>` (`useMediaConfig` / `useDatesConfig`).\n * Per-mount overrides flow as direct props on `<Comments>` and its\n * partials. These helpers just centralize the merge order.\n *\n * Resolution order everywhere:\n *\n * props.strings ← deep-merged over `defaultCommentsStrings`\n * props.accessor.X ← falls back to UIProvider's media/dates resolvers,\n * then to a built-in default at the call site.\n */\nimport { useMemo } from 'react';\n\nimport { useDatesConfig, useMediaConfig } from '@/lib/ui-provider';\n\nimport {\n defaultCommentsStrings,\n type CommentsStrings,\n} from './comments.strings';\nimport type { CommentAttachment, CommentsAccessors } from './comments.types';\n\n/**\n * Resolve final strings by merging defaults → component prop. Stable\n * identity when the prop reference is unchanged.\n */\nexport function useResolvedStrings(\n propStrings?: Partial<CommentsStrings>,\n): CommentsStrings {\n return useMemo(\n () => ({\n ...defaultCommentsStrings,\n ...(propStrings ?? {}),\n }),\n [propStrings],\n );\n}\n\n/**\n * Resolve accessors. Order:\n * 1. explicit prop accessor\n * 2. matching UIProvider slot (`useMediaConfig().resolveUrl`, etc.)\n * 3. caller's own fallback when neither is present (handled at call site)\n */\nexport function useResolvedAccessors(\n propAccessors?: CommentsAccessors,\n): CommentsAccessors {\n const media = useMediaConfig();\n const dates = useDatesConfig();\n return useMemo<CommentsAccessors>(\n () => ({\n getMediaUrl:\n propAccessors?.getMediaUrl ??\n ((m: CommentAttachment | null | undefined) =>\n media.resolveUrl?.((m ?? {}) as { url?: string; key?: string })),\n getMediaName:\n propAccessors?.getMediaName ??\n ((m: CommentAttachment | null | undefined) =>\n media.resolveName?.((m ?? {}) as { name?: string })),\n getStatusLabel: propAccessors?.getStatusLabel,\n formatRelativeTime:\n propAccessors?.formatRelativeTime ?? dates.formatRelativeTime,\n }),\n [propAccessors, media, dates.formatRelativeTime],\n );\n}\n","/**\n * CommentAttachmentChip — small attachment pill used in the composer draft\n * and the timeline. Single inline row: icon + name · size, with progress /\n * error states overlaid on the same line. Editable mode reveals a remove\n * button; failed uploads expose a retry pill.\n */\nimport { File, FileText, Image as ImageIcon, Loader2, Paperclip, X } from 'lucide-react';\nimport type { FC } from 'react';\n\nimport { Text } from '@/components/typography';\nimport { cn } from '@/lib/utils';\n\nimport type {\n CommentAttachment,\n CommentsAccessors,\n} from '../comments.types';\nimport {\n defaultCommentsStrings,\n type CommentsStrings,\n} from '../comments.strings';\n\nexport interface CommentAttachmentChipProps {\n attachment: CommentAttachment;\n /** Editable mode shows a remove button. */\n editable?: boolean;\n onRemove?: (id: string) => void;\n onRetry?: (id: string) => void;\n accessors?: CommentsAccessors;\n strings?: Partial<CommentsStrings>;\n /** Compact chips have smaller text and tighter padding. */\n compact?: boolean;\n className?: string;\n}\n\nfunction formatBytes(bytes?: number): string | null {\n if (typeof bytes !== 'number' || bytes <= 0) return null;\n if (bytes < 1024) return `${bytes} B`;\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`;\n return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;\n}\n\nfunction pickIcon(att: CommentAttachment) {\n if (att.mimeType?.startsWith('image/')) return ImageIcon;\n if (att.mimeType === 'application/pdf') return FileText;\n if (att.mimeType?.startsWith('text/')) return FileText;\n if (att.mimeType) return File;\n return Paperclip;\n}\n\nexport const CommentAttachmentChip: FC<CommentAttachmentChipProps> = ({\n attachment,\n editable = false,\n onRemove,\n onRetry,\n accessors,\n strings: stringsProp,\n compact = false,\n className,\n}) => {\n const strings: CommentsStrings = {\n ...defaultCommentsStrings,\n ...stringsProp,\n };\n\n const url = accessors?.getMediaUrl?.(attachment) ?? attachment.url;\n const name =\n accessors?.getMediaName?.(attachment) ??\n attachment.name ??\n strings.attachmentFallback;\n const Icon = pickIcon(attachment);\n\n const isUploading = attachment.status === 'uploading';\n const isFailed = attachment.status === 'failed';\n const sizeLabel = formatBytes(attachment.size);\n\n const meta = isUploading\n ? strings.attachmentUploadingLabel +\n (typeof attachment.progress === 'number'\n ? ` ${Math.round(attachment.progress)}%`\n : '')\n : isFailed\n ? attachment.error ?? strings.attachmentFailedLabel\n : sizeLabel;\n\n const surface = cn(\n 'relative inline-flex min-w-0 max-w-[20rem] items-center gap-1.5 rounded-md',\n 'ring-1 ring-inset transition-colors',\n compact ? 'px-2 py-1 text-xs' : 'px-2.5 py-1 text-xs',\n isFailed\n ? 'bg-destructive/[0.04] ring-destructive/30 hover:bg-destructive/[0.08]'\n : 'bg-foreground/[0.03] ring-border/60 hover:bg-foreground/[0.06]',\n className,\n );\n\n const iconNode = isUploading ? (\n <Loader2\n className={cn('shrink-0 animate-spin text-muted-foreground', 'size-3.5')}\n aria-hidden\n />\n ) : (\n <Icon\n className={cn(\n 'shrink-0',\n 'size-3.5',\n isFailed ? 'text-destructive' : 'text-muted-foreground',\n )}\n aria-hidden\n />\n );\n\n const labelRow = (\n <span className=\"inline-flex min-w-0 items-baseline gap-1.5\">\n <Text\n tag=\"span\"\n size=\"xs\"\n weight=\"medium\"\n className={cn('truncate', isFailed && 'text-destructive')}\n >\n {name}\n </Text>\n {meta ? (\n <Text\n tag=\"span\"\n size=\"xxs\"\n type=\"secondary\"\n className=\"shrink-0 tabular-nums\"\n >\n {meta}\n </Text>\n ) : null}\n </span>\n );\n\n const isInteractive = !!url && !isUploading && !isFailed;\n\n return (\n <div className={surface}>\n {iconNode}\n {isInteractive ? (\n <a\n href={url}\n target=\"_blank\"\n rel=\"noreferrer noopener\"\n className=\"inline-flex min-w-0 flex-1 items-baseline gap-1.5 hover:underline\"\n aria-label={strings.attachmentDownloadLabel}\n >\n {labelRow}\n </a>\n ) : (\n labelRow\n )}\n\n {isUploading && typeof attachment.progress === 'number' && (\n <div className=\"bg-primary/15 absolute bottom-0 left-2 right-2 h-px overflow-hidden rounded-full\">\n <div\n className=\"bg-primary h-full transition-[width]\"\n style={{\n width: `${Math.min(100, Math.max(0, attachment.progress))}%`,\n }}\n />\n </div>\n )}\n\n {isFailed && onRetry && (\n <button\n type=\"button\"\n onClick={() => onRetry(attachment.id)}\n className=\"text-destructive ring-destructive/30 hover:ring-destructive/60 shrink-0 rounded px-1.5 py-px text-xxs font-medium ring-1 ring-inset transition-colors\"\n >\n {strings.attachmentRetryLabel}\n </button>\n )}\n\n {editable && onRemove && (\n <button\n type=\"button\"\n onClick={() => onRemove(attachment.id)}\n className=\"text-muted-foreground hover:bg-foreground/10 hover:text-foreground -mr-0.5 inline-flex size-4 shrink-0 items-center justify-center rounded transition-colors focus-visible:ring-2 focus-visible:ring-ring/40\"\n aria-label={strings.attachmentRemoveLabel}\n title={strings.attachmentRemoveLabel}\n >\n <X className=\"size-3\" />\n </button>\n )}\n </div>\n );\n};\n","/**\n * useAttachmentUpload — manages a list of in-flight + uploaded\n * `CommentAttachment`s for a comment composer.\n *\n * Pass the consumer-supplied `onUpload` callback directly via the\n * `attachments` prop on `<Comments>` (or `<CommentComposer>`). Aborts\n * in-flight uploads when an attachment is removed.\n */\nimport { useCallback, useEffect, useMemo, useRef, useState } from 'react';\n\nimport type {\n CommentAttachment,\n CommentsAttachmentsConfig,\n} from '../comments.types';\n\ninterface InFlightEntry {\n controller: AbortController;\n}\n\nexport interface UseAttachmentUploadOptions extends CommentsAttachmentsConfig {\n /** Initial attachments — useful when editing an existing comment. */\n initialAttachments?: ReadonlyArray<CommentAttachment>;\n /** Fires when the list of uploaded attachments changes. */\n onChange?: (attachments: ReadonlyArray<CommentAttachment>) => void;\n /** Fires when a validation or upload error happens. */\n onError?: (error: string) => void;\n}\n\nexport interface UseAttachmentUploadReturn {\n /** All attachments — uploading + uploaded + failed. */\n attachments: ReadonlyArray<CommentAttachment>;\n /** Subset of attachments that finished uploading. Use this in the form payload. */\n uploadedAttachments: ReadonlyArray<CommentAttachment>;\n /** True while at least one upload is in flight. */\n isUploading: boolean;\n /** Add files. Validates against `maxSize` / `maxFiles` first. */\n addFiles: (files: ReadonlyArray<File> | FileList) => void;\n /** Remove an attachment by id (aborts in-flight uploads). */\n removeAttachment: (id: string) => void;\n /** Retry a failed upload. */\n retryAttachment: (id: string) => void;\n /** Replace the list (used when editing or after submit). */\n setAttachments: (attachments: ReadonlyArray<CommentAttachment>) => void;\n /** Clear the list and abort everything in flight. */\n reset: () => void;\n}\n\nexport function useAttachmentUpload(\n options: UseAttachmentUploadOptions = {},\n): UseAttachmentUploadReturn {\n const {\n onUpload,\n maxSize,\n maxFiles,\n // `accept` is consumed by the surrounding `<input type=\"file\"\n // accept>` element, not here — destructuring is intentional\n // even though we don't reference it inside the hook.\n disabled,\n initialAttachments,\n onChange,\n onError,\n } = options;\n\n const [attachments, setAttachmentsState] = useState<CommentAttachment[]>(() =>\n initialAttachments ? [...initialAttachments] : [],\n );\n const inFlightRef = useRef<Map<string, InFlightEntry>>(new Map());\n const fileCacheRef = useRef<Map<string, File>>(new Map());\n const onChangeRef = useRef(onChange);\n onChangeRef.current = onChange;\n\n const updateAttachment = useCallback(\n (id: string, patch: Partial<CommentAttachment>) => {\n setAttachmentsState((prev) =>\n prev.map((a) => (a.id === id ? { ...a, ...patch } : a)),\n );\n },\n [],\n );\n\n const setAttachments = useCallback(\n (next: ReadonlyArray<CommentAttachment>) => {\n setAttachmentsState([...next]);\n },\n [],\n );\n\n const beginUpload = useCallback(\n (id: string, file: File) => {\n if (!onUpload) return;\n const controller = new AbortController();\n inFlightRef.current.set(id, { controller });\n\n updateAttachment(id, {\n status: 'uploading',\n progress: 0,\n error: undefined,\n });\n\n const onProgress = (progress: number) => {\n updateAttachment(id, { progress });\n };\n\n onUpload({ file, onProgress, signal: controller.signal })\n .then((uploaded) => {\n inFlightRef.current.delete(id);\n updateAttachment(id, {\n ...uploaded,\n id,\n status: 'uploaded',\n progress: 100,\n error: undefined,\n });\n })\n .catch((err: unknown) => {\n inFlightRef.current.delete(id);\n if (controller.signal.aborted) {\n return;\n }\n const message =\n err instanceof Error ? err.message : 'Upload failed';\n updateAttachment(id, {\n status: 'failed',\n error: message,\n });\n onError?.(message);\n });\n },\n [onError, onUpload, updateAttachment],\n );\n\n const addFiles = useCallback(\n (filesInput: ReadonlyArray<File> | FileList) => {\n if (disabled || !onUpload) return;\n const files = Array.from(filesInput);\n if (files.length === 0) return;\n\n setAttachmentsState((prev) => {\n const next = [...prev];\n for (const file of files) {\n if (\n typeof maxFiles === 'number' &&\n next.length >= maxFiles\n ) {\n onError?.('Too many attachments.');\n break;\n }\n if (\n typeof maxSize === 'number' &&\n file.size > maxSize\n ) {\n onError?.('File is too large.');\n continue;\n }\n\n const id =\n typeof crypto !== 'undefined' && 'randomUUID' in crypto\n ? crypto.randomUUID()\n : `att-${Date.now()}-${Math.random().toString(36).slice(2)}`;\n\n fileCacheRef.current.set(id, file);\n\n next.push({\n id,\n name: file.name,\n size: file.size,\n mimeType: file.type,\n status: 'uploading',\n progress: 0,\n });\n\n queueMicrotask(() => beginUpload(id, file));\n }\n return next;\n });\n },\n [beginUpload, disabled, maxFiles, maxSize, onError, onUpload],\n );\n\n const removeAttachment = useCallback((id: string) => {\n const entry = inFlightRef.current.get(id);\n if (entry) {\n entry.controller.abort();\n inFlightRef.current.delete(id);\n }\n fileCacheRef.current.delete(id);\n setAttachmentsState((prev) => prev.filter((a) => a.id !== id));\n }, []);\n\n const retryAttachment = useCallback(\n (id: string) => {\n const file = fileCacheRef.current.get(id);\n if (!file) return;\n beginUpload(id, file);\n },\n [beginUpload],\n );\n\n const reset = useCallback(() => {\n for (const entry of inFlightRef.current.values()) {\n entry.controller.abort();\n }\n inFlightRef.current.clear();\n fileCacheRef.current.clear();\n setAttachmentsState([]);\n }, []);\n\n useEffect(() => {\n onChangeRef.current?.(attachments);\n }, [attachments]);\n\n useEffect(() => {\n const inFlight = inFlightRef.current;\n return () => {\n for (const entry of inFlight.values()) {\n entry.controller.abort();\n }\n };\n }, []);\n\n const uploadedAttachments = useMemo(\n () => attachments.filter((a) => a.status === 'uploaded' || !a.status),\n [attachments],\n );\n\n const isUploading = useMemo(\n () => attachments.some((a) => a.status === 'uploading'),\n [attachments],\n );\n\n return {\n attachments,\n uploadedAttachments,\n isUploading,\n addFiles,\n removeAttachment,\n retryAttachment,\n setAttachments,\n reset,\n };\n}\n","/**\n * CommentComposer — TipTap-backed rich text editor with inline reference\n * picker and attachment uploader. Default composer for `<Comments>`.\n *\n * Mention/reference handling is delegated to the shared\n * `features/mentions` module: `useMentions` drives picker state +\n * caret-trigger detection, `<MentionPicker>` renders the popover, and\n * `<MentionChip>` renders draft-list chips. The same primitives power\n * inline references in `features/event-log`.\n */\nimport { AtSign, Loader2, Paperclip, Send, X } from 'lucide-react';\nimport {\n forwardRef,\n useEffect,\n useImperativeHandle,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport type { ReactNode } from 'react';\n\nimport { Button } from '@/components/base/buttons';\nimport { Popover, PopoverTrigger } from '@/components/base/popover';\nimport { Text } from '@/components/typography';\nimport {\n RichTextEditor,\n type RichTextEditorHandle,\n type RichTextEditorToolbarItem,\n} from '@/components/features/rich-text-editor/rich-text-editor';\nimport {\n MentionInlineSuggestions,\n MentionPicker,\n parseMentionsFromHtml,\n useMentions,\n} from '@/components/features/mentions';\nimport { useResolvedStrings } from '../comments-provider';\nimport { interpolateString } from '../comments.strings';\nimport type {\n CommentComposerProps,\n CommentFormValues,\n} from '../comments.types';\nimport { CommentAttachmentChip } from './comment-attachment-chip';\nimport { useAttachmentUpload } from '../hooks/use-attachment-upload';\n\nexport interface CommentComposerHandle {\n focus(): void;\n clear(): void;\n /** Imperatively set the draft body. */\n setBody(html: string): void;\n}\n\nfunction hasMeaningfulContent(html: string): boolean {\n if (!html || typeof html !== 'string') return false;\n const text = html.replace(/<[^>]*>/g, '').trim();\n return text.length > 0;\n}\n\nexport const CommentComposer = forwardRef<\n CommentComposerHandle,\n CommentComposerProps\n>(function CommentComposer(\n {\n context,\n canComment = true,\n isSubmitting = false,\n errors,\n resetKey = 0,\n onSubmit,\n onCancel,\n editingComment,\n strings: stringsProp,\n resources: resourcesProp,\n onResourceSearch: onResourceSearchProp,\n attachments: attachmentsProp,\n initialValues,\n autoFocus = false,\n inlineSubmit = true,\n placeholder,\n },\n ref,\n) {\n const strings = useResolvedStrings(stringsProp);\n\n const resources = resourcesProp;\n const onResourceSearch = onResourceSearchProp;\n const attachmentsConfig = attachmentsProp;\n\n const editorRef = useRef<RichTextEditorHandle>(null);\n const [body, setBody] = useState<string>(\n () => initialValues?.content ?? editingComment?.content ?? '',\n );\n const [contentError, setContentError] = useState<string | null>(null);\n\n /**\n * Mentions state — picker + caret-trigger detection. The hook reads\n * the editor handle via the ref we pass; on suggestion select it\n * inserts the chip and replaces the trigger range automatically.\n */\n const mentions = useMentions({\n resources,\n onResourceSearch,\n editorRef,\n initialMentions:\n initialValues?.references ?? editingComment?.references,\n });\n\n const attachmentUpload = useAttachmentUpload({\n ...attachmentsConfig,\n initialAttachments: initialValues?.attachments ?? undefined,\n });\n\n useImperativeHandle(\n ref,\n () => ({\n focus: () => editorRef.current?.focus(),\n clear: () => {\n editorRef.current?.clear();\n mentions.reset();\n attachmentUpload.reset();\n setContentError(null);\n },\n setBody: (html) => {\n editorRef.current?.setHTML(html);\n },\n }),\n [attachmentUpload, mentions],\n );\n\n // Reset on context change / resetKey bump\n useEffect(() => {\n editorRef.current?.setHTML(initialValues?.content ?? '');\n mentions.setMentions(initialValues?.references ?? []);\n attachmentUpload.setAttachments(initialValues?.attachments ?? []);\n setContentError(null);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [context.id, context.type, resetKey]);\n\n // Sync editing comment payload\n useEffect(() => {\n if (!editingComment) return;\n editorRef.current?.setHTML(editingComment.content ?? '');\n mentions.setMentions(editingComment.references ?? []);\n const list = (editingComment.attachments ?? editingComment.media ?? []).filter(\n (a): a is NonNullable<typeof a> => !!a,\n );\n attachmentUpload.setAttachments(list);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [editingComment?.id]);\n\n // Surface server-side errors\n useEffect(() => {\n if (errors?.content) {\n setContentError(errors.content);\n }\n }, [errors]);\n\n const handleSubmit = (event?: React.FormEvent) => {\n event?.preventDefault();\n const html = editorRef.current?.getHTML() ?? body;\n if (!hasMeaningfulContent(html)) {\n setContentError(strings.invalidContent);\n return;\n }\n setContentError(null);\n\n const values: CommentFormValues = {\n content: html,\n commentableId: context.id,\n commentableType: context.type,\n contentType: 'html',\n references: mentions.mentions,\n attachments: attachmentUpload.uploadedAttachments,\n editingId: editingComment?.id,\n };\n\n onSubmit(values);\n };\n\n const fileInputRef = useRef<HTMLInputElement>(null);\n const handleAttachmentClick = () => fileInputRef.current?.click();\n const handleFiles = (files: FileList | null) => {\n if (!files) return;\n attachmentUpload.addFiles(files);\n };\n\n const hasAttachments = attachmentUpload.attachments.length > 0;\n const isEditing = !!editingComment;\n\n const submitLabel = isSubmitting\n ? strings.composerSubmitting\n : isEditing\n ? strings.composerSave\n : strings.composerSubmit;\n\n const eyebrow: ReactNode = isEditing ? (\n <ComposerEyebrow\n label={strings.composerEditingEyebrow}\n closeLabel={strings.composerCancel}\n onClose={onCancel}\n />\n ) : null;\n\n const extraToolbarItems = useMemo<ReadonlyArray<RichTextEditorToolbarItem>>(() => {\n const items: RichTextEditorToolbarItem[] = [];\n if (resources && Object.keys(resources).length > 0) {\n items.push({\n id: 'reference',\n icon: AtSign,\n label: strings.composerReferenceLabel,\n onClick: () => mentions.setPickerOpen(true),\n });\n }\n if (attachmentsConfig?.onUpload && !attachmentsConfig.disabled) {\n items.push({\n id: 'attachment',\n icon: Paperclip,\n label: strings.composerAttachmentLabel,\n onClick: handleAttachmentClick,\n });\n }\n return items;\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [\n resources,\n attachmentsConfig?.onUpload,\n attachmentsConfig?.disabled,\n strings.composerReferenceLabel,\n strings.composerAttachmentLabel,\n ]);\n\n if (!canComment) return null;\n\n const submitButton = (\n <Button\n type=\"button\"\n onClick={() => handleSubmit()}\n disabled={isSubmitting || attachmentUpload.isUploading}\n icon={isSubmitting ? Loader2 : Send}\n >\n {submitLabel}\n </Button>\n );\n\n const cancelButton = (isEditing || onCancel) ? (\n <Button\n type=\"button\"\n variant=\"secondary\"\n buttonStyle=\"ghost\"\n onClick={onCancel}\n disabled={isSubmitting}\n >\n {strings.composerCancel}\n </Button>\n ) : null;\n\n // Mentions live as inline `<span class=\"rsc-mention\" contenteditable=\"false\">`\n // chips inside the editor body — they're visible, dismissible (single\n // backspace deletes the whole span), and the HTML→mentions sync keeps\n // `mentions.mentions` aligned automatically. Rendering them again as a\n // chip-list below the editor was redundant and confusing.\n\n const attachmentChips = hasAttachments ? (\n <div className=\"flex flex-wrap items-center gap-1.5\">\n {attachmentUpload.attachments.map((attachment) => (\n <CommentAttachmentChip\n key={attachment.id}\n attachment={attachment}\n editable\n onRemove={attachmentUpload.removeAttachment}\n onRetry={attachmentUpload.retryAttachment}\n strings={stringsProp}\n />\n ))}\n </div>\n ) : null;\n\n const footerSlot = hasAttachments ? attachmentChips : null;\n\n const trailingSubmit = inlineSubmit !== false ? submitButton : null;\n const showFooterRow = inlineSubmit === false || isEditing;\n\n return (\n <form onSubmit={handleSubmit} className=\"space-y-2\">\n {eyebrow}\n\n <input\n ref={fileInputRef}\n type=\"file\"\n multiple\n hidden\n accept={attachmentsConfig?.accept}\n onChange={(e) => {\n handleFiles(e.target.files);\n e.target.value = '';\n }}\n />\n\n {/* Manual button-click flow: regular popover anchored to the\n hidden trigger. The inline-trigger flow uses the panel\n rendered below — no focus stealing while the user types. */}\n {!mentions.triggerActive && (\n <Popover open={mentions.pickerOpen} onOpenChange={mentions.setPickerOpen}>\n <PopoverTrigger\n render={\n <button\n type=\"button\"\n className=\"sr-only\"\n tabIndex={-1}\n />\n }\n >\n {strings.composerReferenceLabel}\n </PopoverTrigger>\n <MentionPicker\n open={mentions.pickerOpen}\n activeKind={mentions.activeKind}\n setActiveKind={mentions.setActiveKind}\n kinds={mentions.kinds}\n resources={resources}\n query={mentions.query}\n setQuery={mentions.setQuery}\n suggestions={mentions.suggestions}\n isLoading={mentions.isLoading}\n onSelect={mentions.pickSuggestion}\n strings={{\n title: strings.composerReferenceMenuTitle,\n searchPlaceholder: strings.composerReferenceSearchPlaceholder,\n empty: strings.composerReferenceEmpty,\n loading: strings.composerReferenceLoading,\n }}\n />\n </Popover>\n )}\n\n <div className=\"relative\">\n <RichTextEditor\n ref={editorRef}\n value={body}\n onChange={(html) => {\n setBody(html);\n // Sync the draft's mentions list with what's\n // actually present in the HTML — when the user\n // backspaces a chip span out of the body, the\n // chip-list below shrinks too. We merge with\n // the previously-known list so consumer-supplied\n // `href` / `data` payloads survive parsing.\n const parsed = parseMentionsFromHtml<string>(html);\n const previous = mentions.mentions;\n const previousIds = previous.map((m) => m.id).join('|');\n const currentIds = parsed.map((m) => m.id).join('|');\n if (previousIds !== currentIds) {\n const byId = new Map(previous.map((m) => [m.id, m]));\n const merged = parsed.map(\n (p) => byId.get(p.id) ?? p,\n );\n mentions.setMentions(merged);\n }\n }}\n placeholder={placeholder ?? strings.composerPlaceholder}\n minHeight=\"3rem\"\n autoFocus={autoFocus || isEditing}\n extraToolbarItems={extraToolbarItems}\n toolbarTrailing={trailingSubmit}\n footerSlot={footerSlot}\n onCaretChange={mentions.handleCaretChange}\n />\n\n <MentionInlineSuggestions\n open={mentions.triggerActive && mentions.pickerOpen}\n activeKind={mentions.activeKind}\n setActiveKind={mentions.setActiveKind}\n onManualKindChange={() => mentions.setManualKindOverride(true)}\n kinds={mentions.kinds}\n resources={resources}\n query={mentions.query}\n suggestions={mentions.suggestions}\n suggestionsByKind={mentions.suggestionsByKind}\n isLoading={mentions.isLoading}\n onSelect={mentions.pickSuggestion}\n strings={{\n title: strings.composerReferenceMenuTitle,\n empty: strings.composerReferenceEmpty,\n loading: strings.composerReferenceLoading,\n }}\n />\n </div>\n\n {contentError && (\n <Text size=\"xs\" type=\"error\">\n {contentError}\n </Text>\n )}\n\n {showFooterRow && (\n <div className=\"flex items-center justify-end gap-2\">\n {cancelButton}\n {submitButton}\n </div>\n )}\n </form>\n );\n});\n\n/* ------------------------------------------------------------------ */\n/* ComposerEyebrow */\n/* ------------------------------------------------------------------ */\n\nfunction ComposerEyebrow({\n label,\n closeLabel,\n onClose,\n}: {\n label: string;\n closeLabel: string;\n onClose?: () => void;\n}) {\n return (\n <div className=\"bg-muted/40 ring-border/60 flex items-center justify-between rounded px-2.5 py-1.5 ring-1 ring-inset\">\n <Text size=\"xxs\" type=\"secondary\" weight=\"medium\" className=\"uppercase tracking-wide\">\n {label}\n </Text>\n {onClose ? (\n <button\n type=\"button\"\n onClick={onClose}\n className=\"text-muted-foreground hover:text-foreground inline-flex size-4 items-center justify-center rounded transition-colors\"\n aria-label={closeLabel}\n >\n <X className=\"size-3\" />\n </button>\n ) : null}\n </div>\n );\n}\n\n/** Helper export for templated reply eyebrow. */\nexport function makeReplyEyebrow(template: string, name?: string): string {\n return interpolateString(template, { name: name ?? '' });\n}\n","/**\n * CommentEmpty — default empty state for the timeline. Replaceable via\n * the `emptySlot` prop on `<Comments>` / `<CommentTimeline>`.\n */\nimport { MessageCircle } from 'lucide-react';\nimport type { FC, ReactNode } from 'react';\n\nimport { Text } from '@/components/typography';\nimport { cn } from '@/lib/utils';\n\nimport { useResolvedStrings } from '../comments-provider';\nimport type { CommentsStrings } from '../comments.strings';\n\nexport interface CommentEmptyProps {\n strings?: Partial<CommentsStrings>;\n icon?: ReactNode;\n className?: string;\n}\n\nexport const CommentEmpty: FC<CommentEmptyProps> = ({\n strings: stringsProp,\n icon,\n className,\n}) => {\n const strings = useResolvedStrings(stringsProp);\n\n return (\n <div\n className={cn(\n 'flex flex-col items-center justify-center py-8 text-center',\n className,\n )}\n >\n <div className=\"bg-muted/50 mb-3 flex h-12 w-12 items-center justify-center rounded-full\">\n {icon ?? (\n <MessageCircle className=\"text-muted-foreground/60 h-5 w-5\" />\n )}\n </div>\n <Text weight=\"medium\">\n {strings.empty}\n </Text>\n {strings.emptyHint ? (\n <Text size=\"xs\" type=\"secondary\" className=\"mt-1 max-w-[28ch]\">\n {strings.emptyHint}\n </Text>\n ) : null}\n </div>\n );\n};\n","import type { ReactNode } from 'react';\nimport { Fragment, createElement } from 'react';\n\nimport { Heading, Text } from '@/components/typography';\nimport type { HeadingProps } from '@/components/typography';\nimport { MentionContent } from '@/components/features/mentions';\n\nimport type {\n CommentData,\n CommentUser,\n CommentsConfig,\n CommentsSlots,\n} from '../comments.types';\n\ninterface CommentContentProps<TResource extends string = string> {\n comment: CommentData<CommentUser, unknown, TResource>;\n /** Resource registry — passed through to `<MentionContent>`. */\n resources?: CommentsConfig<CommentUser, unknown, TResource>['resources'];\n renderReference?: CommentsSlots<\n CommentUser,\n unknown,\n TResource\n >['renderReference'];\n /** Optional sanitizer applied to HTML before rendering. */\n sanitizer?: (html: string) => string;\n}\n\n/**\n * `renderCommentContent` — backwards-compatible export that renders only\n * the comment body text (no references resolution). Use the\n * `<CommentContent>` component below for the full feature surface.\n */\nexport function renderCommentContent<TResource extends string = string>(\n comment: CommentData<CommentUser, unknown, TResource>,\n): ReactNode {\n return <CommentContent comment={comment} />;\n}\n\nexport function CommentContent<TResource extends string = string>(\n props: CommentContentProps<TResource>,\n): ReactNode {\n const { comment, resources, renderReference, sanitizer } = props;\n const contentType =\n comment.contentType ??\n (comment as Record<string, unknown>).content_type ??\n 'text';\n\n if (contentType === 'rich') {\n return renderRichContent(comment.content);\n }\n\n if (contentType === 'html') {\n return (\n <MentionContent<TResource>\n html={comment.content ?? ''}\n mentions={comment.references}\n resources={resources}\n renderMention={renderReference}\n sanitizer={sanitizer}\n />\n );\n }\n\n const plainContent = decodeQuotedString(comment.content ?? '');\n\n return (\n <Text className=\"whitespace-pre-line\">\n {plainContent}\n </Text>\n );\n}\n\n/* ------------------------------------------------------------------ */\n/* Rich-block renderer (legacy \"rich\" content type) */\n/* ------------------------------------------------------------------ */\n\nfunction renderRichContent(rawContent: string | null | undefined): ReactNode {\n if (!rawContent) return null;\n\n try {\n const parsed = JSON.parse(rawContent) as {\n blocks?: Array<{ id?: string; type: string; data?: Record<string, unknown> }>;\n };\n\n if (!parsed || !Array.isArray(parsed.blocks) || parsed.blocks.length === 0) {\n return null;\n }\n\n return (\n <div className=\"prose prose-sm prose-p:my-0.5 prose-headings:my-1 prose-a:text-primary prose-a:no-underline hover:prose-a:underline max-w-none space-y-1\">\n {parsed.blocks.map((block, index) => (\n <Fragment key={block.id ?? `${block.type}-${index}`}>\n {renderRichBlock(block)}\n </Fragment>\n ))}\n </div>\n );\n } catch {\n const decoded = decodeQuotedString(rawContent);\n return (\n <Text className=\"whitespace-pre-line\">\n {decoded}\n </Text>\n );\n }\n}\n\nfunction renderRichBlock(block: { type: string; data?: Record<string, unknown> }): ReactNode {\n const data = block.data ?? {};\n\n switch (block.type) {\n case 'paragraph': {\n const raw = String(data.text ?? '').trim();\n if (!raw) return null;\n return <Text asHTML content={raw} />;\n }\n case 'header': {\n const text = stripHtml(String(data.text ?? ''));\n const level = Number(data.level ?? 3);\n if (!text) return null;\n const safeLevel = Math.min(Math.max(level, 1), 6);\n return createElement(\n Heading,\n { tag: `h${safeLevel}` as HeadingProps['tag'] },\n text,\n );\n }\n case 'list': {\n const items = Array.isArray(data.items) ? data.items : [];\n const sanitizedItems = items\n .map((item) => stripHtml(String(item ?? '')))\n .filter((item) => item.length > 0);\n\n if (sanitizedItems.length === 0) return null;\n\n if (data.style === 'ordered') {\n return (\n <ol className=\"ml-6 list-decimal space-y-1 text-sm\">\n {sanitizedItems.map((item, index) => (\n <li key={`${item}-${index}`}>{item}</li>\n ))}\n </ol>\n );\n }\n\n return (\n <ul className=\"ml-6 list-disc space-y-1 text-sm\">\n {sanitizedItems.map((item) => (\n <li key={item}>{item}</li>\n ))}\n </ul>\n );\n }\n case 'quote': {\n const text = String(data.text ?? '').trim();\n if (!text) return null;\n const caption = stripHtml(String(data.caption ?? ''));\n return (\n <blockquote className=\"border-muted text-muted-foreground border-l-2 pl-3 text-sm italic\">\n <Text asHTML content={text} />\n {caption.length > 0 && (\n <cite className=\"text-muted-foreground/80 mt-1 block text-xs not-italic\">\n — {caption}\n </cite>\n )}\n </blockquote>\n );\n }\n case 'delimiter':\n return (\n <div\n className=\"border-muted my-4 border-b border-dashed\"\n aria-hidden=\"true\"\n />\n );\n default: {\n const text = stripHtml(String(data.text ?? ''));\n if (!text) return null;\n return (\n <Text className=\"whitespace-pre-line\">\n {text}\n </Text>\n );\n }\n }\n}\n\nfunction stripHtml(value: string): string {\n return value.replace(/<[^>]*>/g, '').trim();\n}\n\nfunction decodeQuotedString(value: string | null | undefined): string {\n if (typeof value !== 'string') return '';\n const trimmed = value.trim();\n if (trimmed === '') return '';\n if (trimmed.startsWith('{') || trimmed.startsWith('[')) return trimmed;\n try {\n const parsed = JSON.parse(trimmed);\n if (typeof parsed === 'string') return parsed;\n } catch {\n // ignore\n }\n if (trimmed.startsWith('\"') && trimmed.endsWith('\"')) {\n return trimmed.slice(1, -1);\n }\n return trimmed;\n}\n","import { formatDistanceToNow } from 'date-fns';\nimport {\n CornerDownRight,\n Pencil,\n Pin,\n Smile,\n Trash2,\n} from 'lucide-react';\nimport type { FC } from 'react';\nimport { memo, useMemo } from 'react';\n\nimport {\n Avatar,\n AvatarFallback,\n AvatarImage,\n} from '@/components/base/display/avatar';\nimport { Badge } from '@/components/base/badge';\nimport { Button } from '@/components/base/buttons';\nimport {\n Tooltip,\n TooltipContent,\n TooltipProvider,\n TooltipTrigger,\n} from '@/components/base/display/tooltip';\nimport { Text } from '@/components/typography';\nimport { cn } from '@/lib/utils';\n\nimport {\n useResolvedAccessors,\n useResolvedStrings,\n} from '../comments-provider';\nimport type {\n CommentAttachment,\n CommentItemProps,\n} from '../comments.types';\nimport { CommentAttachmentChip } from './comment-attachment-chip';\nimport { CommentContent } from './comment-content';\n\nconst FALLBACK_INITIAL = '?';\n\nconst defaultGetMediaUrl = (m: CommentAttachment | null | undefined) => m?.url;\nconst defaultGetMediaName = (m: CommentAttachment | null | undefined) => m?.name;\nconst defaultGetStatusLabel = (s: string) =>\n s.charAt(0).toUpperCase() + s.slice(1).replace(/_/g, ' ');\nconst defaultFormatRelativeTime = (iso: string) => {\n try {\n return formatDistanceToNow(new Date(iso), { addSuffix: true });\n } catch {\n return '—';\n }\n};\n\nexport const CommentItem = memo(function CommentItem<TResource extends string = string>({\n comment,\n canModerate,\n onDelete,\n onPinToggle,\n onReact,\n onReply,\n strings: stringsProp,\n getMediaUrl,\n getMediaName,\n getStatusLabel,\n formatRelativeTime,\n resources,\n renderAttachment,\n renderReference,\n}: CommentItemProps<import('../comments.types').CommentUser, unknown, TResource>) {\n const strings = useResolvedStrings(stringsProp);\n const accessors = useResolvedAccessors({\n getMediaUrl,\n getMediaName,\n getStatusLabel,\n formatRelativeTime,\n });\n\n const resolvedGetMediaUrl = accessors.getMediaUrl ?? defaultGetMediaUrl;\n const resolvedGetMediaName = accessors.getMediaName ?? defaultGetMediaName;\n const resolvedGetStatusLabel =\n accessors.getStatusLabel ?? defaultGetStatusLabel;\n const resolvedFormatRelativeTime =\n accessors.formatRelativeTime ?? defaultFormatRelativeTime;\n\n const authorName = comment.user?.name ?? strings.fallbackAuthor;\n const avatarUrl = comment.user?.avatar ?? undefined;\n\n const relativeTime = useMemo(() => {\n if (!comment.createdAt) return '—';\n return resolvedFormatRelativeTime(comment.createdAt);\n }, [comment.createdAt, resolvedFormatRelativeTime]);\n\n const fallbackInitial = useMemo(() => {\n if (!authorName) return FALLBACK_INITIAL;\n const trimmed = authorName.trim();\n return trimmed === ''\n ? FALLBACK_INITIAL\n : trimmed.charAt(0).toUpperCase();\n }, [authorName]);\n\n const tagList = useMemo(() => {\n if (Array.isArray(comment.tagsArray)) {\n return comment.tagsArray.filter(\n (tag): tag is string => typeof tag === 'string',\n );\n }\n if (comment.tagsArray && typeof comment.tagsArray === 'object') {\n return Object.values(comment.tagsArray).filter(\n (value): value is string => typeof value === 'string',\n );\n }\n return [];\n }, [comment.tagsArray]);\n\n const attachments = useMemo(() => {\n const list = comment.attachments ?? comment.media ?? [];\n return list.filter(\n (a): a is CommentAttachment => !!a && typeof a === 'object',\n );\n }, [comment.attachments, comment.media]);\n\n const reactions = comment.reactions ?? [];\n\n const isPinned = comment.isPinned === true;\n const isEdited = comment.isEdited === true;\n const showStatus = comment.status && comment.status !== 'active';\n const statusLabel =\n showStatus && comment.status ? resolvedGetStatusLabel(comment.status) : null;\n const canDeleteComment =\n comment.canDelete === true || canModerate === true;\n const canEditComment = comment.canEdit === true || canModerate === true;\n\n const hasAttachments = attachments.length > 0;\n\n return (\n <article\n className={cn(\n 'group relative overflow-hidden rounded-lg border transition-colors',\n 'border-border/60 bg-card hover:bg-muted/30 px-3 py-2.5',\n )}\n data-comment-id={comment.id}\n >\n <div className=\"flex items-start gap-3\">\n <Avatar className=\"mt-0.5 h-8 w-8 shrink-0\">\n {!!avatarUrl && (\n <AvatarImage src={avatarUrl} alt={authorName} />\n )}\n <AvatarFallback className=\"bg-muted text-muted-foreground text-xs font-medium\">\n {fallbackInitial}\n </AvatarFallback>\n </Avatar>\n\n <div className=\"min-w-0 flex-1\">\n <div className=\"flex min-w-0 items-baseline gap-2\">\n <Text\n tag=\"span\"\n weight=\"semibold\"\n className=\"truncate\"\n >\n {authorName}\n </Text>\n\n {!!isPinned && (\n <TooltipProvider delayDuration={0}>\n <Tooltip>\n <TooltipTrigger render={<span className=\"inline-flex shrink-0 self-center\" />}>\n <Pin className=\"text-warning size-3\" aria-hidden />\n </TooltipTrigger>\n <TooltipContent\n side=\"top\"\n className=\"text-xs\"\n >\n {strings.pinned}\n </TooltipContent>\n </Tooltip>\n </TooltipProvider>\n )}\n\n <Text\n tag=\"span\"\n size=\"xs\"\n type=\"secondary\"\n className=\"shrink-0 tabular-nums\"\n >\n {relativeTime}\n </Text>\n\n {!!isEdited && (\n <Text\n tag=\"span\"\n size=\"xs\"\n type=\"secondary\"\n className=\"shrink-0\"\n >\n {strings.edited}\n </Text>\n )}\n\n {!!showStatus && !!statusLabel && (\n <Badge variant=\"secondary\" className=\"self-center uppercase tracking-wide\">\n {statusLabel}\n </Badge>\n )}\n </div>\n\n <div className=\"mt-1 text-sm leading-relaxed\">\n <CommentContent\n comment={comment}\n resources={resources}\n renderReference={renderReference}\n />\n </div>\n\n {tagList.length > 0 && (\n <div className=\"mt-2 flex flex-wrap gap-1.5\">\n {tagList.map((tag) => (\n <Badge key={tag} variant=\"secondary\" className=\"uppercase tracking-wide\">\n {tag}\n </Badge>\n ))}\n </div>\n )}\n\n {hasAttachments && (\n <div className=\"mt-2 flex flex-wrap gap-1.5\">\n {attachments.map((attachment) => {\n if (renderAttachment) {\n return (\n <div key={attachment.id ?? attachment.name}>\n {renderAttachment(attachment)}\n </div>\n );\n }\n return (\n <CommentAttachmentChip\n key={attachment.id ?? attachment.name}\n attachment={attachment}\n accessors={{\n getMediaUrl: resolvedGetMediaUrl,\n getMediaName: resolvedGetMediaName,\n }}\n strings={stringsProp}\n />\n );\n })}\n </div>\n )}\n\n {reactions.length > 0 && (\n <div className=\"mt-2 flex flex-wrap items-center gap-1\">\n {reactions.map((reaction) => (\n <button\n key={reaction.emoji}\n type=\"button\"\n onClick={() =>\n onReact && comment.id\n ? onReact(comment.id, reaction.emoji)\n : undefined\n }\n title={reaction.users?.join(', ')}\n className=\"rounded-full focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring/40\"\n >\n <Badge\n variant={reaction.mine ? 'primary' : 'secondary'}\n className=\"cursor-pointer transition-colors hover:opacity-90\"\n >\n <span aria-hidden className=\"leading-none\">\n {reaction.emoji}\n </span>\n <span className=\"tabular-nums\">{reaction.count}</span>\n </Badge>\n </button>\n ))}\n </div>\n )}\n </div>\n\n {/* Trailing action cluster — single low-contrast group, hover/focus revealed. */}\n <div\n className={cn(\n 'shrink-0 self-start opacity-0 transition-opacity',\n 'group-hover:opacity-100 focus-within:opacity-100',\n '-mr-1 inline-flex items-center gap-0.5',\n )}\n >\n {!!onReply && (\n <Button\n type=\"button\"\n size=\"icon-xs\"\n variant=\"secondary\"\n buttonStyle=\"ghost\"\n onClick={() =>\n comment.id && onReply(comment.id)\n }\n title={strings.replyLabel}\n aria-label={strings.replyLabel}\n >\n <CornerDownRight className=\"size-3.5\" />\n </Button>\n )}\n {!!onReact && (\n <Button\n type=\"button\"\n size=\"icon-xs\"\n variant=\"secondary\"\n buttonStyle=\"ghost\"\n onClick={() =>\n comment.id && onReact(comment.id, '👍')\n }\n title={strings.addReactionLabel}\n aria-label={strings.addReactionLabel}\n >\n <Smile className=\"size-3.5\" />\n </Button>\n )}\n {!!onPinToggle && canModerate && (\n <Button\n type=\"button\"\n size=\"icon-xs\"\n variant=\"secondary\"\n buttonStyle=\"ghost\"\n onClick={() => onPinToggle(comment)}\n title={isPinned ? strings.unpinLabel : strings.pinLabel}\n aria-label={isPinned ? strings.unpinLabel : strings.pinLabel}\n >\n <Pin\n className={cn(\n 'size-3.5',\n isPinned && 'text-warning',\n )}\n />\n </Button>\n )}\n {!!canEditComment && !!comment.id && (\n <Button\n type=\"button\"\n size=\"icon-xs\"\n variant=\"secondary\"\n buttonStyle=\"ghost\"\n title={strings.editLabel}\n aria-label={strings.editLabel}\n >\n <Pencil className=\"size-3.5\" />\n </Button>\n )}\n {!!canDeleteComment &&\n !!onDelete &&\n !!comment.id && (\n <Button\n type=\"button\"\n size=\"icon-xs\"\n variant=\"secondary\"\n buttonStyle=\"ghost\"\n className=\"hover:bg-destructive/10 hover:text-destructive\"\n onClick={() =>\n onDelete(comment.id as string)\n }\n title={strings.deleteLabel}\n aria-label={strings.deleteLabel}\n >\n <Trash2 className=\"size-3.5\" />\n </Button>\n )}\n </div>\n </div>\n </article>\n );\n}) as <TResource extends string = string>(\n props: CommentItemProps<import('../comments.types').CommentUser, unknown, TResource>,\n) => ReturnType<FC>;\n","import type { FC } from 'react';\n\nimport type { CommentTimelineProps, CommentUser } from '../comments.types';\nimport { CommentEmpty } from './comment-empty';\nimport { CommentItem } from './comment-item';\n\nexport const CommentTimeline = function CommentTimeline<\n TResource extends string = string,\n>({\n comments,\n canModerate,\n onDelete,\n onPinToggle,\n onReact,\n onReply,\n strings: stringsProp,\n getMediaUrl,\n getMediaName,\n getStatusLabel,\n formatRelativeTime,\n resources,\n renderItem,\n renderAttachment,\n renderReference,\n emptySlot,\n}: CommentTimelineProps<CommentUser, unknown, TResource>) {\n if (!comments.length) {\n return (\n <>\n {emptySlot ?? <CommentEmpty strings={stringsProp} />}\n </>\n );\n }\n\n return (\n <div className=\"flex flex-col gap-2\">\n {comments.map((comment, index) => {\n const defaultItem = (\n <CommentItem\n comment={comment}\n canModerate={canModerate}\n onDelete={onDelete}\n onPinToggle={onPinToggle}\n onReact={onReact}\n onReply={onReply}\n strings={stringsProp}\n getMediaUrl={getMediaUrl}\n getMediaName={getMediaName}\n getStatusLabel={getStatusLabel}\n formatRelativeTime={formatRelativeTime}\n resources={resources}\n renderAttachment={renderAttachment}\n renderReference={renderReference}\n />\n );\n\n if (renderItem) {\n return (\n <div key={comment.id ?? `comment-${index}`}>\n {renderItem({\n comment,\n canModerate: canModerate ?? false,\n onDelete,\n defaultItem,\n })}\n </div>\n );\n }\n\n return (\n <div key={comment.id ?? `comment-${index}`}>\n {defaultItem}\n </div>\n );\n })}\n </div>\n );\n} as <TResource extends string = string>(\n props: CommentTimelineProps<CommentUser, unknown, TResource>,\n) => ReturnType<FC>;\n","/**\n * Comments — top-level entry for the Comments feature.\n *\n * Composes the composer + timeline + empty state behind a single API.\n * Generic in `<TUser, TMeta, TResource>` so consumers can type their\n * domain (user shape, custom meta payload, resource-kind union).\n *\n * Per-mount wiring (callbacks, resources, accessors) flows as direct\n * props. Library-wide display defaults (composer position, etc.) come\n * from `<UIProvider>` — see `@/lib/ui-provider`. Slots, render-props,\n * and the headless `useComments()` hook cover the composability\n * spectrum.\n *\n * `CommentsCard` is exported as a back-compat alias for the previous\n * name; the API shape is identical.\n */\nimport { useCallback, useState } from 'react';\n\nimport { SmartCard } from '@/components/base/cards';\nimport { useCommentsConfig as useCommentsUIDefaults } from '@/lib/ui-provider';\n\nimport { useResolvedStrings } from './comments-provider';\nimport type {\n CommentData,\n CommentFormValues,\n CommentSubmitHelpers,\n CommentUser,\n CommentsProps,\n} from './comments.types';\nimport { CommentComposer } from './partials/comment-composer';\nimport { CommentEmpty } from './partials/comment-empty';\nimport { CommentTimeline } from './partials/comment-timeline';\n\nimport { cn } from '@/lib/utils';\nexport function Comments<\n TUser extends CommentUser = CommentUser,\n TMeta = unknown,\n TResource extends string = string,\n>(props: CommentsProps<TUser, TMeta, TResource>) {\n const ui = useCommentsUIDefaults();\n\n const composerPosition =\n props.composerPosition ?? ui.composerPosition ?? 'top';\n\n const canComment = props.canComment ?? false;\n const canModerate = props.canModerate ?? false;\n\n const onSubmit = props.onSubmit;\n const onDelete = props.onDelete;\n const onPinToggle = props.onPinToggle;\n const onReact = props.onReact;\n const onReply = props.onReply;\n\n const resources = props.resources;\n const attachments = props.attachments;\n\n const strings = useResolvedStrings(props.strings);\n const cardTitle = props.title === undefined ? strings.title : props.title;\n\n const [formErrors, setFormErrors] = useState<Record<string, string>>({});\n const [isSubmitting, setIsSubmitting] = useState(false);\n const [resetKey, setResetKey] = useState(0);\n\n const submitHelpers: CommentSubmitHelpers = {\n setErrors: (errors) => setFormErrors(errors),\n reset: () => {\n setResetKey((k) => k + 1);\n setFormErrors({});\n setIsSubmitting(false);\n },\n setSubmitting: setIsSubmitting,\n };\n\n const handleSubmit = useCallback(\n (values: CommentFormValues<TResource>) => {\n if (!onSubmit) return;\n setIsSubmitting(true);\n setFormErrors({});\n onSubmit(values, submitHelpers);\n },\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [onSubmit],\n );\n\n const composer = props.composerSlot ?? (\n canComment ? (\n <CommentComposer\n context={props.context}\n canComment={canComment}\n isSubmitting={isSubmitting}\n errors={formErrors}\n resetKey={resetKey}\n /*\n * Generic-erasure boundary: `<Comments<TResource>>` is\n * generic but `<CommentComposer>` types its props\n * against the default-string kind. Shapes are\n * structurally identical — only the kind union differs.\n */\n onSubmit={\n handleSubmit as (values: CommentFormValues) => void\n }\n strings={props.strings}\n resources={resources as never}\n attachments={attachments}\n />\n ) : null\n );\n\n /*\n * Same generic-erasure boundary as the composer block above:\n * `<Comments<TUser, TMeta, TResource>>` is generic, but\n * `<CommentTimeline>` types its `comments` and `onPinToggle` props\n * against `CommentData<CommentUser, unknown, TResource>` (default\n * `TUser`/`TMeta`). The shapes are structurally identical — `TUser`\n * narrows the author union and `TMeta` narrows the metadata payload,\n * neither of which the timeline reads — so the widening cast is\n * safe. Keep the cast localised here; do not propagate into the\n * timeline body.\n */\n const timeline = (\n <CommentTimeline\n comments={props.comments as ReadonlyArray<CommentData<CommentUser, unknown, TResource>>}\n canModerate={canModerate}\n onDelete={onDelete}\n onPinToggle={onPinToggle as (c: CommentData<CommentUser, unknown, TResource>) => void}\n onReact={onReact}\n onReply={onReply}\n strings={props.strings}\n getMediaUrl={props.getMediaUrl}\n getMediaName={props.getMediaName}\n getStatusLabel={props.getStatusLabel}\n formatRelativeTime={props.formatRelativeTime}\n resources={resources}\n // `renderItem` is generic over the consumer's `<TUser, TMeta,\n // TResource>` triple; `<CommentTimeline>` types it against\n // the default `CommentUser, unknown, string` triple. The\n // structural signature is the same — boundary cast only.\n renderItem={props.renderItem as never}\n renderAttachment={props.renderAttachment}\n renderReference={props.renderReference}\n emptySlot={\n props.emptySlot ?? <CommentEmpty strings={props.strings} />\n }\n />\n );\n\n const composerBlock = composer ? <div>{composer}</div> : null;\n\n const inner = (\n <div className=\"flex flex-col gap-4\">\n {props.headerSlot}\n {composerPosition === 'top' && composerBlock}\n {timeline}\n {composerPosition === 'bottom' && composerBlock}\n {props.footerSlot}\n </div>\n );\n\n if (props.bare) {\n return inner;\n }\n\n return (\n <SmartCard\n title={cardTitle === false ? undefined : cardTitle}\n description={strings.subtitle || undefined}\n padding=\"sm\"\n className={cn('comments--component', props.className)}\n >\n {inner}\n </SmartCard>\n );\n}\n\n/** Back-compat alias — `CommentsCard` was the previous primary export. */\nexport const CommentsCard = Comments;\n","/**\n * useComments — headless state machine for the Comments feature.\n *\n * Tracks composer mode (idle | replying | editing), submit/delete\n * helpers, error state, and resetKey bumping. The default `<Comments>`\n * component composes this hook; consumers building a fully custom UI\n * can use it directly.\n */\nimport { useCallback, useState } from 'react';\n\nimport type {\n CommentData,\n CommentFormValues,\n CommentSubmitHelpers,\n CommentUser,\n CommentsConfig,\n} from '../comments.types';\n\nexport type ComposerMode<TResource extends string = string> =\n | { kind: 'idle' }\n | { kind: 'editing'; comment: CommentData<CommentUser, unknown, TResource> }\n | { kind: 'replying'; commentId: string; authorName?: string };\n\nexport interface UseCommentsOptions<\n TUser extends CommentUser = CommentUser,\n TMeta = unknown,\n TResource extends string = string,\n> {\n onSubmit?: CommentsConfig<TUser, TMeta, TResource>['onSubmit'];\n onUpdate?: CommentsConfig<TUser, TMeta, TResource>['onUpdate'];\n onDelete?: CommentsConfig<TUser, TMeta, TResource>['onDelete'];\n}\n\nexport interface UseCommentsReturn<\n TUser extends CommentUser = CommentUser,\n TMeta = unknown,\n TResource extends string = string,\n> {\n composerMode: ComposerMode<TResource>;\n isSubmitting: boolean;\n formErrors: Record<string, string>;\n resetKey: number;\n\n startReply: (comment: CommentData<TUser, TMeta, TResource>) => void;\n startEdit: (comment: CommentData<TUser, TMeta, TResource>) => void;\n cancelComposerMode: () => void;\n\n submit: (values: CommentFormValues<TResource>) => void;\n deleteComment: (id: string) => void;\n\n /** Imperative reset — bumps `resetKey` so the composer clears itself. */\n resetComposer: () => void;\n /** Helpers exposed to onSubmit/onUpdate. */\n helpers: CommentSubmitHelpers;\n}\n\nexport function useComments<\n TUser extends CommentUser = CommentUser,\n TMeta = unknown,\n TResource extends string = string,\n>(\n options: UseCommentsOptions<TUser, TMeta, TResource> = {},\n): UseCommentsReturn<TUser, TMeta, TResource> {\n const { onSubmit, onUpdate, onDelete } = options;\n\n const [composerMode, setComposerMode] = useState<ComposerMode<TResource>>({\n kind: 'idle',\n });\n const [isSubmitting, setIsSubmitting] = useState(false);\n const [formErrors, setFormErrors] = useState<Record<string, string>>({});\n const [resetKey, setResetKey] = useState(0);\n\n const helpers: CommentSubmitHelpers = {\n setErrors: (errors) => setFormErrors(errors),\n reset: () => {\n setResetKey((k) => k + 1);\n setComposerMode({ kind: 'idle' });\n setFormErrors({});\n },\n setSubmitting: setIsSubmitting,\n };\n\n const startReply = useCallback(\n (comment: CommentData<TUser, TMeta, TResource>) => {\n setComposerMode({\n kind: 'replying',\n commentId: comment.id ?? '',\n authorName: comment.user?.name,\n });\n },\n [],\n );\n\n const startEdit = useCallback(\n (comment: CommentData<TUser, TMeta, TResource>) => {\n setComposerMode({ kind: 'editing', comment });\n },\n [],\n );\n\n const cancelComposerMode = useCallback(() => {\n setComposerMode({ kind: 'idle' });\n setFormErrors({});\n }, []);\n\n const submit = useCallback(\n (values: CommentFormValues<TResource>) => {\n setIsSubmitting(true);\n setFormErrors({});\n\n if (composerMode.kind === 'editing' && composerMode.comment.id) {\n if (!onUpdate) {\n setIsSubmitting(false);\n return;\n }\n onUpdate(composerMode.comment.id, values, helpers);\n return;\n }\n\n if (!onSubmit) {\n setIsSubmitting(false);\n return;\n }\n\n const payload: CommentFormValues<TResource> =\n composerMode.kind === 'replying'\n ? { ...values, replyToId: composerMode.commentId }\n : values;\n\n onSubmit(payload, helpers);\n },\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [composerMode, onSubmit, onUpdate],\n );\n\n const deleteComment = useCallback(\n (id: string) => {\n if (!onDelete || !id) return;\n onDelete(id);\n },\n [onDelete],\n );\n\n const resetComposer = useCallback(() => {\n setResetKey((k) => k + 1);\n setComposerMode({ kind: 'idle' });\n setFormErrors({});\n }, []);\n\n return {\n composerMode,\n isSubmitting,\n formErrors,\n resetKey,\n startReply,\n startEdit,\n cancelComposerMode,\n submit,\n deleteComment,\n resetComposer,\n helpers,\n };\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
require(`./chunk-D3uCBrYO.cjs`);const e=require(`../lib/utils.cjs`);let t=require(`react/jsx-runtime`);var n={tight:`space-y-3`,default:`space-y-5`,loose:`space-y-8`};function r({children:r,as:i=`section`,density:a=`default`,className:o,...s}){return(0,t.jsx)(i,{className:e.cn(n[a],o),...s,children:r})}Object.defineProperty(exports,`t`,{enumerable:!0,get:function(){return r}});
|
|
2
|
+
//# sourceMappingURL=containers-BFDv7cCV.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"containers-BFDv7cCV.cjs","names":[],"sources":["../../src/components/layout/containers/section.tsx"],"sourcesContent":["/**\n * Section — vertical-spaced wrapper for grouping content blocks inside a page.\n *\n * Use between cards or content groups when you want a consistent vertical\n * rhythm without nesting another `Container`. Three densities scale the\n * top/bottom spacing.\n */\nimport { cn } from '@/lib/utils';\n\nimport type { SectionProps } from './containers.types';\n\nconst DENSITY_CLASS: Record<NonNullable<SectionProps['density']>, string> = {\n\ttight: 'space-y-3',\n\tdefault: 'space-y-5',\n\tloose: 'space-y-8',\n};\n\nexport function Section({\n\tchildren,\n\tas: Component = 'section',\n\tdensity = 'default',\n\tclassName,\n\t...props\n}: SectionProps) {\n\treturn (\n\t\t<Component className={cn(DENSITY_CLASS[density], className)} {...props}>\n\t\t\t{children}\n\t\t</Component>\n\t);\n}\n"],"mappings":"uGAWA,IAAM,EAAsE,CAC3E,MAAO,YACP,QAAS,YACT,MAAO,YACP,CAED,SAAgB,EAAQ,CACvB,WACA,GAAI,EAAY,UAChB,UAAU,UACV,YACA,GAAG,GACa,CAChB,OACC,EAAA,EAAA,KAAC,EAAD,CAAW,UAAW,EAAA,GAAG,EAAc,GAAU,EAAU,CAAE,GAAI,EAC/D,WACU,CAAA"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { cn as e } from "../lib/utils.js";
|
|
2
|
+
import { jsx as t } from "react/jsx-runtime";
|
|
3
|
+
//#region src/components/layout/containers/section.tsx
|
|
4
|
+
var n = {
|
|
5
|
+
tight: "space-y-3",
|
|
6
|
+
default: "space-y-5",
|
|
7
|
+
loose: "space-y-8"
|
|
8
|
+
};
|
|
9
|
+
function r({ children: r, as: i = "section", density: a = "default", className: o, ...s }) {
|
|
10
|
+
return /* @__PURE__ */ t(i, {
|
|
11
|
+
className: e(n[a], o),
|
|
12
|
+
...s,
|
|
13
|
+
children: r
|
|
14
|
+
});
|
|
15
|
+
}
|
|
16
|
+
//#endregion
|
|
17
|
+
export { r as t };
|
|
18
|
+
|
|
19
|
+
//# sourceMappingURL=containers-C1-A_2PT.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"containers-C1-A_2PT.js","names":[],"sources":["../../src/components/layout/containers/section.tsx"],"sourcesContent":["/**\n * Section — vertical-spaced wrapper for grouping content blocks inside a page.\n *\n * Use between cards or content groups when you want a consistent vertical\n * rhythm without nesting another `Container`. Three densities scale the\n * top/bottom spacing.\n */\nimport { cn } from '@/lib/utils';\n\nimport type { SectionProps } from './containers.types';\n\nconst DENSITY_CLASS: Record<NonNullable<SectionProps['density']>, string> = {\n\ttight: 'space-y-3',\n\tdefault: 'space-y-5',\n\tloose: 'space-y-8',\n};\n\nexport function Section({\n\tchildren,\n\tas: Component = 'section',\n\tdensity = 'default',\n\tclassName,\n\t...props\n}: SectionProps) {\n\treturn (\n\t\t<Component className={cn(DENSITY_CLASS[density], className)} {...props}>\n\t\t\t{children}\n\t\t</Component>\n\t);\n}\n"],"mappings":";;;AAWA,IAAM,IAAsE;CAC3E,OAAO;CACP,SAAS;CACT,OAAO;CACP;AAED,SAAgB,EAAQ,EACvB,aACA,IAAI,IAAY,WAChB,aAAU,WACV,cACA,GAAG,KACa;AAChB,QACC,kBAAC,GAAD;EAAW,WAAW,EAAG,EAAc,IAAU,EAAU;EAAE,GAAI;EAC/D;EACU,CAAA"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
require(`./chunk-D3uCBrYO.cjs`);const e=require(`../lib/utils.cjs`);let t=require(`react/jsx-runtime`);var n={narrow:`max-w-7xl mx-auto`,default:``,wide:`max-w-screen-2xl mx-auto`,full:``},r={none:`p-0`,sm:`p-4 md:p-5`,default:`p-5 md:p-7`,lg:`p-6 md:p-8`};function i({children:i,as:a=`div`,width:o=`default`,padding:s=`default`,bare:c=!1,className:l,innerClassName:u,...d}){let f=n[o],p=r[s];return c?(0,t.jsx)(a,{className:e.cn(`w-full flex-1 relative overflow-hidden @container/main h-full`,f,l),...d,children:i}):(0,t.jsx)(a,{className:e.cn(`w-full flex-1 relative overflow-hidden @container/main h-full`,l),...d,children:(0,t.jsx)(`div`,{className:e.cn(`flex min-h-full flex-1 flex-col gap-6 rounded-xl`,f,p,u),children:i})})}Object.defineProperty(exports,`t`,{enumerable:!0,get:function(){return i}});
|
|
2
|
+
//# sourceMappingURL=content-container-CwqFnaI0.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"content-container-CwqFnaI0.cjs","names":[],"sources":["../../src/components/layout/containers/content-container.tsx"],"sourcesContent":["/**\n * Container — page-level content wrapper.\n *\n * Wraps the page body in a flexbox column with consistent padding and an\n * optional max-width clamp. Use as the outer wrapper inside a `<Page>`, or\n * standalone for content panes that need a centered, padded surface.\n *\n * `bare` skips the padded inner column for edge-to-edge children, while\n * `innerClassName` customizes the clamped column without affecting the outer\n * scroll/container-query wrapper.\n */\nimport { cn } from '@/lib/utils';\n\nimport type { ContainerProps } from './containers.types';\n\nconst WIDTH_CLASS: Record<NonNullable<ContainerProps['width']>, string> = {\n\tnarrow: 'max-w-7xl mx-auto',\n\tdefault: '',\n\twide: 'max-w-screen-2xl mx-auto',\n\tfull: '',\n};\n\nconst PADDING_CLASS: Record<NonNullable<ContainerProps['padding']>, string> = {\n\tnone: 'p-0',\n\tsm: 'p-4 md:p-5',\n\tdefault: 'p-5 md:p-7',\n\tlg: 'p-6 md:p-8',\n};\n\nexport function Container({\n\tchildren,\n\tas: Component = 'div',\n\twidth = 'default',\n\tpadding = 'default',\n\tbare = false,\n\tclassName,\n\tinnerClassName,\n\t...props\n}: ContainerProps) {\n\tconst widthClass = WIDTH_CLASS[width];\n\tconst paddingClass = PADDING_CLASS[padding];\n\n\tif (bare) {\n\t\treturn (\n\t\t\t<Component\n\t\t\t\tclassName={cn(\n\t\t\t\t\t'w-full flex-1 relative overflow-hidden @container/main h-full',\n\t\t\t\t\twidthClass,\n\t\t\t\t\tclassName,\n\t\t\t\t)}\n\t\t\t\t{...props}\n\t\t\t>\n\t\t\t\t{children}\n\t\t\t</Component>\n\t\t);\n\t}\n\n\treturn (\n\t\t<Component\n\t\t\tclassName={cn(\n\t\t\t\t'w-full flex-1 relative overflow-hidden @container/main h-full',\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\t{...props}\n\t\t>\n\t\t\t<div\n\t\t\t\tclassName={cn(\n\t\t\t\t\t'flex min-h-full flex-1 flex-col gap-6 rounded-xl',\n\t\t\t\t\twidthClass,\n\t\t\t\t\tpaddingClass,\n\t\t\t\t\tinnerClassName,\n\t\t\t\t)}\n\t\t\t>\n\t\t\t\t{children}\n\t\t\t</div>\n\t\t</Component>\n\t);\n}\n"],"mappings":"uGAeA,IAAM,EAAoE,CACzE,OAAQ,oBACR,QAAS,GACT,KAAM,2BACN,KAAM,GACN,CAEK,EAAwE,CAC7E,KAAM,MACN,GAAI,aACJ,QAAS,aACT,GAAI,aACJ,CAED,SAAgB,EAAU,CACzB,WACA,GAAI,EAAY,MAChB,QAAQ,UACR,UAAU,UACV,OAAO,GACP,YACA,iBACA,GAAG,GACe,CAClB,IAAM,EAAa,EAAY,GACzB,EAAe,EAAc,GAiBnC,OAfI,GAEF,EAAA,EAAA,KAAC,EAAD,CACC,UAAW,EAAA,GACV,gEACA,EACA,EACA,CACD,GAAI,EAEH,WACU,CAAA,EAKb,EAAA,EAAA,KAAC,EAAD,CACC,UAAW,EAAA,GACV,gEACA,EACA,CACD,GAAI,YAEJ,EAAA,EAAA,KAAC,MAAD,CACC,UAAW,EAAA,GACV,mDACA,EACA,EACA,EACA,CAEA,WACI,CAAA,CACK,CAAA"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { cn as e } from "../lib/utils.js";
|
|
2
|
+
import { jsx as t } from "react/jsx-runtime";
|
|
3
|
+
//#region src/components/layout/containers/content-container.tsx
|
|
4
|
+
var n = {
|
|
5
|
+
narrow: "max-w-7xl mx-auto",
|
|
6
|
+
default: "",
|
|
7
|
+
wide: "max-w-screen-2xl mx-auto",
|
|
8
|
+
full: ""
|
|
9
|
+
}, r = {
|
|
10
|
+
none: "p-0",
|
|
11
|
+
sm: "p-4 md:p-5",
|
|
12
|
+
default: "p-5 md:p-7",
|
|
13
|
+
lg: "p-6 md:p-8"
|
|
14
|
+
};
|
|
15
|
+
function i({ children: i, as: a = "div", width: o = "default", padding: s = "default", bare: c = !1, className: l, innerClassName: u, ...d }) {
|
|
16
|
+
let f = n[o], p = r[s];
|
|
17
|
+
return c ? /* @__PURE__ */ t(a, {
|
|
18
|
+
className: e("w-full flex-1 relative overflow-hidden @container/main h-full", f, l),
|
|
19
|
+
...d,
|
|
20
|
+
children: i
|
|
21
|
+
}) : /* @__PURE__ */ t(a, {
|
|
22
|
+
className: e("w-full flex-1 relative overflow-hidden @container/main h-full", l),
|
|
23
|
+
...d,
|
|
24
|
+
children: /* @__PURE__ */ t("div", {
|
|
25
|
+
className: e("flex min-h-full flex-1 flex-col gap-6 rounded-xl", f, p, u),
|
|
26
|
+
children: i
|
|
27
|
+
})
|
|
28
|
+
});
|
|
29
|
+
}
|
|
30
|
+
//#endregion
|
|
31
|
+
export { i as t };
|
|
32
|
+
|
|
33
|
+
//# sourceMappingURL=content-container-D_3JGBSc.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"content-container-D_3JGBSc.js","names":[],"sources":["../../src/components/layout/containers/content-container.tsx"],"sourcesContent":["/**\n * Container — page-level content wrapper.\n *\n * Wraps the page body in a flexbox column with consistent padding and an\n * optional max-width clamp. Use as the outer wrapper inside a `<Page>`, or\n * standalone for content panes that need a centered, padded surface.\n *\n * `bare` skips the padded inner column for edge-to-edge children, while\n * `innerClassName` customizes the clamped column without affecting the outer\n * scroll/container-query wrapper.\n */\nimport { cn } from '@/lib/utils';\n\nimport type { ContainerProps } from './containers.types';\n\nconst WIDTH_CLASS: Record<NonNullable<ContainerProps['width']>, string> = {\n\tnarrow: 'max-w-7xl mx-auto',\n\tdefault: '',\n\twide: 'max-w-screen-2xl mx-auto',\n\tfull: '',\n};\n\nconst PADDING_CLASS: Record<NonNullable<ContainerProps['padding']>, string> = {\n\tnone: 'p-0',\n\tsm: 'p-4 md:p-5',\n\tdefault: 'p-5 md:p-7',\n\tlg: 'p-6 md:p-8',\n};\n\nexport function Container({\n\tchildren,\n\tas: Component = 'div',\n\twidth = 'default',\n\tpadding = 'default',\n\tbare = false,\n\tclassName,\n\tinnerClassName,\n\t...props\n}: ContainerProps) {\n\tconst widthClass = WIDTH_CLASS[width];\n\tconst paddingClass = PADDING_CLASS[padding];\n\n\tif (bare) {\n\t\treturn (\n\t\t\t<Component\n\t\t\t\tclassName={cn(\n\t\t\t\t\t'w-full flex-1 relative overflow-hidden @container/main h-full',\n\t\t\t\t\twidthClass,\n\t\t\t\t\tclassName,\n\t\t\t\t)}\n\t\t\t\t{...props}\n\t\t\t>\n\t\t\t\t{children}\n\t\t\t</Component>\n\t\t);\n\t}\n\n\treturn (\n\t\t<Component\n\t\t\tclassName={cn(\n\t\t\t\t'w-full flex-1 relative overflow-hidden @container/main h-full',\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\t{...props}\n\t\t>\n\t\t\t<div\n\t\t\t\tclassName={cn(\n\t\t\t\t\t'flex min-h-full flex-1 flex-col gap-6 rounded-xl',\n\t\t\t\t\twidthClass,\n\t\t\t\t\tpaddingClass,\n\t\t\t\t\tinnerClassName,\n\t\t\t\t)}\n\t\t\t>\n\t\t\t\t{children}\n\t\t\t</div>\n\t\t</Component>\n\t);\n}\n"],"mappings":";;;AAeA,IAAM,IAAoE;CACzE,QAAQ;CACR,SAAS;CACT,MAAM;CACN,MAAM;CACN,EAEK,IAAwE;CAC7E,MAAM;CACN,IAAI;CACJ,SAAS;CACT,IAAI;CACJ;AAED,SAAgB,EAAU,EACzB,aACA,IAAI,IAAY,OAChB,WAAQ,WACR,aAAU,WACV,UAAO,IACP,cACA,mBACA,GAAG,KACe;CAClB,IAAM,IAAa,EAAY,IACzB,IAAe,EAAc;AAiBnC,QAfI,IAEF,kBAAC,GAAD;EACC,WAAW,EACV,iEACA,GACA,EACA;EACD,GAAI;EAEH;EACU,CAAA,GAKb,kBAAC,GAAD;EACC,WAAW,EACV,iEACA,EACA;EACD,GAAI;YAEJ,kBAAC,OAAD;GACC,WAAW,EACV,oDACA,GACA,GACA,EACA;GAEA;GACI,CAAA;EACK,CAAA"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { cn as e } from "../lib/utils.js";
|
|
2
|
+
import { t } from "./text-DIxMTECE.js";
|
|
3
|
+
import { useState as n } from "react";
|
|
4
|
+
import { jsx as r, jsxs as i } from "react/jsx-runtime";
|
|
5
|
+
import { Check as a, Copy as o } from "lucide-react";
|
|
6
|
+
import { toast as s } from "sonner";
|
|
7
|
+
//#region src/components/base/copyable/copyable.tsx
|
|
8
|
+
function c({ value: c, displayValue: l, mono: u = !1, truncate: d = !1, className: f, contentClassName: p, successMessage: m = "Copied to clipboard" }) {
|
|
9
|
+
let [h, g] = n(!1), _ = async () => {
|
|
10
|
+
try {
|
|
11
|
+
await navigator.clipboard.writeText(c), g(!0), s.success(m), setTimeout(() => g(!1), 2e3);
|
|
12
|
+
} catch {
|
|
13
|
+
s.error("Failed to copy");
|
|
14
|
+
}
|
|
15
|
+
}, v = l !== void 0 && typeof l != "string";
|
|
16
|
+
return /* @__PURE__ */ i("span", {
|
|
17
|
+
role: "button",
|
|
18
|
+
tabIndex: 0,
|
|
19
|
+
onClick: _,
|
|
20
|
+
onKeyDown: (e) => {
|
|
21
|
+
(e.key === "Enter" || e.key === " ") && (e.preventDefault(), _());
|
|
22
|
+
},
|
|
23
|
+
className: e("copyable--component", "group inline-flex cursor-pointer items-center gap-1.5 rounded px-1 -mx-1 transition-colors hover:bg-muted", f),
|
|
24
|
+
children: [v ? l : /* @__PURE__ */ r(t, {
|
|
25
|
+
tag: "span",
|
|
26
|
+
className: e(u && "font-mono", d && "max-w-[300px] truncate", p),
|
|
27
|
+
children: l ?? c
|
|
28
|
+
}), /* @__PURE__ */ r("span", {
|
|
29
|
+
className: "text-muted-foreground opacity-0 transition-opacity group-hover:opacity-100",
|
|
30
|
+
children: h ? /* @__PURE__ */ r(a, { className: "size-3.5 text-success" }) : /* @__PURE__ */ r(o, { className: "size-3.5" })
|
|
31
|
+
})]
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
c.displayName = "Copyable";
|
|
35
|
+
//#endregion
|
|
36
|
+
export { c as t };
|
|
37
|
+
|
|
38
|
+
//# sourceMappingURL=copyable-CHhCGMfW.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"copyable-CHhCGMfW.js","names":[],"sources":["../../src/components/base/copyable/copyable.tsx"],"sourcesContent":["import { Check, Copy } from 'lucide-react';\nimport { useState, type ReactNode } from 'react';\n\nimport { toast } from 'sonner';\n\nimport { Text } from '@/components/typography';\nimport { cn } from '@/lib/utils';\n\ninterface CopyableProps {\n\t/** The value to copy to clipboard */\n\tvalue: string;\n\t/** Optional display content (if different from value). Can be a string or ReactNode */\n\tdisplayValue?: ReactNode;\n\t/** Use monospace font (only applies when displayValue is not a ReactNode) */\n\tmono?: boolean;\n\t/** Truncate with ellipsis (only applies when displayValue is not a ReactNode) */\n\ttruncate?: boolean;\n\t/** Additional className for the container */\n\tclassName?: string;\n\t/**ClassName for the display content wrapper */\n\tcontentClassName?: string;\n\t/** Success message shown in toast */\n\tsuccessMessage?: string;\n}\n\nexport function Copyable({\n\tvalue,\n\tdisplayValue,\n\tmono = false,\n\ttruncate = false,\n\tclassName,\n\tcontentClassName,\n\tsuccessMessage = 'Copied to clipboard',\n}: CopyableProps) {\n\tconst [copied, setCopied] = useState(false);\n\n\tconst handleCopy = async () => {\n\t\ttry {\n\t\t\tawait navigator.clipboard.writeText(value);\n\t\t\tsetCopied(true);\n\t\t\ttoast.success(successMessage);\n\t\t\tsetTimeout(() => setCopied(false), 2000);\n\t\t} catch {\n\t\t\ttoast.error('Failed to copy');\n\t\t}\n\t};\n\n\t// Check if displayValue is a ReactNode (not a string)\n\tconst isReactNode = displayValue !== undefined && typeof displayValue !== 'string';\n\n\treturn (\n\t\t<span\n\t\t\trole=\"button\"\n\t\t\ttabIndex={0}\n\t\t\tonClick={handleCopy}\n\t\t\tonKeyDown={(e) => {\n\t\t\t\tif (e.key === 'Enter' || e.key === ' ') {\n\t\t\t\t\te.preventDefault();\n\t\t\t\t\tvoid handleCopy();\n\t\t\t\t}\n\t\t\t}}\n\t\t\tclassName={cn('copyable--component', \n\t\t\t\t'group inline-flex cursor-pointer items-center gap-1.5 rounded px-1 -mx-1 transition-colors hover:bg-muted',\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t>\n\t\t\t{isReactNode ? (\n\t\t\t\tdisplayValue\n\t\t\t) : (\n\t\t\t\t<Text\n\t\t\t\t\ttag=\"span\"\n\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\tmono && 'font-mono',\n\t\t\t\t\t\ttruncate && 'max-w-[300px] truncate',\n\t\t\t\t\t\tcontentClassName,\n\t\t\t\t\t)}\n\t\t\t\t>\n\t\t\t\t\t{displayValue ?? value}\n\t\t\t\t</Text>\n\t\t\t)}\n\t\t\t<span className=\"text-muted-foreground opacity-0 transition-opacity group-hover:opacity-100\">\n\t\t\t\t{copied ? (\n\t\t\t\t\t<Check className=\"size-3.5 text-success\" />\n\t\t\t\t) : (\n\t\t\t\t\t<Copy className=\"size-3.5\" />\n\t\t\t\t)}\n\t\t\t</span>\n\t\t</span>\n\t);\n}\n\nexport type { CopyableProps };\n\nCopyable.displayName = 'Copyable';\n"],"mappings":";;;;;;;AAyBA,SAAgB,EAAS,EACxB,UACA,iBACA,UAAO,IACP,cAAW,IACX,cACA,qBACA,oBAAiB,yBACA;CACjB,IAAM,CAAC,GAAQ,KAAa,EAAS,GAAM,EAErC,IAAa,YAAY;AAC9B,MAAI;AAIH,GAHA,MAAM,UAAU,UAAU,UAAU,EAAM,EAC1C,EAAU,GAAK,EACf,EAAM,QAAQ,EAAe,EAC7B,iBAAiB,EAAU,GAAM,EAAE,IAAK;UACjC;AACP,KAAM,MAAM,iBAAiB;;IAKzB,IAAc,MAAiB,KAAA,KAAa,OAAO,KAAiB;AAE1E,QACC,kBAAC,QAAD;EACC,MAAK;EACL,UAAU;EACV,SAAS;EACT,YAAY,MAAM;AACjB,IAAI,EAAE,QAAQ,WAAW,EAAE,QAAQ,SAClC,EAAE,gBAAgB,EACb,GAAY;;EAGnB,WAAW,EAAG,uBACb,6GACA,EACA;YAbF,CAeE,IACA,IAEA,kBAAC,GAAD;GACC,KAAI;GACJ,WAAW,EACV,KAAQ,aACR,KAAY,0BACZ,EACA;aAEA,KAAgB;GACX,CAAA,EAER,kBAAC,QAAD;GAAM,WAAU;aACd,IACA,kBAAC,GAAD,EAAO,WAAU,yBAA0B,CAAA,GAE3C,kBAAC,GAAD,EAAM,WAAU,YAAa,CAAA;GAExB,CAAA,CACD;;;AAMT,EAAS,cAAc"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
require(`./chunk-D3uCBrYO.cjs`);const e=require(`../lib/utils.cjs`),t=require(`./text-DBnY6fcL.cjs`);let n=require(`react`),r=require(`react/jsx-runtime`),i=require(`lucide-react`),a=require(`sonner`);function o({value:o,displayValue:s,mono:c=!1,truncate:l=!1,className:u,contentClassName:d,successMessage:f=`Copied to clipboard`}){let[p,m]=(0,n.useState)(!1),h=async()=>{try{await navigator.clipboard.writeText(o),m(!0),a.toast.success(f),setTimeout(()=>m(!1),2e3)}catch{a.toast.error(`Failed to copy`)}},g=s!==void 0&&typeof s!=`string`;return(0,r.jsxs)(`span`,{role:`button`,tabIndex:0,onClick:h,onKeyDown:e=>{(e.key===`Enter`||e.key===` `)&&(e.preventDefault(),h())},className:e.cn(`copyable--component`,`group inline-flex cursor-pointer items-center gap-1.5 rounded px-1 -mx-1 transition-colors hover:bg-muted`,u),children:[g?s:(0,r.jsx)(t.t,{tag:`span`,className:e.cn(c&&`font-mono`,l&&`max-w-[300px] truncate`,d),children:s??o}),(0,r.jsx)(`span`,{className:`text-muted-foreground opacity-0 transition-opacity group-hover:opacity-100`,children:p?(0,r.jsx)(i.Check,{className:`size-3.5 text-success`}):(0,r.jsx)(i.Copy,{className:`size-3.5`})})]})}o.displayName=`Copyable`,Object.defineProperty(exports,`t`,{enumerable:!0,get:function(){return o}});
|
|
2
|
+
//# sourceMappingURL=copyable-ndaiocYq.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"copyable-ndaiocYq.cjs","names":[],"sources":["../../src/components/base/copyable/copyable.tsx"],"sourcesContent":["import { Check, Copy } from 'lucide-react';\nimport { useState, type ReactNode } from 'react';\n\nimport { toast } from 'sonner';\n\nimport { Text } from '@/components/typography';\nimport { cn } from '@/lib/utils';\n\ninterface CopyableProps {\n\t/** The value to copy to clipboard */\n\tvalue: string;\n\t/** Optional display content (if different from value). Can be a string or ReactNode */\n\tdisplayValue?: ReactNode;\n\t/** Use monospace font (only applies when displayValue is not a ReactNode) */\n\tmono?: boolean;\n\t/** Truncate with ellipsis (only applies when displayValue is not a ReactNode) */\n\ttruncate?: boolean;\n\t/** Additional className for the container */\n\tclassName?: string;\n\t/**ClassName for the display content wrapper */\n\tcontentClassName?: string;\n\t/** Success message shown in toast */\n\tsuccessMessage?: string;\n}\n\nexport function Copyable({\n\tvalue,\n\tdisplayValue,\n\tmono = false,\n\ttruncate = false,\n\tclassName,\n\tcontentClassName,\n\tsuccessMessage = 'Copied to clipboard',\n}: CopyableProps) {\n\tconst [copied, setCopied] = useState(false);\n\n\tconst handleCopy = async () => {\n\t\ttry {\n\t\t\tawait navigator.clipboard.writeText(value);\n\t\t\tsetCopied(true);\n\t\t\ttoast.success(successMessage);\n\t\t\tsetTimeout(() => setCopied(false), 2000);\n\t\t} catch {\n\t\t\ttoast.error('Failed to copy');\n\t\t}\n\t};\n\n\t// Check if displayValue is a ReactNode (not a string)\n\tconst isReactNode = displayValue !== undefined && typeof displayValue !== 'string';\n\n\treturn (\n\t\t<span\n\t\t\trole=\"button\"\n\t\t\ttabIndex={0}\n\t\t\tonClick={handleCopy}\n\t\t\tonKeyDown={(e) => {\n\t\t\t\tif (e.key === 'Enter' || e.key === ' ') {\n\t\t\t\t\te.preventDefault();\n\t\t\t\t\tvoid handleCopy();\n\t\t\t\t}\n\t\t\t}}\n\t\t\tclassName={cn('copyable--component', \n\t\t\t\t'group inline-flex cursor-pointer items-center gap-1.5 rounded px-1 -mx-1 transition-colors hover:bg-muted',\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t>\n\t\t\t{isReactNode ? (\n\t\t\t\tdisplayValue\n\t\t\t) : (\n\t\t\t\t<Text\n\t\t\t\t\ttag=\"span\"\n\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\tmono && 'font-mono',\n\t\t\t\t\t\ttruncate && 'max-w-[300px] truncate',\n\t\t\t\t\t\tcontentClassName,\n\t\t\t\t\t)}\n\t\t\t\t>\n\t\t\t\t\t{displayValue ?? value}\n\t\t\t\t</Text>\n\t\t\t)}\n\t\t\t<span className=\"text-muted-foreground opacity-0 transition-opacity group-hover:opacity-100\">\n\t\t\t\t{copied ? (\n\t\t\t\t\t<Check className=\"size-3.5 text-success\" />\n\t\t\t\t) : (\n\t\t\t\t\t<Copy className=\"size-3.5\" />\n\t\t\t\t)}\n\t\t\t</span>\n\t\t</span>\n\t);\n}\n\nexport type { CopyableProps };\n\nCopyable.displayName = 'Copyable';\n"],"mappings":"yMAyBA,SAAgB,EAAS,CACxB,QACA,eACA,OAAO,GACP,WAAW,GACX,YACA,mBACA,iBAAiB,uBACA,CACjB,GAAM,CAAC,EAAQ,IAAA,EAAA,EAAA,UAAsB,GAAM,CAErC,EAAa,SAAY,CAC9B,GAAI,CACH,MAAM,UAAU,UAAU,UAAU,EAAM,CAC1C,EAAU,GAAK,CACf,EAAA,MAAM,QAAQ,EAAe,CAC7B,eAAiB,EAAU,GAAM,CAAE,IAAK,MACjC,CACP,EAAA,MAAM,MAAM,iBAAiB,GAKzB,EAAc,IAAiB,IAAA,IAAa,OAAO,GAAiB,SAE1E,OACC,EAAA,EAAA,MAAC,OAAD,CACC,KAAK,SACL,SAAU,EACV,QAAS,EACT,UAAY,GAAM,EACb,EAAE,MAAQ,SAAW,EAAE,MAAQ,OAClC,EAAE,gBAAgB,CACb,GAAY,GAGnB,UAAW,EAAA,GAAG,sBACb,4GACA,EACA,UAbF,CAeE,EACA,GAEA,EAAA,EAAA,KAAC,EAAA,EAAD,CACC,IAAI,OACJ,UAAW,EAAA,GACV,GAAQ,YACR,GAAY,yBACZ,EACA,UAEA,GAAgB,EACX,CAAA,EAER,EAAA,EAAA,KAAC,OAAD,CAAM,UAAU,sFACd,GACA,EAAA,EAAA,KAAC,EAAA,MAAD,CAAO,UAAU,wBAA0B,CAAA,EAE3C,EAAA,EAAA,KAAC,EAAA,KAAD,CAAM,UAAU,WAAa,CAAA,CAExB,CAAA,CACD,GAMT,EAAS,YAAc"}
|