@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,73 @@
1
+ /**
2
+ * <WidgetShelf /> styles. Header + responsive grid of widget-preview
3
+ * cards. Each card has a tinted panel containing the widget mock,
4
+ * with title + description below.
5
+ */
6
+
7
+ .shelf {
8
+ max-width: 1280px;
9
+ margin: 0 auto;
10
+ padding: var(--space-12) var(--space-12);
11
+ font-family: var(--conduction-typography-font-family-body);
12
+ }
13
+
14
+ .head { max-width: 70ch; margin: 0 0 var(--space-8); }
15
+ .eyebrow {
16
+ display: inline-flex; align-items: center; gap: var(--space-2);
17
+ font-family: var(--conduction-typography-font-family-code);
18
+ font-size: 12px; letter-spacing: 0.1em; text-transform: uppercase;
19
+ color: var(--c-orange-knvb);
20
+ margin-bottom: var(--space-3);
21
+ }
22
+ .eyebrow .h { width: 10px; height: 12px; clip-path: var(--hex-pointy-top); background: var(--c-orange-knvb); }
23
+ .title {
24
+ font-size: 36px; font-weight: 700; letter-spacing: -0.02em;
25
+ line-height: 1.1; color: var(--c-cobalt-900); margin: 0 0 var(--space-3);
26
+ }
27
+ .lede { font-size: 17px; line-height: 1.5; color: var(--c-cobalt-700); margin: 0; }
28
+
29
+ .grid {
30
+ display: grid;
31
+ gap: var(--space-5);
32
+ }
33
+ .cols-2 { grid-template-columns: repeat(2, 1fr); }
34
+ .cols-3 { grid-template-columns: repeat(3, 1fr); }
35
+ @media (max-width: 900px) { .grid { grid-template-columns: 1fr; } }
36
+
37
+ .card {
38
+ background: white;
39
+ border: 1px solid var(--c-cobalt-100);
40
+ border-radius: var(--radius-lg);
41
+ overflow: hidden;
42
+ display: flex;
43
+ flex-direction: column;
44
+ }
45
+
46
+ .panel {
47
+ background: var(--c-cobalt-50);
48
+ padding: var(--space-5);
49
+ min-height: 180px;
50
+ display: flex;
51
+ align-items: center;
52
+ justify-content: center;
53
+ }
54
+ /* Widget mocks (.w, .w-*) get a max-width so they don't stretch
55
+ awkwardly inside the card. */
56
+ .panel > * { width: 100%; max-width: 280px; }
57
+
58
+ .cardTitle {
59
+ font-size: 18px;
60
+ font-weight: 600;
61
+ letter-spacing: -0.005em;
62
+ color: var(--c-cobalt-900);
63
+ margin: 0;
64
+ padding: var(--space-4) var(--space-5) 0;
65
+ }
66
+
67
+ .cardDesc {
68
+ font-size: 14px;
69
+ line-height: 1.55;
70
+ color: var(--c-cobalt-700);
71
+ margin: 0;
72
+ padding: var(--space-2) var(--space-5) var(--space-5);
73
+ }
@@ -0,0 +1,96 @@
1
+ /**
2
+ * @conduction/docusaurus-preset/components
3
+ *
4
+ * Public React components for use in MDX, JSX pages, and theme
5
+ * swizzles. Each component mirrors a section in the design-system
6
+ * kit (preview/components/<name>.html) so the visual is the source
7
+ * of truth and the React code follows.
8
+ *
9
+ * Usage in MDX:
10
+ *
11
+ * import { Hero, StatsStrip, CtaBanner } from '@conduction/docusaurus-preset/components';
12
+ *
13
+ * <Hero
14
+ * eyebrow="Twelve open-source apps · one Nextcloud"
15
+ * title="Install your stack."
16
+ * subtitle="In two minutes."
17
+ * primaryCta={{label: "Install from Nextcloud app store"}}
18
+ * />
19
+ *
20
+ * <StatsStrip stats={[{value: '24', label: 'apps'}, ...]} />
21
+ *
22
+ * <CtaBanner title="Ready to install?" />
23
+ */
24
+
25
+ /* Atomic primitives, also exported as their own subpath for direct
26
+ `import {HexBullet} from '@conduction/docusaurus-preset/components/primitives';`
27
+ imports if a site only needs the atoms. */
28
+ export * from './primitives';
29
+
30
+ export {default as Hero} from './Hero/Hero.jsx';
31
+ export {default as StatsStrip} from './StatsStrip/StatsStrip.jsx';
32
+ export {default as CtaBanner} from './CtaBanner/CtaBanner.jsx';
33
+ export {default as PlatformOverview} from './PlatformOverview/PlatformOverview.jsx';
34
+ export {default as AppsPreview, AppCard} from './AppsPreview/AppsPreview.jsx';
35
+
36
+ /* Card-family components (Batch 2). Each pairs with a *Grid sibling
37
+ that handles the surrounding layout, so callers can drop a row
38
+ of cards in MDX with a single import. */
39
+ export {default as SolutionCard, SolutionGrid} from './SolutionCard/SolutionCard.jsx';
40
+ export {default as PartnerCard, PartnerGrid, BecomePartner} from './PartnerCard/PartnerCard.jsx';
41
+ export {default as PartnerDirectory} from './PartnerDirectory/PartnerDirectory.jsx';
42
+ export {default as PartnerSidecard} from './PartnerSidecard/PartnerSidecard.jsx';
43
+ export {default as ManagedCommonGround} from './ManagedCommonGround/ManagedCommonGround.jsx';
44
+ export {default as Clients, DEFAULT_CLIENTS, DEFAULT_PARTNERS} from './Clients/Clients.jsx';
45
+ export {default as ReferenceCard, ReferenceGrid} from './ReferenceCard/ReferenceCard.jsx';
46
+ export {default as PairCard, PairRow} from './PairCard/PairCard.jsx';
47
+ export {default as FeatureList, FeatureItem} from './FeatureList/FeatureList.jsx';
48
+ export {default as HowSteps, HowStep} from './HowSteps/HowSteps.jsx';
49
+ export {default as FAQ, FAQItem} from './FAQ/FAQ.jsx';
50
+ export {default as EmployeeCard, TeamGrid} from './EmployeeCard/EmployeeCard.jsx';
51
+ export {default as DetailHero} from './DetailHero/DetailHero.jsx';
52
+ export {default as ConductionBg} from './ConductionBg/ConductionBg.jsx';
53
+ export {default as PlatformDiagram} from './PlatformDiagram/PlatformDiagram.jsx';
54
+ export {default as HexRain} from './HexRain/HexRain.jsx';
55
+ export {default as Pipeline, PipelineStep, IconList} from './Pipeline/Pipeline.jsx';
56
+ export {default as FacetedFilters, FilterChip} from './FacetedFilters/FacetedFilters.jsx';
57
+ export {default as CookieCli} from './CookieCli/CookieCli.jsx';
58
+ export {default as GameModal} from './GameModal/GameModal.jsx';
59
+
60
+ /* Diagram-set web-component React wrappers (cn-hex, cn-hex-prism,
61
+ cn-platform, cn-domain-tree, cn-pipeline, cn-side-box, cn-honeycomb-bg).
62
+ Type-checked, autocompletable React surface for the framework-agnostic
63
+ diagram set in @conduction/diagrams. The bare web components still
64
+ work in plain HTML; the wrappers are the React-friendly version. */
65
+ export {Hex, HexPrism, Platform, DomainTree, DiagramPipeline, SideBox, HoneycombBg} from './Diagrams/Diagrams.jsx';
66
+ export {default as ComposeBlock} from './ComposeBlock/ComposeBlock.jsx';
67
+ export {default as AppsGrid} from './AppsGrid/AppsGrid.jsx';
68
+ export {default as AppMock} from './AppMock/AppMock.jsx';
69
+ export {default as HexNetwork} from './HexNetwork/HexNetwork.jsx';
70
+ export {default as Showcase} from './Showcase/Showcase.jsx';
71
+ export {default as RotatingCards} from './RotatingCards/RotatingCards.jsx';
72
+ export {default as HexBackground} from './HexBackground/HexBackground.jsx';
73
+ export {default as AgentTrace} from './AgentTrace/AgentTrace.jsx';
74
+ export {default as ExternalAppShelf} from './ExternalAppShelf/ExternalAppShelf.jsx';
75
+ export {default as WidgetShelf} from './WidgetShelf/WidgetShelf.jsx';
76
+ export {default as FeatureGrid, FeatureGridGroup, FeatureItem as FeatureGridItem} from './FeatureGrid/FeatureGrid.jsx';
77
+
78
+ /* Academy components (Batch 4). Card-and-chrome patterns for
79
+ academy.conduction.nl: a single feed of blogs, guides, case studies,
80
+ webinars, and tutorials. Content is MDX with a `contentType:`
81
+ frontmatter. The taxonomy lives in ContentTypeFilter/contentTypes.js
82
+ and is mirrored as JSON Schema in /schemas/academy/content.schema.json. */
83
+ export {default as ContentCard, ContentCardGrid} from './ContentCard/ContentCard.jsx';
84
+ export {default as FeaturedCard} from './FeaturedCard/FeaturedCard.jsx';
85
+ export {
86
+ default as ContentTypeFilter,
87
+ CONTENT_TYPES,
88
+ CONTENT_TYPE_PLURAL_LABELS,
89
+ } from './ContentTypeFilter/ContentTypeFilter.jsx';
90
+ export {
91
+ CONTENT_TYPE_LABELS,
92
+ CONTENT_TYPE_BULLET_COLOR,
93
+ } from './ContentTypeFilter/contentTypes.js';
94
+ export {default as NewsletterCta} from './NewsletterCta/NewsletterCta.jsx';
95
+ export {default as RelatedPosts} from './RelatedPosts/RelatedPosts.jsx';
96
+ export {default as ContentDetailHero} from './ContentDetailHero/ContentDetailHero.jsx';
@@ -0,0 +1,85 @@
1
+ /**
2
+ * <AuthorByline />
3
+ *
4
+ * The author + date line that appears on every academy card and at the
5
+ * top of every content detail page. Avatar circle (initials or photo)
6
+ * + name + bullet separator + formatted date.
7
+ *
8
+ * Mirrors the meta line in the academy "Keep learning…" cards and the
9
+ * header byline on detail pages.
10
+ *
11
+ * Usage:
12
+ *
13
+ * <AuthorByline name="Ruben van der Linde" date="2026-05-05" />
14
+ *
15
+ * <AuthorByline
16
+ * name="Mike Goldsmith"
17
+ * date="2026-05-04"
18
+ * avatarSrc="/img/team/mike.jpg"
19
+ * locale="en"
20
+ * />
21
+ *
22
+ * The component derives initials from the name when no avatarSrc is
23
+ * provided. Date is formatted with `Intl.DateTimeFormat(locale, {
24
+ * day: 'numeric', month: 'long', year: 'numeric' })`. Pass a
25
+ * pre-formatted string in `dateLabel` to override.
26
+ */
27
+
28
+ import React from 'react';
29
+ import styles from './AuthorByline.module.css';
30
+
31
+ function initialsFor(name) {
32
+ if (!name) return '';
33
+ const parts = name.trim().split(/\s+/);
34
+ if (parts.length === 1) return parts[0].slice(0, 2).toUpperCase();
35
+ return (parts[0][0] + parts[parts.length - 1][0]).toUpperCase();
36
+ }
37
+
38
+ function formatDate(date, locale) {
39
+ if (!date) return '';
40
+ const d = date instanceof Date ? date : new Date(date);
41
+ if (Number.isNaN(d.getTime())) return String(date);
42
+ try {
43
+ return new Intl.DateTimeFormat(locale || 'nl-NL', {
44
+ day: 'numeric',
45
+ month: 'long',
46
+ year: 'numeric',
47
+ }).format(d);
48
+ } catch (_) {
49
+ return d.toISOString().slice(0, 10);
50
+ }
51
+ }
52
+
53
+ export default function AuthorByline({
54
+ name,
55
+ date,
56
+ dateLabel,
57
+ avatarSrc,
58
+ initials,
59
+ locale,
60
+ tone = 'default',
61
+ className,
62
+ ...rest
63
+ }) {
64
+ const composed = [
65
+ styles.byline,
66
+ styles['tone-' + tone],
67
+ className,
68
+ ].filter(Boolean).join(' ');
69
+
70
+ const computedInitials = initials || initialsFor(name);
71
+ const formattedDate = dateLabel || formatDate(date, locale);
72
+
73
+ return (
74
+ <span className={composed} {...rest}>
75
+ <span className={styles.avatar} aria-hidden="true">
76
+ {avatarSrc
77
+ ? <img src={avatarSrc} alt="" />
78
+ : computedInitials}
79
+ </span>
80
+ {name && <span className={styles.name}>{name}</span>}
81
+ {name && formattedDate && <span className={styles.sep}>·</span>}
82
+ {formattedDate && <span className={styles.date}>{formattedDate}</span>}
83
+ </span>
84
+ );
85
+ }
@@ -0,0 +1,57 @@
1
+ /**
2
+ * <AuthorByline /> styles. The compact author + date line used on
3
+ * cards and detail headers.
4
+ */
5
+
6
+ .byline {
7
+ display: inline-flex;
8
+ align-items: center;
9
+ gap: 8px;
10
+ font-family: var(--conduction-typography-font-family-code);
11
+ font-size: 12px;
12
+ letter-spacing: 0.04em;
13
+ }
14
+
15
+ .avatar {
16
+ width: 24px;
17
+ height: 24px;
18
+ border-radius: 50%;
19
+ background: var(--c-cobalt-100);
20
+ color: var(--c-cobalt-700);
21
+ display: inline-flex;
22
+ align-items: center;
23
+ justify-content: center;
24
+ font-size: 10px;
25
+ font-weight: 600;
26
+ text-transform: uppercase;
27
+ flex-shrink: 0;
28
+ overflow: hidden;
29
+ }
30
+ .avatar img {
31
+ width: 100%;
32
+ height: 100%;
33
+ object-fit: cover;
34
+ }
35
+
36
+ .name { font-weight: 500; }
37
+
38
+ .sep { opacity: 0.6; }
39
+
40
+ .date { }
41
+
42
+ /* Tones for placement on different grounds. */
43
+ .tone-default .name { color: var(--c-cobalt-700); }
44
+ .tone-default .date,
45
+ .tone-default .sep,
46
+ .tone-default { color: var(--c-cobalt-400); }
47
+
48
+ .tone-on-dark .name { color: white; }
49
+ .tone-on-dark .date,
50
+ .tone-on-dark .sep,
51
+ .tone-on-dark { color: var(--c-cobalt-200); }
52
+ .tone-on-dark .avatar { background: var(--c-cobalt-700); color: white; }
53
+
54
+ .tone-muted .name { color: var(--c-cobalt-700); }
55
+ .tone-muted .date,
56
+ .tone-muted .sep,
57
+ .tone-muted { color: var(--c-cobalt-300); }
@@ -0,0 +1,71 @@
1
+ /**
2
+ * Brand-citation primitives: <NextBlue/>, <CgYellow/>, <KnvbOrange/>,
3
+ * <CommonGroundPlus/>.
4
+ *
5
+ * Thin wrappers around the brand-citation classes from css/brand.css.
6
+ * They render an inline <span> with the right colour for the brand
7
+ * they cite, so consumers don't have to remember the global class name
8
+ * (or which colour goes with which brand).
9
+ *
10
+ * The classes still ship as plain global CSS in brand.css so the
11
+ * preview pages and any plain HTML can use them directly. These
12
+ * components are the type-checked, autocompletable React surface.
13
+ *
14
+ * Usage in MDX:
15
+ *
16
+ * import {NextBlue, CgYellow, KnvbOrange, CommonGroundPlus} from '@conduction/docusaurus-preset/components';
17
+ *
18
+ * Twelve apps · one <NextBlue>Nextcloud</NextBlue> workspace.
19
+ * Built on <CgYellow>Common Ground</CgYellow> with one <KnvbOrange>orange</KnvbOrange> accent.
20
+ * The productized offering is <CommonGroundPlus/>.
21
+ *
22
+ * Per huisstijl:
23
+ * - <NextBlue> cites Nextcloud (the platform); colour --c-nextcloud-blue
24
+ * - <CgYellow> cites Common Ground (the ecosystem); colour --c-commonground-yellow
25
+ * - <KnvbOrange> KNVB-orange highlight; colour --c-orange-knvb
26
+ * - <CommonGroundPlus> the Common Ground+ brand mark, tri-colour: "Common"
27
+ * in Conduction cobalt, "Ground" in CG-yellow, "+" in
28
+ * Nextcloud blue. Use this for product-brand surfaces
29
+ * (navbar wordmark, hero eyebrow, doors). For editorial
30
+ * references to the official Dutch Common Ground
31
+ * ecosystem, use <CgYellow>Common Ground</CgYellow>.
32
+ *
33
+ * One orange per screen: KnvbOrange should be reserved for highlights,
34
+ * never primary fills, per the design-system rule.
35
+ */
36
+
37
+ import React from 'react';
38
+
39
+ export function NextBlue({as: Tag = 'span', children, className, ...rest}) {
40
+ return (
41
+ <Tag className={['next-blue', className].filter(Boolean).join(' ')} {...rest}>
42
+ {children}
43
+ </Tag>
44
+ );
45
+ }
46
+
47
+ export function CgYellow({as: Tag = 'span', children, className, ...rest}) {
48
+ return (
49
+ <Tag className={['cg-yellow', className].filter(Boolean).join(' ')} {...rest}>
50
+ {children}
51
+ </Tag>
52
+ );
53
+ }
54
+
55
+ export function KnvbOrange({as: Tag = 'span', children, className, ...rest}) {
56
+ return (
57
+ <Tag className={['knvb-orange', className].filter(Boolean).join(' ')} {...rest}>
58
+ {children}
59
+ </Tag>
60
+ );
61
+ }
62
+
63
+ export function CommonGroundPlus({as: Tag = 'span', className, ...rest}) {
64
+ return (
65
+ <Tag className={['cg-plus', className].filter(Boolean).join(' ')} {...rest}>
66
+ <span className="cg-plus-common">Common</span>{' '}
67
+ <span className="cg-yellow">Ground</span>
68
+ <span className="cg-plus-plus">+</span>
69
+ </Tag>
70
+ );
71
+ }
@@ -0,0 +1,46 @@
1
+ /**
2
+ * <Button />
3
+ *
4
+ * Three brand variants (primary / secondary / ghost) used across hero,
5
+ * cta-banner, top-navbar, game-modal, and per-page CTA rows.
6
+ *
7
+ * Renders as <a> when href is provided, <button> otherwise. Inherits
8
+ * the brand transition (140ms ease) and KNVB-orange focus ring from
9
+ * brand.css.
10
+ *
11
+ * Variants:
12
+ * - primary: cobalt fill, white text
13
+ * - secondary: white bg, cobalt-200 border, cobalt text
14
+ * - ghost: plain text + arrow
15
+ * - on-dark: primary variant inverted for use inside cobalt CTA panels
16
+ *
17
+ * Usage:
18
+ *
19
+ * <Button href="/apps">Install</Button>
20
+ * <Button variant="secondary" href="/partners">Get a demo</Button>
21
+ * <Button variant="ghost" href="https://github.com/...">View on GitHub →</Button>
22
+ */
23
+
24
+ import React from 'react';
25
+ import styles from './Button.module.css';
26
+
27
+ export default function Button({
28
+ variant = 'primary',
29
+ href,
30
+ size = 'md',
31
+ className,
32
+ children,
33
+ ...rest
34
+ }) {
35
+ const composed = [
36
+ styles.btn,
37
+ styles['v-' + variant],
38
+ styles['s-' + size],
39
+ className,
40
+ ].filter(Boolean).join(' ');
41
+
42
+ if (href) {
43
+ return <a href={href} className={composed} {...rest}>{children}</a>;
44
+ }
45
+ return <button type="button" className={composed} {...rest}>{children}</button>;
46
+ }
@@ -0,0 +1,88 @@
1
+ /**
2
+ * <Button /> styles. Mirrors btn-primary / btn-secondary / btn-ghost
3
+ * rules duplicated in hero.html, top-navbar.html, platform-overview.html,
4
+ * cta-banner block, app-detail header.
5
+ */
6
+
7
+ .btn {
8
+ display: inline-flex;
9
+ align-items: center;
10
+ gap: 8px;
11
+ border: 1px solid transparent;
12
+ border-radius: var(--radius-md);
13
+ font-weight: 500;
14
+ text-decoration: none;
15
+ transition: background 140ms ease, border-color 140ms ease, color 140ms ease;
16
+ cursor: pointer;
17
+ font-family: inherit;
18
+ }
19
+
20
+ .s-sm { padding: 9px 14px; font-size: 13px; }
21
+ .s-md { padding: 13px 22px; font-size: 15px; }
22
+ .s-lg { padding: 16px 28px; font-size: 16px; }
23
+
24
+ .v-primary {
25
+ background: var(--c-blue-cobalt);
26
+ color: white;
27
+ border-color: var(--c-blue-cobalt);
28
+ }
29
+ .v-primary:hover {
30
+ background: var(--c-cobalt-700);
31
+ border-color: var(--c-cobalt-700);
32
+ color: white;
33
+ text-decoration: none;
34
+ }
35
+
36
+ .v-secondary {
37
+ background: white;
38
+ color: var(--c-blue-cobalt);
39
+ border-color: var(--c-cobalt-200);
40
+ }
41
+ .v-secondary:hover {
42
+ border-color: var(--c-blue-cobalt);
43
+ color: var(--c-blue-cobalt);
44
+ background: white;
45
+ text-decoration: none;
46
+ }
47
+
48
+ .v-ghost {
49
+ background: transparent;
50
+ color: var(--c-cobalt-700);
51
+ padding-inline: 4px;
52
+ font-size: 14px;
53
+ }
54
+ .v-ghost:hover {
55
+ color: var(--c-orange-knvb);
56
+ background: transparent;
57
+ text-decoration: none;
58
+ }
59
+
60
+ /* For use inside cobalt CTA panels (inverse surfaces) */
61
+ .v-on-dark-primary {
62
+ background: white;
63
+ color: var(--c-blue-cobalt);
64
+ border-color: white;
65
+ text-transform: uppercase;
66
+ letter-spacing: 0.04em;
67
+ font-size: 14px;
68
+ font-weight: 600;
69
+ }
70
+ .v-on-dark-primary:hover { opacity: 0.92; color: var(--c-blue-cobalt); }
71
+
72
+ .v-on-dark-secondary {
73
+ background: transparent;
74
+ color: white;
75
+ border-color: rgba(255, 255, 255, 0.4);
76
+ text-transform: uppercase;
77
+ letter-spacing: 0.04em;
78
+ font-size: 14px;
79
+ font-weight: 600;
80
+ }
81
+ .v-on-dark-secondary:hover {
82
+ background: rgba(255, 255, 255, 0.08);
83
+ border-color: white;
84
+ color: white;
85
+ }
86
+
87
+ .v-on-dark-primary :global(.next-blue),
88
+ .v-primary :global(.next-blue) { color: var(--c-nextcloud-cyan); }
@@ -0,0 +1,42 @@
1
+ /**
2
+ * <Card />
3
+ *
4
+ * The white container with cobalt-100 border, radius-lg corners, and
5
+ * 20-28px internal padding that recurs in pair-cards.html, solution-
6
+ * cards.html, reference-cards.html, partner-cards.html, employee-
7
+ * cards.html, apps-grid.html.
8
+ *
9
+ * Variants:
10
+ * - tone="surface" (default) white bg, cobalt-100 border
11
+ * - tone="ghost" transparent bg, cobalt-100 dashed border
12
+ * - tone="inverse" cobalt-900 bg, white type
13
+ *
14
+ * Renders as <a> when href is provided (so cards are clickable
15
+ * affordances without nested-link issues).
16
+ */
17
+
18
+ import React from 'react';
19
+ import styles from './Card.module.css';
20
+
21
+ export default function Card({
22
+ tone = 'surface',
23
+ href,
24
+ to,
25
+ padding = 'md',
26
+ className,
27
+ children,
28
+ ...rest
29
+ }) {
30
+ const composed = [
31
+ styles.card,
32
+ styles['tone-' + tone],
33
+ styles['pad-' + padding],
34
+ href || to ? styles.link : null,
35
+ className,
36
+ ].filter(Boolean).join(' ');
37
+
38
+ if (href) {
39
+ return <a href={href} className={composed} {...rest}>{children}</a>;
40
+ }
41
+ return <div className={composed} {...rest}>{children}</div>;
42
+ }
@@ -0,0 +1,42 @@
1
+ /**
2
+ * <Card /> styles. Recurring shape across six component files.
3
+ */
4
+
5
+ .card {
6
+ position: relative;
7
+ border-radius: var(--radius-lg);
8
+ border: 1px solid var(--c-cobalt-100);
9
+ background: white;
10
+ transition: border-color 140ms ease, transform 140ms ease, box-shadow 140ms ease;
11
+ font-family: var(--conduction-typography-font-family-body);
12
+ color: var(--c-cobalt-700);
13
+ }
14
+
15
+ .tone-surface { background: white; }
16
+ .tone-ghost {
17
+ background: transparent;
18
+ border-style: dashed;
19
+ border-color: var(--c-cobalt-200);
20
+ }
21
+ .tone-inverse {
22
+ background: var(--c-cobalt-900);
23
+ color: white;
24
+ border-color: var(--c-cobalt-700);
25
+ }
26
+
27
+ .pad-sm { padding: 16px; }
28
+ .pad-md { padding: 20px; }
29
+ .pad-lg { padding: 28px; }
30
+ .pad-xl { padding: 32px; }
31
+
32
+ .link {
33
+ text-decoration: none;
34
+ color: inherit;
35
+ cursor: pointer;
36
+ display: block;
37
+ }
38
+ .link:hover {
39
+ border-color: var(--c-blue-cobalt);
40
+ text-decoration: none;
41
+ color: inherit;
42
+ }
@@ -0,0 +1,37 @@
1
+ /**
2
+ * <Eyebrow />
3
+ *
4
+ * Uppercase Plex Mono caption sitting above section headings.
5
+ * - 12px, letter-spacing 0.1em, --c-cobalt-400
6
+ * - Optional leading <HexBullet/> in KNVB orange
7
+ *
8
+ * Mirrors the .eyebrow rule duplicated across hero.html, platform-
9
+ * overview.html, pipeline-flow.html, feature-grid.html, apps-grid.css,
10
+ * employee-cards.css. The 6+ duplications pay for the extraction.
11
+ *
12
+ * Usage in MDX:
13
+ *
14
+ * <Eyebrow>The platform</Eyebrow>
15
+ * <Eyebrow bullet={false}>No bullet</Eyebrow>
16
+ * <Eyebrow as="span">Inline variant</Eyebrow>
17
+ */
18
+
19
+ import React from 'react';
20
+ import HexBullet from './HexBullet';
21
+ import styles from './Eyebrow.module.css';
22
+
23
+ export default function Eyebrow({
24
+ bullet = true,
25
+ bulletColor,
26
+ as: Tag = 'div',
27
+ className,
28
+ children,
29
+ ...rest
30
+ }) {
31
+ return (
32
+ <Tag className={[styles.eyebrow, className].filter(Boolean).join(' ')} {...rest}>
33
+ {bullet && <HexBullet size="md" color={bulletColor} />}
34
+ <span className={styles.label}>{children}</span>
35
+ </Tag>
36
+ );
37
+ }
@@ -0,0 +1,19 @@
1
+ /**
2
+ * <Eyebrow /> styles. Mirrors .eyebrow rules in hero.html, platform-
3
+ * overview.html, pipeline-flow.html, feature-grid.html, apps-grid.css.
4
+ */
5
+
6
+ .eyebrow {
7
+ display: inline-flex;
8
+ align-items: center;
9
+ gap: 10px;
10
+ font-family: var(--conduction-typography-font-family-code);
11
+ font-size: 12px;
12
+ letter-spacing: 0.1em;
13
+ text-transform: uppercase;
14
+ color: var(--c-cobalt-400);
15
+ margin-bottom: 24px;
16
+ }
17
+
18
+ .label :global(.next-blue) { color: var(--c-nextcloud-blue); }
19
+ .label :global(.cg-yellow) { color: var(--c-commonground-yellow); }