@bluevolt-tech/lumen 2.0.1 → 2.1.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 (56) hide show
  1. package/README.md +37 -23
  2. package/dist/components/_shared/adopt-styles.d.ts +8 -0
  3. package/dist/components/_shared/date-range-validator.d.ts +61 -0
  4. package/dist/components/_shared/dropdown-controller.d.ts +31 -0
  5. package/dist/components/_shared/selectable-card.d.ts +10 -0
  6. package/dist/components/bv-alert-banner/bv-alert-banner.js +19 -17
  7. package/dist/components/bv-avatar/bv-avatar.js +19 -11
  8. package/dist/components/bv-badge/bv-badge.js +19 -11
  9. package/dist/components/bv-button/bv-button.js +18 -16
  10. package/dist/components/bv-category-pill/bv-category-pill.js +18 -16
  11. package/dist/components/bv-checkbox/bv-checkbox.js +19 -11
  12. package/dist/components/bv-chip/bv-chip.js +19 -11
  13. package/dist/components/bv-course-detail/bv-course-detail.js +20 -34
  14. package/dist/components/bv-course-detail-modal/bv-course-detail-modal.js +24 -90
  15. package/dist/components/bv-course-grid-card/bv-course-grid-card.d.ts +2 -6
  16. package/dist/components/bv-course-grid-card/bv-course-grid-card.js +98 -105
  17. package/dist/components/bv-course-list-card/bv-course-list-card.d.ts +2 -6
  18. package/dist/components/bv-course-list-card/bv-course-list-card.js +98 -105
  19. package/dist/components/bv-course-outline/bv-course-outline.js +19 -11
  20. package/dist/components/bv-date-range-input/bv-date-range-input.d.ts +4 -6
  21. package/dist/components/bv-date-range-input/bv-date-range-input.js +460 -122
  22. package/dist/components/bv-date-range-picker/bv-date-range-picker.d.ts +17 -3
  23. package/dist/components/bv-date-range-picker/bv-date-range-picker.js +339 -73
  24. package/dist/components/bv-empty-state/bv-empty-state.js +20 -28
  25. package/dist/components/bv-filter-dropdown/bv-filter-dropdown.d.ts +1 -4
  26. package/dist/components/bv-filter-dropdown/bv-filter-dropdown.js +78 -53
  27. package/dist/components/bv-filter-panel/bv-filter-panel.js +20 -22
  28. package/dist/components/bv-icon/bv-icon.js +19 -11
  29. package/dist/components/bv-input/bv-input.js +18 -16
  30. package/dist/components/bv-input-dropdown/bv-input-dropdown.d.ts +1 -4
  31. package/dist/components/bv-input-dropdown/bv-input-dropdown.js +77 -78
  32. package/dist/components/bv-modal/bv-modal.js +19 -11
  33. package/dist/components/bv-page-title/bv-page-title.js +19 -6
  34. package/dist/components/bv-pagination/bv-pagination.d.ts +1 -0
  35. package/dist/components/bv-pagination/bv-pagination.js +23 -186
  36. package/dist/components/bv-portal-header/bv-portal-header.js +25 -83
  37. package/dist/components/bv-portal-layout/bv-portal-layout.js +19 -11
  38. package/dist/components/bv-progress-bar/bv-progress-bar.js +19 -11
  39. package/dist/components/bv-promo-banner/bv-promo-banner.js +19 -11
  40. package/dist/components/bv-radio/bv-radio.js +19 -11
  41. package/dist/components/bv-searchbox/bv-searchbox.js +19 -11
  42. package/dist/components/bv-segmented-control/bv-segmented-control.js +18 -16
  43. package/dist/components/bv-select/bv-select.d.ts +1 -4
  44. package/dist/components/bv-select/bv-select.js +76 -44
  45. package/dist/components/bv-split-button/bv-split-button.d.ts +1 -4
  46. package/dist/components/bv-split-button/bv-split-button.js +76 -42
  47. package/dist/components/bv-star-rating/bv-star-rating.js +19 -11
  48. package/dist/components/bv-table/bv-table.d.ts +5 -0
  49. package/dist/components/bv-table/bv-table.js +69 -19
  50. package/dist/components/bv-toggle/bv-toggle.js +19 -11
  51. package/dist/components/bv-tooltip/bv-tooltip.js +19 -17
  52. package/dist/components/bv-user-row/bv-user-row.js +22 -50
  53. package/dist/components/bv-view-switcher/bv-view-switcher.js +19 -11
  54. package/dist/themes/base.css +1 -1
  55. package/package.json +8 -1
  56. package/themes/base.css +1 -1
