@brightspot/ui 1.0.1-wc.4 → 1.2.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 (131) hide show
  1. package/README.md +7 -90
  2. package/dist/LucideDynamicLoader.d.ts +1 -0
  3. package/dist/LucideDynamicLoader.d.ts.map +1 -1
  4. package/dist/LucideDynamicLoader.js +2 -0
  5. package/dist/LucideDynamicLoader.js.map +1 -1
  6. package/dist/LucideDynamicLoader.ts +3 -0
  7. package/dist/components/avatar/Avatar.d.ts +82 -0
  8. package/dist/components/avatar/Avatar.d.ts.map +1 -0
  9. package/dist/components/avatar/Avatar.js +162 -0
  10. package/dist/components/avatar/Avatar.js.map +1 -0
  11. package/dist/components/avatar/AvatarGroup.d.ts +70 -0
  12. package/dist/components/avatar/AvatarGroup.d.ts.map +1 -0
  13. package/dist/components/avatar/AvatarGroup.js +145 -0
  14. package/dist/components/avatar/AvatarGroup.js.map +1 -0
  15. package/dist/components/badge/Badge.d.ts +75 -0
  16. package/dist/components/badge/Badge.d.ts.map +1 -0
  17. package/dist/components/badge/Badge.js +118 -0
  18. package/dist/components/badge/Badge.js.map +1 -0
  19. package/dist/components/circular-progress/CircularProgress.d.ts +57 -0
  20. package/dist/components/circular-progress/CircularProgress.d.ts.map +1 -0
  21. package/dist/components/circular-progress/CircularProgress.js +173 -0
  22. package/dist/components/circular-progress/CircularProgress.js.map +1 -0
  23. package/dist/components/icon/Icon.d.ts +90 -0
  24. package/dist/components/icon/Icon.d.ts.map +1 -0
  25. package/dist/components/icon/Icon.js +172 -0
  26. package/dist/components/icon/Icon.js.map +1 -0
  27. package/dist/components/linear-progress/LinearProgress.d.ts +40 -0
  28. package/dist/components/linear-progress/LinearProgress.d.ts.map +1 -0
  29. package/dist/components/linear-progress/LinearProgress.js +95 -0
  30. package/dist/components/linear-progress/LinearProgress.js.map +1 -0
  31. package/dist/custom-elements.json +772 -0
  32. package/dist/global.d.ts +4 -0
  33. package/dist/storybook/assets/Avatar.stories-BlxrclP0.js +209 -0
  34. package/dist/storybook/assets/AvatarGroup.stories-E3VUvBae.js +211 -0
  35. package/dist/storybook/assets/Badge.stories-f4YvPz0W.js +121 -0
  36. package/dist/storybook/assets/Button.stories-N66xrq4q.js +63 -0
  37. package/dist/storybook/assets/CircularProgress.stories-zWyELtfc.js +451 -0
  38. package/dist/storybook/assets/{Color-64QXVMR3-BV_8WWIP.js → Color-64QXVMR3-B3Y5c9dl.js} +1 -1
  39. package/dist/storybook/assets/{Colors.stories-CcpJ2Txp.js → Colors.stories-nEoNeHhf.js} +1 -1
  40. package/dist/storybook/assets/Events.stories-BP3ensxX.js +108 -0
  41. package/dist/storybook/assets/Heading.stories-DGqWaBpi.js +3 -0
  42. package/dist/storybook/assets/Icon.stories-BWWjh4NZ.js +245 -0
  43. package/dist/storybook/assets/LinearProgress.stories-DMVolkoE.js +397 -0
  44. package/dist/storybook/assets/ReadyMixin.stories-DavcxbQ0.js +55 -0
  45. package/dist/storybook/assets/ScrollShadow.stories-BmwSRNje.js +17 -0
  46. package/dist/storybook/assets/Throttle.stories-DBj-9rhV.js +303 -0
  47. package/dist/storybook/assets/{WithTooltip-SK46ZJ2J-DyavE1Bj.js → WithTooltip-SK46ZJ2J-DW4NXFWt.js} +5 -5
  48. package/dist/storybook/assets/formatter-OMEEQ6HG-BBn014aZ.js +1 -0
  49. package/dist/storybook/assets/iframe-CxsKJSj-.css +1 -0
  50. package/dist/storybook/assets/{iframe-mIh0R_Av.js → iframe-Z4F0Cgki.js} +87 -100
  51. package/dist/storybook/assets/{index-C8IjQgz6.js → index-BUj5S-B7.js} +1 -1
  52. package/dist/storybook/assets/{syntaxhighlighter-CAVLW7PM-36bUIV4n.js → syntaxhighlighter-CAVLW7PM-CsQveU1N.js} +1 -1
  53. package/dist/storybook/iframe.html +2 -2
  54. package/dist/storybook/index.json +1 -1
  55. package/dist/storybook/project.json +1 -1
  56. package/dist/tailwind-plugin-avatar.d.ts +2 -0
  57. package/dist/tailwind-plugin-avatar.d.ts.map +1 -0
  58. package/dist/tailwind-plugin-avatar.js +130 -0
  59. package/dist/tailwind-plugin-avatar.js.map +1 -0
  60. package/dist/tailwind-plugin-avatar.ts +181 -0
  61. package/dist/tailwind-plugin-badge.js +24 -9
  62. package/dist/tailwind-plugin-badge.js.map +1 -1
  63. package/dist/tailwind-plugin-badge.ts +30 -11
  64. package/dist/tailwind-plugin-button.js +14 -15
  65. package/dist/tailwind-plugin-button.js.map +1 -1
  66. package/dist/tailwind-plugin-button.ts +14 -17
  67. package/dist/tailwind-plugin-contrast.d.ts +2 -0
  68. package/dist/tailwind-plugin-contrast.d.ts.map +1 -0
  69. package/dist/tailwind-plugin-contrast.js +17 -0
  70. package/dist/tailwind-plugin-contrast.js.map +1 -0
  71. package/dist/tailwind-plugin-contrast.ts +18 -0
  72. package/dist/tailwind-plugin-icon.js +17 -10
  73. package/dist/tailwind-plugin-icon.js.map +1 -1
  74. package/dist/tailwind-plugin-icon.ts +17 -10
  75. package/dist/tailwind-plugin-ring-contrast.d.ts +2 -0
  76. package/dist/tailwind-plugin-ring-contrast.d.ts.map +1 -0
  77. package/dist/tailwind-plugin-ring-contrast.js +76 -0
  78. package/dist/tailwind-plugin-ring-contrast.js.map +1 -0
  79. package/dist/tailwind-plugin-ring-contrast.ts +90 -0
  80. package/dist/tailwind.config.d.ts +21 -0
  81. package/dist/tailwind.config.d.ts.map +1 -1
  82. package/dist/tailwind.config.js +27 -2
  83. package/dist/tailwind.config.js.map +1 -1
  84. package/dist/tailwind.config.ts +27 -2
  85. package/dist/{utils → util}/EventEmitterMixin.d.ts +23 -17
  86. package/dist/util/EventEmitterMixin.d.ts.map +1 -0
  87. package/dist/{utils → util}/EventEmitterMixin.js +7 -7
  88. package/dist/util/EventEmitterMixin.js.map +1 -0
  89. package/dist/util/ProgressMixin.d.ts +52 -0
  90. package/dist/util/ProgressMixin.d.ts.map +1 -0
  91. package/dist/util/ProgressMixin.js +190 -0
  92. package/dist/util/ProgressMixin.js.map +1 -0
  93. package/dist/util/ReadyMixin.d.ts +31 -0
  94. package/dist/util/ReadyMixin.d.ts.map +1 -0
  95. package/dist/util/ReadyMixin.js +42 -0
  96. package/dist/util/ReadyMixin.js.map +1 -0
  97. package/dist/util/aria.d.ts +3 -0
  98. package/dist/util/aria.d.ts.map +1 -0
  99. package/dist/util/aria.js +44 -0
  100. package/dist/util/aria.js.map +1 -0
  101. package/dist/util/svg.d.ts +9 -0
  102. package/dist/util/svg.d.ts.map +1 -1
  103. package/dist/util/svg.js +22 -0
  104. package/dist/util/svg.js.map +1 -1
  105. package/dist/util/throttle.d.ts +4 -0
  106. package/dist/util/throttle.d.ts.map +1 -0
  107. package/dist/util/throttle.js +30 -0
  108. package/dist/util/throttle.js.map +1 -0
  109. package/package.json +7 -6
  110. package/custom-elements.json +0 -214
  111. package/dist/components/widget/Widget.css +0 -118
  112. package/dist/components/widget/Widget.d.ts +0 -90
  113. package/dist/components/widget/Widget.d.ts.map +0 -1
  114. package/dist/components/widget/Widget.js +0 -196
  115. package/dist/components/widget/Widget.js.map +0 -1
  116. package/dist/components/widget/WidgetUtils.d.ts +0 -14
  117. package/dist/components/widget/WidgetUtils.d.ts.map +0 -1
  118. package/dist/components/widget/WidgetUtils.js +0 -42
  119. package/dist/components/widget/WidgetUtils.js.map +0 -1
  120. package/dist/storybook/assets/Badge.stories-cKvztBhm.js +0 -43
  121. package/dist/storybook/assets/Button.stories-BH3fEuOH.js +0 -63
  122. package/dist/storybook/assets/Heading.stories-cqZamo-6.js +0 -3
  123. package/dist/storybook/assets/Icon.stories-uPhO3RBG.js +0 -28543
  124. package/dist/storybook/assets/Loader.stories-D7Bl-LN9.js +0 -3
  125. package/dist/storybook/assets/ScrollShadow.stories-CWKYDYLk.js +0 -17
  126. package/dist/storybook/assets/Widget-CRTwFkFc.css +0 -1
  127. package/dist/storybook/assets/Widget.stories-CcjywoYR.js +0 -300
  128. package/dist/storybook/assets/formatter-OMEEQ6HG-DBJ97XaR.js +0 -1
  129. package/dist/storybook/assets/iframe-BdHEYpHD.css +0 -1
  130. package/dist/utils/EventEmitterMixin.d.ts.map +0 -1
  131. package/dist/utils/EventEmitterMixin.js.map +0 -1
