@rcarls/rc-range-slider 0.1.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/README.md +49 -0
- package/dist/custom-elements.json +1088 -0
- package/dist/demo.css +85 -0
- package/dist/demo.js +40 -0
- package/dist/rc-range-slider-CL02oFwb.js +613 -0
- package/dist/rc-range-slider-CL02oFwb.js.map +1 -0
- package/dist/rc-range-slider-define.js +6 -0
- package/dist/rc-range-slider-define.js.map +1 -0
- package/dist/rc-range-slider.js +5 -0
- package/dist/rc-range-slider.js.map +1 -0
- package/dist/types/packages/rc-range-slider/src/define.d.ts +1 -0
- package/dist/types/packages/rc-range-slider/src/index.d.ts +1 -0
- package/dist/types/packages/rc-range-slider/src/rc-range-slider.d.ts +156 -0
- package/dist/types/packages/rc-range-slider/src/rc-range-slider.test.d.ts +0 -0
- package/package.json +68 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rc-range-slider-CL02oFwb.js","sources":["../src/rc-range-slider.ts"],"sourcesContent":["import { LitElement, css, html, nothing } from \"lit\";\nimport type { ComplexAttributeConverter } from \"lit\";\nimport { property, state } from \"lit/decorators.js\";\nimport { snapToStep, valueToPercent } from \"@rcarls/rc-common\";\n\nexport interface RCRangeSliderValueEvent {\n /** Current [low, high] value tuple. */\n value: [number, number];\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n \"rc-range-slider\": RCRangeSlider;\n }\n\n interface HTMLElementEventMap {\n \"rc-range-slider-input\": CustomEvent<RCRangeSliderValueEvent>;\n \"rc-range-slider-change\": CustomEvent<RCRangeSliderValueEvent>;\n }\n}\n\ntype DisplayValue = \"float\" | \"inline-start\" | \"inline-end\" | null;\ntype RangeThumb = \"low\" | \"high\";\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\n const n = parseFloat(s);\n\n return isNaN(n) ? defaultVal : n;\n}\n\n/**\n * Dual-thumb range slider implementing the WAI-ARIA APG Slider (Multi-Thumb)\n * pattern with custom shadow-DOM slider thumbs.\n *\n * Consumers provide two direct child `<input type=\"range\">` elements. Before\n * upgrade, those inputs are the usable progressive-enhancement fallback. After\n * upgrade, the inputs remain in light DOM as hidden form reflectors while the\n * shadow thumbs become the focusable, accessible interaction surface.\n *\n * Form participation is handled natively by each input's `name` attribute.\n *\n * @slot - Consumer-provided native range inputs.\n * @slot track-background - Optional decorative content rendered inside the track before the selected range fill.\n * @slot low-value-display - Optional replacement for the low value text.\n * @slot high-value-display - Optional replacement for the high value text.\n *\n * @fires rc-range-slider-input - Fires while either thumb moves. Detail: `{ value }`.\n * @fires rc-range-slider-change - Fires when a thumb commits a new value. Detail: `{ value }`.\n *\n * @cssprop [--rc-range-slider-accent=Highlight] - Accent color for selected range, thumb border, focus, hover, and active states.\n * @cssprop [--rc-range-slider-gap=var(--rc-control-gap)] - Gap between track and inline value display.\n * @cssprop [--rc-range-slider-control-size=var(--rc-control-block-size)] - Track hit-area block size.\n * @cssprop [--rc-range-slider-track-background=color-mix(in srgb, CanvasText 25%, Canvas)] - Unselected track color.\n * @cssprop [--rc-range-slider-track-radius=var(--rc-control-radius)] - Track border radius.\n * @cssprop [--rc-range-slider-thumb-background=ButtonFace] - Thumb background color.\n * @cssprop [--rc-range-slider-thumb-border=var(--rc-range-slider-accent)] - Thumb border color.\n * @cssprop [--rc-range-slider-thumb-size=1.125rem] - Visual thumb inline/block size.\n * @cssprop [--rc-range-slider-value-color=var(--rc-text-disabled)] - Value display text color.\n * @cssprop [--rc-thumb-radius=9px] - Half the thumb width; used to align float value displays and range fill.\n * @cssprop [--rc-range-slider-float-value-block-offset=-1.4em] - Block-axis offset for horizontal float value displays.\n * @cssprop [--rc-range-slider-float-value-inline-offset=calc(100% + 0.5rem)] - Inline-axis offset for vertical float value displays.\n *\n * @csspart root - Root layout wrapper.\n * @csspart group - Slider group wrapper.\n * @csspart track - Visual slider track.\n * @csspart range - Filled selected range segment.\n * @csspart thumb - Shared custom slider thumb.\n * @csspart low-thumb - Low-value custom slider thumb.\n * @csspart high-thumb - High-value custom slider thumb.\n * @csspart value-display - Shared rendered value text.\n * @csspart low-value-display - Rendered low value text.\n * @csspart high-value-display - Rendered high value text.\n */\nexport class RCRangeSlider extends LitElement {\n static override styles = css`\n :host {\n --rc-range-slider-accent: var(--rc-accent, Highlight);\n --rc-range-slider-track-background: color-mix(in srgb, CanvasText 25%, Canvas);\n --rc-range-slider-range-background: var(--rc-range-slider-accent);\n --rc-range-slider-thumb-background: ButtonFace;\n --rc-range-slider-thumb-border: var(--rc-range-slider-accent);\n --rc-range-slider-thumb-hover-background: var(--rc-range-slider-accent);\n --rc-range-slider-thumb-hover-border: var(--rc-range-slider-accent);\n --rc-range-slider-thumb-active-background: var(--rc-range-slider-accent);\n --rc-range-slider-thumb-active-border: var(--rc-range-slider-accent);\n --rc-range-slider-focus-outline: var(--rc-range-slider-accent);\n display: block;\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 :host([disabled]) {\n --rc-range-slider-accent: GrayText;\n --rc-range-slider-track-background: color-mix(in srgb, GrayText 35%, Canvas);\n --rc-range-slider-range-background: GrayText;\n --rc-range-slider-thumb-border: GrayText;\n --rc-range-slider-thumb-hover-background: ButtonFace;\n --rc-range-slider-thumb-hover-border: GrayText;\n --rc-range-slider-thumb-active-background: ButtonFace;\n --rc-range-slider-thumb-active-border: GrayText;\n --rc-range-slider-focus-outline: GrayText;\n }\n\n .rc-range-slider-root {\n display: grid;\n gap: var(--rc-range-slider-gap, var(--rc-control-gap, 0.5rem));\n align-items: center;\n }\n\n .rc-range-slider-root[data-display=\"inline-start\"] {\n grid-template-columns: auto minmax(0, 1fr);\n }\n\n .rc-range-slider-root[data-display=\"inline-end\"] {\n grid-template-columns: minmax(0, 1fr) auto;\n }\n\n .rc-range-slider-group {\n position: relative;\n display: block;\n min-width: 0;\n min-height: var(--rc-range-slider-control-size, var(--rc-control-block-size, 1.5rem));\n touch-action: none;\n }\n\n .rc-range-slider-track,\n .rc-range-slider-range {\n position: absolute;\n pointer-events: none;\n }\n\n .rc-range-slider-track {\n inset-inline: 0;\n inset-block: calc(50% - var(--rc-range-slider-track-size, 0.1875rem) / 2);\n block-size: var(--rc-range-slider-track-size, 0.1875rem);\n background: var(--rc-range-slider-track-background);\n border-radius: var(--rc-range-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-range-slider-range {\n inset-block: 0;\n background: var(--rc-range-slider-range-background);\n border-radius: inherit;\n z-index: 1;\n }\n\n .rc-range-slider-thumb {\n position: absolute;\n z-index: 2;\n inline-size: var(--rc-range-slider-thumb-size, 1.125rem);\n block-size: var(--rc-range-slider-thumb-size, 1.125rem);\n background: var(--rc-range-slider-thumb-background);\n border: 2px solid var(--rc-range-slider-thumb-border);\n border-radius: 50%;\n box-sizing: border-box;\n cursor: grab;\n transform: translate(-50%, -50%);\n transition:\n background-color 120ms ease,\n border-color 120ms ease,\n box-shadow 120ms ease,\n transform var(--rc-motion-duration, 120ms) ease;\n }\n\n .rc-range-slider-thumb:focus-visible {\n outline: var(--rc-focus-ring, 2px solid var(--rc-range-slider-focus-outline));\n outline-offset: var(--rc-focus-ring-offset, 2px);\n }\n\n :host(:not([disabled]):not([readonly])) .rc-range-slider-thumb:hover {\n background: var(--rc-range-slider-thumb-hover-background);\n border-color: var(--rc-range-slider-thumb-hover-border);\n box-shadow: 0 0 0 0.25rem color-mix(in srgb, var(--rc-range-slider-accent) 20%, transparent);\n }\n\n :host(:not([disabled]):not([readonly])) .rc-range-slider-thumb:active {\n background: var(--rc-range-slider-thumb-active-background);\n border-color: var(--rc-range-slider-thumb-active-border);\n box-shadow: 0 0 0 0.35rem color-mix(in srgb, var(--rc-range-slider-accent) 28%, transparent);\n cursor: grabbing;\n }\n\n :host(:not([disabled]):not([readonly])) .rc-range-slider-group:hover .rc-range-slider-track {\n background: color-mix(in srgb, var(--rc-range-slider-track-background) 70%, CanvasText);\n }\n\n .rc-range-slider-thumb[aria-disabled=\"true\"],\n .rc-range-slider-thumb[aria-readonly=\"true\"] {\n cursor: default;\n }\n\n :host([disabled]) .rc-range-slider-root {\n opacity: 0.65;\n }\n\n ::slotted(input[type=\"range\"]) {\n position: absolute;\n inline-size: 1px;\n block-size: 1px;\n margin: 0;\n padding: 0;\n border: 0;\n clip-path: inset(50%);\n opacity: 0;\n overflow: hidden;\n pointer-events: none;\n }\n\n .rc-range-slider-values {\n pointer-events: none;\n font-variant-numeric: tabular-nums;\n white-space: nowrap;\n color: var(--rc-range-slider-value-color, var(--rc-text-disabled, GrayText));\n }\n\n .rc-range-slider-root[data-display=\"float\"] .rc-range-slider-values {\n position: absolute;\n inset: 0;\n z-index: 5;\n }\n\n .rc-range-slider-root[data-display=\"float\"] .rc-range-slider-value {\n position: absolute;\n inset-block-start: var(--rc-range-slider-float-value-block-offset, -1.4em);\n transform: translateX(-50%);\n }\n\n .rc-range-slider-root[data-display=\"inline-start\"] .rc-range-slider-values,\n .rc-range-slider-root[data-display=\"inline-end\"] .rc-range-slider-values {\n display: flex;\n gap: 0.25em;\n align-items: center;\n }\n\n .rc-range-slider-root[data-display=\"inline-start\"] .rc-range-slider-value:first-child::after,\n .rc-range-slider-root[data-display=\"inline-end\"] .rc-range-slider-value:first-child::after {\n content: \" -\";\n }\n\n :host([orientation=\"vertical\"]) {\n display: inline-block;\n }\n\n :host([orientation=\"vertical\"]) .rc-range-slider-group {\n inline-size: var(--rc-range-slider-control-size, var(--rc-control-block-size, 1.5rem));\n block-size: var(--rc-range-slider-vertical-size, 12.5rem);\n }\n\n :host([orientation=\"vertical\"]) .rc-range-slider-track {\n inset-block: 0;\n inset-inline: calc(50% - var(--rc-range-slider-track-size, 0.1875rem) / 2);\n inline-size: var(--rc-range-slider-track-size, 0.1875rem);\n block-size: auto;\n }\n\n :host([orientation=\"vertical\"]) .rc-range-slider-range {\n inset-inline: 0;\n inset-block-start: auto;\n }\n\n :host([orientation=\"vertical\"]) .rc-range-slider-thumb {\n inset-inline-start: 50%;\n transform: translate(-50%, 50%);\n }\n\n :host([orientation=\"vertical\"]) .rc-range-slider-root[data-display=\"float\"] .rc-range-slider-value {\n inset-block-start: auto;\n inset-inline-start: var(--rc-range-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, number] | undefined;\n private _defaultValue: [number, number] | undefined;\n private _valueInitialized = false;\n\n /** Current [low, high] value. Assign a new tuple reference to trigger a re-render. */\n @property({ attribute: false })\n get value(): [number, number] {\n return this._value ?? this._defaultValue ?? this._nativeInputValue;\n }\n set value(v: [number, number]) {\n const old = this._value;\n this._value = this._normalizeValue(v);\n this._valueInitialized = true;\n this._applyValueToInputs(this._value);\n if (this._value !== old) {\n this.requestUpdate(\"value\", old);\n }\n }\n\n /** Initial uncontrolled [low, high] value. Has no effect after the first user interaction or `value` write. */\n @property({ attribute: false })\n get defaultValue(): [number, number] | undefined {\n return this._defaultValue;\n }\n set defaultValue(v: [number, number] | undefined) {\n const old = this._defaultValue;\n this._defaultValue = v === undefined ? undefined : this._normalizeValue(v);\n if (\n !this._valueInitialized &&\n this._value === undefined &&\n this._defaultValue !== undefined\n ) {\n this._applyValueToInputs(this._defaultValue);\n this.requestUpdate(\"value\", undefined);\n }\n this.requestUpdate(\"defaultValue\", old);\n }\n\n /** Disable both thumbs and their hidden native input reflectors. */\n @property({ type: Boolean, reflect: true }) disabled = false;\n\n /** Prevents edits while preserving normal focus and display. */\n @property({ type: Boolean, reflect: true }) readonly = false;\n\n /** Accessible label for the low (min) thumb when the input does not provide one. */\n @property({ attribute: \"low-label\" }) lowLabel = \"Minimum\";\n\n /** Accessible label for the high (max) thumb when the input does not provide one. */\n @property({ attribute: \"high-label\" }) highLabel = \"Maximum\";\n\n /** Formatted screen-reader text for the low value. Falls back to the raw number. */\n @property({ attribute: \"low-value-text\" }) lowValueText = \"\";\n\n /** Formatted screen-reader text for the high value. Falls back to the raw number. */\n @property({ attribute: \"high-value-text\" }) highValueText = \"\";\n\n /**\n * Controls the live value display.\n *\n * - Absent (default) — no value shown.\n * - `display` or `display=\"float\"` — floats each value above its thumb.\n * - `display=\"inline-start\"` — renders the value container before the track.\n * - `display=\"inline-end\"` — renders the value container after the track.\n */\n @property({ reflect: true, converter: displayConverter })\n display: DisplayValue = null;\n\n /** Orientation; reflected as an attribute and forwarded to custom thumbs. */\n @property({ reflect: true }) orientation: \"horizontal\" | \"vertical\" =\n \"horizontal\";\n\n @state() private _lowValue = 0;\n @state() private _highValue = 100;\n\n private _lowInput: HTMLInputElement | null = null;\n private _highInput: HTMLInputElement | null = null;\n private _dragThumb: RangeThumb | null = null;\n private _dragPointerId: number | null = null;\n private _addedHostRole = false;\n\n override connectedCallback(): void {\n super.connectedCallback();\n this._syncHostRole();\n this._findInputs();\n }\n\n override disconnectedCallback(): void {\n this._unwireInputs();\n this._restoreInputs();\n if (this._addedHostRole) {\n this.removeAttribute(\"role\");\n this._addedHostRole = false;\n }\n super.disconnectedCallback();\n }\n\n override updated(): void {\n this._syncInputReflectors();\n }\n\n override render() {\n const lo = this._lowInput;\n const hi = this._highInput;\n if (!lo || !hi) return nothing;\n\n const lowText = this.lowValueText || String(this._lowValue);\n const highText = this.highValueText || String(this._highValue);\n\n const valuesContainer = html`\n <span class=\"rc-range-slider-values\" aria-hidden=\"true\">\n <span\n part=\"value-display low-value-display\"\n class=\"rc-range-slider-value\"\n style=${this.display === \"float\"\n ? this._floatStyle(this._lowValue)\n : nothing}\n ><slot name=\"low-value-display\">${lowText}</slot></span\n >\n <span\n part=\"value-display high-value-display\"\n class=\"rc-range-slider-value\"\n style=${this.display === \"float\"\n ? this._floatStyle(this._highValue)\n : nothing}\n ><slot name=\"high-value-display\">${highText}</slot></span\n >\n </span>\n `;\n\n return html`\n <div\n part=\"root\"\n class=\"rc-range-slider-root\"\n data-display=${this.display ?? nothing}\n data-orientation=${this.orientation}\n >\n ${this.display === \"inline-start\" ? valuesContainer : nothing}\n\n <div\n part=\"group\"\n class=\"rc-range-slider-group\"\n @pointerdown=${this._onGroupPointerDown}\n @pointermove=${this._onGroupPointerMove}\n @pointerup=${this._onGroupPointerUp}\n @pointercancel=${this._onGroupPointerCancel}\n >\n <span part=\"track\" class=\"rc-range-slider-track\" aria-hidden=\"true\">\n <slot name=\"track-background\"></slot>\n <span\n part=\"range\"\n class=\"rc-range-slider-range\"\n style=${this._rangeStyle()}\n ></span>\n </span>\n\n ${this._renderThumb(\"low\")} ${this._renderThumb(\"high\")}\n <slot @slotchange=${this._onDefaultSlotChange}></slot>\n ${this.display === \"float\" ? valuesContainer : nothing}\n </div>\n\n ${this.display === \"inline-end\" ? valuesContainer : nothing}\n </div>\n `;\n }\n\n private _renderThumb(thumb: RangeThumb) {\n const isLow = thumb === \"low\";\n const input = isLow ? this._lowInput : this._highInput;\n const value = isLow ? this._lowValue : this._highValue;\n const valueText = isLow ? this.lowValueText : this.highValueText;\n const label = this._thumbLabel(thumb);\n const labelledBy = input?.getAttribute(\"aria-labelledby\");\n\n return html`\n <span\n part=${isLow ? \"thumb low-thumb\" : \"thumb high-thumb\"}\n class=\"rc-range-slider-thumb\"\n data-thumb=${thumb}\n role=\"slider\"\n tabindex=${this.disabled ? \"-1\" : \"0\"}\n aria-label=${label ?? nothing}\n aria-labelledby=${labelledBy ?? nothing}\n aria-valuemin=${String(isLow ? this._min() : this._lowValue)}\n aria-valuemax=${String(isLow ? this._highValue : this._max())}\n aria-valuenow=${String(value)}\n aria-valuetext=${valueText || nothing}\n aria-orientation=${this.orientation}\n aria-disabled=${this.disabled ? \"true\" : nothing}\n aria-readonly=${this.readonly ? \"true\" : nothing}\n style=${this._thumbStyle(value)}\n @keydown=${isLow ? this._onLowKeydown : this._onHighKeydown}\n ></span>\n `;\n }\n\n /**\n * Finds the first two child `<input type=\"range\">` elements and wires them.\n * Inputs remain in the DOM permanently as form/progressive-enhancement\n * reflectors.\n */\n private _findInputs(): void {\n const inputs = Array.from(\n this.querySelectorAll<HTMLInputElement>('input[type=\"range\"]'),\n ).slice(0, 2);\n\n if (inputs.length < 2) {\n console.warn(\n '[rc-range-slider] Requires two child <input type=\"range\"> elements.',\n );\n return;\n }\n\n const [lo, hi] = inputs as [HTMLInputElement, HTMLInputElement];\n\n if (!this.hasAttribute(\"disabled\") && (lo.disabled || hi.disabled)) {\n this.disabled = true;\n }\n\n this._lowInput = lo;\n this._highInput = hi;\n this._applyInitialValueToInputs(lo, hi);\n\n this._wireInput(lo, this._onLowInput, this._onLowChange);\n this._wireInput(hi, this._onHighInput, this._onHighChange);\n this._syncInputReflectors();\n }\n\n private _onDefaultSlotChange = (): void => {\n this._unwireInputs();\n this._restoreInputs();\n this._findInputs();\n this.requestUpdate();\n };\n\n private get _nativeInputValue(): [number, number] {\n const low = this._lowInput?.valueAsNumber;\n const high = this._highInput?.valueAsNumber;\n\n return [\n low === undefined || isNaN(low) ? this.min : low,\n high === undefined || isNaN(high) ? this.max : high,\n ];\n }\n\n private _applyInitialValueToInputs(\n lowInput: HTMLInputElement,\n highInput: HTMLInputElement,\n ): void {\n if (this._value !== undefined) {\n this._applyValueToInputs(this._value);\n return;\n }\n\n if (this._defaultValue !== undefined) {\n this._applyValueToInputs(this._defaultValue);\n return;\n }\n\n const lowValue = lowInput.valueAsNumber;\n const highValue = highInput.valueAsNumber;\n\n this._lowValue = isNaN(lowValue) ? this._min() : lowValue;\n this._highValue = isNaN(highValue) ? this._max() : highValue;\n this._defaultValue = this._normalizeValue([this._lowValue, this._highValue]);\n this._applyValueToInputs(this._defaultValue);\n }\n\n private _applyValueToInputs(value: [number, number]): void {\n const [low, high] = this._normalizeValue(value);\n this._lowValue = low;\n this._highValue = high;\n\n if (this._lowInput) this._lowInput.value = String(low);\n if (this._highInput) this._highInput.value = String(high);\n }\n\n private _setCurrentValue(value: [number, number]): void {\n const [low, high] = this._normalizeValue(value);\n this._value = [low, high];\n this._valueInitialized = true;\n this._applyValueToInputs(this._value);\n this.requestUpdate(\"value\");\n }\n\n private _wireInput(\n input: HTMLInputElement,\n onInput: (e: Event) => void,\n onChange: (e: Event) => void,\n ): void {\n input.addEventListener(\"input\", onInput);\n input.addEventListener(\"change\", onChange);\n }\n\n private _unwireInputs(): void {\n this._lowInput?.removeEventListener(\"input\", this._onLowInput);\n this._lowInput?.removeEventListener(\"change\", this._onLowChange);\n\n this._highInput?.removeEventListener(\"input\", this._onHighInput);\n this._highInput?.removeEventListener(\"change\", this._onHighChange);\n }\n\n private _restoreInputs(): void {\n for (const input of [this._lowInput, this._highInput]) {\n input?.removeAttribute(\"aria-hidden\");\n input?.removeAttribute(\"tabindex\");\n input?.removeAttribute(\"data-rc-range-slider-reflector\");\n input?.style.removeProperty(\"display\");\n }\n }\n\n private _syncInputReflectors(): void {\n const lo = this._lowInput;\n const hi = this._highInput;\n if (!lo || !hi) return;\n\n for (const input of [lo, hi]) {\n input.disabled = this.disabled;\n input.tabIndex = -1;\n input.setAttribute(\"aria-hidden\", \"true\");\n input.setAttribute(\"data-rc-range-slider-reflector\", \"\");\n }\n }\n\n private _syncHostRole(): void {\n if (this.hasAttribute(\"role\")) return;\n\n this.setAttribute(\"role\", \"group\");\n this._addedHostRole = true;\n }\n\n private readonly _onLowInput = (e: Event): void => {\n if (this.readonly) {\n this._applyValueToInputs([this._lowValue, this._highValue]);\n return;\n }\n\n const input = e.currentTarget as HTMLInputElement;\n this._setCurrentValue([input.valueAsNumber, this._highValue]);\n this._dispatch(\"rc-range-slider-input\", this.value);\n };\n\n private readonly _onLowChange = (e: Event): void => {\n if (this.readonly) {\n this._applyValueToInputs([this._lowValue, this._highValue]);\n return;\n }\n\n const input = e.currentTarget as HTMLInputElement;\n this._setCurrentValue([input.valueAsNumber, this._highValue]);\n this._dispatch(\"rc-range-slider-change\", this.value);\n };\n\n private readonly _onHighInput = (e: Event): void => {\n if (this.readonly) {\n this._applyValueToInputs([this._lowValue, this._highValue]);\n return;\n }\n\n const input = e.currentTarget as HTMLInputElement;\n this._setCurrentValue([this._lowValue, input.valueAsNumber]);\n this._dispatch(\"rc-range-slider-input\", this.value);\n };\n\n private readonly _onHighChange = (e: Event): void => {\n if (this.readonly) {\n this._applyValueToInputs([this._lowValue, this._highValue]);\n return;\n }\n\n const input = e.currentTarget as HTMLInputElement;\n this._setCurrentValue([this._lowValue, input.valueAsNumber]);\n this._dispatch(\"rc-range-slider-change\", this.value);\n };\n\n /** APG keyboard contract for the low thumb. */\n private readonly _onLowKeydown = (e: KeyboardEvent): void => {\n this._handleThumbKeydown(e, \"low\");\n };\n\n /** APG keyboard contract for the high thumb. */\n private readonly _onHighKeydown = (e: KeyboardEvent): void => {\n this._handleThumbKeydown(e, \"high\");\n };\n\n private _handleThumbKeydown(e: KeyboardEvent, thumb: RangeThumb): void {\n if (this.disabled || this.readonly) return;\n\n const min = this._min();\n const max = this._max();\n const step = this._step();\n const bigStep = step * 10;\n const low = this._lowValue;\n const high = this._highValue;\n const current = thumb === \"low\" ? low : high;\n const effectiveMin = thumb === \"low\" ? min : low;\n const effectiveMax = thumb === \"low\" ? high : max;\n\n let next: number | null = null;\n\n switch (e.key) {\n case \"ArrowRight\":\n case \"ArrowUp\":\n next = current + step;\n break;\n case \"ArrowLeft\":\n case \"ArrowDown\":\n next = current - step;\n break;\n case \"PageUp\":\n next = current + bigStep;\n break;\n case \"PageDown\":\n next = current - bigStep;\n break;\n case \"Home\":\n next = effectiveMin;\n break;\n case \"End\":\n next = effectiveMax;\n break;\n default:\n return;\n }\n\n e.preventDefault();\n\n const nextValue = snapToStep(next, effectiveMin, effectiveMax, step);\n if (nextValue === current) return;\n\n this._setThumbValue(thumb, nextValue);\n this._dispatch(\"rc-range-slider-input\", this.value);\n }\n\n private _onGroupPointerDown(e: PointerEvent): void {\n if (this.disabled || this.readonly || e.button !== 0) return;\n\n const thumb = this._nearestThumb(e);\n const thumbEl = this._thumbElement(thumb);\n this._dragThumb = thumb;\n this._dragPointerId = e.pointerId;\n\n e.preventDefault();\n try {\n (e.currentTarget as HTMLElement).setPointerCapture(e.pointerId);\n } catch {\n // Synthetic browser-test PointerEvents are not active pointer streams.\n }\n thumbEl?.focus();\n this._setThumbValue(thumb, this._valueFromPointer(e, thumb));\n this._dispatch(\"rc-range-slider-input\", this.value);\n }\n\n private _onGroupPointerMove(e: PointerEvent): void {\n if (this._dragPointerId !== e.pointerId || this._dragThumb === null) return;\n\n e.preventDefault();\n this._setThumbValue(this._dragThumb, this._valueFromPointer(e, this._dragThumb));\n this._dispatch(\"rc-range-slider-input\", this.value);\n }\n\n private _onGroupPointerUp(e: PointerEvent): void {\n if (this._dragPointerId !== e.pointerId || this._dragThumb === null) return;\n\n const thumb = this._dragThumb;\n this._dragThumb = null;\n this._dragPointerId = null;\n try {\n (e.currentTarget as HTMLElement).releasePointerCapture(e.pointerId);\n } catch {\n // Synthetic browser-test PointerEvents are not active pointer streams.\n }\n this._dispatch(\"rc-range-slider-change\", this.value);\n this._thumbElement(thumb)?.focus();\n }\n\n private _onGroupPointerCancel(e: PointerEvent): void {\n if (this._dragPointerId !== e.pointerId) return;\n\n this._dragThumb = null;\n this._dragPointerId = null;\n }\n\n private _setThumbValue(thumb: RangeThumb, value: number): void {\n if (thumb === \"low\") {\n this._setCurrentValue([value, this._highValue]);\n return;\n }\n\n this._setCurrentValue([this._lowValue, value]);\n }\n\n private _valueFromPointer(e: PointerEvent, thumb: RangeThumb): number {\n const rect = this._groupRect();\n if (!rect) return thumb === \"low\" ? this._lowValue : this._highValue;\n\n const min = thumb === \"low\" ? this._min() : this._lowValue;\n const max = thumb === \"low\" ? this._highValue : this._max();\n const span = this._max() - this._min();\n if (span <= 0) return min;\n\n const pct =\n this.orientation === \"vertical\"\n ? 1 - (e.clientY - rect.top) / rect.height\n : (e.clientX - rect.left) / rect.width;\n const raw = pct * span + this._min();\n\n return snapToStep(raw, min, max, this._step());\n }\n\n private _nearestThumb(e: PointerEvent): RangeThumb {\n const value = this._valueFromPointer(e, \"low\");\n const lowDistance = Math.abs(value - this._lowValue);\n const highDistance = Math.abs(value - this._highValue);\n\n if (lowDistance === highDistance) {\n return value < this._lowValue ? \"low\" : \"high\";\n }\n\n return lowDistance < highDistance ? \"low\" : \"high\";\n }\n\n private _rangeStyle(): string {\n const loPct = valueToPercent(this._lowValue, this._min(), this._max());\n const hiPct = valueToPercent(this._highValue, this._min(), this._max());\n const loCenter = this._thumbCenterStyle(loPct);\n const hiCenter = this._thumbCenterStyle(hiPct);\n\n if (this.orientation === \"vertical\") {\n return [\n `bottom:${loCenter}`,\n `height:max(0px, calc(${hiCenter} - ${loCenter}))`,\n ].join(\";\");\n }\n\n return [\n `left:${loCenter}`,\n `width:max(0px, calc(${hiCenter} - ${loCenter}))`,\n ].join(\";\");\n }\n\n private _thumbStyle(value: number): string {\n const pct = valueToPercent(value, this._min(), this._max());\n const center = this._thumbCenterStyle(pct);\n\n if (this.orientation === \"vertical\") {\n return `bottom:${center}`;\n }\n\n return `left:${center};top:50%`;\n }\n\n private _thumbCenterStyle(pct: number): string {\n const k = (1 - pct * 2).toFixed(4);\n\n return `calc(${(pct * 100).toFixed(3)}% + ${k} * var(--rc-thumb-radius, 9px))`;\n }\n\n private _floatStyle(value: number): string {\n const pct = valueToPercent(value, this._min(), this._max());\n const center = this._thumbCenterStyle(pct);\n\n if (this.orientation === \"vertical\") {\n return `bottom:${center}`;\n }\n\n return `left:${center}`;\n }\n\n private _normalizeValue([low, high]: [number, number]): [number, number] {\n const min = this._min();\n const max = this._max();\n const steppedLow = snapToStep(low, min, max, this._step());\n const steppedHigh = snapToStep(high, min, max, this._step());\n\n return [Math.min(steppedLow, steppedHigh), Math.max(steppedLow, steppedHigh)];\n }\n\n private _min(): number {\n return parseAttr(this._lowInput?.min ?? \"\", this.min);\n }\n\n private _max(): number {\n return parseAttr(this._highInput?.max ?? \"\", this.max);\n }\n\n private _step(): number {\n return parseAttr(this._lowInput?.step ?? \"\", this.step);\n }\n\n private _groupRect(): DOMRect | null {\n return this.shadowRoot\n ?.querySelector<HTMLElement>(\".rc-range-slider-group\")\n ?.getBoundingClientRect() ?? null;\n }\n\n private _thumbElement(thumb: RangeThumb): HTMLElement | null {\n return (\n this.shadowRoot?.querySelector<HTMLElement>(`[data-thumb=\"${thumb}\"]`) ??\n null\n );\n }\n\n private _thumbLabel(thumb: RangeThumb): string | null {\n const input = thumb === \"low\" ? this._lowInput : this._highInput;\n const fallback = thumb === \"low\" ? this.lowLabel : this.highLabel;\n const explicitLabel = input?.getAttribute(\"aria-label\");\n if (explicitLabel) return explicitLabel;\n\n const nativeLabel = input?.labels?.[0]?.textContent?.trim();\n if (nativeLabel) return nativeLabel;\n\n return fallback || null;\n }\n\n private _dispatch(\n type: \"rc-range-slider-input\" | \"rc-range-slider-change\",\n value: [number, number],\n ): void {\n this.dispatchEvent(\n new CustomEvent<RCRangeSliderValueEvent>(type, {\n bubbles: true,\n composed: true,\n detail: { value },\n }),\n );\n }\n}\n\nexport default RCRangeSlider;\n"],"names":["displayConverter","v","parseAttr","s","defaultVal","n","_RCRangeSlider","LitElement","e","input","old","lo","hi","nothing","lowText","highText","valuesContainer","html","thumb","isLow","value","valueText","label","labelledBy","inputs","low","high","lowInput","highInput","lowValue","highValue","onInput","onChange","min","max","step","bigStep","current","effectiveMin","effectiveMax","next","nextValue","snapToStep","thumbEl","rect","span","raw","lowDistance","highDistance","loPct","valueToPercent","hiPct","loCenter","hiCenter","pct","center","k","steppedLow","steppedHigh","fallback","explicitLabel","nativeLabel","type","css","RCRangeSlider","__decorateClass","property","state"],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rc-range-slider-define.js","sources":["../src/define.ts"],"sourcesContent":["import { RCRangeSlider } from './index.js';\n\ncustomElements.get('rc-range-slider') || customElements.define('rc-range-slider', RCRangeSlider);\n\nexport * from './index.js';\n"],"names":["RCRangeSlider"],"mappings":";AAEA,eAAe,IAAI,iBAAiB,KAAK,eAAe,OAAO,mBAAmBA,CAAa;"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rc-range-slider.js","sources":[],"sourcesContent":[],"names":[],"mappings":";"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './index.js';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './rc-range-slider.js';
|
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
import { LitElement, nothing } from 'lit';
|
|
2
|
+
export interface RCRangeSliderValueEvent {
|
|
3
|
+
/** Current [low, high] value tuple. */
|
|
4
|
+
value: [number, number];
|
|
5
|
+
}
|
|
6
|
+
declare global {
|
|
7
|
+
interface HTMLElementTagNameMap {
|
|
8
|
+
"rc-range-slider": RCRangeSlider;
|
|
9
|
+
}
|
|
10
|
+
interface HTMLElementEventMap {
|
|
11
|
+
"rc-range-slider-input": CustomEvent<RCRangeSliderValueEvent>;
|
|
12
|
+
"rc-range-slider-change": CustomEvent<RCRangeSliderValueEvent>;
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
type DisplayValue = "float" | "inline-start" | "inline-end" | null;
|
|
16
|
+
/**
|
|
17
|
+
* Dual-thumb range slider implementing the WAI-ARIA APG Slider (Multi-Thumb)
|
|
18
|
+
* pattern with custom shadow-DOM slider thumbs.
|
|
19
|
+
*
|
|
20
|
+
* Consumers provide two direct child `<input type="range">` elements. Before
|
|
21
|
+
* upgrade, those inputs are the usable progressive-enhancement fallback. After
|
|
22
|
+
* upgrade, the inputs remain in light DOM as hidden form reflectors while the
|
|
23
|
+
* shadow thumbs become the focusable, accessible interaction surface.
|
|
24
|
+
*
|
|
25
|
+
* Form participation is handled natively by each input's `name` attribute.
|
|
26
|
+
*
|
|
27
|
+
* @slot - Consumer-provided native range inputs.
|
|
28
|
+
* @slot track-background - Optional decorative content rendered inside the track before the selected range fill.
|
|
29
|
+
* @slot low-value-display - Optional replacement for the low value text.
|
|
30
|
+
* @slot high-value-display - Optional replacement for the high value text.
|
|
31
|
+
*
|
|
32
|
+
* @fires rc-range-slider-input - Fires while either thumb moves. Detail: `{ value }`.
|
|
33
|
+
* @fires rc-range-slider-change - Fires when a thumb commits a new value. Detail: `{ value }`.
|
|
34
|
+
*
|
|
35
|
+
* @cssprop [--rc-range-slider-accent=Highlight] - Accent color for selected range, thumb border, focus, hover, and active states.
|
|
36
|
+
* @cssprop [--rc-range-slider-gap=var(--rc-control-gap)] - Gap between track and inline value display.
|
|
37
|
+
* @cssprop [--rc-range-slider-control-size=var(--rc-control-block-size)] - Track hit-area block size.
|
|
38
|
+
* @cssprop [--rc-range-slider-track-background=color-mix(in srgb, CanvasText 25%, Canvas)] - Unselected track color.
|
|
39
|
+
* @cssprop [--rc-range-slider-track-radius=var(--rc-control-radius)] - Track border radius.
|
|
40
|
+
* @cssprop [--rc-range-slider-thumb-background=ButtonFace] - Thumb background color.
|
|
41
|
+
* @cssprop [--rc-range-slider-thumb-border=var(--rc-range-slider-accent)] - Thumb border color.
|
|
42
|
+
* @cssprop [--rc-range-slider-thumb-size=1.125rem] - Visual thumb inline/block size.
|
|
43
|
+
* @cssprop [--rc-range-slider-value-color=var(--rc-text-disabled)] - Value display text color.
|
|
44
|
+
* @cssprop [--rc-thumb-radius=9px] - Half the thumb width; used to align float value displays and range fill.
|
|
45
|
+
* @cssprop [--rc-range-slider-float-value-block-offset=-1.4em] - Block-axis offset for horizontal float value displays.
|
|
46
|
+
* @cssprop [--rc-range-slider-float-value-inline-offset=calc(100% + 0.5rem)] - Inline-axis offset for vertical float value displays.
|
|
47
|
+
*
|
|
48
|
+
* @csspart root - Root layout wrapper.
|
|
49
|
+
* @csspart group - Slider group wrapper.
|
|
50
|
+
* @csspart track - Visual slider track.
|
|
51
|
+
* @csspart range - Filled selected range segment.
|
|
52
|
+
* @csspart thumb - Shared custom slider thumb.
|
|
53
|
+
* @csspart low-thumb - Low-value custom slider thumb.
|
|
54
|
+
* @csspart high-thumb - High-value custom slider thumb.
|
|
55
|
+
* @csspart value-display - Shared rendered value text.
|
|
56
|
+
* @csspart low-value-display - Rendered low value text.
|
|
57
|
+
* @csspart high-value-display - Rendered high value text.
|
|
58
|
+
*/
|
|
59
|
+
export declare class RCRangeSlider extends LitElement {
|
|
60
|
+
static styles: import('lit').CSSResult;
|
|
61
|
+
/** Minimum slider value. */
|
|
62
|
+
min: number;
|
|
63
|
+
/** Maximum slider value. */
|
|
64
|
+
max: number;
|
|
65
|
+
/** Slider step. */
|
|
66
|
+
step: number;
|
|
67
|
+
private _value;
|
|
68
|
+
private _defaultValue;
|
|
69
|
+
private _valueInitialized;
|
|
70
|
+
/** Current [low, high] value. Assign a new tuple reference to trigger a re-render. */
|
|
71
|
+
get value(): [number, number];
|
|
72
|
+
set value(v: [number, number]);
|
|
73
|
+
/** Initial uncontrolled [low, high] value. Has no effect after the first user interaction or `value` write. */
|
|
74
|
+
get defaultValue(): [number, number] | undefined;
|
|
75
|
+
set defaultValue(v: [number, number] | undefined);
|
|
76
|
+
/** Disable both thumbs and their hidden native input reflectors. */
|
|
77
|
+
disabled: boolean;
|
|
78
|
+
/** Prevents edits while preserving normal focus and display. */
|
|
79
|
+
readonly: boolean;
|
|
80
|
+
/** Accessible label for the low (min) thumb when the input does not provide one. */
|
|
81
|
+
lowLabel: string;
|
|
82
|
+
/** Accessible label for the high (max) thumb when the input does not provide one. */
|
|
83
|
+
highLabel: string;
|
|
84
|
+
/** Formatted screen-reader text for the low value. Falls back to the raw number. */
|
|
85
|
+
lowValueText: string;
|
|
86
|
+
/** Formatted screen-reader text for the high value. Falls back to the raw number. */
|
|
87
|
+
highValueText: string;
|
|
88
|
+
/**
|
|
89
|
+
* Controls the live value display.
|
|
90
|
+
*
|
|
91
|
+
* - Absent (default) — no value shown.
|
|
92
|
+
* - `display` or `display="float"` — floats each value above its thumb.
|
|
93
|
+
* - `display="inline-start"` — renders the value container before the track.
|
|
94
|
+
* - `display="inline-end"` — renders the value container after the track.
|
|
95
|
+
*/
|
|
96
|
+
display: DisplayValue;
|
|
97
|
+
/** Orientation; reflected as an attribute and forwarded to custom thumbs. */
|
|
98
|
+
orientation: "horizontal" | "vertical";
|
|
99
|
+
private _lowValue;
|
|
100
|
+
private _highValue;
|
|
101
|
+
private _lowInput;
|
|
102
|
+
private _highInput;
|
|
103
|
+
private _dragThumb;
|
|
104
|
+
private _dragPointerId;
|
|
105
|
+
private _addedHostRole;
|
|
106
|
+
connectedCallback(): void;
|
|
107
|
+
disconnectedCallback(): void;
|
|
108
|
+
updated(): void;
|
|
109
|
+
render(): typeof nothing | import('lit').TemplateResult<1>;
|
|
110
|
+
private _renderThumb;
|
|
111
|
+
/**
|
|
112
|
+
* Finds the first two child `<input type="range">` elements and wires them.
|
|
113
|
+
* Inputs remain in the DOM permanently as form/progressive-enhancement
|
|
114
|
+
* reflectors.
|
|
115
|
+
*/
|
|
116
|
+
private _findInputs;
|
|
117
|
+
private _onDefaultSlotChange;
|
|
118
|
+
private get _nativeInputValue();
|
|
119
|
+
private _applyInitialValueToInputs;
|
|
120
|
+
private _applyValueToInputs;
|
|
121
|
+
private _setCurrentValue;
|
|
122
|
+
private _wireInput;
|
|
123
|
+
private _unwireInputs;
|
|
124
|
+
private _restoreInputs;
|
|
125
|
+
private _syncInputReflectors;
|
|
126
|
+
private _syncHostRole;
|
|
127
|
+
private readonly _onLowInput;
|
|
128
|
+
private readonly _onLowChange;
|
|
129
|
+
private readonly _onHighInput;
|
|
130
|
+
private readonly _onHighChange;
|
|
131
|
+
/** APG keyboard contract for the low thumb. */
|
|
132
|
+
private readonly _onLowKeydown;
|
|
133
|
+
/** APG keyboard contract for the high thumb. */
|
|
134
|
+
private readonly _onHighKeydown;
|
|
135
|
+
private _handleThumbKeydown;
|
|
136
|
+
private _onGroupPointerDown;
|
|
137
|
+
private _onGroupPointerMove;
|
|
138
|
+
private _onGroupPointerUp;
|
|
139
|
+
private _onGroupPointerCancel;
|
|
140
|
+
private _setThumbValue;
|
|
141
|
+
private _valueFromPointer;
|
|
142
|
+
private _nearestThumb;
|
|
143
|
+
private _rangeStyle;
|
|
144
|
+
private _thumbStyle;
|
|
145
|
+
private _thumbCenterStyle;
|
|
146
|
+
private _floatStyle;
|
|
147
|
+
private _normalizeValue;
|
|
148
|
+
private _min;
|
|
149
|
+
private _max;
|
|
150
|
+
private _step;
|
|
151
|
+
private _groupRect;
|
|
152
|
+
private _thumbElement;
|
|
153
|
+
private _thumbLabel;
|
|
154
|
+
private _dispatch;
|
|
155
|
+
}
|
|
156
|
+
export default RCRangeSlider;
|
|
File without changes
|
package/package.json
ADDED
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@rcarls/rc-range-slider",
|
|
3
|
+
"publishConfig": {
|
|
4
|
+
"access": "public"
|
|
5
|
+
},
|
|
6
|
+
"version": "0.1.0",
|
|
7
|
+
"description": "Headless WAI-ARIA range slider web component built with Lit",
|
|
8
|
+
"repository": {
|
|
9
|
+
"type": "git",
|
|
10
|
+
"url": "git+https://github.com/richardcarls/rc-webcomponents.git",
|
|
11
|
+
"directory": "packages/rc-range-slider"
|
|
12
|
+
},
|
|
13
|
+
"homepage": "https://github.com/richardcarls/rc-webcomponents#readme",
|
|
14
|
+
"license": "MIT",
|
|
15
|
+
"type": "module",
|
|
16
|
+
"files": [
|
|
17
|
+
"dist"
|
|
18
|
+
],
|
|
19
|
+
"module": "./dist/rc-range-slider.js",
|
|
20
|
+
"exports": {
|
|
21
|
+
".": {
|
|
22
|
+
"import": {
|
|
23
|
+
"types": "./dist/types/packages/rc-range-slider/src/index.d.ts",
|
|
24
|
+
"default": "./dist/rc-range-slider.js"
|
|
25
|
+
}
|
|
26
|
+
},
|
|
27
|
+
"./define": {
|
|
28
|
+
"import": {
|
|
29
|
+
"types": "./dist/types/packages/rc-range-slider/src/define.d.ts",
|
|
30
|
+
"default": "./dist/rc-range-slider-define.js"
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
},
|
|
34
|
+
"types": "./dist/types/packages/rc-range-slider/src/index.d.ts",
|
|
35
|
+
"sideEffects": [
|
|
36
|
+
"./dist/rc-range-slider-define.js"
|
|
37
|
+
],
|
|
38
|
+
"customElements": "dist/custom-elements.json",
|
|
39
|
+
"scripts": {
|
|
40
|
+
"dev": "vite",
|
|
41
|
+
"build": "tsc && vite build && cem analyze",
|
|
42
|
+
"cem:analyze": "cem analyze",
|
|
43
|
+
"preview": "vite preview",
|
|
44
|
+
"test:browser": "vitest",
|
|
45
|
+
"test:browser:chrome": "vitest --project=chromium",
|
|
46
|
+
"test:browser:firefox": "vitest --project=firefox",
|
|
47
|
+
"yalc:publish": "yalc publish --push"
|
|
48
|
+
},
|
|
49
|
+
"devDependencies": {
|
|
50
|
+
"@custom-elements-manifest/analyzer": "0.11.0",
|
|
51
|
+
"@guanghechen/rollup-plugin-copy": "^6.0.9",
|
|
52
|
+
"@vitest/browser-playwright": "4.1.5",
|
|
53
|
+
"lit": "^3.0.0",
|
|
54
|
+
"playwright": "^1.56.0",
|
|
55
|
+
"rollup": "^4.60.2",
|
|
56
|
+
"typescript": "~5.9.3",
|
|
57
|
+
"vite": "^7.1.7",
|
|
58
|
+
"vite-plugin-dts": "^4.5.4",
|
|
59
|
+
"vitest": "^4.0.6",
|
|
60
|
+
"vitest-browser-lit": "^1.0.1"
|
|
61
|
+
},
|
|
62
|
+
"dependencies": {
|
|
63
|
+
"@rcarls/rc-common": "workspace:^"
|
|
64
|
+
},
|
|
65
|
+
"peerDependencies": {
|
|
66
|
+
"lit": "^3.0.0"
|
|
67
|
+
}
|
|
68
|
+
}
|