@@ -1,6 +1,24 @@
1
1
  // css-inline:/home/runner/work/BV_lumen/BV_lumen/components/bv-toggle/bv-toggle.css
2
2
  var bv_toggle_default = ":host {\n --bv-toggle-width: 44px;\n --bv-toggle-height: 24px;\n --bv-toggle-track-off: var(--bv-color-neutral-300);\n --bv-toggle-track-on: var(--bv-color-primary);\n --bv-toggle-thumb: var(--bv-color-neutral-0);\n display: inline-flex;\n font-family: var(--bv-font-family-base);\n}\n\n:host([hidden]) {\n display: none;\n}\n\n:host([size='sm']) {\n --bv-toggle-width: 32px;\n --bv-toggle-height: 18px;\n}\n\n.wrap {\n display: inline-flex;\n align-items: center;\n gap: 8px;\n cursor: pointer;\n user-select: none;\n}\n\n:host([disabled]) .wrap {\n cursor: not-allowed;\n opacity: 0.5;\n}\n\n.track {\n position: relative;\n width: var(--bv-toggle-width);\n height: var(--bv-toggle-height);\n border-radius: var(--bv-radius-full);\n background: var(--bv-toggle-track-off);\n transition: background var(--bv-transition-fast);\n flex-shrink: 0;\n}\n\n:host([checked]) .track {\n background: var(--bv-toggle-track-on);\n}\n\n.thumb {\n position: absolute;\n top: 3px;\n left: 3px;\n width: calc(var(--bv-toggle-height) - 6px);\n height: calc(var(--bv-toggle-height) - 6px);\n border-radius: 50%;\n background: var(--bv-toggle-thumb);\n box-shadow: var(--bv-shadow-sm);\n transition: transform var(--bv-transition-fast);\n}\n\n:host([checked]) .thumb {\n transform: translateX(calc(var(--bv-toggle-width) - var(--bv-toggle-height)));\n}\n\n.label {\n font-size: var(--bv-font-size-sm);\n color: var(--bv-color-neutral-800);\n line-height: 20px;\n}\n\n:host([size='sm']) .label {\n font-size: var(--bv-font-size-xs);\n line-height: 18px;\n}\n";
3
3
 
4
+ // components/_shared/adopt-styles.ts
5
+ var _sheetCache = /* @__PURE__ */ new Map();
6
+ function adoptStyles(shadow, css) {
7
+ if ("adoptedStyleSheets" in ShadowRoot.prototype && typeof CSSStyleSheet !== "undefined" && "replaceSync" in CSSStyleSheet.prototype) {
8
+ let sheet = _sheetCache.get(css);
9
+ if (!sheet) {
10
+ sheet = new CSSStyleSheet();
11
+ sheet.replaceSync(css);
12
+ _sheetCache.set(css, sheet);
13
+ }
14
+ shadow.adoptedStyleSheets = [sheet];
15
+ return;
16
+ }
17
+ const style = document.createElement("style");
18
+ style.textContent = css;
19
+ shadow.appendChild(style);
20
+ }
21
+
4
22
  // components/bv-toggle/bv-toggle.ts
