@repobit/dex-system-design 0.24.3 → 0.24.5

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 (66) hide show
  1. package/CHANGELOG.md +15 -0
  2. package/package.json +4 -4
  3. package/src/components/accordion/accordion-bg.css.js +6 -1
  4. package/src/components/accordion/accordion-bg.js +3 -1
  5. package/src/components/accordion/accordion-bg.stories.js +49 -0
  6. package/src/components/accordion/accordion.css.js +40 -0
  7. package/src/components/accordion/accordion.js +31 -0
  8. package/src/components/accordion/accordion.stories.js +147 -4
  9. package/src/components/agent-endpoints/agent-endpoints.css.js +92 -0
  10. package/src/components/agent-endpoints/agent-endpoints.js +86 -0
  11. package/src/components/agent-endpoints/agent-endpoints.stories.js +148 -0
  12. package/src/components/ai-guardian-demo.stories.js +669 -0
  13. package/src/components/awards/awards-flex.css.js +169 -0
  14. package/src/components/awards/awards-flex.js +269 -0
  15. package/src/components/awards/awards-flex.stories.js +657 -0
  16. package/src/components/bento-grid/bento-grid.css.js +57 -0
  17. package/src/components/bento-grid/bento-grid.js +186 -0
  18. package/src/components/bento-grid/bento-grid.stories.js +440 -0
  19. package/src/components/bento-grid/bento-item.css.js +79 -0
  20. package/src/components/bento-grid/bento-item.js +54 -0
  21. package/src/components/button/button.css.js +26 -0
  22. package/src/components/button/button.js +8 -0
  23. package/src/components/button/button.stories.js +12 -0
  24. package/src/components/comparison-panel/comparison-panel.css.js +104 -0
  25. package/src/components/comparison-panel/comparison-panel.js +100 -0
  26. package/src/components/comparison-panel/comparison-panel.stories.js +223 -0
  27. package/src/components/compatibility-table/compatibility-table.css.js +243 -0
  28. package/src/components/compatibility-table/compatibility-table.js +123 -0
  29. package/src/components/compatibility-table/compatibility-table.stories.js +189 -0
  30. package/src/components/cta-banner/cta-banner.css.js +60 -0
  31. package/src/components/cta-banner/cta-banner.js +63 -0
  32. package/src/components/dropdown/dropdown.css.js +1 -1
  33. package/src/components/footer/footer.css.js +0 -1
  34. package/src/components/header/header-code.css.js +125 -0
  35. package/src/components/header/header-code.js +69 -0
  36. package/src/components/header/header-code.stories.js +226 -0
  37. package/src/components/heading/heading.css.js +3 -0
  38. package/src/components/icons/bd-ai-icon.js +27 -0
  39. package/src/components/list/list-item/list-item.css.js +3 -3
  40. package/src/components/list/list-item/list-item.js +10 -4
  41. package/src/components/overview/overview.css.js +121 -0
  42. package/src/components/overview/overview.js +63 -0
  43. package/src/components/overview/overview.stories.js +193 -0
  44. package/src/components/page-switcher/page-switcher.css.js +100 -0
  45. package/src/components/page-switcher/page-switcher.js +42 -0
  46. package/src/components/paragraph/paragraph.js +7 -3
  47. package/src/components/process-steps/process-steps.css.js +95 -0
  48. package/src/components/process-steps/process-steps.js +72 -0
  49. package/src/components/process-steps/process-steps.stories.js +144 -0
  50. package/src/components/quick-answer/quick-answer.css.js +67 -0
  51. package/src/components/quick-answer/quick-answer.js +59 -0
  52. package/src/components/quick-answer/quick-answer.stories.js +160 -0
  53. package/src/components/terminal/terminal-cursor.js +49 -0
  54. package/src/components/terminal/terminal-message.css.js +161 -0
  55. package/src/components/terminal/terminal-message.js +169 -0
  56. package/src/components/terminal/terminal-message.stories.js +321 -0
  57. package/src/components/trust-panel/trust-panel.css.js +167 -0
  58. package/src/components/trust-panel/trust-panel.js +116 -0
  59. package/src/components/trust-panel/trust-panel.stories.js +234 -0
  60. package/src/tokens/tokens.css +1 -1
  61. package/src/components/tabsComponent/tabsComponent.css.js +0 -267
  62. package/src/components/tabsComponent/tabsComponent.js +0 -193
  63. package/src/components/tabsComponent/tabsComponent.stories.js +0 -134
  64. package/src/components/tabsComponentFamily/tabsComponentFamily.css.js +0 -181
  65. package/src/components/tabsComponentFamily/tabsComponentFamily.js +0 -180
  66. package/src/components/tabsComponentFamily/tabsComponentFamily.stories.js +0 -319
