@conduction/docusaurus-preset 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (163) hide show
  1. package/MISSING_COMPONENTS.md +109 -0
  2. package/README.md +171 -0
  3. package/package.json +59 -0
  4. package/src/components/AgentTrace/AgentTrace.jsx +128 -0
  5. package/src/components/AgentTrace/AgentTrace.module.css +115 -0
  6. package/src/components/AppMock/AppMock.jsx +86 -0
  7. package/src/components/AppMock/AppMock.module.css +629 -0
  8. package/src/components/AppMock/variants/DeciDeskMock.jsx +71 -0
  9. package/src/components/AppMock/variants/DocuDeskMock.jsx +69 -0
  10. package/src/components/AppMock/variants/LarpingAppMock.jsx +59 -0
  11. package/src/components/AppMock/variants/MyDashBiMock.jsx +135 -0
  12. package/src/components/AppMock/variants/MyDashMock.jsx +96 -0
  13. package/src/components/AppMock/variants/MyDashTilesMock.jsx +103 -0
  14. package/src/components/AppMock/variants/MyDashWidgetsMock.jsx +123 -0
  15. package/src/components/AppMock/variants/NLDesignMock.jsx +70 -0
  16. package/src/components/AppMock/variants/OpenCatalogiMock.jsx +61 -0
  17. package/src/components/AppMock/variants/OpenConnectorMock.jsx +83 -0
  18. package/src/components/AppMock/variants/OpenRegisterMock.jsx +100 -0
  19. package/src/components/AppMock/variants/OpenWooMock.jsx +61 -0
  20. package/src/components/AppMock/variants/PipelinQMock.jsx +88 -0
  21. package/src/components/AppMock/variants/ProcestMock.jsx +87 -0
  22. package/src/components/AppMock/variants/SoftwareCatalogMock.jsx +71 -0
  23. package/src/components/AppMock/variants/ZaakAfhandelAppMock.jsx +71 -0
  24. package/src/components/AppsGrid/AppsGrid.jsx +84 -0
  25. package/src/components/AppsGrid/AppsGrid.module.css +46 -0
  26. package/src/components/AppsPreview/AppsPreview.jsx +85 -0
  27. package/src/components/AppsPreview/AppsPreview.module.css +128 -0
  28. package/src/components/Clients/Clients.jsx +205 -0
  29. package/src/components/Clients/Clients.module.css +166 -0
  30. package/src/components/ComposeBlock/ComposeBlock.jsx +70 -0
  31. package/src/components/ComposeBlock/ComposeBlock.module.css +74 -0
  32. package/src/components/ConductionBg/ConductionBg.jsx +150 -0
  33. package/src/components/ConductionBg/ConductionBg.module.css +41 -0
  34. package/src/components/ContentCard/ContentCard.jsx +126 -0
  35. package/src/components/ContentCard/ContentCard.module.css +84 -0
  36. package/src/components/ContentDetailHero/ContentDetailHero.jsx +136 -0
  37. package/src/components/ContentDetailHero/ContentDetailHero.module.css +96 -0
  38. package/src/components/ContentTypeFilter/ContentTypeFilter.jsx +103 -0
  39. package/src/components/ContentTypeFilter/ContentTypeFilter.module.css +60 -0
  40. package/src/components/ContentTypeFilter/contentTypes.js +58 -0
  41. package/src/components/CookieCli/CookieCli.jsx +223 -0
  42. package/src/components/CookieCli/CookieCli.module.css +166 -0
  43. package/src/components/CtaBanner/CtaBanner.jsx +61 -0
  44. package/src/components/CtaBanner/CtaBanner.module.css +65 -0
  45. package/src/components/DetailHero/DetailHero.jsx +143 -0
  46. package/src/components/DetailHero/DetailHero.module.css +154 -0
  47. package/src/components/Diagrams/Diagrams.jsx +148 -0
  48. package/src/components/EmployeeCard/EmployeeCard.jsx +127 -0
  49. package/src/components/EmployeeCard/EmployeeCard.module.css +144 -0
  50. package/src/components/ExternalAppShelf/ExternalAppShelf.jsx +61 -0
  51. package/src/components/ExternalAppShelf/ExternalAppShelf.module.css +90 -0
  52. package/src/components/FAQ/FAQ.jsx +42 -0
  53. package/src/components/FAQ/FAQ.module.css +74 -0
  54. package/src/components/FacetedFilters/FacetedFilters.jsx +125 -0
  55. package/src/components/FacetedFilters/FacetedFilters.module.css +133 -0
  56. package/src/components/FeatureGrid/FeatureGrid.jsx +94 -0
  57. package/src/components/FeatureGrid/FeatureGrid.module.css +114 -0
  58. package/src/components/FeatureList/FeatureList.jsx +54 -0
  59. package/src/components/FeatureList/FeatureList.module.css +52 -0
  60. package/src/components/FeaturedCard/FeaturedCard.jsx +101 -0
  61. package/src/components/FeaturedCard/FeaturedCard.module.css +98 -0
  62. package/src/components/GameModal/GameModal.jsx +197 -0
  63. package/src/components/GameModal/GameModal.module.css +184 -0
  64. package/src/components/Hero/Hero.jsx +101 -0
  65. package/src/components/Hero/Hero.module.css +95 -0
  66. package/src/components/HexBackground/HexBackground.jsx +56 -0
  67. package/src/components/HexBackground/HexBackground.module.css +73 -0
  68. package/src/components/HexNetwork/HexNetwork.jsx +141 -0
  69. package/src/components/HexNetwork/HexNetwork.module.css +187 -0
  70. package/src/components/HexRain/HexRain.jsx +81 -0
  71. package/src/components/HowSteps/HowSteps.jsx +57 -0
  72. package/src/components/HowSteps/HowSteps.module.css +52 -0
  73. package/src/components/ManagedCommonGround/ManagedCommonGround.jsx +78 -0
  74. package/src/components/ManagedCommonGround/ManagedCommonGround.module.css +16 -0
  75. package/src/components/NewsletterCta/NewsletterCta.jsx +83 -0
  76. package/src/components/NewsletterCta/NewsletterCta.module.css +103 -0
  77. package/src/components/PairCard/PairCard.jsx +58 -0
  78. package/src/components/PairCard/PairCard.module.css +54 -0
  79. package/src/components/PartnerCard/PartnerCard.jsx +130 -0
  80. package/src/components/PartnerCard/PartnerCard.module.css +198 -0
  81. package/src/components/PartnerDirectory/PartnerDirectory.jsx +122 -0
  82. package/src/components/PartnerDirectory/PartnerDirectory.module.css +25 -0
  83. package/src/components/PartnerSidecard/PartnerSidecard.jsx +116 -0
  84. package/src/components/PartnerSidecard/PartnerSidecard.module.css +185 -0
  85. package/src/components/Pipeline/Pipeline.jsx +198 -0
  86. package/src/components/Pipeline/Pipeline.module.css +206 -0
  87. package/src/components/PlatformDiagram/PlatformDiagram.jsx +110 -0
  88. package/src/components/PlatformOverview/PlatformOverview.jsx +68 -0
  89. package/src/components/PlatformOverview/PlatformOverview.module.css +71 -0
  90. package/src/components/ReferenceCard/ReferenceCard.jsx +44 -0
  91. package/src/components/ReferenceCard/ReferenceCard.module.css +57 -0
  92. package/src/components/RelatedPosts/RelatedPosts.jsx +58 -0
  93. package/src/components/RelatedPosts/RelatedPosts.module.css +51 -0
  94. package/src/components/RotatingCards/RotatingCards.jsx +98 -0
  95. package/src/components/RotatingCards/RotatingCards.module.css +153 -0
  96. package/src/components/Showcase/Showcase.jsx +129 -0
  97. package/src/components/Showcase/Showcase.module.css +168 -0
  98. package/src/components/SolutionCard/SolutionCard.jsx +83 -0
  99. package/src/components/SolutionCard/SolutionCard.module.css +99 -0
  100. package/src/components/StatsStrip/StatsStrip.jsx +38 -0
  101. package/src/components/StatsStrip/StatsStrip.module.css +53 -0
  102. package/src/components/WidgetShelf/WidgetShelf.jsx +67 -0
  103. package/src/components/WidgetShelf/WidgetShelf.module.css +73 -0
  104. package/src/components/index.js +96 -0
  105. package/src/components/primitives/AuthorByline.jsx +85 -0
  106. package/src/components/primitives/AuthorByline.module.css +57 -0
  107. package/src/components/primitives/BrandCitation.jsx +71 -0
  108. package/src/components/primitives/Button.jsx +46 -0
  109. package/src/components/primitives/Button.module.css +88 -0
  110. package/src/components/primitives/Card.jsx +42 -0
  111. package/src/components/primitives/Card.module.css +42 -0
  112. package/src/components/primitives/Eyebrow.jsx +37 -0
  113. package/src/components/primitives/Eyebrow.module.css +19 -0
  114. package/src/components/primitives/HexBullet.jsx +37 -0
  115. package/src/components/primitives/HexBullet.module.css +16 -0
  116. package/src/components/primitives/HexThumbnail.jsx +70 -0
  117. package/src/components/primitives/HexThumbnail.module.css +45 -0
  118. package/src/components/primitives/Pill.jsx +42 -0
  119. package/src/components/primitives/Pill.module.css +30 -0
  120. package/src/components/primitives/Section.jsx +51 -0
  121. package/src/components/primitives/Section.module.css +31 -0
  122. package/src/components/primitives/SectionHead.jsx +36 -0
  123. package/src/components/primitives/SectionHead.module.css +43 -0
  124. package/src/components/primitives/index.js +22 -0
  125. package/src/css/brand.css +158 -0
  126. package/src/css/tokens.css +12 -0
  127. package/src/data/app-downloads.js +42 -0
  128. package/src/diagrams/README.md +74 -0
  129. package/src/diagrams/cn-domain-tree.js +105 -0
  130. package/src/diagrams/cn-hex-prism.js +163 -0
  131. package/src/diagrams/cn-hex.js +181 -0
  132. package/src/diagrams/cn-honeycomb-bg.js +135 -0
  133. package/src/diagrams/cn-pipeline.js +150 -0
  134. package/src/diagrams/cn-platform.js +156 -0
  135. package/src/diagrams/cn-side-box.js +104 -0
  136. package/src/diagrams/index.js +28 -0
  137. package/src/index.js +183 -0
  138. package/src/theme/Footer/index.jsx +516 -0
  139. package/src/theme/MDXPage/index.jsx +134 -0
  140. package/src/theme/Navbar/index.jsx +120 -0
  141. package/src/theme/Navbar/styles.module.css +114 -0
  142. package/src/theme/brand.jsx +63 -0
  143. package/src/theme.js +45 -0
  144. package/src/utils/lazyScript.js +37 -0
  145. package/static/img/favicon.svg +14 -0
  146. package/static/img/honeycomb-scatter.svg +23 -0
  147. package/static/img/honeycomb-watermark.svg +108 -0
  148. package/static/img/logo-dark.svg +11 -0
  149. package/static/img/logo.svg +14 -0
  150. package/static/img/nextcloud-logo.svg +5 -0
  151. package/static/lib/canal-footer.css +418 -0
  152. package/static/lib/canal-footer.js +499 -0
  153. package/static/lib/clients-flow.js +317 -0
  154. package/static/lib/conduction-bg.css +50 -0
  155. package/static/lib/conduction-bg.js +122 -0
  156. package/static/lib/hex-rain.css +128 -0
  157. package/static/lib/hex-rain.js +284 -0
  158. package/static/lib/kade-cyclist.css +264 -0
  159. package/static/lib/kade-cyclist.js +420 -0
  160. package/static/lib/logo-memory.css +219 -0
  161. package/static/lib/logo-memory.js +540 -0
  162. package/static/lib/platform-diagram.css +458 -0
  163. package/static/lib/platform-diagram.js +414 -0