@@ -0,0 +1,172 @@
1
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ };
7
+ import { LitElement, html } from 'lit';
8
+ import { property } from 'lit/decorators.js';
9
+ import { unsafeHTML } from 'lit/directives/unsafe-html.js';
10
+ import { unsafeSVG } from 'lit/directives/unsafe-svg.js';
11
+ import * as LucideExports from 'lucide-static/dist/cjs/lucide-static';
12
+ import { getIcon } from '../../LucideDynamicLoader.js';
13
+ import { EventEmitterMixin } from '../../util/EventEmitterMixin.js';
14
+ import { ReadyMixin } from '../../util/ReadyMixin.js';
15
+ import { pascalToKebab } from '../../util/string.js';
16
+ import { addMask } from '../../util/svg.js';
17
+ const svgs = {};
18
+ for (const [key, value] of Object.entries(LucideExports)) {
19
+ if (typeof value === 'string') {
20
+ svgs[key] = value;
21
+ }
22
+ }
23
+ /**
24
+ * An icon component for displaying Lucide icons.
25
+ *
26
+ * Icons inherit parent text color by default or can use gradient fills.
27
+ * All icons are from the Lucide icon library (https://lucide.dev/icons/).
28
+ * Supports both direct SVG rendering and mask-based gradient fills.
29
+ *
30
+ * @element btu-icon
31
+ *
32
+ * @fires {CustomEvent} btu-icon-ready - Fired after first render and initialization
33
+ *
34
+ * @cssprop --Icon-size - Icon size (overrides size default)
35
+ * @cssprop --Icon-fill - Icon fill color for filled icons (e.g., "currentColor")
36
+ * @cssprop --Icon-svg - SVG data URI for mask-based rendering
37
+ *
38
+ * @example
39
+ * ```html
40
+ * <!-- Icon inheriting parent text color -->
41
+ * <btu-icon symbol="heart" size="md"></btu-icon>
42
+ *
43
+ * <!-- Gradient icon -->
44
+ * <btu-icon symbol="star" size="lg" gradient="primary"></btu-icon>
45
+ *
46
+ * <!-- Custom size via CSS -->
47
+ * <btu-icon symbol="check" style="--Icon-size: 3rem"></btu-icon>
48
+ *
49
+ * <!-- Filled icon via CSS (advanced usage) -->
50
+ * <btu-icon symbol="heart" style="--Icon-fill: currentColor"></btu-icon>
51
+ * ```
52
+ *
53
+ * @example
54
+ * ```typescript
55
+ * // Programmatic usage
56
+ * const icon = document.createElement('btu-icon')
57
+ * icon.symbol = 'smile'
58
+ * icon.size = 'lg'
59
+ * icon.addEventListener('btu-icon-ready', () => console.log('Icon loaded'))
60
+ * ```
61
+ */
62
+ export default class Icon extends EventEmitterMixin(ReadyMixin(LitElement)) {
63
+ constructor() {
64
+ super(...arguments);
65
+ /**
66
+ * Size of the icon.
67
+ * - 'xs': Extra small (0.75rem)
68
+ * - 'sm': Small (1rem)
69
+ * - 'md': Medium (1.25rem, default)
70
+ * - 'lg': Large (1.5rem)
71
+ * - 'xl': Extra large (1.75rem)
72
+ * @attr
73
+ */
74
+ this.size = 'md';
75
+ /**
76
+ * Lucide icon name to display.
77
+ * See https://lucide.dev/icons/ for available icons.
78
+ * @attr
79
+ */
80
+ this.symbol = 'circle-dashed';
81
+ /** @internal */
82
+ this.initialClasses = [];
83
+ }
84
+ static get tagName() {
85
+ return 'BTU-ICON';
86
+ }
87
+ connectedCallback() {
88
+ super.connectedCallback();
89
+ // Capture initial classes from backend HTML
90
+ if (this.className) {
91
+ this.initialClasses = this.className.split(' ').filter(c => c.trim());
92
+ }
93
+ }
94
+ createRenderRoot() {
95
+ return this;
96
+ }
97
+ willUpdate() {
98
+ const classes = [...this.initialClasses, 'btu-icon', `btu-icon-${this.size}`];
99
+ // Add gradient class if gradient is set
100
+ if (this.gradient) {
101
+ const iconName = window.BRIGHTSPOT?.icons?.materialToLucide?.[this.symbol] || this.symbol;
102
+ const kebabName = pascalToKebab(iconName);
103
+ classes.push(`btu-icon-gradient-${this.gradient}`);
104
+ classes.push(`btu-icon-via-mask-${kebabName}`);
105
+ }
106
+ this.className = classes.filter(Boolean).join(' ');
107
+ }
108
+ firstUpdated() {
109
+ this.emit('btu-icon-ready');
110
+ }
111
+ /**
112
+ * Escape HTML special characters to prevent XSS attacks in comments.
113
+ * @internal
114
+ */
115
+ escapeHtml(text) {
116
+ return text
117
+ .replace(/&/g, '&amp;')
118
+ .replace(/</g, '&lt;')
119
+ .replace(/>/g, '&gt;')
120
+ .replace(/"/g, '&quot;')
121
+ .replace(/'/g, '&#39;');
122
+ }
123
+ render() {
124
+ const iconName = window.BRIGHTSPOT?.icons?.materialToLucide?.[this.symbol] || this.symbol;
125
+ const data = getIcon(iconName);
126
+ let svgContent = data?.iconSvg ?? '';
127
+ let isInvalid = false;
128
+ if (!svgContent) {
129
+ // Fallback to default icon and mark as invalid
130
+ isInvalid = true;
131
+ const fallbackData = getIcon('circle-dashed');
132
+ svgContent = fallbackData?.iconSvg ?? '';
133
+ // If fallback also fails, show comment
134
+ if (!svgContent) {
135
+ return html `${unsafeHTML(`<!-- btu-icon: Icon "${this.escapeHtml(this.symbol)}" not found and fallback failed -->`)}`;
136
+ }
137
+ }
138
+ const decodedSvg = decodeURIComponent(svgContent);
139
+ // Prevent HTML comment injection by escaping dashes
140
+ const debugComment = isInvalid
141
+ ? `<!-- btu-icon: Icon "${this.escapeHtml(this.symbol)}" not found. Showing fallback "circle-dashed". See https://lucide.dev/icons/ for available icons. -->\n`
142
+ : '';
143
+ // For gradient fill, generate mask SVG and let Tailwind handle sizing/styling
144
+ if (this.gradient) {
145
+ const kebabName = pascalToKebab(iconName);
146
+ // Set mask URL for Tailwind plugin to reference
147
+ this.style.setProperty('--mask-url', `url(#${kebabName})`);
148
+ // Add mask element to SVG - Tailwind class handles display/sizing
149
+ const maskedSvg = addMask(decodedSvg, kebabName);
150
+ return html `${unsafeHTML(debugComment)}${unsafeSVG(maskedSvg)}`;
151
+ }
152
+ // Non-gradient path: render SVG with sizing
153
+ const fillAttr = this.style.getPropertyValue('--Icon-fill') ? `fill="var(--Icon-fill)"` : ''; // Optional fill
154
+ const styledSvg = decodedSvg.replace('<svg', `<svg ${fillAttr} style="width: var(--Icon-size); height: var(--Icon-size); display: inline-block;"`);
155
+ return html `${unsafeHTML(debugComment)}${unsafeSVG(styledSvg)}`;
156
+ }
157
+ }
158
+ __decorate([
159
+ property({ type: String })
160
+ ], Icon.prototype, "size", void 0);
161
+ __decorate([
162
+ property({ type: String })
163
+ ], Icon.prototype, "symbol", void 0);
164
+ __decorate([
165
+ property({ type: String })
166
+ ], Icon.prototype, "gradient", void 0);
167
+ // Register custom element with guard to prevent double registration
168
+ // (common with yarn link, HMR, or webpack bundle duplication)
169
+ if (!customElements.get('btu-icon')) {
170
+ customElements.define('btu-icon', Icon);
171
+ }
172
+ //# sourceMappingURL=Icon.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Icon.js","sourceRoot":"","sources":["../../../src/components/icon/Icon.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,40 @@
1
+ import { LitElement } from 'lit';
2
+ declare const LinearProgress_base: (new (...args: any[]) => import("../../util/ProgressMixin.js").ProgressMixinInterface) & (new (...args: any[]) => import("../../util/EventEmitterMixin.js").EventEmitterMixinInterface) & (new (...args: any[]) => import("../../util/ReadyMixin.js").ReadyMixinInterface) & typeof LitElement;
3
+ /**
4
+ * A horizontal linear progress bar for showing task completion.
5
+ *
6
+ * @element btu-linear-progress
7
+ *
8
+ * @fires {CustomEvent} btu-progress-ready - Fired after first render and initialization
9
+ * @fires {CustomEvent} btu-progress-complete - Fired when progress reaches 100
10
+ *
11
+ * @cssprop --progress-color - Custom progress bar color (overrides theme color)
12
+ * @cssprop --track-color - Track/background color (overrides default gray-100)
13
+ *
14
+ * @example
15
+ * ```html
16
+ * <!-- Basic progress bar (fills container width) -->
17
+ * <btu-linear-progress progress="50" color="primary"></btu-linear-progress>
18
+ *
19
+ * <!-- Control width via CSS -->
20
+ * <btu-linear-progress progress="75" color="success" label="75%" style="width: 300px;"></btu-linear-progress>
21
+ * ```
22
+ */
23
+ export default class LinearProgress extends LinearProgress_base {
24
+ /** @internal */
25
+ private _initialClasses;
26
+ connectedCallback(): void;
27
+ createRenderRoot(): this;
28
+ willUpdate(): void;
29
+ firstUpdated(changedProperties: Map<PropertyKey, unknown>): void;
30
+ disconnectedCallback(): void;
31
+ updated(changedProperties: Map<PropertyKey, unknown>): void;
32
+ render(): import("lit-html").TemplateResult<1>;
33
+ }
34
+ declare global {
35
+ interface HTMLElementTagNameMap {
36
+ 'btu-linear-progress': LinearProgress;
37
+ }
38
+ }
39
+ export {};
40
+ //# sourceMappingURL=LinearProgress.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"LinearProgress.d.ts","sourceRoot":"","sources":["../../../src/components/linear-progress/LinearProgress.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAsB,MAAM,KAAK,CAAA;;AAKpD;;;;;;;;;;;;;;;;;;;GAmBG;AACH,MAAM,CAAC,OAAO,OAAO,cAAe,SAAQ,mBAAwD;IAClG,gBAAgB;IAChB,OAAO,CAAC,eAAe,CAAe;IAEtC,iBAAiB,IAAI,IAAI;IAQzB,gBAAgB;IAIhB,UAAU,IAAI,IAAI;IAMlB,YAAY,CAAC,iBAAiB,EAAE,GAAG,CAAC,WAAW,EAAE,OAAO,CAAC,GAAG,IAAI;IAKhE,oBAAoB,IAAI,IAAI;IAK5B,OAAO,CAAC,iBAAiB,EAAE,GAAG,CAAC,WAAW,EAAE,OAAO,CAAC,GAAG,IAAI;IAO3D,MAAM;CAiCP;AAOD,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,qBAAqB;QAC7B,qBAAqB,EAAE,cAAc,CAAA;KACtC;CACF"}
@@ -0,0 +1,95 @@
1
+ import { LitElement, css, html, nothing } from 'lit';
2
+ import { EventEmitterMixin } from '../../util/EventEmitterMixin.js';
3
+ import { ProgressMixin } from '../../util/ProgressMixin.js';
4
+ import { ReadyMixin } from '../../util/ReadyMixin.js';
5
+ /**
6
+ * A horizontal linear progress bar for showing task completion.
7
+ *
8
+ * @element btu-linear-progress
9
+ *
10
+ * @fires {CustomEvent} btu-progress-ready - Fired after first render and initialization
11
+ * @fires {CustomEvent} btu-progress-complete - Fired when progress reaches 100
12
+ *
13
+ * @cssprop --progress-color - Custom progress bar color (overrides theme color)
14
+ * @cssprop --track-color - Track/background color (overrides default gray-100)
15
+ *
16
+ * @example
17
+ * ```html
18
+ * <!-- Basic progress bar (fills container width) -->
19
+ * <btu-linear-progress progress="50" color="primary"></btu-linear-progress>
20
+ *
21
+ * <!-- Control width via CSS -->
22
+ * <btu-linear-progress progress="75" color="success" label="75%" style="width: 300px;"></btu-linear-progress>
23
+ * ```
24
+ */
25
+ export default class LinearProgress extends ProgressMixin(EventEmitterMixin(ReadyMixin(LitElement))) {
26
+ constructor() {
27
+ super(...arguments);
28
+ /** @internal */
29
+ this._initialClasses = [];
30
+ }
31
+ connectedCallback() {
32
+ super.connectedCallback();
33
+ // Capture initial classes from backend HTML
34
+ if (this.className) {
35
+ this._initialClasses = this.className.split(' ').filter(c => c.trim());
36
+ }
37
+ }
38
+ createRenderRoot() {
39
+ return this;
40
+ }
41
+ willUpdate() {
42
+ const classes = [...this._initialClasses, 'inline-flex', 'items-center', 'w-full'];
43
+ this.className = classes.join(' ');
44
+ }
45
+ firstUpdated(changedProperties) {
46
+ super.firstUpdated(changedProperties);
47
+ this._setupInitialAnimation();
48
+ }
49
+ disconnectedCallback() {
50
+ super.disconnectedCallback();
51
+ this._cleanupInitialAnimation();
52
+ }
53
+ updated(changedProperties) {
54
+ super.updated(changedProperties);
55
+ // Track completion at 100%
56
+ this._trackCompletion();
57
+ }
58
+ render() {
59
+ const height = this.thickness ?? 8; // default thickness is 8
60
+ const color = this._getProgressColorValue();
61
+ const progressValue = this._getAnimatedProgress();
62
+ return html `
63
+ <div class="flex w-full items-center gap-3">
64
+ <span
65
+ class="block flex-1"
66
+ role="progressbar"
67
+ aria-label="${this.ariaLabel || nothing}"
68
+ aria-labelledby="${this.ariaLabelledBy || nothing}"
69
+ aria-valuenow="${progressValue}"
70
+ aria-valuemin="0"
71
+ aria-valuemax="100"
72
+ aria-valuetext="${this.ariaValueText || this.label || `${progressValue} percent`}"
73
+ >
74
+ <div
75
+ class="relative overflow-hidden rounded-full bg-[var(--track-color,_oklch(var(--btu-theme-gray-100)))]"
76
+ style="height: ${height}px;"
77
+ >
78
+ <div
79
+ class="h-full rounded-full [transition:_width_0.3s_ease]"
80
+ style="width: ${progressValue}%; background-color: ${color};"
81
+ ></div>
82
+ </div>
83
+ </span>
84
+ ${this.label
85
+ ? html `<span class="flex-shrink-0 whitespace-nowrap text-sm font-medium text-gray-700">${this.label}</span>`
86
+ : ''}
87
+ </div>
88
+ `;
89
+ }
90
+ }
91
+ // Register custom element with guard to prevent double registration
92
+ if (!customElements.get('btu-linear-progress')) {
93
+ customElements.define('btu-linear-progress', LinearProgress);
94
+ }
95
+ //# sourceMappingURL=LinearProgress.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"LinearProgress.js","sourceRoot":"","sources":["../../../src/components/linear-progress/LinearProgress.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,GAAG,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,KAAK,CAAA;AACpD,OAAO,EAAE,iBAAiB,EAAE,MAAM,iCAAiC,CAAA;AACnE,OAAO,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAA;AAC3D,OAAO,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAA;AAErD;;;;;;;;;;;;;;;;;;;GAmBG;AACH,MAAM,CAAC,OAAO,OAAO,cAAe,SAAQ,aAAa,CAAC,iBAAiB,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC,CAAC;IAApG;;QACE,gBAAgB;QACR,oBAAe,GAAa,EAAE,CAAA;IAsExC,CAAC;IApEC,iBAAiB;QACf,KAAK,CAAC,iBAAiB,EAAE,CAAA;QACzB,4CAA4C;QAC5C,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YACnB,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAA;QACxE,CAAC;IACH,CAAC;IAED,gBAAgB;QACd,OAAO,IAAI,CAAA;IACb,CAAC;IAED,UAAU;QACR,MAAM,OAAO,GAAG,CAAC,GAAG,IAAI,CAAC,eAAe,EAAE,aAAa,EAAE,cAAc,EAAE,QAAQ,CAAC,CAAA;QAElF,IAAI,CAAC,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;IACpC,CAAC;IAED,YAAY,CAAC,iBAA4C;QACvD,KAAK,CAAC,YAAY,CAAC,iBAAiB,CAAC,CAAA;QACrC,IAAI,CAAC,sBAAsB,EAAE,CAAA;IAC/B,CAAC;IAED,oBAAoB;QAClB,KAAK,CAAC,oBAAoB,EAAE,CAAA;QAC5B,IAAI,CAAC,wBAAwB,EAAE,CAAA;IACjC,CAAC;IAED,OAAO,CAAC,iBAA4C;QAClD,KAAK,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAA;QAEhC,2BAA2B;QAC3B,IAAI,CAAC,gBAAgB,EAAE,CAAA;IACzB,CAAC;IAED,MAAM;QACJ,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,IAAI,CAAC,CAAA,CAAC,yBAAyB;QAC5D,MAAM,KAAK,GAAG,IAAI,CAAC,sBAAsB,EAAE,CAAA;QAC3C,MAAM,aAAa,GAAG,IAAI,CAAC,oBAAoB,EAAE,CAAA;QAEjD,OAAO,IAAI,CAAA;;;;;wBAKS,IAAI,CAAC,SAAS,IAAI,OAAO;6BACpB,IAAI,CAAC,cAAc,IAAI,OAAO;2BAChC,aAAa;;;4BAGZ,IAAI,CAAC,aAAa,IAAI,IAAI,CAAC,KAAK,IAAI,GAAG,aAAa,UAAU;;;;6BAI7D,MAAM;;;;8BAIL,aAAa,wBAAwB,KAAK;;;;UAI9D,IAAI,CAAC,KAAK;YACV,CAAC,CAAC,IAAI,CAAA,mFAAmF,IAAI,CAAC,KAAK,SAAS;YAC5G,CAAC,CAAC,EAAE;;KAET,CAAA;IACH,CAAC;CACF;AAED,oEAAoE;AACpE,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,qBAAqB,CAAC,EAAE,CAAC;IAC/C,cAAc,CAAC,MAAM,CAAC,qBAAqB,EAAE,cAAc,CAAC,CAAA;AAC9D,CAAC"}