admin-ui-starter-kit 0.6.4 → 0.6.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.agents/skills/component-library-rules/references/components/base__cards.md +3 -4
- package/.agents/skills/component-library-rules/references/components/base__table.md +32 -11
- package/.agents/skills/component-library-rules/references/components/layout__layout-containers.md +2 -2
- package/dist/_shared/accordion-BRj4TDQx.js +135 -0
- package/dist/_shared/accordion-BRj4TDQx.js.map +1 -0
- package/dist/_shared/accordion-DvlDjk29.cjs +2 -0
- package/dist/_shared/accordion-DvlDjk29.cjs.map +1 -0
- package/dist/_shared/action-menu-BrHF4nss.cjs +2 -0
- package/dist/_shared/action-menu-BrHF4nss.cjs.map +1 -0
- package/dist/_shared/action-menu-Crn22LKo.js +96 -0
- package/dist/_shared/action-menu-Crn22LKo.js.map +1 -0
- package/dist/_shared/ai-artifact-BHgd3agA.js +1099 -0
- package/dist/_shared/ai-artifact-BHgd3agA.js.map +1 -0
- package/dist/_shared/ai-artifact-BRM5cvGv.cjs +3 -0
- package/dist/_shared/ai-artifact-BRM5cvGv.cjs.map +1 -0
- package/dist/_shared/alert-CMVVt2Br.js +81 -0
- package/dist/_shared/alert-CMVVt2Br.js.map +1 -0
- package/dist/_shared/alert-Dmhtbmpg.cjs +2 -0
- package/dist/_shared/alert-Dmhtbmpg.cjs.map +1 -0
- package/dist/_shared/app-shell-BZQJfTkf.cjs +2 -0
- package/dist/_shared/app-shell-BZQJfTkf.cjs.map +1 -0
- package/dist/_shared/app-shell-Da6GHxTZ.js +69 -0
- package/dist/_shared/app-shell-Da6GHxTZ.js.map +1 -0
- package/dist/_shared/auth-DZW6NkJx.cjs +2 -0
- package/dist/_shared/auth-DZW6NkJx.cjs.map +1 -0
- package/dist/_shared/auth-Dh790NI_.js +643 -0
- package/dist/_shared/auth-Dh790NI_.js.map +1 -0
- package/dist/_shared/badge-B8xGFpfM.cjs +2 -0
- package/dist/_shared/badge-B8xGFpfM.cjs.map +1 -0
- package/dist/_shared/badge-BYNwSWh5.js +110 -0
- package/dist/_shared/badge-BYNwSWh5.js.map +1 -0
- package/dist/_shared/breadcrumbs-CuT0YIfo.js +105 -0
- package/dist/_shared/breadcrumbs-CuT0YIfo.js.map +1 -0
- package/dist/_shared/breadcrumbs-jNzlYqS9.cjs +2 -0
- package/dist/_shared/breadcrumbs-jNzlYqS9.cjs.map +1 -0
- package/dist/_shared/button-BMiPFJIb.cjs +2 -0
- package/dist/_shared/button-BMiPFJIb.cjs.map +1 -0
- package/dist/_shared/button-vv59_uS_.js +189 -0
- package/dist/_shared/button-vv59_uS_.js.map +1 -0
- package/dist/_shared/buttons-CvqIMv3I.js +137 -0
- package/dist/_shared/buttons-CvqIMv3I.js.map +1 -0
- package/dist/_shared/buttons-tCkWktN3.cjs +2 -0
- package/dist/_shared/buttons-tCkWktN3.cjs.map +1 -0
- package/dist/_shared/card-radio-group-Bhe8gAbH.js +150 -0
- package/dist/_shared/card-radio-group-Bhe8gAbH.js.map +1 -0
- package/dist/_shared/card-radio-group-CdG1zr8M.cjs +2 -0
- package/dist/_shared/card-radio-group-CdG1zr8M.cjs.map +1 -0
- package/dist/_shared/cards-Cu6p1Brd.cjs +2 -0
- package/dist/_shared/cards-Cu6p1Brd.cjs.map +1 -0
- package/dist/_shared/cards-cQ9lL6zy.js +354 -0
- package/dist/_shared/cards-cQ9lL6zy.js.map +1 -0
- package/dist/_shared/combobox-BGYjyXeN.cjs +2 -0
- package/dist/_shared/combobox-BGYjyXeN.cjs.map +1 -0
- package/dist/_shared/combobox-DTwomOBt.js +954 -0
- package/dist/_shared/combobox-DTwomOBt.js.map +1 -0
- package/dist/_shared/comments-C97vL5km.js +952 -0
- package/dist/_shared/comments-C97vL5km.js.map +1 -0
- package/dist/_shared/comments-DBe6dP-d.cjs +2 -0
- package/dist/_shared/comments-DBe6dP-d.cjs.map +1 -0
- package/dist/_shared/containers-CB7zaAvN.cjs +2 -0
- package/dist/_shared/containers-CB7zaAvN.cjs.map +1 -0
- package/dist/_shared/containers-CLBmhGfs.js +48 -0
- package/dist/_shared/containers-CLBmhGfs.js.map +1 -0
- package/dist/_shared/copyable-BgFdERqs.js +38 -0
- package/dist/_shared/copyable-BgFdERqs.js.map +1 -0
- package/dist/_shared/copyable-Ce8rmE-V.cjs +2 -0
- package/dist/_shared/copyable-Ce8rmE-V.cjs.map +1 -0
- package/dist/_shared/data-display-DUWxoDKq.js +1873 -0
- package/dist/_shared/data-display-DUWxoDKq.js.map +1 -0
- package/dist/_shared/data-display-o-rbMuIA.cjs +2 -0
- package/dist/_shared/data-display-o-rbMuIA.cjs.map +1 -0
- package/dist/_shared/date-picker-Cxx9jllA.js +1361 -0
- package/dist/_shared/date-picker-Cxx9jllA.js.map +1 -0
- package/dist/_shared/date-picker-DE5A8yqN.cjs +2 -0
- package/dist/_shared/date-picker-DE5A8yqN.cjs.map +1 -0
- package/dist/_shared/date-pickers-Dex1Mfye.cjs +2 -0
- package/dist/_shared/date-pickers-Dex1Mfye.cjs.map +1 -0
- package/dist/_shared/date-pickers-m0dpDcqH.js +329 -0
- package/dist/_shared/date-pickers-m0dpDcqH.js.map +1 -0
- package/dist/_shared/display-Bro3Kufg.js +986 -0
- package/dist/_shared/display-Bro3Kufg.js.map +1 -0
- package/dist/_shared/display-CRQjSjgB.cjs +2 -0
- package/dist/_shared/display-CRQjSjgB.cjs.map +1 -0
- package/dist/_shared/form-sizing-DJus3nK3.cjs +2 -0
- package/dist/_shared/form-sizing-DJus3nK3.cjs.map +1 -0
- package/dist/_shared/form-sizing-DWjJsQSR.js +42 -0
- package/dist/_shared/form-sizing-DWjJsQSR.js.map +1 -0
- package/dist/_shared/forms-D-SNQmtB.cjs +2 -0
- package/dist/_shared/forms-D-SNQmtB.cjs.map +1 -0
- package/dist/_shared/forms-p7cfzJwf.js +3533 -0
- package/dist/_shared/forms-p7cfzJwf.js.map +1 -0
- package/dist/_shared/header-8C71wVRp.js +447 -0
- package/dist/_shared/header-8C71wVRp.js.map +1 -0
- package/dist/_shared/header-CYgFCnjZ.cjs +2 -0
- package/dist/_shared/header-CYgFCnjZ.cjs.map +1 -0
- package/dist/_shared/hooks-Ci1LFWRG.js +95 -0
- package/dist/_shared/hooks-Ci1LFWRG.js.map +1 -0
- package/dist/_shared/hooks-Cjl7LJpn.cjs +2 -0
- package/dist/_shared/hooks-Cjl7LJpn.cjs.map +1 -0
- package/dist/_shared/input-BgcP6x4C.js +182 -0
- package/dist/_shared/input-BgcP6x4C.js.map +1 -0
- package/dist/_shared/input-DV3g7Fm5.cjs +2 -0
- package/dist/_shared/input-DV3g7Fm5.cjs.map +1 -0
- package/dist/_shared/item-D7GTzvhf.js +226 -0
- package/dist/_shared/item-D7GTzvhf.js.map +1 -0
- package/dist/_shared/item-DTrnHpfm.cjs +2 -0
- package/dist/_shared/item-DTrnHpfm.cjs.map +1 -0
- package/dist/_shared/layout-BExg7Vlx.js +261 -0
- package/dist/_shared/layout-BExg7Vlx.js.map +1 -0
- package/dist/_shared/layout-CKRD_goE.cjs +2 -0
- package/dist/_shared/layout-CKRD_goE.cjs.map +1 -0
- package/dist/_shared/layout.types-CXFAjJCj.cjs +2 -0
- package/dist/_shared/layout.types-CXFAjJCj.cjs.map +1 -0
- package/dist/_shared/layout.types-ip8BYRa7.js +28 -0
- package/dist/_shared/layout.types-ip8BYRa7.js.map +1 -0
- package/dist/_shared/mentions-BtGhYisA.js +506 -0
- package/dist/_shared/mentions-BtGhYisA.js.map +1 -0
- package/dist/_shared/mentions-CnVOuQJU.cjs +2 -0
- package/dist/_shared/mentions-CnVOuQJU.cjs.map +1 -0
- package/dist/_shared/money-display-BvVpRUs5.cjs +2 -0
- package/dist/_shared/money-display-BvVpRUs5.cjs.map +1 -0
- package/dist/_shared/money-display-D6Qtvyyv.js +198 -0
- package/dist/_shared/money-display-D6Qtvyyv.js.map +1 -0
- package/dist/_shared/navigation-C4dO1I82.cjs +2 -0
- package/dist/_shared/navigation-C4dO1I82.cjs.map +1 -0
- package/dist/_shared/navigation-Ct-LFlpY.js +436 -0
- package/dist/_shared/navigation-Ct-LFlpY.js.map +1 -0
- package/dist/_shared/overlays-ChyqXn0n.js +735 -0
- package/dist/_shared/overlays-ChyqXn0n.js.map +1 -0
- package/dist/_shared/overlays-Dn2bt3CL.cjs +2 -0
- package/dist/_shared/overlays-Dn2bt3CL.cjs.map +1 -0
- package/dist/_shared/popover-menu-17Dxn25O.js +93 -0
- package/dist/_shared/popover-menu-17Dxn25O.js.map +1 -0
- package/dist/_shared/popover-menu-DXVN0bvj.cjs +2 -0
- package/dist/_shared/popover-menu-DXVN0bvj.cjs.map +1 -0
- package/dist/_shared/rich-text-editor-BRpcNkj1.js +620 -0
- package/dist/_shared/rich-text-editor-BRpcNkj1.js.map +1 -0
- package/dist/_shared/rich-text-editor-BXxGNbmI.cjs +2 -0
- package/dist/_shared/rich-text-editor-BXxGNbmI.cjs.map +1 -0
- package/dist/_shared/settings-CW9yzfQM.js +143 -0
- package/dist/_shared/settings-CW9yzfQM.js.map +1 -0
- package/dist/_shared/settings-cCPrw7si.cjs +2 -0
- package/dist/_shared/settings-cCPrw7si.cjs.map +1 -0
- package/dist/_shared/sidebar-Cq6J_I4l.cjs +2 -0
- package/dist/_shared/sidebar-Cq6J_I4l.cjs.map +1 -0
- package/dist/_shared/sidebar-DtF_ihE3.js +548 -0
- package/dist/_shared/sidebar-DtF_ihE3.js.map +1 -0
- package/dist/_shared/spinner-DY2de3Wt.cjs +2 -0
- package/dist/_shared/spinner-DY2de3Wt.cjs.map +1 -0
- package/dist/_shared/spinner-ZmIq_zsx.js +67 -0
- package/dist/_shared/spinner-ZmIq_zsx.js.map +1 -0
- package/dist/_shared/table-BBWc-wIw.js +1377 -0
- package/dist/_shared/table-BBWc-wIw.js.map +1 -0
- package/dist/_shared/table-DMDkdLzV.cjs +2 -0
- package/dist/_shared/table-DMDkdLzV.cjs.map +1 -0
- package/dist/_shared/textarea-C1TeJ7Vt.cjs +2 -0
- package/dist/_shared/textarea-C1TeJ7Vt.cjs.map +1 -0
- package/dist/_shared/textarea-CGRkgH5z.js +118 -0
- package/dist/_shared/textarea-CGRkgH5z.js.map +1 -0
- package/dist/_shared/typography-CzFVA1w1.js +201 -0
- package/dist/_shared/typography-CzFVA1w1.js.map +1 -0
- package/dist/_shared/typography-GtkgK9QX.cjs +2 -0
- package/dist/_shared/typography-GtkgK9QX.cjs.map +1 -0
- package/dist/_shared/workspace-BF5BtDhD.cjs +2 -0
- package/dist/_shared/workspace-BF5BtDhD.cjs.map +1 -0
- package/dist/_shared/workspace-IvsczduM.js +357 -0
- package/dist/_shared/workspace-IvsczduM.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/badge.d.ts.map +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/cards/partials/card-primitives.d.ts.map +1 -1
- package/dist/components/base/cards/smart-card.types.d.ts +3 -3
- package/dist/components/base/carousel/index.cjs +1 -1
- package/dist/components/base/carousel/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/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/chart.cjs +1 -1
- package/dist/components/base/display/chart.js +1 -1
- package/dist/components/base/display/index.cjs +1 -1
- package/dist/components/base/display/index.js +3 -3
- package/dist/components/base/event-calendar/index.cjs +1 -1
- package/dist/components/base/event-calendar/index.js +3 -3
- package/dist/components/base/forms/index.cjs +1 -1
- package/dist/components/base/forms/index.js +5 -5
- 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 +2 -2
- package/dist/components/base/navigation/index.cjs +1 -1
- package/dist/components/base/navigation/index.js +3 -3
- package/dist/components/base/popover-menu/index.cjs +1 -1
- package/dist/components/base/popover-menu/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/data-table.d.ts.map +1 -1
- package/dist/components/base/table/index.cjs +1 -1
- package/dist/components/base/table/index.js +1 -1
- package/dist/components/composed/admin/index.cjs +1 -1
- package/dist/components/composed/admin/index.js +11 -11
- package/dist/components/composed/ai/index.cjs +1 -1
- package/dist/components/composed/ai/index.js +8 -8
- package/dist/components/composed/analytics/index.cjs +1 -1
- package/dist/components/composed/analytics/index.js +3 -3
- package/dist/components/composed/cards/index.cjs +1 -1
- package/dist/components/composed/cards/index.js +7 -7
- package/dist/components/composed/commerce/index.cjs +1 -1
- package/dist/components/composed/commerce/index.js +8 -8
- package/dist/components/composed/dark-surfaces/index.cjs +1 -1
- package/dist/components/composed/dark-surfaces/index.js +4 -4
- package/dist/components/composed/data-display/index.cjs +1 -1
- package/dist/components/composed/data-display/index.js +1 -1
- package/dist/components/composed/data-display/metadata/metadata-list.d.ts.map +1 -1
- package/dist/components/composed/navigation/index.cjs +1 -1
- package/dist/components/composed/navigation/index.js +5 -5
- package/dist/components/composed/onboarding/index.cjs +1 -1
- package/dist/components/composed/onboarding/index.js +3 -3
- package/dist/components/composed/timelines/index.cjs +1 -1
- package/dist/components/composed/timelines/index.js +3 -3
- 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.js +5 -5
- package/dist/components/features/card/index.cjs +1 -1
- package/dist/components/features/card/index.js +4 -4
- package/dist/components/features/comments/index.cjs +1 -1
- package/dist/components/features/comments/index.js +2 -2
- package/dist/components/features/data-view/index.cjs +1 -1
- package/dist/components/features/data-view/index.js +2 -2
- package/dist/components/features/event-log/index.cjs +1 -1
- package/dist/components/features/event-log/index.js +4 -4
- package/dist/components/features/filters/index.cjs +1 -1
- package/dist/components/features/filters/index.js +6 -6
- package/dist/components/features/global-search/index.cjs +1 -1
- package/dist/components/features/global-search/index.js +4 -4
- package/dist/components/features/kanban/index.cjs +1 -1
- package/dist/components/features/kanban/index.js +3 -3
- package/dist/components/features/media-library/index.cjs +1 -1
- package/dist/components/features/media-library/index.js +8 -8
- 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/products/index.cjs +1 -1
- package/dist/components/features/products/index.js +11 -11
- package/dist/components/features/resource/index.cjs +1 -1
- package/dist/components/features/resource/index.js +4 -4
- 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/schema-form/index.cjs +1 -1
- package/dist/components/features/schema-form/index.js +8 -8
- 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/app-shell/index.cjs +1 -1
- package/dist/components/layout/app-shell/index.js +1 -1
- package/dist/components/layout/auth/index.cjs +1 -1
- package/dist/components/layout/auth/index.js +1 -1
- package/dist/components/layout/containers/containers.types.d.ts +2 -2
- package/dist/components/layout/containers/containers.types.d.ts.map +1 -1
- package/dist/components/layout/containers/content-container.d.ts.map +1 -1
- package/dist/components/layout/containers/index.cjs +1 -1
- package/dist/components/layout/containers/index.js +1 -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 +11 -12
- package/dist/components/layout/layout.types.d.ts.map +1 -1
- package/dist/components/layout/page/index.cjs +1 -1
- package/dist/components/layout/page/index.js +2 -2
- package/dist/components/layout/settings/index.cjs +1 -1
- package/dist/components/layout/settings/index.js +1 -1
- package/dist/components/layout/sidebar/components/sidebar-grouped-navigation.d.ts.map +1 -1
- package/dist/components/layout/sidebar/index.cjs +1 -1
- package/dist/components/layout/sidebar/index.js +2 -2
- package/dist/components/layout/workspace/index.cjs +1 -1
- package/dist/components/layout/workspace/index.js +1 -1
- package/dist/components/typography/index.cjs +1 -1
- package/dist/components/typography/index.js +1 -1
- package/dist/services/actions/index.cjs +1 -1
- package/dist/services/actions/index.js +1 -1
- package/dist/showcase/assets/AreaChart-CsIm9z7Y.js +6 -0
- package/dist/showcase/assets/CompositeItem-D9zznn01.js +1 -0
- package/dist/showcase/assets/CompositeRoot-CvxtZ81W.js +1 -0
- package/dist/showcase/assets/DialogTrigger-C-osQGHu.js +1 -0
- package/dist/showcase/assets/LabelableContext-_EE-HBND.js +1 -0
- package/dist/showcase/assets/PreviewLayout-KdEsSl3b.js +1 -0
- package/dist/showcase/assets/RadioGroup-4jOeNTc1.js +1 -0
- package/dist/showcase/assets/ScrollAreaCorner-CXTdUcaE.js +1 -0
- package/dist/showcase/assets/Separator-CHVXO6nj.js +1 -0
- package/dist/showcase/assets/ToolbarRootContext-CM5tQGGX.js +1 -0
- package/dist/showcase/assets/accordion-CA84bxb2.js +171 -0
- package/dist/showcase/assets/accordion-variants-DqWzAOO3.js +1 -0
- package/dist/showcase/assets/action-menu-D0q5z-Kq.js +1 -0
- package/dist/showcase/assets/actions-DnqxABJU.js +310 -0
- package/dist/showcase/assets/activities-BC9hoMy9.js +500 -0
- package/dist/showcase/assets/activities-feed-card-D6wGLpbH.js +1 -0
- package/dist/showcase/assets/admin-CMnMsugJ.js +140 -0
- package/dist/showcase/assets/ai-B6_sE9Zg.js +207 -0
- package/dist/showcase/assets/ai-artifact-BVvbsSJB.js +2 -0
- package/dist/showcase/assets/ai-chat-lcXeqJrA.js +568 -0
- package/dist/showcase/assets/ai-elements-B32o_UjE.js +387 -0
- package/dist/showcase/assets/ai-tool-call-BLrAioKz.js +1 -0
- package/dist/showcase/assets/alert-B1p1Grce.js +62 -0
- package/dist/showcase/assets/alert-BBiffYsY.js +93 -0
- package/dist/showcase/assets/alert-vH0nJ8J9.js +1 -0
- package/dist/showcase/assets/api-key-list-BrSc6V1y.js +1 -0
- package/dist/showcase/assets/api-key-list-CoKe_PaL.js +73 -0
- package/dist/showcase/assets/app-sidebar-R93lRPB4.js +1 -0
- package/dist/showcase/assets/arrow-down-xxVIADbv.js +1 -0
- package/dist/showcase/assets/arrow-left-DxnlnN8R.js +1 -0
- package/dist/showcase/assets/arrow-right-S5k93UPM.js +1 -0
- package/dist/showcase/assets/arrow-up-OlEVG7a-.js +1 -0
- package/dist/showcase/assets/arrow-up-right-j55bbl4b.js +1 -0
- package/dist/showcase/assets/avatar-BbiXvZq7.js +67 -0
- package/dist/showcase/assets/avatar-Bwpw-hQo.js +57 -0
- package/dist/showcase/assets/avatar-D0DKQ1lK.js +1 -0
- package/dist/showcase/assets/avatar-WyjSBov9.js +1 -0
- package/dist/showcase/assets/badge-BzLZQO3L.js +31 -0
- package/dist/showcase/assets/badge-check-TFWm1m3F.js +1 -0
- package/dist/showcase/assets/bell-CmuQlO_k.js +1 -0
- package/dist/showcase/assets/bot-Bu518AJB.js +1 -0
- package/dist/showcase/assets/box-D-wrSdOJ.js +1 -0
- package/dist/showcase/assets/braces-CgCdmdAl.js +1 -0
- package/dist/showcase/assets/brain-DkHdwgHO.js +1 -0
- package/dist/showcase/assets/brand-CpovnVoG.js +36 -0
- package/dist/showcase/assets/breadcrumb-BUc0WC5d.js +1 -0
- package/dist/showcase/assets/breadcrumb-Do_Dazt1.js +52 -0
- package/dist/showcase/assets/breadcrumbs-Bj21o2zm.js +1 -0
- package/dist/showcase/assets/briefcase-CQBh2kok.js +1 -0
- package/dist/showcase/assets/building-2-D07Ej6iR.js +1 -0
- package/dist/showcase/assets/button-CCZ4KEGQ.js +44 -0
- package/dist/showcase/assets/button-group-BTjeHOvz.js +1 -0
- package/dist/showcase/assets/buttons-D45Wwiwn.js +272 -0
- package/dist/showcase/assets/calendar-BsEWULmZ.js +16 -0
- package/dist/showcase/assets/calendar-CkPefzIO.js +1 -0
- package/dist/showcase/assets/calendar-DZlT3qTq.js +1 -0
- package/dist/showcase/assets/calendar-days-C9awTMru.js +1 -0
- package/dist/showcase/assets/camera-CQhMw-RD.js +1 -0
- package/dist/showcase/assets/card-CKrz_UHt.js +1 -0
- package/dist/showcase/assets/card-DZgZgjXO.js +188 -0
- package/dist/showcase/assets/card-primitives-CpkDLK3Y.js +1 -0
- package/dist/showcase/assets/card-radio-group-BjXwMI4v.js +1 -0
- package/dist/showcase/assets/cards-Cd24XZ9l.js +353 -0
- package/dist/showcase/assets/carousel-Doon04yO.js +449 -0
- package/dist/showcase/assets/cell-renderers-CTay3duH.js +1 -0
- package/dist/showcase/assets/chart-CkvbdpWw.js +358 -0
- package/dist/showcase/assets/chart-column-Dz57kUMl.js +1 -0
- package/dist/showcase/assets/checkbox-L-L4-wvA.js +1 -0
- package/dist/showcase/assets/checkbox-sP254E7e.js +1 -0
- package/dist/showcase/assets/chevron-down-CLc_a2Ua.js +1 -0
- package/dist/showcase/assets/chevron-left-CMRIGOJt.js +1 -0
- package/dist/showcase/assets/chevron-up-BDw6LdDZ.js +1 -0
- package/dist/showcase/assets/chevrons-up-down-C519RKki.js +1 -0
- package/dist/showcase/assets/circle-B_tOHWTY.js +1 -0
- package/dist/showcase/assets/circle-alert-B56AFULT.js +1 -0
- package/dist/showcase/assets/circle-check-B4XZj4Ty.js +1 -0
- package/dist/showcase/assets/circle-check-big-C0iEkwPB.js +1 -0
- package/dist/showcase/assets/circle-dot-DPdJZkc6.js +1 -0
- package/dist/showcase/assets/circle-question-mark-LTetdrq6.js +1 -0
- package/dist/showcase/assets/circle-x-B4FwM-sI.js +1 -0
- package/dist/showcase/assets/clock-3-DZhjBuw8.js +1 -0
- package/dist/showcase/assets/clock-B9Fna2Q3.js +1 -0
- package/dist/showcase/assets/code-xml-B6Xb_vIg.js +1 -0
- package/dist/showcase/assets/collapsible-Bf7Oo37i.js +27 -0
- package/dist/showcase/assets/collapsible-BfLeooy8.js +1 -0
- package/dist/showcase/assets/combobox-4NYfJznY.js +685 -0
- package/dist/showcase/assets/command-7jRRucHf.js +1 -0
- package/dist/showcase/assets/command-D56CjgNc.js +1 -0
- package/dist/showcase/assets/comment-composer-BWeXIZfK.js +1 -0
- package/dist/showcase/assets/comment-item-ChkiK-ut.js +1 -0
- package/dist/showcase/assets/comments-YnEop7v3.js +357 -0
- package/dist/showcase/assets/commerce-7XxWJChs.js +267 -0
- package/dist/showcase/assets/composite-CHcyYCsk.js +1 -0
- package/dist/showcase/assets/contact-card-BXw-VuBm.js +65 -0
- package/dist/showcase/assets/content-container-C4uopCBg.js +1 -0
- package/dist/showcase/assets/copyable-CjVYEJ0P.js +1 -0
- package/dist/showcase/assets/copyable-Cz2jW7yL.js +96 -0
- package/dist/showcase/assets/course-card-CvK3dw9W.js +77 -0
- package/dist/showcase/assets/cpu-Vk5WgcC1.js +1 -0
- package/dist/showcase/assets/credit-card-CaigqZGk.js +1 -0
- package/dist/showcase/assets/css-variables-hLaBmeMt.js +1190 -0
- package/dist/showcase/assets/currency-yO1giHp1.js +149 -0
- package/dist/showcase/assets/dark-surfaces-BPQnyk9a.js +90 -0
- package/dist/showcase/assets/data-view-CjjXn5VT.js +124 -0
- package/dist/showcase/assets/data-view-DF0n8uva.js +4 -0
- package/dist/showcase/assets/database-ChUBDe8E.js +1 -0
- package/dist/showcase/assets/date-block-DUg1Oyn4.js +1 -0
- package/dist/showcase/assets/date-picker-CoQPZa34.js +1 -0
- package/dist/showcase/assets/date-pickers-B-IUbyXw.js +73 -0
- package/dist/showcase/assets/dense-info-zVQSWqOU.js +106 -0
- package/dist/showcase/assets/design-system-consistency-Bnz_h3-6.js +264 -0
- package/dist/showcase/assets/dialog-BtilpgxJ.js +1 -0
- package/dist/showcase/assets/dialog-kf9WwmTC.js +1 -0
- package/dist/showcase/assets/display-utilities-BBzG5EPX.js +267 -0
- package/dist/showcase/assets/dist-9gFIhkw-.js +45 -0
- package/dist/showcase/assets/dist-CGpz_7Mu.js +1 -0
- package/dist/showcase/assets/dollar-sign-CWbYI3Pd.js +1 -0
- package/dist/showcase/assets/download-Bt_z-poH.js +1 -0
- package/dist/showcase/assets/dropdown-menu-C1_SYTHm.js +1 -0
- package/dist/showcase/assets/dropzone-D5BGVTnl.js +1 -0
- package/dist/showcase/assets/earth-sP5mIgG3.js +1 -0
- package/dist/showcase/assets/ellipsis-vertical-BD7kMOzj.js +1 -0
- package/dist/showcase/assets/ellipsis-yqIF49C8.js +1 -0
- package/dist/showcase/assets/empty-DIrJgtrh.js +1 -0
- package/dist/showcase/assets/empty-item-GgnZk2yf.js +49 -0
- package/dist/showcase/assets/empty-state-ZGKkJ6sf.js +190 -0
- package/dist/showcase/assets/empty-state-n_Fspzt-.js +1 -0
- package/dist/showcase/assets/enhanced-activities-CCw_hZnZ.js +357 -0
- package/dist/showcase/assets/enhanced-combobox-bBF-ADDs.js +1 -0
- package/dist/showcase/assets/esm-CyFPn936.js +2 -0
- package/dist/showcase/assets/event-calendar-Czo7yBDx.js +138 -0
- package/dist/showcase/assets/event-log-DJ3B3nMV.js +330 -0
- package/dist/showcase/assets/example-eGsLGIcp.js +1 -0
- package/dist/showcase/assets/external-link-DPOQEVWH.js +1 -0
- package/dist/showcase/assets/eye-CN92NVL0.js +1 -0
- package/dist/showcase/assets/feature-announcement-BXkSW17e.js +34 -0
- package/dist/showcase/assets/file-CFHePlKG.js +1 -0
- package/dist/showcase/assets/file-text--WYCYQMw.js +1 -0
- package/dist/showcase/assets/filter-layout-B35gGmcO.js +1 -0
- package/dist/showcase/assets/filters-GDW_oiT3.js +139 -0
- package/dist/showcase/assets/flag-XsT9XFPr.js +1 -0
- package/dist/showcase/assets/folder-open-RtsQ8vxf.js +1 -0
- package/dist/showcase/assets/form-field-Bijd1Gex.js +1 -0
- package/dist/showcase/assets/form-sizing-Dltt6Fj-.js +1 -0
- package/dist/showcase/assets/format-Ckw4OM66.js +1 -0
- package/dist/showcase/assets/forms-00bU7LN8.js +915 -0
- package/dist/showcase/assets/funnel-qu25WlXD.js +1 -0
- package/dist/showcase/assets/generic-Bf82Wiol.js +1 -0
- package/dist/showcase/assets/getPseudoElementBounds-BR4_m2HH.js +1 -0
- package/dist/showcase/assets/gift-D4GQoqzV.js +1 -0
- package/dist/showcase/assets/giftcard-cards-CMutwaAY.js +85 -0
- package/dist/showcase/assets/git-branch-B2QG2zRg.js +1 -0
- package/dist/showcase/assets/global-search-CRAB9TSF.js +1 -0
- package/dist/showcase/assets/global-search-DY0cKfhY.js +215 -0
- package/dist/showcase/assets/globe-BxZW28rG.js +1 -0
- package/dist/showcase/assets/gradient-card-CQGnXG8r.js +58 -0
- package/dist/showcase/assets/hash-CsRtIoKK.js +1 -0
- package/dist/showcase/assets/header-DzYOgZLP.js +1 -0
- package/dist/showcase/assets/header-notifications-D_CJPbvs.js +1 -0
- package/dist/showcase/assets/heart-B2YsYprq.js +1 -0
- package/dist/showcase/assets/hooks-BhUMA4Tb.js +220 -0
- package/dist/showcase/assets/house-HeRFNhI0.js +1 -0
- package/dist/showcase/assets/icon-badge-CpDkc-S0.js +37 -0
- package/dist/showcase/assets/icon-badge-eNEGgpAV.js +1 -0
- package/dist/showcase/assets/image-T88JyDag.js +1 -0
- package/dist/showcase/assets/inbox-DLrLLnTR.js +1 -0
- package/dist/showcase/assets/index-DDZl6kOS.js +10 -0
- package/dist/showcase/assets/index-nOkXemgw.css +2 -0
- package/dist/showcase/assets/inertValue-BajuuRy4.js +1 -0
- package/dist/showcase/assets/info-CNYfw2Yz.js +1 -0
- package/dist/showcase/assets/inline-stat-BN6yhDR5.js +15 -0
- package/dist/showcase/assets/inline-stat-Bqw3lVfk.js +1 -0
- package/dist/showcase/assets/input-C-9K6F0N.js +1 -0
- package/dist/showcase/assets/input-DaZzfkZV.js +1 -0
- package/dist/showcase/assets/input-group-DE-Xdhv4.js +1 -0
- package/dist/showcase/assets/input-group-DIQZnytn.js +47 -0
- package/dist/showcase/assets/inputs-Cl_JgSR4.js +155 -0
- package/dist/showcase/assets/installation-DdhD4Dkq.js +134 -0
- package/dist/showcase/assets/invoice-header-DOs2ACqQ.js +36 -0
- package/dist/showcase/assets/invoice-items-1EuA62mF.js +36 -0
- package/dist/showcase/assets/invoice-mini-vCrYEtWp.js +14 -0
- package/dist/showcase/assets/invoice-table--mDTs1Iz.js +30 -0
- package/dist/showcase/assets/isSameDay-BNB1yam4.js +1 -0
- package/dist/showcase/assets/isToday-BugOpGJC.js +1 -0
- package/dist/showcase/assets/italic-Ck4UD2ZT.js +1 -0
- package/dist/showcase/assets/item-BcesxqFS.js +139 -0
- package/dist/showcase/assets/item-BgPlwUMv.js +1 -0
- package/dist/showcase/assets/item-CB9k_rmo.js +1 -0
- package/dist/showcase/assets/kanban-cPuSVqWY.js +188 -0
- package/dist/showcase/assets/key-round-BmYjd5dk.js +1 -0
- package/dist/showcase/assets/label-BTIBJBqN.js +1 -0
- package/dist/showcase/assets/languages-he6FNXRs.js +1 -0
- package/dist/showcase/assets/layers-B_48DtOz.js +1 -0
- package/dist/showcase/assets/layout-app-shell-zwLv6jTP.js +608 -0
- package/dist/showcase/assets/layout-auth-2Zv5lr52.js +790 -0
- package/dist/showcase/assets/layout-containers-Dzw3xlKn.js +101 -0
- package/dist/showcase/assets/layout-header-TJ-WVmG3.js +203 -0
- package/dist/showcase/assets/layout-page-CIVQCKXK.js +314 -0
- package/dist/showcase/assets/layout-primitives-i_O81fzT.js +34 -0
- package/dist/showcase/assets/layout-sidebar-eH_pwBq_.js +224 -0
- package/dist/showcase/assets/layout-users-CWSaFBLj.js +117 -0
- package/dist/showcase/assets/layout-workspace-w3oe32GE.js +191 -0
- package/dist/showcase/assets/lib-CoS0xjP8.js +1 -0
- package/dist/showcase/assets/list-checks-DecRPpK3.js +1 -0
- package/dist/showcase/assets/lock-D9f8uXol.js +1 -0
- package/dist/showcase/assets/lock-keyhole-C20eixH6.js +1 -0
- package/dist/showcase/assets/mail-CVgP8Qlo.js +1 -0
- package/dist/showcase/assets/mail-check-mplTKcSH.js +1 -0
- package/dist/showcase/assets/map-B6OGeOup.js +124 -0
- package/dist/showcase/assets/map-pin-BZXSwrzT.js +1 -0
- package/dist/showcase/assets/media-library-DSlVIM1Q.js +699 -0
- package/dist/showcase/assets/mention-inline-suggestions-CNAEeXgy.js +1 -0
- package/dist/showcase/assets/mentions-Cb3g4hDN.js +138 -0
- package/dist/showcase/assets/menus-CE0Hlj8N.js +171 -0
- package/dist/showcase/assets/message-square-HliU8vbW.js +1 -0
- package/dist/showcase/assets/metadata-list-CJ5v5Bvc.js +286 -0
- package/dist/showcase/assets/metadata-list-DY92-pw2.js +1 -0
- package/dist/showcase/assets/metric-DxMTjIvU.js +1 -0
- package/dist/showcase/assets/metric-bar-cW9nWCRl.js +1 -0
- package/dist/showcase/assets/metric-grid-CvfO52X1.js +1 -0
- package/dist/showcase/assets/metric-trend-chip-BmjQdRus.js +1 -0
- package/dist/showcase/assets/metrics-analytics-bar-BZqB5d1y.js +44 -0
- package/dist/showcase/assets/metrics-analytics-cards-jAhlrQCI.js +50 -0
- package/dist/showcase/assets/metrics-comparison-DURZ6qEL.js +76 -0
- package/dist/showcase/assets/metrics-heatmap-HhJDBguh.js +27 -0
- package/dist/showcase/assets/metrics-inline-badge-Dq5k-P6F.js +17 -0
- package/dist/showcase/assets/metrics-kpi-row-DXzhwa6z.js +31 -0
- package/dist/showcase/assets/metrics-micro-grid-C6O5b0wP.js +42 -0
- package/dist/showcase/assets/metrics-overview-Hv2mseb3.js +192 -0
- package/dist/showcase/assets/metrics-stat-cards-CW42vBCS.js +54 -0
- package/dist/showcase/assets/minus-BW62vCxf.js +1 -0
- package/dist/showcase/assets/money-display-CAdGk5Lr.js +1 -0
- package/dist/showcase/assets/month-year-picker-dHuvgz1E.js +1 -0
- package/dist/showcase/assets/navigation-C4uSLvbZ.js +90 -0
- package/dist/showcase/assets/navigation-SjsZrtIc.js +231 -0
- package/dist/showcase/assets/navigation-extras-CMVNVskk.js +43 -0
- package/dist/showcase/assets/onboarding-checklist-C1jwRdMU.js +119 -0
- package/dist/showcase/assets/overflow-tab-bar-BYFLpl5w.js +1 -0
- package/dist/showcase/assets/overlays-0Y8MAz39.js +159 -0
- package/dist/showcase/assets/overlays-ClOnjahL.js +408 -0
- package/dist/showcase/assets/overview-B5ztGmTp.js +184 -0
- package/dist/showcase/assets/package-check-MeSw6bS4.js +1 -0
- package/dist/showcase/assets/package-vYJ0q0QM.js +1 -0
- package/dist/showcase/assets/page-4lMKtBQ7.js +1 -0
- package/dist/showcase/assets/page-action-button-C5-TGSzy.js +1 -0
- package/dist/showcase/assets/page-header-C_-KYryO.js +1 -0
- package/dist/showcase/assets/pagination-D3L3Iwus.js +1 -0
- package/dist/showcase/assets/pagination-dZXPxwHx.js +42 -0
- package/dist/showcase/assets/paperclip-BZhdPOw8.js +1 -0
- package/dist/showcase/assets/password-input-CDSMtGxt.js +1 -0
- package/dist/showcase/assets/pencil-DiYr3CZ9.js +1 -0
- package/dist/showcase/assets/phone-Dm5qzlG8.js +1 -0
- package/dist/showcase/assets/plus-pfGaA3St.js +1 -0
- package/dist/showcase/assets/popover-CjVWDO7C.js +1 -0
- package/dist/showcase/assets/popover-menu-JcZyGV3Y.js +1 -0
- package/dist/showcase/assets/popover-pZ4Jbp0s.js +1 -0
- package/dist/showcase/assets/products-C62MKtAR.js +423 -0
- package/dist/showcase/assets/progress-Btw-ZUaU.js +18 -0
- package/dist/showcase/assets/progress-DpB5LL6R.js +1 -0
- package/dist/showcase/assets/props-table-Bjc9IHmp.js +1 -0
- package/dist/showcase/assets/quote-DcxVd1fj.js +1 -0
- package/dist/showcase/assets/receipt-BHns-S5Q.js +1 -0
- package/dist/showcase/assets/receipt-text-L0aYasyt.js +1 -0
- package/dist/showcase/assets/refinement-guide-BBOGBJ4I.js +189 -0
- package/dist/showcase/assets/refresh-cw-z6mlm0HI.js +1 -0
- package/dist/showcase/assets/resolveValueLabel-hsarzg5A.js +1 -0
- package/dist/showcase/assets/resource-CIn_zKZ4.js +139 -0
- package/dist/showcase/assets/resource-DxktLgEK.js +1 -0
- package/dist/showcase/assets/resource-selector-card-dkcEQ6bl.js +43 -0
- package/dist/showcase/assets/rich-text-editor-Dd-rWisw.js +124 -0
- package/dist/showcase/assets/rich-text-editor-DvJMFj48.js +143 -0
- package/dist/showcase/assets/rotate-ccw-DEz6nb5P.js +1 -0
- package/dist/showcase/assets/route-BeXaXTk8.js +1 -0
- package/dist/showcase/assets/save-EE7Tc5OT.js +1 -0
- package/dist/showcase/assets/schema-form-RK9Zpz1E.js +327 -0
- package/dist/showcase/assets/scroll-area-BejQJ0Q1.js +32 -0
- package/dist/showcase/assets/scroll-area-DS8LJ7LG.js +1 -0
- package/dist/showcase/assets/section-Cv8i4DIx.js +1 -0
- package/dist/showcase/assets/select-Cuy3YKW9.js +1 -0
- package/dist/showcase/assets/select-qFy1jm91.js +1 -0
- package/dist/showcase/assets/send-CXv0ST9u.js +1 -0
- package/dist/showcase/assets/separator-CecGyBaV.js +1 -0
- package/dist/showcase/assets/separator-CqtFQXrk.js +28 -0
- package/dist/showcase/assets/settings-2-CCeMwMOj.js +1 -0
- package/dist/showcase/assets/settings-CXjN6wTC.js +1 -0
- package/dist/showcase/assets/sheet-Csyrmkqp.js +1 -0
- package/dist/showcase/assets/shield-DR0ZfAFA.js +1 -0
- package/dist/showcase/assets/shield-alert-Bp1iFJ2q.js +1 -0
- package/dist/showcase/assets/shield-check-ClL4B_Cd.js +1 -0
- package/dist/showcase/assets/shopping-bag-DnSmbPUX.js +1 -0
- package/dist/showcase/assets/showcase-CQKt5VGi.js +132 -0
- package/dist/showcase/assets/sidebar-CXy94md1.js +1 -0
- package/dist/showcase/assets/sidebar.context-C8gkOwJ5.js +1 -0
- package/dist/showcase/assets/skeleton-B8wC5P66.js +29 -0
- package/dist/showcase/assets/skeleton-DBlCLlBC.js +1 -0
- package/dist/showcase/assets/slider-BcjkNx6W.js +1 -0
- package/dist/showcase/assets/smart-card-Cg6rtWH9.js +1 -0
- package/dist/showcase/assets/sonner-ZGBQ13wS.js +22 -0
- package/dist/showcase/assets/sortable.esm-CGFWc-Cn.js +5 -0
- package/dist/showcase/assets/sparkles-q1-9JZqa.js +1 -0
- package/dist/showcase/assets/spinner-CKg8QLHu.js +1 -0
- package/dist/showcase/assets/spinner-D1Ao9j9T.js +49 -0
- package/dist/showcase/assets/spinner-oahLIkgb.js +30 -0
- package/dist/showcase/assets/square-pen-DZ3bQJia.js +1 -0
- package/dist/showcase/assets/stacked-avatars-CKPtb3Hj.js +1 -0
- package/dist/showcase/assets/star-suetD-KI.js +1 -0
- package/dist/showcase/assets/startOfDay-OjIsUeiv.js +1 -0
- package/dist/showcase/assets/styles-1mYOoC2k.js +1 -0
- package/dist/showcase/assets/suggestions-DLYaI-In.js +126 -0
- package/dist/showcase/assets/switch-CTTrJNwo.js +1 -0
- package/dist/showcase/assets/switch-ChJWWmxN.js +1 -0
- package/dist/showcase/assets/sync-DsHYydvo.js +124 -0
- package/dist/showcase/assets/table-Ck2ptin2.js +686 -0
- package/dist/showcase/assets/table-DyJ9oADQ.js +1 -0
- package/dist/showcase/assets/table-actions-COU4zHfh.js +1 -0
- package/dist/showcase/assets/tabs-Bl_RHGIw.js +1 -0
- package/dist/showcase/assets/tabs-DS-4VSkb.js +19 -0
- package/dist/showcase/assets/tags-input-BlYzb5fF.js +1 -0
- package/dist/showcase/assets/text-button-OPdNs3fb.js +1 -0
- package/dist/showcase/assets/text-link-D27gqGeg.js +1 -0
- package/dist/showcase/assets/textarea-DpC7J5F-.js +1 -0
- package/dist/showcase/assets/textarea-JtXUjxvc.js +1 -0
- package/dist/showcase/assets/timelines-DQM-B4Xo.js +200 -0
- package/dist/showcase/assets/toggle-group-CMneKREH.js +1 -0
- package/dist/showcase/assets/toggles-CAXXgjO_.js +71 -0
- package/dist/showcase/assets/toggles-group-CHRqrpoM.js +32 -0
- package/dist/showcase/assets/tooltip-CwGZAioX.js +31 -0
- package/dist/showcase/assets/trash-2-BpMb9Zbb.js +1 -0
- package/dist/showcase/assets/trending-up-B1BzitCg.js +1 -0
- package/dist/showcase/assets/truck-CDSE5-HZ.js +1 -0
- package/dist/showcase/assets/typography-BoNJ1hRZ.js +223 -0
- package/dist/showcase/assets/ui-badge-Djh6NiB2.js +28 -0
- package/dist/showcase/assets/ui-card-QC_rl_H2.js +30 -0
- package/dist/showcase/assets/ui-table-qAGsc3qN.js +42 -0
- package/dist/showcase/assets/upload-tray-DKCJgW5u.js +138 -0
- package/dist/showcase/assets/use-layout-link-BPlsZ8Ys.js +1 -0
- package/dist/showcase/assets/useAnchoredPopupScrollLock-526MebAC.js +1 -0
- package/dist/showcase/assets/useAriaLabelledBy-CqySZiH9.js +1 -0
- package/dist/showcase/assets/useCollapsiblePanel-DWX7LbGX.js +1 -0
- package/dist/showcase/assets/useCompositeItem-DGEBUXgE.js +1 -0
- package/dist/showcase/assets/useCompositeListItem-B2nuNlc2.js +1 -0
- package/dist/showcase/assets/useLabelableId-DY4O1lpt.js +1 -0
- package/dist/showcase/assets/useOpenInteractionType-DxwujDvt.js +1 -0
- package/dist/showcase/assets/useRender-BPoNv-Lm.js +1 -0
- package/dist/showcase/assets/useTriggerFocusGuards-BnOSAjfy.js +1 -0
- package/dist/showcase/assets/useValueChanged-CXmDOWxx.js +1 -0
- package/dist/showcase/assets/user-BGchdtV_.js +1 -0
- package/dist/showcase/assets/user-plus-BifI_xVA.js +1 -0
- package/dist/showcase/assets/users-Cl5yYqdg.js +1 -0
- package/dist/showcase/assets/vendor-profile-BNW4FYna.js +37 -0
- package/dist/showcase/assets/video-BtQPixYN.js +1 -0
- package/dist/showcase/assets/wrench-CRalc5fG.js +1 -0
- package/dist/showcase/assets/x-D6hUY89S.js +1 -0
- package/dist/showcase/assets/zap-v_qbqeI5.js +1 -0
- package/dist/showcase/index.html +2 -2
- package/dist/style.css +1 -1
- package/package.json +1 -1
- package/src/css/themes/shadcn.default.css +6 -6
- package/src/css/tokens/foundation.css +6 -6
- package/dist/_shared/accordion-B9EjlZLY.js +0 -135
- package/dist/_shared/accordion-B9EjlZLY.js.map +0 -1
- package/dist/_shared/accordion-IFDIc0E7.cjs +0 -2
- package/dist/_shared/accordion-IFDIc0E7.cjs.map +0 -1
- package/dist/_shared/action-menu-B6yFRDz1.cjs +0 -2
- package/dist/_shared/action-menu-B6yFRDz1.cjs.map +0 -1
- package/dist/_shared/action-menu-CNS-fwQr.js +0 -96
- package/dist/_shared/action-menu-CNS-fwQr.js.map +0 -1
- package/dist/_shared/ai-artifact-B3qhuiKC.js +0 -1099
- package/dist/_shared/ai-artifact-B3qhuiKC.js.map +0 -1
- package/dist/_shared/ai-artifact-Dtr0bnVq.cjs +0 -3
- package/dist/_shared/ai-artifact-Dtr0bnVq.cjs.map +0 -1
- package/dist/_shared/alert-V0V36Sny.cjs +0 -2
- package/dist/_shared/alert-V0V36Sny.cjs.map +0 -1
- package/dist/_shared/alert-m-4s0Hqq.js +0 -81
- package/dist/_shared/alert-m-4s0Hqq.js.map +0 -1
- package/dist/_shared/app-shell-D3eGUtL-.js +0 -69
- package/dist/_shared/app-shell-D3eGUtL-.js.map +0 -1
- package/dist/_shared/app-shell-QJHARDMB.cjs +0 -2
- package/dist/_shared/app-shell-QJHARDMB.cjs.map +0 -1
- package/dist/_shared/auth-DdezEtKK.cjs +0 -2
- package/dist/_shared/auth-DdezEtKK.cjs.map +0 -1
- package/dist/_shared/auth-e7yab9pK.js +0 -643
- package/dist/_shared/auth-e7yab9pK.js.map +0 -1
- package/dist/_shared/badge-BeSKxX1u.cjs +0 -2
- package/dist/_shared/badge-BeSKxX1u.cjs.map +0 -1
- package/dist/_shared/badge-a2Z3K5aQ.js +0 -110
- package/dist/_shared/badge-a2Z3K5aQ.js.map +0 -1
- package/dist/_shared/breadcrumbs-AyLzxCJZ.cjs +0 -2
- package/dist/_shared/breadcrumbs-AyLzxCJZ.cjs.map +0 -1
- package/dist/_shared/breadcrumbs-B57Unsoe.js +0 -105
- package/dist/_shared/breadcrumbs-B57Unsoe.js.map +0 -1
- package/dist/_shared/button-Bd5bEIiB.cjs +0 -2
- package/dist/_shared/button-Bd5bEIiB.cjs.map +0 -1
- package/dist/_shared/button-DHksjMvc.js +0 -189
- package/dist/_shared/button-DHksjMvc.js.map +0 -1
- package/dist/_shared/buttons-Bek9F7qK.cjs +0 -2
- package/dist/_shared/buttons-Bek9F7qK.cjs.map +0 -1
- package/dist/_shared/buttons-DcynMPnE.js +0 -137
- package/dist/_shared/buttons-DcynMPnE.js.map +0 -1
- package/dist/_shared/card-radio-group-C2p_iBal.cjs +0 -2
- package/dist/_shared/card-radio-group-C2p_iBal.cjs.map +0 -1
- package/dist/_shared/card-radio-group-Fdi1Cz1j.js +0 -150
- package/dist/_shared/card-radio-group-Fdi1Cz1j.js.map +0 -1
- package/dist/_shared/cards-CbbHly7W.cjs +0 -2
- package/dist/_shared/cards-CbbHly7W.cjs.map +0 -1
- package/dist/_shared/cards-RZxRLx3f.js +0 -355
- package/dist/_shared/cards-RZxRLx3f.js.map +0 -1
- package/dist/_shared/combobox-BIe72dV3.js +0 -954
- package/dist/_shared/combobox-BIe72dV3.js.map +0 -1
- package/dist/_shared/combobox-CJiFDoTi.cjs +0 -2
- package/dist/_shared/combobox-CJiFDoTi.cjs.map +0 -1
- package/dist/_shared/comments-BJqgvSFY.js +0 -952
- package/dist/_shared/comments-BJqgvSFY.js.map +0 -1
- package/dist/_shared/comments-BjPciQfo.cjs +0 -2
- package/dist/_shared/comments-BjPciQfo.cjs.map +0 -1
- package/dist/_shared/containers-D7oZE4XI.cjs +0 -2
- package/dist/_shared/containers-D7oZE4XI.cjs.map +0 -1
- package/dist/_shared/containers-anBivbL9.js +0 -19
- package/dist/_shared/containers-anBivbL9.js.map +0 -1
- package/dist/_shared/content-container-CVUJCLhn.cjs +0 -2
- package/dist/_shared/content-container-CVUJCLhn.cjs.map +0 -1
- package/dist/_shared/content-container-Dv8XsAw4.js +0 -33
- package/dist/_shared/content-container-Dv8XsAw4.js.map +0 -1
- package/dist/_shared/copyable-Dopk9pEJ.js +0 -38
- package/dist/_shared/copyable-Dopk9pEJ.js.map +0 -1
- package/dist/_shared/copyable-rQwxsTJ3.cjs +0 -2
- package/dist/_shared/copyable-rQwxsTJ3.cjs.map +0 -1
- package/dist/_shared/data-display-C21skrV4.cjs +0 -2
- package/dist/_shared/data-display-C21skrV4.cjs.map +0 -1
- package/dist/_shared/data-display-C5-1dZua.js +0 -1873
- package/dist/_shared/data-display-C5-1dZua.js.map +0 -1
- package/dist/_shared/date-picker-BiUgIkjP.cjs +0 -2
- package/dist/_shared/date-picker-BiUgIkjP.cjs.map +0 -1
- package/dist/_shared/date-picker-DFkLiveH.js +0 -1361
- package/dist/_shared/date-picker-DFkLiveH.js.map +0 -1
- package/dist/_shared/date-pickers-C86tVD8e.cjs +0 -2
- package/dist/_shared/date-pickers-C86tVD8e.cjs.map +0 -1
- package/dist/_shared/date-pickers-D4oxOOHE.js +0 -329
- package/dist/_shared/date-pickers-D4oxOOHE.js.map +0 -1
- package/dist/_shared/display-B0wLVN8t.js +0 -986
- package/dist/_shared/display-B0wLVN8t.js.map +0 -1
- package/dist/_shared/display-Bin2vVex.cjs +0 -2
- package/dist/_shared/display-Bin2vVex.cjs.map +0 -1
- package/dist/_shared/form-sizing-C51oI3Di.js +0 -42
- package/dist/_shared/form-sizing-C51oI3Di.js.map +0 -1
- package/dist/_shared/form-sizing-Co53Drri.cjs +0 -2
- package/dist/_shared/form-sizing-Co53Drri.cjs.map +0 -1
- package/dist/_shared/forms-BoquZE2Y.js +0 -3533
- package/dist/_shared/forms-BoquZE2Y.js.map +0 -1
- package/dist/_shared/forms-CzrEYejY.cjs +0 -2
- package/dist/_shared/forms-CzrEYejY.cjs.map +0 -1
- package/dist/_shared/header-CxhEtk9M.cjs +0 -2
- package/dist/_shared/header-CxhEtk9M.cjs.map +0 -1
- package/dist/_shared/header-h3f14vQx.js +0 -447
- package/dist/_shared/header-h3f14vQx.js.map +0 -1
- package/dist/_shared/hooks-CS55-w3h.js +0 -95
- package/dist/_shared/hooks-CS55-w3h.js.map +0 -1
- package/dist/_shared/hooks-sfHAyDgD.cjs +0 -2
- package/dist/_shared/hooks-sfHAyDgD.cjs.map +0 -1
- package/dist/_shared/input-CB6hxh-5.cjs +0 -2
- package/dist/_shared/input-CB6hxh-5.cjs.map +0 -1
- package/dist/_shared/input-CfnHBT--.js +0 -182
- package/dist/_shared/input-CfnHBT--.js.map +0 -1
- package/dist/_shared/item-Xs-fgzaT.js +0 -226
- package/dist/_shared/item-Xs-fgzaT.js.map +0 -1
- package/dist/_shared/item-eUP9Rtmg.cjs +0 -2
- package/dist/_shared/item-eUP9Rtmg.cjs.map +0 -1
- package/dist/_shared/layout.types-CYuDZ_4h.cjs +0 -2
- package/dist/_shared/layout.types-CYuDZ_4h.cjs.map +0 -1
- package/dist/_shared/layout.types-j7zZAPtg.js +0 -28
- package/dist/_shared/layout.types-j7zZAPtg.js.map +0 -1
- package/dist/_shared/mentions-BahbwDwU.js +0 -506
- package/dist/_shared/mentions-BahbwDwU.js.map +0 -1
- package/dist/_shared/mentions-aHalksbt.cjs +0 -2
- package/dist/_shared/mentions-aHalksbt.cjs.map +0 -1
- package/dist/_shared/money-display-BLPNMmiT.cjs +0 -2
- package/dist/_shared/money-display-BLPNMmiT.cjs.map +0 -1
- package/dist/_shared/money-display-D_-Cb8-9.js +0 -198
- package/dist/_shared/money-display-D_-Cb8-9.js.map +0 -1
- package/dist/_shared/navigation-BcYAwgzo.js +0 -436
- package/dist/_shared/navigation-BcYAwgzo.js.map +0 -1
- package/dist/_shared/navigation-DAB7uuBj.cjs +0 -2
- package/dist/_shared/navigation-DAB7uuBj.cjs.map +0 -1
- package/dist/_shared/overlays-DW8OIK5R.js +0 -735
- package/dist/_shared/overlays-DW8OIK5R.js.map +0 -1
- package/dist/_shared/overlays-Du65iCkx.cjs +0 -2
- package/dist/_shared/overlays-Du65iCkx.cjs.map +0 -1
- package/dist/_shared/page-D8UMXREv.cjs +0 -2
- package/dist/_shared/page-D8UMXREv.cjs.map +0 -1
- package/dist/_shared/page-D9LNsHMN.js +0 -262
- package/dist/_shared/page-D9LNsHMN.js.map +0 -1
- package/dist/_shared/popover-menu-qxBZlTck.js +0 -93
- package/dist/_shared/popover-menu-qxBZlTck.js.map +0 -1
- package/dist/_shared/popover-menu-z9QTjl4o.cjs +0 -2
- package/dist/_shared/popover-menu-z9QTjl4o.cjs.map +0 -1
- package/dist/_shared/rich-text-editor-DeIiIDn7.cjs +0 -2
- package/dist/_shared/rich-text-editor-DeIiIDn7.cjs.map +0 -1
- package/dist/_shared/rich-text-editor-VIBlL0x3.js +0 -620
- package/dist/_shared/rich-text-editor-VIBlL0x3.js.map +0 -1
- package/dist/_shared/settings-BeZOIEJB.js +0 -143
- package/dist/_shared/settings-BeZOIEJB.js.map +0 -1
- package/dist/_shared/settings-DI-K34bW.cjs +0 -2
- package/dist/_shared/settings-DI-K34bW.cjs.map +0 -1
- package/dist/_shared/sidebar-DfToCaiC.cjs +0 -2
- package/dist/_shared/sidebar-DfToCaiC.cjs.map +0 -1
- package/dist/_shared/sidebar-DhpRdTZH.js +0 -541
- package/dist/_shared/sidebar-DhpRdTZH.js.map +0 -1
- package/dist/_shared/spinner-D35zNriU.cjs +0 -2
- package/dist/_shared/spinner-D35zNriU.cjs.map +0 -1
- package/dist/_shared/spinner-DMC2IIml.js +0 -67
- package/dist/_shared/spinner-DMC2IIml.js.map +0 -1
- package/dist/_shared/table-B_pqCQxC.js +0 -1377
- package/dist/_shared/table-B_pqCQxC.js.map +0 -1
- package/dist/_shared/table-CGVOXtdv.cjs +0 -2
- package/dist/_shared/table-CGVOXtdv.cjs.map +0 -1
- package/dist/_shared/textarea-B24qgdmd.cjs +0 -2
- package/dist/_shared/textarea-B24qgdmd.cjs.map +0 -1
- package/dist/_shared/textarea-ChLRmmVU.js +0 -118
- package/dist/_shared/textarea-ChLRmmVU.js.map +0 -1
- package/dist/_shared/typography-CO9uwZhF.cjs +0 -2
- package/dist/_shared/typography-CO9uwZhF.cjs.map +0 -1
- package/dist/_shared/typography-DE0NGEIE.js +0 -201
- package/dist/_shared/typography-DE0NGEIE.js.map +0 -1
- package/dist/_shared/workspace-BgtWS9fA.cjs +0 -2
- package/dist/_shared/workspace-BgtWS9fA.cjs.map +0 -1
- package/dist/_shared/workspace-D2jJ0PlS.js +0 -357
- package/dist/_shared/workspace-D2jJ0PlS.js.map +0 -1
- package/dist/showcase/assets/AreaChart-Y0ZwblHU.js +0 -6
- package/dist/showcase/assets/CompositeItem-BIY_Cp7P.js +0 -1
- package/dist/showcase/assets/CompositeRoot-DSPvBRQr.js +0 -1
- package/dist/showcase/assets/DialogTrigger-DHUp8vXe.js +0 -1
- package/dist/showcase/assets/LabelableContext-CasUI4hR.js +0 -1
- package/dist/showcase/assets/PreviewLayout-B_l930k0.js +0 -1
- package/dist/showcase/assets/RadioGroup-BgZ-UH79.js +0 -1
- package/dist/showcase/assets/ScrollAreaCorner-BbwFElLA.js +0 -1
- package/dist/showcase/assets/Separator-dQuencsA.js +0 -1
- package/dist/showcase/assets/ToolbarRootContext-BE0hbejq.js +0 -1
- package/dist/showcase/assets/accordion-D93ZNsLn.js +0 -171
- package/dist/showcase/assets/accordion-variants-Bl4bIQH4.js +0 -1
- package/dist/showcase/assets/action-menu--rEgMzDi.js +0 -1
- package/dist/showcase/assets/actions-3iedOWD9.js +0 -310
- package/dist/showcase/assets/activities-CyrAWFlu.js +0 -500
- package/dist/showcase/assets/activities-feed-card-bhIATc2O.js +0 -1
- package/dist/showcase/assets/admin-CZzNsj2q.js +0 -140
- package/dist/showcase/assets/ai-CasHwkW4.js +0 -207
- package/dist/showcase/assets/ai-artifact-BgWvrLAb.js +0 -2
- package/dist/showcase/assets/ai-chat-seS9aW-1.js +0 -568
- package/dist/showcase/assets/ai-elements-Tku5_ous.js +0 -387
- package/dist/showcase/assets/ai-tool-call-BU6xbmXG.js +0 -1
- package/dist/showcase/assets/alert-6Emt6KX2.js +0 -1
- package/dist/showcase/assets/alert-B6aLWiRW.js +0 -62
- package/dist/showcase/assets/alert-CtoTQ0vN.js +0 -93
- package/dist/showcase/assets/api-key-list-C0glWR3z.js +0 -1
- package/dist/showcase/assets/api-key-list-DcWSbY3u.js +0 -73
- package/dist/showcase/assets/app-sidebar-D_eNP_jh.js +0 -1
- package/dist/showcase/assets/arrow-down-qyKZ1H5j.js +0 -1
- package/dist/showcase/assets/arrow-left-C9I0h_su.js +0 -1
- package/dist/showcase/assets/arrow-right-DswaRsr6.js +0 -1
- package/dist/showcase/assets/arrow-up-5BijPOxK.js +0 -1
- package/dist/showcase/assets/arrow-up-right-CbVVNT6g.js +0 -1
- package/dist/showcase/assets/avatar-BYHVCvVW.js +0 -67
- package/dist/showcase/assets/avatar-BlLAVC87.js +0 -1
- package/dist/showcase/assets/avatar-DQTXjcS4.js +0 -1
- package/dist/showcase/assets/avatar-DveZy09C.js +0 -57
- package/dist/showcase/assets/badge-Bth3mRTh.js +0 -31
- package/dist/showcase/assets/badge-check-DocF8Ho3.js +0 -1
- package/dist/showcase/assets/bell-DXBoeAzi.js +0 -1
- package/dist/showcase/assets/bot-Ch-Y1HK8.js +0 -1
- package/dist/showcase/assets/box-72m9QSDa.js +0 -1
- package/dist/showcase/assets/braces-CC17X3TE.js +0 -1
- package/dist/showcase/assets/brain-Dvbla_5x.js +0 -1
- package/dist/showcase/assets/brand-D5ciAq8v.js +0 -36
- package/dist/showcase/assets/breadcrumb-BBCaOVyz.js +0 -52
- package/dist/showcase/assets/breadcrumb-Bt8yVTCj.js +0 -1
- package/dist/showcase/assets/breadcrumbs-CkVWfcAN.js +0 -1
- package/dist/showcase/assets/briefcase-8rQTJwpE.js +0 -1
- package/dist/showcase/assets/building-2-CV7gTtXz.js +0 -1
- package/dist/showcase/assets/button-HGjoBio3.js +0 -44
- package/dist/showcase/assets/button-group-LWToSCrp.js +0 -1
- package/dist/showcase/assets/buttons-Bn_dX6Kk.js +0 -272
- package/dist/showcase/assets/calendar-BTsffmY8.js +0 -1
- package/dist/showcase/assets/calendar-Bhpyn4u0.js +0 -1
- package/dist/showcase/assets/calendar-DjrUTKcD.js +0 -16
- package/dist/showcase/assets/calendar-days-BKCkzWjV.js +0 -1
- package/dist/showcase/assets/camera-EjpDG3mc.js +0 -1
- package/dist/showcase/assets/card-Bp6iGuOF.js +0 -188
- package/dist/showcase/assets/card-CHc6AVFt.js +0 -1
- package/dist/showcase/assets/card-primitives-Bv6XGPJd.js +0 -1
- package/dist/showcase/assets/card-radio-group-Ce9FsiSv.js +0 -1
- package/dist/showcase/assets/cards-_CGG9zir.js +0 -354
- package/dist/showcase/assets/carousel-BVbsKH2W.js +0 -449
- package/dist/showcase/assets/cell-renderers-CosD6Gby.js +0 -1
- package/dist/showcase/assets/chart-CwOp8Sf8.js +0 -358
- package/dist/showcase/assets/chart-column-sz871NdJ.js +0 -1
- package/dist/showcase/assets/checkbox-BO38TYqr.js +0 -1
- package/dist/showcase/assets/checkbox-W4MhlPlJ.js +0 -1
- package/dist/showcase/assets/chevron-down-BFh1Fz2P.js +0 -1
- package/dist/showcase/assets/chevron-left-C5_X5glO.js +0 -1
- package/dist/showcase/assets/chevron-up-DPH3boVS.js +0 -1
- package/dist/showcase/assets/chevrons-up-down-CM5mIDaw.js +0 -1
- package/dist/showcase/assets/circle-BFDzL1iF.js +0 -1
- package/dist/showcase/assets/circle-alert-C6MbOB0m.js +0 -1
- package/dist/showcase/assets/circle-check-C0X85t4j.js +0 -1
- package/dist/showcase/assets/circle-check-big-CBaodck_.js +0 -1
- package/dist/showcase/assets/circle-dot-DdRpIhnL.js +0 -1
- package/dist/showcase/assets/circle-question-mark-CKlcead7.js +0 -1
- package/dist/showcase/assets/circle-x-MO44aKHe.js +0 -1
- package/dist/showcase/assets/clock-3-CXQJFcbh.js +0 -1
- package/dist/showcase/assets/clock-GhBJJ6n1.js +0 -1
- package/dist/showcase/assets/code-xml-BSX7Qyi5.js +0 -1
- package/dist/showcase/assets/collapsible-CZLTO5EH.js +0 -1
- package/dist/showcase/assets/collapsible-LrDO_sSQ.js +0 -27
- package/dist/showcase/assets/combobox-TmDBXkM-.js +0 -685
- package/dist/showcase/assets/command-9-r1qrJt.js +0 -1
- package/dist/showcase/assets/command-DGne3l9s.js +0 -1
- package/dist/showcase/assets/comment-composer-BI0qnvuY.js +0 -1
- package/dist/showcase/assets/comment-item-Cedds6Lm.js +0 -1
- package/dist/showcase/assets/comments-De02NOns.js +0 -357
- package/dist/showcase/assets/commerce-DldtS83o.js +0 -267
- package/dist/showcase/assets/composite-BjZZlzzb.js +0 -1
- package/dist/showcase/assets/contact-card-muCZ3uXV.js +0 -65
- package/dist/showcase/assets/content-container-BxSLICeL.js +0 -1
- package/dist/showcase/assets/copyable-DYhhmTqM.js +0 -1
- package/dist/showcase/assets/copyable-MNU75-J9.js +0 -96
- package/dist/showcase/assets/course-card-Dl1wsuJx.js +0 -77
- package/dist/showcase/assets/cpu-CsWq4fcX.js +0 -1
- package/dist/showcase/assets/credit-card-B0AUZiWw.js +0 -1
- package/dist/showcase/assets/css-variables-Be7DzahT.js +0 -1190
- package/dist/showcase/assets/currency-BtPM_Xtw.js +0 -149
- package/dist/showcase/assets/dark-surfaces-DRFERSEv.js +0 -90
- package/dist/showcase/assets/data-view-DmWd0h7G.js +0 -4
- package/dist/showcase/assets/data-view-DnLH2o0i.js +0 -124
- package/dist/showcase/assets/database-C0YqGaQ_.js +0 -1
- package/dist/showcase/assets/date-block-BQH25FLS.js +0 -1
- package/dist/showcase/assets/date-picker-BF-jevhh.js +0 -1
- package/dist/showcase/assets/date-pickers-q2v3ajJm.js +0 -73
- package/dist/showcase/assets/dense-info-Cb-roqDU.js +0 -106
- package/dist/showcase/assets/design-system-consistency-DMSJknaM.js +0 -264
- package/dist/showcase/assets/dialog-C0ALRmbP.js +0 -1
- package/dist/showcase/assets/dialog-CbXon08k.js +0 -1
- package/dist/showcase/assets/display-utilities-kBUVw7o3.js +0 -267
- package/dist/showcase/assets/dist-CTSkWj_M.js +0 -45
- package/dist/showcase/assets/dist-W8bxVfew.js +0 -1
- package/dist/showcase/assets/dollar-sign-VNxVZleW.js +0 -1
- package/dist/showcase/assets/download-Ds_6eIpx.js +0 -1
- package/dist/showcase/assets/dropdown-menu-C1G_y9dv.js +0 -1
- package/dist/showcase/assets/dropzone-CxOLmdkt.js +0 -1
- package/dist/showcase/assets/earth-HLyEI1oq.js +0 -1
- package/dist/showcase/assets/ellipsis-BLyAd9A-.js +0 -1
- package/dist/showcase/assets/ellipsis-vertical-TG4mYU2J.js +0 -1
- package/dist/showcase/assets/empty-B54k9xAG.js +0 -1
- package/dist/showcase/assets/empty-item-BmA4rmq7.js +0 -49
- package/dist/showcase/assets/empty-state-CH7gjjg7.js +0 -190
- package/dist/showcase/assets/empty-state-hUKvmKa-.js +0 -1
- package/dist/showcase/assets/enhanced-activities-BRDVL9RR.js +0 -357
- package/dist/showcase/assets/enhanced-combobox-2wbQJS6R.js +0 -1
- package/dist/showcase/assets/esm-CUTefMLr.js +0 -2
- package/dist/showcase/assets/event-calendar-Bf9xFZlt.js +0 -138
- package/dist/showcase/assets/event-log-CeRDSL-h.js +0 -330
- package/dist/showcase/assets/example-CJMJcnb4.js +0 -1
- package/dist/showcase/assets/external-link-CvXhYrnd.js +0 -1
- package/dist/showcase/assets/eye-Cl_GfUKH.js +0 -1
- package/dist/showcase/assets/feature-announcement-Dw0SokLo.js +0 -34
- package/dist/showcase/assets/file-CJFWrwy1.js +0 -1
- package/dist/showcase/assets/file-text-BTTFP8Jo.js +0 -1
- package/dist/showcase/assets/filter-layout-DUVqG5Ql.js +0 -1
- package/dist/showcase/assets/filters-BLcCaplV.js +0 -139
- package/dist/showcase/assets/flag-BxI3EGPG.js +0 -1
- package/dist/showcase/assets/folder-open-4d8qsiAj.js +0 -1
- package/dist/showcase/assets/form-field-Dhy0eM5B.js +0 -1
- package/dist/showcase/assets/form-sizing-C3UG5WKC.js +0 -1
- package/dist/showcase/assets/format-zGqa9Olc.js +0 -1
- package/dist/showcase/assets/forms-D99qG5Gb.js +0 -915
- package/dist/showcase/assets/funnel-Cg7SOShf.js +0 -1
- package/dist/showcase/assets/generic-CfrG943t.js +0 -1
- package/dist/showcase/assets/getPseudoElementBounds-lw5shsdM.js +0 -1
- package/dist/showcase/assets/gift-BXtKbzvA.js +0 -1
- package/dist/showcase/assets/giftcard-cards-CqYaN0jC.js +0 -85
- package/dist/showcase/assets/git-branch-BWAuIMOQ.js +0 -1
- package/dist/showcase/assets/global-search-CHUva8pR.js +0 -1
- package/dist/showcase/assets/global-search-Df7JovOG.js +0 -215
- package/dist/showcase/assets/globe-CvIW_foU.js +0 -1
- package/dist/showcase/assets/gradient-card-CdM2J1Hv.js +0 -58
- package/dist/showcase/assets/hash-wBs5gyr_.js +0 -1
- package/dist/showcase/assets/header-DXPFmpUT.js +0 -1
- package/dist/showcase/assets/header-notifications-FsnCJLpe.js +0 -1
- package/dist/showcase/assets/heart-B4fOMIr6.js +0 -1
- package/dist/showcase/assets/hooks-DtMOMalj.js +0 -220
- package/dist/showcase/assets/house-hebmAxEE.js +0 -1
- package/dist/showcase/assets/icon-badge-DrZ5qGpa.js +0 -1
- package/dist/showcase/assets/icon-badge-JEug_P_U.js +0 -37
- package/dist/showcase/assets/image-CxNywgkb.js +0 -1
- package/dist/showcase/assets/inbox-DqAmGdDd.js +0 -1
- package/dist/showcase/assets/index-DujM0kEF.css +0 -2
- package/dist/showcase/assets/index-jD-KSiHu.js +0 -10
- package/dist/showcase/assets/inertValue-Dg9TwvOb.js +0 -1
- package/dist/showcase/assets/info-B5fZn_ZC.js +0 -1
- package/dist/showcase/assets/inline-stat-CklKufoA.js +0 -1
- package/dist/showcase/assets/inline-stat-Dep7oHIi.js +0 -15
- package/dist/showcase/assets/input-CkNgwwCs.js +0 -1
- package/dist/showcase/assets/input-DAPMRlKO.js +0 -1
- package/dist/showcase/assets/input-group-06D68uB6.js +0 -47
- package/dist/showcase/assets/input-group-Bq9aXQPG.js +0 -1
- package/dist/showcase/assets/inputs-C8G3y-zR.js +0 -155
- package/dist/showcase/assets/installation-BV5xOvoE.js +0 -134
- package/dist/showcase/assets/invoice-header-BcUxzT68.js +0 -36
- package/dist/showcase/assets/invoice-items-B42Jfxl7.js +0 -36
- package/dist/showcase/assets/invoice-mini-RJGdlErg.js +0 -14
- package/dist/showcase/assets/invoice-table--MdP6ysv.js +0 -30
- package/dist/showcase/assets/isSameDay-srttAIjD.js +0 -1
- package/dist/showcase/assets/isToday-BPub5Zvi.js +0 -1
- package/dist/showcase/assets/italic-1BNA_XlU.js +0 -1
- package/dist/showcase/assets/item-B9KyqUGa.js +0 -139
- package/dist/showcase/assets/item-DoIlPm6J.js +0 -1
- package/dist/showcase/assets/item-ffIfXEGd.js +0 -1
- package/dist/showcase/assets/kanban-Cfad3edR.js +0 -188
- package/dist/showcase/assets/key-round-J11Zc216.js +0 -1
- package/dist/showcase/assets/label-DqaB8ZB2.js +0 -1
- package/dist/showcase/assets/languages-D9UaP3QU.js +0 -1
- package/dist/showcase/assets/layers-QXZ9Jfej.js +0 -1
- package/dist/showcase/assets/layout-app-shell-CW1eRJmU.js +0 -608
- package/dist/showcase/assets/layout-auth-j4K6lveg.js +0 -790
- package/dist/showcase/assets/layout-containers-NclLtsV0.js +0 -101
- package/dist/showcase/assets/layout-header-B8AOTiwL.js +0 -203
- package/dist/showcase/assets/layout-page-DM79QHyW.js +0 -314
- package/dist/showcase/assets/layout-primitives-Dyop-WMt.js +0 -34
- package/dist/showcase/assets/layout-sidebar-uBNaHqjD.js +0 -224
- package/dist/showcase/assets/layout-users-BkhDiOOz.js +0 -117
- package/dist/showcase/assets/layout-workspace-C2hSimZW.js +0 -191
- package/dist/showcase/assets/lib-CDssULuD.js +0 -1
- package/dist/showcase/assets/list-checks-DA2jqXdm.js +0 -1
- package/dist/showcase/assets/lock-BDZLNQLR.js +0 -1
- package/dist/showcase/assets/lock-keyhole-CWYENd9O.js +0 -1
- package/dist/showcase/assets/mail-CCdaRmft.js +0 -1
- package/dist/showcase/assets/mail-check-DZF1VbCX.js +0 -1
- package/dist/showcase/assets/map-CDFEmmZH.js +0 -124
- package/dist/showcase/assets/map-pin-CdV-R6nt.js +0 -1
- package/dist/showcase/assets/media-library-BJyn1s9d.js +0 -699
- package/dist/showcase/assets/mention-inline-suggestions-DPO6FhXx.js +0 -1
- package/dist/showcase/assets/mentions-DtWHbcS6.js +0 -138
- package/dist/showcase/assets/menus-BmjngFE4.js +0 -171
- package/dist/showcase/assets/message-square-bM29txT3.js +0 -1
- package/dist/showcase/assets/metadata-list-DvYTAJri.js +0 -286
- package/dist/showcase/assets/metadata-list-xVUTVyy9.js +0 -1
- package/dist/showcase/assets/metric-BPNCh4eA.js +0 -1
- package/dist/showcase/assets/metric-bar-BX4sCMrM.js +0 -1
- package/dist/showcase/assets/metric-grid-IyHP3nmU.js +0 -1
- package/dist/showcase/assets/metric-trend-chip-Dih8eR17.js +0 -1
- package/dist/showcase/assets/metrics-analytics-bar-DK16RNMs.js +0 -44
- package/dist/showcase/assets/metrics-analytics-cards-Byyl13YT.js +0 -50
- package/dist/showcase/assets/metrics-comparison-DGHFMBL-.js +0 -76
- package/dist/showcase/assets/metrics-heatmap-Bl6C7i0j.js +0 -27
- package/dist/showcase/assets/metrics-inline-badge-Bz79zbNK.js +0 -17
- package/dist/showcase/assets/metrics-kpi-row-DzZ9dRFY.js +0 -31
- package/dist/showcase/assets/metrics-micro-grid-DyoQiuzr.js +0 -42
- package/dist/showcase/assets/metrics-overview-DoyHPEZw.js +0 -192
- package/dist/showcase/assets/metrics-stat-cards-B1b7NFqW.js +0 -54
- package/dist/showcase/assets/minus-BE2L5hVc.js +0 -1
- package/dist/showcase/assets/money-display-CXQ_8LfA.js +0 -1
- package/dist/showcase/assets/month-year-picker-ra8FEN8F.js +0 -1
- package/dist/showcase/assets/navigation-CFfVZQJ1.js +0 -231
- package/dist/showcase/assets/navigation-Da0MVkqr.js +0 -90
- package/dist/showcase/assets/navigation-extras-LpsdoXfx.js +0 -43
- package/dist/showcase/assets/onboarding-checklist-DPNatNOk.js +0 -119
- package/dist/showcase/assets/overflow-tab-bar-C0vTzcEY.js +0 -1
- package/dist/showcase/assets/overlays-Blmbun0J.js +0 -408
- package/dist/showcase/assets/overlays-t0joc10Y.js +0 -159
- package/dist/showcase/assets/overview-Ckq8vbOR.js +0 -184
- package/dist/showcase/assets/package-Cjod_a06.js +0 -1
- package/dist/showcase/assets/package-check-JRHaNnkl.js +0 -1
- package/dist/showcase/assets/page-9xr7xnuW.js +0 -1
- package/dist/showcase/assets/page-action-button-BRXnfsEx.js +0 -1
- package/dist/showcase/assets/page-header-Bdlxfn_9.js +0 -1
- package/dist/showcase/assets/pagination-CeaYhOvv.js +0 -42
- package/dist/showcase/assets/pagination-DdZZHvNF.js +0 -1
- package/dist/showcase/assets/paperclip-BRM-yXTB.js +0 -1
- package/dist/showcase/assets/password-input-1FVEugoO.js +0 -1
- package/dist/showcase/assets/pencil-DiG2dQ8F.js +0 -1
- package/dist/showcase/assets/phone-BREyNZN-.js +0 -1
- package/dist/showcase/assets/plus-CQcelTNc.js +0 -1
- package/dist/showcase/assets/popover-Czmwspmc.js +0 -1
- package/dist/showcase/assets/popover-menu-beuCaiLt.js +0 -1
- package/dist/showcase/assets/popover-uqk7myG2.js +0 -1
- package/dist/showcase/assets/products-DGNqIbLs.js +0 -423
- package/dist/showcase/assets/progress-D76Df908.js +0 -1
- package/dist/showcase/assets/progress-DjUprSDD.js +0 -18
- package/dist/showcase/assets/props-table-DoDq8Mvr.js +0 -1
- package/dist/showcase/assets/quote-BvGGgyJ0.js +0 -1
- package/dist/showcase/assets/receipt-rgnlMgyi.js +0 -1
- package/dist/showcase/assets/receipt-text-CBQrVlnU.js +0 -1
- package/dist/showcase/assets/refinement-guide-B_BpIMxm.js +0 -189
- package/dist/showcase/assets/refresh-cw-C-yHy6B7.js +0 -1
- package/dist/showcase/assets/resolveValueLabel-0bwEvIG-.js +0 -1
- package/dist/showcase/assets/resource-8f61BZ8t.js +0 -1
- package/dist/showcase/assets/resource-BEh6R0gu.js +0 -139
- package/dist/showcase/assets/resource-selector-card-DJwXY_Ms.js +0 -43
- package/dist/showcase/assets/rich-text-editor-D433iv0N.js +0 -143
- package/dist/showcase/assets/rich-text-editor-vTRfWsOK.js +0 -124
- package/dist/showcase/assets/rotate-ccw-JuE4H14F.js +0 -1
- package/dist/showcase/assets/route-eSu1bFNn.js +0 -1
- package/dist/showcase/assets/save-Bpjj-rBP.js +0 -1
- package/dist/showcase/assets/schema-form-DmOpxd96.js +0 -327
- package/dist/showcase/assets/scroll-area-B9OdCBy9.js +0 -32
- package/dist/showcase/assets/scroll-area-BH80l2As.js +0 -1
- package/dist/showcase/assets/section-BPNIPavy.js +0 -1
- package/dist/showcase/assets/select-BauiG1a3.js +0 -1
- package/dist/showcase/assets/select-CPopSr5c.js +0 -1
- package/dist/showcase/assets/send-DNCcBKXs.js +0 -1
- package/dist/showcase/assets/separator-BK0beCOv.js +0 -28
- package/dist/showcase/assets/separator-CKM9A-mm.js +0 -1
- package/dist/showcase/assets/settings-2-B8fz7JZB.js +0 -1
- package/dist/showcase/assets/settings-Cy2y3sQw.js +0 -1
- package/dist/showcase/assets/sheet-C7VWkXE1.js +0 -1
- package/dist/showcase/assets/shield-ClPev4gS.js +0 -1
- package/dist/showcase/assets/shield-alert-6XO5YZ5u.js +0 -1
- package/dist/showcase/assets/shield-check-DSfGVZq0.js +0 -1
- package/dist/showcase/assets/shopping-bag-DzMrGvpF.js +0 -1
- package/dist/showcase/assets/showcase-DuZaO6q9.js +0 -132
- package/dist/showcase/assets/sidebar-7y9EQYWf.js +0 -1
- package/dist/showcase/assets/sidebar.context-DUheJD8t.js +0 -1
- package/dist/showcase/assets/skeleton-Dgr8Vabr.js +0 -29
- package/dist/showcase/assets/skeleton-HSpErFqw.js +0 -1
- package/dist/showcase/assets/slider-B7f81APg.js +0 -1
- package/dist/showcase/assets/smart-card-p97LLZCW.js +0 -1
- package/dist/showcase/assets/sonner-CWazrN19.js +0 -22
- package/dist/showcase/assets/sortable.esm-uufol7Mz.js +0 -5
- package/dist/showcase/assets/sparkles-Z4V23xKK.js +0 -1
- package/dist/showcase/assets/spinner-BUgjAjWE.js +0 -49
- package/dist/showcase/assets/spinner-CXu7z8-j.js +0 -1
- package/dist/showcase/assets/spinner-DCwR0mnD.js +0 -30
- package/dist/showcase/assets/square-pen-jwp_OWMQ.js +0 -1
- package/dist/showcase/assets/stacked-avatars-CHEpTotO.js +0 -1
- package/dist/showcase/assets/star-Ck8Lg5hm.js +0 -1
- package/dist/showcase/assets/startOfDay-BzULZHy4.js +0 -1
- package/dist/showcase/assets/styles-CNYitflH.js +0 -1
- package/dist/showcase/assets/suggestions-CSF9MlKl.js +0 -126
- package/dist/showcase/assets/switch-BX9KSLIF.js +0 -1
- package/dist/showcase/assets/switch-Bn0WaWa9.js +0 -1
- package/dist/showcase/assets/sync-BuKBnqWW.js +0 -124
- package/dist/showcase/assets/table-DNJcLaud.js +0 -686
- package/dist/showcase/assets/table-NfpOWGsG.js +0 -1
- package/dist/showcase/assets/table-actions-Ci9Yszp0.js +0 -1
- package/dist/showcase/assets/tabs-CYNFQdIr.js +0 -19
- package/dist/showcase/assets/tabs-Cm_p6znb.js +0 -1
- package/dist/showcase/assets/tags-input-DE4QZqS_.js +0 -1
- package/dist/showcase/assets/text-button-D9llh4pU.js +0 -1
- package/dist/showcase/assets/text-link-ZT6QGJOL.js +0 -1
- package/dist/showcase/assets/textarea-CgcHuGVq.js +0 -1
- package/dist/showcase/assets/textarea-D2uT_GJt.js +0 -1
- package/dist/showcase/assets/timelines-BEFO7tJ0.js +0 -200
- package/dist/showcase/assets/toggle-group-oYpa59lN.js +0 -1
- package/dist/showcase/assets/toggles-BL93YmQo.js +0 -71
- package/dist/showcase/assets/toggles-group-BG-xiQCY.js +0 -32
- package/dist/showcase/assets/tooltip-BMI7zHwP.js +0 -31
- package/dist/showcase/assets/trash-2-CtRtVsCy.js +0 -1
- package/dist/showcase/assets/trending-up-2NQ-P8vB.js +0 -1
- package/dist/showcase/assets/truck-Cl0nyN_j.js +0 -1
- package/dist/showcase/assets/typography-C7pCPhg7.js +0 -223
- package/dist/showcase/assets/ui-badge-BvmuMzSq.js +0 -28
- package/dist/showcase/assets/ui-card-B7ziOMAn.js +0 -30
- package/dist/showcase/assets/ui-table-BEFHakBU.js +0 -42
- package/dist/showcase/assets/upload-tray-CMKqTtEp.js +0 -138
- package/dist/showcase/assets/use-layout-link-nEU6ctSs.js +0 -1
- package/dist/showcase/assets/useAnchoredPopupScrollLock-B1xyKMh7.js +0 -1
- package/dist/showcase/assets/useAriaLabelledBy-BMlFgz-H.js +0 -1
- package/dist/showcase/assets/useCollapsiblePanel-BEzH6TC2.js +0 -1
- package/dist/showcase/assets/useCompositeItem-CIuww7-p.js +0 -1
- package/dist/showcase/assets/useCompositeListItem-PrMTh4tz.js +0 -1
- package/dist/showcase/assets/useLabelableId-BBLkeLGr.js +0 -1
- package/dist/showcase/assets/useOpenInteractionType-CW0quo3l.js +0 -1
- package/dist/showcase/assets/useRender-6NNMHJJU.js +0 -1
- package/dist/showcase/assets/useTriggerFocusGuards-DEza_iee.js +0 -1
- package/dist/showcase/assets/useValueChanged-BmWIb3SN.js +0 -1
- package/dist/showcase/assets/user-BDIP5UPS.js +0 -1
- package/dist/showcase/assets/user-plus-BCqHFh2h.js +0 -1
- package/dist/showcase/assets/users-Bh7xGRX2.js +0 -1
- package/dist/showcase/assets/vendor-profile-BlYcRbPI.js +0 -37
- package/dist/showcase/assets/video-BucshqNW.js +0 -1
- package/dist/showcase/assets/wrench-DQvhyTEb.js +0 -1
- package/dist/showcase/assets/x-DyuS4YRT.js +0 -1
- package/dist/showcase/assets/zap-Dpn8_pnQ.js +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rich-text-editor-BRpcNkj1.js","names":[],"sources":["../../src/components/features/rich-text-editor/partials/rich-text-editor-toolbar.tsx","../../src/components/features/rich-text-editor/rich-text-editor.strings.ts","../../src/components/features/rich-text-editor/partials/caret-helpers.ts","../../src/components/features/rich-text-editor/partials/counts-footer.tsx","../../src/components/features/rich-text-editor/partials/html-helpers.ts","../../src/components/features/rich-text-editor/partials/rich-text-editor-tiptap.tsx","../../src/components/features/rich-text-editor/partials/rich-text-editor-fallback.tsx","../../src/components/features/rich-text-editor/rich-text-editor.tsx"],"sourcesContent":["import { Code2 } from 'lucide-react';\nimport type { ReactNode } from 'react';\n\nimport { Button } from '@/components/base/buttons/button';\n\nimport type { RichTextEditorStrings } from '../rich-text-editor.strings';\nimport type {\n\tRichTextEditorToolbarItem,\n\tToolbarButtonConfig,\n} from '../rich-text-editor.types';\n\nexport interface RichTextEditorToolbarProps {\n\tbuttons: ToolbarButtonConfig[];\n\textraToolbarItems?: ReadonlyArray<RichTextEditorToolbarItem>;\n\thideSourceToggle?: boolean;\n\tsourceMode: boolean;\n\ttoggleSourceMode: () => void;\n\tdisabled?: boolean;\n\t/**\n\t * The TipTap variant disables built-in buttons until the editor instance\n\t * is ready; the fallback variant simply marks them disabled. This flag\n\t * lets callers force the disabled state without re-deriving it per button.\n\t */\n\thasEditor?: boolean;\n\ttoolbarTrailing?: ReactNode;\n\tstrings: RichTextEditorStrings;\n}\n\nexport function RichTextEditorToolbar({\n\tbuttons,\n\textraToolbarItems,\n\thideSourceToggle = false,\n\tsourceMode,\n\ttoggleSourceMode,\n\tdisabled = false,\n\thasEditor = true,\n\ttoolbarTrailing,\n\tstrings,\n}: RichTextEditorToolbarProps) {\n\tconst hasExtras = (extraToolbarItems?.length ?? 0) > 0;\n\n\treturn (\n\t\t<div className=\"border-border flex flex-wrap items-center gap-1 border-b p-1.5\">\n\t\t\t{buttons.map((button) => {\n\t\t\t\tconst Icon = button.icon;\n\t\t\t\tconst isActive = button.isActive();\n\n\t\t\t\treturn (\n\t\t\t\t\t<Button\n\t\t\t\t\t\tkey={button.id}\n\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\tvariant={isActive ? 'primary' : 'secondary'}\n\t\t\t\t\t\tbuttonStyle={isActive ? 'solid' : 'ghost'}\n\t\t\t\t\t\tsize=\"icon-small\"\n\t\t\t\t\t\tonClick={button.run}\n\t\t\t\t\t\tdisabled={disabled || !hasEditor || sourceMode || button.disabled}\n\t\t\t\t\t\taria-label={button.label}\n\t\t\t\t\t\ttitle={button.label}\n\t\t\t\t\t>\n\t\t\t\t\t\t<Icon className=\"h-3.5 w-3.5\" />\n\t\t\t\t\t</Button>\n\t\t\t\t);\n\t\t\t})}\n\n\t\t\t{!hideSourceToggle && (\n\t\t\t\t<>\n\t\t\t\t\t<div className=\"bg-border mx-1 h-4 w-px\" />\n\n\t\t\t\t\t<Button\n\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\tvariant={sourceMode ? 'primary' : 'secondary'}\n\t\t\t\t\t\tbuttonStyle={sourceMode ? 'solid' : 'ghost'}\n\t\t\t\t\t\tsize=\"icon-small\"\n\t\t\t\t\t\tonClick={toggleSourceMode}\n\t\t\t\t\t\tdisabled={disabled || !hasEditor}\n\t\t\t\t\t\taria-label={strings.toolbar.sourceCode}\n\t\t\t\t\t\ttitle={strings.toolbar.sourceCode}\n\t\t\t\t\t>\n\t\t\t\t\t\t<Code2 className=\"h-3.5 w-3.5\" />\n\t\t\t\t\t</Button>\n\t\t\t\t</>\n\t\t\t)}\n\n\t\t\t{hasExtras && (\n\t\t\t\t<>\n\t\t\t\t\t<div className=\"bg-border mx-1 h-4 w-px\" />\n\t\t\t\t\t{extraToolbarItems?.map((item) => {\n\t\t\t\t\t\tconst Icon = item.icon;\n\t\t\t\t\t\tconst isActive = item.isActive?.() ?? false;\n\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\t\tkey={item.id}\n\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\tvariant={isActive ? 'primary' : 'secondary'}\n\t\t\t\t\t\t\t\tbuttonStyle={isActive ? 'solid' : 'ghost'}\n\t\t\t\t\t\t\t\tsize=\"icon-small\"\n\t\t\t\t\t\t\t\tonClick={item.onClick}\n\t\t\t\t\t\t\t\tdisabled={disabled || !hasEditor || sourceMode || item.disabled}\n\t\t\t\t\t\t\t\taria-label={item.label}\n\t\t\t\t\t\t\t\ttitle={item.label}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<Icon className=\"h-3.5 w-3.5\" />\n\t\t\t\t\t\t\t</Button>\n\t\t\t\t\t\t);\n\t\t\t\t\t})}\n\t\t\t\t</>\n\t\t\t)}\n\n\t\t\t{!!toolbarTrailing && (\n\t\t\t\t<div className=\"ml-auto flex items-center gap-1\">{toolbarTrailing}</div>\n\t\t\t)}\n\t\t</div>\n\t);\n}\n\nRichTextEditorToolbar.displayName = 'RichTextEditorToolbar';\n","/**\n * Default user-facing strings for `<RichTextEditor>`.\n *\n * Consumers wire backend i18n at the call site:\n *\n * <RichTextEditor strings={{ toolbar: { bold: t('editor.bold') } }} … />\n */\n\nexport interface RichTextEditorStrings {\n\t/** Accessible label for the editable rich-text surface. */\n\teditorLabel: string;\n\t/** Accessible label for the HTML source textarea. */\n\tsourceLabel: string;\n\t/** Toolbar button labels (used for `aria-label` and tooltip `title`). */\n\ttoolbar: {\n\t\tbold: string;\n\t\titalic: string;\n\t\tstrike: string;\n\t\tbulletList: string;\n\t\torderedList: string;\n\t\tblockquote: string;\n\t\tundo: string;\n\t\tredo: string;\n\t\tsourceCode: string;\n\t};\n\t/** Footer count labels — `{n}` is replaced with the count. */\n\tcounts: {\n\t\tcharacters: string;\n\t\twords: string;\n\t\tmax: string;\n\t};\n}\n\nexport const defaultRichTextEditorStrings: RichTextEditorStrings = {\n\teditorLabel: 'Rich text editor',\n\tsourceLabel: 'HTML source',\n\ttoolbar: {\n\t\tbold: 'Bold',\n\t\titalic: 'Italic',\n\t\tstrike: 'Strike',\n\t\tbulletList: 'Bullet list',\n\t\torderedList: 'Ordered list',\n\t\tblockquote: 'Quote',\n\t\tundo: 'Undo',\n\t\tredo: 'Redo',\n\t\tsourceCode: 'Source code',\n\t},\n\tcounts: {\n\t\tcharacters: 'characters',\n\t\twords: 'words',\n\t\tmax: 'max',\n\t},\n};\n","/**\n * Caret-introspection helpers used by `<RichTextEditor>` to expose the\n * text before the caret and replace a leading run of characters with\n * inline HTML — the building blocks for `@`-mention chips and similar\n * inline triggers.\n */\nimport type { RichTextCaretContext, TiptapEditor } from '../rich-text-editor.types';\n\n/**\n * Read the current selection's caret context.\n *\n * Walks back from the caret through the current text node and any\n * preceding sibling text nodes inside the same block-level container\n * (paragraph / list-item / heading) collecting plain text. Returns the\n * accumulated text plus the caret's bounding rect when available.\n *\n * Returns `null` when there is no live selection or the selection isn't\n * a text caret inside a contenteditable.\n */\nexport function readCaretContext(): RichTextCaretContext | null {\n\tif (typeof window === 'undefined') return null;\n\tconst sel = window.getSelection();\n\tif (!sel || sel.rangeCount === 0) return null;\n\tconst range = sel.getRangeAt(0);\n\tif (!range.collapsed) return null;\n\n\tconst startNode = range.startContainer;\n\tconst startOffset = range.startOffset;\n\n\tlet block: Node | null = startNode;\n\twhile (block && block.nodeType !== Node.ELEMENT_NODE) {\n\t\tblock = block.parentNode;\n\t}\n\tif (!block) return null;\n\tconst editable =\n\t\t(block as Element).closest('[contenteditable=\"true\"]') ??\n\t\t(block as Element).closest('.ProseMirror');\n\tif (!editable) return null;\n\n\tlet text = '';\n\tif (startNode.nodeType === Node.TEXT_NODE) {\n\t\ttext = (startNode.textContent ?? '').slice(0, startOffset);\n\t}\n\n\tlet cursor: Node | null = startNode;\n\twhile (cursor && cursor !== editable && cursor !== block) {\n\t\tlet prev: Node | null = cursor.previousSibling;\n\t\twhile (prev) {\n\t\t\ttext = (prev.textContent ?? '') + text;\n\t\t\tprev = prev.previousSibling;\n\t\t}\n\t\tcursor = cursor.parentNode;\n\t\tif (cursor && (cursor as Element).matches?.('p, li, h1, h2, h3, h4, h5, h6, blockquote')) {\n\t\t\tbreak;\n\t\t}\n\t}\n\n\tlet rect: RichTextCaretContext['rect'];\n\tconst r = range.getBoundingClientRect();\n\tif (r && (r.top || r.left || r.right || r.bottom)) {\n\t\trect = { top: r.top, left: r.left, bottom: r.bottom, right: r.right };\n\t}\n\n\treturn { textBefore: text, rect };\n}\n\n/**\n * Extend the selection backwards by `length` characters, then insert\n * `html`. The selection extension means `editor.insertContent` (or the\n * fallback's `range.deleteContents()` + insert) replaces the trigger\n * range with the chip atomically — no manual text-content mutation, no\n * timing races between \"delete\" and \"insert\".\n */\nexport function replaceBeforeCaret(\n\teditor: TiptapEditor | null,\n\tlength: number,\n\thtml: string,\n\tnotifyChange: (next: string) => void,\n): void {\n\tif (typeof window === 'undefined') return;\n\tconst sel = window.getSelection();\n\tif (!sel || sel.rangeCount === 0) return;\n\tconst caret = sel.getRangeAt(0);\n\tif (!caret.collapsed) return;\n\n\tlet remaining = length;\n\tlet startNode: Node = caret.startContainer;\n\tlet startOffset = caret.startOffset;\n\n\twhile (remaining > 0) {\n\t\tif (startNode.nodeType === Node.TEXT_NODE) {\n\t\t\tconst take = Math.min(startOffset, remaining);\n\t\t\tstartOffset -= take;\n\t\t\tremaining -= take;\n\t\t\tif (remaining === 0) break;\n\t\t}\n\t\tconst prev = previousTextNode(startNode);\n\t\tif (!prev) break;\n\t\tstartNode = prev;\n\t\tstartOffset = prev.textContent?.length ?? 0;\n\t}\n\n\tconst range = document.createRange();\n\trange.setStart(startNode, startOffset);\n\trange.setEnd(caret.endContainer, caret.endOffset);\n\tsel.removeAllRanges();\n\tsel.addRange(range);\n\n\tif (editor) {\n\t\teditor.chain().focus().insertContent(html).run();\n\t\tnotifyChange(editor.getHTML());\n\t\treturn;\n\t}\n\n\trange.deleteContents();\n\tconst fragment = document.createRange().createContextualFragment(html);\n\trange.insertNode(fragment);\n\tsel.collapseToEnd();\n\tconst editable =\n\t\t(startNode as Element | null)?.parentElement?.closest?.('[contenteditable=\"true\"]') ?? null;\n\tif (editable) notifyChange((editable as HTMLElement).innerHTML);\n}\n\nexport function insertHtmlIntoEditable(editable: HTMLElement | null, html: string): void {\n\tif (typeof window === 'undefined' || !editable) return;\n\teditable.focus();\n\n\tconst sel = window.getSelection();\n\tif (!sel || sel.rangeCount === 0) {\n\t\teditable.insertAdjacentHTML('beforeend', html);\n\t\treturn;\n\t}\n\n\tconst range = sel.getRangeAt(0);\n\tif (!editable.contains(range.commonAncestorContainer)) {\n\t\teditable.insertAdjacentHTML('beforeend', html);\n\t\treturn;\n\t}\n\n\trange.deleteContents();\n\tconst fragment = document.createRange().createContextualFragment(html);\n\trange.insertNode(fragment);\n\trange.collapse(false);\n\tsel.removeAllRanges();\n\tsel.addRange(range);\n}\n\nfunction previousTextNode(node: Node): Node | null {\n\tlet current: Node | null = node;\n\twhile (current) {\n\t\tif (current.previousSibling) {\n\t\t\tcurrent = current.previousSibling;\n\t\t\twhile (current && current.lastChild) {\n\t\t\t\tcurrent = current.lastChild;\n\t\t\t}\n\t\t\tif (current && current.nodeType === Node.TEXT_NODE) return current;\n\t\t\tcontinue;\n\t\t}\n\t\tcurrent = current.parentNode;\n\t\tif (!current || (current as Element).matches?.('p, li, h1, h2, h3, h4, h5, h6, blockquote, [contenteditable=\"true\"]')) {\n\t\t\treturn null;\n\t\t}\n\t}\n\treturn null;\n}\n","import { Text } from '@/components/typography';\nimport { cn } from '@/lib/utils';\n\nimport type { RichTextEditorStrings } from '../rich-text-editor.strings';\nimport type { TiptapEditor } from '../rich-text-editor.types';\n\ninterface CountsFooterTextProps {\n\ttext: string;\n\tmaxLength?: number;\n\tstrings: RichTextEditorStrings;\n}\n\nexport function CountsFooterText({ text, maxLength, strings }: CountsFooterTextProps) {\n\tconst chars = text.length;\n\tconst words = text.trim().length > 0 ? text.trim().split(/\\s+/).length : 0;\n\tconst overLimit = typeof maxLength === 'number' && chars > maxLength;\n\n\treturn (\n\t\t<div className=\"border-border flex items-center justify-end gap-3 border-t px-3 py-1.5\">\n\t\t\t<Text\n\t\t\t\ttag=\"span\"\n\t\t\t\tsize=\"xs\"\n\t\t\t\ttype={overLimit ? 'error' : 'secondary'}\n\t\t\t\tweight={overLimit ? 'medium' : 'regular'}\n\t\t\t\tclassName={cn('tabular-nums')}\n\t\t\t>\n\t\t\t\t{chars}\n\t\t\t\t{typeof maxLength === 'number' ? ` / ${maxLength}` : ''} {strings.counts.characters}\n\t\t\t</Text>\n\t\t\t<Text tag=\"span\" size=\"xs\" type=\"secondary\" className=\"tabular-nums\">\n\t\t\t\t{words} {strings.counts.words}\n\t\t\t</Text>\n\t\t</div>\n\t);\n}\n\nCountsFooterText.displayName = 'CountsFooterText';\n\ninterface CountsFooterProps {\n\teditor: TiptapEditor;\n\tsourceMode: boolean;\n\tsourceValue: string;\n\tmaxLength?: number;\n\tstrings: RichTextEditorStrings;\n}\n\nexport function CountsFooter({\n\teditor,\n\tsourceMode,\n\tsourceValue,\n\tmaxLength,\n\tstrings,\n}: CountsFooterProps) {\n\tconst text = sourceMode\n\t\t? sourceValue.replace(/<[^>]*>/g, '')\n\t\t: (editor?.getText() ?? '');\n\n\treturn <CountsFooterText text={text} maxLength={maxLength} strings={strings} />;\n}\n\nCountsFooter.displayName = 'CountsFooter';\n","/**\n * Plain HTML normalization shared by the TipTap and contenteditable\n * fallback editors. Keeping these out of the React tree means the\n * editor partials stay focused on rendering.\n */\n\nexport function normalizeHtml(value: string): string {\n\tconst trimmed = value.trim();\n\n\tif (trimmed === '' || trimmed === '<p></p>' || trimmed === '<p><br></p>') {\n\t\treturn '';\n\t}\n\n\treturn trimmed;\n}\n\nexport function toEditorContent(value: string): string {\n\tconst normalized = normalizeHtml(value);\n\treturn normalized === '' ? '<p></p>' : normalized;\n}\n","import {\n\tforwardRef,\n\tuseCallback,\n\tuseEffect,\n\tuseImperativeHandle,\n\tuseMemo,\n\tuseRef,\n\tuseState,\n} from 'react';\nimport {\n\tBold,\n\tItalic,\n\tList,\n\tListOrdered,\n\tQuote,\n\tRedo2,\n\tStrikethrough,\n\tUndo2,\n} from 'lucide-react';\nimport * as TiptapReact from '@tiptap/react';\nimport * as StarterKitModule from '@tiptap/starter-kit';\n\nimport { useStrings } from '@/lib/strings';\nimport { cn } from '@/lib/utils';\n\nimport { defaultRichTextEditorStrings } from '../rich-text-editor.strings';\nimport type {\n\tRichTextEditorHandle,\n\tRichTextEditorProps,\n\tToolbarButtonConfig,\n} from '../rich-text-editor.types';\nimport { readCaretContext, replaceBeforeCaret } from './caret-helpers';\nimport { CountsFooter } from './counts-footer';\nimport { normalizeHtml, toEditorContent } from './html-helpers';\nimport { RichTextEditorToolbar } from './rich-text-editor-toolbar';\n\nconst EditorContent = TiptapReact.EditorContent;\nconst useTiptapEditor = TiptapReact.useEditor;\nconst StarterKit =\n\t'default' in StarterKitModule ? StarterKitModule.default : StarterKitModule;\n\nexport const TiptapRichTextEditor = forwardRef<RichTextEditorHandle, RichTextEditorProps>(function TiptapRichTextEditor(\n\t{\n\t\tvalue,\n\t\tonChange,\n\t\tplaceholder,\n\t\tcompact = false,\n\t\tminHeight,\n\t\tmaxHeight,\n\t\tdisabled = false,\n\t\tshowCounts = false,\n\t\tmaxLength,\n\t\textraToolbarItems,\n\t\ttoolbarTrailing,\n\t\tfooterSlot,\n\t\thideSourceToggle = false,\n\t\tautoFocus = false,\n\t\tclassName,\n\t\tonCaretChange,\n\t\tstrings: stringsProp,\n\t},\n\tref,\n) {\n\tconst strings = useStrings(defaultRichTextEditorStrings, stringsProp);\n\tconst [isFocused, setIsFocused] = useState(false);\n\tconst [sourceMode, setSourceMode] = useState(false);\n\tconst [sourceValue, setSourceValue] = useState('');\n\tconst isFocusedRef = useRef(false);\n\tconst externalValueRef = useRef<string>(normalizeHtml(value));\n\tconst onCaretChangeRef = useRef(onCaretChange);\n\tonCaretChangeRef.current = onCaretChange;\n\n\tconst editor = useTiptapEditor({\n\t\textensions: [StarterKit],\n\t\tcontent: toEditorContent(value),\n\t\teditable: !disabled,\n\t\timmediatelyRender: false,\n\t\tautofocus: autoFocus ? 'end' : false,\n\t\tonFocus: () => {\n\t\t\tisFocusedRef.current = true;\n\t\t\tsetIsFocused(true);\n\t\t},\n\t\tonBlur: () => {\n\t\t\tisFocusedRef.current = false;\n\t\t\tsetIsFocused(false);\n\t\t},\n\t\tonUpdate: ({ editor: currentEditor }: { editor: { getHTML: () => string } }) => {\n\t\t\tconst html = normalizeHtml(currentEditor.getHTML());\n\t\t\tif (!isFocusedRef.current) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (html !== externalValueRef.current) {\n\t\t\t\texternalValueRef.current = html;\n\t\t\t\tonChange(html);\n\t\t\t}\n\n\t\t\tonCaretChangeRef.current?.();\n\t\t},\n\t\teditorProps: {\n\t\t\tattributes: {\n\t\t\t\trole: 'textbox',\n\t\t\t\t'aria-label': strings.editorLabel,\n\t\t\t\t'aria-multiline': 'true',\n\t\t\t\tclass: 'prose prose-sm prose-p:my-0.5 prose-p:leading-relaxed prose-headings:my-1 prose-ul:my-1 prose-ol:my-1 prose-li:my-0.5 max-w-none px-3 py-2 text-sm focus-visible:outline-none dark:prose-invert',\n\t\t\t},\n\t\t},\n\t});\n\n\tuseEffect(() => {\n\t\tif (!editor) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst current = normalizeHtml(editor.getHTML());\n\t\tconst next = normalizeHtml(value);\n\t\texternalValueRef.current = next;\n\n\t\tif (current !== next) {\n\t\t\teditor.commands.setContent(toEditorContent(next), { emitUpdate: false });\n\t\t}\n\t}, [editor, value]);\n\n\tuseEffect(() => {\n\t\tif (!editor) {\n\t\t\treturn;\n\t\t}\n\n\t\teditor.setEditable(!disabled);\n\t}, [disabled, editor]);\n\n\tuseEffect(() => {\n\t\tif (typeof document === 'undefined') return;\n\t\tconst handler = () => {\n\t\t\tif (!isFocusedRef.current) return;\n\t\t\tonCaretChangeRef.current?.();\n\t\t};\n\t\tdocument.addEventListener('selectionchange', handler);\n\t\treturn () => document.removeEventListener('selectionchange', handler);\n\t}, []);\n\n\tuseImperativeHandle(\n\t\tref,\n\t\t() => ({\n\t\t\tfocus: () => {\n\t\t\t\teditor?.chain().focus().run();\n\t\t\t},\n\t\t\tgetHTML: () => normalizeHtml(editor?.getHTML() ?? ''),\n\t\t\tsetHTML: (html: string) => {\n\t\t\t\tconst next = normalizeHtml(html);\n\t\t\t\texternalValueRef.current = next;\n\t\t\t\teditor?.commands.setContent(toEditorContent(next), { emitUpdate: false });\n\t\t\t\tonChange(next);\n\t\t\t},\n\t\t\tinsertHTML: (html: string) => {\n\t\t\t\tif (!editor) return;\n\t\t\t\teditor.chain().focus().insertContent(html).run();\n\t\t\t},\n\t\t\tisEmpty: () => normalizeHtml(editor?.getHTML() ?? '') === '',\n\t\t\tclear: () => {\n\t\t\t\texternalValueRef.current = '';\n\t\t\t\teditor?.commands.setContent('<p></p>', { emitUpdate: false });\n\t\t\t\tonChange('');\n\t\t\t},\n\t\t\tgetCaretContext: () => readCaretContext(),\n\t\t\treplaceBeforeCaret: (length: number, html: string) => {\n\t\t\t\treplaceBeforeCaret(editor, length, html, (next) => {\n\t\t\t\t\texternalValueRef.current = normalizeHtml(next);\n\t\t\t\t\tonChange(externalValueRef.current);\n\t\t\t\t});\n\t\t\t},\n\t\t}),\n\t\t[editor, onChange],\n\t);\n\n\tconst contentStyle = useMemo(\n\t\t() => ({\n\t\t\tminHeight: minHeight ?? (compact ? '2rem' : '12rem'),\n\t\t\t...(maxHeight ? { maxHeight, overflowY: 'auto' as const } : {}),\n\t\t}),\n\t\t[compact, maxHeight, minHeight],\n\t);\n\n\tconst toggleSourceMode = useCallback(() => {\n\t\tif (!editor) return;\n\n\t\tif (sourceMode) {\n\t\t\tconst html = toEditorContent(sourceValue);\n\t\t\teditor.commands.setContent(html, { emitUpdate: false });\n\t\t\tconst normalized = normalizeHtml(sourceValue);\n\t\t\texternalValueRef.current = normalized;\n\t\t\tonChange(normalized);\n\t\t\tsetSourceMode(false);\n\t\t} else {\n\t\t\tsetSourceValue(editor.getHTML());\n\t\t\tsetSourceMode(true);\n\t\t}\n\t}, [editor, onChange, sourceMode, sourceValue]);\n\n\tconst handleSourceChange = useCallback(\n\t\t(e: React.ChangeEvent<HTMLTextAreaElement>) => {\n\t\t\tconst next = e.target.value;\n\t\t\tsetSourceValue(next);\n\t\t\tconst normalized = normalizeHtml(next);\n\t\t\texternalValueRef.current = normalized;\n\t\t\tonChange(normalized);\n\t\t},\n\t\t[onChange],\n\t);\n\n\tconst toolbarButtons = useMemo<ToolbarButtonConfig[]>(\n\t\t() => [\n\t\t\t{\n\t\t\t\tid: 'bold',\n\t\t\t\ticon: Bold,\n\t\t\t\tlabel: strings.toolbar.bold,\n\t\t\t\tisActive: () => Boolean(editor?.isActive('bold')),\n\t\t\t\trun: () => editor?.chain().focus().toggleBold().run(),\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: 'italic',\n\t\t\t\ticon: Italic,\n\t\t\t\tlabel: strings.toolbar.italic,\n\t\t\t\tisActive: () => Boolean(editor?.isActive('italic')),\n\t\t\t\trun: () => editor?.chain().focus().toggleItalic().run(),\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: 'strike',\n\t\t\t\ticon: Strikethrough,\n\t\t\t\tlabel: strings.toolbar.strike,\n\t\t\t\tisActive: () => Boolean(editor?.isActive('strike')),\n\t\t\t\trun: () => editor?.chain().focus().toggleStrike().run(),\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: 'bullet-list',\n\t\t\t\ticon: List,\n\t\t\t\tlabel: strings.toolbar.bulletList,\n\t\t\t\tisActive: () => Boolean(editor?.isActive('bulletList')),\n\t\t\t\trun: () => editor?.chain().focus().toggleBulletList().run(),\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: 'ordered-list',\n\t\t\t\ticon: ListOrdered,\n\t\t\t\tlabel: strings.toolbar.orderedList,\n\t\t\t\tisActive: () => Boolean(editor?.isActive('orderedList')),\n\t\t\t\trun: () => editor?.chain().focus().toggleOrderedList().run(),\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: 'blockquote',\n\t\t\t\ticon: Quote,\n\t\t\t\tlabel: strings.toolbar.blockquote,\n\t\t\t\tisActive: () => Boolean(editor?.isActive('blockquote')),\n\t\t\t\trun: () => editor?.chain().focus().toggleBlockquote().run(),\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: 'undo',\n\t\t\t\ticon: Undo2,\n\t\t\t\tlabel: strings.toolbar.undo,\n\t\t\t\tisActive: () => false,\n\t\t\t\trun: () => editor?.chain().focus().undo().run(),\n\t\t\t\tdisabled: !editor?.can().chain().focus().undo().run(),\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: 'redo',\n\t\t\t\ticon: Redo2,\n\t\t\t\tlabel: strings.toolbar.redo,\n\t\t\t\tisActive: () => false,\n\t\t\t\trun: () => editor?.chain().focus().redo().run(),\n\t\t\t\tdisabled: !editor?.can().chain().focus().redo().run(),\n\t\t\t},\n\t\t],\n\t\t[editor, strings],\n\t);\n\n\tconst countsFooter =\n\t\tshowCounts && editor ? (\n\t\t\t<CountsFooter\n\t\t\t\teditor={editor}\n\t\t\t\tsourceMode={sourceMode}\n\t\t\t\tsourceValue={sourceValue}\n\t\t\t\tmaxLength={maxLength}\n\t\t\t\tstrings={strings}\n\t\t\t/>\n\t\t) : null;\n\n\tconst placeholderText = typeof placeholder === 'string' ? placeholder : '';\n\tconst showPlaceholder =\n\t\tplaceholderText.length > 0 && !isFocused && Boolean(editor?.isEmpty);\n\tconst placeholderNode = showPlaceholder ? (\n\t\t<span className=\"text-muted-foreground pointer-events-none absolute left-3 top-2 text-sm\">\n\t\t\t{placeholderText}\n\t\t</span>\n\t) : null;\n\n\treturn (\n\t\t<div\n\t\t\tclassName={cn(\n\t\t\t\t'border-input bg-background rounded-md border',\n\t\t\t\tdisabled && 'opacity-70',\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t>\n\t\t\t<RichTextEditorToolbar\n\t\t\t\tbuttons={toolbarButtons}\n\t\t\t\textraToolbarItems={extraToolbarItems}\n\t\t\t\thideSourceToggle={hideSourceToggle}\n\t\t\t\tsourceMode={sourceMode}\n\t\t\t\ttoggleSourceMode={toggleSourceMode}\n\t\t\t\tdisabled={disabled}\n\t\t\t\thasEditor={Boolean(editor)}\n\t\t\t\ttoolbarTrailing={toolbarTrailing}\n\t\t\t\tstrings={strings}\n\t\t\t/>\n\n\t\t\t{sourceMode ? (\n\t\t\t\t<textarea\n\t\t\t\t\taria-label={strings.sourceLabel}\n\t\t\t\t\tvalue={sourceValue}\n\t\t\t\t\tonChange={handleSourceChange}\n\t\t\t\t\tdisabled={disabled}\n\t\t\t\t\tspellCheck={false}\n\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t'bg-muted/50 w-full resize-y px-3 py-2 font-mono text-xs leading-relaxed focus-visible:outline-none',\n\t\t\t\t\t\tdisabled && 'cursor-not-allowed',\n\t\t\t\t\t)}\n\t\t\t\t\tstyle={contentStyle}\n\t\t\t\t/>\n\t\t\t) : (\n\t\t\t\t<div className=\"relative\" style={contentStyle}>\n\t\t\t\t\t{placeholderNode}\n\n\t\t\t\t\t<EditorContent\n\t\t\t\t\t\teditor={editor}\n\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t'h-full',\n\t\t\t\t\t\t\t'[&_.ProseMirror]:h-full',\n\t\t\t\t\t\t\t'[&_.ProseMirror]:min-h-full',\n\t\t\t\t\t\t\t'[&_.ProseMirror]:outline-none',\n\t\t\t\t\t\t)}\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t)}\n\n\t\t\t{!!footerSlot && (\n\t\t\t\t<div className=\"px-3 pb-2 pt-1\">{footerSlot}</div>\n\t\t\t)}\n\n\t\t\t{countsFooter}\n\t\t</div>\n\t);\n});\n\nTiptapRichTextEditor.displayName = 'TiptapRichTextEditor';\n\nexport const hasTiptapRuntime =\n\ttypeof EditorContent === 'function' &&\n\ttypeof useTiptapEditor === 'function' &&\n\ttypeof StarterKit === 'object' &&\n\tStarterKit !== null;\n","import {\n\tforwardRef,\n\tuseCallback,\n\tuseEffect,\n\tuseImperativeHandle,\n\tuseMemo,\n\tuseRef,\n\tuseState,\n} from 'react';\nimport {\n\tBold,\n\tItalic,\n\tList,\n\tListOrdered,\n\tQuote,\n\tRedo2,\n\tStrikethrough,\n\tUndo2,\n} from 'lucide-react';\n\nimport { useStrings } from '@/lib/strings';\nimport { cn } from '@/lib/utils';\n\nimport { defaultRichTextEditorStrings } from '../rich-text-editor.strings';\nimport type {\n\tRichTextEditorHandle,\n\tRichTextEditorProps,\n\tToolbarButtonConfig,\n} from '../rich-text-editor.types';\nimport {\n\tinsertHtmlIntoEditable,\n\treadCaretContext,\n\treplaceBeforeCaret,\n} from './caret-helpers';\nimport { CountsFooterText } from './counts-footer';\nimport { normalizeHtml, toEditorContent } from './html-helpers';\nimport { RichTextEditorToolbar } from './rich-text-editor-toolbar';\n\n/**\n * Fallback editor used when the TipTap runtime is unavailable (e.g. in\n * environments where the package failed to load). Renders a\n * `contenteditable` surface with the same imperative handle so callers\n * never need to care which variant they got.\n */\nexport const FallbackRichTextEditor = forwardRef<RichTextEditorHandle, RichTextEditorProps>(function FallbackRichTextEditor(\n\t{\n\t\tvalue,\n\t\tonChange,\n\t\tplaceholder,\n\t\tcompact = false,\n\t\tminHeight,\n\t\tmaxHeight,\n\t\tdisabled = false,\n\t\tshowCounts = false,\n\t\tmaxLength,\n\t\textraToolbarItems,\n\t\ttoolbarTrailing,\n\t\tfooterSlot,\n\t\thideSourceToggle = false,\n\t\tautoFocus = false,\n\t\tclassName,\n\t\tonCaretChange,\n\t\tstrings: stringsProp,\n\t},\n\tref,\n) {\n\tconst strings = useStrings(defaultRichTextEditorStrings, stringsProp);\n\tconst editableRef = useRef<HTMLDivElement>(null);\n\tconst [isFocused, setIsFocused] = useState(false);\n\tconst [sourceMode, setSourceMode] = useState(false);\n\tconst [sourceValue, setSourceValue] = useState('');\n\tconst externalValueRef = useRef<string>(normalizeHtml(value));\n\tconst onCaretChangeRef = useRef(onCaretChange);\n\tonCaretChangeRef.current = onCaretChange;\n\n\tuseEffect(() => {\n\t\tconst editable = editableRef.current;\n\t\tif (!editable || isFocused) return;\n\t\tconst next = toEditorContent(value);\n\t\tif (normalizeHtml(editable.innerHTML) !== normalizeHtml(next)) {\n\t\t\teditable.innerHTML = next;\n\t\t}\n\t\texternalValueRef.current = normalizeHtml(value);\n\t}, [isFocused, value]);\n\n\tuseEffect(() => {\n\t\tif (!autoFocus) return;\n\t\teditableRef.current?.focus();\n\t}, [autoFocus]);\n\n\tconst emitEditableChange = useCallback(() => {\n\t\tconst editable = editableRef.current;\n\t\tconst html = normalizeHtml(editable?.innerHTML ?? '');\n\t\texternalValueRef.current = html;\n\t\tonChange(html);\n\t\tonCaretChangeRef.current?.();\n\t}, [onChange]);\n\n\tuseImperativeHandle(\n\t\tref,\n\t\t() => ({\n\t\t\tfocus: () => editableRef.current?.focus(),\n\t\t\tgetHTML: () => normalizeHtml(editableRef.current?.innerHTML ?? ''),\n\t\t\tsetHTML: (html: string) => {\n\t\t\t\tconst next = normalizeHtml(html);\n\t\t\t\texternalValueRef.current = next;\n\t\t\t\tif (editableRef.current) {\n\t\t\t\t\teditableRef.current.innerHTML = toEditorContent(next);\n\t\t\t\t}\n\t\t\t\tonChange(next);\n\t\t\t},\n\t\t\tinsertHTML: (html: string) => {\n\t\t\t\tinsertHtmlIntoEditable(editableRef.current, html);\n\t\t\t\temitEditableChange();\n\t\t\t},\n\t\t\tisEmpty: () => normalizeHtml(editableRef.current?.innerHTML ?? '') === '',\n\t\t\tclear: () => {\n\t\t\t\texternalValueRef.current = '';\n\t\t\t\tif (editableRef.current) editableRef.current.innerHTML = '<p></p>';\n\t\t\t\tonChange('');\n\t\t\t},\n\t\t\tgetCaretContext: () => readCaretContext(),\n\t\t\treplaceBeforeCaret: (length: number, html: string) => {\n\t\t\t\treplaceBeforeCaret(null, length, html, () => emitEditableChange());\n\t\t\t},\n\t\t}),\n\t\t[emitEditableChange, onChange],\n\t);\n\n\tconst contentStyle = useMemo(\n\t\t() => ({\n\t\t\tminHeight: minHeight ?? (compact ? '2rem' : '12rem'),\n\t\t\t...(maxHeight ? { maxHeight, overflowY: 'auto' as const } : {}),\n\t\t}),\n\t\t[compact, maxHeight, minHeight],\n\t);\n\n\tconst toggleSourceMode = useCallback(() => {\n\t\tif (sourceMode) {\n\t\t\tconst normalized = normalizeHtml(sourceValue);\n\t\t\texternalValueRef.current = normalized;\n\t\t\tif (editableRef.current) {\n\t\t\t\teditableRef.current.innerHTML = toEditorContent(normalized);\n\t\t\t}\n\t\t\tonChange(normalized);\n\t\t\tsetSourceMode(false);\n\t\t\treturn;\n\t\t}\n\t\tsetSourceValue(editableRef.current?.innerHTML ?? toEditorContent(value));\n\t\tsetSourceMode(true);\n\t}, [onChange, sourceMode, sourceValue, value]);\n\n\tconst handleSourceChange = useCallback(\n\t\t(e: React.ChangeEvent<HTMLTextAreaElement>) => {\n\t\t\tconst next = e.target.value;\n\t\t\tsetSourceValue(next);\n\t\t\tconst normalized = normalizeHtml(next);\n\t\t\texternalValueRef.current = normalized;\n\t\t\tonChange(normalized);\n\t\t},\n\t\t[onChange],\n\t);\n\n\tconst placeholderText = typeof placeholder === 'string' ? placeholder : '';\n\tconst isEmpty = normalizeHtml(externalValueRef.current) === '';\n\tconst placeholderNode =\n\t\tplaceholderText.length > 0 && !isFocused && isEmpty ? (\n\t\t\t<span className=\"text-muted-foreground pointer-events-none absolute left-3 top-2 text-sm\">\n\t\t\t\t{placeholderText}\n\t\t\t</span>\n\t\t) : null;\n\n\tconst toolbarButtons = useMemo<ToolbarButtonConfig[]>(\n\t\t() => [\n\t\t\t{ id: 'bold', icon: Bold, label: strings.toolbar.bold, isActive: () => false, run: () => undefined, disabled: true },\n\t\t\t{ id: 'italic', icon: Italic, label: strings.toolbar.italic, isActive: () => false, run: () => undefined, disabled: true },\n\t\t\t{ id: 'strike', icon: Strikethrough, label: strings.toolbar.strike, isActive: () => false, run: () => undefined, disabled: true },\n\t\t\t{ id: 'bullet-list', icon: List, label: strings.toolbar.bulletList, isActive: () => false, run: () => undefined, disabled: true },\n\t\t\t{ id: 'ordered-list', icon: ListOrdered, label: strings.toolbar.orderedList, isActive: () => false, run: () => undefined, disabled: true },\n\t\t\t{ id: 'blockquote', icon: Quote, label: strings.toolbar.blockquote, isActive: () => false, run: () => undefined, disabled: true },\n\t\t\t{ id: 'undo', icon: Undo2, label: strings.toolbar.undo, isActive: () => false, run: () => undefined, disabled: true },\n\t\t\t{ id: 'redo', icon: Redo2, label: strings.toolbar.redo, isActive: () => false, run: () => undefined, disabled: true },\n\t\t],\n\t\t[strings],\n\t);\n\n\tconst text = sourceMode\n\t\t? sourceValue.replace(/<[^>]*>/g, '')\n\t\t: (editableRef.current?.innerText ?? normalizeHtml(value).replace(/<[^>]*>/g, ''));\n\tconst countsFooter =\n\t\tshowCounts ? (\n\t\t\t<CountsFooterText text={text} maxLength={maxLength} strings={strings} />\n\t\t) : null;\n\n\treturn (\n\t\t<div\n\t\t\tclassName={cn(\n\t\t\t\t'border-input bg-background rounded-md border',\n\t\t\t\tdisabled && 'opacity-70',\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t>\n\t\t\t<RichTextEditorToolbar\n\t\t\t\tbuttons={toolbarButtons}\n\t\t\t\textraToolbarItems={extraToolbarItems}\n\t\t\t\thideSourceToggle={hideSourceToggle}\n\t\t\t\tsourceMode={sourceMode}\n\t\t\t\ttoggleSourceMode={toggleSourceMode}\n\t\t\t\tdisabled={disabled}\n\t\t\t\thasEditor\n\t\t\t\ttoolbarTrailing={toolbarTrailing}\n\t\t\t\tstrings={strings}\n\t\t\t/>\n\n\t\t\t{sourceMode ? (\n\t\t\t\t<textarea\n\t\t\t\t\taria-label={strings.sourceLabel}\n\t\t\t\t\tvalue={sourceValue}\n\t\t\t\t\tonChange={handleSourceChange}\n\t\t\t\t\tdisabled={disabled}\n\t\t\t\t\tspellCheck={false}\n\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t'bg-muted/50 w-full resize-y px-3 py-2 font-mono text-xs leading-relaxed focus-visible:outline-none',\n\t\t\t\t\t\tdisabled && 'cursor-not-allowed',\n\t\t\t\t\t)}\n\t\t\t\t\tstyle={contentStyle}\n\t\t\t\t/>\n\t\t\t) : (\n\t\t\t\t<div className=\"relative\" style={contentStyle}>\n\t\t\t\t\t{placeholderNode}\n\t\t\t\t\t<div\n\t\t\t\t\t\tref={editableRef}\n\t\t\t\t\t\trole=\"textbox\"\n\t\t\t\t\t\taria-label={strings.editorLabel}\n\t\t\t\t\t\taria-multiline=\"true\"\n\t\t\t\t\t\tcontentEditable={!disabled}\n\t\t\t\t\t\tsuppressContentEditableWarning\n\t\t\t\t\t\tonInput={emitEditableChange}\n\t\t\t\t\t\tonKeyUp={() => onCaretChangeRef.current?.()}\n\t\t\t\t\t\tonMouseUp={() => onCaretChangeRef.current?.()}\n\t\t\t\t\t\tonFocus={() => setIsFocused(true)}\n\t\t\t\t\t\tonBlur={() => setIsFocused(false)}\n\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t'prose prose-sm prose-p:my-0.5 prose-p:leading-relaxed prose-headings:my-1 prose-ul:my-1 prose-ol:my-1 prose-li:my-0.5 max-w-none px-3 py-2 text-sm focus-visible:outline-none dark:prose-invert',\n\t\t\t\t\t\t\t'h-full min-h-full',\n\t\t\t\t\t\t\tdisabled && 'cursor-not-allowed',\n\t\t\t\t\t\t)}\n\t\t\t\t\t\tdangerouslySetInnerHTML={{ __html: toEditorContent(value) }}\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t)}\n\n\t\t\t{!!footerSlot && (\n\t\t\t\t<div className=\"px-3 pb-2 pt-1\">{footerSlot}</div>\n\t\t\t)}\n\n\t\t\t{countsFooter}\n\t\t</div>\n\t);\n});\n\nFallbackRichTextEditor.displayName = 'FallbackRichTextEditor';\n","/**\n * Public `<RichTextEditor>` shell — picks the TipTap-backed editor when\n * the runtime is loaded and falls back to a plain `contenteditable`\n * surface otherwise. Both variants implement the same imperative\n * `RichTextEditorHandle`, so callers don't have to branch.\n *\n * Heavy lifting lives in `partials/`:\n * - `partials/rich-text-editor-tiptap.tsx` — TipTap variant\n * - `partials/rich-text-editor-fallback.tsx` — contenteditable variant\n * - `partials/rich-text-editor-toolbar.tsx` — shared toolbar\n * - `partials/counts-footer.tsx` — char/word counts\n * - `partials/caret-helpers.ts` — caret introspection\n * - `partials/html-helpers.ts` — HTML normalization\n */\nimport { forwardRef } from 'react';\n\nimport {\n\tFallbackRichTextEditor,\n\tTiptapRichTextEditor,\n\thasTiptapRuntime,\n} from './partials';\nimport type {\n\tRichTextEditorHandle,\n\tRichTextEditorProps,\n} from './rich-text-editor.types';\n\nexport const RichTextEditor = forwardRef<RichTextEditorHandle, RichTextEditorProps>(function RichTextEditor(\n\tprops,\n\tref,\n) {\n\tif (!hasTiptapRuntime) {\n\t\treturn <FallbackRichTextEditor className=\"rich-text-editor--component\" {...props} ref={ref} />;\n\t}\n\n\treturn <TiptapRichTextEditor {...props} ref={ref} />;\n});\n\nRichTextEditor.displayName = 'RichTextEditor';\n\nexport type {\n\tRichTextEditorProps,\n\tRichTextEditorHandle,\n\tRichTextEditorToolbarItem,\n\tRichTextCaretContext,\n} from './rich-text-editor.types';\n"],"mappings":";;;;;;;;;;AA4BA,SAAgB,EAAsB,EACrC,YACA,sBACA,sBAAmB,IACnB,eACA,qBACA,cAAW,IACX,eAAY,IACZ,oBACA,cAC8B;CAC9B,IAAM,KAAa,GAAmB,UAAU,KAAK;CAErD,OACC,kBAAC,OAAD;EAAK,WAAU;YAAf;GACE,EAAQ,KAAK,MAAW;IACxB,IAAM,IAAO,EAAO,MACd,IAAW,EAAO,SAAS;IAEjC,OACC,kBAAC,GAAD;KAEC,MAAK;KACL,SAAS,IAAW,YAAY;KAChC,aAAa,IAAW,UAAU;KAClC,MAAK;KACL,SAAS,EAAO;KAChB,UAAU,KAAY,CAAC,KAAa,KAAc,EAAO;KACzD,cAAY,EAAO;KACnB,OAAO,EAAO;eAEd,kBAAC,GAAD,EAAM,WAAU,cAAe,CAAA;IACxB,GAXF,EAAO,EAWL;GAEV,CAAC;GAEA,CAAC,KACD,kBAAA,GAAA,EAAA,UAAA,CACC,kBAAC,OAAD,EAAK,WAAU,0BAA2B,CAAA,GAE1C,kBAAC,GAAD;IACC,MAAK;IACL,SAAS,IAAa,YAAY;IAClC,aAAa,IAAa,UAAU;IACpC,MAAK;IACL,SAAS;IACT,UAAU,KAAY,CAAC;IACvB,cAAY,EAAQ,QAAQ;IAC5B,OAAO,EAAQ,QAAQ;cAEvB,kBAAC,GAAD,EAAO,WAAU,cAAe,CAAA;GACzB,CAAA,CACP,EAAA,CAAA;GAGF,KACA,kBAAA,GAAA,EAAA,UAAA,CACC,kBAAC,OAAD,EAAK,WAAU,0BAA2B,CAAA,GACzC,GAAmB,KAAK,MAAS;IACjC,IAAM,IAAO,EAAK,MACZ,IAAW,EAAK,WAAW,KAAK;IACtC,OACC,kBAAC,GAAD;KAEC,MAAK;KACL,SAAS,IAAW,YAAY;KAChC,aAAa,IAAW,UAAU;KAClC,MAAK;KACL,SAAS,EAAK;KACd,UAAU,KAAY,CAAC,KAAa,KAAc,EAAK;KACvD,cAAY,EAAK;KACjB,OAAO,EAAK;eAEZ,kBAAC,GAAD,EAAM,WAAU,cAAe,CAAA;IACxB,GAXF,EAAK,EAWH;GAEV,CAAC,CACA,EAAA,CAAA;GAGF,CAAC,CAAC,KACF,kBAAC,OAAD;IAAK,WAAU;cAAmC;GAAqB,CAAA;EAEpE;;AAEP;AAEA,EAAsB,cAAc;;;AClFpC,IAAa,IAAsD;CAClE,aAAa;CACb,aAAa;CACb,SAAS;EACR,MAAM;EACN,QAAQ;EACR,QAAQ;EACR,YAAY;EACZ,aAAa;EACb,YAAY;EACZ,MAAM;EACN,MAAM;EACN,YAAY;CACb;CACA,QAAQ;EACP,YAAY;EACZ,OAAO;EACP,KAAK;CACN;AACD;;;ACjCA,SAAgB,IAAgD;CAC/D,IAAI,OAAO,SAAW,KAAa,OAAO;CAC1C,IAAM,IAAM,OAAO,aAAa;CAChC,IAAI,CAAC,KAAO,EAAI,eAAe,GAAG,OAAO;CACzC,IAAM,IAAQ,EAAI,WAAW,CAAC;CAC9B,IAAI,CAAC,EAAM,WAAW,OAAO;CAE7B,IAAM,IAAY,EAAM,gBAClB,IAAc,EAAM,aAEtB,IAAqB;CACzB,OAAO,KAAS,EAAM,aAAa,KAAK,eACvC,IAAQ,EAAM;CAEf,IAAI,CAAC,GAAO,OAAO;CACnB,IAAM,IACJ,EAAkB,QAAQ,4BAA0B,KACpD,EAAkB,QAAQ,cAAc;CAC1C,IAAI,CAAC,GAAU,OAAO;CAEtB,IAAI,IAAO;CACX,AAAI,EAAU,aAAa,KAAK,cAC/B,KAAQ,EAAU,eAAe,IAAI,MAAM,GAAG,CAAW;CAG1D,IAAI,IAAsB;CAC1B,OAAO,KAAU,MAAW,KAAY,MAAW,IAAO;EACzD,IAAI,IAAoB,EAAO;EAC/B,OAAO,IAEN,AADA,KAAQ,EAAK,eAAe,MAAM,GAClC,IAAO,EAAK;EAGb,IADA,IAAS,EAAO,YACZ,KAAW,EAAmB,UAAU,2CAA2C,GACtF;CAEF;CAEA,IAAI,GACE,IAAI,EAAM,sBAAsB;CAKtC,OAJI,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,YACzC,IAAO;EAAE,KAAK,EAAE;EAAK,MAAM,EAAE;EAAM,QAAQ,EAAE;EAAQ,OAAO,EAAE;CAAM,IAG9D;EAAE,YAAY;EAAM;CAAK;AACjC;AASA,SAAgB,EACf,GACA,GACA,GACA,GACO;CACP,IAAI,OAAO,SAAW,KAAa;CACnC,IAAM,IAAM,OAAO,aAAa;CAChC,IAAI,CAAC,KAAO,EAAI,eAAe,GAAG;CAClC,IAAM,IAAQ,EAAI,WAAW,CAAC;CAC9B,IAAI,CAAC,EAAM,WAAW;CAEtB,IAAI,IAAY,GACZ,IAAkB,EAAM,gBACxB,IAAc,EAAM;CAExB,OAAO,IAAY,IAAG;EACrB,IAAI,EAAU,aAAa,KAAK,WAAW;GAC1C,IAAM,IAAO,KAAK,IAAI,GAAa,CAAS;GAG5C,IAFA,KAAe,GACf,KAAa,GACT,MAAc,GAAG;EACtB;EACA,IAAM,IAAO,EAAiB,CAAS;EACvC,IAAI,CAAC,GAAM;EAEX,AADA,IAAY,GACZ,IAAc,EAAK,aAAa,UAAU;CAC3C;CAEA,IAAM,IAAQ,SAAS,YAAY;CAMnC,IALA,EAAM,SAAS,GAAW,CAAW,GACrC,EAAM,OAAO,EAAM,cAAc,EAAM,SAAS,GAChD,EAAI,gBAAgB,GACpB,EAAI,SAAS,CAAK,GAEd,GAAQ;EAEX,AADA,EAAO,MAAM,EAAE,MAAM,EAAE,cAAc,CAAI,EAAE,IAAI,GAC/C,EAAa,EAAO,QAAQ,CAAC;EAC7B;CACD;CAEA,EAAM,eAAe;CACrB,IAAM,IAAW,SAAS,YAAY,EAAE,yBAAyB,CAAI;CAErE,AADA,EAAM,WAAW,CAAQ,GACzB,EAAI,cAAc;CAClB,IAAM,IACJ,GAA8B,eAAe,UAAU,4BAA0B,KAAK;CACxF,AAAI,KAAU,EAAc,EAAyB,SAAS;AAC/D;AAEA,SAAgB,EAAuB,GAA8B,GAAoB;CACxF,IAAI,OAAO,SAAW,OAAe,CAAC,GAAU;CAChD,EAAS,MAAM;CAEf,IAAM,IAAM,OAAO,aAAa;CAChC,IAAI,CAAC,KAAO,EAAI,eAAe,GAAG;EACjC,EAAS,mBAAmB,aAAa,CAAI;EAC7C;CACD;CAEA,IAAM,IAAQ,EAAI,WAAW,CAAC;CAC9B,IAAI,CAAC,EAAS,SAAS,EAAM,uBAAuB,GAAG;EACtD,EAAS,mBAAmB,aAAa,CAAI;EAC7C;CACD;CAEA,EAAM,eAAe;CACrB,IAAM,IAAW,SAAS,YAAY,EAAE,yBAAyB,CAAI;CAIrE,AAHA,EAAM,WAAW,CAAQ,GACzB,EAAM,SAAS,EAAK,GACpB,EAAI,gBAAgB,GACpB,EAAI,SAAS,CAAK;AACnB;AAEA,SAAS,EAAiB,GAAyB;CAClD,IAAI,IAAuB;CAC3B,OAAO,IAAS;EACf,IAAI,EAAQ,iBAAiB;GAE5B,KADA,IAAU,EAAQ,iBACX,KAAW,EAAQ,YACzB,IAAU,EAAQ;GAEnB,IAAI,KAAW,EAAQ,aAAa,KAAK,WAAW,OAAO;GAC3D;EACD;EAEA,IADA,IAAU,EAAQ,YACd,CAAC,KAAY,EAAoB,UAAU,uEAAqE,GACnH,OAAO;CAET;CACA,OAAO;AACR;;;ACxJA,SAAgB,EAAiB,EAAE,SAAM,cAAW,cAAkC;CACrF,IAAM,IAAQ,EAAK,QACb,IAAQ,EAAK,KAAK,EAAE,SAAS,IAAI,EAAK,KAAK,EAAE,MAAM,KAAK,EAAE,SAAS,GACnE,IAAY,OAAO,KAAc,YAAY,IAAQ;CAE3D,OACC,kBAAC,OAAD;EAAK,WAAU;YAAf,CACC,kBAAC,GAAD;GACC,KAAI;GACJ,MAAK;GACL,MAAM,IAAY,UAAU;GAC5B,QAAQ,IAAY,WAAW;GAC/B,WAAW,EAAG,cAAc;aAL7B;IAOE;IACA,OAAO,KAAc,WAAW,MAAM,MAAc;IAAG;IAAE,EAAQ,OAAO;GACpE;MACN,kBAAC,GAAD;GAAM,KAAI;GAAO,MAAK;GAAK,MAAK;GAAY,WAAU;aAAtD;IACE;IAAM;IAAE,EAAQ,OAAO;GACnB;IACF;;AAEP;AAEA,EAAiB,cAAc;AAU/B,SAAgB,EAAa,EAC5B,WACA,eACA,gBACA,cACA,cACqB;CAKrB,OAAO,kBAAC,GAAD;EAAwB,MAJlB,IACV,EAAY,QAAQ,YAAY,EAAE,IACjC,GAAQ,QAAQ,KAAK;EAEuB;EAAoB;CAAU,CAAA;AAC/E;AAEA,EAAa,cAAc;;;ACtD3B,SAAgB,EAAc,GAAuB;CACpD,IAAM,IAAU,EAAM,KAAK;CAM3B,OAJI,MAAY,MAAM,MAAY,aAAa,MAAY,gBACnD,KAGD;AACR;AAEA,SAAgB,EAAgB,GAAuB;CACtD,IAAM,IAAa,EAAc,CAAK;CACtC,OAAO,MAAe,KAAK,YAAY;AACxC;;;ACiBA,IAAM,IAAgB,EAAY,eAC5B,IAAkB,EAAY,WAC9B,IACL,aAAa,IAAmB,EAAiB,UAAU,GAE/C,IAAuB,EAAsD,SACzF,EACC,UACA,aACA,gBACA,aAAU,IACV,cACA,cACA,cAAW,IACX,gBAAa,IACb,cACA,sBACA,oBACA,eACA,sBAAmB,IACnB,eAAY,IACZ,cACA,kBACA,SAAS,KAEV,GACC;CACD,IAAM,IAAU,EAAW,GAA8B,CAAW,GAC9D,CAAC,GAAW,KAAgB,EAAS,EAAK,GAC1C,CAAC,GAAY,KAAiB,EAAS,EAAK,GAC5C,CAAC,GAAa,KAAkB,EAAS,EAAE,GAC3C,IAAe,EAAO,EAAK,GAC3B,IAAmB,EAAe,EAAc,CAAK,CAAC,GACtD,IAAmB,EAAO,CAAa;CAC7C,EAAiB,UAAU;CAE3B,IAAM,IAAS,EAAgB;EAC9B,YAAY,CAAC,CAAU;EACvB,SAAS,EAAgB,CAAK;EAC9B,UAAU,CAAC;EACX,mBAAmB;EACnB,WAAW,IAAY,QAAQ;EAC/B,eAAe;GAEd,AADA,EAAa,UAAU,IACvB,EAAa,EAAI;EAClB;EACA,cAAc;GAEb,AADA,EAAa,UAAU,IACvB,EAAa,EAAK;EACnB;EACA,WAAW,EAAE,QAAQ,QAA2D;GAC/E,IAAM,IAAO,EAAc,EAAc,QAAQ,CAAC;GAC7C,EAAa,YAId,MAAS,EAAiB,YAC7B,EAAiB,UAAU,GAC3B,EAAS,CAAI,IAGd,EAAiB,UAAU;EAC5B;EACA,aAAa,EACZ,YAAY;GACX,MAAM;GACN,cAAc,EAAQ;GACtB,kBAAkB;GAClB,OAAO;EACR,EACD;CACD,CAAC;CAkCD,AAhCA,QAAgB;EACf,IAAI,CAAC,GACJ;EAGD,IAAM,IAAU,EAAc,EAAO,QAAQ,CAAC,GACxC,IAAO,EAAc,CAAK;EAGhC,AAFA,EAAiB,UAAU,GAEvB,MAAY,KACf,EAAO,SAAS,WAAW,EAAgB,CAAI,GAAG,EAAE,YAAY,GAAM,CAAC;CAEzE,GAAG,CAAC,GAAQ,CAAK,CAAC,GAElB,QAAgB;EACV,KAIL,EAAO,YAAY,CAAC,CAAQ;CAC7B,GAAG,CAAC,GAAU,CAAM,CAAC,GAErB,QAAgB;EACf,IAAI,OAAO,WAAa,KAAa;EACrC,IAAM,UAAgB;GAChB,EAAa,WAClB,EAAiB,UAAU;EAC5B;EAEA,OADA,SAAS,iBAAiB,mBAAmB,CAAO,SACvC,SAAS,oBAAoB,mBAAmB,CAAO;CACrE,GAAG,CAAC,CAAC,GAEL,EACC,UACO;EACN,aAAa;GACZ,GAAQ,MAAM,EAAE,MAAM,EAAE,IAAI;EAC7B;EACA,eAAe,EAAc,GAAQ,QAAQ,KAAK,EAAE;EACpD,UAAU,MAAiB;GAC1B,IAAM,IAAO,EAAc,CAAI;GAG/B,AAFA,EAAiB,UAAU,GAC3B,GAAQ,SAAS,WAAW,EAAgB,CAAI,GAAG,EAAE,YAAY,GAAM,CAAC,GACxE,EAAS,CAAI;EACd;EACA,aAAa,MAAiB;GACxB,KACL,EAAO,MAAM,EAAE,MAAM,EAAE,cAAc,CAAI,EAAE,IAAI;EAChD;EACA,eAAe,EAAc,GAAQ,QAAQ,KAAK,EAAE,MAAM;EAC1D,aAAa;GAGZ,AAFA,EAAiB,UAAU,IAC3B,GAAQ,SAAS,WAAW,WAAW,EAAE,YAAY,GAAM,CAAC,GAC5D,EAAS,EAAE;EACZ;EACA,uBAAuB,EAAiB;EACxC,qBAAqB,GAAgB,MAAiB;GACrD,EAAmB,GAAQ,GAAQ,IAAO,MAAS;IAElD,AADA,EAAiB,UAAU,EAAc,CAAI,GAC7C,EAAS,EAAiB,OAAO;GAClC,CAAC;EACF;CACD,IACA,CAAC,GAAQ,CAAQ,CAClB;CAEA,IAAM,IAAe,SACb;EACN,WAAW,MAAc,IAAU,SAAS;EAC5C,GAAI,IAAY;GAAE;GAAW,WAAW;EAAgB,IAAI,CAAC;CAC9D,IACA;EAAC;EAAS;EAAW;CAAS,CAC/B,GAEM,IAAmB,QAAkB;EACrC,OAEL,IAAI,GAAY;GACf,IAAM,IAAO,EAAgB,CAAW;GACxC,EAAO,SAAS,WAAW,GAAM,EAAE,YAAY,GAAM,CAAC;GACtD,IAAM,IAAa,EAAc,CAAW;GAG5C,AAFA,EAAiB,UAAU,GAC3B,EAAS,CAAU,GACnB,EAAc,EAAK;EACpB,OAEC,AADA,EAAe,EAAO,QAAQ,CAAC,GAC/B,EAAc,EAAI;CAEpB,GAAG;EAAC;EAAQ;EAAU;EAAY;CAAW,CAAC,GAExC,KAAqB,GACzB,MAA8C;EAC9C,IAAM,IAAO,EAAE,OAAO;EACtB,EAAe,CAAI;EACnB,IAAM,IAAa,EAAc,CAAI;EAErC,AADA,EAAiB,UAAU,GAC3B,EAAS,CAAU;CACpB,GACA,CAAC,CAAQ,CACV,GAEM,KAAiB,QAChB;EACL;GACC,IAAI;GACJ,MAAM;GACN,OAAO,EAAQ,QAAQ;GACvB,gBAAgB,EAAQ,GAAQ,SAAS,MAAM;GAC/C,WAAW,GAAQ,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,IAAI;EACrD;EACA;GACC,IAAI;GACJ,MAAM;GACN,OAAO,EAAQ,QAAQ;GACvB,gBAAgB,EAAQ,GAAQ,SAAS,QAAQ;GACjD,WAAW,GAAQ,MAAM,EAAE,MAAM,EAAE,aAAa,EAAE,IAAI;EACvD;EACA;GACC,IAAI;GACJ,MAAM;GACN,OAAO,EAAQ,QAAQ;GACvB,gBAAgB,EAAQ,GAAQ,SAAS,QAAQ;GACjD,WAAW,GAAQ,MAAM,EAAE,MAAM,EAAE,aAAa,EAAE,IAAI;EACvD;EACA;GACC,IAAI;GACJ,MAAM;GACN,OAAO,EAAQ,QAAQ;GACvB,gBAAgB,EAAQ,GAAQ,SAAS,YAAY;GACrD,WAAW,GAAQ,MAAM,EAAE,MAAM,EAAE,iBAAiB,EAAE,IAAI;EAC3D;EACA;GACC,IAAI;GACJ,MAAM;GACN,OAAO,EAAQ,QAAQ;GACvB,gBAAgB,EAAQ,GAAQ,SAAS,aAAa;GACtD,WAAW,GAAQ,MAAM,EAAE,MAAM,EAAE,kBAAkB,EAAE,IAAI;EAC5D;EACA;GACC,IAAI;GACJ,MAAM;GACN,OAAO,EAAQ,QAAQ;GACvB,gBAAgB,EAAQ,GAAQ,SAAS,YAAY;GACrD,WAAW,GAAQ,MAAM,EAAE,MAAM,EAAE,iBAAiB,EAAE,IAAI;EAC3D;EACA;GACC,IAAI;GACJ,MAAM;GACN,OAAO,EAAQ,QAAQ;GACvB,gBAAgB;GAChB,WAAW,GAAQ,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI;GAC9C,UAAU,CAAC,GAAQ,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI;EACrD;EACA;GACC,IAAI;GACJ,MAAM;GACN,OAAO,EAAQ,QAAQ;GACvB,gBAAgB;GAChB,WAAW,GAAQ,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI;GAC9C,UAAU,CAAC,GAAQ,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI;EACrD;CACD,GACA,CAAC,GAAQ,CAAO,CACjB,GAEM,KACL,KAAc,IACb,kBAAC,GAAD;EACS;EACI;EACC;EACF;EACF;CACT,CAAA,IACE,MAEC,IAAkB,OAAO,KAAgB,WAAW,IAAc,IAGlE,KADL,EAAgB,SAAS,KAAK,CAAC,KAAqB,GAAQ,UAE5D,kBAAC,QAAD;EAAM,WAAU;YACd;CACI,CAAA,IACH;CAEJ,OACC,kBAAC,OAAD;EACC,WAAW,EACV,gDACA,KAAY,cACZ,CACD;YALD;GAOC,kBAAC,GAAD;IACC,SAAS;IACU;IACD;IACN;IACM;IACR;IACV,WAAW,EAAQ;IACF;IACR;GACT,CAAA;GAEA,IACA,kBAAC,YAAD;IACC,cAAY,EAAQ;IACpB,OAAO;IACP,UAAU;IACA;IACV,YAAY;IACZ,WAAW,EACV,sGACA,KAAY,oBACb;IACA,OAAO;GACP,CAAA,IAED,kBAAC,OAAD;IAAK,WAAU;IAAW,OAAO;cAAjC,CACE,IAED,kBAAC,GAAD;KACS;KACR,WAAW,EACV,UACA,2BACA,+BACA,+BACD;IACA,CAAA,CACG;;GAGL,CAAC,CAAC,KACF,kBAAC,OAAD;IAAK,WAAU;cAAkB;GAAgB,CAAA;GAGjD;EACG;;AAEP,CAAC;AAED,EAAqB,cAAc;AAEnC,IAAa,IACZ,OAAO,KAAkB,cACzB,OAAO,KAAoB,cAC3B,OAAO,KAAe,cACtB,GC1TY,IAAyB,EAAsD,SAC3F,EACC,UACA,aACA,gBACA,aAAU,IACV,cACA,cACA,cAAW,IACX,gBAAa,IACb,cACA,sBACA,oBACA,eACA,sBAAmB,IACnB,eAAY,IACZ,cACA,kBACA,SAAS,KAEV,GACC;CACD,IAAM,IAAU,EAAW,GAA8B,CAAW,GAC9D,IAAc,EAAuB,IAAI,GACzC,CAAC,GAAW,KAAgB,EAAS,EAAK,GAC1C,CAAC,GAAY,KAAiB,EAAS,EAAK,GAC5C,CAAC,GAAa,KAAkB,EAAS,EAAE,GAC3C,IAAmB,EAAe,EAAc,CAAK,CAAC,GACtD,IAAmB,EAAO,CAAa;CAa7C,AAZA,EAAiB,UAAU,GAE3B,QAAgB;EACf,IAAM,IAAW,EAAY;EAC7B,IAAI,CAAC,KAAY,GAAW;EAC5B,IAAM,IAAO,EAAgB,CAAK;EAIlC,AAHI,EAAc,EAAS,SAAS,MAAM,EAAc,CAAI,MAC3D,EAAS,YAAY,IAEtB,EAAiB,UAAU,EAAc,CAAK;CAC/C,GAAG,CAAC,GAAW,CAAK,CAAC,GAErB,QAAgB;EACV,KACL,EAAY,SAAS,MAAM;CAC5B,GAAG,CAAC,CAAS,CAAC;CAEd,IAAM,IAAqB,QAAkB;EAC5C,IAAM,IAAW,EAAY,SACvB,IAAO,EAAc,GAAU,aAAa,EAAE;EAGpD,AAFA,EAAiB,UAAU,GAC3B,EAAS,CAAI,GACb,EAAiB,UAAU;CAC5B,GAAG,CAAC,CAAQ,CAAC;CAEb,EACC,UACO;EACN,aAAa,EAAY,SAAS,MAAM;EACxC,eAAe,EAAc,EAAY,SAAS,aAAa,EAAE;EACjE,UAAU,MAAiB;GAC1B,IAAM,IAAO,EAAc,CAAI;GAK/B,AAJA,EAAiB,UAAU,GACvB,EAAY,YACf,EAAY,QAAQ,YAAY,EAAgB,CAAI,IAErD,EAAS,CAAI;EACd;EACA,aAAa,MAAiB;GAE7B,AADA,EAAuB,EAAY,SAAS,CAAI,GAChD,EAAmB;EACpB;EACA,eAAe,EAAc,EAAY,SAAS,aAAa,EAAE,MAAM;EACvE,aAAa;GAGZ,AAFA,EAAiB,UAAU,IACvB,EAAY,YAAS,EAAY,QAAQ,YAAY,YACzD,EAAS,EAAE;EACZ;EACA,uBAAuB,EAAiB;EACxC,qBAAqB,GAAgB,MAAiB;GACrD,EAAmB,MAAM,GAAQ,SAAY,EAAmB,CAAC;EAClE;CACD,IACA,CAAC,GAAoB,CAAQ,CAC9B;CAEA,IAAM,IAAe,SACb;EACN,WAAW,MAAc,IAAU,SAAS;EAC5C,GAAI,IAAY;GAAE;GAAW,WAAW;EAAgB,IAAI,CAAC;CAC9D,IACA;EAAC;EAAS;EAAW;CAAS,CAC/B,GAEM,IAAmB,QAAkB;EAC1C,IAAI,GAAY;GACf,IAAM,IAAa,EAAc,CAAW;GAM5C,AALA,EAAiB,UAAU,GACvB,EAAY,YACf,EAAY,QAAQ,YAAY,EAAgB,CAAU,IAE3D,EAAS,CAAU,GACnB,EAAc,EAAK;GACnB;EACD;EAEA,AADA,EAAe,EAAY,SAAS,aAAa,EAAgB,CAAK,CAAC,GACvE,EAAc,EAAI;CACnB,GAAG;EAAC;EAAU;EAAY;EAAa;CAAK,CAAC,GAEvC,IAAqB,GACzB,MAA8C;EAC9C,IAAM,IAAO,EAAE,OAAO;EACtB,EAAe,CAAI;EACnB,IAAM,IAAa,EAAc,CAAI;EAErC,AADA,EAAiB,UAAU,GAC3B,EAAS,CAAU;CACpB,GACA,CAAC,CAAQ,CACV,GAEM,IAAkB,OAAO,KAAgB,WAAW,IAAc,IAClE,KAAU,EAAc,EAAiB,OAAO,MAAM,IACtD,KACL,EAAgB,SAAS,KAAK,CAAC,KAAa,KAC3C,kBAAC,QAAD;EAAM,WAAU;YACd;CACI,CAAA,IACH,MAEC,KAAiB,QAChB;EACL;GAAE,IAAI;GAAQ,MAAM;GAAM,OAAO,EAAQ,QAAQ;GAAM,gBAAgB;GAAO,WAAW,KAAA;GAAW,UAAU;EAAK;EACnH;GAAE,IAAI;GAAU,MAAM;GAAQ,OAAO,EAAQ,QAAQ;GAAQ,gBAAgB;GAAO,WAAW,KAAA;GAAW,UAAU;EAAK;EACzH;GAAE,IAAI;GAAU,MAAM;GAAe,OAAO,EAAQ,QAAQ;GAAQ,gBAAgB;GAAO,WAAW,KAAA;GAAW,UAAU;EAAK;EAChI;GAAE,IAAI;GAAe,MAAM;GAAM,OAAO,EAAQ,QAAQ;GAAY,gBAAgB;GAAO,WAAW,KAAA;GAAW,UAAU;EAAK;EAChI;GAAE,IAAI;GAAgB,MAAM;GAAa,OAAO,EAAQ,QAAQ;GAAa,gBAAgB;GAAO,WAAW,KAAA;GAAW,UAAU;EAAK;EACzI;GAAE,IAAI;GAAc,MAAM;GAAO,OAAO,EAAQ,QAAQ;GAAY,gBAAgB;GAAO,WAAW,KAAA;GAAW,UAAU;EAAK;EAChI;GAAE,IAAI;GAAQ,MAAM;GAAO,OAAO,EAAQ,QAAQ;GAAM,gBAAgB;GAAO,WAAW,KAAA;GAAW,UAAU;EAAK;EACpH;GAAE,IAAI;GAAQ,MAAM;GAAO,OAAO,EAAQ,QAAQ;GAAM,gBAAgB;GAAO,WAAW,KAAA;GAAW,UAAU;EAAK;CACrH,GACA,CAAC,CAAO,CACT,GAEM,IAAO,IACV,EAAY,QAAQ,YAAY,EAAE,IACjC,EAAY,SAAS,aAAa,EAAc,CAAK,EAAE,QAAQ,YAAY,EAAE,GAC3E,KACL,IACC,kBAAC,GAAD;EAAwB;EAAiB;EAAoB;CAAU,CAAA,IACpE;CAEL,OACC,kBAAC,OAAD;EACC,WAAW,EACV,gDACA,KAAY,cACZ,CACD;YALD;GAOC,kBAAC,GAAD;IACC,SAAS;IACU;IACD;IACN;IACM;IACR;IACV,WAAA;IACiB;IACR;GACT,CAAA;GAEA,IACA,kBAAC,YAAD;IACC,cAAY,EAAQ;IACpB,OAAO;IACP,UAAU;IACA;IACV,YAAY;IACZ,WAAW,EACV,sGACA,KAAY,oBACb;IACA,OAAO;GACP,CAAA,IAED,kBAAC,OAAD;IAAK,WAAU;IAAW,OAAO;cAAjC,CACE,IACD,kBAAC,OAAD;KACC,KAAK;KACL,MAAK;KACL,cAAY,EAAQ;KACpB,kBAAe;KACf,iBAAiB,CAAC;KAClB,gCAAA;KACA,SAAS;KACT,eAAe,EAAiB,UAAU;KAC1C,iBAAiB,EAAiB,UAAU;KAC5C,eAAe,EAAa,EAAI;KAChC,cAAc,EAAa,EAAK;KAChC,WAAW,EACV,mMACA,qBACA,KAAY,oBACb;KACA,yBAAyB,EAAE,QAAQ,EAAgB,CAAK,EAAE;IAC1D,CAAA,CACG;;GAGL,CAAC,CAAC,KACF,kBAAC,OAAD;IAAK,WAAU;cAAkB;GAAgB,CAAA;GAGjD;EACG;;AAEP,CAAC;AAED,EAAuB,cAAc;;;AC3OrC,IAAa,IAAiB,EAAsD,SACnF,GACA,GACC;CAKD,OAJK,IAIE,kBAAC,GAAD;EAAsB,GAAI;EAAY;CAAM,CAAA,IAH3C,kBAAC,GAAD;EAAwB,WAAU;EAA8B,GAAI;EAAY;CAAM,CAAA;AAI/F,CAAC;AAED,EAAe,cAAc"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
const e=require("./chunk-CMqjfN_6.cjs"),t=require("../lib/strings.cjs"),n=require("../lib/utils.cjs"),r=require("./button-BMiPFJIb.cjs"),i=require("./typography-GtkgK9QX.cjs");let a=require("react"),o=require("react/jsx-runtime"),s=require("lucide-react"),c=require("@tiptap/react");c=e.t(c,1);let l=require("@tiptap/starter-kit");l=e.t(l,1);function u({buttons:e,extraToolbarItems:t,hideSourceToggle:n=!1,sourceMode:i,toggleSourceMode:a,disabled:c=!1,hasEditor:l=!0,toolbarTrailing:u,strings:d}){let f=(t?.length??0)>0;return(0,o.jsxs)(`div`,{className:`border-border flex flex-wrap items-center gap-1 border-b p-1.5`,children:[e.map(e=>{let t=e.icon,n=e.isActive();return(0,o.jsx)(r.t,{type:`button`,variant:n?`primary`:`secondary`,buttonStyle:n?`solid`:`ghost`,size:`icon-small`,onClick:e.run,disabled:c||!l||i||e.disabled,"aria-label":e.label,title:e.label,children:(0,o.jsx)(t,{className:`h-3.5 w-3.5`})},e.id)}),!n&&(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(`div`,{className:`bg-border mx-1 h-4 w-px`}),(0,o.jsx)(r.t,{type:`button`,variant:i?`primary`:`secondary`,buttonStyle:i?`solid`:`ghost`,size:`icon-small`,onClick:a,disabled:c||!l,"aria-label":d.toolbar.sourceCode,title:d.toolbar.sourceCode,children:(0,o.jsx)(s.Code2,{className:`h-3.5 w-3.5`})})]}),f&&(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(`div`,{className:`bg-border mx-1 h-4 w-px`}),t?.map(e=>{let t=e.icon,n=e.isActive?.()??!1;return(0,o.jsx)(r.t,{type:`button`,variant:n?`primary`:`secondary`,buttonStyle:n?`solid`:`ghost`,size:`icon-small`,onClick:e.onClick,disabled:c||!l||i||e.disabled,"aria-label":e.label,title:e.label,children:(0,o.jsx)(t,{className:`h-3.5 w-3.5`})},e.id)})]}),!!u&&(0,o.jsx)(`div`,{className:`ml-auto flex items-center gap-1`,children:u})]})}u.displayName=`RichTextEditorToolbar`;var d={editorLabel:`Rich text editor`,sourceLabel:`HTML source`,toolbar:{bold:`Bold`,italic:`Italic`,strike:`Strike`,bulletList:`Bullet list`,orderedList:`Ordered list`,blockquote:`Quote`,undo:`Undo`,redo:`Redo`,sourceCode:`Source code`},counts:{characters:`characters`,words:`words`,max:`max`}};function f(){if(typeof window>`u`)return null;let e=window.getSelection();if(!e||e.rangeCount===0)return null;let t=e.getRangeAt(0);if(!t.collapsed)return null;let n=t.startContainer,r=t.startOffset,i=n;for(;i&&i.nodeType!==Node.ELEMENT_NODE;)i=i.parentNode;if(!i)return null;let a=i.closest(`[contenteditable="true"]`)??i.closest(`.ProseMirror`);if(!a)return null;let o=``;n.nodeType===Node.TEXT_NODE&&(o=(n.textContent??``).slice(0,r));let s=n;for(;s&&s!==a&&s!==i;){let e=s.previousSibling;for(;e;)o=(e.textContent??``)+o,e=e.previousSibling;if(s=s.parentNode,s&&s.matches?.(`p, li, h1, h2, h3, h4, h5, h6, blockquote`))break}let c,l=t.getBoundingClientRect();return l&&(l.top||l.left||l.right||l.bottom)&&(c={top:l.top,left:l.left,bottom:l.bottom,right:l.right}),{textBefore:o,rect:c}}function p(e,t,n,r){if(typeof window>`u`)return;let i=window.getSelection();if(!i||i.rangeCount===0)return;let a=i.getRangeAt(0);if(!a.collapsed)return;let o=t,s=a.startContainer,c=a.startOffset;for(;o>0;){if(s.nodeType===Node.TEXT_NODE){let e=Math.min(c,o);if(c-=e,o-=e,o===0)break}let e=h(s);if(!e)break;s=e,c=e.textContent?.length??0}let l=document.createRange();if(l.setStart(s,c),l.setEnd(a.endContainer,a.endOffset),i.removeAllRanges(),i.addRange(l),e){e.chain().focus().insertContent(n).run(),r(e.getHTML());return}l.deleteContents();let u=document.createRange().createContextualFragment(n);l.insertNode(u),i.collapseToEnd();let d=s?.parentElement?.closest?.(`[contenteditable="true"]`)??null;d&&r(d.innerHTML)}function m(e,t){if(typeof window>`u`||!e)return;e.focus();let n=window.getSelection();if(!n||n.rangeCount===0){e.insertAdjacentHTML(`beforeend`,t);return}let r=n.getRangeAt(0);if(!e.contains(r.commonAncestorContainer)){e.insertAdjacentHTML(`beforeend`,t);return}r.deleteContents();let i=document.createRange().createContextualFragment(t);r.insertNode(i),r.collapse(!1),n.removeAllRanges(),n.addRange(r)}function h(e){let t=e;for(;t;){if(t.previousSibling){for(t=t.previousSibling;t&&t.lastChild;)t=t.lastChild;if(t&&t.nodeType===Node.TEXT_NODE)return t;continue}if(t=t.parentNode,!t||t.matches?.(`p, li, h1, h2, h3, h4, h5, h6, blockquote, [contenteditable="true"]`))return null}return null}function g({text:e,maxLength:t,strings:r}){let a=e.length,s=e.trim().length>0?e.trim().split(/\s+/).length:0,c=typeof t==`number`&&a>t;return(0,o.jsxs)(`div`,{className:`border-border flex items-center justify-end gap-3 border-t px-3 py-1.5`,children:[(0,o.jsxs)(i.s,{tag:`span`,size:`xs`,type:c?`error`:`secondary`,weight:c?`medium`:`regular`,className:n.cn(`tabular-nums`),children:[a,typeof t==`number`?` / ${t}`:``,` `,r.counts.characters]}),(0,o.jsxs)(i.s,{tag:`span`,size:`xs`,type:`secondary`,className:`tabular-nums`,children:[s,` `,r.counts.words]})]})}g.displayName=`CountsFooterText`;function _({editor:e,sourceMode:t,sourceValue:n,maxLength:r,strings:i}){return(0,o.jsx)(g,{text:t?n.replace(/<[^>]*>/g,``):e?.getText()??``,maxLength:r,strings:i})}_.displayName=`CountsFooter`;function v(e){let t=e.trim();return t===``||t===`<p></p>`||t===`<p><br></p>`?``:t}function y(e){let t=v(e);return t===``?`<p></p>`:t}var b=c.EditorContent,x=c.useEditor,S=`default`in l?l.default:l,C=(0,a.forwardRef)(function({value:e,onChange:r,placeholder:i,compact:c=!1,minHeight:l,maxHeight:m,disabled:h=!1,showCounts:g=!1,maxLength:C,extraToolbarItems:w,toolbarTrailing:T,footerSlot:E,hideSourceToggle:D=!1,autoFocus:O=!1,className:k,onCaretChange:A,strings:j},M){let N=t.useStrings(d,j),[P,F]=(0,a.useState)(!1),[I,L]=(0,a.useState)(!1),[R,z]=(0,a.useState)(``),B=(0,a.useRef)(!1),V=(0,a.useRef)(v(e)),H=(0,a.useRef)(A);H.current=A;let U=x({extensions:[S],content:y(e),editable:!h,immediatelyRender:!1,autofocus:O?`end`:!1,onFocus:()=>{B.current=!0,F(!0)},onBlur:()=>{B.current=!1,F(!1)},onUpdate:({editor:e})=>{let t=v(e.getHTML());B.current&&(t!==V.current&&(V.current=t,r(t)),H.current?.())},editorProps:{attributes:{role:`textbox`,"aria-label":N.editorLabel,"aria-multiline":`true`,class:`prose prose-sm prose-p:my-0.5 prose-p:leading-relaxed prose-headings:my-1 prose-ul:my-1 prose-ol:my-1 prose-li:my-0.5 max-w-none px-3 py-2 text-sm focus-visible:outline-none dark:prose-invert`}}});(0,a.useEffect)(()=>{if(!U)return;let t=v(U.getHTML()),n=v(e);V.current=n,t!==n&&U.commands.setContent(y(n),{emitUpdate:!1})},[U,e]),(0,a.useEffect)(()=>{U&&U.setEditable(!h)},[h,U]),(0,a.useEffect)(()=>{if(typeof document>`u`)return;let e=()=>{B.current&&H.current?.()};return document.addEventListener(`selectionchange`,e),()=>document.removeEventListener(`selectionchange`,e)},[]),(0,a.useImperativeHandle)(M,()=>({focus:()=>{U?.chain().focus().run()},getHTML:()=>v(U?.getHTML()??``),setHTML:e=>{let t=v(e);V.current=t,U?.commands.setContent(y(t),{emitUpdate:!1}),r(t)},insertHTML:e=>{U&&U.chain().focus().insertContent(e).run()},isEmpty:()=>v(U?.getHTML()??``)===``,clear:()=>{V.current=``,U?.commands.setContent(`<p></p>`,{emitUpdate:!1}),r(``)},getCaretContext:()=>f(),replaceBeforeCaret:(e,t)=>{p(U,e,t,e=>{V.current=v(e),r(V.current)})}}),[U,r]);let W=(0,a.useMemo)(()=>({minHeight:l??(c?`2rem`:`12rem`),...m?{maxHeight:m,overflowY:`auto`}:{}}),[c,m,l]),G=(0,a.useCallback)(()=>{if(U)if(I){let e=y(R);U.commands.setContent(e,{emitUpdate:!1});let t=v(R);V.current=t,r(t),L(!1)}else z(U.getHTML()),L(!0)},[U,r,I,R]),K=(0,a.useCallback)(e=>{let t=e.target.value;z(t);let n=v(t);V.current=n,r(n)},[r]),q=(0,a.useMemo)(()=>[{id:`bold`,icon:s.Bold,label:N.toolbar.bold,isActive:()=>!!U?.isActive(`bold`),run:()=>U?.chain().focus().toggleBold().run()},{id:`italic`,icon:s.Italic,label:N.toolbar.italic,isActive:()=>!!U?.isActive(`italic`),run:()=>U?.chain().focus().toggleItalic().run()},{id:`strike`,icon:s.Strikethrough,label:N.toolbar.strike,isActive:()=>!!U?.isActive(`strike`),run:()=>U?.chain().focus().toggleStrike().run()},{id:`bullet-list`,icon:s.List,label:N.toolbar.bulletList,isActive:()=>!!U?.isActive(`bulletList`),run:()=>U?.chain().focus().toggleBulletList().run()},{id:`ordered-list`,icon:s.ListOrdered,label:N.toolbar.orderedList,isActive:()=>!!U?.isActive(`orderedList`),run:()=>U?.chain().focus().toggleOrderedList().run()},{id:`blockquote`,icon:s.Quote,label:N.toolbar.blockquote,isActive:()=>!!U?.isActive(`blockquote`),run:()=>U?.chain().focus().toggleBlockquote().run()},{id:`undo`,icon:s.Undo2,label:N.toolbar.undo,isActive:()=>!1,run:()=>U?.chain().focus().undo().run(),disabled:!U?.can().chain().focus().undo().run()},{id:`redo`,icon:s.Redo2,label:N.toolbar.redo,isActive:()=>!1,run:()=>U?.chain().focus().redo().run(),disabled:!U?.can().chain().focus().redo().run()}],[U,N]),J=g&&U?(0,o.jsx)(_,{editor:U,sourceMode:I,sourceValue:R,maxLength:C,strings:N}):null,Y=typeof i==`string`?i:``,X=Y.length>0&&!P&&U?.isEmpty?(0,o.jsx)(`span`,{className:`text-muted-foreground pointer-events-none absolute left-3 top-2 text-sm`,children:Y}):null;return(0,o.jsxs)(`div`,{className:n.cn(`border-input bg-background rounded-md border`,h&&`opacity-70`,k),children:[(0,o.jsx)(u,{buttons:q,extraToolbarItems:w,hideSourceToggle:D,sourceMode:I,toggleSourceMode:G,disabled:h,hasEditor:!!U,toolbarTrailing:T,strings:N}),I?(0,o.jsx)(`textarea`,{"aria-label":N.sourceLabel,value:R,onChange:K,disabled:h,spellCheck:!1,className:n.cn(`bg-muted/50 w-full resize-y px-3 py-2 font-mono text-xs leading-relaxed focus-visible:outline-none`,h&&`cursor-not-allowed`),style:W}):(0,o.jsxs)(`div`,{className:`relative`,style:W,children:[X,(0,o.jsx)(b,{editor:U,className:n.cn(`h-full`,`[&_.ProseMirror]:h-full`,`[&_.ProseMirror]:min-h-full`,`[&_.ProseMirror]:outline-none`)})]}),!!E&&(0,o.jsx)(`div`,{className:`px-3 pb-2 pt-1`,children:E}),J]})});C.displayName=`TiptapRichTextEditor`;var w=typeof b==`function`&&typeof x==`function`&&typeof S==`object`&&!!S,T=(0,a.forwardRef)(function({value:e,onChange:r,placeholder:i,compact:c=!1,minHeight:l,maxHeight:h,disabled:_=!1,showCounts:b=!1,maxLength:x,extraToolbarItems:S,toolbarTrailing:C,footerSlot:w,hideSourceToggle:T=!1,autoFocus:E=!1,className:D,onCaretChange:O,strings:k},A){let j=t.useStrings(d,k),M=(0,a.useRef)(null),[N,P]=(0,a.useState)(!1),[F,I]=(0,a.useState)(!1),[L,R]=(0,a.useState)(``),z=(0,a.useRef)(v(e)),B=(0,a.useRef)(O);B.current=O,(0,a.useEffect)(()=>{let t=M.current;if(!t||N)return;let n=y(e);v(t.innerHTML)!==v(n)&&(t.innerHTML=n),z.current=v(e)},[N,e]),(0,a.useEffect)(()=>{E&&M.current?.focus()},[E]);let V=(0,a.useCallback)(()=>{let e=M.current,t=v(e?.innerHTML??``);z.current=t,r(t),B.current?.()},[r]);(0,a.useImperativeHandle)(A,()=>({focus:()=>M.current?.focus(),getHTML:()=>v(M.current?.innerHTML??``),setHTML:e=>{let t=v(e);z.current=t,M.current&&(M.current.innerHTML=y(t)),r(t)},insertHTML:e=>{m(M.current,e),V()},isEmpty:()=>v(M.current?.innerHTML??``)===``,clear:()=>{z.current=``,M.current&&(M.current.innerHTML=`<p></p>`),r(``)},getCaretContext:()=>f(),replaceBeforeCaret:(e,t)=>{p(null,e,t,()=>V())}}),[V,r]);let H=(0,a.useMemo)(()=>({minHeight:l??(c?`2rem`:`12rem`),...h?{maxHeight:h,overflowY:`auto`}:{}}),[c,h,l]),U=(0,a.useCallback)(()=>{if(F){let e=v(L);z.current=e,M.current&&(M.current.innerHTML=y(e)),r(e),I(!1);return}R(M.current?.innerHTML??y(e)),I(!0)},[r,F,L,e]),W=(0,a.useCallback)(e=>{let t=e.target.value;R(t);let n=v(t);z.current=n,r(n)},[r]),G=typeof i==`string`?i:``,K=v(z.current)===``,q=G.length>0&&!N&&K?(0,o.jsx)(`span`,{className:`text-muted-foreground pointer-events-none absolute left-3 top-2 text-sm`,children:G}):null,J=(0,a.useMemo)(()=>[{id:`bold`,icon:s.Bold,label:j.toolbar.bold,isActive:()=>!1,run:()=>void 0,disabled:!0},{id:`italic`,icon:s.Italic,label:j.toolbar.italic,isActive:()=>!1,run:()=>void 0,disabled:!0},{id:`strike`,icon:s.Strikethrough,label:j.toolbar.strike,isActive:()=>!1,run:()=>void 0,disabled:!0},{id:`bullet-list`,icon:s.List,label:j.toolbar.bulletList,isActive:()=>!1,run:()=>void 0,disabled:!0},{id:`ordered-list`,icon:s.ListOrdered,label:j.toolbar.orderedList,isActive:()=>!1,run:()=>void 0,disabled:!0},{id:`blockquote`,icon:s.Quote,label:j.toolbar.blockquote,isActive:()=>!1,run:()=>void 0,disabled:!0},{id:`undo`,icon:s.Undo2,label:j.toolbar.undo,isActive:()=>!1,run:()=>void 0,disabled:!0},{id:`redo`,icon:s.Redo2,label:j.toolbar.redo,isActive:()=>!1,run:()=>void 0,disabled:!0}],[j]),Y=F?L.replace(/<[^>]*>/g,``):M.current?.innerText??v(e).replace(/<[^>]*>/g,``),X=b?(0,o.jsx)(g,{text:Y,maxLength:x,strings:j}):null;return(0,o.jsxs)(`div`,{className:n.cn(`border-input bg-background rounded-md border`,_&&`opacity-70`,D),children:[(0,o.jsx)(u,{buttons:J,extraToolbarItems:S,hideSourceToggle:T,sourceMode:F,toggleSourceMode:U,disabled:_,hasEditor:!0,toolbarTrailing:C,strings:j}),F?(0,o.jsx)(`textarea`,{"aria-label":j.sourceLabel,value:L,onChange:W,disabled:_,spellCheck:!1,className:n.cn(`bg-muted/50 w-full resize-y px-3 py-2 font-mono text-xs leading-relaxed focus-visible:outline-none`,_&&`cursor-not-allowed`),style:H}):(0,o.jsxs)(`div`,{className:`relative`,style:H,children:[q,(0,o.jsx)(`div`,{ref:M,role:`textbox`,"aria-label":j.editorLabel,"aria-multiline":`true`,contentEditable:!_,suppressContentEditableWarning:!0,onInput:V,onKeyUp:()=>B.current?.(),onMouseUp:()=>B.current?.(),onFocus:()=>P(!0),onBlur:()=>P(!1),className:n.cn(`prose prose-sm prose-p:my-0.5 prose-p:leading-relaxed prose-headings:my-1 prose-ul:my-1 prose-ol:my-1 prose-li:my-0.5 max-w-none px-3 py-2 text-sm focus-visible:outline-none dark:prose-invert`,`h-full min-h-full`,_&&`cursor-not-allowed`),dangerouslySetInnerHTML:{__html:y(e)}})]}),!!w&&(0,o.jsx)(`div`,{className:`px-3 pb-2 pt-1`,children:w}),X]})});T.displayName=`FallbackRichTextEditor`;var E=(0,a.forwardRef)(function(e,t){return w?(0,o.jsx)(C,{...e,ref:t}):(0,o.jsx)(T,{className:`rich-text-editor--component`,...e,ref:t})});E.displayName=`RichTextEditor`,Object.defineProperty(exports,"i",{enumerable:!0,get:function(){return u}}),Object.defineProperty(exports,"n",{enumerable:!0,get:function(){return g}}),Object.defineProperty(exports,"r",{enumerable:!0,get:function(){return d}}),Object.defineProperty(exports,"t",{enumerable:!0,get:function(){return E}});
|
|
2
|
+
//# sourceMappingURL=rich-text-editor-BXxGNbmI.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rich-text-editor-BXxGNbmI.cjs","names":[],"sources":["../../src/components/features/rich-text-editor/partials/rich-text-editor-toolbar.tsx","../../src/components/features/rich-text-editor/rich-text-editor.strings.ts","../../src/components/features/rich-text-editor/partials/caret-helpers.ts","../../src/components/features/rich-text-editor/partials/counts-footer.tsx","../../src/components/features/rich-text-editor/partials/html-helpers.ts","../../src/components/features/rich-text-editor/partials/rich-text-editor-tiptap.tsx","../../src/components/features/rich-text-editor/partials/rich-text-editor-fallback.tsx","../../src/components/features/rich-text-editor/rich-text-editor.tsx"],"sourcesContent":["import { Code2 } from 'lucide-react';\nimport type { ReactNode } from 'react';\n\nimport { Button } from '@/components/base/buttons/button';\n\nimport type { RichTextEditorStrings } from '../rich-text-editor.strings';\nimport type {\n\tRichTextEditorToolbarItem,\n\tToolbarButtonConfig,\n} from '../rich-text-editor.types';\n\nexport interface RichTextEditorToolbarProps {\n\tbuttons: ToolbarButtonConfig[];\n\textraToolbarItems?: ReadonlyArray<RichTextEditorToolbarItem>;\n\thideSourceToggle?: boolean;\n\tsourceMode: boolean;\n\ttoggleSourceMode: () => void;\n\tdisabled?: boolean;\n\t/**\n\t * The TipTap variant disables built-in buttons until the editor instance\n\t * is ready; the fallback variant simply marks them disabled. This flag\n\t * lets callers force the disabled state without re-deriving it per button.\n\t */\n\thasEditor?: boolean;\n\ttoolbarTrailing?: ReactNode;\n\tstrings: RichTextEditorStrings;\n}\n\nexport function RichTextEditorToolbar({\n\tbuttons,\n\textraToolbarItems,\n\thideSourceToggle = false,\n\tsourceMode,\n\ttoggleSourceMode,\n\tdisabled = false,\n\thasEditor = true,\n\ttoolbarTrailing,\n\tstrings,\n}: RichTextEditorToolbarProps) {\n\tconst hasExtras = (extraToolbarItems?.length ?? 0) > 0;\n\n\treturn (\n\t\t<div className=\"border-border flex flex-wrap items-center gap-1 border-b p-1.5\">\n\t\t\t{buttons.map((button) => {\n\t\t\t\tconst Icon = button.icon;\n\t\t\t\tconst isActive = button.isActive();\n\n\t\t\t\treturn (\n\t\t\t\t\t<Button\n\t\t\t\t\t\tkey={button.id}\n\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\tvariant={isActive ? 'primary' : 'secondary'}\n\t\t\t\t\t\tbuttonStyle={isActive ? 'solid' : 'ghost'}\n\t\t\t\t\t\tsize=\"icon-small\"\n\t\t\t\t\t\tonClick={button.run}\n\t\t\t\t\t\tdisabled={disabled || !hasEditor || sourceMode || button.disabled}\n\t\t\t\t\t\taria-label={button.label}\n\t\t\t\t\t\ttitle={button.label}\n\t\t\t\t\t>\n\t\t\t\t\t\t<Icon className=\"h-3.5 w-3.5\" />\n\t\t\t\t\t</Button>\n\t\t\t\t);\n\t\t\t})}\n\n\t\t\t{!hideSourceToggle && (\n\t\t\t\t<>\n\t\t\t\t\t<div className=\"bg-border mx-1 h-4 w-px\" />\n\n\t\t\t\t\t<Button\n\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\tvariant={sourceMode ? 'primary' : 'secondary'}\n\t\t\t\t\t\tbuttonStyle={sourceMode ? 'solid' : 'ghost'}\n\t\t\t\t\t\tsize=\"icon-small\"\n\t\t\t\t\t\tonClick={toggleSourceMode}\n\t\t\t\t\t\tdisabled={disabled || !hasEditor}\n\t\t\t\t\t\taria-label={strings.toolbar.sourceCode}\n\t\t\t\t\t\ttitle={strings.toolbar.sourceCode}\n\t\t\t\t\t>\n\t\t\t\t\t\t<Code2 className=\"h-3.5 w-3.5\" />\n\t\t\t\t\t</Button>\n\t\t\t\t</>\n\t\t\t)}\n\n\t\t\t{hasExtras && (\n\t\t\t\t<>\n\t\t\t\t\t<div className=\"bg-border mx-1 h-4 w-px\" />\n\t\t\t\t\t{extraToolbarItems?.map((item) => {\n\t\t\t\t\t\tconst Icon = item.icon;\n\t\t\t\t\t\tconst isActive = item.isActive?.() ?? false;\n\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\t\tkey={item.id}\n\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\tvariant={isActive ? 'primary' : 'secondary'}\n\t\t\t\t\t\t\t\tbuttonStyle={isActive ? 'solid' : 'ghost'}\n\t\t\t\t\t\t\t\tsize=\"icon-small\"\n\t\t\t\t\t\t\t\tonClick={item.onClick}\n\t\t\t\t\t\t\t\tdisabled={disabled || !hasEditor || sourceMode || item.disabled}\n\t\t\t\t\t\t\t\taria-label={item.label}\n\t\t\t\t\t\t\t\ttitle={item.label}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<Icon className=\"h-3.5 w-3.5\" />\n\t\t\t\t\t\t\t</Button>\n\t\t\t\t\t\t);\n\t\t\t\t\t})}\n\t\t\t\t</>\n\t\t\t)}\n\n\t\t\t{!!toolbarTrailing && (\n\t\t\t\t<div className=\"ml-auto flex items-center gap-1\">{toolbarTrailing}</div>\n\t\t\t)}\n\t\t</div>\n\t);\n}\n\nRichTextEditorToolbar.displayName = 'RichTextEditorToolbar';\n","/**\n * Default user-facing strings for `<RichTextEditor>`.\n *\n * Consumers wire backend i18n at the call site:\n *\n * <RichTextEditor strings={{ toolbar: { bold: t('editor.bold') } }} … />\n */\n\nexport interface RichTextEditorStrings {\n\t/** Accessible label for the editable rich-text surface. */\n\teditorLabel: string;\n\t/** Accessible label for the HTML source textarea. */\n\tsourceLabel: string;\n\t/** Toolbar button labels (used for `aria-label` and tooltip `title`). */\n\ttoolbar: {\n\t\tbold: string;\n\t\titalic: string;\n\t\tstrike: string;\n\t\tbulletList: string;\n\t\torderedList: string;\n\t\tblockquote: string;\n\t\tundo: string;\n\t\tredo: string;\n\t\tsourceCode: string;\n\t};\n\t/** Footer count labels — `{n}` is replaced with the count. */\n\tcounts: {\n\t\tcharacters: string;\n\t\twords: string;\n\t\tmax: string;\n\t};\n}\n\nexport const defaultRichTextEditorStrings: RichTextEditorStrings = {\n\teditorLabel: 'Rich text editor',\n\tsourceLabel: 'HTML source',\n\ttoolbar: {\n\t\tbold: 'Bold',\n\t\titalic: 'Italic',\n\t\tstrike: 'Strike',\n\t\tbulletList: 'Bullet list',\n\t\torderedList: 'Ordered list',\n\t\tblockquote: 'Quote',\n\t\tundo: 'Undo',\n\t\tredo: 'Redo',\n\t\tsourceCode: 'Source code',\n\t},\n\tcounts: {\n\t\tcharacters: 'characters',\n\t\twords: 'words',\n\t\tmax: 'max',\n\t},\n};\n","/**\n * Caret-introspection helpers used by `<RichTextEditor>` to expose the\n * text before the caret and replace a leading run of characters with\n * inline HTML — the building blocks for `@`-mention chips and similar\n * inline triggers.\n */\nimport type { RichTextCaretContext, TiptapEditor } from '../rich-text-editor.types';\n\n/**\n * Read the current selection's caret context.\n *\n * Walks back from the caret through the current text node and any\n * preceding sibling text nodes inside the same block-level container\n * (paragraph / list-item / heading) collecting plain text. Returns the\n * accumulated text plus the caret's bounding rect when available.\n *\n * Returns `null` when there is no live selection or the selection isn't\n * a text caret inside a contenteditable.\n */\nexport function readCaretContext(): RichTextCaretContext | null {\n\tif (typeof window === 'undefined') return null;\n\tconst sel = window.getSelection();\n\tif (!sel || sel.rangeCount === 0) return null;\n\tconst range = sel.getRangeAt(0);\n\tif (!range.collapsed) return null;\n\n\tconst startNode = range.startContainer;\n\tconst startOffset = range.startOffset;\n\n\tlet block: Node | null = startNode;\n\twhile (block && block.nodeType !== Node.ELEMENT_NODE) {\n\t\tblock = block.parentNode;\n\t}\n\tif (!block) return null;\n\tconst editable =\n\t\t(block as Element).closest('[contenteditable=\"true\"]') ??\n\t\t(block as Element).closest('.ProseMirror');\n\tif (!editable) return null;\n\n\tlet text = '';\n\tif (startNode.nodeType === Node.TEXT_NODE) {\n\t\ttext = (startNode.textContent ?? '').slice(0, startOffset);\n\t}\n\n\tlet cursor: Node | null = startNode;\n\twhile (cursor && cursor !== editable && cursor !== block) {\n\t\tlet prev: Node | null = cursor.previousSibling;\n\t\twhile (prev) {\n\t\t\ttext = (prev.textContent ?? '') + text;\n\t\t\tprev = prev.previousSibling;\n\t\t}\n\t\tcursor = cursor.parentNode;\n\t\tif (cursor && (cursor as Element).matches?.('p, li, h1, h2, h3, h4, h5, h6, blockquote')) {\n\t\t\tbreak;\n\t\t}\n\t}\n\n\tlet rect: RichTextCaretContext['rect'];\n\tconst r = range.getBoundingClientRect();\n\tif (r && (r.top || r.left || r.right || r.bottom)) {\n\t\trect = { top: r.top, left: r.left, bottom: r.bottom, right: r.right };\n\t}\n\n\treturn { textBefore: text, rect };\n}\n\n/**\n * Extend the selection backwards by `length` characters, then insert\n * `html`. The selection extension means `editor.insertContent` (or the\n * fallback's `range.deleteContents()` + insert) replaces the trigger\n * range with the chip atomically — no manual text-content mutation, no\n * timing races between \"delete\" and \"insert\".\n */\nexport function replaceBeforeCaret(\n\teditor: TiptapEditor | null,\n\tlength: number,\n\thtml: string,\n\tnotifyChange: (next: string) => void,\n): void {\n\tif (typeof window === 'undefined') return;\n\tconst sel = window.getSelection();\n\tif (!sel || sel.rangeCount === 0) return;\n\tconst caret = sel.getRangeAt(0);\n\tif (!caret.collapsed) return;\n\n\tlet remaining = length;\n\tlet startNode: Node = caret.startContainer;\n\tlet startOffset = caret.startOffset;\n\n\twhile (remaining > 0) {\n\t\tif (startNode.nodeType === Node.TEXT_NODE) {\n\t\t\tconst take = Math.min(startOffset, remaining);\n\t\t\tstartOffset -= take;\n\t\t\tremaining -= take;\n\t\t\tif (remaining === 0) break;\n\t\t}\n\t\tconst prev = previousTextNode(startNode);\n\t\tif (!prev) break;\n\t\tstartNode = prev;\n\t\tstartOffset = prev.textContent?.length ?? 0;\n\t}\n\n\tconst range = document.createRange();\n\trange.setStart(startNode, startOffset);\n\trange.setEnd(caret.endContainer, caret.endOffset);\n\tsel.removeAllRanges();\n\tsel.addRange(range);\n\n\tif (editor) {\n\t\teditor.chain().focus().insertContent(html).run();\n\t\tnotifyChange(editor.getHTML());\n\t\treturn;\n\t}\n\n\trange.deleteContents();\n\tconst fragment = document.createRange().createContextualFragment(html);\n\trange.insertNode(fragment);\n\tsel.collapseToEnd();\n\tconst editable =\n\t\t(startNode as Element | null)?.parentElement?.closest?.('[contenteditable=\"true\"]') ?? null;\n\tif (editable) notifyChange((editable as HTMLElement).innerHTML);\n}\n\nexport function insertHtmlIntoEditable(editable: HTMLElement | null, html: string): void {\n\tif (typeof window === 'undefined' || !editable) return;\n\teditable.focus();\n\n\tconst sel = window.getSelection();\n\tif (!sel || sel.rangeCount === 0) {\n\t\teditable.insertAdjacentHTML('beforeend', html);\n\t\treturn;\n\t}\n\n\tconst range = sel.getRangeAt(0);\n\tif (!editable.contains(range.commonAncestorContainer)) {\n\t\teditable.insertAdjacentHTML('beforeend', html);\n\t\treturn;\n\t}\n\n\trange.deleteContents();\n\tconst fragment = document.createRange().createContextualFragment(html);\n\trange.insertNode(fragment);\n\trange.collapse(false);\n\tsel.removeAllRanges();\n\tsel.addRange(range);\n}\n\nfunction previousTextNode(node: Node): Node | null {\n\tlet current: Node | null = node;\n\twhile (current) {\n\t\tif (current.previousSibling) {\n\t\t\tcurrent = current.previousSibling;\n\t\t\twhile (current && current.lastChild) {\n\t\t\t\tcurrent = current.lastChild;\n\t\t\t}\n\t\t\tif (current && current.nodeType === Node.TEXT_NODE) return current;\n\t\t\tcontinue;\n\t\t}\n\t\tcurrent = current.parentNode;\n\t\tif (!current || (current as Element).matches?.('p, li, h1, h2, h3, h4, h5, h6, blockquote, [contenteditable=\"true\"]')) {\n\t\t\treturn null;\n\t\t}\n\t}\n\treturn null;\n}\n","import { Text } from '@/components/typography';\nimport { cn } from '@/lib/utils';\n\nimport type { RichTextEditorStrings } from '../rich-text-editor.strings';\nimport type { TiptapEditor } from '../rich-text-editor.types';\n\ninterface CountsFooterTextProps {\n\ttext: string;\n\tmaxLength?: number;\n\tstrings: RichTextEditorStrings;\n}\n\nexport function CountsFooterText({ text, maxLength, strings }: CountsFooterTextProps) {\n\tconst chars = text.length;\n\tconst words = text.trim().length > 0 ? text.trim().split(/\\s+/).length : 0;\n\tconst overLimit = typeof maxLength === 'number' && chars > maxLength;\n\n\treturn (\n\t\t<div className=\"border-border flex items-center justify-end gap-3 border-t px-3 py-1.5\">\n\t\t\t<Text\n\t\t\t\ttag=\"span\"\n\t\t\t\tsize=\"xs\"\n\t\t\t\ttype={overLimit ? 'error' : 'secondary'}\n\t\t\t\tweight={overLimit ? 'medium' : 'regular'}\n\t\t\t\tclassName={cn('tabular-nums')}\n\t\t\t>\n\t\t\t\t{chars}\n\t\t\t\t{typeof maxLength === 'number' ? ` / ${maxLength}` : ''} {strings.counts.characters}\n\t\t\t</Text>\n\t\t\t<Text tag=\"span\" size=\"xs\" type=\"secondary\" className=\"tabular-nums\">\n\t\t\t\t{words} {strings.counts.words}\n\t\t\t</Text>\n\t\t</div>\n\t);\n}\n\nCountsFooterText.displayName = 'CountsFooterText';\n\ninterface CountsFooterProps {\n\teditor: TiptapEditor;\n\tsourceMode: boolean;\n\tsourceValue: string;\n\tmaxLength?: number;\n\tstrings: RichTextEditorStrings;\n}\n\nexport function CountsFooter({\n\teditor,\n\tsourceMode,\n\tsourceValue,\n\tmaxLength,\n\tstrings,\n}: CountsFooterProps) {\n\tconst text = sourceMode\n\t\t? sourceValue.replace(/<[^>]*>/g, '')\n\t\t: (editor?.getText() ?? '');\n\n\treturn <CountsFooterText text={text} maxLength={maxLength} strings={strings} />;\n}\n\nCountsFooter.displayName = 'CountsFooter';\n","/**\n * Plain HTML normalization shared by the TipTap and contenteditable\n * fallback editors. Keeping these out of the React tree means the\n * editor partials stay focused on rendering.\n */\n\nexport function normalizeHtml(value: string): string {\n\tconst trimmed = value.trim();\n\n\tif (trimmed === '' || trimmed === '<p></p>' || trimmed === '<p><br></p>') {\n\t\treturn '';\n\t}\n\n\treturn trimmed;\n}\n\nexport function toEditorContent(value: string): string {\n\tconst normalized = normalizeHtml(value);\n\treturn normalized === '' ? '<p></p>' : normalized;\n}\n","import {\n\tforwardRef,\n\tuseCallback,\n\tuseEffect,\n\tuseImperativeHandle,\n\tuseMemo,\n\tuseRef,\n\tuseState,\n} from 'react';\nimport {\n\tBold,\n\tItalic,\n\tList,\n\tListOrdered,\n\tQuote,\n\tRedo2,\n\tStrikethrough,\n\tUndo2,\n} from 'lucide-react';\nimport * as TiptapReact from '@tiptap/react';\nimport * as StarterKitModule from '@tiptap/starter-kit';\n\nimport { useStrings } from '@/lib/strings';\nimport { cn } from '@/lib/utils';\n\nimport { defaultRichTextEditorStrings } from '../rich-text-editor.strings';\nimport type {\n\tRichTextEditorHandle,\n\tRichTextEditorProps,\n\tToolbarButtonConfig,\n} from '../rich-text-editor.types';\nimport { readCaretContext, replaceBeforeCaret } from './caret-helpers';\nimport { CountsFooter } from './counts-footer';\nimport { normalizeHtml, toEditorContent } from './html-helpers';\nimport { RichTextEditorToolbar } from './rich-text-editor-toolbar';\n\nconst EditorContent = TiptapReact.EditorContent;\nconst useTiptapEditor = TiptapReact.useEditor;\nconst StarterKit =\n\t'default' in StarterKitModule ? StarterKitModule.default : StarterKitModule;\n\nexport const TiptapRichTextEditor = forwardRef<RichTextEditorHandle, RichTextEditorProps>(function TiptapRichTextEditor(\n\t{\n\t\tvalue,\n\t\tonChange,\n\t\tplaceholder,\n\t\tcompact = false,\n\t\tminHeight,\n\t\tmaxHeight,\n\t\tdisabled = false,\n\t\tshowCounts = false,\n\t\tmaxLength,\n\t\textraToolbarItems,\n\t\ttoolbarTrailing,\n\t\tfooterSlot,\n\t\thideSourceToggle = false,\n\t\tautoFocus = false,\n\t\tclassName,\n\t\tonCaretChange,\n\t\tstrings: stringsProp,\n\t},\n\tref,\n) {\n\tconst strings = useStrings(defaultRichTextEditorStrings, stringsProp);\n\tconst [isFocused, setIsFocused] = useState(false);\n\tconst [sourceMode, setSourceMode] = useState(false);\n\tconst [sourceValue, setSourceValue] = useState('');\n\tconst isFocusedRef = useRef(false);\n\tconst externalValueRef = useRef<string>(normalizeHtml(value));\n\tconst onCaretChangeRef = useRef(onCaretChange);\n\tonCaretChangeRef.current = onCaretChange;\n\n\tconst editor = useTiptapEditor({\n\t\textensions: [StarterKit],\n\t\tcontent: toEditorContent(value),\n\t\teditable: !disabled,\n\t\timmediatelyRender: false,\n\t\tautofocus: autoFocus ? 'end' : false,\n\t\tonFocus: () => {\n\t\t\tisFocusedRef.current = true;\n\t\t\tsetIsFocused(true);\n\t\t},\n\t\tonBlur: () => {\n\t\t\tisFocusedRef.current = false;\n\t\t\tsetIsFocused(false);\n\t\t},\n\t\tonUpdate: ({ editor: currentEditor }: { editor: { getHTML: () => string } }) => {\n\t\t\tconst html = normalizeHtml(currentEditor.getHTML());\n\t\t\tif (!isFocusedRef.current) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (html !== externalValueRef.current) {\n\t\t\t\texternalValueRef.current = html;\n\t\t\t\tonChange(html);\n\t\t\t}\n\n\t\t\tonCaretChangeRef.current?.();\n\t\t},\n\t\teditorProps: {\n\t\t\tattributes: {\n\t\t\t\trole: 'textbox',\n\t\t\t\t'aria-label': strings.editorLabel,\n\t\t\t\t'aria-multiline': 'true',\n\t\t\t\tclass: 'prose prose-sm prose-p:my-0.5 prose-p:leading-relaxed prose-headings:my-1 prose-ul:my-1 prose-ol:my-1 prose-li:my-0.5 max-w-none px-3 py-2 text-sm focus-visible:outline-none dark:prose-invert',\n\t\t\t},\n\t\t},\n\t});\n\n\tuseEffect(() => {\n\t\tif (!editor) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst current = normalizeHtml(editor.getHTML());\n\t\tconst next = normalizeHtml(value);\n\t\texternalValueRef.current = next;\n\n\t\tif (current !== next) {\n\t\t\teditor.commands.setContent(toEditorContent(next), { emitUpdate: false });\n\t\t}\n\t}, [editor, value]);\n\n\tuseEffect(() => {\n\t\tif (!editor) {\n\t\t\treturn;\n\t\t}\n\n\t\teditor.setEditable(!disabled);\n\t}, [disabled, editor]);\n\n\tuseEffect(() => {\n\t\tif (typeof document === 'undefined') return;\n\t\tconst handler = () => {\n\t\t\tif (!isFocusedRef.current) return;\n\t\t\tonCaretChangeRef.current?.();\n\t\t};\n\t\tdocument.addEventListener('selectionchange', handler);\n\t\treturn () => document.removeEventListener('selectionchange', handler);\n\t}, []);\n\n\tuseImperativeHandle(\n\t\tref,\n\t\t() => ({\n\t\t\tfocus: () => {\n\t\t\t\teditor?.chain().focus().run();\n\t\t\t},\n\t\t\tgetHTML: () => normalizeHtml(editor?.getHTML() ?? ''),\n\t\t\tsetHTML: (html: string) => {\n\t\t\t\tconst next = normalizeHtml(html);\n\t\t\t\texternalValueRef.current = next;\n\t\t\t\teditor?.commands.setContent(toEditorContent(next), { emitUpdate: false });\n\t\t\t\tonChange(next);\n\t\t\t},\n\t\t\tinsertHTML: (html: string) => {\n\t\t\t\tif (!editor) return;\n\t\t\t\teditor.chain().focus().insertContent(html).run();\n\t\t\t},\n\t\t\tisEmpty: () => normalizeHtml(editor?.getHTML() ?? '') === '',\n\t\t\tclear: () => {\n\t\t\t\texternalValueRef.current = '';\n\t\t\t\teditor?.commands.setContent('<p></p>', { emitUpdate: false });\n\t\t\t\tonChange('');\n\t\t\t},\n\t\t\tgetCaretContext: () => readCaretContext(),\n\t\t\treplaceBeforeCaret: (length: number, html: string) => {\n\t\t\t\treplaceBeforeCaret(editor, length, html, (next) => {\n\t\t\t\t\texternalValueRef.current = normalizeHtml(next);\n\t\t\t\t\tonChange(externalValueRef.current);\n\t\t\t\t});\n\t\t\t},\n\t\t}),\n\t\t[editor, onChange],\n\t);\n\n\tconst contentStyle = useMemo(\n\t\t() => ({\n\t\t\tminHeight: minHeight ?? (compact ? '2rem' : '12rem'),\n\t\t\t...(maxHeight ? { maxHeight, overflowY: 'auto' as const } : {}),\n\t\t}),\n\t\t[compact, maxHeight, minHeight],\n\t);\n\n\tconst toggleSourceMode = useCallback(() => {\n\t\tif (!editor) return;\n\n\t\tif (sourceMode) {\n\t\t\tconst html = toEditorContent(sourceValue);\n\t\t\teditor.commands.setContent(html, { emitUpdate: false });\n\t\t\tconst normalized = normalizeHtml(sourceValue);\n\t\t\texternalValueRef.current = normalized;\n\t\t\tonChange(normalized);\n\t\t\tsetSourceMode(false);\n\t\t} else {\n\t\t\tsetSourceValue(editor.getHTML());\n\t\t\tsetSourceMode(true);\n\t\t}\n\t}, [editor, onChange, sourceMode, sourceValue]);\n\n\tconst handleSourceChange = useCallback(\n\t\t(e: React.ChangeEvent<HTMLTextAreaElement>) => {\n\t\t\tconst next = e.target.value;\n\t\t\tsetSourceValue(next);\n\t\t\tconst normalized = normalizeHtml(next);\n\t\t\texternalValueRef.current = normalized;\n\t\t\tonChange(normalized);\n\t\t},\n\t\t[onChange],\n\t);\n\n\tconst toolbarButtons = useMemo<ToolbarButtonConfig[]>(\n\t\t() => [\n\t\t\t{\n\t\t\t\tid: 'bold',\n\t\t\t\ticon: Bold,\n\t\t\t\tlabel: strings.toolbar.bold,\n\t\t\t\tisActive: () => Boolean(editor?.isActive('bold')),\n\t\t\t\trun: () => editor?.chain().focus().toggleBold().run(),\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: 'italic',\n\t\t\t\ticon: Italic,\n\t\t\t\tlabel: strings.toolbar.italic,\n\t\t\t\tisActive: () => Boolean(editor?.isActive('italic')),\n\t\t\t\trun: () => editor?.chain().focus().toggleItalic().run(),\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: 'strike',\n\t\t\t\ticon: Strikethrough,\n\t\t\t\tlabel: strings.toolbar.strike,\n\t\t\t\tisActive: () => Boolean(editor?.isActive('strike')),\n\t\t\t\trun: () => editor?.chain().focus().toggleStrike().run(),\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: 'bullet-list',\n\t\t\t\ticon: List,\n\t\t\t\tlabel: strings.toolbar.bulletList,\n\t\t\t\tisActive: () => Boolean(editor?.isActive('bulletList')),\n\t\t\t\trun: () => editor?.chain().focus().toggleBulletList().run(),\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: 'ordered-list',\n\t\t\t\ticon: ListOrdered,\n\t\t\t\tlabel: strings.toolbar.orderedList,\n\t\t\t\tisActive: () => Boolean(editor?.isActive('orderedList')),\n\t\t\t\trun: () => editor?.chain().focus().toggleOrderedList().run(),\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: 'blockquote',\n\t\t\t\ticon: Quote,\n\t\t\t\tlabel: strings.toolbar.blockquote,\n\t\t\t\tisActive: () => Boolean(editor?.isActive('blockquote')),\n\t\t\t\trun: () => editor?.chain().focus().toggleBlockquote().run(),\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: 'undo',\n\t\t\t\ticon: Undo2,\n\t\t\t\tlabel: strings.toolbar.undo,\n\t\t\t\tisActive: () => false,\n\t\t\t\trun: () => editor?.chain().focus().undo().run(),\n\t\t\t\tdisabled: !editor?.can().chain().focus().undo().run(),\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: 'redo',\n\t\t\t\ticon: Redo2,\n\t\t\t\tlabel: strings.toolbar.redo,\n\t\t\t\tisActive: () => false,\n\t\t\t\trun: () => editor?.chain().focus().redo().run(),\n\t\t\t\tdisabled: !editor?.can().chain().focus().redo().run(),\n\t\t\t},\n\t\t],\n\t\t[editor, strings],\n\t);\n\n\tconst countsFooter =\n\t\tshowCounts && editor ? (\n\t\t\t<CountsFooter\n\t\t\t\teditor={editor}\n\t\t\t\tsourceMode={sourceMode}\n\t\t\t\tsourceValue={sourceValue}\n\t\t\t\tmaxLength={maxLength}\n\t\t\t\tstrings={strings}\n\t\t\t/>\n\t\t) : null;\n\n\tconst placeholderText = typeof placeholder === 'string' ? placeholder : '';\n\tconst showPlaceholder =\n\t\tplaceholderText.length > 0 && !isFocused && Boolean(editor?.isEmpty);\n\tconst placeholderNode = showPlaceholder ? (\n\t\t<span className=\"text-muted-foreground pointer-events-none absolute left-3 top-2 text-sm\">\n\t\t\t{placeholderText}\n\t\t</span>\n\t) : null;\n\n\treturn (\n\t\t<div\n\t\t\tclassName={cn(\n\t\t\t\t'border-input bg-background rounded-md border',\n\t\t\t\tdisabled && 'opacity-70',\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t>\n\t\t\t<RichTextEditorToolbar\n\t\t\t\tbuttons={toolbarButtons}\n\t\t\t\textraToolbarItems={extraToolbarItems}\n\t\t\t\thideSourceToggle={hideSourceToggle}\n\t\t\t\tsourceMode={sourceMode}\n\t\t\t\ttoggleSourceMode={toggleSourceMode}\n\t\t\t\tdisabled={disabled}\n\t\t\t\thasEditor={Boolean(editor)}\n\t\t\t\ttoolbarTrailing={toolbarTrailing}\n\t\t\t\tstrings={strings}\n\t\t\t/>\n\n\t\t\t{sourceMode ? (\n\t\t\t\t<textarea\n\t\t\t\t\taria-label={strings.sourceLabel}\n\t\t\t\t\tvalue={sourceValue}\n\t\t\t\t\tonChange={handleSourceChange}\n\t\t\t\t\tdisabled={disabled}\n\t\t\t\t\tspellCheck={false}\n\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t'bg-muted/50 w-full resize-y px-3 py-2 font-mono text-xs leading-relaxed focus-visible:outline-none',\n\t\t\t\t\t\tdisabled && 'cursor-not-allowed',\n\t\t\t\t\t)}\n\t\t\t\t\tstyle={contentStyle}\n\t\t\t\t/>\n\t\t\t) : (\n\t\t\t\t<div className=\"relative\" style={contentStyle}>\n\t\t\t\t\t{placeholderNode}\n\n\t\t\t\t\t<EditorContent\n\t\t\t\t\t\teditor={editor}\n\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t'h-full',\n\t\t\t\t\t\t\t'[&_.ProseMirror]:h-full',\n\t\t\t\t\t\t\t'[&_.ProseMirror]:min-h-full',\n\t\t\t\t\t\t\t'[&_.ProseMirror]:outline-none',\n\t\t\t\t\t\t)}\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t)}\n\n\t\t\t{!!footerSlot && (\n\t\t\t\t<div className=\"px-3 pb-2 pt-1\">{footerSlot}</div>\n\t\t\t)}\n\n\t\t\t{countsFooter}\n\t\t</div>\n\t);\n});\n\nTiptapRichTextEditor.displayName = 'TiptapRichTextEditor';\n\nexport const hasTiptapRuntime =\n\ttypeof EditorContent === 'function' &&\n\ttypeof useTiptapEditor === 'function' &&\n\ttypeof StarterKit === 'object' &&\n\tStarterKit !== null;\n","import {\n\tforwardRef,\n\tuseCallback,\n\tuseEffect,\n\tuseImperativeHandle,\n\tuseMemo,\n\tuseRef,\n\tuseState,\n} from 'react';\nimport {\n\tBold,\n\tItalic,\n\tList,\n\tListOrdered,\n\tQuote,\n\tRedo2,\n\tStrikethrough,\n\tUndo2,\n} from 'lucide-react';\n\nimport { useStrings } from '@/lib/strings';\nimport { cn } from '@/lib/utils';\n\nimport { defaultRichTextEditorStrings } from '../rich-text-editor.strings';\nimport type {\n\tRichTextEditorHandle,\n\tRichTextEditorProps,\n\tToolbarButtonConfig,\n} from '../rich-text-editor.types';\nimport {\n\tinsertHtmlIntoEditable,\n\treadCaretContext,\n\treplaceBeforeCaret,\n} from './caret-helpers';\nimport { CountsFooterText } from './counts-footer';\nimport { normalizeHtml, toEditorContent } from './html-helpers';\nimport { RichTextEditorToolbar } from './rich-text-editor-toolbar';\n\n/**\n * Fallback editor used when the TipTap runtime is unavailable (e.g. in\n * environments where the package failed to load). Renders a\n * `contenteditable` surface with the same imperative handle so callers\n * never need to care which variant they got.\n */\nexport const FallbackRichTextEditor = forwardRef<RichTextEditorHandle, RichTextEditorProps>(function FallbackRichTextEditor(\n\t{\n\t\tvalue,\n\t\tonChange,\n\t\tplaceholder,\n\t\tcompact = false,\n\t\tminHeight,\n\t\tmaxHeight,\n\t\tdisabled = false,\n\t\tshowCounts = false,\n\t\tmaxLength,\n\t\textraToolbarItems,\n\t\ttoolbarTrailing,\n\t\tfooterSlot,\n\t\thideSourceToggle = false,\n\t\tautoFocus = false,\n\t\tclassName,\n\t\tonCaretChange,\n\t\tstrings: stringsProp,\n\t},\n\tref,\n) {\n\tconst strings = useStrings(defaultRichTextEditorStrings, stringsProp);\n\tconst editableRef = useRef<HTMLDivElement>(null);\n\tconst [isFocused, setIsFocused] = useState(false);\n\tconst [sourceMode, setSourceMode] = useState(false);\n\tconst [sourceValue, setSourceValue] = useState('');\n\tconst externalValueRef = useRef<string>(normalizeHtml(value));\n\tconst onCaretChangeRef = useRef(onCaretChange);\n\tonCaretChangeRef.current = onCaretChange;\n\n\tuseEffect(() => {\n\t\tconst editable = editableRef.current;\n\t\tif (!editable || isFocused) return;\n\t\tconst next = toEditorContent(value);\n\t\tif (normalizeHtml(editable.innerHTML) !== normalizeHtml(next)) {\n\t\t\teditable.innerHTML = next;\n\t\t}\n\t\texternalValueRef.current = normalizeHtml(value);\n\t}, [isFocused, value]);\n\n\tuseEffect(() => {\n\t\tif (!autoFocus) return;\n\t\teditableRef.current?.focus();\n\t}, [autoFocus]);\n\n\tconst emitEditableChange = useCallback(() => {\n\t\tconst editable = editableRef.current;\n\t\tconst html = normalizeHtml(editable?.innerHTML ?? '');\n\t\texternalValueRef.current = html;\n\t\tonChange(html);\n\t\tonCaretChangeRef.current?.();\n\t}, [onChange]);\n\n\tuseImperativeHandle(\n\t\tref,\n\t\t() => ({\n\t\t\tfocus: () => editableRef.current?.focus(),\n\t\t\tgetHTML: () => normalizeHtml(editableRef.current?.innerHTML ?? ''),\n\t\t\tsetHTML: (html: string) => {\n\t\t\t\tconst next = normalizeHtml(html);\n\t\t\t\texternalValueRef.current = next;\n\t\t\t\tif (editableRef.current) {\n\t\t\t\t\teditableRef.current.innerHTML = toEditorContent(next);\n\t\t\t\t}\n\t\t\t\tonChange(next);\n\t\t\t},\n\t\t\tinsertHTML: (html: string) => {\n\t\t\t\tinsertHtmlIntoEditable(editableRef.current, html);\n\t\t\t\temitEditableChange();\n\t\t\t},\n\t\t\tisEmpty: () => normalizeHtml(editableRef.current?.innerHTML ?? '') === '',\n\t\t\tclear: () => {\n\t\t\t\texternalValueRef.current = '';\n\t\t\t\tif (editableRef.current) editableRef.current.innerHTML = '<p></p>';\n\t\t\t\tonChange('');\n\t\t\t},\n\t\t\tgetCaretContext: () => readCaretContext(),\n\t\t\treplaceBeforeCaret: (length: number, html: string) => {\n\t\t\t\treplaceBeforeCaret(null, length, html, () => emitEditableChange());\n\t\t\t},\n\t\t}),\n\t\t[emitEditableChange, onChange],\n\t);\n\n\tconst contentStyle = useMemo(\n\t\t() => ({\n\t\t\tminHeight: minHeight ?? (compact ? '2rem' : '12rem'),\n\t\t\t...(maxHeight ? { maxHeight, overflowY: 'auto' as const } : {}),\n\t\t}),\n\t\t[compact, maxHeight, minHeight],\n\t);\n\n\tconst toggleSourceMode = useCallback(() => {\n\t\tif (sourceMode) {\n\t\t\tconst normalized = normalizeHtml(sourceValue);\n\t\t\texternalValueRef.current = normalized;\n\t\t\tif (editableRef.current) {\n\t\t\t\teditableRef.current.innerHTML = toEditorContent(normalized);\n\t\t\t}\n\t\t\tonChange(normalized);\n\t\t\tsetSourceMode(false);\n\t\t\treturn;\n\t\t}\n\t\tsetSourceValue(editableRef.current?.innerHTML ?? toEditorContent(value));\n\t\tsetSourceMode(true);\n\t}, [onChange, sourceMode, sourceValue, value]);\n\n\tconst handleSourceChange = useCallback(\n\t\t(e: React.ChangeEvent<HTMLTextAreaElement>) => {\n\t\t\tconst next = e.target.value;\n\t\t\tsetSourceValue(next);\n\t\t\tconst normalized = normalizeHtml(next);\n\t\t\texternalValueRef.current = normalized;\n\t\t\tonChange(normalized);\n\t\t},\n\t\t[onChange],\n\t);\n\n\tconst placeholderText = typeof placeholder === 'string' ? placeholder : '';\n\tconst isEmpty = normalizeHtml(externalValueRef.current) === '';\n\tconst placeholderNode =\n\t\tplaceholderText.length > 0 && !isFocused && isEmpty ? (\n\t\t\t<span className=\"text-muted-foreground pointer-events-none absolute left-3 top-2 text-sm\">\n\t\t\t\t{placeholderText}\n\t\t\t</span>\n\t\t) : null;\n\n\tconst toolbarButtons = useMemo<ToolbarButtonConfig[]>(\n\t\t() => [\n\t\t\t{ id: 'bold', icon: Bold, label: strings.toolbar.bold, isActive: () => false, run: () => undefined, disabled: true },\n\t\t\t{ id: 'italic', icon: Italic, label: strings.toolbar.italic, isActive: () => false, run: () => undefined, disabled: true },\n\t\t\t{ id: 'strike', icon: Strikethrough, label: strings.toolbar.strike, isActive: () => false, run: () => undefined, disabled: true },\n\t\t\t{ id: 'bullet-list', icon: List, label: strings.toolbar.bulletList, isActive: () => false, run: () => undefined, disabled: true },\n\t\t\t{ id: 'ordered-list', icon: ListOrdered, label: strings.toolbar.orderedList, isActive: () => false, run: () => undefined, disabled: true },\n\t\t\t{ id: 'blockquote', icon: Quote, label: strings.toolbar.blockquote, isActive: () => false, run: () => undefined, disabled: true },\n\t\t\t{ id: 'undo', icon: Undo2, label: strings.toolbar.undo, isActive: () => false, run: () => undefined, disabled: true },\n\t\t\t{ id: 'redo', icon: Redo2, label: strings.toolbar.redo, isActive: () => false, run: () => undefined, disabled: true },\n\t\t],\n\t\t[strings],\n\t);\n\n\tconst text = sourceMode\n\t\t? sourceValue.replace(/<[^>]*>/g, '')\n\t\t: (editableRef.current?.innerText ?? normalizeHtml(value).replace(/<[^>]*>/g, ''));\n\tconst countsFooter =\n\t\tshowCounts ? (\n\t\t\t<CountsFooterText text={text} maxLength={maxLength} strings={strings} />\n\t\t) : null;\n\n\treturn (\n\t\t<div\n\t\t\tclassName={cn(\n\t\t\t\t'border-input bg-background rounded-md border',\n\t\t\t\tdisabled && 'opacity-70',\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t>\n\t\t\t<RichTextEditorToolbar\n\t\t\t\tbuttons={toolbarButtons}\n\t\t\t\textraToolbarItems={extraToolbarItems}\n\t\t\t\thideSourceToggle={hideSourceToggle}\n\t\t\t\tsourceMode={sourceMode}\n\t\t\t\ttoggleSourceMode={toggleSourceMode}\n\t\t\t\tdisabled={disabled}\n\t\t\t\thasEditor\n\t\t\t\ttoolbarTrailing={toolbarTrailing}\n\t\t\t\tstrings={strings}\n\t\t\t/>\n\n\t\t\t{sourceMode ? (\n\t\t\t\t<textarea\n\t\t\t\t\taria-label={strings.sourceLabel}\n\t\t\t\t\tvalue={sourceValue}\n\t\t\t\t\tonChange={handleSourceChange}\n\t\t\t\t\tdisabled={disabled}\n\t\t\t\t\tspellCheck={false}\n\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t'bg-muted/50 w-full resize-y px-3 py-2 font-mono text-xs leading-relaxed focus-visible:outline-none',\n\t\t\t\t\t\tdisabled && 'cursor-not-allowed',\n\t\t\t\t\t)}\n\t\t\t\t\tstyle={contentStyle}\n\t\t\t\t/>\n\t\t\t) : (\n\t\t\t\t<div className=\"relative\" style={contentStyle}>\n\t\t\t\t\t{placeholderNode}\n\t\t\t\t\t<div\n\t\t\t\t\t\tref={editableRef}\n\t\t\t\t\t\trole=\"textbox\"\n\t\t\t\t\t\taria-label={strings.editorLabel}\n\t\t\t\t\t\taria-multiline=\"true\"\n\t\t\t\t\t\tcontentEditable={!disabled}\n\t\t\t\t\t\tsuppressContentEditableWarning\n\t\t\t\t\t\tonInput={emitEditableChange}\n\t\t\t\t\t\tonKeyUp={() => onCaretChangeRef.current?.()}\n\t\t\t\t\t\tonMouseUp={() => onCaretChangeRef.current?.()}\n\t\t\t\t\t\tonFocus={() => setIsFocused(true)}\n\t\t\t\t\t\tonBlur={() => setIsFocused(false)}\n\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t'prose prose-sm prose-p:my-0.5 prose-p:leading-relaxed prose-headings:my-1 prose-ul:my-1 prose-ol:my-1 prose-li:my-0.5 max-w-none px-3 py-2 text-sm focus-visible:outline-none dark:prose-invert',\n\t\t\t\t\t\t\t'h-full min-h-full',\n\t\t\t\t\t\t\tdisabled && 'cursor-not-allowed',\n\t\t\t\t\t\t)}\n\t\t\t\t\t\tdangerouslySetInnerHTML={{ __html: toEditorContent(value) }}\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t)}\n\n\t\t\t{!!footerSlot && (\n\t\t\t\t<div className=\"px-3 pb-2 pt-1\">{footerSlot}</div>\n\t\t\t)}\n\n\t\t\t{countsFooter}\n\t\t</div>\n\t);\n});\n\nFallbackRichTextEditor.displayName = 'FallbackRichTextEditor';\n","/**\n * Public `<RichTextEditor>` shell — picks the TipTap-backed editor when\n * the runtime is loaded and falls back to a plain `contenteditable`\n * surface otherwise. Both variants implement the same imperative\n * `RichTextEditorHandle`, so callers don't have to branch.\n *\n * Heavy lifting lives in `partials/`:\n * - `partials/rich-text-editor-tiptap.tsx` — TipTap variant\n * - `partials/rich-text-editor-fallback.tsx` — contenteditable variant\n * - `partials/rich-text-editor-toolbar.tsx` — shared toolbar\n * - `partials/counts-footer.tsx` — char/word counts\n * - `partials/caret-helpers.ts` — caret introspection\n * - `partials/html-helpers.ts` — HTML normalization\n */\nimport { forwardRef } from 'react';\n\nimport {\n\tFallbackRichTextEditor,\n\tTiptapRichTextEditor,\n\thasTiptapRuntime,\n} from './partials';\nimport type {\n\tRichTextEditorHandle,\n\tRichTextEditorProps,\n} from './rich-text-editor.types';\n\nexport const RichTextEditor = forwardRef<RichTextEditorHandle, RichTextEditorProps>(function RichTextEditor(\n\tprops,\n\tref,\n) {\n\tif (!hasTiptapRuntime) {\n\t\treturn <FallbackRichTextEditor className=\"rich-text-editor--component\" {...props} ref={ref} />;\n\t}\n\n\treturn <TiptapRichTextEditor {...props} ref={ref} />;\n});\n\nRichTextEditor.displayName = 'RichTextEditor';\n\nexport type {\n\tRichTextEditorProps,\n\tRichTextEditorHandle,\n\tRichTextEditorToolbarItem,\n\tRichTextCaretContext,\n} from './rich-text-editor.types';\n"],"mappings":"sVA4BA,SAAgB,EAAsB,CACrC,UACA,oBACA,mBAAmB,GACnB,aACA,mBACA,WAAW,GACX,YAAY,GACZ,kBACA,WAC8B,CAC9B,IAAM,GAAa,GAAmB,QAAU,GAAK,EAErD,OACC,EAAA,EAAA,MAAC,MAAD,CAAK,UAAU,0EAAf,CACE,EAAQ,IAAK,GAAW,CACxB,IAAM,EAAO,EAAO,KACd,EAAW,EAAO,SAAS,EAEjC,OACC,EAAA,EAAA,KAAC,EAAA,EAAD,CAEC,KAAK,SACL,QAAS,EAAW,UAAY,YAChC,YAAa,EAAW,QAAU,QAClC,KAAK,aACL,QAAS,EAAO,IAChB,SAAU,GAAY,CAAC,GAAa,GAAc,EAAO,SACzD,aAAY,EAAO,MACnB,MAAO,EAAO,gBAEd,EAAA,EAAA,KAAC,EAAD,CAAM,UAAU,aAAe,CAAA,CACxB,EAXF,EAAO,EAWL,CAEV,CAAC,EAEA,CAAC,IACD,EAAA,EAAA,MAAA,EAAA,SAAA,CAAA,SAAA,EACC,EAAA,EAAA,KAAC,MAAD,CAAK,UAAU,yBAA2B,CAAA,GAE1C,EAAA,EAAA,KAAC,EAAA,EAAD,CACC,KAAK,SACL,QAAS,EAAa,UAAY,YAClC,YAAa,EAAa,QAAU,QACpC,KAAK,aACL,QAAS,EACT,SAAU,GAAY,CAAC,EACvB,aAAY,EAAQ,QAAQ,WAC5B,MAAO,EAAQ,QAAQ,qBAEvB,EAAA,EAAA,KAAC,EAAA,MAAD,CAAO,UAAU,aAAe,CAAA,CACzB,CAAA,CACP,CAAA,CAAA,EAGF,IACA,EAAA,EAAA,MAAA,EAAA,SAAA,CAAA,SAAA,EACC,EAAA,EAAA,KAAC,MAAD,CAAK,UAAU,yBAA2B,CAAA,EACzC,GAAmB,IAAK,GAAS,CACjC,IAAM,EAAO,EAAK,KACZ,EAAW,EAAK,WAAW,GAAK,GACtC,OACC,EAAA,EAAA,KAAC,EAAA,EAAD,CAEC,KAAK,SACL,QAAS,EAAW,UAAY,YAChC,YAAa,EAAW,QAAU,QAClC,KAAK,aACL,QAAS,EAAK,QACd,SAAU,GAAY,CAAC,GAAa,GAAc,EAAK,SACvD,aAAY,EAAK,MACjB,MAAO,EAAK,gBAEZ,EAAA,EAAA,KAAC,EAAD,CAAM,UAAU,aAAe,CAAA,CACxB,EAXF,EAAK,EAWH,CAEV,CAAC,CACA,CAAA,CAAA,EAGF,CAAC,CAAC,IACF,EAAA,EAAA,KAAC,MAAD,CAAK,UAAU,2CAAmC,CAAqB,CAAA,CAEpE,GAEP,CAEA,EAAsB,YAAc,wBClFpC,IAAa,EAAsD,CAClE,YAAa,mBACb,YAAa,cACb,QAAS,CACR,KAAM,OACN,OAAQ,SACR,OAAQ,SACR,WAAY,cACZ,YAAa,eACb,WAAY,QACZ,KAAM,OACN,KAAM,OACN,WAAY,aACb,EACA,OAAQ,CACP,WAAY,aACZ,MAAO,QACP,IAAK,KACN,CACD,ECjCA,SAAgB,GAAgD,CAC/D,GAAI,OAAO,OAAW,IAAa,OAAO,KAC1C,IAAM,EAAM,OAAO,aAAa,EAChC,GAAI,CAAC,GAAO,EAAI,aAAe,EAAG,OAAO,KACzC,IAAM,EAAQ,EAAI,WAAW,CAAC,EAC9B,GAAI,CAAC,EAAM,UAAW,OAAO,KAE7B,IAAM,EAAY,EAAM,eAClB,EAAc,EAAM,YAEtB,EAAqB,EACzB,KAAO,GAAS,EAAM,WAAa,KAAK,cACvC,EAAQ,EAAM,WAEf,GAAI,CAAC,EAAO,OAAO,KACnB,IAAM,EACJ,EAAkB,QAAQ,0BAA0B,GACpD,EAAkB,QAAQ,cAAc,EAC1C,GAAI,CAAC,EAAU,OAAO,KAEtB,IAAI,EAAO,GACP,EAAU,WAAa,KAAK,YAC/B,GAAQ,EAAU,aAAe,IAAI,MAAM,EAAG,CAAW,GAG1D,IAAI,EAAsB,EAC1B,KAAO,GAAU,IAAW,GAAY,IAAW,GAAO,CACzD,IAAI,EAAoB,EAAO,gBAC/B,KAAO,GACN,GAAQ,EAAK,aAAe,IAAM,EAClC,EAAO,EAAK,gBAGb,GADA,EAAS,EAAO,WACZ,GAAW,EAAmB,UAAU,2CAA2C,EACtF,KAEF,CAEA,IAAI,EACE,EAAI,EAAM,sBAAsB,EAKtC,OAJI,IAAM,EAAE,KAAO,EAAE,MAAQ,EAAE,OAAS,EAAE,UACzC,EAAO,CAAE,IAAK,EAAE,IAAK,KAAM,EAAE,KAAM,OAAQ,EAAE,OAAQ,MAAO,EAAE,KAAM,GAG9D,CAAE,WAAY,EAAM,MAAK,CACjC,CASA,SAAgB,EACf,EACA,EACA,EACA,EACO,CACP,GAAI,OAAO,OAAW,IAAa,OACnC,IAAM,EAAM,OAAO,aAAa,EAChC,GAAI,CAAC,GAAO,EAAI,aAAe,EAAG,OAClC,IAAM,EAAQ,EAAI,WAAW,CAAC,EAC9B,GAAI,CAAC,EAAM,UAAW,OAEtB,IAAI,EAAY,EACZ,EAAkB,EAAM,eACxB,EAAc,EAAM,YAExB,KAAO,EAAY,GAAG,CACrB,GAAI,EAAU,WAAa,KAAK,UAAW,CAC1C,IAAM,EAAO,KAAK,IAAI,EAAa,CAAS,EAG5C,GAFA,GAAe,EACf,GAAa,EACT,IAAc,EAAG,KACtB,CACA,IAAM,EAAO,EAAiB,CAAS,EACvC,GAAI,CAAC,EAAM,MACX,EAAY,EACZ,EAAc,EAAK,aAAa,QAAU,CAC3C,CAEA,IAAM,EAAQ,SAAS,YAAY,EAMnC,GALA,EAAM,SAAS,EAAW,CAAW,EACrC,EAAM,OAAO,EAAM,aAAc,EAAM,SAAS,EAChD,EAAI,gBAAgB,EACpB,EAAI,SAAS,CAAK,EAEd,EAAQ,CACX,EAAO,MAAM,EAAE,MAAM,EAAE,cAAc,CAAI,EAAE,IAAI,EAC/C,EAAa,EAAO,QAAQ,CAAC,EAC7B,MACD,CAEA,EAAM,eAAe,EACrB,IAAM,EAAW,SAAS,YAAY,EAAE,yBAAyB,CAAI,EACrE,EAAM,WAAW,CAAQ,EACzB,EAAI,cAAc,EAClB,IAAM,EACJ,GAA8B,eAAe,UAAU,0BAA0B,GAAK,KACpF,GAAU,EAAc,EAAyB,SAAS,CAC/D,CAEA,SAAgB,EAAuB,EAA8B,EAAoB,CACxF,GAAI,OAAO,OAAW,KAAe,CAAC,EAAU,OAChD,EAAS,MAAM,EAEf,IAAM,EAAM,OAAO,aAAa,EAChC,GAAI,CAAC,GAAO,EAAI,aAAe,EAAG,CACjC,EAAS,mBAAmB,YAAa,CAAI,EAC7C,MACD,CAEA,IAAM,EAAQ,EAAI,WAAW,CAAC,EAC9B,GAAI,CAAC,EAAS,SAAS,EAAM,uBAAuB,EAAG,CACtD,EAAS,mBAAmB,YAAa,CAAI,EAC7C,MACD,CAEA,EAAM,eAAe,EACrB,IAAM,EAAW,SAAS,YAAY,EAAE,yBAAyB,CAAI,EACrE,EAAM,WAAW,CAAQ,EACzB,EAAM,SAAS,EAAK,EACpB,EAAI,gBAAgB,EACpB,EAAI,SAAS,CAAK,CACnB,CAEA,SAAS,EAAiB,EAAyB,CAClD,IAAI,EAAuB,EAC3B,KAAO,GAAS,CACf,GAAI,EAAQ,gBAAiB,CAE5B,IADA,EAAU,EAAQ,gBACX,GAAW,EAAQ,WACzB,EAAU,EAAQ,UAEnB,GAAI,GAAW,EAAQ,WAAa,KAAK,UAAW,OAAO,EAC3D,QACD,CAEA,GADA,EAAU,EAAQ,WACd,CAAC,GAAY,EAAoB,UAAU,qEAAqE,EACnH,OAAO,IAET,CACA,OAAO,IACR,CCxJA,SAAgB,EAAiB,CAAE,OAAM,YAAW,WAAkC,CACrF,IAAM,EAAQ,EAAK,OACb,EAAQ,EAAK,KAAK,EAAE,OAAS,EAAI,EAAK,KAAK,EAAE,MAAM,KAAK,EAAE,OAAS,EACnE,EAAY,OAAO,GAAc,UAAY,EAAQ,EAE3D,OACC,EAAA,EAAA,MAAC,MAAD,CAAK,UAAU,kFAAf,EACC,EAAA,EAAA,MAAC,EAAA,EAAD,CACC,IAAI,OACJ,KAAK,KACL,KAAM,EAAY,QAAU,YAC5B,OAAQ,EAAY,SAAW,UAC/B,UAAW,EAAA,GAAG,cAAc,WAL7B,CAOE,EACA,OAAO,GAAc,SAAW,MAAM,IAAc,GAAG,IAAE,EAAQ,OAAO,UACpE,KACN,EAAA,EAAA,MAAC,EAAA,EAAD,CAAM,IAAI,OAAO,KAAK,KAAK,KAAK,YAAY,UAAU,wBAAtD,CACE,EAAM,IAAE,EAAQ,OAAO,KACnB,GACF,GAEP,CAEA,EAAiB,YAAc,mBAU/B,SAAgB,EAAa,CAC5B,SACA,aACA,cACA,YACA,WACqB,CAKrB,OAAO,EAAA,EAAA,KAAC,EAAD,CAAwB,KAJlB,EACV,EAAY,QAAQ,WAAY,EAAE,EACjC,GAAQ,QAAQ,GAAK,GAEuB,YAAoB,SAAU,CAAA,CAC/E,CAEA,EAAa,YAAc,eCtD3B,SAAgB,EAAc,EAAuB,CACpD,IAAM,EAAU,EAAM,KAAK,EAM3B,OAJI,IAAY,IAAM,IAAY,WAAa,IAAY,cACnD,GAGD,CACR,CAEA,SAAgB,EAAgB,EAAuB,CACtD,IAAM,EAAa,EAAc,CAAK,EACtC,OAAO,IAAe,GAAK,UAAY,CACxC,CCiBA,IAAM,EAAgB,EAAY,cAC5B,EAAkB,EAAY,UAC9B,EACL,YAAa,EAAmB,EAAiB,QAAU,EAE/C,GAAA,EAAA,EAAA,YAA6E,SACzF,CACC,QACA,WACA,cACA,UAAU,GACV,YACA,YACA,WAAW,GACX,aAAa,GACb,YACA,oBACA,kBACA,aACA,mBAAmB,GACnB,YAAY,GACZ,YACA,gBACA,QAAS,GAEV,EACC,CACD,IAAM,EAAU,EAAA,WAAW,EAA8B,CAAW,EAC9D,CAAC,EAAW,IAAA,EAAA,EAAA,UAAyB,EAAK,EAC1C,CAAC,EAAY,IAAA,EAAA,EAAA,UAA0B,EAAK,EAC5C,CAAC,EAAa,IAAA,EAAA,EAAA,UAA2B,EAAE,EAC3C,GAAA,EAAA,EAAA,QAAsB,EAAK,EAC3B,GAAA,EAAA,EAAA,QAAkC,EAAc,CAAK,CAAC,EACtD,GAAA,EAAA,EAAA,QAA0B,CAAa,EAC7C,EAAiB,QAAU,EAE3B,IAAM,EAAS,EAAgB,CAC9B,WAAY,CAAC,CAAU,EACvB,QAAS,EAAgB,CAAK,EAC9B,SAAU,CAAC,EACX,kBAAmB,GACnB,UAAW,EAAY,MAAQ,GAC/B,YAAe,CACd,EAAa,QAAU,GACvB,EAAa,EAAI,CAClB,EACA,WAAc,CACb,EAAa,QAAU,GACvB,EAAa,EAAK,CACnB,EACA,UAAW,CAAE,OAAQ,KAA2D,CAC/E,IAAM,EAAO,EAAc,EAAc,QAAQ,CAAC,EAC7C,EAAa,UAId,IAAS,EAAiB,UAC7B,EAAiB,QAAU,EAC3B,EAAS,CAAI,GAGd,EAAiB,UAAU,EAC5B,EACA,YAAa,CACZ,WAAY,CACX,KAAM,UACN,aAAc,EAAQ,YACtB,iBAAkB,OAClB,MAAO,iMACR,CACD,CACD,CAAC,GAED,EAAA,EAAA,eAAgB,CACf,GAAI,CAAC,EACJ,OAGD,IAAM,EAAU,EAAc,EAAO,QAAQ,CAAC,EACxC,EAAO,EAAc,CAAK,EAChC,EAAiB,QAAU,EAEvB,IAAY,GACf,EAAO,SAAS,WAAW,EAAgB,CAAI,EAAG,CAAE,WAAY,EAAM,CAAC,CAEzE,EAAG,CAAC,EAAQ,CAAK,CAAC,GAElB,EAAA,EAAA,eAAgB,CACV,GAIL,EAAO,YAAY,CAAC,CAAQ,CAC7B,EAAG,CAAC,EAAU,CAAM,CAAC,GAErB,EAAA,EAAA,eAAgB,CACf,GAAI,OAAO,SAAa,IAAa,OACrC,IAAM,MAAgB,CAChB,EAAa,SAClB,EAAiB,UAAU,CAC5B,EAEA,OADA,SAAS,iBAAiB,kBAAmB,CAAO,MACvC,SAAS,oBAAoB,kBAAmB,CAAO,CACrE,EAAG,CAAC,CAAC,GAEL,EAAA,EAAA,qBACC,OACO,CACN,UAAa,CACZ,GAAQ,MAAM,EAAE,MAAM,EAAE,IAAI,CAC7B,EACA,YAAe,EAAc,GAAQ,QAAQ,GAAK,EAAE,EACpD,QAAU,GAAiB,CAC1B,IAAM,EAAO,EAAc,CAAI,EAC/B,EAAiB,QAAU,EAC3B,GAAQ,SAAS,WAAW,EAAgB,CAAI,EAAG,CAAE,WAAY,EAAM,CAAC,EACxE,EAAS,CAAI,CACd,EACA,WAAa,GAAiB,CACxB,GACL,EAAO,MAAM,EAAE,MAAM,EAAE,cAAc,CAAI,EAAE,IAAI,CAChD,EACA,YAAe,EAAc,GAAQ,QAAQ,GAAK,EAAE,IAAM,GAC1D,UAAa,CACZ,EAAiB,QAAU,GAC3B,GAAQ,SAAS,WAAW,UAAW,CAAE,WAAY,EAAM,CAAC,EAC5D,EAAS,EAAE,CACZ,EACA,oBAAuB,EAAiB,EACxC,oBAAqB,EAAgB,IAAiB,CACrD,EAAmB,EAAQ,EAAQ,EAAO,GAAS,CAClD,EAAiB,QAAU,EAAc,CAAI,EAC7C,EAAS,EAAiB,OAAO,CAClC,CAAC,CACF,CACD,GACA,CAAC,EAAQ,CAAQ,CAClB,EAEA,IAAM,GAAA,EAAA,EAAA,cACE,CACN,UAAW,IAAc,EAAU,OAAS,SAC5C,GAAI,EAAY,CAAE,YAAW,UAAW,MAAgB,EAAI,CAAC,CAC9D,GACA,CAAC,EAAS,EAAW,CAAS,CAC/B,EAEM,GAAA,EAAA,EAAA,iBAAqC,CACrC,KAEL,GAAI,EAAY,CACf,IAAM,EAAO,EAAgB,CAAW,EACxC,EAAO,SAAS,WAAW,EAAM,CAAE,WAAY,EAAM,CAAC,EACtD,IAAM,EAAa,EAAc,CAAW,EAC5C,EAAiB,QAAU,EAC3B,EAAS,CAAU,EACnB,EAAc,EAAK,CACpB,MACC,EAAe,EAAO,QAAQ,CAAC,EAC/B,EAAc,EAAI,CAEpB,EAAG,CAAC,EAAQ,EAAU,EAAY,CAAW,CAAC,EAExC,GAAA,EAAA,EAAA,aACJ,GAA8C,CAC9C,IAAM,EAAO,EAAE,OAAO,MACtB,EAAe,CAAI,EACnB,IAAM,EAAa,EAAc,CAAI,EACrC,EAAiB,QAAU,EAC3B,EAAS,CAAU,CACpB,EACA,CAAC,CAAQ,CACV,EAEM,GAAA,EAAA,EAAA,aACC,CACL,CACC,GAAI,OACJ,KAAM,EAAA,KACN,MAAO,EAAQ,QAAQ,KACvB,aAAgB,EAAQ,GAAQ,SAAS,MAAM,EAC/C,QAAW,GAAQ,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,IAAI,CACrD,EACA,CACC,GAAI,SACJ,KAAM,EAAA,OACN,MAAO,EAAQ,QAAQ,OACvB,aAAgB,EAAQ,GAAQ,SAAS,QAAQ,EACjD,QAAW,GAAQ,MAAM,EAAE,MAAM,EAAE,aAAa,EAAE,IAAI,CACvD,EACA,CACC,GAAI,SACJ,KAAM,EAAA,cACN,MAAO,EAAQ,QAAQ,OACvB,aAAgB,EAAQ,GAAQ,SAAS,QAAQ,EACjD,QAAW,GAAQ,MAAM,EAAE,MAAM,EAAE,aAAa,EAAE,IAAI,CACvD,EACA,CACC,GAAI,cACJ,KAAM,EAAA,KACN,MAAO,EAAQ,QAAQ,WACvB,aAAgB,EAAQ,GAAQ,SAAS,YAAY,EACrD,QAAW,GAAQ,MAAM,EAAE,MAAM,EAAE,iBAAiB,EAAE,IAAI,CAC3D,EACA,CACC,GAAI,eACJ,KAAM,EAAA,YACN,MAAO,EAAQ,QAAQ,YACvB,aAAgB,EAAQ,GAAQ,SAAS,aAAa,EACtD,QAAW,GAAQ,MAAM,EAAE,MAAM,EAAE,kBAAkB,EAAE,IAAI,CAC5D,EACA,CACC,GAAI,aACJ,KAAM,EAAA,MACN,MAAO,EAAQ,QAAQ,WACvB,aAAgB,EAAQ,GAAQ,SAAS,YAAY,EACrD,QAAW,GAAQ,MAAM,EAAE,MAAM,EAAE,iBAAiB,EAAE,IAAI,CAC3D,EACA,CACC,GAAI,OACJ,KAAM,EAAA,MACN,MAAO,EAAQ,QAAQ,KACvB,aAAgB,GAChB,QAAW,GAAQ,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAC9C,SAAU,CAAC,GAAQ,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,CACrD,EACA,CACC,GAAI,OACJ,KAAM,EAAA,MACN,MAAO,EAAQ,QAAQ,KACvB,aAAgB,GAChB,QAAW,GAAQ,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAC9C,SAAU,CAAC,GAAQ,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,CACrD,CACD,EACA,CAAC,EAAQ,CAAO,CACjB,EAEM,EACL,GAAc,GACb,EAAA,EAAA,KAAC,EAAD,CACS,SACI,aACC,cACF,YACF,SACT,CAAA,EACE,KAEC,EAAkB,OAAO,GAAgB,SAAW,EAAc,GAGlE,EADL,EAAgB,OAAS,GAAK,CAAC,GAAqB,GAAQ,SAE5D,EAAA,EAAA,KAAC,OAAD,CAAM,UAAU,mFACd,CACI,CAAA,EACH,KAEJ,OACC,EAAA,EAAA,MAAC,MAAD,CACC,UAAW,EAAA,GACV,+CACA,GAAY,aACZ,CACD,WALD,EAOC,EAAA,EAAA,KAAC,EAAD,CACC,QAAS,EACU,oBACD,mBACN,aACM,mBACR,WACV,UAAW,EAAQ,EACF,kBACR,SACT,CAAA,EAEA,GACA,EAAA,EAAA,KAAC,WAAD,CACC,aAAY,EAAQ,YACpB,MAAO,EACP,SAAU,EACA,WACV,WAAY,GACZ,UAAW,EAAA,GACV,qGACA,GAAY,oBACb,EACA,MAAO,CACP,CAAA,GAED,EAAA,EAAA,MAAC,MAAD,CAAK,UAAU,WAAW,MAAO,WAAjC,CACE,GAED,EAAA,EAAA,KAAC,EAAD,CACS,SACR,UAAW,EAAA,GACV,SACA,0BACA,8BACA,+BACD,CACA,CAAA,CACG,IAGL,CAAC,CAAC,IACF,EAAA,EAAA,KAAC,MAAD,CAAK,UAAU,0BAAkB,CAAgB,CAAA,EAGjD,CACG,GAEP,CAAC,EAED,EAAqB,YAAc,uBAEnC,IAAa,EACZ,OAAO,GAAkB,YACzB,OAAO,GAAoB,YAC3B,OAAO,GAAe,YACtB,EC1TY,GAAA,EAAA,EAAA,YAA+E,SAC3F,CACC,QACA,WACA,cACA,UAAU,GACV,YACA,YACA,WAAW,GACX,aAAa,GACb,YACA,oBACA,kBACA,aACA,mBAAmB,GACnB,YAAY,GACZ,YACA,gBACA,QAAS,GAEV,EACC,CACD,IAAM,EAAU,EAAA,WAAW,EAA8B,CAAW,EAC9D,GAAA,EAAA,EAAA,QAAqC,IAAI,EACzC,CAAC,EAAW,IAAA,EAAA,EAAA,UAAyB,EAAK,EAC1C,CAAC,EAAY,IAAA,EAAA,EAAA,UAA0B,EAAK,EAC5C,CAAC,EAAa,IAAA,EAAA,EAAA,UAA2B,EAAE,EAC3C,GAAA,EAAA,EAAA,QAAkC,EAAc,CAAK,CAAC,EACtD,GAAA,EAAA,EAAA,QAA0B,CAAa,EAC7C,EAAiB,QAAU,GAE3B,EAAA,EAAA,eAAgB,CACf,IAAM,EAAW,EAAY,QAC7B,GAAI,CAAC,GAAY,EAAW,OAC5B,IAAM,EAAO,EAAgB,CAAK,EAC9B,EAAc,EAAS,SAAS,IAAM,EAAc,CAAI,IAC3D,EAAS,UAAY,GAEtB,EAAiB,QAAU,EAAc,CAAK,CAC/C,EAAG,CAAC,EAAW,CAAK,CAAC,GAErB,EAAA,EAAA,eAAgB,CACV,GACL,EAAY,SAAS,MAAM,CAC5B,EAAG,CAAC,CAAS,CAAC,EAEd,IAAM,GAAA,EAAA,EAAA,iBAAuC,CAC5C,IAAM,EAAW,EAAY,QACvB,EAAO,EAAc,GAAU,WAAa,EAAE,EACpD,EAAiB,QAAU,EAC3B,EAAS,CAAI,EACb,EAAiB,UAAU,CAC5B,EAAG,CAAC,CAAQ,CAAC,GAEb,EAAA,EAAA,qBACC,OACO,CACN,UAAa,EAAY,SAAS,MAAM,EACxC,YAAe,EAAc,EAAY,SAAS,WAAa,EAAE,EACjE,QAAU,GAAiB,CAC1B,IAAM,EAAO,EAAc,CAAI,EAC/B,EAAiB,QAAU,EACvB,EAAY,UACf,EAAY,QAAQ,UAAY,EAAgB,CAAI,GAErD,EAAS,CAAI,CACd,EACA,WAAa,GAAiB,CAC7B,EAAuB,EAAY,QAAS,CAAI,EAChD,EAAmB,CACpB,EACA,YAAe,EAAc,EAAY,SAAS,WAAa,EAAE,IAAM,GACvE,UAAa,CACZ,EAAiB,QAAU,GACvB,EAAY,UAAS,EAAY,QAAQ,UAAY,WACzD,EAAS,EAAE,CACZ,EACA,oBAAuB,EAAiB,EACxC,oBAAqB,EAAgB,IAAiB,CACrD,EAAmB,KAAM,EAAQ,MAAY,EAAmB,CAAC,CAClE,CACD,GACA,CAAC,EAAoB,CAAQ,CAC9B,EAEA,IAAM,GAAA,EAAA,EAAA,cACE,CACN,UAAW,IAAc,EAAU,OAAS,SAC5C,GAAI,EAAY,CAAE,YAAW,UAAW,MAAgB,EAAI,CAAC,CAC9D,GACA,CAAC,EAAS,EAAW,CAAS,CAC/B,EAEM,GAAA,EAAA,EAAA,iBAAqC,CAC1C,GAAI,EAAY,CACf,IAAM,EAAa,EAAc,CAAW,EAC5C,EAAiB,QAAU,EACvB,EAAY,UACf,EAAY,QAAQ,UAAY,EAAgB,CAAU,GAE3D,EAAS,CAAU,EACnB,EAAc,EAAK,EACnB,MACD,CACA,EAAe,EAAY,SAAS,WAAa,EAAgB,CAAK,CAAC,EACvE,EAAc,EAAI,CACnB,EAAG,CAAC,EAAU,EAAY,EAAa,CAAK,CAAC,EAEvC,GAAA,EAAA,EAAA,aACJ,GAA8C,CAC9C,IAAM,EAAO,EAAE,OAAO,MACtB,EAAe,CAAI,EACnB,IAAM,EAAa,EAAc,CAAI,EACrC,EAAiB,QAAU,EAC3B,EAAS,CAAU,CACpB,EACA,CAAC,CAAQ,CACV,EAEM,EAAkB,OAAO,GAAgB,SAAW,EAAc,GAClE,EAAU,EAAc,EAAiB,OAAO,IAAM,GACtD,EACL,EAAgB,OAAS,GAAK,CAAC,GAAa,GAC3C,EAAA,EAAA,KAAC,OAAD,CAAM,UAAU,mFACd,CACI,CAAA,EACH,KAEC,GAAA,EAAA,EAAA,aACC,CACL,CAAE,GAAI,OAAQ,KAAM,EAAA,KAAM,MAAO,EAAQ,QAAQ,KAAM,aAAgB,GAAO,QAAW,IAAA,GAAW,SAAU,EAAK,EACnH,CAAE,GAAI,SAAU,KAAM,EAAA,OAAQ,MAAO,EAAQ,QAAQ,OAAQ,aAAgB,GAAO,QAAW,IAAA,GAAW,SAAU,EAAK,EACzH,CAAE,GAAI,SAAU,KAAM,EAAA,cAAe,MAAO,EAAQ,QAAQ,OAAQ,aAAgB,GAAO,QAAW,IAAA,GAAW,SAAU,EAAK,EAChI,CAAE,GAAI,cAAe,KAAM,EAAA,KAAM,MAAO,EAAQ,QAAQ,WAAY,aAAgB,GAAO,QAAW,IAAA,GAAW,SAAU,EAAK,EAChI,CAAE,GAAI,eAAgB,KAAM,EAAA,YAAa,MAAO,EAAQ,QAAQ,YAAa,aAAgB,GAAO,QAAW,IAAA,GAAW,SAAU,EAAK,EACzI,CAAE,GAAI,aAAc,KAAM,EAAA,MAAO,MAAO,EAAQ,QAAQ,WAAY,aAAgB,GAAO,QAAW,IAAA,GAAW,SAAU,EAAK,EAChI,CAAE,GAAI,OAAQ,KAAM,EAAA,MAAO,MAAO,EAAQ,QAAQ,KAAM,aAAgB,GAAO,QAAW,IAAA,GAAW,SAAU,EAAK,EACpH,CAAE,GAAI,OAAQ,KAAM,EAAA,MAAO,MAAO,EAAQ,QAAQ,KAAM,aAAgB,GAAO,QAAW,IAAA,GAAW,SAAU,EAAK,CACrH,EACA,CAAC,CAAO,CACT,EAEM,EAAO,EACV,EAAY,QAAQ,WAAY,EAAE,EACjC,EAAY,SAAS,WAAa,EAAc,CAAK,EAAE,QAAQ,WAAY,EAAE,EAC3E,EACL,GACC,EAAA,EAAA,KAAC,EAAD,CAAwB,OAAiB,YAAoB,SAAU,CAAA,EACpE,KAEL,OACC,EAAA,EAAA,MAAC,MAAD,CACC,UAAW,EAAA,GACV,+CACA,GAAY,aACZ,CACD,WALD,EAOC,EAAA,EAAA,KAAC,EAAD,CACC,QAAS,EACU,oBACD,mBACN,aACM,mBACR,WACV,UAAA,GACiB,kBACR,SACT,CAAA,EAEA,GACA,EAAA,EAAA,KAAC,WAAD,CACC,aAAY,EAAQ,YACpB,MAAO,EACP,SAAU,EACA,WACV,WAAY,GACZ,UAAW,EAAA,GACV,qGACA,GAAY,oBACb,EACA,MAAO,CACP,CAAA,GAED,EAAA,EAAA,MAAC,MAAD,CAAK,UAAU,WAAW,MAAO,WAAjC,CACE,GACD,EAAA,EAAA,KAAC,MAAD,CACC,IAAK,EACL,KAAK,UACL,aAAY,EAAQ,YACpB,iBAAe,OACf,gBAAiB,CAAC,EAClB,+BAAA,GACA,QAAS,EACT,YAAe,EAAiB,UAAU,EAC1C,cAAiB,EAAiB,UAAU,EAC5C,YAAe,EAAa,EAAI,EAChC,WAAc,EAAa,EAAK,EAChC,UAAW,EAAA,GACV,kMACA,oBACA,GAAY,oBACb,EACA,wBAAyB,CAAE,OAAQ,EAAgB,CAAK,CAAE,CAC1D,CAAA,CACG,IAGL,CAAC,CAAC,IACF,EAAA,EAAA,KAAC,MAAD,CAAK,UAAU,0BAAkB,CAAgB,CAAA,EAGjD,CACG,GAEP,CAAC,EAED,EAAuB,YAAc,yBC3OrC,IAAa,GAAA,EAAA,EAAA,YAAuE,SACnF,EACA,EACC,CAKD,OAJK,GAIE,EAAA,EAAA,KAAC,EAAD,CAAsB,GAAI,EAAY,KAAM,CAAA,GAH3C,EAAA,EAAA,KAAC,EAAD,CAAwB,UAAU,8BAA8B,GAAI,EAAY,KAAM,CAAA,CAI/F,CAAC,EAED,EAAe,YAAc"}
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
import { useStrings as e } from "../lib/strings.js";
|
|
2
|
+
import { cn as t } from "../lib/utils.js";
|
|
3
|
+
import { o as n, s as r } from "./typography-CzFVA1w1.js";
|
|
4
|
+
import { t as i } from "./badge-BYNwSWh5.js";
|
|
5
|
+
import { t as a } from "./cards-cQ9lL6zy.js";
|
|
6
|
+
import { r as o } from "./layout.types-ip8BYRa7.js";
|
|
7
|
+
import { jsx as s, jsxs as c } from "react/jsx-runtime";
|
|
8
|
+
//#region src/components/layout/settings/settings.tsx
|
|
9
|
+
var l = { navigationAriaLabel: "Settings navigation" };
|
|
10
|
+
function u(e) {
|
|
11
|
+
if (!e) return "";
|
|
12
|
+
try {
|
|
13
|
+
let t = typeof window < "u" ? window.location.origin : "http://localhost", n = new URL(e, t).pathname.replace(/\/+$/, "");
|
|
14
|
+
return n.length > 0 ? n : "/";
|
|
15
|
+
} catch {
|
|
16
|
+
let t = (e.split("?")[0] ?? e).replace(/\/+$/, "");
|
|
17
|
+
return t.length > 0 ? t : "/";
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
function d(e, t, n) {
|
|
21
|
+
if (t) return e.id === t;
|
|
22
|
+
if (!n || !e.href) return !1;
|
|
23
|
+
let r = u(n), i = u(e.href);
|
|
24
|
+
return r === i || r.startsWith(`${i}/`);
|
|
25
|
+
}
|
|
26
|
+
function f({ title: u, description: f, groups: p, currentId: m, currentPath: h, children: g, aside: _, actions: v, footer: y, className: b, navClassName: x, contentClassName: S, renderLink: C, LinkComponent: w, strings: T }) {
|
|
27
|
+
let E = e(l, T), D = o({
|
|
28
|
+
renderLink: C,
|
|
29
|
+
LinkComponent: w
|
|
30
|
+
});
|
|
31
|
+
return /* @__PURE__ */ c("section", {
|
|
32
|
+
"data-component": "aside-nav-shell",
|
|
33
|
+
"data-slot": "aside-nav-shell",
|
|
34
|
+
className: t("aside-nav-shell--component grid min-w-0 gap-5 lg:grid-cols-[17rem_minmax(0,1fr)]", b),
|
|
35
|
+
children: [/* @__PURE__ */ s("aside", {
|
|
36
|
+
"data-slot": "aside-nav-shell-aside",
|
|
37
|
+
className: "aside-nav-shell--aside min-w-0",
|
|
38
|
+
children: /* @__PURE__ */ c(a, {
|
|
39
|
+
padding: "default",
|
|
40
|
+
surface: "card",
|
|
41
|
+
className: t("aside-nav-shell--nav-card sticky top-[calc(var(--topbar-height)_+_1rem)]", x),
|
|
42
|
+
contentClassName: "grid gap-4",
|
|
43
|
+
children: [!!_ && /* @__PURE__ */ s("div", {
|
|
44
|
+
className: "aside-nav-shell--aside-header",
|
|
45
|
+
children: _
|
|
46
|
+
}), /* @__PURE__ */ s("nav", {
|
|
47
|
+
"aria-label": E.navigationAriaLabel,
|
|
48
|
+
className: "grid gap-4",
|
|
49
|
+
children: p.map((e) => /* @__PURE__ */ c("div", {
|
|
50
|
+
className: "grid gap-1.5",
|
|
51
|
+
children: [!!e.label && /* @__PURE__ */ s(r, {
|
|
52
|
+
size: "xxs",
|
|
53
|
+
type: "secondary",
|
|
54
|
+
weight: "medium",
|
|
55
|
+
className: "px-2 uppercase tracking-normal",
|
|
56
|
+
children: e.label
|
|
57
|
+
}), /* @__PURE__ */ s("div", {
|
|
58
|
+
className: "grid gap-0.5",
|
|
59
|
+
children: e.items.map((e) => {
|
|
60
|
+
let n = e.icon, a = d(e, m, h), o = /* @__PURE__ */ c("span", {
|
|
61
|
+
className: "flex min-w-0 items-center gap-2",
|
|
62
|
+
children: [
|
|
63
|
+
!!n && /* @__PURE__ */ s(n, { className: t("size-4 shrink-0", a ? "text-primary" : "text-muted-foreground") }),
|
|
64
|
+
/* @__PURE__ */ c("span", {
|
|
65
|
+
className: "grid min-w-0 flex-1 gap-0.5",
|
|
66
|
+
children: [/* @__PURE__ */ s(r, {
|
|
67
|
+
tag: "span",
|
|
68
|
+
weight: a ? "semibold" : "medium",
|
|
69
|
+
className: "truncate",
|
|
70
|
+
children: e.label
|
|
71
|
+
}), !!e.description && /* @__PURE__ */ s(r, {
|
|
72
|
+
tag: "span",
|
|
73
|
+
size: "xs",
|
|
74
|
+
type: "secondary",
|
|
75
|
+
className: "truncate",
|
|
76
|
+
children: e.description
|
|
77
|
+
})]
|
|
78
|
+
}),
|
|
79
|
+
!!e.badge && /* @__PURE__ */ s(i, {
|
|
80
|
+
variant: a ? "primary" : "secondary",
|
|
81
|
+
className: "shrink-0",
|
|
82
|
+
children: e.badge
|
|
83
|
+
})
|
|
84
|
+
]
|
|
85
|
+
});
|
|
86
|
+
return /* @__PURE__ */ s("div", {
|
|
87
|
+
onClick: () => e.onSelect?.(e.id),
|
|
88
|
+
children: D({
|
|
89
|
+
href: e.href,
|
|
90
|
+
children: o,
|
|
91
|
+
active: a,
|
|
92
|
+
disabled: e.disabled,
|
|
93
|
+
external: e.external,
|
|
94
|
+
className: t("aside-nav-shell--item flex min-w-0 rounded-md px-2 py-2 text-sm transition-colors", "focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring/40", a ? "bg-primary/8 text-foreground" : "text-muted-foreground hover:bg-muted/60 hover:text-foreground", e.disabled && "pointer-events-none opacity-50"),
|
|
95
|
+
"aria-label": typeof e.label == "string" ? e.label : void 0
|
|
96
|
+
})
|
|
97
|
+
}, e.id);
|
|
98
|
+
})
|
|
99
|
+
})]
|
|
100
|
+
}, e.id))
|
|
101
|
+
})]
|
|
102
|
+
})
|
|
103
|
+
}), /* @__PURE__ */ c("div", {
|
|
104
|
+
"data-slot": "aside-nav-shell-main",
|
|
105
|
+
className: t("aside-nav-shell--main min-w-0 space-y-4", S),
|
|
106
|
+
children: [
|
|
107
|
+
(u || f || v) && /* @__PURE__ */ c("header", {
|
|
108
|
+
className: "aside-nav-shell--header flex min-w-0 flex-col gap-3 sm:flex-row sm:items-start sm:justify-between",
|
|
109
|
+
children: [/* @__PURE__ */ c("div", {
|
|
110
|
+
className: "min-w-0",
|
|
111
|
+
children: [!!u && /* @__PURE__ */ s(n, {
|
|
112
|
+
tag: "h2",
|
|
113
|
+
className: "border-0 pb-0",
|
|
114
|
+
children: u
|
|
115
|
+
}), !!f && /* @__PURE__ */ s(r, {
|
|
116
|
+
type: "secondary",
|
|
117
|
+
className: "mt-1 max-w-3xl",
|
|
118
|
+
children: f
|
|
119
|
+
})]
|
|
120
|
+
}), !!v && /* @__PURE__ */ s("div", {
|
|
121
|
+
className: "flex shrink-0 flex-wrap items-center gap-2",
|
|
122
|
+
children: v
|
|
123
|
+
})]
|
|
124
|
+
}),
|
|
125
|
+
/* @__PURE__ */ s("div", {
|
|
126
|
+
"data-slot": "aside-nav-shell-content",
|
|
127
|
+
className: "aside-nav-shell--content min-w-0",
|
|
128
|
+
children: g
|
|
129
|
+
}),
|
|
130
|
+
!!y && /* @__PURE__ */ s("footer", {
|
|
131
|
+
className: "aside-nav-shell--footer",
|
|
132
|
+
children: y
|
|
133
|
+
})
|
|
134
|
+
]
|
|
135
|
+
})]
|
|
136
|
+
});
|
|
137
|
+
}
|
|
138
|
+
var p = f;
|
|
139
|
+
f.displayName = "AsideNavShell";
|
|
140
|
+
//#endregion
|
|
141
|
+
export { p as n, l as r, f as t };
|
|
142
|
+
|
|
143
|
+
//# sourceMappingURL=settings-CW9yzfQM.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"settings-CW9yzfQM.js","names":[],"sources":["../../src/components/layout/settings/settings.tsx"],"sourcesContent":["import type { ComponentType, ReactNode } from 'react';\n\nimport { Badge } from '@/components/base/badge';\nimport { SmartCard } from '@/components/base/cards';\nimport { Heading, Text } from '@/components/typography';\nimport { useStrings, type StringsProp } from '@/lib/strings';\nimport { cn } from '@/lib/utils';\n\nimport {\n\tresolveLayoutLinkRenderer,\n\ttype LayoutNavigationAdapter,\n} from '../layout.types';\n\nexport interface AsideNavShellStrings {\n\tnavigationAriaLabel: string;\n}\n\nexport const defaultAsideNavShellStrings: AsideNavShellStrings = {\n\tnavigationAriaLabel: 'Settings navigation',\n};\n\nexport interface AsideNavItem {\n\tid: string;\n\tlabel: ReactNode;\n\thref?: string;\n\tdescription?: ReactNode;\n\ticon?: ComponentType<{ className?: string }>;\n\tbadge?: ReactNode;\n\tdisabled?: boolean;\n\texternal?: boolean;\n\tonSelect?: (id: string) => void;\n}\n\nexport interface AsideNavGroup {\n\tid: string;\n\tlabel?: ReactNode;\n\titems: AsideNavItem[];\n}\n\nexport interface AsideNavShellProps extends LayoutNavigationAdapter {\n\ttitle?: ReactNode;\n\tdescription?: ReactNode;\n\tgroups: AsideNavGroup[];\n\tcurrentId?: string;\n\tcurrentPath?: string;\n\tchildren?: ReactNode;\n\taside?: ReactNode;\n\tactions?: ReactNode;\n\tfooter?: ReactNode;\n\tclassName?: string;\n\tnavClassName?: string;\n\tcontentClassName?: string;\n\tstrings?: StringsProp<AsideNavShellStrings>;\n}\n\nexport type SettingsShellProps = AsideNavShellProps;\n\nfunction normalizePath(rawUrl?: string): string {\n\tif (!rawUrl) return '';\n\ttry {\n\t\tconst baseOrigin = typeof window !== 'undefined' ? window.location.origin : 'http://localhost';\n\t\tconst parsed = new URL(rawUrl, baseOrigin);\n\t\tconst trimmed = parsed.pathname.replace(/\\/+$/, '');\n\t\treturn trimmed.length > 0 ? trimmed : '/';\n\t} catch {\n\t\tconst clean = rawUrl.split('?')[0] ?? rawUrl;\n\t\tconst trimmed = clean.replace(/\\/+$/, '');\n\t\treturn trimmed.length > 0 ? trimmed : '/';\n\t}\n}\n\nfunction isActiveItem(item: AsideNavItem, currentId?: string, currentPath?: string): boolean {\n\tif (currentId) return item.id === currentId;\n\tif (!currentPath || !item.href) return false;\n\tconst activePath = normalizePath(currentPath);\n\tconst itemPath = normalizePath(item.href);\n\treturn activePath === itemPath || activePath.startsWith(`${itemPath}/`);\n}\n\nexport function AsideNavShell({\n\ttitle,\n\tdescription,\n\tgroups,\n\tcurrentId,\n\tcurrentPath,\n\tchildren,\n\taside,\n\tactions,\n\tfooter,\n\tclassName,\n\tnavClassName,\n\tcontentClassName,\n\trenderLink,\n\tLinkComponent,\n\tstrings: stringsProp,\n}: AsideNavShellProps) {\n\tconst strings = useStrings(defaultAsideNavShellStrings, stringsProp);\n\tconst linkRenderer = resolveLayoutLinkRenderer({ renderLink, LinkComponent });\n\n\treturn (\n\t\t<section\n\t\t\tdata-component=\"aside-nav-shell\"\n\t\t\tdata-slot=\"aside-nav-shell\"\n\t\t\tclassName={cn('aside-nav-shell--component grid min-w-0 gap-5 lg:grid-cols-[17rem_minmax(0,1fr)]', className)}\n\t\t>\n\t\t\t<aside data-slot=\"aside-nav-shell-aside\" className=\"aside-nav-shell--aside min-w-0\">\n\t\t\t\t<SmartCard\n\t\t\t\t\tpadding=\"default\"\n\t\t\t\t\tsurface=\"card\"\n\t\t\t\t\tclassName={cn('aside-nav-shell--nav-card sticky top-[calc(var(--topbar-height)_+_1rem)]', navClassName)}\n\t\t\t\t\tcontentClassName=\"grid gap-4\"\n\t\t\t\t>\n\t\t\t\t\t{!!aside && <div className=\"aside-nav-shell--aside-header\">{aside}</div>}\n\t\t\t\t\t<nav aria-label={strings.navigationAriaLabel} className=\"grid gap-4\">\n\t\t\t\t\t\t{groups.map((group) => (\n\t\t\t\t\t\t\t<div key={group.id} className=\"grid gap-1.5\">\n\t\t\t\t\t\t\t\t{!!group.label && (\n\t\t\t\t\t\t\t\t\t<Text\n\t\t\t\t\t\t\t\t\t\tsize=\"xxs\"\n\t\t\t\t\t\t\t\t\t\ttype=\"secondary\"\n\t\t\t\t\t\t\t\t\t\tweight=\"medium\"\n\t\t\t\t\t\t\t\t\t\tclassName=\"px-2 uppercase tracking-normal\"\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t{group.label}\n\t\t\t\t\t\t\t\t\t</Text>\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t<div className=\"grid gap-0.5\">\n\t\t\t\t\t\t\t\t\t{group.items.map((item) => {\n\t\t\t\t\t\t\t\t\t\tconst Icon = item.icon;\n\t\t\t\t\t\t\t\t\t\tconst active = isActiveItem(item, currentId, currentPath);\n\t\t\t\t\t\t\t\t\t\tconst content = (\n\t\t\t\t\t\t\t\t\t\t\t<span className=\"flex min-w-0 items-center gap-2\">\n\t\t\t\t\t\t\t\t\t\t\t\t{!!Icon && (\n\t\t\t\t\t\t\t\t\t\t\t\t\t<Icon\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t'size-4 shrink-0',\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tactive ? 'text-primary' : 'text-muted-foreground',\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t\t\t<span className=\"grid min-w-0 flex-1 gap-0.5\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t<Text tag=\"span\" weight={active ? 'semibold' : 'medium'} className=\"truncate\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t{item.label}\n\t\t\t\t\t\t\t\t\t\t\t\t\t</Text>\n\t\t\t\t\t\t\t\t\t\t\t\t\t{!!item.description && (\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<Text tag=\"span\" size=\"xs\" type=\"secondary\" className=\"truncate\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{item.description}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t</Text>\n\t\t\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t\t\t\t{!!item.badge && (\n\t\t\t\t\t\t\t\t\t\t\t\t\t<Badge variant={active ? 'primary' : 'secondary'} className=\"shrink-0\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t{item.badge}\n\t\t\t\t\t\t\t\t\t\t\t\t\t</Badge>\n\t\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t\t\t\t<div key={item.id} onClick={() => item.onSelect?.(item.id)}>\n\t\t\t\t\t\t\t\t\t\t\t\t{linkRenderer({\n\t\t\t\t\t\t\t\t\t\t\t\t\thref: item.href,\n\t\t\t\t\t\t\t\t\t\t\t\t\tchildren: content,\n\t\t\t\t\t\t\t\t\t\t\t\t\tactive,\n\t\t\t\t\t\t\t\t\t\t\t\t\tdisabled: item.disabled,\n\t\t\t\t\t\t\t\t\t\t\t\t\texternal: item.external,\n\t\t\t\t\t\t\t\t\t\t\t\t\tclassName: cn(\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t'aside-nav-shell--item flex min-w-0 rounded-md px-2 py-2 text-sm transition-colors',\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring/40',\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tactive\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t? 'bg-primary/8 text-foreground'\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t: 'text-muted-foreground hover:bg-muted/60 hover:text-foreground',\n\t\t\t\t\t\t\t\t\t\t\t\t\t\titem.disabled && 'pointer-events-none opacity-50',\n\t\t\t\t\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\t\t\t\t\t'aria-label': typeof item.label === 'string' ? item.label : undefined,\n\t\t\t\t\t\t\t\t\t\t\t\t})}\n\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t\t})}\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t))}\n\t\t\t\t\t</nav>\n\t\t\t\t</SmartCard>\n\t\t\t</aside>\n\n\t\t\t<div data-slot=\"aside-nav-shell-main\" className={cn('aside-nav-shell--main min-w-0 space-y-4', contentClassName)}>\n\t\t\t\t{(title || description || actions) && (\n\t\t\t\t\t<header className=\"aside-nav-shell--header flex min-w-0 flex-col gap-3 sm:flex-row sm:items-start sm:justify-between\">\n\t\t\t\t\t\t<div className=\"min-w-0\">\n\t\t\t\t\t\t\t{!!title && <Heading tag=\"h2\" className=\"border-0 pb-0\">{title}</Heading>}\n\t\t\t\t\t\t\t{!!description && (\n\t\t\t\t\t\t\t\t<Text type=\"secondary\" className=\"mt-1 max-w-3xl\">\n\t\t\t\t\t\t\t\t\t{description}\n\t\t\t\t\t\t\t\t</Text>\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t{!!actions && <div className=\"flex shrink-0 flex-wrap items-center gap-2\">{actions}</div>}\n\t\t\t\t\t</header>\n\t\t\t\t)}\n\t\t\t\t<div data-slot=\"aside-nav-shell-content\" className=\"aside-nav-shell--content min-w-0\">\n\t\t\t\t\t{children}\n\t\t\t\t</div>\n\t\t\t\t{!!footer && <footer className=\"aside-nav-shell--footer\">{footer}</footer>}\n\t\t\t</div>\n\t\t</section>\n\t);\n}\n\nexport const SettingsShell = AsideNavShell;\n\nAsideNavShell.displayName = 'AsideNavShell';\n"],"mappings":"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"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
const e=require("../lib/strings.cjs"),t=require("../lib/utils.cjs"),n=require("./typography-GtkgK9QX.cjs"),r=require("./badge-B8xGFpfM.cjs"),i=require("./cards-Cu6p1Brd.cjs"),a=require("./layout.types-CXFAjJCj.cjs");let o=require("react/jsx-runtime");var s={navigationAriaLabel:`Settings navigation`};function c(e){if(!e)return``;try{let t=typeof window<`u`?window.location.origin:`http://localhost`,n=new URL(e,t).pathname.replace(/\/+$/,``);return n.length>0?n:`/`}catch{let t=(e.split(`?`)[0]??e).replace(/\/+$/,``);return t.length>0?t:`/`}}function l(e,t,n){if(t)return e.id===t;if(!n||!e.href)return!1;let r=c(n),i=c(e.href);return r===i||r.startsWith(`${i}/`)}function u({title:c,description:u,groups:d,currentId:f,currentPath:p,children:m,aside:h,actions:g,footer:_,className:v,navClassName:y,contentClassName:b,renderLink:x,LinkComponent:S,strings:C}){let w=e.useStrings(s,C),T=a.r({renderLink:x,LinkComponent:S});return(0,o.jsxs)(`section`,{"data-component":`aside-nav-shell`,"data-slot":`aside-nav-shell`,className:t.cn(`aside-nav-shell--component grid min-w-0 gap-5 lg:grid-cols-[17rem_minmax(0,1fr)]`,v),children:[(0,o.jsx)(`aside`,{"data-slot":`aside-nav-shell-aside`,className:`aside-nav-shell--aside min-w-0`,children:(0,o.jsxs)(i.t,{padding:`default`,surface:`card`,className:t.cn(`aside-nav-shell--nav-card sticky top-[calc(var(--topbar-height)_+_1rem)]`,y),contentClassName:`grid gap-4`,children:[!!h&&(0,o.jsx)(`div`,{className:`aside-nav-shell--aside-header`,children:h}),(0,o.jsx)(`nav`,{"aria-label":w.navigationAriaLabel,className:`grid gap-4`,children:d.map(e=>(0,o.jsxs)(`div`,{className:`grid gap-1.5`,children:[!!e.label&&(0,o.jsx)(n.s,{size:`xxs`,type:`secondary`,weight:`medium`,className:`px-2 uppercase tracking-normal`,children:e.label}),(0,o.jsx)(`div`,{className:`grid gap-0.5`,children:e.items.map(e=>{let i=e.icon,a=l(e,f,p),s=(0,o.jsxs)(`span`,{className:`flex min-w-0 items-center gap-2`,children:[!!i&&(0,o.jsx)(i,{className:t.cn(`size-4 shrink-0`,a?`text-primary`:`text-muted-foreground`)}),(0,o.jsxs)(`span`,{className:`grid min-w-0 flex-1 gap-0.5`,children:[(0,o.jsx)(n.s,{tag:`span`,weight:a?`semibold`:`medium`,className:`truncate`,children:e.label}),!!e.description&&(0,o.jsx)(n.s,{tag:`span`,size:`xs`,type:`secondary`,className:`truncate`,children:e.description})]}),!!e.badge&&(0,o.jsx)(r.t,{variant:a?`primary`:`secondary`,className:`shrink-0`,children:e.badge})]});return(0,o.jsx)(`div`,{onClick:()=>e.onSelect?.(e.id),children:T({href:e.href,children:s,active:a,disabled:e.disabled,external:e.external,className:t.cn(`aside-nav-shell--item flex min-w-0 rounded-md px-2 py-2 text-sm transition-colors`,`focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring/40`,a?`bg-primary/8 text-foreground`:`text-muted-foreground hover:bg-muted/60 hover:text-foreground`,e.disabled&&`pointer-events-none opacity-50`),"aria-label":typeof e.label==`string`?e.label:void 0})},e.id)})})]},e.id))})]})}),(0,o.jsxs)(`div`,{"data-slot":`aside-nav-shell-main`,className:t.cn(`aside-nav-shell--main min-w-0 space-y-4`,b),children:[(c||u||g)&&(0,o.jsxs)(`header`,{className:`aside-nav-shell--header flex min-w-0 flex-col gap-3 sm:flex-row sm:items-start sm:justify-between`,children:[(0,o.jsxs)(`div`,{className:`min-w-0`,children:[!!c&&(0,o.jsx)(n.o,{tag:`h2`,className:`border-0 pb-0`,children:c}),!!u&&(0,o.jsx)(n.s,{type:`secondary`,className:`mt-1 max-w-3xl`,children:u})]}),!!g&&(0,o.jsx)(`div`,{className:`flex shrink-0 flex-wrap items-center gap-2`,children:g})]}),(0,o.jsx)(`div`,{"data-slot":`aside-nav-shell-content`,className:`aside-nav-shell--content min-w-0`,children:m}),!!_&&(0,o.jsx)(`footer`,{className:`aside-nav-shell--footer`,children:_})]})]})}var d=u;u.displayName=`AsideNavShell`,Object.defineProperty(exports,"n",{enumerable:!0,get:function(){return d}}),Object.defineProperty(exports,"r",{enumerable:!0,get:function(){return s}}),Object.defineProperty(exports,"t",{enumerable:!0,get:function(){return u}});
|
|
2
|
+
//# sourceMappingURL=settings-cCPrw7si.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"settings-cCPrw7si.cjs","names":[],"sources":["../../src/components/layout/settings/settings.tsx"],"sourcesContent":["import type { ComponentType, ReactNode } from 'react';\n\nimport { Badge } from '@/components/base/badge';\nimport { SmartCard } from '@/components/base/cards';\nimport { Heading, Text } from '@/components/typography';\nimport { useStrings, type StringsProp } from '@/lib/strings';\nimport { cn } from '@/lib/utils';\n\nimport {\n\tresolveLayoutLinkRenderer,\n\ttype LayoutNavigationAdapter,\n} from '../layout.types';\n\nexport interface AsideNavShellStrings {\n\tnavigationAriaLabel: string;\n}\n\nexport const defaultAsideNavShellStrings: AsideNavShellStrings = {\n\tnavigationAriaLabel: 'Settings navigation',\n};\n\nexport interface AsideNavItem {\n\tid: string;\n\tlabel: ReactNode;\n\thref?: string;\n\tdescription?: ReactNode;\n\ticon?: ComponentType<{ className?: string }>;\n\tbadge?: ReactNode;\n\tdisabled?: boolean;\n\texternal?: boolean;\n\tonSelect?: (id: string) => void;\n}\n\nexport interface AsideNavGroup {\n\tid: string;\n\tlabel?: ReactNode;\n\titems: AsideNavItem[];\n}\n\nexport interface AsideNavShellProps extends LayoutNavigationAdapter {\n\ttitle?: ReactNode;\n\tdescription?: ReactNode;\n\tgroups: AsideNavGroup[];\n\tcurrentId?: string;\n\tcurrentPath?: string;\n\tchildren?: ReactNode;\n\taside?: ReactNode;\n\tactions?: ReactNode;\n\tfooter?: ReactNode;\n\tclassName?: string;\n\tnavClassName?: string;\n\tcontentClassName?: string;\n\tstrings?: StringsProp<AsideNavShellStrings>;\n}\n\nexport type SettingsShellProps = AsideNavShellProps;\n\nfunction normalizePath(rawUrl?: string): string {\n\tif (!rawUrl) return '';\n\ttry {\n\t\tconst baseOrigin = typeof window !== 'undefined' ? window.location.origin : 'http://localhost';\n\t\tconst parsed = new URL(rawUrl, baseOrigin);\n\t\tconst trimmed = parsed.pathname.replace(/\\/+$/, '');\n\t\treturn trimmed.length > 0 ? trimmed : '/';\n\t} catch {\n\t\tconst clean = rawUrl.split('?')[0] ?? rawUrl;\n\t\tconst trimmed = clean.replace(/\\/+$/, '');\n\t\treturn trimmed.length > 0 ? trimmed : '/';\n\t}\n}\n\nfunction isActiveItem(item: AsideNavItem, currentId?: string, currentPath?: string): boolean {\n\tif (currentId) return item.id === currentId;\n\tif (!currentPath || !item.href) return false;\n\tconst activePath = normalizePath(currentPath);\n\tconst itemPath = normalizePath(item.href);\n\treturn activePath === itemPath || activePath.startsWith(`${itemPath}/`);\n}\n\nexport function AsideNavShell({\n\ttitle,\n\tdescription,\n\tgroups,\n\tcurrentId,\n\tcurrentPath,\n\tchildren,\n\taside,\n\tactions,\n\tfooter,\n\tclassName,\n\tnavClassName,\n\tcontentClassName,\n\trenderLink,\n\tLinkComponent,\n\tstrings: stringsProp,\n}: AsideNavShellProps) {\n\tconst strings = useStrings(defaultAsideNavShellStrings, stringsProp);\n\tconst linkRenderer = resolveLayoutLinkRenderer({ renderLink, LinkComponent });\n\n\treturn (\n\t\t<section\n\t\t\tdata-component=\"aside-nav-shell\"\n\t\t\tdata-slot=\"aside-nav-shell\"\n\t\t\tclassName={cn('aside-nav-shell--component grid min-w-0 gap-5 lg:grid-cols-[17rem_minmax(0,1fr)]', className)}\n\t\t>\n\t\t\t<aside data-slot=\"aside-nav-shell-aside\" className=\"aside-nav-shell--aside min-w-0\">\n\t\t\t\t<SmartCard\n\t\t\t\t\tpadding=\"default\"\n\t\t\t\t\tsurface=\"card\"\n\t\t\t\t\tclassName={cn('aside-nav-shell--nav-card sticky top-[calc(var(--topbar-height)_+_1rem)]', navClassName)}\n\t\t\t\t\tcontentClassName=\"grid gap-4\"\n\t\t\t\t>\n\t\t\t\t\t{!!aside && <div className=\"aside-nav-shell--aside-header\">{aside}</div>}\n\t\t\t\t\t<nav aria-label={strings.navigationAriaLabel} className=\"grid gap-4\">\n\t\t\t\t\t\t{groups.map((group) => (\n\t\t\t\t\t\t\t<div key={group.id} className=\"grid gap-1.5\">\n\t\t\t\t\t\t\t\t{!!group.label && (\n\t\t\t\t\t\t\t\t\t<Text\n\t\t\t\t\t\t\t\t\t\tsize=\"xxs\"\n\t\t\t\t\t\t\t\t\t\ttype=\"secondary\"\n\t\t\t\t\t\t\t\t\t\tweight=\"medium\"\n\t\t\t\t\t\t\t\t\t\tclassName=\"px-2 uppercase tracking-normal\"\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t{group.label}\n\t\t\t\t\t\t\t\t\t</Text>\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t<div className=\"grid gap-0.5\">\n\t\t\t\t\t\t\t\t\t{group.items.map((item) => {\n\t\t\t\t\t\t\t\t\t\tconst Icon = item.icon;\n\t\t\t\t\t\t\t\t\t\tconst active = isActiveItem(item, currentId, currentPath);\n\t\t\t\t\t\t\t\t\t\tconst content = (\n\t\t\t\t\t\t\t\t\t\t\t<span className=\"flex min-w-0 items-center gap-2\">\n\t\t\t\t\t\t\t\t\t\t\t\t{!!Icon && (\n\t\t\t\t\t\t\t\t\t\t\t\t\t<Icon\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t'size-4 shrink-0',\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tactive ? 'text-primary' : 'text-muted-foreground',\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t\t\t<span className=\"grid min-w-0 flex-1 gap-0.5\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t<Text tag=\"span\" weight={active ? 'semibold' : 'medium'} className=\"truncate\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t{item.label}\n\t\t\t\t\t\t\t\t\t\t\t\t\t</Text>\n\t\t\t\t\t\t\t\t\t\t\t\t\t{!!item.description && (\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<Text tag=\"span\" size=\"xs\" type=\"secondary\" className=\"truncate\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{item.description}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t</Text>\n\t\t\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t\t\t\t{!!item.badge && (\n\t\t\t\t\t\t\t\t\t\t\t\t\t<Badge variant={active ? 'primary' : 'secondary'} className=\"shrink-0\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t{item.badge}\n\t\t\t\t\t\t\t\t\t\t\t\t\t</Badge>\n\t\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t\t\t\t<div key={item.id} onClick={() => item.onSelect?.(item.id)}>\n\t\t\t\t\t\t\t\t\t\t\t\t{linkRenderer({\n\t\t\t\t\t\t\t\t\t\t\t\t\thref: item.href,\n\t\t\t\t\t\t\t\t\t\t\t\t\tchildren: content,\n\t\t\t\t\t\t\t\t\t\t\t\t\tactive,\n\t\t\t\t\t\t\t\t\t\t\t\t\tdisabled: item.disabled,\n\t\t\t\t\t\t\t\t\t\t\t\t\texternal: item.external,\n\t\t\t\t\t\t\t\t\t\t\t\t\tclassName: cn(\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t'aside-nav-shell--item flex min-w-0 rounded-md px-2 py-2 text-sm transition-colors',\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring/40',\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tactive\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t? 'bg-primary/8 text-foreground'\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t: 'text-muted-foreground hover:bg-muted/60 hover:text-foreground',\n\t\t\t\t\t\t\t\t\t\t\t\t\t\titem.disabled && 'pointer-events-none opacity-50',\n\t\t\t\t\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\t\t\t\t\t'aria-label': typeof item.label === 'string' ? item.label : undefined,\n\t\t\t\t\t\t\t\t\t\t\t\t})}\n\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t\t})}\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t))}\n\t\t\t\t\t</nav>\n\t\t\t\t</SmartCard>\n\t\t\t</aside>\n\n\t\t\t<div data-slot=\"aside-nav-shell-main\" className={cn('aside-nav-shell--main min-w-0 space-y-4', contentClassName)}>\n\t\t\t\t{(title || description || actions) && (\n\t\t\t\t\t<header className=\"aside-nav-shell--header flex min-w-0 flex-col gap-3 sm:flex-row sm:items-start sm:justify-between\">\n\t\t\t\t\t\t<div className=\"min-w-0\">\n\t\t\t\t\t\t\t{!!title && <Heading tag=\"h2\" className=\"border-0 pb-0\">{title}</Heading>}\n\t\t\t\t\t\t\t{!!description && (\n\t\t\t\t\t\t\t\t<Text type=\"secondary\" className=\"mt-1 max-w-3xl\">\n\t\t\t\t\t\t\t\t\t{description}\n\t\t\t\t\t\t\t\t</Text>\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t{!!actions && <div className=\"flex shrink-0 flex-wrap items-center gap-2\">{actions}</div>}\n\t\t\t\t\t</header>\n\t\t\t\t)}\n\t\t\t\t<div data-slot=\"aside-nav-shell-content\" className=\"aside-nav-shell--content min-w-0\">\n\t\t\t\t\t{children}\n\t\t\t\t</div>\n\t\t\t\t{!!footer && <footer className=\"aside-nav-shell--footer\">{footer}</footer>}\n\t\t\t</div>\n\t\t</section>\n\t);\n}\n\nexport const SettingsShell = AsideNavShell;\n\nAsideNavShell.displayName = 'AsideNavShell';\n"],"mappings":"2PAiBA,IAAa,EAAoD,CAChE,oBAAqB,qBACtB,EAsCA,SAAS,EAAc,EAAyB,CAC/C,GAAI,CAAC,EAAQ,MAAO,GACpB,GAAI,CACH,IAAM,EAAa,OAAO,OAAW,IAAc,OAAO,SAAS,OAAS,mBAEtE,EAAU,IADG,IAAI,EAAQ,CACf,EAAO,SAAS,QAAQ,OAAQ,EAAE,EAClD,OAAO,EAAQ,OAAS,EAAI,EAAU,GACvC,MAAQ,CAEP,IAAM,GADQ,EAAO,MAAM,GAAG,EAAE,IAAM,GAChB,QAAQ,OAAQ,EAAE,EACxC,OAAO,EAAQ,OAAS,EAAI,EAAU,GACvC,CACD,CAEA,SAAS,EAAa,EAAoB,EAAoB,EAA+B,CAC5F,GAAI,EAAW,OAAO,EAAK,KAAO,EAClC,GAAI,CAAC,GAAe,CAAC,EAAK,KAAM,MAAO,GACvC,IAAM,EAAa,EAAc,CAAW,EACtC,EAAW,EAAc,EAAK,IAAI,EACxC,OAAO,IAAe,GAAY,EAAW,WAAW,GAAG,EAAS,EAAE,CACvE,CAEA,SAAgB,EAAc,CAC7B,QACA,cACA,SACA,YACA,cACA,WACA,QACA,UACA,SACA,YACA,eACA,mBACA,aACA,gBACA,QAAS,GACa,CACtB,IAAM,EAAU,EAAA,WAAW,EAA6B,CAAW,EAC7D,EAAe,EAAA,EAA0B,CAAE,aAAY,eAAc,CAAC,EAE5E,OACC,EAAA,EAAA,MAAC,UAAD,CACC,iBAAe,kBACf,YAAU,kBACV,UAAW,EAAA,GAAG,mFAAoF,CAAS,WAH5G,EAKC,EAAA,EAAA,KAAC,QAAD,CAAO,YAAU,wBAAwB,UAAU,2CAClD,EAAA,EAAA,MAAC,EAAA,EAAD,CACC,QAAQ,UACR,QAAQ,OACR,UAAW,EAAA,GAAG,2EAA4E,CAAY,EACtG,iBAAiB,sBAJlB,CAME,CAAC,CAAC,IAAS,EAAA,EAAA,KAAC,MAAD,CAAK,UAAU,yCAAiC,CAAW,CAAA,GACvE,EAAA,EAAA,KAAC,MAAD,CAAK,aAAY,EAAQ,oBAAqB,UAAU,sBACtD,EAAO,IAAK,IACZ,EAAA,EAAA,MAAC,MAAD,CAAoB,UAAU,wBAA9B,CACE,CAAC,CAAC,EAAM,QACR,EAAA,EAAA,KAAC,EAAA,EAAD,CACC,KAAK,MACL,KAAK,YACL,OAAO,SACP,UAAU,0CAET,EAAM,KACF,CAAA,GAEP,EAAA,EAAA,KAAC,MAAD,CAAK,UAAU,wBACb,EAAM,MAAM,IAAK,GAAS,CAC1B,IAAM,EAAO,EAAK,KACZ,EAAS,EAAa,EAAM,EAAW,CAAW,EAClD,GACL,EAAA,EAAA,MAAC,OAAD,CAAM,UAAU,2CAAhB,CACE,CAAC,CAAC,IACF,EAAA,EAAA,KAAC,EAAD,CACC,UAAW,EAAA,GACV,kBACA,EAAS,eAAiB,uBAC3B,CACA,CAAA,GAEF,EAAA,EAAA,MAAC,OAAD,CAAM,UAAU,uCAAhB,EACC,EAAA,EAAA,KAAC,EAAA,EAAD,CAAM,IAAI,OAAO,OAAQ,EAAS,WAAa,SAAU,UAAU,oBACjE,EAAK,KACD,CAAA,EACL,CAAC,CAAC,EAAK,cACP,EAAA,EAAA,KAAC,EAAA,EAAD,CAAM,IAAI,OAAO,KAAK,KAAK,KAAK,YAAY,UAAU,oBACpD,EAAK,WACD,CAAA,CAEF,IACL,CAAC,CAAC,EAAK,QACP,EAAA,EAAA,KAAC,EAAA,EAAD,CAAO,QAAS,EAAS,UAAY,YAAa,UAAU,oBAC1D,EAAK,KACA,CAAA,CAEH,IAGP,OACC,EAAA,EAAA,KAAC,MAAD,CAAmB,YAAe,EAAK,WAAW,EAAK,EAAE,WACvD,EAAa,CACb,KAAM,EAAK,KACX,SAAU,EACV,SACA,SAAU,EAAK,SACf,SAAU,EAAK,SACf,UAAW,EAAA,GACV,oFACA,6EACA,EACG,+BACA,gEACH,EAAK,UAAY,gCAClB,EACA,aAAc,OAAO,EAAK,OAAU,SAAW,EAAK,MAAQ,IAAA,EAC7D,CAAC,CACG,EAjBK,EAAK,EAiBV,CAEP,CAAC,CACG,CAAA,CACD,GAjEK,EAAM,EAiEX,CACL,CACG,CAAA,CACK,GACL,CAAA,GAEP,EAAA,EAAA,MAAC,MAAD,CAAK,YAAU,uBAAuB,UAAW,EAAA,GAAG,0CAA2C,CAAgB,WAA/G,EACG,GAAS,GAAe,KACzB,EAAA,EAAA,MAAC,SAAD,CAAQ,UAAU,6GAAlB,EACC,EAAA,EAAA,MAAC,MAAD,CAAK,UAAU,mBAAf,CACE,CAAC,CAAC,IAAS,EAAA,EAAA,KAAC,EAAA,EAAD,CAAS,IAAI,KAAK,UAAU,yBAAiB,CAAe,CAAA,EACvE,CAAC,CAAC,IACF,EAAA,EAAA,KAAC,EAAA,EAAD,CAAM,KAAK,YAAY,UAAU,0BAC/B,CACI,CAAA,CAEH,IACJ,CAAC,CAAC,IAAW,EAAA,EAAA,KAAC,MAAD,CAAK,UAAU,sDAA8C,CAAa,CAAA,CACjF,KAET,EAAA,EAAA,KAAC,MAAD,CAAK,YAAU,0BAA0B,UAAU,mCACjD,UACG,CAAA,EACJ,CAAC,CAAC,IAAU,EAAA,EAAA,KAAC,SAAD,CAAQ,UAAU,mCAA2B,CAAe,CAAA,CACrE,GACG,GAEX,CAEA,IAAa,EAAgB,EAE7B,EAAc,YAAc"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
const e=require("./chunk-CMqjfN_6.cjs"),t=require("../lib/strings.cjs"),n=require("../lib/utils.cjs"),r=require("./tooltip-mvxZV_Lu.cjs"),i=require("./typography-GtkgK9QX.cjs"),a=require("./dropdown-menu-CHQzQWUK.cjs"),o=require("./scroll-area-CIRXK7s0.cjs"),s=require("./avatar-BnKM_o2d.cjs"),c=require("./skeleton-D1c5OHXa.cjs"),l=require("./sheet-BOgUA4fC.cjs"),u=require("./sidebar-Cwhom9QE.cjs"),d=require("./hooks-Cjl7LJpn.cjs");let f=require("react");f=e.t(f,1);let p=require("react/jsx-runtime"),m=require("lucide-react"),h=require("class-variance-authority");var g=u.w;function _({defaultOpen:e=!0,open:t,onOpenChange:i,className:a,style:o,children:s,...c}){return(0,p.jsx)(r.r,{delayDuration:0,children:(0,p.jsx)(u.b,{defaultOpen:e,open:t,onOpenChange:i,style:o,className:n.cn(`min-h-svh`,a),...c,children:s})})}var v=`18rem`;(0,h.cva)(`peer/menu-button flex w-full items-center gap-2 overflow-hidden rounded-md p-2 text-left text-sm outline-hidden ring-sidebar-ring transition-[width,height,padding] hover:bg-sidebar-accent hover:text-sidebar-accent-foreground focus-visible:ring-2 active:bg-sidebar-accent active:text-sidebar-accent-foreground disabled:pointer-events-none disabled:opacity-50 group-has-data-[sidebar=menu-action]/menu-item:pr-8 aria-disabled:pointer-events-none aria-disabled:opacity-50 data-[active=true]:bg-sidebar-accent data-[active=true]:font-medium data-[active=true]:text-sidebar-accent-foreground data-[state=open]:hover:bg-sidebar-accent data-[state=open]:hover:text-sidebar-accent-foreground group-data-[collapsible=icon]:size-8! group-data-[collapsible=icon]:p-2! [&>span:last-child]:truncate [&>svg]:size-4 [&>svg]:shrink-0`,{variants:{variant:{default:`hover:bg-sidebar-accent hover:text-sidebar-accent-foreground`,outline:`bg-background shadow-[0_0_0_1px_var(--sidebar-border)] hover:bg-sidebar-accent hover:text-sidebar-accent-foreground hover:shadow-[0_0_0_1px_var(--sidebar-accent)]`},size:{default:`h-8 text-sm`,sm:`h-7 text-xs`,lg:`h-12 text-sm group-data-[collapsible=icon]:p-0!`}},defaultVariants:{variant:`default`,size:`default`}});var y={mobileTitle:`Sidebar`,mobileDescription:`Displays the mobile sidebar.`};function b({side:e=`left`,variant:r=`sidebar`,collapsible:i=`offcanvas`,className:a,surfaceClassName:o,children:s,strings:c,...u}){let{isMobile:d,state:f,openMobile:m,setOpenMobile:h}=g(),_=t.useStrings(y,c);return i===`none`?(0,p.jsx)(`div`,{"data-slot":`sidebar`,className:n.cn(`flex h-full w-(--sidebar-width) flex-col bg-sidebar text-sidebar-foreground`,o,a),...u,children:s}):d?(0,p.jsx)(l.t,{open:m,onOpenChange:h,...u,children:(0,p.jsxs)(l.r,{"data-sidebar":`sidebar`,"data-slot":`sidebar`,"data-mobile":`true`,className:n.cn(`w-(--sidebar-width) bg-sidebar p-0 text-sidebar-foreground [&>button]:hidden`,o),style:{"--sidebar-width":v},side:e,children:[(0,p.jsxs)(l.o,{className:`sr-only`,children:[(0,p.jsx)(l.s,{children:_.mobileTitle}),(0,p.jsx)(l.i,{children:_.mobileDescription})]}),(0,p.jsx)(`div`,{className:`flex h-full w-full flex-col`,children:s})]})}):(0,p.jsx)(`div`,{className:`group peer sticky top-0 hidden h-full text-sidebar-foreground md:block`,"data-state":f,"data-collapsible":f===`collapsed`?i:``,"data-variant":r,"data-side":e,"data-slot":`sidebar`,children:(0,p.jsx)(`div`,{className:n.cn(`inset-y-0 z-10 hidden h-full w-(--sidebar-width) transition-[left,right,width] duration-200 ease-linear md:flex`,e===`left`?`left-0 group-data-[collapsible=offcanvas]:left-[calc(var(--sidebar-width)*-1)]`:`right-0 group-data-[collapsible=offcanvas]:right-[calc(var(--sidebar-width)*-1)]`,r===`floating`||r===`inset`?`px-2 py-3 group-data-[collapsible=icon]:w-17`:`group-data-[collapsible=icon]:w-(--sidebar-width-icon)`,a),...u,children:(0,p.jsx)(`div`,{"data-sidebar":`sidebar`,className:n.cn(`sidebar flex h-full w-full flex-col bg-sidebar group-data-[variant=floating]:rounded-lg group-data-[variant=floating]:shadow-sm`,o),children:s})})})}function x({item:e,active:t=!1}){let n=d.o(e);return(0,p.jsx)(i.s,{tag:`span`,weight:t?`bold`:`medium`,className:`truncate text-inherit`,children:n})}function S({navigationByGroups:e,currentUrl:t=`/`,iconMap:r={},liveBadges:a,renderLink:o,LinkComponent:s,emptySlot:c,renderItem:l,className:m}){let h=d.d({renderLink:o,LinkComponent:s}),g=e=>!!e&&d.s(t,d.u(e)),_=e=>{let n=-1,r=-1;for(let i=0;i<e.length;i+=1){let a=e[i],o=a?.href?d.u(a.href):``;o&&d.s(t,o)&&o.length>r&&(r=o.length,n=i)}return n},v=e=>!!e?.some(e=>g(e.href)||v(e.children)),y=(e,t=0,o=0)=>{let s=!!e.children?.length,c=g(e.href),m=s?v(e.children):!1,y=c||m,b=d.l(e.handle,e.badge,a),S=d.o(e),C={depth:t,active:c,expanded:y,badge:b,renderLink:h};if(l)return(0,p.jsx)(f.Fragment,{children:l(e,C)},d.a(e,o));if(s){let t=_(e.children??[]),s=(0,p.jsxs)(p.Fragment,{children:[!!e.icon&&(0,p.jsx)(d.r,{icon:e.icon,iconMap:r,className:`size-4`,"aria-hidden":`true`}),(0,p.jsx)(x,{item:e,active:y}),!!b&&(0,p.jsx)(d.i,{value:b})]});return(0,p.jsxs)(u.g,{children:[(0,p.jsx)(u.t,{isActive:y,render:e.href&&!e.disabled?d.c(h,e,s,void 0,y):void 0,tooltip:{children:S},disabled:e.disabled,className:n.cn(`h-8 font-medium`,y&&`font-bold data-active:font-bold data-[active=true]:font-bold`,c&&`bg-sidebar-accent text-sidebar-foreground`,!c&&m&&`bg-sidebar-accent/60 text-sidebar-foreground`,e.disabled&&`cursor-not-allowed opacity-50`),children:s}),!!y&&(0,p.jsx)(u.v,{className:`gap-0.5`,children:e.children?.map((e,r)=>{let o=r===t||g(e.href),s=d.l(e.handle,e.badge,a),c=d.o(e),l=(0,p.jsxs)(p.Fragment,{children:[typeof c==`string`||typeof c==`number`?(0,p.jsx)(i.s,{tag:`span`,weight:o?`semibold`:`regular`,className:`min-w-0 flex-1 truncate text-inherit`,children:c}):c,!!s&&(0,p.jsx)(d.i,{value:s,size:`small`})]});return(0,p.jsx)(u.y,{children:(0,p.jsx)(u.n,{isActive:o,render:e.href&&!e.disabled?d.c(h,e,l,void 0,o):void 0,className:n.cn(`w-full`,o&&`bg-transparent font-semibold text-primary hover:text-primary active:text-primary data-active:text-primary data-[active=true]:text-primary`),children:l})},d.a(e,r))})})]},d.a(e,o))}let w=(0,p.jsxs)(p.Fragment,{children:[!!e.icon&&(0,p.jsx)(d.r,{icon:e.icon,iconMap:r,className:`size-4`,"aria-hidden":`true`}),(0,p.jsx)(x,{item:e,active:c}),!!b&&(0,p.jsx)(d.i,{value:b})]});return(0,p.jsx)(u.g,{children:(0,p.jsx)(u.t,{isActive:c,render:e.href&&!e.disabled?d.c(h,e,w,void 0,c):void 0,tooltip:{children:S},disabled:e.disabled,className:n.cn(`h-8 font-medium`,c&&`font-bold data-active:font-bold data-[active=true]:font-bold`,c&&`bg-sidebar-accent text-sidebar-foreground`,e.disabled&&`cursor-not-allowed opacity-50`),children:w})},d.a(e,o))},b=Object.entries(e).filter(([,e])=>e.length>0);return b.length===0?c??null:(0,p.jsx)(`div`,{className:m,children:b.map(([e,t],n)=>(0,p.jsxs)(f.Fragment,{children:[(0,p.jsxs)(u.o,{className:`px-2 py-0`,children:[!e.startsWith(`_`)&&(0,p.jsx)(u.l,{children:e}),(0,p.jsx)(u.p,{className:`gap-0.5`,children:t.map((e,t)=>y(e,0,t))})]}),n<b.length-1&&(0,p.jsx)(u.S,{className:`!mx-auto !my-1.5 !w-11/12 overflow-hidden px-4`})]},e))})}function C({logo:e,collapsedLogo:t=null,className:r}){let{state:i}=g(),a=i===`collapsed`?t:e;return a?(0,p.jsx)(`div`,{className:n.cn(`min-w-0`,r),children:a}):null}function w({items:e,label:t,currentUrl:r=`/`,iconMap:a={},liveBadges:o,renderLink:s,LinkComponent:c,className:l}){let f=d.d({renderLink:s,LinkComponent:c});return(0,p.jsxs)(u.o,{className:n.cn(`group-data-[collapsible=icon]:p-0`,l),children:[!!t&&(0,p.jsx)(u.l,{children:t}),(0,p.jsx)(u.c,{children:(0,p.jsx)(u.p,{className:`gap-0.5`,children:e.map((e,t)=>{let s=!!e.href&&d.s(r,d.u(e.href)),c=d.l(e.handle,e.badge,o),l=d.o(e),h=(0,p.jsxs)(p.Fragment,{children:[!!e.icon&&(0,p.jsx)(d.r,{icon:e.icon,iconMap:a,className:`size-4`,"aria-hidden":`true`}),typeof l==`string`||typeof l==`number`?(0,p.jsx)(i.s,{tag:`span`,className:`truncate text-inherit`,children:l}):l,!!c&&(0,p.jsx)(d.i,{value:c}),!!e.external&&(0,p.jsx)(m.ExternalLink,{className:`ml-auto size-3 opacity-50`,"aria-hidden":`true`})]});return(0,p.jsx)(u.g,{children:(0,p.jsx)(u.t,{isActive:s,render:e.href&&!e.disabled?d.c(f,e,h,void 0,s):void 0,className:n.cn(`h-8 font-medium text-sidebar-foreground/70 hover:text-sidebar-accent-foreground`,s&&`bg-sidebar-accent text-sidebar-accent-foreground`),tooltip:{children:l},disabled:e.disabled,children:h})},d.a(e,t))})})})]})}var T={label:`Workspace`,select:`Select workspace`};function E({logo:e,collapsedLogo:r,workspaceLinks:o,renderLink:s,LinkComponent:c,strings:l,contentClassName:f}){let h=t.useStrings(T,l),_=d.d({renderLink:s,LinkComponent:c}),{state:v}=g(),y=v===`collapsed`;return(0,p.jsx)(u.p,{children:(0,p.jsx)(u.g,{children:(0,p.jsxs)(a.t,{children:[(0,p.jsxs)(a.g,{render:(0,p.jsx)(u.t,{size:`lg`,className:`data-[state=open]:bg-sidebar-accent data-[state=open]:text-sidebar-accent-foreground`}),children:[(0,p.jsxs)(`div`,{className:`flex min-w-0 flex-1 items-center gap-2`,children:[y?r??e:e,!y&&(0,p.jsx)(i.s,{tag:`span`,size:`xs`,className:`sr-only`,children:h.select})]}),!y&&(0,p.jsx)(m.ChevronsUpDown,{className:`ml-auto size-4 shrink-0`,"aria-hidden":`true`})]}),(0,p.jsx)(a.r,{className:n.cn(`min-w-56`,f),align:`start`,side:`right`,sideOffset:8,children:(0,p.jsxs)(a.i,{children:[(0,p.jsx)(a.o,{children:(0,p.jsx)(i.s,{weight:`semibold`,children:h.label})}),(0,p.jsx)(a.d,{}),o.map(e=>{let t=(0,p.jsxs)(p.Fragment,{children:[(0,p.jsx)(e.icon??m.ExternalLink,{className:`size-4 shrink-0`,"aria-hidden":`true`}),(0,p.jsx)(i.s,{tag:`span`,size:`xs`,className:`text-inherit`,children:e.label})]});return(0,p.jsx)(a.a,{render:_({href:e.url,external:e.external??!0,children:null,className:`flex items-center gap-2`}),children:t},e.url)})]})})]})})})}function D({navigationGroups:e,footerNavItems:t=[],footerLabel:r,logo:i,collapsedLogo:a,workspaceLinks:s=[],workspaceStrings:c,workspaceContentClassName:l,headerClassName:d,logoClassName:f,iconMap:m,currentUrl:h=`/`,liveBadges:g,renderLink:_,LinkComponent:v,loading:y,collapsible:x=`icon`,variant:T=`sidebar`,side:D=`left`,className:k,surfaceClassName:A,contentClassName:j,slots:M,renderItem:N}){let P=t.length>0||!!M?.footer,F=y||!e,I=s.length>0;return(0,p.jsxs)(b,{collapsible:x,variant:T,side:D,className:n.cn(`h-svh`,k),surfaceClassName:A,children:[M?.header??(!!i&&(0,p.jsx)(u.u,{className:d,children:I?(0,p.jsx)(E,{logo:i,collapsedLogo:a,workspaceLinks:s,strings:c,contentClassName:l,renderLink:_,LinkComponent:v}):(0,p.jsx)(C,{logo:i,collapsedLogo:a,className:f})})),(0,p.jsx)(u.i,{className:j,children:(0,p.jsxs)(o.t,{className:`h-full pr-1.5 pt-4`,children:[M?.beforeNavigation,F?M?.loading??(0,p.jsx)(O,{}):(0,p.jsx)(S,{navigationByGroups:e,currentUrl:h,iconMap:m,liveBadges:g,renderLink:_,LinkComponent:v,emptySlot:M?.empty,renderItem:N}),M?.afterNavigation]})}),P&&(0,p.jsx)(u.a,{children:M?.footer??(0,p.jsx)(w,{items:t,label:r,currentUrl:h,iconMap:m,liveBadges:g,renderLink:_,LinkComponent:v})})]})}function O(){let e=[9,3,4,2,1];return(0,p.jsx)(p.Fragment,{children:e.map((t,n)=>(0,p.jsxs)(f.Fragment,{children:[(0,p.jsx)(u.o,{className:`px-2 py-0`,children:(0,p.jsx)(u.p,{className:`gap-0.5`,children:Array.from({length:t},(e,t)=>(0,p.jsx)(u.g,{children:(0,p.jsxs)(`div`,{className:`flex h-8 items-center gap-2 px-2`,children:[(0,p.jsx)(c.t,{className:`h-4 w-4 shrink-0 rounded`}),(0,p.jsx)(c.t,{className:`h-3.5 rounded`,style:{width:`${60+(n*7+t*13)%40}px`}})]})},t))})}),n<e.length-1&&(0,p.jsx)(u.S,{className:`!mx-auto !my-1 !w-11/12 overflow-hidden px-4`})]},n))})}function k({item:e}){return(0,p.jsx)(i.s,{tag:`span`,weight:`medium`,className:`truncate text-inherit`,children:d.o(e)})}function A({items:e,label:t=`Platform`,currentUrl:r=`/`,iconMap:i={},liveBadges:a,renderLink:o,LinkComponent:s,renderItem:c,className:l}){let m=d.d({renderLink:o,LinkComponent:s});return(0,p.jsxs)(u.o,{className:n.cn(`px-2 py-0`,l),children:[!!t&&(0,p.jsx)(u.l,{children:t}),(0,p.jsx)(u.p,{className:`gap-0.5`,children:e.map((e,t)=>{let o=!!e.href&&d.s(r,d.u(e.href)),s=d.l(e.handle,e.badge,a),l={depth:0,active:o,expanded:!1,badge:s,renderLink:m},h=d.o(e);if(c)return(0,p.jsx)(f.Fragment,{children:c(e,l)},d.a(e,t));let g=(0,p.jsxs)(p.Fragment,{children:[!!e.icon&&(0,p.jsx)(d.r,{icon:e.icon,iconMap:i,className:`size-4`,"aria-hidden":`true`}),(0,p.jsx)(k,{item:e}),!!s&&(0,p.jsx)(d.i,{value:s})]});return(0,p.jsx)(u.g,{children:(0,p.jsx)(u.t,{isActive:o,render:e.href&&!e.disabled?d.c(m,e,g,void 0,o):void 0,tooltip:{children:h},disabled:e.disabled,className:n.cn(`h-8 font-medium`,o&&`bg-sidebar-accent text-sidebar-foreground`,e.disabled&&`cursor-not-allowed opacity-50`),children:g})},d.a(e,t))})})]})}var j={profile:`Profile`,settings:`Settings`,logout:`Log out`};function M(e){return e.split(` `).map(e=>e[0]).filter(Boolean).slice(0,2).join(``).toUpperCase()}function N({user:e,customContent:n,onProfile:r,onSettings:o,onLogout:c,strings:l,renderTrigger:d}){let f=t.useStrings(j,l),{state:h,isMobile:_}=g(),v=_||h!==`collapsed`?`bottom`:`right`,y=M(e.name),b=(0,p.jsxs)(p.Fragment,{children:[!!r&&(0,p.jsxs)(a.a,{onClick:r,children:[(0,p.jsx)(m.User,{className:`mr-2 size-4`,"aria-hidden":`true`}),(0,p.jsx)(i.s,{tag:`span`,size:`xs`,className:`text-inherit`,children:f.profile})]}),!!o&&(0,p.jsxs)(a.a,{onClick:o,children:[(0,p.jsx)(m.Settings,{className:`mr-2 size-4`,"aria-hidden":`true`}),(0,p.jsx)(i.s,{tag:`span`,size:`xs`,className:`text-inherit`,children:f.settings})]}),!!(r||o)&&!!c&&(0,p.jsx)(a.d,{}),!!c&&(0,p.jsxs)(a.a,{onClick:c,children:[(0,p.jsx)(m.LogOut,{className:`mr-2 size-4`,"aria-hidden":`true`}),(0,p.jsx)(i.s,{tag:`span`,size:`xs`,className:`text-inherit`,children:f.logout})]})]});return(0,p.jsx)(u.p,{children:(0,p.jsx)(u.g,{children:(0,p.jsxs)(a.t,{children:[(0,p.jsx)(a.g,{render:(0,p.jsx)(u.t,{size:`lg`,className:`group text-sidebar-accent-foreground data-[state=open]:bg-sidebar-accent`}),children:d?.(e)??(0,p.jsxs)(p.Fragment,{children:[(0,p.jsxs)(`div`,{className:`flex min-w-0 flex-1 items-center gap-2`,children:[(0,p.jsxs)(s.t,{className:`size-avatar rounded-full`,children:[!!e.avatar&&(0,p.jsx)(s.o,{src:e.avatar,alt:e.name}),(0,p.jsx)(s.r,{className:`bg-sidebar-accent text-xs text-sidebar-accent-foreground`,children:y})]}),(0,p.jsxs)(`div`,{className:`flex flex-1 flex-col items-start justify-center overflow-hidden`,children:[(0,p.jsx)(i.s,{weight:`medium`,className:`w-full truncate`,children:e.name}),!!e.email&&(0,p.jsx)(i.s,{size:`xs`,type:`secondary`,className:`w-full truncate`,children:e.email})]})]}),(0,p.jsx)(m.ChevronsUpDown,{className:`ml-auto size-4 shrink-0`,"aria-hidden":`true`})]})}),(0,p.jsx)(a.r,{className:`w-(--radix-dropdown-menu-trigger-width) min-w-56 rounded-lg`,align:`end`,side:v,sideOffset:4,children:n??b})]})})})}Object.defineProperty(exports,"a",{enumerable:!0,get:function(){return E}}),Object.defineProperty(exports,"c",{enumerable:!0,get:function(){return C}}),Object.defineProperty(exports,"d",{enumerable:!0,get:function(){return y}}),Object.defineProperty(exports,"f",{enumerable:!0,get:function(){return _}}),Object.defineProperty(exports,"i",{enumerable:!0,get:function(){return D}}),Object.defineProperty(exports,"l",{enumerable:!0,get:function(){return S}}),Object.defineProperty(exports,"n",{enumerable:!0,get:function(){return j}}),Object.defineProperty(exports,"o",{enumerable:!0,get:function(){return T}}),Object.defineProperty(exports,"p",{enumerable:!0,get:function(){return g}}),Object.defineProperty(exports,"r",{enumerable:!0,get:function(){return A}}),Object.defineProperty(exports,"s",{enumerable:!0,get:function(){return w}}),Object.defineProperty(exports,"t",{enumerable:!0,get:function(){return N}}),Object.defineProperty(exports,"u",{enumerable:!0,get:function(){return b}});
|
|
2
|
+
//# sourceMappingURL=sidebar-Cq6J_I4l.cjs.map
|