ripple 0.3.72 → 0.3.74

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 (165) hide show
  1. package/CHANGELOG.md +66 -0
  2. package/package.json +3 -3
  3. package/src/jsx-runtime.d.ts +2 -8
  4. package/src/runtime/index-client.js +3 -13
  5. package/src/runtime/internal/client/blocks.js +3 -25
  6. package/src/runtime/internal/client/for.js +80 -5
  7. package/src/runtime/internal/client/index.js +0 -2
  8. package/src/runtime/internal/client/types.d.ts +0 -10
  9. package/tests/client/__snapshots__/computed-properties.test.tsrx.snap +8 -0
  10. package/tests/client/__snapshots__/for.test.tsrx.snap +22 -0
  11. package/tests/client/__snapshots__/html.test.tsrx.snap +4 -0
  12. package/tests/client/array/array.copy-within.test.tsrx +19 -19
  13. package/tests/client/array/array.derived.test.tsrx +97 -109
  14. package/tests/client/array/array.iteration.test.tsrx +28 -28
  15. package/tests/client/array/array.mutations.test.tsrx +68 -68
  16. package/tests/client/array/array.static.test.tsrx +82 -92
  17. package/tests/client/array/array.to-methods.test.tsrx +15 -15
  18. package/tests/client/async-suspend.test.tsrx +180 -179
  19. package/tests/client/basic/__snapshots__/basic.attributes.test.tsrx.snap +2 -0
  20. package/tests/client/basic/__snapshots__/basic.rendering.test.tsrx.snap +4 -0
  21. package/tests/client/basic/basic.attributes.test.tsrx +273 -317
  22. package/tests/client/basic/basic.collections.test.tsrx +55 -61
  23. package/tests/client/basic/basic.components.test.tsrx +196 -218
  24. package/tests/client/basic/basic.errors.test.tsrx +70 -76
  25. package/tests/client/basic/basic.events.test.tsrx +80 -85
  26. package/tests/client/basic/basic.get-set.test.tsrx +54 -64
  27. package/tests/client/basic/basic.hmr.test.tsrx +15 -19
  28. package/tests/client/basic/basic.reactivity.test.tsrx +121 -135
  29. package/tests/client/basic/basic.rendering.test.tsrx +273 -178
  30. package/tests/client/basic/basic.utilities.test.tsrx +8 -10
  31. package/tests/client/boundaries.test.tsrx +18 -18
  32. package/tests/client/compiler/compiler.assignments.test.tsrx +77 -76
  33. package/tests/client/compiler/compiler.attributes.test.tsrx +18 -14
  34. package/tests/client/compiler/compiler.basic.test.tsrx +357 -288
  35. package/tests/client/compiler/compiler.regex.test.tsrx +40 -44
  36. package/tests/client/compiler/compiler.tracked-access.test.tsrx +57 -38
  37. package/tests/client/compiler/compiler.try-in-function.test.tsrx +16 -16
  38. package/tests/client/compiler/compiler.typescript.test.tsrx +4 -3
  39. package/tests/client/composite/composite.dynamic-components.test.tsrx +41 -44
  40. package/tests/client/composite/composite.generics.test.tsrx +165 -167
  41. package/tests/client/composite/composite.props.test.tsrx +66 -74
  42. package/tests/client/composite/composite.reactivity.test.tsrx +132 -166
  43. package/tests/client/composite/composite.render.test.tsrx +92 -101
  44. package/tests/client/computed-properties.test.tsrx +14 -18
  45. package/tests/client/context.test.tsrx +14 -18
  46. package/tests/client/css/global-additional-cases.test.tsrx +491 -437
  47. package/tests/client/css/global-advanced-selectors.test.tsrx +169 -153
  48. package/tests/client/css/global-at-rules.test.tsrx +71 -66
  49. package/tests/client/css/global-basic.test.tsrx +105 -98
  50. package/tests/client/css/global-classes-ids.test.tsrx +128 -114
  51. package/tests/client/css/global-combinators.test.tsrx +83 -78
  52. package/tests/client/css/global-complex-nesting.test.tsrx +134 -120
  53. package/tests/client/css/global-edge-cases.test.tsrx +138 -120
  54. package/tests/client/css/global-keyframes.test.tsrx +108 -96
  55. package/tests/client/css/global-nested.test.tsrx +88 -78
  56. package/tests/client/css/global-pseudo.test.tsrx +104 -98
  57. package/tests/client/css/global-scoping.test.tsrx +145 -125
  58. package/tests/client/css/style-identifier.test.tsrx +62 -69
  59. package/tests/client/date.test.tsrx +83 -83
  60. package/tests/client/dynamic-elements.test.tsrx +227 -283
  61. package/tests/client/events.test.tsrx +252 -266
  62. package/tests/client/for.test.tsrx +120 -127
  63. package/tests/client/head.test.tsrx +40 -48
  64. package/tests/client/html.test.tsrx +37 -49
  65. package/tests/client/input-value.test.tsrx +1125 -1354
  66. package/tests/client/lazy-array.test.tsrx +10 -16
  67. package/tests/client/lazy-destructuring.test.tsrx +169 -221
  68. package/tests/client/map.test.tsrx +39 -41
  69. package/tests/client/media-query.test.tsrx +15 -19
  70. package/tests/client/object.test.tsrx +46 -56
  71. package/tests/client/portal.test.tsrx +31 -37
  72. package/tests/client/ref.test.tsrx +173 -193
  73. package/tests/client/return.test.tsrx +62 -37
  74. package/tests/client/set.test.tsrx +33 -33
  75. package/tests/client/svg.test.tsrx +195 -215
  76. package/tests/client/switch.test.tsrx +201 -191
  77. package/tests/client/track-async-hydration.test.tsrx +14 -18
  78. package/tests/client/tracked-index-access.test.tsrx +18 -28
  79. package/tests/client/try.test.tsrx +494 -619
  80. package/tests/client/tsx.test.tsrx +286 -292
  81. package/tests/client/typescript-generics.test.tsrx +121 -129
  82. package/tests/client/url/url.derived.test.tsrx +21 -25
  83. package/tests/client/url/url.parsing.test.tsrx +35 -35
  84. package/tests/client/url/url.partial-removal.test.tsrx +32 -32
  85. package/tests/client/url/url.reactivity.test.tsrx +68 -72
  86. package/tests/client/url/url.serialization.test.tsrx +8 -8
  87. package/tests/client/url-search-params/url-search-params.derived.test.tsrx +21 -27
  88. package/tests/client/url-search-params/url-search-params.initialization.test.tsrx +16 -16
  89. package/tests/client/url-search-params/url-search-params.iteration.test.tsrx +37 -37
  90. package/tests/client/url-search-params/url-search-params.mutation.test.tsrx +56 -60
  91. package/tests/client/url-search-params/url-search-params.retrieval.test.tsrx +32 -34
  92. package/tests/client/url-search-params/url-search-params.serialization.test.tsrx +9 -9
  93. package/tests/client/url-search-params/url-search-params.tracked-url.test.tsrx +10 -10
  94. package/tests/hydration/compiled/client/basic.js +390 -319
  95. package/tests/hydration/compiled/client/composite.js +52 -44
  96. package/tests/hydration/compiled/client/for.js +734 -604
  97. package/tests/hydration/compiled/client/head.js +183 -103
  98. package/tests/hydration/compiled/client/html.js +93 -86
  99. package/tests/hydration/compiled/client/if-children.js +95 -71
  100. package/tests/hydration/compiled/client/if.js +113 -89
  101. package/tests/hydration/compiled/client/mixed-control-flow.js +225 -209
  102. package/tests/hydration/compiled/client/nested-control-flow.js +94 -98
  103. package/tests/hydration/compiled/client/reactivity.js +26 -24
  104. package/tests/hydration/compiled/client/return.js +8 -42
  105. package/tests/hydration/compiled/client/switch.js +208 -173
  106. package/tests/hydration/compiled/client/track-async-serialization.js +176 -128
  107. package/tests/hydration/compiled/client/try.js +29 -21
  108. package/tests/hydration/compiled/server/basic.js +210 -221
  109. package/tests/hydration/compiled/server/composite.js +13 -14
  110. package/tests/hydration/compiled/server/for.js +427 -444
  111. package/tests/hydration/compiled/server/head.js +199 -189
  112. package/tests/hydration/compiled/server/html.js +33 -41
  113. package/tests/hydration/compiled/server/if-children.js +114 -117
  114. package/tests/hydration/compiled/server/if.js +77 -83
  115. package/tests/hydration/compiled/server/mixed-control-flow.js +145 -150
  116. package/tests/hydration/compiled/server/nested-control-flow.js +10 -0
  117. package/tests/hydration/compiled/server/reactivity.js +24 -22
  118. package/tests/hydration/compiled/server/return.js +6 -18
  119. package/tests/hydration/compiled/server/switch.js +179 -176
  120. package/tests/hydration/compiled/server/track-async-serialization.js +88 -70
  121. package/tests/hydration/compiled/server/try.js +31 -35
  122. package/tests/hydration/components/basic.tsrx +216 -258
  123. package/tests/hydration/components/composite.tsrx +32 -42
  124. package/tests/hydration/components/events.tsrx +81 -101
  125. package/tests/hydration/components/for.tsrx +270 -336
  126. package/tests/hydration/components/head.tsrx +43 -39
  127. package/tests/hydration/components/hmr.tsrx +16 -22
  128. package/tests/hydration/components/html-in-template.tsrx +15 -21
  129. package/tests/hydration/components/html.tsrx +442 -526
  130. package/tests/hydration/components/if-children.tsrx +107 -125
  131. package/tests/hydration/components/if.tsrx +68 -90
  132. package/tests/hydration/components/mixed-control-flow.tsrx +65 -72
  133. package/tests/hydration/components/nested-control-flow.tsrx +202 -216
  134. package/tests/hydration/components/portal.tsrx +33 -41
  135. package/tests/hydration/components/reactivity.tsrx +26 -34
  136. package/tests/hydration/components/return.tsrx +4 -6
  137. package/tests/hydration/components/switch.tsrx +73 -78
  138. package/tests/hydration/components/track-async-serialization.tsrx +83 -93
  139. package/tests/hydration/components/try.tsrx +37 -51
  140. package/tests/hydration/switch.test.js +8 -8
  141. package/tests/server/await.test.tsrx +3 -3
  142. package/tests/server/basic.attributes.test.tsrx +117 -162
  143. package/tests/server/basic.components.test.tsrx +163 -193
  144. package/tests/server/basic.test.tsrx +298 -198
  145. package/tests/server/compiler.test.tsrx +142 -72
  146. package/tests/server/composite.props.test.tsrx +54 -58
  147. package/tests/server/composite.test.tsrx +165 -167
  148. package/tests/server/context.test.tsrx +13 -17
  149. package/tests/server/dynamic-elements.test.tsrx +103 -135
  150. package/tests/server/for.test.tsrx +115 -84
  151. package/tests/server/head.test.tsrx +31 -31
  152. package/tests/server/html-nesting-validation.test.tsrx +16 -8
  153. package/tests/server/if.test.tsrx +49 -59
  154. package/tests/server/lazy-destructuring.test.tsrx +288 -366
  155. package/tests/server/return.test.tsrx +58 -36
  156. package/tests/server/streaming-ssr.test.tsrx +4 -4
  157. package/tests/server/style-identifier.test.tsrx +58 -66
  158. package/tests/server/switch.test.tsrx +89 -97
  159. package/tests/server/track-async-serialization.test.tsrx +85 -103
  160. package/tests/server/try.test.tsrx +275 -360
  161. package/tests/utils/ref-types.test.js +72 -0
  162. package/tests/utils/vite-plugin-config.test.js +41 -74
  163. package/types/index.d.ts +1 -0
  164. package/src/runtime/internal/client/compat.js +0 -40
  165. package/tests/utils/compiler-compat-config.test.js +0 -38
