@furystack/shades 11.0.35 → 12.0.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 (215) hide show
  1. package/CHANGELOG.md +337 -0
  2. package/README.md +99 -13
  3. package/esm/compile-route.spec.d.ts +2 -0
  4. package/esm/compile-route.spec.d.ts.map +1 -0
  5. package/esm/compile-route.spec.js +34 -0
  6. package/esm/compile-route.spec.js.map +1 -0
  7. package/esm/component-factory.spec.js +13 -5
  8. package/esm/component-factory.spec.js.map +1 -1
  9. package/esm/components/index.d.ts +4 -1
  10. package/esm/components/index.d.ts.map +1 -1
  11. package/esm/components/index.js +4 -1
  12. package/esm/components/index.js.map +1 -1
  13. package/esm/components/lazy-load.d.ts +2 -4
  14. package/esm/components/lazy-load.d.ts.map +1 -1
  15. package/esm/components/lazy-load.js +40 -24
  16. package/esm/components/lazy-load.js.map +1 -1
  17. package/esm/components/lazy-load.spec.js +57 -50
  18. package/esm/components/lazy-load.spec.js.map +1 -1
  19. package/esm/components/link-to-route.d.ts +2 -0
  20. package/esm/components/link-to-route.d.ts.map +1 -1
  21. package/esm/components/link-to-route.js +3 -2
  22. package/esm/components/link-to-route.js.map +1 -1
  23. package/esm/components/link-to-route.spec.js +13 -9
  24. package/esm/components/link-to-route.spec.js.map +1 -1
  25. package/esm/components/nested-route-link.d.ts +62 -0
  26. package/esm/components/nested-route-link.d.ts.map +1 -0
  27. package/esm/components/nested-route-link.js +66 -0
  28. package/esm/components/nested-route-link.js.map +1 -0
  29. package/esm/components/nested-route-link.spec.d.ts +2 -0
  30. package/esm/components/nested-route-link.spec.d.ts.map +1 -0
  31. package/esm/components/nested-route-link.spec.js +179 -0
  32. package/esm/components/nested-route-link.spec.js.map +1 -0
  33. package/esm/components/nested-route-types.d.ts +37 -0
  34. package/esm/components/nested-route-types.d.ts.map +1 -0
  35. package/esm/components/nested-route-types.js +2 -0
  36. package/esm/components/nested-route-types.js.map +1 -0
  37. package/esm/components/nested-router.d.ts +103 -0
  38. package/esm/components/nested-router.d.ts.map +1 -0
  39. package/esm/components/nested-router.js +178 -0
  40. package/esm/components/nested-router.js.map +1 -0
  41. package/esm/components/nested-router.spec.d.ts +2 -0
  42. package/esm/components/nested-router.spec.d.ts.map +1 -0
  43. package/esm/components/nested-router.spec.js +659 -0
  44. package/esm/components/nested-router.spec.js.map +1 -0
  45. package/esm/components/route-link.d.ts +4 -0
  46. package/esm/components/route-link.d.ts.map +1 -1
  47. package/esm/components/route-link.js +9 -10
  48. package/esm/components/route-link.js.map +1 -1
  49. package/esm/components/route-link.spec.js +16 -12
  50. package/esm/components/route-link.spec.js.map +1 -1
  51. package/esm/components/router.d.ts +20 -2
  52. package/esm/components/router.d.ts.map +1 -1
  53. package/esm/components/router.js +3 -0
  54. package/esm/components/router.js.map +1 -1
  55. package/esm/components/router.spec.js +75 -74
  56. package/esm/components/router.spec.js.map +1 -1
  57. package/esm/css-generator.d.ts +50 -0
  58. package/esm/css-generator.d.ts.map +1 -0
  59. package/esm/css-generator.js +107 -0
  60. package/esm/css-generator.js.map +1 -0
  61. package/esm/css-generator.spec.d.ts +2 -0
  62. package/esm/css-generator.spec.d.ts.map +1 -0
  63. package/esm/css-generator.spec.js +162 -0
  64. package/esm/css-generator.spec.js.map +1 -0
  65. package/esm/index.d.ts +2 -0
  66. package/esm/index.d.ts.map +1 -1
  67. package/esm/index.js +2 -0
  68. package/esm/index.js.map +1 -1
  69. package/esm/initialize.d.ts +11 -0
  70. package/esm/initialize.d.ts.map +1 -1
  71. package/esm/initialize.js +5 -0
  72. package/esm/initialize.js.map +1 -1
  73. package/esm/jsx.d.ts +83 -2
  74. package/esm/jsx.d.ts.map +1 -1
  75. package/esm/models/children-list.d.ts +5 -1
  76. package/esm/models/children-list.d.ts.map +1 -1
  77. package/esm/models/css-object.d.ts +33 -0
  78. package/esm/models/css-object.d.ts.map +1 -0
  79. package/esm/models/css-object.js +2 -0
  80. package/esm/models/css-object.js.map +1 -0
  81. package/esm/models/index.d.ts +1 -0
  82. package/esm/models/index.d.ts.map +1 -1
  83. package/esm/models/index.js +1 -0
  84. package/esm/models/index.js.map +1 -1
  85. package/esm/models/partial-element.d.ts +12 -2
  86. package/esm/models/partial-element.d.ts.map +1 -1
  87. package/esm/models/render-options.d.ts +89 -3
  88. package/esm/models/render-options.d.ts.map +1 -1
  89. package/esm/models/selection-state.d.ts +4 -0
  90. package/esm/models/selection-state.d.ts.map +1 -1
  91. package/esm/services/location-service.d.ts +11 -0
  92. package/esm/services/location-service.d.ts.map +1 -1
  93. package/esm/services/location-service.js +11 -0
  94. package/esm/services/location-service.js.map +1 -1
  95. package/esm/services/resource-manager.d.ts +24 -0
  96. package/esm/services/resource-manager.d.ts.map +1 -1
  97. package/esm/services/resource-manager.js +30 -0
  98. package/esm/services/resource-manager.js.map +1 -1
  99. package/esm/services/resource-manager.spec.js +93 -0
  100. package/esm/services/resource-manager.spec.js.map +1 -1
  101. package/esm/services/screen-service.d.ts +81 -4
  102. package/esm/services/screen-service.d.ts.map +1 -1
  103. package/esm/services/screen-service.js +75 -4
  104. package/esm/services/screen-service.js.map +1 -1
  105. package/esm/services/screen-service.spec.js +91 -7
  106. package/esm/services/screen-service.spec.js.map +1 -1
  107. package/esm/shade-component.d.ts +17 -4
  108. package/esm/shade-component.d.ts.map +1 -1
  109. package/esm/shade-component.js +67 -5
  110. package/esm/shade-component.js.map +1 -1
  111. package/esm/shade-host-props-ref.integration.spec.d.ts +2 -0
  112. package/esm/shade-host-props-ref.integration.spec.d.ts.map +1 -0
  113. package/esm/shade-host-props-ref.integration.spec.js +381 -0
  114. package/esm/shade-host-props-ref.integration.spec.js.map +1 -0
  115. package/esm/shade-resources.integration.spec.js +208 -39
  116. package/esm/shade-resources.integration.spec.js.map +1 -1
  117. package/esm/shade.d.ts +34 -15
  118. package/esm/shade.d.ts.map +1 -1
  119. package/esm/shade.js +180 -33
  120. package/esm/shade.js.map +1 -1
  121. package/esm/shade.spec.d.ts +2 -0
  122. package/esm/shade.spec.d.ts.map +1 -0
  123. package/esm/shade.spec.js +198 -0
  124. package/esm/shade.spec.js.map +1 -0
  125. package/esm/shades.integration.spec.js +135 -72
  126. package/esm/shades.integration.spec.js.map +1 -1
  127. package/esm/style-manager.d.ts +65 -0
  128. package/esm/style-manager.d.ts.map +1 -0
  129. package/esm/style-manager.js +95 -0
  130. package/esm/style-manager.js.map +1 -0
  131. package/esm/style-manager.spec.d.ts +2 -0
  132. package/esm/style-manager.spec.d.ts.map +1 -0
  133. package/esm/style-manager.spec.js +179 -0
  134. package/esm/style-manager.spec.js.map +1 -0
  135. package/esm/styled-element.spec.d.ts +2 -0
  136. package/esm/styled-element.spec.d.ts.map +1 -0
  137. package/esm/styled-element.spec.js +86 -0
  138. package/esm/styled-element.spec.js.map +1 -0
  139. package/esm/styled-shade.spec.d.ts +2 -0
  140. package/esm/styled-shade.spec.d.ts.map +1 -0
  141. package/esm/styled-shade.spec.js +66 -0
  142. package/esm/styled-shade.spec.js.map +1 -0
  143. package/esm/svg-types.d.ts +389 -0
  144. package/esm/svg-types.d.ts.map +1 -0
  145. package/esm/svg-types.js +9 -0
  146. package/esm/svg-types.js.map +1 -0
  147. package/esm/svg.d.ts +15 -0
  148. package/esm/svg.d.ts.map +1 -0
  149. package/esm/svg.js +76 -0
  150. package/esm/svg.js.map +1 -0
  151. package/esm/svg.spec.d.ts +2 -0
  152. package/esm/svg.spec.d.ts.map +1 -0
  153. package/esm/svg.spec.js +80 -0
  154. package/esm/svg.spec.js.map +1 -0
  155. package/esm/vnode.d.ts +103 -0
  156. package/esm/vnode.d.ts.map +1 -0
  157. package/esm/vnode.integration.spec.d.ts +2 -0
  158. package/esm/vnode.integration.spec.d.ts.map +1 -0
  159. package/esm/vnode.integration.spec.js +494 -0
  160. package/esm/vnode.integration.spec.js.map +1 -0
  161. package/esm/vnode.js +453 -0
  162. package/esm/vnode.js.map +1 -0
  163. package/esm/vnode.spec.d.ts +2 -0
  164. package/esm/vnode.spec.d.ts.map +1 -0
  165. package/esm/vnode.spec.js +473 -0
  166. package/esm/vnode.spec.js.map +1 -0
  167. package/package.json +3 -3
  168. package/src/compile-route.spec.ts +39 -0
  169. package/src/component-factory.spec.tsx +18 -5
  170. package/src/components/index.ts +4 -1
  171. package/src/components/lazy-load.spec.tsx +82 -75
  172. package/src/components/lazy-load.tsx +49 -27
  173. package/src/components/link-to-route.spec.tsx +25 -21
  174. package/src/components/link-to-route.tsx +4 -2
  175. package/src/components/nested-route-link.spec.tsx +303 -0
  176. package/src/components/nested-route-link.tsx +100 -0
  177. package/src/components/nested-route-types.ts +42 -0
  178. package/src/components/nested-router.spec.tsx +817 -0
  179. package/src/components/nested-router.tsx +256 -0
  180. package/src/components/route-link.spec.tsx +22 -18
  181. package/src/components/route-link.tsx +10 -10
  182. package/src/components/router.spec.tsx +109 -108
  183. package/src/components/router.tsx +15 -2
  184. package/src/css-generator.spec.ts +183 -0
  185. package/src/css-generator.ts +117 -0
  186. package/src/index.ts +2 -0
  187. package/src/initialize.ts +12 -0
  188. package/src/jsx.ts +129 -2
  189. package/src/models/children-list.ts +7 -1
  190. package/src/models/css-object.ts +34 -0
  191. package/src/models/index.ts +1 -0
  192. package/src/models/partial-element.ts +13 -2
  193. package/src/models/render-options.ts +90 -3
  194. package/src/models/selection-state.ts +4 -0
  195. package/src/services/location-service.tsx +11 -0
  196. package/src/services/resource-manager.spec.ts +116 -0
  197. package/src/services/resource-manager.ts +30 -0
  198. package/src/services/screen-service.spec.ts +109 -7
  199. package/src/services/screen-service.ts +81 -4
  200. package/src/shade-component.ts +72 -6
  201. package/src/shade-host-props-ref.integration.spec.tsx +460 -0
  202. package/src/shade-resources.integration.spec.tsx +276 -52
  203. package/src/shade.spec.tsx +239 -0
  204. package/src/shade.ts +211 -56
  205. package/src/shades.integration.spec.tsx +154 -80
  206. package/src/style-manager.spec.ts +229 -0
  207. package/src/style-manager.ts +104 -0
  208. package/src/styled-element.spec.tsx +117 -0
  209. package/src/styled-shade.spec.ts +86 -0
  210. package/src/svg-types.ts +437 -0
  211. package/src/svg.spec.ts +89 -0
  212. package/src/svg.ts +78 -0
  213. package/src/vnode.integration.spec.tsx +657 -0
  214. package/src/vnode.spec.ts +579 -0
  215. package/src/vnode.ts +508 -0
