@psnext/design-system 2.3.0 → 2.5.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/DESIGN.md +493 -8
- package/README.md +3 -3
- package/SKILL.md +84 -6
- package/bin/install-agent-skill.mjs +39 -7
- package/dist/Header.cjs +152 -21
- package/dist/Header.cjs.map +1 -1
- package/dist/Header.js +152 -21
- package/dist/Header.js.map +1 -1
- package/dist/Icon.cjs +40 -8
- package/dist/Icon.cjs.map +1 -1
- package/dist/Icon.js +40 -8
- package/dist/Icon.js.map +1 -1
- package/dist/Mosaic.cjs +472 -0
- package/dist/Mosaic.cjs.map +1 -0
- package/dist/Mosaic.js +459 -0
- package/dist/Mosaic.js.map +1 -0
- package/dist/MultiColumn.cjs +354 -0
- package/dist/MultiColumn.cjs.map +1 -0
- package/dist/MultiColumn.js +335 -0
- package/dist/MultiColumn.js.map +1 -0
- package/dist/Sidebar.cjs +4 -3
- package/dist/Sidebar.cjs.map +1 -1
- package/dist/Sidebar.js +4 -3
- package/dist/Sidebar.js.map +1 -1
- package/dist/index.cjs +18 -3
- 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 +9 -4
- package/dist/index10.d.cts +6 -6
- package/dist/index10.d.cts.map +1 -1
- package/dist/index10.d.ts +6 -6
- package/dist/index11.d.cts +3 -3
- package/dist/index11.d.cts.map +1 -1
- 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/index13.d.cts +6 -6
- package/dist/index13.d.cts.map +1 -1
- 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 +58 -23
- package/dist/index15.d.cts.map +1 -1
- package/dist/index15.d.ts +58 -23
- package/dist/index15.d.ts.map +1 -1
- package/dist/index16.d.cts +23 -32
- package/dist/index16.d.cts.map +1 -1
- package/dist/index16.d.ts +23 -32
- package/dist/index16.d.ts.map +1 -1
- package/dist/index17.d.cts +34 -15
- package/dist/index17.d.cts.map +1 -1
- package/dist/index17.d.ts +34 -15
- package/dist/index17.d.ts.map +1 -1
- package/dist/index18.d.cts +13 -67
- package/dist/index18.d.cts.map +1 -1
- package/dist/index18.d.ts +13 -67
- package/dist/index18.d.ts.map +1 -1
- package/dist/index19.d.cts +55 -48
- package/dist/index19.d.cts.map +1 -1
- package/dist/index19.d.ts +55 -48
- package/dist/index19.d.ts.map +1 -1
- package/dist/index2.d.cts +8 -8
- package/dist/index2.d.ts +9 -9
- package/dist/index20.d.cts +45 -75
- package/dist/index20.d.cts.map +1 -1
- package/dist/index20.d.ts +45 -75
- package/dist/index20.d.ts.map +1 -1
- package/dist/index21.d.cts +90 -28
- package/dist/index21.d.cts.map +1 -1
- package/dist/index21.d.ts +90 -28
- package/dist/index21.d.ts.map +1 -1
- package/dist/index22.d.cts +28 -56
- package/dist/index22.d.cts.map +1 -1
- package/dist/index22.d.ts +28 -56
- package/dist/index22.d.ts.map +1 -1
- package/dist/index23.d.cts +53 -78
- package/dist/index23.d.cts.map +1 -1
- package/dist/index23.d.ts +53 -78
- package/dist/index23.d.ts.map +1 -1
- package/dist/index24.d.cts +83 -33
- package/dist/index24.d.cts.map +1 -1
- package/dist/index24.d.ts +83 -33
- package/dist/index24.d.ts.map +1 -1
- package/dist/index25.d.cts +43 -11
- package/dist/index25.d.cts.map +1 -1
- package/dist/index25.d.ts +43 -11
- package/dist/index25.d.ts.map +1 -1
- package/dist/index26.d.cts +11 -74
- package/dist/index26.d.cts.map +1 -1
- package/dist/index26.d.ts +11 -74
- package/dist/index26.d.ts.map +1 -1
- package/dist/index27.d.cts +68 -59
- package/dist/index27.d.cts.map +1 -1
- package/dist/index27.d.ts +68 -59
- package/dist/index27.d.ts.map +1 -1
- package/dist/index28.d.cts +47 -30
- package/dist/index28.d.cts.map +1 -1
- package/dist/index28.d.ts +47 -30
- package/dist/index28.d.ts.map +1 -1
- package/dist/index29.d.cts +63 -17
- package/dist/index29.d.cts.map +1 -1
- package/dist/index29.d.ts +63 -17
- package/dist/index29.d.ts.map +1 -1
- package/dist/index3.d.cts +13 -13
- package/dist/index3.d.ts +13 -13
- package/dist/index30.d.cts +29 -51
- package/dist/index30.d.cts.map +1 -1
- package/dist/index30.d.ts +30 -52
- package/dist/index30.d.ts.map +1 -1
- package/dist/index31.d.cts +19 -34
- package/dist/index31.d.cts.map +1 -1
- package/dist/index31.d.ts +19 -34
- package/dist/index31.d.ts.map +1 -1
- package/dist/index32.d.cts +80 -18
- package/dist/index32.d.cts.map +1 -1
- package/dist/index32.d.ts +79 -17
- package/dist/index32.d.ts.map +1 -1
- package/dist/index33.d.cts +32 -51
- package/dist/index33.d.cts.map +1 -1
- package/dist/index33.d.ts +33 -52
- package/dist/index33.d.ts.map +1 -1
- package/dist/index34.d.cts +19 -36
- package/dist/index34.d.cts.map +1 -1
- package/dist/index34.d.ts +19 -36
- package/dist/index34.d.ts.map +1 -1
- package/dist/index35.d.cts +43 -61
- package/dist/index35.d.cts.map +1 -1
- package/dist/index35.d.ts +44 -62
- package/dist/index35.d.ts.map +1 -1
- package/dist/index36.d.cts +35 -11
- package/dist/index36.d.cts.map +1 -1
- package/dist/index36.d.ts +35 -11
- package/dist/index36.d.ts.map +1 -1
- package/dist/index37.d.cts +68 -20
- package/dist/index37.d.cts.map +1 -1
- package/dist/index37.d.ts +69 -21
- package/dist/index37.d.ts.map +1 -1
- package/dist/index38.d.cts +14 -15
- package/dist/index38.d.cts.map +1 -1
- package/dist/index38.d.ts +14 -15
- package/dist/index38.d.ts.map +1 -1
- package/dist/index39.d.cts +22 -98
- package/dist/index39.d.cts.map +1 -1
- package/dist/index39.d.ts +22 -98
- package/dist/index39.d.ts.map +1 -1
- package/dist/index4.d.cts +2 -2
- package/dist/index4.d.cts.map +1 -1
- package/dist/index4.d.ts +2 -2
- package/dist/index40.d.cts +15 -17
- package/dist/index40.d.cts.map +1 -1
- package/dist/index40.d.ts +15 -17
- package/dist/index40.d.ts.map +1 -1
- package/dist/index41.d.cts +84 -35
- package/dist/index41.d.cts.map +1 -1
- package/dist/index41.d.ts +84 -35
- package/dist/index41.d.ts.map +1 -1
- package/dist/index42.d.cts +118 -38
- package/dist/index42.d.cts.map +1 -1
- package/dist/index42.d.ts +118 -38
- package/dist/index42.d.ts.map +1 -1
- package/dist/index43.d.cts +15 -89
- package/dist/index43.d.cts.map +1 -1
- package/dist/index43.d.ts +15 -89
- package/dist/index43.d.ts.map +1 -1
- package/dist/index44.d.cts +56 -1
- package/dist/index44.d.cts.map +1 -0
- package/dist/index44.d.ts +56 -1
- package/dist/index44.d.ts.map +1 -0
- package/dist/index45.d.cts +31 -34
- package/dist/index45.d.cts.map +1 -1
- package/dist/index45.d.ts +31 -34
- package/dist/index45.d.ts.map +1 -1
- package/dist/index46.d.cts +89 -21
- package/dist/index46.d.cts.map +1 -1
- package/dist/index46.d.ts +89 -21
- package/dist/index46.d.ts.map +1 -1
- package/dist/index47.d.cts +1 -41
- package/dist/index47.d.ts +1 -41
- package/dist/index48.d.cts +122 -20
- package/dist/index48.d.cts.map +1 -1
- package/dist/index48.d.ts +122 -20
- package/dist/index48.d.ts.map +1 -1
- package/dist/index49.d.cts +40 -13
- package/dist/index49.d.cts.map +1 -1
- package/dist/index49.d.ts +40 -13
- 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/index50.d.cts +22 -63
- package/dist/index50.d.cts.map +1 -1
- package/dist/index50.d.ts +22 -63
- package/dist/index50.d.ts.map +1 -1
- package/dist/index51.d.cts +33 -55
- package/dist/index51.d.cts.map +1 -1
- package/dist/index51.d.ts +33 -55
- package/dist/index51.d.ts.map +1 -1
- package/dist/index52.d.cts +18 -24
- package/dist/index52.d.cts.map +1 -1
- package/dist/index52.d.ts +18 -24
- package/dist/index52.d.ts.map +1 -1
- package/dist/index53.d.cts +12 -200
- package/dist/index53.d.cts.map +1 -1
- package/dist/index53.d.ts +12 -200
- package/dist/index53.d.ts.map +1 -1
- package/dist/index54.d.cts +58 -15
- package/dist/index54.d.cts.map +1 -1
- package/dist/index54.d.ts +58 -15
- package/dist/index54.d.ts.map +1 -1
- package/dist/index55.d.cts +93 -23
- package/dist/index55.d.cts.map +1 -1
- package/dist/index55.d.ts +93 -23
- package/dist/index55.d.ts.map +1 -1
- package/dist/index56.d.cts +27 -21
- package/dist/index56.d.cts.map +1 -1
- package/dist/index56.d.ts +27 -21
- package/dist/index56.d.ts.map +1 -1
- package/dist/index57.d.cts +203 -6
- package/dist/index57.d.cts.map +1 -1
- package/dist/index57.d.ts +203 -6
- package/dist/index57.d.ts.map +1 -1
- package/dist/index58.d.cts +17 -41
- package/dist/index58.d.cts.map +1 -1
- package/dist/index58.d.ts +17 -41
- package/dist/index58.d.ts.map +1 -1
- package/dist/index59.d.cts +24 -47
- package/dist/index59.d.cts.map +1 -1
- package/dist/index59.d.ts +24 -47
- 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 +6 -6
- package/dist/index60.d.cts +19 -57
- package/dist/index60.d.cts.map +1 -1
- package/dist/index60.d.ts +19 -57
- package/dist/index60.d.ts.map +1 -1
- package/dist/index61.d.cts +6 -39
- package/dist/index61.d.cts.map +1 -1
- package/dist/index61.d.ts +6 -39
- package/dist/index61.d.ts.map +1 -1
- package/dist/index62.d.cts +44 -18
- package/dist/index62.d.cts.map +1 -1
- package/dist/index62.d.ts +44 -18
- package/dist/index62.d.ts.map +1 -1
- package/dist/index63.d.cts +47 -41
- package/dist/index63.d.cts.map +1 -1
- package/dist/index63.d.ts +47 -41
- package/dist/index63.d.ts.map +1 -1
- package/dist/index64.d.cts +55 -15
- package/dist/index64.d.cts.map +1 -1
- package/dist/index64.d.ts +54 -14
- package/dist/index64.d.ts.map +1 -1
- package/dist/index65.d.cts +36 -39
- package/dist/index65.d.cts.map +1 -1
- package/dist/index65.d.ts +37 -40
- package/dist/index65.d.ts.map +1 -1
- package/dist/index66.d.cts +16 -17
- package/dist/index66.d.cts.map +1 -1
- package/dist/index66.d.ts +17 -18
- package/dist/index66.d.ts.map +1 -1
- package/dist/index67.d.cts +40 -14
- package/dist/index67.d.cts.map +1 -1
- package/dist/index67.d.ts +40 -14
- package/dist/index67.d.ts.map +1 -1
- package/dist/index68.d.cts +16 -30
- package/dist/index68.d.cts.map +1 -1
- package/dist/index68.d.ts +17 -31
- package/dist/index68.d.ts.map +1 -1
- package/dist/index69.d.cts +39 -27
- package/dist/index69.d.cts.map +1 -1
- package/dist/index69.d.ts +40 -28
- package/dist/index69.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 +22 -78
- package/dist/index70.d.cts.map +1 -1
- package/dist/index70.d.ts +22 -78
- package/dist/index70.d.ts.map +1 -1
- package/dist/index71.d.cts +77 -251
- package/dist/index71.d.cts.map +1 -1
- package/dist/index71.d.ts +77 -251
- package/dist/index71.d.ts.map +1 -1
- package/dist/index72.d.cts +19 -0
- package/dist/index72.d.cts.map +1 -0
- package/dist/index72.d.ts +19 -0
- package/dist/index72.d.ts.map +1 -0
- package/dist/index73.d.cts +37 -0
- package/dist/index73.d.cts.map +1 -0
- package/dist/index73.d.ts +37 -0
- package/dist/index73.d.ts.map +1 -0
- package/dist/index74.d.cts +36 -0
- package/dist/index74.d.cts.map +1 -0
- package/dist/index74.d.ts +36 -0
- package/dist/index74.d.ts.map +1 -0
- package/dist/index75.d.cts +86 -0
- package/dist/index75.d.cts.map +1 -0
- package/dist/index75.d.ts +86 -0
- package/dist/index75.d.ts.map +1 -0
- package/dist/index76.d.cts +278 -0
- package/dist/index76.d.cts.map +1 -0
- package/dist/index76.d.ts +278 -0
- package/dist/index76.d.ts.map +1 -0
- package/dist/index8.d.cts +4 -4
- package/dist/index8.d.ts +5 -5
- package/dist/index9.d.cts +2 -2
- package/dist/index9.d.ts +2 -2
- package/dist/index9.d.ts.map +1 -1
- package/dist/layouts/Container/index.cjs +2 -1
- package/dist/layouts/Container/index.cjs.map +1 -1
- package/dist/layouts/Container/index.d.cts +1 -1
- package/dist/layouts/Container/index.d.ts +1 -1
- package/dist/layouts/Container/index.js +1 -1
- package/dist/layouts/MultiColumn/index.cjs +5 -0
- package/dist/layouts/MultiColumn/index.d.cts +2 -0
- package/dist/layouts/MultiColumn/index.d.ts +2 -0
- package/dist/layouts/MultiColumn/index.js +2 -0
- package/dist/layouts/PageBackground/index.d.cts +1 -1
- package/dist/layouts/PageBackground/index.d.ts +1 -1
- package/dist/layouts/Stack/index.cjs +2 -1
- package/dist/layouts/Stack/index.cjs.map +1 -1
- package/dist/layouts/Stack/index.d.cts +1 -1
- package/dist/layouts/Stack/index.d.ts +1 -1
- package/dist/layouts/Stack/index.js +1 -1
- package/dist/layouts/TwoColumn/index.cjs +2 -1
- package/dist/layouts/TwoColumn/index.cjs.map +1 -1
- package/dist/layouts/TwoColumn/index.d.cts +1 -1
- package/dist/layouts/TwoColumn/index.d.ts +1 -1
- package/dist/layouts/TwoColumn/index.js +1 -1
- package/dist/layouts/index.cjs +4 -0
- package/dist/layouts/index.d.cts +6 -5
- package/dist/layouts/index.d.ts +6 -5
- package/dist/layouts/index.js +2 -1
- package/dist/patterns/DataTable/index.cjs +6 -2
- package/dist/patterns/DataTable/index.cjs.map +1 -1
- package/dist/patterns/DataTable/index.d.cts +3 -3
- package/dist/patterns/DataTable/index.d.cts.map +1 -1
- package/dist/patterns/DataTable/index.d.ts +3 -3
- package/dist/patterns/DataTable/index.d.ts.map +1 -1
- package/dist/patterns/DataTable/index.js +6 -2
- package/dist/patterns/DataTable/index.js.map +1 -1
- package/dist/patterns/Footer/index.d.cts +7 -7
- package/dist/patterns/Footer/index.d.cts.map +1 -1
- package/dist/patterns/Footer/index.d.ts +7 -7
- package/dist/patterns/Footer/index.d.ts.map +1 -1
- package/dist/patterns/Header/index.d.cts +1 -1
- package/dist/patterns/Header/index.d.ts +1 -1
- package/dist/patterns/MediaObject/index.cjs +1 -1
- package/dist/patterns/MediaObject/index.d.cts +14 -14
- package/dist/patterns/MediaObject/index.d.cts.map +1 -1
- package/dist/patterns/MediaObject/index.d.ts +12 -12
- package/dist/patterns/MediaObject/index.js +1 -1
- package/dist/patterns/NavRail/index.cjs +4 -2
- package/dist/patterns/NavRail/index.cjs.map +1 -1
- package/dist/patterns/NavRail/index.d.cts +1 -1
- package/dist/patterns/NavRail/index.d.ts +1 -1
- package/dist/patterns/NavRail/index.js +4 -2
- package/dist/patterns/NavRail/index.js.map +1 -1
- package/dist/patterns/SectionCard/index.d.cts +2 -2
- package/dist/patterns/SectionCard/index.d.cts.map +1 -1
- 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 +3 -3
- package/dist/patterns/SectionHeading/index.d.cts.map +1 -1
- package/dist/patterns/SectionHeading/index.d.ts +3 -3
- package/dist/patterns/SectionHeading/index.d.ts.map +1 -1
- package/dist/patterns/index.d.cts +2 -2
- package/dist/patterns/index.d.ts +2 -2
- package/dist/primitives/Accordion/index.cjs +6 -2
- package/dist/primitives/Accordion/index.cjs.map +1 -1
- package/dist/primitives/Accordion/index.js +6 -2
- package/dist/primitives/Accordion/index.js.map +1 -1
- package/dist/primitives/Alert/index.cjs +2 -1
- package/dist/primitives/Alert/index.cjs.map +1 -1
- package/dist/primitives/Alert/index.js +1 -1
- package/dist/primitives/AlertDialog/index.cjs +1 -1
- package/dist/primitives/AlertDialog/index.js +1 -1
- package/dist/primitives/AspectRatio/index.cjs +1 -1
- package/dist/primitives/AspectRatio/index.js +1 -1
- package/dist/primitives/Avatar/index.cjs +1 -1
- package/dist/primitives/Avatar/index.js +1 -1
- package/dist/primitives/Badge/index.cjs +3 -2
- package/dist/primitives/Badge/index.cjs.map +1 -1
- package/dist/primitives/Badge/index.js +2 -2
- package/dist/primitives/Breadcrumb/index.cjs +7 -3
- package/dist/primitives/Breadcrumb/index.cjs.map +1 -1
- package/dist/primitives/Breadcrumb/index.js +7 -3
- package/dist/primitives/Breadcrumb/index.js.map +1 -1
- package/dist/primitives/Button/index.cjs +3 -2
- package/dist/primitives/Button/index.cjs.map +1 -1
- package/dist/primitives/Button/index.js +2 -2
- package/dist/primitives/ButtonGroup/index.cjs +3 -2
- package/dist/primitives/ButtonGroup/index.cjs.map +1 -1
- package/dist/primitives/ButtonGroup/index.js +2 -2
- package/dist/primitives/Calendar/index.cjs +12 -11
- package/dist/primitives/Calendar/index.cjs.map +1 -1
- package/dist/primitives/Calendar/index.js +12 -11
- package/dist/primitives/Calendar/index.js.map +1 -1
- package/dist/primitives/Card/index.cjs +2 -1
- package/dist/primitives/Card/index.cjs.map +1 -1
- package/dist/primitives/Card/index.js +1 -1
- package/dist/primitives/Carousel/index.cjs +4 -3
- package/dist/primitives/Carousel/index.cjs.map +1 -1
- package/dist/primitives/Carousel/index.js +4 -3
- package/dist/primitives/Carousel/index.js.map +1 -1
- package/dist/primitives/Checkbox/index.cjs +10 -3
- package/dist/primitives/Checkbox/index.cjs.map +1 -1
- package/dist/primitives/Checkbox/index.d.cts +1 -1
- package/dist/primitives/Checkbox/index.d.ts +1 -1
- package/dist/primitives/Checkbox/index.js +10 -3
- package/dist/primitives/Checkbox/index.js.map +1 -1
- package/dist/primitives/CheckboxTree/index.cjs +6 -2
- package/dist/primitives/CheckboxTree/index.cjs.map +1 -1
- package/dist/primitives/CheckboxTree/index.d.cts +1 -1
- package/dist/primitives/CheckboxTree/index.d.ts +1 -1
- package/dist/primitives/CheckboxTree/index.js +6 -2
- package/dist/primitives/CheckboxTree/index.js.map +1 -1
- package/dist/primitives/CircularProgress/index.cjs +106 -0
- package/dist/primitives/CircularProgress/index.cjs.map +1 -0
- package/dist/primitives/CircularProgress/index.d.cts +2 -0
- package/dist/primitives/CircularProgress/index.d.ts +2 -0
- package/dist/primitives/CircularProgress/index.js +105 -0
- package/dist/primitives/CircularProgress/index.js.map +1 -0
- package/dist/primitives/Collapsible/index.cjs +1 -1
- package/dist/primitives/Collapsible/index.d.cts +1 -1
- package/dist/primitives/Collapsible/index.d.ts +1 -1
- package/dist/primitives/Collapsible/index.js +1 -1
- package/dist/primitives/Command/index.cjs +6 -2
- package/dist/primitives/Command/index.cjs.map +1 -1
- package/dist/primitives/Command/index.d.cts +1 -1
- package/dist/primitives/Command/index.d.ts +1 -1
- package/dist/primitives/Command/index.js +6 -2
- package/dist/primitives/Command/index.js.map +1 -1
- package/dist/primitives/ContextMenu/index.cjs +14 -4
- package/dist/primitives/ContextMenu/index.cjs.map +1 -1
- package/dist/primitives/ContextMenu/index.d.cts +1 -1
- package/dist/primitives/ContextMenu/index.d.ts +1 -1
- package/dist/primitives/ContextMenu/index.js +14 -4
- package/dist/primitives/ContextMenu/index.js.map +1 -1
- package/dist/primitives/Credits/index.cjs +8 -3
- package/dist/primitives/Credits/index.cjs.map +1 -1
- package/dist/primitives/Credits/index.d.cts +1 -1
- package/dist/primitives/Credits/index.d.ts +1 -1
- package/dist/primitives/Credits/index.js +7 -3
- package/dist/primitives/Credits/index.js.map +1 -1
- package/dist/primitives/Dialog/index.cjs +3 -2
- package/dist/primitives/Dialog/index.cjs.map +1 -1
- package/dist/primitives/Dialog/index.d.cts +1 -1
- package/dist/primitives/Dialog/index.d.ts +1 -1
- package/dist/primitives/Dialog/index.js +3 -2
- package/dist/primitives/Dialog/index.js.map +1 -1
- package/dist/primitives/Drawer/index.cjs +34 -2
- package/dist/primitives/Drawer/index.cjs.map +1 -1
- package/dist/primitives/Drawer/index.d.cts +1 -1
- package/dist/primitives/Drawer/index.d.ts +1 -1
- package/dist/primitives/Drawer/index.js +34 -2
- package/dist/primitives/Drawer/index.js.map +1 -1
- package/dist/primitives/DropdownMenu/index.cjs +14 -4
- package/dist/primitives/DropdownMenu/index.cjs.map +1 -1
- package/dist/primitives/DropdownMenu/index.d.cts +1 -1
- package/dist/primitives/DropdownMenu/index.d.ts +1 -1
- package/dist/primitives/DropdownMenu/index.js +14 -4
- package/dist/primitives/DropdownMenu/index.js.map +1 -1
- package/dist/primitives/Empty/index.cjs +1 -1
- package/dist/primitives/Empty/index.d.cts +1 -1
- package/dist/primitives/Empty/index.d.ts +1 -1
- package/dist/primitives/Empty/index.js +1 -1
- package/dist/primitives/Field/index.cjs +1 -1
- package/dist/primitives/Field/index.d.cts +1 -1
- package/dist/primitives/Field/index.d.ts +1 -1
- package/dist/primitives/Field/index.js +1 -1
- package/dist/primitives/FileUpload/index.cjs +354 -0
- package/dist/primitives/FileUpload/index.cjs.map +1 -0
- package/dist/primitives/FileUpload/index.d.cts +2 -0
- package/dist/primitives/FileUpload/index.d.ts +2 -0
- package/dist/primitives/FileUpload/index.js +351 -0
- package/dist/primitives/FileUpload/index.js.map +1 -0
- package/dist/primitives/Form/index.cjs +1 -1
- package/dist/primitives/Form/index.d.cts +1 -1
- package/dist/primitives/Form/index.d.ts +1 -1
- package/dist/primitives/Form/index.js +1 -1
- package/dist/primitives/Heading/index.cjs +2 -1
- package/dist/primitives/Heading/index.cjs.map +1 -1
- package/dist/primitives/Heading/index.d.cts +1 -1
- package/dist/primitives/Heading/index.d.ts +1 -1
- package/dist/primitives/Heading/index.js +1 -1
- package/dist/primitives/HoverCard/index.cjs +1 -1
- package/dist/primitives/HoverCard/index.d.cts +1 -1
- package/dist/primitives/HoverCard/index.d.ts +1 -1
- package/dist/primitives/HoverCard/index.js +1 -1
- package/dist/primitives/Icon/index.d.cts +1 -1
- package/dist/primitives/Icon/index.d.ts +1 -1
- package/dist/primitives/InfoBanner/index.cjs +6 -3
- package/dist/primitives/InfoBanner/index.cjs.map +1 -1
- package/dist/primitives/InfoBanner/index.d.cts +1 -1
- package/dist/primitives/InfoBanner/index.d.ts +1 -1
- package/dist/primitives/InfoBanner/index.js +5 -3
- package/dist/primitives/InfoBanner/index.js.map +1 -1
- package/dist/primitives/Input/index.cjs +2 -1
- package/dist/primitives/Input/index.cjs.map +1 -1
- package/dist/primitives/Input/index.d.cts +1 -1
- package/dist/primitives/Input/index.d.ts +1 -1
- package/dist/primitives/Input/index.js +1 -1
- package/dist/primitives/InputGroup/index.cjs +1 -1
- package/dist/primitives/InputGroup/index.d.cts +1 -1
- package/dist/primitives/InputGroup/index.d.ts +1 -1
- package/dist/primitives/InputGroup/index.js +1 -1
- package/dist/primitives/InputOtp/index.cjs +3 -2
- package/dist/primitives/InputOtp/index.cjs.map +1 -1
- package/dist/primitives/InputOtp/index.d.cts +1 -1
- package/dist/primitives/InputOtp/index.d.ts +1 -1
- package/dist/primitives/InputOtp/index.js +3 -2
- package/dist/primitives/InputOtp/index.js.map +1 -1
- package/dist/primitives/Item/index.cjs +2 -2
- package/dist/primitives/Item/index.d.cts +1 -1
- package/dist/primitives/Item/index.d.ts +1 -1
- package/dist/primitives/Item/index.js +2 -2
- package/dist/primitives/Kbd/index.d.cts +1 -1
- package/dist/primitives/Kbd/index.d.ts +1 -1
- package/dist/primitives/Label/index.cjs +1 -1
- package/dist/primitives/Label/index.d.cts +1 -1
- package/dist/primitives/Label/index.d.ts +1 -1
- package/dist/primitives/Label/index.js +1 -1
- package/dist/primitives/Link/index.cjs +3 -2
- package/dist/primitives/Link/index.cjs.map +1 -1
- package/dist/primitives/Link/index.d.cts +1 -1
- package/dist/primitives/Link/index.d.ts +1 -1
- package/dist/primitives/Link/index.js +2 -2
- package/dist/primitives/Logo/index.d.cts +1 -1
- package/dist/primitives/Logo/index.d.ts +1 -1
- package/dist/primitives/Menubar/index.cjs +14 -4
- package/dist/primitives/Menubar/index.cjs.map +1 -1
- package/dist/primitives/Menubar/index.d.cts +1 -1
- package/dist/primitives/Menubar/index.d.ts +1 -1
- package/dist/primitives/Menubar/index.js +14 -4
- package/dist/primitives/Menubar/index.js.map +1 -1
- package/dist/primitives/Mosaic/index.cjs +4 -0
- package/dist/primitives/Mosaic/index.d.cts +2 -0
- package/dist/primitives/Mosaic/index.d.ts +2 -0
- package/dist/primitives/Mosaic/index.js +2 -0
- package/dist/primitives/NativeSelect/index.cjs +6 -3
- package/dist/primitives/NativeSelect/index.cjs.map +1 -1
- package/dist/primitives/NativeSelect/index.d.cts +1 -1
- package/dist/primitives/NativeSelect/index.d.ts +1 -1
- package/dist/primitives/NativeSelect/index.js +5 -3
- package/dist/primitives/NativeSelect/index.js.map +1 -1
- package/dist/primitives/NavRail/index.d.cts +2 -2
- package/dist/primitives/NavRail/index.d.ts +2 -2
- package/dist/primitives/NavigationMenu/index.cjs +5 -3
- package/dist/primitives/NavigationMenu/index.cjs.map +1 -1
- package/dist/primitives/NavigationMenu/index.d.cts +1 -1
- package/dist/primitives/NavigationMenu/index.d.ts +1 -1
- package/dist/primitives/NavigationMenu/index.js +5 -3
- package/dist/primitives/NavigationMenu/index.js.map +1 -1
- package/dist/primitives/NotchedCard/index.cjs +390 -0
- package/dist/primitives/NotchedCard/index.cjs.map +1 -0
- package/dist/primitives/NotchedCard/index.d.cts +2 -0
- package/dist/primitives/NotchedCard/index.d.ts +2 -0
- package/dist/primitives/NotchedCard/index.js +385 -0
- package/dist/primitives/NotchedCard/index.js.map +1 -0
- package/dist/primitives/Pagination/index.cjs +6 -2
- package/dist/primitives/Pagination/index.cjs.map +1 -1
- package/dist/primitives/Pagination/index.d.cts +1 -1
- package/dist/primitives/Pagination/index.d.ts +1 -1
- package/dist/primitives/Pagination/index.js +6 -2
- package/dist/primitives/Pagination/index.js.map +1 -1
- package/dist/primitives/Popover/index.cjs +1 -1
- package/dist/primitives/Popover/index.d.cts +1 -1
- package/dist/primitives/Popover/index.d.ts +1 -1
- package/dist/primitives/Popover/index.js +1 -1
- package/dist/primitives/Progress/index.cjs +1 -1
- package/dist/primitives/Progress/index.d.cts +1 -1
- package/dist/primitives/Progress/index.d.ts +1 -1
- package/dist/primitives/Progress/index.js +1 -1
- package/dist/primitives/RadioGroup/index.cjs +7 -3
- package/dist/primitives/RadioGroup/index.cjs.map +1 -1
- package/dist/primitives/RadioGroup/index.d.cts +1 -1
- package/dist/primitives/RadioGroup/index.d.ts +1 -1
- package/dist/primitives/RadioGroup/index.js +7 -3
- package/dist/primitives/RadioGroup/index.js.map +1 -1
- package/dist/primitives/Resizable/index.cjs +6 -2
- package/dist/primitives/Resizable/index.cjs.map +1 -1
- package/dist/primitives/Resizable/index.d.cts +1 -1
- package/dist/primitives/Resizable/index.d.ts +1 -1
- package/dist/primitives/Resizable/index.js +6 -2
- package/dist/primitives/Resizable/index.js.map +1 -1
- package/dist/primitives/ScrollArea/index.cjs +1 -1
- package/dist/primitives/ScrollArea/index.d.cts +1 -1
- package/dist/primitives/ScrollArea/index.d.ts +1 -1
- package/dist/primitives/ScrollArea/index.js +1 -1
- package/dist/primitives/Select/index.cjs +18 -5
- package/dist/primitives/Select/index.cjs.map +1 -1
- package/dist/primitives/Select/index.d.cts +1 -1
- package/dist/primitives/Select/index.d.ts +1 -1
- package/dist/primitives/Select/index.js +18 -5
- package/dist/primitives/Select/index.js.map +1 -1
- package/dist/primitives/Separator/index.cjs +1 -1
- package/dist/primitives/Separator/index.js +1 -1
- package/dist/primitives/Sheet/index.cjs +40 -4
- package/dist/primitives/Sheet/index.cjs.map +1 -1
- package/dist/primitives/Sheet/index.d.cts +1 -1
- package/dist/primitives/Sheet/index.d.ts +1 -1
- package/dist/primitives/Sheet/index.js +40 -4
- package/dist/primitives/Sheet/index.js.map +1 -1
- package/dist/primitives/Sidebar/index.d.cts +1 -1
- package/dist/primitives/Sidebar/index.d.ts +1 -1
- package/dist/primitives/Skeleton/index.d.cts +1 -1
- package/dist/primitives/Skeleton/index.d.ts +1 -1
- package/dist/primitives/Slider/index.cjs +1 -1
- package/dist/primitives/Slider/index.d.cts +1 -1
- package/dist/primitives/Slider/index.d.ts +1 -1
- package/dist/primitives/Slider/index.js +1 -1
- package/dist/primitives/Sonner/index.cjs +22 -6
- package/dist/primitives/Sonner/index.cjs.map +1 -1
- package/dist/primitives/Sonner/index.d.cts +1 -1
- package/dist/primitives/Sonner/index.d.ts +1 -1
- package/dist/primitives/Sonner/index.js +22 -6
- package/dist/primitives/Sonner/index.js.map +1 -1
- package/dist/primitives/Spinner/index.cjs +4 -2
- package/dist/primitives/Spinner/index.cjs.map +1 -1
- package/dist/primitives/Spinner/index.d.cts +1 -1
- package/dist/primitives/Spinner/index.d.ts +1 -1
- package/dist/primitives/Spinner/index.js +4 -2
- package/dist/primitives/Spinner/index.js.map +1 -1
- package/dist/primitives/Switch/index.cjs +1 -1
- package/dist/primitives/Switch/index.d.cts +1 -1
- package/dist/primitives/Switch/index.d.ts +1 -1
- package/dist/primitives/Switch/index.js +1 -1
- package/dist/primitives/Table/index.d.cts +1 -1
- package/dist/primitives/Table/index.d.ts +1 -1
- package/dist/primitives/Tabs/index.cjs +2 -2
- package/dist/primitives/Tabs/index.d.cts +1 -1
- package/dist/primitives/Tabs/index.d.ts +1 -1
- package/dist/primitives/Tabs/index.js +2 -2
- package/dist/primitives/Text/index.cjs +2 -1
- package/dist/primitives/Text/index.cjs.map +1 -1
- package/dist/primitives/Text/index.d.cts +1 -1
- package/dist/primitives/Text/index.d.ts +1 -1
- package/dist/primitives/Text/index.js +1 -1
- package/dist/primitives/Textarea/index.cjs +2 -1
- package/dist/primitives/Textarea/index.cjs.map +1 -1
- package/dist/primitives/Textarea/index.d.cts +1 -1
- package/dist/primitives/Textarea/index.d.ts +1 -1
- package/dist/primitives/Textarea/index.js +1 -1
- package/dist/primitives/ThemeProvider/index.d.cts +1 -1
- package/dist/primitives/ThemeProvider/index.d.ts +1 -1
- package/dist/primitives/Toggle/index.cjs +3 -2
- package/dist/primitives/Toggle/index.cjs.map +1 -1
- package/dist/primitives/Toggle/index.d.cts +1 -1
- package/dist/primitives/Toggle/index.d.ts +1 -1
- package/dist/primitives/Toggle/index.js +2 -2
- package/dist/primitives/ToggleGroup/index.cjs +1 -1
- package/dist/primitives/ToggleGroup/index.d.cts +1 -1
- package/dist/primitives/ToggleGroup/index.d.ts +1 -1
- package/dist/primitives/ToggleGroup/index.js +1 -1
- package/dist/primitives/Tooltip/index.cjs +1 -1
- package/dist/primitives/Tooltip/index.d.cts +1 -1
- package/dist/primitives/Tooltip/index.d.ts +1 -1
- package/dist/primitives/Tooltip/index.js +1 -1
- package/dist/primitives/index.cjs +14 -3
- package/dist/primitives/index.d.cts +55 -51
- package/dist/primitives/index.d.ts +55 -51
- package/dist/primitives/index.js +8 -4
- package/package.json +2 -1
- package/dist/index47.d.cts.map +0 -1
- package/dist/index47.d.ts.map +0 -1
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
import { t as cn } from "../../cn.js";
|
|
2
|
+
import { t as Icon } from "../../Icon.js";
|
|
2
3
|
import { Button } from "../Button/index.js";
|
|
3
4
|
import * as React from "react";
|
|
4
|
-
import { ArrowLeft, ArrowRight } from "lucide-react";
|
|
5
5
|
import { jsx, jsxs } from "react/jsx-runtime";
|
|
6
|
+
import { ArrowLeft, ArrowRight } from "lucide-react";
|
|
6
7
|
import useEmblaCarousel from "embla-carousel-react";
|
|
7
8
|
//#region src/primitives/Carousel/Carousel.tsx
|
|
8
9
|
const CarouselContext = React.createContext(null);
|
|
@@ -109,7 +110,7 @@ function CarouselPrevious({ className, variant = "outline", size = "icon", ...pr
|
|
|
109
110
|
disabled: !canScrollPrev,
|
|
110
111
|
onClick: scrollPrev,
|
|
111
112
|
...props,
|
|
112
|
-
children: [/* @__PURE__ */ jsx(
|
|
113
|
+
children: [/* @__PURE__ */ jsx(Icon, { as: ArrowLeft }), /* @__PURE__ */ jsx("span", {
|
|
113
114
|
className: "sr-only",
|
|
114
115
|
children: "Previous slide"
|
|
115
116
|
})]
|
|
@@ -126,7 +127,7 @@ function CarouselNext({ className, variant = "outline", size = "icon", ...props
|
|
|
126
127
|
disabled: !canScrollNext,
|
|
127
128
|
onClick: scrollNext,
|
|
128
129
|
...props,
|
|
129
|
-
children: [/* @__PURE__ */ jsx(
|
|
130
|
+
children: [/* @__PURE__ */ jsx(Icon, { as: ArrowRight }), /* @__PURE__ */ jsx("span", {
|
|
130
131
|
className: "sr-only",
|
|
131
132
|
children: "Next slide"
|
|
132
133
|
})]
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":[],"sources":["../../../src/primitives/Carousel/Carousel.tsx"],"sourcesContent":["\"use client\";\n\nimport useEmblaCarousel, { type UseEmblaCarouselType } from \"embla-carousel-react\";\nimport { ArrowLeft, ArrowRight } from \"lucide-react\";\nimport * as React from \"react\";\n\nimport { Button } from \"@/primitives/Button\";\nimport { cn } from \"@/utils\";\n\ntype CarouselApi = UseEmblaCarouselType[1];\ntype UseCarouselParameters = Parameters<typeof useEmblaCarousel>;\ntype CarouselOptions = UseCarouselParameters[0];\ntype CarouselPlugin = UseCarouselParameters[1];\n\ntype CarouselProps = {\n /** Embla carousel options (loop, align, dragFree, etc.). */\n opts?: CarouselOptions;\n /** Embla plugins (e.g. Autoplay) to extend the carousel behaviour. */\n plugins?: CarouselPlugin;\n /** Scroll axis of the carousel. */\n orientation?: \"horizontal\" | \"vertical\";\n /** Receives the Embla API instance once initialised, for external control. */\n setApi?: (api: CarouselApi) => void;\n};\n\ntype CarouselContextProps = {\n carouselRef: ReturnType<typeof useEmblaCarousel>[0];\n api: ReturnType<typeof useEmblaCarousel>[1];\n scrollPrev: () => void;\n scrollNext: () => void;\n canScrollPrev: boolean;\n canScrollNext: boolean;\n} & CarouselProps;\n\nconst CarouselContext = React.createContext<CarouselContextProps | null>(null);\n\nfunction useCarousel() {\n const context = React.useContext(CarouselContext);\n\n if (!context) {\n throw new Error(\"useCarousel must be used within a <Carousel />\");\n }\n\n return context;\n}\n\n/** Embla-backed carousel root: provides context and arrow-key navigation for its slides. */\nfunction Carousel({\n orientation = \"horizontal\",\n opts,\n setApi,\n plugins,\n className,\n children,\n ...props\n}: React.ComponentProps<\"div\"> & CarouselProps) {\n const [carouselRef, api] = useEmblaCarousel(\n {\n ...opts,\n axis: orientation === \"horizontal\" ? \"x\" : \"y\",\n },\n plugins,\n );\n const [canScrollPrev, setCanScrollPrev] = React.useState(false);\n const [canScrollNext, setCanScrollNext] = React.useState(false);\n\n const onSelect = React.useCallback((api: CarouselApi) => {\n if (!api) return;\n setCanScrollPrev(api.canScrollPrev());\n setCanScrollNext(api.canScrollNext());\n }, []);\n\n const scrollPrev = React.useCallback(() => {\n api?.scrollPrev();\n }, [api]);\n\n const scrollNext = React.useCallback(() => {\n api?.scrollNext();\n }, [api]);\n\n const handleKeyDown = React.useCallback(\n (event: React.KeyboardEvent<HTMLDivElement>) => {\n if (event.key === \"ArrowLeft\") {\n event.preventDefault();\n scrollPrev();\n } else if (event.key === \"ArrowRight\") {\n event.preventDefault();\n scrollNext();\n }\n },\n [scrollPrev, scrollNext],\n );\n\n React.useEffect(() => {\n if (!api || !setApi) return;\n setApi(api);\n }, [api, setApi]);\n\n React.useEffect(() => {\n if (!api) return;\n onSelect(api);\n api.on(\"reInit\", onSelect);\n api.on(\"select\", onSelect);\n\n return () => {\n api?.off(\"select\", onSelect);\n };\n }, [api, onSelect]);\n\n return (\n <CarouselContext.Provider\n value={{\n carouselRef,\n api: api,\n opts,\n orientation: orientation || (opts?.axis === \"y\" ? \"vertical\" : \"horizontal\"),\n scrollPrev,\n scrollNext,\n canScrollPrev,\n canScrollNext,\n }}\n >\n <div\n onKeyDownCapture={handleKeyDown}\n className={cn(\"relative\", className)}\n role=\"region\"\n aria-roledescription=\"carousel\"\n data-slot=\"carousel\"\n {...props}\n >\n {children}\n </div>\n </CarouselContext.Provider>\n );\n}\n\n/** Scroll viewport that lays out the slides along the carousel's axis. */\nfunction CarouselContent({ className, ...props }: React.ComponentProps<\"div\">) {\n const { carouselRef, orientation } = useCarousel();\n\n return (\n <div ref={carouselRef} className=\"overflow-hidden\" data-slot=\"carousel-content\">\n <div\n className={cn(\"flex\", orientation === \"horizontal\" ? \"-ml-4\" : \"-mt-4 flex-col\", className)}\n {...props}\n />\n </div>\n );\n}\n\n/** A single slide within `CarouselContent`. */\nfunction CarouselItem({ className, ...props }: React.ComponentProps<\"div\">) {\n const { orientation } = useCarousel();\n\n return (\n <div\n role=\"group\"\n aria-roledescription=\"slide\"\n data-slot=\"carousel-item\"\n className={cn(\n \"min-w-0 shrink-0 grow-0 basis-full\",\n orientation === \"horizontal\" ? \"pl-4\" : \"pt-4\",\n className,\n )}\n {...props}\n />\n );\n}\n\n/** Button that scrolls to the previous slide; auto-disables at the start. */\nfunction CarouselPrevious({\n className,\n variant = \"outline\",\n size = \"icon\",\n ...props\n}: React.ComponentProps<typeof Button>) {\n const { orientation, scrollPrev, canScrollPrev } = useCarousel();\n\n return (\n <Button\n data-slot=\"carousel-previous\"\n variant={variant}\n size={size}\n className={cn(\n \"absolute size-9 rounded-8 border-primary-border\",\n orientation === \"horizontal\"\n ? \"top-1/2 -left-13 -translate-y-1/2\"\n : \"-top-13 left-1/2 -translate-x-1/2 rotate-90\",\n className,\n )}\n disabled={!canScrollPrev}\n onClick={scrollPrev}\n {...props}\n >\n <ArrowLeft />\n <span className=\"sr-only\">Previous slide</span>\n </Button>\n );\n}\n\n/** Button that scrolls to the next slide; auto-disables at the end. */\nfunction CarouselNext({\n className,\n variant = \"outline\",\n size = \"icon\",\n ...props\n}: React.ComponentProps<typeof Button>) {\n const { orientation, scrollNext, canScrollNext } = useCarousel();\n\n return (\n <Button\n data-slot=\"carousel-next\"\n variant={variant}\n size={size}\n className={cn(\n \"absolute size-9 rounded-8 border-primary-border\",\n orientation === \"horizontal\"\n ? \"top-1/2 -right-13 -translate-y-1/2\"\n : \"-bottom-13 left-1/2 -translate-x-1/2 rotate-90\",\n className,\n )}\n disabled={!canScrollNext}\n onClick={scrollNext}\n {...props}\n >\n <ArrowRight />\n <span className=\"sr-only\">Next slide</span>\n </Button>\n );\n}\n\nexport {\n type CarouselApi,\n Carousel,\n CarouselContent,\n CarouselItem,\n CarouselPrevious,\n CarouselNext,\n};\n"],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.js","names":[],"sources":["../../../src/primitives/Carousel/Carousel.tsx"],"sourcesContent":["\"use client\";\n\nimport { Icon } from \"@/primitives/Icon\";\nimport useEmblaCarousel, { type UseEmblaCarouselType } from \"embla-carousel-react\";\nimport { ArrowLeft, ArrowRight } from \"lucide-react\";\nimport * as React from \"react\";\n\nimport { Button } from \"@/primitives/Button\";\nimport { cn } from \"@/utils\";\n\ntype CarouselApi = UseEmblaCarouselType[1];\ntype UseCarouselParameters = Parameters<typeof useEmblaCarousel>;\ntype CarouselOptions = UseCarouselParameters[0];\ntype CarouselPlugin = UseCarouselParameters[1];\n\ntype CarouselProps = {\n /** Embla carousel options (loop, align, dragFree, etc.). */\n opts?: CarouselOptions;\n /** Embla plugins (e.g. Autoplay) to extend the carousel behaviour. */\n plugins?: CarouselPlugin;\n /** Scroll axis of the carousel. */\n orientation?: \"horizontal\" | \"vertical\";\n /** Receives the Embla API instance once initialised, for external control. */\n setApi?: (api: CarouselApi) => void;\n};\n\ntype CarouselContextProps = {\n carouselRef: ReturnType<typeof useEmblaCarousel>[0];\n api: ReturnType<typeof useEmblaCarousel>[1];\n scrollPrev: () => void;\n scrollNext: () => void;\n canScrollPrev: boolean;\n canScrollNext: boolean;\n} & CarouselProps;\n\nconst CarouselContext = React.createContext<CarouselContextProps | null>(null);\n\nfunction useCarousel() {\n const context = React.useContext(CarouselContext);\n\n if (!context) {\n throw new Error(\"useCarousel must be used within a <Carousel />\");\n }\n\n return context;\n}\n\n/** Embla-backed carousel root: provides context and arrow-key navigation for its slides. */\nfunction Carousel({\n orientation = \"horizontal\",\n opts,\n setApi,\n plugins,\n className,\n children,\n ...props\n}: React.ComponentProps<\"div\"> & CarouselProps) {\n const [carouselRef, api] = useEmblaCarousel(\n {\n ...opts,\n axis: orientation === \"horizontal\" ? \"x\" : \"y\",\n },\n plugins,\n );\n const [canScrollPrev, setCanScrollPrev] = React.useState(false);\n const [canScrollNext, setCanScrollNext] = React.useState(false);\n\n const onSelect = React.useCallback((api: CarouselApi) => {\n if (!api) return;\n setCanScrollPrev(api.canScrollPrev());\n setCanScrollNext(api.canScrollNext());\n }, []);\n\n const scrollPrev = React.useCallback(() => {\n api?.scrollPrev();\n }, [api]);\n\n const scrollNext = React.useCallback(() => {\n api?.scrollNext();\n }, [api]);\n\n const handleKeyDown = React.useCallback(\n (event: React.KeyboardEvent<HTMLDivElement>) => {\n if (event.key === \"ArrowLeft\") {\n event.preventDefault();\n scrollPrev();\n } else if (event.key === \"ArrowRight\") {\n event.preventDefault();\n scrollNext();\n }\n },\n [scrollPrev, scrollNext],\n );\n\n React.useEffect(() => {\n if (!api || !setApi) return;\n setApi(api);\n }, [api, setApi]);\n\n React.useEffect(() => {\n if (!api) return;\n onSelect(api);\n api.on(\"reInit\", onSelect);\n api.on(\"select\", onSelect);\n\n return () => {\n api?.off(\"select\", onSelect);\n };\n }, [api, onSelect]);\n\n return (\n <CarouselContext.Provider\n value={{\n carouselRef,\n api: api,\n opts,\n orientation: orientation || (opts?.axis === \"y\" ? \"vertical\" : \"horizontal\"),\n scrollPrev,\n scrollNext,\n canScrollPrev,\n canScrollNext,\n }}\n >\n <div\n onKeyDownCapture={handleKeyDown}\n className={cn(\"relative\", className)}\n role=\"region\"\n aria-roledescription=\"carousel\"\n data-slot=\"carousel\"\n {...props}\n >\n {children}\n </div>\n </CarouselContext.Provider>\n );\n}\n\n/** Scroll viewport that lays out the slides along the carousel's axis. */\nfunction CarouselContent({ className, ...props }: React.ComponentProps<\"div\">) {\n const { carouselRef, orientation } = useCarousel();\n\n return (\n <div ref={carouselRef} className=\"overflow-hidden\" data-slot=\"carousel-content\">\n <div\n className={cn(\"flex\", orientation === \"horizontal\" ? \"-ml-4\" : \"-mt-4 flex-col\", className)}\n {...props}\n />\n </div>\n );\n}\n\n/** A single slide within `CarouselContent`. */\nfunction CarouselItem({ className, ...props }: React.ComponentProps<\"div\">) {\n const { orientation } = useCarousel();\n\n return (\n <div\n role=\"group\"\n aria-roledescription=\"slide\"\n data-slot=\"carousel-item\"\n className={cn(\n \"min-w-0 shrink-0 grow-0 basis-full\",\n orientation === \"horizontal\" ? \"pl-4\" : \"pt-4\",\n className,\n )}\n {...props}\n />\n );\n}\n\n/** Button that scrolls to the previous slide; auto-disables at the start. */\nfunction CarouselPrevious({\n className,\n variant = \"outline\",\n size = \"icon\",\n ...props\n}: React.ComponentProps<typeof Button>) {\n const { orientation, scrollPrev, canScrollPrev } = useCarousel();\n\n return (\n <Button\n data-slot=\"carousel-previous\"\n variant={variant}\n size={size}\n className={cn(\n \"absolute size-9 rounded-8 border-primary-border\",\n orientation === \"horizontal\"\n ? \"top-1/2 -left-13 -translate-y-1/2\"\n : \"-top-13 left-1/2 -translate-x-1/2 rotate-90\",\n className,\n )}\n disabled={!canScrollPrev}\n onClick={scrollPrev}\n {...props}\n >\n <Icon as={ArrowLeft} />\n <span className=\"sr-only\">Previous slide</span>\n </Button>\n );\n}\n\n/** Button that scrolls to the next slide; auto-disables at the end. */\nfunction CarouselNext({\n className,\n variant = \"outline\",\n size = \"icon\",\n ...props\n}: React.ComponentProps<typeof Button>) {\n const { orientation, scrollNext, canScrollNext } = useCarousel();\n\n return (\n <Button\n data-slot=\"carousel-next\"\n variant={variant}\n size={size}\n className={cn(\n \"absolute size-9 rounded-8 border-primary-border\",\n orientation === \"horizontal\"\n ? \"top-1/2 -right-13 -translate-y-1/2\"\n : \"-bottom-13 left-1/2 -translate-x-1/2 rotate-90\",\n className,\n )}\n disabled={!canScrollNext}\n onClick={scrollNext}\n {...props}\n >\n <Icon as={ArrowRight} />\n <span className=\"sr-only\">Next slide</span>\n </Button>\n );\n}\n\nexport {\n type CarouselApi,\n Carousel,\n CarouselContent,\n CarouselItem,\n CarouselPrevious,\n CarouselNext,\n};\n"],"mappings":"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"}
|
|
@@ -1,20 +1,27 @@
|
|
|
1
1
|
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
2
2
|
const require_cn = require("../../cn.cjs");
|
|
3
|
+
const require_Icon = require("../../Icon.cjs");
|
|
3
4
|
let react = require("react");
|
|
5
|
+
let react_jsx_runtime = require("react/jsx-runtime");
|
|
4
6
|
let lucide_react = require("lucide-react");
|
|
5
7
|
let radix_ui = require("radix-ui");
|
|
6
|
-
let react_jsx_runtime = require("react/jsx-runtime");
|
|
7
8
|
//#region src/primitives/Checkbox/Checkbox.tsx
|
|
8
9
|
/** A square toggle control built on Radix Checkbox, supporting checked, unchecked, indeterminate, error, and disabled states. */
|
|
9
10
|
function Checkbox({ className, ...props }) {
|
|
10
11
|
return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(radix_ui.Checkbox.Root, {
|
|
11
12
|
"data-slot": "checkbox",
|
|
12
|
-
className: require_cn.cn("group/checkbox peer bg-input-bg size-4 shrink-0 rounded-4 border border-primary-invert-border transition-shadow outline-none disabled:cursor-not-allowed disabled:opacity-50 disabled:border-secondary-border", "data-[state=checked]:bg-primary-invert-bg data-[state=checked]:text-primary-invert-txt data-[state=checked]:border-transparent", "data-[state=indeterminate]:bg-primary-invert-bg data-[state=indeterminate]:text-primary-invert-txt data-[state=indeterminate]:border-transparent", "focus-visible:ring-focus focus-visible:ring-3", "aria-invalid:border-danger-border aria-invalid:ring-focus-error", "aria-invalid:data-[state=checked]:bg-danger-txt aria-invalid:data-[state=checked]:border-transparent", className),
|
|
13
|
+
className: require_cn.cn("group/checkbox peer relative bg-input-bg size-4 shrink-0 rounded-4 border border-primary-invert-border transition-shadow outline-none after:absolute after:-inset-1 after:rounded-4 after:content-[''] disabled:cursor-not-allowed disabled:opacity-50 disabled:border-secondary-border", "data-[state=checked]:bg-primary-invert-bg data-[state=checked]:text-primary-invert-txt data-[state=checked]:border-transparent", "data-[state=indeterminate]:bg-primary-invert-bg data-[state=indeterminate]:text-primary-invert-txt data-[state=indeterminate]:border-transparent", "focus-visible:ring-focus focus-visible:ring-3", "aria-invalid:border-danger-border aria-invalid:ring-focus-error", "aria-invalid:data-[state=checked]:bg-danger-txt aria-invalid:data-[state=checked]:border-transparent", className),
|
|
13
14
|
...props,
|
|
14
15
|
children: /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(radix_ui.Checkbox.Indicator, {
|
|
15
16
|
"data-slot": "checkbox-indicator",
|
|
16
17
|
className: "flex items-center justify-center text-current transition-none",
|
|
17
|
-
children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(
|
|
18
|
+
children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_Icon.Icon, {
|
|
19
|
+
as: lucide_react.CheckIcon,
|
|
20
|
+
className: "size-3.5 group-data-[state=indeterminate]/checkbox:hidden"
|
|
21
|
+
}), /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_Icon.Icon, {
|
|
22
|
+
as: lucide_react.MinusIcon,
|
|
23
|
+
className: "hidden size-3.5 group-data-[state=indeterminate]/checkbox:block"
|
|
24
|
+
})]
|
|
18
25
|
})
|
|
19
26
|
});
|
|
20
27
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","names":["CheckboxPrimitive","cn","CheckIcon","MinusIcon"],"sources":["../../../src/primitives/Checkbox/Checkbox.tsx"],"sourcesContent":["import { CheckIcon, MinusIcon } from \"lucide-react\";\nimport { Checkbox as CheckboxPrimitive } from \"radix-ui\";\nimport { useId } from \"react\";\nimport type * as React from \"react\";\n\nimport { cn } from \"@/utils\";\n\n/** A square toggle control built on Radix Checkbox, supporting checked, unchecked, indeterminate, error, and disabled states. */\nfunction Checkbox({ className, ...props }: React.ComponentProps<typeof CheckboxPrimitive.Root>) {\n return (\n <CheckboxPrimitive.Root\n data-slot=\"checkbox\"\n className={cn(\n \"group/checkbox peer bg-input-bg size-4 shrink-0 rounded-4 border border-primary-invert-border transition-shadow outline-none disabled:cursor-not-allowed disabled:opacity-50 disabled:border-secondary-border\",\n // Checked + indeterminate: full-bleed inverted fill, no visible border (Figma).\n \"data-[state=checked]:bg-primary-invert-bg data-[state=checked]:text-primary-invert-txt data-[state=checked]:border-transparent\",\n \"data-[state=indeterminate]:bg-primary-invert-bg data-[state=indeterminate]:text-primary-invert-txt data-[state=indeterminate]:border-transparent\",\n \"focus-visible:ring-focus focus-visible:ring-3\",\n // Error: danger border when unchecked, danger fill when checked. Figma binds\n // the fill to content/status/danger (the 700-level danger color), so the\n // checked error fill is the -txt token used as a background on purpose.\n \"aria-invalid:border-danger-border aria-invalid:ring-focus-error\",\n \"aria-invalid:data-[state=checked]:bg-danger-txt aria-invalid:data-[state=checked]:border-transparent\",\n className,\n )}\n {...props}\n >\n <CheckboxPrimitive.Indicator\n data-slot=\"checkbox-indicator\"\n className=\"flex items-center justify-center text-current transition-none\"\n >\n <CheckIcon
|
|
1
|
+
{"version":3,"file":"index.cjs","names":["CheckboxPrimitive","cn","Icon","CheckIcon","MinusIcon"],"sources":["../../../src/primitives/Checkbox/Checkbox.tsx"],"sourcesContent":["import { Icon } from \"@/primitives/Icon\";\nimport { CheckIcon, MinusIcon } from \"lucide-react\";\nimport { Checkbox as CheckboxPrimitive } from \"radix-ui\";\nimport { useId } from \"react\";\nimport type * as React from \"react\";\n\nimport { cn } from \"@/utils\";\n\n/** A square toggle control built on Radix Checkbox, supporting checked, unchecked, indeterminate, error, and disabled states. */\nfunction Checkbox({ className, ...props }: React.ComponentProps<typeof CheckboxPrimitive.Root>) {\n return (\n <CheckboxPrimitive.Root\n data-slot=\"checkbox\"\n className={cn(\n // Keep the visible control at 16px while expanding the click/tap target to 24px.\n // This matches the repo's hit-area expansion pattern (via negative inset pseudo-element)\n // without changing surrounding layout metrics.\n \"group/checkbox peer relative bg-input-bg size-4 shrink-0 rounded-4 border border-primary-invert-border transition-shadow outline-none after:absolute after:-inset-1 after:rounded-4 after:content-[''] disabled:cursor-not-allowed disabled:opacity-50 disabled:border-secondary-border\",\n // Checked + indeterminate: full-bleed inverted fill, no visible border (Figma).\n \"data-[state=checked]:bg-primary-invert-bg data-[state=checked]:text-primary-invert-txt data-[state=checked]:border-transparent\",\n \"data-[state=indeterminate]:bg-primary-invert-bg data-[state=indeterminate]:text-primary-invert-txt data-[state=indeterminate]:border-transparent\",\n \"focus-visible:ring-focus focus-visible:ring-3\",\n // Error: danger border when unchecked, danger fill when checked. Figma binds\n // the fill to content/status/danger (the 700-level danger color), so the\n // checked error fill is the -txt token used as a background on purpose.\n \"aria-invalid:border-danger-border aria-invalid:ring-focus-error\",\n \"aria-invalid:data-[state=checked]:bg-danger-txt aria-invalid:data-[state=checked]:border-transparent\",\n className,\n )}\n {...props}\n >\n <CheckboxPrimitive.Indicator\n data-slot=\"checkbox-indicator\"\n className=\"flex items-center justify-center text-current transition-none\"\n >\n <Icon\n as={CheckIcon}\n className=\"size-3.5 group-data-[state=indeterminate]/checkbox:hidden\"\n />\n <Icon\n as={MinusIcon}\n className=\"hidden size-3.5 group-data-[state=indeterminate]/checkbox:block\"\n />\n </CheckboxPrimitive.Indicator>\n </CheckboxPrimitive.Root>\n );\n}\n\n/** A bordered card variant of {@link Checkbox} that pairs the control with a title and optional description. */\nfunction RichCheckbox({\n className,\n title,\n description,\n flipped = false,\n id,\n ...props\n}: Omit<React.ComponentProps<typeof Checkbox>, \"children\"> & {\n /** Primary label rendered next to the checkbox. */\n title?: React.ReactNode;\n /** Secondary helper text rendered beneath the title. */\n description?: React.ReactNode;\n /** When true, places the checkbox on the right (row-reverse) instead of the left. */\n flipped?: boolean;\n}) {\n const generatedId = useId();\n const checkboxId = id ?? generatedId;\n return (\n <label\n data-slot=\"rich-checkbox\"\n htmlFor={checkboxId}\n className={cn(\n \"flex cursor-pointer items-start gap-3 rounded-10 border border-primary-border bg-muted-bg p-3 text-primary-txt transition-colors has-[[data-state=checked]]:border-selected-border has-[:disabled]:cursor-not-allowed has-[:disabled]:opacity-50\",\n flipped ? \"flex-row-reverse\" : \"flex-row\",\n className,\n )}\n >\n <Checkbox data-slot=\"rich-checkbox-control\" id={checkboxId} className=\"mt-0.75\" {...props} />\n <span data-slot=\"rich-checkbox-content\" className=\"flex flex-1 flex-col gap-1.5\">\n {title != null && (\n <span data-slot=\"rich-checkbox-title\" className=\"text-sm leading-5\">\n {title}\n </span>\n )}\n {description != null && (\n <span data-slot=\"rich-checkbox-description\" className=\"text-xs leading-4 text-muted-txt\">\n {description}\n </span>\n )}\n </span>\n </label>\n );\n}\n\nexport { Checkbox, RichCheckbox };\n"],"mappings":";;;;;;;;;AASA,SAAS,SAAS,EAAE,WAAW,GAAG,SAA8D;CAC9F,OACE,iBAAA,GAAA,kBAAA,KAACA,SAAAA,SAAkB,MAAnB;EACE,aAAU;EACV,WAAWC,WAAAA,GAIT,2RAEA,kIACA,oJACA,iDAIA,mEACA,wGACA,SACF;EACA,GAAI;YAEJ,iBAAA,GAAA,kBAAA,MAACD,SAAAA,SAAkB,WAAnB;GACE,aAAU;GACV,WAAU;aAFZ,CAIE,iBAAA,GAAA,kBAAA,KAACE,aAAAA,MAAD;IACE,IAAIC,aAAAA;IACJ,WAAU;GACX,CAAA,GACD,iBAAA,GAAA,kBAAA,KAACD,aAAAA,MAAD;IACE,IAAIE,aAAAA;IACJ,WAAU;GACX,CAAA,CAC0B;;CACP,CAAA;AAE5B;;AAGA,SAAS,aAAa,EACpB,WACA,OACA,aACA,UAAU,OACV,IACA,GAAG,SAQF;CACD,MAAM,eAAA,GAAA,MAAA,OAAoB;CAC1B,MAAM,aAAa,MAAM;CACzB,OACE,iBAAA,GAAA,kBAAA,MAAC,SAAD;EACE,aAAU;EACV,SAAS;EACT,WAAWH,WAAAA,GACT,oPACA,UAAU,qBAAqB,YAC/B,SACF;YAPF,CASE,iBAAA,GAAA,kBAAA,KAAC,UAAD;GAAU,aAAU;GAAwB,IAAI;GAAY,WAAU;GAAU,GAAI;EAAQ,CAAA,GAC5F,iBAAA,GAAA,kBAAA,MAAC,QAAD;GAAM,aAAU;GAAwB,WAAU;aAAlD,CACG,SAAS,QACR,iBAAA,GAAA,kBAAA,KAAC,QAAD;IAAM,aAAU;IAAsB,WAAU;cAC7C;GACG,CAAA,GAEP,eAAe,QACd,iBAAA,GAAA,kBAAA,KAAC,QAAD;IAAM,aAAU;IAA4B,WAAU;cACnD;GACG,CAAA,CAEJ;IACD;;AAEX"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { n as RichCheckbox, t as Checkbox } from "../../
|
|
1
|
+
import { n as RichCheckbox, t as Checkbox } from "../../index16.cjs";
|
|
2
2
|
export { Checkbox, RichCheckbox };
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { n as RichCheckbox, t as Checkbox } from "../../
|
|
1
|
+
import { n as RichCheckbox, t as Checkbox } from "../../index16.js";
|
|
2
2
|
export { Checkbox, RichCheckbox };
|
|
@@ -1,19 +1,26 @@
|
|
|
1
1
|
import { t as cn } from "../../cn.js";
|
|
2
|
+
import { t as Icon } from "../../Icon.js";
|
|
2
3
|
import { useId } from "react";
|
|
4
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
3
5
|
import { CheckIcon, MinusIcon } from "lucide-react";
|
|
4
6
|
import { Checkbox as Checkbox$1 } from "radix-ui";
|
|
5
|
-
import { jsx, jsxs } from "react/jsx-runtime";
|
|
6
7
|
//#region src/primitives/Checkbox/Checkbox.tsx
|
|
7
8
|
/** A square toggle control built on Radix Checkbox, supporting checked, unchecked, indeterminate, error, and disabled states. */
|
|
8
9
|
function Checkbox({ className, ...props }) {
|
|
9
10
|
return /* @__PURE__ */ jsx(Checkbox$1.Root, {
|
|
10
11
|
"data-slot": "checkbox",
|
|
11
|
-
className: cn("group/checkbox peer bg-input-bg size-4 shrink-0 rounded-4 border border-primary-invert-border transition-shadow outline-none disabled:cursor-not-allowed disabled:opacity-50 disabled:border-secondary-border", "data-[state=checked]:bg-primary-invert-bg data-[state=checked]:text-primary-invert-txt data-[state=checked]:border-transparent", "data-[state=indeterminate]:bg-primary-invert-bg data-[state=indeterminate]:text-primary-invert-txt data-[state=indeterminate]:border-transparent", "focus-visible:ring-focus focus-visible:ring-3", "aria-invalid:border-danger-border aria-invalid:ring-focus-error", "aria-invalid:data-[state=checked]:bg-danger-txt aria-invalid:data-[state=checked]:border-transparent", className),
|
|
12
|
+
className: cn("group/checkbox peer relative bg-input-bg size-4 shrink-0 rounded-4 border border-primary-invert-border transition-shadow outline-none after:absolute after:-inset-1 after:rounded-4 after:content-[''] disabled:cursor-not-allowed disabled:opacity-50 disabled:border-secondary-border", "data-[state=checked]:bg-primary-invert-bg data-[state=checked]:text-primary-invert-txt data-[state=checked]:border-transparent", "data-[state=indeterminate]:bg-primary-invert-bg data-[state=indeterminate]:text-primary-invert-txt data-[state=indeterminate]:border-transparent", "focus-visible:ring-focus focus-visible:ring-3", "aria-invalid:border-danger-border aria-invalid:ring-focus-error", "aria-invalid:data-[state=checked]:bg-danger-txt aria-invalid:data-[state=checked]:border-transparent", className),
|
|
12
13
|
...props,
|
|
13
14
|
children: /* @__PURE__ */ jsxs(Checkbox$1.Indicator, {
|
|
14
15
|
"data-slot": "checkbox-indicator",
|
|
15
16
|
className: "flex items-center justify-center text-current transition-none",
|
|
16
|
-
children: [/* @__PURE__ */ jsx(
|
|
17
|
+
children: [/* @__PURE__ */ jsx(Icon, {
|
|
18
|
+
as: CheckIcon,
|
|
19
|
+
className: "size-3.5 group-data-[state=indeterminate]/checkbox:hidden"
|
|
20
|
+
}), /* @__PURE__ */ jsx(Icon, {
|
|
21
|
+
as: MinusIcon,
|
|
22
|
+
className: "hidden size-3.5 group-data-[state=indeterminate]/checkbox:block"
|
|
23
|
+
})]
|
|
17
24
|
})
|
|
18
25
|
});
|
|
19
26
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":["CheckboxPrimitive"],"sources":["../../../src/primitives/Checkbox/Checkbox.tsx"],"sourcesContent":["import { CheckIcon, MinusIcon } from \"lucide-react\";\nimport { Checkbox as CheckboxPrimitive } from \"radix-ui\";\nimport { useId } from \"react\";\nimport type * as React from \"react\";\n\nimport { cn } from \"@/utils\";\n\n/** A square toggle control built on Radix Checkbox, supporting checked, unchecked, indeterminate, error, and disabled states. */\nfunction Checkbox({ className, ...props }: React.ComponentProps<typeof CheckboxPrimitive.Root>) {\n return (\n <CheckboxPrimitive.Root\n data-slot=\"checkbox\"\n className={cn(\n \"group/checkbox peer bg-input-bg size-4 shrink-0 rounded-4 border border-primary-invert-border transition-shadow outline-none disabled:cursor-not-allowed disabled:opacity-50 disabled:border-secondary-border\",\n // Checked + indeterminate: full-bleed inverted fill, no visible border (Figma).\n \"data-[state=checked]:bg-primary-invert-bg data-[state=checked]:text-primary-invert-txt data-[state=checked]:border-transparent\",\n \"data-[state=indeterminate]:bg-primary-invert-bg data-[state=indeterminate]:text-primary-invert-txt data-[state=indeterminate]:border-transparent\",\n \"focus-visible:ring-focus focus-visible:ring-3\",\n // Error: danger border when unchecked, danger fill when checked. Figma binds\n // the fill to content/status/danger (the 700-level danger color), so the\n // checked error fill is the -txt token used as a background on purpose.\n \"aria-invalid:border-danger-border aria-invalid:ring-focus-error\",\n \"aria-invalid:data-[state=checked]:bg-danger-txt aria-invalid:data-[state=checked]:border-transparent\",\n className,\n )}\n {...props}\n >\n <CheckboxPrimitive.Indicator\n data-slot=\"checkbox-indicator\"\n className=\"flex items-center justify-center text-current transition-none\"\n >\n <CheckIcon
|
|
1
|
+
{"version":3,"file":"index.js","names":["CheckboxPrimitive"],"sources":["../../../src/primitives/Checkbox/Checkbox.tsx"],"sourcesContent":["import { Icon } from \"@/primitives/Icon\";\nimport { CheckIcon, MinusIcon } from \"lucide-react\";\nimport { Checkbox as CheckboxPrimitive } from \"radix-ui\";\nimport { useId } from \"react\";\nimport type * as React from \"react\";\n\nimport { cn } from \"@/utils\";\n\n/** A square toggle control built on Radix Checkbox, supporting checked, unchecked, indeterminate, error, and disabled states. */\nfunction Checkbox({ className, ...props }: React.ComponentProps<typeof CheckboxPrimitive.Root>) {\n return (\n <CheckboxPrimitive.Root\n data-slot=\"checkbox\"\n className={cn(\n // Keep the visible control at 16px while expanding the click/tap target to 24px.\n // This matches the repo's hit-area expansion pattern (via negative inset pseudo-element)\n // without changing surrounding layout metrics.\n \"group/checkbox peer relative bg-input-bg size-4 shrink-0 rounded-4 border border-primary-invert-border transition-shadow outline-none after:absolute after:-inset-1 after:rounded-4 after:content-[''] disabled:cursor-not-allowed disabled:opacity-50 disabled:border-secondary-border\",\n // Checked + indeterminate: full-bleed inverted fill, no visible border (Figma).\n \"data-[state=checked]:bg-primary-invert-bg data-[state=checked]:text-primary-invert-txt data-[state=checked]:border-transparent\",\n \"data-[state=indeterminate]:bg-primary-invert-bg data-[state=indeterminate]:text-primary-invert-txt data-[state=indeterminate]:border-transparent\",\n \"focus-visible:ring-focus focus-visible:ring-3\",\n // Error: danger border when unchecked, danger fill when checked. Figma binds\n // the fill to content/status/danger (the 700-level danger color), so the\n // checked error fill is the -txt token used as a background on purpose.\n \"aria-invalid:border-danger-border aria-invalid:ring-focus-error\",\n \"aria-invalid:data-[state=checked]:bg-danger-txt aria-invalid:data-[state=checked]:border-transparent\",\n className,\n )}\n {...props}\n >\n <CheckboxPrimitive.Indicator\n data-slot=\"checkbox-indicator\"\n className=\"flex items-center justify-center text-current transition-none\"\n >\n <Icon\n as={CheckIcon}\n className=\"size-3.5 group-data-[state=indeterminate]/checkbox:hidden\"\n />\n <Icon\n as={MinusIcon}\n className=\"hidden size-3.5 group-data-[state=indeterminate]/checkbox:block\"\n />\n </CheckboxPrimitive.Indicator>\n </CheckboxPrimitive.Root>\n );\n}\n\n/** A bordered card variant of {@link Checkbox} that pairs the control with a title and optional description. */\nfunction RichCheckbox({\n className,\n title,\n description,\n flipped = false,\n id,\n ...props\n}: Omit<React.ComponentProps<typeof Checkbox>, \"children\"> & {\n /** Primary label rendered next to the checkbox. */\n title?: React.ReactNode;\n /** Secondary helper text rendered beneath the title. */\n description?: React.ReactNode;\n /** When true, places the checkbox on the right (row-reverse) instead of the left. */\n flipped?: boolean;\n}) {\n const generatedId = useId();\n const checkboxId = id ?? generatedId;\n return (\n <label\n data-slot=\"rich-checkbox\"\n htmlFor={checkboxId}\n className={cn(\n \"flex cursor-pointer items-start gap-3 rounded-10 border border-primary-border bg-muted-bg p-3 text-primary-txt transition-colors has-[[data-state=checked]]:border-selected-border has-[:disabled]:cursor-not-allowed has-[:disabled]:opacity-50\",\n flipped ? \"flex-row-reverse\" : \"flex-row\",\n className,\n )}\n >\n <Checkbox data-slot=\"rich-checkbox-control\" id={checkboxId} className=\"mt-0.75\" {...props} />\n <span data-slot=\"rich-checkbox-content\" className=\"flex flex-1 flex-col gap-1.5\">\n {title != null && (\n <span data-slot=\"rich-checkbox-title\" className=\"text-sm leading-5\">\n {title}\n </span>\n )}\n {description != null && (\n <span data-slot=\"rich-checkbox-description\" className=\"text-xs leading-4 text-muted-txt\">\n {description}\n </span>\n )}\n </span>\n </label>\n );\n}\n\nexport { Checkbox, RichCheckbox };\n"],"mappings":";;;;;;;;AASA,SAAS,SAAS,EAAE,WAAW,GAAG,SAA8D;CAC9F,OACE,oBAACA,WAAkB,MAAnB;EACE,aAAU;EACV,WAAW,GAIT,2RAEA,kIACA,oJACA,iDAIA,mEACA,wGACA,SACF;EACA,GAAI;YAEJ,qBAACA,WAAkB,WAAnB;GACE,aAAU;GACV,WAAU;aAFZ,CAIE,oBAAC,MAAD;IACE,IAAI;IACJ,WAAU;GACX,CAAA,GACD,oBAAC,MAAD;IACE,IAAI;IACJ,WAAU;GACX,CAAA,CAC0B;;CACP,CAAA;AAE5B;;AAGA,SAAS,aAAa,EACpB,WACA,OACA,aACA,UAAU,OACV,IACA,GAAG,SAQF;CACD,MAAM,cAAc,MAAM;CAC1B,MAAM,aAAa,MAAM;CACzB,OACE,qBAAC,SAAD;EACE,aAAU;EACV,SAAS;EACT,WAAW,GACT,oPACA,UAAU,qBAAqB,YAC/B,SACF;YAPF,CASE,oBAAC,UAAD;GAAU,aAAU;GAAwB,IAAI;GAAY,WAAU;GAAU,GAAI;EAAQ,CAAA,GAC5F,qBAAC,QAAD;GAAM,aAAU;GAAwB,WAAU;aAAlD,CACG,SAAS,QACR,oBAAC,QAAD;IAAM,aAAU;IAAsB,WAAU;cAC7C;GACG,CAAA,GAEP,eAAe,QACd,oBAAC,QAAD;IAAM,aAAU;IAA4B,WAAU;cACnD;GACG,CAAA,CAEJ;IACD;;AAEX"}
|
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
2
2
|
const require_chunk = require("../../chunk.cjs");
|
|
3
3
|
const require_cn = require("../../cn.cjs");
|
|
4
|
+
const require_Icon = require("../../Icon.cjs");
|
|
4
5
|
const require_primitives_Checkbox_index = require("../Checkbox/index.cjs");
|
|
5
6
|
let react = require("react");
|
|
6
7
|
react = require_chunk.__toESM(react);
|
|
7
|
-
let lucide_react = require("lucide-react");
|
|
8
8
|
let react_jsx_runtime = require("react/jsx-runtime");
|
|
9
|
+
let lucide_react = require("lucide-react");
|
|
9
10
|
//#region src/primitives/CheckboxTree/CheckboxTree.tsx
|
|
10
11
|
/** All ids in a node's subtree (the node itself + every descendant). */
|
|
11
12
|
function collectIds(node) {
|
|
@@ -74,7 +75,10 @@ function TreeNode({ node, depth, selected, expanded, onToggleSelect, onToggleExp
|
|
|
74
75
|
onClick: () => onToggleExpand(node.id),
|
|
75
76
|
"aria-label": isExpanded ? "Collapse" : "Expand",
|
|
76
77
|
className: "flex size-5 shrink-0 items-center justify-center text-muted-txt hover:text-primary-txt",
|
|
77
|
-
children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(
|
|
78
|
+
children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_Icon.Icon, {
|
|
79
|
+
as: lucide_react.ChevronRight,
|
|
80
|
+
className: require_cn.cn("size-4 transition-transform", isExpanded && "rotate-90")
|
|
81
|
+
})
|
|
78
82
|
}) : /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { className: "w-5 shrink-0" }), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("label", {
|
|
79
83
|
htmlFor: checkboxId,
|
|
80
84
|
className: "flex flex-1 cursor-pointer items-center gap-2 rounded-6 px-2 py-1.5 transition-colors hover:bg-muted-bg/40",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","names":["React","cn","ChevronRight","Checkbox"],"sources":["../../../src/primitives/CheckboxTree/CheckboxTree.tsx"],"sourcesContent":["\"use client\";\n\nimport { ChevronRight } from \"lucide-react\";\nimport * as React from \"react\";\n\nimport { Checkbox } from \"@/primitives/Checkbox\";\nimport { cn } from \"@/utils\";\n\n// CheckboxTree — a hierarchical checkbox list with expand/collapse and\n// tri-state (checked / unchecked / indeterminate) propagation: toggling a branch\n// toggles all its descendants, and a branch reflects its children\n// (checked when all are, indeterminate when some are). Controlled via `value`\n// (the set of selected node ids, branches included when fully selected).\n\n/** A single node in the tree: a stable id, a label, and optional children. */\nexport interface CheckboxTreeNode {\n /** Stable unique identifier used for selection and expansion tracking. */\n id: string;\n /** Content rendered next to the checkbox. */\n label: React.ReactNode;\n /** Nested child nodes; presence makes this node a collapsible branch. */\n children?: CheckboxTreeNode[];\n}\n\ntype NodeState = \"checked\" | \"unchecked\" | \"indeterminate\";\n\n/** All ids in a node's subtree (the node itself + every descendant). */\nfunction collectIds(node: CheckboxTreeNode): string[] {\n if (!node.children?.length) return [node.id];\n return [node.id, ...node.children.flatMap(collectIds)];\n}\n\n/** A leaf is checked iff selected; a branch derives its state from its children. */\nfunction getNodeState(node: CheckboxTreeNode, selected: Set<string>): NodeState {\n if (!node.children?.length) return selected.has(node.id) ? \"checked\" : \"unchecked\";\n const states = node.children.map((child) => getNodeState(child, selected));\n if (states.every((s) => s === \"checked\")) return \"checked\";\n if (states.every((s) => s === \"unchecked\")) return \"unchecked\";\n return \"indeterminate\";\n}\n\ninterface CheckboxTreeProps extends Omit<React.ComponentProps<\"div\">, \"onChange\"> {\n /** The hierarchical node data to render. */\n nodes: CheckboxTreeNode[];\n /** Selected node ids (controlled). Includes branch ids when fully selected. */\n value: string[];\n /** Called with the next selected ids whenever a node (and its subtree) is toggled. */\n onValueChange?: (value: string[]) => void;\n /** Node ids expanded on first render. */\n defaultExpandedIds?: string[];\n}\n\n/**\n * A hierarchical checkbox list with expand/collapse and tri-state\n * (checked / unchecked / indeterminate) propagation across each subtree.\n */\nfunction CheckboxTree({\n nodes,\n value,\n onValueChange,\n defaultExpandedIds,\n className,\n ...props\n}: CheckboxTreeProps) {\n const [expanded, setExpanded] = React.useState<Set<string>>(\n () => new Set(defaultExpandedIds ?? []),\n );\n const selected = React.useMemo(() => new Set(value), [value]);\n\n const toggleExpand = (id: string) =>\n setExpanded((prev) => {\n const next = new Set(prev);\n if (next.has(id)) next.delete(id);\n else next.add(id);\n return next;\n });\n\n const toggleSelect = (node: CheckboxTreeNode) => {\n const ids = collectIds(node);\n const allSelected = ids.every((id) => selected.has(id));\n const next = new Set(selected);\n for (const id of ids) {\n if (allSelected) next.delete(id);\n else next.add(id);\n }\n onValueChange?.([...next]);\n };\n\n return (\n <div\n role=\"tree\"\n data-slot=\"checkbox-tree\"\n className={cn(\"flex flex-col gap-1\", className)}\n {...props}\n >\n {nodes.map((node) => (\n <TreeNode\n key={node.id}\n node={node}\n depth={0}\n selected={selected}\n expanded={expanded}\n onToggleSelect={toggleSelect}\n onToggleExpand={toggleExpand}\n />\n ))}\n </div>\n );\n}\n\ninterface TreeNodeProps {\n /** The node rendered by this row. */\n node: CheckboxTreeNode;\n /** Nesting depth, used for indentation and heading emphasis. */\n depth: number;\n /** Set of currently selected node ids. */\n selected: Set<string>;\n /** Set of currently expanded node ids. */\n expanded: Set<string>;\n /** Toggles selection of the node and its subtree. */\n onToggleSelect: (node: CheckboxTreeNode) => void;\n /** Toggles the expanded/collapsed state of a branch. */\n onToggleExpand: (id: string) => void;\n}\n\n/** Renders a single tree row plus, when expanded, its child rows recursively. */\nfunction TreeNode({\n node,\n depth,\n selected,\n expanded,\n onToggleSelect,\n onToggleExpand,\n}: TreeNodeProps) {\n const hasChildren = !!node.children?.length;\n const isExpanded = expanded.has(node.id);\n const state = getNodeState(node, selected);\n const checkboxId = React.useId();\n\n return (\n <div\n role=\"treeitem\"\n aria-expanded={hasChildren ? isExpanded : undefined}\n aria-checked={state === \"indeterminate\" ? \"mixed\" : state === \"checked\"}\n >\n <div className=\"flex items-center gap-1\" style={{ paddingLeft: `${depth * 1.5}rem` }}>\n {hasChildren ? (\n <button\n type=\"button\"\n onClick={() => onToggleExpand(node.id)}\n aria-label={isExpanded ? \"Collapse\" : \"Expand\"}\n className=\"flex size-5 shrink-0 items-center justify-center text-muted-txt hover:text-primary-txt\"\n >\n <ChevronRight\n className={cn(\"size-4 transition-transform\", isExpanded && \"rotate-90\")}\n />\n </button>\n ) : (\n <span className=\"w-5 shrink-0\" />\n )}\n <label\n htmlFor={checkboxId}\n className=\"flex flex-1 cursor-pointer items-center gap-2 rounded-6 px-2 py-1.5 transition-colors hover:bg-muted-bg/40\"\n >\n <Checkbox\n id={checkboxId}\n checked={state === \"indeterminate\" ? \"indeterminate\" : state === \"checked\"}\n onCheckedChange={() => onToggleSelect(node)}\n />\n <span className={cn(\"text-sm\", depth === 0 && \"font-medium\")}>{node.label}</span>\n </label>\n </div>\n {hasChildren && isExpanded && (\n <div role=\"group\">\n {node.children?.map((child) => (\n <TreeNode\n key={child.id}\n node={child}\n depth={depth + 1}\n selected={selected}\n expanded={expanded}\n onToggleSelect={onToggleSelect}\n onToggleExpand={onToggleExpand}\n />\n ))}\n </div>\n )}\n </div>\n );\n}\n\nexport { CheckboxTree };\n"],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.cjs","names":["React","cn","Icon","ChevronRight","Checkbox"],"sources":["../../../src/primitives/CheckboxTree/CheckboxTree.tsx"],"sourcesContent":["\"use client\";\n\nimport { Icon } from \"@/primitives/Icon\";\nimport { ChevronRight } from \"lucide-react\";\nimport * as React from \"react\";\n\nimport { Checkbox } from \"@/primitives/Checkbox\";\nimport { cn } from \"@/utils\";\n\n// CheckboxTree — a hierarchical checkbox list with expand/collapse and\n// tri-state (checked / unchecked / indeterminate) propagation: toggling a branch\n// toggles all its descendants, and a branch reflects its children\n// (checked when all are, indeterminate when some are). Controlled via `value`\n// (the set of selected node ids, branches included when fully selected).\n\n/** A single node in the tree: a stable id, a label, and optional children. */\nexport interface CheckboxTreeNode {\n /** Stable unique identifier used for selection and expansion tracking. */\n id: string;\n /** Content rendered next to the checkbox. */\n label: React.ReactNode;\n /** Nested child nodes; presence makes this node a collapsible branch. */\n children?: CheckboxTreeNode[];\n}\n\ntype NodeState = \"checked\" | \"unchecked\" | \"indeterminate\";\n\n/** All ids in a node's subtree (the node itself + every descendant). */\nfunction collectIds(node: CheckboxTreeNode): string[] {\n if (!node.children?.length) return [node.id];\n return [node.id, ...node.children.flatMap(collectIds)];\n}\n\n/** A leaf is checked iff selected; a branch derives its state from its children. */\nfunction getNodeState(node: CheckboxTreeNode, selected: Set<string>): NodeState {\n if (!node.children?.length) return selected.has(node.id) ? \"checked\" : \"unchecked\";\n const states = node.children.map((child) => getNodeState(child, selected));\n if (states.every((s) => s === \"checked\")) return \"checked\";\n if (states.every((s) => s === \"unchecked\")) return \"unchecked\";\n return \"indeterminate\";\n}\n\ninterface CheckboxTreeProps extends Omit<React.ComponentProps<\"div\">, \"onChange\"> {\n /** The hierarchical node data to render. */\n nodes: CheckboxTreeNode[];\n /** Selected node ids (controlled). Includes branch ids when fully selected. */\n value: string[];\n /** Called with the next selected ids whenever a node (and its subtree) is toggled. */\n onValueChange?: (value: string[]) => void;\n /** Node ids expanded on first render. */\n defaultExpandedIds?: string[];\n}\n\n/**\n * A hierarchical checkbox list with expand/collapse and tri-state\n * (checked / unchecked / indeterminate) propagation across each subtree.\n */\nfunction CheckboxTree({\n nodes,\n value,\n onValueChange,\n defaultExpandedIds,\n className,\n ...props\n}: CheckboxTreeProps) {\n const [expanded, setExpanded] = React.useState<Set<string>>(\n () => new Set(defaultExpandedIds ?? []),\n );\n const selected = React.useMemo(() => new Set(value), [value]);\n\n const toggleExpand = (id: string) =>\n setExpanded((prev) => {\n const next = new Set(prev);\n if (next.has(id)) next.delete(id);\n else next.add(id);\n return next;\n });\n\n const toggleSelect = (node: CheckboxTreeNode) => {\n const ids = collectIds(node);\n const allSelected = ids.every((id) => selected.has(id));\n const next = new Set(selected);\n for (const id of ids) {\n if (allSelected) next.delete(id);\n else next.add(id);\n }\n onValueChange?.([...next]);\n };\n\n return (\n <div\n role=\"tree\"\n data-slot=\"checkbox-tree\"\n className={cn(\"flex flex-col gap-1\", className)}\n {...props}\n >\n {nodes.map((node) => (\n <TreeNode\n key={node.id}\n node={node}\n depth={0}\n selected={selected}\n expanded={expanded}\n onToggleSelect={toggleSelect}\n onToggleExpand={toggleExpand}\n />\n ))}\n </div>\n );\n}\n\ninterface TreeNodeProps {\n /** The node rendered by this row. */\n node: CheckboxTreeNode;\n /** Nesting depth, used for indentation and heading emphasis. */\n depth: number;\n /** Set of currently selected node ids. */\n selected: Set<string>;\n /** Set of currently expanded node ids. */\n expanded: Set<string>;\n /** Toggles selection of the node and its subtree. */\n onToggleSelect: (node: CheckboxTreeNode) => void;\n /** Toggles the expanded/collapsed state of a branch. */\n onToggleExpand: (id: string) => void;\n}\n\n/** Renders a single tree row plus, when expanded, its child rows recursively. */\nfunction TreeNode({\n node,\n depth,\n selected,\n expanded,\n onToggleSelect,\n onToggleExpand,\n}: TreeNodeProps) {\n const hasChildren = !!node.children?.length;\n const isExpanded = expanded.has(node.id);\n const state = getNodeState(node, selected);\n const checkboxId = React.useId();\n\n return (\n <div\n role=\"treeitem\"\n aria-expanded={hasChildren ? isExpanded : undefined}\n aria-checked={state === \"indeterminate\" ? \"mixed\" : state === \"checked\"}\n >\n <div className=\"flex items-center gap-1\" style={{ paddingLeft: `${depth * 1.5}rem` }}>\n {hasChildren ? (\n <button\n type=\"button\"\n onClick={() => onToggleExpand(node.id)}\n aria-label={isExpanded ? \"Collapse\" : \"Expand\"}\n className=\"flex size-5 shrink-0 items-center justify-center text-muted-txt hover:text-primary-txt\"\n >\n <Icon\n as={ChevronRight}\n className={cn(\"size-4 transition-transform\", isExpanded && \"rotate-90\")}\n />\n </button>\n ) : (\n <span className=\"w-5 shrink-0\" />\n )}\n <label\n htmlFor={checkboxId}\n className=\"flex flex-1 cursor-pointer items-center gap-2 rounded-6 px-2 py-1.5 transition-colors hover:bg-muted-bg/40\"\n >\n <Checkbox\n id={checkboxId}\n checked={state === \"indeterminate\" ? \"indeterminate\" : state === \"checked\"}\n onCheckedChange={() => onToggleSelect(node)}\n />\n <span className={cn(\"text-sm\", depth === 0 && \"font-medium\")}>{node.label}</span>\n </label>\n </div>\n {hasChildren && isExpanded && (\n <div role=\"group\">\n {node.children?.map((child) => (\n <TreeNode\n key={child.id}\n node={child}\n depth={depth + 1}\n selected={selected}\n expanded={expanded}\n onToggleSelect={onToggleSelect}\n onToggleExpand={onToggleExpand}\n />\n ))}\n </div>\n )}\n </div>\n );\n}\n\nexport { CheckboxTree };\n"],"mappings":"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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { n as CheckboxTreeNode, t as CheckboxTree } from "../../
|
|
1
|
+
import { n as CheckboxTreeNode, t as CheckboxTree } from "../../index17.cjs";
|
|
2
2
|
export { CheckboxTree, CheckboxTreeNode };
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { n as CheckboxTreeNode, t as CheckboxTree } from "../../
|
|
1
|
+
import { n as CheckboxTreeNode, t as CheckboxTree } from "../../index17.js";
|
|
2
2
|
export { CheckboxTree, CheckboxTreeNode };
|
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
import { t as cn } from "../../cn.js";
|
|
2
|
+
import { t as Icon } from "../../Icon.js";
|
|
2
3
|
import { Checkbox } from "../Checkbox/index.js";
|
|
3
4
|
import * as React from "react";
|
|
4
|
-
import { ChevronRight } from "lucide-react";
|
|
5
5
|
import { jsx, jsxs } from "react/jsx-runtime";
|
|
6
|
+
import { ChevronRight } from "lucide-react";
|
|
6
7
|
//#region src/primitives/CheckboxTree/CheckboxTree.tsx
|
|
7
8
|
/** All ids in a node's subtree (the node itself + every descendant). */
|
|
8
9
|
function collectIds(node) {
|
|
@@ -71,7 +72,10 @@ function TreeNode({ node, depth, selected, expanded, onToggleSelect, onToggleExp
|
|
|
71
72
|
onClick: () => onToggleExpand(node.id),
|
|
72
73
|
"aria-label": isExpanded ? "Collapse" : "Expand",
|
|
73
74
|
className: "flex size-5 shrink-0 items-center justify-center text-muted-txt hover:text-primary-txt",
|
|
74
|
-
children: /* @__PURE__ */ jsx(
|
|
75
|
+
children: /* @__PURE__ */ jsx(Icon, {
|
|
76
|
+
as: ChevronRight,
|
|
77
|
+
className: cn("size-4 transition-transform", isExpanded && "rotate-90")
|
|
78
|
+
})
|
|
75
79
|
}) : /* @__PURE__ */ jsx("span", { className: "w-5 shrink-0" }), /* @__PURE__ */ jsxs("label", {
|
|
76
80
|
htmlFor: checkboxId,
|
|
77
81
|
className: "flex flex-1 cursor-pointer items-center gap-2 rounded-6 px-2 py-1.5 transition-colors hover:bg-muted-bg/40",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":[],"sources":["../../../src/primitives/CheckboxTree/CheckboxTree.tsx"],"sourcesContent":["\"use client\";\n\nimport { ChevronRight } from \"lucide-react\";\nimport * as React from \"react\";\n\nimport { Checkbox } from \"@/primitives/Checkbox\";\nimport { cn } from \"@/utils\";\n\n// CheckboxTree — a hierarchical checkbox list with expand/collapse and\n// tri-state (checked / unchecked / indeterminate) propagation: toggling a branch\n// toggles all its descendants, and a branch reflects its children\n// (checked when all are, indeterminate when some are). Controlled via `value`\n// (the set of selected node ids, branches included when fully selected).\n\n/** A single node in the tree: a stable id, a label, and optional children. */\nexport interface CheckboxTreeNode {\n /** Stable unique identifier used for selection and expansion tracking. */\n id: string;\n /** Content rendered next to the checkbox. */\n label: React.ReactNode;\n /** Nested child nodes; presence makes this node a collapsible branch. */\n children?: CheckboxTreeNode[];\n}\n\ntype NodeState = \"checked\" | \"unchecked\" | \"indeterminate\";\n\n/** All ids in a node's subtree (the node itself + every descendant). */\nfunction collectIds(node: CheckboxTreeNode): string[] {\n if (!node.children?.length) return [node.id];\n return [node.id, ...node.children.flatMap(collectIds)];\n}\n\n/** A leaf is checked iff selected; a branch derives its state from its children. */\nfunction getNodeState(node: CheckboxTreeNode, selected: Set<string>): NodeState {\n if (!node.children?.length) return selected.has(node.id) ? \"checked\" : \"unchecked\";\n const states = node.children.map((child) => getNodeState(child, selected));\n if (states.every((s) => s === \"checked\")) return \"checked\";\n if (states.every((s) => s === \"unchecked\")) return \"unchecked\";\n return \"indeterminate\";\n}\n\ninterface CheckboxTreeProps extends Omit<React.ComponentProps<\"div\">, \"onChange\"> {\n /** The hierarchical node data to render. */\n nodes: CheckboxTreeNode[];\n /** Selected node ids (controlled). Includes branch ids when fully selected. */\n value: string[];\n /** Called with the next selected ids whenever a node (and its subtree) is toggled. */\n onValueChange?: (value: string[]) => void;\n /** Node ids expanded on first render. */\n defaultExpandedIds?: string[];\n}\n\n/**\n * A hierarchical checkbox list with expand/collapse and tri-state\n * (checked / unchecked / indeterminate) propagation across each subtree.\n */\nfunction CheckboxTree({\n nodes,\n value,\n onValueChange,\n defaultExpandedIds,\n className,\n ...props\n}: CheckboxTreeProps) {\n const [expanded, setExpanded] = React.useState<Set<string>>(\n () => new Set(defaultExpandedIds ?? []),\n );\n const selected = React.useMemo(() => new Set(value), [value]);\n\n const toggleExpand = (id: string) =>\n setExpanded((prev) => {\n const next = new Set(prev);\n if (next.has(id)) next.delete(id);\n else next.add(id);\n return next;\n });\n\n const toggleSelect = (node: CheckboxTreeNode) => {\n const ids = collectIds(node);\n const allSelected = ids.every((id) => selected.has(id));\n const next = new Set(selected);\n for (const id of ids) {\n if (allSelected) next.delete(id);\n else next.add(id);\n }\n onValueChange?.([...next]);\n };\n\n return (\n <div\n role=\"tree\"\n data-slot=\"checkbox-tree\"\n className={cn(\"flex flex-col gap-1\", className)}\n {...props}\n >\n {nodes.map((node) => (\n <TreeNode\n key={node.id}\n node={node}\n depth={0}\n selected={selected}\n expanded={expanded}\n onToggleSelect={toggleSelect}\n onToggleExpand={toggleExpand}\n />\n ))}\n </div>\n );\n}\n\ninterface TreeNodeProps {\n /** The node rendered by this row. */\n node: CheckboxTreeNode;\n /** Nesting depth, used for indentation and heading emphasis. */\n depth: number;\n /** Set of currently selected node ids. */\n selected: Set<string>;\n /** Set of currently expanded node ids. */\n expanded: Set<string>;\n /** Toggles selection of the node and its subtree. */\n onToggleSelect: (node: CheckboxTreeNode) => void;\n /** Toggles the expanded/collapsed state of a branch. */\n onToggleExpand: (id: string) => void;\n}\n\n/** Renders a single tree row plus, when expanded, its child rows recursively. */\nfunction TreeNode({\n node,\n depth,\n selected,\n expanded,\n onToggleSelect,\n onToggleExpand,\n}: TreeNodeProps) {\n const hasChildren = !!node.children?.length;\n const isExpanded = expanded.has(node.id);\n const state = getNodeState(node, selected);\n const checkboxId = React.useId();\n\n return (\n <div\n role=\"treeitem\"\n aria-expanded={hasChildren ? isExpanded : undefined}\n aria-checked={state === \"indeterminate\" ? \"mixed\" : state === \"checked\"}\n >\n <div className=\"flex items-center gap-1\" style={{ paddingLeft: `${depth * 1.5}rem` }}>\n {hasChildren ? (\n <button\n type=\"button\"\n onClick={() => onToggleExpand(node.id)}\n aria-label={isExpanded ? \"Collapse\" : \"Expand\"}\n className=\"flex size-5 shrink-0 items-center justify-center text-muted-txt hover:text-primary-txt\"\n >\n <ChevronRight\n className={cn(\"size-4 transition-transform\", isExpanded && \"rotate-90\")}\n />\n </button>\n ) : (\n <span className=\"w-5 shrink-0\" />\n )}\n <label\n htmlFor={checkboxId}\n className=\"flex flex-1 cursor-pointer items-center gap-2 rounded-6 px-2 py-1.5 transition-colors hover:bg-muted-bg/40\"\n >\n <Checkbox\n id={checkboxId}\n checked={state === \"indeterminate\" ? \"indeterminate\" : state === \"checked\"}\n onCheckedChange={() => onToggleSelect(node)}\n />\n <span className={cn(\"text-sm\", depth === 0 && \"font-medium\")}>{node.label}</span>\n </label>\n </div>\n {hasChildren && isExpanded && (\n <div role=\"group\">\n {node.children?.map((child) => (\n <TreeNode\n key={child.id}\n node={child}\n depth={depth + 1}\n selected={selected}\n expanded={expanded}\n onToggleSelect={onToggleSelect}\n onToggleExpand={onToggleExpand}\n />\n ))}\n </div>\n )}\n </div>\n );\n}\n\nexport { CheckboxTree };\n"],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.js","names":[],"sources":["../../../src/primitives/CheckboxTree/CheckboxTree.tsx"],"sourcesContent":["\"use client\";\n\nimport { Icon } from \"@/primitives/Icon\";\nimport { ChevronRight } from \"lucide-react\";\nimport * as React from \"react\";\n\nimport { Checkbox } from \"@/primitives/Checkbox\";\nimport { cn } from \"@/utils\";\n\n// CheckboxTree — a hierarchical checkbox list with expand/collapse and\n// tri-state (checked / unchecked / indeterminate) propagation: toggling a branch\n// toggles all its descendants, and a branch reflects its children\n// (checked when all are, indeterminate when some are). Controlled via `value`\n// (the set of selected node ids, branches included when fully selected).\n\n/** A single node in the tree: a stable id, a label, and optional children. */\nexport interface CheckboxTreeNode {\n /** Stable unique identifier used for selection and expansion tracking. */\n id: string;\n /** Content rendered next to the checkbox. */\n label: React.ReactNode;\n /** Nested child nodes; presence makes this node a collapsible branch. */\n children?: CheckboxTreeNode[];\n}\n\ntype NodeState = \"checked\" | \"unchecked\" | \"indeterminate\";\n\n/** All ids in a node's subtree (the node itself + every descendant). */\nfunction collectIds(node: CheckboxTreeNode): string[] {\n if (!node.children?.length) return [node.id];\n return [node.id, ...node.children.flatMap(collectIds)];\n}\n\n/** A leaf is checked iff selected; a branch derives its state from its children. */\nfunction getNodeState(node: CheckboxTreeNode, selected: Set<string>): NodeState {\n if (!node.children?.length) return selected.has(node.id) ? \"checked\" : \"unchecked\";\n const states = node.children.map((child) => getNodeState(child, selected));\n if (states.every((s) => s === \"checked\")) return \"checked\";\n if (states.every((s) => s === \"unchecked\")) return \"unchecked\";\n return \"indeterminate\";\n}\n\ninterface CheckboxTreeProps extends Omit<React.ComponentProps<\"div\">, \"onChange\"> {\n /** The hierarchical node data to render. */\n nodes: CheckboxTreeNode[];\n /** Selected node ids (controlled). Includes branch ids when fully selected. */\n value: string[];\n /** Called with the next selected ids whenever a node (and its subtree) is toggled. */\n onValueChange?: (value: string[]) => void;\n /** Node ids expanded on first render. */\n defaultExpandedIds?: string[];\n}\n\n/**\n * A hierarchical checkbox list with expand/collapse and tri-state\n * (checked / unchecked / indeterminate) propagation across each subtree.\n */\nfunction CheckboxTree({\n nodes,\n value,\n onValueChange,\n defaultExpandedIds,\n className,\n ...props\n}: CheckboxTreeProps) {\n const [expanded, setExpanded] = React.useState<Set<string>>(\n () => new Set(defaultExpandedIds ?? []),\n );\n const selected = React.useMemo(() => new Set(value), [value]);\n\n const toggleExpand = (id: string) =>\n setExpanded((prev) => {\n const next = new Set(prev);\n if (next.has(id)) next.delete(id);\n else next.add(id);\n return next;\n });\n\n const toggleSelect = (node: CheckboxTreeNode) => {\n const ids = collectIds(node);\n const allSelected = ids.every((id) => selected.has(id));\n const next = new Set(selected);\n for (const id of ids) {\n if (allSelected) next.delete(id);\n else next.add(id);\n }\n onValueChange?.([...next]);\n };\n\n return (\n <div\n role=\"tree\"\n data-slot=\"checkbox-tree\"\n className={cn(\"flex flex-col gap-1\", className)}\n {...props}\n >\n {nodes.map((node) => (\n <TreeNode\n key={node.id}\n node={node}\n depth={0}\n selected={selected}\n expanded={expanded}\n onToggleSelect={toggleSelect}\n onToggleExpand={toggleExpand}\n />\n ))}\n </div>\n );\n}\n\ninterface TreeNodeProps {\n /** The node rendered by this row. */\n node: CheckboxTreeNode;\n /** Nesting depth, used for indentation and heading emphasis. */\n depth: number;\n /** Set of currently selected node ids. */\n selected: Set<string>;\n /** Set of currently expanded node ids. */\n expanded: Set<string>;\n /** Toggles selection of the node and its subtree. */\n onToggleSelect: (node: CheckboxTreeNode) => void;\n /** Toggles the expanded/collapsed state of a branch. */\n onToggleExpand: (id: string) => void;\n}\n\n/** Renders a single tree row plus, when expanded, its child rows recursively. */\nfunction TreeNode({\n node,\n depth,\n selected,\n expanded,\n onToggleSelect,\n onToggleExpand,\n}: TreeNodeProps) {\n const hasChildren = !!node.children?.length;\n const isExpanded = expanded.has(node.id);\n const state = getNodeState(node, selected);\n const checkboxId = React.useId();\n\n return (\n <div\n role=\"treeitem\"\n aria-expanded={hasChildren ? isExpanded : undefined}\n aria-checked={state === \"indeterminate\" ? \"mixed\" : state === \"checked\"}\n >\n <div className=\"flex items-center gap-1\" style={{ paddingLeft: `${depth * 1.5}rem` }}>\n {hasChildren ? (\n <button\n type=\"button\"\n onClick={() => onToggleExpand(node.id)}\n aria-label={isExpanded ? \"Collapse\" : \"Expand\"}\n className=\"flex size-5 shrink-0 items-center justify-center text-muted-txt hover:text-primary-txt\"\n >\n <Icon\n as={ChevronRight}\n className={cn(\"size-4 transition-transform\", isExpanded && \"rotate-90\")}\n />\n </button>\n ) : (\n <span className=\"w-5 shrink-0\" />\n )}\n <label\n htmlFor={checkboxId}\n className=\"flex flex-1 cursor-pointer items-center gap-2 rounded-6 px-2 py-1.5 transition-colors hover:bg-muted-bg/40\"\n >\n <Checkbox\n id={checkboxId}\n checked={state === \"indeterminate\" ? \"indeterminate\" : state === \"checked\"}\n onCheckedChange={() => onToggleSelect(node)}\n />\n <span className={cn(\"text-sm\", depth === 0 && \"font-medium\")}>{node.label}</span>\n </label>\n </div>\n {hasChildren && isExpanded && (\n <div role=\"group\">\n {node.children?.map((child) => (\n <TreeNode\n key={child.id}\n node={child}\n depth={depth + 1}\n selected={selected}\n expanded={expanded}\n onToggleSelect={onToggleSelect}\n onToggleExpand={onToggleExpand}\n />\n ))}\n </div>\n )}\n </div>\n );\n}\n\nexport { CheckboxTree };\n"],"mappings":"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"}
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
2
|
+
const require_cn = require("../../cn.cjs");
|
|
3
|
+
let react_jsx_runtime = require("react/jsx-runtime");
|
|
4
|
+
//#region src/primitives/CircularProgress/CircularProgress.tsx
|
|
5
|
+
const indicatorVariants = {
|
|
6
|
+
default: "text-primary-invert-bg",
|
|
7
|
+
brand: "text-brand-500-primary",
|
|
8
|
+
success: "text-success-txt",
|
|
9
|
+
warning: "text-warning-txt",
|
|
10
|
+
info: "text-info-txt",
|
|
11
|
+
destructive: "text-danger-txt",
|
|
12
|
+
analyzing: "text-[var(--progress-analyzing)]",
|
|
13
|
+
ingesting: "text-[var(--progress-ingesting)]"
|
|
14
|
+
};
|
|
15
|
+
const trackVariants = {
|
|
16
|
+
default: "text-primary-border",
|
|
17
|
+
brand: "text-brand-500-primary/20",
|
|
18
|
+
success: "text-success-txt/20",
|
|
19
|
+
warning: "text-warning-txt/20",
|
|
20
|
+
info: "text-info-txt/20",
|
|
21
|
+
destructive: "text-danger-txt/20",
|
|
22
|
+
analyzing: "text-primary-invert-bg/20",
|
|
23
|
+
ingesting: "text-primary-invert-bg/20"
|
|
24
|
+
};
|
|
25
|
+
function clamp(value, min, max) {
|
|
26
|
+
return Math.min(max, Math.max(min, value));
|
|
27
|
+
}
|
|
28
|
+
/** Circular progress indicator supporting determinate and indeterminate states. */
|
|
29
|
+
function CircularProgress({ className, value, min = 0, max = 100, size = 48, strokeWidth = 4, variant = "default", trackVariant, progressColor, trackColor, label, showValueLabel = false, indeterminateLabel = "Loading", style, "aria-label": ariaLabelProp, "aria-valuetext": ariaValueTextProp, ...props }) {
|
|
30
|
+
const normalizedMax = max > min ? max : min + 100;
|
|
31
|
+
const boundedValue = value == null ? void 0 : clamp(value, min, normalizedMax);
|
|
32
|
+
const indeterminate = boundedValue == null;
|
|
33
|
+
const percent = indeterminate ? void 0 : (boundedValue - min) / (normalizedMax - min) * 100;
|
|
34
|
+
const roundedPercent = percent == null ? void 0 : Math.round(percent);
|
|
35
|
+
const normalizedSize = Math.max(size, 12);
|
|
36
|
+
const normalizedStrokeWidth = clamp(strokeWidth, 1, normalizedSize / 2);
|
|
37
|
+
const radius = (normalizedSize - normalizedStrokeWidth) / 2;
|
|
38
|
+
const circumference = 2 * Math.PI * radius;
|
|
39
|
+
const centerLabel = label ?? (showValueLabel && roundedPercent != null ? `${roundedPercent}%` : null);
|
|
40
|
+
const ariaValueText = ariaValueTextProp ?? (indeterminate ? indeterminateLabel : `${roundedPercent}% complete`);
|
|
41
|
+
return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
42
|
+
"data-slot": "circular-progress",
|
|
43
|
+
"data-state": indeterminate ? "indeterminate" : "determinate",
|
|
44
|
+
role: "progressbar",
|
|
45
|
+
"aria-label": ariaLabelProp ?? "Progress",
|
|
46
|
+
"aria-valuemin": min,
|
|
47
|
+
"aria-valuemax": normalizedMax,
|
|
48
|
+
"aria-valuenow": indeterminate ? void 0 : boundedValue,
|
|
49
|
+
"aria-valuetext": ariaValueText,
|
|
50
|
+
className: require_cn.cn("relative inline-flex shrink-0 items-center justify-center rounded-full text-primary-txt outline-none focus-visible:ring-3 focus-visible:ring-focus", className),
|
|
51
|
+
style: {
|
|
52
|
+
width: normalizedSize,
|
|
53
|
+
height: normalizedSize,
|
|
54
|
+
...style
|
|
55
|
+
},
|
|
56
|
+
...props,
|
|
57
|
+
children: [
|
|
58
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("svg", {
|
|
59
|
+
"data-slot": "circular-progress-svg",
|
|
60
|
+
width: normalizedSize,
|
|
61
|
+
height: normalizedSize,
|
|
62
|
+
viewBox: `0 0 ${normalizedSize} ${normalizedSize}`,
|
|
63
|
+
className: require_cn.cn("size-full -rotate-90", indeterminate && "motion-safe:animate-spin"),
|
|
64
|
+
children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("circle", {
|
|
65
|
+
"data-slot": "circular-progress-track",
|
|
66
|
+
cx: normalizedSize / 2,
|
|
67
|
+
cy: normalizedSize / 2,
|
|
68
|
+
r: radius,
|
|
69
|
+
fill: "none",
|
|
70
|
+
strokeWidth: normalizedStrokeWidth,
|
|
71
|
+
className: require_cn.cn("stroke-current", trackColor ? void 0 : trackVariants[trackVariant ?? variant]),
|
|
72
|
+
style: trackColor ? { stroke: trackColor } : void 0
|
|
73
|
+
}), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("circle", {
|
|
74
|
+
"data-slot": "circular-progress-indicator",
|
|
75
|
+
cx: normalizedSize / 2,
|
|
76
|
+
cy: normalizedSize / 2,
|
|
77
|
+
r: radius,
|
|
78
|
+
fill: "none",
|
|
79
|
+
strokeWidth: normalizedStrokeWidth,
|
|
80
|
+
strokeLinecap: "round",
|
|
81
|
+
className: require_cn.cn("stroke-current motion-reduce:transition-none", progressColor ? void 0 : indicatorVariants[variant], indeterminate ? void 0 : "transition-[stroke-dashoffset] duration-500 ease-out"),
|
|
82
|
+
style: {
|
|
83
|
+
strokeDasharray: indeterminate ? `${circumference * .35} ${circumference}` : `${circumference}`,
|
|
84
|
+
strokeDashoffset: indeterminate ? `${circumference * .1}` : `${circumference - (percent ?? 0) / 100 * circumference}`,
|
|
85
|
+
...progressColor ? { stroke: progressColor } : {}
|
|
86
|
+
}
|
|
87
|
+
})]
|
|
88
|
+
}),
|
|
89
|
+
centerLabel ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
|
|
90
|
+
"data-slot": "circular-progress-label",
|
|
91
|
+
"aria-hidden": "true",
|
|
92
|
+
className: "pointer-events-none absolute inset-0 flex items-center justify-center font-medium text-[11px] leading-none",
|
|
93
|
+
children: centerLabel
|
|
94
|
+
}) : null,
|
|
95
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
|
|
96
|
+
className: "sr-only",
|
|
97
|
+
"aria-live": "polite",
|
|
98
|
+
children: indeterminate ? indeterminateLabel : `${roundedPercent}% complete`
|
|
99
|
+
})
|
|
100
|
+
]
|
|
101
|
+
});
|
|
102
|
+
}
|
|
103
|
+
//#endregion
|
|
104
|
+
exports.CircularProgress = CircularProgress;
|
|
105
|
+
|
|
106
|
+
//# sourceMappingURL=index.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.cjs","names":["cn"],"sources":["../../../src/primitives/CircularProgress/CircularProgress.tsx"],"sourcesContent":["import type * as React from \"react\";\n\nimport { cn } from \"@/utils\";\n\nconst indicatorVariants = {\n default: \"text-primary-invert-bg\",\n brand: \"text-brand-500-primary\",\n success: \"text-success-txt\",\n warning: \"text-warning-txt\",\n info: \"text-info-txt\",\n destructive: \"text-danger-txt\",\n analyzing: \"text-[var(--progress-analyzing)]\",\n ingesting: \"text-[var(--progress-ingesting)]\",\n} as const;\n\nconst trackVariants = {\n default: \"text-primary-border\",\n brand: \"text-brand-500-primary/20\",\n success: \"text-success-txt/20\",\n warning: \"text-warning-txt/20\",\n info: \"text-info-txt/20\",\n destructive: \"text-danger-txt/20\",\n analyzing: \"text-primary-invert-bg/20\",\n ingesting: \"text-primary-invert-bg/20\",\n} as const;\n\ntype CircularProgressVariant = keyof typeof indicatorVariants;\n\ntype CircularProgressProps = Omit<React.ComponentProps<\"div\">, \"children\"> & {\n /** Determinate value. Omit for indeterminate/loading state. */\n value?: number;\n /** Lower bound used for ARIA/value normalization. */\n min?: number;\n /** Upper bound used for ARIA/value normalization. */\n max?: number;\n /** Rendered diameter in px. */\n size?: number;\n /** Stroke thickness in px. */\n strokeWidth?: number;\n /** Semantic colour variant for the progress stroke. */\n variant?: CircularProgressVariant;\n /** Semantic colour variant for the track stroke. Defaults to `variant`. */\n trackVariant?: CircularProgressVariant;\n /** Explicit progress stroke colour (CSS colour value). Overrides `variant`. */\n progressColor?: string;\n /** Explicit track stroke colour (CSS colour value). Overrides `trackVariant`. */\n trackColor?: string;\n /** Optional centered label content. */\n label?: React.ReactNode;\n /** Render computed percentage text in the center when determinate. */\n showValueLabel?: boolean;\n /** Accessible text for indeterminate/loading state. */\n indeterminateLabel?: string;\n};\n\nfunction clamp(value: number, min: number, max: number) {\n return Math.min(max, Math.max(min, value));\n}\n\n/** Circular progress indicator supporting determinate and indeterminate states. */\nfunction CircularProgress({\n className,\n value,\n min = 0,\n max = 100,\n size = 48,\n strokeWidth = 4,\n variant = \"default\",\n trackVariant,\n progressColor,\n trackColor,\n label,\n showValueLabel = false,\n indeterminateLabel = \"Loading\",\n style,\n \"aria-label\": ariaLabelProp,\n \"aria-valuetext\": ariaValueTextProp,\n ...props\n}: CircularProgressProps) {\n const normalizedMax = max > min ? max : min + 100;\n const boundedValue = value == null ? undefined : clamp(value, min, normalizedMax);\n const indeterminate = boundedValue == null;\n\n const percent = indeterminate ? undefined : ((boundedValue - min) / (normalizedMax - min)) * 100;\n const roundedPercent = percent == null ? undefined : Math.round(percent);\n\n const normalizedSize = Math.max(size, 12);\n const normalizedStrokeWidth = clamp(strokeWidth, 1, normalizedSize / 2);\n const radius = (normalizedSize - normalizedStrokeWidth) / 2;\n const circumference = 2 * Math.PI * radius;\n\n const centerLabel =\n label ?? (showValueLabel && roundedPercent != null ? `${roundedPercent}%` : null);\n const ariaValueText =\n ariaValueTextProp ?? (indeterminate ? indeterminateLabel : `${roundedPercent}% complete`);\n\n return (\n <div\n data-slot=\"circular-progress\"\n data-state={indeterminate ? \"indeterminate\" : \"determinate\"}\n role=\"progressbar\"\n aria-label={ariaLabelProp ?? \"Progress\"}\n aria-valuemin={min}\n aria-valuemax={normalizedMax}\n aria-valuenow={indeterminate ? undefined : boundedValue}\n aria-valuetext={ariaValueText}\n className={cn(\n \"relative inline-flex shrink-0 items-center justify-center rounded-full text-primary-txt outline-none focus-visible:ring-3 focus-visible:ring-focus\",\n className,\n )}\n style={{ width: normalizedSize, height: normalizedSize, ...style }}\n {...props}\n >\n <svg\n data-slot=\"circular-progress-svg\"\n width={normalizedSize}\n height={normalizedSize}\n viewBox={`0 0 ${normalizedSize} ${normalizedSize}`}\n className={cn(\"size-full -rotate-90\", indeterminate && \"motion-safe:animate-spin\")}\n >\n <circle\n data-slot=\"circular-progress-track\"\n cx={normalizedSize / 2}\n cy={normalizedSize / 2}\n r={radius}\n fill=\"none\"\n strokeWidth={normalizedStrokeWidth}\n className={cn(\n \"stroke-current\",\n trackColor ? undefined : trackVariants[trackVariant ?? variant],\n )}\n style={trackColor ? { stroke: trackColor } : undefined}\n />\n <circle\n data-slot=\"circular-progress-indicator\"\n cx={normalizedSize / 2}\n cy={normalizedSize / 2}\n r={radius}\n fill=\"none\"\n strokeWidth={normalizedStrokeWidth}\n strokeLinecap=\"round\"\n className={cn(\n \"stroke-current motion-reduce:transition-none\",\n progressColor ? undefined : indicatorVariants[variant],\n indeterminate ? undefined : \"transition-[stroke-dashoffset] duration-500 ease-out\",\n )}\n style={{\n strokeDasharray: indeterminate\n ? `${circumference * 0.35} ${circumference}`\n : `${circumference}`,\n strokeDashoffset: indeterminate\n ? `${circumference * 0.1}`\n : `${circumference - ((percent ?? 0) / 100) * circumference}`,\n ...(progressColor ? { stroke: progressColor } : {}),\n }}\n />\n </svg>\n\n {centerLabel ? (\n <span\n data-slot=\"circular-progress-label\"\n aria-hidden=\"true\"\n className=\"pointer-events-none absolute inset-0 flex items-center justify-center font-medium text-[11px] leading-none\"\n >\n {centerLabel}\n </span>\n ) : null}\n\n <span className=\"sr-only\" aria-live=\"polite\">\n {indeterminate ? indeterminateLabel : `${roundedPercent}% complete`}\n </span>\n </div>\n );\n}\n\nexport { CircularProgress, type CircularProgressProps, type CircularProgressVariant };\n"],"mappings":"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"}
|