@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,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* <HexBullet />
|
|
3
|
+
*
|
|
4
|
+
* The 12×14 (or 8×9) pointy-top clip-path hexagon used as the bullet
|
|
5
|
+
* inside eyebrows, status badges, footer triad, and pill chips. The
|
|
6
|
+
* shape recurs 15+ times across the kit; centralising it removes the
|
|
7
|
+
* temptation to duplicate `width: 12px; height: 14px; clip-path:
|
|
8
|
+
* var(--hex-pointy-top)` in every component CSS module.
|
|
9
|
+
*
|
|
10
|
+
* Per huisstijl: pointy-top, never rotated, solid colour fill.
|
|
11
|
+
*
|
|
12
|
+
* Sizes:
|
|
13
|
+
* - sm = 8 × 9 (inline pill bullet)
|
|
14
|
+
* - md = 12 × 14 (default eyebrow bullet)
|
|
15
|
+
* - lg = 44 × 50 (icon-hex container, see <IconHex/> wrapper)
|
|
16
|
+
*
|
|
17
|
+
* Color: any CSS color or token. Defaults to KNVB orange so the bullet
|
|
18
|
+
* is the brand's only orange-on-cobalt accent.
|
|
19
|
+
*/
|
|
20
|
+
|
|
21
|
+
import React from 'react';
|
|
22
|
+
import styles from './HexBullet.module.css';
|
|
23
|
+
|
|
24
|
+
const SIZES = {sm: 'sm', md: 'md', lg: 'lg'};
|
|
25
|
+
|
|
26
|
+
export default function HexBullet({size = 'md', color, className, style, ...rest}) {
|
|
27
|
+
const sizeKey = SIZES[size] || 'md';
|
|
28
|
+
const composed = [styles.hex, styles[sizeKey], className].filter(Boolean).join(' ');
|
|
29
|
+
return (
|
|
30
|
+
<span
|
|
31
|
+
aria-hidden="true"
|
|
32
|
+
className={composed}
|
|
33
|
+
style={color ? {background: color, ...style} : style}
|
|
34
|
+
{...rest}
|
|
35
|
+
/>
|
|
36
|
+
);
|
|
37
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* <HexBullet /> styles. Three sizes mirror the recurring measurements
|
|
3
|
+
* across reference-cards, solution-cards, partner-cards, hero,
|
|
4
|
+
* footer, eyebrow, etc. Always pointy-top, never rotated.
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
.hex {
|
|
8
|
+
display: inline-block;
|
|
9
|
+
clip-path: var(--hex-pointy-top);
|
|
10
|
+
background: var(--c-orange-knvb);
|
|
11
|
+
flex-shrink: 0;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
.sm { width: 8px; height: 9px; }
|
|
15
|
+
.md { width: 12px; height: 14px; }
|
|
16
|
+
.lg { width: 44px; height: 50px; }
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* <HexThumbnail />
|
|
3
|
+
*
|
|
4
|
+
* Single pointy-top hex tile that holds an icon, a photo (clip-path
|
|
5
|
+
* masked), or an illustration. Used as the visual on academy
|
|
6
|
+
* <ContentCard/>, <FeaturedCard/>, <ContentDetailHero/> and anywhere
|
|
7
|
+
* else a hex-shaped media tile is needed.
|
|
8
|
+
*
|
|
9
|
+
* Per huisstijl: pointy-top, never rotated, solid colour ground.
|
|
10
|
+
*
|
|
11
|
+
* Sizes:
|
|
12
|
+
* - sm = 56 × 64 (small content cards, dense rows)
|
|
13
|
+
* - md = 88 × 100 (default content card)
|
|
14
|
+
* - lg = 160 × 184 (featured card, secondary visual)
|
|
15
|
+
* - xl = 240 × 280 (featured-card primary, detail-hero cover)
|
|
16
|
+
*
|
|
17
|
+
* Tones: cobalt (default), cobalt-dark, cobalt-deep, mint, orange,
|
|
18
|
+
* cobalt-50 (light surface, cobalt content).
|
|
19
|
+
*
|
|
20
|
+
* Pass an SVG icon as children for the icon variant; pass `src` for
|
|
21
|
+
* the photo variant. The component keeps both options in one API so
|
|
22
|
+
* cards don't need two thumbnail components.
|
|
23
|
+
*
|
|
24
|
+
* Usage:
|
|
25
|
+
*
|
|
26
|
+
* <HexThumbnail tone="cobalt-dark" size="md">
|
|
27
|
+
* <svg viewBox="0 0 24 24"><path d="..."/></svg>
|
|
28
|
+
* </HexThumbnail>
|
|
29
|
+
*
|
|
30
|
+
* <HexThumbnail size="lg" src="/img/posts/install.jpg" alt="Install screen" />
|
|
31
|
+
*/
|
|
32
|
+
|
|
33
|
+
import React from 'react';
|
|
34
|
+
import styles from './HexThumbnail.module.css';
|
|
35
|
+
|
|
36
|
+
const SIZES = {sm: 'sm', md: 'md', lg: 'lg', xl: 'xl'};
|
|
37
|
+
const TONES = {
|
|
38
|
+
cobalt: 'cobalt',
|
|
39
|
+
'cobalt-dark': 'cobalt-dark',
|
|
40
|
+
'cobalt-deep': 'cobalt-deep',
|
|
41
|
+
'cobalt-50': 'cobalt-50',
|
|
42
|
+
mint: 'mint',
|
|
43
|
+
orange: 'orange',
|
|
44
|
+
};
|
|
45
|
+
|
|
46
|
+
export default function HexThumbnail({
|
|
47
|
+
size = 'md',
|
|
48
|
+
tone = 'cobalt',
|
|
49
|
+
src,
|
|
50
|
+
alt = '',
|
|
51
|
+
className,
|
|
52
|
+
children,
|
|
53
|
+
style,
|
|
54
|
+
...rest
|
|
55
|
+
}) {
|
|
56
|
+
const sizeKey = SIZES[size] || 'md';
|
|
57
|
+
const toneKey = TONES[tone] || 'cobalt';
|
|
58
|
+
const composed = [
|
|
59
|
+
styles.thumb,
|
|
60
|
+
styles['size-' + sizeKey],
|
|
61
|
+
styles['tone-' + toneKey],
|
|
62
|
+
className,
|
|
63
|
+
].filter(Boolean).join(' ');
|
|
64
|
+
|
|
65
|
+
return (
|
|
66
|
+
<span className={composed} style={style} {...rest}>
|
|
67
|
+
{src ? <img src={src} alt={alt} /> : children}
|
|
68
|
+
</span>
|
|
69
|
+
);
|
|
70
|
+
}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* <HexThumbnail /> styles. Pointy-top clip-path hex with size and tone
|
|
3
|
+
* variants. The img variant fills the hex via object-fit: cover.
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
.thumb {
|
|
7
|
+
position: relative;
|
|
8
|
+
display: inline-flex;
|
|
9
|
+
align-items: center;
|
|
10
|
+
justify-content: center;
|
|
11
|
+
clip-path: var(--hex-pointy-top);
|
|
12
|
+
flex-shrink: 0;
|
|
13
|
+
overflow: hidden;
|
|
14
|
+
color: white;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
.thumb img {
|
|
18
|
+
width: 100%;
|
|
19
|
+
height: 100%;
|
|
20
|
+
object-fit: cover;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
.thumb svg {
|
|
24
|
+
stroke: currentColor;
|
|
25
|
+
stroke-width: 1.6;
|
|
26
|
+
fill: none;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
/* sizes */
|
|
30
|
+
.size-sm { width: 56px; height: 64px; }
|
|
31
|
+
.size-sm svg { width: 22px; height: 22px; }
|
|
32
|
+
.size-md { width: 88px; height: 100px; }
|
|
33
|
+
.size-md svg { width: 36px; height: 36px; }
|
|
34
|
+
.size-lg { width: 160px; height: 184px; }
|
|
35
|
+
.size-lg svg { width: 64px; height: 64px; }
|
|
36
|
+
.size-xl { width: 240px; height: 280px; }
|
|
37
|
+
.size-xl svg { width: 96px; height: 96px; }
|
|
38
|
+
|
|
39
|
+
/* tones */
|
|
40
|
+
.tone-cobalt { background: var(--c-blue-cobalt); }
|
|
41
|
+
.tone-cobalt-dark { background: var(--c-cobalt-700); }
|
|
42
|
+
.tone-cobalt-deep { background: var(--c-cobalt-900); }
|
|
43
|
+
.tone-cobalt-50 { background: var(--c-cobalt-50); color: var(--c-blue-cobalt); }
|
|
44
|
+
.tone-mint { background: var(--c-mint-500); }
|
|
45
|
+
.tone-orange { background: var(--c-orange-knvb); }
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* <Pill />
|
|
3
|
+
*
|
|
4
|
+
* Inline-flex pill chip with optional leading <HexBullet/>. Used for
|
|
5
|
+
* status badges (STABLE / BETA), built-on app tags, sector labels,
|
|
6
|
+
* version tags. Recurs in reference-cards.css, solution-cards.css,
|
|
7
|
+
* partner-cards.css, apps-grid.css, app-card meta line.
|
|
8
|
+
*
|
|
9
|
+
* Tones:
|
|
10
|
+
* - default: cobalt-50 bg, cobalt-700 text, mono caps
|
|
11
|
+
* - status: colored hex bullet (green=stable, orange=beta, blue=soon)
|
|
12
|
+
* - solid: colored bg fill (used for sector tags)
|
|
13
|
+
*
|
|
14
|
+
* Usage:
|
|
15
|
+
*
|
|
16
|
+
* <Pill bullet>STABLE</Pill>
|
|
17
|
+
* <Pill bullet bulletColor="var(--c-orange-knvb)">BETA</Pill>
|
|
18
|
+
* <Pill tone="solid" color="var(--c-mkb)">MKB</Pill>
|
|
19
|
+
*/
|
|
20
|
+
|
|
21
|
+
import React from 'react';
|
|
22
|
+
import HexBullet from './HexBullet';
|
|
23
|
+
import styles from './Pill.module.css';
|
|
24
|
+
|
|
25
|
+
export default function Pill({
|
|
26
|
+
bullet = false,
|
|
27
|
+
bulletColor,
|
|
28
|
+
tone = 'default',
|
|
29
|
+
color,
|
|
30
|
+
className,
|
|
31
|
+
children,
|
|
32
|
+
...rest
|
|
33
|
+
}) {
|
|
34
|
+
const composed = [styles.pill, styles['tone-' + tone], className].filter(Boolean).join(' ');
|
|
35
|
+
const style = tone === 'solid' && color ? {background: color, color: 'white'} : undefined;
|
|
36
|
+
return (
|
|
37
|
+
<span className={composed} style={style} {...rest}>
|
|
38
|
+
{bullet && <HexBullet size="sm" color={bulletColor} />}
|
|
39
|
+
<span className={styles.label}>{children}</span>
|
|
40
|
+
</span>
|
|
41
|
+
);
|
|
42
|
+
}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* <Pill /> styles. Mirrors .pill rules in reference-cards.css,
|
|
3
|
+
* solution-cards.css, partner-cards.css.
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
.pill {
|
|
7
|
+
display: inline-flex;
|
|
8
|
+
align-items: center;
|
|
9
|
+
gap: 6px;
|
|
10
|
+
padding: 4px 10px;
|
|
11
|
+
border-radius: var(--radius-pill);
|
|
12
|
+
font-family: var(--conduction-typography-font-family-code);
|
|
13
|
+
font-size: 11px;
|
|
14
|
+
letter-spacing: 0.06em;
|
|
15
|
+
text-transform: uppercase;
|
|
16
|
+
line-height: 1.4;
|
|
17
|
+
white-space: nowrap;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
.tone-default {
|
|
21
|
+
background: var(--c-cobalt-50);
|
|
22
|
+
color: var(--c-cobalt-700);
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
.tone-solid {
|
|
26
|
+
background: var(--c-blue-cobalt);
|
|
27
|
+
color: white;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
.label { display: inline-block; }
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* <Section />
|
|
3
|
+
*
|
|
4
|
+
* The 1280px max-width 64px-padded section wrapper that every page in
|
|
5
|
+
* preview/pages/* uses. Eight components currently re-declare these
|
|
6
|
+
* exact values in their own CSS module; centralising prevents drift.
|
|
7
|
+
*
|
|
8
|
+
* Background variants:
|
|
9
|
+
* - default: white
|
|
10
|
+
* - tinted: --c-cobalt-50 (used for stats strip, platform overview)
|
|
11
|
+
* - inverse: --c-blue-cobalt with white type (used for CTA panels)
|
|
12
|
+
*
|
|
13
|
+
* Spacing variants:
|
|
14
|
+
* - default: 96px vertical padding
|
|
15
|
+
* - tight: 48px (stats-strip rhythm)
|
|
16
|
+
* - flush: 0 (consumer controls)
|
|
17
|
+
*
|
|
18
|
+
* Usage in MDX:
|
|
19
|
+
*
|
|
20
|
+
* <Section background="tinted">
|
|
21
|
+
* <SectionHead eyebrow="The platform" title="..." lede="..." />
|
|
22
|
+
* <FeatureList items={[...]} />
|
|
23
|
+
* </Section>
|
|
24
|
+
*/
|
|
25
|
+
|
|
26
|
+
import React from 'react';
|
|
27
|
+
import styles from './Section.module.css';
|
|
28
|
+
|
|
29
|
+
export default function Section({
|
|
30
|
+
background = 'default',
|
|
31
|
+
spacing = 'default',
|
|
32
|
+
as: Tag = 'section',
|
|
33
|
+
className,
|
|
34
|
+
innerClassName,
|
|
35
|
+
children,
|
|
36
|
+
...rest
|
|
37
|
+
}) {
|
|
38
|
+
const wrap = [
|
|
39
|
+
styles.section,
|
|
40
|
+
styles['bg-' + background],
|
|
41
|
+
styles['sp-' + spacing],
|
|
42
|
+
className,
|
|
43
|
+
].filter(Boolean).join(' ');
|
|
44
|
+
return (
|
|
45
|
+
<Tag className={wrap} {...rest}>
|
|
46
|
+
<div className={[styles.inner, innerClassName].filter(Boolean).join(' ')}>
|
|
47
|
+
{children}
|
|
48
|
+
</div>
|
|
49
|
+
</Tag>
|
|
50
|
+
);
|
|
51
|
+
}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* <Section /> styles. Mirrors the .section / .platform / .strip /
|
|
3
|
+
* .apps-preview / .cta wrappers from preview/pages/landing.html.
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
.section { font-family: var(--conduction-typography-font-family-body); }
|
|
7
|
+
|
|
8
|
+
.inner {
|
|
9
|
+
max-width: 1280px;
|
|
10
|
+
margin: 0 auto;
|
|
11
|
+
padding: 0 64px;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
@media (max-width: 700px) {
|
|
15
|
+
.inner { padding: 0 16px; }
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
/* Background variants */
|
|
19
|
+
.bg-default { background: white; }
|
|
20
|
+
.bg-tinted { background: var(--c-cobalt-50); border-top: 1px solid var(--c-cobalt-100); border-bottom: 1px solid var(--c-cobalt-100); }
|
|
21
|
+
.bg-inverse { background: var(--c-blue-cobalt); color: white; }
|
|
22
|
+
|
|
23
|
+
/* Vertical-spacing variants */
|
|
24
|
+
.sp-default .inner { padding-block: 96px; }
|
|
25
|
+
.sp-tight .inner { padding-block: 48px; }
|
|
26
|
+
.sp-flush .inner { padding-block: 0; }
|
|
27
|
+
|
|
28
|
+
@media (max-width: 700px) {
|
|
29
|
+
.sp-default .inner { padding-block: 56px; }
|
|
30
|
+
.sp-tight .inner { padding-block: 32px; }
|
|
31
|
+
}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* <SectionHead />
|
|
3
|
+
*
|
|
4
|
+
* The eyebrow + h2 + lede block used at the top of every section in
|
|
5
|
+
* preview/pages/landing.html (.section-head). Splits left (eyebrow +
|
|
6
|
+
* h2) from right (lede) on a 1.1fr/1fr grid, collapses to single
|
|
7
|
+
* column under 900px.
|
|
8
|
+
*
|
|
9
|
+
* Mirrors .section-head from landing.html's per-page CSS, which
|
|
10
|
+
* recurs in apps-catalog, solutions-catalog, support, partners,
|
|
11
|
+
* about, etc.
|
|
12
|
+
*
|
|
13
|
+
* Usage:
|
|
14
|
+
*
|
|
15
|
+
* <SectionHead
|
|
16
|
+
* eyebrow="Most installed"
|
|
17
|
+
* title="Three apps that ship the most outcomes."
|
|
18
|
+
* lede="Start with the apps that solve a concrete problem on day one."
|
|
19
|
+
* />
|
|
20
|
+
*/
|
|
21
|
+
|
|
22
|
+
import React from 'react';
|
|
23
|
+
import Eyebrow from './Eyebrow';
|
|
24
|
+
import styles from './SectionHead.module.css';
|
|
25
|
+
|
|
26
|
+
export default function SectionHead({eyebrow, title, lede, align = 'split', className}) {
|
|
27
|
+
return (
|
|
28
|
+
<div className={[styles.head, styles['align-' + align], className].filter(Boolean).join(' ')}>
|
|
29
|
+
<div className={styles.copy}>
|
|
30
|
+
{eyebrow && <Eyebrow>{eyebrow}</Eyebrow>}
|
|
31
|
+
{title && <h2 className={styles.title}>{title}</h2>}
|
|
32
|
+
</div>
|
|
33
|
+
{lede && <p className={styles.lede}>{lede}</p>}
|
|
34
|
+
</div>
|
|
35
|
+
);
|
|
36
|
+
}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* <SectionHead /> styles. Mirrors .section-head from preview/pages/
|
|
3
|
+
* landing.html (and the same rule re-declared on apps-catalog,
|
|
4
|
+
* solutions-catalog, support, partners, about pages).
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
.head { margin-bottom: 48px; }
|
|
8
|
+
|
|
9
|
+
.align-split {
|
|
10
|
+
display: grid;
|
|
11
|
+
grid-template-columns: 1.1fr 1fr;
|
|
12
|
+
gap: 64px;
|
|
13
|
+
align-items: end;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
.align-stack { display: block; }
|
|
17
|
+
.align-stack .lede { max-width: 60ch; margin-top: 16px; }
|
|
18
|
+
|
|
19
|
+
@media (max-width: 900px) {
|
|
20
|
+
.align-split { grid-template-columns: 1fr; gap: 24px; }
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
.title {
|
|
24
|
+
font-size: 44px;
|
|
25
|
+
font-weight: 700;
|
|
26
|
+
line-height: 1.1;
|
|
27
|
+
letter-spacing: -0.02em;
|
|
28
|
+
color: var(--c-cobalt-900);
|
|
29
|
+
margin: 0;
|
|
30
|
+
}
|
|
31
|
+
@media (max-width: 700px) { .title { font-size: 32px; } }
|
|
32
|
+
|
|
33
|
+
.title :global(.next-blue) { color: var(--c-nextcloud-blue); }
|
|
34
|
+
.title :global(.cg-yellow) { color: var(--c-commonground-yellow); }
|
|
35
|
+
|
|
36
|
+
.lede {
|
|
37
|
+
font-size: 17px;
|
|
38
|
+
color: var(--c-cobalt-700);
|
|
39
|
+
line-height: 1.55;
|
|
40
|
+
margin: 0;
|
|
41
|
+
}
|
|
42
|
+
.lede :global(.next-blue) { color: var(--c-nextcloud-blue); }
|
|
43
|
+
.lede :global(.cg-yellow) { color: var(--c-commonground-yellow); }
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @conduction/docusaurus-preset/components/primitives
|
|
3
|
+
*
|
|
4
|
+
* Atomic visual primitives extracted from preview/components/*.html so
|
|
5
|
+
* higher-level components and MDX pages compose from one source. Each
|
|
6
|
+
* primitive matches a CSS rule that appeared in 3+ files in the kit.
|
|
7
|
+
*
|
|
8
|
+
* Build order matters: HexBullet has no deps, Eyebrow consumes
|
|
9
|
+
* HexBullet, Pill consumes HexBullet, SectionHead consumes Eyebrow,
|
|
10
|
+
* etc.
|
|
11
|
+
*/
|
|
12
|
+
|
|
13
|
+
export {default as HexBullet} from './HexBullet';
|
|
14
|
+
export {default as HexThumbnail} from './HexThumbnail';
|
|
15
|
+
export {default as AuthorByline} from './AuthorByline';
|
|
16
|
+
export {default as Eyebrow} from './Eyebrow';
|
|
17
|
+
export {default as Section} from './Section';
|
|
18
|
+
export {default as SectionHead} from './SectionHead';
|
|
19
|
+
export {default as Card} from './Card';
|
|
20
|
+
export {default as Pill} from './Pill';
|
|
21
|
+
export {default as Button} from './Button';
|
|
22
|
+
export {NextBlue, CgYellow, KnvbOrange, CommonGroundPlus} from './BrandCitation';
|
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Conduction brand for Docusaurus 3.
|
|
3
|
+
*
|
|
4
|
+
* Imports the canonical tokens (palette, typography, hex clip-paths)
|
|
5
|
+
* and maps them onto Docusaurus's Infima CSS variables. The result:
|
|
6
|
+
* Docusaurus chrome (navbar, sidebar, code blocks, buttons) renders
|
|
7
|
+
* in cobalt + KNVB orange + Plex Mono, without theme-swizzling.
|
|
8
|
+
*
|
|
9
|
+
* Sites can append their own customCss to override anything below.
|
|
10
|
+
*/
|
|
11
|
+
|
|
12
|
+
@import "./tokens.css";
|
|
13
|
+
|
|
14
|
+
/* ============================================================
|
|
15
|
+
Infima primary palette → cobalt
|
|
16
|
+
============================================================ */
|
|
17
|
+
:root {
|
|
18
|
+
--ifm-color-primary: var(--c-blue-cobalt);
|
|
19
|
+
--ifm-color-primary-dark: var(--c-cobalt-600);
|
|
20
|
+
--ifm-color-primary-darker: var(--c-cobalt-700);
|
|
21
|
+
--ifm-color-primary-darkest: var(--c-cobalt-800);
|
|
22
|
+
--ifm-color-primary-light: var(--c-cobalt-400);
|
|
23
|
+
--ifm-color-primary-lighter: var(--c-cobalt-300);
|
|
24
|
+
--ifm-color-primary-lightest: var(--c-cobalt-200);
|
|
25
|
+
|
|
26
|
+
/* Accent → KNVB orange (links, CTAs, focus ring) */
|
|
27
|
+
--ifm-link-color: var(--c-orange-knvb);
|
|
28
|
+
--ifm-link-hover-color: var(--c-cobalt-700);
|
|
29
|
+
--ifm-button-color: white;
|
|
30
|
+
|
|
31
|
+
/* Typography → Figtree body, Plex Mono code */
|
|
32
|
+
--ifm-font-family-base: var(--conduction-typography-font-family-body);
|
|
33
|
+
--ifm-font-family-monospace: var(--conduction-typography-font-family-code);
|
|
34
|
+
--ifm-heading-color: var(--c-cobalt-900);
|
|
35
|
+
|
|
36
|
+
/* Code blocks */
|
|
37
|
+
--ifm-code-font-size: 92%;
|
|
38
|
+
--ifm-code-background: var(--c-cobalt-50);
|
|
39
|
+
--ifm-pre-background: var(--c-cobalt-900);
|
|
40
|
+
--ifm-pre-color: var(--c-cobalt-100);
|
|
41
|
+
|
|
42
|
+
/* Sidebar + navbar surfaces */
|
|
43
|
+
--ifm-navbar-background-color: white;
|
|
44
|
+
--ifm-navbar-shadow: 0 1px 0 var(--c-cobalt-100);
|
|
45
|
+
--ifm-toc-border-color: var(--c-cobalt-100);
|
|
46
|
+
|
|
47
|
+
/* Footer cobalt-900 panel */
|
|
48
|
+
--ifm-footer-background-color: var(--c-cobalt-900);
|
|
49
|
+
--ifm-footer-color: var(--c-cobalt-200);
|
|
50
|
+
--ifm-footer-link-color: white;
|
|
51
|
+
--ifm-footer-title-color: var(--c-cobalt-200);
|
|
52
|
+
|
|
53
|
+
/* Spacing rhythm reused from tokens */
|
|
54
|
+
--ifm-spacing-horizontal: var(--space-6);
|
|
55
|
+
--ifm-spacing-vertical: var(--space-6);
|
|
56
|
+
--ifm-line-height-base: 1.55;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
[data-theme='dark'] {
|
|
60
|
+
--ifm-background-color: var(--c-cobalt-900);
|
|
61
|
+
--ifm-background-surface-color: var(--c-cobalt-800);
|
|
62
|
+
--ifm-color-primary: var(--c-cobalt-300);
|
|
63
|
+
--ifm-color-primary-light: var(--c-cobalt-200);
|
|
64
|
+
--ifm-link-color: var(--c-orange-knvb);
|
|
65
|
+
--ifm-heading-color: white;
|
|
66
|
+
--ifm-font-color-base: var(--c-cobalt-100);
|
|
67
|
+
--ifm-code-background: var(--c-cobalt-800);
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
/* ============================================================
|
|
71
|
+
Brand tells, applied site-wide
|
|
72
|
+
============================================================ */
|
|
73
|
+
|
|
74
|
+
/* Pointy-top hex utility (mirrors design-system .hex) */
|
|
75
|
+
.cn-hex-clip { clip-path: var(--hex-pointy-top); display: inline-block; }
|
|
76
|
+
|
|
77
|
+
/* Brand citation, "Next" in Nextcloud-blue */
|
|
78
|
+
.next-blue { color: var(--conduction-color-brand-nextcloud); }
|
|
79
|
+
|
|
80
|
+
/* Brand citation, "Common Ground" in CG-yellow */
|
|
81
|
+
.cg-yellow { color: var(--conduction-color-brand-commonground); }
|
|
82
|
+
|
|
83
|
+
/* KNVB-orange highlight, for the rare emphasised word per "one orange
|
|
84
|
+
per screen" rule. Reserved for highlights, never primary fills. */
|
|
85
|
+
.knvb-orange { color: var(--c-orange-knvb); }
|
|
86
|
+
|
|
87
|
+
/* Common Ground+ wordmark — tri-colour brand mark for the productized
|
|
88
|
+
Common Ground offering. "Common" in Conduction cobalt, "Ground" in
|
|
89
|
+
Common Ground yellow (reuses .cg-yellow), "+" in Nextcloud blue.
|
|
90
|
+
Use through the <CommonGroundPlus/> primitive; the rules below back
|
|
91
|
+
it (and any plain-HTML preview that wires up the same span shape). */
|
|
92
|
+
.cg-plus-common { color: var(--c-blue-cobalt); }
|
|
93
|
+
.cg-plus-plus { color: var(--conduction-color-brand-nextcloud); font-weight: inherit; }
|
|
94
|
+
|
|
95
|
+
/* Buttons inherit brand-primary fill */
|
|
96
|
+
.button--primary {
|
|
97
|
+
background-color: var(--c-blue-cobalt);
|
|
98
|
+
border-color: var(--c-blue-cobalt);
|
|
99
|
+
color: white;
|
|
100
|
+
}
|
|
101
|
+
.button--primary:hover {
|
|
102
|
+
background-color: var(--c-cobalt-700);
|
|
103
|
+
border-color: var(--c-cobalt-700);
|
|
104
|
+
color: white;
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
/* Focus ring is KNVB orange, never default Infima blue */
|
|
108
|
+
*:focus-visible {
|
|
109
|
+
outline: 2px solid var(--c-orange-knvb);
|
|
110
|
+
outline-offset: 2px;
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
/* Headings keep the brand letter-spacing */
|
|
114
|
+
h1, h2, h3 { letter-spacing: -0.02em; }
|
|
115
|
+
|
|
116
|
+
/* Marketing pages (frontmatter: hide_table_of_contents: true) get
|
|
117
|
+
a flush top edge AND full-width sections. The MDXPage swizzle
|
|
118
|
+
attaches the .marketing-page class on <main>; the rules below:
|
|
119
|
+
1. Zero out every margin/padding between <main> and the first
|
|
120
|
+
section so the navbar's bottom border touches the Hero's
|
|
121
|
+
top edge.
|
|
122
|
+
2. Override Infima's .markdown vertical-rhythm rules so h1,
|
|
123
|
+
h2, h3 inside the Hero / SectionHead don't grab a 3rem
|
|
124
|
+
margin-top from the doc-page rhythm.
|
|
125
|
+
3. Force the .markdown wrapper itself to render at the page's
|
|
126
|
+
full width so .strip / .banner sections with their own
|
|
127
|
+
full-bleed backgrounds (cobalt-50 stats band, cobalt CTA
|
|
128
|
+
panel) actually bleed to the viewport edges instead of
|
|
129
|
+
being pinned to the central col-8 width. */
|
|
130
|
+
main.marketing-page,
|
|
131
|
+
main.marketing-page > article,
|
|
132
|
+
main.marketing-page > article > .theme-doc-markdown,
|
|
133
|
+
main.marketing-page > article > div,
|
|
134
|
+
main.marketing-page .markdown {
|
|
135
|
+
margin: 0 !important;
|
|
136
|
+
padding: 0 !important;
|
|
137
|
+
max-width: none !important;
|
|
138
|
+
width: 100%;
|
|
139
|
+
}
|
|
140
|
+
/* Zero-out the Infima vertical-rhythm rules that target headings inside
|
|
141
|
+
.markdown so the marketing pages don't inherit doc-page spacing. */
|
|
142
|
+
main.marketing-page .markdown > :first-child,
|
|
143
|
+
main.marketing-page .markdown h1:first-child,
|
|
144
|
+
main.marketing-page .markdown h1,
|
|
145
|
+
main.marketing-page .markdown h2,
|
|
146
|
+
main.marketing-page .markdown h3,
|
|
147
|
+
main.marketing-page .markdown > * {
|
|
148
|
+
margin-top: 0;
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
/* Links underline via cobalt-200 by default; orange on hover */
|
|
152
|
+
a:not(.navbar__link):not(.footer__link-item):not(.button) {
|
|
153
|
+
text-decoration-color: var(--c-cobalt-200);
|
|
154
|
+
text-underline-offset: 2px;
|
|
155
|
+
}
|
|
156
|
+
a:not(.navbar__link):not(.footer__link-item):not(.button):hover {
|
|
157
|
+
text-decoration-color: var(--c-orange-knvb);
|
|
158
|
+
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Conduction brand tokens, mirrored for Docusaurus consumers.
|
|
3
|
+
*
|
|
4
|
+
* Re-exports the canonical tokens from ../../tokens.css so a Docusaurus
|
|
5
|
+
* site picking up the preset gets the same palette, typography, and hex
|
|
6
|
+
* clip-paths as the design-system kit.
|
|
7
|
+
*
|
|
8
|
+
* When the preset is published to npm, this file becomes the bundled
|
|
9
|
+
* copy; until then it imports relatively from the workspace.
|
|
10
|
+
*/
|
|
11
|
+
@import url("../../../tokens.css");
|
|
12
|
+
@import url("../../../typography.css");
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @conduction/docusaurus-preset/data
|
|
3
|
+
*
|
|
4
|
+
* Build-time access to the ConductionNL app-download stats. The JSON
|
|
5
|
+
* itself is refreshed every weekday by .github/workflows/app-downloads.yml
|
|
6
|
+
* and committed to design-system/data/app-downloads.json.
|
|
7
|
+
*
|
|
8
|
+
* Usage in MDX:
|
|
9
|
+
*
|
|
10
|
+
* import {totalDownloads, downloadsForApp} from '@conduction/docusaurus-preset/data';
|
|
11
|
+
*
|
|
12
|
+
* <StatsStrip stats={[
|
|
13
|
+
* {value: totalDownloads.toLocaleString('en'), label: 'app store downloads'},
|
|
14
|
+
* ...
|
|
15
|
+
* ]} />
|
|
16
|
+
*
|
|
17
|
+
* <DetailHero appId="openregister" ... /> // looks up downloads automatically
|
|
18
|
+
*/
|
|
19
|
+
|
|
20
|
+
import data from '../../../data/app-downloads.json';
|
|
21
|
+
|
|
22
|
+
export default data;
|
|
23
|
+
|
|
24
|
+
export const totalDownloads = data.totals.downloads;
|
|
25
|
+
export const appsTotal = data.totals.apps_total;
|
|
26
|
+
export const appsInStore = data.totals.apps_in_store;
|
|
27
|
+
export const generatedAt = data.generated_at;
|
|
28
|
+
|
|
29
|
+
const byId = new Map(data.apps.map((a) => [a.id, a]));
|
|
30
|
+
|
|
31
|
+
export function appStats(appId) {
|
|
32
|
+
return byId.get(appId) || null;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
export function downloadsForApp(appId) {
|
|
36
|
+
const app = byId.get(appId);
|
|
37
|
+
return app && app.github ? app.github.downloads : 0;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
export function formatDownloads(n, locale = 'en') {
|
|
41
|
+
return Number(n || 0).toLocaleString(locale);
|
|
42
|
+
}
|