@@ -3,27 +3,27 @@ import { compile } from '@tsrx/ripple';
3
3
 
4
4
  describe('basic client > errors', () => {
5
5
  it('renders with error handling simulation', () => {
6
- function Basic() {
7
- return <>
8
- let &[hasError] = track(false);
9
- let &[errorMessage] = track('');
10
- const triggerError = () => {
11
- try {
12
- throw new Error('Test error');
13
- } catch (e) {
14
- hasError = true;
15
- errorMessage = (e as Error).message;
16
- }
17
- };
18
- <div>
19
- <button onClick={triggerError}>{'Trigger Error'}</button>
20
- if (hasError) {
21
- <div class="error">{'Error caught: ' + errorMessage}</div>
22
- } else {
23
- <div class="success">{'No error'}</div>
24
- }
25
- </div>
26
- </>;
6
+ function Basic() @{
7
+ let &[hasError] = track(false);
8
+ let &[errorMessage] = track('');
9
+ const triggerError = () => {
10
+ try {
11
+ throw new Error('Test error');
12
+ } catch (e) {
13
+ hasError = true;
14
+ errorMessage = (e as Error).message;
15
+ }
16
+ };
17
+ <div>
18
+ <button onClick={triggerError}>{'Trigger Error'}</button>
19
+ @if (hasError) {
20
+ <div class="error">
21
+ {'Error caught: ' + errorMessage}
22
+ </div>
23
+ } @else {
24
+ <div class="success">{'No error'}</div>
25
+ }
26
+ </div>
27
27
  }
28
28
 
29
29
  render(Basic);
@@ -114,18 +114,16 @@ describe('basic client > errors', () => {
114
114
  });
115
115
 
116
116
  it('errors on mutating tracked value inside computed track() evaluation', () => {
117
- function Basic() {
118
- return <>
119
- let &[count] = track(0);
120
- const &[doubled] = track(() => {
121
- try {
122
- count *= 2;
123
- } catch (e) {
124
- error = (e as Error).message;
125
- }
126
- });
127
- <p>{doubled}</p>
128
- </>;
117
+ function Basic() @{
118
+ let &[count] = track(0);
119
+ const &[doubled] = track(() => {
120
+ try {
121
+ count *= 2;
122
+ } catch (e) {
123
+ error = (e as Error).message;
124
+ }
125
+ });
126
+ <p>{doubled}</p>
129
127
  }
130
128
 
131
129
  render(Basic);
@@ -136,20 +134,18 @@ describe('basic client > errors', () => {
136
134
  });
137
135
 
138
136
  it('errors on mutating tracked value inside untrack() in computed track() evaluation', () => {
139
- function Basic() {
140
- return <>
141
- let &[count] = track(0);
142
- const &[doubled] = track(() => {
143
- try {
144
- untrack(() => {
145
- count *= 2;
146
- });
147
- } catch (e) {
148
- error = (e as Error).message;
149
- }
150
- });
151
- <p>{doubled}</p>
152
- </>;
137
+ function Basic() @{
138
+ let &[count] = track(0);
139
+ const &[doubled] = track(() => {
140
+ try {
141
+ untrack(() => {
142
+ count *= 2;
143
+ });
144
+ } catch (e) {
145
+ error = (e as Error).message;
146
+ }
147
+ });
148
+ <p>{doubled}</p>
153
149
  }
154
150
 
155
151
  render(Basic);
@@ -160,19 +156,17 @@ describe('basic client > errors', () => {
160
156
  });
161
157
 
162
158
  it('errors on mutating a tracked variable in track() getter', () => {
163
- function Basic() {
164
- return <>
165
- let &[count] = track(0);
166
- const &[doubled] = track(0, (value) => {
167
- try {
168
- count += 1;
169
- } catch (e) {
170
- error = (e as Error).message;
171
- }
172
- return value;
173
- });
174
- <p>{doubled}</p>
175
- </>;
159
+ function Basic() @{
160
+ let &[count] = track(0);
161
+ const &[doubled] = track(0, (value) => {
162
+ try {
163
+ count += 1;
164
+ } catch (e) {
165
+ error = (e as Error).message;
166
+ }
167
+ return value;
168
+ });
169
+ <p>{doubled}</p>
176
170
  }
177
171
 
178
172
  render(Basic);
@@ -184,48 +178,48 @@ describe('basic client > errors', () => {
184
178
 
185
179
  it('should throw error for await inside client components', () => {
186
180
  const code = `
187
- export default async function App() { return <>
181
+ export default async function App() @{
188
182
  let data = 'initial';
189
183
  if (true) {
190
184
  await new Promise(r => setTimeout(r, 100));
191
185
  data = 'loaded';
192
186
  }
193
187
  <div>{data}</div>
194
- </>; }
188
+ }
195
189
  `;
196
190
  expect(() => {
197
191
  compile(code, 'test.tsrx', { mode: 'client' });
198
192
  }).toThrow(/`await` is not allowed inside components\./);
199
193
  });
200
194
 
201
- it('should throw error for while loop inside a component', () => {
195
+ it('should allow while loop setup inside a component', () => {
202
196
  const code = `
203
- export default function App() { return <>
197
+ export default function App() @{
204
198
  let i = 0;
205
199
  while (i < 10) {
206
200
  i++;
207
201
  }
208
202
  <div>{i}</div>
209
- </>; }
203
+ }
210
204
  `;
211
205
  expect(() => {
212
206
  compile(code, 'test.tsrx');
213
- }).toThrow('While loops are not supported in TSRX templates.');
207
+ }).not.toThrow();
214
208
  });
215
209
 
216
- it('should throw error for do...while loop inside a component', () => {
210
+ it('should allow do...while loop setup inside a component', () => {
217
211
  const code = `
218
- export default function App() { return <>
212
+ export default function App() @{
219
213
  let i = 0;
220
214
  do {
221
215
  i++;
222
216
  } while (i < 10);
223
217
  <div>{i}</div>
224
- </>; }
218
+ }
225
219
  `;
226
220
  expect(() => {
227
221
  compile(code, 'test.tsrx');
228
- }).toThrow('Do...while loops are not supported in TSRX templates.');
222
+ }).not.toThrow();
229
223
  });
230
224
 
231
225
  it('should allow JSX fragments in TSRX templates as <> shorthand', () => {
@@ -254,7 +248,7 @@ describe('basic client > errors', () => {
254
248
 
255
249
  it('should not throw error for while loop inside a function within a component', () => {
256
250
  const code = `
257
- export default function App() { return <>
251
+ export default function App() @{
258
252
  const compute = () => {
259
253
  let i = 0;
260
254
  while (i < 10) {
@@ -263,7 +257,7 @@ describe('basic client > errors', () => {
263
257
  return i;
264
258
  };
265
259
  <div>{compute()}</div>
266
- </>; }
260
+ }
267
261
  `;
268
262
  expect(() => {
269
263
  compile(code, 'test.tsrx');
@@ -272,7 +266,7 @@ describe('basic client > errors', () => {
272
266
 
273
267
  it('should not throw error for do...while loop inside a function within a component', () => {
274
268
  const code = `
275
- export default function App() { return <>
269
+ export default function App() @{
276
270
  const compute = () => {
277
271
  let i = 0;
278
272
  do {
@@ -281,7 +275,7 @@ describe('basic client > errors', () => {
281
275
  return i;
282
276
  };
283
277
  <div>{compute()}</div>
284
- </>; }
278
+ }
285
279
  `;
286
280
  expect(() => {
287
281
  compile(code, 'test.tsrx');
@@ -290,10 +284,10 @@ describe('basic client > errors', () => {
290
284
 
291
285
  it('should throw error for variables using the reserved _$_ prefix', () => {
292
286
  const code = `
293
- export default function App() { return <>
287
+ export default function App() @{
294
288
  const _$_test = 'hello';
295
289
  <div>{_$_test}</div>
296
- </>; }
290
+ }
297
291
  `;
298
292
  expect(() => {
299
293
  compile(code, 'test.tsrx');
@@ -3,10 +3,10 @@ import { flushSync, track } from 'ripple';
3
3
 
4
4
  describe('basic client > events', () => {
5
5
  it('renders with different event types', () => {
6
- function Basic() {
7
- return <>
8
- let &[focusCount] = track(0);
9
- let &[clickCount] = track(0);
6
+ function Basic() @{
7
+ let &[focusCount] = track(0);
8
+ let &[clickCount] = track(0);
9
+ <>
10
10
  <button
11
11
  onFocus={() => {
12
12
  focusCount++;
@@ -14,12 +14,10 @@ describe('basic client > events', () => {
14
14
  onClick={() => {
15
15
  clickCount++;
16
16
  }}
17
- >
18
- {'Test Button'}
19
- </button>
17
+ >{'Test Button'}</button>
20
18
  <div class="focus-count">{focusCount}</div>
21
19
  <div class="click-count">{clickCount}</div>
22
- </>;
20
+ </>
23
21
  }
24
22
 
25
23
  render(Basic);
@@ -38,10 +36,10 @@ describe('basic client > events', () => {
38
36
  });
39
37
 
40
38
  it('renders with capture events', () => {
41
- function Basic() {
42
- return <>
43
- let &[captureClicks] = track(0);
44
- let &[bubbleClicks] = track(0);
39
+ function Basic() @{
40
+ let &[captureClicks] = track(0);
41
+ let &[bubbleClicks] = track(0);
42
+ <>
45
43
  <div
46
44
  onClick={{
47
45
  handleEvent: () => {
@@ -54,13 +52,11 @@ describe('basic client > events', () => {
54
52
  onClick={() => {
55
53
  bubbleClicks++;
56
54
  }}
57
- >
58
- {'Click me'}
59
- </button>
55
+ >{'Click me'}</button>
60
56
  <div class="capture-count">{captureClicks}</div>
61
57
  <div class="bubble-count">{bubbleClicks}</div>
62
58
  </div>
63
- </>;
59
+ </>
64
60
  }
65
61
 
66
62
  render(Basic);
@@ -77,25 +73,23 @@ describe('basic client > events', () => {
77
73
  });
78
74
 
79
75
  it('renders with event listeners in spread props', () => {
80
- function Basic() {
81
- return <>
82
- let &[count] = track(0);
83
- const minus = {
84
- onClick() {
85
- count--;
86
- },
87
- };
88
- const plus = {
89
- onClick() {
90
- count++;
91
- },
92
- };
93
- <div>
94
- <button {...minus} class="minus">{'-'}</button>
95
- <span class="count">{count}</span>
96
- <button {...plus} class="plus">{'+'}</button>
97
- </div>
98
- </>;
76
+ function Basic() @{
77
+ let &[count] = track(0);
78
+ const minus = {
79
+ onClick() {
80
+ count--;
81
+ },
82
+ };
83
+ const plus = {
84
+ onClick() {
85
+ count++;
86
+ },
87
+ };
88
+ <div>
89
+ <button {...minus} class="minus">{'-'}</button>
90
+ <span class="count">{count}</span>
91
+ <button {...plus} class="plus">{'+'}</button>
92
+ </div>
99
93
  }
100
94
 
101
95
  render(Basic);
@@ -125,16 +119,17 @@ describe('basic client > events', () => {
125
119
  });
126
120
 
127
121
  it('removes event listeners from spread props when they are replaced by another prop', () => {
128
- function Basic() {
129
- return <>
130
- let &[enabled] = track(true);
131
- let &[count] = track(0);
132
- <button class="target" {...(enabled ? { onClick: () => count++ } : { title: 'disabled' })}>
133
- {'target'}
134
- </button>
122
+ function Basic() @{
123
+ let &[enabled] = track(true);
124
+ let &[count] = track(0);
125
+ <>
126
+ <button
127
+ class="target"
128
+ {...(enabled ? { onClick: () => count++ } : { title: 'disabled' })}
129
+ >{'target'}</button>
135
130
  <button class="toggle" onClick={() => (enabled = false)}>{'toggle'}</button>
136
131
  <span class="count">{count}</span>
137
- </>;
132
+ </>
138
133
  }
139
134
 
140
135
  render(Basic);
@@ -156,26 +151,24 @@ describe('basic client > events', () => {
156
151
  });
157
152
 
158
153
  it('handles both delegated and non-delegated events in spread props', () => {
159
- function Basic() {
160
- return <>
161
- let &[clickCount] = track(0);
162
- let &[focusCount] = track(0);
163
- const mixedHandler = {
164
- onClick() {
165
- // Delegated event
166
- clickCount++;
167
- },
168
- onFocus() {
169
- // Non-delegated event
170
- focusCount++;
171
- },
172
- };
173
- <div>
174
- <button {...mixedHandler} class="mixed-button">{'Test'}</button>
175
- <span class="click-count">{clickCount}</span>
176
- <span class="focus-count">{focusCount}</span>
177
- </div>
178
- </>;
154
+ function Basic() @{
155
+ let &[clickCount] = track(0);
156
+ let &[focusCount] = track(0);
157
+ const mixedHandler = {
158
+ onClick() {
159
+ // Delegated event
160
+ clickCount++;
161
+ },
162
+ onFocus() {
163
+ // Non-delegated event
164
+ focusCount++;
165
+ },
166
+ };
167
+ <div>
168
+ <button {...mixedHandler} class="mixed-button">{'Test'}</button>
169
+ <span class="click-count">{clickCount}</span>
170
+ <span class="focus-count">{focusCount}</span>
171
+ </div>
179
172
  }
180
173
 
181
174
  render(Basic);
@@ -199,33 +192,35 @@ describe('basic client > events', () => {
199
192
  });
200
193
 
201
194
  it('renders with complex event handling and state updates', () => {
202
- function Basic() {
203
- return <>
204
- let &[counter] = track(0);
205
- let &[history] = track<string[]>([]);
206
- let &[isEven] = track(true);
207
- const handleIncrement = () => {
208
- counter++;
209
- history = [...history, `Inc to ${counter}`];
210
- isEven = counter % 2 === 0;
211
- };
212
- const handleDecrement = () => {
213
- counter--;
214
- history = [...history, `Dec to ${counter}`];
215
- isEven = counter % 2 === 0;
216
- };
217
- const handleReset = () => {
218
- counter = 0;
219
- history = [...history, 'Reset'];
220
- isEven = true;
221
- };
195
+ function Basic() @{
196
+ let &[counter] = track(0);
197
+ let &[history] = track<string[]>([]);
198
+ let &[isEven] = track(true);
199
+ const handleIncrement = () => {
200
+ counter++;
201
+ history = [...history, `Inc to ${counter}`];
202
+ isEven = counter % 2 === 0;
203
+ };
204
+ const handleDecrement = () => {
205
+ counter--;
206
+ history = [...history, `Dec to ${counter}`];
207
+ isEven = counter % 2 === 0;
208
+ };
209
+ const handleReset = () => {
210
+ counter = 0;
211
+ history = [...history, 'Reset'];
212
+ isEven = true;
213
+ };
214
+ <>
222
215
  <div class="counter">{counter}</div>
223
- <div class="parity">{isEven ? 'Even' : 'Odd'}</div>
216
+ <div class="parity">
217
+ {isEven ? 'Even' : 'Odd'}
218
+ </div>
224
219
  <div class="history-count">{history.length}</div>
225
220
  <button class="inc-btn" onClick={handleIncrement}>{'+'}</button>
226
221
  <button class="dec-btn" onClick={handleDecrement}>{'-'}</button>
227
222
  <button class="reset-btn" onClick={handleReset}>{'Reset'}</button>
228
- </>;
223
+ </>
229
224
  }
230
225
 
231
226
  render(Basic);