@toyz/loom 0.4.0 → 0.6.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.
Files changed (113) hide show
  1. package/dist/app.d.ts +4 -1
  2. package/dist/app.d.ts.map +1 -1
  3. package/dist/app.js +9 -9
  4. package/dist/app.js.map +1 -1
  5. package/dist/decorators/create.d.ts +16 -25
  6. package/dist/decorators/create.d.ts.map +1 -1
  7. package/dist/decorators/create.js +25 -34
  8. package/dist/decorators/create.js.map +1 -1
  9. package/dist/decorators/events.d.ts +10 -8
  10. package/dist/decorators/events.d.ts.map +1 -1
  11. package/dist/decorators/events.js +53 -43
  12. package/dist/decorators/events.js.map +1 -1
  13. package/dist/decorators/index.d.ts +1 -0
  14. package/dist/decorators/index.d.ts.map +1 -1
  15. package/dist/decorators/index.js +1 -0
  16. package/dist/decorators/index.js.map +1 -1
  17. package/dist/decorators/symbols.d.ts +2 -0
  18. package/dist/decorators/symbols.d.ts.map +1 -1
  19. package/dist/decorators/symbols.js +2 -0
  20. package/dist/decorators/symbols.js.map +1 -1
  21. package/dist/di/decorators.d.ts +15 -15
  22. package/dist/di/decorators.d.ts.map +1 -1
  23. package/dist/di/decorators.js +23 -33
  24. package/dist/di/decorators.js.map +1 -1
  25. package/dist/di/watch.d.ts +5 -20
  26. package/dist/di/watch.d.ts.map +1 -1
  27. package/dist/di/watch.js +5 -38
  28. package/dist/di/watch.js.map +1 -1
  29. package/dist/element/decorators.d.ts +26 -10
  30. package/dist/element/decorators.d.ts.map +1 -1
  31. package/dist/element/decorators.js +75 -31
  32. package/dist/element/decorators.js.map +1 -1
  33. package/dist/element/element.d.ts.map +1 -1
  34. package/dist/element/element.js +15 -3
  35. package/dist/element/element.js.map +1 -1
  36. package/dist/element/form.d.ts +63 -0
  37. package/dist/element/form.d.ts.map +1 -0
  38. package/dist/element/form.js +167 -0
  39. package/dist/element/form.js.map +1 -0
  40. package/dist/element/icon.d.ts +3 -3
  41. package/dist/element/icon.d.ts.map +1 -1
  42. package/dist/element/icon.js +131 -74
  43. package/dist/element/icon.js.map +1 -1
  44. package/dist/element/index.d.ts +8 -1
  45. package/dist/element/index.d.ts.map +1 -1
  46. package/dist/element/index.js +9 -1
  47. package/dist/element/index.js.map +1 -1
  48. package/dist/element/lazy.d.ts +31 -0
  49. package/dist/element/lazy.d.ts.map +1 -0
  50. package/dist/element/lazy.js +71 -0
  51. package/dist/element/lazy.js.map +1 -0
  52. package/dist/element/lifecycle.d.ts +27 -29
  53. package/dist/element/lifecycle.d.ts.map +1 -1
  54. package/dist/element/lifecycle.js +60 -79
  55. package/dist/element/lifecycle.js.map +1 -1
  56. package/dist/element/slots.d.ts +23 -0
  57. package/dist/element/slots.d.ts.map +1 -0
  58. package/dist/element/slots.js +54 -0
  59. package/dist/element/slots.js.map +1 -0
  60. package/dist/element/timing.d.ts +10 -7
  61. package/dist/element/timing.d.ts.map +1 -1
  62. package/dist/element/timing.js +67 -52
  63. package/dist/element/timing.js.map +1 -1
  64. package/dist/element/transition.d.ts +32 -0
  65. package/dist/element/transition.d.ts.map +1 -0
  66. package/dist/element/transition.js +70 -0
  67. package/dist/element/transition.js.map +1 -0
  68. package/dist/element/virtual.js +235 -194
  69. package/dist/element/virtual.js.map +1 -1
  70. package/dist/index.d.ts +3 -2
  71. package/dist/index.d.ts.map +1 -1
  72. package/dist/index.js +2 -1
  73. package/dist/index.js.map +1 -1
  74. package/dist/router/decorators.d.ts +9 -38
  75. package/dist/router/decorators.d.ts.map +1 -1
  76. package/dist/router/decorators.js +7 -52
  77. package/dist/router/decorators.js.map +1 -1
  78. package/dist/router/link.d.ts +4 -4
  79. package/dist/router/link.d.ts.map +1 -1
  80. package/dist/router/link.js +134 -72
  81. package/dist/router/link.js.map +1 -1
  82. package/dist/router/outlet.d.ts +2 -2
  83. package/dist/router/outlet.d.ts.map +1 -1
  84. package/dist/router/outlet.js +188 -138
  85. package/dist/router/outlet.js.map +1 -1
  86. package/dist/router/route-lifecycle.d.ts +2 -2
  87. package/dist/router/route-lifecycle.d.ts.map +1 -1
  88. package/dist/router/route-lifecycle.js +18 -8
  89. package/dist/router/route-lifecycle.js.map +1 -1
  90. package/dist/router/route.d.ts +1 -1
  91. package/dist/router/route.d.ts.map +1 -1
  92. package/dist/router/router.js +2 -2
  93. package/dist/router/router.js.map +1 -1
  94. package/dist/store/decorators.d.ts +32 -24
  95. package/dist/store/decorators.d.ts.map +1 -1
  96. package/dist/store/decorators.js +98 -117
  97. package/dist/store/decorators.js.map +1 -1
  98. package/dist/store/watch.d.ts +24 -11
  99. package/dist/store/watch.d.ts.map +1 -1
  100. package/dist/store/watch.js +43 -16
  101. package/dist/store/watch.js.map +1 -1
  102. package/dist/testing.d.ts +55 -0
  103. package/dist/testing.d.ts.map +1 -0
  104. package/dist/testing.js +99 -0
  105. package/dist/testing.js.map +1 -0
  106. package/dist/transform/transform.d.ts +7 -3
  107. package/dist/transform/transform.d.ts.map +1 -1
  108. package/dist/transform/transform.js +17 -9
  109. package/dist/transform/transform.js.map +1 -1
  110. package/dist/transform/typed.d.ts +1 -1
  111. package/dist/transform/typed.d.ts.map +1 -1
  112. package/dist/transform/typed.js.map +1 -1
  113. package/package.json +5 -1
