@yahoo/uds-create-config 4.11.0 → 4.12.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (59) hide show
  1. package/dist/capture/capture-to-spec.d.ts +69 -0
  2. package/dist/capture/capture-to-spec.js +433 -0
  3. package/dist/capture/captured-tree.d.ts +65 -0
  4. package/dist/capture/captured-tree.js +201 -0
  5. package/dist/capture/class-grammar.d.ts +64 -0
  6. package/dist/capture/class-grammar.js +131 -0
  7. package/dist/capture/fixtures/tree-from-html.d.ts +3 -0
  8. package/dist/capture/icon-resolver.d.ts +59 -0
  9. package/dist/capture/icon-resolver.js +205 -0
  10. package/dist/capture/node-ops.d.ts +2 -0
  11. package/dist/capture/node-ops.js +146 -0
  12. package/dist/capture/node-patches.d.ts +32 -0
  13. package/dist/capture/node-patches.js +99 -0
  14. package/dist/configs/CanvasConfig.d.ts +1 -1
  15. package/dist/configs/CanvasConfig.js +3 -1
  16. package/dist/configs/react-native-system.d.ts +28 -20
  17. package/dist/configs/react-native-system.js +1 -1
  18. package/dist/configs/system.d.ts +12 -4
  19. package/dist/configs/system.js +4 -2
  20. package/dist/entities/native/NativeModifier.d.ts +1 -1
  21. package/dist/entities/native/NativeStyleProperty.d.ts +15 -15
  22. package/dist/entities/system/CanvasRole.d.ts +5 -1
  23. package/dist/entities/system/CanvasRole.js +7 -2
  24. package/dist/entities/system/Component.js +3 -3
  25. package/dist/entities/system/Icon.d.ts +2 -0
  26. package/dist/entities/system/Icon.js +9 -3
  27. package/dist/entities/system/Modifier.d.ts +2 -2
  28. package/dist/entities/system/copy-plan.js +1 -1
  29. package/dist/entities/system/defineComponent.d.ts +6 -3
  30. package/dist/entities/system/element.d.ts +2 -1
  31. package/dist/entities/system/element.js +3 -1
  32. package/dist/entities/system/icon-library.d.ts +21 -6
  33. package/dist/entities/system/icon-library.js +36 -15
  34. package/dist/entities/system/link-plan.js +1 -1
  35. package/dist/framework/Config.d.ts +1 -1
  36. package/dist/framework/Config.js +2 -2
  37. package/dist/framework/defineEntity.js +1 -1
  38. package/dist/framework/inline-sources.js +1 -1
  39. package/dist/framework/plan.js +1 -1
  40. package/dist/framework/projections.d.ts +27 -8
  41. package/dist/framework/projections.js +38 -9
  42. package/dist/framework/render-spec.js +2 -2
  43. package/dist/framework/schema-version.d.ts +1 -1
  44. package/dist/framework/schema-version.js +5 -5
  45. package/dist/index.d.ts +10 -5
  46. package/dist/index.js +14 -9
  47. package/dist/migrations/2.0.0/v1-artifact.d.ts +7 -3
  48. package/dist/migrations/20260923005318_icon_canvas_tool.d.ts +12 -0
  49. package/dist/migrations/20260923005318_icon_canvas_tool.js +8 -0
  50. package/dist/renderer/glyphEntries.d.ts +6 -5
  51. package/dist/renderer/glyphEntries.js +17 -13
  52. package/dist/renderer/glyphRenderable.js +19 -12
  53. package/dist/renderer/icon-library.d.ts +5 -2
  54. package/dist/renderer/resolveGlyph.d.ts +6 -2
  55. package/dist/spec/cell.js +1 -1
  56. package/dist/spec/prop-conditions.js +1 -1
  57. package/dist/spec/slot.js +1 -1
  58. package/dist/tsconfig.tsbuildinfo +1 -1
  59. package/package.json +3 -2
