@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/table.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/table.tsx"],"sourcesContent":["\"use client\";\n\nimport type * as React from \"react\";\n\nimport { cn } from \"./lib/cn\";\n\n/**\n * Outer card wrapper.\n *\n * Tokens: bg-surface-overlay (container fill), border-line (container border).\n * Pass `containerClassName` to override scroll, sizing, or rounding for\n * individual call-sites (e.g. the data-table's max-height + rounded-[20px]).\n */\nfunction Table({\n\tclassName,\n\tcontainerClassName,\n\t...props\n}: React.ComponentProps<\"table\"> & { containerClassName?: string }) {\n\treturn (\n\t\t<div\n\t\t\tdata-slot=\"table-container\"\n\t\t\tclassName={cn(\n\t\t\t\t\"relative w-full overflow-x-auto rounded-xl border border-line bg-surface-overlay\",\n\t\t\t\tcontainerClassName,\n\t\t\t)}\n\t\t>\n\t\t\t<table\n\t\t\t\tdata-slot=\"table\"\n\t\t\t\tclassName={cn(\"min-w-full caption-bottom\", className)}\n\t\t\t\t{...props}\n\t\t\t/>\n\t\t</div>\n\t);\n}\n\n/**\n * Header band (thead).\n *\n * Token: bg-surface-raised (header fill).\n * Add `sticky` to pin the header and show Shadow-2 elevation while scrolled.\n */\nfunction TableHeader({\n\tclassName,\n\tsticky = false,\n\t...props\n}: React.ComponentProps<\"thead\"> & { sticky?: boolean }) {\n\treturn (\n\t\t<thead\n\t\t\tdata-slot=\"table-header\"\n\t\t\tclassName={cn(\n\t\t\t\t\"bg-surface-raised\",\n\t\t\t\tsticky && \"sticky top-0 z-2 shadow-(--elevation-e2-shadow)\",\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\t{...props}\n\t\t/>\n\t);\n}\n\nfunction TableBody({ className, ...props }: React.ComponentProps<\"tbody\">) {\n\treturn (\n\t\t<tbody\n\t\t\tdata-slot=\"table-body\"\n\t\t\tclassName={cn(\"[&_tr:last-child]:border-0\", className)}\n\t\t\t{...props}\n\t\t/>\n\t);\n}\n\n/**\n * Footer band (tfoot).\n *\n * Shares the same raised surface as the header.\n */\nfunction TableFooter({ className, ...props }: React.ComponentProps<\"tfoot\">) {\n\treturn (\n\t\t<tfoot\n\t\t\tdata-slot=\"table-footer\"\n\t\t\tclassName={cn(\n\t\t\t\t\"border-t border-line bg-surface-raised font-medium [&>tr]:last:border-b-0\",\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\t{...props}\n\t\t/>\n\t);\n}\n\n/**\n * Table row (tr).\n *\n * Token: border-line-subtle (row divider). The last body row has no border\n * via the [&_tr:last-child]:border-0 rule on TableBody.\n */\nfunction TableRow({ className, ...props }: React.ComponentProps<\"tr\">) {\n\treturn (\n\t\t<tr\n\t\t\tdata-slot=\"table-row\"\n\t\t\tclassName={cn(\n\t\t\t\t\"group border-b border-line-subtle transition-colors\",\n\t\t\t\t\"hover:bg-surface has-aria-expanded:bg-surface\",\n\t\t\t\t\"data-[state=selected]:bg-surface-brand-subtle\",\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\t{...props}\n\t\t/>\n\t);\n}\n\n/**\n * Header cell (th).\n *\n * Tokens: bg-surface-raised (always applied so sticky/pinned th cells correctly\n * cover scrolling content), text-fg-secondary, text-gdt-capitalized + uppercase\n * for the tiny-caps column label style described in the design system.\n */\nfunction TableHead({ className, ...props }: React.ComponentProps<\"th\">) {\n\treturn (\n\t\t<th\n\t\t\tdata-slot=\"table-head\"\n\t\t\tclassName={cn(\n\t\t\t\t\"h-11 px-5 py-3.5 text-left align-middle bg-surface-raised\",\n\t\t\t\t\"text-gdt-capitalized font-bold uppercase tracking-wide text-fg-secondary\",\n\t\t\t\t\"whitespace-nowrap has-[[role=checkbox]]:pr-0\",\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\t{...props}\n\t\t/>\n\t);\n}\n\n/**\n * Standard body cell (td).\n *\n * Token: text-fg-primary (body cell text), text-gdt-sm.\n * Pass `pinned` when the column is sticky. Pinned cells get an opaque\n * bg-canvas cover so scrolling content doesn't bleed through, and they\n * mirror the parent row's hover/selected states via group variants.\n * Non-pinned cells are left transparent so the parent row's surface shows through.\n */\nfunction TableCell({\n\tclassName,\n\tpinned = false,\n\t...props\n}: React.ComponentProps<\"td\"> & { pinned?: boolean }) {\n\treturn (\n\t\t<td\n\t\t\tdata-slot=\"table-cell\"\n\t\t\tclassName={cn(\n\t\t\t\t\"px-5 py-3.5 align-middle text-gdt-sm text-fg-primary\",\n\t\t\t\t\"whitespace-nowrap\",\n\t\t\t\tpinned &&\n\t\t\t\t\t\"bg-surface-raised group-hover:bg-surface group-data-[state=selected]:bg-surface-brand-subtle\",\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\t{...props}\n\t\t/>\n\t);\n}\n\n/**\n * Formatted cell title, for use within a TableCell\n */\nfunction TableCellTitle({ className, ...props }: React.ComponentProps<\"span\">) {\n\treturn (\n\t\t<span\n\t\t\tdata-slot=\"table-cell-title\"\n\t\t\tclassName={cn(\"text-gdt-sm font-semibold\", className)}\n\t\t\t{...props}\n\t\t/>\n\t);\n}\n\n/**\n * Formatted cell caption, for use within a TableCell. Usually for auxiliary info below the title, uses the secondary text token and smaller size.\n */\nfunction TableCellCaption({\n\tclassName,\n\t...props\n}: React.ComponentProps<\"span\">) {\n\treturn (\n\t\t<span\n\t\t\tdata-slot=\"table-cell-caption\"\n\t\t\tclassName={cn(\"text-gdt-xs text-fg-secondary\", className)}\n\t\t\t{...props}\n\t\t/>\n\t);\n}\n\n/**\n * Caption — rendered below the table, uses secondary text token.\n */\nfunction TableCaption({\n\tclassName,\n\t...props\n}: React.ComponentProps<\"caption\">) {\n\treturn (\n\t\t<caption\n\t\t\tdata-slot=\"table-caption\"\n\t\t\tclassName={cn(\"mt-4 text-gdt-sm text-fg-secondary\", className)}\n\t\t\t{...props}\n\t\t/>\n\t);\n}\n\nexport {\n\tTable,\n\tTableHeader,\n\tTableBody,\n\tTableFooter,\n\tTableHead,\n\tTableRow,\n\tTableCell,\n\tTableCellTitle,\n\tTableCellCaption,\n\tTableCaption,\n};\n"],"mappings":";;;;;;AA0BG;AAbH,SAAS,MAAM;AAAA,EACd;AAAA,EACA;AAAA,EACA,GAAG;AACJ,GAAoE;AACnE,SACC;AAAA,IAAC;AAAA;AAAA,MACA,aAAU;AAAA,MACV,WAAW;AAAA,QACV;AAAA,QACA;AAAA,MACD;AAAA,MAEA;AAAA,QAAC;AAAA;AAAA,UACA,aAAU;AAAA,UACV,WAAW,GAAG,6BAA6B,SAAS;AAAA,UACnD,GAAG;AAAA;AAAA,MACL;AAAA;AAAA,EACD;AAEF;AAQA,SAAS,YAAY;AAAA,EACpB;AAAA,EACA,SAAS;AAAA,EACT,GAAG;AACJ,GAAyD;AACxD,SACC;AAAA,IAAC;AAAA;AAAA,MACA,aAAU;AAAA,MACV,WAAW;AAAA,QACV;AAAA,QACA,UAAU;AAAA,QACV;AAAA,MACD;AAAA,MACC,GAAG;AAAA;AAAA,EACL;AAEF;AAEA,SAAS,UAAU,EAAE,WAAW,GAAG,MAAM,GAAkC;AAC1E,SACC;AAAA,IAAC;AAAA;AAAA,MACA,aAAU;AAAA,MACV,WAAW,GAAG,8BAA8B,SAAS;AAAA,MACpD,GAAG;AAAA;AAAA,EACL;AAEF;AAOA,SAAS,YAAY,EAAE,WAAW,GAAG,MAAM,GAAkC;AAC5E,SACC;AAAA,IAAC;AAAA;AAAA,MACA,aAAU;AAAA,MACV,WAAW;AAAA,QACV;AAAA,QACA;AAAA,MACD;AAAA,MACC,GAAG;AAAA;AAAA,EACL;AAEF;AAQA,SAAS,SAAS,EAAE,WAAW,GAAG,MAAM,GAA+B;AACtE,SACC;AAAA,IAAC;AAAA;AAAA,MACA,aAAU;AAAA,MACV,WAAW;AAAA,QACV;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACD;AAAA,MACC,GAAG;AAAA;AAAA,EACL;AAEF;AASA,SAAS,UAAU,EAAE,WAAW,GAAG,MAAM,GAA+B;AACvE,SACC;AAAA,IAAC;AAAA;AAAA,MACA,aAAU;AAAA,MACV,WAAW;AAAA,QACV;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACD;AAAA,MACC,GAAG;AAAA;AAAA,EACL;AAEF;AAWA,SAAS,UAAU;AAAA,EAClB;AAAA,EACA,SAAS;AAAA,EACT,GAAG;AACJ,GAAsD;AACrD,SACC;AAAA,IAAC;AAAA;AAAA,MACA,aAAU;AAAA,MACV,WAAW;AAAA,QACV;AAAA,QACA;AAAA,QACA,UACC;AAAA,QACD;AAAA,MACD;AAAA,MACC,GAAG;AAAA;AAAA,EACL;AAEF;AAKA,SAAS,eAAe,EAAE,WAAW,GAAG,MAAM,GAAiC;AAC9E,SACC;AAAA,IAAC;AAAA;AAAA,MACA,aAAU;AAAA,MACV,WAAW,GAAG,6BAA6B,SAAS;AAAA,MACnD,GAAG;AAAA;AAAA,EACL;AAEF;AAKA,SAAS,iBAAiB;AAAA,EACzB;AAAA,EACA,GAAG;AACJ,GAAiC;AAChC,SACC;AAAA,IAAC;AAAA;AAAA,MACA,aAAU;AAAA,MACV,WAAW,GAAG,iCAAiC,SAAS;AAAA,MACvD,GAAG;AAAA;AAAA,EACL;AAEF;AAKA,SAAS,aAAa;AAAA,EACrB;AAAA,EACA,GAAG;AACJ,GAAoC;AACnC,SACC;AAAA,IAAC;AAAA;AAAA,MACA,aAAU;AAAA,MACV,WAAW,GAAG,sCAAsC,SAAS;AAAA,MAC5D,GAAG;AAAA;AAAA,EACL;AAEF;","names":[]}
|
package/dist/tabs.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
|
package/dist/tag.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/tag.tsx"],"sourcesContent":["\"use client\";\n\nimport { cva } from \"class-variance-authority\";\nimport { X } from \"lucide-react\";\nimport type { ButtonHTMLAttributes, MouseEvent, ReactNode } from \"react\";\nimport { cn } from \"./lib/cn\";\nimport { type ComponentSize, useComponentSize } from \"./size-context\";\n\nconst tagVariants = cva(\n\t\"group/tag inline-flex w-full shrink-0 items-center border bg-surface-raised font-bold leading-none text-fg-primary whitespace-nowrap transition-[background-color,border-color,color,box-shadow] select-none data-[shape=full]:rounded-4xl data-[shape=box]:data-[size=sm]:rounded-md data-[shape=box]:data-[size=md]:rounded-lg data-[shape=box]:data-[size=lg]:rounded-xl data-[has-close=true]:data-[size=sm]:pr-5 data-[has-close=true]:data-[size=md]:pr-7 data-[has-close=true]:data-[size=lg]:pr-8\",\n\t{\n\t\tvariants: {\n\t\t\tsize: {\n\t\t\t\tsm: \"gap-1 py-0.5 pl-2 pr-1 text-gdt-xs\",\n\t\t\t\tmd: \"gap-1.5 py-1 pl-2.5 pr-1.5 text-gdt-sm\",\n\t\t\t\tlg: \"gap-2 py-1.5 pl-3 pr-2 text-gdt-md\",\n\t\t\t},\n\t\t\tborder: {\n\t\t\t\ttrue: \"border-line\",\n\t\t\t\tfalse: \"border-transparent\",\n\t\t\t},\n\t\t\tclickable: {\n\t\t\t\ttrue: \"cursor-pointer hover:border-line-strong hover:bg-action-tertiary-hover active:border-line-strong active:bg-action-tertiary-pressed outline-none focus-visible:border-line-focus focus-visible:shadow-[0px_0px_0px_2px_var(--color-line-focus)]\",\n\t\t\t\tfalse: \"cursor-default\",\n\t\t\t},\n\t\t\tdisabled: {\n\t\t\t\ttrue: \"border-line-subtle bg-surface text-fg-caption-placeholder\",\n\t\t\t\tfalse: \"\",\n\t\t\t},\n\t\t},\n\t\tdefaultVariants: {\n\t\t\tsize: \"md\",\n\t\t\tborder: false,\n\t\t\tclickable: false,\n\t\t\tdisabled: false,\n\t\t},\n\t},\n);\n\nconst tagCloseVariants = cva(\n\t\"absolute top-1/2 inline-flex shrink-0 -translate-y-1/2 items-center justify-center rounded-full text-current transition-[background-color,color] outline-none hover:bg-action-tertiary-hover hover:text-fg-primary focus-visible:bg-action-tertiary-hover focus-visible:text-fg-primary focus-visible:shadow-[0px_0px_0px_2px_var(--color-line-focus)] active:bg-action-tertiary-pressed disabled:pointer-events-none disabled:text-fg-caption-placeholder\",\n\t{\n\t\tvariants: {\n\t\t\tsize: {\n\t\t\t\tsm: \"right-1 size-4 [&>svg]:size-2.5\",\n\t\t\t\tmd: \"right-1.5 size-5 [&>svg]:size-3\",\n\t\t\t\tlg: \"right-2 size-5 [&>svg]:size-3.5\",\n\t\t\t},\n\t\t},\n\t\tdefaultVariants: {\n\t\t\tsize: \"md\",\n\t\t},\n\t},\n);\n\ninterface TagProps\n\textends Omit<\n\t\tButtonHTMLAttributes<HTMLButtonElement>,\n\t\t\"children\" | \"disabled\" | \"onClick\" | \"type\"\n\t> {\n\tlabel: string;\n\tleadingIcon?: ReactNode;\n\tonClose?: (e: MouseEvent<HTMLButtonElement>) => void;\n\tcloseButtonProps?: Omit<\n\t\tButtonHTMLAttributes<HTMLButtonElement>,\n\t\t\"children\" | \"disabled\" | \"onClick\" | \"type\"\n\t>;\n\tonClick?: (e: MouseEvent<HTMLButtonElement>) => void;\n\tsize?: ComponentSize;\n\tshape?: \"full\" | \"box\";\n\tborder?: boolean;\n\tclickable?: boolean;\n\tdisabled?: boolean;\n}\n\nfunction Tag({\n\tlabel,\n\tleadingIcon,\n\tonClose,\n\tcloseButtonProps,\n\tonClick,\n\tsize,\n\tshape = \"full\",\n\tborder = false,\n\tclickable = false,\n\tdisabled = false,\n\tclassName,\n\t...props\n}: TagProps) {\n\tconst resolvedSize = useComponentSize(size);\n\tconst isInteractive = clickable && !disabled;\n\n\tconst {\n\t\t\"aria-label\": closeAriaLabel = `Remove ${label}`,\n\t\tclassName: closeClassName,\n\t\tonKeyDown: onCloseKeyDown,\n\t\t...resolvedCloseButtonProps\n\t} = closeButtonProps ?? {};\n\n\treturn (\n\t\t<div data-slot=\"tag\" className=\"relative inline-flex w-fit shrink-0\">\n\t\t\t{clickable ? (\n\t\t\t\t<button\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\tdata-slot=\"tag-surface\"\n\t\t\t\t\tdata-shape={shape}\n\t\t\t\t\tdata-size={resolvedSize}\n\t\t\t\t\tdata-has-close={Boolean(onClose)}\n\t\t\t\t\tdisabled={disabled}\n\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\ttagVariants({\n\t\t\t\t\t\t\tsize: resolvedSize,\n\t\t\t\t\t\t\tborder,\n\t\t\t\t\t\t\tclickable: isInteractive,\n\t\t\t\t\t\t\tdisabled,\n\t\t\t\t\t\t}),\n\t\t\t\t\t\tclassName,\n\t\t\t\t\t)}\n\t\t\t\t\tonClick={onClick}\n\t\t\t\t\t{...props}\n\t\t\t\t>\n\t\t\t\t\t<TagContent label={label} leadingIcon={leadingIcon} />\n\t\t\t\t</button>\n\t\t\t) : (\n\t\t\t\t<span\n\t\t\t\t\tdata-slot=\"tag-surface\"\n\t\t\t\t\tdata-shape={shape}\n\t\t\t\t\tdata-size={resolvedSize}\n\t\t\t\t\tdata-has-close={Boolean(onClose)}\n\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\ttagVariants({\n\t\t\t\t\t\t\tsize: resolvedSize,\n\t\t\t\t\t\t\tborder,\n\t\t\t\t\t\t\tclickable: false,\n\t\t\t\t\t\t\tdisabled,\n\t\t\t\t\t\t}),\n\t\t\t\t\t\tclassName,\n\t\t\t\t\t)}\n\t\t\t\t>\n\t\t\t\t\t<TagContent label={label} leadingIcon={leadingIcon} />\n\t\t\t\t</span>\n\t\t\t)}\n\t\t\t{onClose && (\n\t\t\t\t<button\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\taria-label={closeAriaLabel}\n\t\t\t\t\tdisabled={disabled}\n\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\ttagCloseVariants({ size: resolvedSize }),\n\t\t\t\t\t\tcloseClassName,\n\t\t\t\t\t)}\n\t\t\t\t\tonClick={(e) => {\n\t\t\t\t\t\te.stopPropagation();\n\t\t\t\t\t\tonClose(e);\n\t\t\t\t\t}}\n\t\t\t\t\tonKeyDown={onCloseKeyDown}\n\t\t\t\t\t{...resolvedCloseButtonProps}\n\t\t\t\t>\n\t\t\t\t\t<X aria-hidden=\"true\" />\n\t\t\t\t</button>\n\t\t\t)}\n\t\t</div>\n\t);\n}\n\nfunction TagContent({\n\tlabel,\n\tleadingIcon,\n}: Pick<TagProps, \"label\" | \"leadingIcon\">) {\n\treturn (\n\t\t<>\n\t\t\t{leadingIcon && (\n\t\t\t\t<span\n\t\t\t\t\taria-hidden=\"true\"\n\t\t\t\t\tdata-slot=\"tag-leading-icon\"\n\t\t\t\t\tclassName=\"inline-flex shrink-0 items-center [&>svg]:size-[1em]\"\n\t\t\t\t>\n\t\t\t\t\t{leadingIcon}\n\t\t\t\t</span>\n\t\t\t)}\n\t\t\t<span>{label}</span>\n\t\t</>\n\t);\n}\n\nexport { Tag, tagVariants, type TagProps };\n"],"mappings":"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","names":[]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/testimonial-block.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 { ArrowUpRight, Play, Star } from \"lucide-react\";\nimport type * as React from \"react\";\n\nimport { Avatar, AvatarFallback, AvatarImage } from \"./avatar\";\nimport { buttonVariants } from \"./button\";\nimport { cn } from \"./lib/cn\";\n\nconst STAR_INDEXES = [0, 1, 2, 3, 4] as const;\n\nconst testimonialBlockVariants = cva(\n\t\"group/testimonial-block relative flex w-full min-w-0 overflow-hidden rounded-xl text-fg-primary shadow-1 transition-[background-color,border-color,box-shadow,transform]\",\n\t{\n\t\tvariants: {\n\t\t\ttone: {\n\t\t\t\tneutral:\n\t\t\t\t\t\"border border-line-subtle bg-surface hover:bg-surface-raised hover:shadow-2 active:bg-surface-raised active:shadow-none\",\n\t\t\t\tbrand:\n\t\t\t\t\t\"border border-transparent bg-surface-brand text-fg-on-brand hover:bg-action-primary-hover hover:shadow-2 active:bg-action-primary-pressed active:shadow-none\",\n\t\t\t},\n\t\t\torientation: {\n\t\t\t\tvertical: \"flex-col\",\n\t\t\t\thorizontal: \"flex-row\",\n\t\t\t},\n\t\t\tsize: {\n\t\t\t\tsm: \"gap-3.5 p-5\",\n\t\t\t\tmd: \"gap-4 p-7\",\n\t\t\t\tlg: \"gap-5 p-8.5 rounded-2xl\",\n\t\t\t},\n\t\t},\n\t\tdefaultVariants: {\n\t\t\torientation: \"vertical\",\n\t\t\tsize: \"md\",\n\t\t\ttone: \"neutral\",\n\t\t},\n\t},\n);\n\ntype TestimonialBlockProps = useRender.ComponentProps<\"article\"> &\n\tVariantProps<typeof testimonialBlockVariants>;\n\nfunction TestimonialBlock({\n\tclassName,\n\torientation = \"vertical\",\n\trender,\n\tsize = \"md\",\n\ttone = \"neutral\",\n\t...props\n}: TestimonialBlockProps) {\n\treturn useRender({\n\t\tdefaultTagName: \"article\",\n\t\tprops: mergeProps<\"article\">(\n\t\t\t{\n\t\t\t\tclassName: cn(\n\t\t\t\t\ttestimonialBlockVariants({ orientation, size, tone }),\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\torientation,\n\t\t\tsize,\n\t\t\tslot: \"testimonial-block\",\n\t\t\ttone,\n\t\t},\n\t});\n}\n\nfunction TestimonialBlockContent({\n\tclassName,\n\trender,\n\t...props\n}: useRender.ComponentProps<\"div\">) {\n\treturn useRender({\n\t\tdefaultTagName: \"div\",\n\t\tprops: mergeProps<\"div\">(\n\t\t\t{\n\t\t\t\tclassName: cn(\n\t\t\t\t\t\"flex min-w-0 flex-1 flex-col gap-gdt-md group-data-[size=lg]/testimonial-block:gap-gdt-lg\",\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: \"testimonial-block-content\",\n\t\t},\n\t});\n}\n\nfunction TestimonialBlockMedia({\n\tclassName,\n\trender,\n\t...props\n}: useRender.ComponentProps<\"div\">) {\n\treturn useRender({\n\t\tdefaultTagName: \"div\",\n\t\tprops: mergeProps<\"div\">(\n\t\t\t{\n\t\t\t\tclassName: cn(\n\t\t\t\t\t\"relative isolate flex min-w-0 items-center justify-center overflow-hidden rounded-2xl bg-surface-raised\",\n\t\t\t\t\t\"min-h-32 group-data-[size=sm]/testimonial-block:min-h-28 group-data-[size=lg]/testimonial-block:min-h-44\",\n\t\t\t\t\t\"group-data-[orientation=horizontal]/testimonial-block:w-2/5 group-data-[orientation=horizontal]/testimonial-block:shrink-0\",\n\t\t\t\t\t\"[&>img]:absolute [&>img]:inset-0 [&>img]:size-full [&>img]:object-cover\",\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: \"testimonial-block-media\",\n\t\t},\n\t});\n}\n\nfunction TestimonialBlockPlayButton({\n\t\"aria-label\": ariaLabel = \"Play testimonial\",\n\tchildren,\n\tclassName,\n\trender,\n\t...props\n}: useRender.ComponentProps<\"button\">) {\n\treturn useRender({\n\t\tdefaultTagName: \"button\",\n\t\tprops: mergeProps<\"button\">(\n\t\t\t{\n\t\t\t\t\"aria-label\": ariaLabel,\n\t\t\t\tchildren: children ?? <Play aria-hidden=\"true\" fill=\"currentColor\" />,\n\t\t\t\tclassName: cn(\n\t\t\t\t\tbuttonVariants({ variant: \"glass-overlay\", size: \"icon-lg\" }),\n\t\t\t\t\t\"size-12 group-data-[size=lg]/testimonial-block:size-14\",\n\t\t\t\t\t\"[&>svg]:ml-0.5 [&>svg]:size-5 group-data-[size=lg]/testimonial-block:[&>svg]:size-6\",\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: \"testimonial-block-play-button\",\n\t\t},\n\t});\n}\n\ntype TestimonialBlockRatingProps = Omit<\n\tuseRender.ComponentProps<\"div\">,\n\t\"children\"\n> & {\n\trating: number;\n\tsource?: React.ReactNode;\n\ttotalReviews?: number;\n\treviewLabel?: string;\n\tshowScore?: boolean;\n};\n\nfunction clampRating(rating: number) {\n\treturn Math.min(5, Math.max(0, rating));\n}\n\nfunction getInitials(name: string) {\n\treturn name\n\t\t.trim()\n\t\t.split(/\\s+/)\n\t\t.slice(0, 2)\n\t\t.map((part) => part[0]?.toUpperCase())\n\t\t.join(\"\");\n}\n\nfunction formatRating(rating: number) {\n\treturn clampRating(rating).toFixed(1);\n}\n\nfunction formatReviewSource({\n\treviewLabel,\n\tsource,\n\ttotalReviews,\n}: Pick<\n\tTestimonialBlockRatingProps,\n\t\"reviewLabel\" | \"source\" | \"totalReviews\"\n>) {\n\tconst label = reviewLabel ?? (totalReviews === 1 ? \"review\" : \"reviews\");\n\n\tif (source && typeof totalReviews === \"number\") {\n\t\treturn (\n\t\t\t<>\n\t\t\t\t{totalReviews.toLocaleString()} {source} {label}\n\t\t\t</>\n\t\t);\n\t}\n\n\tif (source) {\n\t\treturn source;\n\t}\n\n\tif (typeof totalReviews === \"number\") {\n\t\treturn `${totalReviews.toLocaleString()} ${label}`;\n\t}\n\n\treturn null;\n}\n\nfunction TestimonialBlockRating({\n\tclassName,\n\trating,\n\trender,\n\treviewLabel,\n\tshowScore = true,\n\tsource,\n\ttotalReviews,\n\t...props\n}: TestimonialBlockRatingProps) {\n\tconst formattedRating = formatRating(rating);\n\tconst roundedRating = Math.round(clampRating(rating));\n\tconst reviewSource = formatReviewSource({\n\t\treviewLabel,\n\t\tsource,\n\t\ttotalReviews,\n\t});\n\n\treturn useRender({\n\t\tdefaultTagName: \"div\",\n\t\tprops: mergeProps<\"div\">(\n\t\t\t{\n\t\t\t\tclassName: cn(\n\t\t\t\t\t\"flex min-w-0 flex-wrap items-center gap-gdt-sm text-fg-primary group-data-[tone=brand]/testimonial-block:text-fg-on-brand\",\n\t\t\t\t\tclassName,\n\t\t\t\t),\n\t\t\t\tchildren: (\n\t\t\t\t\t<>\n\t\t\t\t\t\t{showScore ? (\n\t\t\t\t\t\t\t<span className=\"font-bold text-gdt-lg group-data-[size=md]/testimonial-block:text-gdt-xl group-data-[size=lg]/testimonial-block:text-gdt-h5\">\n\t\t\t\t\t\t\t\t{formattedRating}\n\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t) : null}\n\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\"inline-flex shrink-0 items-center gap-0.5 text-surface-accent group-data-[tone=brand]/testimonial-block:text-fg-on-brand\",\n\t\t\t\t\t\t\t\t\"[&>svg]:size-4.5 group-data-[size=md]/testimonial-block:[&>svg]:size-5 group-data-[size=lg]/testimonial-block:[&>svg]:size-6\",\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{STAR_INDEXES.map((index) => (\n\t\t\t\t\t\t\t\t<Star\n\t\t\t\t\t\t\t\t\taria-hidden=\"true\"\n\t\t\t\t\t\t\t\t\tfill={index < roundedRating ? \"currentColor\" : \"none\"}\n\t\t\t\t\t\t\t\t\tkey={index}\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t</span>\n\t\t\t\t\t\t{reviewSource ? (\n\t\t\t\t\t\t\t<span className=\"text-gdt-xs text-fg-secondary group-data-[size=md]/testimonial-block:text-gdt-sm group-data-[size=lg]/testimonial-block:text-gdt-md group-data-[tone=brand]/testimonial-block:text-fg-on-brand\">\n\t\t\t\t\t\t\t\t{reviewSource}\n\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t) : null}\n\t\t\t\t\t</>\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\trating: formattedRating,\n\t\t\tslot: \"testimonial-block-rating\",\n\t\t},\n\t});\n}\n\nfunction TestimonialBlockQuote({\n\tclassName,\n\trender,\n\t...props\n}: useRender.ComponentProps<\"blockquote\">) {\n\treturn useRender({\n\t\tdefaultTagName: \"blockquote\",\n\t\tprops: mergeProps<\"blockquote\">(\n\t\t\t{\n\t\t\t\tclassName: cn(\n\t\t\t\t\t\"text-gdt-sm text-fg-primary group-data-[size=md]/testimonial-block:text-gdt-md group-data-[size=lg]/testimonial-block:text-gdt-lg\",\n\t\t\t\t\t\"group-data-[tone=brand]/testimonial-block:text-fg-on-brand\",\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: \"testimonial-block-quote\",\n\t\t},\n\t});\n}\n\nfunction TestimonialBlockFooter({\n\tclassName,\n\trender,\n\t...props\n}: useRender.ComponentProps<\"div\">) {\n\treturn useRender({\n\t\tdefaultTagName: \"div\",\n\t\tprops: mergeProps<\"div\">(\n\t\t\t{\n\t\t\t\tclassName: cn(\n\t\t\t\t\t\"mt-auto flex min-w-0 items-center gap-gdt-md\",\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: \"testimonial-block-footer\",\n\t\t},\n\t});\n}\n\ntype TestimonialBlockReviewerProps = Omit<\n\tuseRender.ComponentProps<\"div\">,\n\t\"children\"\n> & {\n\tname: string;\n\tphoto?: string;\n\treviewerRole?: React.ReactNode;\n};\n\nfunction TestimonialBlockReviewer({\n\tclassName,\n\tname,\n\tphoto,\n\trender,\n\treviewerRole,\n\t...props\n}: TestimonialBlockReviewerProps) {\n\treturn useRender({\n\t\tdefaultTagName: \"div\",\n\t\tprops: mergeProps<\"div\">(\n\t\t\t{\n\t\t\t\tclassName: cn(\"flex min-w-0 flex-1 items-center gap-gdt-sm\", className),\n\t\t\t\tchildren: (\n\t\t\t\t\t<>\n\t\t\t\t\t\t<Avatar\n\t\t\t\t\t\t\tsize=\"md\"\n\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\"size-10 border border-line-subtle bg-canvas\",\n\t\t\t\t\t\t\t\t\"group-data-[size=sm]/testimonial-block:size-8 group-data-[size=lg]/testimonial-block:size-12\",\n\t\t\t\t\t\t\t\t\"group-data-[tone=brand]/testimonial-block:border-transparent\",\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{photo ? <AvatarImage alt={name} src={photo} /> : null}\n\t\t\t\t\t\t\t<AvatarFallback\n\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t\"bg-canvas text-fg-secondary\",\n\t\t\t\t\t\t\t\t\t\"group-data-[tone=brand]/testimonial-block:bg-canvas group-data-[tone=brand]/testimonial-block:text-fg-secondary\",\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{getInitials(name)}\n\t\t\t\t\t\t\t</AvatarFallback>\n\t\t\t\t\t\t</Avatar>\n\t\t\t\t\t\t<div className=\"min-w-0\">\n\t\t\t\t\t\t\t<span className=\"block truncate font-bold text-gdt-sm text-fg-primary group-data-[size=md]/testimonial-block:text-gdt-md group-data-[size=lg]/testimonial-block:text-gdt-lg group-data-[tone=brand]/testimonial-block:text-fg-on-brand\">\n\t\t\t\t\t\t\t\t{name}\n\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t{reviewerRole ? (\n\t\t\t\t\t\t\t\t<span className=\"block truncate text-gdt-xs text-fg-secondary group-data-[size=md]/testimonial-block:text-gdt-sm group-data-[size=lg]/testimonial-block:text-gdt-md group-data-[tone=brand]/testimonial-block:text-fg-on-brand/85\">\n\t\t\t\t\t\t\t\t\t{reviewerRole}\n\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t) : null}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</>\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: \"testimonial-block-reviewer\",\n\t\t},\n\t});\n}\n\nfunction TestimonialBlockAction({\n\t\"aria-label\": ariaLabel = \"Open review\",\n\tchildren,\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\t\"aria-label\": ariaLabel,\n\t\t\t\tchildren: children ?? <ArrowUpRight aria-hidden=\"true\" />,\n\t\t\t\tclassName: cn(\n\t\t\t\t\t\"inline-flex shrink-0 items-center justify-center rounded-full bg-action-primary text-fg-on-brand transition-[background-color,box-shadow,transform]\",\n\t\t\t\t\t\"size-10 hover:bg-action-primary-hover active:scale-95 active:bg-action-primary-pressed\",\n\t\t\t\t\t\"group-data-[size=md]/testimonial-block:size-12 group-data-[size=lg]/testimonial-block:size-14\",\n\t\t\t\t\t\"group-data-[tone=brand]/testimonial-block:bg-canvas group-data-[tone=brand]/testimonial-block:text-fg-brand group-data-[tone=brand]/testimonial-block:hover:bg-surface\",\n\t\t\t\t\t\"focus-visible:outline-none focus-visible:shadow-[0px_0px_0px_2px_var(--color-line-focus)]\",\n\t\t\t\t\t\"[&>svg]:size-5\",\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: \"testimonial-block-action\",\n\t\t},\n\t});\n}\n\nexport {\n\tTestimonialBlock,\n\tTestimonialBlockAction,\n\tTestimonialBlockContent,\n\tTestimonialBlockFooter,\n\tTestimonialBlockMedia,\n\tTestimonialBlockPlayButton,\n\tTestimonialBlockQuote,\n\tTestimonialBlockRating,\n\tTestimonialBlockReviewer,\n\ttestimonialBlockVariants,\n};\nexport type { TestimonialBlockProps, TestimonialBlockReviewerProps };\n"],"mappings":"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","names":[]}
|
package/dist/textarea.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
|
package/dist/time-picker.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/time-picker.tsx"],"sourcesContent":["\"use client\";\n\nimport { ClockIcon } from \"lucide-react\";\nimport * as React from \"react\";\nimport { cn } from \"./lib/cn\";\nimport { PickerFooter, PickerTrigger } from \"./lib/picker\";\nimport { Popover, PopoverContent } from \"./popover\";\n\nconst ITEM_HEIGHT = 40;\nconst VISIBLE_COUNT = 5;\nconst SCROLL_PADDING = Math.floor(VISIBLE_COUNT / 2) * ITEM_HEIGHT;\n// Tilt off-center items so the column reads as a scrollable wheel — a gentle\n// dome, not the full iOS cylinder. Clamped to this many items each side.\nconst CURVE_CLAMP = 3;\n\nconst HOURS_12 = Array.from({ length: 12 }, (_, i) =>\n\tString(i + 1).padStart(2, \"0\"),\n);\nconst HOURS_24 = Array.from({ length: 24 }, (_, i) =>\n\tString(i).padStart(2, \"0\"),\n);\nconst MINUTES = Array.from({ length: 60 }, (_, i) =>\n\tString(i).padStart(2, \"0\"),\n);\nconst PERIODS = [\"AM\", \"PM\"] as const;\n\ntype Period = \"AM\" | \"PM\";\n\ninterface TimeValue {\n\thour: string;\n\tminute: string;\n\tperiod: Period | \"\";\n}\n\nfunction parseTimeString(\n\tvalue: string | undefined,\n\tformat: \"12h\" | \"24h\",\n): TimeValue {\n\tif (value) {\n\t\tif (format === \"12h\") {\n\t\t\tconst m = value.match(/^(\\d{1,2}):(\\d{2})\\s*(AM|PM)$/i);\n\t\t\tif (m) {\n\t\t\t\treturn {\n\t\t\t\t\thour: m[1].padStart(2, \"0\"),\n\t\t\t\t\tminute: m[2],\n\t\t\t\t\tperiod: m[3].toUpperCase() as Period,\n\t\t\t\t};\n\t\t\t}\n\t\t} else {\n\t\t\tconst m = value.match(/^(\\d{1,2}):(\\d{2})$/);\n\t\t\tif (m) {\n\t\t\t\treturn { hour: m[1].padStart(2, \"0\"), minute: m[2], period: \"\" };\n\t\t\t}\n\t\t}\n\t}\n\tconst now = new Date();\n\tif (format === \"12h\") {\n\t\tconst h = now.getHours();\n\t\treturn {\n\t\t\thour: String(h % 12 || 12).padStart(2, \"0\"),\n\t\t\tminute: String(now.getMinutes()).padStart(2, \"0\"),\n\t\t\tperiod: h >= 12 ? \"PM\" : \"AM\",\n\t\t};\n\t}\n\treturn {\n\t\thour: String(now.getHours()).padStart(2, \"0\"),\n\t\tminute: String(now.getMinutes()).padStart(2, \"0\"),\n\t\tperiod: \"\",\n\t};\n}\n\nfunction formatTimeValue(tv: TimeValue, format: \"12h\" | \"24h\"): string {\n\tif (format === \"12h\") return `${tv.hour}:${tv.minute} ${tv.period}`;\n\treturn `${tv.hour}:${tv.minute}`;\n}\n\n// ─── TimeColumn ────────────────────────────────────────────────────────────────\n\ninterface TimeColumnProps {\n\tlabel: string;\n\titems: readonly string[];\n\tvalue: string;\n\tonChange: (v: string) => void;\n}\n\nfunction TimeColumn({ label, items, value, onChange }: TimeColumnProps) {\n\tconst scrollRef = React.useRef<HTMLDivElement>(null);\n\tconst itemRefs = React.useRef<(HTMLButtonElement | null)[]>([]);\n\tconst [centerIndex, setCenterIndex] = React.useState(() =>\n\t\tMath.max(0, items.indexOf(value)),\n\t);\n\tconst isProgrammatic = React.useRef(false);\n\tconst onChangeRef = React.useRef(onChange);\n\tonChangeRef.current = onChange;\n\n\t// Tilt + fade each item by its distance from the viewport centre. Derived\n\t// purely from scrollTop (offset in item units), so it never fights layout.\n\tconst paintCurve = React.useCallback(() => {\n\t\tconst el = scrollRef.current;\n\t\tif (!el) return;\n\t\tconst offset = el.scrollTop / ITEM_HEIGHT;\n\t\titemRefs.current.forEach((node, index) => {\n\t\t\tif (!node) return;\n\t\t\tconst distance = index - offset;\n\t\t\tconst abs = Math.min(Math.abs(distance), CURVE_CLAMP);\n\t\t\tconst tilt = Math.max(Math.min(distance, CURVE_CLAMP), -CURVE_CLAMP);\n\t\t\tnode.style.opacity = String(Math.max(1 - abs * 0.28, 0.2));\n\t\t\tnode.style.transform = `perspective(280px) rotateX(${tilt * -20}deg) scale(${1 - abs * 0.04})`;\n\t\t});\n\t}, []);\n\n\t// Seed scroll position on mount (runs while the panel is visible, so the\n\t// layout-based scrollTop sticks even mid open-animation).\n\t// biome-ignore lint/correctness/useExhaustiveDependencies: mount-only seed from the initial index.\n\tReact.useEffect(() => {\n\t\tconst el = scrollRef.current;\n\t\tif (!el) return;\n\t\tisProgrammatic.current = true;\n\t\tel.scrollTop = centerIndex * ITEM_HEIGHT;\n\t\tpaintCurve();\n\t\trequestAnimationFrame(() => {\n\t\t\tisProgrammatic.current = false;\n\t\t});\n\t}, []);\n\n\t// Re-centre when the value prop changes from outside (not our own scroll).\n\t// biome-ignore lint/correctness/useExhaustiveDependencies: only re-sync on external value changes.\n\tReact.useEffect(() => {\n\t\tconst idx = items.indexOf(value);\n\t\tif (idx === -1 || idx === centerIndex) return;\n\t\tsetCenterIndex(idx);\n\t\tconst el = scrollRef.current;\n\t\tif (!el) return;\n\t\tisProgrammatic.current = true;\n\t\tel.scrollTo({ top: idx * ITEM_HEIGHT, behavior: \"smooth\" });\n\t\tsetTimeout(() => {\n\t\t\tisProgrammatic.current = false;\n\t\t\tpaintCurve();\n\t\t}, 320);\n\t}, [value]);\n\n\t// Clicking an item commits immediately; the smooth scroll that follows is\n\t// cosmetic, so an Apply click mid-animation still reads the chosen value.\n\tfunction selectIndex(index: number) {\n\t\tconst el = scrollRef.current;\n\t\tif (!el) return;\n\t\tisProgrammatic.current = true;\n\t\tsetCenterIndex(index);\n\t\tonChangeRef.current(items[index]);\n\t\tel.scrollTo({ top: index * ITEM_HEIGHT, behavior: \"smooth\" });\n\t\tsetTimeout(() => {\n\t\t\tisProgrammatic.current = false;\n\t\t}, 350);\n\t}\n\n\t// Commit as soon as the centred item changes — no settle debounce, so an\n\t// Apply click mid-scroll can never read a stale value. Scroll-snap on the\n\t// container guarantees the wheel always rests exactly on an item.\n\tfunction handleScroll() {\n\t\tpaintCurve();\n\t\tif (isProgrammatic.current) return;\n\t\tconst el = scrollRef.current;\n\t\tif (!el) return;\n\t\tconst idx = Math.max(\n\t\t\t0,\n\t\t\tMath.min(Math.round(el.scrollTop / ITEM_HEIGHT), items.length - 1),\n\t\t);\n\t\tif (idx !== centerIndex) {\n\t\t\tsetCenterIndex(idx);\n\t\t\tonChangeRef.current(items[idx]);\n\t\t}\n\t}\n\n\treturn (\n\t\t<div className=\"relative\">\n\t\t\t{/* iOS-style fixed highlight: the pill never moves, items scroll into it. */}\n\t\t\t<div\n\t\t\t\taria-hidden\n\t\t\t\tstyle={{ height: `${ITEM_HEIGHT - 4}px` }}\n\t\t\t\tclassName=\"pointer-events-none absolute inset-x-0.5 top-1/2 -translate-y-1/2 rounded-full bg-action-primary\"\n\t\t\t/>\n\t\t\t<div\n\t\t\t\tref={scrollRef}\n\t\t\t\tonScroll={handleScroll}\n\t\t\t\trole=\"listbox\"\n\t\t\t\taria-label={label}\n\t\t\t\tstyle={{ height: `${VISIBLE_COUNT * ITEM_HEIGHT}px` }}\n\t\t\t\tclassName=\"relative snap-y snap-mandatory overflow-y-scroll overscroll-contain [scrollbar-width:none] [&::-webkit-scrollbar]:hidden\"\n\t\t\t>\n\t\t\t\t<div\n\t\t\t\t\tstyle={{\n\t\t\t\t\t\tpaddingTop: `${SCROLL_PADDING}px`,\n\t\t\t\t\t\tpaddingBottom: `${SCROLL_PADDING}px`,\n\t\t\t\t\t}}\n\t\t\t\t>\n\t\t\t\t\t{items.map((item, index) => {\n\t\t\t\t\t\tconst dist = Math.abs(index - centerIndex);\n\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\trole=\"option\"\n\t\t\t\t\t\t\t\taria-selected={index === centerIndex}\n\t\t\t\t\t\t\t\t// Roving tabindex: only the centred item is tabbable, so the\n\t\t\t\t\t\t\t\t// popover's initial focus lands on an already-visible button\n\t\t\t\t\t\t\t\t// instead of scrolling the wheel to its first item.\n\t\t\t\t\t\t\t\ttabIndex={index === centerIndex ? 0 : -1}\n\t\t\t\t\t\t\t\tkey={item}\n\t\t\t\t\t\t\t\tref={(node) => {\n\t\t\t\t\t\t\t\t\titemRefs.current[index] = node;\n\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\tonClick={() => selectIndex(index)}\n\t\t\t\t\t\t\t\tstyle={{ height: `${ITEM_HEIGHT}px` }}\n\t\t\t\t\t\t\t\tclassName=\"flex w-full cursor-pointer snap-center items-center justify-center select-none will-change-transform\"\n\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\tclassName={cn(\n\t\t\t\t\t\t\t\t\t\t\"text-gdt-sm font-medium transition-colors\",\n\t\t\t\t\t\t\t\t\t\tdist === 0\n\t\t\t\t\t\t\t\t\t\t\t? \"text-fg-on-brand\"\n\t\t\t\t\t\t\t\t\t\t\t: dist === 1\n\t\t\t\t\t\t\t\t\t\t\t\t? \"text-fg-secondary\"\n\t\t\t\t\t\t\t\t\t\t\t\t: \"text-fg-caption-placeholder\",\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{item}\n\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t);\n\t\t\t\t\t})}\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\t);\n}\n\n// ─── TimePicker ───────────────────────────────────────────────────────────────\n\ninterface TimePickerProps {\n\tvalue?: string;\n\tonChange?: (time: string | undefined) => void;\n\tformat?: \"12h\" | \"24h\";\n\tdisabled?: boolean;\n\tplaceholder?: string;\n\tclassName?: string;\n}\n\nfunction TimePicker({\n\tvalue,\n\tonChange,\n\tformat = \"12h\",\n\tdisabled = false,\n\tplaceholder = \"Select time\",\n\tclassName,\n}: TimePickerProps) {\n\tconst [open, setOpen] = React.useState(false);\n\tconst [pending, setPending] = React.useState<TimeValue>(() =>\n\t\tparseTimeString(value, format),\n\t);\n\n\tfunction handleOpenChange(next: boolean) {\n\t\tif (next) setPending(parseTimeString(value, format));\n\t\tsetOpen(next);\n\t}\n\n\tconst columns = [\n\t\t{ key: \"Hour\", show: true },\n\t\t{ key: \"Minute\", show: true },\n\t\t{ key: \"Period\", show: format === \"12h\" },\n\t].filter((c) => c.show);\n\n\treturn (\n\t\t<Popover open={open} onOpenChange={handleOpenChange}>\n\t\t\t<PickerTrigger\n\t\t\t\ticon={ClockIcon}\n\t\t\t\tdisplayValue={value ?? \"\"}\n\t\t\t\tplaceholder={placeholder}\n\t\t\t\tdisabled={disabled}\n\t\t\t\topen={open}\n\t\t\t\tclassName={className}\n\t\t\t/>\n\t\t\t<PopoverContent\n\t\t\t\tshowArrow={false}\n\t\t\t\talign=\"start\"\n\t\t\t\tclassName=\"min-w-(--anchor-width) gap-0 overflow-hidden rounded-2xl p-0\"\n\t\t\t>\n\t\t\t\t<div className=\"flex w-full items-center justify-center gap-2 border-b border-line-subtle\">\n\t\t\t\t\t{columns.map((column) => (\n\t\t\t\t\t\t<p\n\t\t\t\t\t\t\tkey={column.key}\n\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\"py-3 text-center text-gdt-xs text-fg-caption-placeholder\",\n\t\t\t\t\t\t\t\tformat === \"12h\" ? \"w-20.5\" : \"w-31\",\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{column.key}\n\t\t\t\t\t\t</p>\n\t\t\t\t\t))}\n\t\t\t\t</div>\n\t\t\t\t<div\n\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\"flex justify-center gap-2 px-3 pt-2\",\n\t\t\t\t\t\tformat === \"12h\" ? \"*:w-20.5\" : \"*:w-31\",\n\t\t\t\t\t)}\n\t\t\t\t>\n\t\t\t\t\t<TimeColumn\n\t\t\t\t\t\tlabel=\"Hour\"\n\t\t\t\t\t\titems={format === \"12h\" ? HOURS_12 : HOURS_24}\n\t\t\t\t\t\tvalue={pending.hour}\n\t\t\t\t\t\tonChange={(hour) => setPending((prev) => ({ ...prev, hour }))}\n\t\t\t\t\t/>\n\t\t\t\t\t<TimeColumn\n\t\t\t\t\t\tlabel=\"Minute\"\n\t\t\t\t\t\titems={MINUTES}\n\t\t\t\t\t\tvalue={pending.minute}\n\t\t\t\t\t\tonChange={(minute) => setPending((prev) => ({ ...prev, minute }))}\n\t\t\t\t\t/>\n\t\t\t\t\t{format === \"12h\" && (\n\t\t\t\t\t\t<TimeColumn\n\t\t\t\t\t\t\tlabel=\"Period\"\n\t\t\t\t\t\t\titems={PERIODS}\n\t\t\t\t\t\t\tvalue={pending.period}\n\t\t\t\t\t\t\tonChange={(period) =>\n\t\t\t\t\t\t\t\tsetPending((prev) => ({ ...prev, period: period as Period }))\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t/>\n\t\t\t\t\t)}\n\t\t\t\t</div>\n\t\t\t\t<div className=\"mt-2 w-full\">\n\t\t\t\t\t<PickerFooter\n\t\t\t\t\t\tsecondaryLabel=\"Cancel\"\n\t\t\t\t\t\tonSecondary={() => setOpen(false)}\n\t\t\t\t\t\tonApply={() => {\n\t\t\t\t\t\t\tonChange?.(formatTimeValue(pending, format));\n\t\t\t\t\t\t\tsetOpen(false);\n\t\t\t\t\t\t}}\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t</PopoverContent>\n\t\t</Popover>\n\t);\n}\n\nexport { TimePicker };\nexport type { TimePickerProps };\n"],"mappings":"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","names":[]}
|
package/dist/toast.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/toast.tsx"],"sourcesContent":["import type {\n\tToastManagerAddOptions,\n\tToastManagerUpdateOptions,\n\tToastObject,\n} from \"@base-ui/react/toast\";\nimport { Toast as BaseToast } from \"@base-ui/react/toast\";\nimport { Check, Info, X } from \"lucide-react\";\nimport type { CSSProperties, PropsWithChildren } from \"react\";\nimport { Button } from \"./button\";\nimport { cn } from \"./lib/cn\";\n\ntype ToastVariant = \"success\" | \"info\" | \"warning\" | \"error\" | \"loading\";\ntype ResolvedToastSide = \"top\" | \"bottom\" | \"left\" | \"right\";\ntype ToastAlign = \"start\" | \"center\" | \"end\";\ntype ToastPlacement = {\n\tside: ResolvedToastSide;\n\talign: ToastAlign;\n\tkey: string;\n};\ntype ToastRootStyle = CSSProperties &\n\tRecord<\n\t\t| \"--toast-placement-index\"\n\t\t| \"--toast-placement-offset-y\"\n\t\t| \"--toast-placement-frontmost-height\",\n\t\tstring | number | undefined\n\t>;\n\ntype ToastData = {\n\ttype: ToastVariant;\n};\n\nconst DEFAULT_TOAST_SIDE = \"top\";\nconst DEFAULT_TOAST_ALIGN = \"end\";\ntype ToastSide = NonNullable<\n\tToastObject<{ type?: ToastVariant }>[\"positionerProps\"]\n>[\"side\"];\n\nexport const toastManager = BaseToast.createToastManager();\n\nexport const toast = Object.assign(\n\t(options: ToastManagerAddOptions<ToastData>) => toastManager.add(options),\n\t{\n\t\tsuccess: (options: ToastManagerAddOptions<ToastData>) =>\n\t\t\ttoastManager.add({\n\t\t\t\t...options,\n\t\t\t\tdata: { type: \"success\", ...options.data },\n\t\t\t}),\n\t\tinfo: (options: ToastManagerAddOptions<ToastData>) =>\n\t\t\ttoastManager.add({\n\t\t\t\t...options,\n\t\t\t\tdata: { type: \"info\", ...options.data },\n\t\t\t}),\n\t\twarning: (options: ToastManagerAddOptions<ToastData>) =>\n\t\t\ttoastManager.add({\n\t\t\t\t...options,\n\t\t\t\tdata: { type: \"warning\", ...options.data },\n\t\t\t}),\n\t\terror: (options: ToastManagerAddOptions<ToastData>) =>\n\t\t\ttoastManager.add({\n\t\t\t\t...options,\n\t\t\t\tdata: { type: \"error\", ...options.data },\n\t\t\t}),\n\t\tloading: (options: ToastManagerAddOptions<ToastData>) =>\n\t\t\ttoastManager.add({\n\t\t\t\t...options,\n\t\t\t\tdata: { type: \"loading\", ...options.data },\n\t\t\t}),\n\t\tdismiss: (toastId?: string | number) =>\n\t\t\ttoastManager.close(toastId?.toString()),\n\t\tupdate: (\n\t\t\ttoastId: string | number,\n\t\t\toptions: ToastManagerUpdateOptions<ToastData>,\n\t\t) => toastManager.update(toastId.toString(), options),\n\t\tpromise: toastManager.promise,\n\t},\n);\n\nexport function ToastProvider({ children }: PropsWithChildren) {\n\treturn (\n\t\t<BaseToast.Provider limit={4} timeout={5000} toastManager={toastManager}>\n\t\t\t{children}\n\t\t\t<BaseToast.Portal>\n\t\t\t\t<BaseToast.Viewport className=\"fixed inset-0 z-9999 pointer-events-none outline-none\">\n\t\t\t\t\t<ToastList />\n\t\t\t\t</BaseToast.Viewport>\n\t\t\t</BaseToast.Portal>\n\t\t</BaseToast.Provider>\n\t);\n}\n\nfunction ToastList() {\n\tconst { toasts } = BaseToast.useToastManager<ToastData>();\n\tconst placementStacks = new Map<\n\t\tstring,\n\t\t{\n\t\t\tdomIndex: number;\n\t\t\tvisibleIndex: number;\n\t\t\toffsetY: number;\n\t\t\tfrontmostHeight?: number;\n\t\t}\n\t>();\n\n\treturn toasts.map((item) => {\n\t\tconst placement = getToastPlacement(item);\n\t\tconst stack = placementStacks.get(placement.key) ?? {\n\t\t\tdomIndex: 0,\n\t\t\tvisibleIndex: 0,\n\t\t\toffsetY: 0,\n\t\t\tfrontmostHeight: item.height,\n\t\t};\n\t\tconst placementIndex =\n\t\t\titem.transitionStatus === \"ending\" ? stack.domIndex : stack.visibleIndex;\n\t\tconst style: ToastRootStyle = {\n\t\t\t\"--toast-placement-index\": placementIndex,\n\t\t\t\"--toast-placement-offset-y\": `${stack.offsetY}px`,\n\t\t\t\"--toast-placement-frontmost-height\": stack.frontmostHeight\n\t\t\t\t? `${stack.frontmostHeight}px`\n\t\t\t\t: undefined,\n\t\t};\n\n\t\tstack.offsetY += item.height ?? 0;\n\t\tstack.domIndex += 1;\n\t\tif (item.transitionStatus !== \"ending\") {\n\t\t\tstack.visibleIndex += 1;\n\t\t}\n\t\tplacementStacks.set(placement.key, stack);\n\n\t\treturn (\n\t\t\t<BaseToast.Root\n\t\t\t\tkey={item.id}\n\t\t\t\ttoast={item}\n\t\t\t\tclassName={cn(\n\t\t\t\t\ttoastRootBaseClassName,\n\t\t\t\t\tgetToastPositionClassName(placement),\n\t\t\t\t\tgetToastStackClassName(placement),\n\t\t\t\t\tgetToastExitClassName(placement.side),\n\t\t\t\t)}\n\t\t\t\tswipeDirection={getSwipeDirections(item)}\n\t\t\t\tstyle={style}\n\t\t\t>\n\t\t\t\t<BaseToast.Content\n\t\t\t\t\tclassName={\n\t\t\t\t\t\t\"grid grid-cols-[16px_minmax(0,1fr)_24px] items-start gap-3 overflow-hidden px-2.5 py-3.5 pl-3 transition-opacity duration-250 data-behind:pointer-events-none data-behind:opacity-0 data-expanded:pointer-events-auto data-expanded:opacity-100\"\n\t\t\t\t\t}\n\t\t\t\t>\n\t\t\t\t\t<ToastIcon type={item.data?.type} />\n\t\t\t\t\t<div className=\"min-w-0 flex flex-col gap-1.5\">\n\t\t\t\t\t\t{item.title ? (\n\t\t\t\t\t\t\t<BaseToast.Title className=\"text-gdt-sm font-semibold text-fg-primary\" />\n\t\t\t\t\t\t) : null}\n\t\t\t\t\t\t{item.description ? (\n\t\t\t\t\t\t\t<BaseToast.Description className=\"text-gdt-sm text-fg-secondary\" />\n\t\t\t\t\t\t) : null}\n\t\t\t\t\t\t<BaseToast.Action\n\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\"cursor-pointer border-0 bg-transparent p-0 font-inherit text-gdt-sm font-semibold inline-flex w-fit items-center hover:underline underline-offset-2\",\n\t\t\t\t\t\t\t\titem.data?.type === \"success\" && \"text-fg-brand\",\n\t\t\t\t\t\t\t\titem.data?.type === \"info\" && \"text-fg-primary\",\n\t\t\t\t\t\t\t\titem.data?.type === \"warning\" && \"text-fg-accent\",\n\t\t\t\t\t\t\t\titem.data?.type === \"error\" && \"text-fg-danger\",\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t/>\n\t\t\t\t\t</div>\n\t\t\t\t\t<BaseToast.Close\n\t\t\t\t\t\trender={<Button variant=\"ghost\" size=\"icon-xs\" />}\n\t\t\t\t\t\taria-label=\"Close toast\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<X className=\"size-4\" />\n\t\t\t\t\t</BaseToast.Close>\n\t\t\t\t</BaseToast.Content>\n\t\t\t</BaseToast.Root>\n\t\t);\n\t});\n}\n\nfunction ToastIcon({ type }: { type?: ToastVariant }) {\n\tif (!type) return null;\n\treturn (\n\t\t<span\n\t\t\tclassName={cn(\n\t\t\t\t\"inline-flex size-5 items-center justify-center rounded-full text-canvas\",\n\t\t\t\ttype === \"success\" && \"bg-status-success\",\n\t\t\t\ttype === \"info\" && \"bg-status-info\",\n\t\t\t\ttype === \"warning\" && \"bg-status-warning text-fg-on-accent\",\n\t\t\t\ttype === \"error\" && \"bg-status-danger\",\n\t\t\t)}\n\t\t\taria-hidden=\"true\"\n\t\t>\n\t\t\t{type === \"success\" ? <Check size={10} strokeWidth={3} /> : null}\n\t\t\t{type === \"info\" ? <Info size={11} strokeWidth={2.8} /> : null}\n\t\t\t{type === \"warning\" ? (\n\t\t\t\t<span className=\"text-[11px] leading-none font-extrabold\">!</span>\n\t\t\t) : null}\n\t\t\t{type === \"error\" ? <X size={10} strokeWidth={3} /> : null}\n\t\t</span>\n\t);\n}\n\nconst toastRootBaseClassName =\n\t\"[--gap:12px] [--peek:12px] [--anchor-x:0px] [--anchor-y:0px] [--scale:calc(max(0,1-(var(--toast-placement-index)*0.04)))] [--shrink:calc(1-var(--scale))] [--height:var(--toast-placement-frontmost-height,var(--toast-height))] absolute z-[calc(1000-var(--toast-placement-index))] h-[var(--height)] min-h-[var(--height)] w-[min(335px,calc(100vw-32px))] overflow-visible rounded-lg border border-line bg-surface-overlay text-fg-primary shadow-[var(--elevation-e2-shadow)] pointer-events-auto select-none [transform:translateX(calc(var(--anchor-x)+var(--toast-swipe-movement-x,0px)))_translateY(var(--collapsed-y))_scale(var(--scale))] [transition:transform_500ms_cubic-bezier(0.22,1,0.36,1),opacity_500ms,height_150ms] after:absolute after:left-0 after:h-[calc(var(--gap)+1px)] after:w-full after:pointer-events-auto after:content-[''] data-[expanded]:h-[var(--toast-height)] data-[expanded]:[transform:translateX(calc(var(--anchor-x)+var(--toast-swipe-movement-x,0px)))_translateY(var(--expanded-y))_scale(1)] data-[starting-style]:opacity-0 data-[starting-style]:[transform:translateX(var(--exit-x))_translateY(var(--exit-y))_scale(var(--scale))] data-[ending-style]:opacity-0 data-[limited]:opacity-0 [&[data-ending-style]:not([data-limited]):not([data-swipe-direction])]:[transform:translateX(var(--exit-x))_translateY(var(--exit-y))_scale(var(--scale))] data-[ending-style]:data-[swipe-direction=up]:[transform:translateX(calc(var(--anchor-x)+var(--toast-swipe-movement-x,0px)))_translateY(calc(var(--anchor-y)+var(--toast-swipe-movement-y)-150%))_scale(var(--scale))] data-[expanded]:data-[ending-style]:data-[swipe-direction=up]:[transform:translateX(calc(var(--anchor-x)+var(--toast-swipe-movement-x,0px)))_translateY(calc(var(--anchor-y)+var(--toast-swipe-movement-y)-150%))_scale(1)] data-[ending-style]:data-[swipe-direction=down]:[transform:translateX(calc(var(--anchor-x)+var(--toast-swipe-movement-x,0px)))_translateY(calc(var(--anchor-y)+var(--toast-swipe-movement-y)+150%))_scale(var(--scale))] data-[expanded]:data-[ending-style]:data-[swipe-direction=down]:[transform:translateX(calc(var(--anchor-x)+var(--toast-swipe-movement-x,0px)))_translateY(calc(var(--anchor-y)+var(--toast-swipe-movement-y)+150%))_scale(1)] data-[ending-style]:data-[swipe-direction=left]:[transform:translateX(calc(var(--anchor-x)+var(--toast-swipe-movement-x,0px)-150%))_translateY(var(--expanded-y))_scale(var(--scale))] data-[expanded]:data-[ending-style]:data-[swipe-direction=left]:[transform:translateX(calc(var(--anchor-x)+var(--toast-swipe-movement-x,0px)-150%))_translateY(var(--expanded-y))_scale(1)] data-[ending-style]:data-[swipe-direction=right]:[transform:translateX(calc(var(--anchor-x)+var(--toast-swipe-movement-x,0px)+150%))_translateY(var(--expanded-y))_scale(var(--scale))] data-[expanded]:data-[ending-style]:data-[swipe-direction=right]:[transform:translateX(calc(var(--anchor-x)+var(--toast-swipe-movement-x,0px)+150%))_translateY(var(--expanded-y))_scale(1)]\";\n\nfunction getToastPlacement(\n\titem: ToastObject<{ type?: ToastVariant }>,\n\tisRtl = false,\n): ToastPlacement {\n\tconst side = item.positionerProps?.side ?? DEFAULT_TOAST_SIDE;\n\tconst align = (item.positionerProps?.align ??\n\t\tDEFAULT_TOAST_ALIGN) as ToastAlign;\n\tconst resolvedSide = resolveToastSide(side, isRtl);\n\n\treturn {\n\t\tside: resolvedSide,\n\t\talign,\n\t\tkey: `${resolvedSide}:${align}`,\n\t};\n}\n\nfunction resolveToastSide(\n\tside: ToastSide | undefined,\n\tisRtl: boolean,\n): ResolvedToastSide {\n\tif (side === \"inline-end\") return isRtl ? \"left\" : \"right\";\n\tif (side === \"inline-start\") return isRtl ? \"right\" : \"left\";\n\tif (\n\t\tside === \"top\" ||\n\t\tside === \"bottom\" ||\n\t\tside === \"left\" ||\n\t\tside === \"right\"\n\t) {\n\t\treturn side;\n\t}\n\treturn DEFAULT_TOAST_SIDE;\n}\n\nfunction getToastPositionClassName({ side, align }: ToastPlacement) {\n\tconst isVerticalSide = side === \"top\" || side === \"bottom\";\n\n\tif (isVerticalSide) {\n\t\treturn cn(\n\t\t\tside === \"top\" && \"top-6 max-sm:top-4\",\n\t\t\tside === \"bottom\" && \"bottom-6 max-sm:bottom-4\",\n\t\t\talign === \"start\" && \"left-6 origin-top-left max-sm:left-4\",\n\t\t\talign === \"center\" && \"left-1/2 origin-top [--anchor-x:-50%]\",\n\t\t\talign === \"end\" && \"right-6 origin-top-right max-sm:right-4\",\n\t\t\tside === \"bottom\" && align === \"start\" && \"origin-bottom-left\",\n\t\t\tside === \"bottom\" && align === \"center\" && \"origin-bottom\",\n\t\t\tside === \"bottom\" && align === \"end\" && \"origin-bottom-right\",\n\t\t);\n\t}\n\n\treturn cn(\n\t\tside === \"left\" && \"left-6 origin-left max-sm:left-4\",\n\t\tside === \"right\" && \"right-6 origin-right max-sm:right-4\",\n\t\talign === \"start\" && \"top-6 max-sm:top-4\",\n\t\talign === \"center\" && \"top-1/2 [--anchor-y:-50%]\",\n\t\talign === \"end\" && \"bottom-6 max-sm:bottom-4\",\n\t\tside === \"left\" && align === \"start\" && \"origin-top-left\",\n\t\tside === \"left\" && align === \"end\" && \"origin-bottom-left\",\n\t\tside === \"right\" && align === \"start\" && \"origin-top-right\",\n\t\tside === \"right\" && align === \"end\" && \"origin-bottom-right\",\n\t);\n}\n\nfunction getToastStackClassName({ side, align }: ToastPlacement) {\n\tconst stacksUp =\n\t\tside === \"bottom\" ||\n\t\t((side === \"left\" || side === \"right\") && align === \"end\");\n\n\tif (stacksUp) {\n\t\treturn \"after:bottom-full [--expanded-y:calc(var(--anchor-y)+var(--toast-swipe-movement-y)-var(--toast-placement-offset-y)-(var(--toast-placement-index)*var(--gap)))] [--collapsed-y:calc(var(--anchor-y)+var(--toast-swipe-movement-y)-(var(--toast-placement-index)*var(--peek))-(var(--shrink)*var(--height)))]\";\n\t}\n\n\treturn \"after:top-full [--expanded-y:calc(var(--anchor-y)+var(--toast-placement-offset-y)+(var(--toast-placement-index)*var(--gap))+var(--toast-swipe-movement-y))] [--collapsed-y:calc(var(--anchor-y)+var(--toast-swipe-movement-y)+(var(--toast-placement-index)*var(--peek))+(var(--shrink)*var(--height)))]\";\n}\n\nfunction getToastExitClassName(side: ResolvedToastSide) {\n\tif (side === \"bottom\") {\n\t\treturn \"[--exit-x:calc(var(--anchor-x)+24px)] [--exit-y:calc(var(--anchor-y)+150%)]\";\n\t}\n\tif (side === \"left\") {\n\t\treturn \"[--exit-x:calc(var(--anchor-x)-150%)] [--exit-y:var(--anchor-y)]\";\n\t}\n\tif (side === \"right\") {\n\t\treturn \"[--exit-x:calc(var(--anchor-x)+150%)] [--exit-y:var(--anchor-y)]\";\n\t}\n\treturn \"[--exit-x:calc(var(--anchor-x)+24px)] [--exit-y:calc(var(--anchor-y)-150%)]\";\n}\n\ntype SwipeDirection = \"up\" | \"down\" | \"left\" | \"right\";\nfunction getSwipeDirections(\n\titem: ToastObject<{ type?: ToastVariant }>,\n\tisRtl = false,\n) {\n\tconst { side: resolvedSide, align } = getToastPlacement(item, isRtl);\n\tconst primary: SwipeDirection =\n\t\tresolvedSide === \"top\"\n\t\t\t? \"up\"\n\t\t\t: resolvedSide === \"bottom\"\n\t\t\t\t? \"down\"\n\t\t\t\t: resolvedSide === \"left\"\n\t\t\t\t\t? \"left\"\n\t\t\t\t\t: /* right */ \"right\";\n\tif (align === \"center\") return primary;\n\tconst isVerticalSide = resolvedSide === \"top\" || resolvedSide === \"bottom\";\n\tconst secondary: SwipeDirection = isVerticalSide\n\t\t? align === \"start\"\n\t\t\t? \"left\"\n\t\t\t: \"right\"\n\t\t: align === \"start\"\n\t\t\t? \"up\"\n\t\t\t: \"down\";\n\treturn [primary, secondary];\n}\n"],"mappings":"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","names":[]}
|
package/dist/tooltip.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
|
package/dist/tree-map.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/tree-map.tsx"],"sourcesContent":["\"use client\";\n\nimport { cva } from \"class-variance-authority\";\nimport type * as React from \"react\";\nimport { Treemap as RechartsTreemap, type TreemapNode } from \"recharts\";\nimport {\n\tChartCard,\n\ttype ChartConfig,\n\tChartContainer,\n\tChartDescription,\n\tChartHeader,\n\tChartTitle,\n\tChartTooltip,\n\tChartTooltipContent,\n\ttype ChartValueType,\n} from \"./chart\";\nimport { cn } from \"./lib/cn\";\nimport { type ComponentSize, useComponentSize } from \"./size-context\";\n\n/**\n * A treemap — part-to-whole composition drawn as proportionally sized, nested\n * rectangles. Reach for one to compare category shares at a glance (portfolio\n * mix, holdings by type, regional distribution).\n *\n * Two shapes share one component: `flat` lays out a single level of categories;\n * `nested` groups subcategories beneath a shared group colour (each leaf inherits\n * its group's colour unless it sets its own `fill`). Both reuse the same palette,\n * in-tile labels, legend, frame, and tooltip — only the data depth differs.\n *\n * Per the chart architecture the recharts `Treemap` primitive is rendered\n * directly here; only the giddaa frame, palette, tile content, and legend are\n * supplied around it. Tiles are sized by `value`; the in-tile label (name + share\n * of the whole) is hidden on tiles too small to fit it.\n *\n * @example\n * <TreeMap\n * data={[\n * { label: \"Lekki\", value: 40 },\n * { label: \"Ikoyi\", value: 30 },\n * { label: \"V.I.\", value: 18 },\n * { label: \"Yaba\", value: 12 },\n * ]}\n * title=\"Portfolio mix\"\n * description=\"Share of holdings by location\"\n * tooltip\n * />\n *\n * @example\n * // Nested — subcategories grouped under a shared group colour\n * <TreeMap\n * data={[\n * { label: \"Residential\", children: [\n * { label: \"Apartments\", value: 27 },\n * { label: \"Duplexes\", value: 21 },\n * ] },\n * { label: \"Commercial\", children: [\n * { label: \"Offices\", value: 17 },\n * { label: \"Retail\", value: 13 },\n * ] },\n * { label: \"Land\", children: [{ label: \"Plots\", value: 14 }] },\n * ]}\n * title=\"Portfolio mix\"\n * description=\"Holdings by category & type\"\n * />\n */\n\n/** Treemap sizes line up with the three shared `ComponentSize` values. */\ntype TreeMapSize = ComponentSize;\n\n/** Where the colour-key legend sits relative to the plot. */\ntype TreeMapLegendPlacement = \"right\" | \"bottom\";\n\ntype TreeMapDatum = {\n\t/** Category name, shown in the tile label, legend, and tooltip. */\n\tlabel: string;\n\t/** Tile value — drives the tile's area. Omit on a group with `children`. */\n\tvalue?: number;\n\t/** Tile/group colour; defaults to the palette in order. Leaves inherit it. */\n\tfill?: string;\n\t/** Subcategories for a `nested` treemap. */\n\tchildren?: TreeMapDatum[];\n};\n\n/**\n * Tile palette, ordered by share: forest → brass → moss → clay → stone. Each\n * entry pairs a tile `fill` with the `text` colour that reads on it (a tonal\n * tint of the same scale). Giddaa has no `chart-1`…`chart-N` tokens yet, so these\n * map to the brand scales; assign by order, or override per datum with `fill`.\n */\nconst TREE_MAP_PALETTE = [\n\t{ fill: \"var(--color-forest-700)\", text: \"var(--color-forest-100)\" },\n\t{ fill: \"var(--color-brass-500)\", text: \"var(--color-brass-900)\" },\n\t{ fill: \"var(--color-moss-600)\", text: \"var(--color-moss-100)\" },\n\t{ fill: \"var(--color-clay-500)\", text: \"var(--color-clay-50)\" },\n\t{ fill: \"var(--color-stone-500)\", text: \"var(--color-stone-50)\" },\n] as const;\n\ntype TreeMapLayout = {\n\t/** Plot box height in px. Width stays fluid via the ResponsiveContainer. */\n\theight: number;\n\t/** Inset around every tile in px — straddles edges to read as a gap. */\n\tgap: number;\n\t/** Tile corner radius in px. */\n\tradius: number;\n\t/** Tile label padding from the top-left corner in px. */\n\tlabelPadding: number;\n\t/** Tile label (name) font size in px. */\n\tnameFontSize: number;\n\t/** Tile label (share) font size in px. */\n\tshareFontSize: number;\n\t/** Smallest tile width/height in px that still shows its label. */\n\tlabelMinSide: number;\n};\n\nconst TREE_MAP_LAYOUT: Record<TreeMapSize, TreeMapLayout> = {\n\tsm: {\n\t\theight: 180,\n\t\tgap: 3,\n\t\tradius: 4,\n\t\tlabelPadding: 8,\n\t\tnameFontSize: 11,\n\t\tshareFontSize: 10,\n\t\tlabelMinSide: 44,\n\t},\n\tmd: {\n\t\theight: 240,\n\t\tgap: 4,\n\t\tradius: 6,\n\t\tlabelPadding: 10,\n\t\tnameFontSize: 12,\n\t\tshareFontSize: 11,\n\t\tlabelMinSide: 52,\n\t},\n\tlg: {\n\t\theight: 300,\n\t\tgap: 5,\n\t\tradius: 8,\n\t\tlabelPadding: 12,\n\t\tnameFontSize: 14,\n\t\tshareFontSize: 12,\n\t\tlabelMinSide: 60,\n\t},\n};\n\n/** Vertical legend column / value list — shared with the right-hand legend. */\nconst treeMapLegendVariants = cva(\"flex min-w-0\", {\n\tvariants: {\n\t\tplacement: {\n\t\t\tright: \"flex-col\",\n\t\t\tbottom: \"flex-row flex-wrap items-center\",\n\t\t},\n\t\tsize: {\n\t\t\tsm: \"text-gdt-xs\",\n\t\t\tmd: \"text-gdt-sm\",\n\t\t\tlg: \"text-gdt-sm\",\n\t\t},\n\t},\n\tcompoundVariants: [\n\t\t{ placement: \"right\", size: \"sm\", className: \"gap-2\" },\n\t\t{ placement: \"right\", size: \"md\", className: \"gap-3\" },\n\t\t{ placement: \"right\", size: \"lg\", className: \"gap-3.5\" },\n\t\t{ placement: \"bottom\", className: \"gap-x-4 gap-y-2\" },\n\t],\n\tdefaultVariants: { placement: \"right\", size: \"md\" },\n});\n\nconst treeMapLegendDotVariants = 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\n/** A tile / group resolved with its palette colours, ready to render. */\ntype ResolvedDatum = {\n\tlabel: string;\n\tvalue?: number;\n\tfill: string;\n\ttext: string;\n\tchildren?: ResolvedDatum[];\n};\n\n/**\n * Walk the data, assigning each top-level entry a palette colour (by order) that\n * its leaves inherit, and summing the leaf values into a grand total. Top-level\n * entries become the legend keys: tiles in `flat`, groups in `nested`.\n */\nfunction resolveData(data: TreeMapDatum[]): {\n\tresolved: ResolvedDatum[];\n\ttotal: number;\n} {\n\tlet total = 0;\n\n\tconst resolve = (\n\t\tdatum: TreeMapDatum,\n\t\tpalette: { fill: string; text: string },\n\t): ResolvedDatum => {\n\t\tconst fill = datum.fill ?? palette.fill;\n\t\tconst text = palette.text;\n\n\t\tif (datum.children?.length) {\n\t\t\treturn {\n\t\t\t\tlabel: datum.label,\n\t\t\t\tfill,\n\t\t\t\ttext,\n\t\t\t\tchildren: datum.children.map((child) => resolve(child, { fill, text })),\n\t\t\t};\n\t\t}\n\n\t\ttotal += datum.value ?? 0;\n\t\treturn { label: datum.label, value: datum.value, fill, text };\n\t};\n\n\tconst resolved = data.map((datum, i) =>\n\t\tresolve(datum, TREE_MAP_PALETTE[i % TREE_MAP_PALETTE.length]),\n\t);\n\n\treturn { resolved, total };\n}\n\ntype TreeMapProps = Omit<\n\tReact.ComponentProps<typeof ChartCard>,\n\t\"size\" | \"children\"\n> & {\n\t/** Categories — flat leaves, or groups carrying `children` (nested). */\n\tdata: TreeMapDatum[];\n\t/** Explicit size; otherwise inherited from the nearest `SizeProvider`. */\n\tsize?: TreeMapSize;\n\t/** Chart heading. Omit to hide the title. */\n\ttitle?: React.ReactNode;\n\t/** Supporting metadata (period, source). Omit to hide the description. */\n\tdescription?: React.ReactNode;\n\t/** Enable the hover value tooltip. Default false. */\n\ttooltip?: boolean;\n\t/** Legend placement — a right column or a wrapped bottom row. Default right. */\n\tlegend?: TreeMapLegendPlacement;\n\t/** Format the tile value in the tooltip. Defaults to a localised number. */\n\tvalueFormatter?: (value: number) => string;\n\t/** Value formatting for the tooltip. Defaults to `number`. */\n\tvalueType?: ChartValueType;\n};\n\nfunction TreeMap({\n\tdata,\n\tsize,\n\ttitle,\n\tdescription,\n\ttooltip = false,\n\tlegend = \"right\",\n\tvalueFormatter,\n\tvalueType = \"number\",\n\tclassName,\n\t...props\n}: TreeMapProps) {\n\tconst resolvedSize = useComponentSize(size);\n\tconst layout = TREE_MAP_LAYOUT[resolvedSize];\n\tconst { resolved, total } = resolveData(data);\n\n\t// recharts reads `value`/`label`/`children`/`fill` straight off each node;\n\t// the custom content below pulls `fill`, `text`, and the share from them.\n\tconst config = Object.fromEntries(\n\t\tresolved.map((datum) => [\n\t\t\tdatum.label,\n\t\t\t{ label: datum.label, color: datum.fill },\n\t\t]),\n\t) satisfies ChartConfig;\n\n\tconst tooltipNode = tooltip ? (\n\t\t<ChartTooltip\n\t\t\tcontent={\n\t\t\t\t<ChartTooltipContent\n\t\t\t\t\tnameKey=\"label\"\n\t\t\t\t\tvalueType={valueType}\n\t\t\t\t\tformatter={\n\t\t\t\t\t\tvalueFormatter\n\t\t\t\t\t\t\t? (value) =>\n\t\t\t\t\t\t\t\t\ttypeof value === \"number\" ? valueFormatter(value) : value\n\t\t\t\t\t\t\t: undefined\n\t\t\t\t\t}\n\t\t\t\t/>\n\t\t\t}\n\t\t/>\n\t) : null;\n\n\tconst legendNode = (\n\t\t<ul\n\t\t\tclassName={cn(\n\t\t\t\ttreeMapLegendVariants({ placement: legend, size: resolvedSize }),\n\t\t\t)}\n\t\t>\n\t\t\t{resolved.map((datum) => (\n\t\t\t\t<li\n\t\t\t\t\tkey={datum.label}\n\t\t\t\t\tclassName=\"flex items-center gap-2 text-fg-primary\"\n\t\t\t\t>\n\t\t\t\t\t<span\n\t\t\t\t\t\taria-hidden=\"true\"\n\t\t\t\t\t\tclassName={cn(treeMapLegendDotVariants({ size: resolvedSize }))}\n\t\t\t\t\t\tstyle={{ backgroundColor: datum.fill }}\n\t\t\t\t\t/>\n\t\t\t\t\t<span className=\"min-w-0 truncate\">{datum.label}</span>\n\t\t\t\t</li>\n\t\t\t))}\n\t\t</ul>\n\t);\n\n\treturn (\n\t\t<ChartCard size={resolvedSize} className={className} {...props}>\n\t\t\t{(title != null || description != null) && (\n\t\t\t\t<ChartHeader>\n\t\t\t\t\t{title != null && <ChartTitle>{title}</ChartTitle>}\n\t\t\t\t\t{description != null && (\n\t\t\t\t\t\t<ChartDescription>{description}</ChartDescription>\n\t\t\t\t\t)}\n\t\t\t\t</ChartHeader>\n\t\t\t)}\n\t\t\t<div\n\t\t\t\tclassName={cn(\n\t\t\t\t\t\"flex gap-4\",\n\t\t\t\t\tlegend === \"right\" ? \"flex-row items-stretch\" : \"flex-col\",\n\t\t\t\t)}\n\t\t\t>\n\t\t\t\t<ChartContainer\n\t\t\t\t\tconfig={config}\n\t\t\t\t\tclassName=\"aspect-auto min-w-0 flex-1\"\n\t\t\t\t\tstyle={{ height: layout.height }}\n\t\t\t\t>\n\t\t\t\t\t<RechartsTreemap\n\t\t\t\t\t\tdata={resolved}\n\t\t\t\t\t\tdataKey=\"value\"\n\t\t\t\t\t\tnameKey=\"label\"\n\t\t\t\t\t\ttype=\"flat\"\n\t\t\t\t\t\tisAnimationActive={false}\n\t\t\t\t\t\tcontent={<TreeMapTile total={total} layout={layout} />}\n\t\t\t\t\t>\n\t\t\t\t\t\t{tooltipNode}\n\t\t\t\t\t</RechartsTreemap>\n\t\t\t\t</ChartContainer>\n\t\t\t\t{legendNode}\n\t\t\t</div>\n\t\t</ChartCard>\n\t);\n}\n\n/**\n * Custom recharts `Treemap` tile. recharts calls it for every node (root, groups,\n * leaves); only leaves carry a value and tile the whole plot, so non-leaves draw\n * nothing. A leaf renders an inset, rounded rectangle in its colour with an\n * in-tile label (name over its share of the whole), dropped when the tile is too\n * small to fit it.\n */\ntype TreeMapTileProps = Partial<TreemapNode> & {\n\ttotal: number;\n\tlayout: TreeMapLayout;\n\t/** Resolved tile colours, attached to each datum by `resolveData`. */\n\tfill?: string;\n\ttext?: string;\n};\n\nfunction TreeMapTile({\n\ttotal,\n\tlayout,\n\tx,\n\ty,\n\twidth,\n\theight,\n\tvalue,\n\tname,\n\tchildren,\n\tfill,\n\ttext,\n}: TreeMapTileProps) {\n\t// Non-leaf nodes (root, groups) are pure containers — their leaves cover them.\n\tif (\n\t\tchildren != null ||\n\t\tx == null ||\n\t\ty == null ||\n\t\twidth == null ||\n\t\theight == null\n\t) {\n\t\treturn <g />;\n\t}\n\n\tconst tileX = x + layout.gap / 2;\n\tconst tileY = y + layout.gap / 2;\n\tconst tileW = Math.max(0, width - layout.gap);\n\tconst tileH = Math.max(0, height - layout.gap);\n\n\tconst showLabel =\n\t\ttileW >= layout.labelMinSide && tileH >= layout.labelMinSide;\n\tconst share = total > 0 ? Math.round(((value ?? 0) / total) * 100) : 0;\n\n\treturn (\n\t\t<g>\n\t\t\t<rect\n\t\t\t\tx={tileX}\n\t\t\t\ty={tileY}\n\t\t\t\twidth={tileW}\n\t\t\t\theight={tileH}\n\t\t\t\trx={layout.radius}\n\t\t\t\try={layout.radius}\n\t\t\t\tfill={fill}\n\t\t\t/>\n\t\t\t{showLabel && (\n\t\t\t\t<text\n\t\t\t\t\tx={tileX + layout.labelPadding}\n\t\t\t\t\ty={tileY + layout.labelPadding}\n\t\t\t\t\tfill={text}\n\t\t\t\t\tdominantBaseline=\"hanging\"\n\t\t\t\t>\n\t\t\t\t\t<tspan\n\t\t\t\t\t\tx={tileX + layout.labelPadding}\n\t\t\t\t\t\tclassName=\"font-semibold\"\n\t\t\t\t\t\tstyle={{ fontSize: layout.nameFontSize }}\n\t\t\t\t\t>\n\t\t\t\t\t\t{name}\n\t\t\t\t\t</tspan>\n\t\t\t\t\t<tspan\n\t\t\t\t\t\tx={tileX + layout.labelPadding}\n\t\t\t\t\t\tdy={layout.nameFontSize + 4}\n\t\t\t\t\t\tclassName=\"tabular-nums\"\n\t\t\t\t\t\tstyle={{ fontSize: layout.shareFontSize }}\n\t\t\t\t\t>\n\t\t\t\t\t\t{share}%\n\t\t\t\t\t</tspan>\n\t\t\t\t</text>\n\t\t\t)}\n\t\t</g>\n\t);\n}\n\nexport { TREE_MAP_LAYOUT, TREE_MAP_PALETTE, TreeMap };\nexport type {\n\tTreeMapDatum,\n\tTreeMapLayout,\n\tTreeMapLegendPlacement,\n\tTreeMapProps,\n\tTreeMapSize,\n};\n"],"mappings":"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","names":[]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/waterfall-chart.tsx"],"sourcesContent":["\"use client\";\n\nimport { cva } from \"class-variance-authority\";\nimport type * as React from \"react\";\nimport {\n\tBar,\n\tLabelList,\n\tBarChart as RechartsBarChart,\n\tReferenceLine,\n\tXAxis,\n\tYAxis,\n} from \"recharts\";\nimport {\n\tChartCard,\n\ttype ChartConfig,\n\tChartContainer,\n\tChartDescription,\n\tChartHeader,\n\tChartTitle,\n\tChartTooltip,\n\tChartTooltipContent,\n\ttype ChartValueType,\n} from \"./chart\";\nimport { cn } from \"./lib/cn\";\nimport {\n\ttype ComponentSize,\n\tSizeProvider,\n\tuseComponentSize,\n} from \"./size-context\";\n\ntype WaterfallChartOrientation = \"vertical\" | \"horizontal\";\ntype WaterfallChartLegendPlacement = \"right\" | \"bottom\";\ntype WaterfallChartStepType = \"auto\" | \"increase\" | \"decrease\" | \"total\";\n\ntype WaterfallChartDatum = {\n\t/** Step label shown on the category axis, legend/tooltip context, and value label context. */\n\tlabel: string;\n\t/** Absolute subtotal for `type=\"total\"`; delta amount for increase/decrease steps. */\n\tvalue: number;\n\t/** Defaults to `total` for the first/last datum and `auto` for middle data. */\n\ttype?: WaterfallChartStepType;\n\t/** Optional fill override for this step. Defaults to semantic status tokens. */\n\tfill?: string;\n};\n\ntype ResolvedWaterfallStep = {\n\tlabel: string;\n\tvalue: number;\n\tstart: number;\n\tend: number;\n\trange: [number, number];\n\ttype: Exclude<WaterfallChartStepType, \"auto\">;\n\tfill: string;\n};\n\ntype WaterfallChartLayout = {\n\theight: number;\n\thorizontalHeight: number;\n\tmargin: { top: number; right: number; bottom: number; left: number };\n\thorizontalMargin: {\n\t\ttop: number;\n\t\tright: number;\n\t\tbottom: number;\n\t\tleft: number;\n\t};\n\tbarSize: number;\n\tbarRadius: number;\n\tconnectorWidth: number;\n\tvalueGap: number;\n\ttickFontSize: number;\n\tyAxisWidth: number;\n\txAxisHeight: number;\n};\n\ntype WaterfallChartFormatContext = {\n\tdatum: WaterfallChartDatum;\n\tstep: ResolvedWaterfallStep;\n\tindex: number;\n};\n\ntype WaterfallChartPlotProps = Omit<React.ComponentProps<\"div\">, \"children\"> & {\n\tdata: WaterfallChartDatum[];\n\tsize?: ComponentSize;\n\torientation?: WaterfallChartOrientation;\n\tlegend?: WaterfallChartLegendPlacement | false;\n\tshowValues?: boolean;\n\tshowTooltip?: boolean;\n\tvalueType?: ChartValueType;\n\tvalueFormatter?: (\n\t\tvalue: number,\n\t\tcontext: WaterfallChartFormatContext,\n\t) => React.ReactNode;\n\tcategoryFormatter?: (label: string, datum: WaterfallChartDatum) => string;\n\tdomain?: [number, number] | [number, \"auto\"];\n\tariaLabel?: string;\n};\n\ntype WaterfallChartLegendProps = Omit<\n\tReact.ComponentProps<\"div\">,\n\t\"children\"\n> & {\n\tsize?: ComponentSize;\n\tplacement?: WaterfallChartLegendPlacement;\n\titems?: WaterfallChartLegendItem[];\n};\n\ntype WaterfallChartLegendItem = {\n\tlabel: string;\n\tcolor: string;\n};\n\ntype WaterfallChartProps = Omit<\n\tReact.ComponentProps<typeof ChartCard>,\n\t\"children\" | \"size\"\n> &\n\tWaterfallChartPlotProps & {\n\t\ttitle?: React.ReactNode;\n\t\tdescription?: React.ReactNode;\n\t};\n\nconst WATERFALL_CHART_COLORS = {\n\ttotal: \"var(--color-status-info)\",\n\tincrease: \"var(--color-status-success)\",\n\tdecrease: \"var(--color-status-danger)\",\n\tconnector: \"var(--color-line-strong)\",\n\tbaseline: \"var(--color-line)\",\n} as const;\n\nconst WATERFALL_CHART_LEGEND_ITEMS: WaterfallChartLegendItem[] = [\n\t{ label: \"Increase\", color: WATERFALL_CHART_COLORS.increase },\n\t{ label: \"Decrease\", color: WATERFALL_CHART_COLORS.decrease },\n\t{ label: \"Total\", color: WATERFALL_CHART_COLORS.total },\n];\n\nconst WATERFALL_CHART_CONFIG = {\n\tincrease: {\n\t\tlabel: \"Increase\",\n\t\tcolor: WATERFALL_CHART_COLORS.increase,\n\t},\n\tdecrease: {\n\t\tlabel: \"Decrease\",\n\t\tcolor: WATERFALL_CHART_COLORS.decrease,\n\t},\n\ttotal: {\n\t\tlabel: \"Total\",\n\t\tcolor: WATERFALL_CHART_COLORS.total,\n\t},\n} satisfies ChartConfig;\n\nconst WATERFALL_CHART_LAYOUT: Record<ComponentSize, WaterfallChartLayout> = {\n\tsm: {\n\t\theight: 150,\n\t\thorizontalHeight: 170,\n\t\tmargin: { top: 18, right: 8, bottom: 0, left: 0 },\n\t\thorizontalMargin: { top: 6, right: 36, bottom: 0, left: 0 },\n\t\tbarSize: 18,\n\t\tbarRadius: 3,\n\t\tconnectorWidth: 1.25,\n\t\tvalueGap: 4,\n\t\ttickFontSize: 10,\n\t\tyAxisWidth: 56,\n\t\txAxisHeight: 20,\n\t},\n\tmd: {\n\t\theight: 190,\n\t\thorizontalHeight: 220,\n\t\tmargin: { top: 22, right: 10, bottom: 0, left: 0 },\n\t\thorizontalMargin: { top: 8, right: 44, bottom: 0, left: 0 },\n\t\tbarSize: 24,\n\t\tbarRadius: 4,\n\t\tconnectorWidth: 1.5,\n\t\tvalueGap: 5,\n\t\ttickFontSize: 11,\n\t\tyAxisWidth: 72,\n\t\txAxisHeight: 24,\n\t},\n\tlg: {\n\t\theight: 250,\n\t\thorizontalHeight: 280,\n\t\tmargin: { top: 28, right: 12, bottom: 0, left: 0 },\n\t\thorizontalMargin: { top: 10, right: 56, bottom: 0, left: 0 },\n\t\tbarSize: 32,\n\t\tbarRadius: 5,\n\t\tconnectorWidth: 1.5,\n\t\tvalueGap: 6,\n\t\ttickFontSize: 12,\n\t\tyAxisWidth: 88,\n\t\txAxisHeight: 28,\n\t},\n};\n\nconst waterfallLegendVariants = cva(\"flex min-w-0\", {\n\tvariants: {\n\t\tplacement: {\n\t\t\tright: \"flex-col items-start\",\n\t\t\tbottom: \"flex-row flex-wrap items-center\",\n\t\t},\n\t\tsize: {\n\t\t\tsm: \"text-gdt-xs\",\n\t\t\tmd: \"text-gdt-xs\",\n\t\t\tlg: \"text-gdt-sm\",\n\t\t},\n\t},\n\tcompoundVariants: [\n\t\t{ placement: \"right\", size: \"sm\", className: \"gap-2\" },\n\t\t{ placement: \"right\", size: \"md\", className: \"gap-2.5\" },\n\t\t{ placement: \"right\", size: \"lg\", className: \"gap-3\" },\n\t\t{ placement: \"bottom\", className: \"gap-x-4 gap-y-2\" },\n\t],\n\tdefaultVariants: { placement: \"right\", size: \"md\" },\n});\n\nfunction defaultValueFormatter(\n\tvalue: number,\n\t{ step }: WaterfallChartFormatContext,\n) {\n\tif (step.type === \"total\") {\n\t\treturn value.toLocaleString(\"en-NG\");\n\t}\n\n\treturn `${value > 0 ? \"+\" : \"\"}${value.toLocaleString(\"en-NG\")}`;\n}\n\nfunction resolveWaterfallData(data: WaterfallChartDatum[]) {\n\tlet running = 0;\n\n\treturn data.map((datum, index) => {\n\t\tconst isEdge = index === 0 || index === data.length - 1;\n\t\tconst requestedType = datum.type ?? (isEdge ? \"total\" : \"auto\");\n\t\tconst type =\n\t\t\trequestedType === \"auto\"\n\t\t\t\t? datum.value >= 0\n\t\t\t\t\t? \"increase\"\n\t\t\t\t\t: \"decrease\"\n\t\t\t\t: requestedType;\n\n\t\tif (type === \"total\") {\n\t\t\trunning = datum.value;\n\t\t\treturn {\n\t\t\t\tlabel: datum.label,\n\t\t\t\tvalue: datum.value,\n\t\t\t\tstart: 0,\n\t\t\t\tend: datum.value,\n\t\t\t\trange: [0, datum.value].sort((a, b) => a - b) as [number, number],\n\t\t\t\ttype,\n\t\t\t\tfill: datum.fill ?? WATERFALL_CHART_COLORS.total,\n\t\t\t} satisfies ResolvedWaterfallStep;\n\t\t}\n\n\t\tconst start = running;\n\t\tconst end = running + datum.value;\n\t\trunning = end;\n\n\t\treturn {\n\t\t\tlabel: datum.label,\n\t\t\tvalue: datum.value,\n\t\t\tstart,\n\t\t\tend,\n\t\t\trange: [start, end].sort((a, b) => a - b) as [number, number],\n\t\t\ttype,\n\t\t\tfill:\n\t\t\t\tdatum.fill ??\n\t\t\t\t(type === \"increase\"\n\t\t\t\t\t? WATERFALL_CHART_COLORS.increase\n\t\t\t\t\t: WATERFALL_CHART_COLORS.decrease),\n\t\t} satisfies ResolvedWaterfallStep;\n\t});\n}\n\nfunction getWaterfallDomain(\n\tsteps: ResolvedWaterfallStep[],\n\tdomain?: [number, number] | [number, \"auto\"],\n) {\n\tif (domain) return domain;\n\n\tconst values = steps.flatMap((step) => [step.start, step.end, 0]);\n\tconst min = Math.min(...values);\n\tconst max = Math.max(...values);\n\tconst span = Math.max(max - min, 1);\n\tconst pad = span * 0.08;\n\n\treturn [Math.min(0, min - pad), Math.max(0, max + pad)] as [number, number];\n}\n\nfunction getPayloadStep(payload: unknown): ResolvedWaterfallStep | undefined {\n\tif (typeof payload !== \"object\" || payload === null) return undefined;\n\tif (!(\"payload\" in payload)) return undefined;\n\tconst row = payload.payload;\n\tif (typeof row !== \"object\" || row === null) return undefined;\n\tif (!(\"step\" in row)) return undefined;\n\treturn row.step as ResolvedWaterfallStep;\n}\n\nfunction findDatumByLabel(data: WaterfallChartDatum[], label: unknown) {\n\tconst stringLabel = String(label);\n\treturn (\n\t\tdata.find((datum) => datum.label === stringLabel) ?? {\n\t\t\tlabel: stringLabel,\n\t\t\tvalue: 0,\n\t\t}\n\t);\n}\n\nfunction formatTooltipValue(\n\tvalueFormatter: NonNullable<WaterfallChartPlotProps[\"valueFormatter\"]>,\n\tdata: WaterfallChartDatum[],\n) {\n\treturn (\n\t\t_value: unknown,\n\t\t_name: unknown,\n\t\titem: unknown,\n\t\tindex: number,\n\t): React.ReactNode => {\n\t\tconst step = getPayloadStep(item);\n\t\tif (!step) return \"\";\n\t\tconst datumIndex = Math.max(index, 0);\n\t\treturn valueFormatter(step.value, {\n\t\t\tdatum: data[datumIndex] ?? {\n\t\t\t\tlabel: step.label,\n\t\t\t\tvalue: step.value,\n\t\t\t\ttype: step.type,\n\t\t\t},\n\t\t\tstep,\n\t\t\tindex: datumIndex,\n\t\t});\n\t};\n}\n\nfunction WaterfallChartLegend({\n\tclassName,\n\tsize,\n\tplacement = \"right\",\n\titems = WATERFALL_CHART_LEGEND_ITEMS,\n\t...props\n}: WaterfallChartLegendProps) {\n\tconst resolvedSize = useComponentSize(size);\n\tconst markerClassName =\n\t\tresolvedSize === \"sm\"\n\t\t\t? \"size-2\"\n\t\t\t: resolvedSize === \"lg\"\n\t\t\t\t? \"size-3\"\n\t\t\t\t: \"size-2.5\";\n\n\treturn (\n\t\t<div\n\t\t\tclassName={cn(\n\t\t\t\twaterfallLegendVariants({ placement, size: resolvedSize }),\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\t{...props}\n\t\t>\n\t\t\t{items.map((item) => (\n\t\t\t\t<div key={item.label} className=\"inline-flex items-center gap-2\">\n\t\t\t\t\t<span\n\t\t\t\t\t\taria-hidden=\"true\"\n\t\t\t\t\t\tclassName={cn(\"shrink-0 rounded-[2px]\", markerClassName)}\n\t\t\t\t\t\tstyle={{ backgroundColor: item.color }}\n\t\t\t\t\t/>\n\t\t\t\t\t<span className=\"font-medium text-fg-secondary\">{item.label}</span>\n\t\t\t\t</div>\n\t\t\t))}\n\t\t</div>\n\t);\n}\n\nfunction WaterfallBarShape(props: Record<string, unknown>) {\n\tconst x = Number(props.x ?? 0);\n\tconst y = Number(props.y ?? 0);\n\tconst width = Number(props.width ?? 0);\n\tconst height = Number(props.height ?? 0);\n\tconst payload = props.payload as\n\t\t| (ResolvedWaterfallStep & { step?: ResolvedWaterfallStep })\n\t\t| undefined;\n\tconst radius = Number(props.radius ?? 0);\n\n\tconst rectX = width < 0 ? x + width : x;\n\tconst rectY = height < 0 ? y + height : y;\n\tconst rectWidth = Math.abs(width);\n\tconst rectHeight = Math.abs(height);\n\n\tif (rectWidth <= 0 || rectHeight <= 0) return null;\n\n\treturn (\n\t\t<rect\n\t\t\tx={rectX}\n\t\t\ty={rectY}\n\t\t\twidth={rectWidth}\n\t\t\theight={rectHeight}\n\t\t\trx={radius}\n\t\t\tfill={\n\t\t\t\tpayload?.step?.fill ?? payload?.fill ?? WATERFALL_CHART_COLORS.total\n\t\t\t}\n\t\t/>\n\t);\n}\n\nfunction WaterfallValueLabel({\n\tx,\n\ty,\n\twidth,\n\theight,\n\tvalue,\n\tpayload,\n\torientation = \"vertical\",\n\tlayout,\n\tvalueFormatter = defaultValueFormatter,\n\tdata,\n\tindex,\n}: {\n\tx?: string | number;\n\ty?: string | number;\n\twidth?: string | number;\n\theight?: string | number;\n\tvalue?: unknown;\n\tpayload?: ResolvedWaterfallStep & { step?: ResolvedWaterfallStep };\n\torientation?: WaterfallChartOrientation;\n\tlayout: WaterfallChartLayout;\n\tvalueFormatter?: NonNullable<WaterfallChartPlotProps[\"valueFormatter\"]>;\n\tdata: WaterfallChartDatum[];\n\tindex?: number;\n}) {\n\tconst step = payload?.step ?? payload;\n\n\tif (!step || x == null || y == null || width == null || height == null) {\n\t\treturn null;\n\t}\n\n\tconst resolvedIndex =\n\t\tindex ?? data.findIndex((datum) => datum.label === step.label);\n\tconst context = {\n\t\tdatum: data[resolvedIndex] ?? {\n\t\t\tlabel: step.label,\n\t\t\tvalue: step.value,\n\t\t\ttype: step.type,\n\t\t},\n\t\tstep,\n\t\tindex: Math.max(resolvedIndex, 0),\n\t};\n\n\tconst fallbackLabel = Array.isArray(value)\n\t\t? value.join(\", \")\n\t\t: value == null\n\t\t\t? \"\"\n\t\t\t: String(value);\n\tconst label = valueFormatter(step.value, context) ?? fallbackLabel;\n\n\tconst numX = Number(x);\n\tconst numY = Number(y);\n\tconst numWidth = Number(width);\n\tconst numHeight = Number(height);\n\tconst rectX = numWidth < 0 ? numX + numWidth : numX;\n\tconst rectY = numHeight < 0 ? numY + numHeight : numY;\n\tconst rectWidth = Math.abs(numWidth);\n\tconst rectHeight = Math.abs(numHeight);\n\n\tif (orientation === \"horizontal\") {\n\t\treturn (\n\t\t\t<text\n\t\t\t\tx={rectX + rectWidth + layout.valueGap}\n\t\t\t\ty={rectY + rectHeight / 2}\n\t\t\t\tdominantBaseline=\"central\"\n\t\t\t\tclassName=\"fill-fg-primary text-gdt-xs font-semibold tabular-nums\"\n\t\t\t>\n\t\t\t\t{label}\n\t\t\t</text>\n\t\t);\n\t}\n\n\treturn (\n\t\t<text\n\t\t\tx={rectX + rectWidth / 2}\n\t\t\ty={Math.max(10, rectY - layout.valueGap)}\n\t\t\ttextAnchor=\"middle\"\n\t\t\tclassName=\"fill-fg-primary text-gdt-xs font-semibold tabular-nums\"\n\t\t>\n\t\t\t{label}\n\t\t</text>\n\t);\n}\n\nfunction WaterfallChartPlot({\n\tdata,\n\tsize,\n\torientation = \"vertical\",\n\tlegend = false,\n\tshowValues = true,\n\tshowTooltip = false,\n\tvalueType = \"number\",\n\tvalueFormatter = defaultValueFormatter,\n\tcategoryFormatter = (label) => label,\n\tdomain,\n\tariaLabel,\n\tclassName,\n\t...props\n}: WaterfallChartPlotProps) {\n\tconst resolvedSize = useComponentSize(size);\n\tconst layout = WATERFALL_CHART_LAYOUT[resolvedSize];\n\tconst steps = resolveWaterfallData(data);\n\n\tif (!steps.length) return null;\n\n\tconst isHorizontal = orientation === \"horizontal\";\n\tconst resolvedDomain = getWaterfallDomain(steps, domain);\n\tconst chartHeight = isHorizontal ? layout.horizontalHeight : layout.height;\n\tconst chartMargin = isHorizontal ? layout.horizontalMargin : layout.margin;\n\tconst chartData = steps.map((step) => ({\n\t\t...step,\n\t\trange: step.range,\n\t\tstep,\n\t}));\n\tconst summary =\n\t\tariaLabel ??\n\t\t`Waterfall chart from ${steps[0]?.label ?? \"start\"} to ${\n\t\t\tsteps.at(-1)?.label ?? \"end\"\n\t\t}`;\n\n\treturn (\n\t\t<div\n\t\t\tclassName={cn(\"w-full min-w-0\", className)}\n\t\t\tdata-slot=\"waterfall-chart-plot\"\n\t\t\trole=\"img\"\n\t\t\taria-label={summary}\n\t\t\t{...props}\n\t\t>\n\t\t\t<div\n\t\t\t\tclassName={cn(\n\t\t\t\t\t\"flex min-w-0 gap-5\",\n\t\t\t\t\tlegend === \"bottom\"\n\t\t\t\t\t\t? \"flex-col\"\n\t\t\t\t\t\t: \"items-center justify-between max-sm:flex-col\",\n\t\t\t\t)}\n\t\t\t>\n\t\t\t\t<ChartContainer\n\t\t\t\t\tconfig={WATERFALL_CHART_CONFIG}\n\t\t\t\t\tclassName=\"aspect-auto w-full min-w-0 flex-1\"\n\t\t\t\t\tstyle={{ height: chartHeight }}\n\t\t\t\t\tinitialDimension={{ width: 420, height: chartHeight }}\n\t\t\t\t>\n\t\t\t\t\t<RechartsBarChart\n\t\t\t\t\t\taccessibilityLayer\n\t\t\t\t\t\tdata={chartData}\n\t\t\t\t\t\tlayout={isHorizontal ? \"vertical\" : \"horizontal\"}\n\t\t\t\t\t\tmargin={chartMargin}\n\t\t\t\t\t>\n\t\t\t\t\t\t{isHorizontal ? (\n\t\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t\t<XAxis\n\t\t\t\t\t\t\t\t\ttype=\"number\"\n\t\t\t\t\t\t\t\t\tdomain={resolvedDomain}\n\t\t\t\t\t\t\t\t\taxisLine={false}\n\t\t\t\t\t\t\t\t\ttickLine={false}\n\t\t\t\t\t\t\t\t\ttick={false}\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t<YAxis\n\t\t\t\t\t\t\t\t\ttype=\"category\"\n\t\t\t\t\t\t\t\t\tdataKey=\"label\"\n\t\t\t\t\t\t\t\t\twidth={layout.yAxisWidth}\n\t\t\t\t\t\t\t\t\taxisLine={false}\n\t\t\t\t\t\t\t\t\ttickLine={false}\n\t\t\t\t\t\t\t\t\ttickMargin={8}\n\t\t\t\t\t\t\t\t\ttick={{ fontSize: layout.tickFontSize }}\n\t\t\t\t\t\t\t\t\ttickFormatter={(label) =>\n\t\t\t\t\t\t\t\t\t\tcategoryFormatter(\n\t\t\t\t\t\t\t\t\t\t\tString(label),\n\t\t\t\t\t\t\t\t\t\t\tfindDatumByLabel(data, label),\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\t<ReferenceLine\n\t\t\t\t\t\t\t\t\tx={0}\n\t\t\t\t\t\t\t\t\tstroke={WATERFALL_CHART_COLORS.baseline}\n\t\t\t\t\t\t\t\t\tstrokeWidth={layout.connectorWidth}\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t{steps.slice(0, -1).map((step, index) => (\n\t\t\t\t\t\t\t\t\t<ReferenceLine\n\t\t\t\t\t\t\t\t\t\tkey={`${step.label}-connector`}\n\t\t\t\t\t\t\t\t\t\tsegment={[\n\t\t\t\t\t\t\t\t\t\t\t{ x: step.end, y: steps[index].label },\n\t\t\t\t\t\t\t\t\t\t\t{ x: step.end, y: steps[index + 1].label },\n\t\t\t\t\t\t\t\t\t\t]}\n\t\t\t\t\t\t\t\t\t\tstroke={WATERFALL_CHART_COLORS.connector}\n\t\t\t\t\t\t\t\t\t\tstrokeWidth={layout.connectorWidth}\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) : (\n\t\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t\t<XAxis\n\t\t\t\t\t\t\t\t\tdataKey=\"label\"\n\t\t\t\t\t\t\t\t\theight={layout.xAxisHeight}\n\t\t\t\t\t\t\t\t\taxisLine={false}\n\t\t\t\t\t\t\t\t\ttickLine={false}\n\t\t\t\t\t\t\t\t\ttickMargin={8}\n\t\t\t\t\t\t\t\t\ttick={{ fontSize: layout.tickFontSize }}\n\t\t\t\t\t\t\t\t\ttickFormatter={(label) =>\n\t\t\t\t\t\t\t\t\t\tcategoryFormatter(\n\t\t\t\t\t\t\t\t\t\t\tString(label),\n\t\t\t\t\t\t\t\t\t\t\tfindDatumByLabel(data, label),\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\t<YAxis\n\t\t\t\t\t\t\t\t\ttype=\"number\"\n\t\t\t\t\t\t\t\t\tdomain={resolvedDomain}\n\t\t\t\t\t\t\t\t\twidth={layout.yAxisWidth}\n\t\t\t\t\t\t\t\t\taxisLine={false}\n\t\t\t\t\t\t\t\t\ttickLine={false}\n\t\t\t\t\t\t\t\t\ttick={false}\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t<ReferenceLine\n\t\t\t\t\t\t\t\t\ty={0}\n\t\t\t\t\t\t\t\t\tstroke={WATERFALL_CHART_COLORS.baseline}\n\t\t\t\t\t\t\t\t\tstrokeWidth={layout.connectorWidth}\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t{steps.slice(0, -1).map((step, index) => (\n\t\t\t\t\t\t\t\t\t<ReferenceLine\n\t\t\t\t\t\t\t\t\t\tkey={`${step.label}-connector`}\n\t\t\t\t\t\t\t\t\t\tsegment={[\n\t\t\t\t\t\t\t\t\t\t\t{ x: steps[index].label, y: step.end },\n\t\t\t\t\t\t\t\t\t\t\t{ x: steps[index + 1].label, y: step.end },\n\t\t\t\t\t\t\t\t\t\t]}\n\t\t\t\t\t\t\t\t\t\tstroke={WATERFALL_CHART_COLORS.connector}\n\t\t\t\t\t\t\t\t\t\tstrokeWidth={layout.connectorWidth}\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)}\n\t\t\t\t\t\t{showTooltip ? (\n\t\t\t\t\t\t\t<ChartTooltip\n\t\t\t\t\t\t\t\tcursor={false}\n\t\t\t\t\t\t\t\tcontent={\n\t\t\t\t\t\t\t\t\t<ChartTooltipContent\n\t\t\t\t\t\t\t\t\t\tnameKey=\"type\"\n\t\t\t\t\t\t\t\t\t\tvalueType={valueType}\n\t\t\t\t\t\t\t\t\t\tformatter={formatTooltipValue(valueFormatter, data)}\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) : null}\n\t\t\t\t\t\t<Bar\n\t\t\t\t\t\t\tdataKey=\"range\"\n\t\t\t\t\t\t\tname=\"Change\"\n\t\t\t\t\t\t\tbarSize={layout.barSize}\n\t\t\t\t\t\t\tisAnimationActive={false}\n\t\t\t\t\t\t\tshape={<WaterfallBarShape radius={layout.barRadius} />}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{showValues ? (\n\t\t\t\t\t\t\t\t<LabelList\n\t\t\t\t\t\t\t\t\tdataKey=\"range\"\n\t\t\t\t\t\t\t\t\tcontent={\n\t\t\t\t\t\t\t\t\t\t<WaterfallValueLabel\n\t\t\t\t\t\t\t\t\t\t\torientation={orientation}\n\t\t\t\t\t\t\t\t\t\t\tlayout={layout}\n\t\t\t\t\t\t\t\t\t\t\tvalueFormatter={valueFormatter}\n\t\t\t\t\t\t\t\t\t\t\tdata={data}\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) : null}\n\t\t\t\t\t\t</Bar>\n\t\t\t\t\t</RechartsBarChart>\n\t\t\t\t</ChartContainer>\n\t\t\t\t{legend ? (\n\t\t\t\t\t<WaterfallChartLegend\n\t\t\t\t\t\tsize={resolvedSize}\n\t\t\t\t\t\tplacement={legend}\n\t\t\t\t\t\tclassName={legend === \"bottom\" ? \"justify-center\" : \"shrink-0\"}\n\t\t\t\t\t/>\n\t\t\t\t) : null}\n\t\t\t</div>\n\t\t</div>\n\t);\n}\n\nfunction WaterfallChart({\n\tdata,\n\tsize,\n\torientation = \"vertical\",\n\ttitle,\n\tdescription,\n\tlegend = \"right\",\n\tshowValues = true,\n\tshowTooltip = false,\n\tvalueType = \"number\",\n\tvalueFormatter,\n\tcategoryFormatter,\n\tdomain,\n\tariaLabel,\n\tclassName,\n\t...props\n}: WaterfallChartProps) {\n\tconst resolvedSize = useComponentSize(size);\n\tconst showHeader = title != null || description != null;\n\n\treturn (\n\t\t<ChartCard size={resolvedSize} className={className} {...props}>\n\t\t\t<SizeProvider size={resolvedSize}>\n\t\t\t\t{showHeader ? (\n\t\t\t\t\t<ChartHeader>\n\t\t\t\t\t\t{title != null ? <ChartTitle>{title}</ChartTitle> : null}\n\t\t\t\t\t\t{description != null ? (\n\t\t\t\t\t\t\t<ChartDescription>{description}</ChartDescription>\n\t\t\t\t\t\t) : null}\n\t\t\t\t\t</ChartHeader>\n\t\t\t\t) : null}\n\t\t\t\t<WaterfallChartPlot\n\t\t\t\t\tdata={data}\n\t\t\t\t\tsize={resolvedSize}\n\t\t\t\t\torientation={orientation}\n\t\t\t\t\tlegend={legend}\n\t\t\t\t\tshowValues={showValues}\n\t\t\t\t\tshowTooltip={showTooltip}\n\t\t\t\t\tvalueType={valueType}\n\t\t\t\t\tvalueFormatter={valueFormatter}\n\t\t\t\t\tcategoryFormatter={categoryFormatter}\n\t\t\t\t\tdomain={domain}\n\t\t\t\t\tariaLabel={ariaLabel}\n\t\t\t\t/>\n\t\t\t</SizeProvider>\n\t\t</ChartCard>\n\t);\n}\n\nconst WaterfallChartCard = WaterfallChart;\n\nexport {\n\tWATERFALL_CHART_COLORS,\n\tWATERFALL_CHART_CONFIG,\n\tWATERFALL_CHART_LAYOUT,\n\tWATERFALL_CHART_LEGEND_ITEMS,\n\tWaterfallChart,\n\tWaterfallChartCard,\n\tWaterfallChartLegend,\n\tWaterfallChartPlot,\n\tresolveWaterfallData,\n};\nexport type {\n\tResolvedWaterfallStep,\n\tWaterfallChartDatum,\n\tWaterfallChartFormatContext,\n\tWaterfallChartLayout,\n\tWaterfallChartLegendItem,\n\tWaterfallChartLegendPlacement,\n\tWaterfallChartOrientation,\n\tWaterfallChartPlotProps,\n\tWaterfallChartProps,\n\tWaterfallChartStepType,\n};\n"],"mappings":"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","names":[]}
|