@repobit/dex-system-design 0.23.7 → 0.23.9

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 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.9](https://github.com/bitdefender/dex-core/compare/@repobit/dex-system-design@0.23.8...@repobit/dex-system-design@0.23.9) (2026-03-31)
7
+
8
+ ### Bug Fixes
9
+
10
+ * **DEX-1014:** quick changes on multiple components
11
+
12
+
13
+ ## [0.23.8](https://github.com/bitdefender/dex-core/compare/@repobit/dex-system-design@0.23.7...@repobit/dex-system-design@0.23.8) (2026-03-25)
14
+
15
+ ### Bug Fixes
16
+
17
+ * **DEX-1014:** fix for compare and awards style issues
18
+
19
+
6
20
  ## [0.23.7](https://github.com/bitdefender/dex-core/compare/@repobit/dex-system-design@0.23.6...@repobit/dex-system-design@0.23.7) (2026-03-24)
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.7",
3
+ "version": "0.23.9",
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",
@@ -86,5 +86,5 @@
86
86
  "volta": {
87
87
  "node": "24.14.0"
88
88
  },
89
- "gitHead": "457a940c4ec1a3e921ff76c656c5850591ac20a8"
89
+ "gitHead": "fd4b2919ca814aa5bbb2f9ee9b1b3c3e21ed0e20"
90
90
  }
@@ -1,70 +1,115 @@
1
1
  import { css } from "lit";
2
2
 
