@bysages/solid 0.4.2 → 0.4.4

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.
@@ -0,0 +1,959 @@
1
+ import { r as iconNode } from "../icon-DTqmJCd5.mjs";
2
+ import { Button } from "../components/button/index.mjs";
3
+ import { Alert } from "../components/alert/index.mjs";
4
+ import { Avatar } from "../components/avatar/index.mjs";
5
+ import { Badge } from "../components/badge/index.mjs";
6
+ import { Spinner } from "../components/spinner/index.mjs";
7
+ import { Banner } from "../components/banner/index.mjs";
8
+ import { Breadcrumb } from "../components/breadcrumb/index.mjs";
9
+ import { Card } from "../components/card/index.mjs";
10
+ import { t as Input } from "../input-BL3N3L8g.mjs";
11
+ import { Checkbox } from "../components/checkbox/index.mjs";
12
+ import { FloatButton } from "../components/float-button/index.mjs";
13
+ import { Progress } from "../components/progress/index.mjs";
14
+ import { RadioGroup } from "../components/radio-group/index.mjs";
15
+ import { t as Select } from "../select-DI7pFspF.mjs";
16
+ import { Separator } from "../components/separator/index.mjs";
17
+ import { Slider } from "../components/slider/index.mjs";
18
+ import { Stack } from "../components/stack/index.mjs";
19
+ import { Stat } from "../components/stat/index.mjs";
20
+ import { Switch } from "../components/switch/index.mjs";
21
+ import { Textarea } from "../components/textarea/index.mjs";
22
+ import { Typography } from "../components/typography/index.mjs";
23
+ import { Show, createComponent } from "solid-js";
24
+ import { z } from "zod";
25
+ import { defineRegistry, useBoundProp } from "@json-render/solid";
26
+ import { defineCatalog } from "@json-render/core";
27
+ import { schema } from "@json-render/solid/schema";
28
+ //#region \0rolldown/runtime.js
29
+ var __defProp = Object.defineProperty;
30
+ var __exportAll = (all, no_symbols) => {
31
+ let target = {};
32
+ for (var name in all) __defProp(target, name, {
33
+ get: all[name],
34
+ enumerable: true
35
+ });
36
+ if (!no_symbols) __defProp(target, Symbol.toStringTag, { value: "Module" });
37
+ return target;
38
+ };
39
+ //#endregion
40
+ //#region src/generative/faces.generated.ts
41
+ /** Name the faces a family contributes; the identity keeps inference
42
+ * honest at the call site. */
43
+ function defineFace(faces) {
44
+ return faces;
45
+ }
46
+ /** Map a catalog Heading level to a measure — the serif voice stays, the
47
+ * size steps down. */
48
+ const headingClass = {
49
+ "1": "text-4xl",
50
+ "2": "text-3xl",
51
+ "3": "text-2xl",
52
+ "4": "text-xl",
53
+ "5": "text-lg",
54
+ "6": "text-base"
55
+ };
56
+ function slug(value) {
57
+ return value.toLowerCase().replace(/[^a-z0-9]+/g, "-").replace(/(^-|-$)/g, "") || value;
58
+ }
59
+ /** The vocabulary the wrappers speak. One face per composed name — the
60
+ * per-family assemblies in each wrapper spread these and add only the
61
+ * rendering. */
62
+ const faces$1 = defineFace({
63
+ Alert: {
64
+ props: z.object({
65
+ status: z.enum([
66
+ "success",
67
+ "warning",
68
+ "danger",
69
+ "info",
70
+ "ink"
71
+ ]).optional(),
72
+ title: z.string().optional(),
73
+ message: z.string().optional()
74
+ }),
75
+ description: "A bordered notice; status picks the pigment."
76
+ },
77
+ Avatar: {
78
+ props: z.object({
79
+ name: z.string(),
80
+ src: z.string().optional(),
81
+ size: z.enum([
82
+ "sm",
83
+ "md",
84
+ "lg"
85
+ ]).optional()
86
+ }),
87
+ description: "A person's seal: image when given, initials as the fallback."
88
+ },
89
+ Banner: {
90
+ props: z.object({
91
+ status: z.enum([
92
+ "ink",
93
+ "info",
94
+ "success",
95
+ "warning",
96
+ "danger"
97
+ ]).optional(),
98
+ title: z.string().optional(),
99
+ message: z.string().optional(),
100
+ dismissible: z.boolean().optional()
101
+ }),
102
+ description: "A full-width notice that speaks once across the page."
103
+ },
104
+ Breadcrumb: {
105
+ props: z.object({ items: z.array(z.string()).optional() }),
106
+ description: "A trail of waymarks from home to the current page."
107
+ },
108
+ Badge: {
109
+ props: z.object({
110
+ text: z.string(),
111
+ tone: z.enum([
112
+ "ink",
113
+ "primary",
114
+ "success",
115
+ "warning",
116
+ "danger",
117
+ "info"
118
+ ]).optional(),
119
+ variant: z.enum([
120
+ "solid",
121
+ "subtle",
122
+ "outline"
123
+ ]).optional()
124
+ }),
125
+ description: "A small status seal beside content; reads at a glance."
126
+ },
127
+ Button: {
128
+ props: z.object({
129
+ label: z.string(),
130
+ variant: z.enum([
131
+ "solid",
132
+ "outline",
133
+ "ghost",
134
+ "subtle"
135
+ ]).optional(),
136
+ tone: z.enum([
137
+ "ink",
138
+ "success",
139
+ "warning",
140
+ "danger",
141
+ "info"
142
+ ]).optional(),
143
+ size: z.enum([
144
+ "sm",
145
+ "md",
146
+ "lg"
147
+ ]).optional(),
148
+ disabled: z.boolean().optional()
149
+ }),
150
+ description: "The primary action register: solid ink for the one main action, outline, ghost, or subtle for the rest."
151
+ },
152
+ Card: {
153
+ props: z.object({
154
+ title: z.string().optional(),
155
+ description: z.string().optional()
156
+ }),
157
+ slots: [
158
+ "default",
159
+ "header",
160
+ "footer"
161
+ ],
162
+ description: "Grouping vessel. Give title and description instead of hand-building a header; children render in the body; footer holds actions."
163
+ },
164
+ Checkbox: {
165
+ props: z.object({
166
+ label: z.string(),
167
+ checked: z.boolean().optional(),
168
+ disabled: z.boolean().optional()
169
+ }),
170
+ description: "One independent box with its label."
171
+ },
172
+ FloatButton: {
173
+ props: z.object({
174
+ label: z.string().optional(),
175
+ actions: z.array(z.object({
176
+ label: z.string(),
177
+ icon: z.string().optional(),
178
+ disabled: z.boolean().optional()
179
+ })).optional(),
180
+ placement: z.enum([
181
+ "bottom-end",
182
+ "bottom-start",
183
+ "top-end",
184
+ "top-start"
185
+ ]).optional(),
186
+ size: z.enum([
187
+ "sm",
188
+ "md",
189
+ "lg"
190
+ ]).optional(),
191
+ defaultOpen: z.boolean().optional()
192
+ }),
193
+ description: "A floating action and its fanned alternatives; actions use curated icon names."
194
+ },
195
+ Heading: {
196
+ props: z.object({
197
+ text: z.string(),
198
+ level: z.enum([
199
+ "1",
200
+ "2",
201
+ "3",
202
+ "4",
203
+ "5",
204
+ "6"
205
+ ]).optional()
206
+ }),
207
+ description: "Section heading. One per view at level 1; do not skip levels."
208
+ },
209
+ Input: {
210
+ props: z.object({
211
+ label: z.string().optional(),
212
+ placeholder: z.string().optional(),
213
+ type: z.enum([
214
+ "text",
215
+ "email",
216
+ "url",
217
+ "search",
218
+ "tel"
219
+ ]).optional(),
220
+ value: z.string().optional(),
221
+ disabled: z.boolean().optional()
222
+ }),
223
+ description: "A single-line field; rely on border, surface and the focus halo."
224
+ },
225
+ Progress: {
226
+ props: z.object({
227
+ value: z.number().optional(),
228
+ label: z.string().optional(),
229
+ max: z.number().optional()
230
+ }),
231
+ description: "A working track that fills toward done."
232
+ },
233
+ RadioGroup: {
234
+ props: z.object({
235
+ label: z.string().optional(),
236
+ items: z.array(z.string()).optional()
237
+ }),
238
+ description: "Several boxes where exactly one may hold."
239
+ },
240
+ Select: {
241
+ props: z.object({
242
+ label: z.string().optional(),
243
+ placeholder: z.string().optional(),
244
+ options: z.array(z.object({
245
+ label: z.string(),
246
+ value: z.string()
247
+ })),
248
+ value: z.union([z.string(), z.array(z.string())]).optional(),
249
+ multiple: z.boolean().optional(),
250
+ disabled: z.boolean().optional()
251
+ }),
252
+ description: "A choice field that opens a ruled list; options carry label and value."
253
+ },
254
+ Separator: {
255
+ props: z.object({ orientation: z.enum(["horizontal", "vertical"]).optional() }),
256
+ description: "Hairline divider between sections."
257
+ },
258
+ Slider: {
259
+ props: z.object({
260
+ label: z.string().optional(),
261
+ value: z.number().optional(),
262
+ min: z.number().optional(),
263
+ max: z.number().optional(),
264
+ step: z.number().optional()
265
+ }),
266
+ description: "A ruled track the hand slides between bounds."
267
+ },
268
+ Spinner: {
269
+ props: z.object({
270
+ size: z.enum([
271
+ "sm",
272
+ "md",
273
+ "lg"
274
+ ]).optional(),
275
+ label: z.string().optional()
276
+ }),
277
+ description: "A quiet wheel for work still settling."
278
+ },
279
+ Stack: {
280
+ props: z.object({
281
+ direction: z.enum(["column", "row"]).optional(),
282
+ gap: z.enum([
283
+ "none",
284
+ "xs",
285
+ "sm",
286
+ "md",
287
+ "lg",
288
+ "xl"
289
+ ]).optional(),
290
+ align: z.enum([
291
+ "start",
292
+ "center",
293
+ "end",
294
+ "stretch",
295
+ "baseline"
296
+ ]).optional(),
297
+ justify: z.enum([
298
+ "start",
299
+ "center",
300
+ "end",
301
+ "space-between",
302
+ "space-around"
303
+ ]).optional(),
304
+ wrap: z.boolean().optional()
305
+ }),
306
+ slots: ["default"],
307
+ description: "Flex container for layout. direction column stacks vertically, row lays side by side. gap is a named spacing step."
308
+ },
309
+ Stat: {
310
+ props: z.object({
311
+ label: z.string(),
312
+ value: z.string(),
313
+ change: z.string().optional(),
314
+ direction: z.enum([
315
+ "up",
316
+ "down",
317
+ "flat"
318
+ ]).optional()
319
+ }),
320
+ description: "One loud figure with its quiet label and an optional delta."
321
+ },
322
+ Switch: {
323
+ props: z.object({
324
+ label: z.string().optional(),
325
+ checked: z.boolean().optional(),
326
+ disabled: z.boolean().optional()
327
+ }),
328
+ description: "An instant on/off; label names what it switches."
329
+ },
330
+ Text: {
331
+ props: z.object({
332
+ text: z.string(),
333
+ variant: z.enum([
334
+ "body",
335
+ "lead",
336
+ "muted",
337
+ "label"
338
+ ]).optional()
339
+ }),
340
+ description: "A prose voice: lead opens, body carries, muted whispers, label names."
341
+ },
342
+ Textarea: {
343
+ props: z.object({
344
+ label: z.string().optional(),
345
+ placeholder: z.string().optional(),
346
+ rows: z.number().int().optional(),
347
+ value: z.string().optional(),
348
+ disabled: z.boolean().optional()
349
+ }),
350
+ description: "A multi-line field for prose-length answers."
351
+ }
352
+ });
353
+ //#endregion
354
+ //#region src/generative/shared.ts
355
+ /** Name the entries a family contributes; the identity keeps inference
356
+ * honest at the call site. */
357
+ function defineEntry(entries) {
358
+ return entries;
359
+ }
360
+ const textVoices = {
361
+ body: Typography.Body,
362
+ lead: Typography.Lead,
363
+ muted: Typography.Muted,
364
+ label: Typography.Label
365
+ };
366
+ /** Two-way binding plumbing: the resolved value plus its write-back
367
+ * setter, typed for the family's use. */
368
+ function useBound(value, path) {
369
+ return useBoundProp(value, path);
370
+ }
371
+ /** A labelled field: the label whispers above, the control answers. */
372
+ function labelled(label, control) {
373
+ return label ? createComponent(Stack, {
374
+ gap: "xs",
375
+ get children() {
376
+ return [createComponent(Typography.Label, { get children() {
377
+ return label;
378
+ } }), control];
379
+ }
380
+ }) : control;
381
+ }
382
+ //#endregion
383
+ //#region src/components/alert/generative.tsx
384
+ var generative_exports$20 = /* @__PURE__ */ __exportAll({ default: () => generative_default$20 });
385
+ /** A bordered notice; status picks the pigment. */
386
+ var generative_default$20 = defineEntry({ Alert: {
387
+ ...faces$1.Alert,
388
+ component: ({ props }) => createComponent(Alert.Root, {
389
+ get status() {
390
+ return props.status ?? "ink";
391
+ },
392
+ get children() {
393
+ return [createComponent(Alert.Icon, {}), createComponent(Alert.Body, { get children() {
394
+ return [createComponent(Alert.Title, { get children() {
395
+ return props.title;
396
+ } }), createComponent(Show, {
397
+ keyed: true,
398
+ get when() {
399
+ return props.message != null;
400
+ },
401
+ get children() {
402
+ return createComponent(Alert.Description, { get children() {
403
+ return props.message;
404
+ } });
405
+ }
406
+ })];
407
+ } })];
408
+ }
409
+ })
410
+ } });
411
+ //#endregion
412
+ //#region src/components/avatar/generative.tsx
413
+ var generative_exports$19 = /* @__PURE__ */ __exportAll({ default: () => generative_default$19 });
414
+ /** A person's seal: image when given, initials as the fallback. */
415
+ var generative_default$19 = defineEntry({ Avatar: {
416
+ ...faces$1.Avatar,
417
+ component: ({ props }) => createComponent(Avatar, {
418
+ get name() {
419
+ return props.name;
420
+ },
421
+ get size() {
422
+ return props.size;
423
+ },
424
+ get src() {
425
+ return props.src;
426
+ }
427
+ })
428
+ } });
429
+ //#endregion
430
+ //#region src/components/badge/generative.tsx
431
+ var generative_exports$18 = /* @__PURE__ */ __exportAll({ default: () => generative_default$18 });
432
+ /** A small status seal beside content; reads at a glance. */
433
+ var generative_default$18 = defineEntry({ Badge: {
434
+ ...faces$1.Badge,
435
+ component: ({ props }) => createComponent(Badge, {
436
+ get tone() {
437
+ return props.tone;
438
+ },
439
+ get variant() {
440
+ return props.variant;
441
+ },
442
+ get children() {
443
+ return props.text;
444
+ }
445
+ })
446
+ } });
447
+ //#endregion
448
+ //#region src/components/banner/generative.tsx
449
+ var generative_exports$17 = /* @__PURE__ */ __exportAll({ default: () => generative_default$17 });
450
+ /** A full-width notice that speaks once across the page. */
451
+ var generative_default$17 = defineEntry({ Banner: {
452
+ ...faces$1.Banner,
453
+ component: ({ props }) => createComponent(Banner, {
454
+ get status() {
455
+ return props.status;
456
+ },
457
+ get title() {
458
+ return props.title;
459
+ },
460
+ get message() {
461
+ return props.message;
462
+ },
463
+ dismissible: true
464
+ })
465
+ } });
466
+ //#endregion
467
+ //#region src/components/breadcrumb/generative.tsx
468
+ var generative_exports$16 = /* @__PURE__ */ __exportAll({ default: () => generative_default$16 });
469
+ /** A trail of waymarks from home to the current page. */
470
+ var generative_default$16 = defineEntry({ Breadcrumb: {
471
+ ...faces$1.Breadcrumb,
472
+ component: ({ props }) => {
473
+ const labels = props.items ?? [
474
+ "Home",
475
+ "Guides",
476
+ "Ink"
477
+ ];
478
+ const items = labels.map((label, index) => index === labels.length - 1 ? { label } : {
479
+ label,
480
+ href: `#${slug(label)}`
481
+ });
482
+ return createComponent(Breadcrumb, { get items() {
483
+ return items;
484
+ } });
485
+ }
486
+ } });
487
+ //#endregion
488
+ //#region src/components/button/generative.tsx
489
+ var generative_exports$15 = /* @__PURE__ */ __exportAll({ default: () => generative_default$15 });
490
+ /** The primary action register: solid ink for the one main action, outline, ghost, or subtle for the rest. */
491
+ var generative_default$15 = defineEntry({ Button: {
492
+ ...faces$1.Button,
493
+ component: ({ props, emit }) => createComponent(Button, {
494
+ get variant() {
495
+ return props.variant ?? "solid";
496
+ },
497
+ get tone() {
498
+ return props.tone;
499
+ },
500
+ get size() {
501
+ return props.size;
502
+ },
503
+ get disabled() {
504
+ return props.disabled;
505
+ },
506
+ onClick: () => emit("press"),
507
+ get children() {
508
+ return props.label;
509
+ }
510
+ })
511
+ } });
512
+ //#endregion
513
+ //#region src/components/card/generative.tsx
514
+ var generative_exports$14 = /* @__PURE__ */ __exportAll({ default: () => generative_default$14 });
515
+ /** Grouping vessel. Give title and description instead of hand-building a header; children render in the body. */
516
+ var generative_default$14 = defineEntry({ Card: {
517
+ ...faces$1.Card,
518
+ component: ({ props, children }) => createComponent(Card.Root, { get children() {
519
+ return [createComponent(Show, {
520
+ keyed: true,
521
+ get when() {
522
+ return props.title != null || props.description != null;
523
+ },
524
+ get children() {
525
+ return createComponent(Card.Header, { get children() {
526
+ return [createComponent(Show, {
527
+ keyed: true,
528
+ get when() {
529
+ return props.title != null;
530
+ },
531
+ get children() {
532
+ return createComponent(Card.Title, { get children() {
533
+ return props.title;
534
+ } });
535
+ }
536
+ }), createComponent(Show, {
537
+ keyed: true,
538
+ get when() {
539
+ return props.description != null;
540
+ },
541
+ get children() {
542
+ return createComponent(Card.Description, { get children() {
543
+ return props.description;
544
+ } });
545
+ }
546
+ })];
547
+ } });
548
+ }
549
+ }), createComponent(Card.Content, { get children() {
550
+ return children;
551
+ } })];
552
+ } })
553
+ } });
554
+ //#endregion
555
+ //#region src/components/checkbox/generative.tsx
556
+ var generative_exports$13 = /* @__PURE__ */ __exportAll({ default: () => generative_default$13 });
557
+ /** One independent box with its label. */
558
+ var generative_default$13 = defineEntry({ Checkbox: {
559
+ ...faces$1.Checkbox,
560
+ component: ({ props }) => {
561
+ const mark = iconNode("check");
562
+ return createComponent(Checkbox.Root, {
563
+ get defaultChecked() {
564
+ return props.checked ?? false;
565
+ },
566
+ get disabled() {
567
+ return props.disabled;
568
+ },
569
+ get children() {
570
+ return [
571
+ createComponent(Checkbox.Control, { get children() {
572
+ return createComponent(Checkbox.Indicator, { get children() {
573
+ return mark;
574
+ } });
575
+ } }),
576
+ createComponent(Checkbox.Label, { get children() {
577
+ return props.label;
578
+ } }),
579
+ createComponent(Checkbox.HiddenInput, {})
580
+ ];
581
+ }
582
+ });
583
+ }
584
+ } });
585
+ //#endregion
586
+ //#region src/components/float-button/generative.tsx
587
+ var generative_exports$12 = /* @__PURE__ */ __exportAll({ default: () => generative_default$12 });
588
+ /** A floating action cluster; named actions fan out from one corner. */
589
+ var generative_default$12 = defineEntry({ FloatButton: {
590
+ ...faces$1.FloatButton,
591
+ component: ({ props }) => {
592
+ const actions = Array.isArray(props.actions) ? props.actions : [{ label: "Edit" }];
593
+ return createComponent(FloatButton, {
594
+ get actions() {
595
+ return actions.map((action) => ({
596
+ ...action,
597
+ icon: action.icon ?? "pencil"
598
+ }));
599
+ },
600
+ get defaultOpen() {
601
+ return true;
602
+ },
603
+ get label() {
604
+ return props.label;
605
+ },
606
+ get placement() {
607
+ return props.placement;
608
+ },
609
+ get size() {
610
+ return props.size;
611
+ }
612
+ });
613
+ }
614
+ } });
615
+ //#endregion
616
+ //#region src/components/input/generative.tsx
617
+ var generative_exports$11 = /* @__PURE__ */ __exportAll({ default: () => generative_default$11 });
618
+ /** A single-line field; rely on border, surface and the focus halo. */
619
+ var generative_default$11 = defineEntry({ Input: {
620
+ ...faces$1.Input,
621
+ component: ({ props, bindings }) => {
622
+ const [value, setValue] = useBound(props.value, bindings?.value);
623
+ return labelled(props.label, createComponent(Input, {
624
+ get value() {
625
+ return value ?? "";
626
+ },
627
+ get placeholder() {
628
+ return props.placeholder;
629
+ },
630
+ get type() {
631
+ return props.type;
632
+ },
633
+ get disabled() {
634
+ return props.disabled;
635
+ },
636
+ onValueChange: (next) => setValue(next)
637
+ }));
638
+ }
639
+ } });
640
+ //#endregion
641
+ //#region src/components/progress/generative.tsx
642
+ var generative_exports$10 = /* @__PURE__ */ __exportAll({ default: () => generative_default$10 });
643
+ /** A working track that fills toward done. */
644
+ var generative_default$10 = defineEntry({ Progress: {
645
+ ...faces$1.Progress,
646
+ component: ({ props }) => createComponent(Progress, {
647
+ get value() {
648
+ return props.value;
649
+ },
650
+ get max() {
651
+ return props.max;
652
+ },
653
+ get label() {
654
+ return props.label;
655
+ }
656
+ })
657
+ } });
658
+ //#endregion
659
+ //#region src/components/radio-group/generative.tsx
660
+ var generative_exports$9 = /* @__PURE__ */ __exportAll({ default: () => generative_default$9 });
661
+ /** Several choices where exactly one may hold. */
662
+ var generative_default$9 = defineEntry({ RadioGroup: {
663
+ ...faces$1.RadioGroup,
664
+ component: ({ props }) => {
665
+ const values = () => props.items ?? [
666
+ "Option A",
667
+ "Option B",
668
+ "Option C"
669
+ ];
670
+ return createComponent(RadioGroup, {
671
+ get label() {
672
+ return props.label;
673
+ },
674
+ get items() {
675
+ return values().map((value) => ({
676
+ value,
677
+ label: value
678
+ }));
679
+ },
680
+ get defaultValue() {
681
+ return slug(values()[0] ?? "");
682
+ }
683
+ });
684
+ }
685
+ } });
686
+ //#endregion
687
+ //#region src/components/select/generative.tsx
688
+ var generative_exports$8 = /* @__PURE__ */ __exportAll({ default: () => generative_default$8 });
689
+ /** A choice field that opens a ruled list; options carry label and value. */
690
+ var generative_default$8 = defineEntry({ Select: {
691
+ ...faces$1.Select,
692
+ component: ({ props, bindings }) => {
693
+ const [value, setValue] = useBound(props.value, bindings?.value);
694
+ return createComponent(Select, {
695
+ get label() {
696
+ return props.label;
697
+ },
698
+ get placeholder() {
699
+ return props.placeholder;
700
+ },
701
+ get options() {
702
+ return props.options;
703
+ },
704
+ get multiple() {
705
+ return props.multiple;
706
+ },
707
+ get disabled() {
708
+ return props.disabled;
709
+ },
710
+ get value() {
711
+ return props.multiple ? Array.isArray(value) ? value : value ? [value] : void 0 : Array.isArray(value) ? value.at(0) ?? "" : value;
712
+ },
713
+ onValueChange: setValue
714
+ });
715
+ }
716
+ } });
717
+ //#endregion
718
+ //#region src/components/separator/generative.tsx
719
+ var generative_exports$7 = /* @__PURE__ */ __exportAll({ default: () => generative_default$7 });
720
+ /** Hairline divider between sections. */
721
+ var generative_default$7 = defineEntry({ Separator: {
722
+ ...faces$1.Separator,
723
+ component: ({ props }) => createComponent(Separator, {
724
+ get orientation() {
725
+ return props.orientation ?? "horizontal";
726
+ },
727
+ decorative: true
728
+ })
729
+ } });
730
+ //#endregion
731
+ //#region src/components/slider/generative.tsx
732
+ var generative_exports$6 = /* @__PURE__ */ __exportAll({ default: () => generative_default$6 });
733
+ /** A ruled track the hand slides between bounds. */
734
+ var generative_default$6 = defineEntry({ Slider: {
735
+ ...faces$1.Slider,
736
+ component: ({ props }) => createComponent(Slider, {
737
+ get label() {
738
+ return props.label;
739
+ },
740
+ get defaultValue() {
741
+ return props.value ?? 50;
742
+ },
743
+ get min() {
744
+ return props.min;
745
+ },
746
+ get max() {
747
+ return props.max;
748
+ },
749
+ get step() {
750
+ return props.step;
751
+ }
752
+ })
753
+ } });
754
+ //#endregion
755
+ //#region src/components/spinner/generative.tsx
756
+ var generative_exports$5 = /* @__PURE__ */ __exportAll({ default: () => generative_default$5 });
757
+ /** A quiet wheel for work still settling. */
758
+ var generative_default$5 = defineEntry({ Spinner: {
759
+ ...faces$1.Spinner,
760
+ component: ({ props }) => createComponent(Spinner, {
761
+ get size() {
762
+ return props.size;
763
+ },
764
+ get "aria-label"() {
765
+ return props.label;
766
+ }
767
+ })
768
+ } });
769
+ //#endregion
770
+ //#region src/components/stack/generative.tsx
771
+ var generative_exports$4 = /* @__PURE__ */ __exportAll({ default: () => generative_default$4 });
772
+ /** Flex container for layout. direction column stacks vertically, row lays side by side. gap is a named spacing step. */
773
+ var generative_default$4 = defineEntry({ Stack: {
774
+ ...faces$1.Stack,
775
+ component: ({ props, children }) => createComponent(Stack, {
776
+ get direction() {
777
+ return props.direction ?? "column";
778
+ },
779
+ get gap() {
780
+ return props.gap ?? "md";
781
+ },
782
+ get align() {
783
+ return props.align;
784
+ },
785
+ get justify() {
786
+ return props.justify;
787
+ },
788
+ get wrap() {
789
+ return props.wrap;
790
+ },
791
+ get children() {
792
+ return children;
793
+ }
794
+ })
795
+ } });
796
+ //#endregion
797
+ //#region src/components/stat/generative.tsx
798
+ var generative_exports$3 = /* @__PURE__ */ __exportAll({ default: () => generative_default$3 });
799
+ /** One loud figure with its quiet label and an optional delta. */
800
+ var generative_default$3 = defineEntry({ Stat: {
801
+ ...faces$1.Stat,
802
+ component: ({ props }) => createComponent(Stat.Root, { get children() {
803
+ return [
804
+ createComponent(Stat.Label, { get children() {
805
+ return props.label;
806
+ } }),
807
+ createComponent(Stat.Value, { get children() {
808
+ return props.value;
809
+ } }),
810
+ createComponent(Show, {
811
+ keyed: true,
812
+ get when() {
813
+ return props.change != null;
814
+ },
815
+ get children() {
816
+ return createComponent(Stat.Delta, {
817
+ get direction() {
818
+ return props.direction ?? "flat";
819
+ },
820
+ get children() {
821
+ return props.change;
822
+ }
823
+ });
824
+ }
825
+ })
826
+ ];
827
+ } })
828
+ } });
829
+ //#endregion
830
+ //#region src/components/switch/generative.tsx
831
+ var generative_exports$2 = /* @__PURE__ */ __exportAll({ default: () => generative_default$2 });
832
+ /** An instant on/off; label names what it switches. */
833
+ var generative_default$2 = defineEntry({ Switch: {
834
+ ...faces$1.Switch,
835
+ component: ({ props, bindings }) => {
836
+ const [checked, setChecked] = useBound(props.checked, bindings?.checked);
837
+ return createComponent(Switch, {
838
+ get checked() {
839
+ return checked ?? false;
840
+ },
841
+ get label() {
842
+ return props.label;
843
+ },
844
+ get disabled() {
845
+ return props.disabled;
846
+ },
847
+ onCheckedChange: (next) => setChecked(next)
848
+ });
849
+ }
850
+ } });
851
+ //#endregion
852
+ //#region src/components/textarea/generative.tsx
853
+ var generative_exports$1 = /* @__PURE__ */ __exportAll({ default: () => generative_default$1 });
854
+ /** A multi-line field for prose-length answers. */
855
+ var generative_default$1 = defineEntry({ Textarea: {
856
+ ...faces$1.Textarea,
857
+ component: ({ props, bindings }) => {
858
+ const [value, setValue] = useBound(props.value, bindings?.value);
859
+ return labelled(props.label, createComponent(Textarea, {
860
+ get value() {
861
+ return value ?? "";
862
+ },
863
+ get placeholder() {
864
+ return props.placeholder;
865
+ },
866
+ get rows() {
867
+ return props.rows;
868
+ },
869
+ get disabled() {
870
+ return props.disabled;
871
+ },
872
+ onValueChange: (next) => setValue(next)
873
+ }));
874
+ }
875
+ } });
876
+ //#endregion
877
+ //#region src/components/typography/generative.tsx
878
+ var generative_exports = /* @__PURE__ */ __exportAll({ default: () => generative_default });
879
+ /** Section heading. One per view at level 1; do not skip levels. */
880
+ var generative_default = defineEntry({
881
+ Heading: {
882
+ ...faces$1.Heading,
883
+ component: ({ props }) => createComponent(Typography.Heading, {
884
+ get class() {
885
+ return headingClass[props.level ?? "2"];
886
+ },
887
+ get children() {
888
+ return props.text;
889
+ }
890
+ })
891
+ },
892
+ Text: {
893
+ ...faces$1.Text,
894
+ component: ({ props }) => {
895
+ const Voice = textVoices[props.variant ?? "body"];
896
+ return createComponent(Voice, { get children() {
897
+ return props.text;
898
+ } });
899
+ }
900
+ }
901
+ });
902
+ //#endregion
903
+ //#region src/generative/index.ts
904
+ /** Every family writes its own generative face beside the component —
905
+ * `components/<family>/generative.tsx` — and this module is where they
906
+ * meet: one glob picks the faces up, so a family that lands in the
907
+ * package is in the vocabulary without anyone editing this file. */
908
+ const modules = /* #__PURE__ */ Object.assign({
909
+ "../components/alert/generative.tsx": generative_exports$20,
910
+ "../components/avatar/generative.tsx": generative_exports$19,
911
+ "../components/badge/generative.tsx": generative_exports$18,
912
+ "../components/banner/generative.tsx": generative_exports$17,
913
+ "../components/breadcrumb/generative.tsx": generative_exports$16,
914
+ "../components/button/generative.tsx": generative_exports$15,
915
+ "../components/card/generative.tsx": generative_exports$14,
916
+ "../components/checkbox/generative.tsx": generative_exports$13,
917
+ "../components/float-button/generative.tsx": generative_exports$12,
918
+ "../components/input/generative.tsx": generative_exports$11,
919
+ "../components/progress/generative.tsx": generative_exports$10,
920
+ "../components/radio-group/generative.tsx": generative_exports$9,
921
+ "../components/select/generative.tsx": generative_exports$8,
922
+ "../components/separator/generative.tsx": generative_exports$7,
923
+ "../components/slider/generative.tsx": generative_exports$6,
924
+ "../components/spinner/generative.tsx": generative_exports$5,
925
+ "../components/stack/generative.tsx": generative_exports$4,
926
+ "../components/stat/generative.tsx": generative_exports$3,
927
+ "../components/switch/generative.tsx": generative_exports$2,
928
+ "../components/textarea/generative.tsx": generative_exports$1,
929
+ "../components/typography/generative.tsx": generative_exports
930
+ });
931
+ const entries = {};
932
+ for (const [file, module] of Object.entries(modules)) {
933
+ const family = file.match(/components\/([^/]+)\/generative\.tsx/)?.[1] ?? file;
934
+ for (const [name, entry] of Object.entries(module.default ?? {})) {
935
+ if (entries[name]) throw new Error("Two generative faces claim \"" + name + "\": " + entries[name]._from + " and " + family);
936
+ entries[name] = {
937
+ ...entry,
938
+ _from: family
939
+ };
940
+ }
941
+ }
942
+ const faces = Object.fromEntries(Object.entries(entries).map(([name, entry]) => [name, {
943
+ props: entry.props,
944
+ description: entry.description
945
+ }]));
946
+ const catalog = defineCatalog(schema, {
947
+ components: faces,
948
+ actions: {}
949
+ });
950
+ const { registry } = defineRegistry(catalog, {
951
+ actions: {},
952
+ components: Object.fromEntries(Object.entries(entries).map(([name, entry]) => [name, entry.component]))
953
+ });
954
+ /** Which family each face came home from. A family may speak under
955
+ * several names - Layout plus its parts, Bento plus its cell - and the
956
+ * palette groups by provenance, never by guessing from the name. */
957
+ const faceFamilies = Object.fromEntries(Object.entries(entries).map(([name, entry]) => [name, entry._from]));
958
+ //#endregion
959
+ export { catalog, faceFamilies, registry };