@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.
Files changed (75) hide show
  1. package/CHANGELOG.md +32 -0
  2. package/package.json +2 -3
  3. package/src/components/Button/button.stories.js +51 -51
  4. package/src/components/accordion/accordion-bg.css.js +168 -102
  5. package/src/components/accordion/accordion-bg.js +13 -5
  6. package/src/components/accordion/accordion-bg.stories.js +281 -0
  7. package/src/components/accordion/accordion-light.stories.js +241 -0
  8. package/src/components/anchor/anchor.stories.js +24 -22
  9. package/src/components/back/back.css.js +56 -0
  10. package/src/components/back/back.js +39 -0
  11. package/src/components/back/back.stories.js +184 -0
  12. package/src/components/badge/badge.css.js +44 -6
  13. package/src/components/badge/badge.js +40 -2
  14. package/src/components/badge/badge.stories.js +3 -10
  15. package/src/components/breadcrumb/breadcrumb.css.js +98 -0
  16. package/src/components/breadcrumb/breadcrumb.js +136 -0
  17. package/src/components/breadcrumb/breadcrumb.stories.js +109 -0
  18. package/src/components/cards/card.css.js +245 -0
  19. package/src/components/cards/card.js +80 -0
  20. package/src/components/cards/card.stories.js +512 -0
  21. package/src/components/carousel/carousel.css.js +51 -36
  22. package/src/components/carousel/carousel.js +0 -1
  23. package/src/components/carousel/carousel.stories.js +21 -17
  24. package/src/components/display/display.css.js +68 -0
  25. package/src/components/display/display.js +26 -0
  26. package/src/components/display/display.stories.js +339 -0
  27. package/src/components/divider/divider-horizontal.js +1 -1
  28. package/src/components/footer/footer-links-group.css.js +1 -1
  29. package/src/components/footer/footer-links-group.js +3 -3
  30. package/src/components/footer/footer-lp.stories.js +26 -61
  31. package/src/components/footer/footer-nav-menu.css.js +9 -10
  32. package/src/components/footer/footer.css.js +95 -8
  33. package/src/components/footer/footer.js +31 -65
  34. package/src/components/footer/footer.stories.js +165 -48
  35. package/src/components/header/header.js +11 -11
  36. package/src/components/header/header.stories.js +36 -4
  37. package/src/components/heading/heading.css.js +79 -0
  38. package/src/components/heading/heading.js +79 -0
  39. package/src/components/heading/heading.stories.js +260 -0
  40. package/src/components/highlight/highlight.stories.js +1 -1
  41. package/src/components/image/image.css.js +101 -0
  42. package/src/components/image/image.js +57 -0
  43. package/src/components/image/image.stories.js +245 -0
  44. package/src/components/light-carousel/light-carousel-simple.js +3 -2
  45. package/src/components/light-carousel/light-carousel.js +3 -7
  46. package/src/components/light-carousel/light-carousel.stories.js +15 -16
  47. package/src/components/link/link.css.js +107 -18
  48. package/src/components/link/link.js +16 -12
  49. package/src/components/link/link.stories.js +177 -0
  50. package/src/components/list/list-item/list-item.css.js +106 -0
  51. package/src/components/list/list-item/list-item.js +43 -0
  52. package/src/components/list/list-item/list-item.stories.js +79 -0
  53. package/src/components/list/list.css.js +175 -0
  54. package/src/components/list/list.js +44 -0
  55. package/src/components/modal/modal.js +6 -5
  56. package/src/components/paragraph/paragraph.css.js +41 -11
  57. package/src/components/paragraph/paragraph.js +7 -45
  58. package/src/components/paragraph/paragraph.stories.js +235 -0
  59. package/src/components/picture/picture.css.js +0 -0
  60. package/src/components/picture/picture.js +46 -0
  61. package/src/components/picture/picture.stories.js +275 -0
  62. package/src/components/pricing-cards/pricing-card-actions.js +1 -1
  63. package/src/components/pricing-cards/pricing-card-header.js +9 -7
  64. package/src/components/pricing-cards/pricing-card-pricing.js +11 -12
  65. package/src/components/pricing-cards/pricing-card.css.js +28 -3
  66. package/src/components/pricing-cards/pricing-card.js +38 -50
  67. package/src/components/tabs/tabs.js +44 -47
  68. package/src/components/termsOfUse/terms.js +77 -161
  69. package/src/components/termsOfUse/terms.stories.js +4 -3
  70. package/src/stories/Header.js +6 -6
  71. package/src/tokens/layout.css +3 -3
  72. package/src/tokens/tokens.css +0 -23
  73. package/src/tokens/tokens.stories.js +9 -8
  74. package/src/components/accordion/accordion-no-bg.css.js +0 -114
  75. 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`<h3>${this.title}</h3>` : ""}
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="src/assets//assets/light-carousel-img1.png"
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 dont become a victim.
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="src/assets//assets/light-carousel-img1.png"
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="src/assets//assets/light-carousel-img1.png"
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
- font-family: inherit;
12
- font-size: 1rem;
13
- color: var(--color-link-primary, #007bff);
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
- .bd-link:hover {
20
- text-decoration: underline;
18
+ /* Primary (default) */
19
+ .bd-link--primary {
20
+ color: var(--color-blue-500);
21
21
  }
22
22
 
23
- .bd-link--underline {
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-link-secondary, #6c757d);
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-link-danger, #dc3545);
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-link-disabled, #adb5bd);
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
- primary : "",
28
- secondary: "bd-link--secondary",
29
- danger : "bd-link--danger"
30
- }[this.kind] || "";
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} ${this.underline ? "bd-link--underline" : ""} ${this.disabled
35
- ? "bd-link--disabled"
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);