@customafk/lunas-ui 0.2.37 → 0.2.38
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/dist/{alert-DubR6Szk.cjs → alert-B2PaDJp6.cjs} +2 -2
- package/dist/{alert-DubR6Szk.cjs.map → alert-B2PaDJp6.cjs.map} +1 -1
- package/dist/{alert-CT7oAzCC.d.mts → alert-C-bk-pne.d.mts} +5 -5
- package/dist/{alert-lqPNRRvJ.d.cts → alert-DDxGzOzi.d.cts} +5 -5
- package/dist/{avatar-CqRl9dge.cjs → avatar-TyOphzGo.cjs} +2 -2
- package/dist/{avatar-CqRl9dge.cjs.map → avatar-TyOphzGo.cjs.map} +1 -1
- package/dist/{avatar-m1LjDIil.mjs → avatar-fltdRVsJ.mjs} +1 -1
- package/dist/{avatar-m1LjDIil.mjs.map → avatar-fltdRVsJ.mjs.map} +1 -1
- package/dist/{badge-Bhbhmsic.mjs → badge-CDGBGq8X.mjs} +1 -1
- package/dist/{badge-Bhbhmsic.mjs.map → badge-CDGBGq8X.mjs.map} +1 -1
- package/dist/{badge-C4nTfJGX.d.mts → badge-IUtmECjN.d.cts} +7 -7
- package/dist/{badge-DMnKV_uW.cjs → badge-KW7xu5Ca.cjs} +2 -2
- package/dist/{badge-DMnKV_uW.cjs.map → badge-KW7xu5Ca.cjs.map} +1 -1
- package/dist/{badge-Dq-Yyus_.d.cts → badge-lvr8nB_0.d.mts} +7 -7
- package/dist/{button-CYLxBCfa.d.cts → button-Brw-tmr9.d.cts} +5 -5
- package/dist/{button-Bu4ejNOW.cjs → button-C--DAN1D.cjs} +2 -2
- package/dist/button-C--DAN1D.cjs.map +1 -0
- package/dist/button-CCVJTHBI.mjs +2 -0
- package/dist/button-CCVJTHBI.mjs.map +1 -0
- package/dist/{button-DlFsSFmT.d.mts → button-DhDRMeFA.d.mts} +5 -5
- package/dist/{button.variants-tnhb123u.cjs → button.variants-4kw6plrv.cjs} +2 -2
- package/dist/{button.variants-tnhb123u.cjs.map → button.variants-4kw6plrv.cjs.map} +1 -1
- package/dist/{button.variants-B8aRZ52K.mjs → button.variants-DkMqWB8G.mjs} +1 -1
- package/dist/{button.variants-B8aRZ52K.mjs.map → button.variants-DkMqWB8G.mjs.map} +1 -1
- package/dist/{calendar-CMd11yg9.cjs → calendar-4weBDnXz.cjs} +2 -2
- package/dist/{calendar-CMd11yg9.cjs.map → calendar-4weBDnXz.cjs.map} +1 -1
- package/dist/{calendar-BDhIfwPP.mjs → calendar-R866yyd1.mjs} +2 -2
- package/dist/{calendar-BDhIfwPP.mjs.map → calendar-R866yyd1.mjs.map} +1 -1
- package/dist/cards/grid-product-card.cjs +1 -1
- package/dist/cards/grid-product-card.mjs +1 -1
- package/dist/cards/product-card.cjs +1 -1
- package/dist/cards/product-card.mjs +1 -1
- package/dist/cards/simple-card.cjs +1 -1
- package/dist/cards/simple-card.d.mts +2 -2
- package/dist/cards/simple-card.mjs +1 -1
- package/dist/{checkbox-CgHaRkuU.mjs → checkbox-Cat3i08X.mjs} +1 -1
- package/dist/{checkbox-CgHaRkuU.mjs.map → checkbox-Cat3i08X.mjs.map} +1 -1
- package/dist/{checkbox-BwDvS4De.cjs → checkbox-Dsq-MSbH.cjs} +2 -2
- package/dist/{checkbox-BwDvS4De.cjs.map → checkbox-Dsq-MSbH.cjs.map} +1 -1
- package/dist/chunk-350yNsax.cjs +1 -0
- package/dist/{close-DrCUWZt0.cjs → close-Dlo1bI8x.cjs} +2 -2
- package/dist/{close-DrCUWZt0.cjs.map → close-Dlo1bI8x.cjs.map} +1 -1
- package/dist/{close-B7OOMSZl.mjs → close-_UHFeiLS.mjs} +1 -1
- package/dist/{close-B7OOMSZl.mjs.map → close-_UHFeiLS.mjs.map} +1 -1
- package/dist/cms-layout-BCH4NroR.cjs +2 -0
- package/dist/cms-layout-BCH4NroR.cjs.map +1 -0
- package/dist/cms-layout-DkCR1AfG.mjs +2 -0
- package/dist/cms-layout-DkCR1AfG.mjs.map +1 -0
- package/dist/{command-DiXzSGc8.cjs → command-CsP8a1Un.cjs} +2 -2
- package/dist/{command-DiXzSGc8.cjs.map → command-CsP8a1Un.cjs.map} +1 -1
- package/dist/{command-FnbrPZ7_.mjs → command-D6_CSbwJ.mjs} +2 -2
- package/dist/{command-FnbrPZ7_.mjs.map → command-D6_CSbwJ.mjs.map} +1 -1
- package/dist/data-display/country.cjs +1 -1
- package/dist/data-display/country.mjs +1 -1
- package/dist/data-display/data-list.cjs +1 -1
- package/dist/data-display/date-tooltip.cjs +1 -1
- package/dist/data-display/date-tooltip.mjs +1 -1
- package/dist/data-display/date.cjs +1 -1
- package/dist/data-display/date.mjs +1 -1
- package/dist/data-display/empty.cjs +1 -1
- package/dist/data-display/name.cjs +1 -1
- package/dist/data-display/name.mjs +1 -1
- package/dist/data-display/phone-number.cjs +1 -1
- package/dist/data-display/phone-number.mjs +1 -1
- package/dist/data-display/role-badge.cjs +1 -1
- package/dist/data-display/role-badge.mjs +1 -1
- package/dist/data-display/statistic.cjs +1 -1
- package/dist/data-display/statistic.d.cts +3 -3
- package/dist/data-display/statistic.d.mts +3 -3
- package/dist/data-display/statistic.mjs +1 -1
- package/dist/data-display/user.cjs +1 -1
- package/dist/data-display/user.mjs +1 -1
- package/dist/{date-DtajzNoy.cjs → date-D4NVl6C9.cjs} +2 -2
- package/dist/{date-DtajzNoy.cjs.map → date-D4NVl6C9.cjs.map} +1 -1
- package/dist/{date-CFgc7pK3.mjs → date-fY3sUcLp.mjs} +1 -1
- package/dist/{date-CFgc7pK3.mjs.map → date-fY3sUcLp.mjs.map} +1 -1
- package/dist/{dialog-D1sWnn6n.cjs → dialog-BigPrWIj.cjs} +2 -2
- package/dist/{dialog-D1sWnn6n.cjs.map → dialog-BigPrWIj.cjs.map} +1 -1
- package/dist/{dialog-EGFZeITu.mjs → dialog-CLDnvNH_.mjs} +2 -2
- package/dist/{dialog-EGFZeITu.mjs.map → dialog-CLDnvNH_.mjs.map} +1 -1
- package/dist/{dialog-_zfOGo8B.d.mts → dialog-CsltUGHB.d.mts} +12 -12
- package/dist/{dialog-1ArhWB8r.d.cts → dialog-D0zfwr8i.d.cts} +12 -12
- package/dist/dialogs/confirm-dialog.cjs +1 -1
- package/dist/dialogs/confirm-dialog.mjs +1 -1
- package/dist/dialogs/detail-dialog/components/sidebar.cjs +1 -1
- package/dist/dialogs/detail-dialog/components/sidebar.d.cts +24 -24
- package/dist/dialogs/detail-dialog/components/sidebar.d.mts +24 -24
- package/dist/dialogs/detail-dialog/components/sidebar.mjs +1 -1
- package/dist/dialogs/detail-dialog/index.cjs +1 -1
- package/dist/dialogs/detail-dialog/index.mjs +1 -1
- package/dist/dialogs/error-dialog.cjs +1 -1
- package/dist/dialogs/error-dialog.mjs +1 -1
- package/dist/dialogs/loading-dialog.cjs +1 -1
- package/dist/dialogs/loading-dialog.mjs +1 -1
- package/dist/dist-Cx5ufCdr.cjs +2 -0
- package/dist/{dist-CAeolvAH.cjs.map → dist-Cx5ufCdr.cjs.map} +1 -1
- package/dist/dist-DVrfqn8H.mjs +2 -0
- package/dist/{dist-BQGL-YKY.mjs.map → dist-DVrfqn8H.mjs.map} +1 -1
- package/dist/{drawer-B6C8-Ndu.cjs → drawer-BB8BZzDG.cjs} +2 -2
- package/dist/{drawer-B6C8-Ndu.cjs.map → drawer-BB8BZzDG.cjs.map} +1 -1
- package/dist/{dropdown-menu-C6tRSumY.mjs → dropdown-menu-BWhiVsEf.mjs} +1 -1
- package/dist/{dropdown-menu-C6tRSumY.mjs.map → dropdown-menu-BWhiVsEf.mjs.map} +1 -1
- package/dist/{dropdown-menu-Bz7oMQ36.cjs → dropdown-menu-CVh520yG.cjs} +2 -2
- package/dist/{dropdown-menu-Bz7oMQ36.cjs.map → dropdown-menu-CVh520yG.cjs.map} +1 -1
- package/dist/features/descriptions/index.cjs +1 -1
- package/dist/features/descriptions/index.cjs.map +1 -1
- package/dist/features/descriptions/index.d.cts +1 -1
- package/dist/features/descriptions/index.d.mts +6 -6
- package/dist/features/descriptions/index.mjs +1 -1
- package/dist/features/descriptions/index.mjs.map +1 -1
- package/dist/features/search-modal/index.cjs +1 -1
- package/dist/features/search-modal/index.d.mts +2 -2
- package/dist/features/search-modal/index.mjs +1 -1
- package/dist/features/tables/index.cjs +1 -1
- package/dist/features/tables/index.d.cts +2 -2
- package/dist/features/tables/index.d.mts +3 -3
- package/dist/features/tables/index.mjs +1 -1
- package/dist/features/tanstack-form/index.cjs +1 -1
- package/dist/features/tanstack-form/index.d.cts +2 -2
- package/dist/features/tanstack-form/index.d.mts +2 -2
- package/dist/features/tanstack-form/index.mjs +1 -1
- package/dist/features/text-editor/index.cjs +1 -1
- package/dist/features/text-editor/index.d.cts +1 -1
- package/dist/features/text-editor/index.d.mts +1 -1
- package/dist/features/text-editor/index.mjs +1 -1
- package/dist/{field-pfL7RWcN.cjs → field-BrlETeXX.cjs} +2 -2
- package/dist/{field-pfL7RWcN.cjs.map → field-BrlETeXX.cjs.map} +1 -1
- package/dist/{field-DhgAIueI.mjs → field-dYemS0hQ.mjs} +2 -2
- package/dist/{field-DhgAIueI.mjs.map → field-dYemS0hQ.mjs.map} +1 -1
- package/dist/{flex-BAcvp4lB.mjs → flex-B6YSJzGe.mjs} +1 -1
- package/dist/{flex-BAcvp4lB.mjs.map → flex-B6YSJzGe.mjs.map} +1 -1
- package/dist/{flex-DYh2t8ft.cjs → flex-DmWmOBn5.cjs} +2 -2
- package/dist/{flex-DYh2t8ft.cjs.map → flex-DmWmOBn5.cjs.map} +1 -1
- package/dist/{heading-woRh-IC7.mjs → heading-De4Pn3mZ.mjs} +1 -1
- package/dist/{heading-woRh-IC7.mjs.map → heading-De4Pn3mZ.mjs.map} +1 -1
- package/dist/{heading-wUXEbicM.cjs → heading-tGTqk3pA.cjs} +2 -2
- package/dist/{heading-wUXEbicM.cjs.map → heading-tGTqk3pA.cjs.map} +1 -1
- package/dist/image-D7OZ13Ib.mjs +2 -0
- package/dist/{image-D2U1SBw5.mjs.map → image-D7OZ13Ib.mjs.map} +1 -1
- package/dist/image-W_Yb0xTB.cjs +2 -0
- package/dist/{image-Y7gCz7uE.cjs.map → image-W_Yb0xTB.cjs.map} +1 -1
- package/dist/{index-C6nrbQ-E.d.cts → index-9eog5ilY.d.cts} +36 -4
- package/dist/{index-CJoz7sMc.d.mts → index-BuNzvvj3.d.mts} +64 -32
- package/dist/{index-DiW-62hY.d.mts → index-CG8iS6qj.d.cts} +3 -3
- package/dist/index-Cm62M0Ft.d.mts +90 -0
- package/dist/{index-Du_HLRsN.d.cts → index-DI8qmezw.d.mts} +7 -7
- package/dist/index-DsD83ZN8.d.cts +2348 -0
- package/dist/index-KO98y6L0.d.cts +90 -0
- package/dist/index-SMYnpHIM.d.mts +2348 -0
- package/dist/index.cjs +1 -1
- package/dist/index.d.cts +10 -10
- package/dist/index.d.mts +10 -10
- package/dist/index.mjs +1 -1
- package/dist/{input-BAr0l-oA.d.cts → input-BFtFMzRG.d.mts} +6 -6
- package/dist/{input-DXO2mTgG.d.mts → input-DvkEND5a.d.cts} +6 -6
- package/dist/{input-5gk-Jv1y.mjs → input-NJP2wQOm.mjs} +1 -1
- package/dist/{input-5gk-Jv1y.mjs.map → input-NJP2wQOm.mjs.map} +1 -1
- package/dist/{input-BvzsfAUc.cjs → input-WJ0DLHTR.cjs} +2 -2
- package/dist/{input-BvzsfAUc.cjs.map → input-WJ0DLHTR.cjs.map} +1 -1
- package/dist/{label-eIyGIRyw.cjs → label-CC6fXVbC.cjs} +2 -2
- package/dist/{label-eIyGIRyw.cjs.map → label-CC6fXVbC.cjs.map} +1 -1
- package/dist/{label-D9uNQ9b_.mjs → label-CUCpwS5D.mjs} +1 -1
- package/dist/{label-D9uNQ9b_.mjs.map → label-CUCpwS5D.mjs.map} +1 -1
- package/dist/layouts/cms-layout/index.cjs +1 -1
- package/dist/layouts/cms-layout/index.d.cts +2 -76
- package/dist/layouts/cms-layout/index.d.mts +2 -76
- package/dist/layouts/cms-layout/index.mjs +1 -1
- package/dist/layouts/flex.cjs +1 -1
- package/dist/layouts/flex.d.cts +6 -6
- package/dist/layouts/flex.d.mts +6 -6
- package/dist/layouts/flex.mjs +1 -1
- package/dist/layouts/grid.cjs +1 -1
- package/dist/layouts/payment-layout/index.cjs +1 -1
- package/dist/layouts/payment-layout/index.mjs +1 -1
- package/dist/pages/FeatureDeveloping.cjs +1 -1
- package/dist/pages/FeatureDeveloping.d.cts +2 -2
- package/dist/pages/FeatureDeveloping.d.mts +2 -2
- package/dist/pages/FeatureDeveloping.mjs +1 -1
- package/dist/pages/FeatureFixing.cjs +1 -1
- package/dist/pages/FeatureFixing.d.cts +2 -2
- package/dist/pages/FeatureFixing.d.mts +2 -2
- package/dist/pages/FeatureFixing.mjs +1 -1
- package/dist/pages/LoginPage.cjs +1 -1
- package/dist/pages/LoginPage.cjs.map +1 -1
- package/dist/pages/LoginPage.d.cts +2 -2
- package/dist/pages/LoginPage.d.mts +2 -2
- package/dist/pages/LoginPage.mjs +1 -1
- package/dist/pages/LoginPage.mjs.map +1 -1
- package/dist/pages/NotAuthorized.cjs +1 -1
- package/dist/pages/NotAuthorized.d.cts +2 -2
- package/dist/pages/NotAuthorized.d.mts +2 -2
- package/dist/pages/NotAuthorized.mjs +1 -1
- package/dist/pages/NotFound.cjs +1 -1
- package/dist/pages/NotFound.d.cts +2 -2
- package/dist/pages/NotFound.d.mts +2 -2
- package/dist/pages/NotFound.mjs +1 -1
- package/dist/pages/RegisterPage.cjs +1 -1
- package/dist/pages/RegisterPage.cjs.map +1 -1
- package/dist/pages/RegisterPage.d.cts +2 -2
- package/dist/pages/RegisterPage.mjs +1 -1
- package/dist/pages/RegisterPage.mjs.map +1 -1
- package/dist/pages/VerifyEmailPage.cjs +1 -1
- package/dist/pages/VerifyEmailPage.d.cts +2 -2
- package/dist/pages/VerifyEmailPage.d.mts +2 -2
- package/dist/pages/VerifyEmailPage.mjs +1 -1
- package/dist/{paragraph-CjstaJFj.mjs → paragraph-DYLaQtTV.mjs} +1 -1
- package/dist/{paragraph-CjstaJFj.mjs.map → paragraph-DYLaQtTV.mjs.map} +1 -1
- package/dist/{paragraph-D-JHj7EP.cjs → paragraph-DvTZvbzw.cjs} +2 -2
- package/dist/{paragraph-D-JHj7EP.cjs.map → paragraph-DvTZvbzw.cjs.map} +1 -1
- package/dist/{payment-layout-_ZM4uBy_.mjs → payment-layout-DrQ0kZPX.mjs} +2 -2
- package/dist/{payment-layout-_ZM4uBy_.mjs.map → payment-layout-DrQ0kZPX.mjs.map} +1 -1
- package/dist/{payment-layout-fsYTkw3r.cjs → payment-layout-DyILfyVG.cjs} +2 -2
- package/dist/{payment-layout-fsYTkw3r.cjs.map → payment-layout-DyILfyVG.cjs.map} +1 -1
- package/dist/{popover-DwgdOX8a.mjs → popover-C8rcemA3.mjs} +2 -2
- package/dist/{popover-DwgdOX8a.mjs.map → popover-C8rcemA3.mjs.map} +1 -1
- package/dist/{popover-fsTCOb6a.cjs → popover-DBsC8Ltp.cjs} +2 -2
- package/dist/{popover-fsTCOb6a.cjs.map → popover-DBsC8Ltp.cjs.map} +1 -1
- package/dist/{progress-DCBKnTx0.mjs → progress-CLeM0e7Z.mjs} +1 -1
- package/dist/{progress-DCBKnTx0.mjs.map → progress-CLeM0e7Z.mjs.map} +1 -1
- package/dist/{progress-CDYA2V-W.cjs → progress-gvBqNiHp.cjs} +2 -2
- package/dist/{progress-CDYA2V-W.cjs.map → progress-gvBqNiHp.cjs.map} +1 -1
- package/dist/{radio-group-B-M599Ys.cjs → radio-group-_TdMkv8w.cjs} +2 -2
- package/dist/{radio-group-B-M599Ys.cjs.map → radio-group-_TdMkv8w.cjs.map} +1 -1
- package/dist/{resizable-DP1BQAF_.mjs → resizable-CpCaSCFB.mjs} +1 -1
- package/dist/{resizable-DP1BQAF_.mjs.map → resizable-CpCaSCFB.mjs.map} +1 -1
- package/dist/{resizable-DATSh0Du.cjs → resizable-sgpaHAb8.cjs} +2 -2
- package/dist/{resizable-DATSh0Du.cjs.map → resizable-sgpaHAb8.cjs.map} +1 -1
- package/dist/{search-modal-CYRJEDE-.cjs → search-modal-B-pzGcfP.cjs} +2 -2
- package/dist/{search-modal-CYRJEDE-.cjs.map → search-modal-B-pzGcfP.cjs.map} +1 -1
- package/dist/{search-modal-DWu08xkE.mjs → search-modal-Bn-GOOCy.mjs} +2 -2
- package/dist/{search-modal-DWu08xkE.mjs.map → search-modal-Bn-GOOCy.mjs.map} +1 -1
- package/dist/select-CWLQHh8x.cjs +2 -0
- package/dist/select-CWLQHh8x.cjs.map +1 -0
- package/dist/{select-BAlA65tZ.mjs → select-LlPCZFSF.mjs} +2 -2
- package/dist/select-LlPCZFSF.mjs.map +1 -0
- package/dist/{separator-C6s-YvlT.mjs → separator-D3Gmkxzq.mjs} +1 -1
- package/dist/{separator-C6s-YvlT.mjs.map → separator-D3Gmkxzq.mjs.map} +1 -1
- package/dist/{separator-CBup_ah1.cjs → separator-KuymG9g0.cjs} +2 -2
- package/dist/{separator-CBup_ah1.cjs.map → separator-KuymG9g0.cjs.map} +1 -1
- package/dist/{sheet-Cj8hoftE.mjs → sheet-BFlIfNaA.mjs} +1 -1
- package/dist/{sheet-Cj8hoftE.mjs.map → sheet-BFlIfNaA.mjs.map} +1 -1
- package/dist/{sheet-DAjZ-Q6Q.cjs → sheet-CvKSi0UC.cjs} +2 -2
- package/dist/{sheet-DAjZ-Q6Q.cjs.map → sheet-CvKSi0UC.cjs.map} +1 -1
- package/dist/{sidebar-RcmDh50_.mjs → sidebar-ChtCyu-n.mjs} +2 -2
- package/dist/{sidebar-RcmDh50_.mjs.map → sidebar-ChtCyu-n.mjs.map} +1 -1
- package/dist/{sidebar-Drasn0Bx.cjs → sidebar-D5J2gcTw.cjs} +2 -2
- package/dist/{sidebar-Drasn0Bx.cjs.map → sidebar-D5J2gcTw.cjs.map} +1 -1
- package/dist/{skeleton-DupQ91XW.mjs → skeleton-C51IdOfK.mjs} +1 -1
- package/dist/{skeleton-DupQ91XW.mjs.map → skeleton-C51IdOfK.mjs.map} +1 -1
- package/dist/{skeleton-CHympz8k.cjs → skeleton-CX1USu1w.cjs} +2 -2
- package/dist/{skeleton-CHympz8k.cjs.map → skeleton-CX1USu1w.cjs.map} +1 -1
- package/dist/{spinner-Bdta7BMp.cjs → spinner-CFxorYEt.cjs} +2 -2
- package/dist/{spinner-Bdta7BMp.cjs.map → spinner-CFxorYEt.cjs.map} +1 -1
- package/dist/{spinner-BCnPYF1H.mjs → spinner-eClTgHjk.mjs} +1 -1
- package/dist/{spinner-BCnPYF1H.mjs.map → spinner-eClTgHjk.mjs.map} +1 -1
- package/dist/{statistic-DDDm5Om1.cjs → statistic-DDXilD7q.cjs} +2 -2
- package/dist/{statistic-DDDm5Om1.cjs.map → statistic-DDXilD7q.cjs.map} +1 -1
- package/dist/{statistic-Cm4nbkjQ.mjs → statistic-cwLwcukn.mjs} +1 -1
- package/dist/{statistic-Cm4nbkjQ.mjs.map → statistic-cwLwcukn.mjs.map} +1 -1
- package/dist/{switch-Dbc77c_D.cjs → switch-DVfOV7wP.cjs} +2 -2
- package/dist/{switch-Dbc77c_D.cjs.map → switch-DVfOV7wP.cjs.map} +1 -1
- package/dist/systems/google.cjs +1 -1
- package/dist/tables-CFrsk2lM.mjs +4 -0
- package/dist/tables-CFrsk2lM.mjs.map +1 -0
- package/dist/tables-CPKHe3k-.cjs +4 -0
- package/dist/tables-CPKHe3k-.cjs.map +1 -0
- package/dist/tanstack-form-DT1TqIDl.mjs +12 -0
- package/dist/tanstack-form-DT1TqIDl.mjs.map +1 -0
- package/dist/tanstack-form-DatI41wz.cjs +12 -0
- package/dist/tanstack-form-DatI41wz.cjs.map +1 -0
- package/dist/{text-editor-Bg0Wtnt3.mjs → text-editor-5mA7XyaI.mjs} +2 -2
- package/dist/{text-editor-Bg0Wtnt3.mjs.map → text-editor-5mA7XyaI.mjs.map} +1 -1
- package/dist/{text-editor-DtLcsiR7.cjs → text-editor-CvJN3nSL.cjs} +2 -2
- package/dist/{text-editor-DtLcsiR7.cjs.map → text-editor-CvJN3nSL.cjs.map} +1 -1
- package/dist/{textarea-Byo8E8oi.cjs → textarea-Cc9CF8wD.cjs} +2 -2
- package/dist/{textarea-Byo8E8oi.cjs.map → textarea-Cc9CF8wD.cjs.map} +1 -1
- package/dist/{tooltip-DC6i1A25.cjs → tooltip-CBdoIzoM.cjs} +2 -2
- package/dist/{tooltip-DC6i1A25.cjs.map → tooltip-CBdoIzoM.cjs.map} +1 -1
- package/dist/{tooltip-BfBJRYpc.mjs → tooltip-Dxl5Wa8i.mjs} +1 -1
- package/dist/{tooltip-BfBJRYpc.mjs.map → tooltip-Dxl5Wa8i.mjs.map} +1 -1
- package/dist/{types-CFXgrpTm.mjs → types-B5nyTWtO.mjs} +1 -1
- package/dist/{types-CFXgrpTm.mjs.map → types-B5nyTWtO.mjs.map} +1 -1
- package/dist/typography/paragraph.cjs +1 -1
- package/dist/typography/paragraph.d.cts +5 -5
- package/dist/typography/paragraph.d.mts +5 -5
- package/dist/typography/paragraph.mjs +1 -1
- package/dist/typography/title.cjs +1 -1
- package/dist/ui/alert-dialog.cjs +1 -1
- package/dist/ui/alert-dialog.d.cts +12 -12
- package/dist/ui/alert-dialog.d.mts +12 -12
- package/dist/ui/alert-dialog.mjs +1 -1
- package/dist/ui/alert.cjs +1 -1
- package/dist/ui/alert.d.cts +1 -1
- package/dist/ui/alert.d.mts +1 -1
- package/dist/ui/aspect-ratio.cjs +1 -1
- package/dist/ui/aspect-ratio.d.cts +2 -2
- package/dist/ui/aspect-ratio.d.mts +2 -2
- package/dist/ui/avatar.cjs +1 -1
- package/dist/ui/avatar.d.cts +4 -4
- package/dist/ui/avatar.d.mts +4 -4
- package/dist/ui/avatar.mjs +1 -1
- package/dist/ui/badge.cjs +1 -1
- package/dist/ui/badge.d.cts +1 -1
- package/dist/ui/badge.d.mts +1 -1
- package/dist/ui/badge.mjs +1 -1
- package/dist/ui/breadcrumb.cjs +1 -1
- package/dist/ui/breadcrumb.d.cts +8 -8
- package/dist/ui/breadcrumb.d.mts +8 -8
- package/dist/ui/breadcrumb.mjs +1 -1
- package/dist/ui/button-group.cjs +1 -1
- package/dist/ui/button-group.d.cts +6 -6
- package/dist/ui/button-group.d.mts +6 -6
- package/dist/ui/button-group.mjs +1 -1
- package/dist/ui/button.cjs +1 -1
- package/dist/ui/button.d.cts +1 -1
- package/dist/ui/button.d.mts +1 -1
- package/dist/ui/button.mjs +1 -1
- package/dist/ui/buttons/add-new.cjs +1 -1
- package/dist/ui/buttons/add-new.mjs +1 -1
- package/dist/ui/buttons/edit.cjs +1 -1
- package/dist/ui/buttons/edit.mjs +1 -1
- package/dist/ui/buttons/refresh.cjs +1 -1
- package/dist/ui/buttons/refresh.mjs +1 -1
- package/dist/ui/buttons/trash.cjs +1 -1
- package/dist/ui/buttons/trash.mjs +1 -1
- package/dist/ui/buttons/upload-image.cjs +1 -1
- package/dist/ui/buttons/upload-image.mjs +1 -1
- package/dist/ui/calendar.cjs +1 -1
- package/dist/ui/calendar.d.cts +4 -4
- package/dist/ui/calendar.d.mts +4 -4
- package/dist/ui/calendar.mjs +1 -1
- package/dist/ui/card.cjs +1 -1
- package/dist/ui/card.d.cts +8 -8
- package/dist/ui/card.d.mts +8 -8
- package/dist/ui/card.mjs +1 -1
- package/dist/ui/carousel.cjs +1 -1
- package/dist/ui/carousel.d.cts +7 -7
- package/dist/ui/carousel.d.mts +7 -7
- package/dist/ui/carousel.mjs +1 -1
- package/dist/ui/checkbox.cjs +1 -1
- package/dist/ui/checkbox.d.cts +2 -2
- package/dist/ui/checkbox.d.mts +2 -2
- package/dist/ui/checkbox.mjs +1 -1
- package/dist/ui/collapsible.cjs +1 -1
- package/dist/ui/collapsible.d.cts +4 -4
- package/dist/ui/collapsible.d.mts +4 -4
- package/dist/ui/command.cjs +1 -1
- package/dist/ui/command.d.cts +11 -11
- package/dist/ui/command.d.mts +11 -11
- package/dist/ui/command.mjs +1 -1
- package/dist/ui/context-menu.cjs +1 -1
- package/dist/ui/context-menu.d.cts +16 -16
- package/dist/ui/context-menu.d.mts +16 -16
- package/dist/ui/dialog.cjs +1 -1
- package/dist/ui/dialog.d.cts +1 -1
- package/dist/ui/dialog.d.mts +1 -1
- package/dist/ui/dialog.mjs +1 -1
- package/dist/ui/drawer.cjs +1 -1
- package/dist/ui/drawer.d.cts +11 -11
- package/dist/ui/drawer.d.mts +11 -11
- package/dist/ui/dropdown-menu.cjs +1 -1
- package/dist/ui/dropdown-menu.d.cts +16 -16
- package/dist/ui/dropdown-menu.d.mts +16 -16
- package/dist/ui/dropdown-menu.mjs +1 -1
- package/dist/ui/empty.cjs +1 -1
- package/dist/ui/empty.d.cts +9 -9
- package/dist/ui/empty.d.mts +9 -9
- package/dist/ui/field.cjs +1 -1
- package/dist/ui/field.d.cts +23 -23
- package/dist/ui/field.d.mts +23 -23
- package/dist/ui/field.mjs +1 -1
- package/dist/ui/file-uploader.cjs +1 -1
- package/dist/ui/file-uploader.d.cts +2 -2
- package/dist/ui/file-uploader.d.mts +2 -2
- package/dist/ui/file-uploader.mjs +1 -1
- package/dist/ui/form.cjs +1 -1
- package/dist/ui/form.d.cts +10 -10
- package/dist/ui/form.d.mts +10 -10
- package/dist/ui/form.mjs +1 -1
- package/dist/ui/hover-card.cjs +1 -1
- package/dist/ui/hover-card.d.cts +4 -4
- package/dist/ui/hover-card.d.mts +4 -4
- package/dist/ui/image.cjs +1 -1
- package/dist/ui/image.mjs +1 -1
- package/dist/ui/input-otp.cjs +1 -1
- package/dist/ui/input-otp.d.cts +5 -5
- package/dist/ui/input-otp.d.mts +5 -5
- package/dist/ui/input.cjs +1 -1
- package/dist/ui/input.d.cts +1 -1
- package/dist/ui/input.d.mts +1 -1
- package/dist/ui/input.mjs +1 -1
- package/dist/ui/inputs/search-input.cjs +1 -1
- package/dist/ui/inputs/search-input.d.cts +3 -3
- package/dist/ui/inputs/search-input.d.mts +3 -3
- package/dist/ui/inputs/search-input.mjs +1 -1
- package/dist/ui/item.cjs +1 -1
- package/dist/ui/item.d.cts +3 -3
- package/dist/ui/item.d.mts +11 -11
- package/dist/ui/item.mjs +1 -1
- package/dist/ui/label.cjs +1 -1
- package/dist/ui/label.d.cts +2 -2
- package/dist/ui/label.d.mts +2 -2
- package/dist/ui/label.mjs +1 -1
- package/dist/ui/menubar.cjs +1 -1
- package/dist/ui/menubar.d.cts +17 -17
- package/dist/ui/menubar.d.mts +17 -17
- package/dist/ui/multi-select.cjs +1 -1
- package/dist/ui/multi-select.d.cts +2 -2
- package/dist/ui/multi-select.d.mts +3 -3
- package/dist/ui/multi-select.mjs +1 -1
- package/dist/ui/navigation-menu.cjs +1 -1
- package/dist/ui/navigation-menu.d.cts +11 -11
- package/dist/ui/navigation-menu.d.mts +11 -11
- package/dist/ui/pagination.cjs +1 -1
- package/dist/ui/pagination.d.cts +9 -9
- package/dist/ui/pagination.d.mts +9 -9
- package/dist/ui/pagination.mjs +1 -1
- package/dist/ui/popover.cjs +1 -1
- package/dist/ui/popover.d.cts +6 -6
- package/dist/ui/popover.d.mts +6 -6
- package/dist/ui/popover.mjs +1 -1
- package/dist/ui/progress.cjs +1 -1
- package/dist/ui/progress.d.cts +2 -2
- package/dist/ui/progress.d.mts +2 -2
- package/dist/ui/progress.mjs +1 -1
- package/dist/ui/radio-group.cjs +1 -1
- package/dist/ui/radio-group.d.cts +3 -3
- package/dist/ui/radio-group.d.mts +3 -3
- package/dist/ui/resizable.cjs +1 -1
- package/dist/ui/resizable.d.cts +9 -9
- package/dist/ui/resizable.d.mts +9 -9
- package/dist/ui/resizable.mjs +1 -1
- package/dist/ui/scroll-area.cjs +1 -1
- package/dist/ui/scroll-area.d.cts +5 -5
- package/dist/ui/scroll-area.d.mts +5 -5
- package/dist/ui/select.cjs +1 -1
- package/dist/ui/select.d.cts +9 -9
- package/dist/ui/select.d.mts +9 -9
- package/dist/ui/select.mjs +1 -1
- package/dist/ui/separator.cjs +1 -1
- package/dist/ui/separator.d.cts +2 -2
- package/dist/ui/separator.d.mts +2 -2
- package/dist/ui/separator.mjs +1 -1
- package/dist/ui/sheet.cjs +1 -1
- package/dist/ui/sheet.d.cts +9 -9
- package/dist/ui/sheet.d.mts +9 -9
- package/dist/ui/sheet.mjs +1 -1
- package/dist/ui/skeleton.cjs +1 -1
- package/dist/ui/skeleton.d.cts +2 -2
- package/dist/ui/skeleton.d.mts +2 -2
- package/dist/ui/skeleton.mjs +1 -1
- package/dist/ui/slider.cjs +1 -1
- package/dist/ui/slider.d.cts +2 -2
- package/dist/ui/slider.d.mts +2 -2
- package/dist/ui/sonner.cjs +1 -1
- package/dist/ui/sonner.cjs.map +1 -1
- package/dist/ui/sonner.d.cts +2 -2
- package/dist/ui/sonner.d.mts +2 -2
- package/dist/ui/sonner.mjs +1 -1
- package/dist/ui/sonner.mjs.map +1 -1
- package/dist/ui/spinner.cjs +1 -1
- package/dist/ui/spinner.d.cts +2 -2
- package/dist/ui/spinner.d.mts +2 -2
- package/dist/ui/spinner.mjs +1 -1
- package/dist/ui/switch.cjs +1 -1
- package/dist/ui/switch.d.cts +2 -2
- package/dist/ui/switch.d.mts +2 -2
- package/dist/ui/table.cjs +1 -1
- package/dist/ui/table.d.cts +17 -17
- package/dist/ui/table.d.mts +17 -17
- package/dist/ui/tabs.cjs +1 -1
- package/dist/ui/tabs.d.cts +5 -5
- package/dist/ui/tabs.d.mts +5 -5
- package/dist/ui/textarea.cjs +1 -1
- package/dist/ui/textarea.d.cts +2 -2
- package/dist/ui/textarea.d.mts +2 -2
- package/dist/ui/toggle-group.cjs +1 -1
- package/dist/ui/toggle-group.d.mts +3 -3
- package/dist/ui/toggle.cjs +1 -1
- package/dist/ui/toggle.d.cts +4 -4
- package/dist/ui/toggle.d.mts +4 -4
- package/dist/ui/tooltip.cjs +1 -1
- package/dist/ui/tooltip.d.cts +5 -5
- package/dist/ui/tooltip.d.mts +5 -5
- package/dist/ui/tooltip.mjs +1 -1
- package/dist/{user-D8Skw8dI.mjs → user-DtZy4P9d.mjs} +2 -2
- package/dist/{user-D8Skw8dI.mjs.map → user-DtZy4P9d.mjs.map} +1 -1
- package/dist/{user-Dns1BKaT.cjs → user-ii4FBhO1.cjs} +2 -2
- package/dist/{user-Dns1BKaT.cjs.map → user-ii4FBhO1.cjs.map} +1 -1
- package/package.json +20 -5
- package/styles/spacing.css +186 -0
- package/dist/button-Bu4ejNOW.cjs.map +0 -1
- package/dist/button-CfPTDyoq.mjs +0 -2
- package/dist/button-CfPTDyoq.mjs.map +0 -1
- package/dist/chunk-Bmb41Sf3.cjs +0 -1
- package/dist/cms-layout-BrubV8D8.cjs +0 -2
- package/dist/cms-layout-BrubV8D8.cjs.map +0 -1
- package/dist/cms-layout-C2-yysO2.mjs +0 -2
- package/dist/cms-layout-C2-yysO2.mjs.map +0 -1
- package/dist/dist-BQGL-YKY.mjs +0 -2
- package/dist/dist-CAeolvAH.cjs +0 -2
- package/dist/image-D2U1SBw5.mjs +0 -2
- package/dist/image-Y7gCz7uE.cjs +0 -2
- package/dist/index-9dZXIJo5.d.mts +0 -2749
- package/dist/index-CQkuntSj.d.cts +0 -2749
- package/dist/select-BAlA65tZ.mjs.map +0 -1
- package/dist/select-Cib2aiw5.cjs +0 -2
- package/dist/select-Cib2aiw5.cjs.map +0 -1
- package/dist/tables-B3Ald6An.cjs +0 -4
- package/dist/tables-B3Ald6An.cjs.map +0 -1
- package/dist/tables-C3asiSD4.mjs +0 -4
- package/dist/tables-C3asiSD4.mjs.map +0 -1
- package/dist/tanstack-form-Byb7E1m9.cjs +0 -2
- package/dist/tanstack-form-Byb7E1m9.cjs.map +0 -1
- package/dist/tanstack-form-Dg_0hFwX.mjs +0 -2
- package/dist/tanstack-form-Dg_0hFwX.mjs.map +0 -1
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{a as e,h as t,r as n,t as r}from"./dropdown-menu-C6tRSumY.mjs";import{a as i,i as a,t as o}from"./popover-DwgdOX8a.mjs";import{AlignCenter as s,AlignJustify as c,AlignLeft as l,AlignRight as u,Bold as d,ChevronDown as f,Code as p,Code2 as m,Highlighter as h,Italic as ee,Link2 as g,Link2Off as _,List as v,ListChecks as y,ListOrdered as b,Minus as x,Palette as S,Quote as C,Redo as te,Strikethrough as w,Underline as ne,Undo as re}from"lucide-react";import{useCallback as T,useEffect as E,useMemo as D,useState as O}from"react";import{cn as k}from"@customafk/react-toolkit/utils";import{cva as A}from"class-variance-authority";import{Fragment as j,jsx as M,jsxs as N}from"react/jsx-runtime";import{EditorContent as P,useEditor as F,useEditorState as I}from"@tiptap/react";import{CharacterCount as L}from"@tiptap/extension-character-count";import{Highlight as R}from"@tiptap/extension-highlight";import{Link as z}from"@tiptap/extension-link";import{ListKeymap as B}from"@tiptap/extension-list-keymap";import V from"@tiptap/extension-placeholder";import{TaskItem as H}from"@tiptap/extension-task-item";import{TaskList as U}from"@tiptap/extension-task-list";import W from"@tiptap/extension-text-align";import{Color as G,TextStyle as K}from"@tiptap/extension-text-style";import q from"@tiptap/extension-underline";import{BubbleMenu as J}from"@tiptap/react/menus";import Y from"@tiptap/starter-kit";function X({isActive:e,className:t,children:n,...r}){return M(`button`,{type:`button`,"data-slot":`toolbar-button`,"data-active":e||void 0,className:k(`inline-flex h-7 w-7 items-center justify-center rounded text-sm transition-colors`,`hover:bg-muted-muted hover:text-text-positive-strong`,`disabled:pointer-events-none disabled:opacity-40`,e&&`bg-primary-muted text-primary hover:bg-primary-muted/80 hover:text-primary`,t),...r,children:n})}function Z(){return M(`div`,{"data-slot":`toolbar-divider`,className:`mx-0.5 h-5 w-px shrink-0 bg-border`})}function Q({editor:e}){let[t,n]=O(!1),[r,s]=O(``),c=I({editor:e,selector:e=>e.editor.isActive(`link`)}),l=T(t=>{t&&s(e.getAttributes(`link`).href??``),n(t)},[e]),u=T(()=>{let t=r.trim();t&&(e.chain().focus().setLink({href:t,target:`_blank`}).run(),n(!1))},[e,r]),d=T(()=>{e.chain().focus().unsetLink().run(),n(!1)},[e]),f=e=>{e.key===`Enter`&&(e.preventDefault(),u()),e.key===`Escape`&&n(!1)};return N(o,{open:t,onOpenChange:l,children:[M(i,{asChild:!0,children:M(X,{isActive:c,title:`Link (Ctrl+K)`,"data-slot":`toolbar-link-button`,children:M(g,{className:`h-3.5 w-3.5`})})}),N(a,{"data-slot":`link-dialog`,sideOffset:6,align:`start`,className:`w-72 p-3`,children:[M(`p`,{className:`mb-2 font-medium text-text-positive-strong text-xs`,children:c?`Edit Link`:`Insert Link`}),N(`div`,{className:`flex gap-1.5`,children:[M(`input`,{type:`url`,placeholder:`https://example.com`,value:r,onChange:e=>s(e.target.value),onKeyDown:f,autoFocus:!0,className:k(`flex-1 rounded border border-border bg-transparent px-2.5 py-1.5 text-sm text-text-positive`,`outline-none placeholder:text-text-positive-muted`,`focus:border-primary focus:ring-1 focus:ring-primary/30`)}),M(`button`,{type:`button`,onClick:u,disabled:!r.trim(),className:k(`rounded bg-primary px-2.5 py-1.5 font-medium text-text-negative text-xs`,`transition-colors hover:bg-primary-strong`,`disabled:pointer-events-none disabled:opacity-50`),children:`Apply`})]}),c&&N(`button`,{type:`button`,onClick:d,className:`mt-2 flex items-center gap-1 text-danger-strong text-xs hover:underline`,children:[M(_,{className:`h-3 w-3`}),`Remove link`]})]})]})}const ie=A([`flex flex-col overflow-hidden rounded-md`],{variants:{variant:{outline:`border border-border bg-background shadow-xs`,ghost:`border-0`},size:{sm:`text-xs [&_.ProseMirror]:min-h-24 [&_.ProseMirror]:px-2.5 [&_.ProseMirror]:py-1.5`,md:``,lg:`text-base [&_.ProseMirror]:min-h-56 [&_.ProseMirror]:px-4 [&_.ProseMirror]:py-3`}},defaultVariants:{variant:`outline`,size:`md`}}),ae=[{label:`Yellow`,value:`#fde047`},{label:`Green`,value:`#86efac`},{label:`Blue`,value:`#93c5fd`},{label:`Pink`,value:`#f9a8d4`},{label:`Orange`,value:`#fdba74`},{label:`Purple`,value:`#c4b5fd`},{label:`Red`,value:`#fca5a5`},{label:`Cyan`,value:`#67e8f9`},{label:`Lime`,value:`#bef264`},{label:`Gray`,value:`#d1d5db`}],oe=[{label:`Default`,value:``},{label:`Red`,value:`#ef4444`},{label:`Orange`,value:`#f97316`},{label:`Yellow`,value:`#eab308`},{label:`Green`,value:`#22c55e`},{label:`Blue`,value:`#3b82f6`},{label:`Purple`,value:`#a855f7`},{label:`Pink`,value:`#ec4899`},{label:`Gray`,value:`#6b7280`},{label:`Black`,value:`#000000`}];function $({editor:g,className:_,enableLink:T,enableTaskList:E,enableHighlight:D,enableColor:O}){let A=I({editor:g,selector:e=>e.editor.isActive(`heading`,{level:1})}),P=I({editor:g,selector:e=>e.editor.isActive(`heading`,{level:2})}),F=I({editor:g,selector:e=>e.editor.isActive(`heading`,{level:3})}),L=I({editor:g,selector:e=>e.editor.isActive(`bold`)}),R=I({editor:g,selector:e=>e.editor.isActive(`italic`)}),z=I({editor:g,selector:e=>e.editor.isActive(`underline`)}),B=I({editor:g,selector:e=>e.editor.isActive(`strike`)}),V=I({editor:g,selector:e=>e.editor.isActive(`code`)}),H=I({editor:g,selector:e=>e.editor.isActive(`bulletList`)}),U=I({editor:g,selector:e=>e.editor.isActive(`orderedList`)}),W=I({editor:g,selector:e=>e.editor.isActive(`taskList`)}),G=I({editor:g,selector:e=>e.editor.isActive(`blockquote`)}),K=I({editor:g,selector:e=>e.editor.isActive(`codeBlock`)}),q=I({editor:g,selector:e=>e.editor.isActive({textAlign:`left`})}),J=I({editor:g,selector:e=>e.editor.isActive({textAlign:`center`})}),Y=I({editor:g,selector:e=>e.editor.isActive({textAlign:`right`})}),ie=I({editor:g,selector:e=>e.editor.isActive({textAlign:`justify`})}),$=A?`H1`:P?`H2`:F?`H3`:`P`;return N(`div`,{"data-slot":`text-editor-toolbar`,className:k(`flex flex-wrap items-center gap-0.5 border-border border-b bg-muted-muted/50 p-1.5`,_),children:[M(X,{onClick:()=>g.chain().focus().undo().run(),disabled:!g.can().undo(),title:`Undo (Ctrl+Z)`,children:M(re,{className:`h-3.5 w-3.5`})}),M(X,{onClick:()=>g.chain().focus().redo().run(),disabled:!g.can().redo(),title:`Redo (Ctrl+Y)`,children:M(te,{className:`h-3.5 w-3.5`})}),M(Z,{}),N(r,{children:[M(t,{asChild:!0,children:N(`button`,{type:`button`,"data-slot":`toolbar-heading-trigger`,className:k(`inline-flex h-7 items-center gap-1 rounded px-1.5 font-medium text-xs transition-colors`,`hover:bg-muted-muted hover:text-text-positive-strong`,`disabled:pointer-events-none disabled:opacity-40`,(A||P||F)&&`bg-primary-muted text-primary hover:bg-primary-muted/80 hover:text-primary`),children:[M(`span`,{className:`w-5 text-center`,children:$}),M(f,{className:`h-3 w-3 opacity-60`})]})}),N(n,{align:`start`,className:`min-w-32`,children:[M(e,{onClick:()=>g.chain().focus().setParagraph().run(),children:M(`span`,{className:`text-sm`,children:`Paragraph`})}),M(e,{onClick:()=>g.chain().focus().toggleHeading({level:1}).run(),children:M(`span`,{className:`font-bold text-lg`,children:`Heading 1`})}),M(e,{onClick:()=>g.chain().focus().toggleHeading({level:2}).run(),children:M(`span`,{className:`font-semibold text-base`,children:`Heading 2`})}),M(e,{onClick:()=>g.chain().focus().toggleHeading({level:3}).run(),children:M(`span`,{className:`font-semibold text-sm`,children:`Heading 3`})})]})]}),M(Z,{}),M(X,{onClick:()=>g.chain().focus().toggleBold().run(),isActive:L,title:`Bold (Ctrl+B)`,children:M(d,{className:`h-3.5 w-3.5`})}),M(X,{onClick:()=>g.chain().focus().toggleItalic().run(),isActive:R,title:`Italic (Ctrl+I)`,children:M(ee,{className:`h-3.5 w-3.5`})}),M(X,{onClick:()=>g.chain().focus().toggleUnderline().run(),isActive:z,title:`Underline (Ctrl+U)`,children:M(ne,{className:`h-3.5 w-3.5`})}),M(X,{onClick:()=>g.chain().focus().toggleStrike().run(),isActive:B,title:`Strikethrough`,children:M(w,{className:`h-3.5 w-3.5`})}),M(X,{onClick:()=>g.chain().focus().toggleCode().run(),isActive:V,title:`Inline Code`,children:M(p,{className:`h-3.5 w-3.5`})}),M(Z,{}),M(X,{onClick:()=>g.chain().focus().toggleBulletList().run(),isActive:H,title:`Bullet List`,children:M(v,{className:`h-3.5 w-3.5`})}),M(X,{onClick:()=>g.chain().focus().toggleOrderedList().run(),isActive:U,title:`Ordered List`,children:M(b,{className:`h-3.5 w-3.5`})}),E&&M(X,{onClick:()=>g.chain().focus().toggleTaskList().run(),isActive:W,title:`Task List`,children:M(y,{className:`h-3.5 w-3.5`})}),M(Z,{}),M(X,{onClick:()=>g.chain().focus().toggleBlockquote().run(),isActive:G,title:`Blockquote`,children:M(C,{className:`h-3.5 w-3.5`})}),M(X,{onClick:()=>g.chain().focus().toggleCodeBlock().run(),isActive:K,title:`Code Block`,children:M(m,{className:`h-3.5 w-3.5`})}),M(X,{onClick:()=>g.chain().focus().setHorizontalRule().run(),title:`Horizontal Rule`,children:M(x,{className:`h-3.5 w-3.5`})}),M(Z,{}),M(X,{onClick:()=>g.chain().focus().setTextAlign(`left`).run(),isActive:q,title:`Align Left`,children:M(l,{className:`h-3.5 w-3.5`})}),M(X,{onClick:()=>g.chain().focus().setTextAlign(`center`).run(),isActive:J,title:`Align Center`,children:M(s,{className:`h-3.5 w-3.5`})}),M(X,{onClick:()=>g.chain().focus().setTextAlign(`right`).run(),isActive:Y,title:`Align Right`,children:M(u,{className:`h-3.5 w-3.5`})}),M(X,{onClick:()=>g.chain().focus().setTextAlign(`justify`).run(),isActive:ie,title:`Align Justify`,children:M(c,{className:`h-3.5 w-3.5`})}),T&&N(j,{children:[M(Z,{}),M(Q,{editor:g})]}),(O||D)&&N(j,{children:[M(Z,{}),O&&N(o,{children:[M(i,{asChild:!0,children:M(X,{title:`Text Color`,children:M(S,{className:`h-3.5 w-3.5`})})}),N(a,{align:`start`,className:`w-44 p-2`,children:[M(`p`,{className:`mb-1.5 font-medium text-text-positive-weak text-xs`,children:`Text Color`}),M(`div`,{className:`grid grid-cols-5 gap-1`,children:oe.map(e=>M(`button`,{type:`button`,title:e.label,onClick:()=>{e.value?g.chain().focus().setColor(e.value).run():g.chain().focus().unsetColor().run()},className:k(`h-6 w-6 rounded border border-border transition-transform hover:scale-110`,!e.value&&`bg-background text-[10px] text-text-positive leading-none`),style:e.value?{backgroundColor:e.value}:void 0,children:!e.value&&`∅`},e.label))})]})]}),D&&N(o,{children:[M(i,{asChild:!0,children:M(X,{title:`Highlight`,children:M(h,{className:`h-3.5 w-3.5`})})}),N(a,{align:`start`,className:`w-44 p-2`,children:[M(`p`,{className:`mb-1.5 font-medium text-text-positive-weak text-xs`,children:`Highlight`}),M(`div`,{className:`grid grid-cols-5 gap-1`,children:ae.map(e=>M(`button`,{type:`button`,title:e.label,onClick:()=>g.chain().focus().toggleHighlight({color:e.value}).run(),className:`h-6 w-6 rounded border border-border transition-transform hover:scale-110`,style:{backgroundColor:e.value}},e.label))}),M(`button`,{type:`button`,onClick:()=>g.chain().focus().unsetHighlight().run(),className:`mt-1.5 w-full rounded border border-border py-0.5 text-center text-text-positive-weak text-xs hover:bg-muted-muted`,children:`Clear highlight`})]})]})]})]})}function se({value:e,defaultValue:t,onChange:n,placeholder:r=`Start writing...`,readOnly:i=!1,showToolbar:a=!0,variant:o,size:s,className:c,toolbarClassName:l,editorClassName:u,maxLength:f,showCharacterCount:p,onCharacterCount:m,enableLink:h,enableBubbleMenu:g,enableTaskList:_,enableHighlight:v,enableColor:y}){let b=f!==void 0||p||m!==void 0,x=y||v,S=F({extensions:D(()=>{let e=[Y,q,V.configure({placeholder:r}),W.configure({types:[`heading`,`paragraph`]}),B];return x&&e.push(K),h&&e.push(z.configure({openOnClick:!1,linkOnPaste:!0,defaultProtocol:`https`})),_&&e.push(U,H.configure({nested:!0})),v&&e.push(R.configure({multicolor:!0})),y&&e.push(G),b&&e.push(L.configure({limit:f})),e},[b,r,f,v,x,_,h,y]),content:e??t,editable:!i,onUpdate:({editor:e})=>{if(n?.(e.getHTML()),m){let t=e.storage.characterCount;m({characters:t.characters(),words:t.words()})}}});E(()=>{!S||e===void 0||S.getHTML()!==e&&S.commands.setContent(e)},[S,e]),E(()=>{S&&S.setEditable(!i)},[S,i]);let C=I({editor:S,selector:e=>{let t=e.editor?.storage?.characterCount;return t?t.characters():0}}),te=I({editor:S,selector:e=>{let t=e.editor?.storage?.characterCount;return t?t.words():0}}),re=p||f!==void 0,T=f!==void 0&&C>f*.9;return N(`div`,{"data-slot":`text-editor`,className:k(`lunas-text-editor`,ie({variant:o,size:s}),c),children:[a&&!i&&S&&M($,{editor:S,className:l,enableLink:h,enableTaskList:_,enableHighlight:v,enableColor:y}),g&&!i&&S&&N(J,{editor:S,options:{placement:`top`},className:k(`flex items-center gap-0.5 rounded-md border border-border bg-popover p-1 shadow-dropdown`),children:[M(X,{onClick:()=>S.chain().focus().toggleBold().run(),isActive:S.isActive(`bold`),title:`Bold (Ctrl+B)`,children:M(d,{className:`h-3.5 w-3.5`})}),M(X,{onClick:()=>S.chain().focus().toggleItalic().run(),isActive:S.isActive(`italic`),title:`Italic (Ctrl+I)`,children:M(ee,{className:`h-3.5 w-3.5`})}),M(X,{onClick:()=>S.chain().focus().toggleUnderline().run(),isActive:S.isActive(`underline`),title:`Underline (Ctrl+U)`,children:M(ne,{className:`h-3.5 w-3.5`})}),M(X,{onClick:()=>S.chain().focus().toggleStrike().run(),isActive:S.isActive(`strike`),title:`Strikethrough`,children:M(w,{className:`h-3.5 w-3.5`})}),h&&N(j,{children:[M(Z,{}),M(Q,{editor:S})]})]}),M(P,{editor:S,"data-slot":`text-editor-content`,className:k(`flex-1 bg-white text-sm text-text-positive`,u)}),re&&b&&N(`div`,{"data-slot":`text-editor-footer`,className:`flex items-center justify-between border-border border-t bg-muted-muted/30 px-3 py-1 text-text-positive-weak text-xs`,children:[N(`span`,{children:[te,` words`]}),N(`span`,{"data-warning":T||void 0,className:`data-warning:text-warning-strong`,children:[C,f?` / ${f}`:``,` characters`]})]})]})}export{$ as n,Q as r,se as t};
|
|
2
|
-
//# sourceMappingURL=text-editor-
|
|
1
|
+
import{a as e,h as t,r as n,t as r}from"./dropdown-menu-BWhiVsEf.mjs";import{a as i,i as a,t as o}from"./popover-C8rcemA3.mjs";import{AlignCenter as s,AlignJustify as c,AlignLeft as l,AlignRight as u,Bold as d,ChevronDown as f,Code as p,Code2 as m,Highlighter as h,Italic as ee,Link2 as g,Link2Off as _,List as v,ListChecks as y,ListOrdered as b,Minus as x,Palette as S,Quote as C,Redo as te,Strikethrough as w,Underline as ne,Undo as re}from"lucide-react";import{useCallback as T,useEffect as E,useMemo as D,useState as O}from"react";import{cn as k}from"@customafk/react-toolkit/utils";import{cva as A}from"class-variance-authority";import{Fragment as j,jsx as M,jsxs as N}from"react/jsx-runtime";import{EditorContent as P,useEditor as F,useEditorState as I}from"@tiptap/react";import{CharacterCount as L}from"@tiptap/extension-character-count";import{Highlight as R}from"@tiptap/extension-highlight";import{Link as z}from"@tiptap/extension-link";import{ListKeymap as B}from"@tiptap/extension-list-keymap";import V from"@tiptap/extension-placeholder";import{TaskItem as H}from"@tiptap/extension-task-item";import{TaskList as U}from"@tiptap/extension-task-list";import W from"@tiptap/extension-text-align";import{Color as G,TextStyle as K}from"@tiptap/extension-text-style";import q from"@tiptap/extension-underline";import{BubbleMenu as J}from"@tiptap/react/menus";import Y from"@tiptap/starter-kit";function X({isActive:e,className:t,children:n,...r}){return M(`button`,{type:`button`,"data-slot":`toolbar-button`,"data-active":e||void 0,className:k(`inline-flex h-7 w-7 items-center justify-center rounded text-sm transition-colors`,`hover:bg-muted-muted hover:text-text-positive-strong`,`disabled:pointer-events-none disabled:opacity-40`,e&&`bg-primary-muted text-primary hover:bg-primary-muted/80 hover:text-primary`,t),...r,children:n})}function Z(){return M(`div`,{"data-slot":`toolbar-divider`,className:`mx-0.5 h-5 w-px shrink-0 bg-border`})}function Q({editor:e}){let[t,n]=O(!1),[r,s]=O(``),c=I({editor:e,selector:e=>e.editor.isActive(`link`)}),l=T(t=>{t&&s(e.getAttributes(`link`).href??``),n(t)},[e]),u=T(()=>{let t=r.trim();t&&(e.chain().focus().setLink({href:t,target:`_blank`}).run(),n(!1))},[e,r]),d=T(()=>{e.chain().focus().unsetLink().run(),n(!1)},[e]),f=e=>{e.key===`Enter`&&(e.preventDefault(),u()),e.key===`Escape`&&n(!1)};return N(o,{open:t,onOpenChange:l,children:[M(i,{asChild:!0,children:M(X,{isActive:c,title:`Link (Ctrl+K)`,"data-slot":`toolbar-link-button`,children:M(g,{className:`h-3.5 w-3.5`})})}),N(a,{"data-slot":`link-dialog`,sideOffset:6,align:`start`,className:`w-72 p-3`,children:[M(`p`,{className:`mb-2 font-medium text-text-positive-strong text-xs`,children:c?`Edit Link`:`Insert Link`}),N(`div`,{className:`flex gap-1.5`,children:[M(`input`,{type:`url`,placeholder:`https://example.com`,value:r,onChange:e=>s(e.target.value),onKeyDown:f,autoFocus:!0,className:k(`flex-1 rounded border border-border bg-transparent px-2.5 py-1.5 text-sm text-text-positive`,`outline-none placeholder:text-text-positive-muted`,`focus:border-primary focus:ring-1 focus:ring-primary/30`)}),M(`button`,{type:`button`,onClick:u,disabled:!r.trim(),className:k(`rounded bg-primary px-2.5 py-1.5 font-medium text-text-negative text-xs`,`transition-colors hover:bg-primary-strong`,`disabled:pointer-events-none disabled:opacity-50`),children:`Apply`})]}),c&&N(`button`,{type:`button`,onClick:d,className:`mt-2 flex items-center gap-1 text-danger-strong text-xs hover:underline`,children:[M(_,{className:`h-3 w-3`}),`Remove link`]})]})]})}const ie=A([`flex flex-col overflow-hidden rounded-md`],{variants:{variant:{outline:`border border-border bg-background shadow-xs`,ghost:`border-0`},size:{sm:`text-xs [&_.ProseMirror]:min-h-24 [&_.ProseMirror]:px-2.5 [&_.ProseMirror]:py-1.5`,md:``,lg:`text-base [&_.ProseMirror]:min-h-56 [&_.ProseMirror]:px-4 [&_.ProseMirror]:py-3`}},defaultVariants:{variant:`outline`,size:`md`}}),ae=[{label:`Yellow`,value:`#fde047`},{label:`Green`,value:`#86efac`},{label:`Blue`,value:`#93c5fd`},{label:`Pink`,value:`#f9a8d4`},{label:`Orange`,value:`#fdba74`},{label:`Purple`,value:`#c4b5fd`},{label:`Red`,value:`#fca5a5`},{label:`Cyan`,value:`#67e8f9`},{label:`Lime`,value:`#bef264`},{label:`Gray`,value:`#d1d5db`}],oe=[{label:`Default`,value:``},{label:`Red`,value:`#ef4444`},{label:`Orange`,value:`#f97316`},{label:`Yellow`,value:`#eab308`},{label:`Green`,value:`#22c55e`},{label:`Blue`,value:`#3b82f6`},{label:`Purple`,value:`#a855f7`},{label:`Pink`,value:`#ec4899`},{label:`Gray`,value:`#6b7280`},{label:`Black`,value:`#000000`}];function $({editor:g,className:_,enableLink:T,enableTaskList:E,enableHighlight:D,enableColor:O}){let A=I({editor:g,selector:e=>e.editor.isActive(`heading`,{level:1})}),P=I({editor:g,selector:e=>e.editor.isActive(`heading`,{level:2})}),F=I({editor:g,selector:e=>e.editor.isActive(`heading`,{level:3})}),L=I({editor:g,selector:e=>e.editor.isActive(`bold`)}),R=I({editor:g,selector:e=>e.editor.isActive(`italic`)}),z=I({editor:g,selector:e=>e.editor.isActive(`underline`)}),B=I({editor:g,selector:e=>e.editor.isActive(`strike`)}),V=I({editor:g,selector:e=>e.editor.isActive(`code`)}),H=I({editor:g,selector:e=>e.editor.isActive(`bulletList`)}),U=I({editor:g,selector:e=>e.editor.isActive(`orderedList`)}),W=I({editor:g,selector:e=>e.editor.isActive(`taskList`)}),G=I({editor:g,selector:e=>e.editor.isActive(`blockquote`)}),K=I({editor:g,selector:e=>e.editor.isActive(`codeBlock`)}),q=I({editor:g,selector:e=>e.editor.isActive({textAlign:`left`})}),J=I({editor:g,selector:e=>e.editor.isActive({textAlign:`center`})}),Y=I({editor:g,selector:e=>e.editor.isActive({textAlign:`right`})}),ie=I({editor:g,selector:e=>e.editor.isActive({textAlign:`justify`})}),$=A?`H1`:P?`H2`:F?`H3`:`P`;return N(`div`,{"data-slot":`text-editor-toolbar`,className:k(`flex flex-wrap items-center gap-0.5 border-border border-b bg-muted-muted/50 p-1.5`,_),children:[M(X,{onClick:()=>g.chain().focus().undo().run(),disabled:!g.can().undo(),title:`Undo (Ctrl+Z)`,children:M(re,{className:`h-3.5 w-3.5`})}),M(X,{onClick:()=>g.chain().focus().redo().run(),disabled:!g.can().redo(),title:`Redo (Ctrl+Y)`,children:M(te,{className:`h-3.5 w-3.5`})}),M(Z,{}),N(r,{children:[M(t,{asChild:!0,children:N(`button`,{type:`button`,"data-slot":`toolbar-heading-trigger`,className:k(`inline-flex h-7 items-center gap-1 rounded px-1.5 font-medium text-xs transition-colors`,`hover:bg-muted-muted hover:text-text-positive-strong`,`disabled:pointer-events-none disabled:opacity-40`,(A||P||F)&&`bg-primary-muted text-primary hover:bg-primary-muted/80 hover:text-primary`),children:[M(`span`,{className:`w-5 text-center`,children:$}),M(f,{className:`h-3 w-3 opacity-60`})]})}),N(n,{align:`start`,className:`min-w-32`,children:[M(e,{onClick:()=>g.chain().focus().setParagraph().run(),children:M(`span`,{className:`text-sm`,children:`Paragraph`})}),M(e,{onClick:()=>g.chain().focus().toggleHeading({level:1}).run(),children:M(`span`,{className:`font-bold text-lg`,children:`Heading 1`})}),M(e,{onClick:()=>g.chain().focus().toggleHeading({level:2}).run(),children:M(`span`,{className:`font-semibold text-base`,children:`Heading 2`})}),M(e,{onClick:()=>g.chain().focus().toggleHeading({level:3}).run(),children:M(`span`,{className:`font-semibold text-sm`,children:`Heading 3`})})]})]}),M(Z,{}),M(X,{onClick:()=>g.chain().focus().toggleBold().run(),isActive:L,title:`Bold (Ctrl+B)`,children:M(d,{className:`h-3.5 w-3.5`})}),M(X,{onClick:()=>g.chain().focus().toggleItalic().run(),isActive:R,title:`Italic (Ctrl+I)`,children:M(ee,{className:`h-3.5 w-3.5`})}),M(X,{onClick:()=>g.chain().focus().toggleUnderline().run(),isActive:z,title:`Underline (Ctrl+U)`,children:M(ne,{className:`h-3.5 w-3.5`})}),M(X,{onClick:()=>g.chain().focus().toggleStrike().run(),isActive:B,title:`Strikethrough`,children:M(w,{className:`h-3.5 w-3.5`})}),M(X,{onClick:()=>g.chain().focus().toggleCode().run(),isActive:V,title:`Inline Code`,children:M(p,{className:`h-3.5 w-3.5`})}),M(Z,{}),M(X,{onClick:()=>g.chain().focus().toggleBulletList().run(),isActive:H,title:`Bullet List`,children:M(v,{className:`h-3.5 w-3.5`})}),M(X,{onClick:()=>g.chain().focus().toggleOrderedList().run(),isActive:U,title:`Ordered List`,children:M(b,{className:`h-3.5 w-3.5`})}),E&&M(X,{onClick:()=>g.chain().focus().toggleTaskList().run(),isActive:W,title:`Task List`,children:M(y,{className:`h-3.5 w-3.5`})}),M(Z,{}),M(X,{onClick:()=>g.chain().focus().toggleBlockquote().run(),isActive:G,title:`Blockquote`,children:M(C,{className:`h-3.5 w-3.5`})}),M(X,{onClick:()=>g.chain().focus().toggleCodeBlock().run(),isActive:K,title:`Code Block`,children:M(m,{className:`h-3.5 w-3.5`})}),M(X,{onClick:()=>g.chain().focus().setHorizontalRule().run(),title:`Horizontal Rule`,children:M(x,{className:`h-3.5 w-3.5`})}),M(Z,{}),M(X,{onClick:()=>g.chain().focus().setTextAlign(`left`).run(),isActive:q,title:`Align Left`,children:M(l,{className:`h-3.5 w-3.5`})}),M(X,{onClick:()=>g.chain().focus().setTextAlign(`center`).run(),isActive:J,title:`Align Center`,children:M(s,{className:`h-3.5 w-3.5`})}),M(X,{onClick:()=>g.chain().focus().setTextAlign(`right`).run(),isActive:Y,title:`Align Right`,children:M(u,{className:`h-3.5 w-3.5`})}),M(X,{onClick:()=>g.chain().focus().setTextAlign(`justify`).run(),isActive:ie,title:`Align Justify`,children:M(c,{className:`h-3.5 w-3.5`})}),T&&N(j,{children:[M(Z,{}),M(Q,{editor:g})]}),(O||D)&&N(j,{children:[M(Z,{}),O&&N(o,{children:[M(i,{asChild:!0,children:M(X,{title:`Text Color`,children:M(S,{className:`h-3.5 w-3.5`})})}),N(a,{align:`start`,className:`w-44 p-2`,children:[M(`p`,{className:`mb-1.5 font-medium text-text-positive-weak text-xs`,children:`Text Color`}),M(`div`,{className:`grid grid-cols-5 gap-1`,children:oe.map(e=>M(`button`,{type:`button`,title:e.label,onClick:()=>{e.value?g.chain().focus().setColor(e.value).run():g.chain().focus().unsetColor().run()},className:k(`h-6 w-6 rounded border border-border transition-transform hover:scale-110`,!e.value&&`bg-background text-[10px] text-text-positive leading-none`),style:e.value?{backgroundColor:e.value}:void 0,children:!e.value&&`∅`},e.label))})]})]}),D&&N(o,{children:[M(i,{asChild:!0,children:M(X,{title:`Highlight`,children:M(h,{className:`h-3.5 w-3.5`})})}),N(a,{align:`start`,className:`w-44 p-2`,children:[M(`p`,{className:`mb-1.5 font-medium text-text-positive-weak text-xs`,children:`Highlight`}),M(`div`,{className:`grid grid-cols-5 gap-1`,children:ae.map(e=>M(`button`,{type:`button`,title:e.label,onClick:()=>g.chain().focus().toggleHighlight({color:e.value}).run(),className:`h-6 w-6 rounded border border-border transition-transform hover:scale-110`,style:{backgroundColor:e.value}},e.label))}),M(`button`,{type:`button`,onClick:()=>g.chain().focus().unsetHighlight().run(),className:`mt-1.5 w-full rounded border border-border py-0.5 text-center text-text-positive-weak text-xs hover:bg-muted-muted`,children:`Clear highlight`})]})]})]})]})}function se({value:e,defaultValue:t,onChange:n,placeholder:r=`Start writing...`,readOnly:i=!1,showToolbar:a=!0,variant:o,size:s,className:c,toolbarClassName:l,editorClassName:u,maxLength:f,showCharacterCount:p,onCharacterCount:m,enableLink:h,enableBubbleMenu:g,enableTaskList:_,enableHighlight:v,enableColor:y}){let b=f!==void 0||p||m!==void 0,x=y||v,S=F({extensions:D(()=>{let e=[Y,q,V.configure({placeholder:r}),W.configure({types:[`heading`,`paragraph`]}),B];return x&&e.push(K),h&&e.push(z.configure({openOnClick:!1,linkOnPaste:!0,defaultProtocol:`https`})),_&&e.push(U,H.configure({nested:!0})),v&&e.push(R.configure({multicolor:!0})),y&&e.push(G),b&&e.push(L.configure({limit:f})),e},[b,r,f,v,x,_,h,y]),content:e??t,editable:!i,onUpdate:({editor:e})=>{if(n?.(e.getHTML()),m){let t=e.storage.characterCount;m({characters:t.characters(),words:t.words()})}}});E(()=>{!S||e===void 0||S.getHTML()!==e&&S.commands.setContent(e)},[S,e]),E(()=>{S&&S.setEditable(!i)},[S,i]);let C=I({editor:S,selector:e=>{let t=e.editor?.storage?.characterCount;return t?t.characters():0}}),te=I({editor:S,selector:e=>{let t=e.editor?.storage?.characterCount;return t?t.words():0}}),re=p||f!==void 0,T=f!==void 0&&C>f*.9;return N(`div`,{"data-slot":`text-editor`,className:k(`lunas-text-editor`,ie({variant:o,size:s}),c),children:[a&&!i&&S&&M($,{editor:S,className:l,enableLink:h,enableTaskList:_,enableHighlight:v,enableColor:y}),g&&!i&&S&&N(J,{editor:S,options:{placement:`top`},className:k(`flex items-center gap-0.5 rounded-md border border-border bg-popover p-1 shadow-dropdown`),children:[M(X,{onClick:()=>S.chain().focus().toggleBold().run(),isActive:S.isActive(`bold`),title:`Bold (Ctrl+B)`,children:M(d,{className:`h-3.5 w-3.5`})}),M(X,{onClick:()=>S.chain().focus().toggleItalic().run(),isActive:S.isActive(`italic`),title:`Italic (Ctrl+I)`,children:M(ee,{className:`h-3.5 w-3.5`})}),M(X,{onClick:()=>S.chain().focus().toggleUnderline().run(),isActive:S.isActive(`underline`),title:`Underline (Ctrl+U)`,children:M(ne,{className:`h-3.5 w-3.5`})}),M(X,{onClick:()=>S.chain().focus().toggleStrike().run(),isActive:S.isActive(`strike`),title:`Strikethrough`,children:M(w,{className:`h-3.5 w-3.5`})}),h&&N(j,{children:[M(Z,{}),M(Q,{editor:S})]})]}),M(P,{editor:S,"data-slot":`text-editor-content`,className:k(`flex-1 bg-white text-sm text-text-positive`,u)}),re&&b&&N(`div`,{"data-slot":`text-editor-footer`,className:`flex items-center justify-between border-border border-t bg-muted-muted/30 px-3 py-1 text-text-positive-weak text-xs`,children:[N(`span`,{children:[te,` words`]}),N(`span`,{"data-warning":T||void 0,className:`data-warning:text-warning-strong`,children:[C,f?` / ${f}`:``,` characters`]})]})]})}export{$ as n,Q as r,se as t};
|
|
2
|
+
//# sourceMappingURL=text-editor-5mA7XyaI.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"text-editor-Bg0Wtnt3.mjs","names":["base: AnyExtension[]","Underline","UnderlineIcon"],"sources":["../packages/components/features/text-editor/toolbar-primitives.tsx","../packages/components/features/text-editor/link-dialog.tsx","../packages/components/features/text-editor/text-editor.variants.ts","../packages/components/features/text-editor/toolbar.tsx","../packages/components/features/text-editor/text-editor.tsx"],"sourcesContent":["'use client';\n\nimport { cn } from '@customafk/react-toolkit/utils';\n\ninterface ToolbarButtonProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {\n isActive?: boolean;\n}\n\nfunction ToolbarButton({ isActive, className, children, ...props }: ToolbarButtonProps) {\n return (\n <button\n type=\"button\"\n data-slot=\"toolbar-button\"\n data-active={isActive || undefined}\n className={cn(\n 'inline-flex h-7 w-7 items-center justify-center rounded text-sm transition-colors',\n 'hover:bg-muted-muted hover:text-text-positive-strong',\n 'disabled:pointer-events-none disabled:opacity-40',\n isActive && 'bg-primary-muted text-primary hover:bg-primary-muted/80 hover:text-primary',\n className\n )}\n {...props}\n >\n {children}\n </button>\n );\n}\n\nfunction ToolbarDivider() {\n return <div data-slot=\"toolbar-divider\" className=\"mx-0.5 h-5 w-px shrink-0 bg-border\" />;\n}\n\nexport { ToolbarButton, ToolbarDivider };\n// biome-ignore lint/style/useComponentExportOnlyModules: type export needed by sibling feature files\nexport type { ToolbarButtonProps };\n","'use client';\n\nimport { useCallback, useState } from 'react';\n\nimport { Link2, Link2Off } from 'lucide-react';\n\nimport { cn } from '@customafk/react-toolkit/utils';\n\nimport { Popover, PopoverContent, PopoverTrigger } from '@/components/ui/popover';\n\nimport { type Editor, useEditorState } from '@tiptap/react';\nimport { ToolbarButton } from './toolbar-primitives';\n\nexport interface LinkDialogProps {\n editor: Editor;\n}\n\nfunction LinkDialog({ editor }: LinkDialogProps) {\n const [isOpen, setIsOpen] = useState(false);\n const [url, setUrl] = useState('');\n\n const isLinkActive = useEditorState({\n editor,\n selector: ctx => ctx.editor.isActive('link'),\n });\n\n const handleOpenChange = useCallback(\n (open: boolean) => {\n if (open) {\n const existingHref = editor.getAttributes('link').href ?? '';\n setUrl(existingHref);\n }\n setIsOpen(open);\n },\n [editor]\n );\n\n const handleApply = useCallback(() => {\n const trimmed = url.trim();\n if (!trimmed) return;\n editor.chain().focus().setLink({ href: trimmed, target: '_blank' }).run();\n setIsOpen(false);\n }, [editor, url]);\n\n const handleRemove = useCallback(() => {\n editor.chain().focus().unsetLink().run();\n setIsOpen(false);\n }, [editor]);\n\n const handleKeyDown = (e: React.KeyboardEvent<HTMLInputElement>) => {\n if (e.key === 'Enter') {\n e.preventDefault();\n handleApply();\n }\n if (e.key === 'Escape') {\n setIsOpen(false);\n }\n };\n\n return (\n <Popover open={isOpen} onOpenChange={handleOpenChange}>\n <PopoverTrigger asChild>\n <ToolbarButton isActive={isLinkActive} title=\"Link (Ctrl+K)\" data-slot=\"toolbar-link-button\">\n <Link2 className=\"h-3.5 w-3.5\" />\n </ToolbarButton>\n </PopoverTrigger>\n <PopoverContent data-slot=\"link-dialog\" sideOffset={6} align=\"start\" className=\"w-72 p-3\">\n <p className=\"mb-2 font-medium text-text-positive-strong text-xs\">{isLinkActive ? 'Edit Link' : 'Insert Link'}</p>\n <div className=\"flex gap-1.5\">\n <input\n type=\"url\"\n placeholder=\"https://example.com\"\n value={url}\n onChange={e => setUrl(e.target.value)}\n onKeyDown={handleKeyDown}\n autoFocus\n className={cn(\n 'flex-1 rounded border border-border bg-transparent px-2.5 py-1.5 text-sm text-text-positive',\n 'outline-none placeholder:text-text-positive-muted',\n 'focus:border-primary focus:ring-1 focus:ring-primary/30'\n )}\n />\n <button\n type=\"button\"\n onClick={handleApply}\n disabled={!url.trim()}\n className={cn(\n 'rounded bg-primary px-2.5 py-1.5 font-medium text-text-negative text-xs',\n 'transition-colors hover:bg-primary-strong',\n 'disabled:pointer-events-none disabled:opacity-50'\n )}\n >\n Apply\n </button>\n </div>\n {isLinkActive && (\n <button type=\"button\" onClick={handleRemove} className=\"mt-2 flex items-center gap-1 text-danger-strong text-xs hover:underline\">\n <Link2Off className=\"h-3 w-3\" />\n Remove link\n </button>\n )}\n </PopoverContent>\n </Popover>\n );\n}\n\nexport { LinkDialog };\n","import { cva, type VariantProps } from 'class-variance-authority';\n\nexport const textEditorVariants = cva(['flex flex-col overflow-hidden rounded-md'], {\n variants: {\n variant: {\n outline: 'border border-border bg-background shadow-xs',\n ghost: 'border-0',\n },\n size: {\n sm: 'text-xs [&_.ProseMirror]:min-h-24 [&_.ProseMirror]:px-2.5 [&_.ProseMirror]:py-1.5',\n md: '',\n lg: 'text-base [&_.ProseMirror]:min-h-56 [&_.ProseMirror]:px-4 [&_.ProseMirror]:py-3',\n },\n },\n defaultVariants: {\n variant: 'outline',\n size: 'md',\n },\n});\n\nexport type TextEditorVariantProps = VariantProps<typeof textEditorVariants>;\n","'use client';\n\nimport {\n AlignCenter,\n AlignJustify,\n AlignLeft,\n AlignRight,\n Bold,\n ChevronDown,\n Code,\n Code2,\n Highlighter,\n Italic,\n List,\n ListChecks,\n ListOrdered,\n Minus,\n Palette,\n Quote,\n Redo,\n Strikethrough,\n Underline,\n Undo,\n} from 'lucide-react';\n\nimport { cn } from '@customafk/react-toolkit/utils';\n\nimport { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuTrigger } from '@/components/ui/dropdown-menu';\nimport { Popover, PopoverContent, PopoverTrigger } from '@/components/ui/popover';\n\nimport { type Editor, useEditorState } from '@tiptap/react';\nimport { LinkDialog } from './link-dialog';\nimport { ToolbarButton, ToolbarDivider } from './toolbar-primitives';\n\nconst HIGHLIGHT_COLORS = [\n { label: 'Yellow', value: '#fde047' },\n { label: 'Green', value: '#86efac' },\n { label: 'Blue', value: '#93c5fd' },\n { label: 'Pink', value: '#f9a8d4' },\n { label: 'Orange', value: '#fdba74' },\n { label: 'Purple', value: '#c4b5fd' },\n { label: 'Red', value: '#fca5a5' },\n { label: 'Cyan', value: '#67e8f9' },\n { label: 'Lime', value: '#bef264' },\n { label: 'Gray', value: '#d1d5db' },\n];\n\nconst TEXT_COLORS = [\n { label: 'Default', value: '' },\n { label: 'Red', value: '#ef4444' },\n { label: 'Orange', value: '#f97316' },\n { label: 'Yellow', value: '#eab308' },\n { label: 'Green', value: '#22c55e' },\n { label: 'Blue', value: '#3b82f6' },\n { label: 'Purple', value: '#a855f7' },\n { label: 'Pink', value: '#ec4899' },\n { label: 'Gray', value: '#6b7280' },\n { label: 'Black', value: '#000000' },\n];\n\nexport interface TextEditorToolbarProps {\n editor: Editor;\n className?: string;\n enableLink?: boolean;\n enableTaskList?: boolean;\n enableHighlight?: boolean;\n enableColor?: boolean;\n}\n\nfunction TextEditorToolbar({ editor, className, enableLink, enableTaskList, enableHighlight, enableColor }: TextEditorToolbarProps) {\n const isHeading1Active = useEditorState({\n editor,\n selector: ctx => ctx.editor.isActive('heading', { level: 1 }),\n });\n const isHeading2Active = useEditorState({\n editor,\n selector: ctx => ctx.editor.isActive('heading', { level: 2 }),\n });\n const isHeading3Active = useEditorState({\n editor,\n selector: ctx => ctx.editor.isActive('heading', { level: 3 }),\n });\n const isBoldActive = useEditorState({\n editor,\n selector: ctx => ctx.editor.isActive('bold'),\n });\n const isItalicActive = useEditorState({\n editor,\n selector: ctx => ctx.editor.isActive('italic'),\n });\n const isUnderlineActive = useEditorState({\n editor,\n selector: ctx => ctx.editor.isActive('underline'),\n });\n const isStrikeActive = useEditorState({\n editor,\n selector: ctx => ctx.editor.isActive('strike'),\n });\n const isCodeActive = useEditorState({\n editor,\n selector: ctx => ctx.editor.isActive('code'),\n });\n const isBulletListActive = useEditorState({\n editor,\n selector: ctx => ctx.editor.isActive('bulletList'),\n });\n const isOrderedListActive = useEditorState({\n editor,\n selector: ctx => ctx.editor.isActive('orderedList'),\n });\n const isTaskListActive = useEditorState({\n editor,\n selector: ctx => ctx.editor.isActive('taskList'),\n });\n const isBlockquoteActive = useEditorState({\n editor,\n selector: ctx => ctx.editor.isActive('blockquote'),\n });\n const isCodeBlockActive = useEditorState({\n editor,\n selector: ctx => ctx.editor.isActive('codeBlock'),\n });\n const isAlignLeftActive = useEditorState({\n editor,\n selector: ctx => ctx.editor.isActive({ textAlign: 'left' }),\n });\n const isAlignCenterActive = useEditorState({\n editor,\n selector: ctx => ctx.editor.isActive({ textAlign: 'center' }),\n });\n const isAlignRightActive = useEditorState({\n editor,\n selector: ctx => ctx.editor.isActive({ textAlign: 'right' }),\n });\n const isAlignJustifyActive = useEditorState({\n editor,\n selector: ctx => ctx.editor.isActive({ textAlign: 'justify' }),\n });\n\n const headingLabel = isHeading1Active ? 'H1' : isHeading2Active ? 'H2' : isHeading3Active ? 'H3' : 'P';\n\n return (\n <div data-slot=\"text-editor-toolbar\" className={cn('flex flex-wrap items-center gap-0.5 border-border border-b bg-muted-muted/50 p-1.5', className)}>\n {/* History */}\n <ToolbarButton onClick={() => editor.chain().focus().undo().run()} disabled={!editor.can().undo()} title=\"Undo (Ctrl+Z)\">\n <Undo className=\"h-3.5 w-3.5\" />\n </ToolbarButton>\n <ToolbarButton onClick={() => editor.chain().focus().redo().run()} disabled={!editor.can().redo()} title=\"Redo (Ctrl+Y)\">\n <Redo className=\"h-3.5 w-3.5\" />\n </ToolbarButton>\n\n <ToolbarDivider />\n\n {/* Heading dropdown */}\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <button\n type=\"button\"\n data-slot=\"toolbar-heading-trigger\"\n className={cn(\n 'inline-flex h-7 items-center gap-1 rounded px-1.5 font-medium text-xs transition-colors',\n 'hover:bg-muted-muted hover:text-text-positive-strong',\n 'disabled:pointer-events-none disabled:opacity-40',\n (isHeading1Active || isHeading2Active || isHeading3Active) && 'bg-primary-muted text-primary hover:bg-primary-muted/80 hover:text-primary'\n )}\n >\n <span className=\"w-5 text-center\">{headingLabel}</span>\n <ChevronDown className=\"h-3 w-3 opacity-60\" />\n </button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"start\" className=\"min-w-32\">\n <DropdownMenuItem onClick={() => editor.chain().focus().setParagraph().run()}>\n <span className=\"text-sm\">Paragraph</span>\n </DropdownMenuItem>\n <DropdownMenuItem onClick={() => editor.chain().focus().toggleHeading({ level: 1 }).run()}>\n <span className=\"font-bold text-lg\">Heading 1</span>\n </DropdownMenuItem>\n <DropdownMenuItem onClick={() => editor.chain().focus().toggleHeading({ level: 2 }).run()}>\n <span className=\"font-semibold text-base\">Heading 2</span>\n </DropdownMenuItem>\n <DropdownMenuItem onClick={() => editor.chain().focus().toggleHeading({ level: 3 }).run()}>\n <span className=\"font-semibold text-sm\">Heading 3</span>\n </DropdownMenuItem>\n </DropdownMenuContent>\n </DropdownMenu>\n\n <ToolbarDivider />\n\n {/* Text formatting */}\n <ToolbarButton onClick={() => editor.chain().focus().toggleBold().run()} isActive={isBoldActive} title=\"Bold (Ctrl+B)\">\n <Bold className=\"h-3.5 w-3.5\" />\n </ToolbarButton>\n <ToolbarButton onClick={() => editor.chain().focus().toggleItalic().run()} isActive={isItalicActive} title=\"Italic (Ctrl+I)\">\n <Italic className=\"h-3.5 w-3.5\" />\n </ToolbarButton>\n <ToolbarButton onClick={() => editor.chain().focus().toggleUnderline().run()} isActive={isUnderlineActive} title=\"Underline (Ctrl+U)\">\n <Underline className=\"h-3.5 w-3.5\" />\n </ToolbarButton>\n <ToolbarButton onClick={() => editor.chain().focus().toggleStrike().run()} isActive={isStrikeActive} title=\"Strikethrough\">\n <Strikethrough className=\"h-3.5 w-3.5\" />\n </ToolbarButton>\n <ToolbarButton onClick={() => editor.chain().focus().toggleCode().run()} isActive={isCodeActive} title=\"Inline Code\">\n <Code className=\"h-3.5 w-3.5\" />\n </ToolbarButton>\n\n <ToolbarDivider />\n\n {/* Lists */}\n <ToolbarButton onClick={() => editor.chain().focus().toggleBulletList().run()} isActive={isBulletListActive} title=\"Bullet List\">\n <List className=\"h-3.5 w-3.5\" />\n </ToolbarButton>\n <ToolbarButton onClick={() => editor.chain().focus().toggleOrderedList().run()} isActive={isOrderedListActive} title=\"Ordered List\">\n <ListOrdered className=\"h-3.5 w-3.5\" />\n </ToolbarButton>\n {enableTaskList && (\n <ToolbarButton onClick={() => editor.chain().focus().toggleTaskList().run()} isActive={isTaskListActive} title=\"Task List\">\n <ListChecks className=\"h-3.5 w-3.5\" />\n </ToolbarButton>\n )}\n\n <ToolbarDivider />\n\n {/* Blocks */}\n <ToolbarButton onClick={() => editor.chain().focus().toggleBlockquote().run()} isActive={isBlockquoteActive} title=\"Blockquote\">\n <Quote className=\"h-3.5 w-3.5\" />\n </ToolbarButton>\n <ToolbarButton onClick={() => editor.chain().focus().toggleCodeBlock().run()} isActive={isCodeBlockActive} title=\"Code Block\">\n <Code2 className=\"h-3.5 w-3.5\" />\n </ToolbarButton>\n <ToolbarButton onClick={() => editor.chain().focus().setHorizontalRule().run()} title=\"Horizontal Rule\">\n <Minus className=\"h-3.5 w-3.5\" />\n </ToolbarButton>\n\n <ToolbarDivider />\n\n {/* Text alignment */}\n <ToolbarButton onClick={() => editor.chain().focus().setTextAlign('left').run()} isActive={isAlignLeftActive} title=\"Align Left\">\n <AlignLeft className=\"h-3.5 w-3.5\" />\n </ToolbarButton>\n <ToolbarButton onClick={() => editor.chain().focus().setTextAlign('center').run()} isActive={isAlignCenterActive} title=\"Align Center\">\n <AlignCenter className=\"h-3.5 w-3.5\" />\n </ToolbarButton>\n <ToolbarButton onClick={() => editor.chain().focus().setTextAlign('right').run()} isActive={isAlignRightActive} title=\"Align Right\">\n <AlignRight className=\"h-3.5 w-3.5\" />\n </ToolbarButton>\n <ToolbarButton onClick={() => editor.chain().focus().setTextAlign('justify').run()} isActive={isAlignJustifyActive} title=\"Align Justify\">\n <AlignJustify className=\"h-3.5 w-3.5\" />\n </ToolbarButton>\n\n {/* Link */}\n {enableLink && (\n <>\n <ToolbarDivider />\n <LinkDialog editor={editor} />\n </>\n )}\n\n {/* Color & Highlight */}\n {(enableColor || enableHighlight) && (\n <>\n <ToolbarDivider />\n {enableColor && (\n <Popover>\n <PopoverTrigger asChild>\n <ToolbarButton title=\"Text Color\">\n <Palette className=\"h-3.5 w-3.5\" />\n </ToolbarButton>\n </PopoverTrigger>\n <PopoverContent align=\"start\" className=\"w-44 p-2\">\n <p className=\"mb-1.5 font-medium text-text-positive-weak text-xs\">Text Color</p>\n <div className=\"grid grid-cols-5 gap-1\">\n {TEXT_COLORS.map(color => (\n <button\n key={color.label}\n type=\"button\"\n title={color.label}\n onClick={() => {\n if (!color.value) {\n editor.chain().focus().unsetColor().run();\n } else {\n editor.chain().focus().setColor(color.value).run();\n }\n }}\n className={cn(\n 'h-6 w-6 rounded border border-border transition-transform hover:scale-110',\n !color.value && 'bg-background text-[10px] text-text-positive leading-none'\n )}\n style={color.value ? { backgroundColor: color.value } : undefined}\n >\n {!color.value && '∅'}\n </button>\n ))}\n </div>\n </PopoverContent>\n </Popover>\n )}\n {enableHighlight && (\n <Popover>\n <PopoverTrigger asChild>\n <ToolbarButton title=\"Highlight\">\n <Highlighter className=\"h-3.5 w-3.5\" />\n </ToolbarButton>\n </PopoverTrigger>\n <PopoverContent align=\"start\" className=\"w-44 p-2\">\n <p className=\"mb-1.5 font-medium text-text-positive-weak text-xs\">Highlight</p>\n <div className=\"grid grid-cols-5 gap-1\">\n {HIGHLIGHT_COLORS.map(color => (\n <button\n key={color.label}\n type=\"button\"\n title={color.label}\n onClick={() => editor.chain().focus().toggleHighlight({ color: color.value }).run()}\n className=\"h-6 w-6 rounded border border-border transition-transform hover:scale-110\"\n style={{ backgroundColor: color.value }}\n />\n ))}\n </div>\n <button\n type=\"button\"\n onClick={() => editor.chain().focus().unsetHighlight().run()}\n className=\"mt-1.5 w-full rounded border border-border py-0.5 text-center text-text-positive-weak text-xs hover:bg-muted-muted\"\n >\n Clear highlight\n </button>\n </PopoverContent>\n </Popover>\n )}\n </>\n )}\n </div>\n );\n}\n\nexport { TextEditorToolbar };\n","'use client';\n\nimport { useEffect, useMemo } from 'react';\n\nimport { Bold, Italic, Strikethrough, Underline as UnderlineIcon } from 'lucide-react';\n\nimport { cn } from '@customafk/react-toolkit/utils';\n\nimport { CharacterCount } from '@tiptap/extension-character-count';\nimport { Highlight } from '@tiptap/extension-highlight';\nimport { Link } from '@tiptap/extension-link';\nimport { ListKeymap } from '@tiptap/extension-list-keymap';\nimport Placeholder from '@tiptap/extension-placeholder';\nimport { TaskItem } from '@tiptap/extension-task-item';\nimport { TaskList } from '@tiptap/extension-task-list';\nimport TextAlign from '@tiptap/extension-text-align';\nimport { Color, TextStyle } from '@tiptap/extension-text-style';\nimport Underline from '@tiptap/extension-underline';\nimport { type AnyExtension, EditorContent, useEditor, useEditorState } from '@tiptap/react';\nimport { BubbleMenu } from '@tiptap/react/menus';\nimport StarterKit from '@tiptap/starter-kit';\nimport { LinkDialog } from './link-dialog';\nimport { type TextEditorVariantProps, textEditorVariants } from './text-editor.variants';\nimport { TextEditorToolbar } from './toolbar';\nimport { ToolbarButton, ToolbarDivider } from './toolbar-primitives';\n\nexport interface TextEditorProps extends TextEditorVariantProps {\n value?: string;\n defaultValue?: string;\n onChange?: (html: string) => void;\n placeholder?: string;\n readOnly?: boolean;\n showToolbar?: boolean;\n className?: string;\n toolbarClassName?: string;\n editorClassName?: string;\n // Character count\n maxLength?: number;\n showCharacterCount?: boolean;\n onCharacterCount?: (stats: { characters: number; words: number }) => void;\n // Feature flags\n enableLink?: boolean;\n enableBubbleMenu?: boolean;\n enableTaskList?: boolean;\n enableHighlight?: boolean;\n enableColor?: boolean;\n}\n\nfunction TextEditor({\n value,\n defaultValue,\n onChange,\n placeholder = 'Start writing...',\n readOnly = false,\n showToolbar = true,\n variant,\n size,\n className,\n toolbarClassName,\n editorClassName,\n maxLength,\n showCharacterCount,\n onCharacterCount,\n enableLink,\n enableBubbleMenu,\n enableTaskList,\n enableHighlight,\n enableColor,\n}: TextEditorProps) {\n const needsCharCount = maxLength !== undefined || showCharacterCount || onCharacterCount !== undefined;\n const needsTextStyle = enableColor || enableHighlight;\n\n const extensions = useMemo(() => {\n const base: AnyExtension[] = [\n StarterKit,\n Underline,\n Placeholder.configure({ placeholder }),\n TextAlign.configure({ types: ['heading', 'paragraph'] }),\n ListKeymap,\n ];\n\n if (needsTextStyle) base.push(TextStyle);\n if (enableLink) {\n base.push(Link.configure({ openOnClick: false, linkOnPaste: true, defaultProtocol: 'https' }));\n }\n if (enableTaskList) {\n base.push(TaskList, TaskItem.configure({ nested: true }));\n }\n if (enableHighlight) {\n base.push(Highlight.configure({ multicolor: true }));\n }\n if (enableColor) {\n base.push(Color);\n }\n if (needsCharCount) {\n base.push(CharacterCount.configure({ limit: maxLength }));\n }\n\n return base;\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [needsCharCount, placeholder, maxLength, enableHighlight, needsTextStyle, enableTaskList, enableLink, enableColor]);\n\n const editor = useEditor({\n extensions,\n content: value ?? defaultValue,\n editable: !readOnly,\n onUpdate: ({ editor: e }) => {\n onChange?.(e.getHTML());\n if (onCharacterCount) {\n const storage = e.storage.characterCount;\n onCharacterCount({ characters: storage.characters(), words: storage.words() });\n }\n },\n });\n\n useEffect(() => {\n if (!editor || value === undefined) return;\n if (editor.getHTML() === value) return;\n editor.commands.setContent(value);\n }, [editor, value]);\n\n useEffect(() => {\n if (!editor) return;\n editor.setEditable(!readOnly);\n }, [editor, readOnly]);\n\n const charCount = useEditorState({\n editor,\n selector: ctx => {\n const storage = ctx.editor?.storage?.characterCount;\n return storage ? (storage.characters() as number) : 0;\n },\n });\n\n const wordCount = useEditorState({\n editor,\n selector: ctx => {\n const storage = ctx.editor?.storage?.characterCount;\n return storage ? (storage.words() as number) : 0;\n },\n });\n\n const showCharCount = showCharacterCount || maxLength !== undefined;\n const isNearLimit = maxLength !== undefined && charCount > maxLength * 0.9;\n\n return (\n <div data-slot=\"text-editor\" className={cn('lunas-text-editor', textEditorVariants({ variant, size }), className)}>\n {showToolbar && !readOnly && editor && (\n <TextEditorToolbar\n editor={editor}\n className={toolbarClassName}\n enableLink={enableLink}\n enableTaskList={enableTaskList}\n enableHighlight={enableHighlight}\n enableColor={enableColor}\n />\n )}\n\n {enableBubbleMenu && !readOnly && editor && (\n <BubbleMenu\n editor={editor}\n options={{ placement: 'top' }}\n className={cn('flex items-center gap-0.5 rounded-md border border-border bg-popover p-1 shadow-dropdown')}\n >\n <ToolbarButton onClick={() => editor.chain().focus().toggleBold().run()} isActive={editor.isActive('bold')} title=\"Bold (Ctrl+B)\">\n <Bold className=\"h-3.5 w-3.5\" />\n </ToolbarButton>\n <ToolbarButton onClick={() => editor.chain().focus().toggleItalic().run()} isActive={editor.isActive('italic')} title=\"Italic (Ctrl+I)\">\n <Italic className=\"h-3.5 w-3.5\" />\n </ToolbarButton>\n <ToolbarButton onClick={() => editor.chain().focus().toggleUnderline().run()} isActive={editor.isActive('underline')} title=\"Underline (Ctrl+U)\">\n <UnderlineIcon className=\"h-3.5 w-3.5\" />\n </ToolbarButton>\n <ToolbarButton onClick={() => editor.chain().focus().toggleStrike().run()} isActive={editor.isActive('strike')} title=\"Strikethrough\">\n <Strikethrough className=\"h-3.5 w-3.5\" />\n </ToolbarButton>\n {enableLink && (\n <>\n <ToolbarDivider />\n <LinkDialog editor={editor} />\n </>\n )}\n </BubbleMenu>\n )}\n\n <EditorContent editor={editor} data-slot=\"text-editor-content\" className={cn('flex-1 bg-white text-sm text-text-positive', editorClassName)} />\n\n {showCharCount && needsCharCount && (\n <div\n data-slot=\"text-editor-footer\"\n className=\"flex items-center justify-between border-border border-t bg-muted-muted/30 px-3 py-1 text-text-positive-weak text-xs\"\n >\n <span>{wordCount} words</span>\n <span data-warning={isNearLimit || undefined} className=\"data-warning:text-warning-strong\">\n {charCount}\n {maxLength ? ` / ${maxLength}` : ''} characters\n </span>\n </div>\n )}\n </div>\n );\n}\n\nexport { TextEditor };\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"text-editor-5mA7XyaI.mjs","names":["base: AnyExtension[]","Underline","UnderlineIcon"],"sources":["../packages/components/features/text-editor/toolbar-primitives.tsx","../packages/components/features/text-editor/link-dialog.tsx","../packages/components/features/text-editor/text-editor.variants.ts","../packages/components/features/text-editor/toolbar.tsx","../packages/components/features/text-editor/text-editor.tsx"],"sourcesContent":["'use client';\n\nimport { cn } from '@customafk/react-toolkit/utils';\n\ninterface ToolbarButtonProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {\n isActive?: boolean;\n}\n\nfunction ToolbarButton({ isActive, className, children, ...props }: ToolbarButtonProps) {\n return (\n <button\n type=\"button\"\n data-slot=\"toolbar-button\"\n data-active={isActive || undefined}\n className={cn(\n 'inline-flex h-7 w-7 items-center justify-center rounded text-sm transition-colors',\n 'hover:bg-muted-muted hover:text-text-positive-strong',\n 'disabled:pointer-events-none disabled:opacity-40',\n isActive && 'bg-primary-muted text-primary hover:bg-primary-muted/80 hover:text-primary',\n className\n )}\n {...props}\n >\n {children}\n </button>\n );\n}\n\nfunction ToolbarDivider() {\n return <div data-slot=\"toolbar-divider\" className=\"mx-0.5 h-5 w-px shrink-0 bg-border\" />;\n}\n\nexport { ToolbarButton, ToolbarDivider };\n// biome-ignore lint/style/useComponentExportOnlyModules: type export needed by sibling feature files\nexport type { ToolbarButtonProps };\n","'use client';\n\nimport { useCallback, useState } from 'react';\n\nimport { Link2, Link2Off } from 'lucide-react';\n\nimport { cn } from '@customafk/react-toolkit/utils';\n\nimport { Popover, PopoverContent, PopoverTrigger } from '@/components/ui/popover';\n\nimport { type Editor, useEditorState } from '@tiptap/react';\nimport { ToolbarButton } from './toolbar-primitives';\n\nexport interface LinkDialogProps {\n editor: Editor;\n}\n\nfunction LinkDialog({ editor }: LinkDialogProps) {\n const [isOpen, setIsOpen] = useState(false);\n const [url, setUrl] = useState('');\n\n const isLinkActive = useEditorState({\n editor,\n selector: ctx => ctx.editor.isActive('link'),\n });\n\n const handleOpenChange = useCallback(\n (open: boolean) => {\n if (open) {\n const existingHref = editor.getAttributes('link').href ?? '';\n setUrl(existingHref);\n }\n setIsOpen(open);\n },\n [editor]\n );\n\n const handleApply = useCallback(() => {\n const trimmed = url.trim();\n if (!trimmed) return;\n editor.chain().focus().setLink({ href: trimmed, target: '_blank' }).run();\n setIsOpen(false);\n }, [editor, url]);\n\n const handleRemove = useCallback(() => {\n editor.chain().focus().unsetLink().run();\n setIsOpen(false);\n }, [editor]);\n\n const handleKeyDown = (e: React.KeyboardEvent<HTMLInputElement>) => {\n if (e.key === 'Enter') {\n e.preventDefault();\n handleApply();\n }\n if (e.key === 'Escape') {\n setIsOpen(false);\n }\n };\n\n return (\n <Popover open={isOpen} onOpenChange={handleOpenChange}>\n <PopoverTrigger asChild>\n <ToolbarButton isActive={isLinkActive} title=\"Link (Ctrl+K)\" data-slot=\"toolbar-link-button\">\n <Link2 className=\"h-3.5 w-3.5\" />\n </ToolbarButton>\n </PopoverTrigger>\n <PopoverContent data-slot=\"link-dialog\" sideOffset={6} align=\"start\" className=\"w-72 p-3\">\n <p className=\"mb-2 font-medium text-text-positive-strong text-xs\">{isLinkActive ? 'Edit Link' : 'Insert Link'}</p>\n <div className=\"flex gap-1.5\">\n <input\n type=\"url\"\n placeholder=\"https://example.com\"\n value={url}\n onChange={e => setUrl(e.target.value)}\n onKeyDown={handleKeyDown}\n autoFocus\n className={cn(\n 'flex-1 rounded border border-border bg-transparent px-2.5 py-1.5 text-sm text-text-positive',\n 'outline-none placeholder:text-text-positive-muted',\n 'focus:border-primary focus:ring-1 focus:ring-primary/30'\n )}\n />\n <button\n type=\"button\"\n onClick={handleApply}\n disabled={!url.trim()}\n className={cn(\n 'rounded bg-primary px-2.5 py-1.5 font-medium text-text-negative text-xs',\n 'transition-colors hover:bg-primary-strong',\n 'disabled:pointer-events-none disabled:opacity-50'\n )}\n >\n Apply\n </button>\n </div>\n {isLinkActive && (\n <button type=\"button\" onClick={handleRemove} className=\"mt-2 flex items-center gap-1 text-danger-strong text-xs hover:underline\">\n <Link2Off className=\"h-3 w-3\" />\n Remove link\n </button>\n )}\n </PopoverContent>\n </Popover>\n );\n}\n\nexport { LinkDialog };\n","import { cva, type VariantProps } from 'class-variance-authority';\n\nexport const textEditorVariants = cva(['flex flex-col overflow-hidden rounded-md'], {\n variants: {\n variant: {\n outline: 'border border-border bg-background shadow-xs',\n ghost: 'border-0',\n },\n size: {\n sm: 'text-xs [&_.ProseMirror]:min-h-24 [&_.ProseMirror]:px-2.5 [&_.ProseMirror]:py-1.5',\n md: '',\n lg: 'text-base [&_.ProseMirror]:min-h-56 [&_.ProseMirror]:px-4 [&_.ProseMirror]:py-3',\n },\n },\n defaultVariants: {\n variant: 'outline',\n size: 'md',\n },\n});\n\nexport type TextEditorVariantProps = VariantProps<typeof textEditorVariants>;\n","'use client';\n\nimport {\n AlignCenter,\n AlignJustify,\n AlignLeft,\n AlignRight,\n Bold,\n ChevronDown,\n Code,\n Code2,\n Highlighter,\n Italic,\n List,\n ListChecks,\n ListOrdered,\n Minus,\n Palette,\n Quote,\n Redo,\n Strikethrough,\n Underline,\n Undo,\n} from 'lucide-react';\n\nimport { cn } from '@customafk/react-toolkit/utils';\n\nimport { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuTrigger } from '@/components/ui/dropdown-menu';\nimport { Popover, PopoverContent, PopoverTrigger } from '@/components/ui/popover';\n\nimport { type Editor, useEditorState } from '@tiptap/react';\nimport { LinkDialog } from './link-dialog';\nimport { ToolbarButton, ToolbarDivider } from './toolbar-primitives';\n\nconst HIGHLIGHT_COLORS = [\n { label: 'Yellow', value: '#fde047' },\n { label: 'Green', value: '#86efac' },\n { label: 'Blue', value: '#93c5fd' },\n { label: 'Pink', value: '#f9a8d4' },\n { label: 'Orange', value: '#fdba74' },\n { label: 'Purple', value: '#c4b5fd' },\n { label: 'Red', value: '#fca5a5' },\n { label: 'Cyan', value: '#67e8f9' },\n { label: 'Lime', value: '#bef264' },\n { label: 'Gray', value: '#d1d5db' },\n];\n\nconst TEXT_COLORS = [\n { label: 'Default', value: '' },\n { label: 'Red', value: '#ef4444' },\n { label: 'Orange', value: '#f97316' },\n { label: 'Yellow', value: '#eab308' },\n { label: 'Green', value: '#22c55e' },\n { label: 'Blue', value: '#3b82f6' },\n { label: 'Purple', value: '#a855f7' },\n { label: 'Pink', value: '#ec4899' },\n { label: 'Gray', value: '#6b7280' },\n { label: 'Black', value: '#000000' },\n];\n\nexport interface TextEditorToolbarProps {\n editor: Editor;\n className?: string;\n enableLink?: boolean;\n enableTaskList?: boolean;\n enableHighlight?: boolean;\n enableColor?: boolean;\n}\n\nfunction TextEditorToolbar({ editor, className, enableLink, enableTaskList, enableHighlight, enableColor }: TextEditorToolbarProps) {\n const isHeading1Active = useEditorState({\n editor,\n selector: ctx => ctx.editor.isActive('heading', { level: 1 }),\n });\n const isHeading2Active = useEditorState({\n editor,\n selector: ctx => ctx.editor.isActive('heading', { level: 2 }),\n });\n const isHeading3Active = useEditorState({\n editor,\n selector: ctx => ctx.editor.isActive('heading', { level: 3 }),\n });\n const isBoldActive = useEditorState({\n editor,\n selector: ctx => ctx.editor.isActive('bold'),\n });\n const isItalicActive = useEditorState({\n editor,\n selector: ctx => ctx.editor.isActive('italic'),\n });\n const isUnderlineActive = useEditorState({\n editor,\n selector: ctx => ctx.editor.isActive('underline'),\n });\n const isStrikeActive = useEditorState({\n editor,\n selector: ctx => ctx.editor.isActive('strike'),\n });\n const isCodeActive = useEditorState({\n editor,\n selector: ctx => ctx.editor.isActive('code'),\n });\n const isBulletListActive = useEditorState({\n editor,\n selector: ctx => ctx.editor.isActive('bulletList'),\n });\n const isOrderedListActive = useEditorState({\n editor,\n selector: ctx => ctx.editor.isActive('orderedList'),\n });\n const isTaskListActive = useEditorState({\n editor,\n selector: ctx => ctx.editor.isActive('taskList'),\n });\n const isBlockquoteActive = useEditorState({\n editor,\n selector: ctx => ctx.editor.isActive('blockquote'),\n });\n const isCodeBlockActive = useEditorState({\n editor,\n selector: ctx => ctx.editor.isActive('codeBlock'),\n });\n const isAlignLeftActive = useEditorState({\n editor,\n selector: ctx => ctx.editor.isActive({ textAlign: 'left' }),\n });\n const isAlignCenterActive = useEditorState({\n editor,\n selector: ctx => ctx.editor.isActive({ textAlign: 'center' }),\n });\n const isAlignRightActive = useEditorState({\n editor,\n selector: ctx => ctx.editor.isActive({ textAlign: 'right' }),\n });\n const isAlignJustifyActive = useEditorState({\n editor,\n selector: ctx => ctx.editor.isActive({ textAlign: 'justify' }),\n });\n\n const headingLabel = isHeading1Active ? 'H1' : isHeading2Active ? 'H2' : isHeading3Active ? 'H3' : 'P';\n\n return (\n <div data-slot=\"text-editor-toolbar\" className={cn('flex flex-wrap items-center gap-0.5 border-border border-b bg-muted-muted/50 p-1.5', className)}>\n {/* History */}\n <ToolbarButton onClick={() => editor.chain().focus().undo().run()} disabled={!editor.can().undo()} title=\"Undo (Ctrl+Z)\">\n <Undo className=\"h-3.5 w-3.5\" />\n </ToolbarButton>\n <ToolbarButton onClick={() => editor.chain().focus().redo().run()} disabled={!editor.can().redo()} title=\"Redo (Ctrl+Y)\">\n <Redo className=\"h-3.5 w-3.5\" />\n </ToolbarButton>\n\n <ToolbarDivider />\n\n {/* Heading dropdown */}\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <button\n type=\"button\"\n data-slot=\"toolbar-heading-trigger\"\n className={cn(\n 'inline-flex h-7 items-center gap-1 rounded px-1.5 font-medium text-xs transition-colors',\n 'hover:bg-muted-muted hover:text-text-positive-strong',\n 'disabled:pointer-events-none disabled:opacity-40',\n (isHeading1Active || isHeading2Active || isHeading3Active) && 'bg-primary-muted text-primary hover:bg-primary-muted/80 hover:text-primary'\n )}\n >\n <span className=\"w-5 text-center\">{headingLabel}</span>\n <ChevronDown className=\"h-3 w-3 opacity-60\" />\n </button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"start\" className=\"min-w-32\">\n <DropdownMenuItem onClick={() => editor.chain().focus().setParagraph().run()}>\n <span className=\"text-sm\">Paragraph</span>\n </DropdownMenuItem>\n <DropdownMenuItem onClick={() => editor.chain().focus().toggleHeading({ level: 1 }).run()}>\n <span className=\"font-bold text-lg\">Heading 1</span>\n </DropdownMenuItem>\n <DropdownMenuItem onClick={() => editor.chain().focus().toggleHeading({ level: 2 }).run()}>\n <span className=\"font-semibold text-base\">Heading 2</span>\n </DropdownMenuItem>\n <DropdownMenuItem onClick={() => editor.chain().focus().toggleHeading({ level: 3 }).run()}>\n <span className=\"font-semibold text-sm\">Heading 3</span>\n </DropdownMenuItem>\n </DropdownMenuContent>\n </DropdownMenu>\n\n <ToolbarDivider />\n\n {/* Text formatting */}\n <ToolbarButton onClick={() => editor.chain().focus().toggleBold().run()} isActive={isBoldActive} title=\"Bold (Ctrl+B)\">\n <Bold className=\"h-3.5 w-3.5\" />\n </ToolbarButton>\n <ToolbarButton onClick={() => editor.chain().focus().toggleItalic().run()} isActive={isItalicActive} title=\"Italic (Ctrl+I)\">\n <Italic className=\"h-3.5 w-3.5\" />\n </ToolbarButton>\n <ToolbarButton onClick={() => editor.chain().focus().toggleUnderline().run()} isActive={isUnderlineActive} title=\"Underline (Ctrl+U)\">\n <Underline className=\"h-3.5 w-3.5\" />\n </ToolbarButton>\n <ToolbarButton onClick={() => editor.chain().focus().toggleStrike().run()} isActive={isStrikeActive} title=\"Strikethrough\">\n <Strikethrough className=\"h-3.5 w-3.5\" />\n </ToolbarButton>\n <ToolbarButton onClick={() => editor.chain().focus().toggleCode().run()} isActive={isCodeActive} title=\"Inline Code\">\n <Code className=\"h-3.5 w-3.5\" />\n </ToolbarButton>\n\n <ToolbarDivider />\n\n {/* Lists */}\n <ToolbarButton onClick={() => editor.chain().focus().toggleBulletList().run()} isActive={isBulletListActive} title=\"Bullet List\">\n <List className=\"h-3.5 w-3.5\" />\n </ToolbarButton>\n <ToolbarButton onClick={() => editor.chain().focus().toggleOrderedList().run()} isActive={isOrderedListActive} title=\"Ordered List\">\n <ListOrdered className=\"h-3.5 w-3.5\" />\n </ToolbarButton>\n {enableTaskList && (\n <ToolbarButton onClick={() => editor.chain().focus().toggleTaskList().run()} isActive={isTaskListActive} title=\"Task List\">\n <ListChecks className=\"h-3.5 w-3.5\" />\n </ToolbarButton>\n )}\n\n <ToolbarDivider />\n\n {/* Blocks */}\n <ToolbarButton onClick={() => editor.chain().focus().toggleBlockquote().run()} isActive={isBlockquoteActive} title=\"Blockquote\">\n <Quote className=\"h-3.5 w-3.5\" />\n </ToolbarButton>\n <ToolbarButton onClick={() => editor.chain().focus().toggleCodeBlock().run()} isActive={isCodeBlockActive} title=\"Code Block\">\n <Code2 className=\"h-3.5 w-3.5\" />\n </ToolbarButton>\n <ToolbarButton onClick={() => editor.chain().focus().setHorizontalRule().run()} title=\"Horizontal Rule\">\n <Minus className=\"h-3.5 w-3.5\" />\n </ToolbarButton>\n\n <ToolbarDivider />\n\n {/* Text alignment */}\n <ToolbarButton onClick={() => editor.chain().focus().setTextAlign('left').run()} isActive={isAlignLeftActive} title=\"Align Left\">\n <AlignLeft className=\"h-3.5 w-3.5\" />\n </ToolbarButton>\n <ToolbarButton onClick={() => editor.chain().focus().setTextAlign('center').run()} isActive={isAlignCenterActive} title=\"Align Center\">\n <AlignCenter className=\"h-3.5 w-3.5\" />\n </ToolbarButton>\n <ToolbarButton onClick={() => editor.chain().focus().setTextAlign('right').run()} isActive={isAlignRightActive} title=\"Align Right\">\n <AlignRight className=\"h-3.5 w-3.5\" />\n </ToolbarButton>\n <ToolbarButton onClick={() => editor.chain().focus().setTextAlign('justify').run()} isActive={isAlignJustifyActive} title=\"Align Justify\">\n <AlignJustify className=\"h-3.5 w-3.5\" />\n </ToolbarButton>\n\n {/* Link */}\n {enableLink && (\n <>\n <ToolbarDivider />\n <LinkDialog editor={editor} />\n </>\n )}\n\n {/* Color & Highlight */}\n {(enableColor || enableHighlight) && (\n <>\n <ToolbarDivider />\n {enableColor && (\n <Popover>\n <PopoverTrigger asChild>\n <ToolbarButton title=\"Text Color\">\n <Palette className=\"h-3.5 w-3.5\" />\n </ToolbarButton>\n </PopoverTrigger>\n <PopoverContent align=\"start\" className=\"w-44 p-2\">\n <p className=\"mb-1.5 font-medium text-text-positive-weak text-xs\">Text Color</p>\n <div className=\"grid grid-cols-5 gap-1\">\n {TEXT_COLORS.map(color => (\n <button\n key={color.label}\n type=\"button\"\n title={color.label}\n onClick={() => {\n if (!color.value) {\n editor.chain().focus().unsetColor().run();\n } else {\n editor.chain().focus().setColor(color.value).run();\n }\n }}\n className={cn(\n 'h-6 w-6 rounded border border-border transition-transform hover:scale-110',\n !color.value && 'bg-background text-[10px] text-text-positive leading-none'\n )}\n style={color.value ? { backgroundColor: color.value } : undefined}\n >\n {!color.value && '∅'}\n </button>\n ))}\n </div>\n </PopoverContent>\n </Popover>\n )}\n {enableHighlight && (\n <Popover>\n <PopoverTrigger asChild>\n <ToolbarButton title=\"Highlight\">\n <Highlighter className=\"h-3.5 w-3.5\" />\n </ToolbarButton>\n </PopoverTrigger>\n <PopoverContent align=\"start\" className=\"w-44 p-2\">\n <p className=\"mb-1.5 font-medium text-text-positive-weak text-xs\">Highlight</p>\n <div className=\"grid grid-cols-5 gap-1\">\n {HIGHLIGHT_COLORS.map(color => (\n <button\n key={color.label}\n type=\"button\"\n title={color.label}\n onClick={() => editor.chain().focus().toggleHighlight({ color: color.value }).run()}\n className=\"h-6 w-6 rounded border border-border transition-transform hover:scale-110\"\n style={{ backgroundColor: color.value }}\n />\n ))}\n </div>\n <button\n type=\"button\"\n onClick={() => editor.chain().focus().unsetHighlight().run()}\n className=\"mt-1.5 w-full rounded border border-border py-0.5 text-center text-text-positive-weak text-xs hover:bg-muted-muted\"\n >\n Clear highlight\n </button>\n </PopoverContent>\n </Popover>\n )}\n </>\n )}\n </div>\n );\n}\n\nexport { TextEditorToolbar };\n","'use client';\n\nimport { useEffect, useMemo } from 'react';\n\nimport { Bold, Italic, Strikethrough, Underline as UnderlineIcon } from 'lucide-react';\n\nimport { cn } from '@customafk/react-toolkit/utils';\n\nimport { CharacterCount } from '@tiptap/extension-character-count';\nimport { Highlight } from '@tiptap/extension-highlight';\nimport { Link } from '@tiptap/extension-link';\nimport { ListKeymap } from '@tiptap/extension-list-keymap';\nimport Placeholder from '@tiptap/extension-placeholder';\nimport { TaskItem } from '@tiptap/extension-task-item';\nimport { TaskList } from '@tiptap/extension-task-list';\nimport TextAlign from '@tiptap/extension-text-align';\nimport { Color, TextStyle } from '@tiptap/extension-text-style';\nimport Underline from '@tiptap/extension-underline';\nimport { type AnyExtension, EditorContent, useEditor, useEditorState } from '@tiptap/react';\nimport { BubbleMenu } from '@tiptap/react/menus';\nimport StarterKit from '@tiptap/starter-kit';\nimport { LinkDialog } from './link-dialog';\nimport { type TextEditorVariantProps, textEditorVariants } from './text-editor.variants';\nimport { TextEditorToolbar } from './toolbar';\nimport { ToolbarButton, ToolbarDivider } from './toolbar-primitives';\n\nexport interface TextEditorProps extends TextEditorVariantProps {\n value?: string;\n defaultValue?: string;\n onChange?: (html: string) => void;\n placeholder?: string;\n readOnly?: boolean;\n showToolbar?: boolean;\n className?: string;\n toolbarClassName?: string;\n editorClassName?: string;\n // Character count\n maxLength?: number;\n showCharacterCount?: boolean;\n onCharacterCount?: (stats: { characters: number; words: number }) => void;\n // Feature flags\n enableLink?: boolean;\n enableBubbleMenu?: boolean;\n enableTaskList?: boolean;\n enableHighlight?: boolean;\n enableColor?: boolean;\n}\n\nfunction TextEditor({\n value,\n defaultValue,\n onChange,\n placeholder = 'Start writing...',\n readOnly = false,\n showToolbar = true,\n variant,\n size,\n className,\n toolbarClassName,\n editorClassName,\n maxLength,\n showCharacterCount,\n onCharacterCount,\n enableLink,\n enableBubbleMenu,\n enableTaskList,\n enableHighlight,\n enableColor,\n}: TextEditorProps) {\n const needsCharCount = maxLength !== undefined || showCharacterCount || onCharacterCount !== undefined;\n const needsTextStyle = enableColor || enableHighlight;\n\n const extensions = useMemo(() => {\n const base: AnyExtension[] = [\n StarterKit,\n Underline,\n Placeholder.configure({ placeholder }),\n TextAlign.configure({ types: ['heading', 'paragraph'] }),\n ListKeymap,\n ];\n\n if (needsTextStyle) base.push(TextStyle);\n if (enableLink) {\n base.push(Link.configure({ openOnClick: false, linkOnPaste: true, defaultProtocol: 'https' }));\n }\n if (enableTaskList) {\n base.push(TaskList, TaskItem.configure({ nested: true }));\n }\n if (enableHighlight) {\n base.push(Highlight.configure({ multicolor: true }));\n }\n if (enableColor) {\n base.push(Color);\n }\n if (needsCharCount) {\n base.push(CharacterCount.configure({ limit: maxLength }));\n }\n\n return base;\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [needsCharCount, placeholder, maxLength, enableHighlight, needsTextStyle, enableTaskList, enableLink, enableColor]);\n\n const editor = useEditor({\n extensions,\n content: value ?? defaultValue,\n editable: !readOnly,\n onUpdate: ({ editor: e }) => {\n onChange?.(e.getHTML());\n if (onCharacterCount) {\n const storage = e.storage.characterCount;\n onCharacterCount({ characters: storage.characters(), words: storage.words() });\n }\n },\n });\n\n useEffect(() => {\n if (!editor || value === undefined) return;\n if (editor.getHTML() === value) return;\n editor.commands.setContent(value);\n }, [editor, value]);\n\n useEffect(() => {\n if (!editor) return;\n editor.setEditable(!readOnly);\n }, [editor, readOnly]);\n\n const charCount = useEditorState({\n editor,\n selector: ctx => {\n const storage = ctx.editor?.storage?.characterCount;\n return storage ? (storage.characters() as number) : 0;\n },\n });\n\n const wordCount = useEditorState({\n editor,\n selector: ctx => {\n const storage = ctx.editor?.storage?.characterCount;\n return storage ? (storage.words() as number) : 0;\n },\n });\n\n const showCharCount = showCharacterCount || maxLength !== undefined;\n const isNearLimit = maxLength !== undefined && charCount > maxLength * 0.9;\n\n return (\n <div data-slot=\"text-editor\" className={cn('lunas-text-editor', textEditorVariants({ variant, size }), className)}>\n {showToolbar && !readOnly && editor && (\n <TextEditorToolbar\n editor={editor}\n className={toolbarClassName}\n enableLink={enableLink}\n enableTaskList={enableTaskList}\n enableHighlight={enableHighlight}\n enableColor={enableColor}\n />\n )}\n\n {enableBubbleMenu && !readOnly && editor && (\n <BubbleMenu\n editor={editor}\n options={{ placement: 'top' }}\n className={cn('flex items-center gap-0.5 rounded-md border border-border bg-popover p-1 shadow-dropdown')}\n >\n <ToolbarButton onClick={() => editor.chain().focus().toggleBold().run()} isActive={editor.isActive('bold')} title=\"Bold (Ctrl+B)\">\n <Bold className=\"h-3.5 w-3.5\" />\n </ToolbarButton>\n <ToolbarButton onClick={() => editor.chain().focus().toggleItalic().run()} isActive={editor.isActive('italic')} title=\"Italic (Ctrl+I)\">\n <Italic className=\"h-3.5 w-3.5\" />\n </ToolbarButton>\n <ToolbarButton onClick={() => editor.chain().focus().toggleUnderline().run()} isActive={editor.isActive('underline')} title=\"Underline (Ctrl+U)\">\n <UnderlineIcon className=\"h-3.5 w-3.5\" />\n </ToolbarButton>\n <ToolbarButton onClick={() => editor.chain().focus().toggleStrike().run()} isActive={editor.isActive('strike')} title=\"Strikethrough\">\n <Strikethrough className=\"h-3.5 w-3.5\" />\n </ToolbarButton>\n {enableLink && (\n <>\n <ToolbarDivider />\n <LinkDialog editor={editor} />\n </>\n )}\n </BubbleMenu>\n )}\n\n <EditorContent editor={editor} data-slot=\"text-editor-content\" className={cn('flex-1 bg-white text-sm text-text-positive', editorClassName)} />\n\n {showCharCount && needsCharCount && (\n <div\n data-slot=\"text-editor-footer\"\n className=\"flex items-center justify-between border-border border-t bg-muted-muted/30 px-3 py-1 text-text-positive-weak text-xs\"\n >\n <span>{wordCount} words</span>\n <span data-warning={isNearLimit || undefined} className=\"data-warning:text-warning-strong\">\n {charCount}\n {maxLength ? ` / ${maxLength}` : ''} characters\n </span>\n </div>\n )}\n </div>\n );\n}\n\nexport { TextEditor };\n"],"mappings":"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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
const e=require(`./chunk-Bmb41Sf3.cjs`),t=require(`./dropdown-menu-Bz7oMQ36.cjs`),n=require(`./popover-fsTCOb6a.cjs`);let r=require(`lucide-react`),i=require(`react`),a=require(`@customafk/react-toolkit/utils`),o=require(`class-variance-authority`),s=require(`react/jsx-runtime`),c=require(`@tiptap/react`),l=require(`@tiptap/extension-character-count`),u=require(`@tiptap/extension-highlight`),d=require(`@tiptap/extension-link`),f=require(`@tiptap/extension-list-keymap`),p=require(`@tiptap/extension-placeholder`);p=e.t(p);let m=require(`@tiptap/extension-task-item`),h=require(`@tiptap/extension-task-list`),g=require(`@tiptap/extension-text-align`);g=e.t(g);let _=require(`@tiptap/extension-text-style`),v=require(`@tiptap/extension-underline`);v=e.t(v);let y=require(`@tiptap/react/menus`),b=require(`@tiptap/starter-kit`);b=e.t(b);function x({isActive:e,className:t,children:n,...r}){return(0,s.jsx)(`button`,{type:`button`,"data-slot":`toolbar-button`,"data-active":e||void 0,className:(0,a.cn)(`inline-flex h-7 w-7 items-center justify-center rounded text-sm transition-colors`,`hover:bg-muted-muted hover:text-text-positive-strong`,`disabled:pointer-events-none disabled:opacity-40`,e&&`bg-primary-muted text-primary hover:bg-primary-muted/80 hover:text-primary`,t),...r,children:n})}function S(){return(0,s.jsx)(`div`,{"data-slot":`toolbar-divider`,className:`mx-0.5 h-5 w-px shrink-0 bg-border`})}function C({editor:e}){let[t,o]=(0,i.useState)(!1),[l,u]=(0,i.useState)(``),d=(0,c.useEditorState)({editor:e,selector:e=>e.editor.isActive(`link`)}),f=(0,i.useCallback)(t=>{t&&u(e.getAttributes(`link`).href??``),o(t)},[e]),p=(0,i.useCallback)(()=>{let t=l.trim();t&&(e.chain().focus().setLink({href:t,target:`_blank`}).run(),o(!1))},[e,l]),m=(0,i.useCallback)(()=>{e.chain().focus().unsetLink().run(),o(!1)},[e]),h=e=>{e.key===`Enter`&&(e.preventDefault(),p()),e.key===`Escape`&&o(!1)};return(0,s.jsxs)(n.t,{open:t,onOpenChange:f,children:[(0,s.jsx)(n.a,{asChild:!0,children:(0,s.jsx)(x,{isActive:d,title:`Link (Ctrl+K)`,"data-slot":`toolbar-link-button`,children:(0,s.jsx)(r.Link2,{className:`h-3.5 w-3.5`})})}),(0,s.jsxs)(n.i,{"data-slot":`link-dialog`,sideOffset:6,align:`start`,className:`w-72 p-3`,children:[(0,s.jsx)(`p`,{className:`mb-2 font-medium text-text-positive-strong text-xs`,children:d?`Edit Link`:`Insert Link`}),(0,s.jsxs)(`div`,{className:`flex gap-1.5`,children:[(0,s.jsx)(`input`,{type:`url`,placeholder:`https://example.com`,value:l,onChange:e=>u(e.target.value),onKeyDown:h,autoFocus:!0,className:(0,a.cn)(`flex-1 rounded border border-border bg-transparent px-2.5 py-1.5 text-sm text-text-positive`,`outline-none placeholder:text-text-positive-muted`,`focus:border-primary focus:ring-1 focus:ring-primary/30`)}),(0,s.jsx)(`button`,{type:`button`,onClick:p,disabled:!l.trim(),className:(0,a.cn)(`rounded bg-primary px-2.5 py-1.5 font-medium text-text-negative text-xs`,`transition-colors hover:bg-primary-strong`,`disabled:pointer-events-none disabled:opacity-50`),children:`Apply`})]}),d&&(0,s.jsxs)(`button`,{type:`button`,onClick:m,className:`mt-2 flex items-center gap-1 text-danger-strong text-xs hover:underline`,children:[(0,s.jsx)(r.Link2Off,{className:`h-3 w-3`}),`Remove link`]})]})]})}const w=(0,o.cva)([`flex flex-col overflow-hidden rounded-md`],{variants:{variant:{outline:`border border-border bg-background shadow-xs`,ghost:`border-0`},size:{sm:`text-xs [&_.ProseMirror]:min-h-24 [&_.ProseMirror]:px-2.5 [&_.ProseMirror]:py-1.5`,md:``,lg:`text-base [&_.ProseMirror]:min-h-56 [&_.ProseMirror]:px-4 [&_.ProseMirror]:py-3`}},defaultVariants:{variant:`outline`,size:`md`}}),T=[{label:`Yellow`,value:`#fde047`},{label:`Green`,value:`#86efac`},{label:`Blue`,value:`#93c5fd`},{label:`Pink`,value:`#f9a8d4`},{label:`Orange`,value:`#fdba74`},{label:`Purple`,value:`#c4b5fd`},{label:`Red`,value:`#fca5a5`},{label:`Cyan`,value:`#67e8f9`},{label:`Lime`,value:`#bef264`},{label:`Gray`,value:`#d1d5db`}],E=[{label:`Default`,value:``},{label:`Red`,value:`#ef4444`},{label:`Orange`,value:`#f97316`},{label:`Yellow`,value:`#eab308`},{label:`Green`,value:`#22c55e`},{label:`Blue`,value:`#3b82f6`},{label:`Purple`,value:`#a855f7`},{label:`Pink`,value:`#ec4899`},{label:`Gray`,value:`#6b7280`},{label:`Black`,value:`#000000`}];function D({editor:e,className:i,enableLink:o,enableTaskList:l,enableHighlight:u,enableColor:d}){let f=(0,c.useEditorState)({editor:e,selector:e=>e.editor.isActive(`heading`,{level:1})}),p=(0,c.useEditorState)({editor:e,selector:e=>e.editor.isActive(`heading`,{level:2})}),m=(0,c.useEditorState)({editor:e,selector:e=>e.editor.isActive(`heading`,{level:3})}),h=(0,c.useEditorState)({editor:e,selector:e=>e.editor.isActive(`bold`)}),g=(0,c.useEditorState)({editor:e,selector:e=>e.editor.isActive(`italic`)}),_=(0,c.useEditorState)({editor:e,selector:e=>e.editor.isActive(`underline`)}),v=(0,c.useEditorState)({editor:e,selector:e=>e.editor.isActive(`strike`)}),y=(0,c.useEditorState)({editor:e,selector:e=>e.editor.isActive(`code`)}),b=(0,c.useEditorState)({editor:e,selector:e=>e.editor.isActive(`bulletList`)}),w=(0,c.useEditorState)({editor:e,selector:e=>e.editor.isActive(`orderedList`)}),D=(0,c.useEditorState)({editor:e,selector:e=>e.editor.isActive(`taskList`)}),O=(0,c.useEditorState)({editor:e,selector:e=>e.editor.isActive(`blockquote`)}),k=(0,c.useEditorState)({editor:e,selector:e=>e.editor.isActive(`codeBlock`)}),A=(0,c.useEditorState)({editor:e,selector:e=>e.editor.isActive({textAlign:`left`})}),j=(0,c.useEditorState)({editor:e,selector:e=>e.editor.isActive({textAlign:`center`})}),M=(0,c.useEditorState)({editor:e,selector:e=>e.editor.isActive({textAlign:`right`})}),N=(0,c.useEditorState)({editor:e,selector:e=>e.editor.isActive({textAlign:`justify`})}),P=f?`H1`:p?`H2`:m?`H3`:`P`;return(0,s.jsxs)(`div`,{"data-slot":`text-editor-toolbar`,className:(0,a.cn)(`flex flex-wrap items-center gap-0.5 border-border border-b bg-muted-muted/50 p-1.5`,i),children:[(0,s.jsx)(x,{onClick:()=>e.chain().focus().undo().run(),disabled:!e.can().undo(),title:`Undo (Ctrl+Z)`,children:(0,s.jsx)(r.Undo,{className:`h-3.5 w-3.5`})}),(0,s.jsx)(x,{onClick:()=>e.chain().focus().redo().run(),disabled:!e.can().redo(),title:`Redo (Ctrl+Y)`,children:(0,s.jsx)(r.Redo,{className:`h-3.5 w-3.5`})}),(0,s.jsx)(S,{}),(0,s.jsxs)(t.t,{children:[(0,s.jsx)(t.h,{asChild:!0,children:(0,s.jsxs)(`button`,{type:`button`,"data-slot":`toolbar-heading-trigger`,className:(0,a.cn)(`inline-flex h-7 items-center gap-1 rounded px-1.5 font-medium text-xs transition-colors`,`hover:bg-muted-muted hover:text-text-positive-strong`,`disabled:pointer-events-none disabled:opacity-40`,(f||p||m)&&`bg-primary-muted text-primary hover:bg-primary-muted/80 hover:text-primary`),children:[(0,s.jsx)(`span`,{className:`w-5 text-center`,children:P}),(0,s.jsx)(r.ChevronDown,{className:`h-3 w-3 opacity-60`})]})}),(0,s.jsxs)(t.r,{align:`start`,className:`min-w-32`,children:[(0,s.jsx)(t.a,{onClick:()=>e.chain().focus().setParagraph().run(),children:(0,s.jsx)(`span`,{className:`text-sm`,children:`Paragraph`})}),(0,s.jsx)(t.a,{onClick:()=>e.chain().focus().toggleHeading({level:1}).run(),children:(0,s.jsx)(`span`,{className:`font-bold text-lg`,children:`Heading 1`})}),(0,s.jsx)(t.a,{onClick:()=>e.chain().focus().toggleHeading({level:2}).run(),children:(0,s.jsx)(`span`,{className:`font-semibold text-base`,children:`Heading 2`})}),(0,s.jsx)(t.a,{onClick:()=>e.chain().focus().toggleHeading({level:3}).run(),children:(0,s.jsx)(`span`,{className:`font-semibold text-sm`,children:`Heading 3`})})]})]}),(0,s.jsx)(S,{}),(0,s.jsx)(x,{onClick:()=>e.chain().focus().toggleBold().run(),isActive:h,title:`Bold (Ctrl+B)`,children:(0,s.jsx)(r.Bold,{className:`h-3.5 w-3.5`})}),(0,s.jsx)(x,{onClick:()=>e.chain().focus().toggleItalic().run(),isActive:g,title:`Italic (Ctrl+I)`,children:(0,s.jsx)(r.Italic,{className:`h-3.5 w-3.5`})}),(0,s.jsx)(x,{onClick:()=>e.chain().focus().toggleUnderline().run(),isActive:_,title:`Underline (Ctrl+U)`,children:(0,s.jsx)(r.Underline,{className:`h-3.5 w-3.5`})}),(0,s.jsx)(x,{onClick:()=>e.chain().focus().toggleStrike().run(),isActive:v,title:`Strikethrough`,children:(0,s.jsx)(r.Strikethrough,{className:`h-3.5 w-3.5`})}),(0,s.jsx)(x,{onClick:()=>e.chain().focus().toggleCode().run(),isActive:y,title:`Inline Code`,children:(0,s.jsx)(r.Code,{className:`h-3.5 w-3.5`})}),(0,s.jsx)(S,{}),(0,s.jsx)(x,{onClick:()=>e.chain().focus().toggleBulletList().run(),isActive:b,title:`Bullet List`,children:(0,s.jsx)(r.List,{className:`h-3.5 w-3.5`})}),(0,s.jsx)(x,{onClick:()=>e.chain().focus().toggleOrderedList().run(),isActive:w,title:`Ordered List`,children:(0,s.jsx)(r.ListOrdered,{className:`h-3.5 w-3.5`})}),l&&(0,s.jsx)(x,{onClick:()=>e.chain().focus().toggleTaskList().run(),isActive:D,title:`Task List`,children:(0,s.jsx)(r.ListChecks,{className:`h-3.5 w-3.5`})}),(0,s.jsx)(S,{}),(0,s.jsx)(x,{onClick:()=>e.chain().focus().toggleBlockquote().run(),isActive:O,title:`Blockquote`,children:(0,s.jsx)(r.Quote,{className:`h-3.5 w-3.5`})}),(0,s.jsx)(x,{onClick:()=>e.chain().focus().toggleCodeBlock().run(),isActive:k,title:`Code Block`,children:(0,s.jsx)(r.Code2,{className:`h-3.5 w-3.5`})}),(0,s.jsx)(x,{onClick:()=>e.chain().focus().setHorizontalRule().run(),title:`Horizontal Rule`,children:(0,s.jsx)(r.Minus,{className:`h-3.5 w-3.5`})}),(0,s.jsx)(S,{}),(0,s.jsx)(x,{onClick:()=>e.chain().focus().setTextAlign(`left`).run(),isActive:A,title:`Align Left`,children:(0,s.jsx)(r.AlignLeft,{className:`h-3.5 w-3.5`})}),(0,s.jsx)(x,{onClick:()=>e.chain().focus().setTextAlign(`center`).run(),isActive:j,title:`Align Center`,children:(0,s.jsx)(r.AlignCenter,{className:`h-3.5 w-3.5`})}),(0,s.jsx)(x,{onClick:()=>e.chain().focus().setTextAlign(`right`).run(),isActive:M,title:`Align Right`,children:(0,s.jsx)(r.AlignRight,{className:`h-3.5 w-3.5`})}),(0,s.jsx)(x,{onClick:()=>e.chain().focus().setTextAlign(`justify`).run(),isActive:N,title:`Align Justify`,children:(0,s.jsx)(r.AlignJustify,{className:`h-3.5 w-3.5`})}),o&&(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(S,{}),(0,s.jsx)(C,{editor:e})]}),(d||u)&&(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(S,{}),d&&(0,s.jsxs)(n.t,{children:[(0,s.jsx)(n.a,{asChild:!0,children:(0,s.jsx)(x,{title:`Text Color`,children:(0,s.jsx)(r.Palette,{className:`h-3.5 w-3.5`})})}),(0,s.jsxs)(n.i,{align:`start`,className:`w-44 p-2`,children:[(0,s.jsx)(`p`,{className:`mb-1.5 font-medium text-text-positive-weak text-xs`,children:`Text Color`}),(0,s.jsx)(`div`,{className:`grid grid-cols-5 gap-1`,children:E.map(t=>(0,s.jsx)(`button`,{type:`button`,title:t.label,onClick:()=>{t.value?e.chain().focus().setColor(t.value).run():e.chain().focus().unsetColor().run()},className:(0,a.cn)(`h-6 w-6 rounded border border-border transition-transform hover:scale-110`,!t.value&&`bg-background text-[10px] text-text-positive leading-none`),style:t.value?{backgroundColor:t.value}:void 0,children:!t.value&&`∅`},t.label))})]})]}),u&&(0,s.jsxs)(n.t,{children:[(0,s.jsx)(n.a,{asChild:!0,children:(0,s.jsx)(x,{title:`Highlight`,children:(0,s.jsx)(r.Highlighter,{className:`h-3.5 w-3.5`})})}),(0,s.jsxs)(n.i,{align:`start`,className:`w-44 p-2`,children:[(0,s.jsx)(`p`,{className:`mb-1.5 font-medium text-text-positive-weak text-xs`,children:`Highlight`}),(0,s.jsx)(`div`,{className:`grid grid-cols-5 gap-1`,children:T.map(t=>(0,s.jsx)(`button`,{type:`button`,title:t.label,onClick:()=>e.chain().focus().toggleHighlight({color:t.value}).run(),className:`h-6 w-6 rounded border border-border transition-transform hover:scale-110`,style:{backgroundColor:t.value}},t.label))}),(0,s.jsx)(`button`,{type:`button`,onClick:()=>e.chain().focus().unsetHighlight().run(),className:`mt-1.5 w-full rounded border border-border py-0.5 text-center text-text-positive-weak text-xs hover:bg-muted-muted`,children:`Clear highlight`})]})]})]})]})}function O({value:e,defaultValue:t,onChange:n,placeholder:o=`Start writing...`,readOnly:T=!1,showToolbar:E=!0,variant:O,size:k,className:A,toolbarClassName:j,editorClassName:M,maxLength:N,showCharacterCount:P,onCharacterCount:F,enableLink:I,enableBubbleMenu:L,enableTaskList:R,enableHighlight:z,enableColor:B}){let V=N!==void 0||P||F!==void 0,H=B||z,U=(0,c.useEditor)({extensions:(0,i.useMemo)(()=>{let e=[b.default,v.default,p.default.configure({placeholder:o}),g.default.configure({types:[`heading`,`paragraph`]}),f.ListKeymap];return H&&e.push(_.TextStyle),I&&e.push(d.Link.configure({openOnClick:!1,linkOnPaste:!0,defaultProtocol:`https`})),R&&e.push(h.TaskList,m.TaskItem.configure({nested:!0})),z&&e.push(u.Highlight.configure({multicolor:!0})),B&&e.push(_.Color),V&&e.push(l.CharacterCount.configure({limit:N})),e},[V,o,N,z,H,R,I,B]),content:e??t,editable:!T,onUpdate:({editor:e})=>{if(n?.(e.getHTML()),F){let t=e.storage.characterCount;F({characters:t.characters(),words:t.words()})}}});(0,i.useEffect)(()=>{!U||e===void 0||U.getHTML()!==e&&U.commands.setContent(e)},[U,e]),(0,i.useEffect)(()=>{U&&U.setEditable(!T)},[U,T]);let W=(0,c.useEditorState)({editor:U,selector:e=>{let t=e.editor?.storage?.characterCount;return t?t.characters():0}}),G=(0,c.useEditorState)({editor:U,selector:e=>{let t=e.editor?.storage?.characterCount;return t?t.words():0}}),K=P||N!==void 0,q=N!==void 0&&W>N*.9;return(0,s.jsxs)(`div`,{"data-slot":`text-editor`,className:(0,a.cn)(`lunas-text-editor`,w({variant:O,size:k}),A),children:[E&&!T&&U&&(0,s.jsx)(D,{editor:U,className:j,enableLink:I,enableTaskList:R,enableHighlight:z,enableColor:B}),L&&!T&&U&&(0,s.jsxs)(y.BubbleMenu,{editor:U,options:{placement:`top`},className:(0,a.cn)(`flex items-center gap-0.5 rounded-md border border-border bg-popover p-1 shadow-dropdown`),children:[(0,s.jsx)(x,{onClick:()=>U.chain().focus().toggleBold().run(),isActive:U.isActive(`bold`),title:`Bold (Ctrl+B)`,children:(0,s.jsx)(r.Bold,{className:`h-3.5 w-3.5`})}),(0,s.jsx)(x,{onClick:()=>U.chain().focus().toggleItalic().run(),isActive:U.isActive(`italic`),title:`Italic (Ctrl+I)`,children:(0,s.jsx)(r.Italic,{className:`h-3.5 w-3.5`})}),(0,s.jsx)(x,{onClick:()=>U.chain().focus().toggleUnderline().run(),isActive:U.isActive(`underline`),title:`Underline (Ctrl+U)`,children:(0,s.jsx)(r.Underline,{className:`h-3.5 w-3.5`})}),(0,s.jsx)(x,{onClick:()=>U.chain().focus().toggleStrike().run(),isActive:U.isActive(`strike`),title:`Strikethrough`,children:(0,s.jsx)(r.Strikethrough,{className:`h-3.5 w-3.5`})}),I&&(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(S,{}),(0,s.jsx)(C,{editor:U})]})]}),(0,s.jsx)(c.EditorContent,{editor:U,"data-slot":`text-editor-content`,className:(0,a.cn)(`flex-1 bg-white text-sm text-text-positive`,M)}),K&&V&&(0,s.jsxs)(`div`,{"data-slot":`text-editor-footer`,className:`flex items-center justify-between border-border border-t bg-muted-muted/30 px-3 py-1 text-text-positive-weak text-xs`,children:[(0,s.jsxs)(`span`,{children:[G,` words`]}),(0,s.jsxs)(`span`,{"data-warning":q||void 0,className:`data-warning:text-warning-strong`,children:[W,N?` / ${N}`:``,` characters`]})]})]})}Object.defineProperty(exports,`n`,{enumerable:!0,get:function(){return D}}),Object.defineProperty(exports,`r`,{enumerable:!0,get:function(){return C}}),Object.defineProperty(exports,`t`,{enumerable:!0,get:function(){return O}});
|
|
2
|
-
//# sourceMappingURL=text-editor-
|
|
1
|
+
const e=require(`./chunk-350yNsax.cjs`),t=require(`./dropdown-menu-CVh520yG.cjs`),n=require(`./popover-DBsC8Ltp.cjs`);let r=require(`lucide-react`),i=require(`react`),a=require(`@customafk/react-toolkit/utils`),o=require(`class-variance-authority`),s=require(`react/jsx-runtime`),c=require(`@tiptap/react`),l=require(`@tiptap/extension-character-count`),u=require(`@tiptap/extension-highlight`),d=require(`@tiptap/extension-link`),f=require(`@tiptap/extension-list-keymap`),p=require(`@tiptap/extension-placeholder`);p=e.n(p);let m=require(`@tiptap/extension-task-item`),h=require(`@tiptap/extension-task-list`),g=require(`@tiptap/extension-text-align`);g=e.n(g);let _=require(`@tiptap/extension-text-style`),v=require(`@tiptap/extension-underline`);v=e.n(v);let y=require(`@tiptap/react/menus`),b=require(`@tiptap/starter-kit`);b=e.n(b);function x({isActive:e,className:t,children:n,...r}){return(0,s.jsx)(`button`,{type:`button`,"data-slot":`toolbar-button`,"data-active":e||void 0,className:(0,a.cn)(`inline-flex h-7 w-7 items-center justify-center rounded text-sm transition-colors`,`hover:bg-muted-muted hover:text-text-positive-strong`,`disabled:pointer-events-none disabled:opacity-40`,e&&`bg-primary-muted text-primary hover:bg-primary-muted/80 hover:text-primary`,t),...r,children:n})}function S(){return(0,s.jsx)(`div`,{"data-slot":`toolbar-divider`,className:`mx-0.5 h-5 w-px shrink-0 bg-border`})}function C({editor:e}){let[t,o]=(0,i.useState)(!1),[l,u]=(0,i.useState)(``),d=(0,c.useEditorState)({editor:e,selector:e=>e.editor.isActive(`link`)}),f=(0,i.useCallback)(t=>{t&&u(e.getAttributes(`link`).href??``),o(t)},[e]),p=(0,i.useCallback)(()=>{let t=l.trim();t&&(e.chain().focus().setLink({href:t,target:`_blank`}).run(),o(!1))},[e,l]),m=(0,i.useCallback)(()=>{e.chain().focus().unsetLink().run(),o(!1)},[e]),h=e=>{e.key===`Enter`&&(e.preventDefault(),p()),e.key===`Escape`&&o(!1)};return(0,s.jsxs)(n.t,{open:t,onOpenChange:f,children:[(0,s.jsx)(n.a,{asChild:!0,children:(0,s.jsx)(x,{isActive:d,title:`Link (Ctrl+K)`,"data-slot":`toolbar-link-button`,children:(0,s.jsx)(r.Link2,{className:`h-3.5 w-3.5`})})}),(0,s.jsxs)(n.i,{"data-slot":`link-dialog`,sideOffset:6,align:`start`,className:`w-72 p-3`,children:[(0,s.jsx)(`p`,{className:`mb-2 font-medium text-text-positive-strong text-xs`,children:d?`Edit Link`:`Insert Link`}),(0,s.jsxs)(`div`,{className:`flex gap-1.5`,children:[(0,s.jsx)(`input`,{type:`url`,placeholder:`https://example.com`,value:l,onChange:e=>u(e.target.value),onKeyDown:h,autoFocus:!0,className:(0,a.cn)(`flex-1 rounded border border-border bg-transparent px-2.5 py-1.5 text-sm text-text-positive`,`outline-none placeholder:text-text-positive-muted`,`focus:border-primary focus:ring-1 focus:ring-primary/30`)}),(0,s.jsx)(`button`,{type:`button`,onClick:p,disabled:!l.trim(),className:(0,a.cn)(`rounded bg-primary px-2.5 py-1.5 font-medium text-text-negative text-xs`,`transition-colors hover:bg-primary-strong`,`disabled:pointer-events-none disabled:opacity-50`),children:`Apply`})]}),d&&(0,s.jsxs)(`button`,{type:`button`,onClick:m,className:`mt-2 flex items-center gap-1 text-danger-strong text-xs hover:underline`,children:[(0,s.jsx)(r.Link2Off,{className:`h-3 w-3`}),`Remove link`]})]})]})}const w=(0,o.cva)([`flex flex-col overflow-hidden rounded-md`],{variants:{variant:{outline:`border border-border bg-background shadow-xs`,ghost:`border-0`},size:{sm:`text-xs [&_.ProseMirror]:min-h-24 [&_.ProseMirror]:px-2.5 [&_.ProseMirror]:py-1.5`,md:``,lg:`text-base [&_.ProseMirror]:min-h-56 [&_.ProseMirror]:px-4 [&_.ProseMirror]:py-3`}},defaultVariants:{variant:`outline`,size:`md`}}),T=[{label:`Yellow`,value:`#fde047`},{label:`Green`,value:`#86efac`},{label:`Blue`,value:`#93c5fd`},{label:`Pink`,value:`#f9a8d4`},{label:`Orange`,value:`#fdba74`},{label:`Purple`,value:`#c4b5fd`},{label:`Red`,value:`#fca5a5`},{label:`Cyan`,value:`#67e8f9`},{label:`Lime`,value:`#bef264`},{label:`Gray`,value:`#d1d5db`}],E=[{label:`Default`,value:``},{label:`Red`,value:`#ef4444`},{label:`Orange`,value:`#f97316`},{label:`Yellow`,value:`#eab308`},{label:`Green`,value:`#22c55e`},{label:`Blue`,value:`#3b82f6`},{label:`Purple`,value:`#a855f7`},{label:`Pink`,value:`#ec4899`},{label:`Gray`,value:`#6b7280`},{label:`Black`,value:`#000000`}];function D({editor:e,className:i,enableLink:o,enableTaskList:l,enableHighlight:u,enableColor:d}){let f=(0,c.useEditorState)({editor:e,selector:e=>e.editor.isActive(`heading`,{level:1})}),p=(0,c.useEditorState)({editor:e,selector:e=>e.editor.isActive(`heading`,{level:2})}),m=(0,c.useEditorState)({editor:e,selector:e=>e.editor.isActive(`heading`,{level:3})}),h=(0,c.useEditorState)({editor:e,selector:e=>e.editor.isActive(`bold`)}),g=(0,c.useEditorState)({editor:e,selector:e=>e.editor.isActive(`italic`)}),_=(0,c.useEditorState)({editor:e,selector:e=>e.editor.isActive(`underline`)}),v=(0,c.useEditorState)({editor:e,selector:e=>e.editor.isActive(`strike`)}),y=(0,c.useEditorState)({editor:e,selector:e=>e.editor.isActive(`code`)}),b=(0,c.useEditorState)({editor:e,selector:e=>e.editor.isActive(`bulletList`)}),w=(0,c.useEditorState)({editor:e,selector:e=>e.editor.isActive(`orderedList`)}),D=(0,c.useEditorState)({editor:e,selector:e=>e.editor.isActive(`taskList`)}),O=(0,c.useEditorState)({editor:e,selector:e=>e.editor.isActive(`blockquote`)}),k=(0,c.useEditorState)({editor:e,selector:e=>e.editor.isActive(`codeBlock`)}),A=(0,c.useEditorState)({editor:e,selector:e=>e.editor.isActive({textAlign:`left`})}),j=(0,c.useEditorState)({editor:e,selector:e=>e.editor.isActive({textAlign:`center`})}),M=(0,c.useEditorState)({editor:e,selector:e=>e.editor.isActive({textAlign:`right`})}),N=(0,c.useEditorState)({editor:e,selector:e=>e.editor.isActive({textAlign:`justify`})}),P=f?`H1`:p?`H2`:m?`H3`:`P`;return(0,s.jsxs)(`div`,{"data-slot":`text-editor-toolbar`,className:(0,a.cn)(`flex flex-wrap items-center gap-0.5 border-border border-b bg-muted-muted/50 p-1.5`,i),children:[(0,s.jsx)(x,{onClick:()=>e.chain().focus().undo().run(),disabled:!e.can().undo(),title:`Undo (Ctrl+Z)`,children:(0,s.jsx)(r.Undo,{className:`h-3.5 w-3.5`})}),(0,s.jsx)(x,{onClick:()=>e.chain().focus().redo().run(),disabled:!e.can().redo(),title:`Redo (Ctrl+Y)`,children:(0,s.jsx)(r.Redo,{className:`h-3.5 w-3.5`})}),(0,s.jsx)(S,{}),(0,s.jsxs)(t.t,{children:[(0,s.jsx)(t.h,{asChild:!0,children:(0,s.jsxs)(`button`,{type:`button`,"data-slot":`toolbar-heading-trigger`,className:(0,a.cn)(`inline-flex h-7 items-center gap-1 rounded px-1.5 font-medium text-xs transition-colors`,`hover:bg-muted-muted hover:text-text-positive-strong`,`disabled:pointer-events-none disabled:opacity-40`,(f||p||m)&&`bg-primary-muted text-primary hover:bg-primary-muted/80 hover:text-primary`),children:[(0,s.jsx)(`span`,{className:`w-5 text-center`,children:P}),(0,s.jsx)(r.ChevronDown,{className:`h-3 w-3 opacity-60`})]})}),(0,s.jsxs)(t.r,{align:`start`,className:`min-w-32`,children:[(0,s.jsx)(t.a,{onClick:()=>e.chain().focus().setParagraph().run(),children:(0,s.jsx)(`span`,{className:`text-sm`,children:`Paragraph`})}),(0,s.jsx)(t.a,{onClick:()=>e.chain().focus().toggleHeading({level:1}).run(),children:(0,s.jsx)(`span`,{className:`font-bold text-lg`,children:`Heading 1`})}),(0,s.jsx)(t.a,{onClick:()=>e.chain().focus().toggleHeading({level:2}).run(),children:(0,s.jsx)(`span`,{className:`font-semibold text-base`,children:`Heading 2`})}),(0,s.jsx)(t.a,{onClick:()=>e.chain().focus().toggleHeading({level:3}).run(),children:(0,s.jsx)(`span`,{className:`font-semibold text-sm`,children:`Heading 3`})})]})]}),(0,s.jsx)(S,{}),(0,s.jsx)(x,{onClick:()=>e.chain().focus().toggleBold().run(),isActive:h,title:`Bold (Ctrl+B)`,children:(0,s.jsx)(r.Bold,{className:`h-3.5 w-3.5`})}),(0,s.jsx)(x,{onClick:()=>e.chain().focus().toggleItalic().run(),isActive:g,title:`Italic (Ctrl+I)`,children:(0,s.jsx)(r.Italic,{className:`h-3.5 w-3.5`})}),(0,s.jsx)(x,{onClick:()=>e.chain().focus().toggleUnderline().run(),isActive:_,title:`Underline (Ctrl+U)`,children:(0,s.jsx)(r.Underline,{className:`h-3.5 w-3.5`})}),(0,s.jsx)(x,{onClick:()=>e.chain().focus().toggleStrike().run(),isActive:v,title:`Strikethrough`,children:(0,s.jsx)(r.Strikethrough,{className:`h-3.5 w-3.5`})}),(0,s.jsx)(x,{onClick:()=>e.chain().focus().toggleCode().run(),isActive:y,title:`Inline Code`,children:(0,s.jsx)(r.Code,{className:`h-3.5 w-3.5`})}),(0,s.jsx)(S,{}),(0,s.jsx)(x,{onClick:()=>e.chain().focus().toggleBulletList().run(),isActive:b,title:`Bullet List`,children:(0,s.jsx)(r.List,{className:`h-3.5 w-3.5`})}),(0,s.jsx)(x,{onClick:()=>e.chain().focus().toggleOrderedList().run(),isActive:w,title:`Ordered List`,children:(0,s.jsx)(r.ListOrdered,{className:`h-3.5 w-3.5`})}),l&&(0,s.jsx)(x,{onClick:()=>e.chain().focus().toggleTaskList().run(),isActive:D,title:`Task List`,children:(0,s.jsx)(r.ListChecks,{className:`h-3.5 w-3.5`})}),(0,s.jsx)(S,{}),(0,s.jsx)(x,{onClick:()=>e.chain().focus().toggleBlockquote().run(),isActive:O,title:`Blockquote`,children:(0,s.jsx)(r.Quote,{className:`h-3.5 w-3.5`})}),(0,s.jsx)(x,{onClick:()=>e.chain().focus().toggleCodeBlock().run(),isActive:k,title:`Code Block`,children:(0,s.jsx)(r.Code2,{className:`h-3.5 w-3.5`})}),(0,s.jsx)(x,{onClick:()=>e.chain().focus().setHorizontalRule().run(),title:`Horizontal Rule`,children:(0,s.jsx)(r.Minus,{className:`h-3.5 w-3.5`})}),(0,s.jsx)(S,{}),(0,s.jsx)(x,{onClick:()=>e.chain().focus().setTextAlign(`left`).run(),isActive:A,title:`Align Left`,children:(0,s.jsx)(r.AlignLeft,{className:`h-3.5 w-3.5`})}),(0,s.jsx)(x,{onClick:()=>e.chain().focus().setTextAlign(`center`).run(),isActive:j,title:`Align Center`,children:(0,s.jsx)(r.AlignCenter,{className:`h-3.5 w-3.5`})}),(0,s.jsx)(x,{onClick:()=>e.chain().focus().setTextAlign(`right`).run(),isActive:M,title:`Align Right`,children:(0,s.jsx)(r.AlignRight,{className:`h-3.5 w-3.5`})}),(0,s.jsx)(x,{onClick:()=>e.chain().focus().setTextAlign(`justify`).run(),isActive:N,title:`Align Justify`,children:(0,s.jsx)(r.AlignJustify,{className:`h-3.5 w-3.5`})}),o&&(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(S,{}),(0,s.jsx)(C,{editor:e})]}),(d||u)&&(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(S,{}),d&&(0,s.jsxs)(n.t,{children:[(0,s.jsx)(n.a,{asChild:!0,children:(0,s.jsx)(x,{title:`Text Color`,children:(0,s.jsx)(r.Palette,{className:`h-3.5 w-3.5`})})}),(0,s.jsxs)(n.i,{align:`start`,className:`w-44 p-2`,children:[(0,s.jsx)(`p`,{className:`mb-1.5 font-medium text-text-positive-weak text-xs`,children:`Text Color`}),(0,s.jsx)(`div`,{className:`grid grid-cols-5 gap-1`,children:E.map(t=>(0,s.jsx)(`button`,{type:`button`,title:t.label,onClick:()=>{t.value?e.chain().focus().setColor(t.value).run():e.chain().focus().unsetColor().run()},className:(0,a.cn)(`h-6 w-6 rounded border border-border transition-transform hover:scale-110`,!t.value&&`bg-background text-[10px] text-text-positive leading-none`),style:t.value?{backgroundColor:t.value}:void 0,children:!t.value&&`∅`},t.label))})]})]}),u&&(0,s.jsxs)(n.t,{children:[(0,s.jsx)(n.a,{asChild:!0,children:(0,s.jsx)(x,{title:`Highlight`,children:(0,s.jsx)(r.Highlighter,{className:`h-3.5 w-3.5`})})}),(0,s.jsxs)(n.i,{align:`start`,className:`w-44 p-2`,children:[(0,s.jsx)(`p`,{className:`mb-1.5 font-medium text-text-positive-weak text-xs`,children:`Highlight`}),(0,s.jsx)(`div`,{className:`grid grid-cols-5 gap-1`,children:T.map(t=>(0,s.jsx)(`button`,{type:`button`,title:t.label,onClick:()=>e.chain().focus().toggleHighlight({color:t.value}).run(),className:`h-6 w-6 rounded border border-border transition-transform hover:scale-110`,style:{backgroundColor:t.value}},t.label))}),(0,s.jsx)(`button`,{type:`button`,onClick:()=>e.chain().focus().unsetHighlight().run(),className:`mt-1.5 w-full rounded border border-border py-0.5 text-center text-text-positive-weak text-xs hover:bg-muted-muted`,children:`Clear highlight`})]})]})]})]})}function O({value:e,defaultValue:t,onChange:n,placeholder:o=`Start writing...`,readOnly:T=!1,showToolbar:E=!0,variant:O,size:k,className:A,toolbarClassName:j,editorClassName:M,maxLength:N,showCharacterCount:P,onCharacterCount:F,enableLink:I,enableBubbleMenu:L,enableTaskList:R,enableHighlight:z,enableColor:B}){let V=N!==void 0||P||F!==void 0,H=B||z,U=(0,c.useEditor)({extensions:(0,i.useMemo)(()=>{let e=[b.default,v.default,p.default.configure({placeholder:o}),g.default.configure({types:[`heading`,`paragraph`]}),f.ListKeymap];return H&&e.push(_.TextStyle),I&&e.push(d.Link.configure({openOnClick:!1,linkOnPaste:!0,defaultProtocol:`https`})),R&&e.push(h.TaskList,m.TaskItem.configure({nested:!0})),z&&e.push(u.Highlight.configure({multicolor:!0})),B&&e.push(_.Color),V&&e.push(l.CharacterCount.configure({limit:N})),e},[V,o,N,z,H,R,I,B]),content:e??t,editable:!T,onUpdate:({editor:e})=>{if(n?.(e.getHTML()),F){let t=e.storage.characterCount;F({characters:t.characters(),words:t.words()})}}});(0,i.useEffect)(()=>{!U||e===void 0||U.getHTML()!==e&&U.commands.setContent(e)},[U,e]),(0,i.useEffect)(()=>{U&&U.setEditable(!T)},[U,T]);let W=(0,c.useEditorState)({editor:U,selector:e=>{let t=e.editor?.storage?.characterCount;return t?t.characters():0}}),G=(0,c.useEditorState)({editor:U,selector:e=>{let t=e.editor?.storage?.characterCount;return t?t.words():0}}),K=P||N!==void 0,q=N!==void 0&&W>N*.9;return(0,s.jsxs)(`div`,{"data-slot":`text-editor`,className:(0,a.cn)(`lunas-text-editor`,w({variant:O,size:k}),A),children:[E&&!T&&U&&(0,s.jsx)(D,{editor:U,className:j,enableLink:I,enableTaskList:R,enableHighlight:z,enableColor:B}),L&&!T&&U&&(0,s.jsxs)(y.BubbleMenu,{editor:U,options:{placement:`top`},className:(0,a.cn)(`flex items-center gap-0.5 rounded-md border border-border bg-popover p-1 shadow-dropdown`),children:[(0,s.jsx)(x,{onClick:()=>U.chain().focus().toggleBold().run(),isActive:U.isActive(`bold`),title:`Bold (Ctrl+B)`,children:(0,s.jsx)(r.Bold,{className:`h-3.5 w-3.5`})}),(0,s.jsx)(x,{onClick:()=>U.chain().focus().toggleItalic().run(),isActive:U.isActive(`italic`),title:`Italic (Ctrl+I)`,children:(0,s.jsx)(r.Italic,{className:`h-3.5 w-3.5`})}),(0,s.jsx)(x,{onClick:()=>U.chain().focus().toggleUnderline().run(),isActive:U.isActive(`underline`),title:`Underline (Ctrl+U)`,children:(0,s.jsx)(r.Underline,{className:`h-3.5 w-3.5`})}),(0,s.jsx)(x,{onClick:()=>U.chain().focus().toggleStrike().run(),isActive:U.isActive(`strike`),title:`Strikethrough`,children:(0,s.jsx)(r.Strikethrough,{className:`h-3.5 w-3.5`})}),I&&(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(S,{}),(0,s.jsx)(C,{editor:U})]})]}),(0,s.jsx)(c.EditorContent,{editor:U,"data-slot":`text-editor-content`,className:(0,a.cn)(`flex-1 bg-white text-sm text-text-positive`,M)}),K&&V&&(0,s.jsxs)(`div`,{"data-slot":`text-editor-footer`,className:`flex items-center justify-between border-border border-t bg-muted-muted/30 px-3 py-1 text-text-positive-weak text-xs`,children:[(0,s.jsxs)(`span`,{children:[G,` words`]}),(0,s.jsxs)(`span`,{"data-warning":q||void 0,className:`data-warning:text-warning-strong`,children:[W,N?` / ${N}`:``,` characters`]})]})]})}Object.defineProperty(exports,`n`,{enumerable:!0,get:function(){return D}}),Object.defineProperty(exports,`r`,{enumerable:!0,get:function(){return C}}),Object.defineProperty(exports,`t`,{enumerable:!0,get:function(){return O}});
|
|
2
|
+
//# sourceMappingURL=text-editor-CvJN3nSL.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"text-editor-DtLcsiR7.cjs","names":["Popover","PopoverTrigger","Link2","PopoverContent","Link2Off","Undo","Redo","DropdownMenu","DropdownMenuTrigger","ChevronDown","DropdownMenuContent","DropdownMenuItem","Bold","Italic","Underline","Strikethrough","Code","List","ListOrdered","ListChecks","Quote","Code2","Minus","AlignLeft","AlignCenter","AlignRight","AlignJustify","Popover","PopoverTrigger","Palette","PopoverContent","Highlighter","base: AnyExtension[]","StarterKit","Underline","Placeholder","TextAlign","ListKeymap","TextStyle","Link","TaskList","TaskItem","Highlight","Color","CharacterCount","BubbleMenu","Bold","Italic","UnderlineIcon","Strikethrough","EditorContent"],"sources":["../packages/components/features/text-editor/toolbar-primitives.tsx","../packages/components/features/text-editor/link-dialog.tsx","../packages/components/features/text-editor/text-editor.variants.ts","../packages/components/features/text-editor/toolbar.tsx","../packages/components/features/text-editor/text-editor.tsx"],"sourcesContent":["'use client';\n\nimport { cn } from '@customafk/react-toolkit/utils';\n\ninterface ToolbarButtonProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {\n isActive?: boolean;\n}\n\nfunction ToolbarButton({ isActive, className, children, ...props }: ToolbarButtonProps) {\n return (\n <button\n type=\"button\"\n data-slot=\"toolbar-button\"\n data-active={isActive || undefined}\n className={cn(\n 'inline-flex h-7 w-7 items-center justify-center rounded text-sm transition-colors',\n 'hover:bg-muted-muted hover:text-text-positive-strong',\n 'disabled:pointer-events-none disabled:opacity-40',\n isActive && 'bg-primary-muted text-primary hover:bg-primary-muted/80 hover:text-primary',\n className\n )}\n {...props}\n >\n {children}\n </button>\n );\n}\n\nfunction ToolbarDivider() {\n return <div data-slot=\"toolbar-divider\" className=\"mx-0.5 h-5 w-px shrink-0 bg-border\" />;\n}\n\nexport { ToolbarButton, ToolbarDivider };\n// biome-ignore lint/style/useComponentExportOnlyModules: type export needed by sibling feature files\nexport type { ToolbarButtonProps };\n","'use client';\n\nimport { useCallback, useState } from 'react';\n\nimport { Link2, Link2Off } from 'lucide-react';\n\nimport { cn } from '@customafk/react-toolkit/utils';\n\nimport { Popover, PopoverContent, PopoverTrigger } from '@/components/ui/popover';\n\nimport { type Editor, useEditorState } from '@tiptap/react';\nimport { ToolbarButton } from './toolbar-primitives';\n\nexport interface LinkDialogProps {\n editor: Editor;\n}\n\nfunction LinkDialog({ editor }: LinkDialogProps) {\n const [isOpen, setIsOpen] = useState(false);\n const [url, setUrl] = useState('');\n\n const isLinkActive = useEditorState({\n editor,\n selector: ctx => ctx.editor.isActive('link'),\n });\n\n const handleOpenChange = useCallback(\n (open: boolean) => {\n if (open) {\n const existingHref = editor.getAttributes('link').href ?? '';\n setUrl(existingHref);\n }\n setIsOpen(open);\n },\n [editor]\n );\n\n const handleApply = useCallback(() => {\n const trimmed = url.trim();\n if (!trimmed) return;\n editor.chain().focus().setLink({ href: trimmed, target: '_blank' }).run();\n setIsOpen(false);\n }, [editor, url]);\n\n const handleRemove = useCallback(() => {\n editor.chain().focus().unsetLink().run();\n setIsOpen(false);\n }, [editor]);\n\n const handleKeyDown = (e: React.KeyboardEvent<HTMLInputElement>) => {\n if (e.key === 'Enter') {\n e.preventDefault();\n handleApply();\n }\n if (e.key === 'Escape') {\n setIsOpen(false);\n }\n };\n\n return (\n <Popover open={isOpen} onOpenChange={handleOpenChange}>\n <PopoverTrigger asChild>\n <ToolbarButton isActive={isLinkActive} title=\"Link (Ctrl+K)\" data-slot=\"toolbar-link-button\">\n <Link2 className=\"h-3.5 w-3.5\" />\n </ToolbarButton>\n </PopoverTrigger>\n <PopoverContent data-slot=\"link-dialog\" sideOffset={6} align=\"start\" className=\"w-72 p-3\">\n <p className=\"mb-2 font-medium text-text-positive-strong text-xs\">{isLinkActive ? 'Edit Link' : 'Insert Link'}</p>\n <div className=\"flex gap-1.5\">\n <input\n type=\"url\"\n placeholder=\"https://example.com\"\n value={url}\n onChange={e => setUrl(e.target.value)}\n onKeyDown={handleKeyDown}\n autoFocus\n className={cn(\n 'flex-1 rounded border border-border bg-transparent px-2.5 py-1.5 text-sm text-text-positive',\n 'outline-none placeholder:text-text-positive-muted',\n 'focus:border-primary focus:ring-1 focus:ring-primary/30'\n )}\n />\n <button\n type=\"button\"\n onClick={handleApply}\n disabled={!url.trim()}\n className={cn(\n 'rounded bg-primary px-2.5 py-1.5 font-medium text-text-negative text-xs',\n 'transition-colors hover:bg-primary-strong',\n 'disabled:pointer-events-none disabled:opacity-50'\n )}\n >\n Apply\n </button>\n </div>\n {isLinkActive && (\n <button type=\"button\" onClick={handleRemove} className=\"mt-2 flex items-center gap-1 text-danger-strong text-xs hover:underline\">\n <Link2Off className=\"h-3 w-3\" />\n Remove link\n </button>\n )}\n </PopoverContent>\n </Popover>\n );\n}\n\nexport { LinkDialog };\n","import { cva, type VariantProps } from 'class-variance-authority';\n\nexport const textEditorVariants = cva(['flex flex-col overflow-hidden rounded-md'], {\n variants: {\n variant: {\n outline: 'border border-border bg-background shadow-xs',\n ghost: 'border-0',\n },\n size: {\n sm: 'text-xs [&_.ProseMirror]:min-h-24 [&_.ProseMirror]:px-2.5 [&_.ProseMirror]:py-1.5',\n md: '',\n lg: 'text-base [&_.ProseMirror]:min-h-56 [&_.ProseMirror]:px-4 [&_.ProseMirror]:py-3',\n },\n },\n defaultVariants: {\n variant: 'outline',\n size: 'md',\n },\n});\n\nexport type TextEditorVariantProps = VariantProps<typeof textEditorVariants>;\n","'use client';\n\nimport {\n AlignCenter,\n AlignJustify,\n AlignLeft,\n AlignRight,\n Bold,\n ChevronDown,\n Code,\n Code2,\n Highlighter,\n Italic,\n List,\n ListChecks,\n ListOrdered,\n Minus,\n Palette,\n Quote,\n Redo,\n Strikethrough,\n Underline,\n Undo,\n} from 'lucide-react';\n\nimport { cn } from '@customafk/react-toolkit/utils';\n\nimport { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuTrigger } from '@/components/ui/dropdown-menu';\nimport { Popover, PopoverContent, PopoverTrigger } from '@/components/ui/popover';\n\nimport { type Editor, useEditorState } from '@tiptap/react';\nimport { LinkDialog } from './link-dialog';\nimport { ToolbarButton, ToolbarDivider } from './toolbar-primitives';\n\nconst HIGHLIGHT_COLORS = [\n { label: 'Yellow', value: '#fde047' },\n { label: 'Green', value: '#86efac' },\n { label: 'Blue', value: '#93c5fd' },\n { label: 'Pink', value: '#f9a8d4' },\n { label: 'Orange', value: '#fdba74' },\n { label: 'Purple', value: '#c4b5fd' },\n { label: 'Red', value: '#fca5a5' },\n { label: 'Cyan', value: '#67e8f9' },\n { label: 'Lime', value: '#bef264' },\n { label: 'Gray', value: '#d1d5db' },\n];\n\nconst TEXT_COLORS = [\n { label: 'Default', value: '' },\n { label: 'Red', value: '#ef4444' },\n { label: 'Orange', value: '#f97316' },\n { label: 'Yellow', value: '#eab308' },\n { label: 'Green', value: '#22c55e' },\n { label: 'Blue', value: '#3b82f6' },\n { label: 'Purple', value: '#a855f7' },\n { label: 'Pink', value: '#ec4899' },\n { label: 'Gray', value: '#6b7280' },\n { label: 'Black', value: '#000000' },\n];\n\nexport interface TextEditorToolbarProps {\n editor: Editor;\n className?: string;\n enableLink?: boolean;\n enableTaskList?: boolean;\n enableHighlight?: boolean;\n enableColor?: boolean;\n}\n\nfunction TextEditorToolbar({ editor, className, enableLink, enableTaskList, enableHighlight, enableColor }: TextEditorToolbarProps) {\n const isHeading1Active = useEditorState({\n editor,\n selector: ctx => ctx.editor.isActive('heading', { level: 1 }),\n });\n const isHeading2Active = useEditorState({\n editor,\n selector: ctx => ctx.editor.isActive('heading', { level: 2 }),\n });\n const isHeading3Active = useEditorState({\n editor,\n selector: ctx => ctx.editor.isActive('heading', { level: 3 }),\n });\n const isBoldActive = useEditorState({\n editor,\n selector: ctx => ctx.editor.isActive('bold'),\n });\n const isItalicActive = useEditorState({\n editor,\n selector: ctx => ctx.editor.isActive('italic'),\n });\n const isUnderlineActive = useEditorState({\n editor,\n selector: ctx => ctx.editor.isActive('underline'),\n });\n const isStrikeActive = useEditorState({\n editor,\n selector: ctx => ctx.editor.isActive('strike'),\n });\n const isCodeActive = useEditorState({\n editor,\n selector: ctx => ctx.editor.isActive('code'),\n });\n const isBulletListActive = useEditorState({\n editor,\n selector: ctx => ctx.editor.isActive('bulletList'),\n });\n const isOrderedListActive = useEditorState({\n editor,\n selector: ctx => ctx.editor.isActive('orderedList'),\n });\n const isTaskListActive = useEditorState({\n editor,\n selector: ctx => ctx.editor.isActive('taskList'),\n });\n const isBlockquoteActive = useEditorState({\n editor,\n selector: ctx => ctx.editor.isActive('blockquote'),\n });\n const isCodeBlockActive = useEditorState({\n editor,\n selector: ctx => ctx.editor.isActive('codeBlock'),\n });\n const isAlignLeftActive = useEditorState({\n editor,\n selector: ctx => ctx.editor.isActive({ textAlign: 'left' }),\n });\n const isAlignCenterActive = useEditorState({\n editor,\n selector: ctx => ctx.editor.isActive({ textAlign: 'center' }),\n });\n const isAlignRightActive = useEditorState({\n editor,\n selector: ctx => ctx.editor.isActive({ textAlign: 'right' }),\n });\n const isAlignJustifyActive = useEditorState({\n editor,\n selector: ctx => ctx.editor.isActive({ textAlign: 'justify' }),\n });\n\n const headingLabel = isHeading1Active ? 'H1' : isHeading2Active ? 'H2' : isHeading3Active ? 'H3' : 'P';\n\n return (\n <div data-slot=\"text-editor-toolbar\" className={cn('flex flex-wrap items-center gap-0.5 border-border border-b bg-muted-muted/50 p-1.5', className)}>\n {/* History */}\n <ToolbarButton onClick={() => editor.chain().focus().undo().run()} disabled={!editor.can().undo()} title=\"Undo (Ctrl+Z)\">\n <Undo className=\"h-3.5 w-3.5\" />\n </ToolbarButton>\n <ToolbarButton onClick={() => editor.chain().focus().redo().run()} disabled={!editor.can().redo()} title=\"Redo (Ctrl+Y)\">\n <Redo className=\"h-3.5 w-3.5\" />\n </ToolbarButton>\n\n <ToolbarDivider />\n\n {/* Heading dropdown */}\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <button\n type=\"button\"\n data-slot=\"toolbar-heading-trigger\"\n className={cn(\n 'inline-flex h-7 items-center gap-1 rounded px-1.5 font-medium text-xs transition-colors',\n 'hover:bg-muted-muted hover:text-text-positive-strong',\n 'disabled:pointer-events-none disabled:opacity-40',\n (isHeading1Active || isHeading2Active || isHeading3Active) && 'bg-primary-muted text-primary hover:bg-primary-muted/80 hover:text-primary'\n )}\n >\n <span className=\"w-5 text-center\">{headingLabel}</span>\n <ChevronDown className=\"h-3 w-3 opacity-60\" />\n </button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"start\" className=\"min-w-32\">\n <DropdownMenuItem onClick={() => editor.chain().focus().setParagraph().run()}>\n <span className=\"text-sm\">Paragraph</span>\n </DropdownMenuItem>\n <DropdownMenuItem onClick={() => editor.chain().focus().toggleHeading({ level: 1 }).run()}>\n <span className=\"font-bold text-lg\">Heading 1</span>\n </DropdownMenuItem>\n <DropdownMenuItem onClick={() => editor.chain().focus().toggleHeading({ level: 2 }).run()}>\n <span className=\"font-semibold text-base\">Heading 2</span>\n </DropdownMenuItem>\n <DropdownMenuItem onClick={() => editor.chain().focus().toggleHeading({ level: 3 }).run()}>\n <span className=\"font-semibold text-sm\">Heading 3</span>\n </DropdownMenuItem>\n </DropdownMenuContent>\n </DropdownMenu>\n\n <ToolbarDivider />\n\n {/* Text formatting */}\n <ToolbarButton onClick={() => editor.chain().focus().toggleBold().run()} isActive={isBoldActive} title=\"Bold (Ctrl+B)\">\n <Bold className=\"h-3.5 w-3.5\" />\n </ToolbarButton>\n <ToolbarButton onClick={() => editor.chain().focus().toggleItalic().run()} isActive={isItalicActive} title=\"Italic (Ctrl+I)\">\n <Italic className=\"h-3.5 w-3.5\" />\n </ToolbarButton>\n <ToolbarButton onClick={() => editor.chain().focus().toggleUnderline().run()} isActive={isUnderlineActive} title=\"Underline (Ctrl+U)\">\n <Underline className=\"h-3.5 w-3.5\" />\n </ToolbarButton>\n <ToolbarButton onClick={() => editor.chain().focus().toggleStrike().run()} isActive={isStrikeActive} title=\"Strikethrough\">\n <Strikethrough className=\"h-3.5 w-3.5\" />\n </ToolbarButton>\n <ToolbarButton onClick={() => editor.chain().focus().toggleCode().run()} isActive={isCodeActive} title=\"Inline Code\">\n <Code className=\"h-3.5 w-3.5\" />\n </ToolbarButton>\n\n <ToolbarDivider />\n\n {/* Lists */}\n <ToolbarButton onClick={() => editor.chain().focus().toggleBulletList().run()} isActive={isBulletListActive} title=\"Bullet List\">\n <List className=\"h-3.5 w-3.5\" />\n </ToolbarButton>\n <ToolbarButton onClick={() => editor.chain().focus().toggleOrderedList().run()} isActive={isOrderedListActive} title=\"Ordered List\">\n <ListOrdered className=\"h-3.5 w-3.5\" />\n </ToolbarButton>\n {enableTaskList && (\n <ToolbarButton onClick={() => editor.chain().focus().toggleTaskList().run()} isActive={isTaskListActive} title=\"Task List\">\n <ListChecks className=\"h-3.5 w-3.5\" />\n </ToolbarButton>\n )}\n\n <ToolbarDivider />\n\n {/* Blocks */}\n <ToolbarButton onClick={() => editor.chain().focus().toggleBlockquote().run()} isActive={isBlockquoteActive} title=\"Blockquote\">\n <Quote className=\"h-3.5 w-3.5\" />\n </ToolbarButton>\n <ToolbarButton onClick={() => editor.chain().focus().toggleCodeBlock().run()} isActive={isCodeBlockActive} title=\"Code Block\">\n <Code2 className=\"h-3.5 w-3.5\" />\n </ToolbarButton>\n <ToolbarButton onClick={() => editor.chain().focus().setHorizontalRule().run()} title=\"Horizontal Rule\">\n <Minus className=\"h-3.5 w-3.5\" />\n </ToolbarButton>\n\n <ToolbarDivider />\n\n {/* Text alignment */}\n <ToolbarButton onClick={() => editor.chain().focus().setTextAlign('left').run()} isActive={isAlignLeftActive} title=\"Align Left\">\n <AlignLeft className=\"h-3.5 w-3.5\" />\n </ToolbarButton>\n <ToolbarButton onClick={() => editor.chain().focus().setTextAlign('center').run()} isActive={isAlignCenterActive} title=\"Align Center\">\n <AlignCenter className=\"h-3.5 w-3.5\" />\n </ToolbarButton>\n <ToolbarButton onClick={() => editor.chain().focus().setTextAlign('right').run()} isActive={isAlignRightActive} title=\"Align Right\">\n <AlignRight className=\"h-3.5 w-3.5\" />\n </ToolbarButton>\n <ToolbarButton onClick={() => editor.chain().focus().setTextAlign('justify').run()} isActive={isAlignJustifyActive} title=\"Align Justify\">\n <AlignJustify className=\"h-3.5 w-3.5\" />\n </ToolbarButton>\n\n {/* Link */}\n {enableLink && (\n <>\n <ToolbarDivider />\n <LinkDialog editor={editor} />\n </>\n )}\n\n {/* Color & Highlight */}\n {(enableColor || enableHighlight) && (\n <>\n <ToolbarDivider />\n {enableColor && (\n <Popover>\n <PopoverTrigger asChild>\n <ToolbarButton title=\"Text Color\">\n <Palette className=\"h-3.5 w-3.5\" />\n </ToolbarButton>\n </PopoverTrigger>\n <PopoverContent align=\"start\" className=\"w-44 p-2\">\n <p className=\"mb-1.5 font-medium text-text-positive-weak text-xs\">Text Color</p>\n <div className=\"grid grid-cols-5 gap-1\">\n {TEXT_COLORS.map(color => (\n <button\n key={color.label}\n type=\"button\"\n title={color.label}\n onClick={() => {\n if (!color.value) {\n editor.chain().focus().unsetColor().run();\n } else {\n editor.chain().focus().setColor(color.value).run();\n }\n }}\n className={cn(\n 'h-6 w-6 rounded border border-border transition-transform hover:scale-110',\n !color.value && 'bg-background text-[10px] text-text-positive leading-none'\n )}\n style={color.value ? { backgroundColor: color.value } : undefined}\n >\n {!color.value && '∅'}\n </button>\n ))}\n </div>\n </PopoverContent>\n </Popover>\n )}\n {enableHighlight && (\n <Popover>\n <PopoverTrigger asChild>\n <ToolbarButton title=\"Highlight\">\n <Highlighter className=\"h-3.5 w-3.5\" />\n </ToolbarButton>\n </PopoverTrigger>\n <PopoverContent align=\"start\" className=\"w-44 p-2\">\n <p className=\"mb-1.5 font-medium text-text-positive-weak text-xs\">Highlight</p>\n <div className=\"grid grid-cols-5 gap-1\">\n {HIGHLIGHT_COLORS.map(color => (\n <button\n key={color.label}\n type=\"button\"\n title={color.label}\n onClick={() => editor.chain().focus().toggleHighlight({ color: color.value }).run()}\n className=\"h-6 w-6 rounded border border-border transition-transform hover:scale-110\"\n style={{ backgroundColor: color.value }}\n />\n ))}\n </div>\n <button\n type=\"button\"\n onClick={() => editor.chain().focus().unsetHighlight().run()}\n className=\"mt-1.5 w-full rounded border border-border py-0.5 text-center text-text-positive-weak text-xs hover:bg-muted-muted\"\n >\n Clear highlight\n </button>\n </PopoverContent>\n </Popover>\n )}\n </>\n )}\n </div>\n );\n}\n\nexport { TextEditorToolbar };\n","'use client';\n\nimport { useEffect, useMemo } from 'react';\n\nimport { Bold, Italic, Strikethrough, Underline as UnderlineIcon } from 'lucide-react';\n\nimport { cn } from '@customafk/react-toolkit/utils';\n\nimport { CharacterCount } from '@tiptap/extension-character-count';\nimport { Highlight } from '@tiptap/extension-highlight';\nimport { Link } from '@tiptap/extension-link';\nimport { ListKeymap } from '@tiptap/extension-list-keymap';\nimport Placeholder from '@tiptap/extension-placeholder';\nimport { TaskItem } from '@tiptap/extension-task-item';\nimport { TaskList } from '@tiptap/extension-task-list';\nimport TextAlign from '@tiptap/extension-text-align';\nimport { Color, TextStyle } from '@tiptap/extension-text-style';\nimport Underline from '@tiptap/extension-underline';\nimport { type AnyExtension, EditorContent, useEditor, useEditorState } from '@tiptap/react';\nimport { BubbleMenu } from '@tiptap/react/menus';\nimport StarterKit from '@tiptap/starter-kit';\nimport { LinkDialog } from './link-dialog';\nimport { type TextEditorVariantProps, textEditorVariants } from './text-editor.variants';\nimport { TextEditorToolbar } from './toolbar';\nimport { ToolbarButton, ToolbarDivider } from './toolbar-primitives';\n\nexport interface TextEditorProps extends TextEditorVariantProps {\n value?: string;\n defaultValue?: string;\n onChange?: (html: string) => void;\n placeholder?: string;\n readOnly?: boolean;\n showToolbar?: boolean;\n className?: string;\n toolbarClassName?: string;\n editorClassName?: string;\n // Character count\n maxLength?: number;\n showCharacterCount?: boolean;\n onCharacterCount?: (stats: { characters: number; words: number }) => void;\n // Feature flags\n enableLink?: boolean;\n enableBubbleMenu?: boolean;\n enableTaskList?: boolean;\n enableHighlight?: boolean;\n enableColor?: boolean;\n}\n\nfunction TextEditor({\n value,\n defaultValue,\n onChange,\n placeholder = 'Start writing...',\n readOnly = false,\n showToolbar = true,\n variant,\n size,\n className,\n toolbarClassName,\n editorClassName,\n maxLength,\n showCharacterCount,\n onCharacterCount,\n enableLink,\n enableBubbleMenu,\n enableTaskList,\n enableHighlight,\n enableColor,\n}: TextEditorProps) {\n const needsCharCount = maxLength !== undefined || showCharacterCount || onCharacterCount !== undefined;\n const needsTextStyle = enableColor || enableHighlight;\n\n const extensions = useMemo(() => {\n const base: AnyExtension[] = [\n StarterKit,\n Underline,\n Placeholder.configure({ placeholder }),\n TextAlign.configure({ types: ['heading', 'paragraph'] }),\n ListKeymap,\n ];\n\n if (needsTextStyle) base.push(TextStyle);\n if (enableLink) {\n base.push(Link.configure({ openOnClick: false, linkOnPaste: true, defaultProtocol: 'https' }));\n }\n if (enableTaskList) {\n base.push(TaskList, TaskItem.configure({ nested: true }));\n }\n if (enableHighlight) {\n base.push(Highlight.configure({ multicolor: true }));\n }\n if (enableColor) {\n base.push(Color);\n }\n if (needsCharCount) {\n base.push(CharacterCount.configure({ limit: maxLength }));\n }\n\n return base;\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [needsCharCount, placeholder, maxLength, enableHighlight, needsTextStyle, enableTaskList, enableLink, enableColor]);\n\n const editor = useEditor({\n extensions,\n content: value ?? defaultValue,\n editable: !readOnly,\n onUpdate: ({ editor: e }) => {\n onChange?.(e.getHTML());\n if (onCharacterCount) {\n const storage = e.storage.characterCount;\n onCharacterCount({ characters: storage.characters(), words: storage.words() });\n }\n },\n });\n\n useEffect(() => {\n if (!editor || value === undefined) return;\n if (editor.getHTML() === value) return;\n editor.commands.setContent(value);\n }, [editor, value]);\n\n useEffect(() => {\n if (!editor) return;\n editor.setEditable(!readOnly);\n }, [editor, readOnly]);\n\n const charCount = useEditorState({\n editor,\n selector: ctx => {\n const storage = ctx.editor?.storage?.characterCount;\n return storage ? (storage.characters() as number) : 0;\n },\n });\n\n const wordCount = useEditorState({\n editor,\n selector: ctx => {\n const storage = ctx.editor?.storage?.characterCount;\n return storage ? (storage.words() as number) : 0;\n },\n });\n\n const showCharCount = showCharacterCount || maxLength !== undefined;\n const isNearLimit = maxLength !== undefined && charCount > maxLength * 0.9;\n\n return (\n <div data-slot=\"text-editor\" className={cn('lunas-text-editor', textEditorVariants({ variant, size }), className)}>\n {showToolbar && !readOnly && editor && (\n <TextEditorToolbar\n editor={editor}\n className={toolbarClassName}\n enableLink={enableLink}\n enableTaskList={enableTaskList}\n enableHighlight={enableHighlight}\n enableColor={enableColor}\n />\n )}\n\n {enableBubbleMenu && !readOnly && editor && (\n <BubbleMenu\n editor={editor}\n options={{ placement: 'top' }}\n className={cn('flex items-center gap-0.5 rounded-md border border-border bg-popover p-1 shadow-dropdown')}\n >\n <ToolbarButton onClick={() => editor.chain().focus().toggleBold().run()} isActive={editor.isActive('bold')} title=\"Bold (Ctrl+B)\">\n <Bold className=\"h-3.5 w-3.5\" />\n </ToolbarButton>\n <ToolbarButton onClick={() => editor.chain().focus().toggleItalic().run()} isActive={editor.isActive('italic')} title=\"Italic (Ctrl+I)\">\n <Italic className=\"h-3.5 w-3.5\" />\n </ToolbarButton>\n <ToolbarButton onClick={() => editor.chain().focus().toggleUnderline().run()} isActive={editor.isActive('underline')} title=\"Underline (Ctrl+U)\">\n <UnderlineIcon className=\"h-3.5 w-3.5\" />\n </ToolbarButton>\n <ToolbarButton onClick={() => editor.chain().focus().toggleStrike().run()} isActive={editor.isActive('strike')} title=\"Strikethrough\">\n <Strikethrough className=\"h-3.5 w-3.5\" />\n </ToolbarButton>\n {enableLink && (\n <>\n <ToolbarDivider />\n <LinkDialog editor={editor} />\n </>\n )}\n </BubbleMenu>\n )}\n\n <EditorContent editor={editor} data-slot=\"text-editor-content\" className={cn('flex-1 bg-white text-sm text-text-positive', editorClassName)} />\n\n {showCharCount && needsCharCount && (\n <div\n data-slot=\"text-editor-footer\"\n className=\"flex items-center justify-between border-border border-t bg-muted-muted/30 px-3 py-1 text-text-positive-weak text-xs\"\n >\n <span>{wordCount} words</span>\n <span data-warning={isNearLimit || undefined} className=\"data-warning:text-warning-strong\">\n {charCount}\n {maxLength ? ` / ${maxLength}` : ''} characters\n </span>\n </div>\n )}\n </div>\n );\n}\n\nexport { TextEditor };\n"],"mappings":"s0BAQA,SAAS,EAAc,CAAE,WAAU,YAAW,WAAU,GAAG,GAA6B,CACtF,OACE,EAAA,EAAA,KAAC,SAAA,CACC,KAAK,SACL,YAAU,iBACV,cAAa,GAAY,IAAA,GACzB,WAAA,EAAA,EAAA,IACE,oFACA,uDACA,mDACA,GAAY,6EACZ,EACD,CACD,GAAI,EAEH,YACM,CAIb,SAAS,GAAiB,CACxB,OAAO,EAAA,EAAA,KAAC,MAAA,CAAI,YAAU,kBAAkB,UAAU,sCAAuC,CCZ3F,SAAS,EAAW,CAAE,UAA2B,CAC/C,GAAM,CAAC,EAAQ,IAAA,EAAA,EAAA,UAAsB,GAAM,CACrC,CAAC,EAAK,IAAA,EAAA,EAAA,UAAmB,GAAG,CAE5B,GAAA,EAAA,EAAA,gBAA8B,CAClC,SACA,SAAU,GAAO,EAAI,OAAO,SAAS,OAAO,CAC7C,CAAC,CAEI,GAAA,EAAA,EAAA,aACH,GAAkB,CACb,GAEF,EADqB,EAAO,cAAc,OAAO,CAAC,MAAQ,GACtC,CAEtB,EAAU,EAAK,EAEjB,CAAC,EAAO,CACT,CAEK,GAAA,EAAA,EAAA,iBAAgC,CACpC,IAAM,EAAU,EAAI,MAAM,CACrB,IACL,EAAO,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAE,KAAM,EAAS,OAAQ,SAAU,CAAC,CAAC,KAAK,CACzE,EAAU,GAAM,GACf,CAAC,EAAQ,EAAI,CAAC,CAEX,GAAA,EAAA,EAAA,iBAAiC,CACrC,EAAO,OAAO,CAAC,OAAO,CAAC,WAAW,CAAC,KAAK,CACxC,EAAU,GAAM,EACf,CAAC,EAAO,CAAC,CAEN,EAAiB,GAA6C,CAC9D,EAAE,MAAQ,UACZ,EAAE,gBAAgB,CAClB,GAAa,EAEX,EAAE,MAAQ,UACZ,EAAU,GAAM,EAIpB,OACE,EAAA,EAAA,MAACA,EAAAA,EAAAA,CAAQ,KAAM,EAAQ,aAAc,aACnC,EAAA,EAAA,KAACC,EAAAA,EAAAA,CAAe,QAAA,aACd,EAAA,EAAA,KAAC,EAAA,CAAc,SAAU,EAAc,MAAM,gBAAgB,YAAU,gCACrE,EAAA,EAAA,KAACC,EAAAA,MAAAA,CAAM,UAAU,cAAA,CAAgB,EACnB,EACD,EACjB,EAAA,EAAA,MAACC,EAAAA,EAAAA,CAAe,YAAU,cAAc,WAAY,EAAG,MAAM,QAAQ,UAAU,sBAC7E,EAAA,EAAA,KAAC,IAAA,CAAE,UAAU,8DAAsD,EAAe,YAAc,eAAkB,EAClH,EAAA,EAAA,MAAC,MAAA,CAAI,UAAU,0BACb,EAAA,EAAA,KAAC,QAAA,CACC,KAAK,MACL,YAAY,sBACZ,MAAO,EACP,SAAU,GAAK,EAAO,EAAE,OAAO,MAAM,CACrC,UAAW,EACX,UAAA,GACA,WAAA,EAAA,EAAA,IACE,8FACA,oDACA,0DACD,EACD,EACF,EAAA,EAAA,KAAC,SAAA,CACC,KAAK,SACL,QAAS,EACT,SAAU,CAAC,EAAI,MAAM,CACrB,WAAA,EAAA,EAAA,IACE,0EACA,4CACA,mDACD,UACF,SAEQ,CAAA,EACL,CACL,IACC,EAAA,EAAA,MAAC,SAAA,CAAO,KAAK,SAAS,QAAS,EAAc,UAAU,qFACrD,EAAA,EAAA,KAACC,EAAAA,SAAAA,CAAS,UAAU,UAAA,CAAY,CAAA,cAAA,EAEzB,GAEI,CAAA,EACT,CCpGd,MAAa,GAAA,EAAA,EAAA,KAAyB,CAAC,2CAA2C,CAAE,CAClF,SAAU,CACR,QAAS,CACP,QAAS,+CACT,MAAO,WACR,CACD,KAAM,CACJ,GAAI,oFACJ,GAAI,GACJ,GAAI,kFACL,CACF,CACD,gBAAiB,CACf,QAAS,UACT,KAAM,KACP,CACF,CAAC,CCgBI,EAAmB,CACvB,CAAE,MAAO,SAAU,MAAO,UAAW,CACrC,CAAE,MAAO,QAAS,MAAO,UAAW,CACpC,CAAE,MAAO,OAAQ,MAAO,UAAW,CACnC,CAAE,MAAO,OAAQ,MAAO,UAAW,CACnC,CAAE,MAAO,SAAU,MAAO,UAAW,CACrC,CAAE,MAAO,SAAU,MAAO,UAAW,CACrC,CAAE,MAAO,MAAO,MAAO,UAAW,CAClC,CAAE,MAAO,OAAQ,MAAO,UAAW,CACnC,CAAE,MAAO,OAAQ,MAAO,UAAW,CACnC,CAAE,MAAO,OAAQ,MAAO,UAAW,CACpC,CAEK,EAAc,CAClB,CAAE,MAAO,UAAW,MAAO,GAAI,CAC/B,CAAE,MAAO,MAAO,MAAO,UAAW,CAClC,CAAE,MAAO,SAAU,MAAO,UAAW,CACrC,CAAE,MAAO,SAAU,MAAO,UAAW,CACrC,CAAE,MAAO,QAAS,MAAO,UAAW,CACpC,CAAE,MAAO,OAAQ,MAAO,UAAW,CACnC,CAAE,MAAO,SAAU,MAAO,UAAW,CACrC,CAAE,MAAO,OAAQ,MAAO,UAAW,CACnC,CAAE,MAAO,OAAQ,MAAO,UAAW,CACnC,CAAE,MAAO,QAAS,MAAO,UAAW,CACrC,CAWD,SAAS,EAAkB,CAAE,SAAQ,YAAW,aAAY,iBAAgB,kBAAiB,eAAuC,CAClI,IAAM,GAAA,EAAA,EAAA,gBAAkC,CACtC,SACA,SAAU,GAAO,EAAI,OAAO,SAAS,UAAW,CAAE,MAAO,EAAG,CAAC,CAC9D,CAAC,CACI,GAAA,EAAA,EAAA,gBAAkC,CACtC,SACA,SAAU,GAAO,EAAI,OAAO,SAAS,UAAW,CAAE,MAAO,EAAG,CAAC,CAC9D,CAAC,CACI,GAAA,EAAA,EAAA,gBAAkC,CACtC,SACA,SAAU,GAAO,EAAI,OAAO,SAAS,UAAW,CAAE,MAAO,EAAG,CAAC,CAC9D,CAAC,CACI,GAAA,EAAA,EAAA,gBAA8B,CAClC,SACA,SAAU,GAAO,EAAI,OAAO,SAAS,OAAO,CAC7C,CAAC,CACI,GAAA,EAAA,EAAA,gBAAgC,CACpC,SACA,SAAU,GAAO,EAAI,OAAO,SAAS,SAAS,CAC/C,CAAC,CACI,GAAA,EAAA,EAAA,gBAAmC,CACvC,SACA,SAAU,GAAO,EAAI,OAAO,SAAS,YAAY,CAClD,CAAC,CACI,GAAA,EAAA,EAAA,gBAAgC,CACpC,SACA,SAAU,GAAO,EAAI,OAAO,SAAS,SAAS,CAC/C,CAAC,CACI,GAAA,EAAA,EAAA,gBAA8B,CAClC,SACA,SAAU,GAAO,EAAI,OAAO,SAAS,OAAO,CAC7C,CAAC,CACI,GAAA,EAAA,EAAA,gBAAoC,CACxC,SACA,SAAU,GAAO,EAAI,OAAO,SAAS,aAAa,CACnD,CAAC,CACI,GAAA,EAAA,EAAA,gBAAqC,CACzC,SACA,SAAU,GAAO,EAAI,OAAO,SAAS,cAAc,CACpD,CAAC,CACI,GAAA,EAAA,EAAA,gBAAkC,CACtC,SACA,SAAU,GAAO,EAAI,OAAO,SAAS,WAAW,CACjD,CAAC,CACI,GAAA,EAAA,EAAA,gBAAoC,CACxC,SACA,SAAU,GAAO,EAAI,OAAO,SAAS,aAAa,CACnD,CAAC,CACI,GAAA,EAAA,EAAA,gBAAmC,CACvC,SACA,SAAU,GAAO,EAAI,OAAO,SAAS,YAAY,CAClD,CAAC,CACI,GAAA,EAAA,EAAA,gBAAmC,CACvC,SACA,SAAU,GAAO,EAAI,OAAO,SAAS,CAAE,UAAW,OAAQ,CAAC,CAC5D,CAAC,CACI,GAAA,EAAA,EAAA,gBAAqC,CACzC,SACA,SAAU,GAAO,EAAI,OAAO,SAAS,CAAE,UAAW,SAAU,CAAC,CAC9D,CAAC,CACI,GAAA,EAAA,EAAA,gBAAoC,CACxC,SACA,SAAU,GAAO,EAAI,OAAO,SAAS,CAAE,UAAW,QAAS,CAAC,CAC7D,CAAC,CACI,GAAA,EAAA,EAAA,gBAAsC,CAC1C,SACA,SAAU,GAAO,EAAI,OAAO,SAAS,CAAE,UAAW,UAAW,CAAC,CAC/D,CAAC,CAEI,EAAe,EAAmB,KAAO,EAAmB,KAAO,EAAmB,KAAO,IAEnG,OACE,EAAA,EAAA,MAAC,MAAA,CAAI,YAAU,sBAAsB,WAAA,EAAA,EAAA,IAAc,qFAAsF,EAAU,YAEjJ,EAAA,EAAA,KAAC,EAAA,CAAc,YAAe,EAAO,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAE,SAAU,CAAC,EAAO,KAAK,CAAC,MAAM,CAAE,MAAM,0BACvG,EAAA,EAAA,KAACC,EAAAA,KAAAA,CAAK,UAAU,cAAA,CAAgB,EAClB,EAChB,EAAA,EAAA,KAAC,EAAA,CAAc,YAAe,EAAO,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAE,SAAU,CAAC,EAAO,KAAK,CAAC,MAAM,CAAE,MAAM,0BACvG,EAAA,EAAA,KAACC,EAAAA,KAAAA,CAAK,UAAU,cAAA,CAAgB,EAClB,EAEhB,EAAA,EAAA,KAAC,EAAA,EAAA,CAAiB,EAGlB,EAAA,EAAA,MAACC,EAAAA,EAAAA,CAAAA,SAAAA,EACC,EAAA,EAAA,KAACC,EAAAA,EAAAA,CAAoB,QAAA,aACnB,EAAA,EAAA,MAAC,SAAA,CACC,KAAK,SACL,YAAU,0BACV,WAAA,EAAA,EAAA,IACE,0FACA,uDACA,oDACC,GAAoB,GAAoB,IAAqB,6EAC/D,YAED,EAAA,EAAA,KAAC,OAAA,CAAK,UAAU,2BAAmB,GAAoB,EACvD,EAAA,EAAA,KAACC,EAAAA,YAAAA,CAAY,UAAU,qBAAA,CAAuB,CAAA,EACvC,EACW,EACtB,EAAA,EAAA,MAACC,EAAAA,EAAAA,CAAoB,MAAM,QAAQ,UAAU,sBAC3C,EAAA,EAAA,KAACC,EAAAA,EAAAA,CAAiB,YAAe,EAAO,OAAO,CAAC,OAAO,CAAC,cAAc,CAAC,KAAK,WAC1E,EAAA,EAAA,KAAC,OAAA,CAAK,UAAU,mBAAU,aAAgB,EACzB,EACnB,EAAA,EAAA,KAACA,EAAAA,EAAAA,CAAiB,YAAe,EAAO,OAAO,CAAC,OAAO,CAAC,cAAc,CAAE,MAAO,EAAG,CAAC,CAAC,KAAK,WACvF,EAAA,EAAA,KAAC,OAAA,CAAK,UAAU,6BAAoB,aAAgB,EACnC,EACnB,EAAA,EAAA,KAACA,EAAAA,EAAAA,CAAiB,YAAe,EAAO,OAAO,CAAC,OAAO,CAAC,cAAc,CAAE,MAAO,EAAG,CAAC,CAAC,KAAK,WACvF,EAAA,EAAA,KAAC,OAAA,CAAK,UAAU,mCAA0B,aAAgB,EACzC,EACnB,EAAA,EAAA,KAACA,EAAAA,EAAAA,CAAiB,YAAe,EAAO,OAAO,CAAC,OAAO,CAAC,cAAc,CAAE,MAAO,EAAG,CAAC,CAAC,KAAK,WACvF,EAAA,EAAA,KAAC,OAAA,CAAK,UAAU,iCAAwB,aAAgB,EACvC,GACC,CAAA,CAAA,CACT,EAEf,EAAA,EAAA,KAAC,EAAA,EAAA,CAAiB,EAGlB,EAAA,EAAA,KAAC,EAAA,CAAc,YAAe,EAAO,OAAO,CAAC,OAAO,CAAC,YAAY,CAAC,KAAK,CAAE,SAAU,EAAc,MAAM,0BACrG,EAAA,EAAA,KAACC,EAAAA,KAAAA,CAAK,UAAU,cAAA,CAAgB,EAClB,EAChB,EAAA,EAAA,KAAC,EAAA,CAAc,YAAe,EAAO,OAAO,CAAC,OAAO,CAAC,cAAc,CAAC,KAAK,CAAE,SAAU,EAAgB,MAAM,4BACzG,EAAA,EAAA,KAACC,EAAAA,OAAAA,CAAO,UAAU,cAAA,CAAgB,EACpB,EAChB,EAAA,EAAA,KAAC,EAAA,CAAc,YAAe,EAAO,OAAO,CAAC,OAAO,CAAC,iBAAiB,CAAC,KAAK,CAAE,SAAU,EAAmB,MAAM,+BAC/G,EAAA,EAAA,KAACC,EAAAA,UAAAA,CAAU,UAAU,cAAA,CAAgB,EACvB,EAChB,EAAA,EAAA,KAAC,EAAA,CAAc,YAAe,EAAO,OAAO,CAAC,OAAO,CAAC,cAAc,CAAC,KAAK,CAAE,SAAU,EAAgB,MAAM,0BACzG,EAAA,EAAA,KAACC,EAAAA,cAAAA,CAAc,UAAU,cAAA,CAAgB,EAC3B,EAChB,EAAA,EAAA,KAAC,EAAA,CAAc,YAAe,EAAO,OAAO,CAAC,OAAO,CAAC,YAAY,CAAC,KAAK,CAAE,SAAU,EAAc,MAAM,wBACrG,EAAA,EAAA,KAACC,EAAAA,KAAAA,CAAK,UAAU,cAAA,CAAgB,EAClB,EAEhB,EAAA,EAAA,KAAC,EAAA,EAAA,CAAiB,EAGlB,EAAA,EAAA,KAAC,EAAA,CAAc,YAAe,EAAO,OAAO,CAAC,OAAO,CAAC,kBAAkB,CAAC,KAAK,CAAE,SAAU,EAAoB,MAAM,wBACjH,EAAA,EAAA,KAACC,EAAAA,KAAAA,CAAK,UAAU,cAAA,CAAgB,EAClB,EAChB,EAAA,EAAA,KAAC,EAAA,CAAc,YAAe,EAAO,OAAO,CAAC,OAAO,CAAC,mBAAmB,CAAC,KAAK,CAAE,SAAU,EAAqB,MAAM,yBACnH,EAAA,EAAA,KAACC,EAAAA,YAAAA,CAAY,UAAU,cAAA,CAAgB,EACzB,CACf,IACC,EAAA,EAAA,KAAC,EAAA,CAAc,YAAe,EAAO,OAAO,CAAC,OAAO,CAAC,gBAAgB,CAAC,KAAK,CAAE,SAAU,EAAkB,MAAM,sBAC7G,EAAA,EAAA,KAACC,EAAAA,WAAAA,CAAW,UAAU,cAAA,CAAgB,EACxB,EAGlB,EAAA,EAAA,KAAC,EAAA,EAAA,CAAiB,EAGlB,EAAA,EAAA,KAAC,EAAA,CAAc,YAAe,EAAO,OAAO,CAAC,OAAO,CAAC,kBAAkB,CAAC,KAAK,CAAE,SAAU,EAAoB,MAAM,uBACjH,EAAA,EAAA,KAACC,EAAAA,MAAAA,CAAM,UAAU,cAAA,CAAgB,EACnB,EAChB,EAAA,EAAA,KAAC,EAAA,CAAc,YAAe,EAAO,OAAO,CAAC,OAAO,CAAC,iBAAiB,CAAC,KAAK,CAAE,SAAU,EAAmB,MAAM,uBAC/G,EAAA,EAAA,KAACC,EAAAA,MAAAA,CAAM,UAAU,cAAA,CAAgB,EACnB,EAChB,EAAA,EAAA,KAAC,EAAA,CAAc,YAAe,EAAO,OAAO,CAAC,OAAO,CAAC,mBAAmB,CAAC,KAAK,CAAE,MAAM,4BACpF,EAAA,EAAA,KAACC,EAAAA,MAAAA,CAAM,UAAU,cAAA,CAAgB,EACnB,EAEhB,EAAA,EAAA,KAAC,EAAA,EAAA,CAAiB,EAGlB,EAAA,EAAA,KAAC,EAAA,CAAc,YAAe,EAAO,OAAO,CAAC,OAAO,CAAC,aAAa,OAAO,CAAC,KAAK,CAAE,SAAU,EAAmB,MAAM,uBAClH,EAAA,EAAA,KAACC,EAAAA,UAAAA,CAAU,UAAU,cAAA,CAAgB,EACvB,EAChB,EAAA,EAAA,KAAC,EAAA,CAAc,YAAe,EAAO,OAAO,CAAC,OAAO,CAAC,aAAa,SAAS,CAAC,KAAK,CAAE,SAAU,EAAqB,MAAM,yBACtH,EAAA,EAAA,KAACC,EAAAA,YAAAA,CAAY,UAAU,cAAA,CAAgB,EACzB,EAChB,EAAA,EAAA,KAAC,EAAA,CAAc,YAAe,EAAO,OAAO,CAAC,OAAO,CAAC,aAAa,QAAQ,CAAC,KAAK,CAAE,SAAU,EAAoB,MAAM,wBACpH,EAAA,EAAA,KAACC,EAAAA,WAAAA,CAAW,UAAU,cAAA,CAAgB,EACxB,EAChB,EAAA,EAAA,KAAC,EAAA,CAAc,YAAe,EAAO,OAAO,CAAC,OAAO,CAAC,aAAa,UAAU,CAAC,KAAK,CAAE,SAAU,EAAsB,MAAM,0BACxH,EAAA,EAAA,KAACC,EAAAA,aAAAA,CAAa,UAAU,cAAA,CAAgB,EAC1B,CAGf,IACC,EAAA,EAAA,MAAA,EAAA,SAAA,CAAA,SAAA,EACE,EAAA,EAAA,KAAC,EAAA,EAAA,CAAiB,EAClB,EAAA,EAAA,KAAC,EAAA,CAAmB,SAAA,CAAU,CAAA,CAAA,CAC7B,EAIH,GAAe,KACf,EAAA,EAAA,MAAA,EAAA,SAAA,CAAA,SAAA,EACE,EAAA,EAAA,KAAC,EAAA,EAAA,CAAiB,CACjB,IACC,EAAA,EAAA,MAACC,EAAAA,EAAAA,CAAAA,SAAAA,EACC,EAAA,EAAA,KAACC,EAAAA,EAAAA,CAAe,QAAA,aACd,EAAA,EAAA,KAAC,EAAA,CAAc,MAAM,uBACnB,EAAA,EAAA,KAACC,EAAAA,QAAAA,CAAQ,UAAU,cAAA,CAAgB,EACrB,EACD,EACjB,EAAA,EAAA,MAACC,EAAAA,EAAAA,CAAe,MAAM,QAAQ,UAAU,sBACtC,EAAA,EAAA,KAAC,IAAA,CAAE,UAAU,8DAAqD,cAAc,EAChF,EAAA,EAAA,KAAC,MAAA,CAAI,UAAU,kCACZ,EAAY,IAAI,IACf,EAAA,EAAA,KAAC,SAAA,CAEC,KAAK,SACL,MAAO,EAAM,MACb,YAAe,CACR,EAAM,MAGT,EAAO,OAAO,CAAC,OAAO,CAAC,SAAS,EAAM,MAAM,CAAC,KAAK,CAFlD,EAAO,OAAO,CAAC,OAAO,CAAC,YAAY,CAAC,KAAK,EAK7C,WAAA,EAAA,EAAA,IACE,4EACA,CAAC,EAAM,OAAS,4DACjB,CACD,MAAO,EAAM,MAAQ,CAAE,gBAAiB,EAAM,MAAO,CAAG,IAAA,YAEvD,CAAC,EAAM,OAAS,KAhBZ,EAAM,MAiBJ,CACT,EACE,CAAA,EACS,CAAA,CAAA,CACT,CAEX,IACC,EAAA,EAAA,MAACH,EAAAA,EAAAA,CAAAA,SAAAA,EACC,EAAA,EAAA,KAACC,EAAAA,EAAAA,CAAe,QAAA,aACd,EAAA,EAAA,KAAC,EAAA,CAAc,MAAM,sBACnB,EAAA,EAAA,KAACG,EAAAA,YAAAA,CAAY,UAAU,cAAA,CAAgB,EACzB,EACD,EACjB,EAAA,EAAA,MAACD,EAAAA,EAAAA,CAAe,MAAM,QAAQ,UAAU,sBACtC,EAAA,EAAA,KAAC,IAAA,CAAE,UAAU,8DAAqD,aAAa,EAC/E,EAAA,EAAA,KAAC,MAAA,CAAI,UAAU,kCACZ,EAAiB,IAAI,IACpB,EAAA,EAAA,KAAC,SAAA,CAEC,KAAK,SACL,MAAO,EAAM,MACb,YAAe,EAAO,OAAO,CAAC,OAAO,CAAC,gBAAgB,CAAE,MAAO,EAAM,MAAO,CAAC,CAAC,KAAK,CACnF,UAAU,4EACV,MAAO,CAAE,gBAAiB,EAAM,MAAO,EALlC,EAAM,MAMX,CACF,EACE,EACN,EAAA,EAAA,KAAC,SAAA,CACC,KAAK,SACL,YAAe,EAAO,OAAO,CAAC,OAAO,CAAC,gBAAgB,CAAC,KAAK,CAC5D,UAAU,8HACX,mBAEQ,GACM,CAAA,CAAA,CACT,GAEX,GAED,CCzRV,SAAS,EAAW,CAClB,QACA,eACA,WACA,cAAc,mBACd,WAAW,GACX,cAAc,GACd,UACA,OACA,YACA,mBACA,kBACA,YACA,qBACA,mBACA,aACA,mBACA,iBACA,kBACA,eACkB,CAClB,IAAM,EAAiB,IAAc,IAAA,IAAa,GAAsB,IAAqB,IAAA,GACvF,EAAiB,GAAe,EAgChC,GAAA,EAAA,EAAA,WAAmB,CACvB,YAAA,EAAA,EAAA,aA/B+B,CAC/B,IAAME,EAAuB,CAC3BC,EAAAA,QACAC,EAAAA,QACAC,EAAAA,QAAY,UAAU,CAAE,cAAa,CAAC,CACtCC,EAAAA,QAAU,UAAU,CAAE,MAAO,CAAC,UAAW,YAAY,CAAE,CAAC,CACxDC,EAAAA,WACD,CAmBD,OAjBI,GAAgB,EAAK,KAAKC,EAAAA,UAAU,CACpC,GACF,EAAK,KAAKC,EAAAA,KAAK,UAAU,CAAE,YAAa,GAAO,YAAa,GAAM,gBAAiB,QAAS,CAAC,CAAC,CAE5F,GACF,EAAK,KAAKC,EAAAA,SAAUC,EAAAA,SAAS,UAAU,CAAE,OAAQ,GAAM,CAAC,CAAC,CAEvD,GACF,EAAK,KAAKC,EAAAA,UAAU,UAAU,CAAE,WAAY,GAAM,CAAC,CAAC,CAElD,GACF,EAAK,KAAKC,EAAAA,MAAM,CAEd,GACF,EAAK,KAAKC,EAAAA,eAAe,UAAU,CAAE,MAAO,EAAW,CAAC,CAAC,CAGpD,GAEN,CAAC,EAAgB,EAAa,EAAW,EAAiB,EAAgB,EAAgB,EAAY,EAAY,CAAC,CAIpH,QAAS,GAAS,EAClB,SAAU,CAAC,EACX,UAAW,CAAE,OAAQ,KAAQ,CAE3B,GADA,IAAW,EAAE,SAAS,CAAC,CACnB,EAAkB,CACpB,IAAM,EAAU,EAAE,QAAQ,eAC1B,EAAiB,CAAE,WAAY,EAAQ,YAAY,CAAE,MAAO,EAAQ,OAAO,CAAE,CAAC,GAGnF,CAAC,EAEF,EAAA,EAAA,eAAgB,CACV,CAAC,GAAU,IAAU,IAAA,IACrB,EAAO,SAAS,GAAK,GACzB,EAAO,SAAS,WAAW,EAAM,EAChC,CAAC,EAAQ,EAAM,CAAC,EAEnB,EAAA,EAAA,eAAgB,CACT,GACL,EAAO,YAAY,CAAC,EAAS,EAC5B,CAAC,EAAQ,EAAS,CAAC,CAEtB,IAAM,GAAA,EAAA,EAAA,gBAA2B,CAC/B,SACA,SAAU,GAAO,CACf,IAAM,EAAU,EAAI,QAAQ,SAAS,eACrC,OAAO,EAAW,EAAQ,YAAY,CAAc,GAEvD,CAAC,CAEI,GAAA,EAAA,EAAA,gBAA2B,CAC/B,SACA,SAAU,GAAO,CACf,IAAM,EAAU,EAAI,QAAQ,SAAS,eACrC,OAAO,EAAW,EAAQ,OAAO,CAAc,GAElD,CAAC,CAEI,EAAgB,GAAsB,IAAc,IAAA,GACpD,EAAc,IAAc,IAAA,IAAa,EAAY,EAAY,GAEvE,OACE,EAAA,EAAA,MAAC,MAAA,CAAI,YAAU,cAAc,WAAA,EAAA,EAAA,IAAc,oBAAqB,EAAmB,CAAE,UAAS,OAAM,CAAC,CAAE,EAAU,WAC9G,GAAe,CAAC,GAAY,IAC3B,EAAA,EAAA,KAAC,EAAA,CACS,SACR,UAAW,EACC,aACI,iBACC,kBACJ,eACb,CAGH,GAAoB,CAAC,GAAY,IAChC,EAAA,EAAA,MAACC,EAAAA,WAAAA,CACS,SACR,QAAS,CAAE,UAAW,MAAO,CAC7B,WAAA,EAAA,EAAA,IAAc,2FAA2F,YAEzG,EAAA,EAAA,KAAC,EAAA,CAAc,YAAe,EAAO,OAAO,CAAC,OAAO,CAAC,YAAY,CAAC,KAAK,CAAE,SAAU,EAAO,SAAS,OAAO,CAAE,MAAM,0BAChH,EAAA,EAAA,KAACC,EAAAA,KAAAA,CAAK,UAAU,cAAA,CAAgB,EAClB,EAChB,EAAA,EAAA,KAAC,EAAA,CAAc,YAAe,EAAO,OAAO,CAAC,OAAO,CAAC,cAAc,CAAC,KAAK,CAAE,SAAU,EAAO,SAAS,SAAS,CAAE,MAAM,4BACpH,EAAA,EAAA,KAACC,EAAAA,OAAAA,CAAO,UAAU,cAAA,CAAgB,EACpB,EAChB,EAAA,EAAA,KAAC,EAAA,CAAc,YAAe,EAAO,OAAO,CAAC,OAAO,CAAC,iBAAiB,CAAC,KAAK,CAAE,SAAU,EAAO,SAAS,YAAY,CAAE,MAAM,+BAC1H,EAAA,EAAA,KAACC,EAAAA,UAAAA,CAAc,UAAU,cAAA,CAAgB,EAC3B,EAChB,EAAA,EAAA,KAAC,EAAA,CAAc,YAAe,EAAO,OAAO,CAAC,OAAO,CAAC,cAAc,CAAC,KAAK,CAAE,SAAU,EAAO,SAAS,SAAS,CAAE,MAAM,0BACpH,EAAA,EAAA,KAACC,EAAAA,cAAAA,CAAc,UAAU,cAAA,CAAgB,EAC3B,CACf,IACC,EAAA,EAAA,MAAA,EAAA,SAAA,CAAA,SAAA,EACE,EAAA,EAAA,KAAC,EAAA,EAAA,CAAiB,EAClB,EAAA,EAAA,KAAC,EAAA,CAAmB,SAAA,CAAU,CAAA,CAAA,CAC7B,GAEM,EAGf,EAAA,EAAA,KAACC,EAAAA,cAAAA,CAAsB,SAAQ,YAAU,sBAAsB,WAAA,EAAA,EAAA,IAAc,6CAA8C,EAAgB,EAAI,CAE9I,GAAiB,IAChB,EAAA,EAAA,MAAC,MAAA,CACC,YAAU,qBACV,UAAU,kIAEV,EAAA,EAAA,MAAC,OAAA,CAAA,SAAA,CAAM,EAAU,SAAA,CAAA,CAAa,EAC9B,EAAA,EAAA,MAAC,OAAA,CAAK,eAAc,GAAe,IAAA,GAAW,UAAU,6CACrD,EACA,EAAY,MAAM,IAAc,GAAG,gBAC/B,CAAA,EACH,GAEJ"}
|
|
1
|
+
{"version":3,"file":"text-editor-CvJN3nSL.cjs","names":["Popover","PopoverTrigger","Link2","PopoverContent","Link2Off","Undo","Redo","DropdownMenu","DropdownMenuTrigger","ChevronDown","DropdownMenuContent","DropdownMenuItem","Bold","Italic","Underline","Strikethrough","Code","List","ListOrdered","ListChecks","Quote","Code2","Minus","AlignLeft","AlignCenter","AlignRight","AlignJustify","Popover","PopoverTrigger","Palette","PopoverContent","Highlighter","base: AnyExtension[]","StarterKit","Underline","Placeholder","TextAlign","ListKeymap","TextStyle","Link","TaskList","TaskItem","Highlight","Color","CharacterCount","BubbleMenu","Bold","Italic","UnderlineIcon","Strikethrough","EditorContent"],"sources":["../packages/components/features/text-editor/toolbar-primitives.tsx","../packages/components/features/text-editor/link-dialog.tsx","../packages/components/features/text-editor/text-editor.variants.ts","../packages/components/features/text-editor/toolbar.tsx","../packages/components/features/text-editor/text-editor.tsx"],"sourcesContent":["'use client';\n\nimport { cn } from '@customafk/react-toolkit/utils';\n\ninterface ToolbarButtonProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {\n isActive?: boolean;\n}\n\nfunction ToolbarButton({ isActive, className, children, ...props }: ToolbarButtonProps) {\n return (\n <button\n type=\"button\"\n data-slot=\"toolbar-button\"\n data-active={isActive || undefined}\n className={cn(\n 'inline-flex h-7 w-7 items-center justify-center rounded text-sm transition-colors',\n 'hover:bg-muted-muted hover:text-text-positive-strong',\n 'disabled:pointer-events-none disabled:opacity-40',\n isActive && 'bg-primary-muted text-primary hover:bg-primary-muted/80 hover:text-primary',\n className\n )}\n {...props}\n >\n {children}\n </button>\n );\n}\n\nfunction ToolbarDivider() {\n return <div data-slot=\"toolbar-divider\" className=\"mx-0.5 h-5 w-px shrink-0 bg-border\" />;\n}\n\nexport { ToolbarButton, ToolbarDivider };\n// biome-ignore lint/style/useComponentExportOnlyModules: type export needed by sibling feature files\nexport type { ToolbarButtonProps };\n","'use client';\n\nimport { useCallback, useState } from 'react';\n\nimport { Link2, Link2Off } from 'lucide-react';\n\nimport { cn } from '@customafk/react-toolkit/utils';\n\nimport { Popover, PopoverContent, PopoverTrigger } from '@/components/ui/popover';\n\nimport { type Editor, useEditorState } from '@tiptap/react';\nimport { ToolbarButton } from './toolbar-primitives';\n\nexport interface LinkDialogProps {\n editor: Editor;\n}\n\nfunction LinkDialog({ editor }: LinkDialogProps) {\n const [isOpen, setIsOpen] = useState(false);\n const [url, setUrl] = useState('');\n\n const isLinkActive = useEditorState({\n editor,\n selector: ctx => ctx.editor.isActive('link'),\n });\n\n const handleOpenChange = useCallback(\n (open: boolean) => {\n if (open) {\n const existingHref = editor.getAttributes('link').href ?? '';\n setUrl(existingHref);\n }\n setIsOpen(open);\n },\n [editor]\n );\n\n const handleApply = useCallback(() => {\n const trimmed = url.trim();\n if (!trimmed) return;\n editor.chain().focus().setLink({ href: trimmed, target: '_blank' }).run();\n setIsOpen(false);\n }, [editor, url]);\n\n const handleRemove = useCallback(() => {\n editor.chain().focus().unsetLink().run();\n setIsOpen(false);\n }, [editor]);\n\n const handleKeyDown = (e: React.KeyboardEvent<HTMLInputElement>) => {\n if (e.key === 'Enter') {\n e.preventDefault();\n handleApply();\n }\n if (e.key === 'Escape') {\n setIsOpen(false);\n }\n };\n\n return (\n <Popover open={isOpen} onOpenChange={handleOpenChange}>\n <PopoverTrigger asChild>\n <ToolbarButton isActive={isLinkActive} title=\"Link (Ctrl+K)\" data-slot=\"toolbar-link-button\">\n <Link2 className=\"h-3.5 w-3.5\" />\n </ToolbarButton>\n </PopoverTrigger>\n <PopoverContent data-slot=\"link-dialog\" sideOffset={6} align=\"start\" className=\"w-72 p-3\">\n <p className=\"mb-2 font-medium text-text-positive-strong text-xs\">{isLinkActive ? 'Edit Link' : 'Insert Link'}</p>\n <div className=\"flex gap-1.5\">\n <input\n type=\"url\"\n placeholder=\"https://example.com\"\n value={url}\n onChange={e => setUrl(e.target.value)}\n onKeyDown={handleKeyDown}\n autoFocus\n className={cn(\n 'flex-1 rounded border border-border bg-transparent px-2.5 py-1.5 text-sm text-text-positive',\n 'outline-none placeholder:text-text-positive-muted',\n 'focus:border-primary focus:ring-1 focus:ring-primary/30'\n )}\n />\n <button\n type=\"button\"\n onClick={handleApply}\n disabled={!url.trim()}\n className={cn(\n 'rounded bg-primary px-2.5 py-1.5 font-medium text-text-negative text-xs',\n 'transition-colors hover:bg-primary-strong',\n 'disabled:pointer-events-none disabled:opacity-50'\n )}\n >\n Apply\n </button>\n </div>\n {isLinkActive && (\n <button type=\"button\" onClick={handleRemove} className=\"mt-2 flex items-center gap-1 text-danger-strong text-xs hover:underline\">\n <Link2Off className=\"h-3 w-3\" />\n Remove link\n </button>\n )}\n </PopoverContent>\n </Popover>\n );\n}\n\nexport { LinkDialog };\n","import { cva, type VariantProps } from 'class-variance-authority';\n\nexport const textEditorVariants = cva(['flex flex-col overflow-hidden rounded-md'], {\n variants: {\n variant: {\n outline: 'border border-border bg-background shadow-xs',\n ghost: 'border-0',\n },\n size: {\n sm: 'text-xs [&_.ProseMirror]:min-h-24 [&_.ProseMirror]:px-2.5 [&_.ProseMirror]:py-1.5',\n md: '',\n lg: 'text-base [&_.ProseMirror]:min-h-56 [&_.ProseMirror]:px-4 [&_.ProseMirror]:py-3',\n },\n },\n defaultVariants: {\n variant: 'outline',\n size: 'md',\n },\n});\n\nexport type TextEditorVariantProps = VariantProps<typeof textEditorVariants>;\n","'use client';\n\nimport {\n AlignCenter,\n AlignJustify,\n AlignLeft,\n AlignRight,\n Bold,\n ChevronDown,\n Code,\n Code2,\n Highlighter,\n Italic,\n List,\n ListChecks,\n ListOrdered,\n Minus,\n Palette,\n Quote,\n Redo,\n Strikethrough,\n Underline,\n Undo,\n} from 'lucide-react';\n\nimport { cn } from '@customafk/react-toolkit/utils';\n\nimport { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuTrigger } from '@/components/ui/dropdown-menu';\nimport { Popover, PopoverContent, PopoverTrigger } from '@/components/ui/popover';\n\nimport { type Editor, useEditorState } from '@tiptap/react';\nimport { LinkDialog } from './link-dialog';\nimport { ToolbarButton, ToolbarDivider } from './toolbar-primitives';\n\nconst HIGHLIGHT_COLORS = [\n { label: 'Yellow', value: '#fde047' },\n { label: 'Green', value: '#86efac' },\n { label: 'Blue', value: '#93c5fd' },\n { label: 'Pink', value: '#f9a8d4' },\n { label: 'Orange', value: '#fdba74' },\n { label: 'Purple', value: '#c4b5fd' },\n { label: 'Red', value: '#fca5a5' },\n { label: 'Cyan', value: '#67e8f9' },\n { label: 'Lime', value: '#bef264' },\n { label: 'Gray', value: '#d1d5db' },\n];\n\nconst TEXT_COLORS = [\n { label: 'Default', value: '' },\n { label: 'Red', value: '#ef4444' },\n { label: 'Orange', value: '#f97316' },\n { label: 'Yellow', value: '#eab308' },\n { label: 'Green', value: '#22c55e' },\n { label: 'Blue', value: '#3b82f6' },\n { label: 'Purple', value: '#a855f7' },\n { label: 'Pink', value: '#ec4899' },\n { label: 'Gray', value: '#6b7280' },\n { label: 'Black', value: '#000000' },\n];\n\nexport interface TextEditorToolbarProps {\n editor: Editor;\n className?: string;\n enableLink?: boolean;\n enableTaskList?: boolean;\n enableHighlight?: boolean;\n enableColor?: boolean;\n}\n\nfunction TextEditorToolbar({ editor, className, enableLink, enableTaskList, enableHighlight, enableColor }: TextEditorToolbarProps) {\n const isHeading1Active = useEditorState({\n editor,\n selector: ctx => ctx.editor.isActive('heading', { level: 1 }),\n });\n const isHeading2Active = useEditorState({\n editor,\n selector: ctx => ctx.editor.isActive('heading', { level: 2 }),\n });\n const isHeading3Active = useEditorState({\n editor,\n selector: ctx => ctx.editor.isActive('heading', { level: 3 }),\n });\n const isBoldActive = useEditorState({\n editor,\n selector: ctx => ctx.editor.isActive('bold'),\n });\n const isItalicActive = useEditorState({\n editor,\n selector: ctx => ctx.editor.isActive('italic'),\n });\n const isUnderlineActive = useEditorState({\n editor,\n selector: ctx => ctx.editor.isActive('underline'),\n });\n const isStrikeActive = useEditorState({\n editor,\n selector: ctx => ctx.editor.isActive('strike'),\n });\n const isCodeActive = useEditorState({\n editor,\n selector: ctx => ctx.editor.isActive('code'),\n });\n const isBulletListActive = useEditorState({\n editor,\n selector: ctx => ctx.editor.isActive('bulletList'),\n });\n const isOrderedListActive = useEditorState({\n editor,\n selector: ctx => ctx.editor.isActive('orderedList'),\n });\n const isTaskListActive = useEditorState({\n editor,\n selector: ctx => ctx.editor.isActive('taskList'),\n });\n const isBlockquoteActive = useEditorState({\n editor,\n selector: ctx => ctx.editor.isActive('blockquote'),\n });\n const isCodeBlockActive = useEditorState({\n editor,\n selector: ctx => ctx.editor.isActive('codeBlock'),\n });\n const isAlignLeftActive = useEditorState({\n editor,\n selector: ctx => ctx.editor.isActive({ textAlign: 'left' }),\n });\n const isAlignCenterActive = useEditorState({\n editor,\n selector: ctx => ctx.editor.isActive({ textAlign: 'center' }),\n });\n const isAlignRightActive = useEditorState({\n editor,\n selector: ctx => ctx.editor.isActive({ textAlign: 'right' }),\n });\n const isAlignJustifyActive = useEditorState({\n editor,\n selector: ctx => ctx.editor.isActive({ textAlign: 'justify' }),\n });\n\n const headingLabel = isHeading1Active ? 'H1' : isHeading2Active ? 'H2' : isHeading3Active ? 'H3' : 'P';\n\n return (\n <div data-slot=\"text-editor-toolbar\" className={cn('flex flex-wrap items-center gap-0.5 border-border border-b bg-muted-muted/50 p-1.5', className)}>\n {/* History */}\n <ToolbarButton onClick={() => editor.chain().focus().undo().run()} disabled={!editor.can().undo()} title=\"Undo (Ctrl+Z)\">\n <Undo className=\"h-3.5 w-3.5\" />\n </ToolbarButton>\n <ToolbarButton onClick={() => editor.chain().focus().redo().run()} disabled={!editor.can().redo()} title=\"Redo (Ctrl+Y)\">\n <Redo className=\"h-3.5 w-3.5\" />\n </ToolbarButton>\n\n <ToolbarDivider />\n\n {/* Heading dropdown */}\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <button\n type=\"button\"\n data-slot=\"toolbar-heading-trigger\"\n className={cn(\n 'inline-flex h-7 items-center gap-1 rounded px-1.5 font-medium text-xs transition-colors',\n 'hover:bg-muted-muted hover:text-text-positive-strong',\n 'disabled:pointer-events-none disabled:opacity-40',\n (isHeading1Active || isHeading2Active || isHeading3Active) && 'bg-primary-muted text-primary hover:bg-primary-muted/80 hover:text-primary'\n )}\n >\n <span className=\"w-5 text-center\">{headingLabel}</span>\n <ChevronDown className=\"h-3 w-3 opacity-60\" />\n </button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"start\" className=\"min-w-32\">\n <DropdownMenuItem onClick={() => editor.chain().focus().setParagraph().run()}>\n <span className=\"text-sm\">Paragraph</span>\n </DropdownMenuItem>\n <DropdownMenuItem onClick={() => editor.chain().focus().toggleHeading({ level: 1 }).run()}>\n <span className=\"font-bold text-lg\">Heading 1</span>\n </DropdownMenuItem>\n <DropdownMenuItem onClick={() => editor.chain().focus().toggleHeading({ level: 2 }).run()}>\n <span className=\"font-semibold text-base\">Heading 2</span>\n </DropdownMenuItem>\n <DropdownMenuItem onClick={() => editor.chain().focus().toggleHeading({ level: 3 }).run()}>\n <span className=\"font-semibold text-sm\">Heading 3</span>\n </DropdownMenuItem>\n </DropdownMenuContent>\n </DropdownMenu>\n\n <ToolbarDivider />\n\n {/* Text formatting */}\n <ToolbarButton onClick={() => editor.chain().focus().toggleBold().run()} isActive={isBoldActive} title=\"Bold (Ctrl+B)\">\n <Bold className=\"h-3.5 w-3.5\" />\n </ToolbarButton>\n <ToolbarButton onClick={() => editor.chain().focus().toggleItalic().run()} isActive={isItalicActive} title=\"Italic (Ctrl+I)\">\n <Italic className=\"h-3.5 w-3.5\" />\n </ToolbarButton>\n <ToolbarButton onClick={() => editor.chain().focus().toggleUnderline().run()} isActive={isUnderlineActive} title=\"Underline (Ctrl+U)\">\n <Underline className=\"h-3.5 w-3.5\" />\n </ToolbarButton>\n <ToolbarButton onClick={() => editor.chain().focus().toggleStrike().run()} isActive={isStrikeActive} title=\"Strikethrough\">\n <Strikethrough className=\"h-3.5 w-3.5\" />\n </ToolbarButton>\n <ToolbarButton onClick={() => editor.chain().focus().toggleCode().run()} isActive={isCodeActive} title=\"Inline Code\">\n <Code className=\"h-3.5 w-3.5\" />\n </ToolbarButton>\n\n <ToolbarDivider />\n\n {/* Lists */}\n <ToolbarButton onClick={() => editor.chain().focus().toggleBulletList().run()} isActive={isBulletListActive} title=\"Bullet List\">\n <List className=\"h-3.5 w-3.5\" />\n </ToolbarButton>\n <ToolbarButton onClick={() => editor.chain().focus().toggleOrderedList().run()} isActive={isOrderedListActive} title=\"Ordered List\">\n <ListOrdered className=\"h-3.5 w-3.5\" />\n </ToolbarButton>\n {enableTaskList && (\n <ToolbarButton onClick={() => editor.chain().focus().toggleTaskList().run()} isActive={isTaskListActive} title=\"Task List\">\n <ListChecks className=\"h-3.5 w-3.5\" />\n </ToolbarButton>\n )}\n\n <ToolbarDivider />\n\n {/* Blocks */}\n <ToolbarButton onClick={() => editor.chain().focus().toggleBlockquote().run()} isActive={isBlockquoteActive} title=\"Blockquote\">\n <Quote className=\"h-3.5 w-3.5\" />\n </ToolbarButton>\n <ToolbarButton onClick={() => editor.chain().focus().toggleCodeBlock().run()} isActive={isCodeBlockActive} title=\"Code Block\">\n <Code2 className=\"h-3.5 w-3.5\" />\n </ToolbarButton>\n <ToolbarButton onClick={() => editor.chain().focus().setHorizontalRule().run()} title=\"Horizontal Rule\">\n <Minus className=\"h-3.5 w-3.5\" />\n </ToolbarButton>\n\n <ToolbarDivider />\n\n {/* Text alignment */}\n <ToolbarButton onClick={() => editor.chain().focus().setTextAlign('left').run()} isActive={isAlignLeftActive} title=\"Align Left\">\n <AlignLeft className=\"h-3.5 w-3.5\" />\n </ToolbarButton>\n <ToolbarButton onClick={() => editor.chain().focus().setTextAlign('center').run()} isActive={isAlignCenterActive} title=\"Align Center\">\n <AlignCenter className=\"h-3.5 w-3.5\" />\n </ToolbarButton>\n <ToolbarButton onClick={() => editor.chain().focus().setTextAlign('right').run()} isActive={isAlignRightActive} title=\"Align Right\">\n <AlignRight className=\"h-3.5 w-3.5\" />\n </ToolbarButton>\n <ToolbarButton onClick={() => editor.chain().focus().setTextAlign('justify').run()} isActive={isAlignJustifyActive} title=\"Align Justify\">\n <AlignJustify className=\"h-3.5 w-3.5\" />\n </ToolbarButton>\n\n {/* Link */}\n {enableLink && (\n <>\n <ToolbarDivider />\n <LinkDialog editor={editor} />\n </>\n )}\n\n {/* Color & Highlight */}\n {(enableColor || enableHighlight) && (\n <>\n <ToolbarDivider />\n {enableColor && (\n <Popover>\n <PopoverTrigger asChild>\n <ToolbarButton title=\"Text Color\">\n <Palette className=\"h-3.5 w-3.5\" />\n </ToolbarButton>\n </PopoverTrigger>\n <PopoverContent align=\"start\" className=\"w-44 p-2\">\n <p className=\"mb-1.5 font-medium text-text-positive-weak text-xs\">Text Color</p>\n <div className=\"grid grid-cols-5 gap-1\">\n {TEXT_COLORS.map(color => (\n <button\n key={color.label}\n type=\"button\"\n title={color.label}\n onClick={() => {\n if (!color.value) {\n editor.chain().focus().unsetColor().run();\n } else {\n editor.chain().focus().setColor(color.value).run();\n }\n }}\n className={cn(\n 'h-6 w-6 rounded border border-border transition-transform hover:scale-110',\n !color.value && 'bg-background text-[10px] text-text-positive leading-none'\n )}\n style={color.value ? { backgroundColor: color.value } : undefined}\n >\n {!color.value && '∅'}\n </button>\n ))}\n </div>\n </PopoverContent>\n </Popover>\n )}\n {enableHighlight && (\n <Popover>\n <PopoverTrigger asChild>\n <ToolbarButton title=\"Highlight\">\n <Highlighter className=\"h-3.5 w-3.5\" />\n </ToolbarButton>\n </PopoverTrigger>\n <PopoverContent align=\"start\" className=\"w-44 p-2\">\n <p className=\"mb-1.5 font-medium text-text-positive-weak text-xs\">Highlight</p>\n <div className=\"grid grid-cols-5 gap-1\">\n {HIGHLIGHT_COLORS.map(color => (\n <button\n key={color.label}\n type=\"button\"\n title={color.label}\n onClick={() => editor.chain().focus().toggleHighlight({ color: color.value }).run()}\n className=\"h-6 w-6 rounded border border-border transition-transform hover:scale-110\"\n style={{ backgroundColor: color.value }}\n />\n ))}\n </div>\n <button\n type=\"button\"\n onClick={() => editor.chain().focus().unsetHighlight().run()}\n className=\"mt-1.5 w-full rounded border border-border py-0.5 text-center text-text-positive-weak text-xs hover:bg-muted-muted\"\n >\n Clear highlight\n </button>\n </PopoverContent>\n </Popover>\n )}\n </>\n )}\n </div>\n );\n}\n\nexport { TextEditorToolbar };\n","'use client';\n\nimport { useEffect, useMemo } from 'react';\n\nimport { Bold, Italic, Strikethrough, Underline as UnderlineIcon } from 'lucide-react';\n\nimport { cn } from '@customafk/react-toolkit/utils';\n\nimport { CharacterCount } from '@tiptap/extension-character-count';\nimport { Highlight } from '@tiptap/extension-highlight';\nimport { Link } from '@tiptap/extension-link';\nimport { ListKeymap } from '@tiptap/extension-list-keymap';\nimport Placeholder from '@tiptap/extension-placeholder';\nimport { TaskItem } from '@tiptap/extension-task-item';\nimport { TaskList } from '@tiptap/extension-task-list';\nimport TextAlign from '@tiptap/extension-text-align';\nimport { Color, TextStyle } from '@tiptap/extension-text-style';\nimport Underline from '@tiptap/extension-underline';\nimport { type AnyExtension, EditorContent, useEditor, useEditorState } from '@tiptap/react';\nimport { BubbleMenu } from '@tiptap/react/menus';\nimport StarterKit from '@tiptap/starter-kit';\nimport { LinkDialog } from './link-dialog';\nimport { type TextEditorVariantProps, textEditorVariants } from './text-editor.variants';\nimport { TextEditorToolbar } from './toolbar';\nimport { ToolbarButton, ToolbarDivider } from './toolbar-primitives';\n\nexport interface TextEditorProps extends TextEditorVariantProps {\n value?: string;\n defaultValue?: string;\n onChange?: (html: string) => void;\n placeholder?: string;\n readOnly?: boolean;\n showToolbar?: boolean;\n className?: string;\n toolbarClassName?: string;\n editorClassName?: string;\n // Character count\n maxLength?: number;\n showCharacterCount?: boolean;\n onCharacterCount?: (stats: { characters: number; words: number }) => void;\n // Feature flags\n enableLink?: boolean;\n enableBubbleMenu?: boolean;\n enableTaskList?: boolean;\n enableHighlight?: boolean;\n enableColor?: boolean;\n}\n\nfunction TextEditor({\n value,\n defaultValue,\n onChange,\n placeholder = 'Start writing...',\n readOnly = false,\n showToolbar = true,\n variant,\n size,\n className,\n toolbarClassName,\n editorClassName,\n maxLength,\n showCharacterCount,\n onCharacterCount,\n enableLink,\n enableBubbleMenu,\n enableTaskList,\n enableHighlight,\n enableColor,\n}: TextEditorProps) {\n const needsCharCount = maxLength !== undefined || showCharacterCount || onCharacterCount !== undefined;\n const needsTextStyle = enableColor || enableHighlight;\n\n const extensions = useMemo(() => {\n const base: AnyExtension[] = [\n StarterKit,\n Underline,\n Placeholder.configure({ placeholder }),\n TextAlign.configure({ types: ['heading', 'paragraph'] }),\n ListKeymap,\n ];\n\n if (needsTextStyle) base.push(TextStyle);\n if (enableLink) {\n base.push(Link.configure({ openOnClick: false, linkOnPaste: true, defaultProtocol: 'https' }));\n }\n if (enableTaskList) {\n base.push(TaskList, TaskItem.configure({ nested: true }));\n }\n if (enableHighlight) {\n base.push(Highlight.configure({ multicolor: true }));\n }\n if (enableColor) {\n base.push(Color);\n }\n if (needsCharCount) {\n base.push(CharacterCount.configure({ limit: maxLength }));\n }\n\n return base;\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [needsCharCount, placeholder, maxLength, enableHighlight, needsTextStyle, enableTaskList, enableLink, enableColor]);\n\n const editor = useEditor({\n extensions,\n content: value ?? defaultValue,\n editable: !readOnly,\n onUpdate: ({ editor: e }) => {\n onChange?.(e.getHTML());\n if (onCharacterCount) {\n const storage = e.storage.characterCount;\n onCharacterCount({ characters: storage.characters(), words: storage.words() });\n }\n },\n });\n\n useEffect(() => {\n if (!editor || value === undefined) return;\n if (editor.getHTML() === value) return;\n editor.commands.setContent(value);\n }, [editor, value]);\n\n useEffect(() => {\n if (!editor) return;\n editor.setEditable(!readOnly);\n }, [editor, readOnly]);\n\n const charCount = useEditorState({\n editor,\n selector: ctx => {\n const storage = ctx.editor?.storage?.characterCount;\n return storage ? (storage.characters() as number) : 0;\n },\n });\n\n const wordCount = useEditorState({\n editor,\n selector: ctx => {\n const storage = ctx.editor?.storage?.characterCount;\n return storage ? (storage.words() as number) : 0;\n },\n });\n\n const showCharCount = showCharacterCount || maxLength !== undefined;\n const isNearLimit = maxLength !== undefined && charCount > maxLength * 0.9;\n\n return (\n <div data-slot=\"text-editor\" className={cn('lunas-text-editor', textEditorVariants({ variant, size }), className)}>\n {showToolbar && !readOnly && editor && (\n <TextEditorToolbar\n editor={editor}\n className={toolbarClassName}\n enableLink={enableLink}\n enableTaskList={enableTaskList}\n enableHighlight={enableHighlight}\n enableColor={enableColor}\n />\n )}\n\n {enableBubbleMenu && !readOnly && editor && (\n <BubbleMenu\n editor={editor}\n options={{ placement: 'top' }}\n className={cn('flex items-center gap-0.5 rounded-md border border-border bg-popover p-1 shadow-dropdown')}\n >\n <ToolbarButton onClick={() => editor.chain().focus().toggleBold().run()} isActive={editor.isActive('bold')} title=\"Bold (Ctrl+B)\">\n <Bold className=\"h-3.5 w-3.5\" />\n </ToolbarButton>\n <ToolbarButton onClick={() => editor.chain().focus().toggleItalic().run()} isActive={editor.isActive('italic')} title=\"Italic (Ctrl+I)\">\n <Italic className=\"h-3.5 w-3.5\" />\n </ToolbarButton>\n <ToolbarButton onClick={() => editor.chain().focus().toggleUnderline().run()} isActive={editor.isActive('underline')} title=\"Underline (Ctrl+U)\">\n <UnderlineIcon className=\"h-3.5 w-3.5\" />\n </ToolbarButton>\n <ToolbarButton onClick={() => editor.chain().focus().toggleStrike().run()} isActive={editor.isActive('strike')} title=\"Strikethrough\">\n <Strikethrough className=\"h-3.5 w-3.5\" />\n </ToolbarButton>\n {enableLink && (\n <>\n <ToolbarDivider />\n <LinkDialog editor={editor} />\n </>\n )}\n </BubbleMenu>\n )}\n\n <EditorContent editor={editor} data-slot=\"text-editor-content\" className={cn('flex-1 bg-white text-sm text-text-positive', editorClassName)} />\n\n {showCharCount && needsCharCount && (\n <div\n data-slot=\"text-editor-footer\"\n className=\"flex items-center justify-between border-border border-t bg-muted-muted/30 px-3 py-1 text-text-positive-weak text-xs\"\n >\n <span>{wordCount} words</span>\n <span data-warning={isNearLimit || undefined} className=\"data-warning:text-warning-strong\">\n {charCount}\n {maxLength ? ` / ${maxLength}` : ''} characters\n </span>\n </div>\n )}\n </div>\n );\n}\n\nexport { TextEditor };\n"],"mappings":"s0BAQA,SAAS,EAAc,CAAE,WAAU,YAAW,WAAU,GAAG,GAA6B,CACtF,OACE,EAAA,EAAA,KAAC,SAAA,CACC,KAAK,SACL,YAAU,iBACV,cAAa,GAAY,IAAA,GACzB,WAAA,EAAA,EAAA,IACE,oFACA,uDACA,mDACA,GAAY,6EACZ,EACD,CACD,GAAI,EAEH,YACM,CAIb,SAAS,GAAiB,CACxB,OAAO,EAAA,EAAA,KAAC,MAAA,CAAI,YAAU,kBAAkB,UAAU,sCAAuC,CCZ3F,SAAS,EAAW,CAAE,UAA2B,CAC/C,GAAM,CAAC,EAAQ,IAAA,EAAA,EAAA,UAAsB,GAAM,CACrC,CAAC,EAAK,IAAA,EAAA,EAAA,UAAmB,GAAG,CAE5B,GAAA,EAAA,EAAA,gBAA8B,CAClC,SACA,SAAU,GAAO,EAAI,OAAO,SAAS,OAAO,CAC7C,CAAC,CAEI,GAAA,EAAA,EAAA,aACH,GAAkB,CACb,GAEF,EADqB,EAAO,cAAc,OAAO,CAAC,MAAQ,GACtC,CAEtB,EAAU,EAAK,EAEjB,CAAC,EAAO,CACT,CAEK,GAAA,EAAA,EAAA,iBAAgC,CACpC,IAAM,EAAU,EAAI,MAAM,CACrB,IACL,EAAO,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAE,KAAM,EAAS,OAAQ,SAAU,CAAC,CAAC,KAAK,CACzE,EAAU,GAAM,GACf,CAAC,EAAQ,EAAI,CAAC,CAEX,GAAA,EAAA,EAAA,iBAAiC,CACrC,EAAO,OAAO,CAAC,OAAO,CAAC,WAAW,CAAC,KAAK,CACxC,EAAU,GAAM,EACf,CAAC,EAAO,CAAC,CAEN,EAAiB,GAA6C,CAC9D,EAAE,MAAQ,UACZ,EAAE,gBAAgB,CAClB,GAAa,EAEX,EAAE,MAAQ,UACZ,EAAU,GAAM,EAIpB,OACE,EAAA,EAAA,MAACA,EAAAA,EAAAA,CAAQ,KAAM,EAAQ,aAAc,aACnC,EAAA,EAAA,KAACC,EAAAA,EAAAA,CAAe,QAAA,aACd,EAAA,EAAA,KAAC,EAAA,CAAc,SAAU,EAAc,MAAM,gBAAgB,YAAU,gCACrE,EAAA,EAAA,KAACC,EAAAA,MAAAA,CAAM,UAAU,cAAA,CAAgB,EACnB,EACD,EACjB,EAAA,EAAA,MAACC,EAAAA,EAAAA,CAAe,YAAU,cAAc,WAAY,EAAG,MAAM,QAAQ,UAAU,sBAC7E,EAAA,EAAA,KAAC,IAAA,CAAE,UAAU,8DAAsD,EAAe,YAAc,eAAkB,EAClH,EAAA,EAAA,MAAC,MAAA,CAAI,UAAU,0BACb,EAAA,EAAA,KAAC,QAAA,CACC,KAAK,MACL,YAAY,sBACZ,MAAO,EACP,SAAU,GAAK,EAAO,EAAE,OAAO,MAAM,CACrC,UAAW,EACX,UAAA,GACA,WAAA,EAAA,EAAA,IACE,8FACA,oDACA,0DACD,EACD,EACF,EAAA,EAAA,KAAC,SAAA,CACC,KAAK,SACL,QAAS,EACT,SAAU,CAAC,EAAI,MAAM,CACrB,WAAA,EAAA,EAAA,IACE,0EACA,4CACA,mDACD,UACF,SAEQ,CAAA,EACL,CACL,IACC,EAAA,EAAA,MAAC,SAAA,CAAO,KAAK,SAAS,QAAS,EAAc,UAAU,qFACrD,EAAA,EAAA,KAACC,EAAAA,SAAAA,CAAS,UAAU,UAAA,CAAY,CAAA,cAAA,EAEzB,GAEI,CAAA,EACT,CCpGd,MAAa,GAAA,EAAA,EAAA,KAAyB,CAAC,2CAA2C,CAAE,CAClF,SAAU,CACR,QAAS,CACP,QAAS,+CACT,MAAO,WACR,CACD,KAAM,CACJ,GAAI,oFACJ,GAAI,GACJ,GAAI,kFACL,CACF,CACD,gBAAiB,CACf,QAAS,UACT,KAAM,KACP,CACF,CAAC,CCgBI,EAAmB,CACvB,CAAE,MAAO,SAAU,MAAO,UAAW,CACrC,CAAE,MAAO,QAAS,MAAO,UAAW,CACpC,CAAE,MAAO,OAAQ,MAAO,UAAW,CACnC,CAAE,MAAO,OAAQ,MAAO,UAAW,CACnC,CAAE,MAAO,SAAU,MAAO,UAAW,CACrC,CAAE,MAAO,SAAU,MAAO,UAAW,CACrC,CAAE,MAAO,MAAO,MAAO,UAAW,CAClC,CAAE,MAAO,OAAQ,MAAO,UAAW,CACnC,CAAE,MAAO,OAAQ,MAAO,UAAW,CACnC,CAAE,MAAO,OAAQ,MAAO,UAAW,CACpC,CAEK,EAAc,CAClB,CAAE,MAAO,UAAW,MAAO,GAAI,CAC/B,CAAE,MAAO,MAAO,MAAO,UAAW,CAClC,CAAE,MAAO,SAAU,MAAO,UAAW,CACrC,CAAE,MAAO,SAAU,MAAO,UAAW,CACrC,CAAE,MAAO,QAAS,MAAO,UAAW,CACpC,CAAE,MAAO,OAAQ,MAAO,UAAW,CACnC,CAAE,MAAO,SAAU,MAAO,UAAW,CACrC,CAAE,MAAO,OAAQ,MAAO,UAAW,CACnC,CAAE,MAAO,OAAQ,MAAO,UAAW,CACnC,CAAE,MAAO,QAAS,MAAO,UAAW,CACrC,CAWD,SAAS,EAAkB,CAAE,SAAQ,YAAW,aAAY,iBAAgB,kBAAiB,eAAuC,CAClI,IAAM,GAAA,EAAA,EAAA,gBAAkC,CACtC,SACA,SAAU,GAAO,EAAI,OAAO,SAAS,UAAW,CAAE,MAAO,EAAG,CAAC,CAC9D,CAAC,CACI,GAAA,EAAA,EAAA,gBAAkC,CACtC,SACA,SAAU,GAAO,EAAI,OAAO,SAAS,UAAW,CAAE,MAAO,EAAG,CAAC,CAC9D,CAAC,CACI,GAAA,EAAA,EAAA,gBAAkC,CACtC,SACA,SAAU,GAAO,EAAI,OAAO,SAAS,UAAW,CAAE,MAAO,EAAG,CAAC,CAC9D,CAAC,CACI,GAAA,EAAA,EAAA,gBAA8B,CAClC,SACA,SAAU,GAAO,EAAI,OAAO,SAAS,OAAO,CAC7C,CAAC,CACI,GAAA,EAAA,EAAA,gBAAgC,CACpC,SACA,SAAU,GAAO,EAAI,OAAO,SAAS,SAAS,CAC/C,CAAC,CACI,GAAA,EAAA,EAAA,gBAAmC,CACvC,SACA,SAAU,GAAO,EAAI,OAAO,SAAS,YAAY,CAClD,CAAC,CACI,GAAA,EAAA,EAAA,gBAAgC,CACpC,SACA,SAAU,GAAO,EAAI,OAAO,SAAS,SAAS,CAC/C,CAAC,CACI,GAAA,EAAA,EAAA,gBAA8B,CAClC,SACA,SAAU,GAAO,EAAI,OAAO,SAAS,OAAO,CAC7C,CAAC,CACI,GAAA,EAAA,EAAA,gBAAoC,CACxC,SACA,SAAU,GAAO,EAAI,OAAO,SAAS,aAAa,CACnD,CAAC,CACI,GAAA,EAAA,EAAA,gBAAqC,CACzC,SACA,SAAU,GAAO,EAAI,OAAO,SAAS,cAAc,CACpD,CAAC,CACI,GAAA,EAAA,EAAA,gBAAkC,CACtC,SACA,SAAU,GAAO,EAAI,OAAO,SAAS,WAAW,CACjD,CAAC,CACI,GAAA,EAAA,EAAA,gBAAoC,CACxC,SACA,SAAU,GAAO,EAAI,OAAO,SAAS,aAAa,CACnD,CAAC,CACI,GAAA,EAAA,EAAA,gBAAmC,CACvC,SACA,SAAU,GAAO,EAAI,OAAO,SAAS,YAAY,CAClD,CAAC,CACI,GAAA,EAAA,EAAA,gBAAmC,CACvC,SACA,SAAU,GAAO,EAAI,OAAO,SAAS,CAAE,UAAW,OAAQ,CAAC,CAC5D,CAAC,CACI,GAAA,EAAA,EAAA,gBAAqC,CACzC,SACA,SAAU,GAAO,EAAI,OAAO,SAAS,CAAE,UAAW,SAAU,CAAC,CAC9D,CAAC,CACI,GAAA,EAAA,EAAA,gBAAoC,CACxC,SACA,SAAU,GAAO,EAAI,OAAO,SAAS,CAAE,UAAW,QAAS,CAAC,CAC7D,CAAC,CACI,GAAA,EAAA,EAAA,gBAAsC,CAC1C,SACA,SAAU,GAAO,EAAI,OAAO,SAAS,CAAE,UAAW,UAAW,CAAC,CAC/D,CAAC,CAEI,EAAe,EAAmB,KAAO,EAAmB,KAAO,EAAmB,KAAO,IAEnG,OACE,EAAA,EAAA,MAAC,MAAA,CAAI,YAAU,sBAAsB,WAAA,EAAA,EAAA,IAAc,qFAAsF,EAAU,YAEjJ,EAAA,EAAA,KAAC,EAAA,CAAc,YAAe,EAAO,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAE,SAAU,CAAC,EAAO,KAAK,CAAC,MAAM,CAAE,MAAM,0BACvG,EAAA,EAAA,KAACC,EAAAA,KAAAA,CAAK,UAAU,cAAA,CAAgB,EAClB,EAChB,EAAA,EAAA,KAAC,EAAA,CAAc,YAAe,EAAO,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAE,SAAU,CAAC,EAAO,KAAK,CAAC,MAAM,CAAE,MAAM,0BACvG,EAAA,EAAA,KAACC,EAAAA,KAAAA,CAAK,UAAU,cAAA,CAAgB,EAClB,EAEhB,EAAA,EAAA,KAAC,EAAA,EAAA,CAAiB,EAGlB,EAAA,EAAA,MAACC,EAAAA,EAAAA,CAAAA,SAAAA,EACC,EAAA,EAAA,KAACC,EAAAA,EAAAA,CAAoB,QAAA,aACnB,EAAA,EAAA,MAAC,SAAA,CACC,KAAK,SACL,YAAU,0BACV,WAAA,EAAA,EAAA,IACE,0FACA,uDACA,oDACC,GAAoB,GAAoB,IAAqB,6EAC/D,YAED,EAAA,EAAA,KAAC,OAAA,CAAK,UAAU,2BAAmB,GAAoB,EACvD,EAAA,EAAA,KAACC,EAAAA,YAAAA,CAAY,UAAU,qBAAA,CAAuB,CAAA,EACvC,EACW,EACtB,EAAA,EAAA,MAACC,EAAAA,EAAAA,CAAoB,MAAM,QAAQ,UAAU,sBAC3C,EAAA,EAAA,KAACC,EAAAA,EAAAA,CAAiB,YAAe,EAAO,OAAO,CAAC,OAAO,CAAC,cAAc,CAAC,KAAK,WAC1E,EAAA,EAAA,KAAC,OAAA,CAAK,UAAU,mBAAU,aAAgB,EACzB,EACnB,EAAA,EAAA,KAACA,EAAAA,EAAAA,CAAiB,YAAe,EAAO,OAAO,CAAC,OAAO,CAAC,cAAc,CAAE,MAAO,EAAG,CAAC,CAAC,KAAK,WACvF,EAAA,EAAA,KAAC,OAAA,CAAK,UAAU,6BAAoB,aAAgB,EACnC,EACnB,EAAA,EAAA,KAACA,EAAAA,EAAAA,CAAiB,YAAe,EAAO,OAAO,CAAC,OAAO,CAAC,cAAc,CAAE,MAAO,EAAG,CAAC,CAAC,KAAK,WACvF,EAAA,EAAA,KAAC,OAAA,CAAK,UAAU,mCAA0B,aAAgB,EACzC,EACnB,EAAA,EAAA,KAACA,EAAAA,EAAAA,CAAiB,YAAe,EAAO,OAAO,CAAC,OAAO,CAAC,cAAc,CAAE,MAAO,EAAG,CAAC,CAAC,KAAK,WACvF,EAAA,EAAA,KAAC,OAAA,CAAK,UAAU,iCAAwB,aAAgB,EACvC,GACC,CAAA,CAAA,CACT,EAEf,EAAA,EAAA,KAAC,EAAA,EAAA,CAAiB,EAGlB,EAAA,EAAA,KAAC,EAAA,CAAc,YAAe,EAAO,OAAO,CAAC,OAAO,CAAC,YAAY,CAAC,KAAK,CAAE,SAAU,EAAc,MAAM,0BACrG,EAAA,EAAA,KAACC,EAAAA,KAAAA,CAAK,UAAU,cAAA,CAAgB,EAClB,EAChB,EAAA,EAAA,KAAC,EAAA,CAAc,YAAe,EAAO,OAAO,CAAC,OAAO,CAAC,cAAc,CAAC,KAAK,CAAE,SAAU,EAAgB,MAAM,4BACzG,EAAA,EAAA,KAACC,EAAAA,OAAAA,CAAO,UAAU,cAAA,CAAgB,EACpB,EAChB,EAAA,EAAA,KAAC,EAAA,CAAc,YAAe,EAAO,OAAO,CAAC,OAAO,CAAC,iBAAiB,CAAC,KAAK,CAAE,SAAU,EAAmB,MAAM,+BAC/G,EAAA,EAAA,KAACC,EAAAA,UAAAA,CAAU,UAAU,cAAA,CAAgB,EACvB,EAChB,EAAA,EAAA,KAAC,EAAA,CAAc,YAAe,EAAO,OAAO,CAAC,OAAO,CAAC,cAAc,CAAC,KAAK,CAAE,SAAU,EAAgB,MAAM,0BACzG,EAAA,EAAA,KAACC,EAAAA,cAAAA,CAAc,UAAU,cAAA,CAAgB,EAC3B,EAChB,EAAA,EAAA,KAAC,EAAA,CAAc,YAAe,EAAO,OAAO,CAAC,OAAO,CAAC,YAAY,CAAC,KAAK,CAAE,SAAU,EAAc,MAAM,wBACrG,EAAA,EAAA,KAACC,EAAAA,KAAAA,CAAK,UAAU,cAAA,CAAgB,EAClB,EAEhB,EAAA,EAAA,KAAC,EAAA,EAAA,CAAiB,EAGlB,EAAA,EAAA,KAAC,EAAA,CAAc,YAAe,EAAO,OAAO,CAAC,OAAO,CAAC,kBAAkB,CAAC,KAAK,CAAE,SAAU,EAAoB,MAAM,wBACjH,EAAA,EAAA,KAACC,EAAAA,KAAAA,CAAK,UAAU,cAAA,CAAgB,EAClB,EAChB,EAAA,EAAA,KAAC,EAAA,CAAc,YAAe,EAAO,OAAO,CAAC,OAAO,CAAC,mBAAmB,CAAC,KAAK,CAAE,SAAU,EAAqB,MAAM,yBACnH,EAAA,EAAA,KAACC,EAAAA,YAAAA,CAAY,UAAU,cAAA,CAAgB,EACzB,CACf,IACC,EAAA,EAAA,KAAC,EAAA,CAAc,YAAe,EAAO,OAAO,CAAC,OAAO,CAAC,gBAAgB,CAAC,KAAK,CAAE,SAAU,EAAkB,MAAM,sBAC7G,EAAA,EAAA,KAACC,EAAAA,WAAAA,CAAW,UAAU,cAAA,CAAgB,EACxB,EAGlB,EAAA,EAAA,KAAC,EAAA,EAAA,CAAiB,EAGlB,EAAA,EAAA,KAAC,EAAA,CAAc,YAAe,EAAO,OAAO,CAAC,OAAO,CAAC,kBAAkB,CAAC,KAAK,CAAE,SAAU,EAAoB,MAAM,uBACjH,EAAA,EAAA,KAACC,EAAAA,MAAAA,CAAM,UAAU,cAAA,CAAgB,EACnB,EAChB,EAAA,EAAA,KAAC,EAAA,CAAc,YAAe,EAAO,OAAO,CAAC,OAAO,CAAC,iBAAiB,CAAC,KAAK,CAAE,SAAU,EAAmB,MAAM,uBAC/G,EAAA,EAAA,KAACC,EAAAA,MAAAA,CAAM,UAAU,cAAA,CAAgB,EACnB,EAChB,EAAA,EAAA,KAAC,EAAA,CAAc,YAAe,EAAO,OAAO,CAAC,OAAO,CAAC,mBAAmB,CAAC,KAAK,CAAE,MAAM,4BACpF,EAAA,EAAA,KAACC,EAAAA,MAAAA,CAAM,UAAU,cAAA,CAAgB,EACnB,EAEhB,EAAA,EAAA,KAAC,EAAA,EAAA,CAAiB,EAGlB,EAAA,EAAA,KAAC,EAAA,CAAc,YAAe,EAAO,OAAO,CAAC,OAAO,CAAC,aAAa,OAAO,CAAC,KAAK,CAAE,SAAU,EAAmB,MAAM,uBAClH,EAAA,EAAA,KAACC,EAAAA,UAAAA,CAAU,UAAU,cAAA,CAAgB,EACvB,EAChB,EAAA,EAAA,KAAC,EAAA,CAAc,YAAe,EAAO,OAAO,CAAC,OAAO,CAAC,aAAa,SAAS,CAAC,KAAK,CAAE,SAAU,EAAqB,MAAM,yBACtH,EAAA,EAAA,KAACC,EAAAA,YAAAA,CAAY,UAAU,cAAA,CAAgB,EACzB,EAChB,EAAA,EAAA,KAAC,EAAA,CAAc,YAAe,EAAO,OAAO,CAAC,OAAO,CAAC,aAAa,QAAQ,CAAC,KAAK,CAAE,SAAU,EAAoB,MAAM,wBACpH,EAAA,EAAA,KAACC,EAAAA,WAAAA,CAAW,UAAU,cAAA,CAAgB,EACxB,EAChB,EAAA,EAAA,KAAC,EAAA,CAAc,YAAe,EAAO,OAAO,CAAC,OAAO,CAAC,aAAa,UAAU,CAAC,KAAK,CAAE,SAAU,EAAsB,MAAM,0BACxH,EAAA,EAAA,KAACC,EAAAA,aAAAA,CAAa,UAAU,cAAA,CAAgB,EAC1B,CAGf,IACC,EAAA,EAAA,MAAA,EAAA,SAAA,CAAA,SAAA,EACE,EAAA,EAAA,KAAC,EAAA,EAAA,CAAiB,EAClB,EAAA,EAAA,KAAC,EAAA,CAAmB,SAAA,CAAU,CAAA,CAAA,CAC7B,EAIH,GAAe,KACf,EAAA,EAAA,MAAA,EAAA,SAAA,CAAA,SAAA,EACE,EAAA,EAAA,KAAC,EAAA,EAAA,CAAiB,CACjB,IACC,EAAA,EAAA,MAACC,EAAAA,EAAAA,CAAAA,SAAAA,EACC,EAAA,EAAA,KAACC,EAAAA,EAAAA,CAAe,QAAA,aACd,EAAA,EAAA,KAAC,EAAA,CAAc,MAAM,uBACnB,EAAA,EAAA,KAACC,EAAAA,QAAAA,CAAQ,UAAU,cAAA,CAAgB,EACrB,EACD,EACjB,EAAA,EAAA,MAACC,EAAAA,EAAAA,CAAe,MAAM,QAAQ,UAAU,sBACtC,EAAA,EAAA,KAAC,IAAA,CAAE,UAAU,8DAAqD,cAAc,EAChF,EAAA,EAAA,KAAC,MAAA,CAAI,UAAU,kCACZ,EAAY,IAAI,IACf,EAAA,EAAA,KAAC,SAAA,CAEC,KAAK,SACL,MAAO,EAAM,MACb,YAAe,CACR,EAAM,MAGT,EAAO,OAAO,CAAC,OAAO,CAAC,SAAS,EAAM,MAAM,CAAC,KAAK,CAFlD,EAAO,OAAO,CAAC,OAAO,CAAC,YAAY,CAAC,KAAK,EAK7C,WAAA,EAAA,EAAA,IACE,4EACA,CAAC,EAAM,OAAS,4DACjB,CACD,MAAO,EAAM,MAAQ,CAAE,gBAAiB,EAAM,MAAO,CAAG,IAAA,YAEvD,CAAC,EAAM,OAAS,KAhBZ,EAAM,MAiBJ,CACT,EACE,CAAA,EACS,CAAA,CAAA,CACT,CAEX,IACC,EAAA,EAAA,MAACH,EAAAA,EAAAA,CAAAA,SAAAA,EACC,EAAA,EAAA,KAACC,EAAAA,EAAAA,CAAe,QAAA,aACd,EAAA,EAAA,KAAC,EAAA,CAAc,MAAM,sBACnB,EAAA,EAAA,KAACG,EAAAA,YAAAA,CAAY,UAAU,cAAA,CAAgB,EACzB,EACD,EACjB,EAAA,EAAA,MAACD,EAAAA,EAAAA,CAAe,MAAM,QAAQ,UAAU,sBACtC,EAAA,EAAA,KAAC,IAAA,CAAE,UAAU,8DAAqD,aAAa,EAC/E,EAAA,EAAA,KAAC,MAAA,CAAI,UAAU,kCACZ,EAAiB,IAAI,IACpB,EAAA,EAAA,KAAC,SAAA,CAEC,KAAK,SACL,MAAO,EAAM,MACb,YAAe,EAAO,OAAO,CAAC,OAAO,CAAC,gBAAgB,CAAE,MAAO,EAAM,MAAO,CAAC,CAAC,KAAK,CACnF,UAAU,4EACV,MAAO,CAAE,gBAAiB,EAAM,MAAO,EALlC,EAAM,MAMX,CACF,EACE,EACN,EAAA,EAAA,KAAC,SAAA,CACC,KAAK,SACL,YAAe,EAAO,OAAO,CAAC,OAAO,CAAC,gBAAgB,CAAC,KAAK,CAC5D,UAAU,8HACX,mBAEQ,GACM,CAAA,CAAA,CACT,GAEX,GAED,CCzRV,SAAS,EAAW,CAClB,QACA,eACA,WACA,cAAc,mBACd,WAAW,GACX,cAAc,GACd,UACA,OACA,YACA,mBACA,kBACA,YACA,qBACA,mBACA,aACA,mBACA,iBACA,kBACA,eACkB,CAClB,IAAM,EAAiB,IAAc,IAAA,IAAa,GAAsB,IAAqB,IAAA,GACvF,EAAiB,GAAe,EAgChC,GAAA,EAAA,EAAA,WAAmB,CACvB,YAAA,EAAA,EAAA,aA/B+B,CAC/B,IAAME,EAAuB,CAC3BC,EAAAA,QACAC,EAAAA,QACAC,EAAAA,QAAY,UAAU,CAAE,cAAa,CAAC,CACtCC,EAAAA,QAAU,UAAU,CAAE,MAAO,CAAC,UAAW,YAAY,CAAE,CAAC,CACxDC,EAAAA,WACD,CAmBD,OAjBI,GAAgB,EAAK,KAAKC,EAAAA,UAAU,CACpC,GACF,EAAK,KAAKC,EAAAA,KAAK,UAAU,CAAE,YAAa,GAAO,YAAa,GAAM,gBAAiB,QAAS,CAAC,CAAC,CAE5F,GACF,EAAK,KAAKC,EAAAA,SAAUC,EAAAA,SAAS,UAAU,CAAE,OAAQ,GAAM,CAAC,CAAC,CAEvD,GACF,EAAK,KAAKC,EAAAA,UAAU,UAAU,CAAE,WAAY,GAAM,CAAC,CAAC,CAElD,GACF,EAAK,KAAKC,EAAAA,MAAM,CAEd,GACF,EAAK,KAAKC,EAAAA,eAAe,UAAU,CAAE,MAAO,EAAW,CAAC,CAAC,CAGpD,GAEN,CAAC,EAAgB,EAAa,EAAW,EAAiB,EAAgB,EAAgB,EAAY,EAAY,CAAC,CAIpH,QAAS,GAAS,EAClB,SAAU,CAAC,EACX,UAAW,CAAE,OAAQ,KAAQ,CAE3B,GADA,IAAW,EAAE,SAAS,CAAC,CACnB,EAAkB,CACpB,IAAM,EAAU,EAAE,QAAQ,eAC1B,EAAiB,CAAE,WAAY,EAAQ,YAAY,CAAE,MAAO,EAAQ,OAAO,CAAE,CAAC,GAGnF,CAAC,EAEF,EAAA,EAAA,eAAgB,CACV,CAAC,GAAU,IAAU,IAAA,IACrB,EAAO,SAAS,GAAK,GACzB,EAAO,SAAS,WAAW,EAAM,EAChC,CAAC,EAAQ,EAAM,CAAC,EAEnB,EAAA,EAAA,eAAgB,CACT,GACL,EAAO,YAAY,CAAC,EAAS,EAC5B,CAAC,EAAQ,EAAS,CAAC,CAEtB,IAAM,GAAA,EAAA,EAAA,gBAA2B,CAC/B,SACA,SAAU,GAAO,CACf,IAAM,EAAU,EAAI,QAAQ,SAAS,eACrC,OAAO,EAAW,EAAQ,YAAY,CAAc,GAEvD,CAAC,CAEI,GAAA,EAAA,EAAA,gBAA2B,CAC/B,SACA,SAAU,GAAO,CACf,IAAM,EAAU,EAAI,QAAQ,SAAS,eACrC,OAAO,EAAW,EAAQ,OAAO,CAAc,GAElD,CAAC,CAEI,EAAgB,GAAsB,IAAc,IAAA,GACpD,EAAc,IAAc,IAAA,IAAa,EAAY,EAAY,GAEvE,OACE,EAAA,EAAA,MAAC,MAAA,CAAI,YAAU,cAAc,WAAA,EAAA,EAAA,IAAc,oBAAqB,EAAmB,CAAE,UAAS,OAAM,CAAC,CAAE,EAAU,WAC9G,GAAe,CAAC,GAAY,IAC3B,EAAA,EAAA,KAAC,EAAA,CACS,SACR,UAAW,EACC,aACI,iBACC,kBACJ,eACb,CAGH,GAAoB,CAAC,GAAY,IAChC,EAAA,EAAA,MAACC,EAAAA,WAAAA,CACS,SACR,QAAS,CAAE,UAAW,MAAO,CAC7B,WAAA,EAAA,EAAA,IAAc,2FAA2F,YAEzG,EAAA,EAAA,KAAC,EAAA,CAAc,YAAe,EAAO,OAAO,CAAC,OAAO,CAAC,YAAY,CAAC,KAAK,CAAE,SAAU,EAAO,SAAS,OAAO,CAAE,MAAM,0BAChH,EAAA,EAAA,KAACC,EAAAA,KAAAA,CAAK,UAAU,cAAA,CAAgB,EAClB,EAChB,EAAA,EAAA,KAAC,EAAA,CAAc,YAAe,EAAO,OAAO,CAAC,OAAO,CAAC,cAAc,CAAC,KAAK,CAAE,SAAU,EAAO,SAAS,SAAS,CAAE,MAAM,4BACpH,EAAA,EAAA,KAACC,EAAAA,OAAAA,CAAO,UAAU,cAAA,CAAgB,EACpB,EAChB,EAAA,EAAA,KAAC,EAAA,CAAc,YAAe,EAAO,OAAO,CAAC,OAAO,CAAC,iBAAiB,CAAC,KAAK,CAAE,SAAU,EAAO,SAAS,YAAY,CAAE,MAAM,+BAC1H,EAAA,EAAA,KAACC,EAAAA,UAAAA,CAAc,UAAU,cAAA,CAAgB,EAC3B,EAChB,EAAA,EAAA,KAAC,EAAA,CAAc,YAAe,EAAO,OAAO,CAAC,OAAO,CAAC,cAAc,CAAC,KAAK,CAAE,SAAU,EAAO,SAAS,SAAS,CAAE,MAAM,0BACpH,EAAA,EAAA,KAACC,EAAAA,cAAAA,CAAc,UAAU,cAAA,CAAgB,EAC3B,CACf,IACC,EAAA,EAAA,MAAA,EAAA,SAAA,CAAA,SAAA,EACE,EAAA,EAAA,KAAC,EAAA,EAAA,CAAiB,EAClB,EAAA,EAAA,KAAC,EAAA,CAAmB,SAAA,CAAU,CAAA,CAAA,CAC7B,GAEM,EAGf,EAAA,EAAA,KAACC,EAAAA,cAAAA,CAAsB,SAAQ,YAAU,sBAAsB,WAAA,EAAA,EAAA,IAAc,6CAA8C,EAAgB,EAAI,CAE9I,GAAiB,IAChB,EAAA,EAAA,MAAC,MAAA,CACC,YAAU,qBACV,UAAU,kIAEV,EAAA,EAAA,MAAC,OAAA,CAAA,SAAA,CAAM,EAAU,SAAA,CAAA,CAAa,EAC9B,EAAA,EAAA,MAAC,OAAA,CAAK,eAAc,GAAe,IAAA,GAAW,UAAU,6CACrD,EACA,EAAY,MAAM,IAAc,GAAG,gBAC/B,CAAA,EACH,GAEJ"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
const e=require(`./chunk-
|
|
2
|
-
//# sourceMappingURL=textarea-
|
|
1
|
+
const e=require(`./chunk-350yNsax.cjs`);let t=require(`react`),n=require(`@customafk/react-toolkit/utils`),r=require(`react/jsx-runtime`);function i({className:e,onChange:i,onValueChange:a,...o}){let s=(0,t.useCallback)(e=>{i?.(e),a?.(e.target.value)},[i,a]);return(0,r.jsx)(`textarea`,{"data-slot":`textarea`,className:(0,n.cn)(`flex min-h-24 w-full bg-transparent px-3 py-2`,`rounded shadow-input transition-[color,box-shadow] duration-200`,`resize-y text-sm text-text-positive-weak tabular-nums caret-primary`,`-outline-offset-1 outline-1 outline-border`,`placeholder:text-text-positive-muted`,`focus:text-text-positive focus:outline-primary-strong focus:ring-4 focus:ring-primary-weak`,`read-only:pointer-events-none read-only:bg-muted-muted read-only:placeholder:text-text-positive-weak`,`aria-invalid:bg-danger-bg-subtle`,`aria-invalid:outline-danger`,`aria-invalid:ring-danger-weak`,`aria-invalid:focus:outline-danger-strong`,`aria-invalid:focus:ring-4`,`aria-invalid:placeholder:text-text-positive-weak`,`disabled:cursor-not-allowed disabled:opacity-50`,`disabled:pointer-events-none`,`disabled:border-border-weak/50 disabled:bg-secondary-muted/10`,e),...o,onChange:s})}Object.defineProperty(exports,`t`,{enumerable:!0,get:function(){return i}});
|
|
2
|
+
//# sourceMappingURL=textarea-Cc9CF8wD.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"textarea-
|
|
1
|
+
{"version":3,"file":"textarea-Cc9CF8wD.cjs","names":[],"sources":["../packages/components/ui/textarea.tsx"],"sourcesContent":["'use client';\nimport { useCallback } from 'react';\n\nimport { cn } from '@customafk/react-toolkit/utils';\n\n/**\n * Styled multi-line text area built on the native `<textarea>` element with resize, focus, and validation state styles.\n *\n * @example\n * ```tsx\n * import { Textarea } from '@customafk/lunas-ui/ui/textarea';\n *\n * <Textarea\n * placeholder=\"Write a description…\"\n * rows={4}\n * onValueChange={(value) => console.log(value)}\n * />\n * ```\n */\nfunction Textarea({\n className,\n onChange,\n onValueChange,\n ...props\n}: React.ComponentProps<'textarea'> & {\n /** Convenience callback that receives the raw string value on every change, bypassing the synthetic event. */\n onValueChange?: (value: string) => void;\n}) {\n const handleChange = useCallback(\n (e: React.ChangeEvent<HTMLTextAreaElement>) => {\n onChange?.(e);\n onValueChange?.(e.target.value);\n },\n [onChange, onValueChange]\n );\n return (\n <textarea\n data-slot=\"textarea\"\n className={cn(\n // Base styles\n 'flex min-h-24 w-full bg-transparent px-3 py-2',\n 'rounded shadow-input transition-[color,box-shadow] duration-200',\n 'resize-y text-sm text-text-positive-weak tabular-nums caret-primary',\n\n // Border and shadow styles\n '-outline-offset-1 outline-1 outline-border',\n\n // Placeholder styling\n 'placeholder:text-text-positive-muted',\n\n // State styles\n 'focus:text-text-positive focus:outline-primary-strong focus:ring-4 focus:ring-primary-weak',\n\n // Read-only state\n 'read-only:pointer-events-none read-only:bg-muted-muted read-only:placeholder:text-text-positive-weak',\n\n // Invalid state\n 'aria-invalid:bg-danger-bg-subtle',\n 'aria-invalid:outline-danger',\n 'aria-invalid:ring-danger-weak',\n 'aria-invalid:focus:outline-danger-strong',\n 'aria-invalid:focus:ring-4',\n 'aria-invalid:placeholder:text-text-positive-weak',\n\n // Disabled state\n 'disabled:cursor-not-allowed disabled:opacity-50',\n 'disabled:pointer-events-none',\n 'disabled:border-border-weak/50 disabled:bg-secondary-muted/10',\n\n // Additional custom styling\n className\n )}\n {...props}\n onChange={handleChange}\n />\n );\n}\n\nexport { Textarea };\n"],"mappings":"0IAmBA,SAAS,EAAS,CAChB,YACA,WACA,gBACA,GAAG,GAIF,CACD,IAAM,GAAA,EAAA,EAAA,aACH,GAA8C,CAC7C,IAAW,EAAE,CACb,IAAgB,EAAE,OAAO,MAAM,EAEjC,CAAC,EAAU,EAAc,CAC1B,CACD,OACE,EAAA,EAAA,KAAC,WAAA,CACC,YAAU,WACV,WAAA,EAAA,EAAA,IAEE,gDACA,kEACA,sEAGA,6CAGA,uCAGA,6FAGA,uGAGA,mCACA,8BACA,gCACA,2CACA,4BACA,mDAGA,kDACA,+BACA,gEAGA,EACD,CACD,GAAI,EACJ,SAAU,GACV"}
|