@bluevolt-tech/lumen 1.3.2

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 (78) hide show
  1. package/README.md +286 -0
  2. package/assets/fonts/fonts.css +25 -0
  3. package/assets/icons/.gitkeep +0 -0
  4. package/assets/icons/edit.svg +3 -0
  5. package/assets/images/.gitkeep +0 -0
  6. package/assets/images/bluevolt-logo.png +0 -0
  7. package/dist/assets/fonts/fonts.css +25 -0
  8. package/dist/assets/icons/.gitkeep +0 -0
  9. package/dist/assets/icons/edit.svg +3 -0
  10. package/dist/assets/images/.gitkeep +0 -0
  11. package/dist/assets/images/bluevolt-logo.png +0 -0
  12. package/dist/components/bv-avatar/bv-avatar.d.ts +13 -0
  13. package/dist/components/bv-avatar/bv-avatar.js +81 -0
  14. package/dist/components/bv-badge/bv-badge.d.ts +11 -0
  15. package/dist/components/bv-badge/bv-badge.js +58 -0
  16. package/dist/components/bv-button/bv-button.d.ts +23 -0
  17. package/dist/components/bv-button/bv-button.js +395 -0
  18. package/dist/components/bv-category-pill/bv-category-pill.d.ts +11 -0
  19. package/dist/components/bv-category-pill/bv-category-pill.js +61 -0
  20. package/dist/components/bv-checkbox/bv-checkbox.d.ts +14 -0
  21. package/dist/components/bv-checkbox/bv-checkbox.js +89 -0
  22. package/dist/components/bv-chip/bv-chip.d.ts +11 -0
  23. package/dist/components/bv-chip/bv-chip.js +72 -0
  24. package/dist/components/bv-course-detail/bv-course-detail.d.ts +28 -0
  25. package/dist/components/bv-course-detail/bv-course-detail.js +269 -0
  26. package/dist/components/bv-course-detail-modal/bv-course-detail-modal.d.ts +35 -0
  27. package/dist/components/bv-course-detail-modal/bv-course-detail-modal.js +1455 -0
  28. package/dist/components/bv-course-grid-card/bv-course-grid-card.d.ts +12 -0
  29. package/dist/components/bv-course-grid-card/bv-course-grid-card.js +578 -0
  30. package/dist/components/bv-course-list-card/bv-course-list-card.d.ts +12 -0
  31. package/dist/components/bv-course-list-card/bv-course-list-card.js +585 -0
  32. package/dist/components/bv-course-outline/bv-course-outline.d.ts +49 -0
  33. package/dist/components/bv-course-outline/bv-course-outline.js +488 -0
  34. package/dist/components/bv-empty-state/bv-empty-state.d.ts +10 -0
  35. package/dist/components/bv-empty-state/bv-empty-state.js +69 -0
  36. package/dist/components/bv-filter-dropdown/bv-filter-dropdown.d.ts +26 -0
  37. package/dist/components/bv-filter-dropdown/bv-filter-dropdown.js +164 -0
  38. package/dist/components/bv-filter-panel/bv-filter-panel.d.ts +25 -0
  39. package/dist/components/bv-filter-panel/bv-filter-panel.js +222 -0
  40. package/dist/components/bv-icon/bv-icon.d.ts +10 -0
  41. package/dist/components/bv-icon/bv-icon.js +122 -0
  42. package/dist/components/bv-icon/icons.d.ts +3 -0
  43. package/dist/components/bv-modal/bv-modal.d.ts +13 -0
  44. package/dist/components/bv-modal/bv-modal.js +104 -0
  45. package/dist/components/bv-page-title/bv-page-title.d.ts +4 -0
  46. package/dist/components/bv-page-title/bv-page-title.js +33 -0
  47. package/dist/components/bv-pagination/bv-pagination.d.ts +20 -0
  48. package/dist/components/bv-pagination/bv-pagination.js +139 -0
  49. package/dist/components/bv-portal-header/bv-portal-header.d.ts +12 -0
  50. package/dist/components/bv-portal-header/bv-portal-header.js +854 -0
  51. package/dist/components/bv-portal-layout/bv-portal-layout.d.ts +6 -0
  52. package/dist/components/bv-portal-layout/bv-portal-layout.js +39 -0
  53. package/dist/components/bv-progress-bar/bv-progress-bar.d.ts +11 -0
  54. package/dist/components/bv-progress-bar/bv-progress-bar.js +61 -0
  55. package/dist/components/bv-promo-banner/bv-promo-banner.d.ts +12 -0
  56. package/dist/components/bv-promo-banner/bv-promo-banner.js +79 -0
  57. package/dist/components/bv-radio/bv-radio.d.ts +11 -0
  58. package/dist/components/bv-radio/bv-radio.js +78 -0
  59. package/dist/components/bv-searchbox/bv-searchbox.d.ts +10 -0
  60. package/dist/components/bv-searchbox/bv-searchbox.js +68 -0
  61. package/dist/components/bv-star-rating/bv-star-rating.d.ts +11 -0
  62. package/dist/components/bv-star-rating/bv-star-rating.js +67 -0
  63. package/dist/components/bv-table/bv-table.d.ts +5 -0
  64. package/dist/components/bv-table/bv-table.js +72 -0
  65. package/dist/components/bv-toggle/bv-toggle.d.ts +11 -0
  66. package/dist/components/bv-toggle/bv-toggle.js +72 -0
  67. package/dist/components/bv-user-row/bv-user-row.d.ts +12 -0
  68. package/dist/components/bv-user-row/bv-user-row.js +574 -0
  69. package/dist/components/bv-view-switcher/bv-view-switcher.d.ts +11 -0
  70. package/dist/components/bv-view-switcher/bv-view-switcher.js +91 -0
  71. package/dist/preview/index.html +76 -0
  72. package/dist/storybook/stories/screens/course-catalog.data.d.ts +28 -0
  73. package/dist/storybook/stories/screens/course-catalog.data.js +301 -0
  74. package/dist/themes/base.css +66 -0
  75. package/dist/themes/layouts.css +35 -0
  76. package/package.json +181 -0
  77. package/themes/base.css +66 -0
  78. package/themes/layouts.css +35 -0
