@conduction/docusaurus-preset 3.34.0 → 3.36.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 (55) hide show
  1. package/ANIMATION_ROADMAP.md +129 -0
  2. package/MISSING_COMPONENTS.md +13 -4
  3. package/package.json +3 -2
  4. package/src/components/AppMock/AppMock.jsx +14 -14
  5. package/src/components/AppMock/AppMock.module.css +1270 -7
  6. package/src/components/AppMock/__tests__/AppMock.render.test.js +148 -0
  7. package/src/components/AppMock/variants/AppVersionsMock.jsx +1 -1
  8. package/src/components/AppMock/variants/DeciDeskMock.jsx +47 -6
  9. package/src/components/AppMock/variants/DocuDeskMock.jsx +40 -10
  10. package/src/components/AppMock/variants/DoriathMock.jsx +29 -14
  11. package/src/components/AppMock/variants/HermiqMock.jsx +35 -15
  12. package/src/components/AppMock/variants/HrmqMock.jsx +46 -28
  13. package/src/components/AppMock/variants/LarpingAppMock.jsx +14 -4
  14. package/src/components/AppMock/variants/LaunchPadWidgetsMock.jsx +3 -3
  15. package/src/components/AppMock/variants/NLDesignMock.jsx +1 -1
  16. package/src/components/AppMock/variants/OpenBuildMock.jsx +21 -6
  17. package/src/components/AppMock/variants/OpenCatalogiMock.jsx +23 -4
  18. package/src/components/AppMock/variants/OpenConnectorMock.jsx +26 -4
  19. package/src/components/AppMock/variants/OpenRegisterMock.jsx +13 -2
  20. package/src/components/AppMock/variants/PlanixMock.jsx +1 -1
  21. package/src/components/AppMock/variants/ProcestMock.jsx +36 -9
  22. package/src/components/AppMock/variants/ScholiqMock.jsx +1 -1
  23. package/src/components/AppMock/variants/ShillinqMock.jsx +33 -17
  24. package/src/components/AppMock/variants/SoftwareCatalogMock.jsx +16 -6
  25. package/src/components/AppMock/variants/ZaakAfhandelAppMock.jsx +19 -4
  26. package/src/components/BuildMock/BuildMock.jsx +3 -3
  27. package/src/components/FeaturesPage/FeaturesPage.jsx +3 -3
  28. package/src/components/IntegrationIcon/registry.js +3 -3
  29. package/src/components/LeafCard/LeafCard.jsx +2 -2
  30. package/src/components/NextSteps/NextSteps.jsx +1 -1
  31. package/src/components/PartnerDirectory/PartnerDirectory.jsx +1 -1
  32. package/src/components/Pipeline/Pipeline.jsx +2 -2
  33. package/src/components/PlatformOverview/PlatformOverview.module.css +1 -1
  34. package/src/components/SidebarMock/SidebarMock.jsx +38 -11
  35. package/src/components/SidebarMock/SidebarMock.module.css +1 -1
  36. package/src/components/SidebarMock/__tests__/SidebarMock.render.test.js +115 -0
  37. package/src/components/SidebarMock/variants/DeciDeskDecision.jsx +1 -1
  38. package/src/components/SidebarMock/variants/DocuDeskPiiMap.jsx +1 -1
  39. package/src/components/SidebarMock/variants/DocuDeskSignatures.jsx +1 -1
  40. package/src/components/SidebarMock/variants/OpenConnectorRunDetail.jsx +1 -1
  41. package/src/components/SidebarMock/variants/ProcestTimeline.jsx +1 -1
  42. package/src/components/SidebarMock/variants/ProcestXWiki.jsx +2 -2
  43. package/src/components/SolutionCard/SolutionCard.jsx +1 -1
  44. package/src/components/WidgetMock/WidgetMock.jsx +37 -16
  45. package/src/components/WidgetMock/__tests__/WidgetMock.render.test.js +125 -0
  46. package/src/components/WidgetMock/variants/DeciDeskActions.jsx +1 -1
  47. package/src/components/WidgetMock/variants/DocuDeskAnonymise.jsx +7 -2
  48. package/src/components/WidgetMock/variants/DocuDeskPendingSign.jsx +1 -1
  49. package/src/components/WidgetMock/variants/OpenConnectorRuns.jsx +1 -1
  50. package/src/components/WidgetMock/variants/ProcestDueToday.jsx +1 -1
  51. package/src/components/WidgetMock/variants/ProcestWerkvoorraad.jsx +1 -1
  52. package/src/components/WidgetShelf/WidgetShelf.jsx +1 -1
  53. package/src/data/apps-registry.js +15 -15
  54. package/src/diagrams/cn-pair.js +1 -1
  55. package/src/theme/brand.jsx +2 -2