3
+ /**
4
+ * FAQ-style card accordion (Figma accordeon_faq / ds-accordion variant card, compact).
5
+ * Tokens only from truth_tokens — spacing-12 = 12px, radius-md ≈ 6px, etc.
6
+ */
3
7
  export default css`
4
- @layer bd-components {
5
8
  :host {
6
- --background-card-grey: var(--color-neutral-25);
7
- --border-card-grey: var(--color-neutral-50);
8
- --border-card-green: var(--color-green-700);
9
- --badge-background: var(--color-blue-500);
10
- --text-color-white: var(--color-neutral-0);
11
9
  --bd-accesibility-focus: var(--color-blue-500);
12
10
  display: block;
13
11
  }
14
12
 
15
- .bd-accordion-bg-item {
16
- margin-bottom: var(--spacing-16);
17
- border-radius: var(--spacing-8);
13
+ :host(bd-accordion-bg-item) {
14
+ display: block;
15
+ margin-bottom: var(--spacing-12);
16
+ padding: 0 var(--spacing-16);
17
+ box-sizing: border-box;
18
18
  background-color: var(--color-blue-50);
19
- overflow: hidden;
20
- transition: box-shadow 0.3s ease;
19
+ border-radius: var(--radius-lg);
20
+ /* visible so focus ring is not clipped; panel animates with its own overflow */
21
+ overflow: visible;
21
22
  }
22
23
 
23
- .bd-accordion-bg-item:hover {
24
- .bd-accordion-bg-question-text {
25
- text-decoration-line: underline;
26
- }
24
+ :host(bd-accordion-bg-item[data-bd-acc-focus]) {
25
+ outline: none;
26
+ /* Darker outer ring so focus stays visible on --color-blue-50 */
27
+ box-shadow: 0 0 0 2px var(--color-neutral-0),
28
+ 0 0 0 4px var(--color-blue-700);
29
+ position: relative;
30
+ z-index: 1;
31
+ }
32
+
33
+ :host(bd-accordion-bg-item:last-of-type) {
34
+ margin-bottom: 0;
35
+ }
36
+
37
+ :host(bd-accordion-bg-item[no-bg]) {
38
+ margin-bottom: var(--spacing-16);
39
+ padding: 0;
40
+ background-color: transparent;
41
+ border-radius: 0;
42
+ overflow: visible;
43
+ }
44
+
45
+ :host(bd-accordion-bg-item[no-bg]:last-of-type) {
46
+ margin-bottom: 0;
47
+ }
48
+
49
+ :host(bd-accordion-bg-item[no-bg][data-bd-acc-focus]) {
50
+ border-radius: var(--radius-sm);
51
+ box-shadow: var(--focus-outline-primary);
52
+ }
53
+
54
+ .bd-accordion-bg-item {
55
+ margin-bottom: 0;
56
+ border-radius: 0;
57
+ background-color: transparent;
58
+ overflow: visible;
59
+ transition: box-shadow var(--transition-duration-slow)
60
+ var(--transition-easing-smooth);
27
61
  }
28
62
 
29
63
  .bd-accordion-bg-question {
30
64
  cursor: pointer;
31
65
  display: flex;
32
66
  justify-content: flex-start;
33
- align-items: center;
34
- gap: var(--spacing-10);
35
- padding: var(--spacing-16);
36
- font-weight: bold;
37
- background-color: var(--color-blue-50);
38
- color: #333;
39
- transition: background-color 0.3s ease, color 0.3s ease;
67
+ align-items: flex-start;
68
+ gap: var(--spacing-12);
69
+ width: 100%;
70
+ padding: var(--spacing-12) 0;
71
+ margin: 0;
72
+ border: none;
73
+ font: inherit;
74
+ text-align: left;
75
+ font-family: var(--typography-fontFamily-sans);
76
+ font-size: var(--typography-fontSize-lg);
77
+ font-weight: var(--typography-fontWeight-semibold);
78
+ line-height: 1.3;
79
+ background-color: transparent;
80
+ color: var(--color-neutral-900);
81
+ transition: color var(--transition-duration-normal) var(--transition-easing-smooth);
40
82
  }
41
83
 
42
- .bd-accordion-bg-header {
43
- margin-bottom: var(--spacing-32);
84
+ .bd-accordion-bg-question[aria-expanded="true"] {
85
+ color: var(--color-blue-500);
86
+ }
87
+
88
+ .bd-accordion-bg-question[aria-expanded="false"] {
89
+ color: var(--color-neutral-900);
44
90
  }
45
91
 
46
92
  .bd-accordion-bg-question:hover {
47
- color: #0073e6;
93
+ color: var(--color-blue-600);
48
94
  }
49
95
 
50
- .bd-accordion-bg-item:focus-visible {
51
- outline: var(--spacing-2) solid var(--bd-accesibility-focus);
52
- outline-offset: var(--spacing-2);
53
- border-radius: var(--space-2xs);
96
+ .bd-accordion-bg-question:hover .bd-accordion-bg-question-text {
97
+ text-decoration-line: none;
54
98
  }
55
99
 
56
- .bd-accordion-bg-item:focus {
57
- .bd-accordion-bg-question-text {
58
- font-weight: 600;
59
- text-decoration-line: underline;
60
- color: var(--color-blue-600);
61
- text-decoration-thickness: var(--spacing-2);
62
- }
100
+ .bd-accordion-bg-question:focus-visible {
101
+ outline: none;
102
+ box-shadow: none;
103
+ }
104
+
105
+ .bd-accordion-bg-header {
106
+ margin-bottom: var(--spacing-32);
63
107
  }
64
108
 
65
109
  .bd-accordion-bg-question-text {
66
- font-family: var(--typography-fontFamily-sans);
67
- font-weight: var(--typography-fontWeight-semibold);
110
+ font-family: inherit;
111
+ font-weight: inherit;
112
+ font-size: inherit;
68
113
  }
69
114
 
70
115
  .bd-accordion-bg-title {
@@ -76,56 +121,57 @@ export default css`
76
121
  }
77
122
 