@@ -30,7 +30,14 @@ declare const rnStyleKey: z.ZodEnum<{
30
30
  overflow: "overflow";
31
31
  padding: "padding";
32
32
  width: "width";
33
+ elevation: "elevation";
33
34
  fontFamily: "fontFamily";
35
+ fontSize: "fontSize";
36
+ fontStyle: "fontStyle";
37
+ fontVariant: "fontVariant";
38
+ fontWeight: "fontWeight";
39
+ letterSpacing: "letterSpacing";
40
+ pointerEvents: "pointerEvents";
34
41
  alignContent: "alignContent";
35
42
  alignItems: "alignItems";
36
43
  alignSelf: "alignSelf";
@@ -72,7 +79,6 @@ declare const rnStyleKey: z.ZodEnum<{
72
79
  boxShadow: "boxShadow";
73
80
  boxSizing: "boxSizing";
74
81
  columnGap: "columnGap";
75
- elevation: "elevation";
76
82
  experimental_backgroundImage: "experimental_backgroundImage";
77
83
  experimental_backgroundPosition: "experimental_backgroundPosition";
78
84
  experimental_backgroundRepeat: "experimental_backgroundRepeat";
@@ -82,10 +88,6 @@ declare const rnStyleKey: z.ZodEnum<{
82
88
  flexGrow: "flexGrow";
83
89
  flexShrink: "flexShrink";
84
90
  flexWrap: "flexWrap";
85
- fontSize: "fontSize";
86
- fontStyle: "fontStyle";
87
- fontVariant: "fontVariant";
88
- fontWeight: "fontWeight";
89
91
  includeFontPadding: "includeFontPadding";
90
92
  insetBlock: "insetBlock";
91
93
  insetBlockEnd: "insetBlockEnd";
@@ -94,7 +96,6 @@ declare const rnStyleKey: z.ZodEnum<{
94
96
  insetInlineEnd: "insetInlineEnd";
95
97
  insetInlineStart: "insetInlineStart";
96
98
  justifyContent: "justifyContent";
97
- letterSpacing: "letterSpacing";
98
99
  lineHeight: "lineHeight";
99
100
  marginBlock: "marginBlock";
100
101
  marginBlockEnd: "marginBlockEnd";
@@ -135,7 +136,6 @@ declare const rnStyleKey: z.ZodEnum<{
135
136
  paddingStart: "paddingStart";
136
137
  paddingTop: "paddingTop";
137
138
  paddingVertical: "paddingVertical";
138
- pointerEvents: "pointerEvents";
139
139
  resizeMode: "resizeMode";
140
140
  rotation: "rotation";
141
141
  rowGap: "rowGap";
@@ -172,7 +172,7 @@ declare const NativeStyleProperty: EntityClass<z.ZodObject<Omit<{
172
172
  arbitrary: z.ZodDefault<z.ZodBoolean>;
173
173
  negates: z.ZodDefault<z.ZodBoolean>;
174
174
  opacityOf: z.ZodOptional<z.ZodLazy<z.ZodType<Ref, unknown, z.core.$ZodTypeInternals<Ref, unknown>>>>;
175
- }, "values" | "properties" | "classPrefix"> & {
175
+ }, "values" | "classPrefix" | "properties"> & {
176
176
  properties: z.ZodArray<z.ZodPipe<z.ZodPipe<z.ZodString, z.ZodTransform<string, string>>, z.ZodEnum<{
177
177
  filter: "filter";
178
178
  transform: "transform";
@@ -197,7 +197,14 @@ declare const NativeStyleProperty: EntityClass<z.ZodObject<Omit<{
197
197
  overflow: "overflow";
198
198
  padding: "padding";
199
199
  width: "width";
200
+ elevation: "elevation";
200
201
  fontFamily: "fontFamily";
202
+ fontSize: "fontSize";
203
+ fontStyle: "fontStyle";
204
+ fontVariant: "fontVariant";
205
+ fontWeight: "fontWeight";
206
+ letterSpacing: "letterSpacing";
207
+ pointerEvents: "pointerEvents";
201
208
  alignContent: "alignContent";
202
209
  alignItems: "alignItems";
203
210
  alignSelf: "alignSelf";
@@ -239,7 +246,6 @@ declare const NativeStyleProperty: EntityClass<z.ZodObject<Omit<{
239
246
  boxShadow: "boxShadow";
240
247
  boxSizing: "boxSizing";
241
248
  columnGap: "columnGap";
242
- elevation: "elevation";
243
249
  experimental_backgroundImage: "experimental_backgroundImage";
244
250
  experimental_backgroundPosition: "experimental_backgroundPosition";
245
251
  experimental_backgroundRepeat: "experimental_backgroundRepeat";
@@ -249,10 +255,6 @@ declare const NativeStyleProperty: EntityClass<z.ZodObject<Omit<{
249
255
  flexGrow: "flexGrow";
250
256
  flexShrink: "flexShrink";
251
257
  flexWrap: "flexWrap";
252
- fontSize: "fontSize";
253
- fontStyle: "fontStyle";
254
- fontVariant: "fontVariant";
255
- fontWeight: "fontWeight";
256
258
  includeFontPadding: "includeFontPadding";
257
259
  insetBlock: "insetBlock";
258
260
  insetBlockEnd: "insetBlockEnd";
@@ -261,7 +263,6 @@ declare const NativeStyleProperty: EntityClass<z.ZodObject<Omit<{
261
263
  insetInlineEnd: "insetInlineEnd";
262
264
  insetInlineStart: "insetInlineStart";
263
265
  justifyContent: "justifyContent";
264
- letterSpacing: "letterSpacing";
265
266
  lineHeight: "lineHeight";
266
267
  marginBlock: "marginBlock";
267
268
  marginBlockEnd: "marginBlockEnd";
@@ -302,7 +303,6 @@ declare const NativeStyleProperty: EntityClass<z.ZodObject<Omit<{
302
303
  paddingStart: "paddingStart";
303
304
  paddingTop: "paddingTop";
304
305
  paddingVertical: "paddingVertical";
305
- pointerEvents: "pointerEvents";
306
306
  resizeMode: "resizeMode";
307
307
  rotation: "rotation";
308
308
  rowGap: "rowGap";
@@ -15,7 +15,7 @@ import { z } from "zod";
15
15
  * one ("mirrors `@yahoo/uds-create-config`'s `CanvasRole` union without importing it") — a second
16
16
  * source of truth wearing a comment admitting it.
17
17
  */
18
- declare const CANVAS_ROLES: readonly ["frame", "text", "image"];
18
+ declare const CANVAS_ROLES: readonly ["frame", "text", "image", "icon"];
19
19
  type CanvasRoleName = (typeof CANVAS_ROLES)[number];
20
20
  declare const CanvasRole: EntityClass<z.ZodObject<{
21
21
  entries: z.ZodArray<z.ZodObject<{
@@ -24,6 +24,10 @@ declare const CanvasRole: EntityClass<z.ZodObject<{
24
24
  }, z.core.$strip>;
25
25
  default: z.ZodOptional<z.ZodBoolean>;
26
26
  defaultProps: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
27
+ props: z.ZodOptional<z.ZodObject<{
28
+ glyph: z.ZodString;
29
+ axes: z.ZodOptional<z.ZodArray<z.ZodString>>;
30
+ }, z.core.$strip>>;
27
31
  }, z.core.$strip>>;
28
32
  }, z.core.$strip>, z.ZodObject<Record<never, never>, z.core.$strip>, "canvas-role", {
29
33
  readonly create: {
@@ -30,14 +30,19 @@ import { z } from "zod";
30
30
  const CANVAS_ROLES = [
31
31
  "frame",
32
32
  "text",
33
- "image"
33
+ "image",
34
+ "icon"
34
35
  ];
35
36
  const CanvasRole = defineEntity({
36
37
  kind: "canvas-role",
37
38
  fields: z.object({ entries: z.array(z.object({
38
39
  component: Component.describe("The component this tool inserts, as a ref: `{ \"__ref\": \"component:<path>\" }`."),
39
40
  default: z.boolean().optional().describe("The entry the tool inserts when none is chosen; mark one."),
40
- defaultProps: z.record(z.string(), z.unknown()).optional().describe("Props the inserted component starts with, keyed by prop name.")
41
+ defaultProps: z.record(z.string(), z.unknown()).optional().describe("Props the inserted component starts with, keyed by prop name."),
42
+ props: z.object({
43
+ glyph: z.string().describe("The prop that takes the glyph: one whose domain is an icon library (`name: { type: \"variant\", value: Icon.ref(\"icons\") }`). Its libraries are what the picker offers."),
44
+ axes: z.array(z.string()).optional().describe("The props the picker offers as axes (`variant`, `size`), each with the values the prop itself declares.")
45
+ }).optional().describe("What the tool exposes of the component. Read by the `icon` role: the picker draws every glyph through this component and offers the named props as its axes.")
41
46
  })).describe(`The components a canvas insert tool draws with. The entity's path is the tool: one of ${CANVAS_ROLES.map((role) => `\`${role}\``).join(", ")}. A role with no entity registered has its tool disabled.`) }),
42
47
  schemas: { create: { description: `Register a canvas insert tool for this system. \`path\` is the role, one of ${CANVAS_ROLES.map((role) => `\`${role}\``).join(", ")}; \`data.entries\` names the components that tool inserts, one marked \`default\`. A system whose roles are unregistered has those canvas tools disabled, so register \`frame\` and \`text\` once a layout primitive and a text primitive exist.` } }
43
48
  });
@@ -1,18 +1,17 @@
1
- import { reject, rejectData } from "../../framework/rejection.js";
2
1
  import { canonicalCondition, isRef, kindOf, memberOf, pathOf, ref, refLeaf, refSchema, splitRef } from "../../framework/utils/refs.js";
2
+ import { childrenPolicy } from "./element.js";
3
+ import { reject, rejectData } from "../../framework/rejection.js";
3
4
  import { isPlainObject } from "../../framework/utils/field-path.js";
4
5
  import { pathInput } from "../../framework/schemas.js";
5
6
  import { defineEntity } from "../../framework/defineEntity.js";
6
7
  import { defineSubEntity } from "../../framework/defineSubEntity.js";
7
8
  import { derivedColor, gradient } from "./color.js";
8
- import { childrenPolicy } from "./element.js";
9
9
  import { listedIn } from "../../framework/utils/enumerated.js";
10
10
  import { valueSchemaOf } from "../../framework/value-domain.js";
11
11
  import { glyphLeafOf } from "./glyph-identity.js";
12
12
  import { Style, addBagKeyIssues, anatomyPropValue, bagNameEdges, bagRewriteName, bindBagTokens, collectBag, isPlainRecord, openBag, styleValue } from "./style-bag.js";
13
13
  import { storedPreview } from "../../framework/preview-store.js";
14
14
  import { glyphPropsOf, propValueDomain, refListOf, resolveComponentProps, stylePropValueLeaves, validateComponentProps } from "../../framework/projections.js";
15
- import { intoName, routedPropIn, routesContent } from "../../framework/prop-surface.js";
16
15
  import { slotAnatomyPropOf, slotTargetsOf, withoutTruthyTerm } from "../../framework/render-spec.js";
17
16
  import { listSlots, namedSlots, slotHostedBy, slotOf } from "../../spec/slot.js";
18
17
  import { cellAt } from "../../spec/cell.js";
@@ -20,6 +19,7 @@ import { instanceAt } from "../../spec/instance.js";
20
19
  import { Package } from "./Package.js";
21
20
  import { File } from "./File.js";
22
21
  import { iconDomainInvariants } from "./icon-domain-invariants.js";
22
+ import { intoName, routedPropIn, routesContent } from "../../framework/prop-surface.js";
23
23
  import { z } from "zod";
24
24
  //#region src/entities/system/Component.ts
25
25
  /**
@@ -12,11 +12,13 @@ import { z } from "zod";
12
12
  * - `{ export: { filled: '{name}Filled' } }`: a variant is another export, named by the template
13
13
  * with `{name}` replaced by the member's name; a variant not listed draws the bare export (Tabler).
14
14
  */
15
+ /** @deprecated With the group's `variantAs`; see there. */
15
16
  declare const iconVariantAs: z.ZodUnion<readonly [z.ZodObject<{
16
17
  prop: z.ZodString;
17
18
  }, z.core.$strict>, z.ZodObject<{
18
19
  export: z.ZodRecord<z.ZodString, z.ZodString>;
19
20
  }, z.core.$strict>]>;
21
+ /** @deprecated With the group's `variantAs`; see there. */
20
22
  type IconVariantAs = z.infer<typeof iconVariantAs>;
21
23
  /**
22
24
  * Icon (`icons/AcornIcon`) — one glyph in an icon library. The library (`icons`) is an EMERGENT group
@@ -14,6 +14,7 @@ import { z } from "zod";
14
14
  * - `{ export: { filled: '{name}Filled' } }`: a variant is another export, named by the template
15
15
  * with `{name}` replaced by the member's name; a variant not listed draws the bare export (Tabler).
16
16
  */
17
+ /** @deprecated With the group's `variantAs`; see there. */
17
18
  const iconVariantAs = z.union([z.strictObject({ prop: z.string().min(1) }), z.strictObject({ export: z.record(z.string().min(1), z.string().min(1)) })]);
18
19
  /**
19
20
  * Icon (`icons/AcornIcon`) — one glyph in an icon library. The library (`icons`) is an EMERGENT group
@@ -44,12 +45,17 @@ const Icon = defineEntity({
44
45
  /** Where member metadata comes from and how to read it — `{ from, format }`. The build resolves
45
46
  * the source and bakes each member's fields; see `icon-metadata.ts`. */
46
47
  metadata: iconMetadataDeclaration.optional(),
47
- /** Named sizes the set ships (`sm: 16`). */
48
+ /** Named sizes the set ships (`sm: 16`).
49
+ * @deprecated How a glyph is sized is the icon tool's component's business: the icon tool's component declares its own `size` and `variant` props, and every surface reads those. TODO: remove with a migration once no surface reads the library's copy. */
48
50
  sizes: z.record(z.string(), z.number()).optional(),
49
- /** Weights/styles the set ships (`regular`, `fill`). */
51
+ /** Weights/styles the set ships (`regular`, `fill`).
52
+ * @deprecated Which styles a glyph takes is the icon tool's component's business: the icon tool's component declares its own `size` and `variant` props, and every surface reads those. TODO: remove with a migration once no surface reads the library's copy. */
50
53
  variants: z.array(z.string()).optional(),
51
54
  /** How a variant reaches the glyph; see {@link iconVariantAs}. Absent, a variant is dropped at
52
- * render. */
55
+ * render.
56
+ * @deprecated Only the framework's raw-draw path read it; the icon tool's component passes a
57
+ * variant the way its package wants, and a set whose styles are separate exports lists them as
58
+ * members. TODO: remove with `sizes` and `variants`. */
53
59
  variantAs: iconVariantAs.optional()
54
60
  }),
55
61
  groupComputed: {
@@ -27,8 +27,8 @@ type WebActivation = (typeof WEB_ACTIVATIONS)[number];
27
27
  */
28
28
  declare const modifierGroupFields: z.ZodObject<{
29
29
  type: z.ZodOptional<z.ZodEnum<{
30
- mode: "mode";
31
30
  state: "state";
31
+ mode: "mode";
32
32
  }>>;
33
33
  default: z.ZodOptional<z.ZodObject<{
34
34
  __ref: z.ZodString;
@@ -49,8 +49,8 @@ declare const Modifier: EntityClass<z.ZodObject<{
49
49
  }, z.core.$strip>, z.ZodObject<Record<never, never>, z.core.$strip>, "composite", Record<never, never>, Record<never, never>, false, Record<never, never>, Record<never, never>>>]>;
50
50
  }, z.core.$strip>, z.ZodObject<{
51
51
  type: z.ZodOptional<z.ZodEnum<{
52
- mode: "mode";
53
52
  state: "state";
53
+ mode: "mode";
54
54
  }>>;
55
55
  default: z.ZodOptional<z.ZodObject<{
56
56
  __ref: z.ZodString;
@@ -1,5 +1,5 @@
1
- import { rejectData } from "../../framework/rejection.js";
2
1
  import { MINTED, collectRefs, isMintedRow, kindOf, pathOf, rewriteRefs, sourceOf, splitRef } from "../../framework/utils/refs.js";
2
+ import { rejectData } from "../../framework/rejection.js";
3
3
  import { kindBorrowable } from "../../framework/registry.js";
4
4
  import { File } from "./File.js";
5
5
  import { componentModuleFilePaths, componentRegistryImports } from "./component-module.js";
@@ -247,10 +247,13 @@ type ValueOf<D> = D extends readonly (infer Member)[] ? Member : D extends {
247
247
  /**
248
248
  * A glyph as a value: the component an icon library exports. Its `displayName` is the member it is,
249
249
  * which is what register stores (`icon:phosphor/XIcon`) and what the renderer resolves back to the
250
- * component. Sizing is the placing component's business, so the one prop every glyph takes is `size`.
250
+ * component. Sizing is the placing component's business, and the vocabulary of `size` is the
251
+ * library's own (one package takes pixels, another a named bucket), so the type states nothing about
252
+ * it: with the default any glyph fits, and a component that knows its library narrows
253
+ * (`GlyphComponent<number>`).
251
254
  */
252
- type GlyphComponent = ComponentType<{
253
- size?: number;
255
+ type GlyphComponent<Size extends string | number = never> = ComponentType<{
256
+ size?: Size;
254
257
  }>;
255
258
  /**
256
259
  * The members a ref-delegated domain offers, read off the registered paths: a variant whose domain
@@ -58,7 +58,8 @@ declare function renderedElement(config: Config, path: string, seen?: Set<string
58
58
  * Elements that may not be given children — React throws when one is.
59
59
  *
60
60
  * The list is HTML's, not the config's: whether `<input>` takes children is a fact about the DOM, and
61
- * a design system has no say in it.
61
+ * a design system has no say in it. `textarea` is not void, but its content is its `value`, and React
62
+ * refuses children on it the same way.
62
63
  */
63
64
  declare const VOID_ELEMENTS: ReadonlySet<string>;
64
65
  /**
@@ -89,7 +89,8 @@ function renderedElement(config, path, seen = /* @__PURE__ */ new Set()) {
89
89
  * Elements that may not be given children — React throws when one is.
90
90
  *
91
91
  * The list is HTML's, not the config's: whether `<input>` takes children is a fact about the DOM, and
92
- * a design system has no say in it.
92
+ * a design system has no say in it. `textarea` is not void, but its content is its `value`, and React
93
+ * refuses children on it the same way.
93
94
  */
94
95
  const VOID_ELEMENTS = new Set([
95
96
  "area",
@@ -104,6 +105,7 @@ const VOID_ELEMENTS = new Set([
104
105
  "meta",
105
106
  "param",
106
107
  "source",
108
+ "textarea",
107
109
  "track",
108
110
  "wbr"
109
111
  ]);
@@ -5,24 +5,30 @@ import { Icon, IconVariantAs } from "./Icon.js";
5
5
  /**
6
6
  * An icon library as its group node reads: the path, the stored set facts (`sizes`, `variants`,
7
7
  * `package`, `variantAs`, `metadata`) and the computeds the entity declares (`members`, `module`,
8
- * `version`), plus the per-member and drawer-side facts this projection derives. Typed off
8
+ * `version`), plus the per-member and component-side facts this projection derives. Typed off
9
9
  * `Icon.groups`, so a field added on the entity is visible here without a second declaration.
10
10
  */
11
11
  type IconLibrary = {
12
12
  readonly path: string;
13
13
  } & Undefinable<Omit<ReturnType<typeof Icon.groups>[number]['meta'], 'items' | 'sizes' | 'variants'>> & {
14
+ /** @deprecated The library's copy of what the icon tool's component declares as `size`. TODO: remove
15
+ * with the group field. */
14
16
  readonly sizes: Readonly<Record<string, number>>;
17
+ /** @deprecated The library's copy of what the icon tool's component declares as `variant`. TODO:
18
+ * remove with the group field. */
15
19
  readonly variants: readonly string[];
16
20
  /** For a ragged set, the members whose own `variants` differ from the set's, by leaf. A member
17
21
  * listing exactly the set's variants is left out, so the map stays as sparse as the
18
22
  * raggedness. */
19
23
  readonly memberVariants?: Readonly<Record<string, readonly string[]>>;
20
- /** The variant the library's drawer declares in its `defaultProps` — what a picker seeds when nothing is
24
+ /** The variant the component bound to the library declares in its `defaultProps` — what a picker seeds when nothing is
21
25
  * stored. Passed through as declared; a policy read validates it against {@link variants}
22
- * before trusting it. */
26
+ * before trusting it.
27
+ * @deprecated The icon tool's entry carries `defaultProps`; read them through `iconToolOf`. */
23
28
  readonly defaultVariant?: string;
24
- /** The size bucket the library's drawer declares in its `defaultProps`. Same contract as
25
- * {@link defaultVariant}: declared, not validated. */
29
+ /** The size bucket the component bound to the library declares in its `defaultProps`. Same contract as
30
+ * {@link defaultVariant}: declared, not validated.
31
+ * @deprecated As {@link defaultVariant}. */
26
32
  readonly defaultSizeKey?: string;
27
33
  };
28
34
  /** A field that may hold `undefined` may be left out: a computed's `string | undefined` reads as an
@@ -39,6 +45,8 @@ declare function iconLibrary(config: Config | null | undefined, path: string): I
39
45
  * With `variants`, the member's own list, only the templates for variants it ships are added: a
40
46
  * ragged set's member has no export for the rest, and naming one fails the module's bundle.
41
47
  */
48
+ /** @deprecated Reads `variantAs`, which goes with it; a set whose styles are separate exports lists
49
+ * them as members, and codegen imports members. */
42
50
  declare function glyphExportNames({
43
51
  variantAs,
44
52
  name,
@@ -85,6 +93,11 @@ declare function resolveIconLibraries({
85
93
  * binds nothing — `glyphLibrariesOf` is the one reading of the edge, shared with
86
94
  * {@link glyphComponentOf}.
87
95
  */
96
+ /**
97
+ * The libraries the canvas's icon tool offers: those its component's glyph prop is bound to. Empty
98
+ * when the `icon` canvas role is unregistered, which is also when the tool is disabled.
99
+ */
100
+ declare function iconToolLibraries(config: Config | null | undefined): IconLibrary[];
88
101
  declare function librariesBoundBy({
89
102
  config,
90
103
  component
@@ -112,6 +125,8 @@ declare function iconCategories(config: Config | null | undefined, libraryPath:
112
125
  * same across glyphs. A member listing only variants the set doesn't ship falls back to the set's,
113
126
  * so the axis is never empty for a set that ships one.
114
127
  */
128
+ /** @deprecated The axis is the icon tool's (`iconToolAxisOptions`); a member's own `variants` stay
129
+ * metadata to narrow it by. TODO: rewrite the callers over the tool and remove. */
115
130
  declare function memberVariantOptions(library: IconLibrary, member: string): readonly string[];
116
131
  /**
117
132
  * Whether an element type declares a prop that may survive layer-style projection. A placed
@@ -120,4 +135,4 @@ declare function memberVariantOptions(library: IconLibrary, member: string): rea
120
135
  */
121
136
  declare function isDeclaredElementProp(config: Config | null | undefined, elementType: string, propName: string): boolean;
122
137
  //#endregion
123
- export { IconLibrary, glyphExportNames, glyphType, iconCategories, iconLibraries, iconLibrary, isDeclaredElementProp, librariesBoundBy, libraryHolding, memberVariantOptions, placedGlyphElement, resolveIconLibraries };
138
+ export { IconLibrary, glyphExportNames, glyphType, iconCategories, iconLibraries, iconLibrary, iconToolLibraries, isDeclaredElementProp, librariesBoundBy, libraryHolding, memberVariantOptions, placedGlyphElement, resolveIconLibraries };
@@ -1,8 +1,8 @@
1
1
  import { createSliceMemo } from "../../framework/memo.js";
2
- import { glyphComponentOf, glyphLibrariesOf, resolveComponentProps } from "../../framework/projections.js";
2
+ import { glyphComponentOf, glyphLibrariesOf, iconToolOf, resolveComponentProps } from "../../framework/projections.js";
3
3
  import { Component } from "./Component.js";
4
- import { Icon } from "./Icon.js";
5
4
  import { parseGlyphType } from "../../spec/glyph-jsx.js";
5
+ import { Icon } from "./Icon.js";
6
6
  //#region src/entities/system/icon-library.ts
7
7
  /**
8
8
  * Icon-library reads — an icon group's node with its computeds, and the policy reads over it.
@@ -17,7 +17,7 @@ import { parseGlyphType } from "../../spec/glyph-jsx.js";
17
17
  *
18
18
  * This is the one home for the question "what icon sets does this system have" — Studio owns only
19
19
  * UI policy on top (picker state, grid geometry, recents, search ranking). A library is cached on
20
- * the slices it reads — the set (`icon`), its drawer's defaults (`component`) and the package row
20
+ * the slices it reads — the set (`icon`), its component's defaults (`component`) and the package row
21
21
  * its version comes from (`package`) — so it is reference-stable across calls on one config and
22
22
  * safe in a dep array.
23
23
  */
@@ -40,7 +40,7 @@ function iconLibrary(config, path) {
40
40
  }
41
41
  /** Per-config cache of {@link iconLibrary} answers. `package` is in the key because the set's
42
42
  * `version` resolves through the package row, not off the group node. The member walk underneath
43
- * keys on the icon slice alone, so a component write re-reads only each library's drawer defaults. */
43
+ * keys on the icon slice alone, so a component write re-reads only each library's component defaults. */
44
44
  const librariesOf = createSliceMemo({
45
45
  kinds: [
46
46
  "icon",
@@ -65,21 +65,24 @@ function readIconLibrary(config, path) {
65
65
  sizes: sizes ?? EMPTY_SIZES,
66
66
  variants: variants ?? EMPTY_VARIANTS,
67
67
  ...set.memberVariants ? { memberVariants: set.memberVariants } : {},
68
- ...drawerDefaults({
68
+ ...componentDefaults({
69
69
  config,
70
70
  library: path
71
71
  })
72
72
  };
73
73
  }
74
74
  /**
75
- * The defaults the set's drawer declares: the component whose own variant prop names this library
75
+ * The defaults the set's component declares: the component whose own variant prop names this library
76
76
  * carries "what a bare glyph looks like", read back here so every picker seeds from that one
77
77
  * declaration rather than its own literal. A library no component draws from has no defaults.
78
+ *
79
+ * @deprecated The icon tool's entry carries `defaultProps`. TODO: remove with `defaultVariant` and
80
+ * `defaultSizeKey`.
78
81
  */
79
- function drawerDefaults({ config, library }) {
80
- const drawer = glyphComponentOf(config, library);
81
- if (!drawer) return {};
82
- const defaults = Component.get(config, drawer.path)?.defaultProps;
82
+ function componentDefaults({ config, library }) {
83
+ const bound = glyphComponentOf(config, library);
84
+ if (!bound) return {};
85
+ const defaults = Component.get(config, bound.path)?.defaultProps;
83
86
  const variant = defaults?.variant;
84
87
  const size = defaults?.size;
85
88
  return {
@@ -133,6 +136,8 @@ function sameVariants({ own, declared }) {
133
136
  * With `variants`, the member's own list, only the templates for variants it ships are added: a
134
137
  * ragged set's member has no export for the rest, and naming one fails the module's bundle.
135
138
  */
139
+ /** @deprecated Reads `variantAs`, which goes with it; a set whose styles are separate exports lists
140
+ * them as members, and codegen imports members. */
136
141
  function glyphExportNames({ variantAs, name, variants }) {
137
142
  const names = new Set([name]);
138
143
  if (variantAs && "export" in variantAs) for (const [variant, template] of Object.entries(variantAs.export)) {
@@ -151,15 +156,18 @@ function glyphExportNames({ variantAs, name, variants }) {
151
156
  */
152
157
  function placedGlyphElement(config, glyph, props = {}) {
153
158
  const parsed = parseGlyphType(glyph);
154
- const drawer = parsed && config ? glyphComponentOf(config, parsed.slug) : void 0;
155
- if (!parsed || !drawer) return {
159
+ const bound = parsed && config ? glyphComponentOf(config, parsed.slug) : void 0;
160
+ if (!parsed || !bound || !config) return {
156
161
  type: glyph,
157
162
  props
158
163
  };
164
+ const tool = iconToolOf(config);
165
+ const defaults = tool && tool.component === bound.path ? tool.defaultProps : {};
159
166
  return {
160
- type: `component:${drawer.path}`,
167
+ type: `component:${bound.path}`,
161
168
  props: {
162
- [drawer.prop]: parsed.member,
169
+ ...defaults,
170
+ [bound.prop]: parsed.member,
163
171
  ...props
164
172
  }
165
173
  };
@@ -197,6 +205,17 @@ function resolveIconLibraries({ config, hints }) {
197
205
  * binds nothing — `glyphLibrariesOf` is the one reading of the edge, shared with
198
206
  * {@link glyphComponentOf}.
199
207
  */
208
+ /**
209
+ * The libraries the canvas's icon tool offers: those its component's glyph prop is bound to. Empty
210
+ * when the `icon` canvas role is unregistered, which is also when the tool is disabled.
211
+ */
212
+ function iconToolLibraries(config) {
213
+ if (!config) return NO_LIBRARIES;
214
+ const tool = iconToolOf(config);
215
+ if (!tool) return NO_LIBRARIES;
216
+ const declaration = resolveComponentProps(config, tool.component)[tool.glyph];
217
+ return glyphLibrariesOf(declaration?.value).map((path) => iconLibrary(config, path)).filter((library) => library !== void 0);
218
+ }
200
219
  function librariesBoundBy({ config, component }) {
201
220
  if (!config) return NO_LIBRARIES;
202
221
  const cache = boundLibrariesOf(config);
@@ -253,6 +272,8 @@ function iconCategories(config, libraryPath) {
253
272
  * same across glyphs. A member listing only variants the set doesn't ship falls back to the set's,
254
273
  * so the axis is never empty for a set that ships one.
255
274
  */
275
+ /** @deprecated The axis is the icon tool's (`iconToolAxisOptions`); a member's own `variants` stay
276
+ * metadata to narrow it by. TODO: rewrite the callers over the tool and remove. */
256
277
  function memberVariantOptions(library, member) {
257
278
  const own = library.memberVariants?.[member];
258
279
  if (!own || own.length === 0) return library.variants;
@@ -281,4 +302,4 @@ function isDeclaredElementProp(config, elementType, propName) {
281
302
  return false;
282
303
  }
283
304
  //#endregion
284
- export { glyphExportNames, glyphType, iconCategories, iconLibraries, iconLibrary, isDeclaredElementProp, librariesBoundBy, libraryHolding, memberVariantOptions, placedGlyphElement, resolveIconLibraries };
305
+ export { glyphExportNames, glyphType, iconCategories, iconLibraries, iconLibrary, iconToolLibraries, isDeclaredElementProp, librariesBoundBy, libraryHolding, memberVariantOptions, placedGlyphElement, resolveIconLibraries };
@@ -1,5 +1,5 @@
1
- import { rejectData } from "../../framework/rejection.js";
2
1
  import { collectRefs, isMintedRow, ref, sourceOf, splitRef } from "../../framework/utils/refs.js";
2
+ import { rejectData } from "../../framework/rejection.js";
3
3
  import { blockedBy } from "../../framework/plan.js";
4
4
  import { PIN_KIND, covers, declarationOf, narrowDeclaration } from "./link-declaration.js";
5
5
  import { planCopy, sourceEntries } from "./copy-plan.js";
@@ -72,7 +72,7 @@ interface RecordedSource {
72
72
  * The dense-counter `2` a short-lived scheme stamped before the chain existed reads as the mint
73
73
  * that replaced it (see `detectedWireVersion`).
74
74
  */
75
- declare const SERIALIZED_CONFIG_VERSION = 20260922013625;
75
+ declare const SERIALIZED_CONFIG_VERSION = 20260923005318;
76
76
  interface SerializedConfig {
77
77
  /** See {@link SERIALIZED_CONFIG_VERSION}. Always written; a stored artifact may lack it. */
78
78
  readonly version: number;
@@ -1,6 +1,6 @@
1
+ import { ENTITY_PATH_MESSAGE, MINTED, collectRefs, entityRefOf, isEntityPath, isExtendedRef, isMintedRow, isRef, kindOf, memberOf, memberRef, pathOf, qualifyRefs, ref, rewriteRefNamespace, rewriteRefSource, rewriteRefs, singletonRef, sourceOf, splitRef } from "./utils/refs.js";
1
2
  import "./config-operation-kind.js";
2
3
  import { ConfigFormatError, ConfigRejection, isConfigRejection, issuePath, refusalIssues, reject, rejectData, rejectInvalid, rejectReferrers } from "./rejection.js";
3
- import { ENTITY_PATH_MESSAGE, MINTED, collectRefs, entityRefOf, isEntityPath, isExtendedRef, isMintedRow, isRef, kindOf, memberOf, memberRef, pathOf, qualifyRefs, ref, rewriteRefNamespace, rewriteRefSource, rewriteRefs, singletonRef, sourceOf, splitRef } from "./utils/refs.js";
4
4
  import { describePatch } from "./plan.js";
5
5
  import { applyPathDelta, isPlainObject, namedFields, pathSegments, sectionDelta, touchedFields } from "./utils/field-path.js";
6
6
  import { METADATA_KEYS, declaredField } from "./utils/field-schema.js";
@@ -4836,7 +4836,7 @@ var Config = class Config {
4836
4836
  * links from the provided sources. A declared `linkedKind` with no provided source throws. */
4837
4837
  hydrateFrom(stored, options) {
4838
4838
  const claimed = schemaVersionOf(stored);
4839
- if (claimed > 20260922013625) throw new SchemaVersionTooNew(claimed);
4839
+ if (claimed > 20260923005318) throw new SchemaVersionTooNew(claimed);
4840
4840
  const wire = upgradeSerializedConfig(stored);
4841
4841
  if (!Array.isArray(wire.ownedKinds) || typeof wire.items !== "object" || wire.items === null) throw new ConfigFormatError(`Config "${stored.name ?? "system-config"}" cannot be hydrated: this is not a serialized config-v2 config (no "ownedKinds"/"items"). A pre-cutover build artifact converts through the registered cutover migration — import the config type's module (e.g. \`configs/system\`) before hydrating, or port the repo once with \`uds migrate\`.`);
4842
4842
  const leftover = wire.options;
@@ -1,5 +1,5 @@
1
- import { CONFIG_OPERATION_KIND } from "./config-operation-kind.js";
2
1
  import { isRef, kindOf, pathOf, ref, refSchema, sourceOf } from "./utils/refs.js";
2
+ import { CONFIG_OPERATION_KIND } from "./config-operation-kind.js";
3
3
  import { resolveFields } from "./schemas.js";
4
4
  import { buildKind } from "./registry.js";
5
5
  import { brandGroup } from "./utils/group.js";
@@ -1,5 +1,5 @@
1
- import { rejectData } from "./rejection.js";
2
1
  import { MINTED, collectRefs, entityRefOf, isRef, kindOf, pathOf, ref, rewriteRefs, sourceOf } from "./utils/refs.js";
2
+ import { rejectData } from "./rejection.js";
3
3
  import { kindBorrowable } from "./registry.js";
4
4
  //#region src/framework/inline-sources.ts
5
5
  /**
@@ -1,5 +1,5 @@
1
- import { isConfigRejection } from "./rejection.js";
2
1
  import { splitRef } from "./utils/refs.js";
2
+ import { isConfigRejection } from "./rejection.js";
3
3
  //#region src/framework/plan.ts
4
4
  /**
5
5
  * One line for a patch, read off the patch itself: its kind, what it did, and where. The payload
@@ -431,13 +431,31 @@ declare function glyphLibrariesOf(domain: unknown): string[];
431
431
  */
432
432
  declare function glyphPropsOf(config: Config, path: string, seen?: ReadonlySet<string>): Record<string, readonly string[]>;
433
433
  /**
434
- * The component that draws a library's glyphs on their own — the one whose own prop declares the
435
- * library as its domain (`name: { type: 'variant', value: Icon.ref('phosphor') }`, or a list of
436
- * libraries that includes it), with that prop. Derived from the components, never declared on the
437
- * set: the edge runs from the component to the library. `undefined` when no component draws from
438
- * it, in which case a placed glyph is the member drawn raw.
439
- *
440
- * Asked per library, so a system may have one drawer binding several libraries or one drawer per
434
+ * The canvas's icon tool: the `icon` canvas role's entry, as the component it inserts, the prop that
435
+ * takes the glyph, the props the picker offers as axes, and the props an inserted instance starts
436
+ * with. The default entry, else the first; `undefined` when the role is unregistered or its entry
437
+ * names no glyph prop, which disables the tool.
438
+ */
439
+ interface IconTool {
440
+ readonly component: string;
441
+ readonly glyph: string;
442
+ readonly axes: readonly string[];
443
+ readonly defaultProps: Readonly<Record<string, unknown>>;
444
+ }
445
+ declare function iconToolOf(config: Config): IconTool | undefined;
446
+ /** The values an icon tool's axis offers: the leaves of that prop's own domain on the tool's
447
+ * component, whether it enumerates them or delegates to a library's facet. */
448
+ declare function iconToolAxisOptions(config: Config, tool: IconTool, axis: string): string[];
449
+ /**
450
+ * The component that draws a library's glyphs on their own, with the prop that takes the glyph. The
451
+ * icon tool's component when the `icon` canvas role names one whose glyph prop is bound to the
452
+ * library; otherwise the component whose own prop declares the library as its domain
453
+ * (`name: { type: 'variant', value: Icon.ref('phosphor') }`, or a list of libraries that includes
454
+ * it). Derived from the components, never declared on the set: the edge runs from the component to
455
+ * the library. `undefined` when no component draws from it, in which case a placed glyph is the
456
+ * member drawn raw.
457
+ *
458
+ * Asked per library, so a system may have one component binding several libraries or one per
441
459
  * library. Two components binding the same library resolve to the first in registration order.
442
460
  */
443
461
  declare function glyphComponentOf(config: Config, library: string): {
@@ -482,6 +500,7 @@ declare function validateComponentProps(config: Config, componentPath: string, p
482
500
  declare function previewDefaults(config: Config, path: string,
483
501
  /** The cell's own prop values. Given, every `preview({ when })` entry that holds for the cell —
484
502
  * tested against the defaults under these values, as a rule's `when` is — adds its props. */
503
+
485
504
  cell?: Record<string, unknown>): Record<string, unknown>;
486
505
  /**
487
506
  * Only what the `preview({ when })` entries add for a cell — the props of every condition that holds
@@ -556,4 +575,4 @@ declare function propValueFromAxis(config: Config, path: string, prop: string, v
556
575
  /** The `value` a string, number or boolean prop declares as its default, per prop. */
557
576
  declare function declaredPropDefaults(props: Record<string, unknown> | undefined): Record<string, unknown>;
558
577
  //#endregion
559
- export { IndexedPreviewCondition, PreviewMatrix, PropDeclaration, StylePropEntry, StylePropertyItem, authoredBag, authoredValue, className, cssPropValue, cssVar, cssVarRef, declaredPropDefaults, declaredPropRouting, glyphComponentOf, glyphLibrariesOf, glyphPropsOf, holdingPreviewConditions, keyedPreviewConditions, memberFromLeaf, memberLeaves, negatedCssValue, opacityPercentage, previewConditionalProps, previewConditions, previewDefaults, previewMatrix, propOwner, propValueDomain, propValueFromAxis, refListOf, renderStyleValue, resolveComponentProps, resolveFieldValue, resolveTokenValue, resolveTokenValueUnder, routedBag, sourceVarPrefix, styleAliasesOf, styleDeclarations, stylePropEntries, stylePropLeafForToken, stylePropNegates, stylePropTokenGroup, stylePropTokenPath, stylePropTokenValues, stylePropValueFromLeaf, stylePropValueLeaves, stylePropValues, stylePropertiesWriting, stylePropertyAccepts, stylePropertyFor, stylePropertyPathFor, validateComponentProps };
578
+ export { IconTool, IndexedPreviewCondition, PreviewMatrix, PropDeclaration, StylePropEntry, StylePropertyItem, authoredBag, authoredValue, className, cssPropValue, cssVar, cssVarRef, declaredPropDefaults, declaredPropRouting, glyphComponentOf, glyphLibrariesOf, glyphPropsOf, holdingPreviewConditions, iconToolAxisOptions, iconToolOf, keyedPreviewConditions, memberFromLeaf, memberLeaves, negatedCssValue, opacityPercentage, previewConditionalProps, previewConditions, previewDefaults, previewMatrix, propOwner, propValueDomain, propValueFromAxis, refListOf, renderStyleValue, resolveComponentProps, resolveFieldValue, resolveTokenValue, resolveTokenValueUnder, routedBag, sourceVarPrefix, styleAliasesOf, styleDeclarations, stylePropEntries, stylePropLeafForToken, stylePropNegates, stylePropTokenGroup, stylePropTokenPath, stylePropTokenValues, stylePropValueFromLeaf, stylePropValueLeaves, stylePropValues, stylePropertiesWriting, stylePropertyAccepts, stylePropertyFor, stylePropertyPathFor, validateComponentProps };