@conduction/docusaurus-preset 2.2.0 → 2.3.1
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 +19 -4
- package/src/components/AppMock/AppMock.module.css +49 -0
- package/src/components/AppMock/variants/OpenRegisterMock.jsx +20 -15
- package/src/components/AppMock/variants/ProcestMock.jsx +6 -1
- package/src/components/SidebarMock/SidebarMock.jsx +208 -0
- package/src/components/SidebarMock/SidebarMock.module.css +200 -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,21 @@ export default function AppMock({app, size = 'md', caption = false, className})
|
|
|
77
82
|
);
|
|
78
83
|
}
|
|
79
84
|
const {Component, label} = variant;
|
|
85
|
+
// The `sidebar` prop is forwarded to the variant Component, which
|
|
86
|
+
// renders it as a flex sibling of `.col` inside the variant's
|
|
87
|
+
// `.body`, taking the `.detail` slot. SidebarMock children get
|
|
88
|
+
// `embedded: true` so they drop their standalone .smFrame chrome
|
|
89
|
+
// and render as the bare `.detail.rich` panel that slots into
|
|
90
|
+
// .body. Variants that don't accept a sidebar prop (e.g. MyDash)
|
|
91
|
+
// ignore it; this keeps the change additive.
|
|
92
|
+
const renderedSidebar = React.isValidElement(sidebar)
|
|
93
|
+
? React.cloneElement(sidebar, { embedded: true })
|
|
94
|
+
: sidebar;
|
|
80
95
|
return (
|
|
81
96
|
<div className={styles.am}>
|
|
82
97
|
<figure className={[styles.figure, className].filter(Boolean).join(' ')}>
|
|
83
98
|
<div className={[styles.frame, styles[`size-${size}`]].filter(Boolean).join(' ')}>
|
|
84
|
-
<Component />
|
|
99
|
+
<Component sidebar={renderedSidebar} />
|
|
85
100
|
</div>
|
|
86
101
|
{caption && <figcaption className={styles.caption}>{label}</figcaption>}
|
|
87
102
|
</figure>
|
|
@@ -142,6 +142,55 @@
|
|
|
142
142
|
flex-shrink: 0;
|
|
143
143
|
}
|
|
144
144
|
|
|
145
|
+
/* Sidebar (enriched .detail) matches the real Nextcloud sidepanel:
|
|
146
|
+
header (icon + title + description + close), tabs, then content.
|
|
147
|
+
Used by SidebarMock embedded mode (slots into <body>'s flex layout
|
|
148
|
+
as a sibling of .col, taking the .detail slot) and by the kit
|
|
149
|
+
page templates section. */
|
|
150
|
+
.am .detail.rich { padding: 0; gap: 0; }
|
|
151
|
+
.am .detail.rich .sb-head {
|
|
152
|
+
display: flex; align-items: center; gap: 6px;
|
|
153
|
+
padding: 10px;
|
|
154
|
+
border-bottom: 1px solid var(--c-cobalt-100);
|
|
155
|
+
}
|
|
156
|
+
.am .detail.rich .sb-head .ico {
|
|
157
|
+
width: 16px; height: 16px;
|
|
158
|
+
border-radius: 50%;
|
|
159
|
+
background: var(--c-cobalt-50);
|
|
160
|
+
border: 1px solid var(--c-cobalt-200);
|
|
161
|
+
flex-shrink: 0;
|
|
162
|
+
}
|
|
163
|
+
.am .detail.rich .sb-head .meta {
|
|
164
|
+
flex: 1; display: flex; flex-direction: column; gap: 3px;
|
|
165
|
+
min-width: 0;
|
|
166
|
+
}
|
|
167
|
+
.am .detail.rich .sb-head .title { height: 6px; background: var(--c-cobalt-900); border-radius: 1px; width: 50%; }
|
|
168
|
+
.am .detail.rich .sb-head .desc { height: 3px; background: var(--c-cobalt-300); border-radius: 1px; width: 85%; }
|
|
169
|
+
.am .detail.rich .sb-head .close { width: 8px; height: 8px; background: var(--c-cobalt-300); flex-shrink: 0; }
|
|
170
|
+
|
|
171
|
+
.am .detail.rich .sb-tabs {
|
|
172
|
+
display: flex;
|
|
173
|
+
padding: 0 10px;
|
|
174
|
+
border-bottom: 1px solid var(--c-cobalt-100);
|
|
175
|
+
}
|
|
176
|
+
.am .detail.rich .sb-tab {
|
|
177
|
+
flex: 1; padding: 6px 0;
|
|
178
|
+
display: flex; flex-direction: column; align-items: center; gap: 3px;
|
|
179
|
+
border-bottom: 2px solid transparent;
|
|
180
|
+
}
|
|
181
|
+
.am .detail.rich .sb-tab.active { border-bottom-color: var(--c-blue-cobalt); }
|
|
182
|
+
.am .detail.rich .sb-tab .ico { width: 7px; height: 7px; border-radius: 50%; background: var(--c-cobalt-300); }
|
|
183
|
+
.am .detail.rich .sb-tab.active .ico { background: var(--c-cobalt-700); }
|
|
184
|
+
.am .detail.rich .sb-tab .l { height: 3px; background: var(--c-cobalt-300); width: 24px; border-radius: 1px; }
|
|
185
|
+
.am .detail.rich .sb-tab.active .l { background: var(--c-cobalt-700); }
|
|
186
|
+
|
|
187
|
+
.am .detail.rich .sb-body { padding: 10px; display: flex; flex-direction: column; gap: 7px; overflow: hidden; }
|
|
188
|
+
.am .detail.rich .sb-label { height: 4px; background: var(--c-cobalt-700); width: 40%; border-radius: 1px; }
|
|
189
|
+
.am .detail.rich .sb-input { height: 14px; background: white; border: 1px solid var(--c-cobalt-200); border-radius: 3px; }
|
|
190
|
+
.am .detail.rich .sb-filter { display: flex; flex-direction: column; gap: 4px; }
|
|
191
|
+
.am .detail.rich .sb-filter .lbl { height: 3px; background: var(--c-cobalt-400); width: 30%; border-radius: 1px; }
|
|
192
|
+
.am .detail.rich .sb-filter .field { height: 12px; background: white; border: 1px solid var(--c-cobalt-200); border-radius: 2px; }
|
|
193
|
+
|
|
145
194
|
/* Generic content panel — white card with rounded corners. */
|
|
146
195
|
.am .panel {
|
|
147
196
|
background: white;
|
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
import React from 'react';
|
|
11
11
|
import styles from '../AppMock.module.css';
|
|
12
12
|
|
|
13
|
-
export default function OpenRegisterMock() {
|
|
13
|
+
export default function OpenRegisterMock({ sidebar = null }) {
|
|
14
14
|
return (
|
|
15
15
|
<>
|
|
16
16
|
<div className={styles.topbar}>
|
|
@@ -80,20 +80,25 @@ export default function OpenRegisterMock() {
|
|
|
80
80
|
</div>
|
|
81
81
|
</div>
|
|
82
82
|
</div>
|
|
83
|
-
{/* Right detail rail
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
<div
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
83
|
+
{/* Right detail rail. When AppMock passes a `sidebar` prop
|
|
84
|
+
(typically a <SidebarMock kind="..." embedded />), it
|
|
85
|
+
renders as the rich detail rail instead of the placeholder
|
|
86
|
+
rows. */}
|
|
87
|
+
{sidebar || (
|
|
88
|
+
<div className={styles.detail}>
|
|
89
|
+
<div className={styles.row + ' ' + styles.head}></div>
|
|
90
|
+
<div className={styles.row}></div>
|
|
91
|
+
<div className={styles.row + ' ' + styles.short}></div>
|
|
92
|
+
<div style={{height: 8}}></div>
|
|
93
|
+
<div className={styles.row + ' ' + styles.head}></div>
|
|
94
|
+
<div className={styles.row + ' ' + styles.dark}></div>
|
|
95
|
+
<div className={styles.row}></div>
|
|
96
|
+
<div className={styles.row}></div>
|
|
97
|
+
<div className={styles.row + ' ' + styles.short}></div>
|
|
98
|
+
<div className={styles.row + ' ' + styles.accent}></div>
|
|
99
|
+
<div className={styles.row + ' ' + styles.short}></div>
|
|
100
|
+
</div>
|
|
101
|
+
)}
|
|
97
102
|
</div>
|
|
98
103
|
</>
|
|
99
104
|
);
|
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
import React from 'react';
|
|
12
12
|
import styles from '../AppMock.module.css';
|
|
13
13
|
|
|
14
|
-
export default function ProcestMock() {
|
|
14
|
+
export default function ProcestMock({ sidebar = null }) {
|
|
15
15
|
return (
|
|
16
16
|
<>
|
|
17
17
|
<div className={styles.topbar}>
|
|
@@ -81,6 +81,11 @@ export default function ProcestMock() {
|
|
|
81
81
|
</div>
|
|
82
82
|
</div>
|
|
83
83
|
</div>
|
|
84
|
+
{/* Optional sidebar (typically a <SidebarMock kind="..." />)
|
|
85
|
+
renders here as a flex sibling of .col, taking the .detail
|
|
86
|
+
slot. Procest's case detail view doesn't ship a default
|
|
87
|
+
detail rail, so without the prop nothing extra renders. */}
|
|
88
|
+
{sidebar}
|
|
84
89
|
</div>
|
|
85
90
|
</>
|
|
86
91
|
);
|
|
@@ -0,0 +1,208 @@
|
|
|
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
|
+
* Markup matches the existing .detail.rich pattern that already
|
|
12
|
+
* lived in the AppMock kit anatomy: a .sb-head row (icon + meta of
|
|
13
|
+
* title + description + close), a .sb-tabs strip (one per registered
|
|
14
|
+
* tab, active marker on the current one), and a .sb-body. All
|
|
15
|
+
* styles live in AppMock.module.css under .am .detail.rich; the
|
|
16
|
+
* body atoms (smKv / smPerson / smStage / smLog / smPii) live in
|
|
17
|
+
* SidebarMock.module.css under .am .sb-body so they only apply
|
|
18
|
+
* inside a sidebar.
|
|
19
|
+
*
|
|
20
|
+
* Two render modes:
|
|
21
|
+
*
|
|
22
|
+
* STANDALONE (default): wraps the .detail.rich panel in
|
|
23
|
+
* <div class="am sm"> + .smFrame so it reads as a card on the
|
|
24
|
+
* kit page. Use in marketing copy that talks about a single
|
|
25
|
+
* sidebar surface in isolation.
|
|
26
|
+
*
|
|
27
|
+
* <SidebarMock kind="procest-xwiki" />
|
|
28
|
+
*
|
|
29
|
+
* EMBEDDED: drops the .smFrame wrapper, leaving just
|
|
30
|
+
* <div class="detail rich">…</div>. Slots into the .body flex
|
|
31
|
+
* layout of an AppMock variant as a sibling of .col, taking the
|
|
32
|
+
* detail-rail position. Set automatically by AppMock when the
|
|
33
|
+
* `sidebar` prop is a SidebarMock JSX element.
|
|
34
|
+
*
|
|
35
|
+
* <AppMock app="procest" sidebar={<SidebarMock kind="procest-xwiki" />} />
|
|
36
|
+
*
|
|
37
|
+
* Status colour map matches WidgetMock and AppMock atoms:
|
|
38
|
+
* mint = stable / done / signed
|
|
39
|
+
* orange = active / pending / due soon
|
|
40
|
+
* red = blocked / overdue / failed
|
|
41
|
+
* cobalt-200 = upcoming / idle / no action
|
|
42
|
+
*
|
|
43
|
+
* Props:
|
|
44
|
+
* - kind: one of VARIANTS keys (required)
|
|
45
|
+
* - embedded: boolean (default false) — drop the standalone
|
|
46
|
+
* .smFrame chrome so the
|
|
47
|
+
* panel slots into
|
|
48
|
+
* AppMock's .body layout
|
|
49
|
+
* - className: string
|
|
50
|
+
*/
|
|
51
|
+
|
|
52
|
+
import React from 'react';
|
|
53
|
+
import styles from './SidebarMock.module.css';
|
|
54
|
+
import amStyles from '../AppMock/AppMock.module.css';
|
|
55
|
+
|
|
56
|
+
import ProcestXWiki from './variants/ProcestXWiki.jsx';
|
|
57
|
+
import ProcestTimeline from './variants/ProcestTimeline.jsx';
|
|
58
|
+
import DocuDeskSignatures from './variants/DocuDeskSignatures.jsx';
|
|
59
|
+
import DocuDeskPiiMap from './variants/DocuDeskPiiMap.jsx';
|
|
60
|
+
import OpenRegisterMetadata from './variants/OpenRegisterMetadata.jsx';
|
|
61
|
+
import OpenCatalogiPublicationHistory from './variants/OpenCatalogiPublicationHistory.jsx';
|
|
62
|
+
import OpenConnectorRunDetail from './variants/OpenConnectorRunDetail.jsx';
|
|
63
|
+
import DeciDeskDecision from './variants/DeciDeskDecision.jsx';
|
|
64
|
+
import NextcloudActivity from './variants/NextcloudActivity.jsx';
|
|
65
|
+
|
|
66
|
+
/**
|
|
67
|
+
* Each VARIANTS entry carries:
|
|
68
|
+
* Component: the JSX that fills the .sb-body
|
|
69
|
+
* label: human-readable name (used in caption / kit page)
|
|
70
|
+
* tabs: ordered list of tabs with one .active. The id is
|
|
71
|
+
* decorative (rendered as a placeholder bar in .sb-tab .l)
|
|
72
|
+
* but the active flag drives the highlight.
|
|
73
|
+
*/
|
|
74
|
+
const VARIANTS = {
|
|
75
|
+
'procest-xwiki': {
|
|
76
|
+
Component: ProcestXWiki,
|
|
77
|
+
label: 'Procest · Case sidebar, xWiki tab',
|
|
78
|
+
tabs: [
|
|
79
|
+
{ id: 'activity', active: false },
|
|
80
|
+
{ id: 'xwiki', active: true },
|
|
81
|
+
{ id: 'timeline', active: false },
|
|
82
|
+
{ id: 'documents', active: false },
|
|
83
|
+
],
|
|
84
|
+
},
|
|
85
|
+
'procest-timeline': {
|
|
86
|
+
Component: ProcestTimeline,
|
|
87
|
+
label: 'Procest · Case sidebar, Timeline tab',
|
|
88
|
+
tabs: [
|
|
89
|
+
{ id: 'activity', active: false },
|
|
90
|
+
{ id: 'xwiki', active: false },
|
|
91
|
+
{ id: 'timeline', active: true },
|
|
92
|
+
{ id: 'documents', active: false },
|
|
93
|
+
],
|
|
94
|
+
},
|
|
95
|
+
'docudesk-signatures': {
|
|
96
|
+
Component: DocuDeskSignatures,
|
|
97
|
+
label: 'DocuDesk · Document sidebar, Signatures tab',
|
|
98
|
+
tabs: [
|
|
99
|
+
{ id: 'activity', active: false },
|
|
100
|
+
{ id: 'signatures', active: true },
|
|
101
|
+
{ id: 'pii', active: false },
|
|
102
|
+
{ id: 'versions', active: false },
|
|
103
|
+
],
|
|
104
|
+
},
|
|
105
|
+
'docudesk-pii-map': {
|
|
106
|
+
Component: DocuDeskPiiMap,
|
|
107
|
+
label: 'DocuDesk · Document sidebar, PII map tab',
|
|
108
|
+
tabs: [
|
|
109
|
+
{ id: 'activity', active: false },
|
|
110
|
+
{ id: 'signatures', active: false },
|
|
111
|
+
{ id: 'pii', active: true },
|
|
112
|
+
{ id: 'versions', active: false },
|
|
113
|
+
],
|
|
114
|
+
},
|
|
115
|
+
'openregister-metadata': {
|
|
116
|
+
Component: OpenRegisterMetadata,
|
|
117
|
+
label: 'OpenRegister · Object sidebar, Metadata tab',
|
|
118
|
+
tabs: [
|
|
119
|
+
{ id: 'activity', active: false },
|
|
120
|
+
{ id: 'metadata', active: true },
|
|
121
|
+
{ id: 'audit', active: false },
|
|
122
|
+
],
|
|
123
|
+
},
|
|
124
|
+
'opencatalogi-publication-history': {
|
|
125
|
+
Component: OpenCatalogiPublicationHistory,
|
|
126
|
+
label: 'OpenCatalogi · Publication sidebar, History tab',
|
|
127
|
+
tabs: [
|
|
128
|
+
{ id: 'activity', active: false },
|
|
129
|
+
{ id: 'history', active: true },
|
|
130
|
+
{ id: 'sources', active: false },
|
|
131
|
+
],
|
|
132
|
+
},
|
|
133
|
+
'openconnector-run-detail': {
|
|
134
|
+
Component: OpenConnectorRunDetail,
|
|
135
|
+
label: 'OpenConnector · Run sidebar, Logs tab',
|
|
136
|
+
tabs: [
|
|
137
|
+
{ id: 'activity', active: false },
|
|
138
|
+
{ id: 'logs', active: true },
|
|
139
|
+
{ id: 'mapping', active: false },
|
|
140
|
+
],
|
|
141
|
+
},
|
|
142
|
+
'decidesk-decision': {
|
|
143
|
+
Component: DeciDeskDecision,
|
|
144
|
+
label: 'DeciDesk · Decision sidebar, Detail tab',
|
|
145
|
+
tabs: [
|
|
146
|
+
{ id: 'activity', active: false },
|
|
147
|
+
{ id: 'detail', active: true },
|
|
148
|
+
{ id: 'actions', active: false },
|
|
149
|
+
],
|
|
150
|
+
},
|
|
151
|
+
'nextcloud-activity': {
|
|
152
|
+
Component: NextcloudActivity,
|
|
153
|
+
label: 'Nextcloud · Stock activity feed',
|
|
154
|
+
tabs: [
|
|
155
|
+
{ id: 'activity', active: true },
|
|
156
|
+
{ id: 'comments', active: false },
|
|
157
|
+
],
|
|
158
|
+
},
|
|
159
|
+
};
|
|
160
|
+
|
|
161
|
+
export default function SidebarMock({ kind, embedded = false, className }) {
|
|
162
|
+
const variant = VARIANTS[kind];
|
|
163
|
+
if (!variant) {
|
|
164
|
+
return (
|
|
165
|
+
<div className={[amStyles.am, styles.sm].filter(Boolean).join(' ')}>
|
|
166
|
+
<div className={styles.smFrame}>
|
|
167
|
+
<div style={{ padding: 12, color: 'var(--c-cobalt-400)', fontSize: 11 }}>Unknown sidebar: {kind}</div>
|
|
168
|
+
</div>
|
|
169
|
+
</div>
|
|
170
|
+
);
|
|
171
|
+
}
|
|
172
|
+
const { Component, tabs } = variant;
|
|
173
|
+
const panel = (
|
|
174
|
+
<div className={[amStyles.detail, amStyles.rich].join(' ')}>
|
|
175
|
+
<div className={amStyles['sb-head']}>
|
|
176
|
+
<div className={amStyles.ico}></div>
|
|
177
|
+
<div className={amStyles.meta}>
|
|
178
|
+
<div className={amStyles.title}></div>
|
|
179
|
+
<div className={amStyles.desc}></div>
|
|
180
|
+
</div>
|
|
181
|
+
<div className={amStyles.close}></div>
|
|
182
|
+
</div>
|
|
183
|
+
{tabs && tabs.length > 0 && (
|
|
184
|
+
<div className={amStyles['sb-tabs']}>
|
|
185
|
+
{tabs.map((t, i) => (
|
|
186
|
+
<div key={t.id || i} className={[amStyles['sb-tab'], t.active && amStyles.active].filter(Boolean).join(' ')}>
|
|
187
|
+
<div className={amStyles.ico}></div>
|
|
188
|
+
<div className={amStyles.l}></div>
|
|
189
|
+
</div>
|
|
190
|
+
))}
|
|
191
|
+
</div>
|
|
192
|
+
)}
|
|
193
|
+
<div className={amStyles['sb-body']}>
|
|
194
|
+
<Component />
|
|
195
|
+
</div>
|
|
196
|
+
</div>
|
|
197
|
+
);
|
|
198
|
+
|
|
199
|
+
if (embedded) return panel;
|
|
200
|
+
|
|
201
|
+
return (
|
|
202
|
+
<div className={[amStyles.am, styles.sm, className].filter(Boolean).join(' ')}>
|
|
203
|
+
<div className={styles.smFrame}>
|
|
204
|
+
{panel}
|
|
205
|
+
</div>
|
|
206
|
+
</div>
|
|
207
|
+
);
|
|
208
|
+
}
|
|
@@ -0,0 +1,200 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* <SidebarMock /> styles.
|
|
3
|
+
*
|
|
4
|
+
* The sidebar chassis (.detail.rich, .sb-head, .sb-tabs, .sb-body and
|
|
5
|
+
* its built-in atoms .sb-input / .sb-filter / .sb-label) lives in
|
|
6
|
+
* AppMock/AppMock.module.css. SidebarMock reuses that module so the
|
|
7
|
+
* panel renders identically whether it is embedded inside an AppMock
|
|
8
|
+
* (taking the .detail slot in .body's flex layout) or rendered
|
|
9
|
+
* standalone for kit-page specimens.
|
|
10
|
+
*
|
|
11
|
+
* What lives here:
|
|
12
|
+
*
|
|
13
|
+
* .smFrame — the standalone wrapper card (white box, shadow,
|
|
14
|
+
* radius, fixed size). Used only when rendering the
|
|
15
|
+
* sidebar standalone in marketing copy or kit pages;
|
|
16
|
+
* embedded mode skips it so the panel slots into
|
|
17
|
+
* .body's flex layout untouched.
|
|
18
|
+
*
|
|
19
|
+
* .am .sb-body atoms — extra body-level atoms beyond what
|
|
20
|
+
* AppMock.module.css already provides under .sb-body
|
|
21
|
+
* (.sb-input, .sb-filter, .sb-label). The atoms here
|
|
22
|
+
* cover the rest of the marketing surfaces: key/value
|
|
23
|
+
* pairs (smKv), person rows with status pip (smPerson),
|
|
24
|
+
* stage timelines (smStage), log lines (smLog), and
|
|
25
|
+
* PII-redaction pill maps (smPii).
|
|
26
|
+
*/
|
|
27
|
+
|
|
28
|
+
.am.sm { display: contents; }
|
|
29
|
+
|
|
30
|
+
/* Standalone wrapper card. Inside, the .detail.rich panel renders
|
|
31
|
+
identically to its embedded twin, just clipped to the smFrame box. */
|
|
32
|
+
.am .smFrame {
|
|
33
|
+
width: 300px;
|
|
34
|
+
height: 400px;
|
|
35
|
+
background: white;
|
|
36
|
+
border-radius: var(--radius-md);
|
|
37
|
+
border: 1px solid var(--c-cobalt-100);
|
|
38
|
+
box-shadow: 0 8px 24px -10px rgba(0, 0, 0, 0.1);
|
|
39
|
+
overflow: hidden;
|
|
40
|
+
display: flex;
|
|
41
|
+
flex-direction: column;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
/* Inside .smFrame the .detail.rich child needs to fill the box; the
|
|
45
|
+
default .detail width: 26% rule is meant for an embedded layout so
|
|
46
|
+
we override here. */
|
|
47
|
+
.am .smFrame > .detail.rich {
|
|
48
|
+
width: 100%;
|
|
49
|
+
min-width: 0;
|
|
50
|
+
flex: 1;
|
|
51
|
+
border-left: none;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
/* ---- Body atoms beyond the AppMock-provided sb-input / sb-filter ---- */
|
|
55
|
+
|
|
56
|
+
/* Generic row block. Sized by class modifier; defaults to thin neutral. */
|
|
57
|
+
.am .sb-body .row {
|
|
58
|
+
height: 3px;
|
|
59
|
+
background: var(--c-cobalt-200);
|
|
60
|
+
border-radius: 1px;
|
|
61
|
+
flex-shrink: 0;
|
|
62
|
+
width: 100%;
|
|
63
|
+
}
|
|
64
|
+
.am .sb-body .row.head {
|
|
65
|
+
height: 5px;
|
|
66
|
+
width: 55%;
|
|
67
|
+
background: var(--c-cobalt-700);
|
|
68
|
+
margin-bottom: 4px;
|
|
69
|
+
}
|
|
70
|
+
.am .sb-body .row.short { width: 35%; }
|
|
71
|
+
.am .sb-body .row.med { width: 70%; }
|
|
72
|
+
.am .sb-body .row.dark { background: var(--c-cobalt-700); }
|
|
73
|
+
.am .sb-body .row.accent { background: var(--c-orange-knvb); }
|
|
74
|
+
|
|
75
|
+
/* Section break: thin horizontal rule between sub-sections. */
|
|
76
|
+
.am .sb-body .smBreak {
|
|
77
|
+
height: 1px;
|
|
78
|
+
background: var(--c-cobalt-100);
|
|
79
|
+
margin: 4px 0;
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
/* Subhead: short bold-weight bar that introduces a new section. */
|
|
83
|
+
.am .sb-body .smSub {
|
|
84
|
+
height: 4px;
|
|
85
|
+
width: 40%;
|
|
86
|
+
background: var(--c-cobalt-700);
|
|
87
|
+
border-radius: 1px;
|
|
88
|
+
margin-top: 4px;
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
/* Key-value list (used for metadata tabs). Label cobalt-400 short bar
|
|
92
|
+
plus longer cobalt-700 value bar on the same row. */
|
|
93
|
+
.am .sb-body .smKv {
|
|
94
|
+
display: flex;
|
|
95
|
+
align-items: center;
|
|
96
|
+
gap: 8px;
|
|
97
|
+
}
|
|
98
|
+
.am .sb-body .smKv .k {
|
|
99
|
+
height: 3px;
|
|
100
|
+
width: 30%;
|
|
101
|
+
background: var(--c-cobalt-400);
|
|
102
|
+
border-radius: 1px;
|
|
103
|
+
flex-shrink: 0;
|
|
104
|
+
}
|
|
105
|
+
.am .sb-body .smKv .v {
|
|
106
|
+
flex: 1;
|
|
107
|
+
height: 3px;
|
|
108
|
+
background: var(--c-cobalt-700);
|
|
109
|
+
border-radius: 1px;
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
/* Person row (signatures, comments, history). Avatar + two text rows
|
|
113
|
+
+ optional status pip. .b/.c/.d/.e modifiers shift the avatar to
|
|
114
|
+
the matching family colour. .pending / .blocked modifiers shift
|
|
115
|
+
the pip to orange / red. */
|
|
116
|
+
.am .sb-body .smPerson {
|
|
117
|
+
display: flex;
|
|
118
|
+
align-items: center;
|
|
119
|
+
gap: 6px;
|
|
120
|
+
}
|
|
121
|
+
.am .sb-body .smPerson .av {
|
|
122
|
+
width: 14px;
|
|
123
|
+
height: 14px;
|
|
124
|
+
border-radius: 50%;
|
|
125
|
+
background: var(--c-mint-300);
|
|
126
|
+
flex-shrink: 0;
|
|
127
|
+
}
|
|
128
|
+
.am .sb-body .smPerson.b .av { background: var(--c-lavender-300); }
|
|
129
|
+
.am .sb-body .smPerson.c .av { background: var(--c-orange-knvb); }
|
|
130
|
+
.am .sb-body .smPerson.d .av { background: var(--c-forest-300); }
|
|
131
|
+
.am .sb-body .smPerson.e .av { background: var(--c-terracotta-300); }
|
|
132
|
+
.am .sb-body .smPerson .lines {
|
|
133
|
+
flex: 1;
|
|
134
|
+
display: flex;
|
|
135
|
+
flex-direction: column;
|
|
136
|
+
gap: 2px;
|
|
137
|
+
min-width: 0;
|
|
138
|
+
}
|
|
139
|
+
.am .sb-body .smPerson .l1 { height: 3px; width: 70%; background: var(--c-cobalt-700); border-radius: 1px; }
|
|
140
|
+
.am .sb-body .smPerson .l2 { height: 2px; width: 50%; background: var(--c-cobalt-300); border-radius: 1px; }
|
|
141
|
+
.am .sb-body .smPerson .pip {
|
|
142
|
+
width: 8px;
|
|
143
|
+
height: 8px;
|
|
144
|
+
border-radius: 50%;
|
|
145
|
+
background: var(--c-mint-500);
|
|
146
|
+
flex-shrink: 0;
|
|
147
|
+
}
|
|
148
|
+
.am .sb-body .smPerson.pending .pip { background: var(--c-orange-knvb); }
|
|
149
|
+
.am .sb-body .smPerson.blocked .pip { background: var(--c-red-vermillion); }
|
|
150
|
+
|
|
151
|
+
/* Stage timeline (case sidebar, Timeline tab). Vertical list with a
|
|
152
|
+
stage hex on the left and two text rows. Modifiers .now / .late /
|
|
153
|
+
.todo shift the hex colour. */
|
|
154
|
+
.am .sb-body .smStage {
|
|
155
|
+
display: flex;
|
|
156
|
+
align-items: center;
|
|
157
|
+
gap: 8px;
|
|
158
|
+
}
|
|
159
|
+
.am .sb-body .smStage .h {
|
|
160
|
+
width: 10px;
|
|
161
|
+
height: 11px;
|
|
162
|
+
clip-path: var(--hex-pointy-top);
|
|
163
|
+
background: var(--c-mint-500);
|
|
164
|
+
flex-shrink: 0;
|
|
165
|
+
}
|
|
166
|
+
.am .sb-body .smStage.now .h { background: var(--c-orange-knvb); }
|
|
167
|
+
.am .sb-body .smStage.todo .h { background: var(--c-cobalt-200); }
|
|
168
|
+
.am .sb-body .smStage.late .h { background: var(--c-red-vermillion); }
|
|
169
|
+
.am .sb-body .smStage .lines { flex: 1; display: flex; flex-direction: column; gap: 2px; min-width: 0; }
|
|
170
|
+
.am .sb-body .smStage .l1 { height: 3px; width: 60%; background: var(--c-cobalt-700); border-radius: 1px; }
|
|
171
|
+
.am .sb-body .smStage .l2 { height: 2px; width: 40%; background: var(--c-cobalt-300); border-radius: 1px; }
|
|
172
|
+
|
|
173
|
+
/* Log line (run-detail sidebar). Short timestamp bar + message bar.
|
|
174
|
+
.warn / .error tint the timestamp to orange / red so the eye can
|
|
175
|
+
scan severity at a glance. */
|
|
176
|
+
.am .sb-body .smLog {
|
|
177
|
+
display: flex;
|
|
178
|
+
align-items: center;
|
|
179
|
+
gap: 6px;
|
|
180
|
+
}
|
|
181
|
+
.am .sb-body .smLog .ts { width: 22px; height: 3px; background: var(--c-cobalt-400); border-radius: 1px; flex-shrink: 0; }
|
|
182
|
+
.am .sb-body .smLog .msg { flex: 1; height: 3px; background: var(--c-cobalt-700); border-radius: 1px; }
|
|
183
|
+
.am .sb-body .smLog.warn .ts { background: var(--c-orange-knvb); }
|
|
184
|
+
.am .sb-body .smLog.error .ts { background: var(--c-red-vermillion); }
|
|
185
|
+
|
|
186
|
+
/* PII redaction map (DocuDesk PII tab). Inline pills marking spans
|
|
187
|
+
in a paragraph; .redacted = applied (red), .suggested = proposed
|
|
188
|
+
(orange), default = neutral text. */
|
|
189
|
+
.am .sb-body .smPiiBlock {
|
|
190
|
+
display: flex;
|
|
191
|
+
flex-wrap: wrap;
|
|
192
|
+
gap: 4px;
|
|
193
|
+
}
|
|
194
|
+
.am .sb-body .smPii {
|
|
195
|
+
height: 6px;
|
|
196
|
+
background: var(--c-cobalt-200);
|
|
197
|
+
border-radius: 1px;
|
|
198
|
+
}
|
|
199
|
+
.am .sb-body .smPii.redacted { background: var(--c-red-vermillion); }
|
|
200
|
+
.am .sb-body .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
|
+
}
|