@echojs-ecosystem/ui 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +102 -0
- package/dist/button.d.ts +20 -0
- package/dist/button.js +559 -0
- package/dist/button.js.map +1 -0
- package/dist/button.types-B0SrEYRV.d.ts +27 -0
- package/dist/checkbox.d.ts +42 -0
- package/dist/checkbox.js +388 -0
- package/dist/checkbox.js.map +1 -0
- package/dist/cn-rGlUI2mx.d.ts +16 -0
- package/dist/core.d.ts +16 -0
- package/dist/core.js +294 -0
- package/dist/core.js.map +1 -0
- package/dist/field.d.ts +72 -0
- package/dist/field.js +479 -0
- package/dist/field.js.map +1 -0
- package/dist/field.types-BSyhu0Cf.d.ts +24 -0
- package/dist/icon-button.d.ts +15 -0
- package/dist/icon-button.js +606 -0
- package/dist/icon-button.js.map +1 -0
- package/dist/index-BhC5sVej.d.ts +35 -0
- package/dist/index.d.ts +87 -0
- package/dist/index.js +1604 -0
- package/dist/index.js.map +1 -0
- package/dist/input-mask.d.ts +5 -0
- package/dist/input-mask.js +568 -0
- package/dist/input-mask.js.map +1 -0
- package/dist/input-otp.d.ts +16 -0
- package/dist/input-otp.js +475 -0
- package/dist/input-otp.js.map +1 -0
- package/dist/input-tags.d.ts +16 -0
- package/dist/input-tags.js +549 -0
- package/dist/input-tags.js.map +1 -0
- package/dist/input.d.ts +14 -0
- package/dist/input.js +466 -0
- package/dist/input.js.map +1 -0
- package/dist/label.d.ts +17 -0
- package/dist/label.js +345 -0
- package/dist/label.js.map +1 -0
- package/dist/primitives.d.ts +23 -0
- package/dist/primitives.js +301 -0
- package/dist/primitives.js.map +1 -0
- package/dist/provider.d.ts +19 -0
- package/dist/provider.js +124 -0
- package/dist/provider.js.map +1 -0
- package/dist/slots-D2y1YgGz.d.ts +58 -0
- package/dist/textarea.d.ts +27 -0
- package/dist/textarea.js +361 -0
- package/dist/textarea.js.map +1 -0
- package/dist/theme-context-CyY95LK0.d.ts +39 -0
- package/dist/theme.d.ts +20 -0
- package/dist/theme.js +155 -0
- package/dist/theme.js.map +1 -0
- package/dist/types-CSHcGa_F.d.ts +13 -0
- package/dist/utils.d.ts +36 -0
- package/dist/utils.js +101 -0
- package/dist/utils.js.map +1 -0
- package/dist/variants-Bj38CFcH.d.ts +51 -0
- package/package.json +134 -0
package/dist/field.js
ADDED
|
@@ -0,0 +1,479 @@
|
|
|
1
|
+
import { h } from '@echojs-ecosystem/hyperdom';
|
|
2
|
+
|
|
3
|
+
// src/components/field/field.ts
|
|
4
|
+
|
|
5
|
+
// src/theme/default-theme.ts
|
|
6
|
+
var defaultTheme = {
|
|
7
|
+
prefix: "echo",
|
|
8
|
+
headless: false,
|
|
9
|
+
components: {
|
|
10
|
+
button: {
|
|
11
|
+
defaultVariants: {
|
|
12
|
+
variant: "primary",
|
|
13
|
+
size: "md",
|
|
14
|
+
radius: "full"
|
|
15
|
+
}
|
|
16
|
+
},
|
|
17
|
+
input: {
|
|
18
|
+
defaultVariants: {
|
|
19
|
+
variant: "outline",
|
|
20
|
+
size: "md"
|
|
21
|
+
}
|
|
22
|
+
},
|
|
23
|
+
inputMask: {
|
|
24
|
+
defaultVariants: {
|
|
25
|
+
variant: "outline",
|
|
26
|
+
size: "md"
|
|
27
|
+
}
|
|
28
|
+
},
|
|
29
|
+
inputOtp: {
|
|
30
|
+
defaultVariants: {
|
|
31
|
+
variant: "outline",
|
|
32
|
+
size: "md"
|
|
33
|
+
}
|
|
34
|
+
},
|
|
35
|
+
inputTags: {
|
|
36
|
+
defaultVariants: {
|
|
37
|
+
variant: "outline",
|
|
38
|
+
size: "md"
|
|
39
|
+
}
|
|
40
|
+
},
|
|
41
|
+
textarea: {
|
|
42
|
+
defaultVariants: {
|
|
43
|
+
variant: "outline",
|
|
44
|
+
size: "md",
|
|
45
|
+
resize: "vertical"
|
|
46
|
+
}
|
|
47
|
+
},
|
|
48
|
+
checkbox: {
|
|
49
|
+
defaultVariants: {
|
|
50
|
+
size: "md"
|
|
51
|
+
}
|
|
52
|
+
},
|
|
53
|
+
iconButton: {
|
|
54
|
+
defaultVariants: {
|
|
55
|
+
variant: "ghost",
|
|
56
|
+
size: "md"
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
};
|
|
61
|
+
|
|
62
|
+
// src/theme/create-theme.ts
|
|
63
|
+
var mergeComponentConfig = (base, next) => {
|
|
64
|
+
if (!base && !next) return void 0;
|
|
65
|
+
if (!base) return next ? { ...next } : void 0;
|
|
66
|
+
if (!next) return { ...base };
|
|
67
|
+
return {
|
|
68
|
+
baseClass: next.baseClass ?? base.baseClass,
|
|
69
|
+
className: next.className ?? base.className,
|
|
70
|
+
defaultProps: { ...base.defaultProps, ...next.defaultProps },
|
|
71
|
+
defaultVariants: { ...base.defaultVariants, ...next.defaultVariants },
|
|
72
|
+
variants: { ...base.variants, ...next.variants }
|
|
73
|
+
};
|
|
74
|
+
};
|
|
75
|
+
var mergeComponents = (base, next) => {
|
|
76
|
+
const keys = /* @__PURE__ */ new Set([...Object.keys(base ?? {}), ...Object.keys(next ?? {})]);
|
|
77
|
+
const merged = {};
|
|
78
|
+
for (const key of keys) {
|
|
79
|
+
const slice = mergeComponentConfig(base?.[key], next?.[key]);
|
|
80
|
+
if (slice) merged[key] = slice;
|
|
81
|
+
}
|
|
82
|
+
return merged;
|
|
83
|
+
};
|
|
84
|
+
var createTheme = (input, base = defaultTheme) => ({
|
|
85
|
+
prefix: input.prefix ?? base.prefix,
|
|
86
|
+
headless: input.headless ?? base.headless,
|
|
87
|
+
components: mergeComponents(base.components, input.components)
|
|
88
|
+
});
|
|
89
|
+
|
|
90
|
+
// src/theme/theme-context.ts
|
|
91
|
+
var stack = [];
|
|
92
|
+
var getUIContext = () => stack[stack.length - 1];
|
|
93
|
+
var getUIContextOrDefault = () => getUIContext() ?? createUIContextValue({});
|
|
94
|
+
var createUIContextValue = (input, parent = getUIContext()) => {
|
|
95
|
+
const parentTheme = parent?.theme ?? defaultTheme;
|
|
96
|
+
const theme = createTheme(input.theme ?? {}, parentTheme);
|
|
97
|
+
const headless = input.headless ?? theme.headless ?? parent?.headless ?? false;
|
|
98
|
+
return {
|
|
99
|
+
theme: { ...theme, headless },
|
|
100
|
+
headless
|
|
101
|
+
};
|
|
102
|
+
};
|
|
103
|
+
|
|
104
|
+
// src/core/ids.ts
|
|
105
|
+
var idCounter = 0;
|
|
106
|
+
var createId = (prefix) => {
|
|
107
|
+
const ctx = getUIContextOrDefault();
|
|
108
|
+
const base = prefix ?? ctx.theme.prefix ?? "echo";
|
|
109
|
+
idCounter += 1;
|
|
110
|
+
return `${base}-${idCounter}`;
|
|
111
|
+
};
|
|
112
|
+
|
|
113
|
+
// src/utils/cn.ts
|
|
114
|
+
var defaultClassNameMerger = (...values) => {
|
|
115
|
+
const out = [];
|
|
116
|
+
const walk = (value) => {
|
|
117
|
+
if (value == null || value === false) return;
|
|
118
|
+
if (typeof value === "string") {
|
|
119
|
+
if (value) out.push(value);
|
|
120
|
+
return;
|
|
121
|
+
}
|
|
122
|
+
if (Array.isArray(value)) {
|
|
123
|
+
for (const item of value) walk(item);
|
|
124
|
+
return;
|
|
125
|
+
}
|
|
126
|
+
for (const [key, enabled] of Object.entries(value)) {
|
|
127
|
+
if (enabled) out.push(key);
|
|
128
|
+
}
|
|
129
|
+
};
|
|
130
|
+
for (const value of values) walk(value);
|
|
131
|
+
return out.join(" ");
|
|
132
|
+
};
|
|
133
|
+
var classNameMerger = defaultClassNameMerger;
|
|
134
|
+
var cn = (...values) => classNameMerger(...values);
|
|
135
|
+
|
|
136
|
+
// src/utils/data-attributes.ts
|
|
137
|
+
var dataDisabled = (disabled) => disabled ? { "data-disabled": "" } : {};
|
|
138
|
+
var dataInvalid = (invalid) => invalid ? { "data-invalid": "" } : {};
|
|
139
|
+
|
|
140
|
+
// src/utils/compose-event-handlers.ts
|
|
141
|
+
var composeEventHandlers = (userHandler, internalHandler, options = {}) => {
|
|
142
|
+
if (!userHandler && !internalHandler) return void 0;
|
|
143
|
+
if (!userHandler) return internalHandler;
|
|
144
|
+
if (!internalHandler) return userHandler;
|
|
145
|
+
const { checkDefaultPrevented = false } = options;
|
|
146
|
+
return (event) => {
|
|
147
|
+
userHandler(event);
|
|
148
|
+
if (checkDefaultPrevented && event?.defaultPrevented) return;
|
|
149
|
+
internalHandler(event);
|
|
150
|
+
};
|
|
151
|
+
};
|
|
152
|
+
|
|
153
|
+
// src/utils/merge-props.ts
|
|
154
|
+
var CLASS_KEYS = /* @__PURE__ */ new Set(["class", "className"]);
|
|
155
|
+
var isEventHandlerKey = (key) => key.startsWith("on") || key.startsWith("on:");
|
|
156
|
+
var mergeClassValues = (...values) => {
|
|
157
|
+
const merged = cn(...values);
|
|
158
|
+
return merged || void 0;
|
|
159
|
+
};
|
|
160
|
+
var mergePair = (target, source) => {
|
|
161
|
+
if (!source) return;
|
|
162
|
+
for (const [key, value] of Object.entries(source)) {
|
|
163
|
+
if (value === void 0) continue;
|
|
164
|
+
if (CLASS_KEYS.has(key)) {
|
|
165
|
+
const mergedClass = mergeClassValues(target.className, value);
|
|
166
|
+
if (mergedClass !== void 0) {
|
|
167
|
+
target.className = mergedClass;
|
|
168
|
+
target.class = mergedClass;
|
|
169
|
+
}
|
|
170
|
+
continue;
|
|
171
|
+
}
|
|
172
|
+
if (isEventHandlerKey(key)) {
|
|
173
|
+
const existing = target[key];
|
|
174
|
+
target[key] = composeEventHandlers(
|
|
175
|
+
value,
|
|
176
|
+
existing,
|
|
177
|
+
{ checkDefaultPrevented: true }
|
|
178
|
+
);
|
|
179
|
+
continue;
|
|
180
|
+
}
|
|
181
|
+
target[key] = value;
|
|
182
|
+
}
|
|
183
|
+
};
|
|
184
|
+
var mergeProps = (defaultProps, providerProps, componentProps) => {
|
|
185
|
+
const merged = {};
|
|
186
|
+
mergePair(merged, defaultProps);
|
|
187
|
+
mergePair(merged, providerProps);
|
|
188
|
+
mergePair(merged, componentProps);
|
|
189
|
+
return merged;
|
|
190
|
+
};
|
|
191
|
+
|
|
192
|
+
// src/theme/variants.ts
|
|
193
|
+
var tv = (config) => {
|
|
194
|
+
const resolve = (options) => {
|
|
195
|
+
const parts = [];
|
|
196
|
+
if (config.base) parts.push(config.base);
|
|
197
|
+
const resolved = { ...config.defaultVariants ?? {}, ...options ?? {} };
|
|
198
|
+
const variants = config.variants ?? {};
|
|
199
|
+
for (const [variantName, map] of Object.entries(variants)) {
|
|
200
|
+
const value = resolved[variantName];
|
|
201
|
+
if (value === void 0) continue;
|
|
202
|
+
const key = typeof value === "boolean" ? value ? "true" : "false" : String(value);
|
|
203
|
+
const cls = map[key];
|
|
204
|
+
if (cls) parts.push(cls);
|
|
205
|
+
}
|
|
206
|
+
for (const compound of config.compoundVariants ?? []) {
|
|
207
|
+
const { class: compoundClass, ...conditions } = compound;
|
|
208
|
+
const matches = Object.entries(conditions).every(([name, value]) => resolved[name] === value);
|
|
209
|
+
if (matches && compoundClass) parts.push(compoundClass);
|
|
210
|
+
}
|
|
211
|
+
return parts.filter(Boolean).join(" ");
|
|
212
|
+
};
|
|
213
|
+
if (config.slots) {
|
|
214
|
+
const slotFns = {};
|
|
215
|
+
for (const [slot, slotBase] of Object.entries(config.slots)) {
|
|
216
|
+
slotFns[slot] = (slotOptions) => {
|
|
217
|
+
const composed = [slotBase, resolve(slotOptions)].filter(Boolean).join(" ");
|
|
218
|
+
return composed.trim();
|
|
219
|
+
};
|
|
220
|
+
}
|
|
221
|
+
slotFns._config = config;
|
|
222
|
+
return slotFns;
|
|
223
|
+
}
|
|
224
|
+
const fn = (options) => resolve(options);
|
|
225
|
+
fn._config = config;
|
|
226
|
+
return fn;
|
|
227
|
+
};
|
|
228
|
+
var resolveVariantClasses = (variantFn, options, headless) => {
|
|
229
|
+
if (headless || !variantFn) return void 0;
|
|
230
|
+
return variantFn(options);
|
|
231
|
+
};
|
|
232
|
+
|
|
233
|
+
// src/core/variant-keys.ts
|
|
234
|
+
var getVariantKeysFromFn = (variantsFn) => {
|
|
235
|
+
const variants = variantsFn?._config?.variants;
|
|
236
|
+
if (!variants) return [];
|
|
237
|
+
return Object.keys(variants);
|
|
238
|
+
};
|
|
239
|
+
var resolveVariantOptions = (variantsFn, themeDefaults, props) => {
|
|
240
|
+
const keys = [
|
|
241
|
+
.../* @__PURE__ */ new Set([
|
|
242
|
+
...getVariantKeysFromFn(variantsFn),
|
|
243
|
+
...Object.keys(variantsFn?._config?.defaultVariants ?? {}),
|
|
244
|
+
...Object.keys(themeDefaults ?? {})
|
|
245
|
+
])
|
|
246
|
+
];
|
|
247
|
+
const picked = {};
|
|
248
|
+
for (const key of keys) {
|
|
249
|
+
if (props[key] !== void 0) picked[key] = props[key];
|
|
250
|
+
}
|
|
251
|
+
return {
|
|
252
|
+
...variantsFn?._config?.defaultVariants,
|
|
253
|
+
...themeDefaults,
|
|
254
|
+
...picked
|
|
255
|
+
};
|
|
256
|
+
};
|
|
257
|
+
|
|
258
|
+
// src/core/component.ts
|
|
259
|
+
var themeKeyFromName = (name) => name.charAt(0).toLowerCase() + name.slice(1);
|
|
260
|
+
var createUIComponent = (config) => {
|
|
261
|
+
const themeKey = themeKeyFromName(config.name);
|
|
262
|
+
return (props) => {
|
|
263
|
+
const ctx = getUIContextOrDefault();
|
|
264
|
+
const themeSlice = ctx.theme.components?.[themeKey];
|
|
265
|
+
const headless = props.headless ?? ctx.headless ?? ctx.theme.headless ?? false;
|
|
266
|
+
const providerProps = {
|
|
267
|
+
...themeSlice?.defaultProps,
|
|
268
|
+
...themeSlice?.defaultVariants
|
|
269
|
+
};
|
|
270
|
+
if (themeSlice?.className) {
|
|
271
|
+
providerProps.className = themeSlice.className;
|
|
272
|
+
}
|
|
273
|
+
const merged = mergeProps(
|
|
274
|
+
config.defaultProps,
|
|
275
|
+
providerProps,
|
|
276
|
+
props
|
|
277
|
+
);
|
|
278
|
+
const variantOptions = resolveVariantOptions(
|
|
279
|
+
config.variants,
|
|
280
|
+
themeSlice?.defaultVariants,
|
|
281
|
+
merged
|
|
282
|
+
);
|
|
283
|
+
const variantClass = resolveVariantClasses(config.variants, variantOptions, headless);
|
|
284
|
+
const visualClass = headless ? void 0 : cn(themeSlice?.baseClass, themeSlice?.className, variantClass, merged.className, merged.class);
|
|
285
|
+
const finalProps = {
|
|
286
|
+
...merged,
|
|
287
|
+
className: visualClass,
|
|
288
|
+
class: visualClass
|
|
289
|
+
};
|
|
290
|
+
if (config.render) {
|
|
291
|
+
return config.render({
|
|
292
|
+
props: finalProps,
|
|
293
|
+
headless,
|
|
294
|
+
className: visualClass,
|
|
295
|
+
ctx
|
|
296
|
+
});
|
|
297
|
+
}
|
|
298
|
+
const { children, as, ...rest } = finalProps;
|
|
299
|
+
const tag = as ?? config.defaultTag;
|
|
300
|
+
return h(tag, rest, children);
|
|
301
|
+
};
|
|
302
|
+
};
|
|
303
|
+
|
|
304
|
+
// src/components/label/label.styles.ts
|
|
305
|
+
var labelStyles = tv({
|
|
306
|
+
base: [
|
|
307
|
+
"text-sm font-medium leading-none",
|
|
308
|
+
"data-[disabled]:opacity-50",
|
|
309
|
+
"data-[invalid]:text-red-700"
|
|
310
|
+
].join(" ")
|
|
311
|
+
});
|
|
312
|
+
|
|
313
|
+
// src/components/label/label.ts
|
|
314
|
+
var Label = createUIComponent({
|
|
315
|
+
name: "Label",
|
|
316
|
+
defaultTag: "label",
|
|
317
|
+
defaultProps: {
|
|
318
|
+
requiredIndicator: "*"
|
|
319
|
+
},
|
|
320
|
+
variants: () => labelStyles({}),
|
|
321
|
+
render: ({ props, headless, className }) => {
|
|
322
|
+
const {
|
|
323
|
+
for: htmlFor,
|
|
324
|
+
required,
|
|
325
|
+
disabled,
|
|
326
|
+
invalid,
|
|
327
|
+
requiredIndicator,
|
|
328
|
+
optionalIndicator,
|
|
329
|
+
children,
|
|
330
|
+
...rest
|
|
331
|
+
} = props;
|
|
332
|
+
const indicator = required === true ? requiredIndicator : required === false && optionalIndicator ? optionalIndicator : null;
|
|
333
|
+
const visualClass = headless ? void 0 : cn(className);
|
|
334
|
+
return h(
|
|
335
|
+
"label",
|
|
336
|
+
{
|
|
337
|
+
...rest,
|
|
338
|
+
for: htmlFor,
|
|
339
|
+
...dataDisabled(Boolean(disabled)),
|
|
340
|
+
...dataInvalid(Boolean(invalid)),
|
|
341
|
+
className: visualClass,
|
|
342
|
+
class: visualClass
|
|
343
|
+
},
|
|
344
|
+
[
|
|
345
|
+
children,
|
|
346
|
+
indicator ? h("span", { "aria-hidden": "true", className: headless ? void 0 : "ml-1" }, indicator) : null
|
|
347
|
+
]
|
|
348
|
+
);
|
|
349
|
+
}
|
|
350
|
+
});
|
|
351
|
+
|
|
352
|
+
// src/components/field/field.styles.ts
|
|
353
|
+
var fieldStyles = tv({
|
|
354
|
+
slots: {
|
|
355
|
+
root: "grid gap-1.5",
|
|
356
|
+
label: "",
|
|
357
|
+
description: "text-sm text-zinc-500",
|
|
358
|
+
error: "text-sm text-red-600"
|
|
359
|
+
}
|
|
360
|
+
});
|
|
361
|
+
|
|
362
|
+
// src/components/field/field-context.ts
|
|
363
|
+
var stack2 = [];
|
|
364
|
+
var getFieldContext = () => stack2[stack2.length - 1];
|
|
365
|
+
var runWithFieldContext = (value, fn) => {
|
|
366
|
+
stack2.push(value);
|
|
367
|
+
try {
|
|
368
|
+
return fn();
|
|
369
|
+
} finally {
|
|
370
|
+
stack2.pop();
|
|
371
|
+
}
|
|
372
|
+
};
|
|
373
|
+
|
|
374
|
+
// src/components/field/field.ts
|
|
375
|
+
var isFnChild = (children) => typeof children === "function";
|
|
376
|
+
var Field = (props) => {
|
|
377
|
+
const ui = getUIContextOrDefault();
|
|
378
|
+
const slice = ui.theme.components?.field;
|
|
379
|
+
const headless = props.headless ?? ui.headless ?? ui.theme.headless ?? false;
|
|
380
|
+
const themeDefaults = {
|
|
381
|
+
...slice?.defaultProps
|
|
382
|
+
};
|
|
383
|
+
if (!headless) {
|
|
384
|
+
if (slice?.baseClass) themeDefaults.className = cn(themeDefaults.className, slice.baseClass);
|
|
385
|
+
if (slice?.className) themeDefaults.className = cn(themeDefaults.className, slice.className);
|
|
386
|
+
}
|
|
387
|
+
const merged = mergeProps(void 0, themeDefaults, props);
|
|
388
|
+
const id = merged.id ?? createId("field");
|
|
389
|
+
const inputId = createId(`${id}-input`);
|
|
390
|
+
const labelId = createId(`${id}-label`);
|
|
391
|
+
const descriptionId = merged.description ? createId(`${id}-description`) : void 0;
|
|
392
|
+
const errorId = merged.error ? createId(`${id}-error`) : void 0;
|
|
393
|
+
const invalid = Boolean(merged.invalid || merged.error);
|
|
394
|
+
const disabled = Boolean(merged.disabled);
|
|
395
|
+
const required = Boolean(merged.required);
|
|
396
|
+
const describedBy = [descriptionId, errorId].filter(Boolean).join(" ") || void 0;
|
|
397
|
+
const ctx = {
|
|
398
|
+
id,
|
|
399
|
+
inputId,
|
|
400
|
+
labelId,
|
|
401
|
+
descriptionId,
|
|
402
|
+
errorId,
|
|
403
|
+
invalid,
|
|
404
|
+
disabled,
|
|
405
|
+
required,
|
|
406
|
+
inputProps: {
|
|
407
|
+
id: inputId,
|
|
408
|
+
"aria-labelledby": labelId,
|
|
409
|
+
"aria-describedby": describedBy,
|
|
410
|
+
"aria-invalid": invalid ? "true" : void 0,
|
|
411
|
+
"aria-required": required ? "true" : void 0,
|
|
412
|
+
required: required || void 0,
|
|
413
|
+
disabled: disabled || void 0,
|
|
414
|
+
invalid: invalid || void 0
|
|
415
|
+
},
|
|
416
|
+
labelProps: {
|
|
417
|
+
id: labelId,
|
|
418
|
+
for: inputId,
|
|
419
|
+
required: required || void 0,
|
|
420
|
+
disabled: disabled || void 0,
|
|
421
|
+
invalid: invalid || void 0
|
|
422
|
+
},
|
|
423
|
+
descriptionProps: descriptionId ? { id: descriptionId } : void 0,
|
|
424
|
+
errorProps: errorId ? { id: errorId, role: "alert" } : void 0
|
|
425
|
+
};
|
|
426
|
+
const rootClass = headless ? void 0 : cn(fieldStyles.root(), merged.className, merged.class);
|
|
427
|
+
const content = isFnChild(merged.children) ? merged.children(ctx) : merged.children;
|
|
428
|
+
return runWithFieldContext(
|
|
429
|
+
ctx,
|
|
430
|
+
() => h(
|
|
431
|
+
"div",
|
|
432
|
+
{
|
|
433
|
+
className: rootClass,
|
|
434
|
+
class: rootClass,
|
|
435
|
+
...dataInvalid(invalid),
|
|
436
|
+
...dataDisabled(disabled),
|
|
437
|
+
...required ? { "data-required": "" } : {}
|
|
438
|
+
},
|
|
439
|
+
[
|
|
440
|
+
merged.label ? Label({
|
|
441
|
+
...ctx.labelProps,
|
|
442
|
+
headless,
|
|
443
|
+
children: merged.label
|
|
444
|
+
}) : null,
|
|
445
|
+
content,
|
|
446
|
+
merged.description ? h(
|
|
447
|
+
"div",
|
|
448
|
+
{
|
|
449
|
+
id: descriptionId,
|
|
450
|
+
className: headless ? void 0 : fieldStyles.description()
|
|
451
|
+
},
|
|
452
|
+
merged.description
|
|
453
|
+
) : null,
|
|
454
|
+
merged.error ? h(
|
|
455
|
+
"div",
|
|
456
|
+
{
|
|
457
|
+
id: errorId,
|
|
458
|
+
role: "alert",
|
|
459
|
+
className: headless ? void 0 : fieldStyles.error()
|
|
460
|
+
},
|
|
461
|
+
merged.error
|
|
462
|
+
) : null
|
|
463
|
+
]
|
|
464
|
+
)
|
|
465
|
+
);
|
|
466
|
+
};
|
|
467
|
+
|
|
468
|
+
// src/components/field/merge-field-control-props.ts
|
|
469
|
+
var mergeFieldControlProps = (base, overrides) => {
|
|
470
|
+
const ctx = getFieldContext();
|
|
471
|
+
if (!ctx) {
|
|
472
|
+
return mergeProps(void 0, base, overrides ?? {});
|
|
473
|
+
}
|
|
474
|
+
return mergeProps(ctx.inputProps, base, overrides ?? {});
|
|
475
|
+
};
|
|
476
|
+
|
|
477
|
+
export { Field, getFieldContext, mergeFieldControlProps };
|
|
478
|
+
//# sourceMappingURL=field.js.map
|
|
479
|
+
//# sourceMappingURL=field.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/theme/default-theme.ts","../src/theme/create-theme.ts","../src/theme/theme-context.ts","../src/core/ids.ts","../src/utils/cn.ts","../src/utils/data-attributes.ts","../src/utils/compose-event-handlers.ts","../src/utils/merge-props.ts","../src/theme/variants.ts","../src/core/variant-keys.ts","../src/core/component.ts","../src/components/label/label.styles.ts","../src/components/label/label.ts","../src/components/field/field.styles.ts","../src/components/field/field-context.ts","../src/components/field/field.ts","../src/components/field/merge-field-control-props.ts"],"names":["h","stack"],"mappings":"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","file":"field.js","sourcesContent":["import type { UITheme } from \"./types\";\n\n/** Built-in theme used when no provider is mounted. */\nexport const defaultTheme: UITheme = {\n prefix: \"echo\",\n headless: false,\n components: {\n button: {\n defaultVariants: {\n variant: \"primary\",\n size: \"md\",\n radius: \"full\",\n },\n },\n input: {\n defaultVariants: {\n variant: \"outline\",\n size: \"md\",\n },\n },\n inputMask: {\n defaultVariants: {\n variant: \"outline\",\n size: \"md\",\n },\n },\n inputOtp: {\n defaultVariants: {\n variant: \"outline\",\n size: \"md\",\n },\n },\n inputTags: {\n defaultVariants: {\n variant: \"outline\",\n size: \"md\",\n },\n },\n textarea: {\n defaultVariants: {\n variant: \"outline\",\n size: \"md\",\n resize: \"vertical\",\n },\n },\n checkbox: {\n defaultVariants: {\n size: \"md\",\n },\n },\n iconButton: {\n defaultVariants: {\n variant: \"ghost\",\n size: \"md\",\n },\n },\n },\n};\n","import { defaultTheme } from \"./default-theme\";\nimport type { ComponentThemeConfig, UITheme } from \"./types\";\n\nconst mergeComponentConfig = (\n base: ComponentThemeConfig | undefined,\n next: ComponentThemeConfig | undefined,\n): ComponentThemeConfig | undefined => {\n if (!base && !next) return undefined;\n if (!base) return next ? { ...next } : undefined;\n if (!next) return { ...base };\n\n return {\n baseClass: next.baseClass ?? base.baseClass,\n className: next.className ?? base.className,\n defaultProps: { ...base.defaultProps, ...next.defaultProps },\n defaultVariants: { ...base.defaultVariants, ...next.defaultVariants },\n variants: { ...base.variants, ...next.variants },\n };\n};\n\nconst mergeComponents = (\n base: UITheme[\"components\"],\n next: UITheme[\"components\"],\n): UITheme[\"components\"] => {\n const keys = new Set([...Object.keys(base ?? {}), ...Object.keys(next ?? {})]);\n const merged: Record<string, ComponentThemeConfig> = {};\n\n for (const key of keys) {\n const slice = mergeComponentConfig(base?.[key], next?.[key]);\n if (slice) merged[key] = slice;\n }\n\n return merged;\n};\n\n/**\n * Merges partial theme config into a base theme (defaults to {@link defaultTheme}).\n */\nexport const createTheme = (input: Partial<UITheme>, base: UITheme = defaultTheme): UITheme => ({\n prefix: input.prefix ?? base.prefix,\n headless: input.headless ?? base.headless,\n components: mergeComponents(base.components, input.components),\n});\n","import { createTheme } from \"./create-theme\";\nimport { defaultTheme } from \"./default-theme\";\nimport type { UITheme } from \"./types\";\n\n/** Resolved runtime configuration from {@link UIProvider}. */\nexport type UIContextValue = {\n theme: UITheme;\n headless: boolean;\n};\n\nconst stack: UIContextValue[] = [];\n\n/** Returns the active UI context or `undefined` outside a provider. */\nexport const getUIContext = (): UIContextValue | undefined => stack[stack.length - 1];\n\n/** Returns the active UI context, falling back to defaults. */\nexport const getUIContextOrDefault = (): UIContextValue => getUIContext() ?? createUIContextValue({});\n\nexport type CreateUIContextInput = {\n theme?: Partial<UITheme>;\n headless?: boolean;\n};\n\n/** Builds a fully resolved context value from partial provider props. */\nexport const createUIContextValue = (\n input: CreateUIContextInput,\n parent: UIContextValue | undefined = getUIContext(),\n): UIContextValue => {\n const parentTheme = parent?.theme ?? defaultTheme;\n const theme = createTheme(input.theme ?? {}, parentTheme);\n\n const headless = input.headless ?? theme.headless ?? parent?.headless ?? false;\n\n return {\n theme: { ...theme, headless },\n headless,\n };\n};\n\n/** Runs `fn` with `value` pushed onto the UI context stack. */\nexport const runWithUIContext = <T>(value: UIContextValue, fn: () => T): T => {\n stack.push(value);\n try {\n return fn();\n } finally {\n stack.pop();\n }\n};\n\n/** @internal Resets the context stack — for tests only. */\nexport const resetUIContextStack = (): void => {\n stack.length = 0;\n};\n","import { getUIContextOrDefault } from \"../theme/theme-context\";\n\nlet idCounter = 0;\n\n/** @internal Resets the id counter — for tests only. */\nexport const resetIdCounter = (): void => {\n idCounter = 0;\n};\n\n/**\n * Creates a unique id string.\n *\n * Uses the theme `prefix` from the active {@link UIProvider} when available.\n */\nexport const createId = (prefix?: string): string => {\n const ctx = getUIContextOrDefault();\n const base = prefix ?? ctx.theme.prefix ?? \"echo\";\n idCounter += 1;\n return `${base}-${idCounter}`;\n};\n\n/**\n * Alias for {@link createId} — hyperdom has no hook runtime; ids are created per call.\n */\nexport const useId = (prefix?: string): string => createId(prefix);\n","export type ClassDictionary = Record<string, boolean | null | undefined>;\nexport type ClassValue =\n | string\n | null\n | undefined\n | false\n | ClassDictionary\n | readonly ClassValue[];\n\n/** Optional hook to swap in tailwind-merge later. */\nexport type ClassNameMerger = (...values: ClassValue[]) => string;\n\nconst defaultClassNameMerger: ClassNameMerger = (...values) => {\n const out: string[] = [];\n\n const walk = (value: ClassValue): void => {\n if (value == null || value === false) return;\n\n if (typeof value === \"string\") {\n if (value) out.push(value);\n return;\n }\n\n if (Array.isArray(value)) {\n for (const item of value) walk(item);\n return;\n }\n\n for (const [key, enabled] of Object.entries(value)) {\n if (enabled) out.push(key);\n }\n };\n\n for (const value of values) walk(value);\n return out.join(\" \");\n};\n\nlet classNameMerger: ClassNameMerger = defaultClassNameMerger;\n\n/** Replaces the global className merger (e.g. with tailwind-merge). */\nexport const setClassNameMerger = (merger: ClassNameMerger): void => {\n classNameMerger = merger;\n};\n\n/** Resets the className merger to the built-in implementation. */\nexport const resetClassNameMerger = (): void => {\n classNameMerger = defaultClassNameMerger;\n};\n\n/**\n * Joins class name fragments.\n *\n * Supports strings, arrays, conditional maps, and falsy values.\n */\nexport const cn: ClassNameMerger = (...values) => classNameMerger(...values);\n","export type DataAttributeProps = Record<`data-${string}`, string | number | boolean | undefined>;\n\n/** `data-state` helper for styling hooks. */\nexport const dataState = (value: string): DataAttributeProps => ({\n \"data-state\": value,\n});\n\n/** `data-disabled` — present when disabled. */\nexport const dataDisabled = (disabled?: boolean): DataAttributeProps =>\n disabled ? { \"data-disabled\": \"\" } : {};\n\n/** `data-invalid` — present when invalid. */\nexport const dataInvalid = (invalid?: boolean): DataAttributeProps =>\n invalid ? { \"data-invalid\": \"\" } : {};\n\n/** `data-pending` — present while async action is in progress (HeroUI-style). */\nexport const dataPending = (pending?: boolean): DataAttributeProps =>\n pending ? { \"data-pending\": \"\" } : {};\n","export type ComposeEventHandlersOptions = {\n /** When true, skips `internalHandler` if `userHandler` called `preventDefault`. */\n checkDefaultPrevented?: boolean;\n};\n\ntype EventHandler<E extends Event = Event> = (event: E) => void;\n\n/**\n * Composes two event handlers. `userHandler` runs first.\n */\nexport const composeEventHandlers = <E extends Event>(\n userHandler: EventHandler<E> | undefined,\n internalHandler: EventHandler<E> | undefined,\n options: ComposeEventHandlersOptions = {},\n): EventHandler<E> | undefined => {\n if (!userHandler && !internalHandler) return undefined;\n if (!userHandler) return internalHandler;\n if (!internalHandler) return userHandler;\n\n const { checkDefaultPrevented = false } = options;\n\n return (event) => {\n userHandler(event);\n if (checkDefaultPrevented && event?.defaultPrevented) return;\n internalHandler(event);\n };\n};\n","import { composeEventHandlers } from \"./compose-event-handlers\";\nimport { cn, type ClassValue } from \"./cn\";\n\nexport type MergeableProps = Record<string, unknown>;\n\nconst CLASS_KEYS = new Set([\"class\", \"className\"]);\n\nconst isEventHandlerKey = (key: string): boolean =>\n key.startsWith(\"on\") || key.startsWith(\"on:\");\n\nconst mergeClassValues = (...values: unknown[]): string | undefined => {\n const merged = cn(...(values as ClassValue[]));\n return merged || undefined;\n};\n\nconst mergePair = (target: MergeableProps, source: MergeableProps | undefined): void => {\n if (!source) return;\n\n for (const [key, value] of Object.entries(source)) {\n if (value === undefined) continue;\n\n if (CLASS_KEYS.has(key)) {\n const mergedClass = mergeClassValues(target.className, value);\n if (mergedClass !== undefined) {\n target.className = mergedClass;\n target.class = mergedClass;\n }\n continue;\n }\n\n if (isEventHandlerKey(key)) {\n const existing = target[key];\n target[key] = composeEventHandlers(\n value as (...args: never[]) => void,\n existing as (...args: never[]) => void,\n { checkDefaultPrevented: true },\n );\n continue;\n }\n\n target[key] = value;\n }\n};\n\n/**\n * Merges props with priority (lowest → highest): `defaultProps`, `providerProps`, `componentProps`.\n *\n * `class` / `className` are joined; event handlers are composed.\n */\nexport const mergeProps = <T extends MergeableProps>(\n defaultProps: MergeableProps | undefined,\n providerProps: MergeableProps | undefined,\n componentProps: T,\n): T => {\n const merged: MergeableProps = {};\n\n mergePair(merged, defaultProps);\n mergePair(merged, providerProps);\n mergePair(merged, componentProps);\n\n return merged as T;\n};\n","/**\n * Stage 1 note:\n * We keep a small abstraction layer around variant class resolution so we can\n * plug `tailwind-variants` later without changing component code.\n */\n\nexport type TVVariantsShape = Record<string, Record<string, string>>;\nexport type TVBooleanVariantShape = Record<string, { true?: string; false?: string }>;\n\nexport type TVCompoundVariant = Record<string, string | boolean> & { class: string };\n\nexport type TVConfig = {\n base?: string;\n variants?: TVVariantsShape & TVBooleanVariantShape;\n compoundVariants?: TVCompoundVariant[];\n defaultVariants?: Record<string, string | boolean>;\n slots?: Record<string, string>;\n};\n\nexport type TVSlotResult<T extends TVConfig & { slots: Record<string, string> }> = {\n [K in keyof T[\"slots\"]]: (slotOptions?: Record<string, unknown>) => string;\n} & { _config: T };\n\nexport type TVResult<T extends TVConfig> = T extends { slots: Record<string, any> }\n ? TVSlotResult<T & { slots: Record<string, string> }>\n : ((options?: Record<string, unknown>) => string) & { _config: T };\n\n/** Roughly compatible `tv()` subset (Stage 2). */\nexport const tv = <T extends TVConfig>(config: T): TVResult<T> => {\n const resolve = (options?: Record<string, unknown>): string => {\n const parts: string[] = [];\n if (config.base) parts.push(config.base);\n\n const resolved = { ...(config.defaultVariants ?? {}), ...(options ?? {}) } as Record<\n string,\n string | boolean | undefined\n >;\n\n const variants = config.variants ?? {};\n for (const [variantName, map] of Object.entries(variants)) {\n const value = resolved[variantName];\n if (value === undefined) continue;\n\n const key = typeof value === \"boolean\" ? (value ? \"true\" : \"false\") : String(value);\n const cls = (map as any)[key] as string | undefined;\n if (cls) parts.push(cls);\n }\n\n for (const compound of config.compoundVariants ?? []) {\n const { class: compoundClass, ...conditions } = compound;\n const matches = Object.entries(conditions).every(([name, value]) => resolved[name] === value);\n if (matches && compoundClass) parts.push(compoundClass);\n }\n\n return parts.filter(Boolean).join(\" \");\n };\n\n if (config.slots) {\n const slotFns: any = {};\n for (const [slot, slotBase] of Object.entries(config.slots)) {\n slotFns[slot] = (slotOptions?: Record<string, unknown>) => {\n const composed = [slotBase, resolve(slotOptions)].filter(Boolean).join(\" \");\n return composed.trim();\n };\n }\n slotFns._config = config;\n return slotFns as TVResult<T>;\n }\n\n const fn: any = (options?: Record<string, unknown>) => resolve(options);\n fn._config = config;\n return fn as TVResult<T>;\n};\n\nexport type VariantProps<T> = T extends { _config: infer C }\n ? C extends { variants: infer V }\n ? {\n [K in keyof V]?: V[K] extends Record<infer Key, any>\n ? Key extends \"true\" | \"false\"\n ? boolean\n : Key\n : never;\n }\n : Record<string, never>\n : Record<string, never>;\n\n/** Compatibility export (mirrors tailwind-variants). */\nexport const createComponentVariants = tv;\n\n/**\n * Resolves variant classes when styling is enabled.\n */\nexport const resolveVariantClasses = (\n variantFn: ((options?: Record<string, unknown>) => string) | undefined,\n options: Record<string, unknown> | undefined,\n headless: boolean,\n): string | undefined => {\n if (headless || !variantFn) return undefined;\n return variantFn(options);\n};\n","import type { TVConfig } from \"../theme/variants\";\n\ntype VariantFn = ((options?: Record<string, unknown>) => unknown) & {\n _config?: TVConfig;\n};\n\n/** Collects variant prop names from a `tv()` config attached to the variants function. */\nexport const getVariantKeysFromFn = (variantsFn?: VariantFn): string[] => {\n const variants = variantsFn?._config?.variants;\n if (!variants) return [];\n return Object.keys(variants);\n};\n\nexport const resolveVariantOptions = (\n variantsFn: VariantFn | undefined,\n themeDefaults: Record<string, unknown> | undefined,\n props: Record<string, unknown>,\n): Record<string, unknown> => {\n const keys = [\n ...new Set([\n ...getVariantKeysFromFn(variantsFn),\n ...Object.keys(variantsFn?._config?.defaultVariants ?? {}),\n ...Object.keys(themeDefaults ?? {}),\n ]),\n ];\n\n const picked: Record<string, unknown> = {};\n for (const key of keys) {\n if (props[key] !== undefined) picked[key] = props[key];\n }\n\n return {\n ...variantsFn?._config?.defaultVariants,\n ...themeDefaults,\n ...picked,\n };\n};\n","import { h, type Child, type Props } from \"@echojs-ecosystem/hyperdom\";\nimport type { UIContextValue } from \"../theme/theme-context\";\nimport { getUIContextOrDefault } from \"../theme/theme-context\";\nimport { resolveVariantClasses } from \"../theme/variants\";\nimport { resolveVariantOptions } from \"./variant-keys\";\nimport { cn } from \"../utils/cn\";\nimport { mergeProps } from \"../utils/merge-props\";\nimport type { UIComponentBaseProps } from \"./types\";\n\nexport type UIComponentRenderContext<\n TProps extends UIComponentBaseProps,\n TElement extends Element = HTMLElement,\n> = {\n props: TProps & Props<TElement>;\n headless: boolean;\n className: string | undefined;\n ctx: UIContextValue;\n};\n\nexport type CreateUIComponentConfig<\n TProps extends UIComponentBaseProps,\n TElement extends Element = HTMLElement,\n> = {\n /** PascalCase component name (used for theme key: `Button` → `button`). */\n name: string;\n defaultTag: keyof HTMLElementTagNameMap;\n defaultProps?: Partial<TProps>;\n variants?: (options?: Record<string, unknown>) => string;\n render?: (context: UIComponentRenderContext<TProps, TElement>) => Child;\n};\n\nconst themeKeyFromName = (name: string): string => name.charAt(0).toLowerCase() + name.slice(1);\n\n/**\n * Factory for hyperdom UI components with theme, provider, and headless support.\n */\nexport const createUIComponent = <\n TProps extends UIComponentBaseProps,\n TElement extends HTMLElement = HTMLElement,\n>(\n config: CreateUIComponentConfig<TProps, TElement>,\n): ((props: TProps) => Child) => {\n const themeKey = themeKeyFromName(config.name);\n\n return (props: TProps): Child => {\n const ctx = getUIContextOrDefault();\n const themeSlice = ctx.theme.components?.[themeKey];\n\n const headless = props.headless ?? ctx.headless ?? ctx.theme.headless ?? false;\n\n const providerProps: Record<string, unknown> = {\n ...themeSlice?.defaultProps,\n ...themeSlice?.defaultVariants,\n };\n\n if (themeSlice?.className) {\n providerProps.className = themeSlice.className;\n }\n\n const merged = mergeProps(\n config.defaultProps as Record<string, unknown> | undefined,\n providerProps,\n props as Record<string, unknown>,\n ) as TProps & Record<string, unknown>;\n\n const variantOptions = resolveVariantOptions(\n config.variants as Parameters<typeof resolveVariantOptions>[0],\n themeSlice?.defaultVariants,\n merged,\n );\n\n const variantClass = resolveVariantClasses(config.variants, variantOptions, headless);\n\n const visualClass = headless\n ? undefined\n : cn(themeSlice?.baseClass, themeSlice?.className, variantClass, merged.className, merged.class);\n\n const finalProps = {\n ...merged,\n className: visualClass,\n class: visualClass,\n } as TProps & Props<TElement>;\n\n if (config.render) {\n return config.render({\n props: finalProps,\n headless,\n className: visualClass,\n ctx,\n });\n }\n\n const { children, as, ...rest } = finalProps as TProps &\n Props<TElement> & { as?: keyof HTMLElementTagNameMap };\n const tag = (as ?? config.defaultTag) as keyof HTMLElementTagNameMap;\n\n // `h()` has a narrow tag type; `as` is runtime-configurable, so we cast here.\n return h(tag as any, rest as Props<TElement>, children);\n };\n};\n","import { tv } from \"../../theme/variants\";\n\nexport const labelStyles = tv({\n base: [\n \"text-sm font-medium leading-none\",\n \"data-[disabled]:opacity-50\",\n \"data-[invalid]:text-red-700\",\n ].join(\" \"),\n});\n\n","import { h, type Child } from \"@echojs-ecosystem/hyperdom\";\nimport { createUIComponent } from \"../../core/component\";\nimport { cn } from \"../../utils/cn\";\nimport { dataDisabled, dataInvalid } from \"../../utils/data-attributes\";\nimport { labelStyles } from \"./label.styles\";\nimport type { LabelProps } from \"./label.types\";\n\nexport const Label = createUIComponent<LabelProps, HTMLLabelElement>({\n name: \"Label\",\n defaultTag: \"label\",\n defaultProps: {\n requiredIndicator: \"*\",\n },\n variants: () => labelStyles({} as any),\n render: ({ props, headless, className }) => {\n const {\n for: htmlFor,\n required,\n disabled,\n invalid,\n requiredIndicator,\n optionalIndicator,\n children,\n ...rest\n } = props as any;\n\n const indicator =\n required === true\n ? requiredIndicator\n : required === false && optionalIndicator\n ? optionalIndicator\n : null;\n\n const visualClass = headless ? undefined : cn(className);\n\n return h(\n \"label\",\n {\n ...rest,\n for: htmlFor,\n ...dataDisabled(Boolean(disabled)),\n ...dataInvalid(Boolean(invalid)),\n className: visualClass,\n class: visualClass,\n } as any,\n [\n children as Child,\n indicator ? h(\"span\", { \"aria-hidden\": \"true\", className: headless ? undefined : \"ml-1\" }, indicator) : null,\n ],\n );\n },\n});\n\n","import { tv } from \"../../theme/variants\";\n\nexport const fieldStyles = tv({\n slots: {\n root: \"grid gap-1.5\",\n label: \"\",\n description: \"text-sm text-zinc-500\",\n error: \"text-sm text-red-600\",\n },\n});\n\n","import type { FieldContext } from \"./field.types\";\n\nconst stack: FieldContext[] = [];\n\nexport const getFieldContext = (): FieldContext | undefined => stack[stack.length - 1];\n\nexport const runWithFieldContext = <T>(value: FieldContext, fn: () => T): T => {\n stack.push(value);\n try {\n return fn();\n } finally {\n stack.pop();\n }\n};\n\n","import { h, type Child } from \"@echojs-ecosystem/hyperdom\";\nimport { createId } from \"../../core/ids\";\nimport { getUIContextOrDefault } from \"../../theme/theme-context\";\nimport { cn } from \"../../utils/cn\";\nimport { dataDisabled, dataInvalid } from \"../../utils/data-attributes\";\nimport { mergeProps } from \"../../utils/merge-props\";\nimport { Label } from \"../label/label\";\nimport { fieldStyles } from \"./field.styles\";\nimport type { FieldContext, FieldProps } from \"./field.types\";\nimport { runWithFieldContext } from \"./field-context\";\n\nconst isFnChild = (children: FieldProps[\"children\"]): children is (ctx: FieldContext) => Child =>\n typeof children === \"function\";\n\nexport const Field = (props: FieldProps): Child => {\n const ui = getUIContextOrDefault();\n const slice = ui.theme.components?.field;\n const headless = props.headless ?? ui.headless ?? ui.theme.headless ?? false;\n\n const themeDefaults: Record<string, unknown> = {\n ...slice?.defaultProps,\n };\n\n if (!headless) {\n if (slice?.baseClass) themeDefaults.className = cn(themeDefaults.className as any, slice.baseClass);\n if (slice?.className) themeDefaults.className = cn(themeDefaults.className as any, slice.className);\n }\n\n const merged = mergeProps(undefined, themeDefaults, props as any) as FieldProps & Record<string, unknown>;\n\n const id = merged.id ?? createId(\"field\");\n const inputId = createId(`${id}-input`);\n const labelId = createId(`${id}-label`);\n const descriptionId = merged.description ? createId(`${id}-description`) : undefined;\n const errorId = merged.error ? createId(`${id}-error`) : undefined;\n\n const invalid = Boolean(merged.invalid || merged.error);\n const disabled = Boolean(merged.disabled);\n const required = Boolean(merged.required);\n\n const describedBy = [descriptionId, errorId].filter(Boolean).join(\" \") || undefined;\n\n const ctx: FieldContext = {\n id,\n inputId,\n labelId,\n descriptionId,\n errorId,\n\n invalid,\n disabled,\n required,\n\n inputProps: {\n id: inputId,\n \"aria-labelledby\": labelId,\n \"aria-describedby\": describedBy,\n \"aria-invalid\": invalid ? \"true\" : undefined,\n \"aria-required\": required ? \"true\" : undefined,\n required: required || undefined,\n disabled: disabled || undefined,\n invalid: invalid || undefined,\n },\n\n labelProps: {\n id: labelId,\n for: inputId,\n required: required || undefined,\n disabled: disabled || undefined,\n invalid: invalid || undefined,\n },\n\n descriptionProps: descriptionId ? { id: descriptionId } : undefined,\n errorProps: errorId ? { id: errorId, role: \"alert\" } : undefined,\n };\n\n const rootClass = headless\n ? undefined\n : cn(fieldStyles.root(), merged.className as string | undefined, merged.class as string | undefined);\n\n const content = isFnChild(merged.children) ? merged.children(ctx) : merged.children;\n\n return runWithFieldContext(ctx, () =>\n h(\n \"div\",\n {\n className: rootClass,\n class: rootClass,\n ...dataInvalid(invalid),\n ...dataDisabled(disabled),\n ...(required ? { \"data-required\": \"\" } : {}),\n } as any,\n [\n merged.label\n ? Label({\n ...ctx.labelProps,\n headless,\n children: merged.label,\n } as any)\n : null,\n\n content,\n\n merged.description\n ? h(\n \"div\",\n {\n id: descriptionId,\n className: headless ? undefined : fieldStyles.description(),\n } as any,\n merged.description as Child,\n )\n : null,\n\n merged.error\n ? h(\n \"div\",\n {\n id: errorId,\n role: \"alert\",\n className: headless ? undefined : fieldStyles.error(),\n } as any,\n merged.error as Child,\n )\n : null,\n ],\n ),\n );\n};\n\n","import { mergeProps } from \"../../utils/merge-props\";\nimport { getFieldContext } from \"./field-context\";\n\n/**\n * Merges {@link Field} context a11y props with control-specific props (Input, Textarea, …).\n *\n * @example\n * ```ts\n * Field({\n * label: \"Email\",\n * children: (ctx) =>\n * Input(mergeFieldControlProps(ctx.inputProps, {\n * value: email.value(),\n * onInput: (e) => email.set(e.currentTarget.value),\n * })),\n * });\n * ```\n */\nexport const mergeFieldControlProps = <T extends Record<string, unknown>>(\n base: T,\n overrides?: Record<string, unknown>,\n): T => {\n const ctx = getFieldContext();\n if (!ctx) {\n return mergeProps(undefined, base, overrides ?? {}) as T;\n }\n return mergeProps(ctx.inputProps, base, overrides ?? {}) as T;\n};\n"]}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { Props, Child } from '@echojs-ecosystem/hyperdom';
|
|
2
|
+
import { U as UIComponentBaseProps } from './types-CSHcGa_F.js';
|
|
3
|
+
|
|
4
|
+
type InputVariant = "outline" | "filled" | "ghost";
|
|
5
|
+
type InputSize = "sm" | "md" | "lg";
|
|
6
|
+
/** Shared props for text-field controls (Input, InputMask, …). */
|
|
7
|
+
type InputFieldProps = UIComponentBaseProps & Omit<Props<HTMLInputElement>, "children" | "type" | "value" | "defaultValue" | "size"> & {
|
|
8
|
+
value?: string;
|
|
9
|
+
defaultValue?: string;
|
|
10
|
+
name?: string;
|
|
11
|
+
placeholder?: string;
|
|
12
|
+
autocomplete?: string;
|
|
13
|
+
disabled?: boolean;
|
|
14
|
+
readonly?: boolean;
|
|
15
|
+
readOnly?: boolean;
|
|
16
|
+
required?: boolean;
|
|
17
|
+
invalid?: boolean;
|
|
18
|
+
size?: InputSize;
|
|
19
|
+
variant?: InputVariant;
|
|
20
|
+
startContent?: Child;
|
|
21
|
+
endContent?: Child;
|
|
22
|
+
};
|
|
23
|
+
|
|
24
|
+
export type { InputFieldProps as I, InputSize as a, InputVariant as b };
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import * as _echojs_ecosystem_hyperdom from '@echojs-ecosystem/hyperdom';
|
|
2
|
+
import { Child } from '@echojs-ecosystem/hyperdom';
|
|
3
|
+
import { B as ButtonProps } from './button.types-B0SrEYRV.js';
|
|
4
|
+
import './types-CSHcGa_F.js';
|
|
5
|
+
import './cn-rGlUI2mx.js';
|
|
6
|
+
|
|
7
|
+
type IconButtonSize = "xs" | "sm" | "md" | "lg";
|
|
8
|
+
type IconButtonProps = Omit<ButtonProps, "size" | "children"> & {
|
|
9
|
+
size?: IconButtonSize;
|
|
10
|
+
children: Child;
|
|
11
|
+
};
|
|
12
|
+
|
|
13
|
+
declare const IconButton: (props: IconButtonProps) => _echojs_ecosystem_hyperdom.Child;
|
|
14
|
+
|
|
15
|
+
export { IconButton, type IconButtonProps, type IconButtonSize };
|