aio-range 2.0.0 → 2.0.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.
Files changed (4) hide show
  1. package/index.css +23 -24
  2. package/index.d.ts +39 -15
  3. package/index.js +206 -218
  4. package/package.json +1 -1
package/index.css CHANGED
@@ -4,42 +4,39 @@
4
4
  user-select: none;
5
5
  }
6
6
 
7
-
8
- .aio-input-range-value {
9
- width: 100%;
10
- overflow: visible;
11
- }
12
-
13
- .ai-range-horizontal {
7
+ .ai-slider-horizontal {
14
8
  height: 48px;
15
9
  align-items: center;
16
10
  width: 100%;
17
11
  }
18
12
 
19
- .ai-range-horizontal .ai-range-groove {
13
+ .ai-slider-horizontal .ai-slider-groove {
20
14
  height: 1px;
21
15
  width: 100%;
22
16
  background: #ddd;
23
17
  }
24
18
 
25
- .ai-range-vertical {
19
+ .ai-slider-vertical {
26
20
  width: 48px;
27
21
  height: 240px;
28
22
  justify-content: center;
29
23
  margin: 12px 0;
30
24
  }
31
25
 
32
- .ai-range-vertical .ai-range-groove {
26
+ .ai-slider-vertical .ai-slider-groove {
33
27
  width: 1px;
34
28
  height: 100%;
35
29
  background: #ddd;
36
30
  }
37
31
 
38
- .ai-range-reverse {
32
+ .ai-slider-reverse {
33
+ direction: rtl;
34
+ }
35
+ .ai-spinner-reverse {
39
36
  direction: rtl;
40
37
  }
41
38
 
42
- .ai-range-round {
39
+ .ai-spinner {
43
40
  border-radius: 100%;
44
41
  justify-content: center;
45
42
  align-items: center;
@@ -57,11 +54,11 @@
57
54
  z-index: 10;
58
55
  }
59
56
 
60
- .ai-range-round .ai-range-value-container {
57
+ .ai-spinner .ai-range-value-container {
61
58
  justify-content: flex-end;
62
59
  }
63
60
 
64
- .aio-input-handle {
61
+ .ai-spinner-handle {
65
62
  position: absolute;
66
63
  width: 0;
67
64
  height: 0;
@@ -76,7 +73,7 @@
76
73
  height: 0;
77
74
  }
78
75
 
79
- .ai-range-round .ai-range-label-container {
76
+ .ai-spinner .ai-range-label-container {
80
77
  justify-content: flex-end;
81
78
  }
82
79
 
@@ -84,12 +81,12 @@
84
81
  position: absolute;
85
82
  }
86
83
 
87
- .ai-range-horizontal .ai-range-labels {
84
+ .ai-slider-horizontal .ai-range-labels {
88
85
  width: 100%;
89
86
  height: 100%;
90
87
  }
91
88
 
92
- .ai-range-vertical .ai-range-labels {
89
+ .ai-slider-vertical .ai-range-labels {
93
90
  width: 100%;
94
91
  height: 100%;
95
92
  }
@@ -100,6 +97,8 @@
100
97
  align-items: center;
101
98
  justify-content: center;
102
99
  font-size: 12px;
100
+ width: 0;
101
+ height:0;
103
102
  }
104
103
 
105
104
  .ai-range-label>* {
@@ -135,7 +134,7 @@
135
134
  justify-content: center;
136
135
  }
137
136
 
138
- .ai-range-range {
137
+ .ai-slider-range {
139
138
  position: absolute;
140
139
  }
141
140
 
@@ -148,7 +147,7 @@
148
147
  height: 0;
149
148
  }
150
149
 
151
- .ai-range-round .ai-range-scale-container {
150
+ .ai-spinner .ai-range-scale-container {
152
151
  justify-content: flex-end;
153
152
  }
154
153
 
@@ -164,27 +163,27 @@
164
163
 
165
164
  }
166
165
 
167
- .ai-range-round .ai-range-scale {
166
+ .ai-spinner .ai-range-scale {
168
167
  height: 2px;
169
168
  width: 6px;
170
169
  left: 6px;
171
170
  }
172
171
 
173
- .ai-range-vertical .ai-range-scale {
172
+ .ai-slider-vertical .ai-range-scale {
174
173
  height: 2px;
175
174
  width: 6px;
176
175
  }
177
176
 
178
- .ai-range-fill {
177
+ .ai-slider-fill {
179
178
  background: #0069ff;
180
179
  position: absolute;
181
180
  z-index: 10;
182
181
  }
183
182
 
184
- .ai-range-horizontal .ai-range-fill {
183
+ .ai-slider-horizontal .ai-slider-fill {
185
184
  height: 4px;
186
185
  }
187
186
 
188
- .ai-range-vertical .ai-range-fill {
187
+ .ai-slider-vertical .ai-slider-fill {
189
188
  width: 4px;
190
189
  }
package/index.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { FC, ReactNode } from "react";
1
+ import { type FC, type ReactNode } from "react";
2
2
  import './index.css';
3
3
  export type AI_RangeContext = {
4
4
  rangeHook: ReturnType<typeof useRange>;
@@ -23,7 +23,6 @@ export type AI_label = {
23
23
  zIndex?: number;
24
24
  setting: (value: number, p: {
25
25
  angle: number;
26
- disabled: boolean;
27
26
  index: number;
28
27
  }) => AI_labelItem;
29
28
  };
@@ -76,22 +75,18 @@ export type I_Range = {
76
75
  pointHtml?: (p: {
77
76
  index: number;
78
77
  value: number;
79
- disabled: boolean;
80
78
  angle: number;
81
79
  }) => ReactNode | false | undefined;
82
80
  pointContent?: (p: {
83
81
  index: number;
84
82
  value: number;
85
- disabled: boolean;
86
83
  angle: number;
87
84
  }) => ReactNode;
88
85
  pointOffset?: (p: {
89
86
  index: number;
90
87
  value: number;
91
- disabled: boolean;
92
88
  angle: number;
93
89
  }) => number | undefined;
94
- disabled?: (value: number) => boolean;
95
90
  fill?: (startPoint: {
96
91
  index: number;
97
92
  value: number;
@@ -107,7 +102,6 @@ export type I_Range = {
107
102
  handle?: (p: {
108
103
  index: number;
109
104
  value: number;
110
- disabled: boolean;
111
105
  angle: number;
112
106
  }) => {
113
107
  widthPercent?: number;
@@ -129,22 +123,23 @@ type I_Range_default = I_Range & {
129
123
  rotate: number;
130
124
  ranges: I_range[];
131
125
  };
132
- declare const AIORange: FC<I_Range>;
133
- export default AIORange;
134
- export type I_RangeLabelItem = {
135
- label: AI_label;
136
- itemValue: number;
126
+ export declare const AIOSlider: FC<I_Range>;
127
+ export declare const AIOSpinner: FC<I_Range>;
128
+ type I_RangeValue = {
129
+ value: number;
130
+ angle: number;
137
131
  index: number;
138
132
  };
139
- declare const useRange: (PROPS: I_Range) => {
133
+ declare const useRange: (PROPS: I_Range, type: 'slider' | 'spinner') => {
140
134
  values: number[];
141
135
  getValues: (value: any) => number[];
142
136
  getSide: () => "left" | "right" | "bottom" | "top";
143
137
  fixAngle: (angle: number) => number;
144
138
  getValueByAngle: (angle: number) => number;
145
139
  mainDom: any;
146
- isValueDisabled: (value: number) => boolean;
147
140
  rootProps: I_Range_default;
141
+ getRootProps: (props: I_Range, type: 'slider' | 'spinner') => any;
142
+ getLabelList: (label: AI_label) => number[];
148
143
  getArc: (rc: I_range) => {
149
144
  thickness: number;
150
145
  color: string;
@@ -161,5 +156,34 @@ declare const useRange: (PROPS: I_Range) => {
161
156
  getXPByValue: (value: number) => number;
162
157
  getValueByXP: (xp: number) => number;
163
158
  getXPByX: (x: number) => number;
164
- getGroove: () => import("react/jsx-runtime").JSX.Element;
159
+ handleZIndex: (index: number) => void;
160
+ getSpinnerLabel: (labelItem: AI_labelItem, itemValue: number) => import("react/jsx-runtime").JSX.Element;
161
+ getSliderPointContainerStyle: (rangeValue: I_RangeValue) => {
162
+ [x: string]: number;
163
+ };
164
+ getSpinnerPointContainerStyle: (rangeValue: I_RangeValue) => {
165
+ left: number;
166
+ transform: string;
167
+ };
168
+ getSliderValueProps: (rangeValue: I_RangeValue) => {
169
+ className: string;
170
+ draggable: boolean;
171
+ style: {
172
+ [x: string]: string;
173
+ };
174
+ };
175
+ getSpinnerValueProps: (rangeValue: I_RangeValue) => {
176
+ className: string;
177
+ draggable: boolean;
178
+ style: {
179
+ transform: string;
180
+ };
181
+ };
182
+ getRangeValue: (itemValue: number, index: number) => {
183
+ value: number;
184
+ index: number;
185
+ angle: number;
186
+ };
187
+ getSliderLabel: (labelItem: AI_labelItem, itemValue: number) => import("react/jsx-runtime").JSX.Element;
165
188
  };
189
+ export {};
package/index.js CHANGED
@@ -1,5 +1,5 @@
1
1
  import { createElement as _createElement } from "react";
2
- import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
3
3
  import { createContext, createRef, useContext, useEffect, useRef, useState } from "react";
4
4
  import * as UT from 'aio-utils';
5
5
  import { $ } from 'aio-deps';
@@ -7,90 +7,59 @@ import './index.css';
7
7
  const RangeContext = createContext({});
8
8
  const RangeProvider = ({ value, children }) => _jsx(RangeContext.Provider, { value: value, children: children });
9
9
  const useRangeProvider = () => useContext(RangeContext);
10
- const AIORange = (props) => {
11
- const rangeHook = useRange(props);
12
- function getRootClassName() {
13
- let c = 'ai-range';
14
- if (props.round) {
15
- c += ` ai-range-round`;
16
- }
17
- else {
18
- c += props.vertical ? ` ai-range-vertical` : ` ai-range-horizontal`;
19
- }
20
- if (props.className) {
21
- c += ' ' + props.className;
22
- }
23
- if (props.reverse) {
24
- c += ` ai-range-reverse`;
25
- }
26
- return c;
27
- }
28
- function getRootStyle() {
29
- let { style } = props;
30
- let res;
31
- if (props.round) {
32
- res = { width: props.size, height: props.size };
33
- }
34
- return Object.assign(Object.assign({}, res), style);
35
- }
36
- function getRootProps() {
37
- let { attrs = {} } = props;
38
- let rootStyle = getRootStyle();
39
- return UT.AddToAttrs(attrs, { className: getRootClassName(), style: rootStyle, attrs: { ref: rangeHook.mainDom } });
40
- }
41
- function root_node() {
42
- const { labels } = rangeHook.rootProps;
43
- return (_jsxs("div", Object.assign({}, getRootProps(), { children: [rangeHook.getGroove(), props.text !== undefined && _jsx("div", { className: 'ai-range-text', children: props.text }, 'rangetext'), !props.round &&
44
- _jsxs(_Fragment, { children: [_jsx(AIRangeRects, {}, 'rangeRects'), _jsx(RangeFills, {}, 'rangeFills')] }), _jsx(RangeSvg, {}), labels.map((label, i) => _jsx(RangeLabel, { label: label }, i)), _jsx(RangeValues, {})] })));
10
+ export const AIOSlider = (props) => {
11
+ const rangeHook = useRange(props, 'slider');
12
+ return (_jsx(RangeProvider, { value: { rangeHook }, children: _jsxs("div", Object.assign({}, rangeHook.getRootProps(props, 'slider'), { children: [_jsx(SliderGroove, { grooveAttrs: props.grooveAttrs }), _jsx(SliderRects, { ranges: props.ranges }), _jsx(SliderFills, {}), _jsx(RangeLabels, { type: 'slider' }), _jsx(RangeValues, { type: 'slider' })] })) }));
13
+ };
14
+ export const AIOSpinner = (props) => {
15
+ const rangeHook = useRange(props, 'spinner');
16
+ return (_jsx(RangeProvider, { value: { rangeHook }, children: _jsxs("div", Object.assign({}, rangeHook.getRootProps(props, 'spinner'), { children: [_jsx(SpinnerText, { text: props.text }), _jsx(SpinnerSvg, {}), _jsx(RangeLabels, { type: 'spinner' }), _jsx(RangeValues, { type: 'spinner' })] })) }));
17
+ };
18
+ const SliderGroove = ({ grooveAttrs }) => {
19
+ return _jsx("div", Object.assign({}, UT.AddToAttrs(grooveAttrs, { className: 'ai-slider-groove' })));
20
+ };
21
+ const SpinnerText = ({ text }) => {
22
+ if (text === undefined || text === null) {
23
+ return null;
45
24
  }
46
- return (_jsx(RangeProvider, { value: { rangeHook }, children: root_node() }));
25
+ return _jsx("div", { className: 'ai-range-text', children: text });
26
+ };
27
+ const RangeLabels = ({ type }) => {
28
+ const { rangeHook } = useRangeProvider();
29
+ const { labels } = rangeHook.rootProps;
30
+ return (_jsx(_Fragment, { children: labels.map((label, i) => _jsx(RangeLabel, { label: label, type: type }, i)) }));
47
31
  };
48
- export default AIORange;
49
- const RangeValues = () => {
32
+ const RangeValues = ({ type }) => {
50
33
  const { rangeHook } = useRangeProvider();
51
34
  return (_jsx(_Fragment, { children: rangeHook.values.map((itemValue, i) => {
52
- return _jsx(RangeValue, { index: i, itemValue: itemValue }, 'rangecontainervalue' + i);
35
+ return _jsx(RangeValue, { index: i, itemValue: itemValue, type: type }, 'rangecontainervalue' + i);
53
36
  }) }));
54
37
  };
55
- const RangeValue = (props) => {
38
+ const RangeValue = ({ itemValue, index, type }) => {
56
39
  let { rangeHook } = useRangeProvider();
57
- let { itemValue, index } = props;
58
- let { round } = rangeHook.rootProps;
59
- let angle = rangeHook.fixAngle(rangeHook.getAngleByValue(itemValue));
60
- function containerProps() {
61
- let style;
62
- if (!round) {
63
- style = { [rangeHook.getSide()]: rangeHook.getXPByValue(itemValue) + '%' };
64
- }
65
- else {
66
- style = { transform: `rotate(${angle}deg)` };
67
- }
68
- return { className: 'ai-range-value-container', draggable: false, style };
69
- }
70
- const disabled = rangeHook.isValueDisabled(itemValue);
71
- return (_jsxs("div", Object.assign({}, containerProps(), { children: [_jsx(RangeHandle, { disabled: disabled, value: itemValue, index: index, angle: angle }), _jsx(AIRangePoint, { disabled: disabled, value: itemValue, index: index, angle: angle })] })));
40
+ const rangeValue = rangeHook.getRangeValue(itemValue, index);
41
+ const props = type === 'spinner' ? rangeHook.getSpinnerValueProps(rangeValue) : rangeHook.getSliderValueProps(rangeValue);
42
+ return (_jsxs("div", Object.assign({}, props, { children: [_jsx(SpinnerHandle, { rangeValue: rangeValue }), _jsx(AIRangePoint, { rangeValue: rangeValue, type: type })] })));
72
43
  };
73
- const RangeSvg = () => {
44
+ const SpinnerSvg = () => {
74
45
  const { rangeHook } = useRangeProvider();
75
- const { round, ranges, size } = rangeHook.rootProps;
76
- if (!round || !ranges.length) {
46
+ const { ranges, size } = rangeHook.rootProps;
47
+ if (!ranges.length) {
77
48
  return null;
78
49
  }
79
- return (_jsx("svg", { style: { position: 'absolute', left: 0, top: 0 }, width: size, height: size, children: ranges.map((range, i) => _jsx(RangeArc, { range: range }, 'rangecirclearc' + i)) }));
50
+ return (_jsx("svg", { style: { position: 'absolute', left: 0, top: 0 }, width: size, height: size, children: ranges.map((range, i) => _jsx(SpinnerArc, { range: range }, 'rangecirclearc' + i)) }));
80
51
  };
81
- const AIRangeRects = () => {
82
- const { rangeHook } = useRangeProvider();
83
- const { ranges = [] } = rangeHook.rootProps;
84
- return (_jsx(_Fragment, { children: ranges.map((range, i) => _jsx(RangeRect, { range: range }, 'range' + i)) }));
85
- };
86
- const RangeFills = () => {
87
- let { rangeHook } = useRangeProvider();
88
- let { start, round, rangeOption = {} } = rangeHook.rootProps;
89
- if (round) {
52
+ const SliderRects = ({ ranges = [] }) => {
53
+ if (!ranges.length) {
90
54
  return null;
91
55
  }
56
+ return (_jsx(_Fragment, { children: ranges.map((range, i) => _jsx(SliderRect, { range: range }, 'range' + i)) }));
57
+ };
58
+ const SliderFills = () => {
59
+ const { rangeHook } = useRangeProvider();
60
+ const { rootProps, values } = rangeHook;
61
+ const { rangeOption = {}, start } = rootProps;
92
62
  const { fill } = rangeOption;
93
- const values = rangeHook.values;
94
63
  let limit = values.length === 1 ? [start, values[0]] : [...values];
95
64
  const fillHtmls = [];
96
65
  for (let i = 1; i < limit.length; i++) {
@@ -104,24 +73,24 @@ const RangeFills = () => {
104
73
  const { thickness = 4, style, className: fillClassName, color } = res;
105
74
  let from = limit[startPoint.index];
106
75
  let to = limit[endPoint.index];
107
- let className = 'ai-range-fill';
76
+ let className = 'ai-slider-fill';
108
77
  if (fillClassName) {
109
78
  className += ' ' + fillClassName;
110
79
  }
111
- fillHtmls.push(_jsx(RangeRect, { range: { thickness, color, from, to, className, style, offset: 0 } }, 'fill' + i));
80
+ fillHtmls.push(_jsx(SliderRect, { range: { thickness, color, from, to, className, style, offset: 0 } }, 'fill' + i));
112
81
  }
113
82
  return _jsx(_Fragment, { children: fillHtmls });
114
83
  };
115
- const RangeRect = ({ range }) => {
84
+ const SliderRect = ({ range }) => {
116
85
  let { rangeHook } = useRangeProvider();
117
86
  let { color, from, to, className, style, offset, thickness, roundCap } = range;
118
- className = UT.classListToString(['ai-range-range', range.className]);
87
+ className = UT.classListToString(['ai-slider-range', range.className]);
119
88
  const { vertical, reverse } = rangeHook.rootProps;
120
89
  let startSide = rangeHook.getXPByValue(from), endSide = rangeHook.getXPByValue(to);
121
90
  let Style = Object.assign({ [vertical ? 'height' : 'width']: (endSide - startSide) + '%', [vertical ? 'width' : 'height']: range.thickness, [vertical ? (reverse ? 'bottom' : 'top') : (reverse ? 'right' : 'left')]: startSide + '%', [vertical ? 'left' : 'top']: `calc(50% - ${(thickness / 2) + offset}px)`, borderRadius: roundCap ? 48 : 0, background: color }, style);
122
91
  return _jsx("div", { className: className, style: Style });
123
92
  };
124
- const RangeArc = ({ range }) => {
93
+ const SpinnerArc = ({ range }) => {
125
94
  let { rangeHook } = useRangeProvider();
126
95
  let { size, reverse } = rangeHook.rootProps;
127
96
  const { thickness, color, radius, roundCap, full, from, to } = rangeHook.getArc(range);
@@ -146,15 +115,14 @@ const RangeArc = ({ range }) => {
146
115
  }
147
116
  return _jsx("path", { d: UT.svgArc(x, y, radius, a, b), stroke: color, strokeWidth: thickness, fill: 'transparent', strokeLinecap: roundCap ? 'round' : undefined, className: range.className }, `from${from}to${to}`);
148
117
  };
149
- const RangeHandle = (props) => {
118
+ const SpinnerHandle = ({ rangeValue }) => {
150
119
  let { rangeHook } = useRangeProvider();
151
- let { index } = props;
152
- let { rangeOption = {}, round } = rangeHook.rootProps;
153
- if (!round || !rangeOption.handle) {
120
+ let { rangeOption = {} } = rangeHook.rootProps;
121
+ if (!rangeOption.handle) {
154
122
  return null;
155
123
  }
156
124
  const { handle: handleFn } = rangeOption;
157
- const handle = handleFn(props);
125
+ const handle = handleFn(rangeValue);
158
126
  if (!handle) {
159
127
  return null;
160
128
  }
@@ -174,33 +142,18 @@ const RangeHandle = (props) => {
174
142
  return { width, height, left: offset, background: color };
175
143
  }
176
144
  }
177
- let PROPS = UT.AddToAttrs({}, { className: 'aio-input-handle', style: getStyle(), attrs: { draggable: false } });
178
- return (_createElement("div", Object.assign({}, PROPS, { key: 'rangehandle' + index })));
145
+ let PROPS = UT.AddToAttrs({}, { className: 'ai-spinner-handle', style: getStyle(), attrs: { draggable: false } });
146
+ return (_createElement("div", Object.assign({}, PROPS, { key: 'rangehandle' + rangeValue.index })));
179
147
  };
180
148
  const RangeLabel = (props) => {
181
149
  let { rangeHook } = useRangeProvider();
182
150
  let { label } = props;
183
- let { zIndex, dynamic, step, list = [] } = label;
184
- let { round, start, end, reverse, vertical } = rangeHook.rootProps;
151
+ let { zIndex, dynamic } = label;
152
+ let { reverse, vertical } = rangeHook.rootProps;
185
153
  let [def] = useState(getDef);
186
154
  function getDef() { return RENDER(true); }
187
- function getList() {
188
- let res = [];
189
- if (step) {
190
- let { start: lstart = start, end: lend = end } = label;
191
- for (let i = lstart; i <= lend; i += step) {
192
- res.push(i);
193
- }
194
- }
195
- for (let i = 0; i < list.length; i++) {
196
- if (res.indexOf(list[i]) === -1) {
197
- res.push(list[i]);
198
- }
199
- }
200
- return res;
201
- }
202
155
  function updateLabels() {
203
- if (round || !label.autoHide || vertical) {
156
+ if (props.type !== "spinner" || !label.autoHide || vertical) {
204
157
  return;
205
158
  }
206
159
  let container = $(rangeHook.mainDom.current);
@@ -242,93 +195,31 @@ const RangeLabel = (props) => {
242
195
  if (!init && !dynamic) {
243
196
  return def;
244
197
  }
245
- return (_jsx("div", { className: 'ai-range-labels', style: { zIndex }, children: getList().map((itemValue, index) => _jsx(RangeLabelItem, { label: label, itemValue: itemValue, index: index }, itemValue)) }));
198
+ const list = rangeHook.getLabelList(label);
199
+ return (_jsx("div", { className: 'ai-range-labels', style: { zIndex }, children: list.map((itemValue, index) => {
200
+ let labelItem = label.setting(itemValue, { angle: 0, index });
201
+ if (props.type === "slider") {
202
+ return (rangeHook.getSliderLabel(labelItem, itemValue));
203
+ }
204
+ else {
205
+ return rangeHook.getSpinnerLabel(labelItem, itemValue);
206
+ }
207
+ }) }));
246
208
  }
247
209
  return _jsx(_Fragment, { children: RENDER(false) });
248
210
  };
249
- const RangeLabelItem = (props) => {
211
+ const AIRangePoint = ({ rangeValue, type }) => {
250
212
  let { rangeHook } = useRangeProvider();
251
- let { label, itemValue, index } = props;
252
- let { round, vertical, size } = rangeHook.rootProps;
253
- let angle;
254
- if (round) {
255
- angle = rangeHook.fixAngle(rangeHook.getAngleByValue(itemValue));
256
- }
257
- let disabled = rangeHook.isValueDisabled(itemValue);
258
- function getContainerStyle(distance) {
259
- if (round) {
260
- return { transform: `rotate(${angle}deg)` };
261
- }
262
- else {
263
- return Object.assign({ [rangeHook.getSide()]: rangeHook.getXPByValue(itemValue) + '%' }, distance);
264
- }
265
- }
266
- function getTextStyle(item, distance) {
267
- let res = {};
268
- if (round) {
269
- res = Object.assign(Object.assign({}, res), distance);
270
- if (item.fixAngle) {
271
- res = Object.assign(Object.assign({}, res), { transform: `rotate(${-angle}deg)` });
272
- }
273
- }
274
- return Object.assign({ width: 0, height: 0 }, res);
275
- }
276
- function getDetails() {
277
- let item = label.setting(itemValue, { disabled, angle, index });
278
- let { offset = 0, html = '', config } = item;
279
- let distance = { [round || vertical ? 'left' : 'top']: size * offset / 100 / 2 };
280
- if (round) {
281
- distance.left = size * offset / 100 / 2;
282
- }
283
- else if (vertical) {
284
- distance.left = `calc(50% + ${offset || 0}px)`;
285
- }
286
- else {
287
- distance.top = `calc(50% + ${offset || 0}px)`;
288
- }
289
- let containerStyle = getContainerStyle(distance);
290
- let containerProps = { className: 'ai-range-label-container', style: containerStyle, draggable: false };
291
- let textProps = UT.AddToAttrs({}, { className: ['ai-range-label'], style: getTextStyle(item, distance), attrs: { draggable: false } });
292
- if (config) {
293
- html = (_jsx("div", { className: "msf", style: {
294
- [!!round && !vertical ? 'height' : 'width']: size * config.thickness / 100,
295
- [!!round && !vertical ? 'width' : 'height']: size * config.height / 100,
296
- //transform:`translate${!!round && !vertical?'Y':'X'}${-size * config.thickness / 200}`,
297
- background: config.color
298
- } }));
299
- }
300
- return { html, textProps, containerProps };
301
- }
302
- let { html, textProps, containerProps } = getDetails();
303
- return (_jsx("div", Object.assign({}, containerProps, { children: _jsx("div", Object.assign({}, textProps, { children: html })) })));
304
- };
305
- const AIRangePoint = (props) => {
306
- let { rangeHook } = useRangeProvider();
307
- const { size, vertical, rangeOption = {}, round } = rangeHook.rootProps;
308
- function getContainerStyle(offset) {
309
- let containerStyle;
310
- if (round) {
311
- containerStyle = { left: size / 2 + offset, transform: `rotate(${-props.angle}deg)` };
312
- }
313
- else {
314
- containerStyle = { [vertical ? 'left' : 'top']: offset };
315
- }
316
- return containerStyle;
317
- }
318
- function handleZIndex(index) {
319
- let containers = $(rangeHook.mainDom.current).find(`.ai-range-value-container`);
320
- containers.css({ zIndex: 10 });
321
- containers.eq(index).css({ zIndex: 100 });
322
- }
323
- const { pointContent = (() => props.value), pointHtml = (() => _jsx("div", { className: 'ai-range-point', children: pointContent(props) })), pointOffset = (() => 0) } = rangeOption;
324
- const point = pointHtml(props);
213
+ const { rangeOption = {} } = rangeHook.rootProps;
214
+ const { pointContent = (() => rangeValue.value), pointHtml = (() => _jsx("div", { className: 'ai-range-point', children: pointContent(rangeValue) })), } = rangeOption;
215
+ const point = pointHtml(rangeValue);
325
216
  if (point === false) {
326
217
  return null;
327
218
  }
328
- const offset = pointOffset(props) || 0;
329
- return (_jsx("div", { style: getContainerStyle(offset), className: 'ai-range-point-container', draggable: false, "data-index": props.index, onMouseDown: () => handleZIndex(props.index), children: point }, 'rangepoint' + props.index));
219
+ const containerStyle = type === "spinner" ? rangeHook.getSpinnerPointContainerStyle(rangeValue) : rangeHook.getSliderPointContainerStyle(rangeValue);
220
+ return (_jsx("div", { style: containerStyle, className: 'ai-range-point-container', draggable: false, "data-range-index": rangeValue.index, onMouseDown: () => rangeHook.handleZIndex(rangeValue.index), children: point }, 'rangepoint' + rangeValue.index));
330
221
  };
331
- const useRange = (PROPS) => {
222
+ const useRange = (PROPS, type) => {
332
223
  const getProps = () => {
333
224
  const { start = 0, end = 100, min = start, max = end, step = 1, size = 72, labels = [], rotate = 0, ranges = [] } = PROPS;
334
225
  return Object.assign(Object.assign({}, PROPS), { start, end, min, max, step, size, labels, rotate, ranges });
@@ -339,9 +230,9 @@ const useRange = (PROPS) => {
339
230
  let [temp] = useState({ start: 0, index: false });
340
231
  const [mainDom] = useState(createRef());
341
232
  const [values, setValues] = useState([]);
342
- const { vertical, reverse, start = 0, end = 100, min = start, max = end, step = 1, rotate = 0, round, size = 72, ranges = [], grooveAttrs } = props;
233
+ const { vertical, reverse, start = 0, end = 100, min = start, max = end, step = 1, rotate = 0, round = 1, size = 72 } = props;
343
234
  useEffect(() => {
344
- if (!props.onChange || props.disabled === true) {
235
+ if (!props.onChange) {
345
236
  return;
346
237
  }
347
238
  clearTimeout(temp.timeOut);
@@ -358,7 +249,7 @@ const useRange = (PROPS) => {
358
249
  }
359
250
  let { event } = p;
360
251
  if (event.target !== null) {
361
- let index = UT.GetAttr($(event.target), 'data-index');
252
+ let index = UT.GetAttr($(event.target), 'data-range-index');
362
253
  temp.index = index === null ? false : +index;
363
254
  temp.start = [...values];
364
255
  }
@@ -381,12 +272,12 @@ const useRange = (PROPS) => {
381
272
  }, 100);
382
273
  }, [changeHandle]);
383
274
  function click(mousePosition) {
384
- if (props.disabled === true || temp.index !== false) {
275
+ if (props.disabled === true) {
385
276
  return;
386
277
  }
387
278
  let clickedValue;
388
279
  //vertical condition
389
- if (props.round) {
280
+ if (type === "spinner") {
390
281
  clickedValue = getValueByAngle(mousePosition.centerAngle);
391
282
  }
392
283
  else {
@@ -409,23 +300,18 @@ const useRange = (PROPS) => {
409
300
  let newValue = getChangedValue(obj);
410
301
  changeValue(newValue);
411
302
  }
412
- function isValueDisabled(value) {
413
- const { rangeOption = {} } = props;
414
- const { disabled: d = () => false } = rangeOption;
415
- return d(value);
416
- }
417
303
  function getChangedValue(obj) {
418
304
  let { dx, dy, deltaCenterAngle, centerAngle } = obj;
419
305
  let startValue = [...temp.start];
420
306
  let index = temp.index;
421
307
  //agar faghat yek point darim har koja mousedown shod farz kon rooye oon point mousedown karde im
422
- if (startValue.length === 1 && index === false) {
308
+ if (startValue.length === 1 && index !== false) {
423
309
  index = 0;
424
310
  }
425
311
  let res;
426
312
  if (index === false) {
427
313
  let deltaValue;
428
- if (props.round) {
314
+ if (type === "spinner") {
429
315
  let v = deltaCenterAngle * (props.end - props.start) / 360;
430
316
  v = Math.round(v / props.step) * props.step;
431
317
  deltaValue = v;
@@ -433,13 +319,12 @@ const useRange = (PROPS) => {
433
319
  else {
434
320
  deltaValue = Math.round(getValueByXP(getXPByX(props.vertical ? dy : dx)) / props.step) * props.step;
435
321
  }
436
- let newValue = moveAll(startValue, deltaValue, true);
437
- res = !isValueValid(newValue) ? values : newValue;
322
+ res = moveAll(startValue, deltaValue, true);
438
323
  }
439
324
  else {
440
325
  let { before, after } = getIndexLimit(index);
441
326
  let newUnitValue;
442
- if (props.round) {
327
+ if (type === 'spinner') {
443
328
  newUnitValue = Math.round(getValueByAngle(centerAngle) / props.step) * props.step;
444
329
  }
445
330
  else {
@@ -452,9 +337,6 @@ const useRange = (PROPS) => {
452
337
  if (newUnitValue < before) {
453
338
  newUnitValue = before;
454
339
  }
455
- if (isValueDisabled(newUnitValue)) {
456
- newUnitValue = values[index];
457
- }
458
340
  startValue[index] = newUnitValue;
459
341
  res = startValue;
460
342
  }
@@ -462,12 +344,7 @@ const useRange = (PROPS) => {
462
344
  }
463
345
  function change1Unit(dir) {
464
346
  let newValue = [...values];
465
- let lastValue = JSON.stringify(newValue);
466
347
  newValue = moveAll(newValue, dir * props.step);
467
- while (!isValueValid(newValue) && JSON.stringify(newValue) !== lastValue) {
468
- lastValue = JSON.stringify(newValue);
469
- newValue = moveAll(newValue, dir * props.step);
470
- }
471
348
  changeValue(newValue);
472
349
  }
473
350
  function changeValue(newValue) {
@@ -477,14 +354,6 @@ const useRange = (PROPS) => {
477
354
  newValue = getValues(newValue);
478
355
  props.onChange(!!props.multiple ? newValue : newValue[0]);
479
356
  }
480
- function isValueValid(value) {
481
- for (let i = 0; i < value.length; i++) {
482
- if (isValueDisabled(value[i])) {
483
- return false;
484
- }
485
- }
486
- return true;
487
- }
488
357
  function getIndexLimit(index) {
489
358
  let before, after;
490
359
  if (index === 0) {
@@ -508,6 +377,13 @@ const useRange = (PROPS) => {
508
377
  }
509
378
  return res;
510
379
  }
380
+ const getFloatLength = (step) => {
381
+ const str = step.toString();
382
+ if (str.indexOf('.') === -1) {
383
+ return 0;
384
+ }
385
+ return str.split('.')[1].length;
386
+ };
511
387
  function getValues(value) {
512
388
  if (!Array.isArray(value)) {
513
389
  value = [value || 0];
@@ -515,8 +391,12 @@ const useRange = (PROPS) => {
515
391
  for (let i = 0; i < value.length; i++) {
516
392
  let point = value[i] || 0;
517
393
  point = Math.round((point - start) / step) * step + start;
518
- const { floatLength } = UT.Float(step);
519
- point = +floatLength;
394
+ try {
395
+ point = +point.toFixed(getFloatLength(step));
396
+ }
397
+ catch (err) {
398
+ console.error(err.message);
399
+ }
520
400
  if (point < min) {
521
401
  point = min;
522
402
  }
@@ -534,7 +414,7 @@ const useRange = (PROPS) => {
534
414
  return vertical ? (reverse ? 'bottom' : 'top') : (reverse ? 'right' : 'left');
535
415
  }
536
416
  function fixValueInEmpty(value) {
537
- let fill = round || 1;
417
+ let fill = round;
538
418
  let empty = 1 - fill;
539
419
  let emptyValue = empty * (end - start) / fill;
540
420
  if (value > end + emptyValue / 2) {
@@ -544,7 +424,7 @@ const useRange = (PROPS) => {
544
424
  }
545
425
  function fixAngle(angle) { angle = angle % 360; return angle < 0 ? angle = 360 + angle : angle; }
546
426
  function getValueByAngle(angle) {
547
- let fillAngle = 360 * (round || 1);
427
+ let fillAngle = 360 * round;
548
428
  let emptyAngle = 360 - fillAngle;
549
429
  if (reverse) {
550
430
  angle = 180 - angle;
@@ -609,11 +489,119 @@ const useRange = (PROPS) => {
609
489
  offset = sbp(offset);
610
490
  return { thickness, radius, color, roundCap, full, className, from, to };
611
491
  };
612
- function getGroove() {
613
- return _jsx("div", Object.assign({}, UT.AddToAttrs(grooveAttrs, { className: 'ai-range-groove' })));
492
+ function handleZIndex(index) {
493
+ let containers = $(mainDom.current).find(`.ai-range-value-container`);
494
+ containers.css({ zIndex: 10 });
495
+ containers.eq(index).css({ zIndex: 100 });
496
+ }
497
+ function getOffset(rangeValue) {
498
+ const { pointOffset = (() => 0) } = props.rangeOption || {};
499
+ return pointOffset(rangeValue) || 0;
500
+ }
501
+ function getSliderPointContainerStyle(rangeValue) { return { [vertical ? 'left' : 'top']: getOffset(rangeValue) }; }
502
+ function getSpinnerPointContainerStyle(rangeValue) { return { left: size / 2 + getOffset(rangeValue), transform: `rotate(${-rangeValue.angle}deg)` }; }
503
+ function getSliderValueProps(rangeValue) { return { className: 'ai-range-value-container', draggable: false, style: { [getSide()]: getXPByValue(rangeValue.value) + '%' } }; }
504
+ function getSpinnerValueProps(rangeValue) {
505
+ return { className: 'ai-range-value-container', draggable: false, style: { transform: `rotate(${rangeValue.angle}deg)` } };
506
+ }
507
+ const getRangeValue = (itemValue, index) => {
508
+ let angle = fixAngle(getAngleByValue(itemValue));
509
+ return { value: itemValue, index, angle };
510
+ };
511
+ function getRootClassName(props, type) {
512
+ let c = 'ai-range';
513
+ if (type === "spinner") {
514
+ c += ` ai-spinner`;
515
+ }
516
+ else {
517
+ c += props.vertical ? ` ai-slider-vertical` : ` ai-slider-horizontal`;
518
+ }
519
+ if (props.className) {
520
+ c += ' ' + props.className;
521
+ }
522
+ if (props.reverse) {
523
+ c += ` ai-${type === "spinner" ? 'spinner' : 'slider'}-reverse`;
524
+ }
525
+ return c;
526
+ }
527
+ function getRootStyle(props, type) {
528
+ let { style } = props;
529
+ let res;
530
+ if (type === "spinner") {
531
+ res = { width: props.size, height: props.size };
532
+ }
533
+ return Object.assign(Object.assign({}, res), style);
534
+ }
535
+ function getRootProps(props, type) {
536
+ let { attrs = {} } = props;
537
+ let rootStyle = getRootStyle(props, type);
538
+ return UT.AddToAttrs(attrs, { className: getRootClassName(props, type), style: rootStyle, attrs: { ref: mainDom } });
539
+ }
540
+ function getDistance(labelItem, type) {
541
+ let { offset = 0 } = labelItem;
542
+ let distance = { [type === "spinner" || vertical ? 'left' : 'top']: size * offset / 100 / 2 };
543
+ if (type === "spinner") {
544
+ distance.left = size * offset / 100 / 2;
545
+ }
546
+ else if (vertical) {
547
+ distance.left = `calc(50% + ${offset || 0}px)`;
548
+ }
549
+ else {
550
+ distance.top = `calc(50% + ${offset || 0}px)`;
551
+ }
552
+ return distance;
553
+ }
554
+ function getSliderLabel(labelItem, itemValue) {
555
+ let { html = '', config } = labelItem;
556
+ if (config) {
557
+ html = (_jsx("div", { style: {
558
+ [!vertical ? 'width' : 'height']: size * config.thickness / 100,
559
+ [!vertical ? 'height' : 'width']: size * config.height / 100,
560
+ background: config.color
561
+ } }));
562
+ }
563
+ const htmlProps = UT.AddToAttrs({}, { className: ['ai-range-label'], attrs: { draggable: false } });
564
+ const containerStyle = Object.assign({ [getSide()]: getXPByValue(itemValue) + '%' }, getDistance(labelItem, 'slider'));
565
+ const containerProps = { className: 'ai-range-label-container', style: containerStyle, draggable: false };
566
+ return (_jsx("div", Object.assign({}, containerProps, { children: _jsx("div", Object.assign({}, htmlProps, { children: html })) })));
567
+ }
568
+ function getLabelList(label) {
569
+ let { step, list = [] } = label;
570
+ let res = [];
571
+ if (step) {
572
+ let { start: lstart = start, end: lend = end } = label;
573
+ for (let i = lstart; i <= lend; i += step) {
574
+ res.push(i);
575
+ }
576
+ }
577
+ for (let i = 0; i < list.length; i++) {
578
+ if (res.indexOf(list[i]) === -1) {
579
+ res.push(list[i]);
580
+ }
581
+ }
582
+ return res;
583
+ }
584
+ function getSpinnerLabel(labelItem, itemValue) {
585
+ let { html = '', config } = labelItem;
586
+ if (config) {
587
+ html = (_jsx("div", { style: {
588
+ height: size * config.thickness / 100,
589
+ width: size * config.height / 100,
590
+ background: config.color
591
+ } }));
592
+ }
593
+ let angle = fixAngle(getAngleByValue(itemValue)) || 0;
594
+ let containerStyle = { transform: `rotate(${angle}deg)` };
595
+ let containerProps = { className: 'ai-range-label-container', style: containerStyle, draggable: false };
596
+ const distance = getDistance(labelItem, "spinner");
597
+ let textStyle = Object.assign(Object.assign({}, distance), { transform: labelItem.fixAngle ? `rotate(${-angle}deg)` : undefined });
598
+ const htmlProps = UT.AddToAttrs({}, { className: ['ai-range-label'], style: textStyle, attrs: { draggable: false } });
599
+ return (_jsx("div", Object.assign({}, containerProps, { children: _jsx("div", Object.assign({}, htmlProps, { children: html })) })));
614
600
  }
615
601
  return {
616
- values, getValues, getSide, fixAngle, getValueByAngle, mainDom, isValueDisabled, rootProps: props,
617
- getArc, getAngleByValue, getRectByStr, sbp, getXPByValue, getValueByXP, getXPByX, getGroove
602
+ values, getValues, getSide, fixAngle, getValueByAngle, mainDom, rootProps: props, getRootProps, getLabelList,
603
+ getArc, getAngleByValue, getRectByStr, sbp, getXPByValue, getValueByXP, getXPByX, handleZIndex, getSpinnerLabel,
604
+ getSliderPointContainerStyle, getSpinnerPointContainerStyle, getSliderValueProps, getSpinnerValueProps, getRangeValue,
605
+ getSliderLabel
618
606
  };
619
607
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "aio-range",
3
- "version": "2.0.0",
3
+ "version": "2.0.2",
4
4
  "description": "linear and circular range input",
5
5
  "main": "index.js",
6
6
  "scripts": {