@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,458 @@
1
+ /* ============================================================
2
+ <platform-diagram> — workspace + corner hexes + lists + flows.
3
+ ----------------------------------------------------------------
4
+ All selectors are scoped to the <platform-diagram> element so
5
+ the component can drop in anywhere without leaking.
6
+
7
+ Coordinate model used by flow paths:
8
+ • Origin (0,0) is the workspace centre.
9
+ • Workspace hex is 360×416 (centred on grid cell).
10
+ • Corner hexes are 160×185, sit at cx=±204, cy=±104
11
+ (= workspace half-width 180 + 24px outward shift).
12
+ • App-builder (bottom-centre) hex sits at cx=0, cy=+232
13
+ (= workspace half-height 208 + 24px outward shift).
14
+ • Hex side midpoints: (cx±80, cy); peaks: (cx, cy±92.5).
15
+
16
+ When porting to Docusaurus / React, this file moves to a CSS
17
+ module; the same class names get hashed automatically.
18
+ ============================================================ */
19
+
20
+ platform-diagram {
21
+ display: block;
22
+ position: relative;
23
+
24
+ /* Scroll-linked entrance progress (0 = far out / invisible, 1 = settled).
25
+ Defaults are 1 so the diagram looks normal without JS. The scroll
26
+ handler in platform-diagram.js writes these on every scroll, so
27
+ scrolling up reverses the entrance.
28
+ Stages overlap intentionally:
29
+ hex covers 0.00 → 0.40 of the entrance window
30
+ list covers 0.30 → 0.75
31
+ flow covers 0.75 → 1.00 */
32
+ --pd-hex-progress: 1;
33
+ --pd-list-progress: 1;
34
+ --pd-flow-progress: 1;
35
+ }
36
+
37
+ @media (prefers-reduced-motion: reduce) {
38
+ /* Force settled state regardless of any value JS might write. */
39
+ platform-diagram {
40
+ --pd-hex-progress: 1 !important;
41
+ --pd-list-progress: 1 !important;
42
+ --pd-flow-progress: 1 !important;
43
+ }
44
+ }
45
+
46
+ /* ---- Diagram grid ---- */
47
+ platform-diagram .diagram-grid {
48
+ display: grid;
49
+ grid-template-columns: 1fr 360px 1fr;
50
+ grid-template-rows: auto auto;
51
+ column-gap: 64px;
52
+ row-gap: 240px; /* room for the corner-anchored hexes — they extend ~162px above/below their wrap */
53
+ align-items: start;
54
+ position: relative;
55
+ z-index: 1;
56
+ /* extra top + bottom padding to accommodate the workspace-attached
57
+ workspace + app-builder lists, which translate above and below
58
+ the grid via CSS transforms. */
59
+ padding: 240px 0 320px;
60
+ overflow: visible;
61
+ }
62
+
63
+ /* ---- Workspace hex ----
64
+ Selector deliberately scoped to the direct centre hex via :not(.box-wrap)
65
+ because .box-wrap.workspace (the WORKSPACE APPS list wrap) shares the
66
+ "workspace" class for grid placement — without the guard this rule
67
+ would clip the apps-list wrap with the same Nextcloud-blue hex shape. */
68
+ platform-diagram > .workspace,
69
+ platform-diagram .workspace:not(.box-wrap):not(.workspace-corner-hex) {
70
+ grid-column: 2;
71
+ grid-row: 1 / span 2;
72
+ align-self: center;
73
+ justify-self: center;
74
+ box-sizing: border-box;
75
+ width: 360px;
76
+ aspect-ratio: 1.7320508 / 2;
77
+ clip-path: var(--hex-pointy-top);
78
+ background: var(--gradient-nextcloud);
79
+ display: flex; flex-direction: column;
80
+ align-items: center; justify-content: center;
81
+ color: white;
82
+ text-align: center;
83
+ padding: 0 32px;
84
+ position: relative;
85
+ z-index: 1;
86
+ /* Subtle scale + fade with hex progress (0.92 → 1.00). */
87
+ transform: scale(calc(0.92 + 0.08 * var(--pd-hex-progress)));
88
+ opacity: var(--pd-hex-progress);
89
+ }
90
+ platform-diagram .workspace-logo { width: 140px; height: auto; margin-bottom: 14px; }
91
+ platform-diagram > .workspace .role,
92
+ platform-diagram .workspace:not(.box-wrap):not(.workspace-corner-hex) .role {
93
+ font-family: var(--conduction-typography-font-family-code);
94
+ font-size: 12px; letter-spacing: 0.14em; text-transform: uppercase;
95
+ opacity: 0.85;
96
+ margin-top: 14px;
97
+ }
98
+
99
+ /* ---- Box-wrap (positioning shell for each list) ---- */
100
+ platform-diagram .box-wrap { position: relative; }
101
+
102
+ /* ---- List-box ---- */
103
+ platform-diagram .box {
104
+ background: white;
105
+ border: 1px solid var(--c-cobalt-200);
106
+ border-radius: var(--radius-md);
107
+ padding: 18px 20px;
108
+ box-shadow: var(--shadow-1);
109
+ position: relative;
110
+ z-index: 3;
111
+ transition: box-shadow 160ms ease, transform 160ms ease;
112
+ }
113
+ platform-diagram .box-wrap:hover .box {
114
+ box-shadow: var(--shadow-3);
115
+ transform: translateY(-2px);
116
+ }
117
+
118
+ platform-diagram .row {
119
+ display: flex; align-items: center; gap: 10px;
120
+ /* Reset margin + force border-box so Infima's grid `.row { margin: 0 -24px }`
121
+ (shipped by Docusaurus on connext) doesn't blow our row out 48px past
122
+ the parent .box. Kept here, not in :where(), so it wins specificity. */
123
+ margin: 0;
124
+ box-sizing: border-box;
125
+ padding: 6px 0;
126
+ font-size: 13px; color: var(--c-cobalt-700);
127
+ cursor: default;
128
+ flex-wrap: nowrap;
129
+ position: relative;
130
+ min-width: 0;
131
+ overflow: hidden;
132
+ width: 100%;
133
+ }
134
+ platform-diagram .row .name {
135
+ overflow: hidden;
136
+ text-overflow: ellipsis;
137
+ white-space: nowrap;
138
+ min-width: 0;
139
+ }
140
+ platform-diagram .row + .row { border-top: 1px solid var(--c-cobalt-50); }
141
+
142
+ /* Multi-column box: rows are wrapped in <.col> so the .row+.row border only
143
+ draws within a single column. The columns sit side by side with a thin
144
+ divider between them. */
145
+ platform-diagram .box.cols-2 { display: flex; gap: 16px; padding: 14px 16px; }
146
+ platform-diagram .box.cols-2 .col { flex: 1 1 0; min-width: 0; }
147
+ platform-diagram .box.cols-2 .col + .col { border-left: 1px solid var(--c-cobalt-50); padding-left: 16px; }
148
+ platform-diagram .row .name { font-weight: 500; transition: color 140ms ease; }
149
+ platform-diagram .row .meta {
150
+ margin-left: auto;
151
+ font-family: var(--conduction-typography-font-family-code);
152
+ font-size: 10px; color: var(--c-cobalt-400);
153
+ letter-spacing: 0.06em; text-transform: uppercase;
154
+ }
155
+ platform-diagram .row:hover .name { color: var(--c-blue-cobalt); }
156
+
157
+ /* App description: absolute-positioned tooltip below the row, so hover
158
+ doesn't change the box's height (keeps neighbouring components still). */
159
+ platform-diagram .row .desc {
160
+ position: absolute;
161
+ top: calc(100% - 4px);
162
+ left: 28px;
163
+ right: 8px;
164
+ background: var(--c-cobalt-700);
165
+ color: rgba(255,255,255,0.95);
166
+ font-size: 12px;
167
+ line-height: 1.45;
168
+ padding: 8px 12px;
169
+ border-radius: var(--radius-md);
170
+ box-shadow: 0 4px 12px rgba(33, 70, 139, 0.18);
171
+ opacity: 0;
172
+ transform: translateY(-4px);
173
+ pointer-events: none;
174
+ transition: opacity 140ms ease, transform 140ms ease;
175
+ z-index: 8;
176
+ white-space: normal;
177
+ }
178
+ platform-diagram .row:hover .desc { opacity: 1; transform: translateY(0); }
179
+
180
+ /* ---- Glyph (hex-clipped icon swatch) ---- */
181
+ platform-diagram .glyph {
182
+ width: 18px; height: 21px;
183
+ clip-path: var(--hex-pointy-top);
184
+ flex-shrink: 0;
185
+ display: inline-flex; align-items: center; justify-content: center;
186
+ color: white;
187
+ }
188
+ platform-diagram .glyph svg {
189
+ width: 11px; height: 11px;
190
+ stroke-width: 2; stroke: currentColor; fill: none;
191
+ stroke-linecap: round; stroke-linejoin: round;
192
+ }
193
+
194
+ /* Brand variant: real app logos in their own brand colour. Drop the hex clip
195
+ so the brand marks aren't cropped at the corners; use a subtle rounded
196
+ square (standard app-icon presentation) instead. Per-row colour comes
197
+ through `style="color: #brand"` on the .glyph wrapper. */
198
+ platform-diagram .glyph.brand {
199
+ background: white !important;
200
+ clip-path: none;
201
+ width: 20px; height: 20px;
202
+ border-radius: 5px;
203
+ box-shadow: inset 0 0 0 1px var(--c-cobalt-50);
204
+ }
205
+ platform-diagram .glyph.brand svg {
206
+ width: 14px; height: 14px;
207
+ stroke: none;
208
+ }
209
+ platform-diagram .glyph.brand svg > * { fill: currentColor; stroke: none; }
210
+
211
+ /* ---- Corner-anchor (named) hex tag ----
212
+ The 160x185 family-coloured hex sits beside each list as the visual
213
+ anchor for that quadrant. Family tint comes from .fam-* classes
214
+ below; positioning per-list lower in this file. */
215
+ platform-diagram .workspace-corner-hex {
216
+ grid-column: 2;
217
+ grid-row: 1 / span 2;
218
+ align-self: center;
219
+ width: 160px;
220
+ aspect-ratio: 1.7320508 / 2;
221
+ box-sizing: border-box;
222
+ clip-path: var(--hex-pointy-top);
223
+ display: flex; align-items: center; justify-content: center;
224
+ text-align: center;
225
+ color: white;
226
+ font-size: 14px; font-weight: 600;
227
+ letter-spacing: 0.04em; text-transform: uppercase;
228
+ line-height: 1.2;
229
+ padding: 0 14px;
230
+ z-index: 2;
231
+ filter: drop-shadow(0 2px 6px rgba(33, 70, 139, 0.22));
232
+ /* Transform is driven by scroll progress; no transition (would smear
233
+ every scroll tick). Filter still transitions for hover shadow lift. */
234
+ transition: filter 160ms ease;
235
+ cursor: default;
236
+ }
237
+ platform-diagram .workspace-corner-hex:hover { filter: drop-shadow(0 6px 14px rgba(33, 70, 139, 0.32)); }
238
+
239
+ /* ---- Family colour tints ---- Apply to .box-hex, glyph, and corner hex.
240
+ Mirrors the family palette; one place to swap when you fork the
241
+ diagram for a different domain. */
242
+ platform-diagram .fam-core .glyph,
243
+ platform-diagram .workspace-corner-hex.fam-core { background: var(--c-blue-cobalt); }
244
+ platform-diagram .fam-workspace .glyph,
245
+ platform-diagram .workspace-corner-hex.fam-workspace { background: var(--c-blue-cobalt); }
246
+ platform-diagram .fam-solutions .glyph,
247
+ platform-diagram .workspace-corner-hex.fam-solutions { background: #E34234; }
248
+ platform-diagram .fam-integrate .glyph,
249
+ platform-diagram .workspace-corner-hex.fam-integrate { background: var(--c-cobalt-400); }
250
+ platform-diagram .fam-builder .glyph,
251
+ platform-diagram .workspace-corner-hex.fam-builder { background: var(--c-cobalt-300); }
252
+ /* App Builder hex: KNVB orange (override fam-builder) */
253
+ platform-diagram .workspace-corner-hex.app-builder { background: var(--c-orange-knvb); }
254
+ platform-diagram .fam-nextcloud .glyph,
255
+ platform-diagram .workspace-corner-hex.fam-nextcloud { background: var(--c-nextcloud-blue); }
256
+
257
+ /* ---- Position-specific placement ----
258
+ tech-core / ai sit on the workspace's top corners; workspace / integrated
259
+ on the bottom corners. Translates use the workspace-relative arithmetic
260
+ documented at the top of this file. */
261
+ platform-diagram .box-wrap.tech-core { grid-column: 1; grid-row: 1; justify-self: end; align-self: end; min-width: 240px; max-width: 280px; width: 100%; }
262
+ platform-diagram .box-wrap.solutions { grid-column: 3; grid-row: 1; justify-self: start; align-self: end; min-width: 220px; max-width: 260px; width: 100%; }
263
+ platform-diagram .box-wrap.workspace { grid-column: 1; grid-row: 2; justify-self: end; align-self: start; min-width: 240px; max-width: 280px; width: 100%; }
264
+ platform-diagram .box-wrap.integrated { grid-column: 3; grid-row: 2; justify-self: start; align-self: start; min-width: 220px; max-width: 260px; width: 100%; }
265
+ /* 2-column variant needs more horizontal room — grows leftward into the gap */
266
+ platform-diagram .box-wrap.integrated.cols-2 { max-width: 460px; }
267
+
268
+ /* List inner corner anchors near the midpoint of the corresponding hex side,
269
+ nudged inward so the list overlaps its hex on both axes. Top lists are
270
+ anchored to row 1 bottom (align-self: end) — translateY is negative so
271
+ the list bottom lands at the hex's top-right (or top-left) vertex,
272
+ mirroring the bottom-row docking. Bottom lists are anchored to row 2
273
+ top (align-self: start) with a small positive translateY so the list
274
+ top lands at the hex's bottom-right (or bottom-left) vertex.
275
+ The (±80px * (1 - --pd-list-progress)) term is the scroll-entrance
276
+ shift: at progress=1 it's 0 (settled); at progress=0 lists start 80px
277
+ further outward and fade from 0 → 1 opacity. */
278
+ platform-diagram .box-wrap.tech-core {
279
+ transform: translate(calc( 15px + (-80px * (1 - var(--pd-list-progress)))), -30px);
280
+ opacity: var(--pd-list-progress);
281
+ }
282
+ platform-diagram .box-wrap.solutions {
283
+ transform: translate(calc(-15px + ( 80px * (1 - var(--pd-list-progress)))), -30px);
284
+ opacity: var(--pd-list-progress);
285
+ }
286
+ platform-diagram .box-wrap.workspace {
287
+ transform: translate(calc( 15px + (-80px * (1 - var(--pd-list-progress)))), 30px);
288
+ opacity: var(--pd-list-progress);
289
+ }
290
+ platform-diagram .box-wrap.integrated {
291
+ transform: translate(calc(-15px + ( 80px * (1 - var(--pd-list-progress)))), 30px);
292
+ opacity: var(--pd-list-progress);
293
+ }
294
+
295
+ /* Corner hex placement around the workspace polygon (top-left, top-right,
296
+ bottom-left, bottom-right). 24px outward from the workspace edge.
297
+ The (±120px * (1 - --pd-hex-progress)) terms are the scroll-entrance
298
+ shift: hexes start 120px further outward + 100px further from workspace
299
+ centre, fade in as progress goes 0 → 1. Hover preserves the shift so
300
+ the lift composes correctly during entrance. */
301
+ platform-diagram .workspace-corner-hex.tech-core {
302
+ justify-self: start;
303
+ transform: translate(
304
+ calc(-50% - 24px + (-120px * (1 - var(--pd-hex-progress)))),
305
+ calc(-104px + (-100px * (1 - var(--pd-hex-progress))))
306
+ );
307
+ opacity: var(--pd-hex-progress);
308
+ }
309
+ platform-diagram .workspace-corner-hex.solutions {
310
+ justify-self: end;
311
+ transform: translate(
312
+ calc( 50% + 24px + ( 120px * (1 - var(--pd-hex-progress)))),
313
+ calc(-104px + (-100px * (1 - var(--pd-hex-progress))))
314
+ );
315
+ opacity: var(--pd-hex-progress);
316
+ }
317
+ platform-diagram .workspace-corner-hex.workspace {
318
+ justify-self: start;
319
+ transform: translate(
320
+ calc(-50% - 24px + (-120px * (1 - var(--pd-hex-progress)))),
321
+ calc( 104px + ( 100px * (1 - var(--pd-hex-progress))))
322
+ );
323
+ opacity: var(--pd-hex-progress);
324
+ }
325
+ platform-diagram .workspace-corner-hex.integrated {
326
+ justify-self: end;
327
+ transform: translate(
328
+ calc( 50% + 24px + ( 120px * (1 - var(--pd-hex-progress)))),
329
+ calc( 104px + ( 100px * (1 - var(--pd-hex-progress))))
330
+ );
331
+ opacity: var(--pd-hex-progress);
332
+ }
333
+ /* App Builder hex centred on workspace's bottom peak + 24px outward */
334
+ platform-diagram .workspace-corner-hex.app-builder {
335
+ justify-self: center;
336
+ align-self: center;
337
+ transform: translateY(calc(208px + 24px + (120px * (1 - var(--pd-hex-progress)))));
338
+ opacity: var(--pd-hex-progress);
339
+ }
340
+
341
+ /* Hover lift composed on top of entrance shift */
342
+ platform-diagram .workspace-corner-hex.tech-core:hover {
343
+ transform: translate(
344
+ calc(-50% - 24px + (-120px * (1 - var(--pd-hex-progress)))),
345
+ calc(-104px - 4px + (-100px * (1 - var(--pd-hex-progress))))
346
+ );
347
+ }
348
+ platform-diagram .workspace-corner-hex.solutions:hover {
349
+ transform: translate(
350
+ calc( 50% + 24px + ( 120px * (1 - var(--pd-hex-progress)))),
351
+ calc(-104px - 4px + (-100px * (1 - var(--pd-hex-progress))))
352
+ );
353
+ }
354
+ platform-diagram .workspace-corner-hex.workspace:hover {
355
+ transform: translate(
356
+ calc(-50% - 24px + (-120px * (1 - var(--pd-hex-progress)))),
357
+ calc( 104px - 4px + ( 100px * (1 - var(--pd-hex-progress))))
358
+ );
359
+ }
360
+ platform-diagram .workspace-corner-hex.integrated:hover {
361
+ transform: translate(
362
+ calc( 50% + 24px + ( 120px * (1 - var(--pd-hex-progress)))),
363
+ calc( 104px - 4px + ( 100px * (1 - var(--pd-hex-progress))))
364
+ );
365
+ }
366
+ platform-diagram .workspace-corner-hex.app-builder:hover {
367
+ transform: translateY(calc(208px + 24px - 4px + (120px * (1 - var(--pd-hex-progress)))));
368
+ }
369
+
370
+ /* Hover lift composed on top of entrance shift */
371
+ /* No :hover lift on the labels: pointer-events: none on the parent
372
+ means hover doesn't fire on them anyway, and the old 4px lift was
373
+ tuned for the hex shape, not text. */
374
+
375
+ /* Workspace-attachment lists — workspace-functions (above workspace) and
376
+ app-builder (below workspace). Both share the workspace's grid cell and
377
+ translate vertically so they sit just past the workspace's top/bottom peak. */
378
+ platform-diagram .box-wrap.nextcloud-workspace,
379
+ platform-diagram .box-wrap.app-builder {
380
+ grid-column: 2;
381
+ grid-row: 1 / span 2;
382
+ align-self: center;
383
+ justify-self: center;
384
+ width: 100%;
385
+ max-width: 280px;
386
+ }
387
+ /* Bottom edge overlaps workspace hex top peak by 24px (mirror of side-midpoint
388
+ inward-overlap pattern). Math: row_centre - workspace_half_height (208) + 24 = -184. */
389
+ platform-diagram .box-wrap.nextcloud-workspace {
390
+ transform: translateY(calc(-50% - 184px + (-80px * (1 - var(--pd-list-progress)))));
391
+ opacity: var(--pd-list-progress);
392
+ }
393
+ /* App Builder list: top-centre at app-builder hex's bottom peak + 24px inward overlap */
394
+ platform-diagram .box-wrap.app-builder {
395
+ transform: translateY(calc(50% + 300.5px + (80px * (1 - var(--pd-list-progress)))));
396
+ opacity: var(--pd-list-progress);
397
+ }
398
+
399
+ /* App Builder list: dashed coming-soon styling */
400
+ platform-diagram .box-wrap.app-builder .box {
401
+ border-style: dashed;
402
+ background: var(--c-cobalt-50);
403
+ opacity: 0.92;
404
+ }
405
+ platform-diagram .box-wrap.app-builder .row { color: var(--c-cobalt-400); font-style: italic; }
406
+ platform-diagram .box-wrap.app-builder .row .desc { font-style: normal; }
407
+ platform-diagram .box-wrap.app-builder .row:hover .name { color: var(--c-cobalt-700); }
408
+
409
+ /* Badge (e.g. COMING SOON) — generic, attaches to any .box-wrap */
410
+ platform-diagram .box-wrap .badge {
411
+ position: absolute;
412
+ top: -8px; right: 16px;
413
+ background: var(--c-orange-knvb);
414
+ color: white;
415
+ font-family: var(--conduction-typography-font-family-code);
416
+ font-size: 9px;
417
+ font-weight: 600;
418
+ padding: 3px 8px;
419
+ border-radius: var(--radius-pill);
420
+ letter-spacing: 0.08em;
421
+ z-index: 4;
422
+ }
423
+
424
+ /* ---- Flow connectors ---- Animated dashed lines over the workspace cell.
425
+ viewBox is workspace-relative (origin at workspace centre), so paths can use
426
+ the same arithmetic the corner hexes use. */
427
+ platform-diagram .flow-overlay {
428
+ grid-column: 2;
429
+ grid-row: 1 / span 2;
430
+ align-self: center;
431
+ justify-self: center;
432
+ /* Height must match the viewBox set in JS (650) so SVG (0,0) lands exactly
433
+ on the workspace centre. Width matches viewBox (680) too. */
434
+ width: 680px;
435
+ height: 650px;
436
+ pointer-events: none;
437
+ z-index: 3;
438
+ overflow: visible;
439
+ /* Scroll-entrance: fade in last, after hexes & lists are in place. */
440
+ opacity: var(--pd-flow-progress);
441
+ }
442
+ platform-diagram .flow-overlay .flow-line {
443
+ fill: none;
444
+ stroke: var(--c-orange-knvb);
445
+ stroke-width: 2;
446
+ stroke-linecap: round;
447
+ stroke-linejoin: round;
448
+ stroke-dasharray: 6 6;
449
+ animation: pd-flow-dash 1.4s linear infinite;
450
+ }
451
+ @keyframes pd-flow-dash {
452
+ to { stroke-dashoffset: -12; } /* one dash+gap cycle, in path-direction */
453
+ }
454
+
455
+ /* The scroll-entrance animation is fully expressed inline above via the
456
+ `--pd-hex-progress`, `--pd-list-progress`, `--pd-flow-progress` custom
457
+ properties. JS writes them on every scroll (rAF-throttled) so scrolling
458
+ up reverses the entrance. There is no discrete state machine. */