@excom/spa-route 0.1.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.
- package/.rush/temp/chunked-rush-logs/spa-route.apply-exports.chunks.jsonl +1 -0
- package/.rush/temp/chunked-rush-logs/spa-route.build_docs.chunks.jsonl +1 -0
- package/.rush/temp/chunked-rush-logs/spa-route.build_package-metas.chunks.jsonl +1 -0
- package/.rush/temp/operation/apply-exports/all.log +1 -0
- package/.rush/temp/operation/apply-exports/log-chunks.jsonl +1 -0
- package/.rush/temp/operation/apply-exports/state.json +3 -0
- package/.rush/temp/operation/build_docs/all.log +1 -0
- package/.rush/temp/operation/build_docs/log-chunks.jsonl +1 -0
- package/.rush/temp/operation/build_docs/state.json +3 -0
- package/.rush/temp/operation/build_package-metas/all.log +1 -0
- package/.rush/temp/operation/build_package-metas/log-chunks.jsonl +1 -0
- package/.rush/temp/operation/build_package-metas/state.json +3 -0
- package/.rush/temp/shrinkwrap-deps.json +3 -0
- package/config/rig.json +5 -0
- package/index.css +5 -0
- package/index.ts +29 -0
- package/package.json +48 -0
- package/rush-logs/spa-route.apply-exports.cache.log +1 -0
- package/rush-logs/spa-route.apply-exports.log +1 -0
- package/rush-logs/spa-route.build_docs.cache.log +1 -0
- package/rush-logs/spa-route.build_docs.log +1 -0
- package/rush-logs/spa-route.build_package-metas.cache.log +1 -0
- package/rush-logs/spa-route.build_package-metas.log +1 -0
- package/spa-a.ts +124 -0
- package/spa-manager.ts +605 -0
- package/spa-route.ts +322 -0
- package/src/spa-route.css +24 -0
- package/src/utils.ts +31 -0
- package/support/custom-elements.json +953 -0
- package/support/dist-docs/spa-a.md +40 -0
- package/support/dist-docs/spa-manager.md +66 -0
- package/support/dist-docs/spa-route.md +408 -0
- package/support/docs/README.md +314 -0
- package/support/package-meta.json +789 -0
- package/support/tests/spa-navigation.test.ts +1076 -0
- package/support/tests/spa-route.test.ts +766 -0
- package/support/tests/spa-title.test.ts +225 -0
- package/tsconfig.json +5 -0
|
@@ -0,0 +1,953 @@
|
|
|
1
|
+
{
|
|
2
|
+
"schemaVersion": "1.0.0",
|
|
3
|
+
"modules": [
|
|
4
|
+
{
|
|
5
|
+
"kind": "javascript-module",
|
|
6
|
+
"path": "spa-route.ts",
|
|
7
|
+
"declarations": [
|
|
8
|
+
{
|
|
9
|
+
"kind": "class",
|
|
10
|
+
"name": "SpaRoute",
|
|
11
|
+
"customElement": true,
|
|
12
|
+
"tagName": "spa-route",
|
|
13
|
+
"mixins": [
|
|
14
|
+
{
|
|
15
|
+
"name": "RenderableElement",
|
|
16
|
+
"package": "@excom/renderable-element"
|
|
17
|
+
},
|
|
18
|
+
{
|
|
19
|
+
"name": "RoutableElement",
|
|
20
|
+
"package": "@excom/routable-element"
|
|
21
|
+
}
|
|
22
|
+
],
|
|
23
|
+
"summary": "Declarative SPA screen — URL match → render.",
|
|
24
|
+
"description": "One screen of a single-page app. Matches `route-href` / `route-regex`, then renders its `<template>` while active and unrenders on the way out. Place inside `<spa-manager>` for view transitions and coordinated scroll.",
|
|
25
|
+
"attributes": [
|
|
26
|
+
{
|
|
27
|
+
"name": "same-route",
|
|
28
|
+
"type": {
|
|
29
|
+
"text": "string"
|
|
30
|
+
},
|
|
31
|
+
"description": "When this route matches while already active, `reuse` keeps the rendered tree and updates route data; `refresh` tears down and re-renders. Use `refresh` for param-driven screens (e.g. `/users/:id` → `/users/2`); `reuse` when only route data should change (e.g. `/logs/:view`). Pair with `scroll-set-disabled` to leave the viewport untouched.",
|
|
32
|
+
"fieldName": "sameRoute",
|
|
33
|
+
"default": "reuse",
|
|
34
|
+
"values": [
|
|
35
|
+
"reuse",
|
|
36
|
+
"refresh"
|
|
37
|
+
]
|
|
38
|
+
},
|
|
39
|
+
{
|
|
40
|
+
"name": "no-transition",
|
|
41
|
+
"type": {
|
|
42
|
+
"text": "boolean"
|
|
43
|
+
},
|
|
44
|
+
"description": "Opt this route out of the parent `<spa-manager>` View Transition. Still renders/unrenders — just without the cross-fade.",
|
|
45
|
+
"fieldName": "noTransition"
|
|
46
|
+
},
|
|
47
|
+
{
|
|
48
|
+
"name": "scroll-reset-behavior",
|
|
49
|
+
"type": {
|
|
50
|
+
"text": "string"
|
|
51
|
+
},
|
|
52
|
+
"description": "`window.scrollTo` behavior when this route applies a scroll reset / restore.",
|
|
53
|
+
"fieldName": "scrollResetBehavior",
|
|
54
|
+
"default": "instant",
|
|
55
|
+
"values": [
|
|
56
|
+
"auto",
|
|
57
|
+
"instant",
|
|
58
|
+
"smooth"
|
|
59
|
+
]
|
|
60
|
+
},
|
|
61
|
+
{
|
|
62
|
+
"name": "scroll-reset-x",
|
|
63
|
+
"type": {
|
|
64
|
+
"text": "tokenlist"
|
|
65
|
+
},
|
|
66
|
+
"description": "Navigation moves that reset scroll X to `0`. Moves omitted here restore the saved X for that history entry instead.",
|
|
67
|
+
"fieldName": "scrollResetX",
|
|
68
|
+
"default": "push replace",
|
|
69
|
+
"values": [
|
|
70
|
+
"push",
|
|
71
|
+
"replace",
|
|
72
|
+
"back",
|
|
73
|
+
"forward"
|
|
74
|
+
]
|
|
75
|
+
},
|
|
76
|
+
{
|
|
77
|
+
"name": "scroll-reset-y",
|
|
78
|
+
"type": {
|
|
79
|
+
"text": "tokenlist"
|
|
80
|
+
},
|
|
81
|
+
"description": "Navigation moves that reset scroll Y to `0`. Moves omitted here restore the saved Y for that history entry instead.",
|
|
82
|
+
"fieldName": "scrollResetY",
|
|
83
|
+
"default": "push replace",
|
|
84
|
+
"values": [
|
|
85
|
+
"push",
|
|
86
|
+
"replace",
|
|
87
|
+
"back",
|
|
88
|
+
"forward"
|
|
89
|
+
]
|
|
90
|
+
},
|
|
91
|
+
{
|
|
92
|
+
"name": "scroll-set-disabled",
|
|
93
|
+
"type": {
|
|
94
|
+
"text": "boolean"
|
|
95
|
+
},
|
|
96
|
+
"description": "Disable all scroll reset / restore for this route.",
|
|
97
|
+
"fieldName": "scrollSetDisabled"
|
|
98
|
+
},
|
|
99
|
+
{
|
|
100
|
+
"name": "is-fallback",
|
|
101
|
+
"type": {
|
|
102
|
+
"text": "boolean"
|
|
103
|
+
},
|
|
104
|
+
"description": "Only activate when this route matches *and* no earlier sibling `<spa-route>` is already active. Pair with a permissive `route-regex` (e.g. `.*`) for 404 catch-alls.",
|
|
105
|
+
"fieldName": "isFallback"
|
|
106
|
+
},
|
|
107
|
+
{
|
|
108
|
+
"name": "document-title",
|
|
109
|
+
"type": {
|
|
110
|
+
"text": "string"
|
|
111
|
+
},
|
|
112
|
+
"description": "`document.title` while this route is active. The outermost `<spa-manager>` applies the last active route carrying one — so a nested route beats its ancestor — and restores the page's own `<title>` once no active route has one. Cold loads and back / forward retitle too: it keys off activation, not clicks.",
|
|
113
|
+
"fieldName": "documentTitle"
|
|
114
|
+
},
|
|
115
|
+
{
|
|
116
|
+
"name": "was-active",
|
|
117
|
+
"type": {
|
|
118
|
+
"text": "boolean"
|
|
119
|
+
},
|
|
120
|
+
"description": "Set briefly while navigating away. Style outgoing screens / card-expansion exits with `spa-route[was-active]`.",
|
|
121
|
+
"fieldName": "wasActive"
|
|
122
|
+
}
|
|
123
|
+
],
|
|
124
|
+
"members": [
|
|
125
|
+
{
|
|
126
|
+
"kind": "field",
|
|
127
|
+
"name": "sameRoute",
|
|
128
|
+
"type": {
|
|
129
|
+
"text": "string"
|
|
130
|
+
},
|
|
131
|
+
"privacy": "public",
|
|
132
|
+
"readonly": false,
|
|
133
|
+
"description": "When this route matches while already active, `reuse` keeps the rendered tree and updates route data; `refresh` tears down and re-renders. Use `refresh` for param-driven screens (e.g. `/users/:id` → `/users/2`); `reuse` when only route data should change (e.g. `/logs/:view`). Pair with `scroll-set-disabled` to leave the viewport untouched.",
|
|
134
|
+
"default": "reuse",
|
|
135
|
+
"_neutron": {
|
|
136
|
+
"surface": "option"
|
|
137
|
+
}
|
|
138
|
+
},
|
|
139
|
+
{
|
|
140
|
+
"kind": "field",
|
|
141
|
+
"name": "noTransition",
|
|
142
|
+
"type": {
|
|
143
|
+
"text": "boolean"
|
|
144
|
+
},
|
|
145
|
+
"privacy": "public",
|
|
146
|
+
"readonly": false,
|
|
147
|
+
"description": "Opt this route out of the parent `<spa-manager>` View Transition. Still renders/unrenders — just without the cross-fade.",
|
|
148
|
+
"_neutron": {
|
|
149
|
+
"surface": "option"
|
|
150
|
+
}
|
|
151
|
+
},
|
|
152
|
+
{
|
|
153
|
+
"kind": "field",
|
|
154
|
+
"name": "scrollResetBehavior",
|
|
155
|
+
"type": {
|
|
156
|
+
"text": "string"
|
|
157
|
+
},
|
|
158
|
+
"privacy": "public",
|
|
159
|
+
"readonly": false,
|
|
160
|
+
"description": "`window.scrollTo` behavior when this route applies a scroll reset / restore.",
|
|
161
|
+
"default": "instant",
|
|
162
|
+
"_neutron": {
|
|
163
|
+
"surface": "option"
|
|
164
|
+
}
|
|
165
|
+
},
|
|
166
|
+
{
|
|
167
|
+
"kind": "field",
|
|
168
|
+
"name": "scrollResetX",
|
|
169
|
+
"type": {
|
|
170
|
+
"text": "tokenlist"
|
|
171
|
+
},
|
|
172
|
+
"privacy": "public",
|
|
173
|
+
"readonly": false,
|
|
174
|
+
"description": "Navigation moves that reset scroll X to `0`. Moves omitted here restore the saved X for that history entry instead.",
|
|
175
|
+
"default": "push replace",
|
|
176
|
+
"_neutron": {
|
|
177
|
+
"surface": "option"
|
|
178
|
+
}
|
|
179
|
+
},
|
|
180
|
+
{
|
|
181
|
+
"kind": "field",
|
|
182
|
+
"name": "scrollResetY",
|
|
183
|
+
"type": {
|
|
184
|
+
"text": "tokenlist"
|
|
185
|
+
},
|
|
186
|
+
"privacy": "public",
|
|
187
|
+
"readonly": false,
|
|
188
|
+
"description": "Navigation moves that reset scroll Y to `0`. Moves omitted here restore the saved Y for that history entry instead.",
|
|
189
|
+
"default": "push replace",
|
|
190
|
+
"_neutron": {
|
|
191
|
+
"surface": "option"
|
|
192
|
+
}
|
|
193
|
+
},
|
|
194
|
+
{
|
|
195
|
+
"kind": "field",
|
|
196
|
+
"name": "scrollSetDisabled",
|
|
197
|
+
"type": {
|
|
198
|
+
"text": "boolean"
|
|
199
|
+
},
|
|
200
|
+
"privacy": "public",
|
|
201
|
+
"readonly": false,
|
|
202
|
+
"description": "Disable all scroll reset / restore for this route.",
|
|
203
|
+
"_neutron": {
|
|
204
|
+
"surface": "option"
|
|
205
|
+
}
|
|
206
|
+
},
|
|
207
|
+
{
|
|
208
|
+
"kind": "field",
|
|
209
|
+
"name": "isFallback",
|
|
210
|
+
"type": {
|
|
211
|
+
"text": "boolean"
|
|
212
|
+
},
|
|
213
|
+
"privacy": "public",
|
|
214
|
+
"readonly": false,
|
|
215
|
+
"description": "Only activate when this route matches *and* no earlier sibling `<spa-route>` is already active. Pair with a permissive `route-regex` (e.g. `.*`) for 404 catch-alls.",
|
|
216
|
+
"_neutron": {
|
|
217
|
+
"surface": "option"
|
|
218
|
+
}
|
|
219
|
+
},
|
|
220
|
+
{
|
|
221
|
+
"kind": "field",
|
|
222
|
+
"name": "documentTitle",
|
|
223
|
+
"type": {
|
|
224
|
+
"text": "string"
|
|
225
|
+
},
|
|
226
|
+
"privacy": "public",
|
|
227
|
+
"readonly": false,
|
|
228
|
+
"description": "`document.title` while this route is active. The outermost `<spa-manager>` applies the last active route carrying one — so a nested route beats its ancestor — and restores the page's own `<title>` once no active route has one. Cold loads and back / forward retitle too: it keys off activation, not clicks.",
|
|
229
|
+
"_neutron": {
|
|
230
|
+
"surface": "option"
|
|
231
|
+
}
|
|
232
|
+
},
|
|
233
|
+
{
|
|
234
|
+
"kind": "field",
|
|
235
|
+
"name": "wasActive",
|
|
236
|
+
"type": {
|
|
237
|
+
"text": "boolean"
|
|
238
|
+
},
|
|
239
|
+
"privacy": "public",
|
|
240
|
+
"readonly": true,
|
|
241
|
+
"description": "Set briefly while navigating away. Style outgoing screens / card-expansion exits with `spa-route[was-active]`.",
|
|
242
|
+
"_neutron": {
|
|
243
|
+
"surface": "state"
|
|
244
|
+
}
|
|
245
|
+
},
|
|
246
|
+
{
|
|
247
|
+
"kind": "field",
|
|
248
|
+
"name": "provision",
|
|
249
|
+
"type": {
|
|
250
|
+
"text": "SpaRouteProvision",
|
|
251
|
+
"expanded": "{ routeHref: string; matchNested: boolean; scrollResetY: string[]; scrollResetX: string[]; scrollResetBehavior: ScrollBehavior; noTransition: boolean; active: { id: string; url: string; title?: string; isInit?: boolean; scrollX?: number; scrollY?: number; ttypes?: string[]; }; event: { hasUAVisualTransition: boolean; }; match: Array<any> | null; move: null | \"push\" | \"replace\" | \"back\" | \"forward\"; next: { id: string; url: string; title?: string; isInit?: boolean; scrollX?: number; scrollY?: number; ttypes?: string[]; } | null; previous: { id: string; url: string; title?: string; isInit?: boolean; scrollX?: number; scrollY?: number; ttypes?: string[]; } | null; params: Record<string, string> | null; }"
|
|
252
|
+
},
|
|
253
|
+
"privacy": "public",
|
|
254
|
+
"readonly": false,
|
|
255
|
+
"description": "Active route payload for this activation (`null` when inactive). Not reflected as an attribute.",
|
|
256
|
+
"_neutron": {
|
|
257
|
+
"surface": "option"
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
],
|
|
261
|
+
"events": [
|
|
262
|
+
{
|
|
263
|
+
"name": "spa-route-provision",
|
|
264
|
+
"description": "Cancelable. Same route stayed active but params changed (`same-route=\"reuse\"`). `event.detail` is a thunk that updates route data and resolves the ready promise. `<spa-manager>` batches this into the View Transition like render/unrender.",
|
|
265
|
+
"type": {
|
|
266
|
+
"text": "SpaRouteProvisionEvent",
|
|
267
|
+
"expanded": "CustomEvent & { type: \"spa-route-provision\"; detail: () => void; bubbles: true; cancelable: true; composed: true }"
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
],
|
|
271
|
+
"_neutron": {
|
|
272
|
+
"provisions": [
|
|
273
|
+
{
|
|
274
|
+
"name": "provision",
|
|
275
|
+
"type": {
|
|
276
|
+
"text": "SpaRouteProvision",
|
|
277
|
+
"expanded": "{ routeHref: string; matchNested: boolean; scrollResetY: string[]; scrollResetX: string[]; scrollResetBehavior: ScrollBehavior; noTransition: boolean; active: { id: string; url: string; title?: string; isInit?: boolean; scrollX?: number; scrollY?: number; ttypes?: string[]; }; event: { hasUAVisualTransition: boolean; }; match: Array<any> | null; move: null | \"push\" | \"replace\" | \"back\" | \"forward\"; next: { id: string; url: string; title?: string; isInit?: boolean; scrollX?: number; scrollY?: number; ttypes?: string[]; } | null; previous: { id: string; url: string; title?: string; isInit?: boolean; scrollX?: number; scrollY?: number; ttypes?: string[]; } | null; params: Record<string, string> | null; }"
|
|
278
|
+
},
|
|
279
|
+
"description": "Active route payload for this activation (`null` when inactive). Not reflected as an attribute.",
|
|
280
|
+
"fieldName": "provision"
|
|
281
|
+
}
|
|
282
|
+
],
|
|
283
|
+
"defaultActions": [
|
|
284
|
+
{
|
|
285
|
+
"name": "spa-route-provision",
|
|
286
|
+
"description": "Invokes `event.detail()` to apply the new provision."
|
|
287
|
+
}
|
|
288
|
+
],
|
|
289
|
+
"expectedChildren": [
|
|
290
|
+
{
|
|
291
|
+
"relationship": "child",
|
|
292
|
+
"selector": "template",
|
|
293
|
+
"required": true,
|
|
294
|
+
"description": "Screen content. Cloned (or reused with `persist-content`) on activation."
|
|
295
|
+
}
|
|
296
|
+
],
|
|
297
|
+
"cssAliases": [
|
|
298
|
+
{
|
|
299
|
+
"name": ":--spa-route",
|
|
300
|
+
"selectors": [
|
|
301
|
+
"spa-route",
|
|
302
|
+
".tag-spa-route"
|
|
303
|
+
],
|
|
304
|
+
"kind": "element"
|
|
305
|
+
}
|
|
306
|
+
]
|
|
307
|
+
}
|
|
308
|
+
}
|
|
309
|
+
],
|
|
310
|
+
"exports": [
|
|
311
|
+
{
|
|
312
|
+
"kind": "js",
|
|
313
|
+
"name": "SpaRoute",
|
|
314
|
+
"declaration": {
|
|
315
|
+
"name": "SpaRoute",
|
|
316
|
+
"module": "spa-route.ts"
|
|
317
|
+
}
|
|
318
|
+
},
|
|
319
|
+
{
|
|
320
|
+
"kind": "custom-element-definition",
|
|
321
|
+
"name": "spa-route",
|
|
322
|
+
"declaration": {
|
|
323
|
+
"name": "SpaRoute",
|
|
324
|
+
"module": "spa-route.ts"
|
|
325
|
+
}
|
|
326
|
+
}
|
|
327
|
+
]
|
|
328
|
+
},
|
|
329
|
+
{
|
|
330
|
+
"kind": "javascript-module",
|
|
331
|
+
"path": "spa-a.ts",
|
|
332
|
+
"declarations": [
|
|
333
|
+
{
|
|
334
|
+
"kind": "class",
|
|
335
|
+
"name": "SpaA",
|
|
336
|
+
"customElement": true,
|
|
337
|
+
"tagName": "spa-a",
|
|
338
|
+
"mixins": [
|
|
339
|
+
{
|
|
340
|
+
"name": "ListenableElement",
|
|
341
|
+
"package": "@excom/listenable-element"
|
|
342
|
+
},
|
|
343
|
+
{
|
|
344
|
+
"name": "RoutableElement",
|
|
345
|
+
"package": "@excom/routable-element"
|
|
346
|
+
}
|
|
347
|
+
],
|
|
348
|
+
"summary": "Declarative SPA link with active-state styling.",
|
|
349
|
+
"description": "SPA link — navigates without a full page reload. Set `route-href` to the destination; `is-active` / `was-active` reflect match state for CSS (nav highlighting, card-expansion exits, etc.).",
|
|
350
|
+
"attributes": [
|
|
351
|
+
{
|
|
352
|
+
"name": "route-action",
|
|
353
|
+
"type": {
|
|
354
|
+
"text": "string"
|
|
355
|
+
},
|
|
356
|
+
"description": "Navigation mode when activated (default click).",
|
|
357
|
+
"fieldName": "routeAction",
|
|
358
|
+
"default": "push",
|
|
359
|
+
"values": [
|
|
360
|
+
"push",
|
|
361
|
+
"replace",
|
|
362
|
+
"back",
|
|
363
|
+
"forward"
|
|
364
|
+
]
|
|
365
|
+
},
|
|
366
|
+
{
|
|
367
|
+
"name": "document-title",
|
|
368
|
+
"type": {
|
|
369
|
+
"text": "string"
|
|
370
|
+
},
|
|
371
|
+
"description": "Sets `document.title` after navigation.",
|
|
372
|
+
"fieldName": "documentTitle"
|
|
373
|
+
},
|
|
374
|
+
{
|
|
375
|
+
"name": "transition-types",
|
|
376
|
+
"type": {
|
|
377
|
+
"text": "tokenlist"
|
|
378
|
+
},
|
|
379
|
+
"description": "Space-separated View Transition types for this navigation (CSS View Transitions API). Useful for shared-element morphs like card expansion.",
|
|
380
|
+
"fieldName": "transitionTypes",
|
|
381
|
+
"values": [
|
|
382
|
+
"<token>…"
|
|
383
|
+
]
|
|
384
|
+
},
|
|
385
|
+
{
|
|
386
|
+
"name": "match-hash",
|
|
387
|
+
"type": {
|
|
388
|
+
"text": "boolean"
|
|
389
|
+
},
|
|
390
|
+
"description": "Require the URL hash to match when setting `is-active`.",
|
|
391
|
+
"fieldName": "matchHash"
|
|
392
|
+
},
|
|
393
|
+
{
|
|
394
|
+
"name": "is-active",
|
|
395
|
+
"type": {
|
|
396
|
+
"text": "boolean"
|
|
397
|
+
},
|
|
398
|
+
"description": "Current URL matches `route-href`. Style with `spa-a[is-active]`.",
|
|
399
|
+
"fieldName": "isActive"
|
|
400
|
+
},
|
|
401
|
+
{
|
|
402
|
+
"name": "was-active",
|
|
403
|
+
"type": {
|
|
404
|
+
"text": "boolean"
|
|
405
|
+
},
|
|
406
|
+
"description": "Previous URL matched `route-href`. Style outgoing links / card-expansion exits with `spa-a[was-active]`.",
|
|
407
|
+
"fieldName": "wasActive"
|
|
408
|
+
}
|
|
409
|
+
],
|
|
410
|
+
"members": [
|
|
411
|
+
{
|
|
412
|
+
"kind": "field",
|
|
413
|
+
"name": "routeAction",
|
|
414
|
+
"type": {
|
|
415
|
+
"text": "string"
|
|
416
|
+
},
|
|
417
|
+
"privacy": "public",
|
|
418
|
+
"readonly": false,
|
|
419
|
+
"description": "Navigation mode when activated (default click).",
|
|
420
|
+
"default": "push",
|
|
421
|
+
"_neutron": {
|
|
422
|
+
"surface": "option"
|
|
423
|
+
}
|
|
424
|
+
},
|
|
425
|
+
{
|
|
426
|
+
"kind": "field",
|
|
427
|
+
"name": "documentTitle",
|
|
428
|
+
"type": {
|
|
429
|
+
"text": "string"
|
|
430
|
+
},
|
|
431
|
+
"privacy": "public",
|
|
432
|
+
"readonly": false,
|
|
433
|
+
"description": "Sets `document.title` after navigation.",
|
|
434
|
+
"_neutron": {
|
|
435
|
+
"surface": "option"
|
|
436
|
+
}
|
|
437
|
+
},
|
|
438
|
+
{
|
|
439
|
+
"kind": "field",
|
|
440
|
+
"name": "transitionTypes",
|
|
441
|
+
"type": {
|
|
442
|
+
"text": "tokenlist"
|
|
443
|
+
},
|
|
444
|
+
"privacy": "public",
|
|
445
|
+
"readonly": false,
|
|
446
|
+
"description": "Space-separated View Transition types for this navigation (CSS View Transitions API). Useful for shared-element morphs like card expansion.",
|
|
447
|
+
"_neutron": {
|
|
448
|
+
"surface": "option"
|
|
449
|
+
}
|
|
450
|
+
},
|
|
451
|
+
{
|
|
452
|
+
"kind": "field",
|
|
453
|
+
"name": "matchHash",
|
|
454
|
+
"type": {
|
|
455
|
+
"text": "boolean"
|
|
456
|
+
},
|
|
457
|
+
"privacy": "public",
|
|
458
|
+
"readonly": false,
|
|
459
|
+
"description": "Require the URL hash to match when setting `is-active`.",
|
|
460
|
+
"_neutron": {
|
|
461
|
+
"surface": "option"
|
|
462
|
+
}
|
|
463
|
+
},
|
|
464
|
+
{
|
|
465
|
+
"kind": "field",
|
|
466
|
+
"name": "isActive",
|
|
467
|
+
"type": {
|
|
468
|
+
"text": "boolean"
|
|
469
|
+
},
|
|
470
|
+
"privacy": "public",
|
|
471
|
+
"readonly": true,
|
|
472
|
+
"description": "Current URL matches `route-href`. Style with `spa-a[is-active]`.",
|
|
473
|
+
"_neutron": {
|
|
474
|
+
"surface": "state"
|
|
475
|
+
}
|
|
476
|
+
},
|
|
477
|
+
{
|
|
478
|
+
"kind": "field",
|
|
479
|
+
"name": "wasActive",
|
|
480
|
+
"type": {
|
|
481
|
+
"text": "boolean"
|
|
482
|
+
},
|
|
483
|
+
"privacy": "public",
|
|
484
|
+
"readonly": true,
|
|
485
|
+
"description": "Previous URL matched `route-href`. Style outgoing links / card-expansion exits with `spa-a[was-active]`.",
|
|
486
|
+
"_neutron": {
|
|
487
|
+
"surface": "state"
|
|
488
|
+
}
|
|
489
|
+
}
|
|
490
|
+
],
|
|
491
|
+
"_neutron": {
|
|
492
|
+
"cssAliases": [
|
|
493
|
+
{
|
|
494
|
+
"name": ":--spa-a",
|
|
495
|
+
"selectors": [
|
|
496
|
+
"spa-a",
|
|
497
|
+
".tag-spa-a"
|
|
498
|
+
],
|
|
499
|
+
"kind": "element"
|
|
500
|
+
}
|
|
501
|
+
]
|
|
502
|
+
}
|
|
503
|
+
}
|
|
504
|
+
],
|
|
505
|
+
"exports": [
|
|
506
|
+
{
|
|
507
|
+
"kind": "js",
|
|
508
|
+
"name": "SpaA",
|
|
509
|
+
"declaration": {
|
|
510
|
+
"name": "SpaA",
|
|
511
|
+
"module": "spa-a.ts"
|
|
512
|
+
}
|
|
513
|
+
},
|
|
514
|
+
{
|
|
515
|
+
"kind": "custom-element-definition",
|
|
516
|
+
"name": "spa-a",
|
|
517
|
+
"declaration": {
|
|
518
|
+
"name": "SpaA",
|
|
519
|
+
"module": "spa-a.ts"
|
|
520
|
+
}
|
|
521
|
+
}
|
|
522
|
+
]
|
|
523
|
+
},
|
|
524
|
+
{
|
|
525
|
+
"kind": "javascript-module",
|
|
526
|
+
"path": "spa-manager.ts",
|
|
527
|
+
"declarations": [
|
|
528
|
+
{
|
|
529
|
+
"kind": "class",
|
|
530
|
+
"name": "SpaManager",
|
|
531
|
+
"customElement": true,
|
|
532
|
+
"tagName": "spa-manager",
|
|
533
|
+
"mixins": [
|
|
534
|
+
{
|
|
535
|
+
"name": "RoutableElement",
|
|
536
|
+
"package": "@excom/routable-element"
|
|
537
|
+
}
|
|
538
|
+
],
|
|
539
|
+
"summary": "SPA shell — view transitions, swipe nav, route orchestration.",
|
|
540
|
+
"description": "Coordinates sibling `<spa-route>` children: batches their render / unrender into one View Transition per navigation, re-emits nav lifecycle events, and optionally handles touch edge-swipe back / forward.",
|
|
541
|
+
"attributes": [
|
|
542
|
+
{
|
|
543
|
+
"name": "transition-first-render",
|
|
544
|
+
"type": {
|
|
545
|
+
"text": "boolean"
|
|
546
|
+
},
|
|
547
|
+
"description": "Animate the very first activation (cold load) with a View Transition. Off by default so the initial paint is instant.",
|
|
548
|
+
"fieldName": "transitionFirstRender"
|
|
549
|
+
},
|
|
550
|
+
{
|
|
551
|
+
"name": "transition-delay",
|
|
552
|
+
"type": {
|
|
553
|
+
"text": "number"
|
|
554
|
+
},
|
|
555
|
+
"description": "Delay (ms) before starting the batched View Transition. Gives late sibling render/unrender events time to queue, or room for last-second DOM work. Unset / `null` starts synchronously.",
|
|
556
|
+
"fieldName": "transitionDelay"
|
|
557
|
+
},
|
|
558
|
+
{
|
|
559
|
+
"name": "no-transition",
|
|
560
|
+
"type": {
|
|
561
|
+
"text": "boolean"
|
|
562
|
+
},
|
|
563
|
+
"description": "Disable View Transitions for every child route.",
|
|
564
|
+
"fieldName": "noTransition"
|
|
565
|
+
},
|
|
566
|
+
{
|
|
567
|
+
"name": "render-timeout",
|
|
568
|
+
"type": {
|
|
569
|
+
"text": "number"
|
|
570
|
+
},
|
|
571
|
+
"description": "Max wait (ms) for child render promises before forcing the transition to resolve. Raise for slow remote templates.",
|
|
572
|
+
"fieldName": "renderTimeout",
|
|
573
|
+
"default": 2000
|
|
574
|
+
},
|
|
575
|
+
{
|
|
576
|
+
"name": "overscroll-behavior-x",
|
|
577
|
+
"type": {
|
|
578
|
+
"text": "string"
|
|
579
|
+
},
|
|
580
|
+
"description": "Touch edge-swipe on touch devices. `none` blocks horizontal overscroll; `navigate` also calls back / forward past the threshold.",
|
|
581
|
+
"fieldName": "overscrollBehaviorX",
|
|
582
|
+
"values": [
|
|
583
|
+
"none",
|
|
584
|
+
"navigate"
|
|
585
|
+
]
|
|
586
|
+
},
|
|
587
|
+
{
|
|
588
|
+
"name": "overscroll-x-threshold",
|
|
589
|
+
"type": {
|
|
590
|
+
"text": "number"
|
|
591
|
+
},
|
|
592
|
+
"description": "Edge inset (px) where a touch start counts as an edge swipe.",
|
|
593
|
+
"fieldName": "overscrollXThreshold",
|
|
594
|
+
"default": 40
|
|
595
|
+
},
|
|
596
|
+
{
|
|
597
|
+
"name": "max-states",
|
|
598
|
+
"type": {
|
|
599
|
+
"text": "number"
|
|
600
|
+
},
|
|
601
|
+
"description": "Cap retained router history states (scroll positions, transition types, etc.).",
|
|
602
|
+
"fieldName": "maxStates"
|
|
603
|
+
},
|
|
604
|
+
{
|
|
605
|
+
"name": "last-move",
|
|
606
|
+
"type": {
|
|
607
|
+
"text": "string"
|
|
608
|
+
},
|
|
609
|
+
"description": "Last navigation direction (`push` / `replace` / `back` / `forward`). Pick CSS transition styles from this.",
|
|
610
|
+
"fieldName": "lastMove",
|
|
611
|
+
"values": [
|
|
612
|
+
"push",
|
|
613
|
+
"replace",
|
|
614
|
+
"back",
|
|
615
|
+
"forward"
|
|
616
|
+
]
|
|
617
|
+
},
|
|
618
|
+
{
|
|
619
|
+
"name": "active-url",
|
|
620
|
+
"type": {
|
|
621
|
+
"text": "string"
|
|
622
|
+
},
|
|
623
|
+
"description": "URL of the currently active route.",
|
|
624
|
+
"fieldName": "activeUrl"
|
|
625
|
+
},
|
|
626
|
+
{
|
|
627
|
+
"name": "is-transitioning",
|
|
628
|
+
"type": {
|
|
629
|
+
"text": "boolean"
|
|
630
|
+
},
|
|
631
|
+
"description": "A View Transition is in flight.",
|
|
632
|
+
"fieldName": "isTransitioning"
|
|
633
|
+
},
|
|
634
|
+
{
|
|
635
|
+
"name": "has-rendered",
|
|
636
|
+
"type": {
|
|
637
|
+
"text": "boolean"
|
|
638
|
+
},
|
|
639
|
+
"description": "At least one render has committed. Gates `transition-first-render`; useful for hiding loading shells.",
|
|
640
|
+
"fieldName": "hasRendered"
|
|
641
|
+
}
|
|
642
|
+
],
|
|
643
|
+
"members": [
|
|
644
|
+
{
|
|
645
|
+
"kind": "field",
|
|
646
|
+
"name": "transitionFirstRender",
|
|
647
|
+
"type": {
|
|
648
|
+
"text": "boolean"
|
|
649
|
+
},
|
|
650
|
+
"privacy": "public",
|
|
651
|
+
"readonly": false,
|
|
652
|
+
"description": "Animate the very first activation (cold load) with a View Transition. Off by default so the initial paint is instant.",
|
|
653
|
+
"_neutron": {
|
|
654
|
+
"surface": "option"
|
|
655
|
+
}
|
|
656
|
+
},
|
|
657
|
+
{
|
|
658
|
+
"kind": "field",
|
|
659
|
+
"name": "transitionDelay",
|
|
660
|
+
"type": {
|
|
661
|
+
"text": "number"
|
|
662
|
+
},
|
|
663
|
+
"privacy": "public",
|
|
664
|
+
"readonly": false,
|
|
665
|
+
"description": "Delay (ms) before starting the batched View Transition. Gives late sibling render/unrender events time to queue, or room for last-second DOM work. Unset / `null` starts synchronously.",
|
|
666
|
+
"_neutron": {
|
|
667
|
+
"surface": "option"
|
|
668
|
+
}
|
|
669
|
+
},
|
|
670
|
+
{
|
|
671
|
+
"kind": "field",
|
|
672
|
+
"name": "noTransition",
|
|
673
|
+
"type": {
|
|
674
|
+
"text": "boolean"
|
|
675
|
+
},
|
|
676
|
+
"privacy": "public",
|
|
677
|
+
"readonly": false,
|
|
678
|
+
"description": "Disable View Transitions for every child route.",
|
|
679
|
+
"_neutron": {
|
|
680
|
+
"surface": "option"
|
|
681
|
+
}
|
|
682
|
+
},
|
|
683
|
+
{
|
|
684
|
+
"kind": "field",
|
|
685
|
+
"name": "renderTimeout",
|
|
686
|
+
"type": {
|
|
687
|
+
"text": "number"
|
|
688
|
+
},
|
|
689
|
+
"privacy": "public",
|
|
690
|
+
"readonly": false,
|
|
691
|
+
"description": "Max wait (ms) for child render promises before forcing the transition to resolve. Raise for slow remote templates.",
|
|
692
|
+
"default": 2000,
|
|
693
|
+
"_neutron": {
|
|
694
|
+
"surface": "option"
|
|
695
|
+
}
|
|
696
|
+
},
|
|
697
|
+
{
|
|
698
|
+
"kind": "field",
|
|
699
|
+
"name": "overscrollBehaviorX",
|
|
700
|
+
"type": {
|
|
701
|
+
"text": "string"
|
|
702
|
+
},
|
|
703
|
+
"privacy": "public",
|
|
704
|
+
"readonly": false,
|
|
705
|
+
"description": "Touch edge-swipe on touch devices. `none` blocks horizontal overscroll; `navigate` also calls back / forward past the threshold.",
|
|
706
|
+
"_neutron": {
|
|
707
|
+
"surface": "option"
|
|
708
|
+
}
|
|
709
|
+
},
|
|
710
|
+
{
|
|
711
|
+
"kind": "field",
|
|
712
|
+
"name": "overscrollXThreshold",
|
|
713
|
+
"type": {
|
|
714
|
+
"text": "number"
|
|
715
|
+
},
|
|
716
|
+
"privacy": "public",
|
|
717
|
+
"readonly": false,
|
|
718
|
+
"description": "Edge inset (px) where a touch start counts as an edge swipe.",
|
|
719
|
+
"default": 40,
|
|
720
|
+
"_neutron": {
|
|
721
|
+
"surface": "option"
|
|
722
|
+
}
|
|
723
|
+
},
|
|
724
|
+
{
|
|
725
|
+
"kind": "field",
|
|
726
|
+
"name": "maxStates",
|
|
727
|
+
"type": {
|
|
728
|
+
"text": "number"
|
|
729
|
+
},
|
|
730
|
+
"privacy": "public",
|
|
731
|
+
"readonly": false,
|
|
732
|
+
"description": "Cap retained router history states (scroll positions, transition types, etc.).",
|
|
733
|
+
"_neutron": {
|
|
734
|
+
"surface": "option"
|
|
735
|
+
}
|
|
736
|
+
},
|
|
737
|
+
{
|
|
738
|
+
"kind": "field",
|
|
739
|
+
"name": "lastMove",
|
|
740
|
+
"type": {
|
|
741
|
+
"text": "string"
|
|
742
|
+
},
|
|
743
|
+
"privacy": "public",
|
|
744
|
+
"readonly": true,
|
|
745
|
+
"description": "Last navigation direction (`push` / `replace` / `back` / `forward`). Pick CSS transition styles from this.",
|
|
746
|
+
"_neutron": {
|
|
747
|
+
"surface": "state"
|
|
748
|
+
}
|
|
749
|
+
},
|
|
750
|
+
{
|
|
751
|
+
"kind": "field",
|
|
752
|
+
"name": "activeUrl",
|
|
753
|
+
"type": {
|
|
754
|
+
"text": "string"
|
|
755
|
+
},
|
|
756
|
+
"privacy": "public",
|
|
757
|
+
"readonly": true,
|
|
758
|
+
"description": "URL of the currently active route.",
|
|
759
|
+
"_neutron": {
|
|
760
|
+
"surface": "state"
|
|
761
|
+
}
|
|
762
|
+
},
|
|
763
|
+
{
|
|
764
|
+
"kind": "field",
|
|
765
|
+
"name": "isTransitioning",
|
|
766
|
+
"type": {
|
|
767
|
+
"text": "boolean"
|
|
768
|
+
},
|
|
769
|
+
"privacy": "public",
|
|
770
|
+
"readonly": true,
|
|
771
|
+
"description": "A View Transition is in flight.",
|
|
772
|
+
"_neutron": {
|
|
773
|
+
"surface": "state"
|
|
774
|
+
}
|
|
775
|
+
},
|
|
776
|
+
{
|
|
777
|
+
"kind": "field",
|
|
778
|
+
"name": "hasRendered",
|
|
779
|
+
"type": {
|
|
780
|
+
"text": "boolean"
|
|
781
|
+
},
|
|
782
|
+
"privacy": "public",
|
|
783
|
+
"readonly": true,
|
|
784
|
+
"description": "At least one render has committed. Gates `transition-first-render`; useful for hiding loading shells.",
|
|
785
|
+
"_neutron": {
|
|
786
|
+
"surface": "state"
|
|
787
|
+
}
|
|
788
|
+
},
|
|
789
|
+
{
|
|
790
|
+
"kind": "field",
|
|
791
|
+
"name": "provision",
|
|
792
|
+
"type": {
|
|
793
|
+
"text": "KitRouteData",
|
|
794
|
+
"expanded": "{ previous: { id: string; url: string; title?: string; isInit?: boolean; scrollX?: number; scrollY?: number; ttypes?: string[]; } | null; active: { id: string; url: string; title?: string; isInit?: boolean; scrollX?: number; scrollY?: number; ttypes?: string[]; }; next: { id: string; url: string; title?: string; isInit?: boolean; scrollX?: number; scrollY?: number; ttypes?: string[]; } | null; all: { id: string; url: string; title?: string; isInit?: boolean; scrollX?: number; scrollY?: number; ttypes?: string[]; }[]; params: Record<string, string> | null; match: Array<any> | null; move: null | \"push\" | \"replace\" | \"back\" | \"forward\"; event?: { hasUAVisualTransition: boolean; }; route: KitRoute; }"
|
|
795
|
+
},
|
|
796
|
+
"privacy": "public",
|
|
797
|
+
"readonly": false,
|
|
798
|
+
"description": "Current route payload. Not reflected as an attribute.",
|
|
799
|
+
"_neutron": {
|
|
800
|
+
"surface": "option"
|
|
801
|
+
}
|
|
802
|
+
}
|
|
803
|
+
],
|
|
804
|
+
"events": [
|
|
805
|
+
{
|
|
806
|
+
"name": "spa-manager-will-transition",
|
|
807
|
+
"description": "Cancelable. Once per navigation, just before the View Transition starts. `preventDefault()` skips the transition for this navigation.",
|
|
808
|
+
"type": {
|
|
809
|
+
"text": "SpaManagerWillTransitionEvent",
|
|
810
|
+
"expanded": "CustomEvent & { type: \"spa-manager-will-transition\"; detail: void; bubbles: true; cancelable: true; composed: true }"
|
|
811
|
+
}
|
|
812
|
+
},
|
|
813
|
+
{
|
|
814
|
+
"name": "spa-manager-transition",
|
|
815
|
+
"description": "After `document.startViewTransition()` is called.",
|
|
816
|
+
"type": {
|
|
817
|
+
"text": "SpaManagerTransitionEvent",
|
|
818
|
+
"expanded": "CustomEvent & { type: \"spa-manager-transition\"; detail: { transition: ViewTransition; }; bubbles: true; cancelable: true; composed: true }"
|
|
819
|
+
}
|
|
820
|
+
},
|
|
821
|
+
{
|
|
822
|
+
"name": "spa-manager-rendered",
|
|
823
|
+
"description": "After the transition (or synchronous fallback) finishes and routes are settled.",
|
|
824
|
+
"type": {
|
|
825
|
+
"text": "SpaManagerRenderedEvent",
|
|
826
|
+
"expanded": "CustomEvent & { type: \"spa-manager-rendered\"; detail: void; bubbles: true; cancelable: true; composed: true }"
|
|
827
|
+
}
|
|
828
|
+
},
|
|
829
|
+
{
|
|
830
|
+
"name": "spa-manager-error",
|
|
831
|
+
"description": "Re-emitted when a child fires `spa-route-error`. `event.detail` mirrors the source error.",
|
|
832
|
+
"type": {
|
|
833
|
+
"text": "SpaManagerErrorEvent",
|
|
834
|
+
"expanded": "CustomEvent & { type: \"spa-manager-error\"; detail: unknown; bubbles: true; cancelable: true; composed: true }"
|
|
835
|
+
}
|
|
836
|
+
},
|
|
837
|
+
{
|
|
838
|
+
"name": "spa-manager-push",
|
|
839
|
+
"description": "On `pushState` navigations.",
|
|
840
|
+
"type": {
|
|
841
|
+
"text": "SpaManagerPushEvent",
|
|
842
|
+
"expanded": "CustomEvent & { type: \"spa-manager-push\"; detail: void; bubbles: true; cancelable: true; composed: true }"
|
|
843
|
+
}
|
|
844
|
+
},
|
|
845
|
+
{
|
|
846
|
+
"name": "spa-manager-replace",
|
|
847
|
+
"description": "On `replaceState` navigations.",
|
|
848
|
+
"type": {
|
|
849
|
+
"text": "SpaManagerReplaceEvent",
|
|
850
|
+
"expanded": "CustomEvent & { type: \"spa-manager-replace\"; detail: void; bubbles: true; cancelable: true; composed: true }"
|
|
851
|
+
}
|
|
852
|
+
},
|
|
853
|
+
{
|
|
854
|
+
"name": "spa-manager-back",
|
|
855
|
+
"description": "On `back` navigations.",
|
|
856
|
+
"type": {
|
|
857
|
+
"text": "SpaManagerBackEvent",
|
|
858
|
+
"expanded": "CustomEvent & { type: \"spa-manager-back\"; detail: void; bubbles: true; cancelable: true; composed: true }"
|
|
859
|
+
}
|
|
860
|
+
},
|
|
861
|
+
{
|
|
862
|
+
"name": "spa-manager-forward",
|
|
863
|
+
"description": "On `forward` navigations.",
|
|
864
|
+
"type": {
|
|
865
|
+
"text": "SpaManagerForwardEvent",
|
|
866
|
+
"expanded": "CustomEvent & { type: \"spa-manager-forward\"; detail: void; bubbles: true; cancelable: true; composed: true }"
|
|
867
|
+
}
|
|
868
|
+
}
|
|
869
|
+
],
|
|
870
|
+
"_neutron": {
|
|
871
|
+
"provisions": [
|
|
872
|
+
{
|
|
873
|
+
"name": "provision",
|
|
874
|
+
"type": {
|
|
875
|
+
"text": "KitRouteData",
|
|
876
|
+
"expanded": "{ previous: { id: string; url: string; title?: string; isInit?: boolean; scrollX?: number; scrollY?: number; ttypes?: string[]; } | null; active: { id: string; url: string; title?: string; isInit?: boolean; scrollX?: number; scrollY?: number; ttypes?: string[]; }; next: { id: string; url: string; title?: string; isInit?: boolean; scrollX?: number; scrollY?: number; ttypes?: string[]; } | null; all: { id: string; url: string; title?: string; isInit?: boolean; scrollX?: number; scrollY?: number; ttypes?: string[]; }[]; params: Record<string, string> | null; match: Array<any> | null; move: null | \"push\" | \"replace\" | \"back\" | \"forward\"; event?: { hasUAVisualTransition: boolean; }; route: KitRoute; }"
|
|
877
|
+
},
|
|
878
|
+
"description": "Current route payload. Not reflected as an attribute.",
|
|
879
|
+
"fieldName": "provision"
|
|
880
|
+
}
|
|
881
|
+
],
|
|
882
|
+
"listens": [
|
|
883
|
+
{
|
|
884
|
+
"name": "spa-route-render",
|
|
885
|
+
"description": "Queues the child's render callback for the next batched transition.",
|
|
886
|
+
"type": {
|
|
887
|
+
"text": "RenderableRenderEvent",
|
|
888
|
+
"expanded": "CustomEvent & { type: \"{tag}-render\"; detail: () => Promise<void>; bubbles: true; cancelable: true; composed: true }"
|
|
889
|
+
}
|
|
890
|
+
},
|
|
891
|
+
{
|
|
892
|
+
"name": "spa-route-unrender",
|
|
893
|
+
"description": "Queues the child's unrender callback (runs before renders so the outgoing route leaves first).",
|
|
894
|
+
"type": {
|
|
895
|
+
"text": "RenderableUnrenderEvent",
|
|
896
|
+
"expanded": "CustomEvent & { type: \"{tag}-unrender\"; detail: () => void; bubbles: true; cancelable: true; composed: true }"
|
|
897
|
+
}
|
|
898
|
+
},
|
|
899
|
+
{
|
|
900
|
+
"name": "spa-route-provision",
|
|
901
|
+
"description": "Queues a same-route param update (reuse) into the next batched transition.",
|
|
902
|
+
"type": {
|
|
903
|
+
"text": "SpaRouteProvisionEvent",
|
|
904
|
+
"expanded": "CustomEvent & { type: \"spa-route-provision\"; detail: () => void; bubbles: true; cancelable: true; composed: true }"
|
|
905
|
+
}
|
|
906
|
+
},
|
|
907
|
+
{
|
|
908
|
+
"name": "spa-route-error",
|
|
909
|
+
"description": "Falls back to a non-transitioned update and re-emits as `spa-manager-error`.",
|
|
910
|
+
"type": {
|
|
911
|
+
"text": "RenderableErrorEvent",
|
|
912
|
+
"expanded": "CustomEvent & { type: \"{tag}-error\"; detail: void; bubbles: true; cancelable: true; composed: true }"
|
|
913
|
+
}
|
|
914
|
+
}
|
|
915
|
+
],
|
|
916
|
+
"defaultActions": [
|
|
917
|
+
{
|
|
918
|
+
"name": "spa-manager-will-transition",
|
|
919
|
+
"description": "Starts the batched View Transition (or synchronous update when transitions are unavailable / opted out)."
|
|
920
|
+
}
|
|
921
|
+
],
|
|
922
|
+
"expectedChildren": [
|
|
923
|
+
{
|
|
924
|
+
"relationship": "descendant",
|
|
925
|
+
"selector": "spa-route",
|
|
926
|
+
"required": true,
|
|
927
|
+
"description": "Routes this manager coordinates. Their render lifecycle is intercepted and batched into one view transition per navigation."
|
|
928
|
+
}
|
|
929
|
+
]
|
|
930
|
+
}
|
|
931
|
+
}
|
|
932
|
+
],
|
|
933
|
+
"exports": [
|
|
934
|
+
{
|
|
935
|
+
"kind": "js",
|
|
936
|
+
"name": "SpaManager",
|
|
937
|
+
"declaration": {
|
|
938
|
+
"name": "SpaManager",
|
|
939
|
+
"module": "spa-manager.ts"
|
|
940
|
+
}
|
|
941
|
+
},
|
|
942
|
+
{
|
|
943
|
+
"kind": "custom-element-definition",
|
|
944
|
+
"name": "spa-manager",
|
|
945
|
+
"declaration": {
|
|
946
|
+
"name": "SpaManager",
|
|
947
|
+
"module": "spa-manager.ts"
|
|
948
|
+
}
|
|
949
|
+
}
|
|
950
|
+
]
|
|
951
|
+
}
|
|
952
|
+
]
|
|
953
|
+
}
|