@conduction/docusaurus-preset 3.21.0 → 3.22.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/MISSING_COMPONENTS.md +1 -1
- package/README.md +2 -2
- package/package.json +3 -3
- package/src/components/AppMock/AppMock.jsx +12 -10
- package/src/components/AppMock/AppMock.module.css +14 -14
- package/src/components/AppMock/variants/{MyDashBiMock.jsx → LaunchPadBiMock.jsx} +3 -3
- package/src/components/AppMock/variants/{MyDashMock.jsx → LaunchPadMock.jsx} +4 -4
- package/src/components/AppMock/variants/{MyDashTilesMock.jsx → LaunchPadTilesMock.jsx} +3 -3
- package/src/components/AppMock/variants/{MyDashWidgetsMock.jsx → LaunchPadWidgetsMock.jsx} +3 -3
- package/src/components/AppMock/variants/OpenBuildMock.jsx +105 -0
- package/src/components/DetailHero/DetailHero.jsx +5 -5
- package/src/components/MockScene/MockScene.module.css +2 -2
- package/src/components/PartnerCard/PartnerCard.jsx +1 -1
- package/src/components/Pipeline/Pipeline.jsx +2 -2
- package/src/components/PlatformOverview/PlatformOverview.module.css +1 -1
- package/src/components/Showcase/Showcase.jsx +1 -1
- package/src/components/WidgetMock/WidgetMock.jsx +2 -2
- package/src/components/WidgetMock/WidgetMock.module.css +1 -1
- package/src/components/WidgetShelf/WidgetShelf.jsx +1 -1
- package/src/components/primitives/Button.jsx +2 -2
- package/src/components/primitives/Button.module.css +1 -1
- package/src/data/apps-registry.js +3 -3
- package/src/diagrams/README.md +1 -1
- package/src/index.js +3 -3
- package/src/plugins/features-page.js +1 -1
- package/src/theme/Footer/index.jsx +3 -3
- package/src/theme/Navbar/index.jsx +1 -1
- package/static/lib/hex-rain.js +2 -2
- package/static/lib/platform-diagram.css +1 -1
package/MISSING_COMPONENTS.md
CHANGED
|
@@ -57,7 +57,7 @@ Most consume one or more primitives.
|
|
|
57
57
|
- **CookieCli** — `CookieCli/CookieCli.jsx`. Terminal-styled cookie consent banner with localStorage persistence.
|
|
58
58
|
- **ComposeBlock** — `ComposeBlock/ComposeBlock.jsx`. Branded code block (cobalt-900 + Plex Mono + filename pill + copy button). For docker-compose, bash recipes, and any verbatim copy-paste content. Used on `/demo`.
|
|
59
59
|
- **AgentTrace** — `AgentTrace/AgentTrace.jsx`. Terminal-styled agent execution trace with cursor + mode chrome. Specimen: `preview/components/agent-trace.html`.
|
|
60
|
-
- **AppMock** — `AppMock/AppMock.jsx`. Selector that renders one of 16 app-specific UI mockups (DeciDesk, DocuDesk, LarpingApp,
|
|
60
|
+
- **AppMock** — `AppMock/AppMock.jsx`. Selector that renders one of 16 app-specific UI mockups (DeciDesk, DocuDesk, LarpingApp, LaunchPad + variants, NLDesign, OpenCatalogi, OpenConnector, OpenRegister, OpenWoo, PipelinQ, Procest, SoftwareCatalog, ZaakAfhandelApp). Each variant lives under `AppMock/variants/`. Specimen: `preview/components/app-mock.html`.
|
|
61
61
|
- **ExternalAppShelf** — `ExternalAppShelf/ExternalAppShelf.jsx`. Third-party-app shelf (Outlook-style, Mattermost, Keycloak, etc.) used on `/connext`. Specimen: `preview/components/external-app-shelf.html`.
|
|
62
62
|
- **WidgetShelf** — `WidgetShelf/WidgetShelf.jsx`. Widget showcase grid with eyebrow + title + lede + N-column widget cards. Specimen: `preview/components/widget-shelf.html`.
|
|
63
63
|
- **Showcase** — `Showcase/Showcase.jsx`. Multi-item collapsible showcase with screenshot + body. Used on `/commonground` for the "5-lagen model". Specimen: `preview/components/showcase.html`.
|
package/README.md
CHANGED
|
@@ -4,7 +4,7 @@ Brand-default Docusaurus 3 config for Conduction sites. Tokens, theme, navbar, f
|
|
|
4
4
|
|
|
5
5
|
## Status
|
|
6
6
|
|
|
7
|
-
Source lives inside the [design-system monorepo](https://
|
|
7
|
+
Source lives inside the [design-system monorepo](https://codeberg.org/Conduction/design-system); published to npm under the `@conduction` scope as a single package. Install in any product site with `npm i @conduction/docusaurus-preset`. The diagram web-component runtime (`<cn-hex>`, `<cn-platform>`, etc.) ships inside this same package under `@conduction/docusaurus-preset/diagrams` — no separate install needed.
|
|
8
8
|
|
|
9
9
|
## Brand rules
|
|
10
10
|
|
|
@@ -162,7 +162,7 @@ Then use `createConfig()` in your `docusaurus.config.js` as shown in [Usage](#us
|
|
|
162
162
|
import '@conduction/docusaurus-preset/diagrams';
|
|
163
163
|
```
|
|
164
164
|
|
|
165
|
-
This is how product sites such as `
|
|
165
|
+
This is how product sites such as `launchpad.conduction.nl/docs/...` adopt the brand without copying CSS or theme code, and stay in sync as the design-system evolves.
|
|
166
166
|
|
|
167
167
|
## AI-crawler baseline
|
|
168
168
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@conduction/docusaurus-preset",
|
|
3
|
-
"version": "3.
|
|
3
|
+
"version": "3.22.0",
|
|
4
4
|
"scripts": {
|
|
5
5
|
"prepack": "node scripts/prepack-bundle-css.js"
|
|
6
6
|
},
|
|
@@ -60,10 +60,10 @@
|
|
|
60
60
|
"homepage": "https://design-system.conduction.nl/",
|
|
61
61
|
"repository": {
|
|
62
62
|
"type": "git",
|
|
63
|
-
"url": "https://
|
|
63
|
+
"url": "https://codeberg.org/Conduction/design-system.git",
|
|
64
64
|
"directory": "docusaurus-preset"
|
|
65
65
|
},
|
|
66
66
|
"bugs": {
|
|
67
|
-
"url": "https://
|
|
67
|
+
"url": "https://codeberg.org/Conduction/design-system/issues"
|
|
68
68
|
}
|
|
69
69
|
}
|
|
@@ -14,7 +14,7 @@
|
|
|
14
14
|
*
|
|
15
15
|
* Usage:
|
|
16
16
|
*
|
|
17
|
-
* <AppMock app="
|
|
17
|
+
* <AppMock app="launchpad" />
|
|
18
18
|
* <AppMock app="openregister" caption />
|
|
19
19
|
* <AppMock app="decidesk" size="sm" />
|
|
20
20
|
* <AppMock app="procest" sidebar={<SidebarMock kind="procest-xwiki" />} />
|
|
@@ -34,10 +34,11 @@
|
|
|
34
34
|
import React from 'react';
|
|
35
35
|
import styles from './AppMock.module.css';
|
|
36
36
|
|
|
37
|
-
import
|
|
38
|
-
import
|
|
39
|
-
import
|
|
40
|
-
import
|
|
37
|
+
import LaunchPadMock from './variants/LaunchPadMock.jsx';
|
|
38
|
+
import LaunchPadTilesMock from './variants/LaunchPadTilesMock.jsx';
|
|
39
|
+
import LaunchPadBiMock from './variants/LaunchPadBiMock.jsx';
|
|
40
|
+
import LaunchPadWidgetsMock from './variants/LaunchPadWidgetsMock.jsx';
|
|
41
|
+
import OpenBuildMock from './variants/OpenBuildMock.jsx';
|
|
41
42
|
import OpenCatalogiMock from './variants/OpenCatalogiMock.jsx';
|
|
42
43
|
import OpenConnectorMock from './variants/OpenConnectorMock.jsx';
|
|
43
44
|
import OpenRegisterMock from './variants/OpenRegisterMock.jsx';
|
|
@@ -52,10 +53,11 @@ import SoftwareCatalogMock from './variants/SoftwareCatalogMock.jsx';
|
|
|
52
53
|
import ZaakAfhandelAppMock from './variants/ZaakAfhandelAppMock.jsx';
|
|
53
54
|
|
|
54
55
|
const VARIANTS = {
|
|
55
|
-
|
|
56
|
-
'
|
|
57
|
-
'
|
|
58
|
-
'
|
|
56
|
+
launchpad: {Component: LaunchPadMock, label: 'LaunchPad'},
|
|
57
|
+
'launchpad-tiles': {Component: LaunchPadTilesMock, label: 'LaunchPad · Tiles & grids'},
|
|
58
|
+
'launchpad-bi': {Component: LaunchPadBiMock, label: 'LaunchPad · BI on registers'},
|
|
59
|
+
'launchpad-widgets': {Component: LaunchPadWidgetsMock, label: 'LaunchPad · Widgets'},
|
|
60
|
+
openbuild: {Component: OpenBuildMock, label: 'OpenBuild'},
|
|
59
61
|
opencatalogi: {Component: OpenCatalogiMock, label: 'OpenCatalogi'},
|
|
60
62
|
openconnector: {Component: OpenConnectorMock, label: 'OpenConnector'},
|
|
61
63
|
openregister: {Component: OpenRegisterMock, label: 'OpenRegister'},
|
|
@@ -87,7 +89,7 @@ export default function AppMock({app, size = 'md', sidebar = null, caption = fal
|
|
|
87
89
|
// `.body`, taking the `.detail` slot. SidebarMock children get
|
|
88
90
|
// `embedded: true` so they drop their standalone .smFrame chrome
|
|
89
91
|
// and render as the bare `.detail.rich` panel that slots into
|
|
90
|
-
// .body. Variants that don't accept a sidebar prop (e.g.
|
|
92
|
+
// .body. Variants that don't accept a sidebar prop (e.g. LaunchPad)
|
|
91
93
|
// ignore it; this keeps the change additive.
|
|
92
94
|
const renderedSidebar = React.isValidElement(sidebar)
|
|
93
95
|
? React.cloneElement(sidebar, { embedded: true })
|
|
@@ -70,7 +70,7 @@
|
|
|
70
70
|
====================================================================== */
|
|
71
71
|
|
|
72
72
|
/* Top bar — Nextcloud-style row of small icons + spotlight + bell + avatar.
|
|
73
|
-
Used by
|
|
73
|
+
Used by launchpad + the three admin variants below. */
|
|
74
74
|
.am .topbar {
|
|
75
75
|
display: flex;
|
|
76
76
|
align-items: center;
|
|
@@ -275,16 +275,16 @@
|
|
|
275
275
|
.am .actions .btn.ghost { background: white; border: 1px solid var(--c-cobalt-200); }
|
|
276
276
|
|
|
277
277
|
/* ======================================================================
|
|
278
|
-
|
|
278
|
+
LaunchPad — full-bleed cobalt background with widget grid
|
|
279
279
|
====================================================================== */
|
|
280
280
|
|
|
281
|
-
.am .
|
|
281
|
+
.am .launchpad {
|
|
282
282
|
background: linear-gradient(135deg, var(--c-blue-cobalt) 0%, var(--c-cobalt-700) 100%);
|
|
283
283
|
position: relative;
|
|
284
284
|
display: flex;
|
|
285
285
|
flex-direction: column;
|
|
286
286
|
}
|
|
287
|
-
.am .
|
|
287
|
+
.am .launchpad .grid {
|
|
288
288
|
flex: 1;
|
|
289
289
|
display: grid;
|
|
290
290
|
grid-template-columns: 1fr 1.2fr 1fr 1fr;
|
|
@@ -292,8 +292,8 @@
|
|
|
292
292
|
padding: 12px;
|
|
293
293
|
min-height: 0;
|
|
294
294
|
}
|
|
295
|
-
.am .
|
|
296
|
-
.am .
|
|
295
|
+
.am .launchpad .col { padding: 0; gap: 8px; }
|
|
296
|
+
.am .launchpad .tile {
|
|
297
297
|
background: rgba(255,255,255,0.94);
|
|
298
298
|
border-radius: var(--radius-sm);
|
|
299
299
|
padding: 8px 10px;
|
|
@@ -302,7 +302,7 @@
|
|
|
302
302
|
gap: 4px;
|
|
303
303
|
min-height: 0;
|
|
304
304
|
}
|
|
305
|
-
.am .
|
|
305
|
+
.am .launchpad .tile.primary {
|
|
306
306
|
background: var(--c-blue-cobalt);
|
|
307
307
|
align-items: center;
|
|
308
308
|
justify-content: center;
|
|
@@ -310,22 +310,22 @@
|
|
|
310
310
|
flex: 1;
|
|
311
311
|
min-height: 50px;
|
|
312
312
|
}
|
|
313
|
-
.am .
|
|
314
|
-
.am .
|
|
315
|
-
.am .
|
|
316
|
-
.am .
|
|
313
|
+
.am .launchpad .tile.primary .icon { width: 22px; height: 25px; clip-path: var(--hex-pointy-top); background: white; }
|
|
314
|
+
.am .launchpad .tile.primary .label { height: 5px; width: 50%; background: white; border-radius: 1px; }
|
|
315
|
+
.am .launchpad .tile.empty { background: rgba(255,255,255,0.55); flex: 0 0 26%; }
|
|
316
|
+
.am .launchpad .tileHead {
|
|
317
317
|
display: flex; align-items: center; gap: 5px;
|
|
318
318
|
margin-bottom: 2px;
|
|
319
319
|
}
|
|
320
|
-
.am .
|
|
321
|
-
.am .
|
|
320
|
+
.am .launchpad .tileHead .h { width: 9px; height: 9px; border-radius: 1px; background: var(--c-cobalt-400); }
|
|
321
|
+
.am .launchpad .tileHead .t { flex: 1; height: 4px; background: var(--c-cobalt-700); border-radius: 1px; }
|
|
322
322
|
|
|
323
323
|
/* ==========================================================
|
|
324
324
|
Widget atoms — composable inside any AppMock dashboard
|
|
325
325
|
variant. Each .w-* renders a different small visualisation.
|
|
326
326
|
========================================================== */
|
|
327
327
|
|
|
328
|
-
/* Generic widget shell — same as .
|
|
328
|
+
/* Generic widget shell — same as .launchpad .tile but reusable
|
|
329
329
|
under any dashboard variant. */
|
|
330
330
|
.am .w {
|
|
331
331
|
background: rgba(255, 255, 255, 0.94);
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
2
|
+
* LaunchPad · BI on registers variant.
|
|
3
3
|
*
|
|
4
4
|
* Demonstrates the BI-graph angle: any chart you want, drawn directly
|
|
5
5
|
* on a register without ETL. The mock shows four graph cards in a
|
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
import React from 'react';
|
|
11
11
|
import styles from '../AppMock.module.css';
|
|
12
12
|
|
|
13
|
-
export default function
|
|
13
|
+
export default function LaunchPadBiMock() {
|
|
14
14
|
return (
|
|
15
15
|
<>
|
|
16
16
|
<div className={styles.topbar}>
|
|
@@ -20,7 +20,7 @@ export default function MyDashBiMock() {
|
|
|
20
20
|
<div className={styles.bell}></div>
|
|
21
21
|
<div className={styles.avatar}></div>
|
|
22
22
|
</div>
|
|
23
|
-
<div className={[styles.body, styles.
|
|
23
|
+
<div className={[styles.body, styles.launchpad].filter(Boolean).join(' ')}>
|
|
24
24
|
<div className={styles.grid}>
|
|
25
25
|
{/* Column 1: Bar chart on top, line chart below */}
|
|
26
26
|
<div className={styles.col}>
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
* Reference: live screenshot at http://localhost:8080/apps/
|
|
2
|
+
* LaunchPad abstract — full-bleed cobalt background with widget grid.
|
|
3
|
+
* Reference: live screenshot at http://localhost:8080/apps/launchpad/.
|
|
4
4
|
*
|
|
5
5
|
* Layout: top app strip + 4-column grid where col 1 stacks small + big
|
|
6
6
|
* primary tiles (Intranet / Calendar / Files), cols 2-4 hold info
|
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
import React from 'react';
|
|
11
11
|
import styles from '../AppMock.module.css';
|
|
12
12
|
|
|
13
|
-
export default function
|
|
13
|
+
export default function LaunchPadMock() {
|
|
14
14
|
return (
|
|
15
15
|
<>
|
|
16
16
|
<div className={styles.topbar}>
|
|
@@ -20,7 +20,7 @@ export default function MyDashMock() {
|
|
|
20
20
|
<div className={styles.bell}></div>
|
|
21
21
|
<div className={styles.avatar}></div>
|
|
22
22
|
</div>
|
|
23
|
-
<div className={[styles.body, styles.
|
|
23
|
+
<div className={[styles.body, styles.launchpad].filter(Boolean).join(' ')}>
|
|
24
24
|
<div className={styles.grid}>
|
|
25
25
|
{/* Column 1: small + big primary tiles */}
|
|
26
26
|
<div className={styles.col}>
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
2
|
+
* LaunchPad · Tiles & Grids variant.
|
|
3
3
|
*
|
|
4
4
|
* Demonstrates the Nextcloud-integration angle: large hex-icon
|
|
5
5
|
* launcher tiles that deeplink inside Nextcloud, link out to external
|
|
@@ -12,7 +12,7 @@
|
|
|
12
12
|
import React from 'react';
|
|
13
13
|
import styles from '../AppMock.module.css';
|
|
14
14
|
|
|
15
|
-
export default function
|
|
15
|
+
export default function LaunchPadTilesMock() {
|
|
16
16
|
return (
|
|
17
17
|
<>
|
|
18
18
|
<div className={styles.topbar}>
|
|
@@ -22,7 +22,7 @@ export default function MyDashTilesMock() {
|
|
|
22
22
|
<div className={styles.bell}></div>
|
|
23
23
|
<div className={styles.avatar}></div>
|
|
24
24
|
</div>
|
|
25
|
-
<div className={[styles.body, styles.
|
|
25
|
+
<div className={[styles.body, styles.launchpad].filter(Boolean).join(' ')}>
|
|
26
26
|
<div className={styles.grid}>
|
|
27
27
|
{/* Column 1: Launcher tiles in cobalt + KNVB */}
|
|
28
28
|
<div className={styles.col}>
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
2
|
+
* LaunchPad · Widget integration variant.
|
|
3
3
|
*
|
|
4
4
|
* Demonstrates the cross-app widget angle: any Conduction app that
|
|
5
5
|
* registers a Nextcloud dashboard widget shows up here. The mock
|
|
@@ -16,7 +16,7 @@
|
|
|
16
16
|
import React from 'react';
|
|
17
17
|
import styles from '../AppMock.module.css';
|
|
18
18
|
|
|
19
|
-
export default function
|
|
19
|
+
export default function LaunchPadWidgetsMock() {
|
|
20
20
|
return (
|
|
21
21
|
<>
|
|
22
22
|
<div className={styles.topbar}>
|
|
@@ -26,7 +26,7 @@ export default function MyDashWidgetsMock() {
|
|
|
26
26
|
<div className={styles.bell}></div>
|
|
27
27
|
<div className={styles.avatar}></div>
|
|
28
28
|
</div>
|
|
29
|
-
<div className={[styles.body, styles.
|
|
29
|
+
<div className={[styles.body, styles.launchpad].filter(Boolean).join(' ')}>
|
|
30
30
|
<div className={styles.grid}>
|
|
31
31
|
{/* Column 1: Procest werkvoorraad + DocuDesk upload */}
|
|
32
32
|
<div className={styles.col}>
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OpenBuild abstract — three-pane citizen-developer app builder: left
|
|
3
|
+
* builder nav + centre dashboard + right manifest/detail rail.
|
|
4
|
+
* Reference: live screenshot at http://localhost:8080/apps/openbuild/.
|
|
5
|
+
*
|
|
6
|
+
* Centre is the canonical "Dashboard" view: a KPI strip (Virtual apps /
|
|
7
|
+
* Published / Templates / Versions) over two panels — a virtual-app card
|
|
8
|
+
* list ("Virtual apps") and a template-catalogue list ("Templates").
|
|
9
|
+
* Right rail abstracts the per-app manifest/schema editor.
|
|
10
|
+
*/
|
|
11
|
+
|
|
12
|
+
import React from 'react';
|
|
13
|
+
import styles from '../AppMock.module.css';
|
|
14
|
+
|
|
15
|
+
export default function OpenBuildMock({ sidebar = null }) {
|
|
16
|
+
return (
|
|
17
|
+
<>
|
|
18
|
+
<div className={styles.topbar}>
|
|
19
|
+
<div className={styles.logo}></div>
|
|
20
|
+
{Array.from({length: 14}).map((_, i) => <div key={i} className={styles.icon}></div>)}
|
|
21
|
+
<div className={styles.spacer}></div>
|
|
22
|
+
<div className={styles.bell}></div>
|
|
23
|
+
<div className={styles.avatar}></div>
|
|
24
|
+
</div>
|
|
25
|
+
<div className={[styles.body, styles.openbuild].filter(Boolean).join(' ')}>
|
|
26
|
+
{/* Left builder nav: Dashboard · Virtual apps · Schemas · Templates · Exports */}
|
|
27
|
+
<div className={styles.nav}>
|
|
28
|
+
<div className={styles.navHead}>
|
|
29
|
+
<div className={styles.h}></div>
|
|
30
|
+
<div className={styles.l}></div>
|
|
31
|
+
</div>
|
|
32
|
+
{[true, false, false, false, false].map((active, i) => (
|
|
33
|
+
<div key={i} className={[styles.item, active && styles.active].filter(Boolean).join(' ')}>
|
|
34
|
+
<div className={styles.ico}></div>
|
|
35
|
+
<div className={styles.l}></div>
|
|
36
|
+
</div>
|
|
37
|
+
))}
|
|
38
|
+
</div>
|
|
39
|
+
{/* Centre: builder dashboard */}
|
|
40
|
+
<div className={styles.col}>
|
|
41
|
+
{/* KPI strip: Virtual apps / Published / Templates / Versions */}
|
|
42
|
+
<div className={styles.kpiRow}>
|
|
43
|
+
<div className={styles.kpi}>
|
|
44
|
+
<div className={styles.ico}></div>
|
|
45
|
+
<div className={styles.meta}><div className={styles.num}></div><div className={styles.label}></div></div>
|
|
46
|
+
</div>
|
|
47
|
+
<div className={[styles.kpi, styles.forest].join(' ')}>
|
|
48
|
+
<div className={styles.ico}></div>
|
|
49
|
+
<div className={styles.meta}><div className={styles.num}></div><div className={styles.label}></div></div>
|
|
50
|
+
</div>
|
|
51
|
+
<div className={[styles.kpi, styles.amber].join(' ')}>
|
|
52
|
+
<div className={styles.ico}></div>
|
|
53
|
+
<div className={styles.meta}><div className={styles.num}></div><div className={styles.label}></div></div>
|
|
54
|
+
</div>
|
|
55
|
+
<div className={[styles.kpi, styles.lavender].join(' ')}>
|
|
56
|
+
<div className={styles.ico}></div>
|
|
57
|
+
<div className={styles.meta}><div className={styles.num}></div><div className={styles.label}></div></div>
|
|
58
|
+
</div>
|
|
59
|
+
</div>
|
|
60
|
+
{/* Virtual-app card list + template catalogue */}
|
|
61
|
+
<div className={styles.panelRow}>
|
|
62
|
+
<div className={styles.panel}>
|
|
63
|
+
<div className={styles.head}><div className={styles.title}></div></div>
|
|
64
|
+
<div className={styles.stack}>
|
|
65
|
+
{['b','d','a','c'].map((cls, i) => (
|
|
66
|
+
<div key={i} className={styles.item}>
|
|
67
|
+
<div className={[styles.av, styles[cls]].join(' ')}></div>
|
|
68
|
+
<div className={styles.lines}><div className={styles.l1}></div><div className={styles.l2}></div></div>
|
|
69
|
+
</div>
|
|
70
|
+
))}
|
|
71
|
+
</div>
|
|
72
|
+
</div>
|
|
73
|
+
<div className={styles.panel}>
|
|
74
|
+
<div className={styles.head}><div className={styles.title}></div></div>
|
|
75
|
+
<div className={styles.stack}>
|
|
76
|
+
{[0,1,2,3].map(i => (
|
|
77
|
+
<div key={i} className={styles.item}>
|
|
78
|
+
<div className={styles.lines}><div className={styles.l1}></div></div>
|
|
79
|
+
</div>
|
|
80
|
+
))}
|
|
81
|
+
</div>
|
|
82
|
+
</div>
|
|
83
|
+
</div>
|
|
84
|
+
</div>
|
|
85
|
+
{/* Right rail: per-app manifest / schema editor. When AppMock passes
|
|
86
|
+
a `sidebar` prop it renders there instead of this placeholder. */}
|
|
87
|
+
{sidebar || (
|
|
88
|
+
<div className={styles.detail}>
|
|
89
|
+
<div className={styles.row + ' ' + styles.head}></div>
|
|
90
|
+
<div className={styles.row}></div>
|
|
91
|
+
<div className={styles.row + ' ' + styles.short}></div>
|
|
92
|
+
<div style={{height: 8}}></div>
|
|
93
|
+
<div className={styles.row + ' ' + styles.head}></div>
|
|
94
|
+
<div className={styles.row + ' ' + styles.dark}></div>
|
|
95
|
+
<div className={styles.row}></div>
|
|
96
|
+
<div className={styles.row}></div>
|
|
97
|
+
<div className={styles.row + ' ' + styles.short}></div>
|
|
98
|
+
<div className={styles.row + ' ' + styles.accent}></div>
|
|
99
|
+
<div className={styles.row + ' ' + styles.short}></div>
|
|
100
|
+
</div>
|
|
101
|
+
)}
|
|
102
|
+
</div>
|
|
103
|
+
</>
|
|
104
|
+
);
|
|
105
|
+
}
|
|
@@ -21,22 +21,22 @@
|
|
|
21
21
|
* Usage:
|
|
22
22
|
*
|
|
23
23
|
* <DetailHero
|
|
24
|
-
* appId="
|
|
25
|
-
* crumb={[{label: 'Apps', href: '/apps'}, '
|
|
24
|
+
* appId="launchpad"
|
|
25
|
+
* crumb={[{label: 'Apps', href: '/apps'}, 'LaunchPad']}
|
|
26
26
|
* status={{label: 'Beta', color: 'var(--c-orange-knvb)'}}
|
|
27
27
|
* version="v0.9"
|
|
28
28
|
* locales="NL · EN"
|
|
29
|
-
* title="
|
|
29
|
+
* title="LaunchPad"
|
|
30
30
|
* tagline="..."
|
|
31
31
|
* primaryCta={{label: 'Install from app store', href: '/install'}}
|
|
32
32
|
* icon={<svg>...</svg>}
|
|
33
33
|
* iconColor="var(--c-blue-cobalt)"
|
|
34
|
-
* illustration={<AppMock app="
|
|
34
|
+
* illustration={<AppMock app="launchpad" />}
|
|
35
35
|
* />
|
|
36
36
|
*
|
|
37
37
|
* Each cta object also accepts `tone: "orange"` to flip the primary
|
|
38
38
|
* (or secondary) variant to the KNVB-orange accent. Reserved for
|
|
39
|
-
* product pages with an orange-leaning brand identity (
|
|
39
|
+
* product pages with an orange-leaning brand identity (launchpad).
|
|
40
40
|
*
|
|
41
41
|
* `background="cobalt"` paints the hero in a full-bleed cobalt panel
|
|
42
42
|
* with white type — the product-page identity used on the
|
|
@@ -25,9 +25,9 @@
|
|
|
25
25
|
component from the item's x/y/z values. */
|
|
26
26
|
}
|
|
27
27
|
|
|
28
|
-
/* Widgets inside a scene drop their
|
|
28
|
+
/* Widgets inside a scene drop their LaunchPad-style cobalt-900 dashboard
|
|
29
29
|
chrome. WidgetMock by default frames its tile in dark cobalt to
|
|
30
|
-
simulate "this widget is sitting on a
|
|
30
|
+
simulate "this widget is sitting on a LaunchPad board"; that read is
|
|
31
31
|
useful in widget-mock.html (the kit context) but inside a scene the
|
|
32
32
|
surrounding card already provides context, and the dark frame just
|
|
33
33
|
reads as a heavy border. So inside .sceneItem the .wmFrame becomes
|
|
@@ -32,7 +32,7 @@
|
|
|
32
32
|
* name="YARD"
|
|
33
33
|
* logo="/img/partners/yard.png"
|
|
34
34
|
* summary={<>Digital design- en development-bureau uit Utrecht...</>}
|
|
35
|
-
* apps={['
|
|
35
|
+
* apps={['LaunchPad', 'OpenCatalogi']}
|
|
36
36
|
* />
|
|
37
37
|
* <BecomePartner href="/partners/become" />
|
|
38
38
|
* </PartnerGrid>
|
|
@@ -13,7 +13,7 @@
|
|
|
13
13
|
* mint integrate / connect (OpenConnector)
|
|
14
14
|
* forest data / registers (OpenRegister)
|
|
15
15
|
* terracotta documents / search (OpenCatalogi)
|
|
16
|
-
* lavender process / views (
|
|
16
|
+
* lavender process / views (LaunchPad)
|
|
17
17
|
* workspace Nextcloud workspace (centre platform hex)
|
|
18
18
|
*
|
|
19
19
|
* Sources / consumers end-boxes use <IconList />, also exported on its
|
|
@@ -77,7 +77,7 @@ function inferFamily(name) {
|
|
|
77
77
|
if (n.includes('connector')) return 'mint';
|
|
78
78
|
if (n.includes('register')) return 'forest';
|
|
79
79
|
if (n.includes('catalog')) return 'terracotta';
|
|
80
|
-
if (n.includes('
|
|
80
|
+
if (n.includes('launchpad') || n.includes('dashboard')) return 'lavender';
|
|
81
81
|
if (n.includes('nextcloud') || n.includes('workspace') || n.includes('platform')) return 'workspace';
|
|
82
82
|
return 'forest';
|
|
83
83
|
}
|
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
.section {
|
|
7
7
|
background: white;
|
|
8
8
|
/* Bottom padding deliberately lighter than top: the diagram's
|
|
9
|
-
orange-dashed flow lines around
|
|
9
|
+
orange-dashed flow lines around OpenBuild extend visually below
|
|
10
10
|
the last text label, so the section already has ~80px of optical
|
|
11
11
|
trailing space from the diagram itself before any padding kicks
|
|
12
12
|
in. Top stays at 96px to keep the rhythm coming in from the
|
|
@@ -30,7 +30,7 @@
|
|
|
30
30
|
* id: 'open',
|
|
31
31
|
* title: 'Open by default.',
|
|
32
32
|
* summary: 'Every line is EUPL-1.2 on GitHub.',
|
|
33
|
-
* cta: {label: 'Browse on GitHub', href: 'https://
|
|
33
|
+
* cta: {label: 'Browse on GitHub', href: 'https://codeberg.org/Conduction'},
|
|
34
34
|
* panel: <AppMock app="opencatalogi" />,
|
|
35
35
|
* },
|
|
36
36
|
* ...
|
|
@@ -12,8 +12,8 @@
|
|
|
12
12
|
* about a single integration point.
|
|
13
13
|
*
|
|
14
14
|
* Visual reference: every Conduction widget renders against a dashboard
|
|
15
|
-
* background (cobalt-900 in
|
|
16
|
-
* WidgetMock chrome is cobalt to match
|
|
15
|
+
* background (cobalt-900 in LaunchPad, white in stock Nextcloud). The
|
|
16
|
+
* WidgetMock chrome is cobalt to match LaunchPad since most Conduction
|
|
17
17
|
* widgets are built for that surface; the same widget atoms render
|
|
18
18
|
* fine on white when reused there.
|
|
19
19
|
*
|
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
* .w-decks, .w-rss, .w-jira, .w-video, .w-upload, .w-werkvoorraad,
|
|
6
6
|
* .w-launcher, .w-subgrid, .w-graph-bar / .w-graph-line / .w-graph-donut)
|
|
7
7
|
* live in AppMock/AppMock.module.css under the `.am` parent scope.
|
|
8
|
-
* They were authored there because
|
|
8
|
+
* They were authored there because LaunchPad variants render dashboard
|
|
9
9
|
* grids full of them. WidgetMock standalonises a single widget:
|
|
10
10
|
* same atoms, new chrome.
|
|
11
11
|
*
|
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
* the moment this app is installed".
|
|
9
9
|
*
|
|
10
10
|
* Each Conduction app that registers a Nextcloud-dashboard widget
|
|
11
|
-
* shows up automatically in
|
|
11
|
+
* shows up automatically in LaunchPad; this section makes that promise
|
|
12
12
|
* concrete by drawing the widgets the app actually contributes.
|
|
13
13
|
*
|
|
14
14
|
* Usage in MDX:
|
|
@@ -19,7 +19,7 @@
|
|
|
19
19
|
*
|
|
20
20
|
* Tone (optional): override the primary/secondary fill colour. The
|
|
21
21
|
* brand default is cobalt; product pages with an orange-accent identity
|
|
22
|
-
* (e.g.
|
|
22
|
+
* (e.g. launchpad) pass `tone="orange"` to flip the primary CTA to
|
|
23
23
|
* KNVB-orange while keeping the rest of the brand chrome intact.
|
|
24
24
|
*
|
|
25
25
|
* Icon (optional): pass a key from icons.jsx (e.g. `"github"`) or a
|
|
@@ -34,7 +34,7 @@
|
|
|
34
34
|
* <Button
|
|
35
35
|
* variant="on-dark-tertiary"
|
|
36
36
|
* icon="github"
|
|
37
|
-
* href="https://
|
|
37
|
+
* href="https://codeberg.org/Conduction/shillinq"
|
|
38
38
|
* >View on GitHub</Button>
|
|
39
39
|
*/
|
|
40
40
|
|
|
@@ -123,7 +123,7 @@
|
|
|
123
123
|
|
|
124
124
|
/* Tone modifier for the primary variant. The brand default is the
|
|
125
125
|
cobalt fill above; product pages with an orange-accent identity
|
|
126
|
-
(
|
|
126
|
+
(launchpad is the first) opt in by passing tone="orange". The brand
|
|
127
127
|
rule "one orange accent per screen" still applies; this just lets
|
|
128
128
|
the screen's single accent live on the primary CTA instead of
|
|
129
129
|
elsewhere. */
|
|
@@ -31,7 +31,7 @@ export const APPS_REGISTRY = {
|
|
|
31
31
|
openregister: {slug: 'openregister', name: 'OpenRegister', category: 'Data', productHref: '/apps/openregister', docsHref: 'https://docs.conduction.nl/openregister', academyHref: '/academy?app=openregister'},
|
|
32
32
|
openconnector: {slug: 'openconnector', name: 'OpenConnector', category: 'Connectors', productHref: '/apps/openconnector', docsHref: 'https://docs.conduction.nl/openconnector', academyHref: '/academy?app=openconnector'},
|
|
33
33
|
docudesk: {slug: 'docudesk', name: 'DocuDesk', category: 'Documents', productHref: '/apps/docudesk', docsHref: 'https://docs.conduction.nl/docudesk', academyHref: '/academy?app=docudesk'},
|
|
34
|
-
|
|
34
|
+
launchpad: {slug: 'launchpad', name: 'LaunchPad', category: 'Dashboards', productHref: '/apps/launchpad', docsHref: 'https://launchpad.conduction.nl', academyHref: '/academy?app=launchpad'},
|
|
35
35
|
zaakafhandelapp: {slug: 'zaakafhandelapp', name: 'ZaakAfhandelApp', category: 'Processes', productHref: '/apps/zaakafhandelapp', docsHref: 'https://docs.conduction.nl/zaakafhandelapp', academyHref: '/academy?app=zaakafhandelapp'},
|
|
36
36
|
pipelinq: {slug: 'pipelinq', name: 'PipelinQ', category: 'Processes', productHref: '/apps/pipelinq', docsHref: 'https://docs.conduction.nl/pipelinq', academyHref: '/academy?app=pipelinq'},
|
|
37
37
|
procest: {slug: 'procest', name: 'Procest', category: 'Processes', productHref: '/apps/procest', docsHref: 'https://docs.conduction.nl/procest', academyHref: '/academy?app=procest'},
|
|
@@ -40,7 +40,7 @@ export const APPS_REGISTRY = {
|
|
|
40
40
|
larpingapp: {slug: 'larpingapp', name: 'LarpingApp', category: 'Processes', productHref: '/apps/larpingapp', docsHref: 'https://docs.conduction.nl/larpingapp', academyHref: '/academy?app=larpingapp'},
|
|
41
41
|
nldesign: {slug: 'nldesign', name: 'NLDesign', category: 'Documents', productHref: '/apps/nldesign', docsHref: 'https://docs.conduction.nl/nldesign', academyHref: '/academy?app=nldesign'},
|
|
42
42
|
shillinq: {slug: 'shillinq', name: 'Shillinq', category: 'Processes', productHref: '/apps/shillinq', docsHref: 'https://docs.conduction.nl/shillinq', academyHref: '/academy?app=shillinq'},
|
|
43
|
-
|
|
43
|
+
openbuild: {slug: 'openbuild', name: 'OpenBuild', category: 'Processes', productHref: '/apps/openbuild', docsHref: 'https://docs.conduction.nl/openbuild', academyHref: '/academy?app=openbuild'},
|
|
44
44
|
doriath: {slug: 'doriath', name: 'Doriath', category: 'Connectors', productHref: '/apps/doriath', docsHref: 'https://docs.conduction.nl/doriath', academyHref: '/academy?app=doriath'},
|
|
45
45
|
'app-versions': {slug: 'app-versions', name: 'App Versions', category: 'Data', productHref: '/apps/app-versions', docsHref: 'https://docs.conduction.nl/app-versions', academyHref: '/academy?app=app-versions'},
|
|
46
46
|
};
|
|
@@ -87,7 +87,7 @@ export function getApps(slugs = []) {
|
|
|
87
87
|
}
|
|
88
88
|
|
|
89
89
|
/**
|
|
90
|
-
* Resolve a display-name (e.g. "OpenCatalogi", "DocuDesk", "
|
|
90
|
+
* Resolve a display-name (e.g. "OpenCatalogi", "DocuDesk", "LaunchPad")
|
|
91
91
|
* to its product page href, or undefined when the name is not in the
|
|
92
92
|
* registry. Used by partner cards / sidecards to turn the apps-shipped
|
|
93
93
|
* chip row into a clickable link list. Names like "Nextcloud" that
|
package/src/diagrams/README.md
CHANGED
|
@@ -4,7 +4,7 @@ Brand-strict diagram primitives for Conduction and ConNext, as framework-agnosti
|
|
|
4
4
|
|
|
5
5
|
## Status
|
|
6
6
|
|
|
7
|
-
Pre-release, scaffolded inside the `design-system` repo. The future home is tracked in [design-system#2](https://
|
|
7
|
+
Pre-release, scaffolded inside the `design-system` repo. The future home is tracked in [design-system#2](https://codeberg.org/Conduction/design-system/issues/2).
|
|
8
8
|
|
|
9
9
|
## Why
|
|
10
10
|
|
package/src/index.js
CHANGED
|
@@ -128,7 +128,7 @@ const BRAND_ORGANIZATION_JSONLD = {
|
|
|
128
128
|
value: '76741850',
|
|
129
129
|
},
|
|
130
130
|
sameAs: [
|
|
131
|
-
'https://
|
|
131
|
+
'https://codeberg.org/Conduction',
|
|
132
132
|
'https://www.linkedin.com/company/conduction/',
|
|
133
133
|
],
|
|
134
134
|
};
|
|
@@ -362,7 +362,7 @@ const baseNavbar = (siteName, repoUrl) => ({
|
|
|
362
362
|
items: [
|
|
363
363
|
{ type: 'custom-versionPill', position: 'right' },
|
|
364
364
|
{ type: 'custom-apiDocs', position: 'right' },
|
|
365
|
-
{ type: 'custom-github', href: repoUrl || 'https://
|
|
365
|
+
{ type: 'custom-github', href: repoUrl || 'https://codeberg.org/Conduction', position: 'right' },
|
|
366
366
|
{ type: 'localeDropdown', position: 'right' },
|
|
367
367
|
],
|
|
368
368
|
});
|
|
@@ -583,7 +583,7 @@ function createConfig(opts) {
|
|
|
583
583
|
{ wordmark: 'X' } -> single custom brand
|
|
584
584
|
{ brands: [{wordmark, logo, href}, ...] } -> dual-brand row,
|
|
585
585
|
rendered side by side. Used by product pages
|
|
586
|
-
built jointly with a partner (
|
|
586
|
+
built jointly with a partner (launchpad + Sendent
|
|
587
587
|
is the first case). */
|
|
588
588
|
footerBrand: opts.footerBrand || null,
|
|
589
589
|
/* Legal-bar links (Privacy / Terms / ISO) plus the two ISO
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
* Adds a `/features` route to every Conduction docs site, backed by the
|
|
5
5
|
* `docs/features.json` artefact regenerated from `openspec/specs/` by the
|
|
6
6
|
* org-wide Features Extract workflow stage
|
|
7
|
-
* (https://
|
|
7
|
+
* (https://codeberg.org/Conduction/.github/src/branch/main/.github/workflows/quality.yml).
|
|
8
8
|
*
|
|
9
9
|
* The route renders the brand `<FeaturesPage />` component, which in turn
|
|
10
10
|
* maps each entry to a `<FeatureItem>` inside `<FeatureGrid>`. Every entry
|
|
@@ -88,8 +88,8 @@ export default function Footer() {
|
|
|
88
88
|
`themeConfig.footerBrand = { wordmark: '...' }`, or render a dual
|
|
89
89
|
brand row via `{ brands: [{wordmark, logo, href}, ...] }` for
|
|
90
90
|
product pages co-branded with a partner. The legacy fallback to
|
|
91
|
-
`navbar.title` was misleading on product-page footers (
|
|
92
|
-
showing "
|
|
91
|
+
`navbar.title` was misleading on product-page footers (launchpad
|
|
92
|
+
showing "LaunchPad" rather than "Conduction"); the company-anchor
|
|
93
93
|
reading wins. */
|
|
94
94
|
const brand = brandFor(location.pathname, navbar?.title);
|
|
95
95
|
const defaultWordmark = footerBrand?.wordmark || 'Conduction';
|
|
@@ -389,7 +389,7 @@ export default function Footer() {
|
|
|
389
389
|
</span>
|
|
390
390
|
</div>
|
|
391
391
|
<div className="socials">
|
|
392
|
-
<a href="https://
|
|
392
|
+
<a href="https://codeberg.org/Conduction" aria-label="GitHub" target="_blank" rel="noopener noreferrer">
|
|
393
393
|
<svg viewBox="0 0 24 24" aria-hidden="true">
|
|
394
394
|
<path className="filled" d="M12 2a10 10 0 0 0-3.16 19.49c.5.09.68-.22.68-.48v-1.7c-2.78.6-3.37-1.34-3.37-1.34-.45-1.16-1.11-1.47-1.11-1.47-.91-.62.07-.61.07-.61 1 .07 1.53 1.04 1.53 1.04.9 1.53 2.36 1.09 2.93.83.09-.65.35-1.09.63-1.34-2.22-.25-4.55-1.11-4.55-4.94 0-1.09.39-1.98 1.03-2.68-.1-.25-.45-1.27.1-2.65 0 0 .84-.27 2.75 1.02a9.6 9.6 0 0 1 5 0c1.91-1.29 2.75-1.02 2.75-1.02.55 1.38.2 2.4.1 2.65.64.7 1.03 1.59 1.03 2.68 0 3.84-2.34 4.69-4.57 4.93.36.31.68.92.68 1.86v2.76c0 .27.18.58.69.48A10 10 0 0 0 12 2z"/>
|
|
395
395
|
</svg>
|
|
@@ -93,7 +93,7 @@ function NavItem({item, location, appVersion}) {
|
|
|
93
93
|
if (typeIs(item, 'github')) {
|
|
94
94
|
return (
|
|
95
95
|
<a
|
|
96
|
-
href={item.href || 'https://
|
|
96
|
+
href={item.href || 'https://codeberg.org/Conduction'}
|
|
97
97
|
className={styles.iconLink}
|
|
98
98
|
target="_blank"
|
|
99
99
|
rel="noopener noreferrer"
|
package/static/lib/hex-rain.js
CHANGED
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
/* 1 Register */ '<rect x="3" y="4" width="18" height="16" rx="2"/><path d="M3 9h18M9 4v16"/>',
|
|
12
12
|
/* 2 Connector */ '<circle cx="6" cy="12" r="3"/><circle cx="18" cy="6" r="3"/><circle cx="18" cy="18" r="3"/><path d="M9 12h9M9 12l9-6M9 12l9 6"/>',
|
|
13
13
|
/* 3 DocuDesk */ '<path d="M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z"/><path d="M14 2v6h6"/>',
|
|
14
|
-
/* 4
|
|
14
|
+
/* 4 LaunchPad */ '<rect x="3" y="3" width="7" height="9"/><rect x="14" y="3" width="7" height="5"/><rect x="14" y="12" width="7" height="9"/>',
|
|
15
15
|
/* 5 AI Bridge */ '<path d="M12 2a4 4 0 0 0-4 4v3"/><rect x="6" y="9" width="12" height="13" rx="2"/>',
|
|
16
16
|
/* 6 Pipeline */ '<path d="M4 7h6l4 5h6"/><path d="M4 17h6l4-5"/>',
|
|
17
17
|
/* 7 Calendar */ '<rect x="3" y="5" width="18" height="16" rx="2"/><path d="M3 10h18M8 3v4M16 3v4"/>',
|
|
@@ -22,7 +22,7 @@
|
|
|
22
22
|
];
|
|
23
23
|
const APP_NAMES = [
|
|
24
24
|
'OpenCatalogi', 'OpenRegister', 'OpenConnector', 'DocuDesk',
|
|
25
|
-
'
|
|
25
|
+
'LaunchPad', 'AI Bridge', 'PipelinQ', 'OpenCalendar',
|
|
26
26
|
'OpenSAML', 'OpenMail', 'NextCloud', 'OpenZaak',
|
|
27
27
|
];
|
|
28
28
|
const APP_COUNT = ICONS.length;
|
|
@@ -412,7 +412,7 @@ platform-diagram .box-wrap.app-builder {
|
|
|
412
412
|
|
|
413
413
|
/* App Builder list: when a COMING SOON-style badge is attached we treat the
|
|
414
414
|
cluster as a placeholder (dashed border, faded text). When no badge is
|
|
415
|
-
set the cluster styles like every other list —
|
|
415
|
+
set the cluster styles like every other list — OpenBuild is a real app. */
|
|
416
416
|
platform-diagram .box-wrap.app-builder.has-badge .box {
|
|
417
417
|
border-style: dashed;
|
|
418
418
|
background: var(--c-cobalt-50);
|