@krollins/blueprint 0.1.12 → 0.1.13

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 (95) hide show
  1. package/dist/components/accordion.js +393 -0
  2. package/dist/components/accordion.js.map +1 -0
  3. package/dist/components/alert.js +213 -0
  4. package/dist/components/alert.js.map +1 -0
  5. package/dist/components/avatar.js +237 -0
  6. package/dist/components/avatar.js.map +1 -0
  7. package/dist/components/badge.js +144 -0
  8. package/dist/components/badge.js.map +1 -0
  9. package/dist/components/breadcrumb.js +481 -0
  10. package/dist/components/breadcrumb.js.map +1 -0
  11. package/dist/components/button.js +192 -0
  12. package/dist/components/button.js.map +1 -0
  13. package/dist/components/card.js +223 -0
  14. package/dist/components/card.js.map +1 -0
  15. package/dist/components/checkbox.js +337 -0
  16. package/dist/components/checkbox.js.map +1 -0
  17. package/dist/components/color-picker.js +1660 -0
  18. package/dist/components/color-picker.js.map +1 -0
  19. package/dist/components/combobox.js +595 -0
  20. package/dist/components/combobox.js.map +1 -0
  21. package/dist/components/date-picker.js +726 -0
  22. package/dist/components/date-picker.js.map +1 -0
  23. package/dist/components/divider.js +214 -0
  24. package/dist/components/divider.js.map +1 -0
  25. package/dist/components/drawer.js +568 -0
  26. package/dist/components/drawer.js.map +1 -0
  27. package/dist/components/dropdown.js +377 -0
  28. package/dist/components/dropdown.js.map +1 -0
  29. package/dist/components/file-upload.js +669 -0
  30. package/dist/components/file-upload.js.map +1 -0
  31. package/dist/components/heading.js +161 -0
  32. package/dist/components/heading.js.map +1 -0
  33. package/dist/components/icon.js +599 -0
  34. package/dist/components/icon.js.map +1 -0
  35. package/dist/components/input.js +363 -0
  36. package/dist/components/input.js.map +1 -0
  37. package/dist/components/link.js +178 -0
  38. package/dist/components/link.js.map +1 -0
  39. package/dist/components/menu.js +331 -0
  40. package/dist/components/menu.js.map +1 -0
  41. package/dist/components/modal.js +317 -0
  42. package/dist/components/modal.js.map +1 -0
  43. package/dist/components/multi-select.js +642 -0
  44. package/dist/components/multi-select.js.map +1 -0
  45. package/dist/components/notification.js +429 -0
  46. package/dist/components/notification.js.map +1 -0
  47. package/dist/components/number-input.js +556 -0
  48. package/dist/components/number-input.js.map +1 -0
  49. package/dist/components/pagination.js +320 -0
  50. package/dist/components/pagination.js.map +1 -0
  51. package/dist/components/popover.js +597 -0
  52. package/dist/components/popover.js.map +1 -0
  53. package/dist/components/progress.js +219 -0
  54. package/dist/components/progress.js.map +1 -0
  55. package/dist/components/radio.js +321 -0
  56. package/dist/components/radio.js.map +1 -0
  57. package/dist/components/select.js +498 -0
  58. package/dist/components/select.js.map +1 -0
  59. package/dist/components/skeleton.js +240 -0
  60. package/dist/components/skeleton.js.map +1 -0
  61. package/dist/components/slider.js +9 -0
  62. package/dist/components/slider.js.map +1 -0
  63. package/dist/components/spinner.js +133 -0
  64. package/dist/components/spinner.js.map +1 -0
  65. package/dist/components/stepper.js +812 -0
  66. package/dist/components/stepper.js.map +1 -0
  67. package/dist/components/switch.js +380 -0
  68. package/dist/components/switch.js.map +1 -0
  69. package/dist/components/table.js +642 -0
  70. package/dist/components/table.js.map +1 -0
  71. package/dist/components/tabs.js +547 -0
  72. package/dist/components/tabs.js.map +1 -0
  73. package/dist/components/tag.js +291 -0
  74. package/dist/components/tag.js.map +1 -0
  75. package/dist/components/text.js +278 -0
  76. package/dist/components/text.js.map +1 -0
  77. package/dist/components/textarea.js +380 -0
  78. package/dist/components/textarea.js.map +1 -0
  79. package/dist/components/time-picker.js +457 -0
  80. package/dist/components/time-picker.js.map +1 -0
  81. package/dist/components/tooltip.js +239 -0
  82. package/dist/components/tooltip.js.map +1 -0
  83. package/dist/components/tree.js +582 -0
  84. package/dist/components/tree.js.map +1 -0
  85. package/dist/index.js +93 -17799
  86. package/dist/index.js.map +1 -1
  87. package/dist/shared/boolean-converter-XDGfS9LC.js +12 -0
  88. package/dist/shared/boolean-converter-XDGfS9LC.js.map +1 -0
  89. package/dist/shared/debounce-BckY30Sf.js +23 -0
  90. package/dist/shared/debounce-BckY30Sf.js.map +1 -0
  91. package/dist/shared/memoize-DlOFy-92.js +16 -0
  92. package/dist/shared/memoize-DlOFy-92.js.map +1 -0
  93. package/dist/shared/slider-BNt5TITl.js +484 -0
  94. package/dist/shared/slider-BNt5TITl.js.map +1 -0
  95. package/package.json +44 -2
