@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.
- package/MISSING_COMPONENTS.md +109 -0
- package/README.md +171 -0
- package/package.json +59 -0
- package/src/components/AgentTrace/AgentTrace.jsx +128 -0
- package/src/components/AgentTrace/AgentTrace.module.css +115 -0
- package/src/components/AppMock/AppMock.jsx +86 -0
- package/src/components/AppMock/AppMock.module.css +629 -0
- package/src/components/AppMock/variants/DeciDeskMock.jsx +71 -0
- package/src/components/AppMock/variants/DocuDeskMock.jsx +69 -0
- package/src/components/AppMock/variants/LarpingAppMock.jsx +59 -0
- package/src/components/AppMock/variants/MyDashBiMock.jsx +135 -0
- package/src/components/AppMock/variants/MyDashMock.jsx +96 -0
- package/src/components/AppMock/variants/MyDashTilesMock.jsx +103 -0
- package/src/components/AppMock/variants/MyDashWidgetsMock.jsx +123 -0
- package/src/components/AppMock/variants/NLDesignMock.jsx +70 -0
- package/src/components/AppMock/variants/OpenCatalogiMock.jsx +61 -0
- package/src/components/AppMock/variants/OpenConnectorMock.jsx +83 -0
- package/src/components/AppMock/variants/OpenRegisterMock.jsx +100 -0
- package/src/components/AppMock/variants/OpenWooMock.jsx +61 -0
- package/src/components/AppMock/variants/PipelinQMock.jsx +88 -0
- package/src/components/AppMock/variants/ProcestMock.jsx +87 -0
- package/src/components/AppMock/variants/SoftwareCatalogMock.jsx +71 -0
- package/src/components/AppMock/variants/ZaakAfhandelAppMock.jsx +71 -0
- package/src/components/AppsGrid/AppsGrid.jsx +84 -0
- package/src/components/AppsGrid/AppsGrid.module.css +46 -0
- package/src/components/AppsPreview/AppsPreview.jsx +85 -0
- package/src/components/AppsPreview/AppsPreview.module.css +128 -0
- package/src/components/Clients/Clients.jsx +205 -0
- package/src/components/Clients/Clients.module.css +166 -0
- package/src/components/ComposeBlock/ComposeBlock.jsx +70 -0
- package/src/components/ComposeBlock/ComposeBlock.module.css +74 -0
- package/src/components/ConductionBg/ConductionBg.jsx +150 -0
- package/src/components/ConductionBg/ConductionBg.module.css +41 -0
- package/src/components/ContentCard/ContentCard.jsx +126 -0
- package/src/components/ContentCard/ContentCard.module.css +84 -0
- package/src/components/ContentDetailHero/ContentDetailHero.jsx +136 -0
- package/src/components/ContentDetailHero/ContentDetailHero.module.css +96 -0
- package/src/components/ContentTypeFilter/ContentTypeFilter.jsx +103 -0
- package/src/components/ContentTypeFilter/ContentTypeFilter.module.css +60 -0
- package/src/components/ContentTypeFilter/contentTypes.js +58 -0
- package/src/components/CookieCli/CookieCli.jsx +223 -0
- package/src/components/CookieCli/CookieCli.module.css +166 -0
- package/src/components/CtaBanner/CtaBanner.jsx +61 -0
- package/src/components/CtaBanner/CtaBanner.module.css +65 -0
- package/src/components/DetailHero/DetailHero.jsx +143 -0
- package/src/components/DetailHero/DetailHero.module.css +154 -0
- package/src/components/Diagrams/Diagrams.jsx +148 -0
- package/src/components/EmployeeCard/EmployeeCard.jsx +127 -0
- package/src/components/EmployeeCard/EmployeeCard.module.css +144 -0
- package/src/components/ExternalAppShelf/ExternalAppShelf.jsx +61 -0
- package/src/components/ExternalAppShelf/ExternalAppShelf.module.css +90 -0
- package/src/components/FAQ/FAQ.jsx +42 -0
- package/src/components/FAQ/FAQ.module.css +74 -0
- package/src/components/FacetedFilters/FacetedFilters.jsx +125 -0
- package/src/components/FacetedFilters/FacetedFilters.module.css +133 -0
- package/src/components/FeatureGrid/FeatureGrid.jsx +94 -0
- package/src/components/FeatureGrid/FeatureGrid.module.css +114 -0
- package/src/components/FeatureList/FeatureList.jsx +54 -0
- package/src/components/FeatureList/FeatureList.module.css +52 -0
- package/src/components/FeaturedCard/FeaturedCard.jsx +101 -0
- package/src/components/FeaturedCard/FeaturedCard.module.css +98 -0
- package/src/components/GameModal/GameModal.jsx +197 -0
- package/src/components/GameModal/GameModal.module.css +184 -0
- package/src/components/Hero/Hero.jsx +101 -0
- package/src/components/Hero/Hero.module.css +95 -0
- package/src/components/HexBackground/HexBackground.jsx +56 -0
- package/src/components/HexBackground/HexBackground.module.css +73 -0
- package/src/components/HexNetwork/HexNetwork.jsx +141 -0
- package/src/components/HexNetwork/HexNetwork.module.css +187 -0
- package/src/components/HexRain/HexRain.jsx +81 -0
- package/src/components/HowSteps/HowSteps.jsx +57 -0
- package/src/components/HowSteps/HowSteps.module.css +52 -0
- package/src/components/ManagedCommonGround/ManagedCommonGround.jsx +78 -0
- package/src/components/ManagedCommonGround/ManagedCommonGround.module.css +16 -0
- package/src/components/NewsletterCta/NewsletterCta.jsx +83 -0
- package/src/components/NewsletterCta/NewsletterCta.module.css +103 -0
- package/src/components/PairCard/PairCard.jsx +58 -0
- package/src/components/PairCard/PairCard.module.css +54 -0
- package/src/components/PartnerCard/PartnerCard.jsx +130 -0
- package/src/components/PartnerCard/PartnerCard.module.css +198 -0
- package/src/components/PartnerDirectory/PartnerDirectory.jsx +122 -0
- package/src/components/PartnerDirectory/PartnerDirectory.module.css +25 -0
- package/src/components/PartnerSidecard/PartnerSidecard.jsx +116 -0
- package/src/components/PartnerSidecard/PartnerSidecard.module.css +185 -0
- package/src/components/Pipeline/Pipeline.jsx +198 -0
- package/src/components/Pipeline/Pipeline.module.css +206 -0
- package/src/components/PlatformDiagram/PlatformDiagram.jsx +110 -0
- package/src/components/PlatformOverview/PlatformOverview.jsx +68 -0
- package/src/components/PlatformOverview/PlatformOverview.module.css +71 -0
- package/src/components/ReferenceCard/ReferenceCard.jsx +44 -0
- package/src/components/ReferenceCard/ReferenceCard.module.css +57 -0
- package/src/components/RelatedPosts/RelatedPosts.jsx +58 -0
- package/src/components/RelatedPosts/RelatedPosts.module.css +51 -0
- package/src/components/RotatingCards/RotatingCards.jsx +98 -0
- package/src/components/RotatingCards/RotatingCards.module.css +153 -0
- package/src/components/Showcase/Showcase.jsx +129 -0
- package/src/components/Showcase/Showcase.module.css +168 -0
- package/src/components/SolutionCard/SolutionCard.jsx +83 -0
- package/src/components/SolutionCard/SolutionCard.module.css +99 -0
- package/src/components/StatsStrip/StatsStrip.jsx +38 -0
- package/src/components/StatsStrip/StatsStrip.module.css +53 -0
- package/src/components/WidgetShelf/WidgetShelf.jsx +67 -0
- package/src/components/WidgetShelf/WidgetShelf.module.css +73 -0
- package/src/components/index.js +96 -0
- package/src/components/primitives/AuthorByline.jsx +85 -0
- package/src/components/primitives/AuthorByline.module.css +57 -0
- package/src/components/primitives/BrandCitation.jsx +71 -0
- package/src/components/primitives/Button.jsx +46 -0
- package/src/components/primitives/Button.module.css +88 -0
- package/src/components/primitives/Card.jsx +42 -0
- package/src/components/primitives/Card.module.css +42 -0
- package/src/components/primitives/Eyebrow.jsx +37 -0
- package/src/components/primitives/Eyebrow.module.css +19 -0
- package/src/components/primitives/HexBullet.jsx +37 -0
- package/src/components/primitives/HexBullet.module.css +16 -0
- package/src/components/primitives/HexThumbnail.jsx +70 -0
- package/src/components/primitives/HexThumbnail.module.css +45 -0
- package/src/components/primitives/Pill.jsx +42 -0
- package/src/components/primitives/Pill.module.css +30 -0
- package/src/components/primitives/Section.jsx +51 -0
- package/src/components/primitives/Section.module.css +31 -0
- package/src/components/primitives/SectionHead.jsx +36 -0
- package/src/components/primitives/SectionHead.module.css +43 -0
- package/src/components/primitives/index.js +22 -0
- package/src/css/brand.css +158 -0
- package/src/css/tokens.css +12 -0
- package/src/data/app-downloads.js +42 -0
- package/src/diagrams/README.md +74 -0
- package/src/diagrams/cn-domain-tree.js +105 -0
- package/src/diagrams/cn-hex-prism.js +163 -0
- package/src/diagrams/cn-hex.js +181 -0
- package/src/diagrams/cn-honeycomb-bg.js +135 -0
- package/src/diagrams/cn-pipeline.js +150 -0
- package/src/diagrams/cn-platform.js +156 -0
- package/src/diagrams/cn-side-box.js +104 -0
- package/src/diagrams/index.js +28 -0
- package/src/index.js +183 -0
- package/src/theme/Footer/index.jsx +516 -0
- package/src/theme/MDXPage/index.jsx +134 -0
- package/src/theme/Navbar/index.jsx +120 -0
- package/src/theme/Navbar/styles.module.css +114 -0
- package/src/theme/brand.jsx +63 -0
- package/src/theme.js +45 -0
- package/src/utils/lazyScript.js +37 -0
- package/static/img/favicon.svg +14 -0
- package/static/img/honeycomb-scatter.svg +23 -0
- package/static/img/honeycomb-watermark.svg +108 -0
- package/static/img/logo-dark.svg +11 -0
- package/static/img/logo.svg +14 -0
- package/static/img/nextcloud-logo.svg +5 -0
- package/static/lib/canal-footer.css +418 -0
- package/static/lib/canal-footer.js +499 -0
- package/static/lib/clients-flow.js +317 -0
- package/static/lib/conduction-bg.css +50 -0
- package/static/lib/conduction-bg.js +122 -0
- package/static/lib/hex-rain.css +128 -0
- package/static/lib/hex-rain.js +284 -0
- package/static/lib/kade-cyclist.css +264 -0
- package/static/lib/kade-cyclist.js +420 -0
- package/static/lib/logo-memory.css +219 -0
- package/static/lib/logo-memory.js +540 -0
- package/static/lib/platform-diagram.css +458 -0
- 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. */
|