@giddaa-housing/ui 1.0.0 → 1.1.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/css/generated/shared.css +1 -1
- package/dist/accordion.d.ts +9 -10
- package/dist/accordion.js +41 -87
- package/dist/activity-timeline.d.ts +12 -16
- package/dist/activity-timeline.js +83 -198
- package/dist/alert.d.ts +8 -9
- package/dist/alert.js +53 -111
- package/dist/auth-layout.d.ts +4 -4
- package/dist/auth-layout.js +143 -294
- package/dist/avatar.d.ts +6 -6
- package/dist/avatar.js +49 -19
- package/dist/badge.d.ts +12 -14
- package/dist/badge.js +71 -11
- package/dist/bar-chart.d.ts +65 -67
- package/dist/bar-chart.js +232 -207
- package/dist/breadcrumb.d.ts +5 -5
- package/dist/breadcrumb.js +56 -118
- package/dist/bullet-chart.d.ts +33 -33
- package/dist/bullet-chart.js +121 -148
- package/dist/button-BZIeyUw6.d.ts +17 -0
- package/dist/button-group.d.ts +13 -16
- package/dist/button-group.js +39 -88
- package/dist/button.d.ts +2 -19
- package/dist/button.js +94 -13
- package/dist/calendar.d.ts +6 -6
- package/dist/calendar.js +138 -17
- package/dist/card.d.ts +14 -16
- package/dist/card.js +59 -145
- package/dist/carousel.d.ts +34 -35
- package/dist/carousel.js +335 -20
- package/dist/chart.d.ts +58 -59
- package/dist/chart.js +376 -28
- package/dist/checkbox.d.ts +10 -12
- package/dist/checkbox.js +82 -47
- package/dist/cn-BI_4DMBf.js +23 -0
- package/dist/collapsible.d.ts +7 -8
- package/dist/collapsible.js +22 -47
- package/dist/combobox.d.ts +10 -10
- package/dist/combobox.js +236 -44
- package/dist/cta.d.ts +12 -14
- package/dist/cta.js +175 -341
- package/dist/currency-selector.d.ts +31 -32
- package/dist/currency-selector.js +106 -184
- package/dist/data-table.d.ts +164 -0
- package/dist/data-table.js +673 -0
- package/dist/date-picker.d.ts +22 -23
- package/dist/date-picker.js +119 -192
- package/dist/details-card.d.ts +7 -7
- package/dist/details-card.js +104 -253
- package/dist/dialog.d.ts +13 -14
- package/dist/dialog.js +116 -209
- package/dist/dropdown-menu.d.ts +13 -13
- package/dist/dropdown-menu.js +180 -37
- package/dist/dropzone.d.ts +55 -55
- package/dist/dropzone.js +327 -439
- package/dist/editorial-card.d.ts +23 -25
- package/dist/editorial-card.js +129 -296
- package/dist/empty-state.d.ts +8 -9
- package/dist/empty-state.js +48 -105
- package/dist/field.d.ts +23 -25
- package/dist/field.js +110 -221
- package/dist/filter.d.ts +118 -0
- package/dist/filter.js +775 -0
- package/dist/footer.d.ts +8 -15
- package/dist/footer.js +197 -400
- package/dist/funnel-chart.d.ts +38 -41
- package/dist/funnel-chart.js +167 -189
- package/dist/gallery-indicator.d.ts +11 -12
- package/dist/gallery-indicator.js +75 -12
- package/dist/heatmap-chart.d.ts +47 -50
- package/dist/heatmap-chart.js +186 -237
- package/dist/infotip.d.ts +8 -9
- package/dist/infotip.js +33 -59
- package/dist/input-CfoEJ8A6.d.ts +12 -0
- package/dist/input-group.d.ts +16 -20
- package/dist/input-group.js +99 -23
- package/dist/input-size-context-C-SFx9sx.d.ts +10 -0
- package/dist/input-size-context.d.ts +2 -11
- package/dist/input-size-context.js +17 -9
- package/dist/input.d.ts +2 -13
- package/dist/input.js +27 -11
- package/dist/item.d.ts +7 -8
- package/dist/item.js +22 -59
- package/dist/kpi-card.d.ts +18 -20
- package/dist/kpi-card.js +84 -192
- package/dist/label.d.ts +6 -6
- package/dist/label.js +40 -8
- package/dist/line-chart.d.ts +88 -89
- package/dist/line-chart.js +142 -104
- package/dist/logo.d.ts +4 -4
- package/dist/logo.js +92 -9
- package/dist/map-indicator.d.ts +7 -7
- package/dist/map-indicator.js +80 -106
- package/dist/match.d.ts +10 -11
- package/dist/match.js +62 -107
- package/dist/media-gallery-hero.d.ts +40 -42
- package/dist/media-gallery-hero.js +182 -343
- package/dist/media-player.d.ts +17 -17
- package/dist/media-player.js +873 -1348
- package/dist/multi-step-form.d.ts +56 -0
- package/dist/multi-step-form.js +342 -0
- package/dist/number-input.d.ts +34 -34
- package/dist/number-input.js +61 -117
- package/dist/page-header.d.ts +10 -11
- package/dist/page-header.js +34 -79
- package/dist/pagination.d.ts +17 -21
- package/dist/pagination.js +132 -207
- package/dist/password-input.d.ts +5 -13
- package/dist/password-input.js +31 -55
- package/dist/phone-input.d.ts +19 -20
- package/dist/phone-input.js +226 -344
- package/dist/photo-gallery.d.ts +19 -19
- package/dist/photo-gallery.js +313 -449
- package/dist/picker-lzgmsNfG.js +32 -0
- package/dist/pie-chart.d.ts +60 -60
- package/dist/pie-chart.js +140 -148
- package/dist/popover.d.ts +9 -9
- package/dist/popover.js +72 -23
- package/dist/price-tag.d.ts +26 -27
- package/dist/price-tag.js +113 -173
- package/dist/progress.d.ts +16 -17
- package/dist/progress.js +169 -24
- package/dist/property-listing-card.d.ts +14 -17
- package/dist/property-listing-card.js +102 -220
- package/dist/radar-chart.d.ts +29 -31
- package/dist/radar-chart.js +162 -137
- package/dist/radio-group.d.ts +11 -13
- package/dist/radio-group.js +46 -60
- package/dist/review-block.d.ts +14 -16
- package/dist/review-block.js +154 -10
- package/dist/rich-text-editor.d.ts +30 -14
- package/dist/rich-text-editor.js +592 -716
- package/dist/scatter-chart.d.ts +45 -47
- package/dist/scatter-chart.js +236 -240
- package/dist/search-input.d.ts +8 -16
- package/dist/search-input.js +57 -109
- package/dist/select.d.ts +8 -8
- package/dist/select.js +144 -27
- package/dist/separator.d.ts +8 -9
- package/dist/separator.js +32 -8
- package/dist/sheet.d.ts +11 -11
- package/dist/sheet.js +103 -24
- package/dist/sidebar.d.ts +32 -37
- package/dist/sidebar.js +364 -634
- package/dist/size-context-D4mYvcg8.d.ts +10 -0
- package/dist/size-context.d.ts +2 -11
- package/dist/size-context.js +17 -9
- package/dist/skeleton.d.ts +4 -5
- package/dist/skeleton.js +12 -8
- package/dist/slider.d.ts +8 -9
- package/dist/slider.js +64 -135
- package/dist/sparkline.d.ts +43 -46
- package/dist/sparkline.js +221 -251
- package/dist/stepper.d.ts +23 -24
- package/dist/stepper.js +149 -246
- package/dist/styles.css +510 -108
- package/dist/switch.d.ts +10 -12
- package/dist/switch.js +48 -70
- package/dist/table-card.d.ts +35 -0
- package/dist/table-card.js +125 -0
- package/dist/table.d.ts +18 -14
- package/dist/table.js +113 -154
- package/dist/tabs.d.ts +23 -15
- package/dist/tabs.js +71 -18
- package/dist/tag.d.ts +21 -23
- package/dist/tag.js +103 -159
- package/dist/testimonial-block.d.ts +18 -19
- package/dist/testimonial-block.js +189 -358
- package/dist/textarea-IS_D8pXf.d.ts +11 -0
- package/dist/textarea.d.ts +2 -12
- package/dist/textarea.js +24 -11
- package/dist/time-picker.d.ts +11 -11
- package/dist/time-picker.js +245 -302
- package/dist/toast.d.ts +16 -18
- package/dist/toast.js +154 -205
- package/dist/tooltip.d.ts +8 -9
- package/dist/tooltip.js +37 -12
- package/dist/tree-map.d.ts +54 -57
- package/dist/tree-map.js +227 -269
- package/dist/use-uncontrolled-CLfM1XbB.js +21 -0
- package/dist/waterfall-chart.d.ts +94 -97
- package/dist/waterfall-chart.js +455 -552
- package/package.json +28 -9
- package/dist/accordion.js.map +0 -1
- package/dist/activity-timeline.js.map +0 -1
- package/dist/alert.js.map +0 -1
- package/dist/auth-layout.js.map +0 -1
- package/dist/avatar.js.map +0 -1
- package/dist/badge.js.map +0 -1
- package/dist/bar-chart.js.map +0 -1
- package/dist/breadcrumb.js.map +0 -1
- package/dist/bullet-chart.js.map +0 -1
- package/dist/button-group.js.map +0 -1
- package/dist/button.js.map +0 -1
- package/dist/calendar.js.map +0 -1
- package/dist/card.js.map +0 -1
- package/dist/carousel.js.map +0 -1
- package/dist/chart.js.map +0 -1
- package/dist/checkbox.js.map +0 -1
- package/dist/chunk-322YCNVL.js +0 -278
- package/dist/chunk-322YCNVL.js.map +0 -1
- package/dist/chunk-3ACQVT7A.js +0 -25
- package/dist/chunk-3ACQVT7A.js.map +0 -1
- package/dist/chunk-3T65TLJX.js +0 -334
- package/dist/chunk-3T65TLJX.js.map +0 -1
- package/dist/chunk-6ZSGQHH2.js +0 -192
- package/dist/chunk-6ZSGQHH2.js.map +0 -1
- package/dist/chunk-7TBMLFGW.js +0 -41
- package/dist/chunk-7TBMLFGW.js.map +0 -1
- package/dist/chunk-B4H6RNDH.js +0 -135
- package/dist/chunk-B4H6RNDH.js.map +0 -1
- package/dist/chunk-BUXCGZ6X.js +0 -219
- package/dist/chunk-BUXCGZ6X.js.map +0 -1
- package/dist/chunk-CHII2QHH.js +0 -58
- package/dist/chunk-CHII2QHH.js.map +0 -1
- package/dist/chunk-DMNOXRRW.js +0 -147
- package/dist/chunk-DMNOXRRW.js.map +0 -1
- package/dist/chunk-EFSOSSIC.js +0 -130
- package/dist/chunk-EFSOSSIC.js.map +0 -1
- package/dist/chunk-FZDSVMKY.js +0 -363
- package/dist/chunk-FZDSVMKY.js.map +0 -1
- package/dist/chunk-GJOFIJS3.js +0 -246
- package/dist/chunk-GJOFIJS3.js.map +0 -1
- package/dist/chunk-HL3ZSYES.js +0 -23
- package/dist/chunk-HL3ZSYES.js.map +0 -1
- package/dist/chunk-JVLUBAPB.js +0 -129
- package/dist/chunk-JVLUBAPB.js.map +0 -1
- package/dist/chunk-KDPYSOYZ.js +0 -64
- package/dist/chunk-KDPYSOYZ.js.map +0 -1
- package/dist/chunk-KSMDANKI.js +0 -43
- package/dist/chunk-KSMDANKI.js.map +0 -1
- package/dist/chunk-MEKCCOP5.js +0 -46
- package/dist/chunk-MEKCCOP5.js.map +0 -1
- package/dist/chunk-NOFXVRWL.js +0 -451
- package/dist/chunk-NOFXVRWL.js.map +0 -1
- package/dist/chunk-PC5MHNVA.js +0 -171
- package/dist/chunk-PC5MHNVA.js.map +0 -1
- package/dist/chunk-QKAQZ2GU.js +0 -122
- package/dist/chunk-QKAQZ2GU.js.map +0 -1
- package/dist/chunk-QZHSHSVV.js +0 -26
- package/dist/chunk-QZHSHSVV.js.map +0 -1
- package/dist/chunk-RBMK26XD.js +0 -19
- package/dist/chunk-RBMK26XD.js.map +0 -1
- package/dist/chunk-SFNJGF6M.js +0 -262
- package/dist/chunk-SFNJGF6M.js.map +0 -1
- package/dist/chunk-UJJNLGTM.js +0 -112
- package/dist/chunk-UJJNLGTM.js.map +0 -1
- package/dist/chunk-VGR4ZWJ3.js +0 -418
- package/dist/chunk-VGR4ZWJ3.js.map +0 -1
- package/dist/chunk-XG47P6D4.js +0 -99
- package/dist/chunk-XG47P6D4.js.map +0 -1
- package/dist/chunk-XZZAHNVM.js +0 -21
- package/dist/chunk-XZZAHNVM.js.map +0 -1
- package/dist/chunk-Y4TTYVNE.js +0 -36
- package/dist/chunk-Y4TTYVNE.js.map +0 -1
- package/dist/chunk-YDWIHW6Q.js +0 -69
- package/dist/chunk-YDWIHW6Q.js.map +0 -1
- package/dist/collapsible.js.map +0 -1
- package/dist/combobox.js.map +0 -1
- package/dist/cta.js.map +0 -1
- package/dist/currency-selector.js.map +0 -1
- package/dist/date-picker.js.map +0 -1
- package/dist/details-card.js.map +0 -1
- package/dist/dialog.js.map +0 -1
- package/dist/dropdown-menu.js.map +0 -1
- package/dist/dropzone.js.map +0 -1
- package/dist/editorial-card.js.map +0 -1
- package/dist/empty-state.js.map +0 -1
- package/dist/field.js.map +0 -1
- package/dist/footer.js.map +0 -1
- package/dist/funnel-chart.js.map +0 -1
- package/dist/gallery-indicator.js.map +0 -1
- package/dist/heatmap-chart.js.map +0 -1
- package/dist/infotip.js.map +0 -1
- package/dist/input-group.js.map +0 -1
- package/dist/input-size-context.js.map +0 -1
- package/dist/input.js.map +0 -1
- package/dist/item.js.map +0 -1
- package/dist/kpi-card.js.map +0 -1
- package/dist/label.js.map +0 -1
- package/dist/line-chart.js.map +0 -1
- package/dist/logo.js.map +0 -1
- package/dist/map-indicator.js.map +0 -1
- package/dist/match.js.map +0 -1
- package/dist/media-gallery-hero.js.map +0 -1
- package/dist/media-player.js.map +0 -1
- package/dist/number-input.js.map +0 -1
- package/dist/page-header.js.map +0 -1
- package/dist/pagination.js.map +0 -1
- package/dist/password-input.js.map +0 -1
- package/dist/phone-input.js.map +0 -1
- package/dist/photo-gallery.js.map +0 -1
- package/dist/pie-chart.js.map +0 -1
- package/dist/popover.js.map +0 -1
- package/dist/price-tag.js.map +0 -1
- package/dist/progress.js.map +0 -1
- package/dist/property-listing-card.js.map +0 -1
- package/dist/radar-chart.js.map +0 -1
- package/dist/radio-group.js.map +0 -1
- package/dist/review-block.js.map +0 -1
- package/dist/rich-text-editor.js.map +0 -1
- package/dist/scatter-chart.js.map +0 -1
- package/dist/search-input.js.map +0 -1
- package/dist/select.js.map +0 -1
- package/dist/separator.js.map +0 -1
- package/dist/sheet.js.map +0 -1
- package/dist/sidebar.js.map +0 -1
- package/dist/size-context.js.map +0 -1
- package/dist/skeleton.js.map +0 -1
- package/dist/slider.js.map +0 -1
- package/dist/sparkline.js.map +0 -1
- package/dist/stepper.js.map +0 -1
- package/dist/switch.js.map +0 -1
- package/dist/tab-list.d.ts +0 -38
- package/dist/tab-list.js +0 -123
- package/dist/tab-list.js.map +0 -1
- package/dist/table.js.map +0 -1
- package/dist/tabs.js.map +0 -1
- package/dist/tag.js.map +0 -1
- package/dist/testimonial-block.js.map +0 -1
- package/dist/textarea.js.map +0 -1
- package/dist/time-picker.js.map +0 -1
- package/dist/toast.js.map +0 -1
- package/dist/tooltip.js.map +0 -1
- package/dist/tree-map.js.map +0 -1
- package/dist/waterfall-chart.js.map +0 -1
package/dist/card.js
CHANGED
|
@@ -1,156 +1,70 @@
|
|
|
1
|
-
import {
|
|
2
|
-
cn
|
|
3
|
-
} from "./chunk-Y4TTYVNE.js";
|
|
4
|
-
|
|
5
|
-
// src/card.tsx
|
|
1
|
+
import { t as cn } from "./cn-BI_4DMBf.js";
|
|
6
2
|
import { mergeProps } from "@base-ui/react/merge-props";
|
|
7
3
|
import { useRender } from "@base-ui/react/use-render";
|
|
8
4
|
import { cva } from "class-variance-authority";
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
},
|
|
18
|
-
defaultVariants: {
|
|
19
|
-
selected: false
|
|
20
|
-
}
|
|
21
|
-
}
|
|
22
|
-
);
|
|
5
|
+
//#region src/card.tsx
|
|
6
|
+
const cardVariants = cva("group/card relative flex w-full min-w-0 flex-col gap-5 rounded-2xl border border-line-subtle bg-canvas py-gdt-xl text-fg-primary shadow-1 transition-[background-color,border-color,box-shadow,transform] outline-none has-[[data-slot=card-action]:hover]:shadow-2 has-[[data-slot=card-action]:focus-visible]:border-line-focus has-[[data-slot=card-action]:focus-visible]inset-ring-1 has-[[data-slot=card-action]:focus-visible]:ring-line-focus has-[[data-slot=card-action]:active]:border-line-subtle has-[[data-slot=card-action]:active]:bg-surface has-[[data-slot=card-action]:active]:shadow-none!", {
|
|
7
|
+
variants: { selected: {
|
|
8
|
+
true: "border-line-focus bg-surface-brand-subtle inset-ring-1 inset-ring-line-focus has-[[data-slot=card-action]:hover]:border-line-focus has-[[data-slot=card-action]:hover]:bg-surface-brand-subtle has-[[data-slot=card-action]:hover]:inset-ring-1 has-[[data-slot=card-action]:active]:border-line-focus has-[[data-slot=card-action]:active]:bg-surface-brand-subtle has-[[data-slot=card-action]:active]:inset-ring-1 has-[[data-slot=card-action]:active]:inset-ring-line-focus",
|
|
9
|
+
false: ""
|
|
10
|
+
} },
|
|
11
|
+
defaultVariants: { selected: false }
|
|
12
|
+
});
|
|
23
13
|
function Card({ className, render, selected = false, ...props }) {
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
state: {
|
|
34
|
-
selected,
|
|
35
|
-
slot: "card"
|
|
36
|
-
}
|
|
37
|
-
});
|
|
14
|
+
return useRender({
|
|
15
|
+
defaultTagName: "article",
|
|
16
|
+
props: mergeProps({ className: cn(cardVariants({ selected }), className) }, props),
|
|
17
|
+
render,
|
|
18
|
+
state: {
|
|
19
|
+
selected,
|
|
20
|
+
slot: "card"
|
|
21
|
+
}
|
|
22
|
+
});
|
|
38
23
|
}
|
|
39
|
-
function CardTitle({
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
defaultTagName: "h3",
|
|
46
|
-
props: mergeProps(
|
|
47
|
-
{
|
|
48
|
-
className: cn("text-gdt-h5 text-fg-primary", className)
|
|
49
|
-
},
|
|
50
|
-
props
|
|
51
|
-
),
|
|
52
|
-
render
|
|
53
|
-
});
|
|
24
|
+
function CardTitle({ className, render, ...props }) {
|
|
25
|
+
return useRender({
|
|
26
|
+
defaultTagName: "h3",
|
|
27
|
+
props: mergeProps({ className: cn("text-gdt-h5 text-fg-primary", className) }, props),
|
|
28
|
+
render
|
|
29
|
+
});
|
|
54
30
|
}
|
|
55
|
-
function CardHeader({
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
defaultTagName: "div",
|
|
62
|
-
props: mergeProps(
|
|
63
|
-
{
|
|
64
|
-
className: cn("flex min-w-0 flex-col gap-gdt-sm px-gdt-xl", className)
|
|
65
|
-
},
|
|
66
|
-
props
|
|
67
|
-
),
|
|
68
|
-
render
|
|
69
|
-
});
|
|
31
|
+
function CardHeader({ className, render, ...props }) {
|
|
32
|
+
return useRender({
|
|
33
|
+
defaultTagName: "div",
|
|
34
|
+
props: mergeProps({ className: cn("flex min-w-0 flex-col gap-gdt-sm px-gdt-xl", className) }, props),
|
|
35
|
+
render
|
|
36
|
+
});
|
|
70
37
|
}
|
|
71
|
-
function CardDescription({
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
defaultTagName: "p",
|
|
78
|
-
props: mergeProps(
|
|
79
|
-
{
|
|
80
|
-
className: cn("text-gdt-sm font-normal text-fg-primary", className)
|
|
81
|
-
},
|
|
82
|
-
props
|
|
83
|
-
),
|
|
84
|
-
render
|
|
85
|
-
});
|
|
38
|
+
function CardDescription({ className, render, ...props }) {
|
|
39
|
+
return useRender({
|
|
40
|
+
defaultTagName: "p",
|
|
41
|
+
props: mergeProps({ className: cn("text-gdt-sm font-normal text-fg-primary", className) }, props),
|
|
42
|
+
render
|
|
43
|
+
});
|
|
86
44
|
}
|
|
87
|
-
function CardContent({
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
defaultTagName: "div",
|
|
94
|
-
props: mergeProps(
|
|
95
|
-
{
|
|
96
|
-
className: cn(
|
|
97
|
-
"min-w-0 px-gdt-xl text-gdt-sm text-fg-primary",
|
|
98
|
-
className
|
|
99
|
-
)
|
|
100
|
-
},
|
|
101
|
-
props
|
|
102
|
-
),
|
|
103
|
-
render
|
|
104
|
-
});
|
|
45
|
+
function CardContent({ className, render, ...props }) {
|
|
46
|
+
return useRender({
|
|
47
|
+
defaultTagName: "div",
|
|
48
|
+
props: mergeProps({ className: cn("min-w-0 px-gdt-xl text-gdt-sm text-fg-primary", className) }, props),
|
|
49
|
+
render
|
|
50
|
+
});
|
|
105
51
|
}
|
|
106
|
-
function CardFooter({
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
defaultTagName: "div",
|
|
113
|
-
props: mergeProps(
|
|
114
|
-
{
|
|
115
|
-
className: cn(
|
|
116
|
-
"flex min-w-0 px-gdt-xl flex-wrap items-center justify-end gap-gdt-sm",
|
|
117
|
-
className
|
|
118
|
-
)
|
|
119
|
-
},
|
|
120
|
-
props
|
|
121
|
-
),
|
|
122
|
-
render
|
|
123
|
-
});
|
|
52
|
+
function CardFooter({ className, render, ...props }) {
|
|
53
|
+
return useRender({
|
|
54
|
+
defaultTagName: "div",
|
|
55
|
+
props: mergeProps({ className: cn("flex min-w-0 px-gdt-xl flex-wrap items-center justify-end gap-gdt-sm", className) }, props),
|
|
56
|
+
render
|
|
57
|
+
});
|
|
124
58
|
}
|
|
125
|
-
function CardAction({
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
// @ts-expect-error — data-* attrs are valid but not in mergeProps generic
|
|
135
|
-
"data-slot": "card-action",
|
|
136
|
-
className: cn(
|
|
137
|
-
"cursor-pointer focus-visible:outline-none before:absolute before:inset-0 before:content-['']",
|
|
138
|
-
className
|
|
139
|
-
)
|
|
140
|
-
},
|
|
141
|
-
props
|
|
142
|
-
),
|
|
143
|
-
render
|
|
144
|
-
});
|
|
59
|
+
function CardAction({ className, render, ...props }) {
|
|
60
|
+
return useRender({
|
|
61
|
+
defaultTagName: "button",
|
|
62
|
+
props: mergeProps({
|
|
63
|
+
"data-slot": "card-action",
|
|
64
|
+
className: cn("cursor-pointer focus-visible:outline-none before:absolute before:inset-0 before:content-['']", className)
|
|
65
|
+
}, props),
|
|
66
|
+
render
|
|
67
|
+
});
|
|
145
68
|
}
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
CardAction,
|
|
149
|
-
CardContent,
|
|
150
|
-
CardDescription,
|
|
151
|
-
CardFooter,
|
|
152
|
-
CardHeader,
|
|
153
|
-
CardTitle,
|
|
154
|
-
cardVariants
|
|
155
|
-
};
|
|
156
|
-
//# sourceMappingURL=card.js.map
|
|
69
|
+
//#endregion
|
|
70
|
+
export { Card, CardAction, CardContent, CardDescription, CardFooter, CardHeader, CardTitle, cardVariants };
|
package/dist/carousel.d.ts
CHANGED
|
@@ -1,37 +1,36 @@
|
|
|
1
|
-
import
|
|
2
|
-
import { VariantProps } from
|
|
3
|
-
import
|
|
4
|
-
import
|
|
5
|
-
|
|
6
|
-
|
|
1
|
+
import { t as ComponentSize } from "./size-context-D4mYvcg8.js";
|
|
2
|
+
import { VariantProps } from "class-variance-authority";
|
|
3
|
+
import * as React from "react";
|
|
4
|
+
import useEmblaCarousel, { UseEmblaCarouselType } from "embla-carousel-react";
|
|
5
|
+
//#region src/carousel.d.ts
|
|
7
6
|
type CarouselApi = UseEmblaCarouselType[1];
|
|
8
7
|
type UseCarouselParameters = Parameters<typeof useEmblaCarousel>;
|
|
9
8
|
type CarouselOptions = UseCarouselParameters[0];
|
|
10
9
|
type CarouselPlugin = UseCarouselParameters[1];
|
|
11
10
|
declare const carouselVariants: (props?: ({
|
|
12
|
-
|
|
13
|
-
} &
|
|
11
|
+
imageSize?: "full" | "lg" | "md" | "sm" | null | undefined;
|
|
12
|
+
} & import("class-variance-authority/types").ClassProp) | undefined) => string;
|
|
14
13
|
type CarouselContextProps = {
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
14
|
+
carouselRef: ReturnType<typeof useEmblaCarousel>[0];
|
|
15
|
+
api: CarouselApi;
|
|
16
|
+
orientation: "horizontal" | "vertical";
|
|
17
|
+
size: ComponentSize;
|
|
18
|
+
scrollPrev: () => void;
|
|
19
|
+
scrollNext: () => void;
|
|
20
|
+
scrollTo: (index: number) => void;
|
|
21
|
+
canScrollPrev: boolean;
|
|
22
|
+
canScrollNext: boolean;
|
|
23
|
+
selectedIndex: number;
|
|
24
|
+
scrollSnaps: number[];
|
|
26
25
|
};
|
|
27
26
|
declare function useCarousel(): CarouselContextProps;
|
|
28
27
|
type CarouselProps = {
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
28
|
+
opts?: CarouselOptions;
|
|
29
|
+
plugins?: CarouselPlugin;
|
|
30
|
+
orientation?: "horizontal" | "vertical";
|
|
31
|
+
/** Scales the chrome (arrows + indicator) without touching the image. */
|
|
32
|
+
size?: ComponentSize;
|
|
33
|
+
setApi?: (api: CarouselApi) => void;
|
|
35
34
|
};
|
|
36
35
|
declare function Carousel({ orientation, opts, setApi, plugins, size, imageSize, className, children, ...props }: React.ComponentProps<"div"> & CarouselProps & VariantProps<typeof carouselVariants>): React.JSX.Element;
|
|
37
36
|
declare function CarouselContent({ className, ...props }: React.ComponentProps<"div">): React.JSX.Element;
|
|
@@ -39,15 +38,15 @@ declare function CarouselItem({ className, ...props }: React.ComponentProps<"div
|
|
|
39
38
|
declare function CarouselPrevious({ className, ...props }: React.ComponentProps<"button">): React.JSX.Element;
|
|
40
39
|
declare function CarouselNext({ className, ...props }: React.ComponentProps<"button">): React.JSX.Element;
|
|
41
40
|
type CarouselIndicatorProps = Omit<React.ComponentProps<"div">, "children" | "onSelect"> & {
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
41
|
+
/** Override the live count (e.g. for static design previews). */
|
|
42
|
+
count?: number;
|
|
43
|
+
/** Override the live selected index. */
|
|
44
|
+
selected?: number;
|
|
45
|
+
/** Override the inherited carousel size. */
|
|
46
|
+
size?: ComponentSize;
|
|
47
|
+
/** Jump to a slide when a dot is activated. Defaults to the carousel API. */
|
|
48
|
+
onSelect?: (index: number) => void;
|
|
50
49
|
};
|
|
51
50
|
declare function CarouselIndicator({ className, count: countProp, selected: selectedProp, size: sizeProp, onSelect, ...props }: CarouselIndicatorProps): React.JSX.Element | null;
|
|
52
|
-
|
|
53
|
-
export { Carousel, type CarouselApi, CarouselContent, CarouselIndicator, CarouselItem, CarouselNext, CarouselPrevious, useCarousel };
|
|
51
|
+
//#endregion
|
|
52
|
+
export { Carousel, type CarouselApi, CarouselContent, CarouselIndicator, CarouselItem, CarouselNext, CarouselPrevious, useCarousel };
|
package/dist/carousel.js
CHANGED
|
@@ -1,22 +1,337 @@
|
|
|
1
1
|
"use client";
|
|
2
|
-
import {
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
2
|
+
import { t as cn } from "./cn-BI_4DMBf.js";
|
|
3
|
+
import { useComponentSize } from "./size-context.js";
|
|
4
|
+
import { ChevronLeftIcon, ChevronRightIcon } from "lucide-react";
|
|
5
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
6
|
+
import { cva } from "class-variance-authority";
|
|
7
|
+
import * as React from "react";
|
|
8
|
+
import useEmblaCarousel from "embla-carousel-react";
|
|
9
|
+
//#region src/carousel.tsx
|
|
10
|
+
/**
|
|
11
|
+
* Shared glassmorphic treatment for every overlay surface in the carousel
|
|
12
|
+
* (navigation arrows + indicator). Dark glass at 35% over a 16px backdrop
|
|
13
|
+
* blur with a near-invisible 18% light border that lifts the chrome off the
|
|
14
|
+
* imagery. Always dark, in both themes — see `--color-surface-glass-overlay-button`.
|
|
15
|
+
*/
|
|
16
|
+
const glassChrome = "border border-fg-on-brand/[0.18] bg-surface-glass-overlay-button backdrop-blur-[16px]";
|
|
17
|
+
const carouselVariants = cva("relative overflow-hidden rounded-2xl bg-surface-brand-subtle", {
|
|
18
|
+
variants: { imageSize: {
|
|
19
|
+
sm: "w-[320px] max-w-full aspect-[320/220]",
|
|
20
|
+
md: "w-[520px] max-w-full aspect-[520/340]",
|
|
21
|
+
lg: "w-[800px] max-w-full aspect-[800/500]",
|
|
22
|
+
full: "w-full"
|
|
23
|
+
} },
|
|
24
|
+
defaultVariants: { imageSize: "md" }
|
|
25
|
+
});
|
|
26
|
+
const CarouselContext = React.createContext(null);
|
|
27
|
+
function useCarousel() {
|
|
28
|
+
const context = React.useContext(CarouselContext);
|
|
29
|
+
if (!context) throw new Error("useCarousel must be used within a <Carousel />");
|
|
30
|
+
return context;
|
|
31
|
+
}
|
|
32
|
+
function Carousel({ orientation = "horizontal", opts, setApi, plugins, size, imageSize, className, children, ...props }) {
|
|
33
|
+
const resolvedSize = useComponentSize(size);
|
|
34
|
+
const [carouselRef, api] = useEmblaCarousel({
|
|
35
|
+
...opts,
|
|
36
|
+
axis: orientation === "horizontal" ? "x" : "y"
|
|
37
|
+
}, plugins);
|
|
38
|
+
const [canScrollPrev, setCanScrollPrev] = React.useState(false);
|
|
39
|
+
const [canScrollNext, setCanScrollNext] = React.useState(false);
|
|
40
|
+
const [selectedIndex, setSelectedIndex] = React.useState(0);
|
|
41
|
+
const [scrollSnaps, setScrollSnaps] = React.useState([]);
|
|
42
|
+
const onSelect = React.useCallback((api) => {
|
|
43
|
+
if (!api) return;
|
|
44
|
+
setCanScrollPrev(api.canScrollPrev());
|
|
45
|
+
setCanScrollNext(api.canScrollNext());
|
|
46
|
+
setSelectedIndex(api.selectedScrollSnap());
|
|
47
|
+
}, []);
|
|
48
|
+
const onReInit = React.useCallback((api) => {
|
|
49
|
+
if (!api) return;
|
|
50
|
+
setScrollSnaps(api.scrollSnapList());
|
|
51
|
+
onSelect(api);
|
|
52
|
+
}, [onSelect]);
|
|
53
|
+
const scrollPrev = React.useCallback(() => {
|
|
54
|
+
api?.scrollPrev();
|
|
55
|
+
}, [api]);
|
|
56
|
+
const scrollNext = React.useCallback(() => {
|
|
57
|
+
api?.scrollNext();
|
|
58
|
+
}, [api]);
|
|
59
|
+
const scrollTo = React.useCallback((index) => {
|
|
60
|
+
api?.scrollTo(index);
|
|
61
|
+
}, [api]);
|
|
62
|
+
const handleKeyDown = React.useCallback((event) => {
|
|
63
|
+
const prevKey = orientation === "horizontal" ? "ArrowLeft" : "ArrowUp";
|
|
64
|
+
const nextKey = orientation === "horizontal" ? "ArrowRight" : "ArrowDown";
|
|
65
|
+
if (event.key === prevKey) {
|
|
66
|
+
event.preventDefault();
|
|
67
|
+
scrollPrev();
|
|
68
|
+
} else if (event.key === nextKey) {
|
|
69
|
+
event.preventDefault();
|
|
70
|
+
scrollNext();
|
|
71
|
+
}
|
|
72
|
+
}, [
|
|
73
|
+
orientation,
|
|
74
|
+
scrollPrev,
|
|
75
|
+
scrollNext
|
|
76
|
+
]);
|
|
77
|
+
React.useEffect(() => {
|
|
78
|
+
if (!api || !setApi) return;
|
|
79
|
+
setApi(api);
|
|
80
|
+
}, [api, setApi]);
|
|
81
|
+
React.useEffect(() => {
|
|
82
|
+
if (!api) return;
|
|
83
|
+
onReInit(api);
|
|
84
|
+
api.on("reInit", onReInit);
|
|
85
|
+
api.on("select", onSelect);
|
|
86
|
+
return () => {
|
|
87
|
+
api?.off("reInit", onReInit);
|
|
88
|
+
api?.off("select", onSelect);
|
|
89
|
+
};
|
|
90
|
+
}, [
|
|
91
|
+
api,
|
|
92
|
+
onReInit,
|
|
93
|
+
onSelect
|
|
94
|
+
]);
|
|
95
|
+
return /* @__PURE__ */ jsx(CarouselContext.Provider, {
|
|
96
|
+
value: {
|
|
97
|
+
carouselRef,
|
|
98
|
+
api,
|
|
99
|
+
orientation,
|
|
100
|
+
size: resolvedSize,
|
|
101
|
+
scrollPrev,
|
|
102
|
+
scrollNext,
|
|
103
|
+
scrollTo,
|
|
104
|
+
canScrollPrev,
|
|
105
|
+
canScrollNext,
|
|
106
|
+
selectedIndex,
|
|
107
|
+
scrollSnaps
|
|
108
|
+
},
|
|
109
|
+
children: /* @__PURE__ */ jsx("div", {
|
|
110
|
+
onKeyDownCapture: handleKeyDown,
|
|
111
|
+
className: cn(carouselVariants({ imageSize }), className),
|
|
112
|
+
role: "region",
|
|
113
|
+
"aria-roledescription": "carousel",
|
|
114
|
+
"data-slot": "carousel",
|
|
115
|
+
...props,
|
|
116
|
+
children
|
|
117
|
+
})
|
|
118
|
+
});
|
|
119
|
+
}
|
|
120
|
+
function CarouselContent({ className, ...props }) {
|
|
121
|
+
const { carouselRef, orientation } = useCarousel();
|
|
122
|
+
return /* @__PURE__ */ jsx("div", {
|
|
123
|
+
ref: carouselRef,
|
|
124
|
+
className: "h-full overflow-hidden",
|
|
125
|
+
"data-slot": "carousel-content",
|
|
126
|
+
children: /* @__PURE__ */ jsx("div", {
|
|
127
|
+
className: cn("flex h-full", orientation === "horizontal" ? "" : "flex-col", className),
|
|
128
|
+
...props
|
|
129
|
+
})
|
|
130
|
+
});
|
|
131
|
+
}
|
|
132
|
+
function CarouselItem({ className, ...props }) {
|
|
133
|
+
return /* @__PURE__ */ jsx("div", {
|
|
134
|
+
role: "group",
|
|
135
|
+
"aria-roledescription": "slide",
|
|
136
|
+
"data-slot": "carousel-item",
|
|
137
|
+
className: cn("min-w-0 shrink-0 grow-0 basis-full", className),
|
|
138
|
+
...props
|
|
139
|
+
});
|
|
140
|
+
}
|
|
141
|
+
const arrowVariants = cva(cn("absolute top-1/2 z-10 grid -translate-y-1/2 place-items-center rounded-full text-fg-on-brand/95 shadow-1 transition-[transform,opacity] outline-none", glassChrome, "hover:scale-105 focus-visible:shadow-[0px_0px_0px_2px_var(--color-line-focus)] active:scale-95 disabled:pointer-events-none disabled:opacity-40"), {
|
|
142
|
+
variants: {
|
|
143
|
+
size: {
|
|
144
|
+
sm: "size-8 [&_svg]:size-4",
|
|
145
|
+
md: "size-10 [&_svg]:size-[18px]",
|
|
146
|
+
lg: "size-12 [&_svg]:size-5"
|
|
147
|
+
},
|
|
148
|
+
side: {
|
|
149
|
+
prev: "",
|
|
150
|
+
next: ""
|
|
151
|
+
}
|
|
152
|
+
},
|
|
153
|
+
compoundVariants: [
|
|
154
|
+
{
|
|
155
|
+
size: "sm",
|
|
156
|
+
side: "prev",
|
|
157
|
+
className: "left-3"
|
|
158
|
+
},
|
|
159
|
+
{
|
|
160
|
+
size: "sm",
|
|
161
|
+
side: "next",
|
|
162
|
+
className: "right-3"
|
|
163
|
+
},
|
|
164
|
+
{
|
|
165
|
+
size: "md",
|
|
166
|
+
side: "prev",
|
|
167
|
+
className: "left-4"
|
|
168
|
+
},
|
|
169
|
+
{
|
|
170
|
+
size: "md",
|
|
171
|
+
side: "next",
|
|
172
|
+
className: "right-4"
|
|
173
|
+
},
|
|
174
|
+
{
|
|
175
|
+
size: "lg",
|
|
176
|
+
side: "prev",
|
|
177
|
+
className: "left-5"
|
|
178
|
+
},
|
|
179
|
+
{
|
|
180
|
+
size: "lg",
|
|
181
|
+
side: "next",
|
|
182
|
+
className: "right-5"
|
|
183
|
+
}
|
|
184
|
+
],
|
|
185
|
+
defaultVariants: {
|
|
186
|
+
size: "md",
|
|
187
|
+
side: "prev"
|
|
188
|
+
}
|
|
189
|
+
});
|
|
190
|
+
function CarouselPrevious({ className, ...props }) {
|
|
191
|
+
const { size, scrollPrev, canScrollPrev } = useCarousel();
|
|
192
|
+
return /* @__PURE__ */ jsxs("button", {
|
|
193
|
+
type: "button",
|
|
194
|
+
"data-slot": "carousel-previous",
|
|
195
|
+
className: cn(arrowVariants({
|
|
196
|
+
size,
|
|
197
|
+
side: "prev"
|
|
198
|
+
}), className),
|
|
199
|
+
disabled: !canScrollPrev,
|
|
200
|
+
onClick: scrollPrev,
|
|
201
|
+
...props,
|
|
202
|
+
children: [/* @__PURE__ */ jsx(ChevronLeftIcon, { className: "cn-rtl-flip" }), /* @__PURE__ */ jsx("span", {
|
|
203
|
+
className: "sr-only",
|
|
204
|
+
children: "Previous slide"
|
|
205
|
+
})]
|
|
206
|
+
});
|
|
207
|
+
}
|
|
208
|
+
function CarouselNext({ className, ...props }) {
|
|
209
|
+
const { size, scrollNext, canScrollNext } = useCarousel();
|
|
210
|
+
return /* @__PURE__ */ jsxs("button", {
|
|
211
|
+
type: "button",
|
|
212
|
+
"data-slot": "carousel-next",
|
|
213
|
+
className: cn(arrowVariants({
|
|
214
|
+
size,
|
|
215
|
+
side: "next"
|
|
216
|
+
}), className),
|
|
217
|
+
disabled: !canScrollNext,
|
|
218
|
+
onClick: scrollNext,
|
|
219
|
+
...props,
|
|
220
|
+
children: [/* @__PURE__ */ jsx(ChevronRightIcon, { className: "cn-rtl-flip" }), /* @__PURE__ */ jsx("span", {
|
|
221
|
+
className: "sr-only",
|
|
222
|
+
children: "Next slide"
|
|
223
|
+
})]
|
|
224
|
+
});
|
|
225
|
+
}
|
|
226
|
+
/**
|
|
227
|
+
* Past this many items the indicator switches from "show every dot" to the
|
|
228
|
+
* Airbnb-style windowed mode: at most `MANY_WINDOW` dots, the active one kept
|
|
229
|
+
* near the centre, and dots at a clipped edge faded down to imply more beyond.
|
|
230
|
+
*/
|
|
231
|
+
const MANY_THRESHOLD = 5;
|
|
232
|
+
const MANY_WINDOW = 5;
|
|
233
|
+
/**
|
|
234
|
+
* Returns the dots to render plus the window start, so the determinate and
|
|
235
|
+
* windowed ("many") cases share one render path. The dot strip is always the
|
|
236
|
+
* full list; `start` drives the translate that slides it under the viewport.
|
|
237
|
+
*/
|
|
238
|
+
function getIndicatorWindow(count, selected) {
|
|
239
|
+
if (count < MANY_THRESHOLD) return {
|
|
240
|
+
dots: Array.from({ length: count }, (_, index) => ({
|
|
241
|
+
index,
|
|
242
|
+
faded: false
|
|
243
|
+
})),
|
|
244
|
+
start: 0,
|
|
245
|
+
visible: count
|
|
246
|
+
};
|
|
247
|
+
const start = Math.max(0, Math.min(selected - Math.floor(MANY_WINDOW / 2), count - MANY_WINDOW));
|
|
248
|
+
const end = start + MANY_WINDOW - 1;
|
|
249
|
+
const overflowLeft = start > 0;
|
|
250
|
+
const overflowRight = end < count - 1;
|
|
251
|
+
return {
|
|
252
|
+
dots: Array.from({ length: count }, (_, index) => ({
|
|
253
|
+
index,
|
|
254
|
+
faded: overflowLeft && index === start || overflowRight && index === end
|
|
255
|
+
})),
|
|
256
|
+
start,
|
|
257
|
+
visible: MANY_WINDOW
|
|
258
|
+
};
|
|
259
|
+
}
|
|
260
|
+
/** Dot diameter, gap, and pill padding per size — in px to keep them crisp. */
|
|
261
|
+
const INDICATOR_SIZES = {
|
|
262
|
+
sm: {
|
|
263
|
+
dot: 5,
|
|
264
|
+
gap: 4,
|
|
265
|
+
padX: 8,
|
|
266
|
+
padY: 4
|
|
267
|
+
},
|
|
268
|
+
md: {
|
|
269
|
+
dot: 7,
|
|
270
|
+
gap: 5,
|
|
271
|
+
padX: 10,
|
|
272
|
+
padY: 5
|
|
273
|
+
},
|
|
274
|
+
lg: {
|
|
275
|
+
dot: 9,
|
|
276
|
+
gap: 6,
|
|
277
|
+
padX: 12,
|
|
278
|
+
padY: 6
|
|
279
|
+
}
|
|
21
280
|
};
|
|
22
|
-
|
|
281
|
+
/** Distance of the indicator from the bottom edge, per size (12/18/24px). */
|
|
282
|
+
const INDICATOR_OFFSET = {
|
|
283
|
+
sm: "bottom-3",
|
|
284
|
+
md: "bottom-[18px]",
|
|
285
|
+
lg: "bottom-6"
|
|
286
|
+
};
|
|
287
|
+
function CarouselIndicator({ className, count: countProp, selected: selectedProp, size: sizeProp, onSelect, ...props }) {
|
|
288
|
+
const ctx = React.useContext(CarouselContext);
|
|
289
|
+
const inheritedSize = useComponentSize(sizeProp);
|
|
290
|
+
const size = sizeProp ?? ctx?.size ?? inheritedSize;
|
|
291
|
+
const count = countProp ?? ctx?.scrollSnaps.length ?? 0;
|
|
292
|
+
const selected = selectedProp ?? ctx?.selectedIndex ?? 0;
|
|
293
|
+
const handleSelect = onSelect ?? ctx?.scrollTo;
|
|
294
|
+
if (count <= 1) return null;
|
|
295
|
+
const { dot, gap, padX, padY } = INDICATOR_SIZES[size];
|
|
296
|
+
const { dots, start, visible } = getIndicatorWindow(count, selected);
|
|
297
|
+
const step = dot + gap;
|
|
298
|
+
const viewportWidth = visible * step - gap;
|
|
299
|
+
return /* @__PURE__ */ jsx("div", {
|
|
300
|
+
"data-slot": "carousel-indicator",
|
|
301
|
+
className: cn("absolute left-1/2 z-10 flex -translate-x-1/2 items-center justify-center rounded-full", INDICATOR_OFFSET[size], glassChrome, className),
|
|
302
|
+
style: { padding: `${padY}px ${padX}px` },
|
|
303
|
+
role: "tablist",
|
|
304
|
+
"aria-label": "Slide indicators",
|
|
305
|
+
...props,
|
|
306
|
+
children: /* @__PURE__ */ jsx("div", {
|
|
307
|
+
className: "overflow-hidden",
|
|
308
|
+
style: { width: viewportWidth },
|
|
309
|
+
children: /* @__PURE__ */ jsx("div", {
|
|
310
|
+
className: "flex items-center transition-transform duration-300 ease-out",
|
|
311
|
+
style: {
|
|
312
|
+
gap,
|
|
313
|
+
transform: `translateX(${-start * step}px)`
|
|
314
|
+
},
|
|
315
|
+
children: dots.map(({ index, faded }) => {
|
|
316
|
+
const isActive = index === selected;
|
|
317
|
+
return /* @__PURE__ */ jsx("button", {
|
|
318
|
+
type: "button",
|
|
319
|
+
role: "tab",
|
|
320
|
+
"aria-selected": isActive,
|
|
321
|
+
"aria-label": `Go to slide ${index + 1}`,
|
|
322
|
+
onClick: () => handleSelect?.(index),
|
|
323
|
+
className: cn("shrink-0 rounded-full bg-fg-on-brand transition-[transform,opacity] duration-300 ease-out", handleSelect ? "cursor-pointer" : "cursor-default"),
|
|
324
|
+
style: {
|
|
325
|
+
width: dot,
|
|
326
|
+
height: dot,
|
|
327
|
+
opacity: faded ? .3 : isActive ? 1 : .55,
|
|
328
|
+
transform: faded ? "scale(0.6)" : "scale(1)"
|
|
329
|
+
}
|
|
330
|
+
}, index);
|
|
331
|
+
})
|
|
332
|
+
})
|
|
333
|
+
})
|
|
334
|
+
});
|
|
335
|
+
}
|
|
336
|
+
//#endregion
|
|
337
|
+
export { Carousel, CarouselContent, CarouselIndicator, CarouselItem, CarouselNext, CarouselPrevious, useCarousel };
|