@@ -0,0 +1,167 @@
1
+ /**
2
+ * Loom — @form<T> property decorator
3
+ *
4
+ * DOM-independent form state management with validation, transforms,
5
+ * dirty tracking, and explicit template binding.
6
+ *
7
+ * ```ts
8
+ * @form<LoginForm>({
9
+ * email: { transform: toTrimmed, validate: v => v.includes("@") || "Invalid email" },
10
+ * password: { validate: v => v.length >= 8 || "Min 8 chars" },
11
+ * remember: { transform: toBoolean },
12
+ * })
13
+ * accessor login!: FormState<LoginForm>;
14
+ *
15
+ * update() {
16
+ * const f = this.login;
17
+ * return (
18
+ * <form>
19
+ * <input value={f.data.email} onInput={f.bind("email")} />
20
+ * <input value={f.data.password} onInput={f.bind("password")} />
21
+ * <button disabled={!f.valid}>Submit</button>
22
+ * </form>
23
+ * );
24
+ * }
25
+ * ```
26
+ */
27
+ // ── Helpers ──
28
+ /**
29
+ * Read a form element's value, handling checkboxes.
30
+ */
31
+ function readInputValue(input) {
32
+ if (input instanceof HTMLInputElement && input.type === "checkbox") {
33
+ return input.checked ? "true" : "false";
34
+ }
35
+ return input.value;
36
+ }
37
+ // ── Core ──
38
+ /**
39
+ * Create a FormState<T> instance — pure reactive data, no DOM dependency.
40
+ */
41
+ export function createFormState(schema, scheduleUpdate) {
42
+ // Initialize all fields to empty string (or transform of empty)
43
+ const initial = {};
44
+ const current = {};
45
+ const errors = {};
46
+ const touched = new Set();
47
+ let validatedAll = false;
48
+ for (const key of Object.keys(schema)) {
49
+ const fieldSchema = schema[key];
50
+ const raw = "";
51
+ const transformed = fieldSchema?.transform ? fieldSchema.transform(raw) : raw;
52
+ initial[key] = transformed;
53
+ current[key] = transformed;
54
+ }
55
+ let isValid = true;
56
+ // Compute initial validity (without surfacing errors)
57
+ for (const key of Object.keys(schema)) {
58
+ const fieldSchema = schema[key];
59
+ if (fieldSchema?.validate) {
60
+ const result = fieldSchema.validate(current[key]);
61
+ if (result !== true)
62
+ isValid = false;
63
+ }
64
+ }
65
+ // Validation — only surfaces errors for touched fields (or all if validate() was called)
66
+ function runValidation() {
67
+ let allValid = true;
68
+ for (const key of Object.keys(schema)) {
69
+ const fieldSchema = schema[key];
70
+ if (fieldSchema?.validate) {
71
+ const result = fieldSchema.validate(current[key]);
72
+ if (result === true) {
73
+ delete errors[key];
74
+ }
75
+ else {
76
+ allValid = false;
77
+ // Only surface error if field was touched or validate() was called
78
+ if (touched.has(key) || validatedAll) {
79
+ errors[key] = result;
80
+ }
81
+ }
82
+ }
83
+ }
84
+ isValid = allValid;
85
+ return allValid;
86
+ }
87
+ // Bind handlers cache
88
+ const bindCache = new Map();
89
+ const state = {
90
+ get data() {
91
+ return current;
92
+ },
93
+ get errors() {
94
+ return errors;
95
+ },
96
+ get valid() {
97
+ return isValid;
98
+ },
99
+ get dirty() {
100
+ for (const key of Object.keys(schema)) {
101
+ if (current[key] !== initial[key])
102
+ return true;
103
+ }
104
+ return false;
105
+ },
106
+ reset() {
107
+ for (const key of Object.keys(schema)) {
108
+ current[key] = initial[key];
109
+ }
110
+ touched.clear();
111
+ validatedAll = false;
112
+ // Clear all errors on reset
113
+ for (const key of Object.keys(errors)) {
114
+ delete errors[key];
115
+ }
116
+ scheduleUpdate();
117
+ },
118
+ validate() {
119
+ validatedAll = true;
120
+ const result = runValidation();
121
+ scheduleUpdate();
122
+ return result;
123
+ },
124
+ bind(field) {
125
+ const key = field;
126
+ if (!bindCache.has(key)) {
127
+ bindCache.set(key, (e) => {
128
+ const input = e.target;
129
+ const raw = readInputValue(input);
130
+ const fieldSchema = schema[field];
131
+ const transformed = fieldSchema?.transform ? fieldSchema.transform(raw) : raw;
132
+ current[key] = transformed;
133
+ touched.add(key);
134
+ runValidation();
135
+ scheduleUpdate();
136
+ });
137
+ }
138
+ return bindCache.get(key);
139
+ },
140
+ };
141
+ return state;
142
+ }
143
+ // ── Decorator ──
144
+ /**
145
+ * @form<T>(schema) — Auto-accessor decorator
146
+ *
147
+ * Creates a FormState<T> eagerly at class initialization.
148
+ * No DOM dependency — use `.bind(field)` in your template for explicit binding.
149
+ */
150
+ export function form(schema) {
151
+ return (_target, context) => {
152
+ const stateKey = Symbol(`form:${String(context.name)}`);
153
+ return {
154
+ get() {
155
+ if (!this[stateKey]) {
156
+ const scheduleUpdate = () => this.scheduleUpdate?.();
157
+ this[stateKey] = createFormState(schema, scheduleUpdate);
158
+ }
159
+ return this[stateKey];
160
+ },
161
+ set(_val) {
162
+ // Ignore external sets — state is managed internally
163
+ },
164
+ };
165
+ };
166
+ }
167
+ //# sourceMappingURL=form.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"form.js","sourceRoot":"","sources":["../../src/element/form.ts"],"names":[],"mappings":"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"}
@@ -14,11 +14,11 @@
14
14
  import { LoomElement } from "./element";