@@ -0,0 +1,125 @@
1
+ import { css } from "lit";
2
+
3
+ export default css`
4
+ :host {
5
+ display: block;
6
+ font-family: var(--typography-fontFamily-sans);
7
+ }
8
+
9
+ .bd-headercode-container {
10
+ display: grid;
11
+ grid-template-columns: 1fr 1fr;
12
+ align-items: center;
13
+ gap: var(--spacing-48);
14
+ max-width: var(--layout-ensemble-max-width, 1200px);
15
+ margin: 0 auto;
16
+ padding: var(--spacing-48) var(--layout-ensemble-inline-padding, var(--spacing-24));
17
+ box-sizing: border-box;
18
+ }
19
+
20
+ /* === LEFT COLUMN === */
21
+ .bd-headercode-left {
22
+ display: flex;
23
+ flex-direction: column;
24
+ align-items: flex-start;
25
+ gap: var(--spacing-16);
26
+ }
27
+
28
+ /* Slot for a small breadcrumb-style line above the eyebrow
29
+ (e.g. "Bitdefender AI skill-scanner"). Empty by default —
30
+ collapses to nothing when no content is slotted in. */
31
+ .bd-headercode-breadcrumb {
32
+ display: flex;
33
+ flex-wrap: wrap;
34
+ align-items: center;
35
+ gap: var(--spacing-16);
36
+ color: var(--color-neutral-500);
37
+ font-family: var(--typography-fontFamily-mono, monospace);
38
+ font-size: var(--typography-fontSize-xs, 12px);
39
+ }
40
+
41
+ .bd-headercode-breadcrumb:not(:has(*)) {
42
+ display: none;
43
+ }
44
+
45
+ .bd-headercode-eyebrow {
46
+ color: var(--color-blue-400);
47
+ font-weight: var(--typography-fontWeight-bold);
48
+ margin: 0;
49
+ }
50
+
51
+ .bd-headercode-title {
52
+ margin: 0;
53
+ color: var(--color-neutral-1000);
54
+ line-height: var(--typography-lineHeight-tight, 1.05);
55
+ }
56
+
57
+ .bd-headercode-description {
58
+ color: var(--color-neutral-600);
59
+ max-width: 480px;
60
+ margin: 0;
61
+ }
62
+
63
+ .bd-headercode-cta {
64
+ display: flex;
65
+ flex-wrap: wrap;
66
+ align-items: center;
67
+ gap: var(--spacing-16);
68
+ margin-top: var(--spacing-8);
69
+ }
70
+
71
+ /* Slot for a small status badge next to the CTA buttons (e.g. "AVAILABLE").
72
+ Empty by default — collapses to nothing when no content is slotted in. */
73
+ .bd-headercode-badge {
74
+ display: inline-flex;
75
+ align-items: center;
76
+ color: var(--color-neutral-500);
77
+ font-family: var(--typography-fontFamily-mono, monospace);
78
+ font-size: var(--typography-fontSize-xs, 12px);
79
+ letter-spacing: 0.05em;
80
+ }
81
+
82
+ .bd-headercode-badge:not(:has(*)) {
83
+ display: none;
84
+ }
85
+
86
+ /* === RIGHT COLUMN === */
87
+ .bd-headercode-right {
88
+ display: flex;
89
+ flex-direction: column;
90
+ align-items: flex-end;
91
+ gap: var(--spacing-8);
92
+ }
93
+
94
+ .bd-headercode-right ::slotted(*) {
95
+ width: 100%;
96
+ max-width: 520px;
97
+ box-shadow: 0 1px 2px #0003,0 18px 48px #000a1e73
98
+ }
99
+
100
+ .bd-headercode-terminal-caption {
101
+ color: var(--color-neutral-500);
102
+ margin: 0;
103
+ }
104
+
105
+ /* === RESPONSIVE === */
106
+ @media (max-width: 899px) {
107
+ .bd-headercode-container {
108
+ grid-template-columns: 1fr;
109
+ gap: var(--spacing-32);
110
+ padding: var(--spacing-32) var(--spacing-24);
111
+ }
112
+
113
+ .bd-headercode-right {
114
+ align-items: stretch;
115
+ }
116
+
117
+ .bd-headercode-right ::slotted(*) {
118
+ max-width: none;
119
+ }
120
+
121
+ .bd-headercode-description {
122
+ max-width: none;
123
+ }
124
+ }
125
+ `;
@@ -0,0 +1,69 @@
1
+ import { LitElement, html, nothing } from "lit";
2
+ import { tokens } from "../../tokens/tokens.js";
3
+ import "../button/button.js";
4
+ import "../heading/heading.js";
5
+ import "../paragraph/paragraph.js";
6
+ import "../terminal/terminal-message.js";
7
+ import headerCodeCSS from "./header-code.css.js";
8
+
9
+ class HeaderCode extends LitElement {
10
+ static properties = {
11
+ eyebrow : { type: String },
12
+ title : { type: String },
13
+ description : { type: String },
14
+ terminalCaption: { type: String, attribute: "terminal-caption" }
15
+ };
16
+
17
+ static styles = [tokens, headerCodeCSS];
18
+
19
+ constructor() {
20
+ super();
21
+ this.eyebrow = "";
22
+ this.title = "";
23
+ this.description = "";
24
+ this.terminalCaption = "";
25
+ }
26
+
27
+ render() {
28
+ return html`
29
+ <div class="bd-headercode-container">
30
+ <div class="bd-headercode-left">
31
+ <div class="bd-headercode-breadcrumb">
32
+ <slot name="breadcrumb"></slot>
33
+ </div>
34
+
35
+ ${this.eyebrow
36
+ ? html`<bd-p kind="normal" class="bd-headercode-eyebrow">${this.eyebrow}</bd-p>`
37
+ : nothing}
38
+
39
+ <bd-h as="h1" class="bd-headercode-title">
40
+ <slot name="title">${this.title}</slot>
41
+ </bd-h>
42
+
43
+ ${this.description
44
+ ? html`<bd-p kind="regular" class="bd-headercode-description">${this.description}</bd-p>`
45
+ : nothing}
46
+
47
+ <div class="bd-headercode-cta">
48
+ <slot name="primary-button"></slot>
49
+ <slot name="secondary-button"></slot>
50
+ <span class="bd-headercode-badge">
51
+ <slot name="badge"></slot>
52
+ </span>
53
+ </div>
54
+ </div>
55
+
56
+ <div class="bd-headercode-right">
57
+ <slot name="terminal-content"></slot>
58
+
59
+ ${this.terminalCaption
60
+ ? html`<bd-p kind="small" class="bd-headercode-terminal-caption" font-family="'IBM Plex Mono', ui-monospace, SFMono-Regular, Monaco, Consolas, 'Liberation Mono', 'Courier New', monospace"
61
+ >${this.terminalCaption}</bd-p>`
62
+ : nothing}
63
+ </div>
64
+ </div>
65
+ `;
66
+ }
67
+ }
68
+
69
+ customElements.define("bd-header-code", HeaderCode);
@@ -0,0 +1,226 @@
1
+ import { html } from "lit";
2
+ import "../button/button.js";
3
+ import "../terminal/terminal-message.js";
4
+ import "./header-code.js";
5
+
6
+ export default {
7
+ title : "Components/Header Code",
8
+ component : "bd-header-code",
9
+ tags : ["autodocs"],
10
+ parameters: {
11
+ layout: "fullscreen",
12
+ docs : {
13
+ description: {
14
+ component: `
15
+ **HeaderCode** is a hero/header variant pairing marketing copy on the left with a
16
+ terminal-style code/demo window on the right. Unlike \`bd-header\`, it has no pricing —
17
+ just eyebrow, title, description, two CTA buttons, and a slotted terminal.
18
+
19
+ The terminal window — including the traffic-light titlebar dots — is owned by
20
+ \`<bd-terminal-message>\`. \`bd-header-code\` additionally renders an optional small
21
+ caption **below** the terminal box via \`terminal-caption\`.
22
+
23
+ ### Usage
24
+ \`\`\`html
25
+ <bd-header-code
26
+ eyebrow="Security for autonomous AI agents"
27
+ title="Bitdefender AI Guardian"
28
+ description="A security layer between your AI agents and the actions they take."
29
+ terminal-caption="AI Guardian CLI · first-run setup"
30
+ >
31
+ <bd-button-link slot="primary-button" label="Download BETA Today" kind="primary">Download BETA Today</bd-button-link>
32
+ <bd-button-link slot="secondary-button" label="See how it works" kind="outline">See how it works</bd-button-link>
33
+
34
+ <bd-terminal-message
35
+ slot="terminal-content"
36
+ show-titlebar
37
+ panel-label="Welcome"
38
+ icon="👋"
39
+ greeting="Hi, I'm AI Guardian."
40
+ intro="I keep an eye on what your AI assistant can access and do:"
41
+ .items=\${["which tools it can use", "which credentials to watch", "which MCP servers to trust"]}
42
+ footer-bold="Let's get started."
43
+ footer="It only takes a minute, and nothing changes until you confirm it."
44
+ show-cursor
45
+ hint="[Enter] to continue · [esc] to cancel"
46
+ ></bd-terminal-message>
47
+ </bd-header-code>
48
+ \`\`\`
49
+
50
+ ### Attributes
51
+ | Attribute | Type | Default | Description |
52
+ |----------------------|--------|---------|-----------------------------------------------------|
53
+ | \`eyebrow\` | String | \`""\` | Small label above the title |
54
+ | \`title\` | String | \`""\` | Main heading (can be overridden via \`title\` slot) |
55
+ | \`description\` | String | \`""\` | Supporting paragraph under the title |
56
+ | \`terminal-caption\` | String | \`""\` | Small caption rendered below the terminal box |
57
+
58
+ ### Slots
59
+ | Slot | Description |
60
+ |---------------------|-----------------------------------------------|
61
+ | \`title\` | Overrides the \`title\` attribute if content is provided |
62
+ | \`primary-button\` | The main CTA (typically \`bd-button-link\`) |
63
+ | \`secondary-button\` | The secondary CTA |
64
+ | \`terminal-content\` | Freeform content rendered on the right (typically a \`bd-terminal-message\`) |
65
+ `
66
+ }
67
+ }
68
+ },
69
+ argTypes: {
70
+ eyebrow : { control: "text", table: { category: "Content" } },
71
+ title : { control: "text", table: { category: "Content" } },
72
+ description : { control: "text", table: { category: "Content" } },
73
+ terminalCaption: { control: "text", table: { category: "Terminal" } }
74
+ }
75
+ };
76
+
77
+ const terminalContent = html`
78
+ <bd-terminal-message
79
+ slot="terminal-content"
80
+ show-titlebar
81
+ panel-label="Welcome"
82
+ icon="👋"
83
+ greeting="Hi, I'm AI Guardian."
84
+ intro="I keep an eye on what your AI assistant can access and do:"
85
+ .items=${["which tools it can use", "which credentials to watch", "which MCP servers to trust"]}
86
+ footer-bold="Let's get started."
87
+ footer="It only takes a minute, and nothing changes until you confirm it."
88
+ show-cursor
89
+ hint="[Enter] to continue · [esc] to cancel"
90
+ ></bd-terminal-message>
91
+ `;
92
+
93
+ const render = (args) => html`
94
+ <bd-header-code
95
+ eyebrow=${args.eyebrow}
96
+ title=${args.title}
97
+ description=${args.description}
98
+ terminal-caption=${args.terminalCaption}
99
+ >
100
+ <bd-button-link
101
+ slot="primary-button"
102
+ label="Download BETA Today"
103
+ kind="primary"
104
+ size="md"
105
+ font-size="18px"
106
+ font-weight="600"
107
+ >Download BETA Today</bd-button-link>
108
+
109
+ <bd-button-link
110
+ slot="secondary-button"
111
+ label="See how it works"
112
+ kind="primary-outline"
113
+ size="md"
114
+ font-size="18px"
115
+ font-weight="600"
116
+ >See how it works</bd-button-link>
117
+
118
+ ${terminalContent}
119
+ </bd-header-code>
120
+ `;
121
+
122
+ export const Default = {
123
+ name: "Default — AI Guardian",
124
+ args: {
125
+ eyebrow : "Security for autonomous AI agents",
126
+ title : "Bitdefender AI Guardian",
127
+ description : "A security layer between your AI agents and the actions they take — policies, guardrails, and monitoring that let agents run safely.",
128
+ terminalCaption: "AI Guardian CLI · first-run setup"
129
+ },
130
+ render,
131
+ parameters: {
132
+ docs: {
133
+ description: {
134
+ story: "Matches the reference design exactly: titlebar says \"Welcome\", the caption below the terminal box says \"AI Guardian CLI · first-run setup\"."
135
+ }
136
+ }
137
+ }
138
+ };
139
+
140
+ export const NoEyebrow = {
141
+ name: "No Eyebrow",
142
+ args: {
143
+ eyebrow : "",
144
+ title : "Bitdefender AI Guardian",
145
+ description : "A security layer between your AI agents and the actions they take.",
146
+ terminalCaption: "AI Guardian CLI"
147
+ },
148
+ render,
149
+ parameters: {
150
+ docs: {
151
+ description: {
152
+ story: "The eyebrow line is optional — omitting it removes the element entirely rather than leaving empty space."
153
+ }
154
+ }
155
+ }
156
+ };
157
+
158
+ export const SingleButton = {
159
+ name: "Single CTA",
160
+ args: {
161
+ eyebrow : "Security for autonomous AI agents",
162
+ title : "Bitdefender AI Guardian",
163
+ description : "A security layer between your AI agents and the actions they take.",
164
+ terminalCaption: "AI Guardian CLI"
165
+ },
166
+ render: (args) => html`
167
+ <bd-header-code
168
+ eyebrow=${args.eyebrow}
169
+ title=${args.title}
170
+ description=${args.description}
171
+ terminal-caption=${args.terminalCaption}
172
+ >
173
+ <bd-button-link
174
+ slot="primary-button"
175
+ label="Download BETA Today"
176
+ kind="primary"
177
+ size="md"
178
+ >Download BETA Today</bd-button-link>
179
+
180
+ ${terminalContent}
181
+ </bd-header-code>
182
+ `,
183
+ parameters: {
184
+ docs: {
185
+ description: {
186
+ story: "Only the primary-button slot is filled — the secondary slot renders nothing since it's empty."
187
+ }
188
+ }
189
+ }
190
+ };
191
+
192
+ export const NoCaption = {
193
+ name: "No Caption",
194
+ args: {
195
+ eyebrow : "Security for autonomous AI agents",
196
+ title : "Bitdefender AI Guardian",
197
+ description : "A security layer between your AI agents and the actions they take.",
198
+ terminalCaption: ""
199
+ },
200
+ render,
201
+ parameters: {
202
+ docs: {
203
+ description: {
204
+ story: "`terminal-caption` omitted — no small caption line under the terminal box."
205
+ }
206
+ }
207
+ }
208
+ };
209
+
210
+ export const Playground = {
211
+ name: "Playground",
212
+ args: {
213
+ eyebrow : "Security for autonomous AI agents",
214
+ title : "Bitdefender AI Guardian",
215
+ description : "A security layer between your AI agents and the actions they take — policies, guardrails, and monitoring that let agents run safely.",
216
+ terminalCaption: "AI Guardian CLI · first-run setup"
217
+ },
218
+ render,
219
+ parameters: {
220
+ docs: {
221
+ description: {
222
+ story: "Fully interactive story — use the Controls panel to edit eyebrow, title, description, and terminal caption live."
223
+ }
224
+ }
225
+ }
226
+ };
@@ -1,6 +1,9 @@
1
1
  import { css } from "lit";
