@techsio/ui-kit 0.6.0 → 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.
@@ -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 || defaultValue) : api.value && 2 === api.value.length && void 0 !== api.value[0] && void 0 !== api.value[1] ? `${formatValue(api.value[0])} - ${formatValue(api.value[1])}` : ""
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;AAED,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,2CAkIb"}
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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@techsio/ui-kit",
3
- "version": "0.6.0",
3
+ "version": "0.7.0",
4
4
  "type": "module",
5
5
  "repository": {
6
6
  "type": "git",
@@ -207,4 +207,4 @@
207
207
 
208
208
  @utility token-icon-decrement {
209
209
  @apply token-icon-chevron-down;
210
- }
210
+ }