@zentauri-ui/zentauri-components 1.7.4 → 1.7.6
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/README.md +9 -4
- package/cli/registry.json +3 -0
- package/dist/{chunk-CL55KGDF.js → chunk-3W224B3M.js} +22 -22
- package/dist/chunk-3W224B3M.js.map +1 -0
- package/dist/{chunk-NZDHSIIC.js → chunk-4OCTFG3W.js} +3 -3
- package/dist/chunk-4OCTFG3W.js.map +1 -0
- package/dist/{chunk-4ZKBLVQX.js → chunk-5565GZ4T.js} +19 -19
- package/dist/chunk-5565GZ4T.js.map +1 -0
- package/dist/{chunk-BTJYXKCW.js → chunk-6HPS3ZOP.js} +15 -15
- package/dist/chunk-6HPS3ZOP.js.map +1 -0
- package/dist/chunk-7XCUMSCJ.mjs +80 -0
- package/dist/chunk-7XCUMSCJ.mjs.map +1 -0
- package/dist/{chunk-QAJOE3HJ.js → chunk-BU2MPXPZ.js} +6 -6
- package/dist/chunk-BU2MPXPZ.js.map +1 -0
- package/dist/{chunk-BC6M42HQ.mjs → chunk-CL3VH223.mjs} +21 -21
- package/dist/chunk-CL3VH223.mjs.map +1 -0
- package/dist/{chunk-QXHS3HHZ.mjs → chunk-D3VZKUMH.mjs} +15 -15
- package/dist/chunk-D3VZKUMH.mjs.map +1 -0
- package/dist/chunk-DEZRB6DS.mjs +83 -0
- package/dist/chunk-DEZRB6DS.mjs.map +1 -0
- package/dist/{chunk-EDARAO7X.js → chunk-DFCDLVZA.js} +7 -7
- package/dist/chunk-DFCDLVZA.js.map +1 -0
- package/dist/{chunk-ACGVDY5J.mjs → chunk-EZCYSFML.mjs} +4 -4
- package/dist/chunk-EZCYSFML.mjs.map +1 -0
- package/dist/{chunk-ZYKJC5HH.js → chunk-G66SXATZ.js} +15 -15
- package/dist/chunk-G66SXATZ.js.map +1 -0
- package/dist/{chunk-QBPVJH4P.mjs → chunk-H7WDA6U6.mjs} +5 -5
- package/dist/chunk-H7WDA6U6.mjs.map +1 -0
- package/dist/{chunk-OZMSE44N.mjs → chunk-HLG2YJFZ.mjs} +19 -19
- package/dist/chunk-HLG2YJFZ.mjs.map +1 -0
- package/dist/{chunk-QYLTKBH7.js → chunk-INXWZ4DS.js} +3 -3
- package/dist/chunk-INXWZ4DS.js.map +1 -0
- package/dist/{chunk-QSPXPU72.js → chunk-KTLJEPLF.js} +21 -21
- package/dist/chunk-KTLJEPLF.js.map +1 -0
- package/dist/chunk-LMIL2R4R.js +197 -0
- package/dist/chunk-LMIL2R4R.js.map +1 -0
- package/dist/{chunk-PR4QXFJT.js → chunk-LNYCEPW5.js} +5 -5
- package/dist/chunk-LNYCEPW5.js.map +1 -0
- package/dist/chunk-MEAVYU2Y.mjs +192 -0
- package/dist/chunk-MEAVYU2Y.mjs.map +1 -0
- package/dist/{chunk-P5WLYJ2C.mjs → chunk-NNZXBL7R.mjs} +6 -6
- package/dist/chunk-NNZXBL7R.mjs.map +1 -0
- package/dist/{chunk-HMNIH3KJ.mjs → chunk-ORFI4BCJ.mjs} +3 -3
- package/dist/chunk-ORFI4BCJ.mjs.map +1 -0
- package/dist/{chunk-K7TCW5PJ.js → chunk-PMALYOPA.js} +3 -3
- package/dist/chunk-PMALYOPA.js.map +1 -0
- package/dist/{chunk-WPXQHWPV.js → chunk-PYUZOVLY.js} +4 -4
- package/dist/chunk-PYUZOVLY.js.map +1 -0
- package/dist/{chunk-ITVMSCOJ.mjs → chunk-R2JJTREQ.mjs} +22 -22
- package/dist/chunk-R2JJTREQ.mjs.map +1 -0
- package/dist/chunk-RIHJAEOL.js +107 -0
- package/dist/chunk-RIHJAEOL.js.map +1 -0
- package/dist/{chunk-FHLZH3PB.mjs → chunk-SFRS4EZ5.mjs} +3 -3
- package/dist/chunk-SFRS4EZ5.mjs.map +1 -0
- package/dist/{chunk-KTGV76M3.mjs → chunk-SSJXWD2M.mjs} +3 -3
- package/dist/chunk-SSJXWD2M.mjs.map +1 -0
- package/dist/{chunk-YAO62VH2.js → chunk-UGH23TAH.js} +15 -15
- package/dist/chunk-UGH23TAH.js.map +1 -0
- package/dist/chunk-UPZ5XGUD.mjs +100 -0
- package/dist/chunk-UPZ5XGUD.mjs.map +1 -0
- package/dist/{chunk-4XVNQ7IY.mjs → chunk-UR7TNW45.mjs} +15 -15
- package/dist/chunk-UR7TNW45.mjs.map +1 -0
- package/dist/{chunk-HCGSEPOD.mjs → chunk-UROKWFPX.mjs} +7 -7
- package/dist/chunk-UROKWFPX.mjs.map +1 -0
- package/dist/chunk-V5JTDRV5.mjs +278 -0
- package/dist/chunk-V5JTDRV5.mjs.map +1 -0
- package/dist/{chunk-XRDVD2EN.js → chunk-X3O45MPI.js} +3 -3
- package/dist/{chunk-XRDVD2EN.js.map → chunk-X3O45MPI.js.map} +1 -1
- package/dist/{chunk-KEKMMNL5.mjs → chunk-XXRDLZW7.mjs} +3 -3
- package/dist/chunk-XXRDLZW7.mjs.map +1 -0
- package/dist/chunk-Z4KHAD6Y.js +295 -0
- package/dist/chunk-Z4KHAD6Y.js.map +1 -0
- package/dist/{chunk-NHQ3S4Y6.mjs → chunk-ZIFMIS7D.mjs} +15 -15
- package/dist/chunk-ZIFMIS7D.mjs.map +1 -0
- package/dist/chunk-ZUT7ZUM7.js +84 -0
- package/dist/chunk-ZUT7ZUM7.js.map +1 -0
- package/dist/chunk-ZX2IBIZT.js +92 -0
- package/dist/chunk-ZX2IBIZT.js.map +1 -0
- package/dist/design-system/accordion.d.ts +1 -1
- package/dist/design-system/alert.d.ts +5 -5
- package/dist/design-system/badge.d.ts +3 -3
- package/dist/design-system/card.d.ts +2 -2
- package/dist/design-system/checkbox.d.ts +10 -10
- package/dist/design-system/checkbox.d.ts.map +1 -1
- package/dist/design-system/command.d.ts +1 -1
- package/dist/design-system/command.d.ts.map +1 -1
- package/dist/design-system/context-menu.d.ts +41 -0
- package/dist/design-system/context-menu.d.ts.map +1 -0
- package/dist/design-system/drawer.d.ts +1 -1
- package/dist/design-system/dropdown.d.ts +31 -31
- package/dist/design-system/dropdown.d.ts.map +1 -1
- package/dist/design-system/file-upload.d.ts +15 -15
- package/dist/design-system/file-upload.d.ts.map +1 -1
- package/dist/design-system/index.d.ts +3 -0
- package/dist/design-system/index.d.ts.map +1 -1
- package/dist/design-system/inputs.d.ts +13 -13
- package/dist/design-system/inputs.d.ts.map +1 -1
- package/dist/design-system/modal.d.ts +1 -1
- package/dist/design-system/modal.d.ts.map +1 -1
- package/dist/design-system/pagination.d.ts +25 -25
- package/dist/design-system/popover.d.ts +19 -19
- package/dist/design-system/popover.d.ts.map +1 -1
- package/dist/design-system/radio-group.d.ts +10 -10
- package/dist/design-system/radio-group.d.ts.map +1 -1
- package/dist/design-system/scroll-area.d.ts +33 -0
- package/dist/design-system/scroll-area.d.ts.map +1 -0
- package/dist/design-system/select.d.ts +35 -35
- package/dist/design-system/select.d.ts.map +1 -1
- package/dist/design-system/skeleton.d.ts +13 -13
- package/dist/design-system/skeleton.d.ts.map +1 -1
- package/dist/design-system/slider.d.ts +23 -23
- package/dist/design-system/slider.d.ts.map +1 -1
- package/dist/design-system/stepper.d.ts +22 -22
- package/dist/design-system/table.d.ts +13 -13
- package/dist/design-system/tabs.d.ts +4 -4
- package/dist/design-system/tabs.d.ts.map +1 -1
- package/dist/design-system/timeline.d.ts +56 -0
- package/dist/design-system/timeline.d.ts.map +1 -0
- package/dist/design-system/toast.d.ts +17 -17
- package/dist/design-system/toast.d.ts.map +1 -1
- package/dist/design-system/toggle.d.ts +54 -54
- package/dist/design-system/toggle.d.ts.map +1 -1
- package/dist/design-system/tooltip.d.ts +20 -20
- package/dist/design-system/typography.d.ts +15 -15
- package/dist/ui/accordion/animated.js +7 -7
- package/dist/ui/accordion/animated.mjs +2 -2
- package/dist/ui/accordion.js +9 -9
- package/dist/ui/accordion.mjs +2 -2
- package/dist/ui/alert/animated/alert-animated.d.ts.map +1 -1
- package/dist/ui/alert/animated.js +2 -2
- package/dist/ui/alert/animated.js.map +1 -1
- package/dist/ui/alert/animated.mjs +1 -1
- package/dist/ui/alert/animated.mjs.map +1 -1
- package/dist/ui/alert.js +10 -10
- package/dist/ui/alert.mjs +2 -2
- package/dist/ui/badge/animated.js +2 -2
- package/dist/ui/badge/animated.mjs +1 -1
- package/dist/ui/badge/variants.d.ts +1 -1
- package/dist/ui/badge.js +4 -4
- package/dist/ui/badge.mjs +2 -2
- package/dist/ui/card/animated.js +7 -7
- package/dist/ui/card/animated.mjs +2 -2
- package/dist/ui/card.js +12 -12
- package/dist/ui/card.mjs +2 -2
- package/dist/ui/checkbox/animated.js +4 -4
- package/dist/ui/checkbox/animated.mjs +1 -1
- package/dist/ui/checkbox.js +8 -8
- package/dist/ui/checkbox.mjs +2 -2
- package/dist/ui/command/animated.js +2 -2
- package/dist/ui/command/animated.mjs +1 -1
- package/dist/ui/command.js +15 -15
- package/dist/ui/command.mjs +2 -2
- package/dist/ui/context-menu/context-menu.d.ts +11 -0
- package/dist/ui/context-menu/context-menu.d.ts.map +1 -0
- package/dist/ui/context-menu/index.d.ts +4 -0
- package/dist/ui/context-menu/index.d.ts.map +1 -0
- package/dist/ui/context-menu/types.d.ts +81 -0
- package/dist/ui/context-menu/types.d.ts.map +1 -0
- package/dist/ui/context-menu/variants.d.ts +7 -0
- package/dist/ui/context-menu/variants.d.ts.map +1 -0
- package/dist/ui/context-menu.js +500 -0
- package/dist/ui/context-menu.js.map +1 -0
- package/dist/ui/context-menu.mjs +488 -0
- package/dist/ui/context-menu.mjs.map +1 -0
- package/dist/ui/drawer/animated.js +11 -11
- package/dist/ui/drawer/animated.mjs +2 -2
- package/dist/ui/drawer.js +11 -11
- package/dist/ui/drawer.mjs +1 -1
- package/dist/ui/dropdown.js +9 -89
- package/dist/ui/dropdown.js.map +1 -1
- package/dist/ui/dropdown.mjs +1 -81
- package/dist/ui/dropdown.mjs.map +1 -1
- package/dist/ui/dynamic-stepper.js +47 -47
- package/dist/ui/dynamic-stepper.js.map +1 -1
- package/dist/ui/dynamic-stepper.mjs +47 -47
- package/dist/ui/dynamic-stepper.mjs.map +1 -1
- package/dist/ui/file-upload.js +15 -15
- package/dist/ui/file-upload.js.map +1 -1
- package/dist/ui/file-upload.mjs +15 -15
- package/dist/ui/file-upload.mjs.map +1 -1
- package/dist/ui/inputs/animated.js +3 -3
- package/dist/ui/inputs/animated.mjs +1 -1
- package/dist/ui/inputs.js +4 -4
- package/dist/ui/inputs.mjs +2 -2
- package/dist/ui/modal/animated.js +4 -4
- package/dist/ui/modal/animated.mjs +1 -1
- package/dist/ui/modal.js +12 -12
- package/dist/ui/modal.mjs +2 -2
- package/dist/ui/pagination.js +25 -25
- package/dist/ui/pagination.js.map +1 -1
- package/dist/ui/pagination.mjs +25 -25
- package/dist/ui/pagination.mjs.map +1 -1
- package/dist/ui/popover/animated.js +4 -4
- package/dist/ui/popover/animated.mjs +1 -1
- package/dist/ui/popover.js +7 -7
- package/dist/ui/popover.mjs +1 -1
- package/dist/ui/radio-group/animated.js +7 -7
- package/dist/ui/radio-group/animated.mjs +1 -1
- package/dist/ui/radio-group.js +11 -11
- package/dist/ui/radio-group.mjs +2 -2
- package/dist/ui/scroll-area/index.d.ts +4 -0
- package/dist/ui/scroll-area/index.d.ts.map +1 -0
- package/dist/ui/scroll-area/scroll-area.d.ts +6 -0
- package/dist/ui/scroll-area/scroll-area.d.ts.map +1 -0
- package/dist/ui/scroll-area/types.d.ts +8 -0
- package/dist/ui/scroll-area/types.d.ts.map +1 -0
- package/dist/ui/scroll-area/variants.d.ts +8 -0
- package/dist/ui/scroll-area/variants.d.ts.map +1 -0
- package/dist/ui/scroll-area.js +123 -0
- package/dist/ui/scroll-area.js.map +1 -0
- package/dist/ui/scroll-area.mjs +120 -0
- package/dist/ui/scroll-area.mjs.map +1 -0
- package/dist/ui/search.js +2 -2
- package/dist/ui/search.mjs +1 -1
- package/dist/ui/select.js +35 -35
- package/dist/ui/select.js.map +1 -1
- package/dist/ui/select.mjs +35 -35
- package/dist/ui/select.mjs.map +1 -1
- package/dist/ui/skeleton/animated.js +8 -8
- package/dist/ui/skeleton/animated.mjs +1 -1
- package/dist/ui/skeleton.js +9 -9
- package/dist/ui/skeleton.mjs +1 -1
- package/dist/ui/slider.js +23 -23
- package/dist/ui/slider.js.map +1 -1
- package/dist/ui/slider.mjs +23 -23
- package/dist/ui/slider.mjs.map +1 -1
- package/dist/ui/stepper.js +22 -22
- package/dist/ui/stepper.js.map +1 -1
- package/dist/ui/stepper.mjs +22 -22
- package/dist/ui/stepper.mjs.map +1 -1
- package/dist/ui/table/animated.js +8 -8
- package/dist/ui/table/animated.mjs +2 -2
- package/dist/ui/table.js +14 -14
- package/dist/ui/table.mjs +1 -1
- package/dist/ui/tabs/animated.js +2 -2
- package/dist/ui/tabs/animated.mjs +1 -1
- package/dist/ui/tabs.js +9 -9
- package/dist/ui/tabs.mjs +1 -1
- package/dist/ui/timeline/animated/animations.d.ts +8 -0
- package/dist/ui/timeline/animated/animations.d.ts.map +1 -0
- package/dist/ui/timeline/animated/index.d.ts +6 -0
- package/dist/ui/timeline/animated/index.d.ts.map +1 -0
- package/dist/ui/timeline/animated/timeline-item-animated.d.ts +8 -0
- package/dist/ui/timeline/animated/timeline-item-animated.d.ts.map +1 -0
- package/dist/ui/timeline/animated/types.d.ts +12 -0
- package/dist/ui/timeline/animated/types.d.ts.map +1 -0
- package/dist/ui/timeline/animated.js +94 -0
- package/dist/ui/timeline/animated.js.map +1 -0
- package/dist/ui/timeline/animated.mjs +71 -0
- package/dist/ui/timeline/animated.mjs.map +1 -0
- package/dist/ui/timeline/index.d.ts +4 -0
- package/dist/ui/timeline/index.d.ts.map +1 -0
- package/dist/ui/timeline/timeline-base.d.ts +37 -0
- package/dist/ui/timeline/timeline-base.d.ts.map +1 -0
- package/dist/ui/timeline/timeline.d.ts +8 -0
- package/dist/ui/timeline/timeline.d.ts.map +1 -0
- package/dist/ui/timeline/types.d.ts +38 -0
- package/dist/ui/timeline/types.d.ts.map +1 -0
- package/dist/ui/timeline/variants.d.ts +19 -0
- package/dist/ui/timeline/variants.d.ts.map +1 -0
- package/dist/ui/timeline.js +63 -0
- package/dist/ui/timeline.js.map +1 -0
- package/dist/ui/timeline.mjs +14 -0
- package/dist/ui/timeline.mjs.map +1 -0
- package/dist/ui/toast/animated.js +7 -7
- package/dist/ui/toast/animated.mjs +1 -1
- package/dist/ui/toast.js +12 -12
- package/dist/ui/toast.mjs +1 -1
- package/dist/ui/toggle/animated.js +4 -4
- package/dist/ui/toggle/animated.mjs +1 -1
- package/dist/ui/toggle.js +4 -4
- package/dist/ui/toggle.mjs +2 -2
- package/dist/ui/tooltip/animated.js +3 -3
- package/dist/ui/tooltip/animated.mjs +1 -1
- package/dist/ui/tooltip.js +7 -7
- package/dist/ui/tooltip.mjs +1 -1
- package/dist/ui/typography.js +15 -15
- package/dist/ui/typography.js.map +1 -1
- package/dist/ui/typography.mjs +15 -15
- package/dist/ui/typography.mjs.map +1 -1
- package/package.json +1 -1
- package/src/design-system/accordion.ts +1 -1
- package/src/design-system/alert.ts +5 -5
- package/src/design-system/badge.ts +3 -3
- package/src/design-system/card.ts +2 -2
- package/src/design-system/checkbox.ts +10 -12
- package/src/design-system/command.ts +1 -1
- package/src/design-system/context-menu.ts +44 -0
- package/src/design-system/drawer.ts +1 -1
- package/src/design-system/dropdown.ts +31 -31
- package/src/design-system/dynamic-stepper.ts +47 -47
- package/src/design-system/file-upload.ts +15 -15
- package/src/design-system/index.ts +3 -0
- package/src/design-system/inputs.ts +13 -13
- package/src/design-system/modal.ts +1 -1
- package/src/design-system/pagination.ts +25 -25
- package/src/design-system/popover.ts +19 -23
- package/src/design-system/radio-group.ts +10 -12
- package/src/design-system/scroll-area.ts +47 -0
- package/src/design-system/select.ts +36 -35
- package/src/design-system/skeleton.ts +20 -13
- package/src/design-system/slider.ts +23 -23
- package/src/design-system/stepper.ts +22 -22
- package/src/design-system/table.ts +13 -13
- package/src/design-system/tabs.ts +5 -4
- package/src/design-system/timeline.ts +87 -0
- package/src/design-system/toast.ts +17 -17
- package/src/design-system/toggle.ts +55 -54
- package/src/design-system/tooltip.ts +20 -20
- package/src/design-system/typography.ts +15 -15
- package/src/ui/alert/animated/alert-animated.tsx +1 -0
- package/src/ui/context-menu/context-menu.test.tsx +176 -0
- package/src/ui/context-menu/context-menu.tsx +536 -0
- package/src/ui/context-menu/index.ts +29 -0
- package/src/ui/context-menu/types.ts +110 -0
- package/src/ui/context-menu/variants.ts +26 -0
- package/src/ui/scroll-area/index.ts +5 -0
- package/src/ui/scroll-area/scroll-area.test.tsx +116 -0
- package/src/ui/scroll-area/scroll-area.tsx +62 -0
- package/src/ui/scroll-area/types.ts +11 -0
- package/src/ui/scroll-area/variants.ts +44 -0
- package/src/ui/timeline/animated/animations.ts +16 -0
- package/src/ui/timeline/animated/index.ts +22 -0
- package/src/ui/timeline/animated/timeline-item-animated.tsx +76 -0
- package/src/ui/timeline/animated/types.ts +21 -0
- package/src/ui/timeline/index.ts +30 -0
- package/src/ui/timeline/timeline-base.tsx +232 -0
- package/src/ui/timeline/timeline.test.tsx +262 -0
- package/src/ui/timeline/timeline.tsx +24 -0
- package/src/ui/timeline/types.ts +61 -0
- package/src/ui/timeline/variants.ts +60 -0
- package/dist/chunk-4XVNQ7IY.mjs.map +0 -1
- package/dist/chunk-4ZKBLVQX.js.map +0 -1
- package/dist/chunk-6QQUQLPB.js +0 -107
- package/dist/chunk-6QQUQLPB.js.map +0 -1
- package/dist/chunk-ACGVDY5J.mjs.map +0 -1
- package/dist/chunk-BC6M42HQ.mjs.map +0 -1
- package/dist/chunk-BTJYXKCW.js.map +0 -1
- package/dist/chunk-CL55KGDF.js.map +0 -1
- package/dist/chunk-EDARAO7X.js.map +0 -1
- package/dist/chunk-EN4VLNBF.js +0 -197
- package/dist/chunk-EN4VLNBF.js.map +0 -1
- package/dist/chunk-FHLZH3PB.mjs.map +0 -1
- package/dist/chunk-HCGSEPOD.mjs.map +0 -1
- package/dist/chunk-HMNIH3KJ.mjs.map +0 -1
- package/dist/chunk-ITVMSCOJ.mjs.map +0 -1
- package/dist/chunk-K6IZANTI.mjs +0 -80
- package/dist/chunk-K6IZANTI.mjs.map +0 -1
- package/dist/chunk-K7TCW5PJ.js.map +0 -1
- package/dist/chunk-KEKMMNL5.mjs.map +0 -1
- package/dist/chunk-KTGV76M3.mjs.map +0 -1
- package/dist/chunk-MTTXLC2V.mjs +0 -100
- package/dist/chunk-MTTXLC2V.mjs.map +0 -1
- package/dist/chunk-NHQ3S4Y6.mjs.map +0 -1
- package/dist/chunk-NZDHSIIC.js.map +0 -1
- package/dist/chunk-OZMSE44N.mjs.map +0 -1
- package/dist/chunk-P5WLYJ2C.mjs.map +0 -1
- package/dist/chunk-PHEUJ4EF.js +0 -84
- package/dist/chunk-PHEUJ4EF.js.map +0 -1
- package/dist/chunk-PMWRJ2KS.mjs +0 -192
- package/dist/chunk-PMWRJ2KS.mjs.map +0 -1
- package/dist/chunk-PR4QXFJT.js.map +0 -1
- package/dist/chunk-QAJOE3HJ.js.map +0 -1
- package/dist/chunk-QBPVJH4P.mjs.map +0 -1
- package/dist/chunk-QSPXPU72.js.map +0 -1
- package/dist/chunk-QXHS3HHZ.mjs.map +0 -1
- package/dist/chunk-QYLTKBH7.js.map +0 -1
- package/dist/chunk-WPXQHWPV.js.map +0 -1
- package/dist/chunk-YAO62VH2.js.map +0 -1
- package/dist/chunk-ZYKJC5HH.js.map +0 -1
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
import { render, screen } from "@testing-library/react";
|
|
2
|
+
import { describe, expect, it } from "vitest";
|
|
3
|
+
|
|
4
|
+
import { ScrollArea } from "./scroll-area";
|
|
5
|
+
|
|
6
|
+
describe("ScrollArea", () => {
|
|
7
|
+
it("exposes a display name", () => {
|
|
8
|
+
expect(ScrollArea.displayName).toBe("ScrollArea");
|
|
9
|
+
});
|
|
10
|
+
|
|
11
|
+
it("renders children in the viewport slot", () => {
|
|
12
|
+
render(
|
|
13
|
+
<ScrollArea>
|
|
14
|
+
<p>Scrollable content</p>
|
|
15
|
+
</ScrollArea>,
|
|
16
|
+
);
|
|
17
|
+
|
|
18
|
+
expect(document.querySelector('[data-slot="scroll-area"]')).toBeTruthy();
|
|
19
|
+
expect(
|
|
20
|
+
document.querySelector('[data-slot="scroll-area-viewport"]'),
|
|
21
|
+
).toBeTruthy();
|
|
22
|
+
expect(screen.getByText("Scrollable content")).toBeInTheDocument();
|
|
23
|
+
});
|
|
24
|
+
|
|
25
|
+
it("applies horizontal orientation metadata and overflow classes", () => {
|
|
26
|
+
render(
|
|
27
|
+
<ScrollArea orientation="horizontal" data-testid="scroll-area">
|
|
28
|
+
Wide content
|
|
29
|
+
</ScrollArea>,
|
|
30
|
+
);
|
|
31
|
+
|
|
32
|
+
const area = screen.getByTestId("scroll-area");
|
|
33
|
+
expect(area).toHaveAttribute("data-orientation", "horizontal");
|
|
34
|
+
expect(area.className).toContain("overflow-x-auto");
|
|
35
|
+
expect(area.className).toContain("overflow-y-hidden");
|
|
36
|
+
});
|
|
37
|
+
|
|
38
|
+
it("applies both-axis orientation metadata and overflow classes", () => {
|
|
39
|
+
render(
|
|
40
|
+
<ScrollArea orientation="both" data-testid="scroll-area">
|
|
41
|
+
Wide and tall content
|
|
42
|
+
</ScrollArea>,
|
|
43
|
+
);
|
|
44
|
+
|
|
45
|
+
const area = screen.getByTestId("scroll-area");
|
|
46
|
+
expect(area).toHaveAttribute("data-orientation", "both");
|
|
47
|
+
expect(area.className).toContain("overflow-auto");
|
|
48
|
+
});
|
|
49
|
+
|
|
50
|
+
it("uses named regions as keyboard-focusable scroll containers", () => {
|
|
51
|
+
render(
|
|
52
|
+
<ScrollArea aria-label="Notifications" data-testid="scroll-area">
|
|
53
|
+
Notifications
|
|
54
|
+
</ScrollArea>,
|
|
55
|
+
);
|
|
56
|
+
|
|
57
|
+
const area = screen.getByTestId("scroll-area");
|
|
58
|
+
expect(area).toHaveAttribute("role", "region");
|
|
59
|
+
expect(area).toHaveAttribute("tabindex", "0");
|
|
60
|
+
});
|
|
61
|
+
|
|
62
|
+
it("respects explicit role and tabIndex values", () => {
|
|
63
|
+
render(
|
|
64
|
+
<ScrollArea
|
|
65
|
+
aria-label="Activity"
|
|
66
|
+
data-testid="scroll-area"
|
|
67
|
+
role="group"
|
|
68
|
+
tabIndex={-1}
|
|
69
|
+
>
|
|
70
|
+
Activity
|
|
71
|
+
</ScrollArea>,
|
|
72
|
+
);
|
|
73
|
+
|
|
74
|
+
const area = screen.getByTestId("scroll-area");
|
|
75
|
+
expect(area).toHaveAttribute("role", "group");
|
|
76
|
+
expect(area).toHaveAttribute("tabindex", "-1");
|
|
77
|
+
});
|
|
78
|
+
|
|
79
|
+
it("applies viewport class names", () => {
|
|
80
|
+
render(
|
|
81
|
+
<ScrollArea viewportClassName="min-w-max" data-testid="scroll-area">
|
|
82
|
+
Content
|
|
83
|
+
</ScrollArea>,
|
|
84
|
+
);
|
|
85
|
+
|
|
86
|
+
expect(
|
|
87
|
+
document.querySelector('[data-slot="scroll-area-viewport"]'),
|
|
88
|
+
).toHaveClass("min-w-max");
|
|
89
|
+
});
|
|
90
|
+
|
|
91
|
+
it("applies appearance, size, scrollbar, shadow, and className variants", () => {
|
|
92
|
+
render(
|
|
93
|
+
<ScrollArea
|
|
94
|
+
appearance="sky"
|
|
95
|
+
className="h-32"
|
|
96
|
+
data-testid="scroll-area"
|
|
97
|
+
scrollbar="hover"
|
|
98
|
+
shadow
|
|
99
|
+
size="lg"
|
|
100
|
+
>
|
|
101
|
+
Content
|
|
102
|
+
</ScrollArea>,
|
|
103
|
+
);
|
|
104
|
+
|
|
105
|
+
const area = screen.getByTestId("scroll-area");
|
|
106
|
+
expect(area).toHaveAttribute("data-scrollbar", "hover");
|
|
107
|
+
expect(area.className).toContain("h-32");
|
|
108
|
+
expect(area.className).toContain("[--zui-scroll-area-size:0.875rem]");
|
|
109
|
+
expect(area.className).toContain(
|
|
110
|
+
"[box-shadow:inset_0_2px_12px_rgb(15_23_42_/_0.08)]",
|
|
111
|
+
);
|
|
112
|
+
expect(area.className).toContain(
|
|
113
|
+
"[--zui-scroll-area-thumb:oklch(54.6%_0.245_262.881)]",
|
|
114
|
+
);
|
|
115
|
+
});
|
|
116
|
+
});
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
|
|
3
|
+
import { cn } from "../../lib/utils";
|
|
4
|
+
|
|
5
|
+
import type { ScrollAreaProps } from "./types";
|
|
6
|
+
import { scrollAreaVariants } from "./variants";
|
|
7
|
+
|
|
8
|
+
export function ScrollArea(props: ScrollAreaProps) {
|
|
9
|
+
const {
|
|
10
|
+
appearance,
|
|
11
|
+
children,
|
|
12
|
+
className,
|
|
13
|
+
orientation,
|
|
14
|
+
ref,
|
|
15
|
+
role,
|
|
16
|
+
scrollbar,
|
|
17
|
+
shadow,
|
|
18
|
+
size,
|
|
19
|
+
tabIndex,
|
|
20
|
+
viewportClassName,
|
|
21
|
+
...rest
|
|
22
|
+
} = props;
|
|
23
|
+
const ariaLabel = rest["aria-label"];
|
|
24
|
+
const ariaLabelledBy = rest["aria-labelledby"];
|
|
25
|
+
const isNamedRegion =
|
|
26
|
+
role === "region" ||
|
|
27
|
+
ariaLabel !== undefined ||
|
|
28
|
+
ariaLabelledBy !== undefined;
|
|
29
|
+
|
|
30
|
+
return (
|
|
31
|
+
<div
|
|
32
|
+
ref={ref}
|
|
33
|
+
data-orientation={orientation ?? "vertical"}
|
|
34
|
+
data-scrollbar={scrollbar ?? "auto"}
|
|
35
|
+
data-slot="scroll-area"
|
|
36
|
+
role={
|
|
37
|
+
role ??
|
|
38
|
+
(ariaLabel !== undefined || ariaLabelledBy !== undefined
|
|
39
|
+
? "region"
|
|
40
|
+
: undefined)
|
|
41
|
+
}
|
|
42
|
+
tabIndex={tabIndex ?? (isNamedRegion ? 0 : undefined)}
|
|
43
|
+
className={cn(
|
|
44
|
+
scrollAreaVariants({
|
|
45
|
+
appearance,
|
|
46
|
+
orientation,
|
|
47
|
+
scrollbar,
|
|
48
|
+
shadow,
|
|
49
|
+
size,
|
|
50
|
+
}),
|
|
51
|
+
className,
|
|
52
|
+
)}
|
|
53
|
+
{...rest}
|
|
54
|
+
>
|
|
55
|
+
<div data-slot="scroll-area-viewport" className={viewportClassName}>
|
|
56
|
+
{children}
|
|
57
|
+
</div>
|
|
58
|
+
</div>
|
|
59
|
+
);
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
ScrollArea.displayName = "ScrollArea";
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { VariantProps } from "class-variance-authority";
|
|
2
|
+
import type { ComponentPropsWithRef } from "react";
|
|
3
|
+
|
|
4
|
+
import type { scrollAreaVariants } from "./variants";
|
|
5
|
+
|
|
6
|
+
export type ScrollAreaVariantProps = VariantProps<typeof scrollAreaVariants>;
|
|
7
|
+
|
|
8
|
+
export type ScrollAreaProps = ScrollAreaVariantProps &
|
|
9
|
+
ComponentPropsWithRef<"div"> & {
|
|
10
|
+
viewportClassName?: string;
|
|
11
|
+
};
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { cva } from "class-variance-authority";
|
|
2
|
+
|
|
3
|
+
import {
|
|
4
|
+
zuiScrollAreaAppearances,
|
|
5
|
+
zuiScrollAreaBase,
|
|
6
|
+
zuiScrollAreaOrientations,
|
|
7
|
+
zuiScrollAreaShadows,
|
|
8
|
+
zuiScrollAreaSizes,
|
|
9
|
+
zuiScrollAreaVisibility,
|
|
10
|
+
} from "../../design-system/scroll-area";
|
|
11
|
+
|
|
12
|
+
export const scrollAreaVariants = cva(zuiScrollAreaBase, {
|
|
13
|
+
variants: {
|
|
14
|
+
appearance: zuiScrollAreaAppearances,
|
|
15
|
+
orientation: zuiScrollAreaOrientations,
|
|
16
|
+
scrollbar: zuiScrollAreaVisibility,
|
|
17
|
+
shadow: zuiScrollAreaShadows,
|
|
18
|
+
size: zuiScrollAreaSizes,
|
|
19
|
+
},
|
|
20
|
+
compoundVariants: [
|
|
21
|
+
{
|
|
22
|
+
scrollbar: "always",
|
|
23
|
+
orientation: "vertical",
|
|
24
|
+
class: "overflow-x-hidden overflow-y-scroll",
|
|
25
|
+
},
|
|
26
|
+
{
|
|
27
|
+
scrollbar: "always",
|
|
28
|
+
orientation: "horizontal",
|
|
29
|
+
class: "overflow-x-scroll overflow-y-hidden",
|
|
30
|
+
},
|
|
31
|
+
{
|
|
32
|
+
scrollbar: "always",
|
|
33
|
+
orientation: "both",
|
|
34
|
+
class: "overflow-scroll",
|
|
35
|
+
},
|
|
36
|
+
],
|
|
37
|
+
defaultVariants: {
|
|
38
|
+
appearance: "default",
|
|
39
|
+
orientation: "vertical",
|
|
40
|
+
scrollbar: "auto",
|
|
41
|
+
shadow: false,
|
|
42
|
+
size: "md",
|
|
43
|
+
},
|
|
44
|
+
});
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { Transition } from "framer-motion";
|
|
2
|
+
|
|
3
|
+
/** Entrance presets for animated timeline items (fade + slide, connector draw). */
|
|
4
|
+
export type TimelineTransition = "none" | "default" | "smooth" | "slow";
|
|
5
|
+
|
|
6
|
+
export type TimelineTransitionPresets = Record<TimelineTransition, Transition>;
|
|
7
|
+
|
|
8
|
+
export const timelineItemTransitionPresets: TimelineTransitionPresets = {
|
|
9
|
+
none: { duration: 0 },
|
|
10
|
+
default: { duration: 0.4, ease: [0.22, 1, 0.36, 1] },
|
|
11
|
+
smooth: { duration: 0.55, ease: [0.22, 1, 0.36, 1] },
|
|
12
|
+
slow: { duration: 0.8, ease: [0.4, 0, 0.2, 1] },
|
|
13
|
+
};
|
|
14
|
+
|
|
15
|
+
/** Default per-item entrance delay multiplier (seconds) for staggered reveals. */
|
|
16
|
+
export const TIMELINE_DEFAULT_STAGGER = 0.08;
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
|
|
3
|
+
export {
|
|
4
|
+
Timeline,
|
|
5
|
+
TimelineContent,
|
|
6
|
+
TimelineDescription,
|
|
7
|
+
TimelineIndicator,
|
|
8
|
+
TimelineTitle,
|
|
9
|
+
} from "../timeline-base";
|
|
10
|
+
export { TimelineItem } from "./timeline-item-animated";
|
|
11
|
+
export type {
|
|
12
|
+
TimelineAnimatedProps,
|
|
13
|
+
TimelineItemAnimatedProps,
|
|
14
|
+
} from "./types";
|
|
15
|
+
export {
|
|
16
|
+
TIMELINE_DEFAULT_STAGGER,
|
|
17
|
+
timelineItemTransitionPresets,
|
|
18
|
+
} from "./animations";
|
|
19
|
+
export type {
|
|
20
|
+
TimelineTransition,
|
|
21
|
+
TimelineTransitionPresets,
|
|
22
|
+
} from "./animations";
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
|
|
3
|
+
import { useMemo } from "react";
|
|
4
|
+
import { motion, useReducedMotion } from "framer-motion";
|
|
5
|
+
|
|
6
|
+
import { cn } from "../../../lib/utils";
|
|
7
|
+
|
|
8
|
+
import {
|
|
9
|
+
TimelineItemContext,
|
|
10
|
+
useTimelineContext,
|
|
11
|
+
useTimelineIndex,
|
|
12
|
+
} from "../timeline-base";
|
|
13
|
+
import type { TimelineItemCtx } from "../types";
|
|
14
|
+
import {
|
|
15
|
+
timelineConnectorVariants,
|
|
16
|
+
timelineItemVariants,
|
|
17
|
+
} from "../variants";
|
|
18
|
+
import {
|
|
19
|
+
TIMELINE_DEFAULT_STAGGER,
|
|
20
|
+
timelineItemTransitionPresets,
|
|
21
|
+
} from "./animations";
|
|
22
|
+
import type { TimelineItemAnimatedProps } from "./types";
|
|
23
|
+
|
|
24
|
+
export function TimelineItem({
|
|
25
|
+
className,
|
|
26
|
+
children,
|
|
27
|
+
transitionVariant = "default",
|
|
28
|
+
stagger = TIMELINE_DEFAULT_STAGGER,
|
|
29
|
+
ref,
|
|
30
|
+
...rest
|
|
31
|
+
}: TimelineItemAnimatedProps & { ref?: React.Ref<HTMLLIElement> }) {
|
|
32
|
+
const { size, total } = useTimelineContext("TimelineItem");
|
|
33
|
+
const index = useTimelineIndex("TimelineItem");
|
|
34
|
+
const isLast = index === total - 1;
|
|
35
|
+
const itemCtx = useMemo<TimelineItemCtx>(
|
|
36
|
+
() => ({ index, isLast }),
|
|
37
|
+
[index, isLast],
|
|
38
|
+
);
|
|
39
|
+
|
|
40
|
+
const reducedMotion = useReducedMotion();
|
|
41
|
+
const motionless = transitionVariant === "none" || Boolean(reducedMotion);
|
|
42
|
+
const transition = timelineItemTransitionPresets[transitionVariant];
|
|
43
|
+
const delay = index * stagger;
|
|
44
|
+
|
|
45
|
+
return (
|
|
46
|
+
<TimelineItemContext.Provider value={itemCtx}>
|
|
47
|
+
<motion.li
|
|
48
|
+
ref={ref}
|
|
49
|
+
data-slot="timeline-item"
|
|
50
|
+
data-last={isLast ? "" : undefined}
|
|
51
|
+
className={cn(timelineItemVariants(), className)}
|
|
52
|
+
initial={motionless ? false : { opacity: 0, y: 12 }}
|
|
53
|
+
whileInView={motionless ? undefined : { opacity: 1, y: 0 }}
|
|
54
|
+
viewport={{ once: true, amount: 0.35 }}
|
|
55
|
+
transition={{ ...transition, delay }}
|
|
56
|
+
{...rest}
|
|
57
|
+
>
|
|
58
|
+
{!isLast ? (
|
|
59
|
+
<motion.span
|
|
60
|
+
aria-hidden="true"
|
|
61
|
+
data-slot="timeline-connector"
|
|
62
|
+
className={timelineConnectorVariants({ size })}
|
|
63
|
+
style={{ originY: 0 }}
|
|
64
|
+
initial={motionless ? false : { scaleY: 0, x: "-50%" }}
|
|
65
|
+
whileInView={motionless ? undefined : { scaleY: 1, x: "-50%" }}
|
|
66
|
+
viewport={{ once: true, amount: 0.35 }}
|
|
67
|
+
transition={{ ...transition, delay: delay + 0.12 }}
|
|
68
|
+
/>
|
|
69
|
+
) : null}
|
|
70
|
+
{children}
|
|
71
|
+
</motion.li>
|
|
72
|
+
</TimelineItemContext.Provider>
|
|
73
|
+
);
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
TimelineItem.displayName = "TimelineItem";
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type { TimelineItemProps, TimelineProps } from "../types";
|
|
2
|
+
import type { TimelineTransition } from "./animations";
|
|
3
|
+
|
|
4
|
+
export type TimelineAnimatedProps = TimelineProps;
|
|
5
|
+
|
|
6
|
+
/** Motion `li` uses different handler types than some React DOM events. */
|
|
7
|
+
export type TimelineItemMotionConflictProps =
|
|
8
|
+
| "onAnimationStart"
|
|
9
|
+
| "onDrag"
|
|
10
|
+
| "onDragEnd"
|
|
11
|
+
| "onDragStart";
|
|
12
|
+
|
|
13
|
+
export type TimelineItemAnimatedProps = Omit<
|
|
14
|
+
TimelineItemProps,
|
|
15
|
+
TimelineItemMotionConflictProps
|
|
16
|
+
> & {
|
|
17
|
+
/** Entrance easing/duration preset. `none` renders without motion. */
|
|
18
|
+
transitionVariant?: TimelineTransition;
|
|
19
|
+
/** Per-item entrance delay multiplier in seconds (index × stagger). */
|
|
20
|
+
stagger?: number;
|
|
21
|
+
};
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
|
|
3
|
+
export {
|
|
4
|
+
Timeline,
|
|
5
|
+
TimelineContent,
|
|
6
|
+
TimelineDescription,
|
|
7
|
+
TimelineIndicator,
|
|
8
|
+
TimelineItem,
|
|
9
|
+
TimelineTitle,
|
|
10
|
+
} from "./timeline";
|
|
11
|
+
export type {
|
|
12
|
+
TimelineAppearance,
|
|
13
|
+
TimelineContentProps,
|
|
14
|
+
TimelineDescriptionProps,
|
|
15
|
+
TimelineIndicatorProps,
|
|
16
|
+
TimelineItemProps,
|
|
17
|
+
TimelineProps,
|
|
18
|
+
TimelineSize,
|
|
19
|
+
TimelineTitleProps,
|
|
20
|
+
TimelineTransition,
|
|
21
|
+
} from "./types";
|
|
22
|
+
export {
|
|
23
|
+
timelineConnectorVariants,
|
|
24
|
+
timelineContentVariants,
|
|
25
|
+
timelineDescriptionVariants,
|
|
26
|
+
timelineIndicatorVariants,
|
|
27
|
+
timelineItemVariants,
|
|
28
|
+
timelineTitleVariants,
|
|
29
|
+
timelineVariants,
|
|
30
|
+
} from "./variants";
|
|
@@ -0,0 +1,232 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
|
|
3
|
+
import {
|
|
4
|
+
Children,
|
|
5
|
+
createContext,
|
|
6
|
+
isValidElement,
|
|
7
|
+
useContext,
|
|
8
|
+
useMemo,
|
|
9
|
+
} from "react";
|
|
10
|
+
|
|
11
|
+
import { cn } from "../../lib/utils";
|
|
12
|
+
|
|
13
|
+
import type {
|
|
14
|
+
TimelineContentProps,
|
|
15
|
+
TimelineCtx,
|
|
16
|
+
TimelineDescriptionProps,
|
|
17
|
+
TimelineIndicatorProps,
|
|
18
|
+
TimelineItemCtx,
|
|
19
|
+
TimelineItemProps,
|
|
20
|
+
TimelineProps,
|
|
21
|
+
TimelineSize,
|
|
22
|
+
TimelineTitleProps,
|
|
23
|
+
} from "./types";
|
|
24
|
+
import {
|
|
25
|
+
timelineConnectorVariants,
|
|
26
|
+
timelineContentVariants,
|
|
27
|
+
timelineDescriptionVariants,
|
|
28
|
+
timelineIndicatorVariants,
|
|
29
|
+
timelineItemVariants,
|
|
30
|
+
timelineTitleVariants,
|
|
31
|
+
timelineVariants,
|
|
32
|
+
} from "./variants";
|
|
33
|
+
|
|
34
|
+
const TimelineContext = createContext<TimelineCtx | null>(null);
|
|
35
|
+
|
|
36
|
+
const TimelineIndexContext = createContext<number | null>(null);
|
|
37
|
+
|
|
38
|
+
export const TimelineItemContext = createContext<TimelineItemCtx | null>(null);
|
|
39
|
+
|
|
40
|
+
export function useTimelineContext(component: string): TimelineCtx {
|
|
41
|
+
const ctx = useContext(TimelineContext);
|
|
42
|
+
if (!ctx) {
|
|
43
|
+
throw new Error(`${component} must be used within <Timeline>`);
|
|
44
|
+
}
|
|
45
|
+
return ctx;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
export function useTimelineIndex(component: string): number {
|
|
49
|
+
const index = useContext(TimelineIndexContext);
|
|
50
|
+
if (index === null) {
|
|
51
|
+
throw new Error(`${component} must be used within <Timeline>`);
|
|
52
|
+
}
|
|
53
|
+
return index;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
function useTimelineSize(): TimelineSize {
|
|
57
|
+
return useContext(TimelineContext)?.size ?? "md";
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
function useTimelineIsLast(): boolean {
|
|
61
|
+
return useContext(TimelineItemContext)?.isLast ?? false;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
export function Timeline({
|
|
65
|
+
appearance = "default",
|
|
66
|
+
size = "md",
|
|
67
|
+
className,
|
|
68
|
+
children,
|
|
69
|
+
ref,
|
|
70
|
+
...rest
|
|
71
|
+
}: TimelineProps) {
|
|
72
|
+
const items = useMemo(
|
|
73
|
+
() => Children.toArray(children).filter(isValidElement),
|
|
74
|
+
[children],
|
|
75
|
+
);
|
|
76
|
+
const ctx = useMemo<TimelineCtx>(
|
|
77
|
+
() => ({
|
|
78
|
+
appearance: appearance ?? "default",
|
|
79
|
+
size: size ?? "md",
|
|
80
|
+
total: items.length,
|
|
81
|
+
}),
|
|
82
|
+
[appearance, size, items.length],
|
|
83
|
+
);
|
|
84
|
+
|
|
85
|
+
return (
|
|
86
|
+
<TimelineContext.Provider value={ctx}>
|
|
87
|
+
<ol
|
|
88
|
+
ref={ref}
|
|
89
|
+
data-slot="timeline"
|
|
90
|
+
className={cn(timelineVariants(), "m-0 list-none p-0", className)}
|
|
91
|
+
{...rest}
|
|
92
|
+
>
|
|
93
|
+
{items.map((child, index) => (
|
|
94
|
+
<TimelineIndexContext.Provider key={child.key} value={index}>
|
|
95
|
+
{child}
|
|
96
|
+
</TimelineIndexContext.Provider>
|
|
97
|
+
))}
|
|
98
|
+
</ol>
|
|
99
|
+
</TimelineContext.Provider>
|
|
100
|
+
);
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
Timeline.displayName = "Timeline";
|
|
104
|
+
|
|
105
|
+
export function TimelineItem({
|
|
106
|
+
className,
|
|
107
|
+
children,
|
|
108
|
+
ref,
|
|
109
|
+
...rest
|
|
110
|
+
}: TimelineItemProps) {
|
|
111
|
+
const { size, total } = useTimelineContext("TimelineItem");
|
|
112
|
+
const index = useTimelineIndex("TimelineItem");
|
|
113
|
+
const isLast = index === total - 1;
|
|
114
|
+
const itemCtx = useMemo<TimelineItemCtx>(
|
|
115
|
+
() => ({ index, isLast }),
|
|
116
|
+
[index, isLast],
|
|
117
|
+
);
|
|
118
|
+
|
|
119
|
+
return (
|
|
120
|
+
<TimelineItemContext.Provider value={itemCtx}>
|
|
121
|
+
<li
|
|
122
|
+
ref={ref}
|
|
123
|
+
data-slot="timeline-item"
|
|
124
|
+
data-last={isLast ? "" : undefined}
|
|
125
|
+
className={cn(timelineItemVariants(), className)}
|
|
126
|
+
{...rest}
|
|
127
|
+
>
|
|
128
|
+
{!isLast ? (
|
|
129
|
+
<span
|
|
130
|
+
aria-hidden="true"
|
|
131
|
+
data-slot="timeline-connector"
|
|
132
|
+
className={timelineConnectorVariants({ size })}
|
|
133
|
+
/>
|
|
134
|
+
) : null}
|
|
135
|
+
{children}
|
|
136
|
+
</li>
|
|
137
|
+
</TimelineItemContext.Provider>
|
|
138
|
+
);
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
TimelineItem.displayName = "TimelineItem";
|
|
142
|
+
|
|
143
|
+
export function TimelineIndicator({
|
|
144
|
+
className,
|
|
145
|
+
appearance,
|
|
146
|
+
children,
|
|
147
|
+
ref,
|
|
148
|
+
...rest
|
|
149
|
+
}: TimelineIndicatorProps & { ref?: React.Ref<HTMLDivElement> }) {
|
|
150
|
+
const { appearance: rootAppearance, size } =
|
|
151
|
+
useTimelineContext("TimelineIndicator");
|
|
152
|
+
return (
|
|
153
|
+
<div
|
|
154
|
+
ref={ref}
|
|
155
|
+
data-slot="timeline-indicator"
|
|
156
|
+
className={cn(
|
|
157
|
+
timelineIndicatorVariants({
|
|
158
|
+
appearance: appearance ?? rootAppearance,
|
|
159
|
+
size,
|
|
160
|
+
}),
|
|
161
|
+
className,
|
|
162
|
+
)}
|
|
163
|
+
{...rest}
|
|
164
|
+
>
|
|
165
|
+
{children}
|
|
166
|
+
</div>
|
|
167
|
+
);
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
TimelineIndicator.displayName = "TimelineIndicator";
|
|
171
|
+
|
|
172
|
+
export function TimelineContent({
|
|
173
|
+
className,
|
|
174
|
+
children,
|
|
175
|
+
ref,
|
|
176
|
+
...rest
|
|
177
|
+
}: TimelineContentProps & { ref?: React.Ref<HTMLDivElement> }) {
|
|
178
|
+
const size = useTimelineSize();
|
|
179
|
+
const isLast = useTimelineIsLast();
|
|
180
|
+
return (
|
|
181
|
+
<div
|
|
182
|
+
ref={ref}
|
|
183
|
+
data-slot="timeline-content"
|
|
184
|
+
className={cn(
|
|
185
|
+
timelineContentVariants({ size }),
|
|
186
|
+
isLast && "pb-0",
|
|
187
|
+
className,
|
|
188
|
+
)}
|
|
189
|
+
{...rest}
|
|
190
|
+
>
|
|
191
|
+
{children}
|
|
192
|
+
</div>
|
|
193
|
+
);
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
TimelineContent.displayName = "TimelineContent";
|
|
197
|
+
|
|
198
|
+
export function TimelineTitle({
|
|
199
|
+
className,
|
|
200
|
+
ref,
|
|
201
|
+
...rest
|
|
202
|
+
}: TimelineTitleProps & { ref?: React.Ref<HTMLDivElement> }) {
|
|
203
|
+
const size = useTimelineSize();
|
|
204
|
+
return (
|
|
205
|
+
<div
|
|
206
|
+
ref={ref}
|
|
207
|
+
data-slot="timeline-title"
|
|
208
|
+
className={cn(timelineTitleVariants({ size }), className)}
|
|
209
|
+
{...rest}
|
|
210
|
+
/>
|
|
211
|
+
);
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
TimelineTitle.displayName = "TimelineTitle";
|
|
215
|
+
|
|
216
|
+
export function TimelineDescription({
|
|
217
|
+
className,
|
|
218
|
+
ref,
|
|
219
|
+
...rest
|
|
220
|
+
}: TimelineDescriptionProps & { ref?: React.Ref<HTMLParagraphElement> }) {
|
|
221
|
+
const size = useTimelineSize();
|
|
222
|
+
return (
|
|
223
|
+
<p
|
|
224
|
+
ref={ref}
|
|
225
|
+
data-slot="timeline-description"
|
|
226
|
+
className={cn(timelineDescriptionVariants({ size }), className)}
|
|
227
|
+
{...rest}
|
|
228
|
+
/>
|
|
229
|
+
);
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
TimelineDescription.displayName = "TimelineDescription";
|