2
2
 
3
3
  export default css`
4
+ :host {
5
+ display: block;
6
+ }
4
7
  @layer bd-components {
5
8
  .bd-heading {
6
9
  margin: 0;
@@ -0,0 +1,27 @@
1
+ // icons/bd-ai-icon.js
2
+ import { LitElement, html } from "lit";
3
+
4
+ class BdAiIcon extends LitElement {
5
+ static properties = {
6
+ width : { type: Number },
7
+ height: { type: Number }
8
+ };
9
+
10
+ constructor() {
11
+ super();
12
+ this.width = 126;
13
+ this.height = 15; // raport identic cu viewBox-ul real (524.8:62.6)
14
+ }
15
+
16
+ createRenderRoot() { return this; }
17
+
18
+ render() {
19
+ return html`
20
+ <svg width="${this.width}" height="${this.height}" viewBox="0 0 524.8 62.6" xmlns="http://www.w3.org/2000/svg">
21
+ <path fill="#006dff" d="M89.8,48.5v-17.8h10.5v-8.3h-10.5v-11.4h-6.2l-3.6,11.4h-9.5v.5l3.6,3.1c5.5,4.5,5.9,4.4,5.9,6.9v-2.2s0,18,0,18c0,12.8,9,15.1,17,13l4.9-7.8-.3-.2c-6.8,2-11.7,1.8-11.7-5.2ZM62.8,3.2c-3.6,0-6.2,2.8-6.2,5.9s2.6,5.9,6.2,5.9,6.4-2.5,6.4-5.9-2.8-5.9-6.4-5.9ZM37.2,31.2v-.2c6-1.8,10-6.1,10-12.7,0-10.5-9-14.5-17.7-14.5H8.4s-8.4,0-8.4,0v.9l3,2.5c3.6,2.9,4,3.5,4,6.1v48.4h20.8c10.9,0,21.9-3.9,21.9-16.5s-5.2-13.2-12.5-14ZM17.3,12.6h8.5c5.7,0,7.5.8,9.3,2.5,1.3,1.2,1.9,3,1.9,5s-.6,3.5-2,4.8c-1.7,1.6-4,2.4-8.3,2.4h-9.4v-14.7ZM26.8,52.8h-9.5v-16.7h9.9c8.3,0,12.2,2.1,12.2,8.2s-7.3,8.5-12.7,8.5ZM130.8,2.1l3.1,2c2.8,1.8,3.2,2.6,3.2,5.1v18.2h-.2c-2-2.5-6-6-13.3-6-11.2,0-19,9-19,20.6s7.3,20.6,19.4,20.6,10.6-2.1,13.5-6.9h.2l1,5.9h8.3V1.4h-16.1v.7ZM125.9,53.8c-7.2,0-11.5-5.6-11.5-11.8s4.3-11.8,11.5-11.8,11.5,5.6,11.5,11.8-4.3,11.8-11.5,11.8ZM52.7,23.1l1.6,1.3c3.5,2.7,3.7,3.2,3.7,6.5h0v30.8h9.8V22.4h-15.1v.6ZM376.8,21.4c-11.8,0-20.5,8.3-20.5,20.6s9.1,20.6,22.2,20.6,7.4-.7,10.5-1.9l5.6-9.3-.7-.4c-4.8,2.5-9.9,3.8-14.4,3.8-6.8,0-12.6-3.4-13.3-9.3h29.9c1.3-15.4-7-24-19.2-24ZM366.1,38.1c.7-5.6,4.3-9.3,10.1-9.3s9.9,3.6,10,9.3h-20.1ZM412.3,28.6h-.2v-6.2h-16.5v.4s2.5,1.6,2.5,1.6c4,2.5,4.2,3.3,4.2,8.2v29h9.8v-21c0-2.1,1.3-9.9,10.5-9.9s3.1.3,4.7.7v-9.5c-1.1-.3-2.3-.6-3.5-.6-5.2,0-9.5,2.7-11.6,7.2ZM334.1,2.1l1.4.9c4.7,3,5.3,3.9,5.3,9v15.4h-.3c-2-2.5-6-6-13.3-6-11.2,0-19,9-19,20.6s7.3,20.6,19.4,20.6,10.6-2.1,13.5-6.9h.2l1,5.9h8.3V1.4h-16.5v.7ZM329.6,53.8c-7.2,0-11.5-5.6-11.5-11.8s4.3-11.8,11.5-11.8,11.5,5.6,11.5,11.8-4.3,11.8-11.5,11.8ZM288.1,21.4c-4.4,0-9.3,2.2-12.5,7h-.2v-6h-8.4s-7.7,0-7.7,0v.4l2.4,1.6c4,2.5,4.3,3.3,4.3,8.2v29h9.8v-21.4c0-5.2,2.5-10,9-10s8,5.2,8,9.6v21.8h9.8v-24.8c0-9.1-5.3-15.4-14.6-15.4ZM239.8,21.4c-11.9,0-20.5,8.3-20.5,20.6s9.1,20.6,22.2,20.6,7.4-.7,10.5-1.9l5.6-9.3-.8-.4c-4.8,2.5-9.9,3.8-14.4,3.8-6.8,0-12.6-3.4-13.3-9.3h29.9c1.3-15.4-7-24-19.2-24ZM229.1,38.1c.7-5.6,4.3-9.3,10.1-9.3s9.9,3.6,10,9.3h-20.1ZM173.1,21.4c-11.9,0-20.5,8.3-20.5,20.6s9.1,20.6,22.2,20.6,7.4-.7,10.5-1.9l5.6-9.3-.7-.4c-4.8,2.5-9.9,3.8-14.4,3.8-6.8,0-12.6-3.4-13.3-9.3h29.9v-2.7c0-13.6-8.3-21.3-19.2-21.3ZM162.4,38.1c.7-5.6,4.3-9.3,10.1-9.3s9.9,3.6,10,9.3h-20.1ZM209.8,15.1c0-6.9,6.1-8.8,13.9-5.7l.5-.4-2.3-8.3c-15-3-22,3.7-22,14.4v7.2h-9.6v.6l5,4.1c3.9,3.1,4.6,3.8,4.6,7.1v27.6h9.8v-31h9.1v-8.4h-9.1v-7.1ZM524.8,9.6V3.9h-23.2v5.8h8.1v46.2h-8.1v5.8h23.2v-5.8h-8.1V9.6h8.1ZM467.4,3.9l-20.2,57.7h7l5.8-17h23.3l5.8,17h7.3l-20.2-57.7h-8.9ZM461.7,38.4l9.8-28.1h.4l9.8,28.1h-19.9Z"/>
22
+ </svg>
23
+ `;
24
+ }
25
+ }
26
+
27
+ customElements.define("bd-ai-icon", BdAiIcon);
@@ -11,7 +11,7 @@ export default css`
11
11
  gap: var(--spacing-8);
