@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.
Files changed (83) hide show
  1. package/dist/components/candle-chart/CandleChart.d.ts +10 -1
  2. package/dist/components/candle-chart/CandleChart.d.ts.map +1 -1
  3. package/dist/components/candle-chart/CandleChart.js +82 -42
  4. package/dist/components/candle-chart/CandleChart.js.map +1 -1
  5. package/dist/components/candle-chart/client/CandleChartClient.d.ts +2 -2
  6. package/dist/components/candle-chart/client/CandleChartClient.d.ts.map +1 -1
  7. package/dist/components/candle-chart/client/CandleChartClient.js +103 -14
  8. package/dist/components/candle-chart/client/CandleChartClient.js.map +1 -1
  9. package/dist/components/candle-chart/client/index.d.ts +1 -0
  10. package/dist/components/candle-chart/client/index.d.ts.map +1 -1
  11. package/dist/components/candle-chart/client/index.js.map +1 -1
  12. package/dist/components/candle-chart/types.d.ts +39 -0
  13. package/dist/components/candle-chart/types.d.ts.map +1 -1
  14. package/dist/components/color-picker/ColorPicker.d.ts +4 -34
  15. package/dist/components/color-picker/ColorPicker.d.ts.map +1 -1
  16. package/dist/components/color-picker/ColorPicker.js +96 -164
  17. package/dist/components/color-picker/ColorPicker.js.map +1 -1
  18. package/dist/components/color-picker/index.d.ts +2 -3
  19. package/dist/components/color-picker/index.d.ts.map +1 -1
  20. package/dist/components/color-picker/index.js +2 -40
  21. package/dist/components/color-picker/index.js.map +1 -1
  22. package/dist/components/color-picker/types.d.ts +13 -69
  23. package/dist/components/color-picker/types.d.ts.map +1 -1
  24. package/dist/components/context-menu/ContextMenu.d.ts.map +1 -1
  25. package/dist/components/context-menu/ContextMenu.js +13 -1
  26. package/dist/components/context-menu/ContextMenu.js.map +1 -1
  27. package/dist/components/internal/chart-scrollbar/use-scrollbar-reserve.d.ts +11 -0
  28. package/dist/components/internal/chart-scrollbar/use-scrollbar-reserve.d.ts.map +1 -0
  29. package/dist/components/internal/chart-scrollbar/use-scrollbar-reserve.js +21 -0
  30. package/dist/components/internal/chart-scrollbar/use-scrollbar-reserve.js.map +1 -0
  31. package/dist/components/internal/live-chart/types.d.ts +36 -0
  32. package/dist/components/internal/live-chart/types.d.ts.map +1 -0
  33. package/dist/components/internal/live-chart/types.js +1 -0
  34. package/dist/components/internal/live-chart/types.js.map +1 -0
  35. package/dist/components/internal/live-chart/use-live-chart-window.d.ts +18 -0
  36. package/dist/components/internal/live-chart/use-live-chart-window.d.ts.map +1 -0
  37. package/dist/components/internal/live-chart/use-live-chart-window.js +75 -0
  38. package/dist/components/internal/live-chart/use-live-chart-window.js.map +1 -0
  39. package/dist/components/line-chart/LineChart.d.ts +6 -1
  40. package/dist/components/line-chart/LineChart.d.ts.map +1 -1
  41. package/dist/components/line-chart/LineChart.js +82 -48
  42. package/dist/components/line-chart/LineChart.js.map +1 -1
  43. package/dist/components/line-chart/client/LineChartClient.d.ts +2 -2
  44. package/dist/components/line-chart/client/LineChartClient.d.ts.map +1 -1
  45. package/dist/components/line-chart/client/LineChartClient.js +106 -14
  46. package/dist/components/line-chart/client/LineChartClient.js.map +1 -1
  47. package/dist/components/line-chart/client/index.d.ts +1 -1
  48. package/dist/components/line-chart/client/index.d.ts.map +1 -1
  49. package/dist/components/line-chart/client/index.js.map +1 -1
  50. package/dist/components/line-chart/line-chart-geometry.d.ts +7 -0
  51. package/dist/components/line-chart/line-chart-geometry.d.ts.map +1 -1
  52. package/dist/components/line-chart/line-chart-geometry.js +14 -2
  53. package/dist/components/line-chart/line-chart-geometry.js.map +1 -1
  54. package/dist/components/line-chart/types.d.ts +42 -0
  55. package/dist/components/line-chart/types.d.ts.map +1 -1
  56. package/dist/components/number-field/NumberField.d.ts.map +1 -1
  57. package/dist/components/number-field/NumberField.js +5 -1
  58. package/dist/components/number-field/NumberField.js.map +1 -1
  59. package/dist/components/slider/Slider.d.ts.map +1 -1
  60. package/dist/components/slider/Slider.js +15 -0
  61. package/dist/components/slider/Slider.js.map +1 -1
  62. package/dist/components/slider/client/SliderClient.d.ts +7 -0
  63. package/dist/components/slider/client/SliderClient.d.ts.map +1 -0
  64. package/dist/components/slider/client/SliderClient.js +170 -0
  65. package/dist/components/slider/client/SliderClient.js.map +1 -0
  66. package/dist/components/slider/client/index.d.ts +3 -0
  67. package/dist/components/slider/client/index.d.ts.map +1 -0
  68. package/dist/components/slider/client/index.js +5 -0
  69. package/dist/components/slider/client/index.js.map +1 -0
  70. package/dist/components/slider/client.d.ts +1 -0
  71. package/dist/components/slider/client.js +1 -0
  72. package/dist/components/slider/slider-values.d.ts +4 -0
  73. package/dist/components/slider/slider-values.d.ts.map +1 -0
  74. package/dist/components/slider/slider-values.js +26 -0
  75. package/dist/components/slider/slider-values.js.map +1 -0
  76. package/dist/components/slider/types.d.ts +26 -1
  77. package/dist/components/slider/types.d.ts.map +1 -1
  78. package/dist/styles/index.css +1 -1
  79. package/package.json +1 -1
  80. package/dist/components/color-picker/color.d.ts +0 -15
  81. package/dist/components/color-picker/color.d.ts.map +0 -1
  82. package/dist/components/color-picker/color.js +0 -190
  83. 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,3 @@
1
+ export { SliderClient } from "./SliderClient.js";
2
+ export type { SliderClientOwnProps, SliderClientProps, SliderClientRenderState, SliderClientValue, SliderMark, } from "../types.js";
3
+ //# sourceMappingURL=index.d.ts.map
@@ -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,5 @@
1
+ import { SliderClient } from "./SliderClient.js";
2
+ export {
3
+ SliderClient
4
+ };
5
+ //# sourceMappingURL=index.js.map
@@ -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;AACzC,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AAEjE,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,WAAW,CAAC,GAAG,SAAS,WAAW,GAAG,OAAO,IAAI,eAAe,CAC1E,GAAG,EACH,cAAc,EACd,cAAc,EACd,gBAAgB,CACjB,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"}