@toyz/loom 0.3.0 → 0.5.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 (119) 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/symbols.d.ts +4 -0
  14. package/dist/decorators/symbols.d.ts.map +1 -1
  15. package/dist/decorators/symbols.js +4 -0
  16. package/dist/decorators/symbols.js.map +1 -1
  17. package/dist/di/decorators.d.ts +15 -15
  18. package/dist/di/decorators.d.ts.map +1 -1
  19. package/dist/di/decorators.js +23 -33
  20. package/dist/di/decorators.js.map +1 -1
  21. package/dist/di/watch.d.ts +1 -7
  22. package/dist/di/watch.d.ts.map +1 -1
  23. package/dist/di/watch.js +17 -20
  24. package/dist/di/watch.js.map +1 -1
  25. package/dist/element/decorators.d.ts +26 -10
  26. package/dist/element/decorators.d.ts.map +1 -1
  27. package/dist/element/decorators.js +75 -31
  28. package/dist/element/decorators.js.map +1 -1
  29. package/dist/element/element.d.ts.map +1 -1
  30. package/dist/element/element.js +15 -3
  31. package/dist/element/element.js.map +1 -1
  32. package/dist/element/form.d.ts +63 -0
  33. package/dist/element/form.d.ts.map +1 -0
  34. package/dist/element/form.js +167 -0
  35. package/dist/element/form.js.map +1 -0
  36. package/dist/element/icon.d.ts +3 -3
  37. package/dist/element/icon.d.ts.map +1 -1
  38. package/dist/element/icon.js +131 -74
  39. package/dist/element/icon.js.map +1 -1
  40. package/dist/element/index.d.ts +8 -1
  41. package/dist/element/index.d.ts.map +1 -1
  42. package/dist/element/index.js +9 -1
  43. package/dist/element/index.js.map +1 -1
  44. package/dist/element/lazy.d.ts +31 -0
  45. package/dist/element/lazy.d.ts.map +1 -0
  46. package/dist/element/lazy.js +71 -0
  47. package/dist/element/lazy.js.map +1 -0
  48. package/dist/element/lifecycle.d.ts +27 -29
  49. package/dist/element/lifecycle.d.ts.map +1 -1
  50. package/dist/element/lifecycle.js +60 -79
  51. package/dist/element/lifecycle.js.map +1 -1
  52. package/dist/element/slots.d.ts +23 -0
  53. package/dist/element/slots.d.ts.map +1 -0
  54. package/dist/element/slots.js +54 -0
  55. package/dist/element/slots.js.map +1 -0
  56. package/dist/element/timing.d.ts +10 -7
  57. package/dist/element/timing.d.ts.map +1 -1
  58. package/dist/element/timing.js +67 -52
  59. package/dist/element/timing.js.map +1 -1
  60. package/dist/element/transition.d.ts +32 -0
  61. package/dist/element/transition.d.ts.map +1 -0
  62. package/dist/element/transition.js +70 -0
  63. package/dist/element/transition.js.map +1 -0
  64. package/dist/element/virtual.js +235 -194
  65. package/dist/element/virtual.js.map +1 -1
  66. package/dist/index.d.ts +4 -4
  67. package/dist/index.d.ts.map +1 -1
  68. package/dist/index.js +3 -3
  69. package/dist/index.js.map +1 -1
  70. package/dist/router/decorators.d.ts +9 -38
  71. package/dist/router/decorators.d.ts.map +1 -1
  72. package/dist/router/decorators.js +7 -52
  73. package/dist/router/decorators.js.map +1 -1
  74. package/dist/router/index.d.ts +1 -0
  75. package/dist/router/index.d.ts.map +1 -1
  76. package/dist/router/index.js +2 -0
  77. package/dist/router/index.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 +28 -0
  87. package/dist/router/route-lifecycle.d.ts.map +1 -0
  88. package/dist/router/route-lifecycle.js +47 -0
  89. package/dist/router/route-lifecycle.js.map +1 -0
  90. package/dist/router/route.d.ts +1 -1
  91. package/dist/router/route.d.ts.map +1 -1
  92. package/dist/router/router.d.ts +5 -0
  93. package/dist/router/router.d.ts.map +1 -1
  94. package/dist/router/router.js +41 -4
  95. package/dist/router/router.js.map +1 -1
  96. package/dist/store/decorators.d.ts +39 -15
  97. package/dist/store/decorators.d.ts.map +1 -1
  98. package/dist/store/decorators.js +167 -79
  99. package/dist/store/decorators.js.map +1 -1
  100. package/dist/store/index.d.ts +1 -1
  101. package/dist/store/index.d.ts.map +1 -1
  102. package/dist/store/index.js +1 -1
  103. package/dist/store/index.js.map +1 -1
  104. package/dist/store/watch.d.ts +12 -11
  105. package/dist/store/watch.d.ts.map +1 -1
  106. package/dist/store/watch.js +20 -15
  107. package/dist/store/watch.js.map +1 -1
  108. package/dist/testing.d.ts +55 -0
  109. package/dist/testing.d.ts.map +1 -0
  110. package/dist/testing.js +99 -0
  111. package/dist/testing.js.map +1 -0
  112. package/dist/transform/transform.d.ts +7 -3
  113. package/dist/transform/transform.d.ts.map +1 -1
  114. package/dist/transform/transform.js +17 -9
  115. package/dist/transform/transform.js.map +1 -1
  116. package/dist/transform/typed.d.ts +1 -1
  117. package/dist/transform/typed.d.ts.map +1 -1
  118. package/dist/transform/typed.js.map +1 -1
  119. package/package.json +5 -1
