@conduction/docusaurus-preset 2.1.1 → 2.2.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/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
package/package.json
CHANGED
|
@@ -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
|
+
}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OpenConnector · Recent runs widget.
|
|
3
|
+
*
|
|
4
|
+
* Last few integration runs with status pip (mint = success, orange =
|
|
5
|
+
* partial, red = failed, cobalt-200 = scheduled). Reuses .w-jira.
|
|
6
|
+
*/
|
|
7
|
+
import React from 'react';
|
|
8
|
+
import styles from '../../AppMock/AppMock.module.css';
|
|
9
|
+
|
|
10
|
+
export default function OpenConnectorRuns() {
|
|
11
|
+
return (
|
|
12
|
+
<div className={[styles.w, styles['w-jira']].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.id}></div><div className={styles.l}></div><div className={styles.pip}></div></div>
|
|
19
|
+
<div className={styles.item}><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.blocked].join(' ')}><div className={styles.id}></div><div className={styles.l}></div><div className={styles.pip}></div></div>
|
|
22
|
+
<div className={[styles.item, styles.todo].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>
|
|
25
|
+
</div>
|
|
26
|
+
);
|
|
27
|
+
}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OpenRegister · Activity widget.
|
|
3
|
+
*
|
|
4
|
+
* Read and write rate over the past N hours, drawn as a line chart.
|
|
5
|
+
* The dot at the end is "now". Reuses .w-graph-line.
|
|
6
|
+
*/
|
|
7
|
+
import React from 'react';
|
|
8
|
+
import styles from '../../AppMock/AppMock.module.css';
|
|
9
|
+
|
|
10
|
+
export default function OpenRegisterActivity() {
|
|
11
|
+
return (
|
|
12
|
+
<div className={[styles.w, styles['w-graph-line']].join(' ')}>
|
|
13
|
+
<div className={styles.wHead}>
|
|
14
|
+
<div className={styles.h}></div>
|
|
15
|
+
<div className={styles.t}></div>
|
|
16
|
+
</div>
|
|
17
|
+
<div className={styles.chart}>
|
|
18
|
+
<svg viewBox="0 0 100 40" preserveAspectRatio="none">
|
|
19
|
+
<path className={styles.fill} d="M0,30 L12,28 L24,32 L36,22 L48,26 L60,16 L72,18 L84,10 L100,14 L100,40 L0,40 Z"/>
|
|
20
|
+
<path className={styles.stroke} d="M0,30 L12,28 L24,32 L36,22 L48,26 L60,16 L72,18 L84,10 L100,14"/>
|
|
21
|
+
<circle className={styles.dot} cx="100" cy="14" r="2.5"/>
|
|
22
|
+
</svg>
|
|
23
|
+
</div>
|
|
24
|
+
<div className={styles.axis}></div>
|
|
25
|
+
</div>
|
|
26
|
+
);
|
|
27
|
+
}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* PipelinQ · Deals closing widget.
|
|
3
|
+
*
|
|
4
|
+
* Deals expected to close this week, ranked by value. Reuses .w-mail
|
|
5
|
+
* atom (avatar list with two lines): the avatar reads as the assigned
|
|
6
|
+
* sales rep, l1 is the deal name, l2 is value plus stage.
|
|
7
|
+
*/
|
|
8
|
+
import React from 'react';
|
|
9
|
+
import styles from '../../AppMock/AppMock.module.css';
|
|
10
|
+
|
|
11
|
+
export default function PipelinQDeals() {
|
|
12
|
+
return (
|
|
13
|
+
<div className={[styles.w, styles['w-mail']].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.b].join(' ')}><div className={styles.av}></div><div className={styles.lines}><div className={styles.l1}></div><div className={styles.l2}></div></div></div>
|
|
20
|
+
<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>
|
|
21
|
+
<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>
|
|
22
|
+
<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>
|
|
23
|
+
</div>
|
|
24
|
+
</div>
|
|
25
|
+
);
|
|
26
|
+
}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Procest · Due today widget.
|
|
3
|
+
*
|
|
4
|
+
* Cases whose deadline lands today or earlier. Reuses .w-werkvoorraad
|
|
5
|
+
* but with more late items in red and one orange-active to read as
|
|
6
|
+
* "if you do nothing, this list grows red". Different framing from
|
|
7
|
+
* the regular werkvoorraad widget which is queue-shaped, not
|
|
8
|
+
* deadline-shaped.
|
|
9
|
+
*/
|
|
10
|
+
import React from 'react';
|
|
11
|
+
import styles from '../../AppMock/AppMock.module.css';
|
|
12
|
+
|
|
13
|
+
export default function ProcestDueToday() {
|
|
14
|
+
return (
|
|
15
|
+
<div className={[styles.w, styles['w-werkvoorraad']].join(' ')}>
|
|
16
|
+
<div className={styles.wHead}>
|
|
17
|
+
<div className={styles.h}></div>
|
|
18
|
+
<div className={styles.t}></div>
|
|
19
|
+
</div>
|
|
20
|
+
<div className={styles.list}>
|
|
21
|
+
<div className={[styles.item, styles.late].join(' ')}><div className={styles.stage}></div><div className={styles.l1}></div><div className={[styles.av, styles.b].join(' ')}></div></div>
|
|
22
|
+
<div className={[styles.item, styles.late].join(' ')}><div className={styles.stage}></div><div className={styles.l1}></div><div className={styles.av}></div></div>
|
|
23
|
+
<div className={[styles.item, styles.now].join(' ')}><div className={styles.stage}></div><div className={styles.l1}></div><div className={[styles.av, styles.c].join(' ')}></div></div>
|
|
24
|
+
<div className={styles.item}><div className={styles.stage}></div><div className={styles.l1}></div><div className={[styles.av, styles.b].join(' ')}></div></div>
|
|
25
|
+
</div>
|
|
26
|
+
</div>
|
|
27
|
+
);
|
|
28
|
+
}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Procest · Werkvoorraad widget.
|
|
3
|
+
*
|
|
4
|
+
* The case worker's queue, with stage pip on the left, case title in
|
|
5
|
+
* the middle, owner avatar on the right. .now = active stage in
|
|
6
|
+
* orange, .late = SLA breached in red.
|
|
7
|
+
*/
|
|
8
|
+
import React from 'react';
|
|
9
|
+
import styles from '../../AppMock/AppMock.module.css';
|
|
10
|
+
|
|
11
|
+
export default function ProcestWerkvoorraad() {
|
|
12
|
+
return (
|
|
13
|
+
<div className={[styles.w, styles['w-werkvoorraad']].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.now].join(' ')}><div className={styles.stage}></div><div className={styles.l1}></div><div className={styles.av}></div></div>
|
|
20
|
+
<div className={styles.item}><div className={styles.stage}></div><div className={styles.l1}></div><div className={[styles.av, styles.b].join(' ')}></div></div>
|
|
21
|
+
<div className={[styles.item, styles.late].join(' ')}><div className={styles.stage}></div><div className={styles.l1}></div><div className={[styles.av, styles.c].join(' ')}></div></div>
|
|
22
|
+
<div className={styles.item}><div className={styles.stage}></div><div className={styles.l1}></div><div className={styles.av}></div></div>
|
|
23
|
+
<div className={styles.item}><div className={styles.stage}></div><div className={styles.l1}></div><div className={[styles.av, styles.b].join(' ')}></div></div>
|
|
24
|
+
</div>
|
|
25
|
+
</div>
|
|
26
|
+
);
|
|
27
|
+
}
|