@mieweb/ui 0.10.0-dev.2 → 0.10.0-dev.20
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/agent/mieweb-ui.instructions.md +13 -1
- package/dist/CsvBlock-FX5YNGNE.cjs +17 -0
- package/dist/{CsvBlock-ROJCKJDP.cjs.map → CsvBlock-FX5YNGNE.cjs.map} +1 -1
- package/dist/CsvBlock-VLMG7GUO.js +8 -0
- package/dist/{CsvBlock-UWPMTLE2.js.map → CsvBlock-VLMG7GUO.js.map} +1 -1
- package/dist/HtmlPreviewBlock-5JE7L3GR.js +8 -0
- package/dist/{HtmlPreviewBlock-ME5U3XNS.js.map → HtmlPreviewBlock-5JE7L3GR.js.map} +1 -1
- package/dist/HtmlPreviewBlock-UO37JQ3K.cjs +17 -0
- package/dist/{HtmlPreviewBlock-DWFN6EUB.cjs.map → HtmlPreviewBlock-UO37JQ3K.cjs.map} +1 -1
- package/dist/Input-yN516s5_.d.cts +3 -0
- package/dist/Input-yN516s5_.d.ts +3 -0
- package/dist/MermaidBlock-3XHFBAMV.js +8 -0
- package/dist/{MermaidBlock-2B6CPD6Y.js.map → MermaidBlock-3XHFBAMV.js.map} +1 -1
- package/dist/MermaidBlock-RZ75RPZA.cjs +17 -0
- package/dist/{MermaidBlock-D2UC5M55.cjs.map → MermaidBlock-RZ75RPZA.cjs.map} +1 -1
- package/dist/SurveyBlock-MUVJ3JUI.js +8 -0
- package/dist/{SurveyBlock-4DO62RBT.js.map → SurveyBlock-MUVJ3JUI.js.map} +1 -1
- package/dist/SurveyBlock-VH47YXZC.cjs +17 -0
- package/dist/{SurveyBlock-4CD4AYMJ.cjs.map → SurveyBlock-VH47YXZC.cjs.map} +1 -1
- package/dist/ag-grid.d.cts +142 -1
- package/dist/ag-grid.d.ts +142 -1
- package/dist/{chunk-ACCAXVOG.js → chunk-2ABWFQQH.js} +133 -55
- package/dist/chunk-2ABWFQQH.js.map +1 -0
- package/dist/{chunk-Y5HFM7LO.js → chunk-2BARVD4C.js} +3 -3
- package/dist/{chunk-Y5HFM7LO.js.map → chunk-2BARVD4C.js.map} +1 -1
- package/dist/{chunk-G3JX3UAU.cjs → chunk-3KPDQG5O.cjs} +5 -5
- package/dist/{chunk-G3JX3UAU.cjs.map → chunk-3KPDQG5O.cjs.map} +1 -1
- package/dist/chunk-3YBS4WUQ.js +52 -0
- package/dist/chunk-3YBS4WUQ.js.map +1 -0
- package/dist/chunk-4HC2IBOX.js +258 -0
- package/dist/chunk-4HC2IBOX.js.map +1 -0
- package/dist/chunk-4IS3QCOQ.cjs +453 -0
- package/dist/chunk-4IS3QCOQ.cjs.map +1 -0
- package/dist/chunk-4NCDU5IG.cjs +56 -0
- package/dist/chunk-4NCDU5IG.cjs.map +1 -0
- package/dist/{chunk-E4IBHYJ7.cjs → chunk-6N6LIAUJ.cjs} +9 -9
- package/dist/{chunk-E4IBHYJ7.cjs.map → chunk-6N6LIAUJ.cjs.map} +1 -1
- package/dist/chunk-74ENCTIK.js +162 -0
- package/dist/chunk-74ENCTIK.js.map +1 -0
- package/dist/{chunk-GOALNQZ2.js → chunk-7YO7DNUV.js} +4 -83
- package/dist/chunk-7YO7DNUV.js.map +1 -0
- package/dist/{chunk-VILW53UZ.js → chunk-BIQ7GSO2.js} +3 -3
- package/dist/{chunk-VILW53UZ.js.map → chunk-BIQ7GSO2.js.map} +1 -1
- package/dist/chunk-BM35CACB.js +148 -0
- package/dist/chunk-BM35CACB.js.map +1 -0
- package/dist/{chunk-XI34EGK5.cjs → chunk-CPPUT74P.cjs} +9 -9
- package/dist/{chunk-XI34EGK5.cjs.map → chunk-CPPUT74P.cjs.map} +1 -1
- package/dist/{chunk-WNM7IZJ7.js → chunk-DSB4DKWG.js} +7 -7
- package/dist/{chunk-WNM7IZJ7.js.map → chunk-DSB4DKWG.js.map} +1 -1
- package/dist/chunk-DXEPYK3I.cjs +92 -0
- package/dist/chunk-DXEPYK3I.cjs.map +1 -0
- package/dist/{chunk-JI244Y7C.js → chunk-EK3BCET6.js} +57 -4
- package/dist/chunk-EK3BCET6.js.map +1 -0
- package/dist/{chunk-5JJ2DAE4.js → chunk-ENMXHZNE.js} +3 -3
- package/dist/{chunk-5JJ2DAE4.js.map → chunk-ENMXHZNE.js.map} +1 -1
- package/dist/{chunk-XCP454Q6.js → chunk-F4N67NAF.js} +12 -3
- package/dist/chunk-F4N67NAF.js.map +1 -0
- package/dist/{chunk-VKELAMAZ.js → chunk-FBLVPM2K.js} +3 -3
- package/dist/{chunk-VKELAMAZ.js.map → chunk-FBLVPM2K.js.map} +1 -1
- package/dist/{chunk-VU6UTJRM.js → chunk-FIKO4WR6.js} +3 -3
- package/dist/{chunk-VU6UTJRM.js.map → chunk-FIKO4WR6.js.map} +1 -1
- package/dist/{chunk-DEDN5HAG.js → chunk-FZURBQJ2.js} +3 -3
- package/dist/{chunk-DEDN5HAG.js.map → chunk-FZURBQJ2.js.map} +1 -1
- package/dist/{chunk-ENKFJJZX.js → chunk-G45FBKKV.js} +5 -5
- package/dist/{chunk-ENKFJJZX.js.map → chunk-G45FBKKV.js.map} +1 -1
- package/dist/{chunk-JHULS3EC.js → chunk-GBUVIGD5.js} +89 -3
- package/dist/chunk-GBUVIGD5.js.map +1 -0
- package/dist/chunk-GU5OS7JJ.cjs +281 -0
- package/dist/chunk-GU5OS7JJ.cjs.map +1 -0
- package/dist/{chunk-V7D3YGUV.js → chunk-GVLNXPJX.js} +4 -4
- package/dist/{chunk-V7D3YGUV.js.map → chunk-GVLNXPJX.js.map} +1 -1
- package/dist/chunk-GVM6DTR5.js +90 -0
- package/dist/chunk-GVM6DTR5.js.map +1 -0
- package/dist/{chunk-3QEVGSFG.cjs → chunk-GYXUS65N.cjs} +5 -5
- package/dist/{chunk-3QEVGSFG.cjs.map → chunk-GYXUS65N.cjs.map} +1 -1
- package/dist/{chunk-WGPLUCBD.js → chunk-H2IAMSHK.js} +3 -3
- package/dist/{chunk-WGPLUCBD.js.map → chunk-H2IAMSHK.js.map} +1 -1
- package/dist/{chunk-7ZXAQTV4.cjs → chunk-HIZWOAWY.cjs} +8 -8
- package/dist/{chunk-7ZXAQTV4.cjs.map → chunk-HIZWOAWY.cjs.map} +1 -1
- package/dist/{chunk-ELPW32ZI.cjs → chunk-HQ4CGVWX.cjs} +41 -41
- package/dist/{chunk-ELPW32ZI.cjs.map → chunk-HQ4CGVWX.cjs.map} +1 -1
- package/dist/{chunk-6EN3IQQI.cjs → chunk-I4LXSHKO.cjs} +4 -4
- package/dist/{chunk-6EN3IQQI.cjs.map → chunk-I4LXSHKO.cjs.map} +1 -1
- package/dist/{chunk-NV2CWBI2.cjs → chunk-IEY3ZJIT.cjs} +12 -3
- package/dist/chunk-IEY3ZJIT.cjs.map +1 -0
- package/dist/{chunk-2YCERQWC.js → chunk-IH55BEB3.js} +4 -4
- package/dist/{chunk-2YCERQWC.js.map → chunk-IH55BEB3.js.map} +1 -1
- package/dist/chunk-IT775BYG.js +179 -0
- package/dist/chunk-IT775BYG.js.map +1 -0
- package/dist/chunk-IYWG72DM.js +166 -0
- package/dist/chunk-IYWG72DM.js.map +1 -0
- package/dist/{chunk-IX6KFB3K.cjs → chunk-JELTRRR5.cjs} +9 -9
- package/dist/{chunk-IX6KFB3K.cjs.map → chunk-JELTRRR5.cjs.map} +1 -1
- package/dist/{chunk-FXO5ARBB.cjs → chunk-KDW6BD4O.cjs} +4 -4
- package/dist/{chunk-FXO5ARBB.cjs.map → chunk-KDW6BD4O.cjs.map} +1 -1
- package/dist/chunk-KHSFJTEX.js +1924 -0
- package/dist/chunk-KHSFJTEX.js.map +1 -0
- package/dist/{chunk-UV2FVNWT.cjs → chunk-LFPJ3OUM.cjs} +5 -5
- package/dist/{chunk-UV2FVNWT.cjs.map → chunk-LFPJ3OUM.cjs.map} +1 -1
- package/dist/{chunk-WNAA6CLE.cjs → chunk-LHBWRMNC.cjs} +94 -2
- package/dist/chunk-LHBWRMNC.cjs.map +1 -0
- package/dist/{chunk-X4XPNTCZ.cjs → chunk-LJZKEMAH.cjs} +135 -57
- package/dist/chunk-LJZKEMAH.cjs.map +1 -0
- package/dist/{chunk-2QKBTPUC.cjs → chunk-MQPG3KVK.cjs} +8 -8
- package/dist/{chunk-2QKBTPUC.cjs.map → chunk-MQPG3KVK.cjs.map} +1 -1
- package/dist/{chunk-WIAQQNFU.cjs → chunk-MYHV2ND3.cjs} +37 -3
- package/dist/chunk-MYHV2ND3.cjs.map +1 -0
- package/dist/{chunk-OE5CKRUC.js → chunk-MZNCLXXU.js} +4 -4
- package/dist/{chunk-OE5CKRUC.js.map → chunk-MZNCLXXU.js.map} +1 -1
- package/dist/{chunk-XEAT7XJG.cjs → chunk-N2CJJHHB.cjs} +4 -4
- package/dist/{chunk-XEAT7XJG.cjs.map → chunk-N2CJJHHB.cjs.map} +1 -1
- package/dist/chunk-N7C4OEP7.cjs +356 -0
- package/dist/chunk-N7C4OEP7.cjs.map +1 -0
- package/dist/chunk-OGNADPM4.cjs +170 -0
- package/dist/chunk-OGNADPM4.cjs.map +1 -0
- package/dist/{chunk-5GUOOLPR.cjs → chunk-P5CMZZRZ.cjs} +5 -5
- package/dist/{chunk-5GUOOLPR.cjs.map → chunk-P5CMZZRZ.cjs.map} +1 -1
- package/dist/{chunk-U42F3HLE.cjs → chunk-QNDP6PE5.cjs} +57 -4
- package/dist/chunk-QNDP6PE5.cjs.map +1 -0
- package/dist/{chunk-H4ZXMQQW.js → chunk-QOVJ6Z6R.js} +3 -3
- package/dist/{chunk-H4ZXMQQW.js.map → chunk-QOVJ6Z6R.js.map} +1 -1
- package/dist/{chunk-GD7EBGC4.cjs → chunk-R2O72G6Z.cjs} +19 -19
- package/dist/{chunk-GD7EBGC4.cjs.map → chunk-R2O72G6Z.cjs.map} +1 -1
- package/dist/{chunk-TMMVIUUN.js → chunk-R6KPWIGO.js} +4 -4
- package/dist/{chunk-TMMVIUUN.js.map → chunk-R6KPWIGO.js.map} +1 -1
- package/dist/{chunk-VPWJCJCX.cjs → chunk-S45EERW3.cjs} +5 -5
- package/dist/{chunk-VPWJCJCX.cjs.map → chunk-S45EERW3.cjs.map} +1 -1
- package/dist/{chunk-WNZAYBVB.cjs → chunk-SQ2D7AON.cjs} +45 -45
- package/dist/{chunk-WNZAYBVB.cjs.map → chunk-SQ2D7AON.cjs.map} +1 -1
- package/dist/{chunk-P2CA3XGI.js → chunk-SYRLCTDV.js} +3 -3
- package/dist/{chunk-P2CA3XGI.js.map → chunk-SYRLCTDV.js.map} +1 -1
- package/dist/{chunk-7ZDPD5ZX.cjs → chunk-T4L7Q5FA.cjs} +7 -7
- package/dist/{chunk-7ZDPD5ZX.cjs.map → chunk-T4L7Q5FA.cjs.map} +1 -1
- package/dist/{chunk-ZGRCSNPK.js → chunk-TF7YWJHU.js} +3 -3
- package/dist/{chunk-ZGRCSNPK.js.map → chunk-TF7YWJHU.js.map} +1 -1
- package/dist/{chunk-2IZLKPUW.js → chunk-THLIL6PY.js} +3 -3
- package/dist/{chunk-2IZLKPUW.js.map → chunk-THLIL6PY.js.map} +1 -1
- package/dist/{chunk-N6IY47YA.cjs → chunk-TTSSUOEV.cjs} +8 -8
- package/dist/{chunk-N6IY47YA.cjs.map → chunk-TTSSUOEV.cjs.map} +1 -1
- package/dist/{chunk-5MCBWTIF.cjs → chunk-TYE5K5WV.cjs} +4 -4
- package/dist/{chunk-5MCBWTIF.cjs.map → chunk-TYE5K5WV.cjs.map} +1 -1
- package/dist/{chunk-22CYDCXA.js → chunk-TZJQB4P2.js} +37 -4
- package/dist/chunk-TZJQB4P2.js.map +1 -0
- package/dist/{chunk-VOKVG3ER.js → chunk-UBSH27C2.js} +4 -4
- package/dist/{chunk-VOKVG3ER.js.map → chunk-UBSH27C2.js.map} +1 -1
- package/dist/chunk-VINZZQBD.cjs +323 -0
- package/dist/chunk-VINZZQBD.cjs.map +1 -0
- package/dist/chunk-VPTASZ2O.cjs +171 -0
- package/dist/chunk-VPTASZ2O.cjs.map +1 -0
- package/dist/{chunk-SGFYA22I.cjs → chunk-VYPPQPSZ.cjs} +7 -7
- package/dist/{chunk-SGFYA22I.cjs.map → chunk-VYPPQPSZ.cjs.map} +1 -1
- package/dist/chunk-WCDJFMZO.cjs +1967 -0
- package/dist/chunk-WCDJFMZO.cjs.map +1 -0
- package/dist/{chunk-VNYW4C4J.cjs → chunk-X6A27RGO.cjs} +4 -84
- package/dist/chunk-X6A27RGO.cjs.map +1 -0
- package/dist/chunk-XBTKZCZF.js +333 -0
- package/dist/chunk-XBTKZCZF.js.map +1 -0
- package/dist/chunk-XDIMTPZU.cjs +202 -0
- package/dist/chunk-XDIMTPZU.cjs.map +1 -0
- package/dist/chunk-XVW5DPPP.js +429 -0
- package/dist/chunk-XVW5DPPP.js.map +1 -0
- package/dist/chunk-Y4E2WRUR.cjs +188 -0
- package/dist/chunk-Y4E2WRUR.cjs.map +1 -0
- package/dist/chunk-Y4QNLW7W.js +300 -0
- package/dist/chunk-Y4QNLW7W.js.map +1 -0
- package/dist/{chunk-KZFBQ7GY.js → chunk-YU55JD35.js} +3 -3
- package/dist/{chunk-KZFBQ7GY.js.map → chunk-YU55JD35.js.map} +1 -1
- package/dist/{chunk-OD47TTAW.cjs → chunk-Z4JR23IB.cjs} +9 -9
- package/dist/{chunk-OD47TTAW.cjs.map → chunk-Z4JR23IB.cjs.map} +1 -1
- package/dist/{chunk-3M7TAXNR.js → chunk-ZTW4KODY.js} +3 -3
- package/dist/{chunk-3M7TAXNR.js.map → chunk-ZTW4KODY.js.map} +1 -1
- package/dist/{chunk-3QGS6CXD.js → chunk-ZYL4SNOR.js} +3 -3
- package/dist/{chunk-3QGS6CXD.js.map → chunk-ZYL4SNOR.js.map} +1 -1
- package/dist/components/Alert/index.d.cts +1 -1
- package/dist/components/Alert/index.d.ts +1 -1
- package/dist/components/AlertDialog/index.cjs +6 -5
- package/dist/components/AlertDialog/index.d.cts +28 -3
- package/dist/components/AlertDialog/index.d.ts +28 -3
- package/dist/components/AlertDialog/index.js +5 -4
- package/dist/components/AudioRecorder/index.d.cts +2 -2
- package/dist/components/AudioRecorder/index.d.ts +2 -2
- package/dist/components/Autocomplete/index.d.cts +8 -2
- package/dist/components/Autocomplete/index.d.ts +8 -2
- package/dist/components/Avatar/index.d.cts +1 -1
- package/dist/components/Avatar/index.d.ts +1 -1
- package/dist/components/Badge/index.d.cts +1 -1
- package/dist/components/Badge/index.d.ts +1 -1
- package/dist/components/BoardView/index.cjs +24 -0
- package/dist/components/BoardView/index.cjs.map +1 -0
- package/dist/components/BoardView/index.d.cts +129 -0
- package/dist/components/BoardView/index.d.ts +129 -0
- package/dist/components/BoardView/index.js +7 -0
- package/dist/components/BoardView/index.js.map +1 -0
- package/dist/components/Button/index.cjs +4 -3
- package/dist/components/Button/index.d.cts +2 -1
- package/dist/components/Button/index.d.ts +2 -1
- package/dist/components/Button/index.js +2 -1
- package/dist/components/CalendarView/index.cjs +23 -0
- package/dist/components/CalendarView/index.cjs.map +1 -0
- package/dist/components/CalendarView/index.d.cts +39 -0
- package/dist/components/CalendarView/index.d.ts +39 -0
- package/dist/components/CalendarView/index.js +10 -0
- package/dist/components/CalendarView/index.js.map +1 -0
- package/dist/components/Card/index.d.cts +3 -3
- package/dist/components/Card/index.d.ts +3 -3
- package/dist/components/Collapsible/index.cjs +5 -5
- package/dist/components/Collapsible/index.js +2 -2
- package/dist/components/CustomizableDashboard/index.cjs +10 -9
- package/dist/components/CustomizableDashboard/index.js +3 -2
- package/dist/components/Dropdown/index.cjs +9 -9
- package/dist/components/Dropdown/index.d.cts +2 -1
- package/dist/components/Dropdown/index.d.ts +2 -1
- package/dist/components/Dropdown/index.js +2 -2
- package/dist/components/FloatingWindow/index.cjs +5 -4
- package/dist/components/FloatingWindow/index.js +3 -2
- package/dist/components/GanttView/index.cjs +20 -0
- package/dist/components/GanttView/index.cjs.map +1 -0
- package/dist/components/GanttView/index.d.cts +36 -0
- package/dist/components/GanttView/index.d.ts +36 -0
- package/dist/components/GanttView/index.js +7 -0
- package/dist/components/GanttView/index.js.map +1 -0
- package/dist/components/KeyboardShortcutsOverlay/index.cjs +5 -5
- package/dist/components/KeyboardShortcutsOverlay/index.js +3 -3
- package/dist/components/ListView/index.cjs +23 -0
- package/dist/components/ListView/index.cjs.map +1 -0
- package/dist/components/ListView/index.d.cts +124 -0
- package/dist/components/ListView/index.d.ts +124 -0
- package/dist/components/ListView/index.js +10 -0
- package/dist/components/ListView/index.js.map +1 -0
- package/dist/components/Markdown/index.cjs +20 -19
- package/dist/components/Markdown/index.js +8 -7
- package/dist/components/MediaEditor/index.cjs +11 -10
- package/dist/components/MediaEditor/index.d.cts +91 -2
- package/dist/components/MediaEditor/index.d.ts +91 -2
- package/dist/components/MediaEditor/index.js +6 -5
- package/dist/components/MediaPlayer/index.cjs +6 -5
- package/dist/components/MediaPlayer/index.d.cts +1 -1
- package/dist/components/MediaPlayer/index.d.ts +1 -1
- package/dist/components/MediaPlayer/index.js +3 -2
- package/dist/components/MegaMenu/index.cjs +6 -5
- package/dist/components/MegaMenu/index.js +3 -2
- package/dist/components/Modal/index.cjs +10 -10
- package/dist/components/Modal/index.js +2 -2
- package/dist/components/Pagination/index.d.cts +1 -1
- package/dist/components/Pagination/index.d.ts +1 -1
- package/dist/components/PhoneInput/index.d.cts +36 -3
- package/dist/components/PhoneInput/index.d.ts +36 -3
- package/dist/components/Progress/index.d.cts +1 -1
- package/dist/components/Progress/index.d.ts +1 -1
- package/dist/components/Q/index.d.cts +2 -2
- package/dist/components/Q/index.d.ts +2 -2
- package/dist/components/QuickAction/index.d.cts +1 -1
- package/dist/components/QuickAction/index.d.ts +1 -1
- package/dist/components/RadialExplorer/index.cjs +4 -3
- package/dist/components/RadialExplorer/index.js +3 -2
- package/dist/components/RecordButton/index.d.cts +1 -1
- package/dist/components/RecordButton/index.d.ts +1 -1
- package/dist/components/RichTextEditor/index.cjs +8 -7
- package/dist/components/RichTextEditor/index.d.cts +7 -2
- package/dist/components/RichTextEditor/index.d.ts +7 -2
- package/dist/components/RichTextEditor/index.js +5 -4
- package/dist/components/ScrollArea/index.d.cts +1 -1
- package/dist/components/ScrollArea/index.d.ts +1 -1
- package/dist/components/SectionSpyNav/index.cjs +4 -3
- package/dist/components/SectionSpyNav/index.js +3 -2
- package/dist/components/Select/index.d.cts +1 -2
- package/dist/components/Select/index.d.ts +1 -2
- package/dist/components/Skeleton/index.d.cts +1 -1
- package/dist/components/Skeleton/index.d.ts +1 -1
- package/dist/components/Slider/index.d.cts +2 -2
- package/dist/components/Slider/index.d.ts +2 -2
- package/dist/components/Spinner/index.d.cts +2 -2
- package/dist/components/Spinner/index.d.ts +2 -2
- package/dist/components/SuperChat/index.cjs +478 -281
- package/dist/components/SuperChat/index.cjs.map +1 -1
- package/dist/components/SuperChat/index.d.cts +2 -4
- package/dist/components/SuperChat/index.d.ts +2 -4
- package/dist/components/SuperChat/index.js +468 -271
- package/dist/components/SuperChat/index.js.map +1 -1
- package/dist/components/SuperChat/plugins/index.cjs +5 -5
- package/dist/components/SuperChat/plugins/index.d.cts +2 -3
- package/dist/components/SuperChat/plugins/index.d.ts +2 -3
- package/dist/components/SuperChat/plugins/index.js +4 -4
- package/dist/components/Text/index.d.cts +3 -3
- package/dist/components/Text/index.d.ts +3 -3
- package/dist/components/Textarea/index.d.cts +1 -2
- package/dist/components/Textarea/index.d.ts +1 -2
- package/dist/components/ThemeProvider/index.d.cts +3 -1
- package/dist/components/ThemeProvider/index.d.ts +3 -1
- package/dist/components/TranscriptView/index.d.cts +85 -4
- package/dist/components/TranscriptView/index.d.ts +85 -4
- package/dist/components/ViewSet/index.cjs +24 -0
- package/dist/components/ViewSet/index.cjs.map +1 -0
- package/dist/components/ViewSet/index.d.cts +300 -0
- package/dist/components/ViewSet/index.d.ts +300 -0
- package/dist/components/ViewSet/index.js +15 -0
- package/dist/components/ViewSet/index.js.map +1 -0
- package/dist/components/ViewSwitcher/index.cjs +20 -0
- package/dist/components/ViewSwitcher/index.cjs.map +1 -0
- package/dist/components/ViewSwitcher/index.d.cts +57 -0
- package/dist/components/ViewSwitcher/index.d.ts +57 -0
- package/dist/components/ViewSwitcher/index.js +7 -0
- package/dist/components/ViewSwitcher/index.js.map +1 -0
- package/dist/datavis.cjs +3 -2
- package/dist/datavis.cjs.map +1 -1
- package/dist/datavis.d.cts +167 -13
- package/dist/datavis.d.ts +167 -13
- package/dist/datavis.js +2 -1
- package/dist/datavis.js.map +1 -1
- package/dist/esheet.cjs +9 -8
- package/dist/esheet.cjs.map +1 -1
- package/dist/esheet.d.cts +183 -1
- package/dist/esheet.d.ts +183 -1
- package/dist/esheet.js +6 -5
- package/dist/esheet.js.map +1 -1
- package/dist/hooks/index.cjs +49 -16
- package/dist/hooks/index.d.cts +590 -31
- package/dist/hooks/index.d.ts +590 -31
- package/dist/hooks/index.js +3 -2
- package/dist/index.cjs +1375 -1088
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +8596 -683
- package/dist/index.d.ts +8596 -683
- package/dist/index.js +433 -340
- package/dist/index.js.map +1 -1
- package/dist/kerebron.cjs +58 -19
- package/dist/kerebron.cjs.map +1 -1
- package/dist/kerebron.d.cts +37 -0
- package/dist/kerebron.d.ts +37 -0
- package/dist/kerebron.js +58 -19
- package/dist/kerebron.js.map +1 -1
- package/dist/motion.cjs +7 -7
- package/dist/motion.d.cts +186 -2
- package/dist/motion.d.ts +186 -2
- package/dist/motion.js +2 -2
- package/dist/q.d.cts +25 -3
- package/dist/q.d.ts +25 -3
- package/dist/{speaker-verify-5GTWAN5Y.cjs → speaker-verify-4NEJAK6C.cjs} +57 -90
- package/dist/speaker-verify-4NEJAK6C.cjs.map +1 -0
- package/dist/{speaker-verify-R67P433H.js → speaker-verify-AWSKI6DI.js} +57 -90
- package/dist/speaker-verify-AWSKI6DI.js.map +1 -0
- package/dist/styles/effects.css +33 -0
- package/dist/styles.css +1 -1
- package/dist/tailwind-preset.cjs +4 -4
- package/dist/tailwind-preset.js +1 -1
- package/dist/templates.cjs +103 -0
- package/dist/templates.cjs.map +1 -0
- package/dist/templates.d.cts +560 -0
- package/dist/templates.d.ts +560 -0
- package/dist/templates.js +10 -0
- package/dist/templates.js.map +1 -0
- package/dist/types-C3HQe74F.d.cts +86 -0
- package/dist/types-C3HQe74F.d.ts +86 -0
- package/dist/{types-B97JNRNQ.d.cts → types-DOxdTwmq.d.cts} +170 -2
- package/dist/{types-gZXrfLj6.d.ts → types-DOxdTwmq.d.ts} +170 -2
- package/dist/utils/index.d.cts +13 -2
- package/dist/utils/index.d.ts +13 -2
- package/package.json +21 -4
- package/dist/Animated-XmH6k8pZ.d.cts +0 -188
- package/dist/Animated-XmH6k8pZ.d.ts +0 -188
- package/dist/CsvBlock-ROJCKJDP.cjs +0 -16
- package/dist/CsvBlock-UWPMTLE2.js +0 -7
- package/dist/HtmlPreviewBlock-DWFN6EUB.cjs +0 -16
- package/dist/HtmlPreviewBlock-ME5U3XNS.js +0 -7
- package/dist/MedicationEditor-Bp4NLy7y.d.cts +0 -352
- package/dist/MedicationEditor-Bp4NLy7y.d.ts +0 -352
- package/dist/MermaidBlock-2B6CPD6Y.js +0 -7
- package/dist/MermaidBlock-D2UC5M55.cjs +0 -16
- package/dist/SurveyBlock-4CD4AYMJ.cjs +0 -16
- package/dist/SurveyBlock-4DO62RBT.js +0 -7
- package/dist/chunk-22CYDCXA.js.map +0 -1
- package/dist/chunk-ACCAXVOG.js.map +0 -1
- package/dist/chunk-GOALNQZ2.js.map +0 -1
- package/dist/chunk-JHULS3EC.js.map +0 -1
- package/dist/chunk-JI244Y7C.js.map +0 -1
- package/dist/chunk-NV2CWBI2.cjs.map +0 -1
- package/dist/chunk-U42F3HLE.cjs.map +0 -1
- package/dist/chunk-VNYW4C4J.cjs.map +0 -1
- package/dist/chunk-WIAQQNFU.cjs.map +0 -1
- package/dist/chunk-WNAA6CLE.cjs.map +0 -1
- package/dist/chunk-X4XPNTCZ.cjs.map +0 -1
- package/dist/chunk-XCP454Q6.js.map +0 -1
- package/dist/html-MdxqSzjD.d.cts +0 -13
- package/dist/html-MdxqSzjD.d.ts +0 -13
- package/dist/orderRows-BUJYgSc7.d.cts +0 -221
- package/dist/orderRows-BUJYgSc7.d.ts +0 -221
- package/dist/speaker-verify-5GTWAN5Y.cjs.map +0 -1
- package/dist/speaker-verify-R67P433H.js.map +0 -1
- package/dist/transcript-Cg7uSW-C.d.cts +0 -84
- package/dist/transcript-Cg7uSW-C.d.ts +0 -84
- package/dist/types-CnPEwzlp.d.cts +0 -254
- package/dist/types-CnPEwzlp.d.ts +0 -254
- package/dist/useAnchoredPosition-CKwLSQW8.d.cts +0 -76
- package/dist/useAnchoredPosition-CKwLSQW8.d.ts +0 -76
- package/dist/useTheme-B9SWu6ui.d.cts +0 -24
- package/dist/useTheme-B9SWu6ui.d.ts +0 -24
- package/dist/useTranscriptEdits-CGzlemHT.d.cts +0 -182
- package/dist/useTranscriptEdits-D32bLs0l.d.ts +0 -182
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/utils/own.ts","../src/templates/icons.tsx","../src/templates/Section.tsx","../src/components/ComparisonSection/ComparisonSection.tsx","../src/components/CtaSection/CtaSection.tsx","../src/components/FaqSection/FaqSection.tsx","../src/components/FeatureGridSection/FeatureGridSection.tsx","../src/components/HeroSection/HeroSection.tsx","../src/components/LeadFormSection/LeadFormSection.tsx","../src/components/LogoCloudSection/LogoCloudSection.tsx","../src/components/PricingSection/PricingSection.tsx","../src/components/ProcessStepsSection/ProcessStepsSection.tsx","../src/components/ResourceCardsSection/ResourceCardsSection.tsx","../src/components/SplitContentSection/SplitContentSection.tsx","../src/components/StatsSection/StatsSection.tsx","../src/components/TestimonialSection/TestimonialSection.tsx","../src/components/VideoSection/VideoSection.tsx","../src/components/LandingPage/LandingPage.tsx","../src/components/LandingPage/presets.ts"],"names":["jsx","React2","jsxs","React3","Fragment","React4","React5","ArrowRight","React6","CircleCheck","React7","React8","columnClass","React9","Check","React10","React11","React12","React13","TrendingUp","React14","React15","React16"],"mappings":"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","file":"chunk-KHSFJTEX.js","sourcesContent":["/**\n * `map[key]` restricted to own properties. Runtime page/CMS data supplies the\n * key, and a plain bracket lookup would also reach inherited\n * `Object.prototype` members — `\"toString\"` or `\"constructor\"` must resolve to\n * \"unknown\", not to a built-in function React then tries to render or call.\n */\nexport function ownProperty<T>(\n map: Record<string, T> | undefined,\n key: string\n): T | undefined {\n return map != null && Object.hasOwn(map, key) ? map[key] : undefined;\n}\n","import type * as React from 'react';\nimport {\n Activity,\n Award,\n BadgeCheck,\n Bell,\n Briefcase,\n Building2,\n Calendar,\n CalendarCheck,\n ChartColumn,\n ChartLine,\n CircleCheck,\n ClipboardCheck,\n Clock,\n Cloud,\n Database,\n DollarSign,\n Factory,\n FileText,\n FlaskConical,\n Globe,\n GraduationCap,\n Handshake,\n HardHat,\n Headset,\n HeartPulse,\n Hospital,\n Layers,\n Leaf,\n Lightbulb,\n Lock,\n Mail,\n MapPin,\n MessageSquare,\n Microscope,\n Phone,\n Plane,\n Plug,\n Rocket,\n Scale,\n Search,\n Settings,\n Shield,\n ShieldCheck,\n Smartphone,\n Sparkles,\n Stethoscope,\n Syringe,\n Target,\n Timer,\n TrendingUp,\n Truck,\n UserCheck,\n Users,\n Workflow,\n Wrench,\n Zap,\n} from 'lucide-react';\nimport { cn } from '../utils/cn';\nimport { ownProperty } from '../utils/own';\n\nexport type TemplateIconComponent = React.ComponentType<{\n className?: string;\n strokeWidth?: number;\n 'aria-hidden'?: boolean | 'true' | 'false';\n}>;\n\n/** Extra icon tokens a site maps to its own components; merged over the built-ins. */\nexport type TemplateIconRegistry = Record<string, TemplateIconComponent>;\n\n/**\n * Built-in icon tokens. Page data names an icon by token (`\"shield-check\"`)\n * rather than holding a component, so it stays JSON-serializable.\n */\nexport const templateIcons = {\n activity: Activity,\n award: Award,\n 'badge-check': BadgeCheck,\n bell: Bell,\n briefcase: Briefcase,\n building: Building2,\n calendar: Calendar,\n 'calendar-check': CalendarCheck,\n 'chart-column': ChartColumn,\n 'chart-line': ChartLine,\n 'circle-check': CircleCheck,\n 'clipboard-check': ClipboardCheck,\n clock: Clock,\n cloud: Cloud,\n database: Database,\n 'dollar-sign': DollarSign,\n factory: Factory,\n 'file-text': FileText,\n flask: FlaskConical,\n globe: Globe,\n 'graduation-cap': GraduationCap,\n handshake: Handshake,\n 'hard-hat': HardHat,\n headset: Headset,\n 'heart-pulse': HeartPulse,\n hospital: Hospital,\n layers: Layers,\n leaf: Leaf,\n lightbulb: Lightbulb,\n lock: Lock,\n mail: Mail,\n 'map-pin': MapPin,\n 'message-square': MessageSquare,\n microscope: Microscope,\n phone: Phone,\n plane: Plane,\n plug: Plug,\n rocket: Rocket,\n scale: Scale,\n search: Search,\n settings: Settings,\n shield: Shield,\n 'shield-check': ShieldCheck,\n smartphone: Smartphone,\n sparkles: Sparkles,\n stethoscope: Stethoscope,\n syringe: Syringe,\n target: Target,\n timer: Timer,\n 'trending-up': TrendingUp,\n truck: Truck,\n 'user-check': UserCheck,\n users: Users,\n workflow: Workflow,\n wrench: Wrench,\n zap: Zap,\n} satisfies TemplateIconRegistry;\n\nexport type TemplateIconName = keyof typeof templateIcons;\n\nexport interface TemplateIconProps {\n /** A built-in token, a token from `icons`, or a lettermark of up to four characters. */\n name: string;\n icons?: TemplateIconRegistry;\n className?: string;\n}\n\nexport function TemplateIcon({ name, icons, className }: TemplateIconProps) {\n // Icon names are page/CMS data — own properties only, or \"toString\" would\n // resolve to a prototype method instead of the lettermark/null fallback.\n const Icon =\n ownProperty(icons, name) ??\n ownProperty(templateIcons as TemplateIconRegistry, name);\n if (Icon)\n return (\n <Icon\n aria-hidden=\"true\"\n strokeWidth={1.75}\n className={cn('size-5', className)}\n />\n );\n if (name.length <= 4)\n return (\n <span\n aria-hidden=\"true\"\n className={cn('text-xs font-bold tracking-wide', className)}\n >\n {name}\n </span>\n );\n return null;\n}\n","import * as React from 'react';\nimport { ArrowRight } from 'lucide-react';\nimport { buttonVariants } from '../components/Button/button-variants';\nimport { cn } from '../utils/cn';\nimport { TemplateIcon, type TemplateIconRegistry } from './icons';\nimport type {\n SectionAlign,\n SectionTone,\n TemplateComponents,\n TemplateImageProps,\n TemplateLink,\n TemplateLinkProps,\n} from './types';\n\nconst toneSurface: Record<SectionTone, string> = {\n default: 'bg-background text-foreground',\n muted: 'bg-muted text-foreground',\n brand: 'bg-primary-900 text-white',\n};\n\nexport const toneClass = (tone: SectionTone) => toneSurface[tone];\n\n/** Card surface that reads correctly on the given section tone. */\nexport const cardClass = (tone: SectionTone) =>\n tone === 'brand'\n ? 'border border-white/15 bg-white/5 text-white'\n : 'border border-border bg-card text-card-foreground';\n\n// muted-foreground on bg-muted drops below AA in dark mode, so the muted tone mixes foreground instead.\nexport const mutedTextClass = (tone: SectionTone) =>\n tone === 'brand'\n ? 'text-white/80'\n : tone === 'muted'\n ? 'text-foreground/80'\n : 'text-muted-foreground';\n\n// Explicit, because host sites often colour h1–h4 in a base layer that beats inheritance.\nexport const headingTextClass = (tone: SectionTone) =>\n tone === 'brand' ? 'text-white' : 'text-foreground';\n\n// 800 (light) is the shade Button's primary fill already guarantees against white.\nexport const accentTextClass = (tone: SectionTone) =>\n tone === 'brand' ? 'text-white' : 'text-primary-800 dark:text-primary-300';\n\nexport const containerClass = (width: 'wide' | 'narrow' = 'wide') =>\n cn(\n 'mx-auto w-full px-4 sm:px-6 lg:px-8',\n width === 'narrow' ? 'max-w-3xl' : 'max-w-7xl'\n );\n\nconst SAFE_HREF_SCHEME = /^(?:https?|mailto|tel):/i;\n\n/**\n * A URL from page data, or `undefined` if its scheme is not http(s), mailto or\n * tel. Content/CMS URLs are untrusted, and a `javascript:` href is script\n * execution — React and site Link adapters render it verbatim.\n */\nexport function safeHref(href: string | undefined): string | undefined {\n if (href == null) return undefined;\n // Browsers drop tab/newline and leading controls when parsing, so\n // `java\\tscript:` still runs — match the scheme on the stripped value.\n // eslint-disable-next-line no-control-regex\n const stripped = href.replace(/[\\u0000-\\u0020]/g, '');\n // Blank means \"current document URL\" as a form action — not a real target.\n if (!stripped) return undefined;\n if (!/^[a-z][a-z0-9+.-]*:/i.test(stripped)) return href; // relative, hash, query, //\n return SAFE_HREF_SCHEME.test(stripped) ? href : undefined;\n}\n\n/** An anchor, or the site's `components.Link`, with `trackingId` as `data-track`. */\nexport function TemplateAnchor({\n components,\n trackingId,\n children,\n ...props\n}: TemplateLinkProps & {\n components?: TemplateComponents;\n trackingId?: string;\n}) {\n const Link = components?.Link;\n const href = safeHref(props.href);\n const all = { ...props, href, 'data-track': trackingId };\n // Adapters require an href (Next's Link throws), so a dropped one falls back\n // to an inert plain anchor.\n return Link && href != null ? (\n <Link {...all} href={href}>\n {children}\n </Link>\n ) : (\n <a {...all}>{children}</a>\n );\n}\n\n// React 18 only passes the lowercase attribute through; React 19 wants camelCase.\nconst fetchPriorityHigh = (\n React.version.startsWith('18.')\n ? { fetchpriority: 'high' }\n : { fetchPriority: 'high' }\n) as React.ImgHTMLAttributes<HTMLImageElement>;\n\n/** An `<img>`, or the site's `components.Image`. */\nexport function TemplateImg({\n components,\n priority,\n ...image\n}: TemplateImageProps & { components?: TemplateComponents }) {\n const Image = components?.Image;\n if (Image) return <Image {...image} priority={priority} />;\n return (\n <img\n {...image}\n alt={image.alt}\n loading={priority ? undefined : 'lazy'}\n {...(priority ? fetchPriorityHigh : {})}\n decoding=\"async\"\n />\n );\n}\n\nexport interface SectionHeadingProps {\n eyebrow?: string;\n title?: string;\n description?: string;\n /** Heading element. Sections use `h2`; only a page's hero is `h1`. */\n as?: 'h1' | 'h2' | 'h3';\n size?: 'section' | 'hero';\n align?: SectionAlign;\n tone?: SectionTone;\n titleId?: string;\n className?: string;\n}\n\n/** Eyebrow, heading and supporting text — the opener every landing section shares. */\nexport function SectionHeading({\n eyebrow,\n title,\n description,\n as: Heading = 'h2',\n size = 'section',\n align = 'start',\n tone = 'default',\n titleId,\n className,\n}: SectionHeadingProps) {\n if (!eyebrow && !title && !description) return null;\n return (\n <div\n data-slot=\"section-heading\"\n className={cn(\n 'max-w-3xl',\n align === 'center' && 'mx-auto text-center',\n className\n )}\n >\n {eyebrow && (\n <p\n className={cn(\n 'mb-3 text-sm font-semibold tracking-wider uppercase',\n accentTextClass(tone)\n )}\n >\n {eyebrow}\n </p>\n )}\n {title && (\n <Heading\n id={titleId}\n className={cn(\n 'font-bold tracking-tight text-balance',\n headingTextClass(tone),\n size === 'hero'\n ? 'text-4xl sm:text-5xl lg:text-6xl'\n : 'text-3xl sm:text-4xl'\n )}\n >\n {title}\n </Heading>\n )}\n {description && (\n <p\n className={cn(\n 'mt-4 text-pretty',\n size === 'hero' ? 'text-lg sm:text-xl' : 'text-lg',\n mutedTextClass(tone)\n )}\n >\n {description}\n </p>\n )}\n </div>\n );\n}\n\nexport interface SectionShellProps extends Omit<\n React.HTMLAttributes<HTMLElement>,\n 'title'\n> {\n eyebrow?: string;\n title?: string;\n description?: string;\n tone?: SectionTone;\n align?: SectionAlign;\n width?: 'wide' | 'narrow';\n spacing?: 'default' | 'compact';\n /** Accepted so sections can forward their props; the shell renders no links or images. */\n components?: TemplateComponents;\n}\n\n/**\n * The `<section>` + container + heading frame every landing section renders.\n * Exported so a site can build its own section that sits flush with the rest.\n */\nexport const SectionShell = React.forwardRef<HTMLElement, SectionShellProps>(\n (\n {\n eyebrow,\n title,\n description,\n tone = 'default',\n align = 'start',\n width = 'wide',\n spacing = 'default',\n className,\n children,\n components,\n ...rest\n },\n ref\n ) => {\n void components; // kept off the DOM\n const titleId = React.useId();\n return (\n <section\n ref={ref}\n data-slot=\"landing-section\"\n data-tone={tone}\n aria-labelledby={title ? titleId : undefined}\n className={cn(\n spacing === 'compact' ? 'py-10 sm:py-14' : 'py-16 sm:py-24',\n toneClass(tone),\n className\n )}\n {...rest}\n >\n <div className={containerClass(width)}>\n <SectionHeading\n eyebrow={eyebrow}\n title={title}\n description={description}\n align={align}\n tone={tone}\n titleId={titleId}\n className={cn(width === 'narrow' && 'max-w-none')}\n />\n {children}\n </div>\n </section>\n );\n }\n);\nSectionShell.displayName = 'SectionShell';\n\nexport interface CtaLinksProps {\n primary?: TemplateLink;\n secondary?: TemplateLink;\n tone?: SectionTone;\n align?: SectionAlign;\n className?: string;\n components?: TemplateComponents;\n}\n\n/** Primary + secondary calls to action as button-styled anchors. */\nexport function CtaLinks({\n primary,\n secondary,\n tone = 'default',\n align = 'start',\n className,\n components,\n}: CtaLinksProps) {\n if (!primary && !secondary) return null;\n const onBrand = tone === 'brand';\n // Long or translated labels must wrap rather than overflow on phones.\n const wrap = 'h-auto min-h-12 py-3 whitespace-normal text-center';\n return (\n <div\n data-slot=\"cta-links\"\n className={cn(\n 'flex flex-col gap-3 sm:flex-row sm:flex-wrap',\n align === 'center' && 'sm:justify-center',\n className\n )}\n >\n {primary && (\n <TemplateAnchor\n href={primary.href}\n trackingId={primary.trackingId}\n components={components}\n data-slot=\"cta-primary\"\n className={cn(\n buttonVariants({ variant: 'primary', size: 'lg' }),\n wrap,\n onBrand &&\n 'text-primary-900 hover:bg-primary-50 active:bg-primary-100 bg-white'\n )}\n >\n {primary.label}\n <ArrowRight aria-hidden=\"true\" className=\"size-5 rtl:-scale-x-100\" />\n </TemplateAnchor>\n )}\n {secondary && (\n <TemplateAnchor\n href={secondary.href}\n trackingId={secondary.trackingId}\n components={components}\n data-slot=\"cta-secondary\"\n className={cn(\n buttonVariants({ variant: 'outline', size: 'lg' }),\n wrap,\n onBrand &&\n 'border-white/70 text-white hover:bg-white/10 hover:text-white dark:border-white/70 dark:text-white dark:hover:bg-white/10'\n )}\n >\n {secondary.label}\n </TemplateAnchor>\n )}\n </div>\n );\n}\n\nexport interface IconTileProps {\n name: string;\n icons?: TemplateIconRegistry;\n tone?: SectionTone;\n className?: string;\n}\n\nexport function IconTile({\n name,\n icons,\n tone = 'default',\n className,\n}: IconTileProps) {\n return (\n <span\n data-slot=\"icon-tile\"\n className={cn(\n 'inline-flex size-11 shrink-0 items-center justify-center rounded-xl',\n tone === 'brand'\n ? 'bg-white/10 text-white'\n : 'bg-primary-100 text-primary-900 dark:bg-primary-900/60 dark:text-primary-200',\n className\n )}\n >\n <TemplateIcon name={name} icons={icons} />\n </span>\n );\n}\n","import * as React from 'react';\nimport { Check, X } from 'lucide-react';\nimport { cn } from '../../utils/cn';\nimport {\n SectionShell,\n cardClass,\n mutedTextClass,\n} from '../../templates/Section';\nimport type { SectionBaseProps } from '../../templates/types';\n\nexport interface ComparisonRow {\n feature: string;\n /** One value per column: `true`/`false` render as included/not included, strings render as text. */\n values: (boolean | string)[];\n}\n\nexport interface ComparisonSectionLabels {\n /** Header of the first column. */\n feature?: string;\n /** Screen-reader text for a `true` cell. */\n included?: string;\n /** Screen-reader text for a `false` cell. */\n notIncluded?: string;\n}\n\nexport interface ComparisonSectionProps extends SectionBaseProps {\n /** Value column headers, e.g. `[\"Without BlueHive\", \"With BlueHive\"]`. */\n columns: string[];\n rows: ComparisonRow[];\n /** Index into `columns` to emphasise — usually your product. */\n highlightColumn?: number;\n labels?: ComparisonSectionLabels;\n}\n\nconst cellClass = 'px-3 py-3 sm:px-5 sm:py-4';\n\nexport const ComparisonSection = React.forwardRef<\n HTMLElement,\n ComparisonSectionProps\n>(\n (\n {\n columns,\n rows,\n highlightColumn,\n labels,\n title,\n tone = 'default',\n align = 'center',\n ...rest\n },\n ref\n ) => {\n const renderValue = (value: boolean | string) =>\n typeof value === 'string' ? (\n value\n ) : value ? (\n <>\n <Check\n aria-hidden=\"true\"\n className=\"text-success mx-auto size-5\"\n strokeWidth={2.5}\n />\n <span className=\"sr-only\">{labels?.included ?? 'Included'}</span>\n </>\n ) : (\n <>\n <X\n aria-hidden=\"true\"\n className={cn('mx-auto size-5', mutedTextClass(tone))}\n />\n <span className=\"sr-only\">\n {labels?.notIncluded ?? 'Not included'}\n </span>\n </>\n );\n return (\n <SectionShell\n ref={ref}\n data-slot=\"comparison-section\"\n title={title}\n tone={tone}\n align={align}\n {...rest}\n >\n <div\n className={cn('mt-12 overflow-x-auto rounded-2xl', cardClass(tone))}\n >\n <table\n className={cn(\n 'w-full border-collapse text-start',\n // Two value columns fit a phone; more scroll sideways.\n columns.length > 2 && 'min-w-[36rem]'\n )}\n >\n {title && <caption className=\"sr-only\">{title}</caption>}\n <thead>\n <tr>\n <th\n scope=\"col\"\n className={cn(cellClass, 'text-start text-sm font-semibold')}\n >\n {labels?.feature ?? 'Feature'}\n </th>\n {columns.map((column, i) => (\n <th\n key={column}\n scope=\"col\"\n className={cn(\n cellClass,\n 'text-center text-sm font-semibold',\n i === highlightColumn && 'bg-primary-800 text-white'\n )}\n >\n {column}\n </th>\n ))}\n </tr>\n </thead>\n <tbody>\n {rows.map((row) => (\n <tr\n key={row.feature}\n className={cn(\n 'border-t',\n tone === 'brand' ? 'border-white/15' : 'border-border'\n )}\n >\n <th\n scope=\"row\"\n className={cn(cellClass, 'text-start font-medium')}\n >\n {row.feature}\n </th>\n {/* One cell per column, so a short or long `values` array can't skew the table. */}\n {columns.map((column, i) => (\n <td\n key={column}\n className={cn(\n cellClass,\n 'text-center text-sm',\n i === highlightColumn &&\n 'bg-primary-500/10 font-semibold'\n )}\n >\n {renderValue(row.values[i] ?? '')}\n </td>\n ))}\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n </SectionShell>\n );\n }\n);\nComparisonSection.displayName = 'ComparisonSection';\n","import * as React from 'react';\nimport { cn } from '../../utils/cn';\nimport {\n CtaLinks,\n SectionHeading,\n containerClass,\n mutedTextClass,\n toneClass,\n} from '../../templates/Section';\nimport type { SectionBaseProps, TemplateLink } from '../../templates/types';\n\nexport interface CtaSectionProps extends SectionBaseProps {\n title: string;\n primaryCta?: TemplateLink;\n secondaryCta?: TemplateLink;\n /** Small print under the buttons (\"Setup takes about 10 minutes\"). */\n note?: string;\n /** `band` fills the section with `tone`; `panel` floats a rounded card of `tone` on the page background. */\n layout?: 'band' | 'panel';\n}\n\nexport const CtaSection = React.forwardRef<HTMLElement, CtaSectionProps>(\n (\n {\n eyebrow,\n title,\n description,\n primaryCta,\n secondaryCta,\n note,\n tone = 'brand',\n align = 'center',\n layout = 'band',\n components,\n className,\n ...rest\n },\n ref\n ) => {\n const titleId = React.useId();\n const body = (\n <>\n <SectionHeading\n eyebrow={eyebrow}\n title={title}\n description={description}\n align={align}\n tone={tone}\n titleId={titleId}\n />\n <CtaLinks\n primary={primaryCta}\n secondary={secondaryCta}\n tone={tone}\n align={align}\n components={components}\n className=\"mt-8\"\n />\n {note && (\n <p\n className={cn(\n 'mt-4 text-sm',\n mutedTextClass(tone),\n align === 'center' && 'text-center'\n )}\n >\n {note}\n </p>\n )}\n </>\n );\n return (\n <section\n ref={ref}\n data-slot=\"cta-section\"\n data-tone={tone}\n aria-labelledby={titleId}\n className={cn(\n 'py-16 sm:py-24',\n layout === 'band' ? toneClass(tone) : 'bg-background',\n className\n )}\n {...rest}\n >\n <div className={containerClass()}>\n {layout === 'panel' ? (\n <div\n className={cn(\n 'rounded-3xl px-6 py-12 sm:px-12 sm:py-16',\n toneClass(tone),\n tone !== 'brand' && 'border-border border'\n )}\n >\n {body}\n </div>\n ) : (\n body\n )}\n </div>\n </section>\n );\n }\n);\nCtaSection.displayName = 'CtaSection';\n","import * as React from 'react';\nimport { ChevronDown } from 'lucide-react';\nimport { cn } from '../../utils/cn';\nimport {\n SectionShell,\n cardClass,\n mutedTextClass,\n} from '../../templates/Section';\nimport type { SectionBaseProps } from '../../templates/types';\n\nexport interface FaqItem {\n question: string;\n /** Plain text; line breaks are preserved. */\n answer: string;\n /** Anchor id so a link can open straight to this answer. */\n id?: string;\n}\n\nexport interface FaqSectionProps extends SectionBaseProps {\n items: FaqItem[];\n}\n\nexport const FaqSection = React.forwardRef<HTMLElement, FaqSectionProps>(\n ({ items, tone = 'default', align = 'center', ...rest }, ref) => (\n <SectionShell\n ref={ref}\n data-slot=\"faq-section\"\n tone={tone}\n align={align}\n width=\"narrow\"\n {...rest}\n >\n <div className=\"mt-10 space-y-3\">\n {items.map((item) => (\n <details\n key={item.id ?? item.question}\n id={item.id}\n className={cn('group rounded-xl', cardClass(tone))}\n >\n <summary\n className={cn(\n 'flex cursor-pointer list-none items-center justify-between gap-4 rounded-xl px-5 py-4 text-start font-semibold',\n 'focus-visible:ring-ring focus-visible:ring-2 focus-visible:outline-none',\n '[&::-webkit-details-marker]:hidden'\n )}\n >\n {item.question}\n <ChevronDown\n aria-hidden=\"true\"\n className=\"size-5 shrink-0 transition-transform group-open:rotate-180 motion-reduce:transition-none\"\n />\n </summary>\n <div\n className={cn(\n 'px-5 pb-5 whitespace-pre-line',\n mutedTextClass(tone)\n )}\n >\n {item.answer}\n </div>\n </details>\n ))}\n </div>\n </SectionShell>\n )\n);\nFaqSection.displayName = 'FaqSection';\n","import * as React from 'react';\nimport { ArrowRight } from 'lucide-react';\nimport { cn } from '../../utils/cn';\nimport {\n IconTile,\n SectionShell,\n TemplateAnchor,\n accentTextClass,\n cardClass,\n headingTextClass,\n mutedTextClass,\n} from '../../templates/Section';\nimport type { TemplateIconRegistry } from '../../templates/icons';\nimport type { SectionBaseProps, TemplateLink } from '../../templates/types';\n\nexport interface FeatureItem {\n title: string;\n description: string;\n /** Icon token (see `templateIcons`) or a lettermark such as `\"EHR\"`. */\n icon?: string;\n /** Small label above the title. */\n tag?: string;\n link?: TemplateLink;\n}\n\nexport interface FeatureGridSectionProps extends SectionBaseProps {\n features: FeatureItem[];\n columns?: 2 | 3 | 4;\n /** `cards` frames each item; `plain` sets them straight on the section. */\n variant?: 'cards' | 'plain';\n icons?: TemplateIconRegistry;\n}\n\nconst columnClass = {\n 2: 'lg:grid-cols-2',\n 3: 'lg:grid-cols-3',\n 4: 'lg:grid-cols-4',\n} as const;\n\nexport const FeatureGridSection = React.forwardRef<\n HTMLElement,\n FeatureGridSectionProps\n>(\n (\n {\n features,\n columns = 3,\n variant = 'cards',\n icons,\n tone = 'default',\n align = 'start',\n components,\n ...rest\n },\n ref\n ) => (\n <SectionShell\n ref={ref}\n data-slot=\"feature-grid-section\"\n tone={tone}\n align={align}\n {...rest}\n >\n <ul\n className={cn('mt-12 grid gap-6 sm:grid-cols-2', columnClass[columns])}\n >\n {features.map((feature) => (\n <li\n key={feature.title}\n className={cn(\n 'flex flex-col gap-3',\n variant === 'cards' && cn('rounded-2xl p-6', cardClass(tone))\n )}\n >\n {feature.icon && (\n <IconTile name={feature.icon} icons={icons} tone={tone} />\n )}\n {feature.tag && (\n <p\n className={cn(\n 'text-xs font-semibold tracking-wider uppercase',\n accentTextClass(tone)\n )}\n >\n {feature.tag}\n </p>\n )}\n <h3 className={cn('text-lg font-semibold', headingTextClass(tone))}>\n {feature.title}\n </h3>\n <p className={mutedTextClass(tone)}>{feature.description}</p>\n {feature.link && (\n <TemplateAnchor\n href={feature.link.href}\n trackingId={feature.link.trackingId}\n components={components}\n className={cn(\n 'mt-auto inline-flex items-center gap-1 font-semibold hover:underline',\n accentTextClass(tone)\n )}\n >\n {feature.link.label}\n <ArrowRight\n aria-hidden=\"true\"\n className=\"size-4 rtl:-scale-x-100\"\n />\n </TemplateAnchor>\n )}\n </li>\n ))}\n </ul>\n </SectionShell>\n )\n);\nFeatureGridSection.displayName = 'FeatureGridSection';\n","import * as React from 'react';\nimport { ChevronRight, CircleCheck } from 'lucide-react';\nimport { cn } from '../../utils/cn';\nimport {\n CtaLinks,\n SectionHeading,\n TemplateAnchor,\n TemplateImg,\n accentTextClass,\n containerClass,\n mutedTextClass,\n toneClass,\n} from '../../templates/Section';\nimport type {\n SectionBaseProps,\n TemplateImage,\n TemplateLink,\n} from '../../templates/types';\n\nexport interface HeroSectionLabels {\n /** Accessible name of the breadcrumb `<nav>`. */\n breadcrumb?: string;\n}\n\nexport interface HeroSectionProps extends Omit<SectionBaseProps, 'align'> {\n title: string;\n /** `split` puts copy beside `image`; `centered` stacks everything. */\n variant?: 'centered' | 'split';\n primaryCta?: TemplateLink;\n secondaryCta?: TemplateLink;\n /** Reassurance line under the calls to action (\"No credit card required\"). */\n ctaNote?: string;\n /** Short trust points rendered as a checked list. */\n highlights?: string[];\n image?: TemplateImage;\n /** Trail ending in the current page, which renders unlinked. */\n breadcrumbs?: TemplateLink[];\n /** A page has one `h1`; set `h2` when the page already renders its own. */\n headingLevel?: 'h1' | 'h2';\n labels?: HeroSectionLabels;\n}\n\nexport const HeroSection = React.forwardRef<HTMLElement, HeroSectionProps>(\n (\n {\n eyebrow,\n title,\n description,\n variant = 'centered',\n tone = 'default',\n primaryCta,\n secondaryCta,\n ctaNote,\n highlights,\n image,\n breadcrumbs,\n headingLevel = 'h1',\n labels,\n components,\n className,\n ...rest\n },\n ref\n ) => {\n const titleId = React.useId();\n const split = variant === 'split' && !!image;\n const align = split ? 'start' : 'center';\n return (\n <section\n ref={ref}\n data-slot=\"hero-section\"\n data-tone={tone}\n aria-labelledby={titleId}\n className={cn('py-16 sm:py-24 lg:py-28', toneClass(tone), className)}\n {...rest}\n >\n <div\n className={cn(\n containerClass(),\n split && 'grid items-center gap-12 lg:grid-cols-2'\n )}\n >\n <div className={cn(!split && 'flex flex-col items-center')}>\n {breadcrumbs && breadcrumbs.length > 0 && (\n <nav\n aria-label={labels?.breadcrumb ?? 'Breadcrumb'}\n className=\"mb-6\"\n >\n <ol\n className={cn(\n 'flex flex-wrap items-center gap-1 text-sm',\n mutedTextClass(tone),\n !split && 'justify-center'\n )}\n >\n {breadcrumbs.map((crumb, i) => {\n const last = i === breadcrumbs.length - 1;\n return (\n <li key={crumb.href} className=\"flex items-center gap-1\">\n {last ? (\n <span aria-current=\"page\">{crumb.label}</span>\n ) : (\n <>\n <TemplateAnchor\n href={crumb.href}\n trackingId={crumb.trackingId}\n components={components}\n className=\"hover:underline focus-visible:underline\"\n >\n {crumb.label}\n </TemplateAnchor>\n <ChevronRight\n aria-hidden=\"true\"\n className=\"size-4 rtl:-scale-x-100\"\n />\n </>\n )}\n </li>\n );\n })}\n </ol>\n </nav>\n )}\n <SectionHeading\n as={headingLevel}\n size=\"hero\"\n eyebrow={eyebrow}\n title={title}\n description={description}\n align={align}\n tone={tone}\n titleId={titleId}\n />\n <CtaLinks\n primary={primaryCta}\n secondary={secondaryCta}\n tone={tone}\n align={align}\n components={components}\n className=\"mt-8\"\n />\n {ctaNote && (\n <p className={cn('mt-4 text-sm', mutedTextClass(tone))}>\n {ctaNote}\n </p>\n )}\n {highlights && highlights.length > 0 && (\n <ul\n className={cn(\n 'mt-8 flex flex-wrap gap-x-6 gap-y-2 text-sm font-medium',\n !split && 'justify-center'\n )}\n >\n {highlights.map((item) => (\n <li key={item} className=\"flex items-center gap-2\">\n <CircleCheck\n aria-hidden=\"true\"\n className={cn('size-4 shrink-0', accentTextClass(tone))}\n />\n {item}\n </li>\n ))}\n </ul>\n )}\n </div>\n {image && (\n <TemplateImg\n {...image}\n priority\n components={components}\n className={cn(\n 'h-auto w-full rounded-2xl object-cover shadow-xl',\n !split && 'mx-auto mt-12 max-w-5xl'\n )}\n />\n )}\n </div>\n </section>\n );\n }\n);\nHeroSection.displayName = 'HeroSection';\n","import * as React from 'react';\nimport { cn } from '../../utils/cn';\nimport { buttonVariants } from '../Button/button-variants';\nimport { RequiredMark, inputVariants } from '../Input';\nimport {\n SectionHeading,\n cardClass,\n containerClass,\n mutedTextClass,\n safeHref,\n toneClass,\n} from '../../templates/Section';\nimport type { SectionBaseProps } from '../../templates/types';\n\nexport interface LeadFormField {\n name: string;\n label: string;\n type?: 'text' | 'email' | 'tel' | 'textarea' | 'select';\n required?: boolean;\n autoComplete?: string;\n placeholder?: string;\n /** Choices for `type: 'select'`. */\n options?: string[];\n /** `half` pairs two fields on one row from the `sm` breakpoint. */\n width?: 'full' | 'half';\n}\n\nexport interface LeadFormSectionProps extends Omit<\n SectionBaseProps,\n 'align' | 'onSubmit'\n> {\n title: string;\n /**\n * A URL, or a React form action such as a Next.js Server Action. A URL is\n * page data: if its scheme is not http(s), mailto or tel the section\n * renders nothing, so an executable action never reaches the form.\n */\n action: string | ((formData: FormData) => void | Promise<void>);\n /** Only used with a URL `action`. */\n method?: 'post' | 'get';\n fields?: LeadFormField[];\n /** Posted with the form, e.g. `{ source: 'industry-construction' }`. */\n hiddenFields?: Record<string, string>;\n submitLabel?: string;\n /** Privacy or consent line under the button. */\n note?: string;\n /** Rendered as `data-track` on the submit button. */\n submitTrackingId?: string;\n /** `split` puts the heading beside the form; `stacked` centres it above. */\n layout?: 'split' | 'stacked';\n}\n\nexport const defaultLeadFormFields: LeadFormField[] = [\n {\n name: 'firstName',\n label: 'First name',\n required: true,\n autoComplete: 'given-name',\n width: 'half',\n },\n {\n name: 'lastName',\n label: 'Last name',\n required: true,\n autoComplete: 'family-name',\n width: 'half',\n },\n {\n name: 'email',\n label: 'Work email',\n type: 'email',\n required: true,\n autoComplete: 'email',\n },\n {\n name: 'company',\n label: 'Company',\n required: true,\n autoComplete: 'organization',\n },\n];\n\nconst controlClass = cn(\n // Input's field styling (single source of truth for form controls); h-auto\n // and py-2.5 because this one class also sizes <textarea> and <select>.\n inputVariants({ size: 'md' }),\n 'block h-auto py-2.5'\n);\n\nexport const LeadFormSection = React.forwardRef<\n HTMLElement,\n LeadFormSectionProps\n>(\n (\n {\n eyebrow,\n title,\n description,\n action,\n method = 'post',\n fields = defaultLeadFormFields,\n hiddenFields,\n submitLabel = 'Submit',\n note,\n layout = 'split',\n tone = 'muted',\n submitTrackingId,\n components,\n className,\n ...rest\n },\n ref\n ) => {\n void components; // the form renders no links or images\n const baseId = React.useId();\n const titleId = `${baseId}-title`;\n const split = layout === 'split';\n // Same trust boundary as TemplateAnchor hrefs — and after the hooks, so\n // the hook count stays stable if `action` changes.\n const resolvedAction =\n typeof action === 'string' ? safeHref(action) : action;\n if (resolvedAction == null) return null;\n return (\n <section\n ref={ref}\n data-slot=\"lead-form-section\"\n data-tone={tone}\n aria-labelledby={titleId}\n className={cn('py-16 sm:py-24', toneClass(tone), className)}\n {...rest}\n >\n <div\n className={cn(\n containerClass(split ? 'wide' : 'narrow'),\n split && 'grid items-start gap-12 lg:grid-cols-2'\n )}\n >\n <SectionHeading\n eyebrow={eyebrow}\n title={title}\n description={description}\n align={split ? 'start' : 'center'}\n tone={tone}\n titleId={titleId}\n />\n <form\n action={resolvedAction}\n method={typeof resolvedAction === 'string' ? method : undefined}\n aria-labelledby={titleId}\n className={cn(\n 'grid gap-5 rounded-2xl p-6 sm:grid-cols-2 sm:p-8',\n // The form card always uses the theme surface so inputs stay legible on a brand band.\n cardClass('default'),\n !split && 'mt-10'\n )}\n >\n {hiddenFields &&\n Object.entries(hiddenFields).map(([name, value]) => (\n <input key={name} type=\"hidden\" name={name} value={value} />\n ))}\n {fields.map((field) => {\n const id = `${baseId}-${field.name}`;\n const common = {\n id,\n name: field.name,\n required: field.required,\n autoComplete: field.autoComplete,\n className: controlClass,\n };\n return (\n <div\n key={field.name}\n className={cn(field.width !== 'half' && 'sm:col-span-2')}\n >\n <label\n htmlFor={id}\n className=\"mb-1.5 block text-sm font-medium\"\n >\n {field.label}\n {field.required && <RequiredMark />}\n </label>\n {field.type === 'textarea' ? (\n <textarea\n {...common}\n rows={4}\n placeholder={field.placeholder}\n />\n ) : field.type === 'select' ? (\n <select {...common} defaultValue=\"\">\n <option value=\"\" disabled>\n {field.placeholder ?? ''}\n </option>\n {field.options?.map((option) => (\n <option key={option} value={option}>\n {option}\n </option>\n ))}\n </select>\n ) : (\n <input\n {...common}\n type={field.type ?? 'text'}\n placeholder={field.placeholder}\n />\n )}\n </div>\n );\n })}\n <div className=\"sm:col-span-2\">\n <button\n type=\"submit\"\n data-track={submitTrackingId}\n className={cn(\n buttonVariants({\n variant: 'primary',\n size: 'lg',\n fullWidth: true,\n }),\n 'h-auto min-h-12 py-3 whitespace-normal'\n )}\n >\n {submitLabel}\n </button>\n {note && (\n <p className={cn('mt-3 text-xs', mutedTextClass('default'))}>\n {note}\n </p>\n )}\n </div>\n </form>\n </div>\n </section>\n );\n }\n);\nLeadFormSection.displayName = 'LeadFormSection';\n","import * as React from 'react';\nimport { cn } from '../../utils/cn';\nimport {\n SectionShell,\n TemplateAnchor,\n mutedTextClass,\n} from '../../templates/Section';\nimport type {\n SectionBaseProps,\n TemplateComponents,\n} from '../../templates/types';\n\nexport interface LogoItem {\n name: string;\n /** Logo image; without it the name renders as a wordmark. */\n src?: string;\n href?: string;\n trackingId?: string;\n}\n\nexport interface LogoCloudSectionProps extends SectionBaseProps {\n logos: LogoItem[];\n /** `marquee` loops the row horizontally; it holds still under reduced motion. */\n variant?: 'grid' | 'marquee';\n speed?: 'slow' | 'normal' | 'fast';\n}\n\nconst duration = { slow: '60s', normal: '40s', fast: '25s' } as const;\n\nfunction Logo({\n logo,\n tone,\n hidden,\n components,\n}: {\n logo: LogoItem;\n tone: LogoCloudSectionProps['tone'];\n hidden?: boolean;\n components?: TemplateComponents;\n}) {\n // Plain <img>: logos have no intrinsic size to hand an image optimizer.\n const mark = logo.src ? (\n <img\n src={logo.src}\n alt={hidden ? '' : logo.name}\n loading=\"lazy\"\n decoding=\"async\"\n className={cn(\n 'h-8 w-auto max-w-[9rem] object-contain opacity-70 grayscale transition hover:opacity-100 hover:grayscale-0',\n // Logos are drawn white on dark surfaces so dark wordmarks stay visible.\n tone === 'brand'\n ? 'brightness-0 invert'\n : 'dark:brightness-0 dark:invert'\n )}\n />\n ) : (\n <span\n className={cn(\n 'text-lg font-semibold whitespace-nowrap',\n mutedTextClass(tone ?? 'default')\n )}\n >\n {logo.name}\n </span>\n );\n return logo.href ? (\n <TemplateAnchor\n href={logo.href}\n trackingId={logo.trackingId}\n components={components}\n tabIndex={hidden ? -1 : undefined}\n className=\"focus-visible:ring-ring inline-flex rounded focus-visible:ring-2 focus-visible:outline-none\"\n >\n {mark}\n </TemplateAnchor>\n ) : (\n mark\n );\n}\n\nexport const LogoCloudSection = React.forwardRef<\n HTMLElement,\n LogoCloudSectionProps\n>(\n (\n {\n logos,\n variant = 'grid',\n speed = 'normal',\n tone = 'default',\n align = 'center',\n components,\n ...rest\n },\n ref\n ) => (\n <SectionShell\n ref={ref}\n data-slot=\"logo-cloud-section\"\n tone={tone}\n align={align}\n spacing=\"compact\"\n {...rest}\n >\n {variant === 'marquee' ? (\n <div\n className=\"mie-marquee-host mt-8 overflow-hidden [mask-image:linear-gradient(90deg,transparent,black_10%,black_90%,transparent)]\"\n style={\n { '--mie-marquee-duration': duration[speed] } as React.CSSProperties\n }\n >\n <ul className=\"mie-marquee flex w-max items-center\">\n {logos.map((logo) => (\n <li key={logo.name} className=\"shrink-0 pe-12\">\n <Logo logo={logo} tone={tone} components={components} />\n </li>\n ))}\n {/* Second copy completes the loop; hidden from assistive tech. */}\n {logos.map((logo) => (\n <li\n key={`${logo.name}-copy`}\n data-duplicate=\"\"\n aria-hidden=\"true\"\n className=\"shrink-0 pe-12\"\n >\n <Logo logo={logo} tone={tone} components={components} hidden />\n </li>\n ))}\n </ul>\n </div>\n ) : (\n <ul className=\"mt-8 flex flex-wrap items-center justify-center gap-x-12 gap-y-8\">\n {logos.map((logo) => (\n <li key={logo.name}>\n <Logo logo={logo} tone={tone} components={components} />\n </li>\n ))}\n </ul>\n )}\n </SectionShell>\n )\n);\nLogoCloudSection.displayName = 'LogoCloudSection';\n","import * as React from 'react';\nimport { Check } from 'lucide-react';\nimport { cn } from '../../utils/cn';\nimport { Badge } from '../Badge';\nimport {\n SectionShell,\n TemplateAnchor,\n accentTextClass,\n cardClass,\n headingTextClass,\n mutedTextClass,\n} from '../../templates/Section';\nimport { buttonVariants } from '../Button/button-variants';\nimport type { SectionBaseProps, TemplateLink } from '../../templates/types';\n\nexport interface PricingPlan {\n name: string;\n /** Display price as written, e.g. \"$49\", \"Custom\" or \"Free\". */\n price: string;\n /** Billing unit after the price, e.g. \"per employee / month\". */\n period?: string;\n description?: string;\n features: string[];\n cta?: TemplateLink;\n /** Emphasise this plan and show `badge`. */\n highlighted?: boolean;\n badge?: string;\n}\n\nexport interface PricingSectionProps extends SectionBaseProps {\n plans: PricingPlan[];\n /** Small print under the plans (taxes, contract terms). */\n note?: string;\n}\n\nconst columnClass = [\n '',\n 'lg:grid-cols-1',\n 'lg:grid-cols-2',\n 'lg:grid-cols-3',\n 'lg:grid-cols-4',\n] as const;\n\nexport const PricingSection = React.forwardRef<\n HTMLElement,\n PricingSectionProps\n>(\n (\n { plans, note, tone = 'default', align = 'center', components, ...rest },\n ref\n ) => (\n <SectionShell\n ref={ref}\n data-slot=\"pricing-section\"\n tone={tone}\n align={align}\n {...rest}\n >\n <ul\n className={cn(\n 'mt-12 grid items-stretch gap-6 md:grid-cols-2',\n columnClass[Math.min(plans.length, 4)],\n plans.length === 1 && 'mx-auto max-w-md'\n )}\n >\n {plans.map((plan) => (\n <li\n key={plan.name}\n className={cn(\n 'relative flex flex-col rounded-2xl p-6 sm:p-8',\n cardClass(tone),\n plan.highlighted &&\n 'ring-primary-600 dark:ring-primary-400 ring-2'\n )}\n >\n {plan.highlighted && plan.badge && (\n <Badge className=\"bg-primary-800 dark:bg-primary-800 absolute start-6 -top-3 px-3 py-1 text-xs font-semibold text-white dark:text-white\">\n {plan.badge}\n </Badge>\n )}\n <h3 className={cn('text-lg font-semibold', headingTextClass(tone))}>\n {plan.name}\n </h3>\n {plan.description && (\n <p className={cn('mt-2 text-sm', mutedTextClass(tone))}>\n {plan.description}\n </p>\n )}\n <p className=\"mt-6 flex flex-wrap items-baseline gap-x-2\">\n <span\n className={cn(\n 'text-4xl font-bold tracking-tight',\n headingTextClass(tone)\n )}\n >\n {plan.price}\n </span>\n {plan.period && (\n <span className={cn('text-sm', mutedTextClass(tone))}>\n {plan.period}\n </span>\n )}\n </p>\n <ul className=\"mt-6 flex-1 space-y-3 text-sm\">\n {plan.features.map((feature) => (\n <li key={feature} className=\"flex gap-3\">\n <Check\n aria-hidden=\"true\"\n className={cn(\n 'mt-0.5 size-4 shrink-0',\n accentTextClass(tone)\n )}\n />\n {feature}\n </li>\n ))}\n </ul>\n {plan.cta && (\n <TemplateAnchor\n href={plan.cta.href}\n trackingId={plan.cta.trackingId}\n components={components}\n className={cn(\n buttonVariants({\n variant: plan.highlighted ? 'primary' : 'outline',\n size: 'lg',\n fullWidth: true,\n }),\n 'mt-8 h-auto min-h-12 py-3 whitespace-normal',\n tone === 'brand' &&\n (plan.highlighted\n ? 'text-primary-900 hover:bg-primary-50 bg-white'\n : 'border-white/70 text-white hover:bg-white/10 hover:text-white dark:border-white/70 dark:text-white')\n )}\n >\n {plan.cta.label}\n </TemplateAnchor>\n )}\n </li>\n ))}\n </ul>\n {note && (\n <p\n className={cn(\n 'mt-8 text-sm',\n mutedTextClass(tone),\n align === 'center' && 'text-center'\n )}\n >\n {note}\n </p>\n )}\n </SectionShell>\n )\n);\nPricingSection.displayName = 'PricingSection';\n","import * as React from 'react';\nimport { cn } from '../../utils/cn';\nimport {\n SectionShell,\n headingTextClass,\n mutedTextClass,\n} from '../../templates/Section';\nimport { TemplateIcon, type TemplateIconRegistry } from '../../templates/icons';\nimport type { SectionBaseProps } from '../../templates/types';\n\nexport interface ProcessStep {\n title: string;\n description: string;\n /** Icon token shown in the step marker instead of its number. */\n icon?: string;\n}\n\nexport interface ProcessStepsSectionProps extends SectionBaseProps {\n steps: ProcessStep[];\n icons?: TemplateIconRegistry;\n}\n\nconst columnClass = [\n '',\n '',\n 'lg:grid-cols-2',\n 'lg:grid-cols-3',\n 'lg:grid-cols-4',\n] as const;\n\n// Runs from the first marker's centre to the last: half a column in from each edge.\nconst connectorInset = [\n '',\n '',\n 'inset-x-[25%]',\n 'inset-x-[16.667%]',\n 'inset-x-[12.5%]',\n] as const;\n\nexport const ProcessStepsSection = React.forwardRef<\n HTMLElement,\n ProcessStepsSectionProps\n>(({ steps, icons, tone = 'default', align = 'center', ...rest }, ref) => {\n const columns = Math.min(steps.length, 4);\n return (\n <SectionShell\n ref={ref}\n data-slot=\"process-steps-section\"\n tone={tone}\n align={align}\n {...rest}\n >\n <div className=\"relative mt-12\">\n {steps.length > 1 && steps.length <= 4 && (\n <div\n aria-hidden=\"true\"\n className={cn(\n 'absolute top-6 hidden h-px lg:block',\n connectorInset[columns],\n tone === 'brand' ? 'bg-white/25' : 'bg-border'\n )}\n />\n )}\n <ol className={cn('relative grid gap-10', columnClass[columns])}>\n {steps.map((step, i) => (\n <li\n key={step.title}\n className=\"flex flex-col items-center text-center\"\n >\n <span\n aria-hidden=\"true\"\n className={cn(\n 'flex size-12 items-center justify-center rounded-full text-lg font-bold',\n tone === 'brand'\n ? 'text-primary-900 bg-white'\n : 'bg-primary-800 text-white'\n )}\n >\n {step.icon ? (\n <TemplateIcon name={step.icon} icons={icons} />\n ) : (\n i + 1\n )}\n </span>\n <h3\n className={cn(\n 'mt-5 text-lg font-semibold',\n headingTextClass(tone)\n )}\n >\n {step.title}\n </h3>\n <p className={cn('mt-2 max-w-xs', mutedTextClass(tone))}>\n {step.description}\n </p>\n </li>\n ))}\n </ol>\n </div>\n </SectionShell>\n );\n});\nProcessStepsSection.displayName = 'ProcessStepsSection';\n","import * as React from 'react';\nimport { ArrowRight } from 'lucide-react';\nimport { cn } from '../../utils/cn';\nimport {\n SectionShell,\n TemplateAnchor,\n TemplateImg,\n accentTextClass,\n cardClass,\n headingTextClass,\n mutedTextClass,\n} from '../../templates/Section';\nimport type {\n SectionBaseProps,\n TemplateImage,\n TemplateLink,\n} from '../../templates/types';\n\nexport interface ResourceItem {\n title: string;\n href: string;\n excerpt?: string;\n image?: TemplateImage;\n /** Content type label, e.g. \"Guide\" or \"Case study\". */\n kind?: string;\n /** Free-text detail line the caller formats, e.g. \"8 min read\". */\n meta?: string;\n trackingId?: string;\n}\n\nexport interface ResourceCardsSectionProps extends SectionBaseProps {\n items: ResourceItem[];\n columns?: 2 | 3 | 4;\n /** Link to the full index, shown under the cards. */\n viewAll?: TemplateLink;\n}\n\nconst columnClass = {\n 2: 'lg:grid-cols-2',\n 3: 'lg:grid-cols-3',\n 4: 'lg:grid-cols-4',\n} as const;\n\nexport const ResourceCardsSection = React.forwardRef<\n HTMLElement,\n ResourceCardsSectionProps\n>(\n (\n {\n items,\n columns = 3,\n viewAll,\n tone = 'default',\n align = 'start',\n components,\n ...rest\n },\n ref\n ) => (\n <SectionShell\n ref={ref}\n data-slot=\"resource-cards-section\"\n tone={tone}\n align={align}\n {...rest}\n >\n <ul\n className={cn('mt-12 grid gap-6 sm:grid-cols-2', columnClass[columns])}\n >\n {items.map((item) => (\n <li\n key={item.href}\n className={cn(\n 'group relative flex flex-col overflow-hidden rounded-2xl',\n 'focus-within:ring-ring focus-within:ring-2',\n cardClass(tone)\n )}\n >\n {item.image && (\n <TemplateImg\n {...item.image}\n components={components}\n className=\"aspect-video w-full object-cover\"\n />\n )}\n <div className=\"flex flex-1 flex-col gap-2 p-6\">\n {item.kind && (\n <p\n className={cn(\n 'text-xs font-semibold tracking-wider uppercase',\n accentTextClass(tone)\n )}\n >\n {item.kind}\n </p>\n )}\n <h3\n className={cn('text-lg font-semibold', headingTextClass(tone))}\n >\n {/* The ::after stretches the link over the whole card. */}\n <TemplateAnchor\n href={item.href}\n trackingId={item.trackingId}\n components={components}\n className=\"group-hover:underline after:absolute after:inset-0 focus-visible:outline-none\"\n >\n {item.title}\n </TemplateAnchor>\n </h3>\n {item.excerpt && (\n <p className={cn('line-clamp-3', mutedTextClass(tone))}>\n {item.excerpt}\n </p>\n )}\n {item.meta && (\n <p className={cn('mt-auto pt-2 text-sm', mutedTextClass(tone))}>\n {item.meta}\n </p>\n )}\n </div>\n </li>\n ))}\n </ul>\n {viewAll && (\n <p className={cn('mt-10', align === 'center' && 'text-center')}>\n <TemplateAnchor\n href={viewAll.href}\n trackingId={viewAll.trackingId}\n components={components}\n className={cn(\n 'inline-flex items-center gap-1 font-semibold hover:underline',\n accentTextClass(tone)\n )}\n >\n {viewAll.label}\n <ArrowRight\n aria-hidden=\"true\"\n className=\"size-4 rtl:-scale-x-100\"\n />\n </TemplateAnchor>\n </p>\n )}\n </SectionShell>\n )\n);\nResourceCardsSection.displayName = 'ResourceCardsSection';\n","import * as React from 'react';\nimport { CircleCheck } from 'lucide-react';\nimport { cn } from '../../utils/cn';\nimport {\n CtaLinks,\n SectionHeading,\n TemplateImg,\n accentTextClass,\n containerClass,\n mutedTextClass,\n toneClass,\n} from '../../templates/Section';\nimport type {\n SectionBaseProps,\n TemplateImage,\n TemplateLink,\n} from '../../templates/types';\n\nexport interface SplitContentSectionProps extends Omit<\n SectionBaseProps,\n 'align'\n> {\n title: string;\n image: TemplateImage;\n /** Caption under the image. */\n caption?: string;\n /** Proof points rendered as a checked list under the description. */\n bullets?: string[];\n primaryCta?: TemplateLink;\n secondaryCta?: TemplateLink;\n /** Which side the image sits on at desktop widths (follows reading direction). */\n mediaPosition?: 'start' | 'end';\n}\n\nexport const SplitContentSection = React.forwardRef<\n HTMLElement,\n SplitContentSectionProps\n>(\n (\n {\n eyebrow,\n title,\n description,\n image,\n caption,\n bullets,\n primaryCta,\n secondaryCta,\n mediaPosition = 'end',\n tone = 'default',\n components,\n className,\n ...rest\n },\n ref\n ) => {\n const titleId = React.useId();\n return (\n <section\n ref={ref}\n data-slot=\"split-content-section\"\n data-tone={tone}\n aria-labelledby={titleId}\n className={cn('py-16 sm:py-24', toneClass(tone), className)}\n {...rest}\n >\n <div\n className={cn(\n containerClass(),\n 'grid items-center gap-12 lg:grid-cols-2'\n )}\n >\n <div>\n <SectionHeading\n eyebrow={eyebrow}\n title={title}\n description={description}\n tone={tone}\n titleId={titleId}\n />\n {bullets && bullets.length > 0 && (\n <ul className=\"mt-6 space-y-3\">\n {bullets.map((item) => (\n <li key={item} className=\"flex gap-3\">\n <CircleCheck\n aria-hidden=\"true\"\n className={cn(\n 'mt-0.5 size-5 shrink-0',\n accentTextClass(tone)\n )}\n />\n <span className={mutedTextClass(tone)}>{item}</span>\n </li>\n ))}\n </ul>\n )}\n <CtaLinks\n primary={primaryCta}\n secondary={secondaryCta}\n tone={tone}\n components={components}\n className=\"mt-8\"\n />\n </div>\n <figure className={cn(mediaPosition === 'start' && 'lg:order-first')}>\n <TemplateImg\n {...image}\n components={components}\n className=\"h-auto w-full rounded-2xl object-cover shadow-lg\"\n />\n {caption && (\n <figcaption className={cn('mt-3 text-sm', mutedTextClass(tone))}>\n {caption}\n </figcaption>\n )}\n </figure>\n </div>\n </section>\n );\n }\n);\nSplitContentSection.displayName = 'SplitContentSection';\n","import * as React from 'react';\nimport { TrendingDown, TrendingUp } from 'lucide-react';\nimport { cn } from '../../utils/cn';\nimport {\n SectionShell,\n cardClass,\n mutedTextClass,\n} from '../../templates/Section';\nimport type { SectionBaseProps } from '../../templates/types';\n\nexport interface StatItem {\n /** Numbers are locale-formatted; strings render as written. */\n value: number | string;\n prefix?: string;\n suffix?: string;\n label: string;\n description?: string;\n /** Decorative arrow. Say the direction in `label` too — the arrow is hidden from screen readers. */\n trend?: 'up' | 'down';\n}\n\nexport interface StatsSectionProps extends SectionBaseProps {\n stats: StatItem[];\n variant?: 'plain' | 'cards';\n /** BCP 47 locale for number formatting. */\n locale?: string;\n}\n\nconst columnClass = [\n '',\n '',\n 'lg:grid-cols-2',\n 'lg:grid-cols-3',\n 'lg:grid-cols-4',\n] as const;\n\nexport const StatsSection = React.forwardRef<HTMLElement, StatsSectionProps>(\n (\n {\n stats,\n variant = 'plain',\n locale,\n tone = 'default',\n align = 'center',\n ...rest\n },\n ref\n ) => {\n const format = new Intl.NumberFormat(locale);\n return (\n <SectionShell\n ref={ref}\n data-slot=\"stats-section\"\n tone={tone}\n align={align}\n {...rest}\n >\n <dl\n className={cn(\n 'mt-12 grid gap-6 sm:grid-cols-2',\n columnClass[Math.min(stats.length, 4)]\n )}\n >\n {stats.map((stat) => {\n const Trend = stat.trend === 'down' ? TrendingDown : TrendingUp;\n return (\n <div\n key={stat.label}\n className={cn(\n 'flex flex-col-reverse gap-2',\n align === 'center' && 'items-center text-center',\n variant === 'cards' && cn('rounded-2xl p-6', cardClass(tone))\n )}\n >\n <dt>\n <span className=\"font-semibold\">{stat.label}</span>\n {stat.description && (\n <span\n className={cn('mt-1 block text-sm', mutedTextClass(tone))}\n >\n {stat.description}\n </span>\n )}\n </dt>\n <dd\n className={cn(\n 'flex items-center gap-2 text-4xl font-bold tracking-tight tabular-nums sm:text-5xl',\n tone === 'brand'\n ? 'text-white'\n : 'text-primary-800 dark:text-primary-300'\n )}\n >\n {stat.trend && (\n <Trend aria-hidden=\"true\" className=\"size-7 shrink-0\" />\n )}\n {stat.prefix}\n {typeof stat.value === 'number'\n ? format.format(stat.value)\n : stat.value}\n {stat.suffix}\n </dd>\n </div>\n );\n })}\n </dl>\n </SectionShell>\n );\n }\n);\nStatsSection.displayName = 'StatsSection';\n","import * as React from 'react';\nimport { Star } from 'lucide-react';\nimport { cn } from '../../utils/cn';\nimport {\n SectionShell,\n TemplateImg,\n cardClass,\n headingTextClass,\n mutedTextClass,\n} from '../../templates/Section';\nimport type { SectionBaseProps } from '../../templates/types';\n\nexport interface TestimonialItem {\n quote: string;\n author: string;\n role?: string;\n company?: string;\n /** Headshot URL; decorative, since the author is named beside it. */\n avatar?: string;\n /** Whole stars out of five. */\n rating?: 1 | 2 | 3 | 4 | 5;\n}\n\nexport interface TestimonialSectionLabels {\n /** Screen-reader rating text; `{rating}` is replaced with the number. */\n rating?: string;\n}\n\nexport interface TestimonialSectionProps extends SectionBaseProps {\n testimonials: TestimonialItem[];\n /** `featured` gives the first testimonial the whole section; `cards` lays them out in a grid. */\n variant?: 'cards' | 'featured';\n labels?: TestimonialSectionLabels;\n}\n\nexport const TestimonialSection = React.forwardRef<\n HTMLElement,\n TestimonialSectionProps\n>(\n (\n {\n testimonials,\n variant = 'cards',\n labels,\n tone = 'default',\n align = 'center',\n components,\n ...rest\n },\n ref\n ) => {\n const featured = variant === 'featured';\n const items = featured ? testimonials.slice(0, 1) : testimonials;\n return (\n <SectionShell\n ref={ref}\n data-slot=\"testimonial-section\"\n tone={tone}\n align={align}\n width={featured ? 'narrow' : 'wide'}\n {...rest}\n >\n <ul\n className={cn(\n 'mt-12 grid gap-6',\n !featured && 'md:grid-cols-2 lg:grid-cols-3'\n )}\n >\n {items.map(({ rating, ...t }) => (\n <li key={`${t.author}-${t.quote.slice(0, 24)}`}>\n <figure\n className={cn(\n 'flex h-full flex-col gap-6',\n featured\n ? 'items-center text-center'\n : cn('rounded-2xl p-6', cardClass(tone))\n )}\n >\n {rating && (\n <p className=\"text-warning flex gap-0.5\">\n {Array.from({ length: 5 }, (_, i) => (\n <Star\n key={i}\n aria-hidden=\"true\"\n className={cn(\n 'size-4',\n i < rating ? 'fill-current' : 'opacity-30'\n )}\n />\n ))}\n <span className=\"sr-only\">\n {(labels?.rating ?? 'Rated {rating} out of 5').replace(\n '{rating}',\n String(rating)\n )}\n </span>\n </p>\n )}\n <blockquote\n className={cn(\n 'text-pretty',\n featured\n ? cn(\n 'text-2xl font-medium sm:text-3xl',\n headingTextClass(tone)\n )\n : 'text-base'\n )}\n >\n <p>{t.quote}</p>\n </blockquote>\n <figcaption className=\"mt-auto flex items-center gap-3\">\n {t.avatar && (\n <TemplateImg\n src={t.avatar}\n alt=\"\"\n width={44}\n height={44}\n components={components}\n className=\"size-11 rounded-full object-cover\"\n />\n )}\n <span className={cn(!featured && 'text-start')}>\n <span className=\"block font-semibold\">{t.author}</span>\n {(t.role || t.company) && (\n <span\n className={cn('block text-sm', mutedTextClass(tone))}\n >\n {[t.role, t.company].filter(Boolean).join(', ')}\n </span>\n )}\n </span>\n </figcaption>\n </figure>\n </li>\n ))}\n </ul>\n </SectionShell>\n );\n }\n);\nTestimonialSection.displayName = 'TestimonialSection';\n","import * as React from 'react';\nimport { cn } from '../../utils/cn';\nimport { SectionShell, mutedTextClass } from '../../templates/Section';\nimport type { SectionBaseProps } from '../../templates/types';\n\ninterface VideoBase {\n /** Accessible name of the player, e.g. \"Product tour (3 min)\". */\n title: string;\n}\n\nexport type VideoSource =\n | (VideoBase & {\n /** Embeds `youtube-nocookie.com`, which sets no cookies until playback. Captions come from YouTube. */\n youtubeId: string;\n })\n | (VideoBase & {\n /** A self-hosted file, played with the native `<video>` element. */\n src: string;\n /** Still frame shown before playback. */\n poster?: string;\n /** WebVTT captions — required, because prerecorded speech needs captions (WCAG 1.2.2). */\n captions: { src: string; srcLang: string; label: string };\n });\n\nexport interface VideoSectionProps extends SectionBaseProps {\n video: VideoSource;\n /** Caption under the player. */\n caption?: string;\n}\n\nexport const VideoSection = React.forwardRef<HTMLElement, VideoSectionProps>(\n ({ video, caption, tone = 'default', align = 'center', ...rest }, ref) => (\n <SectionShell\n ref={ref}\n data-slot=\"video-section\"\n tone={tone}\n align={align}\n {...rest}\n >\n <figure className=\"mx-auto mt-12 max-w-5xl\">\n <div className=\"aspect-video overflow-hidden rounded-2xl bg-neutral-900 shadow-xl\">\n {'youtubeId' in video ? (\n <iframe\n src={`https://www.youtube-nocookie.com/embed/${encodeURIComponent(video.youtubeId)}`}\n title={video.title}\n loading=\"lazy\"\n allow=\"accelerometer; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share\"\n allowFullScreen\n referrerPolicy=\"strict-origin-when-cross-origin\"\n className=\"size-full border-0\"\n />\n ) : (\n <video\n src={video.src}\n poster={video.poster}\n title={video.title}\n aria-label={video.title}\n controls\n preload=\"none\"\n className=\"size-full object-cover\"\n >\n <track\n kind=\"captions\"\n src={video.captions.src}\n srcLang={video.captions.srcLang}\n label={video.captions.label}\n default\n />\n </video>\n )}\n </div>\n {caption && (\n <figcaption\n className={cn(\n 'mt-3 text-sm',\n mutedTextClass(tone),\n align === 'center' && 'text-center'\n )}\n >\n {caption}\n </figcaption>\n )}\n </figure>\n </SectionShell>\n )\n);\nVideoSection.displayName = 'VideoSection';\n","import * as React from 'react';\nimport {\n ComparisonSection,\n type ComparisonSectionProps,\n} from '../ComparisonSection';\nimport { CtaSection, type CtaSectionProps } from '../CtaSection';\nimport { FaqSection, type FaqSectionProps } from '../FaqSection';\nimport {\n FeatureGridSection,\n type FeatureGridSectionProps,\n} from '../FeatureGridSection';\nimport { HeroSection, type HeroSectionProps } from '../HeroSection';\nimport { LeadFormSection, type LeadFormSectionProps } from '../LeadFormSection';\nimport {\n LogoCloudSection,\n type LogoCloudSectionProps,\n} from '../LogoCloudSection';\nimport { PricingSection, type PricingSectionProps } from '../PricingSection';\nimport {\n ProcessStepsSection,\n type ProcessStepsSectionProps,\n} from '../ProcessStepsSection';\nimport {\n ResourceCardsSection,\n type ResourceCardsSectionProps,\n} from '../ResourceCardsSection';\nimport {\n SplitContentSection,\n type SplitContentSectionProps,\n} from '../SplitContentSection';\nimport { StatsSection, type StatsSectionProps } from '../StatsSection';\nimport {\n TestimonialSection,\n type TestimonialSectionProps,\n} from '../TestimonialSection';\nimport { VideoSection, type VideoSectionProps } from '../VideoSection';\nimport type { TemplateIconRegistry } from '../../templates/icons';\nimport { safeHref } from '../../templates/Section';\nimport type { TemplateComponents } from '../../templates/types';\nimport { ownProperty } from '../../utils/own';\n\n/** A section the site renders itself, looked up by name in `LandingPage`'s `custom` map. */\nexport interface CustomBlock {\n type: 'custom';\n component: string;\n props?: Record<string, unknown>;\n id?: string;\n}\n\n/** Section props as page data: no event handlers, children or components, so a block survives JSON. */\ntype BlockData<P> = Omit<\n P,\n keyof React.DOMAttributes<HTMLElement> | 'components' | 'icons'\n>;\n\n/** One entry of a page's `blocks` array: a section's props tagged with its `type`. */\nexport type LandingBlock =\n | ({ type: 'hero' } & BlockData<HeroSectionProps>)\n | ({ type: 'logos' } & BlockData<LogoCloudSectionProps>)\n | ({ type: 'features' } & BlockData<FeatureGridSectionProps>)\n | ({ type: 'split' } & BlockData<SplitContentSectionProps>)\n | ({ type: 'process' } & BlockData<ProcessStepsSectionProps>)\n | ({ type: 'stats' } & BlockData<StatsSectionProps>)\n | ({ type: 'comparison' } & BlockData<ComparisonSectionProps>)\n | ({ type: 'pricing' } & BlockData<PricingSectionProps>)\n | ({ type: 'video' } & BlockData<VideoSectionProps>)\n | ({ type: 'testimonials' } & BlockData<TestimonialSectionProps>)\n | ({ type: 'resources' } & BlockData<ResourceCardsSectionProps>)\n | ({ type: 'faq' } & BlockData<FaqSectionProps>)\n | ({ type: 'lead-form' } & Omit<BlockData<LeadFormSectionProps>, 'action'> & {\n /** A URL, or the name of a function in `LandingPage`'s `actions` map. */\n action: string;\n })\n | ({ type: 'cta' } & BlockData<CtaSectionProps>)\n | CustomBlock;\n\nexport type LandingBlockType = LandingBlock['type'];\n\nconst sections = {\n hero: HeroSection,\n logos: LogoCloudSection,\n features: FeatureGridSection,\n split: SplitContentSection,\n process: ProcessStepsSection,\n stats: StatsSection,\n comparison: ComparisonSection,\n pricing: PricingSection,\n video: VideoSection,\n testimonials: TestimonialSection,\n resources: ResourceCardsSection,\n faq: FaqSection,\n 'lead-form': LeadFormSection,\n cta: CtaSection,\n} satisfies Record<Exclude<LandingBlockType, 'custom'>, unknown>;\n\n/** Every block type the renderer knows — `validateLandingPage` checks runtime data against it. */\nexport const landingBlockTypes = [\n ...Object.keys(sections),\n 'custom',\n] as LandingBlockType[];\n\n/** Block types whose section resolves icon tokens. */\nconst takesIcons = new Set<LandingBlockType>(['features', 'process']);\n\nexport interface LandingPageProps extends React.HTMLAttributes<HTMLDivElement> {\n /** The page, top to bottom. Plain data — import it from a content file or a CMS. */\n blocks: LandingBlock[];\n /** Site icon tokens, passed to every section that renders icons. */\n icons?: TemplateIconRegistry;\n /** Site image and link components (e.g. `next/image`, `next/link`), passed to every section. */\n components?: TemplateComponents;\n /** Site-owned sections for `{ type: 'custom', component }` blocks. */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- each custom section owns its props\n custom?: Record<string, React.ComponentType<any>>;\n /** Form actions (e.g. Server Actions, React 19) that `lead-form` blocks name in `action`. */\n actions?: Record<string, (formData: FormData) => void | Promise<void>>;\n}\n\nexport const LandingPage = React.forwardRef<HTMLDivElement, LandingPageProps>(\n ({ blocks, icons, components, custom, actions, ...rest }, ref) => (\n <div ref={ref} data-slot=\"landing-page\" {...rest}>\n {blocks.map((block, i) => {\n const key = block.id ?? `${block.type}-${i}`;\n // Own-property lookups throughout: block data is runtime JSON, so\n // `\"toString\"` must mean \"unknown\", not `Object.prototype.toString`.\n if (block.type === 'custom') {\n const Custom = ownProperty(custom, block.component);\n return Custom ? (\n <Custom key={key} id={block.id} {...block.props} />\n ) : null;\n }\n const { type, ...props } = block;\n // `type` narrowed `props` to this section's props; TS can't correlate the lookup.\n const Section = ownProperty(\n sections as Record<string, unknown>,\n type\n ) as React.ComponentType<Record<string, unknown>> | undefined;\n // Runtime page data bypasses `BlockData`, so guard what TypeScript\n // cannot: skip unknown types the way unknown `custom` components are\n // skipped (`validateLandingPage` reports them), drop the props JSON\n // must not control, and inject the framework-owned props after the\n // spread so a block cannot override the site's adapters.\n if (!Section) return null;\n // A non-named lead-form action is a form URL — same trust boundary as\n // hrefs. No safe action means no form: an action-less form would\n // submit the lead to the current document URL instead of going inert.\n const action =\n block.type === 'lead-form'\n ? (ownProperty(actions, block.action) ?? safeHref(block.action))\n : undefined;\n if (block.type === 'lead-form' && action == null) return null;\n const data = { ...props } as Record<string, unknown>;\n delete data.children;\n delete data.dangerouslySetInnerHTML;\n return (\n <Section\n key={key}\n {...data}\n components={components}\n {...(takesIcons.has(type) ? { icons } : {})}\n {...(block.type === 'lead-form' ? { action } : {})}\n />\n );\n })}\n </div>\n )\n);\nLandingPage.displayName = 'LandingPage';\n","import { safeHref } from '../../templates/Section';\nimport {\n landingBlockTypes,\n type LandingBlock,\n type LandingBlockType,\n} from './LandingPage';\n\nexport interface LandingPreset {\n label: string;\n description: string;\n /** Recommended order, top to bottom. Blocks not listed may sit anywhere. */\n sequence: LandingBlockType[];\n /** Blocks the page is incomplete without. */\n required: LandingBlockType[];\n}\n\n/** Page archetypes shared by the BlueHive and Enterprise Health marketing sites. */\nexport const landingPresets = {\n 'vertical-hub': {\n label: 'Industry / vertical hub',\n description:\n 'One page per industry served: the sector problem, what the product does for it, proof, and a way in.',\n sequence: [\n 'hero',\n 'logos',\n 'features',\n 'split',\n 'stats',\n 'process',\n 'testimonials',\n 'resources',\n 'faq',\n 'cta',\n ],\n required: ['hero', 'features', 'faq', 'cta'],\n },\n 'service-detail': {\n label: 'Service / product detail',\n description:\n 'One offering explained: what it is, how it works, how it compares, and how to start.',\n sequence: [\n 'hero',\n 'features',\n 'video',\n 'process',\n 'comparison',\n 'pricing',\n 'stats',\n 'testimonials',\n 'faq',\n 'cta',\n ],\n required: ['hero', 'features', 'cta'],\n },\n campaign: {\n label: 'Campaign / ABM landing',\n description:\n 'A focused page for a campaign or named account that converts on the page itself.',\n sequence: [\n 'hero',\n 'logos',\n 'features',\n 'stats',\n 'testimonials',\n 'lead-form',\n 'faq',\n ],\n required: ['hero', 'lead-form'],\n },\n comparison: {\n label: 'Comparison',\n description:\n 'Your product against an alternative or the status quo, row by row.',\n sequence: ['hero', 'comparison', 'features', 'testimonials', 'faq', 'cta'],\n required: ['hero', 'comparison', 'cta'],\n },\n resource: {\n label: 'Resource / lead magnet',\n description:\n 'A guide, report or tool offered in exchange for contact details.',\n sequence: ['hero', 'split', 'lead-form', 'resources', 'faq'],\n required: ['hero', 'lead-form'],\n },\n pricing: {\n label: 'Pricing',\n description:\n 'Plans and what each includes, the proof that they are worth it, and the questions buyers ask before they pay.',\n sequence: [\n 'hero',\n 'pricing',\n 'comparison',\n 'stats',\n 'testimonials',\n 'faq',\n 'cta',\n ],\n required: ['hero', 'pricing', 'faq'],\n },\n} satisfies Record<string, LandingPreset>;\n\nexport type LandingPresetId = keyof typeof landingPresets;\n\n/** Block types whose items render `h3` titles under the section's `h2`. */\nconst headedItems = new Set<LandingBlockType>([\n 'features',\n 'process',\n 'pricing',\n 'resources',\n]);\n\nexport interface LandingPageIssue {\n severity: 'error' | 'warning';\n message: string;\n /** Index into `blocks`, when the issue belongs to one block. */\n index?: number;\n}\n\n/**\n * Checks a page against the heading contract (exactly one `h1` hero, first)\n * and, when given, a preset's required blocks and order. Run it in a build\n * step or test; `LandingPage` itself renders whatever it is given.\n */\nexport function validateLandingPage(\n blocks: LandingBlock[],\n preset?: LandingPresetId | LandingPreset\n): LandingPageIssue[] {\n const issues: LandingPageIssue[] = [];\n const types = blocks.map((b) => b.type);\n\n const knownTypes = new Set<string>(landingBlockTypes);\n blocks.forEach((b, index) => {\n if (!knownTypes.has(b.type))\n issues.push({\n severity: 'error',\n index,\n message: `Unknown block type \"${b.type}\": the renderer skips this block.`,\n });\n // A named action resolves like a relative URL; unsafe schemes never do.\n if (b.type === 'lead-form' && safeHref(b.action) == null)\n issues.push({\n severity: 'error',\n index,\n message: `Unsafe lead-form action \"${b.action}\": the renderer skips this block.`,\n });\n });\n\n const h1Heroes = blocks.flatMap((b, i) =>\n b.type === 'hero' && (b.headingLevel ?? 'h1') === 'h1' ? [i] : []\n );\n if (h1Heroes.length > 1)\n h1Heroes.slice(1).forEach((index) =>\n issues.push({\n severity: 'error',\n index,\n message:\n 'A second h1 hero: a page has one h1. Set headingLevel: \"h2\" or remove it.',\n })\n );\n if (h1Heroes.length === 0)\n issues.push({\n severity: 'warning',\n message:\n 'No h1 hero. The page must render its own h1 outside the blocks.',\n });\n const firstHero = types.indexOf('hero');\n if (firstHero > 0)\n issues.push({\n severity: 'warning',\n index: firstHero,\n message: 'The hero is not the first block.',\n });\n if (h1Heroes.length > 0 && h1Heroes[0] !== firstHero)\n issues.push({\n severity: 'warning',\n index: h1Heroes[0],\n message:\n 'The h1 hero is not the first hero: an h2 hero precedes the page h1.',\n });\n\n const seen = new Map<string, number>();\n blocks.forEach((b, index) => {\n // FAQ item ids become DOM ids too, so they share the page-wide namespace.\n const ids = [\n ...(b.id ? [b.id] : []),\n ...(b.type === 'faq'\n ? b.items.flatMap((item) => (item.id ? [item.id] : []))\n : []),\n ];\n ids.forEach((id) => {\n if (seen.has(id))\n issues.push({\n severity: 'error',\n index,\n message: `Duplicate id \"${id}\" (also block ${seen.get(id)}).`,\n });\n else seen.set(id, index);\n });\n });\n\n blocks.forEach((b, index) => {\n // Item titles are h3; without the section's h2 the outline skips a level.\n if (headedItems.has(b.type) && !('title' in b && b.title))\n issues.push({\n severity: 'warning',\n index,\n message: `\"${b.type}\" has no title, so its h3 item titles skip the h2 level.`,\n });\n if (b.type !== 'comparison') return;\n b.rows.forEach((row, r) => {\n if (row.values.length !== b.columns.length)\n issues.push({\n severity: 'error',\n index,\n message: `Comparison row ${r} (\"${row.feature}\") has ${row.values.length} values for ${b.columns.length} columns.`,\n });\n });\n if (\n b.highlightColumn !== undefined &&\n (b.highlightColumn < 0 || b.highlightColumn >= b.columns.length)\n )\n issues.push({\n severity: 'warning',\n index,\n message: `highlightColumn ${b.highlightColumn} is outside the ${b.columns.length} comparison columns.`,\n });\n });\n\n if (!preset) return issues;\n const spec: LandingPreset =\n typeof preset === 'string' ? landingPresets[preset] : preset;\n\n for (const type of spec.required)\n if (!types.includes(type))\n issues.push({\n severity: 'error',\n message: `Missing required \"${type}\" block for the ${spec.label} preset.`,\n });\n\n let last = -1;\n blocks.forEach((b, index) => {\n const rank = spec.sequence.indexOf(b.type);\n if (rank === -1) return;\n if (rank < last)\n issues.push({\n severity: 'warning',\n index,\n message: `\"${b.type}\" is out of the ${spec.label} preset's recommended order.`,\n });\n else last = rank;\n });\n\n return issues;\n}\n"]}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var
|
|
3
|
+
var chunkX6A27RGO_cjs = require('./chunk-X6A27RGO.cjs');
|
|
4
4
|
var lucideReact = require('lucide-react');
|
|
5
5
|
var react = require('react');
|
|
6
6
|
var jsxRuntime = require('react/jsx-runtime');
|
|
@@ -56,7 +56,7 @@ var FenceBlock = ({
|
|
|
56
56
|
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-1", children: [
|
|
57
57
|
headerActions,
|
|
58
58
|
supportsRawView && /* @__PURE__ */ jsxRuntime.jsx(
|
|
59
|
-
|
|
59
|
+
chunkX6A27RGO_cjs.Button,
|
|
60
60
|
{
|
|
61
61
|
variant: "ghost",
|
|
62
62
|
size: "sm",
|
|
@@ -67,7 +67,7 @@ var FenceBlock = ({
|
|
|
67
67
|
}
|
|
68
68
|
),
|
|
69
69
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
70
|
-
|
|
70
|
+
chunkX6A27RGO_cjs.Button,
|
|
71
71
|
{
|
|
72
72
|
variant: "ghost",
|
|
73
73
|
size: "sm",
|
|
@@ -96,5 +96,5 @@ var FenceBlock = ({
|
|
|
96
96
|
};
|
|
97
97
|
|
|
98
98
|
exports.FenceBlock = FenceBlock;
|
|
99
|
-
//# sourceMappingURL=chunk-
|
|
100
|
-
//# sourceMappingURL=chunk-
|
|
99
|
+
//# sourceMappingURL=chunk-LFPJ3OUM.cjs.map
|
|
100
|
+
//# sourceMappingURL=chunk-LFPJ3OUM.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/components/Markdown/FenceBlock.tsx"],"names":["useState","useRef","useEffect","useCallback","jsxs","jsx","Button","Eye","Code","Check","ClipboardCopy"],"mappings":"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","file":"chunk-
|
|
1
|
+
{"version":3,"sources":["../src/components/Markdown/FenceBlock.tsx"],"names":["useState","useRef","useEffect","useCallback","jsxs","jsx","Button","Eye","Code","Check","ClipboardCopy"],"mappings":"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","file":"chunk-LFPJ3OUM.cjs","sourcesContent":["/**\n * FenceBlock — Base wrapper for code blocks with copy, raw view toggle, and errors.\n */\nimport { Check, ClipboardCopy, Code, Eye } from 'lucide-react';\nimport React, { useCallback, useEffect, useRef, useState } from 'react';\n\nimport { Button } from '../Button';\n\nexport interface FenceBlockProps {\n code: string;\n language?: string;\n supportsRawView?: boolean;\n error?: string;\n children: React.ReactNode;\n /** Extra buttons rendered in the header before the copy button */\n headerActions?: React.ReactNode;\n}\n\ntype CopyState = 'idle' | 'copying' | 'success' | 'error';\n\nexport const FenceBlock: React.FC<FenceBlockProps> = ({\n code,\n language,\n supportsRawView = false,\n error,\n children,\n headerActions,\n}) => {\n const [copyState, setCopyState] = useState<CopyState>('idle');\n const [showRaw, setShowRaw] = useState(false);\n const timerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n useEffect(\n () => () => {\n if (timerRef.current) clearTimeout(timerRef.current);\n },\n []\n );\n\n const scheduleReset = useCallback(() => {\n if (timerRef.current) clearTimeout(timerRef.current);\n timerRef.current = setTimeout(() => setCopyState('idle'), 2000);\n }, []);\n\n const handleCopy = useCallback(async () => {\n if (copyState === 'copying') return;\n setCopyState('copying');\n try {\n await navigator.clipboard.writeText(code);\n setCopyState('success');\n scheduleReset();\n } catch {\n try {\n const textarea = document.createElement('textarea');\n textarea.value = code;\n textarea.style.position = 'fixed';\n textarea.style.opacity = '0';\n document.body.appendChild(textarea);\n textarea.select();\n document.execCommand('copy');\n document.body.removeChild(textarea);\n setCopyState('success');\n } catch {\n setCopyState('error');\n }\n scheduleReset();\n }\n }, [code, copyState, scheduleReset]);\n\n return (\n <div className=\"group relative my-3 overflow-hidden rounded-lg border border-neutral-200 bg-neutral-50 dark:border-neutral-700 dark:bg-[#1a1d24]\">\n <div className=\"flex items-center justify-between border-b border-neutral-200 px-3 py-1.5 dark:border-white/[0.08]\">\n <span className=\"text-xs font-medium text-neutral-500 dark:text-neutral-400\">\n {language\n ? language.charAt(0).toUpperCase() + language.slice(1)\n : 'Text'}\n </span>\n <div className=\"flex items-center gap-1\">\n {headerActions}\n {supportsRawView && (\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={() => setShowRaw((v) => !v)}\n aria-label={showRaw ? 'Show rendered view' : 'Show raw code'}\n className=\"h-7 w-7 p-0\"\n >\n {showRaw ? (\n <Eye className=\"h-3.5 w-3.5\" />\n ) : (\n <Code className=\"h-3.5 w-3.5\" />\n )}\n </Button>\n )}\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={handleCopy}\n aria-label=\"Copy code\"\n className=\"h-7 w-7 p-0\"\n >\n {copyState === 'success' ? (\n <Check className=\"h-3.5 w-3.5 text-green-500\" />\n ) : (\n <ClipboardCopy className=\"h-3.5 w-3.5\" />\n )}\n </Button>\n </div>\n </div>\n\n {error ? (\n <div className=\"p-3\">\n <div className=\"rounded-md bg-red-50 p-3 text-sm text-red-800 dark:bg-red-900/20 dark:text-red-300\">\n {error}\n </div>\n <pre className=\"mt-2 overflow-x-auto text-xs whitespace-pre-wrap text-neutral-600 dark:text-neutral-400\">\n <code>{code}</code>\n </pre>\n </div>\n ) : showRaw ? (\n <pre\n className=\"overflow-x-auto p-3 text-sm\"\n // eslint-disable-next-line jsx-a11y/no-noninteractive-tabindex -- scrollable code needs keyboard focus (axe: scrollable-region-focusable)\n tabIndex={0}\n role=\"region\"\n aria-label=\"Raw code\"\n >\n <code>{code}</code>\n </pre>\n ) : (\n <div className=\"overflow-x-auto\">{children}</div>\n )}\n </div>\n );\n};\n"]}
|
|
@@ -34,6 +34,92 @@ function useDirection(elementRef) {
|
|
|
34
34
|
}, [currentElement]);
|
|
35
35
|
return direction;
|
|
36
36
|
}
|
|
37
|
+
var KEYBOARD_INSET_VAR = "--mieweb-keyboard-inset";
|
|
38
|
+
var VISUAL_VIEWPORT_HEIGHT_VAR = "--mieweb-visual-viewport-height";
|
|
39
|
+
var VISUAL_VIEWPORT_OFFSET_TOP_VAR = "--mieweb-visual-viewport-offset-top";
|
|
40
|
+
var KEYBOARD_OPEN_ATTRIBUTE = "data-keyboard-open";
|
|
41
|
+
var KEYBOARD_SOURCE_ATTRIBUTE = "data-keyboard-source";
|
|
42
|
+
var CLOSED = { keyboardInset: 0, isKeyboardOpen: false };
|
|
43
|
+
function useKeyboardInset(options = {}) {
|
|
44
|
+
const { enabled = true, source = "visual-viewport" } = options;
|
|
45
|
+
const [state, setState] = react.useState(CLOSED);
|
|
46
|
+
react.useEffect(() => {
|
|
47
|
+
if (!enabled || typeof window === "undefined") return;
|
|
48
|
+
const root = document.documentElement;
|
|
49
|
+
const publish = (keyboardInset) => {
|
|
50
|
+
const isKeyboardOpen = keyboardInset > 0;
|
|
51
|
+
root.style.setProperty(KEYBOARD_INSET_VAR, `${keyboardInset}px`);
|
|
52
|
+
root.toggleAttribute(KEYBOARD_OPEN_ATTRIBUTE, isKeyboardOpen);
|
|
53
|
+
setState(
|
|
54
|
+
(previous) => previous.keyboardInset === keyboardInset ? previous : { keyboardInset, isKeyboardOpen }
|
|
55
|
+
);
|
|
56
|
+
};
|
|
57
|
+
const clear = () => {
|
|
58
|
+
root.style.removeProperty(KEYBOARD_INSET_VAR);
|
|
59
|
+
root.style.removeProperty(VISUAL_VIEWPORT_HEIGHT_VAR);
|
|
60
|
+
root.style.removeProperty(VISUAL_VIEWPORT_OFFSET_TOP_VAR);
|
|
61
|
+
root.removeAttribute(KEYBOARD_OPEN_ATTRIBUTE);
|
|
62
|
+
root.removeAttribute(KEYBOARD_SOURCE_ATTRIBUTE);
|
|
63
|
+
setState(CLOSED);
|
|
64
|
+
};
|
|
65
|
+
if (source === "native") {
|
|
66
|
+
const handleWillShow = (event) => {
|
|
67
|
+
publish(
|
|
68
|
+
Math.max(
|
|
69
|
+
0,
|
|
70
|
+
Math.round(event.keyboardHeight ?? 0)
|
|
71
|
+
)
|
|
72
|
+
);
|
|
73
|
+
};
|
|
74
|
+
const handleWillHide = () => publish(0);
|
|
75
|
+
root.setAttribute(KEYBOARD_SOURCE_ATTRIBUTE, source);
|
|
76
|
+
publish(0);
|
|
77
|
+
window.addEventListener("keyboardWillShow", handleWillShow);
|
|
78
|
+
window.addEventListener("keyboardWillHide", handleWillHide);
|
|
79
|
+
return () => {
|
|
80
|
+
window.removeEventListener("keyboardWillShow", handleWillShow);
|
|
81
|
+
window.removeEventListener("keyboardWillHide", handleWillHide);
|
|
82
|
+
clear();
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
const viewport = window.visualViewport;
|
|
86
|
+
if (!viewport) return;
|
|
87
|
+
let frame = 0;
|
|
88
|
+
const measure = () => {
|
|
89
|
+
frame = 0;
|
|
90
|
+
const zoomed = Math.abs(viewport.scale - 1) > 0.01;
|
|
91
|
+
const keyboardInset = zoomed ? 0 : Math.max(
|
|
92
|
+
0,
|
|
93
|
+
Math.round(
|
|
94
|
+
window.innerHeight - viewport.height - viewport.offsetTop
|
|
95
|
+
)
|
|
96
|
+
);
|
|
97
|
+
root.style.setProperty(
|
|
98
|
+
VISUAL_VIEWPORT_HEIGHT_VAR,
|
|
99
|
+
`${zoomed ? window.innerHeight : Math.round(viewport.height)}px`
|
|
100
|
+
);
|
|
101
|
+
root.style.setProperty(
|
|
102
|
+
VISUAL_VIEWPORT_OFFSET_TOP_VAR,
|
|
103
|
+
`${zoomed ? 0 : Math.round(viewport.offsetTop)}px`
|
|
104
|
+
);
|
|
105
|
+
publish(keyboardInset);
|
|
106
|
+
};
|
|
107
|
+
const schedule = () => {
|
|
108
|
+
if (frame === 0) frame = requestAnimationFrame(measure);
|
|
109
|
+
};
|
|
110
|
+
root.setAttribute(KEYBOARD_SOURCE_ATTRIBUTE, source);
|
|
111
|
+
measure();
|
|
112
|
+
viewport.addEventListener("resize", schedule);
|
|
113
|
+
viewport.addEventListener("scroll", schedule);
|
|
114
|
+
return () => {
|
|
115
|
+
cancelAnimationFrame(frame);
|
|
116
|
+
viewport.removeEventListener("resize", schedule);
|
|
117
|
+
viewport.removeEventListener("scroll", schedule);
|
|
118
|
+
clear();
|
|
119
|
+
};
|
|
120
|
+
}, [enabled, source]);
|
|
121
|
+
return state;
|
|
122
|
+
}
|
|
37
123
|
function useKeyboardShortcut(key, callback, options = {}) {
|
|
38
124
|
const {
|
|
39
125
|
enabled = true,
|
|
@@ -127,7 +213,12 @@ function useIsMobileOrTablet() {
|
|
|
127
213
|
return useMediaQuery("(max-width: 1023px)");
|
|
128
214
|
}
|
|
129
215
|
|
|
216
|
+
exports.KEYBOARD_INSET_VAR = KEYBOARD_INSET_VAR;
|
|
217
|
+
exports.KEYBOARD_OPEN_ATTRIBUTE = KEYBOARD_OPEN_ATTRIBUTE;
|
|
218
|
+
exports.KEYBOARD_SOURCE_ATTRIBUTE = KEYBOARD_SOURCE_ATTRIBUTE;
|
|
130
219
|
exports.RTL_LOCALES = RTL_LOCALES;
|
|
220
|
+
exports.VISUAL_VIEWPORT_HEIGHT_VAR = VISUAL_VIEWPORT_HEIGHT_VAR;
|
|
221
|
+
exports.VISUAL_VIEWPORT_OFFSET_TOP_VAR = VISUAL_VIEWPORT_OFFSET_TOP_VAR;
|
|
131
222
|
exports.isRtlLocale = isRtlLocale;
|
|
132
223
|
exports.useCommandK = useCommandK;
|
|
133
224
|
exports.useDirection = useDirection;
|
|
@@ -137,7 +228,8 @@ exports.useIsMobile = useIsMobile;
|
|
|
137
228
|
exports.useIsMobileOrTablet = useIsMobileOrTablet;
|
|
138
229
|
exports.useIsSmallTablet = useIsSmallTablet;
|
|
139
230
|
exports.useIsTablet = useIsTablet;
|
|
231
|
+
exports.useKeyboardInset = useKeyboardInset;
|
|
140
232
|
exports.useKeyboardShortcut = useKeyboardShortcut;
|
|
141
233
|
exports.useMediaQuery = useMediaQuery;
|
|
142
|
-
//# sourceMappingURL=chunk-
|
|
143
|
-
//# sourceMappingURL=chunk-
|
|
234
|
+
//# sourceMappingURL=chunk-LHBWRMNC.cjs.map
|
|
235
|
+
//# sourceMappingURL=chunk-LHBWRMNC.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/hooks/useDirection.ts","../src/hooks/useKeyboardInset.ts","../src/hooks/useKeyboardShortcut.ts","../src/hooks/useMediaQuery.ts"],"names":["useState","useEffect","useCallback"],"mappings":"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","file":"chunk-LHBWRMNC.cjs","sourcesContent":["import { useState, useEffect } from 'react';\nimport type { RefObject } from 'react';\n\nexport type Direction = 'ltr' | 'rtl';\n\n/** Locales whose primary script reads right-to-left. */\nexport const RTL_LOCALES = ['ar', 'he', 'fa', 'ur'] as const;\n\n/**\n * Returns true when the given locale (e.g. `ar`, `ar-SA`, `he_IL`) uses a\n * right-to-left script.\n */\nexport function isRtlLocale(locale: string): boolean {\n const lang = locale.toLowerCase().split(/[-_]/)[0];\n return (RTL_LOCALES as readonly string[]).includes(lang);\n}\n\nfunction resolveDirection(element?: HTMLElement | null): Direction {\n if (typeof document === 'undefined') return 'ltr';\n const target = element ?? document.documentElement;\n return getComputedStyle(target).direction === 'rtl' ? 'rtl' : 'ltr';\n}\n\n/**\n * Hook returning the effective text direction (`ltr` | `rtl`) inherited from\n * the nearest `dir` attribute — zero setup for consumers who set\n * `<html dir=\"rtl\">`.\n *\n * Use for JS-level direction logic that CSS logical properties can't cover:\n * inverting ArrowLeft/ArrowRight keyboard handling, popover/toast placement,\n * drag math, etc.\n *\n * @param elementRef - Optional ref; when provided, direction is resolved from\n * that element (respecting any local `dir` override) instead of `<html>`.\n *\n * @example\n * ```tsx\n * const direction = useDirection();\n * const nextKey = direction === 'rtl' ? 'ArrowLeft' : 'ArrowRight';\n * ```\n */\nexport function useDirection(\n elementRef?: RefObject<HTMLElement | null>\n): Direction {\n const [direction, setDirection] = useState<Direction>(() =>\n resolveDirection(elementRef?.current)\n );\n\n useEffect(() => {\n const update = () => setDirection(resolveDirection(elementRef?.current));\n update();\n // dir changes are rare; observing the whole tree for just this attribute is cheap.\n const observer = new MutationObserver(update);\n observer.observe(document.documentElement, {\n attributes: true,\n attributeFilter: ['dir'],\n subtree: true,\n });\n return () => observer.disconnect();\n }, [elementRef]);\n\n // Re-sync when a re-render points elementRef.current at a different node:\n // the MutationObserver only fires on `dir` attribute mutations, so a swapped\n // ref target with a different inherited direction would otherwise go stale.\n const currentElement = elementRef?.current ?? null;\n useEffect(() => {\n setDirection(resolveDirection(currentElement));\n }, [currentElement]);\n\n return direction;\n}\n","import { useEffect, useState } from 'react';\n\n/** CSS custom properties written to `<html>` while the hook is mounted. */\nexport const KEYBOARD_INSET_VAR = '--mieweb-keyboard-inset';\nexport const VISUAL_VIEWPORT_HEIGHT_VAR = '--mieweb-visual-viewport-height';\nexport const VISUAL_VIEWPORT_OFFSET_TOP_VAR =\n '--mieweb-visual-viewport-offset-top';\n/** Boolean attribute set on `<html>` while an on-screen keyboard is open. */\nexport const KEYBOARD_OPEN_ATTRIBUTE = 'data-keyboard-open';\n/** Attribute on `<html>` naming the active {@link KeyboardInsetSource}. */\nexport const KEYBOARD_SOURCE_ATTRIBUTE = 'data-keyboard-source';\n\n/**\n * Where keyboard metrics come from.\n *\n * - `'visual-viewport'` — the Visual Viewport API. Works in any browser, but\n * iOS only reports the keyboard once its slide-in animation has finished.\n * - `'native'` — `keyboardWillShow` / `keyboardWillHide` window events with a\n * `keyboardHeight` property, as fired by `cordova-plugin-ionic-keyboard` and\n * Capacitor's Keyboard plugin. They arrive *before* the keyboard animates,\n * so layout can move in step with it.\n */\nexport type KeyboardInsetSource = 'visual-viewport' | 'native';\n\nexport interface KeyboardInsetState {\n /** Pixels of the layout viewport covered by the on-screen keyboard. */\n keyboardInset: number;\n /** Whether an on-screen keyboard currently covers part of the page. */\n isKeyboardOpen: boolean;\n}\n\nexport interface UseKeyboardInsetOptions {\n /** Track the keyboard; `false` stops tracking and clears the CSS variables. @default true */\n enabled?: boolean;\n /** Where keyboard metrics come from. @default 'visual-viewport' */\n source?: KeyboardInsetSource;\n}\n\ninterface NativeKeyboardEvent extends Event {\n keyboardHeight?: number;\n}\n\nconst CLOSED: KeyboardInsetState = { keyboardInset: 0, isKeyboardOpen: false };\n\n/**\n * Tracks the on-screen keyboard and publishes it on `<html>`.\n *\n * ### `source: 'native'` (Cordova / Capacitor apps)\n *\n * Listens for the native keyboard plugin's `keyboardWillShow` /\n * `keyboardWillHide` window events. Configure the plugin so the WebView is\n * neither resized nor panned (for `cordova-plugin-ionic-keyboard`:\n * `KeyboardResize=false`), keep the app shell at full height, and move only\n * the composer dock by `--mieweb-keyboard-inset` with a short transition\n * (~250ms) so it rides up with the keyboard. Only `--mieweb-keyboard-inset`,\n * `data-keyboard-open` and `data-keyboard-source` are published; the\n * visual-viewport variables stay unset.\n *\n * ### `source: 'visual-viewport'` (browsers, default)\n *\n * Uses the Visual Viewport API.\n *\n * iOS Safari and WKWebView (Cordova) ignore\n * `interactive-widget=resizes-content`, and `dvh` does not shrink for the\n * keyboard: the page keeps its full height and iOS pans the visual viewport\n * to reveal the focused input, pushing headers off-screen. This hook\n * measures what is actually visible and publishes it on `<html>` so an app\n * shell can follow the visible area instead:\n *\n * - `--mieweb-keyboard-inset` — keyboard height in px (0 when closed)\n * - `--mieweb-visual-viewport-height` — visible height in px\n * - `--mieweb-visual-viewport-offset-top` — how far iOS panned the page\n * - `data-keyboard-open` — present while the keyboard is open\n *\n * On browsers that already resize the layout for the keyboard (Chrome on\n * Android with `interactive-widget=resizes-content`) the inset stays 0 and\n * the variables simply mirror the layout viewport.\n *\n * iOS reports the visual viewport only after the keyboard has finished\n * animating, so a shell sized this way snaps into place once the keyboard\n * lands. Prefer `source: 'native'` wherever a native keyboard plugin exists.\n *\n * Mount it once, near the app root.\n *\n * @example\n * ```tsx\n * function AppShell({ children }) {\n * useKeyboardInset();\n * return (\n * <div\n * style={{\n * height: 'var(--mieweb-visual-viewport-height, 100dvh)',\n * transform: 'translateY(var(--mieweb-visual-viewport-offset-top, 0px))',\n * }}\n * >\n * {children}\n * </div>\n * );\n * }\n * ```\n *\n * @example Native app (keyboard plugin with WebView resizing disabled)\n * ```tsx\n * function ComposerDock({ children }) {\n * useKeyboardInset({ source: 'native' });\n * return (\n * <div\n * style={{\n * paddingBottom: 'calc(var(--mieweb-keyboard-inset, 0px) + 0.5rem)',\n * transition: 'padding-bottom 250ms ease',\n * }}\n * >\n * {children}\n * </div>\n * );\n * }\n * ```\n */\nexport function useKeyboardInset(\n options: UseKeyboardInsetOptions = {}\n): KeyboardInsetState {\n const { enabled = true, source = 'visual-viewport' } = options;\n const [state, setState] = useState<KeyboardInsetState>(CLOSED);\n\n useEffect(() => {\n if (!enabled || typeof window === 'undefined') return;\n const root = document.documentElement;\n\n const publish = (keyboardInset: number) => {\n const isKeyboardOpen = keyboardInset > 0;\n root.style.setProperty(KEYBOARD_INSET_VAR, `${keyboardInset}px`);\n root.toggleAttribute(KEYBOARD_OPEN_ATTRIBUTE, isKeyboardOpen);\n setState((previous) =>\n previous.keyboardInset === keyboardInset\n ? previous\n : { keyboardInset, isKeyboardOpen }\n );\n };\n\n const clear = () => {\n root.style.removeProperty(KEYBOARD_INSET_VAR);\n root.style.removeProperty(VISUAL_VIEWPORT_HEIGHT_VAR);\n root.style.removeProperty(VISUAL_VIEWPORT_OFFSET_TOP_VAR);\n root.removeAttribute(KEYBOARD_OPEN_ATTRIBUTE);\n root.removeAttribute(KEYBOARD_SOURCE_ATTRIBUTE);\n setState(CLOSED);\n };\n\n if (source === 'native') {\n const handleWillShow = (event: Event) => {\n publish(\n Math.max(\n 0,\n Math.round((event as NativeKeyboardEvent).keyboardHeight ?? 0)\n )\n );\n };\n const handleWillHide = () => publish(0);\n\n root.setAttribute(KEYBOARD_SOURCE_ATTRIBUTE, source);\n publish(0);\n window.addEventListener('keyboardWillShow', handleWillShow);\n window.addEventListener('keyboardWillHide', handleWillHide);\n\n return () => {\n window.removeEventListener('keyboardWillShow', handleWillShow);\n window.removeEventListener('keyboardWillHide', handleWillHide);\n clear();\n };\n }\n\n const viewport = window.visualViewport;\n if (!viewport) return;\n\n let frame = 0;\n\n const measure = () => {\n frame = 0;\n // Pinch-zoom shrinks the visual viewport too; that is not a keyboard.\n const zoomed = Math.abs(viewport.scale - 1) > 0.01;\n const keyboardInset = zoomed\n ? 0\n : Math.max(\n 0,\n Math.round(\n window.innerHeight - viewport.height - viewport.offsetTop\n )\n );\n\n root.style.setProperty(\n VISUAL_VIEWPORT_HEIGHT_VAR,\n `${zoomed ? window.innerHeight : Math.round(viewport.height)}px`\n );\n root.style.setProperty(\n VISUAL_VIEWPORT_OFFSET_TOP_VAR,\n `${zoomed ? 0 : Math.round(viewport.offsetTop)}px`\n );\n publish(keyboardInset);\n };\n\n // Coalesce the resize + scroll bursts iOS fires while the keyboard\n // animates into one write per frame.\n const schedule = () => {\n if (frame === 0) frame = requestAnimationFrame(measure);\n };\n\n root.setAttribute(KEYBOARD_SOURCE_ATTRIBUTE, source);\n measure();\n viewport.addEventListener('resize', schedule);\n viewport.addEventListener('scroll', schedule);\n\n return () => {\n cancelAnimationFrame(frame);\n viewport.removeEventListener('resize', schedule);\n viewport.removeEventListener('scroll', schedule);\n clear();\n };\n }, [enabled, source]);\n\n return state;\n}\n","import { useEffect, useCallback } from 'react';\n\n/**\n * Options for keyboard shortcut hook\n */\nexport interface KeyboardShortcutOptions {\n /** Whether the shortcut is currently enabled (default: true) */\n enabled?: boolean;\n /** Modifier keys required (default: none) */\n modifiers?: {\n ctrl?: boolean;\n shift?: boolean;\n alt?: boolean;\n meta?: boolean;\n };\n /** Whether to prevent default browser behavior (default: true) */\n preventDefault?: boolean;\n /** Whether to stop event propagation (default: false) */\n stopPropagation?: boolean;\n /** Element types to ignore when the shortcut is pressed (default: ['INPUT', 'TEXTAREA', 'SELECT']) */\n ignoreInputs?: boolean;\n}\n\n/**\n * Hook that triggers a callback when a specific keyboard shortcut is pressed.\n * Supports modifier keys (Ctrl, Shift, Alt, Meta) and ignores input fields by default.\n *\n * @param key - The key to listen for (e.g., 'k', 'Enter', 'Escape', '/')\n * @param callback - Function to call when the shortcut is pressed\n * @param options - Configuration options\n *\n * @example\n * ```tsx\n * // Cmd/Ctrl+K to open search\n * useKeyboardShortcut('k', openSearch, { modifiers: { meta: true, ctrl: true } });\n *\n * // Forward slash to focus search (ignoring when typing)\n * useKeyboardShortcut('/', focusSearch);\n *\n * // Escape to close modal\n * useKeyboardShortcut('Escape', closeModal);\n * ```\n */\nexport function useKeyboardShortcut(\n key: string,\n callback: (event: KeyboardEvent) => void,\n options: KeyboardShortcutOptions = {}\n): void {\n const {\n enabled = true,\n modifiers = {},\n preventDefault = true,\n stopPropagation = false,\n ignoreInputs = true,\n } = options;\n\n const handleKeyDown = useCallback(\n (event: KeyboardEvent) => {\n // Check if we should ignore input fields\n if (ignoreInputs) {\n const target = event.target as HTMLElement;\n const tagName = target.tagName.toUpperCase();\n if (\n tagName === 'INPUT' ||\n tagName === 'TEXTAREA' ||\n tagName === 'SELECT' ||\n target.isContentEditable\n ) {\n return;\n }\n }\n\n // Check modifiers\n const { ctrl, shift, alt, meta } = modifiers;\n\n // For Cmd+K style shortcuts, allow either meta (Mac) or ctrl (Windows/Linux)\n const metaOrCtrl = meta || ctrl;\n if (metaOrCtrl) {\n if (!(event.metaKey || event.ctrlKey)) return;\n } else {\n // If no meta/ctrl modifier specified, ensure neither is pressed\n if (event.metaKey || event.ctrlKey) return;\n }\n\n if (shift && !event.shiftKey) return;\n if (alt && !event.altKey) return;\n\n // Check key match (case-insensitive for letters)\n const eventKey =\n event.key.length === 1 ? event.key.toLowerCase() : event.key;\n const targetKey = key.length === 1 ? key.toLowerCase() : key;\n if (eventKey !== targetKey) return;\n\n if (preventDefault) {\n event.preventDefault();\n }\n if (stopPropagation) {\n event.stopPropagation();\n }\n\n callback(event);\n },\n [key, callback, modifiers, preventDefault, stopPropagation, ignoreInputs]\n );\n\n useEffect(() => {\n if (!enabled) return;\n\n document.addEventListener('keydown', handleKeyDown);\n return () => document.removeEventListener('keydown', handleKeyDown);\n }, [handleKeyDown, enabled]);\n}\n\n/**\n * Hook for the common Cmd/Ctrl+K shortcut pattern (command palette, search, etc.)\n *\n * @param callback - Function to call when Cmd/Ctrl+K is pressed\n * @param enabled - Whether the shortcut is active (default: true)\n *\n * @example\n * ```tsx\n * useCommandK(() => setIsOpen(true));\n * ```\n */\nexport function useCommandK(callback: () => void, enabled = true): void {\n useKeyboardShortcut('k', callback, {\n enabled,\n modifiers: { meta: true, ctrl: true },\n ignoreInputs: false, // Cmd+K should work even in inputs\n });\n}\n","import { useState, useEffect } from 'react';\n\n/**\n * Hook that tracks whether a media query matches.\n * Uses the native `matchMedia` API for efficient media query tracking.\n *\n * @param query - CSS media query string (e.g., '(min-width: 768px)')\n * @returns Boolean indicating whether the media query matches\n *\n * @example\n * ```tsx\n * function ResponsiveComponent() {\n * const isMobile = useMediaQuery('(max-width: 767px)');\n * const isTablet = useMediaQuery('(min-width: 768px) and (max-width: 1023px)');\n * const isDesktop = useMediaQuery('(min-width: 1024px)');\n *\n * return (\n * <div>\n * {isMobile && <MobileLayout />}\n * {isTablet && <TabletLayout />}\n * {isDesktop && <DesktopLayout />}\n * </div>\n * );\n * }\n * ```\n */\nexport function useMediaQuery(query: string): boolean {\n // Initialize with null to indicate SSR/initial state\n const [matches, setMatches] = useState<boolean>(() => {\n // Check if we're in a browser environment\n if (typeof window === 'undefined') return false;\n return window.matchMedia(query).matches;\n });\n\n useEffect(() => {\n if (typeof window === 'undefined') return;\n\n const mediaQuery = window.matchMedia(query);\n\n // Set initial value\n setMatches(mediaQuery.matches);\n\n // Handler for media query changes\n const handler = (event: MediaQueryListEvent) => {\n setMatches(event.matches);\n };\n\n // Modern browsers use addEventListener\n if (mediaQuery.addEventListener) {\n mediaQuery.addEventListener('change', handler);\n return () => mediaQuery.removeEventListener('change', handler);\n }\n\n // Fallback for older browsers\n mediaQuery.addListener(handler);\n return () => mediaQuery.removeListener(handler);\n }, [query]);\n\n return matches;\n}\n\n/**\n * Preset breakpoint hooks following common responsive design patterns\n */\n\n/** Returns true when viewport is smaller than 640px (mobile) */\nexport function useIsMobile(): boolean {\n return useMediaQuery('(max-width: 639px)');\n}\n\n/** Returns true when viewport is 640px-767px (large mobile / small tablet) */\nexport function useIsSmallTablet(): boolean {\n return useMediaQuery('(min-width: 640px) and (max-width: 767px)');\n}\n\n/** Returns true when viewport is 768px-1023px (tablet) */\nexport function useIsTablet(): boolean {\n return useMediaQuery('(min-width: 768px) and (max-width: 1023px)');\n}\n\n/** Returns true when viewport is 1024px or larger (desktop) */\nexport function useIsDesktop(): boolean {\n return useMediaQuery('(min-width: 1024px)');\n}\n\n/** Returns true when viewport is 1280px or larger (large desktop) */\nexport function useIsLargeDesktop(): boolean {\n return useMediaQuery('(min-width: 1280px)');\n}\n\n/** Returns true when viewport is smaller than 1024px (mobile/tablet) */\nexport function useIsMobileOrTablet(): boolean {\n return useMediaQuery('(max-width: 1023px)');\n}\n"]}
|