78
123
  .bd-accordion-bg-icon {
79
- transition: transform 0.3s ease;
80
- width: var(--spacing-14);
81
- height: var(--spacing-14);
82
- color: var(--color-blue-500);
83
- text-align: center;
84
- position: relative;
85
- bottom: 1px;
86
- }
87
-
88
- .bd-accordion-bg-icon {
89
- transition: transform 0.3s ease;
90
- width: var(--spacing-14);
91
- height: var(--spacing-14);
92
- color: var(--color-blue-500);
93
- text-align: center;
94
- position: relative;
95
- }
96
-
97
- .bd-accordion-bg-item:not(.open) .bd-accordion-bg-icon {
98
- content: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" width="14" height="14"><rect x="6" width="2" height="14" fill="%23006DFF"/><rect x="14" y="6" width="2" height="14" transform="rotate(90 14 6)" fill="%23006DFF"/></svg>');
124
+ width: var(--icon-sm-size);
125
+ height: var(--icon-sm-size);
126
+ min-width: var(--icon-sm-size);
127
+ flex-shrink: 0;
128
+ display: flex;
129
+ align-items: center;
130
+ justify-content: center;
131
+ line-height: 0;
132
+ user-select: none;
133
+ /* Match question line-height (1.3) — icon aligns to first line when title wraps */
134
+ margin-top: calc((1.3 * 1em - var(--icon-sm-size)) / 2);
99
135
  }
100
136
 
