@duskmoon-dev/el-slider 0.4.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.
- package/dist/cjs/index.js +377 -0
- package/dist/cjs/index.js.map +11 -0
- package/dist/cjs/register.js +380 -0
- package/dist/cjs/register.js.map +12 -0
- package/dist/esm/index.js +345 -0
- package/dist/esm/index.js.map +11 -0
- package/dist/esm/register.js +344 -0
- package/dist/esm/register.js.map +12 -0
- package/dist/tsconfig.tsbuildinfo +1 -0
- package/dist/types/el-dm-slider.d.ts +89 -0
- package/dist/types/el-dm-slider.d.ts.map +1 -0
- package/dist/types/index.d.ts +19 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/register.d.ts +2 -0
- package/dist/types/register.d.ts.map +1 -0
- package/package.json +57 -0
|
@@ -0,0 +1,377 @@
|
|
|
1
|
+
var __defProp = Object.defineProperty;
|
|
2
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
5
|
+
var __moduleCache = /* @__PURE__ */ new WeakMap;
|
|
6
|
+
var __toCommonJS = (from) => {
|
|
7
|
+
var entry = __moduleCache.get(from), desc;
|
|
8
|
+
if (entry)
|
|
9
|
+
return entry;
|
|
10
|
+
entry = __defProp({}, "__esModule", { value: true });
|
|
11
|
+
if (from && typeof from === "object" || typeof from === "function")
|
|
12
|
+
__getOwnPropNames(from).map((key) => !__hasOwnProp.call(entry, key) && __defProp(entry, key, {
|
|
13
|
+
get: () => from[key],
|
|
14
|
+
enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable
|
|
15
|
+
}));
|
|
16
|
+
__moduleCache.set(from, entry);
|
|
17
|
+
return entry;
|
|
18
|
+
};
|
|
19
|
+
var __export = (target, all) => {
|
|
20
|
+
for (var name in all)
|
|
21
|
+
__defProp(target, name, {
|
|
22
|
+
get: all[name],
|
|
23
|
+
enumerable: true,
|
|
24
|
+
configurable: true,
|
|
25
|
+
set: (newValue) => all[name] = () => newValue
|
|
26
|
+
});
|
|
27
|
+
};
|
|
28
|
+
|
|
29
|
+
// src/index.ts
|
|
30
|
+
var exports_src = {};
|
|
31
|
+
__export(exports_src, {
|
|
32
|
+
register: () => register,
|
|
33
|
+
ElDmSlider: () => ElDmSlider
|
|
34
|
+
});
|
|
35
|
+
module.exports = __toCommonJS(exports_src);
|
|
36
|
+
|
|
37
|
+
// src/el-dm-slider.ts
|
|
38
|
+
var import_el_core = require("@duskmoon-dev/el-core");
|
|
39
|
+
var import_slider = require("@duskmoon-dev/core/components/slider");
|
|
40
|
+
var SIZE_CLASSES = {
|
|
41
|
+
sm: "slider-sm",
|
|
42
|
+
md: "",
|
|
43
|
+
lg: "slider-lg"
|
|
44
|
+
};
|
|
45
|
+
var COLOR_CLASSES = {
|
|
46
|
+
primary: "",
|
|
47
|
+
secondary: "slider-secondary",
|
|
48
|
+
tertiary: "slider-tertiary",
|
|
49
|
+
success: "slider-success",
|
|
50
|
+
warning: "slider-warning",
|
|
51
|
+
error: "slider-error"
|
|
52
|
+
};
|
|
53
|
+
var coreStyles = import_slider.css.replace(/@layer\s+components\s*\{/, "").replace(/\}\s*$/, "");
|
|
54
|
+
var styles = import_el_core.css`
|
|
55
|
+
:host {
|
|
56
|
+
display: block;
|
|
57
|
+
width: 100%;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
:host([hidden]) {
|
|
61
|
+
display: none !important;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
${coreStyles}
|
|
65
|
+
|
|
66
|
+
/* Web component specific adjustments */
|
|
67
|
+
.slider {
|
|
68
|
+
font-family: inherit;
|
|
69
|
+
position: relative;
|
|
70
|
+
display: flex;
|
|
71
|
+
align-items: center;
|
|
72
|
+
width: 100%;
|
|
73
|
+
height: 2.5rem;
|
|
74
|
+
touch-action: none;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
.slider-track {
|
|
78
|
+
position: relative;
|
|
79
|
+
flex: 1;
|
|
80
|
+
height: 0.375rem;
|
|
81
|
+
background-color: var(--color-surface-container-high, #e0e0e0);
|
|
82
|
+
border-radius: 0.1875rem;
|
|
83
|
+
cursor: pointer;
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
.slider-track-filled {
|
|
87
|
+
position: absolute;
|
|
88
|
+
top: 0;
|
|
89
|
+
left: 0;
|
|
90
|
+
height: 100%;
|
|
91
|
+
background-color: var(--color-primary);
|
|
92
|
+
border-radius: 0.1875rem;
|
|
93
|
+
transition: width 0.1s ease;
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
.slider-thumb {
|
|
97
|
+
position: absolute;
|
|
98
|
+
top: 50%;
|
|
99
|
+
width: 1.25rem;
|
|
100
|
+
height: 1.25rem;
|
|
101
|
+
background-color: var(--color-primary);
|
|
102
|
+
border-radius: 50%;
|
|
103
|
+
transform: translate(-50%, -50%);
|
|
104
|
+
cursor: grab;
|
|
105
|
+
transition: box-shadow 0.15s ease;
|
|
106
|
+
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.2);
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
.slider-thumb:hover {
|
|
110
|
+
box-shadow: 0 0 0 8px rgba(var(--color-primary-rgb, 98, 0, 238), 0.1);
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
.slider-thumb:active {
|
|
114
|
+
cursor: grabbing;
|
|
115
|
+
box-shadow: 0 0 0 12px rgba(var(--color-primary-rgb, 98, 0, 238), 0.2);
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
.slider-thumb-label {
|
|
119
|
+
position: absolute;
|
|
120
|
+
bottom: calc(100% + 8px);
|
|
121
|
+
left: 50%;
|
|
122
|
+
transform: translateX(-50%);
|
|
123
|
+
padding: 0.25rem 0.5rem;
|
|
124
|
+
font-size: 0.75rem;
|
|
125
|
+
font-weight: 500;
|
|
126
|
+
color: var(--color-on-primary);
|
|
127
|
+
background-color: var(--color-primary);
|
|
128
|
+
border-radius: 0.25rem;
|
|
129
|
+
white-space: nowrap;
|
|
130
|
+
opacity: 0;
|
|
131
|
+
transition: opacity 0.15s ease;
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
.slider-thumb:hover .slider-thumb-label,
|
|
135
|
+
.slider-thumb:active .slider-thumb-label,
|
|
136
|
+
.slider.show-value .slider-thumb-label {
|
|
137
|
+
opacity: 1;
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
/* Size variants */
|
|
141
|
+
.slider-sm .slider-track {
|
|
142
|
+
height: 0.25rem;
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
.slider-sm .slider-thumb {
|
|
146
|
+
width: 1rem;
|
|
147
|
+
height: 1rem;
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
.slider-lg .slider-track {
|
|
151
|
+
height: 0.5rem;
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
.slider-lg .slider-thumb {
|
|
155
|
+
width: 1.5rem;
|
|
156
|
+
height: 1.5rem;
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
/* Color variants */
|
|
160
|
+
.slider-secondary .slider-track-filled,
|
|
161
|
+
.slider-secondary .slider-thumb {
|
|
162
|
+
background-color: var(--color-secondary);
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
.slider-tertiary .slider-track-filled,
|
|
166
|
+
.slider-tertiary .slider-thumb {
|
|
167
|
+
background-color: var(--color-tertiary);
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
.slider-success .slider-track-filled,
|
|
171
|
+
.slider-success .slider-thumb {
|
|
172
|
+
background-color: var(--color-success);
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
.slider-warning .slider-track-filled,
|
|
176
|
+
.slider-warning .slider-thumb {
|
|
177
|
+
background-color: var(--color-warning);
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
.slider-error .slider-track-filled,
|
|
181
|
+
.slider-error .slider-thumb {
|
|
182
|
+
background-color: var(--color-error);
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
/* Disabled state */
|
|
186
|
+
:host([disabled]) .slider {
|
|
187
|
+
opacity: 0.5;
|
|
188
|
+
pointer-events: none;
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
:host([disabled]) .slider-thumb {
|
|
192
|
+
cursor: not-allowed;
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
/* Labels container */
|
|
196
|
+
.slider-labels {
|
|
197
|
+
display: flex;
|
|
198
|
+
justify-content: space-between;
|
|
199
|
+
margin-top: 0.25rem;
|
|
200
|
+
font-size: 0.75rem;
|
|
201
|
+
color: var(--color-on-surface);
|
|
202
|
+
opacity: 0.7;
|
|
203
|
+
}
|
|
204
|
+
`;
|
|
205
|
+
|
|
206
|
+
class ElDmSlider extends import_el_core.BaseElement {
|
|
207
|
+
static properties = {
|
|
208
|
+
value: { type: Number, reflect: true, default: 0 },
|
|
209
|
+
min: { type: Number, reflect: true, default: 0 },
|
|
210
|
+
max: { type: Number, reflect: true, default: 100 },
|
|
211
|
+
step: { type: Number, reflect: true, default: 1 },
|
|
212
|
+
disabled: { type: Boolean, reflect: true },
|
|
213
|
+
size: { type: String, reflect: true },
|
|
214
|
+
color: { type: String, reflect: true, default: "primary" },
|
|
215
|
+
showValue: {
|
|
216
|
+
type: Boolean,
|
|
217
|
+
reflect: true,
|
|
218
|
+
attribute: "show-value"
|
|
219
|
+
}
|
|
220
|
+
};
|
|
221
|
+
_isDragging = false;
|
|
222
|
+
constructor() {
|
|
223
|
+
super();
|
|
224
|
+
this.attachStyles(styles);
|
|
225
|
+
}
|
|
226
|
+
_getClasses() {
|
|
227
|
+
const classes = ["slider"];
|
|
228
|
+
if (this.size && SIZE_CLASSES[this.size]) {
|
|
229
|
+
classes.push(SIZE_CLASSES[this.size]);
|
|
230
|
+
}
|
|
231
|
+
if (this.color && COLOR_CLASSES[this.color]) {
|
|
232
|
+
classes.push(COLOR_CLASSES[this.color]);
|
|
233
|
+
}
|
|
234
|
+
if (this.showValue) {
|
|
235
|
+
classes.push("show-value");
|
|
236
|
+
}
|
|
237
|
+
return classes.join(" ");
|
|
238
|
+
}
|
|
239
|
+
_getPercentage() {
|
|
240
|
+
const range = this.max - this.min;
|
|
241
|
+
if (range === 0)
|
|
242
|
+
return 0;
|
|
243
|
+
return (this.value - this.min) / range * 100;
|
|
244
|
+
}
|
|
245
|
+
_valueFromPosition(clientX) {
|
|
246
|
+
const track = this.shadowRoot?.querySelector(".slider-track");
|
|
247
|
+
if (!track)
|
|
248
|
+
return this.value;
|
|
249
|
+
const rect = track.getBoundingClientRect();
|
|
250
|
+
const percentage = Math.max(0, Math.min(1, (clientX - rect.left) / rect.width));
|
|
251
|
+
const rawValue = this.min + percentage * (this.max - this.min);
|
|
252
|
+
const steppedValue = Math.round(rawValue / this.step) * this.step;
|
|
253
|
+
return Math.max(this.min, Math.min(this.max, steppedValue));
|
|
254
|
+
}
|
|
255
|
+
_handleTrackClick(e) {
|
|
256
|
+
if (this.disabled)
|
|
257
|
+
return;
|
|
258
|
+
const newValue = this._valueFromPosition(e.clientX);
|
|
259
|
+
if (newValue !== this.value) {
|
|
260
|
+
this.value = newValue;
|
|
261
|
+
this._updateUI();
|
|
262
|
+
this.emit("input", { value: this.value });
|
|
263
|
+
this.emit("change", { value: this.value });
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
_handleThumbMouseDown(e) {
|
|
267
|
+
if (this.disabled)
|
|
268
|
+
return;
|
|
269
|
+
e.preventDefault();
|
|
270
|
+
this._isDragging = true;
|
|
271
|
+
const handleMouseMove = (moveEvent) => {
|
|
272
|
+
const newValue = this._valueFromPosition(moveEvent.clientX);
|
|
273
|
+
if (newValue !== this.value) {
|
|
274
|
+
this.value = newValue;
|
|
275
|
+
this._updateUI();
|
|
276
|
+
this.emit("input", { value: this.value });
|
|
277
|
+
}
|
|
278
|
+
};
|
|
279
|
+
const handleMouseUp = () => {
|
|
280
|
+
this._isDragging = false;
|
|
281
|
+
document.removeEventListener("mousemove", handleMouseMove);
|
|
282
|
+
document.removeEventListener("mouseup", handleMouseUp);
|
|
283
|
+
this.emit("change", { value: this.value });
|
|
284
|
+
};
|
|
285
|
+
document.addEventListener("mousemove", handleMouseMove);
|
|
286
|
+
document.addEventListener("mouseup", handleMouseUp);
|
|
287
|
+
}
|
|
288
|
+
_handleKeyDown(e) {
|
|
289
|
+
if (this.disabled)
|
|
290
|
+
return;
|
|
291
|
+
let newValue = this.value;
|
|
292
|
+
const bigStep = (this.max - this.min) / 10;
|
|
293
|
+
switch (e.key) {
|
|
294
|
+
case "ArrowRight":
|
|
295
|
+
case "ArrowUp":
|
|
296
|
+
newValue = Math.min(this.max, this.value + this.step);
|
|
297
|
+
break;
|
|
298
|
+
case "ArrowLeft":
|
|
299
|
+
case "ArrowDown":
|
|
300
|
+
newValue = Math.max(this.min, this.value - this.step);
|
|
301
|
+
break;
|
|
302
|
+
case "PageUp":
|
|
303
|
+
newValue = Math.min(this.max, this.value + bigStep);
|
|
304
|
+
break;
|
|
305
|
+
case "PageDown":
|
|
306
|
+
newValue = Math.max(this.min, this.value - bigStep);
|
|
307
|
+
break;
|
|
308
|
+
case "Home":
|
|
309
|
+
newValue = this.min;
|
|
310
|
+
break;
|
|
311
|
+
case "End":
|
|
312
|
+
newValue = this.max;
|
|
313
|
+
break;
|
|
314
|
+
default:
|
|
315
|
+
return;
|
|
316
|
+
}
|
|
317
|
+
e.preventDefault();
|
|
318
|
+
if (newValue !== this.value) {
|
|
319
|
+
this.value = newValue;
|
|
320
|
+
this._updateUI();
|
|
321
|
+
this.emit("input", { value: this.value });
|
|
322
|
+
this.emit("change", { value: this.value });
|
|
323
|
+
}
|
|
324
|
+
}
|
|
325
|
+
_updateUI() {
|
|
326
|
+
const percentage = this._getPercentage();
|
|
327
|
+
const filled = this.shadowRoot?.querySelector(".slider-track-filled");
|
|
328
|
+
const thumb = this.shadowRoot?.querySelector(".slider-thumb");
|
|
329
|
+
const label = this.shadowRoot?.querySelector(".slider-thumb-label");
|
|
330
|
+
if (filled) {
|
|
331
|
+
filled.style.width = `${percentage}%`;
|
|
332
|
+
}
|
|
333
|
+
if (thumb) {
|
|
334
|
+
thumb.style.left = `${percentage}%`;
|
|
335
|
+
}
|
|
336
|
+
if (label) {
|
|
337
|
+
label.textContent = String(this.value);
|
|
338
|
+
}
|
|
339
|
+
}
|
|
340
|
+
render() {
|
|
341
|
+
const classes = this._getClasses();
|
|
342
|
+
const percentage = this._getPercentage();
|
|
343
|
+
return `
|
|
344
|
+
<div class="${classes}" part="slider" role="slider"
|
|
345
|
+
aria-valuemin="${this.min}"
|
|
346
|
+
aria-valuemax="${this.max}"
|
|
347
|
+
aria-valuenow="${this.value}"
|
|
348
|
+
tabindex="${this.disabled ? -1 : 0}">
|
|
349
|
+
<div class="slider-track" part="track">
|
|
350
|
+
<div class="slider-track-filled" style="width: ${percentage}%"></div>
|
|
351
|
+
<div class="slider-thumb" part="thumb" style="left: ${percentage}%">
|
|
352
|
+
<span class="slider-thumb-label">${this.value}</span>
|
|
353
|
+
</div>
|
|
354
|
+
</div>
|
|
355
|
+
</div>
|
|
356
|
+
`;
|
|
357
|
+
}
|
|
358
|
+
update() {
|
|
359
|
+
super.update();
|
|
360
|
+
const track = this.shadowRoot?.querySelector(".slider-track");
|
|
361
|
+
const thumb = this.shadowRoot?.querySelector(".slider-thumb");
|
|
362
|
+
const slider = this.shadowRoot?.querySelector(".slider");
|
|
363
|
+
track?.addEventListener("click", (e) => this._handleTrackClick(e));
|
|
364
|
+
thumb?.addEventListener("mousedown", (e) => this._handleThumbMouseDown(e));
|
|
365
|
+
slider?.addEventListener("keydown", (e) => this._handleKeyDown(e));
|
|
366
|
+
}
|
|
367
|
+
}
|
|
368
|
+
|
|
369
|
+
// src/index.ts
|
|
370
|
+
function register() {
|
|
371
|
+
if (!customElements.get("el-dm-slider")) {
|
|
372
|
+
customElements.define("el-dm-slider", ElDmSlider);
|
|
373
|
+
}
|
|
374
|
+
}
|
|
375
|
+
|
|
376
|
+
//# debugId=BF9B2E1BF7539B1564756E2164756E21
|
|
377
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/el-dm-slider.ts", "../../src/index.ts"],
|
|
4
|
+
"sourcesContent": [
|
|
5
|
+
"/**\n * DuskMoon Slider Element\n *\n * A range slider component for selecting numeric values.\n * Uses styles from @duskmoon-dev/core for consistent theming.\n *\n * @element el-dm-slider\n *\n * @attr {number} value - Current slider value\n * @attr {number} min - Minimum value\n * @attr {number} max - Maximum value\n * @attr {number} step - Step increment\n * @attr {boolean} disabled - Whether the slider is disabled\n * @attr {string} size - Size: sm, md, lg\n * @attr {string} color - Color: primary, secondary, tertiary\n * @attr {boolean} show-value - Show current value label\n *\n * @csspart slider - The slider container\n * @csspart track - The slider track\n * @csspart thumb - The slider thumb\n *\n * @fires change - Fired when value changes (on release)\n * @fires input - Fired during drag\n */\n\nimport { BaseElement, css } from '@duskmoon-dev/el-core';\nimport { css as sliderCSS } from '@duskmoon-dev/core/components/slider';\n\nexport type SliderSize = 'sm' | 'md' | 'lg';\nexport type SliderColor = 'primary' | 'secondary' | 'tertiary' | 'success' | 'warning' | 'error';\n\nconst SIZE_CLASSES: Record<string, string> = {\n sm: 'slider-sm',\n md: '',\n lg: 'slider-lg',\n};\n\nconst COLOR_CLASSES: Record<string, string> = {\n primary: '',\n secondary: 'slider-secondary',\n tertiary: 'slider-tertiary',\n success: 'slider-success',\n warning: 'slider-warning',\n error: 'slider-error',\n};\n\n// Strip @layer wrapper for Shadow DOM compatibility\nconst coreStyles = sliderCSS.replace(/@layer\\s+components\\s*\\{/, '').replace(/\\}\\s*$/, '');\n\nconst styles = css`\n :host {\n display: block;\n width: 100%;\n }\n\n :host([hidden]) {\n display: none !important;\n }\n\n ${coreStyles}\n\n /* Web component specific adjustments */\n .slider {\n font-family: inherit;\n position: relative;\n display: flex;\n align-items: center;\n width: 100%;\n height: 2.5rem;\n touch-action: none;\n }\n\n .slider-track {\n position: relative;\n flex: 1;\n height: 0.375rem;\n background-color: var(--color-surface-container-high, #e0e0e0);\n border-radius: 0.1875rem;\n cursor: pointer;\n }\n\n .slider-track-filled {\n position: absolute;\n top: 0;\n left: 0;\n height: 100%;\n background-color: var(--color-primary);\n border-radius: 0.1875rem;\n transition: width 0.1s ease;\n }\n\n .slider-thumb {\n position: absolute;\n top: 50%;\n width: 1.25rem;\n height: 1.25rem;\n background-color: var(--color-primary);\n border-radius: 50%;\n transform: translate(-50%, -50%);\n cursor: grab;\n transition: box-shadow 0.15s ease;\n box-shadow: 0 2px 4px rgba(0, 0, 0, 0.2);\n }\n\n .slider-thumb:hover {\n box-shadow: 0 0 0 8px rgba(var(--color-primary-rgb, 98, 0, 238), 0.1);\n }\n\n .slider-thumb:active {\n cursor: grabbing;\n box-shadow: 0 0 0 12px rgba(var(--color-primary-rgb, 98, 0, 238), 0.2);\n }\n\n .slider-thumb-label {\n position: absolute;\n bottom: calc(100% + 8px);\n left: 50%;\n transform: translateX(-50%);\n padding: 0.25rem 0.5rem;\n font-size: 0.75rem;\n font-weight: 500;\n color: var(--color-on-primary);\n background-color: var(--color-primary);\n border-radius: 0.25rem;\n white-space: nowrap;\n opacity: 0;\n transition: opacity 0.15s ease;\n }\n\n .slider-thumb:hover .slider-thumb-label,\n .slider-thumb:active .slider-thumb-label,\n .slider.show-value .slider-thumb-label {\n opacity: 1;\n }\n\n /* Size variants */\n .slider-sm .slider-track {\n height: 0.25rem;\n }\n\n .slider-sm .slider-thumb {\n width: 1rem;\n height: 1rem;\n }\n\n .slider-lg .slider-track {\n height: 0.5rem;\n }\n\n .slider-lg .slider-thumb {\n width: 1.5rem;\n height: 1.5rem;\n }\n\n /* Color variants */\n .slider-secondary .slider-track-filled,\n .slider-secondary .slider-thumb {\n background-color: var(--color-secondary);\n }\n\n .slider-tertiary .slider-track-filled,\n .slider-tertiary .slider-thumb {\n background-color: var(--color-tertiary);\n }\n\n .slider-success .slider-track-filled,\n .slider-success .slider-thumb {\n background-color: var(--color-success);\n }\n\n .slider-warning .slider-track-filled,\n .slider-warning .slider-thumb {\n background-color: var(--color-warning);\n }\n\n .slider-error .slider-track-filled,\n .slider-error .slider-thumb {\n background-color: var(--color-error);\n }\n\n /* Disabled state */\n :host([disabled]) .slider {\n opacity: 0.5;\n pointer-events: none;\n }\n\n :host([disabled]) .slider-thumb {\n cursor: not-allowed;\n }\n\n /* Labels container */\n .slider-labels {\n display: flex;\n justify-content: space-between;\n margin-top: 0.25rem;\n font-size: 0.75rem;\n color: var(--color-on-surface);\n opacity: 0.7;\n }\n`;\n\nexport class ElDmSlider extends BaseElement {\n static properties = {\n value: { type: Number, reflect: true, default: 0 },\n min: { type: Number, reflect: true, default: 0 },\n max: { type: Number, reflect: true, default: 100 },\n step: { type: Number, reflect: true, default: 1 },\n disabled: { type: Boolean, reflect: true },\n size: { type: String, reflect: true },\n color: { type: String, reflect: true, default: 'primary' },\n showValue: {\n type: Boolean,\n reflect: true,\n attribute: 'show-value',\n },\n };\n\n declare value: number;\n declare min: number;\n declare max: number;\n declare step: number;\n declare disabled: boolean;\n declare size: SliderSize;\n declare color: SliderColor;\n declare showValue: boolean;\n\n private _isDragging = false;\n\n constructor() {\n super();\n this.attachStyles(styles);\n }\n\n private _getClasses(): string {\n const classes = ['slider'];\n\n if (this.size && SIZE_CLASSES[this.size]) {\n classes.push(SIZE_CLASSES[this.size]);\n }\n\n if (this.color && COLOR_CLASSES[this.color]) {\n classes.push(COLOR_CLASSES[this.color]);\n }\n\n if (this.showValue) {\n classes.push('show-value');\n }\n\n return classes.join(' ');\n }\n\n private _getPercentage(): number {\n const range = this.max - this.min;\n if (range === 0) return 0;\n return ((this.value - this.min) / range) * 100;\n }\n\n private _valueFromPosition(clientX: number): number {\n const track = this.shadowRoot?.querySelector('.slider-track');\n if (!track) return this.value;\n\n const rect = track.getBoundingClientRect();\n const percentage = Math.max(0, Math.min(1, (clientX - rect.left) / rect.width));\n const rawValue = this.min + percentage * (this.max - this.min);\n\n // Snap to step\n const steppedValue = Math.round(rawValue / this.step) * this.step;\n return Math.max(this.min, Math.min(this.max, steppedValue));\n }\n\n private _handleTrackClick(e: MouseEvent): void {\n if (this.disabled) return;\n const newValue = this._valueFromPosition(e.clientX);\n if (newValue !== this.value) {\n this.value = newValue;\n this._updateUI();\n this.emit('input', { value: this.value });\n this.emit('change', { value: this.value });\n }\n }\n\n private _handleThumbMouseDown(e: MouseEvent): void {\n if (this.disabled) return;\n e.preventDefault();\n this._isDragging = true;\n\n const handleMouseMove = (moveEvent: MouseEvent) => {\n const newValue = this._valueFromPosition(moveEvent.clientX);\n if (newValue !== this.value) {\n this.value = newValue;\n this._updateUI();\n this.emit('input', { value: this.value });\n }\n };\n\n const handleMouseUp = () => {\n this._isDragging = false;\n document.removeEventListener('mousemove', handleMouseMove);\n document.removeEventListener('mouseup', handleMouseUp);\n this.emit('change', { value: this.value });\n };\n\n document.addEventListener('mousemove', handleMouseMove);\n document.addEventListener('mouseup', handleMouseUp);\n }\n\n private _handleKeyDown(e: KeyboardEvent): void {\n if (this.disabled) return;\n\n let newValue = this.value;\n const bigStep = (this.max - this.min) / 10;\n\n switch (e.key) {\n case 'ArrowRight':\n case 'ArrowUp':\n newValue = Math.min(this.max, this.value + this.step);\n break;\n case 'ArrowLeft':\n case 'ArrowDown':\n newValue = Math.max(this.min, this.value - this.step);\n break;\n case 'PageUp':\n newValue = Math.min(this.max, this.value + bigStep);\n break;\n case 'PageDown':\n newValue = Math.max(this.min, this.value - bigStep);\n break;\n case 'Home':\n newValue = this.min;\n break;\n case 'End':\n newValue = this.max;\n break;\n default:\n return;\n }\n\n e.preventDefault();\n if (newValue !== this.value) {\n this.value = newValue;\n this._updateUI();\n this.emit('input', { value: this.value });\n this.emit('change', { value: this.value });\n }\n }\n\n private _updateUI(): void {\n const percentage = this._getPercentage();\n const filled = this.shadowRoot?.querySelector('.slider-track-filled') as HTMLElement;\n const thumb = this.shadowRoot?.querySelector('.slider-thumb') as HTMLElement;\n const label = this.shadowRoot?.querySelector('.slider-thumb-label') as HTMLElement;\n\n if (filled) {\n filled.style.width = `${percentage}%`;\n }\n if (thumb) {\n thumb.style.left = `${percentage}%`;\n }\n if (label) {\n label.textContent = String(this.value);\n }\n }\n\n render(): string {\n const classes = this._getClasses();\n const percentage = this._getPercentage();\n\n return `\n <div class=\"${classes}\" part=\"slider\" role=\"slider\"\n aria-valuemin=\"${this.min}\"\n aria-valuemax=\"${this.max}\"\n aria-valuenow=\"${this.value}\"\n tabindex=\"${this.disabled ? -1 : 0}\">\n <div class=\"slider-track\" part=\"track\">\n <div class=\"slider-track-filled\" style=\"width: ${percentage}%\"></div>\n <div class=\"slider-thumb\" part=\"thumb\" style=\"left: ${percentage}%\">\n <span class=\"slider-thumb-label\">${this.value}</span>\n </div>\n </div>\n </div>\n `;\n }\n\n update(): void {\n super.update();\n\n const track = this.shadowRoot?.querySelector('.slider-track');\n const thumb = this.shadowRoot?.querySelector('.slider-thumb');\n const slider = this.shadowRoot?.querySelector('.slider');\n\n track?.addEventListener('click', ((e: MouseEvent) =>\n this._handleTrackClick(e)) as EventListener);\n thumb?.addEventListener('mousedown', ((e: MouseEvent) =>\n this._handleThumbMouseDown(e)) as EventListener);\n slider?.addEventListener('keydown', ((e: KeyboardEvent) =>\n this._handleKeyDown(e)) as EventListener);\n }\n}\n",
|
|
6
|
+
"/**\n * @duskmoon-dev/el-slider\n *\n * DuskMoon Slider custom element\n */\n\nimport { ElDmSlider } from './el-dm-slider.js';\n\nexport { ElDmSlider };\nexport type { SliderSize, SliderColor } from './el-dm-slider.js';\n\n/**\n * Register the el-dm-slider custom element\n *\n * @example\n * ```ts\n * import { register } from '@duskmoon-dev/el-slider';\n * register();\n * ```\n */\nexport function register(): void {\n if (!customElements.get('el-dm-slider')) {\n customElements.define('el-dm-slider', ElDmSlider);\n }\n}\n"
|
|
7
|
+
],
|
|
8
|
+
"mappings": "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",
|
|
9
|
+
"debugId": "BF9B2E1BF7539B1564756E2164756E21",
|
|
10
|
+
"names": []
|
|
11
|
+
}
|