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.
- package/CHANGELOG.md +66 -0
- package/package.json +3 -3
- package/src/jsx-runtime.d.ts +2 -8
- package/src/runtime/index-client.js +3 -13
- package/src/runtime/internal/client/blocks.js +3 -25
- package/src/runtime/internal/client/for.js +80 -5
- package/src/runtime/internal/client/index.js +0 -2
- package/src/runtime/internal/client/types.d.ts +0 -10
- package/tests/client/__snapshots__/computed-properties.test.tsrx.snap +8 -0
- package/tests/client/__snapshots__/for.test.tsrx.snap +22 -0
- package/tests/client/__snapshots__/html.test.tsrx.snap +4 -0
- package/tests/client/array/array.copy-within.test.tsrx +19 -19
- package/tests/client/array/array.derived.test.tsrx +97 -109
- package/tests/client/array/array.iteration.test.tsrx +28 -28
- package/tests/client/array/array.mutations.test.tsrx +68 -68
- package/tests/client/array/array.static.test.tsrx +82 -92
- package/tests/client/array/array.to-methods.test.tsrx +15 -15
- package/tests/client/async-suspend.test.tsrx +180 -179
- package/tests/client/basic/__snapshots__/basic.attributes.test.tsrx.snap +2 -0
- package/tests/client/basic/__snapshots__/basic.rendering.test.tsrx.snap +4 -0
- package/tests/client/basic/basic.attributes.test.tsrx +273 -317
- package/tests/client/basic/basic.collections.test.tsrx +55 -61
- package/tests/client/basic/basic.components.test.tsrx +196 -218
- package/tests/client/basic/basic.errors.test.tsrx +70 -76
- package/tests/client/basic/basic.events.test.tsrx +80 -85
- package/tests/client/basic/basic.get-set.test.tsrx +54 -64
- package/tests/client/basic/basic.hmr.test.tsrx +15 -19
- package/tests/client/basic/basic.reactivity.test.tsrx +121 -135
- package/tests/client/basic/basic.rendering.test.tsrx +273 -178
- package/tests/client/basic/basic.utilities.test.tsrx +8 -10
- package/tests/client/boundaries.test.tsrx +18 -18
- package/tests/client/compiler/compiler.assignments.test.tsrx +77 -76
- package/tests/client/compiler/compiler.attributes.test.tsrx +18 -14
- package/tests/client/compiler/compiler.basic.test.tsrx +357 -288
- package/tests/client/compiler/compiler.regex.test.tsrx +40 -44
- package/tests/client/compiler/compiler.tracked-access.test.tsrx +57 -38
- package/tests/client/compiler/compiler.try-in-function.test.tsrx +16 -16
- package/tests/client/compiler/compiler.typescript.test.tsrx +4 -3
- package/tests/client/composite/composite.dynamic-components.test.tsrx +41 -44
- package/tests/client/composite/composite.generics.test.tsrx +165 -167
- package/tests/client/composite/composite.props.test.tsrx +66 -74
- package/tests/client/composite/composite.reactivity.test.tsrx +132 -166
- package/tests/client/composite/composite.render.test.tsrx +92 -101
- package/tests/client/computed-properties.test.tsrx +14 -18
- package/tests/client/context.test.tsrx +14 -18
- package/tests/client/css/global-additional-cases.test.tsrx +491 -437
- package/tests/client/css/global-advanced-selectors.test.tsrx +169 -153
- package/tests/client/css/global-at-rules.test.tsrx +71 -66
- package/tests/client/css/global-basic.test.tsrx +105 -98
- package/tests/client/css/global-classes-ids.test.tsrx +128 -114
- package/tests/client/css/global-combinators.test.tsrx +83 -78
- package/tests/client/css/global-complex-nesting.test.tsrx +134 -120
- package/tests/client/css/global-edge-cases.test.tsrx +138 -120
- package/tests/client/css/global-keyframes.test.tsrx +108 -96
- package/tests/client/css/global-nested.test.tsrx +88 -78
- package/tests/client/css/global-pseudo.test.tsrx +104 -98
- package/tests/client/css/global-scoping.test.tsrx +145 -125
- package/tests/client/css/style-identifier.test.tsrx +62 -69
- package/tests/client/date.test.tsrx +83 -83
- package/tests/client/dynamic-elements.test.tsrx +227 -283
- package/tests/client/events.test.tsrx +252 -266
- package/tests/client/for.test.tsrx +120 -127
- package/tests/client/head.test.tsrx +40 -48
- package/tests/client/html.test.tsrx +37 -49
- package/tests/client/input-value.test.tsrx +1125 -1354
- package/tests/client/lazy-array.test.tsrx +10 -16
- package/tests/client/lazy-destructuring.test.tsrx +169 -221
- package/tests/client/map.test.tsrx +39 -41
- package/tests/client/media-query.test.tsrx +15 -19
- package/tests/client/object.test.tsrx +46 -56
- package/tests/client/portal.test.tsrx +31 -37
- package/tests/client/ref.test.tsrx +173 -193
- package/tests/client/return.test.tsrx +62 -37
- package/tests/client/set.test.tsrx +33 -33
- package/tests/client/svg.test.tsrx +195 -215
- package/tests/client/switch.test.tsrx +201 -191
- package/tests/client/track-async-hydration.test.tsrx +14 -18
- package/tests/client/tracked-index-access.test.tsrx +18 -28
- package/tests/client/try.test.tsrx +494 -619
- package/tests/client/tsx.test.tsrx +286 -292
- package/tests/client/typescript-generics.test.tsrx +121 -129
- package/tests/client/url/url.derived.test.tsrx +21 -25
- package/tests/client/url/url.parsing.test.tsrx +35 -35
- package/tests/client/url/url.partial-removal.test.tsrx +32 -32
- package/tests/client/url/url.reactivity.test.tsrx +68 -72
- package/tests/client/url/url.serialization.test.tsrx +8 -8
- package/tests/client/url-search-params/url-search-params.derived.test.tsrx +21 -27
- package/tests/client/url-search-params/url-search-params.initialization.test.tsrx +16 -16
- package/tests/client/url-search-params/url-search-params.iteration.test.tsrx +37 -37
- package/tests/client/url-search-params/url-search-params.mutation.test.tsrx +56 -60
- package/tests/client/url-search-params/url-search-params.retrieval.test.tsrx +32 -34
- package/tests/client/url-search-params/url-search-params.serialization.test.tsrx +9 -9
- package/tests/client/url-search-params/url-search-params.tracked-url.test.tsrx +10 -10
- package/tests/hydration/compiled/client/basic.js +390 -319
- package/tests/hydration/compiled/client/composite.js +52 -44
- package/tests/hydration/compiled/client/for.js +734 -604
- package/tests/hydration/compiled/client/head.js +183 -103
- package/tests/hydration/compiled/client/html.js +93 -86
- package/tests/hydration/compiled/client/if-children.js +95 -71
- package/tests/hydration/compiled/client/if.js +113 -89
- package/tests/hydration/compiled/client/mixed-control-flow.js +225 -209
- package/tests/hydration/compiled/client/nested-control-flow.js +94 -98
- package/tests/hydration/compiled/client/reactivity.js +26 -24
- package/tests/hydration/compiled/client/return.js +8 -42
- package/tests/hydration/compiled/client/switch.js +208 -173
- package/tests/hydration/compiled/client/track-async-serialization.js +176 -128
- package/tests/hydration/compiled/client/try.js +29 -21
- package/tests/hydration/compiled/server/basic.js +210 -221
- package/tests/hydration/compiled/server/composite.js +13 -14
- package/tests/hydration/compiled/server/for.js +427 -444
- package/tests/hydration/compiled/server/head.js +199 -189
- package/tests/hydration/compiled/server/html.js +33 -41
- package/tests/hydration/compiled/server/if-children.js +114 -117
- package/tests/hydration/compiled/server/if.js +77 -83
- package/tests/hydration/compiled/server/mixed-control-flow.js +145 -150
- package/tests/hydration/compiled/server/nested-control-flow.js +10 -0
- package/tests/hydration/compiled/server/reactivity.js +24 -22
- package/tests/hydration/compiled/server/return.js +6 -18
- package/tests/hydration/compiled/server/switch.js +179 -176
- package/tests/hydration/compiled/server/track-async-serialization.js +88 -70
- package/tests/hydration/compiled/server/try.js +31 -35
- package/tests/hydration/components/basic.tsrx +216 -258
- package/tests/hydration/components/composite.tsrx +32 -42
- package/tests/hydration/components/events.tsrx +81 -101
- package/tests/hydration/components/for.tsrx +270 -336
- package/tests/hydration/components/head.tsrx +43 -39
- package/tests/hydration/components/hmr.tsrx +16 -22
- package/tests/hydration/components/html-in-template.tsrx +15 -21
- package/tests/hydration/components/html.tsrx +442 -526
- package/tests/hydration/components/if-children.tsrx +107 -125
- package/tests/hydration/components/if.tsrx +68 -90
- package/tests/hydration/components/mixed-control-flow.tsrx +65 -72
- package/tests/hydration/components/nested-control-flow.tsrx +202 -216
- package/tests/hydration/components/portal.tsrx +33 -41
- package/tests/hydration/components/reactivity.tsrx +26 -34
- package/tests/hydration/components/return.tsrx +4 -6
- package/tests/hydration/components/switch.tsrx +73 -78
- package/tests/hydration/components/track-async-serialization.tsrx +83 -93
- package/tests/hydration/components/try.tsrx +37 -51
- package/tests/hydration/switch.test.js +8 -8
- package/tests/server/await.test.tsrx +3 -3
- package/tests/server/basic.attributes.test.tsrx +117 -162
- package/tests/server/basic.components.test.tsrx +163 -193
- package/tests/server/basic.test.tsrx +298 -198
- package/tests/server/compiler.test.tsrx +142 -72
- package/tests/server/composite.props.test.tsrx +54 -58
- package/tests/server/composite.test.tsrx +165 -167
- package/tests/server/context.test.tsrx +13 -17
- package/tests/server/dynamic-elements.test.tsrx +103 -135
- package/tests/server/for.test.tsrx +115 -84
- package/tests/server/head.test.tsrx +31 -31
- package/tests/server/html-nesting-validation.test.tsrx +16 -8
- package/tests/server/if.test.tsrx +49 -59
- package/tests/server/lazy-destructuring.test.tsrx +288 -366
- package/tests/server/return.test.tsrx +58 -36
- package/tests/server/streaming-ssr.test.tsrx +4 -4
- package/tests/server/style-identifier.test.tsrx +58 -66
- package/tests/server/switch.test.tsrx +89 -97
- package/tests/server/track-async-serialization.test.tsrx +85 -103
- package/tests/server/try.test.tsrx +275 -360
- package/tests/utils/ref-types.test.js +72 -0
- package/tests/utils/vite-plugin-config.test.js +41 -74
- package/types/index.d.ts +1 -0
- package/src/runtime/internal/client/compat.js +0 -40
- package/tests/utils/compiler-compat-config.test.js +0 -38
|
@@ -3,101 +3,91 @@ import { track } from 'ripple';
|
|
|
3
3
|
// Minimal repro for hydration issue with if block containing children
|
|
4
4
|
// Based on SidebarGroup pattern from website-new
|
|
5
5
|
|
|
6
|
-
export function IfWithChildren({ children }: { children: any }) {
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
<div class="
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
</div>
|
|
15
|
-
</>;
|
|
6
|
+
export function IfWithChildren({ children }: { children: any }) @{
|
|
7
|
+
let &[expanded] = track(true);
|
|
8
|
+
<div class="container">
|
|
9
|
+
<div class="header" role="button" onClick={() => (expanded = !expanded)}>{'Toggle'}</div>
|
|
10
|
+
@if (expanded) {
|
|
11
|
+
<div class="content">{children}</div>
|
|
12
|
+
}
|
|
13
|
+
</div>
|
|
16
14
|
}
|
|
17
15
|
|
|
18
|
-
export function ChildItem({ text: label }: { text: string }) {
|
|
19
|
-
|
|
16
|
+
export function ChildItem({ text: label }: { text: string }) @{
|
|
17
|
+
<div class="item">{label}</div>
|
|
20
18
|
}
|
|
21
19
|
|
|
22
|
-
export function TestIfWithChildren() {
|
|
23
|
-
|
|
24
|
-
<
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
</IfWithChildren>
|
|
28
|
-
</>;
|
|
20
|
+
export function TestIfWithChildren() @{
|
|
21
|
+
<IfWithChildren>
|
|
22
|
+
<ChildItem text="Item 1" />
|
|
23
|
+
<ChildItem text="Item 2" />
|
|
24
|
+
</IfWithChildren>
|
|
29
25
|
}
|
|
30
26
|
|
|
31
27
|
// Simpler variant - if block with static children
|
|
32
|
-
export function IfWithStaticChildren() {
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
<div class="
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
<
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
</div>
|
|
44
|
-
</>;
|
|
28
|
+
export function IfWithStaticChildren() @{
|
|
29
|
+
let &[expanded] = track(true);
|
|
30
|
+
<div class="container">
|
|
31
|
+
<div class="header" role="button" onClick={() => (expanded = !expanded)}>{'Toggle'}</div>
|
|
32
|
+
@if (expanded) {
|
|
33
|
+
<div class="content">
|
|
34
|
+
<span>{'Static child 1'}</span>
|
|
35
|
+
<span>{'Static child 2'}</span>
|
|
36
|
+
</div>
|
|
37
|
+
}
|
|
38
|
+
</div>
|
|
45
39
|
}
|
|
46
40
|
|
|
47
41
|
// Variant with sibling elements before the if block (like SidebarGroup)
|
|
48
|
-
export function IfWithSiblingsAndChildren({ children }: { children: any }) {
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
<
|
|
52
|
-
<div class="
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
<
|
|
56
|
-
<
|
|
57
|
-
|
|
58
|
-
</svg>
|
|
59
|
-
</div>
|
|
42
|
+
export function IfWithSiblingsAndChildren({ children }: { children: any }) @{
|
|
43
|
+
let &[expanded] = track(true);
|
|
44
|
+
<section class="group">
|
|
45
|
+
<div class="item" role="button" onClick={() => (expanded = !expanded)}>
|
|
46
|
+
<div class="indicator" />
|
|
47
|
+
<h2 class="text">{'Title'}</h2>
|
|
48
|
+
<div class="caret">
|
|
49
|
+
<svg xmlns="http://www.w3.org/2000/svg" width="18" height="18" viewBox="0 0 24 24">
|
|
50
|
+
<path d="m9 18 6-6-6-6" />
|
|
51
|
+
</svg>
|
|
60
52
|
</div>
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
|
|
53
|
+
</div>
|
|
54
|
+
@if (expanded) {
|
|
55
|
+
<div class="items">{children}</div>
|
|
56
|
+
}
|
|
57
|
+
</section>
|
|
66
58
|
}
|
|
67
59
|
|
|
68
|
-
export function TestIfWithSiblingsAndChildren() {
|
|
69
|
-
|
|
70
|
-
<
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
</IfWithSiblingsAndChildren>
|
|
74
|
-
</>;
|
|
60
|
+
export function TestIfWithSiblingsAndChildren() @{
|
|
61
|
+
<IfWithSiblingsAndChildren>
|
|
62
|
+
<ChildItem text="Item A" />
|
|
63
|
+
<ChildItem text="Item B" />
|
|
64
|
+
</IfWithSiblingsAndChildren>
|
|
75
65
|
}
|
|
76
66
|
|
|
77
67
|
// Test case for hydration pop bug: element with nested children followed by dynamic if sibling
|
|
78
68
|
// This tests that hydrate_node is properly restored after processing an element's children
|
|
79
69
|
// before navigating to a dynamic sibling (if/for/switch)
|
|
80
|
-
export function ElementWithChildrenThenIf() {
|
|
81
|
-
|
|
82
|
-
|
|
70
|
+
export function ElementWithChildrenThenIf() @{
|
|
71
|
+
let &[show] = track(true);
|
|
72
|
+
<>
|
|
83
73
|
<div class="wrapper">
|
|
84
74
|
<div class="nested-parent">
|
|
85
75
|
<div class="nested-child">
|
|
86
76
|
<span class="deep">{'Deep content'}</span>
|
|
87
77
|
</div>
|
|
88
78
|
</div>
|
|
89
|
-
if (show) {
|
|
79
|
+
@if (show) {
|
|
90
80
|
<div class="conditional">{'Conditional content'}</div>
|
|
91
81
|
}
|
|
92
82
|
</div>
|
|
93
83
|
<button class="toggle" onClick={() => (show = !show)}>{'Toggle'}</button>
|
|
94
|
-
|
|
84
|
+
</>
|
|
95
85
|
}
|
|
96
86
|
|
|
97
87
|
// More complex: multiple levels of nesting before if sibling
|
|
98
|
-
export function DeepNestingThenIf() {
|
|
99
|
-
|
|
100
|
-
|
|
88
|
+
export function DeepNestingThenIf() @{
|
|
89
|
+
let &[visible] = track(true);
|
|
90
|
+
<>
|
|
101
91
|
<section class="outer">
|
|
102
92
|
<article class="middle">
|
|
103
93
|
<div class="inner">
|
|
@@ -107,54 +97,48 @@ export function DeepNestingThenIf() {
|
|
|
107
97
|
</p>
|
|
108
98
|
</div>
|
|
109
99
|
</article>
|
|
110
|
-
if (visible) {
|
|
100
|
+
@if (visible) {
|
|
111
101
|
<footer class="footer">{'Footer'}</footer>
|
|
112
102
|
}
|
|
113
103
|
</section>
|
|
114
104
|
<button class="btn" onClick={() => (visible = !visible)}>{'Toggle'}</button>
|
|
115
|
-
|
|
105
|
+
</>
|
|
116
106
|
}
|
|
117
107
|
|
|
118
108
|
// Test case for CodeBlock pattern: element with only DOM element children (like buttons)
|
|
119
109
|
// followed by another sibling element. This requires pop() to restore hydrate_node
|
|
120
110
|
// because we descend into the first element to get the button children.
|
|
121
|
-
export function DomElementChildrenThenSibling() {
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
<div class="
|
|
125
|
-
<
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
aria-selected={activeTab === 'preview' ? 'true' : 'false'}
|
|
136
|
-
onClick={() => (activeTab = 'preview')}
|
|
137
|
-
>
|
|
138
|
-
{'Preview'}
|
|
139
|
-
</button>
|
|
140
|
-
</div>
|
|
141
|
-
<div class="panel">
|
|
142
|
-
if (activeTab === 'code') {
|
|
143
|
-
<pre class="code">{'const x = 1;'}</pre>
|
|
144
|
-
} else {
|
|
145
|
-
<div class="preview">{'Preview content'}</div>
|
|
146
|
-
}
|
|
147
|
-
</div>
|
|
111
|
+
export function DomElementChildrenThenSibling() @{
|
|
112
|
+
let &[activeTab] = track('code');
|
|
113
|
+
<div class="tabs">
|
|
114
|
+
<div class="tab-list">
|
|
115
|
+
<button
|
|
116
|
+
class="tab"
|
|
117
|
+
aria-selected={activeTab === 'code' ? 'true' : 'false'}
|
|
118
|
+
onClick={() => (activeTab = 'code')}
|
|
119
|
+
>{'Code'}</button>
|
|
120
|
+
<button
|
|
121
|
+
class="tab"
|
|
122
|
+
aria-selected={activeTab === 'preview' ? 'true' : 'false'}
|
|
123
|
+
onClick={() => (activeTab = 'preview')}
|
|
124
|
+
>{'Preview'}</button>
|
|
148
125
|
</div>
|
|
149
|
-
|
|
126
|
+
<div class="panel">
|
|
127
|
+
@if (activeTab === 'code') {
|
|
128
|
+
<pre class="code">{'const x = 1;'}</pre>
|
|
129
|
+
} @else {
|
|
130
|
+
<div class="preview">{'Preview content'}</div>
|
|
131
|
+
}
|
|
132
|
+
</div>
|
|
133
|
+
</div>
|
|
150
134
|
}
|
|
151
135
|
|
|
152
136
|
// Test case for element with DOM children followed by static siblings that don't
|
|
153
137
|
// generate sibling() calls. This was causing incorrect pop() generation before next().
|
|
154
138
|
// Pattern: <ul> with dynamic <li> children -> static <h2> -> static <p> -> next()
|
|
155
|
-
export function DomChildrenThenStaticSiblings() {
|
|
156
|
-
|
|
157
|
-
|
|
139
|
+
export function DomChildrenThenStaticSiblings() @{
|
|
140
|
+
let &[count] = track(0);
|
|
141
|
+
<>
|
|
158
142
|
<div class="container">
|
|
159
143
|
<ul class="list">
|
|
160
144
|
<li class="item">
|
|
@@ -167,37 +151,35 @@ export function DomChildrenThenStaticSiblings() {
|
|
|
167
151
|
<p class="para">{'Static paragraph'}</p>
|
|
168
152
|
</div>
|
|
169
153
|
<button class="inc" onClick={() => count++}>{'Increment'}</button>
|
|
170
|
-
|
|
154
|
+
</>
|
|
171
155
|
}
|
|
172
156
|
|
|
173
157
|
// Test case for completely static element children followed by static siblings.
|
|
174
158
|
// Pattern from introduction page: <ul> with static <li> (strong, code, text)
|
|
175
159
|
// followed by static <h2> and <p>. No pop() should be generated for these.
|
|
176
|
-
export function StaticListThenStaticSiblings() {
|
|
177
|
-
|
|
178
|
-
<
|
|
179
|
-
<
|
|
180
|
-
<
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
<
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
<
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
</div>
|
|
202
|
-
</>;
|
|
160
|
+
export function StaticListThenStaticSiblings() @{
|
|
161
|
+
<div class="wrapper">
|
|
162
|
+
<ul class="features">
|
|
163
|
+
<li>
|
|
164
|
+
<strong>{'Feature One'}</strong>
|
|
165
|
+
{': Description of feature one with '}
|
|
166
|
+
<code>{'code'}</code>
|
|
167
|
+
{' reference'}
|
|
168
|
+
</li>
|
|
169
|
+
<li>
|
|
170
|
+
<strong>{'Feature Two'}</strong>
|
|
171
|
+
{': Another feature description'}
|
|
172
|
+
</li>
|
|
173
|
+
<li>
|
|
174
|
+
<strong>{'Feature Three'}</strong>
|
|
175
|
+
{': Third feature'}
|
|
176
|
+
</li>
|
|
177
|
+
</ul>
|
|
178
|
+
<h2 class="section-heading">{'Section Heading'}</h2>
|
|
179
|
+
<p class="section-content">
|
|
180
|
+
{'Static paragraph with '}
|
|
181
|
+
<a href="/link">{'a link'}</a>
|
|
182
|
+
{' and more text.'}
|
|
183
|
+
</p>
|
|
184
|
+
</div>
|
|
203
185
|
}
|
|
@@ -2,137 +2,115 @@ import { track } from 'ripple';
|
|
|
2
2
|
|
|
3
3
|
// If block components for hydration testing
|
|
4
4
|
|
|
5
|
-
export function IfTruthy() {
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
}
|
|
11
|
-
</>;
|
|
5
|
+
export function IfTruthy() @{
|
|
6
|
+
const show = true;
|
|
7
|
+
@if (show) {
|
|
8
|
+
<div class="shown">{'Visible'}</div>
|
|
9
|
+
}
|
|
12
10
|
}
|
|
13
11
|
|
|
14
|
-
export function IfFalsy() {
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
}
|
|
20
|
-
</>;
|
|
12
|
+
export function IfFalsy() @{
|
|
13
|
+
const show = false;
|
|
14
|
+
@if (show) {
|
|
15
|
+
<div class="shown">{'Visible'}</div>
|
|
16
|
+
}
|
|
21
17
|
}
|
|
22
18
|
|
|
23
|
-
export function IfElse() {
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
}
|
|
31
|
-
</>;
|
|
19
|
+
export function IfElse() @{
|
|
20
|
+
const isLoggedIn = true;
|
|
21
|
+
@if (isLoggedIn) {
|
|
22
|
+
<div class="logged-in">{'Welcome back!'}</div>
|
|
23
|
+
} @else {
|
|
24
|
+
<div class="logged-out">{'Please log in'}</div>
|
|
25
|
+
}
|
|
32
26
|
}
|
|
33
27
|
|
|
34
|
-
export function ReactiveIf() {
|
|
35
|
-
|
|
36
|
-
|
|
28
|
+
export function ReactiveIf() @{
|
|
29
|
+
let &[show] = track(true);
|
|
30
|
+
<>
|
|
37
31
|
<button
|
|
38
32
|
class="toggle"
|
|
39
33
|
onClick={() => {
|
|
40
34
|
show = !show;
|
|
41
35
|
}}
|
|
42
|
-
>
|
|
43
|
-
|
|
44
|
-
</button>
|
|
45
|
-
if (show) {
|
|
36
|
+
>{'Toggle'}</button>
|
|
37
|
+
@if (show) {
|
|
46
38
|
<div class="content">{'Content visible'}</div>
|
|
47
39
|
}
|
|
48
|
-
|
|
40
|
+
</>
|
|
49
41
|
}
|
|
50
42
|
|
|
51
|
-
export function ReactiveIfElse() {
|
|
52
|
-
|
|
53
|
-
|
|
43
|
+
export function ReactiveIfElse() @{
|
|
44
|
+
let &[isOn] = track(false);
|
|
45
|
+
<>
|
|
54
46
|
<button
|
|
55
47
|
class="toggle"
|
|
56
48
|
onClick={() => {
|
|
57
49
|
isOn = !isOn;
|
|
58
50
|
}}
|
|
59
|
-
>
|
|
60
|
-
|
|
61
|
-
</button>
|
|
62
|
-
if (isOn) {
|
|
51
|
+
>{'Toggle'}</button>
|
|
52
|
+
@if (isOn) {
|
|
63
53
|
<div class="on">{'ON'}</div>
|
|
64
|
-
} else {
|
|
54
|
+
} @else {
|
|
65
55
|
<div class="off">{'OFF'}</div>
|
|
66
56
|
}
|
|
67
|
-
|
|
57
|
+
</>
|
|
68
58
|
}
|
|
69
59
|
|
|
70
|
-
export function NestedIf() {
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
60
|
+
export function NestedIf() @{
|
|
61
|
+
let &[outer] = track(true);
|
|
62
|
+
let &[inner] = track(true);
|
|
63
|
+
<>
|
|
74
64
|
<button
|
|
75
65
|
class="outer-toggle"
|
|
76
66
|
onClick={() => {
|
|
77
67
|
outer = !outer;
|
|
78
68
|
}}
|
|
79
|
-
>
|
|
80
|
-
{'Outer'}
|
|
81
|
-
</button>
|
|
69
|
+
>{'Outer'}</button>
|
|
82
70
|
<button
|
|
83
71
|
class="inner-toggle"
|
|
84
72
|
onClick={() => {
|
|
85
73
|
inner = !inner;
|
|
86
74
|
}}
|
|
87
|
-
>
|
|
88
|
-
|
|
89
|
-
</button>
|
|
90
|
-
if (outer) {
|
|
75
|
+
>{'Inner'}</button>
|
|
76
|
+
@if (outer) {
|
|
91
77
|
<div class="outer-content">
|
|
92
78
|
{'Outer'}
|
|
93
|
-
if (inner) {
|
|
79
|
+
@if (inner) {
|
|
94
80
|
<span class="inner-content">{'Inner'}</span>
|
|
95
81
|
}
|
|
96
82
|
</div>
|
|
97
83
|
}
|
|
98
|
-
|
|
84
|
+
</>
|
|
99
85
|
}
|
|
100
86
|
|
|
101
|
-
export function IfElseIfChain() {
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
<
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
<div class="state">{'Loading...'}</div>
|
|
131
|
-
} else if (status === 'success') {
|
|
132
|
-
<div class="state">{'Success!'}</div>
|
|
133
|
-
} else {
|
|
134
|
-
<div class="state">{'Error occurred'}</div>
|
|
135
|
-
}
|
|
136
|
-
</div>
|
|
137
|
-
</>;
|
|
87
|
+
export function IfElseIfChain() @{
|
|
88
|
+
let &[status] = track<'loading' | 'success' | 'error'>('loading');
|
|
89
|
+
<div>
|
|
90
|
+
<button
|
|
91
|
+
class="success"
|
|
92
|
+
onClick={() => {
|
|
93
|
+
status = 'success';
|
|
94
|
+
}}
|
|
95
|
+
>{'Success'}</button>
|
|
96
|
+
<button
|
|
97
|
+
class="error"
|
|
98
|
+
onClick={() => {
|
|
99
|
+
status = 'error';
|
|
100
|
+
}}
|
|
101
|
+
>{'Error'}</button>
|
|
102
|
+
<button
|
|
103
|
+
class="loading"
|
|
104
|
+
onClick={() => {
|
|
105
|
+
status = 'loading';
|
|
106
|
+
}}
|
|
107
|
+
>{'Loading'}</button>
|
|
108
|
+
@if (status === 'loading') {
|
|
109
|
+
<div class="state">{'Loading...'}</div>
|
|
110
|
+
} @else if (status === 'success') {
|
|
111
|
+
<div class="state">{'Success!'}</div>
|
|
112
|
+
} @else {
|
|
113
|
+
<div class="state">{'Error occurred'}</div>
|
|
114
|
+
}
|
|
115
|
+
</div>
|
|
138
116
|
}
|