@@ -0,0 +1,125 @@
1
+ /**
2
+ * WidgetMock.render.test.js — renders the real <WidgetMock> JSX to
3
+ * static markup (the SSR path Docusaurus takes at build time) and
4
+ * asserts on the output: every kind renders, the wave-5 `running`
5
+ * plumbing puts `.static` on the frame, the ten list-shaped variants
6
+ * carry the shared list-refresh scope (`.wmLive`) + unread badge,
7
+ * the non-list variants opt out, and the anonymise dropzone exposes
8
+ * its marching-ants + file-drop hooks.
9
+ *
10
+ * Uses the same esbuild-bundle-then-renderToStaticMarkup technique
11
+ * as AppMock.render.test.js. CSS modules are stubbed with an identity
12
+ * proxy (styles.foo → 'foo').
13
+ */
14
+
15
+ 'use strict';
16
+
17
+ const test = require('node:test');
18
+ const {before, after} = test;
19
+ const assert = require('node:assert/strict');
20
+ const path = require('node:path');
21
+ const fs = require('node:fs/promises');
22
+ const {build} = require('esbuild');
23
+ const React = require('react');
24
+ const {renderToStaticMarkup} = require('react-dom/server');
25
+
26
+ const COMPONENT = path.resolve(__dirname, '..', 'WidgetMock.jsx');
27
+ const PRESET_ROOT = path.resolve(__dirname, '..', '..', '..', '..');
28
+ const SCRATCH = path.join(PRESET_ROOT, '.tmp-widget-mock-test');
29
+
30
+ /* Must stay in sync with the VARIANTS map in WidgetMock.jsx. */
31
+ const LIST_KINDS = [
32
+ 'docudesk-pending-sign', 'procest-werkvoorraad', 'procest-due-today',
33
+ 'opencatalogi-publications', 'openconnector-runs', 'decidesk-actions',
34
+ 'pipelinq-deals', 'nextcloud-mail', 'nextcloud-files', 'nextcloud-rss',
35
+ ];
36
+ const NON_LIST_KINDS = [
37
+ 'docudesk-anonymise', 'openregister-activity', 'nextcloud-calendar',
38
+ 'nextcloud-decks',
39
+ ];
40
+ const KINDS = [...LIST_KINDS, ...NON_LIST_KINDS];
41
+
42
+ const cssModuleStub = {
43
+ name: 'css-module-stub',
44
+ setup(b) {
45
+ b.onResolve({filter: /\.module\.css$/}, (args) => ({path: args.path, namespace: 'css-stub'}));
46
+ b.onLoad({filter: /.*/, namespace: 'css-stub'}, () => ({
47
+ contents: 'export default new Proxy({}, {get: (_, p) => p});',
48
+ loader: 'js',
49
+ }));
50
+ },
51
+ };
52
+
53
+ let WidgetMock;
54
+
55
+ before(async () => {
56
+ await fs.mkdir(SCRATCH, {recursive: true});
57
+ const tmpDir = await fs.mkdtemp(path.join(SCRATCH, 'run-'));
58
+ const outFile = path.join(tmpDir, 'bundle.cjs');
59
+ await build({
60
+ entryPoints: [COMPONENT],
61
+ outfile: outFile,
62
+ bundle: true,
63
+ format: 'cjs',
64
+ jsx: 'automatic',
65
+ jsxImportSource: 'react',
66
+ tsconfigRaw: {compilerOptions: {jsx: 'react-jsx', jsxImportSource: 'react'}},
67
+ platform: 'node',
68
+ external: ['react'],
69
+ plugins: [cssModuleStub],
70
+ logLevel: 'warning',
71
+ });
72
+ delete require.cache[require.resolve(outFile)];
73
+ WidgetMock = require(outFile).default;
74
+ });
75
+
76
+ after(async () => {
77
+ await fs.rm(SCRATCH, {recursive: true, force: true});
78
+ });
79
+
80
+ function render(props) {
81
+ return renderToStaticMarkup(React.createElement(WidgetMock, props));
82
+ }
83
+
84
+ test('SSR smoke: every kind renders a frame, none falls through to Unknown widget', () => {
85
+ for (const kind of KINDS) {
86
+ const html = render({kind});
87
+ assert.match(html, /wmFrame/, `${kind}: frame missing`);
88
+ assert.doesNotMatch(html, /Unknown widget/, `${kind}: fell through to the unknown branch`);
89
+ }
90
+ });
91
+
92
+ test('running={false} adds the static class to the frame; default omits it', () => {
93
+ for (const kind of KINDS) {
94
+ assert.match(render({kind, running: false}), /wmFrame[^"]*static/, `${kind}: no static frame`);
95
+ assert.doesNotMatch(render({kind}), /\bstatic\b/, `${kind}: static leaked into a running frame`);
96
+ }
97
+ });
98
+
99
+ test('the ten list variants carry the wmLive refresh scope and the unread badge', () => {
100
+ for (const kind of LIST_KINDS) {
101
+ const html = render({kind});
102
+ assert.match(html, /wmFrame[^"]*wmLive/, `${kind}: missing wmLive scope`);
103
+ assert.match(html, /class="wmBadge"/, `${kind}: missing unread badge`);
104
+ assert.match(html, /class="list"/, `${kind}: wmLive on a variant without a .list`);
105
+ }
106
+ });
107
+
108
+ test('non-list variants opt out of the refresh primitive', () => {
109
+ for (const kind of NON_LIST_KINDS) {
110
+ const html = render({kind});
111
+ assert.doesNotMatch(html, /wmLive/, `${kind}: wmLive on a non-list variant`);
112
+ assert.doesNotMatch(html, /wmBadge/, `${kind}: badge on a non-list variant`);
113
+ }
114
+ });
115
+
116
+ test('docudesk-anonymise: the dropzone carries the zoneLive scope and the dropping file hex', () => {
117
+ const html = render({kind: 'docudesk-anonymise'});
118
+ assert.match(html, /w w-upload zoneLive/);
119
+ assert.match(html, /class="zoneFile"/);
120
+ assert.match(html, /class="zone"/);
121
+ });
122
+
123
+ test('caption renders the variant label', () => {
124
+ assert.match(render({kind: 'procest-werkvoorraad', caption: true}), /Dossiq · Werkvoorraad/);
125
+ });
@@ -1,5 +1,5 @@
1
1
  /**
2
- * DeciDesk · Action items widget.
2
+ * Decidiq · Action items widget.
3
3
  *
4
4
  * Action items assigned to the viewer, sorted by due date. .w-jira
5
5
  * atom: id slot is the source decision, pip slot is status (orange =
@@ -1,21 +1,26 @@
1
1
  /**
2
- * DocuDesk · Anonymise drop widget.
2
+ * Filinq · Anonymise drop widget.
3
3
  *
4
4
  * Drop a document into the dashboard tile, get back a redacted copy.
5
5
  * Visual: dashed cobalt drop-zone with a hex glyph. Status-pill is
6
6
  * absent: this widget is action-first, not status-first.
7
+ *
8
+ * Animation (wave 5, `.zoneLive`): the dashed border marches, a file
9
+ * hex drops into the zone, and the zone flashes mint as the redacted
10
+ * copy is confirmed. Static frames show the resting dropzone.
7
11
  */
8
12
  import React from 'react';
9
13
  import styles from '../../AppMock/AppMock.module.css';
10
14
 
11
15
  export default function DocuDeskAnonymise() {
12
16
  return (
13
- <div className={[styles.w, styles['w-upload']].join(' ')}>
17
+ <div className={[styles.w, styles['w-upload'], styles.zoneLive].join(' ')}>
14
18
  <div className={styles.wHead}>
15
19
  <div className={styles.h}></div>
16
20
  <div className={styles.t}></div>
17
21
  </div>
18
22
  <div className={styles.zone}>
23
+ <div className={styles.zoneFile}></div>
19
24
  <div className={styles.ico}></div>
20
25
  <div className={styles.label}></div>
21
26
  </div>
@@ -1,5 +1,5 @@
1
1
  /**
2
- * DocuDesk · Pending signatures widget.
2
+ * Filinq · Pending signatures widget.
3
3
  *
4
4
  * Documents waiting on someone's signature, ranked by oldest. Reuses
5
5
  * the .w-jira atom (id + title + status pip): id slot reads as a
@@ -1,5 +1,5 @@
1
1
  /**
2
- * OpenConnector · Recent runs widget.
2
+ * Integriq · Recent runs widget.
3
3
  *
4
4
  * Last few integration runs with status pip (mint = success, orange =
5
5
  * partial, red = failed, cobalt-200 = scheduled). Reuses .w-jira.
@@ -1,5 +1,5 @@
1
1
  /**
2
- * Procest · Due today widget.
2
+ * Dossiq · Due today widget.
3
3
  *
4
4
  * Cases whose deadline lands today or earlier. Reuses .w-werkvoorraad
5
5
  * but with more late items in red and one orange-active to read as
@@ -1,5 +1,5 @@
1
1
  /**
2
- * Procest · Werkvoorraad widget.
2
+ * Dossiq · Werkvoorraad widget.
3
3
  *
4
4
  * The case worker's queue, with stage pip on the left, case title in
5
5
  * the middle, owner avatar on the right. .now = active stage in
@@ -16,7 +16,7 @@
16
16
  * <WidgetShelf
17
17
  * eyebrow="Widgets we ship"
18
18
  * title="On every Nextcloud dashboard."
19
- * lede="Install Procest and your team gets these widgets..."
19
+ * lede="Install Dossiq and your team gets these widgets..."
20
20
  * widgets={[
21
21
  * {
22
22
  * title: 'Werkvoorraad',
@@ -29,26 +29,26 @@
29
29
  export const APPS_REGISTRY = {
30
30
  opencatalogi: {slug: 'opencatalogi', name: 'OpenCatalogi', category: 'Data', productHref: '/apps/opencatalogi', docsHref: 'https://opencatalogi.conduction.nl', academyHref: '/academy?app=opencatalogi'},
31
31
  openregister: {slug: 'openregister', name: 'OpenRegister', category: 'Data', productHref: '/apps/openregister', docsHref: 'https://openregister.conduction.nl', academyHref: '/academy?app=openregister'},
32
- openconnector: {slug: 'openconnector', name: 'OpenConnector', category: 'Connectors', productHref: '/apps/openconnector', docsHref: 'https://openconnector.conduction.nl', academyHref: '/academy?app=openconnector'},
33
- docudesk: {slug: 'docudesk', name: 'DocuDesk', category: 'Documents', productHref: '/apps/docudesk', docsHref: 'https://docudesk.conduction.nl', academyHref: '/academy?app=docudesk'},
32
+ openconnector: {slug: 'openconnector', name: 'Integriq', category: 'Connectors', productHref: '/apps/openconnector', docsHref: 'https://openconnector.conduction.nl', academyHref: '/academy?app=openconnector'},
33
+ docudesk: {slug: 'docudesk', name: 'Filinq', category: 'Documents', productHref: '/apps/docudesk', docsHref: 'https://docudesk.conduction.nl', 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://zaakafhandelapp.conduction.nl', academyHref: '/academy?app=zaakafhandelapp'},
36
36
  pipelinq: {slug: 'pipelinq', name: 'PipelinQ', category: 'Processes', productHref: '/apps/pipelinq', docsHref: 'https://pipelinq.conduction.nl', academyHref: '/academy?app=pipelinq'},
37
- procest: {slug: 'procest', name: 'Procest', category: 'Processes', productHref: '/apps/procest', docsHref: 'https://procest.conduction.nl', academyHref: '/academy?app=procest'},
38
- decidesk: {slug: 'decidesk', name: 'DeciDesk', category: 'Processes', productHref: '/apps/decidesk', docsHref: 'https://decidesk.conduction.nl', academyHref: '/academy?app=decidesk'},
39
- softwarecatalog: {slug: 'softwarecatalog', name: 'SoftwareCatalog', category: 'Data', productHref: '/apps/softwarecatalog', docsHref: 'https://softwarecatalog.conduction.nl', academyHref: '/academy?app=softwarecatalog'},
40
- larpingapp: {slug: 'larpingapp', name: 'LarpingApp', category: 'Processes', productHref: '/apps/larpingapp', docsHref: 'https://larpingapp.conduction.nl', academyHref: '/academy?app=larpingapp'},
41
- nldesign: {slug: 'nldesign', name: 'NLDesign', category: 'Documents', productHref: '/apps/nldesign', docsHref: 'https://nldesign.conduction.nl', academyHref: '/academy?app=nldesign'},
37
+ procest: {slug: 'procest', name: 'Dossiq', category: 'Processes', productHref: '/apps/procest', docsHref: 'https://procest.conduction.nl', academyHref: '/academy?app=procest'},
38
+ decidesk: {slug: 'decidesk', name: 'Decidiq', category: 'Processes', productHref: '/apps/decidesk', docsHref: 'https://decidesk.conduction.nl', academyHref: '/academy?app=decidesk'},
39
+ softwarecatalog: {slug: 'softwarecatalog', name: 'Stackiq', category: 'Data', productHref: '/apps/softwarecatalog', docsHref: 'https://softwarecatalog.conduction.nl', academyHref: '/academy?app=softwarecatalog'},
40
+ larpingapp: {slug: 'larpingapp', name: 'Larpinq', category: 'Processes', productHref: '/apps/larpingapp', docsHref: 'https://larpingapp.conduction.nl', academyHref: '/academy?app=larpingapp'},
41
+ nldesign: {slug: 'nldesign', name: 'Thematiq', category: 'Documents', productHref: '/apps/nldesign', docsHref: 'https://nldesign.conduction.nl', academyHref: '/academy?app=nldesign'},
42
42
  shillinq: {slug: 'shillinq', name: 'Shillinq', category: 'Processes', productHref: '/apps/shillinq', docsHref: 'https://shillinq.conduction.nl', academyHref: '/academy?app=shillinq'},
43
- openbuild: {slug: 'openbuild', name: 'OpenBuild', category: 'Processes', productHref: '/apps/openbuild', docsHref: 'https://openbuild.conduction.nl', academyHref: '/academy?app=openbuild'},
44
- doriath: {slug: 'doriath', name: 'Doriath', category: 'Connectors', productHref: '/apps/doriath', docsHref: 'https://doriath.conduction.nl', academyHref: '/academy?app=doriath'},
45
- 'app-versions': {slug: 'app-versions', name: 'App Versions', category: 'Data', productHref: '/apps/app-versions', docsHref: 'https://app-versions.conduction.nl', academyHref: '/academy?app=app-versions'},
43
+ openbuild: {slug: 'openbuild', name: 'Buildiq', category: 'Processes', productHref: '/apps/openbuild', docsHref: 'https://openbuild.conduction.nl', academyHref: '/academy?app=openbuild'},
44
+ doriath: {slug: 'doriath', name: 'Keepiq', category: 'Connectors', productHref: '/apps/doriath', docsHref: 'https://doriath.conduction.nl', academyHref: '/academy?app=doriath'},
45
+ 'app-versions': {slug: 'app-versions', name: 'Versioniq', category: 'Data', productHref: '/apps/app-versions', docsHref: 'https://app-versions.conduction.nl', academyHref: '/academy?app=app-versions'},
46
46
  hermiq: {slug: 'hermiq', name: 'Hermiq', category: 'AI', productHref: '/apps/hermiq', docsHref: 'https://hermiq.conduction.nl', academyHref: '/academy?app=hermiq'},
47
- hrmq: {slug: 'hrmq', name: 'HRMQ', category: 'Processes', productHref: '/apps/hrmq', docsHref: 'https://hrmq.conduction.nl', academyHref: '/academy?app=hrmq'},
48
- openanonymiser: {slug: 'openanonymiser', name: 'OpenAnonymiser', category: 'Documents', productHref: '/apps/openanonymiser', docsHref: 'https://openanonymiser.conduction.nl', academyHref: '/academy?app=openanonymiser'},
49
- planix: {slug: 'planix', name: 'Planix', category: 'Processes', productHref: '/apps/planix', docsHref: 'https://planix.conduction.nl', academyHref: '/academy?app=planix'},
47
+ hrmq: {slug: 'hrmq', name: 'Humaniq', category: 'Processes', productHref: '/apps/hrmq', docsHref: 'https://hrmq.conduction.nl', academyHref: '/academy?app=hrmq'},
48
+ openanonymiser: {slug: 'openanonymiser', name: 'Anonymiq', category: 'Documents', productHref: '/apps/openanonymiser', docsHref: 'https://openanonymiser.conduction.nl', academyHref: '/academy?app=openanonymiser'},
49
+ planix: {slug: 'planix', name: 'Planiq', category: 'Processes', productHref: '/apps/planix', docsHref: 'https://planix.conduction.nl', academyHref: '/academy?app=planix'},
50
50
  portaliq: {slug: 'portaliq', name: 'Portaliq', category: 'Processes', productHref: '/apps/portaliq', docsHref: 'https://portaliq.conduction.nl', academyHref: '/academy?app=portaliq'},
51
- scholiq: {slug: 'scholiq', name: 'Scholiq', category: 'Processes', productHref: '/apps/scholiq', docsHref: 'https://scholiq.conduction.nl', academyHref: '/academy?app=scholiq'},
51
+ scholiq: {slug: 'scholiq', name: 'Learniq', category: 'Processes', productHref: '/apps/scholiq', docsHref: 'https://scholiq.conduction.nl', academyHref: '/academy?app=scholiq'},
52
52
  };
53
53
 
54
54
  /**
@@ -93,7 +93,7 @@ export function getApps(slugs = []) {
93
93
  }
94
94
 
95
95
  /**
96
- * Resolve a display-name (e.g. "OpenCatalogi", "DocuDesk", "LaunchPad")
96
+ * Resolve a display-name (e.g. "OpenCatalogi", "Filinq", "LaunchPad")
97
97
  * to its product page href, or undefined when the name is not in the
98
98
  * registry. Used by partner cards / sidecards to turn the apps-shipped
99
99
  * chip row into a clickable link list. Names like "Nextcloud" that
@@ -12,7 +12,7 @@
12
12
  * right-label="xWiki"
13
13
  * right-caption="xwiki.example"
14
14
  * right-color="cobalt-700"
15
- * bridge-label="OpenConnector integration">
15
+ * bridge-label="Integriq integration">
16
16
  * <svg slot="left-icon" viewBox="0 0 24 24">...</svg>
17
17
  * <svg slot="right-icon" viewBox="0 0 24 24">...</svg>
18
18
  * </cn-pair>
@@ -68,12 +68,12 @@ export function brandFor(pathname, title) {
68
68
  * cobalt-400 / regular weight and the rest in blue-cobalt / bold:
69
69
  *
70
70
  * <span class="light">Open</span>Register
71
- * <span class="light">Docu</span>Desk
71
+ * <span class="light">Pipe</span>linQ
72
72
  * <span class="light">My</span>Dash
73
73
  *
74
74
  * This list covers the prefixes used across the Conduction fleet.
75
75
  * Sites whose wordmark doesn't start with one of these (e.g. Shillinq,
76
- * Decidesk) keep the whole wordmark in blue-cobalt unless they pass
76
+ * Hermiq) keep the whole wordmark in blue-cobalt unless they pass
77
77
  * an explicit `navbar.brandPrefix` to override.
78
78
  */
79
79
  const PRODUCT_PREFIXES = [