@@ -0,0 +1,12 @@
1
+ const r = {
2
+ fromAttribute(t) {
3
+ return t === null ? !0 : t.toLowerCase() !== "false";
4
+ },
5
+ toAttribute(t) {
6
+ return t ? "" : "false";
7
+ }
8
+ };
9
+ export {
10
+ r as b
11
+ };
12
+ //# sourceMappingURL=boolean-converter-XDGfS9LC.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"boolean-converter-XDGfS9LC.js","sources":["../../source/utilities/boolean-converter.ts"],"sourcesContent":["import type { ComplexAttributeConverter } from 'lit';\r\n\r\n/**\r\n * A custom Lit attribute converter for boolean properties that default to `true`.\r\n *\r\n * Lit's built-in `type: Boolean` follows native HTML boolean attribute semantics:\r\n * any attribute presence (even `=\"false\"`) is treated as `true`. This converter\r\n * instead parses the attribute value so `=\"false\"` correctly sets the property\r\n * to `false`.\r\n *\r\n * Behavior:\r\n * - Attribute absent → `null` (property uses its default)\r\n * - `attribute=\"\"` or `attribute` (no value) → `true`\r\n * - `attribute=\"false\"` → `false`\r\n * - `attribute=\"true\"` or any other value → `true`\r\n *\r\n * Usage:\r\n * ```ts\r\n * @property({ converter: booleanConverter, reflect: true })\r\n * declare showBackdrop: boolean;\r\n * ```\r\n */\r\nexport const booleanConverter: ComplexAttributeConverter<boolean> = {\r\n fromAttribute(value: string | null): boolean {\r\n if (value === null) {\r\n return true;\r\n }\r\n return value.toLowerCase() !== 'false';\r\n },\r\n toAttribute(value: boolean): string | null {\r\n return value ? '' : 'false';\r\n },\r\n};\r\n"],"names":["booleanConverter","value"],"mappings":"AAsBO,MAAMA,IAAuD;AAAA,EAClE,cAAcC,GAA+B;AAC3C,WAAIA,MAAU,OACL,KAEFA,EAAM,kBAAkB;AAAA,EACjC;AAAA,EACA,YAAYA,GAA+B;AACzC,WAAOA,IAAQ,KAAK;AAAA,EACtB;AACF;"}
@@ -0,0 +1,23 @@
1
+ function c(t, i) {
2
+ let l = null, n = null;
3
+ const u = (...e) => {
4
+ n = e, l !== null && clearTimeout(l), l = setTimeout(() => {
5
+ if (l = null, n !== null) {
6
+ const o = n;
7
+ n = null, t(...o);
8
+ }
9
+ }, i);
10
+ };
11
+ return u.cancel = () => {
12
+ l !== null && (clearTimeout(l), l = null), n = null;
13
+ }, u.flush = () => {
14
+ if (l !== null && (clearTimeout(l), l = null), n !== null) {
15
+ const e = n;
16
+ n = null, t(...e);
17
+ }
18
+ }, u;
19
+ }
20
+ export {
21
+ c as d
22
+ };
23
+ //# sourceMappingURL=debounce-BckY30Sf.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"debounce-BckY30Sf.js","sources":["../../source/utilities/debounce.ts"],"sourcesContent":["/**\r\n * Debounce utility for delaying function execution until after a period of inactivity.\r\n * Trailing-edge by default: fires after the delay has elapsed since the last call.\r\n */\r\n\r\ntype DebouncedFunction<T extends (...args: never[]) => unknown> = {\r\n (...args: Parameters<T>): void;\r\n cancel: () => void;\r\n flush: () => void;\r\n};\r\n\r\nexport function debounce<T extends (...args: never[]) => unknown>(\r\n fn: T,\r\n delay: number\r\n): DebouncedFunction<T> {\r\n let timeoutId: ReturnType<typeof setTimeout> | null = null;\r\n let pendingArgs: Parameters<T> | null = null;\r\n\r\n const debounced = (...args: Parameters<T>): void => {\r\n pendingArgs = args;\r\n\r\n if (timeoutId !== null) {\r\n clearTimeout(timeoutId);\r\n }\r\n\r\n timeoutId = setTimeout(() => {\r\n timeoutId = null;\r\n if (pendingArgs !== null) {\r\n const args = pendingArgs;\r\n pendingArgs = null;\r\n fn(...args);\r\n }\r\n }, delay);\r\n };\r\n\r\n debounced.cancel = () => {\r\n if (timeoutId !== null) {\r\n clearTimeout(timeoutId);\r\n timeoutId = null;\r\n }\r\n pendingArgs = null;\r\n };\r\n\r\n debounced.flush = () => {\r\n if (timeoutId !== null) {\r\n clearTimeout(timeoutId);\r\n timeoutId = null;\r\n }\r\n if (pendingArgs !== null) {\r\n const args = pendingArgs;\r\n pendingArgs = null;\r\n fn(...args);\r\n }\r\n };\r\n\r\n return debounced;\r\n}\r\n"],"names":["debounce","fn","delay","timeoutId","pendingArgs","debounced","args"],"mappings":"AAWO,SAASA,EACdC,GACAC,GACsB;AACtB,MAAIC,IAAkD,MAClDC,IAAoC;AAExC,QAAMC,IAAY,IAAIC,MAA8B;AAClD,IAAAF,IAAcE,GAEVH,MAAc,QAChB,aAAaA,CAAS,GAGxBA,IAAY,WAAW,MAAM;AAE3B,UADAA,IAAY,MACRC,MAAgB,MAAM;AACxB,cAAME,IAAOF;AACb,QAAAA,IAAc,MACdH,EAAG,GAAGK,CAAI;AAAA,MACZ;AAAA,IACF,GAAGJ,CAAK;AAAA,EACV;AAEA,SAAAG,EAAU,SAAS,MAAM;AACvB,IAAIF,MAAc,SAChB,aAAaA,CAAS,GACtBA,IAAY,OAEdC,IAAc;AAAA,EAChB,GAEAC,EAAU,QAAQ,MAAM;AAKtB,QAJIF,MAAc,SAChB,aAAaA,CAAS,GACtBA,IAAY,OAEVC,MAAgB,MAAM;AACxB,YAAME,IAAOF;AACb,MAAAA,IAAc,MACdH,EAAG,GAAGK,CAAI;AAAA,IACZ;AAAA,EACF,GAEOD;AACT;"}
@@ -0,0 +1,16 @@
1
+ function i(t) {
2
+ let l, e, r = !1;
3
+ return (...n) => (r && u(l, n) || (l = n, e = t(...n), r = !0), e);
4
+ }
5
+ function u(t, l) {
6
+ if (t.length !== l.length)
7
+ return !1;
8
+ for (let e = 0; e < t.length; e++)
9
+ if (t[e] !== l[e])
10
+ return !1;
11
+ return !0;
12
+ }
13
+ export {
14
+ i as m
15
+ };
16
+ //# sourceMappingURL=memoize-DlOFy-92.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memoize-DlOFy-92.js","sources":["../../source/utilities/memoize.ts"],"sourcesContent":["/**\r\n * Single-result memoization utility.\r\n * Caches the last call's arguments and result using shallow equality comparison.\r\n * Ideal for willUpdate() patterns where you memoize based on reactive properties.\r\n */\r\n\r\nexport function memoizeOne<T extends (...args: never[]) => unknown>(\r\n fn: T\r\n): T {\r\n let lastArgs: Parameters<T> | undefined;\r\n let lastResult: ReturnType<T>;\r\n let hasBeenCalled = false;\r\n\r\n const memoized = (...args: Parameters<T>): ReturnType<T> => {\r\n if (hasBeenCalled && argsMatch(lastArgs!, args)) {\r\n return lastResult;\r\n }\r\n\r\n lastArgs = args;\r\n lastResult = fn(...args) as ReturnType<T>;\r\n hasBeenCalled = true;\r\n return lastResult;\r\n };\r\n\r\n return memoized as T;\r\n}\r\n\r\nfunction argsMatch(prev: unknown[], next: unknown[]): boolean {\r\n if (prev.length !== next.length) {\r\n return false;\r\n }\r\n\r\n for (let i = 0; i < prev.length; i++) {\r\n if (prev[i] !== next[i]) {\r\n return false;\r\n }\r\n }\r\n\r\n return true;\r\n}\r\n"],"names":["memoizeOne","fn","lastArgs","lastResult","hasBeenCalled","args","argsMatch","prev","next","i"],"mappings":"AAMO,SAASA,EACdC,GACG;AACH,MAAIC,GACAC,GACAC,IAAgB;AAapB,SAXiB,IAAIC,OACfD,KAAiBE,EAAUJ,GAAWG,CAAI,MAI9CH,IAAWG,GACXF,IAAaF,EAAG,GAAGI,CAAI,GACvBD,IAAgB,KACTD;AAIX;AAEA,SAASG,EAAUC,GAAiBC,GAA0B;AAC5D,MAAID,EAAK,WAAWC,EAAK;AACvB,WAAO;AAGT,WAASC,IAAI,GAAGA,IAAIF,EAAK,QAAQE;AAC/B,QAAIF,EAAKE,CAAC,MAAMD,EAAKC,CAAC;AACpB,aAAO;AAIX,SAAO;AACT;"}
@@ -0,0 +1,484 @@
1
+ import { css as v, LitElement as m, nothing as h, html as c } from "lit";
2
+ import { property as n, state as g, query as f, customElement as _ } from "lit/decorators.js";
3
+ import { classMap as w } from "lit/directives/class-map.js";
4
+ import { repeat as k } from "lit/directives/repeat.js";
5
+ const y = v`
6
+ /* Base styles */
7
+ :host {
8
+ display: block;
9
+ }
10
+
11
+ .slider {
12
+ font-family: var(--bp-font-family);
13
+ }
14
+
15
+ .slider__header {
16
+ display: flex;
17
+ justify-content: space-between;
18
+ align-items: center;
19
+ margin-bottom: var(--bp-spacing-sm);
20
+ }
21
+
22
+ .slider__label {
23
+ font-size: var(--bp-font-size-sm);
24
+ font-weight: var(--bp-font-weight-medium);
25
+ color: var(--bp-color-text);
26
+ line-height: var(--bp-line-height-normal);
27
+ }
28
+
29
+ .slider__value {
30
+ font-size: var(--bp-font-size-sm);
31
+ font-weight: var(--bp-font-weight-medium);
32
+ color: var(--bp-color-text-muted);
33
+ font-variant-numeric: tabular-nums;
34
+ }
35
+
36
+ .slider__container {
37
+ position: relative;
38
+ display: flex;
39
+ align-items: center;
40
+ cursor: pointer;
41
+ }
42
+
43
+ .slider__track {
44
+ position: relative;
45
+ width: 100%;
46
+ background-color: var(--bp-color-border);
47
+ border-radius: var(--bp-border-radius-full);
48
+ overflow: visible;
49
+ }
50
+
51
+ .slider__fill {
52
+ position: absolute;
53
+ top: 0;
54
+ left: 0;
55
+ height: 100%;
56
+ background-color: var(--bp-color-primary);
57
+ border-radius: var(--bp-border-radius-full);
58
+ transition:
59
+ width var(--bp-duration-instant),
60
+ background-color var(--bp-transition-fast);
61
+ }
62
+
63
+ .slider__thumb {
64
+ position: absolute;
65
+ background-color: var(--bp-color-surface-elevated);
66
+ border: var(--bp-border-width) solid var(--bp-color-primary);
67
+ border-radius: var(--bp-border-radius-full);
68
+ box-shadow:
69
+ 0 1px 3px oklch(0 0 0 / 0.2),
70
+ 0 1px 2px oklch(0 0 0 / 0.1);
71
+ top: 50%;
72
+ transform: translate(-50%, -50%);
73
+ cursor: grab;
74
+ transition:
75
+ box-shadow var(--bp-transition-fast),
76
+ transform var(--bp-transition-fast),
77
+ border-color var(--bp-transition-fast);
78
+ }
79
+
80
+ .slider__thumb:focus {
81
+ outline: none;
82
+ box-shadow: 0 0 0 var(--bp-focus-width) var(--bp-color-focus);
83
+ }
84
+
85
+ .slider__thumb:focus-visible {
86
+ outline: none;
87
+ box-shadow: 0 0 0 var(--bp-focus-width) var(--bp-color-focus);
88
+ }
89
+
90
+ .slider__ticks {
91
+ position: absolute;
92
+ top: 100%;
93
+ left: 0;
94
+ right: 0;
95
+ height: var(--bp-spacing-xs);
96
+ pointer-events: none;
97
+ }
98
+
99
+ .slider__tick {
100
+ position: absolute;
101
+ top: var(--bp-spacing-xs);
102
+ width: var(--bp-spacing-0-5);
103
+ height: var(--bp-spacing-xs);
104
+ background-color: var(--bp-color-border-strong);
105
+ transform: translateX(-50%);
106
+ }
107
+
108
+ /* Size variants */
109
+ .slider--sm .slider__track {
110
+ height: var(--bp-spacing-1);
111
+ }
112
+
113
+ .slider--sm .slider__thumb {
114
+ width: var(--bp-spacing-3);
115
+ height: var(--bp-spacing-3);
116
+ box-shadow: 0 1px 2px rgba(0, 0, 0, 0.1);
117
+ }
118
+
119
+ .slider--md .slider__track {
120
+ height: var(--bp-spacing-1-5);
121
+ }
122
+
123
+ .slider--md .slider__thumb {
124
+ width: var(--bp-spacing-4);
125
+ height: var(--bp-spacing-4);
126
+ }
127
+
128
+ .slider--lg .slider__track {
129
+ height: var(--bp-spacing-2);
130
+ }
131
+
132
+ .slider--lg .slider__thumb {
133
+ width: var(--bp-spacing-5);
134
+ height: var(--bp-spacing-5);
135
+ box-shadow: var(--bp-shadow-md);
136
+ }
137
+
138
+ /* States */
139
+ .slider__container:hover .slider__thumb {
140
+ border-color: var(--bp-color-primary-hover);
141
+ transform: translate(-50%, -50%) scale(1.1);
142
+ }
143
+
144
+ .slider__container:hover .slider__fill {
145
+ background-color: var(--bp-color-primary-hover);
146
+ }
147
+
148
+ .slider__container:hover .slider__track {
149
+ background-color: color-mix(
150
+ in srgb,
151
+ var(--bp-color-border) 90%,
152
+ var(--bp-color-primary) 10%
153
+ );
154
+ }
155
+
156
+ .slider--dragging .slider__thumb {
157
+ cursor: grabbing;
158
+ border-color: var(--bp-color-primary-active);
159
+ box-shadow: var(--bp-shadow-md);
160
+ transform: translate(-50%, -50%) scale(1.15);
161
+ }
162
+
163
+ .slider--dragging .slider__fill {
164
+ background-color: var(--bp-color-primary-active);
165
+ transition: none;
166
+ }
167
+
168
+ .slider--dragging .slider__track {
169
+ background-color: color-mix(
170
+ in srgb,
171
+ var(--bp-color-border) 85%,
172
+ var(--bp-color-primary) 15%
173
+ );
174
+ }
175
+
176
+ .slider--disabled {
177
+ pointer-events: none;
178
+ }
179
+
180
+ .slider--disabled .slider__track {
181
+ background-color: var(--bp-color-surface-subdued);
182
+ }
183
+
184
+ .slider--disabled .slider__fill {
185
+ background-color: var(--bp-color-border);
186
+ }
187
+
188
+ .slider--disabled .slider__thumb {
189
+ background-color: var(--bp-color-surface-subdued);
190
+ border-color: var(--bp-color-border);
191
+ cursor: not-allowed;
192
+ box-shadow: none;
193
+ }
194
+
195
+ .slider--disabled .slider__label,
196
+ .slider--disabled .slider__value {
197
+ color: var(--bp-color-text-muted);
198
+ opacity: var(--bp-opacity-disabled);
199
+ }
200
+ `;
201
+ function x(t, e) {
202
+ const s = e <= 16;
203
+ let i = null, r = null, o = null, d = !1;
204
+ const p = (...u) => {
205
+ if (s)
206
+ i = u, r === null && (t(...u), i = null, r = requestAnimationFrame(() => {
207
+ r = null, i !== null && (t(...i), i = null);
208
+ }));
209
+ else if (d)
210
+ i = u;
211
+ else {
212
+ t(...u), d = !0, i = null;
213
+ const b = () => {
214
+ o = setTimeout(() => {
215
+ o = null, i !== null ? (t(...i), i = null, b()) : d = !1;
216
+ }, e);
217
+ };
218
+ b();
219
+ }
220
+ };
221
+ return p.cancel = () => {
222
+ r !== null && (cancelAnimationFrame(r), r = null), o !== null && (clearTimeout(o), o = null), i = null, d = !1;
223
+ }, p;
224
+ }
225
+ var E = Object.defineProperty, $ = Object.getOwnPropertyDescriptor, l = (t, e, s, i) => {
226
+ for (var r = i > 1 ? void 0 : i ? $(e, s) : e, o = t.length - 1, d; o >= 0; o--)
227
+ (d = t[o]) && (r = (i ? d(e, s, r) : d(r)) || r);
228
+ return i && r && E(e, s, r), r;
229
+ };
230
+ let a = class extends m {
231
+ constructor() {
232
+ super(), this.isDragging = !1, this.cachedTrackRect = null, this.throttledUpdatePosition = x((t) => {
233
+ this.updateValueFromPosition(t);
234
+ }, 16), this.value = 0, this.min = 0, this.max = 100, this.step = 1, this.name = "", this.label = "", this.disabled = !1, this.size = "md", this.showValue = !1, this.showTicks = !1, this.formatValue = (t) => String(t);
235
+ }
236
+ disconnectedCallback() {
237
+ super.disconnectedCallback(), this.throttledUpdatePosition.cancel(), this.cachedTrackRect = null;
238
+ }
239
+ /**
240
+ * Calculate the percentage position of the current value
241
+ */
242
+ get percentage() {
243
+ const t = this.max - this.min;
244
+ return t === 0 ? 0 : (this.value - this.min) / t * 100;
245
+ }
246
+ /**
247
+ * Get tick positions based on step
248
+ */
249
+ get tickPositions() {
250
+ if (!this.showTicks) return [];
251
+ const t = [], e = this.max - this.min, s = Math.floor(e / this.step);
252
+ if (s > 20) return [];
253
+ for (let i = 0; i <= s; i++)
254
+ t.push(i * this.step / e * 100);
255
+ return t;
256
+ }
257
+ /**
258
+ * Clamp value to min/max and round to step.
259
+ * Uses decimal-aware rounding to avoid floating-point artifacts
260
+ * (e.g. 0.6900000000000001 instead of 0.69).
261
+ */
262
+ clampValue(t) {
263
+ const e = String(this.step), s = e.includes(".") ? e.split(".")[1].length : 0, i = Math.round((t - this.min) / this.step) * this.step + this.min, r = parseFloat(i.toFixed(s));
264
+ return Math.max(this.min, Math.min(this.max, r));
265
+ }
266
+ /**
267
+ * Update value from a position on the track.
268
+ * Uses cached bounding rect during drag for performance.
269
+ */
270
+ updateValueFromPosition(t) {
271
+ if (!this.trackElement || this.disabled) return;
272
+ const e = this.cachedTrackRect || this.trackElement.getBoundingClientRect(), s = Math.max(
273
+ 0,
274
+ Math.min(1, (t - e.left) / e.width)
275
+ ), i = this.min + s * (this.max - this.min), r = this.clampValue(i);
276
+ r !== this.value && (this.value = r, this.dispatchEvent(
277
+ new CustomEvent("bp-input", {
278
+ detail: { value: this.value },
279
+ bubbles: !0,
280
+ composed: !0
281
+ })
282
+ ));
283
+ }
284
+ /**
285
+ * Handle mouse down on track or thumb
286
+ */
287
+ handleMouseDown(t) {
288
+ if (this.disabled) return;
289
+ t.preventDefault(), this.isDragging = !0, this.cachedTrackRect = this.trackElement?.getBoundingClientRect() ?? null, this.updateValueFromPosition(t.clientX);
290
+ const e = (i) => {
291
+ this.throttledUpdatePosition(i.clientX);
292
+ }, s = () => {
293
+ this.throttledUpdatePosition.cancel(), this.cachedTrackRect = null, this.isDragging = !1, document.removeEventListener("mousemove", e), document.removeEventListener("mouseup", s), this.dispatchEvent(
294
+ new CustomEvent("bp-change", {
295
+ detail: { value: this.value },
296
+ bubbles: !0,
297
+ composed: !0
298
+ })
299
+ );
300
+ };
301
+ document.addEventListener("mousemove", e), document.addEventListener("mouseup", s);
302
+ }
303
+ /**
304
+ * Handle touch start on track or thumb
305
+ */
306
+ handleTouchStart(t) {
307
+ if (this.disabled) return;
308
+ t.preventDefault(), this.isDragging = !0, this.cachedTrackRect = this.trackElement?.getBoundingClientRect() ?? null;
309
+ const e = t.touches[0];
310
+ this.updateValueFromPosition(e.clientX);
311
+ const s = (r) => {
312
+ const o = r.touches[0];
313
+ this.throttledUpdatePosition(o.clientX);
314
+ }, i = () => {
315
+ this.throttledUpdatePosition.cancel(), this.cachedTrackRect = null, this.isDragging = !1, document.removeEventListener("touchmove", s), document.removeEventListener("touchend", i), this.dispatchEvent(
316
+ new CustomEvent("bp-change", {
317
+ detail: { value: this.value },
318
+ bubbles: !0,
319
+ composed: !0
320
+ })
321
+ );
322
+ };
323
+ document.addEventListener("touchmove", s), document.addEventListener("touchend", i);
324
+ }
325
+ /**
326
+ * Handle keyboard navigation
327
+ */
328
+ handleKeyDown(t) {
329
+ if (this.disabled) return;
330
+ let e = this.value;
331
+ const s = this.step * 10;
332
+ switch (t.key) {
333
+ case "ArrowRight":
334
+ case "ArrowUp":
335
+ e = this.clampValue(this.value + this.step);
336
+ break;
337
+ case "ArrowLeft":
338
+ case "ArrowDown":
339
+ e = this.clampValue(this.value - this.step);
340
+ break;
341
+ case "PageUp":
342
+ e = this.clampValue(this.value + s);
343
+ break;
344
+ case "PageDown":
345
+ e = this.clampValue(this.value - s);
346
+ break;
347
+ case "Home":
348
+ e = this.min;
349
+ break;
350
+ case "End":
351
+ e = this.max;
352
+ break;
353
+ default:
354
+ return;
355
+ }
356
+ t.preventDefault(), e !== this.value && (this.value = e, this.dispatchEvent(
357
+ new CustomEvent("bp-input", {
358
+ detail: { value: this.value },
359
+ bubbles: !0,
360
+ composed: !0
361
+ })
362
+ ), this.dispatchEvent(
363
+ new CustomEvent("bp-change", {
364
+ detail: { value: this.value },
365
+ bubbles: !0,
366
+ composed: !0
367
+ })
368
+ ));
369
+ }
370
+ render() {
371
+ const t = {
372
+ slider: !0,
373
+ [`slider--${this.size}`]: !0,
374
+ "slider--disabled": this.disabled,
375
+ "slider--dragging": this.isDragging
376
+ };
377
+ return c`
378
+ <div class=${w(t)}>
379
+ ${this.label || this.showValue ? c`
380
+ <div class="slider__header">
381
+ ${this.label ? c`<label class="slider__label" part="label"
382
+ >${this.label}</label
383
+ >` : h}
384
+ ${this.showValue ? c`<span class="slider__value" part="value-display"
385
+ >${this.formatValue(this.value)}</span
386
+ >` : h}
387
+ </div>
388
+ ` : h}
389
+ <div
390
+ class="slider__container"
391
+ @mousedown=${this.handleMouseDown}
392
+ @touchstart=${this.handleTouchStart}
393
+ >
394
+ <div class="slider__track" part="track">
395
+ <div
396
+ class="slider__fill"
397
+ part="fill"
398
+ style="width: ${this.percentage}%"
399
+ ></div>
400
+ ${this.showTicks ? c`
401
+ <div class="slider__ticks">
402
+ ${k(
403
+ this.tickPositions,
404
+ (e) => e,
405
+ (e) => c`<div
406
+ class="slider__tick"
407
+ style="left: ${e}%"
408
+ ></div>`
409
+ )}
410
+ </div>
411
+ ` : h}
412
+ </div>
413
+ <div
414
+ class="slider__thumb"
415
+ part="thumb"
416
+ role="slider"
417
+ tabindex=${this.disabled ? -1 : 0}
418
+ aria-label=${this.label || "Slider"}
419
+ aria-valuemin=${this.min}
420
+ aria-valuemax=${this.max}
421
+ aria-valuenow=${this.value}
422
+ aria-valuetext=${this.formatValue(this.value)}
423
+ aria-disabled=${this.disabled}
424
+ style="left: ${this.percentage}%"
425
+ @keydown=${this.handleKeyDown}
426
+ ></div>
427
+ </div>
428
+ ${this.name ? c`<input
429
+ type="hidden"
430
+ name=${this.name}
431
+ .value=${String(this.value)}
432
+ />` : h}
433
+ </div>
434
+ `;
435
+ }
436
+ };
437
+ a.styles = [y];
438
+ l([
439
+ n({ type: Number })
440
+ ], a.prototype, "value", 2);
441
+ l([
442
+ n({ type: Number })
443
+ ], a.prototype, "min", 2);
444
+ l([
445
+ n({ type: Number })
446
+ ], a.prototype, "max", 2);
447
+ l([
448
+ n({ type: Number })
449
+ ], a.prototype, "step", 2);
450
+ l([
451
+ n({ type: String })
452
+ ], a.prototype, "name", 2);
453
+ l([
454
+ n({ type: String })
455
+ ], a.prototype, "label", 2);
456
+ l([
457
+ n({ type: Boolean, reflect: !0 })
458
+ ], a.prototype, "disabled", 2);
459
+ l([
460
+ n({ type: String })
461
+ ], a.prototype, "size", 2);
462
+ l([
463
+ n({ type: Boolean, attribute: "show-value" })
464
+ ], a.prototype, "showValue", 2);
465
+ l([
466
+ n({ type: Boolean, attribute: "show-ticks" })
467
+ ], a.prototype, "showTicks", 2);
468
+ l([
469
+ n({ attribute: !1 })
470
+ ], a.prototype, "formatValue", 2);
471
+ l([
472
+ g()
473
+ ], a.prototype, "isDragging", 2);
474
+ l([
475
+ f(".slider__track")
476
+ ], a.prototype, "trackElement", 2);
477
+ a = l([
478
+ _("bp-slider")
479
+ ], a);
480
+ export {
481
+ a as B,
482
+ x as t
483
+ };
484
+ //# sourceMappingURL=slider-BNt5TITl.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"slider-BNt5TITl.js","sources":["../../source/components/slider/slider.style.ts","../../source/utilities/throttle.ts","../../source/components/slider/slider.ts"],"sourcesContent":["import { css } from 'lit';\r\n\r\nexport const sliderStyles = css`\r\n /* Base styles */\r\n :host {\r\n display: block;\r\n }\r\n\r\n .slider {\r\n font-family: var(--bp-font-family);\r\n }\r\n\r\n .slider__header {\r\n display: flex;\r\n justify-content: space-between;\r\n align-items: center;\r\n margin-bottom: var(--bp-spacing-sm);\r\n }\r\n\r\n .slider__label {\r\n font-size: var(--bp-font-size-sm);\r\n font-weight: var(--bp-font-weight-medium);\r\n color: var(--bp-color-text);\r\n line-height: var(--bp-line-height-normal);\r\n }\r\n\r\n .slider__value {\r\n font-size: var(--bp-font-size-sm);\r\n font-weight: var(--bp-font-weight-medium);\r\n color: var(--bp-color-text-muted);\r\n font-variant-numeric: tabular-nums;\r\n }\r\n\r\n .slider__container {\r\n position: relative;\r\n display: flex;\r\n align-items: center;\r\n cursor: pointer;\r\n }\r\n\r\n .slider__track {\r\n position: relative;\r\n width: 100%;\r\n background-color: var(--bp-color-border);\r\n border-radius: var(--bp-border-radius-full);\r\n overflow: visible;\r\n }\r\n\r\n .slider__fill {\r\n position: absolute;\r\n top: 0;\r\n left: 0;\r\n height: 100%;\r\n background-color: var(--bp-color-primary);\r\n border-radius: var(--bp-border-radius-full);\r\n transition:\r\n width var(--bp-duration-instant),\r\n background-color var(--bp-transition-fast);\r\n }\r\n\r\n .slider__thumb {\r\n position: absolute;\r\n background-color: var(--bp-color-surface-elevated);\r\n border: var(--bp-border-width) solid var(--bp-color-primary);\r\n border-radius: var(--bp-border-radius-full);\r\n box-shadow:\r\n 0 1px 3px oklch(0 0 0 / 0.2),\r\n 0 1px 2px oklch(0 0 0 / 0.1);\r\n top: 50%;\r\n transform: translate(-50%, -50%);\r\n cursor: grab;\r\n transition:\r\n box-shadow var(--bp-transition-fast),\r\n transform var(--bp-transition-fast),\r\n border-color var(--bp-transition-fast);\r\n }\r\n\r\n .slider__thumb:focus {\r\n outline: none;\r\n box-shadow: 0 0 0 var(--bp-focus-width) var(--bp-color-focus);\r\n }\r\n\r\n .slider__thumb:focus-visible {\r\n outline: none;\r\n box-shadow: 0 0 0 var(--bp-focus-width) var(--bp-color-focus);\r\n }\r\n\r\n .slider__ticks {\r\n position: absolute;\r\n top: 100%;\r\n left: 0;\r\n right: 0;\r\n height: var(--bp-spacing-xs);\r\n pointer-events: none;\r\n }\r\n\r\n .slider__tick {\r\n position: absolute;\r\n top: var(--bp-spacing-xs);\r\n width: var(--bp-spacing-0-5);\r\n height: var(--bp-spacing-xs);\r\n background-color: var(--bp-color-border-strong);\r\n transform: translateX(-50%);\r\n }\r\n\r\n /* Size variants */\r\n .slider--sm .slider__track {\r\n height: var(--bp-spacing-1);\r\n }\r\n\r\n .slider--sm .slider__thumb {\r\n width: var(--bp-spacing-3);\r\n height: var(--bp-spacing-3);\r\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.1);\r\n }\r\n\r\n .slider--md .slider__track {\r\n height: var(--bp-spacing-1-5);\r\n }\r\n\r\n .slider--md .slider__thumb {\r\n width: var(--bp-spacing-4);\r\n height: var(--bp-spacing-4);\r\n }\r\n\r\n .slider--lg .slider__track {\r\n height: var(--bp-spacing-2);\r\n }\r\n\r\n .slider--lg .slider__thumb {\r\n width: var(--bp-spacing-5);\r\n height: var(--bp-spacing-5);\r\n box-shadow: var(--bp-shadow-md);\r\n }\r\n\r\n /* States */\r\n .slider__container:hover .slider__thumb {\r\n border-color: var(--bp-color-primary-hover);\r\n transform: translate(-50%, -50%) scale(1.1);\r\n }\r\n\r\n .slider__container:hover .slider__fill {\r\n background-color: var(--bp-color-primary-hover);\r\n }\r\n\r\n .slider__container:hover .slider__track {\r\n background-color: color-mix(\r\n in srgb,\r\n var(--bp-color-border) 90%,\r\n var(--bp-color-primary) 10%\r\n );\r\n }\r\n\r\n .slider--dragging .slider__thumb {\r\n cursor: grabbing;\r\n border-color: var(--bp-color-primary-active);\r\n box-shadow: var(--bp-shadow-md);\r\n transform: translate(-50%, -50%) scale(1.15);\r\n }\r\n\r\n .slider--dragging .slider__fill {\r\n background-color: var(--bp-color-primary-active);\r\n transition: none;\r\n }\r\n\r\n .slider--dragging .slider__track {\r\n background-color: color-mix(\r\n in srgb,\r\n var(--bp-color-border) 85%,\r\n var(--bp-color-primary) 15%\r\n );\r\n }\r\n\r\n .slider--disabled {\r\n pointer-events: none;\r\n }\r\n\r\n .slider--disabled .slider__track {\r\n background-color: var(--bp-color-surface-subdued);\r\n }\r\n\r\n .slider--disabled .slider__fill {\r\n background-color: var(--bp-color-border);\r\n }\r\n\r\n .slider--disabled .slider__thumb {\r\n background-color: var(--bp-color-surface-subdued);\r\n border-color: var(--bp-color-border);\r\n cursor: not-allowed;\r\n box-shadow: none;\r\n }\r\n\r\n .slider--disabled .slider__label,\r\n .slider--disabled .slider__value {\r\n color: var(--bp-color-text-muted);\r\n opacity: var(--bp-opacity-disabled);\r\n }\r\n`;\r\n","/**\r\n * Throttle utility for rate-limiting function calls.\r\n * When limit <= 16ms, uses requestAnimationFrame for frame-aligned throttling.\r\n * Otherwise uses Date.now() comparison.\r\n */\r\n\r\ntype ThrottledFunction<T extends (...args: never[]) => unknown> = {\r\n (...args: Parameters<T>): void;\r\n cancel: () => void;\r\n};\r\n\r\nexport function throttle<T extends (...args: never[]) => unknown>(\r\n fn: T,\r\n limit: number\r\n): ThrottledFunction<T> {\r\n const useRAF = limit <= 16;\r\n let lastArgs: Parameters<T> | null = null;\r\n let rafId: number | null = null;\r\n let timeoutId: ReturnType<typeof setTimeout> | null = null;\r\n let waiting = false;\r\n\r\n const throttled = (...args: Parameters<T>): void => {\r\n if (useRAF) {\r\n lastArgs = args;\r\n if (rafId === null) {\r\n // First call: execute immediately\r\n fn(...args);\r\n lastArgs = null;\r\n rafId = requestAnimationFrame(() => {\r\n rafId = null;\r\n if (lastArgs !== null) {\r\n fn(...lastArgs);\r\n lastArgs = null;\r\n }\r\n });\r\n }\r\n } else {\r\n if (!waiting) {\r\n // First call or enough time has elapsed\r\n fn(...args);\r\n waiting = true;\r\n lastArgs = null;\r\n\r\n const scheduleNext = () => {\r\n timeoutId = setTimeout(() => {\r\n timeoutId = null;\r\n if (lastArgs !== null) {\r\n fn(...lastArgs);\r\n lastArgs = null;\r\n scheduleNext();\r\n } else {\r\n waiting = false;\r\n }\r\n }, limit);\r\n };\r\n scheduleNext();\r\n } else {\r\n lastArgs = args;\r\n }\r\n }\r\n };\r\n\r\n throttled.cancel = () => {\r\n if (rafId !== null) {\r\n cancelAnimationFrame(rafId);\r\n rafId = null;\r\n }\r\n if (timeoutId !== null) {\r\n clearTimeout(timeoutId);\r\n timeoutId = null;\r\n }\r\n lastArgs = null;\r\n waiting = false;\r\n };\r\n\r\n return throttled;\r\n}\r\n","import { LitElement, html, nothing } from 'lit';\r\nimport { customElement, property, state, query } from 'lit/decorators.js';\r\nimport { classMap } from 'lit/directives/class-map.js';\r\nimport { repeat } from 'lit/directives/repeat.js';\r\nimport { sliderStyles } from './slider.style.js';\r\nimport { throttle } from '../../utilities/throttle.js';\r\n\r\n/**\r\n * Size variants for the slider\r\n */\r\nexport type SliderSize = 'sm' | 'md' | 'lg';\r\n\r\n/**\r\n * A slider component for selecting numeric values within a range.\r\n *\r\n * @element bp-slider\r\n *\r\n * @fires bp-input - Fired continuously while dragging\r\n * @fires bp-change - Fired when the value changes (after interaction ends)\r\n *\r\n * @csspart track - The slider track element\r\n * @csspart fill - The filled portion of the track\r\n * @csspart thumb - The draggable thumb element\r\n * @csspart label - The label element\r\n * @csspart value-display - The current value display\r\n */\r\n@customElement('bp-slider')\r\nexport class BpSlider extends LitElement {\r\n /**\r\n * Current value of the slider\r\n */\r\n @property({ type: Number }) declare value: number;\r\n\r\n /**\r\n * Minimum value\r\n */\r\n @property({ type: Number }) declare min: number;\r\n\r\n /**\r\n * Maximum value\r\n */\r\n @property({ type: Number }) declare max: number;\r\n\r\n /**\r\n * Step increment\r\n */\r\n @property({ type: Number }) declare step: number;\r\n\r\n /**\r\n * Name attribute for form association\r\n */\r\n @property({ type: String }) declare name: string;\r\n\r\n /**\r\n * Label text for the slider\r\n */\r\n @property({ type: String }) declare label: string;\r\n\r\n /**\r\n * Whether the slider is disabled\r\n */\r\n @property({ type: Boolean, reflect: true }) declare disabled: boolean;\r\n\r\n /**\r\n * Size variant\r\n */\r\n @property({ type: String }) declare size: SliderSize;\r\n\r\n /**\r\n * Whether to show the current value\r\n */\r\n @property({ type: Boolean, attribute: 'show-value' })\r\n declare showValue: boolean;\r\n\r\n /**\r\n * Whether to show tick marks at step intervals\r\n */\r\n @property({ type: Boolean, attribute: 'show-ticks' })\r\n declare showTicks: boolean;\r\n\r\n /**\r\n * Format function for displaying the value\r\n */\r\n @property({ attribute: false }) declare formatValue: (\r\n value: number\r\n ) => string;\r\n\r\n /**\r\n * Whether the thumb is currently being dragged\r\n */\r\n @state() private isDragging = false;\r\n\r\n @query('.slider__track') private trackElement!: HTMLElement;\r\n\r\n /** Cached track bounding rect during drag to avoid repeated layout queries */\r\n private cachedTrackRect: DOMRect | null = null;\r\n\r\n /** Throttled position update for frame-aligned drag handling */\r\n private throttledUpdatePosition = throttle((clientX: number) => {\r\n this.updateValueFromPosition(clientX);\r\n }, 16);\r\n\r\n static styles = [sliderStyles];\r\n\r\n constructor() {\r\n super();\r\n this.value = 0;\r\n this.min = 0;\r\n this.max = 100;\r\n this.step = 1;\r\n this.name = '';\r\n this.label = '';\r\n this.disabled = false;\r\n this.size = 'md';\r\n this.showValue = false;\r\n this.showTicks = false;\r\n this.formatValue = (value: number) => String(value);\r\n }\r\n\r\n disconnectedCallback() {\r\n super.disconnectedCallback();\r\n this.throttledUpdatePosition.cancel();\r\n this.cachedTrackRect = null;\r\n }\r\n\r\n /**\r\n * Calculate the percentage position of the current value\r\n */\r\n private get percentage(): number {\r\n const range = this.max - this.min;\r\n if (range === 0) return 0;\r\n return ((this.value - this.min) / range) * 100;\r\n }\r\n\r\n /**\r\n * Get tick positions based on step\r\n */\r\n private get tickPositions(): number[] {\r\n if (!this.showTicks) return [];\r\n const ticks: number[] = [];\r\n const range = this.max - this.min;\r\n const numTicks = Math.floor(range / this.step);\r\n\r\n // Limit to reasonable number of ticks\r\n if (numTicks > 20) return [];\r\n\r\n for (let i = 0; i <= numTicks; i++) {\r\n ticks.push(((i * this.step) / range) * 100);\r\n }\r\n return ticks;\r\n }\r\n\r\n /**\r\n * Clamp value to min/max and round to step.\r\n * Uses decimal-aware rounding to avoid floating-point artifacts\r\n * (e.g. 0.6900000000000001 instead of 0.69).\r\n */\r\n private clampValue(rawValue: number): number {\r\n // Determine the number of decimal places in the step value\r\n const stepString = String(this.step);\r\n const decimalPlaces = stepString.includes('.')\r\n ? stepString.split('.')[1].length\r\n : 0;\r\n\r\n // Round to nearest step\r\n const steppedValue =\r\n Math.round((rawValue - this.min) / this.step) * this.step + this.min;\r\n\r\n // Round to step precision to eliminate floating-point errors\r\n const preciseValue = parseFloat(steppedValue.toFixed(decimalPlaces));\r\n\r\n // Clamp to range\r\n return Math.max(this.min, Math.min(this.max, preciseValue));\r\n }\r\n\r\n /**\r\n * Update value from a position on the track.\r\n * Uses cached bounding rect during drag for performance.\r\n */\r\n private updateValueFromPosition(clientX: number): void {\r\n if (!this.trackElement || this.disabled) return;\r\n\r\n const rect =\r\n this.cachedTrackRect || this.trackElement.getBoundingClientRect();\r\n const percentage = Math.max(\r\n 0,\r\n Math.min(1, (clientX - rect.left) / rect.width)\r\n );\r\n const rawValue = this.min + percentage * (this.max - this.min);\r\n const newValue = this.clampValue(rawValue);\r\n\r\n if (newValue !== this.value) {\r\n this.value = newValue;\r\n this.dispatchEvent(\r\n new CustomEvent('bp-input', {\r\n detail: { value: this.value },\r\n bubbles: true,\r\n composed: true,\r\n })\r\n );\r\n }\r\n }\r\n\r\n /**\r\n * Handle mouse down on track or thumb\r\n */\r\n private handleMouseDown(event: MouseEvent): void {\r\n if (this.disabled) return;\r\n event.preventDefault();\r\n\r\n this.isDragging = true;\r\n // Cache the track rect at drag start to avoid repeated layout queries\r\n this.cachedTrackRect = this.trackElement?.getBoundingClientRect() ?? null;\r\n this.updateValueFromPosition(event.clientX);\r\n\r\n const handleMouseMove = (moveEvent: MouseEvent) => {\r\n this.throttledUpdatePosition(moveEvent.clientX);\r\n };\r\n\r\n const handleMouseUp = () => {\r\n this.throttledUpdatePosition.cancel();\r\n this.cachedTrackRect = null;\r\n this.isDragging = false;\r\n document.removeEventListener('mousemove', handleMouseMove);\r\n document.removeEventListener('mouseup', handleMouseUp);\r\n this.dispatchEvent(\r\n new CustomEvent('bp-change', {\r\n detail: { value: this.value },\r\n bubbles: true,\r\n composed: true,\r\n })\r\n );\r\n };\r\n\r\n document.addEventListener('mousemove', handleMouseMove);\r\n document.addEventListener('mouseup', handleMouseUp);\r\n }\r\n\r\n /**\r\n * Handle touch start on track or thumb\r\n */\r\n private handleTouchStart(event: globalThis.TouchEvent): void {\r\n if (this.disabled) return;\r\n event.preventDefault();\r\n\r\n this.isDragging = true;\r\n // Cache the track rect at drag start to avoid repeated layout queries\r\n this.cachedTrackRect = this.trackElement?.getBoundingClientRect() ?? null;\r\n const touch = event.touches[0];\r\n this.updateValueFromPosition(touch.clientX);\r\n\r\n const handleTouchMove = (moveEvent: globalThis.TouchEvent) => {\r\n const moveTouch = moveEvent.touches[0];\r\n this.throttledUpdatePosition(moveTouch.clientX);\r\n };\r\n\r\n const handleTouchEnd = () => {\r\n this.throttledUpdatePosition.cancel();\r\n this.cachedTrackRect = null;\r\n this.isDragging = false;\r\n document.removeEventListener('touchmove', handleTouchMove);\r\n document.removeEventListener('touchend', handleTouchEnd);\r\n this.dispatchEvent(\r\n new CustomEvent('bp-change', {\r\n detail: { value: this.value },\r\n bubbles: true,\r\n composed: true,\r\n })\r\n );\r\n };\r\n\r\n document.addEventListener('touchmove', handleTouchMove);\r\n document.addEventListener('touchend', handleTouchEnd);\r\n }\r\n\r\n /**\r\n * Handle keyboard navigation\r\n */\r\n private handleKeyDown(event: globalThis.KeyboardEvent): void {\r\n if (this.disabled) return;\r\n\r\n let newValue = this.value;\r\n const largeStep = this.step * 10;\r\n\r\n switch (event.key) {\r\n case 'ArrowRight':\r\n case 'ArrowUp':\r\n newValue = this.clampValue(this.value + this.step);\r\n break;\r\n case 'ArrowLeft':\r\n case 'ArrowDown':\r\n newValue = this.clampValue(this.value - this.step);\r\n break;\r\n case 'PageUp':\r\n newValue = this.clampValue(this.value + largeStep);\r\n break;\r\n case 'PageDown':\r\n newValue = this.clampValue(this.value - largeStep);\r\n break;\r\n case 'Home':\r\n newValue = this.min;\r\n break;\r\n case 'End':\r\n newValue = this.max;\r\n break;\r\n default:\r\n return;\r\n }\r\n\r\n event.preventDefault();\r\n if (newValue !== this.value) {\r\n this.value = newValue;\r\n this.dispatchEvent(\r\n new CustomEvent('bp-input', {\r\n detail: { value: this.value },\r\n bubbles: true,\r\n composed: true,\r\n })\r\n );\r\n this.dispatchEvent(\r\n new CustomEvent('bp-change', {\r\n detail: { value: this.value },\r\n bubbles: true,\r\n composed: true,\r\n })\r\n );\r\n }\r\n }\r\n\r\n render() {\r\n const wrapperClasses = {\r\n slider: true,\r\n [`slider--${this.size}`]: true,\r\n 'slider--disabled': this.disabled,\r\n 'slider--dragging': this.isDragging,\r\n };\r\n\r\n return html`\r\n <div class=${classMap(wrapperClasses)}>\r\n ${this.label || this.showValue\r\n ? html`\r\n <div class=\"slider__header\">\r\n ${this.label\r\n ? html`<label class=\"slider__label\" part=\"label\"\r\n >${this.label}</label\r\n >`\r\n : nothing}\r\n ${this.showValue\r\n ? html`<span class=\"slider__value\" part=\"value-display\"\r\n >${this.formatValue(this.value)}</span\r\n >`\r\n : nothing}\r\n </div>\r\n `\r\n : nothing}\r\n <div\r\n class=\"slider__container\"\r\n @mousedown=${this.handleMouseDown}\r\n @touchstart=${this.handleTouchStart}\r\n >\r\n <div class=\"slider__track\" part=\"track\">\r\n <div\r\n class=\"slider__fill\"\r\n part=\"fill\"\r\n style=\"width: ${this.percentage}%\"\r\n ></div>\r\n ${this.showTicks\r\n ? html`\r\n <div class=\"slider__ticks\">\r\n ${repeat(\r\n this.tickPositions,\r\n (pos) => pos,\r\n (pos) =>\r\n html`<div\r\n class=\"slider__tick\"\r\n style=\"left: ${pos}%\"\r\n ></div>`\r\n )}\r\n </div>\r\n `\r\n : nothing}\r\n </div>\r\n <div\r\n class=\"slider__thumb\"\r\n part=\"thumb\"\r\n role=\"slider\"\r\n tabindex=${this.disabled ? -1 : 0}\r\n aria-label=${this.label || 'Slider'}\r\n aria-valuemin=${this.min}\r\n aria-valuemax=${this.max}\r\n aria-valuenow=${this.value}\r\n aria-valuetext=${this.formatValue(this.value)}\r\n aria-disabled=${this.disabled}\r\n style=\"left: ${this.percentage}%\"\r\n @keydown=${this.handleKeyDown}\r\n ></div>\r\n </div>\r\n ${this.name\r\n ? html`<input\r\n type=\"hidden\"\r\n name=${this.name}\r\n .value=${String(this.value)}\r\n />`\r\n : nothing}\r\n </div>\r\n `;\r\n }\r\n}\r\n\r\ndeclare global {\r\n interface HTMLElementTagNameMap {\r\n 'bp-slider': BpSlider;\r\n }\r\n}\r\n"],"names":["sliderStyles","css","throttle","fn","limit","useRAF","lastArgs","rafId","timeoutId","waiting","throttled","args","scheduleNext","BpSlider","LitElement","clientX","value","range","ticks","numTicks","rawValue","stepString","decimalPlaces","steppedValue","preciseValue","rect","percentage","newValue","event","handleMouseMove","moveEvent","handleMouseUp","touch","handleTouchMove","moveTouch","handleTouchEnd","largeStep","wrapperClasses","html","classMap","nothing","repeat","pos","__decorateClass","property","state","query","customElement"],"mappings":"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"}