@@ -1,16 +1,17 @@
1
1
  /**
2
- * Loom — DI decorators
2
+ * Loom — DI decorators (TC39 Stage 3)
3
3
  *
4
4
  * @service — Auto-instantiated singleton, registered on app.start()
5
- * @inject — Dual-mode dependency injection (property or constructor param)
5
+ * @inject — Auto-accessor dependency injection (property mode only)
6
6
  * @factory — Method decorator, return value registered as a provider
7
+ *
8
+ * Note: TC39 does not support parameter decorators.
9
+ * Use @inject as a property accessor: `@inject(Foo) accessor foo!: Foo;`
7
10
  */
8
- import { INJECT_PARAMS } from "../decorators/symbols";
9
11
  import { app } from "../app";
10
12
  import { createDecorator } from "../decorators/create";
11
13
  /**
12
14
  * Auto-instantiated singleton. Registered on app.start().
13
- * Constructor @inject params are resolved automatically.
14
15
  *
15
16
  * ```ts
16
17
  * @service
@@ -21,51 +22,40 @@ export const service = createDecorator((ctor) => {
21
22
  app.registerService(ctor);
22
23
  }, { class: true });
23
24
  /**
24
- * Dual-mode dependency injection.
25
- *
26
- * Property: @inject(Foo) foo!: Foo;
27
- * Constructor: constructor(@inject(Config) config: Config)
28
- * Factory arg: createChat(@inject(NatsConn) nc: NatsConn)
25
+ * Property-mode dependency injection via auto-accessor.
26
+ * Resolves lazily from the DI container on first access.
29
27
  *
30
- * T is optional — use for explicit typing if desired.
28
+ * ```ts
29
+ * @inject(AuthService) accessor auth!: AuthService;
30
+ * ```
31
31
  */
