@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/line-chart.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/line-chart.tsx"],"sourcesContent":["\"use client\";\n\nimport { cartesianAxisProps } from \"./chart\";\nimport { type ComponentSize, useComponentSize } from \"./size-context\";\n\n/**\n * Line charts are composed from recharts plot primitives directly — recharts\n * identifies `Line`, `Area`, `XAxis`, `YAxis`, and `CartesianGrid` by component\n * identity and cannot be wrapped. This module supplies giddaa-specific defaults\n * that would otherwise be copy-pasted into every line chart: per-size layout\n * numbers. Pair them with the shared frame and overlays from `./chart`.\n *\n * Five sizes (sm → huge) extend the three `ComponentSize` values used elsewhere.\n * xl and huge must be passed explicitly — they cannot be inherited from\n * `SizeProvider` since `ComponentSize` only carries sm/md/lg.\n *\n * Tokens:\n * - Primary series stroke + dots + area fill: `var(--color-surface-brand)`\n * - Comparison series: `var(--color-surface-accent)`\n * - Gridlines: `var(--color-line-subtle)`\n * - Area wash: primary series colour at 15 % opacity (`fillOpacity={0.15}`)\n * - Active-dot ring: `var(--color-surface-raised)` stroke (matches card bg)\n *\n * @example\n * const chart = useLineChartLayout();\n * <ChartCard size=\"md\">\n * <ChartHeader>\n * <ChartTitle>Revenue Overview</ChartTitle>\n * <ChartDescription>Monthly revenue · Jan–Jul</ChartDescription>\n * </ChartHeader>\n * <ChartContainer config={config} {...chart.container}>\n * <AreaChart data={data} {...chart.chart}>\n * <CartesianGrid vertical={false} stroke=\"var(--color-line-subtle)\" />\n * <XAxis dataKey=\"month\" {...chart.xAxis} />\n * <YAxis {...chart.yAxis} />\n * <ChartLegend verticalAlign=\"top\" content={<ChartLegendContent marker=\"line\" />} />\n * <ChartTooltip content={<ChartTooltipContent />} />\n * <Area dataKey=\"revenue\" {...chart.area(\"var(--color-revenue)\")} />\n * </AreaChart>\n * </ChartContainer>\n * </ChartCard>\n */\n\n/** Five sizes for line charts — extends ComponentSize with xl and huge. */\ntype LineChartSize = \"sm\" | \"md\" | \"lg\" | \"xl\" | \"huge\";\n\ntype LineChartLayout = {\n\t/** Plot height in px. Width stays fluid via ResponsiveContainer. */\n\theight: number;\n\t/** Outer margin. Top leaves room above the highest data point. */\n\tmargin: { top: number; right: number; bottom: number; left: number };\n\t/** Line stroke width in px. */\n\tstrokeWidth: number;\n\t/** Radius of the resting data-point dot. */\n\tdotRadius: number;\n\t/** Radius of the active (hover) dot. */\n\tactiveDotRadius: number;\n\t/** Axis tick label font size. */\n\ttickFontSize: number;\n\t/** Reserved width for the value (Y) axis. */\n\tyAxisWidth: number;\n\t/** Space between an axis and its tick labels. */\n\ttickMargin: number;\n};\n\nconst LINE_CHART_LAYOUT: Record<LineChartSize, LineChartLayout> = {\n\tsm: {\n\t\theight: 64,\n\t\tmargin: { top: 6, right: 6, bottom: 0, left: 0 },\n\t\tstrokeWidth: 2,\n\t\tdotRadius: 2.5,\n\t\tactiveDotRadius: 4,\n\t\ttickFontSize: 9,\n\t\tyAxisWidth: 22,\n\t\ttickMargin: 3,\n\t},\n\tmd: {\n\t\theight: 88,\n\t\tmargin: { top: 8, right: 8, bottom: 0, left: 0 },\n\t\tstrokeWidth: 2,\n\t\tdotRadius: 3,\n\t\tactiveDotRadius: 4.5,\n\t\ttickFontSize: 10,\n\t\tyAxisWidth: 24,\n\t\ttickMargin: 4,\n\t},\n\tlg: {\n\t\theight: 108,\n\t\tmargin: { top: 10, right: 10, bottom: 0, left: 0 },\n\t\tstrokeWidth: 2,\n\t\tdotRadius: 3.5,\n\t\tactiveDotRadius: 5,\n\t\ttickFontSize: 11,\n\t\tyAxisWidth: 26,\n\t\ttickMargin: 5,\n\t},\n\txl: {\n\t\theight: 132,\n\t\tmargin: { top: 12, right: 12, bottom: 0, left: 0 },\n\t\tstrokeWidth: 2,\n\t\tdotRadius: 4,\n\t\tactiveDotRadius: 5.5,\n\t\ttickFontSize: 11,\n\t\tyAxisWidth: 28,\n\t\ttickMargin: 6,\n\t},\n\thuge: {\n\t\theight: 164,\n\t\tmargin: { top: 14, right: 14, bottom: 0, left: 0 },\n\t\tstrokeWidth: 2,\n\t\tdotRadius: 4.5,\n\t\tactiveDotRadius: 6,\n\t\ttickFontSize: 12,\n\t\tyAxisWidth: 30,\n\t\ttickMargin: 7,\n\t},\n};\n\n/** Map the 5 line-chart sizes to the 3 ComponentSize values for ChartCard. */\nfunction toComponentSize(size: LineChartSize): ComponentSize {\n\tif (size === \"xl\" || size === \"huge\") return \"lg\";\n\treturn size as ComponentSize;\n}\n\n/**\n * Build the colour-bound props for a `<Line>`/`<Area>` series at a given size:\n * the rounded stroke geometry plus the resting and active dots, all painted in\n * `color`. `area` adds the 15 %-opacity wash beneath the stroke.\n */\nfunction seriesProps(layout: LineChartLayout, color: string) {\n\treturn {\n\t\ttype: \"linear\" as const,\n\t\tstroke: color,\n\t\tstrokeWidth: layout.strokeWidth,\n\t\tstrokeLinejoin: \"round\" as const,\n\t\tstrokeLinecap: \"round\" as const,\n\t\tdot: { r: layout.dotRadius, fill: color, strokeWidth: 0 },\n\t\tactiveDot: {\n\t\t\tr: layout.activeDotRadius,\n\t\t\tfill: color,\n\t\t\tstroke: \"var(--color-surface-raised)\",\n\t\t\tstrokeWidth: 2,\n\t\t},\n\t};\n}\n\n/**\n * Resolve the line-chart layout for an explicit or inherited component size. The\n * returned object groups the giddaa defaults by the recharts component they\n * belong to. `line(color)`/`area(color)` return the full series props for a\n * given colour — spread each onto its element, then pass the data-specific props\n * (`config`, `data`, `dataKey`, …) directly afterwards to add or override:\n *\n * const chart = useLineChartLayout(size);\n * <ChartContainer config={config} {...chart.container}>\n * <AreaChart data={data} {...chart.chart}>\n * <XAxis dataKey=\"month\" {...chart.xAxis} />\n * <YAxis {...chart.yAxis} />\n * <Area dataKey=\"revenue\" {...chart.area(\"var(--color-revenue)\")} />\n */\nfunction useLineChartLayout(size?: LineChartSize) {\n\tconst inheritedSize = useComponentSize() as LineChartSize;\n\tconst resolved: LineChartSize = size ?? inheritedSize;\n\tconst layout = LINE_CHART_LAYOUT[resolved] ?? LINE_CHART_LAYOUT.md;\n\tconst axes = cartesianAxisProps(layout);\n\n\treturn {\n\t\tcontainer: {\n\t\t\tclassName: \"aspect-auto w-full\",\n\t\t\tstyle: { height: layout.height },\n\t\t},\n\t\tchart: {\n\t\t\taccessibilityLayer: true,\n\t\t\tmargin: layout.margin,\n\t\t},\n\t\txAxis: axes.xAxis,\n\t\tyAxis: axes.yAxis,\n\t\tline: (color: string) => seriesProps(layout, color),\n\t\tarea: (color: string) => ({\n\t\t\t...seriesProps(layout, color),\n\t\t\tfill: color,\n\t\t\tfillOpacity: 0.15,\n\t\t}),\n\t};\n}\n\nexport { LINE_CHART_LAYOUT, toComponentSize, useLineChartLayout };\nexport type { LineChartLayout, LineChartSize };\n"],"mappings":";;;;;;;;;;AAiEA,IAAM,oBAA4D;AAAA,EACjE,IAAI;AAAA,IACH,QAAQ;AAAA,IACR,QAAQ,EAAE,KAAK,GAAG,OAAO,GAAG,QAAQ,GAAG,MAAM,EAAE;AAAA,IAC/C,aAAa;AAAA,IACb,WAAW;AAAA,IACX,iBAAiB;AAAA,IACjB,cAAc;AAAA,IACd,YAAY;AAAA,IACZ,YAAY;AAAA,EACb;AAAA,EACA,IAAI;AAAA,IACH,QAAQ;AAAA,IACR,QAAQ,EAAE,KAAK,GAAG,OAAO,GAAG,QAAQ,GAAG,MAAM,EAAE;AAAA,IAC/C,aAAa;AAAA,IACb,WAAW;AAAA,IACX,iBAAiB;AAAA,IACjB,cAAc;AAAA,IACd,YAAY;AAAA,IACZ,YAAY;AAAA,EACb;AAAA,EACA,IAAI;AAAA,IACH,QAAQ;AAAA,IACR,QAAQ,EAAE,KAAK,IAAI,OAAO,IAAI,QAAQ,GAAG,MAAM,EAAE;AAAA,IACjD,aAAa;AAAA,IACb,WAAW;AAAA,IACX,iBAAiB;AAAA,IACjB,cAAc;AAAA,IACd,YAAY;AAAA,IACZ,YAAY;AAAA,EACb;AAAA,EACA,IAAI;AAAA,IACH,QAAQ;AAAA,IACR,QAAQ,EAAE,KAAK,IAAI,OAAO,IAAI,QAAQ,GAAG,MAAM,EAAE;AAAA,IACjD,aAAa;AAAA,IACb,WAAW;AAAA,IACX,iBAAiB;AAAA,IACjB,cAAc;AAAA,IACd,YAAY;AAAA,IACZ,YAAY;AAAA,EACb;AAAA,EACA,MAAM;AAAA,IACL,QAAQ;AAAA,IACR,QAAQ,EAAE,KAAK,IAAI,OAAO,IAAI,QAAQ,GAAG,MAAM,EAAE;AAAA,IACjD,aAAa;AAAA,IACb,WAAW;AAAA,IACX,iBAAiB;AAAA,IACjB,cAAc;AAAA,IACd,YAAY;AAAA,IACZ,YAAY;AAAA,EACb;AACD;AAGA,SAAS,gBAAgB,MAAoC;AAC5D,MAAI,SAAS,QAAQ,SAAS,OAAQ,QAAO;AAC7C,SAAO;AACR;AAOA,SAAS,YAAY,QAAyB,OAAe;AAC5D,SAAO;AAAA,IACN,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,aAAa,OAAO;AAAA,IACpB,gBAAgB;AAAA,IAChB,eAAe;AAAA,IACf,KAAK,EAAE,GAAG,OAAO,WAAW,MAAM,OAAO,aAAa,EAAE;AAAA,IACxD,WAAW;AAAA,MACV,GAAG,OAAO;AAAA,MACV,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,aAAa;AAAA,IACd;AAAA,EACD;AACD;AAgBA,SAAS,mBAAmB,MAAsB;AACjD,QAAM,gBAAgB,iBAAiB;AACvC,QAAM,WAA0B,QAAQ;AACxC,QAAM,SAAS,kBAAkB,QAAQ,KAAK,kBAAkB;AAChE,QAAM,OAAO,mBAAmB,MAAM;AAEtC,SAAO;AAAA,IACN,WAAW;AAAA,MACV,WAAW;AAAA,MACX,OAAO,EAAE,QAAQ,OAAO,OAAO;AAAA,IAChC;AAAA,IACA,OAAO;AAAA,MACN,oBAAoB;AAAA,MACpB,QAAQ,OAAO;AAAA,IAChB;AAAA,IACA,OAAO,KAAK;AAAA,IACZ,OAAO,KAAK;AAAA,IACZ,MAAM,CAAC,UAAkB,YAAY,QAAQ,KAAK;AAAA,IAClD,MAAM,CAAC,WAAmB;AAAA,MACzB,GAAG,YAAY,QAAQ,KAAK;AAAA,MAC5B,MAAM;AAAA,MACN,aAAa;AAAA,IACd;AAAA,EACD;AACD;","names":[]}
|
package/dist/logo.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/map-indicator.tsx"],"sourcesContent":["import type * as React from \"react\";\n\nimport { cn } from \"./lib/cn\";\n\ntype MapIndicatorSize = \"sm\" | \"md\" | \"lg\";\n\ntype MapIndicatorProps = React.SVGProps<SVGSVGElement> & {\n\tsize?: MapIndicatorSize;\n};\n\nconst MAP_INDICATOR_DIMENSIONS: Record<\n\tMapIndicatorSize,\n\t{ width: number; height: number }\n> = {\n\tsm: { width: 28, height: 37 },\n\tmd: { width: 40, height: 53 },\n\tlg: { width: 56, height: 74 },\n};\n\nfunction MapIndicator({\n\tclassName,\n\tsize = \"md\",\n\twidth,\n\theight,\n\t\"aria-label\": ariaLabel = \"Map indicator\",\n\t...props\n}: MapIndicatorProps) {\n\tconst dimensions = MAP_INDICATOR_DIMENSIONS[size];\n\n\treturn (\n\t\t<svg\n\t\t\tdata-slot=\"map-indicator\"\n\t\t\tdata-size={size}\n\t\t\txmlns=\"http://www.w3.org/2000/svg\"\n\t\t\twidth={width ?? dimensions.width}\n\t\t\theight={height ?? dimensions.height}\n\t\t\tviewBox=\"0 0 40 53\"\n\t\t\trole=\"img\"\n\t\t\taria-label={ariaLabel}\n\t\t\tfill=\"none\"\n\t\t\tclassName={cn(\"inline-block shrink-0\", className)}\n\t\t\t{...props}\n\t\t>\n\t\t\t<path d=\"M4 27H36L20 53L4 27Z\" fill=\"var(--color-action-primary)\" />\n\t\t\t<circle cx=\"20\" cy=\"20\" r=\"20\" fill=\"var(--color-action-primary)\" />\n\t\t\t<path\n\t\t\t\td=\"M20 34.5C28.2843 34.5 35 28.0081 35 20C35 11.9919 28.2843 5.5 20 5.5C11.7157 5.5 5 11.9919 5 20C5 28.0081 11.7157 34.5 20 34.5Z\"\n\t\t\t\tfill=\"var(--color-status-success)\"\n\t\t\t/>\n\t\t\t<path\n\t\t\t\td=\"M20.0422 12.0964C20.344 12.0971 20.6387 12.1845 20.889 12.3473L27.0245 16.303C27.2619 16.4601 27.4555 16.6716 27.5878 16.9186C27.7202 17.1655 27.7872 17.4403 27.783 17.7184L27.775 25.3588C27.774 26.2756 27.0538 27.0216 26.1695 27.0216H13.9381C13.7341 27.0207 13.5322 26.9806 13.3443 26.9038C13.1564 26.827 12.9861 26.7149 12.8434 26.5739C12.6791 26.4136 12.5493 26.2233 12.4616 26.0141C12.3739 25.8049 12.3301 25.581 12.3326 25.3552L12.3406 17.7116C12.3371 17.4348 12.4041 17.1615 12.5358 16.9157C12.6675 16.6698 12.8598 16.4591 13.0957 16.3021L19.1916 12.3495C19.4428 12.1852 19.739 12.0971 20.0422 12.0964ZM20.0421 10.4153C19.3937 10.4159 18.7603 10.6033 18.2226 10.9536L12.1267 14.9061C11.6545 15.2172 11.2686 15.6356 11.0026 16.1244C10.7367 16.6133 10.5989 17.1577 10.6013 17.71L10.5933 25.3536C10.5913 27.2027 12.0894 29.5848 13.9381 29.5848L26.1695 28.0947C28.0154 28.0947 29.5123 27.207 29.5143 25.3606L29.5223 17.7202C29.526 17.1653 29.388 16.618 29.1207 16.127C28.8533 15.6359 28.4649 15.2161 27.9897 14.9046L21.8542 10.949C21.3182 10.6016 20.6875 10.4159 20.0421 10.4153Z\"\n\t\t\t\tfill=\"white\"\n\t\t\t/>\n\t\t\t<path\n\t\t\t\td=\"M21.4178 24.0344C20.8525 24.1667 20.3033 24.195 19.7703 24.1195C19.2355 24.0369 18.7403 23.8672 18.2847 23.6104C17.8273 23.3465 17.4365 23.0114 17.1123 22.6052C16.7935 22.1902 16.5675 21.7165 16.4342 21.1839C16.3009 20.6515 16.2786 20.1338 16.3676 19.6308C16.462 19.1192 16.6474 18.6493 16.9239 18.2212C17.1986 17.7861 17.5551 17.4171 17.9934 17.1143C18.4371 16.8028 18.9381 16.5817 19.4962 16.4512C20.1268 16.3036 20.7518 16.2872 21.3714 16.4018C21.9892 16.5095 22.5336 16.7382 23.0048 17.0878L22.1514 18.3221C21.8116 18.0679 21.4438 17.9017 21.0483 17.8237C20.6528 17.7456 20.2521 17.7541 19.8462 17.849C19.5055 17.9287 19.206 18.0656 18.9476 18.2595C18.6875 18.4464 18.4759 18.674 18.3128 18.9421C18.1481 19.2032 18.0409 19.4952 17.9913 19.8183C17.9473 20.1328 17.9682 20.4616 18.0542 20.8049C18.1402 21.1483 18.2816 21.4527 18.4785 21.7181C18.6754 21.9836 18.9097 22.1995 19.1816 22.3658C19.4589 22.5235 19.7583 22.6314 20.0798 22.6897C20.4068 22.7393 20.7443 22.7234 21.0922 22.642C21.4547 22.5572 21.765 22.4178 22.0234 22.2239C22.28 22.0229 22.4772 21.7839 22.615 21.5069C22.7583 21.2212 22.8258 20.9235 22.8173 20.614L20.5667 21.1405L20.2351 19.8163L24.171 18.8955L24.2868 19.3579C24.4236 19.9045 24.4521 20.4318 24.3721 20.9401C24.2977 21.4396 24.1332 21.9008 23.8785 22.3239C23.622 22.7399 23.2855 23.0968 22.8689 23.3945C22.4524 23.6922 21.9687 23.9055 21.4178 24.0344Z\"\n\t\t\t\tfill=\"white\"\n\t\t\t/>\n\t\t\t<path\n\t\t\t\td=\"M14.3618 24.9216C14.3461 24.9034 14.3188 24.8974 14.2956 24.9071C14.2375 24.9388 12.7797 25.6759 12.7105 26.6314C12.6794 27.0654 12.9398 27.4743 13.4828 27.8449L13.5617 27.7363C13.5551 27.7607 13.3782 28.3222 13.4015 28.3273C13.4249 28.3324 13.4539 28.3165 13.4596 28.2955L13.5762 27.8654C14.2559 27.7621 14.6954 27.51 14.8909 27.1082C15.3184 26.2311 14.401 24.9746 14.3618 24.9216Z\"\n\t\t\t\tfill=\"white\"\n\t\t\t/>\n\t\t\t<path\n\t\t\t\td=\"M14.6463 24.6128C14.9312 24.6128 15.1621 24.4055 15.1621 24.1496C15.1621 23.8938 14.9312 23.6864 14.6463 23.6864C14.3615 23.6864 14.1306 23.8938 14.1306 24.1496C14.1306 24.4055 14.3615 24.6128 14.6463 24.6128Z\"\n\t\t\t\tfill=\"#f7b11c\"\n\t\t\t/>\n\t\t\t<path\n\t\t\t\td=\"M15.845 25.5378C15.8319 25.5227 15.8093 25.5177 15.79 25.5258C15.7418 25.5522 14.5319 26.1639 14.4745 26.9569C14.4487 27.3171 14.6648 27.6565 15.1154 27.9641L15.1809 27.8739C15.1755 27.8942 15.0286 28.3602 15.048 28.3644C15.0674 28.3687 15.0915 28.3555 15.0962 28.3381L15.193 27.9811C15.7571 27.8953 16.1219 27.6861 16.2841 27.3526C16.6389 26.6247 15.8775 25.5818 15.845 25.5378Z\"\n\t\t\t\tfill=\"white\"\n\t\t\t/>\n\t\t\t<path\n\t\t\t\td=\"M15.9952 25.2819C16.2012 25.2819 16.3682 25.1319 16.3682 24.9469C16.3682 24.7619 16.2012 24.6119 15.9952 24.6119C15.7893 24.6119 15.6223 24.7619 15.6223 24.9469C15.6223 25.1319 15.7893 25.2819 15.9952 25.2819Z\"\n\t\t\t\tfill=\"#d9d9d9\"\n\t\t\t/>\n\t\t\t<path\n\t\t\t\td=\"M16.8178 26.2477C16.8078 26.2361 16.7905 26.2324 16.7757 26.2385C16.7388 26.2587 15.8122 26.7272 15.7682 27.3345C15.7484 27.6104 15.914 27.8703 16.2591 28.1059L16.3092 28.0368C16.305 28.0524 16.1926 28.4092 16.2075 28.4125C16.2223 28.4157 16.2408 28.4056 16.2444 28.3923L16.3185 28.1189C16.7505 28.0532 17.0299 27.893 17.1541 27.6376C17.4259 27.08 16.8427 26.2815 16.8178 26.2477Z\"\n\t\t\t\tfill=\"white\"\n\t\t\t/>\n\t\t\t<path\n\t\t\t\td=\"M16.8799 26.155C17.0698 26.155 17.2238 26.0167 17.2238 25.8462C17.2238 25.6756 17.0698 25.5374 16.8799 25.5374C16.6901 25.5374 16.5361 25.6756 16.5361 25.8462C16.5361 26.0167 16.6901 26.155 16.8799 26.155Z\"\n\t\t\t\tfill=\"#d9d9d9\"\n\t\t\t/>\n\t\t</svg>\n\t);\n}\n\nexport { MAP_INDICATOR_DIMENSIONS, MapIndicator };\nexport type { MapIndicatorProps, MapIndicatorSize };\n"],"mappings":";;;;;AA8BE,SAaC,KAbD;AApBF,IAAM,2BAGF;AAAA,EACH,IAAI,EAAE,OAAO,IAAI,QAAQ,GAAG;AAAA,EAC5B,IAAI,EAAE,OAAO,IAAI,QAAQ,GAAG;AAAA,EAC5B,IAAI,EAAE,OAAO,IAAI,QAAQ,GAAG;AAC7B;AAEA,SAAS,aAAa;AAAA,EACrB;AAAA,EACA,OAAO;AAAA,EACP;AAAA,EACA;AAAA,EACA,cAAc,YAAY;AAAA,EAC1B,GAAG;AACJ,GAAsB;AACrB,QAAM,aAAa,yBAAyB,IAAI;AAEhD,SACC;AAAA,IAAC;AAAA;AAAA,MACA,aAAU;AAAA,MACV,aAAW;AAAA,MACX,OAAM;AAAA,MACN,OAAO,SAAS,WAAW;AAAA,MAC3B,QAAQ,UAAU,WAAW;AAAA,MAC7B,SAAQ;AAAA,MACR,MAAK;AAAA,MACL,cAAY;AAAA,MACZ,MAAK;AAAA,MACL,WAAW,GAAG,yBAAyB,SAAS;AAAA,MAC/C,GAAG;AAAA,MAEJ;AAAA,4BAAC,UAAK,GAAE,wBAAuB,MAAK,+BAA8B;AAAA,QAClE,oBAAC,YAAO,IAAG,MAAK,IAAG,MAAK,GAAE,MAAK,MAAK,+BAA8B;AAAA,QAClE;AAAA,UAAC;AAAA;AAAA,YACA,GAAE;AAAA,YACF,MAAK;AAAA;AAAA,QACN;AAAA,QACA;AAAA,UAAC;AAAA;AAAA,YACA,GAAE;AAAA,YACF,MAAK;AAAA;AAAA,QACN;AAAA,QACA;AAAA,UAAC;AAAA;AAAA,YACA,GAAE;AAAA,YACF,MAAK;AAAA;AAAA,QACN;AAAA,QACA;AAAA,UAAC;AAAA;AAAA,YACA,GAAE;AAAA,YACF,MAAK;AAAA;AAAA,QACN;AAAA,QACA;AAAA,UAAC;AAAA;AAAA,YACA,GAAE;AAAA,YACF,MAAK;AAAA;AAAA,QACN;AAAA,QACA;AAAA,UAAC;AAAA;AAAA,YACA,GAAE;AAAA,YACF,MAAK;AAAA;AAAA,QACN;AAAA,QACA;AAAA,UAAC;AAAA;AAAA,YACA,GAAE;AAAA,YACF,MAAK;AAAA;AAAA,QACN;AAAA,QACA;AAAA,UAAC;AAAA;AAAA,YACA,GAAE;AAAA,YACF,MAAK;AAAA;AAAA,QACN;AAAA,QACA;AAAA,UAAC;AAAA;AAAA,YACA,GAAE;AAAA,YACF,MAAK;AAAA;AAAA,QACN;AAAA;AAAA;AAAA,EACD;AAEF;","names":[]}
|
package/dist/match.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/match.tsx"],"sourcesContent":["\"use client\";\n\nimport { cva, type VariantProps } from \"class-variance-authority\";\nimport { ChevronDown } from \"lucide-react\";\nimport type * as React from \"react\";\n\nimport { cn } from \"./lib/cn\";\nimport { CircularProgress } from \"./progress\";\n\nconst matchVariants = cva(\n\t\"inline-flex h-8 w-fit shrink-0 items-center rounded-full border border-line-subtle bg-surface text-fg-primary shadow-none transition-[background-color,border-color,box-shadow] outline-none focus-visible:border-line-focus focus-visible:shadow-[0px_0px_0px_2px_var(--color-line-focus)] disabled:pointer-events-none disabled:opacity-60\",\n\t{\n\t\tvariants: {\n\t\t\tvariant: {\n\t\t\t\tbar: \"gap-2 px-3\",\n\t\t\t\tdonut: \"gap-3 pl-2 pr-3\",\n\t\t\t},\n\t\t},\n\t\tdefaultVariants: {\n\t\t\tvariant: \"bar\",\n\t\t},\n\t},\n);\n\ntype MatchVariant = NonNullable<VariantProps<typeof matchVariants>[\"variant\"]>;\n\ntype MatchProps = Omit<React.ComponentProps<\"button\">, \"children\" | \"value\"> &\n\tVariantProps<typeof matchVariants> & {\n\t\tvalue: number;\n\t\tlabel?: string;\n\t\tshowChevron?: boolean;\n\t};\n\nfunction normalizeMatchValue(value: number) {\n\tif (!Number.isFinite(value)) {\n\t\treturn 0;\n\t}\n\n\treturn Math.min(100, Math.max(0, Math.round(value)));\n}\n\nfunction Match({\n\tclassName,\n\tvalue,\n\tvariant = \"bar\",\n\tlabel = \"Match\",\n\tshowChevron = true,\n\ttype = \"button\",\n\t\"aria-label\": ariaLabel,\n\t...props\n}: MatchProps) {\n\tconst progress = normalizeMatchValue(value);\n\tconst text = `${progress}% ${label}`;\n\n\treturn (\n\t\t<button\n\t\t\ttype={type}\n\t\t\taria-label={ariaLabel ?? text}\n\t\t\tdata-slot=\"match\"\n\t\t\tdata-variant={variant}\n\t\t\tclassName={cn(matchVariants({ variant }), className)}\n\t\t\t{...props}\n\t\t>\n\t\t\t{variant === \"donut\" ? (\n\t\t\t\t<CircularProgress\n\t\t\t\t\taria-hidden=\"true\"\n\t\t\t\t\trole=\"presentation\"\n\t\t\t\t\tdata-slot=\"match-donut\"\n\t\t\t\t\tvalue={progress}\n\t\t\t\t\tpixelSize={24}\n\t\t\t\t\tstrokeWidth={4}\n\t\t\t\t\tstrokeLinecap=\"butt\"\n\t\t\t\t\tclassName=\"shrink-0\"\n\t\t\t\t>\n\t\t\t\t\t<span className=\"sr-only\">{progress}%</span>\n\t\t\t\t</CircularProgress>\n\t\t\t) : null}\n\t\t\t<span\n\t\t\t\tdata-slot=\"match-label\"\n\t\t\t\tclassName=\"shrink-0 text-[10px] font-bold leading-3\"\n\t\t\t>\n\t\t\t\t{text}\n\t\t\t</span>\n\t\t\t{variant === \"bar\" ? (\n\t\t\t\t<span\n\t\t\t\t\taria-hidden=\"true\"\n\t\t\t\t\tdata-slot=\"match-bar-track\"\n\t\t\t\t\tclassName=\"relative h-1.5 w-15 shrink-0 overflow-hidden rounded-full bg-surface-raised\"\n\t\t\t\t>\n\t\t\t\t\t<span\n\t\t\t\t\t\tdata-slot=\"match-bar-fill\"\n\t\t\t\t\t\tclassName=\"absolute inset-y-0 left-0 rounded-full bg-action-primary\"\n\t\t\t\t\t\tstyle={{ width: `${progress}%` }}\n\t\t\t\t\t/>\n\t\t\t\t</span>\n\t\t\t) : null}\n\t\t\t{showChevron ? (\n\t\t\t\t<ChevronDown\n\t\t\t\t\taria-hidden=\"true\"\n\t\t\t\t\tdata-slot=\"match-chevron\"\n\t\t\t\t\tclassName=\"size-3 shrink-0 text-fg-secondary\"\n\t\t\t\t/>\n\t\t\t) : null}\n\t\t</button>\n\t);\n}\n\nexport { Match, matchVariants, type MatchProps, type MatchVariant };\n"],"mappings":";;;;;;;;;;AAEA,SAAS,WAA8B;AACvC,SAAS,mBAAmB;AA6DxB,cAUC,YAVD;AAvDJ,IAAM,gBAAgB;AAAA,EACrB;AAAA,EACA;AAAA,IACC,UAAU;AAAA,MACT,SAAS;AAAA,QACR,KAAK;AAAA,QACL,OAAO;AAAA,MACR;AAAA,IACD;AAAA,IACA,iBAAiB;AAAA,MAChB,SAAS;AAAA,IACV;AAAA,EACD;AACD;AAWA,SAAS,oBAAoB,OAAe;AAC3C,MAAI,CAAC,OAAO,SAAS,KAAK,GAAG;AAC5B,WAAO;AAAA,EACR;AAEA,SAAO,KAAK,IAAI,KAAK,KAAK,IAAI,GAAG,KAAK,MAAM,KAAK,CAAC,CAAC;AACpD;AAEA,SAAS,MAAM;AAAA,EACd;AAAA,EACA;AAAA,EACA,UAAU;AAAA,EACV,QAAQ;AAAA,EACR,cAAc;AAAA,EACd,OAAO;AAAA,EACP,cAAc;AAAA,EACd,GAAG;AACJ,GAAe;AACd,QAAM,WAAW,oBAAoB,KAAK;AAC1C,QAAM,OAAO,GAAG,QAAQ,KAAK,KAAK;AAElC,SACC;AAAA,IAAC;AAAA;AAAA,MACA;AAAA,MACA,cAAY,aAAa;AAAA,MACzB,aAAU;AAAA,MACV,gBAAc;AAAA,MACd,WAAW,GAAG,cAAc,EAAE,QAAQ,CAAC,GAAG,SAAS;AAAA,MAClD,GAAG;AAAA,MAEH;AAAA,oBAAY,UACZ;AAAA,UAAC;AAAA;AAAA,YACA,eAAY;AAAA,YACZ,MAAK;AAAA,YACL,aAAU;AAAA,YACV,OAAO;AAAA,YACP,WAAW;AAAA,YACX,aAAa;AAAA,YACb,eAAc;AAAA,YACd,WAAU;AAAA,YAEV,+BAAC,UAAK,WAAU,WAAW;AAAA;AAAA,cAAS;AAAA,eAAC;AAAA;AAAA,QACtC,IACG;AAAA,QACJ;AAAA,UAAC;AAAA;AAAA,YACA,aAAU;AAAA,YACV,WAAU;AAAA,YAET;AAAA;AAAA,QACF;AAAA,QACC,YAAY,QACZ;AAAA,UAAC;AAAA;AAAA,YACA,eAAY;AAAA,YACZ,aAAU;AAAA,YACV,WAAU;AAAA,YAEV;AAAA,cAAC;AAAA;AAAA,gBACA,aAAU;AAAA,gBACV,WAAU;AAAA,gBACV,OAAO,EAAE,OAAO,GAAG,QAAQ,IAAI;AAAA;AAAA,YAChC;AAAA;AAAA,QACD,IACG;AAAA,QACH,cACA;AAAA,UAAC;AAAA;AAAA,YACA,eAAY;AAAA,YACZ,aAAU;AAAA,YACV,WAAU;AAAA;AAAA,QACX,IACG;AAAA;AAAA;AAAA,EACL;AAEF;","names":[]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/media-gallery-hero.tsx"],"sourcesContent":["\"use client\";\n\nimport { cva, type VariantProps } from \"class-variance-authority\";\nimport { Play } from \"lucide-react\";\nimport type * as React from \"react\";\n\nimport { buttonVariants } from \"./button\";\nimport {\n\tCarousel,\n\tCarouselContent,\n\tCarouselItem,\n\tuseCarousel,\n} from \"./carousel\";\nimport { GalleryIndicator } from \"./gallery-indicator\";\nimport { cn } from \"./lib/cn\";\nimport { ReviewBlock, type ReviewBlockProps } from \"./review-block\";\n\nconst mediaGalleryHeroVariants = cva(\n\t\"relative isolate h-[350px] w-full overflow-hidden rounded-[32px] bg-surface-raised md:h-[380px] md:rounded-[40px] lg:h-[480px]\",\n);\n\nconst mediaGalleryImagesVariants = cva(\n\t\"absolute inset-0 z-0 hidden size-full min-h-0 min-w-0 bg-surface-raised md:grid\",\n\t{\n\t\tvariants: {\n\t\t\timageCount: {\n\t\t\t\t1: \"\",\n\t\t\t\t2: \"gap-2 grid-cols-[minmax(0,3fr)_minmax(0,2fr)]\",\n\t\t\t\t3: \"gap-2 grid-cols-[minmax(0,3fr)_minmax(0,2fr)] grid-rows-2\",\n\t\t\t\t4: \"gap-2 grid-cols-[minmax(0,2fr)_minmax(0,1fr)_minmax(0,1fr)] grid-rows-2\",\n\t\t\t},\n\t\t},\n\t\tdefaultVariants: {\n\t\t\timageCount: 4,\n\t\t},\n\t},\n);\n\ntype MediaGalleryHeroProps = React.ComponentProps<\"div\"> &\n\tVariantProps<typeof mediaGalleryHeroVariants>;\n\ntype MediaGalleryImageCount = 1 | 2 | 3 | 4;\n\ntype MediaGalleryItem = {\n\tid?: string;\n\tsrc?: string;\n\talt?: string;\n\ttype?: \"image\" | \"video\";\n};\n\ntype MediaGalleryImagesProps = Omit<React.ComponentProps<\"div\">, \"children\"> &\n\tVariantProps<typeof mediaGalleryImagesVariants> & {\n\t\timages: MediaGalleryItem[];\n\t\tcurrentMedia?: number;\n\t\ttotalMediaCount?: number;\n\t\tshowMobileIndicator?: boolean;\n\t\tonMediaClick?: (index: number) => void;\n\t\trenderMedia?: (image: MediaGalleryItem, index: number) => React.ReactNode;\n\t};\n\ntype MediaGalleryVideoProps = Omit<React.ComponentProps<\"div\">, \"children\"> & {\n\tsrc?: string;\n\tposter?: string;\n\talt?: string;\n\tlabel?: string;\n\tautoPlay?: boolean;\n\tcontrols?: boolean;\n\tloop?: boolean;\n\tmuted?: boolean;\n\tplaysInline?: boolean;\n\tonPlayClick?: React.MouseEventHandler<HTMLButtonElement>;\n\trenderMedia?: () => React.ReactNode;\n};\n\ntype MediaGalleryReviewProps = ReviewBlockProps;\n\ntype MediaGalleryIndicatorProps = Omit<\n\tReact.ComponentProps<\"button\">,\n\t\"children\"\n> & {\n\tlabel?: string;\n\ttotalMediaCount?: number;\n\tsize?: \"sm\" | \"md\" | \"lg\";\n};\n\nfunction MediaGalleryHero({ className, ...props }: MediaGalleryHeroProps) {\n\treturn (\n\t\t<div\n\t\t\tclassName={cn(mediaGalleryHeroVariants(), className)}\n\t\t\tdata-slot=\"media-gallery-hero\"\n\t\t\t{...props}\n\t\t/>\n\t);\n}\n\nfunction getVisibleImages(\n\timages: MediaGalleryItem[],\n\timageCount: MediaGalleryImageCount,\n) {\n\tif (images.length === 0) {\n\t\treturn [{}] satisfies MediaGalleryItem[];\n\t}\n\n\treturn images.slice(0, imageCount);\n}\n\nfunction getTileClassName(index: number, imageCount: MediaGalleryImageCount) {\n\tif (index === 0) {\n\t\treturn \"md:col-start-1 md:row-span-2\";\n\t}\n\n\tif (imageCount === 2 && index === 1) {\n\t\treturn \"md:col-start-2 md:row-span-2\";\n\t}\n\n\tif (imageCount === 3 && index === 1) {\n\t\treturn \"md:col-start-2 md:row-start-1\";\n\t}\n\n\tif (imageCount === 3 && index === 2) {\n\t\treturn \"md:col-start-2 md:row-start-2\";\n\t}\n\n\tif (imageCount === 4 && index === 1) {\n\t\treturn \"md:col-start-2 md:row-span-2\";\n\t}\n\n\tif (imageCount === 4 && index === 2) {\n\t\treturn \"md:col-start-3 md:row-start-1\";\n\t}\n\n\treturn \"md:col-start-3 md:row-start-2\";\n}\n\nfunction getMediaKey(image: MediaGalleryItem) {\n\treturn image.id ?? image.src ?? image.alt ?? \"placeholder\";\n}\n\nfunction MediaGalleryTile({\n\tclassName,\n\timage,\n\tindex,\n\tisDesktopTile,\n\tonMediaClick,\n\trenderMedia,\n}: {\n\tclassName?: string;\n\timage: MediaGalleryItem;\n\tindex: number;\n\tisDesktopTile?: boolean;\n\tonMediaClick?: (index: number) => void;\n\trenderMedia?: (image: MediaGalleryItem, index: number) => React.ReactNode;\n}) {\n\tconst content =\n\t\trenderMedia?.(image, index) ??\n\t\t(image.src ? (\n\t\t\t<img\n\t\t\t\talt={image.alt ?? \"\"}\n\t\t\t\tclassName=\"size-full object-cover\"\n\t\t\t\tdraggable={false}\n\t\t\t\tsrc={image.src}\n\t\t\t/>\n\t\t) : (\n\t\t\t<span className=\"text-gdt-sm font-medium text-fg-caption-placeholder\">\n\t\t\t\tMedia\n\t\t\t</span>\n\t\t));\n\n\tconst tileClassName = cn(\n\t\t\"relative flex size-full min-h-0 min-w-0 items-center justify-center overflow-hidden rounded-[32px] bg-surface-raised md:rounded-[40px]\",\n\t\t\"[&>img]:size-full [&>img]:object-cover\",\n\t\tisDesktopTile && \"hidden md:flex\",\n\t\tclassName,\n\t);\n\n\tif (!onMediaClick) {\n\t\treturn (\n\t\t\t<div className={tileClassName} data-slot=\"media-gallery-tile\">\n\t\t\t\t{content}\n\t\t\t</div>\n\t\t);\n\t}\n\n\treturn (\n\t\t<button\n\t\t\taria-label={`Open media ${index + 1}`}\n\t\t\tclassName={cn(tileClassName, \"cursor-pointer text-left\")}\n\t\t\tdata-slot=\"media-gallery-tile\"\n\t\t\tonClick={() => onMediaClick(index)}\n\t\t\ttype=\"button\"\n\t\t>\n\t\t\t{content}\n\t\t</button>\n\t);\n}\n\nfunction MobileGalleryCounter({ total }: { total: number }) {\n\tconst { selectedIndex } = useCarousel();\n\n\treturn (\n\t\t<GalleryIndicator\n\t\t\tcurrentPhoto={selectedIndex + 1}\n\t\t\tsize=\"sm\"\n\t\t\ttotalPhotos={total}\n\t\t/>\n\t);\n}\n\nfunction MobileMediaCarousel({\n\tcurrentMedia,\n\timages,\n\tmediaTotal,\n\tonMediaClick,\n\trenderMedia,\n\tshowMobileIndicator,\n}: {\n\tcurrentMedia: number;\n\timages: MediaGalleryItem[];\n\tmediaTotal: number;\n\tonMediaClick?: (index: number) => void;\n\trenderMedia?: (image: MediaGalleryItem, index: number) => React.ReactNode;\n\tshowMobileIndicator: boolean;\n}) {\n\tconst carouselImages =\n\t\timages.length > 0 ? images : ([{}] satisfies MediaGalleryItem[]);\n\n\treturn (\n\t\t<Carousel\n\t\t\tclassName=\"absolute inset-0 z-0 block size-full rounded-[32px] bg-surface-raised md:hidden\"\n\t\t\timageSize=\"full\"\n\t\t\topts={{\n\t\t\t\talign: \"start\",\n\t\t\t\tloop: carouselImages.length > 1,\n\t\t\t\tstartIndex: Math.max(0, currentMedia - 1),\n\t\t\t}}\n\t\t>\n\t\t\t<CarouselContent>\n\t\t\t\t{carouselImages.map((image, index) => (\n\t\t\t\t\t<CarouselItem className=\"h-full\" key={getMediaKey(image)}>\n\t\t\t\t\t\t<MediaGalleryTile\n\t\t\t\t\t\t\tclassName=\"rounded-[32px]\"\n\t\t\t\t\t\t\timage={image}\n\t\t\t\t\t\t\tindex={index}\n\t\t\t\t\t\t\tonMediaClick={onMediaClick}\n\t\t\t\t\t\t\trenderMedia={renderMedia}\n\t\t\t\t\t\t/>\n\t\t\t\t\t</CarouselItem>\n\t\t\t\t))}\n\t\t\t</CarouselContent>\n\t\t\t{showMobileIndicator ? (\n\t\t\t\t<div className=\"absolute right-4 bottom-4 z-10\">\n\t\t\t\t\t<MobileGalleryCounter total={mediaTotal} />\n\t\t\t\t</div>\n\t\t\t) : null}\n\t\t</Carousel>\n\t);\n}\n\nfunction MediaGalleryImages({\n\tclassName,\n\tcurrentMedia = 1,\n\timageCount = 4,\n\timages,\n\tonMediaClick,\n\trenderMedia,\n\tshowMobileIndicator = true,\n\ttotalMediaCount,\n\t...props\n}: MediaGalleryImagesProps) {\n\tconst resolvedImageCount = imageCount ?? 4;\n\tconst mediaTotal = totalMediaCount ?? Math.max(images.length, 1);\n\tconst visibleImages = getVisibleImages(images, resolvedImageCount);\n\n\treturn (\n\t\t<>\n\t\t\t<MobileMediaCarousel\n\t\t\t\tcurrentMedia={currentMedia}\n\t\t\t\timages={images}\n\t\t\t\tmediaTotal={mediaTotal}\n\t\t\t\tonMediaClick={onMediaClick}\n\t\t\t\trenderMedia={renderMedia}\n\t\t\t\tshowMobileIndicator={showMobileIndicator}\n\t\t\t/>\n\t\t\t<div\n\t\t\t\tclassName={cn(\n\t\t\t\t\tmediaGalleryImagesVariants({ imageCount: resolvedImageCount }),\n\t\t\t\t\tclassName,\n\t\t\t\t)}\n\t\t\t\tdata-image-count={resolvedImageCount}\n\t\t\t\tdata-slot=\"media-gallery-images\"\n\t\t\t\t{...props}\n\t\t\t>\n\t\t\t\t{visibleImages.map((image, index) => (\n\t\t\t\t\t<MediaGalleryTile\n\t\t\t\t\t\tclassName={getTileClassName(index, resolvedImageCount)}\n\t\t\t\t\t\timage={image}\n\t\t\t\t\t\tindex={index}\n\t\t\t\t\t\tisDesktopTile\n\t\t\t\t\t\tkey={getMediaKey(image)}\n\t\t\t\t\t\tonMediaClick={onMediaClick}\n\t\t\t\t\t\trenderMedia={renderMedia}\n\t\t\t\t\t/>\n\t\t\t\t))}\n\t\t\t</div>\n\t\t</>\n\t);\n}\n\nfunction MediaGalleryVideo({\n\talt = \"\",\n\tautoPlay,\n\tclassName,\n\tcontrols,\n\tlabel = \"Play Video\",\n\tloop,\n\tmuted,\n\tonPlayClick,\n\tplaysInline = true,\n\tposter,\n\trenderMedia,\n\tsrc,\n\t...props\n}: MediaGalleryVideoProps) {\n\tconst content =\n\t\trenderMedia?.() ??\n\t\t(src ? (\n\t\t\t<video\n\t\t\t\tautoPlay={autoPlay}\n\t\t\t\tclassName=\"size-full object-cover\"\n\t\t\t\tcontrols={controls}\n\t\t\t\tloop={loop}\n\t\t\t\tmuted={muted}\n\t\t\t\tplaysInline={playsInline}\n\t\t\t\tposter={poster}\n\t\t\t\tsrc={src}\n\t\t\t/>\n\t\t) : poster ? (\n\t\t\t<img\n\t\t\t\talt={alt}\n\t\t\t\tclassName=\"size-full object-cover\"\n\t\t\t\tdraggable={false}\n\t\t\t\tsrc={poster}\n\t\t\t/>\n\t\t) : (\n\t\t\t<span className=\"text-gdt-sm font-medium text-fg-caption-placeholder\">\n\t\t\t\tVideo\n\t\t\t</span>\n\t\t));\n\n\treturn (\n\t\t<div\n\t\t\tclassName={cn(\n\t\t\t\t\"absolute inset-0 z-0 flex size-full items-center justify-center overflow-hidden rounded-[32px] bg-surface-raised md:rounded-[40px]\",\n\t\t\t\t\"[&>img]:size-full [&>img]:object-cover [&>video]:size-full [&>video]:object-cover\",\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\tdata-slot=\"media-gallery-video\"\n\t\t\t{...props}\n\t\t>\n\t\t\t{content}\n\t\t\t{controls ? null : (\n\t\t\t\t<button\n\t\t\t\t\taria-label={label}\n\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\tbuttonVariants({\n\t\t\t\t\t\t\tvariant: \"glass-overlay\",\n\t\t\t\t\t\t\tsize: \"icon-xl\",\n\t\t\t\t\t\t}),\n\t\t\t\t\t\t\"absolute top-1/2 left-1/2 z-10 size-20 -translate-x-1/2 -translate-y-1/2 active:not-aria-[haspopup]:-translate-y-1/2 md:size-24\",\n\t\t\t\t\t)}\n\t\t\t\t\tdata-slot=\"media-gallery-video-play\"\n\t\t\t\t\tonClick={onPlayClick}\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t>\n\t\t\t\t\t<Play aria-hidden=\"true\" className=\"ml-0.5\" fill=\"currentColor\" />\n\t\t\t\t</button>\n\t\t\t)}\n\t\t</div>\n\t);\n}\n\nfunction MediaGalleryReview({\n\tbordered = false,\n\tclassName,\n\tsize = \"xs\",\n\t...props\n}: MediaGalleryReviewProps) {\n\treturn (\n\t\t<ReviewBlock\n\t\t\tbordered={bordered}\n\t\t\tclassName={cn(\"absolute top-4 left-4 z-10\", className)}\n\t\t\tsize={size}\n\t\t\t{...props}\n\t\t/>\n\t);\n}\n\nfunction MediaGalleryIndicator({\n\t\"aria-label\": ariaLabel,\n\tclassName,\n\tlabel,\n\tonClick,\n\tsize = \"md\",\n\ttotalMediaCount = 35,\n\t...props\n}: MediaGalleryIndicatorProps) {\n\tconst indicatorLabel =\n\t\tlabel ?? `View All ${totalMediaCount.toLocaleString()} Photos`;\n\n\tif (onClick) {\n\t\treturn (\n\t\t\t<button\n\t\t\t\taria-label={ariaLabel ?? indicatorLabel}\n\t\t\t\tclassName={cn(\n\t\t\t\t\t\"absolute right-4 bottom-4 z-10 hidden rounded-full md:block\",\n\t\t\t\t\tclassName,\n\t\t\t\t)}\n\t\t\t\tdata-slot=\"media-gallery-indicator\"\n\t\t\t\tonClick={onClick}\n\t\t\t\ttype=\"button\"\n\t\t\t\t{...props}\n\t\t\t>\n\t\t\t\t<GalleryIndicator\n\t\t\t\t\taria-hidden=\"true\"\n\t\t\t\t\tlabel={indicatorLabel}\n\t\t\t\t\tsize={size}\n\t\t\t\t/>\n\t\t\t</button>\n\t\t);\n\t}\n\n\treturn (\n\t\t<div\n\t\t\tclassName={cn(\n\t\t\t\t\"absolute right-4 bottom-4 z-10 hidden md:block\",\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\tdata-slot=\"media-gallery-indicator\"\n\t\t>\n\t\t\t<GalleryIndicator label={indicatorLabel} size={size} />\n\t\t</div>\n\t);\n}\n\nexport {\n\tMediaGalleryHero,\n\tMediaGalleryImages,\n\tMediaGalleryIndicator,\n\tMediaGalleryReview,\n\tMediaGalleryTile,\n\tMediaGalleryVideo,\n\tmediaGalleryHeroVariants,\n\tmediaGalleryImagesVariants,\n};\nexport type {\n\tMediaGalleryHeroProps,\n\tMediaGalleryImageCount,\n\tMediaGalleryImagesProps,\n\tMediaGalleryIndicatorProps,\n\tMediaGalleryItem,\n\tMediaGalleryReviewProps,\n\tMediaGalleryVideoProps,\n};\n"],"mappings":"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","names":[]}
|
package/dist/media-player.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/media-player.tsx"],"sourcesContent":["\"use client\";\n\nimport { Slider as SliderPrimitive } from \"@base-ui/react/slider\";\nimport {\n\tCaptions,\n\tCaptionsOff,\n\tMaximize,\n\tMinimize,\n\tPause,\n\tPictureInPicture2,\n\tPlay,\n\tRefreshCcw,\n\tRepeat2,\n\tRotateCcw,\n\tRotateCw,\n\tSettings,\n\tTriangleAlert,\n\tVolume1,\n\tVolume2,\n\tVolumeX,\n} from \"lucide-react\";\nimport {\n\tMediaActionTypes,\n\tMediaProvider,\n\tuseMediaDispatch,\n\tuseMediaFullscreenRef,\n\tuseMediaRef,\n\tuseMediaSelector,\n\tuseMediaStore,\n} from \"media-chrome/react/media-store\";\nimport * as React from \"react\";\nimport * as ReactDOM from \"react-dom\";\n\nimport {\n\tDropdownMenu,\n\tDropdownMenuContent,\n\tDropdownMenuRadioGroup,\n\tDropdownMenuRadioItem,\n\tDropdownMenuSub,\n\tDropdownMenuSubContent,\n\tDropdownMenuSubTrigger,\n\tDropdownMenuTrigger,\n} from \"./dropdown-menu\";\nimport { cn } from \"./lib/cn\";\nimport { Tooltip, TooltipContent, TooltipTrigger } from \"./tooltip\";\n\ntype MediaProviderProps = React.ComponentProps<typeof MediaProvider>;\ntype MediaPlayerProps = React.ComponentProps<\"div\"> & {\n\taudio?: boolean;\n\tmediaStore?: MediaProviderProps[\"mediaStore\"];\n};\ntype MediaPlayerRootProps = Omit<MediaPlayerProps, \"mediaStore\">;\ntype MediaPlayerControlsProps = React.ComponentProps<\"div\">;\ntype MediaPlayerVideoProps = React.ComponentProps<\"video\">;\ntype MediaPlayerAudioProps = React.ComponentProps<\"audio\">;\ntype MediaPlayerControlsOverlayProps = React.ComponentProps<\"div\">;\ntype MediaPlayerPlayProps = React.ComponentProps<\"button\">;\ntype MediaPlayerSeekButtonProps = React.ComponentProps<\"button\"> & {\n\tseekOffset?: number;\n};\ntype MediaPlayerVolumeProps = React.ComponentProps<\"button\"> & {\n\texpandable?: boolean;\n\trangeClassName?: string;\n};\ntype MediaPlayerPlaybackSpeedProps = React.ComponentProps<\"button\"> & {\n\trates?: number[];\n};\ntype MediaPlayerCaptionsProps = React.ComponentProps<\"button\">;\ntype MediaPlayerSettingsProps = React.ComponentProps<\"button\"> & {\n\trates?: number[];\n};\ntype MediaPlayerTimeProps = React.ComponentProps<\"span\"> & {\n\tshowDuration?: boolean;\n};\ntype MediaPlayerSeekProps = Omit<\n\tSliderPrimitive.Root.Props<number>,\n\t\"defaultValue\" | \"onValueChange\" | \"onValueCommitted\" | \"value\"\n> & {\n\tonValueChange?: (value: number) => void;\n\tstep?: number;\n\twithTime?: boolean;\n};\ntype MediaPlayerLoopProps = React.ComponentProps<\"button\">;\ntype MediaPlayerPiPProps = React.ComponentProps<\"button\">;\ntype MediaPlayerFullscreenProps = React.ComponentProps<\"button\">;\ntype MediaPlayerErrorProps = React.ComponentProps<\"div\">;\n\ntype SubtitleTrack = { kind: string; label: string; language: string };\n\nconst DEFAULT_PLAYBACK_RATES = [0.5, 0.75, 1, 1.25, 1.5, 1.75, 2];\nconst CONTROLS_HIDE_DELAY = 2500;\nconst SEEK_PREVIEW_WIDTH = 160;\n\ntype MediaPlayerContextValue = {\n\tonMenuOpenChange: (open: boolean) => void;\n\tportalContainer: HTMLElement | null;\n\trootNode: HTMLElement | null;\n};\n\nconst MediaPlayerContext = React.createContext<MediaPlayerContextValue>({\n\tonMenuOpenChange: () => {},\n\tportalContainer: null,\n\trootNode: null,\n});\n\nfunction setRef<T>(ref: React.Ref<T> | undefined, value: T | null) {\n\tif (typeof ref === \"function\") {\n\t\tref(value);\n\t\treturn;\n\t}\n\n\tif (ref) {\n\t\tref.current = value;\n\t}\n}\n\nfunction formatTime(value: number | undefined): string {\n\tif (!Number.isFinite(value)) {\n\t\treturn \"0:00\";\n\t}\n\n\tconst safeValue = Math.max(0, Math.floor(value ?? 0));\n\tconst hours = Math.floor(safeValue / 3600);\n\tconst minutes = Math.floor((safeValue % 3600) / 60);\n\tconst seconds = safeValue % 60;\n\n\tif (hours > 0) {\n\t\treturn `${hours}:${String(minutes).padStart(2, \"0\")}:${String(seconds).padStart(2, \"0\")}`;\n\t}\n\n\treturn `${minutes}:${String(seconds).padStart(2, \"0\")}`;\n}\n\nfunction formatRate(value: number | undefined): string {\n\tif (!value || value === 1) {\n\t\treturn \"1x\";\n\t}\n\n\treturn `${Number.parseFloat(value.toFixed(2))}x`;\n}\n\nfunction subtitleTrackId(track: SubtitleTrack): string {\n\treturn `${track.kind}:${track.language}:${track.label}`;\n}\n\nfunction subtitleTrackLabel(track: SubtitleTrack): string {\n\treturn track.label || track.language || \"Captions\";\n}\n\nfunction hasAudioChild(children: React.ReactNode): boolean {\n\treturn React.Children.toArray(children).some((child) => {\n\t\tif (!React.isValidElement(child)) {\n\t\t\treturn false;\n\t\t}\n\n\t\tif (child.type === MediaPlayerAudio) {\n\t\t\treturn true;\n\t\t}\n\n\t\tconst props = child.props as { children?: React.ReactNode };\n\t\treturn hasAudioChild(props.children);\n\t});\n}\n\nfunction getSeekBounds(\n\tseekable: [number, number] | undefined,\n\tduration: number | undefined,\n) {\n\tconst min = seekable?.[0] ?? 0;\n\tconst fallbackMax = Number.isFinite(duration) ? (duration ?? 0) : 0;\n\tconst max = seekable?.[1] ?? fallbackMax;\n\n\treturn {\n\t\tmin,\n\t\tmax: Number.isFinite(max) ? Math.max(min, max) : min,\n\t};\n}\n\nfunction clamp(value: number, min: number, max: number) {\n\treturn Math.min(Math.max(value, min), max);\n}\n\nfunction getSeekValueFromPointer(\n\tevent: React.PointerEvent<HTMLElement>,\n\tmin: number,\n\tmax: number,\n) {\n\tconst rect = event.currentTarget.getBoundingClientRect();\n\tconst percent = clamp((event.clientX - rect.left) / rect.width, 0, 1);\n\n\treturn {\n\t\tpercent: percent * 100,\n\t\tvalue: min + percent * (max - min),\n\t};\n}\n\nfunction MediaPlayer({ mediaStore, ...props }: MediaPlayerProps) {\n\tconst audio =\n\t\tprops.audio ?? (hasAudioChild(props.children) ? true : undefined);\n\n\treturn (\n\t\t<MediaProvider mediaStore={mediaStore}>\n\t\t\t<MediaPlayerRoot {...props} audio={audio} />\n\t\t</MediaProvider>\n\t);\n}\n\nfunction MediaPlayerRoot({\n\taudio,\n\tchildren,\n\tclassName,\n\tonBlurCapture,\n\tonFocusCapture,\n\tonKeyDown,\n\tonPointerDown,\n\tonPointerLeave,\n\tonPointerMove,\n\tref,\n\t...props\n}: MediaPlayerRootProps) {\n\tconst dispatch = useMediaDispatch();\n\tconst store = useMediaStore();\n\tconst fullscreenRef = useMediaFullscreenRef();\n\tconst paused = useMediaSelector((state) => state.mediaPaused !== false);\n\tconst muted = useMediaSelector((state) => state.mediaMuted === true);\n\tconst isFullscreen = useMediaSelector(\n\t\t(state) => state.mediaIsFullscreen === true,\n\t);\n\n\tconst [rootNode, setRootNode] = React.useState<HTMLDivElement | null>(null);\n\tconst [controlsVisible, setControlsVisible] = React.useState(true);\n\tconst [menuOpenCount, setMenuOpenCount] = React.useState(0);\n\tconst [hoveringControls, setHoveringControls] = React.useState(false);\n\tconst [focusPinned, setFocusPinned] = React.useState(false);\n\tconst hideTimerRef = React.useRef<number | undefined>(undefined);\n\tconst lastActivityRef = React.useRef(0);\n\n\tconst alwaysVisible =\n\t\tBoolean(audio) ||\n\t\tpaused ||\n\t\tmenuOpenCount > 0 ||\n\t\thoveringControls ||\n\t\tfocusPinned;\n\tconst alwaysVisibleRef = React.useRef(alwaysVisible);\n\talwaysVisibleRef.current = alwaysVisible;\n\n\tconst scheduleHide = React.useCallback(function schedule(\n\t\tdelay: number = CONTROLS_HIDE_DELAY,\n\t) {\n\t\twindow.clearTimeout(hideTimerRef.current);\n\t\thideTimerRef.current = window.setTimeout(() => {\n\t\t\tif (alwaysVisibleRef.current) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// A stale callback can fire right after activity woke the controls\n\t\t\t// (clearTimeout cannot cancel an already-dispatched callback), so\n\t\t\t// hide only once the controls have actually been idle long enough.\n\t\t\tconst idleFor = Date.now() - lastActivityRef.current;\n\n\t\t\tif (idleFor < CONTROLS_HIDE_DELAY) {\n\t\t\t\tschedule(CONTROLS_HIDE_DELAY - idleFor);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tsetControlsVisible(false);\n\t\t}, delay);\n\t}, []);\n\n\tconst wake = React.useCallback(() => {\n\t\tlastActivityRef.current = Date.now();\n\t\tsetControlsVisible(true);\n\t\tscheduleHide();\n\t}, [scheduleHide]);\n\n\tReact.useEffect(() => {\n\t\tif (alwaysVisible) {\n\t\t\twindow.clearTimeout(hideTimerRef.current);\n\t\t\tsetControlsVisible(true);\n\t\t\treturn;\n\t\t}\n\n\t\tscheduleHide();\n\t}, [alwaysVisible, scheduleHide]);\n\n\tReact.useEffect(() => {\n\t\treturn () => window.clearTimeout(hideTimerRef.current);\n\t}, []);\n\n\t// Chapters tracks default to \"disabled\", which never loads their cues.\n\tReact.useEffect(() => {\n\t\tif (!rootNode) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst loadChapters = () => {\n\t\t\tconst media = rootNode.querySelector<HTMLMediaElement>(\"video, audio\");\n\n\t\t\tfor (const track of media?.textTracks ?? []) {\n\t\t\t\tif (track.kind === \"chapters\" && track.mode === \"disabled\") {\n\t\t\t\t\ttrack.mode = \"hidden\";\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\n\t\tloadChapters();\n\t\tconst textTracks =\n\t\t\trootNode.querySelector<HTMLMediaElement>(\"video, audio\")?.textTracks;\n\t\ttextTracks?.addEventListener(\"addtrack\", loadChapters);\n\n\t\treturn () => textTracks?.removeEventListener(\"addtrack\", loadChapters);\n\t}, [rootNode]);\n\n\tconst onMenuOpenChange = React.useCallback((open: boolean) => {\n\t\tsetMenuOpenCount((count) => (open ? count + 1 : Math.max(0, count - 1)));\n\t}, []);\n\n\tconst contextValue = React.useMemo<MediaPlayerContextValue>(\n\t\t() => ({\n\t\t\tonMenuOpenChange,\n\t\t\tportalContainer: isFullscreen ? rootNode : null,\n\t\t\trootNode,\n\t\t}),\n\t\t[isFullscreen, onMenuOpenChange, rootNode],\n\t);\n\n\t// useMediaFullscreenRef returns a new function every render; keeping it out\n\t// of the callback deps stops React from detaching/re-attaching the ref each\n\t// render, which would reset the media store's fullscreen element (and, while\n\t// playing, loop: store update -> render -> ref cycle -> store update).\n\tconst fullscreenRefRef = React.useRef(fullscreenRef);\n\tfullscreenRefRef.current = fullscreenRef;\n\tconst rootRef = React.useCallback(\n\t\t(node: HTMLDivElement | null) => {\n\t\t\tfullscreenRefRef.current(node);\n\t\t\tsetRootNode(node);\n\t\t\tsetRef(ref, node);\n\t\t},\n\t\t[ref],\n\t);\n\n\treturn (\n\t\t<MediaPlayerContext.Provider value={contextValue}>\n\t\t\t{/* biome-ignore lint/a11y/useSemanticElements: media-chrome needs a generic container for the fullscreen ref */}\n\t\t\t<div\n\t\t\t\tref={rootRef}\n\t\t\t\taria-label={audio ? \"Audio player\" : \"Video player\"}\n\t\t\t\tdata-audio={audio ? \"\" : undefined}\n\t\t\t\tdata-controls={controlsVisible ? \"visible\" : \"hidden\"}\n\t\t\t\tdata-fullscreen={isFullscreen ? \"\" : undefined}\n\t\t\t\tdata-slot=\"media-player\"\n\t\t\t\trole=\"region\"\n\t\t\t\t// biome-ignore lint/a11y/noNoninteractiveTabindex: the player region is the focus target for keyboard shortcuts\n\t\t\t\ttabIndex={0}\n\t\t\t\tclassName={cn(\n\t\t\t\t\t\"group/media-player relative isolate block w-full overflow-hidden rounded-2xl bg-fg-primary text-fg-on-brand shadow-2 outline-none\",\n\t\t\t\t\t\"data-[controls=hidden]:cursor-none\",\n\t\t\t\t\t\"data-[audio]:bg-[image:var(--gradient-accent-forest-to-brass)]\",\n\t\t\t\t\t\"data-[fullscreen]:rounded-none data-[fullscreen]:shadow-none\",\n\t\t\t\t\tclassName,\n\t\t\t\t)}\n\t\t\t\t{...props}\n\t\t\t\tonBlurCapture={(event) => {\n\t\t\t\t\tonBlurCapture?.(event);\n\n\t\t\t\t\tif (!event.currentTarget.contains(event.relatedTarget as Node)) {\n\t\t\t\t\t\tsetFocusPinned(false);\n\t\t\t\t\t}\n\t\t\t\t}}\n\t\t\t\tonFocusCapture={(event) => {\n\t\t\t\t\tonFocusCapture?.(event);\n\n\t\t\t\t\tconst keyboardFocus =\n\t\t\t\t\t\t(event.target as HTMLElement).matches?.(\":focus-visible\") ?? false;\n\t\t\t\t\tsetFocusPinned(keyboardFocus);\n\n\t\t\t\t\tif (keyboardFocus) {\n\t\t\t\t\t\tsetControlsVisible(true);\n\t\t\t\t\t}\n\t\t\t\t}}\n\t\t\t\tonKeyDown={(event) => {\n\t\t\t\t\tonKeyDown?.(event);\n\n\t\t\t\t\tif (\n\t\t\t\t\t\tevent.defaultPrevented ||\n\t\t\t\t\t\tevent.metaKey ||\n\t\t\t\t\t\tevent.ctrlKey ||\n\t\t\t\t\t\tevent.altKey\n\t\t\t\t\t) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\tconst target = event.target as HTMLElement;\n\n\t\t\t\t\tif (\n\t\t\t\t\t\ttarget.closest(\n\t\t\t\t\t\t\t\"input, textarea, select, [contenteditable], [role='slider'], [role='menu'], [role='menuitem'], [role='menuitemradio']\",\n\t\t\t\t\t\t)\n\t\t\t\t\t) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Read lazily from the store: subscribing the root to currentTime\n\t\t\t\t\t// would re-render it (and cycle its ref) on every timeupdate.\n\t\t\t\t\tconst state = store.getState();\n\t\t\t\t\tconst currentTime = state.mediaCurrentTime ?? 0;\n\t\t\t\t\tconst { min, max } = getSeekBounds(\n\t\t\t\t\t\tstate.mediaSeekable,\n\t\t\t\t\t\tstate.mediaDuration,\n\t\t\t\t\t);\n\n\t\t\t\t\tswitch (event.key) {\n\t\t\t\t\t\tcase \" \":\n\t\t\t\t\t\t\tif (target.closest(\"button\")) {\n\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\t\t\tdispatch({\n\t\t\t\t\t\t\t\ttype: paused\n\t\t\t\t\t\t\t\t\t? MediaActionTypes.MEDIA_PLAY_REQUEST\n\t\t\t\t\t\t\t\t\t: MediaActionTypes.MEDIA_PAUSE_REQUEST,\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase \"k\":\n\t\t\t\t\t\tcase \"K\":\n\t\t\t\t\t\t\tdispatch({\n\t\t\t\t\t\t\t\ttype: paused\n\t\t\t\t\t\t\t\t\t? MediaActionTypes.MEDIA_PLAY_REQUEST\n\t\t\t\t\t\t\t\t\t: MediaActionTypes.MEDIA_PAUSE_REQUEST,\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase \"m\":\n\t\t\t\t\t\tcase \"M\":\n\t\t\t\t\t\t\tdispatch({\n\t\t\t\t\t\t\t\ttype: muted\n\t\t\t\t\t\t\t\t\t? MediaActionTypes.MEDIA_UNMUTE_REQUEST\n\t\t\t\t\t\t\t\t\t: MediaActionTypes.MEDIA_MUTE_REQUEST,\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase \"f\":\n\t\t\t\t\t\tcase \"F\":\n\t\t\t\t\t\t\tif (audio) {\n\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tdispatch({\n\t\t\t\t\t\t\t\ttype: isFullscreen\n\t\t\t\t\t\t\t\t\t? MediaActionTypes.MEDIA_EXIT_FULLSCREEN_REQUEST\n\t\t\t\t\t\t\t\t\t: MediaActionTypes.MEDIA_ENTER_FULLSCREEN_REQUEST,\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase \"c\":\n\t\t\t\t\t\tcase \"C\":\n\t\t\t\t\t\t\tdispatch({\n\t\t\t\t\t\t\t\ttype: MediaActionTypes.MEDIA_TOGGLE_SUBTITLES_REQUEST,\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase \"ArrowLeft\":\n\t\t\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\t\t\tdispatch({\n\t\t\t\t\t\t\t\ttype: MediaActionTypes.MEDIA_SEEK_REQUEST,\n\t\t\t\t\t\t\t\tdetail: clamp(currentTime - 5, min, max),\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase \"ArrowRight\":\n\t\t\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\t\t\tdispatch({\n\t\t\t\t\t\t\t\ttype: MediaActionTypes.MEDIA_SEEK_REQUEST,\n\t\t\t\t\t\t\t\tdetail: clamp(currentTime + 5, min, max),\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\twake();\n\t\t\t\t}}\n\t\t\t\tonPointerDown={(event) => {\n\t\t\t\t\tonPointerDown?.(event);\n\t\t\t\t\twake();\n\t\t\t\t}}\n\t\t\t\tonPointerLeave={(event) => {\n\t\t\t\t\tonPointerLeave?.(event);\n\t\t\t\t\tsetHoveringControls(false);\n\n\t\t\t\t\tif (!alwaysVisibleRef.current) {\n\t\t\t\t\t\twindow.clearTimeout(hideTimerRef.current);\n\t\t\t\t\t\tsetControlsVisible(false);\n\t\t\t\t\t}\n\t\t\t\t}}\n\t\t\t\tonPointerMove={(event) => {\n\t\t\t\t\tonPointerMove?.(event);\n\t\t\t\t\twake();\n\n\t\t\t\t\t// Hidden controls are pointer-events-none, so hit-testing via\n\t\t\t\t\t// event.target misses them right after a wake; use geometry.\n\t\t\t\t\tconst controls = event.currentTarget.querySelector(\n\t\t\t\t\t\t\"[data-slot='media-player-controls']\",\n\t\t\t\t\t);\n\t\t\t\t\tconst rect = controls?.getBoundingClientRect();\n\t\t\t\t\tsetHoveringControls(\n\t\t\t\t\t\t!!rect &&\n\t\t\t\t\t\t\tevent.clientX >= rect.left &&\n\t\t\t\t\t\t\tevent.clientX <= rect.right &&\n\t\t\t\t\t\t\tevent.clientY >= rect.top &&\n\t\t\t\t\t\t\tevent.clientY <= rect.bottom,\n\t\t\t\t\t);\n\t\t\t\t}}\n\t\t\t>\n\t\t\t\t{children}\n\t\t\t</div>\n\t\t</MediaPlayerContext.Provider>\n\t);\n}\n\nfunction MediaPlayerVideo({ className, ref, ...props }: MediaPlayerVideoProps) {\n\t// useMediaRef returns a new function every render; keep it out of the deps\n\t// so re-renders don't cycle the ref and re-register the media element.\n\tconst mediaRef = useMediaRef();\n\tconst mediaRefRef = React.useRef(mediaRef);\n\tmediaRefRef.current = mediaRef;\n\tconst videoRef = React.useCallback(\n\t\t(node: HTMLVideoElement | null) => {\n\t\t\tmediaRefRef.current(node);\n\t\t\tsetRef(ref, node);\n\t\t},\n\t\t[ref],\n\t);\n\n\treturn (\n\t\t<video\n\t\t\tref={videoRef}\n\t\t\tdata-slot=\"media-player-video\"\n\t\t\tclassName={cn(\n\t\t\t\t\"block aspect-video size-full object-cover\",\n\t\t\t\t\"group-data-[fullscreen]/media-player:aspect-auto group-data-[fullscreen]/media-player:object-contain\",\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\tplaysInline\n\t\t\t{...props}\n\t\t/>\n\t);\n}\n\nfunction MediaPlayerAudio({ className, ref, ...props }: MediaPlayerAudioProps) {\n\tconst mediaRef = useMediaRef();\n\tconst mediaRefRef = React.useRef(mediaRef);\n\tmediaRefRef.current = mediaRef;\n\tconst audioRef = React.useCallback(\n\t\t(node: HTMLAudioElement | null) => {\n\t\t\tmediaRefRef.current(node);\n\t\t\tsetRef(ref, node);\n\t\t},\n\t\t[ref],\n\t);\n\n\treturn (\n\t\t<audio\n\t\t\tref={audioRef}\n\t\t\tdata-slot=\"media-player-audio\"\n\t\t\tclassName={cn(\"sr-only\", className)}\n\t\t\t{...props}\n\t\t/>\n\t);\n}\n\nfunction MediaPlayerControls({\n\tclassName,\n\t...props\n}: MediaPlayerControlsProps) {\n\treturn (\n\t\t<div\n\t\t\tdata-slot=\"media-player-controls\"\n\t\t\tclassName={cn(\n\t\t\t\t\"absolute inset-x-0 bottom-0 z-10 flex w-full items-center gap-2 p-3 text-fg-on-brand md:p-4\",\n\t\t\t\t\"transition-opacity duration-300 ease-out group-data-[controls=hidden]/media-player:pointer-events-none group-data-[controls=hidden]/media-player:opacity-0\",\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\t{...props}\n\t\t/>\n\t);\n}\n\nfunction MediaPlayerControlsOverlay({\n\tclassName,\n\t...props\n}: MediaPlayerControlsOverlayProps) {\n\treturn (\n\t\t<div\n\t\t\taria-hidden=\"true\"\n\t\t\tdata-slot=\"media-player-controls-overlay\"\n\t\t\tclassName={cn(\n\t\t\t\t\"pointer-events-none absolute inset-x-0 bottom-0 -z-10 h-36 bg-[image:var(--gradient-overlay-photo-bottom)]\",\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\t{...props}\n\t\t/>\n\t);\n}\n\nfunction MediaControlButton({\n\tclassName,\n\tshortcut,\n\ttooltip,\n\t...props\n}: React.ComponentProps<\"button\"> & {\n\tshortcut?: string;\n\ttooltip?: React.ReactNode;\n}) {\n\tconst { portalContainer } = React.useContext(MediaPlayerContext);\n\tconst button = (\n\t\t<button\n\t\t\ttype=\"button\"\n\t\t\tclassName={cn(\n\t\t\t\t\"inline-flex size-9 shrink-0 items-center justify-center rounded-full bg-surface-glass-overlay-button text-fg-on-brand shadow-1 backdrop-blur-sm transition-[background-color,color,box-shadow,transform] outline-none select-none hover:bg-surface-brand hover:text-fg-on-brand focus-visible:shadow-[0px_0px_0px_2px_var(--color-line-focus)] active:scale-95 aria-pressed:bg-surface-brand disabled:pointer-events-none disabled:opacity-45 [&_svg]:size-4.5\",\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\t{...props}\n\t\t/>\n\t);\n\n\tif (!tooltip) {\n\t\treturn button;\n\t}\n\n\treturn (\n\t\t<Tooltip>\n\t\t\t<TooltipTrigger delay={300} render={button} />\n\t\t\t<TooltipContent\n\t\t\t\tclassName=\"border-line-subtle px-2.5 py-1.5 text-gdt-xs font-bold\"\n\t\t\t\tcontainer={portalContainer ?? undefined}\n\t\t\t\tside=\"top\"\n\t\t\t\tsideOffset={8}\n\t\t\t>\n\t\t\t\t{tooltip}\n\t\t\t\t{shortcut ? (\n\t\t\t\t\t<kbd\n\t\t\t\t\t\tdata-slot=\"kbd\"\n\t\t\t\t\t\tclassName=\"rounded-sm border border-line bg-surface px-1.5 py-0.5 font-sans text-gdt-xs font-bold text-fg-primary\"\n\t\t\t\t\t>\n\t\t\t\t\t\t{shortcut}\n\t\t\t\t\t</kbd>\n\t\t\t\t) : null}\n\t\t\t</TooltipContent>\n\t\t</Tooltip>\n\t);\n}\n\nfunction MediaPlayerPlay({\n\tclassName,\n\tonClick,\n\t...props\n}: MediaPlayerPlayProps) {\n\tconst dispatch = useMediaDispatch();\n\tconst paused = useMediaSelector((state) => state.mediaPaused !== false);\n\n\treturn (\n\t\t<MediaControlButton\n\t\t\taria-label={paused ? \"Play media\" : \"Pause media\"}\n\t\t\taria-pressed={!paused}\n\t\t\tdata-slot=\"media-player-play\"\n\t\t\tclassName={className}\n\t\t\tshortcut=\"Space\"\n\t\t\ttooltip={paused ? \"Play\" : \"Pause\"}\n\t\t\tonClick={(event) => {\n\t\t\t\tonClick?.(event);\n\n\t\t\t\tif (event.defaultPrevented) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tdispatch({\n\t\t\t\t\ttype: paused\n\t\t\t\t\t\t? MediaActionTypes.MEDIA_PLAY_REQUEST\n\t\t\t\t\t\t: MediaActionTypes.MEDIA_PAUSE_REQUEST,\n\t\t\t\t});\n\t\t\t}}\n\t\t\t{...props}\n\t\t>\n\t\t\t{paused ? <Play fill=\"currentColor\" /> : <Pause fill=\"currentColor\" />}\n\t\t</MediaControlButton>\n\t);\n}\n\nfunction MediaPlayerSeekBackward({\n\tclassName,\n\tonClick,\n\tseekOffset = 10,\n\t...props\n}: MediaPlayerSeekButtonProps) {\n\tconst dispatch = useMediaDispatch();\n\tconst currentTime = useMediaSelector((state) => state.mediaCurrentTime ?? 0);\n\n\treturn (\n\t\t<MediaControlButton\n\t\t\taria-label={`Seek back ${seekOffset} seconds`}\n\t\t\tdata-slot=\"media-player-seek-backward\"\n\t\t\tclassName={className}\n\t\t\ttooltip={`Back ${seekOffset}s`}\n\t\t\tonClick={(event) => {\n\t\t\t\tonClick?.(event);\n\n\t\t\t\tif (event.defaultPrevented) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tdispatch({\n\t\t\t\t\ttype: MediaActionTypes.MEDIA_SEEK_REQUEST,\n\t\t\t\t\tdetail: Math.max(0, currentTime - seekOffset),\n\t\t\t\t});\n\t\t\t}}\n\t\t\t{...props}\n\t\t>\n\t\t\t<RotateCcw />\n\t\t</MediaControlButton>\n\t);\n}\n\nfunction MediaPlayerSeekForward({\n\tclassName,\n\tonClick,\n\tseekOffset = 10,\n\t...props\n}: MediaPlayerSeekButtonProps) {\n\tconst dispatch = useMediaDispatch();\n\tconst currentTime = useMediaSelector((state) => state.mediaCurrentTime ?? 0);\n\tconst duration = useMediaSelector((state) => state.mediaDuration);\n\tconst seekable = useMediaSelector((state) => state.mediaSeekable);\n\tconst { max } = getSeekBounds(seekable, duration);\n\n\treturn (\n\t\t<MediaControlButton\n\t\t\taria-label={`Seek forward ${seekOffset} seconds`}\n\t\t\tdata-slot=\"media-player-seek-forward\"\n\t\t\tclassName={className}\n\t\t\ttooltip={`Forward ${seekOffset}s`}\n\t\t\tonClick={(event) => {\n\t\t\t\tonClick?.(event);\n\n\t\t\t\tif (event.defaultPrevented) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tdispatch({\n\t\t\t\t\ttype: MediaActionTypes.MEDIA_SEEK_REQUEST,\n\t\t\t\t\tdetail:\n\t\t\t\t\t\tmax > 0\n\t\t\t\t\t\t\t? Math.min(max, currentTime + seekOffset)\n\t\t\t\t\t\t\t: currentTime + seekOffset,\n\t\t\t\t});\n\t\t\t}}\n\t\t\t{...props}\n\t\t>\n\t\t\t<RotateCw />\n\t\t</MediaControlButton>\n\t);\n}\n\nfunction MediaPlayerVolume({\n\tclassName,\n\tdisabled,\n\texpandable = false,\n\tonClick,\n\trangeClassName,\n\t...props\n}: MediaPlayerVolumeProps) {\n\tconst dispatch = useMediaDispatch();\n\tconst muted = useMediaSelector((state) => state.mediaMuted === true);\n\tconst volume = useMediaSelector((state) => state.mediaVolume ?? 1);\n\tconst unavailable = useMediaSelector(\n\t\t(state) => !!state.mediaVolumeUnavailable,\n\t);\n\tconst resolvedDisabled = disabled || unavailable;\n\tconst Icon =\n\t\tmuted || volume === 0 ? VolumeX : volume < 0.5 ? Volume1 : Volume2;\n\n\treturn (\n\t\t<div\n\t\t\tdata-slot=\"media-player-volume\"\n\t\t\tclassName={cn(\n\t\t\t\t\"group/volume flex items-center gap-2 rounded-full\",\n\t\t\t\texpandable &&\n\t\t\t\t\t\"w-9 overflow-visible transition-[width] hover:w-32 focus-within:w-32\",\n\t\t\t)}\n\t\t>\n\t\t\t<MediaControlButton\n\t\t\t\taria-label={muted ? \"Unmute media\" : \"Mute media\"}\n\t\t\t\taria-pressed={muted}\n\t\t\t\tclassName={className}\n\t\t\t\tdisabled={resolvedDisabled}\n\t\t\t\tshortcut=\"M\"\n\t\t\t\ttooltip=\"Volume\"\n\t\t\t\tonClick={(event) => {\n\t\t\t\t\tonClick?.(event);\n\n\t\t\t\t\tif (event.defaultPrevented) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\tdispatch({\n\t\t\t\t\t\ttype: muted\n\t\t\t\t\t\t\t? MediaActionTypes.MEDIA_UNMUTE_REQUEST\n\t\t\t\t\t\t\t: MediaActionTypes.MEDIA_MUTE_REQUEST,\n\t\t\t\t\t});\n\t\t\t\t}}\n\t\t\t\t{...props}\n\t\t\t>\n\t\t\t\t<Icon />\n\t\t\t</MediaControlButton>\n\t\t\t<SliderPrimitive.Root\n\t\t\t\tdata-slot=\"media-player-volume-slider\"\n\t\t\t\tclassName={cn(\n\t\t\t\t\t\"flex h-8 w-20 min-w-20 touch-none items-center\",\n\t\t\t\t\tresolvedDisabled && \"pointer-events-none opacity-45\",\n\t\t\t\t\texpandable &&\n\t\t\t\t\t\t\"pointer-events-none opacity-0 transition-opacity group-hover/volume:pointer-events-auto group-hover/volume:opacity-100 group-focus-within/volume:pointer-events-auto group-focus-within/volume:opacity-100\",\n\t\t\t\t\trangeClassName,\n\t\t\t\t)}\n\t\t\t\tdisabled={resolvedDisabled}\n\t\t\t\tmax={1}\n\t\t\t\tmin={0}\n\t\t\t\tonValueChange={(value) => {\n\t\t\t\t\tconst nextValue = Array.isArray(value) ? (value[0] ?? 0) : value;\n\t\t\t\t\tdispatch({\n\t\t\t\t\t\ttype: MediaActionTypes.MEDIA_VOLUME_REQUEST,\n\t\t\t\t\t\tdetail: nextValue,\n\t\t\t\t\t});\n\n\t\t\t\t\tif (muted && nextValue > 0) {\n\t\t\t\t\t\tdispatch({ type: MediaActionTypes.MEDIA_UNMUTE_REQUEST });\n\t\t\t\t\t}\n\t\t\t\t}}\n\t\t\t\tstep={0.02}\n\t\t\t\tvalue={muted ? 0 : volume}\n\t\t\t>\n\t\t\t\t<SliderPrimitive.Control className=\"flex h-8 w-full items-center\">\n\t\t\t\t\t<SliderPrimitive.Track className=\"h-1.5 w-full rounded-full bg-fg-on-brand/30\">\n\t\t\t\t\t\t<SliderPrimitive.Indicator className=\"rounded-full bg-fg-on-brand\" />\n\t\t\t\t\t\t<SliderPrimitive.Thumb\n\t\t\t\t\t\t\tgetAriaLabel={() => \"Media volume\"}\n\t\t\t\t\t\t\tclassName=\"size-3 rounded-full bg-fg-on-brand shadow-1 outline-none focus-visible:[filter:drop-shadow(0_0_0.25rem_var(--color-line-focus))]\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t</SliderPrimitive.Track>\n\t\t\t\t</SliderPrimitive.Control>\n\t\t\t</SliderPrimitive.Root>\n\t\t</div>\n\t);\n}\n\nfunction MediaPlayerPlaybackSpeed({\n\tclassName,\n\trates = DEFAULT_PLAYBACK_RATES,\n\t...props\n}: MediaPlayerPlaybackSpeedProps) {\n\tconst dispatch = useMediaDispatch();\n\tconst { onMenuOpenChange, portalContainer } =\n\t\tReact.useContext(MediaPlayerContext);\n\tconst playbackRate = useMediaSelector(\n\t\t(state) => state.mediaPlaybackRate ?? 1,\n\t);\n\tconst rateLabel = formatRate(playbackRate);\n\n\treturn (\n\t\t<DropdownMenu size=\"sm\" onOpenChange={onMenuOpenChange}>\n\t\t\t<DropdownMenuTrigger\n\t\t\t\trender={\n\t\t\t\t\t<MediaControlButton\n\t\t\t\t\t\taria-label={`Playback speed ${rateLabel}`}\n\t\t\t\t\t\tdata-slot=\"media-player-playback-speed\"\n\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\"w-auto px-3 text-gdt-xs font-bold tabular-nums\",\n\t\t\t\t\t\t\tclassName,\n\t\t\t\t\t\t)}\n\t\t\t\t\t\ttooltip=\"Playback speed\"\n\t\t\t\t\t\t{...props}\n\t\t\t\t\t>\n\t\t\t\t\t\t{rateLabel}\n\t\t\t\t\t</MediaControlButton>\n\t\t\t\t}\n\t\t\t/>\n\t\t\t<DropdownMenuContent\n\t\t\t\talign=\"end\"\n\t\t\t\tclassName=\"min-w-24\"\n\t\t\t\tcontainer={portalContainer ?? undefined}\n\t\t\t\tside=\"top\"\n\t\t\t\tsideOffset={8}\n\t\t\t>\n\t\t\t\t<DropdownMenuRadioGroup\n\t\t\t\t\tvalue={String(playbackRate)}\n\t\t\t\t\tonValueChange={(value) => {\n\t\t\t\t\t\tdispatch({\n\t\t\t\t\t\t\ttype: MediaActionTypes.MEDIA_PLAYBACK_RATE_REQUEST,\n\t\t\t\t\t\t\tdetail: Number(value),\n\t\t\t\t\t\t});\n\t\t\t\t\t}}\n\t\t\t\t>\n\t\t\t\t\t{rates.map((rate) => (\n\t\t\t\t\t\t<DropdownMenuRadioItem key={rate} closeOnClick value={String(rate)}>\n\t\t\t\t\t\t\t{formatRate(rate)}\n\t\t\t\t\t\t</DropdownMenuRadioItem>\n\t\t\t\t\t))}\n\t\t\t\t</DropdownMenuRadioGroup>\n\t\t\t</DropdownMenuContent>\n\t\t</DropdownMenu>\n\t);\n}\n\nfunction MediaPlayerCaptions({\n\tclassName,\n\tdisabled,\n\tonClick,\n\t...props\n}: MediaPlayerCaptionsProps) {\n\tconst dispatch = useMediaDispatch();\n\tconst subtitlesList = useMediaSelector((state) => state.mediaSubtitlesList);\n\tconst subtitlesShowing = useMediaSelector(\n\t\t(state) => state.mediaSubtitlesShowing,\n\t);\n\tconst hasSubtitles = (subtitlesList?.length ?? 0) > 0;\n\tconst showing = (subtitlesShowing?.length ?? 0) > 0;\n\tconst Icon = showing ? Captions : CaptionsOff;\n\n\treturn (\n\t\t<MediaControlButton\n\t\t\taria-label={showing ? \"Disable captions\" : \"Enable captions\"}\n\t\t\taria-pressed={showing}\n\t\t\tdata-slot=\"media-player-captions\"\n\t\t\tclassName={className}\n\t\t\tdisabled={disabled || !hasSubtitles}\n\t\t\tshortcut=\"C\"\n\t\t\ttooltip=\"Captions\"\n\t\t\tonClick={(event) => {\n\t\t\t\tonClick?.(event);\n\n\t\t\t\tif (event.defaultPrevented) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tdispatch({ type: MediaActionTypes.MEDIA_TOGGLE_SUBTITLES_REQUEST });\n\t\t\t}}\n\t\t\t{...props}\n\t\t>\n\t\t\t<Icon />\n\t\t</MediaControlButton>\n\t);\n}\n\nfunction MediaPlayerSettings({\n\tclassName,\n\trates = DEFAULT_PLAYBACK_RATES,\n\t...props\n}: MediaPlayerSettingsProps) {\n\tconst dispatch = useMediaDispatch();\n\tconst { onMenuOpenChange, portalContainer } =\n\t\tReact.useContext(MediaPlayerContext);\n\tconst playbackRate = useMediaSelector(\n\t\t(state) => state.mediaPlaybackRate ?? 1,\n\t);\n\tconst subtitlesList = useMediaSelector((state) => state.mediaSubtitlesList);\n\tconst subtitlesShowing = useMediaSelector(\n\t\t(state) => state.mediaSubtitlesShowing,\n\t);\n\tconst subtitles = subtitlesList ?? [];\n\tconst showingTrack = subtitlesShowing?.[0];\n\tconst captionsValue = showingTrack ? subtitleTrackId(showingTrack) : \"off\";\n\tconst captionsLabel = showingTrack ? subtitleTrackLabel(showingTrack) : \"Off\";\n\n\treturn (\n\t\t<DropdownMenu size=\"sm\" onOpenChange={onMenuOpenChange}>\n\t\t\t<DropdownMenuTrigger\n\t\t\t\trender={\n\t\t\t\t\t<MediaControlButton\n\t\t\t\t\t\taria-label=\"Player settings\"\n\t\t\t\t\t\tdata-slot=\"media-player-settings\"\n\t\t\t\t\t\tclassName={className}\n\t\t\t\t\t\ttooltip=\"Settings\"\n\t\t\t\t\t\t{...props}\n\t\t\t\t\t>\n\t\t\t\t\t\t<Settings />\n\t\t\t\t\t</MediaControlButton>\n\t\t\t\t}\n\t\t\t/>\n\t\t\t<DropdownMenuContent\n\t\t\t\talign=\"end\"\n\t\t\t\tclassName=\"min-w-48\"\n\t\t\t\tcontainer={portalContainer ?? undefined}\n\t\t\t\tside=\"top\"\n\t\t\t\tsideOffset={8}\n\t\t\t>\n\t\t\t\t<DropdownMenuSub>\n\t\t\t\t\t<DropdownMenuSubTrigger>\n\t\t\t\t\t\tSpeed\n\t\t\t\t\t\t<span className=\"ml-auto rounded-md bg-surface px-1.5 py-0.5 text-gdt-xs font-bold tabular-nums\">\n\t\t\t\t\t\t\t{formatRate(playbackRate)}\n\t\t\t\t\t\t</span>\n\t\t\t\t\t</DropdownMenuSubTrigger>\n\t\t\t\t\t<DropdownMenuSubContent container={portalContainer ?? undefined}>\n\t\t\t\t\t\t<DropdownMenuRadioGroup\n\t\t\t\t\t\t\tvalue={String(playbackRate)}\n\t\t\t\t\t\t\tonValueChange={(value) => {\n\t\t\t\t\t\t\t\tdispatch({\n\t\t\t\t\t\t\t\t\ttype: MediaActionTypes.MEDIA_PLAYBACK_RATE_REQUEST,\n\t\t\t\t\t\t\t\t\tdetail: Number(value),\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{rates.map((rate) => (\n\t\t\t\t\t\t\t\t<DropdownMenuRadioItem\n\t\t\t\t\t\t\t\t\tkey={rate}\n\t\t\t\t\t\t\t\t\tcloseOnClick\n\t\t\t\t\t\t\t\t\tvalue={String(rate)}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t{formatRate(rate)}\n\t\t\t\t\t\t\t\t</DropdownMenuRadioItem>\n\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t</DropdownMenuRadioGroup>\n\t\t\t\t\t</DropdownMenuSubContent>\n\t\t\t\t</DropdownMenuSub>\n\t\t\t\t{subtitles.length > 0 ? (\n\t\t\t\t\t<DropdownMenuSub>\n\t\t\t\t\t\t<DropdownMenuSubTrigger>\n\t\t\t\t\t\t\tCaptions\n\t\t\t\t\t\t\t<span className=\"ml-auto rounded-md bg-surface px-1.5 py-0.5 text-gdt-xs font-bold\">\n\t\t\t\t\t\t\t\t{captionsLabel}\n\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t</DropdownMenuSubTrigger>\n\t\t\t\t\t\t<DropdownMenuSubContent container={portalContainer ?? undefined}>\n\t\t\t\t\t\t\t<DropdownMenuRadioGroup\n\t\t\t\t\t\t\t\tvalue={captionsValue}\n\t\t\t\t\t\t\t\tonValueChange={(value) => {\n\t\t\t\t\t\t\t\t\tif (subtitlesShowing?.length) {\n\t\t\t\t\t\t\t\t\t\tdispatch({\n\t\t\t\t\t\t\t\t\t\t\ttype: MediaActionTypes.MEDIA_DISABLE_SUBTITLES_REQUEST,\n\t\t\t\t\t\t\t\t\t\t\tdetail: subtitlesShowing,\n\t\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\tconst track = subtitles.find(\n\t\t\t\t\t\t\t\t\t\t(candidate) => subtitleTrackId(candidate) === value,\n\t\t\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\t\t\tif (track) {\n\t\t\t\t\t\t\t\t\t\tdispatch({\n\t\t\t\t\t\t\t\t\t\t\ttype: MediaActionTypes.MEDIA_SHOW_SUBTITLES_REQUEST,\n\t\t\t\t\t\t\t\t\t\t\tdetail: [track],\n\t\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<DropdownMenuRadioItem closeOnClick value=\"off\">\n\t\t\t\t\t\t\t\t\tOff\n\t\t\t\t\t\t\t\t</DropdownMenuRadioItem>\n\t\t\t\t\t\t\t\t{subtitles.map((track) => (\n\t\t\t\t\t\t\t\t\t<DropdownMenuRadioItem\n\t\t\t\t\t\t\t\t\t\tkey={subtitleTrackId(track)}\n\t\t\t\t\t\t\t\t\t\tcloseOnClick\n\t\t\t\t\t\t\t\t\t\tvalue={subtitleTrackId(track)}\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t{subtitleTrackLabel(track)}\n\t\t\t\t\t\t\t\t\t</DropdownMenuRadioItem>\n\t\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t\t</DropdownMenuRadioGroup>\n\t\t\t\t\t\t</DropdownMenuSubContent>\n\t\t\t\t\t</DropdownMenuSub>\n\t\t\t\t) : null}\n\t\t\t</DropdownMenuContent>\n\t\t</DropdownMenu>\n\t);\n}\n\nfunction MediaPlayerTime({\n\tclassName,\n\tshowDuration = true,\n\t...props\n}: MediaPlayerTimeProps) {\n\tconst currentTime = useMediaSelector((state) => state.mediaCurrentTime ?? 0);\n\tconst duration = useMediaSelector((state) => state.mediaDuration);\n\n\treturn (\n\t\t<span\n\t\t\tdata-slot=\"media-player-time\"\n\t\t\tclassName={cn(\n\t\t\t\t\"inline-flex shrink-0 items-center px-1 text-gdt-sm font-medium tabular-nums text-fg-on-brand/80\",\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\t{...props}\n\t\t>\n\t\t\t{showDuration\n\t\t\t\t? `${formatTime(currentTime)} / ${formatTime(duration)}`\n\t\t\t\t: formatTime(currentTime)}\n\t\t</span>\n\t);\n}\n\nfunction MediaPlayerSeek({\n\tclassName,\n\tdisabled,\n\tonValueChange,\n\t\"aria-label\": ariaLabel,\n\tstep = 5,\n\twithTime = true,\n\t...props\n}: MediaPlayerSeekProps) {\n\tconst dispatch = useMediaDispatch();\n\tconst { portalContainer } = React.useContext(MediaPlayerContext);\n\tconst controlRef = React.useRef<HTMLDivElement | null>(null);\n\tconst [dragValue, setDragValue] = React.useState<number | null>(null);\n\tconst [hoverValue, setHoverValue] = React.useState<number | null>(null);\n\tconst [pendingSeek, setPendingSeek] = React.useState<number | null>(null);\n\tconst currentTime = useMediaSelector((state) => state.mediaCurrentTime ?? 0);\n\tconst duration = useMediaSelector((state) => state.mediaDuration);\n\tconst seekable = useMediaSelector((state) => state.mediaSeekable);\n\tconst buffered = useMediaSelector((state) => state.mediaBuffered);\n\tconst previewImage = useMediaSelector((state) => state.mediaPreviewImage);\n\tconst previewCoords = useMediaSelector((state) => state.mediaPreviewCoords);\n\tconst chapterCues = useMediaSelector((state) => state.mediaChaptersCues);\n\tconst { min, max } = getSeekBounds(seekable, duration);\n\tconst canSeek = max > min;\n\tconst resolvedDisabled = disabled || !canSeek;\n\n\tconst seekRafRef = React.useRef<number | null>(null);\n\tconst latestSeekValueRef = React.useRef(0);\n\n\t// While scrubbing, the slider value drives the UI; after release the seek\n\t// target keeps driving it until the media element catches up, so the thumb\n\t// never snaps back to a stale currentTime.\n\tconst displayTime = clamp(dragValue ?? pendingSeek ?? currentTime, min, max);\n\n\t// Fine enough that dragging feels continuous; `step` (default 5s) maps to\n\t// PageUp/PageDown via largeStep.\n\tconst sliderStep = canSeek ? clamp((max - min) / 500, 0.05, 1) : 1;\n\n\tReact.useEffect(() => {\n\t\tif (pendingSeek !== null && Math.abs(currentTime - pendingSeek) < 0.5) {\n\t\t\tsetPendingSeek(null);\n\t\t}\n\t}, [currentTime, pendingSeek]);\n\n\tReact.useEffect(() => {\n\t\treturn () => {\n\t\t\tif (seekRafRef.current !== null) {\n\t\t\t\tcancelAnimationFrame(seekRafRef.current);\n\t\t\t}\n\t\t};\n\t}, []);\n\n\tconst queueSeek = (value: number) => {\n\t\tlatestSeekValueRef.current = value;\n\n\t\tif (seekRafRef.current !== null) {\n\t\t\treturn;\n\t\t}\n\n\t\tseekRafRef.current = requestAnimationFrame(() => {\n\t\t\tseekRafRef.current = null;\n\t\t\tdispatch({\n\t\t\t\ttype: MediaActionTypes.MEDIA_SEEK_REQUEST,\n\t\t\t\tdetail: latestSeekValueRef.current,\n\t\t\t});\n\t\t});\n\t};\n\n\tconst previewAt = (value: number) => {\n\t\tdispatch({\n\t\t\ttype: MediaActionTypes.MEDIA_PREVIEW_REQUEST,\n\t\t\tdetail: clamp(value, min, max),\n\t\t});\n\t};\n\n\tconst clearPreview = () => {\n\t\tsetHoverValue(null);\n\t\tdispatch({\n\t\t\ttype: MediaActionTypes.MEDIA_PREVIEW_REQUEST,\n\t\t\tdetail: undefined,\n\t\t});\n\t};\n\n\tconst previewValue = dragValue ?? hoverValue;\n\tconst previewPercent =\n\t\tpreviewValue !== null && canSeek\n\t\t\t? ((clamp(previewValue, min, max) - min) / (max - min)) * 100\n\t\t\t: 0;\n\tconst previewChapter =\n\t\tpreviewValue !== null\n\t\t\t? chapterCues?.find(\n\t\t\t\t\t(cue) => previewValue >= cue.startTime && previewValue < cue.endTime,\n\t\t\t\t)\n\t\t\t: undefined;\n\tconst previewCoordValues = previewCoords?.map(Number);\n\tconst hasSpriteCoords =\n\t\tpreviewCoordValues?.length === 4 && (previewCoordValues[2] ?? 0) > 0;\n\tconst previewScale = hasSpriteCoords\n\t\t? SEEK_PREVIEW_WIDTH / (previewCoordValues?.[2] ?? 1)\n\t\t: 1;\n\tconst previewClampPx = previewImage ? SEEK_PREVIEW_WIDTH / 2 + 4 : 32;\n\n\t// The preview renders through a portal with fixed positioning: the player\n\t// root is overflow-hidden, which would clip it on compact (audio) layouts.\n\tconst controlRect =\n\t\twithTime && previewValue !== null\n\t\t\t? controlRef.current?.getBoundingClientRect()\n\t\t\t: undefined;\n\tconst previewLeft = controlRect\n\t\t? clamp(\n\t\t\t\tcontrolRect.left + (previewPercent / 100) * controlRect.width,\n\t\t\t\tcontrolRect.left + previewClampPx,\n\t\t\t\tcontrolRect.right - previewClampPx,\n\t\t\t)\n\t\t: 0;\n\n\t// One track segment per chapter (single segment without chapters); each\n\t// segment clips its own buffered/played fills so every edge stays rounded.\n\tconst segmentBounds = canSeek\n\t\t? [\n\t\t\t\tmin,\n\t\t\t\t...(chapterCues ?? [])\n\t\t\t\t\t.map((cue) => cue.startTime)\n\t\t\t\t\t.filter((time) => time > min && time < max)\n\t\t\t\t\t.sort((a, b) => a - b),\n\t\t\t\tmax,\n\t\t\t]\n\t\t: [0, 1];\n\tconst segments = segmentBounds.slice(0, -1).map((start, index) => ({\n\t\tstart,\n\t\tend: segmentBounds[index + 1] ?? start,\n\t}));\n\n\treturn (\n\t\t<SliderPrimitive.Root\n\t\t\tdata-slot=\"media-player-seek\"\n\t\t\tclassName={cn(\n\t\t\t\t\"relative flex h-8 w-full min-w-0 touch-none items-center\",\n\t\t\t\tresolvedDisabled && \"pointer-events-none opacity-45\",\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\tdisabled={resolvedDisabled}\n\t\t\tlargeStep={step}\n\t\t\tmax={canSeek ? max : 100}\n\t\t\tmin={min}\n\t\t\tonValueChange={(value) => {\n\t\t\t\tconst nextValue = Array.isArray(value) ? (value[0] ?? 0) : value;\n\t\t\t\tsetDragValue(nextValue);\n\t\t\t\tpreviewAt(nextValue);\n\t\t\t\tqueueSeek(nextValue);\n\t\t\t\tonValueChange?.(nextValue);\n\t\t\t}}\n\t\t\tonValueCommitted={(value) => {\n\t\t\t\tconst nextValue = clamp(\n\t\t\t\t\tArray.isArray(value) ? (value[0] ?? 0) : value,\n\t\t\t\t\tmin,\n\t\t\t\t\tmax,\n\t\t\t\t);\n\n\t\t\t\tif (seekRafRef.current !== null) {\n\t\t\t\t\tcancelAnimationFrame(seekRafRef.current);\n\t\t\t\t\tseekRafRef.current = null;\n\t\t\t\t}\n\n\t\t\t\tdispatch({\n\t\t\t\t\ttype: MediaActionTypes.MEDIA_SEEK_REQUEST,\n\t\t\t\t\tdetail: nextValue,\n\t\t\t\t});\n\t\t\t\tsetPendingSeek(nextValue);\n\t\t\t\tsetDragValue(null);\n\t\t\t\tclearPreview();\n\t\t\t}}\n\t\t\tstep={sliderStep}\n\t\t\tvalue={displayTime}\n\t\t\t{...props}\n\t\t>\n\t\t\t{withTime &&\n\t\t\t\tpreviewValue !== null &&\n\t\t\t\tcontrolRect &&\n\t\t\t\tReactDOM.createPortal(\n\t\t\t\t\t<div\n\t\t\t\t\t\tclassName=\"pointer-events-none fixed z-50 flex -translate-x-1/2 -translate-y-full flex-col items-center overflow-hidden rounded-lg bg-surface-overlay text-fg-primary shadow-2\"\n\t\t\t\t\t\tdata-slot=\"media-player-seek-preview\"\n\t\t\t\t\t\tstyle={{ left: previewLeft, top: controlRect.top - 6 }}\n\t\t\t\t\t>\n\t\t\t\t\t\t{previewImage ? (\n\t\t\t\t\t\t\thasSpriteCoords ? (\n\t\t\t\t\t\t\t\t<span\n\t\t\t\t\t\t\t\t\tclassName=\"relative block overflow-hidden bg-line-subtle/50\"\n\t\t\t\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t\t\t\twidth: SEEK_PREVIEW_WIDTH,\n\t\t\t\t\t\t\t\t\t\theight: (previewCoordValues?.[3] ?? 0) * previewScale,\n\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t<img\n\t\t\t\t\t\t\t\t\t\tsrc={previewImage}\n\t\t\t\t\t\t\t\t\t\talt=\"\"\n\t\t\t\t\t\t\t\t\t\tdraggable={false}\n\t\t\t\t\t\t\t\t\t\tclassName=\"absolute top-0 left-0 max-w-none origin-top-left\"\n\t\t\t\t\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t\t\t\t\ttransform: `scale(${previewScale}) translate(${-(previewCoordValues?.[0] ?? 0)}px, ${-(previewCoordValues?.[1] ?? 0)}px)`,\n\t\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t<img\n\t\t\t\t\t\t\t\t\tsrc={previewImage}\n\t\t\t\t\t\t\t\t\talt=\"\"\n\t\t\t\t\t\t\t\t\tdraggable={false}\n\t\t\t\t\t\t\t\t\tclassName=\"block aspect-video bg-line-subtle/50 object-cover\"\n\t\t\t\t\t\t\t\t\tstyle={{ width: SEEK_PREVIEW_WIDTH }}\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t) : null}\n\t\t\t\t\t\t{previewChapter?.text ? (\n\t\t\t\t\t\t\t<span className=\"max-w-40 truncate px-2.5 pt-1 text-gdt-xs font-bold\">\n\t\t\t\t\t\t\t\t{previewChapter.text}\n\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t) : null}\n\t\t\t\t\t\t<span\n\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\"px-2.5 py-1 text-gdt-xs font-bold tabular-nums\",\n\t\t\t\t\t\t\t\t(previewImage || previewChapter?.text) && \"pt-0.5 pb-1.5\",\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{formatTime(previewValue)}\n\t\t\t\t\t\t</span>\n\t\t\t\t\t</div>,\n\t\t\t\t\tportalContainer ?? document.body,\n\t\t\t\t)}\n\t\t\t<SliderPrimitive.Control\n\t\t\t\tref={controlRef}\n\t\t\t\tclassName=\"flex h-8 w-full items-center\"\n\t\t\t\tonPointerLeave={() => {\n\t\t\t\t\tif (dragValue === null) {\n\t\t\t\t\t\tclearPreview();\n\t\t\t\t\t}\n\t\t\t\t}}\n\t\t\t\tonPointerMove={(event) => {\n\t\t\t\t\tif (resolvedDisabled || dragValue !== null) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\tconst next = getSeekValueFromPointer(event, min, max);\n\t\t\t\t\tsetHoverValue(next.value);\n\t\t\t\t\tpreviewAt(next.value);\n\t\t\t\t}}\n\t\t\t>\n\t\t\t\t<SliderPrimitive.Track className=\"relative flex h-2 w-full items-center gap-[3px]\">\n\t\t\t\t\t{segments.map(({ start, end }) => {\n\t\t\t\t\t\tconst span = end - start || 1;\n\t\t\t\t\t\tconst fraction = (value: number) =>\n\t\t\t\t\t\t\tclamp((clamp(value, start, end) - start) / span, 0, 1);\n\t\t\t\t\t\tconst playedWidth = fraction(displayTime) * 100;\n\n\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t<span\n\t\t\t\t\t\t\t\tkey={start}\n\t\t\t\t\t\t\t\tdata-slot=\"media-player-seek-segment\"\n\t\t\t\t\t\t\t\tclassName=\"relative h-full overflow-hidden rounded-full bg-line-subtle/65\"\n\t\t\t\t\t\t\t\tstyle={{ width: `${(span / (max - min || 1)) * 100}%` }}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{canSeek &&\n\t\t\t\t\t\t\t\t\tbuffered?.map(([bufferStart, bufferEnd]) =>\n\t\t\t\t\t\t\t\t\t\tbufferEnd > start && bufferStart < end ? (\n\t\t\t\t\t\t\t\t\t\t\t<span\n\t\t\t\t\t\t\t\t\t\t\t\tkey={`${bufferStart}-${bufferEnd}`}\n\t\t\t\t\t\t\t\t\t\t\t\tdata-slot=\"media-player-seek-buffered\"\n\t\t\t\t\t\t\t\t\t\t\t\tclassName=\"absolute inset-y-0 bg-fg-on-brand/25\"\n\t\t\t\t\t\t\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t\t\t\t\t\t\tleft: `${fraction(bufferStart) * 100}%`,\n\t\t\t\t\t\t\t\t\t\t\t\t\twidth: `${(fraction(bufferEnd) - fraction(bufferStart)) * 100}%`,\n\t\t\t\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t\t) : null,\n\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t<span\n\t\t\t\t\t\t\t\t\tdata-slot=\"media-player-seek-progress\"\n\t\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t\t\"absolute inset-y-0 left-0 bg-surface-brand\",\n\t\t\t\t\t\t\t\t\t\tdragValue === null &&\n\t\t\t\t\t\t\t\t\t\t\t\"transition-[width] duration-200 ease-linear\",\n\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\tstyle={{ width: `${playedWidth}%` }}\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t);\n\t\t\t\t\t})}\n\t\t\t\t</SliderPrimitive.Track>\n\t\t\t\t<SliderPrimitive.Thumb\n\t\t\t\t\tgetAriaLabel={() => ariaLabel ?? \"Media timeline\"}\n\t\t\t\t\tgetAriaValueText={(_formatted, value) =>\n\t\t\t\t\t\t`${formatTime(value)} of ${formatTime(max)}`\n\t\t\t\t\t}\n\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\"size-3.5 -translate-x-1/2 rounded-full bg-surface-overlay shadow-2 ring-2 ring-surface-brand outline-none\",\n\t\t\t\t\t\t\"transition-[inset-inline-start,transform] duration-200 ease-linear data-[dragging]:scale-125 data-[dragging]:transition-transform\",\n\t\t\t\t\t\t\"focus-visible:[filter:drop-shadow(0_0_0.25rem_var(--color-line-focus))]\",\n\t\t\t\t\t)}\n\t\t\t\t/>\n\t\t\t</SliderPrimitive.Control>\n\t\t</SliderPrimitive.Root>\n\t);\n}\n\nfunction MediaPlayerLoop({\n\tclassName,\n\tonClick,\n\t...props\n}: MediaPlayerLoopProps) {\n\tconst dispatch = useMediaDispatch();\n\tconst loop = useMediaSelector((state) => state.mediaLoop === true);\n\n\treturn (\n\t\t<MediaControlButton\n\t\t\taria-label={loop ? \"Disable loop\" : \"Enable loop\"}\n\t\t\taria-pressed={loop}\n\t\t\tdata-slot=\"media-player-loop\"\n\t\t\tclassName={className}\n\t\t\ttooltip={loop ? \"Disable loop\" : \"Enable loop\"}\n\t\t\tonClick={(event) => {\n\t\t\t\tonClick?.(event);\n\n\t\t\t\tif (event.defaultPrevented) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tdispatch({\n\t\t\t\t\ttype: MediaActionTypes.MEDIA_LOOP_REQUEST,\n\t\t\t\t\tdetail: !loop,\n\t\t\t\t});\n\t\t\t}}\n\t\t\t{...props}\n\t\t>\n\t\t\t<Repeat2 />\n\t\t</MediaControlButton>\n\t);\n}\n\nfunction MediaPlayerPiP({\n\tclassName,\n\tdisabled,\n\tonClick,\n\t...props\n}: MediaPlayerPiPProps) {\n\tconst dispatch = useMediaDispatch();\n\tconst isPip = useMediaSelector((state) => state.mediaIsPip === true);\n\tconst unavailable = useMediaSelector((state) => !!state.mediaPipUnavailable);\n\n\treturn (\n\t\t<MediaControlButton\n\t\t\taria-label={\n\t\t\t\tisPip ? \"Exit picture in picture\" : \"Enter picture in picture\"\n\t\t\t}\n\t\t\taria-pressed={isPip}\n\t\t\tdata-slot=\"media-player-pip\"\n\t\t\tclassName={className}\n\t\t\tdisabled={disabled || unavailable}\n\t\t\ttooltip={isPip ? \"Exit picture in picture\" : \"Picture in picture\"}\n\t\t\tonClick={(event) => {\n\t\t\t\tonClick?.(event);\n\n\t\t\t\tif (event.defaultPrevented) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tdispatch({\n\t\t\t\t\ttype: isPip\n\t\t\t\t\t\t? MediaActionTypes.MEDIA_EXIT_PIP_REQUEST\n\t\t\t\t\t\t: MediaActionTypes.MEDIA_ENTER_PIP_REQUEST,\n\t\t\t\t});\n\t\t\t}}\n\t\t\t{...props}\n\t\t>\n\t\t\t<PictureInPicture2 />\n\t\t</MediaControlButton>\n\t);\n}\n\nfunction MediaPlayerFullscreen({\n\tclassName,\n\tdisabled,\n\tonClick,\n\t...props\n}: MediaPlayerFullscreenProps) {\n\tconst dispatch = useMediaDispatch();\n\tconst isFullscreen = useMediaSelector(\n\t\t(state) => state.mediaIsFullscreen === true,\n\t);\n\tconst unavailable = useMediaSelector(\n\t\t(state) => !!state.mediaFullscreenUnavailable,\n\t);\n\tconst Icon = isFullscreen ? Minimize : Maximize;\n\n\treturn (\n\t\t<MediaControlButton\n\t\t\taria-label={isFullscreen ? \"Exit fullscreen\" : \"Enter fullscreen\"}\n\t\t\taria-pressed={isFullscreen}\n\t\t\tdata-slot=\"media-player-fullscreen\"\n\t\t\tclassName={className}\n\t\t\tdisabled={disabled || unavailable}\n\t\t\tshortcut=\"F\"\n\t\t\ttooltip={isFullscreen ? \"Exit fullscreen\" : \"Fullscreen\"}\n\t\t\tonClick={(event) => {\n\t\t\t\tonClick?.(event);\n\n\t\t\t\tif (event.defaultPrevented) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tdispatch({\n\t\t\t\t\ttype: isFullscreen\n\t\t\t\t\t\t? MediaActionTypes.MEDIA_EXIT_FULLSCREEN_REQUEST\n\t\t\t\t\t\t: MediaActionTypes.MEDIA_ENTER_FULLSCREEN_REQUEST,\n\t\t\t\t});\n\t\t\t}}\n\t\t\t{...props}\n\t\t>\n\t\t\t<Icon />\n\t\t</MediaControlButton>\n\t);\n}\n\nconst MEDIA_ERROR_CONTENT: Record<\n\tnumber,\n\t{ title: string; description: string }\n> = {\n\t1: {\n\t\ttitle: \"Playback interrupted\",\n\t\tdescription: \"Loading the media was interrupted.\",\n\t},\n\t2: {\n\t\ttitle: \"Connection error\",\n\t\tdescription: \"A network error kept the media from loading.\",\n\t},\n\t3: {\n\t\ttitle: \"Playback error\",\n\t\tdescription: \"The media could not be decoded.\",\n\t},\n\t4: {\n\t\ttitle: \"Unsupported format\",\n\t\tdescription: \"The media format is not supported.\",\n\t},\n};\n\nfunction MediaPlayerError({\n\tchildren,\n\tclassName,\n\t...props\n}: MediaPlayerErrorProps) {\n\tconst { rootNode } = React.useContext(MediaPlayerContext);\n\tconst mediaError = useMediaSelector((state) => state.mediaError);\n\tconst [sourceFailed, setSourceFailed] = React.useState(false);\n\n\t// When all <source> children fail, the error event fires on the <source>\n\t// element and media.error stays null, so the media store never reports it.\n\t// Catch it in the capture phase and inspect networkState instead.\n\tReact.useEffect(() => {\n\t\tif (!rootNode) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst update = () => {\n\t\t\tconst media = rootNode.querySelector<HTMLMediaElement>(\"video, audio\");\n\t\t\tsetSourceFailed(\n\t\t\t\t!!media &&\n\t\t\t\t\tmedia.networkState === HTMLMediaElement.NETWORK_NO_SOURCE &&\n\t\t\t\t\tmedia.readyState === HTMLMediaElement.HAVE_NOTHING,\n\t\t\t);\n\t\t};\n\n\t\tupdate();\n\t\trootNode.addEventListener(\"error\", update, true);\n\t\trootNode.addEventListener(\"loadstart\", update, true);\n\t\trootNode.addEventListener(\"loadedmetadata\", update, true);\n\n\t\treturn () => {\n\t\t\trootNode.removeEventListener(\"error\", update, true);\n\t\t\trootNode.removeEventListener(\"loadstart\", update, true);\n\t\t\trootNode.removeEventListener(\"loadedmetadata\", update, true);\n\t\t};\n\t}, [rootNode]);\n\n\tconst error: { code?: number } | null =\n\t\tmediaError ?? (sourceFailed ? { code: 4 } : null);\n\n\tif (!error) {\n\t\treturn null;\n\t}\n\n\tconst content = MEDIA_ERROR_CONTENT[error.code ?? 0] ?? {\n\t\ttitle: \"Something went wrong\",\n\t\tdescription: \"The media could not be played.\",\n\t};\n\n\treturn (\n\t\t<div\n\t\t\tdata-slot=\"media-player-error\"\n\t\t\trole=\"alert\"\n\t\t\tclassName={cn(\n\t\t\t\t\"absolute inset-0 z-20 flex flex-col items-center justify-center gap-1 bg-canvas/85 px-6 text-center text-fg-primary backdrop-blur-sm rounded-2xl\",\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\t{...props}\n\t\t>\n\t\t\t{children ?? (\n\t\t\t\t<>\n\t\t\t\t\t<TriangleAlert\n\t\t\t\t\t\taria-hidden=\"true\"\n\t\t\t\t\t\tclassName=\"mb-2 size-9 text-fg-danger\"\n\t\t\t\t\t/>\n\t\t\t\t\t<p className=\"text-gdt-lg font-bold\">{content.title}</p>\n\t\t\t\t\t<p className=\"text-gdt-sm text-fg-secondary\">{content.description}</p>\n\t\t\t\t\t<div className=\"mt-4 flex items-center gap-2\">\n\t\t\t\t\t\t<MediaControlButton\n\t\t\t\t\t\t\tclassName=\"w-auto gap-1.5 px-4 text-gdt-xs font-bold [&_svg]:size-3.5\"\n\t\t\t\t\t\t\tonClick={() => {\n\t\t\t\t\t\t\t\trootNode\n\t\t\t\t\t\t\t\t\t?.querySelector<HTMLMediaElement>(\"video, audio\")\n\t\t\t\t\t\t\t\t\t?.load();\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<RefreshCcw />\n\t\t\t\t\t\t\tTry again\n\t\t\t\t\t\t</MediaControlButton>\n\t\t\t\t\t\t<MediaControlButton\n\t\t\t\t\t\t\tclassName=\"w-auto gap-1.5 px-4 text-gdt-xs font-bold [&_svg]:size-3.5\"\n\t\t\t\t\t\t\tonClick={() => {\n\t\t\t\t\t\t\t\twindow.location.reload();\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<RotateCcw />\n\t\t\t\t\t\t\tReload page\n\t\t\t\t\t\t</MediaControlButton>\n\t\t\t\t\t</div>\n\t\t\t\t</>\n\t\t\t)}\n\t\t</div>\n\t);\n}\n\nexport {\n\tMediaPlayer,\n\tMediaPlayerAudio,\n\tMediaPlayerCaptions,\n\tMediaPlayerControls,\n\tMediaPlayerControlsOverlay,\n\tMediaPlayerError,\n\tMediaPlayerFullscreen,\n\tMediaPlayerLoop,\n\tMediaPlayerPiP,\n\tMediaPlayerPlay,\n\tMediaPlayerPlaybackSpeed,\n\tMediaPlayerSeek,\n\tMediaPlayerSeekBackward,\n\tMediaPlayerSeekForward,\n\tMediaPlayerSettings,\n\tMediaPlayerTime,\n\tMediaPlayerVideo,\n\tMediaPlayerVolume,\n};\n"],"mappings":"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","names":[]}
|
package/dist/number-input.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/number-input.tsx"],"sourcesContent":["import {\n\tNumberField,\n\ttype NumberFieldRootProps,\n} from \"@base-ui/react/number-field\";\nimport { MinusIcon, PlusIcon } from \"lucide-react\";\nimport type * as React from \"react\";\nimport {\n\tInputGroup,\n\tInputGroupAddon,\n\tInputGroupButton,\n\tInputGroupInput,\n} from \"./input-group\";\nimport { cn } from \"./lib/cn\";\nimport {\n\ttype ComponentSize,\n\tSizeProvider,\n\tuseComponentSize,\n} from \"./size-context\";\n\nconst numberInputFormatPresets = {\n\tcompact: {\n\t\tcompactDisplay: \"short\",\n\t\tnotation: \"compact\",\n\t},\n\tcurrencyNgn: {\n\t\tcurrency: \"NGN\",\n\t\tcurrencyDisplay: \"narrowSymbol\",\n\t\tstyle: \"currency\",\n\t},\n\tdecimal: {\n\t\tuseGrouping: true,\n\t},\n\tinteger: {\n\t\tmaximumFractionDigits: 0,\n\t\tuseGrouping: true,\n\t},\n\tpercent: {\n\t\tstyle: \"percent\",\n\t},\n\tplain: {\n\t\tuseGrouping: false,\n\t},\n} satisfies Record<string, Intl.NumberFormatOptions>;\n\ntype NumberInputFormatPreset = keyof typeof numberInputFormatPresets;\n\ntype NumberInputProps = Omit<NumberFieldRootProps, \"format\"> & {\n\tchildren?: React.ReactNode;\n\tformat?: Intl.NumberFormatOptions;\n\tformatPreset?: NumberInputFormatPreset;\n\tplaceholder?: string;\n\tsize?: ComponentSize;\n\tthousandSeparator?: boolean;\n};\n\nfunction NumberInput({\n\tchildren,\n\tformat,\n\tformatPreset,\n\tplaceholder,\n\tsize,\n\tthousandSeparator,\n\t...props\n}: NumberInputProps) {\n\tconst resolvedSize = useComponentSize(size);\n\tconst resolvedFormat =\n\t\tformat ??\n\t\t(formatPreset ? numberInputFormatPresets[formatPreset] : undefined) ??\n\t\t(thousandSeparator ? numberInputFormatPresets.decimal : undefined);\n\n\treturn (\n\t\t<SizeProvider size={resolvedSize}>\n\t\t\t<NumberField.Root format={resolvedFormat} {...props}>\n\t\t\t\t<NumberField.Group render={<InputGroup />}>\n\t\t\t\t\t<NumberField.Input\n\t\t\t\t\t\tplaceholder={placeholder}\n\t\t\t\t\t\trender={<InputGroupInput />}\n\t\t\t\t\t/>\n\t\t\t\t\t{children}\n\t\t\t\t</NumberField.Group>\n\t\t\t</NumberField.Root>\n\t\t</SizeProvider>\n\t);\n}\n\nfunction NumberInputControl() {\n\tconst size = useComponentSize();\n\treturn (\n\t\t<InputGroupAddon\n\t\t\talign=\"inline-end\"\n\t\t\tclassName={cn(\n\t\t\t\t\"flex gap-0 flex-col h-[calc(100%-2px)] w-10 overflow-hidden rounded-r-full p-0! pr-1.5!\",\n\t\t\t\tsize === \"lg\" && \"w-12\",\n\t\t\t)}\n\t\t>\n\t\t\t<NumberField.Increment\n\t\t\t\tclassName=\"w-full flex-1 rounded-none rounded-tr-full\"\n\t\t\t\trender={<InputGroupButton variant=\"tertiary\" />}\n\t\t\t>\n\t\t\t\t<PlusIcon\n\t\t\t\t\tclassName={cn(\"size-1.5\", {\n\t\t\t\t\t\t\"size-3\": size === \"md\",\n\t\t\t\t\t\t\"size-3.5\": size === \"lg\",\n\t\t\t\t\t})}\n\t\t\t\t/>\n\t\t\t</NumberField.Increment>\n\t\t\t<NumberField.Decrement\n\t\t\t\tclassName=\"w-full flex-1 rounded-none rounded-br-full\"\n\t\t\t\trender={<InputGroupButton variant=\"tertiary\" />}\n\t\t\t>\n\t\t\t\t<MinusIcon\n\t\t\t\t\tclassName={cn(\"size-1.5\", {\n\t\t\t\t\t\t\"size-3\": size === \"md\",\n\t\t\t\t\t\t\"size-3.5\": size === \"lg\",\n\t\t\t\t\t})}\n\t\t\t\t/>\n\t\t\t</NumberField.Decrement>\n\t\t</InputGroupAddon>\n\t);\n}\n\nexport {\n\tNumberInput,\n\tNumberInputControl,\n\tnumberInputFormatPresets,\n\ttype NumberInputFormatPreset,\n};\n"],"mappings":";;;;;;;;;;;;;;;;;;;AAAA;AAAA,EACC;AAAA,OAEM;AACP,SAAS,WAAW,gBAAgB;AAqEhC,SAA2B,KAA3B;AAtDJ,IAAM,2BAA2B;AAAA,EAChC,SAAS;AAAA,IACR,gBAAgB;AAAA,IAChB,UAAU;AAAA,EACX;AAAA,EACA,aAAa;AAAA,IACZ,UAAU;AAAA,IACV,iBAAiB;AAAA,IACjB,OAAO;AAAA,EACR;AAAA,EACA,SAAS;AAAA,IACR,aAAa;AAAA,EACd;AAAA,EACA,SAAS;AAAA,IACR,uBAAuB;AAAA,IACvB,aAAa;AAAA,EACd;AAAA,EACA,SAAS;AAAA,IACR,OAAO;AAAA,EACR;AAAA,EACA,OAAO;AAAA,IACN,aAAa;AAAA,EACd;AACD;AAaA,SAAS,YAAY;AAAA,EACpB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,GAAG;AACJ,GAAqB;AACpB,QAAM,eAAe,iBAAiB,IAAI;AAC1C,QAAM,iBACL,WACC,eAAe,yBAAyB,YAAY,IAAI,YACxD,oBAAoB,yBAAyB,UAAU;AAEzD,SACC,oBAAC,gBAAa,MAAM,cACnB,8BAAC,YAAY,MAAZ,EAAiB,QAAQ,gBAAiB,GAAG,OAC7C,+BAAC,YAAY,OAAZ,EAAkB,QAAQ,oBAAC,cAAW,GACtC;AAAA;AAAA,MAAC,YAAY;AAAA,MAAZ;AAAA,QACA;AAAA,QACA,QAAQ,oBAAC,mBAAgB;AAAA;AAAA,IAC1B;AAAA,IACC;AAAA,KACF,GACD,GACD;AAEF;AAEA,SAAS,qBAAqB;AAC7B,QAAM,OAAO,iBAAiB;AAC9B,SACC;AAAA,IAAC;AAAA;AAAA,MACA,OAAM;AAAA,MACN,WAAW;AAAA,QACV;AAAA,QACA,SAAS,QAAQ;AAAA,MAClB;AAAA,MAEA;AAAA;AAAA,UAAC,YAAY;AAAA,UAAZ;AAAA,YACA,WAAU;AAAA,YACV,QAAQ,oBAAC,oBAAiB,SAAQ,YAAW;AAAA,YAE7C;AAAA,cAAC;AAAA;AAAA,gBACA,WAAW,GAAG,YAAY;AAAA,kBACzB,UAAU,SAAS;AAAA,kBACnB,YAAY,SAAS;AAAA,gBACtB,CAAC;AAAA;AAAA,YACF;AAAA;AAAA,QACD;AAAA,QACA;AAAA,UAAC,YAAY;AAAA,UAAZ;AAAA,YACA,WAAU;AAAA,YACV,QAAQ,oBAAC,oBAAiB,SAAQ,YAAW;AAAA,YAE7C;AAAA,cAAC;AAAA;AAAA,gBACA,WAAW,GAAG,YAAY;AAAA,kBACzB,UAAU,SAAS;AAAA,kBACnB,YAAY,SAAS;AAAA,gBACtB,CAAC;AAAA;AAAA,YACF;AAAA;AAAA,QACD;AAAA;AAAA;AAAA,EACD;AAEF;","names":[]}
|
package/dist/page-header.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/page-header.tsx"],"sourcesContent":["import { cn } from \"./lib/cn\";\n\nfunction DashboardHeader({\n\tborder,\n\tclassName,\n\t...props\n}: React.ComponentProps<\"div\"> & {\n\tborder?: boolean;\n}) {\n\treturn (\n\t\t<div\n\t\t\tdata-slot=\"dashboard-header\"\n\t\t\tclassName={cn(\"flex flex-col gap-4\", className)}\n\t\t\t{...props}\n\t\t/>\n\t);\n}\n\nfunction DashboardHeaderGroup({\n\tclassName,\n\torientation = \"vertical\",\n\t...props\n}: React.ComponentProps<\"div\"> & { orientation?: \"horizontal\" | \"vertical\" }) {\n\treturn (\n\t\t<div\n\t\t\tdata-slot=\"dashboard-header-group\"\n\t\t\tclassName={cn(\n\t\t\t\t\"flex\",\n\t\t\t\torientation === \"horizontal\"\n\t\t\t\t\t? \"gap-4 md:gap-6 md:flex-row md:items-center\"\n\t\t\t\t\t: \"flex-col gap-2\",\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\t{...props}\n\t\t/>\n\t);\n}\n\nfunction DashboardHeaderTitle({\n\tclassName,\n\t...props\n}: React.ComponentProps<\"h1\">) {\n\treturn (\n\t\t<h1\n\t\t\tdata-slot=\"dashboard-header-title\"\n\t\t\tclassName={cn(\"text-gdt-h3\", className)}\n\t\t\t{...props}\n\t\t/>\n\t);\n}\n\nfunction DashboardHeaderDescription({\n\tclassName,\n\t...props\n}: React.ComponentProps<\"p\">) {\n\treturn (\n\t\t<p\n\t\t\tdata-slot=\"dashboard-header-description\"\n\t\t\tclassName={cn(\"text-gdt-sm text-fg-secondary\", className)}\n\t\t\t{...props}\n\t\t/>\n\t);\n}\n\nfunction DashboardHeaderActions({\n\tclassName,\n\t...props\n}: React.ComponentProps<\"div\">) {\n\treturn (\n\t\t<div\n\t\t\tdata-slot=\"dashboard-header-actions\"\n\t\t\tclassName={cn(\"flex flex-wrap items-center gap-2 md:gap-3\", className)}\n\t\t\t{...props}\n\t\t/>\n\t);\n}\n\n// function DashboardHeaderBreadcrumbs({}) {}\n\nexport {\n\tDashboardHeader,\n\tDashboardHeaderGroup,\n\tDashboardHeaderTitle,\n\tDashboardHeaderDescription,\n\tDashboardHeaderActions,\n};\n"],"mappings":";;;;;AAUE;AARF,SAAS,gBAAgB;AAAA,EACxB;AAAA,EACA;AAAA,EACA,GAAG;AACJ,GAEG;AACF,SACC;AAAA,IAAC;AAAA;AAAA,MACA,aAAU;AAAA,MACV,WAAW,GAAG,uBAAuB,SAAS;AAAA,MAC7C,GAAG;AAAA;AAAA,EACL;AAEF;AAEA,SAAS,qBAAqB;AAAA,EAC7B;AAAA,EACA,cAAc;AAAA,EACd,GAAG;AACJ,GAA8E;AAC7E,SACC;AAAA,IAAC;AAAA;AAAA,MACA,aAAU;AAAA,MACV,WAAW;AAAA,QACV;AAAA,QACA,gBAAgB,eACb,+CACA;AAAA,QACH;AAAA,MACD;AAAA,MACC,GAAG;AAAA;AAAA,EACL;AAEF;AAEA,SAAS,qBAAqB;AAAA,EAC7B;AAAA,EACA,GAAG;AACJ,GAA+B;AAC9B,SACC;AAAA,IAAC;AAAA;AAAA,MACA,aAAU;AAAA,MACV,WAAW,GAAG,eAAe,SAAS;AAAA,MACrC,GAAG;AAAA;AAAA,EACL;AAEF;AAEA,SAAS,2BAA2B;AAAA,EACnC;AAAA,EACA,GAAG;AACJ,GAA8B;AAC7B,SACC;AAAA,IAAC;AAAA;AAAA,MACA,aAAU;AAAA,MACV,WAAW,GAAG,iCAAiC,SAAS;AAAA,MACvD,GAAG;AAAA;AAAA,EACL;AAEF;AAEA,SAAS,uBAAuB;AAAA,EAC/B;AAAA,EACA,GAAG;AACJ,GAAgC;AAC/B,SACC;AAAA,IAAC;AAAA;AAAA,MACA,aAAU;AAAA,MACV,WAAW,GAAG,8CAA8C,SAAS;AAAA,MACpE,GAAG;AAAA;AAAA,EACL;AAEF;","names":[]}
|
package/dist/pagination.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/pagination.tsx"],"sourcesContent":["import { cva } from \"class-variance-authority\";\nimport {\n\tChevronLeftIcon,\n\tChevronRightIcon,\n\tMoreHorizontalIcon,\n} from \"lucide-react\";\nimport type * as React from \"react\";\nimport { Button, ButtonLink } from \"./button\";\nimport { cn } from \"./lib/cn\";\n\nfunction Pagination({ className, ...props }: React.ComponentProps<\"nav\">) {\n\treturn (\n\t\t<nav\n\t\t\taria-label=\"pagination\"\n\t\t\tdata-slot=\"pagination\"\n\t\t\tclassName={cn(\"mx-auto flex w-full justify-center\", className)}\n\t\t\t{...props}\n\t\t/>\n\t);\n}\n\nfunction PaginationContent({\n\tclassName,\n\t...props\n}: React.ComponentProps<\"ul\">) {\n\treturn (\n\t\t<ul\n\t\t\tdata-slot=\"pagination-content\"\n\t\t\tclassName={cn(\"flex flex-wrap items-center gap-2\", className)}\n\t\t\t{...props}\n\t\t/>\n\t);\n}\n\nfunction PaginationItem({ ...props }: React.ComponentProps<\"li\">) {\n\treturn <li data-slot=\"pagination-item\" {...props} />;\n}\n\nconst paginationTriggerVariants = cva(\n\t\"rounded-md font-medium shadow-none transition-[background-color,border-color,color] focus-visible:shadow-[0px_0px_0px_2px_var(--color-line-focus)]\",\n\t{\n\t\tvariants: {\n\t\t\tappearance: {\n\t\t\t\tpage: \"px-0\",\n\t\t\t\ticon: \"border border-line bg-transparent px-0 hover:border-line-strong\",\n\t\t\t\tcontrol: \"border border-line bg-transparent hover:border-line-strong\",\n\t\t\t},\n\t\t\tisActive: {\n\t\t\t\ttrue: \"\",\n\t\t\t\tfalse: \"\",\n\t\t\t},\n\t\t},\n\t\tcompoundVariants: [\n\t\t\t{\n\t\t\t\tappearance: \"page\",\n\t\t\t\tisActive: true,\n\t\t\t\tclassName:\n\t\t\t\t\t\"bg-action-primary text-fg-on-brand hover:bg-action-primary-hover active:bg-action-primary-pressed\",\n\t\t\t},\n\t\t\t{\n\t\t\t\tappearance: \"page\",\n\t\t\t\tisActive: false,\n\t\t\t\tclassName:\n\t\t\t\t\t\"bg-transparent text-fg-primary hover:bg-surface active:bg-surface-raised\",\n\t\t\t},\n\t\t\t{\n\t\t\t\tappearance: \"icon\",\n\t\t\t\tisActive: false,\n\t\t\t\tclassName: \"text-fg-primary hover:bg-surface active:bg-surface-raised\",\n\t\t\t},\n\t\t\t{\n\t\t\t\tappearance: \"control\",\n\t\t\t\tisActive: false,\n\t\t\t\tclassName: \"text-fg-primary hover:bg-surface active:bg-surface-raised\",\n\t\t\t},\n\t\t],\n\t\tdefaultVariants: {\n\t\t\tappearance: \"page\",\n\t\t\tisActive: false,\n\t\t},\n\t},\n);\n\ntype PaginationTriggerAppearance = \"page\" | \"icon\" | \"control\";\n\ntype PaginationLinkProps = {\n\tisActive?: boolean;\n\tappearance?: PaginationTriggerAppearance;\n\tpage: number;\n\tgetHref?: (page: number) => string;\n\thref?: string;\n} & Omit<React.ComponentProps<typeof ButtonLink>, \"href\" | \"size\" | \"variant\">;\n\nfunction PaginationLink({\n\tclassName,\n\tappearance = \"page\",\n\tgetHref,\n\thref,\n\tisActive,\n\tpage,\n\t...props\n}: PaginationLinkProps) {\n\tconst resolvedHref = href ?? getHref?.(page) ?? `?page=${page}`;\n\n\treturn (\n\t\t<ButtonLink\n\t\t\thref={resolvedHref}\n\t\t\tvariant={isActive && appearance === \"page\" ? \"primary\" : \"ghost\"}\n\t\t\tsize={appearance === \"control\" ? \"sm\" : \"icon-sm\"}\n\t\t\tclassName={cn(\n\t\t\t\tpaginationTriggerVariants({\n\t\t\t\t\tappearance,\n\t\t\t\t\tisActive: Boolean(isActive),\n\t\t\t\t}),\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\taria-current={isActive ? \"page\" : undefined}\n\t\t\tdata-slot=\"pagination-link\"\n\t\t\tdata-active={isActive}\n\t\t\tdata-appearance={appearance}\n\t\t\t{...props}\n\t\t/>\n\t);\n}\n\ntype PaginationButtonProps = {\n\tisActive?: boolean;\n\tappearance?: PaginationTriggerAppearance;\n\tpage: number;\n} & Omit<React.ComponentProps<typeof Button>, \"size\" | \"type\" | \"variant\">;\n\nfunction PaginationButton({\n\tclassName,\n\tappearance = \"page\",\n\tisActive,\n\tpage,\n\t...props\n}: PaginationButtonProps) {\n\treturn (\n\t\t<Button\n\t\t\ttype=\"button\"\n\t\t\tvariant={isActive && appearance === \"page\" ? \"primary\" : \"ghost\"}\n\t\t\tsize={appearance === \"control\" ? \"sm\" : \"icon-sm\"}\n\t\t\tclassName={cn(\n\t\t\t\tpaginationTriggerVariants({\n\t\t\t\t\tappearance,\n\t\t\t\t\tisActive: Boolean(isActive),\n\t\t\t\t}),\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\taria-current={isActive ? \"page\" : undefined}\n\t\t\tdata-slot=\"pagination-button\"\n\t\t\tdata-active={isActive}\n\t\t\tdata-appearance={appearance}\n\t\t\tdata-page={page}\n\t\t\t{...props}\n\t\t/>\n\t);\n}\n\nfunction PaginationPrevious({\n\tclassName,\n\tshowLabel = true,\n\ttext = \"Previous\",\n\t...props\n}: React.ComponentProps<typeof PaginationLink> & {\n\tshowLabel?: boolean;\n\ttext?: string;\n}) {\n\treturn (\n\t\t<PaginationLink\n\t\t\taria-label=\"Go to previous page\"\n\t\t\tappearance={showLabel ? \"control\" : \"icon\"}\n\t\t\tclassName={cn(showLabel ? \"pl-1.5!\" : \"\", className)}\n\t\t\t{...props}\n\t\t>\n\t\t\t<ChevronLeftIcon data-icon=\"inline-start\" className=\"cn-rtl-flip\" />\n\t\t\t{showLabel ? <span className=\"hidden sm:block\">{text}</span> : null}\n\t\t</PaginationLink>\n\t);\n}\n\nfunction PaginationNext({\n\tclassName,\n\tshowLabel = true,\n\ttext = \"Next\",\n\t...props\n}: React.ComponentProps<typeof PaginationLink> & {\n\tshowLabel?: boolean;\n\ttext?: string;\n}) {\n\treturn (\n\t\t<PaginationLink\n\t\t\taria-label=\"Go to next page\"\n\t\t\tappearance={showLabel ? \"control\" : \"icon\"}\n\t\t\tclassName={cn(showLabel ? \"pr-1.5!\" : \"\", className)}\n\t\t\t{...props}\n\t\t>\n\t\t\t{showLabel ? <span className=\"hidden sm:block\">{text}</span> : null}\n\t\t\t<ChevronRightIcon data-icon=\"inline-end\" className=\"cn-rtl-flip\" />\n\t\t</PaginationLink>\n\t);\n}\n\nfunction PaginationEllipsis({\n\tclassName,\n\t...props\n}: React.ComponentProps<\"span\">) {\n\treturn (\n\t\t<span\n\t\t\taria-hidden\n\t\t\tdata-slot=\"pagination-ellipsis\"\n\t\t\tclassName={cn(\n\t\t\t\t\"flex size-8 items-center justify-center text-fg-secondary [&_svg:not([class*='size-'])]:size-4\",\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\t{...props}\n\t\t>\n\t\t\t<MoreHorizontalIcon />\n\t\t\t<span className=\"sr-only\">More pages</span>\n\t\t</span>\n\t);\n}\n\nexport {\n\tPagination,\n\tPaginationContent,\n\tPaginationEllipsis,\n\tPaginationItem,\n\tPaginationButton,\n\tPaginationLink,\n\tPaginationNext,\n\tPaginationPrevious,\n};\n"],"mappings":"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","names":[]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/password-input.tsx"],"sourcesContent":["import { Eye, EyeOff } from \"lucide-react\";\nimport * as React from \"react\";\nimport {\n\tInputGroup,\n\tInputGroupAddon,\n\tInputGroupButton,\n\tInputGroupInput,\n} from \"./input-group\";\nimport { cn } from \"./lib/cn\";\n\nexport function PasswordInput({\n\tclassName,\n\tsize,\n\tdisabled,\n\treadOnly,\n\tautoComplete = \"current-password\",\n\t...props\n}: Omit<React.ComponentProps<typeof InputGroupInput>, \"type\">) {\n\tconst [showPassword, setShowPassword] = React.useState(false);\n\tconst inputType = showPassword ? \"text\" : \"password\";\n\n\treturn (\n\t\t<InputGroup size={size} className={cn(className)}>\n\t\t\t<InputGroupInput\n\t\t\t\ttype={inputType}\n\t\t\t\tautoComplete={autoComplete}\n\t\t\t\tdisabled={disabled}\n\t\t\t\treadOnly={readOnly}\n\t\t\t\t{...props}\n\t\t\t/>\n\t\t\t<InputGroupAddon align=\"inline-end\">\n\t\t\t\t<InputGroupButton\n\t\t\t\t\taria-label={showPassword ? \"Hide password\" : \"Show password\"}\n\t\t\t\t\taria-pressed={showPassword}\n\t\t\t\t\tdisabled={disabled || readOnly}\n\t\t\t\t\tsize=\"icon-xs\"\n\t\t\t\t\tonClick={() => setShowPassword((value) => !value)}\n\t\t\t\t\tonMouseDown={(event) => event.preventDefault()}\n\t\t\t\t>\n\t\t\t\t\t{showPassword ? (\n\t\t\t\t\t\t<EyeOff className=\"size-4\" />\n\t\t\t\t\t) : (\n\t\t\t\t\t\t<Eye className=\"size-4\" />\n\t\t\t\t\t)}\n\t\t\t\t</InputGroupButton>\n\t\t\t</InputGroupAddon>\n\t\t</InputGroup>\n\t);\n}\n"],"mappings":";;;;;;;;;;;;;;;;AAAA,SAAS,KAAK,cAAc;AAC5B,YAAY,WAAW;AAqBrB,SACC,KADD;AAZK,SAAS,cAAc;AAAA,EAC7B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,eAAe;AAAA,EACf,GAAG;AACJ,GAA+D;AAC9D,QAAM,CAAC,cAAc,eAAe,IAAU,eAAS,KAAK;AAC5D,QAAM,YAAY,eAAe,SAAS;AAE1C,SACC,qBAAC,cAAW,MAAY,WAAW,GAAG,SAAS,GAC9C;AAAA;AAAA,MAAC;AAAA;AAAA,QACA,MAAM;AAAA,QACN;AAAA,QACA;AAAA,QACA;AAAA,QACC,GAAG;AAAA;AAAA,IACL;AAAA,IACA,oBAAC,mBAAgB,OAAM,cACtB;AAAA,MAAC;AAAA;AAAA,QACA,cAAY,eAAe,kBAAkB;AAAA,QAC7C,gBAAc;AAAA,QACd,UAAU,YAAY;AAAA,QACtB,MAAK;AAAA,QACL,SAAS,MAAM,gBAAgB,CAAC,UAAU,CAAC,KAAK;AAAA,QAChD,aAAa,CAAC,UAAU,MAAM,eAAe;AAAA,QAE5C,yBACA,oBAAC,UAAO,WAAU,UAAS,IAE3B,oBAAC,OAAI,WAAU,UAAS;AAAA;AAAA,IAE1B,GACD;AAAA,KACD;AAEF;","names":[]}
|
package/dist/phone-input.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/phone-input.tsx"],"sourcesContent":["\"use client\";\n\nimport {\n\tAsYouType,\n\ttype CountryCode,\n\tgetCountries,\n\tgetCountryCallingCode,\n\tparsePhoneNumber,\n} from \"libphonenumber-js\";\nimport { CheckIcon, ChevronDownIcon, SearchIcon } from \"lucide-react\";\nimport * as React from \"react\";\nimport flags from \"react-phone-number-input/flags\";\nimport { InputGroup, InputGroupAddon, InputGroupInput } from \"./input-group\";\nimport { cn } from \"./lib/cn\";\nimport { Popover, PopoverContent, PopoverTrigger } from \"./popover\";\nimport { Separator } from \"./separator\";\nimport { type ComponentSize, useComponentSize } from \"./size-context\";\n\n// ─── Country data ─────────────────────────────────────────────────────────────\n\nconst regionNames =\n\ttypeof Intl !== \"undefined\" && \"DisplayNames\" in Intl\n\t\t? new Intl.DisplayNames([\"en\"], { type: \"region\" })\n\t\t: undefined;\n\ninterface CountryEntry {\n\tcode: CountryCode;\n\tname: string;\n\tcalling: string;\n}\n\nconst COUNTRIES: CountryEntry[] = getCountries()\n\t.map((code) => ({\n\t\tcode,\n\t\tname: regionNames?.of(code) ?? code,\n\t\tcalling: getCountryCallingCode(code),\n\t}))\n\t.sort((a, b) => a.name.localeCompare(b.name));\n\nfunction getNationalDigits(value: string): string {\n\treturn value.replace(/\\D/g, \"\");\n}\n\nfunction formatNational(digits: string, country: CountryCode): string {\n\tif (!digits) return \"\";\n\treturn new AsYouType(country).input(digits);\n}\n\nfunction toE164(digits: string, country: CountryCode): string | undefined {\n\tif (!digits) return undefined;\n\treturn `+${getCountryCallingCode(country)}${digits}`;\n}\n\nfunction parseValue(value: string | undefined): {\n\tcountry?: CountryCode;\n\tdigits: string;\n} {\n\tif (!value) return { digits: \"\" };\n\ttry {\n\t\tconst parsed = parsePhoneNumber(value);\n\t\tif (parsed?.nationalNumber) {\n\t\t\treturn { country: parsed.country, digits: parsed.nationalNumber };\n\t\t}\n\t} catch {\n\t\t// fall through to empty\n\t}\n\treturn { digits: \"\" };\n}\n\n// ─── Flag ─────────────────────────────────────────────────────────────────────\n\nconst flagSizeVariants: Record<ComponentSize, string> = {\n\tsm: \"h-3 w-[18px]\",\n\tmd: \"h-3.5 w-5\",\n\tlg: \"h-4 w-6\",\n};\n\nfunction CountryFlag({\n\tcountry,\n\tsize,\n\tclassName,\n}: {\n\tcountry: CountryCode;\n\tsize: ComponentSize;\n\tclassName?: string;\n}) {\n\tconst Flag = flags[country];\n\n\treturn (\n\t\t<span\n\t\t\tclassName={cn(\n\t\t\t\t\"inline-flex shrink-0 items-center justify-center overflow-hidden rounded-[3px] bg-surface-raised [&>svg]:h-full [&>svg]:w-full [&>svg]:object-cover\",\n\t\t\t\tflagSizeVariants[size],\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t>\n\t\t\t{Flag ? (\n\t\t\t\t<Flag title={country} />\n\t\t\t) : (\n\t\t\t\t<span className=\"text-gdt-xs text-fg-secondary\">{country}</span>\n\t\t\t)}\n\t\t</span>\n\t);\n}\n\n// ─── Country selector ─────────────────────────────────────────────────────────\n\n// Fixed row height so the list can be windowed. Matches `py-2` (16px) plus the\n// gdt-sm line-height (24px). Rows are pinned to this height to keep the math exact.\nconst ROW_HEIGHT = 40;\n// Vertical breathing room around the list, kept out of the row math via a spacer.\nconst LIST_PADDING = 6;\n// Extra rows rendered above/below the viewport to avoid blank edges while scrolling.\nconst OVERSCAN = 6;\n\n// Virtualized country list: only the rows near the viewport are mounted, so opening\n// the popover paints a handful of flag SVGs instead of ~250 at once.\nfunction CountryList({\n\titems,\n\tcountry,\n\tonSelect,\n}: {\n\titems: CountryEntry[];\n\tcountry: CountryCode;\n\tonSelect: (country: CountryCode) => void;\n}) {\n\tconst scrollRef = React.useRef<HTMLDivElement>(null);\n\tconst [viewport, setViewport] = React.useState(256);\n\tconst [scrollTop, setScrollTop] = React.useState(() => {\n\t\tconst index = items.findIndex((entry) => entry.code === country);\n\t\treturn index > 0 ? index * ROW_HEIGHT : 0;\n\t});\n\n\t// On mount, measure the real viewport height and scroll the selected row in.\n\t// biome-ignore lint/correctness/useExhaustiveDependencies: run once on mount to seed measurements.\n\tReact.useLayoutEffect(() => {\n\t\tconst el = scrollRef.current;\n\t\tif (!el) return;\n\t\tsetViewport(el.clientHeight);\n\t\tel.scrollTop = scrollTop;\n\t}, []);\n\n\tif (items.length === 0) {\n\t\treturn (\n\t\t\t<p className=\"px-3.5 py-6 text-center text-gdt-sm text-fg-secondary\">\n\t\t\t\tNo country found\n\t\t\t</p>\n\t\t);\n\t}\n\n\tconst total = items.length;\n\tconst first = Math.max(0, Math.floor(scrollTop / ROW_HEIGHT) - OVERSCAN);\n\tconst last = Math.min(\n\t\ttotal,\n\t\tMath.ceil((scrollTop + viewport) / ROW_HEIGHT) + OVERSCAN,\n\t);\n\tconst visible = items.slice(first, last);\n\n\treturn (\n\t\t<div\n\t\t\tref={scrollRef}\n\t\t\tonScroll={(event) => setScrollTop(event.currentTarget.scrollTop)}\n\t\t\tclassName=\"no-scrollbar max-h-64 overflow-y-auto\"\n\t\t>\n\t\t\t<div\n\t\t\t\tclassName=\"relative w-full\"\n\t\t\t\tstyle={{ height: total * ROW_HEIGHT + LIST_PADDING * 2 }}\n\t\t\t>\n\t\t\t\t{visible.map((entry, i) => {\n\t\t\t\t\tconst index = first + i;\n\t\t\t\t\tconst selected = entry.code === country;\n\t\t\t\t\treturn (\n\t\t\t\t\t\t<button\n\t\t\t\t\t\t\tkey={entry.code}\n\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t\tposition: \"absolute\",\n\t\t\t\t\t\t\t\ttop: index * ROW_HEIGHT + LIST_PADDING,\n\t\t\t\t\t\t\t\theight: ROW_HEIGHT,\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\tonClick={() => onSelect(entry.code)}\n\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\"flex w-full items-center gap-2.5 px-3.5 text-left text-gdt-sm outline-none transition-colors hover:bg-surface focus-visible:bg-surface\",\n\t\t\t\t\t\t\t\tselected ? \"font-medium text-fg-brand\" : \"text-fg-primary\",\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<CountryFlag country={entry.code} size=\"md\" />\n\t\t\t\t\t\t\t<span className=\"min-w-0 flex-1 truncate\">{entry.name}</span>\n\t\t\t\t\t\t\t<span className=\"shrink-0 text-fg-secondary\">\n\t\t\t\t\t\t\t\t+{entry.calling}\n\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t{selected && (\n\t\t\t\t\t\t\t\t<CheckIcon className=\"size-4 shrink-0 text-fg-brand\" />\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t</button>\n\t\t\t\t\t);\n\t\t\t\t})}\n\t\t\t</div>\n\t\t</div>\n\t);\n}\n\nfunction CountrySelect({\n\tcountry,\n\tsize,\n\tdisabled,\n\tonSelect,\n\tfinalFocusRef,\n}: {\n\tcountry: CountryCode;\n\tsize: ComponentSize;\n\tdisabled?: boolean;\n\tonSelect: (country: CountryCode) => void;\n\tfinalFocusRef: React.RefObject<HTMLInputElement | null>;\n}) {\n\tconst [open, setOpen] = React.useState(false);\n\tconst [query, setQuery] = React.useState(\"\");\n\tconst searchRef = React.useRef<HTMLInputElement>(null);\n\n\tconst filtered = React.useMemo(() => {\n\t\tconst q = query.trim().toLowerCase();\n\t\tif (!q) return COUNTRIES;\n\t\tconst normalized = q.replace(/^\\+/, \"\");\n\t\treturn COUNTRIES.filter(\n\t\t\t(entry) =>\n\t\t\t\tentry.name.toLowerCase().includes(q) ||\n\t\t\t\tentry.calling.includes(normalized) ||\n\t\t\t\tentry.code.toLowerCase().includes(q),\n\t\t);\n\t}, [query]);\n\n\tfunction handleOpenChange(next: boolean) {\n\t\tsetOpen(next);\n\t\tif (!next) setQuery(\"\");\n\t}\n\n\tfunction handleSelect(next: CountryCode) {\n\t\tonSelect(next);\n\t\thandleOpenChange(false);\n\t}\n\n\treturn (\n\t\t<Popover open={open} onOpenChange={handleOpenChange}>\n\t\t\t<PopoverTrigger\n\t\t\t\tdisabled={disabled}\n\t\t\t\tdata-slot=\"phone-country-trigger\"\n\t\t\t\tclassName={cn(\n\t\t\t\t\t\"flex shrink-0 items-center gap-1.5 rounded-full font-normal text-fg-primary outline-none transition-colors select-none\",\n\t\t\t\t\t\"focus-visible:text-fg-brand disabled:cursor-not-allowed disabled:text-fg-caption-placeholder\",\n\t\t\t\t\tsize === \"sm\" && \"text-gdt-xs\",\n\t\t\t\t\tsize === \"md\" && \"text-gdt-sm\",\n\t\t\t\t\tsize === \"lg\" && \"text-gdt-md\",\n\t\t\t\t)}\n\t\t\t>\n\t\t\t\t<CountryFlag country={country} size={size} />\n\t\t\t\t<span>+{getCountryCallingCode(country)}</span>\n\t\t\t\t<ChevronDownIcon\n\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\"text-fg-secondary transition-transform\",\n\t\t\t\t\t\topen && \"rotate-180\",\n\t\t\t\t\t\tsize === \"lg\" ? \"size-4\" : \"size-3.5\",\n\t\t\t\t\t)}\n\t\t\t\t/>\n\t\t\t</PopoverTrigger>\n\t\t\t<PopoverContent\n\t\t\t\tshowArrow={false}\n\t\t\t\talign=\"start\"\n\t\t\t\talignOffset={0}\n\t\t\t\tsideOffset={10}\n\t\t\t\t// Send focus to the phone field on every close — selection, Escape, or\n\t\t\t\t// outside click — instead of Base UI's default return-to-trigger.\n\t\t\t\tfinalFocus={finalFocusRef}\n\t\t\t\tclassName=\"w-72 gap-0 overflow-hidden p-0\"\n\t\t\t>\n\t\t\t\t<div className=\"flex items-center gap-2 border-b border-line-subtle px-3.5 py-2.5\">\n\t\t\t\t\t<SearchIcon className=\"size-4 shrink-0 text-fg-secondary\" />\n\t\t\t\t\t<input\n\t\t\t\t\t\tref={searchRef}\n\t\t\t\t\t\tvalue={query}\n\t\t\t\t\t\tonChange={(event) => setQuery(event.target.value)}\n\t\t\t\t\t\tplaceholder=\"Search country\"\n\t\t\t\t\t\tclassName=\"w-full bg-transparent text-gdt-sm text-fg-primary outline-none placeholder:text-fg-caption-placeholder\"\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t\t<CountryList\n\t\t\t\t\tkey={query}\n\t\t\t\t\titems={filtered}\n\t\t\t\t\tcountry={country}\n\t\t\t\t\tonSelect={handleSelect}\n\t\t\t\t/>\n\t\t\t</PopoverContent>\n\t\t</Popover>\n\t);\n}\n\n// ─── PhoneInput ───────────────────────────────────────────────────────────────\n\ninterface PhoneInputProps {\n\tvalue?: string;\n\tonChange?: (value: string | undefined) => void;\n\tdefaultCountry?: CountryCode;\n\tsize?: ComponentSize;\n\tdisabled?: boolean;\n\treadOnly?: boolean;\n\tplaceholder?: string;\n\tclassName?: string;\n\tid?: string;\n\tname?: string;\n\tref?: React.Ref<HTMLInputElement>;\n\t\"aria-invalid\"?: boolean;\n}\n\nfunction PhoneInput({\n\tvalue,\n\tonChange,\n\tdefaultCountry = \"NG\",\n\tsize,\n\tdisabled = false,\n\treadOnly = false,\n\tplaceholder = \"(0000) 000-0000\",\n\tclassName,\n\tid,\n\tname,\n\tref,\n\t\"aria-invalid\": ariaInvalid,\n}: PhoneInputProps) {\n\tconst resolvedSize = useComponentSize(size);\n\n\t// Track the underlying input so the country selector can return focus to it\n\t// on close, while still forwarding it to a caller-supplied `ref`.\n\tconst inputRef = React.useRef<HTMLInputElement | null>(null);\n\tconst setInputRef = React.useCallback(\n\t\t(node: HTMLInputElement | null) => {\n\t\t\tinputRef.current = node;\n\t\t\tif (typeof ref === \"function\") ref(node);\n\t\t\telse if (ref) ref.current = node;\n\t\t},\n\t\t[ref],\n\t);\n\n\t// biome-ignore lint/correctness/useExhaustiveDependencies: seed once from the initial value; later updates flow through the sync effect below.\n\tconst initial = React.useMemo(() => parseValue(value), []);\n\tconst [country, setCountry] = React.useState<CountryCode>(\n\t\tinitial.country ?? defaultCountry,\n\t);\n\tconst [national, setNational] = React.useState(() =>\n\t\tformatNational(initial.digits, initial.country ?? defaultCountry),\n\t);\n\n\t// Keep internal state in sync when `value` is changed from outside.\n\t// biome-ignore lint/correctness/useExhaustiveDependencies: only re-sync when the external `value` changes, not on internal edits.\n\tReact.useEffect(() => {\n\t\tconst currentDigits = getNationalDigits(national);\n\t\tif (toE164(currentDigits, country) === value) return;\n\n\t\tconst next = parseValue(value);\n\t\tconst nextCountry = next.country ?? country;\n\t\tsetCountry(nextCountry);\n\t\tsetNational(formatNational(next.digits, nextCountry));\n\t}, [value]);\n\n\tfunction emit(digits: string, nextCountry: CountryCode) {\n\t\tonChange?.(toE164(digits, nextCountry));\n\t}\n\n\tfunction handleInputChange(event: React.ChangeEvent<HTMLInputElement>) {\n\t\tconst digits = getNationalDigits(event.target.value);\n\t\tsetNational(formatNational(digits, country));\n\t\temit(digits, country);\n\t}\n\n\tfunction handleCountrySelect(nextCountry: CountryCode) {\n\t\tconst digits = getNationalDigits(national);\n\t\tsetCountry(nextCountry);\n\t\tsetNational(formatNational(digits, nextCountry));\n\t\temit(digits, nextCountry);\n\t}\n\n\tconst dividerStateClasses = cn(\n\t\t\"group-hover/input-group:bg-line-strong\",\n\t\t\"group-focus-within/input-group:bg-line-focus\",\n\t\t\"group-has-[[aria-invalid=true]]/input-group:bg-line-danger\",\n\t\t\"group-has-disabled/input-group:bg-line-subtle\",\n\t);\n\n\treturn (\n\t\t<InputGroup size={resolvedSize} className={className}>\n\t\t\t<InputGroupAddon align=\"inline-start\" className=\"gap-2 self-stretch py-0\">\n\t\t\t\t<CountrySelect\n\t\t\t\t\tcountry={country}\n\t\t\t\t\tsize={resolvedSize}\n\t\t\t\t\tdisabled={disabled}\n\t\t\t\t\tonSelect={handleCountrySelect}\n\t\t\t\t\tfinalFocusRef={inputRef}\n\t\t\t\t/>\n\t\t\t\t<Separator\n\t\t\t\t\torientation=\"vertical\"\n\t\t\t\t\tshade=\"deep\"\n\t\t\t\t\tclassName={cn(\"self-stretch transition-colors\", dividerStateClasses)}\n\t\t\t\t/>\n\t\t\t</InputGroupAddon>\n\t\t\t<InputGroupInput\n\t\t\t\tref={setInputRef}\n\t\t\t\tid={id}\n\t\t\t\tname={name}\n\t\t\t\ttype=\"tel\"\n\t\t\t\tinputMode=\"tel\"\n\t\t\t\tautoComplete=\"tel\"\n\t\t\t\tvalue={national}\n\t\t\t\tonChange={handleInputChange}\n\t\t\t\tplaceholder={placeholder}\n\t\t\t\tdisabled={disabled}\n\t\t\t\treadOnly={readOnly}\n\t\t\t\taria-invalid={ariaInvalid || undefined}\n\t\t\t\tclassName=\"pl-0\"\n\t\t\t/>\n\t\t</InputGroup>\n\t);\n}\n\nexport { PhoneInput };\nexport type { PhoneInputProps, CountryCode };\n"],"mappings":"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","names":[]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/photo-gallery.tsx"],"sourcesContent":["\"use client\";\n\nimport { Dialog as DialogPrimitive } from \"@base-ui/react/dialog\";\nimport {\n\tChevronLeftIcon,\n\tChevronRightIcon,\n\tFullscreen,\n\tXIcon,\n} from \"lucide-react\";\nimport type { SVGProps } from \"react\";\nimport * as React from \"react\";\nimport { Button } from \"./button\";\nimport {\n\tCarousel,\n\ttype CarouselApi,\n\tCarouselContent,\n\tCarouselItem,\n} from \"./carousel\";\nimport { cn } from \"./lib/cn\";\n\n/**\n * A single property photo. `src` is optional so the gallery can render a\n * \"Property Image\" placeholder in previews / while imagery is still loading.\n */\ntype PhotoGalleryImage = {\n\tsrc?: string;\n\talt?: string;\n};\n\n/**\n * Wires an Embla carousel to a controlled/uncontrolled active index. Returns\n * the `setApi` to hand to {@link Carousel} plus the live index and navigation\n * helpers. Both surfaces share this so the inline carousel and the fullscreen\n * viewer can stand alone — or stay in sync by sharing `index`/`onIndexChange`.\n */\nfunction useGalleryCarousel(\n\tindex: number | undefined,\n\tonIndexChange: ((index: number) => void) | undefined,\n) {\n\tconst [api, setApi] = React.useState<CarouselApi>();\n\tconst [selectedIndex, setSelectedIndex] = React.useState(index ?? 0);\n\tconst initialIndexRef = React.useRef(index ?? 0);\n\n\t// Keep the change callback in a ref so subscribing doesn't depend on a\n\t// caller passing a stable function identity.\n\tconst onIndexChangeRef = React.useRef(onIndexChange);\n\tReact.useEffect(() => {\n\t\tonIndexChangeRef.current = onIndexChange;\n\t});\n\n\tReact.useEffect(() => {\n\t\tif (!api) return;\n\t\tconst onSelect = () => {\n\t\t\tconst next = api.selectedScrollSnap();\n\t\t\tsetSelectedIndex(next);\n\t\t\tonIndexChangeRef.current?.(next);\n\t\t};\n\t\tonSelect();\n\t\tapi.on(\"select\", onSelect).on(\"reInit\", onSelect);\n\t\treturn () => {\n\t\t\tapi.off(\"select\", onSelect).off(\"reInit\", onSelect);\n\t\t};\n\t}, [api]);\n\n\t// Controlled mode: follow the index the parent hands down.\n\tReact.useEffect(() => {\n\t\tif (api && index !== undefined && index !== api.selectedScrollSnap()) {\n\t\t\tapi.scrollTo(index, false);\n\t\t}\n\t}, [api, index]);\n\n\tconst scrollTo = React.useCallback(\n\t\t(i: number) => api?.scrollTo(i, false),\n\t\t[api],\n\t);\n\tconst scrollPrev = React.useCallback(() => api?.scrollPrev(false), [api]);\n\tconst scrollNext = React.useCallback(() => api?.scrollNext(false), [api]);\n\n\treturn {\n\t\tsetApi,\n\t\tselectedIndex,\n\t\tinitialIndex: initialIndexRef.current,\n\t\tscrollTo,\n\t\tscrollPrev,\n\t\tscrollNext,\n\t};\n}\n\n/* -------------------------------------------------------------------------- */\n/* Shared chrome */\n/* -------------------------------------------------------------------------- */\n\n/**\n * The image surface. Centres its image within the slide; falls back to a\n * \"Property Image\" label when `src` is missing. `cover` fills and crops the\n * frame for the listing hero; `contain` clamps the photo to the frame's bounds\n * (`max-w`/`max-h`) so the whole image stays visible — never overflowing the\n * fullscreen viewer's chrome and never stretched out of its aspect ratio.\n */\nfunction GalleryFrame({\n\timage,\n\tfit = \"cover\",\n\tclassName,\n}: {\n\timage: PhotoGalleryImage | undefined;\n\tfit?: \"cover\" | \"contain\";\n\tclassName?: string;\n}) {\n\treturn (\n\t\t<div\n\t\t\tdata-slot=\"photo-gallery-frame\"\n\t\t\tclassName={cn(\n\t\t\t\t\"relative flex size-full items-center justify-center overflow-hidden\",\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t>\n\t\t\t{image?.src ? (\n\t\t\t\t<img\n\t\t\t\t\tsrc={image.src}\n\t\t\t\t\talt={image.alt ?? \"Property image\"}\n\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\tfit === \"contain\"\n\t\t\t\t\t\t\t? \"max-h-full max-w-full rounded-lg object-contain\"\n\t\t\t\t\t\t\t: \"size-full object-cover\",\n\t\t\t\t\t)}\n\t\t\t\t\tdraggable={false}\n\t\t\t\t/>\n\t\t\t) : (\n\t\t\t\t<span className=\"text-gdt-sm font-medium text-fg-caption-placeholder\">\n\t\t\t\t\tProperty Image\n\t\t\t\t</span>\n\t\t\t)}\n\t\t</div>\n\t);\n}\n\nconst Images = (props: SVGProps<SVGSVGElement>) => (\n\t<svg\n\t\taria-hidden=\"true\"\n\t\txmlns=\"http://www.w3.org/2000/svg\"\n\t\twidth={15}\n\t\theight={16}\n\t\tviewBox=\"0 0 15 16\"\n\t\tfill=\"none\"\n\t\t{...props}\n\t>\n\t\t<path\n\t\t\tfill=\"currentColor\"\n\t\t\td=\"M6.72 14.332c-.705 0-1.38-.3-1.878-.83a2.935 2.935 0 0 1-.779-2.003V2.012l-3.02.738c-.36.102-.667.353-.853.697a1.587 1.587 0 0 0-.143 1.136l2.589 10.309c.083.318.261.598.507.798.246.2.546.309.856.31.115 0 .233-.015.349-.048l6.3-1.62H6.72ZM8.125 6c.69 0 1.25-.597 1.25-1.333 0-.735-.56-1.333-1.25-1.333s-1.25.598-1.25 1.333c0 .736.56 1.333 1.25 1.333Z\"\n\t\t/>\n\t\t<path\n\t\t\tfill=\"currentColor\"\n\t\t\td=\"M15 2a2.07 2.07 0 0 0-.55-1.414A1.818 1.818 0 0 0 13.126 0h-6.25C6.376 0 5.9.21 5.547.586A2.07 2.07 0 0 0 4.998 2v9.332c0 .53.198 1.04.55 1.414.352.375.829.586 1.326.586h6.25c.498 0 .975-.21 1.327-.586.351-.375.549-.883.549-1.414V2Zm-8.126-.667h6.25c.166 0 .325.07.443.195A.69.69 0 0 1 13.75 2v4.292l-.475-.507a1.094 1.094 0 0 0-.356-.253 1.037 1.037 0 0 0-.839 0 1.094 1.094 0 0 0-.355.253L8.749 8.96l-.787-.84a1.094 1.094 0 0 0-.356-.254 1.037 1.037 0 0 0-.839 0 1.094 1.094 0 0 0-.355.254l-.163.173V2a.69.69 0 0 1 .183-.472.606.606 0 0 1 .442-.195Z\"\n\t\t/>\n\t</svg>\n);\n\n/** Pill overlay showing `current / total`. Hidden when there is one image. */\nfunction GalleryCounter({\n\tcurrent,\n\ttotal,\n\tclassName,\n}: {\n\tcurrent: number;\n\ttotal: number;\n\tclassName?: string;\n}) {\n\tif (total <= 1) return null;\n\n\treturn (\n\t\t<div\n\t\t\tdata-slot=\"photo-gallery-counter\"\n\t\t\tclassName={cn(\n\t\t\t\t\"pointer-events-none absolute z-10 inline-flex items-center gap-1.5 rounded-full border border-line bg-surface-overlay px-2.5 py-1 text-gdt-xs font-bold text-fg-primary shadow-2\",\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t>\n\t\t\t<Images aria-hidden=\"true\" className=\"size-3.5\" />\n\t\t\t<span>\n\t\t\t\t{current} / {total}\n\t\t\t</span>\n\t\t</div>\n\t);\n}\n\nfunction GalleryButton({\n\tclassName,\n\tvariant = \"ghost\",\n\t...rest\n}: React.ComponentProps<typeof Button>) {\n\treturn (\n\t\t<Button\n\t\t\tsize=\"icon\"\n\t\t\tclassName={cn(\n\t\t\t\t\"border border-line bg-surface-overlay text-fg-primary shadow-2 transition-[background-color] outline-none hover:bg-surface-raised focus-visible:border-line-focus focus-visible:shadow-[0px_0px_0px_2px_var(--color-line-focus)] size-9 sm:size-11\",\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\tvariant={variant}\n\t\t\t{...rest}\n\t\t/>\n\t);\n}\n\n/** Circular floating navigation button. Always present; the track loops. */\nfunction GalleryArrow({\n\tside,\n\tonClick,\n\tclassName,\n}: {\n\tside: \"prev\" | \"next\";\n\tonClick: () => void;\n\tclassName?: string;\n}) {\n\tconst Icon = side === \"prev\" ? ChevronLeftIcon : ChevronRightIcon;\n\treturn (\n\t\t<GalleryButton\n\t\t\ttype=\"button\"\n\t\t\tdata-slot={`photo-gallery-${side}`}\n\t\t\taria-label={side === \"prev\" ? \"Previous photo\" : \"Next photo\"}\n\t\t\tonClick={(event) => {\n\t\t\t\tevent.stopPropagation();\n\t\t\t\tonClick();\n\t\t\t}}\n\t\t\tclassName={cn(\n\t\t\t\t\"absolute top-1/2 z-10 grid -translate-y-1/2 place-items-center active:not-aria-[haspopup]:-translate-y-1/2\",\n\t\t\t\tside === \"prev\" ? \"left-2 sm:left-4\" : \"right-2 sm:right-4\",\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t>\n\t\t\t<Icon className=\"cn-rtl-flip size-4 sm:size-5\" />\n\t\t</GalleryButton>\n\t);\n}\n\n/**\n * Equal-sized thumbnail strip. `cols` are sized via CSS vars so exactly N fill\n * the width (5 on mobile, more on web); extras overflow and scroll. The active\n * thumb gets a 2px focus stroke and is kept in view as the index changes.\n */\nfunction GalleryThumbnails({\n\timages,\n\tselectedIndex,\n\tonSelect,\n\tcolsClassName,\n\tclassName,\n}: {\n\timages: PhotoGalleryImage[];\n\tselectedIndex: number;\n\tonSelect: (index: number) => void;\n\tcolsClassName: string;\n\tclassName?: string;\n}) {\n\tconst containerRef = React.useRef<HTMLDivElement>(null);\n\tconst hasPositionedRef = React.useRef(false);\n\tconst [overflowing, setOverflowing] = React.useState(false);\n\n\t// Track whether the strip is wider than its container so it can be centred\n\t// while every thumb fits, and only switch to a scrollable, start-aligned\n\t// strip once they overflow (centring an overflowing scroller clips the\n\t// leading thumbs out of reach).\n\tReact.useEffect(() => {\n\t\tconst el = containerRef.current;\n\t\tif (!el) return;\n\t\tconst update = () => setOverflowing(el.scrollWidth > el.clientWidth + 1);\n\t\tupdate();\n\t\tconst observer = new ResizeObserver(update);\n\t\tobserver.observe(el);\n\t\treturn () => observer.disconnect();\n\t}, []);\n\n\tReact.useEffect(() => {\n\t\tconst active = containerRef.current?.children[selectedIndex];\n\t\tif (!active) return;\n\t\t// Jump instantly the first time (e.g. when the viewer opens on a non-zero\n\t\t// index) so the current thumb is already in view without a visible scroll;\n\t\t// animate on subsequent navigation.\n\t\tactive.scrollIntoView({\n\t\t\tbehavior: hasPositionedRef.current ? \"smooth\" : \"auto\",\n\t\t\tinline: \"center\",\n\t\t\tblock: \"nearest\",\n\t\t});\n\t\thasPositionedRef.current = true;\n\t}, [selectedIndex]);\n\n\tif (images.length <= 1) return null;\n\n\treturn (\n\t\t<div\n\t\t\tref={containerRef}\n\t\t\tdata-slot=\"photo-gallery-thumbnails\"\n\t\t\tclassName={cn(\n\t\t\t\t\"flex gap-2 overflow-x-auto [--gallery-gap:0.5rem] scrollbar-none [&::-webkit-scrollbar]:hidden\",\n\t\t\t\toverflowing ? \"justify-start\" : \"justify-center\",\n\t\t\t\tcolsClassName,\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t>\n\t\t\t{images.map((image, index) => {\n\t\t\t\tconst isActive = index === selectedIndex;\n\t\t\t\treturn (\n\t\t\t\t\t<button\n\t\t\t\t\t\t// biome-ignore lint/suspicious/noArrayIndexKey: photos are a fixed, ordered list that never reorders, so the index is the stable identity.\n\t\t\t\t\t\tkey={index}\n\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\taria-label={`View photo ${index + 1}`}\n\t\t\t\t\t\taria-current={isActive}\n\t\t\t\t\t\tonClick={() => onSelect(index)}\n\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\twidth:\n\t\t\t\t\t\t\t\t\"calc((100% - (var(--gallery-cols) - 1) * var(--gallery-gap)) / var(--gallery-cols))\",\n\t\t\t\t\t\t}}\n\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\"relative aspect-4/3 shrink-0 overflow-hidden rounded-lg border-2 bg-surface-raised transition-[border-color,opacity] outline-none focus-visible:border-line-focus focus-visible:shadow-[0px_0px_0px_2px_var(--color-line-focus)]\",\n\t\t\t\t\t\t\tisActive\n\t\t\t\t\t\t\t\t? \"border-line-focus\"\n\t\t\t\t\t\t\t\t: \"border-transparent opacity-80 hover:opacity-100\",\n\t\t\t\t\t\t)}\n\t\t\t\t\t>\n\t\t\t\t\t\t{image.src ? (\n\t\t\t\t\t\t\t<img\n\t\t\t\t\t\t\t\tsrc={image.src}\n\t\t\t\t\t\t\t\talt={image.alt ?? `Property image ${index + 1}`}\n\t\t\t\t\t\t\t\tclassName=\"size-full object-cover\"\n\t\t\t\t\t\t\t\tdraggable={false}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t) : null}\n\t\t\t\t\t</button>\n\t\t\t\t);\n\t\t\t})}\n\t\t</div>\n\t);\n}\n\n/* -------------------------------------------------------------------------- */\n/* Inline carousel */\n/* -------------------------------------------------------------------------- */\n\ntype PhotoGalleryProps = Omit<React.ComponentProps<\"div\">, \"onClick\"> & {\n\timages: PhotoGalleryImage[];\n\t/** Controlled active index. Omit to let the gallery manage it internally. */\n\tindex?: number;\n\tonIndexChange?: (index: number) => void;\n\t/** Called when the hero image is activated — wire this to open fullscreen. */\n\tonImageClick?: (index: number) => void;\n};\n\n/**\n * Inline property gallery: a swipeable hero image (drag / touch / ← →) with a\n * counter pill, navigation arrows, and a thumbnail strip below. Built on\n * {@link Carousel}. Standalone — pass `onImageClick` to open it into a\n * {@link PhotoGalleryFullscreen} viewer, but neither surface needs the other.\n */\nfunction PhotoGallery({\n\timages,\n\tindex,\n\tonIndexChange,\n\tonImageClick,\n\tclassName,\n\t...props\n}: PhotoGalleryProps) {\n\tconst {\n\t\tsetApi,\n\t\tselectedIndex,\n\t\tinitialIndex,\n\t\tscrollTo,\n\t\tscrollPrev,\n\t\tscrollNext,\n\t} = useGalleryCarousel(index, onIndexChange);\n\tconst hasMany = images.length > 1;\n\n\treturn (\n\t\t<div\n\t\t\tdata-slot=\"photo-gallery\"\n\t\t\tclassName={cn(\n\t\t\t\t\"flex w-full flex-col gap-3 rounded-2xl border border-line bg-surface p-3\",\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\t{...props}\n\t\t>\n\t\t\t<Carousel\n\t\t\t\timageSize=\"full\"\n\t\t\t\tsetApi={setApi}\n\t\t\t\topts={{ loop: true, startIndex: initialIndex, watchDrag: hasMany }}\n\t\t\t\tclassName=\"aspect-video rounded-xl bg-surface-raised\"\n\t\t\t>\n\t\t\t\t<CarouselContent>\n\t\t\t\t\t{images.map((image, i) => (\n\t\t\t\t\t\t<CarouselItem\n\t\t\t\t\t\t\t// biome-ignore lint/suspicious/noArrayIndexKey: photos are a fixed, ordered list that never reorders, so the index is the stable identity.\n\t\t\t\t\t\t\tkey={i}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<GalleryFrame image={image} />\n\t\t\t\t\t\t</CarouselItem>\n\t\t\t\t\t))}\n\t\t\t\t</CarouselContent>\n\t\t\t\t{onImageClick && (\n\t\t\t\t\t<GalleryButton\n\t\t\t\t\t\tclassName=\"absolute bottom-2 right-2 sm:bottom-4 sm:right-4\"\n\t\t\t\t\t\tonClick={() => onImageClick(selectedIndex)}\n\t\t\t\t\t>\n\t\t\t\t\t\t<Fullscreen className=\"size-4 md:size-5\" />\n\t\t\t\t\t</GalleryButton>\n\t\t\t\t)}\n\n\t\t\t\t<GalleryCounter\n\t\t\t\t\tcurrent={selectedIndex + 1}\n\t\t\t\t\ttotal={images.length}\n\t\t\t\t\tclassName=\"top-2 right-2 sm:top-4 md:right-4\"\n\t\t\t\t/>\n\t\t\t\t{hasMany && (\n\t\t\t\t\t<>\n\t\t\t\t\t\t<GalleryArrow side=\"prev\" onClick={scrollPrev} />\n\t\t\t\t\t\t<GalleryArrow side=\"next\" onClick={scrollNext} />\n\t\t\t\t\t</>\n\t\t\t\t)}\n\t\t\t</Carousel>\n\n\t\t\t<GalleryThumbnails\n\t\t\t\timages={images}\n\t\t\t\tselectedIndex={selectedIndex}\n\t\t\t\tonSelect={scrollTo}\n\t\t\t\tcolsClassName=\"[--gallery-cols:5] sm:[--gallery-cols:8]\"\n\t\t\t/>\n\t\t</div>\n\t);\n}\n\n/* -------------------------------------------------------------------------- */\n/* Fullscreen viewer */\n/* -------------------------------------------------------------------------- */\n\ntype PhotoGalleryFullscreenProps = {\n\timages: PhotoGalleryImage[];\n\topen: boolean;\n\tonOpenChange: (open: boolean) => void;\n\t/** Controlled active index. Omit to let the viewer manage it internally. */\n\tindex?: number;\n\tonIndexChange?: (index: number) => void;\n};\n\n/**\n * Fullscreen lightbox: takes over the viewport over a dimmed backdrop for\n * distraction-free browsing. Swipeable (drag / touch) with ← → key navigation\n * and ESC to close. Built on {@link Carousel}; controlled via `open` /\n * `onOpenChange` and usable without the inline gallery.\n */\nfunction PhotoGalleryFullscreen({\n\timages,\n\topen,\n\tonOpenChange,\n\tindex,\n\tonIndexChange,\n}: PhotoGalleryFullscreenProps) {\n\tconst {\n\t\tsetApi,\n\t\tselectedIndex,\n\t\tinitialIndex,\n\t\tscrollTo,\n\t\tscrollPrev,\n\t\tscrollNext,\n\t} = useGalleryCarousel(index, onIndexChange);\n\tconst hasMany = images.length > 1;\n\n\tconst handleKeyDown = (event: React.KeyboardEvent<HTMLDivElement>) => {\n\t\t// The carousel handles arrows in the capture phase when it holds focus;\n\t\t// skip so focus inside the track doesn't navigate twice.\n\t\tif (event.defaultPrevented) return;\n\t\tif (event.key === \"ArrowLeft\") {\n\t\t\tevent.preventDefault();\n\t\t\tscrollPrev();\n\t\t} else if (event.key === \"ArrowRight\") {\n\t\t\tevent.preventDefault();\n\t\t\tscrollNext();\n\t\t}\n\t};\n\n\treturn (\n\t\t<DialogPrimitive.Root open={open} onOpenChange={onOpenChange}>\n\t\t\t<DialogPrimitive.Portal>\n\t\t\t\t<DialogPrimitive.Backdrop\n\t\t\t\t\tdata-slot=\"photo-gallery-fullscreen-backdrop\"\n\t\t\t\t\tclassName=\"fixed inset-0 z-50 bg-black/90 transition-opacity duration-150 data-closed:opacity-0 data-open:opacity-100\"\n\t\t\t\t/>\n\t\t\t\t<DialogPrimitive.Popup\n\t\t\t\t\tdata-slot=\"photo-gallery-fullscreen\"\n\t\t\t\t\tonKeyDown={handleKeyDown}\n\t\t\t\t\tclassName=\"fixed inset-0 z-50 flex flex-col gap-4 p-4 sm:p-6 xl:p-8 outline-none transition-opacity duration-150 data-closed:opacity-0 data-open:opacity-100\"\n\t\t\t\t>\n\t\t\t\t\t<DialogPrimitive.Title className=\"sr-only\">\n\t\t\t\t\t\tPhoto Gallery\n\t\t\t\t\t</DialogPrimitive.Title>\n\n\t\t\t\t\t<div className=\"w-full flex items-center justify-between\">\n\t\t\t\t\t\t<GalleryCounter\n\t\t\t\t\t\t\tcurrent={selectedIndex + 1}\n\t\t\t\t\t\t\ttotal={images.length}\n\t\t\t\t\t\t\tclassName=\"static\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t\t<DialogPrimitive.Close\n\t\t\t\t\t\t\tdata-slot=\"photo-gallery-fullscreen-close\"\n\t\t\t\t\t\t\taria-label=\"Close gallery\"\n\t\t\t\t\t\t\trender={<GalleryButton />}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<XIcon className=\"size-4 sm:size-5\" />\n\t\t\t\t\t\t</DialogPrimitive.Close>\n\t\t\t\t\t</div>\n\n\t\t\t\t\t<Carousel\n\t\t\t\t\t\timageSize=\"full\"\n\t\t\t\t\t\tsetApi={setApi}\n\t\t\t\t\t\topts={{ loop: true, startIndex: initialIndex, watchDrag: hasMany }}\n\t\t\t\t\t\tclassName=\"min-h-0 flex-1 w-full rounded-xl bg-transparent\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<CarouselContent className=\"items-center\">\n\t\t\t\t\t\t\t{images.map((image, i) => (\n\t\t\t\t\t\t\t\t<CarouselItem\n\t\t\t\t\t\t\t\t\t// biome-ignore lint/suspicious/noArrayIndexKey: photos are a fixed, ordered list that never reorders, so the index is the stable identity.\n\t\t\t\t\t\t\t\t\tkey={i}\n\t\t\t\t\t\t\t\t\tclassName=\"h-full\"\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t<GalleryFrame image={image} fit=\"contain\" />\n\t\t\t\t\t\t\t\t</CarouselItem>\n\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t</CarouselContent>\n\t\t\t\t\t\t{hasMany && (\n\t\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t\t<GalleryArrow\n\t\t\t\t\t\t\t\t\tside=\"prev\"\n\t\t\t\t\t\t\t\t\tonClick={scrollPrev}\n\t\t\t\t\t\t\t\t\tclassName=\"left-0!\"\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t<GalleryArrow\n\t\t\t\t\t\t\t\t\tside=\"next\"\n\t\t\t\t\t\t\t\t\tonClick={scrollNext}\n\t\t\t\t\t\t\t\t\tclassName=\"right-0!\"\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t</>\n\t\t\t\t\t\t)}\n\t\t\t\t\t</Carousel>\n\n\t\t\t\t\t{hasMany && (\n\t\t\t\t\t\t<div className=\"flex flex-col gap-3\">\n\t\t\t\t\t\t\t<p className=\"hidden text-center text-gdt-xs text-fg-secondary sm:block\">\n\t\t\t\t\t\t\t\t← → to navigate · ESC to close\n\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t<GalleryThumbnails\n\t\t\t\t\t\t\t\timages={images}\n\t\t\t\t\t\t\t\tselectedIndex={selectedIndex}\n\t\t\t\t\t\t\t\tonSelect={scrollTo}\n\t\t\t\t\t\t\t\tcolsClassName=\"[--gallery-cols:5] sm:[--gallery-cols:10]\"\n\t\t\t\t\t\t\t\tclassName=\"mx-auto w-full max-w-3xl\"\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t)}\n\t\t\t\t</DialogPrimitive.Popup>\n\t\t\t</DialogPrimitive.Portal>\n\t\t</DialogPrimitive.Root>\n\t);\n}\n\nexport {\n\ttype PhotoGalleryImage,\n\ttype PhotoGalleryProps,\n\ttype PhotoGalleryFullscreenProps,\n\tPhotoGallery,\n\tPhotoGalleryFullscreen,\n};\n"],"mappings":"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","names":[]}
|
package/dist/pie-chart.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/pie-chart.tsx"],"sourcesContent":["\"use client\";\n\nimport { cva } from \"class-variance-authority\";\nimport type * as React from \"react\";\nimport { cn } from \"./lib/cn\";\nimport { type ComponentSize, useComponentSize } from \"./size-context\";\n\n/**\n * Pie / donut charts are composed from recharts plot primitives directly —\n * recharts identifies `PieChart`, `Pie`, and `Cell` by component identity, so\n * they cannot be wrapped. This module supplies the giddaa-specific pieces that\n * would otherwise be copy-pasted: per-size layout numbers, a categorical\n * palette, the donut center label, and the rich legend (dot · name · value ·\n * percentage). Pair them with the shared frame from `./chart`.\n *\n * A donut keeps an open center for a total label (`innerRadius` > 0); a pie\n * fills the circle (`innerRadius={0}`). Both read the same layout.\n *\n * @example\n * const chart = usePieChartLayout({ size: \"md\", type: \"donut\" });\n * <ChartCard size=\"md\">\n * <div className=\"flex items-center gap-4\">\n * <ChartContainer config={config} {...chart.container}>\n * <PieChart>\n * <Pie data={data} dataKey=\"value\" nameKey=\"label\" {...chart.pie}>\n * {data.map((d) => <Cell key={d.label} fill={d.color} />)}\n * <Label content={<PieCenterLabel total=\"₦1.1M\" caption=\"Total spend\" />} />\n * </Pie>\n * </PieChart>\n * </ChartContainer>\n * <PieChartLegend items={legendItems} />\n * </div>\n * </ChartCard>\n */\n\n/** Pie sizes line up with the three shared `ComponentSize` values. */\ntype PieChartSize = ComponentSize;\n\ntype PieChartLayout = {\n\t/** Square plot box in px (width = height); width is NOT parent-driven here. */\n\tsize: number;\n\t/** Donut hole radius in px. Pass `0` to the `Pie` for a filled pie. */\n\tinnerRadius: number;\n\t/** Outer ring radius in px. */\n\touterRadius: number;\n\t/** Gap between segments, in degrees. */\n\tpaddingAngle: number;\n\t/** Corner radius of each segment. */\n\tcornerRadius: number;\n\t/** Center total font size. */\n\ttotalFontSize: number;\n\t/** Center caption font size. */\n\tcaptionFontSize: number;\n};\n\nconst PIE_CHART_LAYOUT: Record<PieChartSize, PieChartLayout> = {\n\tsm: {\n\t\tsize: 132,\n\t\tinnerRadius: 42,\n\t\touterRadius: 64,\n\t\tpaddingAngle: 2,\n\t\tcornerRadius: 0,\n\t\ttotalFontSize: 18,\n\t\tcaptionFontSize: 9,\n\t},\n\tmd: {\n\t\tsize: 176,\n\t\tinnerRadius: 56,\n\t\touterRadius: 84,\n\t\tpaddingAngle: 2,\n\t\tcornerRadius: 0,\n\t\ttotalFontSize: 24,\n\t\tcaptionFontSize: 11,\n\t},\n\tlg: {\n\t\tsize: 224,\n\t\tinnerRadius: 72,\n\t\touterRadius: 108,\n\t\tpaddingAngle: 2,\n\t\tcornerRadius: 0,\n\t\ttotalFontSize: 30,\n\t\tcaptionFontSize: 12,\n\t},\n};\n\n/**\n * Categorical palette for pie/donut segments, ordered by share. Giddaa has no\n * `chart-1`…`chart-N` tokens yet, so these map to the brand scales: forest →\n * brass → moss → clay → stone. Assign by index, or override per `Cell`.\n */\nconst PIE_CHART_PALETTE = [\n\t\"var(--color-forest-700)\",\n\t\"var(--color-brass-500)\",\n\t\"var(--color-moss-600)\",\n\t\"var(--color-clay-500)\",\n\t\"var(--color-stone-500)\",\n] as const;\n\n/**\n * Resolve the pie-chart layout for an explicit or inherited component size and\n * chart `type`. The returned object groups the giddaa defaults by the recharts\n * component they belong to — spread `container` onto `ChartContainer` and `pie`\n * onto `Pie`, then pass the data-specific props (`data`, `dataKey`, `nameKey`)\n * directly afterwards. `type=\"pie\"` collapses the donut hole (`innerRadius` 0).\n */\nfunction usePieChartLayout({\n\tsize,\n\ttype = \"donut\",\n}: {\n\tsize?: PieChartSize;\n\ttype?: \"donut\" | \"pie\";\n} = {}) {\n\tconst layout = PIE_CHART_LAYOUT[useComponentSize(size)];\n\n\treturn {\n\t\tcontainer: {\n\t\t\tclassName: \"aspect-square shrink-0\",\n\t\t\tstyle: { width: layout.size, height: layout.size },\n\t\t},\n\t\tpie: {\n\t\t\tinnerRadius: type === \"pie\" ? 0 : layout.innerRadius,\n\t\t\touterRadius: layout.outerRadius,\n\t\t\tpaddingAngle: type === \"pie\" ? 0 : layout.paddingAngle,\n\t\t\tcornerRadius: layout.cornerRadius,\n\t\t\tstrokeWidth: 0,\n\t\t},\n\t\tlabel: {\n\t\t\ttotalFontSize: layout.totalFontSize,\n\t\t\tcaptionFontSize: layout.captionFontSize,\n\t\t},\n\t};\n}\n\n/**\n * Center label for a donut — the hero total over a short caption. Pass it to\n * recharts as `<Label content={<PieCenterLabel total=… caption=… />} />` inside\n * the `Pie`; recharts injects the `viewBox` carrying the polar center (cx/cy).\n */\ntype PieCenterLabelProps = {\n\t/** Hero figure — pre-formatted, e.g. \"₦1.1M\". */\n\ttotal: React.ReactNode;\n\t/** Short label describing what the total represents, e.g. \"Total spend\". */\n\tcaption?: React.ReactNode;\n\t/** Explicit size; otherwise inherited from the nearest `SizeProvider`. */\n\tsize?: PieChartSize;\n\t// Injected by recharts at render time.\n\tviewBox?: { cx?: number; cy?: number };\n};\n\nfunction PieCenterLabel({\n\ttotal,\n\tcaption,\n\tsize,\n\tviewBox,\n}: PieCenterLabelProps) {\n\tconst { label } = usePieChartLayout({ size });\n\n\tif (!viewBox || viewBox.cx == null || viewBox.cy == null) {\n\t\treturn null;\n\t}\n\n\tconst { cx, cy } = viewBox;\n\tconst captionY = cy + label.totalFontSize * 0.72;\n\n\treturn (\n\t\t<text x={cx} y={cy} textAnchor=\"middle\" dominantBaseline=\"central\">\n\t\t\t<tspan\n\t\t\t\tx={cx}\n\t\t\t\ty={caption == null ? cy : cy - label.captionFontSize * 0.5}\n\t\t\t\tclassName=\"fill-fg-primary font-extrabold tabular-nums\"\n\t\t\t\tstyle={{ fontSize: label.totalFontSize }}\n\t\t\t>\n\t\t\t\t{total}\n\t\t\t</tspan>\n\t\t\t{caption != null && (\n\t\t\t\t<tspan\n\t\t\t\t\tx={cx}\n\t\t\t\t\ty={captionY}\n\t\t\t\t\tclassName=\"fill-fg-secondary font-medium\"\n\t\t\t\t\tstyle={{ fontSize: label.captionFontSize }}\n\t\t\t\t>\n\t\t\t\t\t{caption}\n\t\t\t\t</tspan>\n\t\t\t)}\n\t\t</text>\n\t);\n}\n\n/**\n * Rich legend for pie/donut charts. Unlike the shared `ChartLegendContent`\n * (marker + label only), each row pairs a colour dot with the category name, its\n * value, and its share — laid out as aligned columns so the figures read like a\n * mini table. Values and percentages are pre-formatted by the caller.\n */\ntype PieLegendItem = {\n\t/** Category name, e.g. \"Housing\". */\n\tlabel: string;\n\t/** Segment colour — should match the matching `Cell` fill. */\n\tcolor: string;\n\t/** Pre-formatted value, e.g. \"₦420k\". */\n\tvalue: React.ReactNode;\n\t/** Pre-formatted share, e.g. \"38%\". */\n\tpercentage: React.ReactNode;\n};\n\nconst pieLegendVariants = cva(\"flex min-w-0 flex-col\", {\n\tvariants: {\n\t\tsize: {\n\t\t\tsm: \"gap-1.5 text-gdt-xs\",\n\t\t\tmd: \"gap-2 text-gdt-sm\",\n\t\t\tlg: \"gap-2.5 text-gdt-sm\",\n\t\t},\n\t},\n\tdefaultVariants: { size: \"md\" },\n});\n\nconst pieLegendDotVariants = cva(\"shrink-0 rounded-full\", {\n\tvariants: {\n\t\tsize: { sm: \"size-2\", md: \"size-2.5\", lg: \"size-3\" },\n\t},\n\tdefaultVariants: { size: \"md\" },\n});\n\nfunction PieChartLegend({\n\titems,\n\tsize,\n\tclassName,\n\t...props\n}: React.ComponentProps<\"ul\"> & {\n\titems: PieLegendItem[];\n\tsize?: PieChartSize;\n}) {\n\tconst resolvedSize = useComponentSize(size);\n\n\treturn (\n\t\t<ul\n\t\t\tclassName={cn(pieLegendVariants({ size: resolvedSize }), className)}\n\t\t\t{...props}\n\t\t>\n\t\t\t{items.map((item) => (\n\t\t\t\t<li key={item.label} className=\"flex items-center gap-2.5\">\n\t\t\t\t\t<span\n\t\t\t\t\t\taria-hidden=\"true\"\n\t\t\t\t\t\tclassName={cn(pieLegendDotVariants({ size: resolvedSize }))}\n\t\t\t\t\t\tstyle={{ backgroundColor: item.color }}\n\t\t\t\t\t/>\n\t\t\t\t\t<span className=\"min-w-0 flex-1 truncate text-fg-primary\">\n\t\t\t\t\t\t{item.label}\n\t\t\t\t\t</span>\n\t\t\t\t\t<span className=\"shrink-0 tabular-nums text-fg-secondary\">\n\t\t\t\t\t\t{item.value}\n\t\t\t\t\t</span>\n\t\t\t\t\t<span className=\"w-9 shrink-0 text-right font-bold tabular-nums text-fg-primary\">\n\t\t\t\t\t\t{item.percentage}\n\t\t\t\t\t</span>\n\t\t\t\t</li>\n\t\t\t))}\n\t\t</ul>\n\t);\n}\n\nexport {\n\tPIE_CHART_LAYOUT,\n\tPIE_CHART_PALETTE,\n\tPieCenterLabel,\n\tPieChartLegend,\n\tusePieChartLayout,\n};\nexport type {\n\tPieChartLayout,\n\tPieChartSize,\n\tPieCenterLabelProps,\n\tPieLegendItem,\n};\n"],"mappings":"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","names":[]}
|
package/dist/popover.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
|
package/dist/price-tag.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/price-tag.tsx"],"sourcesContent":["\"use client\";\n\nimport { Popover as PopoverPrimitive } from \"@base-ui/react/popover\";\nimport { cva, type VariantProps } from \"class-variance-authority\";\nimport { Check, ChevronDown } from \"lucide-react\";\nimport type * as React from \"react\";\n\nimport { cn } from \"./lib/cn\";\n\nconst priceTagVariants = cva(\n\t\"group/price-tag inline-flex w-fit shrink-0 items-center justify-center rounded-4xl bg-surface-brand font-bold leading-none whitespace-nowrap text-fg-on-brand shadow-none transition-[background-color,box-shadow] outline-none data-[interactive=true]:cursor-pointer data-[interactive=true]:hover:bg-action-primary-hover data-[interactive=true]:focus-visible:shadow-[0px_0px_0px_2px_var(--color-line-focus)] data-[interactive=true]:active:bg-action-primary-pressed\",\n\t{\n\t\tvariants: {\n\t\t\tsize: {\n\t\t\t\txxs: \"min-h-7 gap-1 px-2.5 py-0.75 text-gdt-subtext [&>svg]:size-3\",\n\t\t\t\txs: \"min-h-7.5 gap-1 px-3 py-1 text-gdt-xs [&>svg]:size-3.5\",\n\t\t\t\tsm: \"min-h-9 gap-1.5 px-4 py-1.5 text-gdt-sm [&>svg]:size-3.5\",\n\t\t\t\tmd: \"min-h-10.5 gap-1.5 px-5 py-2 text-gdt-md [&>svg]:size-4\",\n\t\t\t\tlg: \"min-h-13 gap-2 px-7 py-3 text-gdt-lg [&>svg]:size-4.5\",\n\t\t\t},\n\t\t\thasMonthlyPayment: {\n\t\t\t\ttrue: \"items-start\",\n\t\t\t\tfalse: \"\",\n\t\t\t},\n\t\t},\n\t\tdefaultVariants: {\n\t\t\tsize: \"md\",\n\t\t\thasMonthlyPayment: false,\n\t\t},\n\t},\n);\n\ntype PriceTagSize = NonNullable<VariantProps<typeof priceTagVariants>[\"size\"]>;\n\ntype PriceTagCurrencyOption = {\n\tcode: string;\n\tamount: string;\n\tshortAmount?: string;\n\tmonthlyPayment?: string;\n\tmonthlyPaymentLabel?: string;\n};\n\ntype PriceTagFormat = \"full\" | \"shortened\";\n\ntype PriceTagProps = Omit<React.ComponentProps<\"button\">, \"children\"> & {\n\tamount: string;\n\tshortAmount?: string;\n\tformat?: PriceTagFormat;\n\tsize?: PriceTagSize;\n\tmonthlyPayment?: string;\n\tmonthlyPaymentLabel?: string;\n\tcurrencies?: PriceTagCurrencyOption[];\n\tselectedCurrency?: string;\n\tonCurrencyChange?: (currency: PriceTagCurrencyOption) => void;\n\topen?: boolean;\n\tdefaultOpen?: boolean;\n\tonOpenChange?: (open: boolean) => void;\n\tpopoverClassName?: string;\n};\n\nfunction getDisplayAmount({\n\tamount,\n\tshortAmount,\n\tformat,\n}: Pick<PriceTagProps, \"amount\" | \"shortAmount\" | \"format\">) {\n\treturn format === \"shortened\" && shortAmount ? shortAmount : amount;\n}\n\nfunction PriceTag({\n\tamount,\n\tshortAmount,\n\tformat = \"full\",\n\tsize = \"md\",\n\tmonthlyPayment,\n\tmonthlyPaymentLabel = \"Low as\",\n\tcurrencies,\n\tselectedCurrency,\n\tonCurrencyChange,\n\topen,\n\tdefaultOpen,\n\tonOpenChange,\n\tclassName,\n\tpopoverClassName,\n\ttype = \"button\",\n\t...props\n}: PriceTagProps) {\n\tconst hasDropdown = Boolean(currencies?.length);\n\tconst canShowMonthlyPayment = size === \"md\" || size === \"lg\";\n\tconst displayMonthlyPayment =\n\t\tcanShowMonthlyPayment && monthlyPayment\n\t\t\t? `${monthlyPaymentLabel} ${monthlyPayment} monthly`\n\t\t\t: undefined;\n\tconst displayAmount = getDisplayAmount({ amount, shortAmount, format });\n\n\tconst pill = (\n\t\t<span className=\"flex min-w-0 flex-col gap-1\">\n\t\t\t<span>{displayAmount}</span>\n\t\t\t{displayMonthlyPayment ? (\n\t\t\t\t<span\n\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\"hidden text-gdt-subtext font-medium leading-none opacity-90\",\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"inline-block\": size === \"md\",\n\t\t\t\t\t\t\t\"inline-block text-gdt-xs\": size === \"lg\",\n\t\t\t\t\t\t},\n\t\t\t\t\t)}\n\t\t\t\t>\n\t\t\t\t\t{displayMonthlyPayment}\n\t\t\t\t</span>\n\t\t\t) : null}\n\t\t</span>\n\t);\n\n\tif (!hasDropdown) {\n\t\treturn (\n\t\t\t<span\n\t\t\t\tdata-slot=\"price-tag\"\n\t\t\t\tclassName={cn(\n\t\t\t\t\tpriceTagVariants({\n\t\t\t\t\t\tsize,\n\t\t\t\t\t\thasMonthlyPayment: Boolean(displayMonthlyPayment),\n\t\t\t\t\t}),\n\t\t\t\t\tclassName,\n\t\t\t\t)}\n\t\t\t>\n\t\t\t\t{pill}\n\t\t\t</span>\n\t\t);\n\t}\n\n\treturn (\n\t\t<PopoverPrimitive.Root\n\t\t\topen={open}\n\t\t\tdefaultOpen={defaultOpen}\n\t\t\tonOpenChange={onOpenChange}\n\t\t>\n\t\t\t<PopoverPrimitive.Trigger\n\t\t\t\tdata-slot=\"price-tag\"\n\t\t\t\tdata-interactive=\"true\"\n\t\t\t\ttype={type}\n\t\t\t\tclassName={cn(\n\t\t\t\t\tpriceTagVariants({\n\t\t\t\t\t\tsize,\n\t\t\t\t\t\thasMonthlyPayment: Boolean(displayMonthlyPayment),\n\t\t\t\t\t}),\n\t\t\t\t\tclassName,\n\t\t\t\t)}\n\t\t\t\t{...props}\n\t\t\t>\n\t\t\t\t{pill}\n\t\t\t\t<ChevronDown\n\t\t\t\t\taria-hidden=\"true\"\n\t\t\t\t\tclassName=\"transition-transform group-data-popup-open/price-tag:rotate-180\"\n\t\t\t\t/>\n\t\t\t</PopoverPrimitive.Trigger>\n\t\t\t<PopoverPrimitive.Portal>\n\t\t\t\t<PopoverPrimitive.Positioner sideOffset={10} align=\"start\">\n\t\t\t\t\t<PopoverPrimitive.Popup\n\t\t\t\t\t\tdata-slot=\"price-tag-popover\"\n\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\"z-50 flex w-[17.25rem] max-w-[calc(100vw-2rem)] origin-(--transform-origin) flex-col rounded-xl border border-line-subtle bg-surface-overlay p-2 text-fg-primary shadow-3 outline-hidden duration-100 data-[side=bottom]:slide-in-from-top-2 data-[side=top]:slide-in-from-bottom-2 data-open:animate-in data-open:fade-in-0 data-open:zoom-in-95 data-closed:animate-out data-closed:fade-out-0 data-closed:zoom-out-95\",\n\t\t\t\t\t\t\tpopoverClassName,\n\t\t\t\t\t\t)}\n\t\t\t\t\t>\n\t\t\t\t\t\t{currencies?.map((currency) => {\n\t\t\t\t\t\t\tconst active = currency.code === selectedCurrency;\n\t\t\t\t\t\t\tconst optionAmount = getDisplayAmount({\n\t\t\t\t\t\t\t\tamount: currency.amount,\n\t\t\t\t\t\t\t\tshortAmount: currency.shortAmount,\n\t\t\t\t\t\t\t\tformat,\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\tconst optionMonthlyPayment = currency.monthlyPayment\n\t\t\t\t\t\t\t\t? `${currency.monthlyPaymentLabel ?? \"As low as\"} ${\n\t\t\t\t\t\t\t\t\t\tcurrency.monthlyPayment\n\t\t\t\t\t\t\t\t\t} per month`\n\t\t\t\t\t\t\t\t: undefined;\n\n\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\tkey={currency.code}\n\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\tdata-active={active ? \"true\" : undefined}\n\t\t\t\t\t\t\t\t\tclassName=\"flex min-h-14 w-full items-center gap-3 rounded-lg px-3 text-start outline-none transition-colors hover:bg-surface-brand-subtle focus-visible:bg-surface-brand-subtle focus-visible:shadow-[0px_0px_0px_2px_var(--color-line-focus)] data-[active=true]:bg-surface-brand-subtle\"\n\t\t\t\t\t\t\t\t\tonClick={() => onCurrencyChange?.(currency)}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t<span className=\"min-w-10 text-gdt-sm font-semibold text-fg-brand\">\n\t\t\t\t\t\t\t\t\t\t{currency.code}\n\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t<span className=\"ml-auto flex min-w-0 flex-col items-end\">\n\t\t\t\t\t\t\t\t\t\t<span className=\"text-gdt-sm font-bold text-fg-primary\">\n\t\t\t\t\t\t\t\t\t\t\t{optionAmount}\n\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t\t{optionMonthlyPayment ? (\n\t\t\t\t\t\t\t\t\t\t\t<span className=\"text-gdt-xs text-fg-secondary\">\n\t\t\t\t\t\t\t\t\t\t\t\t{optionMonthlyPayment}\n\t\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t\t) : null}\n\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t{active ? (\n\t\t\t\t\t\t\t\t\t\t<Check\n\t\t\t\t\t\t\t\t\t\t\taria-hidden=\"true\"\n\t\t\t\t\t\t\t\t\t\t\tclassName=\"size-4 shrink-0 text-fg-brand\"\n\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t) : null}\n\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t})}\n\t\t\t\t\t</PopoverPrimitive.Popup>\n\t\t\t\t</PopoverPrimitive.Positioner>\n\t\t\t</PopoverPrimitive.Portal>\n\t\t</PopoverPrimitive.Root>\n\t);\n}\n\nexport {\n\tPriceTag,\n\tpriceTagVariants,\n\ttype PriceTagCurrencyOption,\n\ttype PriceTagFormat,\n\ttype PriceTagProps,\n\ttype PriceTagSize,\n};\n"],"mappings":"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","names":[]}
|
package/dist/progress.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/property-listing-card.tsx"],"sourcesContent":["import { mergeProps } from \"@base-ui/react/merge-props\";\nimport { useRender } from \"@base-ui/react/use-render\";\nimport { cva, type VariantProps } from \"class-variance-authority\";\nimport type * as React from \"react\";\nimport { Button, ButtonLink } from \"./button\";\nimport {\n\tCarousel,\n\tCarouselContent,\n\tCarouselIndicator,\n\tCarouselItem,\n} from \"./carousel\";\n\nimport { cn } from \"./lib/cn\";\n\nconst propertyListingCardVariants = cva(\n\t\"relative flex w-full min-w-0 flex-col overflow-hidden text-fg-primary\",\n\t{\n\t\tvariants: {\n\t\t\tvariant: {\n\t\t\t\tdefault: \"rounded-none border-0 shadow-none\",\n\t\t\t\televated:\n\t\t\t\t\t\"rounded-2xl bg-surface-overlay border border-line-subtle shadow-1\",\n\t\t\t},\n\t\t},\n\t\tdefaultVariants: {\n\t\t\tvariant: \"default\",\n\t\t},\n\t},\n);\n\ntype PropertyListingImage = {\n\tid?: string;\n\tsrc?: string;\n\talt?: string;\n};\n\ninterface PropertyListingCardProps\n\textends React.ComponentProps<\"article\">,\n\t\tVariantProps<typeof propertyListingCardVariants> {}\n\nfunction PropertyListingCard({\n\tclassName,\n\tvariant,\n\t...props\n}: PropertyListingCardProps) {\n\treturn (\n\t\t<article\n\t\t\tclassName={cn(propertyListingCardVariants({ variant }), className)}\n\t\t\t{...props}\n\t\t/>\n\t);\n}\n\nfunction PropertyListingCardMedia({\n\tclassName,\n\timages = [],\n\tchildren,\n\t...props\n}: React.ComponentProps<\"div\"> & {\n\timages?: PropertyListingImage[];\n}) {\n\tconst hasMultipleImages = images.length > 1;\n\n\treturn (\n\t\t<div\n\t\t\tclassName={cn(\n\t\t\t\t\"relative isolate min-h-70 overflow-hidden rounded-t-2xl bg-surface text-fg-primary\",\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\t{...props}\n\t\t>\n\t\t\t{hasMultipleImages ? (\n\t\t\t\t<Carousel\n\t\t\t\t\timageSize=\"full\"\n\t\t\t\t\topts={{ loop: true }}\n\t\t\t\t\tclassName=\"absolute inset-0 -z-10 size-full rounded-none bg-surface\"\n\t\t\t\t>\n\t\t\t\t\t<CarouselContent>\n\t\t\t\t\t\t{images.map((carouselImage, index) => (\n\t\t\t\t\t\t\t<CarouselItem\n\t\t\t\t\t\t\t\tkey={\n\t\t\t\t\t\t\t\t\tcarouselImage.id ??\n\t\t\t\t\t\t\t\t\tcarouselImage.src ??\n\t\t\t\t\t\t\t\t\tcarouselImage.alt ??\n\t\t\t\t\t\t\t\t\tindex\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tclassName=\"relative h-full\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<PropertyListingCardImage image={carouselImage} />\n\t\t\t\t\t\t\t</CarouselItem>\n\t\t\t\t\t\t))}\n\t\t\t\t\t</CarouselContent>\n\t\t\t\t\t<CarouselIndicator size=\"sm\" className=\"bottom-16\" />\n\t\t\t\t</Carousel>\n\t\t\t) : images[0]?.src ? (\n\t\t\t\t<PropertyListingCardImage\n\t\t\t\t\timage={images[0]}\n\t\t\t\t\tclassName=\"absolute inset-0 -z-10\"\n\t\t\t\t/>\n\t\t\t) : (\n\t\t\t\t<div className=\"absolute inset-0 -z-10 grid place-items-center bg-surface-raised text-gdt-sm font-bold text-fg-caption-placeholder\">\n\t\t\t\t\tProperty Image\n\t\t\t\t</div>\n\t\t\t)}\n\t\t\t{children}\n\t\t</div>\n\t);\n}\n\nfunction PropertyListingCardImage({\n\timage,\n\tclassName,\n\t...props\n}: React.ComponentProps<\"img\"> & {\n\timage: PropertyListingImage;\n}) {\n\treturn (\n\t\t<img\n\t\t\tsrc={image.src}\n\t\t\talt={image.alt ?? \"Property image\"}\n\t\t\tclassName={cn(\"size-full object-cover\", className)}\n\t\t\t{...props}\n\t\t/>\n\t);\n}\n\nfunction PropertyListingCardMediaTop({\n\tclassName,\n\t...props\n}: React.ComponentProps<\"div\">) {\n\treturn (\n\t\t<div\n\t\t\tclassName={cn(\n\t\t\t\t\"absolute inset-x-2 top-2 z-10 flex items-start justify-between gap-3\",\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\t{...props}\n\t\t/>\n\t);\n}\n\nfunction PropertyListingCardOptionsBar({\n\tclassName,\n\trender,\n\t...props\n}: useRender.ComponentProps<\"a\">) {\n\treturn useRender({\n\t\tdefaultTagName: \"a\",\n\t\tprops: mergeProps<\"a\">(\n\t\t\t{\n\t\t\t\tclassName: cn(\n\t\t\t\t\t\"absolute inset-x-0 bottom-0 z-10 flex min-h-9.5 items-center justify-center gap-1 bg-black/80 px-4 py-1.5 text-center text-gdt-subtext font-extrabold tracking-wide text-white uppercase transition-[background-color] hover:bg-black/90 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-line-focus\",\n\t\t\t\t\tclassName,\n\t\t\t\t),\n\t\t\t},\n\t\t\tprops,\n\t\t),\n\t\trender,\n\t\tstate: {\n\t\t\tslot: \"property-listing-card-options-bar\",\n\t\t},\n\t});\n}\n\nfunction PropertyListingCardDetails({\n\tclassName,\n\t...props\n}: React.ComponentProps<\"div\">) {\n\treturn (\n\t\t<div className={cn(\"flex flex-col gap-4 pt-4\", className)} {...props} />\n\t);\n}\n\nfunction PropertyListingCardTitle({\n\tclassName,\n\t...props\n}: React.ComponentProps<\"h3\">) {\n\treturn (\n\t\t<h3\n\t\t\tclassName={cn(\"text-gdt-md font-bold text-fg-primary\", className)}\n\t\t\t{...props}\n\t\t/>\n\t);\n}\n\nfunction PropertyListingCardOverview({\n\tclassName,\n\t...props\n}: React.ComponentProps<\"p\">) {\n\treturn (\n\t\t<p className={cn(\"text-gdt-sm text-fg-secondary\", className)} {...props} />\n\t);\n}\n\nfunction PropertyListingCardBadges({\n\tclassName,\n\t...props\n}: React.ComponentProps<\"div\">) {\n\treturn <div className={cn(\"flex flex-wrap gap-3\", className)} {...props} />;\n}\n\nfunction PropertyListingCardActions({\n\tclassName,\n\t...props\n}: React.ComponentProps<\"div\">) {\n\treturn (\n\t\t<div\n\t\t\tclassName={cn(\n\t\t\t\t\"flex items-center gap-5 border-line-subtle border-t pt-4 mt-4\",\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\t{...props}\n\t\t/>\n\t);\n}\n\nfunction PropertyListingCardActionButton({\n\tclassName,\n\ttype = \"button\",\n\t...props\n}: React.ComponentProps<typeof Button>) {\n\treturn (\n\t\t<Button\n\t\t\ttype={type}\n\t\t\tvariant=\"tertiary\"\n\t\t\tsize=\"md\"\n\t\t\tclassName={cn(\"flex-1 bg-action-tertiary text-fg-primary\", className)}\n\t\t\t{...props}\n\t\t/>\n\t);\n}\n\nfunction PropertyListingCardActionButtonLink({\n\tclassName,\n\t...props\n}: React.ComponentProps<typeof ButtonLink>) {\n\treturn (\n\t\t<ButtonLink\n\t\t\tvariant=\"tertiary\"\n\t\t\tsize=\"md\"\n\t\t\tclassName={cn(\"flex-1 bg-action-tertiary text-fg-primary\", className)}\n\t\t\t{...props}\n\t\t/>\n\t);\n}\n\nexport {\n\tPropertyListingCard,\n\tPropertyListingCardActionButton,\n\tPropertyListingCardActionButtonLink,\n\tPropertyListingCardActions,\n\tPropertyListingCardBadges,\n\tPropertyListingCardDetails,\n\tPropertyListingCardMedia,\n\tPropertyListingCardMediaTop,\n\tPropertyListingCardOptionsBar,\n\tPropertyListingCardOverview,\n\tPropertyListingCardTitle,\n\tpropertyListingCardVariants,\n};\nexport type { PropertyListingCardProps, PropertyListingImage };\n"],"mappings":"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","names":[]}
|