@animus-ui/system 0.1.16 → 0.1.18

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 (38) hide show
  1. package/README.md +31 -0
  2. package/dist/Animus.d.ts +9 -9
  3. package/dist/Animus.d.ts.map +1 -1
  4. package/dist/AnimusExtended.d.ts +17 -9
  5. package/dist/AnimusExtended.d.ts.map +1 -1
  6. package/dist/SystemBuilder.d.ts +14 -13
  7. package/dist/SystemBuilder.d.ts.map +1 -1
  8. package/dist/class-resolver.js +1 -1
  9. package/dist/createClassResolver-CcCgar2Z.js +360 -0
  10. package/dist/{createComposedFamily-C4NovMcd.js → createComposedFamily-C9ShrVy6.js} +15 -2
  11. package/dist/declarations.d.ts +38 -0
  12. package/dist/declarations.d.ts.map +1 -0
  13. package/dist/groups/index.js +1 -1
  14. package/dist/index.d.ts +1 -1
  15. package/dist/index.d.ts.map +1 -1
  16. package/dist/index.js +308 -28
  17. package/dist/runtime/index.d.ts +2 -0
  18. package/dist/runtime/index.d.ts.map +1 -1
  19. package/dist/runtime/resolveClasses.d.ts +33 -6
  20. package/dist/runtime/resolveClasses.d.ts.map +1 -1
  21. package/dist/runtime-entry.js +2 -2
  22. package/dist/{size-C4gOY6lI.js → size-ZhCTPtA-.js} +12 -1
  23. package/dist/theme/createTheme.d.ts +30 -2
  24. package/dist/theme/createTheme.d.ts.map +1 -1
  25. package/dist/theme/resolveReferences.d.ts +6 -0
  26. package/dist/theme/resolveReferences.d.ts.map +1 -1
  27. package/dist/transforms/createTransform.d.ts +2 -0
  28. package/dist/transforms/createTransform.d.ts.map +1 -1
  29. package/dist/types/component.d.ts +12 -12
  30. package/dist/types/component.d.ts.map +1 -1
  31. package/dist/types/config.d.ts +49 -14
  32. package/dist/types/config.d.ts.map +1 -1
  33. package/dist/types/properties.d.ts +2 -2
  34. package/dist/types/properties.d.ts.map +1 -1
  35. package/dist/types/theme.d.ts +9 -1
  36. package/dist/types/theme.d.ts.map +1 -1
  37. package/package.json +2 -2
  38. package/dist/createClassResolver-EpwTL9Sa.js +0 -228