15
15
  export declare class LoomIcon extends LoomElement {
16
16
  /** Icon name (must be registered via LoomIcon.register) */
17
- name: string;
17
+ accessor name: string;
18
18
  /** Size in pixels */
19
- size: number;
19
+ accessor size: number;
20
20
  /** Stroke color (CSS value) */
21
- color: string;
21
+ accessor color: string;
22
22
  /** Register an icon. `svgInner` is the SVG inner content (paths, circles, etc). */
23
23
  static register(name: string, svgInner: string): void;
24
24
  /** Register multiple icons at once. */
@@ -1 +1 @@
1
- {"version":3,"file":"icon.d.ts","sourceRoot":"","sources":["../../src/element/icon.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AA6BxC,qBACa,QAAS,SAAQ,WAAW;IAEvC,2DAA2D;IACrD,IAAI,SAAM;IAEhB,qBAAqB;IACf,IAAI,SAAM;IAEhB,+BAA+B;IACzB,KAAK,SAAkB;IAE7B,mFAAmF;IACnF,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI;IAIrD,uCAAuC;IACvC,MAAM,CAAC,WAAW,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI;IAMvD,sCAAsC;IACtC,MAAM,CAAC,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAIjC,sCAAsC;IACtC,MAAM,KAAK,KAAK,IAAI,MAAM,EAAE,CAE3B;IAED,mFAAmF;IACnF,wBAAwB,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,EAAE,GAAG,EAAE,MAAM,GAAG,IAAI;IAU9E,iBAAiB;IASjB,MAAM;CAiBP"}
1
+ {"version":3,"file":"icon.d.ts","sourceRoot":"","sources":["../../src/element/icon.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AA6BxC,qBACa,QAAS,SAAQ,WAAW;IAEvC,2DAA2D;IACrD,QAAQ,CAAC,IAAI,SAAM;IAEzB,qBAAqB;IACf,QAAQ,CAAC,IAAI,SAAM;IAEzB,+BAA+B;IACzB,QAAQ,CAAC,KAAK,SAAkB;IAEtC,mFAAmF;IACnF,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI;IAIrD,uCAAuC;IACvC,MAAM,CAAC,WAAW,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI;IAMvD,sCAAsC;IACtC,MAAM,CAAC,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAIjC,sCAAsC;IACtC,MAAM,KAAK,KAAK,IAAI,MAAM,EAAE,CAE3B;IAED,mFAAmF;IACnF,wBAAwB,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,EAAE,GAAG,EAAE,MAAM,GAAG,IAAI;IAU9E,iBAAiB;IASjB,MAAM;CAiBP"}
@@ -11,11 +11,39 @@
11
11
  * // Use anywhere in JSX
12
12
  * <loom-icon name="bolt" size={20} color="var(--accent)" />
13
13
  */
14
- var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
15
- var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
16
- if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
17
- else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
18
- return c > 3 && r && Object.defineProperty(target, key, r), r;
14
+ var __esDecorate = (this && this.__esDecorate) || function (ctor, descriptorIn, decorators, contextIn, initializers, extraInitializers) {
15
+ function accept(f) { if (f !== void 0 && typeof f !== "function") throw new TypeError("Function expected"); return f; }
16
+ var kind = contextIn.kind, key = kind === "getter" ? "get" : kind === "setter" ? "set" : "value";
17
+ var target = !descriptorIn && ctor ? contextIn["static"] ? ctor : ctor.prototype : null;
18
+ var descriptor = descriptorIn || (target ? Object.getOwnPropertyDescriptor(target, contextIn.name) : {});
19
+ var _, done = false;
20
+ for (var i = decorators.length - 1; i >= 0; i--) {
21
+ var context = {};
22
+ for (var p in contextIn) context[p] = p === "access" ? {} : contextIn[p];
23
+ for (var p in contextIn.access) context.access[p] = contextIn.access[p];
24
+ context.addInitializer = function (f) { if (done) throw new TypeError("Cannot add initializers after decoration has completed"); extraInitializers.push(accept(f || null)); };
25
+ var result = (0, decorators[i])(kind === "accessor" ? { get: descriptor.get, set: descriptor.set } : descriptor[key], context);
26
+ if (kind === "accessor") {
27
+ if (result === void 0) continue;
28
+ if (result === null || typeof result !== "object") throw new TypeError("Object expected");
29
+ if (_ = accept(result.get)) descriptor.get = _;
30
+ if (_ = accept(result.set)) descriptor.set = _;
31
+ if (_ = accept(result.init)) initializers.unshift(_);
32
+ }
33
+ else if (_ = accept(result)) {
34
+ if (kind === "field") initializers.unshift(_);
35
+ else descriptor[key] = _;
36
+ }
37
+ }
38
+ if (target) Object.defineProperty(target, contextIn.name, descriptor);
39
+ done = true;
40
+ };
41
+ var __runInitializers = (this && this.__runInitializers) || function (thisArg, initializers, value) {
42
+ var useValue = arguments.length > 2;
43
+ for (var i = 0; i < initializers.length; i++) {
44
+ value = useValue ? initializers[i].call(thisArg, value) : initializers[i].call(thisArg);
45
+ }
46
+ return useValue ? value : void 0;
19
47
  };
20
48
  import { LoomElement } from "./element";
21
49
  import { component } from "./decorators";
@@ -43,78 +71,107 @@ const baseStyles = css `
43
71
  `;
44
72
  /** Icon path data registry (name → SVG inner content) */
45
73
  const registry = new Map();
46
- let LoomIcon = class LoomIcon extends LoomElement {
47
- /** Icon name (must be registered via LoomIcon.register) */
48
- name = "";
49
- /** Size in pixels */
50
- size = 24;
51
- /** Stroke color (CSS value) */
52
- color = "currentColor";
53
- /** Register an icon. `svgInner` is the SVG inner content (paths, circles, etc). */
54
- static register(name, svgInner) {
55
- registry.set(name, svgInner);
56
- }
57
- /** Register multiple icons at once. */
58
- static registerAll(icons) {
59
- for (const [name, svg] of Object.entries(icons)) {
60
- registry.set(name, svg);
74
+ let LoomIcon = (() => {
75
+ let _classDecorators = [component("loom-icon")];
76
+ let _classDescriptor;
77
+ let _classExtraInitializers = [];
78
+ let _classThis;
79
+ let _classSuper = LoomElement;
80
+ let _name_decorators;
81
+ let _name_initializers = [];
82
+ let _name_extraInitializers = [];
83
+ let _size_decorators;
84
+ let _size_initializers = [];
85
+ let _size_extraInitializers = [];
86
+ let _color_decorators;
87
+ let _color_initializers = [];
88
+ let _color_extraInitializers = [];
89
+ var LoomIcon = class extends _classSuper {
90
+ static { _classThis = this; }
91
+ static {
92
+ const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
93
+ _name_decorators = [prop];
94
+ _size_decorators = [prop];
95
+ _color_decorators = [prop];
96
+ __esDecorate(this, null, _name_decorators, { kind: "accessor", name: "name", static: false, private: false, access: { has: obj => "name" in obj, get: obj => obj.name, set: (obj, value) => { obj.name = value; } }, metadata: _metadata }, _name_initializers, _name_extraInitializers);
97
+ __esDecorate(this, null, _size_decorators, { kind: "accessor", name: "size", static: false, private: false, access: { has: obj => "size" in obj, get: obj => obj.size, set: (obj, value) => { obj.size = value; } }, metadata: _metadata }, _size_initializers, _size_extraInitializers);
98
+ __esDecorate(this, null, _color_decorators, { kind: "accessor", name: "color", static: false, private: false, access: { has: obj => "color" in obj, get: obj => obj.color, set: (obj, value) => { obj.color = value; } }, metadata: _metadata }, _color_initializers, _color_extraInitializers);
99
+ __esDecorate(null, _classDescriptor = { value: _classThis }, _classDecorators, { kind: "class", name: _classThis.name, metadata: _metadata }, null, _classExtraInitializers);
100
+ LoomIcon = _classThis = _classDescriptor.value;
101
+ if (_metadata) Object.defineProperty(_classThis, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
102
+ __runInitializers(_classThis, _classExtraInitializers);
61
103
  }
62
- }
63
- /** Check if an icon is registered. */
64
- static has(name) {
65
- return registry.has(name);
66
- }
67
- /** List all registered icon names. */
68
- static get names() {
69
- return Array.from(registry.keys());
70
- }
71
- /** Immediately apply size/color from attributes — runs before connectedCallback */
72
- attributeChangedCallback(name, _old, val) {
73
- // Note: @component decorator wraps this method and parses @prop values
74
- // before calling us. We just sync the CSS custom properties immediately.
75
- if (name === "size" && val !== null) {
76
- this.style.setProperty("--_s", `${val}px`);
104
+ #name_accessor_storage = __runInitializers(this, _name_initializers, "");
105
+ /** Icon name (must be registered via LoomIcon.register) */
106
+ get name() { return this.#name_accessor_storage; }
107
+ set name(value) { this.#name_accessor_storage = value; }
108
+ #size_accessor_storage = (__runInitializers(this, _name_extraInitializers), __runInitializers(this, _size_initializers, 24));
109
+ /** Size in pixels */
110
+ get size() { return this.#size_accessor_storage; }
111
+ set size(value) { this.#size_accessor_storage = value; }
112
+ #color_accessor_storage = (__runInitializers(this, _size_extraInitializers), __runInitializers(this, _color_initializers, "currentColor"));
113
+ /** Stroke color (CSS value) */
114
+ get color() { return this.#color_accessor_storage; }
115
+ set color(value) { this.#color_accessor_storage = value; }
116
+ /** Register an icon. `svgInner` is the SVG inner content (paths, circles, etc). */
117
+ static register(name, svgInner) {
118
+ registry.set(name, svgInner);
77
119
  }
78
- else if (name === "color" && val !== null) {
79
- this.style.setProperty("--_c", val);
120
+ /** Register multiple icons at once. */
121
+ static registerAll(icons) {
122
+ for (const [name, svg] of Object.entries(icons)) {
123
+ registry.set(name, svg);
124
+ }
80
125
  }
81
- }
82
- connectedCallback() {
83
- // Set CSS vars from current attributes before first paint
84
- const s = this.getAttribute("size");
85
- const c = this.getAttribute("color");
86
- this.style.setProperty("--_s", `${s ?? this.size}px`);
87
- if (c)
88
- this.style.setProperty("--_c", c);
89
- super.connectedCallback();
90
- }
91
- update() {
92
- this.shadow.adoptedStyleSheets = [baseStyles];
93
- this.style.setProperty("--_s", `${this.size}px`);
94
- this.style.setProperty("--_c", this.color);
95
- const inner = registry.get(this.name);
96
- if (!inner) {
97
- const placeholder = document.createElement("span");
98
- return placeholder;
126
+ /** Check if an icon is registered. */
127
+ static has(name) {
128
+ return registry.has(name);
99
129
  }
100
- const svg = document.createElementNS("http://www.w3.org/2000/svg", "svg");
101
- svg.setAttribute("viewBox", "0 0 24 24");
102
- svg.setAttribute("aria-hidden", "true");
103
- svg.innerHTML = inner;
104
- return svg;
105
- }
106
- };
107
- __decorate([
108
- prop
109
- ], LoomIcon.prototype, "name", void 0);
110
- __decorate([
111
- prop
112
- ], LoomIcon.prototype, "size", void 0);
113
- __decorate([
114
- prop
115
- ], LoomIcon.prototype, "color", void 0);
116
- LoomIcon = __decorate([
117
- component("loom-icon")
118
- ], LoomIcon);
130
+ /** List all registered icon names. */
131
+ static get names() {
132
+ return Array.from(registry.keys());
133
+ }
134
+ /** Immediately apply size/color from attributes — runs before connectedCallback */
135
+ attributeChangedCallback(name, _old, val) {
136
+ // Note: @component decorator wraps this method and parses @prop values
137
+ // before calling us. We just sync the CSS custom properties immediately.
138
+ if (name === "size" && val !== null) {
139
+ this.style.setProperty("--_s", `${val}px`);
140
+ }
141
+ else if (name === "color" && val !== null) {
142
+ this.style.setProperty("--_c", val);
143
+ }
144
+ }
145
+ connectedCallback() {
146
+ // Set CSS vars from current attributes before first paint
147
+ const s = this.getAttribute("size");
148
+ const c = this.getAttribute("color");
149
+ this.style.setProperty("--_s", `${s ?? this.size}px`);
150
+ if (c)
151
+ this.style.setProperty("--_c", c);
152
+ super.connectedCallback();
153
+ }
154
+ update() {
155
+ this.shadow.adoptedStyleSheets = [baseStyles];
156
+ this.style.setProperty("--_s", `${this.size}px`);
157
+ this.style.setProperty("--_c", this.color);
158
+ const inner = registry.get(this.name);
159
+ if (!inner) {
160
+ const placeholder = document.createElement("span");
161
+ return placeholder;
162
+ }
163
+ const svg = document.createElementNS("http://www.w3.org/2000/svg", "svg");
164
+ svg.setAttribute("viewBox", "0 0 24 24");
165
+ svg.setAttribute("aria-hidden", "true");
166
+ svg.innerHTML = inner;
167
+ return svg;
168
+ }
169
+ constructor() {
170
+ super(...arguments);
171
+ __runInitializers(this, _color_extraInitializers);
172
+ }
173
+ };
174
+ return LoomIcon = _classThis;
175
+ })();
119
176
  export { LoomIcon };
120
177
  //# sourceMappingURL=icon.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"icon.js","sourceRoot":"","sources":["../../src/element/icon.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"icon.js","sourceRoot":"","sources":["../../src/element/icon.ts"],"names":[],"mappings":"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"}
@@ -5,7 +5,14 @@
5
5
  */
6
6
  export { LoomElement } from "./element";
7
7
  export type { VirtualListOptions } from "./virtual";
8
- export { component, query, queryAll } from "./decorators";
8
+ export { component, query, queryAll, styles } from "./decorators";
9
9
  export { catch_, suspend, mount, unmount } from "./lifecycle";
10
10
  export { interval, timeout, debounce, throttle, animationFrame } from "./timing";
11
+ export { form } from "./form";
12
+ export type { FormState, FormSchema, FieldSchema } from "./form";
13
+ export { lazy } from "./lazy";
14
+ export type { LazyOptions } from "./lazy";
15
+ export { slot } from "./slots";
16
+ export { transition } from "./transition";
17
+ export type { TransitionOptions } from "./transition";
11
18
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/element/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAKxC,YAAY,EAAE,kBAAkB,EAAE,MAAM,WAAW,CAAC;AAGpD,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AAG1D,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAG9D,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/element/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAKxC,YAAY,EAAE,kBAAkB,EAAE,MAAM,WAAW,CAAC;AAGpD,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAGlE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAG9D,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAGjF,OAAO,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AAC9B,YAAY,EAAE,SAAS,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,QAAQ,CAAC;AAGjE,OAAO,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AAC9B,YAAY,EAAE,WAAW,EAAE,MAAM,QAAQ,CAAC;AAG1C,OAAO,EAAE,IAAI,EAAE,MAAM,SAAS,CAAC;AAG/B,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,YAAY,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC"}
@@ -6,9 +6,17 @@
6
6
  // Base element
7
7
  export { LoomElement } from "./element";
8
8
  // Element decorators
9
- export { component, query, queryAll } from "./decorators";
9
+ export { component, query, queryAll, styles } from "./decorators";
10
10
  // Lifecycle decorators
11
11
  export { catch_, suspend, mount, unmount } from "./lifecycle";
12
12
  // Timing decorators
13
13
  export { interval, timeout, debounce, throttle, animationFrame } from "./timing";
14
+ // Form decorator
15
+ export { form } from "./form";
16
+ // Lazy loading decorator
17
+ export { lazy } from "./lazy";
18
+ // Slot decorator
19
+ export { slot } from "./slots";
20
+ // Transition decorator
21
+ export { transition } from "./transition";
14
22
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/element/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,eAAe;AACf,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAOxC,qBAAqB;AACrB,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AAE1D,uBAAuB;AACvB,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAE9D,oBAAoB;AACpB,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/element/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,eAAe;AACf,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAOxC,qBAAqB;AACrB,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAElE,uBAAuB;AACvB,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAE9D,oBAAoB;AACpB,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAEjF,iBAAiB;AACjB,OAAO,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AAG9B,yBAAyB;AACzB,OAAO,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AAG9B,iBAAiB;AACjB,OAAO,EAAE,IAAI,EAAE,MAAM,SAAS,CAAC;AAE/B,uBAAuB;AACvB,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC"}
@@ -0,0 +1,31 @@
1
+ /**
2
+ * Loom — @lazy decorator (TC39 Stage 3)
3
+ *
4
+ * Stackable class decorator that defers module loading until first mount.
5
+ *
6
+ * ```ts
7
+ * @component("settings-page")
8
+ * @route("/settings")
9
+ * @lazy(() => import("./pages/settings"))
10
+ * class SettingsPage extends LoomElement {}
11
+ * ```
12
+ */
13
+ declare const LAZY_LOADER: unique symbol;
14
+ declare const LAZY_OPTS: unique symbol;
15
+ declare const LAZY_LOADED: unique symbol;
16
+ export interface LazyOptions {
17
+ /** Tag name of a loading component to show while the chunk loads */
18
+ loading?: string;
19
+ }
20
+ /**
21
+ * @lazy(loader, opts?) — Stackable class decorator
22
+ *
23
+ * Defers the real class body until first connectedCallback.
24
+ * The loader should return a dynamic import whose default export
25
+ * is the real component class.
26
+ */
27
+ export declare function lazy(loader: () => Promise<{
28
+ default: unknown;
29
+ } | unknown>, opts?: LazyOptions): (value: Function, _context: ClassDecoratorContext) => void;
30
+ export { LAZY_LOADER, LAZY_OPTS, LAZY_LOADED };
31
+ //# sourceMappingURL=lazy.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lazy.d.ts","sourceRoot":"","sources":["../../src/element/lazy.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,QAAA,MAAM,WAAW,eAA6B,CAAC;AAC/C,QAAA,MAAM,SAAS,eAA2B,CAAC;AAC3C,QAAA,MAAM,WAAW,eAA6B,CAAC;AAE/C,MAAM,WAAW,WAAW;IAC1B,oEAAoE;IACpE,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED;;;;;;GAMG;AACH,wBAAgB,IAAI,CAClB,MAAM,EAAE,MAAM,OAAO,CAAC;IAAE,OAAO,EAAE,OAAO,CAAA;CAAE,GAAG,OAAO,CAAC,EACrD,IAAI,CAAC,EAAE,WAAW,IAED,OAAO,QAAQ,EAAE,UAAU,qBAAqB,UAkDlE;AAED,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,WAAW,EAAE,CAAC"}
@@ -0,0 +1,71 @@
1
+ /**
2
+ * Loom — @lazy decorator (TC39 Stage 3)
3
+ *
4
+ * Stackable class decorator that defers module loading until first mount.
5
+ *
6
+ * ```ts
7
+ * @component("settings-page")
8
+ * @route("/settings")
9
+ * @lazy(() => import("./pages/settings"))
10
+ * class SettingsPage extends LoomElement {}
11
+ * ```
12
+ */
13
+ const LAZY_LOADER = Symbol("loom:lazy:loader");
14
+ const LAZY_OPTS = Symbol("loom:lazy:opts");
15
+ const LAZY_LOADED = Symbol("loom:lazy:loaded");
16
+ /**
17
+ * @lazy(loader, opts?) — Stackable class decorator
18
+ *
19
+ * Defers the real class body until first connectedCallback.
20
+ * The loader should return a dynamic import whose default export
21
+ * is the real component class.
22
+ */
23
+ export function lazy(loader, opts) {
24
+ return function (value, _context) {
25
+ const ctor = value;
26
+ ctor[LAZY_LOADER] = loader;
27
+ ctor[LAZY_OPTS] = opts;
28
+ const origConnected = ctor.prototype.connectedCallback;
29
+ ctor.prototype.connectedCallback = async function () {
30
+ if (ctor[LAZY_LOADED]) {
31
+ origConnected?.call(this);
32
+ return;
33
+ }
34
+ if (opts?.loading) {
35
+ const loadingEl = document.createElement(opts.loading);
36
+ this.shadow.appendChild(loadingEl);
37
+ }
38
+ try {
39
+ const mod = await loader();
40
+ const RealClass = mod.default ?? mod;
41
+ const realProto = RealClass.prototype;
42
+ const descriptors = Object.getOwnPropertyDescriptors(realProto);
43
+ for (const [key, desc] of Object.entries(descriptors)) {
44
+ if (key === "constructor")
45
+ continue;
46
+ Object.defineProperty(ctor.prototype, key, desc);
47
+ }
48
+ const staticDescs = Object.getOwnPropertyDescriptors(RealClass);
49
+ for (const [key, desc] of Object.entries(staticDescs)) {
50
+ if (["prototype", "length", "name"].includes(key))
51
+ continue;
52
+ Object.defineProperty(ctor, key, desc);
53
+ }
54
+ ctor[LAZY_LOADED] = true;
55
+ this.shadow.innerHTML = "";
56
+ if (ctor.prototype.connectedCallback !== origConnected) {
57
+ ctor.prototype.connectedCallback.call(this);
58
+ }
59
+ else {
60
+ origConnected?.call(this);
61
+ }
62
+ }
63
+ catch (err) {
64
+ console.error("[Loom @lazy] Failed to load module:", err);
65
+ this.shadow.innerHTML = `<p style="color:red">Failed to load component</p>`;
66
+ }
67
+ };
68
+ };
69
+ }
70
+ export { LAZY_LOADER, LAZY_OPTS, LAZY_LOADED };
71
+ //# sourceMappingURL=lazy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lazy.js","sourceRoot":"","sources":["../../src/element/lazy.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,MAAM,WAAW,GAAG,MAAM,CAAC,kBAAkB,CAAC,CAAC;AAC/C,MAAM,SAAS,GAAG,MAAM,CAAC,gBAAgB,CAAC,CAAC;AAC3C,MAAM,WAAW,GAAG,MAAM,CAAC,kBAAkB,CAAC,CAAC;AAO/C;;;;;;GAMG;AACH,MAAM,UAAU,IAAI,CAClB,MAAqD,EACrD,IAAkB;IAElB,OAAO,UAAU,KAAe,EAAE,QAA+B;QAC/D,MAAM,IAAI,GAAG,KAAY,CAAC;QAC1B,IAAI,CAAC,WAAW,CAAC,GAAG,MAAM,CAAC;QAC3B,IAAI,CAAC,SAAS,CAAC,GAAG,IAAI,CAAC;QAEvB,MAAM,aAAa,GAAG,IAAI,CAAC,SAAS,CAAC,iBAAiB,CAAC;QAEvD,IAAI,CAAC,SAAS,CAAC,iBAAiB,GAAG,KAAK;YACtC,IAAI,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC;gBACtB,aAAa,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;gBAC1B,OAAO;YACT,CAAC;YAED,IAAI,IAAI,EAAE,OAAO,EAAE,CAAC;gBAClB,MAAM,SAAS,GAAG,QAAQ,CAAC,aAAa,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;gBACvD,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC;YACrC,CAAC;YAED,IAAI,CAAC;gBACH,MAAM,GAAG,GAAG,MAAM,MAAM,EAAE,CAAC;gBAC3B,MAAM,SAAS,GAAI,GAA8B,CAAC,OAAO,IAAI,GAAG,CAAC;gBAEjE,MAAM,SAAS,GAAI,SAAsB,CAAC,SAAS,CAAC;gBACpD,MAAM,WAAW,GAAG,MAAM,CAAC,yBAAyB,CAAC,SAAS,CAAC,CAAC;gBAEhE,KAAK,MAAM,CAAC,GAAG,EAAE,IAAI,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,EAAE,CAAC;oBACtD,IAAI,GAAG,KAAK,aAAa;wBAAE,SAAS;oBACpC,MAAM,CAAC,cAAc,CAAC,IAAI,CAAC,SAAS,EAAE,GAAG,EAAE,IAAI,CAAC,CAAC;gBACnD,CAAC;gBAED,MAAM,WAAW,GAAG,MAAM,CAAC,yBAAyB,CAAC,SAAmB,CAAC,CAAC;gBAC1E,KAAK,MAAM,CAAC,GAAG,EAAE,IAAI,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,EAAE,CAAC;oBACtD,IAAI,CAAC,WAAW,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC;wBAAE,SAAS;oBAC5D,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,GAAG,EAAE,IAAI,CAAC,CAAC;gBACzC,CAAC;gBAED,IAAI,CAAC,WAAW,CAAC,GAAG,IAAI,CAAC;gBACzB,IAAI,CAAC,MAAM,CAAC,SAAS,GAAG,EAAE,CAAC;gBAE3B,IAAI,IAAI,CAAC,SAAS,CAAC,iBAAiB,KAAK,aAAa,EAAE,CAAC;oBACvD,IAAI,CAAC,SAAS,CAAC,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBAC9C,CAAC;qBAAM,CAAC;oBACN,aAAa,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;gBAC5B,CAAC;YACH,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,OAAO,CAAC,KAAK,CAAC,qCAAqC,EAAE,GAAG,CAAC,CAAC;gBAC1D,IAAI,CAAC,MAAM,CAAC,SAAS,GAAG,mDAAmD,CAAC;YAC9E,CAAC;QACH,CAAC,CAAC;IACJ,CAAC,CAAC;AACJ,CAAC;AAED,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,WAAW,EAAE,CAAC"}