@_linked/cli 1.8.1 → 1.9.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 (207) hide show
  1. package/CHANGELOG.md +41 -0
  2. package/defaults/setup-publish/dual-branch/github/workflows/publish.yml +3 -0
  3. package/defaults/setup-publish/github/workflows/publish.yml +3 -0
  4. package/defaults/shape.ts +8 -2
  5. package/jest.config.cjs +8 -4
  6. package/lib/esm/cli-methods.d.ts +11 -3
  7. package/lib/esm/cli-methods.d.ts.map +1 -1
  8. package/lib/esm/cli-methods.js +51 -105
  9. package/lib/esm/cli-methods.js.map +1 -1
  10. package/lib/esm/cli.js +32 -8
  11. package/lib/esm/cli.js.map +1 -1
  12. package/lib/esm/commands/start.d.ts +6 -0
  13. package/lib/esm/commands/start.d.ts.map +1 -0
  14. package/lib/esm/commands/start.js +311 -0
  15. package/lib/esm/commands/start.js.map +1 -0
  16. package/lib/esm/config-webpack-app.d.ts +1 -1
  17. package/lib/esm/config-webpack-app.d.ts.map +1 -1
  18. package/lib/esm/config-webpack-app.js +1 -1
  19. package/lib/esm/config-webpack-app.js.map +1 -1
  20. package/lib/esm/config-webpack.d.ts +1 -1
  21. package/lib/esm/config-webpack.d.ts.map +1 -1
  22. package/lib/esm/config-webpack.js +4 -4
  23. package/lib/esm/config-webpack.js.map +1 -1
  24. package/lib/esm/defineConfig.d.ts +1 -1
  25. package/lib/esm/defineConfig.d.ts.map +1 -1
  26. package/lib/esm/index.d.ts +1 -1
  27. package/lib/esm/index.d.ts.map +1 -1
  28. package/lib/esm/index.js +1 -1
  29. package/lib/esm/index.js.map +1 -1
  30. package/lib/esm/interfaces.d.ts +9 -0
  31. package/lib/esm/interfaces.d.ts.map +1 -1
  32. package/lib/esm/lifecycle.d.ts +24 -0
  33. package/lib/esm/lifecycle.d.ts.map +1 -0
  34. package/lib/esm/lifecycle.js +156 -0
  35. package/lib/esm/lifecycle.js.map +1 -0
  36. package/lib/esm/loaders/ts-loader.d.mts.map +1 -1
  37. package/lib/esm/loaders/ts-loader.mjs +11 -2
  38. package/lib/esm/loaders/ts-loader.mjs.map +1 -1
  39. package/lib/esm/utils.d.ts +1 -1
  40. package/lib/esm/utils.d.ts.map +1 -1
  41. package/lib/esm/utils.js +9 -3
  42. package/lib/esm/utils.js.map +1 -1
  43. package/lib/esm/vite-config.d.ts +20 -0
  44. package/lib/esm/vite-config.d.ts.map +1 -0
  45. package/lib/esm/vite-config.js +410 -0
  46. package/lib/esm/vite-config.js.map +1 -0
  47. package/package.json +13 -14
  48. package/test-results/.last-run.json +6 -0
  49. package/test-results/create-app-Person-fixture-add-/342/206/222-edit-/342/206/222-delete-round-trip/error-context.md +16 -0
  50. package/test-results/create-app-Person-fixture-add-/342/206/222-edit-/342/206/222-delete-round-trip/trace.zip +0 -0
  51. package/tests/unit/safeYarn.test.ts +1 -1
  52. package/tsconfig-esm.json +1 -1
  53. package/defaults/app-with-backend/.env-cmdrc.json +0 -19
  54. package/defaults/app-with-backend/.eslintignore +0 -5
  55. package/defaults/app-with-backend/.eslintrc.json +0 -40
  56. package/defaults/app-with-backend/.prettierignore +0 -4
  57. package/defaults/app-with-backend/.prettierrc.json +0 -27
  58. package/defaults/app-with-backend/.vscode/launch.json +0 -12
  59. package/defaults/app-with-backend/.yarn/plugins/@yarnpkg/plugin-version.cjs +0 -550
  60. package/defaults/app-with-backend/.yarn/releases/yarn-3.6.1.cjs +0 -874
  61. package/defaults/app-with-backend/gitignore.template +0 -25
  62. package/defaults/app-with-backend/linked.backend.datasets.example.json +0 -17
  63. package/defaults/app-with-backend/linked.backend.storage.ts +0 -35
  64. package/defaults/app-with-backend/linked.config.js +0 -5
  65. package/defaults/app-with-backend/package.json +0 -70
  66. package/defaults/app-with-backend/pm2-staging.config.js +0 -12
  67. package/defaults/app-with-backend/pm2.config.js +0 -12
  68. package/defaults/app-with-backend/public/favicon-144x144.png +0 -0
  69. package/defaults/app-with-backend/public/favicon-57x57.png +0 -0
  70. package/defaults/app-with-backend/public/favicon-72x72.png +0 -0
  71. package/defaults/app-with-backend/public/favicon.ico +0 -0
  72. package/defaults/app-with-backend/readme.md +0 -93
  73. package/defaults/app-with-backend/src/App.module.css +0 -83
  74. package/defaults/app-with-backend/src/App.tsx +0 -30
  75. package/defaults/app-with-backend/src/backend.ts +0 -9
  76. package/defaults/app-with-backend/src/components/Error.module.css +0 -9
  77. package/defaults/app-with-backend/src/components/Error.tsx +0 -11
  78. package/defaults/app-with-backend/src/components/PersonOverview.module.css +0 -100
  79. package/defaults/app-with-backend/src/components/PersonOverview.tsx +0 -97
  80. package/defaults/app-with-backend/src/components/PersonOverviewContext.tsx +0 -12
  81. package/defaults/app-with-backend/src/components/PersonPreview.module.css +0 -97
  82. package/defaults/app-with-backend/src/components/PersonPreview.tsx +0 -109
  83. package/defaults/app-with-backend/src/components/Spinner.module.css +0 -17
  84. package/defaults/app-with-backend/src/components/Spinner.tsx +0 -12
  85. package/defaults/app-with-backend/src/index.tsx +0 -34
  86. package/defaults/app-with-backend/src/layout/DefaultLayout.module.css +0 -15
  87. package/defaults/app-with-backend/src/layout/DefaultLayout.tsx +0 -12
  88. package/defaults/app-with-backend/src/layout/Header.module.css +0 -46
  89. package/defaults/app-with-backend/src/layout/Header.tsx +0 -27
  90. package/defaults/app-with-backend/src/linked.frontend.datasets.json +0 -12
  91. package/defaults/app-with-backend/src/linked.frontend.storage.ts +0 -36
  92. package/defaults/app-with-backend/src/package.ts +0 -16
  93. package/defaults/app-with-backend/src/pages/Home.module.css +0 -23
  94. package/defaults/app-with-backend/src/pages/Home.tsx +0 -14
  95. package/defaults/app-with-backend/src/pages/Page1.module.css +0 -111
  96. package/defaults/app-with-backend/src/pages/Page1.tsx +0 -196
  97. package/defaults/app-with-backend/src/pages/PageNotFound.module.css +0 -19
  98. package/defaults/app-with-backend/src/pages/PageNotFound.tsx +0 -14
  99. package/defaults/app-with-backend/src/pages/Signin.module.css +0 -20
  100. package/defaults/app-with-backend/src/pages/Signin.tsx +0 -16
  101. package/defaults/app-with-backend/src/routes.tsx +0 -78
  102. package/defaults/app-with-backend/src/theme.css +0 -91
  103. package/defaults/app-with-backend/src/types.ts +0 -14
  104. package/defaults/app-with-backend/src/utils/lazyWithPreload.tsx +0 -42
  105. package/defaults/app-with-backend/src/utils/preloadRoutes.ts +0 -38
  106. package/defaults/app-with-backend/tsconfig.json +0 -24
  107. package/defaults/app-with-backend/yarnrc.yml.template +0 -8
  108. package/lib/cjs/cli-methods.d.ts +0 -67
  109. package/lib/cjs/cli-methods.d.ts.map +0 -1
  110. package/lib/cjs/cli-methods.js +0 -2718
  111. package/lib/cjs/cli-methods.js.map +0 -1
  112. package/lib/cjs/cli.d.ts +0 -3
  113. package/lib/cjs/cli.d.ts.map +0 -1
  114. package/lib/cjs/cli.js +0 -315
  115. package/lib/cjs/cli.js.map +0 -1
  116. package/lib/cjs/commands/build-package.d.ts +0 -9
  117. package/lib/cjs/commands/build-package.d.ts.map +0 -1
  118. package/lib/cjs/commands/build-package.js +0 -55
  119. package/lib/cjs/commands/build-package.js.map +0 -1
  120. package/lib/cjs/commands/safe-yarn.d.ts +0 -10
  121. package/lib/cjs/commands/safe-yarn.d.ts.map +0 -1
  122. package/lib/cjs/commands/safe-yarn.js +0 -66
  123. package/lib/cjs/commands/safe-yarn.js.map +0 -1
  124. package/lib/cjs/commands/setup-publish.d.ts +0 -23
  125. package/lib/cjs/commands/setup-publish.d.ts.map +0 -1
  126. package/lib/cjs/commands/setup-publish.js +0 -369
  127. package/lib/cjs/commands/setup-publish.js.map +0 -1
  128. package/lib/cjs/config-webpack-app.d.ts +0 -112
  129. package/lib/cjs/config-webpack-app.d.ts.map +0 -1
  130. package/lib/cjs/config-webpack-app.js +0 -427
  131. package/lib/cjs/config-webpack-app.js.map +0 -1
  132. package/lib/cjs/config-webpack.d.ts +0 -55
  133. package/lib/cjs/config-webpack.d.ts.map +0 -1
  134. package/lib/cjs/config-webpack.js +0 -417
  135. package/lib/cjs/config-webpack.js.map +0 -1
  136. package/lib/cjs/defineConfig.d.ts +0 -8
  137. package/lib/cjs/defineConfig.d.ts.map +0 -1
  138. package/lib/cjs/defineConfig.js +0 -12
  139. package/lib/cjs/defineConfig.js.map +0 -1
  140. package/lib/cjs/index.d.ts +0 -12
  141. package/lib/cjs/index.d.ts.map +0 -1
  142. package/lib/cjs/index.js +0 -43
  143. package/lib/cjs/index.js.map +0 -1
  144. package/lib/cjs/interfaces.d.ts +0 -131
  145. package/lib/cjs/interfaces.d.ts.map +0 -1
  146. package/lib/cjs/interfaces.js +0 -3
  147. package/lib/cjs/interfaces.js.map +0 -1
  148. package/lib/cjs/loaders/css-loader.d.mts +0 -2
  149. package/lib/cjs/loaders/css-loader.d.mts.map +0 -1
  150. package/lib/cjs/loaders/css-loader.mjs +0 -86
  151. package/lib/cjs/loaders/css-loader.mjs.map +0 -1
  152. package/lib/cjs/loaders/register-css-only.d.ts +0 -2
  153. package/lib/cjs/loaders/register-css-only.d.ts.map +0 -1
  154. package/lib/cjs/loaders/register-css-only.js +0 -11
  155. package/lib/cjs/loaders/register-css-only.js.map +0 -1
  156. package/lib/cjs/loaders/register.d.ts +0 -2
  157. package/lib/cjs/loaders/register.d.ts.map +0 -1
  158. package/lib/cjs/loaders/register.js +0 -11
  159. package/lib/cjs/loaders/register.js.map +0 -1
  160. package/lib/cjs/loaders/ts-loader.d.mts +0 -3
  161. package/lib/cjs/loaders/ts-loader.d.mts.map +0 -1
  162. package/lib/cjs/loaders/ts-loader.mjs +0 -116
  163. package/lib/cjs/loaders/ts-loader.mjs.map +0 -1
  164. package/lib/cjs/metadata.d.ts +0 -1
  165. package/lib/cjs/metadata.d.ts.map +0 -1
  166. package/lib/cjs/metadata.js +0 -155
  167. package/lib/cjs/metadata.js.map +0 -1
  168. package/lib/cjs/package.json +0 -139
  169. package/lib/cjs/plugins/check-imports.d.ts +0 -2
  170. package/lib/cjs/plugins/check-imports.d.ts.map +0 -1
  171. package/lib/cjs/plugins/check-imports.js +0 -68
  172. package/lib/cjs/plugins/check-imports.js.map +0 -1
  173. package/lib/cjs/plugins/declaration-plugin.d.ts +0 -15
  174. package/lib/cjs/plugins/declaration-plugin.d.ts.map +0 -1
  175. package/lib/cjs/plugins/declaration-plugin.js +0 -285
  176. package/lib/cjs/plugins/declaration-plugin.js.map +0 -1
  177. package/lib/cjs/plugins/externalise-modules.d.ts +0 -7
  178. package/lib/cjs/plugins/externalise-modules.d.ts.map +0 -1
  179. package/lib/cjs/plugins/externalise-modules.js +0 -190
  180. package/lib/cjs/plugins/externalise-modules.js.map +0 -1
  181. package/lib/cjs/plugins/lincd-tailwind-sources.d.ts +0 -3
  182. package/lib/cjs/plugins/lincd-tailwind-sources.d.ts.map +0 -1
  183. package/lib/cjs/plugins/lincd-tailwind-sources.js +0 -32
  184. package/lib/cjs/plugins/lincd-tailwind-sources.js.map +0 -1
  185. package/lib/cjs/plugins/watch-run.d.ts +0 -5
  186. package/lib/cjs/plugins/watch-run.d.ts.map +0 -1
  187. package/lib/cjs/plugins/watch-run.js +0 -45
  188. package/lib/cjs/plugins/watch-run.js.map +0 -1
  189. package/lib/cjs/preflight.css +0 -137
  190. package/lib/cjs/tailwind.config.d.ts +0 -8
  191. package/lib/cjs/tailwind.config.d.ts.map +0 -1
  192. package/lib/cjs/tailwind.config.js +0 -17
  193. package/lib/cjs/tailwind.config.js.map +0 -1
  194. package/lib/cjs/utils.d.ts +0 -77
  195. package/lib/cjs/utils.d.ts.map +0 -1
  196. package/lib/cjs/utils.js +0 -585
  197. package/lib/cjs/utils.js.map +0 -1
  198. package/lib/esm/loaders/register-css-only.d.ts +0 -2
  199. package/lib/esm/loaders/register-css-only.d.ts.map +0 -1
  200. package/lib/esm/loaders/register-css-only.js +0 -9
  201. package/lib/esm/loaders/register-css-only.js.map +0 -1
  202. package/lib/esm/loaders/register.d.ts +0 -2
  203. package/lib/esm/loaders/register.d.ts.map +0 -1
  204. package/lib/esm/loaders/register.js +0 -9
  205. package/lib/esm/loaders/register.js.map +0 -1
  206. package/lib/esm/package.json +0 -139
  207. /package/{babel.config.js → babel.config.cjs} +0 -0