@@ -1,9 +1,9 @@
1
1
  import { Injector } from '@furystack/inject';
2
- import { ObservableValue, sleepAsync } from '@furystack/utils';
2
+ import { ObservableValue, sleepAsync, usingAsync } from '@furystack/utils';
3
3
  import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest';
4
4
  import { initializeShadeRoot } from './initialize.js';
5
5
  import { createComponent } from './shade-component.js';
6
- import { Shade } from './shade.js';
6
+ import { flushUpdates, Shade } from './shade.js';
7
7
  describe('Shade Resources integration tests', () => {
8
8
  beforeEach(() => {
9
9
  document.body.innerHTML = '<div id="root"></div>';
@@ -12,45 +12,214 @@ describe('Shade Resources integration tests', () => {
12
12
  document.body.innerHTML = '';
13
13
  });
14
14
  it('Should update the component based on a custom observable value change', async () => {
15
- const injector = new Injector();
16
- const rootElement = document.getElementById('root');
17
- const renderCounter = vi.fn();
18
- const obs1 = new ObservableValue(0);
19
- const obs2 = new ObservableValue('a');
20
- const ExampleComponent = Shade({
21
- render: ({ useObservable }) => {
22
- const [value1] = useObservable('obs1', obs1);
23
- const [value2] = useObservable('obs2', obs2);
24
- renderCounter();
25
- return (createComponent("div", null,
26
- createComponent("div", { id: "val1" }, value1),
27
- createComponent("div", { id: "val2" }, value2)));
28
- },
29
- shadowDomName: 'shades-example-resource',
15
+ await usingAsync(new Injector(), async (injector) => {
16
+ const rootElement = document.getElementById('root');
17
+ const renderCounter = vi.fn();
18
+ const obs1 = new ObservableValue(0);
19
+ const obs2 = new ObservableValue('a');
20
+ const ExampleComponent = Shade({
21
+ render: ({ useObservable }) => {
22
+ const [value1] = useObservable('obs1', obs1);
23
+ const [value2] = useObservable('obs2', obs2);
24
+ renderCounter();
25
+ return (createComponent("div", null,
26
+ createComponent("div", { id: "val1" }, value1),
27
+ createComponent("div", { id: "val2" }, value2)));
28
+ },
29
+ shadowDomName: 'shades-example-resource',
30
+ });
31
+ expect(obs1.getObservers().length).toBe(0);
32
+ expect(obs2.getObservers().length).toBe(0);
33
+ initializeShadeRoot({
34
+ injector,
35
+ rootElement,
36
+ jsxElement: createComponent(ExampleComponent, null),
37
+ });
38
+ await flushUpdates();
39
+ expect(document.body.innerHTML).toBe('<div id="root"><shades-example-resource><div><div id="val1">0</div><div id="val2">a</div></div></shades-example-resource></div>');
40
+ expect(obs1.getObservers().length).toBe(1);
41
+ expect(obs2.getObservers().length).toBe(1);
42
+ expect(renderCounter).toBeCalledTimes(1);
43
+ obs1.setValue(1);
44
+ await flushUpdates();
45
+ expect(document.body.innerHTML).toBe('<div id="root"><shades-example-resource><div><div id="val1">1</div><div id="val2">a</div></div></shades-example-resource></div>');
46
+ expect(renderCounter).toBeCalledTimes(2);
47
+ obs2.setValue('b');
48
+ await flushUpdates();
49
+ expect(document.body.innerHTML).toBe('<div id="root"><shades-example-resource><div><div id="val1">1</div><div id="val2">b</div></div></shades-example-resource></div>');
50
+ const element = document.querySelector('shades-example-resource');
51
+ expect(element.getRenderCount()).toBe(3);
52
+ document.body.innerHTML = '';
53
+ await sleepAsync(10); // Cleanup can be async
54
+ expect(obs1.getObservers().length).toBe(0);
55
+ expect(obs2.getObservers().length).toBe(0);
56
+ expect(renderCounter).toBeCalledTimes(3);
30
57
  });
31
- expect(obs1.getObservers().length).toBe(0);
32
- expect(obs2.getObservers().length).toBe(0);
33
- initializeShadeRoot({
34
- injector,
35
- rootElement,
36
- jsxElement: createComponent(ExampleComponent, null),
58
+ });
59
+ it('Should NOT re-render the component when a custom onChange callback is provided', async () => {
60
+ await usingAsync(new Injector(), async (injector) => {
61
+ const rootElement = document.getElementById('root');
62
+ const renderCounter = vi.fn();
63
+ const customOnChange = vi.fn();
64
+ const obs = new ObservableValue(0);
65
+ const ExampleComponent = Shade({
66
+ render: ({ useObservable }) => {
67
+ const [value] = useObservable('obs', obs, { onChange: customOnChange });
68
+ renderCounter();
69
+ return createComponent("div", { id: "val" }, value);
70
+ },
71
+ shadowDomName: 'shades-example-custom-onchange',
72
+ });
73
+ initializeShadeRoot({
74
+ injector,
75
+ rootElement,
76
+ jsxElement: createComponent(ExampleComponent, null),
77
+ });
78
+ await flushUpdates();
79
+ const element = document.querySelector('shades-example-custom-onchange');
80
+ // Initial render
81
+ expect(element.getRenderCount()).toBe(1);
82
+ expect(renderCounter).toBeCalledTimes(1);
83
+ expect(customOnChange).toBeCalledTimes(0); // Not called until value changes
84
+ expect(document.getElementById('val')?.textContent).toBe('0');
85
+ // Change the observable value
86
+ obs.setValue(1);
87
+ // Custom onChange should be called
88
+ expect(customOnChange).toBeCalledTimes(1);
89
+ expect(customOnChange).toHaveBeenLastCalledWith(1);
90
+ // But component should NOT re-render
91
+ expect(element.getRenderCount()).toBe(1);
92
+ expect(renderCounter).toBeCalledTimes(1);
93
+ // DOM should still show old value since no re-render occurred
94
+ expect(document.getElementById('val')?.textContent).toBe('0');
95
+ // Change again to verify consistent behavior
96
+ obs.setValue(2);
97
+ expect(customOnChange).toBeCalledTimes(2);
98
+ expect(customOnChange).toHaveBeenLastCalledWith(2);
99
+ expect(element.getRenderCount()).toBe(1);
100
+ expect(renderCounter).toBeCalledTimes(1);
101
+ });
102
+ });
103
+ it('Should allow manual DOM updates in custom onChange callback without re-render', async () => {
104
+ await usingAsync(new Injector(), async (injector) => {
105
+ const rootElement = document.getElementById('root');
106
+ const renderCounter = vi.fn();
107
+ const obs = new ObservableValue(0);
108
+ const ExampleComponent = Shade({
109
+ render: ({ useObservable, useRef }) => {
110
+ const valRef = useRef('manualVal');
111
+ useObservable('obs', obs, {
112
+ onChange: (newValue) => {
113
+ if (valRef.current) {
114
+ valRef.current.textContent = String(newValue);
115
+ }
116
+ },
117
+ });
118
+ renderCounter();
119
+ return (createComponent("div", { ref: valRef, id: "manual-val" }, obs.getValue()));
120
+ },
121
+ shadowDomName: 'shades-example-manual-dom-update',
122
+ });
123
+ initializeShadeRoot({
124
+ injector,
125
+ rootElement,
126
+ jsxElement: createComponent(ExampleComponent, null),
127
+ });
128
+ await flushUpdates();
129
+ const element = document.querySelector('shades-example-manual-dom-update');
130
+ // Initial render
131
+ expect(element.getRenderCount()).toBe(1);
132
+ expect(renderCounter).toBeCalledTimes(1);
133
+ expect(document.getElementById('manual-val')?.textContent).toBe('0');
134
+ // Change the observable value
135
+ obs.setValue(42);
136
+ // Component should NOT re-render
137
+ expect(element.getRenderCount()).toBe(1);
138
+ expect(renderCounter).toBeCalledTimes(1);
139
+ // But DOM should be updated via the manual onChange callback
140
+ expect(document.getElementById('manual-val')?.textContent).toBe('42');
141
+ // Change again
142
+ obs.setValue(100);
143
+ expect(element.getRenderCount()).toBe(1);
144
+ expect(renderCounter).toBeCalledTimes(1);
145
+ expect(document.getElementById('manual-val')?.textContent).toBe('100');
146
+ });
147
+ });
148
+ it('Should batch multiple synchronous observable changes into a single render', async () => {
149
+ await usingAsync(new Injector(), async (injector) => {
150
+ const rootElement = document.getElementById('root');
151
+ const renderCounter = vi.fn();
152
+ const obs1 = new ObservableValue(0);
153
+ const obs2 = new ObservableValue('a');
154
+ const obs3 = new ObservableValue(false);
155
+ const ExampleComponent = Shade({
156
+ render: ({ useObservable }) => {
157
+ const [value1] = useObservable('obs1', obs1);
158
+ const [value2] = useObservable('obs2', obs2);
159
+ const [value3] = useObservable('obs3', obs3);
160
+ renderCounter();
161
+ return (createComponent("div", null,
162
+ createComponent("span", { id: "v1" }, value1),
163
+ createComponent("span", { id: "v2" }, value2),
164
+ createComponent("span", { id: "v3" }, String(value3))));
165
+ },
166
+ shadowDomName: 'shades-example-batching',
167
+ });
168
+ initializeShadeRoot({
169
+ injector,
170
+ rootElement,
171
+ jsxElement: createComponent(ExampleComponent, null),
172
+ });
173
+ await flushUpdates();
174
+ const element = document.querySelector('shades-example-batching');
175
+ expect(element.getRenderCount()).toBe(1);
176
+ expect(renderCounter).toBeCalledTimes(1);
177
+ // Change all three observables synchronously without awaiting in between
178
+ obs1.setValue(42);
179
+ obs2.setValue('z');
180
+ obs3.setValue(true);
181
+ // Before flushing, the DOM should still reflect the old values
182
+ expect(element.getRenderCount()).toBe(1);
183
+ await flushUpdates();
184
+ // After flushing, all changes should be reflected in a single render
185
+ expect(element.getRenderCount()).toBe(2);
186
+ expect(renderCounter).toBeCalledTimes(2);
187
+ expect(document.getElementById('v1')?.textContent).toBe('42');
188
+ expect(document.getElementById('v2')?.textContent).toBe('z');
189
+ expect(document.getElementById('v3')?.textContent).toBe('true');
190
+ });
191
+ });
192
+ it('Should batch multiple updateComponent() calls into a single render', async () => {
193
+ await usingAsync(new Injector(), async (injector) => {
194
+ const rootElement = document.getElementById('root');
195
+ const renderCounter = vi.fn();
196
+ const ExampleComponent = Shade({
197
+ render: () => {
198
+ renderCounter();
199
+ return createComponent("div", null, "content");
200
+ },
201
+ shadowDomName: 'shades-example-update-batching',
202
+ });
203
+ initializeShadeRoot({
204
+ injector,
205
+ rootElement,
206
+ jsxElement: createComponent(ExampleComponent, null),
207
+ });
208
+ await flushUpdates();
209
+ const element = document.querySelector('shades-example-update-batching');
210
+ expect(element.getRenderCount()).toBe(1);
211
+ expect(renderCounter).toBeCalledTimes(1);
212
+ // Call updateComponent multiple times synchronously
213
+ element.updateComponent();
214
+ element.updateComponent();
215
+ element.updateComponent();
216
+ // Before flushing, render count should still be 1
217
+ expect(element.getRenderCount()).toBe(1);
218
+ await flushUpdates();
219
+ // After flushing, only a single additional render should have occurred
220
+ expect(element.getRenderCount()).toBe(2);
221
+ expect(renderCounter).toBeCalledTimes(2);
37
222
  });
38
- expect(document.body.innerHTML).toBe('<div id="root"><shades-example-resource><div><div id="val1">0</div><div id="val2">a</div></div></shades-example-resource></div>');
39
- expect(obs1.getObservers().length).toBe(1);
40
- expect(obs2.getObservers().length).toBe(1);
41
- expect(renderCounter).toBeCalledTimes(1);
42
- obs1.setValue(1);
43
- expect(document.body.innerHTML).toBe('<div id="root"><shades-example-resource><div><div id="val1">1</div><div id="val2">a</div></div></shades-example-resource></div>');
44
- expect(renderCounter).toBeCalledTimes(2);
45
- obs2.setValue('b');
46
- expect(document.body.innerHTML).toBe('<div id="root"><shades-example-resource><div><div id="val1">1</div><div id="val2">b</div></div></shades-example-resource></div>');
47
- const element = document.querySelector('shades-example-resource');
48
- expect(element.getRenderCount()).toBe(3);
49
- document.body.innerHTML = '';
50
- await sleepAsync(10); // Cleanup can be async
51
- expect(obs1.getObservers().length).toBe(0);
52
- expect(obs2.getObservers().length).toBe(0);
53
- expect(renderCounter).toBeCalledTimes(3);
54
223
  });
55
224
  });
56
225
  //# sourceMappingURL=shade-resources.integration.spec.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"shade-resources.integration.spec.js","sourceRoot":"","sources":["../src/shade-resources.integration.spec.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"shade-resources.integration.spec.js","sourceRoot":"","sources":["../src/shade-resources.integration.spec.tsx"],"names":[],"mappings":"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"}
package/esm/shade.d.ts CHANGED
@@ -1,26 +1,17 @@
1
1
  import type { Constructable } from '@furystack/inject';
2
- import type { ChildrenList, PartialElement, RenderOptions } from './models/index.js';
2
+ import type { ChildrenList, CSSObject, PartialElement, RenderOptions } from './models/index.js';
3
3
  export type ShadeOptions<TProps, TElementBase extends HTMLElement> = {
4
4
  /**
5
- * Explicit shadow dom name. Will fall back to 'shade-{guid}' if not provided
5
+ * The custom element tag name used to register the component.
6
+ * Must follow the Custom Elements naming convention (lowercase, must contain a hyphen).
7
+ *
8
+ * @example 'my-button', 'shade-dialog', 'app-header'
6
9
  */
7
10
  shadowDomName: string;
8
11
  /**
9
12
  * Render hook, this method will be executed on each and every render.
10
13
  */
11
14
  render: (options: RenderOptions<TProps, TElementBase>) => JSX.Element | string | null;
12
- /**
13
- * Construct hook. Will be executed once when the element has been constructed and initialized
14
- */
15
- constructed?: (options: RenderOptions<TProps, TElementBase>) => void | undefined | (() => void) | Promise<void | undefined | (() => void)>;
16
- /**
17
- * Will be executed when the element is attached to the DOM.
18
- */
19
- onAttach?: (options: RenderOptions<TProps, TElementBase>) => void;
20
- /**
21
- * Will be executed when the element is detached from the DOM.
22
- */
23
- onDetach?: (options: RenderOptions<TProps, TElementBase>) => void;
24
15
  /**
25
16
  * Name of the HTML Element's base class. Needs to be defined if the elementBase is set. E.g.: 'div', 'button', 'input'
26
17
  */
@@ -30,9 +21,28 @@ export type ShadeOptions<TProps, TElementBase extends HTMLElement> = {
30
21
  */
31
22
  elementBase?: Constructable<TElementBase>;
32
23
  /**
33
- * A default style that will be applied to the element. Can be overridden by external styles.
24
+ * Inline styles applied to each component instance.
25
+ * Use for per-instance dynamic overrides. Prefer `css` for component-level defaults.
34
26
  */
35
27
  style?: Partial<CSSStyleDeclaration>;
28
+ /**
29
+ * CSS styles injected as a stylesheet during component registration.
30
+ * Supports pseudo-selectors (`&:hover`, `&:active`) and nested selectors (`& .class`).
31
+ *
32
+ * **Best practice:** Prefer `css` over `style` for component defaults -- styles are injected
33
+ * once per component type (better performance), and support pseudo-selectors and nesting.
34
+ *
35
+ * @example
36
+ * ```typescript
37
+ * css: {
38
+ * display: 'flex',
39
+ * padding: '16px',
40
+ * '&:hover': { backgroundColor: '#f0f0f0' },
41
+ * '& .title': { fontWeight: 'bold' }
42
+ * }
43
+ * ```
44
+ */
45
+ css?: CSSObject;
36
46
  };
37
47
  /**
38
48
  * Factory method for creating Shade components
@@ -40,4 +50,13 @@ export type ShadeOptions<TProps, TElementBase extends HTMLElement> = {
40
50
  * @returns the JSX element
41
51
  */
42
52
  export declare const Shade: <TProps, TElementBase extends HTMLElement = HTMLElement>(o: ShadeOptions<TProps, TElementBase>) => (props: TProps & PartialElement<TElementBase>, children?: ChildrenList) => JSX.Element;
53
+ /**
54
+ * Flushes any pending microtask-based component updates.
55
+ * Useful in tests to wait for batched renders to complete before asserting DOM state.
56
+ *
57
+ * Note: this flushes one level of pending updates. If a render itself triggers new
58
+ * `updateComponent()` calls, an additional `await flushUpdates()` may be needed.
59
+ * @returns a promise that resolves after the current microtask queue has been processed
60
+ */
61
+ export declare const flushUpdates: () => Promise<void>;
43
62
  //# sourceMappingURL=shade.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"shade.d.ts","sourceRoot":"","sources":["../src/shade.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAA;AAGtD,OAAO,KAAK,EAAE,YAAY,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAA;AAKpF,MAAM,MAAM,YAAY,CAAC,MAAM,EAAE,YAAY,SAAS,WAAW,IAAI;IACnE;;OAEG;IACH,aAAa,EAAE,MAAM,CAAA;IAErB;;OAEG;IACH,MAAM,EAAE,CAAC,OAAO,EAAE,aAAa,CAAC,MAAM,EAAE,YAAY,CAAC,KAAK,GAAG,CAAC,OAAO,GAAG,MAAM,GAAG,IAAI,CAAA;IAErF;;OAEG;IACH,WAAW,CAAC,EAAE,CACZ,OAAO,EAAE,aAAa,CAAC,MAAM,EAAE,YAAY,CAAC,KACzC,IAAI,GAAG,SAAS,GAAG,CAAC,MAAM,IAAI,CAAC,GAAG,OAAO,CAAC,IAAI,GAAG,SAAS,GAAG,CAAC,MAAM,IAAI,CAAC,CAAC,CAAA;IAE/E;;OAEG;IACH,QAAQ,CAAC,EAAE,CAAC,OAAO,EAAE,aAAa,CAAC,MAAM,EAAE,YAAY,CAAC,KAAK,IAAI,CAAA;IAEjE;;OAEG;IACH,QAAQ,CAAC,EAAE,CAAC,OAAO,EAAE,aAAa,CAAC,MAAM,EAAE,YAAY,CAAC,KAAK,IAAI,CAAA;IAEjE;;OAEG;IACH,eAAe,CAAC,EAAE,MAAM,CAAA;IAExB;;OAEG;IACH,WAAW,CAAC,EAAE,aAAa,CAAC,YAAY,CAAC,CAAA;IAEzC;;OAEG;IACH,KAAK,CAAC,EAAE,OAAO,CAAC,mBAAmB,CAAC,CAAA;CACrC,CAAA;AAED;;;;GAIG;AACH,eAAO,MAAM,KAAK,GAAI,MAAM,EAAE,YAAY,SAAS,WAAW,GAAG,WAAW,EAC1E,GAAG,YAAY,CAAC,MAAM,EAAE,YAAY,CAAC,MA4N7B,OAAO,MAAM,GAAG,cAAc,CAAC,YAAY,CAAC,EAAE,WAAW,YAAY,KAY9D,GAAG,CAAC,OAEpB,CAAA"}
1
+ {"version":3,"file":"shade.d.ts","sourceRoot":"","sources":["../src/shade.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAA;AAGtD,OAAO,KAAK,EAAE,YAAY,EAAE,SAAS,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAA;AAS/F,MAAM,MAAM,YAAY,CAAC,MAAM,EAAE,YAAY,SAAS,WAAW,IAAI;IACnE;;;;;OAKG;IACH,aAAa,EAAE,MAAM,CAAA;IAErB;;OAEG;IACH,MAAM,EAAE,CAAC,OAAO,EAAE,aAAa,CAAC,MAAM,EAAE,YAAY,CAAC,KAAK,GAAG,CAAC,OAAO,GAAG,MAAM,GAAG,IAAI,CAAA;IAErF;;OAEG;IACH,eAAe,CAAC,EAAE,MAAM,CAAA;IAExB;;OAEG;IACH,WAAW,CAAC,EAAE,aAAa,CAAC,YAAY,CAAC,CAAA;IAEzC;;;OAGG;IACH,KAAK,CAAC,EAAE,OAAO,CAAC,mBAAmB,CAAC,CAAA;IAEpC;;;;;;;;;;;;;;;;OAgBG;IACH,GAAG,CAAC,EAAE,SAAS,CAAA;CAChB,CAAA;AAED;;;;GAIG;AACH,eAAO,MAAM,KAAK,GAAI,MAAM,EAAE,YAAY,SAAS,WAAW,GAAG,WAAW,EAC1E,GAAG,YAAY,CAAC,MAAM,EAAE,YAAY,CAAC,MA+V7B,OAAO,MAAM,GAAG,cAAc,CAAC,YAAY,CAAC,EAAE,WAAW,YAAY,KAgB9D,GAAG,CAAC,OAEpB,CAAA;AAED;;;;;;;GAOG;AACH,eAAO,MAAM,YAAY,QAAO,OAAO,CAAC,IAAI,CAA4D,CAAA"}