@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,61 @@
1
+ import { Field as BaseField } from '@base-ui/react/field';
2
+ import { Input as BaseInput } from '@base-ui/react/input';
3
+ import { FieldAnatomyProps } from './internal.js';
4
+ import * as React from "react";
5
+ type TextFieldInputProps = Omit<BaseInput.Props, "className" | "disabled" | "name" | "readOnly" | "required" | "size" | "style">;
6
+ export interface TextFieldProps extends TextFieldInputProps, FieldAnatomyProps {
7
+ inputClassName?: BaseInput.Props["className"];
8
+ inputStyle?: React.CSSProperties;
9
+ /** 原生 HTML `size` 屬性,並非 Linyao Design System 的視覺尺寸。 */
10
+ inputSize?: number;
11
+ startAdornment?: React.ReactNode;
12
+ endAdornment?: React.ReactNode;
13
+ /** 使用等寬或表格數字排版,不會修改輸入值。 */
14
+ technical?: boolean;
15
+ }
16
+ export declare const TextField: React.ForwardRefExoticComponent<Omit<TextFieldProps, "ref"> & React.RefAttributes<HTMLInputElement>>;
17
+ export interface TextareaProps extends Omit<React.TextareaHTMLAttributes<HTMLTextAreaElement>, "className" | "size" | "style"> {
18
+ size?: FieldAnatomyProps["size"] | undefined;
19
+ invalid?: boolean | undefined;
20
+ className?: string | undefined;
21
+ style?: React.CSSProperties | undefined;
22
+ onValueChange?: (value: string, eventDetails: BaseField.Control.ChangeEventDetails) => void;
23
+ }
24
+ /** 以 Base UI 實作的獨立多行輸入控制項。 */
25
+ export declare const Textarea: React.ForwardRefExoticComponent<TextareaProps & React.RefAttributes<HTMLTextAreaElement>>;
26
+ export interface TextViewProps extends Omit<TextareaProps, "className" | "disabled" | "invalid" | "name" | "readOnly" | "required" | "size" | "style">, FieldAnatomyProps {
27
+ textareaClassName?: string;
28
+ textareaStyle?: React.CSSProperties;
29
+ }
30
+ /** 使用與 TextField 相同結構的完整多行欄位。 */
31
+ export declare const TextView: React.ForwardRefExoticComponent<TextViewProps & React.RefAttributes<HTMLTextAreaElement>>;
32
+ export interface SearchFieldProps extends Omit<TextFieldProps, "startAdornment" | "type"> {
33
+ searchIcon?: React.ReactNode;
34
+ }
35
+ export declare const SearchField: React.ForwardRefExoticComponent<Omit<SearchFieldProps, "ref"> & React.RefAttributes<HTMLInputElement>>;
36
+ export interface PasswordFieldProps extends Omit<TextFieldProps, "endAdornment" | "type"> {
37
+ visible?: boolean;
38
+ defaultVisible?: boolean;
39
+ onVisibilityChange?: (visible: boolean) => void;
40
+ showPasswordLabel?: string;
41
+ hidePasswordLabel?: string;
42
+ }
43
+ export declare const PasswordField: React.ForwardRefExoticComponent<Omit<PasswordFieldProps, "ref"> & React.RefAttributes<HTMLInputElement>>;
44
+ export interface PhoneFieldCountrySelectorState {
45
+ disabled: boolean;
46
+ readOnly: boolean;
47
+ /** 反映由外部控制的 `invalid` 屬性,不代表 Base UI 驗證器產生的狀態。 */
48
+ externallyInvalid: boolean;
49
+ }
50
+ export interface PhoneFieldProps extends Omit<TextFieldProps, "technical" | "type"> {
51
+ /**
52
+ * 由使用端提供的國家選擇器或其觸發按鈕。提供此插槽後,
53
+ * PhoneField 會使用雙區段結構。
54
+ */
55
+ countrySelector?: React.ReactNode | ((state: PhoneFieldCountrySelectorState) => React.ReactNode);
56
+ countrySelectorClassName?: string;
57
+ countrySelectorStyle?: React.CSSProperties;
58
+ }
59
+ /** 不預設格式的電話欄位。國家選擇與驗證規則由使用端負責。 */
60
+ export declare const PhoneField: React.ForwardRefExoticComponent<Omit<PhoneFieldProps, "ref"> & React.RefAttributes<HTMLInputElement>>;
61
+ export {};
@@ -0,0 +1,199 @@
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, jsxs as a } from "react/jsx-runtime";
5
+ import { Field as o } from "@base-ui/react/field";
6
+ import { Input as s } from "@base-ui/react/input";
7
+ import { EyeIcon as c } from "@phosphor-icons/react/dist/csr/Eye";
8
+ import { EyeSlashIcon as l } from "@phosphor-icons/react/dist/csr/EyeSlash";
9
+ import { MagnifyingGlassIcon as u } from "@phosphor-icons/react/dist/csr/MagnifyingGlass";
10
+ //#region src/components/forms/TextField.tsx
11
+ function d({ forwardedRef: r, countrySelector: o, countrySelectorClassName: c, countrySelectorStyle: l, label: u, description: d, error: f, invalid: p, disabled: m, readOnly: h, required: g, name: _, size: v = "md", className: y, style: b, requiredIndicator: x, validate: S, validationMode: C, validationDebounceTime: w, dirty: T, touched: E, actionsRef: D, inputClassName: O, inputStyle: k, inputSize: A, startAdornment: j, endAdornment: M, technical: N, "aria-invalid": P, ...F }) {
12
+ let I = /* @__PURE__ */ a("div", {
13
+ className: t("lyds-field__control-frame", o != null && "lyds-phone-field__input-frame"),
14
+ "data-size": v,
15
+ "data-technical": N || void 0,
16
+ children: [
17
+ j == null ? null : /* @__PURE__ */ i("span", {
18
+ className: "lyds-field__adornment lyds-field__adornment--start",
19
+ children: j
20
+ }),
21
+ /* @__PURE__ */ i(s, {
22
+ ...F,
23
+ ref: r,
24
+ className: n("lyds-field__input", O),
25
+ style: k,
26
+ disabled: m,
27
+ readOnly: h,
28
+ required: g,
29
+ size: A,
30
+ "aria-invalid": p ? !0 : P
31
+ }),
32
+ M == null ? null : /* @__PURE__ */ i("span", {
33
+ className: "lyds-field__adornment lyds-field__adornment--end",
34
+ children: M
35
+ })
36
+ ]
37
+ });
38
+ return /* @__PURE__ */ i(e, {
39
+ label: u,
40
+ description: d,
41
+ error: f,
42
+ invalid: p,
43
+ disabled: m,
44
+ readOnly: h,
45
+ required: g,
46
+ name: _,
47
+ size: v,
48
+ className: y,
49
+ style: b,
50
+ requiredIndicator: x,
51
+ validate: S,
52
+ validationMode: C,
53
+ validationDebounceTime: w,
54
+ dirty: T,
55
+ touched: E,
56
+ actionsRef: D,
57
+ children: o == null ? I : /* @__PURE__ */ a("div", {
58
+ className: "lyds-phone-field",
59
+ children: [/* @__PURE__ */ i("span", {
60
+ className: t("lyds-phone-field__country", c),
61
+ style: l,
62
+ "aria-disabled": m || h || void 0,
63
+ inert: m || h || void 0,
64
+ "data-invalid": p || void 0,
65
+ children: o
66
+ }), I]
67
+ })
68
+ });
69
+ }
70
+ var f = r.forwardRef(function(e, t) {
71
+ return /* @__PURE__ */ i(d, {
72
+ ...e,
73
+ forwardedRef: t
74
+ });
75
+ }), p = r.forwardRef(function({ size: e = "md", invalid: n, disabled: r, readOnly: a, required: s, name: c, value: l, defaultValue: u, onValueChange: d, className: f, style: p, "aria-invalid": m, ...h }, g) {
76
+ return /* @__PURE__ */ i(o.Root, {
77
+ className: "lyds-input-root",
78
+ name: c,
79
+ disabled: r,
80
+ invalid: n,
81
+ "data-size": e,
82
+ "data-readonly": a || void 0,
83
+ "data-required": s || void 0,
84
+ children: /* @__PURE__ */ i(o.Control, {
85
+ ref: g,
86
+ render: /* @__PURE__ */ i("textarea", { ...h }),
87
+ className: t("lyds-textarea", f),
88
+ style: p,
89
+ disabled: r,
90
+ readOnly: a,
91
+ required: s,
92
+ value: l,
93
+ defaultValue: u,
94
+ onValueChange: d,
95
+ "aria-invalid": n ? !0 : m,
96
+ "data-size": e
97
+ })
98
+ });
99
+ }), m = r.forwardRef(function({ label: n, description: r, error: a, invalid: s, disabled: c, readOnly: l, required: u, name: d, size: f = "md", className: p, style: m, requiredIndicator: h, validate: g, validationMode: _, validationDebounceTime: v, dirty: y, touched: b, actionsRef: x, textareaClassName: S, textareaStyle: C, value: w, defaultValue: T, onValueChange: E, "aria-invalid": D, ...O }, k) {
100
+ return /* @__PURE__ */ i(e, {
101
+ label: n,
102
+ description: r,
103
+ error: a,
104
+ invalid: s,
105
+ disabled: c,
106
+ readOnly: l,
107
+ required: u,
108
+ name: d,
109
+ size: f,
110
+ className: p,
111
+ style: m,
112
+ requiredIndicator: h,
113
+ validate: g,
114
+ validationMode: _,
115
+ validationDebounceTime: v,
116
+ dirty: y,
117
+ touched: b,
118
+ actionsRef: x,
119
+ children: /* @__PURE__ */ i(o.Control, {
120
+ ref: k,
121
+ render: /* @__PURE__ */ i("textarea", { ...O }),
122
+ className: t("lyds-textarea", S),
123
+ style: C,
124
+ disabled: c,
125
+ readOnly: l,
126
+ required: u,
127
+ value: w,
128
+ defaultValue: T,
129
+ onValueChange: E,
130
+ "aria-invalid": s ? !0 : D,
131
+ "data-size": f
132
+ })
133
+ });
134
+ });
135
+ function h() {
136
+ return /* @__PURE__ */ i(u, {
137
+ "aria-hidden": "true",
138
+ className: "lyds-field__icon",
139
+ weight: "regular"
140
+ });
141
+ }
142
+ var g = r.forwardRef(function({ searchIcon: e, autoComplete: t, ...n }, r) {
143
+ return /* @__PURE__ */ i(f, {
144
+ ...n,
145
+ ref: r,
146
+ type: "search",
147
+ autoComplete: t ?? "off",
148
+ startAdornment: e ?? /* @__PURE__ */ i(h, {})
149
+ });
150
+ });
151
+ function _({ visible: e }) {
152
+ return i(e ? c : l, {
153
+ "aria-hidden": "true",
154
+ className: "lyds-field__icon",
155
+ weight: "regular"
156
+ });
157
+ }
158
+ var v = r.forwardRef(function({ visible: e, defaultVisible: t = !1, onVisibilityChange: n, showPasswordLabel: a = "顯示密碼", hidePasswordLabel: o = "隱藏密碼", autoComplete: s, ...c }, l) {
159
+ let [u, d] = r.useState(t), p = e ?? u, m = () => {
160
+ let t = !p;
161
+ e === void 0 && d(t), n?.(t);
162
+ };
163
+ return /* @__PURE__ */ i(f, {
164
+ ...c,
165
+ ref: l,
166
+ type: p ? "text" : "password",
167
+ autoComplete: s ?? "current-password",
168
+ endAdornment: /* @__PURE__ */ i("button", {
169
+ className: "lyds-field__utility-button",
170
+ type: "button",
171
+ "aria-label": p ? o : a,
172
+ "aria-pressed": p,
173
+ onClick: m,
174
+ disabled: c.disabled,
175
+ children: /* @__PURE__ */ i(_, { visible: p })
176
+ })
177
+ });
178
+ }), y = r.forwardRef(function({ countrySelector: e, countrySelectorClassName: t, countrySelectorStyle: n, autoComplete: r, inputMode: a, ...o }, s) {
179
+ let c = typeof e == "function" ? e({
180
+ disabled: !!o.disabled,
181
+ readOnly: !!o.readOnly,
182
+ externallyInvalid: !!o.invalid
183
+ }) : e, l = c != null && c !== !1;
184
+ return /* @__PURE__ */ i(d, {
185
+ ...o,
186
+ forwardedRef: s,
187
+ type: "tel",
188
+ technical: !0,
189
+ autoComplete: r ?? "tel",
190
+ inputMode: a ?? "tel",
191
+ ...l ? { countrySelector: c } : {},
192
+ ...t === void 0 ? {} : { countrySelectorClassName: t },
193
+ ...n === void 0 ? {} : { countrySelectorStyle: n }
194
+ });
195
+ });
196
+ //#endregion
197
+ export { v as PasswordField, y as PhoneField, g as SearchField, f as TextField, m as TextView, p as Textarea };
198
+
199
+ //# sourceMappingURL=TextField.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TextField.js","names":[],"sources":["../../../src/components/forms/TextField.tsx"],"sourcesContent":["import { Field as BaseField } from \"@base-ui/react/field\";\nimport { Input as BaseInput } from \"@base-ui/react/input\";\nimport { EyeIcon } from \"@phosphor-icons/react/dist/csr/Eye\";\nimport { EyeSlashIcon } from \"@phosphor-icons/react/dist/csr/EyeSlash\";\nimport { MagnifyingGlassIcon } from \"@phosphor-icons/react/dist/csr/MagnifyingGlass\";\nimport * as React from \"react\";\nimport \"./forms.css\";\nimport { cx, FieldFrame, withStateClassName, type FieldAnatomyProps } from \"./internal\";\n\ntype TextFieldInputProps = Omit<BaseInput.Props, \"className\" | \"disabled\" | \"name\" | \"readOnly\" | \"required\" | \"size\" | \"style\">;\n\nexport interface TextFieldProps extends TextFieldInputProps, FieldAnatomyProps {\n\tinputClassName?: BaseInput.Props[\"className\"];\n\tinputStyle?: React.CSSProperties;\n\t/** 原生 HTML `size` 屬性,並非 Linyao Design System 的視覺尺寸。 */\n\tinputSize?: number;\n\tstartAdornment?: React.ReactNode;\n\tendAdornment?: React.ReactNode;\n\t/** 使用等寬或表格數字排版,不會修改輸入值。 */\n\ttechnical?: boolean;\n}\n\ninterface TextFieldAnatomyProps extends TextFieldProps {\n\tforwardedRef: React.ForwardedRef<HTMLInputElement>;\n\tcountrySelector?: React.ReactNode;\n\tcountrySelectorClassName?: string;\n\tcountrySelectorStyle?: React.CSSProperties;\n}\n\nfunction TextFieldAnatomy({\n\tforwardedRef,\n\tcountrySelector,\n\tcountrySelectorClassName,\n\tcountrySelectorStyle,\n\tlabel,\n\tdescription,\n\terror,\n\tinvalid,\n\tdisabled,\n\treadOnly,\n\trequired,\n\tname,\n\tsize = \"md\",\n\tclassName,\n\tstyle,\n\trequiredIndicator,\n\tvalidate,\n\tvalidationMode,\n\tvalidationDebounceTime,\n\tdirty,\n\ttouched,\n\tactionsRef,\n\tinputClassName,\n\tinputStyle,\n\tinputSize,\n\tstartAdornment,\n\tendAdornment,\n\ttechnical,\n\t\"aria-invalid\": ariaInvalid,\n\t...inputProps\n}: TextFieldAnatomyProps) {\n\tconst control = (\n\t\t<div className={cx(\"lyds-field__control-frame\", countrySelector != null && \"lyds-phone-field__input-frame\")} data-size={size} data-technical={technical || undefined}>\n\t\t\t{startAdornment != null ? <span className=\"lyds-field__adornment lyds-field__adornment--start\">{startAdornment}</span> : null}\n\t\t\t<BaseInput\n\t\t\t\t{...inputProps}\n\t\t\t\tref={forwardedRef}\n\t\t\t\tclassName={withStateClassName<BaseInput.State>(\"lyds-field__input\", inputClassName)}\n\t\t\t\tstyle={inputStyle}\n\t\t\t\tdisabled={disabled}\n\t\t\t\treadOnly={readOnly}\n\t\t\t\trequired={required}\n\t\t\t\tsize={inputSize}\n\t\t\t\taria-invalid={invalid ? true : ariaInvalid}\n\t\t\t/>\n\t\t\t{endAdornment != null ? <span className=\"lyds-field__adornment lyds-field__adornment--end\">{endAdornment}</span> : null}\n\t\t</div>\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{countrySelector != null ? (\n\t\t\t\t<div className=\"lyds-phone-field\">\n\t\t\t\t\t<span\n\t\t\t\t\t\tclassName={cx(\"lyds-phone-field__country\", countrySelectorClassName)}\n\t\t\t\t\t\tstyle={countrySelectorStyle}\n\t\t\t\t\t\taria-disabled={disabled || readOnly || undefined}\n\t\t\t\t\t\tinert={disabled || readOnly || undefined}\n\t\t\t\t\t\tdata-invalid={invalid || undefined}\n\t\t\t\t\t>\n\t\t\t\t\t\t{countrySelector}\n\t\t\t\t\t</span>\n\t\t\t\t\t{control}\n\t\t\t\t</div>\n\t\t\t) : (\n\t\t\t\tcontrol\n\t\t\t)}\n\t\t</FieldFrame>\n\t);\n}\n\nexport const TextField = React.forwardRef<HTMLInputElement, TextFieldProps>(function TextField(props, ref) {\n\treturn <TextFieldAnatomy {...props} forwardedRef={ref} />;\n});\n\nexport interface TextareaProps extends Omit<React.TextareaHTMLAttributes<HTMLTextAreaElement>, \"className\" | \"size\" | \"style\"> {\n\tsize?: FieldAnatomyProps[\"size\"] | undefined;\n\tinvalid?: boolean | undefined;\n\tclassName?: string | undefined;\n\tstyle?: React.CSSProperties | undefined;\n\tonValueChange?: (value: string, eventDetails: BaseField.Control.ChangeEventDetails) => void;\n}\n\nconst TextareaControl = React.forwardRef<HTMLTextAreaElement, TextareaProps>(function TextareaControl(\n\t{ size = \"md\", invalid, disabled, readOnly, required, name, value, defaultValue, onValueChange, className, style, \"aria-invalid\": ariaInvalid, ...props },\n\tref\n) {\n\treturn (\n\t\t<BaseField.Root className=\"lyds-input-root\" name={name} disabled={disabled} invalid={invalid} data-size={size} data-readonly={readOnly || undefined} data-required={required || undefined}>\n\t\t\t<BaseField.Control\n\t\t\t\tref={ref}\n\t\t\t\trender={<textarea {...props} />}\n\t\t\t\tclassName={cx(\"lyds-textarea\", className)}\n\t\t\t\tstyle={style}\n\t\t\t\tdisabled={disabled}\n\t\t\t\treadOnly={readOnly}\n\t\t\t\trequired={required}\n\t\t\t\tvalue={value}\n\t\t\t\tdefaultValue={defaultValue}\n\t\t\t\tonValueChange={onValueChange}\n\t\t\t\taria-invalid={invalid ? true : ariaInvalid}\n\t\t\t\tdata-size={size}\n\t\t\t/>\n\t\t</BaseField.Root>\n\t);\n});\n\n/** 以 Base UI 實作的獨立多行輸入控制項。 */\nexport const Textarea = TextareaControl;\n\nexport interface TextViewProps extends Omit<TextareaProps, \"className\" | \"disabled\" | \"invalid\" | \"name\" | \"readOnly\" | \"required\" | \"size\" | \"style\">, FieldAnatomyProps {\n\ttextareaClassName?: string;\n\ttextareaStyle?: React.CSSProperties;\n}\n\n/** 使用與 TextField 相同結構的完整多行欄位。 */\nexport const TextView = React.forwardRef<HTMLTextAreaElement, TextViewProps>(function TextView(\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\ttextareaClassName,\n\t\ttextareaStyle,\n\t\tvalue,\n\t\tdefaultValue,\n\t\tonValueChange,\n\t\t\"aria-invalid\": ariaInvalid,\n\t\t...textareaProps\n\t},\n\tref\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<BaseField.Control\n\t\t\t\tref={ref}\n\t\t\t\trender={<textarea {...textareaProps} />}\n\t\t\t\tclassName={cx(\"lyds-textarea\", textareaClassName)}\n\t\t\t\tstyle={textareaStyle}\n\t\t\t\tdisabled={disabled}\n\t\t\t\treadOnly={readOnly}\n\t\t\t\trequired={required}\n\t\t\t\tvalue={value}\n\t\t\t\tdefaultValue={defaultValue}\n\t\t\t\tonValueChange={onValueChange}\n\t\t\t\taria-invalid={invalid ? true : ariaInvalid}\n\t\t\t\tdata-size={size}\n\t\t\t/>\n\t\t</FieldFrame>\n\t);\n});\n\nfunction SearchIcon() {\n\treturn <MagnifyingGlassIcon aria-hidden=\"true\" className=\"lyds-field__icon\" weight=\"regular\" />;\n}\n\nexport interface SearchFieldProps extends Omit<TextFieldProps, \"startAdornment\" | \"type\"> {\n\tsearchIcon?: React.ReactNode;\n}\n\nexport const SearchField = React.forwardRef<HTMLInputElement, SearchFieldProps>(function SearchField({ searchIcon, autoComplete, ...props }, ref) {\n\treturn <TextField {...props} ref={ref} type=\"search\" autoComplete={autoComplete ?? \"off\"} startAdornment={searchIcon ?? <SearchIcon />} />;\n});\n\nfunction VisibilityIcon({ visible }: { visible: boolean }) {\n\treturn visible ? <EyeIcon aria-hidden=\"true\" className=\"lyds-field__icon\" weight=\"regular\" /> : <EyeSlashIcon aria-hidden=\"true\" className=\"lyds-field__icon\" weight=\"regular\" />;\n}\n\nexport interface PasswordFieldProps extends Omit<TextFieldProps, \"endAdornment\" | \"type\"> {\n\tvisible?: boolean;\n\tdefaultVisible?: boolean;\n\tonVisibilityChange?: (visible: boolean) => void;\n\tshowPasswordLabel?: string;\n\thidePasswordLabel?: string;\n}\n\nexport const PasswordField = React.forwardRef<HTMLInputElement, PasswordFieldProps>(function PasswordField(\n\t{ visible: visibleProp, defaultVisible = false, onVisibilityChange, showPasswordLabel = \"顯示密碼\", hidePasswordLabel = \"隱藏密碼\", autoComplete, ...props },\n\tref\n) {\n\tconst [uncontrolledVisible, setUncontrolledVisible] = React.useState(defaultVisible);\n\tconst visible = visibleProp ?? uncontrolledVisible;\n\n\tconst toggleVisibility = () => {\n\t\tconst nextVisible = !visible;\n\t\tif (visibleProp === undefined) {\n\t\t\tsetUncontrolledVisible(nextVisible);\n\t\t}\n\t\tonVisibilityChange?.(nextVisible);\n\t};\n\n\treturn (\n\t\t<TextField\n\t\t\t{...props}\n\t\t\tref={ref}\n\t\t\ttype={visible ? \"text\" : \"password\"}\n\t\t\tautoComplete={autoComplete ?? \"current-password\"}\n\t\t\tendAdornment={\n\t\t\t\t<button\n\t\t\t\t\tclassName=\"lyds-field__utility-button\"\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\taria-label={visible ? hidePasswordLabel : showPasswordLabel}\n\t\t\t\t\taria-pressed={visible}\n\t\t\t\t\tonClick={toggleVisibility}\n\t\t\t\t\tdisabled={props.disabled}\n\t\t\t\t>\n\t\t\t\t\t<VisibilityIcon visible={visible} />\n\t\t\t\t</button>\n\t\t\t}\n\t\t/>\n\t);\n});\n\nexport interface PhoneFieldCountrySelectorState {\n\tdisabled: boolean;\n\treadOnly: boolean;\n\t/** 反映由外部控制的 `invalid` 屬性,不代表 Base UI 驗證器產生的狀態。 */\n\texternallyInvalid: boolean;\n}\n\nexport interface PhoneFieldProps extends Omit<TextFieldProps, \"technical\" | \"type\"> {\n\t/**\n\t * 由使用端提供的國家選擇器或其觸發按鈕。提供此插槽後,\n\t * PhoneField 會使用雙區段結構。\n\t */\n\tcountrySelector?: React.ReactNode | ((state: PhoneFieldCountrySelectorState) => React.ReactNode);\n\tcountrySelectorClassName?: string;\n\tcountrySelectorStyle?: React.CSSProperties;\n}\n\n/** 不預設格式的電話欄位。國家選擇與驗證規則由使用端負責。 */\nexport const PhoneField = React.forwardRef<HTMLInputElement, PhoneFieldProps>(function PhoneField(\n\t{ countrySelector, countrySelectorClassName, countrySelectorStyle, autoComplete, inputMode, ...props },\n\tref\n) {\n\tconst resolvedCountrySelector =\n\t\ttypeof countrySelector === \"function\"\n\t\t\t? countrySelector({\n\t\t\t\t\tdisabled: Boolean(props.disabled),\n\t\t\t\t\treadOnly: Boolean(props.readOnly),\n\t\t\t\t\texternallyInvalid: Boolean(props.invalid)\n\t\t\t\t})\n\t\t\t: countrySelector;\n\tconst hasCountrySelector = resolvedCountrySelector !== null && resolvedCountrySelector !== undefined && resolvedCountrySelector !== false;\n\n\treturn (\n\t\t<TextFieldAnatomy\n\t\t\t{...props}\n\t\t\tforwardedRef={ref}\n\t\t\ttype=\"tel\"\n\t\t\ttechnical\n\t\t\tautoComplete={autoComplete ?? \"tel\"}\n\t\t\tinputMode={inputMode ?? \"tel\"}\n\t\t\t{...(hasCountrySelector ? { countrySelector: resolvedCountrySelector } : {})}\n\t\t\t{...(countrySelectorClassName !== undefined ? { countrySelectorClassName } : {})}\n\t\t\t{...(countrySelectorStyle !== undefined ? { countrySelectorStyle } : {})}\n\t\t/>\n\t);\n});\n"],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ export { CodeField, type CodeFieldProps } from './CodeField.js';
2
+ export { DropZone, FileUpload, type DropZoneChangeDetails, type DropZoneProps, type FileUploadProps } from './FileUpload.js';
3
+ export { Input, type InputProps } from './Input.js';
4
+ export type { FieldAnatomyProps, FieldSize, FieldValidationProps } from './internal.js';
5
+ export { NumberField, type NumberFieldProps } from './NumberField.js';
6
+ export { OTPField, type OTPFieldProps } from './OTPField.js';
7
+ export { PasswordField, PhoneField, SearchField, TextField, TextView, Textarea, type PasswordFieldProps, type PhoneFieldCountrySelectorState, type PhoneFieldProps, type SearchFieldProps, type TextFieldProps, type TextViewProps, type TextareaProps } from './TextField.js';
@@ -0,0 +1,33 @@
1
+ import { Field as BaseField } from '@base-ui/react/field';
2
+ import type * as React from "react";
3
+ export type FieldSize = "sm" | "md" | "lg";
4
+ export type FieldValidationProps = Pick<BaseField.Root.Props, "actionsRef" | "dirty" | "touched" | "validate" | "validationDebounceTime" | "validationMode">;
5
+ export interface FieldAnatomyProps extends FieldValidationProps {
6
+ /** 欄位的可見標籤。省略時,請在控制項提供 `aria-label`。 */
7
+ label?: React.ReactNode;
8
+ /** 透過 Base UI Field 與控制項關聯的補充說明。 */
9
+ description?: React.ReactNode;
10
+ /** 透過 Base UI Field 與控制項關聯的驗證訊息。 */
11
+ error?: React.ReactNode;
12
+ /** 將經外部驗證的欄位標記為無效。 */
13
+ invalid?: boolean | undefined;
14
+ disabled?: boolean | undefined;
15
+ readOnly?: boolean | undefined;
16
+ required?: boolean | undefined;
17
+ name?: string | undefined;
18
+ size?: FieldSize | undefined;
19
+ className?: string | undefined;
20
+ style?: React.CSSProperties | undefined;
21
+ /** 顯示於標籤後方的選用在地化註記。 */
22
+ requiredIndicator?: React.ReactNode;
23
+ }
24
+ interface FieldFrameProps extends FieldAnatomyProps {
25
+ children: React.ReactNode;
26
+ labelId?: string | undefined;
27
+ descriptionId?: string | undefined;
28
+ errorId?: string | undefined;
29
+ }
30
+ export declare function cx(...classes: Array<string | false | null | undefined>): string;
31
+ export declare function withStateClassName<State>(baseClassName: string, className: string | ((state: State) => string | undefined) | undefined): string | ((state: State) => string);
32
+ export declare function FieldFrame({ children, label, description, error, invalid, disabled, readOnly, required, name, size, className, style, requiredIndicator, labelId, descriptionId, errorId, validate, validationMode, validationDebounceTime, dirty, touched, actionsRef }: FieldFrameProps): React.JSX.Element;
33
+ export {};
@@ -0,0 +1,61 @@
1
+ import { jsx as e, jsxs as t } from "react/jsx-runtime";
2
+ import { Field as n } from "@base-ui/react/field";
3
+ //#region src/components/forms/internal.tsx
4
+ function r(...e) {
5
+ return e.filter(Boolean).join(" ");
6
+ }
7
+ function i(e, t) {
8
+ return typeof t == "function" ? (n) => r(e, t(n)) : r(e, t);
9
+ }
10
+ function a({ children: i, label: a, description: o, error: s, invalid: c, disabled: l, readOnly: u, required: d, name: f, size: p = "md", className: m, style: h, requiredIndicator: g, labelId: _, descriptionId: v, errorId: y, validate: b, validationMode: x, validationDebounceTime: S, dirty: C, touched: w, actionsRef: T }) {
11
+ return /* @__PURE__ */ t(n.Root, {
12
+ className: r("lyds-field", m),
13
+ style: h,
14
+ name: f,
15
+ disabled: l,
16
+ invalid: c,
17
+ validate: b,
18
+ validationMode: x,
19
+ validationDebounceTime: S,
20
+ dirty: C,
21
+ touched: w,
22
+ actionsRef: T,
23
+ "data-size": p,
24
+ "data-readonly": u || void 0,
25
+ "data-required": d || void 0,
26
+ children: [
27
+ a == null ? null : /* @__PURE__ */ t(n.Label, {
28
+ id: _,
29
+ className: "lyds-field__label",
30
+ children: [/* @__PURE__ */ e("span", { children: a }), d && g != null ? /* @__PURE__ */ e("span", {
31
+ className: "lyds-field__required",
32
+ "aria-hidden": "true",
33
+ children: g
34
+ }) : null]
35
+ }),
36
+ i,
37
+ o == null ? null : /* @__PURE__ */ e(n.Description, {
38
+ id: v,
39
+ className: "lyds-field__description",
40
+ children: o
41
+ }),
42
+ s == null ? /* @__PURE__ */ e(n.Error, {
43
+ id: y,
44
+ className: "lyds-field__error",
45
+ "aria-live": "polite",
46
+ "aria-atomic": "true"
47
+ }) : /* @__PURE__ */ e(n.Error, {
48
+ id: y,
49
+ className: "lyds-field__error",
50
+ match: c ? !0 : void 0,
51
+ "aria-live": "polite",
52
+ "aria-atomic": "true",
53
+ children: s
54
+ })
55
+ ]
56
+ });
57
+ }
58
+ //#endregion
59
+ export { a as FieldFrame, r as cx, i as withStateClassName };
60
+
61
+ //# sourceMappingURL=internal.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"internal.js","names":[],"sources":["../../../src/components/forms/internal.tsx"],"sourcesContent":["import { Field as BaseField } from \"@base-ui/react/field\";\nimport type * as React from \"react\";\n\nexport type FieldSize = \"sm\" | \"md\" | \"lg\";\n\nexport type FieldValidationProps = Pick<BaseField.Root.Props, \"actionsRef\" | \"dirty\" | \"touched\" | \"validate\" | \"validationDebounceTime\" | \"validationMode\">;\n\nexport interface FieldAnatomyProps extends FieldValidationProps {\n\t/** 欄位的可見標籤。省略時,請在控制項提供 `aria-label`。 */\n\tlabel?: React.ReactNode;\n\t/** 透過 Base UI Field 與控制項關聯的補充說明。 */\n\tdescription?: React.ReactNode;\n\t/** 透過 Base UI Field 與控制項關聯的驗證訊息。 */\n\terror?: React.ReactNode;\n\t/** 將經外部驗證的欄位標記為無效。 */\n\tinvalid?: boolean | undefined;\n\tdisabled?: boolean | undefined;\n\treadOnly?: boolean | undefined;\n\trequired?: boolean | undefined;\n\tname?: string | undefined;\n\tsize?: FieldSize | undefined;\n\tclassName?: string | undefined;\n\tstyle?: React.CSSProperties | undefined;\n\t/** 顯示於標籤後方的選用在地化註記。 */\n\trequiredIndicator?: React.ReactNode;\n}\n\ninterface FieldFrameProps extends FieldAnatomyProps {\n\tchildren: React.ReactNode;\n\tlabelId?: string | undefined;\n\tdescriptionId?: string | undefined;\n\terrorId?: string | undefined;\n}\n\nexport function cx(...classes: Array<string | false | null | undefined>): string {\n\treturn classes.filter(Boolean).join(\" \");\n}\n\nexport function withStateClassName<State>(baseClassName: string, className: string | ((state: State) => string | undefined) | undefined): string | ((state: State) => string) {\n\tif (typeof className === \"function\") {\n\t\treturn state => cx(baseClassName, className(state));\n\t}\n\n\treturn cx(baseClassName, className);\n}\n\nexport function FieldFrame({\n\tchildren,\n\tlabel,\n\tdescription,\n\terror,\n\tinvalid,\n\tdisabled,\n\treadOnly,\n\trequired,\n\tname,\n\tsize = \"md\",\n\tclassName,\n\tstyle,\n\trequiredIndicator,\n\tlabelId,\n\tdescriptionId,\n\terrorId,\n\tvalidate,\n\tvalidationMode,\n\tvalidationDebounceTime,\n\tdirty,\n\ttouched,\n\tactionsRef\n}: FieldFrameProps) {\n\treturn (\n\t\t<BaseField.Root\n\t\t\tclassName={cx(\"lyds-field\", className)}\n\t\t\tstyle={style}\n\t\t\tname={name}\n\t\t\tdisabled={disabled}\n\t\t\tinvalid={invalid}\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\tdata-size={size}\n\t\t\tdata-readonly={readOnly || undefined}\n\t\t\tdata-required={required || undefined}\n\t\t>\n\t\t\t{label != null ? (\n\t\t\t\t<BaseField.Label id={labelId} className=\"lyds-field__label\">\n\t\t\t\t\t<span>{label}</span>\n\t\t\t\t\t{required && requiredIndicator != null ? (\n\t\t\t\t\t\t<span className=\"lyds-field__required\" aria-hidden=\"true\">\n\t\t\t\t\t\t\t{requiredIndicator}\n\t\t\t\t\t\t</span>\n\t\t\t\t\t) : null}\n\t\t\t\t</BaseField.Label>\n\t\t\t) : null}\n\t\t\t{children}\n\t\t\t{description != null ? (\n\t\t\t\t<BaseField.Description id={descriptionId} className=\"lyds-field__description\">\n\t\t\t\t\t{description}\n\t\t\t\t</BaseField.Description>\n\t\t\t) : null}\n\t\t\t{error != null ? (\n\t\t\t\t<BaseField.Error id={errorId} className=\"lyds-field__error\" match={invalid ? true : undefined} aria-live=\"polite\" aria-atomic=\"true\">\n\t\t\t\t\t{error}\n\t\t\t\t</BaseField.Error>\n\t\t\t) : (\n\t\t\t\t<BaseField.Error id={errorId} className=\"lyds-field__error\" aria-live=\"polite\" aria-atomic=\"true\" />\n\t\t\t)}\n\t\t</BaseField.Root>\n\t);\n}\n"],"mappings":";;;AAkCA,SAAgB,EAAG,GAAG,GAA2D;CAChF,OAAO,EAAQ,OAAO,OAAO,CAAC,CAAC,KAAK,GAAG;AACxC;AAEA,SAAgB,EAA0B,GAAuB,GAA6G;CAK7K,OAJI,OAAO,KAAc,cACjB,MAAS,EAAG,GAAe,EAAU,CAAK,CAAC,IAG5C,EAAG,GAAe,CAAS;AACnC;AAEA,SAAgB,EAAW,EAC1B,aACA,UACA,gBACA,UACA,YACA,aACA,aACA,aACA,SACA,UAAO,MACP,cACA,UACA,sBACA,YACA,kBACA,YACA,aACA,mBACA,2BACA,UACA,YACA,iBACmB;CACnB,OACC,kBAAC,EAAU,MAAX;EACC,WAAW,EAAG,cAAc,CAAS;EAC9B;EACD;EACI;EACD;EACC;EACM;EACQ;EACjB;EACE;EACG;EACZ,aAAW;EACX,iBAAe,KAAY,KAAA;EAC3B,iBAAe,KAAY,KAAA;EAd5B,UAAA;GAgBE,KAAS,OASN,OARH,kBAAC,EAAU,OAAX;IAAiB,IAAI;IAAS,WAAU;IAAxC,UAAA,CACC,kBAAC,QAAD,EAAA,UAAO,EAAY,CAAA,GAClB,KAAY,KAAqB,OACjC,kBAAC,QAAD;KAAM,WAAU;KAAuB,eAAY;KACjD,UAAA;IACI,CAAA,IACH,IACY;GACd,CAAA;GACH;GACA,KAAe,OAIZ,OAHH,kBAAC,EAAU,aAAX;IAAuB,IAAI;IAAe,WAAU;IAClD,UAAA;GACqB,CAAA;GAEvB,KAAS,OAKT,kBAAC,EAAU,OAAX;IAAiB,IAAI;IAAS,WAAU;IAAoB,aAAU;IAAS,eAAY;GAAQ,CAAA,IAJnG,kBAAC,EAAU,OAAX;IAAiB,IAAI;IAAS,WAAU;IAAoB,OAAO,IAAU,KAAO,KAAA;IAAW,aAAU;IAAS,eAAY;IAC5H,UAAA;GACe,CAAA;EAIH;;AAElB"}
@@ -0,0 +1,33 @@
1
+ import { AvatarImageProps, AvatarRootProps, ImageLoadingStatus } from '@base-ui/react/avatar';
2
+ import * as React from "react";
3
+ export type AvatarSize = "xs" | "sm" | "md" | "lg" | "xl";
4
+ export type AvatarVariant = "neutral" | "accent";
5
+ export type AvatarStatus = "online" | "away" | "busy" | "offline";
6
+ export interface AvatarBaseProps extends Omit<AvatarRootProps, "children" | "className" | "style"> {
7
+ src?: string;
8
+ alt: string;
9
+ fallback?: React.ReactNode;
10
+ fallbackDelay?: number;
11
+ size?: AvatarSize;
12
+ variant?: AvatarVariant;
13
+ imageProps?: Omit<AvatarImageProps, "alt" | "className" | "onLoadingStatusChange" | "src"> & {
14
+ className?: string;
15
+ };
16
+ onLoadingStatusChange?: (status: ImageLoadingStatus) => void;
17
+ className?: string;
18
+ style?: React.CSSProperties;
19
+ }
20
+ export type AvatarProps = AvatarBaseProps & ({
21
+ status?: never;
22
+ statusLabel?: never;
23
+ } | {
24
+ status: AvatarStatus;
25
+ statusLabel: string;
26
+ });
27
+ export declare const Avatar: React.ForwardRefExoticComponent<(Omit<AvatarBaseProps & {
28
+ status?: never;
29
+ statusLabel?: never;
30
+ }, "ref"> | Omit<AvatarBaseProps & {
31
+ status: AvatarStatus;
32
+ statusLabel: string;
33
+ }, "ref">) & React.RefAttributes<HTMLSpanElement>>;
@@ -0,0 +1,45 @@
1
+ import { mergeClassNames as e } from "./shared.js";
2
+ import * as t from "react";
3
+ import { jsx as n, jsxs as r } from "react/jsx-runtime";
4
+ import { Avatar as i } from "@base-ui/react/avatar";
5
+ //#region src/components/foundations/Avatar.tsx
6
+ function a(e) {
7
+ return e.trim().split(/\s+/u).slice(0, 2).map((e) => Array.from(e)[0] ?? "").join("").toUpperCase();
8
+ }
9
+ var o = t.forwardRef(function({ src: t, alt: o, fallback: s, fallbackDelay: c, size: l = "md", variant: u = "neutral", status: d, statusLabel: f, imageProps: p, onLoadingStatusChange: m, className: h, style: g, ..._ }, v) {
10
+ let y = f ? `${o}, ${f}` : o;
11
+ return /* @__PURE__ */ r(i.Root, {
12
+ ..._,
13
+ ref: v,
14
+ "aria-label": _["aria-label"] ?? y,
15
+ role: _.role ?? "img",
16
+ "data-size": l,
17
+ "data-variant": u,
18
+ className: e("lyds-avatar", h),
19
+ style: g,
20
+ children: [
21
+ t ? /* @__PURE__ */ n(i.Image, {
22
+ ...p,
23
+ src: t,
24
+ alt: "",
25
+ className: e("lyds-avatar__image", p?.className),
26
+ onLoadingStatusChange: m
27
+ }) : null,
28
+ /* @__PURE__ */ n(i.Fallback, {
29
+ className: "lyds-avatar__fallback",
30
+ delay: c,
31
+ children: s ?? a(o)
32
+ }),
33
+ d ? /* @__PURE__ */ n("span", {
34
+ className: "lyds-avatar__status",
35
+ "data-status": d,
36
+ "aria-hidden": "true"
37
+ }) : null
38
+ ]
39
+ });
40
+ });
41
+ o.displayName = "Avatar";
42
+ //#endregion
43
+ export { o as Avatar };
44
+
45
+ //# sourceMappingURL=Avatar.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Avatar.js","names":[],"sources":["../../../src/components/foundations/Avatar.tsx"],"sourcesContent":["import { Avatar as BaseAvatar, type AvatarImageProps, type AvatarRootProps, type ImageLoadingStatus } from \"@base-ui/react/avatar\";\nimport * as React from \"react\";\nimport { mergeClassNames } from \"./shared\";\n\nexport type AvatarSize = \"xs\" | \"sm\" | \"md\" | \"lg\" | \"xl\";\nexport type AvatarVariant = \"neutral\" | \"accent\";\nexport type AvatarStatus = \"online\" | \"away\" | \"busy\" | \"offline\";\n\nexport interface AvatarBaseProps extends Omit<AvatarRootProps, \"children\" | \"className\" | \"style\"> {\n\tsrc?: string;\n\talt: string;\n\tfallback?: React.ReactNode;\n\tfallbackDelay?: number;\n\tsize?: AvatarSize;\n\tvariant?: AvatarVariant;\n\timageProps?: Omit<AvatarImageProps, \"alt\" | \"className\" | \"onLoadingStatusChange\" | \"src\"> & { className?: string };\n\tonLoadingStatusChange?: (status: ImageLoadingStatus) => void;\n\tclassName?: string;\n\tstyle?: React.CSSProperties;\n}\n\nexport type AvatarProps = AvatarBaseProps & ({ status?: never; statusLabel?: never } | { status: AvatarStatus; statusLabel: string });\n\nfunction getInitials(label: string): string {\n\treturn label\n\t\t.trim()\n\t\t.split(/\\s+/u)\n\t\t.slice(0, 2)\n\t\t.map(part => Array.from(part)[0] ?? \"\")\n\t\t.join(\"\")\n\t\t.toUpperCase();\n}\n\nexport const Avatar = React.forwardRef<HTMLSpanElement, AvatarProps>(function Avatar(\n\t{ src, alt, fallback, fallbackDelay, size = \"md\", variant = \"neutral\", status, statusLabel, imageProps, onLoadingStatusChange, className, style, ...props },\n\tref\n) {\n\tconst accessibleLabel = statusLabel ? `${alt}, ${statusLabel}` : alt;\n\n\treturn (\n\t\t<BaseAvatar.Root\n\t\t\t{...props}\n\t\t\tref={ref}\n\t\t\taria-label={props[\"aria-label\"] ?? accessibleLabel}\n\t\t\trole={props.role ?? \"img\"}\n\t\t\tdata-size={size}\n\t\t\tdata-variant={variant}\n\t\t\tclassName={mergeClassNames(\"lyds-avatar\", className)}\n\t\t\tstyle={style}\n\t\t>\n\t\t\t{src ? <BaseAvatar.Image {...imageProps} src={src} alt=\"\" className={mergeClassNames(\"lyds-avatar__image\", imageProps?.className)} onLoadingStatusChange={onLoadingStatusChange} /> : null}\n\t\t\t<BaseAvatar.Fallback className=\"lyds-avatar__fallback\" delay={fallbackDelay}>\n\t\t\t\t{fallback ?? getInitials(alt)}\n\t\t\t</BaseAvatar.Fallback>\n\t\t\t{status ? <span className=\"lyds-avatar__status\" data-status={status} aria-hidden=\"true\" /> : null}\n\t\t</BaseAvatar.Root>\n\t);\n});\n\nAvatar.displayName = \"Avatar\";\n"],"mappings":";;;;;AAuBA,SAAS,EAAY,GAAuB;CAC3C,OAAO,EACL,KAAK,CAAC,CACN,MAAM,MAAM,CAAC,CACb,MAAM,GAAG,CAAC,CAAC,CACX,KAAI,MAAQ,MAAM,KAAK,CAAI,CAAC,CAAC,MAAM,EAAE,CAAC,CACtC,KAAK,EAAE,CAAC,CACR,YAAY;AACf;AAEA,IAAa,IAAS,EAAM,WAAyC,SACpE,EAAE,QAAK,QAAK,aAAU,kBAAe,UAAO,MAAM,aAAU,WAAW,WAAQ,gBAAa,eAAY,0BAAuB,cAAW,UAAO,GAAG,KACpJ,GACC;CACD,IAAM,IAAkB,IAAc,GAAG,EAAI,IAAI,MAAgB;CAEjE,OACC,kBAAC,EAAW,MAAZ;EACC,GAAI;EACC;EACL,cAAY,EAAM,iBAAiB;EACnC,MAAM,EAAM,QAAQ;EACpB,aAAW;EACX,gBAAc;EACd,WAAW,EAAgB,eAAe,CAAS;EAC5C;EARR,UAAA;GAUE,IAAM,kBAAC,EAAW,OAAZ;IAAkB,GAAI;IAAiB;IAAK,KAAI;IAAG,WAAW,EAAgB,sBAAsB,GAAY,SAAS;IAA0B;GAAwB,CAAA,IAAI;GACtL,kBAAC,EAAW,UAAZ;IAAqB,WAAU;IAAwB,OAAO;IAC5D,UAAA,KAAY,EAAY,CAAG;GACR,CAAA;GACpB,IAAS,kBAAC,QAAD;IAAM,WAAU;IAAsB,eAAa;IAAQ,eAAY;GAAQ,CAAA,IAAI;EAC7E;;AAEnB,CAAC;AAED,EAAO,cAAc"}
@@ -0,0 +1,15 @@
1
+ import { ComponentRenderProp, ElementProps } from './shared.js';
2
+ import * as React from "react";
3
+ export type BadgeVariant = "neutral" | "accent" | "success" | "warning" | "danger";
4
+ export type BadgeSize = "sm" | "md";
5
+ export interface BadgeState extends Record<string, unknown> {
6
+ size: BadgeSize;
7
+ variant: BadgeVariant;
8
+ }
9
+ export interface BadgeProps extends Omit<ElementProps<"span">, "children"> {
10
+ children: React.ReactNode;
11
+ variant?: BadgeVariant;
12
+ size?: BadgeSize;
13
+ render?: ComponentRenderProp<BadgeState>;
14
+ }
15
+ export declare const Badge: React.ForwardRefExoticComponent<BadgeProps & React.RefAttributes<HTMLSpanElement>>;
@@ -0,0 +1,32 @@
1
+ import { mergeClassNames as e } from "./shared.js";
2
+ import * as t from "react";
3
+ import { Fragment as n, jsx as r, jsxs as i } from "react/jsx-runtime";
4
+ import { useRender as a } from "@base-ui/react/use-render";
5
+ //#region src/components/foundations/Badge.tsx
6
+ var o = t.forwardRef(function({ children: t, variant: o = "neutral", size: s = "md", render: c, className: l, ...u }, d) {
7
+ return a({
8
+ defaultTagName: "span",
9
+ ref: d,
10
+ render: c,
11
+ state: {
12
+ size: s,
13
+ variant: o
14
+ },
15
+ props: {
16
+ ...u,
17
+ children: /* @__PURE__ */ i(n, { children: [/* @__PURE__ */ r("span", {
18
+ className: "lyds-badge__indicator",
19
+ "aria-hidden": "true"
20
+ }), /* @__PURE__ */ r("span", {
21
+ className: "lyds-badge__label",
22
+ children: t
23
+ })] }),
24
+ className: e("lyds-badge", l)
25
+ }
26
+ });
27
+ });
28
+ o.displayName = "Badge";
29
+ //#endregion
30
+ export { o as Badge };
31
+
32
+ //# sourceMappingURL=Badge.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Badge.js","names":[],"sources":["../../../src/components/foundations/Badge.tsx"],"sourcesContent":["import { useRender } from \"@base-ui/react/use-render\";\nimport * as React from \"react\";\nimport { type ComponentRenderProp, type ElementProps, mergeClassNames } from \"./shared\";\n\nexport type BadgeVariant = \"neutral\" | \"accent\" | \"success\" | \"warning\" | \"danger\";\nexport type BadgeSize = \"sm\" | \"md\";\n\nexport interface BadgeState extends Record<string, unknown> {\n\tsize: BadgeSize;\n\tvariant: BadgeVariant;\n}\n\nexport interface BadgeProps extends Omit<ElementProps<\"span\">, \"children\"> {\n\tchildren: React.ReactNode;\n\tvariant?: BadgeVariant;\n\tsize?: BadgeSize;\n\trender?: ComponentRenderProp<BadgeState>;\n}\n\nexport const Badge = React.forwardRef<HTMLSpanElement, BadgeProps>(function Badge({ children, variant = \"neutral\", size = \"md\", render, className, ...props }, ref) {\n\treturn useRender<BadgeState, HTMLSpanElement>({\n\t\tdefaultTagName: \"span\",\n\t\tref,\n\t\trender,\n\t\tstate: { size, variant },\n\t\tprops: {\n\t\t\t...props,\n\t\t\tchildren: (\n\t\t\t\t<>\n\t\t\t\t\t<span className=\"lyds-badge__indicator\" aria-hidden=\"true\" />\n\t\t\t\t\t<span className=\"lyds-badge__label\">{children}</span>\n\t\t\t\t</>\n\t\t\t),\n\t\t\tclassName: mergeClassNames(\"lyds-badge\", className)\n\t\t}\n\t});\n});\n\nBadge.displayName = \"Badge\";\n"],"mappings":";;;;;AAmBA,IAAa,IAAQ,EAAM,WAAwC,SAAe,EAAE,aAAU,aAAU,WAAW,UAAO,MAAM,WAAQ,cAAW,GAAG,KAAS,GAAK;CACnK,OAAO,EAAuC;EAC7C,gBAAgB;EAChB;EACA;EACA,OAAO;GAAE;GAAM;EAAQ;EACvB,OAAO;GACN,GAAG;GACH,UACC,kBAAA,GAAA,EAAA,UAAA,CACC,kBAAC,QAAD;IAAM,WAAU;IAAwB,eAAY;GAAQ,CAAA,GAC5D,kBAAC,QAAD;IAAM,WAAU;IAAqB;GAAe,CAAA,CACnD,EAAA,CAAA;GAEH,WAAW,EAAgB,cAAc,CAAS;EACnD;CACD,CAAC;AACF,CAAC;AAED,EAAM,cAAc"}
@@ -0,0 +1,18 @@
1
+ import { ButtonProps as BaseButtonProps } from '@base-ui/react/button';
2
+ import * as React from "react";
3
+ export type ButtonVariant = "primary" | "secondary" | "neutral" | "quiet" | "danger";
4
+ export type ButtonSize = "sm" | "md" | "lg";
5
+ export interface ButtonProps extends Omit<BaseButtonProps, "children" | "className" | "style"> {
6
+ children: React.ReactNode;
7
+ variant?: ButtonVariant;
8
+ size?: ButtonSize;
9
+ loading?: boolean;
10
+ loadingIndicator?: React.ReactNode;
11
+ /** 裝飾性的前置圖示。請使用 @phosphor-icons/react;按鈕文字仍是無障礙名稱。 */
12
+ startIcon?: React.ReactNode;
13
+ /** 裝飾性的後置圖示。請使用 @phosphor-icons/react;按鈕文字仍是無障礙名稱。 */
14
+ endIcon?: React.ReactNode;
15
+ className?: string;
16
+ style?: React.CSSProperties;
17
+ }
18
+ export declare const Button: React.ForwardRefExoticComponent<Omit<ButtonProps, "ref"> & React.RefAttributes<HTMLElement>>;
@@ -0,0 +1,47 @@
1
+ import { mergeClassNames as e } from "./shared.js";
2
+ import * as t from "react";
3
+ import { jsx as n, jsxs as r } from "react/jsx-runtime";
4
+ import { Button as i } from "@base-ui/react/button";
5
+ //#region src/components/foundations/Button.tsx
6
+ var a = t.forwardRef(function({ children: t, variant: a = "primary", size: o = "md", loading: s = !1, loadingIndicator: c, startIcon: l, endIcon: u, className: d, disabled: f = !1, focusableWhenDisabled: p, type: m, nativeButton: h, style: g, ..._ }, v) {
7
+ let y = f || s;
8
+ return /* @__PURE__ */ r(i, {
9
+ ..._,
10
+ ref: v,
11
+ nativeButton: h,
12
+ type: m ?? (h === !1 ? void 0 : "button"),
13
+ disabled: y,
14
+ focusableWhenDisabled: p ?? s,
15
+ "aria-busy": s || void 0,
16
+ "data-loading": s ? "" : void 0,
17
+ "data-variant": a,
18
+ "data-size": o,
19
+ className: e("lyds-button", d),
20
+ style: g,
21
+ children: [
22
+ s ? /* @__PURE__ */ n("span", {
23
+ className: "lyds-button__spinner",
24
+ "aria-hidden": "true",
25
+ children: c
26
+ }) : l ? /* @__PURE__ */ n("span", {
27
+ className: "lyds-button__icon",
28
+ "aria-hidden": "true",
29
+ children: l
30
+ }) : null,
31
+ /* @__PURE__ */ n("span", {
32
+ className: "lyds-button__label",
33
+ children: t
34
+ }),
35
+ !s && u ? /* @__PURE__ */ n("span", {
36
+ className: "lyds-button__icon",
37
+ "aria-hidden": "true",
38
+ children: u
39
+ }) : null
40
+ ]
41
+ });
42
+ });
43
+ a.displayName = "Button";
44
+ //#endregion
45
+ export { a as Button };
46
+
47
+ //# sourceMappingURL=Button.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Button.js","names":[],"sources":["../../../src/components/foundations/Button.tsx"],"sourcesContent":["import { Button as BaseButton, type ButtonProps as BaseButtonProps } from \"@base-ui/react/button\";\nimport * as React from \"react\";\nimport { mergeClassNames } from \"./shared\";\n\nexport type ButtonVariant = \"primary\" | \"secondary\" | \"neutral\" | \"quiet\" | \"danger\";\nexport type ButtonSize = \"sm\" | \"md\" | \"lg\";\n\nexport interface ButtonProps extends Omit<BaseButtonProps, \"children\" | \"className\" | \"style\"> {\n\tchildren: React.ReactNode;\n\tvariant?: ButtonVariant;\n\tsize?: ButtonSize;\n\tloading?: boolean;\n\tloadingIndicator?: React.ReactNode;\n\t/** 裝飾性的前置圖示。請使用 @phosphor-icons/react;按鈕文字仍是無障礙名稱。 */\n\tstartIcon?: React.ReactNode;\n\t/** 裝飾性的後置圖示。請使用 @phosphor-icons/react;按鈕文字仍是無障礙名稱。 */\n\tendIcon?: React.ReactNode;\n\tclassName?: string;\n\tstyle?: React.CSSProperties;\n}\n\nexport const Button = React.forwardRef<HTMLElement, ButtonProps>(function Button(\n\t{ children, variant = \"primary\", size = \"md\", loading = false, loadingIndicator, startIcon, endIcon, className, disabled = false, focusableWhenDisabled, type, nativeButton, style, ...props },\n\tref\n) {\n\tconst isDisabled = disabled || loading;\n\n\treturn (\n\t\t<BaseButton\n\t\t\t{...props}\n\t\t\tref={ref}\n\t\t\tnativeButton={nativeButton}\n\t\t\ttype={type ?? (nativeButton === false ? undefined : \"button\")}\n\t\t\tdisabled={isDisabled}\n\t\t\tfocusableWhenDisabled={focusableWhenDisabled ?? loading}\n\t\t\taria-busy={loading || undefined}\n\t\t\tdata-loading={loading ? \"\" : undefined}\n\t\t\tdata-variant={variant}\n\t\t\tdata-size={size}\n\t\t\tclassName={mergeClassNames(\"lyds-button\", className)}\n\t\t\tstyle={style}\n\t\t>\n\t\t\t{loading ? (\n\t\t\t\t<span className=\"lyds-button__spinner\" aria-hidden=\"true\">\n\t\t\t\t\t{loadingIndicator}\n\t\t\t\t</span>\n\t\t\t) : startIcon ? (\n\t\t\t\t<span className=\"lyds-button__icon\" aria-hidden=\"true\">\n\t\t\t\t\t{startIcon}\n\t\t\t\t</span>\n\t\t\t) : null}\n\t\t\t<span className=\"lyds-button__label\">{children}</span>\n\t\t\t{!loading && endIcon ? (\n\t\t\t\t<span className=\"lyds-button__icon\" aria-hidden=\"true\">\n\t\t\t\t\t{endIcon}\n\t\t\t\t</span>\n\t\t\t) : null}\n\t\t</BaseButton>\n\t);\n});\n\nButton.displayName = \"Button\";\n"],"mappings":";;;;;AAqBA,IAAa,IAAS,EAAM,WAAqC,SAChE,EAAE,aAAU,aAAU,WAAW,UAAO,MAAM,aAAU,IAAO,qBAAkB,cAAW,YAAS,cAAW,cAAW,IAAO,0BAAuB,SAAM,iBAAc,UAAO,GAAG,KACvL,GACC;CACD,IAAM,IAAa,KAAY;CAE/B,OACC,kBAAC,GAAD;EACC,GAAI;EACC;EACS;EACd,MAAM,MAAS,MAAiB,KAAQ,KAAA,IAAY;EACpD,UAAU;EACV,uBAAuB,KAAyB;EAChD,aAAW,KAAW,KAAA;EACtB,gBAAc,IAAU,KAAK,KAAA;EAC7B,gBAAc;EACd,aAAW;EACX,WAAW,EAAgB,eAAe,CAAS;EAC5C;EAZR,UAAA;GAcE,IACA,kBAAC,QAAD;IAAM,WAAU;IAAuB,eAAY;IACjD,UAAA;GACI,CAAA,IACH,IACH,kBAAC,QAAD;IAAM,WAAU;IAAoB,eAAY;IAC9C,UAAA;GACI,CAAA,IACH;GACJ,kBAAC,QAAD;IAAM,WAAU;IAAsB;GAAe,CAAA;GACpD,CAAC,KAAW,IACZ,kBAAC,QAAD;IAAM,WAAU;IAAoB,eAAY;IAC9C,UAAA;GACI,CAAA,IACH;EACO;;AAEd,CAAC;AAED,EAAO,cAAc"}