@hanzo/ui 8.27.91 → 8.28.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/NOTICE +25 -0
- package/README.md +1 -1
- package/dist/backends/gui/alert-dialog.cjs +24 -6
- package/dist/backends/gui/alert-dialog.d.ts +11 -3
- package/dist/backends/gui/alert-dialog.d.ts.map +1 -1
- package/dist/backends/gui/alert-dialog.js +24 -6
- package/dist/backends/gui/alert-dialog.js.map +1 -1
- package/dist/backends/gui/alert.cjs +32 -1
- package/dist/backends/gui/alert.d.ts +36 -3
- package/dist/backends/gui/alert.d.ts.map +1 -1
- package/dist/backends/gui/alert.js +32 -2
- package/dist/backends/gui/alert.js.map +1 -1
- package/dist/backends/gui/avatar-group.cjs +28 -0
- package/dist/backends/gui/avatar-group.d.ts +33 -0
- package/dist/backends/gui/avatar-group.d.ts.map +1 -0
- package/dist/backends/gui/avatar-group.js +26 -0
- package/dist/backends/gui/avatar-group.js.map +1 -0
- package/dist/backends/gui/avatar.cjs +53 -3
- package/dist/backends/gui/avatar.d.ts +46 -4
- package/dist/backends/gui/avatar.d.ts.map +1 -1
- package/dist/backends/gui/avatar.js +52 -3
- package/dist/backends/gui/avatar.js.map +1 -1
- package/dist/backends/gui/badge.cjs +40 -2
- package/dist/backends/gui/badge.d.ts +7 -2
- package/dist/backends/gui/badge.d.ts.map +1 -1
- package/dist/backends/gui/badge.js +40 -2
- package/dist/backends/gui/badge.js.map +1 -1
- package/dist/backends/gui/banner.cjs +40 -1
- package/dist/backends/gui/banner.d.ts +36 -3
- package/dist/backends/gui/banner.d.ts.map +1 -1
- package/dist/backends/gui/banner.js +42 -4
- package/dist/backends/gui/banner.js.map +1 -1
- package/dist/backends/gui/breadcrumb.cjs +28 -10
- package/dist/backends/gui/breadcrumb.d.ts +20 -11
- package/dist/backends/gui/breadcrumb.d.ts.map +1 -1
- package/dist/backends/gui/breadcrumb.js +28 -10
- package/dist/backends/gui/breadcrumb.js.map +1 -1
- package/dist/backends/gui/button-group.cjs +43 -0
- package/dist/backends/gui/button-group.d.ts +48 -0
- package/dist/backends/gui/button-group.d.ts.map +1 -0
- package/dist/backends/gui/button-group.js +40 -0
- package/dist/backends/gui/button-group.js.map +1 -0
- package/dist/backends/gui/button.cjs +177 -4
- package/dist/backends/gui/button.d.ts +69 -4
- package/dist/backends/gui/button.d.ts.map +1 -1
- package/dist/backends/gui/button.js +179 -6
- package/dist/backends/gui/button.js.map +1 -1
- package/dist/backends/gui/card.cjs +50 -21
- package/dist/backends/gui/card.d.ts +16 -7
- package/dist/backends/gui/card.d.ts.map +1 -1
- package/dist/backends/gui/card.js +50 -21
- package/dist/backends/gui/card.js.map +1 -1
- package/dist/backends/gui/checkbox.cjs +86 -14
- package/dist/backends/gui/checkbox.d.ts +30 -2
- package/dist/backends/gui/checkbox.d.ts.map +1 -1
- package/dist/backends/gui/checkbox.js +87 -15
- package/dist/backends/gui/checkbox.js.map +1 -1
- package/dist/backends/gui/chip.cjs +51 -0
- package/dist/backends/gui/chip.d.ts +47 -0
- package/dist/backends/gui/chip.d.ts.map +1 -0
- package/dist/backends/gui/chip.js +49 -0
- package/dist/backends/gui/chip.js.map +1 -0
- package/dist/backends/gui/choice.cjs +18 -3
- package/dist/backends/gui/choice.d.ts +10 -2
- package/dist/backends/gui/choice.d.ts.map +1 -1
- package/dist/backends/gui/choice.js +19 -4
- package/dist/backends/gui/choice.js.map +1 -1
- package/dist/backends/gui/code-editor.cjs +16 -5
- package/dist/backends/gui/code-editor.d.ts +18 -1
- package/dist/backends/gui/code-editor.d.ts.map +1 -1
- package/dist/backends/gui/code-editor.js +16 -5
- package/dist/backends/gui/code-editor.js.map +1 -1
- package/dist/backends/gui/color-sample.cjs +24 -0
- package/dist/backends/gui/color-sample.d.ts +23 -0
- package/dist/backends/gui/color-sample.d.ts.map +1 -0
- package/dist/backends/gui/color-sample.js +22 -0
- package/dist/backends/gui/color-sample.js.map +1 -0
- package/dist/backends/gui/control.cjs +5 -3
- package/dist/backends/gui/control.d.ts +13 -3
- package/dist/backends/gui/control.d.ts.map +1 -1
- package/dist/backends/gui/control.js +5 -3
- package/dist/backends/gui/control.js.map +1 -1
- package/dist/backends/gui/country-select.cjs +69 -0
- package/dist/backends/gui/country-select.d.ts +30 -0
- package/dist/backends/gui/country-select.d.ts.map +1 -0
- package/dist/backends/gui/country-select.js +67 -0
- package/dist/backends/gui/country-select.js.map +1 -0
- package/dist/backends/gui/currency-picker.cjs +48 -0
- package/dist/backends/gui/currency-picker.d.ts +37 -0
- package/dist/backends/gui/currency-picker.d.ts.map +1 -0
- package/dist/backends/gui/currency-picker.js +46 -0
- package/dist/backends/gui/currency-picker.js.map +1 -0
- package/dist/backends/gui/density.cjs +32 -0
- package/dist/backends/gui/density.d.ts +27 -0
- package/dist/backends/gui/density.d.ts.map +1 -0
- package/dist/backends/gui/density.js +27 -0
- package/dist/backends/gui/density.js.map +1 -0
- package/dist/backends/gui/dialog.cjs +65 -7
- package/dist/backends/gui/dialog.d.ts +68 -3
- package/dist/backends/gui/dialog.d.ts.map +1 -1
- package/dist/backends/gui/dialog.js +63 -7
- package/dist/backends/gui/dialog.js.map +1 -1
- package/dist/backends/gui/dropdown-menu.cjs +361 -31
- package/dist/backends/gui/dropdown-menu.d.ts +151 -15
- package/dist/backends/gui/dropdown-menu.d.ts.map +1 -1
- package/dist/backends/gui/dropdown-menu.js +353 -34
- package/dist/backends/gui/dropdown-menu.js.map +1 -1
- package/dist/backends/gui/feedback.cjs +78 -0
- package/dist/backends/gui/feedback.d.ts +46 -0
- package/dist/backends/gui/feedback.d.ts.map +1 -0
- package/dist/backends/gui/feedback.js +74 -0
- package/dist/backends/gui/feedback.js.map +1 -0
- package/dist/backends/gui/field.cjs +71 -14
- package/dist/backends/gui/field.d.ts +43 -3
- package/dist/backends/gui/field.d.ts.map +1 -1
- package/dist/backends/gui/field.js +69 -14
- package/dist/backends/gui/field.js.map +1 -1
- package/dist/backends/gui/flag.cjs +17 -0
- package/dist/backends/gui/flag.d.ts +9 -0
- package/dist/backends/gui/flag.d.ts.map +1 -0
- package/dist/backends/gui/flag.js +14 -0
- package/dist/backends/gui/flag.js.map +1 -0
- package/dist/backends/gui/grip.cjs +35 -3
- package/dist/backends/gui/grip.d.ts +16 -1
- package/dist/backends/gui/grip.d.ts.map +1 -1
- package/dist/backends/gui/grip.js +35 -3
- package/dist/backends/gui/grip.js.map +1 -1
- package/dist/backends/gui/heading.cjs +27 -0
- package/dist/backends/gui/heading.d.ts +8 -0
- package/dist/backends/gui/heading.d.ts.map +1 -0
- package/dist/backends/gui/heading.js +25 -0
- package/dist/backends/gui/heading.js.map +1 -0
- package/dist/backends/gui/hue.cjs +49 -0
- package/dist/backends/gui/hue.d.ts +18 -0
- package/dist/backends/gui/hue.d.ts.map +1 -0
- package/dist/backends/gui/hue.js +43 -0
- package/dist/backends/gui/hue.js.map +1 -0
- package/dist/backends/gui/icon-tile.cjs +36 -0
- package/dist/backends/gui/icon-tile.d.ts +26 -0
- package/dist/backends/gui/icon-tile.d.ts.map +1 -0
- package/dist/backends/gui/icon-tile.js +32 -0
- package/dist/backends/gui/icon-tile.js.map +1 -0
- package/dist/backends/gui/image-input.cjs +78 -0
- package/dist/backends/gui/image-input.d.ts +32 -0
- package/dist/backends/gui/image-input.d.ts.map +1 -0
- package/dist/backends/gui/image-input.js +74 -0
- package/dist/backends/gui/image-input.js.map +1 -0
- package/dist/backends/gui/index.cjs +93 -7
- package/dist/backends/gui/index.d.ts +45 -2
- package/dist/backends/gui/index.d.ts.map +1 -1
- package/dist/backends/gui/index.js +35 -1
- package/dist/backends/gui/index.js.map +1 -1
- package/dist/backends/gui/input-group.cjs +49 -0
- package/dist/backends/gui/input-group.d.ts +46 -0
- package/dist/backends/gui/input-group.d.ts.map +1 -0
- package/dist/backends/gui/input-group.js +46 -0
- package/dist/backends/gui/input-group.js.map +1 -0
- package/dist/backends/gui/input.cjs +32 -4
- package/dist/backends/gui/input.d.ts +5 -1
- package/dist/backends/gui/input.d.ts.map +1 -1
- package/dist/backends/gui/input.js +33 -5
- package/dist/backends/gui/input.js.map +1 -1
- package/dist/backends/gui/item.cjs +34 -2
- package/dist/backends/gui/item.d.ts +21 -5
- package/dist/backends/gui/item.d.ts.map +1 -1
- package/dist/backends/gui/item.js +35 -3
- package/dist/backends/gui/item.js.map +1 -1
- package/dist/backends/gui/json-tree.cjs +103 -15
- package/dist/backends/gui/json-tree.d.ts +39 -3
- package/dist/backends/gui/json-tree.d.ts.map +1 -1
- package/dist/backends/gui/json-tree.js +104 -16
- package/dist/backends/gui/json-tree.js.map +1 -1
- package/dist/backends/gui/kbd.cjs +18 -2
- package/dist/backends/gui/kbd.d.ts +5 -2
- package/dist/backends/gui/kbd.d.ts.map +1 -1
- package/dist/backends/gui/kbd.js +18 -2
- package/dist/backends/gui/kbd.js.map +1 -1
- package/dist/backends/gui/label.cjs +14 -3
- package/dist/backends/gui/label.d.ts +12 -3
- package/dist/backends/gui/label.d.ts.map +1 -1
- package/dist/backends/gui/label.js +14 -3
- package/dist/backends/gui/label.js.map +1 -1
- package/dist/backends/gui/layout.cjs +5 -1
- package/dist/backends/gui/layout.d.ts +1 -1
- package/dist/backends/gui/layout.d.ts.map +1 -1
- package/dist/backends/gui/layout.js +5 -1
- package/dist/backends/gui/layout.js.map +1 -1
- package/dist/backends/gui/number-field.cjs +163 -0
- package/dist/backends/gui/number-field.d.ts +34 -0
- package/dist/backends/gui/number-field.d.ts.map +1 -0
- package/dist/backends/gui/number-field.js +160 -0
- package/dist/backends/gui/number-field.js.map +1 -0
- package/dist/backends/gui/overflowing-list.cjs +79 -0
- package/dist/backends/gui/overflowing-list.d.ts +42 -0
- package/dist/backends/gui/overflowing-list.d.ts.map +1 -0
- package/dist/backends/gui/overflowing-list.js +76 -0
- package/dist/backends/gui/overflowing-list.js.map +1 -0
- package/dist/backends/gui/phone-country-picker.cjs +60 -0
- package/dist/backends/gui/phone-country-picker.d.ts +34 -0
- package/dist/backends/gui/phone-country-picker.d.ts.map +1 -0
- package/dist/backends/gui/phone-country-picker.js +57 -0
- package/dist/backends/gui/phone-country-picker.js.map +1 -0
- package/dist/backends/gui/popover.cjs +20 -4
- package/dist/backends/gui/popover.d.ts +12 -1
- package/dist/backends/gui/popover.d.ts.map +1 -1
- package/dist/backends/gui/popover.js +21 -5
- package/dist/backends/gui/popover.js.map +1 -1
- package/dist/backends/gui/progress-ring.cjs +38 -0
- package/dist/backends/gui/progress-ring.d.ts +37 -0
- package/dist/backends/gui/progress-ring.d.ts.map +1 -0
- package/dist/backends/gui/progress-ring.js +36 -0
- package/dist/backends/gui/progress-ring.js.map +1 -0
- package/dist/backends/gui/progress.cjs +31 -7
- package/dist/backends/gui/progress.d.ts +25 -3
- package/dist/backends/gui/progress.d.ts.map +1 -1
- package/dist/backends/gui/progress.js +32 -8
- package/dist/backends/gui/progress.js.map +1 -1
- package/dist/backends/gui/radio-group.cjs +28 -2
- package/dist/backends/gui/radio-group.d.ts +20 -2
- package/dist/backends/gui/radio-group.d.ts.map +1 -1
- package/dist/backends/gui/radio-group.js +28 -2
- package/dist/backends/gui/radio-group.js.map +1 -1
- package/dist/backends/gui/search-list.cjs +62 -0
- package/dist/backends/gui/search-list.d.ts +65 -0
- package/dist/backends/gui/search-list.d.ts.map +1 -0
- package/dist/backends/gui/search-list.js +58 -0
- package/dist/backends/gui/search-list.js.map +1 -0
- package/dist/backends/gui/select.cjs +50 -16
- package/dist/backends/gui/select.d.ts +12 -3
- package/dist/backends/gui/select.d.ts.map +1 -1
- package/dist/backends/gui/select.js +51 -17
- package/dist/backends/gui/select.js.map +1 -1
- package/dist/backends/gui/shortcut.cjs +122 -0
- package/dist/backends/gui/shortcut.d.ts +58 -0
- package/dist/backends/gui/shortcut.d.ts.map +1 -0
- package/dist/backends/gui/shortcut.js +115 -0
- package/dist/backends/gui/shortcut.js.map +1 -0
- package/dist/backends/gui/skeleton.cjs +41 -10
- package/dist/backends/gui/skeleton.d.ts +46 -8
- package/dist/backends/gui/skeleton.d.ts.map +1 -1
- package/dist/backends/gui/skeleton.js +39 -8
- package/dist/backends/gui/skeleton.js.map +1 -1
- package/dist/backends/gui/snippet.cjs +12 -1
- package/dist/backends/gui/snippet.d.ts +4 -2
- package/dist/backends/gui/snippet.d.ts.map +1 -1
- package/dist/backends/gui/snippet.js +12 -1
- package/dist/backends/gui/snippet.js.map +1 -1
- package/dist/backends/gui/spinner.cjs +8 -1
- package/dist/backends/gui/spinner.d.ts +11 -2
- package/dist/backends/gui/spinner.d.ts.map +1 -1
- package/dist/backends/gui/spinner.js +9 -2
- package/dist/backends/gui/spinner.js.map +1 -1
- package/dist/backends/gui/stack-icon.cjs +17 -0
- package/dist/backends/gui/stack-icon.d.ts +15 -0
- package/dist/backends/gui/stack-icon.d.ts.map +1 -0
- package/dist/backends/gui/stack-icon.js +15 -0
- package/dist/backends/gui/stack-icon.js.map +1 -0
- package/dist/backends/gui/status.cjs +38 -1
- package/dist/backends/gui/status.d.ts +16 -2
- package/dist/backends/gui/status.d.ts.map +1 -1
- package/dist/backends/gui/status.js +38 -2
- package/dist/backends/gui/status.js.map +1 -1
- package/dist/backends/gui/stepper.cjs +73 -3
- package/dist/backends/gui/stepper.d.ts +25 -1
- package/dist/backends/gui/stepper.d.ts.map +1 -1
- package/dist/backends/gui/stepper.js +71 -5
- package/dist/backends/gui/stepper.js.map +1 -1
- package/dist/backends/gui/switch.cjs +35 -20
- package/dist/backends/gui/switch.d.ts +12 -2
- package/dist/backends/gui/switch.d.ts.map +1 -1
- package/dist/backends/gui/switch.js +35 -20
- package/dist/backends/gui/switch.js.map +1 -1
- package/dist/backends/gui/tabs.cjs +63 -17
- package/dist/backends/gui/tabs.d.ts +35 -6
- package/dist/backends/gui/tabs.d.ts.map +1 -1
- package/dist/backends/gui/tabs.js +65 -19
- package/dist/backends/gui/tabs.js.map +1 -1
- package/dist/backends/gui/tag.cjs +48 -0
- package/dist/backends/gui/tag.d.ts +53 -0
- package/dist/backends/gui/tag.d.ts.map +1 -0
- package/dist/backends/gui/tag.js +46 -0
- package/dist/backends/gui/tag.js.map +1 -0
- package/dist/backends/gui/tags.cjs +9 -2
- package/dist/backends/gui/tags.d.ts +6 -5
- package/dist/backends/gui/tags.d.ts.map +1 -1
- package/dist/backends/gui/tags.js +9 -2
- package/dist/backends/gui/tags.js.map +1 -1
- package/dist/backends/gui/textarea.cjs +22 -6
- package/dist/backends/gui/textarea.d.ts +10 -1
- package/dist/backends/gui/textarea.d.ts.map +1 -1
- package/dist/backends/gui/textarea.js +22 -6
- package/dist/backends/gui/textarea.js.map +1 -1
- package/dist/backends/gui/toaster.cjs +167 -3
- package/dist/backends/gui/toaster.d.ts +28 -2
- package/dist/backends/gui/toaster.d.ts.map +1 -1
- package/dist/backends/gui/toaster.js +167 -5
- package/dist/backends/gui/toaster.js.map +1 -1
- package/dist/backends/gui/toggle-group.cjs +13 -0
- package/dist/backends/gui/toggle-group.d.ts +7 -1
- package/dist/backends/gui/toggle-group.d.ts.map +1 -1
- package/dist/backends/gui/toggle-group.js +13 -0
- package/dist/backends/gui/toggle-group.js.map +1 -1
- package/dist/backends/gui/tooltip.cjs +29 -6
- package/dist/backends/gui/tooltip.d.ts +23 -4
- package/dist/backends/gui/tooltip.d.ts.map +1 -1
- package/dist/backends/gui/tooltip.js +31 -8
- package/dist/backends/gui/tooltip.js.map +1 -1
- package/dist/backends/gui/truncated-text.cjs +102 -0
- package/dist/backends/gui/truncated-text.d.ts +55 -0
- package/dist/backends/gui/truncated-text.d.ts.map +1 -0
- package/dist/backends/gui/truncated-text.js +97 -0
- package/dist/backends/gui/truncated-text.js.map +1 -0
- package/dist/gallery/compound.cjs +60 -0
- package/dist/gallery/compound.d.ts +2 -0
- package/dist/gallery/compound.d.ts.map +1 -0
- package/dist/gallery/compound.js +58 -0
- package/dist/gallery/compound.js.map +1 -0
- package/dist/gallery/display.cjs +47 -0
- package/dist/gallery/display.d.ts +3 -0
- package/dist/gallery/display.d.ts.map +1 -0
- package/dist/gallery/display.js +45 -0
- package/dist/gallery/display.js.map +1 -0
- package/dist/gallery/feedback.cjs +38 -0
- package/dist/gallery/feedback.d.ts +2 -0
- package/dist/gallery/feedback.d.ts.map +1 -0
- package/dist/gallery/feedback.js +36 -0
- package/dist/gallery/feedback.js.map +1 -0
- package/dist/gallery/fields.cjs +53 -0
- package/dist/gallery/fields.d.ts +2 -0
- package/dist/gallery/fields.d.ts.map +1 -0
- package/dist/gallery/fields.js +51 -0
- package/dist/gallery/fields.js.map +1 -0
- package/dist/gallery/frames.cjs +47 -0
- package/dist/gallery/frames.d.ts +2 -0
- package/dist/gallery/frames.d.ts.map +1 -0
- package/dist/gallery/frames.js +45 -0
- package/dist/gallery/frames.js.map +1 -0
- package/dist/gallery/menus.cjs +64 -0
- package/dist/gallery/menus.d.ts +15 -0
- package/dist/gallery/menus.d.ts.map +1 -0
- package/dist/gallery/menus.js +58 -0
- package/dist/gallery/menus.js.map +1 -0
- package/dist/gallery/records.cjs +33 -0
- package/dist/gallery/records.d.ts +2 -0
- package/dist/gallery/records.d.ts.map +1 -0
- package/dist/gallery/records.js +31 -0
- package/dist/gallery/records.js.map +1 -0
- package/dist/gallery/section.cjs +17 -0
- package/dist/gallery/section.d.ts +10 -0
- package/dist/gallery/section.d.ts.map +1 -0
- package/dist/gallery/section.js +14 -0
- package/dist/gallery/section.js.map +1 -0
- package/dist/gallery.cjs +8 -14
- package/dist/gallery.d.ts.map +1 -1
- package/dist/gallery.html +1594 -256
- package/dist/gallery.js +3 -9
- package/dist/gallery.js.map +1 -1
- package/dist/gui-config.cjs +33 -4
- package/dist/gui-config.d.ts +11 -3
- package/dist/gui-config.d.ts.map +1 -1
- package/dist/gui-config.js +33 -4
- package/dist/gui-config.js.map +1 -1
- package/dist/index.cjs +61 -2
- package/dist/index.d.ts +4 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +7 -1
- package/dist/index.js.map +1 -1
- package/dist/index.node.cjs +61 -2
- package/dist/index.node.js +7 -1
- package/dist/motion.cjs +25 -1
- package/dist/motion.d.ts +16 -1
- package/dist/motion.d.ts.map +1 -1
- package/dist/motion.js +24 -1
- package/dist/motion.js.map +1 -1
- package/dist/primitives/AvatarGroup.cjs +8 -0
- package/dist/primitives/AvatarGroup.d.ts +2 -0
- package/dist/primitives/AvatarGroup.d.ts.map +1 -0
- package/dist/primitives/AvatarGroup.js +5 -0
- package/dist/primitives/AvatarGroup.js.map +1 -0
- package/dist/primitives/BannerAction.cjs +8 -0
- package/dist/primitives/BannerAction.d.ts +2 -0
- package/dist/primitives/BannerAction.d.ts.map +1 -0
- package/dist/primitives/BannerAction.js +5 -0
- package/dist/primitives/BannerAction.js.map +1 -0
- package/dist/primitives/ButtonGroup.cjs +8 -0
- package/dist/primitives/ButtonGroup.d.ts +2 -0
- package/dist/primitives/ButtonGroup.d.ts.map +1 -0
- package/dist/primitives/ButtonGroup.js +5 -0
- package/dist/primitives/ButtonGroup.js.map +1 -0
- package/dist/primitives/ButtonGroupContext.cjs +8 -0
- package/dist/primitives/ButtonGroupContext.d.ts +2 -0
- package/dist/primitives/ButtonGroupContext.d.ts.map +1 -0
- package/dist/primitives/ButtonGroupContext.js +5 -0
- package/dist/primitives/ButtonGroupContext.js.map +1 -0
- package/dist/primitives/CalloutAction.cjs +8 -0
- package/dist/primitives/CalloutAction.d.ts +2 -0
- package/dist/primitives/CalloutAction.d.ts.map +1 -0
- package/dist/primitives/CalloutAction.js +5 -0
- package/dist/primitives/CalloutAction.js.map +1 -0
- package/dist/primitives/Chip.cjs +8 -0
- package/dist/primitives/Chip.d.ts +2 -0
- package/dist/primitives/Chip.d.ts.map +1 -0
- package/dist/primitives/Chip.js +5 -0
- package/dist/primitives/Chip.js.map +1 -0
- package/dist/primitives/ColorSample.cjs +8 -0
- package/dist/primitives/ColorSample.d.ts +2 -0
- package/dist/primitives/ColorSample.d.ts.map +1 -0
- package/dist/primitives/ColorSample.js +5 -0
- package/dist/primitives/ColorSample.js.map +1 -0
- package/dist/primitives/CountrySelect.cjs +8 -0
- package/dist/primitives/CountrySelect.d.ts +2 -0
- package/dist/primitives/CountrySelect.d.ts.map +1 -0
- package/dist/primitives/CountrySelect.js +5 -0
- package/dist/primitives/CountrySelect.js.map +1 -0
- package/dist/primitives/CurrencyPicker.cjs +8 -0
- package/dist/primitives/CurrencyPicker.d.ts +2 -0
- package/dist/primitives/CurrencyPicker.d.ts.map +1 -0
- package/dist/primitives/CurrencyPicker.js +5 -0
- package/dist/primitives/CurrencyPicker.js.map +1 -0
- package/dist/primitives/Density.cjs +8 -0
- package/dist/primitives/Density.d.ts +2 -0
- package/dist/primitives/Density.d.ts.map +1 -0
- package/dist/primitives/Density.js +5 -0
- package/dist/primitives/Density.js.map +1 -0
- package/dist/primitives/DialogBody.cjs +8 -0
- package/dist/primitives/DialogBody.d.ts +2 -0
- package/dist/primitives/DialogBody.d.ts.map +1 -0
- package/dist/primitives/DialogBody.js +5 -0
- package/dist/primitives/DialogBody.js.map +1 -0
- package/dist/primitives/DropdownMenuBack.cjs +8 -0
- package/dist/primitives/DropdownMenuBack.d.ts +2 -0
- package/dist/primitives/DropdownMenuBack.d.ts.map +1 -0
- package/dist/primitives/DropdownMenuBack.js +5 -0
- package/dist/primitives/DropdownMenuBack.js.map +1 -0
- package/dist/primitives/DropdownMenuClose.cjs +8 -0
- package/dist/primitives/DropdownMenuClose.d.ts +2 -0
- package/dist/primitives/DropdownMenuClose.d.ts.map +1 -0
- package/dist/primitives/DropdownMenuClose.js +5 -0
- package/dist/primitives/DropdownMenuClose.js.map +1 -0
- package/dist/primitives/DropdownMenuEmpty.cjs +8 -0
- package/dist/primitives/DropdownMenuEmpty.d.ts +2 -0
- package/dist/primitives/DropdownMenuEmpty.d.ts.map +1 -0
- package/dist/primitives/DropdownMenuEmpty.js +5 -0
- package/dist/primitives/DropdownMenuEmpty.js.map +1 -0
- package/dist/primitives/DropdownMenuHeader.cjs +8 -0
- package/dist/primitives/DropdownMenuHeader.d.ts +2 -0
- package/dist/primitives/DropdownMenuHeader.d.ts.map +1 -0
- package/dist/primitives/DropdownMenuHeader.js +5 -0
- package/dist/primitives/DropdownMenuHeader.js.map +1 -0
- package/dist/primitives/DropdownMenuLoading.cjs +8 -0
- package/dist/primitives/DropdownMenuLoading.d.ts +2 -0
- package/dist/primitives/DropdownMenuLoading.d.ts.map +1 -0
- package/dist/primitives/DropdownMenuLoading.js +5 -0
- package/dist/primitives/DropdownMenuLoading.js.map +1 -0
- package/dist/primitives/DropdownMenuOptionItem.cjs +8 -0
- package/dist/primitives/DropdownMenuOptionItem.d.ts +2 -0
- package/dist/primitives/DropdownMenuOptionItem.d.ts.map +1 -0
- package/dist/primitives/DropdownMenuOptionItem.js +5 -0
- package/dist/primitives/DropdownMenuOptionItem.js.map +1 -0
- package/dist/primitives/DropdownMenuPage.cjs +8 -0
- package/dist/primitives/DropdownMenuPage.d.ts +2 -0
- package/dist/primitives/DropdownMenuPage.d.ts.map +1 -0
- package/dist/primitives/DropdownMenuPage.js +5 -0
- package/dist/primitives/DropdownMenuPage.js.map +1 -0
- package/dist/primitives/DropdownMenuSearch.cjs +8 -0
- package/dist/primitives/DropdownMenuSearch.d.ts +2 -0
- package/dist/primitives/DropdownMenuSearch.d.ts.map +1 -0
- package/dist/primitives/DropdownMenuSearch.js +5 -0
- package/dist/primitives/DropdownMenuSearch.js.map +1 -0
- package/dist/primitives/DropdownMenuSection.cjs +8 -0
- package/dist/primitives/DropdownMenuSection.d.ts +2 -0
- package/dist/primitives/DropdownMenuSection.d.ts.map +1 -0
- package/dist/primitives/DropdownMenuSection.js +5 -0
- package/dist/primitives/DropdownMenuSection.js.map +1 -0
- package/dist/primitives/DropdownMenuSelectionGroup.cjs +8 -0
- package/dist/primitives/DropdownMenuSelectionGroup.d.ts +2 -0
- package/dist/primitives/DropdownMenuSelectionGroup.d.ts.map +1 -0
- package/dist/primitives/DropdownMenuSelectionGroup.js +5 -0
- package/dist/primitives/DropdownMenuSelectionGroup.js.map +1 -0
- package/dist/primitives/DropdownMenuTitle.cjs +8 -0
- package/dist/primitives/DropdownMenuTitle.d.ts +2 -0
- package/dist/primitives/DropdownMenuTitle.d.ts.map +1 -0
- package/dist/primitives/DropdownMenuTitle.js +5 -0
- package/dist/primitives/DropdownMenuTitle.js.map +1 -0
- package/dist/primitives/Heading.cjs +2 -2
- package/dist/primitives/Heading.d.ts +1 -1
- package/dist/primitives/Heading.d.ts.map +1 -1
- package/dist/primitives/Heading.js +1 -1
- package/dist/primitives/Heading.js.map +1 -1
- package/dist/primitives/IconTile.cjs +8 -0
- package/dist/primitives/IconTile.d.ts +2 -0
- package/dist/primitives/IconTile.d.ts.map +1 -0
- package/dist/primitives/IconTile.js +5 -0
- package/dist/primitives/IconTile.js.map +1 -0
- package/dist/primitives/ImageInput.cjs +8 -0
- package/dist/primitives/ImageInput.d.ts +2 -0
- package/dist/primitives/ImageInput.d.ts.map +1 -0
- package/dist/primitives/ImageInput.js +5 -0
- package/dist/primitives/ImageInput.js.map +1 -0
- package/dist/primitives/InputGroup.cjs +8 -0
- package/dist/primitives/InputGroup.d.ts +2 -0
- package/dist/primitives/InputGroup.d.ts.map +1 -0
- package/dist/primitives/InputGroup.js +5 -0
- package/dist/primitives/InputGroup.js.map +1 -0
- package/dist/primitives/NumberField.cjs +8 -0
- package/dist/primitives/NumberField.d.ts +2 -0
- package/dist/primitives/NumberField.d.ts.map +1 -0
- package/dist/primitives/NumberField.js +5 -0
- package/dist/primitives/NumberField.js.map +1 -0
- package/dist/primitives/OverflowingList.cjs +8 -0
- package/dist/primitives/OverflowingList.d.ts +2 -0
- package/dist/primitives/OverflowingList.d.ts.map +1 -0
- package/dist/primitives/OverflowingList.js +5 -0
- package/dist/primitives/OverflowingList.js.map +1 -0
- package/dist/primitives/PhoneCountryPicker.cjs +8 -0
- package/dist/primitives/PhoneCountryPicker.d.ts +2 -0
- package/dist/primitives/PhoneCountryPicker.d.ts.map +1 -0
- package/dist/primitives/PhoneCountryPicker.js +5 -0
- package/dist/primitives/PhoneCountryPicker.js.map +1 -0
- package/dist/primitives/ProgressRing.cjs +8 -0
- package/dist/primitives/ProgressRing.d.ts +2 -0
- package/dist/primitives/ProgressRing.d.ts.map +1 -0
- package/dist/primitives/ProgressRing.js +5 -0
- package/dist/primitives/ProgressRing.js.map +1 -0
- package/dist/primitives/RadioCircle.cjs +8 -0
- package/dist/primitives/RadioCircle.d.ts +2 -0
- package/dist/primitives/RadioCircle.d.ts.map +1 -0
- package/dist/primitives/RadioCircle.js +5 -0
- package/dist/primitives/RadioCircle.js.map +1 -0
- package/dist/primitives/SKELETON_HEIGHT.cjs +8 -0
- package/dist/primitives/SKELETON_HEIGHT.d.ts +2 -0
- package/dist/primitives/SKELETON_HEIGHT.d.ts.map +1 -0
- package/dist/primitives/SKELETON_HEIGHT.js +5 -0
- package/dist/primitives/SKELETON_HEIGHT.js.map +1 -0
- package/dist/primitives/STATUS_COLOR.cjs +8 -0
- package/dist/primitives/STATUS_COLOR.d.ts +2 -0
- package/dist/primitives/STATUS_COLOR.d.ts.map +1 -0
- package/dist/primitives/STATUS_COLOR.js +5 -0
- package/dist/primitives/STATUS_COLOR.js.map +1 -0
- package/dist/primitives/STATUS_HUE.cjs +8 -0
- package/dist/primitives/STATUS_HUE.d.ts +2 -0
- package/dist/primitives/STATUS_HUE.d.ts.map +1 -0
- package/dist/primitives/STATUS_HUE.js +5 -0
- package/dist/primitives/STATUS_HUE.js.map +1 -0
- package/dist/primitives/STATUS_PAINT.cjs +8 -0
- package/dist/primitives/STATUS_PAINT.d.ts +2 -0
- package/dist/primitives/STATUS_PAINT.d.ts.map +1 -0
- package/dist/primitives/STATUS_PAINT.js +5 -0
- package/dist/primitives/STATUS_PAINT.js.map +1 -0
- package/dist/primitives/Shortcut.cjs +8 -0
- package/dist/primitives/Shortcut.d.ts +2 -0
- package/dist/primitives/Shortcut.d.ts.map +1 -0
- package/dist/primitives/Shortcut.js +5 -0
- package/dist/primitives/Shortcut.js.map +1 -0
- package/dist/primitives/StackIcon.cjs +8 -0
- package/dist/primitives/StackIcon.d.ts +2 -0
- package/dist/primitives/StackIcon.d.ts.map +1 -0
- package/dist/primitives/StackIcon.js +5 -0
- package/dist/primitives/StackIcon.js.map +1 -0
- package/dist/primitives/TOAST_DURATION.cjs +8 -0
- package/dist/primitives/TOAST_DURATION.d.ts +2 -0
- package/dist/primitives/TOAST_DURATION.d.ts.map +1 -0
- package/dist/primitives/TOAST_DURATION.js +5 -0
- package/dist/primitives/TOAST_DURATION.js.map +1 -0
- package/dist/primitives/Tag.cjs +8 -0
- package/dist/primitives/Tag.d.ts +2 -0
- package/dist/primitives/Tag.d.ts.map +1 -0
- package/dist/primitives/Tag.js +5 -0
- package/dist/primitives/Tag.js.map +1 -0
- package/dist/primitives/ToastCard.cjs +8 -0
- package/dist/primitives/ToastCard.d.ts +2 -0
- package/dist/primitives/ToastCard.d.ts.map +1 -0
- package/dist/primitives/ToastCard.js +5 -0
- package/dist/primitives/ToastCard.js.map +1 -0
- package/dist/primitives/ToastFace.cjs +8 -0
- package/dist/primitives/ToastFace.d.ts +2 -0
- package/dist/primitives/ToastFace.d.ts.map +1 -0
- package/dist/primitives/ToastFace.js +5 -0
- package/dist/primitives/ToastFace.js.map +1 -0
- package/dist/primitives/TruncatedText.cjs +8 -0
- package/dist/primitives/TruncatedText.d.ts +2 -0
- package/dist/primitives/TruncatedText.d.ts.map +1 -0
- package/dist/primitives/TruncatedText.js +5 -0
- package/dist/primitives/TruncatedText.js.map +1 -0
- package/dist/primitives/TruncatedTextProvider.cjs +8 -0
- package/dist/primitives/TruncatedTextProvider.d.ts +2 -0
- package/dist/primitives/TruncatedTextProvider.d.ts.map +1 -0
- package/dist/primitives/TruncatedTextProvider.js +5 -0
- package/dist/primitives/TruncatedTextProvider.js.map +1 -0
- package/dist/primitives/VisuallyHidden.cjs +8 -0
- package/dist/primitives/VisuallyHidden.d.ts +2 -0
- package/dist/primitives/VisuallyHidden.d.ts.map +1 -0
- package/dist/primitives/VisuallyHidden.js +5 -0
- package/dist/primitives/VisuallyHidden.js.map +1 -0
- package/dist/primitives/fieldSize.cjs +8 -0
- package/dist/primitives/fieldSize.d.ts +2 -0
- package/dist/primitives/fieldSize.d.ts.map +1 -0
- package/dist/primitives/fieldSize.js +5 -0
- package/dist/primitives/fieldSize.js.map +1 -0
- package/dist/primitives/flag.cjs +8 -0
- package/dist/primitives/flag.d.ts +2 -0
- package/dist/primitives/flag.d.ts.map +1 -0
- package/dist/primitives/flag.js +5 -0
- package/dist/primitives/flag.js.map +1 -0
- package/dist/primitives/formatShortcut.cjs +8 -0
- package/dist/primitives/formatShortcut.d.ts +2 -0
- package/dist/primitives/formatShortcut.d.ts.map +1 -0
- package/dist/primitives/formatShortcut.js +5 -0
- package/dist/primitives/formatShortcut.js.map +1 -0
- package/dist/primitives/initialOf.cjs +8 -0
- package/dist/primitives/initialOf.d.ts +2 -0
- package/dist/primitives/initialOf.d.ts.map +1 -0
- package/dist/primitives/initialOf.js +5 -0
- package/dist/primitives/initialOf.js.map +1 -0
- package/dist/primitives/parseNumber.cjs +8 -0
- package/dist/primitives/parseNumber.d.ts +2 -0
- package/dist/primitives/parseNumber.d.ts.map +1 -0
- package/dist/primitives/parseNumber.js +5 -0
- package/dist/primitives/parseNumber.js.map +1 -0
- package/dist/primitives/speakShortcut.cjs +8 -0
- package/dist/primitives/speakShortcut.d.ts +2 -0
- package/dist/primitives/speakShortcut.d.ts.map +1 -0
- package/dist/primitives/speakShortcut.js +5 -0
- package/dist/primitives/speakShortcut.js.map +1 -0
- package/dist/primitives/tileTones.cjs +8 -0
- package/dist/primitives/tileTones.d.ts +2 -0
- package/dist/primitives/tileTones.d.ts.map +1 -0
- package/dist/primitives/tileTones.js +5 -0
- package/dist/primitives/tileTones.js.map +1 -0
- package/dist/primitives/useDensity.cjs +8 -0
- package/dist/primitives/useDensity.d.ts +2 -0
- package/dist/primitives/useDensity.d.ts.map +1 -0
- package/dist/primitives/useDensity.js +5 -0
- package/dist/primitives/useDensity.js.map +1 -0
- package/dist/primitives/useField.cjs +8 -0
- package/dist/primitives/useField.d.ts +2 -0
- package/dist/primitives/useField.d.ts.map +1 -0
- package/dist/primitives/useField.js +5 -0
- package/dist/primitives/useField.js.map +1 -0
- package/dist/product/ComboBox.cjs +25 -7
- package/dist/product/ComboBox.d.ts +3 -1
- package/dist/product/ComboBox.d.ts.map +1 -1
- package/dist/product/ComboBox.js +25 -7
- package/dist/product/ComboBox.js.map +1 -1
- package/dist/product/CommandMenu.cjs +137 -0
- package/dist/product/CommandMenu.d.ts +77 -0
- package/dist/product/CommandMenu.d.ts.map +1 -0
- package/dist/product/CommandMenu.js +134 -0
- package/dist/product/CommandMenu.js.map +1 -0
- package/dist/product/DetailPane.cjs +154 -12
- package/dist/product/DetailPane.d.ts +80 -2
- package/dist/product/DetailPane.d.ts.map +1 -1
- package/dist/product/DetailPane.js +153 -16
- package/dist/product/DetailPane.js.map +1 -1
- package/dist/product/Fact.cjs +6 -1
- package/dist/product/Fact.d.ts +16 -1
- package/dist/product/Fact.d.ts.map +1 -1
- package/dist/product/Fact.js +6 -1
- package/dist/product/Fact.js.map +1 -1
- package/dist/product/Field.cjs +14 -2
- package/dist/product/Field.d.ts +16 -1
- package/dist/product/Field.d.ts.map +1 -1
- package/dist/product/Field.js +14 -2
- package/dist/product/Field.js.map +1 -1
- package/dist/product/Filters.cjs +61 -9
- package/dist/product/Filters.d.ts +37 -6
- package/dist/product/Filters.d.ts.map +1 -1
- package/dist/product/Filters.js +62 -10
- package/dist/product/Filters.js.map +1 -1
- package/dist/product/MenuRow.cjs +81 -2
- package/dist/product/MenuRow.d.ts +76 -6
- package/dist/product/MenuRow.d.ts.map +1 -1
- package/dist/product/MenuRow.js +81 -4
- package/dist/product/MenuRow.js.map +1 -1
- package/dist/product/PrimaryButton.cjs +5 -1
- package/dist/product/PrimaryButton.d.ts +8 -0
- package/dist/product/PrimaryButton.d.ts.map +1 -1
- package/dist/product/PrimaryButton.js +5 -1
- package/dist/product/PrimaryButton.js.map +1 -1
- package/dist/product/Skeleton.cjs +7 -6
- package/dist/product/Skeleton.d.ts +3 -20
- package/dist/product/Skeleton.d.ts.map +1 -1
- package/dist/product/Skeleton.js +8 -7
- package/dist/product/Skeleton.js.map +1 -1
- package/dist/product/index.cjs +2 -0
- package/dist/product/index.d.ts +1 -0
- package/dist/product/index.d.ts.map +1 -1
- package/dist/product/index.js +2 -0
- package/dist/product/index.js.map +1 -1
- package/dist/settings/Section.cjs +11 -2
- package/dist/settings/Section.d.ts +8 -1
- package/dist/settings/Section.d.ts.map +1 -1
- package/dist/settings/Section.js +11 -2
- package/dist/settings/Section.js.map +1 -1
- package/dist/styles/motion.css +70 -0
- package/dist/styles.css +1460 -127
- package/dist/theme.css +944 -0
- package/package.json +2 -1
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
'use client';"use strict";
|
|
2
|
+
'use client';
|
|
3
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
+
exports.fit = fit;
|
|
5
|
+
exports.OverflowingList = OverflowingList;
|
|
6
|
+
const jsx_runtime_1 = require("react/jsx-runtime");
|
|
7
|
+
/**
|
|
8
|
+
* OverflowingList — one line of chips, tags or avatars: as many as fit, a "+N"
|
|
9
|
+
* for the rest, and every item in a popup.
|
|
10
|
+
*
|
|
11
|
+
* A multi-value cell (tags, emails, links, phones, relations, attendees) has a
|
|
12
|
+
* fixed width and an unbounded list. Wrapping breaks the row height a table
|
|
13
|
+
* depends on, and clipping hides values without saying so. This measures each
|
|
14
|
+
* item at its natural width in an invisible copy of the row, fits as many as
|
|
15
|
+
* the row holds (and no more than `maxInlineCount`), lets the last visible one
|
|
16
|
+
* shrink, and keeps room for the count. Measurement rides `onLayout`, which gui
|
|
17
|
+
* gives on web and native alike, so the same list works on both.
|
|
18
|
+
*
|
|
19
|
+
* Re-expressed from twenty-ui's OverflowingList (MIT, see NOTICE): a 4px gap, a
|
|
20
|
+
* 24px-minimum count on the 12px rung, shown on hover, focus or while open by
|
|
21
|
+
* default; the popup is the package Popover, items wrapping, as wide as the list
|
|
22
|
+
* and at least 220.
|
|
23
|
+
*/
|
|
24
|
+
const gui_1 = require("@hanzo/gui");
|
|
25
|
+
const react_1 = require("react");
|
|
26
|
+
const popover_1 = require("./popover.cjs");
|
|
27
|
+
const press_1 = require("./press.cjs");
|
|
28
|
+
const slot_1 = require("./slot.cjs");
|
|
29
|
+
const GAP = 4;
|
|
30
|
+
const COUNT_MIN = 24;
|
|
31
|
+
const POPUP_MIN = 220;
|
|
32
|
+
/**
|
|
33
|
+
* How many of `widths` fit in `avail`, keeping room for a count when not all
|
|
34
|
+
* do. At least one shows (it may shrink); never more than `max`.
|
|
35
|
+
*/
|
|
36
|
+
function fit(widths, avail, max = Infinity, gap = GAP, count = COUNT_MIN) {
|
|
37
|
+
const n = Math.min(widths.length, max);
|
|
38
|
+
if (n === 0)
|
|
39
|
+
return 0;
|
|
40
|
+
let used = 0;
|
|
41
|
+
for (let i = 0; i < n; i++) {
|
|
42
|
+
const next = used + (i > 0 ? gap : 0) + widths[i];
|
|
43
|
+
const rest = i + 1 < widths.length;
|
|
44
|
+
if (next + (rest ? gap + count : 0) > avail)
|
|
45
|
+
return Math.max(1, i);
|
|
46
|
+
used = next;
|
|
47
|
+
}
|
|
48
|
+
return n;
|
|
49
|
+
}
|
|
50
|
+
function OverflowingList({ children, maxInlineCount, showOverflowCount = 'hover', overflowLabel = 'Show all items', open, defaultOpen = false, onOpenChange, popupProps, ...props }) {
|
|
51
|
+
const items = (0, react_1.useMemo)(() => react_1.Children.toArray(children).filter(react_1.isValidElement), [children]);
|
|
52
|
+
const [widths, setWidths] = (0, react_1.useState)([]);
|
|
53
|
+
const [avail, setAvail] = (0, react_1.useState)(null);
|
|
54
|
+
const [hot, setHot] = (0, react_1.useState)(false);
|
|
55
|
+
const [own, setOwn] = (0, react_1.useState)(defaultOpen);
|
|
56
|
+
const shown = open ?? own;
|
|
57
|
+
const setOpen = (0, react_1.useCallback)((next) => {
|
|
58
|
+
if (open === undefined)
|
|
59
|
+
setOwn(next);
|
|
60
|
+
onOpenChange?.(next);
|
|
61
|
+
}, [open, onOpenChange]);
|
|
62
|
+
const measured = avail != null && widths.filter((w) => w != null).length === items.length;
|
|
63
|
+
const visible = measured ? fit(widths, avail, maxInlineCount) : Math.min(items.length, maxInlineCount ?? items.length);
|
|
64
|
+
const hidden = items.length - visible;
|
|
65
|
+
const countShown = hidden > 0 && (showOverflowCount === 'always' || (showOverflowCount === 'hover' && (hot || shown)));
|
|
66
|
+
const measure = (i) => (e) => {
|
|
67
|
+
const w = e?.nativeEvent?.layout?.width;
|
|
68
|
+
if (typeof w !== 'number')
|
|
69
|
+
return;
|
|
70
|
+
setWidths((prev) => {
|
|
71
|
+
if (prev[i] === w)
|
|
72
|
+
return prev;
|
|
73
|
+
const next = prev.slice();
|
|
74
|
+
next[i] = w;
|
|
75
|
+
return next;
|
|
76
|
+
});
|
|
77
|
+
};
|
|
78
|
+
return ((0, jsx_runtime_1.jsxs)(gui_1.XStack, { ...(0, slot_1.slot)('overflowing-list'), position: "relative", width: "100%", minW: 0, items: "center", gap: GAP, overflow: "hidden", onLayout: (e) => setAvail(e.nativeEvent.layout.width), onPointerEnter: () => setHot(true), onPointerLeave: () => setHot(false), onFocus: () => setHot(true), onBlur: () => setHot(false), ...props, children: [(0, jsx_runtime_1.jsx)(gui_1.XStack, { "aria-hidden": true, position: "absolute", t: 0, l: 0, opacity: 0, pointerEvents: "none", gap: GAP, ...{ inert: true }, children: items.map((item, i) => ((0, jsx_runtime_1.jsx)(gui_1.XStack, { shrink: 0, onLayout: measure(i), children: item }, item.key ?? i))) }), items.slice(0, visible).map((item, i) => ((0, jsx_runtime_1.jsx)(gui_1.XStack, { ...(i === visible - 1 ? { shrink: 1, minW: 0 } : { shrink: 0 }), children: item }, item.key ?? i))), hidden > 0 && showOverflowCount !== 'never' ? ((0, jsx_runtime_1.jsxs)(popover_1.Popover, { open: shown, onOpenChange: setOpen, placement: "bottom-start", children: [(0, jsx_runtime_1.jsx)(popover_1.PopoverTrigger, { asChild: true, children: (0, jsx_runtime_1.jsx)(gui_1.XStack, { ...(0, slot_1.slot)('overflowing-list-count'), ...(0, press_1.press)(() => setOpen(!shown)), "aria-label": `${overflowLabel} (${items.length})`, "aria-expanded": shown, shrink: 0, minW: COUNT_MIN, height: 20, px: "$1", items: "center", justify: "center", rounded: "$xs", cursor: "pointer", hoverStyle: { bg: '$hover' }, focusVisibleStyle: press_1.RING, opacity: countShown ? 1 : 0, children: (0, jsx_runtime_1.jsx)(gui_1.SizableText, { size: "$1", color: "$ink", children: `+${hidden}` }) }) }), (0, jsx_runtime_1.jsx)(popover_1.PopoverContent, { p: "$2", minW: POPUP_MIN, style: { width: Math.max(POPUP_MIN, Math.round(avail ?? 0)) }, ...popupProps, children: (0, jsx_runtime_1.jsx)(gui_1.YStack, { ...(0, slot_1.slot)('overflowing-list-popup'), maxH: 320, overflow: "scroll", children: (0, jsx_runtime_1.jsx)(gui_1.XStack, { flexWrap: "wrap", gap: GAP, children: items }) }) })] })) : null] }));
|
|
79
|
+
}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OverflowingList — one line of chips, tags or avatars: as many as fit, a "+N"
|
|
3
|
+
* for the rest, and every item in a popup.
|
|
4
|
+
*
|
|
5
|
+
* A multi-value cell (tags, emails, links, phones, relations, attendees) has a
|
|
6
|
+
* fixed width and an unbounded list. Wrapping breaks the row height a table
|
|
7
|
+
* depends on, and clipping hides values without saying so. This measures each
|
|
8
|
+
* item at its natural width in an invisible copy of the row, fits as many as
|
|
9
|
+
* the row holds (and no more than `maxInlineCount`), lets the last visible one
|
|
10
|
+
* shrink, and keeps room for the count. Measurement rides `onLayout`, which gui
|
|
11
|
+
* gives on web and native alike, so the same list works on both.
|
|
12
|
+
*
|
|
13
|
+
* Re-expressed from twenty-ui's OverflowingList (MIT, see NOTICE): a 4px gap, a
|
|
14
|
+
* 24px-minimum count on the 12px rung, shown on hover, focus or while open by
|
|
15
|
+
* default; the popup is the package Popover, items wrapping, as wide as the list
|
|
16
|
+
* and at least 220.
|
|
17
|
+
*/
|
|
18
|
+
import { XStack } from '@hanzo/gui';
|
|
19
|
+
import { type ComponentProps, type ReactNode } from 'react';
|
|
20
|
+
import { PopoverContent } from './popover.js';
|
|
21
|
+
/**
|
|
22
|
+
* How many of `widths` fit in `avail`, keeping room for a count when not all
|
|
23
|
+
* do. At least one shows (it may shrink); never more than `max`.
|
|
24
|
+
*/
|
|
25
|
+
export declare function fit(widths: readonly number[], avail: number, max?: number, gap?: number, count?: number): number;
|
|
26
|
+
export type OverflowingListProps = Omit<ComponentProps<typeof XStack>, 'children'> & {
|
|
27
|
+
/** The whole ordered list, each with a stable key. */
|
|
28
|
+
children: ReactNode;
|
|
29
|
+
/** Never more inline than this, however many would fit. */
|
|
30
|
+
maxInlineCount?: number;
|
|
31
|
+
/** `hover`: the count shows on hover, focus or while open. `always` / `never` say themselves. */
|
|
32
|
+
showOverflowCount?: 'hover' | 'always' | 'never';
|
|
33
|
+
/** The count button's accessible name. */
|
|
34
|
+
overflowLabel?: string;
|
|
35
|
+
open?: boolean;
|
|
36
|
+
defaultOpen?: boolean;
|
|
37
|
+
onOpenChange?: (open: boolean) => void;
|
|
38
|
+
/** Passed to the popup. */
|
|
39
|
+
popupProps?: Partial<ComponentProps<typeof PopoverContent>>;
|
|
40
|
+
};
|
|
41
|
+
export declare function OverflowingList({ children, maxInlineCount, showOverflowCount, overflowLabel, open, defaultOpen, onOpenChange, popupProps, ...props }: OverflowingListProps): import("react").JSX.Element;
|
|
42
|
+
//# sourceMappingURL=overflowing-list.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"overflowing-list.d.ts","sourceRoot":"","sources":["../../../src/backends/gui/overflowing-list.tsx"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;GAgBG;AACH,OAAO,EAAe,MAAM,EAAU,MAAM,YAAY,CAAA;AACxD,OAAO,EAA4D,KAAK,cAAc,EAAE,KAAK,SAAS,EAAE,MAAM,OAAO,CAAA;AACrH,OAAO,EAAW,cAAc,EAAkB,MAAM,WAAW,CAAA;AAQnE;;;GAGG;AACH,wBAAgB,GAAG,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,SAAW,EAAE,GAAG,SAAM,EAAE,KAAK,SAAY,GAAG,MAAM,CAWlH;AAID,MAAM,MAAM,oBAAoB,GAAG,IAAI,CAAC,cAAc,CAAC,OAAO,MAAM,CAAC,EAAE,UAAU,CAAC,GAAG;IACnF,sDAAsD;IACtD,QAAQ,EAAE,SAAS,CAAA;IACnB,2DAA2D;IAC3D,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,iGAAiG;IACjG,iBAAiB,CAAC,EAAE,OAAO,GAAG,QAAQ,GAAG,OAAO,CAAA;IAChD,0CAA0C;IAC1C,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,IAAI,CAAC,EAAE,OAAO,CAAA;IACd,WAAW,CAAC,EAAE,OAAO,CAAA;IACrB,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAA;IACtC,2BAA2B;IAC3B,UAAU,CAAC,EAAE,OAAO,CAAC,cAAc,CAAC,OAAO,cAAc,CAAC,CAAC,CAAA;CAC5D,CAAA;AAED,wBAAgB,eAAe,CAAC,EAC9B,QAAQ,EACR,cAAc,EACd,iBAA2B,EAC3B,aAAgC,EAChC,IAAI,EACJ,WAAmB,EACnB,YAAY,EACZ,UAAU,EACV,GAAG,KAAK,EACT,EAAE,oBAAoB,+BAwGtB"}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
/**
|
|
4
|
+
* OverflowingList — one line of chips, tags or avatars: as many as fit, a "+N"
|
|
5
|
+
* for the rest, and every item in a popup.
|
|
6
|
+
*
|
|
7
|
+
* A multi-value cell (tags, emails, links, phones, relations, attendees) has a
|
|
8
|
+
* fixed width and an unbounded list. Wrapping breaks the row height a table
|
|
9
|
+
* depends on, and clipping hides values without saying so. This measures each
|
|
10
|
+
* item at its natural width in an invisible copy of the row, fits as many as
|
|
11
|
+
* the row holds (and no more than `maxInlineCount`), lets the last visible one
|
|
12
|
+
* shrink, and keeps room for the count. Measurement rides `onLayout`, which gui
|
|
13
|
+
* gives on web and native alike, so the same list works on both.
|
|
14
|
+
*
|
|
15
|
+
* Re-expressed from twenty-ui's OverflowingList (MIT, see NOTICE): a 4px gap, a
|
|
16
|
+
* 24px-minimum count on the 12px rung, shown on hover, focus or while open by
|
|
17
|
+
* default; the popup is the package Popover, items wrapping, as wide as the list
|
|
18
|
+
* and at least 220.
|
|
19
|
+
*/
|
|
20
|
+
import { SizableText, XStack, YStack } from '@hanzo/gui';
|
|
21
|
+
import { Children, isValidElement, useCallback, useMemo, useState } from 'react';
|
|
22
|
+
import { Popover, PopoverContent, PopoverTrigger } from './popover.js';
|
|
23
|
+
import { press, RING } from './press.js';
|
|
24
|
+
import { slot } from './slot.js';
|
|
25
|
+
const GAP = 4;
|
|
26
|
+
const COUNT_MIN = 24;
|
|
27
|
+
const POPUP_MIN = 220;
|
|
28
|
+
/**
|
|
29
|
+
* How many of `widths` fit in `avail`, keeping room for a count when not all
|
|
30
|
+
* do. At least one shows (it may shrink); never more than `max`.
|
|
31
|
+
*/
|
|
32
|
+
export function fit(widths, avail, max = Infinity, gap = GAP, count = COUNT_MIN) {
|
|
33
|
+
const n = Math.min(widths.length, max);
|
|
34
|
+
if (n === 0)
|
|
35
|
+
return 0;
|
|
36
|
+
let used = 0;
|
|
37
|
+
for (let i = 0; i < n; i++) {
|
|
38
|
+
const next = used + (i > 0 ? gap : 0) + widths[i];
|
|
39
|
+
const rest = i + 1 < widths.length;
|
|
40
|
+
if (next + (rest ? gap + count : 0) > avail)
|
|
41
|
+
return Math.max(1, i);
|
|
42
|
+
used = next;
|
|
43
|
+
}
|
|
44
|
+
return n;
|
|
45
|
+
}
|
|
46
|
+
export function OverflowingList({ children, maxInlineCount, showOverflowCount = 'hover', overflowLabel = 'Show all items', open, defaultOpen = false, onOpenChange, popupProps, ...props }) {
|
|
47
|
+
const items = useMemo(() => Children.toArray(children).filter(isValidElement), [children]);
|
|
48
|
+
const [widths, setWidths] = useState([]);
|
|
49
|
+
const [avail, setAvail] = useState(null);
|
|
50
|
+
const [hot, setHot] = useState(false);
|
|
51
|
+
const [own, setOwn] = useState(defaultOpen);
|
|
52
|
+
const shown = open ?? own;
|
|
53
|
+
const setOpen = useCallback((next) => {
|
|
54
|
+
if (open === undefined)
|
|
55
|
+
setOwn(next);
|
|
56
|
+
onOpenChange?.(next);
|
|
57
|
+
}, [open, onOpenChange]);
|
|
58
|
+
const measured = avail != null && widths.filter((w) => w != null).length === items.length;
|
|
59
|
+
const visible = measured ? fit(widths, avail, maxInlineCount) : Math.min(items.length, maxInlineCount ?? items.length);
|
|
60
|
+
const hidden = items.length - visible;
|
|
61
|
+
const countShown = hidden > 0 && (showOverflowCount === 'always' || (showOverflowCount === 'hover' && (hot || shown)));
|
|
62
|
+
const measure = (i) => (e) => {
|
|
63
|
+
const w = e?.nativeEvent?.layout?.width;
|
|
64
|
+
if (typeof w !== 'number')
|
|
65
|
+
return;
|
|
66
|
+
setWidths((prev) => {
|
|
67
|
+
if (prev[i] === w)
|
|
68
|
+
return prev;
|
|
69
|
+
const next = prev.slice();
|
|
70
|
+
next[i] = w;
|
|
71
|
+
return next;
|
|
72
|
+
});
|
|
73
|
+
};
|
|
74
|
+
return (_jsxs(XStack, { ...slot('overflowing-list'), position: "relative", width: "100%", minW: 0, items: "center", gap: GAP, overflow: "hidden", onLayout: (e) => setAvail(e.nativeEvent.layout.width), onPointerEnter: () => setHot(true), onPointerLeave: () => setHot(false), onFocus: () => setHot(true), onBlur: () => setHot(false), ...props, children: [_jsx(XStack, { "aria-hidden": true, position: "absolute", t: 0, l: 0, opacity: 0, pointerEvents: "none", gap: GAP, ...{ inert: true }, children: items.map((item, i) => (_jsx(XStack, { shrink: 0, onLayout: measure(i), children: item }, item.key ?? i))) }), items.slice(0, visible).map((item, i) => (_jsx(XStack, { ...(i === visible - 1 ? { shrink: 1, minW: 0 } : { shrink: 0 }), children: item }, item.key ?? i))), hidden > 0 && showOverflowCount !== 'never' ? (_jsxs(Popover, { open: shown, onOpenChange: setOpen, placement: "bottom-start", children: [_jsx(PopoverTrigger, { asChild: true, children: _jsx(XStack, { ...slot('overflowing-list-count'), ...press(() => setOpen(!shown)), "aria-label": `${overflowLabel} (${items.length})`, "aria-expanded": shown, shrink: 0, minW: COUNT_MIN, height: 20, px: "$1", items: "center", justify: "center", rounded: "$xs", cursor: "pointer", hoverStyle: { bg: '$hover' }, focusVisibleStyle: RING, opacity: countShown ? 1 : 0, children: _jsx(SizableText, { size: "$1", color: "$ink", children: `+${hidden}` }) }) }), _jsx(PopoverContent, { p: "$2", minW: POPUP_MIN, style: { width: Math.max(POPUP_MIN, Math.round(avail ?? 0)) }, ...popupProps, children: _jsx(YStack, { ...slot('overflowing-list-popup'), maxH: 320, overflow: "scroll", children: _jsx(XStack, { flexWrap: "wrap", gap: GAP, children: items }) }) })] })) : null] }));
|
|
75
|
+
}
|
|
76
|
+
//# sourceMappingURL=overflowing-list.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"overflowing-list.js","sourceRoot":"","sources":["../../../src/backends/gui/overflowing-list.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
'use client';"use strict";
|
|
2
|
+
'use client';
|
|
3
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
+
exports.Flag = Flag;
|
|
5
|
+
exports.PhoneCountryPicker = PhoneCountryPicker;
|
|
6
|
+
const jsx_runtime_1 = require("react/jsx-runtime");
|
|
7
|
+
/**
|
|
8
|
+
* PhoneCountryPicker — the calling code at the start of a phone field.
|
|
9
|
+
*
|
|
10
|
+
* <InputGroup>
|
|
11
|
+
* <PhoneCountryPicker countries={list} value={iso} onValueChange={setIso} />
|
|
12
|
+
* <Input value={number} onChangeText={setNumber} inputMode="tel" />
|
|
13
|
+
* </InputGroup>
|
|
14
|
+
*
|
|
15
|
+
* A segment of the field (`Segment`) showing the country's flag and a chevron;
|
|
16
|
+
* the list it opens is found by country name, ISO code and calling code, with
|
|
17
|
+
* or without the "+". The picked country is named in a visually hidden label,
|
|
18
|
+
* since a flag alone says nothing to a screen reader. Parsing and validating the
|
|
19
|
+
* number belong to the field layer, not here. Data-free: the caller passes the
|
|
20
|
+
* countries and their calling codes.
|
|
21
|
+
*
|
|
22
|
+
* Flags are regional-indicator text (`flag`), drawn by the platform. Anatomy
|
|
23
|
+
* after twenty-ui's PhoneCountryPicker (MIT, NOTICE): 8px before the flag and 4
|
|
24
|
+
* after the chevron, a 16×12 flag with 2px corners, a globe when none.
|
|
25
|
+
*/
|
|
26
|
+
const gui_1 = require("@hanzo/gui");
|
|
27
|
+
const lucide_icons_2_1 = require("@hanzogui/lucide-icons-2");
|
|
28
|
+
const react_1 = require("react");
|
|
29
|
+
const flag_1 = require("./flag.cjs");
|
|
30
|
+
const search_list_1 = require("./search-list.cjs");
|
|
31
|
+
/** The 16×12 flag box, 2px corners; a globe when there is no country. */
|
|
32
|
+
function Flag({ iso, override }) {
|
|
33
|
+
const glyph = override ?? (0, flag_1.flag)(iso);
|
|
34
|
+
return ((0, jsx_runtime_1.jsx)(gui_1.XStack, { width: 16, height: 12, rounded: "$2xs", overflow: "hidden", items: "center", justify: "center", shrink: 0, "aria-hidden": true, children: glyph == null ? ((0, jsx_runtime_1.jsx)(lucide_icons_2_1.Globe, { size: 14, color: "$hint" })) : typeof glyph === 'string' ? ((0, jsx_runtime_1.jsx)(gui_1.SizableText, { size: "$2", lineHeight: 12, children: glyph })) : (glyph) }));
|
|
35
|
+
}
|
|
36
|
+
function PhoneCountryPicker({ countries, value, defaultValue = null, onValueChange, closeOnSelect = true, open, defaultOpen, onOpenChange, disabled = false, label: name = 'Country calling code', searchLabel = 'Search countries', emptyLabel = 'No country found', }) {
|
|
37
|
+
const [own, setOwn] = (0, react_1.useState)(defaultValue);
|
|
38
|
+
const iso = value !== undefined ? value : own;
|
|
39
|
+
const [shown, setShown] = (0, search_list_1.useOpen)(open, defaultOpen, onOpenChange);
|
|
40
|
+
const picked = countries.find((c) => c.value === iso);
|
|
41
|
+
const options = countries.map((c) => ({
|
|
42
|
+
value: c.value,
|
|
43
|
+
label: c.label,
|
|
44
|
+
keywords: [c.value, c.callingCode, `+${c.callingCode}`],
|
|
45
|
+
disabled: c.disabled,
|
|
46
|
+
start: ((0, jsx_runtime_1.jsx)(gui_1.XStack, { pr: "$1", children: (0, jsx_runtime_1.jsx)(Flag, { iso: c.value, override: c.flag }) })),
|
|
47
|
+
end: `+${c.callingCode}`,
|
|
48
|
+
}));
|
|
49
|
+
return ((0, jsx_runtime_1.jsx)(search_list_1.SearchList, { open: shown && !disabled, onOpenChange: (next) => setShown(disabled ? false : next), options: options, value: iso, searchLabel: searchLabel, emptyLabel: emptyLabel, width: 280, onPick: (next) => {
|
|
50
|
+
if (value === undefined)
|
|
51
|
+
setOwn(next);
|
|
52
|
+
if (next !== iso)
|
|
53
|
+
onValueChange?.(next);
|
|
54
|
+
if (closeOnSelect)
|
|
55
|
+
setShown(false);
|
|
56
|
+
}, trigger: (0, jsx_runtime_1.jsxs)(search_list_1.Segment, { ...{ 'data-slot': 'phone-country-picker' }, disabled: disabled, open: shown,
|
|
57
|
+
// Named by its hidden text, not an aria-label: the flag says nothing to
|
|
58
|
+
// a screen reader, and the words are the ones a translator sees.
|
|
59
|
+
gap: "$0.5", pl: "$2", pr: "$1", children: [(0, jsx_runtime_1.jsx)(Flag, { iso: picked?.value, override: picked?.flag }), (0, jsx_runtime_1.jsx)(lucide_icons_2_1.ChevronDown, { size: 14, color: "$hint" }), (0, jsx_runtime_1.jsx)(gui_1.VisuallyHidden, { children: picked ? `${name}: ${picked.label} +${picked.callingCode}` : name })] }) }));
|
|
60
|
+
}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { type ReactNode } from 'react';
|
|
2
|
+
export type PhoneCountry = {
|
|
3
|
+
/** ISO 3166-1 alpha-2, e.g. "FR". */
|
|
4
|
+
value: string;
|
|
5
|
+
/** The country's name in the reader's language. */
|
|
6
|
+
label: string;
|
|
7
|
+
/** Without the "+", e.g. "33". */
|
|
8
|
+
callingCode: string;
|
|
9
|
+
/** Overrides the regional-indicator flag. */
|
|
10
|
+
flag?: ReactNode;
|
|
11
|
+
disabled?: boolean;
|
|
12
|
+
};
|
|
13
|
+
export type PhoneCountryPickerProps = {
|
|
14
|
+
countries: PhoneCountry[];
|
|
15
|
+
value?: string | null;
|
|
16
|
+
defaultValue?: string | null;
|
|
17
|
+
onValueChange?: (iso: string | null) => void;
|
|
18
|
+
closeOnSelect?: boolean;
|
|
19
|
+
open?: boolean;
|
|
20
|
+
defaultOpen?: boolean;
|
|
21
|
+
onOpenChange?: (open: boolean) => void;
|
|
22
|
+
disabled?: boolean;
|
|
23
|
+
/** The segment's name to assistive technology, before the picked country. */
|
|
24
|
+
label?: string;
|
|
25
|
+
searchLabel?: string;
|
|
26
|
+
emptyLabel?: string;
|
|
27
|
+
};
|
|
28
|
+
/** The 16×12 flag box, 2px corners; a globe when there is no country. */
|
|
29
|
+
export declare function Flag({ iso, override }: {
|
|
30
|
+
iso?: string | null;
|
|
31
|
+
override?: ReactNode;
|
|
32
|
+
}): import("react").JSX.Element;
|
|
33
|
+
export declare function PhoneCountryPicker({ countries, value, defaultValue, onValueChange, closeOnSelect, open, defaultOpen, onOpenChange, disabled, label: name, searchLabel, emptyLabel, }: PhoneCountryPickerProps): import("react").JSX.Element;
|
|
34
|
+
//# sourceMappingURL=phone-country-picker.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"phone-country-picker.d.ts","sourceRoot":"","sources":["../../../src/backends/gui/phone-country-picker.tsx"],"names":[],"mappings":"AAuBA,OAAO,EAAY,KAAK,SAAS,EAAE,MAAM,OAAO,CAAA;AAIhD,MAAM,MAAM,YAAY,GAAG;IACzB,qCAAqC;IACrC,KAAK,EAAE,MAAM,CAAA;IACb,mDAAmD;IACnD,KAAK,EAAE,MAAM,CAAA;IACb,kCAAkC;IAClC,WAAW,EAAE,MAAM,CAAA;IACnB,6CAA6C;IAC7C,IAAI,CAAC,EAAE,SAAS,CAAA;IAChB,QAAQ,CAAC,EAAE,OAAO,CAAA;CACnB,CAAA;AAED,MAAM,MAAM,uBAAuB,GAAG;IACpC,SAAS,EAAE,YAAY,EAAE,CAAA;IACzB,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACrB,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IAC5B,aAAa,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,KAAK,IAAI,CAAA;IAC5C,aAAa,CAAC,EAAE,OAAO,CAAA;IACvB,IAAI,CAAC,EAAE,OAAO,CAAA;IACd,WAAW,CAAC,EAAE,OAAO,CAAA;IACrB,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAA;IACtC,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,6EAA6E;IAC7E,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,UAAU,CAAC,EAAE,MAAM,CAAA;CACpB,CAAA;AAED,yEAAyE;AACzE,wBAAgB,IAAI,CAAC,EAAE,GAAG,EAAE,QAAQ,EAAE,EAAE;IAAE,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,QAAQ,CAAC,EAAE,SAAS,CAAA;CAAE,+BAepF;AAED,wBAAgB,kBAAkB,CAAC,EACjC,SAAS,EACT,KAAK,EACL,YAAmB,EACnB,aAAa,EACb,aAAoB,EACpB,IAAI,EACJ,WAAW,EACX,YAAY,EACZ,QAAgB,EAChB,KAAK,EAAE,IAA6B,EACpC,WAAgC,EAChC,UAA+B,GAChC,EAAE,uBAAuB,+BAmDzB"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
/**
|
|
4
|
+
* PhoneCountryPicker — the calling code at the start of a phone field.
|
|
5
|
+
*
|
|
6
|
+
* <InputGroup>
|
|
7
|
+
* <PhoneCountryPicker countries={list} value={iso} onValueChange={setIso} />
|
|
8
|
+
* <Input value={number} onChangeText={setNumber} inputMode="tel" />
|
|
9
|
+
* </InputGroup>
|
|
10
|
+
*
|
|
11
|
+
* A segment of the field (`Segment`) showing the country's flag and a chevron;
|
|
12
|
+
* the list it opens is found by country name, ISO code and calling code, with
|
|
13
|
+
* or without the "+". The picked country is named in a visually hidden label,
|
|
14
|
+
* since a flag alone says nothing to a screen reader. Parsing and validating the
|
|
15
|
+
* number belong to the field layer, not here. Data-free: the caller passes the
|
|
16
|
+
* countries and their calling codes.
|
|
17
|
+
*
|
|
18
|
+
* Flags are regional-indicator text (`flag`), drawn by the platform. Anatomy
|
|
19
|
+
* after twenty-ui's PhoneCountryPicker (MIT, NOTICE): 8px before the flag and 4
|
|
20
|
+
* after the chevron, a 16×12 flag with 2px corners, a globe when none.
|
|
21
|
+
*/
|
|
22
|
+
import { SizableText, VisuallyHidden, XStack } from '@hanzo/gui';
|
|
23
|
+
import { ChevronDown, Globe } from '@hanzogui/lucide-icons-2';
|
|
24
|
+
import { useState } from 'react';
|
|
25
|
+
import { flag } from './flag.js';
|
|
26
|
+
import { SearchList, Segment, useOpen } from './search-list.js';
|
|
27
|
+
/** The 16×12 flag box, 2px corners; a globe when there is no country. */
|
|
28
|
+
export function Flag({ iso, override }) {
|
|
29
|
+
const glyph = override ?? flag(iso);
|
|
30
|
+
return (_jsx(XStack, { width: 16, height: 12, rounded: "$2xs", overflow: "hidden", items: "center", justify: "center", shrink: 0, "aria-hidden": true, children: glyph == null ? (_jsx(Globe, { size: 14, color: "$hint" })) : typeof glyph === 'string' ? (_jsx(SizableText, { size: "$2", lineHeight: 12, children: glyph })) : (glyph) }));
|
|
31
|
+
}
|
|
32
|
+
export function PhoneCountryPicker({ countries, value, defaultValue = null, onValueChange, closeOnSelect = true, open, defaultOpen, onOpenChange, disabled = false, label: name = 'Country calling code', searchLabel = 'Search countries', emptyLabel = 'No country found', }) {
|
|
33
|
+
const [own, setOwn] = useState(defaultValue);
|
|
34
|
+
const iso = value !== undefined ? value : own;
|
|
35
|
+
const [shown, setShown] = useOpen(open, defaultOpen, onOpenChange);
|
|
36
|
+
const picked = countries.find((c) => c.value === iso);
|
|
37
|
+
const options = countries.map((c) => ({
|
|
38
|
+
value: c.value,
|
|
39
|
+
label: c.label,
|
|
40
|
+
keywords: [c.value, c.callingCode, `+${c.callingCode}`],
|
|
41
|
+
disabled: c.disabled,
|
|
42
|
+
start: (_jsx(XStack, { pr: "$1", children: _jsx(Flag, { iso: c.value, override: c.flag }) })),
|
|
43
|
+
end: `+${c.callingCode}`,
|
|
44
|
+
}));
|
|
45
|
+
return (_jsx(SearchList, { open: shown && !disabled, onOpenChange: (next) => setShown(disabled ? false : next), options: options, value: iso, searchLabel: searchLabel, emptyLabel: emptyLabel, width: 280, onPick: (next) => {
|
|
46
|
+
if (value === undefined)
|
|
47
|
+
setOwn(next);
|
|
48
|
+
if (next !== iso)
|
|
49
|
+
onValueChange?.(next);
|
|
50
|
+
if (closeOnSelect)
|
|
51
|
+
setShown(false);
|
|
52
|
+
}, trigger: _jsxs(Segment, { ...{ 'data-slot': 'phone-country-picker' }, disabled: disabled, open: shown,
|
|
53
|
+
// Named by its hidden text, not an aria-label: the flag says nothing to
|
|
54
|
+
// a screen reader, and the words are the ones a translator sees.
|
|
55
|
+
gap: "$0.5", pl: "$2", pr: "$1", children: [_jsx(Flag, { iso: picked?.value, override: picked?.flag }), _jsx(ChevronDown, { size: 14, color: "$hint" }), _jsx(VisuallyHidden, { children: picked ? `${name}: ${picked.label} +${picked.callingCode}` : name })] }) }));
|
|
56
|
+
}
|
|
57
|
+
//# sourceMappingURL=phone-country-picker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"phone-country-picker.js","sourceRoot":"","sources":["../../../src/backends/gui/phone-country-picker.tsx"],"names":[],"mappings":"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"}
|
|
@@ -14,8 +14,16 @@ const jsx_runtime_1 = require("react/jsx-runtime");
|
|
|
14
14
|
* gui keeps BOTH placement facts on the popper ROOT — `offset` and `placement`
|
|
15
15
|
* — while the compound API spells them on Content, as `sideOffset` and `align`.
|
|
16
16
|
* One value, one owner: the root holds them, Content publishes into it.
|
|
17
|
+
*
|
|
18
|
+
* `size="sm"` is the record panel (twenty-ui's Popover, MIT, NOTICE): an 8px
|
|
19
|
+
* inset, sized to its content up to the room there is, 8px clear of its anchor.
|
|
20
|
+
* A `<Density value="compact">` makes it the default for a panel that names no
|
|
21
|
+
* size. The default stays the 16px-inset, 288-wide panel every surface has. The
|
|
22
|
+
* fill stays Hanzo's near-opaque panel — not twenty-ui's translucent glass.
|
|
23
|
+
* `arrow` adds a 12×6 pointer in the panel's own fill and edge.
|
|
17
24
|
*/
|
|
18
25
|
const gui_1 = require("@hanzo/gui");
|
|
26
|
+
const density_1 = require("./density.cjs");
|
|
19
27
|
const react_1 = require("react");
|
|
20
28
|
const portal_theme_1 = require("../../product/menu/portal-theme.cjs");
|
|
21
29
|
const place_1 = require("./place.cjs");
|
|
@@ -26,7 +34,9 @@ const Publish = /* @__PURE__ */ (0, react_1.createContext)(null);
|
|
|
26
34
|
/** Whether the panel this one opened from is solid. A list opened inside a solid
|
|
27
35
|
* panel stands on the same ground, so the pair reads as one surface. */
|
|
28
36
|
const Solid = /* @__PURE__ */ (0, react_1.createContext)(false);
|
|
29
|
-
function Popover({ offset
|
|
37
|
+
function Popover({ offset, placement, ...props }) {
|
|
38
|
+
const density = (0, density_1.useDensity)();
|
|
39
|
+
offset ??= density === 'compact' ? 8 : DEFAULT_OFFSET;
|
|
30
40
|
const [placed, setPlaced] = (0, react_1.useState)({});
|
|
31
41
|
const publish = (0, react_1.useCallback)((p) => setPlaced((prev) => ({ ...prev, ...p })), []);
|
|
32
42
|
return ((0, jsx_runtime_1.jsx)(Publish.Provider, { value: publish, children: (0, jsx_runtime_1.jsx)(gui_1.Popover, { offset: placed.offset ?? offset, placement: (0, place_1.place)(placement ?? DEFAULT_SIDE, placed.align), ...props }) }));
|
|
@@ -37,12 +47,18 @@ const PopoverAnchor = gui_1.Popover.Anchor;
|
|
|
37
47
|
exports.PopoverAnchor = PopoverAnchor;
|
|
38
48
|
const PopoverClose = gui_1.Popover.Close;
|
|
39
49
|
exports.PopoverClose = PopoverClose;
|
|
40
|
-
const PopoverContent = ({ sideOffset
|
|
50
|
+
const PopoverContent = ({ sideOffset, align, solid, size, arrow = false, children, ...props }) => {
|
|
41
51
|
const themeName = (0, portal_theme_1.useThemeName)();
|
|
52
|
+
const density = (0, density_1.useDensity)();
|
|
42
53
|
const publish = (0, react_1.useContext)(Publish);
|
|
43
54
|
const inherited = (0, react_1.useContext)(Solid);
|
|
44
55
|
const opaque = solid ?? inherited;
|
|
45
|
-
|
|
46
|
-
|
|
56
|
+
const small = (size ?? (density === 'compact' ? 'sm' : 'default')) === 'sm';
|
|
57
|
+
const offset = sideOffset ?? (density === 'compact' ? 8 : DEFAULT_OFFSET);
|
|
58
|
+
(0, react_1.useEffect)(() => publish?.({ offset, align }), [publish, offset, align]);
|
|
59
|
+
const ground = opaque ? 'var(--popover)' : '$panel';
|
|
60
|
+
return ((0, jsx_runtime_1.jsx)(Solid.Provider, { value: opaque, children: (0, jsx_runtime_1.jsx)(portal_theme_1.PortalTheme, { name: themeName, children: (0, jsx_runtime_1.jsx)(density_1.Density, { value: density, children: (0, jsx_runtime_1.jsxs)(gui_1.Popover.Content, { ...(0, slot_1.slot)('popover-content'), ...(opaque ? { 'data-material': 'solid' } : null), ...(small ? { 'data-size': 'sm' } : null), bg: ground, borderWidth: 1, borderColor: "$borderColor", rounded: "$4", ...(small
|
|
61
|
+
? { p: '$2', gap: '$1', maxW: 'var(--hanzogui-popper-available-width, 100vw)' }
|
|
62
|
+
: { p: '$4', width: 288 }), ...props, children: [arrow ? (0, jsx_runtime_1.jsx)(gui_1.Popover.Arrow, { ...(0, slot_1.slot)('popover-arrow'), size: 8.5, bg: ground, borderWidth: 1, borderColor: "$borderColor" }) : null, children] }) }) }) }));
|
|
47
63
|
};
|
|
48
64
|
exports.PopoverContent = PopoverContent;
|
|
@@ -8,6 +8,13 @@
|
|
|
8
8
|
* gui keeps BOTH placement facts on the popper ROOT — `offset` and `placement`
|
|
9
9
|
* — while the compound API spells them on Content, as `sideOffset` and `align`.
|
|
10
10
|
* One value, one owner: the root holds them, Content publishes into it.
|
|
11
|
+
*
|
|
12
|
+
* `size="sm"` is the record panel (twenty-ui's Popover, MIT, NOTICE): an 8px
|
|
13
|
+
* inset, sized to its content up to the room there is, 8px clear of its anchor.
|
|
14
|
+
* A `<Density value="compact">` makes it the default for a panel that names no
|
|
15
|
+
* size. The default stays the 16px-inset, 288-wide panel every surface has. The
|
|
16
|
+
* fill stays Hanzo's near-opaque panel — not twenty-ui's translucent glass.
|
|
17
|
+
* `arrow` adds a 12×6 pointer in the panel's own fill and edge.
|
|
11
18
|
*/
|
|
12
19
|
import { Popover as GuiPopover } from '@hanzo/gui';
|
|
13
20
|
import { type ComponentProps } from 'react';
|
|
@@ -30,7 +37,11 @@ export type PopoverContentProps = ComponentProps<typeof GuiPopover.Content> & {
|
|
|
30
37
|
* lit edge, and any popover opened from inside it is solid too.
|
|
31
38
|
*/
|
|
32
39
|
solid?: boolean;
|
|
40
|
+
/** `sm`: an 8px inset, content-sized up to the room there is. Unset, the nearest `<Density>` decides. */
|
|
41
|
+
size?: 'default' | 'sm';
|
|
42
|
+
/** A 12×6 pointer toward the anchor, in the panel's fill (gui's arrow is a turned square: 8.5 across is 12 wide, 6 out). */
|
|
43
|
+
arrow?: boolean;
|
|
33
44
|
};
|
|
34
|
-
declare const PopoverContent: ({ sideOffset, align, solid, ...props }: PopoverContentProps) => import("react").JSX.Element;
|
|
45
|
+
declare const PopoverContent: ({ sideOffset, align, solid, size, arrow, children, ...props }: PopoverContentProps) => import("react").JSX.Element;
|
|
35
46
|
export { Popover, PopoverTrigger, PopoverContent, PopoverAnchor, PopoverClose };
|
|
36
47
|
//# sourceMappingURL=popover.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"popover.d.ts","sourceRoot":"","sources":["../../../src/backends/gui/popover.tsx"],"names":[],"mappings":"AAEA
|
|
1
|
+
{"version":3,"file":"popover.d.ts","sourceRoot":"","sources":["../../../src/backends/gui/popover.tsx"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;;GAiBG;AACH,OAAO,EAAE,OAAO,IAAI,UAAU,EAAE,MAAM,YAAY,CAAA;AAElD,OAAO,EAML,KAAK,cAAc,EACpB,MAAM,OAAO,CAAA;AAEd,OAAO,EAAS,KAAK,KAAK,EAAE,MAAM,SAAS,CAAA;AAM3C,YAAY,EAAE,KAAK,EAAE,CAAA;AAWrB,MAAM,MAAM,YAAY,GAAG,IAAI,CAAC,cAAc,CAAC,OAAO,UAAU,CAAC,EAAE,QAAQ,CAAC,GAAG;IAAE,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,CAAA;AAElG,iBAAS,OAAO,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,YAAY,+BAc7D;AAED,QAAA,MAAM,cAAc,EAAE,OAAO,UAAU,CAAC,OAA4B,CAAA;AACpE,QAAA,MAAM,aAAa,EAAE,OAAO,UAAU,CAAC,MAA0B,CAAA;AACjE,QAAA,MAAM,YAAY,EAAE,OAAO,UAAU,CAAC,KAAwB,CAAA;AAE9D,MAAM,MAAM,mBAAmB,GAAG,cAAc,CAAC,OAAO,UAAU,CAAC,OAAO,CAAC,GAAG;IAC5E,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,KAAK,CAAC,EAAE,KAAK,CAAA;IACb;;;;;OAKG;IACH,KAAK,CAAC,EAAE,OAAO,CAAA;IACf,yGAAyG;IACzG,IAAI,CAAC,EAAE,SAAS,GAAG,IAAI,CAAA;IACvB,4HAA4H;IAC5H,KAAK,CAAC,EAAE,OAAO,CAAA;CAChB,CAAA;AAED,QAAA,MAAM,cAAc,kEAA2E,mBAAmB,gCAkCjH,CAAA;AAED,OAAO,EAAE,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,aAAa,EAAE,YAAY,EAAE,CAAA"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
'use client';
|
|
2
|
-
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
3
|
/**
|
|
4
4
|
* Popover — floating panel anchored to a trigger.
|
|
5
5
|
*
|
|
@@ -10,8 +10,16 @@ import { jsx as _jsx } from "react/jsx-runtime";
|
|
|
10
10
|
* gui keeps BOTH placement facts on the popper ROOT — `offset` and `placement`
|
|
11
11
|
* — while the compound API spells them on Content, as `sideOffset` and `align`.
|
|
12
12
|
* One value, one owner: the root holds them, Content publishes into it.
|
|
13
|
+
*
|
|
14
|
+
* `size="sm"` is the record panel (twenty-ui's Popover, MIT, NOTICE): an 8px
|
|
15
|
+
* inset, sized to its content up to the room there is, 8px clear of its anchor.
|
|
16
|
+
* A `<Density value="compact">` makes it the default for a panel that names no
|
|
17
|
+
* size. The default stays the 16px-inset, 288-wide panel every surface has. The
|
|
18
|
+
* fill stays Hanzo's near-opaque panel — not twenty-ui's translucent glass.
|
|
19
|
+
* `arrow` adds a 12×6 pointer in the panel's own fill and edge.
|
|
13
20
|
*/
|
|
14
21
|
import { Popover as GuiPopover } from '@hanzo/gui';
|
|
22
|
+
import { Density, useDensity } from './density.js';
|
|
15
23
|
import { createContext, useCallback, useContext, useEffect, useState, } from 'react';
|
|
16
24
|
import { PortalTheme, useThemeName } from '../../product/menu/portal-theme.js';
|
|
17
25
|
import { place } from './place.js';
|
|
@@ -22,7 +30,9 @@ const Publish = /* @__PURE__ */ createContext(null);
|
|
|
22
30
|
/** Whether the panel this one opened from is solid. A list opened inside a solid
|
|
23
31
|
* panel stands on the same ground, so the pair reads as one surface. */
|
|
24
32
|
const Solid = /* @__PURE__ */ createContext(false);
|
|
25
|
-
function Popover({ offset
|
|
33
|
+
function Popover({ offset, placement, ...props }) {
|
|
34
|
+
const density = useDensity();
|
|
35
|
+
offset ??= density === 'compact' ? 8 : DEFAULT_OFFSET;
|
|
26
36
|
const [placed, setPlaced] = useState({});
|
|
27
37
|
const publish = useCallback((p) => setPlaced((prev) => ({ ...prev, ...p })), []);
|
|
28
38
|
return (_jsx(Publish.Provider, { value: publish, children: _jsx(GuiPopover, { offset: placed.offset ?? offset, placement: place(placement ?? DEFAULT_SIDE, placed.align), ...props }) }));
|
|
@@ -30,13 +40,19 @@ function Popover({ offset = DEFAULT_OFFSET, placement, ...props }) {
|
|
|
30
40
|
const PopoverTrigger = GuiPopover.Trigger;
|
|
31
41
|
const PopoverAnchor = GuiPopover.Anchor;
|
|
32
42
|
const PopoverClose = GuiPopover.Close;
|
|
33
|
-
const PopoverContent = ({ sideOffset
|
|
43
|
+
const PopoverContent = ({ sideOffset, align, solid, size, arrow = false, children, ...props }) => {
|
|
34
44
|
const themeName = useThemeName();
|
|
45
|
+
const density = useDensity();
|
|
35
46
|
const publish = useContext(Publish);
|
|
36
47
|
const inherited = useContext(Solid);
|
|
37
48
|
const opaque = solid ?? inherited;
|
|
38
|
-
|
|
39
|
-
|
|
49
|
+
const small = (size ?? (density === 'compact' ? 'sm' : 'default')) === 'sm';
|
|
50
|
+
const offset = sideOffset ?? (density === 'compact' ? 8 : DEFAULT_OFFSET);
|
|
51
|
+
useEffect(() => publish?.({ offset, align }), [publish, offset, align]);
|
|
52
|
+
const ground = opaque ? 'var(--popover)' : '$panel';
|
|
53
|
+
return (_jsx(Solid.Provider, { value: opaque, children: _jsx(PortalTheme, { name: themeName, children: _jsx(Density, { value: density, children: _jsxs(GuiPopover.Content, { ...slot('popover-content'), ...(opaque ? { 'data-material': 'solid' } : null), ...(small ? { 'data-size': 'sm' } : null), bg: ground, borderWidth: 1, borderColor: "$borderColor", rounded: "$4", ...(small
|
|
54
|
+
? { p: '$2', gap: '$1', maxW: 'var(--hanzogui-popper-available-width, 100vw)' }
|
|
55
|
+
: { p: '$4', width: 288 }), ...props, children: [arrow ? _jsx(GuiPopover.Arrow, { ...slot('popover-arrow'), size: 8.5, bg: ground, borderWidth: 1, borderColor: "$borderColor" }) : null, children] }) }) }) }));
|
|
40
56
|
};
|
|
41
57
|
export { Popover, PopoverTrigger, PopoverContent, PopoverAnchor, PopoverClose };
|
|
42
58
|
//# sourceMappingURL=popover.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"popover.js","sourceRoot":"","sources":["../../../src/backends/gui/popover.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAA;;AAEZ
|
|
1
|
+
{"version":3,"file":"popover.js","sourceRoot":"","sources":["../../../src/backends/gui/popover.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
'use client';"use strict";
|
|
2
|
+
'use client';
|
|
3
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
+
exports.ProgressRing = ProgressRing;
|
|
5
|
+
const jsx_runtime_1 = require("react/jsx-runtime");
|
|
6
|
+
/**
|
|
7
|
+
* ProgressRing — a small circular progress, for a row that has no room for a
|
|
8
|
+
* bar: the context left in a composer, a sync that is 40% through, a metric.
|
|
9
|
+
*
|
|
10
|
+
* After twenty-ui's ProgressRing (MIT, NOTICE): 14px (`sm`) or 16px (`md`), a
|
|
11
|
+
* 2px stroke starting at 12 o'clock, the track on the strong edge rung and the
|
|
12
|
+
* indicator on the accent (`--primary`, monochrome until an org picks one).
|
|
13
|
+
* The indicator's dash eases over 300ms with round caps (square at 0%, where a
|
|
14
|
+
* round cap would draw a dot). `value={null}` shows a quarter and turns once
|
|
15
|
+
* every 1.5s (`data-motion="orbit"`, still under reduced motion).
|
|
16
|
+
*
|
|
17
|
+
* Children are a label drawn to the LEFT of the ring, 8px from it — a value
|
|
18
|
+
* ("40%") or a name — and also name the progressbar for assistive technology
|
|
19
|
+
* unless `aria-label` says otherwise.
|
|
20
|
+
*
|
|
21
|
+
* A plain <svg>, as Donut and the grid patterns are: the ring is drawn, not
|
|
22
|
+
* laid out, and gui tokens reach it as the custom properties gui emits.
|
|
23
|
+
*/
|
|
24
|
+
const gui_1 = require("@hanzo/gui");
|
|
25
|
+
const react_1 = require("react");
|
|
26
|
+
const slot_1 = require("./slot.cjs");
|
|
27
|
+
const SIZE = { sm: 14, md: 16 };
|
|
28
|
+
const STROKE = 2;
|
|
29
|
+
function ProgressRing({ value, size = 'md', barColor = 'var(--primary)', children, 'aria-label': label, ...props }) {
|
|
30
|
+
const id = (0, react_1.useId)();
|
|
31
|
+
const d = SIZE[size];
|
|
32
|
+
const r = (d - STROKE) / 2;
|
|
33
|
+
const circ = 2 * Math.PI * r;
|
|
34
|
+
const indeterminate = value === null;
|
|
35
|
+
const v = indeterminate ? 25 : Math.max(0, Math.min(100, value));
|
|
36
|
+
const offset = circ * (1 - v / 100);
|
|
37
|
+
return ((0, jsx_runtime_1.jsxs)(gui_1.XStack, { ...(0, slot_1.slot)('progress-ring'), role: "progressbar", "aria-valuemin": 0, "aria-valuemax": 100, "aria-valuenow": indeterminate ? undefined : v, "aria-label": label, "aria-labelledby": label || !children ? undefined : `${id}-label`, display: "inline-flex", items: "center", gap: "$2", shrink: 0, ...props, children: [children ? ((0, jsx_runtime_1.jsx)(gui_1.SizableText, { id: `${id}-label`, size: "$1", color: "$ink", numberOfLines: 1, textAlign: "right", children: children })) : null, (0, jsx_runtime_1.jsxs)("svg", { width: d, height: d, viewBox: `0 0 ${d} ${d}`, "aria-hidden": true, "data-motion": indeterminate ? 'orbit' : undefined, style: { flexShrink: 0, transform: 'rotate(-90deg)', transformOrigin: 'center' }, children: [(0, jsx_runtime_1.jsx)("circle", { cx: d / 2, cy: d / 2, r: r, fill: "none", stroke: "var(--rim)", strokeWidth: STROKE }), (0, jsx_runtime_1.jsx)("circle", { cx: d / 2, cy: d / 2, r: r, fill: "none", stroke: barColor, strokeWidth: STROKE, strokeDasharray: circ, strokeDashoffset: offset, strokeLinecap: v > 0 ? 'round' : 'butt', style: { transition: 'stroke-dashoffset 300ms ease' } })] })] }));
|
|
38
|
+
}
|