5
23
  var BvToggle = class extends HTMLElement {
6
24
  static observedAttributes = ["checked", "disabled", "label", "size"];
@@ -8,12 +26,7 @@ var BvToggle = class extends HTMLElement {
8
26
  _labelEl = null;
9
27
  constructor() {
10
28
  super();
11
- this.attachShadow({ mode: "open" });
12
- if ("replaceSync" in CSSStyleSheet.prototype) {
13
- const sheet = new CSSStyleSheet();
14
- sheet.replaceSync(bv_toggle_default);
15
- this.shadowRoot.adoptedStyleSheets = [sheet];
16
- }
29
+ adoptStyles(this.attachShadow({ mode: "open" }), bv_toggle_default);
17
30
  }
18
31
  connectedCallback() {
19
32
  this._render();
@@ -33,11 +46,6 @@ var BvToggle = class extends HTMLElement {
33
46
  if (this._rendered) return;
34
47
  this._rendered = true;
35
48
  const shadow = this.shadowRoot;
36
- if (!shadow.adoptedStyleSheets.length) {
37
- const s = document.createElement("style");
38
- s.textContent = bv_toggle_default;
39
- shadow.appendChild(s);
40
- }
41
49
  const wrap = document.createElement("label");
42
50
  wrap.className = "wrap";
43
51
  const track = document.createElement("span");
@@ -1,16 +1,26 @@
1
1
  // css-inline:/home/runner/work/BV_lumen/BV_lumen/components/bv-tooltip/bv-tooltip.css
2
2
  var bv_tooltip_default = ":host {\n display: inline-flex;\n align-items: center;\n position: relative;\n font-family: var(--bv-font-family-base);\n}\n\n:host([hidden]) {\n display: none;\n}\n\n.wrap {\n display: inline-flex;\n align-items: center;\n position: relative;\n}\n\n.trigger {\n display: inline-flex;\n align-items: center;\n cursor: help;\n color: var(--bv-color-neutral-400);\n outline: none;\n border: none;\n background: none;\n padding: 0;\n line-height: 0;\n}\n\n.trigger:hover,\n.trigger:focus {\n color: var(--bv-color-neutral-600);\n}\n\n.trigger svg {\n display: block;\n width: 14px;\n height: 14px;\n}\n\n/* \u2500\u2500 Popup \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n\n.popup {\n /* Shown/positioned entirely via JS \u2014 display starts as none */\n display: none;\n position: absolute;\n z-index: 500;\n min-width: 200px;\n max-width: 300px;\n background: var(--bv-color-neutral-900);\n color: var(--bv-color-neutral-0);\n border-radius: var(--bv-radius-md);\n padding: 10px 12px;\n font-size: var(--bv-font-size-xs);\n font-weight: var(--bv-font-weight-regular);\n line-height: 1.6;\n box-shadow: var(--bv-shadow-lg);\n pointer-events: none;\n white-space: normal;\n}\n\n/* \u2500\u2500 Content \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n\n.text-content {\n display: none;\n}\n\n:host([text]) .text-content {\n display: block;\n}\n\n:host([text]) slot {\n display: none;\n}\n\n::slotted(p) {\n margin: 0 0 4px;\n}\n\n::slotted(p:last-child) {\n margin-bottom: 0;\n}\n";
3
3
 
4
- // components/bv-tooltip/bv-tooltip.ts
5
- var QUESTION_MARK_SVG = `<svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><circle cx="12" cy="12" r="10"/><path d="M9.09 9a3 3 0 0 1 5.83 1c0 2-3 3-3 3"/><line x1="12" y1="17" x2="12.01" y2="17"/></svg>`;
6
- var _sheet = null;
7
- function getSheet() {
8
- if (!_sheet) {
9
- _sheet = new CSSStyleSheet();
10
- _sheet.replaceSync(bv_tooltip_default);
4
+ // components/_shared/adopt-styles.ts
5
+ var _sheetCache = /* @__PURE__ */ new Map();
6
+ function adoptStyles(shadow, css) {
7
+ if ("adoptedStyleSheets" in ShadowRoot.prototype && typeof CSSStyleSheet !== "undefined" && "replaceSync" in CSSStyleSheet.prototype) {
8
+ let sheet = _sheetCache.get(css);
9
+ if (!sheet) {
10
+ sheet = new CSSStyleSheet();
11
+ sheet.replaceSync(css);
12
+ _sheetCache.set(css, sheet);
13
+ }
14
+ shadow.adoptedStyleSheets = [sheet];
15
+ return;
11
16
  }
12
- return _sheet;
17
+ const style = document.createElement("style");
18
+ style.textContent = css;
19
+ shadow.appendChild(style);
13
20
  }
21
+
22
+ // components/bv-tooltip/bv-tooltip.ts
23
+ var QUESTION_MARK_SVG = `<svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><circle cx="12" cy="12" r="10"/><path d="M9.09 9a3 3 0 0 1 5.83 1c0 2-3 3-3 3"/><line x1="12" y1="17" x2="12.01" y2="17"/></svg>`;
14
24
  var _uid = 0;
15
25
  var BvTooltip = class extends HTMLElement {
16
26
  static observedAttributes = ["text", "position"];
@@ -20,10 +30,7 @@ var BvTooltip = class extends HTMLElement {
20
30
  _popupEl = null;
21
31
  constructor() {
22
32
  super();
23
- const shadow = this.attachShadow({ mode: "open" });
24
- if ("adoptedStyleSheets" in ShadowRoot.prototype) {
25
- shadow.adoptedStyleSheets = [getSheet()];
26
- }
33
+ adoptStyles(this.attachShadow({ mode: "open" }), bv_tooltip_default);
27
34
  }
28
35
  get text() {
29
36
  return this.getAttribute("text") ?? "";
@@ -50,11 +57,6 @@ var BvTooltip = class extends HTMLElement {
50
57
  if (this._rendered) return;
51
58
  this._rendered = true;
52
59
  const shadow = this.shadowRoot;
53
- if (!shadow.adoptedStyleSheets.length) {
54
- const s = document.createElement("style");
55
- s.textContent = bv_tooltip_default;
56
- shadow.appendChild(s);
57
- }
58
60
  const wrap = document.createElement("span");
59
61
  wrap.className = "wrap";
60
62
  const popupId = `bv-tooltip-popup-${++_uid}`;
@@ -1,6 +1,24 @@
1
1
  // css-inline:/home/runner/work/BV_lumen/BV_lumen/components/bv-user-row/bv-user-row.css
2
2
  var bv_user_row_default = ":host {\n display: inline-block;\n}\n\n.row {\n display: inline-flex;\n align-items: center;\n gap: var(--bv-spacing-lg);\n}\n\n/* User info */\n.user-info {\n display: flex;\n align-items: center;\n gap: var(--bv-spacing-md);\n min-width: 0;\n}\n\nbv-avatar {\n --bv-avatar-size: 56px;\n flex-shrink: 0;\n}\n\n.text-col {\n display: flex;\n flex-direction: column;\n min-width: 0;\n}\n\n.user-name {\n font-family: var(--bv-font-family-base);\n font-size: var(--bv-font-size-lg);\n font-weight: var(--bv-font-weight-semibold);\n color: var(--bv-color-secondary-foreground);\n line-height: 28px;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.user-org {\n font-family: var(--bv-font-family-base);\n font-size: var(--bv-font-size-md);\n font-weight: var(--bv-font-weight-regular);\n color: var(--bv-color-neutral-600);\n line-height: 24px;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n/* Edit action host \u2014 flex to keep either <bv-button> or <a> aligned */\n.edit-action {\n flex-shrink: 0;\n display: inline-flex;\n}\n\n/* Edit button \u2014 white bg, neutral border */\n.edit-btn {\n --bv-button-bg: var(--bv-color-neutral-0);\n --bv-button-bg-hover: var(--bv-color-neutral-100);\n --bv-button-color: var(--bv-color-secondary-foreground);\n --bv-button-border-color: var(--bv-color-neutral-300);\n --bv-button-border-color-hover: var(--bv-color-neutral-400);\n flex-shrink: 0;\n}\n\n/* Edit link \u2014 same visual as .edit-btn, but a real anchor */\n.edit-link {\n display: inline-flex;\n align-items: center;\n gap: var(--bv-spacing-sm);\n padding: 8px 16px;\n background: var(--bv-color-neutral-0);\n color: var(--bv-color-secondary-foreground);\n border: 1px solid var(--bv-color-neutral-300);\n border-radius: var(--bv-radius-md);\n font-family: var(--bv-font-family-base);\n font-size: var(--bv-font-size-sm);\n font-weight: var(--bv-font-weight-medium);\n text-decoration: none;\n cursor: pointer;\n transition:\n background var(--bv-transition-fast),\n border-color var(--bv-transition-fast);\n}\n\n.edit-link:hover {\n background: var(--bv-color-neutral-100);\n border-color: var(--bv-color-neutral-400);\n}\n\n.edit-link:focus-visible {\n outline: 2px solid var(--bv-color-primary);\n outline-offset: 2px;\n}\n";
3
3
 
4
+ // components/_shared/adopt-styles.ts
5
+ var _sheetCache = /* @__PURE__ */ new Map();
6
+ function adoptStyles(shadow, css) {
7
+ if ("adoptedStyleSheets" in ShadowRoot.prototype && typeof CSSStyleSheet !== "undefined" && "replaceSync" in CSSStyleSheet.prototype) {
8
+ let sheet = _sheetCache.get(css);
9
+ if (!sheet) {
10
+ sheet = new CSSStyleSheet();
11
+ sheet.replaceSync(css);
12
+ _sheetCache.set(css, sheet);
13
+ }
14
+ shadow.adoptedStyleSheets = [sheet];
15
+ return;
16
+ }
17
+ const style = document.createElement("style");
18
+ style.textContent = css;
19
+ shadow.appendChild(style);
20
+ }
21
+
4
22
  // css-inline:/home/runner/work/BV_lumen/BV_lumen/components/bv-avatar/bv-avatar.css
5
23
  var bv_avatar_default = ":host {\n --bv-avatar-size: 40px;\n --bv-avatar-bg: var(--bv-color-primary-light);\n --bv-avatar-color: var(--bv-color-primary);\n --bv-avatar-radius: var(--bv-radius-full);\n display: inline-flex;\n}\n\n:host([size='xs']) {\n --bv-avatar-size: 24px;\n}\n:host([size='sm']) {\n --bv-avatar-size: 32px;\n}\n:host([size='md']) {\n --bv-avatar-size: 40px;\n}\n:host([size='lg']) {\n --bv-avatar-size: 48px;\n}\n:host([size='xl']) {\n --bv-avatar-size: 64px;\n}\n\n.avatar {\n width: var(--bv-avatar-size);\n height: var(--bv-avatar-size);\n border-radius: var(--bv-avatar-radius);\n background: var(--bv-avatar-bg);\n color: var(--bv-avatar-color);\n display: inline-flex;\n align-items: center;\n justify-content: center;\n overflow: hidden;\n flex-shrink: 0;\n font-family: var(--bv-font-family-base);\n font-weight: var(--bv-font-weight-semibold);\n font-size: calc(var(--bv-avatar-size) * 0.38);\n user-select: none;\n}\n\n.avatar img {\n width: 100%;\n height: 100%;\n object-fit: cover;\n display: block;\n}\n";
6
24
 
@@ -12,12 +30,7 @@ var BvAvatar = class extends HTMLElement {
12
30
  _label = null;
13
31
  constructor() {
14
32
  super();
15
- this.attachShadow({ mode: "open" });
16
- if ("replaceSync" in CSSStyleSheet.prototype) {
17
- const sheet = new CSSStyleSheet();
18
- sheet.replaceSync(bv_avatar_default);
19
- this.shadowRoot.adoptedStyleSheets = [sheet];
20
- }
33
+ adoptStyles(this.attachShadow({ mode: "open" }), bv_avatar_default);
21
34
  }
22
35
  connectedCallback() {
23
36
  this._render();
@@ -32,11 +45,6 @@ var BvAvatar = class extends HTMLElement {
32
45
  if (this._rendered) return;
33
46
  this._rendered = true;
34
47
  const shadow = this.shadowRoot;
35
- if (!shadow.adoptedStyleSheets.length) {
36
- const s = document.createElement("style");
37
- s.textContent = bv_avatar_default;
38
- shadow.appendChild(s);
39
- }
40
48
  const div = document.createElement("div");
41
49
  div.className = "avatar";
42
50
  const src = this.getAttribute("src");
@@ -157,14 +165,6 @@ var rawIcons = {
157
165
  };
158
166
 
159
167
  // components/bv-button/bv-button.ts
160
- var _sheet = null;
161
- function getSheet() {
162
- if (!_sheet) {
163
- _sheet = new CSSStyleSheet();
164
- _sheet.replaceSync(bv_button_default);
165
- }
166
- return _sheet;
167
- }
168
168
  var BvButton = class extends HTMLElement {
169
169
  static observedAttributes = [
170
170
  "variant",
@@ -180,10 +180,7 @@ var BvButton = class extends HTMLElement {
180
180
  ];
181
181
  constructor() {
182
182
  super();
183
- const shadow = this.attachShadow({ mode: "open" });
184
- if ("adoptedStyleSheets" in ShadowRoot.prototype) {
185
- shadow.adoptedStyleSheets = [getSheet()];
186
- }
183
+ adoptStyles(this.attachShadow({ mode: "open" }), bv_button_default);
187
184
  }
188
185
  // ── Accessors ────────────────────────────────────────────────
189
186
  get variant() {
@@ -240,11 +237,6 @@ var BvButton = class extends HTMLElement {
240
237
  const shadow = this.shadowRoot;
241
238
  let btn = shadow.querySelector("button");
242
239
  if (!btn) {
243
- if (!shadow.adoptedStyleSheets.length) {
244
- const styleEl = document.createElement("style");
245
- styleEl.textContent = bv_button_default;
246
- shadow.appendChild(styleEl);
247
- }
248
240
  btn = document.createElement("button");
249
241
  btn.setAttribute("part", "button");
250
242
  btn.appendChild(document.createElement("slot"));
@@ -308,12 +300,7 @@ var BvIcon = class extends HTMLElement {
308
300
  _wrap = null;
309
301
  constructor() {
310
302
  super();
311
- this.attachShadow({ mode: "open" });
312
- if ("replaceSync" in CSSStyleSheet.prototype) {
313
- const sheet = new CSSStyleSheet();
314
- sheet.replaceSync(bv_icon_default);
315
- this.shadowRoot.adoptedStyleSheets = [sheet];
316
- }
303
+ adoptStyles(this.attachShadow({ mode: "open" }), bv_icon_default);
317
304
  }
318
305
  connectedCallback() {
319
306
  this._render();
@@ -325,11 +312,6 @@ var BvIcon = class extends HTMLElement {
325
312
  if (this._rendered) return;
326
313
  this._rendered = true;
327
314
  const shadow = this.shadowRoot;
328
- if (!shadow.adoptedStyleSheets.length) {
329
- const s = document.createElement("style");
330
- s.textContent = bv_icon_default;
331
- shadow.appendChild(s);
332
- }
333
315
  this._wrap = document.createElement("span");
334
316
  this._wrap.className = "icon-wrap";
335
317
  shadow.appendChild(this._wrap);
@@ -375,12 +357,7 @@ var BvUserRow = class extends HTMLElement {
375
357
  _els = {};
376
358
  constructor() {
377
359
  super();
378
- this.attachShadow({ mode: "open" });
379
- if ("replaceSync" in CSSStyleSheet.prototype) {
380
- const sheet = new CSSStyleSheet();
381
- sheet.replaceSync(bv_user_row_default);
382
- this.shadowRoot.adoptedStyleSheets = [sheet];
383
- }
360
+ adoptStyles(this.attachShadow({ mode: "open" }), bv_user_row_default);
384
361
  }
385
362
  connectedCallback() {
386
363
  this._render();
@@ -424,11 +401,6 @@ var BvUserRow = class extends HTMLElement {
424
401
  if (this._rendered) return;
425
402
  this._rendered = true;
426
403
  const shadow = this.shadowRoot;
427
- if (!shadow.adoptedStyleSheets.length) {
428
- const s = document.createElement("style");
429
- s.textContent = bv_user_row_default;
430
- shadow.appendChild(s);
431
- }
432
404
  const row = document.createElement("div");
433
405
  row.className = "row";
434
406
  const userInfo = document.createElement("div");
@@ -1,6 +1,24 @@
1
1
  // css-inline:/home/runner/work/BV_lumen/BV_lumen/components/bv-view-switcher/bv-view-switcher.css
2
2
  var bv_view_switcher_default = ":host {\n display: inline-flex;\n}\n\n.switcher {\n display: inline-flex;\n gap: 4px;\n padding: 4px;\n background: var(--bv-color-neutral-100);\n border-radius: var(--bv-radius-lg);\n}\n\n.view-btn {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 32px;\n height: 32px;\n border: 1px solid transparent;\n border-radius: var(--bv-radius-md);\n background: transparent;\n color: var(--bv-color-neutral-500);\n cursor: pointer;\n transition:\n background var(--bv-transition-fast),\n border-color var(--bv-transition-fast),\n color var(--bv-transition-fast);\n}\n\n.view-btn:hover {\n background: var(--bv-color-neutral-0);\n color: var(--bv-color-neutral-700);\n}\n\n.view-btn.active {\n background: var(--bv-color-neutral-0);\n border-color: var(--bv-color-primary);\n color: var(--bv-color-primary);\n box-shadow: var(--bv-shadow-sm);\n}\n";
3
3
 
4
+ // components/_shared/adopt-styles.ts
5
+ var _sheetCache = /* @__PURE__ */ new Map();
6
+ function adoptStyles(shadow, css) {
7
+ if ("adoptedStyleSheets" in ShadowRoot.prototype && typeof CSSStyleSheet !== "undefined" && "replaceSync" in CSSStyleSheet.prototype) {
8
+ let sheet = _sheetCache.get(css);
9
+ if (!sheet) {
10
+ sheet = new CSSStyleSheet();
11
+ sheet.replaceSync(css);
12
+ _sheetCache.set(css, sheet);
13
+ }
14
+ shadow.adoptedStyleSheets = [sheet];
15
+ return;
16
+ }
17
+ const style = document.createElement("style");
18
+ style.textContent = css;
19
+ shadow.appendChild(style);
20
+ }
21
+
4
22
  // components/bv-view-switcher/bv-view-switcher.ts
5
23
  var LIST_ICON = `<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
6
24
  <path d="M2 4h12M2 8h12M2 12h12" stroke="currentColor" stroke-width="1.5" stroke-linecap="round"/>
@@ -18,12 +36,7 @@ var BvViewSwitcher = class extends HTMLElement {
18
36
  _gridBtn = null;
19
37
  constructor() {
20
38
  super();
21
- this.attachShadow({ mode: "open" });
22
- if ("replaceSync" in CSSStyleSheet.prototype) {
23
- const sheet = new CSSStyleSheet();
24
- sheet.replaceSync(bv_view_switcher_default);
25
- this.shadowRoot.adoptedStyleSheets = [sheet];
26
- }
39
+ adoptStyles(this.attachShadow({ mode: "open" }), bv_view_switcher_default);
27
40
  }
28
41
  connectedCallback() {
29
42
  this._render();
@@ -41,11 +54,6 @@ var BvViewSwitcher = class extends HTMLElement {
41
54
  if (this._rendered) return;
42
55
  this._rendered = true;
43
56
  const shadow = this.shadowRoot;
44
- if (!shadow.adoptedStyleSheets.length) {
45
- const s = document.createElement("style");
46
- s.textContent = bv_view_switcher_default;
47
- shadow.appendChild(s);
48
- }
49
57
  const wrap = document.createElement("div");
50
58
  wrap.className = "switcher";
51
59
  const listBtn = document.createElement("button");
@@ -1,6 +1,6 @@
1
1
  /**
2
2
  * Do not edit directly
3
- * Generated on Wed, 22 Jul 2026 02:07:11 GMT
3
+ * Generated on Wed, 29 Jul 2026 02:00:42 GMT
4
4
  */
5
5
 
6
6
  :root {
package/package.json CHANGED
@@ -1,13 +1,16 @@
1
1
  {
2
2
  "name": "@bluevolt-tech/lumen",
3
- "version": "2.0.1",
3
+ "version": "2.1.0",
4
4
  "type": "module",
5
5
  "publishConfig": {
6
6
  "registry": "https://registry.npmjs.org",
7
7
  "access": "public"
8
8
  },
9
9
  "scripts": {
10
+ "generate:versions": "node scripts/generate-versions.js",
11
+ "prestorybook": "npm run generate:versions",
10
12
  "storybook": "storybook dev -p 6006 --config-dir storybook/.storybook",
13
+ "prebuild-storybook": "npm run generate:versions",
11
14
  "build-storybook": "node scripts/generate-changelog.js && storybook build --config-dir storybook/.storybook",
12
15
  "changelog": "node scripts/generate-changelog.js",
13
16
  "build:tokens": "node tokens/style-dictionary.config.cjs",
@@ -26,6 +29,9 @@
26
29
  "format:check": "prettier --check components builder",
27
30
  "validate:screens": "node scripts/validate-screens.js",
28
31
  "validate:versions": "node scripts/validate-versions.js",
32
+ "validate:stories": "node scripts/validate-stories.js",
33
+ "validate:pr-metadata": "node scripts/validate-pr-metadata.js",
34
+ "qa-diff": "node scripts/qa-diff.mjs",
29
35
  "prepare": "husky"
30
36
  },
31
37
  "files": [
@@ -211,6 +217,7 @@
211
217
  "happy-dom": "^12.0.0",
212
218
  "husky": "^9.1.7",
213
219
  "lit": "^3.0.0",
220
+ "playwright-core": "^1.61.1",
214
221
  "prettier": "^3.8.3",
215
222
  "storybook": "^8.0.0",
216
223
  "style-dictionary": "^3.9.0",
package/themes/base.css CHANGED
@@ -1,6 +1,6 @@
1
1
  /**
2
2
  * Do not edit directly
3
- * Generated on Wed, 22 Jul 2026 02:07:11 GMT
3
+ * Generated on Wed, 29 Jul 2026 02:00:42 GMT
4
4
  */
5
5
 
6
6
  :root {