@techsio/ui-kit 0.5.1 → 0.7.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/dist/molecules/slider.js
CHANGED
|
@@ -114,23 +114,125 @@ const sliderVariants = tv({
|
|
|
114
114
|
size: "md"
|
|
115
115
|
}
|
|
116
116
|
});
|
|
117
|
+
const resolveFiniteNumber = (value, fallbackValue)=>{
|
|
118
|
+
if ("number" != typeof value || Number.isNaN(value) || !Number.isFinite(value)) return fallbackValue;
|
|
119
|
+
return value;
|
|
120
|
+
};
|
|
121
|
+
const clampNumber = (value, min, max)=>{
|
|
122
|
+
if (!Number.isFinite(value)) return min;
|
|
123
|
+
return Math.max(min, Math.min(max, value));
|
|
124
|
+
};
|
|
125
|
+
const countDecimals = (value)=>{
|
|
126
|
+
if (!Number.isFinite(value)) return 0;
|
|
127
|
+
const [, decimalPart = ""] = value.toString().split(".");
|
|
128
|
+
return decimalPart.length;
|
|
129
|
+
};
|
|
130
|
+
const roundToStepPrecision = (value, step)=>{
|
|
131
|
+
const precision = countDecimals(step);
|
|
132
|
+
if (precision <= 0) return Math.round(value);
|
|
133
|
+
return Number(value.toFixed(precision));
|
|
134
|
+
};
|
|
135
|
+
const snapToStep = (value, min, step)=>{
|
|
136
|
+
const snappedValue = Math.round((value - min) / step) * step + min;
|
|
137
|
+
return roundToStepPrecision(snappedValue, step);
|
|
138
|
+
};
|
|
139
|
+
const resolveThumbCount = (value, defaultValue)=>{
|
|
140
|
+
if (Array.isArray(value) && value.length > 0) return value.length;
|
|
141
|
+
if (Array.isArray(defaultValue) && defaultValue.length > 0) return defaultValue.length;
|
|
142
|
+
return 2;
|
|
143
|
+
};
|
|
144
|
+
const resolveSliderConfig = (min, max, step, minStepsBetweenThumbs, thumbCount)=>{
|
|
145
|
+
const resolvedMin = resolveFiniteNumber(min, 0);
|
|
146
|
+
const resolvedStepCandidate = resolveFiniteNumber(step, 1);
|
|
147
|
+
const resolvedStep = resolvedStepCandidate > 0 ? resolvedStepCandidate : 1;
|
|
148
|
+
const maxCandidate = resolveFiniteNumber(max, resolvedMin + resolvedStep);
|
|
149
|
+
const resolvedMax = maxCandidate > resolvedMin ? maxCandidate : resolvedMin + resolvedStep;
|
|
150
|
+
const span = resolvedMax - resolvedMin;
|
|
151
|
+
const stepsInSpan = Math.max(0, Math.floor((span + Number.EPSILON) / resolvedStep));
|
|
152
|
+
const maxMinStepsBetweenThumbs = thumbCount > 1 ? Math.floor(stepsInSpan / (thumbCount - 1)) : 0;
|
|
153
|
+
const normalizedMinSteps = Math.trunc(resolveFiniteNumber(minStepsBetweenThumbs, 0));
|
|
154
|
+
const resolvedMinStepsBetweenThumbs = clampNumber(normalizedMinSteps, 0, maxMinStepsBetweenThumbs);
|
|
155
|
+
return {
|
|
156
|
+
min: resolvedMin,
|
|
157
|
+
max: resolvedMax,
|
|
158
|
+
step: resolvedStep,
|
|
159
|
+
minStepsBetweenThumbs: resolvedMinStepsBetweenThumbs
|
|
160
|
+
};
|
|
161
|
+
};
|
|
162
|
+
const createFallbackValues = (thumbCount, min, max)=>{
|
|
163
|
+
if (thumbCount <= 1) return [
|
|
164
|
+
min
|
|
165
|
+
];
|
|
166
|
+
if (2 === thumbCount) return [
|
|
167
|
+
min,
|
|
168
|
+
max
|
|
169
|
+
];
|
|
170
|
+
const span = max - min;
|
|
171
|
+
return Array.from({
|
|
172
|
+
length: thumbCount
|
|
173
|
+
}, (_, index)=>{
|
|
174
|
+
const ratio = index / (thumbCount - 1);
|
|
175
|
+
return min + span * ratio;
|
|
176
|
+
});
|
|
177
|
+
};
|
|
178
|
+
const normalizeSliderValues = (values, fallbackValues, config)=>{
|
|
179
|
+
const sourceValues = Array.isArray(values) && values.length > 0 ? values : fallbackValues;
|
|
180
|
+
const normalizedValues = sourceValues.slice(0, fallbackValues.length).map((rawValue, index)=>{
|
|
181
|
+
const fallbackValue = fallbackValues[index] ?? config.min;
|
|
182
|
+
const safeValue = resolveFiniteNumber(rawValue, fallbackValue);
|
|
183
|
+
const snappedValue = snapToStep(safeValue, config.min, config.step);
|
|
184
|
+
return clampNumber(snappedValue, config.min, config.max);
|
|
185
|
+
});
|
|
186
|
+
while(normalizedValues.length < fallbackValues.length)normalizedValues.push(fallbackValues[normalizedValues.length] ?? config.min);
|
|
187
|
+
normalizedValues.sort((left, right)=>left - right);
|
|
188
|
+
const gap = config.minStepsBetweenThumbs * config.step;
|
|
189
|
+
for(let index = 0; index < normalizedValues.length; index += 1){
|
|
190
|
+
const currentValue = normalizedValues[index] ?? config.min;
|
|
191
|
+
const minAllowed = 0 === index ? config.min : (normalizedValues[index - 1] ?? config.min) + gap;
|
|
192
|
+
normalizedValues[index] = Math.max(currentValue, minAllowed);
|
|
193
|
+
}
|
|
194
|
+
for(let index = normalizedValues.length - 1; index >= 0; index -= 1){
|
|
195
|
+
const currentValue = normalizedValues[index] ?? config.max;
|
|
196
|
+
const maxAllowed = index === normalizedValues.length - 1 ? config.max : (normalizedValues[index + 1] ?? config.max) - gap;
|
|
197
|
+
normalizedValues[index] = Math.min(currentValue, maxAllowed);
|
|
198
|
+
}
|
|
199
|
+
return normalizedValues.map((rawValue, index)=>{
|
|
200
|
+
const minAllowed = 0 === index ? config.min : (normalizedValues[index - 1] ?? config.min) + gap;
|
|
201
|
+
const maxAllowed = index === normalizedValues.length - 1 ? config.max : (normalizedValues[index + 1] ?? config.max) - gap;
|
|
202
|
+
const safeValue = rawValue ?? fallbackValues[index] ?? config.min;
|
|
203
|
+
const snappedValue = snapToStep(safeValue, config.min, config.step);
|
|
204
|
+
return clampNumber(snappedValue, minAllowed, maxAllowed);
|
|
205
|
+
});
|
|
206
|
+
};
|
|
207
|
+
const apiValueFallback = (value, defaultValue, fallbackValues)=>{
|
|
208
|
+
if (Array.isArray(value) && value.length > 0) return value;
|
|
209
|
+
if (Array.isArray(defaultValue) && defaultValue.length > 0) return defaultValue;
|
|
210
|
+
return fallbackValues;
|
|
211
|
+
};
|
|
117
212
|
function Slider({ id, name, label, validateStatus, helpText, showHelpTextIcon = true, value, origin, thumbAlignment = "center", defaultValue = [
|
|
118
213
|
25,
|
|
119
214
|
75
|
|
120
215
|
], min = 0, max = 100, step = 1, minStepsBetweenThumbs = 0, disabled = false, readOnly = false, dir = "ltr", orientation = "horizontal", size = "md", showMarkers = false, markerCount = 5, showValueText = false, formatRangeText, formatValue = (val)=>val.toString(), className, onChange, onChangeEnd }) {
|
|
121
216
|
const generatedId = useId();
|
|
122
217
|
const uniqueId = id || generatedId;
|
|
218
|
+
const thumbCount = resolveThumbCount(value, defaultValue);
|
|
219
|
+
const resolvedConfig = resolveSliderConfig(min, max, step, minStepsBetweenThumbs, thumbCount);
|
|
220
|
+
const fallbackValues = createFallbackValues(thumbCount, resolvedConfig.min, resolvedConfig.max);
|
|
221
|
+
const isControlled = void 0 !== value;
|
|
222
|
+
const resolvedValue = isControlled ? normalizeSliderValues(value, fallbackValues, resolvedConfig) : void 0;
|
|
223
|
+
const resolvedDefaultValue = isControlled ? void 0 : normalizeSliderValues(defaultValue, fallbackValues, resolvedConfig);
|
|
224
|
+
const valueTextValues = apiValueFallback(resolvedValue, resolvedDefaultValue, fallbackValues);
|
|
123
225
|
const service = useMachine(machine, {
|
|
124
226
|
id: uniqueId,
|
|
125
227
|
name,
|
|
126
|
-
value,
|
|
127
|
-
defaultValue,
|
|
128
|
-
min,
|
|
129
|
-
max,
|
|
228
|
+
value: resolvedValue,
|
|
229
|
+
defaultValue: resolvedDefaultValue,
|
|
230
|
+
min: resolvedConfig.min,
|
|
231
|
+
max: resolvedConfig.max,
|
|
130
232
|
origin,
|
|
131
233
|
thumbAlignment,
|
|
132
|
-
step,
|
|
133
|
-
minStepsBetweenThumbs,
|
|
234
|
+
step: resolvedConfig.step,
|
|
235
|
+
minStepsBetweenThumbs: resolvedConfig.minStepsBetweenThumbs,
|
|
134
236
|
disabled,
|
|
135
237
|
readOnly,
|
|
136
238
|
dir,
|
|
@@ -162,7 +264,7 @@ function Slider({ id, name, label, validateStatus, helpText, showHelpTextIcon =
|
|
|
162
264
|
...api.getValueTextProps(),
|
|
163
265
|
children: [
|
|
164
266
|
/*#__PURE__*/ jsx("b", {
|
|
165
|
-
children: formatRangeText ? formatRangeText(api.value ||
|
|
267
|
+
children: formatRangeText ? formatRangeText(api.value || valueTextValues) : api.value && 2 === api.value.length && void 0 !== api.value[0] && void 0 !== api.value[1] ? `${formatValue(api.value[0])} - ${formatValue(api.value[1])}` : ""
|
|
166
268
|
}),
|
|
167
269
|
" "
|
|
168
270
|
]
|
|
@@ -189,7 +291,7 @@ function Slider({ id, name, label, validateStatus, helpText, showHelpTextIcon =
|
|
|
189
291
|
children: Array.from({
|
|
190
292
|
length: markerCount
|
|
191
293
|
}).map((_, index)=>{
|
|
192
|
-
const markerValue = 1 === markerCount ? min : min + (max - min) / (markerCount - 1) * index;
|
|
294
|
+
const markerValue = 1 === markerCount ? resolvedConfig.min : resolvedConfig.min + (resolvedConfig.max - resolvedConfig.min) / (markerCount - 1) * index;
|
|
193
295
|
return /*#__PURE__*/ jsxs("div", {
|
|
194
296
|
className: marker(),
|
|
195
297
|
...api.getMarkerProps({
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"slider.d.ts","sourceRoot":"","sources":["../../../src/molecules/slider.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AAKrD,QAAA,MAAM,cAAc;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2CA2FlB,CAAA;AAEF,MAAM,WAAW,WAAY,SAAQ,YAAY,CAAC,OAAO,cAAc,CAAC;IACtE,EAAE,CAAC,EAAE,MAAM,CAAA;IACX,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,cAAc,CAAC,EAAE,SAAS,GAAG,OAAO,GAAG,SAAS,GAAG,SAAS,CAAA;IAC5D,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,gBAAgB,CAAC,EAAE,OAAO,CAAA;IAC1B,KAAK,CAAC,EAAE,MAAM,EAAE,CAAA;IAChB,YAAY,CAAC,EAAE,MAAM,EAAE,CAAA;IACvB,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,qBAAqB,CAAC,EAAE,MAAM,CAAA;IAC9B,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,GAAG,CAAC,EAAE,KAAK,GAAG,KAAK,CAAA;IACnB,WAAW,CAAC,EAAE,YAAY,GAAG,UAAU,CAAA;IACvC,MAAM,CAAC,EAAE,OAAO,GAAG,QAAQ,GAAG,KAAK,CAAA;IACnC,cAAc,CAAC,EAAE,QAAQ,GAAG,SAAS,CAAA;IACrC,WAAW,CAAC,EAAE,OAAO,CAAA;IACrB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,aAAa,CAAC,EAAE,OAAO,CAAA;IACvB,eAAe,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,MAAM,CAAA;IAC9C,WAAW,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,MAAM,CAAA;IACvC,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,IAAI,CAAA;IACrC,WAAW,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,IAAI,CAAA;CACzC;
|
|
1
|
+
{"version":3,"file":"slider.d.ts","sourceRoot":"","sources":["../../../src/molecules/slider.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AAKrD,QAAA,MAAM,cAAc;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2CA2FlB,CAAA;AAEF,MAAM,WAAW,WAAY,SAAQ,YAAY,CAAC,OAAO,cAAc,CAAC;IACtE,EAAE,CAAC,EAAE,MAAM,CAAA;IACX,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,cAAc,CAAC,EAAE,SAAS,GAAG,OAAO,GAAG,SAAS,GAAG,SAAS,CAAA;IAC5D,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,gBAAgB,CAAC,EAAE,OAAO,CAAA;IAC1B,KAAK,CAAC,EAAE,MAAM,EAAE,CAAA;IAChB,YAAY,CAAC,EAAE,MAAM,EAAE,CAAA;IACvB,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,qBAAqB,CAAC,EAAE,MAAM,CAAA;IAC9B,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,GAAG,CAAC,EAAE,KAAK,GAAG,KAAK,CAAA;IACnB,WAAW,CAAC,EAAE,YAAY,GAAG,UAAU,CAAA;IACvC,MAAM,CAAC,EAAE,OAAO,GAAG,QAAQ,GAAG,KAAK,CAAA;IACnC,cAAc,CAAC,EAAE,QAAQ,GAAG,SAAS,CAAA;IACrC,WAAW,CAAC,EAAE,OAAO,CAAA;IACrB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,aAAa,CAAC,EAAE,OAAO,CAAA;IACvB,eAAe,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,MAAM,CAAA;IAC9C,WAAW,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,MAAM,CAAA;IACvC,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,IAAI,CAAA;IACrC,WAAW,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,IAAI,CAAA;CACzC;AAqMD,wBAAgB,MAAM,CAAC,EACrB,EAAE,EACF,IAAI,EACJ,KAAK,EACL,cAAc,EACd,QAAQ,EACR,gBAAuB,EACvB,KAAK,EACL,MAAM,EACN,cAAyB,EACzB,YAAuB,EACvB,GAAO,EACP,GAAS,EACT,IAAQ,EACR,qBAAyB,EACzB,QAAgB,EAChB,QAAgB,EAChB,GAAW,EACX,WAA0B,EAC1B,IAAW,EACX,WAAmB,EACnB,WAAe,EACf,aAAqB,EACrB,eAAe,EACf,WAA6C,EAC7C,SAAS,EACT,QAAQ,EACR,WAAW,GACZ,EAAE,WAAW,2CA8Jb"}
|
|
@@ -9,6 +9,7 @@ export declare const WithValidation: Story;
|
|
|
9
9
|
export declare const WithMarkers: Story;
|
|
10
10
|
export declare const VerticalOrientation: Story;
|
|
11
11
|
export declare const Controlled: Story;
|
|
12
|
+
export declare const DynamicBoundsControlled: Story;
|
|
12
13
|
export declare const SingleVsMultiThumb: Story;
|
|
13
14
|
export declare const Origin: Story;
|
|
14
15
|
export declare const ThumbAlignment: Story;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"slider.stories.d.ts","sourceRoot":"","sources":["../../../stories/molecules/slider.stories.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAA;AAItD,OAAO,EACL,MAAM,EAEP,MAAM,4BAA4B,CAAA;AAEnC,QAAA,MAAM,IAAI,EAAE,IAAI,CAAC,OAAO,MAAM,CAyI7B,CAAA;AAED,eAAe,IAAI,CAAA;AACnB,KAAK,KAAK,GAAG,QAAQ,CAAC,OAAO,MAAM,CAAC,CAAA;AASpC,eAAO,MAAM,UAAU,EAAE,KAYxB,CAAA;AAED,eAAO,MAAM,QAAQ,EAAE,KAMtB,CAAA;AAED,eAAO,MAAM,cAAc,EAAE,KA0B5B,CAAA;AAED,eAAO,MAAM,WAAW,EAAE,KAmBzB,CAAA;AAED,eAAO,MAAM,mBAAmB,EAAE,KAqDjC,CAAA;AAED,eAAO,MAAM,UAAU,EAAE,KAyCxB,CAAA;AAED,eAAO,MAAM,kBAAkB,EAAE,KA4BhC,CAAA;AAED,eAAO,MAAM,MAAM,EAAE,KA+BpB,CAAA;AAED,eAAO,MAAM,cAAc,EAAE,KA2B5B,CAAA;AAED,eAAO,MAAM,qBAAqB,EAAE,KAqCnC,CAAA;AAED,eAAO,MAAM,UAAU,EAAE,KAuBxB,CAAA;AAED,eAAO,MAAM,gBAAgB,EAAE,KAiD9B,CAAA;AAED,eAAO,MAAM,WAAW,EAAE,KAwIzB,CAAA"}
|
|
1
|
+
{"version":3,"file":"slider.stories.d.ts","sourceRoot":"","sources":["../../../stories/molecules/slider.stories.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAA;AAItD,OAAO,EACL,MAAM,EAEP,MAAM,4BAA4B,CAAA;AAEnC,QAAA,MAAM,IAAI,EAAE,IAAI,CAAC,OAAO,MAAM,CAyI7B,CAAA;AAED,eAAe,IAAI,CAAA;AACnB,KAAK,KAAK,GAAG,QAAQ,CAAC,OAAO,MAAM,CAAC,CAAA;AASpC,eAAO,MAAM,UAAU,EAAE,KAYxB,CAAA;AAED,eAAO,MAAM,QAAQ,EAAE,KAMtB,CAAA;AAED,eAAO,MAAM,cAAc,EAAE,KA0B5B,CAAA;AAED,eAAO,MAAM,WAAW,EAAE,KAmBzB,CAAA;AAED,eAAO,MAAM,mBAAmB,EAAE,KAqDjC,CAAA;AAED,eAAO,MAAM,UAAU,EAAE,KAyCxB,CAAA;AAED,eAAO,MAAM,uBAAuB,EAAE,KA0CrC,CAAA;AAED,eAAO,MAAM,kBAAkB,EAAE,KA4BhC,CAAA;AAED,eAAO,MAAM,MAAM,EAAE,KA+BpB,CAAA;AAED,eAAO,MAAM,cAAc,EAAE,KA2B5B,CAAA;AAED,eAAO,MAAM,qBAAqB,EAAE,KAqCnC,CAAA;AAED,eAAO,MAAM,UAAU,EAAE,KAuBxB,CAAA;AAED,eAAO,MAAM,gBAAgB,EAAE,KAiD9B,CAAA;AAED,eAAO,MAAM,WAAW,EAAE,KAwIzB,CAAA"}
|
package/package.json
CHANGED