@rcarls/rc-slider 0.5.0 → 0.6.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/CHANGELOG.md CHANGED
@@ -1,5 +1,17 @@
1
1
  # @rcarls/rc-slider
2
2
 
3
+ ## 0.6.0
4
+
5
+ ### Patch Changes
6
+
7
+ - 57370e4: Align component metadata, aggregate framework typings, development-time native-child
8
+ validation, controlled menu state, package declarations, and public documentation before the
9
+ next release.
10
+ - Updated dependencies [6683eb9]
11
+ - Updated dependencies [ee7ba6c]
12
+ - Updated dependencies [30eb232]
13
+ - @rcarls/rc-common@0.6.0
14
+
3
15
  ## 0.5.0
4
16
 
5
17
  ### Patch Changes
package/README.md CHANGED
@@ -16,7 +16,7 @@ Consumers can decorate the track with a real named slot:
16
16
  ```html
17
17
  <rc-slider>
18
18
  <span slot="track-background" class="threshold-bands"></span>
19
- <input type="range" min="0" max="100" value="40">
19
+ <input type="range" min="0" max="100" value="40" />
20
20
  </rc-slider>
21
21
  ```
22
22
 
@@ -27,7 +27,7 @@ The component exposes `root`, `control`, `track`, `progress`, and
27
27
  Native input styling stays with the consumer:
28
28
 
29
29
  ```css
30
- rc-slider > input[type="range"] {
30
+ rc-slider > input[type='range'] {
31
31
  appearance: auto;
32
32
  }
33
33
  ```
@@ -255,7 +255,7 @@
255
255
  "type": {
256
256
  "text": "string"
257
257
  },
258
- "default": "\"\"",
258
+ "default": "''",
259
259
  "description": "Screen-reader value text. When set, forwarded as `aria-valuetext` on the native input.",
260
260
  "attribute": "value-text"
261
261
  },
@@ -263,9 +263,9 @@
263
263
  "kind": "field",
264
264
  "name": "orientation",
265
265
  "type": {
266
- "text": "\"horizontal\" | \"vertical\""
266
+ "text": "'horizontal' | 'vertical'"
267
267
  },
268
- "default": "\"horizontal\"",
268
+ "default": "'horizontal'",
269
269
  "description": "Orientation; reflected as an attribute and forwarded to `aria-orientation`.",
270
270
  "attribute": "orientation",
271
271
  "reflects": true
@@ -453,7 +453,7 @@
453
453
  {
454
454
  "name": "type",
455
455
  "type": {
456
- "text": "\"rc-slider-input\" | \"rc-slider-change\""
456
+ "text": "'rc-slider-input' | 'rc-slider-change'"
457
457
  }
458
458
  }
459
459
  ]
@@ -505,18 +505,18 @@
505
505
  ],
506
506
  "events": [
507
507
  {
508
- "name": "type",
508
+ "name": "rc-slider-input",
509
509
  "type": {
510
510
  "text": "CustomEvent"
511
- }
512
- },
513
- {
514
- "description": "Fires continuously while the value changes. Detail: `{ value }`.",
515
- "name": "rc-slider-input"
511
+ },
512
+ "description": "Fires continuously while the value changes. Detail: `{ value }`."
516
513
  },
517
514
  {
518
- "description": "Fires when the committed value changes (on release). Detail: `{ value }`.",
519
- "name": "rc-slider-change"
515
+ "name": "rc-slider-change",
516
+ "type": {
517
+ "text": "CustomEvent"
518
+ },
519
+ "description": "Fires when the committed value changes (on release). Detail: `{ value }`."
520
520
  }
521
521
  ],
522
522
  "attributes": [
@@ -596,16 +596,16 @@
596
596
  "type": {
597
597
  "text": "string"
598
598
  },
599
- "default": "\"\"",
599
+ "default": "''",
600
600
  "fieldName": "valueText"
601
601
  },
602
602
  {
603
603
  "description": "Orientation; reflected as an attribute and forwarded to `aria-orientation`.",
604
604
  "name": "orientation",
605
605
  "type": {
606
- "text": "\"horizontal\" | \"vertical\""
606
+ "text": "'horizontal' | 'vertical'"
607
607
  },
608
- "default": "\"horizontal\"",
608
+ "default": "'horizontal'",
609
609
  "fieldName": "orientation"
610
610
  }
611
611
  ],
