@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.
Files changed (169) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +85 -0
  3. package/dist/components/date-time/calendar.d.ts +20 -0
  4. package/dist/components/date-time/calendar.js +102 -0
  5. package/dist/components/date-time/calendar.js.map +1 -0
  6. package/dist/components/date-time/date-field.d.ts +11 -0
  7. package/dist/components/date-time/date-field.js +44 -0
  8. package/dist/components/date-time/date-field.js.map +1 -0
  9. package/dist/components/date-time/date-picker.d.ts +28 -0
  10. package/dist/components/date-time/date-picker.js +74 -0
  11. package/dist/components/date-time/date-picker.js.map +1 -0
  12. package/dist/components/date-time/date-range-picker.d.ts +11 -0
  13. package/dist/components/date-time/date-range-picker.js +79 -0
  14. package/dist/components/date-time/date-range-picker.js.map +1 -0
  15. package/dist/components/date-time/date-types.d.ts +110 -0
  16. package/dist/components/date-time/index.d.ts +8 -0
  17. package/dist/components/date-time/index.js +8 -0
  18. package/dist/components/date-time/shared.d.ts +25 -0
  19. package/dist/components/date-time/shared.js +53 -0
  20. package/dist/components/date-time/shared.js.map +1 -0
  21. package/dist/components/date-time/time-field.d.ts +13 -0
  22. package/dist/components/date-time/time-field.js +52 -0
  23. package/dist/components/date-time/time-field.js.map +1 -0
  24. package/dist/components/feedback/alert.d.ts +21 -0
  25. package/dist/components/feedback/alert.js +44 -0
  26. package/dist/components/feedback/alert.js.map +1 -0
  27. package/dist/components/feedback/banner.d.ts +8 -0
  28. package/dist/components/feedback/banner.js +20 -0
  29. package/dist/components/feedback/banner.js.map +1 -0
  30. package/dist/components/feedback/empty-state.d.ts +12 -0
  31. package/dist/components/feedback/empty-state.js +48 -0
  32. package/dist/components/feedback/empty-state.js.map +1 -0
  33. package/dist/components/feedback/feedback.module.js +42 -0
  34. package/dist/components/feedback/feedback.module.js.map +1 -0
  35. package/dist/components/feedback/feedback.types.d.ts +8 -0
  36. package/dist/components/feedback/feedback.types.js +24 -0
  37. package/dist/components/feedback/feedback.types.js.map +1 -0
  38. package/dist/components/feedback/index.d.ts +9 -0
  39. package/dist/components/feedback/meter.d.ts +12 -0
  40. package/dist/components/feedback/meter.js +28 -0
  41. package/dist/components/feedback/meter.js.map +1 -0
  42. package/dist/components/feedback/progress.d.ts +12 -0
  43. package/dist/components/feedback/progress.js +28 -0
  44. package/dist/components/feedback/progress.js.map +1 -0
  45. package/dist/components/feedback/skeleton.d.ts +5 -0
  46. package/dist/components/feedback/skeleton.js +18 -0
  47. package/dist/components/feedback/skeleton.js.map +1 -0
  48. package/dist/components/feedback/spinner.d.ts +23 -0
  49. package/dist/components/feedback/spinner.js +35 -0
  50. package/dist/components/feedback/spinner.js.map +1 -0
  51. package/dist/components/feedback/toast.d.ts +33 -0
  52. package/dist/components/feedback/toast.js +76 -0
  53. package/dist/components/feedback/toast.js.map +1 -0
  54. package/dist/components/forms/CodeField.d.ts +23 -0
  55. package/dist/components/forms/CodeField.js +63 -0
  56. package/dist/components/forms/CodeField.js.map +1 -0
  57. package/dist/components/forms/FileUpload.d.ts +34 -0
  58. package/dist/components/forms/FileUpload.js +319 -0
  59. package/dist/components/forms/FileUpload.js.map +1 -0
  60. package/dist/components/forms/Input.d.ts +14 -0
  61. package/dist/components/forms/Input.js +33 -0
  62. package/dist/components/forms/Input.js.map +1 -0
  63. package/dist/components/forms/NumberField.d.ts +15 -0
  64. package/dist/components/forms/NumberField.js +71 -0
  65. package/dist/components/forms/NumberField.js.map +1 -0
  66. package/dist/components/forms/OTPField.d.ts +15 -0
  67. package/dist/components/forms/OTPField.js +54 -0
  68. package/dist/components/forms/OTPField.js.map +1 -0
  69. package/dist/components/forms/TextField.d.ts +61 -0
  70. package/dist/components/forms/TextField.js +199 -0
  71. package/dist/components/forms/TextField.js.map +1 -0
  72. package/dist/components/forms/index.d.ts +7 -0
  73. package/dist/components/forms/internal.d.ts +33 -0
  74. package/dist/components/forms/internal.js +61 -0
  75. package/dist/components/forms/internal.js.map +1 -0
  76. package/dist/components/foundations/Avatar.d.ts +33 -0
  77. package/dist/components/foundations/Avatar.js +45 -0
  78. package/dist/components/foundations/Avatar.js.map +1 -0
  79. package/dist/components/foundations/Badge.d.ts +15 -0
  80. package/dist/components/foundations/Badge.js +32 -0
  81. package/dist/components/foundations/Badge.js.map +1 -0
  82. package/dist/components/foundations/Button.d.ts +18 -0
  83. package/dist/components/foundations/Button.js +47 -0
  84. package/dist/components/foundations/Button.js.map +1 -0
  85. package/dist/components/foundations/Card.d.ts +47 -0
  86. package/dist/components/foundations/Card.js +57 -0
  87. package/dist/components/foundations/Card.js.map +1 -0
  88. package/dist/components/foundations/IconButton.d.ts +25 -0
  89. package/dist/components/foundations/IconButton.js +19 -0
  90. package/dist/components/foundations/IconButton.js.map +1 -0
  91. package/dist/components/foundations/Link.d.ts +19 -0
  92. package/dist/components/foundations/Link.js +40 -0
  93. package/dist/components/foundations/Link.js.map +1 -0
  94. package/dist/components/foundations/ListCell.d.ts +68 -0
  95. package/dist/components/foundations/ListCell.js +105 -0
  96. package/dist/components/foundations/ListCell.js.map +1 -0
  97. package/dist/components/foundations/SectionHeading.d.ts +17 -0
  98. package/dist/components/foundations/SectionHeading.js +50 -0
  99. package/dist/components/foundations/SectionHeading.js.map +1 -0
  100. package/dist/components/foundations/Separator.d.ts +11 -0
  101. package/dist/components/foundations/Separator.js +21 -0
  102. package/dist/components/foundations/Separator.js.map +1 -0
  103. package/dist/components/foundations/index.d.ts +9 -0
  104. package/dist/components/foundations/shared.d.ts +5 -0
  105. package/dist/components/foundations/shared.js +8 -0
  106. package/dist/components/foundations/shared.js.map +1 -0
  107. package/dist/components/navigation-data/breadcrumb-pagination.d.ts +34 -0
  108. package/dist/components/navigation-data/breadcrumb-pagination.js +161 -0
  109. package/dist/components/navigation-data/breadcrumb-pagination.js.map +1 -0
  110. package/dist/components/navigation-data/command-palette.d.ts +35 -0
  111. package/dist/components/navigation-data/command-palette.js +151 -0
  112. package/dist/components/navigation-data/command-palette.js.map +1 -0
  113. package/dist/components/navigation-data/header-tab-bar.d.ts +23 -0
  114. package/dist/components/navigation-data/header-tab-bar.js +102 -0
  115. package/dist/components/navigation-data/header-tab-bar.js.map +1 -0
  116. package/dist/components/navigation-data/index.d.ts +7 -0
  117. package/dist/components/navigation-data/menubar-toolbar.d.ts +26 -0
  118. package/dist/components/navigation-data/menubar-toolbar.js +161 -0
  119. package/dist/components/navigation-data/menubar-toolbar.js.map +1 -0
  120. package/dist/components/navigation-data/navigation-menu.d.ts +14 -0
  121. package/dist/components/navigation-data/navigation-menu.js +87 -0
  122. package/dist/components/navigation-data/navigation-menu.js.map +1 -0
  123. package/dist/components/navigation-data/scroll-area.d.ts +6 -0
  124. package/dist/components/navigation-data/scroll-area.js +52 -0
  125. package/dist/components/navigation-data/scroll-area.js.map +1 -0
  126. package/dist/components/navigation-data/table-collection.d.ts +61 -0
  127. package/dist/components/navigation-data/table-collection.js +181 -0
  128. package/dist/components/navigation-data/table-collection.js.map +1 -0
  129. package/dist/components/navigation-data/utils.d.ts +2 -0
  130. package/dist/components/navigation-data/utils.js +11 -0
  131. package/dist/components/navigation-data/utils.js.map +1 -0
  132. package/dist/components/overlays/class-names.d.ts +6 -0
  133. package/dist/components/overlays/class-names.js +11 -0
  134. package/dist/components/overlays/class-names.js.map +1 -0
  135. package/dist/components/overlays/dialog.d.ts +98 -0
  136. package/dist/components/overlays/dialog.js +158 -0
  137. package/dist/components/overlays/dialog.js.map +1 -0
  138. package/dist/components/overlays/disclosure.d.ts +40 -0
  139. package/dist/components/overlays/disclosure.js +138 -0
  140. package/dist/components/overlays/disclosure.js.map +1 -0
  141. package/dist/components/overlays/drawer.d.ts +88 -0
  142. package/dist/components/overlays/drawer.js +192 -0
  143. package/dist/components/overlays/drawer.js.map +1 -0
  144. package/dist/components/overlays/floating.d.ts +83 -0
  145. package/dist/components/overlays/floating.js +220 -0
  146. package/dist/components/overlays/floating.js.map +1 -0
  147. package/dist/components/overlays/index.d.ts +4 -0
  148. package/dist/components/selection/classnames.d.ts +4 -0
  149. package/dist/components/selection/classnames.js +14 -0
  150. package/dist/components/selection/classnames.js.map +1 -0
  151. package/dist/components/selection/combobox.d.ts +118 -0
  152. package/dist/components/selection/combobox.js +284 -0
  153. package/dist/components/selection/combobox.js.map +1 -0
  154. package/dist/components/selection/controls.d.ts +65 -0
  155. package/dist/components/selection/controls.js +171 -0
  156. package/dist/components/selection/controls.js.map +1 -0
  157. package/dist/components/selection/index.d.ts +7 -0
  158. package/dist/components/selection/menu.d.ts +87 -0
  159. package/dist/components/selection/menu.js +157 -0
  160. package/dist/components/selection/menu.js.map +1 -0
  161. package/dist/components/selection/select.d.ts +55 -0
  162. package/dist/components/selection/select.js +138 -0
  163. package/dist/components/selection/select.js.map +1 -0
  164. package/dist/components/selection/selection.module.js +51 -0
  165. package/dist/components/selection/selection.module.js.map +1 -0
  166. package/dist/index.d.ts +7 -0
  167. package/dist/index.js +52 -0
  168. package/dist/styles.css +2 -0
  169. 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 {};