@@ -1,228 +0,0 @@
1
- import { isUnitlessProperty } from "@animus-ui/properties";
2
- //#region src/runtime/is-dev.ts
3
- /**
4
- * The define token is tested as the initializer's own conditional, never from
5
- * inside the fallback: only there can a minifier drop the dev-gated code.
6
- */
7
- const IS_DEV = typeof __ANIMUS_DEV__ === "boolean" ? __ANIMUS_DEV__ : (() => {
8
- try {
9
- if (typeof process !== "undefined" && typeof process.env === "undefined") return true;
10
- return process.env.NODE_ENV !== "production";
11
- } catch {
12
- return false;
13
- }
14
- })();
15
- //#endregion
16
- //#region src/runtime/witness.ts
17
- const WITNESS_CAP = 5e3;
18
- function recordWitness(component, prop, value, outcome) {
19
- if (!IS_DEV) return;
20
- const g = globalThis;
21
- const buf = g.__ANIMUS_WITNESS__ ??= [];
22
- buf.push({
23
- component,
24
- prop,
25
- value: String(value),
26
- outcome
27
- });
28
- if (buf.length > 5e3) buf.splice(0, buf.length - WITNESS_CAP);
29
- }
30
- //#endregion
31
- //#region src/runtime/resolveClasses.ts
32
- /**
33
- * A mixed property set resolves to unitless: a bare number on a length
34
- * property is dropped by the parser, `px` on a unitless one shifts layout.
35
- */
36
- function applyUnitFallback(value, cssProperties) {
37
- if (typeof value === "number") {
38
- if (cssProperties.some(isUnitlessProperty)) return String(value);
39
- return `${value}px`;
40
- }
41
- return String(value);
42
- }
43
- /**
44
- * The key format is fixed by the Rust css generator; a divergence here misses
45
- * every static class lookup.
46
- */
47
- function serializeValueKey(value) {
48
- if (typeof value === "number" || typeof value === "string") return String(value);
49
- if (typeof value === "object" && value !== null && !Array.isArray(value)) return Object.keys(value).sort().map((k) => `${k}:${value[k]}`).join("|");
50
- return String(value);
51
- }
52
- function isValidTransformResult(result) {
53
- return typeof result === "string" || typeof result === "number" && Number.isFinite(result);
54
- }
55
- /**
56
- * The domain is results that failed `isValidTransformResult`; a valid string
57
- * or finite number passed here is mislabeled.
58
- */
59
- function describeResultShape(result) {
60
- if (result === null) return "null";
61
- if (Array.isArray(result)) return "array";
62
- if (typeof result === "number") return "non-finite-number";
63
- return typeof result;
64
- }
65
- function resolveEntry(value, dc) {
66
- const key = String(value);
67
- const scaleResolved = dc.scaleValues?.[key];
68
- if (scaleResolved != null) {
69
- const transformed = dc.transform ? dc.transform(scaleResolved) : scaleResolved;
70
- if (dc.transform && !isValidTransformResult(transformed)) return { shape: describeResultShape(transformed) };
71
- return String(transformed);
72
- }
73
- const transformed = dc.transform ? dc.transform(value) : value;
74
- if (dc.transform && !isValidTransformResult(transformed)) return { shape: describeResultShape(transformed) };
75
- if (typeof transformed !== "number") return String(transformed);
76
- return applyUnitFallback(transformed, dc.properties && dc.properties.length > 0 ? dc.properties : dc.property ? [dc.property] : []);
77
- }
78
- const warnedDrops = /* @__PURE__ */ new Set();
79
- function warnDroppedValue(baseClassName, propName, serializedValue) {
80
- if (IS_DEV) {
81
- const dedupeKey = `${baseClassName}|${propName}`;
82
- if (warnedDrops.has(dedupeKey)) return;
83
- warnedDrops.add(dedupeKey);
84
- console.warn(`[animus:drop] ${baseClassName}: value ${serializedValue} on prop '${propName}' matched no static class and no dynamic slot — it will not render. If this prop should accept runtime values, ensure its dynamic config is emitted.`);
85
- }
86
- }
87
- /**
88
- * A value taken from a variant default emits `--{prop}-default`, not the
89
- * value, so the compose override rule misses and the parent's value wins.
90
- */
91
- function applyVariantClasses(classes, baseClassName, props, config) {
92
- if (!config.variants) return;
93
- for (const [prop, vc] of Object.entries(config.variants)) {
94
- const value = props[prop] ?? vc.default;
95
- if (value != null) {
96
- const isDefault = !(prop in props) && vc.default != null;
97
- classes.push(`${baseClassName}--${prop}-${isDefault ? "default" : value}`);
98
- recordWitness(baseClassName, prop, value, "static");
99
- }
100
- }
101
- }
102
- function applyCompoundClasses(classes, props, config) {
103
- if (!config.compounds) return;
104
- for (const compound of config.compounds) {
105
- let match = true;
106
- for (const [prop, expected] of Object.entries(compound.conditions)) {
107
- const current = props[prop] ?? config.variants?.[prop]?.default;
108
- if (Array.isArray(expected) ? !expected.includes(current) : current !== expected) {
109
- match = false;
110
- break;
111
- }
112
- }
113
- if (match) classes.push(compound.className);
114
- }
115
- }
116
- function applyStateClasses(classes, baseClassName, props, config, activeStates) {
117
- if (!config.states) return;
118
- for (const state of config.states) if (props[state]) {
119
- classes.push(`${baseClassName}--${state}`);
120
- activeStates.push(state);
121
- recordWitness(baseClassName, state, "true", "static");
122
- }
123
- }
124
- const warnedInvalidResults = /* @__PURE__ */ new Set();
125
- function warnInvalidTransformResult(baseClassName, propName, shape) {
126
- if (IS_DEV) {
127
- const dedupeKey = `${baseClassName}|${propName}`;
128
- if (warnedInvalidResults.has(dedupeKey)) return;
129
- warnedInvalidResults.add(dedupeKey);
130
- console.warn(`[animus:drop] ${baseClassName}: transform for prop '${propName}' returned ${shape} — expected string or finite number; value dropped`);
131
- }
132
- }
133
- /**
134
- * Resolution is staged so a drop is atomic: one invalid transform result
135
- * anywhere leaves `classes` and `dynStyle` untouched.
136
- */
137
- function applyDynamicProp(classes, dynStyle, propValue, dc) {
138
- const staged = [];
139
- if (typeof propValue === "object" && propValue !== null && !Array.isArray(propValue)) for (const [bp, bpVal] of Object.entries(propValue)) {
140
- if (bpVal == null) continue;
141
- const resolved = resolveEntry(bpVal, dc);
142
- if (typeof resolved !== "string") return resolved;
143
- staged.push(bp === "_" ? [
144
- dc.slotClass,
145
- dc.varName,
146
- resolved
147
- ] : [
148
- `${dc.slotClass}-${bp}`,
149
- `${dc.varName}-${bp}`,
150
- resolved
151
- ]);
152
- }
153
- else {
154
- const resolved = resolveEntry(propValue, dc);
155
- if (typeof resolved !== "string") return resolved;
156
- staged.push([
157
- dc.slotClass,
158
- dc.varName,
159
- resolved
160
- ]);
161
- }
162
- for (const [slotClass, varName, resolved] of staged) {
163
- classes.push(slotClass);
164
- dynStyle[varName] = resolved;
165
- }
166
- return null;
167
- }
168
- function resolveClasses(baseClassName, props, config, systemPropMap, dynamicPropConfig) {
169
- const classes = [baseClassName];
170
- let dynStyle;
171
- applyVariantClasses(classes, baseClassName, props, config);
172
- applyCompoundClasses(classes, props, config);
173
- const activeStates = [];
174
- applyStateClasses(classes, baseClassName, props, config, activeStates);
175
- const systemPropNames = config.systemPropNames || [];
176
- if (systemPropNames.length > 0) {
177
- const { customPropMap, customDynamicConfig } = config;
178
- for (const propName of systemPropNames) {
179
- if (!(propName in props)) continue;
180
- const propValue = props[propName];
181
- if (propValue == null) continue;
182
- const key = serializeValueKey(propValue);
183
- const cls = customPropMap?.[propName]?.[key] ?? systemPropMap?.[propName]?.[key];
184
- if (cls) {
185
- classes.push(cls);
186
- recordWitness(baseClassName, propName, key, "static");
187
- } else {
188
- const dc = customDynamicConfig?.[propName] ?? dynamicPropConfig?.[propName];
189
- if (dc) {
190
- const staged = dynStyle ?? {};
191
- const invalid = applyDynamicProp(classes, staged, propValue, dc);
192
- if (invalid === null) {
193
- dynStyle = staged;
194
- recordWitness(baseClassName, propName, key, "dynamic");
195
- } else {
196
- warnInvalidTransformResult(baseClassName, propName, invalid.shape);
197
- recordWitness(baseClassName, propName, key, "drop");
198
- }
199
- } else {
200
- warnDroppedValue(baseClassName, propName, key);
201
- recordWitness(baseClassName, propName, key, "drop");
202
- }
203
- }
204
- }
205
- }
206
- return {
207
- classes,
208
- dynamicStyle: dynStyle,
209
- activeStates
210
- };
211
- }
212
- //#endregion
213
- //#region src/runtime/createClassResolver.ts
214
- function serializeDynamicStyle(style) {
215
- return Object.entries(style).map(([property, value]) => `${property}: ${value}`).join("; ");
216
- }
217
- function createClassResolver(className, config, systemPropMap, dynamicPropConfig) {
218
- const resolveAttributes = (props) => {
219
- const { classes, dynamicStyle } = resolveClasses(className, props || {}, config, systemPropMap, dynamicPropConfig);
220
- const attributes = { class: classes.join(" ") };
221
- if (dynamicStyle && Object.keys(dynamicStyle).length > 0) attributes.style = serializeDynamicStyle(dynamicStyle);
222
- return attributes;
223
- };
224
- const resolver = (props) => resolveClasses(className, props || {}, config, systemPropMap, dynamicPropConfig).classes.join(" ");
225
- return Object.assign(resolver, { attrs: resolveAttributes });
226
- }
227
- //#endregion
228
- export { resolveClasses as n, createClassResolver as t };