12
12
  color: var(--color-neutral-700);
13
13
  line-height: var(--typography-lineHeight-normal);
14
- font-family: var(--typography-fontFamily-sans);
14
+ font-family: var(--font-family-mono);
15
15
  }
16
16
 
17
17
  /* === SIZE VARIANTS === */
@@ -47,7 +47,7 @@ export default css`
47
47
  --bd-li-marker-size: var(--spacing-6);
48
48
  width: var(--bd-li-marker-size);
49
49
  height: var(--bd-li-marker-size);
50
- background-color: var(--color-neutral-1000);
50
+ background-color: var(--bd-li-marker-color, var(--color-neutral-1000));
51
51
  border-radius: 50%;
52
52
  }
53
53
 
@@ -63,7 +63,7 @@ export default css`
63
63
  .bd-list-item.number .bd-list-item-marker::before {
64
64
  content: counter(bd-list-counter) ".";
65
65
  font-weight: var(--typography-fontWeight-semibold);
66
- color: var(--color-neutral-1000);
66
+ color: var(--bd-li-marker-color, var(--color-neutral-1000));
67
67
  }
68
68
 
69
69
  /* Check List */
@@ -4,9 +4,10 @@ import listItemCSS from "./list-item.css.js";
4
4
 
5
5
  export class BdListItem extends LitElement {
6
6
  static properties = {
7
- kind: { type: String }, // bullet, number, check, none
8
- size: { type: String }, // sm, md, lg
9
- icon: { type: String } // custom icon URL
7
+ kind : { type: String }, // bullet, number, check, none
8
+ size : { type: String }, // sm, md, lg
9
+ icon : { type: String }, // custom icon URL
10
+ color: { type: String } // optional
10
11
  };
11
12
 
12
13
  constructor() {
@@ -14,11 +15,16 @@ export class BdListItem extends LitElement {
14
15
  this.kind = "bullet";
15
16
  this.size = "md";
16
17
  this.icon = "";
18
+ this.color = "";
17
19
  }
18
20
 
19
21
  render() {
22
+ const style = this.color
23
+ ? `color: ${this.color}; --bd-li-marker-color: ${this.color};`
24
+ : "";
25
+
20
26
  return html`
21
- <li class="bd-list-item ${this.kind} ${this.size}">
27
+ <li class="bd-list-item ${this.kind} ${this.size}" style="${style}">
22
28
  ${this._renderMarker()}
23
29
  <span class="bd-list-item-content">
24
30
  <slot></slot>
@@ -0,0 +1,121 @@
1
+ import { css } from "lit";
2
+
3
+ export default css`
4
+ :host {
5
+ display: block;
6
+ font-family: var(--typography-fontFamily-sans);
7
+ }
8
+
9
+ .bd-infopanel-container {
10
+ display: grid;
11
+ grid-template-columns: 1fr 1fr;
12
+ grid-template-rows: auto auto;
13
+ column-gap: var(--spacing-48);
14
+ row-gap: 0;
15
+ max-width: var(--layout-ensemble-max-width, 1200px);
16
+ margin: 0 auto;
17
+ padding: var(--spacing-48) var(--layout-ensemble-inline-padding, var(--spacing-24));
18
+ box-sizing: border-box;
19
+ }
20
+
21
+ /* Title spans both columns on its own row */
22
+ .bd-infopanel-title {
23
+ grid-column: 1 / -1;
24
+ grid-row: 1;
25
+ margin: 0;
26
+ color: var(--color-neutral-1000);
27
+ line-height: var(--typography-lineHeight-tight, 1.1);
28
+ margin-bottom: var(--spacing-48);
29
+ }
30
+
31
+ /* === LEFT COLUMN (description) === */
32
+ .bd-infopanel-left {
33
+ grid-column: 1;
34
+ grid-row: 2;
35
+ display: flex;
36
+ flex-direction: column;
37
+ gap: var(--spacing-16);
38
+ }
39
+
40
+ .bd-infopanel-description {
41
+ margin: 0;
42
+ color: var(--color-neutral-900);
43
+ max-width: 46ch;
44
+ line-height: 1.5;
45
+ font-family: var(--typography-fontFamily-sans);
46
+ }
47
+
48
+ /* === RIGHT COLUMN (facts) === */
49
+ .bd-infopanel-right {
50
+ grid-column: 2;
51
+ grid-row: 2;
52
+ display: flex;
53
+ flex-direction: column;
54
+ }
55
+
56
+ .bd-infopanel-row {
57
+ display: flex;
58
+ flex-direction: column;
59
+ gap: var(--spacing-4);
60
+ padding-top: var(--spacing-16);
61
+ padding-bottom: var(--spacing-24);
62
+ }
63
+
64
+ .bd-infopanel-row:first-of-type {
65
+ padding-top: 0;
66
+ }
67
+
68
+ .bd-infopanel-row:last-of-type {
69
+ padding-bottom: 0;
70
+ }
71
+
72
+ .bd-infopanel-divider {
73
+ border-top: 2px solid var(--color-blue-500);
74
+ margin-bottom: var(--spacing-16);
75
+ }
76
+
77
+ .bd-infopanel-label {
78
+ margin: 0;
79
+ color: var(--color-neutral-600);
80
+ text-transform: uppercase;
81
+ letter-spacing: .1em;
82
+ font-family: var(--typography-fontFamily-mono, monospace);
83
+ font-size: var(--typography-fontSize-xxs);
84
+ }
85
+
86
+ .bd-infopanel-value {
87
+ margin: 0;
88
+ color: var(--color-neutral-1000);
89
+ font-weight: var(--typography-fontWeight-bold, 700);
90
+ }
91
+
92
+ /* === RESPONSIVE === */
93
+ @media (max-width: 899px) {
94
+ .bd-infopanel-container {
95
+ grid-template-columns: 1fr;
96
+ grid-template-rows: auto auto auto;
97
+ gap: var(--spacing-32);
98
+ padding: var(--spacing-32) var(--spacing-24);
99
+ }
100
+
101
+ .bd-infopanel-title {
102
+ grid-column: 1;
103
+ grid-row: 1;
104
+ margin-bottom: var(--spacing-16);
105
+ }
106
+
107
+ .bd-infopanel-left {
108
+ grid-column: 1;
109
+ grid-row: 2;
110
+ }
111
+
112
+ .bd-infopanel-right {
113
+ grid-column: 1;
114
+ grid-row: 3;
115
+ }
116
+
117
+ .bd-infopanel-description {
118
+ max-width: none;
119
+ }
120
+ }
121
+ `;