@repobit/dex-system-design 0.19.2 → 0.21.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/CHANGELOG.md +32 -0
- package/package.json +2 -3
- package/src/components/Button/button.stories.js +51 -51
- package/src/components/accordion/accordion-bg.css.js +168 -102
- package/src/components/accordion/accordion-bg.js +13 -5
- package/src/components/accordion/accordion-bg.stories.js +281 -0
- package/src/components/accordion/accordion-light.stories.js +241 -0
- package/src/components/anchor/anchor.stories.js +24 -22
- package/src/components/back/back.css.js +56 -0
- package/src/components/back/back.js +39 -0
- package/src/components/back/back.stories.js +184 -0
- package/src/components/badge/badge.css.js +44 -6
- package/src/components/badge/badge.js +40 -2
- package/src/components/badge/badge.stories.js +3 -10
- package/src/components/breadcrumb/breadcrumb.css.js +98 -0
- package/src/components/breadcrumb/breadcrumb.js +136 -0
- package/src/components/breadcrumb/breadcrumb.stories.js +109 -0
- package/src/components/cards/card.css.js +245 -0
- package/src/components/cards/card.js +80 -0
- package/src/components/cards/card.stories.js +512 -0
- package/src/components/carousel/carousel.css.js +51 -36
- package/src/components/carousel/carousel.js +0 -1
- package/src/components/carousel/carousel.stories.js +21 -17
- package/src/components/display/display.css.js +68 -0
- package/src/components/display/display.js +26 -0
- package/src/components/display/display.stories.js +339 -0
- package/src/components/divider/divider-horizontal.js +1 -1
- package/src/components/footer/footer-links-group.css.js +1 -1
- package/src/components/footer/footer-links-group.js +3 -3
- package/src/components/footer/footer-lp.stories.js +26 -61
- package/src/components/footer/footer-nav-menu.css.js +9 -10
- package/src/components/footer/footer.css.js +95 -8
- package/src/components/footer/footer.js +31 -65
- package/src/components/footer/footer.stories.js +165 -48
- package/src/components/header/header.js +11 -11
- package/src/components/header/header.stories.js +36 -4
- package/src/components/heading/heading.css.js +79 -0
- package/src/components/heading/heading.js +79 -0
- package/src/components/heading/heading.stories.js +260 -0
- package/src/components/highlight/highlight.stories.js +1 -1
- package/src/components/image/image.css.js +101 -0
- package/src/components/image/image.js +57 -0
- package/src/components/image/image.stories.js +245 -0
- package/src/components/light-carousel/light-carousel-simple.js +3 -2
- package/src/components/light-carousel/light-carousel.js +3 -7
- package/src/components/light-carousel/light-carousel.stories.js +15 -16
- package/src/components/link/link.css.js +107 -18
- package/src/components/link/link.js +16 -12
- package/src/components/link/link.stories.js +177 -0
- package/src/components/list/list-item/list-item.css.js +106 -0
- package/src/components/list/list-item/list-item.js +43 -0
- package/src/components/list/list-item/list-item.stories.js +79 -0
- package/src/components/list/list.css.js +175 -0
- package/src/components/list/list.js +44 -0
- package/src/components/modal/modal.js +6 -5
- package/src/components/paragraph/paragraph.css.js +41 -11
- package/src/components/paragraph/paragraph.js +7 -45
- package/src/components/paragraph/paragraph.stories.js +235 -0
- package/src/components/picture/picture.css.js +0 -0
- package/src/components/picture/picture.js +46 -0
- package/src/components/picture/picture.stories.js +275 -0
- package/src/components/pricing-cards/pricing-card-actions.js +1 -1
- package/src/components/pricing-cards/pricing-card-header.js +9 -7
- package/src/components/pricing-cards/pricing-card-pricing.js +11 -12
- package/src/components/pricing-cards/pricing-card.css.js +28 -3
- package/src/components/pricing-cards/pricing-card.js +38 -50
- package/src/components/tabs/tabs.js +44 -47
- package/src/components/termsOfUse/terms.js +77 -161
- package/src/components/termsOfUse/terms.stories.js +4 -3
- package/src/stories/Header.js +6 -6
- package/src/tokens/layout.css +3 -3
- package/src/tokens/tokens.css +0 -23
- package/src/tokens/tokens.stories.js +9 -8
- package/src/components/accordion/accordion-no-bg.css.js +0 -114
- package/src/components/accordion/accordion-no-bg.js +0 -80
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { LitElement, html } from "lit";
|
|
2
2
|
import { tokens } from "../../tokens/tokens.js";
|
|
3
|
+
import "../heading/heading.js";
|
|
3
4
|
import carouselCSS from "../light-carousel/light-carousel.css.js";
|
|
4
5
|
|
|
5
6
|
class CustomLightCarousel extends LitElement {
|
|
@@ -12,8 +13,6 @@ class CustomLightCarousel extends LitElement {
|
|
|
12
13
|
this.title = "";
|
|
13
14
|
}
|
|
14
15
|
|
|
15
|
-
|
|
16
|
-
|
|
17
16
|
render() {
|
|
18
17
|
return html`
|
|
19
18
|
<section class="bd-light-carousel">
|
|
@@ -56,7 +55,7 @@ class LightCarouselItem extends LitElement {
|
|
|
56
55
|
${this.title || this.badge
|
|
57
56
|
? html`
|
|
58
57
|
<div class="bd-light-title-badge-wrapper">
|
|
59
|
-
${this.title ? html`<
|
|
58
|
+
${this.title ? html`<bd-h as="h6" padding="10px 0" fontWeight="700">${this.title}</bd-h>` : ""}
|
|
60
59
|
${this.badge
|
|
61
60
|
? html`<bd-badge color="#026DFF">${this.badge}</bd-badge>`
|
|
62
61
|
: ""}
|
|
@@ -68,12 +67,9 @@ class LightCarouselItem extends LitElement {
|
|
|
68
67
|
</div>
|
|
69
68
|
`;
|
|
70
69
|
}
|
|
71
|
-
|
|
72
|
-
|
|
73
70
|
}
|
|
74
71
|
CustomLightCarousel.styles = [tokens, carouselCSS];
|
|
75
72
|
LightCarouselItem.styles = [tokens, carouselCSS];
|
|
76
73
|
|
|
77
74
|
customElements.define("bd-light-carousel-item", LightCarouselItem);
|
|
78
|
-
|
|
79
|
-
customElements.define("bd-light-carousel-section", CustomLightCarousel);
|
|
75
|
+
customElements.define("bd-light-carousel-section", CustomLightCarousel);
|
|
@@ -19,15 +19,15 @@ const Template = (args) => html`
|
|
|
19
19
|
icon="/assets/light-carousel-img1.png"
|
|
20
20
|
badge="FAQ"
|
|
21
21
|
>
|
|
22
|
-
<p>Bitdefender Internet Security provides the best protection...</p>
|
|
23
|
-
<p>Advanced AI and behavior-based detection ensure safety online and offline.</p>
|
|
22
|
+
<bd-p kind="small">Bitdefender Internet Security provides the best protection...</bd-p>
|
|
23
|
+
<bd-p kind="small">Advanced AI and behavior-based detection ensure safety online and offline.</bd-p>
|
|
24
24
|
</bd-light-carousel-item>
|
|
25
25
|
|
|
26
26
|
<bd-light-carousel-item
|
|
27
27
|
title="How to install Bitdefender on another device?"
|
|
28
28
|
icon="/assets/light-carousel-img1.png"
|
|
29
29
|
>
|
|
30
|
-
<p>You can install Bitdefender on other devices by logging into your Central account and using the 'My Devices' tab.</p>
|
|
30
|
+
<bd-p kind="small">You can install Bitdefender on other devices by logging into your Central account and using the 'My Devices' tab.</bd-p>
|
|
31
31
|
</bd-light-carousel-item>
|
|
32
32
|
|
|
33
33
|
<bd-light-carousel-item
|
|
@@ -35,7 +35,7 @@ const Template = (args) => html`
|
|
|
35
35
|
icon="/assets/light-carousel-img1.png"
|
|
36
36
|
badge="How To"
|
|
37
37
|
>
|
|
38
|
-
<p>Yes, just remove the license from the old device via Central and activate it on the new one.</p>
|
|
38
|
+
<bd-p kind="small">Yes, just remove the license from the old device via Central and activate it on the new one.</bd-p>
|
|
39
39
|
</bd-light-carousel-item>
|
|
40
40
|
</bd-light-carousel-section>
|
|
41
41
|
`;
|
|
@@ -45,37 +45,36 @@ Default.args = {
|
|
|
45
45
|
title: "Need help? We've got answers!"
|
|
46
46
|
};
|
|
47
47
|
|
|
48
|
-
// NEW: Simple version
|
|
49
48
|
const TemplateSimple = (args) => html`
|
|
50
49
|
<bd-light-carousel-simple-section title="${args.title}">
|
|
51
50
|
<bd-light-carousel-simple-item
|
|
52
51
|
title="Scam Copilot Chatbot"
|
|
53
|
-
icon="
|
|
52
|
+
icon="/assets/light-carousel-img1.png"
|
|
54
53
|
>
|
|
55
|
-
<p>
|
|
54
|
+
<bd-p kind="small">
|
|
56
55
|
Specialized AI chatbot that helps you identify suspicious online
|
|
57
|
-
interactions so you don
|
|
58
|
-
</p>
|
|
56
|
+
interactions so you don't become a victim.
|
|
57
|
+
</bd-p>
|
|
59
58
|
</bd-light-carousel-simple-item>
|
|
60
59
|
|
|
61
60
|
<bd-light-carousel-simple-item
|
|
62
61
|
title="Scam Wave Alerts"
|
|
63
|
-
icon="
|
|
62
|
+
icon="/assets/light-carousel-img1.png"
|
|
64
63
|
>
|
|
65
|
-
<p>
|
|
64
|
+
<bd-p kind="small">
|
|
66
65
|
Stay informed with real-time alerts about ongoing scam outbreaks
|
|
67
66
|
detected in your area automatically.
|
|
68
|
-
</p>
|
|
67
|
+
</bd-p>
|
|
69
68
|
</bd-light-carousel-simple-item>
|
|
70
69
|
|
|
71
70
|
<bd-light-carousel-simple-item
|
|
72
71
|
title="Online Scam Protection"
|
|
73
|
-
icon="
|
|
72
|
+
icon="/assets/light-carousel-img1.png"
|
|
74
73
|
>
|
|
75
|
-
<p>
|
|
74
|
+
<bd-p kind="small">
|
|
76
75
|
Focused on browsing activities, it specializes in detecting the newest
|
|
77
76
|
scam patterns and tactics.
|
|
78
|
-
</p>
|
|
77
|
+
</bd-p>
|
|
79
78
|
</bd-light-carousel-simple-item>
|
|
80
79
|
</bd-light-carousel-simple-section>
|
|
81
80
|
`;
|
|
@@ -83,4 +82,4 @@ const TemplateSimple = (args) => html`
|
|
|
83
82
|
export const Simple = TemplateSimple.bind({});
|
|
84
83
|
Simple.args = {
|
|
85
84
|
title: "Our AI-powered platform that detects and fights scams. In real time."
|
|
86
|
-
};
|
|
85
|
+
};
|
|
@@ -1,41 +1,130 @@
|
|
|
1
1
|
import { css } from "lit";
|
|
2
2
|
|
|
3
3
|
export default css`
|
|
4
|
-
:host {
|
|
5
|
-
display: inline-block;
|
|
6
|
-
font-family: var(--typography-fontFamily-sans);
|
|
7
|
-
|
|
8
|
-
}
|
|
9
|
-
|
|
10
4
|
.bd-link {
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
5
|
+
display: inline-flex;
|
|
6
|
+
align-items: center;
|
|
7
|
+
gap: var(--spacing-4);
|
|
8
|
+
color: var(--color-blue-500);
|
|
14
9
|
text-decoration: none;
|
|
10
|
+
font-family: var(--typography-fontFamily-sans);
|
|
11
|
+
font-size: var(--typography-fontSize-base);
|
|
12
|
+
font-weight: var(--typography-fontWeight-normal);
|
|
13
|
+
line-height: var(--typography-lineHeight-normal);
|
|
14
|
+
transition: all 0.15s ease-in-out;
|
|
15
15
|
cursor: pointer;
|
|
16
|
-
transition: color 0.2s ease;
|
|
17
16
|
}
|
|
18
17
|
|
|
19
|
-
|
|
20
|
-
|
|
18
|
+
/* Primary (default) */
|
|
19
|
+
.bd-link--primary {
|
|
20
|
+
color: var(--color-blue-500);
|
|
21
21
|
}
|
|
22
22
|
|
|
23
|
-
.bd-link--
|
|
23
|
+
.bd-link--primary:hover {
|
|
24
|
+
color: var(--color-blue-700);
|
|
24
25
|
text-decoration: underline;
|
|
26
|
+
text-underline-offset: 2px;
|
|
25
27
|
}
|
|
26
28
|
|
|
29
|
+
/* Secondary */
|
|
27
30
|
.bd-link--secondary {
|
|
28
|
-
color: var(--color-
|
|
31
|
+
color: var(--color-neutral-600);
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
.bd-link--secondary:hover {
|
|
35
|
+
color: var(--color-neutral-800);
|
|
36
|
+
text-decoration: underline;
|
|
37
|
+
text-underline-offset: 2px;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
/* Light variant for dark backgrounds */
|
|
41
|
+
.bd-link--light {
|
|
42
|
+
color: var(--color-neutral-0);
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
.bd-link--light:hover {
|
|
46
|
+
color: var(--color-neutral-0); /* Rămâne albă */
|
|
47
|
+
text-decoration: none; /* Fără underline */
|
|
29
48
|
}
|
|
30
49
|
|
|
50
|
+
/* Danger */
|
|
31
51
|
.bd-link--danger {
|
|
32
|
-
color: var(--color-
|
|
52
|
+
color: var(--color-red-500);
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
.bd-link--danger:hover {
|
|
56
|
+
color: var(--color-red-700);
|
|
57
|
+
text-decoration: underline;
|
|
58
|
+
text-underline-offset: 2px;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
/* Subtle */
|
|
62
|
+
.bd-link--subtle {
|
|
63
|
+
color: var(--color-neutral-500);
|
|
64
|
+
text-decoration: none;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
.bd-link--subtle:hover {
|
|
68
|
+
color: var(--color-neutral-700);
|
|
69
|
+
text-decoration: underline;
|
|
70
|
+
text-underline-offset: 2px;
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
/* Bold */
|
|
74
|
+
.bd-link--bold {
|
|
75
|
+
color: var(--color-blue-600);
|
|
76
|
+
font-weight: var(--typography-fontWeight-semibold);
|
|
77
|
+
text-decoration: none;
|
|
33
78
|
}
|
|
34
79
|
|
|
80
|
+
.bd-link--bold:hover {
|
|
81
|
+
color: var(--color-blue-800);
|
|
82
|
+
text-decoration: underline;
|
|
83
|
+
text-underline-offset: 2px;
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
/* Underline modifier */
|
|
87
|
+
.bd-link--underline {
|
|
88
|
+
text-decoration: underline;
|
|
89
|
+
text-underline-offset: 2px;
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
.bd-link--underline:hover {
|
|
93
|
+
text-decoration-thickness: 2px;
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
/* Disabled state */
|
|
35
97
|
.bd-link--disabled {
|
|
36
|
-
color: var(--color-
|
|
98
|
+
color: var(--color-neutral-400);
|
|
99
|
+
cursor: not-allowed;
|
|
100
|
+
text-decoration: none;
|
|
37
101
|
pointer-events: none;
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
|
|
105
|
+
/* Focus styles for all variants */
|
|
106
|
+
.bd-link:focus {
|
|
107
|
+
outline: 2px solid var(--color-blue-300);
|
|
108
|
+
outline-offset: 2px;
|
|
109
|
+
border-radius: 2px;
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
/* Ensure disabled span has same display */
|
|
113
|
+
.bd-link.bd-link--disabled {
|
|
114
|
+
display: inline-flex;
|
|
115
|
+
align-items: center;
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
/* Additional specificity for edge cases */
|
|
119
|
+
a.bd-link {
|
|
120
|
+
cursor: pointer;
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
span.bd-link {
|
|
38
124
|
cursor: default;
|
|
39
|
-
text-decoration: none;
|
|
40
125
|
}
|
|
41
|
-
|
|
126
|
+
|
|
127
|
+
span.bd-link--disabled {
|
|
128
|
+
cursor: not-allowed;
|
|
129
|
+
}
|
|
130
|
+
`;
|
|
@@ -6,8 +6,8 @@ class BdLink extends LitElement {
|
|
|
6
6
|
static properties = {
|
|
7
7
|
href : { type: String },
|
|
8
8
|
target : { type: String },
|
|
9
|
-
kind : { type: String },
|
|
10
|
-
underline: { type: Boolean },
|
|
9
|
+
kind : { type: String, reflect: true },
|
|
10
|
+
underline: { type: Boolean, reflect: true },
|
|
11
11
|
disabled : { type: Boolean, reflect: true }
|
|
12
12
|
};
|
|
13
13
|
|
|
@@ -23,18 +23,22 @@ class BdLink extends LitElement {
|
|
|
23
23
|
static styles = [tokens, linkCSS];
|
|
24
24
|
|
|
25
25
|
render() {
|
|
26
|
-
const kindClass = {
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
26
|
+
const kindClass = `bd-link--${this.kind}`;
|
|
27
|
+
const underlineClass = this.underline ? "bd-link--underline" : "";
|
|
28
|
+
const disabledClass = this.disabled ? "bd-link--disabled" : "";
|
|
29
|
+
|
|
30
|
+
if (this.disabled) {
|
|
31
|
+
return html`
|
|
32
|
+
<span class="bd-link ${kindClass} ${underlineClass} ${disabledClass}">
|
|
33
|
+
<slot></slot>
|
|
34
|
+
</span>
|
|
35
|
+
`;
|
|
36
|
+
}
|
|
31
37
|
|
|
32
38
|
return html`
|
|
33
39
|
<a
|
|
34
|
-
class="bd-link ${kindClass} ${
|
|
35
|
-
|
|
36
|
-
: ""}"
|
|
37
|
-
href="${this.disabled ? "javascript:void(0)" : this.href}"
|
|
40
|
+
class="bd-link ${kindClass} ${underlineClass} ${disabledClass}"
|
|
41
|
+
href="${this.href}"
|
|
38
42
|
target="${this.target}"
|
|
39
43
|
@click="${this._handleClick}"
|
|
40
44
|
>
|
|
@@ -51,4 +55,4 @@ class BdLink extends LitElement {
|
|
|
51
55
|
}
|
|
52
56
|
}
|
|
53
57
|
|
|
54
|
-
customElements.define("bd-link", BdLink);
|
|
58
|
+
customElements.define("bd-link", BdLink);
|
|
@@ -0,0 +1,177 @@
|
|
|
1
|
+
import { html } from 'lit';
|
|
2
|
+
import '../heading/heading.js';
|
|
3
|
+
import '../paragraph/paragraph.js';
|
|
4
|
+
import './link.js';
|
|
5
|
+
|
|
6
|
+
export default {
|
|
7
|
+
title : 'Atoms/Link',
|
|
8
|
+
component: 'bd-link',
|
|
9
|
+
argTypes : {
|
|
10
|
+
href: {
|
|
11
|
+
control : 'text',
|
|
12
|
+
description: 'URL destination'
|
|
13
|
+
},
|
|
14
|
+
target: {
|
|
15
|
+
control : { type: 'select' },
|
|
16
|
+
options : ['_self', '_blank', '_parent', '_top'],
|
|
17
|
+
description: 'Link target attribute'
|
|
18
|
+
},
|
|
19
|
+
kind: {
|
|
20
|
+
control : { type: 'select' },
|
|
21
|
+
options : ['primary', 'secondary', 'danger', 'subtle', 'bold'],
|
|
22
|
+
description: 'Link style variant'
|
|
23
|
+
},
|
|
24
|
+
underline: {
|
|
25
|
+
control : 'boolean',
|
|
26
|
+
description: 'Always show underline'
|
|
27
|
+
},
|
|
28
|
+
disabled: {
|
|
29
|
+
control : 'boolean',
|
|
30
|
+
description: 'Disabled state'
|
|
31
|
+
},
|
|
32
|
+
content: {
|
|
33
|
+
control : 'text',
|
|
34
|
+
description: 'Link text content'
|
|
35
|
+
}
|
|
36
|
+
},
|
|
37
|
+
parameters: {
|
|
38
|
+
docs: {
|
|
39
|
+
description: {
|
|
40
|
+
component: 'A customizable link component with multiple style variants and accessibility features.'
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
};
|
|
45
|
+
|
|
46
|
+
const Template = ({ href, target, kind, underline, disabled, content }) => html`
|
|
47
|
+
<bd-link
|
|
48
|
+
href="${href}"
|
|
49
|
+
target="${target}"
|
|
50
|
+
kind="${kind}"
|
|
51
|
+
?underline="${underline}"
|
|
52
|
+
?disabled="${disabled}"
|
|
53
|
+
>
|
|
54
|
+
${content}
|
|
55
|
+
</bd-link>
|
|
56
|
+
`;
|
|
57
|
+
|
|
58
|
+
export const AllVariants = () => html`
|
|
59
|
+
<div style="display: flex; flex-direction: column; gap: 1rem; max-width: 600px;">
|
|
60
|
+
<div>
|
|
61
|
+
<bd-p kind="regular">This is a paragraph with a <bd-link href="#" kind="primary">primary link</bd-link> inside the text.</bd-p>
|
|
62
|
+
</div>
|
|
63
|
+
|
|
64
|
+
<div>
|
|
65
|
+
<bd-p kind="regular">This is a paragraph with a <bd-link href="#" kind="secondary">secondary link</bd-link> inside the text.</bd-p>
|
|
66
|
+
</div>
|
|
67
|
+
|
|
68
|
+
<div>
|
|
69
|
+
<bd-p kind="regular">This is a paragraph with a <bd-link href="#" kind="danger">danger link</bd-link> inside the text.</bd-p>
|
|
70
|
+
</div>
|
|
71
|
+
|
|
72
|
+
<div>
|
|
73
|
+
<bd-p kind="regular">This is a paragraph with a <bd-link href="#" kind="subtle">subtle link</bd-link> inside the text.</bd-p>
|
|
74
|
+
</div>
|
|
75
|
+
|
|
76
|
+
<div>
|
|
77
|
+
<bd-p kind="regular">This is a paragraph with a <bd-link href="#" kind="bold">bold link</bd-link> inside the text.</bd-p>
|
|
78
|
+
</div>
|
|
79
|
+
|
|
80
|
+
<div>
|
|
81
|
+
<bd-p kind="regular">This is a paragraph with a <bd-link href="#" kind="primary" underline>underlined link</bd-link> inside the text.</bd-p>
|
|
82
|
+
</div>
|
|
83
|
+
|
|
84
|
+
<div>
|
|
85
|
+
<bd-p kind="regular">This is a paragraph with a <bd-link href="#" kind="primary" disabled>disabled link</bd-link> inside the text.</bd-p>
|
|
86
|
+
</div>
|
|
87
|
+
</div>
|
|
88
|
+
`;
|
|
89
|
+
|
|
90
|
+
export const Primary = Template.bind({});
|
|
91
|
+
Primary.args = {
|
|
92
|
+
href : '#',
|
|
93
|
+
target : '_self',
|
|
94
|
+
kind : 'primary',
|
|
95
|
+
underline: false,
|
|
96
|
+
disabled : false,
|
|
97
|
+
content : 'Primary Link'
|
|
98
|
+
};
|
|
99
|
+
|
|
100
|
+
export const Secondary = Template.bind({});
|
|
101
|
+
Secondary.args = {
|
|
102
|
+
href : '#',
|
|
103
|
+
target : '_self',
|
|
104
|
+
kind : 'secondary',
|
|
105
|
+
underline: false,
|
|
106
|
+
disabled : false,
|
|
107
|
+
content : 'Secondary Link'
|
|
108
|
+
};
|
|
109
|
+
|
|
110
|
+
export const Danger = Template.bind({});
|
|
111
|
+
Danger.args = {
|
|
112
|
+
href : '#',
|
|
113
|
+
target : '_self',
|
|
114
|
+
kind : 'danger',
|
|
115
|
+
underline: false,
|
|
116
|
+
disabled : false,
|
|
117
|
+
content : 'Danger Link'
|
|
118
|
+
};
|
|
119
|
+
|
|
120
|
+
export const WithUnderline = Template.bind({});
|
|
121
|
+
WithUnderline.args = {
|
|
122
|
+
href : '#',
|
|
123
|
+
target : '_self',
|
|
124
|
+
kind : 'primary',
|
|
125
|
+
underline: true,
|
|
126
|
+
disabled : false,
|
|
127
|
+
content : 'Underlined Link'
|
|
128
|
+
};
|
|
129
|
+
|
|
130
|
+
export const Disabled = Template.bind({});
|
|
131
|
+
Disabled.args = {
|
|
132
|
+
href : '#',
|
|
133
|
+
target : '_self',
|
|
134
|
+
kind : 'primary',
|
|
135
|
+
underline: false,
|
|
136
|
+
disabled : true,
|
|
137
|
+
content : 'Disabled Link'
|
|
138
|
+
};
|
|
139
|
+
|
|
140
|
+
export const ExternalLinks = () => html`
|
|
141
|
+
<div style="display: flex; flex-direction: column; gap: 1rem;">
|
|
142
|
+
<bd-link href="https://example.com" target="_blank" kind="primary">
|
|
143
|
+
External Primary Link
|
|
144
|
+
</bd-link>
|
|
145
|
+
|
|
146
|
+
<bd-link href="https://example.com" target="_blank" kind="secondary" underline>
|
|
147
|
+
External Underlined Link
|
|
148
|
+
</bd-link>
|
|
149
|
+
|
|
150
|
+
<bd-p kind="regular">
|
|
151
|
+
This is a paragraph with an <bd-link href="https://example.com" target="_blank" kind="primary">external link</bd-link> that opens in a new tab.
|
|
152
|
+
</bd-p>
|
|
153
|
+
</div>
|
|
154
|
+
`;
|
|
155
|
+
|
|
156
|
+
export const InContext = () => html`
|
|
157
|
+
<div style="max-width: 600px;">
|
|
158
|
+
<bd-h as="h2">Cybersecurity Features</bd-h>
|
|
159
|
+
|
|
160
|
+
<bd-p kind="lead">
|
|
161
|
+
Protect your digital life with our comprehensive security solutions.
|
|
162
|
+
Learn more about <bd-link href="#" kind="primary">threat protection</bd-link>
|
|
163
|
+
and <bd-link href="#" kind="bold">advanced features</bd-link>.
|
|
164
|
+
</bd-p>
|
|
165
|
+
|
|
166
|
+
<bd-p kind="regular">
|
|
167
|
+
Our <bd-link href="#" kind="danger">emergency response</bd-link> team is available 24/7
|
|
168
|
+
to handle security incidents. For less urgent matters, check our
|
|
169
|
+
<bd-link href="#" kind="subtle">knowledge base</bd-link>.
|
|
170
|
+
</bd-p>
|
|
171
|
+
|
|
172
|
+
<bd-p kind="small">
|
|
173
|
+
<bd-link href="#" kind="secondary" underline>Terms of service</bd-link> •
|
|
174
|
+
<bd-link href="#" kind="secondary" underline>Privacy policy</bd-link>
|
|
175
|
+
</bd-p>
|
|
176
|
+
</div>
|
|
177
|
+
`;
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
import { css } from "lit";
|
|
2
|
+
|
|
3
|
+
export default css`
|
|
4
|
+
@layer bd-components {
|
|
5
|
+
.bd-list-item {
|
|
6
|
+
margin: 0;
|
|
7
|
+
padding: 0;
|
|
8
|
+
list-style: none;
|
|
9
|
+
display: flex;
|
|
10
|
+
align-items: flex-start;
|
|
11
|
+
gap: var(--spacing-8);
|
|
12
|
+
color: var(--color-neutral-700);
|
|
13
|
+
line-height: var(--typography-lineHeight-normal);
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
/* === SIZE VARIANTS === */
|
|
17
|
+
|
|
18
|
+
.bd-list-item.sm {
|
|
19
|
+
font-size: var(--typography-fontSize-sm);
|
|
20
|
+
margin-bottom: var(--spacing-4);
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
.bd-list-item.md {
|
|
24
|
+
font-size: var(--typography-fontSize-base);
|
|
25
|
+
margin-bottom: var(--spacing-6);
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
.bd-list-item.lg {
|
|
29
|
+
font-size: var(--typography-fontSize-lg);
|
|
30
|
+
margin-bottom: var(--spacing-8);
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
/* === MARKER STYLES === */
|
|
34
|
+
|
|
35
|
+
.bd-list-item-marker {
|
|
36
|
+
flex-shrink: 0;
|
|
37
|
+
margin-top: var(--spacing-6);
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
/* Bullet List */
|
|
41
|
+
.bd-list-item.bullet .bd-list-item-marker {
|
|
42
|
+
width: var(--spacing-6);
|
|
43
|
+
height: var(--spacing-6);
|
|
44
|
+
background-color: var(--color-neutral-1000);
|
|
45
|
+
border-radius: 50%;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
/* Number List */
|
|
49
|
+
.bd-list-item.number {
|
|
50
|
+
counter-increment: bd-list-counter;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
.bd-list-item.number .bd-list-item-marker::before {
|
|
54
|
+
content: counter(bd-list-counter) ".";
|
|
55
|
+
font-weight: var(--typography-fontWeight-semibold);
|
|
56
|
+
color: var(--color-neutral-1000);
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
/* Check List */
|
|
60
|
+
.bd-list-item.check .bd-list-item-marker {
|
|
61
|
+
width: var(--spacing-16);
|
|
62
|
+
height: var(--spacing-16);
|
|
63
|
+
background-color: var(--color-green-500);
|
|
64
|
+
border-radius: 50%;
|
|
65
|
+
position: relative;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
.bd-list-item.check .bd-list-item-marker::after {
|
|
69
|
+
content: "✓";
|
|
70
|
+
color: white;
|
|
71
|
+
font-size: var(--typography-fontSize-sm);
|
|
72
|
+
position: absolute;
|
|
73
|
+
top: 50%;
|
|
74
|
+
left: 50%;
|
|
75
|
+
transform: translate(-50%, -50%);
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
/* Custom Icon */
|
|
79
|
+
.bd-list-item-custom-icon {
|
|
80
|
+
width: var(--spacing-16);
|
|
81
|
+
height: var(--spacing-16);
|
|
82
|
+
flex-shrink: 0;
|
|
83
|
+
margin-top: var(--spacing-4);
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
/* No Marker */
|
|
87
|
+
.bd-list-item.none {
|
|
88
|
+
gap: 0;
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
.bd-list-item.none .bd-list-item-marker {
|
|
92
|
+
display: none;
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
/* === CONTENT STYLING === */
|
|
96
|
+
|
|
97
|
+
.bd-list-item-content {
|
|
98
|
+
flex: 1;
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
/* Last Item */
|
|
102
|
+
.bd-list-item:last-child {
|
|
103
|
+
margin-bottom: 0;
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
`;
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { LitElement, html } from "lit";
|
|
2
|
+
import { tokens } from "../../../tokens/tokens.js";
|
|
3
|
+
import listItemCSS from "./list-item.css.js";
|
|
4
|
+
|
|
5
|
+
export class BdListItem extends LitElement {
|
|
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
|
|
10
|
+
};
|
|
11
|
+
|
|
12
|
+
constructor() {
|
|
13
|
+
super();
|
|
14
|
+
this.kind = "bullet";
|
|
15
|
+
this.size = "md";
|
|
16
|
+
this.icon = "";
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
render() {
|
|
20
|
+
return html`
|
|
21
|
+
<li class="bd-list-item ${this.kind} ${this.size}">
|
|
22
|
+
${this._renderMarker()}
|
|
23
|
+
<span class="bd-list-item-content">
|
|
24
|
+
<slot></slot>
|
|
25
|
+
</span>
|
|
26
|
+
</li>
|
|
27
|
+
`;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
_renderMarker() {
|
|
31
|
+
if (this.kind === "none") return '';
|
|
32
|
+
|
|
33
|
+
if (this.icon) {
|
|
34
|
+
return html`<img src="${this.icon}" alt="" class="bd-list-item-custom-icon" />`;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
return html`<span class="bd-list-item-marker"></span>`;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
static styles = [tokens, listItemCSS];
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
customElements.define("bd-li", BdListItem);
|