@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
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * <BuildMock />
3
3
  *
4
- * Token-built abstract of the OpenBuild "make it yours" moment: the
4
+ * Token-built abstract of the Buildiq "make it yours" moment: the
5
5
  * orange edit button gets pressed, a small component palette opens, a
6
6
  * widget is picked and dragged onto the page, and it snaps into the
7
7
  * empty layout slot. Loops every ~8 seconds. Used on every app's
@@ -9,7 +9,7 @@
9
9
  *
10
10
  * Same abstraction level as <AppMock>: greeked content, tokens only.
11
11
  * The orange FAB is this component's single orange accent (it *is*
12
- * the OpenBuild edit button).
12
+ * the Buildiq edit button).
13
13
  *
14
14
  * `prefers-reduced-motion: reduce` (and `running={false}`) renders
15
15
  * the static end state: palette closed, cursor gone, the dragged
@@ -75,7 +75,7 @@ export default function BuildMock({size = 'md', caption, running = true, classNa
75
75
  <span className={styles.paletteTile} />
76
76
  </div>
77
77
 
78
- {/* The OpenBuild edit button — the one orange accent. */}
78
+ {/* The Buildiq edit button — the one orange accent. */}
79
79
  <div className={styles.fab}>
80
80
  <svg viewBox="0 0 24 24" aria-hidden="true">
81
81
  <path d="M12 20h9M16.5 3.5a2.1 2.1 0 0 1 3 3L7 19l-4 1 1-4L16.5 3.5z" />
@@ -32,9 +32,9 @@ import FeatureGrid from '../FeatureGrid/FeatureGrid.jsx';
32
32
  const PROVIDER_NAMES = {
33
33
  openregister: 'OpenRegister',
34
34
  opencatalogi: 'OpenCatalogi',
35
- openconnector: 'OpenConnector',
36
- docudesk: 'DocuDesk',
37
- nldesign: 'NLDesign',
35
+ openconnector: 'Integriq',
36
+ docudesk: 'Filinq',
37
+ nldesign: 'Thematiq',
38
38
  };
39
39
 
40
40
  function providerCredit(providedBy, locale) {
@@ -17,7 +17,7 @@
17
17
  * Conduction integrates with (xWiki, n8n, Windmill, OpenProject,
18
18
  * Keycloak).
19
19
  * llm — large-language-model providers we consume via
20
- * OpenConnector / DocuDesk (Claude, Mistral, Ollama, OpenAI,
20
+ * Integriq / Filinq (Claude, Mistral, Ollama, OpenAI,
21
21
  * Gemini).
22
22
  * conduction-ext — external apps in the Conduction Nextcloud
23
23
  * ecosystem (OpenTalk, Matrix, Mattermost, OpenExchange).
@@ -146,7 +146,7 @@ export const INTEGRATIONS = {
146
146
 
147
147
  export const INTEGRATION_CATEGORIES = {
148
148
  'nextcloud-bundled': { label: 'Nextcloud bundled', desc: 'Surfaces every Nextcloud workspace already ships.' },
149
- 'workflow': { label: 'Workflow & auth', desc: 'Third-party tools we wire into Conduction apps via OpenConnector.' },
150
- 'llm': { label: 'LLM providers', desc: 'Models we call from OpenConnector and DocuDesk.' },
149
+ 'workflow': { label: 'Workflow & auth', desc: 'Third-party tools we wire into Conduction apps via Integriq.' },
150
+ 'llm': { label: 'LLM providers', desc: 'Models we call from Integriq and Filinq.' },
151
151
  'conduction-ext': { label: 'Conduction extensions', desc: 'Adjacent apps in the Conduction Nextcloud ecosystem.' },
152
152
  };
@@ -16,7 +16,7 @@
16
16
  * orange for the one accent-leaf when grouped). Falls back to the
17
17
  * `id` initial when no icon is given.
18
18
  * - Status pill colours: green = backend-ready, amber = stub,
19
- * cobalt = external (OpenConnector-routed), grey = built-in.
19
+ * cobalt = external (Integriq-routed), grey = built-in.
20
20
  *
21
21
  * Usage in MDX:
22
22
  *
@@ -46,7 +46,7 @@ import styles from './LeafCard.module.css';
46
46
  const STATUS_LABELS = {
47
47
  'backend-ready': 'Backend ready',
48
48
  'stub': 'Provider stub',
49
- 'external': 'External (OpenConnector)',
49
+ 'external': 'External (Integriq)',
50
50
  'built-in': 'Built-in',
51
51
  };
52
52
 
@@ -23,7 +23,7 @@
23
23
  * <NextStep
24
24
  * href="/apps/docudesk"
25
25
  * title="Documenten lakken"
26
- * cta="Bekijk DocuDesk"
26
+ * cta="Bekijk Filinq"
27
27
  * >
28
28
  * Anonimiseer privacygevoelige passages voor publicatie.
29
29
  * </NextStep>
@@ -23,7 +23,7 @@
23
23
  * {href: '/partners/acato', tier: 'certified', name: 'Acato',
24
24
  * logo: '/img/partners/acato.png',
25
25
  * summary: <>Digital agency uit Almere…</>,
26
- * apps: ['OpenCatalogi', 'OpenRegister', 'OpenConnector'],
26
+ * apps: ['OpenCatalogi', 'OpenRegister', 'Integriq'],
27
27
  * solutions: ['woo']},
28
28
  * …
29
29
  * ]}
@@ -10,7 +10,7 @@
10
10
  * threading through every hex equator.
11
11
  *
12
12
  * Family palette follows the locked PRISM-FAMILY POLICY in tokens.css:
13
- * mint integrate / connect (OpenConnector)
13
+ * mint integrate / connect (Integriq)
14
14
  * forest data / registers (OpenRegister)
15
15
  * terracotta documents / search (OpenCatalogi)
16
16
  * lavender process / views (LaunchPad)
@@ -36,7 +36,7 @@
36
36
  * {label: 'Legacy', icon: 'legacy'},
37
37
  * ]}}