@@ -1,97 +0,0 @@
1
- @import '@_linked/css/package.css';
2
-
3
- .Row {
4
- display: flex;
5
- align-items: center;
6
- justify-content: space-between;
7
- gap: --spacing(2);
8
- flex-wrap: wrap;
9
- }
10
-
11
- .Name {
12
- font-weight: 500;
13
- color: var(--color-gray-900);
14
- }
15
-
16
- .Actions {
17
- display: flex;
18
- gap: --spacing(2);
19
- }
20
-
21
- .EditButton,
22
- .SaveButton,
23
- .CancelButton,
24
- .DeleteButton {
25
- padding: --spacing(1) --spacing(3);
26
- font: inherit;
27
- font-size: 0.85rem;
28
- border-radius: var(--radius-element);
29
- border: 1px solid transparent;
30
- cursor: pointer;
31
- transition: background 120ms ease, color 120ms ease, border-color 120ms ease;
32
- }
33
-
34
- .EditButton,
35
- .CancelButton {
36
- background: transparent;
37
- color: var(--color-gray-700);
38
- border-color: var(--color-gray-300);
39
- }
40
-
41
- .EditButton:hover:not(:disabled),
42
- .CancelButton:hover:not(:disabled) {
43
- background: var(--color-gray-100);
44
- color: var(--color-gray-900);
45
- }
46
-
47
- .SaveButton {
48
- background: var(--color-primary-500);
49
- color: var(--color-white);
50
- }
51
-
52
- .SaveButton:hover:not(:disabled) {
53
- background: var(--color-primary-600);
54
- }
55
-
56
- .DeleteButton {
57
- background: transparent;
58
- color: var(--color-red-600);
59
- border-color: transparent;
60
- }
61
-
62
- .DeleteButton:hover:not(:disabled) {
63
- color: var(--color-red-700);
64
- background: var(--color-red-50);
65
- }
66
-
67
- .EditButton:disabled,
68
- .SaveButton:disabled,
69
- .CancelButton:disabled,
70
- .DeleteButton:disabled {
71
- opacity: 0.5;
72
- cursor: not-allowed;
73
- }
74
-
75
- .EditRow {
76
- display: flex;
77
- align-items: center;
78
- gap: --spacing(2);
79
- flex-wrap: wrap;
80
- width: 100%;
81
- }
82
-
83
- .EditRow input {
84
- flex: 1 1 140px;
85
- padding: --spacing(2) --spacing(3);
86
- border: 1px solid var(--color-gray-300);
87
- border-radius: var(--radius-element);
88
- background: var(--bg-card);
89
- color: var(--color-gray-900);
90
- font: inherit;
91
- }
92
-
93
- .EditRow input:focus {
94
- outline: none;
95
- border-color: var(--color-primary-500);
96
- box-shadow: 0 0 0 2px var(--color-primary-200);
97
- }
@@ -1,109 +0,0 @@
1
- // Example PersonPreview — single-Person row. Demonstrates @_linked/react's
2
- // linkedComponent: the wrapper runs the per-row query and injects query
3
- // result keys + `source` + `_refresh` into the render function. _refresh
4
- // patches local query state for optimistic UI; on delete, the parent
5
- // list re-runs via the PersonListRefresh context.
6
- import React, { useState } from 'react';
7
- import { linkedComponent } from '@_linked/react';
8
- import { Person } from '@_linked/schema/shapes/Person';
9
- import { usePersonListRefresh } from './PersonOverviewContext';
10
- import style from './PersonPreview.module.css';
11
-
12
- export const PersonPreview = linkedComponent(
13
- Person.select((p) => [p.givenName, p.familyName]),
14
- ({ givenName, familyName, source, _refresh }) => {
15
- const refreshList = usePersonListRefresh();
16
- const [editing, setEditing] = useState(false);
17
- const [draftGiven, setDraftGiven] = useState(givenName ?? '');
18
- const [draftFamily, setDraftFamily] = useState(familyName ?? '');
19
- const [busy, setBusy] = useState(false);
20
-
21
- async function save() {
22
- if (!source.id) return;
23
- setBusy(true);
24
- try {
25
- await Person.update({
26
- givenName: draftGiven,
27
- familyName: draftFamily,
28
- }).for({ id: source.id });
29
- // Optimistic patch — no extra network round-trip needed.
30
- _refresh({ givenName: draftGiven, familyName: draftFamily });
31
- setEditing(false);
32
- } finally {
33
- setBusy(false);
34
- }
35
- }
36
-
37
- async function remove() {
38
- if (!source.id) return;
39
- setBusy(true);
40
- try {
41
- await Person.delete({ id: source.id });
42
- refreshList();
43
- } finally {
44
- setBusy(false);
45
- }
46
- }
47
-
48
- function startEdit() {
49
- setDraftGiven(givenName ?? '');
50
- setDraftFamily(familyName ?? '');
51
- setEditing(true);
52
- }
53
-
54
- if (editing) {
55
- return (
56
- <span className={style.EditRow} data-testid="person-edit">
57
- <input
58
- value={draftGiven}
59
- onChange={(e) => setDraftGiven(e.target.value)}
60
- aria-label="First name"
61
- />
62
- <input
63
- value={draftFamily}
64
- onChange={(e) => setDraftFamily(e.target.value)}
65
- aria-label="Last name"
66
- />
67
- <button
68
- className={style.SaveButton}
69
- onClick={save}
70
- disabled={busy}
71
- >
72
- Save
73
- </button>
74
- <button
75
- className={style.CancelButton}
76
- onClick={() => setEditing(false)}
77
- disabled={busy}
78
- >
79
- Cancel
80
- </button>
81
- </span>
82
- );
83
- }
84
-
85
- return (
86
- <span className={style.Row} data-testid="person-row">
87
- <span className={style.Name} data-testid="person-name">
88
- {givenName} {familyName}
89
- </span>
90
- <span className={style.Actions}>
91
- <button
92
- className={style.EditButton}
93
- onClick={startEdit}
94
- disabled={busy}
95
- >
96
- Edit
97
- </button>
98
- <button
99
- className={style.DeleteButton}
100
- onClick={remove}
101
- disabled={busy}
102
- >
103
- Delete
104
- </button>
105
- </span>
106
- </span>
107
- );
108
- },
109
- );
@@ -1,17 +0,0 @@
1
- .spinner.active {
2
- border: 4px solid transparent;
3
- border-top: 4px solid #474545;
4
- border-radius: 50%;
5
- width: 16px;
6
- height: 16px;
7
- animation: spin 1s linear infinite;
8
- }
9
-
10
- @keyframes spin {
11
- 0% {
12
- transform: rotate(0deg);
13
- }
14
- 100% {
15
- transform: rotate(360deg);
16
- }
17
- }
@@ -1,12 +0,0 @@
1
- import React from 'react';
2
- import style from './Spinner.module.css';
3
-
4
- export function Spinner({ active = true }) {
5
- return (
6
- <div
7
- className={[style.spinner, active && style.active].join(' ')}
8
- role="progressbar"
9
- aria-busy={active ? 'true' : 'false'}
10
- />
11
- );
12
- }
@@ -1,34 +0,0 @@
1
- import { AppContextProvider } from '@_linked/server-utils/components/AppContext';
2
- import { initFrontend } from '@_linked/server-utils/utils/Frontend';
3
- import React from 'react';
4
- import { hydrateRoot } from 'react-dom/client';
5
- import { BrowserRouter } from 'react-router-dom';
6
- import App from './App';
7
- import { preloadMatchedRoute } from './utils/preloadRoutes';
8
-
9
- //import the storage & file configuration for the frontend
10
- import './linked.frontend.storage';
11
-
12
- //to avoid errors with react-refresh-webpack-plugin
13
- window['$RefreshReg$'] = () => {};
14
- window['$RefreshSig$'] = () => () => {};
15
-
16
- initFrontend().then(async () => {
17
- // Preload matched route before hydration to avoid Suspense mismatch
18
- await preloadMatchedRoute();
19
-
20
- hydrateRoot(
21
- document.getElementById('root'), // Target the #root div for hydration
22
- <React.StrictMode>
23
- <BrowserRouter>
24
- <AppContextProvider
25
- assets={window['assetManifest']}
26
- requestLD={document.getElementById('request-ld')?.innerText}
27
- requestObject={JSON.parse(document.getElementById('request-json')?.innerText || '{}')}
28
- >
29
- <App />
30
- </AppContextProvider>
31
- </BrowserRouter>
32
- </React.StrictMode>,
33
- );
34
- });
@@ -1,15 +0,0 @@
1
- @import '@_linked/css/package.css';
2
-
3
- .main {
4
- font-family: var(--font-sans);
5
- max-width: 960px;
6
- margin: 0 auto;
7
- padding: --spacing(6) --spacing(4);
8
-
9
- @media (max-width: 1024px) {
10
- max-width: 90%;
11
- }
12
- @media (max-width: 768px) {
13
- padding: --spacing(4) --spacing(3);
14
- }
15
- }
@@ -1,12 +0,0 @@
1
- import React from 'react';
2
- import { Header } from './Header';
3
- import style from './DefaultLayout.module.css';
4
-
5
- export function DefaultLayout({ children }) {
6
- return (
7
- <main className={style.main}>
8
- <Header />
9
- {children}
10
- </main>
11
- );
12
- }
@@ -1,46 +0,0 @@
1
- @import '@_linked/css/package.css';
2
-
3
- .header {
4
- display: flex;
5
- align-items: center;
6
- justify-content: space-between;
7
- gap: --spacing(4);
8
- padding: --spacing(4) 0 --spacing(6);
9
- flex-wrap: wrap;
10
- }
11
-
12
- .header h1 {
13
- color: var(--color-primary-700);
14
- margin: 0;
15
- }
16
-
17
- .menu {
18
- display: flex;
19
- gap: --spacing(1);
20
- flex-wrap: wrap;
21
- }
22
-
23
- .menu > a {
24
- font-weight: 500;
25
- font-size: 0.95rem;
26
- color: var(--color-gray-700);
27
- padding: --spacing(2) --spacing(3);
28
- border-radius: var(--radius-element);
29
- text-decoration: none;
30
- transition: background 120ms ease, color 120ms ease;
31
- }
32
-
33
- .menu > a:hover {
34
- background: var(--color-gray-100);
35
- color: var(--color-gray-900);
36
- }
37
-
38
- .menu > a.active {
39
- background: var(--color-primary-500);
40
- color: var(--color-white);
41
- }
42
-
43
- .menu > a.active:hover {
44
- background: var(--color-primary-600);
45
- color: var(--color-white);
46
- }
@@ -1,27 +0,0 @@
1
- import { Link, useLocation } from 'react-router-dom';
2
- import React from 'react';
3
- import style from './Header.module.css';
4
- import { ROUTES } from '../routes';
5
-
6
- export function Header() {
7
- let path = useLocation();
8
- return (
9
- <header className={style.header}>
10
- <h1>${name}</h1>
11
- <nav className={style.menu}>
12
- {Object.keys(ROUTES).map((key) => {
13
- if (ROUTES[key].excludeFromMenu) return null;
14
- return (
15
- <Link
16
- key={key}
17
- to={ROUTES[key].path}
18
- className={ROUTES[key].path === path.pathname ? style.active : ''}
19
- >
20
- {ROUTES[key].label || key}
21
- </Link>
22
- );
23
- })}
24
- </nav>
25
- </header>
26
- );
27
- }
@@ -1,12 +0,0 @@
1
- {
2
- "_note": "Frontend datasets config. Public values only — this file ships in the browser bundle. Each entry: `store` (npm import path to the IDataset class) + `config` (a single JSON object passed verbatim to `new StoreClass(config)`). The default BackendAPIStore entry proxies queries to this app's own backend; swap in a different store class (e.g. @_linked/fuseki/shapes/FusekiStore) to talk directly to a public SPARQL endpoint.",
3
-
4
- "datasets": {
5
- "appData": {
6
- "store": "@_linked/server/shapes/quadstores/BackendAPIStore",
7
- "config": {
8
- "name": "appData"
9
- }
10
- }
11
- }
12
- }
@@ -1,36 +0,0 @@
1
- // Frontend storage for ${name}.
2
- //
3
- // Reads linked.frontend.datasets.json and instantiates one store per
4
- // alias. Webpack can't bundle dynamic imports of arbitrary npm paths,
5
- // so on the frontend we import each store class explicitly and
6
- // construct it per-alias here.
7
- //
8
- // Aliases on this side are independent from backend aliases — the
9
- // framework re-routes by shape on each side.
10
- import datasetsConfig from './linked.frontend.datasets.json' with { type: 'json' };
11
- import { parseDatasetsConfig } from '@_linked/core/utils/parseDatasetsConfig';
12
- import { LinkedFileStorage } from '@_linked/core/utils/LinkedFileStorage';
13
- import { LinkedStorage } from '@_linked/core/utils/LinkedStorage';
14
- import { BackendAPIStore } from '@_linked/server/shapes/quadstores/BackendAPIStore';
15
- import { getAccessUrlLocalFileStore } from '@_linked/server/utils/accessUrl';
16
- // Direct-to-Fuseki on the frontend? Uncomment:
17
- // import { FusekiStore } from '@_linked/fuseki/shapes/FusekiStore';
18
-
19
- // Parse JSON; pass empty env since the browser has no runtime process.env.
20
- // Per-env values for the frontend should be hardcoded `process.env.X`
21
- // references (webpack inlines them at build time).
22
- const config = parseDatasetsConfig(datasetsConfig, {});
23
-
24
- // One store per alias. Each line imports the class above and constructs it
25
- // with the alias's `config`. Adding a new alias = add an import + a line.
26
- const appData = new BackendAPIStore(config.datasets.appData.config);
27
- // Direct-to-Fuseki alternative (no creds in browser):
28
- // const appData = new FusekiStore(config.datasets.appData.config);
29
-
30
- // Shape → alias. For multi-alias setups add per-shape pins, e.g.:
31
- // import { PageView } from './shapes/PageView';
32
- // LinkedStorage.setDatasetForShapes(analytics, [PageView]);
33
- LinkedStorage.setDefaultDataset(appData);
34
-
35
- // File asset URLs.
36
- LinkedFileStorage.setDefaultAccessURL(getAccessUrlLocalFileStore());
@@ -1,16 +0,0 @@
1
- // Imports from `@_linked/react/package` (not `@_linked/core/utils/Package`)
2
- // because `linkedComponent` / `linkedSetComponent` are React-only — they
3
- // don't exist on core's LinkedPackageObject. The react helper composes
4
- // React-only fns on top of everything core's linkedPackage provides.
5
- import { linkedPackage } from '@_linked/react/package';
6
-
7
- export const {
8
- linkedComponent,
9
- linkedSetComponent,
10
- linkedShape,
11
- linkedUtil,
12
- linkedOntology,
13
- registerPackageExport,
14
- packageExports,
15
- packageName,
16
- } = linkedPackage('${hyphen_name}');
@@ -1,23 +0,0 @@
1
- @import '@_linked/css/package.css';
2
-
3
- .Home {
4
- display: block;
5
- margin: --spacing(4) 0;
6
- }
7
-
8
- .Home code {
9
- font-family: var(--font-mono);
10
- background: var(--bg-section);
11
- padding: 0 --spacing(1);
12
- border-radius: var(--radius-element);
13
- font-size: 0.85em;
14
- }
15
-
16
- .Home pre {
17
- padding: --spacing(4);
18
- background: var(--bg-section);
19
- border-radius: var(--radius-element);
20
- overflow-x: auto;
21
- font-family: var(--font-mono);
22
- margin: --spacing(2) 0;
23
- }
@@ -1,14 +0,0 @@
1
- import React from 'react';
2
- import { DefaultLayout } from '../layout/DefaultLayout';
3
- import { PersonOverview } from '../components/PersonOverview';
4
- import style from './Home.module.css';
5
-
6
- export default function Home() {
7
- return (
8
- <DefaultLayout>
9
- <div className={style.Home}>
10
- <PersonOverview />
11
- </div>
12
- </DefaultLayout>
13
- );
14
- }
@@ -1,111 +0,0 @@
1
- @import '@_linked/css/package.css';
2
-
3
- .Page {
4
- display: flex;
5
- flex-direction: column;
6
- gap: --spacing(5);
7
- }
8
-
9
- .Header {
10
- background: var(--bg-card);
11
- border-radius: var(--radius-card);
12
- box-shadow: var(--shadow-card);
13
- padding: --spacing(6);
14
- }
15
-
16
- .Header h2 {
17
- margin: 0 0 --spacing(2);
18
- }
19
-
20
- .Header p {
21
- color: var(--color-gray-700);
22
- line-height: 1.5;
23
- margin: 0;
24
- }
25
-
26
- .Header code {
27
- background: var(--bg-section);
28
- padding: 0 --spacing(1);
29
- border-radius: var(--radius-element);
30
- font-family: var(--font-mono);
31
- font-size: 0.85em;
32
- }
33
-
34
- .Tabs {
35
- background: var(--bg-card);
36
- border-radius: var(--radius-card);
37
- box-shadow: var(--shadow-card);
38
- padding: --spacing(5);
39
- }
40
-
41
- .TabPanel {
42
- display: grid;
43
- grid-template-columns: repeat(auto-fit, minmax(260px, 1fr));
44
- gap: --spacing(4);
45
- margin-top: --spacing(5);
46
- }
47
-
48
- /* Radix marks inactive Tabs.Content with both the [hidden] attribute and
49
- data-state="inactive". The display:grid above would otherwise win over
50
- the user-agent's [hidden] rule and leave inactive panels visible as
51
- empty grid containers. */
52
- .TabPanel[hidden],
53
- .TabPanel[data-state='inactive'] {
54
- display: none;
55
- }
56
-
57
- .Card {
58
- background: var(--bg-section);
59
- border-radius: var(--radius-element);
60
- padding: --spacing(4);
61
- display: flex;
62
- flex-direction: column;
63
- gap: --spacing(3);
64
- }
65
-
66
- .Card h3 {
67
- margin: 0;
68
- font-size: 0.85rem;
69
- font-weight: 600;
70
- letter-spacing: 0.04em;
71
- text-transform: uppercase;
72
- color: var(--color-gray-600);
73
- }
74
-
75
- .Field {
76
- display: flex;
77
- flex-direction: column;
78
- gap: --spacing(2);
79
- }
80
-
81
- .Stack {
82
- display: flex;
83
- flex-direction: column;
84
- gap: --spacing(2);
85
- }
86
-
87
- .Row {
88
- display: flex;
89
- align-items: center;
90
- gap: --spacing(2);
91
- flex-wrap: wrap;
92
- }
93
-
94
- .ButtonRow {
95
- display: flex;
96
- align-items: center;
97
- gap: --spacing(2);
98
- flex-wrap: wrap;
99
- }
100
-
101
- .AvatarRow {
102
- display: flex;
103
- gap: --spacing(3);
104
- align-items: center;
105
- }
106
-
107
- .Hint {
108
- color: var(--color-gray-600);
109
- font-size: 0.875rem;
110
- margin: 0;
111
- }