@_linked/cli 1.8.2 → 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.
- package/CHANGELOG.md +12 -0
- package/jest.config.cjs +8 -4
- package/lib/esm/cli-methods.d.ts.map +1 -1
- package/lib/esm/cli-methods.js +15 -3
- package/lib/esm/cli-methods.js.map +1 -1
- package/lib/esm/vite-config.d.ts.map +1 -1
- package/lib/esm/vite-config.js +49 -16
- package/lib/esm/vite-config.js.map +1 -1
- package/package.json +8 -14
- package/tests/unit/safeYarn.test.ts +1 -1
- package/defaults/app-with-backend/.env-cmdrc.json +0 -19
- package/defaults/app-with-backend/.env.example +0 -20
- package/defaults/app-with-backend/.eslintignore +0 -5
- package/defaults/app-with-backend/.eslintrc.json +0 -40
- package/defaults/app-with-backend/.prettierignore +0 -4
- package/defaults/app-with-backend/.prettierrc.json +0 -27
- package/defaults/app-with-backend/.vscode/launch.json +0 -12
- package/defaults/app-with-backend/.yarn/plugins/@yarnpkg/plugin-version.cjs +0 -550
- package/defaults/app-with-backend/.yarn/releases/yarn-3.6.1.cjs +0 -874
- package/defaults/app-with-backend/gitignore.template +0 -27
- package/defaults/app-with-backend/linked.backend.datasets.example.json +0 -17
- package/defaults/app-with-backend/linked.backend.storage.ts +0 -35
- package/defaults/app-with-backend/linked.config.js +0 -7
- package/defaults/app-with-backend/package.json +0 -75
- package/defaults/app-with-backend/pm2-staging.config.js +0 -12
- package/defaults/app-with-backend/pm2.config.js +0 -12
- package/defaults/app-with-backend/public/favicon-144x144.png +0 -0
- package/defaults/app-with-backend/public/favicon-57x57.png +0 -0
- package/defaults/app-with-backend/public/favicon-72x72.png +0 -0
- package/defaults/app-with-backend/public/favicon.ico +0 -0
- package/defaults/app-with-backend/readme.md +0 -93
- package/defaults/app-with-backend/src/App.module.css +0 -83
- package/defaults/app-with-backend/src/App.tsx +0 -30
- package/defaults/app-with-backend/src/backend.ts +0 -9
- package/defaults/app-with-backend/src/components/Error.module.css +0 -9
- package/defaults/app-with-backend/src/components/Error.tsx +0 -11
- package/defaults/app-with-backend/src/components/PersonOverview.module.css +0 -100
- package/defaults/app-with-backend/src/components/PersonOverview.tsx +0 -97
- package/defaults/app-with-backend/src/components/PersonOverviewContext.tsx +0 -12
- package/defaults/app-with-backend/src/components/PersonPreview.module.css +0 -97
- package/defaults/app-with-backend/src/components/PersonPreview.tsx +0 -109
- package/defaults/app-with-backend/src/components/Spinner.module.css +0 -17
- package/defaults/app-with-backend/src/components/Spinner.tsx +0 -12
- package/defaults/app-with-backend/src/index.tsx +0 -34
- package/defaults/app-with-backend/src/layout/DefaultLayout.module.css +0 -15
- package/defaults/app-with-backend/src/layout/DefaultLayout.tsx +0 -12
- package/defaults/app-with-backend/src/layout/Header.module.css +0 -46
- package/defaults/app-with-backend/src/layout/Header.tsx +0 -27
- package/defaults/app-with-backend/src/linked.frontend.datasets.json +0 -12
- package/defaults/app-with-backend/src/linked.frontend.storage.ts +0 -36
- package/defaults/app-with-backend/src/package.ts +0 -16
- package/defaults/app-with-backend/src/pages/Home.module.css +0 -23
- package/defaults/app-with-backend/src/pages/Home.tsx +0 -14
- package/defaults/app-with-backend/src/pages/Page1.module.css +0 -111
- package/defaults/app-with-backend/src/pages/Page1.tsx +0 -196
- package/defaults/app-with-backend/src/pages/PageNotFound.module.css +0 -19
- package/defaults/app-with-backend/src/pages/PageNotFound.tsx +0 -14
- package/defaults/app-with-backend/src/pages/Signin.module.css +0 -20
- package/defaults/app-with-backend/src/pages/Signin.tsx +0 -16
- package/defaults/app-with-backend/src/routes.tsx +0 -78
- package/defaults/app-with-backend/src/theme.css +0 -91
- package/defaults/app-with-backend/src/types.ts +0 -14
- package/defaults/app-with-backend/src/utils/lazyWithPreload.tsx +0 -42
- package/defaults/app-with-backend/src/utils/preloadRoutes.ts +0 -38
- package/defaults/app-with-backend/tsconfig.json +0 -24
- package/defaults/app-with-backend/vite.config.ts +0 -13
- package/defaults/app-with-backend/yarnrc.yml.template +0 -8
- package/lib/cjs/cli-methods.d.ts +0 -75
- package/lib/cjs/cli-methods.d.ts.map +0 -1
- package/lib/cjs/cli-methods.js +0 -2655
- package/lib/cjs/cli-methods.js.map +0 -1
- package/lib/cjs/cli.d.ts +0 -3
- package/lib/cjs/cli.d.ts.map +0 -1
- package/lib/cjs/cli.js +0 -339
- package/lib/cjs/cli.js.map +0 -1
- package/lib/cjs/commands/build-package.d.ts +0 -9
- package/lib/cjs/commands/build-package.d.ts.map +0 -1
- package/lib/cjs/commands/build-package.js +0 -55
- package/lib/cjs/commands/build-package.js.map +0 -1
- package/lib/cjs/commands/safe-yarn.d.ts +0 -10
- package/lib/cjs/commands/safe-yarn.d.ts.map +0 -1
- package/lib/cjs/commands/safe-yarn.js +0 -66
- package/lib/cjs/commands/safe-yarn.js.map +0 -1
- package/lib/cjs/commands/setup-publish.d.ts +0 -23
- package/lib/cjs/commands/setup-publish.d.ts.map +0 -1
- package/lib/cjs/commands/setup-publish.js +0 -369
- package/lib/cjs/commands/setup-publish.js.map +0 -1
- package/lib/cjs/commands/start.d.ts +0 -6
- package/lib/cjs/commands/start.d.ts.map +0 -1
- package/lib/cjs/commands/start.js +0 -337
- package/lib/cjs/commands/start.js.map +0 -1
- package/lib/cjs/config-webpack-app.d.ts +0 -112
- package/lib/cjs/config-webpack-app.d.ts.map +0 -1
- package/lib/cjs/config-webpack-app.js +0 -427
- package/lib/cjs/config-webpack-app.js.map +0 -1
- package/lib/cjs/config-webpack.d.ts +0 -55
- package/lib/cjs/config-webpack.d.ts.map +0 -1
- package/lib/cjs/config-webpack.js +0 -417
- package/lib/cjs/config-webpack.js.map +0 -1
- package/lib/cjs/defineConfig.d.ts +0 -8
- package/lib/cjs/defineConfig.d.ts.map +0 -1
- package/lib/cjs/defineConfig.js +0 -12
- package/lib/cjs/defineConfig.js.map +0 -1
- package/lib/cjs/index.d.ts +0 -12
- package/lib/cjs/index.d.ts.map +0 -1
- package/lib/cjs/index.js +0 -43
- package/lib/cjs/index.js.map +0 -1
- package/lib/cjs/interfaces.d.ts +0 -140
- package/lib/cjs/interfaces.d.ts.map +0 -1
- package/lib/cjs/interfaces.js +0 -3
- package/lib/cjs/interfaces.js.map +0 -1
- package/lib/cjs/lifecycle.d.ts +0 -24
- package/lib/cjs/lifecycle.d.ts.map +0 -1
- package/lib/cjs/lifecycle.js +0 -187
- package/lib/cjs/lifecycle.js.map +0 -1
- package/lib/cjs/loaders/css-loader.d.mts +0 -2
- package/lib/cjs/loaders/css-loader.d.mts.map +0 -1
- package/lib/cjs/loaders/css-loader.mjs +0 -86
- package/lib/cjs/loaders/css-loader.mjs.map +0 -1
- package/lib/cjs/loaders/register-css-only.d.ts +0 -2
- package/lib/cjs/loaders/register-css-only.d.ts.map +0 -1
- package/lib/cjs/loaders/register-css-only.js +0 -11
- package/lib/cjs/loaders/register-css-only.js.map +0 -1
- package/lib/cjs/loaders/register.d.ts +0 -2
- package/lib/cjs/loaders/register.d.ts.map +0 -1
- package/lib/cjs/loaders/register.js +0 -11
- package/lib/cjs/loaders/register.js.map +0 -1
- package/lib/cjs/loaders/ts-loader.d.mts +0 -3
- package/lib/cjs/loaders/ts-loader.d.mts.map +0 -1
- package/lib/cjs/loaders/ts-loader.mjs +0 -125
- package/lib/cjs/loaders/ts-loader.mjs.map +0 -1
- package/lib/cjs/metadata.d.ts +0 -1
- package/lib/cjs/metadata.d.ts.map +0 -1
- package/lib/cjs/metadata.js +0 -155
- package/lib/cjs/metadata.js.map +0 -1
- package/lib/cjs/package.json +0 -144
- package/lib/cjs/plugins/check-imports.d.ts +0 -2
- package/lib/cjs/plugins/check-imports.d.ts.map +0 -1
- package/lib/cjs/plugins/check-imports.js +0 -68
- package/lib/cjs/plugins/check-imports.js.map +0 -1
- package/lib/cjs/plugins/declaration-plugin.d.ts +0 -15
- package/lib/cjs/plugins/declaration-plugin.d.ts.map +0 -1
- package/lib/cjs/plugins/declaration-plugin.js +0 -285
- package/lib/cjs/plugins/declaration-plugin.js.map +0 -1
- package/lib/cjs/plugins/externalise-modules.d.ts +0 -7
- package/lib/cjs/plugins/externalise-modules.d.ts.map +0 -1
- package/lib/cjs/plugins/externalise-modules.js +0 -190
- package/lib/cjs/plugins/externalise-modules.js.map +0 -1
- package/lib/cjs/plugins/lincd-tailwind-sources.d.ts +0 -3
- package/lib/cjs/plugins/lincd-tailwind-sources.d.ts.map +0 -1
- package/lib/cjs/plugins/lincd-tailwind-sources.js +0 -32
- package/lib/cjs/plugins/lincd-tailwind-sources.js.map +0 -1
- package/lib/cjs/plugins/watch-run.d.ts +0 -5
- package/lib/cjs/plugins/watch-run.d.ts.map +0 -1
- package/lib/cjs/plugins/watch-run.js +0 -45
- package/lib/cjs/plugins/watch-run.js.map +0 -1
- package/lib/cjs/preflight.css +0 -137
- package/lib/cjs/tailwind.config.d.ts +0 -8
- package/lib/cjs/tailwind.config.d.ts.map +0 -1
- package/lib/cjs/tailwind.config.js +0 -17
- package/lib/cjs/tailwind.config.js.map +0 -1
- package/lib/cjs/utils.d.ts +0 -77
- package/lib/cjs/utils.d.ts.map +0 -1
- package/lib/cjs/utils.js +0 -591
- package/lib/cjs/utils.js.map +0 -1
- package/lib/cjs/vite-config.d.ts +0 -20
- package/lib/cjs/vite-config.d.ts.map +0 -1
- package/lib/cjs/vite-config.js +0 -401
- package/lib/cjs/vite-config.js.map +0 -1
- package/lib/esm/loaders/register-css-only.d.ts +0 -2
- package/lib/esm/loaders/register-css-only.d.ts.map +0 -1
- package/lib/esm/loaders/register-css-only.js +0 -9
- package/lib/esm/loaders/register-css-only.js.map +0 -1
- package/lib/esm/loaders/register.d.ts +0 -2
- package/lib/esm/loaders/register.d.ts.map +0 -1
- package/lib/esm/loaders/register.js +0 -9
- package/lib/esm/loaders/register.js.map +0 -1
- package/lib/esm/package.json +0 -144
- /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,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
|
-
}
|