@repobit/dex-system-design 0.23.79 → 0.23.81
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/CHANGELOG.md +14 -0
- package/package.json +4 -4
- package/src/components/cards/card.css.js +21 -25
- package/src/components/cards/card.js +25 -24
- package/src/components/cards/card.stories.js +200 -134
package/CHANGELOG.md
CHANGED
|
@@ -3,6 +3,20 @@
|
|
|
3
3
|
All notable changes to this project will be documented in this file.
|
|
4
4
|
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
|
5
5
|
|
|
6
|
+
## [0.23.81](https://github.com/bitdefender/dex-core/compare/@repobit/dex-system-design@0.23.80...@repobit/dex-system-design@0.23.81) (2026-07-15)
|
|
7
|
+
|
|
8
|
+
### Bug Fixes
|
|
9
|
+
|
|
10
|
+
* **DEX-1014:** card adjustments
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
## [0.23.80](https://github.com/bitdefender/dex-core/compare/@repobit/dex-system-design@0.23.79...@repobit/dex-system-design@0.23.80) (2026-07-14)
|
|
14
|
+
|
|
15
|
+
### Bug Fixes
|
|
16
|
+
|
|
17
|
+
* **DEX-1014:** card adjustments
|
|
18
|
+
|
|
19
|
+
|
|
6
20
|
## [0.23.79](https://github.com/bitdefender/dex-core/compare/@repobit/dex-system-design@0.23.78...@repobit/dex-system-design@0.23.79) (2026-07-14)
|
|
7
21
|
|
|
8
22
|
### Bug Fixes
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@repobit/dex-system-design",
|
|
3
|
-
"version": "0.23.
|
|
3
|
+
"version": "0.23.81",
|
|
4
4
|
"description": "Design system based on Web Components.",
|
|
5
5
|
"author": "Iordache Matei Cezar <miordache@bitdefender.com>",
|
|
6
6
|
"homepage": "https://github.com/bitdefender/dex-core#readme",
|
|
@@ -74,8 +74,8 @@
|
|
|
74
74
|
"url": "https://github.com/bitdefender/dex-core/issues"
|
|
75
75
|
},
|
|
76
76
|
"dependencies": {
|
|
77
|
-
"@repobit/dex-store": "1.3.
|
|
78
|
-
"@repobit/dex-store-elements": "1.4.
|
|
77
|
+
"@repobit/dex-store": "1.3.77",
|
|
78
|
+
"@repobit/dex-store-elements": "1.4.69",
|
|
79
79
|
"lit": "^3.3.2"
|
|
80
80
|
},
|
|
81
81
|
"devDependencies": {
|
|
@@ -92,5 +92,5 @@
|
|
|
92
92
|
"volta": {
|
|
93
93
|
"node": "24.14.0"
|
|
94
94
|
},
|
|
95
|
-
"gitHead": "
|
|
95
|
+
"gitHead": "0a6dda02af7ad726b421f3d85ac5ee7da71723f7"
|
|
96
96
|
}
|
|
@@ -7,8 +7,6 @@ export default css`
|
|
|
7
7
|
--border-card-grey: var(--color-neutral-50);
|
|
8
8
|
max-width: 1290px;
|
|
9
9
|
margin: 0 auto;
|
|
10
|
-
|
|
11
|
-
|
|
12
10
|
}
|
|
13
11
|
|
|
14
12
|
::slotted([slot="icon"]) {
|
|
@@ -52,24 +50,20 @@ export default css`
|
|
|
52
50
|
flex-direction: column;
|
|
53
51
|
max-width: 1400px;
|
|
54
52
|
margin: 0 auto;
|
|
55
|
-
|
|
53
|
+
padding-top: var(--spacing-64);
|
|
54
|
+
padding-bottom: var(--spacing-64);
|
|
56
55
|
}
|
|
57
56
|
|
|
58
57
|
.bd-light-carousel-track-s {
|
|
59
|
-
scroll-behavior: smooth;
|
|
60
|
-
flex: 1;
|
|
61
58
|
position: relative;
|
|
62
59
|
padding: var(--spacing-0) var(--spacing-20);
|
|
63
|
-
overflow-x: auto;
|
|
64
|
-
overflow-y: hidden;
|
|
65
60
|
scrollbar-width: none;
|
|
66
61
|
-ms-overflow-style: none;
|
|
67
62
|
z-index: 1;
|
|
68
|
-
scroll-snap-type: x mandatory;
|
|
69
63
|
display: grid;
|
|
70
64
|
gap: 1.5rem;
|
|
71
|
-
|
|
72
|
-
|
|
65
|
+
width: 100%;
|
|
66
|
+
box-sizing: border-box;
|
|
73
67
|
}
|
|
74
68
|
|
|
75
69
|
.bd-light-carousel-track-s::-webkit-scrollbar {
|
|
@@ -88,16 +82,21 @@ export default css`
|
|
|
88
82
|
transition: transform 0.2s ease-in-out;
|
|
89
83
|
position: relative;
|
|
90
84
|
z-index: 2;
|
|
91
|
-
scroll-snap-align: start;
|
|
92
85
|
font-family: var(--typography-fontFamily-sans);
|
|
93
86
|
box-sizing: border-box;
|
|
94
87
|
}
|
|
95
88
|
|
|
89
|
+
.bd-light-box-blue {
|
|
90
|
+
background: #E4F2FF !important;
|
|
91
|
+
}
|
|
92
|
+
|
|
96
93
|
.bd-light-box-no-content {
|
|
97
94
|
justify-content: center !important;
|
|
98
95
|
align-items: center !important;
|
|
99
96
|
text-align: center !important;
|
|
100
97
|
gap: var(--spacing-32);
|
|
98
|
+
width: clamp(200px, 100%, 300px);
|
|
99
|
+
|
|
101
100
|
}
|
|
102
101
|
|
|
103
102
|
.bd-light-box-center {
|
|
@@ -239,31 +238,28 @@ export default css`
|
|
|
239
238
|
|
|
240
239
|
@media (max-width: 768px) {
|
|
241
240
|
.bd-light-carousel-track-s {
|
|
242
|
-
display:
|
|
243
|
-
|
|
241
|
+
display: grid !important;
|
|
242
|
+
grid-template-columns: 1fr !important;
|
|
244
243
|
gap: var(--spacing-20);
|
|
245
244
|
overflow-x: hidden;
|
|
246
|
-
overflow-y: hidden;
|
|
247
|
-
scroll-behavior: smooth;
|
|
248
245
|
}
|
|
249
246
|
|
|
250
|
-
.bd-light-box-s
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
display: none;
|
|
247
|
+
.bd-light-box-s,
|
|
248
|
+
.bd-light-box-no-content {
|
|
249
|
+
width: clamp(200px, 100%, 300px);
|
|
250
|
+
max-width: 100% !important;
|
|
251
|
+
min-width: 0 !important;
|
|
252
|
+
margin: 0 !important;
|
|
253
|
+
box-sizing: border-box !important;
|
|
258
254
|
}
|
|
259
255
|
}
|
|
260
256
|
|
|
261
257
|
@media (max-width: 480px) {
|
|
262
258
|
.bd-light-box-s {
|
|
263
|
-
width: 100%;
|
|
264
259
|
padding: 1em;
|
|
265
260
|
}
|
|
266
|
-
|
|
261
|
+
.bd-light-carousel-track-s{
|
|
262
|
+
padding: 0 !important; }
|
|
267
263
|
.bd-light-box-s h3 {
|
|
268
264
|
font-size: 1em;
|
|
269
265
|
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { LitElement, html } from "lit";
|
|
2
2
|
import { tokens } from "../../tokens/tokens.js";
|
|
3
|
-
import "../
|
|
3
|
+
import "../button/button.js";
|
|
4
4
|
import "../heading/heading.js";
|
|
5
5
|
import carouselCSS from "./card.css.js";
|
|
6
6
|
|
|
@@ -8,6 +8,7 @@ class Card extends LitElement {
|
|
|
8
8
|
static properties = {
|
|
9
9
|
title : { type: String },
|
|
10
10
|
subtitle : { type: String },
|
|
11
|
+
bgBlue : { type: Boolean, reflect: true, attribute: "bg-blue" },
|
|
11
12
|
_itemCount: { state: true }
|
|
12
13
|
};
|
|
13
14
|
|
|
@@ -15,6 +16,7 @@ class Card extends LitElement {
|
|
|
15
16
|
super();
|
|
16
17
|
this.title = "";
|
|
17
18
|
this.subtitle = "";
|
|
19
|
+
this.bgBlue = false;
|
|
18
20
|
this._itemCount = 0;
|
|
19
21
|
this._resizeObserver = null;
|
|
20
22
|
}
|
|
@@ -41,34 +43,28 @@ class Card extends LitElement {
|
|
|
41
43
|
const titleW = item.renderRoot?.querySelector(".bd-light-title-badge-wrapper-s");
|
|
42
44
|
const contentW = item.renderRoot?.querySelector(".bd-card-content-wrapper");
|
|
43
45
|
|
|
44
|
-
if (box) { box.style.
|
|
45
|
-
if (iconW) { iconW.style.height
|
|
46
|
-
if (titleW) { titleW.style.height
|
|
46
|
+
if (box) { box.style.cssText = ""; }
|
|
47
|
+
if (iconW) { iconW.style.height = ""; }
|
|
48
|
+
if (titleW) { titleW.style.height = ""; }
|
|
47
49
|
if (contentW) { contentW.style.height = ""; }
|
|
48
50
|
});
|
|
49
51
|
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
const box = item.renderRoot?.querySelector(".bd-light-box-s");
|
|
54
|
-
if (!box) return;
|
|
55
|
-
const rect = box.getBoundingClientRect();
|
|
56
|
-
if (rect.width > maxW) maxW = rect.width;
|
|
57
|
-
});
|
|
58
|
-
|
|
59
|
-
if (maxW > 0) {
|
|
52
|
+
const sectionW = this.getBoundingClientRect().width;
|
|
53
|
+
if (sectionW > 0) {
|
|
54
|
+
requestAnimationFrame(() => {
|
|
60
55
|
items.forEach(item => {
|
|
61
56
|
const box = item.renderRoot?.querySelector(".bd-light-box-s");
|
|
62
57
|
if (box) {
|
|
63
|
-
box.style.width = `${
|
|
64
|
-
box.style.minWidth = `${
|
|
58
|
+
box.style.width = `${sectionW}px`;
|
|
59
|
+
box.style.minWidth = `${sectionW}px`;
|
|
65
60
|
}
|
|
66
61
|
});
|
|
67
|
-
}
|
|
68
|
-
}
|
|
62
|
+
});
|
|
63
|
+
}
|
|
69
64
|
|
|
70
65
|
return;
|
|
71
66
|
}
|
|
67
|
+
|
|
72
68
|
items.forEach(item => {
|
|
73
69
|
const box = item.renderRoot?.querySelector(".bd-light-box-s");
|
|
74
70
|
const iconW = item.renderRoot?.querySelector(".bd-light-box-header-s");
|
|
@@ -76,8 +72,8 @@ class Card extends LitElement {
|
|
|
76
72
|
const contentW = item.renderRoot?.querySelector(".bd-card-content-wrapper");
|
|
77
73
|
|
|
78
74
|
if (box) { box.style.height = "auto"; box.style.minHeight = "0"; box.style.width = "auto"; }
|
|
79
|
-
if (iconW) { iconW.style.height
|
|
80
|
-
if (titleW) { titleW.style.height
|
|
75
|
+
if (iconW) { iconW.style.height = "auto"; }
|
|
76
|
+
if (titleW) { titleW.style.height = "auto"; }
|
|
81
77
|
if (contentW) { contentW.style.height = "auto"; }
|
|
82
78
|
});
|
|
83
79
|
|
|
@@ -208,6 +204,7 @@ class CardItem extends LitElement {
|
|
|
208
204
|
subtitle: { type: String },
|
|
209
205
|
icon : { type: String },
|
|
210
206
|
align : { type: String },
|
|
207
|
+
bgBlue : { type: Boolean, reflect: true, attribute: "bg-blue" },
|
|
211
208
|
ctaAlign: { type: String, attribute: "cta-align" }
|
|
212
209
|
};
|
|
213
210
|
|
|
@@ -217,6 +214,7 @@ class CardItem extends LitElement {
|
|
|
217
214
|
this.subtitle = "";
|
|
218
215
|
this.icon = "";
|
|
219
216
|
this.align = "start";
|
|
217
|
+
this.bgBlue = false;
|
|
220
218
|
this.ctaAlign = "start";
|
|
221
219
|
}
|
|
222
220
|
|
|
@@ -224,8 +222,7 @@ class CardItem extends LitElement {
|
|
|
224
222
|
const iconEl = this.querySelector("[slot='icon']");
|
|
225
223
|
|
|
226
224
|
if (iconEl) {
|
|
227
|
-
const clone
|
|
228
|
-
|
|
225
|
+
const clone = iconEl.cloneNode(true);
|
|
229
226
|
const originalW = iconEl.getAttribute("width");
|
|
230
227
|
const originalH = iconEl.getAttribute("height");
|
|
231
228
|
|
|
@@ -286,8 +283,12 @@ class CardItem extends LitElement {
|
|
|
286
283
|
: "justify-content: flex-start;";
|
|
287
284
|
|
|
288
285
|
return html`
|
|
289
|
-
<div
|
|
290
|
-
|
|
286
|
+
<div
|
|
287
|
+
class="bd-light-box-s
|
|
288
|
+
${isCentered ? "bd-light-box-center" : ""}
|
|
289
|
+
${!hasContent ? "bd-light-box-no-content" : ""}
|
|
290
|
+
${this.bgBlue ? "bd-light-box-blue" : ""}"
|
|
291
|
+
>
|
|
291
292
|
<div class="bd-light-box-header-s ${isCentered ? "bd-light-box-header-center" : ""}">
|
|
292
293
|
${this._renderIcon()}
|
|
293
294
|
</div>
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { html } from 'lit';
|
|
2
|
-
import '../
|
|
2
|
+
import '../button/button.js';
|
|
3
3
|
import '../heading/heading.js';
|
|
4
4
|
import '../icons/analysis-icon.js';
|
|
5
5
|
import '../icons/arrow-up-icon.js';
|
|
@@ -19,13 +19,13 @@ export default {
|
|
|
19
19
|
component: `
|
|
20
20
|
**Card** and **CardItem** are Lit components for a static card grid layout.
|
|
21
21
|
|
|
22
|
-
- \`<bd-card-section>\` —
|
|
23
|
-
- \`<bd-card-item>\` — individual card with optional icon, title, alignment, slotted content, and
|
|
22
|
+
- \`<bd-card-section>\` — section wrapper with optional title and subtitle
|
|
23
|
+
- \`<bd-card-item>\` — individual card with optional icon, title, subtitle, alignment, slotted content, CTA button, and blue background
|
|
24
24
|
|
|
25
25
|
### Usage
|
|
26
26
|
\`\`\`html
|
|
27
|
-
<bd-card-section title="Why Bitdefender" subtitle="
|
|
28
|
-
<bd-card-item title="AI Protection" align="center">
|
|
27
|
+
<bd-card-section title="Why Bitdefender" subtitle="Optional subtitle">
|
|
28
|
+
<bd-card-item title="AI Protection" align="center" bg-blue cta-align="center">
|
|
29
29
|
<bd-individual-icon slot="icon" width="32" height="32" color="#006DFF"></bd-individual-icon>
|
|
30
30
|
<bd-p>Powered by machine learning.</bd-p>
|
|
31
31
|
<bd-button-link slot="cta" href="#" kind="primary" size="sm">Learn more</bd-button-link>
|
|
@@ -33,25 +33,21 @@ export default {
|
|
|
33
33
|
</bd-card-section>
|
|
34
34
|
\`\`\`
|
|
35
35
|
|
|
36
|
-
###
|
|
37
|
-
|
|
|
38
|
-
|
|
39
|
-
| \`
|
|
40
|
-
|
|
|
36
|
+
### CardItem Slots
|
|
37
|
+
| Slot | Descriere |
|
|
38
|
+
|---|---|
|
|
39
|
+
| \`icon\` | Iconiță sau imagine (max 120x120px automat) |
|
|
40
|
+
| default | Conținut text |
|
|
41
|
+
| \`cta\` | Buton CTA jos |
|
|
41
42
|
|
|
42
43
|
### CardItem Props
|
|
43
44
|
| Prop | Valori | Default |
|
|
44
45
|
|---|---|---|
|
|
45
46
|
| \`title\` | String | \`''\` |
|
|
47
|
+
| \`subtitle\` | String | \`''\` |
|
|
46
48
|
| \`align\` | \`start\`, \`center\` | \`start\` |
|
|
47
|
-
| \`
|
|
48
|
-
|
|
49
|
-
### CardItem Slots
|
|
50
|
-
| Slot | Descriere |
|
|
51
|
-
|---|---|
|
|
52
|
-
| \`icon\` | Iconiță sau imagine (max 120x120px automat) |
|
|
53
|
-
| default | Conținut text — \`bd-p\`, liste, etc. |
|
|
54
|
-
| \`cta\` | Buton CTA jos stânga — \`bd-button-link\` sau \`bd-button\` |
|
|
49
|
+
| \`bg-blue\` | Boolean | \`false\` |
|
|
50
|
+
| \`cta-align\` | \`start\`, \`center\`, \`end\` | \`start\` |
|
|
55
51
|
`
|
|
56
52
|
}
|
|
57
53
|
}
|
|
@@ -64,7 +60,7 @@ export default {
|
|
|
64
60
|
},
|
|
65
61
|
sectionSubtitle: {
|
|
66
62
|
control : 'text',
|
|
67
|
-
description: 'Optional subtitle for the card section
|
|
63
|
+
description: 'Optional subtitle for the card section',
|
|
68
64
|
table : { type: { summary: 'string' }, defaultValue: { summary: '' }, category: 'CardSection' }
|
|
69
65
|
},
|
|
70
66
|
itemTitle: {
|
|
@@ -75,12 +71,25 @@ export default {
|
|
|
75
71
|
align: {
|
|
76
72
|
control : { type: 'select' },
|
|
77
73
|
options : ['start', 'center'],
|
|
78
|
-
description: 'Alignment of card content
|
|
74
|
+
description: 'Alignment of card content',
|
|
79
75
|
table : { type: { summary: "'start' | 'center'" }, defaultValue: { summary: 'start' }, category: 'CardItem' }
|
|
76
|
+
},
|
|
77
|
+
bgBlue: {
|
|
78
|
+
control : 'boolean',
|
|
79
|
+
description: 'Blue background (#E4F2FF) on card',
|
|
80
|
+
table : { type: { summary: 'boolean' }, defaultValue: { summary: 'false' }, category: 'CardItem' }
|
|
81
|
+
},
|
|
82
|
+
ctaAlign: {
|
|
83
|
+
control : { type: 'select' },
|
|
84
|
+
options : ['start', 'center', 'end'],
|
|
85
|
+
description: 'CTA button alignment',
|
|
86
|
+
table : { type: { summary: "'start' | 'center' | 'end'" }, defaultValue: { summary: 'start' }, category: 'CardItem' }
|
|
80
87
|
}
|
|
81
88
|
}
|
|
82
89
|
};
|
|
83
90
|
|
|
91
|
+
// ─── Default ──────────────────────────────────────────────────────────────────
|
|
92
|
+
|
|
84
93
|
export const Default = {
|
|
85
94
|
name : 'Default (4 items)',
|
|
86
95
|
render: () => html`
|
|
@@ -103,39 +112,43 @@ export const Default = {
|
|
|
103
112
|
</bd-card-item>
|
|
104
113
|
</bd-card-section>
|
|
105
114
|
`,
|
|
106
|
-
parameters: { docs: { description: { story: '
|
|
115
|
+
parameters: { docs: { description: { story: '4 card items cu iconițe, titluri și conținut.' } } }
|
|
107
116
|
};
|
|
108
117
|
|
|
109
|
-
|
|
110
|
-
|
|
118
|
+
// ─── With Blue Background ─────────────────────────────────────────────────────
|
|
119
|
+
|
|
120
|
+
export const WithBlueBg = {
|
|
121
|
+
name : 'With Blue Background',
|
|
111
122
|
render: () => html`
|
|
112
|
-
<bd-card-section title="Why Bitdefender"
|
|
113
|
-
<bd-card-item title="AI Protection">
|
|
123
|
+
<bd-card-section title="Why Bitdefender">
|
|
124
|
+
<bd-card-item title="AI Protection" bg-blue>
|
|
114
125
|
<bd-individual-icon slot="icon" width="32" height="32" color="#006DFF"></bd-individual-icon>
|
|
115
126
|
<bd-p>Powered by machine learning and behavioral analysis.</bd-p>
|
|
116
127
|
</bd-card-item>
|
|
117
|
-
<bd-card-item title="Multi-layer Security">
|
|
128
|
+
<bd-card-item title="Multi-layer Security" bg-blue>
|
|
118
129
|
<bd-globe-icon slot="icon" width="32" height="32" color="#006DFF"></bd-globe-icon>
|
|
119
130
|
<bd-p>Multiple independent protection layers stop any attack.</bd-p>
|
|
120
131
|
</bd-card-item>
|
|
121
|
-
<bd-card-item title="VPN Included">
|
|
132
|
+
<bd-card-item title="VPN Included" bg-blue>
|
|
122
133
|
<bd-machine-learning-icon slot="icon" width="32" height="32" color="#006DFF"></bd-machine-learning-icon>
|
|
123
134
|
<bd-p>Unlimited encrypted VPN traffic for all your devices.</bd-p>
|
|
124
135
|
</bd-card-item>
|
|
125
|
-
<bd-card-item title="Parental Controls">
|
|
136
|
+
<bd-card-item title="Parental Controls" bg-blue>
|
|
126
137
|
<bd-analysis-icon slot="icon" width="32" height="32" color="#006DFF"></bd-analysis-icon>
|
|
127
138
|
<bd-p>Advanced controls to protect your children online.</bd-p>
|
|
128
139
|
</bd-card-item>
|
|
129
140
|
</bd-card-section>
|
|
130
141
|
`,
|
|
131
|
-
parameters: { docs: { description: { story: '
|
|
142
|
+
parameters: { docs: { description: { story: 'Toate cardurile cu `bg-blue` — fundal #E4F2FF.' } } }
|
|
132
143
|
};
|
|
133
144
|
|
|
134
|
-
|
|
135
|
-
|
|
145
|
+
// ─── Mixed Blue Background ────────────────────────────────────────────────────
|
|
146
|
+
|
|
147
|
+
export const MixedBlueBg = {
|
|
148
|
+
name : 'Mixed — Some Blue',
|
|
136
149
|
render: () => html`
|
|
137
|
-
<bd-card-section
|
|
138
|
-
<bd-card-item title="AI Protection">
|
|
150
|
+
<bd-card-section title="Features">
|
|
151
|
+
<bd-card-item title="AI Protection" bg-blue>
|
|
139
152
|
<bd-individual-icon slot="icon" width="32" height="32" color="#006DFF"></bd-individual-icon>
|
|
140
153
|
<bd-p>Powered by machine learning and behavioral analysis.</bd-p>
|
|
141
154
|
</bd-card-item>
|
|
@@ -143,19 +156,25 @@ export const SectionSubtitleOnly = {
|
|
|
143
156
|
<bd-globe-icon slot="icon" width="32" height="32" color="#006DFF"></bd-globe-icon>
|
|
144
157
|
<bd-p>Multiple independent protection layers stop any attack.</bd-p>
|
|
145
158
|
</bd-card-item>
|
|
146
|
-
<bd-card-item title="VPN Included">
|
|
159
|
+
<bd-card-item title="VPN Included" bg-blue>
|
|
147
160
|
<bd-machine-learning-icon slot="icon" width="32" height="32" color="#006DFF"></bd-machine-learning-icon>
|
|
148
161
|
<bd-p>Unlimited encrypted VPN traffic for all your devices.</bd-p>
|
|
149
162
|
</bd-card-item>
|
|
163
|
+
<bd-card-item title="Parental Controls">
|
|
164
|
+
<bd-analysis-icon slot="icon" width="32" height="32" color="#006DFF"></bd-analysis-icon>
|
|
165
|
+
<bd-p>Advanced controls to protect your children online.</bd-p>
|
|
166
|
+
</bd-card-item>
|
|
150
167
|
</bd-card-section>
|
|
151
168
|
`,
|
|
152
|
-
parameters: { docs: { description: { story: '
|
|
169
|
+
parameters: { docs: { description: { story: 'Mix de carduri cu și fără `bg-blue`.' } } }
|
|
153
170
|
};
|
|
154
171
|
|
|
172
|
+
// ─── With CTA ─────────────────────────────────────────────────────────────────
|
|
173
|
+
|
|
155
174
|
export const WithCTA = {
|
|
156
175
|
name : 'With CTA Button',
|
|
157
176
|
render: () => html`
|
|
158
|
-
<bd-card-section title="Why Bitdefender"
|
|
177
|
+
<bd-card-section title="Why Bitdefender">
|
|
159
178
|
<bd-card-item title="AI Protection">
|
|
160
179
|
<bd-individual-icon slot="icon" width="32" height="32" color="#006DFF"></bd-individual-icon>
|
|
161
180
|
<bd-p>Powered by machine learning and behavioral analysis to stop threats before they reach you.</bd-p>
|
|
@@ -178,19 +197,73 @@ export const WithCTA = {
|
|
|
178
197
|
</bd-card-item>
|
|
179
198
|
</bd-card-section>
|
|
180
199
|
`,
|
|
181
|
-
parameters: { docs: { description: { story: 'Cards
|
|
200
|
+
parameters: { docs: { description: { story: 'Cards cu buton CTA via `slot="cta"`.' } } }
|
|
182
201
|
};
|
|
183
202
|
|
|
203
|
+
// ─── With CTA Centered ────────────────────────────────────────────────────────
|
|
204
|
+
|
|
205
|
+
export const WithCTACentered = {
|
|
206
|
+
name : 'With CTA — Centered',
|
|
207
|
+
render: () => html`
|
|
208
|
+
<bd-card-section title="Features">
|
|
209
|
+
<bd-card-item title="AI Protection" cta-align="center">
|
|
210
|
+
<bd-individual-icon slot="icon" width="32" height="32" color="#006DFF"></bd-individual-icon>
|
|
211
|
+
<bd-p>Powered by machine learning.</bd-p>
|
|
212
|
+
<bd-button-link slot="cta" href="#" kind="danger" size="sm">Get started</bd-button-link>
|
|
213
|
+
</bd-card-item>
|
|
214
|
+
<bd-card-item title="Multi-layer Security" cta-align="center">
|
|
215
|
+
<bd-globe-icon slot="icon" width="32" height="32" color="#006DFF"></bd-globe-icon>
|
|
216
|
+
<bd-p>Multiple protection layers.</bd-p>
|
|
217
|
+
<bd-button-link slot="cta" href="#" kind="danger" size="sm">Get started</bd-button-link>
|
|
218
|
+
</bd-card-item>
|
|
219
|
+
<bd-card-item title="VPN Included" cta-align="center">
|
|
220
|
+
<bd-machine-learning-icon slot="icon" width="32" height="32" color="#006DFF"></bd-machine-learning-icon>
|
|
221
|
+
<bd-p>Unlimited encrypted VPN traffic.</bd-p>
|
|
222
|
+
<bd-button-link slot="cta" href="#" kind="danger" size="sm">Get started</bd-button-link>
|
|
223
|
+
</bd-card-item>
|
|
224
|
+
</bd-card-section>
|
|
225
|
+
`,
|
|
226
|
+
parameters: { docs: { description: { story: 'CTA centrat cu `cta-align="center"`.' } } }
|
|
227
|
+
};
|
|
228
|
+
|
|
229
|
+
// ─── With Subtitle ────────────────────────────────────────────────────────────
|
|
230
|
+
|
|
231
|
+
export const WithSubtitle = {
|
|
232
|
+
name : 'With Section Subtitle',
|
|
233
|
+
render: () => html`
|
|
234
|
+
<bd-card-section
|
|
235
|
+
title="Why Bitdefender"
|
|
236
|
+
subtitle="Trusted by millions worldwide for over 20 years."
|
|
237
|
+
>
|
|
238
|
+
<bd-card-item title="AI Protection" subtitle="Machine learning powered">
|
|
239
|
+
<bd-individual-icon slot="icon" width="32" height="32" color="#006DFF"></bd-individual-icon>
|
|
240
|
+
<bd-p>Powered by machine learning and behavioral analysis.</bd-p>
|
|
241
|
+
</bd-card-item>
|
|
242
|
+
<bd-card-item title="Multi-layer Security" subtitle="Independent protection layers">
|
|
243
|
+
<bd-globe-icon slot="icon" width="32" height="32" color="#006DFF"></bd-globe-icon>
|
|
244
|
+
<bd-p>Multiple independent protection layers stop any attack.</bd-p>
|
|
245
|
+
</bd-card-item>
|
|
246
|
+
<bd-card-item title="VPN Included" subtitle="Unlimited traffic">
|
|
247
|
+
<bd-machine-learning-icon slot="icon" width="32" height="32" color="#006DFF"></bd-machine-learning-icon>
|
|
248
|
+
<bd-p>Unlimited encrypted VPN traffic for all your devices.</bd-p>
|
|
249
|
+
</bd-card-item>
|
|
250
|
+
</bd-card-section>
|
|
251
|
+
`,
|
|
252
|
+
parameters: { docs: { description: { story: 'Section cu subtitlu și card items cu subtitlu sub titlu.' } } }
|
|
253
|
+
};
|
|
254
|
+
|
|
255
|
+
// ─── Uneven Content Alignment Test ────────────────────────────────────────────
|
|
256
|
+
|
|
184
257
|
export const WithCTAUnevenContent = {
|
|
185
|
-
name : '
|
|
258
|
+
name : 'Uneven Content — Alignment Test',
|
|
186
259
|
render: () => html`
|
|
187
|
-
<bd-card-section title="Features"
|
|
260
|
+
<bd-card-section title="Features">
|
|
188
261
|
<bd-card-item title="AI Protection">
|
|
189
262
|
<bd-individual-icon slot="icon" width="32" height="32" color="#006DFF"></bd-individual-icon>
|
|
190
263
|
<bd-p>Powered by machine learning and behavioral analysis to stop threats before they reach you. Our AI engine learns from billions of threat signals every day.</bd-p>
|
|
191
264
|
<bd-button-link slot="cta" href="#" kind="danger" size="sm">Get started</bd-button-link>
|
|
192
265
|
</bd-card-item>
|
|
193
|
-
<bd-card-item title="Multi-layer Security">
|
|
266
|
+
<bd-card-item title="Multi-layer Security — Advanced Protection Suite">
|
|
194
267
|
<bd-globe-icon slot="icon" width="32" height="32" color="#006DFF"></bd-globe-icon>
|
|
195
268
|
<bd-p>Stop any attack.</bd-p>
|
|
196
269
|
<bd-button-link slot="cta" href="#" kind="danger" size="sm">Get started</bd-button-link>
|
|
@@ -207,9 +280,11 @@ export const WithCTAUnevenContent = {
|
|
|
207
280
|
</bd-card-item>
|
|
208
281
|
</bd-card-section>
|
|
209
282
|
`,
|
|
210
|
-
parameters: { docs: { description: { story: '
|
|
283
|
+
parameters: { docs: { description: { story: 'Conținut inegal — testează egalizarea rândurilor. Butoanele CTA trebuie să fie la aceeași înălțime.' } } }
|
|
211
284
|
};
|
|
212
285
|
|
|
286
|
+
// ─── No Section Title ─────────────────────────────────────────────────────────
|
|
287
|
+
|
|
213
288
|
export const NoSectionTitle = {
|
|
214
289
|
name : 'No Section Title',
|
|
215
290
|
render: () => html`
|
|
@@ -232,13 +307,15 @@ export const NoSectionTitle = {
|
|
|
232
307
|
</bd-card-item>
|
|
233
308
|
</bd-card-section>
|
|
234
309
|
`,
|
|
235
|
-
parameters: { docs: { description: { story: 'Section
|
|
310
|
+
parameters: { docs: { description: { story: 'Section fără `title` — header div omis.' } } }
|
|
236
311
|
};
|
|
237
312
|
|
|
313
|
+
// ─── Centered Alignment ───────────────────────────────────────────────────────
|
|
314
|
+
|
|
238
315
|
export const CenteredAlignment = {
|
|
239
316
|
name : 'Centered Alignment',
|
|
240
317
|
render: () => html`
|
|
241
|
-
<bd-card-section title="Features"
|
|
318
|
+
<bd-card-section title="Features">
|
|
242
319
|
<bd-card-item title="AI Protection" align="center">
|
|
243
320
|
<bd-individual-icon slot="icon" width="32" height="32" color="#006DFF"></bd-individual-icon>
|
|
244
321
|
<bd-p>Powered by machine learning and behavioral analysis.</bd-p>
|
|
@@ -257,30 +334,15 @@ export const CenteredAlignment = {
|
|
|
257
334
|
</bd-card-item>
|
|
258
335
|
</bd-card-section>
|
|
259
336
|
`,
|
|
260
|
-
parameters: { docs: { description: { story: '`align="center"`
|
|
337
|
+
parameters: { docs: { description: { story: '`align="center"` pe toate itemele.' } } }
|
|
261
338
|
};
|
|
262
339
|
|
|
263
|
-
|
|
264
|
-
name : 'Mixed Alignment',
|
|
265
|
-
render: () => html`
|
|
266
|
-
<bd-card-section title="Mixed Layout" subtitle="Different alignment styles">
|
|
267
|
-
<bd-card-item title="Left Aligned" align="start">
|
|
268
|
-
<bd-individual-icon slot="icon" width="32" height="32" color="#006DFF"></bd-individual-icon>
|
|
269
|
-
<bd-p>Default left-aligned content.</bd-p>
|
|
270
|
-
</bd-card-item>
|
|
271
|
-
<bd-card-item title="Center Aligned" align="center">
|
|
272
|
-
<bd-globe-icon slot="icon" width="32" height="32" color="#006DFF"></bd-globe-icon>
|
|
273
|
-
<bd-p>Centered content.</bd-p>
|
|
274
|
-
</bd-card-item>
|
|
275
|
-
</bd-card-section>
|
|
276
|
-
`,
|
|
277
|
-
parameters: { docs: { description: { story: 'Two items with different alignment values.' } } }
|
|
278
|
-
};
|
|
340
|
+
// ─── No Icon ──────────────────────────────────────────────────────────────────
|
|
279
341
|
|
|
280
342
|
export const NoIcon = {
|
|
281
343
|
name : 'No Icons',
|
|
282
344
|
render: () => html`
|
|
283
|
-
<bd-card-section title="Features"
|
|
345
|
+
<bd-card-section title="Features">
|
|
284
346
|
<bd-card-item title="AI Protection">
|
|
285
347
|
<bd-p>Powered by machine learning and behavioral analysis.</bd-p>
|
|
286
348
|
</bd-card-item>
|
|
@@ -295,13 +357,15 @@ export const NoIcon = {
|
|
|
295
357
|
</bd-card-item>
|
|
296
358
|
</bd-card-section>
|
|
297
359
|
`,
|
|
298
|
-
parameters: { docs: { description: { story: '
|
|
360
|
+
parameters: { docs: { description: { story: 'Carduri fără iconițe.' } } }
|
|
299
361
|
};
|
|
300
362
|
|
|
363
|
+
// ─── No Slotted Content ───────────────────────────────────────────────────────
|
|
364
|
+
|
|
301
365
|
export const NoSlottedContent = {
|
|
302
366
|
name : 'No Slotted Content',
|
|
303
367
|
render: () => html`
|
|
304
|
-
<bd-card-section title="Features"
|
|
368
|
+
<bd-card-section title="Features">
|
|
305
369
|
<bd-card-item title="AI Protection">
|
|
306
370
|
<bd-individual-icon slot="icon" width="32" height="32" color="#006DFF"></bd-individual-icon>
|
|
307
371
|
</bd-card-item>
|
|
@@ -316,46 +380,57 @@ export const NoSlottedContent = {
|
|
|
316
380
|
</bd-card-item>
|
|
317
381
|
</bd-card-section>
|
|
318
382
|
`,
|
|
319
|
-
parameters: { docs: { description: { story: '
|
|
383
|
+
parameters: { docs: { description: { story: 'Carduri cu doar iconițe și titlu — fără conținut slotted.' } } }
|
|
320
384
|
};
|
|
321
385
|
|
|
322
|
-
|
|
323
|
-
|
|
386
|
+
// ─── Two Columns ──────────────────────────────────────────────────────────────
|
|
387
|
+
|
|
388
|
+
export const TwoColumns = {
|
|
389
|
+
name : 'Two Columns',
|
|
324
390
|
render: () => html`
|
|
325
391
|
<bd-card-section title="Features">
|
|
326
|
-
<bd-card-item title="AI Protection"
|
|
327
|
-
|
|
328
|
-
|
|
392
|
+
<bd-card-item title="AI Protection">
|
|
393
|
+
<bd-individual-icon slot="icon" width="32" height="32" color="#006DFF"></bd-individual-icon>
|
|
394
|
+
<bd-p>Powered by machine learning and behavioral analysis.</bd-p>
|
|
395
|
+
</bd-card-item>
|
|
396
|
+
<bd-card-item title="Multi-layer Security">
|
|
397
|
+
<bd-globe-icon slot="icon" width="32" height="32" color="#006DFF"></bd-globe-icon>
|
|
398
|
+
<bd-p>Multiple independent protection layers stop any attack.</bd-p>
|
|
399
|
+
</bd-card-item>
|
|
329
400
|
</bd-card-section>
|
|
330
401
|
`,
|
|
331
|
-
parameters: { docs: { description: { story: '
|
|
402
|
+
parameters: { docs: { description: { story: 'Două coloane — grid se ajustează automat.' } } }
|
|
332
403
|
};
|
|
333
404
|
|
|
334
|
-
|
|
335
|
-
|
|
405
|
+
// ─── Three Columns ────────────────────────────────────────────────────────────
|
|
406
|
+
|
|
407
|
+
export const ThreeColumns = {
|
|
408
|
+
name : 'Three Columns',
|
|
336
409
|
render: () => html`
|
|
337
|
-
<bd-card-section title="
|
|
338
|
-
<bd-card-item title="
|
|
339
|
-
<bd-
|
|
340
|
-
<bd-p>
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
<bd-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
<bd-
|
|
348
|
-
<bd-
|
|
410
|
+
<bd-card-section title="Features">
|
|
411
|
+
<bd-card-item title="AI Protection">
|
|
412
|
+
<bd-individual-icon slot="icon" width="32" height="32" color="#006DFF"></bd-individual-icon>
|
|
413
|
+
<bd-p>Powered by machine learning and behavioral analysis.</bd-p>
|
|
414
|
+
</bd-card-item>
|
|
415
|
+
<bd-card-item title="Multi-layer Security">
|
|
416
|
+
<bd-globe-icon slot="icon" width="32" height="32" color="#006DFF"></bd-globe-icon>
|
|
417
|
+
<bd-p>Multiple independent protection layers stop any attack.</bd-p>
|
|
418
|
+
</bd-card-item>
|
|
419
|
+
<bd-card-item title="VPN Included">
|
|
420
|
+
<bd-machine-learning-icon slot="icon" width="32" height="32" color="#006DFF"></bd-machine-learning-icon>
|
|
421
|
+
<bd-p>Unlimited encrypted VPN traffic for all your devices.</bd-p>
|
|
349
422
|
</bd-card-item>
|
|
350
423
|
</bd-card-section>
|
|
351
424
|
`,
|
|
352
|
-
parameters: { docs: { description: { story: '
|
|
425
|
+
parameters: { docs: { description: { story: 'Trei coloane — grid se ajustează automat.' } } }
|
|
353
426
|
};
|
|
354
427
|
|
|
428
|
+
// ─── Single Item ──────────────────────────────────────────────────────────────
|
|
429
|
+
|
|
355
430
|
export const SingleItem = {
|
|
356
431
|
name : 'Single Item (edge case)',
|
|
357
432
|
render: () => html`
|
|
358
|
-
<bd-card-section title="Feature"
|
|
433
|
+
<bd-card-section title="Feature">
|
|
359
434
|
<bd-card-item title="AI Protection">
|
|
360
435
|
<bd-individual-icon slot="icon" width="32" height="32" color="#006DFF"></bd-individual-icon>
|
|
361
436
|
<bd-p>Machine learning-powered protection.</bd-p>
|
|
@@ -363,83 +438,74 @@ export const SingleItem = {
|
|
|
363
438
|
</bd-card-item>
|
|
364
439
|
</bd-card-section>
|
|
365
440
|
`,
|
|
366
|
-
parameters: { docs: { description: { story: 'Edge case
|
|
441
|
+
parameters: { docs: { description: { story: 'Edge case — un singur card.' } } }
|
|
367
442
|
};
|
|
368
443
|
|
|
369
|
-
|
|
370
|
-
name : 'With Images (large + small)',
|
|
371
|
-
render: () => html`
|
|
372
|
-
<bd-card-section title="Our Products" subtitle="Choose the right plan for you">
|
|
373
|
-
<bd-card-item title="Total Security">
|
|
374
|
-
<img slot="icon" src="/assets/tabs-img1.png" alt="Total Security" />
|
|
375
|
-
<bd-p>Complete protection for all your devices with advanced threat detection and real-time security updates.</bd-p>
|
|
376
|
-
<bd-button-link slot="cta" href="#" kind="primary" size="sm">Learn more</bd-button-link>
|
|
377
|
-
</bd-card-item>
|
|
378
|
-
<bd-card-item title="Internet Security">
|
|
379
|
-
<img slot="icon" src="/assets/tabs-img2.png" alt="Internet Security" />
|
|
380
|
-
<bd-p>Stay safe online.</bd-p>
|
|
381
|
-
<bd-button-link slot="cta" href="#" kind="primary" size="sm">Learn more</bd-button-link>
|
|
382
|
-
</bd-card-item>
|
|
383
|
-
<bd-card-item title="Antivirus Plus">
|
|
384
|
-
<img slot="icon" src="/assets/tabs-img3.png" alt="Antivirus Plus" />
|
|
385
|
-
<bd-p>Essential protection for your Windows PC with real-time antivirus and anti-phishing.</bd-p>
|
|
386
|
-
<bd-button-link slot="cta" href="#" kind="primary" size="sm">Learn more</bd-button-link>
|
|
387
|
-
</bd-card-item>
|
|
388
|
-
</bd-card-section>
|
|
389
|
-
`,
|
|
390
|
-
parameters: { docs: { description: { story: 'Cards with large images via `slot="icon"` — max-width/max-height 120px applied automatically.' } } }
|
|
391
|
-
};
|
|
444
|
+
// ─── Mobile View ──────────────────────────────────────────────────────────────
|
|
392
445
|
|
|
393
|
-
export const
|
|
394
|
-
name
|
|
395
|
-
|
|
396
|
-
|
|
446
|
+
export const MobileView = {
|
|
447
|
+
name : 'Mobile View (375px)',
|
|
448
|
+
parameters: { viewport: { defaultViewport: 'mobile1' } },
|
|
449
|
+
render : () => html`
|
|
450
|
+
<bd-card-section title="Why Bitdefender">
|
|
397
451
|
<bd-card-item title="AI Protection">
|
|
398
452
|
<bd-individual-icon slot="icon" width="32" height="32" color="#006DFF"></bd-individual-icon>
|
|
399
453
|
<bd-p>Powered by machine learning and behavioral analysis.</bd-p>
|
|
400
|
-
<bd-button-link slot="cta" href="#" kind="
|
|
454
|
+
<bd-button-link slot="cta" href="#" kind="primary" size="sm">Learn more</bd-button-link>
|
|
401
455
|
</bd-card-item>
|
|
402
|
-
<bd-card-item title="
|
|
403
|
-
<
|
|
404
|
-
<bd-p>
|
|
405
|
-
<bd-button-link slot="cta" href="#" kind="
|
|
456
|
+
<bd-card-item title="Multi-layer Security">
|
|
457
|
+
<bd-globe-icon slot="icon" width="32" height="32" color="#006DFF"></bd-globe-icon>
|
|
458
|
+
<bd-p>Multiple independent protection layers stop any attack.</bd-p>
|
|
459
|
+
<bd-button-link slot="cta" href="#" kind="primary" size="sm">Learn more</bd-button-link>
|
|
406
460
|
</bd-card-item>
|
|
407
461
|
<bd-card-item title="VPN Included">
|
|
408
|
-
<bd-
|
|
409
|
-
<bd-p>Unlimited encrypted VPN traffic for all your devices
|
|
410
|
-
<bd-button-link slot="cta" href="#" kind="
|
|
462
|
+
<bd-machine-learning-icon slot="icon" width="32" height="32" color="#006DFF"></bd-machine-learning-icon>
|
|
463
|
+
<bd-p>Unlimited encrypted VPN traffic for all your devices.</bd-p>
|
|
464
|
+
<bd-button-link slot="cta" href="#" kind="primary" size="sm">Learn more</bd-button-link>
|
|
411
465
|
</bd-card-item>
|
|
412
|
-
<bd-card-item title="
|
|
413
|
-
<
|
|
414
|
-
<bd-p>
|
|
415
|
-
<bd-button-link slot="cta" href="#" kind="
|
|
466
|
+
<bd-card-item title="Parental Controls">
|
|
467
|
+
<bd-analysis-icon slot="icon" width="32" height="32" color="#006DFF"></bd-analysis-icon>
|
|
468
|
+
<bd-p>Advanced controls to protect your children online.</bd-p>
|
|
469
|
+
<bd-button-link slot="cta" href="#" kind="primary" size="sm">Learn more</bd-button-link>
|
|
416
470
|
</bd-card-item>
|
|
417
471
|
</bd-card-section>
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
472
|
+
` };
|
|
473
|
+
|
|
474
|
+
// ─── Playground ───────────────────────────────────────────────────────────────
|
|
421
475
|
|
|
422
476
|
export const Playground = {
|
|
423
477
|
name: '🛝 Playground',
|
|
424
478
|
args: {
|
|
425
479
|
sectionTitle : 'Why Bitdefender',
|
|
426
|
-
sectionSubtitle: '
|
|
480
|
+
sectionSubtitle: '',
|
|
427
481
|
itemTitle : 'AI Protection',
|
|
428
|
-
align : 'start'
|
|
482
|
+
align : 'start',
|
|
483
|
+
bgBlue : false,
|
|
484
|
+
ctaAlign : 'start'
|
|
429
485
|
},
|
|
430
486
|
render: (args) => html`
|
|
431
487
|
<bd-card-section title="${args.sectionTitle}" subtitle="${args.sectionSubtitle}">
|
|
432
|
-
<bd-card-item
|
|
488
|
+
<bd-card-item
|
|
489
|
+
title="${args.itemTitle}"
|
|
490
|
+
align="${args.align}"
|
|
491
|
+
?bg-blue=${args.bgBlue}
|
|
492
|
+
cta-align="${args.ctaAlign}"
|
|
493
|
+
>
|
|
433
494
|
<bd-individual-icon slot="icon" width="32" height="32" color="#006DFF"></bd-individual-icon>
|
|
434
495
|
<bd-p>Powered by machine learning and behavioral analysis.</bd-p>
|
|
435
496
|
<bd-button-link slot="cta" href="#" kind="primary" size="sm">Learn more</bd-button-link>
|
|
436
497
|
</bd-card-item>
|
|
437
|
-
<bd-card-item
|
|
498
|
+
<bd-card-item
|
|
499
|
+
title="VPN Included"
|
|
500
|
+
align="${args.align}"
|
|
501
|
+
?bg-blue=${args.bgBlue}
|
|
502
|
+
cta-align="${args.ctaAlign}"
|
|
503
|
+
>
|
|
438
504
|
<bd-globe-icon slot="icon" width="32" height="32" color="#006DFF"></bd-globe-icon>
|
|
439
505
|
<bd-p>Unlimited encrypted VPN traffic.</bd-p>
|
|
440
506
|
<bd-button-link slot="cta" href="#" kind="primary" size="sm">Learn more</bd-button-link>
|
|
441
507
|
</bd-card-item>
|
|
442
508
|
</bd-card-section>
|
|
443
509
|
`,
|
|
444
|
-
parameters: { docs: { description: { story: '
|
|
510
|
+
parameters: { docs: { description: { story: 'Playground interactiv.' } } }
|
|
445
511
|
};
|