@@ -74,9 +74,7 @@ const p = class p extends f {
74
74
  <span
75
75
  part="value-display"
76
76
  class="rc-slider-value"
77
- style=${y(
78
- this.display === "float" ? this._floatStyle() : void 0
79
- )}
77
+ style=${y(this.display === "float" ? this._floatStyle() : void 0)}
80
78
  aria-hidden="true"
81
79
  >
82
80
  <slot name="value-display">${this._displayText}</slot>
@@ -97,11 +95,7 @@ const p = class p extends f {
97
95
  <span part="control" class="rc-slider-control">
98
96
  <span part="track" class="rc-slider-track" aria-hidden="true">
99
97
  <slot name="track-background"></slot>
100
- <span
101
- part="progress"
102
- class="rc-slider-progress"
103
- style=${this._progressStyle()}
104
- ></span>
98
+ <span part="progress" class="rc-slider-progress" style=${this._progressStyle()}></span>
105
99
  </span>
106
100
 
107
101
  <slot @slotchange=${this._onDefaultSlotChange}></slot>
@@ -156,13 +150,13 @@ const p = class p extends f {
156
150
  s.value = String(this.value);
157
151
  return;
158
152
  }
159
- this._commitInputValue(s), this.dispatchEvent(
160
- new CustomEvent(e, {
161
- bubbles: !0,
162
- composed: !0,
163
- detail: { value: this.value }
164
- })
165
- );
153
+ this._commitInputValue(s);
154
+ const i = {
155
+ bubbles: !0,
156
+ composed: !0,
157
+ detail: { value: this.value }
158
+ };
159
+ e === "rc-slider-input" ? this.dispatchEvent(new CustomEvent("rc-slider-input", i)) : this.dispatchEvent(new CustomEvent("rc-slider-change", i));
166
160
  }
167
161
  _commitInputValue(t) {
168
162
  const e = this.value;
@@ -195,11 +189,11 @@ p.styles = m`
195
189
  line-height: var(--rc-line-height, normal);
196
190
  }
197
191
 
198
- .rc-slider-root[data-display="inline-start"] {
192
+ .rc-slider-root[data-display='inline-start'] {
199
193
  grid-template-columns: auto minmax(0, 1fr);
200
194
  }
201
195
 
202
- .rc-slider-root[data-display="inline-end"] {
196
+ .rc-slider-root[data-display='inline-end'] {
203
197
  grid-template-columns: minmax(0, 1fr) auto;
204
198
  }
205
199
 
@@ -227,7 +221,7 @@ p.styles = m`
227
221
  z-index: 0;
228
222
  }
229
223
 
230
- ::slotted([slot="track-background"]) {
224
+ ::slotted([slot='track-background']) {
231
225
  position: absolute;
232
226
  inset: 0;
233
227
  pointer-events: none;
@@ -240,7 +234,7 @@ p.styles = m`
240
234
  z-index: 1;
241
235
  }
242
236
 
243
- ::slotted(input[type="range"]) {
237
+ ::slotted(input[type='range']) {
244
238
  position: absolute;
245
239
  inset: 0;
246
240
  inline-size: 100%;
@@ -256,7 +250,7 @@ p.styles = m`
256
250
  color: var(--rc-slider-value-color, var(--rc-text-disabled, GrayText));
257
251
  }
258
252
 
259
- .rc-slider-root[data-display="float"] .rc-slider-value {
253
+ .rc-slider-root[data-display='float'] .rc-slider-value {
260
254
  position: absolute;
261
255
  inset-block-start: var(--rc-slider-float-value-block-offset, -1.4em);
262
256
  transform: translateX(-50%);
@@ -264,32 +258,32 @@ p.styles = m`
264
258
  z-index: 3;
265
259
  }
266
260
 
267
- :host([orientation="vertical"]) {
261
+ :host([orientation='vertical']) {
268
262
  display: inline-block;
269
263
  }
270
264
 
271
- :host([orientation="vertical"]) .rc-slider-control {
265
+ :host([orientation='vertical']) .rc-slider-control {
272
266
  inline-size: var(--rc-slider-control-size, var(--rc-control-block-size, 1.5rem));
273
267
  block-size: var(--rc-slider-vertical-size, 12.5rem);
274
268
  }
275
269
 
276
- :host([orientation="vertical"]) .rc-slider-track {
270
+ :host([orientation='vertical']) .rc-slider-track {
277
271
  inset-block: 0;
278
272
  inset-inline: calc(50% - var(--rc-slider-track-size, 0.1875rem) / 2);
279
273
  inline-size: var(--rc-slider-track-size, 0.1875rem);
280
274
  block-size: auto;
281
275
  }
282
276
 
283
- :host([orientation="vertical"]) .rc-slider-progress {
277
+ :host([orientation='vertical']) .rc-slider-progress {
284
278
  inset-inline: 0;
285
279
  }
286
280
 
287
- :host([orientation="vertical"]) ::slotted(input[type="range"]) {
281
+ :host([orientation='vertical']) ::slotted(input[type='range']) {
288
282
  writing-mode: vertical-lr;
289
283
  direction: rtl;
290
284
  }
291
285
 
292
- :host([orientation="vertical"]) .rc-slider-root[data-display="float"] .rc-slider-value {
286
+ :host([orientation='vertical']) .rc-slider-root[data-display='float'] .rc-slider-value {
293
287
  inset-block-start: auto;
294
288
  inset-inline-start: var(--rc-slider-float-value-inline-offset, calc(100% + 0.5rem));
295
289
  transform: translateY(50%);
@@ -329,4 +323,4 @@ l([
329
323
  export {
330
324
  a as R
331
325
  };
332
- //# sourceMappingURL=rc-slider-CRGEKO0W.js.map
326
+ //# sourceMappingURL=rc-slider-D_D-Ud3e.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rc-slider-D_D-Ud3e.js","sources":["../src/rc-slider.ts"],"sourcesContent":["import { LitElement, css, html, nothing } from 'lit';\nimport type { ComplexAttributeConverter } from 'lit';\nimport { property } from 'lit/decorators.js';\nimport { ifDefined } from 'lit/directives/if-defined.js';\nimport { NativeChildController, valueToPercent, warnMissingDirectChild } from '@rcarls/rc-common';\n\nexport interface RCSliderValueEvent {\n /** Current numeric slider value. */\n value: number;\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'rc-slider': RCSlider;\n }\n\n interface HTMLElementEventMap {\n 'rc-slider-input': CustomEvent<RCSliderValueEvent>;\n 'rc-slider-change': CustomEvent<RCSliderValueEvent>;\n }\n}\n\ntype DisplayValue = 'float' | 'inline-start' | 'inline-end' | null;\n\n/**\n * Normalises the `display` attribute.\n * A bare boolean attribute (`display` with no value) maps to `'float'` so\n * the reflected attribute is always an explicit string, never an empty string.\n */\nconst displayConverter: ComplexAttributeConverter<DisplayValue> = {\n fromAttribute(v: string | null): DisplayValue {\n if (v === null) return null;\n if (v === '' || v === 'float') return 'float';\n if (v === 'inline-start') return 'inline-start';\n if (v === 'inline-end') return 'inline-end';\n return null;\n },\n toAttribute(v: DisplayValue): string | null {\n return v;\n },\n};\n\n/**\n * Returns the numeric value of a range input's `min`, `max`, or `step`\n * attribute string, falling back to `defaultVal` when the attribute is absent\n * (empty string) or not a valid number.\n */\nfunction parseAttr(s: string, defaultVal: number): number {\n if (s === '') return defaultVal;\n const n = parseFloat(s);\n return isNaN(n) ? defaultVal : n;\n}\n\n/**\n * Single-thumb slider backed by a native <input type=\"range\"> with custom track and value\n * display hooks, following the WAI-ARIA Slider pattern.\n *\n * Label association:\n * - Explicit `for`/`id`: `<label for=\"vol\">Volume</label><rc-slider><input id=\"vol\" …></rc-slider>`\n * - Direct `aria-label` on the input: `<input aria-label=\"Volume\" …>`\n *\n * These patterns all work without JavaScript. The component does not render a\n * label element itself — the consumer is responsible for accessible naming.\n *\n * Form participation is handled natively by the consumer-provided input's `name`\n * attribute; no `ElementInternals` setup is required.\n *\n * @see {@link https://richardcarls.github.io/rc-webcomponents/components/rc-slider rc-slider docs}\n * @see {@link https://www.w3.org/WAI/ARIA/apg/patterns/slider/ WAI-ARIA Slider pattern}\n *\n * @slot track-background - Optional decorative content rendered inside the track before the progress fill.\n * @slot value-display - Optional replacement for the rendered value text.\n *\n * @fires rc-slider-input - Fires continuously while the value changes. Detail: `{ value }`.\n * @fires rc-slider-change - Fires when the committed value changes (on release). Detail: `{ value }`.\n *\n * @attr min - Minimum slider value.\n * @attr max - Maximum slider value.\n * @attr step - Slider step.\n * @attr value - Current slider value. Host writes are silent.\n * @attr default-value - Initial uncontrolled slider value. Has no effect after the first user\n * interaction or `value` write.\n * @attr disabled - Disables the underlying input.\n * @attr readonly - Prevents edits while preserving normal display. Not a native range attribute.\n * @attr display - Controls the live value display: absent (none), `float`, `inline-start`, or\n * `inline-end`.\n * @attr value-text - Screen-reader value text, forwarded as `aria-valuetext` on the native input.\n * @attr orientation - Orientation, forwarded to `aria-orientation`: `horizontal` or `vertical`.\n *\n * @cssprop [--rc-thumb-radius=9px] - Half the thumb width; used to position the float value display.\n * @cssprop [--rc-slider-gap=var(--rc-control-gap)] - Gap between track and inline value display.\n * @cssprop [--rc-slider-control-size=var(--rc-control-block-size)] - Track hit-area block size.\n * @cssprop [--rc-slider-vertical-size=12.5rem] - Track length when `orientation=\"vertical\"`.\n * @cssprop [--rc-slider-track-size=0.1875rem] - Visual track thickness.\n * @cssprop [--rc-slider-track-background=CanvasText] - Unfilled track color.\n * @cssprop [--rc-slider-track-opacity=0.25] - Unfilled track opacity.\n * @cssprop [--rc-slider-track-radius=var(--rc-control-radius)] - Track border radius.\n * @cssprop [--rc-slider-progress-background=var(--rc-accent)] - Filled track color.\n * @cssprop [--rc-slider-value-color=var(--rc-text-disabled)] - Value display text color.\n * @cssprop [--rc-slider-float-value-block-offset=-1.4em] - Block-axis offset for horizontal float value display.\n * @cssprop [--rc-slider-float-value-inline-offset=calc(100% + 0.5rem)] - Inline-axis offset for vertical float value display.\n *\n * @csspart root - Root layout wrapper.\n * @csspart control - Track/input positioning wrapper.\n * @csspart track - Visual slider track.\n * @csspart progress - Filled progress segment.\n * @csspart value-display - Rendered value text.\n */\nexport class RCSlider extends LitElement {\n static override styles = css`\n :host {\n display: block;\n }\n\n .rc-slider-root {\n display: grid;\n gap: var(--rc-slider-gap, var(--rc-control-gap, 0.5rem));\n align-items: center;\n font-family: var(--rc-font-family, inherit);\n font-size: var(--rc-font-size, inherit);\n line-height: var(--rc-line-height, normal);\n }\n\n .rc-slider-root[data-display='inline-start'] {\n grid-template-columns: auto minmax(0, 1fr);\n }\n\n .rc-slider-root[data-display='inline-end'] {\n grid-template-columns: minmax(0, 1fr) auto;\n }\n\n .rc-slider-control {\n position: relative;\n display: block;\n min-width: 0;\n min-height: var(--rc-slider-control-size, var(--rc-control-block-size, 1.5rem));\n }\n\n .rc-slider-track,\n .rc-slider-progress {\n position: absolute;\n pointer-events: none;\n }\n\n .rc-slider-track {\n inset-inline: 0;\n inset-block: calc(50% - var(--rc-slider-track-size, 0.1875rem) / 2);\n block-size: var(--rc-slider-track-size, 0.1875rem);\n background: var(--rc-slider-track-background, CanvasText);\n opacity: var(--rc-slider-track-opacity, 0.25);\n border-radius: var(--rc-slider-track-radius, var(--rc-control-radius, 0));\n overflow: hidden;\n z-index: 0;\n }\n\n ::slotted([slot='track-background']) {\n position: absolute;\n inset: 0;\n pointer-events: none;\n }\n\n .rc-slider-progress {\n inset-block: 0;\n background: var(--rc-slider-progress-background, var(--rc-accent, Highlight));\n border-radius: inherit;\n z-index: 1;\n }\n\n ::slotted(input[type='range']) {\n position: absolute;\n inset: 0;\n inline-size: 100%;\n block-size: 100%;\n margin: 0;\n background: transparent;\n z-index: 2;\n }\n\n .rc-slider-value {\n font-variant-numeric: tabular-nums;\n white-space: nowrap;\n color: var(--rc-slider-value-color, var(--rc-text-disabled, GrayText));\n }\n\n .rc-slider-root[data-display='float'] .rc-slider-value {\n position: absolute;\n inset-block-start: var(--rc-slider-float-value-block-offset, -1.4em);\n transform: translateX(-50%);\n pointer-events: none;\n z-index: 3;\n }\n\n :host([orientation='vertical']) {\n display: inline-block;\n }\n\n :host([orientation='vertical']) .rc-slider-control {\n inline-size: var(--rc-slider-control-size, var(--rc-control-block-size, 1.5rem));\n block-size: var(--rc-slider-vertical-size, 12.5rem);\n }\n\n :host([orientation='vertical']) .rc-slider-track {\n inset-block: 0;\n inset-inline: calc(50% - var(--rc-slider-track-size, 0.1875rem) / 2);\n inline-size: var(--rc-slider-track-size, 0.1875rem);\n block-size: auto;\n }\n\n :host([orientation='vertical']) .rc-slider-progress {\n inset-inline: 0;\n }\n\n :host([orientation='vertical']) ::slotted(input[type='range']) {\n writing-mode: vertical-lr;\n direction: rtl;\n }\n\n :host([orientation='vertical']) .rc-slider-root[data-display='float'] .rc-slider-value {\n inset-block-start: auto;\n inset-inline-start: var(--rc-slider-float-value-inline-offset, calc(100% + 0.5rem));\n transform: translateY(50%);\n }\n `;\n\n /** Minimum slider value. */\n @property({ type: Number }) min = 0;\n\n /** Maximum slider value. */\n @property({ type: Number }) max = 100;\n\n /** Slider step. */\n @property({ type: Number }) step = 1;\n\n private _value: number | undefined;\n private _defaultValue: number | undefined;\n private _valueInitialized = false;\n\n /** Current slider value. */\n @property({ type: Number })\n get value(): number {\n return this._value ?? this._defaultValue ?? this._nativeInputValue;\n }\n set value(v: number) {\n const old = this._value;\n this._value = v;\n this._valueInitialized = true;\n this._applyValueToInput(v);\n this.requestUpdate('value', old);\n }\n\n /** Initial uncontrolled slider value. Has no effect after the first user interaction or `value` write. */\n @property({ type: Number, attribute: 'default-value' })\n get defaultValue(): number | undefined {\n return this._defaultValue;\n }\n set defaultValue(v: number | undefined) {\n const old = this._defaultValue;\n this._defaultValue = v;\n if (!this._valueInitialized && this._value === undefined && v !== undefined) {\n this._applyValueToInput(v);\n this.requestUpdate('value', undefined);\n }\n this.requestUpdate('defaultValue', old);\n }\n\n /** Disable the underlying input. */\n @property({ type: Boolean, reflect: true }) disabled = false;\n\n /** Prevents edits while preserving normal display. Not a native range attribute. */\n @property({ type: Boolean, reflect: true }) readonly = false;\n\n /**\n * Controls the live value display.\n *\n * - Absent (default) — no value shown.\n * - `display` or `display=\"float\"` — floats above the thumb.\n * - `display=\"inline-start\"` — rendered before the track, inline in the grid.\n * - `display=\"inline-end\"` — rendered after the track, inline in the grid.\n */\n @property({ reflect: true, converter: displayConverter })\n display: DisplayValue = null;\n\n /** Screen-reader value text. When set, forwarded as `aria-valuetext` on the native input. */\n @property({ attribute: 'value-text' }) valueText = '';\n\n /** Orientation; reflected as an attribute and forwarded to `aria-orientation`. */\n @property({ reflect: true }) orientation: 'horizontal' | 'vertical' = 'horizontal';\n\n private _$nativeInput: HTMLInputElement | null = null;\n\n private readonly _nativeInputController = new NativeChildController<HTMLInputElement>(this, {\n selector: ':scope > input[type=\"range\"]',\n observe: true,\n onChange: ($input, $previous) => this._setupInput($input, $previous),\n onMissing: () => {\n if (import.meta.env.DEV) {\n warnMissingDirectChild(this, {\n selector: ':scope > input[type=\"range\"]',\n message: '[rc-slider] Requires a child <input type=\"range\"> element.',\n });\n }\n },\n });\n\n override disconnectedCallback(): void {\n this._unwireInput();\n super.disconnectedCallback();\n }\n\n override updated(): void {\n const $input = this._$nativeInput;\n if (!$input) return;\n\n $input.disabled = this.disabled;\n this._syncAriaAttributes($input);\n }\n\n override render() {\n const $input = this._$nativeInput;\n if (!$input) return nothing;\n\n const valueDisplay = html`\n <span\n part=\"value-display\"\n class=\"rc-slider-value\"\n style=${ifDefined(this.display === 'float' ? this._floatStyle() : undefined)}\n aria-hidden=\"true\"\n >\n <slot name=\"value-display\">${this._displayText}</slot>\n </span>\n `;\n\n return html`\n <div\n part=\"root\"\n class=\"rc-slider-root\"\n data-display=${this.display ?? nothing}\n data-orientation=${this.orientation}\n data-readonly=${this.readonly ? '' : nothing}\n data-disabled=${this.disabled ? '' : nothing}\n data-has-value-text=${this.valueText ? '' : nothing}\n >\n ${this.display === 'inline-start' ? valueDisplay : nothing}\n\n <span part=\"control\" class=\"rc-slider-control\">\n <span part=\"track\" class=\"rc-slider-track\" aria-hidden=\"true\">\n <slot name=\"track-background\"></slot>\n <span part=\"progress\" class=\"rc-slider-progress\" style=${this._progressStyle()}></span>\n </span>\n\n <slot @slotchange=${this._onDefaultSlotChange}></slot>\n ${this.display === 'float' ? valueDisplay : nothing}\n </span>\n\n ${this.display === 'inline-end' ? valueDisplay : nothing}\n </div>\n `;\n }\n\n private get _displayText(): string {\n return this.valueText || String(this.value);\n }\n\n private get _nativeInputValue(): number {\n const value = this._$nativeInput?.valueAsNumber;\n return value === undefined || isNaN(value) ? 0 : value;\n }\n\n private _setupInput($input: HTMLInputElement | null, $previous?: HTMLInputElement | null): void {\n if ($previous && $previous !== $input) {\n this._unwireInput($previous);\n }\n\n if (!$input) {\n this._$nativeInput = null;\n return;\n }\n\n // Mirror disabled state from the native input if not explicitly set on the host.\n // Pre-upgrade markup may carry <input disabled> before the component upgrades.\n if (!this.hasAttribute('disabled') && $input.disabled) {\n this.disabled = true;\n }\n\n this._$nativeInput = $input;\n this._applyInitialValueToInput($input);\n this._wireInput($input);\n this.requestUpdate();\n }\n\n private _onDefaultSlotChange = (): void => {\n this._nativeInputController.sync();\n this.requestUpdate();\n };\n\n private _applyInitialValueToInput($input: HTMLInputElement): void {\n if (this._value !== undefined) {\n this._applyValueToInput(this._value);\n return;\n }\n\n if (this._defaultValue !== undefined) {\n this._applyValueToInput(this._defaultValue);\n return;\n }\n\n const value = $input.valueAsNumber;\n if (!isNaN(value)) {\n this._defaultValue = value;\n }\n }\n\n private _applyValueToInput(value: number): void {\n if (!this._$nativeInput) return;\n\n this._$nativeInput.value = String(value);\n }\n\n private _wireInput($input: HTMLInputElement): void {\n $input.addEventListener('input', this._onInput);\n $input.addEventListener('change', this._onChange);\n $input.addEventListener('keydown', this._onKeydown);\n }\n\n private _unwireInput($input = this._$nativeInput): void {\n $input?.removeEventListener('input', this._onInput);\n $input?.removeEventListener('change', this._onChange);\n $input?.removeEventListener('keydown', this._onKeydown);\n }\n\n private _syncAriaAttributes($input: HTMLInputElement): void {\n if (this.valueText) {\n $input.setAttribute('aria-valuetext', this.valueText);\n } else {\n $input.removeAttribute('aria-valuetext');\n }\n\n if (this.orientation === 'vertical') {\n $input.setAttribute('aria-orientation', 'vertical');\n } else {\n $input.removeAttribute('aria-orientation');\n }\n\n if (this.readonly) {\n $input.setAttribute('aria-readonly', 'true');\n } else {\n $input.removeAttribute('aria-readonly');\n }\n }\n\n private readonly _onInput = (e: Event): void => {\n this._handleRangeEvent(e, 'rc-slider-input');\n };\n\n private readonly _onChange = (e: Event): void => {\n this._handleRangeEvent(e, 'rc-slider-change');\n };\n\n private _handleRangeEvent(e: Event, type: 'rc-slider-input' | 'rc-slider-change'): void {\n const $input = e.currentTarget as HTMLInputElement;\n\n if (this.readonly) {\n $input.value = String(this.value);\n return;\n }\n\n this._commitInputValue($input);\n\n const init: CustomEventInit<RCSliderValueEvent> = {\n bubbles: true,\n composed: true,\n detail: { value: this.value },\n };\n\n if (type === 'rc-slider-input') {\n this.dispatchEvent(new CustomEvent<RCSliderValueEvent>('rc-slider-input', init));\n } else {\n this.dispatchEvent(new CustomEvent<RCSliderValueEvent>('rc-slider-change', init));\n }\n }\n\n private readonly _onKeydown = (e: KeyboardEvent): void => {\n if (this.disabled || this.readonly) return;\n if (e.key !== 'PageUp' && e.key !== 'PageDown') return;\n\n e.preventDefault();\n const $input = e.currentTarget as HTMLInputElement;\n\n if (e.key === 'PageUp') $input.stepUp(10);\n else $input.stepDown(10);\n\n this._commitInputValue($input);\n\n this.dispatchEvent(\n new CustomEvent<RCSliderValueEvent>('rc-slider-input', {\n bubbles: true,\n composed: true,\n detail: { value: this.value },\n }),\n );\n };\n\n private _commitInputValue($input: HTMLInputElement): void {\n const old = this.value;\n\n this._value = $input.valueAsNumber;\n this._valueInitialized = true;\n\n this.requestUpdate('value', old);\n }\n\n private _progressStyle(): string {\n const $input = this._$nativeInput;\n if (!$input) return '';\n\n const min = parseAttr($input.min, 0);\n const max = parseAttr($input.max, 100);\n const pct = valueToPercent($input.valueAsNumber, min, max) * 100;\n\n if (this.orientation === 'vertical') {\n return `bottom:0%;height:${pct.toFixed(3)}%`;\n }\n\n return `left:0%;width:${pct.toFixed(3)}%`;\n }\n\n private _floatStyle(): string {\n const $input = this._$nativeInput;\n if (!$input) return '';\n\n const min = parseAttr($input.min, 0);\n const max = parseAttr($input.max, 100);\n const pct = valueToPercent($input.valueAsNumber, min, max);\n const k = (1 - pct * 2).toFixed(4);\n\n if (this.orientation === 'vertical') {\n return `bottom:calc(${(pct * 100).toFixed(3)}% + ${k} * var(--rc-thumb-radius, 9px))`;\n }\n\n return `left:calc(${(pct * 100).toFixed(3)}% + ${k} * var(--rc-thumb-radius, 9px))`;\n }\n}\n\nexport default RCSlider;\n"],"names":["displayConverter","v","parseAttr","s","defaultVal","n","_RCSlider","LitElement","NativeChildController","$input","$previous","e","old","nothing","valueDisplay","html","ifDefined","value","type","init","min","max","pct","valueToPercent","k","css","RCSlider","__decorateClass","property"],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import { R as e } from "./rc-slider-CRGEKO0W.js";
1
+ import { R as e } from "./rc-slider-D_D-Ud3e.js";
2
2
  customElements.get("rc-slider") || customElements.define("rc-slider", e);
3
3
  export {
4
4
  e as RCSlider
package/dist/rc-slider.js CHANGED
@@ -1,4 +1,4 @@
1
- import { R as o } from "./rc-slider-CRGEKO0W.js";
1
+ import { R as o } from "./rc-slider-D_D-Ud3e.js";
2
2
  export {
3
3
  o as RCSlider
4
4
  };
@@ -5,14 +5,14 @@ export interface RCSliderValueEvent {
5
5
  }
6
6
  declare global {
7
7
  interface HTMLElementTagNameMap {
8
- "rc-slider": RCSlider;
8
+ 'rc-slider': RCSlider;
9
9
  }
10
10
  interface HTMLElementEventMap {
11
- "rc-slider-input": CustomEvent<RCSliderValueEvent>;
12
- "rc-slider-change": CustomEvent<RCSliderValueEvent>;
11
+ 'rc-slider-input': CustomEvent<RCSliderValueEvent>;
12
+ 'rc-slider-change': CustomEvent<RCSliderValueEvent>;
13
13
  }
14
14
  }
15
- type DisplayValue = "float" | "inline-start" | "inline-end" | null;
15
+ type DisplayValue = 'float' | 'inline-start' | 'inline-end' | null;
16
16
  /**
17
17
  * Single-thumb slider backed by a native <input type="range"> with custom track and value
18
18
  * display hooks, following the WAI-ARIA Slider pattern.
@@ -101,7 +101,7 @@ export declare class RCSlider extends LitElement {
101
101
  /** Screen-reader value text. When set, forwarded as `aria-valuetext` on the native input. */
102
102
  valueText: string;
103
103
  /** Orientation; reflected as an attribute and forwarded to `aria-orientation`. */
104
- orientation: "horizontal" | "vertical";
104
+ orientation: 'horizontal' | 'vertical';
105
105
  private _$nativeInput;
106
106
  private readonly _nativeInputController;
107
107
  disconnectedCallback(): void;
package/package.json CHANGED
@@ -3,7 +3,7 @@
3
3
  "publishConfig": {
4
4
  "access": "public"
5
5
  },
6
- "version": "0.5.0",
6
+ "version": "0.6.0",
7
7
  "description": "Single-thumb slider backed by a native <input type=\"range\"> with custom track and value display hooks.",
8
8
  "repository": {
9
9
  "type": "git",
@@ -57,7 +57,7 @@
57
57
  "vitest-browser-lit": "^1.0.1"
58
58
  },
59
59
  "dependencies": {
60
- "@rcarls/rc-common": "0.5.0"
60
+ "@rcarls/rc-common": "0.6.0"
61
61
  },
62
62
  "peerDependencies": {
63
63
  "lit": "^3.0.0"
@@ -1 +0,0 @@
1
- {"version":3,"file":"rc-slider-CRGEKO0W.js","sources":["../src/rc-slider.ts"],"sourcesContent":["import { LitElement, css, html, nothing } from \"lit\";\nimport type { ComplexAttributeConverter } from \"lit\";\nimport { property } from \"lit/decorators.js\";\nimport { ifDefined } from \"lit/directives/if-defined.js\";\nimport { NativeChildController, valueToPercent, warnMissingDirectChild } from \"@rcarls/rc-common\";\n\nexport interface RCSliderValueEvent {\n /** Current numeric slider value. */\n value: number;\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n \"rc-slider\": RCSlider;\n }\n\n interface HTMLElementEventMap {\n \"rc-slider-input\": CustomEvent<RCSliderValueEvent>;\n \"rc-slider-change\": CustomEvent<RCSliderValueEvent>;\n }\n}\n\ntype DisplayValue = \"float\" | \"inline-start\" | \"inline-end\" | null;\n\n/**\n * Normalises the `display` attribute.\n * A bare boolean attribute (`display` with no value) maps to `'float'` so\n * the reflected attribute is always an explicit string, never an empty string.\n */\nconst displayConverter: ComplexAttributeConverter<DisplayValue> = {\n fromAttribute(v: string | null): DisplayValue {\n if (v === null) return null;\n if (v === \"\" || v === \"float\") return \"float\";\n if (v === \"inline-start\") return \"inline-start\";\n if (v === \"inline-end\") return \"inline-end\";\n return null;\n },\n toAttribute(v: DisplayValue): string | null {\n return v;\n },\n};\n\n/**\n * Returns the numeric value of a range input's `min`, `max`, or `step`\n * attribute string, falling back to `defaultVal` when the attribute is absent\n * (empty string) or not a valid number.\n */\nfunction parseAttr(s: string, defaultVal: number): number {\n if (s === \"\") return defaultVal;\n const n = parseFloat(s);\n return isNaN(n) ? defaultVal : n;\n}\n\n/**\n * Single-thumb slider backed by a native <input type=\"range\"> with custom track and value\n * display hooks, following the WAI-ARIA Slider pattern.\n *\n * Label association:\n * - Explicit `for`/`id`: `<label for=\"vol\">Volume</label><rc-slider><input id=\"vol\" …></rc-slider>`\n * - Direct `aria-label` on the input: `<input aria-label=\"Volume\" …>`\n *\n * These patterns all work without JavaScript. The component does not render a\n * label element itself — the consumer is responsible for accessible naming.\n *\n * Form participation is handled natively by the consumer-provided input's `name`\n * attribute; no `ElementInternals` setup is required.\n *\n * @see {@link https://richardcarls.github.io/rc-webcomponents/components/rc-slider rc-slider docs}\n * @see {@link https://www.w3.org/WAI/ARIA/apg/patterns/slider/ WAI-ARIA Slider pattern}\n *\n * @slot track-background - Optional decorative content rendered inside the track before the progress fill.\n * @slot value-display - Optional replacement for the rendered value text.\n *\n * @fires rc-slider-input - Fires continuously while the value changes. Detail: `{ value }`.\n * @fires rc-slider-change - Fires when the committed value changes (on release). Detail: `{ value }`.\n *\n * @attr min - Minimum slider value.\n * @attr max - Maximum slider value.\n * @attr step - Slider step.\n * @attr value - Current slider value. Host writes are silent.\n * @attr default-value - Initial uncontrolled slider value. Has no effect after the first user\n * interaction or `value` write.\n * @attr disabled - Disables the underlying input.\n * @attr readonly - Prevents edits while preserving normal display. Not a native range attribute.\n * @attr display - Controls the live value display: absent (none), `float`, `inline-start`, or\n * `inline-end`.\n * @attr value-text - Screen-reader value text, forwarded as `aria-valuetext` on the native input.\n * @attr orientation - Orientation, forwarded to `aria-orientation`: `horizontal` or `vertical`.\n *\n * @cssprop [--rc-thumb-radius=9px] - Half the thumb width; used to position the float value display.\n * @cssprop [--rc-slider-gap=var(--rc-control-gap)] - Gap between track and inline value display.\n * @cssprop [--rc-slider-control-size=var(--rc-control-block-size)] - Track hit-area block size.\n * @cssprop [--rc-slider-vertical-size=12.5rem] - Track length when `orientation=\"vertical\"`.\n * @cssprop [--rc-slider-track-size=0.1875rem] - Visual track thickness.\n * @cssprop [--rc-slider-track-background=CanvasText] - Unfilled track color.\n * @cssprop [--rc-slider-track-opacity=0.25] - Unfilled track opacity.\n * @cssprop [--rc-slider-track-radius=var(--rc-control-radius)] - Track border radius.\n * @cssprop [--rc-slider-progress-background=var(--rc-accent)] - Filled track color.\n * @cssprop [--rc-slider-value-color=var(--rc-text-disabled)] - Value display text color.\n * @cssprop [--rc-slider-float-value-block-offset=-1.4em] - Block-axis offset for horizontal float value display.\n * @cssprop [--rc-slider-float-value-inline-offset=calc(100% + 0.5rem)] - Inline-axis offset for vertical float value display.\n *\n * @csspart root - Root layout wrapper.\n * @csspart control - Track/input positioning wrapper.\n * @csspart track - Visual slider track.\n * @csspart progress - Filled progress segment.\n * @csspart value-display - Rendered value text.\n */\nexport class RCSlider extends LitElement {\n static override styles = css`\n :host {\n display: block;\n }\n\n .rc-slider-root {\n display: grid;\n gap: var(--rc-slider-gap, var(--rc-control-gap, 0.5rem));\n align-items: center;\n font-family: var(--rc-font-family, inherit);\n font-size: var(--rc-font-size, inherit);\n line-height: var(--rc-line-height, normal);\n }\n\n .rc-slider-root[data-display=\"inline-start\"] {\n grid-template-columns: auto minmax(0, 1fr);\n }\n\n .rc-slider-root[data-display=\"inline-end\"] {\n grid-template-columns: minmax(0, 1fr) auto;\n }\n\n .rc-slider-control {\n position: relative;\n display: block;\n min-width: 0;\n min-height: var(--rc-slider-control-size, var(--rc-control-block-size, 1.5rem));\n }\n\n .rc-slider-track,\n .rc-slider-progress {\n position: absolute;\n pointer-events: none;\n }\n\n .rc-slider-track {\n inset-inline: 0;\n inset-block: calc(50% - var(--rc-slider-track-size, 0.1875rem) / 2);\n block-size: var(--rc-slider-track-size, 0.1875rem);\n background: var(--rc-slider-track-background, CanvasText);\n opacity: var(--rc-slider-track-opacity, 0.25);\n border-radius: var(--rc-slider-track-radius, var(--rc-control-radius, 0));\n overflow: hidden;\n z-index: 0;\n }\n\n ::slotted([slot=\"track-background\"]) {\n position: absolute;\n inset: 0;\n pointer-events: none;\n }\n\n .rc-slider-progress {\n inset-block: 0;\n background: var(--rc-slider-progress-background, var(--rc-accent, Highlight));\n border-radius: inherit;\n z-index: 1;\n }\n\n ::slotted(input[type=\"range\"]) {\n position: absolute;\n inset: 0;\n inline-size: 100%;\n block-size: 100%;\n margin: 0;\n background: transparent;\n z-index: 2;\n }\n\n .rc-slider-value {\n font-variant-numeric: tabular-nums;\n white-space: nowrap;\n color: var(--rc-slider-value-color, var(--rc-text-disabled, GrayText));\n }\n\n .rc-slider-root[data-display=\"float\"] .rc-slider-value {\n position: absolute;\n inset-block-start: var(--rc-slider-float-value-block-offset, -1.4em);\n transform: translateX(-50%);\n pointer-events: none;\n z-index: 3;\n }\n\n :host([orientation=\"vertical\"]) {\n display: inline-block;\n }\n\n :host([orientation=\"vertical\"]) .rc-slider-control {\n inline-size: var(--rc-slider-control-size, var(--rc-control-block-size, 1.5rem));\n block-size: var(--rc-slider-vertical-size, 12.5rem);\n }\n\n :host([orientation=\"vertical\"]) .rc-slider-track {\n inset-block: 0;\n inset-inline: calc(50% - var(--rc-slider-track-size, 0.1875rem) / 2);\n inline-size: var(--rc-slider-track-size, 0.1875rem);\n block-size: auto;\n }\n\n :host([orientation=\"vertical\"]) .rc-slider-progress {\n inset-inline: 0;\n }\n\n :host([orientation=\"vertical\"]) ::slotted(input[type=\"range\"]) {\n writing-mode: vertical-lr;\n direction: rtl;\n }\n\n :host([orientation=\"vertical\"]) .rc-slider-root[data-display=\"float\"] .rc-slider-value {\n inset-block-start: auto;\n inset-inline-start: var(--rc-slider-float-value-inline-offset, calc(100% + 0.5rem));\n transform: translateY(50%);\n }\n `;\n\n /** Minimum slider value. */\n @property({ type: Number }) min = 0;\n\n /** Maximum slider value. */\n @property({ type: Number }) max = 100;\n\n /** Slider step. */\n @property({ type: Number }) step = 1;\n\n private _value: number | undefined;\n private _defaultValue: number | undefined;\n private _valueInitialized = false;\n\n /** Current slider value. */\n @property({ type: Number })\n get value(): number {\n return this._value ?? this._defaultValue ?? this._nativeInputValue;\n }\n set value(v: number) {\n const old = this._value;\n this._value = v;\n this._valueInitialized = true;\n this._applyValueToInput(v);\n this.requestUpdate(\"value\", old);\n }\n\n /** Initial uncontrolled slider value. Has no effect after the first user interaction or `value` write. */\n @property({ type: Number, attribute: \"default-value\" })\n get defaultValue(): number | undefined {\n return this._defaultValue;\n }\n set defaultValue(v: number | undefined) {\n const old = this._defaultValue;\n this._defaultValue = v;\n if (\n !this._valueInitialized &&\n this._value === undefined &&\n v !== undefined\n ) {\n this._applyValueToInput(v);\n this.requestUpdate(\"value\", undefined);\n }\n this.requestUpdate(\"defaultValue\", old);\n }\n\n /** Disable the underlying input. */\n @property({ type: Boolean, reflect: true }) disabled = false;\n\n /** Prevents edits while preserving normal display. Not a native range attribute. */\n @property({ type: Boolean, reflect: true }) readonly = false;\n\n /**\n * Controls the live value display.\n *\n * - Absent (default) — no value shown.\n * - `display` or `display=\"float\"` — floats above the thumb.\n * - `display=\"inline-start\"` — rendered before the track, inline in the grid.\n * - `display=\"inline-end\"` — rendered after the track, inline in the grid.\n */\n @property({ reflect: true, converter: displayConverter })\n display: DisplayValue = null;\n\n /** Screen-reader value text. When set, forwarded as `aria-valuetext` on the native input. */\n @property({ attribute: \"value-text\" }) valueText = \"\";\n\n /** Orientation; reflected as an attribute and forwarded to `aria-orientation`. */\n @property({ reflect: true }) orientation: \"horizontal\" | \"vertical\" =\n \"horizontal\";\n\n private _$nativeInput: HTMLInputElement | null = null;\n\n private readonly _nativeInputController = new NativeChildController<HTMLInputElement>(this, {\n selector: ':scope > input[type=\"range\"]',\n observe: true,\n onChange: ($input, $previous) => this._setupInput($input, $previous),\n onMissing: () => {\n if (import.meta.env.DEV) {\n warnMissingDirectChild(this, {\n selector: ':scope > input[type=\"range\"]',\n message: '[rc-slider] Requires a child <input type=\"range\"> element.',\n });\n }\n },\n });\n\n override disconnectedCallback(): void {\n this._unwireInput();\n super.disconnectedCallback();\n }\n\n override updated(): void {\n const $input = this._$nativeInput;\n if (!$input) return;\n\n $input.disabled = this.disabled;\n this._syncAriaAttributes($input);\n }\n\n override render() {\n const $input = this._$nativeInput;\n if (!$input) return nothing;\n\n const valueDisplay = html`\n <span\n part=\"value-display\"\n class=\"rc-slider-value\"\n style=${ifDefined(\n this.display === \"float\" ? this._floatStyle() : undefined,\n )}\n aria-hidden=\"true\"\n >\n <slot name=\"value-display\">${this._displayText}</slot>\n </span>\n `;\n\n return html`\n <div\n part=\"root\"\n class=\"rc-slider-root\"\n data-display=${this.display ?? nothing}\n data-orientation=${this.orientation}\n data-readonly=${this.readonly ? \"\" : nothing}\n data-disabled=${this.disabled ? \"\" : nothing}\n data-has-value-text=${this.valueText ? \"\" : nothing}\n >\n ${this.display === \"inline-start\" ? valueDisplay : nothing}\n\n <span part=\"control\" class=\"rc-slider-control\">\n <span part=\"track\" class=\"rc-slider-track\" aria-hidden=\"true\">\n <slot name=\"track-background\"></slot>\n <span\n part=\"progress\"\n class=\"rc-slider-progress\"\n style=${this._progressStyle()}\n ></span>\n </span>\n\n <slot @slotchange=${this._onDefaultSlotChange}></slot>\n ${this.display === \"float\" ? valueDisplay : nothing}\n </span>\n\n ${this.display === \"inline-end\" ? valueDisplay : nothing}\n </div>\n `;\n }\n\n private get _displayText(): string {\n return this.valueText || String(this.value);\n }\n\n private get _nativeInputValue(): number {\n const value = this._$nativeInput?.valueAsNumber;\n return value === undefined || isNaN(value) ? 0 : value;\n }\n\n private _setupInput($input: HTMLInputElement | null, $previous?: HTMLInputElement | null): void {\n if ($previous && $previous !== $input) {\n this._unwireInput($previous);\n }\n\n if (!$input) {\n this._$nativeInput = null;\n return;\n }\n\n // Mirror disabled state from the native input if not explicitly set on the host.\n // Pre-upgrade markup may carry <input disabled> before the component upgrades.\n if (!this.hasAttribute(\"disabled\") && $input.disabled) {\n this.disabled = true;\n }\n\n this._$nativeInput = $input;\n this._applyInitialValueToInput($input);\n this._wireInput($input);\n this.requestUpdate();\n }\n\n private _onDefaultSlotChange = (): void => {\n this._nativeInputController.sync();\n this.requestUpdate();\n };\n\n private _applyInitialValueToInput($input: HTMLInputElement): void {\n if (this._value !== undefined) {\n this._applyValueToInput(this._value);\n return;\n }\n\n if (this._defaultValue !== undefined) {\n this._applyValueToInput(this._defaultValue);\n return;\n }\n\n const value = $input.valueAsNumber;\n if (!isNaN(value)) {\n this._defaultValue = value;\n }\n }\n\n private _applyValueToInput(value: number): void {\n if (!this._$nativeInput) return;\n\n this._$nativeInput.value = String(value);\n }\n\n private _wireInput($input: HTMLInputElement): void {\n $input.addEventListener(\"input\", this._onInput);\n $input.addEventListener(\"change\", this._onChange);\n $input.addEventListener(\"keydown\", this._onKeydown);\n }\n\n private _unwireInput($input = this._$nativeInput): void {\n $input?.removeEventListener(\"input\", this._onInput);\n $input?.removeEventListener(\"change\", this._onChange);\n $input?.removeEventListener(\"keydown\", this._onKeydown);\n }\n\n private _syncAriaAttributes($input: HTMLInputElement): void {\n if (this.valueText) {\n $input.setAttribute(\"aria-valuetext\", this.valueText);\n } else {\n $input.removeAttribute(\"aria-valuetext\");\n }\n\n if (this.orientation === \"vertical\") {\n $input.setAttribute(\"aria-orientation\", \"vertical\");\n } else {\n $input.removeAttribute(\"aria-orientation\");\n }\n\n if (this.readonly) {\n $input.setAttribute(\"aria-readonly\", \"true\");\n } else {\n $input.removeAttribute(\"aria-readonly\");\n }\n }\n\n private readonly _onInput = (e: Event): void => {\n this._handleRangeEvent(e, \"rc-slider-input\");\n };\n\n private readonly _onChange = (e: Event): void => {\n this._handleRangeEvent(e, \"rc-slider-change\");\n };\n\n private _handleRangeEvent(\n e: Event,\n type: \"rc-slider-input\" | \"rc-slider-change\",\n ): void {\n const $input = e.currentTarget as HTMLInputElement;\n\n if (this.readonly) {\n $input.value = String(this.value);\n return;\n }\n\n this._commitInputValue($input);\n\n this.dispatchEvent(\n new CustomEvent<RCSliderValueEvent>(type, {\n bubbles: true,\n composed: true,\n detail: { value: this.value },\n }),\n );\n }\n\n private readonly _onKeydown = (e: KeyboardEvent): void => {\n if (this.disabled || this.readonly) return;\n if (e.key !== \"PageUp\" && e.key !== \"PageDown\") return;\n\n e.preventDefault();\n const $input = e.currentTarget as HTMLInputElement;\n\n if (e.key === \"PageUp\") $input.stepUp(10);\n else $input.stepDown(10);\n\n this._commitInputValue($input);\n\n this.dispatchEvent(\n new CustomEvent<RCSliderValueEvent>(\"rc-slider-input\", {\n bubbles: true,\n composed: true,\n detail: { value: this.value },\n }),\n );\n };\n\n private _commitInputValue($input: HTMLInputElement): void {\n const old = this.value;\n\n this._value = $input.valueAsNumber;\n this._valueInitialized = true;\n\n this.requestUpdate(\"value\", old);\n }\n\n private _progressStyle(): string {\n const $input = this._$nativeInput;\n if (!$input) return \"\";\n\n const min = parseAttr($input.min, 0);\n const max = parseAttr($input.max, 100);\n const pct = valueToPercent($input.valueAsNumber, min, max) * 100;\n\n if (this.orientation === \"vertical\") {\n return `bottom:0%;height:${pct.toFixed(3)}%`;\n }\n\n return `left:0%;width:${pct.toFixed(3)}%`;\n }\n\n private _floatStyle(): string {\n const $input = this._$nativeInput;\n if (!$input) return \"\";\n\n const min = parseAttr($input.min, 0);\n const max = parseAttr($input.max, 100);\n const pct = valueToPercent($input.valueAsNumber, min, max);\n const k = (1 - pct * 2).toFixed(4);\n\n if (this.orientation === \"vertical\") {\n return `bottom:calc(${(pct * 100).toFixed(3)}% + ${k} * var(--rc-thumb-radius, 9px))`;\n }\n\n return `left:calc(${(pct * 100).toFixed(3)}% + ${k} * var(--rc-thumb-radius, 9px))`;\n }\n}\n\nexport default RCSlider;\n"],"names":["displayConverter","v","parseAttr","s","defaultVal","n","_RCSlider","LitElement","NativeChildController","$input","$previous","e","old","nothing","valueDisplay","html","ifDefined","value","type","min","max","pct","valueToPercent","k","css","RCSlider","__decorateClass","property"],"mappings":"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"}