danielgm-ui 0.4.1 → 0.4.2

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/slider.d.ts CHANGED
@@ -10,6 +10,8 @@ export interface SliderBaseProps {
10
10
  step?: number;
11
11
  disabled?: boolean;
12
12
  name?: string;
13
+ /** Visibilidad visual de los extremos en Slider y RangeSlider; conserva foco y accesibilidad. @defaultValue 'always' */
14
+ thumbVisibility?: 'always' | 'interaction';
13
15
  /** Valor visible y aria-valuetext; útil para porcentajes, unidades o precios. */
14
16
  formatValue?: (value: number) => string;
15
17
  /** Marcas informativas, sin interacción propia. Deben estar entre min y max. */
package/dist/slider.js CHANGED
@@ -1,19 +1,27 @@
1
1
  'use client';
2
2
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
3
  /** Radix mantiene teclado, gestos táctiles y valores de formulario; la librería aporta etiquetas y estilo. */
4
- import { useId } from 'react';
4
+ import { useId, useState, useEffect } from 'react';
5
5
  import * as Primitive from '@radix-ui/react-slider';
6
6
  import { useControllable } from './internal/state.js';
7
7
  import { cx, hasContent } from './utils.js';
8
8
  /** Infraestructura interna; cada API pública mantiene un número fijo de controles. */
9
- function SliderControl({ label, description, error, min = 0, max = 100, step = 1, disabled, name, formatValue = String, marks = [], className, id, values, change, commit, thumbLabels, }) {
9
+ function SliderControl({ label, description, error, min = 0, max = 100, step = 1, disabled, name, thumbVisibility = 'always', formatValue = String, marks = [], className, id, values, change, commit, thumbLabels, }) {
10
10
  const generated = useId();
11
+ const [activePointer, setActivePointer] = useState(null);
12
+ useEffect(() => {
13
+ if (disabled)
14
+ setActivePointer(null);
15
+ }, [disabled]);
11
16
  const controlId = id ?? `dgm-slider-${generated}`;
12
17
  if (![min, max, step].every(Number.isFinite) || min >= max || step <= 0) {
13
18
  throw new RangeError('Slider requires finite min < max and step > 0.');
14
19
  }
15
20
  const describedBy = cx(hasContent(description) && `${controlId}-description`, hasContent(error) && `${controlId}-error`) || undefined;
16
- return (_jsxs("div", { className: cx('dgm-field', 'dgm-slider-field', className), id: controlId, children: [_jsxs("div", { className: "dgm-slider-heading", children: [_jsx("span", { className: "dgm-label", id: `${controlId}-label`, children: label }), _jsx("span", { className: "dgm-description", "aria-hidden": "true", children: values.map(formatValue).join(' – ') })] }), _jsxs(Primitive.Root, { className: "dgm-slider", value: values, onValueChange: change, onValueCommit: commit, min: min, max: max, step: step, disabled: disabled, name: name, children: [_jsx(Primitive.Track, { className: "dgm-slider-track", children: _jsx(Primitive.Range, { className: "dgm-slider-range" }) }), values.map((value, index) => (_jsx(Primitive.Thumb, { name: name, className: "dgm-slider-thumb", "aria-labelledby": `${controlId}-label${thumbLabels ? ` ${controlId}-thumb-${index}` : ''}`, "aria-describedby": describedBy, "aria-invalid": hasContent(error) || undefined, "aria-valuetext": formatValue(value) }, index)))] }), thumbLabels?.map((text, index) => (_jsx("span", { id: `${controlId}-thumb-${index}`, className: "dgm-visually-hidden", children: text }, index))), marks.length > 0 && (_jsx("div", { className: "dgm-slider-marks", "aria-hidden": "true", children: marks
21
+ return (_jsxs("div", { className: cx('dgm-field', 'dgm-slider-field', className), id: controlId, children: [_jsxs("div", { className: "dgm-slider-heading", children: [_jsx("span", { className: "dgm-label", id: `${controlId}-label`, children: label }), _jsx("span", { className: "dgm-description", "aria-hidden": "true", children: values.map(formatValue).join(' – ') })] }), _jsxs(Primitive.Root, { className: "dgm-slider", "data-thumb-visibility": thumbVisibility, "data-dragging": !disabled && activePointer !== null ? '' : undefined, onPointerDownCapture: (event) => {
22
+ if (!disabled && event.button === 0)
23
+ setActivePointer(event.pointerId);
24
+ }, onPointerUpCapture: () => setActivePointer(null), onPointerCancelCapture: () => setActivePointer(null), onLostPointerCapture: () => setActivePointer(null), value: values, onValueChange: change, onValueCommit: commit, min: min, max: max, step: step, disabled: disabled, name: name, children: [_jsx(Primitive.Track, { className: "dgm-slider-track", children: _jsx(Primitive.Range, { className: "dgm-slider-range" }) }), values.map((value, index) => (_jsx(Primitive.Thumb, { name: name, className: "dgm-slider-thumb", "aria-labelledby": `${controlId}-label${thumbLabels ? ` ${controlId}-thumb-${index}` : ''}`, "aria-describedby": describedBy, "aria-invalid": hasContent(error) || undefined, "aria-valuetext": formatValue(value) }, index)))] }), thumbLabels?.map((text, index) => (_jsx("span", { id: `${controlId}-thumb-${index}`, className: "dgm-visually-hidden", children: text }, index))), marks.length > 0 && (_jsx("div", { className: "dgm-slider-marks", "aria-hidden": "true", children: marks
17
25
  .filter((mark) => mark.value >= min && mark.value <= max)
18
26
  .map((mark) => (_jsx("span", { style: { left: `${(100 * (mark.value - min)) / (max - min)}%` }, children: mark.label ?? formatValue(mark.value) }, mark.value))) })), hasContent(description) && (_jsx("span", { id: `${controlId}-description`, className: "dgm-description", children: description })), hasContent(error) && (_jsx("span", { id: `${controlId}-error`, className: "dgm-error", children: error }))] }));
19
27
  }
package/dist/styles.css CHANGED
@@ -2775,7 +2775,7 @@ button.dgm-step:hover:not(:disabled),
2775
2775
  }
2776
2776
  .dgm-table-sort-icon {
2777
2777
  position: absolute;
2778
- inset-inline-end: 0;
2778
+ inset-inline-end: 0.5625rem;
2779
2779
  top: 50%;
2780
2780
  width: 0.875rem;
2781
2781
  height: 0.875rem;
@@ -2793,22 +2793,13 @@ button.dgm-step:hover:not(:disabled),
2793
2793
  opacity: 1;
2794
2794
  transform: translateY(-50%) scale(1);
2795
2795
  }
2796
- .dgm-data-table th[data-align='center'] .dgm-table-sort[data-sorted] .dgm-table-sort-label,
2797
- .dgm-data-table th[data-align='end'] .dgm-table-sort[data-sorted] .dgm-table-sort-label {
2796
+ .dgm-data-table th .dgm-table-sort[data-sorted] .dgm-table-sort-label {
2798
2797
  transform: translateX(-0.5625rem);
2799
2798
  }
2800
- .dgm-data-table th[data-align='center'] .dgm-table-sort-icon,
2801
- .dgm-data-table th[data-align='end'] .dgm-table-sort-icon {
2802
- inset-inline-end: 0.5625rem;
2803
- }
2804
2799
  .dgm-data-table th[data-align='start'] .dgm-table-sort {
2805
2800
  margin-inline-start: calc(-1 * var(--dgm-table-sort-space));
2806
2801
  }
2807
- [dir='rtl']
2808
- .dgm-data-table
2809
- th:not([data-align='start'])
2810
- .dgm-table-sort[data-sorted]
2811
- .dgm-table-sort-label {
2802
+ [dir='rtl'] .dgm-data-table th .dgm-table-sort[data-sorted] .dgm-table-sort-label {
2812
2803
  transform: translateX(0.5625rem);
2813
2804
  }
2814
2805
  @media (prefers-reduced-motion: reduce) {
@@ -3139,6 +3130,22 @@ button.dgm-step:disabled {
3139
3130
  box-shadow: 0 2px 5px #0002;
3140
3131
  cursor: grab;
3141
3132
  }
3133
+ /* Opacidad conserva la geometría, el área táctil y los controles accesibles. */
3134
+ .dgm-slider[data-thumb-visibility='interaction'] .dgm-slider-thumb {
3135
+ opacity: 0;
3136
+ transition: opacity 0.15s ease;
3137
+ }
3138
+ .dgm-slider[data-thumb-visibility='interaction']:not([data-disabled]):focus-within
3139
+ .dgm-slider-thumb,
3140
+ .dgm-slider[data-thumb-visibility='interaction']:not([data-disabled])[data-dragging]
3141
+ .dgm-slider-thumb {
3142
+ opacity: 1;
3143
+ }
3144
+ @media (hover: hover) {
3145
+ .dgm-slider[data-thumb-visibility='interaction']:not([data-disabled]):hover .dgm-slider-thumb {
3146
+ opacity: 1;
3147
+ }
3148
+ }
3142
3149
  .dgm-slider-thumb::after {
3143
3150
  content: '';
3144
3151
  position: absolute;
@@ -3584,7 +3591,8 @@ button.dgm-step:disabled {
3584
3591
  .dgm-navigation-content {
3585
3592
  animation: none;
3586
3593
  }
3587
- .dgm-toggle-item {
3594
+ .dgm-toggle-item,
3595
+ .dgm-slider[data-thumb-visibility='interaction'] .dgm-slider-thumb {
3588
3596
  transition: none;
3589
3597
  }
3590
3598
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "danielgm-ui",
3
- "version": "0.4.1",
3
+ "version": "0.4.2",
4
4
  "description": "Accessible React components for Next.js and the web.",
5
5
  "repository": {
6
6
  "type": "git",