38
38
  * steps={[
39
- * {number: '01', kicker: 'Ingest', name: 'OpenConnector',
39
+ * {number: '01', kicker: 'Ingest', name: 'Integriq',
40
40
  * caption: 'Pulls schemas, REST, SOAP, files.'},
41
41
  * {number: 'PLATFORM', name: 'Nextcloud', family: 'workspace',
42
42
  * pill: 'files · users · auth'},
@@ -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 OpenBuild extend visually below
9
+ orange-dashed flow lines around Buildiq 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
@@ -3,8 +3,8 @@
3
3
  *
4
4
  * Token-painted abstract of the Nextcloud right-side detail panel.
5
5
  * Each Conduction app registers tabs into specific Nextcloud
6
- * sidebars (Procest adds xWiki + Timeline tabs to the case sidebar,
7
- * DocuDesk adds Signatures + PII Map to the document sidebar, and
6
+ * sidebars (Dossiq adds xWiki + Timeline tabs to the case sidebar,
7
+ * Filinq adds Signatures + PII Map to the document sidebar, and
8
8
  * so on). A SidebarMock variant represents one such sidebar with
9
9
  * one tab active.
10
10
  *
@@ -53,7 +53,20 @@
53
53
  * .smFrame chrome so the
54
54
  * panel slots into
55
55
  * AppMock's .body layout
56
+ * - running: boolean (default true) — false freezes the panel
57
+ * animation on its settled
58
+ * end state (same rendering
59
+ * prefers-reduced-motion
60
+ * gives)
56
61
  * - className: string
62
+ *
63
+ * Animation (wave 5, `.sbLive` in AppMock.module.css): the panel
64
+ * slides in from the right, the head title/description wipe in, the
65
+ * active-tab underline travels from the neighbouring tab to the
66
+ * active one — positioned by the `--sb-ix` / `--sb-n` custom
67
+ * properties the component sets from the variant's active index —
68
+ * and the body rows land in a stagger. Base styles are the opened,
69
+ * settled panel.
57
70
  */
58
71
 
59
72
  import React from 'react';
@@ -85,13 +98,13 @@ import NextcloudActivity from './variants/NextcloudActivity.jsx';
85
98
  * SidebarMock renders that icon in the tab's .ico slot, tinted via
86
99
  * currentColor so active tabs read full-cobalt and inactive tabs
87
100
  * read muted-cobalt. The icon makes the tab self-documenting:
88
- * Procest's xWiki tab carries the xWiki icon, DocuDesk's Signatures
101
+ * Dossiq's xWiki tab carries the xWiki icon, Filinq's Signatures
89
102
  * tab carries an activity-style icon for "stuff happens here", etc.
90
103
  */
91
104
  const VARIANTS = {
92
105
  'procest-xwiki': {
93
106
  Component: ProcestXWiki,
94
- label: 'Procest · Case sidebar, xWiki tab',
107
+ label: 'Dossiq · Case sidebar, xWiki tab',
95
108
  tabs: [
96
109
  { id: 'activity', active: false, icon: 'activity' },
97
110
  { id: 'xwiki', active: true, icon: 'xwiki' },
@@ -101,7 +114,7 @@ const VARIANTS = {
101
114
  },
102
115
  'procest-timeline': {
103
116
  Component: ProcestTimeline,
104
- label: 'Procest · Case sidebar, Timeline tab',
117
+ label: 'Dossiq · Case sidebar, Timeline tab',
105
118
  tabs: [
106
119
  { id: 'activity', active: false, icon: 'activity' },
107
120
  { id: 'xwiki', active: false, icon: 'xwiki' },
@@ -111,7 +124,7 @@ const VARIANTS = {
111
124
  },
112
125
  'docudesk-signatures': {
113
126
  Component: DocuDeskSignatures,
114
- label: 'DocuDesk · Document sidebar, Signatures tab',
127
+ label: 'Filinq · Document sidebar, Signatures tab',
115
128
  tabs: [
116
129
  { id: 'activity', active: false, icon: 'activity' },
117
130
  { id: 'signatures', active: true, icon: 'mail' },
@@ -121,7 +134,7 @@ const VARIANTS = {
121
134
  },
122
135
  'docudesk-pii-map': {
123
136
  Component: DocuDeskPiiMap,
124
- label: 'DocuDesk · Document sidebar, PII map tab',
137
+ label: 'Filinq · Document sidebar, PII map tab',
125
138
  tabs: [
126
139
  { id: 'activity', active: false, icon: 'activity' },
127
140
  { id: 'signatures', active: false, icon: 'mail' },
@@ -149,7 +162,7 @@ const VARIANTS = {
149
162
  },
150
163
  'openconnector-run-detail': {
151
164
  Component: OpenConnectorRunDetail,
152
- label: 'OpenConnector · Run sidebar, Logs tab',
165
+ label: 'Integriq · Run sidebar, Logs tab',
153
166
  tabs: [
154
167
  { id: 'activity', active: false, icon: 'activity' },
155
168
  { id: 'logs', active: true, icon: 'n8n' },
@@ -158,7 +171,7 @@ const VARIANTS = {
158
171
  },
159
172
  'decidesk-decision': {
160
173
  Component: DeciDeskDecision,
161
- label: 'DeciDesk · Decision sidebar, Detail tab',
174
+ label: 'Decidiq · Decision sidebar, Detail tab',
162
175
  tabs: [
163
176
  { id: 'activity', active: false, icon: 'activity' },
164
177
  { id: 'detail', active: true, icon: 'files' },
@@ -175,7 +188,7 @@ const VARIANTS = {
175
188
  },
176
189
  };
177
190
 
178
- export default function SidebarMock({ kind, size = 'md', embedded = false, className }) {
191
+ export default function SidebarMock({ kind, size = 'md', embedded = false, running = true, className }) {
179
192
  const variant = VARIANTS[kind];
180
193
  if (!variant) {
181
194
  return (
@@ -187,8 +200,19 @@ export default function SidebarMock({ kind, size = 'md', embedded = false, class
187
200
  );
188
201
  }
189
202
  const { Component, tabs } = variant;
203
+ /* The travelling underline needs the active tab's index and the tab
204
+ count; both ride custom properties so the CSS can compute the
205
+ resting offset. It slides in from the neighbouring tab — from the
206
+ left normally, from the right when the first tab is the active
207
+ one (there is no left neighbour to come from). */
208
+ const activeIx = Math.max(0, tabs.findIndex((t) => t.active));
209
+ const underlineVars = {
210
+ '--sb-ix': activeIx,
211
+ '--sb-n': tabs.length,
212
+ '--sb-from': activeIx > 0 ? '-100%' : '100%',
213
+ };
190
214
  const panel = (
191
- <div className={[amStyles.detail, amStyles.rich].join(' ')}>
215
+ <div className={[amStyles.detail, amStyles.rich, amStyles.sbLive, !running && amStyles.static].filter(Boolean).join(' ')}>
192
216
  <div className={amStyles['sb-head']}>
193
217
  <div className={amStyles.ico}></div>
194
218
  <div className={amStyles.meta}>
@@ -209,6 +233,9 @@ export default function SidebarMock({ kind, size = 'md', embedded = false, class
209
233
  <div className={amStyles.l}></div>
210
234
  </div>
211
235
  ))}
236
+ {/* Travelling active-tab underline — rests under the active
237
+ tab; the loop replays the travel from its neighbour. */}
238
+ <div className={amStyles['sb-underline']} style={underlineVars}></div>
212
239
  </div>
213
240
  )}
214
241
  <div className={amStyles['sb-body']}>
@@ -185,7 +185,7 @@
185
185
  .am .sb-body .smLog.warn .ts { background: var(--c-orange-knvb); }
186
186
  .am .sb-body .smLog.error .ts { background: var(--c-red-vermillion); }
187
187
 
188
- /* PII redaction map (DocuDesk PII tab). Inline pills marking spans
188
+ /* PII redaction map (Filinq PII tab). Inline pills marking spans
189
189
  in a paragraph; .redacted = applied (red), .suggested = proposed
190
190
  (orange), default = neutral text. */
191
191
  .am .sb-body .smPiiBlock {
@@ -0,0 +1,115 @@
1
+ /**
2
+ * SidebarMock.render.test.js — renders the real <SidebarMock> JSX to
3
+ * static markup and asserts on the wave-5 animation plumbing: the
4
+ * panel carries the `.sbLive` scope, `running={false}` puts `.static`
5
+ * on the panel itself (both standalone and embedded), and the
6
+ * travelling active-tab underline is present with the `--sb-ix` /
7
+ * `--sb-n` / `--sb-from` custom properties derived from the
8
+ * variant's active tab index.
9
+ *
10
+ * Same esbuild-bundle-then-renderToStaticMarkup technique as
11
+ * AppMock.render.test.js; CSS modules stubbed with an identity proxy.
12
+ */
13
+
14
+ 'use strict';
15
+
16
+ const test = require('node:test');
17
+ const {before, after} = test;
18
+ const assert = require('node:assert/strict');
19
+ const path = require('node:path');
20
+ const fs = require('node:fs/promises');
21
+ const {build} = require('esbuild');
22
+ const React = require('react');
23
+ const {renderToStaticMarkup} = require('react-dom/server');
24
+
25
+ const COMPONENT = path.resolve(__dirname, '..', 'SidebarMock.jsx');
26
+ const PRESET_ROOT = path.resolve(__dirname, '..', '..', '..', '..');
27
+ const SCRATCH = path.join(PRESET_ROOT, '.tmp-sidebar-mock-test');
28
+
29
+ /* Must stay in sync with the VARIANTS map in SidebarMock.jsx.
30
+ activeIx mirrors each variant's active-tab index. */
31
+ const KINDS = {
32
+ 'procest-xwiki': 1,
33
+ 'procest-timeline': 2,
34
+ 'docudesk-signatures': 1,
35
+ 'docudesk-pii-map': 2,
36
+ 'openregister-metadata': 1,
37
+ 'opencatalogi-publication-history': 1,
38
+ 'openconnector-run-detail': 1,
39
+ 'decidesk-decision': 1,
40
+ 'nextcloud-activity': 0,
41
+ };
42
+
43
+ const cssModuleStub = {
44
+ name: 'css-module-stub',
45
+ setup(b) {
46
+ b.onResolve({filter: /\.module\.css$/}, (args) => ({path: args.path, namespace: 'css-stub'}));
47
+ b.onLoad({filter: /.*/, namespace: 'css-stub'}, () => ({
48
+ contents: 'export default new Proxy({}, {get: (_, p) => p});',
49
+ loader: 'js',
50
+ }));
51
+ },
52
+ };
53
+
54
+ let SidebarMock;
55
+
56
+ before(async () => {
57
+ await fs.mkdir(SCRATCH, {recursive: true});
58
+ const tmpDir = await fs.mkdtemp(path.join(SCRATCH, 'run-'));
59
+ const outFile = path.join(tmpDir, 'bundle.cjs');
60
+ await build({
61
+ entryPoints: [COMPONENT],
62
+ outfile: outFile,
63
+ bundle: true,
64
+ format: 'cjs',
65
+ jsx: 'automatic',
66
+ jsxImportSource: 'react',
67
+ tsconfigRaw: {compilerOptions: {jsx: 'react-jsx', jsxImportSource: 'react'}},
68
+ platform: 'node',
69
+ external: ['react'],
70
+ plugins: [cssModuleStub],
71
+ logLevel: 'warning',
72
+ });
73
+ delete require.cache[require.resolve(outFile)];
74
+ SidebarMock = require(outFile).default;
75
+ });
76
+
77
+ after(async () => {
78
+ await fs.rm(SCRATCH, {recursive: true, force: true});
79
+ });
80
+
81
+ function render(props) {
82
+ return renderToStaticMarkup(React.createElement(SidebarMock, props));
83
+ }
84
+
85
+ test('SSR smoke: every kind renders the live panel, none falls through to Unknown sidebar', () => {
86
+ for (const kind of Object.keys(KINDS)) {
87
+ const html = render({kind});
88
+ assert.match(html, /detail rich sbLive/, `${kind}: missing sbLive panel scope`);
89
+ assert.doesNotMatch(html, /Unknown sidebar/, `${kind}: fell through to the unknown branch`);
90
+ }
91
+ });
92
+
93
+ test('running={false} puts static on the panel — standalone and embedded', () => {
94
+ assert.match(render({kind: 'procest-xwiki', running: false}), /detail rich sbLive static/);
95
+ assert.match(render({kind: 'procest-xwiki', running: false, embedded: true}), /detail rich sbLive static/);
96
+ assert.doesNotMatch(render({kind: 'procest-xwiki'}), /\bstatic\b/);
97
+ });
98
+
99
+ test('the travelling underline carries --sb-ix / --sb-n / --sb-from per variant', () => {
100
+ for (const [kind, ix] of Object.entries(KINDS)) {
101
+ const html = render({kind});
102
+ assert.match(html, /class="sb-underline"/, `${kind}: underline missing`);
103
+ assert.match(html, new RegExp(`--sb-ix:${ix}[;"]`), `${kind}: wrong active index`);
104
+ assert.match(html, /--sb-n:[0-9]/, `${kind}: tab count missing`);
105
+ const from = ix > 0 ? '-100%' : '100%';
106
+ assert.match(html, new RegExp(`--sb-from:${from}`), `${kind}: wrong travel origin`);
107
+ }
108
+ });
109
+
110
+ test('embedded mode drops the standalone frame but keeps the live panel', () => {
111
+ const html = render({kind: 'openregister-metadata', embedded: true});
112
+ assert.doesNotMatch(html, /smFrame/);
113
+ assert.match(html, /detail rich sbLive/);
114
+ assert.match(html, /class="sb-underline"/);
115
+ });
@@ -1,5 +1,5 @@
1
1
  /**
2
- * DeciDesk · decision sidebar, Detail tab.
2
+ * Decidiq · decision sidebar, Detail tab.
3
3
  *
4
4
  * Body of a single decision: title, decision summary paragraph, then
5
5
  * structured fields (date, source meeting, decision-maker) and an
@@ -1,5 +1,5 @@
1
1
  /**
2
- * DocuDesk · document sidebar, PII map tab.
2
+ * Filinq · document sidebar, PII map tab.
3
3
  *
4
4
  * Inline pills marking redacted spans (red) and suggested redactions
5
5
  * (orange) within paragraphs. Reads as "here is what got covered up".
@@ -1,5 +1,5 @@
1
1
  /**
2
- * DocuDesk · document sidebar, Signatures tab.
2
+ * Filinq · document sidebar, Signatures tab.
3
3
  *
4
4
  * List of recipients with status pip: signed (mint), pending (orange),
5
5
  * blocked / declined (red). Avatar colour mix matches AppMock palette.
@@ -1,5 +1,5 @@
1
1
  /**
2
- * OpenConnector · run sidebar, Logs tab.
2
+ * Integriq · run sidebar, Logs tab.
3
3
  *
4
4
  * Single integration run inspected: header with run id and timing,
5
5
  * then a vertical log stream with severity-coded timestamps. Last
@@ -1,5 +1,5 @@
1
1
  /**
2
- * Procest · case sidebar, Timeline tab.
2
+ * Dossiq · case sidebar, Timeline tab.
3
3
  *
4
4
  * The case stage history vertical, with one done, one active in
5
5
  * orange, three to-do. Same .now / .late / .todo modifiers as the
@@ -1,7 +1,7 @@
1
1
  /**
2
- * Procest · case sidebar, xWiki tab.
2
+ * Dossiq · case sidebar, xWiki tab.
3
3
  *
4
- * The xWiki integration: Procest pulls the case-handling protocol
4
+ * The xWiki integration: Dossiq pulls the case-handling protocol
5
5
  * page out of xWiki and shows it next to the live case. Body reads
6
6
  * as wiki text: a heading, two paragraphs, a subheading, a list of
7
7
  * checked steps. Worth saying out loud since it is the integration
@@ -27,7 +27,7 @@
27
27
  * icon={<svg>...</svg>}
28
28
  * title="WOO compliance, by Friday."
29
29
  * outcome={<>A live WOO portal at your <span className="next-blue">Nextcloud</span>-hosted domain.</>}
30
- * builtOn={['OpenCatalogi', 'OpenRegister', 'OpenConnector']}
30
+ * builtOn={['OpenCatalogi', 'OpenRegister', 'Integriq']}
31
31
  * />
32
32
  * </SolutionGrid>
33
33
  */
@@ -2,7 +2,7 @@
2
2
  * <WidgetMock />
3
3
  *
4
4
  * Standalone abstract of a Nextcloud dashboard widget that a
5
- * Conduction app registers (DocuDesk anonymise, Procest werkvoorraad,
5
+ * Conduction app registers (Filinq anonymise, Dossiq werkvoorraad,
6
6
  * OpenRegister activity, etc.) plus a few of the stock Nextcloud
7
7
  * widgets we frame around (Mail, Calendar, Files, Decks, RSS).
8
8
  *
@@ -29,7 +29,19 @@
29
29
  * - caption: boolean — adds a small
30
30
  * label below
31
31
  * the frame
32
+ * - running: boolean (default true) — false freezes the widget's
33
+ * animation on its meaningful static end state (same
34
+ * rendering `prefers-reduced-motion: reduce` gives).
35
+ * The CSS `.static` class on the frame stops keyframes.
32
36
  * - className: string
37
+ *
38
+ * Every list-shaped variant (VARIANTS entries with `list: true`)
39
+ * shares one refresh primitive, styled in AppMock.module.css under
40
+ * `.wmLive`: a new row slides in at the top, the bottom row clips
41
+ * out, and the unread badge on the frame bumps as the row lands.
42
+ * Non-list variants (calendar grid, decks columns, activity graph,
43
+ * anonymise dropzone) opt out; the dropzone has its own `.zoneLive`
44
+ * marching-ants + file-drop treatment inside the variant itself.
33
45
  */
34
46
 
35
47
  import React from 'react';
@@ -52,23 +64,23 @@ import NextcloudDecks from './variants/NextcloudDecks.jsx';
52
64
  import NextcloudRss from './variants/NextcloudRss.jsx';
53
65
 
54
66
  const VARIANTS = {
55
- 'docudesk-anonymise': { Component: DocuDeskAnonymise, label: 'DocuDesk · Anonymise drop' },
56
- 'docudesk-pending-sign': { Component: DocuDeskPendingSign, label: 'DocuDesk · Pending signatures' },
57
- 'procest-werkvoorraad': { Component: ProcestWerkvoorraad, label: 'Procest · Werkvoorraad' },
58
- 'procest-due-today': { Component: ProcestDueToday, label: 'Procest · Due today' },
67
+ 'docudesk-anonymise': { Component: DocuDeskAnonymise, label: 'Filinq · Anonymise drop' },
68
+ 'docudesk-pending-sign': { Component: DocuDeskPendingSign, label: 'Filinq · Pending signatures', list: true },
69
+ 'procest-werkvoorraad': { Component: ProcestWerkvoorraad, label: 'Dossiq · Werkvoorraad', list: true },
70
+ 'procest-due-today': { Component: ProcestDueToday, label: 'Dossiq · Due today', list: true },
59
71
  'openregister-activity': { Component: OpenRegisterActivity, label: 'OpenRegister · Activity' },
60
- 'opencatalogi-publications':{ Component: OpenCatalogiPublications,label: 'OpenCatalogi · Recent publications' },
61
- 'openconnector-runs': { Component: OpenConnectorRuns, label: 'OpenConnector · Recent runs' },
62
- 'decidesk-actions': { Component: DeciDeskActions, label: 'DeciDesk · Action items' },
63
- 'pipelinq-deals': { Component: PipelinQDeals, label: 'PipelinQ · Deals closing' },
64
- 'nextcloud-mail': { Component: NextcloudMail, label: 'Nextcloud · Important mail' },
72
+ 'opencatalogi-publications':{ Component: OpenCatalogiPublications,label: 'OpenCatalogi · Recent publications', list: true },
73
+ 'openconnector-runs': { Component: OpenConnectorRuns, label: 'Integriq · Recent runs', list: true },
74
+ 'decidesk-actions': { Component: DeciDeskActions, label: 'Decidiq · Action items', list: true },
75
+ 'pipelinq-deals': { Component: PipelinQDeals, label: 'PipelinQ · Deals closing', list: true },
76
+ 'nextcloud-mail': { Component: NextcloudMail, label: 'Nextcloud · Important mail', list: true },
65
77
  'nextcloud-calendar': { Component: NextcloudCalendar, label: 'Nextcloud · Calendar' },
66
- 'nextcloud-files': { Component: NextcloudFiles, label: 'Nextcloud · Recent files' },
78
+ 'nextcloud-files': { Component: NextcloudFiles, label: 'Nextcloud · Recent files', list: true },
67
79
  'nextcloud-decks': { Component: NextcloudDecks, label: 'Nextcloud · Decks' },
68
- 'nextcloud-rss': { Component: NextcloudRss, label: 'Nextcloud · RSS feed' },
80
+ 'nextcloud-rss': { Component: NextcloudRss, label: 'Nextcloud · RSS feed', list: true },
69
81
  };
70
82
 
71
- export default function WidgetMock({ kind, size = 'md', caption = false, className }) {
83
+ export default function WidgetMock({ kind, size = 'md', caption = false, running = true, className }) {
72
84
  const variant = VARIANTS[kind];
73
85
  const wrap = [amStyles.am, styles.wm].filter(Boolean).join(' ');
74
86
  if (!variant) {
@@ -80,12 +92,21 @@ export default function WidgetMock({ kind, size = 'md', caption = false, classNa
80
92
  </div>
81
93
  );
82
94
  }
83
- const { Component, label } = variant;
95
+ const { Component, label, list } = variant;
96
+ const frameCls = [
97
+ styles.wmFrame,
98
+ styles[`wm-size-${size}`],
99
+ list && amStyles.wmLive,
100
+ !running && amStyles.static,
101
+ ].filter(Boolean).join(' ');
84
102
  return (
85
103
  <div className={wrap}>
86
104
  <figure className={[styles.wmFigure, className].filter(Boolean).join(' ')}>
87
- <div className={[styles.wmFrame, styles[`wm-size-${size}`]].filter(Boolean).join(' ')}>
88
- <Component />
105
+ <div className={frameCls}>
106
+ {/* Unread badge — list variants only; bumps when the fresh
107
+ row lands. Styled in AppMock.module.css (.wmBadge). */}
108
+ {list && <div className={amStyles.wmBadge}></div>}
109
+ <Component running={running} />
89
110
  </div>
90
111
  {caption && <figcaption className={styles.wmCaption}>{label}</figcaption>}
91
112
  </figure>