@conduction/docusaurus-preset 2.1.1 → 2.3.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/package.json +1 -1
- package/src/components/AppMock/AppMock.jsx +23 -4
- package/src/components/AppMock/AppMock.module.css +21 -0
- package/src/components/SidebarMock/SidebarMock.jsx +192 -0
- package/src/components/SidebarMock/SidebarMock.module.css +252 -0
- package/src/components/SidebarMock/variants/DeciDeskDecision.jsx +36 -0
- package/src/components/SidebarMock/variants/DocuDeskPiiMap.jsx +36 -0
- package/src/components/SidebarMock/variants/DocuDeskSignatures.jsx +43 -0
- package/src/components/SidebarMock/variants/NextcloudActivity.jsx +44 -0
- package/src/components/SidebarMock/variants/OpenCatalogiPublicationHistory.jsx +44 -0
- package/src/components/SidebarMock/variants/OpenConnectorRunDetail.jsx +27 -0
- package/src/components/SidebarMock/variants/OpenRegisterMetadata.jsx +29 -0
- package/src/components/SidebarMock/variants/ProcestTimeline.jsx +40 -0
- package/src/components/SidebarMock/variants/ProcestXWiki.jsx +33 -0
- package/src/components/WidgetMock/WidgetMock.jsx +94 -0
- package/src/components/WidgetMock/WidgetMock.module.css +61 -0
- package/src/components/WidgetMock/variants/DeciDeskActions.jsx +27 -0
- package/src/components/WidgetMock/variants/DocuDeskAnonymise.jsx +24 -0
- package/src/components/WidgetMock/variants/DocuDeskPendingSign.jsx +28 -0
- package/src/components/WidgetMock/variants/NextcloudCalendar.jsx +37 -0
- package/src/components/WidgetMock/variants/NextcloudDecks.jsx +33 -0
- package/src/components/WidgetMock/variants/NextcloudFiles.jsx +26 -0
- package/src/components/WidgetMock/variants/NextcloudMail.jsx +28 -0
- package/src/components/WidgetMock/variants/NextcloudRss.jsx +26 -0
- package/src/components/WidgetMock/variants/OpenCatalogiPublications.jsx +28 -0
- package/src/components/WidgetMock/variants/OpenConnectorRuns.jsx +27 -0
- package/src/components/WidgetMock/variants/OpenRegisterActivity.jsx +27 -0
- package/src/components/WidgetMock/variants/PipelinQDeals.jsx +26 -0
- package/src/components/WidgetMock/variants/ProcestDueToday.jsx +28 -0
- package/src/components/WidgetMock/variants/ProcestWerkvoorraad.jsx +27 -0
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Nextcloud · stock activity feed.
|
|
3
|
+
*
|
|
4
|
+
* Every Nextcloud sidebar's first tab. Shown so MKB readers can
|
|
5
|
+
* place where Conduction tabs sit. List of person + action rows
|
|
6
|
+
* with avatars in the family palette mix.
|
|
7
|
+
*/
|
|
8
|
+
import React from 'react';
|
|
9
|
+
import styles from '../SidebarMock.module.css';
|
|
10
|
+
|
|
11
|
+
export default function NextcloudActivity() {
|
|
12
|
+
return (
|
|
13
|
+
<>
|
|
14
|
+
<div className={styles.smPerson}>
|
|
15
|
+
<div className={styles.av}></div>
|
|
16
|
+
<div className={styles.lines}><div className={styles.l1}></div><div className={styles.l2}></div></div>
|
|
17
|
+
</div>
|
|
18
|
+
<div className={[styles.smPerson, styles.b].join(' ')}>
|
|
19
|
+
<div className={styles.av}></div>
|
|
20
|
+
<div className={styles.lines}><div className={styles.l1}></div><div className={styles.l2}></div></div>
|
|
21
|
+
</div>
|
|
22
|
+
<div className={[styles.smPerson, styles.c].join(' ')}>
|
|
23
|
+
<div className={styles.av}></div>
|
|
24
|
+
<div className={styles.lines}><div className={styles.l1}></div><div className={styles.l2}></div></div>
|
|
25
|
+
</div>
|
|
26
|
+
<div className={[styles.smPerson, styles.d].join(' ')}>
|
|
27
|
+
<div className={styles.av}></div>
|
|
28
|
+
<div className={styles.lines}><div className={styles.l1}></div><div className={styles.l2}></div></div>
|
|
29
|
+
</div>
|
|
30
|
+
<div className={styles.smPerson}>
|
|
31
|
+
<div className={styles.av}></div>
|
|
32
|
+
<div className={styles.lines}><div className={styles.l1}></div><div className={styles.l2}></div></div>
|
|
33
|
+
</div>
|
|
34
|
+
<div className={[styles.smPerson, styles.e].join(' ')}>
|
|
35
|
+
<div className={styles.av}></div>
|
|
36
|
+
<div className={styles.lines}><div className={styles.l1}></div><div className={styles.l2}></div></div>
|
|
37
|
+
</div>
|
|
38
|
+
<div className={[styles.smPerson, styles.b].join(' ')}>
|
|
39
|
+
<div className={styles.av}></div>
|
|
40
|
+
<div className={styles.lines}><div className={styles.l1}></div><div className={styles.l2}></div></div>
|
|
41
|
+
</div>
|
|
42
|
+
</>
|
|
43
|
+
);
|
|
44
|
+
}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OpenCatalogi · publication sidebar, History tab.
|
|
3
|
+
*
|
|
4
|
+
* Version history of a publication. Each row is a person who made
|
|
5
|
+
* the edit (avatar) plus the version label and timestamp. Latest
|
|
6
|
+
* (mint pip) at the top, withdrawn version (red pip) further down.
|
|
7
|
+
*/
|
|
8
|
+
import React from 'react';
|
|
9
|
+
import styles from '../SidebarMock.module.css';
|
|
10
|
+
|
|
11
|
+
export default function OpenCatalogiPublicationHistory() {
|
|
12
|
+
return (
|
|
13
|
+
<>
|
|
14
|
+
<div className={[styles.row, styles.head].join(' ')}></div>
|
|
15
|
+
<div className={[styles.row, styles.short].join(' ')}></div>
|
|
16
|
+
<div className={styles.smBreak}></div>
|
|
17
|
+
<div className={styles.smPerson}>
|
|
18
|
+
<div className={styles.av}></div>
|
|
19
|
+
<div className={styles.lines}><div className={styles.l1}></div><div className={styles.l2}></div></div>
|
|
20
|
+
<div className={styles.pip}></div>
|
|
21
|
+
</div>
|
|
22
|
+
<div className={[styles.smPerson, styles.b].join(' ')}>
|
|
23
|
+
<div className={styles.av}></div>
|
|
24
|
+
<div className={styles.lines}><div className={styles.l1}></div><div className={styles.l2}></div></div>
|
|
25
|
+
<div className={styles.pip}></div>
|
|
26
|
+
</div>
|
|
27
|
+
<div className={[styles.smPerson, styles.d].join(' ')}>
|
|
28
|
+
<div className={styles.av}></div>
|
|
29
|
+
<div className={styles.lines}><div className={styles.l1}></div><div className={styles.l2}></div></div>
|
|
30
|
+
<div className={styles.pip}></div>
|
|
31
|
+
</div>
|
|
32
|
+
<div className={[styles.smPerson, styles.c, styles.blocked].join(' ')}>
|
|
33
|
+
<div className={styles.av}></div>
|
|
34
|
+
<div className={styles.lines}><div className={styles.l1}></div><div className={styles.l2}></div></div>
|
|
35
|
+
<div className={styles.pip}></div>
|
|
36
|
+
</div>
|
|
37
|
+
<div className={[styles.smPerson, styles.e].join(' ')}>
|
|
38
|
+
<div className={styles.av}></div>
|
|
39
|
+
<div className={styles.lines}><div className={styles.l1}></div><div className={styles.l2}></div></div>
|
|
40
|
+
<div className={styles.pip}></div>
|
|
41
|
+
</div>
|
|
42
|
+
</>
|
|
43
|
+
);
|
|
44
|
+
}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OpenConnector · run sidebar, Logs tab.
|
|
3
|
+
*
|
|
4
|
+
* Single integration run inspected: header with run id and timing,
|
|
5
|
+
* then a vertical log stream with severity-coded timestamps. Last
|
|
6
|
+
* line is a warn or error so the eye lands on it.
|
|
7
|
+
*/
|
|
8
|
+
import React from 'react';
|
|
9
|
+
import styles from '../SidebarMock.module.css';
|
|
10
|
+
|
|
11
|
+
export default function OpenConnectorRunDetail() {
|
|
12
|
+
return (
|
|
13
|
+
<>
|
|
14
|
+
<div className={[styles.row, styles.head].join(' ')}></div>
|
|
15
|
+
<div className={styles.smKv}><div className={styles.k}></div><div className={styles.v}></div></div>
|
|
16
|
+
<div className={styles.smKv}><div className={styles.k}></div><div className={styles.v}></div></div>
|
|
17
|
+
<div className={styles.smBreak}></div>
|
|
18
|
+
<div className={styles.smSub}></div>
|
|
19
|
+
<div className={styles.smLog}><div className={styles.ts}></div><div className={styles.msg}></div></div>
|
|
20
|
+
<div className={styles.smLog}><div className={styles.ts}></div><div className={styles.msg}></div></div>
|
|
21
|
+
<div className={styles.smLog}><div className={styles.ts}></div><div className={styles.msg}></div></div>
|
|
22
|
+
<div className={[styles.smLog, styles.warn].join(' ')}><div className={styles.ts}></div><div className={styles.msg}></div></div>
|
|
23
|
+
<div className={styles.smLog}><div className={styles.ts}></div><div className={styles.msg}></div></div>
|
|
24
|
+
<div className={[styles.smLog, styles.error].join(' ')}><div className={styles.ts}></div><div className={styles.msg}></div></div>
|
|
25
|
+
</>
|
|
26
|
+
);
|
|
27
|
+
}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OpenRegister · object sidebar, Metadata tab.
|
|
3
|
+
*
|
|
4
|
+
* Object frontmatter as a key/value list: register, schema, slug,
|
|
5
|
+
* created, updated, owner. Plus a section break and the object's
|
|
6
|
+
* primary identifiers. Reads as "what is this object" at a glance.
|
|
7
|
+
*/
|
|
8
|
+
import React from 'react';
|
|
9
|
+
import styles from '../SidebarMock.module.css';
|
|
10
|
+
|
|
11
|
+
export default function OpenRegisterMetadata() {
|
|
12
|
+
return (
|
|
13
|
+
<>
|
|
14
|
+
<div className={[styles.row, styles.head].join(' ')}></div>
|
|
15
|
+
<div className={[styles.row, styles.short].join(' ')}></div>
|
|
16
|
+
<div className={styles.smBreak}></div>
|
|
17
|
+
<div className={styles.smSub}></div>
|
|
18
|
+
<div className={styles.smKv}><div className={styles.k}></div><div className={styles.v}></div></div>
|
|
19
|
+
<div className={styles.smKv}><div className={styles.k}></div><div className={styles.v}></div></div>
|
|
20
|
+
<div className={styles.smKv}><div className={styles.k}></div><div className={styles.v}></div></div>
|
|
21
|
+
<div className={styles.smKv}><div className={styles.k}></div><div className={styles.v}></div></div>
|
|
22
|
+
<div className={styles.smBreak}></div>
|
|
23
|
+
<div className={styles.smSub}></div>
|
|
24
|
+
<div className={styles.smKv}><div className={styles.k}></div><div className={styles.v}></div></div>
|
|
25
|
+
<div className={styles.smKv}><div className={styles.k}></div><div className={styles.v}></div></div>
|
|
26
|
+
<div className={styles.smKv}><div className={styles.k}></div><div className={styles.v}></div></div>
|
|
27
|
+
</>
|
|
28
|
+
);
|
|
29
|
+
}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Procest · case sidebar, Timeline tab.
|
|
3
|
+
*
|
|
4
|
+
* The case stage history vertical, with one done, one active in
|
|
5
|
+
* orange, three to-do. Same .now / .late / .todo modifiers as the
|
|
6
|
+
* AppMock procest timeline, just stacked instead of horizontal.
|
|
7
|
+
*/
|
|
8
|
+
import React from 'react';
|
|
9
|
+
import styles from '../SidebarMock.module.css';
|
|
10
|
+
|
|
11
|
+
export default function ProcestTimeline() {
|
|
12
|
+
return (
|
|
13
|
+
<>
|
|
14
|
+
<div className={styles.smStage}>
|
|
15
|
+
<div className={styles.h}></div>
|
|
16
|
+
<div className={styles.lines}><div className={styles.l1}></div><div className={styles.l2}></div></div>
|
|
17
|
+
</div>
|
|
18
|
+
<div className={styles.smStage}>
|
|
19
|
+
<div className={styles.h}></div>
|
|
20
|
+
<div className={styles.lines}><div className={styles.l1}></div><div className={styles.l2}></div></div>
|
|
21
|
+
</div>
|
|
22
|
+
<div className={[styles.smStage, styles.now].join(' ')}>
|
|
23
|
+
<div className={styles.h}></div>
|
|
24
|
+
<div className={styles.lines}><div className={styles.l1}></div><div className={styles.l2}></div></div>
|
|
25
|
+
</div>
|
|
26
|
+
<div className={[styles.smStage, styles.todo].join(' ')}>
|
|
27
|
+
<div className={styles.h}></div>
|
|
28
|
+
<div className={styles.lines}><div className={styles.l1}></div><div className={styles.l2}></div></div>
|
|
29
|
+
</div>
|
|
30
|
+
<div className={[styles.smStage, styles.todo].join(' ')}>
|
|
31
|
+
<div className={styles.h}></div>
|
|
32
|
+
<div className={styles.lines}><div className={styles.l1}></div><div className={styles.l2}></div></div>
|
|
33
|
+
</div>
|
|
34
|
+
<div className={[styles.smStage, styles.todo].join(' ')}>
|
|
35
|
+
<div className={styles.h}></div>
|
|
36
|
+
<div className={styles.lines}><div className={styles.l1}></div><div className={styles.l2}></div></div>
|
|
37
|
+
</div>
|
|
38
|
+
</>
|
|
39
|
+
);
|
|
40
|
+
}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Procest · case sidebar, xWiki tab.
|
|
3
|
+
*
|
|
4
|
+
* The xWiki integration: Procest pulls the case-handling protocol
|
|
5
|
+
* page out of xWiki and shows it next to the live case. Body reads
|
|
6
|
+
* as wiki text: a heading, two paragraphs, a subheading, a list of
|
|
7
|
+
* checked steps. Worth saying out loud since it is the integration
|
|
8
|
+
* point most likely to surprise readers (xWiki under Nextcloud is
|
|
9
|
+
* not a standard pairing).
|
|
10
|
+
*/
|
|
11
|
+
import React from 'react';
|
|
12
|
+
import styles from '../SidebarMock.module.css';
|
|
13
|
+
|
|
14
|
+
export default function ProcestXWiki() {
|
|
15
|
+
return (
|
|
16
|
+
<>
|
|
17
|
+
<div className={[styles.row, styles.head].join(' ')}></div>
|
|
18
|
+
<div className={styles.row}></div>
|
|
19
|
+
<div className={styles.row}></div>
|
|
20
|
+
<div className={[styles.row, styles.med].join(' ')}></div>
|
|
21
|
+
<div className={styles.smBreak}></div>
|
|
22
|
+
<div className={styles.smSub}></div>
|
|
23
|
+
<div className={styles.row}></div>
|
|
24
|
+
<div className={[styles.row, styles.med].join(' ')}></div>
|
|
25
|
+
<div className={[styles.row, styles.short].join(' ')}></div>
|
|
26
|
+
<div className={styles.smBreak}></div>
|
|
27
|
+
<div className={styles.smSub}></div>
|
|
28
|
+
<div className={styles.row}></div>
|
|
29
|
+
<div className={styles.row}></div>
|
|
30
|
+
<div className={[styles.row, styles.short].join(' ')}></div>
|
|
31
|
+
</>
|
|
32
|
+
);
|
|
33
|
+
}
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* <WidgetMock />
|
|
3
|
+
*
|
|
4
|
+
* Standalone abstract of a Nextcloud dashboard widget that a
|
|
5
|
+
* Conduction app registers (DocuDesk anonymise, Procest werkvoorraad,
|
|
6
|
+
* OpenRegister activity, etc.) plus a few of the stock Nextcloud
|
|
7
|
+
* widgets we frame around (Mail, Calendar, Files, Decks, RSS).
|
|
8
|
+
*
|
|
9
|
+
* Companion to <AppMock />: AppMock paints the whole product surface
|
|
10
|
+
* (topbar + nav + col + optional sidebar); WidgetMock paints just one
|
|
11
|
+
* tile, sized for inline use in marketing copy or docs that talk
|
|
12
|
+
* about a single integration point.
|
|
13
|
+
*
|
|
14
|
+
* Visual reference: every Conduction widget renders against a dashboard
|
|
15
|
+
* background (cobalt-900 in MyDash, white in stock Nextcloud). The
|
|
16
|
+
* WidgetMock chrome is cobalt to match MyDash since most Conduction
|
|
17
|
+
* widgets are built for that surface; the same widget atoms render
|
|
18
|
+
* fine on white when reused there.
|
|
19
|
+
*
|
|
20
|
+
* Usage:
|
|
21
|
+
*
|
|
22
|
+
* <WidgetMock kind="procest-werkvoorraad" />
|
|
23
|
+
* <WidgetMock kind="docudesk-anonymise" caption />
|
|
24
|
+
* <WidgetMock kind="nextcloud-calendar" size="sm" />
|
|
25
|
+
*
|
|
26
|
+
* Props:
|
|
27
|
+
* - kind: one of VARIANTS keys (required)
|
|
28
|
+
* - size: 'sm' | 'md' (default) | 'lg' — frame width
|
|
29
|
+
* - caption: boolean — adds a small
|
|
30
|
+
* label below
|
|
31
|
+
* the frame
|
|
32
|
+
* - className: string
|
|
33
|
+
*/
|
|
34
|
+
|
|
35
|
+
import React from 'react';
|
|
36
|
+
import styles from './WidgetMock.module.css';
|
|
37
|
+
import amStyles from '../AppMock/AppMock.module.css';
|
|
38
|
+
|
|
39
|
+
import DocuDeskAnonymise from './variants/DocuDeskAnonymise.jsx';
|
|
40
|
+
import DocuDeskPendingSign from './variants/DocuDeskPendingSign.jsx';
|
|
41
|
+
import ProcestWerkvoorraad from './variants/ProcestWerkvoorraad.jsx';
|
|
42
|
+
import ProcestDueToday from './variants/ProcestDueToday.jsx';
|
|
43
|
+
import OpenRegisterActivity from './variants/OpenRegisterActivity.jsx';
|
|
44
|
+
import OpenCatalogiPublications from './variants/OpenCatalogiPublications.jsx';
|
|
45
|
+
import OpenConnectorRuns from './variants/OpenConnectorRuns.jsx';
|
|
46
|
+
import DeciDeskActions from './variants/DeciDeskActions.jsx';
|
|
47
|
+
import PipelinQDeals from './variants/PipelinQDeals.jsx';
|
|
48
|
+
import NextcloudMail from './variants/NextcloudMail.jsx';
|
|
49
|
+
import NextcloudCalendar from './variants/NextcloudCalendar.jsx';
|
|
50
|
+
import NextcloudFiles from './variants/NextcloudFiles.jsx';
|
|
51
|
+
import NextcloudDecks from './variants/NextcloudDecks.jsx';
|
|
52
|
+
import NextcloudRss from './variants/NextcloudRss.jsx';
|
|
53
|
+
|
|
54
|
+
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' },
|
|
59
|
+
'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' },
|
|
65
|
+
'nextcloud-calendar': { Component: NextcloudCalendar, label: 'Nextcloud · Calendar' },
|
|
66
|
+
'nextcloud-files': { Component: NextcloudFiles, label: 'Nextcloud · Recent files' },
|
|
67
|
+
'nextcloud-decks': { Component: NextcloudDecks, label: 'Nextcloud · Decks' },
|
|
68
|
+
'nextcloud-rss': { Component: NextcloudRss, label: 'Nextcloud · RSS feed' },
|
|
69
|
+
};
|
|
70
|
+
|
|
71
|
+
export default function WidgetMock({ kind, size = 'md', caption = false, className }) {
|
|
72
|
+
const variant = VARIANTS[kind];
|
|
73
|
+
const wrap = [amStyles.am, styles.wm].filter(Boolean).join(' ');
|
|
74
|
+
if (!variant) {
|
|
75
|
+
return (
|
|
76
|
+
<div className={wrap}>
|
|
77
|
+
<div className={[styles.wmFrame, styles[`wm-size-${size}`]].filter(Boolean).join(' ')}>
|
|
78
|
+
<div style={{ color: 'var(--c-cobalt-200)', fontSize: 11 }}>Unknown widget: {kind}</div>
|
|
79
|
+
</div>
|
|
80
|
+
</div>
|
|
81
|
+
);
|
|
82
|
+
}
|
|
83
|
+
const { Component, label } = variant;
|
|
84
|
+
return (
|
|
85
|
+
<div className={wrap}>
|
|
86
|
+
<figure className={[styles.wmFigure, className].filter(Boolean).join(' ')}>
|
|
87
|
+
<div className={[styles.wmFrame, styles[`wm-size-${size}`]].filter(Boolean).join(' ')}>
|
|
88
|
+
<Component />
|
|
89
|
+
</div>
|
|
90
|
+
{caption && <figcaption className={styles.wmCaption}>{label}</figcaption>}
|
|
91
|
+
</figure>
|
|
92
|
+
</div>
|
|
93
|
+
);
|
|
94
|
+
}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* <WidgetMock /> styles.
|
|
3
|
+
*
|
|
4
|
+
* The widget atoms themselves (.w, .w-mail, .w-calendar, .w-files,
|
|
5
|
+
* .w-decks, .w-rss, .w-jira, .w-video, .w-upload, .w-werkvoorraad,
|
|
6
|
+
* .w-launcher, .w-subgrid, .w-graph-bar / .w-graph-line / .w-graph-donut)
|
|
7
|
+
* live in AppMock/AppMock.module.css under the `.am` parent scope.
|
|
8
|
+
* They were authored there because MyDash variants render dashboard
|
|
9
|
+
* grids full of them. WidgetMock standalonises a single widget:
|
|
10
|
+
* same atoms, new chrome.
|
|
11
|
+
*
|
|
12
|
+
* To get both rule sets, every WidgetMock instance wraps content in
|
|
13
|
+
* <div className={[styles.am, styles.wm].join(' ')}>. The static
|
|
14
|
+
* kit page uses <div class="am wm"> for the same effect.
|
|
15
|
+
*
|
|
16
|
+
* The .wm parent here is `display: contents` so the wrapper doesn't
|
|
17
|
+
* affect layout. .wmFrame is the container that gives the widget its
|
|
18
|
+
* native dashboard background (cobalt-900) and a shadow, so it reads
|
|
19
|
+
* as a tile lifted off the page.
|
|
20
|
+
*/
|
|
21
|
+
|
|
22
|
+
.am.wm { display: contents; }
|
|
23
|
+
|
|
24
|
+
.am .wmFigure {
|
|
25
|
+
margin: 0;
|
|
26
|
+
display: flex;
|
|
27
|
+
flex-direction: column;
|
|
28
|
+
gap: var(--space-2);
|
|
29
|
+
align-items: flex-start;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
.am .wmFrame {
|
|
33
|
+
background: var(--c-cobalt-900);
|
|
34
|
+
border-radius: var(--radius-md);
|
|
35
|
+
padding: 12px;
|
|
36
|
+
box-shadow: 0 8px 24px -10px rgba(0, 0, 0, 0.15);
|
|
37
|
+
display: flex;
|
|
38
|
+
flex-direction: column;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
/* Widget sizes. The .w block inside fills the frame. */
|
|
42
|
+
.am .wmFrame.wm-size-sm { width: 220px; aspect-ratio: 5 / 4; }
|
|
43
|
+
.am .wmFrame.wm-size-md { width: 300px; aspect-ratio: 5 / 4; }
|
|
44
|
+
.am .wmFrame.wm-size-lg { width: 380px; aspect-ratio: 5 / 4; }
|
|
45
|
+
|
|
46
|
+
/* The widget atom (.w) inside should fill the frame and not have its
|
|
47
|
+
own outer shadow, since wmFrame already provides one. */
|
|
48
|
+
.am .wmFrame > .w {
|
|
49
|
+
flex: 1;
|
|
50
|
+
min-height: 0;
|
|
51
|
+
height: 100%;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
.am .wmCaption {
|
|
55
|
+
font-family: var(--conduction-typography-font-family-code);
|
|
56
|
+
font-size: 11px;
|
|
57
|
+
letter-spacing: 0.06em;
|
|
58
|
+
text-transform: uppercase;
|
|
59
|
+
color: var(--c-cobalt-400);
|
|
60
|
+
margin: 0;
|
|
61
|
+
}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* DeciDesk · Action items widget.
|
|
3
|
+
*
|
|
4
|
+
* Action items assigned to the viewer, sorted by due date. .w-jira
|
|
5
|
+
* atom: id slot is the source decision, pip slot is status (orange =
|
|
6
|
+
* due this week, red = overdue, mint = done, cobalt-200 = upcoming).
|
|
7
|
+
*/
|
|
8
|
+
import React from 'react';
|
|
9
|
+
import styles from '../../AppMock/AppMock.module.css';
|
|
10
|
+
|
|
11
|
+
export default function DeciDeskActions() {
|
|
12
|
+
return (
|
|
13
|
+
<div className={[styles.w, styles['w-jira']].join(' ')}>
|
|
14
|
+
<div className={styles.wHead}>
|
|
15
|
+
<div className={styles.h}></div>
|
|
16
|
+
<div className={styles.t}></div>
|
|
17
|
+
</div>
|
|
18
|
+
<div className={styles.list}>
|
|
19
|
+
<div className={[styles.item, styles.blocked].join(' ')}><div className={styles.id}></div><div className={styles.l}></div><div className={styles.pip}></div></div>
|
|
20
|
+
<div className={[styles.item, styles.review].join(' ')}><div className={styles.id}></div><div className={styles.l}></div><div className={styles.pip}></div></div>
|
|
21
|
+
<div className={[styles.item, styles.review].join(' ')}><div className={styles.id}></div><div className={styles.l}></div><div className={styles.pip}></div></div>
|
|
22
|
+
<div className={styles.item}><div className={styles.id}></div><div className={styles.l}></div><div className={styles.pip}></div></div>
|
|
23
|
+
<div className={[styles.item, styles.todo].join(' ')}><div className={styles.id}></div><div className={styles.l}></div><div className={styles.pip}></div></div>
|
|
24
|
+
</div>
|
|
25
|
+
</div>
|
|
26
|
+
);
|
|
27
|
+
}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* DocuDesk · Anonymise drop widget.
|
|
3
|
+
*
|
|
4
|
+
* Drop a document into the dashboard tile, get back a redacted copy.
|
|
5
|
+
* Visual: dashed cobalt drop-zone with a hex glyph. Status-pill is
|
|
6
|
+
* absent: this widget is action-first, not status-first.
|
|
7
|
+
*/
|
|
8
|
+
import React from 'react';
|
|
9
|
+
import styles from '../../AppMock/AppMock.module.css';
|
|
10
|
+
|
|
11
|
+
export default function DocuDeskAnonymise() {
|
|
12
|
+
return (
|
|
13
|
+
<div className={[styles.w, styles['w-upload']].join(' ')}>
|
|
14
|
+
<div className={styles.wHead}>
|
|
15
|
+
<div className={styles.h}></div>
|
|
16
|
+
<div className={styles.t}></div>
|
|
17
|
+
</div>
|
|
18
|
+
<div className={styles.zone}>
|
|
19
|
+
<div className={styles.ico}></div>
|
|
20
|
+
<div className={styles.label}></div>
|
|
21
|
+
</div>
|
|
22
|
+
</div>
|
|
23
|
+
);
|
|
24
|
+
}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* DocuDesk · Pending signatures widget.
|
|
3
|
+
*
|
|
4
|
+
* Documents waiting on someone's signature, ranked by oldest. Reuses
|
|
5
|
+
* the .w-jira atom (id + title + status pip): id slot reads as a
|
|
6
|
+
* document type tag, pip slot reads as a status (orange = waiting,
|
|
7
|
+
* red = blocked, mint = done in the last day, cobalt-200 = no action).
|
|
8
|
+
*/
|
|
9
|
+
import React from 'react';
|
|
10
|
+
import styles from '../../AppMock/AppMock.module.css';
|
|
11
|
+
|
|
12
|
+
export default function DocuDeskPendingSign() {
|
|
13
|
+
return (
|
|
14
|
+
<div className={[styles.w, styles['w-jira']].join(' ')}>
|
|
15
|
+
<div className={styles.wHead}>
|
|
16
|
+
<div className={styles.h}></div>
|
|
17
|
+
<div className={styles.t}></div>
|
|
18
|
+
</div>
|
|
19
|
+
<div className={styles.list}>
|
|
20
|
+
<div className={[styles.item, styles.review].join(' ')}><div className={styles.id}></div><div className={styles.l}></div><div className={styles.pip}></div></div>
|
|
21
|
+
<div className={[styles.item, styles.review].join(' ')}><div className={styles.id}></div><div className={styles.l}></div><div className={styles.pip}></div></div>
|
|
22
|
+
<div className={[styles.item, styles.blocked].join(' ')}><div className={styles.id}></div><div className={styles.l}></div><div className={styles.pip}></div></div>
|
|
23
|
+
<div className={styles.item}><div className={styles.id}></div><div className={styles.l}></div><div className={styles.pip}></div></div>
|
|
24
|
+
<div className={[styles.item, styles.todo].join(' ')}><div className={styles.id}></div><div className={styles.l}></div><div className={styles.pip}></div></div>
|
|
25
|
+
</div>
|
|
26
|
+
</div>
|
|
27
|
+
);
|
|
28
|
+
}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Nextcloud · Calendar widget (stock, framed for context).
|
|
3
|
+
*
|
|
4
|
+
* 7-column day grid covering four weeks. .today = orange (the
|
|
5
|
+
* dashboard's "right now"), .event = cobalt-300 dot, .muted = leading
|
|
6
|
+
* or trailing days from neighbouring months.
|
|
7
|
+
*/
|
|
8
|
+
import React from 'react';
|
|
9
|
+
import styles from '../../AppMock/AppMock.module.css';
|
|
10
|
+
|
|
11
|
+
const DAYS = [
|
|
12
|
+
2, 2, 1, 0, 0, 0, 2,
|
|
13
|
+
0, 0, 0, 3, 1, 0, 0,
|
|
14
|
+
0, 1, 0, 0, 0, 1, 0,
|
|
15
|
+
0, 0, 0, 0, 1, 0, 0,
|
|
16
|
+
];
|
|
17
|
+
|
|
18
|
+
export default function NextcloudCalendar() {
|
|
19
|
+
return (
|
|
20
|
+
<div className={[styles.w, styles['w-calendar']].join(' ')}>
|
|
21
|
+
<div className={styles.wHead}>
|
|
22
|
+
<div className={styles.h}></div>
|
|
23
|
+
<div className={styles.t}></div>
|
|
24
|
+
</div>
|
|
25
|
+
<div className={styles.grid}>
|
|
26
|
+
{DAYS.map((kind, i) => (
|
|
27
|
+
<div key={i} className={[
|
|
28
|
+
styles.day,
|
|
29
|
+
kind === 1 && styles.event,
|
|
30
|
+
kind === 2 && styles.muted,
|
|
31
|
+
kind === 3 && styles.today,
|
|
32
|
+
].filter(Boolean).join(' ')}></div>
|
|
33
|
+
))}
|
|
34
|
+
</div>
|
|
35
|
+
</div>
|
|
36
|
+
);
|
|
37
|
+
}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Nextcloud · Decks widget (stock, framed for context).
|
|
3
|
+
*
|
|
4
|
+
* Three kanban columns with cards. Coloured borders mark priority
|
|
5
|
+
* (.b = orange / urgent, .c = mint / done).
|
|
6
|
+
*/
|
|
7
|
+
import React from 'react';
|
|
8
|
+
import styles from '../../AppMock/AppMock.module.css';
|
|
9
|
+
|
|
10
|
+
export default function NextcloudDecks() {
|
|
11
|
+
return (
|
|
12
|
+
<div className={[styles.w, styles['w-decks']].join(' ')}>
|
|
13
|
+
<div className={styles.wHead}>
|
|
14
|
+
<div className={styles.h}></div>
|
|
15
|
+
<div className={styles.t}></div>
|
|
16
|
+
</div>
|
|
17
|
+
<div className={styles.columns}>
|
|
18
|
+
<div className={styles.col}>
|
|
19
|
+
<div className={styles.card}></div>
|
|
20
|
+
<div className={styles.card}></div>
|
|
21
|
+
</div>
|
|
22
|
+
<div className={styles.col}>
|
|
23
|
+
<div className={[styles.card, styles.b].join(' ')}></div>
|
|
24
|
+
<div className={styles.card}></div>
|
|
25
|
+
<div className={styles.card}></div>
|
|
26
|
+
</div>
|
|
27
|
+
<div className={styles.col}>
|
|
28
|
+
<div className={[styles.card, styles.c].join(' ')}></div>
|
|
29
|
+
</div>
|
|
30
|
+
</div>
|
|
31
|
+
</div>
|
|
32
|
+
);
|
|
33
|
+
}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Nextcloud · Recent files widget (stock, framed for context).
|
|
3
|
+
*
|
|
4
|
+
* File list with type-coloured icons: .folder = orange, .doc =
|
|
5
|
+
* terracotta, .sheet = forest. Last item plain (image / unknown).
|
|
6
|
+
*/
|
|
7
|
+
import React from 'react';
|
|
8
|
+
import styles from '../../AppMock/AppMock.module.css';
|
|
9
|
+
|
|
10
|
+
export default function NextcloudFiles() {
|
|
11
|
+
return (
|
|
12
|
+
<div className={[styles.w, styles['w-files']].join(' ')}>
|
|
13
|
+
<div className={styles.wHead}>
|
|
14
|
+
<div className={styles.h}></div>
|
|
15
|
+
<div className={styles.t}></div>
|
|
16
|
+
</div>
|
|
17
|
+
<div className={styles.list}>
|
|
18
|
+
<div className={[styles.item, styles.folder].join(' ')}><div className={styles.ico}></div><div className={styles.l}></div></div>
|
|
19
|
+
<div className={[styles.item, styles.doc].join(' ')}><div className={styles.ico}></div><div className={styles.l}></div></div>
|
|
20
|
+
<div className={[styles.item, styles.sheet].join(' ')}><div className={styles.ico}></div><div className={styles.l}></div></div>
|
|
21
|
+
<div className={[styles.item, styles.doc].join(' ')}><div className={styles.ico}></div><div className={styles.l}></div></div>
|
|
22
|
+
<div className={styles.item}><div className={styles.ico}></div><div className={styles.l}></div></div>
|
|
23
|
+
</div>
|
|
24
|
+
</div>
|
|
25
|
+
);
|
|
26
|
+
}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Nextcloud · Important mail widget (stock, framed for context).
|
|
3
|
+
*
|
|
4
|
+
* Avatar list with two text lines (sender + subject). Class colour
|
|
5
|
+
* variants on .item give the avatar palette mix. We frame this as
|
|
6
|
+
* "the surface Conduction widgets sit next to" so MKB readers see
|
|
7
|
+
* the integration point clearly.
|
|
8
|
+
*/
|
|
9
|
+
import React from 'react';
|
|
10
|
+
import styles from '../../AppMock/AppMock.module.css';
|
|
11
|
+
|
|
12
|
+
export default function NextcloudMail() {
|
|
13
|
+
return (
|
|
14
|
+
<div className={[styles.w, styles['w-mail']].join(' ')}>
|
|
15
|
+
<div className={styles.wHead}>
|
|
16
|
+
<div className={styles.h}></div>
|
|
17
|
+
<div className={styles.t}></div>
|
|
18
|
+
</div>
|
|
19
|
+
<div className={styles.list}>
|
|
20
|
+
<div className={styles.item}><div className={styles.av}></div><div className={styles.lines}><div className={styles.l1}></div><div className={styles.l2}></div></div></div>
|
|
21
|
+
<div className={[styles.item, styles.b].join(' ')}><div className={styles.av}></div><div className={styles.lines}><div className={styles.l1}></div><div className={styles.l2}></div></div></div>
|
|
22
|
+
<div className={[styles.item, styles.c].join(' ')}><div className={styles.av}></div><div className={styles.lines}><div className={styles.l1}></div><div className={styles.l2}></div></div></div>
|
|
23
|
+
<div className={[styles.item, styles.d].join(' ')}><div className={styles.av}></div><div className={styles.lines}><div className={styles.l1}></div><div className={styles.l2}></div></div></div>
|
|
24
|
+
<div className={styles.item}><div className={styles.av}></div><div className={styles.lines}><div className={styles.l1}></div><div className={styles.l2}></div></div></div>
|
|
25
|
+
</div>
|
|
26
|
+
</div>
|
|
27
|
+
);
|
|
28
|
+
}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Nextcloud · RSS feed widget (stock, framed for context).
|
|
3
|
+
*
|
|
4
|
+
* Three-column row: source badge, title, when. Mostly text, no avatar
|
|
5
|
+
* or pip needed since the feed metadata IS the status.
|
|
6
|
+
*/
|
|
7
|
+
import React from 'react';
|
|
8
|
+
import styles from '../../AppMock/AppMock.module.css';
|
|
9
|
+
|
|
10
|
+
export default function NextcloudRss() {
|
|
11
|
+
return (
|
|
12
|
+
<div className={[styles.w, styles['w-rss']].join(' ')}>
|
|
13
|
+
<div className={styles.wHead}>
|
|
14
|
+
<div className={styles.h}></div>
|
|
15
|
+
<div className={styles.t}></div>
|
|
16
|
+
</div>
|
|
17
|
+
<div className={styles.list}>
|
|
18
|
+
<div className={styles.item}><div className={styles.src}></div><div className={styles.title}></div><div className={styles.when}></div></div>
|
|
19
|
+
<div className={styles.item}><div className={styles.src}></div><div className={styles.title}></div><div className={styles.when}></div></div>
|
|
20
|
+
<div className={styles.item}><div className={styles.src}></div><div className={styles.title}></div><div className={styles.when}></div></div>
|
|
21
|
+
<div className={styles.item}><div className={styles.src}></div><div className={styles.title}></div><div className={styles.when}></div></div>
|
|
22
|
+
<div className={styles.item}><div className={styles.src}></div><div className={styles.title}></div><div className={styles.when}></div></div>
|
|
23
|
+
</div>
|
|
24
|
+
</div>
|
|
25
|
+
);
|
|
26
|
+
}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OpenCatalogi · Recent publications widget.
|
|
3
|
+
*
|
|
4
|
+
* The five most recent items federated to the public catalogue, each
|
|
5
|
+
* with a publication-type id badge, title, and status pip (mint =
|
|
6
|
+
* published, orange = pending review, vermillion = withdrawn).
|
|
7
|
+
* Reuses .w-jira atom.
|
|
8
|
+
*/
|
|
9
|
+
import React from 'react';
|
|
10
|
+
import styles from '../../AppMock/AppMock.module.css';
|
|
11
|
+
|
|
12
|
+
export default function OpenCatalogiPublications() {
|
|
13
|
+
return (
|
|
14
|
+
<div className={[styles.w, styles['w-jira']].join(' ')}>
|
|
15
|
+
<div className={styles.wHead}>
|
|
16
|
+
<div className={styles.h}></div>
|
|
17
|
+
<div className={styles.t}></div>
|
|
18
|
+
</div>
|
|
19
|
+
<div className={styles.list}>
|
|
20
|
+
<div className={styles.item}><div className={styles.id}></div><div className={styles.l}></div><div className={styles.pip}></div></div>
|
|
21
|
+
<div className={styles.item}><div className={styles.id}></div><div className={styles.l}></div><div className={styles.pip}></div></div>
|
|
22
|
+
<div className={[styles.item, styles.review].join(' ')}><div className={styles.id}></div><div className={styles.l}></div><div className={styles.pip}></div></div>
|
|
23
|
+
<div className={styles.item}><div className={styles.id}></div><div className={styles.l}></div><div className={styles.pip}></div></div>
|
|
24
|
+
<div className={[styles.item, styles.blocked].join(' ')}><div className={styles.id}></div><div className={styles.l}></div><div className={styles.pip}></div></div>
|
|
25
|
+
</div>
|
|
26
|
+
</div>
|
|
27
|
+
);
|
|
28
|
+
}
|