@gunkin/uiify 0.0.3-alpha → 0.0.5-alpha
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/components/candle-chart/CandleChart.d.ts +10 -1
- package/dist/components/candle-chart/CandleChart.d.ts.map +1 -1
- package/dist/components/candle-chart/CandleChart.js +82 -42
- package/dist/components/candle-chart/CandleChart.js.map +1 -1
- package/dist/components/candle-chart/client/CandleChartClient.d.ts +2 -2
- package/dist/components/candle-chart/client/CandleChartClient.d.ts.map +1 -1
- package/dist/components/candle-chart/client/CandleChartClient.js +103 -14
- package/dist/components/candle-chart/client/CandleChartClient.js.map +1 -1
- package/dist/components/candle-chart/client/index.d.ts +1 -0
- package/dist/components/candle-chart/client/index.d.ts.map +1 -1
- package/dist/components/candle-chart/client/index.js.map +1 -1
- package/dist/components/candle-chart/types.d.ts +39 -0
- package/dist/components/candle-chart/types.d.ts.map +1 -1
- package/dist/components/color-picker/ColorPicker.d.ts +4 -34
- package/dist/components/color-picker/ColorPicker.d.ts.map +1 -1
- package/dist/components/color-picker/ColorPicker.js +96 -164
- package/dist/components/color-picker/ColorPicker.js.map +1 -1
- package/dist/components/color-picker/index.d.ts +2 -3
- package/dist/components/color-picker/index.d.ts.map +1 -1
- package/dist/components/color-picker/index.js +2 -40
- package/dist/components/color-picker/index.js.map +1 -1
- package/dist/components/color-picker/types.d.ts +13 -69
- package/dist/components/color-picker/types.d.ts.map +1 -1
- package/dist/components/context-menu/ContextMenu.d.ts.map +1 -1
- package/dist/components/context-menu/ContextMenu.js +13 -1
- package/dist/components/context-menu/ContextMenu.js.map +1 -1
- package/dist/components/internal/chart-scrollbar/use-scrollbar-reserve.d.ts +11 -0
- package/dist/components/internal/chart-scrollbar/use-scrollbar-reserve.d.ts.map +1 -0
- package/dist/components/internal/chart-scrollbar/use-scrollbar-reserve.js +21 -0
- package/dist/components/internal/chart-scrollbar/use-scrollbar-reserve.js.map +1 -0
- package/dist/components/internal/live-chart/types.d.ts +36 -0
- package/dist/components/internal/live-chart/types.d.ts.map +1 -0
- package/dist/components/internal/live-chart/types.js +1 -0
- package/dist/components/internal/live-chart/types.js.map +1 -0
- package/dist/components/internal/live-chart/use-live-chart-window.d.ts +18 -0
- package/dist/components/internal/live-chart/use-live-chart-window.d.ts.map +1 -0
- package/dist/components/internal/live-chart/use-live-chart-window.js +75 -0
- package/dist/components/internal/live-chart/use-live-chart-window.js.map +1 -0
- package/dist/components/line-chart/LineChart.d.ts +6 -1
- package/dist/components/line-chart/LineChart.d.ts.map +1 -1
- package/dist/components/line-chart/LineChart.js +82 -48
- package/dist/components/line-chart/LineChart.js.map +1 -1
- package/dist/components/line-chart/client/LineChartClient.d.ts +2 -2
- package/dist/components/line-chart/client/LineChartClient.d.ts.map +1 -1
- package/dist/components/line-chart/client/LineChartClient.js +106 -14
- package/dist/components/line-chart/client/LineChartClient.js.map +1 -1
- package/dist/components/line-chart/client/index.d.ts +1 -1
- package/dist/components/line-chart/client/index.d.ts.map +1 -1
- package/dist/components/line-chart/client/index.js.map +1 -1
- package/dist/components/line-chart/line-chart-geometry.d.ts +7 -0
- package/dist/components/line-chart/line-chart-geometry.d.ts.map +1 -1
- package/dist/components/line-chart/line-chart-geometry.js +14 -2
- package/dist/components/line-chart/line-chart-geometry.js.map +1 -1
- package/dist/components/line-chart/types.d.ts +42 -0
- package/dist/components/line-chart/types.d.ts.map +1 -1
- package/dist/components/number-field/NumberField.d.ts.map +1 -1
- package/dist/components/number-field/NumberField.js +5 -1
- package/dist/components/number-field/NumberField.js.map +1 -1
- package/dist/components/slider/Slider.d.ts.map +1 -1
- package/dist/components/slider/Slider.js +15 -0
- package/dist/components/slider/Slider.js.map +1 -1
- package/dist/components/slider/client/SliderClient.d.ts +7 -0
- package/dist/components/slider/client/SliderClient.d.ts.map +1 -0
- package/dist/components/slider/client/SliderClient.js +170 -0
- package/dist/components/slider/client/SliderClient.js.map +1 -0
- package/dist/components/slider/client/index.d.ts +3 -0
- package/dist/components/slider/client/index.d.ts.map +1 -0
- package/dist/components/slider/client/index.js +5 -0
- package/dist/components/slider/client/index.js.map +1 -0
- package/dist/components/slider/client.d.ts +1 -0
- package/dist/components/slider/client.js +1 -0
- package/dist/components/slider/slider-values.d.ts +4 -0
- package/dist/components/slider/slider-values.d.ts.map +1 -0
- package/dist/components/slider/slider-values.js +26 -0
- package/dist/components/slider/slider-values.js.map +1 -0
- package/dist/components/slider/types.d.ts +26 -1
- package/dist/components/slider/types.d.ts.map +1 -1
- package/dist/styles/index.css +1 -1
- package/package.json +1 -1
- package/dist/components/color-picker/color.d.ts +0 -15
- package/dist/components/color-picker/color.d.ts.map +0 -1
- package/dist/components/color-picker/color.js +0 -190
- package/dist/components/color-picker/color.js.map +0 -1
|
@@ -0,0 +1,170 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { Fragment, jsx, jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { useEffect, useState } from "react";
|
|
4
|
+
import { useControllableState } from "@gunkin/uiify/hooks";
|
|
5
|
+
import { useRenderElement } from "@gunkin/uiify/core/render";
|
|
6
|
+
import { getSliderStops, snapSliderToStops } from "../slider-values.js";
|
|
7
|
+
function normalizeValue(value, min, max) {
|
|
8
|
+
if (typeof value === "number") return Math.max(min, Math.min(max, value));
|
|
9
|
+
const first = Math.max(min, Math.min(max, value[0]));
|
|
10
|
+
const second = Math.max(min, Math.min(max, value[1]));
|
|
11
|
+
return first <= second ? [first, second] : [second, first];
|
|
12
|
+
}
|
|
13
|
+
function normalizeSelection(value, min, max, step, stops) {
|
|
14
|
+
const normalized = normalizeValue(value, min, max);
|
|
15
|
+
if (step !== null) return normalized;
|
|
16
|
+
if (typeof normalized === "number") return snapSliderToStops(normalized, stops);
|
|
17
|
+
const lowerStops = stops.filter((stop) => stop <= normalized[1]);
|
|
18
|
+
const lower = snapSliderToStops(normalized[0], lowerStops);
|
|
19
|
+
const upperStops = stops.filter((stop) => stop >= lower);
|
|
20
|
+
return [lower, snapSliderToStops(normalized[1], upperStops)];
|
|
21
|
+
}
|
|
22
|
+
function position(value, min, max) {
|
|
23
|
+
if (max <= min) return 0;
|
|
24
|
+
return Math.max(0, Math.min(100, (value - min) / (max - min) * 100));
|
|
25
|
+
}
|
|
26
|
+
function marksInRange(marks, min, max) {
|
|
27
|
+
return marks.filter(({ value }) => Number.isFinite(value) && value >= min && value <= max);
|
|
28
|
+
}
|
|
29
|
+
function SliderClient(props) {
|
|
30
|
+
const {
|
|
31
|
+
as,
|
|
32
|
+
render,
|
|
33
|
+
value: controlledValue,
|
|
34
|
+
defaultValue,
|
|
35
|
+
onValueChange,
|
|
36
|
+
min = 0,
|
|
37
|
+
max = 100,
|
|
38
|
+
step = 1,
|
|
39
|
+
disabled = false,
|
|
40
|
+
orientation = "horizontal",
|
|
41
|
+
marks = [],
|
|
42
|
+
thumbLabels,
|
|
43
|
+
"aria-label": ariaLabel,
|
|
44
|
+
"aria-labelledby": ariaLabelledBy,
|
|
45
|
+
...consumerProps
|
|
46
|
+
} = props;
|
|
47
|
+
const stops = getSliderStops(min, max, marks);
|
|
48
|
+
const initialValue = normalizeSelection(defaultValue ?? min, min, max, step, stops);
|
|
49
|
+
const safeControlledValue = controlledValue === void 0 ? void 0 : normalizeSelection(controlledValue, min, max, step, stops);
|
|
50
|
+
const [value, setValue] = useControllableState({
|
|
51
|
+
defaultValue: initialValue,
|
|
52
|
+
onChange: onValueChange,
|
|
53
|
+
value: safeControlledValue
|
|
54
|
+
});
|
|
55
|
+
const [enhanced, setEnhanced] = useState(false);
|
|
56
|
+
useEffect(() => setEnhanced(true), []);
|
|
57
|
+
const normalizedValue = normalizeValue(value, min, max);
|
|
58
|
+
const values = typeof normalizedValue === "number" ? [normalizedValue] : [normalizedValue[0], normalizedValue[1]];
|
|
59
|
+
const isRange = values.length === 2;
|
|
60
|
+
const consumerStyle = "style" in consumerProps ? consumerProps.style : void 0;
|
|
61
|
+
const consumerRole = "role" in consumerProps ? consumerProps.role : void 0;
|
|
62
|
+
const positionStyles = values.map((currentValue) => ({
|
|
63
|
+
"--uiify-slider-position": String(position(currentValue, min, max)) + "%"
|
|
64
|
+
}));
|
|
65
|
+
const rootStyle = {
|
|
66
|
+
...consumerStyle,
|
|
67
|
+
"--uiify-slider-start": String(position(values[0], min, max)) + "%",
|
|
68
|
+
"--uiify-slider-end": String(position(values[values.length - 1], min, max)) + "%",
|
|
69
|
+
"--uiify-slider-middle": String(
|
|
70
|
+
(position(values[0], min, max) + position(values[values.length - 1], min, max)) / 2
|
|
71
|
+
) + "%"
|
|
72
|
+
};
|
|
73
|
+
const visibleMarks = marksInRange(marks, min, max);
|
|
74
|
+
const setThumbValue = (index, proposed) => {
|
|
75
|
+
if (disabled) return;
|
|
76
|
+
if (!isRange) {
|
|
77
|
+
const next = step === null ? snapSliderToStops(proposed, stops) : proposed;
|
|
78
|
+
setValue(next);
|
|
79
|
+
return;
|
|
80
|
+
}
|
|
81
|
+
const lower = index === 0 ? min : values[0];
|
|
82
|
+
const upper = index === 0 ? values[1] : max;
|
|
83
|
+
const availableStops = stops.filter((stop) => stop >= lower && stop <= upper);
|
|
84
|
+
const snapped = step === null ? snapSliderToStops(proposed, availableStops) : proposed;
|
|
85
|
+
const nextValue = index === 0 ? [Math.min(snapped, values[1]), values[1]] : [values[0], Math.max(snapped, values[0])];
|
|
86
|
+
setValue(nextValue);
|
|
87
|
+
};
|
|
88
|
+
const handleChange = (index, event) => {
|
|
89
|
+
setThumbValue(index, event.currentTarget.valueAsNumber);
|
|
90
|
+
};
|
|
91
|
+
const handleKeyDown = (index, event) => {
|
|
92
|
+
if (disabled || step !== null) return;
|
|
93
|
+
const direction = event.key === "ArrowRight" || event.key === "ArrowUp" ? 1 : event.key === "ArrowLeft" || event.key === "ArrowDown" ? -1 : 0;
|
|
94
|
+
if (direction === 0) return;
|
|
95
|
+
event.preventDefault();
|
|
96
|
+
const currentValue = values[index];
|
|
97
|
+
const availableStops = isRange ? stops.filter((stop) => index === 0 ? stop <= values[1] : stop >= values[0]) : stops;
|
|
98
|
+
const currentIndex = availableStops.indexOf(currentValue);
|
|
99
|
+
const nextValue = availableStops[currentIndex + direction];
|
|
100
|
+
if (nextValue !== void 0) setThumbValue(index, nextValue);
|
|
101
|
+
};
|
|
102
|
+
const inputNodes = values.map((currentValue, index) => {
|
|
103
|
+
const inputLabel = isRange ? thumbLabels?.[index] ?? (index === 0 ? "Minimum value" : "Maximum value") : ariaLabel;
|
|
104
|
+
const inputLabelledBy = isRange ? void 0 : ariaLabelledBy;
|
|
105
|
+
return /* @__PURE__ */ jsx(
|
|
106
|
+
"input",
|
|
107
|
+
{
|
|
108
|
+
type: "range",
|
|
109
|
+
min,
|
|
110
|
+
max,
|
|
111
|
+
step: step === null ? "any" : step,
|
|
112
|
+
value: currentValue,
|
|
113
|
+
disabled,
|
|
114
|
+
"aria-label": inputLabel,
|
|
115
|
+
"aria-labelledby": inputLabelledBy,
|
|
116
|
+
"aria-orientation": orientation,
|
|
117
|
+
"data-part": "thumb",
|
|
118
|
+
"data-state": String(currentValue),
|
|
119
|
+
"data-orientation": orientation,
|
|
120
|
+
"data-disabled": disabled ? "" : void 0,
|
|
121
|
+
onChange: (event) => handleChange(index, event),
|
|
122
|
+
onKeyDown: (event) => handleKeyDown(index, event)
|
|
123
|
+
},
|
|
124
|
+
index
|
|
125
|
+
);
|
|
126
|
+
});
|
|
127
|
+
return useRenderElement({
|
|
128
|
+
as,
|
|
129
|
+
defaultTag: "div",
|
|
130
|
+
props: {
|
|
131
|
+
...consumerProps,
|
|
132
|
+
role: isRange ? "group" : consumerRole,
|
|
133
|
+
"aria-label": isRange ? ariaLabel : void 0,
|
|
134
|
+
"aria-labelledby": isRange ? ariaLabelledBy : void 0,
|
|
135
|
+
"data-uiify-slider-client": "",
|
|
136
|
+
"data-part": "root",
|
|
137
|
+
"data-range": isRange ? "" : void 0,
|
|
138
|
+
"data-state": isRange ? "range" : String(values[0]),
|
|
139
|
+
"data-orientation": orientation,
|
|
140
|
+
"data-disabled": disabled ? "" : void 0,
|
|
141
|
+
"data-enhanced": enhanced ? "" : void 0,
|
|
142
|
+
style: rootStyle,
|
|
143
|
+
children: /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
144
|
+
/* @__PURE__ */ jsxs("div", { "data-part": "track", "aria-hidden": "true", children: [
|
|
145
|
+
/* @__PURE__ */ jsx("span", { "data-part": "range" }),
|
|
146
|
+
visibleMarks.map((mark) => /* @__PURE__ */ jsx(
|
|
147
|
+
"span",
|
|
148
|
+
{
|
|
149
|
+
"data-part": "mark",
|
|
150
|
+
style: {
|
|
151
|
+
"--uiify-slider-position": String(position(mark.value, min, max)) + "%"
|
|
152
|
+
},
|
|
153
|
+
children: mark.label
|
|
154
|
+
},
|
|
155
|
+
mark.value
|
|
156
|
+
)),
|
|
157
|
+
positionStyles.map((style, index) => /* @__PURE__ */ jsx("span", { "data-part": "visual-thumb", style }, index))
|
|
158
|
+
] }),
|
|
159
|
+
inputNodes
|
|
160
|
+
] })
|
|
161
|
+
},
|
|
162
|
+
render,
|
|
163
|
+
state: { disabled, orientation, value: normalizedValue }
|
|
164
|
+
});
|
|
165
|
+
}
|
|
166
|
+
SliderClient.displayName = "SliderClient";
|
|
167
|
+
export {
|
|
168
|
+
SliderClient
|
|
169
|
+
};
|
|
170
|
+
//# sourceMappingURL=SliderClient.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../src/components/slider/client/SliderClient.tsx"],"sourcesContent":["\"use client\";\n\nimport type {\n CSSProperties,\n ElementType,\n KeyboardEvent,\n ReactElement,\n SyntheticEvent,\n} from \"react\";\nimport { useEffect, useState } from \"react\";\nimport { useControllableState } from \"@gunkin/uiify/hooks\";\nimport { useRenderElement } from \"@gunkin/uiify/core/render\";\n\nimport { getSliderStops, snapSliderToStops } from \"../slider-values.js\";\nimport type { SliderClientProps, SliderClientValue, SliderMark } from \"../types.js\";\n\ntype SliderPositionStyle = CSSProperties & {\n readonly \"--uiify-slider-position\"?: string;\n readonly \"--uiify-slider-start\"?: string;\n readonly \"--uiify-slider-end\"?: string;\n readonly \"--uiify-slider-middle\"?: string;\n};\n\nfunction normalizeValue(value: SliderClientValue, min: number, max: number): SliderClientValue {\n if (typeof value === \"number\") return Math.max(min, Math.min(max, value));\n\n const first = Math.max(min, Math.min(max, value[0]));\n const second = Math.max(min, Math.min(max, value[1]));\n return first <= second ? [first, second] : [second, first];\n}\n\nfunction normalizeSelection(\n value: SliderClientValue,\n min: number,\n max: number,\n step: number | null,\n stops: readonly number[],\n): SliderClientValue {\n const normalized = normalizeValue(value, min, max);\n if (step !== null) return normalized;\n if (typeof normalized === \"number\") return snapSliderToStops(normalized, stops);\n\n const lowerStops = stops.filter((stop) => stop <= normalized[1]);\n const lower = snapSliderToStops(normalized[0], lowerStops);\n const upperStops = stops.filter((stop) => stop >= lower);\n return [lower, snapSliderToStops(normalized[1], upperStops)];\n}\n\nfunction position(value: number, min: number, max: number): number {\n if (max <= min) return 0;\n return Math.max(0, Math.min(100, ((value - min) / (max - min)) * 100));\n}\n\nfunction marksInRange(\n marks: readonly SliderMark[],\n min: number,\n max: number,\n): readonly SliderMark[] {\n return marks.filter(({ value }) => Number.isFinite(value) && value >= min && value <= max);\n}\n\nexport function SliderClient<TAs extends ElementType = \"div\">(\n props: SliderClientProps<TAs>,\n): ReactElement | null {\n const {\n as,\n render,\n value: controlledValue,\n defaultValue,\n onValueChange,\n min = 0,\n max = 100,\n step = 1,\n disabled = false,\n orientation = \"horizontal\",\n marks = [],\n thumbLabels,\n \"aria-label\": ariaLabel,\n \"aria-labelledby\": ariaLabelledBy,\n ...consumerProps\n } = props as SliderClientProps<\"div\">;\n\n const stops = getSliderStops(min, max, marks);\n const initialValue = normalizeSelection(defaultValue ?? min, min, max, step, stops);\n const safeControlledValue =\n controlledValue === undefined\n ? undefined\n : normalizeSelection(controlledValue, min, max, step, stops);\n const [value, setValue] = useControllableState<SliderClientValue>({\n defaultValue: initialValue,\n onChange: onValueChange,\n value: safeControlledValue,\n });\n const [enhanced, setEnhanced] = useState(false);\n useEffect(() => setEnhanced(true), []);\n\n const normalizedValue = normalizeValue(value, min, max);\n const values: readonly number[] =\n typeof normalizedValue === \"number\"\n ? [normalizedValue]\n : [normalizedValue[0], normalizedValue[1]];\n const isRange = values.length === 2;\n const consumerStyle = \"style\" in consumerProps ? consumerProps.style : undefined;\n const consumerRole = \"role\" in consumerProps ? consumerProps.role : undefined;\n const positionStyles: readonly SliderPositionStyle[] = values.map((currentValue) => ({\n \"--uiify-slider-position\": String(position(currentValue, min, max)) + \"%\",\n }));\n const rootStyle: SliderPositionStyle = {\n ...consumerStyle,\n \"--uiify-slider-start\": String(position(values[0]!, min, max)) + \"%\",\n \"--uiify-slider-end\": String(position(values[values.length - 1]!, min, max)) + \"%\",\n \"--uiify-slider-middle\":\n String(\n (position(values[0]!, min, max) + position(values[values.length - 1]!, min, max)) / 2,\n ) + \"%\",\n };\n const visibleMarks = marksInRange(marks, min, max);\n\n const setThumbValue = (index: number, proposed: number): void => {\n if (disabled) return;\n\n if (!isRange) {\n const next = step === null ? snapSliderToStops(proposed, stops) : proposed;\n setValue(next);\n return;\n }\n\n const lower = index === 0 ? min : values[0]!;\n const upper = index === 0 ? values[1]! : max;\n const availableStops = stops.filter((stop) => stop >= lower && stop <= upper);\n const snapped = step === null ? snapSliderToStops(proposed, availableStops) : proposed;\n const nextValue =\n index === 0\n ? ([Math.min(snapped, values[1]!), values[1]!] as const)\n : ([values[0]!, Math.max(snapped, values[0]!)] as const);\n setValue(nextValue);\n };\n\n const handleChange = (index: number, event: SyntheticEvent<HTMLInputElement>): void => {\n setThumbValue(index, event.currentTarget.valueAsNumber);\n };\n\n const handleKeyDown = (index: number, event: KeyboardEvent<HTMLInputElement>): void => {\n if (disabled || step !== null) return;\n\n const direction =\n event.key === \"ArrowRight\" || event.key === \"ArrowUp\"\n ? 1\n : event.key === \"ArrowLeft\" || event.key === \"ArrowDown\"\n ? -1\n : 0;\n if (direction === 0) return;\n\n event.preventDefault();\n const currentValue = values[index]!;\n const availableStops = isRange\n ? stops.filter((stop) => (index === 0 ? stop <= values[1]! : stop >= values[0]!))\n : stops;\n const currentIndex = availableStops.indexOf(currentValue);\n const nextValue = availableStops[currentIndex + direction];\n if (nextValue !== undefined) setThumbValue(index, nextValue);\n };\n\n const inputNodes = values.map((currentValue, index) => {\n const inputLabel = isRange\n ? (thumbLabels?.[index] ?? (index === 0 ? \"Minimum value\" : \"Maximum value\"))\n : ariaLabel;\n const inputLabelledBy = isRange ? undefined : ariaLabelledBy;\n\n return (\n <input\n key={index}\n type=\"range\"\n min={min}\n max={max}\n step={step === null ? \"any\" : step}\n value={currentValue}\n disabled={disabled}\n aria-label={inputLabel}\n aria-labelledby={inputLabelledBy}\n aria-orientation={orientation}\n data-part=\"thumb\"\n data-state={String(currentValue)}\n data-orientation={orientation}\n data-disabled={disabled ? \"\" : undefined}\n onChange={(event) => handleChange(index, event)}\n onKeyDown={(event) => handleKeyDown(index, event)}\n />\n );\n });\n\n return useRenderElement({\n as,\n defaultTag: \"div\",\n props: {\n ...consumerProps,\n role: isRange ? \"group\" : consumerRole,\n \"aria-label\": isRange ? ariaLabel : undefined,\n \"aria-labelledby\": isRange ? ariaLabelledBy : undefined,\n \"data-uiify-slider-client\": \"\",\n \"data-part\": \"root\",\n \"data-range\": isRange ? \"\" : undefined,\n \"data-state\": isRange ? \"range\" : String(values[0]),\n \"data-orientation\": orientation,\n \"data-disabled\": disabled ? \"\" : undefined,\n \"data-enhanced\": enhanced ? \"\" : undefined,\n style: rootStyle,\n children: (\n <>\n <div data-part=\"track\" aria-hidden=\"true\">\n <span data-part=\"range\" />\n {visibleMarks.map((mark) => (\n <span\n key={mark.value}\n data-part=\"mark\"\n style={\n {\n \"--uiify-slider-position\": String(position(mark.value, min, max)) + \"%\",\n } as SliderPositionStyle\n }\n >\n {mark.label}\n </span>\n ))}\n {positionStyles.map((style, index) => (\n <span key={index} data-part=\"visual-thumb\" style={style} />\n ))}\n </div>\n {inputNodes}\n </>\n ),\n },\n render,\n state: { disabled, orientation, value: normalizedValue },\n });\n}\n\nSliderClient.displayName = \"SliderClient\";\n"],"mappings":"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","names":[]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/components/slider/client/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,YAAY,EACV,oBAAoB,EACpB,iBAAiB,EACjB,uBAAuB,EACvB,iBAAiB,EACjB,UAAU,GACX,MAAM,aAAa,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../src/components/slider/client/index.ts"],"sourcesContent":["export { SliderClient } from \"./SliderClient.js\";\nexport type {\n SliderClientOwnProps,\n SliderClientProps,\n SliderClientRenderState,\n SliderClientValue,\n SliderMark,\n} from \"../types.js\";\n"],"mappings":"AAAA,SAAS,oBAAoB;","names":[]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from "./client/index.js";
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from "./client/index.js";
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { SliderMark } from "./types.js";
|
|
2
|
+
export declare function getSliderStops(min: number, max: number, marks: readonly SliderMark[]): readonly number[];
|
|
3
|
+
export declare function snapSliderToStops(value: number, stops: readonly number[]): number;
|
|
4
|
+
//# sourceMappingURL=slider-values.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"slider-values.d.ts","sourceRoot":"","sources":["../../../src/components/slider/slider-values.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAE7C,wBAAgB,cAAc,CAC5B,GAAG,EAAE,MAAM,EACX,GAAG,EAAE,MAAM,EACX,KAAK,EAAE,SAAS,UAAU,EAAE,GAC3B,SAAS,MAAM,EAAE,CAUnB;AAED,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,MAAM,EAAE,GAAG,MAAM,CAajF"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
function getSliderStops(min, max, marks) {
|
|
2
|
+
return [
|
|
3
|
+
.../* @__PURE__ */ new Set([
|
|
4
|
+
min,
|
|
5
|
+
...marks.map(({ value }) => value).filter((value) => Number.isFinite(value) && value >= min && value <= max),
|
|
6
|
+
max
|
|
7
|
+
])
|
|
8
|
+
].sort((a, b) => a - b);
|
|
9
|
+
}
|
|
10
|
+
function snapSliderToStops(value, stops) {
|
|
11
|
+
let closest = stops[0];
|
|
12
|
+
let closestDistance = Math.abs(value - closest);
|
|
13
|
+
for (const stop of stops.slice(1)) {
|
|
14
|
+
const distance = Math.abs(value - stop);
|
|
15
|
+
if (distance < closestDistance) {
|
|
16
|
+
closest = stop;
|
|
17
|
+
closestDistance = distance;
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
return closest;
|
|
21
|
+
}
|
|
22
|
+
export {
|
|
23
|
+
getSliderStops,
|
|
24
|
+
snapSliderToStops
|
|
25
|
+
};
|
|
26
|
+
//# sourceMappingURL=slider-values.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/components/slider/slider-values.ts"],"sourcesContent":["import type { SliderMark } from \"./types.js\";\n\nexport function getSliderStops(\n min: number,\n max: number,\n marks: readonly SliderMark[],\n): readonly number[] {\n return [\n ...new Set([\n min,\n ...marks\n .map(({ value }) => value)\n .filter((value) => Number.isFinite(value) && value >= min && value <= max),\n max,\n ]),\n ].sort((a, b) => a - b);\n}\n\nexport function snapSliderToStops(value: number, stops: readonly number[]): number {\n let closest = stops[0]!;\n let closestDistance = Math.abs(value - closest);\n\n for (const stop of stops.slice(1)) {\n const distance = Math.abs(value - stop);\n if (distance < closestDistance) {\n closest = stop;\n closestDistance = distance;\n }\n }\n\n return closest;\n}\n"],"mappings":"AAEO,SAAS,eACd,KACA,KACA,OACmB;AACnB,SAAO;AAAA,IACL,GAAG,oBAAI,IAAI;AAAA,MACT;AAAA,MACA,GAAG,MACA,IAAI,CAAC,EAAE,MAAM,MAAM,KAAK,EACxB,OAAO,CAAC,UAAU,OAAO,SAAS,KAAK,KAAK,SAAS,OAAO,SAAS,GAAG;AAAA,MAC3E;AAAA,IACF,CAAC;AAAA,EACH,EAAE,KAAK,CAAC,GAAG,MAAM,IAAI,CAAC;AACxB;AAEO,SAAS,kBAAkB,OAAe,OAAkC;AACjF,MAAI,UAAU,MAAM,CAAC;AACrB,MAAI,kBAAkB,KAAK,IAAI,QAAQ,OAAO;AAE9C,aAAW,QAAQ,MAAM,MAAM,CAAC,GAAG;AACjC,UAAM,WAAW,KAAK,IAAI,QAAQ,IAAI;AACtC,QAAI,WAAW,iBAAiB;AAC9B,gBAAU;AACV,wBAAkB;AAAA,IACpB;AAAA,EACF;AAEA,SAAO;AACT;","names":[]}
|
|
@@ -1,5 +1,9 @@
|
|
|
1
|
-
import type { ElementType } from "react";
|
|
1
|
+
import type { ElementType, ReactNode } from "react";
|
|
2
2
|
import type { RenderableProps } from "@gunkin/uiify/core/render";
|
|
3
|
+
export interface SliderMark {
|
|
4
|
+
readonly value: number;
|
|
5
|
+
readonly label?: ReactNode;
|
|
6
|
+
}
|
|
3
7
|
export interface SliderOwnProps {
|
|
4
8
|
readonly value?: number;
|
|
5
9
|
readonly defaultValue?: number;
|
|
@@ -9,5 +13,26 @@ export interface SliderOwnProps {
|
|
|
9
13
|
readonly step?: number;
|
|
10
14
|
readonly disabled?: boolean;
|
|
11
15
|
}
|
|
16
|
+
export type SliderClientValue = number | readonly [number, number];
|
|
17
|
+
export interface SliderClientOwnProps {
|
|
18
|
+
readonly value?: SliderClientValue;
|
|
19
|
+
readonly defaultValue?: SliderClientValue;
|
|
20
|
+
readonly onValueChange?: (value: SliderClientValue) => void;
|
|
21
|
+
readonly min?: number;
|
|
22
|
+
readonly max?: number;
|
|
23
|
+
readonly step?: number | null;
|
|
24
|
+
readonly disabled?: boolean;
|
|
25
|
+
readonly orientation?: "horizontal" | "vertical";
|
|
26
|
+
readonly marks?: readonly SliderMark[];
|
|
27
|
+
readonly thumbLabels?: readonly [string, string];
|
|
28
|
+
readonly "aria-label"?: string;
|
|
29
|
+
readonly "aria-labelledby"?: string;
|
|
30
|
+
}
|
|
31
|
+
export interface SliderClientRenderState {
|
|
32
|
+
readonly disabled: boolean;
|
|
33
|
+
readonly orientation: "horizontal" | "vertical";
|
|
34
|
+
readonly value: SliderClientValue;
|
|
35
|
+
}
|
|
36
|
+
export type SliderClientProps<TAs extends ElementType = "div"> = RenderableProps<TAs, SliderClientOwnProps, SliderClientRenderState, HTMLDivElement>;
|
|
12
37
|
export type SliderProps<TAs extends ElementType = "input"> = RenderableProps<TAs, SliderOwnProps, SliderOwnProps, HTMLInputElement>;
|
|
13
38
|
//# sourceMappingURL=types.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/components/slider/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/components/slider/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AACpD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AAEjE,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,KAAK,CAAC,EAAE,SAAS,CAAC;CAC5B;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACjD,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAC;CAC7B;AAED,MAAM,MAAM,iBAAiB,GAAG,MAAM,GAAG,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;AAEnE,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,KAAK,CAAC,EAAE,iBAAiB,CAAC;IACnC,QAAQ,CAAC,YAAY,CAAC,EAAE,iBAAiB,CAAC;IAC1C,QAAQ,CAAC,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,iBAAiB,KAAK,IAAI,CAAC;IAC5D,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAC;IAC5B,QAAQ,CAAC,WAAW,CAAC,EAAE,YAAY,GAAG,UAAU,CAAC;IACjD,QAAQ,CAAC,KAAK,CAAC,EAAE,SAAS,UAAU,EAAE,CAAC;IACvC,QAAQ,CAAC,WAAW,CAAC,EAAE,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjD,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,iBAAiB,CAAC,EAAE,MAAM,CAAC;CACrC;AAED,MAAM,WAAW,uBAAuB;IACtC,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;IAC3B,QAAQ,CAAC,WAAW,EAAE,YAAY,GAAG,UAAU,CAAC;IAChD,QAAQ,CAAC,KAAK,EAAE,iBAAiB,CAAC;CACnC;AAED,MAAM,MAAM,iBAAiB,CAAC,GAAG,SAAS,WAAW,GAAG,KAAK,IAAI,eAAe,CAC9E,GAAG,EACH,oBAAoB,EACpB,uBAAuB,EACvB,cAAc,CACf,CAAC;AAEF,MAAM,MAAM,WAAW,CAAC,GAAG,SAAS,WAAW,GAAG,OAAO,IAAI,eAAe,CAC1E,GAAG,EACH,cAAc,EACd,cAAc,EACd,gBAAgB,CACjB,CAAC"}
|