@linyao.tw/ui 0.0.0-snapshot.07df57
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +201 -0
- package/README.md +85 -0
- package/dist/components/date-time/calendar.d.ts +20 -0
- package/dist/components/date-time/calendar.js +102 -0
- package/dist/components/date-time/calendar.js.map +1 -0
- package/dist/components/date-time/date-field.d.ts +11 -0
- package/dist/components/date-time/date-field.js +44 -0
- package/dist/components/date-time/date-field.js.map +1 -0
- package/dist/components/date-time/date-picker.d.ts +28 -0
- package/dist/components/date-time/date-picker.js +74 -0
- package/dist/components/date-time/date-picker.js.map +1 -0
- package/dist/components/date-time/date-range-picker.d.ts +11 -0
- package/dist/components/date-time/date-range-picker.js +79 -0
- package/dist/components/date-time/date-range-picker.js.map +1 -0
- package/dist/components/date-time/date-types.d.ts +110 -0
- package/dist/components/date-time/index.d.ts +8 -0
- package/dist/components/date-time/index.js +8 -0
- package/dist/components/date-time/shared.d.ts +25 -0
- package/dist/components/date-time/shared.js +53 -0
- package/dist/components/date-time/shared.js.map +1 -0
- package/dist/components/date-time/time-field.d.ts +13 -0
- package/dist/components/date-time/time-field.js +52 -0
- package/dist/components/date-time/time-field.js.map +1 -0
- package/dist/components/feedback/alert.d.ts +21 -0
- package/dist/components/feedback/alert.js +44 -0
- package/dist/components/feedback/alert.js.map +1 -0
- package/dist/components/feedback/banner.d.ts +8 -0
- package/dist/components/feedback/banner.js +20 -0
- package/dist/components/feedback/banner.js.map +1 -0
- package/dist/components/feedback/empty-state.d.ts +12 -0
- package/dist/components/feedback/empty-state.js +48 -0
- package/dist/components/feedback/empty-state.js.map +1 -0
- package/dist/components/feedback/feedback.module.js +42 -0
- package/dist/components/feedback/feedback.module.js.map +1 -0
- package/dist/components/feedback/feedback.types.d.ts +8 -0
- package/dist/components/feedback/feedback.types.js +24 -0
- package/dist/components/feedback/feedback.types.js.map +1 -0
- package/dist/components/feedback/index.d.ts +9 -0
- package/dist/components/feedback/meter.d.ts +12 -0
- package/dist/components/feedback/meter.js +28 -0
- package/dist/components/feedback/meter.js.map +1 -0
- package/dist/components/feedback/progress.d.ts +12 -0
- package/dist/components/feedback/progress.js +28 -0
- package/dist/components/feedback/progress.js.map +1 -0
- package/dist/components/feedback/skeleton.d.ts +5 -0
- package/dist/components/feedback/skeleton.js +18 -0
- package/dist/components/feedback/skeleton.js.map +1 -0
- package/dist/components/feedback/spinner.d.ts +23 -0
- package/dist/components/feedback/spinner.js +35 -0
- package/dist/components/feedback/spinner.js.map +1 -0
- package/dist/components/feedback/toast.d.ts +33 -0
- package/dist/components/feedback/toast.js +76 -0
- package/dist/components/feedback/toast.js.map +1 -0
- package/dist/components/forms/CodeField.d.ts +23 -0
- package/dist/components/forms/CodeField.js +63 -0
- package/dist/components/forms/CodeField.js.map +1 -0
- package/dist/components/forms/FileUpload.d.ts +34 -0
- package/dist/components/forms/FileUpload.js +319 -0
- package/dist/components/forms/FileUpload.js.map +1 -0
- package/dist/components/forms/Input.d.ts +14 -0
- package/dist/components/forms/Input.js +33 -0
- package/dist/components/forms/Input.js.map +1 -0
- package/dist/components/forms/NumberField.d.ts +15 -0
- package/dist/components/forms/NumberField.js +71 -0
- package/dist/components/forms/NumberField.js.map +1 -0
- package/dist/components/forms/OTPField.d.ts +15 -0
- package/dist/components/forms/OTPField.js +54 -0
- package/dist/components/forms/OTPField.js.map +1 -0
- package/dist/components/forms/TextField.d.ts +61 -0
- package/dist/components/forms/TextField.js +199 -0
- package/dist/components/forms/TextField.js.map +1 -0
- package/dist/components/forms/index.d.ts +7 -0
- package/dist/components/forms/internal.d.ts +33 -0
- package/dist/components/forms/internal.js +61 -0
- package/dist/components/forms/internal.js.map +1 -0
- package/dist/components/foundations/Avatar.d.ts +33 -0
- package/dist/components/foundations/Avatar.js +45 -0
- package/dist/components/foundations/Avatar.js.map +1 -0
- package/dist/components/foundations/Badge.d.ts +15 -0
- package/dist/components/foundations/Badge.js +32 -0
- package/dist/components/foundations/Badge.js.map +1 -0
- package/dist/components/foundations/Button.d.ts +18 -0
- package/dist/components/foundations/Button.js +47 -0
- package/dist/components/foundations/Button.js.map +1 -0
- package/dist/components/foundations/Card.d.ts +47 -0
- package/dist/components/foundations/Card.js +57 -0
- package/dist/components/foundations/Card.js.map +1 -0
- package/dist/components/foundations/IconButton.d.ts +25 -0
- package/dist/components/foundations/IconButton.js +19 -0
- package/dist/components/foundations/IconButton.js.map +1 -0
- package/dist/components/foundations/Link.d.ts +19 -0
- package/dist/components/foundations/Link.js +40 -0
- package/dist/components/foundations/Link.js.map +1 -0
- package/dist/components/foundations/ListCell.d.ts +68 -0
- package/dist/components/foundations/ListCell.js +105 -0
- package/dist/components/foundations/ListCell.js.map +1 -0
- package/dist/components/foundations/SectionHeading.d.ts +17 -0
- package/dist/components/foundations/SectionHeading.js +50 -0
- package/dist/components/foundations/SectionHeading.js.map +1 -0
- package/dist/components/foundations/Separator.d.ts +11 -0
- package/dist/components/foundations/Separator.js +21 -0
- package/dist/components/foundations/Separator.js.map +1 -0
- package/dist/components/foundations/index.d.ts +9 -0
- package/dist/components/foundations/shared.d.ts +5 -0
- package/dist/components/foundations/shared.js +8 -0
- package/dist/components/foundations/shared.js.map +1 -0
- package/dist/components/navigation-data/breadcrumb-pagination.d.ts +34 -0
- package/dist/components/navigation-data/breadcrumb-pagination.js +161 -0
- package/dist/components/navigation-data/breadcrumb-pagination.js.map +1 -0
- package/dist/components/navigation-data/command-palette.d.ts +35 -0
- package/dist/components/navigation-data/command-palette.js +151 -0
- package/dist/components/navigation-data/command-palette.js.map +1 -0
- package/dist/components/navigation-data/header-tab-bar.d.ts +23 -0
- package/dist/components/navigation-data/header-tab-bar.js +102 -0
- package/dist/components/navigation-data/header-tab-bar.js.map +1 -0
- package/dist/components/navigation-data/index.d.ts +7 -0
- package/dist/components/navigation-data/menubar-toolbar.d.ts +26 -0
- package/dist/components/navigation-data/menubar-toolbar.js +161 -0
- package/dist/components/navigation-data/menubar-toolbar.js.map +1 -0
- package/dist/components/navigation-data/navigation-menu.d.ts +14 -0
- package/dist/components/navigation-data/navigation-menu.js +87 -0
- package/dist/components/navigation-data/navigation-menu.js.map +1 -0
- package/dist/components/navigation-data/scroll-area.d.ts +6 -0
- package/dist/components/navigation-data/scroll-area.js +52 -0
- package/dist/components/navigation-data/scroll-area.js.map +1 -0
- package/dist/components/navigation-data/table-collection.d.ts +61 -0
- package/dist/components/navigation-data/table-collection.js +181 -0
- package/dist/components/navigation-data/table-collection.js.map +1 -0
- package/dist/components/navigation-data/utils.d.ts +2 -0
- package/dist/components/navigation-data/utils.js +11 -0
- package/dist/components/navigation-data/utils.js.map +1 -0
- package/dist/components/overlays/class-names.d.ts +6 -0
- package/dist/components/overlays/class-names.js +11 -0
- package/dist/components/overlays/class-names.js.map +1 -0
- package/dist/components/overlays/dialog.d.ts +98 -0
- package/dist/components/overlays/dialog.js +158 -0
- package/dist/components/overlays/dialog.js.map +1 -0
- package/dist/components/overlays/disclosure.d.ts +40 -0
- package/dist/components/overlays/disclosure.js +138 -0
- package/dist/components/overlays/disclosure.js.map +1 -0
- package/dist/components/overlays/drawer.d.ts +88 -0
- package/dist/components/overlays/drawer.js +192 -0
- package/dist/components/overlays/drawer.js.map +1 -0
- package/dist/components/overlays/floating.d.ts +83 -0
- package/dist/components/overlays/floating.js +220 -0
- package/dist/components/overlays/floating.js.map +1 -0
- package/dist/components/overlays/index.d.ts +4 -0
- package/dist/components/selection/classnames.d.ts +4 -0
- package/dist/components/selection/classnames.js +14 -0
- package/dist/components/selection/classnames.js.map +1 -0
- package/dist/components/selection/combobox.d.ts +118 -0
- package/dist/components/selection/combobox.js +284 -0
- package/dist/components/selection/combobox.js.map +1 -0
- package/dist/components/selection/controls.d.ts +65 -0
- package/dist/components/selection/controls.js +171 -0
- package/dist/components/selection/controls.js.map +1 -0
- package/dist/components/selection/index.d.ts +7 -0
- package/dist/components/selection/menu.d.ts +87 -0
- package/dist/components/selection/menu.js +157 -0
- package/dist/components/selection/menu.js.map +1 -0
- package/dist/components/selection/select.d.ts +55 -0
- package/dist/components/selection/select.js +138 -0
- package/dist/components/selection/select.js.map +1 -0
- package/dist/components/selection/selection.module.js +51 -0
- package/dist/components/selection/selection.module.js.map +1 -0
- package/dist/index.d.ts +7 -0
- package/dist/index.js +52 -0
- package/dist/styles.css +2 -0
- package/package.json +74 -0
|
@@ -0,0 +1,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"}
|