101
- .bd-accordion-bg-item.open .bd-accordion-bg-icon {
102
- content: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" width="14" height="14"><rect x="14" y="6" width="2" height="14" transform="rotate(90 14 6)" fill="%23006DFF"/></svg>');
137
+ .bd-accordion-bg-icon img {
138
+ display: block;
139
+ width: 100%;
140
+ height: 100%;
141
+ object-fit: contain;
103
142
  }
104
143
 
144
+ /* Panel: Figma 244:943 — padding 0, 0, 12px, 28px (icon 16 + gap 12) */
105
145
  .bd-accordion-bg-answer {
106
146
  overflow: hidden;
107
147
  max-height: 0;
108
148
  opacity: 0;
109
- padding: 0 var(--spacing-16);
110
- background-color: var(--color-blue-50);
149
+ padding: var(--spacing-0) var(--spacing-0) var(--spacing-0)
150
+ calc(var(--icon-sm-size) + var(--spacing-12));
151
+ background-color: transparent;
111
152
  font-family: var(--typography-fontFamily-sans);
112
- font-weight: var(--font-weight-sans-medium);
153
+ font-size: var(--typography-fontSize-sm);
154
+ font-weight: var(--typography-fontWeight-normal);
155
+ line-height: var(--typography-lineHeight-normal);
156
+ color: var(--color-neutral-700);
113
157
  transition: none;
114
- padding-left: calc(var(--spacing-14) + var(--spacing-10) + var(--spacing-16));
158
+ }
115
159
 
160
+ .bd-accordion-bg-answer[hidden] {
161
+ display: none !important;
116
162
  }
117
- .bd-accordion-bg-answer {
118
- display: none;
119
- }
120
- .bd-accordion-bg-item.open .bd-accordion-bg-answer {
121
- display: block;
122
- }
163
+
123
164
  .bd-accordion-bg-item.open .bd-accordion-bg-answer {
165
+ display: block;
124
166
  max-height: 5000px;
125
167
  opacity: 1;
126
- padding-bottom: var(--spacing-16);
127
- padding-left: calc(var(--spacing-14) + var(--spacing-10) + var(--spacing-16));
168
+ padding: var(--spacing-0) var(--spacing-0) var(--spacing-12)
169
+ calc(var(--icon-sm-size) + var(--spacing-12));
170
+ }
128
171
 
172
+ /* Slotted <p> default margins read as extra “padding” in devtools; spec has no panel padding-top */
173
+ ::slotted(p) {
174
+ margin: var(--spacing-0);
129
175
  }
130
176
 
131
177
  .bd-accordion-bg-answer > div {
@@ -139,18 +185,6 @@ export default css`
139
185
  padding-bottom: var(--spacing-64);
140
186
  }
141
187
 
142
- .bd-accordion-bg-link-noline {
143
- text-decoration: none;
144
- }
145
-
146
- .test-accordion {
147
- background-color: blue;
148
- }
149
-
150
- .test-accordion p {
151
- font-size: 20px;
152
- }
153
-
154
188
  .bd-accordion-bg-container.no-bg {
155
189
  background: none;
156
190
  }
@@ -169,7 +203,6 @@ export default css`
169
203
  padding: 0 var(--spacing-40);
170
204
  }
171
205
 
172
- /* REGULĂ NOUĂ PENTRU NO-BG DESCHIS */
173
206
  .bd-accordion-bg-item.no-bg.open .bd-accordion-bg-answer {
174
207
  padding: var(--spacing-16) var(--spacing-40);
175
208
  }
@@ -178,21 +211,7 @@ export default css`
178
211
  background-color: transparent;
179
212
  }
180
213
 
181
- .bd-accordion-bg-item.no-bg:hover .bd-accordion-bg-question-text {
214
+ .bd-accordion-bg-item.no-bg .bd-accordion-bg-question:hover .bd-accordion-bg-question-text {
182
215
  text-decoration-line: none;
183
216
  }
184
-
185
- .bd-accordion-bg-item:hover .bd-accordion-bg-question-text {
186
- text-decoration-line: none;
187
- }
188
-
189
- .bd-accordion-bg-item:focus .bd-accordion-bg-question-text {
190
- text-decoration-line: none;
191
- }
192
-
193
- .bd-accordion-bg-item.no-bg:focus .bd-accordion-bg-question-text {
194
- text-decoration-line: none;
195
- }
196
- }
197
-
198
217
  `;
@@ -1,11 +1,15 @@
1
1
  import { LitElement, html } from "lit";
2
2
  import { tokens } from "../../tokens/tokens.js";
3
- import accordionCSS from "./accordion-bg.css";
3
+ import accordionCSS from "./accordion-bg.css.js";
4
+ import {
5
+ ACCORDION_ICON_MINUS,
6
+ ACCORDION_ICON_PLUS
7
+ } from "./accordion-indicators.js";
4
8
 
5
9
  class BdAccordionBg extends LitElement {
6
10
  static properties = {
7
11
  title: { type: String },
8
- noBg : { type: Boolean, attribute: 'no-bg' }
12
+ noBg : { type: Boolean, reflect: true, attribute: "no-bg" }
9
13
  };
10
14
 
11
15
  constructor() {
@@ -17,7 +21,7 @@ class BdAccordionBg extends LitElement {
17
21
 
18
22
  render() {
19
23
  return html`
20
- <div class="bd-accordion-bg-container ${this.noBg ? 'no-bg' : ''}">
24
+ <div class="bd-accordion-bg-container ${this.noBg ? "no-bg" : ""}">
21
25
  <div class="bd-accordion-bg-header">
22
26
  <h1 class="bd-accordion-bg-title">${this.title}</h1>
23
27
  </div>
@@ -29,10 +33,9 @@ class BdAccordionBg extends LitElement {
29
33
 
30
34
  class BdAccordionBgItem extends LitElement {
31
35
  static properties = {
32
- title : { type: String },
33
- open : { type: Boolean, reflect: true },
34
- noBg : { type: Boolean, attribute: 'no-bg' },
35
- _accordionId: { type: String, state: true }
36
+ title: { type: String },
37
+ open : { type: Boolean, reflect: true },
38
+ noBg : { type: Boolean, reflect: true, attribute: "no-bg" }
36
39
  };
37
40
 
38
41
  constructor() {
@@ -40,15 +43,12 @@ class BdAccordionBgItem extends LitElement {
40
43
  this.title = "";
41
44
  this.open = false;
42
45
  this.noBg = false;
43
- this._accordionId = "";
44
- }
45
-
46
- firstUpdated() {
47
- // Generează ID-ul doar după ce elementul este conectat la DOM
48
- if (!this._accordionId) {
49
- this._accordionId = `accordion-${Math.random().toString(36)
50
- .substr(2, 9)}`;
51
- }
46
+ const id = Math.random().toString(36)
47
+ .slice(2, 11);
48
+ /** @type {string} */
49
+ this._headerId = `acc-bg-h-${id}`;
50
+ /** @type {string} */
51
+ this._panelId = `acc-bg-p-${id}`;
52
52
  }
53
53
 
54
54
  static styles = [tokens, accordionCSS];
@@ -57,43 +57,55 @@ class BdAccordionBgItem extends LitElement {
57
57
  this.open = !this.open;
58
58
  }
59
59
 
60
- handleKeyDown(event) {
61
- if (event.key === "Enter" || event.key === " ") {
62
- event.preventDefault();
63
- this.toggleItem();
64
- }
60
+ _onTriggerFocusIn() {
61
+ const btn = this.renderRoot?.querySelector(".bd-accordion-bg-question");
62
+ if (!btn) return;
63
+ requestAnimationFrame(() => {
64
+ requestAnimationFrame(() => {
65
+ if (btn.matches(":focus-visible")) {
66
+ this.setAttribute("data-bd-acc-focus", "");
67
+ }
68
+ });
69
+ });
65
70
  }
66
71
 
67
- /**
68
- * @param {Event} e
69
- */
70
- #onSlot(e) {
71
- const slot = e.currentTarget;
72
- slot.classList.add('accordion-test');
72
+ _onTriggerFocusOut() {
73
+ this.removeAttribute("data-bd-acc-focus");
73
74
  }
74
75
 
75
76
  render() {
76
77
  return html`
77
78
  <div
78
- class="bd-accordion-bg-item ${this.open ? "open" : ""} ${this.noBg ? 'no-bg' : ''}"
79
- role="button"
80
- aria-expanded="${this.open}"
81
- aria-controls="${this._accordionId}"
82
- tabindex="0"
83
- @click=${this.toggleItem}
84
- @keydown=${this.handleKeyDown}
79
+ class="bd-accordion-bg-item ${this.open ? "open" : ""} ${this.noBg ? "no-bg" : ""}"
85
80
  >
86
- <div class="bd-accordion-bg-question">
87
- <div class="bd-accordion-bg-icon"></div>
81
+ <button
82
+ type="button"
83
+ id="${this._headerId}"
84
+ class="bd-accordion-bg-question"
85
+ aria-expanded="${this.open}"
86
+ aria-controls="${this._panelId}"
87
+ @click=${this.toggleItem}
88
+ @focusin=${this._onTriggerFocusIn}
89
+ @focusout=${this._onTriggerFocusOut}
90
+ >
91
+ <span class="bd-accordion-bg-icon" aria-hidden="true">
92
+ <img
93
+ src=${this.open ? ACCORDION_ICON_MINUS : ACCORDION_ICON_PLUS}
94
+ width="16"
95
+ height="16"
96
+ alt=""
97
+ />
98
+ </span>
88
99
  <span class="bd-accordion-bg-question-text">${this.title}</span>
89
- </div>
100
+ </button>
90
101
  <div
91
- id="${this._accordionId}"
102
+ id="${this._panelId}"
92
103
  class="bd-accordion-bg-answer"
93
104
  role="region"
94
- aria-labelledby="${this._accordionId}"
105
+ aria-labelledby="${this._headerId}"
106
+ ?hidden=${!this.open}
95
107
  >
96
- <slot @slotchange=${this.#onSlot}></slot>
108
+ <slot></slot>
97
109
  </div>
98
110
  </div>
99
111
  `;
@@ -101,4 +113,4 @@ class BdAccordionBgItem extends LitElement {
101
113
  }
102
114
 
103
115
  customElements.define("bd-accordion-bg", BdAccordionBg);
104
- customElements.define("bd-accordion-bg-item", BdAccordionBgItem);
116
+ customElements.define("bd-accordion-bg-item", BdAccordionBgItem);