@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 @@
|
|
|
1
|
+
{"kind":"O","text":"Invoking: cd \"$RUSH_PROJECT_FOLDER\" && node ../heft-rig/scripts/apply-exports.mjs \n"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"kind":"O","text":"Invoking: node node_modules/@excom/heft-rig/scripts/build-docs.mjs \n"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"kind":"O","text":"Invoking: node node_modules/@excom/heft-rig/scripts/build-package-metas.mjs \n"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
Invoking: cd "$RUSH_PROJECT_FOLDER" && node ../heft-rig/scripts/apply-exports.mjs
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"kind":"O","text":"Invoking: cd \"$RUSH_PROJECT_FOLDER\" && node ../heft-rig/scripts/apply-exports.mjs \n"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
Invoking: node node_modules/@excom/heft-rig/scripts/build-docs.mjs
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"kind":"O","text":"Invoking: node node_modules/@excom/heft-rig/scripts/build-docs.mjs \n"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
Invoking: node node_modules/@excom/heft-rig/scripts/build-package-metas.mjs
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"kind":"O","text":"Invoking: node node_modules/@excom/heft-rig/scripts/build-package-metas.mjs \n"}
|
package/config/rig.json
ADDED
package/index.css
ADDED
package/index.ts
ADDED
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { SpaA } from "./spa-a";
|
|
2
|
+
import { SpaManager } from "./spa-manager";
|
|
3
|
+
import { SpaRoute } from "./spa-route";
|
|
4
|
+
|
|
5
|
+
SpaManager.define();
|
|
6
|
+
SpaRoute.define();
|
|
7
|
+
SpaA.define();
|
|
8
|
+
|
|
9
|
+
export { SpaA, SpaManager, SpaRoute };
|
|
10
|
+
|
|
11
|
+
type T_HTMLSpaManagerElement = typeof SpaManager.CustomElement;
|
|
12
|
+
type T_HTMLSpaRouteElement = typeof SpaRoute.CustomElement;
|
|
13
|
+
type T_HTMLSpaAElement = typeof SpaA.CustomElement;
|
|
14
|
+
declare global {
|
|
15
|
+
interface HTMLSpaManagerElement extends T_HTMLSpaManagerElement {}
|
|
16
|
+
interface HTMLSpaRouteElement extends T_HTMLSpaRouteElement {}
|
|
17
|
+
interface HTMLSpaAElement extends T_HTMLSpaAElement {}
|
|
18
|
+
interface Window {
|
|
19
|
+
HTMLSpaManagerElement: HTMLSpaManagerElement;
|
|
20
|
+
HTMLSpaRouteElement: HTMLSpaRouteElement;
|
|
21
|
+
HTMLSpaAElement: HTMLSpaAElement;
|
|
22
|
+
}
|
|
23
|
+
interface HTMLElementTagNameMap {
|
|
24
|
+
"spa-manager": HTMLSpaManagerElement;
|
|
25
|
+
"spa-route": HTMLSpaRouteElement;
|
|
26
|
+
"spa-a": HTMLSpaAElement;
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
export type { HTMLSpaAElement, HTMLSpaManagerElement, HTMLSpaRouteElement };
|
package/package.json
ADDED
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@excom/spa-route",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "<spa-route> custom element",
|
|
5
|
+
"license": "MIT",
|
|
6
|
+
"engines": {
|
|
7
|
+
"node": ">=24.13.0"
|
|
8
|
+
},
|
|
9
|
+
"type": "module",
|
|
10
|
+
"dependencies": {
|
|
11
|
+
"@excom/kit-logger": "^0.1.0",
|
|
12
|
+
"@excom/kit-router": "^0.1.0",
|
|
13
|
+
"@excom/listenable-element": "^0.1.0",
|
|
14
|
+
"@excom/kit-utils": "^0.1.0",
|
|
15
|
+
"@excom/neutron": "^0.1.0",
|
|
16
|
+
"@excom/routable-element": "^0.1.0",
|
|
17
|
+
"@excom/renderable-element": "^0.1.0"
|
|
18
|
+
},
|
|
19
|
+
"peerDependencies": {},
|
|
20
|
+
"devDependencies": {
|
|
21
|
+
"@excom/heft-rig": "^0.1.0"
|
|
22
|
+
},
|
|
23
|
+
"repository": {
|
|
24
|
+
"url": "excom-dev/nucleus",
|
|
25
|
+
"directory": "packages/spa-route"
|
|
26
|
+
},
|
|
27
|
+
"homepage": "https://github.com/excom-dev/nucleus/tree/main/packages/spa-route/support/docs/README.md",
|
|
28
|
+
"bugs": "https://github.com/excom-dev/nucleus/issues",
|
|
29
|
+
"keywords": [
|
|
30
|
+
"spa-route",
|
|
31
|
+
"neutron",
|
|
32
|
+
"custom-elements"
|
|
33
|
+
],
|
|
34
|
+
"excom": {
|
|
35
|
+
"packageType": "kit-element"
|
|
36
|
+
},
|
|
37
|
+
"scripts": {
|
|
38
|
+
"build": "node node_modules/@excom/heft-rig/scripts/vite-build.mjs",
|
|
39
|
+
"build:watch": "node node_modules/@excom/heft-rig/scripts/vite-build-watch.mjs",
|
|
40
|
+
"format": "node node_modules/@excom/heft-rig/scripts/format.mjs",
|
|
41
|
+
"test": "node node_modules/@excom/heft-rig/scripts/vitest.mjs",
|
|
42
|
+
"coverage": "node node_modules/@excom/heft-rig/scripts/coverage.mjs",
|
|
43
|
+
"dev": "node node_modules/@excom/heft-rig/scripts/vite-dev.mjs",
|
|
44
|
+
"preview": "node node_modules/@excom/heft-rig/scripts/vite-preview.mjs",
|
|
45
|
+
"build:package-metas": "node node_modules/@excom/heft-rig/scripts/build-package-metas.mjs",
|
|
46
|
+
"build:docs": "node node_modules/@excom/heft-rig/scripts/build-docs.mjs"
|
|
47
|
+
}
|
|
48
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
Caching has been disabled for this project's "apply-exports" command.
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
Invoking: cd "$RUSH_PROJECT_FOLDER" && node ../heft-rig/scripts/apply-exports.mjs
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
This project does not define the caching behavior of the "build:docs" command, so caching has been disabled.
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
Invoking: node node_modules/@excom/heft-rig/scripts/build-docs.mjs
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
This project does not define the caching behavior of the "build:package-metas" command, so caching has been disabled.
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
Invoking: node node_modules/@excom/heft-rig/scripts/build-package-metas.mjs
|
package/spa-a.ts
ADDED
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
import { urlMatchesHref } from "./src/utils";
|
|
2
|
+
import { KitLogger } from "@excom/kit-logger";
|
|
3
|
+
import { KitRoute, kitRouter } from "@excom/kit-router";
|
|
4
|
+
import { ListenableElement } from "@excom/listenable-element";
|
|
5
|
+
import { Neutron, TokenList } from "@excom/neutron";
|
|
6
|
+
import { RoutableElement } from "@excom/routable-element";
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* 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.).
|
|
10
|
+
*
|
|
11
|
+
* @summary Declarative SPA link with active-state styling.
|
|
12
|
+
*
|
|
13
|
+
* @example
|
|
14
|
+
* <spa-a route-href="/pricing">Pricing</spa-a>
|
|
15
|
+
*
|
|
16
|
+
* @example
|
|
17
|
+
* <spa-a route-href="/login" route-action="replace">Sign in</spa-a>
|
|
18
|
+
*/
|
|
19
|
+
export const SpaA = Neutron.compose([
|
|
20
|
+
ListenableElement,
|
|
21
|
+
RoutableElement,
|
|
22
|
+
Neutron({
|
|
23
|
+
tag: "spa-a",
|
|
24
|
+
props: {
|
|
25
|
+
/**
|
|
26
|
+
* @option
|
|
27
|
+
* Navigation mode when activated (default click).
|
|
28
|
+
* @default push
|
|
29
|
+
* @values push | replace | back | forward
|
|
30
|
+
*/
|
|
31
|
+
routeAction: String,
|
|
32
|
+
/**
|
|
33
|
+
* @option
|
|
34
|
+
* Sets `document.title` after navigation.
|
|
35
|
+
*/
|
|
36
|
+
documentTitle: String,
|
|
37
|
+
/**
|
|
38
|
+
* @option
|
|
39
|
+
* Space-separated View Transition types for this navigation (CSS View Transitions API). Useful for shared-element morphs like card expansion.
|
|
40
|
+
* @values <token>…
|
|
41
|
+
*/
|
|
42
|
+
transitionTypes: TokenList,
|
|
43
|
+
/**
|
|
44
|
+
* @option
|
|
45
|
+
* Require the URL hash to match when setting `is-active`.
|
|
46
|
+
*/
|
|
47
|
+
matchHash: Boolean,
|
|
48
|
+
/**
|
|
49
|
+
* @state
|
|
50
|
+
* Current URL matches `route-href`. Style with `spa-a[is-active]`.
|
|
51
|
+
*/
|
|
52
|
+
isActive: Boolean,
|
|
53
|
+
/**
|
|
54
|
+
* @state
|
|
55
|
+
* Previous URL matched `route-href`. Style outgoing links / card-expansion exits with `spa-a[was-active]`.
|
|
56
|
+
*/
|
|
57
|
+
wasActive: Boolean,
|
|
58
|
+
routeInstance: KitRoute,
|
|
59
|
+
},
|
|
60
|
+
}),
|
|
61
|
+
])
|
|
62
|
+
.defineMethods({
|
|
63
|
+
actionHandler: ({
|
|
64
|
+
routeAction,
|
|
65
|
+
routeHref,
|
|
66
|
+
documentTitle,
|
|
67
|
+
transitionTypes,
|
|
68
|
+
}) => {
|
|
69
|
+
if (routeAction === "back" && kitRouter.canGoBack()) {
|
|
70
|
+
kitRouter.back();
|
|
71
|
+
} else if (routeAction === "forward" && kitRouter.canGoForward()) {
|
|
72
|
+
kitRouter.forward();
|
|
73
|
+
} else if (routeHref) {
|
|
74
|
+
// Can't go back or forward: fall back to push if `route-href` is set
|
|
75
|
+
kitRouter[routeAction === "replace" ? "replaceState" : "pushState"]({
|
|
76
|
+
url: routeHref,
|
|
77
|
+
title: documentTitle ?? undefined,
|
|
78
|
+
ttypes: transitionTypes ?? undefined,
|
|
79
|
+
});
|
|
80
|
+
} else {
|
|
81
|
+
KitLogger.error(
|
|
82
|
+
"spa-a",
|
|
83
|
+
routeAction === "back"
|
|
84
|
+
? "Cannot go back"
|
|
85
|
+
: routeAction === "forward"
|
|
86
|
+
? "Cannot go forward"
|
|
87
|
+
: "No route-href provided"
|
|
88
|
+
);
|
|
89
|
+
}
|
|
90
|
+
},
|
|
91
|
+
routeChanged: ({ routeHref, matchHash }, { move, previous, next }) => {
|
|
92
|
+
return {
|
|
93
|
+
isActive: urlMatchesHref(location.href, routeHref!, {
|
|
94
|
+
ignoreHash: !matchHash,
|
|
95
|
+
}),
|
|
96
|
+
wasActive:
|
|
97
|
+
// After a reload, history survives but router states don't: check `next.url`
|
|
98
|
+
move === "back" && next?.url
|
|
99
|
+
? urlMatchesHref(next.url, routeHref!, { ignoreHash: !matchHash })
|
|
100
|
+
: // need to check previous.url in the case where window reload happens - history will still be persisted, but router states will not
|
|
101
|
+
["forward", "push", "replace"].includes(move) && previous?.url
|
|
102
|
+
? urlMatchesHref(previous.url, routeHref!, {
|
|
103
|
+
ignoreHash: !matchHash,
|
|
104
|
+
})
|
|
105
|
+
: false,
|
|
106
|
+
};
|
|
107
|
+
},
|
|
108
|
+
})
|
|
109
|
+
.onPropChanged(
|
|
110
|
+
"routeHref",
|
|
111
|
+
({ routeHref }) =>
|
|
112
|
+
!routeHref && {
|
|
113
|
+
// No `routeHref`: clear `isActive`
|
|
114
|
+
isActive: false,
|
|
115
|
+
}
|
|
116
|
+
)
|
|
117
|
+
.onConnected(
|
|
118
|
+
({ listenFor, listenForLifecycle, handleEvent, isMoving }) =>
|
|
119
|
+
!isMoving &&
|
|
120
|
+
!listenFor?.length &&
|
|
121
|
+
!listenForLifecycle?.length && {
|
|
122
|
+
addListener: ["click", handleEvent],
|
|
123
|
+
}
|
|
124
|
+
);
|