@psnext/design-system 1.2.0 → 1.3.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/Header.cjs +2 -2
- package/dist/Header.cjs.map +1 -1
- package/dist/Header.js +2 -2
- package/dist/Header.js.map +1 -1
- package/dist/Icon.cjs +8 -8
- package/dist/Icon.cjs.map +1 -1
- package/dist/Icon.js +8 -8
- package/dist/Icon.js.map +1 -1
- package/dist/Logo.cjs +163 -137
- package/dist/Logo.cjs.map +1 -1
- package/dist/Logo.js +163 -137
- package/dist/Logo.js.map +1 -1
- package/dist/index.cjs +1 -1
- package/dist/index.d.cts +5 -5
- package/dist/index.d.cts.map +1 -1
- package/dist/index.d.ts +5 -5
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index10.d.cts +6 -6
- package/dist/index10.d.cts.map +1 -1
- package/dist/index10.d.ts +7 -7
- package/dist/index10.d.ts.map +1 -1
- package/dist/index11.d.cts +3 -3
- package/dist/index11.d.ts +3 -3
- package/dist/index11.d.ts.map +1 -1
- package/dist/index12.d.cts +12 -12
- package/dist/index12.d.ts +12 -12
- package/dist/index12.d.ts.map +1 -1
- package/dist/index13.d.cts +6 -6
- package/dist/index13.d.ts +6 -6
- package/dist/index13.d.ts.map +1 -1
- package/dist/index14.d.cts +5 -5
- package/dist/index14.d.ts +5 -5
- package/dist/index15.d.cts +3 -3
- package/dist/index15.d.ts +3 -3
- package/dist/index15.d.ts.map +1 -1
- package/dist/index16.d.cts +2 -2
- package/dist/index16.d.ts +2 -2
- package/dist/index16.d.ts.map +1 -1
- package/dist/index17.d.ts +4 -4
- package/dist/index17.d.ts.map +1 -1
- package/dist/index18.d.cts +11 -11
- package/dist/index18.d.cts.map +1 -1
- package/dist/index18.d.ts +11 -11
- package/dist/index18.d.ts.map +1 -1
- package/dist/index19.d.cts +10 -10
- package/dist/index19.d.ts +10 -10
- package/dist/index19.d.ts.map +1 -1
- package/dist/index2.d.cts +8 -8
- package/dist/index2.d.cts.map +1 -1
- package/dist/index2.d.ts +8 -8
- package/dist/index2.d.ts.map +1 -1
- package/dist/index20.d.cts +16 -16
- package/dist/index20.d.cts.map +1 -1
- package/dist/index20.d.ts +16 -16
- package/dist/index21.d.cts +4 -4
- package/dist/index21.d.ts +4 -4
- package/dist/index21.d.ts.map +1 -1
- package/dist/index22.d.cts +11 -11
- package/dist/index22.d.ts +11 -11
- package/dist/index22.d.ts.map +1 -1
- package/dist/index23.d.cts +16 -16
- package/dist/index23.d.ts +16 -16
- package/dist/index24.d.cts +7 -7
- package/dist/index24.d.cts.map +1 -1
- package/dist/index24.d.ts +10 -10
- package/dist/index25.d.cts +2 -2
- package/dist/index25.d.ts +2 -2
- package/dist/index25.d.ts.map +1 -1
- package/dist/index26.d.cts +13 -13
- package/dist/index26.d.cts.map +1 -1
- package/dist/index26.d.ts +14 -14
- package/dist/index26.d.ts.map +1 -1
- package/dist/index27.d.cts +7 -7
- package/dist/index27.d.ts +7 -7
- package/dist/index28.d.cts +5 -5
- package/dist/index28.d.cts.map +1 -1
- package/dist/index28.d.ts +5 -5
- package/dist/index29.d.cts +4 -4
- package/dist/index29.d.cts.map +1 -1
- package/dist/index29.d.ts +4 -4
- package/dist/index29.d.ts.map +1 -1
- package/dist/index3.d.cts +13 -13
- package/dist/index3.d.cts.map +1 -1
- package/dist/index3.d.ts +13 -13
- package/dist/index3.d.ts.map +1 -1
- package/dist/index30.d.cts +5 -5
- package/dist/index30.d.cts.map +1 -1
- package/dist/index30.d.ts +6 -6
- package/dist/index30.d.ts.map +1 -1
- package/dist/index31.d.cts +2 -2
- package/dist/index31.d.ts +3 -3
- package/dist/index32.d.cts +6 -6
- package/dist/index32.d.cts.map +1 -1
- package/dist/index32.d.ts +6 -6
- package/dist/index32.d.ts.map +1 -1
- package/dist/index33.d.cts +10 -10
- package/dist/index33.d.cts.map +1 -1
- package/dist/index33.d.ts +11 -11
- package/dist/index33.d.ts.map +1 -1
- package/dist/index34.d.cts +5 -5
- package/dist/index34.d.ts +5 -5
- package/dist/index35.d.cts +17 -17
- package/dist/index35.d.cts.map +1 -1
- package/dist/index35.d.ts +15 -15
- package/dist/index35.d.ts.map +1 -1
- package/dist/index36.d.cts +3 -3
- package/dist/index36.d.cts.map +1 -1
- package/dist/index36.d.ts +3 -3
- package/dist/index36.d.ts.map +1 -1
- package/dist/index37.d.cts +4 -4
- package/dist/index37.d.ts +5 -5
- package/dist/index38.d.cts +2 -2
- package/dist/index38.d.ts +2 -2
- package/dist/index39.d.cts +17 -17
- package/dist/index39.d.ts +17 -17
- package/dist/index4.d.cts +2 -2
- package/dist/index4.d.ts +2 -2
- package/dist/index4.d.ts.map +1 -1
- package/dist/index40.d.cts +5 -5
- package/dist/index40.d.cts.map +1 -1
- package/dist/index40.d.ts +5 -5
- package/dist/index40.d.ts.map +1 -1
- package/dist/index41.d.cts +11 -11
- package/dist/index41.d.cts.map +1 -1
- package/dist/index41.d.ts +11 -11
- package/dist/index42.d.cts +8 -8
- package/dist/index42.d.cts.map +1 -1
- package/dist/index42.d.ts +8 -8
- package/dist/index42.d.ts.map +1 -1
- package/dist/index43.d.cts +9 -9
- package/dist/index43.d.cts.map +1 -1
- package/dist/index43.d.ts +9 -9
- package/dist/index44.d.cts +8 -8
- package/dist/index44.d.ts +8 -8
- package/dist/index44.d.ts.map +1 -1
- package/dist/index45.d.cts +2 -2
- package/dist/index45.d.cts.map +1 -1
- package/dist/index45.d.ts +2 -2
- package/dist/index45.d.ts.map +1 -1
- package/dist/index46.d.cts +4 -4
- package/dist/index46.d.ts +4 -4
- package/dist/index46.d.ts.map +1 -1
- package/dist/index47.d.cts +4 -4
- package/dist/index47.d.cts.map +1 -1
- package/dist/index47.d.ts +4 -4
- package/dist/index47.d.ts.map +1 -1
- package/dist/index48.d.cts +3 -3
- package/dist/index48.d.cts.map +1 -1
- package/dist/index48.d.ts +3 -3
- package/dist/index48.d.ts.map +1 -1
- package/dist/index49.d.cts +11 -11
- package/dist/index49.d.cts.map +1 -1
- package/dist/index49.d.ts +11 -11
- package/dist/index49.d.ts.map +1 -1
- package/dist/index5.d.cts +7 -7
- package/dist/index5.d.cts.map +1 -1
- package/dist/index5.d.ts +7 -7
- package/dist/index5.d.ts.map +1 -1
- package/dist/index50.d.cts +9 -9
- package/dist/index50.d.ts +9 -9
- package/dist/index50.d.ts.map +1 -1
- package/dist/index51.d.cts +5 -5
- package/dist/index51.d.ts +5 -5
- package/dist/index51.d.ts.map +1 -1
- package/dist/index52.d.cts +27 -27
- package/dist/index52.d.cts.map +1 -1
- package/dist/index52.d.ts +25 -25
- package/dist/index52.d.ts.map +1 -1
- package/dist/index53.d.cts +5 -5
- package/dist/index53.d.ts +5 -5
- package/dist/index54.d.cts +2 -2
- package/dist/index54.d.ts +2 -2
- package/dist/index54.d.ts.map +1 -1
- package/dist/index55.d.cts +2 -2
- package/dist/index55.d.cts.map +1 -1
- package/dist/index55.d.ts +2 -2
- package/dist/index55.d.ts.map +1 -1
- package/dist/index56.d.cts +2 -2
- package/dist/index56.d.ts +2 -2
- package/dist/index56.d.ts.map +1 -1
- package/dist/index57.d.cts +4 -4
- package/dist/index57.d.ts +4 -4
- package/dist/index57.d.ts.map +1 -1
- package/dist/index58.d.cts +9 -9
- package/dist/index58.d.ts +9 -9
- package/dist/index58.d.ts.map +1 -1
- package/dist/index59.d.cts +9 -9
- package/dist/index59.d.ts +13 -13
- package/dist/index59.d.ts.map +1 -1
- package/dist/index6.d.cts +5 -5
- package/dist/index6.d.cts.map +1 -1
- package/dist/index6.d.ts +5 -5
- package/dist/index6.d.ts.map +1 -1
- package/dist/index60.d.cts +6 -6
- package/dist/index60.d.cts.map +1 -1
- package/dist/index60.d.ts +7 -7
- package/dist/index60.d.ts.map +1 -1
- package/dist/index61.d.cts +4 -4
- package/dist/index61.d.cts.map +1 -1
- package/dist/index61.d.ts +4 -4
- package/dist/index61.d.ts.map +1 -1
- package/dist/index62.d.cts +2 -2
- package/dist/index62.d.cts.map +1 -1
- package/dist/index62.d.ts +2 -2
- package/dist/index62.d.ts.map +1 -1
- package/dist/index63.d.cts +5 -5
- package/dist/index63.d.ts +3 -3
- package/dist/index64.d.cts +3 -3
- package/dist/index64.d.ts +3 -3
- package/dist/index64.d.ts.map +1 -1
- package/dist/index65.d.cts +4 -4
- package/dist/index65.d.cts.map +1 -1
- package/dist/index65.d.ts +4 -4
- package/dist/index65.d.ts.map +1 -1
- package/dist/index66.d.cts +2 -2
- package/dist/index66.d.ts +2 -2
- package/dist/index66.d.ts.map +1 -1
- package/dist/index67.d.cts +7 -7
- package/dist/index67.d.cts.map +1 -1
- package/dist/index67.d.ts +8 -8
- package/dist/index67.d.ts.map +1 -1
- package/dist/index68.d.cts +7 -7
- package/dist/index68.d.ts +7 -7
- package/dist/index68.d.ts.map +1 -1
- package/dist/index7.d.cts +8 -8
- package/dist/index7.d.cts.map +1 -1
- package/dist/index7.d.ts +8 -8
- package/dist/index7.d.ts.map +1 -1
- package/dist/index70.d.cts +8 -8
- package/dist/index70.d.ts +8 -8
- package/dist/index8.d.cts +4 -4
- package/dist/index8.d.ts +4 -4
- package/dist/index8.d.ts.map +1 -1
- package/dist/index9.d.cts +2 -2
- package/dist/index9.d.cts.map +1 -1
- package/dist/index9.d.ts +2 -2
- package/dist/index9.d.ts.map +1 -1
- package/dist/layouts/Container/index.cjs +1 -1
- package/dist/layouts/Container/index.cjs.map +1 -1
- package/dist/layouts/Container/index.js +1 -1
- package/dist/layouts/Container/index.js.map +1 -1
- package/dist/layouts/PageBackground/index.cjs +1 -1
- package/dist/layouts/PageBackground/index.cjs.map +1 -1
- package/dist/layouts/PageBackground/index.js +1 -1
- package/dist/layouts/PageBackground/index.js.map +1 -1
- package/dist/patterns/DataTable/index.d.cts +3 -3
- package/dist/patterns/DataTable/index.d.ts +3 -3
- package/dist/patterns/Footer/index.cjs +1 -1
- package/dist/patterns/Footer/index.cjs.map +1 -1
- package/dist/patterns/Footer/index.d.cts +8 -8
- package/dist/patterns/Footer/index.d.cts.map +1 -1
- package/dist/patterns/Footer/index.d.ts +8 -8
- package/dist/patterns/Footer/index.d.ts.map +1 -1
- package/dist/patterns/Footer/index.js +1 -1
- package/dist/patterns/Footer/index.js.map +1 -1
- package/dist/patterns/MediaObject/index.d.cts +11 -11
- package/dist/patterns/MediaObject/index.d.ts +13 -13
- package/dist/patterns/MediaObject/index.d.ts.map +1 -1
- package/dist/patterns/SectionCard/index.d.cts +2 -2
- package/dist/patterns/SectionCard/index.d.ts +2 -2
- package/dist/patterns/SectionCard/index.d.ts.map +1 -1
- package/dist/patterns/SectionHeading/index.d.cts +2 -2
- package/dist/patterns/SectionHeading/index.d.ts +2 -2
- package/dist/patterns/SectionHeading/index.d.ts.map +1 -1
- package/dist/primitives/Accordion/index.cjs +1 -1
- package/dist/primitives/Accordion/index.cjs.map +1 -1
- package/dist/primitives/Accordion/index.js +1 -1
- package/dist/primitives/Accordion/index.js.map +1 -1
- package/dist/primitives/Alert/index.cjs +2 -2
- package/dist/primitives/Alert/index.cjs.map +1 -1
- package/dist/primitives/Alert/index.js +2 -2
- package/dist/primitives/Alert/index.js.map +1 -1
- package/dist/primitives/AlertDialog/index.cjs +2 -2
- package/dist/primitives/AlertDialog/index.cjs.map +1 -1
- package/dist/primitives/AlertDialog/index.js +2 -2
- package/dist/primitives/AlertDialog/index.js.map +1 -1
- package/dist/primitives/Avatar/index.cjs +2 -2
- package/dist/primitives/Avatar/index.cjs.map +1 -1
- package/dist/primitives/Avatar/index.js +2 -2
- package/dist/primitives/Avatar/index.js.map +1 -1
- package/dist/primitives/Badge/index.cjs +4 -4
- package/dist/primitives/Badge/index.cjs.map +1 -1
- package/dist/primitives/Badge/index.js +4 -4
- package/dist/primitives/Badge/index.js.map +1 -1
- package/dist/primitives/Button/index.cjs +5 -5
- package/dist/primitives/Button/index.cjs.map +1 -1
- package/dist/primitives/Button/index.js +5 -5
- package/dist/primitives/Button/index.js.map +1 -1
- package/dist/primitives/ButtonGroup/index.cjs +2 -2
- package/dist/primitives/ButtonGroup/index.cjs.map +1 -1
- package/dist/primitives/ButtonGroup/index.js +2 -2
- package/dist/primitives/ButtonGroup/index.js.map +1 -1
- package/dist/primitives/Calendar/index.cjs +1 -1
- package/dist/primitives/Calendar/index.cjs.map +1 -1
- package/dist/primitives/Calendar/index.js +1 -1
- package/dist/primitives/Calendar/index.js.map +1 -1
- package/dist/primitives/Card/index.cjs +4 -4
- package/dist/primitives/Card/index.cjs.map +1 -1
- package/dist/primitives/Card/index.js +4 -4
- package/dist/primitives/Card/index.js.map +1 -1
- package/dist/primitives/Chart/index.cjs +1 -1
- package/dist/primitives/Chart/index.cjs.map +1 -1
- package/dist/primitives/Chart/index.js +1 -1
- package/dist/primitives/Chart/index.js.map +1 -1
- package/dist/primitives/Checkbox/index.cjs +1 -1
- package/dist/primitives/Checkbox/index.cjs.map +1 -1
- package/dist/primitives/Checkbox/index.js +1 -1
- package/dist/primitives/Checkbox/index.js.map +1 -1
- package/dist/primitives/Command/index.cjs +1 -1
- package/dist/primitives/Command/index.cjs.map +1 -1
- package/dist/primitives/Command/index.js +1 -1
- package/dist/primitives/Command/index.js.map +1 -1
- package/dist/primitives/ContextMenu/index.cjs +1 -1
- package/dist/primitives/ContextMenu/index.cjs.map +1 -1
- package/dist/primitives/ContextMenu/index.js +1 -1
- package/dist/primitives/ContextMenu/index.js.map +1 -1
- package/dist/primitives/Credits/index.cjs +1 -1
- package/dist/primitives/Credits/index.cjs.map +1 -1
- package/dist/primitives/Credits/index.js +1 -1
- package/dist/primitives/Credits/index.js.map +1 -1
- package/dist/primitives/Dialog/index.cjs +2 -2
- package/dist/primitives/Dialog/index.cjs.map +1 -1
- package/dist/primitives/Dialog/index.js +2 -2
- package/dist/primitives/Dialog/index.js.map +1 -1
- package/dist/primitives/Drawer/index.cjs +1 -1
- package/dist/primitives/Drawer/index.cjs.map +1 -1
- package/dist/primitives/Drawer/index.js +1 -1
- package/dist/primitives/Drawer/index.js.map +1 -1
- package/dist/primitives/DropdownMenu/index.cjs +1 -1
- package/dist/primitives/DropdownMenu/index.cjs.map +1 -1
- package/dist/primitives/DropdownMenu/index.js +1 -1
- package/dist/primitives/DropdownMenu/index.js.map +1 -1
- package/dist/primitives/Field/index.cjs +1 -1
- package/dist/primitives/Field/index.cjs.map +1 -1
- package/dist/primitives/Field/index.js +1 -1
- package/dist/primitives/Field/index.js.map +1 -1
- package/dist/primitives/HoverCard/index.cjs +1 -1
- package/dist/primitives/HoverCard/index.cjs.map +1 -1
- package/dist/primitives/HoverCard/index.js +1 -1
- package/dist/primitives/HoverCard/index.js.map +1 -1
- package/dist/primitives/Input/index.cjs +4 -4
- package/dist/primitives/Input/index.cjs.map +1 -1
- package/dist/primitives/Input/index.js +4 -4
- package/dist/primitives/Input/index.js.map +1 -1
- package/dist/primitives/InputGroup/index.cjs +6 -6
- package/dist/primitives/InputGroup/index.cjs.map +1 -1
- package/dist/primitives/InputGroup/index.js +6 -6
- package/dist/primitives/InputGroup/index.js.map +1 -1
- package/dist/primitives/InputOtp/index.cjs +1 -1
- package/dist/primitives/InputOtp/index.cjs.map +1 -1
- package/dist/primitives/InputOtp/index.js +1 -1
- package/dist/primitives/InputOtp/index.js.map +1 -1
- package/dist/primitives/Item/index.cjs +2 -2
- package/dist/primitives/Item/index.cjs.map +1 -1
- package/dist/primitives/Item/index.js +2 -2
- package/dist/primitives/Item/index.js.map +1 -1
- package/dist/primitives/Kbd/index.cjs +1 -1
- package/dist/primitives/Kbd/index.cjs.map +1 -1
- package/dist/primitives/Kbd/index.js +1 -1
- package/dist/primitives/Kbd/index.js.map +1 -1
- package/dist/primitives/Menubar/index.cjs +1 -1
- package/dist/primitives/Menubar/index.cjs.map +1 -1
- package/dist/primitives/Menubar/index.js +1 -1
- package/dist/primitives/Menubar/index.js.map +1 -1
- package/dist/primitives/NativeSelect/index.cjs +1 -1
- package/dist/primitives/NativeSelect/index.cjs.map +1 -1
- package/dist/primitives/NativeSelect/index.js +1 -1
- package/dist/primitives/NativeSelect/index.js.map +1 -1
- package/dist/primitives/NavRail/index.cjs +2 -2
- package/dist/primitives/NavRail/index.cjs.map +1 -1
- package/dist/primitives/NavRail/index.js +2 -2
- package/dist/primitives/NavRail/index.js.map +1 -1
- package/dist/primitives/NavigationMenu/index.cjs +1 -1
- package/dist/primitives/NavigationMenu/index.cjs.map +1 -1
- package/dist/primitives/NavigationMenu/index.js +1 -1
- package/dist/primitives/NavigationMenu/index.js.map +1 -1
- package/dist/primitives/Popover/index.cjs +1 -1
- package/dist/primitives/Popover/index.cjs.map +1 -1
- package/dist/primitives/Popover/index.js +1 -1
- package/dist/primitives/Popover/index.js.map +1 -1
- package/dist/primitives/Progress/index.cjs +1 -1
- package/dist/primitives/Progress/index.cjs.map +1 -1
- package/dist/primitives/Progress/index.js +1 -1
- package/dist/primitives/Progress/index.js.map +1 -1
- package/dist/primitives/RadioGroup/index.cjs +1 -1
- package/dist/primitives/RadioGroup/index.cjs.map +1 -1
- package/dist/primitives/RadioGroup/index.js +1 -1
- package/dist/primitives/RadioGroup/index.js.map +1 -1
- package/dist/primitives/ScrollArea/index.cjs +1 -1
- package/dist/primitives/ScrollArea/index.cjs.map +1 -1
- package/dist/primitives/ScrollArea/index.js +1 -1
- package/dist/primitives/ScrollArea/index.js.map +1 -1
- package/dist/primitives/Select/index.cjs +1 -1
- package/dist/primitives/Select/index.cjs.map +1 -1
- package/dist/primitives/Select/index.js +1 -1
- package/dist/primitives/Select/index.js.map +1 -1
- package/dist/primitives/Skeleton/index.cjs +2 -2
- package/dist/primitives/Skeleton/index.cjs.map +1 -1
- package/dist/primitives/Skeleton/index.js +2 -2
- package/dist/primitives/Skeleton/index.js.map +1 -1
- package/dist/primitives/Slider/index.cjs +1 -1
- package/dist/primitives/Slider/index.cjs.map +1 -1
- package/dist/primitives/Slider/index.js +1 -1
- package/dist/primitives/Slider/index.js.map +1 -1
- package/dist/primitives/Sonner/index.cjs +1 -1
- package/dist/primitives/Sonner/index.cjs.map +1 -1
- package/dist/primitives/Sonner/index.js +1 -1
- package/dist/primitives/Sonner/index.js.map +1 -1
- package/dist/primitives/Switch/index.cjs +3 -3
- package/dist/primitives/Switch/index.cjs.map +1 -1
- package/dist/primitives/Switch/index.js +3 -3
- package/dist/primitives/Switch/index.js.map +1 -1
- package/dist/primitives/Table/index.cjs +3 -3
- package/dist/primitives/Table/index.cjs.map +1 -1
- package/dist/primitives/Table/index.js +3 -3
- package/dist/primitives/Table/index.js.map +1 -1
- package/dist/primitives/Tabs/index.cjs +4 -4
- package/dist/primitives/Tabs/index.cjs.map +1 -1
- package/dist/primitives/Tabs/index.js +4 -4
- package/dist/primitives/Tabs/index.js.map +1 -1
- package/dist/primitives/Textarea/index.cjs +2 -2
- package/dist/primitives/Textarea/index.cjs.map +1 -1
- package/dist/primitives/Textarea/index.js +2 -2
- package/dist/primitives/Textarea/index.js.map +1 -1
- package/dist/primitives/Toggle/index.cjs +2 -2
- package/dist/primitives/Toggle/index.cjs.map +1 -1
- package/dist/primitives/Toggle/index.js +2 -2
- package/dist/primitives/Toggle/index.js.map +1 -1
- package/dist/primitives/Tooltip/index.cjs +2 -2
- package/dist/primitives/Tooltip/index.cjs.map +1 -1
- package/dist/primitives/Tooltip/index.js +2 -2
- package/dist/primitives/Tooltip/index.js.map +1 -1
- package/dist/primitives/index.cjs +1 -1
- package/dist/primitives/index.js +1 -1
- package/dist/styles/index.css +3 -0
- package/dist/styles/semantic.css +23 -12
- package/dist/styles/theme.css +43 -4
- package/dist/styles/tokens/border-radius.css +2 -1
- package/dist/styles/tokens/mode-dark.css +1 -1
- package/dist/styles/typography.css +136 -0
- package/package.json +7 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":["MenubarPrimitive"],"sources":["../../../src/primitives/Menubar/Menubar.tsx"],"sourcesContent":["import { CheckIcon, ChevronRightIcon, CircleIcon } from \"lucide-react\";\nimport { Menubar as MenubarPrimitive } from \"radix-ui\";\nimport type * as React from \"react\";\n\nimport { cn } from \"@/utils\";\n\n/** Horizontal application menu bar that hosts a row of dropdown menus (File, Edit, …). */\nfunction Menubar({ className, ...props }: React.ComponentProps<typeof MenubarPrimitive.Root>) {\n return (\n <MenubarPrimitive.Root\n data-slot=\"menubar\"\n className={cn(\n \"flex h-9 items-center gap-1 rounded-md border bg-background p-1 shadow-xs\",\n className,\n )}\n {...props}\n />\n );\n}\n\n/** A single menu within the bar — wraps a trigger and its content. */\nfunction MenubarMenu({ ...props }: React.ComponentProps<typeof MenubarPrimitive.Menu>) {\n return <MenubarPrimitive.Menu data-slot=\"menubar-menu\" {...props} />;\n}\n\n/** Groups related menu items together for semantic structure. */\nfunction MenubarGroup({ ...props }: React.ComponentProps<typeof MenubarPrimitive.Group>) {\n return <MenubarPrimitive.Group data-slot=\"menubar-group\" {...props} />;\n}\n\n/** Portals menu content into the document body so it escapes overflow/stacking contexts. */\nfunction MenubarPortal({ ...props }: React.ComponentProps<typeof MenubarPrimitive.Portal>) {\n return <MenubarPrimitive.Portal data-slot=\"menubar-portal\" {...props} />;\n}\n\n/** Groups `MenubarRadioItem`s so only one can be selected at a time. */\nfunction MenubarRadioGroup({ ...props }: React.ComponentProps<typeof MenubarPrimitive.RadioGroup>) {\n return <MenubarPrimitive.RadioGroup data-slot=\"menubar-radio-group\" {...props} />;\n}\n\n/** The clickable label in the bar that opens its menu's content. */\nfunction MenubarTrigger({\n className,\n ...props\n}: React.ComponentProps<typeof MenubarPrimitive.Trigger>) {\n return (\n <MenubarPrimitive.Trigger\n data-slot=\"menubar-trigger\"\n className={cn(\n \"flex items-center rounded-sm px-2 py-1 text-sm font-medium outline-hidden select-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 );\n}\n\n/** The dropdown surface that holds a menu's items; portalled and animated. */\nfunction MenubarContent({\n className,\n align = \"start\",\n alignOffset = -4,\n sideOffset = 8,\n ...props\n}: React.ComponentProps<typeof MenubarPrimitive.Content>) {\n return (\n <MenubarPortal>\n <MenubarPrimitive.Content\n data-slot=\"menubar-content\"\n align={align}\n alignOffset={alignOffset}\n sideOffset={sideOffset}\n className={cn(\n \"z-50 min-w-[12rem] origin-(--radix-menubar-content-transform-origin) overflow-hidden rounded-md border bg-popover p-1 text-popover-foreground shadow-md 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 data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[state=open]:animate-in data-[state=open]:fade-in-0 data-[state=open]:zoom-in-95\",\n className,\n )}\n {...props}\n />\n </MenubarPortal>\n );\n}\n\n/** A selectable action inside a menu's content. */\nfunction MenubarItem({\n className,\n inset,\n variant = \"default\",\n ...props\n}: React.ComponentProps<typeof MenubarPrimitive.Item> & {\n /** Adds left padding to align the label with items that have leading icons/indicators. */\n inset?: boolean;\n /** Visual intent — `destructive` styles the item in the danger colour. */\n variant?: \"default\" | \"destructive\";\n}) {\n return (\n <MenubarPrimitive.Item\n data-slot=\"menubar-item\"\n data-inset={inset}\n data-variant={variant}\n className={cn(\n \"relative flex cursor-default items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-hidden select-none focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50 data-[inset]:pl-8 data-[variant=destructive]:text-destructive data-[variant=destructive]:focus:bg-destructive/10 data-[variant=destructive]:focus:text-destructive dark:data-[variant=destructive]:focus:bg-destructive/20 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4 [&_svg:not([class*='text-'])]:text-muted-foreground data-[variant=destructive]:*:[svg]:text-destructive!\",\n className,\n )}\n {...props}\n />\n );\n}\n\n/** A menu item with a toggleable checkmark indicator. */\nfunction MenubarCheckboxItem({\n className,\n children,\n checked,\n ...props\n}: React.ComponentProps<typeof MenubarPrimitive.CheckboxItem>) {\n return (\n <MenubarPrimitive.CheckboxItem\n data-slot=\"menubar-checkbox-item\"\n className={cn(\n \"relative flex cursor-default items-center gap-2 rounded-xs py-1.5 pr-2 pl-8 text-sm outline-hidden select-none focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\n className,\n )}\n checked={checked}\n {...props}\n >\n <span className=\"pointer-events-none absolute left-2 flex size-3.5 items-center justify-center\">\n <MenubarPrimitive.ItemIndicator>\n <CheckIcon className=\"size-4\" />\n </MenubarPrimitive.ItemIndicator>\n </span>\n {children}\n </MenubarPrimitive.CheckboxItem>\n );\n}\n\n/** A menu item with a radio dot indicator; use inside a `MenubarRadioGroup`. */\nfunction MenubarRadioItem({\n className,\n children,\n ...props\n}: React.ComponentProps<typeof MenubarPrimitive.RadioItem>) {\n return (\n <MenubarPrimitive.RadioItem\n data-slot=\"menubar-radio-item\"\n className={cn(\n \"relative flex cursor-default items-center gap-2 rounded-xs py-1.5 pr-2 pl-8 text-sm outline-hidden select-none focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\n className,\n )}\n {...props}\n >\n <span className=\"pointer-events-none absolute left-2 flex size-3.5 items-center justify-center\">\n <MenubarPrimitive.ItemIndicator>\n <CircleIcon className=\"size-2 fill-current\" />\n </MenubarPrimitive.ItemIndicator>\n </span>\n {children}\n </MenubarPrimitive.RadioItem>\n );\n}\n\n/** A non-interactive heading that titles a group of menu items. */\nfunction MenubarLabel({\n className,\n inset,\n ...props\n}: React.ComponentProps<typeof MenubarPrimitive.Label> & {\n /** Adds left padding to align the label with items that have leading icons/indicators. */\n inset?: boolean;\n}) {\n return (\n <MenubarPrimitive.Label\n data-slot=\"menubar-label\"\n data-inset={inset}\n className={cn(\"px-2 py-1.5 text-sm font-medium data-[inset]:pl-8\", className)}\n {...props}\n />\n );\n}\n\n/** A thin divider line between groups of menu items. */\nfunction MenubarSeparator({\n className,\n ...props\n}: React.ComponentProps<typeof MenubarPrimitive.Separator>) {\n return (\n <MenubarPrimitive.Separator\n data-slot=\"menubar-separator\"\n className={cn(\"-mx-1 my-1 h-px bg-border\", className)}\n {...props}\n />\n );\n}\n\n/** Right-aligned hint text for an item's keyboard shortcut (e.g. ⌘T). */\nfunction MenubarShortcut({ className, ...props }: React.ComponentProps<\"span\">) {\n return (\n <span\n data-slot=\"menubar-shortcut\"\n className={cn(\"ml-auto text-xs tracking-widest text-muted-foreground\", className)}\n {...props}\n />\n );\n}\n\n/** Wraps a nested submenu (its trigger and content). */\nfunction MenubarSub({ ...props }: React.ComponentProps<typeof MenubarPrimitive.Sub>) {\n return <MenubarPrimitive.Sub data-slot=\"menubar-sub\" {...props} />;\n}\n\n/** An item that opens a nested submenu; shows a trailing chevron. */\nfunction MenubarSubTrigger({\n className,\n inset,\n children,\n ...props\n}: React.ComponentProps<typeof MenubarPrimitive.SubTrigger> & {\n /** Adds left padding to align the label with items that have leading icons/indicators. */\n inset?: boolean;\n}) {\n return (\n <MenubarPrimitive.SubTrigger\n data-slot=\"menubar-sub-trigger\"\n data-inset={inset}\n className={cn(\n \"flex cursor-default items-center rounded-sm px-2 py-1.5 text-sm outline-none select-none focus:bg-accent focus:text-accent-foreground data-[inset]:pl-8 data-[state=open]:bg-accent data-[state=open]:text-accent-foreground\",\n className,\n )}\n {...props}\n >\n {children}\n <ChevronRightIcon className=\"ml-auto h-4 w-4\" />\n </MenubarPrimitive.SubTrigger>\n );\n}\n\n/** The dropdown surface for a nested submenu's items. */\nfunction MenubarSubContent({\n className,\n ...props\n}: React.ComponentProps<typeof MenubarPrimitive.SubContent>) {\n return (\n <MenubarPrimitive.SubContent\n data-slot=\"menubar-sub-content\"\n className={cn(\n \"z-50 min-w-[8rem] origin-(--radix-menubar-content-transform-origin) overflow-hidden rounded-md border bg-popover p-1 text-popover-foreground shadow-lg 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 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[state=open]:animate-in data-[state=open]:fade-in-0 data-[state=open]:zoom-in-95\",\n className,\n )}\n {...props}\n />\n );\n}\n\nexport {\n Menubar,\n MenubarPortal,\n MenubarMenu,\n MenubarTrigger,\n MenubarContent,\n MenubarGroup,\n MenubarSeparator,\n MenubarLabel,\n MenubarItem,\n MenubarShortcut,\n MenubarCheckboxItem,\n MenubarRadioGroup,\n MenubarRadioItem,\n MenubarSub,\n MenubarSubTrigger,\n MenubarSubContent,\n};\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","names":["MenubarPrimitive"],"sources":["../../../src/primitives/Menubar/Menubar.tsx"],"sourcesContent":["import { CheckIcon, ChevronRightIcon, CircleIcon } from \"lucide-react\";\nimport { Menubar as MenubarPrimitive } from \"radix-ui\";\nimport type * as React from \"react\";\n\nimport { cn } from \"@/utils\";\n\n/** Horizontal application menu bar that hosts a row of dropdown menus (File, Edit, …). */\nfunction Menubar({ className, ...props }: React.ComponentProps<typeof MenubarPrimitive.Root>) {\n return (\n <MenubarPrimitive.Root\n data-slot=\"menubar\"\n className={cn(\n \"flex h-9 items-center gap-1 rounded-md border bg-background p-1 shadow-xs\",\n className,\n )}\n {...props}\n />\n );\n}\n\n/** A single menu within the bar — wraps a trigger and its content. */\nfunction MenubarMenu({ ...props }: React.ComponentProps<typeof MenubarPrimitive.Menu>) {\n return <MenubarPrimitive.Menu data-slot=\"menubar-menu\" {...props} />;\n}\n\n/** Groups related menu items together for semantic structure. */\nfunction MenubarGroup({ ...props }: React.ComponentProps<typeof MenubarPrimitive.Group>) {\n return <MenubarPrimitive.Group data-slot=\"menubar-group\" {...props} />;\n}\n\n/** Portals menu content into the document body so it escapes overflow/stacking contexts. */\nfunction MenubarPortal({ ...props }: React.ComponentProps<typeof MenubarPrimitive.Portal>) {\n return <MenubarPrimitive.Portal data-slot=\"menubar-portal\" {...props} />;\n}\n\n/** Groups `MenubarRadioItem`s so only one can be selected at a time. */\nfunction MenubarRadioGroup({ ...props }: React.ComponentProps<typeof MenubarPrimitive.RadioGroup>) {\n return <MenubarPrimitive.RadioGroup data-slot=\"menubar-radio-group\" {...props} />;\n}\n\n/** The clickable label in the bar that opens its menu's content. */\nfunction MenubarTrigger({\n className,\n ...props\n}: React.ComponentProps<typeof MenubarPrimitive.Trigger>) {\n return (\n <MenubarPrimitive.Trigger\n data-slot=\"menubar-trigger\"\n className={cn(\n \"flex items-center rounded-sm px-2 py-1 text-sm font-medium outline-hidden select-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 );\n}\n\n/** The dropdown surface that holds a menu's items; portalled and animated. */\nfunction MenubarContent({\n className,\n align = \"start\",\n alignOffset = -4,\n sideOffset = 8,\n ...props\n}: React.ComponentProps<typeof MenubarPrimitive.Content>) {\n return (\n <MenubarPortal>\n <MenubarPrimitive.Content\n data-slot=\"menubar-content\"\n align={align}\n alignOffset={alignOffset}\n sideOffset={sideOffset}\n className={cn(\n \"z-50 min-w-[12rem] origin-(--radix-menubar-content-transform-origin) overflow-hidden rounded-md border bg-popover p-1 text-popover-foreground shadow-md 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 data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[state=open]:animate-in data-[state=open]:fade-in-0 data-[state=open]:zoom-in-95\",\n className,\n )}\n {...props}\n />\n </MenubarPortal>\n );\n}\n\n/** A selectable action inside a menu's content. */\nfunction MenubarItem({\n className,\n inset,\n variant = \"default\",\n ...props\n}: React.ComponentProps<typeof MenubarPrimitive.Item> & {\n /** Adds left padding to align the label with items that have leading icons/indicators. */\n inset?: boolean;\n /** Visual intent — `destructive` styles the item in the danger colour. */\n variant?: \"default\" | \"destructive\";\n}) {\n return (\n <MenubarPrimitive.Item\n data-slot=\"menubar-item\"\n data-inset={inset}\n data-variant={variant}\n className={cn(\n \"relative flex cursor-default items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-hidden select-none focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50 data-[inset]:pl-8 data-[variant=destructive]:text-destructive data-[variant=destructive]:focus:bg-destructive-subtle data-[variant=destructive]:focus:text-destructive [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4 [&_svg:not([class*='text-'])]:text-muted-foreground data-[variant=destructive]:*:[svg]:text-destructive!\",\n className,\n )}\n {...props}\n />\n );\n}\n\n/** A menu item with a toggleable checkmark indicator. */\nfunction MenubarCheckboxItem({\n className,\n children,\n checked,\n ...props\n}: React.ComponentProps<typeof MenubarPrimitive.CheckboxItem>) {\n return (\n <MenubarPrimitive.CheckboxItem\n data-slot=\"menubar-checkbox-item\"\n className={cn(\n \"relative flex cursor-default items-center gap-2 rounded-xs py-1.5 pr-2 pl-8 text-sm outline-hidden select-none focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\n className,\n )}\n checked={checked}\n {...props}\n >\n <span className=\"pointer-events-none absolute left-2 flex size-3.5 items-center justify-center\">\n <MenubarPrimitive.ItemIndicator>\n <CheckIcon className=\"size-4\" />\n </MenubarPrimitive.ItemIndicator>\n </span>\n {children}\n </MenubarPrimitive.CheckboxItem>\n );\n}\n\n/** A menu item with a radio dot indicator; use inside a `MenubarRadioGroup`. */\nfunction MenubarRadioItem({\n className,\n children,\n ...props\n}: React.ComponentProps<typeof MenubarPrimitive.RadioItem>) {\n return (\n <MenubarPrimitive.RadioItem\n data-slot=\"menubar-radio-item\"\n className={cn(\n \"relative flex cursor-default items-center gap-2 rounded-xs py-1.5 pr-2 pl-8 text-sm outline-hidden select-none focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\n className,\n )}\n {...props}\n >\n <span className=\"pointer-events-none absolute left-2 flex size-3.5 items-center justify-center\">\n <MenubarPrimitive.ItemIndicator>\n <CircleIcon className=\"size-2 fill-current\" />\n </MenubarPrimitive.ItemIndicator>\n </span>\n {children}\n </MenubarPrimitive.RadioItem>\n );\n}\n\n/** A non-interactive heading that titles a group of menu items. */\nfunction MenubarLabel({\n className,\n inset,\n ...props\n}: React.ComponentProps<typeof MenubarPrimitive.Label> & {\n /** Adds left padding to align the label with items that have leading icons/indicators. */\n inset?: boolean;\n}) {\n return (\n <MenubarPrimitive.Label\n data-slot=\"menubar-label\"\n data-inset={inset}\n className={cn(\"px-2 py-1.5 text-sm font-medium data-[inset]:pl-8\", className)}\n {...props}\n />\n );\n}\n\n/** A thin divider line between groups of menu items. */\nfunction MenubarSeparator({\n className,\n ...props\n}: React.ComponentProps<typeof MenubarPrimitive.Separator>) {\n return (\n <MenubarPrimitive.Separator\n data-slot=\"menubar-separator\"\n className={cn(\"-mx-1 my-1 h-px bg-border\", className)}\n {...props}\n />\n );\n}\n\n/** Right-aligned hint text for an item's keyboard shortcut (e.g. ⌘T). */\nfunction MenubarShortcut({ className, ...props }: React.ComponentProps<\"span\">) {\n return (\n <span\n data-slot=\"menubar-shortcut\"\n className={cn(\"ml-auto text-xs tracking-widest text-muted-foreground\", className)}\n {...props}\n />\n );\n}\n\n/** Wraps a nested submenu (its trigger and content). */\nfunction MenubarSub({ ...props }: React.ComponentProps<typeof MenubarPrimitive.Sub>) {\n return <MenubarPrimitive.Sub data-slot=\"menubar-sub\" {...props} />;\n}\n\n/** An item that opens a nested submenu; shows a trailing chevron. */\nfunction MenubarSubTrigger({\n className,\n inset,\n children,\n ...props\n}: React.ComponentProps<typeof MenubarPrimitive.SubTrigger> & {\n /** Adds left padding to align the label with items that have leading icons/indicators. */\n inset?: boolean;\n}) {\n return (\n <MenubarPrimitive.SubTrigger\n data-slot=\"menubar-sub-trigger\"\n data-inset={inset}\n className={cn(\n \"flex cursor-default items-center rounded-sm px-2 py-1.5 text-sm outline-none select-none focus:bg-accent focus:text-accent-foreground data-[inset]:pl-8 data-[state=open]:bg-accent data-[state=open]:text-accent-foreground\",\n className,\n )}\n {...props}\n >\n {children}\n <ChevronRightIcon className=\"ml-auto h-4 w-4\" />\n </MenubarPrimitive.SubTrigger>\n );\n}\n\n/** The dropdown surface for a nested submenu's items. */\nfunction MenubarSubContent({\n className,\n ...props\n}: React.ComponentProps<typeof MenubarPrimitive.SubContent>) {\n return (\n <MenubarPrimitive.SubContent\n data-slot=\"menubar-sub-content\"\n className={cn(\n \"z-50 min-w-[8rem] origin-(--radix-menubar-content-transform-origin) overflow-hidden rounded-md border bg-popover p-1 text-popover-foreground shadow-lg 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 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[state=open]:animate-in data-[state=open]:fade-in-0 data-[state=open]:zoom-in-95\",\n className,\n )}\n {...props}\n />\n );\n}\n\nexport {\n Menubar,\n MenubarPortal,\n MenubarMenu,\n MenubarTrigger,\n MenubarContent,\n MenubarGroup,\n MenubarSeparator,\n MenubarLabel,\n MenubarItem,\n MenubarShortcut,\n MenubarCheckboxItem,\n MenubarRadioGroup,\n MenubarRadioItem,\n MenubarSub,\n MenubarSubTrigger,\n MenubarSubContent,\n};\n"],"mappings":"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"}
|
|
@@ -3,7 +3,7 @@ const require_cn = require("../../cn.cjs");
|
|
|
3
3
|
let lucide_react = require("lucide-react");
|
|
4
4
|
let react_jsx_runtime = require("react/jsx-runtime");
|
|
5
5
|
//#region src/primitives/NativeSelect/NativeSelect.tsx
|
|
6
|
-
const nativeSelectVariants = (0, require("class-variance-authority").cva)(require_cn.cn("border-input bg-input-background
|
|
6
|
+
const nativeSelectVariants = (0, require("class-variance-authority").cva)(require_cn.cn("border-input bg-input-background flex w-full min-w-0 appearance-none rounded-md border text-foreground transition-[color,box-shadow] outline-none", "focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px]", "aria-invalid:ring-ring-error aria-invalid:border-destructive", "disabled:pointer-events-none disabled:cursor-not-allowed disabled:opacity-50"), {
|
|
7
7
|
variants: {
|
|
8
8
|
/** Control height + horizontal padding; matches the Input size scale. */
|
|
9
9
|
size: {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","names":["cn","ChevronDownIcon"],"sources":["../../../src/primitives/NativeSelect/NativeSelect.tsx"],"sourcesContent":["import { type VariantProps, cva } from \"class-variance-authority\";\nimport { ChevronDownIcon } from \"lucide-react\";\nimport type * as React from \"react\";\n\nimport { cn } from \"@/utils\";\n\n// A styled native <select> — lighter than the Radix Select, better for long\n// option lists and native mobile behavior. Visuals mirror Input (border,\n// focus ring, aria-invalid, disabled) and share its size scale.\nconst nativeSelectVariants = cva(\n cn(\n \"border-input bg-input-background
|
|
1
|
+
{"version":3,"file":"index.cjs","names":["cn","ChevronDownIcon"],"sources":["../../../src/primitives/NativeSelect/NativeSelect.tsx"],"sourcesContent":["import { type VariantProps, cva } from \"class-variance-authority\";\nimport { ChevronDownIcon } from \"lucide-react\";\nimport type * as React from \"react\";\n\nimport { cn } from \"@/utils\";\n\n// A styled native <select> — lighter than the Radix Select, better for long\n// option lists and native mobile behavior. Visuals mirror Input (border,\n// focus ring, aria-invalid, disabled) and share its size scale.\nconst nativeSelectVariants = cva(\n cn(\n \"border-input bg-input-background flex w-full min-w-0 appearance-none rounded-md border text-foreground transition-[color,box-shadow] outline-none\",\n \"focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px]\",\n \"aria-invalid:ring-ring-error aria-invalid:border-destructive\",\n \"disabled:pointer-events-none disabled:cursor-not-allowed disabled:opacity-50\",\n ),\n {\n variants: {\n /** Control height + horizontal padding; matches the Input size scale. */\n size: {\n xs: \"h-6 pl-2 pr-7 text-xs\",\n sm: \"h-8 pl-2.5 pr-8 text-sm\",\n default: \"h-9 pl-3 pr-8 text-base md:text-sm\",\n lg: \"h-10 pl-4 pr-9 text-base\",\n },\n },\n defaultVariants: {\n size: \"default\",\n },\n },\n);\n\n/**\n * A styled native `<select>` with a chevron affordance. Mirrors Input visuals\n * and shares its size scale; pass `<option>`/`<optgroup>` as children.\n */\nfunction NativeSelect({\n className,\n size = \"default\",\n children,\n ...props\n}: Omit<React.ComponentProps<\"select\">, \"size\"> & VariantProps<typeof nativeSelectVariants>) {\n return (\n // The wrapper carries layout/width; the chevron is anchored to its right edge.\n <div className={cn(\"relative w-full\", className)} data-slot=\"native-select-wrapper\">\n <select data-slot=\"native-select\" className={cn(nativeSelectVariants({ size }))} {...props}>\n {children}\n </select>\n <ChevronDownIcon\n aria-hidden=\"true\"\n className=\"pointer-events-none absolute top-1/2 right-2.5 size-4 -translate-y-1/2 opacity-50\"\n />\n </div>\n );\n}\n\nexport { NativeSelect, nativeSelectVariants };\n"],"mappings":";;;;;AASA,MAAM,wBAAA,qCAAA,EAAA,KACJA,WAAAA,GACE,qJACA,iFACA,gEACA,8EACF,GACA;CACE,UAAU;;AAER,MAAM;EACJ,IAAI;EACJ,IAAI;EACJ,SAAS;EACT,IAAI;CACN,EACF;CACA,iBAAiB,EACf,MAAM,UACR;AACF,CACF;;;;;AAMA,SAAS,aAAa,EACpB,WACA,OAAO,WACP,UACA,GAAG,SACwF;CAC3F,OAEE,iBAAA,GAAA,kBAAA,MAAC,OAAD;EAAK,WAAWA,WAAAA,GAAG,mBAAmB,SAAS;EAAG,aAAU;YAA5D,CACE,iBAAA,GAAA,kBAAA,KAAC,UAAD;GAAQ,aAAU;GAAgB,WAAWA,WAAAA,GAAG,qBAAqB,EAAE,KAAK,CAAC,CAAC;GAAG,GAAI;GAClF;EACK,CAAA,GACR,iBAAA,GAAA,kBAAA,KAACC,aAAAA,iBAAD;GACE,eAAY;GACZ,WAAU;EACX,CAAA,CACE;;AAET"}
|
|
@@ -3,7 +3,7 @@ import { ChevronDownIcon } from "lucide-react";
|
|
|
3
3
|
import { jsx, jsxs } from "react/jsx-runtime";
|
|
4
4
|
import { cva } from "class-variance-authority";
|
|
5
5
|
//#region src/primitives/NativeSelect/NativeSelect.tsx
|
|
6
|
-
const nativeSelectVariants = cva(cn("border-input bg-input-background
|
|
6
|
+
const nativeSelectVariants = cva(cn("border-input bg-input-background flex w-full min-w-0 appearance-none rounded-md border text-foreground transition-[color,box-shadow] outline-none", "focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px]", "aria-invalid:ring-ring-error aria-invalid:border-destructive", "disabled:pointer-events-none disabled:cursor-not-allowed disabled:opacity-50"), {
|
|
7
7
|
variants: {
|
|
8
8
|
/** Control height + horizontal padding; matches the Input size scale. */
|
|
9
9
|
size: {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":[],"sources":["../../../src/primitives/NativeSelect/NativeSelect.tsx"],"sourcesContent":["import { type VariantProps, cva } from \"class-variance-authority\";\nimport { ChevronDownIcon } from \"lucide-react\";\nimport type * as React from \"react\";\n\nimport { cn } from \"@/utils\";\n\n// A styled native <select> — lighter than the Radix Select, better for long\n// option lists and native mobile behavior. Visuals mirror Input (border,\n// focus ring, aria-invalid, disabled) and share its size scale.\nconst nativeSelectVariants = cva(\n cn(\n \"border-input bg-input-background
|
|
1
|
+
{"version":3,"file":"index.js","names":[],"sources":["../../../src/primitives/NativeSelect/NativeSelect.tsx"],"sourcesContent":["import { type VariantProps, cva } from \"class-variance-authority\";\nimport { ChevronDownIcon } from \"lucide-react\";\nimport type * as React from \"react\";\n\nimport { cn } from \"@/utils\";\n\n// A styled native <select> — lighter than the Radix Select, better for long\n// option lists and native mobile behavior. Visuals mirror Input (border,\n// focus ring, aria-invalid, disabled) and share its size scale.\nconst nativeSelectVariants = cva(\n cn(\n \"border-input bg-input-background flex w-full min-w-0 appearance-none rounded-md border text-foreground transition-[color,box-shadow] outline-none\",\n \"focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px]\",\n \"aria-invalid:ring-ring-error aria-invalid:border-destructive\",\n \"disabled:pointer-events-none disabled:cursor-not-allowed disabled:opacity-50\",\n ),\n {\n variants: {\n /** Control height + horizontal padding; matches the Input size scale. */\n size: {\n xs: \"h-6 pl-2 pr-7 text-xs\",\n sm: \"h-8 pl-2.5 pr-8 text-sm\",\n default: \"h-9 pl-3 pr-8 text-base md:text-sm\",\n lg: \"h-10 pl-4 pr-9 text-base\",\n },\n },\n defaultVariants: {\n size: \"default\",\n },\n },\n);\n\n/**\n * A styled native `<select>` with a chevron affordance. Mirrors Input visuals\n * and shares its size scale; pass `<option>`/`<optgroup>` as children.\n */\nfunction NativeSelect({\n className,\n size = \"default\",\n children,\n ...props\n}: Omit<React.ComponentProps<\"select\">, \"size\"> & VariantProps<typeof nativeSelectVariants>) {\n return (\n // The wrapper carries layout/width; the chevron is anchored to its right edge.\n <div className={cn(\"relative w-full\", className)} data-slot=\"native-select-wrapper\">\n <select data-slot=\"native-select\" className={cn(nativeSelectVariants({ size }))} {...props}>\n {children}\n </select>\n <ChevronDownIcon\n aria-hidden=\"true\"\n className=\"pointer-events-none absolute top-1/2 right-2.5 size-4 -translate-y-1/2 opacity-50\"\n />\n </div>\n );\n}\n\nexport { NativeSelect, nativeSelectVariants };\n"],"mappings":";;;;;AASA,MAAM,uBAAuB,IAC3B,GACE,qJACA,iFACA,gEACA,8EACF,GACA;CACE,UAAU;;AAER,MAAM;EACJ,IAAI;EACJ,IAAI;EACJ,SAAS;EACT,IAAI;CACN,EACF;CACA,iBAAiB,EACf,MAAM,UACR;AACF,CACF;;;;;AAMA,SAAS,aAAa,EACpB,WACA,OAAO,WACP,UACA,GAAG,SACwF;CAC3F,OAEE,qBAAC,OAAD;EAAK,WAAW,GAAG,mBAAmB,SAAS;EAAG,aAAU;YAA5D,CACE,oBAAC,UAAD;GAAQ,aAAU;GAAgB,WAAW,GAAG,qBAAqB,EAAE,KAAK,CAAC,CAAC;GAAG,GAAI;GAClF;EACK,CAAA,GACR,oBAAC,iBAAD;GACE,eAAY;GACZ,WAAU;EACX,CAAA,CACE;;AAET"}
|
|
@@ -49,7 +49,7 @@ function NavRail({ mode = "icon", className, ...props }) {
|
|
|
49
49
|
children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("nav", {
|
|
50
50
|
"data-slot": "nav-rail",
|
|
51
51
|
"data-mode": mode,
|
|
52
|
-
className: require_cn.cn("group/nav-rail flex flex-col gap-1 overflow-hidden rounded-2xl bg-[var(--glass-strong)] p-2 backdrop-blur-
|
|
52
|
+
className: require_cn.cn("group/nav-rail flex flex-col gap-1 overflow-hidden rounded-2xl bg-[var(--glass-strong)] p-2 backdrop-blur-glass", RAIL_BY_MODE[mode], className),
|
|
53
53
|
...props
|
|
54
54
|
})
|
|
55
55
|
});
|
|
@@ -167,7 +167,7 @@ function NavRailMenuContent({ className, side = "right", align = "start", sideOf
|
|
|
167
167
|
side,
|
|
168
168
|
align,
|
|
169
169
|
sideOffset,
|
|
170
|
-
className: require_cn.cn("flex w-[180px] flex-col gap-0.5 rounded-2xl border border-border bg-[var(--glass-subtle)] p-1.5 text-foreground shadow-sm backdrop-blur-
|
|
170
|
+
className: require_cn.cn("flex w-[180px] flex-col gap-0.5 rounded-2xl border border-border bg-[var(--glass-subtle)] p-1.5 text-foreground shadow-sm backdrop-blur-glass", className),
|
|
171
171
|
...props
|
|
172
172
|
});
|
|
173
173
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","names":["React","cn","Slot","Tooltip","TooltipTrigger","TooltipContent","Popover","PopoverTrigger","ChevronRightIcon","PopoverContent"],"sources":["../../../src/primitives/NavRail/NavRail.tsx"],"sourcesContent":["import { ChevronRightIcon } from \"lucide-react\";\nimport { Slot } from \"radix-ui\";\nimport * as React from \"react\";\n\nimport { Popover, PopoverContent, PopoverTrigger } from \"@/primitives/Popover\";\nimport { Tooltip, TooltipContent, TooltipTrigger } from \"@/primitives/Tooltip\";\nimport { cn } from \"@/utils\";\n\n// NavRail — a vertical navigation rail (the app's side nav). Four display modes:\n// icon-only (tooltips), text-only, expanded (icon + text), and expand-on-hover\n// (icon-only that widens to reveal labels on hover). Items can open a flyout\n// submenu (NavRailMenu) and the rail can show a user footer (NavRailUser).\n//\n// All items share a constant height (h-10) with the icon pinned to the left, so\n// expanding the rail just REVEALS the labels to the right — the icon never moves\n// and the row height never changes.\n//\n// LAYOUT NOTE: `expand-on-hover` changes the rail's width. To make the content\n// give up space as the rail expands (rather than overlap it), put the rail in a\n// flex row as a `shrink-0` child (it keeps its own w-14/w-56 width) next to a\n// `flex-1 min-w-0` content column — the column shrinks as the rail widens.\n\ntype NavRailMode = \"icon\" | \"text\" | \"expanded\" | \"expand-on-hover\";\n\nconst NavRailContext = React.createContext<NavRailMode>(\"icon\");\n\nconst RAIL_BY_MODE: Record<NavRailMode, string> = {\n icon: \"w-14 items-center\",\n text: \"w-56 items-stretch\",\n expanded: \"w-56 items-stretch\",\n \"expand-on-hover\": \"w-14 items-stretch transition-[width] duration-200 ease-out hover:w-56\",\n};\n\nconst ITEM_BASE =\n \"relative flex h-10 cursor-pointer items-center text-foreground outline-none transition-colors hover:bg-foreground/10 focus-visible:ring-[3px] focus-visible:ring-ring/50 disabled:pointer-events-none disabled:opacity-50 data-[active=true]:bg-[var(--white)] data-[active=true]:font-medium data-[active=true]:text-[var(--brand-colors-brand-500)] data-[active=true]:hover:bg-[var(--white)] [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-5\";\n\nconst ITEM_BY_MODE: Record<NavRailMode, string> = {\n icon: \"w-10 justify-center rounded-full\",\n text: \"w-full justify-start gap-3 rounded-lg px-2.5\",\n expanded: \"w-full justify-start gap-3 rounded-lg px-2.5\",\n \"expand-on-hover\": \"w-full justify-start gap-3 rounded-lg px-2.5\",\n};\n\nconst ICON_BY_MODE: Record<NavRailMode, string> = {\n icon: \"flex shrink-0 items-center justify-center\",\n text: \"hidden\", // text-only mode hides the icon\n expanded: \"flex shrink-0 items-center justify-center\",\n \"expand-on-hover\": \"flex shrink-0 items-center justify-center\",\n};\n\nconst LABEL_ROW = \"min-w-0 flex-1 truncate text-left text-sm font-medium\";\nconst LABEL_BY_MODE: Record<NavRailMode, string> = {\n icon: \"sr-only\",\n text: LABEL_ROW,\n expanded: LABEL_ROW,\n // Always laid out (so the icon never reflows); revealed via opacity on hover.\n \"expand-on-hover\": cn(\n LABEL_ROW,\n \"opacity-0 transition-opacity duration-200 group-hover/nav-rail:opacity-100\",\n ),\n};\n\nconst CHEVRON_BY_MODE: Record<NavRailMode, string> = {\n // Vertically centered, overhanging the right edge (clear of the centered icon).\n icon: \"absolute top-1/2 right-[-4px] size-3 -translate-y-1/2 text-muted-foreground\",\n text: \"ml-auto size-4 shrink-0 text-muted-foreground\",\n expanded: \"ml-auto size-4 shrink-0 text-muted-foreground\",\n \"expand-on-hover\":\n \"ml-auto size-4 shrink-0 text-muted-foreground opacity-0 transition-opacity duration-200 group-hover/nav-rail:opacity-100\",\n};\n\n/** The vertical navigation rail container; sets the display `mode` for all items via context. */\nfunction NavRail({\n mode = \"icon\",\n className,\n ...props\n}: React.ComponentProps<\"nav\"> & {\n /** Display mode for the rail and its items: icon-only (tooltips), text-only, expanded (icon + text), or expand-on-hover. */\n mode?: NavRailMode;\n}) {\n return (\n <NavRailContext.Provider value={mode}>\n <nav\n data-slot=\"nav-rail\"\n data-mode={mode}\n className={cn(\n \"group/nav-rail flex flex-col gap-1 overflow-hidden rounded-2xl bg-[var(--glass-strong)] p-2 backdrop-blur-[var(--glass-blur)]\",\n RAIL_BY_MODE[mode],\n className,\n )}\n {...props}\n />\n </NavRailContext.Provider>\n );\n}\n\n/** A thin divider between groups of rail items. */\nfunction NavRailSeparator({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"nav-rail-separator\"\n role=\"separator\"\n className={cn(\"my-1 h-px w-6 shrink-0 self-center bg-border\", className)}\n {...props}\n />\n );\n}\n\ntype NavRailItemProps = Omit<React.ComponentProps<\"button\">, \"aria-label\"> & {\n /** Tooltip text (icon mode) + accessible name + inline label (text/expanded). */\n label: string;\n /** Marks the item as the current page (active styling + `aria-current=\"page\"`). */\n active?: boolean;\n /** Render the child element instead of a <button> (e.g. a router link). */\n asChild?: boolean;\n /** Which side the tooltip opens on in icon mode. */\n tooltipSide?: \"top\" | \"right\" | \"bottom\" | \"left\";\n};\n\n/** A single navigation entry; an icon (as children) plus a `label`, with a tooltip in icon mode. */\nfunction NavRailItem({\n label,\n active,\n asChild = false,\n tooltipSide = \"right\",\n className,\n children,\n ...props\n}: NavRailItemProps) {\n const mode = React.useContext(NavRailContext);\n const shared = {\n \"data-slot\": \"nav-rail-item\",\n \"data-active\": active || undefined,\n \"aria-label\": label,\n \"aria-current\": active ? (\"page\" as const) : undefined,\n className: cn(ITEM_BASE, ITEM_BY_MODE[mode], className),\n ...props,\n };\n const labelEl = (\n <span data-slot=\"nav-rail-item-label\" className={LABEL_BY_MODE[mode]}>\n {label}\n </span>\n );\n\n const el = asChild ? (\n <Slot.Root {...shared}>\n <Slot.Slottable>{children}</Slot.Slottable>\n {labelEl}\n </Slot.Root>\n ) : (\n <button type=\"button\" {...shared}>\n <span data-slot=\"nav-rail-item-icon\" className={ICON_BY_MODE[mode]}>\n {children}\n </span>\n {labelEl}\n </button>\n );\n\n if (mode !== \"icon\") return el;\n return (\n <Tooltip>\n <TooltipTrigger asChild>{el}</TooltipTrigger>\n <TooltipContent side={tooltipSide}>{label}</TooltipContent>\n </Tooltip>\n );\n}\n\n// ── User footer ─────────────────────────────────────────────────────────────\n\ntype NavRailUserProps = React.ComponentProps<\"div\"> & {\n /** The avatar element (e.g. an <Avatar />). */\n avatar: React.ReactNode;\n /** The user's display name (hidden in icon mode). */\n name: React.ReactNode;\n /** The user's secondary line, e.g. email (hidden in icon mode). */\n email: React.ReactNode;\n};\n\n/** The footer slot of the rail showing the signed-in user (avatar + name + email). */\nfunction NavRailUser({ avatar, name, email, className, ...props }: NavRailUserProps) {\n const mode = React.useContext(NavRailContext);\n const detailsHidden = mode === \"icon\";\n return (\n <div\n data-slot=\"nav-rail-user\"\n className={cn(\"mt-auto flex h-12 w-full items-center rounded-lg\", className)}\n {...props}\n >\n {/* Fixed w-10 slot centers any avatar on the same axis as the icon column,\n so it never shifts between modes regardless of avatar size. */}\n <span\n data-slot=\"nav-rail-user-avatar\"\n className=\"flex w-10 shrink-0 items-center justify-center\"\n >\n {avatar}\n </span>\n <div\n data-slot=\"nav-rail-user-details\"\n className={cn(\n \"flex min-w-0 flex-1 flex-col justify-center text-left leading-tight\",\n detailsHidden && \"sr-only\",\n mode === \"expand-on-hover\" &&\n \"opacity-0 transition-opacity duration-200 group-hover/nav-rail:opacity-100\",\n )}\n >\n <span className=\"truncate text-sm font-medium\">{name}</span>\n <span className=\"truncate text-xs text-muted-foreground\">{email}</span>\n </div>\n </div>\n );\n}\n\n// ── Flyout submenu ──────────────────────────────────────────────────────────\n\n/** Root for a rail item that opens a flyout submenu (wraps Popover). */\nfunction NavRailMenu(props: React.ComponentProps<typeof Popover>) {\n return <Popover {...props} />;\n}\n\ntype NavRailMenuTriggerProps = Omit<React.ComponentProps<\"button\">, \"aria-label\"> & {\n /** Tooltip/accessible name + inline label for the trigger item. */\n label: string;\n /** Marks the trigger as active (current section) styling. */\n active?: boolean;\n};\n\n/** The rail item that opens its flyout submenu; renders a chevron affordance. */\nfunction NavRailMenuTrigger({\n label,\n active,\n className,\n children,\n ...props\n}: NavRailMenuTriggerProps) {\n const mode = React.useContext(NavRailContext);\n return (\n <PopoverTrigger asChild>\n <button\n type=\"button\"\n data-slot=\"nav-rail-menu-trigger\"\n data-active={active || undefined}\n aria-label={label}\n className={cn(ITEM_BASE, ITEM_BY_MODE[mode], className)}\n {...props}\n >\n <span data-slot=\"nav-rail-item-icon\" className={ICON_BY_MODE[mode]}>\n {children}\n </span>\n <span data-slot=\"nav-rail-item-label\" className={LABEL_BY_MODE[mode]}>\n {label}\n </span>\n <ChevronRightIcon aria-hidden className={CHEVRON_BY_MODE[mode]} />\n </button>\n </PopoverTrigger>\n );\n}\n\n/** The glass flyout panel that holds the submenu items (portalled Popover content). */\nfunction NavRailMenuContent({\n className,\n side = \"right\",\n align = \"start\",\n sideOffset = 8,\n ...props\n}: React.ComponentProps<typeof PopoverContent>) {\n return (\n <PopoverContent\n data-slot=\"nav-rail-menu-content\"\n side={side}\n align={align}\n sideOffset={sideOffset}\n // Glass flyout (matches the prototype sub-nav): translucent + blurred,\n // 16px radius, hairline border, soft shadow. Tokens, not prototype code.\n className={cn(\n \"flex w-[180px] flex-col gap-0.5 rounded-2xl border border-border bg-[var(--glass-subtle)] p-1.5 text-foreground shadow-sm backdrop-blur-[var(--glass-blur)]\",\n className,\n )}\n {...props}\n />\n );\n}\n\ntype NavRailMenuItemProps = React.ComponentProps<\"button\"> & {\n /** Marks the entry as the current page (active styling + `aria-current=\"page\"`). */\n active?: boolean;\n /** Render the child element instead of a <button> (e.g. a router link). */\n asChild?: boolean;\n};\n\n/** A single entry inside a NavRail flyout submenu. */\nfunction NavRailMenuItem({ className, active, asChild = false, ...props }: NavRailMenuItemProps) {\n const Comp = asChild ? Slot.Root : \"button\";\n return (\n <Comp\n data-slot=\"nav-rail-menu-item\"\n data-active={active || undefined}\n aria-current={active ? \"page\" : undefined}\n className={cn(\n \"flex w-full cursor-pointer items-center gap-2.5 rounded-lg px-3 py-2 text-left text-sm text-foreground outline-none transition-colors\",\n \"hover:bg-foreground/10 focus-visible:bg-foreground/10\",\n \"data-[active=true]:bg-[var(--white)] data-[active=true]:font-medium data-[active=true]:text-[var(--brand-colors-brand-500)] data-[active=true]:hover:bg-[var(--white)]\",\n \"[&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\n className,\n )}\n {...(asChild ? {} : { type: \"button\" as const })}\n {...props}\n />\n );\n}\n\nexport {\n NavRail,\n NavRailItem,\n NavRailUser,\n NavRailSeparator,\n NavRailMenu,\n NavRailMenuTrigger,\n NavRailMenuContent,\n NavRailMenuItem,\n type NavRailMode,\n type NavRailItemProps,\n type NavRailUserProps,\n type NavRailMenuTriggerProps,\n type NavRailMenuItemProps,\n};\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.cjs","names":["React","cn","Slot","Tooltip","TooltipTrigger","TooltipContent","Popover","PopoverTrigger","ChevronRightIcon","PopoverContent"],"sources":["../../../src/primitives/NavRail/NavRail.tsx"],"sourcesContent":["import { ChevronRightIcon } from \"lucide-react\";\nimport { Slot } from \"radix-ui\";\nimport * as React from \"react\";\n\nimport { Popover, PopoverContent, PopoverTrigger } from \"@/primitives/Popover\";\nimport { Tooltip, TooltipContent, TooltipTrigger } from \"@/primitives/Tooltip\";\nimport { cn } from \"@/utils\";\n\n// NavRail — a vertical navigation rail (the app's side nav). Four display modes:\n// icon-only (tooltips), text-only, expanded (icon + text), and expand-on-hover\n// (icon-only that widens to reveal labels on hover). Items can open a flyout\n// submenu (NavRailMenu) and the rail can show a user footer (NavRailUser).\n//\n// All items share a constant height (h-10) with the icon pinned to the left, so\n// expanding the rail just REVEALS the labels to the right — the icon never moves\n// and the row height never changes.\n//\n// LAYOUT NOTE: `expand-on-hover` changes the rail's width. To make the content\n// give up space as the rail expands (rather than overlap it), put the rail in a\n// flex row as a `shrink-0` child (it keeps its own w-14/w-56 width) next to a\n// `flex-1 min-w-0` content column — the column shrinks as the rail widens.\n\ntype NavRailMode = \"icon\" | \"text\" | \"expanded\" | \"expand-on-hover\";\n\nconst NavRailContext = React.createContext<NavRailMode>(\"icon\");\n\nconst RAIL_BY_MODE: Record<NavRailMode, string> = {\n icon: \"w-14 items-center\",\n text: \"w-56 items-stretch\",\n expanded: \"w-56 items-stretch\",\n \"expand-on-hover\": \"w-14 items-stretch transition-[width] duration-200 ease-out hover:w-56\",\n};\n\nconst ITEM_BASE =\n \"relative flex h-10 cursor-pointer items-center text-foreground outline-none transition-colors hover:bg-foreground/10 focus-visible:ring-[3px] focus-visible:ring-ring/50 disabled:pointer-events-none disabled:opacity-50 data-[active=true]:bg-[var(--white)] data-[active=true]:font-medium data-[active=true]:text-[var(--brand-colors-brand-500)] data-[active=true]:hover:bg-[var(--white)] [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-5\";\n\nconst ITEM_BY_MODE: Record<NavRailMode, string> = {\n icon: \"w-10 justify-center rounded-full\",\n text: \"w-full justify-start gap-3 rounded-lg px-2.5\",\n expanded: \"w-full justify-start gap-3 rounded-lg px-2.5\",\n \"expand-on-hover\": \"w-full justify-start gap-3 rounded-lg px-2.5\",\n};\n\nconst ICON_BY_MODE: Record<NavRailMode, string> = {\n icon: \"flex shrink-0 items-center justify-center\",\n text: \"hidden\", // text-only mode hides the icon\n expanded: \"flex shrink-0 items-center justify-center\",\n \"expand-on-hover\": \"flex shrink-0 items-center justify-center\",\n};\n\nconst LABEL_ROW = \"min-w-0 flex-1 truncate text-left text-sm font-medium\";\nconst LABEL_BY_MODE: Record<NavRailMode, string> = {\n icon: \"sr-only\",\n text: LABEL_ROW,\n expanded: LABEL_ROW,\n // Always laid out (so the icon never reflows); revealed via opacity on hover.\n \"expand-on-hover\": cn(\n LABEL_ROW,\n \"opacity-0 transition-opacity duration-200 group-hover/nav-rail:opacity-100\",\n ),\n};\n\nconst CHEVRON_BY_MODE: Record<NavRailMode, string> = {\n // Vertically centered, overhanging the right edge (clear of the centered icon).\n icon: \"absolute top-1/2 right-[-4px] size-3 -translate-y-1/2 text-muted-foreground\",\n text: \"ml-auto size-4 shrink-0 text-muted-foreground\",\n expanded: \"ml-auto size-4 shrink-0 text-muted-foreground\",\n \"expand-on-hover\":\n \"ml-auto size-4 shrink-0 text-muted-foreground opacity-0 transition-opacity duration-200 group-hover/nav-rail:opacity-100\",\n};\n\n/** The vertical navigation rail container; sets the display `mode` for all items via context. */\nfunction NavRail({\n mode = \"icon\",\n className,\n ...props\n}: React.ComponentProps<\"nav\"> & {\n /** Display mode for the rail and its items: icon-only (tooltips), text-only, expanded (icon + text), or expand-on-hover. */\n mode?: NavRailMode;\n}) {\n return (\n <NavRailContext.Provider value={mode}>\n <nav\n data-slot=\"nav-rail\"\n data-mode={mode}\n className={cn(\n \"group/nav-rail flex flex-col gap-1 overflow-hidden rounded-2xl bg-[var(--glass-strong)] p-2 backdrop-blur-glass\",\n RAIL_BY_MODE[mode],\n className,\n )}\n {...props}\n />\n </NavRailContext.Provider>\n );\n}\n\n/** A thin divider between groups of rail items. */\nfunction NavRailSeparator({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"nav-rail-separator\"\n role=\"separator\"\n className={cn(\"my-1 h-px w-6 shrink-0 self-center bg-border\", className)}\n {...props}\n />\n );\n}\n\ntype NavRailItemProps = Omit<React.ComponentProps<\"button\">, \"aria-label\"> & {\n /** Tooltip text (icon mode) + accessible name + inline label (text/expanded). */\n label: string;\n /** Marks the item as the current page (active styling + `aria-current=\"page\"`). */\n active?: boolean;\n /** Render the child element instead of a <button> (e.g. a router link). */\n asChild?: boolean;\n /** Which side the tooltip opens on in icon mode. */\n tooltipSide?: \"top\" | \"right\" | \"bottom\" | \"left\";\n};\n\n/** A single navigation entry; an icon (as children) plus a `label`, with a tooltip in icon mode. */\nfunction NavRailItem({\n label,\n active,\n asChild = false,\n tooltipSide = \"right\",\n className,\n children,\n ...props\n}: NavRailItemProps) {\n const mode = React.useContext(NavRailContext);\n const shared = {\n \"data-slot\": \"nav-rail-item\",\n \"data-active\": active || undefined,\n \"aria-label\": label,\n \"aria-current\": active ? (\"page\" as const) : undefined,\n className: cn(ITEM_BASE, ITEM_BY_MODE[mode], className),\n ...props,\n };\n const labelEl = (\n <span data-slot=\"nav-rail-item-label\" className={LABEL_BY_MODE[mode]}>\n {label}\n </span>\n );\n\n const el = asChild ? (\n <Slot.Root {...shared}>\n <Slot.Slottable>{children}</Slot.Slottable>\n {labelEl}\n </Slot.Root>\n ) : (\n <button type=\"button\" {...shared}>\n <span data-slot=\"nav-rail-item-icon\" className={ICON_BY_MODE[mode]}>\n {children}\n </span>\n {labelEl}\n </button>\n );\n\n if (mode !== \"icon\") return el;\n return (\n <Tooltip>\n <TooltipTrigger asChild>{el}</TooltipTrigger>\n <TooltipContent side={tooltipSide}>{label}</TooltipContent>\n </Tooltip>\n );\n}\n\n// ── User footer ─────────────────────────────────────────────────────────────\n\ntype NavRailUserProps = React.ComponentProps<\"div\"> & {\n /** The avatar element (e.g. an <Avatar />). */\n avatar: React.ReactNode;\n /** The user's display name (hidden in icon mode). */\n name: React.ReactNode;\n /** The user's secondary line, e.g. email (hidden in icon mode). */\n email: React.ReactNode;\n};\n\n/** The footer slot of the rail showing the signed-in user (avatar + name + email). */\nfunction NavRailUser({ avatar, name, email, className, ...props }: NavRailUserProps) {\n const mode = React.useContext(NavRailContext);\n const detailsHidden = mode === \"icon\";\n return (\n <div\n data-slot=\"nav-rail-user\"\n className={cn(\"mt-auto flex h-12 w-full items-center rounded-lg\", className)}\n {...props}\n >\n {/* Fixed w-10 slot centers any avatar on the same axis as the icon column,\n so it never shifts between modes regardless of avatar size. */}\n <span\n data-slot=\"nav-rail-user-avatar\"\n className=\"flex w-10 shrink-0 items-center justify-center\"\n >\n {avatar}\n </span>\n <div\n data-slot=\"nav-rail-user-details\"\n className={cn(\n \"flex min-w-0 flex-1 flex-col justify-center text-left leading-tight\",\n detailsHidden && \"sr-only\",\n mode === \"expand-on-hover\" &&\n \"opacity-0 transition-opacity duration-200 group-hover/nav-rail:opacity-100\",\n )}\n >\n <span className=\"truncate text-sm font-medium\">{name}</span>\n <span className=\"truncate text-xs text-muted-foreground\">{email}</span>\n </div>\n </div>\n );\n}\n\n// ── Flyout submenu ──────────────────────────────────────────────────────────\n\n/** Root for a rail item that opens a flyout submenu (wraps Popover). */\nfunction NavRailMenu(props: React.ComponentProps<typeof Popover>) {\n return <Popover {...props} />;\n}\n\ntype NavRailMenuTriggerProps = Omit<React.ComponentProps<\"button\">, \"aria-label\"> & {\n /** Tooltip/accessible name + inline label for the trigger item. */\n label: string;\n /** Marks the trigger as active (current section) styling. */\n active?: boolean;\n};\n\n/** The rail item that opens its flyout submenu; renders a chevron affordance. */\nfunction NavRailMenuTrigger({\n label,\n active,\n className,\n children,\n ...props\n}: NavRailMenuTriggerProps) {\n const mode = React.useContext(NavRailContext);\n return (\n <PopoverTrigger asChild>\n <button\n type=\"button\"\n data-slot=\"nav-rail-menu-trigger\"\n data-active={active || undefined}\n aria-label={label}\n className={cn(ITEM_BASE, ITEM_BY_MODE[mode], className)}\n {...props}\n >\n <span data-slot=\"nav-rail-item-icon\" className={ICON_BY_MODE[mode]}>\n {children}\n </span>\n <span data-slot=\"nav-rail-item-label\" className={LABEL_BY_MODE[mode]}>\n {label}\n </span>\n <ChevronRightIcon aria-hidden className={CHEVRON_BY_MODE[mode]} />\n </button>\n </PopoverTrigger>\n );\n}\n\n/** The glass flyout panel that holds the submenu items (portalled Popover content). */\nfunction NavRailMenuContent({\n className,\n side = \"right\",\n align = \"start\",\n sideOffset = 8,\n ...props\n}: React.ComponentProps<typeof PopoverContent>) {\n return (\n <PopoverContent\n data-slot=\"nav-rail-menu-content\"\n side={side}\n align={align}\n sideOffset={sideOffset}\n // Glass flyout (matches the prototype sub-nav): translucent + blurred,\n // 16px radius, hairline border, soft shadow. Tokens, not prototype code.\n className={cn(\n \"flex w-[180px] flex-col gap-0.5 rounded-2xl border border-border bg-[var(--glass-subtle)] p-1.5 text-foreground shadow-sm backdrop-blur-glass\",\n className,\n )}\n {...props}\n />\n );\n}\n\ntype NavRailMenuItemProps = React.ComponentProps<\"button\"> & {\n /** Marks the entry as the current page (active styling + `aria-current=\"page\"`). */\n active?: boolean;\n /** Render the child element instead of a <button> (e.g. a router link). */\n asChild?: boolean;\n};\n\n/** A single entry inside a NavRail flyout submenu. */\nfunction NavRailMenuItem({ className, active, asChild = false, ...props }: NavRailMenuItemProps) {\n const Comp = asChild ? Slot.Root : \"button\";\n return (\n <Comp\n data-slot=\"nav-rail-menu-item\"\n data-active={active || undefined}\n aria-current={active ? \"page\" : undefined}\n className={cn(\n \"flex w-full cursor-pointer items-center gap-2.5 rounded-lg px-3 py-2 text-left text-sm text-foreground outline-none transition-colors\",\n \"hover:bg-foreground/10 focus-visible:bg-foreground/10\",\n \"data-[active=true]:bg-[var(--white)] data-[active=true]:font-medium data-[active=true]:text-[var(--brand-colors-brand-500)] data-[active=true]:hover:bg-[var(--white)]\",\n \"[&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\n className,\n )}\n {...(asChild ? {} : { type: \"button\" as const })}\n {...props}\n />\n );\n}\n\nexport {\n NavRail,\n NavRailItem,\n NavRailUser,\n NavRailSeparator,\n NavRailMenu,\n NavRailMenuTrigger,\n NavRailMenuContent,\n NavRailMenuItem,\n type NavRailMode,\n type NavRailItemProps,\n type NavRailUserProps,\n type NavRailMenuTriggerProps,\n type NavRailMenuItemProps,\n};\n"],"mappings":"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"}
|
|
@@ -46,7 +46,7 @@ function NavRail({ mode = "icon", className, ...props }) {
|
|
|
46
46
|
children: /* @__PURE__ */ jsx("nav", {
|
|
47
47
|
"data-slot": "nav-rail",
|
|
48
48
|
"data-mode": mode,
|
|
49
|
-
className: cn("group/nav-rail flex flex-col gap-1 overflow-hidden rounded-2xl bg-[var(--glass-strong)] p-2 backdrop-blur-
|
|
49
|
+
className: cn("group/nav-rail flex flex-col gap-1 overflow-hidden rounded-2xl bg-[var(--glass-strong)] p-2 backdrop-blur-glass", RAIL_BY_MODE[mode], className),
|
|
50
50
|
...props
|
|
51
51
|
})
|
|
52
52
|
});
|
|
@@ -164,7 +164,7 @@ function NavRailMenuContent({ className, side = "right", align = "start", sideOf
|
|
|
164
164
|
side,
|
|
165
165
|
align,
|
|
166
166
|
sideOffset,
|
|
167
|
-
className: cn("flex w-[180px] flex-col gap-0.5 rounded-2xl border border-border bg-[var(--glass-subtle)] p-1.5 text-foreground shadow-sm backdrop-blur-
|
|
167
|
+
className: cn("flex w-[180px] flex-col gap-0.5 rounded-2xl border border-border bg-[var(--glass-subtle)] p-1.5 text-foreground shadow-sm backdrop-blur-glass", className),
|
|
168
168
|
...props
|
|
169
169
|
});
|
|
170
170
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":["Tooltip","Popover"],"sources":["../../../src/primitives/NavRail/NavRail.tsx"],"sourcesContent":["import { ChevronRightIcon } from \"lucide-react\";\nimport { Slot } from \"radix-ui\";\nimport * as React from \"react\";\n\nimport { Popover, PopoverContent, PopoverTrigger } from \"@/primitives/Popover\";\nimport { Tooltip, TooltipContent, TooltipTrigger } from \"@/primitives/Tooltip\";\nimport { cn } from \"@/utils\";\n\n// NavRail — a vertical navigation rail (the app's side nav). Four display modes:\n// icon-only (tooltips), text-only, expanded (icon + text), and expand-on-hover\n// (icon-only that widens to reveal labels on hover). Items can open a flyout\n// submenu (NavRailMenu) and the rail can show a user footer (NavRailUser).\n//\n// All items share a constant height (h-10) with the icon pinned to the left, so\n// expanding the rail just REVEALS the labels to the right — the icon never moves\n// and the row height never changes.\n//\n// LAYOUT NOTE: `expand-on-hover` changes the rail's width. To make the content\n// give up space as the rail expands (rather than overlap it), put the rail in a\n// flex row as a `shrink-0` child (it keeps its own w-14/w-56 width) next to a\n// `flex-1 min-w-0` content column — the column shrinks as the rail widens.\n\ntype NavRailMode = \"icon\" | \"text\" | \"expanded\" | \"expand-on-hover\";\n\nconst NavRailContext = React.createContext<NavRailMode>(\"icon\");\n\nconst RAIL_BY_MODE: Record<NavRailMode, string> = {\n icon: \"w-14 items-center\",\n text: \"w-56 items-stretch\",\n expanded: \"w-56 items-stretch\",\n \"expand-on-hover\": \"w-14 items-stretch transition-[width] duration-200 ease-out hover:w-56\",\n};\n\nconst ITEM_BASE =\n \"relative flex h-10 cursor-pointer items-center text-foreground outline-none transition-colors hover:bg-foreground/10 focus-visible:ring-[3px] focus-visible:ring-ring/50 disabled:pointer-events-none disabled:opacity-50 data-[active=true]:bg-[var(--white)] data-[active=true]:font-medium data-[active=true]:text-[var(--brand-colors-brand-500)] data-[active=true]:hover:bg-[var(--white)] [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-5\";\n\nconst ITEM_BY_MODE: Record<NavRailMode, string> = {\n icon: \"w-10 justify-center rounded-full\",\n text: \"w-full justify-start gap-3 rounded-lg px-2.5\",\n expanded: \"w-full justify-start gap-3 rounded-lg px-2.5\",\n \"expand-on-hover\": \"w-full justify-start gap-3 rounded-lg px-2.5\",\n};\n\nconst ICON_BY_MODE: Record<NavRailMode, string> = {\n icon: \"flex shrink-0 items-center justify-center\",\n text: \"hidden\", // text-only mode hides the icon\n expanded: \"flex shrink-0 items-center justify-center\",\n \"expand-on-hover\": \"flex shrink-0 items-center justify-center\",\n};\n\nconst LABEL_ROW = \"min-w-0 flex-1 truncate text-left text-sm font-medium\";\nconst LABEL_BY_MODE: Record<NavRailMode, string> = {\n icon: \"sr-only\",\n text: LABEL_ROW,\n expanded: LABEL_ROW,\n // Always laid out (so the icon never reflows); revealed via opacity on hover.\n \"expand-on-hover\": cn(\n LABEL_ROW,\n \"opacity-0 transition-opacity duration-200 group-hover/nav-rail:opacity-100\",\n ),\n};\n\nconst CHEVRON_BY_MODE: Record<NavRailMode, string> = {\n // Vertically centered, overhanging the right edge (clear of the centered icon).\n icon: \"absolute top-1/2 right-[-4px] size-3 -translate-y-1/2 text-muted-foreground\",\n text: \"ml-auto size-4 shrink-0 text-muted-foreground\",\n expanded: \"ml-auto size-4 shrink-0 text-muted-foreground\",\n \"expand-on-hover\":\n \"ml-auto size-4 shrink-0 text-muted-foreground opacity-0 transition-opacity duration-200 group-hover/nav-rail:opacity-100\",\n};\n\n/** The vertical navigation rail container; sets the display `mode` for all items via context. */\nfunction NavRail({\n mode = \"icon\",\n className,\n ...props\n}: React.ComponentProps<\"nav\"> & {\n /** Display mode for the rail and its items: icon-only (tooltips), text-only, expanded (icon + text), or expand-on-hover. */\n mode?: NavRailMode;\n}) {\n return (\n <NavRailContext.Provider value={mode}>\n <nav\n data-slot=\"nav-rail\"\n data-mode={mode}\n className={cn(\n \"group/nav-rail flex flex-col gap-1 overflow-hidden rounded-2xl bg-[var(--glass-strong)] p-2 backdrop-blur-[var(--glass-blur)]\",\n RAIL_BY_MODE[mode],\n className,\n )}\n {...props}\n />\n </NavRailContext.Provider>\n );\n}\n\n/** A thin divider between groups of rail items. */\nfunction NavRailSeparator({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"nav-rail-separator\"\n role=\"separator\"\n className={cn(\"my-1 h-px w-6 shrink-0 self-center bg-border\", className)}\n {...props}\n />\n );\n}\n\ntype NavRailItemProps = Omit<React.ComponentProps<\"button\">, \"aria-label\"> & {\n /** Tooltip text (icon mode) + accessible name + inline label (text/expanded). */\n label: string;\n /** Marks the item as the current page (active styling + `aria-current=\"page\"`). */\n active?: boolean;\n /** Render the child element instead of a <button> (e.g. a router link). */\n asChild?: boolean;\n /** Which side the tooltip opens on in icon mode. */\n tooltipSide?: \"top\" | \"right\" | \"bottom\" | \"left\";\n};\n\n/** A single navigation entry; an icon (as children) plus a `label`, with a tooltip in icon mode. */\nfunction NavRailItem({\n label,\n active,\n asChild = false,\n tooltipSide = \"right\",\n className,\n children,\n ...props\n}: NavRailItemProps) {\n const mode = React.useContext(NavRailContext);\n const shared = {\n \"data-slot\": \"nav-rail-item\",\n \"data-active\": active || undefined,\n \"aria-label\": label,\n \"aria-current\": active ? (\"page\" as const) : undefined,\n className: cn(ITEM_BASE, ITEM_BY_MODE[mode], className),\n ...props,\n };\n const labelEl = (\n <span data-slot=\"nav-rail-item-label\" className={LABEL_BY_MODE[mode]}>\n {label}\n </span>\n );\n\n const el = asChild ? (\n <Slot.Root {...shared}>\n <Slot.Slottable>{children}</Slot.Slottable>\n {labelEl}\n </Slot.Root>\n ) : (\n <button type=\"button\" {...shared}>\n <span data-slot=\"nav-rail-item-icon\" className={ICON_BY_MODE[mode]}>\n {children}\n </span>\n {labelEl}\n </button>\n );\n\n if (mode !== \"icon\") return el;\n return (\n <Tooltip>\n <TooltipTrigger asChild>{el}</TooltipTrigger>\n <TooltipContent side={tooltipSide}>{label}</TooltipContent>\n </Tooltip>\n );\n}\n\n// ── User footer ─────────────────────────────────────────────────────────────\n\ntype NavRailUserProps = React.ComponentProps<\"div\"> & {\n /** The avatar element (e.g. an <Avatar />). */\n avatar: React.ReactNode;\n /** The user's display name (hidden in icon mode). */\n name: React.ReactNode;\n /** The user's secondary line, e.g. email (hidden in icon mode). */\n email: React.ReactNode;\n};\n\n/** The footer slot of the rail showing the signed-in user (avatar + name + email). */\nfunction NavRailUser({ avatar, name, email, className, ...props }: NavRailUserProps) {\n const mode = React.useContext(NavRailContext);\n const detailsHidden = mode === \"icon\";\n return (\n <div\n data-slot=\"nav-rail-user\"\n className={cn(\"mt-auto flex h-12 w-full items-center rounded-lg\", className)}\n {...props}\n >\n {/* Fixed w-10 slot centers any avatar on the same axis as the icon column,\n so it never shifts between modes regardless of avatar size. */}\n <span\n data-slot=\"nav-rail-user-avatar\"\n className=\"flex w-10 shrink-0 items-center justify-center\"\n >\n {avatar}\n </span>\n <div\n data-slot=\"nav-rail-user-details\"\n className={cn(\n \"flex min-w-0 flex-1 flex-col justify-center text-left leading-tight\",\n detailsHidden && \"sr-only\",\n mode === \"expand-on-hover\" &&\n \"opacity-0 transition-opacity duration-200 group-hover/nav-rail:opacity-100\",\n )}\n >\n <span className=\"truncate text-sm font-medium\">{name}</span>\n <span className=\"truncate text-xs text-muted-foreground\">{email}</span>\n </div>\n </div>\n );\n}\n\n// ── Flyout submenu ──────────────────────────────────────────────────────────\n\n/** Root for a rail item that opens a flyout submenu (wraps Popover). */\nfunction NavRailMenu(props: React.ComponentProps<typeof Popover>) {\n return <Popover {...props} />;\n}\n\ntype NavRailMenuTriggerProps = Omit<React.ComponentProps<\"button\">, \"aria-label\"> & {\n /** Tooltip/accessible name + inline label for the trigger item. */\n label: string;\n /** Marks the trigger as active (current section) styling. */\n active?: boolean;\n};\n\n/** The rail item that opens its flyout submenu; renders a chevron affordance. */\nfunction NavRailMenuTrigger({\n label,\n active,\n className,\n children,\n ...props\n}: NavRailMenuTriggerProps) {\n const mode = React.useContext(NavRailContext);\n return (\n <PopoverTrigger asChild>\n <button\n type=\"button\"\n data-slot=\"nav-rail-menu-trigger\"\n data-active={active || undefined}\n aria-label={label}\n className={cn(ITEM_BASE, ITEM_BY_MODE[mode], className)}\n {...props}\n >\n <span data-slot=\"nav-rail-item-icon\" className={ICON_BY_MODE[mode]}>\n {children}\n </span>\n <span data-slot=\"nav-rail-item-label\" className={LABEL_BY_MODE[mode]}>\n {label}\n </span>\n <ChevronRightIcon aria-hidden className={CHEVRON_BY_MODE[mode]} />\n </button>\n </PopoverTrigger>\n );\n}\n\n/** The glass flyout panel that holds the submenu items (portalled Popover content). */\nfunction NavRailMenuContent({\n className,\n side = \"right\",\n align = \"start\",\n sideOffset = 8,\n ...props\n}: React.ComponentProps<typeof PopoverContent>) {\n return (\n <PopoverContent\n data-slot=\"nav-rail-menu-content\"\n side={side}\n align={align}\n sideOffset={sideOffset}\n // Glass flyout (matches the prototype sub-nav): translucent + blurred,\n // 16px radius, hairline border, soft shadow. Tokens, not prototype code.\n className={cn(\n \"flex w-[180px] flex-col gap-0.5 rounded-2xl border border-border bg-[var(--glass-subtle)] p-1.5 text-foreground shadow-sm backdrop-blur-[var(--glass-blur)]\",\n className,\n )}\n {...props}\n />\n );\n}\n\ntype NavRailMenuItemProps = React.ComponentProps<\"button\"> & {\n /** Marks the entry as the current page (active styling + `aria-current=\"page\"`). */\n active?: boolean;\n /** Render the child element instead of a <button> (e.g. a router link). */\n asChild?: boolean;\n};\n\n/** A single entry inside a NavRail flyout submenu. */\nfunction NavRailMenuItem({ className, active, asChild = false, ...props }: NavRailMenuItemProps) {\n const Comp = asChild ? Slot.Root : \"button\";\n return (\n <Comp\n data-slot=\"nav-rail-menu-item\"\n data-active={active || undefined}\n aria-current={active ? \"page\" : undefined}\n className={cn(\n \"flex w-full cursor-pointer items-center gap-2.5 rounded-lg px-3 py-2 text-left text-sm text-foreground outline-none transition-colors\",\n \"hover:bg-foreground/10 focus-visible:bg-foreground/10\",\n \"data-[active=true]:bg-[var(--white)] data-[active=true]:font-medium data-[active=true]:text-[var(--brand-colors-brand-500)] data-[active=true]:hover:bg-[var(--white)]\",\n \"[&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\n className,\n )}\n {...(asChild ? {} : { type: \"button\" as const })}\n {...props}\n />\n );\n}\n\nexport {\n NavRail,\n NavRailItem,\n NavRailUser,\n NavRailSeparator,\n NavRailMenu,\n NavRailMenuTrigger,\n NavRailMenuContent,\n NavRailMenuItem,\n type NavRailMode,\n type NavRailItemProps,\n type NavRailUserProps,\n type NavRailMenuTriggerProps,\n type NavRailMenuItemProps,\n};\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","names":["Tooltip","Popover"],"sources":["../../../src/primitives/NavRail/NavRail.tsx"],"sourcesContent":["import { ChevronRightIcon } from \"lucide-react\";\nimport { Slot } from \"radix-ui\";\nimport * as React from \"react\";\n\nimport { Popover, PopoverContent, PopoverTrigger } from \"@/primitives/Popover\";\nimport { Tooltip, TooltipContent, TooltipTrigger } from \"@/primitives/Tooltip\";\nimport { cn } from \"@/utils\";\n\n// NavRail — a vertical navigation rail (the app's side nav). Four display modes:\n// icon-only (tooltips), text-only, expanded (icon + text), and expand-on-hover\n// (icon-only that widens to reveal labels on hover). Items can open a flyout\n// submenu (NavRailMenu) and the rail can show a user footer (NavRailUser).\n//\n// All items share a constant height (h-10) with the icon pinned to the left, so\n// expanding the rail just REVEALS the labels to the right — the icon never moves\n// and the row height never changes.\n//\n// LAYOUT NOTE: `expand-on-hover` changes the rail's width. To make the content\n// give up space as the rail expands (rather than overlap it), put the rail in a\n// flex row as a `shrink-0` child (it keeps its own w-14/w-56 width) next to a\n// `flex-1 min-w-0` content column — the column shrinks as the rail widens.\n\ntype NavRailMode = \"icon\" | \"text\" | \"expanded\" | \"expand-on-hover\";\n\nconst NavRailContext = React.createContext<NavRailMode>(\"icon\");\n\nconst RAIL_BY_MODE: Record<NavRailMode, string> = {\n icon: \"w-14 items-center\",\n text: \"w-56 items-stretch\",\n expanded: \"w-56 items-stretch\",\n \"expand-on-hover\": \"w-14 items-stretch transition-[width] duration-200 ease-out hover:w-56\",\n};\n\nconst ITEM_BASE =\n \"relative flex h-10 cursor-pointer items-center text-foreground outline-none transition-colors hover:bg-foreground/10 focus-visible:ring-[3px] focus-visible:ring-ring/50 disabled:pointer-events-none disabled:opacity-50 data-[active=true]:bg-[var(--white)] data-[active=true]:font-medium data-[active=true]:text-[var(--brand-colors-brand-500)] data-[active=true]:hover:bg-[var(--white)] [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-5\";\n\nconst ITEM_BY_MODE: Record<NavRailMode, string> = {\n icon: \"w-10 justify-center rounded-full\",\n text: \"w-full justify-start gap-3 rounded-lg px-2.5\",\n expanded: \"w-full justify-start gap-3 rounded-lg px-2.5\",\n \"expand-on-hover\": \"w-full justify-start gap-3 rounded-lg px-2.5\",\n};\n\nconst ICON_BY_MODE: Record<NavRailMode, string> = {\n icon: \"flex shrink-0 items-center justify-center\",\n text: \"hidden\", // text-only mode hides the icon\n expanded: \"flex shrink-0 items-center justify-center\",\n \"expand-on-hover\": \"flex shrink-0 items-center justify-center\",\n};\n\nconst LABEL_ROW = \"min-w-0 flex-1 truncate text-left text-sm font-medium\";\nconst LABEL_BY_MODE: Record<NavRailMode, string> = {\n icon: \"sr-only\",\n text: LABEL_ROW,\n expanded: LABEL_ROW,\n // Always laid out (so the icon never reflows); revealed via opacity on hover.\n \"expand-on-hover\": cn(\n LABEL_ROW,\n \"opacity-0 transition-opacity duration-200 group-hover/nav-rail:opacity-100\",\n ),\n};\n\nconst CHEVRON_BY_MODE: Record<NavRailMode, string> = {\n // Vertically centered, overhanging the right edge (clear of the centered icon).\n icon: \"absolute top-1/2 right-[-4px] size-3 -translate-y-1/2 text-muted-foreground\",\n text: \"ml-auto size-4 shrink-0 text-muted-foreground\",\n expanded: \"ml-auto size-4 shrink-0 text-muted-foreground\",\n \"expand-on-hover\":\n \"ml-auto size-4 shrink-0 text-muted-foreground opacity-0 transition-opacity duration-200 group-hover/nav-rail:opacity-100\",\n};\n\n/** The vertical navigation rail container; sets the display `mode` for all items via context. */\nfunction NavRail({\n mode = \"icon\",\n className,\n ...props\n}: React.ComponentProps<\"nav\"> & {\n /** Display mode for the rail and its items: icon-only (tooltips), text-only, expanded (icon + text), or expand-on-hover. */\n mode?: NavRailMode;\n}) {\n return (\n <NavRailContext.Provider value={mode}>\n <nav\n data-slot=\"nav-rail\"\n data-mode={mode}\n className={cn(\n \"group/nav-rail flex flex-col gap-1 overflow-hidden rounded-2xl bg-[var(--glass-strong)] p-2 backdrop-blur-glass\",\n RAIL_BY_MODE[mode],\n className,\n )}\n {...props}\n />\n </NavRailContext.Provider>\n );\n}\n\n/** A thin divider between groups of rail items. */\nfunction NavRailSeparator({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"nav-rail-separator\"\n role=\"separator\"\n className={cn(\"my-1 h-px w-6 shrink-0 self-center bg-border\", className)}\n {...props}\n />\n );\n}\n\ntype NavRailItemProps = Omit<React.ComponentProps<\"button\">, \"aria-label\"> & {\n /** Tooltip text (icon mode) + accessible name + inline label (text/expanded). */\n label: string;\n /** Marks the item as the current page (active styling + `aria-current=\"page\"`). */\n active?: boolean;\n /** Render the child element instead of a <button> (e.g. a router link). */\n asChild?: boolean;\n /** Which side the tooltip opens on in icon mode. */\n tooltipSide?: \"top\" | \"right\" | \"bottom\" | \"left\";\n};\n\n/** A single navigation entry; an icon (as children) plus a `label`, with a tooltip in icon mode. */\nfunction NavRailItem({\n label,\n active,\n asChild = false,\n tooltipSide = \"right\",\n className,\n children,\n ...props\n}: NavRailItemProps) {\n const mode = React.useContext(NavRailContext);\n const shared = {\n \"data-slot\": \"nav-rail-item\",\n \"data-active\": active || undefined,\n \"aria-label\": label,\n \"aria-current\": active ? (\"page\" as const) : undefined,\n className: cn(ITEM_BASE, ITEM_BY_MODE[mode], className),\n ...props,\n };\n const labelEl = (\n <span data-slot=\"nav-rail-item-label\" className={LABEL_BY_MODE[mode]}>\n {label}\n </span>\n );\n\n const el = asChild ? (\n <Slot.Root {...shared}>\n <Slot.Slottable>{children}</Slot.Slottable>\n {labelEl}\n </Slot.Root>\n ) : (\n <button type=\"button\" {...shared}>\n <span data-slot=\"nav-rail-item-icon\" className={ICON_BY_MODE[mode]}>\n {children}\n </span>\n {labelEl}\n </button>\n );\n\n if (mode !== \"icon\") return el;\n return (\n <Tooltip>\n <TooltipTrigger asChild>{el}</TooltipTrigger>\n <TooltipContent side={tooltipSide}>{label}</TooltipContent>\n </Tooltip>\n );\n}\n\n// ── User footer ─────────────────────────────────────────────────────────────\n\ntype NavRailUserProps = React.ComponentProps<\"div\"> & {\n /** The avatar element (e.g. an <Avatar />). */\n avatar: React.ReactNode;\n /** The user's display name (hidden in icon mode). */\n name: React.ReactNode;\n /** The user's secondary line, e.g. email (hidden in icon mode). */\n email: React.ReactNode;\n};\n\n/** The footer slot of the rail showing the signed-in user (avatar + name + email). */\nfunction NavRailUser({ avatar, name, email, className, ...props }: NavRailUserProps) {\n const mode = React.useContext(NavRailContext);\n const detailsHidden = mode === \"icon\";\n return (\n <div\n data-slot=\"nav-rail-user\"\n className={cn(\"mt-auto flex h-12 w-full items-center rounded-lg\", className)}\n {...props}\n >\n {/* Fixed w-10 slot centers any avatar on the same axis as the icon column,\n so it never shifts between modes regardless of avatar size. */}\n <span\n data-slot=\"nav-rail-user-avatar\"\n className=\"flex w-10 shrink-0 items-center justify-center\"\n >\n {avatar}\n </span>\n <div\n data-slot=\"nav-rail-user-details\"\n className={cn(\n \"flex min-w-0 flex-1 flex-col justify-center text-left leading-tight\",\n detailsHidden && \"sr-only\",\n mode === \"expand-on-hover\" &&\n \"opacity-0 transition-opacity duration-200 group-hover/nav-rail:opacity-100\",\n )}\n >\n <span className=\"truncate text-sm font-medium\">{name}</span>\n <span className=\"truncate text-xs text-muted-foreground\">{email}</span>\n </div>\n </div>\n );\n}\n\n// ── Flyout submenu ──────────────────────────────────────────────────────────\n\n/** Root for a rail item that opens a flyout submenu (wraps Popover). */\nfunction NavRailMenu(props: React.ComponentProps<typeof Popover>) {\n return <Popover {...props} />;\n}\n\ntype NavRailMenuTriggerProps = Omit<React.ComponentProps<\"button\">, \"aria-label\"> & {\n /** Tooltip/accessible name + inline label for the trigger item. */\n label: string;\n /** Marks the trigger as active (current section) styling. */\n active?: boolean;\n};\n\n/** The rail item that opens its flyout submenu; renders a chevron affordance. */\nfunction NavRailMenuTrigger({\n label,\n active,\n className,\n children,\n ...props\n}: NavRailMenuTriggerProps) {\n const mode = React.useContext(NavRailContext);\n return (\n <PopoverTrigger asChild>\n <button\n type=\"button\"\n data-slot=\"nav-rail-menu-trigger\"\n data-active={active || undefined}\n aria-label={label}\n className={cn(ITEM_BASE, ITEM_BY_MODE[mode], className)}\n {...props}\n >\n <span data-slot=\"nav-rail-item-icon\" className={ICON_BY_MODE[mode]}>\n {children}\n </span>\n <span data-slot=\"nav-rail-item-label\" className={LABEL_BY_MODE[mode]}>\n {label}\n </span>\n <ChevronRightIcon aria-hidden className={CHEVRON_BY_MODE[mode]} />\n </button>\n </PopoverTrigger>\n );\n}\n\n/** The glass flyout panel that holds the submenu items (portalled Popover content). */\nfunction NavRailMenuContent({\n className,\n side = \"right\",\n align = \"start\",\n sideOffset = 8,\n ...props\n}: React.ComponentProps<typeof PopoverContent>) {\n return (\n <PopoverContent\n data-slot=\"nav-rail-menu-content\"\n side={side}\n align={align}\n sideOffset={sideOffset}\n // Glass flyout (matches the prototype sub-nav): translucent + blurred,\n // 16px radius, hairline border, soft shadow. Tokens, not prototype code.\n className={cn(\n \"flex w-[180px] flex-col gap-0.5 rounded-2xl border border-border bg-[var(--glass-subtle)] p-1.5 text-foreground shadow-sm backdrop-blur-glass\",\n className,\n )}\n {...props}\n />\n );\n}\n\ntype NavRailMenuItemProps = React.ComponentProps<\"button\"> & {\n /** Marks the entry as the current page (active styling + `aria-current=\"page\"`). */\n active?: boolean;\n /** Render the child element instead of a <button> (e.g. a router link). */\n asChild?: boolean;\n};\n\n/** A single entry inside a NavRail flyout submenu. */\nfunction NavRailMenuItem({ className, active, asChild = false, ...props }: NavRailMenuItemProps) {\n const Comp = asChild ? Slot.Root : \"button\";\n return (\n <Comp\n data-slot=\"nav-rail-menu-item\"\n data-active={active || undefined}\n aria-current={active ? \"page\" : undefined}\n className={cn(\n \"flex w-full cursor-pointer items-center gap-2.5 rounded-lg px-3 py-2 text-left text-sm text-foreground outline-none transition-colors\",\n \"hover:bg-foreground/10 focus-visible:bg-foreground/10\",\n \"data-[active=true]:bg-[var(--white)] data-[active=true]:font-medium data-[active=true]:text-[var(--brand-colors-brand-500)] data-[active=true]:hover:bg-[var(--white)]\",\n \"[&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\n className,\n )}\n {...(asChild ? {} : { type: \"button\" as const })}\n {...props}\n />\n );\n}\n\nexport {\n NavRail,\n NavRailItem,\n NavRailUser,\n NavRailSeparator,\n NavRailMenu,\n NavRailMenuTrigger,\n NavRailMenuContent,\n NavRailMenuItem,\n type NavRailMode,\n type NavRailItemProps,\n type NavRailUserProps,\n type NavRailMenuTriggerProps,\n type NavRailMenuItemProps,\n};\n"],"mappings":"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"}
|
|
@@ -31,7 +31,7 @@ function NavigationMenuItem({ className, ...props }) {
|
|
|
31
31
|
...props
|
|
32
32
|
});
|
|
33
33
|
}
|
|
34
|
-
const navigationMenuTriggerStyle = (0, class_variance_authority.cva)("group inline-flex h-9 w-max items-center justify-center rounded-
|
|
34
|
+
const navigationMenuTriggerStyle = (0, class_variance_authority.cva)("group inline-flex h-9 w-max items-center justify-center rounded-lg bg-background px-4 py-2 text-sm font-medium transition-[color,box-shadow] outline-none hover:bg-accent hover:text-accent-foreground focus:bg-accent focus:text-accent-foreground focus-visible:ring-[3px] focus-visible:ring-ring/50 focus-visible:outline-1 disabled:pointer-events-none disabled:opacity-50 data-[state=open]:bg-accent/50 data-[state=open]:text-accent-foreground data-[state=open]:hover:bg-accent data-[state=open]:focus:bg-accent");
|
|
35
35
|
/** Button that toggles an item's content panel; renders a rotating chevron. */
|
|
36
36
|
function NavigationMenuTrigger({ className, children, ...props }) {
|
|
37
37
|
return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(radix_ui.NavigationMenu.Trigger, {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","names":["NavigationMenuPrimitive","cn","ChevronDownIcon"],"sources":["../../../src/primitives/NavigationMenu/NavigationMenu.tsx"],"sourcesContent":["import { cva } from \"class-variance-authority\";\nimport { ChevronDownIcon } from \"lucide-react\";\nimport { NavigationMenu as NavigationMenuPrimitive } from \"radix-ui\";\nimport type * as React from \"react\";\n\nimport { cn } from \"@/utils\";\n\n/** Root of a horizontal navigation bar; renders a `<nav>` and optionally an animated viewport. */\nfunction NavigationMenu({\n className,\n children,\n viewport = true,\n ...props\n}: React.ComponentProps<typeof NavigationMenuPrimitive.Root> & {\n /** When true (default), renders a shared animated viewport that hosts the active item's content. Set false to render content inline beneath each item. */\n viewport?: boolean;\n}) {\n return (\n <NavigationMenuPrimitive.Root\n data-slot=\"navigation-menu\"\n data-viewport={viewport}\n className={cn(\n \"group/navigation-menu relative flex max-w-max flex-1 items-center justify-center\",\n className,\n )}\n {...props}\n >\n {children}\n {viewport && <NavigationMenuViewport />}\n </NavigationMenuPrimitive.Root>\n );\n}\n\n/** Horizontal list wrapper for the top-level navigation items. */\nfunction NavigationMenuList({\n className,\n ...props\n}: React.ComponentProps<typeof NavigationMenuPrimitive.List>) {\n return (\n <NavigationMenuPrimitive.List\n data-slot=\"navigation-menu-list\"\n className={cn(\"group flex flex-1 list-none items-center justify-center gap-1\", className)}\n {...props}\n />\n );\n}\n\n/** A single top-level entry; holds either a link or a trigger plus its content. */\nfunction NavigationMenuItem({\n className,\n ...props\n}: React.ComponentProps<typeof NavigationMenuPrimitive.Item>) {\n return (\n <NavigationMenuPrimitive.Item\n data-slot=\"navigation-menu-item\"\n className={cn(\"relative\", className)}\n {...props}\n />\n );\n}\n\nconst navigationMenuTriggerStyle = cva(\n \"group inline-flex h-9 w-max items-center justify-center rounded-
|
|
1
|
+
{"version":3,"file":"index.cjs","names":["NavigationMenuPrimitive","cn","ChevronDownIcon"],"sources":["../../../src/primitives/NavigationMenu/NavigationMenu.tsx"],"sourcesContent":["import { cva } from \"class-variance-authority\";\nimport { ChevronDownIcon } from \"lucide-react\";\nimport { NavigationMenu as NavigationMenuPrimitive } from \"radix-ui\";\nimport type * as React from \"react\";\n\nimport { cn } from \"@/utils\";\n\n/** Root of a horizontal navigation bar; renders a `<nav>` and optionally an animated viewport. */\nfunction NavigationMenu({\n className,\n children,\n viewport = true,\n ...props\n}: React.ComponentProps<typeof NavigationMenuPrimitive.Root> & {\n /** When true (default), renders a shared animated viewport that hosts the active item's content. Set false to render content inline beneath each item. */\n viewport?: boolean;\n}) {\n return (\n <NavigationMenuPrimitive.Root\n data-slot=\"navigation-menu\"\n data-viewport={viewport}\n className={cn(\n \"group/navigation-menu relative flex max-w-max flex-1 items-center justify-center\",\n className,\n )}\n {...props}\n >\n {children}\n {viewport && <NavigationMenuViewport />}\n </NavigationMenuPrimitive.Root>\n );\n}\n\n/** Horizontal list wrapper for the top-level navigation items. */\nfunction NavigationMenuList({\n className,\n ...props\n}: React.ComponentProps<typeof NavigationMenuPrimitive.List>) {\n return (\n <NavigationMenuPrimitive.List\n data-slot=\"navigation-menu-list\"\n className={cn(\"group flex flex-1 list-none items-center justify-center gap-1\", className)}\n {...props}\n />\n );\n}\n\n/** A single top-level entry; holds either a link or a trigger plus its content. */\nfunction NavigationMenuItem({\n className,\n ...props\n}: React.ComponentProps<typeof NavigationMenuPrimitive.Item>) {\n return (\n <NavigationMenuPrimitive.Item\n data-slot=\"navigation-menu-item\"\n className={cn(\"relative\", className)}\n {...props}\n />\n );\n}\n\nconst navigationMenuTriggerStyle = cva(\n \"group inline-flex h-9 w-max items-center justify-center rounded-lg bg-background px-4 py-2 text-sm font-medium transition-[color,box-shadow] outline-none hover:bg-accent hover:text-accent-foreground focus:bg-accent focus:text-accent-foreground focus-visible:ring-[3px] focus-visible:ring-ring/50 focus-visible:outline-1 disabled:pointer-events-none disabled:opacity-50 data-[state=open]:bg-accent/50 data-[state=open]:text-accent-foreground data-[state=open]:hover:bg-accent data-[state=open]:focus:bg-accent\",\n);\n\n/** Button that toggles an item's content panel; renders a rotating chevron. */\nfunction NavigationMenuTrigger({\n className,\n children,\n ...props\n}: React.ComponentProps<typeof NavigationMenuPrimitive.Trigger>) {\n return (\n <NavigationMenuPrimitive.Trigger\n data-slot=\"navigation-menu-trigger\"\n className={cn(navigationMenuTriggerStyle(), \"group\", className)}\n {...props}\n >\n {children}{\" \"}\n <ChevronDownIcon\n className=\"relative top-[1px] ml-1 size-3 transition duration-300 group-data-[state=open]:rotate-180\"\n aria-hidden=\"true\"\n />\n </NavigationMenuPrimitive.Trigger>\n );\n}\n\n/** The panel revealed when an item's trigger is open; holds links or rich content. */\nfunction NavigationMenuContent({\n className,\n ...props\n}: React.ComponentProps<typeof NavigationMenuPrimitive.Content>) {\n return (\n <NavigationMenuPrimitive.Content\n data-slot=\"navigation-menu-content\"\n className={cn(\n \"top-0 left-0 w-full p-2 pr-2.5 data-[motion=from-end]:slide-in-from-right-52 data-[motion=from-start]:slide-in-from-left-52 data-[motion=to-end]:slide-out-to-right-52 data-[motion=to-start]:slide-out-to-left-52 data-[motion^=from-]:animate-in data-[motion^=from-]:fade-in data-[motion^=to-]:animate-out data-[motion^=to-]:fade-out md:absolute md:w-auto\",\n \"group-data-[viewport=false]/navigation-menu:top-full group-data-[viewport=false]/navigation-menu:mt-1.5 group-data-[viewport=false]/navigation-menu:overflow-hidden group-data-[viewport=false]/navigation-menu:rounded-md group-data-[viewport=false]/navigation-menu:border group-data-[viewport=false]/navigation-menu:bg-popover group-data-[viewport=false]/navigation-menu:text-popover-foreground group-data-[viewport=false]/navigation-menu:shadow group-data-[viewport=false]/navigation-menu:duration-200 **:data-[slot=navigation-menu-link]:focus:ring-0 **:data-[slot=navigation-menu-link]:focus:outline-none group-data-[viewport=false]/navigation-menu:data-[state=closed]:animate-out group-data-[viewport=false]/navigation-menu:data-[state=closed]:fade-out-0 group-data-[viewport=false]/navigation-menu:data-[state=closed]:zoom-out-95 group-data-[viewport=false]/navigation-menu:data-[state=open]:animate-in group-data-[viewport=false]/navigation-menu:data-[state=open]:fade-in-0 group-data-[viewport=false]/navigation-menu:data-[state=open]:zoom-in-95\",\n className,\n )}\n {...props}\n />\n );\n}\n\n/** Shared animated container that the active item's content is portaled into when `viewport` is enabled. */\nfunction NavigationMenuViewport({\n className,\n ...props\n}: React.ComponentProps<typeof NavigationMenuPrimitive.Viewport>) {\n return (\n <div className={cn(\"absolute top-full left-0 isolate z-50 flex justify-center\")}>\n <NavigationMenuPrimitive.Viewport\n data-slot=\"navigation-menu-viewport\"\n className={cn(\n \"origin-top-center relative mt-1.5 h-[var(--radix-navigation-menu-viewport-height)] w-full overflow-hidden rounded-md border bg-popover text-popover-foreground shadow data-[state=closed]:animate-out data-[state=closed]:zoom-out-95 data-[state=open]:animate-in data-[state=open]:zoom-in-90 md:w-[var(--radix-navigation-menu-viewport-width)]\",\n className,\n )}\n {...props}\n />\n </div>\n );\n}\n\n/** A navigable link styled for use as a top-level item or inside content; set `active` to mark the current page. */\nfunction NavigationMenuLink({\n className,\n ...props\n}: React.ComponentProps<typeof NavigationMenuPrimitive.Link>) {\n return (\n <NavigationMenuPrimitive.Link\n data-slot=\"navigation-menu-link\"\n className={cn(\n \"flex flex-col gap-1 rounded-sm p-2 text-sm transition-all outline-none hover:bg-accent hover:text-accent-foreground focus:bg-accent focus:text-accent-foreground focus-visible:ring-[3px] focus-visible:ring-ring/50 focus-visible:outline-1 data-[active=true]:bg-accent/50 data-[active=true]:text-accent-foreground data-[active=true]:hover:bg-accent data-[active=true]:focus:bg-accent [&_svg:not([class*='size-'])]:size-4 [&_svg:not([class*='text-'])]:text-muted-foreground\",\n className,\n )}\n {...props}\n />\n );\n}\n\n/** Optional arrow that points from the active trigger to its content panel. */\nfunction NavigationMenuIndicator({\n className,\n ...props\n}: React.ComponentProps<typeof NavigationMenuPrimitive.Indicator>) {\n return (\n <NavigationMenuPrimitive.Indicator\n data-slot=\"navigation-menu-indicator\"\n className={cn(\n \"top-full z-[1] flex h-1.5 items-end justify-center overflow-hidden data-[state=hidden]:animate-out data-[state=hidden]:fade-out data-[state=visible]:animate-in data-[state=visible]:fade-in\",\n className,\n )}\n {...props}\n >\n <div className=\"relative top-[60%] h-2 w-2 rotate-45 rounded-tl-sm bg-border shadow-md\" />\n </NavigationMenuPrimitive.Indicator>\n );\n}\n\nexport {\n NavigationMenu,\n NavigationMenuList,\n NavigationMenuItem,\n NavigationMenuContent,\n NavigationMenuTrigger,\n NavigationMenuLink,\n NavigationMenuIndicator,\n NavigationMenuViewport,\n navigationMenuTriggerStyle,\n};\n"],"mappings":";;;;;;;;AAQA,SAAS,eAAe,EACtB,WACA,UACA,WAAW,MACX,GAAG,SAIF;CACD,OACE,iBAAA,GAAA,kBAAA,MAACA,SAAAA,eAAwB,MAAzB;EACE,aAAU;EACV,iBAAe;EACf,WAAWC,WAAAA,GACT,oFACA,SACF;EACA,GAAI;YAPN,CASG,UACA,YAAY,iBAAA,GAAA,kBAAA,KAAC,wBAAD,CAAyB,CAAA,CACV;;AAElC;;AAGA,SAAS,mBAAmB,EAC1B,WACA,GAAG,SACyD;CAC5D,OACE,iBAAA,GAAA,kBAAA,KAACD,SAAAA,eAAwB,MAAzB;EACE,aAAU;EACV,WAAWC,WAAAA,GAAG,iEAAiE,SAAS;EACxF,GAAI;CACL,CAAA;AAEL;;AAGA,SAAS,mBAAmB,EAC1B,WACA,GAAG,SACyD;CAC5D,OACE,iBAAA,GAAA,kBAAA,KAACD,SAAAA,eAAwB,MAAzB;EACE,aAAU;EACV,WAAWC,WAAAA,GAAG,YAAY,SAAS;EACnC,GAAI;CACL,CAAA;AAEL;AAEA,MAAM,8BAAA,GAAA,yBAAA,KACJ,8fACF;;AAGA,SAAS,sBAAsB,EAC7B,WACA,UACA,GAAG,SAC4D;CAC/D,OACE,iBAAA,GAAA,kBAAA,MAACD,SAAAA,eAAwB,SAAzB;EACE,aAAU;EACV,WAAWC,WAAAA,GAAG,2BAA2B,GAAG,SAAS,SAAS;EAC9D,GAAI;YAHN;GAKG;GAAU;GACX,iBAAA,GAAA,kBAAA,KAACC,aAAAA,iBAAD;IACE,WAAU;IACV,eAAY;GACb,CAAA;EAC8B;;AAErC;;AAGA,SAAS,sBAAsB,EAC7B,WACA,GAAG,SAC4D;CAC/D,OACE,iBAAA,GAAA,kBAAA,KAACF,SAAAA,eAAwB,SAAzB;EACE,aAAU;EACV,WAAWC,WAAAA,GACT,oWACA,6hCACA,SACF;EACA,GAAI;CACL,CAAA;AAEL;;AAGA,SAAS,uBAAuB,EAC9B,WACA,GAAG,SAC6D;CAChE,OACE,iBAAA,GAAA,kBAAA,KAAC,OAAD;EAAK,WAAWA,WAAAA,GAAG,2DAA2D;YAC5E,iBAAA,GAAA,kBAAA,KAACD,SAAAA,eAAwB,UAAzB;GACE,aAAU;GACV,WAAWC,WAAAA,GACT,sVACA,SACF;GACA,GAAI;EACL,CAAA;CACE,CAAA;AAET;;AAGA,SAAS,mBAAmB,EAC1B,WACA,GAAG,SACyD;CAC5D,OACE,iBAAA,GAAA,kBAAA,KAACD,SAAAA,eAAwB,MAAzB;EACE,aAAU;EACV,WAAWC,WAAAA,GACT,ydACA,SACF;EACA,GAAI;CACL,CAAA;AAEL;;AAGA,SAAS,wBAAwB,EAC/B,WACA,GAAG,SAC8D;CACjE,OACE,iBAAA,GAAA,kBAAA,KAACD,SAAAA,eAAwB,WAAzB;EACE,aAAU;EACV,WAAWC,WAAAA,GACT,gMACA,SACF;EACA,GAAI;YAEJ,iBAAA,GAAA,kBAAA,KAAC,OAAD,EAAK,WAAU,yEAA0E,CAAA;CACxD,CAAA;AAEvC"}
|
|
@@ -30,7 +30,7 @@ function NavigationMenuItem({ className, ...props }) {
|
|
|
30
30
|
...props
|
|
31
31
|
});
|
|
32
32
|
}
|
|
33
|
-
const navigationMenuTriggerStyle = cva("group inline-flex h-9 w-max items-center justify-center rounded-
|
|
33
|
+
const navigationMenuTriggerStyle = cva("group inline-flex h-9 w-max items-center justify-center rounded-lg bg-background px-4 py-2 text-sm font-medium transition-[color,box-shadow] outline-none hover:bg-accent hover:text-accent-foreground focus:bg-accent focus:text-accent-foreground focus-visible:ring-[3px] focus-visible:ring-ring/50 focus-visible:outline-1 disabled:pointer-events-none disabled:opacity-50 data-[state=open]:bg-accent/50 data-[state=open]:text-accent-foreground data-[state=open]:hover:bg-accent data-[state=open]:focus:bg-accent");
|
|
34
34
|
/** Button that toggles an item's content panel; renders a rotating chevron. */
|
|
35
35
|
function NavigationMenuTrigger({ className, children, ...props }) {
|
|
36
36
|
return /* @__PURE__ */ jsxs(NavigationMenu$1.Trigger, {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":["NavigationMenuPrimitive"],"sources":["../../../src/primitives/NavigationMenu/NavigationMenu.tsx"],"sourcesContent":["import { cva } from \"class-variance-authority\";\nimport { ChevronDownIcon } from \"lucide-react\";\nimport { NavigationMenu as NavigationMenuPrimitive } from \"radix-ui\";\nimport type * as React from \"react\";\n\nimport { cn } from \"@/utils\";\n\n/** Root of a horizontal navigation bar; renders a `<nav>` and optionally an animated viewport. */\nfunction NavigationMenu({\n className,\n children,\n viewport = true,\n ...props\n}: React.ComponentProps<typeof NavigationMenuPrimitive.Root> & {\n /** When true (default), renders a shared animated viewport that hosts the active item's content. Set false to render content inline beneath each item. */\n viewport?: boolean;\n}) {\n return (\n <NavigationMenuPrimitive.Root\n data-slot=\"navigation-menu\"\n data-viewport={viewport}\n className={cn(\n \"group/navigation-menu relative flex max-w-max flex-1 items-center justify-center\",\n className,\n )}\n {...props}\n >\n {children}\n {viewport && <NavigationMenuViewport />}\n </NavigationMenuPrimitive.Root>\n );\n}\n\n/** Horizontal list wrapper for the top-level navigation items. */\nfunction NavigationMenuList({\n className,\n ...props\n}: React.ComponentProps<typeof NavigationMenuPrimitive.List>) {\n return (\n <NavigationMenuPrimitive.List\n data-slot=\"navigation-menu-list\"\n className={cn(\"group flex flex-1 list-none items-center justify-center gap-1\", className)}\n {...props}\n />\n );\n}\n\n/** A single top-level entry; holds either a link or a trigger plus its content. */\nfunction NavigationMenuItem({\n className,\n ...props\n}: React.ComponentProps<typeof NavigationMenuPrimitive.Item>) {\n return (\n <NavigationMenuPrimitive.Item\n data-slot=\"navigation-menu-item\"\n className={cn(\"relative\", className)}\n {...props}\n />\n );\n}\n\nconst navigationMenuTriggerStyle = cva(\n \"group inline-flex h-9 w-max items-center justify-center rounded-
|
|
1
|
+
{"version":3,"file":"index.js","names":["NavigationMenuPrimitive"],"sources":["../../../src/primitives/NavigationMenu/NavigationMenu.tsx"],"sourcesContent":["import { cva } from \"class-variance-authority\";\nimport { ChevronDownIcon } from \"lucide-react\";\nimport { NavigationMenu as NavigationMenuPrimitive } from \"radix-ui\";\nimport type * as React from \"react\";\n\nimport { cn } from \"@/utils\";\n\n/** Root of a horizontal navigation bar; renders a `<nav>` and optionally an animated viewport. */\nfunction NavigationMenu({\n className,\n children,\n viewport = true,\n ...props\n}: React.ComponentProps<typeof NavigationMenuPrimitive.Root> & {\n /** When true (default), renders a shared animated viewport that hosts the active item's content. Set false to render content inline beneath each item. */\n viewport?: boolean;\n}) {\n return (\n <NavigationMenuPrimitive.Root\n data-slot=\"navigation-menu\"\n data-viewport={viewport}\n className={cn(\n \"group/navigation-menu relative flex max-w-max flex-1 items-center justify-center\",\n className,\n )}\n {...props}\n >\n {children}\n {viewport && <NavigationMenuViewport />}\n </NavigationMenuPrimitive.Root>\n );\n}\n\n/** Horizontal list wrapper for the top-level navigation items. */\nfunction NavigationMenuList({\n className,\n ...props\n}: React.ComponentProps<typeof NavigationMenuPrimitive.List>) {\n return (\n <NavigationMenuPrimitive.List\n data-slot=\"navigation-menu-list\"\n className={cn(\"group flex flex-1 list-none items-center justify-center gap-1\", className)}\n {...props}\n />\n );\n}\n\n/** A single top-level entry; holds either a link or a trigger plus its content. */\nfunction NavigationMenuItem({\n className,\n ...props\n}: React.ComponentProps<typeof NavigationMenuPrimitive.Item>) {\n return (\n <NavigationMenuPrimitive.Item\n data-slot=\"navigation-menu-item\"\n className={cn(\"relative\", className)}\n {...props}\n />\n );\n}\n\nconst navigationMenuTriggerStyle = cva(\n \"group inline-flex h-9 w-max items-center justify-center rounded-lg bg-background px-4 py-2 text-sm font-medium transition-[color,box-shadow] outline-none hover:bg-accent hover:text-accent-foreground focus:bg-accent focus:text-accent-foreground focus-visible:ring-[3px] focus-visible:ring-ring/50 focus-visible:outline-1 disabled:pointer-events-none disabled:opacity-50 data-[state=open]:bg-accent/50 data-[state=open]:text-accent-foreground data-[state=open]:hover:bg-accent data-[state=open]:focus:bg-accent\",\n);\n\n/** Button that toggles an item's content panel; renders a rotating chevron. */\nfunction NavigationMenuTrigger({\n className,\n children,\n ...props\n}: React.ComponentProps<typeof NavigationMenuPrimitive.Trigger>) {\n return (\n <NavigationMenuPrimitive.Trigger\n data-slot=\"navigation-menu-trigger\"\n className={cn(navigationMenuTriggerStyle(), \"group\", className)}\n {...props}\n >\n {children}{\" \"}\n <ChevronDownIcon\n className=\"relative top-[1px] ml-1 size-3 transition duration-300 group-data-[state=open]:rotate-180\"\n aria-hidden=\"true\"\n />\n </NavigationMenuPrimitive.Trigger>\n );\n}\n\n/** The panel revealed when an item's trigger is open; holds links or rich content. */\nfunction NavigationMenuContent({\n className,\n ...props\n}: React.ComponentProps<typeof NavigationMenuPrimitive.Content>) {\n return (\n <NavigationMenuPrimitive.Content\n data-slot=\"navigation-menu-content\"\n className={cn(\n \"top-0 left-0 w-full p-2 pr-2.5 data-[motion=from-end]:slide-in-from-right-52 data-[motion=from-start]:slide-in-from-left-52 data-[motion=to-end]:slide-out-to-right-52 data-[motion=to-start]:slide-out-to-left-52 data-[motion^=from-]:animate-in data-[motion^=from-]:fade-in data-[motion^=to-]:animate-out data-[motion^=to-]:fade-out md:absolute md:w-auto\",\n \"group-data-[viewport=false]/navigation-menu:top-full group-data-[viewport=false]/navigation-menu:mt-1.5 group-data-[viewport=false]/navigation-menu:overflow-hidden group-data-[viewport=false]/navigation-menu:rounded-md group-data-[viewport=false]/navigation-menu:border group-data-[viewport=false]/navigation-menu:bg-popover group-data-[viewport=false]/navigation-menu:text-popover-foreground group-data-[viewport=false]/navigation-menu:shadow group-data-[viewport=false]/navigation-menu:duration-200 **:data-[slot=navigation-menu-link]:focus:ring-0 **:data-[slot=navigation-menu-link]:focus:outline-none group-data-[viewport=false]/navigation-menu:data-[state=closed]:animate-out group-data-[viewport=false]/navigation-menu:data-[state=closed]:fade-out-0 group-data-[viewport=false]/navigation-menu:data-[state=closed]:zoom-out-95 group-data-[viewport=false]/navigation-menu:data-[state=open]:animate-in group-data-[viewport=false]/navigation-menu:data-[state=open]:fade-in-0 group-data-[viewport=false]/navigation-menu:data-[state=open]:zoom-in-95\",\n className,\n )}\n {...props}\n />\n );\n}\n\n/** Shared animated container that the active item's content is portaled into when `viewport` is enabled. */\nfunction NavigationMenuViewport({\n className,\n ...props\n}: React.ComponentProps<typeof NavigationMenuPrimitive.Viewport>) {\n return (\n <div className={cn(\"absolute top-full left-0 isolate z-50 flex justify-center\")}>\n <NavigationMenuPrimitive.Viewport\n data-slot=\"navigation-menu-viewport\"\n className={cn(\n \"origin-top-center relative mt-1.5 h-[var(--radix-navigation-menu-viewport-height)] w-full overflow-hidden rounded-md border bg-popover text-popover-foreground shadow data-[state=closed]:animate-out data-[state=closed]:zoom-out-95 data-[state=open]:animate-in data-[state=open]:zoom-in-90 md:w-[var(--radix-navigation-menu-viewport-width)]\",\n className,\n )}\n {...props}\n />\n </div>\n );\n}\n\n/** A navigable link styled for use as a top-level item or inside content; set `active` to mark the current page. */\nfunction NavigationMenuLink({\n className,\n ...props\n}: React.ComponentProps<typeof NavigationMenuPrimitive.Link>) {\n return (\n <NavigationMenuPrimitive.Link\n data-slot=\"navigation-menu-link\"\n className={cn(\n \"flex flex-col gap-1 rounded-sm p-2 text-sm transition-all outline-none hover:bg-accent hover:text-accent-foreground focus:bg-accent focus:text-accent-foreground focus-visible:ring-[3px] focus-visible:ring-ring/50 focus-visible:outline-1 data-[active=true]:bg-accent/50 data-[active=true]:text-accent-foreground data-[active=true]:hover:bg-accent data-[active=true]:focus:bg-accent [&_svg:not([class*='size-'])]:size-4 [&_svg:not([class*='text-'])]:text-muted-foreground\",\n className,\n )}\n {...props}\n />\n );\n}\n\n/** Optional arrow that points from the active trigger to its content panel. */\nfunction NavigationMenuIndicator({\n className,\n ...props\n}: React.ComponentProps<typeof NavigationMenuPrimitive.Indicator>) {\n return (\n <NavigationMenuPrimitive.Indicator\n data-slot=\"navigation-menu-indicator\"\n className={cn(\n \"top-full z-[1] flex h-1.5 items-end justify-center overflow-hidden data-[state=hidden]:animate-out data-[state=hidden]:fade-out data-[state=visible]:animate-in data-[state=visible]:fade-in\",\n className,\n )}\n {...props}\n >\n <div className=\"relative top-[60%] h-2 w-2 rotate-45 rounded-tl-sm bg-border shadow-md\" />\n </NavigationMenuPrimitive.Indicator>\n );\n}\n\nexport {\n NavigationMenu,\n NavigationMenuList,\n NavigationMenuItem,\n NavigationMenuContent,\n NavigationMenuTrigger,\n NavigationMenuLink,\n NavigationMenuIndicator,\n NavigationMenuViewport,\n navigationMenuTriggerStyle,\n};\n"],"mappings":";;;;;;;AAQA,SAAS,eAAe,EACtB,WACA,UACA,WAAW,MACX,GAAG,SAIF;CACD,OACE,qBAACA,iBAAwB,MAAzB;EACE,aAAU;EACV,iBAAe;EACf,WAAW,GACT,oFACA,SACF;EACA,GAAI;YAPN,CASG,UACA,YAAY,oBAAC,wBAAD,CAAyB,CAAA,CACV;;AAElC;;AAGA,SAAS,mBAAmB,EAC1B,WACA,GAAG,SACyD;CAC5D,OACE,oBAACA,iBAAwB,MAAzB;EACE,aAAU;EACV,WAAW,GAAG,iEAAiE,SAAS;EACxF,GAAI;CACL,CAAA;AAEL;;AAGA,SAAS,mBAAmB,EAC1B,WACA,GAAG,SACyD;CAC5D,OACE,oBAACA,iBAAwB,MAAzB;EACE,aAAU;EACV,WAAW,GAAG,YAAY,SAAS;EACnC,GAAI;CACL,CAAA;AAEL;AAEA,MAAM,6BAA6B,IACjC,8fACF;;AAGA,SAAS,sBAAsB,EAC7B,WACA,UACA,GAAG,SAC4D;CAC/D,OACE,qBAACA,iBAAwB,SAAzB;EACE,aAAU;EACV,WAAW,GAAG,2BAA2B,GAAG,SAAS,SAAS;EAC9D,GAAI;YAHN;GAKG;GAAU;GACX,oBAAC,iBAAD;IACE,WAAU;IACV,eAAY;GACb,CAAA;EAC8B;;AAErC;;AAGA,SAAS,sBAAsB,EAC7B,WACA,GAAG,SAC4D;CAC/D,OACE,oBAACA,iBAAwB,SAAzB;EACE,aAAU;EACV,WAAW,GACT,oWACA,6hCACA,SACF;EACA,GAAI;CACL,CAAA;AAEL;;AAGA,SAAS,uBAAuB,EAC9B,WACA,GAAG,SAC6D;CAChE,OACE,oBAAC,OAAD;EAAK,WAAW,GAAG,2DAA2D;YAC5E,oBAACA,iBAAwB,UAAzB;GACE,aAAU;GACV,WAAW,GACT,sVACA,SACF;GACA,GAAI;EACL,CAAA;CACE,CAAA;AAET;;AAGA,SAAS,mBAAmB,EAC1B,WACA,GAAG,SACyD;CAC5D,OACE,oBAACA,iBAAwB,MAAzB;EACE,aAAU;EACV,WAAW,GACT,ydACA,SACF;EACA,GAAI;CACL,CAAA;AAEL;;AAGA,SAAS,wBAAwB,EAC/B,WACA,GAAG,SAC8D;CACjE,OACE,oBAACA,iBAAwB,WAAzB;EACE,aAAU;EACV,WAAW,GACT,gMACA,SACF;EACA,GAAI;YAEJ,oBAAC,OAAD,EAAK,WAAU,yEAA0E,CAAA;CACxD,CAAA;AAEvC"}
|
|
@@ -23,7 +23,7 @@ function PopoverContent({ className, align = "center", sideOffset = 4, ...props
|
|
|
23
23
|
"data-slot": "popover-content",
|
|
24
24
|
align,
|
|
25
25
|
sideOffset,
|
|
26
|
-
className: require_cn.cn("z-50 w-72 origin-(--radix-popover-content-transform-origin) rounded-
|
|
26
|
+
className: require_cn.cn("z-50 w-72 origin-(--radix-popover-content-transform-origin) rounded-lg border bg-card p-4 text-card-foreground shadow-sm outline-hidden 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 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[state=open]:animate-in data-[state=open]:fade-in-0 data-[state=open]:zoom-in-95", className),
|
|
27
27
|
...props
|
|
28
28
|
}) });
|
|
29
29
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","names":["PopoverPrimitive","cn"],"sources":["../../../src/primitives/Popover/Popover.tsx"],"sourcesContent":["import { Popover as PopoverPrimitive } from \"radix-ui\";\nimport type * as React from \"react\";\n\nimport { cn } from \"@/utils\";\n\n/** Root of the popover: holds open state and coordinates the trigger and content. */\nfunction Popover({ ...props }: React.ComponentProps<typeof PopoverPrimitive.Root>) {\n return <PopoverPrimitive.Root data-slot=\"popover\" {...props} />;\n}\n\n/** The control (usually a button) that toggles the popover open and closed. */\nfunction PopoverTrigger({ ...props }: React.ComponentProps<typeof PopoverPrimitive.Trigger>) {\n return <PopoverPrimitive.Trigger data-slot=\"popover-trigger\" {...props} />;\n}\n\n/** The floating, portaled panel rendered when the popover is open. */\nfunction PopoverContent({\n /** Extra classes merged onto the content surface. */\n className,\n /** Alignment of the content relative to the trigger along the chosen side. */\n align = \"center\",\n /** Distance in px between the content and the trigger. */\n sideOffset = 4,\n ...props\n}: React.ComponentProps<typeof PopoverPrimitive.Content>) {\n return (\n <PopoverPrimitive.Portal>\n <PopoverPrimitive.Content\n data-slot=\"popover-content\"\n align={align}\n sideOffset={sideOffset}\n className={cn(\n \"z-50 w-72 origin-(--radix-popover-content-transform-origin) rounded-
|
|
1
|
+
{"version":3,"file":"index.cjs","names":["PopoverPrimitive","cn"],"sources":["../../../src/primitives/Popover/Popover.tsx"],"sourcesContent":["import { Popover as PopoverPrimitive } from \"radix-ui\";\nimport type * as React from \"react\";\n\nimport { cn } from \"@/utils\";\n\n/** Root of the popover: holds open state and coordinates the trigger and content. */\nfunction Popover({ ...props }: React.ComponentProps<typeof PopoverPrimitive.Root>) {\n return <PopoverPrimitive.Root data-slot=\"popover\" {...props} />;\n}\n\n/** The control (usually a button) that toggles the popover open and closed. */\nfunction PopoverTrigger({ ...props }: React.ComponentProps<typeof PopoverPrimitive.Trigger>) {\n return <PopoverPrimitive.Trigger data-slot=\"popover-trigger\" {...props} />;\n}\n\n/** The floating, portaled panel rendered when the popover is open. */\nfunction PopoverContent({\n /** Extra classes merged onto the content surface. */\n className,\n /** Alignment of the content relative to the trigger along the chosen side. */\n align = \"center\",\n /** Distance in px between the content and the trigger. */\n sideOffset = 4,\n ...props\n}: React.ComponentProps<typeof PopoverPrimitive.Content>) {\n return (\n <PopoverPrimitive.Portal>\n <PopoverPrimitive.Content\n data-slot=\"popover-content\"\n align={align}\n sideOffset={sideOffset}\n className={cn(\n \"z-50 w-72 origin-(--radix-popover-content-transform-origin) rounded-lg border bg-card p-4 text-card-foreground shadow-sm outline-hidden 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 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[state=open]:animate-in data-[state=open]:fade-in-0 data-[state=open]:zoom-in-95\",\n className,\n )}\n {...props}\n />\n </PopoverPrimitive.Portal>\n );\n}\n\n/** Optional element the content positions against instead of the trigger. */\nfunction PopoverAnchor({ ...props }: React.ComponentProps<typeof PopoverPrimitive.Anchor>) {\n return <PopoverPrimitive.Anchor data-slot=\"popover-anchor\" {...props} />;\n}\n\n/** Stacked header slot for a title and description at the top of the content. */\nfunction PopoverHeader({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"popover-header\"\n className={cn(\"flex flex-col gap-1 text-sm\", className)}\n {...props}\n />\n );\n}\n\n/** Emphasised title line for the popover header. */\nfunction PopoverTitle({ className, ...props }: React.ComponentProps<\"h2\">) {\n return <div data-slot=\"popover-title\" className={cn(\"font-medium\", className)} {...props} />;\n}\n\n/** Muted supporting copy for the popover header. */\nfunction PopoverDescription({ className, ...props }: React.ComponentProps<\"p\">) {\n return (\n <p\n data-slot=\"popover-description\"\n className={cn(\"text-muted-foreground\", className)}\n {...props}\n />\n );\n}\n\nexport {\n Popover,\n PopoverTrigger,\n PopoverContent,\n PopoverAnchor,\n PopoverHeader,\n PopoverTitle,\n PopoverDescription,\n};\n"],"mappings":";;;;;;AAMA,SAAS,QAAQ,EAAE,GAAG,SAA6D;CACjF,OAAO,iBAAA,GAAA,kBAAA,KAACA,SAAAA,QAAiB,MAAlB;EAAuB,aAAU;EAAU,GAAI;CAAQ,CAAA;AAChE;;AAGA,SAAS,eAAe,EAAE,GAAG,SAAgE;CAC3F,OAAO,iBAAA,GAAA,kBAAA,KAACA,SAAAA,QAAiB,SAAlB;EAA0B,aAAU;EAAkB,GAAI;CAAQ,CAAA;AAC3E;;AAGA,SAAS,eAAe,EAEtB,WAEA,QAAQ,UAER,aAAa,GACb,GAAG,SACqD;CACxD,OACE,iBAAA,GAAA,kBAAA,KAACA,SAAAA,QAAiB,QAAlB,EAAA,UACE,iBAAA,GAAA,kBAAA,KAACA,SAAAA,QAAiB,SAAlB;EACE,aAAU;EACH;EACK;EACZ,WAAWC,WAAAA,GACT,4dACA,SACF;EACA,GAAI;CACL,CAAA,EACsB,CAAA;AAE7B;;AAGA,SAAS,cAAc,EAAE,GAAG,SAA+D;CACzF,OAAO,iBAAA,GAAA,kBAAA,KAACD,SAAAA,QAAiB,QAAlB;EAAyB,aAAU;EAAiB,GAAI;CAAQ,CAAA;AACzE;;AAGA,SAAS,cAAc,EAAE,WAAW,GAAG,SAAsC;CAC3E,OACE,iBAAA,GAAA,kBAAA,KAAC,OAAD;EACE,aAAU;EACV,WAAWC,WAAAA,GAAG,+BAA+B,SAAS;EACtD,GAAI;CACL,CAAA;AAEL;;AAGA,SAAS,aAAa,EAAE,WAAW,GAAG,SAAqC;CACzE,OAAO,iBAAA,GAAA,kBAAA,KAAC,OAAD;EAAK,aAAU;EAAgB,WAAWA,WAAAA,GAAG,eAAe,SAAS;EAAG,GAAI;CAAQ,CAAA;AAC7F;;AAGA,SAAS,mBAAmB,EAAE,WAAW,GAAG,SAAoC;CAC9E,OACE,iBAAA,GAAA,kBAAA,KAAC,KAAD;EACE,aAAU;EACV,WAAWA,WAAAA,GAAG,yBAAyB,SAAS;EAChD,GAAI;CACL,CAAA;AAEL"}
|
|
@@ -22,7 +22,7 @@ function PopoverContent({ className, align = "center", sideOffset = 4, ...props
|
|
|
22
22
|
"data-slot": "popover-content",
|
|
23
23
|
align,
|
|
24
24
|
sideOffset,
|
|
25
|
-
className: cn("z-50 w-72 origin-(--radix-popover-content-transform-origin) rounded-
|
|
25
|
+
className: cn("z-50 w-72 origin-(--radix-popover-content-transform-origin) rounded-lg border bg-card p-4 text-card-foreground shadow-sm outline-hidden 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 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[state=open]:animate-in data-[state=open]:fade-in-0 data-[state=open]:zoom-in-95", className),
|
|
26
26
|
...props
|
|
27
27
|
}) });
|
|
28
28
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":["PopoverPrimitive"],"sources":["../../../src/primitives/Popover/Popover.tsx"],"sourcesContent":["import { Popover as PopoverPrimitive } from \"radix-ui\";\nimport type * as React from \"react\";\n\nimport { cn } from \"@/utils\";\n\n/** Root of the popover: holds open state and coordinates the trigger and content. */\nfunction Popover({ ...props }: React.ComponentProps<typeof PopoverPrimitive.Root>) {\n return <PopoverPrimitive.Root data-slot=\"popover\" {...props} />;\n}\n\n/** The control (usually a button) that toggles the popover open and closed. */\nfunction PopoverTrigger({ ...props }: React.ComponentProps<typeof PopoverPrimitive.Trigger>) {\n return <PopoverPrimitive.Trigger data-slot=\"popover-trigger\" {...props} />;\n}\n\n/** The floating, portaled panel rendered when the popover is open. */\nfunction PopoverContent({\n /** Extra classes merged onto the content surface. */\n className,\n /** Alignment of the content relative to the trigger along the chosen side. */\n align = \"center\",\n /** Distance in px between the content and the trigger. */\n sideOffset = 4,\n ...props\n}: React.ComponentProps<typeof PopoverPrimitive.Content>) {\n return (\n <PopoverPrimitive.Portal>\n <PopoverPrimitive.Content\n data-slot=\"popover-content\"\n align={align}\n sideOffset={sideOffset}\n className={cn(\n \"z-50 w-72 origin-(--radix-popover-content-transform-origin) rounded-
|
|
1
|
+
{"version":3,"file":"index.js","names":["PopoverPrimitive"],"sources":["../../../src/primitives/Popover/Popover.tsx"],"sourcesContent":["import { Popover as PopoverPrimitive } from \"radix-ui\";\nimport type * as React from \"react\";\n\nimport { cn } from \"@/utils\";\n\n/** Root of the popover: holds open state and coordinates the trigger and content. */\nfunction Popover({ ...props }: React.ComponentProps<typeof PopoverPrimitive.Root>) {\n return <PopoverPrimitive.Root data-slot=\"popover\" {...props} />;\n}\n\n/** The control (usually a button) that toggles the popover open and closed. */\nfunction PopoverTrigger({ ...props }: React.ComponentProps<typeof PopoverPrimitive.Trigger>) {\n return <PopoverPrimitive.Trigger data-slot=\"popover-trigger\" {...props} />;\n}\n\n/** The floating, portaled panel rendered when the popover is open. */\nfunction PopoverContent({\n /** Extra classes merged onto the content surface. */\n className,\n /** Alignment of the content relative to the trigger along the chosen side. */\n align = \"center\",\n /** Distance in px between the content and the trigger. */\n sideOffset = 4,\n ...props\n}: React.ComponentProps<typeof PopoverPrimitive.Content>) {\n return (\n <PopoverPrimitive.Portal>\n <PopoverPrimitive.Content\n data-slot=\"popover-content\"\n align={align}\n sideOffset={sideOffset}\n className={cn(\n \"z-50 w-72 origin-(--radix-popover-content-transform-origin) rounded-lg border bg-card p-4 text-card-foreground shadow-sm outline-hidden 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 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[state=open]:animate-in data-[state=open]:fade-in-0 data-[state=open]:zoom-in-95\",\n className,\n )}\n {...props}\n />\n </PopoverPrimitive.Portal>\n );\n}\n\n/** Optional element the content positions against instead of the trigger. */\nfunction PopoverAnchor({ ...props }: React.ComponentProps<typeof PopoverPrimitive.Anchor>) {\n return <PopoverPrimitive.Anchor data-slot=\"popover-anchor\" {...props} />;\n}\n\n/** Stacked header slot for a title and description at the top of the content. */\nfunction PopoverHeader({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"popover-header\"\n className={cn(\"flex flex-col gap-1 text-sm\", className)}\n {...props}\n />\n );\n}\n\n/** Emphasised title line for the popover header. */\nfunction PopoverTitle({ className, ...props }: React.ComponentProps<\"h2\">) {\n return <div data-slot=\"popover-title\" className={cn(\"font-medium\", className)} {...props} />;\n}\n\n/** Muted supporting copy for the popover header. */\nfunction PopoverDescription({ className, ...props }: React.ComponentProps<\"p\">) {\n return (\n <p\n data-slot=\"popover-description\"\n className={cn(\"text-muted-foreground\", className)}\n {...props}\n />\n );\n}\n\nexport {\n Popover,\n PopoverTrigger,\n PopoverContent,\n PopoverAnchor,\n PopoverHeader,\n PopoverTitle,\n PopoverDescription,\n};\n"],"mappings":";;;;;AAMA,SAAS,QAAQ,EAAE,GAAG,SAA6D;CACjF,OAAO,oBAACA,UAAiB,MAAlB;EAAuB,aAAU;EAAU,GAAI;CAAQ,CAAA;AAChE;;AAGA,SAAS,eAAe,EAAE,GAAG,SAAgE;CAC3F,OAAO,oBAACA,UAAiB,SAAlB;EAA0B,aAAU;EAAkB,GAAI;CAAQ,CAAA;AAC3E;;AAGA,SAAS,eAAe,EAEtB,WAEA,QAAQ,UAER,aAAa,GACb,GAAG,SACqD;CACxD,OACE,oBAACA,UAAiB,QAAlB,EAAA,UACE,oBAACA,UAAiB,SAAlB;EACE,aAAU;EACH;EACK;EACZ,WAAW,GACT,4dACA,SACF;EACA,GAAI;CACL,CAAA,EACsB,CAAA;AAE7B;;AAGA,SAAS,cAAc,EAAE,GAAG,SAA+D;CACzF,OAAO,oBAACA,UAAiB,QAAlB;EAAyB,aAAU;EAAiB,GAAI;CAAQ,CAAA;AACzE;;AAGA,SAAS,cAAc,EAAE,WAAW,GAAG,SAAsC;CAC3E,OACE,oBAAC,OAAD;EACE,aAAU;EACV,WAAW,GAAG,+BAA+B,SAAS;EACtD,GAAI;CACL,CAAA;AAEL;;AAGA,SAAS,aAAa,EAAE,WAAW,GAAG,SAAqC;CACzE,OAAO,oBAAC,OAAD;EAAK,aAAU;EAAgB,WAAW,GAAG,eAAe,SAAS;EAAG,GAAI;CAAQ,CAAA;AAC7F;;AAGA,SAAS,mBAAmB,EAAE,WAAW,GAAG,SAAoC;CAC9E,OACE,oBAAC,KAAD;EACE,aAAU;EACV,WAAW,GAAG,yBAAyB,SAAS;EAChD,GAAI;CACL,CAAA;AAEL"}
|
|
@@ -14,7 +14,7 @@ const progressIndicatorVariants = {
|
|
|
14
14
|
ingesting: "bg-[var(--progress-ingesting)]"
|
|
15
15
|
};
|
|
16
16
|
const progressTrackVariants = {
|
|
17
|
-
default: "bg-
|
|
17
|
+
default: "bg-input",
|
|
18
18
|
brand: "bg-brand-surface/15",
|
|
19
19
|
success: "bg-[var(--content-success)]/15",
|
|
20
20
|
warning: "bg-[var(--content-warning)]/15",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","names":["ProgressPrimitive","cn"],"sources":["../../../src/primitives/Progress/Progress.tsx"],"sourcesContent":["import { Progress as ProgressPrimitive } from \"radix-ui\";\nimport type * as React from \"react\";\n\nimport { cn } from \"@/utils\";\n\nconst progressIndicatorVariants = {\n default: \"bg-primary\",\n // Filled in the active product's brand colour.\n brand: \"bg-brand-surface\",\n // Status colours (mode-aware, shared with Badge/Text).\n success: \"bg-[var(--content-success)]\",\n warning: \"bg-[var(--content-warning)]\",\n info: \"bg-[var(--content-info)]\",\n destructive: \"bg-destructive\",\n // Activity colours (Helix data pipeline states).\n analyzing: \"bg-[var(--progress-analyzing)]\",\n ingesting: \"bg-[var(--progress-ingesting)]\",\n} as const;\n\nconst progressTrackVariants = {\n default: \"bg-
|
|
1
|
+
{"version":3,"file":"index.cjs","names":["ProgressPrimitive","cn"],"sources":["../../../src/primitives/Progress/Progress.tsx"],"sourcesContent":["import { Progress as ProgressPrimitive } from \"radix-ui\";\nimport type * as React from \"react\";\n\nimport { cn } from \"@/utils\";\n\nconst progressIndicatorVariants = {\n default: \"bg-primary\",\n // Filled in the active product's brand colour.\n brand: \"bg-brand-surface\",\n // Status colours (mode-aware, shared with Badge/Text).\n success: \"bg-[var(--content-success)]\",\n warning: \"bg-[var(--content-warning)]\",\n info: \"bg-[var(--content-info)]\",\n destructive: \"bg-destructive\",\n // Activity colours (Helix data pipeline states).\n analyzing: \"bg-[var(--progress-analyzing)]\",\n ingesting: \"bg-[var(--progress-ingesting)]\",\n} as const;\n\nconst progressTrackVariants = {\n // Track uses the border-3 grey (Figma) rather than the muted surface.\n default: \"bg-input\",\n brand: \"bg-brand-surface/15\",\n success: \"bg-[var(--content-success)]/15\",\n warning: \"bg-[var(--content-warning)]/15\",\n info: \"bg-[var(--content-info)]/15\",\n destructive: \"bg-destructive/15\",\n analyzing: \"bg-primary/20\",\n ingesting: \"bg-primary/20\",\n} as const;\n\n/** Determinate or indeterminate progress bar built on Radix Progress, with semantic, brand, and activity colour variants. */\nfunction Progress({\n className,\n value,\n variant = \"default\",\n ...props\n}: React.ComponentProps<typeof ProgressPrimitive.Root> & {\n /** Fill colour: `default`, `brand`, status (`success`/`warning`/`info`/`destructive`), or activity (`analyzing`/`ingesting`). */\n variant?: keyof typeof progressIndicatorVariants;\n}) {\n // No `value` → indeterminate: a sliding segment signalling ongoing work.\n const indeterminate = value == null;\n return (\n <ProgressPrimitive.Root\n data-slot=\"progress\"\n value={value}\n className={cn(\n \"relative h-2 w-full overflow-hidden rounded-full\",\n progressTrackVariants[variant],\n className,\n )}\n {...props}\n >\n <ProgressPrimitive.Indicator\n data-slot=\"progress-indicator\"\n className={cn(\n \"h-full flex-1 transition-all\",\n progressIndicatorVariants[variant],\n indeterminate ? \"progress-indeterminate rounded-full\" : \"w-full\",\n )}\n style={indeterminate ? undefined : { transform: `translateX(-${100 - (value ?? 0)}%)` }}\n />\n </ProgressPrimitive.Root>\n );\n}\n\nexport { Progress };\n"],"mappings":";;;;;AAKA,MAAM,4BAA4B;CAChC,SAAS;CAET,OAAO;CAEP,SAAS;CACT,SAAS;CACT,MAAM;CACN,aAAa;CAEb,WAAW;CACX,WAAW;AACb;AAEA,MAAM,wBAAwB;CAE5B,SAAS;CACT,OAAO;CACP,SAAS;CACT,SAAS;CACT,MAAM;CACN,aAAa;CACb,WAAW;CACX,WAAW;AACb;;AAGA,SAAS,SAAS,EAChB,WACA,OACA,UAAU,WACV,GAAG,SAIF;CAED,MAAM,gBAAgB,SAAS;CAC/B,OACE,iBAAA,GAAA,kBAAA,KAACA,SAAAA,SAAkB,MAAnB;EACE,aAAU;EACH;EACP,WAAWC,WAAAA,GACT,oDACA,sBAAsB,UACtB,SACF;EACA,GAAI;YAEJ,iBAAA,GAAA,kBAAA,KAACD,SAAAA,SAAkB,WAAnB;GACE,aAAU;GACV,WAAWC,WAAAA,GACT,gCACA,0BAA0B,UAC1B,gBAAgB,wCAAwC,QAC1D;GACA,OAAO,gBAAgB,KAAA,IAAY,EAAE,WAAW,eAAe,OAAO,SAAS,GAAG,IAAI;EACvF,CAAA;CACqB,CAAA;AAE5B"}
|
|
@@ -13,7 +13,7 @@ const progressIndicatorVariants = {
|
|
|
13
13
|
ingesting: "bg-[var(--progress-ingesting)]"
|
|
14
14
|
};
|
|
15
15
|
const progressTrackVariants = {
|
|
16
|
-
default: "bg-
|
|
16
|
+
default: "bg-input",
|
|
17
17
|
brand: "bg-brand-surface/15",
|
|
18
18
|
success: "bg-[var(--content-success)]/15",
|
|
19
19
|
warning: "bg-[var(--content-warning)]/15",
|