@seekalfred/primitives 0.5.1 → 0.7.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +682 -19
- package/dist/accordion/accordion.js +10 -4
- package/dist/accordion/accordion.js.map +1 -1
- package/dist/action-button/action-button.d.ts +50 -0
- package/dist/action-button/action-button.js +159 -0
- package/dist/action-button/action-button.js.map +1 -0
- package/dist/action-button/index.d.ts +2 -0
- package/dist/action-button/index.js +2 -0
- package/dist/activity-heatmap/activity-heatmap.d.ts +92 -0
- package/dist/activity-heatmap/activity-heatmap.js +699 -0
- package/dist/activity-heatmap/activity-heatmap.js.map +1 -0
- package/dist/activity-heatmap/index.d.ts +2 -0
- package/dist/activity-heatmap/index.js +2 -0
- package/dist/alert/alert.d.ts +19 -1
- package/dist/alert/alert.js +180 -23
- package/dist/alert/alert.js.map +1 -1
- package/dist/alert-dialog/alert-dialog.d.ts +45 -18
- package/dist/alert-dialog/alert-dialog.js +128 -9
- package/dist/alert-dialog/alert-dialog.js.map +1 -1
- package/dist/alert-dialog/index.d.ts +2 -2
- package/dist/alert-dialog/index.js +2 -2
- package/dist/animated-counter/animated-counter.d.ts +38 -0
- package/dist/animated-counter/animated-counter.js +230 -0
- package/dist/animated-counter/animated-counter.js.map +1 -0
- package/dist/animated-counter/index.d.ts +2 -0
- package/dist/animated-counter/index.js +2 -0
- package/dist/announcement-bar/announcement-bar.d.ts +67 -0
- package/dist/announcement-bar/announcement-bar.js +364 -0
- package/dist/announcement-bar/announcement-bar.js.map +1 -0
- package/dist/announcement-bar/index.d.ts +2 -0
- package/dist/announcement-bar/index.js +2 -0
- package/dist/avatar/avatar.d.ts +6 -0
- package/dist/avatar/avatar.js +47 -16
- package/dist/avatar/avatar.js.map +1 -1
- package/dist/badge/badge.d.ts +10 -3
- package/dist/badge/badge.js +35 -5
- package/dist/badge/badge.js.map +1 -1
- package/dist/bar-chart/bar-chart.d.ts +51 -0
- package/dist/bar-chart/bar-chart.js +565 -0
- package/dist/bar-chart/bar-chart.js.map +1 -0
- package/dist/bar-chart/index.d.ts +2 -0
- package/dist/bar-chart/index.js +2 -0
- package/dist/breadcrumb/breadcrumb.d.ts +2 -29
- package/dist/breadcrumb/breadcrumb.js +32 -9
- package/dist/breadcrumb/breadcrumb.js.map +1 -1
- package/dist/brush-chart/brush-chart.d.ts +64 -0
- package/dist/brush-chart/brush-chart.js +1056 -0
- package/dist/brush-chart/brush-chart.js.map +1 -0
- package/dist/brush-chart/index.d.ts +2 -0
- package/dist/brush-chart/index.js +2 -0
- package/dist/button/button.d.ts +36 -23
- package/dist/button/button.js +198 -45
- package/dist/button/button.js.map +1 -1
- package/dist/button-group/button-group.d.ts +76 -0
- package/dist/button-group/button-group.js +402 -0
- package/dist/button-group/button-group.js.map +1 -0
- package/dist/button-group/index.d.ts +2 -0
- package/dist/button-group/index.js +2 -0
- package/dist/calendar/calendar.d.ts +1 -1
- package/dist/calendar/calendar.js +257 -30
- package/dist/calendar/calendar.js.map +1 -1
- package/dist/card/card.d.ts +9 -2
- package/dist/card/card.js +16 -5
- package/dist/card/card.js.map +1 -1
- package/dist/card-stack/card-stack.d.ts +54 -0
- package/dist/card-stack/card-stack.js +492 -0
- package/dist/card-stack/card-stack.js.map +1 -0
- package/dist/card-stack/index.d.ts +2 -0
- package/dist/card-stack/index.js +2 -0
- package/dist/carousel/carousel.d.ts +56 -0
- package/dist/carousel/carousel.js +389 -0
- package/dist/carousel/carousel.js.map +1 -0
- package/dist/carousel/index.d.ts +2 -0
- package/dist/carousel/index.js +2 -0
- package/dist/checkbox/checkbox.d.ts +0 -7
- package/dist/checkbox/checkbox.js +26 -29
- package/dist/checkbox/checkbox.js.map +1 -1
- package/dist/chip-group/chip-group.d.ts +37 -0
- package/dist/chip-group/chip-group.js +148 -0
- package/dist/chip-group/chip-group.js.map +1 -0
- package/dist/chip-group/index.d.ts +2 -0
- package/dist/chip-group/index.js +2 -0
- package/dist/confirm-morph/confirm-morph.d.ts +85 -0
- package/dist/confirm-morph/confirm-morph.js +652 -0
- package/dist/confirm-morph/confirm-morph.js.map +1 -0
- package/dist/confirm-morph/index.d.ts +2 -0
- package/dist/confirm-morph/index.js +2 -0
- package/dist/copy-button/copy-button.d.ts +32 -0
- package/dist/copy-button/copy-button.js +134 -0
- package/dist/copy-button/copy-button.js.map +1 -0
- package/dist/copy-button/index.d.ts +2 -0
- package/dist/copy-button/index.js +2 -0
- package/dist/countdown/countdown.d.ts +45 -0
- package/dist/countdown/countdown.js +298 -0
- package/dist/countdown/countdown.js.map +1 -0
- package/dist/countdown/index.d.ts +2 -0
- package/dist/countdown/index.js +2 -0
- package/dist/date-picker/date-picker.d.ts +51 -0
- package/dist/date-picker/date-picker.js +241 -0
- package/dist/date-picker/date-picker.js.map +1 -0
- package/dist/date-picker/date-range-picker.d.ts +78 -0
- package/dist/date-picker/date-range-picker.js +1015 -0
- package/dist/date-picker/date-range-picker.js.map +1 -0
- package/dist/date-picker/index.d.ts +4 -0
- package/dist/date-picker/index.js +4 -0
- package/dist/date-picker/picker-parts.d.ts +46 -0
- package/dist/date-picker/picker-parts.js +135 -0
- package/dist/date-picker/picker-parts.js.map +1 -0
- package/dist/dialog/dialog.d.ts +10 -14
- package/dist/dialog/dialog.js +40 -12
- package/dist/dialog/dialog.js.map +1 -1
- package/dist/donut-chart/donut-chart.d.ts +64 -0
- package/dist/donut-chart/donut-chart.js +576 -0
- package/dist/donut-chart/donut-chart.js.map +1 -0
- package/dist/donut-chart/index.d.ts +2 -0
- package/dist/donut-chart/index.js +2 -0
- package/dist/empty-state/empty-state.d.ts +55 -0
- package/dist/empty-state/empty-state.js +89 -0
- package/dist/empty-state/empty-state.js.map +1 -0
- package/dist/empty-state/index.d.ts +2 -0
- package/dist/empty-state/index.js +2 -0
- package/dist/expanding-button-group/expanding-button-group.d.ts +54 -0
- package/dist/expanding-button-group/expanding-button-group.js +350 -0
- package/dist/expanding-button-group/expanding-button-group.js.map +1 -0
- package/dist/expanding-button-group/index.d.ts +2 -0
- package/dist/expanding-button-group/index.js +2 -0
- package/dist/file-drop-zone/file-drop-zone.d.ts +71 -0
- package/dist/file-drop-zone/file-drop-zone.js +116 -0
- package/dist/file-drop-zone/file-drop-zone.js.map +1 -0
- package/dist/file-drop-zone/index.d.ts +2 -0
- package/dist/file-drop-zone/index.js +2 -0
- package/dist/filter-bar/filter-bar.d.ts +142 -0
- package/dist/filter-bar/filter-bar.js +416 -0
- package/dist/filter-bar/filter-bar.js.map +1 -0
- package/dist/filter-bar/index.d.ts +2 -0
- package/dist/filter-bar/index.js +2 -0
- package/dist/floating-button-group/floating-button-group.d.ts +61 -0
- package/dist/floating-button-group/floating-button-group.js +340 -0
- package/dist/floating-button-group/floating-button-group.js.map +1 -0
- package/dist/floating-button-group/index.d.ts +2 -0
- package/dist/floating-button-group/index.js +2 -0
- package/dist/gauge/gauge.d.ts +45 -0
- package/dist/gauge/gauge.js +219 -0
- package/dist/gauge/gauge.js.map +1 -0
- package/dist/gauge/index.d.ts +2 -0
- package/dist/gauge/index.js +2 -0
- package/dist/icon-morph/icon-morph.d.ts +55 -0
- package/dist/icon-morph/icon-morph.js +331 -0
- package/dist/icon-morph/icon-morph.js.map +1 -0
- package/dist/icon-morph/index.d.ts +2 -0
- package/dist/icon-morph/index.js +2 -0
- package/dist/in-view-title/in-view-title.d.ts +33 -0
- package/dist/in-view-title/in-view-title.js +119 -0
- package/dist/in-view-title/in-view-title.js.map +1 -0
- package/dist/in-view-title/index.d.ts +2 -0
- package/dist/in-view-title/index.js +2 -0
- package/dist/index.d.ts +71 -6
- package/dist/index.js +73 -11
- package/dist/input/input.d.ts +22 -0
- package/dist/input/input.js +36 -12
- package/dist/input/input.js.map +1 -1
- package/dist/lib/cn.js +11 -1
- package/dist/lib/cn.js.map +1 -1
- package/dist/lib/count-to.js +113 -0
- package/dist/lib/count-to.js.map +1 -0
- package/dist/lib/eye-morph.js +62 -0
- package/dist/lib/eye-morph.js.map +1 -0
- package/dist/lib/field-message.js +354 -0
- package/dist/lib/field-message.js.map +1 -0
- package/dist/lib/field-shell.js +81 -0
- package/dist/lib/field-shell.js.map +1 -0
- package/dist/lib/field-surface.js +11 -8
- package/dist/lib/field-surface.js.map +1 -1
- package/dist/lib/flag-emoji.js +50 -0
- package/dist/lib/flag-emoji.js.map +1 -0
- package/dist/lib/flip.js +88 -0
- package/dist/lib/flip.js.map +1 -0
- package/dist/lib/height-follow.js +59 -0
- package/dist/lib/height-follow.js.map +1 -0
- package/dist/lib/icon-swap.js +47 -0
- package/dist/lib/icon-swap.js.map +1 -0
- package/dist/lib/leaving-list.js +57 -0
- package/dist/lib/leaving-list.js.map +1 -0
- package/dist/lib/menu-highlight.js +64 -0
- package/dist/lib/menu-highlight.js.map +1 -0
- package/dist/lib/merge-refs.js +3 -3
- package/dist/lib/merge-refs.js.map +1 -1
- package/dist/lib/morph-text.js +128 -0
- package/dist/lib/morph-text.js.map +1 -0
- package/dist/lib/motion.js +169 -0
- package/dist/lib/motion.js.map +1 -0
- package/dist/lib/pausable-timeout.js +67 -0
- package/dist/lib/pausable-timeout.js.map +1 -0
- package/dist/lib/rolling-value.js +31 -0
- package/dist/lib/rolling-value.js.map +1 -0
- package/dist/lib/spring-progress.js +114 -0
- package/dist/lib/spring-progress.js.map +1 -0
- package/dist/lib/spring-tween.js +500 -0
- package/dist/lib/spring-tween.js.map +1 -0
- package/dist/lib/svg-id.js +10 -0
- package/dist/lib/svg-id.js.map +1 -0
- package/dist/lib/swap-text.js +79 -0
- package/dist/lib/swap-text.js.map +1 -0
- package/dist/lib/use-copy-feedback.js +36 -0
- package/dist/lib/use-copy-feedback.js.map +1 -0
- package/dist/line-chart/index.d.ts +2 -0
- package/dist/line-chart/index.js +2 -0
- package/dist/line-chart/line-chart.d.ts +76 -0
- package/dist/line-chart/line-chart.js +611 -0
- package/dist/line-chart/line-chart.js.map +1 -0
- package/dist/mention-input/index.d.ts +2 -0
- package/dist/mention-input/index.js +2 -0
- package/dist/mention-input/mention-input.d.ts +98 -0
- package/dist/mention-input/mention-input.js +576 -0
- package/dist/mention-input/mention-input.js.map +1 -0
- package/dist/menu/menu.d.ts +2 -0
- package/dist/menu/menu.js +23 -12
- package/dist/menu/menu.js.map +1 -1
- package/dist/money-input/index.d.ts +2 -0
- package/dist/money-input/index.js +2 -0
- package/dist/money-input/money-input.d.ts +65 -0
- package/dist/money-input/money-input.js +607 -0
- package/dist/money-input/money-input.js.map +1 -0
- package/dist/morph-select/index.d.ts +2 -0
- package/dist/morph-select/index.js +2 -0
- package/dist/morph-select/morph-select.d.ts +71 -0
- package/dist/morph-select/morph-select.js +693 -0
- package/dist/morph-select/morph-select.js.map +1 -0
- package/dist/multi-select/index.d.ts +2 -0
- package/dist/multi-select/index.js +2 -0
- package/dist/multi-select/multi-select.d.ts +36 -0
- package/dist/multi-select/multi-select.js +152 -0
- package/dist/multi-select/multi-select.js.map +1 -0
- package/dist/number-field/index.d.ts +2 -0
- package/dist/number-field/index.js +2 -0
- package/dist/number-field/number-field.d.ts +42 -0
- package/dist/number-field/number-field.js +199 -0
- package/dist/number-field/number-field.js.map +1 -0
- package/dist/onboarding-checklist/index.d.ts +2 -0
- package/dist/onboarding-checklist/index.js +2 -0
- package/dist/onboarding-checklist/onboarding-checklist.d.ts +55 -0
- package/dist/onboarding-checklist/onboarding-checklist.js +577 -0
- package/dist/onboarding-checklist/onboarding-checklist.js.map +1 -0
- package/dist/page-header/index.d.ts +2 -0
- package/dist/page-header/index.js +2 -0
- package/dist/page-header/page-header.d.ts +75 -0
- package/dist/page-header/page-header.js +83 -0
- package/dist/page-header/page-header.js.map +1 -0
- package/dist/password-field/index.d.ts +2 -0
- package/dist/password-field/index.js +2 -0
- package/dist/password-field/password-field.d.ts +37 -0
- package/dist/password-field/password-field.js +101 -0
- package/dist/password-field/password-field.js.map +1 -0
- package/dist/password-strength/index.d.ts +2 -0
- package/dist/password-strength/index.js +2 -0
- package/dist/password-strength/password-strength.d.ts +127 -0
- package/dist/password-strength/password-strength.js +455 -0
- package/dist/password-strength/password-strength.js.map +1 -0
- package/dist/phone-input/index.d.ts +3 -0
- package/dist/phone-input/index.js +3 -0
- package/dist/phone-input/phone-countries.d.ts +29 -0
- package/dist/phone-input/phone-countries.js +170 -0
- package/dist/phone-input/phone-countries.js.map +1 -0
- package/dist/phone-input/phone-input.d.ts +66 -0
- package/dist/phone-input/phone-input.js +440 -0
- package/dist/phone-input/phone-input.js.map +1 -0
- package/dist/popover/popover.d.ts +20 -0
- package/dist/popover/popover.js +33 -9
- package/dist/popover/popover.js.map +1 -1
- package/dist/progress/progress.js +46 -5
- package/dist/progress/progress.js.map +1 -1
- package/dist/radio-group/radio-group.js +8 -7
- package/dist/radio-group/radio-group.js.map +1 -1
- package/dist/reactions/index.d.ts +2 -0
- package/dist/reactions/index.js +2 -0
- package/dist/reactions/reactions.d.ts +50 -0
- package/dist/reactions/reactions.js +315 -0
- package/dist/reactions/reactions.js.map +1 -0
- package/dist/rich-text-editor/index.d.ts +3 -0
- package/dist/rich-text-editor/index.js +2 -0
- package/dist/rich-text-editor/rich-text-editor.d.ts +70 -0
- package/dist/rich-text-editor/rich-text-editor.js +909 -0
- package/dist/rich-text-editor/rich-text-editor.js.map +1 -0
- package/dist/rich-text-editor/rich-text-engine.d.ts +16 -0
- package/dist/rich-text-editor/rich-text-engine.js +366 -0
- package/dist/rich-text-editor/rich-text-engine.js.map +1 -0
- package/dist/rich-text-editor/rich-text-html.js +174 -0
- package/dist/rich-text-editor/rich-text-html.js.map +1 -0
- package/dist/rich-text-editor/rich-text-icons.js +43 -0
- package/dist/rich-text-editor/rich-text-icons.js.map +1 -0
- package/dist/ridgeline/index.d.ts +2 -0
- package/dist/ridgeline/index.js +2 -0
- package/dist/ridgeline/ridgeline.d.ts +55 -0
- package/dist/ridgeline/ridgeline.js +701 -0
- package/dist/ridgeline/ridgeline.js.map +1 -0
- package/dist/scroll-area/index.d.ts +2 -2
- package/dist/scroll-area/index.js +2 -2
- package/dist/scroll-area/scroll-area.d.ts +75 -28
- package/dist/scroll-area/scroll-area.js +212 -41
- package/dist/scroll-area/scroll-area.js.map +1 -1
- package/dist/scrub-input/evaluate.d.ts +14 -0
- package/dist/scrub-input/evaluate.js +72 -0
- package/dist/scrub-input/evaluate.js.map +1 -0
- package/dist/scrub-input/index.d.ts +3 -0
- package/dist/scrub-input/index.js +3 -0
- package/dist/scrub-input/scrub-input.d.ts +74 -0
- package/dist/scrub-input/scrub-input.js +486 -0
- package/dist/scrub-input/scrub-input.js.map +1 -0
- package/dist/search-field/index.d.ts +2 -0
- package/dist/search-field/index.js +2 -0
- package/dist/search-field/search-field.d.ts +27 -0
- package/dist/search-field/search-field.js +155 -0
- package/dist/search-field/search-field.js.map +1 -0
- package/dist/select/select.d.ts +3 -1
- package/dist/select/select.js +95 -25
- package/dist/select/select.js.map +1 -1
- package/dist/separator/separator.d.ts +1 -1
- package/dist/sheet/sheet.js +4 -2
- package/dist/sheet/sheet.js.map +1 -1
- package/dist/shortcut-recorder/index.d.ts +3 -0
- package/dist/shortcut-recorder/index.js +3 -0
- package/dist/shortcut-recorder/shortcut-model.d.ts +27 -0
- package/dist/shortcut-recorder/shortcut-model.js +206 -0
- package/dist/shortcut-recorder/shortcut-model.js.map +1 -0
- package/dist/shortcut-recorder/shortcut-recorder.d.ts +93 -0
- package/dist/shortcut-recorder/shortcut-recorder.js +489 -0
- package/dist/shortcut-recorder/shortcut-recorder.js.map +1 -0
- package/dist/side-nav/index.d.ts +2 -0
- package/dist/side-nav/index.js +2 -0
- package/dist/side-nav/side-nav.d.ts +72 -0
- package/dist/side-nav/side-nav.js +142 -0
- package/dist/side-nav/side-nav.js.map +1 -0
- package/dist/skeleton/skeleton.d.ts +8 -2
- package/dist/skeleton/skeleton.js +6 -2
- package/dist/skeleton/skeleton.js.map +1 -1
- package/dist/slider/index.d.ts +2 -2
- package/dist/slider/slider.d.ts +46 -14
- package/dist/slider/slider.js +188 -50
- package/dist/slider/slider.js.map +1 -1
- package/dist/slope-chart/index.d.ts +2 -0
- package/dist/slope-chart/index.js +2 -0
- package/dist/slope-chart/slope-chart.d.ts +54 -0
- package/dist/slope-chart/slope-chart.js +568 -0
- package/dist/slope-chart/slope-chart.js.map +1 -0
- package/dist/sparkline/index.d.ts +2 -0
- package/dist/sparkline/index.js +2 -0
- package/dist/sparkline/sparkline.d.ts +46 -0
- package/dist/sparkline/sparkline.js +390 -0
- package/dist/sparkline/sparkline.js.map +1 -0
- package/dist/split-bar/index.d.ts +2 -0
- package/dist/split-bar/index.js +2 -0
- package/dist/split-bar/split-bar.d.ts +62 -0
- package/dist/split-bar/split-bar.js +513 -0
- package/dist/split-bar/split-bar.js.map +1 -0
- package/dist/split-button/index.d.ts +2 -0
- package/dist/split-button/index.js +2 -0
- package/dist/split-button/split-button.d.ts +46 -0
- package/dist/split-button/split-button.js +123 -0
- package/dist/split-button/split-button.js.map +1 -0
- package/dist/stat-card/index.d.ts +2 -0
- package/dist/stat-card/index.js +2 -0
- package/dist/stat-card/stat-card.d.ts +101 -0
- package/dist/stat-card/stat-card.js +249 -0
- package/dist/stat-card/stat-card.js.map +1 -0
- package/dist/stepper/index.d.ts +2 -0
- package/dist/stepper/index.js +2 -0
- package/dist/stepper/stepper.d.ts +51 -0
- package/dist/stepper/stepper.js +215 -0
- package/dist/stepper/stepper.js.map +1 -0
- package/dist/streamgraph/index.d.ts +2 -0
- package/dist/streamgraph/index.js +2 -0
- package/dist/streamgraph/streamgraph.d.ts +70 -0
- package/dist/streamgraph/streamgraph.js +613 -0
- package/dist/streamgraph/streamgraph.js.map +1 -0
- package/dist/styles.css +1 -1
- package/dist/swipe-actions/index.d.ts +2 -0
- package/dist/swipe-actions/index.js +2 -0
- package/dist/swipe-actions/swipe-actions.d.ts +67 -0
- package/dist/swipe-actions/swipe-actions.js +552 -0
- package/dist/swipe-actions/swipe-actions.js.map +1 -0
- package/dist/switch/switch.js +10 -9
- package/dist/switch/switch.js.map +1 -1
- package/dist/table/index.d.ts +2 -2
- package/dist/table/index.js +2 -2
- package/dist/table/table.d.ts +87 -4
- package/dist/table/table.js +441 -165
- package/dist/table/table.js.map +1 -1
- package/dist/tabs/tabs.js +143 -7
- package/dist/tabs/tabs.js.map +1 -1
- package/dist/tag-input/index.d.ts +2 -0
- package/dist/tag-input/index.js +2 -0
- package/dist/tag-input/tag-input.d.ts +40 -0
- package/dist/tag-input/tag-input.js +269 -0
- package/dist/tag-input/tag-input.js.map +1 -0
- package/dist/text-morph/index.d.ts +2 -0
- package/dist/text-morph/index.js +2 -0
- package/dist/text-morph/text-morph.d.ts +23 -0
- package/dist/text-morph/text-morph.js +21 -0
- package/dist/text-morph/text-morph.js.map +1 -0
- package/dist/text-reveal/index.d.ts +2 -0
- package/dist/text-reveal/index.js +2 -0
- package/dist/text-reveal/text-reveal.d.ts +27 -0
- package/dist/text-reveal/text-reveal.js +51 -0
- package/dist/text-reveal/text-reveal.js.map +1 -0
- package/dist/text-shimmer/index.d.ts +2 -0
- package/dist/text-shimmer/index.js +2 -0
- package/dist/text-shimmer/text-shimmer.d.ts +29 -0
- package/dist/text-shimmer/text-shimmer.js +29 -0
- package/dist/text-shimmer/text-shimmer.js.map +1 -0
- package/dist/textarea/textarea.d.ts +23 -0
- package/dist/textarea/textarea.js +24 -2
- package/dist/textarea/textarea.js.map +1 -1
- package/dist/theme-switch/index.d.ts +2 -0
- package/dist/theme-switch/index.js +2 -0
- package/dist/theme-switch/theme-switch.d.ts +37 -0
- package/dist/theme-switch/theme-switch.js +123 -0
- package/dist/theme-switch/theme-switch.js.map +1 -0
- package/dist/time-picker/index.d.ts +2 -0
- package/dist/time-picker/index.js +2 -0
- package/dist/time-picker/time-picker.d.ts +54 -0
- package/dist/time-picker/time-picker.js +201 -0
- package/dist/time-picker/time-picker.js.map +1 -0
- package/dist/toast/index.d.ts +2 -2
- package/dist/toast/index.js +2 -2
- package/dist/toast/toast.d.ts +6 -0
- package/dist/toast/toast.js +98 -36
- package/dist/toast/toast.js.map +1 -1
- package/dist/tooltip/tooltip.d.ts +10 -3
- package/dist/tooltip/tooltip.js +67 -18
- package/dist/tooltip/tooltip.js.map +1 -1
- package/dist/treemap/index.d.ts +2 -0
- package/dist/treemap/index.js +2 -0
- package/dist/treemap/treemap.d.ts +53 -0
- package/dist/treemap/treemap.js +699 -0
- package/dist/treemap/treemap.js.map +1 -0
- package/dist/usage-meter/index.d.ts +2 -0
- package/dist/usage-meter/index.js +2 -0
- package/dist/usage-meter/usage-meter.d.ts +50 -0
- package/dist/usage-meter/usage-meter.js +440 -0
- package/dist/usage-meter/usage-meter.js.map +1 -0
- package/dist/waffle-chart/index.d.ts +2 -0
- package/dist/waffle-chart/index.js +2 -0
- package/dist/waffle-chart/waffle-chart.d.ts +57 -0
- package/dist/waffle-chart/waffle-chart.js +426 -0
- package/dist/waffle-chart/waffle-chart.js.map +1 -0
- package/package.json +245 -3
|
@@ -4,7 +4,7 @@ import { selectionLabelVariants, selectionRingVariants } from "../lib/selection-
|
|
|
4
4
|
import { cva } from "class-variance-authority";
|
|
5
5
|
import { forwardRef } from "react";
|
|
6
6
|
import { Checkbox } from "react-aria-components";
|
|
7
|
-
import { Fragment, jsx, jsxs } from "react/jsx-runtime";
|
|
7
|
+
import { Fragment as Fragment$1, jsx, jsxs } from "react/jsx-runtime";
|
|
8
8
|
//#region src/checkbox/checkbox.tsx
|
|
9
9
|
/**
|
|
10
10
|
* Checkbox, rebuilt on React Aria.
|
|
@@ -43,15 +43,14 @@ import { Fragment, jsx, jsxs } from "react/jsx-runtime";
|
|
|
43
43
|
*/
|
|
44
44
|
const checkboxVariants = cva([selectionLabelVariants()]);
|
|
45
45
|
const checkboxBoxVariants = cva([
|
|
46
|
-
"inline-flex size-4 shrink-0 items-center justify-center",
|
|
47
|
-
"rounded-
|
|
46
|
+
"inline-flex size-4.5 shrink-0 items-center justify-center",
|
|
47
|
+
"rounded-checkbox border-(length:--border-width)",
|
|
48
48
|
"box-border",
|
|
49
|
-
"bg-
|
|
50
|
-
"
|
|
51
|
-
"group-data-[selected]:
|
|
52
|
-
"group-data-[
|
|
53
|
-
"group-data-[
|
|
54
|
-
"group-data-[indeterminate]:text-primary-foreground",
|
|
49
|
+
"bg-surface border-control-edge text-primary-foreground",
|
|
50
|
+
"checkbox-box",
|
|
51
|
+
"group-data-[selected]:border-primary-strong",
|
|
52
|
+
"group-data-[indeterminate]:border-primary-strong",
|
|
53
|
+
"group-data-[hovered]:not-group-data-[selected]:not-group-data-[indeterminate]:border-muted-foreground",
|
|
55
54
|
selectionRingVariants()
|
|
56
55
|
]);
|
|
57
56
|
const Checkbox$1 = forwardRef(function Checkbox$2({ className, children, ...props }, ref) {
|
|
@@ -60,30 +59,28 @@ const Checkbox$1 = forwardRef(function Checkbox$2({ className, children, ...prop
|
|
|
60
59
|
inputRef: ref,
|
|
61
60
|
"data-slot": "checkbox",
|
|
62
61
|
className: cn(checkboxVariants(), className),
|
|
63
|
-
children: ({ isSelected, isIndeterminate }) => /* @__PURE__ */ jsxs(Fragment, { children: [/* @__PURE__ */
|
|
62
|
+
children: ({ isSelected, isIndeterminate }) => /* @__PURE__ */ jsxs(Fragment$1, { children: [/* @__PURE__ */ jsxs("span", {
|
|
64
63
|
"aria-hidden": "true",
|
|
65
64
|
"data-slot": "checkbox-box",
|
|
66
65
|
className: checkboxBoxVariants(),
|
|
67
|
-
children:
|
|
68
|
-
"data-slot": "checkbox-
|
|
69
|
-
|
|
66
|
+
children: [/* @__PURE__ */ jsx("span", {
|
|
67
|
+
"data-slot": "checkbox-fill",
|
|
68
|
+
className: "checkbox-fill"
|
|
69
|
+
}), /* @__PURE__ */ jsx("svg", {
|
|
70
|
+
"data-slot": "checkbox-mark",
|
|
71
|
+
"data-mark": isIndeterminate ? "indeterminate" : isSelected ? "check" : void 0,
|
|
72
|
+
viewBox: "0 0 18 18",
|
|
70
73
|
fill: "none",
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
strokeWidth: "2.5",
|
|
82
|
-
strokeLinecap: "round",
|
|
83
|
-
strokeLinejoin: "round",
|
|
84
|
-
className: "size-3",
|
|
85
|
-
children: /* @__PURE__ */ jsx("path", { d: "m3.5 8.5 3 3 6-6" })
|
|
86
|
-
}) : null
|
|
74
|
+
className: "absolute -inset-px size-4.5 overflow-visible",
|
|
75
|
+
children: /* @__PURE__ */ jsx("path", {
|
|
76
|
+
className: "checkbox-mark",
|
|
77
|
+
pathLength: "1",
|
|
78
|
+
stroke: "currentColor",
|
|
79
|
+
strokeWidth: "2",
|
|
80
|
+
strokeLinecap: "round",
|
|
81
|
+
strokeLinejoin: "round"
|
|
82
|
+
})
|
|
83
|
+
})]
|
|
87
84
|
}), children == null ? null : /* @__PURE__ */ jsx("span", {
|
|
88
85
|
"data-slot": "checkbox-label",
|
|
89
86
|
children
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"checkbox.js","names":["Checkbox","AriaCheckbox"],"sources":["../../src/checkbox/checkbox.tsx"],"sourcesContent":["\"use client\";\n\nimport { cva } from \"class-variance-authority\";\nimport { forwardRef, type ReactNode } from \"react\";\nimport {\n Checkbox as AriaCheckbox,\n type CheckboxProps as AriaCheckboxProps,\n} from \"react-aria-components\";\n\nimport { cn } from \"../lib/cn.js\";\nimport { selectionLabelVariants, selectionRingVariants } from \"../lib/selection-control.js\";\n\n/**\n * Checkbox, rebuilt on React Aria.\n *\n * THE CENSUS FOUND ZERO CALL SITES. It is ported anyway because forms and\n * table row selection are unbuildable without it, but that fact changes what\n * this is: with no usage to be faithful to and no call site to break, it is a\n * rewrite rather than a restyling. Four things the legacy component got\n * wrong are therefore simply fixed rather than carried:\n *\n * - **No accessible name.** It rendered a bare `<input type=\"checkbox\">` with\n * no label, no `aria-label` and no `id`, so every use was an axe `label`\n * violation. Here the label is `children`, and React Aria wraps the input\n * in it.\n * - **The fill never showed.** `checked:bg-primary` on a native input with no\n * `appearance-none` is painted over by the user-agent checkbox.\n * - **`border-primary` cannot be a boundary.** Brand orange is 2.44:1 on\n * white, under even the 3:1 non-text floor (WCAG 1.4.11).\n * - **`focus-visible:ring-2` is a box-shadow**, which forced-colors discards,\n * taking the only focus indication with it.\n *\n * React Aria renders a `<label>` around a visually-hidden real `<input>` and\n * NOTHING else -- there is no visual box in the box. Drawing one, and keeping\n * it in step with `data-selected` / `data-indeterminate`, is what this\n * component owns.\n *\n * Every string in the cva blocks below is a STATIC literal. Tailwind scans\n * source text, so a class assembled at runtime is invisible to it and would\n * simply never be emitted.\n */\n/**\n * The label geometry now lives in lib/selection-control.ts, shared with\n * Radio and Switch. Three controls with the same 24px target and the same\n * typography is the Rule of Three, and this migration has twice found a\n * legacy pair that styled one surface twice and silently drifted.\n */\nexport const checkboxVariants = cva([selectionLabelVariants()]);\n\nexport const checkboxBoxVariants = cva([\n \"inline-flex size-4 shrink-0 items-center justify-center\",\n
|
|
1
|
+
{"version":3,"file":"checkbox.js","names":["Checkbox","AriaCheckbox"],"sources":["../../src/checkbox/checkbox.tsx"],"sourcesContent":["\"use client\";\n\nimport { cva } from \"class-variance-authority\";\nimport { forwardRef, type ReactNode } from \"react\";\nimport {\n Checkbox as AriaCheckbox,\n type CheckboxProps as AriaCheckboxProps,\n} from \"react-aria-components\";\n\nimport { cn } from \"../lib/cn.js\";\nimport { selectionLabelVariants, selectionRingVariants } from \"../lib/selection-control.js\";\n\n/**\n * Checkbox, rebuilt on React Aria.\n *\n * THE CENSUS FOUND ZERO CALL SITES. It is ported anyway because forms and\n * table row selection are unbuildable without it, but that fact changes what\n * this is: with no usage to be faithful to and no call site to break, it is a\n * rewrite rather than a restyling. Four things the legacy component got\n * wrong are therefore simply fixed rather than carried:\n *\n * - **No accessible name.** It rendered a bare `<input type=\"checkbox\">` with\n * no label, no `aria-label` and no `id`, so every use was an axe `label`\n * violation. Here the label is `children`, and React Aria wraps the input\n * in it.\n * - **The fill never showed.** `checked:bg-primary` on a native input with no\n * `appearance-none` is painted over by the user-agent checkbox.\n * - **`border-primary` cannot be a boundary.** Brand orange is 2.44:1 on\n * white, under even the 3:1 non-text floor (WCAG 1.4.11).\n * - **`focus-visible:ring-2` is a box-shadow**, which forced-colors discards,\n * taking the only focus indication with it.\n *\n * React Aria renders a `<label>` around a visually-hidden real `<input>` and\n * NOTHING else -- there is no visual box in the box. Drawing one, and keeping\n * it in step with `data-selected` / `data-indeterminate`, is what this\n * component owns.\n *\n * Every string in the cva blocks below is a STATIC literal. Tailwind scans\n * source text, so a class assembled at runtime is invisible to it and would\n * simply never be emitted.\n */\n/**\n * The label geometry now lives in lib/selection-control.ts, shared with\n * Radio and Switch. Three controls with the same 24px target and the same\n * typography is the Rule of Three, and this migration has twice found a\n * legacy pair that styled one surface twice and silently drifted.\n */\nexport const checkboxVariants = cva([selectionLabelVariants()]);\n\nexport const checkboxBoxVariants = cva([\n \"inline-flex size-4.5 shrink-0 items-center justify-center\",\n \"rounded-checkbox border-(length:--border-width)\",\n\n // box-border: the size is the whole square, border included.\n \"box-border\",\n\n \"bg-surface border-control-edge text-primary-foreground\",\n\n // Border colour eases, the square presses to .95 and springs back (see checkbox-box).\n \"checkbox-box\",\n\n // The border takes the strong tone once chosen; the colour itself is the fill below.\n \"group-data-[selected]:border-primary-strong\",\n \"group-data-[indeterminate]:border-primary-strong\",\n // Hover darkens an unchosen box's border.\n \"group-data-[hovered]:not-group-data-[selected]:not-group-data-[indeterminate]:border-muted-foreground\",\n\n selectionRingVariants(),\n]);\n\nexport interface CheckboxProps\n extends Omit<AriaCheckboxProps, \"className\" | \"style\" | \"children\"> {\n /**\n * The label, and the control's accessible name.\n *\n * Omit it only for a genuinely label-less checkbox -- a table row selector\n * -- and pass `aria-label` instead. A checkbox with neither has no\n * accessible name, which is what every legacy call site would have been.\n */\n children?: ReactNode;\n /** Extra classes for the label. Merged last, so they win conflicts. */\n className?: string;\n}\n\nexport const Checkbox = forwardRef<HTMLInputElement, CheckboxProps>(function Checkbox(\n { className, children, ...props },\n ref,\n) {\n return (\n <AriaCheckbox\n {...props}\n // inputRef, not ref: AriaCheckbox's own ref targets the label it\n // renders around a visually-hidden native input, and a label cannot\n // be focused -- ref.current.focus() would silently no-op. inputRef is\n // React Aria's own escape hatch to the real control.\n inputRef={ref}\n data-slot=\"checkbox\"\n // `group` is load-bearing: React Aria puts data-selected,\n // data-indeterminate and data-focus-visible on the LABEL, and CSS\n // cannot look upward from the box to them.\n className={cn(checkboxVariants(), className)}\n >\n {({ isSelected, isIndeterminate }) => (\n <>\n {/*\n aria-hidden: the real <input> already carries the state. A\n decorative box announced as well would say everything twice.\n */}\n <span aria-hidden=\"true\" data-slot=\"checkbox-box\" className={checkboxBoxVariants()}>\n <span data-slot=\"checkbox-fill\" className=\"checkbox-fill\" />\n {/*\n One mark, always rendered: the state decides what it shows. Both\n states can be true at once (a \"select all\" box that has been\n partially cleared) and indeterminate wins, which the path's\n `d` carries in CSS -- the same precedence the old two-glyph\n branch pinned in JS.\n */}\n <svg\n data-slot=\"checkbox-mark\"\n data-mark={isIndeterminate ? \"indeterminate\" : isSelected ? \"check\" : undefined}\n viewBox=\"0 0 18 18\"\n fill=\"none\"\n className=\"absolute -inset-px size-4.5 overflow-visible\"\n >\n <path\n className=\"checkbox-mark\"\n pathLength=\"1\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n </span>\n {children == null ? null : <span data-slot=\"checkbox-label\">{children}</span>}\n </>\n )}\n </AriaCheckbox>\n );\n});\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA+CA,MAAa,mBAAmB,IAAI,CAAC,uBAAuB,CAAC,CAAC;AAE9D,MAAa,sBAAsB,IAAI;CACrC;CACA;CAGA;CAEA;CAGA;CAGA;CACA;CAEA;CAEA,sBAAsB;AACxB,CAAC;AAgBD,MAAaA,aAAW,WAA4C,SAASA,WAC3E,EAAE,WAAW,UAAU,GAAG,SAC1B,KACA;CACA,OACE,oBAACC,UAAD;EACE,GAAI;EAKJ,UAAU;EACV,aAAU;EAIV,WAAW,GAAG,iBAAiB,GAAG,SAAS;EAEzC,WAAA,EAAE,YAAY,sBACd,qBAAA,YAAA,EAAA,UAAA,CAKE,qBAAC,QAAD;GAAM,eAAY;GAAO,aAAU;GAAe,WAAW,oBAAoB;GAAjF,UAAA,CACE,oBAAC,QAAD;IAAM,aAAU;IAAgB,WAAU;GAAiB,CAAA,GAQ3D,oBAAC,OAAD;IACE,aAAU;IACV,aAAW,kBAAkB,kBAAkB,aAAa,UAAU,KAAA;IACtE,SAAQ;IACR,MAAK;IACL,WAAU;IAEV,UAAA,oBAAC,QAAD;KACE,WAAU;KACV,YAAW;KACX,QAAO;KACP,aAAY;KACZ,eAAc;KACd,gBAAe;IAChB,CAAA;GACE,CAAA,CACD;EACL,CAAA,GAAA,YAAY,OAAO,OAAO,oBAAC,QAAD;GAAM,aAAU;GAAkB;EAAe,CAAA,CAC5E,EAAA,CAAA;CAEQ,CAAA;AAElB,CAAC"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
//#region src/chip-group/chip-group.d.ts
|
|
2
|
+
/**
|
|
3
|
+
* ChipGroup: selectable filter chips for narrowing a list by facets people
|
|
4
|
+
* toggle often, such as topics, statuses or tags.
|
|
5
|
+
*
|
|
6
|
+
* Selecting a chip grows a check in at its start (it draws itself as it
|
|
7
|
+
* scales up from a soft blur), the label slides over, the chip widens on the
|
|
8
|
+
* morph spring, and its neighbours glide to their new places, even across
|
|
9
|
+
* lines. The row follows its own height. Long sets fold behind a "+N more"
|
|
10
|
+
* chip; opening it grows the hidden chips in one after another. Arrow keys move
|
|
11
|
+
* between chips, Space or Enter toggles, and each chip is a pressed or
|
|
12
|
+
* unpressed button. Selected reads as a tint plus the check, never colour alone.
|
|
13
|
+
*/
|
|
14
|
+
export interface ChipOption {
|
|
15
|
+
value: string;
|
|
16
|
+
label: string;
|
|
17
|
+
}
|
|
18
|
+
export interface ChipGroupProps {
|
|
19
|
+
options: ChipOption[];
|
|
20
|
+
value: string[];
|
|
21
|
+
onValueChange: (value: string[]) => void;
|
|
22
|
+
/** Accessible name of the group, such as "Topics". */
|
|
23
|
+
label: string;
|
|
24
|
+
/** Allow several chips at once. In single mode the selected chip can still be cleared. @default true */
|
|
25
|
+
multiple?: boolean;
|
|
26
|
+
/** Chips shown before the rest fold behind a "+N more" chip. Chips selected when it folds stay in view. */
|
|
27
|
+
maxVisible?: number;
|
|
28
|
+
/** Text of the overflow chip. @default (hidden) => `+${hidden} more` */
|
|
29
|
+
moreLabel?: (hidden: number) => string;
|
|
30
|
+
/** @default "Show less" */
|
|
31
|
+
lessLabel?: string;
|
|
32
|
+
/** Extra classes for the group. Merged last. */
|
|
33
|
+
className?: string;
|
|
34
|
+
}
|
|
35
|
+
export declare const ChipGroup: import("react").ForwardRefExoticComponent<ChipGroupProps & import("react").RefAttributes<HTMLDivElement>>;
|
|
36
|
+
//#endregion
|
|
37
|
+
//# sourceMappingURL=chip-group.d.ts.map
|
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { cn } from "../lib/cn.js";
|
|
3
|
+
import { mergeRefs } from "../lib/merge-refs.js";
|
|
4
|
+
import { SwapText } from "../lib/swap-text.js";
|
|
5
|
+
import { useHeightFollow } from "../lib/height-follow.js";
|
|
6
|
+
import { useFlip } from "../lib/flip.js";
|
|
7
|
+
import { forwardRef, useMemo, useRef, useState } from "react";
|
|
8
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
9
|
+
//#region src/chip-group/chip-group.tsx
|
|
10
|
+
/** Roving-focus key of the overflow chip; the NUL keeps it from colliding with any option value. */
|
|
11
|
+
const MORE = "\0more";
|
|
12
|
+
/** Stagger between chips revealed by the overflow (ms), at most 300 in all. */
|
|
13
|
+
const STAGGER_MS = 35;
|
|
14
|
+
const ChipGroup = forwardRef(function ChipGroup({ options, value, onValueChange, label, multiple = true, maxVisible = Infinity, moreLabel = (hidden) => `+${hidden} more`, lessLabel = "Show less", className }, ref) {
|
|
15
|
+
const [expanded, setExpanded] = useState(false);
|
|
16
|
+
const [pinned, setPinned] = useState(value);
|
|
17
|
+
const [active, setActive] = useState(null);
|
|
18
|
+
const foldable = options.length > maxVisible;
|
|
19
|
+
const visible = !foldable || expanded ? options : options.filter((option, index) => index < maxVisible || pinned.includes(option.value) || value.includes(option.value));
|
|
20
|
+
const hidden = options.length - visible.length;
|
|
21
|
+
const showMore = foldable && (expanded || hidden > 0);
|
|
22
|
+
const keys = [...visible.map((option) => option.value), ...showMore ? [MORE] : []];
|
|
23
|
+
const tabStop = active !== null && keys.includes(active) ? active : visible.find((option) => value.includes(option.value))?.value ?? keys[0];
|
|
24
|
+
const group = useRef(null);
|
|
25
|
+
const refs = useMemo(() => mergeRefs(ref, group), [ref]);
|
|
26
|
+
const frame = useRef(null);
|
|
27
|
+
const morphKey = `${expanded}|${value.join(",")}`;
|
|
28
|
+
useFlip(group, morphKey, "var(--duration-morph)", "var(--ease-morph)");
|
|
29
|
+
useHeightFollow(frame, group, morphKey);
|
|
30
|
+
const seen = useRef(new Set(options.map((option) => option.value)));
|
|
31
|
+
const revealedAt = /* @__PURE__ */ new Map();
|
|
32
|
+
let rank = 0;
|
|
33
|
+
for (const option of visible) if (!seen.current.has(option.value)) revealedAt.set(option.value, Math.min(rank++ * STAGGER_MS, 300));
|
|
34
|
+
function toggle(next) {
|
|
35
|
+
const on = value.includes(next);
|
|
36
|
+
if (!multiple) {
|
|
37
|
+
onValueChange(on ? [] : [next]);
|
|
38
|
+
return;
|
|
39
|
+
}
|
|
40
|
+
onValueChange(options.filter((option) => option.value === next ? !on : value.includes(option.value)).map((option) => option.value));
|
|
41
|
+
}
|
|
42
|
+
function toggleMore() {
|
|
43
|
+
if (expanded) setPinned(value);
|
|
44
|
+
else seen.current = new Set(visible.map((option) => option.value));
|
|
45
|
+
setExpanded(!expanded);
|
|
46
|
+
}
|
|
47
|
+
function onKeyDown(event) {
|
|
48
|
+
const buttons = Array.from(event.currentTarget.querySelectorAll("button[data-chip]"));
|
|
49
|
+
const index = buttons.indexOf(document.activeElement);
|
|
50
|
+
if (index < 0) return;
|
|
51
|
+
const last = buttons.length - 1;
|
|
52
|
+
const moves = {
|
|
53
|
+
ArrowRight: index === last ? 0 : index + 1,
|
|
54
|
+
ArrowDown: index === last ? 0 : index + 1,
|
|
55
|
+
ArrowLeft: index === 0 ? last : index - 1,
|
|
56
|
+
ArrowUp: index === 0 ? last : index - 1,
|
|
57
|
+
Home: 0,
|
|
58
|
+
End: last
|
|
59
|
+
};
|
|
60
|
+
if (!(event.key in moves)) return;
|
|
61
|
+
event.preventDefault();
|
|
62
|
+
buttons[moves[event.key]].focus();
|
|
63
|
+
}
|
|
64
|
+
const moreText = expanded ? lessLabel : moreLabel(hidden);
|
|
65
|
+
return /* @__PURE__ */ jsx("div", {
|
|
66
|
+
ref: frame,
|
|
67
|
+
"data-slot": "chip-group-frame",
|
|
68
|
+
className: "height-follow min-w-0",
|
|
69
|
+
children: /* @__PURE__ */ jsxs("div", {
|
|
70
|
+
ref: refs,
|
|
71
|
+
role: "group",
|
|
72
|
+
"aria-label": label,
|
|
73
|
+
"data-slot": "chip-group",
|
|
74
|
+
onKeyDown,
|
|
75
|
+
className: cn("relative isolate flex flex-wrap gap-2 box-border font-sans", className),
|
|
76
|
+
children: [visible.map((option) => {
|
|
77
|
+
const selected = value.includes(option.value);
|
|
78
|
+
const delay = revealedAt.get(option.value);
|
|
79
|
+
return /* @__PURE__ */ jsx("button", {
|
|
80
|
+
type: "button",
|
|
81
|
+
"data-flip": "",
|
|
82
|
+
"data-chip": option.value,
|
|
83
|
+
"data-slot": "chip",
|
|
84
|
+
"aria-pressed": selected,
|
|
85
|
+
tabIndex: tabStop === option.value ? 0 : -1,
|
|
86
|
+
onClick: () => toggle(option.value),
|
|
87
|
+
onFocus: () => setActive(option.value),
|
|
88
|
+
style: delay === void 0 ? void 0 : { animationDelay: `${delay}ms` },
|
|
89
|
+
className: cn("chip", delay === void 0 ? "" : "motion-safe:animate-chip-reveal"),
|
|
90
|
+
children: /* @__PURE__ */ jsxs("span", {
|
|
91
|
+
"data-selected": selected,
|
|
92
|
+
className: "chip-body",
|
|
93
|
+
children: [
|
|
94
|
+
/* @__PURE__ */ jsx("span", {
|
|
95
|
+
"aria-hidden": "true",
|
|
96
|
+
className: "chip-check",
|
|
97
|
+
children: /* @__PURE__ */ jsx("svg", {
|
|
98
|
+
width: 14,
|
|
99
|
+
height: 14,
|
|
100
|
+
viewBox: "0 0 24 24",
|
|
101
|
+
fill: "none",
|
|
102
|
+
stroke: "currentColor",
|
|
103
|
+
strokeWidth: 2.5,
|
|
104
|
+
strokeLinecap: "round",
|
|
105
|
+
strokeLinejoin: "round",
|
|
106
|
+
children: /* @__PURE__ */ jsx("path", {
|
|
107
|
+
d: "M4 12.5 9.5 18 20 6.5",
|
|
108
|
+
pathLength: 1
|
|
109
|
+
})
|
|
110
|
+
})
|
|
111
|
+
}),
|
|
112
|
+
/* @__PURE__ */ jsx("span", {
|
|
113
|
+
"aria-hidden": "true",
|
|
114
|
+
className: "chip-slot"
|
|
115
|
+
}),
|
|
116
|
+
/* @__PURE__ */ jsx("span", {
|
|
117
|
+
className: "truncate",
|
|
118
|
+
children: option.label
|
|
119
|
+
})
|
|
120
|
+
]
|
|
121
|
+
})
|
|
122
|
+
}, option.value);
|
|
123
|
+
}), showMore ? /* @__PURE__ */ jsx("button", {
|
|
124
|
+
type: "button",
|
|
125
|
+
"data-flip": "",
|
|
126
|
+
"data-chip": MORE,
|
|
127
|
+
"data-more": "",
|
|
128
|
+
"aria-expanded": expanded,
|
|
129
|
+
tabIndex: tabStop === MORE ? 0 : -1,
|
|
130
|
+
onClick: toggleMore,
|
|
131
|
+
onFocus: () => setActive(MORE),
|
|
132
|
+
className: "chip chip-more",
|
|
133
|
+
children: /* @__PURE__ */ jsx("span", {
|
|
134
|
+
className: "chip-body tabular-nums",
|
|
135
|
+
children: /* @__PURE__ */ jsx(SwapText, {
|
|
136
|
+
swapKey: moreText,
|
|
137
|
+
motion: "rise",
|
|
138
|
+
children: moreText
|
|
139
|
+
})
|
|
140
|
+
})
|
|
141
|
+
}, MORE) : null]
|
|
142
|
+
})
|
|
143
|
+
});
|
|
144
|
+
});
|
|
145
|
+
//#endregion
|
|
146
|
+
export { ChipGroup };
|
|
147
|
+
|
|
148
|
+
//# sourceMappingURL=chip-group.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chip-group.js","names":[],"sources":["../../src/chip-group/chip-group.tsx"],"sourcesContent":["\"use client\";\n\nimport { forwardRef, useMemo, useRef, useState, type KeyboardEvent } from \"react\";\n\nimport { cn } from \"../lib/cn.js\";\nimport { useFlip } from \"../lib/flip.js\";\nimport { useHeightFollow } from \"../lib/height-follow.js\";\nimport { mergeRefs } from \"../lib/merge-refs.js\";\nimport { SwapText } from \"../lib/swap-text.js\";\n\n/**\n * ChipGroup: selectable filter chips for narrowing a list by facets people\n * toggle often, such as topics, statuses or tags.\n *\n * Selecting a chip grows a check in at its start (it draws itself as it\n * scales up from a soft blur), the label slides over, the chip widens on the\n * morph spring, and its neighbours glide to their new places, even across\n * lines. The row follows its own height. Long sets fold behind a \"+N more\"\n * chip; opening it grows the hidden chips in one after another. Arrow keys move\n * between chips, Space or Enter toggles, and each chip is a pressed or\n * unpressed button. Selected reads as a tint plus the check, never colour alone.\n */\nexport interface ChipOption {\n value: string;\n label: string;\n}\n\nexport interface ChipGroupProps {\n options: ChipOption[];\n value: string[];\n onValueChange: (value: string[]) => void;\n /** Accessible name of the group, such as \"Topics\". */\n label: string;\n /** Allow several chips at once. In single mode the selected chip can still be cleared. @default true */\n multiple?: boolean;\n /** Chips shown before the rest fold behind a \"+N more\" chip. Chips selected when it folds stay in view. */\n maxVisible?: number;\n /** Text of the overflow chip. @default (hidden) => `+${hidden} more` */\n moreLabel?: (hidden: number) => string;\n /** @default \"Show less\" */\n lessLabel?: string;\n /** Extra classes for the group. Merged last. */\n className?: string;\n}\n\n/** Roving-focus key of the overflow chip; the NUL keeps it from colliding with any option value. */\nconst MORE = \"\\u0000more\";\n/** Stagger between chips revealed by the overflow (ms), at most 300 in all. */\nconst STAGGER_MS = 35;\n\nexport const ChipGroup = forwardRef<HTMLDivElement, ChipGroupProps>(function ChipGroup(\n {\n options,\n value,\n onValueChange,\n label,\n multiple = true,\n maxVisible = Infinity,\n moreLabel = (hidden) => `+${hidden} more`,\n lessLabel = \"Show less\",\n className,\n },\n ref,\n) {\n const [expanded, setExpanded] = useState(false);\n // Chips selected when the overflow folds stay in view, so a selection is never hidden.\n const [pinned, setPinned] = useState<string[]>(value);\n const [active, setActive] = useState<string | null>(null);\n const foldable = options.length > maxVisible;\n const visible =\n !foldable || expanded\n ? options\n : options.filter(\n (option, index) => index < maxVisible || pinned.includes(option.value) || value.includes(option.value),\n );\n const hidden = options.length - visible.length;\n const showMore = foldable && (expanded || hidden > 0);\n const keys = [...visible.map((option) => option.value), ...(showMore ? [MORE] : [])];\n // One chip holds the tab stop: the last one focused, else the first selected, else the first.\n const tabStop =\n active !== null && keys.includes(active)\n ? active\n : (visible.find((option) => value.includes(option.value))?.value ?? keys[0]);\n\n const group = useRef<HTMLDivElement | null>(null);\n const refs = useMemo(() => mergeRefs(ref, group), [ref]);\n const frame = useRef<HTMLDivElement>(null);\n const morphKey = `${expanded}|${value.join(\",\")}`;\n // Neighbours glide to their new places when a chip widens, even across lines; the row follows its height.\n useFlip(group, morphKey, \"var(--duration-morph)\", \"var(--ease-morph)\");\n useHeightFollow(frame, group, morphKey);\n // Chips that appear after the first render grow in; the ones there from the start never animate.\n const seen = useRef(new Set(options.map((option) => option.value)));\n const revealedAt = new Map<string, number>();\n let rank = 0;\n for (const option of visible) {\n if (!seen.current.has(option.value)) revealedAt.set(option.value, Math.min(rank++ * STAGGER_MS, 300));\n }\n\n function toggle(next: string) {\n const on = value.includes(next);\n if (!multiple) {\n onValueChange(on ? [] : [next]);\n return;\n }\n onValueChange(\n options.filter((option) => (option.value === next ? !on : value.includes(option.value))).map((option) => option.value),\n );\n }\n\n function toggleMore() {\n if (expanded) setPinned(value);\n // Only the chips this opening reveals grow in; the ones already on screen stay put.\n else seen.current = new Set(visible.map((option) => option.value));\n setExpanded(!expanded);\n }\n\n function onKeyDown(event: KeyboardEvent<HTMLDivElement>) {\n const buttons = Array.from(event.currentTarget.querySelectorAll<HTMLButtonElement>(\"button[data-chip]\"));\n const index = buttons.indexOf(document.activeElement as HTMLButtonElement);\n if (index < 0) return;\n const last = buttons.length - 1;\n const moves: Record<string, number> = {\n ArrowRight: index === last ? 0 : index + 1,\n ArrowDown: index === last ? 0 : index + 1,\n ArrowLeft: index === 0 ? last : index - 1,\n ArrowUp: index === 0 ? last : index - 1,\n Home: 0,\n End: last,\n };\n if (!(event.key in moves)) return;\n event.preventDefault();\n buttons[moves[event.key]!]!.focus();\n }\n\n const moreText = expanded ? lessLabel : moreLabel(hidden);\n\n return (\n <div ref={frame} data-slot=\"chip-group-frame\" className=\"height-follow min-w-0\">\n <div\n ref={refs}\n role=\"group\"\n aria-label={label}\n data-slot=\"chip-group\"\n onKeyDown={onKeyDown}\n className={cn(\"relative isolate flex flex-wrap gap-2 box-border font-sans\", className)}\n >\n {visible.map((option) => {\n const selected = value.includes(option.value);\n const delay = revealedAt.get(option.value);\n return (\n <button\n key={option.value}\n type=\"button\"\n data-flip=\"\"\n data-chip={option.value}\n data-slot=\"chip\"\n aria-pressed={selected}\n tabIndex={tabStop === option.value ? 0 : -1}\n onClick={() => toggle(option.value)}\n onFocus={() => setActive(option.value)}\n style={delay === undefined ? undefined : ({ animationDelay: `${delay}ms` })}\n className={cn(\"chip\", delay === undefined ? \"\" : \"motion-safe:animate-chip-reveal\")}\n >\n <span data-selected={selected} className=\"chip-body\">\n <span aria-hidden=\"true\" className=\"chip-check\">\n <svg width={14} height={14} viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth={2.5} strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M4 12.5 9.5 18 20 6.5\" pathLength={1} />\n </svg>\n </span>\n <span aria-hidden=\"true\" className=\"chip-slot\" />\n <span className=\"truncate\">{option.label}</span>\n </span>\n </button>\n );\n })}\n {showMore ? (\n <button\n key={MORE}\n type=\"button\"\n data-flip=\"\"\n data-chip={MORE}\n data-more=\"\"\n aria-expanded={expanded}\n tabIndex={tabStop === MORE ? 0 : -1}\n onClick={toggleMore}\n onFocus={() => setActive(MORE)}\n className=\"chip chip-more\"\n >\n <span className=\"chip-body tabular-nums\">\n <SwapText swapKey={moreText} motion=\"rise\">\n {moreText}\n </SwapText>\n </span>\n </button>\n ) : null}\n </div>\n </div>\n );\n});\n"],"mappings":";;;;;;;;;;AA8CA,MAAM,OAAO;;AAEb,MAAM,aAAa;AAEnB,MAAa,YAAY,WAA2C,SAAS,UAC3E,EACE,SACA,OACA,eACA,OACA,WAAW,MACX,aAAa,UACb,aAAa,WAAW,IAAI,OAAO,QACnC,YAAY,aACZ,aAEF,KACA;CACA,MAAM,CAAC,UAAU,eAAe,SAAS,KAAK;CAE9C,MAAM,CAAC,QAAQ,aAAa,SAAmB,KAAK;CACpD,MAAM,CAAC,QAAQ,aAAa,SAAwB,IAAI;CACxD,MAAM,WAAW,QAAQ,SAAS;CAClC,MAAM,UACJ,CAAC,YAAY,WACT,UACA,QAAQ,QACL,QAAQ,UAAU,QAAQ,cAAc,OAAO,SAAS,OAAO,KAAK,KAAK,MAAM,SAAS,OAAO,KAAK,CACvG;CACN,MAAM,SAAS,QAAQ,SAAS,QAAQ;CACxC,MAAM,WAAW,aAAa,YAAY,SAAS;CACnD,MAAM,OAAO,CAAC,GAAG,QAAQ,KAAK,WAAW,OAAO,KAAK,GAAG,GAAI,WAAW,CAAC,IAAI,IAAI,CAAC,CAAE;CAEnF,MAAM,UACJ,WAAW,QAAQ,KAAK,SAAS,MAAM,IACnC,SACC,QAAQ,MAAM,WAAW,MAAM,SAAS,OAAO,KAAK,CAAC,CAAC,EAAE,SAAS,KAAK;CAE7E,MAAM,QAAQ,OAA8B,IAAI;CAChD,MAAM,OAAO,cAAc,UAAU,KAAK,KAAK,GAAG,CAAC,GAAG,CAAC;CACvD,MAAM,QAAQ,OAAuB,IAAI;CACzC,MAAM,WAAW,GAAG,SAAS,GAAG,MAAM,KAAK,GAAG;CAE9C,QAAQ,OAAO,UAAU,yBAAyB,mBAAmB;CACrE,gBAAgB,OAAO,OAAO,QAAQ;CAEtC,MAAM,OAAO,OAAO,IAAI,IAAI,QAAQ,KAAK,WAAW,OAAO,KAAK,CAAC,CAAC;CAClE,MAAM,6BAAa,IAAI,IAAoB;CAC3C,IAAI,OAAO;CACX,KAAK,MAAM,UAAU,SACnB,IAAI,CAAC,KAAK,QAAQ,IAAI,OAAO,KAAK,GAAG,WAAW,IAAI,OAAO,OAAO,KAAK,IAAI,SAAS,YAAY,GAAG,CAAC;CAGtG,SAAS,OAAO,MAAc;EAC5B,MAAM,KAAK,MAAM,SAAS,IAAI;EAC9B,IAAI,CAAC,UAAU;GACb,cAAc,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC;GAC9B;EACF;EACA,cACE,QAAQ,QAAQ,WAAY,OAAO,UAAU,OAAO,CAAC,KAAK,MAAM,SAAS,OAAO,KAAK,CAAE,CAAC,CAAC,KAAK,WAAW,OAAO,KAAK,CACvH;CACF;CAEA,SAAS,aAAa;EACpB,IAAI,UAAU,UAAU,KAAK;OAExB,KAAK,UAAU,IAAI,IAAI,QAAQ,KAAK,WAAW,OAAO,KAAK,CAAC;EACjE,YAAY,CAAC,QAAQ;CACvB;CAEA,SAAS,UAAU,OAAsC;EACvD,MAAM,UAAU,MAAM,KAAK,MAAM,cAAc,iBAAoC,mBAAmB,CAAC;EACvG,MAAM,QAAQ,QAAQ,QAAQ,SAAS,aAAkC;EACzE,IAAI,QAAQ,GAAG;EACf,MAAM,OAAO,QAAQ,SAAS;EAC9B,MAAM,QAAgC;GACpC,YAAY,UAAU,OAAO,IAAI,QAAQ;GACzC,WAAW,UAAU,OAAO,IAAI,QAAQ;GACxC,WAAW,UAAU,IAAI,OAAO,QAAQ;GACxC,SAAS,UAAU,IAAI,OAAO,QAAQ;GACtC,MAAM;GACN,KAAK;EACP;EACA,IAAI,EAAE,MAAM,OAAO,QAAQ;EAC3B,MAAM,eAAe;EACrB,QAAQ,MAAM,MAAM,KAAM,CAAE,MAAM;CACpC;CAEA,MAAM,WAAW,WAAW,YAAY,UAAU,MAAM;CAExD,OACE,oBAAC,OAAD;EAAK,KAAK;EAAO,aAAU;EAAmB,WAAU;EACtD,UAAA,qBAAC,OAAD;GACE,KAAK;GACL,MAAK;GACL,cAAY;GACZ,aAAU;GACC;GACX,WAAW,GAAG,8DAA8D,SAAS;GANvF,UAAA,CAQG,QAAQ,KAAK,WAAW;IACvB,MAAM,WAAW,MAAM,SAAS,OAAO,KAAK;IAC5C,MAAM,QAAQ,WAAW,IAAI,OAAO,KAAK;IACzC,OACE,oBAAC,UAAD;KAEE,MAAK;KACL,aAAU;KACV,aAAW,OAAO;KAClB,aAAU;KACV,gBAAc;KACd,UAAU,YAAY,OAAO,QAAQ,IAAI;KACzC,eAAe,OAAO,OAAO,KAAK;KAClC,eAAe,UAAU,OAAO,KAAK;KACrC,OAAO,UAAU,KAAA,IAAY,KAAA,IAAa,EAAE,gBAAgB,GAAG,MAAM,IAAI;KACzE,WAAW,GAAG,QAAQ,UAAU,KAAA,IAAY,KAAK,iCAAiC;KAElF,UAAA,qBAAC,QAAD;MAAM,iBAAe;MAAU,WAAU;MAAzC,UAAA;OACE,oBAAC,QAAD;QAAM,eAAY;QAAO,WAAU;QACjC,UAAA,oBAAC,OAAD;SAAK,OAAO;SAAI,QAAQ;SAAI,SAAQ;SAAY,MAAK;SAAO,QAAO;SAAe,aAAa;SAAK,eAAc;SAAQ,gBAAe;SACvI,UAAA,oBAAC,QAAD;UAAM,GAAE;UAAwB,YAAY;SAAI,CAAA;QAC7C,CAAA;OACD,CAAA;OACN,oBAAC,QAAD;QAAM,eAAY;QAAO,WAAU;OAAa,CAAA;OAChD,oBAAC,QAAD;QAAM,WAAU;QAAY,UAAA,OAAO;OAAY,CAAA;MAC3C;;IACA,GArBD,OAAO,KAqBN;GAEZ,CAAC,GACA,WACC,oBAAC,UAAD;IAEE,MAAK;IACL,aAAU;IACV,aAAW;IACX,aAAU;IACV,iBAAe;IACf,UAAU,YAAY,OAAO,IAAI;IACjC,SAAS;IACT,eAAe,UAAU,IAAI;IAC7B,WAAU;IAEV,UAAA,oBAAC,QAAD;KAAM,WAAU;KACd,UAAA,oBAAC,UAAD;MAAU,SAAS;MAAU,QAAO;MACjC,UAAA;KACO,CAAA;IACN,CAAA;GACA,GAhBD,IAgBC,IACN,IACD;;CACF,CAAA;AAET,CAAC"}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
import { ReactNode } from "react";
|
|
2
|
+
//#region src/confirm-morph/confirm-morph.d.ts
|
|
3
|
+
/** Where the control is in its life: resting, asking, working, finished, or failed. */
|
|
4
|
+
export type ConfirmMorphState = "idle" | "confirming" | "pending" | "done" | "error";
|
|
5
|
+
/** How the question is answered: a press, a press held until the fill completes, or a press followed by a short countdown. */
|
|
6
|
+
export type ConfirmMorphMode = "press" | "hold" | "countdown";
|
|
7
|
+
/**
|
|
8
|
+
* A button for destructive or important actions that asks in place. Pressing it
|
|
9
|
+
* morphs the same pill into an inline question with Cancel and Confirm, then into
|
|
10
|
+
* a spinner, then into a result with Undo. The width springs to each face while
|
|
11
|
+
* the faces crossfade at their natural width, so text never squashes and nothing
|
|
12
|
+
* around the control jumps. Escape, an outside press, or the timeout all return
|
|
13
|
+
* it to rest.
|
|
14
|
+
*
|
|
15
|
+
* Use it where a modal dialog would be heavy: deleting a project, revoking
|
|
16
|
+
* access, discarding a draft.
|
|
17
|
+
*/
|
|
18
|
+
export interface ConfirmMorphProps {
|
|
19
|
+
/** The resting label, such as "Delete project". */
|
|
20
|
+
label: ReactNode;
|
|
21
|
+
/** A plain icon before the resting label. Mark it `aria-hidden`. */
|
|
22
|
+
icon?: ReactNode;
|
|
23
|
+
/** The question shown while confirming, such as "Delete 3 files?". Defaults to the label with a question mark. */
|
|
24
|
+
prompt?: ReactNode;
|
|
25
|
+
confirmLabel?: string;
|
|
26
|
+
cancelLabel?: string;
|
|
27
|
+
/** Shown beside the spinner while `onConfirm` resolves. */
|
|
28
|
+
pendingLabel?: string;
|
|
29
|
+
doneLabel?: string;
|
|
30
|
+
errorLabel?: string;
|
|
31
|
+
retryLabel?: string;
|
|
32
|
+
undoLabel?: string;
|
|
33
|
+
/** Shown beside the spinner while `onUndo` resolves. */
|
|
34
|
+
undoingLabel?: string;
|
|
35
|
+
/**
|
|
36
|
+
* `danger` (default) gives the confirm button the destructive colour, for
|
|
37
|
+
* actions that destroy something. `neutral` gives it the primary colour, for
|
|
38
|
+
* important actions that can be reversed. The resting button is neutral either way.
|
|
39
|
+
*/
|
|
40
|
+
tone?: "danger" | "neutral";
|
|
41
|
+
/** `press` confirms on a press. `hold` asks for a press held for `holdDuration`. `countdown` confirms, then counts down `countdown` seconds that Cancel or Escape can still stop. */
|
|
42
|
+
confirmMode?: ConfirmMorphMode;
|
|
43
|
+
/** Milliseconds the confirm button must be held in `hold` mode. */
|
|
44
|
+
holdDuration?: number;
|
|
45
|
+
/** Seconds counted down before the action runs in `countdown` mode. */
|
|
46
|
+
countdown?: number;
|
|
47
|
+
/** Text before the seconds in `countdown` mode, such as "Deleting in". Defaults to the pending label followed by "in". */
|
|
48
|
+
countdownLabel?: string;
|
|
49
|
+
/** Runs on confirm. Return a promise to show the pending face; a rejection shows the error face with Retry. */
|
|
50
|
+
onConfirm?: () => void | Promise<unknown>;
|
|
51
|
+
/** Offering it adds Undo to the result. Return a promise to show a pending face while it runs. */
|
|
52
|
+
onUndo?: () => void | Promise<unknown>;
|
|
53
|
+
onCancel?: () => void;
|
|
54
|
+
/** Controlled state. Pair it with `onStateChange`. */
|
|
55
|
+
state?: ConfirmMorphState;
|
|
56
|
+
/** Starting state when uncontrolled. */
|
|
57
|
+
defaultState?: ConfirmMorphState;
|
|
58
|
+
onStateChange?: (state: ConfirmMorphState) => void;
|
|
59
|
+
/** Milliseconds before an unanswered question returns to rest. Resting the pointer on the control pauses it. 0 turns it off. */
|
|
60
|
+
confirmTimeout?: number;
|
|
61
|
+
/** Milliseconds a result stays before returning to rest. Resting the pointer on the control pauses it. 0 turns it off. */
|
|
62
|
+
resultTimeout?: number;
|
|
63
|
+
/** A press outside the control cancels an open question. Defaults to true. */
|
|
64
|
+
cancelOnOutsidePress?: boolean;
|
|
65
|
+
isDisabled?: boolean;
|
|
66
|
+
/** Extra classes for the root. Merged last, so they win conflicts with ours. */
|
|
67
|
+
className?: string;
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* A button for an action that deserves a second thought, without a dialog. It
|
|
71
|
+
* asks in place: the pill morphs into a question with Cancel and Confirm, then
|
|
72
|
+
* a spinner, then a result with Undo, its width springing to each face while the
|
|
73
|
+
* faces crossfade at their natural width.
|
|
74
|
+
*
|
|
75
|
+
* Escape, a press outside, or the timeout answer the question with no. Focus
|
|
76
|
+
* follows the control between faces, but only when it was already inside, so a
|
|
77
|
+
* timeout never steals it. A live region announces each step.
|
|
78
|
+
*
|
|
79
|
+
* @example
|
|
80
|
+
* <ConfirmMorph label="Delete project" onConfirm={() => deleteProject()} onUndo={() => restore()} />
|
|
81
|
+
* <ConfirmMorph label="Delete project" confirmMode="hold" onConfirm={deleteProject} />
|
|
82
|
+
*/
|
|
83
|
+
export declare const ConfirmMorph: import("react").ForwardRefExoticComponent<ConfirmMorphProps & import("react").RefAttributes<HTMLDivElement>>;
|
|
84
|
+
//#endregion
|
|
85
|
+
//# sourceMappingURL=confirm-morph.d.ts.map
|