@linyao.tw/ui 0.0.0-snapshot.07df57
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/LICENSE +201 -0
- package/README.md +85 -0
- package/dist/components/date-time/calendar.d.ts +20 -0
- package/dist/components/date-time/calendar.js +102 -0
- package/dist/components/date-time/calendar.js.map +1 -0
- package/dist/components/date-time/date-field.d.ts +11 -0
- package/dist/components/date-time/date-field.js +44 -0
- package/dist/components/date-time/date-field.js.map +1 -0
- package/dist/components/date-time/date-picker.d.ts +28 -0
- package/dist/components/date-time/date-picker.js +74 -0
- package/dist/components/date-time/date-picker.js.map +1 -0
- package/dist/components/date-time/date-range-picker.d.ts +11 -0
- package/dist/components/date-time/date-range-picker.js +79 -0
- package/dist/components/date-time/date-range-picker.js.map +1 -0
- package/dist/components/date-time/date-types.d.ts +110 -0
- package/dist/components/date-time/index.d.ts +8 -0
- package/dist/components/date-time/index.js +8 -0
- package/dist/components/date-time/shared.d.ts +25 -0
- package/dist/components/date-time/shared.js +53 -0
- package/dist/components/date-time/shared.js.map +1 -0
- package/dist/components/date-time/time-field.d.ts +13 -0
- package/dist/components/date-time/time-field.js +52 -0
- package/dist/components/date-time/time-field.js.map +1 -0
- package/dist/components/feedback/alert.d.ts +21 -0
- package/dist/components/feedback/alert.js +44 -0
- package/dist/components/feedback/alert.js.map +1 -0
- package/dist/components/feedback/banner.d.ts +8 -0
- package/dist/components/feedback/banner.js +20 -0
- package/dist/components/feedback/banner.js.map +1 -0
- package/dist/components/feedback/empty-state.d.ts +12 -0
- package/dist/components/feedback/empty-state.js +48 -0
- package/dist/components/feedback/empty-state.js.map +1 -0
- package/dist/components/feedback/feedback.module.js +42 -0
- package/dist/components/feedback/feedback.module.js.map +1 -0
- package/dist/components/feedback/feedback.types.d.ts +8 -0
- package/dist/components/feedback/feedback.types.js +24 -0
- package/dist/components/feedback/feedback.types.js.map +1 -0
- package/dist/components/feedback/index.d.ts +9 -0
- package/dist/components/feedback/meter.d.ts +12 -0
- package/dist/components/feedback/meter.js +28 -0
- package/dist/components/feedback/meter.js.map +1 -0
- package/dist/components/feedback/progress.d.ts +12 -0
- package/dist/components/feedback/progress.js +28 -0
- package/dist/components/feedback/progress.js.map +1 -0
- package/dist/components/feedback/skeleton.d.ts +5 -0
- package/dist/components/feedback/skeleton.js +18 -0
- package/dist/components/feedback/skeleton.js.map +1 -0
- package/dist/components/feedback/spinner.d.ts +23 -0
- package/dist/components/feedback/spinner.js +35 -0
- package/dist/components/feedback/spinner.js.map +1 -0
- package/dist/components/feedback/toast.d.ts +33 -0
- package/dist/components/feedback/toast.js +76 -0
- package/dist/components/feedback/toast.js.map +1 -0
- package/dist/components/forms/CodeField.d.ts +23 -0
- package/dist/components/forms/CodeField.js +63 -0
- package/dist/components/forms/CodeField.js.map +1 -0
- package/dist/components/forms/FileUpload.d.ts +34 -0
- package/dist/components/forms/FileUpload.js +319 -0
- package/dist/components/forms/FileUpload.js.map +1 -0
- package/dist/components/forms/Input.d.ts +14 -0
- package/dist/components/forms/Input.js +33 -0
- package/dist/components/forms/Input.js.map +1 -0
- package/dist/components/forms/NumberField.d.ts +15 -0
- package/dist/components/forms/NumberField.js +71 -0
- package/dist/components/forms/NumberField.js.map +1 -0
- package/dist/components/forms/OTPField.d.ts +15 -0
- package/dist/components/forms/OTPField.js +54 -0
- package/dist/components/forms/OTPField.js.map +1 -0
- package/dist/components/forms/TextField.d.ts +61 -0
- package/dist/components/forms/TextField.js +199 -0
- package/dist/components/forms/TextField.js.map +1 -0
- package/dist/components/forms/index.d.ts +7 -0
- package/dist/components/forms/internal.d.ts +33 -0
- package/dist/components/forms/internal.js +61 -0
- package/dist/components/forms/internal.js.map +1 -0
- package/dist/components/foundations/Avatar.d.ts +33 -0
- package/dist/components/foundations/Avatar.js +45 -0
- package/dist/components/foundations/Avatar.js.map +1 -0
- package/dist/components/foundations/Badge.d.ts +15 -0
- package/dist/components/foundations/Badge.js +32 -0
- package/dist/components/foundations/Badge.js.map +1 -0
- package/dist/components/foundations/Button.d.ts +18 -0
- package/dist/components/foundations/Button.js +47 -0
- package/dist/components/foundations/Button.js.map +1 -0
- package/dist/components/foundations/Card.d.ts +47 -0
- package/dist/components/foundations/Card.js +57 -0
- package/dist/components/foundations/Card.js.map +1 -0
- package/dist/components/foundations/IconButton.d.ts +25 -0
- package/dist/components/foundations/IconButton.js +19 -0
- package/dist/components/foundations/IconButton.js.map +1 -0
- package/dist/components/foundations/Link.d.ts +19 -0
- package/dist/components/foundations/Link.js +40 -0
- package/dist/components/foundations/Link.js.map +1 -0
- package/dist/components/foundations/ListCell.d.ts +68 -0
- package/dist/components/foundations/ListCell.js +105 -0
- package/dist/components/foundations/ListCell.js.map +1 -0
- package/dist/components/foundations/SectionHeading.d.ts +17 -0
- package/dist/components/foundations/SectionHeading.js +50 -0
- package/dist/components/foundations/SectionHeading.js.map +1 -0
- package/dist/components/foundations/Separator.d.ts +11 -0
- package/dist/components/foundations/Separator.js +21 -0
- package/dist/components/foundations/Separator.js.map +1 -0
- package/dist/components/foundations/index.d.ts +9 -0
- package/dist/components/foundations/shared.d.ts +5 -0
- package/dist/components/foundations/shared.js +8 -0
- package/dist/components/foundations/shared.js.map +1 -0
- package/dist/components/navigation-data/breadcrumb-pagination.d.ts +34 -0
- package/dist/components/navigation-data/breadcrumb-pagination.js +161 -0
- package/dist/components/navigation-data/breadcrumb-pagination.js.map +1 -0
- package/dist/components/navigation-data/command-palette.d.ts +35 -0
- package/dist/components/navigation-data/command-palette.js +151 -0
- package/dist/components/navigation-data/command-palette.js.map +1 -0
- package/dist/components/navigation-data/header-tab-bar.d.ts +23 -0
- package/dist/components/navigation-data/header-tab-bar.js +102 -0
- package/dist/components/navigation-data/header-tab-bar.js.map +1 -0
- package/dist/components/navigation-data/index.d.ts +7 -0
- package/dist/components/navigation-data/menubar-toolbar.d.ts +26 -0
- package/dist/components/navigation-data/menubar-toolbar.js +161 -0
- package/dist/components/navigation-data/menubar-toolbar.js.map +1 -0
- package/dist/components/navigation-data/navigation-menu.d.ts +14 -0
- package/dist/components/navigation-data/navigation-menu.js +87 -0
- package/dist/components/navigation-data/navigation-menu.js.map +1 -0
- package/dist/components/navigation-data/scroll-area.d.ts +6 -0
- package/dist/components/navigation-data/scroll-area.js +52 -0
- package/dist/components/navigation-data/scroll-area.js.map +1 -0
- package/dist/components/navigation-data/table-collection.d.ts +61 -0
- package/dist/components/navigation-data/table-collection.js +181 -0
- package/dist/components/navigation-data/table-collection.js.map +1 -0
- package/dist/components/navigation-data/utils.d.ts +2 -0
- package/dist/components/navigation-data/utils.js +11 -0
- package/dist/components/navigation-data/utils.js.map +1 -0
- package/dist/components/overlays/class-names.d.ts +6 -0
- package/dist/components/overlays/class-names.js +11 -0
- package/dist/components/overlays/class-names.js.map +1 -0
- package/dist/components/overlays/dialog.d.ts +98 -0
- package/dist/components/overlays/dialog.js +158 -0
- package/dist/components/overlays/dialog.js.map +1 -0
- package/dist/components/overlays/disclosure.d.ts +40 -0
- package/dist/components/overlays/disclosure.js +138 -0
- package/dist/components/overlays/disclosure.js.map +1 -0
- package/dist/components/overlays/drawer.d.ts +88 -0
- package/dist/components/overlays/drawer.js +192 -0
- package/dist/components/overlays/drawer.js.map +1 -0
- package/dist/components/overlays/floating.d.ts +83 -0
- package/dist/components/overlays/floating.js +220 -0
- package/dist/components/overlays/floating.js.map +1 -0
- package/dist/components/overlays/index.d.ts +4 -0
- package/dist/components/selection/classnames.d.ts +4 -0
- package/dist/components/selection/classnames.js +14 -0
- package/dist/components/selection/classnames.js.map +1 -0
- package/dist/components/selection/combobox.d.ts +118 -0
- package/dist/components/selection/combobox.js +284 -0
- package/dist/components/selection/combobox.js.map +1 -0
- package/dist/components/selection/controls.d.ts +65 -0
- package/dist/components/selection/controls.js +171 -0
- package/dist/components/selection/controls.js.map +1 -0
- package/dist/components/selection/index.d.ts +7 -0
- package/dist/components/selection/menu.d.ts +87 -0
- package/dist/components/selection/menu.js +157 -0
- package/dist/components/selection/menu.js.map +1 -0
- package/dist/components/selection/select.d.ts +55 -0
- package/dist/components/selection/select.js +138 -0
- package/dist/components/selection/select.js.map +1 -0
- package/dist/components/selection/selection.module.js +51 -0
- package/dist/components/selection/selection.module.js.map +1 -0
- package/dist/index.d.ts +7 -0
- package/dist/index.js +52 -0
- package/dist/styles.css +2 -0
- package/package.json +74 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"feedback.module.js","names":[],"sources":["../../../src/components/feedback/feedback.module.css"],"sourcesContent":[":is(.feedbackPanel, .rangeRoot, .spinner, .loader, .emptyState, .toastRoot)[data-status=\"neutral\"] {\n\t--feedback-background: var(--status-neutral-background);\n\t--feedback-foreground: var(--status-neutral-foreground);\n\t--feedback-border: var(--status-neutral-border);\n\t--feedback-signal: var(--status-neutral-indicator);\n}\n\n:is(.feedbackPanel, .rangeRoot, .spinner, .loader, .emptyState, .toastRoot)[data-status=\"info\"] {\n\t--feedback-background: var(--status-info-background);\n\t--feedback-foreground: var(--status-info-foreground);\n\t--feedback-border: var(--status-info-border);\n\t--feedback-signal: var(--status-info-border);\n}\n\n:is(.feedbackPanel, .rangeRoot, .spinner, .loader, .emptyState, .toastRoot)[data-status=\"success\"] {\n\t--feedback-background: var(--status-success-background);\n\t--feedback-foreground: var(--status-success-foreground);\n\t--feedback-border: var(--status-success-border);\n\t--feedback-signal: var(--status-success-border);\n}\n\n:is(.feedbackPanel, .rangeRoot, .spinner, .loader, .emptyState, .toastRoot)[data-status=\"warning\"] {\n\t--feedback-background: var(--status-warning-background);\n\t--feedback-foreground: var(--status-warning-foreground);\n\t--feedback-border: var(--status-warning-border);\n\t--feedback-signal: var(--status-warning-border);\n}\n\n:is(.feedbackPanel, .rangeRoot, .spinner, .loader, .emptyState, .toastRoot)[data-status=\"danger\"] {\n\t--feedback-background: var(--status-danger-background);\n\t--feedback-foreground: var(--status-danger-foreground);\n\t--feedback-border: var(--status-danger-border);\n\t--feedback-signal: var(--status-danger-border);\n}\n\n.feedbackPanel {\n\tcolor: var(--feedback-foreground);\n\tbackground: var(--feedback-background);\n\tborder: 0;\n\tborder-radius: var(--radius-md);\n\tfont-family: var(--font-family-sans);\n\tfont-size: var(--font-size-sm);\n\tletter-spacing: var(--letter-spacing-body);\n\tline-height: var(--line-height-body);\n}\n\n.alert {\n\tmin-block-size: var(--control-height-md);\n\tpadding: var(--space-4);\n}\n\n.banner {\n\tinline-size: 100%;\n\tmin-block-size: var(--control-height-md);\n\tpadding: var(--space-4) var(--space-6);\n}\n\n.feedbackContent {\n\tdisplay: grid;\n\tgap: var(--space-1);\n}\n\n.feedbackTitle {\n\tcolor: inherit;\n\tfont-weight: var(--font-weight-semibold);\n\tletter-spacing: var(--letter-spacing-label);\n\tline-height: var(--line-height-heading);\n}\n\n.feedbackDescription {\n\tmax-inline-size: 68ch;\n\tcolor: inherit;\n}\n\n.feedbackActions {\n\tdisplay: flex;\n\tflex-wrap: wrap;\n\tgap: var(--space-2);\n\tmargin-block-start: var(--space-3);\n}\n\n.rangeRoot {\n\tdisplay: grid;\n\tgap: var(--space-2);\n\tinline-size: 100%;\n\tcolor: var(--feedback-foreground);\n\tfont-family: var(--font-family-sans);\n}\n\n.rangeHeader {\n\tdisplay: flex;\n\talign-items: baseline;\n\tjustify-content: space-between;\n\tgap: var(--space-4);\n}\n\n.rangeLabel {\n\tfont-size: var(--font-size-sm);\n\tfont-weight: var(--font-weight-semibold);\n\tletter-spacing: var(--letter-spacing-label);\n\tline-height: var(--line-height-heading);\n}\n\n.rangeValue {\n\tfont-size: var(--font-size-sm);\n\tfont-variant-numeric: tabular-nums lining-nums;\n\tfont-weight: var(--font-weight-medium);\n\tletter-spacing: var(--letter-spacing-label);\n\tline-height: var(--line-height-heading);\n}\n\n.rangeTrack {\n\tposition: relative;\n\toverflow: hidden;\n\tblock-size: var(--space-2);\n\tinline-size: 100%;\n\tbackground: var(--background-inset);\n\tborder-radius: var(--radius-round);\n}\n\n.rangeIndicator {\n\tblock-size: 100%;\n\tbackground: var(--feedback-signal);\n\tborder-radius: inherit;\n\ttransition: width var(--motion-duration-normal) var(--motion-ease-out);\n}\n\n.rangeIndicator[data-indeterminate] {\n\tinline-size: 38%;\n\tanimation: feedback-progress-indeterminate var(--motion-duration-deliberate) var(--motion-ease-in-out) infinite alternate;\n}\n\n.spinner {\n\tdisplay: inline-block;\n\tflex: none;\n\tinline-size: var(--icon-size-md);\n\tblock-size: var(--icon-size-md);\n\tcolor: var(--feedback-signal);\n\tborder: var(--border-width-strong) solid var(--divider-main);\n\tborder-block-start-color: currentColor;\n\tborder-inline-end-color: currentColor;\n\tborder-radius: var(--radius-round);\n\tanimation: feedback-spin var(--motion-duration-deliberate) var(--motion-ease-linear) infinite;\n}\n\n.spinner[data-size=\"sm\"] {\n\tinline-size: var(--icon-size-sm);\n\tblock-size: var(--icon-size-sm);\n}\n\n.spinner[data-size=\"lg\"] {\n\tinline-size: var(--icon-size-lg);\n\tblock-size: var(--icon-size-lg);\n}\n\n.loader {\n\tdisplay: inline-flex;\n\talign-items: center;\n\tgap: var(--space-2);\n\tcolor: var(--feedback-foreground);\n\tfont-family: var(--font-family-sans);\n\tfont-size: var(--font-size-sm);\n\tfont-weight: var(--font-weight-medium);\n\tletter-spacing: var(--letter-spacing-label);\n}\n\n.skeleton {\n\tdisplay: block;\n\tmin-block-size: var(--space-4);\n\tinline-size: 100%;\n\tbackground: linear-gradient(90deg, var(--background-inset), var(--background-secondary), var(--background-inset));\n\tbackground-size: 220% 100%;\n\tanimation: feedback-skeleton var(--motion-duration-deliberate) var(--motion-ease-linear) infinite;\n}\n\n.skeleton[data-shape=\"text\"] {\n\tblock-size: 1em;\n\tborder-radius: var(--radius-xs);\n}\n\n.skeleton[data-shape=\"rectangular\"] {\n\tmin-block-size: var(--control-height-lg);\n\tborder-radius: var(--radius-md);\n}\n\n.skeleton[data-shape=\"circular\"] {\n\tinline-size: var(--control-height-md);\n\tblock-size: var(--control-height-md);\n\tborder-radius: var(--radius-round);\n}\n\n.emptyState {\n\tmin-block-size: 15rem;\n\toverflow: hidden;\n\tcolor: var(--feedback-foreground);\n\tbackground: var(--background-elevated);\n\tborder: 0;\n\tborder-radius: var(--radius-md);\n\tfont-family: var(--font-family-sans);\n}\n\n.emptyStateRail {\n\tdisplay: none;\n}\n\n.emptyStateBody {\n\tdisplay: flex;\n\tflex-direction: column;\n\talign-items: center;\n\tjustify-content: center;\n\tmax-inline-size: 42rem;\n\tmin-block-size: inherit;\n\tmargin-inline: auto;\n\tpadding: var(--space-8);\n\ttext-align: center;\n}\n\n.emptyStateIcon {\n\tdisplay: grid;\n\tplace-items: center;\n\tinline-size: var(--control-height-lg);\n\tblock-size: var(--control-height-lg);\n\tmargin-block-end: var(--space-5);\n\tcolor: var(--feedback-signal);\n\tbackground: var(--feedback-background);\n\tborder-radius: var(--radius-md);\n}\n\n.emptyStateEyebrow {\n\tmargin-block-end: var(--space-2);\n\tcolor: var(--feedback-foreground);\n\tfont-size: var(--font-size-sm);\n\tfont-weight: var(--font-weight-medium);\n\tletter-spacing: var(--letter-spacing-label);\n\tline-height: var(--line-height-heading);\n}\n\n.emptyStateTitle {\n\tcolor: var(--text-title);\n\tfont-size: var(--font-size-xl);\n\tfont-weight: var(--font-weight-semibold);\n\tletter-spacing: var(--letter-spacing-tight);\n\tline-height: var(--line-height-heading);\n}\n\n.emptyStateDescription {\n\tmax-inline-size: 58ch;\n\tmargin-block-start: var(--space-2);\n\tcolor: var(--text-secondary);\n\tfont-size: var(--font-size-sm);\n\tletter-spacing: var(--letter-spacing-body);\n\tline-height: var(--line-height-body);\n}\n\n.emptyStateActions {\n\tdisplay: flex;\n\tflex-wrap: wrap;\n\tjustify-content: center;\n\tgap: var(--space-2);\n\tmargin-block-start: var(--space-6);\n}\n\n.toastViewport {\n\tposition: fixed;\n\tinset-block-end: var(--space-4);\n\tinset-inline-end: var(--space-4);\n\tz-index: var(--z-toast);\n\tdisplay: flex;\n\tflex-direction: column-reverse;\n\tgap: var(--space-2);\n\tinline-size: min(24rem, calc(100vw - var(--space-8)));\n\tmax-block-size: calc(100dvh - var(--space-8));\n}\n\n.toastViewport:focus-visible {\n\toutline: var(--border-width-strong) solid var(--focus-ring);\n\toutline-offset: calc(var(--space-1) * -1);\n}\n\n.toastRoot {\n\t--toast-transform-duration: var(--motion-duration-normal);\n\t--toast-opacity-duration: var(--motion-duration-fast);\n\n\tdisplay: grid;\n\tgrid-template-columns: auto minmax(0, 1fr) auto auto;\n\talign-items: center;\n\tgap: var(--space-3);\n\tinline-size: 100%;\n\tmin-block-size: var(--control-height-lg);\n\tpadding: var(--space-3);\n\tcolor: var(--text-main);\n\tbackground: var(--background-elevated);\n\tborder: 0;\n\tborder-radius: var(--radius-md);\n\tbox-shadow: var(--elevation-2);\n\tfont-family: var(--font-family-sans);\n\ttransform: translate(var(--toast-swipe-movement-x, 0), var(--toast-swipe-movement-y, 0));\n\ttransition:\n\t\ttransform var(--toast-transform-duration) var(--motion-ease-out),\n\t\topacity var(--toast-opacity-duration) var(--motion-ease-out);\n}\n\n.toastRoot[data-status=\"success\"] {\n\t--toast-transform-duration: var(--motion-duration-slow);\n\t--toast-opacity-duration: var(--motion-duration-normal);\n}\n\n.toastRoot[data-status=\"success\"][data-ending-style] {\n\t--toast-transform-duration: var(--motion-duration-normal);\n\t--toast-opacity-duration: var(--motion-duration-fast);\n}\n\n.toastRoot[data-starting-style],\n.toastRoot[data-ending-style] {\n\topacity: 0;\n\ttransform: translate(var(--motion-distance-md), var(--toast-swipe-movement-y, 0));\n}\n\n.toastRoot[data-swiping] {\n\ttransition-duration: var(--motion-duration-instant);\n}\n\n.toastRoot[data-limited] {\n\tdisplay: none;\n}\n\n.toastSignal {\n\talign-self: start;\n\tinline-size: var(--space-2);\n\tblock-size: var(--space-2);\n\tmargin-block-start: 0.4375rem;\n\tbackground: var(--feedback-signal);\n\tborder-radius: var(--radius-round);\n}\n\n.toastContent {\n\tdisplay: grid;\n\tgap: var(--space-1);\n\tmin-inline-size: 0;\n}\n\n.toastTitle {\n\tcolor: var(--text-title);\n\tfont-size: var(--font-size-sm);\n\tfont-weight: var(--font-weight-semibold);\n\tletter-spacing: var(--letter-spacing-label);\n\tline-height: var(--line-height-heading);\n}\n\n.toastDescription {\n\tcolor: var(--text-secondary);\n\tfont-size: var(--font-size-xs);\n\tletter-spacing: var(--letter-spacing-body);\n\tline-height: var(--line-height-body);\n}\n\n.toastAction,\n.toastClose {\n\tmin-inline-size: var(--control-target-min);\n\tmin-block-size: var(--control-target-min);\n\tcolor: var(--text-main);\n\tborder: 0;\n\tfont: inherit;\n\tcursor: pointer;\n\ttransition:\n\t\tbackground-color var(--motion-duration-fast) var(--motion-ease-out),\n\t\ttransform var(--motion-duration-fast) var(--motion-ease-out);\n}\n\n.toastAction {\n\tpadding-inline: var(--space-3);\n\tbackground: var(--control-secondary);\n\tborder-radius: var(--radius-md);\n\tfont-size: var(--font-size-sm);\n\tfont-weight: var(--font-weight-semibold);\n\tletter-spacing: var(--letter-spacing-label);\n}\n\n.toastClose {\n\tdisplay: grid;\n\tplace-items: center;\n\tbackground: var(--background-transparent);\n\tborder-radius: var(--radius-round);\n\tline-height: var(--line-height-tight);\n}\n\n.toastClose > svg {\n\tinline-size: var(--icon-size-sm);\n\tblock-size: var(--icon-size-sm);\n}\n\n.toastAction:hover,\n.toastClose:hover {\n\tbackground: var(--control-secondary-hover);\n}\n\n.toastAction:active,\n.toastClose:active {\n\tbackground: var(--control-secondary-pressed);\n\ttransform: scale(var(--motion-press-scale));\n}\n\n.toastAction:focus-visible,\n.toastClose:focus-visible {\n\toutline: var(--border-width-strong) solid var(--focus-ring);\n\toutline-offset: var(--space-1);\n\tbox-shadow: 0 0 0 var(--space-1) var(--focus-halo);\n}\n\n@keyframes feedback-spin {\n\tto {\n\t\ttransform: rotate(1turn);\n\t}\n}\n\n@keyframes feedback-skeleton {\n\tto {\n\t\tbackground-position: -220% 0;\n\t}\n}\n\n@keyframes feedback-progress-indeterminate {\n\tfrom {\n\t\ttranslate: -100% 0;\n\t}\n\n\tto {\n\t\ttranslate: 265% 0;\n\t}\n}\n\n@media (prefers-reduced-motion: reduce) {\n\t.rangeIndicator[data-indeterminate],\n\t.spinner,\n\t.skeleton {\n\t\tanimation: none;\n\t}\n\n\t.rangeIndicator,\n\t.toastRoot,\n\t.toastAction,\n\t.toastClose {\n\t\ttransition-duration: var(--motion-duration-instant);\n\t}\n\n\t.skeleton {\n\t\tbackground: var(--background-inset);\n\t}\n}\n\n@media (forced-colors: active) {\n\t.feedbackPanel,\n\t.emptyState,\n\t.toastRoot {\n\t\tcolor: CanvasText;\n\t\tbackground: Canvas;\n\t\tborder-color: CanvasText;\n\t\tbox-shadow: none;\n\t}\n\n\t.rangeTrack {\n\t\tbackground: Canvas;\n\t\tborder: var(--border-width-hairline) solid CanvasText;\n\t}\n\n\t.rangeIndicator,\n\t.toastSignal {\n\t\tbackground: Highlight;\n\t}\n\n\t.spinner {\n\t\tcolor: Highlight;\n\t\tborder-color: CanvasText;\n\t\tborder-block-start-color: currentColor;\n\t\tborder-inline-end-color: currentColor;\n\t}\n\n\t.emptyStateIcon,\n\t.toastTitle,\n\t.toastDescription {\n\t\tcolor: inherit;\n\t}\n}\n\n@media (max-width: 36rem) {\n\t.toastViewport {\n\t\tinset-inline: var(--space-3);\n\t\tinline-size: auto;\n\t}\n\n\t.toastRoot {\n\t\tgrid-template-columns: auto minmax(0, 1fr) auto;\n\t}\n\n\t.toastAction {\n\t\tgrid-column: 2;\n\t}\n\n\t.emptyStateBody {\n\t\tpadding: var(--space-6);\n\t}\n}\n"],"mappings":""}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export declare const FEEDBACK_STATUSES: readonly ["neutral", "info", "success", "warning", "danger"];
|
|
2
|
+
export type FeedbackStatus = (typeof FEEDBACK_STATUSES)[number];
|
|
3
|
+
export type FeedbackLiveMode = "off" | "polite" | "assertive";
|
|
4
|
+
export declare function mergeClassNames(...classNames: Array<string | undefined>): string;
|
|
5
|
+
export declare function getLiveRegionProps(live: FeedbackLiveMode): {
|
|
6
|
+
"aria-live"?: "polite" | "assertive";
|
|
7
|
+
role?: "status" | "alert";
|
|
8
|
+
};
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
//#region src/components/feedback/feedback.types.ts
|
|
2
|
+
var e = [
|
|
3
|
+
"neutral",
|
|
4
|
+
"info",
|
|
5
|
+
"success",
|
|
6
|
+
"warning",
|
|
7
|
+
"danger"
|
|
8
|
+
];
|
|
9
|
+
function t(...e) {
|
|
10
|
+
return e.filter(Boolean).join(" ");
|
|
11
|
+
}
|
|
12
|
+
function n(e) {
|
|
13
|
+
return e === "assertive" ? {
|
|
14
|
+
"aria-live": "assertive",
|
|
15
|
+
role: "alert"
|
|
16
|
+
} : e === "polite" ? {
|
|
17
|
+
"aria-live": "polite",
|
|
18
|
+
role: "status"
|
|
19
|
+
} : {};
|
|
20
|
+
}
|
|
21
|
+
//#endregion
|
|
22
|
+
export { e as FEEDBACK_STATUSES, n as getLiveRegionProps, t as mergeClassNames };
|
|
23
|
+
|
|
24
|
+
//# sourceMappingURL=feedback.types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"feedback.types.js","names":[],"sources":["../../../src/components/feedback/feedback.types.ts"],"sourcesContent":["export const FEEDBACK_STATUSES = [\"neutral\", \"info\", \"success\", \"warning\", \"danger\"] as const;\n\nexport type FeedbackStatus = (typeof FEEDBACK_STATUSES)[number];\n\nexport type FeedbackLiveMode = \"off\" | \"polite\" | \"assertive\";\n\nexport function mergeClassNames(...classNames: Array<string | undefined>): string {\n\treturn classNames.filter(Boolean).join(\" \");\n}\n\nexport function getLiveRegionProps(live: FeedbackLiveMode): {\n\t\"aria-live\"?: \"polite\" | \"assertive\";\n\trole?: \"status\" | \"alert\";\n} {\n\tif (live === \"assertive\") {\n\t\treturn { \"aria-live\": \"assertive\", role: \"alert\" };\n\t}\n\n\tif (live === \"polite\") {\n\t\treturn { \"aria-live\": \"polite\", role: \"status\" };\n\t}\n\n\treturn {};\n}\n"],"mappings":";AAAA,IAAa,IAAoB;CAAC;CAAW;CAAQ;CAAW;CAAW;AAAQ;AAMnF,SAAgB,EAAgB,GAAG,GAA+C;CACjF,OAAO,EAAW,OAAO,OAAO,CAAC,CAAC,KAAK,GAAG;AAC3C;AAEA,SAAgB,EAAmB,GAGjC;CASD,OARI,MAAS,cACL;EAAE,aAAa;EAAa,MAAM;CAAQ,IAG9C,MAAS,WACL;EAAE,aAAa;EAAU,MAAM;CAAS,IAGzC,CAAC;AACT"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export * from './alert.js';
|
|
2
|
+
export * from './banner.js';
|
|
3
|
+
export * from './empty-state.js';
|
|
4
|
+
export { FEEDBACK_STATUSES, type FeedbackLiveMode, type FeedbackStatus } from './feedback.types.js';
|
|
5
|
+
export * from './meter.js';
|
|
6
|
+
export * from './progress.js';
|
|
7
|
+
export * from './skeleton.js';
|
|
8
|
+
export * from './spinner.js';
|
|
9
|
+
export * from './toast.js';
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { Meter as BaseMeter } from '@base-ui/react/meter';
|
|
2
|
+
import { ReactNode } from 'react';
|
|
3
|
+
import { FeedbackStatus } from './feedback.types.js';
|
|
4
|
+
export interface MeterProps extends Omit<BaseMeter.Root.Props, "children" | "className"> {
|
|
5
|
+
label: ReactNode;
|
|
6
|
+
className?: string;
|
|
7
|
+
trackClassName?: string;
|
|
8
|
+
indicatorClassName?: string;
|
|
9
|
+
status?: FeedbackStatus;
|
|
10
|
+
showValue?: boolean;
|
|
11
|
+
}
|
|
12
|
+
export declare const Meter: import('react').ForwardRefExoticComponent<Omit<MeterProps, "ref"> & import('react').RefAttributes<HTMLDivElement>>;
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import e from "./feedback.module.js";
|
|
2
|
+
import { mergeClassNames as t } from "./feedback.types.js";
|
|
3
|
+
import { forwardRef as n } from "react";
|
|
4
|
+
import { jsx as r, jsxs as i } from "react/jsx-runtime";
|
|
5
|
+
import { Meter as a } from "@base-ui/react/meter";
|
|
6
|
+
//#region src/components/feedback/meter.tsx
|
|
7
|
+
var o = n(function({ className: n, indicatorClassName: o, label: s, showValue: c = !0, status: l = "neutral", trackClassName: u, ...d }, f) {
|
|
8
|
+
return /* @__PURE__ */ i(a.Root, {
|
|
9
|
+
ref: f,
|
|
10
|
+
className: t(e.rangeRoot, n),
|
|
11
|
+
"data-status": l,
|
|
12
|
+
...d,
|
|
13
|
+
children: [/* @__PURE__ */ i("div", {
|
|
14
|
+
className: e.rangeHeader,
|
|
15
|
+
children: [/* @__PURE__ */ r(a.Label, {
|
|
16
|
+
className: e.rangeLabel,
|
|
17
|
+
children: s
|
|
18
|
+
}), c ? /* @__PURE__ */ r(a.Value, { className: e.rangeValue }) : null]
|
|
19
|
+
}), /* @__PURE__ */ r(a.Track, {
|
|
20
|
+
className: t(e.rangeTrack, u),
|
|
21
|
+
children: /* @__PURE__ */ r(a.Indicator, { className: t(e.rangeIndicator, o) })
|
|
22
|
+
})]
|
|
23
|
+
});
|
|
24
|
+
});
|
|
25
|
+
//#endregion
|
|
26
|
+
export { o as Meter };
|
|
27
|
+
|
|
28
|
+
//# sourceMappingURL=meter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"meter.js","names":[],"sources":["../../../src/components/feedback/meter.tsx"],"sourcesContent":["import { Meter as BaseMeter } from \"@base-ui/react/meter\";\nimport { forwardRef, type ReactNode } from \"react\";\n\nimport styles from \"./feedback.module.css\";\nimport { mergeClassNames, type FeedbackStatus } from \"./feedback.types\";\n\nexport interface MeterProps extends Omit<BaseMeter.Root.Props, \"children\" | \"className\"> {\n\tlabel: ReactNode;\n\tclassName?: string;\n\ttrackClassName?: string;\n\tindicatorClassName?: string;\n\tstatus?: FeedbackStatus;\n\tshowValue?: boolean;\n}\n\nexport const Meter = forwardRef<HTMLDivElement, MeterProps>(function Meter({ className, indicatorClassName, label, showValue = true, status = \"neutral\", trackClassName, ...props }, ref) {\n\treturn (\n\t\t<BaseMeter.Root ref={ref} className={mergeClassNames(styles.rangeRoot, className)} data-status={status} {...props}>\n\t\t\t<div className={styles.rangeHeader}>\n\t\t\t\t<BaseMeter.Label className={styles.rangeLabel}>{label}</BaseMeter.Label>\n\t\t\t\t{showValue ? <BaseMeter.Value className={styles.rangeValue} /> : null}\n\t\t\t</div>\n\t\t\t<BaseMeter.Track className={mergeClassNames(styles.rangeTrack, trackClassName)}>\n\t\t\t\t<BaseMeter.Indicator className={mergeClassNames(styles.rangeIndicator, indicatorClassName)} />\n\t\t\t</BaseMeter.Track>\n\t\t</BaseMeter.Root>\n\t);\n});\n"],"mappings":";;;;;;AAeA,IAAa,IAAQ,EAAuC,SAAe,EAAE,cAAW,uBAAoB,UAAO,eAAY,IAAM,YAAS,WAAW,mBAAgB,GAAG,KAAS,GAAK;CACzL,OACC,kBAAC,EAAU,MAAX;EAAqB;EAAK,WAAW,EAAgB,EAAO,WAAW,CAAS;EAAG,eAAa;EAAQ,GAAI;EAA5G,UAAA,CACC,kBAAC,OAAD;GAAK,WAAW,EAAO;GAAvB,UAAA,CACC,kBAAC,EAAU,OAAX;IAAiB,WAAW,EAAO;IAAa,UAAA;GAAuB,CAAA,GACtE,IAAY,kBAAC,EAAU,OAAX,EAAiB,WAAW,EAAO,WAAa,CAAA,IAAI,IAC7D;EACL,CAAA,GAAA,kBAAC,EAAU,OAAX;GAAiB,WAAW,EAAgB,EAAO,YAAY,CAAc;GAC5E,UAAA,kBAAC,EAAU,WAAX,EAAqB,WAAW,EAAgB,EAAO,gBAAgB,CAAkB,EAAI,CAAA;EAC7E,CAAA,CACF;;AAElB,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { Progress as BaseProgress } from '@base-ui/react/progress';
|
|
2
|
+
import { ReactNode } from 'react';
|
|
3
|
+
import { FeedbackStatus } from './feedback.types.js';
|
|
4
|
+
export interface ProgressProps extends Omit<BaseProgress.Root.Props, "children" | "className"> {
|
|
5
|
+
label: ReactNode;
|
|
6
|
+
className?: string;
|
|
7
|
+
trackClassName?: string;
|
|
8
|
+
indicatorClassName?: string;
|
|
9
|
+
status?: FeedbackStatus;
|
|
10
|
+
showValue?: boolean;
|
|
11
|
+
}
|
|
12
|
+
export declare const Progress: import('react').ForwardRefExoticComponent<Omit<ProgressProps, "ref"> & import('react').RefAttributes<HTMLDivElement>>;
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import e from "./feedback.module.js";
|
|
2
|
+
import { mergeClassNames as t } from "./feedback.types.js";
|
|
3
|
+
import { forwardRef as n } from "react";
|
|
4
|
+
import { jsx as r, jsxs as i } from "react/jsx-runtime";
|
|
5
|
+
import { Progress as a } from "@base-ui/react/progress";
|
|
6
|
+
//#region src/components/feedback/progress.tsx
|
|
7
|
+
var o = n(function({ className: n, indicatorClassName: o, label: s, showValue: c = !0, status: l = "neutral", trackClassName: u, ...d }, f) {
|
|
8
|
+
return /* @__PURE__ */ i(a.Root, {
|
|
9
|
+
ref: f,
|
|
10
|
+
className: t(e.rangeRoot, n),
|
|
11
|
+
"data-status": l,
|
|
12
|
+
...d,
|
|
13
|
+
children: [/* @__PURE__ */ i("div", {
|
|
14
|
+
className: e.rangeHeader,
|
|
15
|
+
children: [/* @__PURE__ */ r(a.Label, {
|
|
16
|
+
className: e.rangeLabel,
|
|
17
|
+
children: s
|
|
18
|
+
}), c ? /* @__PURE__ */ r(a.Value, { className: e.rangeValue }) : null]
|
|
19
|
+
}), /* @__PURE__ */ r(a.Track, {
|
|
20
|
+
className: t(e.rangeTrack, u),
|
|
21
|
+
children: /* @__PURE__ */ r(a.Indicator, { className: t(e.rangeIndicator, o) })
|
|
22
|
+
})]
|
|
23
|
+
});
|
|
24
|
+
});
|
|
25
|
+
//#endregion
|
|
26
|
+
export { o as Progress };
|
|
27
|
+
|
|
28
|
+
//# sourceMappingURL=progress.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"progress.js","names":[],"sources":["../../../src/components/feedback/progress.tsx"],"sourcesContent":["import { Progress as BaseProgress } from \"@base-ui/react/progress\";\nimport { forwardRef, type ReactNode } from \"react\";\n\nimport styles from \"./feedback.module.css\";\nimport { mergeClassNames, type FeedbackStatus } from \"./feedback.types\";\n\nexport interface ProgressProps extends Omit<BaseProgress.Root.Props, \"children\" | \"className\"> {\n\tlabel: ReactNode;\n\tclassName?: string;\n\ttrackClassName?: string;\n\tindicatorClassName?: string;\n\tstatus?: FeedbackStatus;\n\tshowValue?: boolean;\n}\n\nexport const Progress = forwardRef<HTMLDivElement, ProgressProps>(function Progress({ className, indicatorClassName, label, showValue = true, status = \"neutral\", trackClassName, ...props }, ref) {\n\treturn (\n\t\t<BaseProgress.Root ref={ref} className={mergeClassNames(styles.rangeRoot, className)} data-status={status} {...props}>\n\t\t\t<div className={styles.rangeHeader}>\n\t\t\t\t<BaseProgress.Label className={styles.rangeLabel}>{label}</BaseProgress.Label>\n\t\t\t\t{showValue ? <BaseProgress.Value className={styles.rangeValue} /> : null}\n\t\t\t</div>\n\t\t\t<BaseProgress.Track className={mergeClassNames(styles.rangeTrack, trackClassName)}>\n\t\t\t\t<BaseProgress.Indicator className={mergeClassNames(styles.rangeIndicator, indicatorClassName)} />\n\t\t\t</BaseProgress.Track>\n\t\t</BaseProgress.Root>\n\t);\n});\n"],"mappings":";;;;;;AAeA,IAAa,IAAW,EAA0C,SAAkB,EAAE,cAAW,uBAAoB,UAAO,eAAY,IAAM,YAAS,WAAW,mBAAgB,GAAG,KAAS,GAAK;CAClM,OACC,kBAAC,EAAa,MAAd;EAAwB;EAAK,WAAW,EAAgB,EAAO,WAAW,CAAS;EAAG,eAAa;EAAQ,GAAI;EAA/G,UAAA,CACC,kBAAC,OAAD;GAAK,WAAW,EAAO;GAAvB,UAAA,CACC,kBAAC,EAAa,OAAd;IAAoB,WAAW,EAAO;IAAa,UAAA;GAA0B,CAAA,GAC5E,IAAY,kBAAC,EAAa,OAAd,EAAoB,WAAW,EAAO,WAAa,CAAA,IAAI,IAChE;EACL,CAAA,GAAA,kBAAC,EAAa,OAAd;GAAoB,WAAW,EAAgB,EAAO,YAAY,CAAc;GAC/E,UAAA,kBAAC,EAAa,WAAd,EAAwB,WAAW,EAAgB,EAAO,gBAAgB,CAAkB,EAAI,CAAA;EAC7E,CAAA,CACF;;AAErB,CAAC"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { HTMLAttributes } from 'react';
|
|
2
|
+
export interface SkeletonProps extends Omit<HTMLAttributes<HTMLSpanElement>, "aria-hidden" | "children"> {
|
|
3
|
+
shape?: "text" | "rectangular" | "circular";
|
|
4
|
+
}
|
|
5
|
+
export declare const Skeleton: import('react').ForwardRefExoticComponent<SkeletonProps & import('react').RefAttributes<HTMLSpanElement>>;
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import e from "./feedback.module.js";
|
|
2
|
+
import { mergeClassNames as t } from "./feedback.types.js";
|
|
3
|
+
import { forwardRef as n } from "react";
|
|
4
|
+
import { jsx as r } from "react/jsx-runtime";
|
|
5
|
+
//#region src/components/feedback/skeleton.tsx
|
|
6
|
+
var i = n(function({ className: n, shape: i = "text", ...a }, o) {
|
|
7
|
+
return /* @__PURE__ */ r("span", {
|
|
8
|
+
ref: o,
|
|
9
|
+
"aria-hidden": "true",
|
|
10
|
+
className: t(e.skeleton, n),
|
|
11
|
+
"data-shape": i,
|
|
12
|
+
...a
|
|
13
|
+
});
|
|
14
|
+
});
|
|
15
|
+
//#endregion
|
|
16
|
+
export { i as Skeleton };
|
|
17
|
+
|
|
18
|
+
//# sourceMappingURL=skeleton.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skeleton.js","names":[],"sources":["../../../src/components/feedback/skeleton.tsx"],"sourcesContent":["import { forwardRef, type HTMLAttributes } from \"react\";\n\nimport styles from \"./feedback.module.css\";\nimport { mergeClassNames } from \"./feedback.types\";\n\nexport interface SkeletonProps extends Omit<HTMLAttributes<HTMLSpanElement>, \"aria-hidden\" | \"children\"> {\n\tshape?: \"text\" | \"rectangular\" | \"circular\";\n}\n\nexport const Skeleton = forwardRef<HTMLSpanElement, SkeletonProps>(function Skeleton({ className, shape = \"text\", ...props }, ref) {\n\treturn <span ref={ref} aria-hidden=\"true\" className={mergeClassNames(styles.skeleton, className)} data-shape={shape} {...props} />;\n});\n"],"mappings":";;;;;AASA,IAAa,IAAW,EAA2C,SAAkB,EAAE,cAAW,WAAQ,QAAQ,GAAG,KAAS,GAAK;CAClI,OAAO,kBAAC,QAAD;EAAW;EAAK,eAAY;EAAO,WAAW,EAAgB,EAAO,UAAU,CAAS;EAAG,cAAY;EAAO,GAAI;CAAQ,CAAA;AAClI,CAAC"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { HTMLAttributes, ReactNode } from 'react';
|
|
2
|
+
import { FeedbackStatus } from './feedback.types.js';
|
|
3
|
+
type SpinnerAccessibilityProps = {
|
|
4
|
+
/** 附近已有載入說明文字時,對輔助科技隱藏 Spinner。 */
|
|
5
|
+
decorative: true;
|
|
6
|
+
label?: never;
|
|
7
|
+
} | {
|
|
8
|
+
decorative?: false;
|
|
9
|
+
/** 由狀態區域播報的無障礙名稱。 */
|
|
10
|
+
label: string;
|
|
11
|
+
};
|
|
12
|
+
export type SpinnerProps = Omit<HTMLAttributes<HTMLSpanElement>, "aria-hidden" | "aria-label" | "children" | "role"> & SpinnerAccessibilityProps & {
|
|
13
|
+
size?: "sm" | "md" | "lg";
|
|
14
|
+
status?: FeedbackStatus;
|
|
15
|
+
};
|
|
16
|
+
export declare const Spinner: import('react').ForwardRefExoticComponent<SpinnerProps & import('react').RefAttributes<HTMLSpanElement>>;
|
|
17
|
+
export interface LoaderProps extends Omit<HTMLAttributes<HTMLDivElement>, "children"> {
|
|
18
|
+
label: ReactNode;
|
|
19
|
+
size?: "sm" | "md" | "lg";
|
|
20
|
+
status?: FeedbackStatus;
|
|
21
|
+
}
|
|
22
|
+
export declare const Loader: import('react').ForwardRefExoticComponent<LoaderProps & import('react').RefAttributes<HTMLDivElement>>;
|
|
23
|
+
export {};
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import e from "./feedback.module.js";
|
|
2
|
+
import { mergeClassNames as t } from "./feedback.types.js";
|
|
3
|
+
import { forwardRef as n } from "react";
|
|
4
|
+
import { jsx as r, jsxs as i } from "react/jsx-runtime";
|
|
5
|
+
//#region src/components/feedback/spinner.tsx
|
|
6
|
+
var a = n(function({ className: n, decorative: i = !1, label: a, size: o = "md", status: s = "neutral", ...c }, l) {
|
|
7
|
+
return /* @__PURE__ */ r("span", {
|
|
8
|
+
ref: l,
|
|
9
|
+
"aria-hidden": i ? "true" : void 0,
|
|
10
|
+
"aria-label": i ? void 0 : a,
|
|
11
|
+
className: t(e.spinner, n),
|
|
12
|
+
"data-size": o,
|
|
13
|
+
"data-status": s,
|
|
14
|
+
role: i ? void 0 : "status",
|
|
15
|
+
...c
|
|
16
|
+
});
|
|
17
|
+
}), o = n(function({ className: n, label: o, size: s = "md", status: c = "neutral", ...l }, u) {
|
|
18
|
+
return /* @__PURE__ */ i("div", {
|
|
19
|
+
ref: u,
|
|
20
|
+
"aria-live": "polite",
|
|
21
|
+
className: t(e.loader, n),
|
|
22
|
+
"data-status": c,
|
|
23
|
+
role: "status",
|
|
24
|
+
...l,
|
|
25
|
+
children: [/* @__PURE__ */ r(a, {
|
|
26
|
+
decorative: !0,
|
|
27
|
+
size: s,
|
|
28
|
+
status: c
|
|
29
|
+
}), /* @__PURE__ */ r("span", { children: o })]
|
|
30
|
+
});
|
|
31
|
+
});
|
|
32
|
+
//#endregion
|
|
33
|
+
export { o as Loader, a as Spinner };
|
|
34
|
+
|
|
35
|
+
//# sourceMappingURL=spinner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"spinner.js","names":[],"sources":["../../../src/components/feedback/spinner.tsx"],"sourcesContent":["import { forwardRef, type HTMLAttributes, type ReactNode } from \"react\";\n\nimport styles from \"./feedback.module.css\";\nimport { mergeClassNames, type FeedbackStatus } from \"./feedback.types\";\n\ntype SpinnerAccessibilityProps =\n\t| {\n\t\t\t/** 附近已有載入說明文字時,對輔助科技隱藏 Spinner。 */\n\t\t\tdecorative: true;\n\t\t\tlabel?: never;\n\t }\n\t| {\n\t\t\tdecorative?: false;\n\t\t\t/** 由狀態區域播報的無障礙名稱。 */\n\t\t\tlabel: string;\n\t };\n\nexport type SpinnerProps = Omit<HTMLAttributes<HTMLSpanElement>, \"aria-hidden\" | \"aria-label\" | \"children\" | \"role\"> &\n\tSpinnerAccessibilityProps & {\n\t\tsize?: \"sm\" | \"md\" | \"lg\";\n\t\tstatus?: FeedbackStatus;\n\t};\n\nexport const Spinner = forwardRef<HTMLSpanElement, SpinnerProps>(function Spinner({ className, decorative = false, label, size = \"md\", status = \"neutral\", ...props }, ref) {\n\treturn (\n\t\t<span\n\t\t\tref={ref}\n\t\t\taria-hidden={decorative ? \"true\" : undefined}\n\t\t\taria-label={decorative ? undefined : label}\n\t\t\tclassName={mergeClassNames(styles.spinner, className)}\n\t\t\tdata-size={size}\n\t\t\tdata-status={status}\n\t\t\trole={decorative ? undefined : \"status\"}\n\t\t\t{...props}\n\t\t/>\n\t);\n});\n\nexport interface LoaderProps extends Omit<HTMLAttributes<HTMLDivElement>, \"children\"> {\n\tlabel: ReactNode;\n\tsize?: \"sm\" | \"md\" | \"lg\";\n\tstatus?: FeedbackStatus;\n}\n\nexport const Loader = forwardRef<HTMLDivElement, LoaderProps>(function Loader({ className, label, size = \"md\", status = \"neutral\", ...props }, ref) {\n\treturn (\n\t\t<div ref={ref} aria-live=\"polite\" className={mergeClassNames(styles.loader, className)} data-status={status} role=\"status\" {...props}>\n\t\t\t<Spinner decorative size={size} status={status} />\n\t\t\t<span>{label}</span>\n\t\t</div>\n\t);\n});\n"],"mappings":";;;;;AAuBA,IAAa,IAAU,EAA0C,SAAiB,EAAE,cAAW,gBAAa,IAAO,UAAO,UAAO,MAAM,YAAS,WAAW,GAAG,KAAS,GAAK;CAC3K,OACC,kBAAC,QAAD;EACM;EACL,eAAa,IAAa,SAAS,KAAA;EACnC,cAAY,IAAa,KAAA,IAAY;EACrC,WAAW,EAAgB,EAAO,SAAS,CAAS;EACpD,aAAW;EACX,eAAa;EACb,MAAM,IAAa,KAAA,IAAY;EAC/B,GAAI;CACJ,CAAA;AAEH,CAAC,GAQY,IAAS,EAAwC,SAAgB,EAAE,cAAW,UAAO,UAAO,MAAM,YAAS,WAAW,GAAG,KAAS,GAAK;CACnJ,OACC,kBAAC,OAAD;EAAU;EAAK,aAAU;EAAS,WAAW,EAAgB,EAAO,QAAQ,CAAS;EAAG,eAAa;EAAQ,MAAK;EAAS,GAAI;EAA/H,UAAA,CACC,kBAAC,GAAD;GAAS,YAAA;GAAiB;GAAc;EAAS,CAAA,GACjD,kBAAC,QAAD,EAAA,UAAO,EAAY,CAAA,CACf;;AAEP,CAAC"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { Toast as BaseToast } from '@base-ui/react/toast';
|
|
2
|
+
import { ComponentPropsWithoutRef, ReactElement, ReactNode, RefAttributes } from 'react';
|
|
3
|
+
import { FeedbackStatus } from './feedback.types.js';
|
|
4
|
+
export interface ToastData extends Record<string, unknown> {
|
|
5
|
+
status?: FeedbackStatus;
|
|
6
|
+
}
|
|
7
|
+
export type ToastObject<Data extends object = ToastData> = BaseToast.Root.ToastObject<Data>;
|
|
8
|
+
export type ToastManager<Data extends object = ToastData> = ReturnType<typeof BaseToast.createToastManager<Data>>;
|
|
9
|
+
export declare function createToastManager<Data extends object = ToastData>(): ToastManager<Data>;
|
|
10
|
+
export declare function useToastManager<Data extends object = ToastData>(): import('@base-ui/react').UseToastManagerReturnValue<Data>;
|
|
11
|
+
export interface ToastRootProps<Data extends object = ToastData> extends Omit<BaseToast.Root.Props, "className" | "toast"> {
|
|
12
|
+
className?: string;
|
|
13
|
+
closeLabel?: string;
|
|
14
|
+
toast: ToastObject<Data>;
|
|
15
|
+
}
|
|
16
|
+
type ToastRootComponent = <Data extends object = ToastData>(props: ToastRootProps<Data> & RefAttributes<HTMLDivElement>) => ReactElement;
|
|
17
|
+
export declare const ToastRoot: ToastRootComponent;
|
|
18
|
+
export interface ToastViewportProps<Data extends object = ToastData> extends Omit<ComponentPropsWithoutRef<typeof BaseToast.Viewport>, "children" | "className"> {
|
|
19
|
+
className?: string;
|
|
20
|
+
closeLabel?: string;
|
|
21
|
+
renderToast?: (toast: ToastObject<Data>) => ReactNode;
|
|
22
|
+
}
|
|
23
|
+
type ToastViewportComponent = <Data extends object = ToastData>(props: ToastViewportProps<Data> & RefAttributes<HTMLDivElement>) => ReactElement;
|
|
24
|
+
export declare const ToastViewport: ToastViewportComponent;
|
|
25
|
+
export interface ToastProviderProps<Data extends object = ToastData> extends Omit<BaseToast.Provider.Props, "toastManager"> {
|
|
26
|
+
closeLabel?: string;
|
|
27
|
+
renderToast?: ToastViewportProps<Data>["renderToast"];
|
|
28
|
+
toastManager?: ToastManager<Data>;
|
|
29
|
+
viewport?: boolean;
|
|
30
|
+
viewportProps?: Omit<ToastViewportProps<Data>, "closeLabel" | "renderToast">;
|
|
31
|
+
}
|
|
32
|
+
export declare function ToastProvider<Data extends object = ToastData>({ children, closeLabel, renderToast, viewport, viewportProps, ...props }: ToastProviderProps<Data>): import("react").JSX.Element;
|
|
33
|
+
export {};
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
import e from "./feedback.module.js";
|
|
2
|
+
import { FEEDBACK_STATUSES as t, mergeClassNames as n } from "./feedback.types.js";
|
|
3
|
+
import { Fragment as r, createElement as i, forwardRef as a } from "react";
|
|
4
|
+
import { jsx as o, jsxs as s } from "react/jsx-runtime";
|
|
5
|
+
import { Toast as c } from "@base-ui/react/toast";
|
|
6
|
+
import { XIcon as l } from "@phosphor-icons/react/dist/csr/X";
|
|
7
|
+
//#region src/components/feedback/toast.tsx
|
|
8
|
+
var u = new Set(t);
|
|
9
|
+
function d() {
|
|
10
|
+
return c.createToastManager();
|
|
11
|
+
}
|
|
12
|
+
function f() {
|
|
13
|
+
return c.useToastManager();
|
|
14
|
+
}
|
|
15
|
+
function p(e) {
|
|
16
|
+
let t = e.data?.status;
|
|
17
|
+
return typeof t == "string" && u.has(t) ? t : e.type && u.has(e.type) ? e.type : "neutral";
|
|
18
|
+
}
|
|
19
|
+
var m = a(function({ className: t, closeLabel: r = "關閉通知", toast: i, ...a }, u) {
|
|
20
|
+
let d = i.actionProps, f = d?.className, m = p(i);
|
|
21
|
+
return /* @__PURE__ */ s(c.Root, {
|
|
22
|
+
ref: u,
|
|
23
|
+
className: n(e.toastRoot, t),
|
|
24
|
+
"data-status": m,
|
|
25
|
+
toast: i,
|
|
26
|
+
...a,
|
|
27
|
+
children: [
|
|
28
|
+
/* @__PURE__ */ o("span", {
|
|
29
|
+
"aria-hidden": "true",
|
|
30
|
+
className: e.toastSignal
|
|
31
|
+
}),
|
|
32
|
+
/* @__PURE__ */ s(c.Content, {
|
|
33
|
+
className: e.toastContent,
|
|
34
|
+
children: [i.title ? /* @__PURE__ */ o(c.Title, { className: e.toastTitle }) : null, i.description ? /* @__PURE__ */ o(c.Description, { className: e.toastDescription }) : null]
|
|
35
|
+
}),
|
|
36
|
+
d ? /* @__PURE__ */ o(c.Action, {
|
|
37
|
+
...d,
|
|
38
|
+
className: n(e.toastAction, f)
|
|
39
|
+
}) : null,
|
|
40
|
+
/* @__PURE__ */ o(c.Close, {
|
|
41
|
+
"aria-label": r,
|
|
42
|
+
className: e.toastClose,
|
|
43
|
+
children: /* @__PURE__ */ o(l, {
|
|
44
|
+
"aria-hidden": "true",
|
|
45
|
+
weight: "bold"
|
|
46
|
+
})
|
|
47
|
+
})
|
|
48
|
+
]
|
|
49
|
+
});
|
|
50
|
+
}), h = a(function({ className: t, closeLabel: a, renderToast: s, ...l }, u) {
|
|
51
|
+
let d = c.useToastManager();
|
|
52
|
+
return /* @__PURE__ */ o(c.Portal, { children: /* @__PURE__ */ o(c.Viewport, {
|
|
53
|
+
ref: u,
|
|
54
|
+
className: n(e.toastViewport, t),
|
|
55
|
+
...l,
|
|
56
|
+
children: d.toasts.map((e) => s ? /* @__PURE__ */ o(r, { children: s(e) }, e.id) : /* @__PURE__ */ i(m, {
|
|
57
|
+
...a === void 0 ? {} : { closeLabel: a },
|
|
58
|
+
key: e.id,
|
|
59
|
+
toast: e
|
|
60
|
+
}))
|
|
61
|
+
}) });
|
|
62
|
+
});
|
|
63
|
+
function g({ children: e, closeLabel: t, renderToast: n, viewport: r = !0, viewportProps: i, ...a }) {
|
|
64
|
+
return /* @__PURE__ */ s(c.Provider, {
|
|
65
|
+
...a,
|
|
66
|
+
children: [e, r ? /* @__PURE__ */ o(h, {
|
|
67
|
+
...i,
|
|
68
|
+
...t === void 0 ? {} : { closeLabel: t },
|
|
69
|
+
...n === void 0 ? {} : { renderToast: n }
|
|
70
|
+
}) : null]
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
//#endregion
|
|
74
|
+
export { g as ToastProvider, m as ToastRoot, h as ToastViewport, d as createToastManager, f as useToastManager };
|
|
75
|
+
|
|
76
|
+
//# sourceMappingURL=toast.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"toast.js","names":[],"sources":["../../../src/components/feedback/toast.tsx"],"sourcesContent":["import { Toast as BaseToast } from \"@base-ui/react/toast\";\nimport { XIcon } from \"@phosphor-icons/react/dist/csr/X\";\nimport { Fragment, forwardRef, type ComponentPropsWithoutRef, type ForwardedRef, type ReactElement, type ReactNode, type RefAttributes } from \"react\";\n\nimport styles from \"./feedback.module.css\";\nimport { FEEDBACK_STATUSES, mergeClassNames, type FeedbackStatus } from \"./feedback.types\";\n\nconst feedbackStatusSet: ReadonlySet<string> = new Set(FEEDBACK_STATUSES);\n\nexport interface ToastData extends Record<string, unknown> {\n\tstatus?: FeedbackStatus;\n}\n\nexport type ToastObject<Data extends object = ToastData> = BaseToast.Root.ToastObject<Data>;\nexport type ToastManager<Data extends object = ToastData> = ReturnType<typeof BaseToast.createToastManager<Data>>;\n\nexport function createToastManager<Data extends object = ToastData>(): ToastManager<Data> {\n\treturn BaseToast.createToastManager<Data>();\n}\n\nexport function useToastManager<Data extends object = ToastData>() {\n\treturn BaseToast.useToastManager<Data>();\n}\n\nfunction getToastStatus<Data extends object>(toast: ToastObject<Data>): FeedbackStatus {\n\tconst status = (toast.data as { status?: unknown } | undefined)?.status;\n\tif (typeof status === \"string\" && feedbackStatusSet.has(status)) {\n\t\treturn status as FeedbackStatus;\n\t}\n\n\tif (toast.type && feedbackStatusSet.has(toast.type)) {\n\t\treturn toast.type as FeedbackStatus;\n\t}\n\n\treturn \"neutral\";\n}\n\nexport interface ToastRootProps<Data extends object = ToastData> extends Omit<BaseToast.Root.Props, \"className\" | \"toast\"> {\n\tclassName?: string;\n\tcloseLabel?: string;\n\ttoast: ToastObject<Data>;\n}\n\ntype ToastRootComponent = <Data extends object = ToastData>(props: ToastRootProps<Data> & RefAttributes<HTMLDivElement>) => ReactElement;\n\nexport const ToastRoot = forwardRef(function ToastRoot<Data extends object = ToastData>(\n\t{ className, closeLabel = \"關閉通知\", toast, ...props }: ToastRootProps<Data>,\n\tref: ForwardedRef<HTMLDivElement>\n) {\n\tconst actionProps = toast.actionProps;\n\tconst actionClassName = actionProps?.className;\n\tconst status = getToastStatus(toast);\n\n\treturn (\n\t\t<BaseToast.Root ref={ref} className={mergeClassNames(styles.toastRoot, className)} data-status={status} toast={toast} {...props}>\n\t\t\t<span aria-hidden=\"true\" className={styles.toastSignal} />\n\t\t\t<BaseToast.Content className={styles.toastContent}>\n\t\t\t\t{toast.title ? <BaseToast.Title className={styles.toastTitle} /> : null}\n\t\t\t\t{toast.description ? <BaseToast.Description className={styles.toastDescription} /> : null}\n\t\t\t</BaseToast.Content>\n\t\t\t{actionProps ? <BaseToast.Action {...actionProps} className={mergeClassNames(styles.toastAction, actionClassName)} /> : null}\n\t\t\t<BaseToast.Close aria-label={closeLabel} className={styles.toastClose}>\n\t\t\t\t<XIcon aria-hidden=\"true\" weight=\"bold\" />\n\t\t\t</BaseToast.Close>\n\t\t</BaseToast.Root>\n\t);\n}) as ToastRootComponent;\n\nexport interface ToastViewportProps<Data extends object = ToastData> extends Omit<ComponentPropsWithoutRef<typeof BaseToast.Viewport>, \"children\" | \"className\"> {\n\tclassName?: string;\n\tcloseLabel?: string;\n\trenderToast?: (toast: ToastObject<Data>) => ReactNode;\n}\n\ntype ToastViewportComponent = <Data extends object = ToastData>(props: ToastViewportProps<Data> & RefAttributes<HTMLDivElement>) => ReactElement;\n\nexport const ToastViewport = forwardRef(function ToastViewport<Data extends object = ToastData>(\n\t{ className, closeLabel, renderToast, ...props }: ToastViewportProps<Data>,\n\tref: ForwardedRef<HTMLDivElement>\n) {\n\tconst toast = BaseToast.useToastManager<Data>();\n\n\treturn (\n\t\t<BaseToast.Portal>\n\t\t\t<BaseToast.Viewport ref={ref} className={mergeClassNames(styles.toastViewport, className)} {...props}>\n\t\t\t\t{toast.toasts.map(toastObject =>\n\t\t\t\t\trenderToast ? (\n\t\t\t\t\t\t<Fragment key={toastObject.id}>{renderToast(toastObject)}</Fragment>\n\t\t\t\t\t) : (\n\t\t\t\t\t\t<ToastRoot {...(closeLabel === undefined ? {} : { closeLabel })} key={toastObject.id} toast={toastObject} />\n\t\t\t\t\t)\n\t\t\t\t)}\n\t\t\t</BaseToast.Viewport>\n\t\t</BaseToast.Portal>\n\t);\n}) as ToastViewportComponent;\n\nexport interface ToastProviderProps<Data extends object = ToastData> extends Omit<BaseToast.Provider.Props, \"toastManager\"> {\n\tcloseLabel?: string;\n\trenderToast?: ToastViewportProps<Data>[\"renderToast\"];\n\ttoastManager?: ToastManager<Data>;\n\tviewport?: boolean;\n\tviewportProps?: Omit<ToastViewportProps<Data>, \"closeLabel\" | \"renderToast\">;\n}\n\nexport function ToastProvider<Data extends object = ToastData>({ children, closeLabel, renderToast, viewport = true, viewportProps, ...props }: ToastProviderProps<Data>) {\n\treturn (\n\t\t<BaseToast.Provider {...props}>\n\t\t\t{children}\n\t\t\t{viewport ? <ToastViewport {...viewportProps} {...(closeLabel === undefined ? {} : { closeLabel })} {...(renderToast === undefined ? {} : { renderToast })} /> : null}\n\t\t</BaseToast.Provider>\n\t);\n}\n"],"mappings":";;;;;;;AAOA,IAAM,IAAyC,IAAI,IAAI,CAAiB;AASxE,SAAgB,IAA0E;CACzF,OAAO,EAAU,mBAAyB;AAC3C;AAEA,SAAgB,IAAmD;CAClE,OAAO,EAAU,gBAAsB;AACxC;AAEA,SAAS,EAAoC,GAA0C;CACtF,IAAM,IAAU,EAAM,MAA2C;CASjE,OARI,OAAO,KAAW,YAAY,EAAkB,IAAI,CAAM,IACtD,IAGJ,EAAM,QAAQ,EAAkB,IAAI,EAAM,IAAI,IAC1C,EAAM,OAGP;AACR;AAUA,IAAa,IAAY,EAAW,SACnC,EAAE,cAAW,gBAAa,QAAQ,UAAO,GAAG,KAC5C,GACC;CACD,IAAM,IAAc,EAAM,aACpB,IAAkB,GAAa,WAC/B,IAAS,EAAe,CAAK;CAEnC,OACC,kBAAC,EAAU,MAAX;EAAqB;EAAK,WAAW,EAAgB,EAAO,WAAW,CAAS;EAAG,eAAa;EAAe;EAAO,GAAI;EAA1H,UAAA;GACC,kBAAC,QAAD;IAAM,eAAY;IAAO,WAAW,EAAO;GAAc,CAAA;GACzD,kBAAC,EAAU,SAAX;IAAmB,WAAW,EAAO;IAArC,UAAA,CACE,EAAM,QAAQ,kBAAC,EAAU,OAAX,EAAiB,WAAW,EAAO,WAAa,CAAA,IAAI,MAClE,EAAM,cAAc,kBAAC,EAAU,aAAX,EAAuB,WAAW,EAAO,iBAAmB,CAAA,IAAI,IACnE;;GAClB,IAAc,kBAAC,EAAU,QAAX;IAAkB,GAAI;IAAa,WAAW,EAAgB,EAAO,aAAa,CAAe;GAAI,CAAA,IAAI;GACxH,kBAAC,EAAU,OAAX;IAAiB,cAAY;IAAY,WAAW,EAAO;IAC1D,UAAA,kBAAC,GAAD;KAAO,eAAY;KAAO,QAAO;IAAQ,CAAA;GACzB,CAAA;EACF;;AAElB,CAAC,GAUY,IAAgB,EAAW,SACvC,EAAE,cAAW,eAAY,gBAAa,GAAG,KACzC,GACC;CACD,IAAM,IAAQ,EAAU,gBAAsB;CAE9C,OACC,kBAAC,EAAU,QAAX,EAAA,UACC,kBAAC,EAAU,UAAX;EAAyB;EAAK,WAAW,EAAgB,EAAO,eAAe,CAAS;EAAG,GAAI;EAC7F,UAAA,EAAM,OAAO,KAAI,MACjB,IACC,kBAAC,GAAD,EAAA,UAAgC,EAAY,CAAW,EAAY,GAApD,EAAY,EAAwC,IAEnE,kBAAC,GAAD;GAAW,GAAK,MAAe,KAAA,IAAY,CAAC,IAAI,EAAE,cAAW;GAAI,KAAK,EAAY;GAAI,OAAO;EAAc,CAAA,CAE7G;CACmB,CAAA,EACH,CAAA;AAEpB,CAAC;AAUD,SAAgB,EAA+C,EAAE,aAAU,eAAY,gBAAa,cAAW,IAAM,kBAAe,GAAG,KAAmC;CACzK,OACC,kBAAC,EAAU,UAAX;EAAoB,GAAI;EAAxB,UAAA,CACE,GACA,IAAW,kBAAC,GAAD;GAAe,GAAI;GAAe,GAAK,MAAe,KAAA,IAAY,CAAC,IAAI,EAAE,cAAW;GAAI,GAAK,MAAgB,KAAA,IAAY,CAAC,IAAI,EAAE,eAAY;EAAK,CAAA,IAAI,IAC9I;;AAEtB"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { OTPFieldProps } from './OTPField.js';
|
|
2
|
+
import * as React from "react";
|
|
3
|
+
export interface CodeFieldProps extends Omit<OTPFieldProps, "length" | "separator" | "separatorAfter"> {
|
|
4
|
+
/**
|
|
5
|
+
* 驗證碼字元數。數值限制為 2 至 12。
|
|
6
|
+
* @default 6
|
|
7
|
+
*/
|
|
8
|
+
length?: number;
|
|
9
|
+
/**
|
|
10
|
+
* 每個視覺群組顯示的字元數。長度為 9 至 12 時預設每四個字元一組;
|
|
11
|
+
* 較短的驗證碼預設各自獨立。設為 1 可強制使用獨立輸入格。
|
|
12
|
+
*/
|
|
13
|
+
groupSize?: number;
|
|
14
|
+
groupClassName?: string;
|
|
15
|
+
groupStyle?: React.CSSProperties;
|
|
16
|
+
/**
|
|
17
|
+
* 空白輸入格的選用提示。字串會依序將每個字元分配至各輸入格;
|
|
18
|
+
* 需要個別在地化或自訂時可使用函式。
|
|
19
|
+
*/
|
|
20
|
+
placeholder?: string | ((index: number) => string | undefined);
|
|
21
|
+
}
|
|
22
|
+
/** 以 Base UI OTP Field 實作的多格驗證碼控制項。 */
|
|
23
|
+
export declare const CodeField: React.ForwardRefExoticComponent<Omit<CodeFieldProps, "ref"> & React.RefAttributes<HTMLDivElement>>;
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
/* empty css */
|
|
2
|
+
import { FieldFrame as e, cx as t, withStateClassName as n } from "./internal.js";
|
|
3
|
+
import * as r from "react";
|
|
4
|
+
import { jsx as i } from "react/jsx-runtime";
|
|
5
|
+
import { OTPField as a } from "@base-ui/react/otp-field";
|
|
6
|
+
//#region src/components/forms/CodeField.tsx
|
|
7
|
+
function o(e, t, n) {
|
|
8
|
+
return Number.isFinite(e) ? Math.min(n, Math.max(t, Math.trunc(e))) : t;
|
|
9
|
+
}
|
|
10
|
+
var s = r.forwardRef(function({ label: r, description: s, error: c, invalid: l, disabled: u, readOnly: d, required: f, name: p, size: m = "md", className: h, style: g, requiredIndicator: _, validate: v, validationMode: y, validationDebounceTime: b, dirty: x, touched: S, actionsRef: C, inputClassName: w, inputStyle: T, getSlotLabel: E, length: D = 6, groupSize: O, groupClassName: k, groupStyle: A, placeholder: j, validationType: M = "numeric", ...N }, P) {
|
|
11
|
+
let F = o(D, 2, 12), I = o(O ?? (F >= 9 ? 4 : 1), 1, F), L = I > 1, R = [], z = typeof j == "string" ? Array.from(j) : null;
|
|
12
|
+
for (let e = 0; e < F; e += I) R.push(Array.from({ length: Math.min(I, F - e) }, (t, n) => e + n));
|
|
13
|
+
let B = (e, r) => /* @__PURE__ */ i(a.Input, {
|
|
14
|
+
className: n(t("lyds-otp-field__input", "lyds-code-field__input", r && "lyds-code-field__group-input"), w),
|
|
15
|
+
style: T,
|
|
16
|
+
placeholder: typeof j == "function" ? j(e) : z?.[e],
|
|
17
|
+
"aria-label": e > 0 ? E?.(e) ?? `第 ${e + 1} 個字元,共 ${F} 個` : void 0
|
|
18
|
+
}, e);
|
|
19
|
+
return /* @__PURE__ */ i(e, {
|
|
20
|
+
label: r,
|
|
21
|
+
description: s,
|
|
22
|
+
error: c,
|
|
23
|
+
invalid: l,
|
|
24
|
+
disabled: u,
|
|
25
|
+
readOnly: d,
|
|
26
|
+
required: f,
|
|
27
|
+
name: p,
|
|
28
|
+
size: m,
|
|
29
|
+
className: h,
|
|
30
|
+
style: g,
|
|
31
|
+
requiredIndicator: _,
|
|
32
|
+
validate: v,
|
|
33
|
+
validationMode: y,
|
|
34
|
+
validationDebounceTime: b,
|
|
35
|
+
dirty: x,
|
|
36
|
+
touched: S,
|
|
37
|
+
actionsRef: C,
|
|
38
|
+
children: /* @__PURE__ */ i(a.Root, {
|
|
39
|
+
...N,
|
|
40
|
+
ref: P,
|
|
41
|
+
className: t("lyds-otp-field", "lyds-code-field"),
|
|
42
|
+
name: p,
|
|
43
|
+
disabled: u,
|
|
44
|
+
readOnly: d,
|
|
45
|
+
required: f,
|
|
46
|
+
length: F,
|
|
47
|
+
validationType: M,
|
|
48
|
+
"data-size": m,
|
|
49
|
+
"data-grouped": L || void 0,
|
|
50
|
+
"data-group-size": I,
|
|
51
|
+
children: R.map((e, n) => L ? /* @__PURE__ */ i("span", {
|
|
52
|
+
className: t("lyds-code-field__group", k),
|
|
53
|
+
style: A,
|
|
54
|
+
"data-group-index": n,
|
|
55
|
+
children: e.map((e) => B(e, !0))
|
|
56
|
+
}, e[0]) : B(e[0], !1))
|
|
57
|
+
})
|
|
58
|
+
});
|
|
59
|
+
});
|
|
60
|
+
//#endregion
|
|
61
|
+
export { s as CodeField };
|
|
62
|
+
|
|
63
|
+
//# sourceMappingURL=CodeField.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CodeField.js","names":[],"sources":["../../../src/components/forms/CodeField.tsx"],"sourcesContent":["import { OTPField as BaseOTPField } from \"@base-ui/react/otp-field\";\nimport * as React from \"react\";\nimport \"./forms.css\";\nimport { cx, FieldFrame, withStateClassName } from \"./internal\";\nimport type { OTPFieldProps } from \"./OTPField\";\n\nexport interface CodeFieldProps extends Omit<OTPFieldProps, \"length\" | \"separator\" | \"separatorAfter\"> {\n\t/**\n\t * 驗證碼字元數。數值限制為 2 至 12。\n\t * @default 6\n\t */\n\tlength?: number;\n\t/**\n\t * 每個視覺群組顯示的字元數。長度為 9 至 12 時預設每四個字元一組;\n\t * 較短的驗證碼預設各自獨立。設為 1 可強制使用獨立輸入格。\n\t */\n\tgroupSize?: number;\n\tgroupClassName?: string;\n\tgroupStyle?: React.CSSProperties;\n\t/**\n\t * 空白輸入格的選用提示。字串會依序將每個字元分配至各輸入格;\n\t * 需要個別在地化或自訂時可使用函式。\n\t */\n\tplaceholder?: string | ((index: number) => string | undefined);\n}\n\nfunction constrainInteger(value: number, minimum: number, maximum: number): number {\n\tif (!Number.isFinite(value)) return minimum;\n\treturn Math.min(maximum, Math.max(minimum, Math.trunc(value)));\n}\n\n/** 以 Base UI OTP Field 實作的多格驗證碼控制項。 */\nexport const CodeField = React.forwardRef<HTMLDivElement, CodeFieldProps>(function CodeField(\n\t{\n\t\tlabel,\n\t\tdescription,\n\t\terror,\n\t\tinvalid,\n\t\tdisabled,\n\t\treadOnly,\n\t\trequired,\n\t\tname,\n\t\tsize = \"md\",\n\t\tclassName,\n\t\tstyle,\n\t\trequiredIndicator,\n\t\tvalidate,\n\t\tvalidationMode,\n\t\tvalidationDebounceTime,\n\t\tdirty,\n\t\ttouched,\n\t\tactionsRef,\n\t\tinputClassName,\n\t\tinputStyle,\n\t\tgetSlotLabel,\n\t\tlength: lengthProp = 6,\n\t\tgroupSize: groupSizeProp,\n\t\tgroupClassName,\n\t\tgroupStyle,\n\t\tplaceholder,\n\t\tvalidationType = \"numeric\",\n\t\t...otpProps\n\t},\n\tref\n) {\n\tconst length = constrainInteger(lengthProp, 2, 12);\n\tconst defaultGroupSize = length >= 9 ? 4 : 1;\n\tconst groupSize = constrainInteger(groupSizeProp ?? defaultGroupSize, 1, length);\n\tconst grouped = groupSize > 1;\n\tconst groups: number[][] = [];\n\tconst placeholderCharacters = typeof placeholder === \"string\" ? Array.from(placeholder) : null;\n\n\tfor (let start = 0; start < length; start += groupSize) {\n\t\tgroups.push(Array.from({ length: Math.min(groupSize, length - start) }, (_, offset) => start + offset));\n\t}\n\n\tconst renderSlot = (index: number, insideGroup: boolean) => (\n\t\t<BaseOTPField.Input\n\t\t\tkey={index}\n\t\t\tclassName={withStateClassName<BaseOTPField.Input.State>(cx(\"lyds-otp-field__input\", \"lyds-code-field__input\", insideGroup && \"lyds-code-field__group-input\"), inputClassName)}\n\t\t\tstyle={inputStyle}\n\t\t\tplaceholder={typeof placeholder === \"function\" ? placeholder(index) : placeholderCharacters?.[index]}\n\t\t\taria-label={index > 0 ? (getSlotLabel?.(index) ?? `第 ${index + 1} 個字元,共 ${length} 個`) : undefined}\n\t\t/>\n\t);\n\n\treturn (\n\t\t<FieldFrame\n\t\t\tlabel={label}\n\t\t\tdescription={description}\n\t\t\terror={error}\n\t\t\tinvalid={invalid}\n\t\t\tdisabled={disabled}\n\t\t\treadOnly={readOnly}\n\t\t\trequired={required}\n\t\t\tname={name}\n\t\t\tsize={size}\n\t\t\tclassName={className}\n\t\t\tstyle={style}\n\t\t\trequiredIndicator={requiredIndicator}\n\t\t\tvalidate={validate}\n\t\t\tvalidationMode={validationMode}\n\t\t\tvalidationDebounceTime={validationDebounceTime}\n\t\t\tdirty={dirty}\n\t\t\ttouched={touched}\n\t\t\tactionsRef={actionsRef}\n\t\t>\n\t\t\t<BaseOTPField.Root\n\t\t\t\t{...otpProps}\n\t\t\t\tref={ref}\n\t\t\t\tclassName={cx(\"lyds-otp-field\", \"lyds-code-field\")}\n\t\t\t\tname={name}\n\t\t\t\tdisabled={disabled}\n\t\t\t\treadOnly={readOnly}\n\t\t\t\trequired={required}\n\t\t\t\tlength={length}\n\t\t\t\tvalidationType={validationType}\n\t\t\t\tdata-size={size}\n\t\t\t\tdata-grouped={grouped || undefined}\n\t\t\t\tdata-group-size={groupSize}\n\t\t\t>\n\t\t\t\t{groups.map((indices, groupIndex) =>\n\t\t\t\t\tgrouped ? (\n\t\t\t\t\t\t<span key={indices[0]} className={cx(\"lyds-code-field__group\", groupClassName)} style={groupStyle} data-group-index={groupIndex}>\n\t\t\t\t\t\t\t{indices.map(index => renderSlot(index, true))}\n\t\t\t\t\t\t</span>\n\t\t\t\t\t) : (\n\t\t\t\t\t\trenderSlot(indices[0] as number, false)\n\t\t\t\t\t)\n\t\t\t\t)}\n\t\t\t</BaseOTPField.Root>\n\t\t</FieldFrame>\n\t);\n});\n"],"mappings":";;;;;;AA0BA,SAAS,EAAiB,GAAe,GAAiB,GAAyB;CAElF,OADK,OAAO,SAAS,CAAK,IACnB,KAAK,IAAI,GAAS,KAAK,IAAI,GAAS,KAAK,MAAM,CAAK,CAAC,CAAC,IADzB;AAErC;AAGA,IAAa,IAAY,EAAM,WAA2C,SACzE,EACC,UACA,gBACA,UACA,YACA,aACA,aACA,aACA,SACA,UAAO,MACP,cACA,UACA,sBACA,aACA,mBACA,2BACA,UACA,YACA,eACA,mBACA,eACA,iBACA,QAAQ,IAAa,GACrB,WAAW,GACX,mBACA,eACA,gBACA,oBAAiB,WACjB,GAAG,KAEJ,GACC;CACD,IAAM,IAAS,EAAiB,GAAY,GAAG,EAAE,GAE3C,IAAY,EAAiB,MADV,KAAU,IAAI,IAAI,IAC2B,GAAG,CAAM,GACzE,IAAU,IAAY,GACtB,IAAqB,CAAC,GACtB,IAAwB,OAAO,KAAgB,WAAW,MAAM,KAAK,CAAW,IAAI;CAE1F,KAAK,IAAI,IAAQ,GAAG,IAAQ,GAAQ,KAAS,GAC5C,EAAO,KAAK,MAAM,KAAK,EAAE,QAAQ,KAAK,IAAI,GAAW,IAAS,CAAK,EAAE,IAAI,GAAG,MAAW,IAAQ,CAAM,CAAC;CAGvG,IAAM,KAAc,GAAe,MAClC,kBAAC,EAAa,OAAd;EAEC,WAAW,EAA6C,EAAG,yBAAyB,0BAA0B,KAAe,8BAA8B,GAAG,CAAc;EAC5K,OAAO;EACP,aAAa,OAAO,KAAgB,aAAa,EAAY,CAAK,IAAI,IAAwB;EAC9F,cAAY,IAAQ,IAAK,IAAe,CAAK,KAAK,KAAK,IAAQ,EAAE,SAAS,EAAO,MAAO,KAAA;CACxF,GALK,CAKL;CAGF,OACC,kBAAC,GAAD;EACQ;EACM;EACN;EACE;EACC;EACA;EACA;EACJ;EACA;EACK;EACJ;EACY;EACT;EACM;EACQ;EACjB;EACE;EACG;EAEZ,UAAA,kBAAC,EAAa,MAAd;GACC,GAAI;GACC;GACL,WAAW,EAAG,kBAAkB,iBAAiB;GAC3C;GACI;GACA;GACA;GACF;GACQ;GAChB,aAAW;GACX,gBAAc,KAAW,KAAA;GACzB,mBAAiB;GAEhB,UAAA,EAAO,KAAK,GAAS,MACrB,IACC,kBAAC,QAAD;IAAuB,WAAW,EAAG,0BAA0B,CAAc;IAAG,OAAO;IAAY,oBAAkB;IACnH,UAAA,EAAQ,KAAI,MAAS,EAAW,GAAO,EAAI,CAAC;GACxC,GAFK,EAAQ,EAEb,IAEN,EAAW,EAAQ,IAAc,EAAK,CAExC;EACkB,CAAA;CACR,CAAA;AAEd,CAAC"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { FieldAnatomyProps } from './internal.js';
|
|
2
|
+
import * as React from "react";
|
|
3
|
+
type NativeFileInputProps = Omit<React.InputHTMLAttributes<HTMLInputElement>, "children" | "className" | "defaultValue" | "disabled" | "name" | "onChange" | "readOnly" | "required" | "size" | "style" | "type" | "value">;
|
|
4
|
+
export interface FileUploadProps extends NativeFileInputProps, FieldAnatomyProps {
|
|
5
|
+
inputClassName?: string;
|
|
6
|
+
inputStyle?: React.CSSProperties;
|
|
7
|
+
triggerLabel?: React.ReactNode;
|
|
8
|
+
invalidFileLabel?: React.ReactNode;
|
|
9
|
+
onChange?: React.ChangeEventHandler<HTMLInputElement>;
|
|
10
|
+
onFilesChange?: (files: readonly File[], event: React.ChangeEvent<HTMLInputElement>) => void;
|
|
11
|
+
}
|
|
12
|
+
export declare const FileUpload: React.ForwardRefExoticComponent<FileUploadProps & React.RefAttributes<HTMLInputElement>>;
|
|
13
|
+
export type DropZoneChangeDetails = {
|
|
14
|
+
source: "input";
|
|
15
|
+
event: React.ChangeEvent<HTMLInputElement>;
|
|
16
|
+
} | {
|
|
17
|
+
source: "drop";
|
|
18
|
+
event: React.DragEvent<HTMLDivElement>;
|
|
19
|
+
};
|
|
20
|
+
export interface DropZoneProps extends NativeFileInputProps, FieldAnatomyProps {
|
|
21
|
+
inputClassName?: string;
|
|
22
|
+
primaryLabel?: React.ReactNode;
|
|
23
|
+
secondaryLabel?: React.ReactNode;
|
|
24
|
+
browseLabel?: string;
|
|
25
|
+
invalidFileLabel?: React.ReactNode;
|
|
26
|
+
onChange?: React.ChangeEventHandler<HTMLInputElement>;
|
|
27
|
+
onFilesChange?: (files: readonly File[], details: DropZoneChangeDetails) => void;
|
|
28
|
+
onDragEnter?: React.DragEventHandler<HTMLDivElement>;
|
|
29
|
+
onDragOver?: React.DragEventHandler<HTMLDivElement>;
|
|
30
|
+
onDragLeave?: React.DragEventHandler<HTMLDivElement>;
|
|
31
|
+
onDrop?: React.DragEventHandler<HTMLDivElement>;
|
|
32
|
+
}
|
|
33
|
+
export declare const DropZone: React.ForwardRefExoticComponent<DropZoneProps & React.RefAttributes<HTMLInputElement>>;
|
|
34
|
+
export {};
|