@conduction/docusaurus-preset 2.2.0 → 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/package.json
CHANGED
|
@@ -17,11 +17,16 @@
|
|
|
17
17
|
* <AppMock app="mydash" />
|
|
18
18
|
* <AppMock app="openregister" caption />
|
|
19
19
|
* <AppMock app="decidesk" size="sm" />
|
|
20
|
+
* <AppMock app="procest" sidebar={<SidebarMock kind="procest-xwiki" />} />
|
|
20
21
|
*
|
|
21
22
|
* Props:
|
|
22
|
-
* - app:
|
|
23
|
-
* 'openregister' | 'procest' | 'decidesk' (required)
|
|
23
|
+
* - app: keyof VARIANTS (required)
|
|
24
24
|
* - size: 'sm' | 'md' (default) — frame width
|
|
25
|
+
* - sidebar: ReactNode — renders inside
|
|
26
|
+
* the right-edge overlay of the frame. Pass a SidebarMock
|
|
27
|
+
* JSX to model a Nextcloud sidebar opened over this app
|
|
28
|
+
* (e.g. xWiki tab over a Procest case). Any other node
|
|
29
|
+
* renders verbatim
|
|
25
30
|
* - caption: boolean — adds a small app-name caption below the frame
|
|
26
31
|
* - className: string
|
|
27
32
|
*/
|
|
@@ -65,7 +70,7 @@ const VARIANTS = {
|
|
|
65
70
|
zaakafhandelapp: {Component: ZaakAfhandelAppMock, label: 'ZaakAfhandelApp'},
|
|
66
71
|
};
|
|
67
72
|
|
|
68
|
-
export default function AppMock({app, size = 'md', caption = false, className}) {
|
|
73
|
+
export default function AppMock({app, size = 'md', sidebar = null, caption = false, className}) {
|
|
69
74
|
const variant = VARIANTS[app];
|
|
70
75
|
if (!variant) {
|
|
71
76
|
return (
|
|
@@ -77,11 +82,25 @@ export default function AppMock({app, size = 'md', caption = false, className})
|
|
|
77
82
|
);
|
|
78
83
|
}
|
|
79
84
|
const {Component, label} = variant;
|
|
85
|
+
// The `sidebar` prop renders any node as a Nextcloud-style overlay
|
|
86
|
+
// panel pinned to the right edge of the frame. Typically a
|
|
87
|
+
// <SidebarMock kind="..." />; the SidebarMock component automatically
|
|
88
|
+
// drops its standalone chrome via the `embedded` flag we pass here.
|
|
89
|
+
// Anything else (custom JSX, an image, etc.) renders verbatim inside
|
|
90
|
+
// the overlay slot.
|
|
91
|
+
const renderedSidebar = React.isValidElement(sidebar)
|
|
92
|
+
? React.cloneElement(sidebar, { embedded: true })
|
|
93
|
+
: sidebar;
|
|
80
94
|
return (
|
|
81
95
|
<div className={styles.am}>
|
|
82
96
|
<figure className={[styles.figure, className].filter(Boolean).join(' ')}>
|
|
83
|
-
<div className={[styles.frame, styles[`size-${size}`]].filter(Boolean).join(' ')}>
|
|
97
|
+
<div className={[styles.frame, styles[`size-${size}`], renderedSidebar && styles.withSidebar].filter(Boolean).join(' ')}>
|
|
84
98
|
<Component />
|
|
99
|
+
{renderedSidebar && (
|
|
100
|
+
<div className={styles.sidebarOverlay} aria-label="Sidebar overlay">
|
|
101
|
+
{renderedSidebar}
|
|
102
|
+
</div>
|
|
103
|
+
)}
|
|
85
104
|
</div>
|
|
86
105
|
{caption && <figcaption className={styles.caption}>{label}</figcaption>}
|
|
87
106
|
</figure>
|
|
@@ -47,6 +47,27 @@
|
|
|
47
47
|
.am .size-md { max-width: 720px; }
|
|
48
48
|
.am .size-lg { max-width: 960px; }
|
|
49
49
|
|
|
50
|
+
/* Sidebar overlay: when AppMock receives a `sidebar` prop, the
|
|
51
|
+
passed JSX renders pinned to the right edge of the frame, full
|
|
52
|
+
height, modeling a Nextcloud detail panel sliding over the app.
|
|
53
|
+
The .withSidebar modifier on .frame is a hook for variants that
|
|
54
|
+
want to dim the underlying canvas; today it doesn't add any
|
|
55
|
+
styles itself. */
|
|
56
|
+
.am .frame .sidebarOverlay {
|
|
57
|
+
position: absolute;
|
|
58
|
+
top: 0;
|
|
59
|
+
right: 0;
|
|
60
|
+
bottom: 0;
|
|
61
|
+
width: 32%;
|
|
62
|
+
min-width: 200px;
|
|
63
|
+
background: white;
|
|
64
|
+
border-left: 1px solid var(--c-cobalt-200);
|
|
65
|
+
z-index: 2;
|
|
66
|
+
display: flex;
|
|
67
|
+
flex-direction: column;
|
|
68
|
+
overflow: hidden;
|
|
69
|
+
}
|
|
70
|
+
|
|
50
71
|
.am .caption {
|
|
51
72
|
font-family: var(--conduction-typography-font-family-code);
|
|
52
73
|
font-size: 11px;
|
|
@@ -0,0 +1,192 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* <SidebarMock />
|
|
3
|
+
*
|
|
4
|
+
* Token-painted abstract of the Nextcloud right-side detail panel.
|
|
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
|
|
8
|
+
* so on). A SidebarMock variant represents one such sidebar with
|
|
9
|
+
* one tab active.
|
|
10
|
+
*
|
|
11
|
+
* Two render modes:
|
|
12
|
+
*
|
|
13
|
+
* STANDALONE (default): wraps the panel in <div class="am sm"> with
|
|
14
|
+
* a .smFrame card around it. Use in kit-page specimens or marketing
|
|
15
|
+
* copy that talks about a single sidebar surface in isolation.
|
|
16
|
+
*
|
|
17
|
+
* <SidebarMock kind="procest-xwiki" />
|
|
18
|
+
*
|
|
19
|
+
* EMBEDDED: drops the frame so the panel slots directly into the
|
|
20
|
+
* .sidebarOverlay slot inside an AppMock frame. Set automatically
|
|
21
|
+
* by AppMock when the `sidebar` prop is a SidebarMock JSX element.
|
|
22
|
+
*
|
|
23
|
+
* <AppMock app="procest" sidebar={<SidebarMock kind="procest-xwiki" />} />
|
|
24
|
+
*
|
|
25
|
+
* Header bar (title + close) and tab strip are chassis. Body content
|
|
26
|
+
* is per-variant: the JSX file under variants/ provides just the body
|
|
27
|
+
* children, the chassis wraps it.
|
|
28
|
+
*
|
|
29
|
+
* Status colour map matches WidgetMock and AppMock atoms:
|
|
30
|
+
* mint = stable / done / signed
|
|
31
|
+
* orange = active / pending / due soon
|
|
32
|
+
* red = blocked / overdue / failed
|
|
33
|
+
* cobalt-200 = upcoming / idle / no action
|
|
34
|
+
*
|
|
35
|
+
* Props:
|
|
36
|
+
* - kind: one of VARIANTS keys (required)
|
|
37
|
+
* - embedded: boolean (default false) — drop the standalone chrome
|
|
38
|
+
* so this can render inside
|
|
39
|
+
* an AppMock overlay slot
|
|
40
|
+
* - className: string
|
|
41
|
+
*/
|
|
42
|
+
|
|
43
|
+
import React from 'react';
|
|
44
|
+
import styles from './SidebarMock.module.css';
|
|
45
|
+
import amStyles from '../AppMock/AppMock.module.css';
|
|
46
|
+
|
|
47
|
+
import ProcestXWiki from './variants/ProcestXWiki.jsx';
|
|
48
|
+
import ProcestTimeline from './variants/ProcestTimeline.jsx';
|
|
49
|
+
import DocuDeskSignatures from './variants/DocuDeskSignatures.jsx';
|
|
50
|
+
import DocuDeskPiiMap from './variants/DocuDeskPiiMap.jsx';
|
|
51
|
+
import OpenRegisterMetadata from './variants/OpenRegisterMetadata.jsx';
|
|
52
|
+
import OpenCatalogiPublicationHistory from './variants/OpenCatalogiPublicationHistory.jsx';
|
|
53
|
+
import OpenConnectorRunDetail from './variants/OpenConnectorRunDetail.jsx';
|
|
54
|
+
import DeciDeskDecision from './variants/DeciDeskDecision.jsx';
|
|
55
|
+
import NextcloudActivity from './variants/NextcloudActivity.jsx';
|
|
56
|
+
|
|
57
|
+
/**
|
|
58
|
+
* Each VARIANTS entry carries:
|
|
59
|
+
* Component: the JSX that fills the body
|
|
60
|
+
* label: human-readable name (used in caption / kit page)
|
|
61
|
+
* tabs: ordered list of tab labels with one marked active. The
|
|
62
|
+
* labels are decorative (kit page renders width-fixed pills)
|
|
63
|
+
* but the active flag drives the highlight.
|
|
64
|
+
*/
|
|
65
|
+
const VARIANTS = {
|
|
66
|
+
'procest-xwiki': {
|
|
67
|
+
Component: ProcestXWiki,
|
|
68
|
+
label: 'Procest · Case sidebar, xWiki tab',
|
|
69
|
+
tabs: [
|
|
70
|
+
{ id: 'activity', active: false },
|
|
71
|
+
{ id: 'xwiki', active: true },
|
|
72
|
+
{ id: 'timeline', active: false },
|
|
73
|
+
{ id: 'documents', active: false },
|
|
74
|
+
],
|
|
75
|
+
},
|
|
76
|
+
'procest-timeline': {
|
|
77
|
+
Component: ProcestTimeline,
|
|
78
|
+
label: 'Procest · Case sidebar, Timeline tab',
|
|
79
|
+
tabs: [
|
|
80
|
+
{ id: 'activity', active: false },
|
|
81
|
+
{ id: 'xwiki', active: false },
|
|
82
|
+
{ id: 'timeline', active: true },
|
|
83
|
+
{ id: 'documents', active: false },
|
|
84
|
+
],
|
|
85
|
+
},
|
|
86
|
+
'docudesk-signatures': {
|
|
87
|
+
Component: DocuDeskSignatures,
|
|
88
|
+
label: 'DocuDesk · Document sidebar, Signatures tab',
|
|
89
|
+
tabs: [
|
|
90
|
+
{ id: 'activity', active: false },
|
|
91
|
+
{ id: 'signatures', active: true },
|
|
92
|
+
{ id: 'pii', active: false },
|
|
93
|
+
{ id: 'versions', active: false },
|
|
94
|
+
],
|
|
95
|
+
},
|
|
96
|
+
'docudesk-pii-map': {
|
|
97
|
+
Component: DocuDeskPiiMap,
|
|
98
|
+
label: 'DocuDesk · Document sidebar, PII map tab',
|
|
99
|
+
tabs: [
|
|
100
|
+
{ id: 'activity', active: false },
|
|
101
|
+
{ id: 'signatures', active: false },
|
|
102
|
+
{ id: 'pii', active: true },
|
|
103
|
+
{ id: 'versions', active: false },
|
|
104
|
+
],
|
|
105
|
+
},
|
|
106
|
+
'openregister-metadata': {
|
|
107
|
+
Component: OpenRegisterMetadata,
|
|
108
|
+
label: 'OpenRegister · Object sidebar, Metadata tab',
|
|
109
|
+
tabs: [
|
|
110
|
+
{ id: 'activity', active: false },
|
|
111
|
+
{ id: 'metadata', active: true },
|
|
112
|
+
{ id: 'audit', active: false },
|
|
113
|
+
],
|
|
114
|
+
},
|
|
115
|
+
'opencatalogi-publication-history': {
|
|
116
|
+
Component: OpenCatalogiPublicationHistory,
|
|
117
|
+
label: 'OpenCatalogi · Publication sidebar, History tab',
|
|
118
|
+
tabs: [
|
|
119
|
+
{ id: 'activity', active: false },
|
|
120
|
+
{ id: 'history', active: true },
|
|
121
|
+
{ id: 'sources', active: false },
|
|
122
|
+
],
|
|
123
|
+
},
|
|
124
|
+
'openconnector-run-detail': {
|
|
125
|
+
Component: OpenConnectorRunDetail,
|
|
126
|
+
label: 'OpenConnector · Run sidebar, Logs tab',
|
|
127
|
+
tabs: [
|
|
128
|
+
{ id: 'activity', active: false },
|
|
129
|
+
{ id: 'logs', active: true },
|
|
130
|
+
{ id: 'mapping', active: false },
|
|
131
|
+
],
|
|
132
|
+
},
|
|
133
|
+
'decidesk-decision': {
|
|
134
|
+
Component: DeciDeskDecision,
|
|
135
|
+
label: 'DeciDesk · Decision sidebar, Detail tab',
|
|
136
|
+
tabs: [
|
|
137
|
+
{ id: 'activity', active: false },
|
|
138
|
+
{ id: 'detail', active: true },
|
|
139
|
+
{ id: 'actions', active: false },
|
|
140
|
+
],
|
|
141
|
+
},
|
|
142
|
+
'nextcloud-activity': {
|
|
143
|
+
Component: NextcloudActivity,
|
|
144
|
+
label: 'Nextcloud · Stock activity feed',
|
|
145
|
+
tabs: [
|
|
146
|
+
{ id: 'activity', active: true },
|
|
147
|
+
{ id: 'comments', active: false },
|
|
148
|
+
],
|
|
149
|
+
},
|
|
150
|
+
};
|
|
151
|
+
|
|
152
|
+
export default function SidebarMock({ kind, embedded = false, className }) {
|
|
153
|
+
const variant = VARIANTS[kind];
|
|
154
|
+
if (!variant) {
|
|
155
|
+
return (
|
|
156
|
+
<div className={[amStyles.am, styles.sm].filter(Boolean).join(' ')}>
|
|
157
|
+
<div className={styles.smFrame}>
|
|
158
|
+
<div style={{ padding: 12, color: 'var(--c-cobalt-400)', fontSize: 11 }}>Unknown sidebar: {kind}</div>
|
|
159
|
+
</div>
|
|
160
|
+
</div>
|
|
161
|
+
);
|
|
162
|
+
}
|
|
163
|
+
const { Component, tabs } = variant;
|
|
164
|
+
const panel = (
|
|
165
|
+
<div className={styles.smPanel}>
|
|
166
|
+
<div className={styles.smHead}>
|
|
167
|
+
<div className={styles.smTitle}></div>
|
|
168
|
+
<div className={styles.smClose}></div>
|
|
169
|
+
</div>
|
|
170
|
+
{tabs && tabs.length > 0 && (
|
|
171
|
+
<div className={styles.smTabs}>
|
|
172
|
+
{tabs.map((t, i) => (
|
|
173
|
+
<div key={t.id || i} className={[styles.smTab, t.active && styles.smTabActive].filter(Boolean).join(' ')}></div>
|
|
174
|
+
))}
|
|
175
|
+
</div>
|
|
176
|
+
)}
|
|
177
|
+
<div className={styles.smBody}>
|
|
178
|
+
<Component />
|
|
179
|
+
</div>
|
|
180
|
+
</div>
|
|
181
|
+
);
|
|
182
|
+
|
|
183
|
+
if (embedded) return panel;
|
|
184
|
+
|
|
185
|
+
return (
|
|
186
|
+
<div className={[amStyles.am, styles.sm, className].filter(Boolean).join(' ')}>
|
|
187
|
+
<div className={styles.smFrame}>
|
|
188
|
+
{panel}
|
|
189
|
+
</div>
|
|
190
|
+
</div>
|
|
191
|
+
);
|
|
192
|
+
}
|
|
@@ -0,0 +1,252 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* <SidebarMock /> styles.
|
|
3
|
+
*
|
|
4
|
+
* Models the Nextcloud right-side detail panel (the surface where
|
|
5
|
+
* apps register tabs: Activity, Comments, plus app-specific extensions
|
|
6
|
+
* like Procest's xWiki tab or DocuDesk's Signatures tab).
|
|
7
|
+
*
|
|
8
|
+
* Two render modes share the same panel internals:
|
|
9
|
+
*
|
|
10
|
+
* 1. STANDALONE (default): the panel renders inside <div class="am sm">
|
|
11
|
+
* with .smFrame around it (white card, shadow, border-radius). Used
|
|
12
|
+
* in kit-page specimens and inline marketing copy.
|
|
13
|
+
*
|
|
14
|
+
* 2. EMBEDDED: the panel renders inside an <AppMock>'s .sidebarOverlay
|
|
15
|
+
* via the AppMock `sidebar` prop. The overlay positions absolutely
|
|
16
|
+
* against the right of the frame and extends full height. SidebarMock
|
|
17
|
+
* drops the frame/shadow/radius in this mode so it slots cleanly.
|
|
18
|
+
*
|
|
19
|
+
* Both modes pass through the same atom toolkit defined under .smBody
|
|
20
|
+
* here (rows, lists, kvs, log lines). Body content is per-variant.
|
|
21
|
+
*/
|
|
22
|
+
|
|
23
|
+
.am.sm { display: contents; }
|
|
24
|
+
|
|
25
|
+
/* ---- Standalone chrome ---- */
|
|
26
|
+
|
|
27
|
+
.am .smFrame {
|
|
28
|
+
width: 300px;
|
|
29
|
+
height: 400px;
|
|
30
|
+
background: white;
|
|
31
|
+
border-radius: var(--radius-md);
|
|
32
|
+
border: 1px solid var(--c-cobalt-100);
|
|
33
|
+
box-shadow: 0 8px 24px -10px rgba(0, 0, 0, 0.1);
|
|
34
|
+
overflow: hidden;
|
|
35
|
+
display: flex;
|
|
36
|
+
flex-direction: column;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
/* ---- Panel internals (used in both modes) ---- */
|
|
40
|
+
|
|
41
|
+
.am .smPanel {
|
|
42
|
+
display: flex;
|
|
43
|
+
flex-direction: column;
|
|
44
|
+
height: 100%;
|
|
45
|
+
min-height: 0;
|
|
46
|
+
background: white;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
/* Header: title bar plus close button. */
|
|
50
|
+
.am .smHead {
|
|
51
|
+
padding: 10px 12px;
|
|
52
|
+
display: flex;
|
|
53
|
+
align-items: center;
|
|
54
|
+
gap: 8px;
|
|
55
|
+
border-bottom: 1px solid var(--c-cobalt-100);
|
|
56
|
+
flex-shrink: 0;
|
|
57
|
+
}
|
|
58
|
+
.am .smHead .smTitle {
|
|
59
|
+
flex: 1;
|
|
60
|
+
height: 5px;
|
|
61
|
+
background: var(--c-cobalt-700);
|
|
62
|
+
border-radius: 1px;
|
|
63
|
+
}
|
|
64
|
+
.am .smHead .smClose {
|
|
65
|
+
width: 10px;
|
|
66
|
+
height: 10px;
|
|
67
|
+
background: var(--c-cobalt-300);
|
|
68
|
+
border-radius: 1px;
|
|
69
|
+
flex-shrink: 0;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
/* Tab strip: each tab is a width-fixed pill. Active tab is cobalt with
|
|
73
|
+
a 2px underline that crosses the .smTabs bottom border. */
|
|
74
|
+
.am .smTabs {
|
|
75
|
+
display: flex;
|
|
76
|
+
padding: 0 12px;
|
|
77
|
+
gap: 8px;
|
|
78
|
+
border-bottom: 1px solid var(--c-cobalt-100);
|
|
79
|
+
flex-shrink: 0;
|
|
80
|
+
}
|
|
81
|
+
.am .smTab {
|
|
82
|
+
height: 4px;
|
|
83
|
+
width: 28px;
|
|
84
|
+
background: var(--c-cobalt-200);
|
|
85
|
+
border-radius: 1px;
|
|
86
|
+
margin: 10px 0 8px;
|
|
87
|
+
position: relative;
|
|
88
|
+
}
|
|
89
|
+
.am .smTab.smTabActive {
|
|
90
|
+
background: var(--c-blue-cobalt);
|
|
91
|
+
}
|
|
92
|
+
.am .smTab.smTabActive::after {
|
|
93
|
+
content: "";
|
|
94
|
+
position: absolute;
|
|
95
|
+
bottom: -8px;
|
|
96
|
+
left: -2px;
|
|
97
|
+
right: -2px;
|
|
98
|
+
height: 2px;
|
|
99
|
+
background: var(--c-blue-cobalt);
|
|
100
|
+
border-radius: 1px;
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
/* Body: scrolling region with stacked sections. */
|
|
104
|
+
.am .smBody {
|
|
105
|
+
flex: 1;
|
|
106
|
+
padding: 12px;
|
|
107
|
+
display: flex;
|
|
108
|
+
flex-direction: column;
|
|
109
|
+
gap: 8px;
|
|
110
|
+
min-height: 0;
|
|
111
|
+
overflow: hidden;
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
/* ---- Body atoms ---- */
|
|
115
|
+
|
|
116
|
+
/* Generic row. Defaults to a thin neutral bar. Modifiers below tweak it. */
|
|
117
|
+
.am .smBody .row {
|
|
118
|
+
height: 3px;
|
|
119
|
+
background: var(--c-cobalt-200);
|
|
120
|
+
border-radius: 1px;
|
|
121
|
+
flex-shrink: 0;
|
|
122
|
+
}
|
|
123
|
+
.am .smBody .row.head {
|
|
124
|
+
height: 5px;
|
|
125
|
+
width: 55%;
|
|
126
|
+
background: var(--c-cobalt-700);
|
|
127
|
+
margin-bottom: 4px;
|
|
128
|
+
}
|
|
129
|
+
.am .smBody .row.short { width: 35%; }
|
|
130
|
+
.am .smBody .row.med { width: 70%; }
|
|
131
|
+
.am .smBody .row.dark { background: var(--c-cobalt-700); }
|
|
132
|
+
.am .smBody .row.accent { background: var(--c-orange-knvb); }
|
|
133
|
+
|
|
134
|
+
/* Section break: horizontal rule with a bit of vertical breathing. */
|
|
135
|
+
.am .smBody .smBreak {
|
|
136
|
+
height: 1px;
|
|
137
|
+
background: var(--c-cobalt-100);
|
|
138
|
+
margin: 4px 0;
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
/* Subhead: small block-level title that introduces a section. */
|
|
142
|
+
.am .smBody .smSub {
|
|
143
|
+
height: 4px;
|
|
144
|
+
width: 40%;
|
|
145
|
+
background: var(--c-cobalt-700);
|
|
146
|
+
border-radius: 1px;
|
|
147
|
+
margin-top: 4px;
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
/* Key-value list (used for metadata sidebars). Each row is a label +
|
|
151
|
+
value pair. Label is a short cobalt-400 bar, value is a longer
|
|
152
|
+
cobalt-700 bar. */
|
|
153
|
+
.am .smBody .smKv {
|
|
154
|
+
display: flex;
|
|
155
|
+
align-items: center;
|
|
156
|
+
gap: 8px;
|
|
157
|
+
}
|
|
158
|
+
.am .smBody .smKv .k {
|
|
159
|
+
height: 3px;
|
|
160
|
+
width: 30%;
|
|
161
|
+
background: var(--c-cobalt-400);
|
|
162
|
+
border-radius: 1px;
|
|
163
|
+
flex-shrink: 0;
|
|
164
|
+
}
|
|
165
|
+
.am .smBody .smKv .v {
|
|
166
|
+
flex: 1;
|
|
167
|
+
height: 3px;
|
|
168
|
+
background: var(--c-cobalt-700);
|
|
169
|
+
border-radius: 1px;
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
/* Person row (used for signatures, comments, talk). Avatar plus two
|
|
173
|
+
text rows plus an optional status pip on the right. */
|
|
174
|
+
.am .smBody .smPerson {
|
|
175
|
+
display: flex;
|
|
176
|
+
align-items: center;
|
|
177
|
+
gap: 6px;
|
|
178
|
+
}
|
|
179
|
+
.am .smBody .smPerson .av {
|
|
180
|
+
width: 14px;
|
|
181
|
+
height: 14px;
|
|
182
|
+
border-radius: 50%;
|
|
183
|
+
background: var(--c-mint-300);
|
|
184
|
+
flex-shrink: 0;
|
|
185
|
+
}
|
|
186
|
+
.am .smBody .smPerson.b .av { background: var(--c-lavender-300); }
|
|
187
|
+
.am .smBody .smPerson.c .av { background: var(--c-orange-knvb); }
|
|
188
|
+
.am .smBody .smPerson.d .av { background: var(--c-forest-300); }
|
|
189
|
+
.am .smBody .smPerson.e .av { background: var(--c-terracotta-300); }
|
|
190
|
+
.am .smBody .smPerson .lines {
|
|
191
|
+
flex: 1;
|
|
192
|
+
display: flex;
|
|
193
|
+
flex-direction: column;
|
|
194
|
+
gap: 2px;
|
|
195
|
+
min-width: 0;
|
|
196
|
+
}
|
|
197
|
+
.am .smBody .smPerson .l1 { height: 3px; width: 70%; background: var(--c-cobalt-700); border-radius: 1px; }
|
|
198
|
+
.am .smBody .smPerson .l2 { height: 2px; width: 50%; background: var(--c-cobalt-300); border-radius: 1px; }
|
|
199
|
+
.am .smBody .smPerson .pip {
|
|
200
|
+
width: 8px;
|
|
201
|
+
height: 8px;
|
|
202
|
+
border-radius: 50%;
|
|
203
|
+
background: var(--c-mint-500);
|
|
204
|
+
flex-shrink: 0;
|
|
205
|
+
}
|
|
206
|
+
.am .smBody .smPerson.pending .pip { background: var(--c-orange-knvb); }
|
|
207
|
+
.am .smBody .smPerson.blocked .pip { background: var(--c-red-vermillion); }
|
|
208
|
+
|
|
209
|
+
/* Stage timeline: vertical list with a left-side rail and stage hexes. */
|
|
210
|
+
.am .smBody .smStage {
|
|
211
|
+
display: flex;
|
|
212
|
+
align-items: center;
|
|
213
|
+
gap: 8px;
|
|
214
|
+
}
|
|
215
|
+
.am .smBody .smStage .h {
|
|
216
|
+
width: 10px;
|
|
217
|
+
height: 11px;
|
|
218
|
+
clip-path: var(--hex-pointy-top);
|
|
219
|
+
background: var(--c-mint-500);
|
|
220
|
+
flex-shrink: 0;
|
|
221
|
+
}
|
|
222
|
+
.am .smBody .smStage.now .h { background: var(--c-orange-knvb); }
|
|
223
|
+
.am .smBody .smStage.todo .h { background: var(--c-cobalt-200); }
|
|
224
|
+
.am .smBody .smStage.late .h { background: var(--c-red-vermillion); }
|
|
225
|
+
.am .smBody .smStage .lines { flex: 1; display: flex; flex-direction: column; gap: 2px; min-width: 0; }
|
|
226
|
+
.am .smBody .smStage .l1 { height: 3px; width: 60%; background: var(--c-cobalt-700); border-radius: 1px; }
|
|
227
|
+
.am .smBody .smStage .l2 { height: 2px; width: 40%; background: var(--c-cobalt-300); border-radius: 1px; }
|
|
228
|
+
|
|
229
|
+
/* Log line: monospace-ish row with a status colour at the start. */
|
|
230
|
+
.am .smBody .smLog {
|
|
231
|
+
display: flex;
|
|
232
|
+
align-items: center;
|
|
233
|
+
gap: 6px;
|
|
234
|
+
}
|
|
235
|
+
.am .smBody .smLog .ts { width: 22px; height: 3px; background: var(--c-cobalt-400); border-radius: 1px; flex-shrink: 0; }
|
|
236
|
+
.am .smBody .smLog .msg { flex: 1; height: 3px; background: var(--c-cobalt-700); border-radius: 1px; }
|
|
237
|
+
.am .smBody .smLog.warn .ts { background: var(--c-orange-knvb); }
|
|
238
|
+
.am .smBody .smLog.error .ts { background: var(--c-red-vermillion); }
|
|
239
|
+
|
|
240
|
+
/* PII tag: a small inline pill for redacted content. */
|
|
241
|
+
.am .smBody .smPiiBlock {
|
|
242
|
+
display: flex;
|
|
243
|
+
flex-wrap: wrap;
|
|
244
|
+
gap: 4px;
|
|
245
|
+
}
|
|
246
|
+
.am .smBody .smPii {
|
|
247
|
+
height: 6px;
|
|
248
|
+
background: var(--c-cobalt-200);
|
|
249
|
+
border-radius: 1px;
|
|
250
|
+
}
|
|
251
|
+
.am .smBody .smPii.redacted { background: var(--c-red-vermillion); }
|
|
252
|
+
.am .smBody .smPii.suggested { background: var(--c-orange-knvb); }
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* DeciDesk · decision sidebar, Detail tab.
|
|
3
|
+
*
|
|
4
|
+
* Body of a single decision: title, decision summary paragraph, then
|
|
5
|
+
* structured fields (date, source meeting, decision-maker) and an
|
|
6
|
+
* action-items section showing who owns the follow-up.
|
|
7
|
+
*/
|
|
8
|
+
import React from 'react';
|
|
9
|
+
import styles from '../SidebarMock.module.css';
|
|
10
|
+
|
|
11
|
+
export default function DeciDeskDecision() {
|
|
12
|
+
return (
|
|
13
|
+
<>
|
|
14
|
+
<div className={[styles.row, styles.head].join(' ')}></div>
|
|
15
|
+
<div className={styles.row}></div>
|
|
16
|
+
<div className={[styles.row, styles.med].join(' ')}></div>
|
|
17
|
+
<div className={styles.smBreak}></div>
|
|
18
|
+
<div className={styles.smSub}></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.smPerson}>
|
|
25
|
+
<div className={styles.av}></div>
|
|
26
|
+
<div className={styles.lines}><div className={styles.l1}></div><div className={styles.l2}></div></div>
|
|
27
|
+
<div className={styles.pip}></div>
|
|
28
|
+
</div>
|
|
29
|
+
<div className={[styles.smPerson, styles.b, styles.pending].join(' ')}>
|
|
30
|
+
<div className={styles.av}></div>
|
|
31
|
+
<div className={styles.lines}><div className={styles.l1}></div><div className={styles.l2}></div></div>
|
|
32
|
+
<div className={styles.pip}></div>
|
|
33
|
+
</div>
|
|
34
|
+
</>
|
|
35
|
+
);
|
|
36
|
+
}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* DocuDesk · document sidebar, PII map tab.
|
|
3
|
+
*
|
|
4
|
+
* Inline pills marking redacted spans (red) and suggested redactions
|
|
5
|
+
* (orange) within paragraphs. Reads as "here is what got covered up".
|
|
6
|
+
* Below: a key/value list of PII categories detected (BSN, IBAN, etc.)
|
|
7
|
+
* with counts.
|
|
8
|
+
*/
|
|
9
|
+
import React from 'react';
|
|
10
|
+
import styles from '../SidebarMock.module.css';
|
|
11
|
+
|
|
12
|
+
export default function DocuDeskPiiMap() {
|
|
13
|
+
return (
|
|
14
|
+
<>
|
|
15
|
+
<div className={[styles.row, styles.head].join(' ')}></div>
|
|
16
|
+
<div className={styles.smPiiBlock}>
|
|
17
|
+
<div className={styles.smPii} style={{ width: 30 }}></div>
|
|
18
|
+
<div className={[styles.smPii, styles.redacted].join(' ')} style={{ width: 22 }}></div>
|
|
19
|
+
<div className={styles.smPii} style={{ width: 40 }}></div>
|
|
20
|
+
<div className={[styles.smPii, styles.suggested].join(' ')} style={{ width: 18 }}></div>
|
|
21
|
+
<div className={styles.smPii} style={{ width: 26 }}></div>
|
|
22
|
+
<div className={[styles.smPii, styles.redacted].join(' ')} style={{ width: 30 }}></div>
|
|
23
|
+
<div className={styles.smPii} style={{ width: 16 }}></div>
|
|
24
|
+
<div className={[styles.smPii, styles.suggested].join(' ')} style={{ width: 34 }}></div>
|
|
25
|
+
<div className={styles.smPii} style={{ width: 22 }}></div>
|
|
26
|
+
</div>
|
|
27
|
+
<div className={styles.smBreak}></div>
|
|
28
|
+
<div className={styles.smSub}></div>
|
|
29
|
+
<div className={styles.smKv}><div className={styles.k}></div><div className={styles.v}></div></div>
|
|
30
|
+
<div className={styles.smKv}><div className={styles.k}></div><div className={styles.v}></div></div>
|
|
31
|
+
<div className={styles.smKv}><div className={styles.k}></div><div className={styles.v}></div></div>
|
|
32
|
+
<div className={styles.smKv}><div className={styles.k}></div><div className={styles.v}></div></div>
|
|
33
|
+
<div className={styles.smKv}><div className={styles.k}></div><div className={styles.v}></div></div>
|
|
34
|
+
</>
|
|
35
|
+
);
|
|
36
|
+
}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* DocuDesk · document sidebar, Signatures tab.
|
|
3
|
+
*
|
|
4
|
+
* List of recipients with status pip: signed (mint), pending (orange),
|
|
5
|
+
* blocked / declined (red). Avatar colour mix matches AppMock palette.
|
|
6
|
+
*/
|
|
7
|
+
import React from 'react';
|
|
8
|
+
import styles from '../SidebarMock.module.css';
|
|
9
|
+
|
|
10
|
+
export default function DocuDeskSignatures() {
|
|
11
|
+
return (
|
|
12
|
+
<>
|
|
13
|
+
<div className={[styles.row, styles.head].join(' ')}></div>
|
|
14
|
+
<div className={[styles.row, styles.short].join(' ')}></div>
|
|
15
|
+
<div className={styles.smBreak}></div>
|
|
16
|
+
<div className={styles.smPerson}>
|
|
17
|
+
<div className={styles.av}></div>
|
|
18
|
+
<div className={styles.lines}><div className={styles.l1}></div><div className={styles.l2}></div></div>
|
|
19
|
+
<div className={styles.pip}></div>
|
|
20
|
+
</div>
|
|
21
|
+
<div className={[styles.smPerson, styles.b].join(' ')}>
|
|
22
|
+
<div className={styles.av}></div>
|
|
23
|
+
<div className={styles.lines}><div className={styles.l1}></div><div className={styles.l2}></div></div>
|
|
24
|
+
<div className={styles.pip}></div>
|
|
25
|
+
</div>
|
|
26
|
+
<div className={[styles.smPerson, styles.c, styles.pending].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 className={styles.pip}></div>
|
|
30
|
+
</div>
|
|
31
|
+
<div className={[styles.smPerson, styles.d, styles.pending].join(' ')}>
|
|
32
|
+
<div className={styles.av}></div>
|
|
33
|
+
<div className={styles.lines}><div className={styles.l1}></div><div className={styles.l2}></div></div>
|
|
34
|
+
<div className={styles.pip}></div>
|
|
35
|
+
</div>
|
|
36
|
+
<div className={[styles.smPerson, styles.e, styles.blocked].join(' ')}>
|
|
37
|
+
<div className={styles.av}></div>
|
|
38
|
+
<div className={styles.lines}><div className={styles.l1}></div><div className={styles.l2}></div></div>
|
|
39
|
+
<div className={styles.pip}></div>
|
|
40
|
+
</div>
|
|
41
|
+
</>
|
|
42
|
+
);
|
|
43
|
+
}
|
|
@@ -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
|
+
}
|