@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,74 @@
|
|
|
1
|
+
# @conduction/diagrams
|
|
2
|
+
|
|
3
|
+
Brand-strict diagram primitives for Conduction and ConNext, as framework-agnostic web components.
|
|
4
|
+
|
|
5
|
+
## Status
|
|
6
|
+
|
|
7
|
+
Pre-release, scaffolded inside the `design-system` repo. The future home is tracked in [design-system#2](https://github.com/ConductionNL/design-system/issues/2).
|
|
8
|
+
|
|
9
|
+
## Why
|
|
10
|
+
|
|
11
|
+
Every Conduction diagram follows the same brand rules: pointy-top hexes, fixed palette, one orange accent per scene, no gradients on shapes. Third-party diagram libraries (Mermaid, D3-based, drawio, etc.) all force compromises against those rules. We render shapes ourselves with inline SVG inside web components, so every diagram on every surface looks the same.
|
|
12
|
+
|
|
13
|
+
## Stack
|
|
14
|
+
|
|
15
|
+
- **Vanilla `customElements`** for component registration. No framework, no build step required.
|
|
16
|
+
- **Inline SVG + `clip-path`** for all shapes. No third-party shape library.
|
|
17
|
+
- **CSS + Web Animations API** for animation. Motion One (MIT, ~3kb) added when we orchestrate sequences.
|
|
18
|
+
- **Lit** added when reactive-prop complexity demands it (probably at `cn-platform`).
|
|
19
|
+
|
|
20
|
+
## Components
|
|
21
|
+
|
|
22
|
+
| Component | Status | Purpose |
|
|
23
|
+
| --- | --- | --- |
|
|
24
|
+
| `<cn-hex>` | Available | Pointy-top hex primitive. Label + icon, nine colours, four sizes, solid or outline, optional interactive state. |
|
|
25
|
+
| `<cn-hex-prism>` | Available | 3D isometric prism. Six families, four sizes, slots for label / icon / kicker / pills, coming-state badge. |
|
|
26
|
+
| `<cn-domain-tree>` | Available | Vertical apex-and-branches layout for one-to-many domain maps. Slot-driven; multi-trunk diagrams stack two trees. |
|
|
27
|
+
| `<cn-platform>` | Available | Workspace-plus-orbiting-apps cluster. Six neighbours in a hex ring around a central apex (typically a cobalt cn-hex-prism representing the Nextcloud workspace). |
|
|
28
|
+
| `<cn-pipeline>` | Available | Horizontal flow of stages with auto-inserted arrow connectors. Three arrow tones. |
|
|
29
|
+
| `<cn-side-box>` | Available | Rectangle-feed-prism pattern. Header chip + icon-and-label rows. Three widths, optional compact + footer. |
|
|
30
|
+
| `<cn-honeycomb-bg>` | Available | Honeycomb backdrop wrapper. Theme + accent + density attributes. Parallax in v2. |
|
|
31
|
+
|
|
32
|
+
## Usage
|
|
33
|
+
|
|
34
|
+
No build step needed. Drop the module into any HTML page:
|
|
35
|
+
|
|
36
|
+
```html
|
|
37
|
+
<script type="module" src="../diagrams/src/index.js"></script>
|
|
38
|
+
|
|
39
|
+
<cn-hex color="cobalt" size="lg">Connect</cn-hex>
|
|
40
|
+
|
|
41
|
+
<cn-hex color="orange" size="lg" interactive>
|
|
42
|
+
<svg slot="icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
|
|
43
|
+
<path d="M3 7l9-4 9 4-9 4-9-4z"/>
|
|
44
|
+
<path d="M3 12l9 4 9-4"/>
|
|
45
|
+
</svg>
|
|
46
|
+
Catalog
|
|
47
|
+
</cn-hex>
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
## `<cn-hex>` API
|
|
51
|
+
|
|
52
|
+
| Slot | Purpose |
|
|
53
|
+
| --- | --- |
|
|
54
|
+
| default | Label text. Optional. |
|
|
55
|
+
| `icon` | Icon SVG or `<img>`. Optional. Sits above the label by default; left of it with `layout="horizontal"`. |
|
|
56
|
+
|
|
57
|
+
| Attribute | Values | Default | Purpose |
|
|
58
|
+
| --- | --- | --- | --- |
|
|
59
|
+
| `color` | `cobalt`, `orange`, `mint`, `lavender`, `terracotta`, `forest`, `nextcloud`, `red` | `cobalt` | Brand colour. |
|
|
60
|
+
| `size` | `sm`, `md`, `lg`, `xl`, or any CSS length | `md` (64px) | Width of the hex. Height = width × 1.155. |
|
|
61
|
+
| `variant` | `solid`, `outline` | `solid` | Outline draws a stroke at the brand colour with a transparent body. |
|
|
62
|
+
| `layout` | `vertical`, `horizontal` | `vertical` | Icon-above-label vs icon-left-of-label. |
|
|
63
|
+
| `interactive` | boolean | absent | Adds hover scale, focus ring, click event, keyboard activation. |
|
|
64
|
+
|
|
65
|
+
## Brand rules
|
|
66
|
+
|
|
67
|
+
- Pointy-top only. No rotation. No flat-top hexes.
|
|
68
|
+
- Solid colours only. No gradients, no rgba on shapes.
|
|
69
|
+
- One orange accent per scene. KNVB orange for highlights, never primary fills.
|
|
70
|
+
- Backgrounds are hex polygons, never radial-gradient circles.
|
|
71
|
+
|
|
72
|
+
## Roadmap
|
|
73
|
+
|
|
74
|
+
See the planned components above. Built in this order: `cn-hex` ✅ → `cn-hex-prism` → `cn-domain-tree` (first real consumer on the new identity/domains.html page) → `cn-platform` → `cn-pipeline` → `cn-side-box` → `cn-honeycomb-bg`.
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* <cn-domain-tree> — vertical apex-and-branches layout for domain maps.
|
|
3
|
+
*
|
|
4
|
+
* Wraps an apex hex and a row of branch hexes with the kit's standard
|
|
5
|
+
* connector lines. Designed for the identity / Websites page, but
|
|
6
|
+
* useful anywhere a one-to-many "trunk → leaves" relationship needs
|
|
7
|
+
* to render. Multi-trunk diagrams stack two or more <cn-domain-tree>
|
|
8
|
+
* elements vertically.
|
|
9
|
+
*
|
|
10
|
+
* Slots
|
|
11
|
+
* apex — the trunk hex; required (typically <cn-hex size="xl">)
|
|
12
|
+
* default — branch hexes; rendered in a centered horizontal row
|
|
13
|
+
* legend — optional legend chips at the bottom
|
|
14
|
+
*
|
|
15
|
+
* Attributes
|
|
16
|
+
* compact — tighter vertical spacing (for sub-trunks)
|
|
17
|
+
* tone — cobalt | dim (default: cobalt)
|
|
18
|
+
* tone="dim" colours connectors gray instead of cobalt
|
|
19
|
+
*
|
|
20
|
+
* The component renders only structure and connectors; the apex and
|
|
21
|
+
* branch hexes are passed in as <cn-hex> (or anything you want) so
|
|
22
|
+
* full styling control stays with the caller.
|
|
23
|
+
*/
|
|
24
|
+
|
|
25
|
+
class CnDomainTree extends HTMLElement {
|
|
26
|
+
static get observedAttributes() { return ['compact', 'tone']; }
|
|
27
|
+
|
|
28
|
+
constructor() {
|
|
29
|
+
super();
|
|
30
|
+
this.attachShadow({ mode: 'open' });
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
connectedCallback() { this.render(); }
|
|
34
|
+
attributeChangedCallback() { if (this.shadowRoot) this.render(); }
|
|
35
|
+
|
|
36
|
+
render() {
|
|
37
|
+
const compact = this.hasAttribute('compact');
|
|
38
|
+
const tone = this.getAttribute('tone') || 'cobalt';
|
|
39
|
+
const connectorColor = tone === 'dim'
|
|
40
|
+
? 'var(--c-cobalt-100)'
|
|
41
|
+
: 'var(--c-cobalt-200)';
|
|
42
|
+
|
|
43
|
+
const gap = compact ? 'var(--space-3)' : 'var(--space-5)';
|
|
44
|
+
const connectorH = compact ? '20px' : '32px';
|
|
45
|
+
const padY = compact ? 'var(--space-5)' : 'var(--space-9)';
|
|
46
|
+
|
|
47
|
+
this.shadowRoot.innerHTML = `
|
|
48
|
+
<style>
|
|
49
|
+
:host {
|
|
50
|
+
display: block;
|
|
51
|
+
font-family: var(--conduction-typography-font-family-body, system-ui, sans-serif);
|
|
52
|
+
}
|
|
53
|
+
.tree {
|
|
54
|
+
display: flex; flex-direction: column;
|
|
55
|
+
align-items: center;
|
|
56
|
+
gap: ${gap};
|
|
57
|
+
padding: ${padY} var(--space-7);
|
|
58
|
+
overflow-x: auto;
|
|
59
|
+
}
|
|
60
|
+
.connector {
|
|
61
|
+
width: 1px;
|
|
62
|
+
height: ${connectorH};
|
|
63
|
+
background: ${connectorColor};
|
|
64
|
+
flex-shrink: 0;
|
|
65
|
+
}
|
|
66
|
+
.branches {
|
|
67
|
+
display: flex;
|
|
68
|
+
gap: var(--space-7);
|
|
69
|
+
align-items: center;
|
|
70
|
+
justify-content: center;
|
|
71
|
+
flex-wrap: wrap;
|
|
72
|
+
}
|
|
73
|
+
.legend {
|
|
74
|
+
display: flex; gap: var(--space-6);
|
|
75
|
+
flex-wrap: wrap;
|
|
76
|
+
margin-top: var(--space-4);
|
|
77
|
+
padding-top: var(--space-5);
|
|
78
|
+
border-top: 1px solid var(--c-cobalt-100);
|
|
79
|
+
width: 100%;
|
|
80
|
+
justify-content: center;
|
|
81
|
+
}
|
|
82
|
+
.legend:empty { display: none; }
|
|
83
|
+
|
|
84
|
+
::slotted([slot="legend"]) {
|
|
85
|
+
display: flex; align-items: center; gap: var(--space-2);
|
|
86
|
+
font-size: 13px;
|
|
87
|
+
color: var(--c-cobalt-700);
|
|
88
|
+
}
|
|
89
|
+
</style>
|
|
90
|
+
|
|
91
|
+
<div class="tree">
|
|
92
|
+
<slot name="apex"></slot>
|
|
93
|
+
<div class="connector"></div>
|
|
94
|
+
<div class="branches"><slot></slot></div>
|
|
95
|
+
<div class="legend"><slot name="legend"></slot></div>
|
|
96
|
+
</div>
|
|
97
|
+
`;
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
if (!customElements.get('cn-domain-tree')) {
|
|
102
|
+
customElements.define('cn-domain-tree', CnDomainTree);
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
export { CnDomainTree };
|
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* <cn-hex-prism> — the 3D isometric prism primitive.
|
|
3
|
+
*
|
|
4
|
+
* The atomic unit for ConNext platform diagrams. A pointy-top hexagon
|
|
5
|
+
* extruded ~30° in isometric view, three faces tinted from one family
|
|
6
|
+
* palette: top = family-100 (lit), left = family-300, right = family-500,
|
|
7
|
+
* ink = family-700. Six families ship: cobalt (workspace only), coral,
|
|
8
|
+
* lavender, gold, mint, gray.
|
|
9
|
+
*
|
|
10
|
+
* Slots
|
|
11
|
+
* default — label text (the prism's name)
|
|
12
|
+
* icon — icon SVG / image, sits above the label on the top face
|
|
13
|
+
* kicker — small uppercase line under the label (e.g. "DATA · STABLE")
|
|
14
|
+
* pills — optional pill stack floating on the top face
|
|
15
|
+
*
|
|
16
|
+
* Attributes
|
|
17
|
+
* family cobalt | coral | lavender | gold | mint | gray (default: coral)
|
|
18
|
+
* size sm | md | lg | xl or any CSS length (default: md = 144px)
|
|
19
|
+
* state coming (optional)
|
|
20
|
+
*
|
|
21
|
+
* Geometry: SVG viewBox 240×252, paths inscribed for a pointy-top hex
|
|
22
|
+
* extruded by R*0.45 (depth vector). All three faces drawn as polygons,
|
|
23
|
+
* face edges drawn as 1.25-stroke polylines at 18% opacity for subtle
|
|
24
|
+
* faceting. The label-content layer sits in the upper portion so the
|
|
25
|
+
* text hits the top face only, not the side faces.
|
|
26
|
+
*/
|
|
27
|
+
|
|
28
|
+
const SIZES = { sm: 96, md: 144, lg: 192, xl: 240 };
|
|
29
|
+
|
|
30
|
+
const FAMILIES = {
|
|
31
|
+
cobalt: { top: 'var(--c-cobalt-100)', left: 'var(--c-cobalt-400)', right: 'var(--c-cobalt-700)', ink: '#fff' },
|
|
32
|
+
coral: { top: 'var(--c-coral-100)', left: 'var(--c-coral-300)', right: 'var(--c-coral-500)', ink: 'var(--c-coral-700)' },
|
|
33
|
+
lavender: { top: 'var(--c-lavender-100)', left: 'var(--c-lavender-300)', right: 'var(--c-lavender-500)', ink: 'var(--c-lavender-700)' },
|
|
34
|
+
gold: { top: 'var(--c-gold-100)', left: 'var(--c-gold-300)', right: 'var(--c-gold-500)', ink: 'var(--c-gold-700)' },
|
|
35
|
+
mint: { top: 'var(--c-mint-100)', left: 'var(--c-mint-300)', right: 'var(--c-mint-500)', ink: 'var(--c-mint-700)' },
|
|
36
|
+
gray: { top: 'var(--c-gray-100)', left: 'var(--c-gray-300)', right: 'var(--c-gray-500)', ink: 'var(--c-gray-700)' },
|
|
37
|
+
};
|
|
38
|
+
|
|
39
|
+
class CnHexPrism extends HTMLElement {
|
|
40
|
+
static get observedAttributes() {
|
|
41
|
+
return ['family', 'size', 'state'];
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
constructor() {
|
|
45
|
+
super();
|
|
46
|
+
this.attachShadow({ mode: 'open' });
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
connectedCallback() { this.render(); }
|
|
50
|
+
attributeChangedCallback() { if (this.shadowRoot) this.render(); }
|
|
51
|
+
|
|
52
|
+
render() {
|
|
53
|
+
const familyKey = this.getAttribute('family') || 'coral';
|
|
54
|
+
const sizeAttr = this.getAttribute('size') || 'md';
|
|
55
|
+
const state = this.getAttribute('state');
|
|
56
|
+
|
|
57
|
+
const f = FAMILIES[familyKey] || FAMILIES.coral;
|
|
58
|
+
const sizePx = SIZES[sizeAttr] ? `${SIZES[sizeAttr]}px` : sizeAttr;
|
|
59
|
+
|
|
60
|
+
this.shadowRoot.innerHTML = `
|
|
61
|
+
<style>
|
|
62
|
+
:host {
|
|
63
|
+
--face-top: ${f.top};
|
|
64
|
+
--face-left: ${f.left};
|
|
65
|
+
--face-right: ${f.right};
|
|
66
|
+
--ink: ${f.ink};
|
|
67
|
+
|
|
68
|
+
display: inline-block;
|
|
69
|
+
width: ${sizePx};
|
|
70
|
+
position: relative;
|
|
71
|
+
font-family: var(--conduction-typography-font-family-body, system-ui, sans-serif);
|
|
72
|
+
color: var(--ink);
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
svg.shape { display: block; width: 100%; height: auto; overflow: visible; }
|
|
76
|
+
svg.shape .face-top { fill: var(--face-top); }
|
|
77
|
+
svg.shape .face-left { fill: var(--face-left); }
|
|
78
|
+
svg.shape .face-right { fill: var(--face-right); }
|
|
79
|
+
svg.shape .face-edge { stroke: var(--ink); stroke-width: 1.25; fill: none; opacity: 0.18; }
|
|
80
|
+
|
|
81
|
+
.content {
|
|
82
|
+
position: absolute;
|
|
83
|
+
inset: 0;
|
|
84
|
+
display: flex; flex-direction: column;
|
|
85
|
+
align-items: center; justify-content: center;
|
|
86
|
+
padding-bottom: 18%; /* push content onto top face only */
|
|
87
|
+
color: var(--ink);
|
|
88
|
+
text-align: center;
|
|
89
|
+
pointer-events: none;
|
|
90
|
+
}
|
|
91
|
+
::slotted([slot="icon"]) {
|
|
92
|
+
width: 22%;
|
|
93
|
+
height: auto;
|
|
94
|
+
margin-bottom: 4%;
|
|
95
|
+
color: currentColor;
|
|
96
|
+
fill: currentColor;
|
|
97
|
+
}
|
|
98
|
+
.label {
|
|
99
|
+
font-size: calc(${sizePx} * 0.10);
|
|
100
|
+
font-weight: 700;
|
|
101
|
+
letter-spacing: -0.01em;
|
|
102
|
+
line-height: 1.15;
|
|
103
|
+
}
|
|
104
|
+
::slotted([slot="kicker"]) {
|
|
105
|
+
font-family: var(--conduction-typography-font-family-code, ui-monospace, monospace);
|
|
106
|
+
font-size: calc(${sizePx} * 0.066);
|
|
107
|
+
letter-spacing: 0.12em;
|
|
108
|
+
text-transform: uppercase;
|
|
109
|
+
margin-top: 2%;
|
|
110
|
+
opacity: 0.78;
|
|
111
|
+
color: currentColor;
|
|
112
|
+
}
|
|
113
|
+
::slotted([slot="pills"]) {
|
|
114
|
+
display: flex; flex-direction: column;
|
|
115
|
+
gap: 4px; margin-top: 4%;
|
|
116
|
+
align-items: center;
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
${state === 'coming' ? `
|
|
120
|
+
.badge {
|
|
121
|
+
position: absolute;
|
|
122
|
+
top: 12%; right: 6%;
|
|
123
|
+
background: var(--c-cobalt-700);
|
|
124
|
+
color: white;
|
|
125
|
+
font-family: var(--conduction-typography-font-family-code, ui-monospace, monospace);
|
|
126
|
+
font-size: calc(${sizePx} * 0.05);
|
|
127
|
+
font-weight: 700;
|
|
128
|
+
letter-spacing: 0.08em;
|
|
129
|
+
text-transform: uppercase;
|
|
130
|
+
padding: 3px 7px;
|
|
131
|
+
border-radius: 999px;
|
|
132
|
+
pointer-events: none;
|
|
133
|
+
}
|
|
134
|
+
` : ''}
|
|
135
|
+
</style>
|
|
136
|
+
|
|
137
|
+
<svg class="shape" viewBox="0 0 240 252" aria-hidden="true">
|
|
138
|
+
<!-- left face -->
|
|
139
|
+
<polygon class="face-left" points="120,84 60,118 60,212 120,246"/>
|
|
140
|
+
<!-- right face -->
|
|
141
|
+
<polygon class="face-right" points="120,84 180,118 180,212 120,246"/>
|
|
142
|
+
<!-- top face (drawn last so it sits on top of the side faces at the seam) -->
|
|
143
|
+
<polygon class="face-top" points="120,6 180,40 180,118 120,152 60,118 60,40"/>
|
|
144
|
+
<!-- subtle face edges, point down + center vertical -->
|
|
145
|
+
<polyline class="face-edge" points="120,84 60,118 120,152 180,118 120,84"/>
|
|
146
|
+
<polyline class="face-edge" points="120,152 120,246"/>
|
|
147
|
+
</svg>
|
|
148
|
+
<div class="content">
|
|
149
|
+
<slot name="icon"></slot>
|
|
150
|
+
<span class="label"><slot></slot></span>
|
|
151
|
+
<slot name="kicker"></slot>
|
|
152
|
+
<slot name="pills"></slot>
|
|
153
|
+
</div>
|
|
154
|
+
${state === 'coming' ? `<div class="badge">Coming</div>` : ''}
|
|
155
|
+
`;
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
if (!customElements.get('cn-hex-prism')) {
|
|
160
|
+
customElements.define('cn-hex-prism', CnHexPrism);
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
export { CnHexPrism };
|
|
@@ -0,0 +1,181 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* <cn-hex> — the foundational pointy-top hex primitive.
|
|
3
|
+
*
|
|
4
|
+
* Brand rules baked in: pointy-top only, solid colours, fixed palette.
|
|
5
|
+
* No rotation, no gradients on the shape itself.
|
|
6
|
+
*
|
|
7
|
+
* Slots
|
|
8
|
+
* default — label text (or any inline content)
|
|
9
|
+
* icon — icon SVG / image, sits above the label by default
|
|
10
|
+
*
|
|
11
|
+
* Attributes
|
|
12
|
+
* color cobalt | orange | mint | lavender | terracotta | forest |
|
|
13
|
+
* nextcloud | commonground | red
|
|
14
|
+
* (default: cobalt)
|
|
15
|
+
* size sm | md | lg | xl or any CSS length (default: md = 64px)
|
|
16
|
+
* variant solid | outline (default: solid)
|
|
17
|
+
* layout vertical | horizontal (default: vertical, icon top + label below)
|
|
18
|
+
* interactive boolean — hover scale + focus ring + click event
|
|
19
|
+
*
|
|
20
|
+
* Geometry: the hex is rendered as an SVG polygon inside a 100x115.47 viewBox
|
|
21
|
+
* (the natural 2/√3 height/width ratio of a regular pointy-top hex). The
|
|
22
|
+
* label-content layer sits in an inner safe-area hex inscribed in the outer
|
|
23
|
+
* shape, so labels and icons stay clear of the points.
|
|
24
|
+
*
|
|
25
|
+
* Ink colour: white on every brand fill except commonground (yellow), which
|
|
26
|
+
* gets cobalt-900 ink so the label hits AA contrast against the saturated
|
|
27
|
+
* yellow.
|
|
28
|
+
*/
|
|
29
|
+
|
|
30
|
+
const SIZES = { sm: 40, md: 64, lg: 96, xl: 128 };
|
|
31
|
+
|
|
32
|
+
const COLORS = {
|
|
33
|
+
cobalt: { fill: 'var(--c-blue-cobalt)', ink: '#fff' },
|
|
34
|
+
orange: { fill: 'var(--c-orange-knvb)', ink: '#fff' },
|
|
35
|
+
mint: { fill: 'var(--c-mint-500)', ink: '#fff' },
|
|
36
|
+
lavender: { fill: 'var(--c-lavender-500)', ink: '#fff' },
|
|
37
|
+
terracotta: { fill: 'var(--c-terracotta-500)', ink: '#fff' },
|
|
38
|
+
forest: { fill: 'var(--c-forest-500)', ink: '#fff' },
|
|
39
|
+
nextcloud: { fill: 'var(--c-nextcloud-blue)', ink: '#fff' },
|
|
40
|
+
commonground: { fill: 'var(--c-commonground-yellow)', ink: 'var(--c-cobalt-900)' },
|
|
41
|
+
red: { fill: 'var(--c-red-vermillion)', ink: '#fff' },
|
|
42
|
+
};
|
|
43
|
+
|
|
44
|
+
class CnHex extends HTMLElement {
|
|
45
|
+
static get observedAttributes() {
|
|
46
|
+
return ['color', 'size', 'variant', 'layout', 'interactive'];
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
constructor() {
|
|
50
|
+
super();
|
|
51
|
+
this.attachShadow({ mode: 'open' });
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
connectedCallback() {
|
|
55
|
+
this.render();
|
|
56
|
+
if (this.hasAttribute('interactive') && !this.hasAttribute('tabindex')) {
|
|
57
|
+
this.setAttribute('tabindex', '0');
|
|
58
|
+
this.setAttribute('role', 'button');
|
|
59
|
+
this.addEventListener('keydown', this._onKey);
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
disconnectedCallback() {
|
|
64
|
+
this.removeEventListener('keydown', this._onKey);
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
attributeChangedCallback() {
|
|
68
|
+
if (this.shadowRoot) this.render();
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
_onKey = (e) => {
|
|
72
|
+
if (e.key === 'Enter' || e.key === ' ') {
|
|
73
|
+
e.preventDefault();
|
|
74
|
+
this.click();
|
|
75
|
+
}
|
|
76
|
+
};
|
|
77
|
+
|
|
78
|
+
render() {
|
|
79
|
+
const colorKey = this.getAttribute('color') || 'cobalt';
|
|
80
|
+
const sizeAttr = this.getAttribute('size') || 'md';
|
|
81
|
+
const variant = this.getAttribute('variant') || 'solid';
|
|
82
|
+
const layout = this.getAttribute('layout') || 'vertical';
|
|
83
|
+
const interactive = this.hasAttribute('interactive');
|
|
84
|
+
|
|
85
|
+
const brand = COLORS[colorKey] || COLORS.cobalt;
|
|
86
|
+
const sizePx = SIZES[sizeAttr] ? `${SIZES[sizeAttr]}px` : sizeAttr;
|
|
87
|
+
|
|
88
|
+
const isOutline = variant === 'outline';
|
|
89
|
+
const fill = isOutline ? 'transparent' : brand.fill;
|
|
90
|
+
const stroke = isOutline ? brand.fill : 'transparent';
|
|
91
|
+
const strokeW = isOutline ? 4 : 0;
|
|
92
|
+
const ink = isOutline ? brand.fill : brand.ink;
|
|
93
|
+
|
|
94
|
+
this.shadowRoot.innerHTML = `
|
|
95
|
+
<style>
|
|
96
|
+
:host {
|
|
97
|
+
--cn-hex-size: ${sizePx};
|
|
98
|
+
--cn-hex-ink: ${ink};
|
|
99
|
+
|
|
100
|
+
display: inline-flex;
|
|
101
|
+
width: var(--cn-hex-size);
|
|
102
|
+
height: calc(var(--cn-hex-size) * 1.1547);
|
|
103
|
+
color: var(--cn-hex-ink);
|
|
104
|
+
font-family: var(--conduction-typography-font-family-body, system-ui, sans-serif);
|
|
105
|
+
font-weight: 600;
|
|
106
|
+
font-size: calc(var(--cn-hex-size) * 0.16);
|
|
107
|
+
line-height: 1.15;
|
|
108
|
+
text-align: center;
|
|
109
|
+
position: relative;
|
|
110
|
+
outline: none;
|
|
111
|
+
transition: transform 160ms ease;
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
${interactive ? `
|
|
115
|
+
:host { cursor: pointer; }
|
|
116
|
+
:host(:hover) svg.shape { transform: scale(1.04); }
|
|
117
|
+
:host(:focus-visible) svg.shape polygon {
|
|
118
|
+
stroke: var(--c-orange-knvb, #F36C21);
|
|
119
|
+
stroke-width: 3;
|
|
120
|
+
}
|
|
121
|
+
` : ''}
|
|
122
|
+
|
|
123
|
+
svg.shape {
|
|
124
|
+
position: absolute;
|
|
125
|
+
inset: 0;
|
|
126
|
+
width: 100%;
|
|
127
|
+
height: 100%;
|
|
128
|
+
overflow: visible;
|
|
129
|
+
transition: transform 160ms ease;
|
|
130
|
+
}
|
|
131
|
+
svg.shape polygon {
|
|
132
|
+
fill: ${fill};
|
|
133
|
+
stroke: ${stroke};
|
|
134
|
+
stroke-width: ${strokeW};
|
|
135
|
+
stroke-linejoin: round;
|
|
136
|
+
transition: fill 160ms ease, stroke 160ms ease;
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
.content {
|
|
140
|
+
position: relative;
|
|
141
|
+
width: 100%; height: 100%;
|
|
142
|
+
display: flex;
|
|
143
|
+
flex-direction: ${layout === 'horizontal' ? 'row' : 'column'};
|
|
144
|
+
align-items: center;
|
|
145
|
+
justify-content: center;
|
|
146
|
+
gap: ${layout === 'horizontal' ? '6%' : '4%'};
|
|
147
|
+
padding: ${layout === 'horizontal' ? '0 20%' : '22% 16%'};
|
|
148
|
+
box-sizing: border-box;
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
::slotted([slot="icon"]) {
|
|
152
|
+
width: ${layout === 'horizontal' ? '34%' : '42%'};
|
|
153
|
+
height: auto;
|
|
154
|
+
flex-shrink: 0;
|
|
155
|
+
color: currentColor;
|
|
156
|
+
fill: currentColor;
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
.label {
|
|
160
|
+
display: inline-block;
|
|
161
|
+
letter-spacing: -0.005em;
|
|
162
|
+
word-break: keep-all;
|
|
163
|
+
}
|
|
164
|
+
</style>
|
|
165
|
+
|
|
166
|
+
<svg class="shape" viewBox="0 0 100 115.47" preserveAspectRatio="none" aria-hidden="true">
|
|
167
|
+
<polygon points="50,2 98,28.87 98,86.6 50,113.47 2,86.6 2,28.87" />
|
|
168
|
+
</svg>
|
|
169
|
+
<div class="content">
|
|
170
|
+
<slot name="icon"></slot>
|
|
171
|
+
<span class="label"><slot></slot></span>
|
|
172
|
+
</div>
|
|
173
|
+
`;
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
if (!customElements.get('cn-hex')) {
|
|
178
|
+
customElements.define('cn-hex', CnHex);
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
export { CnHex };
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* <cn-honeycomb-bg> — honeycomb backdrop wrapper.
|
|
3
|
+
*
|
|
4
|
+
* A reusable hex-pattern backdrop for any brand surface. Smaller
|
|
5
|
+
* hexes form a regular tessellation; one optional orange accent
|
|
6
|
+
* sits in a stable position. Always pointy-top, never flat-top,
|
|
7
|
+
* never rotated.
|
|
8
|
+
*
|
|
9
|
+
* <cn-honeycomb-bg theme="cobalt">
|
|
10
|
+
* <h2>Foreground content sits above the backdrop.</h2>
|
|
11
|
+
* </cn-honeycomb-bg>
|
|
12
|
+
*
|
|
13
|
+
* v1 ships a static SVG-pattern fill. Parallax + depth tiers come
|
|
14
|
+
* later when we layer Motion One in.
|
|
15
|
+
*
|
|
16
|
+
* Attributes
|
|
17
|
+
* theme — cobalt | light (default: cobalt)
|
|
18
|
+
* cobalt = white hexes on cobalt-900 (default brand surface)
|
|
19
|
+
* light = cobalt hexes on white (low-contrast inverse)
|
|
20
|
+
* accent — boolean; renders one KNVB-orange hex accent in the field
|
|
21
|
+
* density — sm | md | lg (default: md)
|
|
22
|
+
* Hex tile size. Smaller = denser pattern.
|
|
23
|
+
*/
|
|
24
|
+
|
|
25
|
+
const DENSITIES = { sm: 24, md: 36, lg: 56 };
|
|
26
|
+
|
|
27
|
+
class CnHoneycombBg extends HTMLElement {
|
|
28
|
+
static get observedAttributes() { return ['theme', 'accent', 'density']; }
|
|
29
|
+
|
|
30
|
+
constructor() {
|
|
31
|
+
super();
|
|
32
|
+
this.attachShadow({ mode: 'open' });
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
connectedCallback() { this.render(); }
|
|
36
|
+
attributeChangedCallback() { if (this.shadowRoot) this.render(); }
|
|
37
|
+
|
|
38
|
+
render() {
|
|
39
|
+
const theme = this.getAttribute('theme') || 'cobalt';
|
|
40
|
+
const accent = this.hasAttribute('accent');
|
|
41
|
+
const densityKey = this.getAttribute('density') || 'md';
|
|
42
|
+
const r = DENSITIES[densityKey] || 36;
|
|
43
|
+
const w = r * Math.sqrt(3);
|
|
44
|
+
const h = r * 2;
|
|
45
|
+
const stepY = h * 0.75;
|
|
46
|
+
|
|
47
|
+
const isLight = theme === 'light';
|
|
48
|
+
const bgColor = isLight ? '#FFFFFF' : 'var(--c-cobalt-900)';
|
|
49
|
+
const hexColor = isLight ? 'var(--c-cobalt-100)' : 'rgba(255,255,255,0.06)';
|
|
50
|
+
const hexStroke = isLight ? 'var(--c-cobalt-200)' : 'rgba(255,255,255,0.1)';
|
|
51
|
+
|
|
52
|
+
/* Build a pattern with two hex rows for proper tessellation:
|
|
53
|
+
even rows offset by 0; odd rows offset by w/2. */
|
|
54
|
+
const patternW = w;
|
|
55
|
+
const patternH = stepY * 2;
|
|
56
|
+
const hexPath = (cx, cy) => {
|
|
57
|
+
const points = [];
|
|
58
|
+
for (let i = 0; i < 6; i++) {
|
|
59
|
+
const angle = (Math.PI / 3) * i + Math.PI / 6; /* pointy-top */
|
|
60
|
+
const x = cx + r * Math.cos(angle);
|
|
61
|
+
const y = cy + r * Math.sin(angle);
|
|
62
|
+
points.push(`${x.toFixed(2)},${y.toFixed(2)}`);
|
|
63
|
+
}
|
|
64
|
+
return points.join(' ');
|
|
65
|
+
};
|
|
66
|
+
|
|
67
|
+
/* Two staggered hex centres in one tile: top-row at y=stepY/2,
|
|
68
|
+
bottom-row at y=stepY/2+stepY, offset by w/2. */
|
|
69
|
+
const hexA = hexPath(0, stepY / 2);
|
|
70
|
+
const hexB = hexPath(w / 2, stepY / 2 + stepY);
|
|
71
|
+
|
|
72
|
+
this.shadowRoot.innerHTML = `
|
|
73
|
+
<style>
|
|
74
|
+
:host {
|
|
75
|
+
display: block;
|
|
76
|
+
position: relative;
|
|
77
|
+
background: ${bgColor};
|
|
78
|
+
color: ${isLight ? 'var(--c-cobalt-900)' : 'white'};
|
|
79
|
+
overflow: hidden;
|
|
80
|
+
border-radius: var(--radius-lg);
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
svg.bg {
|
|
84
|
+
position: absolute;
|
|
85
|
+
inset: 0;
|
|
86
|
+
width: 100%;
|
|
87
|
+
height: 100%;
|
|
88
|
+
z-index: 0;
|
|
89
|
+
pointer-events: none;
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
${accent ? `
|
|
93
|
+
.accent {
|
|
94
|
+
position: absolute;
|
|
95
|
+
top: 22%;
|
|
96
|
+
right: 14%;
|
|
97
|
+
width: ${w * 1.2}px;
|
|
98
|
+
height: ${h * 1.2}px;
|
|
99
|
+
clip-path: polygon(50% 0%, 100% 25%, 100% 75%, 50% 100%, 0% 75%, 0% 25%);
|
|
100
|
+
background: var(--c-orange-knvb);
|
|
101
|
+
opacity: 0.85;
|
|
102
|
+
z-index: 0;
|
|
103
|
+
pointer-events: none;
|
|
104
|
+
}
|
|
105
|
+
` : ''}
|
|
106
|
+
|
|
107
|
+
.content {
|
|
108
|
+
position: relative;
|
|
109
|
+
z-index: 1;
|
|
110
|
+
padding: var(--space-9) var(--space-7);
|
|
111
|
+
}
|
|
112
|
+
</style>
|
|
113
|
+
|
|
114
|
+
<svg class="bg" xmlns="http://www.w3.org/2000/svg">
|
|
115
|
+
<defs>
|
|
116
|
+
<pattern id="cn-honeycomb-pattern" width="${patternW}" height="${patternH}" patternUnits="userSpaceOnUse">
|
|
117
|
+
<polygon points="${hexA}" fill="${hexColor}" stroke="${hexStroke}" stroke-width="1"/>
|
|
118
|
+
<polygon points="${hexB}" fill="${hexColor}" stroke="${hexStroke}" stroke-width="1"/>
|
|
119
|
+
</pattern>
|
|
120
|
+
</defs>
|
|
121
|
+
<rect width="100%" height="100%" fill="url(#cn-honeycomb-pattern)"/>
|
|
122
|
+
</svg>
|
|
123
|
+
|
|
124
|
+
${accent ? '<div class="accent"></div>' : ''}
|
|
125
|
+
|
|
126
|
+
<div class="content"><slot></slot></div>
|
|
127
|
+
`;
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
if (!customElements.get('cn-honeycomb-bg')) {
|
|
132
|
+
customElements.define('cn-honeycomb-bg', CnHoneycombBg);
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
export { CnHoneycombBg };
|