@marktiderman/genesis-ui 1.3.0 → 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/AppShell-BJarYZzz.d.ts +198 -0
- package/dist/{chunk-NJMO3VPA.js → chunk-22XB3Q6H.js} +8 -8
- package/dist/chunk-22XB3Q6H.js.map +1 -0
- package/dist/{chunk-2MXMWBDV.js → chunk-27ELYTGE.js} +6 -6
- package/dist/chunk-27ELYTGE.js.map +1 -0
- package/dist/chunk-46TZGMFW.js +159 -0
- package/dist/chunk-46TZGMFW.js.map +1 -0
- package/dist/chunk-4CQHPWJD.js +117 -0
- package/dist/chunk-4CQHPWJD.js.map +1 -0
- package/dist/{chunk-ZDAT5JDH.js → chunk-65SPT7EA.js} +24 -6
- package/dist/chunk-65SPT7EA.js.map +1 -0
- package/dist/chunk-6KHY647C.js +67 -0
- package/dist/chunk-6KHY647C.js.map +1 -0
- package/dist/chunk-6M4NHHKG.js +51 -0
- package/dist/chunk-6M4NHHKG.js.map +1 -0
- package/dist/chunk-6Q6CLLJ4.js +9 -0
- package/dist/chunk-6Q6CLLJ4.js.map +1 -0
- package/dist/{chunk-UGHQFQOE.js → chunk-6TVMQH6M.js} +28 -28
- package/dist/chunk-6TVMQH6M.js.map +1 -0
- package/dist/{chunk-6VVVGYKS.js → chunk-6XPMU65K.js} +5 -5
- package/dist/{chunk-6VVVGYKS.js.map → chunk-6XPMU65K.js.map} +1 -1
- package/dist/{chunk-YZEA5TGK.js → chunk-7XMZVISM.js} +16 -16
- package/dist/chunk-7XMZVISM.js.map +1 -0
- package/dist/chunk-A7AHVDG7.js +52 -0
- package/dist/chunk-A7AHVDG7.js.map +1 -0
- package/dist/chunk-AFZ76Q26.js +84 -0
- package/dist/chunk-AFZ76Q26.js.map +1 -0
- package/dist/{chunk-4V4H2ZM7.js → chunk-AL5TMEZQ.js} +31 -31
- package/dist/chunk-AL5TMEZQ.js.map +1 -0
- package/dist/{chunk-AUECDWP2.js → chunk-AOZGQM6W.js} +3 -3
- package/dist/chunk-AOZGQM6W.js.map +1 -0
- package/dist/chunk-ARJI2JUV.js +122 -0
- package/dist/chunk-ARJI2JUV.js.map +1 -0
- package/dist/chunk-AVFZ4P4B.js +25 -0
- package/dist/chunk-AVFZ4P4B.js.map +1 -0
- package/dist/chunk-B2GIBUQD.js +11 -0
- package/dist/chunk-B2GIBUQD.js.map +1 -0
- package/dist/{chunk-JXI2MYL3.js → chunk-C46ITXE4.js} +5 -5
- package/dist/chunk-C46ITXE4.js.map +1 -0
- package/dist/{chunk-A2OXCNNY.js → chunk-CNTWQSUT.js} +3 -3
- package/dist/{chunk-A2OXCNNY.js.map → chunk-CNTWQSUT.js.map} +1 -1
- package/dist/chunk-D2LIXA2Y.js +65 -0
- package/dist/chunk-D2LIXA2Y.js.map +1 -0
- package/dist/{chunk-T5VX5DYO.js → chunk-F47U5KNW.js} +5 -5
- package/dist/chunk-F47U5KNW.js.map +1 -0
- package/dist/chunk-FEJAZFP3.js +1100 -0
- package/dist/chunk-FEJAZFP3.js.map +1 -0
- package/dist/{chunk-2B3MFHBQ.js → chunk-FK42ZGGV.js} +21 -21
- package/dist/chunk-FK42ZGGV.js.map +1 -0
- package/dist/{chunk-XISSLIMH.js → chunk-FTTNGGLA.js} +2 -2
- package/dist/{chunk-XISSLIMH.js.map → chunk-FTTNGGLA.js.map} +1 -1
- package/dist/chunk-G5YKBPBF.js +74 -0
- package/dist/chunk-G5YKBPBF.js.map +1 -0
- package/dist/{chunk-KB5T5LWM.js → chunk-IJCT5IJD.js} +3 -3
- package/dist/{chunk-KB5T5LWM.js.map → chunk-IJCT5IJD.js.map} +1 -1
- package/dist/{chunk-44TULYGG.js → chunk-J6FBA7PH.js} +3 -3
- package/dist/{chunk-44TULYGG.js.map → chunk-J6FBA7PH.js.map} +1 -1
- package/dist/chunk-JAMLFMDS.js +12 -0
- package/dist/chunk-JAMLFMDS.js.map +1 -0
- package/dist/{chunk-C6H7AMO4.js → chunk-LNFF2RBD.js} +9 -9
- package/dist/chunk-LNFF2RBD.js.map +1 -0
- package/dist/{chunk-QBZMY2AF.js → chunk-M62CHO3N.js} +18 -18
- package/dist/chunk-M62CHO3N.js.map +1 -0
- package/dist/{chunk-5Q4FABZQ.js → chunk-NUXW6NPP.js} +8 -8
- package/dist/chunk-NUXW6NPP.js.map +1 -0
- package/dist/{chunk-ZJFSZFPI.js → chunk-NWSCYLPT.js} +77 -18
- package/dist/chunk-NWSCYLPT.js.map +1 -0
- package/dist/{chunk-63FW5ZUA.js → chunk-P3ZL6FGR.js} +7 -7
- package/dist/chunk-P3ZL6FGR.js.map +1 -0
- package/dist/chunk-P64MFQXZ.js +191 -0
- package/dist/chunk-P64MFQXZ.js.map +1 -0
- package/dist/chunk-PLIYF6KI.js +52 -0
- package/dist/chunk-PLIYF6KI.js.map +1 -0
- package/dist/chunk-PSR47JRA.js +26 -0
- package/dist/chunk-PSR47JRA.js.map +1 -0
- package/dist/{chunk-QLCDAFS7.js → chunk-Q4I4SFBD.js} +3 -3
- package/dist/chunk-Q4I4SFBD.js.map +1 -0
- package/dist/{chunk-SBJV3K4G.js → chunk-QJ6P2DW6.js} +28 -28
- package/dist/chunk-QJ6P2DW6.js.map +1 -0
- package/dist/{chunk-IP6TMT3D.js → chunk-R7QFP6EL.js} +3 -3
- package/dist/chunk-R7QFP6EL.js.map +1 -0
- package/dist/{chunk-WZWR2ELB.js → chunk-SEBU6JCK.js} +6 -6
- package/dist/chunk-SEBU6JCK.js.map +1 -0
- package/dist/{chunk-7OBL3H5P.js → chunk-SEFK4NZV.js} +3 -3
- package/dist/chunk-SEFK4NZV.js.map +1 -0
- package/dist/chunk-SRIT4NFQ.js +67 -0
- package/dist/chunk-SRIT4NFQ.js.map +1 -0
- package/dist/chunk-SY62XJFA.js +19 -0
- package/dist/chunk-SY62XJFA.js.map +1 -0
- package/dist/{chunk-SVXDWPLO.js → chunk-THD3YOOZ.js} +17 -17
- package/dist/chunk-THD3YOOZ.js.map +1 -0
- package/dist/chunk-VXFYETRK.js +58 -0
- package/dist/chunk-VXFYETRK.js.map +1 -0
- package/dist/chunk-XBX6QMR5.js +58 -0
- package/dist/chunk-XBX6QMR5.js.map +1 -0
- package/dist/{chunk-SCUT2ZCD.js → chunk-XCGZPFT7.js} +17 -17
- package/dist/chunk-XCGZPFT7.js.map +1 -0
- package/dist/chunk-XMK3T4TA.js +73 -0
- package/dist/chunk-XMK3T4TA.js.map +1 -0
- package/dist/chunk-YJ6MPS6U.js +226 -0
- package/dist/chunk-YJ6MPS6U.js.map +1 -0
- package/dist/chunk-YRYQXU3G.js +38 -0
- package/dist/chunk-YRYQXU3G.js.map +1 -0
- package/dist/{chunk-5J7BP5DI.js → chunk-YWFPMND7.js} +10 -10
- package/dist/chunk-YWFPMND7.js.map +1 -0
- package/dist/chunk-YYEGAFUE.js +94 -0
- package/dist/chunk-YYEGAFUE.js.map +1 -0
- package/dist/{chunk-TKA4LOMT.js → chunk-ZZ7H7VVX.js} +8 -8
- package/dist/chunk-ZZ7H7VVX.js.map +1 -0
- package/dist/components/data/index.d.ts +194 -211
- package/dist/components/data/index.js +362 -1381
- package/dist/components/data/index.js.map +1 -1
- package/dist/components/layout/dashboard-page.d.ts +4 -0
- package/dist/components/layout/dashboard-page.js +5 -0
- package/dist/components/layout/dashboard-page.js.map +1 -0
- package/dist/components/layout/detail-page.d.ts +91 -0
- package/dist/components/layout/detail-page.js +6 -0
- package/dist/components/layout/detail-page.js.map +1 -0
- package/dist/components/layout/form-page.d.ts +82 -0
- package/dist/components/layout/form-page.js +5 -0
- package/dist/components/layout/form-page.js.map +1 -0
- package/dist/components/layout/index.d.ts +15 -0
- package/dist/components/layout/index.js +21 -0
- package/dist/components/layout/index.js.map +1 -0
- package/dist/components/layout/settings-page.d.ts +114 -0
- package/dist/components/layout/settings-page.js +6 -0
- package/dist/components/layout/settings-page.js.map +1 -0
- package/dist/components/patterns/empty-state.d.ts +74 -0
- package/dist/components/{ui → patterns}/empty-state.js +2 -1
- package/dist/components/{ui → patterns}/form-field.d.ts +2 -2
- package/dist/components/{ui → patterns}/form-field.js +2 -2
- package/dist/components/patterns/index.d.ts +18 -0
- package/dist/components/patterns/index.js +18 -0
- package/dist/components/patterns/index.js.map +1 -0
- package/dist/components/patterns/page-loading.d.ts +25 -0
- package/dist/components/patterns/page-loading.js +5 -0
- package/dist/components/patterns/page-loading.js.map +1 -0
- package/dist/components/patterns/settings-row.d.ts +42 -0
- package/dist/components/patterns/settings-row.js +6 -0
- package/dist/components/patterns/settings-row.js.map +1 -0
- package/dist/components/patterns/status-badge.d.ts +38 -0
- package/dist/components/patterns/status-badge.js +4 -0
- package/dist/components/patterns/status-badge.js.map +1 -0
- package/dist/components/patterns/toggle-row.d.ts +36 -0
- package/dist/components/patterns/toggle-row.js +8 -0
- package/dist/components/patterns/toggle-row.js.map +1 -0
- package/dist/components/patterns/user-avatar.d.ts +34 -0
- package/dist/components/patterns/user-avatar.js +5 -0
- package/dist/components/patterns/user-avatar.js.map +1 -0
- package/dist/components/ui/accessible-icon.d.ts +48 -0
- package/dist/components/ui/accessible-icon.js +3 -0
- package/dist/components/ui/accessible-icon.js.map +1 -0
- package/dist/components/ui/accordion.d.ts +5 -5
- package/dist/components/ui/accordion.js +1 -1
- package/dist/components/ui/alert-dialog.d.ts +10 -10
- package/dist/components/ui/alert-dialog.js +1 -1
- package/dist/components/ui/aspect-ratio.d.ts +2 -2
- package/dist/components/ui/aspect-ratio.js +1 -1
- package/dist/components/ui/avatar.d.ts +4 -4
- package/dist/components/ui/avatar.js +1 -1
- package/dist/components/ui/button.d.ts +73 -8
- package/dist/components/ui/button.js +1 -1
- package/dist/components/ui/calendar.js +2 -2
- package/dist/components/ui/carousel.d.ts +4 -3
- package/dist/components/ui/carousel.js +2 -2
- package/dist/components/ui/checkbox.d.ts +2 -2
- package/dist/components/ui/checkbox.js +1 -1
- package/dist/components/ui/collapsible.d.ts +4 -4
- package/dist/components/ui/collapsible.js +1 -1
- package/dist/components/ui/command-palette.js +3 -3
- package/dist/components/ui/command.d.ts +9 -9
- package/dist/components/ui/command.js +2 -2
- package/dist/components/ui/context-menu.d.ts +15 -15
- package/dist/components/ui/context-menu.js +1 -1
- package/dist/components/ui/date-picker.js +4 -4
- package/dist/components/ui/dialog.d.ts +9 -9
- package/dist/components/ui/dialog.js +1 -1
- package/dist/components/ui/drawer.d.ts +7 -7
- package/dist/components/ui/dropdown-menu.d.ts +15 -15
- package/dist/components/ui/dropdown-menu.js +1 -1
- package/dist/components/ui/hover-card.d.ts +4 -4
- package/dist/components/ui/hover-card.js +1 -1
- package/dist/components/ui/input-otp.d.ts +2 -2
- package/dist/components/ui/label.d.ts +2 -2
- package/dist/components/ui/label.js +1 -1
- package/dist/components/ui/menubar.d.ts +16 -16
- package/dist/components/ui/menubar.js +1 -1
- package/dist/components/ui/navigation-menu.d.ts +9 -9
- package/dist/components/ui/navigation-menu.js +1 -1
- package/dist/components/ui/pagination.js +2 -2
- package/dist/components/ui/password-toggle-field.d.ts +121 -0
- package/dist/components/ui/password-toggle-field.js +4 -0
- package/dist/components/ui/password-toggle-field.js.map +1 -0
- package/dist/components/ui/popover.d.ts +4 -4
- package/dist/components/ui/popover.js +1 -1
- package/dist/components/ui/radio-group.d.ts +3 -3
- package/dist/components/ui/radio-group.js +1 -1
- package/dist/components/ui/resizable.d.ts +1 -1
- package/dist/components/ui/scroll-area.d.ts +60 -3
- package/dist/components/ui/scroll-area.js +1 -1
- package/dist/components/ui/select.d.ts +9 -9
- package/dist/components/ui/select.js +1 -1
- package/dist/components/ui/sheet.d.ts +11 -9
- package/dist/components/ui/sheet.js +1 -1
- package/dist/components/ui/slider.d.ts +2 -2
- package/dist/components/ui/slider.js +1 -1
- package/dist/components/ui/switch.d.ts +2 -2
- package/dist/components/ui/switch.js +1 -1
- package/dist/components/ui/tabs.d.ts +29 -14
- package/dist/components/ui/tabs.js +1 -1
- package/dist/components/ui/toggle-group.d.ts +3 -3
- package/dist/components/ui/toggle-group.js +2 -2
- package/dist/components/ui/toggle.d.ts +2 -2
- package/dist/components/ui/toggle.js +1 -1
- package/dist/components/ui/toolbar.d.ts +104 -0
- package/dist/components/ui/toolbar.js +6 -0
- package/dist/components/ui/toolbar.js.map +1 -0
- package/dist/components/ui/tooltip.d.ts +46 -4
- package/dist/components/ui/tooltip.js +1 -1
- package/dist/components/ui/visually-hidden.d.ts +48 -0
- package/dist/components/ui/visually-hidden.js +4 -0
- package/dist/components/ui/visually-hidden.js.map +1 -0
- package/dist/dashboard-page-C0TihRl5.d.ts +107 -0
- package/dist/hooks/index.d.ts +2 -2
- package/dist/hooks/index.js +6 -6
- package/dist/hooks/use-keyboard-navigation.d.ts +58 -2
- package/dist/hooks/use-keyboard-navigation.js +1 -1
- package/dist/hooks/use-resource-page.d.ts +2 -2
- package/dist/hooks/use-resource-page.js +2 -2
- package/dist/hooks/use-view-preference.d.ts +1 -1
- package/dist/hooks/use-view-preference.js +1 -1
- package/dist/index.d.ts +23 -25
- package/dist/index.js +54 -38
- package/dist/spacing-BS6qECD4.d.ts +191 -0
- package/dist/split-Dk9f4Mi0.d.ts +57 -0
- package/dist/{use-resource-page-BXBv_Xah.d.ts → use-resource-page-CPs6wjKt.d.ts} +1 -1
- package/dist/view-settings--KXNT_jE.d.ts +12 -0
- package/package.json +73 -32
- package/dist/chunk-2B3MFHBQ.js.map +0 -1
- package/dist/chunk-2MXMWBDV.js.map +0 -1
- package/dist/chunk-4V4H2ZM7.js.map +0 -1
- package/dist/chunk-5J7BP5DI.js.map +0 -1
- package/dist/chunk-5Q4FABZQ.js.map +0 -1
- package/dist/chunk-63FW5ZUA.js.map +0 -1
- package/dist/chunk-7OBL3H5P.js.map +0 -1
- package/dist/chunk-AUECDWP2.js.map +0 -1
- package/dist/chunk-C6H7AMO4.js.map +0 -1
- package/dist/chunk-EI5EGKHL.js +0 -32
- package/dist/chunk-EI5EGKHL.js.map +0 -1
- package/dist/chunk-IP6TMT3D.js.map +0 -1
- package/dist/chunk-JJ4NOMMI.js +0 -73
- package/dist/chunk-JJ4NOMMI.js.map +0 -1
- package/dist/chunk-JXI2MYL3.js.map +0 -1
- package/dist/chunk-KBS4BHME.js +0 -11
- package/dist/chunk-KBS4BHME.js.map +0 -1
- package/dist/chunk-LRXDZBV2.js +0 -26
- package/dist/chunk-LRXDZBV2.js.map +0 -1
- package/dist/chunk-NJMO3VPA.js.map +0 -1
- package/dist/chunk-OCTV3S4I.js +0 -29
- package/dist/chunk-OCTV3S4I.js.map +0 -1
- package/dist/chunk-QBZMY2AF.js.map +0 -1
- package/dist/chunk-QLCDAFS7.js.map +0 -1
- package/dist/chunk-SBJV3K4G.js.map +0 -1
- package/dist/chunk-SCUT2ZCD.js.map +0 -1
- package/dist/chunk-SVXDWPLO.js.map +0 -1
- package/dist/chunk-T465NJRL.js +0 -134
- package/dist/chunk-T465NJRL.js.map +0 -1
- package/dist/chunk-T5VX5DYO.js.map +0 -1
- package/dist/chunk-TKA4LOMT.js.map +0 -1
- package/dist/chunk-UGHQFQOE.js.map +0 -1
- package/dist/chunk-WALXVR6V.js +0 -9
- package/dist/chunk-WALXVR6V.js.map +0 -1
- package/dist/chunk-WZWR2ELB.js.map +0 -1
- package/dist/chunk-YZEA5TGK.js.map +0 -1
- package/dist/chunk-ZDAT5JDH.js.map +0 -1
- package/dist/chunk-ZJFSZFPI.js.map +0 -1
- package/dist/components/ui/empty-state.d.ts +0 -22
- /package/dist/components/{ui → patterns}/empty-state.js.map +0 -0
- /package/dist/components/{ui → patterns}/form-field.js.map +0 -0
- /package/dist/{ViewToggle-DDe_Luj2.d.ts → view-toggle-DDe_Luj2.d.ts} +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/layout/detail-page.tsx"],"names":[],"mappings":";;;;;AA4FO,IAAM,UAAA,GAAmB,KAAA,CAAA,UAAA;AAAA,EAC9B,CACE;AAAA,IACE,SAAA;AAAA,IACA,KAAA;AAAA,IACA,QAAA;AAAA,IACA,UAAA;AAAA,IACA,OAAA;AAAA,IACA,OAAA;AAAA,IACA,SAAA,GAAY,IAAA;AAAA,IACZ,MAAA;AAAA,IACA,QAAA;AAAA,IACA,GAAG;AAAA,KAEL,GAAA,KACG;AACH,IAAA,MAAM,0BACJ,GAAA,CAAC,KAAA,EAAA,EAAI,aAAU,qBAAA,EAAsB,SAAA,EAAU,WAC5C,QAAA,EACH,CAAA;AAGF,IAAA,uBACE,IAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,GAAA;AAAA,QACA,WAAA,EAAU,aAAA;AAAA,QACV,aAAA,EAAa,MAAA;AAAA,QAGb,SAAA,EAAW,EAAA,CAAG,qBAAA,EAAuB,SAAS,CAAA;AAAA,QAC7C,GAAG,KAAA;AAAA,QAEJ,QAAA,EAAA;AAAA,0BAAA,IAAA;AAAA,YAAC,QAAA;AAAA,YAAA;AAAA,cACC,WAAA,EAAU,oBAAA;AAAA,cACV,SAAA,EAAU,4EAAA;AAAA,cAEV,QAAA,EAAA;AAAA,gCAAA,IAAA,CAAC,KAAA,EAAA,EAAI,WAAU,6BAAA,EACZ,QAAA,EAAA;AAAA,kBAAA,UAAA,mBACC,GAAA,CAAC,KAAA,EAAA,EAAI,WAAA,EAAU,wBAAA,EAA0B,sBAAW,CAAA,GAClD,IAAA;AAAA,kCACJ,GAAA;AAAA,oBAAC,IAAA;AAAA,oBAAA;AAAA,sBACC,WAAA,EAAU,mBAAA;AAAA,sBACV,SAAA,EAAU,uDAAA;AAAA,sBAET,QAAA,EAAA;AAAA;AAAA,mBACH;AAAA,kBACC,QAAA,mBACC,GAAA;AAAA,oBAAC,GAAA;AAAA,oBAAA;AAAA,sBACC,WAAA,EAAU,sBAAA;AAAA,sBACV,SAAA,EAAU,+BAAA;AAAA,sBAET,QAAA,EAAA;AAAA;AAAA,mBACH,GACE;AAAA,iBAAA,EACN,CAAA;AAAA,gBACC,OAAA,mBACC,GAAA;AAAA,kBAAC,KAAA;AAAA,kBAAA;AAAA,oBACC,WAAA,EAAU,qBAAA;AAAA,oBACV,SAAA,EAAU,kCAAA;AAAA,oBAET,QAAA,EAAA;AAAA;AAAA,iBACH,GACE;AAAA;AAAA;AAAA,WACN;AAAA,UAEC,OAAA,mBACC,GAAA;AAAA,YAAC,KAAA;AAAA,YAAA;AAAA,cACC,EAAA,EAAI,SAAA;AAAA,cACJ,KAAA,EAAM,KAAA;AAAA,cACN,GAAA,EAAI,IAAA;AAAA,cACJ,KAAA,EAAO,OAAA;AAAA,cACP,qBACE,GAAA,CAAC,OAAA,EAAA,EAAM,aAAU,qBAAA,EAAsB,SAAA,EAAU,WAC9C,QAAA,EAAA,OAAA,EACH;AAAA;AAAA,WAEJ,GAEA;AAAA;AAAA;AAAA,KAEJ;AAAA,EAEJ;AACF;AACA,UAAA,CAAW,WAAA,GAAc,YAAA","file":"chunk-AFZ76Q26.js","sourcesContent":["import * as React from \"react\";\nimport { cn } from \"../../utils\";\nimport { Split, type SplitBreakpoint } from \"./split\";\n\nexport interface DetailPageProps\n // `HTMLAttributes` already declares `title?: string` (the native tooltip\n // attribute). Omit it before redeclaring the page title as a ReactNode —\n // the same collision `Section` handles, for the same reason.\n extends Omit<React.HTMLAttributes<HTMLDivElement>, \"title\"> {\n /** Page title. Rendered as the page's single `<h1>`. */\n title: React.ReactNode;\n /** Supporting line under the title — a status, an owner, a last-updated. */\n subtitle?: React.ReactNode;\n /** Slot above the title: a `Breadcrumb`, a back link, a `StatusBadge`. */\n breadcrumb?: React.ReactNode;\n /** Trailing controls for the whole record — Edit, Archive, a menu. */\n actions?: React.ReactNode;\n /**\n * Metadata column. Omit it and the content region takes the full width —\n * no empty track, no `Split`, no wrapper to reason about.\n */\n sidebar?: React.ReactNode;\n /**\n * Breakpoint at and above which the sidebar sits beside the content.\n * Below it the two stack, content first. Default `\"lg\"`.\n */\n sidebarAt?: SplitBreakpoint;\n /** Stable test/automation selector (emitted as `data-testid`). */\n testID?: string;\n}\n\n/**\n * DetailPage — one record's full view: a title row with actions, a primary\n * content region, and a metadata sidebar that drops below the content on\n * small screens.\n *\n * ```tsx\n * <DetailPage\n * breadcrumb={<Breadcrumb>…</Breadcrumb>}\n * title={person.name}\n * subtitle={person.role}\n * actions={<Button testID=\"edit\">Edit</Button>}\n * sidebar={\n * <Stack gap=\"lg\">\n * <StatCard label=\"Sessions\" value={12} />\n * <SettingsRow label=\"Owner\">{person.owner}</SettingsRow>\n * </Stack>\n * }\n * >\n * <Section title=\"Timeline\">{…}</Section>\n * </DetailPage>\n * ```\n *\n * `Split` is the backbone, at `ratio=\"2/3\"` — content takes eight of twelve\n * tracks, metadata four. Reading order is content-then-metadata in the DOM,\n * which is also the order they stack in, so a phone shows the record before\n * its provenance rather than after it.\n *\n * This is a **layout**: it positions three regions and never asks what is in\n * them. Fetching the record is the caller's job — or\n * `ResourceDetailPage` from `@marktiderman/genesis-ui/data`, which is this\n * component with `useOne` wired to its title, content and sidebar.\n *\n * The header row is markup, not a component, and deliberately not\n * `PageHeader` — which now sits in this same folder, so composing it would\n * be legal. It was tried and measured, and it does not fit:\n *\n * 1. `PageHeader.title` and `.subtitle` are `string`. Every template's title\n * would narrow from `ReactNode`, and a record heading is the one place a\n * `StatusBadge` beside the name is routine.\n * 2. `@marktiderman/genesis-ui/detail-page`'s emitted closure goes from\n * 5.8 KB / 5 chunks to 34.4 KB / 14, and picks up a runtime dependency on\n * `radix-ui` (Popover, Collapsible, Switch, and Select via `ViewSettings`)\n * — for a header that renders a title, a line under it and a slot, and\n * mounts none of that. Per-component subpaths exist so a consumer does\n * not pay for what they did not import.\n * 3. `PageHeader` has no slot above the title, and hard-codes\n * `data-testid=\"page-title\"` on its `<h1>`.\n *\n * Not a reason, having checked it: RSC. `PageHeader` is `\"use client\"`, but\n * the emitted `detail-page.js` is NOT stamped with the directive when it\n * imports it — a server module importing a client module is the ordinary\n * boundary. What would make folding correct is upstream: widen `title` /\n * `subtitle` to `ReactNode`, and lift the list chrome out of `PageHeader`.\n *\n * Width is deliberately not an opinion here. `Container` already answers\n * \"how wide is this page\", so wrap rather than duplicate:\n * `<Container size=\"lg\"><DetailPage … /></Container>`. Under `AppShell`,\n * whose `<main>` already pads, most pages want neither.\n *\n * @stability Beta\n */\nexport const DetailPage = React.forwardRef<HTMLDivElement, DetailPageProps>(\n (\n {\n className,\n title,\n subtitle,\n breadcrumb,\n actions,\n sidebar,\n sidebarAt = \"lg\",\n testID,\n children,\n ...props\n },\n ref\n ) => {\n const content = (\n <div data-slot=\"detail-page-content\" className=\"min-w-0\">\n {children}\n </div>\n );\n\n return (\n <div\n ref={ref}\n data-slot=\"detail-page\"\n data-testid={testID}\n // gap-6 is the `xl` step of the shared spacing scale (24px), the same\n // rhythm `Section` uses between a page's top-level regions.\n className={cn(\"flex flex-col gap-6\", className)}\n {...props}\n >\n <header\n data-slot=\"detail-page-header\"\n className=\"flex flex-col gap-1 sm:flex-row sm:items-start sm:justify-between sm:gap-4\"\n >\n <div className=\"flex min-w-0 flex-col gap-1\">\n {breadcrumb ? (\n <div data-slot=\"detail-page-breadcrumb\">{breadcrumb}</div>\n ) : null}\n <h1\n data-slot=\"detail-page-title\"\n className=\"truncate text-xl font-bold tracking-tight sm:text-2xl\"\n >\n {title}\n </h1>\n {subtitle ? (\n <p\n data-slot=\"detail-page-subtitle\"\n className=\"text-sm text-muted-foreground\"\n >\n {subtitle}\n </p>\n ) : null}\n </div>\n {actions ? (\n <div\n data-slot=\"detail-page-actions\"\n className=\"flex shrink-0 items-center gap-2\"\n >\n {actions}\n </div>\n ) : null}\n </header>\n\n {sidebar ? (\n <Split\n at={sidebarAt}\n ratio=\"2/3\"\n gap=\"xl\"\n start={content}\n end={\n <aside data-slot=\"detail-page-sidebar\" className=\"min-w-0\">\n {sidebar}\n </aside>\n }\n />\n ) : (\n content\n )}\n </div>\n );\n }\n);\nDetailPage.displayName = \"DetailPage\";\n"]}
|
|
@@ -1,17 +1,17 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
import { cn } from './chunk-NZ5WBA4R.js';
|
|
3
3
|
import * as React from 'react';
|
|
4
|
-
import
|
|
4
|
+
import { Menubar as Menubar$1 } from 'radix-ui';
|
|
5
5
|
import { ChevronRight, Check, Circle } from 'lucide-react';
|
|
6
6
|
import { jsx, jsxs } from 'react/jsx-runtime';
|
|
7
7
|
|
|
8
|
-
var MenubarMenu =
|
|
9
|
-
var MenubarGroup =
|
|
10
|
-
var MenubarPortal =
|
|
11
|
-
var MenubarSub =
|
|
12
|
-
var MenubarRadioGroup =
|
|
8
|
+
var MenubarMenu = Menubar$1.Menu;
|
|
9
|
+
var MenubarGroup = Menubar$1.Group;
|
|
10
|
+
var MenubarPortal = Menubar$1.Portal;
|
|
11
|
+
var MenubarSub = Menubar$1.Sub;
|
|
12
|
+
var MenubarRadioGroup = Menubar$1.RadioGroup;
|
|
13
13
|
var Menubar = React.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx(
|
|
14
|
-
|
|
14
|
+
Menubar$1.Root,
|
|
15
15
|
{
|
|
16
16
|
ref,
|
|
17
17
|
className: cn(
|
|
@@ -21,9 +21,9 @@ var Menubar = React.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */
|
|
|
21
21
|
...props
|
|
22
22
|
}
|
|
23
23
|
));
|
|
24
|
-
Menubar.displayName =
|
|
24
|
+
Menubar.displayName = Menubar$1.Root.displayName;
|
|
25
25
|
var MenubarTrigger = React.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx(
|
|
26
|
-
|
|
26
|
+
Menubar$1.Trigger,
|
|
27
27
|
{
|
|
28
28
|
ref,
|
|
29
29
|
className: cn(
|
|
@@ -33,9 +33,9 @@ var MenubarTrigger = React.forwardRef(({ className, ...props }, ref) => /* @__PU
|
|
|
33
33
|
...props
|
|
34
34
|
}
|
|
35
35
|
));
|
|
36
|
-
MenubarTrigger.displayName =
|
|
36
|
+
MenubarTrigger.displayName = Menubar$1.Trigger.displayName;
|
|
37
37
|
var MenubarSubTrigger = React.forwardRef(({ className, inset, children, ...props }, ref) => /* @__PURE__ */ jsxs(
|
|
38
|
-
|
|
38
|
+
Menubar$1.SubTrigger,
|
|
39
39
|
{
|
|
40
40
|
ref,
|
|
41
41
|
className: cn(
|
|
@@ -50,9 +50,9 @@ var MenubarSubTrigger = React.forwardRef(({ className, inset, children, ...props
|
|
|
50
50
|
]
|
|
51
51
|
}
|
|
52
52
|
));
|
|
53
|
-
MenubarSubTrigger.displayName =
|
|
53
|
+
MenubarSubTrigger.displayName = Menubar$1.SubTrigger.displayName;
|
|
54
54
|
var MenubarSubContent = React.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx(
|
|
55
|
-
|
|
55
|
+
Menubar$1.SubContent,
|
|
56
56
|
{
|
|
57
57
|
ref,
|
|
58
58
|
className: cn(
|
|
@@ -62,10 +62,10 @@ var MenubarSubContent = React.forwardRef(({ className, ...props }, ref) => /* @_
|
|
|
62
62
|
...props
|
|
63
63
|
}
|
|
64
64
|
));
|
|
65
|
-
MenubarSubContent.displayName =
|
|
65
|
+
MenubarSubContent.displayName = Menubar$1.SubContent.displayName;
|
|
66
66
|
var MenubarContent = React.forwardRef(
|
|
67
|
-
({ className, align = "start", alignOffset = -4, sideOffset = 8, ...props }, ref) => /* @__PURE__ */ jsx(
|
|
68
|
-
|
|
67
|
+
({ className, align = "start", alignOffset = -4, sideOffset = 8, ...props }, ref) => /* @__PURE__ */ jsx(Menubar$1.Portal, { children: /* @__PURE__ */ jsx(
|
|
68
|
+
Menubar$1.Content,
|
|
69
69
|
{
|
|
70
70
|
ref,
|
|
71
71
|
align,
|
|
@@ -79,9 +79,9 @@ var MenubarContent = React.forwardRef(
|
|
|
79
79
|
}
|
|
80
80
|
) })
|
|
81
81
|
);
|
|
82
|
-
MenubarContent.displayName =
|
|
82
|
+
MenubarContent.displayName = Menubar$1.Content.displayName;
|
|
83
83
|
var MenubarItem = React.forwardRef(({ className, inset, ...props }, ref) => /* @__PURE__ */ jsx(
|
|
84
|
-
|
|
84
|
+
Menubar$1.Item,
|
|
85
85
|
{
|
|
86
86
|
ref,
|
|
87
87
|
className: cn(
|
|
@@ -92,9 +92,9 @@ var MenubarItem = React.forwardRef(({ className, inset, ...props }, ref) => /* @
|
|
|
92
92
|
...props
|
|
93
93
|
}
|
|
94
94
|
));
|
|
95
|
-
MenubarItem.displayName =
|
|
95
|
+
MenubarItem.displayName = Menubar$1.Item.displayName;
|
|
96
96
|
var MenubarCheckboxItem = React.forwardRef(({ className, children, checked, ...props }, ref) => /* @__PURE__ */ jsxs(
|
|
97
|
-
|
|
97
|
+
Menubar$1.CheckboxItem,
|
|
98
98
|
{
|
|
99
99
|
ref,
|
|
100
100
|
className: cn(
|
|
@@ -104,14 +104,14 @@ var MenubarCheckboxItem = React.forwardRef(({ className, children, checked, ...p
|
|
|
104
104
|
checked,
|
|
105
105
|
...props,
|
|
106
106
|
children: [
|
|
107
|
-
/* @__PURE__ */ jsx("span", { className: "absolute left-2 flex h-3.5 w-3.5 items-center justify-center", children: /* @__PURE__ */ jsx(
|
|
107
|
+
/* @__PURE__ */ jsx("span", { className: "absolute left-2 flex h-3.5 w-3.5 items-center justify-center", children: /* @__PURE__ */ jsx(Menubar$1.ItemIndicator, { children: /* @__PURE__ */ jsx(Check, { className: "h-4 w-4" }) }) }),
|
|
108
108
|
children
|
|
109
109
|
]
|
|
110
110
|
}
|
|
111
111
|
));
|
|
112
|
-
MenubarCheckboxItem.displayName =
|
|
112
|
+
MenubarCheckboxItem.displayName = Menubar$1.CheckboxItem.displayName;
|
|
113
113
|
var MenubarRadioItem = React.forwardRef(({ className, children, ...props }, ref) => /* @__PURE__ */ jsxs(
|
|
114
|
-
|
|
114
|
+
Menubar$1.RadioItem,
|
|
115
115
|
{
|
|
116
116
|
ref,
|
|
117
117
|
className: cn(
|
|
@@ -120,14 +120,14 @@ var MenubarRadioItem = React.forwardRef(({ className, children, ...props }, ref)
|
|
|
120
120
|
),
|
|
121
121
|
...props,
|
|
122
122
|
children: [
|
|
123
|
-
/* @__PURE__ */ jsx("span", { className: "absolute left-2 flex h-3.5 w-3.5 items-center justify-center", children: /* @__PURE__ */ jsx(
|
|
123
|
+
/* @__PURE__ */ jsx("span", { className: "absolute left-2 flex h-3.5 w-3.5 items-center justify-center", children: /* @__PURE__ */ jsx(Menubar$1.ItemIndicator, { children: /* @__PURE__ */ jsx(Circle, { className: "h-2 w-2 fill-current" }) }) }),
|
|
124
124
|
children
|
|
125
125
|
]
|
|
126
126
|
}
|
|
127
127
|
));
|
|
128
|
-
MenubarRadioItem.displayName =
|
|
128
|
+
MenubarRadioItem.displayName = Menubar$1.RadioItem.displayName;
|
|
129
129
|
var MenubarLabel = React.forwardRef(({ className, inset, ...props }, ref) => /* @__PURE__ */ jsx(
|
|
130
|
-
|
|
130
|
+
Menubar$1.Label,
|
|
131
131
|
{
|
|
132
132
|
ref,
|
|
133
133
|
className: cn(
|
|
@@ -138,16 +138,16 @@ var MenubarLabel = React.forwardRef(({ className, inset, ...props }, ref) => /*
|
|
|
138
138
|
...props
|
|
139
139
|
}
|
|
140
140
|
));
|
|
141
|
-
MenubarLabel.displayName =
|
|
141
|
+
MenubarLabel.displayName = Menubar$1.Label.displayName;
|
|
142
142
|
var MenubarSeparator = React.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx(
|
|
143
|
-
|
|
143
|
+
Menubar$1.Separator,
|
|
144
144
|
{
|
|
145
145
|
ref,
|
|
146
146
|
className: cn("-mx-1 my-1 h-px bg-muted", className),
|
|
147
147
|
...props
|
|
148
148
|
}
|
|
149
149
|
));
|
|
150
|
-
MenubarSeparator.displayName =
|
|
150
|
+
MenubarSeparator.displayName = Menubar$1.Separator.displayName;
|
|
151
151
|
var MenubarShortcut = ({
|
|
152
152
|
className,
|
|
153
153
|
...props
|
|
@@ -166,5 +166,5 @@ var MenubarShortcut = ({
|
|
|
166
166
|
MenubarShortcut.displayName = "MenubarShortcut";
|
|
167
167
|
|
|
168
168
|
export { Menubar, MenubarCheckboxItem, MenubarContent, MenubarGroup, MenubarItem, MenubarLabel, MenubarMenu, MenubarPortal, MenubarRadioGroup, MenubarRadioItem, MenubarSeparator, MenubarShortcut, MenubarSub, MenubarSubContent, MenubarSubTrigger, MenubarTrigger };
|
|
169
|
-
//# sourceMappingURL=chunk-
|
|
170
|
-
//# sourceMappingURL=chunk-
|
|
169
|
+
//# sourceMappingURL=chunk-AL5TMEZQ.js.map
|
|
170
|
+
//# sourceMappingURL=chunk-AL5TMEZQ.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/ui/menubar.tsx"],"names":["MenubarPrimitive"],"mappings":"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","file":"chunk-AL5TMEZQ.js","sourcesContent":["\"use client\";\n\nimport * as React from \"react\";\nimport { Menubar as MenubarPrimitive } from \"radix-ui\";\nimport { Check, ChevronRight, Circle } from \"lucide-react\";\n\nimport { cn } from \"../../utils\";\n\nconst MenubarMenu: typeof MenubarPrimitive.Menu = MenubarPrimitive.Menu;\nconst MenubarGroup = MenubarPrimitive.Group;\nconst MenubarPortal = MenubarPrimitive.Portal;\nconst MenubarSub = MenubarPrimitive.Sub;\nconst MenubarRadioGroup = MenubarPrimitive.RadioGroup;\n\nconst Menubar = React.forwardRef<\n React.ElementRef<typeof MenubarPrimitive.Root>,\n React.ComponentPropsWithoutRef<typeof MenubarPrimitive.Root>\n>(({ className, ...props }, ref) => (\n <MenubarPrimitive.Root\n ref={ref}\n className={cn(\n \"flex h-10 items-center space-x-1 rounded-md border bg-background p-1\",\n className\n )}\n {...props}\n />\n));\nMenubar.displayName = MenubarPrimitive.Root.displayName;\n\nconst MenubarTrigger = React.forwardRef<\n React.ElementRef<typeof MenubarPrimitive.Trigger>,\n React.ComponentPropsWithoutRef<typeof MenubarPrimitive.Trigger>\n>(({ className, ...props }, ref) => (\n <MenubarPrimitive.Trigger\n ref={ref}\n className={cn(\n \"flex cursor-default select-none items-center rounded-sm px-3 py-1.5 text-sm font-medium outline-none focus:bg-accent focus:text-accent-foreground data-[state=open]:bg-accent data-[state=open]:text-accent-foreground\",\n className\n )}\n {...props}\n />\n));\nMenubarTrigger.displayName = MenubarPrimitive.Trigger.displayName;\n\nconst MenubarSubTrigger = React.forwardRef<\n React.ElementRef<typeof MenubarPrimitive.SubTrigger>,\n React.ComponentPropsWithoutRef<typeof MenubarPrimitive.SubTrigger> & {\n inset?: boolean;\n }\n>(({ className, inset, children, ...props }, ref) => (\n <MenubarPrimitive.SubTrigger\n ref={ref}\n className={cn(\n \"flex cursor-default select-none items-center rounded-sm px-2 py-1.5 text-sm outline-none data-[state=open]:bg-accent focus:bg-accent\",\n inset && \"pl-8\",\n className\n )}\n {...props}\n >\n {children}\n <ChevronRight className=\"ml-auto h-4 w-4\" />\n </MenubarPrimitive.SubTrigger>\n));\nMenubarSubTrigger.displayName = MenubarPrimitive.SubTrigger.displayName;\n\nconst MenubarSubContent = React.forwardRef<\n React.ElementRef<typeof MenubarPrimitive.SubContent>,\n React.ComponentPropsWithoutRef<typeof MenubarPrimitive.SubContent>\n>(({ className, ...props }, ref) => (\n <MenubarPrimitive.SubContent\n ref={ref}\n className={cn(\n \"z-50 min-w-[8rem] overflow-hidden rounded-md border bg-popover p-1 text-popover-foreground shadow-lg data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2\",\n className\n )}\n {...props}\n />\n));\nMenubarSubContent.displayName = MenubarPrimitive.SubContent.displayName;\n\nconst MenubarContent = React.forwardRef<\n React.ElementRef<typeof MenubarPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof MenubarPrimitive.Content>\n>(\n (\n { className, align = \"start\", alignOffset = -4, sideOffset = 8, ...props },\n ref\n ) => (\n <MenubarPrimitive.Portal>\n <MenubarPrimitive.Content\n ref={ref}\n align={align}\n alignOffset={alignOffset}\n sideOffset={sideOffset}\n className={cn(\n \"z-50 min-w-[12rem] overflow-hidden rounded-md border bg-popover p-1 text-popover-foreground shadow-md data-[state=open]:animate-in data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2\",\n className\n )}\n {...props}\n />\n </MenubarPrimitive.Portal>\n )\n);\nMenubarContent.displayName = MenubarPrimitive.Content.displayName;\n\nconst MenubarItem = React.forwardRef<\n React.ElementRef<typeof MenubarPrimitive.Item>,\n React.ComponentPropsWithoutRef<typeof MenubarPrimitive.Item> & {\n inset?: boolean;\n }\n>(({ className, inset, ...props }, ref) => (\n <MenubarPrimitive.Item\n ref={ref}\n className={cn(\n \"relative flex cursor-default select-none items-center rounded-sm px-2 py-1.5 text-sm outline-none transition-colors data-[disabled]:pointer-events-none data-[disabled]:opacity-50 focus:bg-accent focus:text-accent-foreground\",\n inset && \"pl-8\",\n className\n )}\n {...props}\n />\n));\nMenubarItem.displayName = MenubarPrimitive.Item.displayName;\n\nconst MenubarCheckboxItem = React.forwardRef<\n React.ElementRef<typeof MenubarPrimitive.CheckboxItem>,\n React.ComponentPropsWithoutRef<typeof MenubarPrimitive.CheckboxItem>\n>(({ className, children, checked, ...props }, ref) => (\n <MenubarPrimitive.CheckboxItem\n ref={ref}\n className={cn(\n \"relative flex cursor-default select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-none transition-colors data-[disabled]:pointer-events-none data-[disabled]:opacity-50 focus:bg-accent focus:text-accent-foreground\",\n className\n )}\n checked={checked}\n {...props}\n >\n <span className=\"absolute left-2 flex h-3.5 w-3.5 items-center justify-center\">\n <MenubarPrimitive.ItemIndicator>\n <Check className=\"h-4 w-4\" />\n </MenubarPrimitive.ItemIndicator>\n </span>\n {children}\n </MenubarPrimitive.CheckboxItem>\n));\nMenubarCheckboxItem.displayName = MenubarPrimitive.CheckboxItem.displayName;\n\nconst MenubarRadioItem = React.forwardRef<\n React.ElementRef<typeof MenubarPrimitive.RadioItem>,\n React.ComponentPropsWithoutRef<typeof MenubarPrimitive.RadioItem>\n>(({ className, children, ...props }, ref) => (\n <MenubarPrimitive.RadioItem\n ref={ref}\n className={cn(\n \"relative flex cursor-default select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-none transition-colors data-[disabled]:pointer-events-none data-[disabled]:opacity-50 focus:bg-accent focus:text-accent-foreground\",\n className\n )}\n {...props}\n >\n <span className=\"absolute left-2 flex h-3.5 w-3.5 items-center justify-center\">\n <MenubarPrimitive.ItemIndicator>\n <Circle className=\"h-2 w-2 fill-current\" />\n </MenubarPrimitive.ItemIndicator>\n </span>\n {children}\n </MenubarPrimitive.RadioItem>\n));\nMenubarRadioItem.displayName = MenubarPrimitive.RadioItem.displayName;\n\nconst MenubarLabel = React.forwardRef<\n React.ElementRef<typeof MenubarPrimitive.Label>,\n React.ComponentPropsWithoutRef<typeof MenubarPrimitive.Label> & {\n inset?: boolean;\n }\n>(({ className, inset, ...props }, ref) => (\n <MenubarPrimitive.Label\n ref={ref}\n className={cn(\n \"px-2 py-1.5 text-sm font-semibold\",\n inset && \"pl-8\",\n className\n )}\n {...props}\n />\n));\nMenubarLabel.displayName = MenubarPrimitive.Label.displayName;\n\nconst MenubarSeparator = React.forwardRef<\n React.ElementRef<typeof MenubarPrimitive.Separator>,\n React.ComponentPropsWithoutRef<typeof MenubarPrimitive.Separator>\n>(({ className, ...props }, ref) => (\n <MenubarPrimitive.Separator\n ref={ref}\n className={cn(\"-mx-1 my-1 h-px bg-muted\", className)}\n {...props}\n />\n));\nMenubarSeparator.displayName = MenubarPrimitive.Separator.displayName;\n\nconst MenubarShortcut = ({\n className,\n ...props\n}: React.HTMLAttributes<HTMLSpanElement>) => {\n return (\n <span\n className={cn(\n \"ml-auto text-xs tracking-widest text-muted-foreground\",\n className\n )}\n {...props}\n />\n );\n};\nMenubarShortcut.displayName = \"MenubarShortcut\";\n\nexport {\n Menubar,\n MenubarMenu,\n MenubarTrigger,\n MenubarContent,\n MenubarItem,\n MenubarSeparator,\n MenubarLabel,\n MenubarCheckboxItem,\n MenubarRadioItem,\n MenubarGroup,\n MenubarPortal,\n MenubarSub,\n MenubarSubContent,\n MenubarSubTrigger,\n MenubarRadioGroup,\n MenubarShortcut,\n};\n"]}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
"use client";
|
|
2
|
-
import { Button } from './chunk-
|
|
2
|
+
import { Button } from './chunk-NWSCYLPT.js';
|
|
3
3
|
import { cn } from './chunk-NZ5WBA4R.js';
|
|
4
4
|
import * as React from 'react';
|
|
5
5
|
import useEmblaCarousel from 'embla-carousel-react';
|
|
@@ -195,5 +195,5 @@ function CarouselNext({
|
|
|
195
195
|
}
|
|
196
196
|
|
|
197
197
|
export { Carousel, CarouselContent, CarouselItem, CarouselNext, CarouselPrevious };
|
|
198
|
-
//# sourceMappingURL=chunk-
|
|
199
|
-
//# sourceMappingURL=chunk-
|
|
198
|
+
//# sourceMappingURL=chunk-AOZGQM6W.js.map
|
|
199
|
+
//# sourceMappingURL=chunk-AOZGQM6W.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/ui/carousel.tsx"],"names":["api"],"mappings":";;;;;;;AAgCA,IAAM,eAAA,GAAwB,oBAA2C,IAAI,CAAA;AAE7E,SAAS,WAAA,GAAc;AACrB,EAAA,MAAM,OAAA,GAAgB,iBAAW,eAAe,CAAA;AAEhD,EAAA,IAAI,CAAC,OAAA,EAAS;AACZ,IAAA,MAAM,IAAI,MAAM,gDAAgD,CAAA;AAAA,EAClE;AAEA,EAAA,OAAO,OAAA;AACT;AAEA,IAAM,QAAA,GAAiB,KAAA,CAAA,UAAA;AAAA,EAIrB,CACE;AAAA,IACE,WAAA,GAAc,YAAA;AAAA,IACd,IAAA;AAAA,IACA,MAAA;AAAA,IACA,OAAA;AAAA,IACA,SAAA;AAAA,IACA,QAAA;AAAA,IACA,GAAG;AAAA,KAEL,GAAA,KACG;AACH,IAAA,MAAM,CAAC,WAAA,EAAa,GAAG,CAAA,GAAI,gBAAA;AAAA,MACzB;AAAA,QACE,GAAG,IAAA;AAAA,QACH,IAAA,EAAM,WAAA,KAAgB,YAAA,GAAe,GAAA,GAAM;AAAA,OAC7C;AAAA,MACA;AAAA,KACF;AACA,IAAA,MAAM,CAAC,aAAA,EAAe,gBAAgB,CAAA,GAAU,eAAS,KAAK,CAAA;AAC9D,IAAA,MAAM,CAAC,aAAA,EAAe,gBAAgB,CAAA,GAAU,eAAS,KAAK,CAAA;AAE9D,IAAA,MAAM,QAAA,GAAiB,KAAA,CAAA,WAAA,CAAY,CAACA,IAAAA,KAAqB;AACvD,MAAA,IAAI,CAACA,IAAAA,EAAK;AACR,QAAA;AAAA,MACF;AAEA,MAAA,gBAAA,CAAiBA,IAAAA,CAAI,eAAe,CAAA;AACpC,MAAA,gBAAA,CAAiBA,IAAAA,CAAI,eAAe,CAAA;AAAA,IACtC,CAAA,EAAG,EAAE,CAAA;AAEL,IAAA,MAAM,UAAA,GAAmB,kBAAY,MAAM;AACzC,MAAA,GAAA,EAAK,UAAA,EAAW;AAAA,IAClB,CAAA,EAAG,CAAC,GAAG,CAAC,CAAA;AAER,IAAA,MAAM,UAAA,GAAmB,kBAAY,MAAM;AACzC,MAAA,GAAA,EAAK,UAAA,EAAW;AAAA,IAClB,CAAA,EAAG,CAAC,GAAG,CAAC,CAAA;AAER,IAAA,MAAM,aAAA,GAAsB,KAAA,CAAA,WAAA;AAAA,MAC1B,CAAC,KAAA,KAA+C;AAC9C,QAAA,IAAI,KAAA,CAAM,QAAQ,WAAA,EAAa;AAC7B,UAAA,KAAA,CAAM,cAAA,EAAe;AACrB,UAAA,UAAA,EAAW;AAAA,QACb,CAAA,MAAA,IAAW,KAAA,CAAM,GAAA,KAAQ,YAAA,EAAc;AACrC,UAAA,KAAA,CAAM,cAAA,EAAe;AACrB,UAAA,UAAA,EAAW;AAAA,QACb;AAAA,MACF,CAAA;AAAA,MACA,CAAC,YAAY,UAAU;AAAA,KACzB;AAEA,IAAM,gBAAU,MAAM;AACpB,MAAA,IAAI,CAAC,GAAA,IAAO,CAAC,MAAA,EAAQ;AACnB,QAAA;AAAA,MACF;AAEA,MAAA,MAAA,CAAO,GAAG,CAAA;AAAA,IACZ,CAAA,EAAG,CAAC,GAAA,EAAK,MAAM,CAAC,CAAA;AAEhB,IAAM,gBAAU,MAAM;AACpB,MAAA,IAAI,CAAC,GAAA,EAAK;AACR,QAAA;AAAA,MACF;AAEA,MAAA,QAAA,CAAS,GAAG,CAAA;AACZ,MAAA,GAAA,CAAI,EAAA,CAAG,UAAU,QAAQ,CAAA;AACzB,MAAA,GAAA,CAAI,EAAA,CAAG,UAAU,QAAQ,CAAA;AAEzB,MAAA,OAAO,MAAM;AACX,QAAA,GAAA,EAAK,GAAA,CAAI,UAAU,QAAQ,CAAA;AAAA,MAC7B,CAAA;AAAA,IACF,CAAA,EAAG,CAAC,GAAA,EAAK,QAAQ,CAAC,CAAA;AAElB,IAAA,uBACE,GAAA;AAAA,MAAC,eAAA,CAAgB,QAAA;AAAA,MAAhB;AAAA,QACC,KAAA,EAAO;AAAA,UACL,WAAA;AAAA,UACA,GAAA;AAAA,UACA,IAAA;AAAA,UACA,WAAA,EACE,WAAA,KAAgB,IAAA,EAAM,IAAA,KAAS,MAAM,UAAA,GAAa,YAAA,CAAA;AAAA,UACpD,UAAA;AAAA,UACA,UAAA;AAAA,UACA,aAAA;AAAA,UACA;AAAA,SACF;AAAA,QAEA,QAAA,kBAAA,GAAA;AAAA,UAAC,KAAA;AAAA,UAAA;AAAA,YACC,GAAA;AAAA,YACA,gBAAA,EAAkB,aAAA;AAAA,YAClB,SAAA,EAAW,EAAA,CAAG,UAAA,EAAY,SAAS,CAAA;AAAA,YACnC,IAAA,EAAK,QAAA;AAAA,YACL,sBAAA,EAAqB,UAAA;AAAA,YACpB,GAAG,KAAA;AAAA,YAEH;AAAA;AAAA;AACH;AAAA,KACF;AAAA,EAEJ;AACF;AACA,QAAA,CAAS,WAAA,GAAc,UAAA;AAEvB,IAAM,eAAA,GAAwB,iBAG5B,CAAC,EAAE,WAAW,GAAG,KAAA,IAAS,GAAA,KAAQ;AAClC,EAAA,MAAM,EAAE,WAAA,EAAa,WAAA,EAAY,GAAI,WAAA,EAAY;AAEjD,EAAA,uBACE,GAAA,CAAC,KAAA,EAAA,EAAI,GAAA,EAAK,WAAA,EAAa,WAAU,iBAAA,EAC/B,QAAA,kBAAA,GAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,GAAA;AAAA,MACA,SAAA,EAAW,EAAA;AAAA,QACT,MAAA;AAAA,QACA,WAAA,KAAgB,eAAe,OAAA,GAAU,gBAAA;AAAA,QACzC;AAAA,OACF;AAAA,MACC,GAAG;AAAA;AAAA,GACN,EACF,CAAA;AAEJ,CAAC;AACD,eAAA,CAAgB,WAAA,GAAc,iBAAA;AAE9B,IAAM,YAAA,GAAqB,iBAGzB,CAAC,EAAE,WAAW,GAAG,KAAA,IAAS,GAAA,KAAQ;AAClC,EAAA,MAAM,EAAE,WAAA,EAAY,GAAI,WAAA,EAAY;AAEpC,EAAA,uBACE,GAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,GAAA;AAAA,MACA,IAAA,EAAK,OAAA;AAAA,MACL,sBAAA,EAAqB,OAAA;AAAA,MACrB,SAAA,EAAW,EAAA;AAAA,QACT,oCAAA;AAAA,QACA,WAAA,KAAgB,eAAe,MAAA,GAAS,MAAA;AAAA,QACxC;AAAA,OACF;AAAA,MACC,GAAG;AAAA;AAAA,GACN;AAEJ,CAAC;AACD,YAAA,CAAa,WAAA,GAAc,cAAA;AAiB3B,SAAS,gBAAA,CAAiB;AAAA,EACxB,SAAA;AAAA,EACA,OAAA,GAAU,SAAA;AAAA,EACV,IAAA,GAAO,MAAA;AAAA,EACP,GAAG;AACL,CAAA,EAAyB;AACvB,EAAA,MAAM,EAAE,WAAA,EAAa,UAAA,EAAY,aAAA,KAAkB,WAAA,EAAY;AAE/D,EAAA,uBACE,IAAA;AAAA,IAAC,MAAA;AAAA,IAAA;AAAA,MACC,OAAA;AAAA,MACA,IAAA;AAAA,MACA,SAAA,EAAW,EAAA;AAAA,QACT,+BAAA;AAAA,QACA,WAAA,KAAgB,eACZ,mCAAA,GACA,6CAAA;AAAA,QACJ;AAAA,OACF;AAAA,MACA,UAAU,CAAC,aAAA;AAAA,MACX,OAAA,EAAS,UAAA;AAAA,MACR,GAAG,KAAA;AAAA,MAEJ,QAAA,EAAA;AAAA,wBAAA,GAAA,CAAC,SAAA,EAAA,EAAU,WAAU,SAAA,EAAU,CAAA;AAAA,wBAC/B,GAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,SAAA,EAAU,QAAA,EAAA,gBAAA,EAAc;AAAA;AAAA;AAAA,GAC1C;AAEJ;AAEA,SAAS,YAAA,CAAa;AAAA,EACpB,SAAA;AAAA,EACA,OAAA,GAAU,SAAA;AAAA,EACV,IAAA,GAAO,MAAA;AAAA,EACP,GAAG;AACL,CAAA,EAAyB;AACvB,EAAA,MAAM,EAAE,WAAA,EAAa,UAAA,EAAY,aAAA,KAAkB,WAAA,EAAY;AAE/D,EAAA,uBACE,IAAA;AAAA,IAAC,MAAA;AAAA,IAAA;AAAA,MACC,OAAA;AAAA,MACA,IAAA;AAAA,MACA,SAAA,EAAW,EAAA;AAAA,QACT,+BAAA;AAAA,QACA,WAAA,KAAgB,eACZ,oCAAA,GACA,gDAAA;AAAA,QACJ;AAAA,OACF;AAAA,MACA,UAAU,CAAC,aAAA;AAAA,MACX,OAAA,EAAS,UAAA;AAAA,MACR,GAAG,KAAA;AAAA,MAEJ,QAAA,EAAA;AAAA,wBAAA,GAAA,CAAC,UAAA,EAAA,EAAW,WAAU,SAAA,EAAU,CAAA;AAAA,wBAChC,GAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,SAAA,EAAU,QAAA,EAAA,YAAA,EAAU;AAAA;AAAA;AAAA,GACtC;AAEJ","file":"chunk-AOZGQM6W.js","sourcesContent":["\"use client\";\n\nimport * as React from \"react\";\nimport useEmblaCarousel, {\n type UseEmblaCarouselType,\n} from \"embla-carousel-react\";\nimport { ArrowLeft, ArrowRight } from \"lucide-react\";\n\nimport { cn } from \"../../utils\";\nimport { Button, type ButtonProps } from \"./button\";\n\ntype CarouselApi = UseEmblaCarouselType[1];\ntype UseCarouselParameters = Parameters<typeof useEmblaCarousel>;\ntype CarouselOptions = UseCarouselParameters[0];\ntype CarouselPlugin = UseCarouselParameters[1];\n\ntype CarouselProps = {\n opts?: CarouselOptions;\n plugins?: CarouselPlugin;\n orientation?: \"horizontal\" | \"vertical\";\n setApi?: (api: CarouselApi) => void;\n};\n\ntype CarouselContextProps = {\n carouselRef: ReturnType<typeof useEmblaCarousel>[0];\n api: ReturnType<typeof useEmblaCarousel>[1];\n scrollPrev: () => void;\n scrollNext: () => void;\n canScrollPrev: boolean;\n canScrollNext: boolean;\n} & CarouselProps;\n\nconst CarouselContext = React.createContext<CarouselContextProps | null>(null);\n\nfunction useCarousel() {\n const context = React.useContext(CarouselContext);\n\n if (!context) {\n throw new Error(\"useCarousel must be used within a <Carousel />\");\n }\n\n return context;\n}\n\nconst Carousel = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement> & CarouselProps\n>(\n (\n {\n orientation = \"horizontal\",\n opts,\n setApi,\n plugins,\n className,\n children,\n ...props\n },\n ref\n ) => {\n const [carouselRef, api] = useEmblaCarousel(\n {\n ...opts,\n axis: orientation === \"horizontal\" ? \"x\" : \"y\",\n },\n plugins\n );\n const [canScrollPrev, setCanScrollPrev] = React.useState(false);\n const [canScrollNext, setCanScrollNext] = React.useState(false);\n\n const onSelect = React.useCallback((api: CarouselApi) => {\n if (!api) {\n return;\n }\n\n setCanScrollPrev(api.canScrollPrev());\n setCanScrollNext(api.canScrollNext());\n }, []);\n\n const scrollPrev = React.useCallback(() => {\n api?.scrollPrev();\n }, [api]);\n\n const scrollNext = React.useCallback(() => {\n api?.scrollNext();\n }, [api]);\n\n const handleKeyDown = React.useCallback(\n (event: React.KeyboardEvent<HTMLDivElement>) => {\n if (event.key === \"ArrowLeft\") {\n event.preventDefault();\n scrollPrev();\n } else if (event.key === \"ArrowRight\") {\n event.preventDefault();\n scrollNext();\n }\n },\n [scrollPrev, scrollNext]\n );\n\n React.useEffect(() => {\n if (!api || !setApi) {\n return;\n }\n\n setApi(api);\n }, [api, setApi]);\n\n React.useEffect(() => {\n if (!api) {\n return;\n }\n\n onSelect(api);\n api.on(\"reInit\", onSelect);\n api.on(\"select\", onSelect);\n\n return () => {\n api?.off(\"select\", onSelect);\n };\n }, [api, onSelect]);\n\n return (\n <CarouselContext.Provider\n value={{\n carouselRef,\n api: api,\n opts,\n orientation:\n orientation || (opts?.axis === \"y\" ? \"vertical\" : \"horizontal\"),\n scrollPrev,\n scrollNext,\n canScrollPrev,\n canScrollNext,\n }}\n >\n <div\n ref={ref}\n onKeyDownCapture={handleKeyDown}\n className={cn(\"relative\", className)}\n role=\"region\"\n aria-roledescription=\"carousel\"\n {...props}\n >\n {children}\n </div>\n </CarouselContext.Provider>\n );\n }\n);\nCarousel.displayName = \"Carousel\";\n\nconst CarouselContent = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => {\n const { carouselRef, orientation } = useCarousel();\n\n return (\n <div ref={carouselRef} className=\"overflow-hidden\">\n <div\n ref={ref}\n className={cn(\n \"flex\",\n orientation === \"horizontal\" ? \"-ml-4\" : \"-mt-4 flex-col\",\n className\n )}\n {...props}\n />\n </div>\n );\n});\nCarouselContent.displayName = \"CarouselContent\";\n\nconst CarouselItem = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => {\n const { orientation } = useCarousel();\n\n return (\n <div\n ref={ref}\n role=\"group\"\n aria-roledescription=\"slide\"\n className={cn(\n \"min-w-0 shrink-0 grow-0 basis-full\",\n orientation === \"horizontal\" ? \"pl-4\" : \"pt-4\",\n className\n )}\n {...props}\n />\n );\n});\nCarouselItem.displayName = \"CarouselItem\";\n\n// `asChild` is omitted deliberately: these controls always render TWO\n// children (the arrow icon + an `sr-only` label), and Radix `Slot` requires\n// exactly one, so accepting `asChild` here would advertise a prop that\n// throws `React.Children.only expected to receive a single React element\n// child` at runtime. Omitting is preferred over restructuring the children\n// into a single slottable element — that would change the rendered DOM of a\n// shipped component to enable a composition nobody wants for a carousel arrow.\n//\n// Derived from `ButtonProps` by name rather than from\n// `React.ComponentProps<typeof Button>`: `Button` is overloaded, and\n// `ComponentProps` infers from the LAST call signature, so that spelling\n// would silently start resolving to `ButtonAsChildProps` if the two overloads\n// in `./button` were ever reordered — with no error at the point of change.\ntype CarouselControlProps = Omit<ButtonProps, \"asChild\">;\n\nfunction CarouselPrevious({\n className,\n variant = \"outline\",\n size = \"icon\",\n ...props\n}: CarouselControlProps) {\n const { orientation, scrollPrev, canScrollPrev } = useCarousel();\n\n return (\n <Button\n variant={variant}\n size={size}\n className={cn(\n \"absolute h-8 w-8 rounded-full\",\n orientation === \"horizontal\"\n ? \"-left-12 top-1/2 -translate-y-1/2\"\n : \"-top-12 left-1/2 -translate-x-1/2 rotate-90\",\n className\n )}\n disabled={!canScrollPrev}\n onClick={scrollPrev}\n {...props}\n >\n <ArrowLeft className=\"h-4 w-4\" />\n <span className=\"sr-only\">Previous slide</span>\n </Button>\n );\n}\n\nfunction CarouselNext({\n className,\n variant = \"outline\",\n size = \"icon\",\n ...props\n}: CarouselControlProps) {\n const { orientation, scrollNext, canScrollNext } = useCarousel();\n\n return (\n <Button\n variant={variant}\n size={size}\n className={cn(\n \"absolute h-8 w-8 rounded-full\",\n orientation === \"horizontal\"\n ? \"-right-12 top-1/2 -translate-y-1/2\"\n : \"-bottom-12 left-1/2 -translate-x-1/2 rotate-90\",\n className\n )}\n disabled={!canScrollNext}\n onClick={scrollNext}\n {...props}\n >\n <ArrowRight className=\"h-4 w-4\" />\n <span className=\"sr-only\">Next slide</span>\n </Button>\n );\n}\n\nexport {\n type CarouselApi,\n Carousel,\n CarouselContent,\n CarouselItem,\n CarouselPrevious,\n CarouselNext,\n};\n"]}
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
import { GAP_CLASSES } from './chunk-AVFZ4P4B.js';
|
|
2
|
+
import { cn } from './chunk-NZ5WBA4R.js';
|
|
3
|
+
import * as React from 'react';
|
|
4
|
+
import { cva } from 'class-variance-authority';
|
|
5
|
+
import { jsx, jsxs } from 'react/jsx-runtime';
|
|
6
|
+
|
|
7
|
+
var gridVariants = cva("grid", {
|
|
8
|
+
variants: {
|
|
9
|
+
// `cols` is the column count at the WIDEST breakpoint, and each value
|
|
10
|
+
// is a ramp down to a sane mobile layout — not a fixed track count.
|
|
11
|
+
// This is the string every application hand-writes on every card grid
|
|
12
|
+
// ("grid-cols-1 sm:grid-cols-2 lg:grid-cols-3"), and hand-writing it is
|
|
13
|
+
// how one page ends up ramping at `md` and the next at `lg`.
|
|
14
|
+
//
|
|
15
|
+
// Six is the one ramp that does not bottom out at a single column: a
|
|
16
|
+
// six-up is a row of small tiles (stats, filters, icons), and stacking
|
|
17
|
+
// those one-per-screen produces a page nobody scrolls to the end of.
|
|
18
|
+
cols: {
|
|
19
|
+
1: "grid-cols-1",
|
|
20
|
+
2: "grid-cols-1 sm:grid-cols-2",
|
|
21
|
+
3: "grid-cols-1 sm:grid-cols-2 lg:grid-cols-3",
|
|
22
|
+
4: "grid-cols-1 sm:grid-cols-2 lg:grid-cols-4",
|
|
23
|
+
5: "grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 xl:grid-cols-5",
|
|
24
|
+
6: "grid-cols-2 sm:grid-cols-3 lg:grid-cols-6"
|
|
25
|
+
},
|
|
26
|
+
gap: GAP_CLASSES,
|
|
27
|
+
align: {
|
|
28
|
+
start: "items-start",
|
|
29
|
+
center: "items-center",
|
|
30
|
+
end: "items-end",
|
|
31
|
+
stretch: "items-stretch"
|
|
32
|
+
}
|
|
33
|
+
},
|
|
34
|
+
// No `align` default — see the note in `stack.tsx`.
|
|
35
|
+
defaultVariants: {
|
|
36
|
+
cols: 3,
|
|
37
|
+
gap: "md"
|
|
38
|
+
}
|
|
39
|
+
});
|
|
40
|
+
var Grid = React.forwardRef(
|
|
41
|
+
({ className, cols, gap, align, testID, ...props }, ref) => /* @__PURE__ */ jsx(
|
|
42
|
+
"div",
|
|
43
|
+
{
|
|
44
|
+
ref,
|
|
45
|
+
"data-slot": "grid",
|
|
46
|
+
"data-testid": testID,
|
|
47
|
+
className: cn(gridVariants({ cols, gap, align }), className),
|
|
48
|
+
...props
|
|
49
|
+
}
|
|
50
|
+
)
|
|
51
|
+
);
|
|
52
|
+
Grid.displayName = "Grid";
|
|
53
|
+
var DashboardPage = React.forwardRef(
|
|
54
|
+
({
|
|
55
|
+
className,
|
|
56
|
+
title,
|
|
57
|
+
subtitle,
|
|
58
|
+
actions,
|
|
59
|
+
stats,
|
|
60
|
+
statColumns = 4,
|
|
61
|
+
testID,
|
|
62
|
+
children,
|
|
63
|
+
...props
|
|
64
|
+
}, ref) => /* @__PURE__ */ jsxs(
|
|
65
|
+
"div",
|
|
66
|
+
{
|
|
67
|
+
ref,
|
|
68
|
+
"data-slot": "dashboard-page",
|
|
69
|
+
"data-testid": testID,
|
|
70
|
+
className: cn("flex flex-col gap-6", className),
|
|
71
|
+
...props,
|
|
72
|
+
children: [
|
|
73
|
+
/* @__PURE__ */ jsxs(
|
|
74
|
+
"header",
|
|
75
|
+
{
|
|
76
|
+
"data-slot": "dashboard-page-header",
|
|
77
|
+
className: "flex flex-col gap-1 sm:flex-row sm:items-start sm:justify-between sm:gap-4",
|
|
78
|
+
children: [
|
|
79
|
+
/* @__PURE__ */ jsxs("div", { className: "flex min-w-0 flex-col gap-1", children: [
|
|
80
|
+
/* @__PURE__ */ jsx(
|
|
81
|
+
"h1",
|
|
82
|
+
{
|
|
83
|
+
"data-slot": "dashboard-page-title",
|
|
84
|
+
className: "truncate text-xl font-bold tracking-tight sm:text-2xl",
|
|
85
|
+
children: title
|
|
86
|
+
}
|
|
87
|
+
),
|
|
88
|
+
subtitle ? /* @__PURE__ */ jsx(
|
|
89
|
+
"p",
|
|
90
|
+
{
|
|
91
|
+
"data-slot": "dashboard-page-subtitle",
|
|
92
|
+
className: "text-sm text-muted-foreground",
|
|
93
|
+
children: subtitle
|
|
94
|
+
}
|
|
95
|
+
) : null
|
|
96
|
+
] }),
|
|
97
|
+
actions ? /* @__PURE__ */ jsx(
|
|
98
|
+
"div",
|
|
99
|
+
{
|
|
100
|
+
"data-slot": "dashboard-page-actions",
|
|
101
|
+
className: "flex shrink-0 items-center gap-2",
|
|
102
|
+
children: actions
|
|
103
|
+
}
|
|
104
|
+
) : null
|
|
105
|
+
]
|
|
106
|
+
}
|
|
107
|
+
),
|
|
108
|
+
stats ? (
|
|
109
|
+
// `align` is left unset on purpose: grid items already stretch, and
|
|
110
|
+
// `Grid` deliberately emits nothing for the defaults CSS supplies.
|
|
111
|
+
/* @__PURE__ */ jsx(Grid, { cols: statColumns, gap: "lg", children: stats })
|
|
112
|
+
) : null,
|
|
113
|
+
/* @__PURE__ */ jsx("div", { "data-slot": "dashboard-page-body", className: "flex min-w-0 flex-col gap-8", children })
|
|
114
|
+
]
|
|
115
|
+
}
|
|
116
|
+
)
|
|
117
|
+
);
|
|
118
|
+
DashboardPage.displayName = "DashboardPage";
|
|
119
|
+
|
|
120
|
+
export { DashboardPage, Grid, gridVariants };
|
|
121
|
+
//# sourceMappingURL=chunk-ARJI2JUV.js.map
|
|
122
|
+
//# sourceMappingURL=chunk-ARJI2JUV.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/layout/grid.tsx","../src/components/layout/dashboard-page.tsx"],"names":["React2","jsx"],"mappings":"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","file":"chunk-ARJI2JUV.js","sourcesContent":["import * as React from \"react\";\nimport { type VariantProps, cva } from \"class-variance-authority\";\nimport { cn } from \"../../utils\";\nimport { GAP_CLASSES } from \"./spacing\";\n\nconst gridVariants = cva(\"grid\", {\n variants: {\n // `cols` is the column count at the WIDEST breakpoint, and each value\n // is a ramp down to a sane mobile layout — not a fixed track count.\n // This is the string every application hand-writes on every card grid\n // (\"grid-cols-1 sm:grid-cols-2 lg:grid-cols-3\"), and hand-writing it is\n // how one page ends up ramping at `md` and the next at `lg`.\n //\n // Six is the one ramp that does not bottom out at a single column: a\n // six-up is a row of small tiles (stats, filters, icons), and stacking\n // those one-per-screen produces a page nobody scrolls to the end of.\n cols: {\n 1: \"grid-cols-1\",\n 2: \"grid-cols-1 sm:grid-cols-2\",\n 3: \"grid-cols-1 sm:grid-cols-2 lg:grid-cols-3\",\n 4: \"grid-cols-1 sm:grid-cols-2 lg:grid-cols-4\",\n 5: \"grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 xl:grid-cols-5\",\n 6: \"grid-cols-2 sm:grid-cols-3 lg:grid-cols-6\",\n },\n gap: GAP_CLASSES,\n align: {\n start: \"items-start\",\n center: \"items-center\",\n end: \"items-end\",\n stretch: \"items-stretch\",\n },\n },\n // No `align` default — see the note in `stack.tsx`.\n defaultVariants: {\n cols: 3,\n gap: \"md\",\n },\n});\n\nexport interface GridProps\n extends React.HTMLAttributes<HTMLDivElement>,\n VariantProps<typeof gridVariants> {\n /** Stable test/automation selector (emitted as `data-testid`). */\n testID?: string;\n}\n\n/**\n * Grid — two-dimensional flow for card and tile collections.\n *\n * `cols` is the count at the widest breakpoint; the class it emits is a\n * responsive ramp, so a card grid reflows on its own without the consumer\n * writing a single breakpoint.\n *\n * ```tsx\n * <Grid cols={3} gap=\"lg\">\n * {people.map((p) => <PersonCard key={p.id} person={p} />)}\n * </Grid>\n *\n * <Grid cols={4} gap=\"sm\" align=\"start\">\n * {stats.map((s) => <StatCard key={s.id} {...s} />)}\n * </Grid>\n * ```\n *\n * Deliberately NOT here: `grid-template-areas`, explicit row/column\n * placement, and per-child spans. A component that positions a *named*\n * child has stopped positioning things without knowing what they are, and\n * a grid whose children each carry placement props is a CSS file wearing a\n * React costume — reach for `className` at that point.\n *\n * @stability Beta\n */\nexport const Grid = React.forwardRef<HTMLDivElement, GridProps>(\n ({ className, cols, gap, align, testID, ...props }, ref) => (\n <div\n ref={ref}\n data-slot=\"grid\"\n data-testid={testID}\n className={cn(gridVariants({ cols, gap, align }), className)}\n {...props}\n />\n )\n);\nGrid.displayName = \"Grid\";\n\nexport { gridVariants };\n","import * as React from \"react\";\nimport { cn } from \"../../utils\";\nimport { Grid, type GridProps } from \"./grid\";\n\nexport interface DashboardPageProps\n // `HTMLAttributes` already declares `title?: string` (the native tooltip\n // attribute); omit it before redeclaring the page title as a ReactNode.\n extends Omit<React.HTMLAttributes<HTMLDivElement>, \"title\"> {\n /** Page title. Rendered as the page's single `<h1>`. */\n title: React.ReactNode;\n /** Supporting line under the title — a date range, a scope, a filter. */\n subtitle?: React.ReactNode;\n /** Trailing controls — a period picker, an export, a refresh. */\n actions?: React.ReactNode;\n /**\n * The stat row: `StatCard`s, or anything tile-shaped. Laid out in a `Grid`\n * that ramps down to one column on a phone. Omit it and no grid renders.\n */\n stats?: React.ReactNode;\n /**\n * Tiles across the stat row at the widest breakpoint. Default `4`.\n * Reuses `Grid`'s `cols` scale, so the responsive ramp is the same one\n * every other card grid in the app gets.\n */\n statColumns?: NonNullable<GridProps[\"cols\"]>;\n /** Stable test/automation selector (emitted as `data-testid`). */\n testID?: string;\n}\n\n/**\n * DashboardPage — a stat row over a flexible region of charts, tables and\n * sections.\n *\n * ```tsx\n * <DashboardPage\n * title=\"This quarter\"\n * subtitle=\"1 Apr – 30 Jun\"\n * actions={<DatePicker … />}\n * stats={\n * <>\n * <StatCard label=\"Active clients\" value={42} />\n * <StatCard label=\"Sessions\" value={318} trend={{ value: 12, label: \"vs Q1\" }} />\n * </>\n * }\n * >\n * <Section title=\"Revenue\"><ChartContainer …/></Section>\n * <Section title=\"At risk\"><DataTable …/></Section>\n * </DashboardPage>\n * ```\n *\n * The two regions are separated on purpose. Stats are a fixed-shape row that\n * must reflow as a unit; everything below is free-form and stacks. Folding\n * both into one `children` is how the stat row ends up hand-gridded per page,\n * with a different breakpoint each time — the exact drift `Grid` exists to\n * stop.\n *\n * Children stack at `gap-8`, wider than the page's own `gap-6`, so a chart\n * and the table under it don't read as one block.\n *\n * The header row is markup, not a component, and deliberately not\n * `PageHeader` — see `./detail-page` for the measured reasons composing it\n * was rejected across all four templates. Width is left to `Container` —\n * wrap, don't duplicate.\n *\n * This is a **layout**: it positions tiles and regions and never fetches a\n * metric. There is deliberately no data-bound twin — binding a dashboard\n * needs an aggregate/metric contract, and `genesis-core` ships none. Adding\n * a template ahead of its contract is what `docs/FRAMEWORK.md` warns against\n * in \"Why templates need the contract first\".\n *\n * @stability Beta\n */\nexport const DashboardPage = React.forwardRef<\n HTMLDivElement,\n DashboardPageProps\n>(\n (\n {\n className,\n title,\n subtitle,\n actions,\n stats,\n statColumns = 4,\n testID,\n children,\n ...props\n },\n ref\n ) => (\n <div\n ref={ref}\n data-slot=\"dashboard-page\"\n data-testid={testID}\n className={cn(\"flex flex-col gap-6\", className)}\n {...props}\n >\n <header\n data-slot=\"dashboard-page-header\"\n className=\"flex flex-col gap-1 sm:flex-row sm:items-start sm:justify-between sm:gap-4\"\n >\n <div className=\"flex min-w-0 flex-col gap-1\">\n <h1\n data-slot=\"dashboard-page-title\"\n className=\"truncate text-xl font-bold tracking-tight sm:text-2xl\"\n >\n {title}\n </h1>\n {subtitle ? (\n <p\n data-slot=\"dashboard-page-subtitle\"\n className=\"text-sm text-muted-foreground\"\n >\n {subtitle}\n </p>\n ) : null}\n </div>\n {actions ? (\n <div\n data-slot=\"dashboard-page-actions\"\n className=\"flex shrink-0 items-center gap-2\"\n >\n {actions}\n </div>\n ) : null}\n </header>\n\n {stats ? (\n // `align` is left unset on purpose: grid items already stretch, and\n // `Grid` deliberately emits nothing for the defaults CSS supplies.\n <Grid cols={statColumns} gap=\"lg\">\n {stats}\n </Grid>\n ) : null}\n\n <div data-slot=\"dashboard-page-body\" className=\"flex min-w-0 flex-col gap-8\">\n {children}\n </div>\n </div>\n )\n);\nDashboardPage.displayName = \"DashboardPage\";\n"]}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
// src/components/layout/spacing.ts
|
|
2
|
+
var spaceScale = {
|
|
3
|
+
none: 0,
|
|
4
|
+
xs: 4,
|
|
5
|
+
sm: 8,
|
|
6
|
+
md: 12,
|
|
7
|
+
lg: 16,
|
|
8
|
+
xl: 24,
|
|
9
|
+
"2xl": 32,
|
|
10
|
+
"3xl": 48
|
|
11
|
+
};
|
|
12
|
+
var GAP_CLASSES = {
|
|
13
|
+
none: "gap-0",
|
|
14
|
+
xs: "gap-1",
|
|
15
|
+
sm: "gap-2",
|
|
16
|
+
md: "gap-3",
|
|
17
|
+
lg: "gap-4",
|
|
18
|
+
xl: "gap-6",
|
|
19
|
+
"2xl": "gap-8",
|
|
20
|
+
"3xl": "gap-12"
|
|
21
|
+
};
|
|
22
|
+
|
|
23
|
+
export { GAP_CLASSES, spaceScale };
|
|
24
|
+
//# sourceMappingURL=chunk-AVFZ4P4B.js.map
|
|
25
|
+
//# sourceMappingURL=chunk-AVFZ4P4B.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/layout/spacing.ts"],"names":[],"mappings":";AAyBO,IAAM,UAAA,GAAa;AAAA,EACxB,IAAA,EAAM,CAAA;AAAA,EACN,EAAA,EAAI,CAAA;AAAA,EACJ,EAAA,EAAI,CAAA;AAAA,EACJ,EAAA,EAAI,EAAA;AAAA,EACJ,EAAA,EAAI,EAAA;AAAA,EACJ,EAAA,EAAI,EAAA;AAAA,EACJ,KAAA,EAAO,EAAA;AAAA,EACP,KAAA,EAAO;AACT;AAaO,IAAM,WAAA,GAAc;AAAA,EACzB,IAAA,EAAM,OAAA;AAAA,EACN,EAAA,EAAI,OAAA;AAAA,EACJ,EAAA,EAAI,OAAA;AAAA,EACJ,EAAA,EAAI,OAAA;AAAA,EACJ,EAAA,EAAI,OAAA;AAAA,EACJ,EAAA,EAAI,OAAA;AAAA,EACJ,KAAA,EAAO,OAAA;AAAA,EACP,KAAA,EAAO;AACT","file":"chunk-AVFZ4P4B.js","sourcesContent":["/**\n * Layout spacing scale — the single source of truth for the `gap` prop\n * shared by `Stack`, `Grid` and `Split`.\n *\n * These are the SAME semantic step names and the SAME pixel values as\n * `@marktiderman/genesis-ui-native`'s `spaceScale`\n * (`packages/ui-native/src/components/layout/spacing.ts`), which already\n * governs the native `Stack` / `Inline` / `Box` / `Grid`. That parity is the\n * point: `gap=\"lg\"` has to mean 16px on both surfaces, or a design spec\n * written once produces two different pages. A second, subtly-different\n * six-step scale on web would have been exactly the \"one concept, two\n * divergent implementations\" failure `docs/FRAMEWORK.md` is written to\n * prevent.\n *\n * Every emitted class is a STATIC literal in `GAP_CLASSES` rather than a\n * template built at runtime, for the same reason the native side spells its\n * table out: Tailwind compiles only the class names its content scanner\n * finds in source. A `gap-${scale[token] / 4}` form is invisible to the\n * scanner, so any step that doesn't independently appear as a literal\n * elsewhere silently renders with no gap at all.\n *\n * @stability Beta\n */\n\n/** Semantic spacing steps, in pixels, on the 4px design grid. */\nexport const spaceScale = {\n none: 0,\n xs: 4,\n sm: 8,\n md: 12,\n lg: 16,\n xl: 24,\n \"2xl\": 32,\n \"3xl\": 48,\n} as const;\n\n/**\n * The spacing vocabulary shared by every layout primitive — and, by\n * construction, by the native ones too.\n */\nexport type SpaceToken = keyof typeof spaceScale;\n\n/**\n * `SpaceToken` → Tailwind gap utility. `satisfies` keeps the table\n * exhaustive against the scale, so adding a step to `spaceScale` without a\n * class here is a type error rather than a silently missing gap.\n */\nexport const GAP_CLASSES = {\n none: \"gap-0\",\n xs: \"gap-1\",\n sm: \"gap-2\",\n md: \"gap-3\",\n lg: \"gap-4\",\n xl: \"gap-6\",\n \"2xl\": \"gap-8\",\n \"3xl\": \"gap-12\",\n} as const satisfies Record<SpaceToken, string>;\n"]}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { Collapsible as Collapsible$1 } from 'radix-ui';
|
|
3
|
+
|
|
4
|
+
// src/components/ui/collapsible.tsx
|
|
5
|
+
var Collapsible = Collapsible$1.Root;
|
|
6
|
+
var CollapsibleTrigger = Collapsible$1.CollapsibleTrigger;
|
|
7
|
+
var CollapsibleContent = Collapsible$1.CollapsibleContent;
|
|
8
|
+
|
|
9
|
+
export { Collapsible, CollapsibleContent, CollapsibleTrigger };
|
|
10
|
+
//# sourceMappingURL=chunk-B2GIBUQD.js.map
|
|
11
|
+
//# sourceMappingURL=chunk-B2GIBUQD.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/ui/collapsible.tsx"],"names":["CollapsiblePrimitive"],"mappings":";;;AAIA,IAAM,cAAcA,aAAA,CAAqB;AACzC,IAAM,qBAAqBA,aAAA,CAAqB;AAChD,IAAM,qBAAqBA,aAAA,CAAqB","file":"chunk-B2GIBUQD.js","sourcesContent":["\"use client\";\n\nimport { Collapsible as CollapsiblePrimitive } from \"radix-ui\";\n\nconst Collapsible = CollapsiblePrimitive.Root;\nconst CollapsibleTrigger = CollapsiblePrimitive.CollapsibleTrigger;\nconst CollapsibleContent = CollapsiblePrimitive.CollapsibleContent;\n\nexport { Collapsible, CollapsibleTrigger, CollapsibleContent };\n"]}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
import { cn } from './chunk-NZ5WBA4R.js';
|
|
3
3
|
import * as React from 'react';
|
|
4
|
-
import
|
|
4
|
+
import { Toggle as Toggle$1 } from 'radix-ui';
|
|
5
5
|
import { cva } from 'class-variance-authority';
|
|
6
6
|
import { jsx } from 'react/jsx-runtime';
|
|
7
7
|
|
|
@@ -26,15 +26,15 @@ var toggleVariants = cva(
|
|
|
26
26
|
}
|
|
27
27
|
);
|
|
28
28
|
var Toggle = React.forwardRef(({ className, variant, size, ...props }, ref) => /* @__PURE__ */ jsx(
|
|
29
|
-
|
|
29
|
+
Toggle$1.Root,
|
|
30
30
|
{
|
|
31
31
|
ref,
|
|
32
32
|
className: cn(toggleVariants({ variant, size, className })),
|
|
33
33
|
...props
|
|
34
34
|
}
|
|
35
35
|
));
|
|
36
|
-
Toggle.displayName =
|
|
36
|
+
Toggle.displayName = Toggle$1.Root.displayName;
|
|
37
37
|
|
|
38
38
|
export { Toggle, toggleVariants };
|
|
39
|
-
//# sourceMappingURL=chunk-
|
|
40
|
-
//# sourceMappingURL=chunk-
|
|
39
|
+
//# sourceMappingURL=chunk-C46ITXE4.js.map
|
|
40
|
+
//# sourceMappingURL=chunk-C46ITXE4.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/ui/toggle.tsx"],"names":["TogglePrimitive"],"mappings":";;;;;;AAOA,IAAM,cAAA,GAAiB,GAAA;AAAA,EACrB,obAAA;AAAA,EACA;AAAA,IACE,QAAA,EAAU;AAAA,MACR,OAAA,EAAS;AAAA,QACP,OAAA,EAAS,gBAAA;AAAA,QACT,OAAA,EACE;AAAA,OACJ;AAAA,MACA,IAAA,EAAM;AAAA,QACJ,OAAA,EAAS,oBAAA;AAAA,QACT,EAAA,EAAI,oBAAA;AAAA,QACJ,EAAA,EAAI;AAAA;AACN,KACF;AAAA,IACA,eAAA,EAAiB;AAAA,MACf,OAAA,EAAS,SAAA;AAAA,MACT,IAAA,EAAM;AAAA;AACR;AAEJ;AAEA,IAAM,MAAA,GAAe,KAAA,CAAA,UAAA,CAInB,CAAC,EAAE,SAAA,EAAW,SAAS,IAAA,EAAM,GAAG,KAAA,EAAM,EAAG,GAAA,qBACzC,GAAA;AAAA,EAACA,QAAA,CAAgB,IAAA;AAAA,EAAhB;AAAA,IACC,GAAA;AAAA,IACA,SAAA,EAAW,GAAG,cAAA,CAAe,EAAE,SAAS,IAAA,EAAM,SAAA,EAAW,CAAC,CAAA;AAAA,IACzD,GAAG;AAAA;AACN,CACD;AACD,MAAA,CAAO,WAAA,GAAcA,SAAgB,IAAA,CAAK,WAAA","file":"chunk-C46ITXE4.js","sourcesContent":["\"use client\";\n\nimport * as React from \"react\";\nimport { Toggle as TogglePrimitive } from \"radix-ui\";\nimport { type VariantProps, cva } from \"class-variance-authority\";\nimport { cn } from \"../../utils\";\n\nconst toggleVariants = cva(\n \"inline-flex items-center justify-center rounded-md text-sm font-medium ring-offset-background transition-colors hover:bg-muted hover:text-muted-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 data-[state=on]:bg-accent data-[state=on]:text-accent-foreground [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0 gap-2\",\n {\n variants: {\n variant: {\n default: \"bg-transparent\",\n outline:\n \"border border-input bg-transparent hover:bg-accent hover:text-accent-foreground\",\n },\n size: {\n default: \"h-10 px-3 min-w-10\",\n sm: \"h-9 px-2.5 min-w-9\",\n lg: \"h-11 px-5 min-w-11\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n size: \"default\",\n },\n }\n);\n\nconst Toggle = React.forwardRef<\n React.ComponentRef<typeof TogglePrimitive.Root>,\n React.ComponentPropsWithoutRef<typeof TogglePrimitive.Root> &\n VariantProps<typeof toggleVariants>\n>(({ className, variant, size, ...props }, ref) => (\n <TogglePrimitive.Root\n ref={ref}\n className={cn(toggleVariants({ variant, size, className }))}\n {...props}\n />\n));\nToggle.displayName = TogglePrimitive.Root.displayName;\n\nexport { Toggle, toggleVariants };\n"]}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
"use client";
|
|
2
|
-
import { CommandDialog, CommandInput, CommandList, CommandEmpty, CommandGroup, CommandItem, CommandShortcut } from './chunk-
|
|
2
|
+
import { CommandDialog, CommandInput, CommandList, CommandEmpty, CommandGroup, CommandItem, CommandShortcut } from './chunk-SEFK4NZV.js';
|
|
3
3
|
import * as React from 'react';
|
|
4
4
|
import { useState, useEffect } from 'react';
|
|
5
5
|
import { jsxs, jsx } from 'react/jsx-runtime';
|
|
@@ -61,5 +61,5 @@ function useCommandPaletteHotkey(enabled = true) {
|
|
|
61
61
|
}
|
|
62
62
|
|
|
63
63
|
export { CommandPalette, useCommandPaletteHotkey };
|
|
64
|
-
//# sourceMappingURL=chunk-
|
|
65
|
-
//# sourceMappingURL=chunk-
|
|
64
|
+
//# sourceMappingURL=chunk-CNTWQSUT.js.map
|
|
65
|
+
//# sourceMappingURL=chunk-CNTWQSUT.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/components/ui/command-palette.tsx"],"names":[],"mappings":";;;;;AAmCO,SAAS,cAAA,CAAe;AAAA,EAC7B,IAAA;AAAA,EACA,YAAA;AAAA,EACA,QAAA;AAAA,EACA,WAAA,GAAc,gCAAA;AAAA,EACd,YAAA,GAAe,mBAAA;AAAA,EACf,KAAA,GAAQ;AACV,CAAA,EAAwB;AACtB,EAAA,MAAM,MAAA,GAAe,cAAQ,MAAM;AACjC,IAAA,MAAM,GAAA,uBAAU,GAAA,EAAkC;AAClD,IAAA,KAAA,MAAW,OAAO,QAAA,EAAU;AAC1B,MAAA,MAAM,GAAA,GAAM,IAAI,KAAA,IAAS,SAAA;AACzB,MAAA,MAAM,IAAA,GAAO,GAAA,CAAI,GAAA,CAAI,GAAG,KAAK,EAAC;AAC9B,MAAA,IAAA,CAAK,KAAK,GAAG,CAAA;AACb,MAAA,GAAA,CAAI,GAAA,CAAI,KAAK,IAAI,CAAA;AAAA,IACnB;AACA,IAAA,OAAO,GAAA;AAAA,EACT,CAAA,EAAG,CAAC,QAAQ,CAAC,CAAA;AAEb,EAAA,uBACE,IAAA,CAAC,aAAA,EAAA,EAAc,IAAA,EAAY,YAAA,EACzB,QAAA,EAAA;AAAA,oBAAA,GAAA,CAAC,YAAA,EAAA,EAAa,WAAA,EAA0B,YAAA,EAAY,KAAA,EAAO,CAAA;AAAA,yBAC1D,WAAA,EAAA,EACC,QAAA,EAAA;AAAA,sBAAA,GAAA,CAAC,gBAAc,QAAA,EAAA,YAAA,EAAa,CAAA;AAAA,MAC3B,MAAM,IAAA,CAAK,MAAA,CAAO,SAAS,CAAA,CAAE,IAAI,CAAC,CAAC,OAAO,KAAK,CAAA,yBAC7C,YAAA,EAAA,EAAyB,OAAA,EAAS,OAChC,QAAA,EAAA,KAAA,CAAM,GAAA,CAAI,CAAC,GAAA,qBACV,IAAA;AAAA,QAAC,WAAA;AAAA,QAAA;AAAA,UAEC,OAAO,CAAA,EAAG,GAAA,CAAI,EAAE,CAAA,CAAA,EAAI,IAAI,KAAK,CAAA,CAAA;AAAA,UAC7B,UAAU,MAAM;AACd,YAAA,YAAA,CAAa,KAAK,CAAA;AAClB,YAAA,GAAA,CAAI,QAAA,EAAS;AAAA,UACf,CAAA;AAAA,UAEC,QAAA,EAAA;AAAA,YAAA,GAAA,CAAI,KAAA;AAAA,YACJ,IAAI,QAAA,mBACH,GAAA,CAAC,eAAA,EAAA,EAAiB,QAAA,EAAA,GAAA,CAAI,UAAS,CAAA,GAC7B;AAAA;AAAA,SAAA;AAAA,QAVC,GAAA,CAAI;AAAA,OAYZ,CAAA,EAAA,EAfgB,KAgBnB,CACD;AAAA,KAAA,EACH;AAAA,GAAA,EACF,CAAA;AAEJ;AAMO,SAAS,uBAAA,CACd,UAAU,IAAA,EACgD;AAC1D,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAI,SAAS,KAAK,CAAA;AAEtC,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,CAAC,OAAA,EAAS;AACd,IAAA,MAAM,SAAA,GAAY,CAAC,CAAA,KAAqB;AACtC,MAAA,IAAI,CAAA,CAAE,GAAA,CAAI,WAAA,EAAY,KAAM,GAAA,EAAK;AACjC,MAAA,IAAI,EAAE,CAAA,CAAE,OAAA,IAAW,CAAA,CAAE,OAAA,CAAA,EAAU;AAC/B,MAAA,CAAA,CAAE,cAAA,EAAe;AACjB,MAAA,OAAA,CAAQ,CAAC,IAAA,KAAS,CAAC,IAAI,CAAA;AAAA,IACzB,CAAA;AACA,IAAA,MAAA,CAAO,gBAAA,CAAiB,WAAW,SAAS,CAAA;AAC5C,IAAA,OAAO,MAAM,MAAA,CAAO,mBAAA,CAAoB,SAAA,EAAW,SAAS,CAAA;AAAA,EAC9D,CAAA,EAAG,CAAC,OAAO,CAAC,CAAA;AAEZ,EAAA,OAAO,CAAC,MAAM,OAAO,CAAA;AACvB","file":"chunk-
|
|
1
|
+
{"version":3,"sources":["../src/components/ui/command-palette.tsx"],"names":[],"mappings":";;;;;AAmCO,SAAS,cAAA,CAAe;AAAA,EAC7B,IAAA;AAAA,EACA,YAAA;AAAA,EACA,QAAA;AAAA,EACA,WAAA,GAAc,gCAAA;AAAA,EACd,YAAA,GAAe,mBAAA;AAAA,EACf,KAAA,GAAQ;AACV,CAAA,EAAwB;AACtB,EAAA,MAAM,MAAA,GAAe,cAAQ,MAAM;AACjC,IAAA,MAAM,GAAA,uBAAU,GAAA,EAAkC;AAClD,IAAA,KAAA,MAAW,OAAO,QAAA,EAAU;AAC1B,MAAA,MAAM,GAAA,GAAM,IAAI,KAAA,IAAS,SAAA;AACzB,MAAA,MAAM,IAAA,GAAO,GAAA,CAAI,GAAA,CAAI,GAAG,KAAK,EAAC;AAC9B,MAAA,IAAA,CAAK,KAAK,GAAG,CAAA;AACb,MAAA,GAAA,CAAI,GAAA,CAAI,KAAK,IAAI,CAAA;AAAA,IACnB;AACA,IAAA,OAAO,GAAA;AAAA,EACT,CAAA,EAAG,CAAC,QAAQ,CAAC,CAAA;AAEb,EAAA,uBACE,IAAA,CAAC,aAAA,EAAA,EAAc,IAAA,EAAY,YAAA,EACzB,QAAA,EAAA;AAAA,oBAAA,GAAA,CAAC,YAAA,EAAA,EAAa,WAAA,EAA0B,YAAA,EAAY,KAAA,EAAO,CAAA;AAAA,yBAC1D,WAAA,EAAA,EACC,QAAA,EAAA;AAAA,sBAAA,GAAA,CAAC,gBAAc,QAAA,EAAA,YAAA,EAAa,CAAA;AAAA,MAC3B,MAAM,IAAA,CAAK,MAAA,CAAO,SAAS,CAAA,CAAE,IAAI,CAAC,CAAC,OAAO,KAAK,CAAA,yBAC7C,YAAA,EAAA,EAAyB,OAAA,EAAS,OAChC,QAAA,EAAA,KAAA,CAAM,GAAA,CAAI,CAAC,GAAA,qBACV,IAAA;AAAA,QAAC,WAAA;AAAA,QAAA;AAAA,UAEC,OAAO,CAAA,EAAG,GAAA,CAAI,EAAE,CAAA,CAAA,EAAI,IAAI,KAAK,CAAA,CAAA;AAAA,UAC7B,UAAU,MAAM;AACd,YAAA,YAAA,CAAa,KAAK,CAAA;AAClB,YAAA,GAAA,CAAI,QAAA,EAAS;AAAA,UACf,CAAA;AAAA,UAEC,QAAA,EAAA;AAAA,YAAA,GAAA,CAAI,KAAA;AAAA,YACJ,IAAI,QAAA,mBACH,GAAA,CAAC,eAAA,EAAA,EAAiB,QAAA,EAAA,GAAA,CAAI,UAAS,CAAA,GAC7B;AAAA;AAAA,SAAA;AAAA,QAVC,GAAA,CAAI;AAAA,OAYZ,CAAA,EAAA,EAfgB,KAgBnB,CACD;AAAA,KAAA,EACH;AAAA,GAAA,EACF,CAAA;AAEJ;AAMO,SAAS,uBAAA,CACd,UAAU,IAAA,EACgD;AAC1D,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAI,SAAS,KAAK,CAAA;AAEtC,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,CAAC,OAAA,EAAS;AACd,IAAA,MAAM,SAAA,GAAY,CAAC,CAAA,KAAqB;AACtC,MAAA,IAAI,CAAA,CAAE,GAAA,CAAI,WAAA,EAAY,KAAM,GAAA,EAAK;AACjC,MAAA,IAAI,EAAE,CAAA,CAAE,OAAA,IAAW,CAAA,CAAE,OAAA,CAAA,EAAU;AAC/B,MAAA,CAAA,CAAE,cAAA,EAAe;AACjB,MAAA,OAAA,CAAQ,CAAC,IAAA,KAAS,CAAC,IAAI,CAAA;AAAA,IACzB,CAAA;AACA,IAAA,MAAA,CAAO,gBAAA,CAAiB,WAAW,SAAS,CAAA;AAC5C,IAAA,OAAO,MAAM,MAAA,CAAO,mBAAA,CAAoB,SAAA,EAAW,SAAS,CAAA;AAAA,EAC9D,CAAA,EAAG,CAAC,OAAO,CAAC,CAAA;AAEZ,EAAA,OAAO,CAAC,MAAM,OAAO,CAAA;AACvB","file":"chunk-CNTWQSUT.js","sourcesContent":["\"use client\";\n\nimport * as React from \"react\";\nimport { useEffect, useState } from \"react\";\nimport {\n CommandDialog,\n CommandEmpty,\n CommandGroup,\n CommandInput,\n CommandItem,\n CommandList,\n CommandShortcut,\n} from \"./command\";\n\nexport interface CommandPaletteItem {\n id: string;\n label: string;\n shortcut?: string;\n group?: string;\n onSelect: () => void;\n}\n\nexport interface CommandPaletteProps {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n commands: CommandPaletteItem[];\n placeholder?: string;\n emptyMessage?: string;\n title?: string;\n}\n\n/**\n * Thin action registry over `CommandDialog` / cmdk.\n * Consumers register flat commands; optional `group` buckets them.\n */\nexport function CommandPalette({\n open,\n onOpenChange,\n commands,\n placeholder = \"Type a command or search…\",\n emptyMessage = \"No results found.\",\n title = \"Command palette\",\n}: CommandPaletteProps) {\n const groups = React.useMemo(() => {\n const map = new Map<string, CommandPaletteItem[]>();\n for (const cmd of commands) {\n const key = cmd.group ?? \"Actions\";\n const list = map.get(key) ?? [];\n list.push(cmd);\n map.set(key, list);\n }\n return map;\n }, [commands]);\n\n return (\n <CommandDialog open={open} onOpenChange={onOpenChange}>\n <CommandInput placeholder={placeholder} aria-label={title} />\n <CommandList>\n <CommandEmpty>{emptyMessage}</CommandEmpty>\n {Array.from(groups.entries()).map(([group, items]) => (\n <CommandGroup key={group} heading={group}>\n {items.map((cmd) => (\n <CommandItem\n key={cmd.id}\n value={`${cmd.id} ${cmd.label}`}\n onSelect={() => {\n onOpenChange(false);\n cmd.onSelect();\n }}\n >\n {cmd.label}\n {cmd.shortcut ? (\n <CommandShortcut>{cmd.shortcut}</CommandShortcut>\n ) : null}\n </CommandItem>\n ))}\n </CommandGroup>\n ))}\n </CommandList>\n </CommandDialog>\n );\n}\n\n/**\n * Toggle a command palette with Cmd/Ctrl+K.\n * Returns `[open, setOpen]` — pass into `<CommandPalette open onOpenChange />`.\n */\nexport function useCommandPaletteHotkey(\n enabled = true,\n): [boolean, React.Dispatch<React.SetStateAction<boolean>>] {\n const [open, setOpen] = useState(false);\n\n useEffect(() => {\n if (!enabled) return;\n const onKeyDown = (e: KeyboardEvent) => {\n if (e.key.toLowerCase() !== \"k\") return;\n if (!(e.metaKey || e.ctrlKey)) return;\n e.preventDefault();\n setOpen((prev) => !prev);\n };\n window.addEventListener(\"keydown\", onKeyDown);\n return () => window.removeEventListener(\"keydown\", onKeyDown);\n }, [enabled]);\n\n return [open, setOpen];\n}\n"]}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import { GAP_CLASSES } from './chunk-AVFZ4P4B.js';
|
|
2
|
+
import { cn } from './chunk-NZ5WBA4R.js';
|
|
3
|
+
import * as React from 'react';
|
|
4
|
+
import { cva } from 'class-variance-authority';
|
|
5
|
+
import { jsxs, jsx } from 'react/jsx-runtime';
|
|
6
|
+
|
|
7
|
+
var splitVariants = cva(
|
|
8
|
+
// Below `at`, this is a plain vertical stack: master first, detail after,
|
|
9
|
+
// which is the correct reading order on a phone. At `at` and up it becomes
|
|
10
|
+
// a twelve-column grid. `flex-col` is simply inert once `display: grid`
|
|
11
|
+
// takes over, so the two never fight.
|
|
12
|
+
"flex flex-col",
|
|
13
|
+
{
|
|
14
|
+
variants: {
|
|
15
|
+
at: {
|
|
16
|
+
sm: "sm:grid sm:grid-cols-12",
|
|
17
|
+
md: "md:grid md:grid-cols-12",
|
|
18
|
+
lg: "lg:grid lg:grid-cols-12",
|
|
19
|
+
xl: "xl:grid xl:grid-cols-12"
|
|
20
|
+
},
|
|
21
|
+
gap: GAP_CLASSES
|
|
22
|
+
},
|
|
23
|
+
defaultVariants: {
|
|
24
|
+
at: "md",
|
|
25
|
+
gap: "md"
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
);
|
|
29
|
+
var COL_SPAN = {
|
|
30
|
+
sm: { 4: "sm:col-span-4", 6: "sm:col-span-6", 8: "sm:col-span-8" },
|
|
31
|
+
md: { 4: "md:col-span-4", 6: "md:col-span-6", 8: "md:col-span-8" },
|
|
32
|
+
lg: { 4: "lg:col-span-4", 6: "lg:col-span-6", 8: "lg:col-span-8" },
|
|
33
|
+
xl: { 4: "xl:col-span-4", 6: "xl:col-span-6", 8: "xl:col-span-8" }
|
|
34
|
+
};
|
|
35
|
+
var START_SPAN = {
|
|
36
|
+
"1/3": 4,
|
|
37
|
+
"1/2": 6,
|
|
38
|
+
"2/3": 8
|
|
39
|
+
};
|
|
40
|
+
var END_SPAN = {
|
|
41
|
+
"1/3": 8,
|
|
42
|
+
"1/2": 6,
|
|
43
|
+
"2/3": 4
|
|
44
|
+
};
|
|
45
|
+
var Split = React.forwardRef(
|
|
46
|
+
({ className, start, end, ratio = "1/3", at = "md", gap, testID, ...props }, ref) => /* @__PURE__ */ jsxs(
|
|
47
|
+
"div",
|
|
48
|
+
{
|
|
49
|
+
ref,
|
|
50
|
+
"data-slot": "split",
|
|
51
|
+
"data-testid": testID,
|
|
52
|
+
className: cn(splitVariants({ at, gap }), className),
|
|
53
|
+
...props,
|
|
54
|
+
children: [
|
|
55
|
+
/* @__PURE__ */ jsx("div", { "data-slot": "split-start", className: cn("min-w-0", COL_SPAN[at][START_SPAN[ratio]]), children: start }),
|
|
56
|
+
/* @__PURE__ */ jsx("div", { "data-slot": "split-end", className: cn("min-w-0", COL_SPAN[at][END_SPAN[ratio]]), children: end })
|
|
57
|
+
]
|
|
58
|
+
}
|
|
59
|
+
)
|
|
60
|
+
);
|
|
61
|
+
Split.displayName = "Split";
|
|
62
|
+
|
|
63
|
+
export { Split, splitVariants };
|
|
64
|
+
//# sourceMappingURL=chunk-D2LIXA2Y.js.map
|
|
65
|
+
//# sourceMappingURL=chunk-D2LIXA2Y.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/layout/split.tsx"],"names":[],"mappings":";;;;;;AAeA,IAAM,aAAA,GAAgB,GAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAKpB,eAAA;AAAA,EACA;AAAA,IACE,QAAA,EAAU;AAAA,MACR,EAAA,EAAI;AAAA,QACF,EAAA,EAAI,yBAAA;AAAA,QACJ,EAAA,EAAI,yBAAA;AAAA,QACJ,EAAA,EAAI,yBAAA;AAAA,QACJ,EAAA,EAAI;AAAA,OACN;AAAA,MACA,GAAA,EAAK;AAAA,KACP;AAAA,IACA,eAAA,EAAiB;AAAA,MACf,EAAA,EAAI,IAAA;AAAA,MACJ,GAAA,EAAK;AAAA;AACP;AAEJ;AAWA,IAAM,QAAA,GAA+D;AAAA,EACnE,IAAI,EAAE,CAAA,EAAG,iBAAiB,CAAA,EAAG,eAAA,EAAiB,GAAG,eAAA,EAAgB;AAAA,EACjE,IAAI,EAAE,CAAA,EAAG,iBAAiB,CAAA,EAAG,eAAA,EAAiB,GAAG,eAAA,EAAgB;AAAA,EACjE,IAAI,EAAE,CAAA,EAAG,iBAAiB,CAAA,EAAG,eAAA,EAAiB,GAAG,eAAA,EAAgB;AAAA,EACjE,IAAI,EAAE,CAAA,EAAG,iBAAiB,CAAA,EAAG,eAAA,EAAiB,GAAG,eAAA;AACnD,CAAA;AAGA,IAAM,UAAA,GAA4C;AAAA,EAChD,KAAA,EAAO,CAAA;AAAA,EACP,KAAA,EAAO,CAAA;AAAA,EACP,KAAA,EAAO;AACT,CAAA;AAGA,IAAM,QAAA,GAA0C;AAAA,EAC9C,KAAA,EAAO,CAAA;AAAA,EACP,KAAA,EAAO,CAAA;AAAA,EACP,KAAA,EAAO;AACT,CAAA;AA2CO,IAAM,KAAA,GAAc,KAAA,CAAA,UAAA;AAAA,EACzB,CACE,EAAE,SAAA,EAAW,KAAA,EAAO,KAAK,KAAA,GAAQ,KAAA,EAAO,EAAA,GAAK,IAAA,EAAM,GAAA,EAAK,MAAA,EAAQ,GAAG,KAAA,IACnE,GAAA,qBAEA,IAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,GAAA;AAAA,MACA,WAAA,EAAU,OAAA;AAAA,MACV,aAAA,EAAa,MAAA;AAAA,MACb,SAAA,EAAW,GAAG,aAAA,CAAc,EAAE,IAAI,GAAA,EAAK,GAAG,SAAS,CAAA;AAAA,MAClD,GAAG,KAAA;AAAA,MAEJ,QAAA,EAAA;AAAA,wBAAA,GAAA,CAAC,KAAA,EAAA,EAAI,WAAA,EAAU,aAAA,EAAc,SAAA,EAAW,GAAG,SAAA,EAAW,QAAA,CAAS,EAAE,CAAA,CAAE,UAAA,CAAW,KAAK,CAAC,CAAC,GAClF,QAAA,EAAA,KAAA,EACH,CAAA;AAAA,wBACA,GAAA,CAAC,KAAA,EAAA,EAAI,WAAA,EAAU,WAAA,EAAY,WAAW,EAAA,CAAG,SAAA,EAAW,QAAA,CAAS,EAAE,EAAE,QAAA,CAAS,KAAK,CAAC,CAAC,GAC9E,QAAA,EAAA,GAAA,EACH;AAAA;AAAA;AAAA;AAGN;AACA,KAAA,CAAM,WAAA,GAAc,OAAA","file":"chunk-D2LIXA2Y.js","sourcesContent":["import * as React from \"react\";\nimport { type VariantProps, cva } from \"class-variance-authority\";\nimport { cn } from \"../../utils\";\nimport { GAP_CLASSES } from \"./spacing\";\n\n/**\n * Breakpoint at which a `Split` stops stacking and becomes side-by-side.\n * These are Tailwind's own breakpoint names, so `at=\"lg\"` means exactly\n * what `lg:` means everywhere else in the app.\n */\nexport type SplitBreakpoint = \"sm\" | \"md\" | \"lg\" | \"xl\";\n\n/** How the horizontal space divides once the split is side-by-side. */\nexport type SplitRatio = \"1/3\" | \"1/2\" | \"2/3\";\n\nconst splitVariants = cva(\n // Below `at`, this is a plain vertical stack: master first, detail after,\n // which is the correct reading order on a phone. At `at` and up it becomes\n // a twelve-column grid. `flex-col` is simply inert once `display: grid`\n // takes over, so the two never fight.\n \"flex flex-col\",\n {\n variants: {\n at: {\n sm: \"sm:grid sm:grid-cols-12\",\n md: \"md:grid md:grid-cols-12\",\n lg: \"lg:grid lg:grid-cols-12\",\n xl: \"xl:grid xl:grid-cols-12\",\n },\n gap: GAP_CLASSES,\n },\n defaultVariants: {\n at: \"md\",\n gap: \"md\",\n },\n }\n);\n\n/**\n * Column spans, written out literally per breakpoint because Tailwind\n * scans source text — a class name assembled at runtime (`${at}:col-span-${n}`)\n * is a class name Tailwind never generates.\n *\n * Only 4 / 6 / 8 appear: the twelve-column track makes every ratio and its\n * complement land inside that set (12-4=8, 12-6=6, 12-8=4), so one table\n * serves both panes.\n */\nconst COL_SPAN: Record<SplitBreakpoint, Record<4 | 6 | 8, string>> = {\n sm: { 4: \"sm:col-span-4\", 6: \"sm:col-span-6\", 8: \"sm:col-span-8\" },\n md: { 4: \"md:col-span-4\", 6: \"md:col-span-6\", 8: \"md:col-span-8\" },\n lg: { 4: \"lg:col-span-4\", 6: \"lg:col-span-6\", 8: \"lg:col-span-8\" },\n xl: { 4: \"xl:col-span-4\", 6: \"xl:col-span-6\", 8: \"xl:col-span-8\" },\n};\n\n/** Track count the `start` pane occupies, out of twelve. */\nconst START_SPAN: Record<SplitRatio, 4 | 6 | 8> = {\n \"1/3\": 4,\n \"1/2\": 6,\n \"2/3\": 8,\n};\n\n/** The `end` pane always takes what `start` left behind. */\nconst END_SPAN: Record<SplitRatio, 4 | 6 | 8> = {\n \"1/3\": 8,\n \"1/2\": 6,\n \"2/3\": 4,\n};\n\nexport interface SplitProps\n extends React.HTMLAttributes<HTMLDivElement>,\n Omit<VariantProps<typeof splitVariants>, \"at\"> {\n /** Leading pane — the \"master\" half. Renders first when stacked. */\n start: React.ReactNode;\n /** Trailing pane — the \"detail\" half. Renders second when stacked. */\n end: React.ReactNode;\n /** Share of the width the `start` pane takes. Default `\"1/3\"`. */\n ratio?: SplitRatio;\n /** Breakpoint at and above which the panes sit side by side. Default `\"md\"`. */\n at?: SplitBreakpoint;\n /** Stable test/automation selector (emitted as `data-testid`). */\n testID?: string;\n}\n\n/**\n * Split — the master-detail layout: two panes side by side above a\n * breakpoint, stacked below it.\n *\n * ```tsx\n * <Split\n * ratio=\"1/3\"\n * at=\"lg\"\n * gap=\"lg\"\n * start={<ConversationList />}\n * end={<ConversationDetail />}\n * />\n * ```\n *\n * The stacking behaviour is the whole reason this is a component rather\n * than two divs: a hand-rolled split usually forgets the small screen, and\n * a hand-rolled split that remembers usually picks a different breakpoint\n * from the one next door.\n *\n * Two panes only, and both are required — a \"split\" with an optional half\n * is a `Stack`, and a three-pane shell (nav + list + detail) is an\n * application shell, not a layout primitive. Nest a `Split` inside a\n * `Split` if you genuinely need three.\n *\n * @stability Beta\n */\nexport const Split = React.forwardRef<HTMLDivElement, SplitProps>(\n (\n { className, start, end, ratio = \"1/3\", at = \"md\", gap, testID, ...props },\n ref\n ) => (\n <div\n ref={ref}\n data-slot=\"split\"\n data-testid={testID}\n className={cn(splitVariants({ at, gap }), className)}\n {...props}\n >\n <div data-slot=\"split-start\" className={cn(\"min-w-0\", COL_SPAN[at][START_SPAN[ratio]])}>\n {start}\n </div>\n <div data-slot=\"split-end\" className={cn(\"min-w-0\", COL_SPAN[at][END_SPAN[ratio]])}>\n {end}\n </div>\n </div>\n )\n);\nSplit.displayName = \"Split\";\n\nexport { splitVariants };\n"]}
|