@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.
Files changed (38) hide show
  1. package/.rush/temp/chunked-rush-logs/spa-route.apply-exports.chunks.jsonl +1 -0
  2. package/.rush/temp/chunked-rush-logs/spa-route.build_docs.chunks.jsonl +1 -0
  3. package/.rush/temp/chunked-rush-logs/spa-route.build_package-metas.chunks.jsonl +1 -0
  4. package/.rush/temp/operation/apply-exports/all.log +1 -0
  5. package/.rush/temp/operation/apply-exports/log-chunks.jsonl +1 -0
  6. package/.rush/temp/operation/apply-exports/state.json +3 -0
  7. package/.rush/temp/operation/build_docs/all.log +1 -0
  8. package/.rush/temp/operation/build_docs/log-chunks.jsonl +1 -0
  9. package/.rush/temp/operation/build_docs/state.json +3 -0
  10. package/.rush/temp/operation/build_package-metas/all.log +1 -0
  11. package/.rush/temp/operation/build_package-metas/log-chunks.jsonl +1 -0
  12. package/.rush/temp/operation/build_package-metas/state.json +3 -0
  13. package/.rush/temp/shrinkwrap-deps.json +3 -0
  14. package/config/rig.json +5 -0
  15. package/index.css +5 -0
  16. package/index.ts +29 -0
  17. package/package.json +48 -0
  18. package/rush-logs/spa-route.apply-exports.cache.log +1 -0
  19. package/rush-logs/spa-route.apply-exports.log +1 -0
  20. package/rush-logs/spa-route.build_docs.cache.log +1 -0
  21. package/rush-logs/spa-route.build_docs.log +1 -0
  22. package/rush-logs/spa-route.build_package-metas.cache.log +1 -0
  23. package/rush-logs/spa-route.build_package-metas.log +1 -0
  24. package/spa-a.ts +124 -0
  25. package/spa-manager.ts +605 -0
  26. package/spa-route.ts +322 -0
  27. package/src/spa-route.css +24 -0
  28. package/src/utils.ts +31 -0
  29. package/support/custom-elements.json +953 -0
  30. package/support/dist-docs/spa-a.md +40 -0
  31. package/support/dist-docs/spa-manager.md +66 -0
  32. package/support/dist-docs/spa-route.md +408 -0
  33. package/support/docs/README.md +314 -0
  34. package/support/package-meta.json +789 -0
  35. package/support/tests/spa-navigation.test.ts +1076 -0
  36. package/support/tests/spa-route.test.ts +766 -0
  37. package/support/tests/spa-title.test.ts +225 -0
  38. 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,3 @@
1
+ {
2
+ "nonCachedDurationMs": 39.87107900000001
3
+ }
@@ -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,3 @@
1
+ {
2
+ "nonCachedDurationMs": 49.14228400000002
3
+ }
@@ -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"}
@@ -0,0 +1,3 @@
1
+ {
2
+ "nonCachedDurationMs": 147.68652299999985
3
+ }
@@ -0,0 +1,3 @@
1
+ {
2
+ "../../packages/spa-route": "../../packages/spa-route:/z/wHmF2sAc5rOPFB5jZxmHb5uUnWtOb2Sg8o55k3B8=:"
3
+ }
@@ -0,0 +1,5 @@
1
+ {
2
+ "$schema": "https://developer.microsoft.com/json-schemas/rig-package/rig.schema.json",
3
+ "rigPackageName": "@excom/heft-rig",
4
+ "rigProfile": "default"
5
+ }
package/index.css ADDED
@@ -0,0 +1,5 @@
1
+ @import "./src/spa-route.css";
2
+
3
+ @layer {
4
+ @mixin module-spa-route;
5
+ }
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
+ );