@@ -0,0 +1,69 @@
1
+ /**
2
+ * DocuDesk abstract — three-pane document workshop.
3
+ *
4
+ * Inferred from the app's role (template-driven document generation,
5
+ * anonymisation, signing, archiving): centre stage shows a list of
6
+ * recent documents with status pips (green = signed, amber = awaiting
7
+ * sign, terra = anonymised, red = blocked) plus an anonymise drop-zone
8
+ * widget. Left nav for templates / drafts / signed / archive.
9
+ */
10
+
11
+ import React from 'react';
12
+ import styles from '../AppMock.module.css';
13
+
14
+ export default function DocuDeskMock() {
15
+ return (
16
+ <>
17
+ <div className={styles.topbar}>
18
+ <div className={styles.logo}></div>
19
+ {Array.from({length: 14}).map((_, i) => <div key={i} className={styles.icon}></div>)}
20
+ <div className={styles.spacer}></div>
21
+ <div className={styles.bell}></div>
22
+ <div className={styles.avatar}></div>
23
+ </div>
24
+ <div className={[styles.body, styles.opencatalogi].filter(Boolean).join(' ')}>
25
+ <div className={styles.nav}>
26
+ <div className={styles.navHead}><div className={styles.h}></div><div className={styles.l}></div></div>
27
+ {[true, false, false, false, false].map((active, i) => (
28
+ <div key={i} className={[styles.item, active && styles.active].filter(Boolean).join(' ')}>
29
+ <div className={styles.ico}></div>
30
+ <div className={styles.l}></div>
31
+ </div>
32
+ ))}
33
+ </div>
34
+ <div className={styles.col}>
35
+ <div className={styles.head}>
36
+ <div className={styles.row + ' ' + styles.head} style={{width: '30%'}}></div>
37
+ <div className={styles.actions}>
38
+ <div className={styles.btn + ' ' + styles.ghost}></div>
39
+ <div className={styles.btn}></div>
40
+ </div>
41
+ </div>
42
+ {/* Document list with anonymisation/sign status pips */}
43
+ <div className={[styles.w, styles['w-jira']].join(' ')}>
44
+ <div className={styles.wHead}>
45
+ <div className={styles.h}></div><div className={styles.t}></div>
46
+ </div>
47
+ <div className={styles.list}>
48
+ <div className={styles.item}><div className={styles.id}></div><div className={styles.l}></div><div className={styles.pip}></div></div>
49
+ <div className={[styles.item, styles.review].join(' ')}><div className={styles.id}></div><div className={styles.l}></div><div className={styles.pip}></div></div>
50
+ <div className={styles.item}><div className={styles.id}></div><div className={styles.l}></div><div className={styles.pip}></div></div>
51
+ <div className={[styles.item, styles.todo].join(' ')}><div className={styles.id}></div><div className={styles.l}></div><div className={styles.pip}></div></div>
52
+ <div className={styles.item}><div className={styles.id}></div><div className={styles.l}></div><div className={styles.pip}></div></div>
53
+ </div>
54
+ </div>
55
+ {/* Anonymise drop-zone */}
56
+ <div className={[styles.w, styles['w-upload']].join(' ')}>
57
+ <div className={styles.wHead}>
58
+ <div className={styles.h}></div><div className={styles.t}></div>
59
+ </div>
60
+ <div className={styles.zone}>
61
+ <div className={styles.ico}></div>
62
+ <div className={styles.label}></div>
63
+ </div>
64
+ </div>
65
+ </div>
66
+ </div>
67
+ </>
68
+ );
69
+ }
@@ -0,0 +1,59 @@
1
+ /**
2
+ * LarpingApp abstract — character + scene workshop.
3
+ *
4
+ * Inferred from the app role (LARP setting management, character sheets,
5
+ * scenes, NPCs, factions): centre shows a character grid (3×2 cards
6
+ * with hex avatars in different family tones) plus a scene timeline
7
+ * across the top so a session organiser can move stages forward. Left
8
+ * nav for characters / scenes / NPCs / factions / rules / archive.
9
+ */
10
+
11
+ import React from 'react';
12
+ import styles from '../AppMock.module.css';
13
+
14
+ export default function LarpingAppMock() {
15
+ const charTones = ['', 'b', 'c', 'd', 'e', 'b'];
16
+ return (
17
+ <>
18
+ <div className={styles.topbar}>
19
+ <div className={styles.logo}></div>
20
+ {Array.from({length: 14}).map((_, i) => <div key={i} className={styles.icon}></div>)}
21
+ <div className={styles.spacer}></div>
22
+ <div className={styles.bell}></div>
23
+ <div className={styles.avatar}></div>
24
+ </div>
25
+ <div className={[styles.body, styles.opencatalogi].filter(Boolean).join(' ')}>
26
+ <div className={styles.nav}>
27
+ <div className={styles.navHead}><div className={styles.h}></div><div className={styles.l}></div></div>
28
+ {[true, false, false, false, false, false].map((active, i) => (
29
+ <div key={i} className={[styles.item, active && styles.active].filter(Boolean).join(' ')}>
30
+ <div className={styles.ico}></div>
31
+ <div className={styles.l}></div>
32
+ </div>
33
+ ))}
34
+ </div>
35
+ <div className={styles.col}>
36
+ {/* Scene timeline (one done, one active in orange, three to-do) */}
37
+ <div className={[styles.w, styles['w-graph-bar']].join(' ')} style={{minHeight: 0}}>
38
+ <div className={styles.wHead}>
39
+ <div className={styles.h}></div><div className={styles.t}></div>
40
+ </div>
41
+ </div>
42
+ {/* Character grid */}
43
+ <div className={styles.grid}>
44
+ {charTones.map((cls, i) => (
45
+ <div key={i} className={[styles.card, cls && styles[cls]].filter(Boolean).join(' ')}>
46
+ <div className={styles.ico}></div>
47
+ <div className={styles.row + ' ' + styles.head}></div>
48
+ <div className={styles.row + ' ' + styles.short}></div>
49
+ <div className={styles.statusPill}>
50
+ <div className={styles.h}></div><div className={styles.t}></div>
51
+ </div>
52
+ </div>
53
+ ))}
54
+ </div>
55
+ </div>
56
+ </div>
57
+ </>
58
+ );
59
+ }
@@ -0,0 +1,135 @@
1
+ /**
2
+ * MyDash · BI on registers variant.
3
+ *
4
+ * Demonstrates the BI-graph angle: any chart you want, drawn directly
5
+ * on a register without ETL. The mock shows four graph cards in a
6
+ * 2×2 grid (bar chart, line chart, donut KPI, second bar with a
7
+ * different accent), plus a ranked-list table widget on the right.
8
+ */
9
+
10
+ import React from 'react';
11
+ import styles from '../AppMock.module.css';
12
+
13
+ export default function MyDashBiMock() {
14
+ return (
15
+ <>
16
+ <div className={styles.topbar}>
17
+ <div className={styles.logo}></div>
18
+ {Array.from({length: 14}).map((_, i) => <div key={i} className={styles.icon}></div>)}
19
+ <div className={styles.spacer}></div>
20
+ <div className={styles.bell}></div>
21
+ <div className={styles.avatar}></div>
22
+ </div>
23
+ <div className={[styles.body, styles.mydash].filter(Boolean).join(' ')}>
24
+ <div className={styles.grid}>
25
+ {/* Column 1: Bar chart on top, line chart below */}
26
+ <div className={styles.col}>
27
+ <div className={[styles.w, styles['w-graph-bar']].join(' ')}>
28
+ <div className={styles.wHead}>
29
+ <div className={styles.h}></div><div className={styles.t}></div>
30
+ </div>
31
+ <div className={styles.bars}>
32
+ <div className={styles.bar} style={{height: '40%'}}></div>
33
+ <div className={styles.bar} style={{height: '65%'}}></div>
34
+ <div className={styles.bar} style={{height: '52%'}}></div>
35
+ <div className={styles.bar} style={{height: '78%'}}></div>
36
+ <div className={[styles.bar, styles.accent].join(' ')} style={{height: '90%'}}></div>
37
+ <div className={styles.bar} style={{height: '60%'}}></div>
38
+ </div>
39
+ <div className={styles.axis}></div>
40
+ </div>
41
+ <div className={[styles.w, styles['w-graph-line']].join(' ')}>
42
+ <div className={styles.wHead}>
43
+ <div className={styles.h}></div><div className={styles.t}></div>
44
+ </div>
45
+ <div className={styles.chart}>
46
+ <svg viewBox="0 0 100 40" preserveAspectRatio="none">
47
+ <path className={styles.fill} d="M0,32 L14,24 L28,28 L42,18 L56,22 L70,12 L84,16 L100,8 L100,40 L0,40 Z"/>
48
+ <path className={styles.stroke} d="M0,32 L14,24 L28,28 L42,18 L56,22 L70,12 L84,16 L100,8"/>
49
+ <circle className={styles.dot} cx="100" cy="8" r="2.5"/>
50
+ </svg>
51
+ </div>
52
+ <div className={styles.axis}></div>
53
+ </div>
54
+ </div>
55
+ {/* Column 2: Donut KPI + second bar chart stacked */}
56
+ <div className={styles.col}>
57
+ <div className={[styles.w, styles['w-graph-donut']].join(' ')}>
58
+ <div className={styles.wHead}>
59
+ <div className={styles.h}></div><div className={styles.t}></div>
60
+ </div>
61
+ <div className={styles.chart}>
62
+ <div className={styles.donut}></div>
63
+ <div className={styles.legend}>
64
+ <div className={styles.row}><span className={[styles.swatch, styles.a].join(' ')}></span><span className={styles.label}></span></div>
65
+ <div className={styles.row}><span className={[styles.swatch, styles.b].join(' ')}></span><span className={styles.label}></span></div>
66
+ <div className={styles.row}><span className={[styles.swatch, styles.c].join(' ')}></span><span className={styles.label}></span></div>
67
+ </div>
68
+ </div>
69
+ </div>
70
+ <div className={[styles.w, styles['w-graph-bar']].join(' ')}>
71
+ <div className={styles.wHead}>
72
+ <div className={styles.h}></div><div className={styles.t}></div>
73
+ </div>
74
+ <div className={styles.bars}>
75
+ <div className={styles.bar} style={{height: '70%'}}></div>
76
+ <div className={styles.bar} style={{height: '45%'}}></div>
77
+ <div className={[styles.bar, styles.accent].join(' ')} style={{height: '88%'}}></div>
78
+ <div className={styles.bar} style={{height: '55%'}}></div>
79
+ <div className={styles.bar} style={{height: '38%'}}></div>
80
+ </div>
81
+ <div className={styles.axis}></div>
82
+ </div>
83
+ </div>
84
+ {/* Column 3: KPI cards stack */}
85
+ <div className={styles.col}>
86
+ <div className={styles.tile}>
87
+ <div className={styles.tileHead}>
88
+ <div className={styles.h}></div><div className={styles.t}></div>
89
+ </div>
90
+ <div style={{display: 'flex', alignItems: 'baseline', gap: 4}}>
91
+ <div style={{height: 12, width: 28, background: 'var(--c-cobalt-900)', borderRadius: 1}}></div>
92
+ <div style={{height: 4, width: 16, background: 'var(--c-mint-500)', borderRadius: 1}}></div>
93
+ </div>
94
+ <div style={{height: 3, width: '70%', background: 'var(--c-cobalt-200)', borderRadius: 1}}></div>
95
+ </div>
96
+ <div className={styles.tile}>
97
+ <div className={styles.tileHead}>
98
+ <div className={styles.h}></div><div className={styles.t}></div>
99
+ </div>
100
+ <div style={{display: 'flex', alignItems: 'baseline', gap: 4}}>
101
+ <div style={{height: 12, width: 22, background: 'var(--c-cobalt-900)', borderRadius: 1}}></div>
102
+ <div style={{height: 4, width: 14, background: 'var(--c-orange-knvb)', borderRadius: 1}}></div>
103
+ </div>
104
+ <div style={{height: 3, width: '60%', background: 'var(--c-cobalt-200)', borderRadius: 1}}></div>
105
+ </div>
106
+ <div className={styles.tile}>
107
+ <div className={styles.tileHead}>
108
+ <div className={styles.h}></div><div className={styles.t}></div>
109
+ </div>
110
+ <div style={{display: 'flex', alignItems: 'baseline', gap: 4}}>
111
+ <div style={{height: 12, width: 30, background: 'var(--c-cobalt-900)', borderRadius: 1}}></div>
112
+ <div style={{height: 4, width: 12, background: 'var(--c-mint-500)', borderRadius: 1}}></div>
113
+ </div>
114
+ <div style={{height: 3, width: '80%', background: 'var(--c-cobalt-200)', borderRadius: 1}}></div>
115
+ </div>
116
+ </div>
117
+ {/* Column 4: Top-N table widget */}
118
+ <div className={[styles.w, styles['w-rss']].join(' ')}>
119
+ <div className={styles.wHead}>
120
+ <div className={styles.h}></div><div className={styles.t}></div>
121
+ </div>
122
+ <div className={styles.list}>
123
+ <div className={styles.item}><div className={styles.src}></div><div className={styles.title}></div><div className={styles.when}></div></div>
124
+ <div className={styles.item}><div className={styles.src}></div><div className={styles.title}></div><div className={styles.when}></div></div>
125
+ <div className={styles.item}><div className={styles.src}></div><div className={styles.title}></div><div className={styles.when}></div></div>
126
+ <div className={styles.item}><div className={styles.src}></div><div className={styles.title}></div><div className={styles.when}></div></div>
127
+ <div className={styles.item}><div className={styles.src}></div><div className={styles.title}></div><div className={styles.when}></div></div>
128
+ <div className={styles.item}><div className={styles.src}></div><div className={styles.title}></div><div className={styles.when}></div></div>
129
+ </div>
130
+ </div>
131
+ </div>
132
+ </div>
133
+ </>
134
+ );
135
+ }
@@ -0,0 +1,96 @@
1
+ /**
2
+ * MyDash abstract — full-bleed cobalt background with widget grid.
3
+ * Reference: live screenshot at http://localhost:8080/apps/mydash/.
4
+ *
5
+ * Layout: top app strip + 4-column grid where col 1 stacks small + big
6
+ * primary tiles (Intranet / Calendar / Files), cols 2-4 hold info
7
+ * widgets with avatar lists, empty states, and an upload-drop zone.
8
+ */
9
+
10
+ import React from 'react';
11
+ import styles from '../AppMock.module.css';
12
+
13
+ export default function MyDashMock() {
14
+ return (
15
+ <>
16
+ <div className={styles.topbar}>
17
+ <div className={styles.logo}></div>
18
+ {Array.from({length: 14}).map((_, i) => <div key={i} className={styles.icon}></div>)}
19
+ <div className={styles.spacer}></div>
20
+ <div className={styles.bell}></div>
21
+ <div className={styles.avatar}></div>
22
+ </div>
23
+ <div className={[styles.body, styles.mydash].filter(Boolean).join(' ')}>
24
+ <div className={styles.grid}>
25
+ {/* Column 1: small + big primary tiles */}
26
+ <div className={styles.col}>
27
+ <div className={styles.tile + ' ' + styles.empty}></div>
28
+ <div className={styles.tile + ' ' + styles.primary}>
29
+ <div className={styles.icon}></div>
30
+ <div className={styles.label}></div>
31
+ </div>
32
+ <div className={styles.tile + ' ' + styles.empty}></div>
33
+ <div className={styles.tile + ' ' + styles.primary}>
34
+ <div className={styles.icon}></div>
35
+ <div className={styles.label}></div>
36
+ </div>
37
+ <div className={styles.tile + ' ' + styles.primary}>
38
+ <div className={styles.icon}></div>
39
+ <div className={styles.label}></div>
40
+ </div>
41
+ </div>
42
+ {/* Column 2: Important mail with avatar list */}
43
+ <div className={styles.tile}>
44
+ <div className={styles.tileHead}>
45
+ <div className={styles.h}></div><div className={styles.t}></div>
46
+ </div>
47
+ <div className={styles.stack}>
48
+ {['b','c','a','d','e','b'].map((cls, i) => (
49
+ <div key={i} className={styles.item}>
50
+ <div className={[styles.av, styles[cls]].join(' ')}></div>
51
+ <div className={styles.lines}>
52
+ <div className={styles.l1}></div>
53
+ <div className={styles.l2}></div>
54
+ </div>
55
+ </div>
56
+ ))}
57
+ </div>
58
+ </div>
59
+ {/* Column 3: Bar-chart graph card (KPI overview) */}
60
+ <div className={[styles.w, styles['w-graph-bar']].join(' ')}>
61
+ <div className={styles.wHead}>
62
+ <div className={styles.h}></div><div className={styles.t}></div>
63
+ </div>
64
+ <div className={styles.bars}>
65
+ <div className={styles.bar} style={{height: '40%'}}></div>
66
+ <div className={styles.bar} style={{height: '65%'}}></div>
67
+ <div className={styles.bar} style={{height: '52%'}}></div>
68
+ <div className={styles.bar} style={{height: '78%'}}></div>
69
+ <div className={[styles.bar, styles.accent].join(' ')} style={{height: '90%'}}></div>
70
+ <div className={styles.bar} style={{height: '60%'}}></div>
71
+ <div className={styles.bar} style={{height: '72%'}}></div>
72
+ </div>
73
+ <div className={styles.axis}></div>
74
+ </div>
75
+ {/* Column 4: Overdue + Document Anonymizer */}
76
+ <div className={styles.col}>
77
+ <div className={styles.tile} style={{flex: 1}}>
78
+ <div className={styles.tileHead}>
79
+ <div className={styles.h}></div><div className={styles.t}></div>
80
+ </div>
81
+ <div style={{flex: 1, display: 'flex', alignItems: 'center', justifyContent: 'center'}}>
82
+ <div style={{width: 22, height: 25, clipPath: 'var(--hex-pointy-top)', background: 'var(--c-cobalt-200)'}}></div>
83
+ </div>
84
+ </div>
85
+ <div className={styles.tile}>
86
+ <div className={styles.tileHead}>
87
+ <div className={styles.h}></div><div className={styles.t}></div>
88
+ </div>
89
+ <div style={{height: 32, border: '1px dashed var(--c-cobalt-200)', borderRadius: 'var(--radius-sm)', background: 'var(--c-cobalt-50)'}}></div>
90
+ </div>
91
+ </div>
92
+ </div>
93
+ </div>
94
+ </>
95
+ );
96
+ }
@@ -0,0 +1,103 @@
1
+ /**
2
+ * MyDash · Tiles & Grids variant.
3
+ *
4
+ * Demonstrates the Nextcloud-integration angle: large hex-icon
5
+ * launcher tiles that deeplink inside Nextcloud, link out to external
6
+ * URLs, launch a document, kick off a process, or themselves contain
7
+ * a sub-grid of further tiles. The mock pictures exactly that mix:
8
+ * four launcher tiles top-left, a 2×2 sub-grid bottom-left ("custom
9
+ * tile group"), and two info widgets right.
10
+ */
11
+
12
+ import React from 'react';
13
+ import styles from '../AppMock.module.css';
14
+
15
+ export default function MyDashTilesMock() {
16
+ return (
17
+ <>
18
+ <div className={styles.topbar}>
19
+ <div className={styles.logo}></div>
20
+ {Array.from({length: 14}).map((_, i) => <div key={i} className={styles.icon}></div>)}
21
+ <div className={styles.spacer}></div>
22
+ <div className={styles.bell}></div>
23
+ <div className={styles.avatar}></div>
24
+ </div>
25
+ <div className={[styles.body, styles.mydash].filter(Boolean).join(' ')}>
26
+ <div className={styles.grid}>
27
+ {/* Column 1: Launcher tiles in cobalt + KNVB */}
28
+ <div className={styles.col}>
29
+ <div className={[styles.w, styles['w-launcher']].join(' ')}>
30
+ <div className={styles.ico}></div>
31
+ <div className={styles.label}></div>
32
+ </div>
33
+ <div className={[styles.w, styles['w-launcher'], styles.amber].join(' ')}>
34
+ <div className={styles.ico}></div>
35
+ <div className={styles.label}></div>
36
+ </div>
37
+ <div className={[styles.w, styles['w-launcher']].join(' ')}>
38
+ <div className={styles.ico}></div>
39
+ <div className={styles.label}></div>
40
+ </div>
41
+ </div>
42
+ {/* Column 2: Sub-grid (custom tile group with 4 sub-tiles) */}
43
+ <div className={[styles.w, styles['w-subgrid']].join(' ')}>
44
+ <div className={styles.wHead}>
45
+ <div className={styles.h}></div><div className={styles.t}></div>
46
+ </div>
47
+ <div className={styles.grid}>
48
+ <div className={styles.cell}><div className={styles.ico}></div></div>
49
+ <div className={[styles.cell, styles.b].join(' ')}><div className={styles.ico}></div></div>
50
+ <div className={[styles.cell, styles.c].join(' ')}><div className={styles.ico}></div></div>
51
+ <div className={[styles.cell, styles.d].join(' ')}><div className={styles.ico}></div></div>
52
+ </div>
53
+ </div>
54
+ {/* Column 3: Files widget — deeplinks into a folder */}
55
+ <div className={[styles.w, styles['w-files']].join(' ')}>
56
+ <div className={styles.wHead}>
57
+ <div className={styles.h}></div><div className={styles.t}></div>
58
+ </div>
59
+ <div className={styles.list}>
60
+ <div className={[styles.item, styles.folder].join(' ')}><div className={styles.ico}></div><div className={styles.l}></div></div>
61
+ <div className={[styles.item, styles.doc].join(' ')}><div className={styles.ico}></div><div className={styles.l}></div></div>
62
+ <div className={[styles.item, styles.sheet].join(' ')}><div className={styles.ico}></div><div className={styles.l}></div></div>
63
+ <div className={[styles.item, styles.doc].join(' ')}><div className={styles.ico}></div><div className={styles.l}></div></div>
64
+ <div className={styles.item}><div className={styles.ico}></div><div className={styles.l}></div></div>
65
+ </div>
66
+ </div>
67
+ {/* Column 4: Two stacked widgets — calendar + decks */}
68
+ <div className={styles.col}>
69
+ <div className={[styles.w, styles['w-calendar']].join(' ')}>
70
+ <div className={styles.wHead}>
71
+ <div className={styles.h}></div><div className={styles.t}></div>
72
+ </div>
73
+ <div className={styles.grid}>
74
+ {[0,0,1,0,0,0,2, 0,0,0,3,0,0,0, 0,2,0,0,0,1,0, 0,0,0,0,0,0,0].map((kind, i) => (
75
+ <div key={i} className={[styles.day, kind === 1 && styles.event, kind === 2 && styles.muted, kind === 3 && styles.today].filter(Boolean).join(' ')}></div>
76
+ ))}
77
+ </div>
78
+ </div>
79
+ <div className={[styles.w, styles['w-decks']].join(' ')}>
80
+ <div className={styles.wHead}>
81
+ <div className={styles.h}></div><div className={styles.t}></div>
82
+ </div>
83
+ <div className={styles.columns}>
84
+ <div className={styles.col}>
85
+ <div className={styles.card}></div>
86
+ <div className={styles.card}></div>
87
+ </div>
88
+ <div className={styles.col}>
89
+ <div className={[styles.card, styles.b].join(' ')}></div>
90
+ <div className={styles.card}></div>
91
+ <div className={styles.card}></div>
92
+ </div>
93
+ <div className={styles.col}>
94
+ <div className={[styles.card, styles.c].join(' ')}></div>
95
+ </div>
96
+ </div>
97
+ </div>
98
+ </div>
99
+ </div>
100
+ </div>
101
+ </>
102
+ );
103
+ }
@@ -0,0 +1,123 @@
1
+ /**
2
+ * MyDash · Widget integration variant.
3
+ *
4
+ * Demonstrates the cross-app widget angle: any Conduction app that
5
+ * registers a Nextcloud dashboard widget shows up here. The mock
6
+ * pictures the canonical mix:
7
+ * - DocuDesk → upload-to-anonymise dropzone widget
8
+ * - Procest → werkvoorraad (case queue) widget
9
+ * - Mail → Important mail (avatar list)
10
+ * - Calendar → upcoming-events mini grid
11
+ * - Jira → external-app status board
12
+ * - RSS → headlines feed
13
+ * - Video → video-call shortcut
14
+ */
15
+
16
+ import React from 'react';
17
+ import styles from '../AppMock.module.css';
18
+
19
+ export default function MyDashWidgetsMock() {
20
+ return (
21
+ <>
22
+ <div className={styles.topbar}>
23
+ <div className={styles.logo}></div>
24
+ {Array.from({length: 14}).map((_, i) => <div key={i} className={styles.icon}></div>)}
25
+ <div className={styles.spacer}></div>
26
+ <div className={styles.bell}></div>
27
+ <div className={styles.avatar}></div>
28
+ </div>
29
+ <div className={[styles.body, styles.mydash].filter(Boolean).join(' ')}>
30
+ <div className={styles.grid}>
31
+ {/* Column 1: Procest werkvoorraad + DocuDesk upload */}
32
+ <div className={styles.col}>
33
+ <div className={[styles.w, styles['w-werkvoorraad']].join(' ')}>
34
+ <div className={styles.wHead}>
35
+ <div className={styles.h}></div><div className={styles.t}></div>
36
+ </div>
37
+ <div className={styles.list}>
38
+ <div className={[styles.item, styles.now].join(' ')}><div className={styles.stage}></div><div className={styles.l1}></div><div className={styles.av}></div></div>
39
+ <div className={styles.item}><div className={styles.stage}></div><div className={styles.l1}></div><div className={[styles.av, styles.b].join(' ')}></div></div>
40
+ <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>
41
+ <div className={styles.item}><div className={styles.stage}></div><div className={styles.l1}></div><div className={styles.av}></div></div>
42
+ <div className={styles.item}><div className={styles.stage}></div><div className={styles.l1}></div><div className={[styles.av, styles.b].join(' ')}></div></div>
43
+ </div>
44
+ </div>
45
+ <div className={[styles.w, styles['w-upload']].join(' ')}>
46
+ <div className={styles.wHead}>
47
+ <div className={styles.h}></div><div className={styles.t}></div>
48
+ </div>
49
+ <div className={styles.zone}>
50
+ <div className={styles.ico}></div>
51
+ <div className={styles.label}></div>
52
+ </div>
53
+ </div>
54
+ </div>
55
+ {/* Column 2: Mail (Important mail) */}
56
+ <div className={[styles.w, styles['w-mail']].join(' ')}>
57
+ <div className={styles.wHead}>
58
+ <div className={styles.h}></div><div className={styles.t}></div>
59
+ </div>
60
+ <div className={styles.list}>
61
+ {['','b','c','d','','e','b'].map((cls, i) => (
62
+ <div key={i} className={[styles.item, cls && styles[cls]].filter(Boolean).join(' ')}>
63
+ <div className={styles.av}></div>
64
+ <div className={styles.lines}>
65
+ <div className={styles.l1}></div>
66
+ <div className={styles.l2}></div>
67
+ </div>
68
+ </div>
69
+ ))}
70
+ </div>
71
+ </div>
72
+ {/* Column 3: Jira status board + RSS feed */}
73
+ <div className={styles.col}>
74
+ <div className={[styles.w, styles['w-jira']].join(' ')}>
75
+ <div className={styles.wHead}>
76
+ <div className={styles.h}></div><div className={styles.t}></div>
77
+ </div>
78
+ <div className={styles.list}>
79
+ <div className={styles.item}><div className={styles.id}></div><div className={styles.l}></div><div className={styles.pip}></div></div>
80
+ <div className={[styles.item, styles.review].join(' ')}><div className={styles.id}></div><div className={styles.l}></div><div className={styles.pip}></div></div>
81
+ <div className={[styles.item, styles.todo].join(' ')}><div className={styles.id}></div><div className={styles.l}></div><div className={styles.pip}></div></div>
82
+ <div className={[styles.item, styles.blocked].join(' ')}><div className={styles.id}></div><div className={styles.l}></div><div className={styles.pip}></div></div>
83
+ <div className={styles.item}><div className={styles.id}></div><div className={styles.l}></div><div className={styles.pip}></div></div>
84
+ </div>
85
+ </div>
86
+ <div className={[styles.w, styles['w-rss']].join(' ')}>
87
+ <div className={styles.wHead}>
88
+ <div className={styles.h}></div><div className={styles.t}></div>
89
+ </div>
90
+ <div className={styles.list}>
91
+ <div className={styles.item}><div className={styles.src}></div><div className={styles.title}></div><div className={styles.when}></div></div>
92
+ <div className={styles.item}><div className={styles.src}></div><div className={styles.title}></div><div className={styles.when}></div></div>
93
+ <div className={styles.item}><div className={styles.src}></div><div className={styles.title}></div><div className={styles.when}></div></div>
94
+ </div>
95
+ </div>
96
+ </div>
97
+ {/* Column 4: Calendar + Video call shortcut */}
98
+ <div className={styles.col}>
99
+ <div className={[styles.w, styles['w-calendar']].join(' ')}>
100
+ <div className={styles.wHead}>
101
+ <div className={styles.h}></div><div className={styles.t}></div>
102
+ </div>
103
+ <div className={styles.grid}>
104
+ {[2,2,1,0,0,0,2, 0,0,0,3,1,0,0, 0,1,0,0,0,1,0, 0,0,0,0,1,0,0].map((kind, i) => (
105
+ <div key={i} className={[styles.day, kind === 1 && styles.event, kind === 2 && styles.muted, kind === 3 && styles.today].filter(Boolean).join(' ')}></div>
106
+ ))}
107
+ </div>
108
+ </div>
109
+ <div className={[styles.w, styles['w-video']].join(' ')}>
110
+ <div className={styles.wHead}>
111
+ <div className={styles.h}></div><div className={styles.t}></div>
112
+ </div>
113
+ <div className={styles.frame}>
114
+ <div className={styles.play}></div>
115
+ <div className={styles.duration}></div>
116
+ </div>
117
+ </div>
118
+ </div>
119
+ </div>
120
+ </div>
121
+ </>
122
+ );
123
+ }