32
32
  export function inject(key) {
33
- return (target, propOrMethod, index) => {
34
- if (index !== undefined) {
35
- // Parameter decorator → store metadata for resolution on start()
36
- const proto = propOrMethod ? target : target.prototype;
37
- const method = propOrMethod ?? "constructor";
38
- if (!proto[INJECT_PARAMS])
39
- proto[INJECT_PARAMS] = [];
40
- proto[INJECT_PARAMS].push({ method, index, key });
41
- }
42
- else {
43
- // Property decorator → lazy getter (define-time)
44
- Object.defineProperty(target, propOrMethod, {
45
- get() {
46
- return app.get(key);
47
- },
48
- configurable: true,
49
- });
50
- }
33
+ return (_target, _context) => {
34
+ return {
35
+ get() {
36
+ return app.get(key);
37
+ },
38
+ set(_val) {
39
+ // Injection is read-only
40
+ },
41
+ };
51
42
  };
52
43
  }
53
44
  /**
54
45
  * Method decorator on @service classes.
55
46
  * Return value is registered as a provider on app.start().
56
- * Supports @inject on parameters. Async methods are awaited.
57
47
  *
58
48
  * ```ts
59
49
  * @service
60
50
  * class Boot {
61
51
  * @factory(ChatServiceNatsClient)
62
- * createChat(@inject(NatsConnection) nc: NatsConnection) {
63
- * return new ChatServiceNatsClient(nc);
52
+ * createChat() {
53
+ * return new ChatServiceNatsClient(app.get(NatsConnection));
64
54
  * }
65
55
  * }
66
56
  * ```
67
57
  */
68
- export const factory = createDecorator((proto, method, key) => {
69
- app.registerFactory(key, proto, method);
58
+ export const factory = createDecorator((method, methodName, key) => {
59
+ app.registerFactory(key, { method: methodName, fn: method });
70
60
  });
71
61
  //# sourceMappingURL=decorators.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"decorators.js","sourceRoot":"","sources":["../../src/di/decorators.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACtD,OAAO,EAAE,GAAG,EAAE,MAAM,QAAQ,CAAC;AAC7B,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAEvD;;;;;;;;GAQG;AACH,MAAM,CAAC,MAAM,OAAO,GAAG,eAAe,CAAK,CAAC,IAAI,EAAE,EAAE;IAClD,GAAG,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;AAC5B,CAAC,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;AAEpB;;;;;;;;GAQG;AACH,MAAM,UAAU,MAAM,CAAU,GAAQ;IACtC,OAAO,CAAC,MAAW,EAAE,YAAgC,EAAE,KAAc,EAAE,EAAE;QACvE,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YACxB,iEAAiE;YACjE,MAAM,KAAK,GAAG,YAAY,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC;YACvD,MAAM,MAAM,GAAG,YAAY,IAAI,aAAa,CAAC;YAC7C,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC;gBAAE,KAAK,CAAC,aAAa,CAAC,GAAG,EAAE,CAAC;YACrD,KAAK,CAAC,aAAa,CAAC,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC;QACpD,CAAC;aAAM,CAAC;YACN,iDAAiD;YACjD,MAAM,CAAC,cAAc,CAAC,MAAM,EAAE,YAAa,EAAE;gBAC3C,GAAG;oBACD,OAAO,GAAG,CAAC,GAAG,CAAI,GAAG,CAAC,CAAC;gBACzB,CAAC;gBACD,YAAY,EAAE,IAAI;aACnB,CAAC,CAAC;QACL,CAAC;IACH,CAAC,CAAC;AACJ,CAAC;AAED;;;;;;;;;;;;;;GAcG;AACH,MAAM,CAAC,MAAM,OAAO,GAAG,eAAe,CAAc,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,EAAE;IACzE,GAAG,CAAC,eAAe,CAAC,GAAG,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC;AAC1C,CAAC,CAAC,CAAC"}
1
+ {"version":3,"file":"decorators.js","sourceRoot":"","sources":["../../src/di/decorators.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,GAAG,EAAE,MAAM,QAAQ,CAAC;AAC7B,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAEvD;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,OAAO,GAAG,eAAe,CAAK,CAAC,IAAI,EAAE,EAAE;IAClD,GAAG,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;AAC5B,CAAC,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;AAEpB;;;;;;;GAOG;AACH,MAAM,UAAU,MAAM,CAAc,GAAkC;IACpE,OAAO,CACL,OAA8C,EAC9C,QAAgD,EACT,EAAE;QACzC,OAAO;YACL,GAAG;gBACD,OAAO,GAAG,CAAC,GAAG,CAAI,GAAG,CAAC,CAAC;YACzB,CAAC;YACD,GAAG,CAAC,IAAO;gBACT,yBAAyB;YAC3B,CAAC;SACF,CAAC;IACJ,CAAC,CAAC;AACJ,CAAC;AAED;;;;;;;;;;;;;GAaG;AACH,MAAM,CAAC,MAAM,OAAO,GAAG,eAAe,CAAkB,CAAC,MAAM,EAAE,UAAU,EAAE,GAAG,EAAE,EAAE;IAClF,GAAG,CAAC,eAAe,CAAC,GAAG,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC;AAC/D,CAAC,CAAC,CAAC"}
@@ -1,9 +1,3 @@
1
- /**
2
- * Loom — DI @watch
3
- *
4
- * Form 3: Watch a DI-resolved service (or a reactive property on it).
5
- * Resolves via app.get() at connectedCallback time.
6
- */
7
1
  /**
8
2
  * React to changes on a DI-resolved service.
9
3
  *
@@ -19,5 +13,5 @@
19
13
  * onTheme(value: string, prev: string) { ... }
20
14
  * ```
21
15
  */
22
- export declare function watch(service: new (...args: any[]) => any, prop?: string): (proto: any, key: string) => void;
16
+ export declare function watch(service: new (...args: unknown[]) => unknown, prop?: string): (method: Function, context: ClassMethodDecoratorContext) => void;
23
17
  //# sourceMappingURL=watch.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"watch.d.ts","sourceRoot":"","sources":["../../src/di/watch.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,KAAK,CAAC,OAAO,EAAE,KAAK,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,GAAG,EAAE,IAAI,CAAC,EAAE,MAAM,IAC/D,OAAO,GAAG,EAAE,KAAK,MAAM,UAkBhC"}
1
+ {"version":3,"file":"watch.d.ts","sourceRoot":"","sources":["../../src/di/watch.ts"],"names":[],"mappings":"AAGA;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,KAAK,CAAC,OAAO,EAAE,KAAK,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,OAAO,EAAE,IAAI,CAAC,EAAE,MAAM,IACvE,QAAQ,QAAQ,EAAE,SAAS,2BAA2B,UAmB/D"}
package/dist/di/watch.js CHANGED
@@ -1,10 +1,5 @@
1
- /**
2
- * Loom — DI @watch
3
- *
4
- * Form 3: Watch a DI-resolved service (or a reactive property on it).
5
- * Resolves via app.get() at connectedCallback time.
6
- */
7
1
  import { app } from "../app";
2
+ import { CONNECT_HOOKS } from "../decorators/symbols";
8
3
  /**
9
4
  * React to changes on a DI-resolved service.
10
5
  *
@@ -21,21 +16,23 @@ import { app } from "../app";
21
16
  * ```
22
17
  */
23
18
  export function watch(service, prop) {
24
- return (proto, key) => {
25
- const orig = proto.connectedCallback;
26
- proto.connectedCallback = function () {
27
- orig?.call(this);
28
- const svc = app.get(service);
29
- const reactive = prop ? svc[prop] : svc;
30
- if (typeof reactive?.subscribe !== "function") {
31
- throw new Error(`[loom] @watch: ${service.name}${prop ? "." + prop : ""} is not a Reactive`);
32
- }
33
- const unsub = reactive.subscribe((v, p) => {
34
- this[key](v, p);
35
- this.scheduleUpdate?.();
19
+ return (method, context) => {
20
+ context.addInitializer(function () {
21
+ if (!this[CONNECT_HOOKS])
22
+ this[CONNECT_HOOKS] = [];
23
+ this[CONNECT_HOOKS].push((el) => {
24
+ const svc = app.get(service);
25
+ const reactive = prop ? svc[prop] : svc;
26
+ if (typeof reactive?.subscribe !== "function") {
27
+ throw new Error(`[loom] @watch: ${service.name}${prop ? "." + prop : ""} is not a Reactive`);
28
+ }
29
+ const unsub = reactive.subscribe((v, p) => {
30
+ method.call(el, v, p);
31
+ el.scheduleUpdate?.();
32
+ });
33
+ return unsub;
36
34
  });
37
- this.track(unsub);
38
- };
35
+ });
39
36
  };
40
37
  }
41
38
  //# sourceMappingURL=watch.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"watch.js","sourceRoot":"","sources":["../../src/di/watch.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,GAAG,EAAE,MAAM,QAAQ,CAAC;AAE7B;;;;;;;;;;;;;;GAcG;AACH,MAAM,UAAU,KAAK,CAAC,OAAoC,EAAE,IAAa;IACvE,OAAO,CAAC,KAAU,EAAE,GAAW,EAAE,EAAE;QACjC,MAAM,IAAI,GAAG,KAAK,CAAC,iBAAiB,CAAC;QACrC,KAAK,CAAC,iBAAiB,GAAG;YACxB,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;YACjB,MAAM,GAAG,GAAG,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;YAC7B,MAAM,QAAQ,GAAG,IAAI,CAAC,CAAC,CAAE,GAAW,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;YACjD,IAAI,OAAO,QAAQ,EAAE,SAAS,KAAK,UAAU,EAAE,CAAC;gBAC9C,MAAM,IAAI,KAAK,CACb,kBAAkB,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,EAAE,oBAAoB,CAC5E,CAAC;YACJ,CAAC;YACD,MAAM,KAAK,GAAG,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAM,EAAE,CAAM,EAAE,EAAE;gBAClD,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;gBAChB,IAAI,CAAC,cAAc,EAAE,EAAE,CAAC;YAC1B,CAAC,CAAC,CAAC;YACH,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QACpB,CAAC,CAAC;IACJ,CAAC,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"watch.js","sourceRoot":"","sources":["../../src/di/watch.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,QAAQ,CAAC;AAC7B,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAEtD;;;;;;;;;;;;;;GAcG;AACH,MAAM,UAAU,KAAK,CAAC,OAA4C,EAAE,IAAa;IAC/E,OAAO,CAAC,MAAgB,EAAE,OAAoC,EAAE,EAAE;QAChE,OAAO,CAAC,cAAc,CAAC;YACrB,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC;gBAAE,IAAI,CAAC,aAAa,CAAC,GAAG,EAAE,CAAC;YACnD,IAAI,CAAC,aAAa,CAAC,CAAC,IAAI,CAAC,CAAC,EAAO,EAAE,EAAE;gBACnC,MAAM,GAAG,GAAG,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;gBAC7B,MAAM,QAAQ,GAAG,IAAI,CAAC,CAAC,CAAE,GAA+B,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;gBACrE,IAAI,OAAQ,QAAqC,EAAE,SAAS,KAAK,UAAU,EAAE,CAAC;oBAC5E,MAAM,IAAI,KAAK,CACb,kBAAkB,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,EAAE,oBAAoB,CAC5E,CAAC;gBACJ,CAAC;gBACD,MAAM,KAAK,GAAI,QAAoC,CAAC,SAAS,CAAC,CAAC,CAAU,EAAE,CAAU,EAAE,EAAE;oBACvF,MAAM,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;oBACtB,EAAE,CAAC,cAAc,EAAE,EAAE,CAAC;gBACxB,CAAC,CAAC,CAAC;gBACH,OAAO,KAAK,CAAC;YACf,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC,CAAC;AACJ,CAAC"}
@@ -1,9 +1,10 @@
1
1
  /**
2
- * Loom — Element decorators
2
+ * Loom — Element decorators (TC39 Stage 3)
3
3
  *
4
4
  * @component — Register a class as a custom element
5
- * @query — Lazy shadow DOM querySelector
6
- * @queryAll — Lazy shadow DOM querySelectorAll
5
+ * @query — Lazy shadow DOM querySelector (auto-accessor)
6
+ * @queryAll — Lazy shadow DOM querySelectorAll (auto-accessor)
7
+ * @styles — Adopt CSSStyleSheets on connect (class decorator)
7
8
  */
8
9
  /**
9
10
  * Register a class as a custom element. Wires @prop observed attributes
@@ -14,19 +15,34 @@
14
15
  * class MyCounter extends LoomElement { ... }
15
16
  * ```
16
17
  */
17
- export declare const component: (tag: string) => (ctor: any) => void;
18
+ export declare const component: (tag: string) => (value: Function, context: ClassDecoratorContext) => void;
18
19
  /**
19
- * Lazy shadow DOM querySelector.
20
+ * Lazy shadow DOM querySelector (auto-accessor).
20
21
  * ```ts
21
- * @query(".submit-btn") submitBtn!: HTMLButtonElement;
22
+ * @query(".submit-btn") accessor submitBtn!: HTMLButtonElement;
22
23
  * ```
23
24
  */
24
- export declare const query: (selector: string) => (target: any, key: string, desc?: PropertyDescriptor) => void;
25
+ export declare function query<V>(selector: string): <This extends object>(_target: ClassAccessorDecoratorTarget<This, V>, _context: ClassAccessorDecoratorContext<This, V>) => ClassAccessorDecoratorResult<This, V>;
25
26
  /**
26
- * Lazy shadow DOM querySelectorAll.
27
+ * Lazy shadow DOM querySelectorAll (auto-accessor).
27
28
  * ```ts
28
- * @queryAll("input") inputs!: HTMLInputElement[];
29
+ * @queryAll("input") accessor inputs!: HTMLInputElement[];
29
30
  * ```
30
31
  */
31
- export declare const queryAll: (selector: string) => (target: any, key: string, desc?: PropertyDescriptor) => void;
32
+ export declare function queryAll<V>(selector: string): <This extends object>(_target: ClassAccessorDecoratorTarget<This, V>, _context: ClassAccessorDecoratorContext<This, V>) => ClassAccessorDecoratorResult<This, V>;
33
+ /**
34
+ * Auto-adopt one or more CSSStyleSheets when the element connects.
35
+ * Accepts sheets created with the `css` tagged template.
36
+ *
37
+ * ```ts
38
+ * const myStyles = css`...`;
39
+ *
40
+ * @component("my-el")
41
+ * @styles(myStyles)
42
+ * class MyEl extends LoomElement { ... }
43
+ * ```
44
+ *
45
+ * Multiple `@styles()` calls stack (all sheets are adopted).
46
+ */
47
+ export declare function styles(...sheets: CSSStyleSheet[]): (value: Function, _context: ClassDecoratorContext) => void;
32
48
  //# sourceMappingURL=decorators.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"decorators.d.ts","sourceRoot":"","sources":["../../src/element/decorators.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAMH;;;;;;;;GAQG;AACH,eAAO,MAAM,SAAS,sCA6BH,CAAC;AAEpB;;;;;GAKG;AACH,eAAO,MAAM,KAAK,uDAkBX,CAAC,6BAXN,CAAC;AAEH;;;;;GAKG;AACH,eAAO,MAAM,QAAQ,uDAGd,CAAC,6BAIN,CAAC"}
1
+ {"version":3,"file":"decorators.d.ts","sourceRoot":"","sources":["../../src/element/decorators.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAOH;;;;;;;;GAQG;AACH,eAAO,MAAM,SAAS,4EAyCH,CAAC;AAGpB;;;;;GAKG;AACH,wBAAgB,KAAK,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,IAC/B,IAAI,SAAS,MAAM,EACzB,SAAS,4BAA4B,CAAC,IAAI,EAAE,CAAC,CAAC,EAC9C,UAAU,6BAA6B,CAAC,IAAI,EAAE,CAAC,CAAC,KAC/C,4BAA4B,CAAC,IAAI,EAAE,CAAC,CAAC,CAOzC;AAED;;;;;GAKG;AACH,wBAAgB,QAAQ,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,IAClC,IAAI,SAAS,MAAM,EACzB,SAAS,4BAA4B,CAAC,IAAI,EAAE,CAAC,CAAC,EAC9C,UAAU,6BAA6B,CAAC,IAAI,EAAE,CAAC,CAAC,KAC/C,4BAA4B,CAAC,IAAI,EAAE,CAAC,CAAC,CAOzC;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,MAAM,CAAC,GAAG,MAAM,EAAE,aAAa,EAAE,IACvC,OAAO,QAAQ,EAAE,UAAU,qBAAqB,UAWzD"}
@@ -1,13 +1,15 @@
1
1
  /**
2
- * Loom — Element decorators
2
+ * Loom — Element decorators (TC39 Stage 3)
3
3
  *
4
4
  * @component — Register a class as a custom element
5
- * @query — Lazy shadow DOM querySelector
6
- * @queryAll — Lazy shadow DOM querySelectorAll
5
+ * @query — Lazy shadow DOM querySelector (auto-accessor)
6
+ * @queryAll — Lazy shadow DOM querySelectorAll (auto-accessor)
7
+ * @styles — Adopt CSSStyleSheets on connect (class decorator)
7
8
  */
8
- import { PROPS } from "../decorators/symbols";
9
+ import { PROPS, TRANSFORMS } from "../decorators/symbols";
9
10
  import { app } from "../app";
10
11
  import { createDecorator } from "../decorators/create";
12
+ import { pendingProps } from "../store/decorators";
11
13
  /**
12
14
  * Register a class as a custom element. Wires @prop observed attributes
13
15
  * and attributeChangedCallback auto-parsing.
@@ -18,7 +20,13 @@ import { createDecorator } from "../decorators/create";
18
20
  * ```
19
21
  */
20
22
  export const component = createDecorator((ctor, tag) => {
23
+ // Flush pendingProps from @prop decorators (member decorators run before class decorators)
21
24
  const propMap = ctor[PROPS] ?? new Map();
25
+ for (const { key } of pendingProps) {
26
+ propMap.set(key.toLowerCase(), key);
27
+ }
28
+ pendingProps.length = 0; // clear staging area
29
+ ctor[PROPS] = propMap;
22
30
  // Wire observedAttributes from @prop fields
23
31
  Object.defineProperty(ctor, "observedAttributes", {
24
32
  get: () => [...propMap.keys()],
@@ -28,13 +36,20 @@ export const component = createDecorator((ctor, tag) => {
28
36
  ctor.prototype.attributeChangedCallback = function (name, _old, val) {
29
37
  const field = propMap.get(name);
30
38
  if (field && val !== null) {
31
- const current = this[field];
32
- if (typeof current === "number")
33
- this[field] = Number(val);
34
- else if (typeof current === "boolean")
35
- this[field] = val !== null && val !== "false";
36
- else
37
- this[field] = val;
39
+ const transforms = ctor[TRANSFORMS];
40
+ const transform = transforms?.get(field);
41
+ if (transform) {
42
+ this[field] = transform(val);
43
+ }
44
+ else {
45
+ const current = this[field];
46
+ if (typeof current === "number")
47
+ this[field] = Number(val);
48
+ else if (typeof current === "boolean")
49
+ this[field] = val !== null && val !== "false";
50
+ else
51
+ this[field] = val;
52
+ }
38
53
  }
39
54
  origCallback?.call(this, name, _old, val);
40
55
  };
@@ -42,31 +57,60 @@ export const component = createDecorator((ctor, tag) => {
42
57
  ctor.__loom_tag = tag;
43
58
  }, { class: true });
44
59
  /**
45
- * Lazy shadow DOM querySelector.
60
+ * Lazy shadow DOM querySelector (auto-accessor).
46
61
  * ```ts
47
- * @query(".submit-btn") submitBtn!: HTMLButtonElement;
62
+ * @query(".submit-btn") accessor submitBtn!: HTMLButtonElement;
48
63
  * ```
49
64
  */
50
- export const query = createDecorator((proto, key, selector) => {
51
- Object.defineProperty(proto, key, {
52
- get() {
53
- return this.shadow.querySelector(selector);
54
- },
55
- configurable: true,
56
- });
57
- });
65
+ export function query(selector) {
66
+ return (_target, _context) => {
67
+ return {
68
+ get() {
69
+ return this.shadow.querySelector(selector);
70
+ },
71
+ };
72
+ };
73
+ }
58
74
  /**
59
- * Lazy shadow DOM querySelectorAll.
75
+ * Lazy shadow DOM querySelectorAll (auto-accessor).
60
76
  * ```ts
61
- * @queryAll("input") inputs!: HTMLInputElement[];
77
+ * @queryAll("input") accessor inputs!: HTMLInputElement[];
62
78
  * ```
63
79
  */
64
- export const queryAll = createDecorator((proto, key, selector) => {
65
- Object.defineProperty(proto, key, {
66
- get() {
67
- return Array.from(this.shadow.querySelectorAll(selector));
68
- },
69
- configurable: true,
70
- });
71
- });
80
+ export function queryAll(selector) {
81
+ return (_target, _context) => {
82
+ return {
83
+ get() {
84
+ return Array.from(this.shadow.querySelectorAll(selector));
85
+ },
86
+ };
87
+ };
88
+ }
89
+ /**
90
+ * Auto-adopt one or more CSSStyleSheets when the element connects.
91
+ * Accepts sheets created with the `css` tagged template.
92
+ *
93
+ * ```ts
94
+ * const myStyles = css`...`;
95
+ *
96
+ * @component("my-el")
97
+ * @styles(myStyles)
98
+ * class MyEl extends LoomElement { ... }
99
+ * ```
100
+ *
101
+ * Multiple `@styles()` calls stack (all sheets are adopted).
102
+ */
103
+ export function styles(...sheets) {
104
+ return (value, _context) => {
105
+ const orig = value.prototype.connectedCallback;
106
+ value.prototype.connectedCallback = function () {
107
+ const existing = this.shadow.adoptedStyleSheets;
108
+ const newSheets = sheets.filter((s) => !existing.includes(s));
109
+ if (newSheets.length > 0) {
110
+ this.shadow.adoptedStyleSheets = [...existing, ...newSheets];
111
+ }
112
+ orig?.call(this);
113
+ };
114
+ };
115
+ }
72
116
  //# sourceMappingURL=decorators.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"decorators.js","sourceRoot":"","sources":["../../src/element/decorators.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,KAAK,EAAE,MAAM,uBAAuB,CAAC;AAC9C,OAAO,EAAE,GAAG,EAAE,MAAM,QAAQ,CAAC;AAC7B,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAEvD;;;;;;;;GAQG;AACH,MAAM,CAAC,MAAM,SAAS,GAAG,eAAe,CAAgB,CAAC,IAAI,EAAE,GAAG,EAAE,EAAE;IACpE,MAAM,OAAO,GACV,IAAY,CAAC,KAAK,CAAC,IAAI,IAAI,GAAG,EAAE,CAAC;IAEpC,4CAA4C;IAC5C,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,oBAAoB,EAAE;QAChD,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC;KAC/B,CAAC,CAAC;IAEH,uDAAuD;IACvD,MAAM,YAAY,GAAI,IAAI,CAAC,SAAiB,CAAC,wBAAwB,CAAC;IACrE,IAAI,CAAC,SAAiB,CAAC,wBAAwB,GAAG,UACjD,IAAY,EACZ,IAAmB,EACnB,GAAkB;QAElB,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAChC,IAAI,KAAK,IAAI,GAAG,KAAK,IAAI,EAAE,CAAC;YAC1B,MAAM,OAAO,GAAI,IAAY,CAAC,KAAK,CAAC,CAAC;YACrC,IAAI,OAAO,OAAO,KAAK,QAAQ;gBAAG,IAAY,CAAC,KAAK,CAAC,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;iBAC/D,IAAI,OAAO,OAAO,KAAK,SAAS;gBAClC,IAAY,CAAC,KAAK,CAAC,GAAG,GAAG,KAAK,IAAI,IAAI,GAAG,KAAK,OAAO,CAAC;;gBACnD,IAAY,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC;QAClC,CAAC;QACD,YAAY,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,CAAC,CAAC;IAC5C,CAAC,CAAC;IAEF,GAAG,CAAC,QAAQ,CAAC,GAAG,EAAE,IAAgC,CAAC,CAAC;IACnD,IAAY,CAAC,UAAU,GAAG,GAAG,CAAC;AACjC,CAAC,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;AAEpB;;;;;GAKG;AACH,MAAM,CAAC,MAAM,KAAK,GAAG,eAAe,CAAqB,CAAC,KAAK,EAAE,GAAG,EAAE,QAAQ,EAAE,EAAE;IAChF,MAAM,CAAC,cAAc,CAAC,KAAK,EAAE,GAAG,EAAE;QAChC,GAAG;YACD,OAAO,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;QAC7C,CAAC;QACD,YAAY,EAAE,IAAI;KACnB,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH;;;;;GAKG;AACH,MAAM,CAAC,MAAM,QAAQ,GAAG,eAAe,CAAqB,CAAC,KAAK,EAAE,GAAG,EAAE,QAAQ,EAAE,EAAE;IACnF,MAAM,CAAC,cAAc,CAAC,KAAK,EAAE,GAAG,EAAE;QAChC,GAAG;YACD,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC,CAAC;QAC5D,CAAC;QACD,YAAY,EAAE,IAAI;KACnB,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
1
+ {"version":3,"file":"decorators.js","sourceRoot":"","sources":["../../src/element/decorators.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"element.d.ts","sourceRoot":"","sources":["../../src/element/element.ts"],"names":[],"mappings":"AAAA,OAAO,EAAO,KAAK,WAAW,EAAE,KAAK,OAAO,EAAE,MAAM,QAAQ,CAAC;AAC7D,OAAO,EAAE,KAAK,SAAS,EAAE,MAAM,UAAU,CAAC;AAC1C,OAAO,EAAE,KAAK,QAAQ,EAAY,MAAM,QAAQ,CAAC;AAKjD,8BAAsB,WAAY,SAAQ,WAAW;IACnD,iEAAiE;IACjE,SAAS,KAAK,GAAG,yBAAkB;IAEnC,SAAS,CAAC,MAAM,EAAE,UAAU,CAAC;IAC7B,OAAO,CAAC,QAAQ,CAAsB;;IAStC,8DAA8D;IAC9D,SAAS,CAAC,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IACjC,SAAS,CAAC,GAAG,CAAC,OAAO,EAAE,oBAAoB,EAAE,GAAG,MAAM,EAAE,QAAQ,EAAE,GAAG,IAAI;IAQzE;;;;OAIG;IACH,WAAW,CAAC,MAAM,EAAE,aAAa,EAAE,GAAG,IAAI;IAU1C,8DAA8D;IAC9D,SAAS,CAAC,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,WAAW,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,GAAG,MAAM,IAAI;IAMtE,yBAAyB;IACzB,SAAS,CAAC,IAAI,CAAC,CAAC,SAAS,SAAS,EAAE,KAAK,EAAE,CAAC,GAAG,IAAI;IAMnD,sDAAsD;IACtD,KAAK,CAAC,KAAK,EAAE,MAAM,IAAI,GAAG,IAAI;IAM9B,uCAAuC;IACvC,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS,OAAO,GAAG,WAAW,EAAE,GAAG,EAAE,MAAM,GAAG,CAAC,GAAG,IAAI;IAInE,0CAA0C;IAC1C,SAAS,CAAC,EAAE,CAAC,CAAC,SAAS,OAAO,GAAG,WAAW,EAAE,GAAG,EAAE,MAAM,GAAG,CAAC,EAAE;IAM/D,iBAAiB,IAAI,IAAI;IAQzB,oBAAoB,IAAI,IAAI;IAQ5B;;;OAGG;IACH,MAAM,IAAI,IAAI,GAAG,IAAI,EAAE,GAAG,IAAI;IAE9B;;;OAGG;IACH,YAAY,IAAI,IAAI;IAEpB;;;OAGG;IACH,YAAY,IAAI,OAAO;IAMvB,OAAO,CAAC,gBAAgB,CAAS;IACjC,OAAO,CAAC,WAAW,CAAS;IAE5B,0DAA0D;IAC1D,cAAc,IAAI,IAAI;IAsBtB;;;OAGG;IACH,KAAK,IAAI,IAAI;CAKd"}
1
+ {"version":3,"file":"element.d.ts","sourceRoot":"","sources":["../../src/element/element.ts"],"names":[],"mappings":"AAAA,OAAO,EAAO,KAAK,WAAW,EAAE,KAAK,OAAO,EAAE,MAAM,QAAQ,CAAC;AAC7D,OAAO,EAAE,KAAK,SAAS,EAAE,MAAM,UAAU,CAAC;AAC1C,OAAO,EAAE,KAAK,QAAQ,EAAY,MAAM,QAAQ,CAAC;AAKjD,8BAAsB,WAAY,SAAQ,WAAW;IACnD,iEAAiE;IACjE,SAAS,KAAK,GAAG,yBAAkB;IAEnC,SAAS,CAAC,MAAM,EAAE,UAAU,CAAC;IAC7B,OAAO,CAAC,QAAQ,CAAsB;;IAStC,8DAA8D;IAC9D,SAAS,CAAC,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IACjC,SAAS,CAAC,GAAG,CAAC,OAAO,EAAE,oBAAoB,EAAE,GAAG,MAAM,EAAE,QAAQ,EAAE,GAAG,IAAI;IAQzE;;;;OAIG;IACH,WAAW,CAAC,MAAM,EAAE,aAAa,EAAE,GAAG,IAAI;IAU1C,8DAA8D;IAC9D,SAAS,CAAC,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,WAAW,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,GAAG,MAAM,IAAI;IAMtE,yBAAyB;IACzB,SAAS,CAAC,IAAI,CAAC,CAAC,SAAS,SAAS,EAAE,KAAK,EAAE,CAAC,GAAG,IAAI;IAMnD,sDAAsD;IACtD,KAAK,CAAC,KAAK,EAAE,MAAM,IAAI,GAAG,IAAI;IAM9B,uCAAuC;IACvC,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS,OAAO,GAAG,WAAW,EAAE,GAAG,EAAE,MAAM,GAAG,CAAC,GAAG,IAAI;IAInE,0CAA0C;IAC1C,SAAS,CAAC,EAAE,CAAC,CAAC,SAAS,OAAO,GAAG,WAAW,EAAE,GAAG,EAAE,MAAM,GAAG,CAAC,EAAE;IAM/D,iBAAiB,IAAI,IAAI;IAazB,oBAAoB,IAAI,IAAI;IAQ5B;;;OAGG;IACH,MAAM,IAAI,IAAI,GAAG,IAAI,EAAE,GAAG,IAAI;IAE9B;;;OAGG;IACH,YAAY,IAAI,IAAI;IAEpB;;;OAGG;IACH,YAAY,IAAI,OAAO;IAMvB,OAAO,CAAC,gBAAgB,CAAS;IACjC,OAAO,CAAC,WAAW,CAAS;IAE5B,0DAA0D;IAC1D,cAAc,IAAI,IAAI;IA4BtB;;;OAGG;IACH,KAAK,IAAI,IAAI;CAKd"}
@@ -1,6 +1,6 @@
1
1
  import { bus } from "../bus";
2
2
  import { adoptCSS } from "../css";
3
- import { COMPUTED_DIRTY, REACTIVES } from "../decorators/symbols";
3
+ import { COMPUTED_DIRTY, REACTIVES, CONNECT_HOOKS, FIRST_UPDATED_HOOKS } from "../decorators/symbols";
4
4
  import { morph } from "../morph";
5
5
  import { app } from "../app";
6
6
  export class LoomElement extends HTMLElement {
@@ -54,8 +54,13 @@ export class LoomElement extends HTMLElement {
54
54
  }
55
55
  // ── Lifecycle ──
56
56
  connectedCallback() {
57
- // Decorators self-wire via createDecorator's connectedCallback chain.
58
- // We only need to trigger the initial render for reactive components.
57
+ // Run decorator-registered connect hooks (from @mount, @interval, @watch, etc.)
58
+ for (const hook of (this[CONNECT_HOOKS] ?? [])) {
59
+ const cleanup = hook(this);
60
+ if (typeof cleanup === "function")
61
+ this.cleanups.push(cleanup);
62
+ }
63
+ // Trigger initial render for reactive components
59
64
  const hasReactives = (this[REACTIVES]?.length ?? 0) > 0;
60
65
  const overridesUpdate = this.update !== LoomElement.prototype.update;
61
66
  if (hasReactives || overridesUpdate)
@@ -108,6 +113,13 @@ export class LoomElement extends HTMLElement {
108
113
  if (!this._hasUpdated) {
109
114
  this._hasUpdated = true;
110
115
  this.firstUpdated();
116
+ // Run decorator-registered first-updated hooks (from @form, etc.)
117
+ // These fire after the first morph(), so shadow DOM content exists.
118
+ for (const hook of (this[FIRST_UPDATED_HOOKS] ?? [])) {
119
+ const cleanup = hook(this);
120
+ if (typeof cleanup === "function")
121
+ this.cleanups.push(cleanup);
122
+ }
111
123
  }
112
124
  });
113
125
  }
@@ -1 +1 @@
1
- {"version":3,"file":"element.js","sourceRoot":"","sources":["../../src/element/element.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"element.js","sourceRoot":"","sources":["../../src/element/element.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,63 @@
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
+ export interface FieldSchema<V = unknown> {
28
+ /** Transform raw string value before storing (reuses @transform functions) */
29
+ transform?: (raw: string) => V;
30
+ /** Return true if valid, or an error string */
31
+ validate?: (value: V) => true | string;
32
+ }
33
+ export type FormSchema<T> = {
34
+ [K in keyof T]?: FieldSchema<T[K]>;
35
+ };
36
+ export interface FormState<T> {
37
+ /** Current transformed values */
38
+ readonly data: T;
39
+ /** Field → error message (only populated for invalid fields) */
40
+ readonly errors: Partial<Record<keyof T, string>>;
41
+ /** True when all validated fields pass */
42
+ readonly valid: boolean;
43
+ /** True when any field has changed from initial values */
44
+ readonly dirty: boolean;
45
+ /** Reset all fields to their initial values */
46
+ reset(): void;
47
+ /** Manually trigger validation on all fields, returns validity */
48
+ validate(): boolean;
49
+ /** Returns an onInput event handler bound to a specific field */
50
+ bind(field: keyof T): (e: Event) => void;
51
+ }
52
+ /**
53
+ * Create a FormState<T> instance — pure reactive data, no DOM dependency.
54
+ */
55
+ export declare function createFormState<T extends object>(schema: FormSchema<T>, scheduleUpdate: () => void): FormState<T>;
56
+ /**
57
+ * @form<T>(schema) — Auto-accessor decorator
58
+ *
59
+ * Creates a FormState<T> eagerly at class initialization.
60
+ * No DOM dependency — use `.bind(field)` in your template for explicit binding.
61
+ */
62
+ export declare function form<T extends object>(schema: FormSchema<T>): <This extends object>(_target: ClassAccessorDecoratorTarget<This, FormState<T>>, context: ClassAccessorDecoratorContext<This, FormState<T>>) => ClassAccessorDecoratorResult<This, FormState<T>>;
63
+ //# sourceMappingURL=form.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"form.d.ts","sourceRoot":"","sources":["../../src/element/form.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAIH,MAAM,WAAW,WAAW,CAAC,CAAC,GAAG,OAAO;IACtC,8EAA8E;IAC9E,SAAS,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,CAAC,CAAC;IAC/B,+CAA+C;IAC/C,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,IAAI,GAAG,MAAM,CAAC;CACxC;AAED,MAAM,MAAM,UAAU,CAAC,CAAC,IAAI;KACzB,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;CACnC,CAAC;AAEF,MAAM,WAAW,SAAS,CAAC,CAAC;IAC1B,iCAAiC;IACjC,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC;IACjB,gEAAgE;IAChE,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC;IAClD,0CAA0C;IAC1C,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;IACxB,0DAA0D;IAC1D,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;IACxB,+CAA+C;IAC/C,KAAK,IAAI,IAAI,CAAC;IACd,kEAAkE;IAClE,QAAQ,IAAI,OAAO,CAAC;IACpB,iEAAiE;IACjE,IAAI,CAAC,KAAK,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,KAAK,IAAI,CAAC;CAC1C;AAgBD;;GAEG;AACH,wBAAgB,eAAe,CAAC,CAAC,SAAS,MAAM,EAC9C,MAAM,EAAE,UAAU,CAAC,CAAC,CAAC,EACrB,cAAc,EAAE,MAAM,IAAI,GACzB,SAAS,CAAC,CAAC,CAAC,CAyGd;AAID;;;;;GAKG;AACH,wBAAgB,IAAI,CAAC,CAAC,SAAS,MAAM,EACnC,MAAM,EAAE,UAAU,CAAC,CAAC,CAAC,IAEb,IAAI,SAAS,MAAM,EACzB,SAAS,4BAA4B,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,EACzD,SAAS,6BAA6B,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,KACzD,4BAA4B,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,CAgBpD"}