@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,109 @@
|
|
|
1
|
+
# Component coverage map
|
|
2
|
+
|
|
3
|
+
Tracks which `preview/components/*.html` patterns ship as React components in
|
|
4
|
+
`@conduction/docusaurus-preset`. Started as a gap list during the connext landing
|
|
5
|
+
port; now reads as a coverage map. Anything still missing lives in **Open gaps**
|
|
6
|
+
at the bottom.
|
|
7
|
+
|
|
8
|
+
> Last refreshed 2026-05-06 against `src/components/index.js` and the static kit.
|
|
9
|
+
|
|
10
|
+
## Atomic primitives
|
|
11
|
+
|
|
12
|
+
Every higher-level component composes from these. Each one was extracted when
|
|
13
|
+
its CSS rule appeared in three or more component files.
|
|
14
|
+
|
|
15
|
+
- **HexBullet** — `primitives/HexBullet.jsx`. Three sizes (sm 8×9, md 12×14, lg 44×50) of the pointy-top clip-path hex. Used in eyebrows, pill bullets, status badges, footer triad.
|
|
16
|
+
- **HexThumbnail** — `primitives/HexThumbnail.jsx`. Single pointy-top hex tile holding an icon, photo (clip-path masked), or illustration. Four sizes (sm 56×64, md 88×100, lg 160×184, xl 240×280), six tones. Used by every academy card and hero.
|
|
17
|
+
- **AuthorByline** — `primitives/AuthorByline.jsx`. Avatar (initials or photo) + name + bullet separator + formatted date. Three tones (default, on-dark, muted). Used on every academy card and detail page.
|
|
18
|
+
- **Eyebrow** — `primitives/Eyebrow.jsx`. Uppercase Plex Mono caption with optional leading HexBullet.
|
|
19
|
+
- **Section** — `primitives/Section.jsx`. The 1280px-max wrapper. Background variants (default, tinted, inverse), spacing variants (default, tight, flush).
|
|
20
|
+
- **SectionHead** — `primitives/SectionHead.jsx`. Eyebrow + h2 + lede. Two layouts (split 1.1fr/1fr; stack centred).
|
|
21
|
+
- **Card** — `primitives/Card.jsx`. White / cobalt-100 / radius-lg. Tones: surface (default), ghost (dashed), inverse (cobalt-900).
|
|
22
|
+
- **Pill** — `primitives/Pill.jsx`. Mono-caps chip with optional bullet. Status badges, app tags, sector labels.
|
|
23
|
+
- **Button** — `primitives/Button.jsx`. Primary / secondary / ghost + on-dark variants for cobalt CTA panels.
|
|
24
|
+
- **NextBlue / CgYellow / KnvbOrange / CommonGroundPlus** — `primitives/BrandCitation.jsx`. Type-checked wrappers around the global `next-blue` / `cg-yellow` / `knvb-orange` / `commonground-plus` CSS classes. Replaces ad-hoc `<span className="next-blue">Nextcloud</span>` with `<NextBlue>Nextcloud</NextBlue>`.
|
|
25
|
+
|
|
26
|
+
## Composite components
|
|
27
|
+
|
|
28
|
+
Most consume one or more primitives.
|
|
29
|
+
|
|
30
|
+
- **Hero** — `Hero/Hero.jsx`. Two-column landing hero. Composes Eyebrow + Button.
|
|
31
|
+
- **StatsStrip** — `StatsStrip/StatsStrip.jsx`. Four-up cobalt-50 stats band.
|
|
32
|
+
- **CtaBanner** — `CtaBanner/CtaBanner.jsx`. Cobalt CTA panel. Composes ConductionBg + on-dark Button.
|
|
33
|
+
- **PlatformOverview** — `PlatformOverview/PlatformOverview.jsx`. Section-head + diagram wrapper.
|
|
34
|
+
- **PlatformDiagram** — `PlatformDiagram/PlatformDiagram.jsx`. Typed wrapper around the bespoke `<platform-diagram>` web component. Pass workspace + lists + flows as data. Reveals on scroll via `--pd-list-progress` / `--pd-hex-progress` CSS variables.
|
|
35
|
+
- **AppsPreview / AppCard** — `AppsPreview/AppsPreview.jsx`. Static 3-up apps grid. Composes SectionHead + HexBullet.
|
|
36
|
+
- **AppsGrid** — `AppsGrid/AppsGrid.jsx`. Filterable apps catalogue with category chips. Reuses AppCard.
|
|
37
|
+
- **SolutionCard / SolutionGrid** — `SolutionCard/SolutionCard.jsx`. Sector-tinted solution cards. Composes Pill.
|
|
38
|
+
- **PartnerCard / PartnerGrid / BecomePartner** — `PartnerCard/PartnerCard.jsx`. Three tiers (partner, certified, strategic). Plus `variant="other"` for the compact mini-avatar card used on partner-detail pages.
|
|
39
|
+
- **PartnerDirectory** — `PartnerDirectory/PartnerDirectory.jsx`. Self-contained faceted directory used on `/partners` and embedded on the homepage. Internally derives facets from the partner data; pair with a `becomePartner` object for the trailing CTA card. No dedicated static-kit specimen — composed from PartnerCard + FacetedFilters.
|
|
40
|
+
- **PartnerSidecard** — `PartnerSidecard/PartnerSidecard.jsx`. Sticky right rail used inside partner-detail pages. Holds the tier credential, "apps they ship", and "solutions they deliver". Bleeds into the Specialties section without wrapping the page.
|
|
41
|
+
- **ManagedCommonGround** — `ManagedCommonGround/ManagedCommonGround.jsx`. Yellow-themed managed-stack panel used on `/commonground` and `/support`. Component-list + price line + dual CTA. No dedicated static-kit specimen.
|
|
42
|
+
- **Clients** (+ `DEFAULT_CLIENTS`, `DEFAULT_PARTNERS`) — `Clients/Clients.jsx`. Three-row right-to-left honeycomb marquee with grayscale-to-colour hover, lane-pause-on-hover, and `prefers-reduced-motion` respect. Specimen: `preview/components/clients-marquee.html`.
|
|
43
|
+
- **ReferenceCard / ReferenceGrid** — `ReferenceCard/ReferenceCard.jsx`. Customer-reference cards on partner-detail pages.
|
|
44
|
+
- **PairCard / PairRow** — `PairCard/PairCard.jsx`. Compact "related item" cards on app- and solution-detail pages.
|
|
45
|
+
- **EmployeeCard / TeamGrid** — `EmployeeCard/EmployeeCard.jsx`. Three variants (compact, photo, detail) for the /about team grid.
|
|
46
|
+
- **FeatureList / FeatureItem** — `FeatureList/FeatureItem.jsx`. Single-column USPs with hex glyphs. Use `items={…}` array OR `<FeatureItem>` children, not both.
|
|
47
|
+
- **FeatureGrid / FeatureGridItem / FeatureGridGroup** — `FeatureGrid/FeatureGrid.jsx`. Compact spec list with hover-tooltip and stable/beta/soon status hexes.
|
|
48
|
+
- **HowSteps / HowStep** — `HowSteps/HowSteps.jsx`. Numbered process-step row. Auto-numbers and auto-tints (cobalt → orange → cobalt-700) when `number` and `tier` are omitted.
|
|
49
|
+
- **Pipeline / PipelineStep / IconList** — `Pipeline/Pipeline.jsx`. Horizontal hex-numbered pipeline with chevron flow lines and optional source/consumer end-boxes.
|
|
50
|
+
- **DetailHero** — `DetailHero/DetailHero.jsx`. Shared 1fr/360px hero pattern between app/solution/partner detail pages. Crumb + status + version + locales + downloads badge + h1 + tagline + 3 CTAs + right-column illustration.
|
|
51
|
+
- **FacetedFilters / FilterChip** — `FacetedFilters/FacetedFilters.jsx`. Sidebar facet checkbox panel + active-chip strip.
|
|
52
|
+
- **ConductionBg** — `ConductionBg/ConductionBg.jsx`. Parallax honeycomb background. Real component with self-contained runtime hook.
|
|
53
|
+
- **HexNetwork** — `HexNetwork/HexNetwork.jsx`. Centre hex with surrounding satellites. Used on `/support` to render the partner network around Conduction.
|
|
54
|
+
- **HexBackground** — `HexBackground/HexBackground.jsx`. Hex pattern fill primitive.
|
|
55
|
+
- **HexRain** — `HexRain/HexRain.jsx`. The "twelve apps" mini-game in the hero column. Lazy-loads the runtime via Head.
|
|
56
|
+
- **GameModal** — `GameModal/GameModal.jsx`. End-of-game dialog with cross-game progress tracking. Subscribes to `connext:gameend` events.
|
|
57
|
+
- **CookieCli** — `CookieCli/CookieCli.jsx`. Terminal-styled cookie consent banner with localStorage persistence.
|
|
58
|
+
- **ComposeBlock** — `ComposeBlock/ComposeBlock.jsx`. Branded code block (cobalt-900 + Plex Mono + filename pill + copy button). For docker-compose, bash recipes, and any verbatim copy-paste content. Used on `/demo`.
|
|
59
|
+
- **AgentTrace** — `AgentTrace/AgentTrace.jsx`. Terminal-styled agent execution trace with cursor + mode chrome. Specimen: `preview/components/agent-trace.html`.
|
|
60
|
+
- **AppMock** — `AppMock/AppMock.jsx`. Selector that renders one of 16 app-specific UI mockups (DeciDesk, DocuDesk, LarpingApp, MyDash + variants, NLDesign, OpenCatalogi, OpenConnector, OpenRegister, OpenWoo, PipelinQ, Procest, SoftwareCatalog, ZaakAfhandelApp). Each variant lives under `AppMock/variants/`. Specimen: `preview/components/app-mock.html`.
|
|
61
|
+
- **ExternalAppShelf** — `ExternalAppShelf/ExternalAppShelf.jsx`. Third-party-app shelf (Outlook-style, Mattermost, Keycloak, etc.) used on `/connext`. No dedicated specimen.
|
|
62
|
+
- **WidgetShelf** — `WidgetShelf/WidgetShelf.jsx`. Widget showcase grid with eyebrow + title + lede + N-column widget cards. No dedicated specimen.
|
|
63
|
+
- **Showcase** — `Showcase/Showcase.jsx`. Multi-item collapsible showcase with screenshot + body. Used on `/commonground` for the "5-lagen model". Specimen: `preview/components/showcase.html`.
|
|
64
|
+
- **RotatingCards** — `RotatingCards/RotatingCards.jsx`. Rotating card carousel. Specimen: `preview/components/rotating-cards.html`.
|
|
65
|
+
- **FAQ / FAQItem** — `FAQ/FAQ.jsx`. Disclosure-pattern FAQ block. Used on `/support`. No dedicated specimen.
|
|
66
|
+
|
|
67
|
+
## Academy components
|
|
68
|
+
|
|
69
|
+
Card-and-chrome patterns for academy.conduction.nl. One feed of blogs, guides,
|
|
70
|
+
case studies, webinars, and tutorials, distinguished by a `contentType:`
|
|
71
|
+
frontmatter. Specimen: `preview/components/academy.html`.
|
|
72
|
+
|
|
73
|
+
- **ContentCard / ContentCardGrid** — `ContentCard/ContentCard.jsx`. The "Keep learning…" card: hex-thumb panel on the left, author byline + title + summary + tag pills on the right. Three column counts, drops to single-column under 700px. Composes HexThumbnail, AuthorByline, Pill.
|
|
74
|
+
- **FeaturedCard** — `FeaturedCard/FeaturedCard.jsx`. Cobalt-900 hero spot with body copy left and a large pointy-top hex flanked by two satellite hexes right. The single KNVB orange satellite is the page's one orange accent (override with `accent="cobalt"` if a screen already burns its orange budget).
|
|
75
|
+
- **ContentTypeFilter** — `ContentTypeFilter/ContentTypeFilter.jsx`. Top-of-page chip row driven by `?type=`. Controlled mode (`value` + `onChange`) or uncontrolled link mode (`hrefForType`). The taxonomy lives in `ContentTypeFilter/contentTypes.js` so chips, card pills, and detail-hero pills all draw from one list.
|
|
76
|
+
- **NewsletterCta** — `NewsletterCta/NewsletterCta.jsx`. Cobalt-50 (or inverse cobalt-900) panel with title, lede, email input, submit, fineprint. Form is unwired by default; pass `action` or `onSubmit` to connect it.
|
|
77
|
+
- **RelatedPosts** — `RelatedPosts/RelatedPosts.jsx`. Bottom-of-detail-page block with a "Keep learning…" heading, a "View all" pill on the right, and a content-card grid below. Accepts `items` for data-driven render or children for hand-composed.
|
|
78
|
+
- **ContentDetailHero** — `ContentDetailHero/ContentDetailHero.jsx`. Header for individual posts. Crumb, content-type chip + tags, h1, summary, author byline, optional duration, then a 16:9 cover region. Distinct from `<DetailHero/>` which is for app/solution/partner pages with a 360px right-side hex.
|
|
79
|
+
|
|
80
|
+
## Diagram-set web-component wrappers
|
|
81
|
+
|
|
82
|
+
Thin React wrappers around the framework-agnostic web components in
|
|
83
|
+
`diagrams/`. Lazy-import the runtime, type-checked observed-attribute props,
|
|
84
|
+
slot-based children pass through. All exported from `Diagrams/Diagrams.jsx`.
|
|
85
|
+
|
|
86
|
+
- **Hex** wraps `<cn-hex>` (color, size, variant, layout, interactive)
|
|
87
|
+
- **HexPrism** wraps `<cn-hex-prism>` (family, size, state)
|
|
88
|
+
- **Platform** wraps `<cn-platform>` (ground)
|
|
89
|
+
- **DomainTree** wraps `<cn-domain-tree>`
|
|
90
|
+
- **DiagramPipeline** wraps `<cn-pipeline>` (renamed from Pipeline to avoid the components/Pipeline name collision)
|
|
91
|
+
- **SideBox** wraps `<cn-side-box>`
|
|
92
|
+
- **HoneycombBg** wraps `<cn-honeycomb-bg>`
|
|
93
|
+
|
|
94
|
+
## Theme swizzles
|
|
95
|
+
|
|
96
|
+
- **Navbar** — `theme/Navbar/index.jsx`. Replaces Docusaurus's default Infima navbar. Items come from `themeConfig.navbar`. Switches the wordmark for the ConNext and Common Ground sub-brands via `theme/brand.jsx`.
|
|
97
|
+
- **Footer canal scene** — `theme/Footer/index.jsx`. Full canal scene (Amsterdam trapgevel skyline, kade with bikes/cars, cobalt canal with orange boats, brand block + link grid riding on the water). Templates injected via `dangerouslySetInnerHTML` so the runtime can `.content`-clone them. Re-hydrates on SPA route changes.
|
|
98
|
+
- **MDXPage** — `theme/MDXPage/index.jsx`. Drops the Docusaurus default `col col--8 col--offset-2` wrapper for pages with `hide_table_of_contents: true`, so marketing surfaces render full-width. Adds the `marketing-page` class on `<main>` so `brand.css` can zero-out stray top margins (no gap between navbar and hero).
|
|
99
|
+
|
|
100
|
+
## Open gaps
|
|
101
|
+
|
|
102
|
+
Three earlier gaps (PartnerCard.OtherCard variant, diagram-set web component
|
|
103
|
+
wrappers, brand-citation utilities) closed in April–May 2026 and are folded
|
|
104
|
+
into the lists above.
|
|
105
|
+
|
|
106
|
+
- **Locale switcher integration on the kit's static `landing.html`** — the top-navbar.html ships an NL/EN switcher (querystring driven), but the kit's individual pages don't yet have a translation dictionary so the switch is cosmetic on those pages. The connext site already has full Docusaurus i18n; the kit is one round of NL copy away from full parity.
|
|
107
|
+
- **Static specimen pages for composed components** — `ManagedCommonGround`, `PartnerDirectory`, `WidgetShelf`, `ExternalAppShelf`, `FAQ` ship as React but have no `preview/components/*.html` reference. They're composed from primitives that already have specimens, so the absence is reasonable, but a designer reviewing the kit can't see them outside the live site.
|
|
108
|
+
- **PartnerCard `logoAlt` prop** — accepted but never passed by any current MDX usage. Either drop or document an a11y fallback expectation.
|
|
109
|
+
- **PartnerDirectory `solutions` field** — included in `partners-catalog.js` per partner, never consumed by `<PartnerCard>` (harmless spread). Decide whether to surface (e.g. inside the card) or remove from the data.
|
package/README.md
ADDED
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
# @conduction/docusaurus-preset
|
|
2
|
+
|
|
3
|
+
Brand-default Docusaurus 3 config for Conduction sites. Tokens, theme, navbar, footer, four-locale i18n (nl / en / de / fr), all pre-wired.
|
|
4
|
+
|
|
5
|
+
## Status
|
|
6
|
+
|
|
7
|
+
Source lives inside the [design-system monorepo](https://github.com/ConductionNL/design-system); published to npm under the `@conduction` scope as a single package. Install in any product site with `npm i @conduction/docusaurus-preset`. The diagram web-component runtime (`<cn-hex>`, `<cn-platform>`, etc.) ships inside this same package under `@conduction/docusaurus-preset/diagrams` — no separate install needed.
|
|
8
|
+
|
|
9
|
+
## What it gives you
|
|
10
|
+
|
|
11
|
+
- **Brand CSS** — tokens (cobalt palette, KNVB orange, Plex Mono, hex clip-paths, Common Ground yellow) auto-applied to Docusaurus's Infima theme variables. Navbar, footer, sidebar, buttons, code blocks all inherit the brand without a single swizzle.
|
|
12
|
+
- **i18n config** — four locales pinned: NL default at the URL root, EN/DE/FR at `/en/`, `/de/`, `/fr/`. `htmlLang` per locale, `trailingSlash: true`, locale dropdown ready.
|
|
13
|
+
- **Brand-default navbar** — locale-dropdown + GitHub link. Sites override `items[]` for site-specific navigation.
|
|
14
|
+
- **Brand-default footer** — three-column link grid + Conduction-tells (KvK, BTW, address). Sites override per page or globally.
|
|
15
|
+
- **Sensible defaults** — `trailingSlash`, `onBrokenLinks: 'warn'`, `respectPrefersColorScheme`, dark-mode brand mapping.
|
|
16
|
+
|
|
17
|
+
## Usage
|
|
18
|
+
|
|
19
|
+
```js
|
|
20
|
+
// docusaurus.config.js
|
|
21
|
+
const { createConfig } = require('@conduction/docusaurus-preset');
|
|
22
|
+
|
|
23
|
+
module.exports = createConfig({
|
|
24
|
+
title: 'Conduction',
|
|
25
|
+
tagline: 'Open-source apps for the Nextcloud workspace.',
|
|
26
|
+
url: 'https://conduction.nl',
|
|
27
|
+
baseUrl: '/',
|
|
28
|
+
organizationName: 'ConductionNL',
|
|
29
|
+
projectName: 'design-system',
|
|
30
|
+
|
|
31
|
+
// Optional overrides
|
|
32
|
+
navbar: {
|
|
33
|
+
items: [
|
|
34
|
+
{ to: '/docs/intro', label: 'Docs', position: 'left' },
|
|
35
|
+
{ to: '/blog', label: 'Blog', position: 'left' },
|
|
36
|
+
// brand-default items (locale dropdown, GitHub) are merged in
|
|
37
|
+
],
|
|
38
|
+
},
|
|
39
|
+
|
|
40
|
+
// Site-specific CSS appended after brand.css
|
|
41
|
+
customCss: ['./src/css/site.css'],
|
|
42
|
+
});
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
The function returns a complete Docusaurus config with brand defaults pre-applied. Override any field by passing it in or merging after.
|
|
46
|
+
|
|
47
|
+
## API
|
|
48
|
+
|
|
49
|
+
`createConfig(opts)` — returns a Docusaurus config object.
|
|
50
|
+
|
|
51
|
+
| Option | Required | Default | Purpose |
|
|
52
|
+
| --- | --- | --- | --- |
|
|
53
|
+
| `title` | ✓ | — | Site title (also used as the navbar title and footer reference). |
|
|
54
|
+
| `tagline` | | `''` | Site tagline. |
|
|
55
|
+
| `url` | ✓ | — | Production URL, e.g. `https://connext.conduction.nl`. |
|
|
56
|
+
| `baseUrl` | | `'/'` | Path under the URL. Almost always `/` since each site has its own subdomain. |
|
|
57
|
+
| `favicon` | | `'img/favicon.svg'` | Favicon path under `static/`. |
|
|
58
|
+
| `organizationName` | | `'ConductionNL'` | GitHub org. |
|
|
59
|
+
| `projectName` | | `'design-system'` | GitHub repo. |
|
|
60
|
+
| `i18n` | | nl / en / de / fr, NL default | Override the brand-default i18n block. |
|
|
61
|
+
| `navbar` | | locale dropdown + GitHub | Merged into the brand-default navbar object. |
|
|
62
|
+
| `footer` | | three-column link grid | Replaces the brand-default footer. |
|
|
63
|
+
| `customCss` | | `[]` | Site-specific CSS, appended to `brand.css`. |
|
|
64
|
+
| `presets` | | `[['classic', …]]` | Replaces the default preset list. |
|
|
65
|
+
| `plugins` | | `[]` | Docusaurus plugins. |
|
|
66
|
+
| `themeConfig` | | `{}` | Merged into the brand-default `themeConfig`. |
|
|
67
|
+
| `editUrl` | | undefined | Edit-this-doc link. |
|
|
68
|
+
| `blog` | | enabled | Set `false` to disable the blog plugin. |
|
|
69
|
+
|
|
70
|
+
Also exported: `I18N`, `baseNavbar(siteName)`, `baseFooter()` for sites that want to compose manually.
|
|
71
|
+
|
|
72
|
+
## Brand CSS exports
|
|
73
|
+
|
|
74
|
+
| Path | Purpose |
|
|
75
|
+
| --- | --- |
|
|
76
|
+
| `@conduction/docusaurus-preset/css/brand.css` | The default. Imported by `createConfig()` automatically. |
|
|
77
|
+
| `@conduction/docusaurus-preset/css/tokens.css` | Just the tokens, no Infima mapping. Use if you swizzle the entire theme. |
|
|
78
|
+
|
|
79
|
+
## OpenCatalogi content plugin
|
|
80
|
+
|
|
81
|
+
A future `@conduction/docusaurus-plugin-opencatalogi` will pull pages from a Nextcloud OpenCatalogi register at build time. The shape:
|
|
82
|
+
|
|
83
|
+
```js
|
|
84
|
+
// docusaurus.config.js
|
|
85
|
+
module.exports = createConfig({
|
|
86
|
+
title: 'Conduction',
|
|
87
|
+
url: 'https://conduction.nl',
|
|
88
|
+
plugins: [
|
|
89
|
+
[
|
|
90
|
+
'@conduction/docusaurus-plugin-opencatalogi',
|
|
91
|
+
{
|
|
92
|
+
// Where to fetch from (production: a public read-only API; local: localhost)
|
|
93
|
+
apiUrl: process.env.OPENCATALOGI_URL || 'http://localhost:8080/index.php/apps/openregister/api',
|
|
94
|
+
register: 'connext-content',
|
|
95
|
+
schema: 'page',
|
|
96
|
+
// Where to drop the generated Markdown
|
|
97
|
+
output: 'i18n/{locale}/docusaurus-plugin-content-pages',
|
|
98
|
+
// Pull translations per locale; fall back to defaultLocale where missing
|
|
99
|
+
locales: ['nl', 'en', 'de', 'fr'],
|
|
100
|
+
},
|
|
101
|
+
],
|
|
102
|
+
],
|
|
103
|
+
});
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
The plugin runs during `docusaurus build`, fetches OpenCatalogi objects, writes Markdown files per locale into the i18n folders, and Docusaurus picks them up as if they were committed. End result: editors update content in the Nextcloud OpenCatalogi UI, push triggers a build, the static site is regenerated. No runtime API calls; the production site stays a static deploy.
|
|
107
|
+
|
|
108
|
+
That plugin is not yet built. Until it lands, sites use plain Markdown in `docs/` and `i18n/<locale>/`.
|
|
109
|
+
|
|
110
|
+
## Local development against a local Nextcloud
|
|
111
|
+
|
|
112
|
+
Once the OpenCatalogi plugin is built, the dev workflow becomes:
|
|
113
|
+
|
|
114
|
+
```bash
|
|
115
|
+
# Start the local Nextcloud (Conduction's docker-compose dev environment)
|
|
116
|
+
cd ~/nextcloud-docker-dev && docker compose up -d
|
|
117
|
+
|
|
118
|
+
# Start Docusaurus, pointing at localhost:8080
|
|
119
|
+
cd ~/.../sites/www
|
|
120
|
+
OPENCATALOGI_URL=http://localhost:8080/index.php/apps/openregister/api npm start
|
|
121
|
+
```
|
|
122
|
+
|
|
123
|
+
`npm start` runs Docusaurus's hot-reload dev server. The plugin re-fetches on each rebuild so editing in the Nextcloud UI shows up after a save.
|
|
124
|
+
|
|
125
|
+
## Consume from a product site
|
|
126
|
+
|
|
127
|
+
```bash
|
|
128
|
+
npm i @conduction/docusaurus-preset @docusaurus/core @docusaurus/preset-classic react react-dom
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
Then use `createConfig()` in your `docusaurus.config.js` as shown in [Usage](#usage) above. The diagram web components register themselves on the client when `<Hero/>` or `<Diagrams/>` mount — no extra import needed in MDX. To register them eagerly (e.g. for a docs page that uses `<cn-hex>` directly without a wrapper), import the runtime module:
|
|
132
|
+
|
|
133
|
+
```js
|
|
134
|
+
// site src/clientModules/diagrams.js
|
|
135
|
+
import '@conduction/docusaurus-preset/diagrams';
|
|
136
|
+
```
|
|
137
|
+
|
|
138
|
+
This is how product sites such as `mydash.conduction.nl/docs/...` adopt the brand without copying CSS or theme code, and stay in sync as the design-system evolves.
|
|
139
|
+
|
|
140
|
+
## Releasing
|
|
141
|
+
|
|
142
|
+
Releases are tag-triggered. Pushing a tag `vX.Y.Z` runs [.github/workflows/publish-packages.yml](../.github/workflows/publish-packages.yml), which publishes `@conduction/docusaurus-preset` to npm under the `@conduction` scope. The diagram primitives ship inside the same tarball under `src/diagrams/`, so there is exactly one npm release per tag.
|
|
143
|
+
|
|
144
|
+
**One-time setup** (per repo, since Conduction keeps secrets repo-local):
|
|
145
|
+
|
|
146
|
+
1. Sign in to npm with an account that's a member of the `@conduction` org and has publish rights on the scope. (`npm login` from the CLI, or via [npmjs.com](https://www.npmjs.com/login).)
|
|
147
|
+
2. Create an automation token under your *user* settings (npm tokens are user-level, not org-level): npmjs.com → avatar dropdown → "Access Tokens" → "Generate New Token" → **Automation**. Copy the value.
|
|
148
|
+
3. Add it as a repo secret: <https://github.com/ConductionNL/design-system/settings/secrets/actions> → "New repository secret" → name `NPM_TOKEN`, paste the token.
|
|
149
|
+
4. (Optional) Verify the workflow with a dry run: Actions → "Publish packages" → Run workflow → leave "dry_run" checked. Watch for `+ @conduction/docusaurus-preset@…` in the logs without an actual upload.
|
|
150
|
+
|
|
151
|
+
The token publishes **on behalf of the user account**, not the org, so anyone with the right org-level permission can generate the token. Rotate by replacing the secret; no need to redeploy or amend the workflow.
|
|
152
|
+
|
|
153
|
+
**Per release:**
|
|
154
|
+
|
|
155
|
+
```bash
|
|
156
|
+
# Bump the preset version. The diagrams source ships inside the preset,
|
|
157
|
+
# so there is one version to bump and one tag to push.
|
|
158
|
+
$EDITOR docusaurus-preset/package.json # "version": "0.2.0"
|
|
159
|
+
|
|
160
|
+
git add docusaurus-preset/package.json
|
|
161
|
+
git commit -m "Bump @conduction/docusaurus-preset to 0.2.0"
|
|
162
|
+
git tag v0.2.0
|
|
163
|
+
git push origin main
|
|
164
|
+
git push origin v0.2.0 # this triggers the publish workflow
|
|
165
|
+
```
|
|
166
|
+
|
|
167
|
+
The workflow runs `npm publish --workspace @conduction/docusaurus-preset --access public`. Watch the run on the Actions tab. If it fails, fix the issue, bump the patch (`0.2.1`), re-tag — npm rejects re-publishing the same version.
|
|
168
|
+
|
|
169
|
+
## License
|
|
170
|
+
|
|
171
|
+
EUPL-1.2 + MIT.
|
package/package.json
ADDED
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@conduction/docusaurus-preset",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Conduction brand preset for Docusaurus 3. Tokens, theme, navbar, footer, i18n config for nl/en/de/fr, and the React component library that powers conduction.nl and the Conduction product sites.",
|
|
5
|
+
"main": "src/index.js",
|
|
6
|
+
"exports": {
|
|
7
|
+
".": "./src/index.js",
|
|
8
|
+
"./components": "./src/components/index.js",
|
|
9
|
+
"./data": "./src/data/app-downloads.js",
|
|
10
|
+
"./css/brand.css": "./src/css/brand.css",
|
|
11
|
+
"./css/tokens.css": "./src/css/tokens.css",
|
|
12
|
+
"./theme": "./src/theme.js",
|
|
13
|
+
"./diagrams": "./src/diagrams/index.js",
|
|
14
|
+
"./diagrams/cn-hex": "./src/diagrams/cn-hex.js",
|
|
15
|
+
"./diagrams/cn-hex-prism": "./src/diagrams/cn-hex-prism.js",
|
|
16
|
+
"./diagrams/cn-platform": "./src/diagrams/cn-platform.js",
|
|
17
|
+
"./diagrams/cn-domain-tree": "./src/diagrams/cn-domain-tree.js",
|
|
18
|
+
"./diagrams/cn-pipeline": "./src/diagrams/cn-pipeline.js",
|
|
19
|
+
"./diagrams/cn-side-box": "./src/diagrams/cn-side-box.js",
|
|
20
|
+
"./diagrams/cn-honeycomb-bg": "./src/diagrams/cn-honeycomb-bg.js"
|
|
21
|
+
},
|
|
22
|
+
"files": [
|
|
23
|
+
"src/",
|
|
24
|
+
"static/",
|
|
25
|
+
"README.md",
|
|
26
|
+
"MISSING_COMPONENTS.md"
|
|
27
|
+
],
|
|
28
|
+
"keywords": [
|
|
29
|
+
"conduction",
|
|
30
|
+
"connext",
|
|
31
|
+
"docusaurus",
|
|
32
|
+
"docusaurus-preset",
|
|
33
|
+
"design-system",
|
|
34
|
+
"diagrams",
|
|
35
|
+
"web-components",
|
|
36
|
+
"hex",
|
|
37
|
+
"nextcloud"
|
|
38
|
+
],
|
|
39
|
+
"peerDependencies": {
|
|
40
|
+
"@docusaurus/core": "^3.0.0",
|
|
41
|
+
"@docusaurus/preset-classic": "^3.0.0",
|
|
42
|
+
"react": "^18.0.0",
|
|
43
|
+
"react-dom": "^18.0.0"
|
|
44
|
+
},
|
|
45
|
+
"publishConfig": {
|
|
46
|
+
"access": "public"
|
|
47
|
+
},
|
|
48
|
+
"license": "EUPL-1.2",
|
|
49
|
+
"author": "Conduction <info@conduction.nl>",
|
|
50
|
+
"homepage": "https://design-system.conduction.nl/",
|
|
51
|
+
"repository": {
|
|
52
|
+
"type": "git",
|
|
53
|
+
"url": "https://github.com/ConductionNL/design-system.git",
|
|
54
|
+
"directory": "docusaurus-preset"
|
|
55
|
+
},
|
|
56
|
+
"bugs": {
|
|
57
|
+
"url": "https://github.com/ConductionNL/design-system/issues"
|
|
58
|
+
}
|
|
59
|
+
}
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* <AgentTrace />
|
|
3
|
+
*
|
|
4
|
+
* Fake terminal log of an AI agent doing work. Reference: the dark
|
|
5
|
+
* terminal block on honeycomb.io's hero showing a Claude-style tool
|
|
6
|
+
* trace ("Found the root cause", "honeycomb - run_query (MCP)…",
|
|
7
|
+
* "Pollinating..."). Translated to Conduction tokens: cobalt-900
|
|
8
|
+
* background, white body text, KNVB-orange status, cobalt-200/400
|
|
9
|
+
* ghosted continuation lines, mint-300 success, lavender-300 tool
|
|
10
|
+
* names. Monospace throughout.
|
|
11
|
+
*
|
|
12
|
+
* The component is presentational only — it doesn't run anything.
|
|
13
|
+
* Pass it a list of lines and it renders them with the right
|
|
14
|
+
* indentation, bullets, and colour. Optional cursor + bottom mode
|
|
15
|
+
* strip mirror the Claude CLI footer.
|
|
16
|
+
*
|
|
17
|
+
* Used wherever a marketing surface needs to *show* what an agent
|
|
18
|
+
* does without embedding a real screencap. Pairs well with
|
|
19
|
+
* <AppMock> on the same page (the agent log is the "behind the
|
|
20
|
+
* scenes", the AppMock is the "what the user sees").
|
|
21
|
+
*
|
|
22
|
+
* Usage in MDX:
|
|
23
|
+
*
|
|
24
|
+
* <AgentTrace
|
|
25
|
+
* lines={[
|
|
26
|
+
* { kind: 'expand', text: '+65 lines (expand)' },
|
|
27
|
+
* { kind: 'continuation', text: 'input: "latency errors", dataset_slug: "frontend") , max_queries: 15)' },
|
|
28
|
+
* { kind: 'note', bullet: 'done', text: 'Found the root cause. Reading more to understand the issue.' },
|
|
29
|
+
* { kind: 'tool', text: 'openconnector - run_pipeline (MCP)(register_slug: "zaak", limit: 50)' },
|
|
30
|
+
* { kind: 'expand', text: '+38 lines (ctrl+o to expand)' },
|
|
31
|
+
* { kind: 'note', bullet: 'info', text: 'Reading register…', muted: '(ctrl+o to expand)' },
|
|
32
|
+
* { kind: 'status', text: 'Synthesising…' },
|
|
33
|
+
* ]}
|
|
34
|
+
* cursor
|
|
35
|
+
* mode="accept edits on (shift+tab to cycle)"
|
|
36
|
+
* />
|
|
37
|
+
*
|
|
38
|
+
* Props:
|
|
39
|
+
* - lines: list of `{kind, text, bullet?, muted?, indent?}` rows.
|
|
40
|
+
* - kind 'expand' → muted "+N lines" expandable marker
|
|
41
|
+
* - kind 'continuation' → indented muted continuation of the
|
|
42
|
+
* previous tool call line
|
|
43
|
+
* - kind 'note' → primary line with optional bullet:
|
|
44
|
+
* 'done' (white), 'info' (workspace-blue),
|
|
45
|
+
* 'orange' (KNVB), 'mint' (mint-300)
|
|
46
|
+
* - kind 'tool' → tool-call line, lavender accented
|
|
47
|
+
* - kind 'status' → KNVB-orange "ing…" status line
|
|
48
|
+
* - cursor: boolean — render a blinking cursor at the bottom
|
|
49
|
+
* - mode: string — bottom strip caption ("accept edits on…")
|
|
50
|
+
*/
|
|
51
|
+
|
|
52
|
+
import React from 'react';
|
|
53
|
+
import styles from './AgentTrace.module.css';
|
|
54
|
+
|
|
55
|
+
function bulletClass(b) {
|
|
56
|
+
switch (b) {
|
|
57
|
+
case 'done': return styles.bDone;
|
|
58
|
+
case 'info': return styles.bInfo;
|
|
59
|
+
case 'orange': return styles.bOrange;
|
|
60
|
+
case 'mint': return styles.bMint;
|
|
61
|
+
default: return styles.bDone;
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
export default function AgentTrace({lines = [], cursor = false, mode, className}) {
|
|
66
|
+
return (
|
|
67
|
+
<div className={[styles.trace, className].filter(Boolean).join(' ')} role="img" aria-label="Agent trace">
|
|
68
|
+
<div className={styles.body}>
|
|
69
|
+
{lines.map((ln, i) => {
|
|
70
|
+
const indent = ln.indent ? {paddingLeft: `${ln.indent * 18}px`} : undefined;
|
|
71
|
+
if (ln.kind === 'expand') {
|
|
72
|
+
return (
|
|
73
|
+
<div key={i} className={[styles.line, styles.expand].join(' ')} style={indent}>
|
|
74
|
+
<span className={styles.expandRail} aria-hidden="true">└</span>
|
|
75
|
+
<span className={styles.muted}>{ln.text}</span>
|
|
76
|
+
</div>
|
|
77
|
+
);
|
|
78
|
+
}
|
|
79
|
+
if (ln.kind === 'continuation') {
|
|
80
|
+
return (
|
|
81
|
+
<div key={i} className={[styles.line, styles.continuation].join(' ')} style={indent}>
|
|
82
|
+
<span className={styles.continuationText}>{ln.text}</span>
|
|
83
|
+
</div>
|
|
84
|
+
);
|
|
85
|
+
}
|
|
86
|
+
if (ln.kind === 'tool') {
|
|
87
|
+
return (
|
|
88
|
+
<div key={i} className={[styles.line, styles.tool].join(' ')} style={indent}>
|
|
89
|
+
<span className={[styles.bullet, styles.bDone].join(' ')} aria-hidden="true">•</span>
|
|
90
|
+
<span className={styles.toolText}>{ln.text}</span>
|
|
91
|
+
</div>
|
|
92
|
+
);
|
|
93
|
+
}
|
|
94
|
+
if (ln.kind === 'status') {
|
|
95
|
+
return (
|
|
96
|
+
<div key={i} className={[styles.line, styles.status].join(' ')} style={indent}>
|
|
97
|
+
<span className={[styles.bullet, styles.bOrange].join(' ')} aria-hidden="true">•</span>
|
|
98
|
+
<span className={styles.statusText}>{ln.text}<span className={styles.dots} aria-hidden="true">...</span></span>
|
|
99
|
+
</div>
|
|
100
|
+
);
|
|
101
|
+
}
|
|
102
|
+
/* default: 'note' */
|
|
103
|
+
return (
|
|
104
|
+
<div key={i} className={[styles.line, styles.note].join(' ')} style={indent}>
|
|
105
|
+
<span className={[styles.bullet, bulletClass(ln.bullet)].join(' ')} aria-hidden="true">•</span>
|
|
106
|
+
<span className={styles.noteText}>
|
|
107
|
+
{ln.text}
|
|
108
|
+
{ln.muted && <span className={styles.muted}> {ln.muted}</span>}
|
|
109
|
+
</span>
|
|
110
|
+
</div>
|
|
111
|
+
);
|
|
112
|
+
})}
|
|
113
|
+
{cursor && (
|
|
114
|
+
<div className={[styles.line, styles.cursorLine].join(' ')}>
|
|
115
|
+
<span className={styles.prompt}>></span>
|
|
116
|
+
<span className={styles.cursor} aria-hidden="true"></span>
|
|
117
|
+
</div>
|
|
118
|
+
)}
|
|
119
|
+
</div>
|
|
120
|
+
{mode && (
|
|
121
|
+
<div className={styles.modeBar}>
|
|
122
|
+
<span className={styles.modeArrow} aria-hidden="true">>></span>
|
|
123
|
+
<span className={styles.modeText}>{mode}</span>
|
|
124
|
+
</div>
|
|
125
|
+
)}
|
|
126
|
+
</div>
|
|
127
|
+
);
|
|
128
|
+
}
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* <AgentTrace /> styles. Cobalt-900 terminal panel with monospace
|
|
3
|
+
* lines and Claude-CLI-style coloured bullets.
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
.trace {
|
|
7
|
+
background: var(--c-cobalt-900);
|
|
8
|
+
border-radius: var(--radius-lg);
|
|
9
|
+
padding: var(--space-6) var(--space-7) 0;
|
|
10
|
+
font-family: var(--conduction-typography-font-family-code);
|
|
11
|
+
font-size: 14px;
|
|
12
|
+
line-height: 1.6;
|
|
13
|
+
color: white;
|
|
14
|
+
display: flex;
|
|
15
|
+
flex-direction: column;
|
|
16
|
+
gap: 0;
|
|
17
|
+
box-shadow: var(--shadow-3);
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
.body {
|
|
21
|
+
display: flex;
|
|
22
|
+
flex-direction: column;
|
|
23
|
+
gap: var(--space-3);
|
|
24
|
+
padding-bottom: var(--space-5);
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
.line {
|
|
28
|
+
display: flex;
|
|
29
|
+
align-items: flex-start;
|
|
30
|
+
gap: var(--space-2);
|
|
31
|
+
font-feature-settings: "calt" 0;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
/* Bullets — set inline-block so the gap works the same across kinds. */
|
|
35
|
+
.bullet {
|
|
36
|
+
display: inline-block;
|
|
37
|
+
width: 12px;
|
|
38
|
+
flex-shrink: 0;
|
|
39
|
+
text-align: center;
|
|
40
|
+
font-weight: 700;
|
|
41
|
+
line-height: inherit;
|
|
42
|
+
}
|
|
43
|
+
.bDone { color: white; }
|
|
44
|
+
.bInfo { color: var(--c-workspace-300); }
|
|
45
|
+
.bOrange { color: var(--c-orange-knvb); }
|
|
46
|
+
.bMint { color: var(--c-mint-300); }
|
|
47
|
+
|
|
48
|
+
/* Note — primary, white text. */
|
|
49
|
+
.noteText { color: white; }
|
|
50
|
+
|
|
51
|
+
/* Tool — lavender accent. */
|
|
52
|
+
.toolText { color: var(--c-lavender-300); }
|
|
53
|
+
|
|
54
|
+
/* Status — orange, with animated dots. */
|
|
55
|
+
.statusText { color: var(--c-orange-knvb); }
|
|
56
|
+
.dots {
|
|
57
|
+
display: inline-block;
|
|
58
|
+
margin-left: 2px;
|
|
59
|
+
animation: dots 1400ms steps(4, end) infinite;
|
|
60
|
+
white-space: pre;
|
|
61
|
+
overflow: hidden;
|
|
62
|
+
vertical-align: bottom;
|
|
63
|
+
width: 1.2em;
|
|
64
|
+
}
|
|
65
|
+
@keyframes dots {
|
|
66
|
+
0% { width: 0; }
|
|
67
|
+
25% { width: 0.4em; }
|
|
68
|
+
50% { width: 0.8em; }
|
|
69
|
+
75% { width: 1.2em; }
|
|
70
|
+
100% { width: 1.2em; }
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
/* Expand marker — gray rail + muted text. */
|
|
74
|
+
.expand { color: var(--c-cobalt-200); }
|
|
75
|
+
.expandRail {
|
|
76
|
+
display: inline-block;
|
|
77
|
+
width: 12px;
|
|
78
|
+
color: var(--c-cobalt-300);
|
|
79
|
+
flex-shrink: 0;
|
|
80
|
+
text-align: center;
|
|
81
|
+
}
|
|
82
|
+
.muted { color: var(--c-cobalt-200); }
|
|
83
|
+
|
|
84
|
+
/* Continuation — indented under a tool call, lighter than primary. */
|
|
85
|
+
.continuation { padding-left: 30px; }
|
|
86
|
+
.continuationText { color: var(--c-cobalt-100); }
|
|
87
|
+
|
|
88
|
+
/* Cursor */
|
|
89
|
+
.cursorLine { color: var(--c-cobalt-300); margin-top: var(--space-2); }
|
|
90
|
+
.prompt { color: var(--c-cobalt-300); margin-right: 6px; }
|
|
91
|
+
.cursor {
|
|
92
|
+
display: inline-block;
|
|
93
|
+
width: 8px;
|
|
94
|
+
height: 14px;
|
|
95
|
+
background: white;
|
|
96
|
+
vertical-align: -2px;
|
|
97
|
+
animation: blink 1100ms steps(2, end) infinite;
|
|
98
|
+
}
|
|
99
|
+
@keyframes blink {
|
|
100
|
+
0%, 50% { opacity: 1; }
|
|
101
|
+
51%, 100% { opacity: 0; }
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
/* Mode strip at the bottom — separator + caption ("accept edits on…"). */
|
|
105
|
+
.modeBar {
|
|
106
|
+
display: flex;
|
|
107
|
+
align-items: center;
|
|
108
|
+
gap: var(--space-2);
|
|
109
|
+
padding: var(--space-3) 0;
|
|
110
|
+
border-top: 1px solid rgba(255, 255, 255, 0.08);
|
|
111
|
+
color: var(--c-cobalt-200);
|
|
112
|
+
font-size: 13px;
|
|
113
|
+
}
|
|
114
|
+
.modeArrow { color: var(--c-cobalt-300); }
|
|
115
|
+
.modeText { color: var(--c-cobalt-200); }
|