@passui/react 0.1.47 → 0.2.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/README.md +29 -109
- package/THIRD_PARTY_NOTICES.md +29 -0
- package/dist/accordion.d.ts +15 -0
- package/dist/accordion.js +93 -0
- package/dist/alert-dialog.d.ts +26 -0
- package/dist/alert-dialog.js +142 -0
- package/dist/alert.d.ts +10 -0
- package/dist/alert.js +28 -0
- package/dist/{types/src/components/ambient/ambient.d.ts → ambient.d.ts} +4 -4
- package/dist/ambient.js +22 -0
- package/dist/{types/src/appearance → appearance}/platform.d.ts +3 -3
- package/dist/appearance/platform.js +43 -0
- package/dist/appearance/theme.d.ts +71 -0
- package/dist/appearance/theme.js +236 -0
- package/dist/appearance.d.ts +3 -0
- package/dist/appearance.js +3 -0
- package/dist/{types/src/components/aspect-ratio/aspect-ratio.d.ts → aspect-ratio.d.ts} +4 -4
- package/dist/aspect-ratio.js +17 -0
- package/dist/avatar.d.ts +5 -0
- package/dist/avatar.js +43 -0
- package/dist/badge.d.ts +8 -0
- package/dist/badge.js +21 -0
- package/dist/breadcrumb.d.ts +13 -0
- package/dist/breadcrumb.js +63 -0
- package/dist/button-group.d.ts +5 -0
- package/dist/button-group.js +14 -0
- package/dist/button.d.ts +21 -0
- package/dist/button.js +58 -0
- package/dist/calendar.d.ts +35 -0
- package/dist/calendar.js +225 -0
- package/dist/card.d.ts +9 -0
- package/dist/card.js +54 -0
- package/dist/chart.d.ts +30 -0
- package/dist/chart.js +226 -0
- package/dist/checkbox.d.ts +13 -0
- package/dist/checkbox.js +53 -0
- package/dist/{types/src/lib/clipboard.d.ts → clipboard.d.ts} +1 -1
- package/dist/clipboard.js +16 -0
- package/dist/cn.d.ts +2 -0
- package/dist/cn.js +10 -0
- package/dist/code-block.d.ts +34 -0
- package/dist/code-block.js +87 -0
- package/dist/collapsible.d.ts +13 -0
- package/dist/collapsible.js +49 -0
- package/dist/combobox.d.ts +25 -0
- package/dist/combobox.js +112 -0
- package/dist/command.d.ts +22 -0
- package/dist/command.js +129 -0
- package/dist/components/toast/toast-store.d.ts +60 -0
- package/dist/components/toast/toast-store.js +96 -0
- package/dist/{types/src/components → components}/toast/toaster.d.ts +4 -4
- package/dist/components/toast/toaster.js +345 -0
- package/dist/context-menu.d.ts +2 -0
- package/dist/context-menu.js +2 -0
- package/dist/conversation.d.ts +48 -0
- package/dist/conversation.js +202 -0
- package/dist/date-time-picker.d.ts +50 -0
- package/dist/date-time-picker.js +235 -0
- package/dist/date.d.ts +50 -0
- package/dist/date.js +77 -0
- package/dist/dialog.d.ts +21 -0
- package/dist/dialog.js +113 -0
- package/dist/drawer.d.ts +30 -0
- package/dist/drawer.js +140 -0
- package/dist/dropdown-menu.d.ts +56 -0
- package/dist/dropdown-menu.js +295 -0
- package/dist/empty.d.ts +11 -0
- package/dist/empty.js +51 -0
- package/dist/field.d.ts +16 -0
- package/dist/field.js +47 -0
- package/{src/hooks/scroll/minimize-decision.ts → dist/hooks/scroll/minimize-decision.js} +3 -5
- package/dist/{types/src/hooks → hooks}/use-anchored-placement.d.ts +2 -2
- package/dist/hooks/use-anchored-placement.js +33 -0
- package/dist/{types/src/hooks → hooks}/use-minimize-on-scroll.d.ts +1 -1
- package/dist/hooks/use-minimize-on-scroll.js +59 -0
- package/dist/{types/src/hooks → hooks}/use-visual-viewport.d.ts +2 -2
- package/{src/hooks/use-visual-viewport.ts → dist/hooks/use-visual-viewport.js} +20 -35
- package/dist/hooks/viewport/types.d.ts +7 -0
- package/dist/hooks/viewport/viewport-metrics.js +13 -0
- package/dist/index.d.ts +84 -0
- package/dist/index.js +80 -0
- package/dist/input-group.d.ts +17 -0
- package/dist/input-group.js +55 -0
- package/dist/input-otp.d.ts +13 -0
- package/dist/input-otp.js +36 -0
- package/dist/input.d.ts +4 -0
- package/dist/input.js +14 -0
- package/dist/item.d.ts +49 -0
- package/dist/item.js +142 -0
- package/dist/kbd.d.ts +4 -0
- package/dist/kbd.js +86 -0
- package/dist/label.d.ts +3 -0
- package/dist/label.js +12 -0
- package/dist/labeled-content.d.ts +24 -0
- package/dist/labeled-content.js +41 -0
- package/dist/{types/src/lib/language.d.ts → language.d.ts} +1 -1
- package/dist/language.js +11 -0
- package/dist/layout.d.ts +24 -0
- package/dist/layout.js +36 -0
- package/dist/{types/src/lib → lib}/anchored-placement.d.ts +27 -27
- package/dist/lib/anchored-placement.js +42 -0
- package/dist/lib/calendar-month.js +90 -0
- package/dist/lib/cx.js +6 -0
- package/dist/lib/drawer.math.js +29 -0
- package/dist/lib/floating-layers.d.ts +3 -0
- package/dist/lib/floating-layers.js +25 -0
- package/dist/{types/src/lib → lib}/haptics.d.ts +1 -1
- package/dist/lib/haptics.js +13 -0
- package/dist/lib/liquid-step.js +33 -0
- package/dist/lib/page-scale.js +58 -0
- package/dist/lib/portal.js +12 -0
- package/dist/lib/presence.js +53 -0
- package/dist/lib/range-value.js +25 -0
- package/dist/lib/render.d.ts +8 -0
- package/dist/lib/render.js +42 -0
- package/dist/lib/rolling-digit.js +83 -0
- package/dist/{types/src/lib → lib}/screen-edges.d.ts +5 -5
- package/dist/lib/screen-edges.js +30 -0
- package/dist/lib/swipe-touch-action.js +34 -0
- package/dist/lib/visual-viewport.js +27 -0
- package/dist/lib/water-drop.js +412 -0
- package/dist/lib/wheel.js +125 -0
- package/dist/list.d.ts +26 -0
- package/dist/list.js +80 -0
- package/dist/locales.d.ts +18 -0
- package/dist/locales.js +36 -0
- package/dist/marker.d.ts +13 -0
- package/dist/marker.js +33 -0
- package/dist/motion/transitions.d.ts +170 -0
- package/dist/motion/transitions.js +156 -0
- package/dist/pagination.d.ts +30 -0
- package/dist/pagination.js +117 -0
- package/dist/popover.d.ts +26 -0
- package/dist/popover.js +101 -0
- package/dist/progress.d.ts +9 -0
- package/dist/progress.js +24 -0
- package/dist/questionnaire.d.ts +46 -0
- package/dist/questionnaire.js +133 -0
- package/dist/radio-group.d.ts +21 -0
- package/dist/radio-group.js +67 -0
- package/dist/search-field.d.ts +18 -0
- package/dist/search-field.js +45 -0
- package/dist/segmented-control.d.ts +16 -0
- package/dist/segmented-control.js +25 -0
- package/dist/select.d.ts +24 -0
- package/dist/select.js +107 -0
- package/dist/separator.d.ts +9 -0
- package/dist/separator.js +17 -0
- package/dist/{types/src/lib/shapes.d.ts → shapes.d.ts} +2 -2
- package/dist/shapes.js +65 -0
- package/dist/sheet.d.ts +24 -0
- package/dist/sheet.js +141 -0
- package/dist/sidebar.d.ts +32 -0
- package/dist/sidebar.js +85 -0
- package/dist/skeleton.d.ts +3 -0
- package/dist/skeleton.js +13 -0
- package/dist/slider.d.ts +9 -0
- package/dist/slider.js +42 -0
- package/dist/slosh-slider.d.ts +21 -0
- package/dist/slosh-slider.js +205 -0
- package/dist/spinner.d.ts +3 -0
- package/dist/spinner.js +20 -0
- package/dist/stat-tile.d.ts +20 -0
- package/dist/stat-tile.js +53 -0
- package/dist/stepper.d.ts +22 -0
- package/dist/stepper.js +98 -0
- package/dist/swatch-picker.d.ts +22 -0
- package/dist/swatch-picker.js +70 -0
- package/dist/switch.d.ts +10 -0
- package/dist/switch.js +44 -0
- package/dist/tab-bar.d.ts +15 -0
- package/dist/tab-bar.js +34 -0
- package/dist/{types/src/components/table/table.d.ts → table.d.ts} +3 -3
- package/dist/table.js +93 -0
- package/dist/tabs.d.ts +32 -0
- package/dist/tabs.js +131 -0
- package/dist/text.d.ts +25 -0
- package/dist/text.js +44 -0
- package/dist/textarea.d.ts +3 -0
- package/dist/textarea.js +13 -0
- package/dist/toast.d.ts +3 -0
- package/dist/toast.js +3 -0
- package/dist/toggle-group.d.ts +20 -0
- package/dist/toggle-group.js +68 -0
- package/dist/toggle.d.ts +24 -0
- package/dist/toggle.js +37 -0
- package/dist/tokens.d.ts +1 -0
- package/dist/tooltip.d.ts +21 -0
- package/dist/tooltip.js +61 -0
- package/dist/trace.d.ts +14 -0
- package/dist/trace.js +54 -0
- package/dist/{types/src/hooks/use-dismiss.d.ts → use-dismiss.d.ts} +3 -3
- package/dist/use-dismiss.js +38 -0
- package/dist/{types/src/hooks/use-media-query.d.ts → use-media-query.d.ts} +12 -12
- package/dist/use-media-query.js +56 -0
- package/dist/use-os.d.ts +12 -0
- package/dist/use-os.js +17 -0
- package/dist/wake-slider.d.ts +15 -0
- package/dist/wake-slider.js +174 -0
- package/package.json +122 -253
- package/src/styles/code-block.css +4 -0
- package/src/styles/globals.css +5 -0
- package/src/styles/motion-controls.css +10 -0
- package/src/styles/page-scale.css +27 -0
- package/src/styles/styles.css +4 -2
- package/dist/types/src/appearance/index.d.ts +0 -2
- package/dist/types/src/appearance/theme.d.ts +0 -71
- package/dist/types/src/components/accordion/accordion.d.ts +0 -23
- package/dist/types/src/components/ambient/index.d.ts +0 -1
- package/dist/types/src/components/breadcrumb/breadcrumb.d.ts +0 -19
- package/dist/types/src/components/button/button-styles.d.ts +0 -12
- package/dist/types/src/components/button/button.d.ts +0 -32
- package/dist/types/src/components/button/icon-button.d.ts +0 -10
- package/dist/types/src/components/button/pending-spinner.d.ts +0 -5
- package/dist/types/src/components/button/use-pending-indicator.d.ts +0 -2
- package/dist/types/src/components/chip/chip.d.ts +0 -10
- package/dist/types/src/components/code-block/code-block.d.ts +0 -13
- package/dist/types/src/components/combo-box/combo-box.d.ts +0 -9
- package/dist/types/src/components/command/command.d.ts +0 -18
- package/dist/types/src/components/compact-date-picker/calendar-month.d.ts +0 -25
- package/dist/types/src/components/compact-date-picker/compact-date-picker.d.ts +0 -30
- package/dist/types/src/components/compact-time-picker/compact-time-picker.d.ts +0 -29
- package/dist/types/src/components/compact-time-picker/time-value.d.ts +0 -18
- package/dist/types/src/components/content-unavailable-view/content-unavailable-view.d.ts +0 -12
- package/dist/types/src/components/content-view/content-view.d.ts +0 -51
- package/dist/types/src/components/content-view/index.d.ts +0 -1
- package/dist/types/src/components/context-menu/conceal-menu-source.d.ts +0 -2
- package/dist/types/src/components/context-menu/context-menu-host.d.ts +0 -2
- package/dist/types/src/components/context-menu/context-menu-store.d.ts +0 -62
- package/dist/types/src/components/context-menu/menu-navigation.d.ts +0 -6
- package/dist/types/src/components/context-menu/menu-position.d.ts +0 -21
- package/dist/types/src/components/context-menu/menu-reveal.d.ts +0 -26
- package/dist/types/src/components/context-menu/use-context-menu.d.ts +0 -14
- package/dist/types/src/components/conversation/conversation.d.ts +0 -48
- package/dist/types/src/components/conversation/index.d.ts +0 -1
- package/dist/types/src/components/date-picker/date-picker.d.ts +0 -19
- package/dist/types/src/components/date-picker/date-value.d.ts +0 -2
- package/dist/types/src/components/dialog/dialog-host.d.ts +0 -6
- package/dist/types/src/components/dialog/dialog-store.d.ts +0 -23
- package/dist/types/src/components/dialog/dialog.d.ts +0 -33
- package/dist/types/src/components/dialog/index.d.ts +0 -1
- package/dist/types/src/components/disclosure-group/disclosure-group.d.ts +0 -18
- package/dist/types/src/components/divider/divider.d.ts +0 -9
- package/dist/types/src/components/inline-disclosure/inline-disclosure.d.ts +0 -15
- package/dist/types/src/components/keyboard-shortcut/keyboard-shortcut.d.ts +0 -8
- package/dist/types/src/components/labeled-content/labeled-content.d.ts +0 -22
- package/dist/types/src/components/locale-switcher/index.d.ts +0 -1
- package/dist/types/src/components/locale-switcher/locale-switcher.d.ts +0 -13
- package/dist/types/src/components/menu/menu.d.ts +0 -16
- package/dist/types/src/components/morph/index.d.ts +0 -2
- package/dist/types/src/components/morph/morph.d.ts +0 -32
- package/dist/types/src/components/morph/use-morph-disclosure.d.ts +0 -13
- package/dist/types/src/components/one-time-code/one-time-code.d.ts +0 -26
- package/dist/types/src/components/picker/picker-trigger.d.ts +0 -3
- package/dist/types/src/components/picker/picker.d.ts +0 -46
- package/dist/types/src/components/popover/anchored-surface.d.ts +0 -17
- package/dist/types/src/components/popover/index.d.ts +0 -41
- package/dist/types/src/components/popover/popover-content.d.ts +0 -38
- package/dist/types/src/components/popover/popover-root.d.ts +0 -22
- package/dist/types/src/components/popover/popover-trigger.d.ts +0 -23
- package/dist/types/src/components/profile-image/profile-image.d.ts +0 -9
- package/dist/types/src/components/progress-view/progress-view.d.ts +0 -13
- package/dist/types/src/components/progress-view/use-liquid-progress.d.ts +0 -3
- package/dist/types/src/components/radio-group/radio-group.d.ts +0 -20
- package/dist/types/src/components/search-field/expanding-search-field.d.ts +0 -5
- package/dist/types/src/components/search-field/search-field.d.ts +0 -9
- package/dist/types/src/components/search-list/search-list.d.ts +0 -22
- package/dist/types/src/components/section/section.d.ts +0 -18
- package/dist/types/src/components/secure-field/secure-field.d.ts +0 -4
- package/dist/types/src/components/segmented-control/segmented-control.d.ts +0 -25
- package/dist/types/src/components/sheet/modal-environment.d.ts +0 -2
- package/dist/types/src/components/sheet/sheet-portal.d.ts +0 -5
- package/dist/types/src/components/sheet/sheet.d.ts +0 -26
- package/dist/types/src/components/sheet/use-sheet-focus.d.ts +0 -3
- package/dist/types/src/components/sidebar/sidebar.d.ts +0 -24
- package/dist/types/src/components/skeleton/skeleton.d.ts +0 -9
- package/dist/types/src/components/slider/slider.d.ts +0 -17
- package/dist/types/src/components/slosh-slider/liquid-step.d.ts +0 -6
- package/dist/types/src/components/slosh-slider/slosh-slider.d.ts +0 -21
- package/dist/types/src/components/stat-tile/index.d.ts +0 -1
- package/dist/types/src/components/stat-tile/stat-tile.d.ts +0 -20
- package/dist/types/src/components/status-indicator/status-indicator.d.ts +0 -17
- package/dist/types/src/components/stepper/rolling-digit.d.ts +0 -11
- package/dist/types/src/components/stepper/stepper.d.ts +0 -22
- package/dist/types/src/components/swatch-picker/swatch-picker.d.ts +0 -22
- package/dist/types/src/components/tab-bar/tab-bar.d.ts +0 -43
- package/dist/types/src/components/tab-view/tab-view.d.ts +0 -27
- package/dist/types/src/components/text-editor/text-editor.d.ts +0 -9
- package/dist/types/src/components/text-field/text-field.d.ts +0 -33
- package/dist/types/src/components/toast/toast-store.d.ts +0 -52
- package/dist/types/src/components/toggle/toggle.d.ts +0 -22
- package/dist/types/src/components/tooltip/tooltip-host.d.ts +0 -7
- package/dist/types/src/components/view-controller/index.d.ts +0 -1
- package/dist/types/src/components/view-controller/view-controller.d.ts +0 -21
- package/dist/types/src/components/wake-slider/wake-slider.d.ts +0 -15
- package/dist/types/src/hooks/scroll/minimize-decision.d.ts +0 -2
- package/dist/types/src/hooks/use-anchored-disclosure.d.ts +0 -9
- package/dist/types/src/hooks/use-floating-dismiss.d.ts +0 -3
- package/dist/types/src/hooks/viewport/types.d.ts +0 -19
- package/dist/types/src/hooks/viewport/viewport-metrics.d.ts +0 -3
- package/dist/types/src/icons/icons.d.ts +0 -616
- package/dist/types/src/index.d.ts +0 -73
- package/dist/types/src/lib/class-names.d.ts +0 -2
- package/dist/types/src/lib/date.d.ts +0 -50
- package/dist/types/src/lib/floating-layers.d.ts +0 -8
- package/dist/types/src/lib/range-value.d.ts +0 -4
- package/dist/types/src/machines/popover.machine.d.ts +0 -30
- package/dist/types/src/motion/transitions.d.ts +0 -170
- package/src/appearance/index.ts +0 -2
- package/src/appearance/platform.tsx +0 -102
- package/src/appearance/theme.tsx +0 -467
- package/src/components/accordion/accordion.tsx +0 -70
- package/src/components/ambient/ambient.tsx +0 -35
- package/src/components/ambient/index.ts +0 -1
- package/src/components/aspect-ratio/aspect-ratio.tsx +0 -27
- package/src/components/breadcrumb/breadcrumb.tsx +0 -73
- package/src/components/button/button-styles.ts +0 -49
- package/src/components/button/button.tsx +0 -107
- package/src/components/button/icon-button.tsx +0 -33
- package/src/components/button/pending-spinner.tsx +0 -14
- package/src/components/button/use-pending-indicator.ts +0 -22
- package/src/components/chip/chip.tsx +0 -45
- package/src/components/code-block/code-block.tsx +0 -48
- package/src/components/combo-box/combo-box.tsx +0 -13
- package/src/components/command/command.tsx +0 -149
- package/src/components/compact-date-picker/calendar-month.ts +0 -109
- package/src/components/compact-date-picker/compact-date-picker.tsx +0 -337
- package/src/components/compact-time-picker/compact-time-picker.tsx +0 -321
- package/src/components/compact-time-picker/time-value.ts +0 -58
- package/src/components/content-unavailable-view/content-unavailable-view.tsx +0 -78
- package/src/components/content-view/content-view.tsx +0 -215
- package/src/components/content-view/index.ts +0 -1
- package/src/components/context-menu/conceal-menu-source.ts +0 -30
- package/src/components/context-menu/context-menu-host.tsx +0 -459
- package/src/components/context-menu/context-menu-store.ts +0 -167
- package/src/components/context-menu/menu-navigation.ts +0 -36
- package/src/components/context-menu/menu-position.ts +0 -38
- package/src/components/context-menu/menu-reveal.ts +0 -42
- package/src/components/context-menu/use-context-menu.ts +0 -73
- package/src/components/conversation/conversation.tsx +0 -309
- package/src/components/conversation/index.ts +0 -1
- package/src/components/date-picker/date-picker.tsx +0 -106
- package/src/components/date-picker/date-value.ts +0 -22
- package/src/components/dialog/dialog-host.tsx +0 -119
- package/src/components/dialog/dialog-store.ts +0 -66
- package/src/components/dialog/dialog.tsx +0 -211
- package/src/components/dialog/index.ts +0 -1
- package/src/components/disclosure-group/disclosure-group.tsx +0 -108
- package/src/components/divider/divider.tsx +0 -33
- package/src/components/inline-disclosure/inline-disclosure.tsx +0 -53
- package/src/components/keyboard-shortcut/keyboard-shortcut.tsx +0 -32
- package/src/components/labeled-content/labeled-content.tsx +0 -84
- package/src/components/locale-switcher/index.ts +0 -1
- package/src/components/locale-switcher/locale-switcher.tsx +0 -310
- package/src/components/menu/menu.tsx +0 -85
- package/src/components/morph/index.ts +0 -2
- package/src/components/morph/morph.tsx +0 -258
- package/src/components/morph/use-morph-disclosure.ts +0 -27
- package/src/components/one-time-code/one-time-code.tsx +0 -234
- package/src/components/picker/picker-trigger.ts +0 -22
- package/src/components/picker/picker.tsx +0 -404
- package/src/components/popover/anchored-surface.tsx +0 -264
- package/src/components/popover/index.ts +0 -50
- package/src/components/popover/popover-content.tsx +0 -374
- package/src/components/popover/popover-root.tsx +0 -97
- package/src/components/popover/popover-trigger.tsx +0 -71
- package/src/components/profile-image/profile-image.tsx +0 -96
- package/src/components/progress-view/progress-view.tsx +0 -72
- package/src/components/progress-view/use-liquid-progress.ts +0 -43
- package/src/components/radio-group/radio-group.tsx +0 -86
- package/src/components/search-field/expanding-search-field.tsx +0 -197
- package/src/components/search-field/search-field.tsx +0 -66
- package/src/components/search-list/search-list.tsx +0 -276
- package/src/components/section/section.tsx +0 -75
- package/src/components/secure-field/secure-field.tsx +0 -8
- package/src/components/segmented-control/segmented-control.tsx +0 -157
- package/src/components/sheet/modal-environment.ts +0 -82
- package/src/components/sheet/sheet-portal.tsx +0 -62
- package/src/components/sheet/sheet.tsx +0 -165
- package/src/components/sheet/use-sheet-focus.ts +0 -109
- package/src/components/sidebar/sidebar.tsx +0 -102
- package/src/components/skeleton/skeleton.tsx +0 -38
- package/src/components/slider/slider.tsx +0 -134
- package/src/components/slosh-slider/liquid-step.ts +0 -43
- package/src/components/slosh-slider/slosh-slider.tsx +0 -294
- package/src/components/stat-tile/index.ts +0 -1
- package/src/components/stat-tile/stat-tile.tsx +0 -90
- package/src/components/status-indicator/status-indicator.tsx +0 -54
- package/src/components/stepper/rolling-digit.tsx +0 -91
- package/src/components/stepper/stepper.tsx +0 -136
- package/src/components/swatch-picker/swatch-picker.tsx +0 -138
- package/src/components/tab-bar/tab-bar.tsx +0 -182
- package/src/components/tab-view/tab-view.tsx +0 -155
- package/src/components/table/table.tsx +0 -151
- package/src/components/text-editor/text-editor.tsx +0 -42
- package/src/components/text-field/text-field.tsx +0 -200
- package/src/components/toast/toast-store.ts +0 -164
- package/src/components/toast/toaster.tsx +0 -407
- package/src/components/toggle/toggle.tsx +0 -320
- package/src/components/tooltip/tooltip-host.tsx +0 -178
- package/src/components/view-controller/index.ts +0 -1
- package/src/components/view-controller/view-controller.tsx +0 -75
- package/src/components/wake-slider/wake-slider.tsx +0 -260
- package/src/hooks/use-anchored-disclosure.ts +0 -23
- package/src/hooks/use-anchored-placement.ts +0 -40
- package/src/hooks/use-dismiss.ts +0 -44
- package/src/hooks/use-floating-dismiss.ts +0 -30
- package/src/hooks/use-media-query.ts +0 -94
- package/src/hooks/use-minimize-on-scroll.ts +0 -77
- package/src/hooks/viewport/types.ts +0 -19
- package/src/hooks/viewport/viewport-metrics.ts +0 -19
- package/src/icons/icons.tsx +0 -458
- package/src/index.ts +0 -107
- package/src/lib/anchored-placement.ts +0 -91
- package/src/lib/class-names.ts +0 -21
- package/src/lib/clipboard.ts +0 -15
- package/src/lib/date.ts +0 -86
- package/src/lib/floating-layers.ts +0 -53
- package/src/lib/haptics.ts +0 -23
- package/src/lib/language.ts +0 -16
- package/src/lib/range-value.ts +0 -38
- package/src/lib/screen-edges.ts +0 -44
- package/src/lib/shapes.ts +0 -59
- package/src/machines/popover.machine.ts +0 -51
- package/src/motion/transitions.ts +0 -97
- package/src/tokens.ts +0 -1
- /package/dist/{types/src/tokens.d.ts → tokens.js} +0 -0
|
@@ -1,138 +0,0 @@
|
|
|
1
|
-
import { motion } from "motion/react";
|
|
2
|
-
import { useId } from "react";
|
|
3
|
-
import { CheckIcon } from "../../icons/icons";
|
|
4
|
-
import { cn } from "../../lib/class-names";
|
|
5
|
-
import { haptic } from "../../lib/haptics";
|
|
6
|
-
import { spring } from "../../motion/transitions";
|
|
7
|
-
|
|
8
|
-
export interface SwatchPickerOption<T extends string> {
|
|
9
|
-
value: T;
|
|
10
|
-
label: string;
|
|
11
|
-
/** Swatch background color. */
|
|
12
|
-
color: string;
|
|
13
|
-
/** Color of the selected checkmark. */
|
|
14
|
-
ink: string;
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
export type SwatchPickerSize = "sm" | "md" | "lg";
|
|
18
|
-
|
|
19
|
-
const swatchSizes: Record<SwatchPickerSize, string> = {
|
|
20
|
-
sm: "size-6",
|
|
21
|
-
md: "size-8",
|
|
22
|
-
lg: "size-10",
|
|
23
|
-
};
|
|
24
|
-
const checkSizes: Record<SwatchPickerSize, number> = {
|
|
25
|
-
sm: 13,
|
|
26
|
-
md: 16,
|
|
27
|
-
lg: 19,
|
|
28
|
-
};
|
|
29
|
-
const captionText: Record<SwatchPickerSize, string> = {
|
|
30
|
-
sm: "text-caption2",
|
|
31
|
-
md: "text-caption2",
|
|
32
|
-
lg: "text-caption",
|
|
33
|
-
};
|
|
34
|
-
const fieldsetGaps: Record<SwatchPickerSize, string> = {
|
|
35
|
-
sm: "gap-2",
|
|
36
|
-
md: "gap-3",
|
|
37
|
-
lg: "gap-4",
|
|
38
|
-
};
|
|
39
|
-
const labelGaps: Record<SwatchPickerSize, string> = {
|
|
40
|
-
sm: "gap-1",
|
|
41
|
-
md: "gap-1.5",
|
|
42
|
-
lg: "gap-2",
|
|
43
|
-
};
|
|
44
|
-
|
|
45
|
-
export interface SwatchPickerProps<T extends string> {
|
|
46
|
-
value: T;
|
|
47
|
-
options: ReadonlyArray<SwatchPickerOption<T>>;
|
|
48
|
-
onChange: (value: T) => void;
|
|
49
|
-
/** Accessible name for the group. */
|
|
50
|
-
label: string;
|
|
51
|
-
/** Custom classes for the swatch container. */
|
|
52
|
-
className?: string;
|
|
53
|
-
/** Swatch diameter, check icon and caption scale. @default "md" */
|
|
54
|
-
size?: SwatchPickerSize;
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
/** Colour swatches with a check on the chosen one. */
|
|
58
|
-
export function SwatchPicker<T extends string>({
|
|
59
|
-
value,
|
|
60
|
-
options,
|
|
61
|
-
onChange,
|
|
62
|
-
label,
|
|
63
|
-
className,
|
|
64
|
-
size = "md",
|
|
65
|
-
}: SwatchPickerProps<T>) {
|
|
66
|
-
const name = useId();
|
|
67
|
-
return (
|
|
68
|
-
<fieldset className={cn("flex flex-wrap", fieldsetGaps[size], className)}>
|
|
69
|
-
<legend className="sr-only">{label}</legend>
|
|
70
|
-
{options.map((option) => {
|
|
71
|
-
const selected = option.value === value;
|
|
72
|
-
return (
|
|
73
|
-
<label
|
|
74
|
-
key={option.value}
|
|
75
|
-
className={cn(
|
|
76
|
-
"group flex cursor-pointer flex-col items-center",
|
|
77
|
-
labelGaps[size],
|
|
78
|
-
)}
|
|
79
|
-
>
|
|
80
|
-
<input
|
|
81
|
-
type="radio"
|
|
82
|
-
name={name}
|
|
83
|
-
value={option.value}
|
|
84
|
-
checked={selected}
|
|
85
|
-
onChange={() => {
|
|
86
|
-
haptic("selection");
|
|
87
|
-
onChange(option.value);
|
|
88
|
-
}}
|
|
89
|
-
className="peer sr-only"
|
|
90
|
-
/>
|
|
91
|
-
<span
|
|
92
|
-
className={cn(
|
|
93
|
-
"ring-offset-elevated duration-fast peer-focus-visible:ring-accent flex items-center justify-center rounded-full ring-offset-1 transition-[box-shadow,transform] group-active:scale-95 peer-focus-visible:ring-2",
|
|
94
|
-
swatchSizes[size],
|
|
95
|
-
selected
|
|
96
|
-
? "ring-label/70 ring-[1.5px]"
|
|
97
|
-
: "group-hover:ring-separator ring-0 group-hover:ring-[1.5px]",
|
|
98
|
-
)}
|
|
99
|
-
style={{
|
|
100
|
-
background: option.color,
|
|
101
|
-
}}
|
|
102
|
-
>
|
|
103
|
-
{selected && (
|
|
104
|
-
<motion.span
|
|
105
|
-
initial={{
|
|
106
|
-
scale: 0.4,
|
|
107
|
-
opacity: 0,
|
|
108
|
-
}}
|
|
109
|
-
animate={{
|
|
110
|
-
scale: 1,
|
|
111
|
-
opacity: 1,
|
|
112
|
-
}}
|
|
113
|
-
transition={spring.bouncy}
|
|
114
|
-
>
|
|
115
|
-
<CheckIcon
|
|
116
|
-
size={checkSizes[size]}
|
|
117
|
-
strokeWidth={2.6}
|
|
118
|
-
style={{
|
|
119
|
-
color: option.ink,
|
|
120
|
-
}}
|
|
121
|
-
/>
|
|
122
|
-
</motion.span>
|
|
123
|
-
)}
|
|
124
|
-
</span>
|
|
125
|
-
<span
|
|
126
|
-
className={cn(
|
|
127
|
-
captionText[size],
|
|
128
|
-
selected ? "text-label font-semibold" : "text-label-tertiary",
|
|
129
|
-
)}
|
|
130
|
-
>
|
|
131
|
-
{option.label}
|
|
132
|
-
</span>
|
|
133
|
-
</label>
|
|
134
|
-
);
|
|
135
|
-
})}
|
|
136
|
-
</fieldset>
|
|
137
|
-
);
|
|
138
|
-
}
|
|
@@ -1,182 +0,0 @@
|
|
|
1
|
-
import { motion, useReducedMotion } from "motion/react";
|
|
2
|
-
import { Fragment, type ReactNode, useId } from "react";
|
|
3
|
-
import { useMinimizeOnScroll } from "../../hooks/use-minimize-on-scroll";
|
|
4
|
-
import { SearchIcon } from "../../icons/icons";
|
|
5
|
-
import { cn } from "../../lib/class-names";
|
|
6
|
-
import { spring } from "../../motion/transitions";
|
|
7
|
-
|
|
8
|
-
export interface TabBarTab<Id extends string = string> {
|
|
9
|
-
id: Id;
|
|
10
|
-
label: string;
|
|
11
|
-
icon: ReactNode;
|
|
12
|
-
}
|
|
13
|
-
|
|
14
|
-
/** What a tab's link receives; spread it onto the router's own link. */
|
|
15
|
-
export interface TabBarLinkProps {
|
|
16
|
-
className: string;
|
|
17
|
-
"aria-current": "page" | undefined;
|
|
18
|
-
onClick: () => void;
|
|
19
|
-
children: ReactNode;
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
export type TabBarMinimizeBehavior = "platform" | "scroll" | "never";
|
|
23
|
-
export type TabBarSize = "sm" | "md" | "lg";
|
|
24
|
-
|
|
25
|
-
const tabHeights: Record<TabBarSize, string> = {
|
|
26
|
-
sm: "h-9",
|
|
27
|
-
md: "h-11",
|
|
28
|
-
lg: "h-13",
|
|
29
|
-
};
|
|
30
|
-
const tabMinimizedWidths: Record<TabBarSize, string> = {
|
|
31
|
-
sm: "w-9",
|
|
32
|
-
md: "w-11",
|
|
33
|
-
lg: "w-13",
|
|
34
|
-
};
|
|
35
|
-
const tabText: Record<TabBarSize, string> = {
|
|
36
|
-
sm: "text-caption",
|
|
37
|
-
md: "text-caption2",
|
|
38
|
-
lg: "text-subheadline",
|
|
39
|
-
};
|
|
40
|
-
const searchButtonSizes: Record<TabBarSize, string> = {
|
|
41
|
-
sm: "size-10",
|
|
42
|
-
md: "size-12",
|
|
43
|
-
lg: "size-14",
|
|
44
|
-
};
|
|
45
|
-
const searchIconSizes: Record<TabBarSize, number> = {
|
|
46
|
-
sm: 17,
|
|
47
|
-
md: 19,
|
|
48
|
-
lg: 21,
|
|
49
|
-
};
|
|
50
|
-
|
|
51
|
-
export interface TabBarProps<Tab extends TabBarTab> {
|
|
52
|
-
/** `platform` follows the platform, `scroll` always minimizes, `never` stays expanded. @default "platform" */
|
|
53
|
-
minimizeBehavior?: TabBarMinimizeBehavior;
|
|
54
|
-
tabs: readonly Tab[];
|
|
55
|
-
/** Active tab ID, or null for a destination outside the bar. */
|
|
56
|
-
active: Tab["id"] | null;
|
|
57
|
-
/** Renders your router's link with the supplied appearance and accessibility props. */
|
|
58
|
-
renderLink: (tab: Tab, props: TabBarLinkProps) => ReactNode;
|
|
59
|
-
search?: { label: string; onPress: () => void };
|
|
60
|
-
/** Accessible name for the navigation. */
|
|
61
|
-
label: string;
|
|
62
|
-
/** Tab height, label text, minimized width and search button diameter. @default "md" */
|
|
63
|
-
size?: TabBarSize;
|
|
64
|
-
className?: string;
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
/**
|
|
68
|
-
* The app's main places a thumb's reach away, drawn as iOS 26 draws them: a
|
|
69
|
-
* floating glass capsule of tabs, with Search as its own round button at the
|
|
70
|
-
* trailing end. Scrolling down through content shrinks the capsule to the
|
|
71
|
-
* current tab; scrolling back up, or a tap, restores it. Android shares the
|
|
72
|
-
* glass, but its bar stays full size, as Android's own bars do.
|
|
73
|
-
*
|
|
74
|
-
* Links stay the app's own (`renderLink`), so the bar works with any router.
|
|
75
|
-
*/
|
|
76
|
-
export function TabBar<Tab extends TabBarTab>({
|
|
77
|
-
tabs,
|
|
78
|
-
active,
|
|
79
|
-
renderLink,
|
|
80
|
-
search,
|
|
81
|
-
label,
|
|
82
|
-
className,
|
|
83
|
-
size = "md",
|
|
84
|
-
minimizeBehavior = "platform",
|
|
85
|
-
}: TabBarProps<Tab>) {
|
|
86
|
-
// Scopes the sliding selection to this bar, so two bars on one
|
|
87
|
-
// screen (a docs page, a split view) never trade their highlight.
|
|
88
|
-
const selectionId = `${useId()}-tab-selection`;
|
|
89
|
-
const reducedMotion = useReducedMotion();
|
|
90
|
-
const [scrolledAway, setScrolledAway] = useMinimizeOnScroll();
|
|
91
|
-
// Platform behavior keeps Android expanded; apps can opt into scroll minimization.
|
|
92
|
-
const minimized =
|
|
93
|
-
scrolledAway &&
|
|
94
|
-
active !== null &&
|
|
95
|
-
minimizeBehavior !== "never" &&
|
|
96
|
-
(minimizeBehavior === "scroll" || !onAndroid());
|
|
97
|
-
return (
|
|
98
|
-
<nav
|
|
99
|
-
aria-label={label}
|
|
100
|
-
className={cn(
|
|
101
|
-
"fixed inset-x-4 bottom-[max(14px,env(safe-area-inset-bottom))] z-30 flex items-center gap-3",
|
|
102
|
-
className,
|
|
103
|
-
)}
|
|
104
|
-
>
|
|
105
|
-
<motion.div
|
|
106
|
-
layout={!reducedMotion}
|
|
107
|
-
transition={reducedMotion ? { duration: 0 } : spring.smooth}
|
|
108
|
-
// A tap on the shrunken capsule brings every tab back.
|
|
109
|
-
onClickCapture={(event) => {
|
|
110
|
-
if (!minimized) return;
|
|
111
|
-
event.preventDefault();
|
|
112
|
-
event.stopPropagation();
|
|
113
|
-
setScrolledAway(false);
|
|
114
|
-
}}
|
|
115
|
-
className={cn(
|
|
116
|
-
"glass flex min-w-0 items-center rounded-full p-0.5",
|
|
117
|
-
minimized ? "grow-0" : "grow",
|
|
118
|
-
)}
|
|
119
|
-
>
|
|
120
|
-
{tabs.map((tab) => {
|
|
121
|
-
const current = tab.id === active;
|
|
122
|
-
if (minimized && !current) return null;
|
|
123
|
-
return (
|
|
124
|
-
<Fragment key={tab.id}>
|
|
125
|
-
{renderLink(tab, {
|
|
126
|
-
"aria-current": current ? "page" : undefined,
|
|
127
|
-
// Switching tabs is silent, as on Apple and Android: no haptic.
|
|
128
|
-
onClick: () => {},
|
|
129
|
-
className: cn(
|
|
130
|
-
"duration-fast relative isolate flex min-w-0 flex-col items-center justify-center gap-0.5 rounded-full font-semibold tracking-[0.01em] no-underline transition-[color,transform] active:scale-[0.94]",
|
|
131
|
-
tabHeights[size],
|
|
132
|
-
tabText[size],
|
|
133
|
-
minimized ? tabMinimizedWidths[size] : "flex-1 px-1",
|
|
134
|
-
current ? "text-accent-text" : "text-label-secondary",
|
|
135
|
-
),
|
|
136
|
-
children: (
|
|
137
|
-
<>
|
|
138
|
-
{current && (
|
|
139
|
-
<motion.span
|
|
140
|
-
layoutId={selectionId}
|
|
141
|
-
className="glass-lens absolute inset-0 -z-10 rounded-full"
|
|
142
|
-
transition={
|
|
143
|
-
reducedMotion ? { duration: 0 } : spring.snappy
|
|
144
|
-
}
|
|
145
|
-
/>
|
|
146
|
-
)}
|
|
147
|
-
{tab.icon}
|
|
148
|
-
<span
|
|
149
|
-
className={minimized ? "sr-only" : "max-w-full truncate"}
|
|
150
|
-
>
|
|
151
|
-
{tab.label}
|
|
152
|
-
</span>
|
|
153
|
-
</>
|
|
154
|
-
),
|
|
155
|
-
})}
|
|
156
|
-
</Fragment>
|
|
157
|
-
);
|
|
158
|
-
})}
|
|
159
|
-
</motion.div>
|
|
160
|
-
{search && (
|
|
161
|
-
<button
|
|
162
|
-
type="button"
|
|
163
|
-
aria-label={search.label}
|
|
164
|
-
onClick={search.onPress}
|
|
165
|
-
className={cn(
|
|
166
|
-
"glass text-label duration-fast ms-auto flex shrink-0 items-center justify-center rounded-full transition-transform active:scale-[0.92]",
|
|
167
|
-
searchButtonSizes[size],
|
|
168
|
-
)}
|
|
169
|
-
>
|
|
170
|
-
<SearchIcon size={searchIconSizes[size]} strokeWidth={2} />
|
|
171
|
-
</button>
|
|
172
|
-
)}
|
|
173
|
-
</nav>
|
|
174
|
-
);
|
|
175
|
-
}
|
|
176
|
-
|
|
177
|
-
function onAndroid() {
|
|
178
|
-
return (
|
|
179
|
-
typeof document !== "undefined" &&
|
|
180
|
-
document.documentElement.dataset.os === "android"
|
|
181
|
-
);
|
|
182
|
-
}
|
|
@@ -1,155 +0,0 @@
|
|
|
1
|
-
import { useId, useRef, useState, type ReactNode } from "react";
|
|
2
|
-
import { cn } from "../../lib/class-names";
|
|
3
|
-
|
|
4
|
-
export type TabViewAlign = "start" | "center";
|
|
5
|
-
export type TabViewSize = "sm" | "md" | "lg";
|
|
6
|
-
|
|
7
|
-
const containerGaps: Record<TabViewSize, string> = {
|
|
8
|
-
sm: "gap-4",
|
|
9
|
-
md: "gap-5",
|
|
10
|
-
lg: "gap-6",
|
|
11
|
-
};
|
|
12
|
-
const tablistClasses: Record<TabViewSize, string> = {
|
|
13
|
-
sm: "inline-flex h-7 w-fit max-w-full items-center gap-4 p-[2px]",
|
|
14
|
-
md: "inline-flex h-8 w-fit max-w-full items-center gap-5 p-[3px]",
|
|
15
|
-
lg: "inline-flex h-10 w-fit max-w-full items-center gap-6 p-[4px]",
|
|
16
|
-
};
|
|
17
|
-
const tabText: Record<TabViewSize, string> = {
|
|
18
|
-
sm: "text-footnote",
|
|
19
|
-
md: "text-subheadline",
|
|
20
|
-
lg: "text-body",
|
|
21
|
-
};
|
|
22
|
-
const underlineOffset: Record<TabViewSize, string> = {
|
|
23
|
-
sm: "after:bottom-[-4px] after:h-0.5",
|
|
24
|
-
md: "after:bottom-[-5px] after:h-0.5",
|
|
25
|
-
lg: "after:bottom-[-6px] after:h-1",
|
|
26
|
-
};
|
|
27
|
-
|
|
28
|
-
export interface TabViewProps<Value extends string> {
|
|
29
|
-
/** Available tabs, in keyboard navigation order. */
|
|
30
|
-
options: readonly { value: Value; label: string; disabled?: boolean }[];
|
|
31
|
-
/** Initial selection when value is not controlled. */
|
|
32
|
-
defaultValue: Value;
|
|
33
|
-
/** Controlled selection; omit to keep selection inside TabView. */
|
|
34
|
-
value?: Value;
|
|
35
|
-
onValueChange?: (value: Value) => void;
|
|
36
|
-
/** Tab alignment: `start` or `center`. @default "center" */
|
|
37
|
-
align?: TabViewAlign;
|
|
38
|
-
/** Accessible name for the tab list. */
|
|
39
|
-
label: string;
|
|
40
|
-
/** Renders the selected tab's panel. */
|
|
41
|
-
children: (value: Value) => ReactNode;
|
|
42
|
-
/** Tablist height, tab text scale and underline offset. @default "md" */
|
|
43
|
-
size?: TabViewSize;
|
|
44
|
-
className?: string;
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
/** Content tabs with native buttons, roving focus and automatic keyboard activation. */
|
|
48
|
-
export function TabView<Value extends string>({
|
|
49
|
-
options,
|
|
50
|
-
defaultValue,
|
|
51
|
-
value: controlledValue,
|
|
52
|
-
onValueChange,
|
|
53
|
-
align = "center",
|
|
54
|
-
label,
|
|
55
|
-
children,
|
|
56
|
-
size = "md",
|
|
57
|
-
className,
|
|
58
|
-
}: TabViewProps<Value>) {
|
|
59
|
-
const id = useId();
|
|
60
|
-
const buttons = useRef<(HTMLButtonElement | null)[]>([]);
|
|
61
|
-
const [selected, setSelected] = useState(defaultValue);
|
|
62
|
-
const current = controlledValue ?? selected;
|
|
63
|
-
function select(next: Value) {
|
|
64
|
-
if (controlledValue === undefined) setSelected(next);
|
|
65
|
-
onValueChange?.(next);
|
|
66
|
-
}
|
|
67
|
-
const enabled = options.filter((option) => !option.disabled);
|
|
68
|
-
const value = enabled.some((option) => option.value === current)
|
|
69
|
-
? current
|
|
70
|
-
: enabled[0]?.value;
|
|
71
|
-
if (value === undefined) return null;
|
|
72
|
-
|
|
73
|
-
return (
|
|
74
|
-
<div className={cn("flex w-full flex-col", containerGaps[size], className)}>
|
|
75
|
-
<div
|
|
76
|
-
role="tablist"
|
|
77
|
-
aria-label={label}
|
|
78
|
-
className={cn(
|
|
79
|
-
tablistClasses[size],
|
|
80
|
-
align === "start" ? "self-start" : "mx-auto justify-center",
|
|
81
|
-
)}
|
|
82
|
-
>
|
|
83
|
-
{options.map((option, index) => (
|
|
84
|
-
<button
|
|
85
|
-
key={option.value}
|
|
86
|
-
type="button"
|
|
87
|
-
role="tab"
|
|
88
|
-
id={`${id}-tab-${index}`}
|
|
89
|
-
aria-controls={`${id}-panel-${index}`}
|
|
90
|
-
aria-selected={option.value === value}
|
|
91
|
-
aria-disabled={option.disabled || undefined}
|
|
92
|
-
disabled={option.disabled}
|
|
93
|
-
tabIndex={option.value === value ? 0 : -1}
|
|
94
|
-
ref={(element) => {
|
|
95
|
-
buttons.current[index] = element;
|
|
96
|
-
}}
|
|
97
|
-
onClick={() => select(option.value)}
|
|
98
|
-
onKeyDown={(event) => {
|
|
99
|
-
const rtl =
|
|
100
|
-
getComputedStyle(event.currentTarget).direction === "rtl";
|
|
101
|
-
let next: number;
|
|
102
|
-
let step: number;
|
|
103
|
-
if (event.key === "Home") {
|
|
104
|
-
next = -1;
|
|
105
|
-
step = 1;
|
|
106
|
-
} else if (event.key === "End") {
|
|
107
|
-
next = options.length;
|
|
108
|
-
step = -1;
|
|
109
|
-
} else if (event.key === "ArrowRight") {
|
|
110
|
-
step = rtl ? -1 : 1;
|
|
111
|
-
next = index;
|
|
112
|
-
} else if (event.key === "ArrowLeft") {
|
|
113
|
-
step = rtl ? 1 : -1;
|
|
114
|
-
next = index;
|
|
115
|
-
} else return;
|
|
116
|
-
event.preventDefault();
|
|
117
|
-
for (let offset = 0; offset < options.length; offset++) {
|
|
118
|
-
next = (next + step + options.length) % options.length;
|
|
119
|
-
const option = options[next];
|
|
120
|
-
if (!option || option.disabled) continue;
|
|
121
|
-
select(option.value);
|
|
122
|
-
buttons.current[next]?.focus();
|
|
123
|
-
break;
|
|
124
|
-
}
|
|
125
|
-
}}
|
|
126
|
-
className={cn(
|
|
127
|
-
"relative inline-flex h-[calc(100%-1px)] shrink-0 items-center justify-center border border-transparent p-0 font-medium whitespace-nowrap",
|
|
128
|
-
tabText[size],
|
|
129
|
-
"focus-visible:outline-2 focus-visible:outline-offset-2",
|
|
130
|
-
"after:absolute after:inset-x-0 after:bg-current",
|
|
131
|
-
underlineOffset[size],
|
|
132
|
-
option.value === value
|
|
133
|
-
? "after:opacity-100"
|
|
134
|
-
: "opacity-60 after:opacity-0 hover:opacity-100",
|
|
135
|
-
)}
|
|
136
|
-
>
|
|
137
|
-
{option.label}
|
|
138
|
-
</button>
|
|
139
|
-
))}
|
|
140
|
-
</div>
|
|
141
|
-
{options.map((option, index) => (
|
|
142
|
-
<div
|
|
143
|
-
key={option.value}
|
|
144
|
-
role="tabpanel"
|
|
145
|
-
id={`${id}-panel-${index}`}
|
|
146
|
-
aria-labelledby={`${id}-tab-${index}`}
|
|
147
|
-
hidden={option.value !== value}
|
|
148
|
-
className="w-full outline-offset-4"
|
|
149
|
-
>
|
|
150
|
-
{option.value === value && children(option.value)}
|
|
151
|
-
</div>
|
|
152
|
-
))}
|
|
153
|
-
</div>
|
|
154
|
-
);
|
|
155
|
-
}
|
|
@@ -1,151 +0,0 @@
|
|
|
1
|
-
import { createContext, useContext } from "react";
|
|
2
|
-
import type * as React from "react";
|
|
3
|
-
|
|
4
|
-
import { cn } from "../../lib/class-names";
|
|
5
|
-
|
|
6
|
-
export type TableSize = "sm" | "md" | "lg";
|
|
7
|
-
|
|
8
|
-
const tableText: Record<TableSize, string> = {
|
|
9
|
-
sm: "text-footnote text-label",
|
|
10
|
-
md: "text-subheadline text-label",
|
|
11
|
-
lg: "text-body text-label",
|
|
12
|
-
};
|
|
13
|
-
const headCell: Record<TableSize, string> = {
|
|
14
|
-
sm: "h-8 px-2 text-start align-middle text-caption2 font-semibold whitespace-nowrap",
|
|
15
|
-
md: "h-10 px-3 text-start align-middle text-footnote font-semibold whitespace-nowrap",
|
|
16
|
-
lg: "h-12 px-4 text-start align-middle text-subheadline font-semibold whitespace-nowrap",
|
|
17
|
-
};
|
|
18
|
-
const bodyCell: Record<TableSize, string> = {
|
|
19
|
-
sm: "px-2 py-1.5 align-middle whitespace-nowrap",
|
|
20
|
-
md: "px-3 py-2.5 align-middle whitespace-nowrap",
|
|
21
|
-
lg: "px-4 py-3.5 align-middle whitespace-nowrap",
|
|
22
|
-
};
|
|
23
|
-
const captionText: Record<TableSize, string> = {
|
|
24
|
-
sm: "mt-3 text-caption2 text-label-secondary",
|
|
25
|
-
md: "mt-4 text-footnote text-label-secondary",
|
|
26
|
-
lg: "mt-5 text-subheadline text-label-secondary",
|
|
27
|
-
};
|
|
28
|
-
|
|
29
|
-
const TableSizeContext = createContext<TableSize>("md");
|
|
30
|
-
const useTableSize = () => useContext(TableSizeContext);
|
|
31
|
-
|
|
32
|
-
function Table({
|
|
33
|
-
className,
|
|
34
|
-
size = "md",
|
|
35
|
-
...props
|
|
36
|
-
}: React.ComponentProps<"table"> & {
|
|
37
|
-
/** Row height, cell padding and text scale. @default "md" */ size?: TableSize;
|
|
38
|
-
}) {
|
|
39
|
-
return (
|
|
40
|
-
<div
|
|
41
|
-
data-slot="table-container"
|
|
42
|
-
className="relative w-full overflow-x-auto"
|
|
43
|
-
>
|
|
44
|
-
<TableSizeContext value={size}>
|
|
45
|
-
<table
|
|
46
|
-
data-slot="table"
|
|
47
|
-
className={cn(tableText[size], className)}
|
|
48
|
-
{...props}
|
|
49
|
-
/>
|
|
50
|
-
</TableSizeContext>
|
|
51
|
-
</div>
|
|
52
|
-
);
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
function TableHeader({ className, ...props }: React.ComponentProps<"thead">) {
|
|
56
|
-
return (
|
|
57
|
-
<thead
|
|
58
|
-
data-slot="table-header"
|
|
59
|
-
className={cn("[&_tr]:border-separator [&_tr]:border-b", className)}
|
|
60
|
-
{...props}
|
|
61
|
-
/>
|
|
62
|
-
);
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
function TableBody({ className, ...props }: React.ComponentProps<"tbody">) {
|
|
66
|
-
return (
|
|
67
|
-
<tbody
|
|
68
|
-
data-slot="table-body"
|
|
69
|
-
className={cn("[&_tr:last-child]:border-0", className)}
|
|
70
|
-
{...props}
|
|
71
|
-
/>
|
|
72
|
-
);
|
|
73
|
-
}
|
|
74
|
-
|
|
75
|
-
function TableFooter({ className, ...props }: React.ComponentProps<"tfoot">) {
|
|
76
|
-
return (
|
|
77
|
-
<tfoot
|
|
78
|
-
data-slot="table-footer"
|
|
79
|
-
className={cn(
|
|
80
|
-
"border-separator bg-fill/50 border-t font-semibold [&>tr]:last:border-b-0",
|
|
81
|
-
className,
|
|
82
|
-
)}
|
|
83
|
-
{...props}
|
|
84
|
-
/>
|
|
85
|
-
);
|
|
86
|
-
}
|
|
87
|
-
|
|
88
|
-
function TableRow({ className, ...props }: React.ComponentProps<"tr">) {
|
|
89
|
-
return (
|
|
90
|
-
<tr
|
|
91
|
-
data-slot="table-row"
|
|
92
|
-
className={cn(
|
|
93
|
-
"border-separator duration-fast hover:bg-fill/50 has-aria-expanded:bg-fill/50 border-b transition-colors",
|
|
94
|
-
"data-[state=selected]:bg-accent-soft/60",
|
|
95
|
-
className,
|
|
96
|
-
)}
|
|
97
|
-
{...props}
|
|
98
|
-
/>
|
|
99
|
-
);
|
|
100
|
-
}
|
|
101
|
-
|
|
102
|
-
function TableHead({ className, ...props }: React.ComponentProps<"th">) {
|
|
103
|
-
const size = useTableSize();
|
|
104
|
-
return (
|
|
105
|
-
<th
|
|
106
|
-
data-slot="table-head"
|
|
107
|
-
className={cn(
|
|
108
|
-
headCell[size],
|
|
109
|
-
"text-label-secondary has-[[role=checkbox]]:pe-0",
|
|
110
|
-
className,
|
|
111
|
-
)}
|
|
112
|
-
{...props}
|
|
113
|
-
/>
|
|
114
|
-
);
|
|
115
|
-
}
|
|
116
|
-
|
|
117
|
-
function TableCell({ className, ...props }: React.ComponentProps<"td">) {
|
|
118
|
-
const size = useTableSize();
|
|
119
|
-
return (
|
|
120
|
-
<td
|
|
121
|
-
data-slot="table-cell"
|
|
122
|
-
className={cn(bodyCell[size], "has-[[role=checkbox]]:pe-0", className)}
|
|
123
|
-
{...props}
|
|
124
|
-
/>
|
|
125
|
-
);
|
|
126
|
-
}
|
|
127
|
-
|
|
128
|
-
function TableCaption({
|
|
129
|
-
className,
|
|
130
|
-
...props
|
|
131
|
-
}: React.ComponentProps<"caption">) {
|
|
132
|
-
const size = useTableSize();
|
|
133
|
-
return (
|
|
134
|
-
<caption
|
|
135
|
-
data-slot="table-caption"
|
|
136
|
-
className={cn(captionText[size], className)}
|
|
137
|
-
{...props}
|
|
138
|
-
/>
|
|
139
|
-
);
|
|
140
|
-
}
|
|
141
|
-
|
|
142
|
-
export {
|
|
143
|
-
Table,
|
|
144
|
-
TableBody,
|
|
145
|
-
TableCaption,
|
|
146
|
-
TableCell,
|
|
147
|
-
TableFooter,
|
|
148
|
-
TableHead,
|
|
149
|
-
TableHeader,
|
|
150
|
-
TableRow,
|
|
151
|
-
};
|
|
@@ -1,42 +0,0 @@
|
|
|
1
|
-
import type { ComponentProps } from "react";
|
|
2
|
-
import { cn } from "../../lib/class-names";
|
|
3
|
-
import { fieldSize, type TextFieldSize } from "../text-field/text-field";
|
|
4
|
-
|
|
5
|
-
const minHeights: Record<TextFieldSize, string> = {
|
|
6
|
-
xs: "min-h-24",
|
|
7
|
-
sm: "min-h-24",
|
|
8
|
-
md: "min-h-28",
|
|
9
|
-
lg: "min-h-32",
|
|
10
|
-
};
|
|
11
|
-
|
|
12
|
-
export type TextEditorSize = TextFieldSize;
|
|
13
|
-
|
|
14
|
-
export interface TextEditorProps
|
|
15
|
-
extends Omit<ComponentProps<"textarea">, "size"> {
|
|
16
|
-
/** Field surface scale; matches TextField's xs | sm | md | lg. @default "md" */
|
|
17
|
-
size?: TextEditorSize;
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
/** A multi-line text field that reuses TextField's shared surface treatment. */
|
|
21
|
-
export function TextEditor({
|
|
22
|
-
className,
|
|
23
|
-
size = "md",
|
|
24
|
-
...props
|
|
25
|
-
}: TextEditorProps) {
|
|
26
|
-
const surface = fieldSize(size);
|
|
27
|
-
return (
|
|
28
|
-
<textarea
|
|
29
|
-
{...props}
|
|
30
|
-
className={cn(
|
|
31
|
-
"border-separator bg-elevated text-label placeholder:text-label-tertiary w-full min-w-0 resize-y border",
|
|
32
|
-
"focus-visible:outline-accent-text focus-visible:outline-2 focus-visible:outline-offset-2",
|
|
33
|
-
"aria-invalid:border-danger disabled:cursor-not-allowed disabled:opacity-40",
|
|
34
|
-
surface.radius,
|
|
35
|
-
surface.padding,
|
|
36
|
-
surface.text,
|
|
37
|
-
minHeights[size],
|
|
38
|
-
className,
|
|
39
|
-
)}
|
|
40
|
-
/>
|
|
41
|
-
);
|
|
42
|
-
}
|