@@ -0,0 +1,72 @@
1
+ // css-inline:/home/runner/work/BV_lumen/BV_lumen/components/bv-chip/bv-chip.css
2
+ var bv_chip_default = ":host {\n display: inline-flex;\n}\n\n.chip {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n height: 28px;\n padding: 0 10px 0 12px;\n border-radius: var(--bv-radius-md, 6px);\n background: var(--bv-color-primary-50, #eff8ff);\n border: 1px solid #b9e6fe;\n color: var(--bv-color-primary-dark, #026aa2);\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 line-height: 1;\n white-space: nowrap;\n user-select: none;\n}\n\n.label {\n flex: none;\n}\n\n.dismiss {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 14px;\n height: 14px;\n padding: 0;\n background: none;\n border: none;\n cursor: pointer;\n color: inherit;\n flex-shrink: 0;\n opacity: 0.6;\n border-radius: 2px;\n transition: opacity var(--bv-transition-fast, 150ms);\n}\n\n.dismiss:hover {\n opacity: 1;\n}\n\n.dismiss:focus-visible {\n outline: 2px solid var(--bv-color-primary);\n outline-offset: 1px;\n}\n";
3
+
4
+ // components/bv-chip/bv-chip.ts
5
+ var BvChip = class extends HTMLElement {
6
+ static observedAttributes = ["label"];
7
+ get label() {
8
+ return this.getAttribute("label") ?? "";
9
+ }
10
+ set label(v) {
11
+ this.setAttribute("label", v);
12
+ }
13
+ _rendered = false;
14
+ _labelEl = null;
15
+ constructor() {
16
+ super();
17
+ this.attachShadow({ mode: "open" });
18
+ if ("replaceSync" in CSSStyleSheet.prototype) {
19
+ const sheet = new CSSStyleSheet();
20
+ sheet.replaceSync(bv_chip_default);
21
+ this.shadowRoot.adoptedStyleSheets = [sheet];
22
+ }
23
+ }
24
+ connectedCallback() {
25
+ this._render();
26
+ }
27
+ attributeChangedCallback(name, _old, val) {
28
+ if (!this._rendered) return;
29
+ if (name === "label" && this._labelEl) {
30
+ this._labelEl.textContent = val ?? "";
31
+ }
32
+ }
33
+ _render() {
34
+ if (this._rendered) return;
35
+ this._rendered = true;
36
+ const shadow = this.shadowRoot;
37
+ if (!shadow.adoptedStyleSheets.length) {
38
+ const s = document.createElement("style");
39
+ s.textContent = bv_chip_default;
40
+ shadow.appendChild(s);
41
+ }
42
+ const chip = document.createElement("span");
43
+ chip.className = "chip";
44
+ const labelEl = document.createElement("span");
45
+ labelEl.className = "label";
46
+ labelEl.textContent = this.label;
47
+ this._labelEl = labelEl;
48
+ const dismiss = document.createElement("button");
49
+ dismiss.className = "dismiss";
50
+ dismiss.type = "button";
51
+ dismiss.setAttribute("aria-label", "Remove");
52
+ dismiss.innerHTML = `<svg width="10" height="10" viewBox="0 0 10 10" fill="none" aria-hidden="true"><path d="M1 1l8 8M9 1L1 9" stroke="currentColor" stroke-width="1.5" stroke-linecap="round"/></svg>`;
53
+ dismiss.addEventListener("click", (e) => {
54
+ e.stopPropagation();
55
+ this.dispatchEvent(
56
+ new CustomEvent("bv-dismiss", {
57
+ bubbles: true,
58
+ composed: true,
59
+ detail: { label: this.label }
60
+ })
61
+ );
62
+ });
63
+ chip.append(labelEl, dismiss);
64
+ shadow.appendChild(chip);
65
+ }
66
+ };
67
+ if (!customElements.get("bv-chip")) {
68
+ customElements.define("bv-chip", BvChip);
69
+ }
70
+ export {
71
+ BvChip
72
+ };
@@ -0,0 +1,28 @@
1
+ import '../bv-category-pill/bv-category-pill.ts';
2
+ export declare class BvCourseDetail extends HTMLElement {
3
+ static readonly observedAttributes: readonly ["thumbnail", "title", "description", "categories"];
4
+ private _rendered;
5
+ private _categories;
6
+ private _thumbImg;
7
+ private _thumbPlaceholder;
8
+ private _pillsRow;
9
+ private _titleEl;
10
+ private _descEl;
11
+ private _descWrap;
12
+ private _readMoreBtn;
13
+ constructor();
14
+ get thumbnail(): string;
15
+ set thumbnail(v: string);
16
+ get title(): string;
17
+ set title(v: string);
18
+ get description(): string;
19
+ set description(v: string);
20
+ get categories(): string[];
21
+ set categories(v: string[]);
22
+ connectedCallback(): void;
23
+ attributeChangedCallback(name: string, _old: string | null, val: string | null): void;
24
+ private _render;
25
+ private _syncThumbnail;
26
+ private _syncDesc;
27
+ private _syncPills;
28
+ }
@@ -0,0 +1,269 @@
1
+ // css-inline:/home/runner/work/BV_lumen/BV_lumen/components/bv-course-detail/bv-course-detail.css
2
+ var bv_course_detail_default = ":host {\n display: block;\n font-family: var(--bv-font-family-base);\n}\n\n[hidden] {\n display: none !important;\n}\n\n/* \u2500\u2500 Root layout \u2500\u2500 */\n\n.course-detail {\n display: flex;\n gap: 20px;\n align-items: flex-start;\n}\n\n/* \u2500\u2500 Thumbnail column \u2500\u2500 */\n\n.thumb-col {\n flex-shrink: 0;\n width: 160px;\n}\n\n.thumb-wrap {\n width: 160px;\n height: 113px;\n background: var(--bv-color-neutral-200);\n border-radius: var(--bv-radius-lg);\n overflow: hidden;\n display: flex;\n align-items: center;\n justify-content: center;\n}\n\n.thumb-img {\n width: 100%;\n height: 100%;\n object-fit: cover;\n display: block;\n}\n\n.thumb-placeholder {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 36px;\n height: 36px;\n}\n\n.thumb-placeholder svg {\n width: 100%;\n height: 100%;\n}\n\n/* \u2500\u2500 Right column \u2500\u2500 */\n\n.right-col {\n flex: 1;\n min-width: 0;\n display: flex;\n flex-direction: column;\n gap: 8px;\n}\n\n/* \u2500\u2500 Top row: pills + title + separator \u2500\u2500 */\n\n.top-row {\n display: flex;\n flex-direction: column;\n gap: 8px;\n}\n\n.card-header {\n display: flex;\n flex-direction: column;\n gap: 4px;\n}\n\n.pills-row {\n display: flex;\n flex-wrap: wrap;\n gap: 4px;\n}\n\n.course-title {\n font-size: var(--bv-font-size-xl);\n font-weight: var(--bv-font-weight-medium);\n color: var(--bv-color-neutral-900);\n line-height: 32px;\n}\n\n.separator {\n height: 0;\n border-top: 0.5px solid var(--bv-color-neutral-300);\n}\n\n/* \u2500\u2500 Description \u2500\u2500 */\n\n.desc-section {\n display: flex;\n flex-direction: column;\n gap: 8px;\n}\n\n.desc-text {\n margin: 0;\n font-size: var(--bv-font-size-xs);\n font-weight: var(--bv-font-weight-regular);\n color: var(--bv-color-neutral-700);\n line-height: 20px;\n display: -webkit-box;\n -webkit-line-clamp: 6;\n -webkit-box-orient: vertical;\n overflow: hidden;\n}\n\n/* Read More expands the clamp */\n.desc-wrap--expanded .desc-text {\n -webkit-line-clamp: unset;\n}\n\n.read-more-btn {\n background: none;\n border: none;\n padding: 0;\n cursor: pointer;\n font-family: var(--bv-font-family-base);\n font-size: var(--bv-font-size-xs);\n font-weight: var(--bv-font-weight-semibold);\n color: var(--bv-color-primary);\n line-height: 24px;\n white-space: nowrap;\n text-align: left;\n}\n\n.read-more-btn:hover {\n text-decoration: underline;\n}\n";
3
+
4
+ // css-inline:/home/runner/work/BV_lumen/BV_lumen/components/bv-category-pill/bv-category-pill.css
5
+ var bv_category_pill_default = ":host {\n display: inline-flex;\n font-family: var(--bv-font-family-base);\n}\n\n.pill {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n padding: 4px 6px;\n border: 0.5px solid var(--bv-color-neutral-900);\n border-radius: var(--bv-radius-sm);\n font-size: 10px;\n font-weight: var(--bv-font-weight-regular);\n color: var(--bv-color-neutral-700);\n line-height: 1;\n white-space: nowrap;\n}\n";
6
+
7
+ // components/bv-category-pill/bv-category-pill.ts
8
+ var _sheet = null;
9
+ function getSheet() {
10
+ if (!_sheet) {
11
+ _sheet = new CSSStyleSheet();
12
+ _sheet.replaceSync(bv_category_pill_default);
13
+ }
14
+ return _sheet;
15
+ }
16
+ var BvCategoryPill = class extends HTMLElement {
17
+ static observedAttributes = ["label"];
18
+ _rendered = false;
19
+ _labelEl = null;
20
+ constructor() {
21
+ super();
22
+ const shadow = this.attachShadow({ mode: "open" });
23
+ if ("adoptedStyleSheets" in ShadowRoot.prototype) {
24
+ shadow.adoptedStyleSheets = [getSheet()];
25
+ }
26
+ }
27
+ get label() {
28
+ return this.getAttribute("label") ?? "";
29
+ }
30
+ set label(v) {
31
+ this.setAttribute("label", v);
32
+ }
33
+ connectedCallback() {
34
+ this._render();
35
+ }
36
+ attributeChangedCallback(name, _old, val) {
37
+ if (!this._rendered) return;
38
+ if (name === "label" && this._labelEl) this._labelEl.textContent = val ?? "";
39
+ }
40
+ _render() {
41
+ if (this._rendered) return;
42
+ this._rendered = true;
43
+ const shadow = this.shadowRoot;
44
+ if (!shadow.adoptedStyleSheets.length) {
45
+ const s = document.createElement("style");
46
+ s.textContent = bv_category_pill_default;
47
+ shadow.appendChild(s);
48
+ }
49
+ const pill = document.createElement("span");
50
+ pill.className = "pill";
51
+ pill.setAttribute("part", "pill");
52
+ const labelEl = document.createElement("span");
53
+ labelEl.textContent = this.label;
54
+ this._labelEl = labelEl;
55
+ pill.appendChild(labelEl);
56
+ shadow.appendChild(pill);
57
+ }
58
+ };
59
+ if (!customElements.get("bv-category-pill")) {
60
+ customElements.define("bv-category-pill", BvCategoryPill);
61
+ }
62
+
63
+ // components/bv-course-detail/bv-course-detail.ts
64
+ var _sheet2 = null;
65
+ function getSheet2() {
66
+ if (!_sheet2) {
67
+ _sheet2 = new CSSStyleSheet();
68
+ _sheet2.replaceSync(bv_course_detail_default);
69
+ }
70
+ return _sheet2;
71
+ }
72
+ var BvCourseDetail = class extends HTMLElement {
73
+ static observedAttributes = ["thumbnail", "title", "description", "categories"];
74
+ _rendered = false;
75
+ _categories = [];
76
+ _thumbImg = null;
77
+ _thumbPlaceholder = null;
78
+ _pillsRow = null;
79
+ _titleEl = null;
80
+ _descEl = null;
81
+ _descWrap = null;
82
+ _readMoreBtn = null;
83
+ constructor() {
84
+ super();
85
+ const shadow = this.attachShadow({ mode: "open" });
86
+ if ("adoptedStyleSheets" in ShadowRoot.prototype) {
87
+ shadow.adoptedStyleSheets = [getSheet2()];
88
+ }
89
+ }
90
+ get thumbnail() {
91
+ return this.getAttribute("thumbnail") ?? "";
92
+ }
93
+ set thumbnail(v) {
94
+ this.setAttribute("thumbnail", v);
95
+ }
96
+ get title() {
97
+ return this.getAttribute("title") ?? "";
98
+ }
99
+ set title(v) {
100
+ this.setAttribute("title", v);
101
+ }
102
+ get description() {
103
+ return this.getAttribute("description") ?? "";
104
+ }
105
+ set description(v) {
106
+ this.setAttribute("description", v);
107
+ }
108
+ get categories() {
109
+ return this._categories;
110
+ }
111
+ set categories(v) {
112
+ this._categories = v;
113
+ this.setAttribute("categories", JSON.stringify(v));
114
+ if (this._rendered) this._syncPills();
115
+ }
116
+ connectedCallback() {
117
+ this._render();
118
+ }
119
+ attributeChangedCallback(name, _old, val) {
120
+ if (!this._rendered) return;
121
+ switch (name) {
122
+ case "thumbnail":
123
+ this._syncThumbnail(val);
124
+ break;
125
+ case "title":
126
+ if (this._titleEl) this._titleEl.textContent = val ?? "";
127
+ break;
128
+ case "description":
129
+ this._syncDesc(val);
130
+ break;
131
+ case "categories":
132
+ try {
133
+ this._categories = JSON.parse(val ?? "[]");
134
+ } catch {
135
+ this._categories = [];
136
+ }
137
+ this._syncPills();
138
+ break;
139
+ }
140
+ }
141
+ _render() {
142
+ if (this._rendered) return;
143
+ this._rendered = true;
144
+ const attrCats = this.getAttribute("categories");
145
+ if (attrCats) {
146
+ try {
147
+ this._categories = JSON.parse(attrCats);
148
+ } catch {
149
+ this._categories = [];
150
+ }
151
+ }
152
+ const shadow = this.shadowRoot;
153
+ if (!shadow.adoptedStyleSheets.length) {
154
+ const s = document.createElement("style");
155
+ s.textContent = bv_course_detail_default;
156
+ shadow.appendChild(s);
157
+ }
158
+ const root = document.createElement("div");
159
+ root.className = "course-detail";
160
+ const thumbCol = document.createElement("div");
161
+ thumbCol.className = "thumb-col";
162
+ const thumbWrap = document.createElement("div");
163
+ thumbWrap.className = "thumb-wrap";
164
+ const thumbImg = document.createElement("img");
165
+ thumbImg.className = "thumb-img";
166
+ thumbImg.alt = "";
167
+ if (this.thumbnail) thumbImg.src = this.thumbnail;
168
+ thumbImg.hidden = !this.thumbnail;
169
+ this._thumbImg = thumbImg;
170
+ const thumbPlaceholder = document.createElement("div");
171
+ thumbPlaceholder.className = "thumb-placeholder";
172
+ thumbPlaceholder.setAttribute("aria-hidden", "true");
173
+ thumbPlaceholder.innerHTML = `<svg viewBox="0 0 54 54" fill="none" stroke="var(--bv-color-neutral-400)" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><rect x="1" y="1" width="52" height="52" rx="6"/><circle cx="17" cy="18" r="5"/><path d="M1 38 L18 22 L28 32 L37 23 L53 38"/></svg>`;
174
+ thumbPlaceholder.hidden = !!this.thumbnail;
175
+ this._thumbPlaceholder = thumbPlaceholder;
176
+ thumbWrap.append(thumbImg, thumbPlaceholder);
177
+ thumbCol.appendChild(thumbWrap);
178
+ const rightCol = document.createElement("div");
179
+ rightCol.className = "right-col";
180
+ const topRow = document.createElement("div");
181
+ topRow.className = "top-row";
182
+ const header = document.createElement("div");
183
+ header.className = "card-header";
184
+ const pillsRow = document.createElement("div");
185
+ pillsRow.className = "pills-row";
186
+ this._pillsRow = pillsRow;
187
+ this._syncPills();
188
+ const titleEl = document.createElement("span");
189
+ titleEl.className = "course-title";
190
+ titleEl.textContent = this.title;
191
+ this._titleEl = titleEl;
192
+ header.append(pillsRow, titleEl);
193
+ const sep = document.createElement("div");
194
+ sep.className = "separator";
195
+ sep.setAttribute("role", "separator");
196
+ topRow.append(header, sep);
197
+ const descSection = document.createElement("div");
198
+ descSection.className = "desc-section";
199
+ const descWrap = document.createElement("div");
200
+ descWrap.className = "desc-wrap";
201
+ this._descWrap = descWrap;
202
+ const descEl = document.createElement("p");
203
+ descEl.className = "desc-text";
204
+ descEl.textContent = this.description;
205
+ this._descEl = descEl;
206
+ const readMoreBtn = document.createElement("button");
207
+ readMoreBtn.className = "read-more-btn";
208
+ readMoreBtn.textContent = "Read More";
209
+ readMoreBtn.hidden = true;
210
+ this._readMoreBtn = readMoreBtn;
211
+ readMoreBtn.addEventListener("click", () => {
212
+ const expanded = descWrap.classList.toggle("desc-wrap--expanded");
213
+ readMoreBtn.textContent = expanded ? "Read Less" : "Read More";
214
+ this.dispatchEvent(
215
+ new CustomEvent("bv-read-more", {
216
+ bubbles: true,
217
+ composed: true,
218
+ detail: { expanded }
219
+ })
220
+ );
221
+ });
222
+ requestAnimationFrame(() => {
223
+ readMoreBtn.hidden = descEl.scrollHeight <= descEl.clientHeight;
224
+ });
225
+ descWrap.appendChild(descEl);
226
+ descSection.append(descWrap, readMoreBtn);
227
+ rightCol.append(topRow, descSection);
228
+ root.append(thumbCol, rightCol);
229
+ shadow.appendChild(root);
230
+ }
231
+ _syncThumbnail(src) {
232
+ if (!this._thumbImg || !this._thumbPlaceholder) return;
233
+ if (src) {
234
+ this._thumbImg.src = src;
235
+ this._thumbImg.hidden = false;
236
+ this._thumbPlaceholder.hidden = true;
237
+ } else {
238
+ this._thumbImg.hidden = true;
239
+ this._thumbPlaceholder.hidden = false;
240
+ }
241
+ }
242
+ _syncDesc(val) {
243
+ if (!this._descEl || !this._readMoreBtn || !this._descWrap) return;
244
+ this._descEl.textContent = val ?? "";
245
+ this._descWrap.classList.remove("desc-wrap--expanded");
246
+ this._readMoreBtn.textContent = "Read More";
247
+ requestAnimationFrame(() => {
248
+ if (this._descEl && this._readMoreBtn) {
249
+ this._readMoreBtn.hidden = this._descEl.scrollHeight <= this._descEl.clientHeight;
250
+ }
251
+ });
252
+ }
253
+ _syncPills() {
254
+ if (!this._pillsRow) return;
255
+ this._pillsRow.innerHTML = "";
256
+ this._categories.forEach((cat) => {
257
+ const pill = document.createElement("bv-category-pill");
258
+ pill.setAttribute("label", cat);
259
+ this._pillsRow.appendChild(pill);
260
+ });
261
+ this._pillsRow.hidden = this._categories.length === 0;
262
+ }
263
+ };
264
+ if (!customElements.get("bv-course-detail")) {
265
+ customElements.define("bv-course-detail", BvCourseDetail);
266
+ }
267
+ export {
268
+ BvCourseDetail
269
+ };
@@ -0,0 +1,35 @@
1
+ import '../bv-modal/bv-modal.ts';
2
+ import '../bv-course-detail/bv-course-detail.ts';
3
+ import '../bv-course-outline/bv-course-outline.ts';
4
+ import '../bv-button/bv-button.ts';
5
+ import type { OutlineSection, OutlineMode } from '../bv-course-outline/bv-course-outline.ts';
6
+ export declare class BvCourseDetailModal extends HTMLElement {
7
+ static readonly observedAttributes: readonly ["open", "title", "course-title", "thumbnail", "description", "categories", "sections", "outline-mode"];
8
+ private _rendered;
9
+ private _categories;
10
+ private _sections;
11
+ private _modalEl;
12
+ private _detailEl;
13
+ private _showOutlineBtn;
14
+ private _outlineEl;
15
+ constructor();
16
+ get open(): boolean;
17
+ set open(v: boolean);
18
+ get title(): string;
19
+ set title(v: string);
20
+ get courseTitle(): string;
21
+ set courseTitle(v: string);
22
+ get thumbnail(): string;
23
+ set thumbnail(v: string);
24
+ get description(): string;
25
+ set description(v: string);
26
+ get categories(): string[];
27
+ set categories(v: string[]);
28
+ get sections(): OutlineSection[];
29
+ set sections(v: OutlineSection[]);
30
+ get outlineMode(): OutlineMode;
31
+ set outlineMode(v: OutlineMode);
32
+ connectedCallback(): void;
33
+ attributeChangedCallback(name: string, _old: string | null, val: string | null): void;
34
+ private _render;
35
+ }