aio-range 1.0.1 → 2.0.1

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 +49 -8
  3. package/index.js +192 -190
  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>;
@@ -24,6 +24,7 @@ export type AI_label = {
24
24
  setting: (value: number, p: {
25
25
  angle: number;
26
26
  disabled: boolean;
27
+ index: number;
27
28
  }) => AI_labelItem;
28
29
  };
29
30
  export type AI_labelItem = {
@@ -78,6 +79,12 @@ export type I_Range = {
78
79
  disabled: boolean;
79
80
  angle: number;
80
81
  }) => ReactNode | false | undefined;
82
+ pointContent?: (p: {
83
+ index: number;
84
+ value: number;
85
+ disabled: boolean;
86
+ angle: number;
87
+ }) => ReactNode;
81
88
  pointOffset?: (p: {
82
89
  index: number;
83
90
  value: number;
@@ -122,13 +129,15 @@ type I_Range_default = I_Range & {
122
129
  rotate: number;
123
130
  ranges: I_range[];
124
131
  };
125
- declare const AIORange: FC<I_Range>;
126
- export default AIORange;
127
- export type I_RangeLabelItem = {
128
- label: AI_label;
129
- itemValue: number;
132
+ export declare const AIOSlider: FC<I_Range>;
133
+ export declare const AIOSpinner: FC<I_Range>;
134
+ type I_RangeValue = {
135
+ value: number;
136
+ disabled: boolean;
137
+ angle: number;
138
+ index: number;
130
139
  };
131
- declare const useRange: (PROPS: I_Range) => {
140
+ declare const useRange: (PROPS: I_Range, type: 'slider' | 'spinner') => {
132
141
  values: number[];
133
142
  getValues: (value: any) => number[];
134
143
  getSide: () => "left" | "right" | "bottom" | "top";
@@ -137,6 +146,8 @@ declare const useRange: (PROPS: I_Range) => {
137
146
  mainDom: any;
138
147
  isValueDisabled: (value: number) => boolean;
139
148
  rootProps: I_Range_default;
149
+ getRootProps: (props: I_Range, type: 'slider' | 'spinner') => any;
150
+ getLabelList: (label: AI_label) => number[];
140
151
  getArc: (rc: I_range) => {
141
152
  thickness: number;
142
153
  color: string;
@@ -153,5 +164,35 @@ declare const useRange: (PROPS: I_Range) => {
153
164
  getXPByValue: (value: number) => number;
154
165
  getValueByXP: (xp: number) => number;
155
166
  getXPByX: (x: number) => number;
156
- getGroove: () => import("react/jsx-runtime").JSX.Element;
167
+ handleZIndex: (index: number) => void;
168
+ getSpinnerLabel: (labelItem: AI_labelItem, itemValue: number) => import("react/jsx-runtime").JSX.Element;
169
+ getSliderPointContainerStyle: (rangeValue: I_RangeValue) => {
170
+ [x: string]: number;
171
+ };
172
+ getSpinnerPointContainerStyle: (rangeValue: I_RangeValue) => {
173
+ left: number;
174
+ transform: string;
175
+ };
176
+ getSliderValueProps: (rangeValue: I_RangeValue) => {
177
+ className: string;
178
+ draggable: boolean;
179
+ style: {
180
+ [x: string]: string;
181
+ };
182
+ };
183
+ getSpinnerValueProps: (rangeValue: I_RangeValue) => {
184
+ className: string;
185
+ draggable: boolean;
186
+ style: {
187
+ transform: string;
188
+ };
189
+ };
190
+ getRangeValue: (itemValue: number, index: number) => {
191
+ disabled: boolean;
192
+ value: number;
193
+ index: number;
194
+ angle: number;
195
+ };
196
+ getSliderLabel: (labelItem: AI_labelItem, itemValue: number) => import("react/jsx-runtime").JSX.Element;
157
197
  };
198
+ 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 });
47
26
  };
48
- export default AIORange;
49
- const RangeValues = () => {
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)) }));
31
+ };
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,32 @@ 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) => _jsx(RangeLabelItem, { label: label, itemValue: itemValue }, itemValue)) }));
198
+ const list = rangeHook.getLabelList(label);
199
+ return (_jsx("div", { className: 'ai-range-labels', style: { zIndex }, children: list.map((itemValue, index) => {
200
+ let disabled = rangeHook.isValueDisabled(itemValue);
201
+ let labelItem = label.setting(itemValue, { disabled, angle: 0, index });
202
+ if (props.type === "slider") {
203
+ return (rangeHook.getSliderLabel(labelItem, itemValue));
204
+ }
205
+ else {
206
+ return rangeHook.getSpinnerLabel(labelItem, itemValue);
207
+ }
208
+ }) }));
246
209
  }
247
210
  return _jsx(_Fragment, { children: RENDER(false) });
248
211
  };
249
- const RangeLabelItem = (props) => {
212
+ const AIRangePoint = ({ rangeValue, type }) => {
250
213
  let { rangeHook } = useRangeProvider();
251
- let { label, itemValue } = 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 });
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 { pointHtml = (() => _jsx("div", { className: 'ai-range-point', children: props.value })), pointOffset = (() => 0) } = rangeOption;
324
- const point = pointHtml(props);
214
+ const { rangeOption = {} } = rangeHook.rootProps;
215
+ const { pointContent = (() => rangeValue.value), pointHtml = (() => _jsx("div", { className: 'ai-range-point', children: pointContent(rangeValue) })), } = rangeOption;
216
+ const point = pointHtml(rangeValue);
325
217
  if (point === false) {
326
218
  return null;
327
219
  }
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));
220
+ const containerStyle = type === "spinner" ? rangeHook.getSpinnerPointContainerStyle(rangeValue) : rangeHook.getSliderPointContainerStyle(rangeValue);
221
+ return (_jsx("div", { style: containerStyle, className: 'ai-range-point-container', draggable: false, "data-index": rangeValue.index, onMouseDown: () => rangeHook.handleZIndex(rangeValue.index), children: point }, 'rangepoint' + rangeValue.index));
330
222
  };
331
- const useRange = (PROPS) => {
223
+ const useRange = (PROPS, type) => {
332
224
  const getProps = () => {
333
225
  const { start = 0, end = 100, min = start, max = end, step = 1, size = 72, labels = [], rotate = 0, ranges = [] } = PROPS;
334
226
  return Object.assign(Object.assign({}, PROPS), { start, end, min, max, step, size, labels, rotate, ranges });
@@ -339,7 +231,7 @@ const useRange = (PROPS) => {
339
231
  let [temp] = useState({ start: 0, index: false });
340
232
  const [mainDom] = useState(createRef());
341
233
  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;
234
+ const { vertical, reverse, start = 0, end = 100, min = start, max = end, step = 1, rotate = 0, round = 1, size = 72 } = props;
343
235
  useEffect(() => {
344
236
  if (!props.onChange || props.disabled === true) {
345
237
  return;
@@ -386,7 +278,7 @@ const useRange = (PROPS) => {
386
278
  }
387
279
  let clickedValue;
388
280
  //vertical condition
389
- if (props.round) {
281
+ if (type === "spinner") {
390
282
  clickedValue = getValueByAngle(mousePosition.centerAngle);
391
283
  }
392
284
  else {
@@ -425,7 +317,7 @@ const useRange = (PROPS) => {
425
317
  let res;
426
318
  if (index === false) {
427
319
  let deltaValue;
428
- if (props.round) {
320
+ if (type === "spinner") {
429
321
  let v = deltaCenterAngle * (props.end - props.start) / 360;
430
322
  v = Math.round(v / props.step) * props.step;
431
323
  deltaValue = v;
@@ -439,7 +331,7 @@ const useRange = (PROPS) => {
439
331
  else {
440
332
  let { before, after } = getIndexLimit(index);
441
333
  let newUnitValue;
442
- if (props.round) {
334
+ if (type === 'spinner') {
443
335
  newUnitValue = Math.round(getValueByAngle(centerAngle) / props.step) * props.step;
444
336
  }
445
337
  else {
@@ -515,7 +407,8 @@ const useRange = (PROPS) => {
515
407
  for (let i = 0; i < value.length; i++) {
516
408
  let point = value[i] || 0;
517
409
  point = Math.round((point - start) / step) * step + start;
518
- point = +point.toFixed(UT.GetPrecisionCount(step));
410
+ const { floatLength } = UT.Float(step);
411
+ point = +point.toFixed(floatLength);
519
412
  if (point < min) {
520
413
  point = min;
521
414
  }
@@ -533,7 +426,7 @@ const useRange = (PROPS) => {
533
426
  return vertical ? (reverse ? 'bottom' : 'top') : (reverse ? 'right' : 'left');
534
427
  }
535
428
  function fixValueInEmpty(value) {
536
- let fill = round || 1;
429
+ let fill = round;
537
430
  let empty = 1 - fill;
538
431
  let emptyValue = empty * (end - start) / fill;
539
432
  if (value > end + emptyValue / 2) {
@@ -543,7 +436,7 @@ const useRange = (PROPS) => {
543
436
  }
544
437
  function fixAngle(angle) { angle = angle % 360; return angle < 0 ? angle = 360 + angle : angle; }
545
438
  function getValueByAngle(angle) {
546
- let fillAngle = 360 * (round || 1);
439
+ let fillAngle = 360 * round;
547
440
  let emptyAngle = 360 - fillAngle;
548
441
  if (reverse) {
549
442
  angle = 180 - angle;
@@ -608,11 +501,120 @@ const useRange = (PROPS) => {
608
501
  offset = sbp(offset);
609
502
  return { thickness, radius, color, roundCap, full, className, from, to };
610
503
  };
611
- function getGroove() {
612
- return _jsx("div", Object.assign({}, UT.AddToAttrs(grooveAttrs, { className: 'ai-range-groove' })));
504
+ function handleZIndex(index) {
505
+ let containers = $(mainDom.current).find(`.ai-range-value-container`);
506
+ containers.css({ zIndex: 10 });
507
+ containers.eq(index).css({ zIndex: 100 });
508
+ }
509
+ function getOffset(rangeValue) {
510
+ const { pointOffset = (() => 0) } = props.rangeOption || {};
511
+ return pointOffset(rangeValue) || 0;
512
+ }
513
+ function getSliderPointContainerStyle(rangeValue) { return { [vertical ? 'left' : 'top']: getOffset(rangeValue) }; }
514
+ function getSpinnerPointContainerStyle(rangeValue) { return { left: size / 2 + getOffset(rangeValue), transform: `rotate(${-rangeValue.angle}deg)` }; }
515
+ function getSliderValueProps(rangeValue) { return { className: 'ai-range-value-container', draggable: false, style: { [getSide()]: getXPByValue(rangeValue.value) + '%' } }; }
516
+ function getSpinnerValueProps(rangeValue) {
517
+ return { className: 'ai-range-value-container', draggable: false, style: { transform: `rotate(${rangeValue.angle}deg)` } };
518
+ }
519
+ const getRangeValue = (itemValue, index) => {
520
+ let angle = fixAngle(getAngleByValue(itemValue));
521
+ const disabled = isValueDisabled(itemValue);
522
+ return { disabled, value: itemValue, index, angle };
523
+ };
524
+ function getRootClassName(props, type) {
525
+ let c = 'ai-range';
526
+ if (type === "spinner") {
527
+ c += ` ai-spinner`;
528
+ }
529
+ else {
530
+ c += props.vertical ? ` ai-slider-vertical` : ` ai-slider-horizontal`;
531
+ }
532
+ if (props.className) {
533
+ c += ' ' + props.className;
534
+ }
535
+ if (props.reverse) {
536
+ c += ` ai-${type === "spinner" ? 'spinner' : 'slider'}-reverse`;
537
+ }
538
+ return c;
539
+ }
540
+ function getRootStyle(props, type) {
541
+ let { style } = props;
542
+ let res;
543
+ if (type === "spinner") {
544
+ res = { width: props.size, height: props.size };
545
+ }
546
+ return Object.assign(Object.assign({}, res), style);
547
+ }
548
+ function getRootProps(props, type) {
549
+ let { attrs = {} } = props;
550
+ let rootStyle = getRootStyle(props, type);
551
+ return UT.AddToAttrs(attrs, { className: getRootClassName(props, type), style: rootStyle, attrs: { ref: mainDom } });
552
+ }
553
+ function getDistance(labelItem, type) {
554
+ let { offset = 0 } = labelItem;
555
+ let distance = { [type === "spinner" || vertical ? 'left' : 'top']: size * offset / 100 / 2 };
556
+ if (type === "spinner") {
557
+ distance.left = size * offset / 100 / 2;
558
+ }
559
+ else if (vertical) {
560
+ distance.left = `calc(50% + ${offset || 0}px)`;
561
+ }
562
+ else {
563
+ distance.top = `calc(50% + ${offset || 0}px)`;
564
+ }
565
+ return distance;
566
+ }
567
+ function getSliderLabel(labelItem, itemValue) {
568
+ let { html = '', config } = labelItem;
569
+ if (config) {
570
+ html = (_jsx("div", { style: {
571
+ [!vertical ? 'width' : 'height']: size * config.thickness / 100,
572
+ [!vertical ? 'height' : 'width']: size * config.height / 100,
573
+ background: config.color
574
+ } }));
575
+ }
576
+ const htmlProps = UT.AddToAttrs({}, { className: ['ai-range-label'], attrs: { draggable: false } });
577
+ const containerStyle = Object.assign({ [getSide()]: getXPByValue(itemValue) + '%' }, getDistance(labelItem, 'slider'));
578
+ const containerProps = { className: 'ai-range-label-container', style: containerStyle, draggable: false };
579
+ return (_jsx("div", Object.assign({}, containerProps, { children: _jsx("div", Object.assign({}, htmlProps, { children: html })) })));
580
+ }
581
+ function getLabelList(label) {
582
+ let { step, list = [] } = label;
583
+ let res = [];
584
+ if (step) {
585
+ let { start: lstart = start, end: lend = end } = label;
586
+ for (let i = lstart; i <= lend; i += step) {
587
+ res.push(i);
588
+ }
589
+ }
590
+ for (let i = 0; i < list.length; i++) {
591
+ if (res.indexOf(list[i]) === -1) {
592
+ res.push(list[i]);
593
+ }
594
+ }
595
+ return res;
596
+ }
597
+ function getSpinnerLabel(labelItem, itemValue) {
598
+ let { html = '', config } = labelItem;
599
+ if (config) {
600
+ html = (_jsx("div", { style: {
601
+ height: size * config.thickness / 100,
602
+ width: size * config.height / 100,
603
+ background: config.color
604
+ } }));
605
+ }
606
+ let angle = fixAngle(getAngleByValue(itemValue)) || 0;
607
+ let containerStyle = { transform: `rotate(${angle}deg)` };
608
+ let containerProps = { className: 'ai-range-label-container', style: containerStyle, draggable: false };
609
+ const distance = getDistance(labelItem, "spinner");
610
+ let textStyle = Object.assign(Object.assign({}, distance), { transform: labelItem.fixAngle ? `rotate(${-angle}deg)` : undefined });
611
+ const htmlProps = UT.AddToAttrs({}, { className: ['ai-range-label'], style: textStyle, attrs: { draggable: false } });
612
+ return (_jsx("div", Object.assign({}, containerProps, { children: _jsx("div", Object.assign({}, htmlProps, { children: html })) })));
613
613
  }
614
614
  return {
615
- values, getValues, getSide, fixAngle, getValueByAngle, mainDom, isValueDisabled, rootProps: props,
616
- getArc, getAngleByValue, getRectByStr, sbp, getXPByValue, getValueByXP, getXPByX, getGroove
615
+ values, getValues, getSide, fixAngle, getValueByAngle, mainDom, isValueDisabled, rootProps: props, getRootProps, getLabelList,
616
+ getArc, getAngleByValue, getRectByStr, sbp, getXPByValue, getValueByXP, getXPByX, handleZIndex, getSpinnerLabel,
617
+ getSliderPointContainerStyle, getSpinnerPointContainerStyle, getSliderValueProps, getSpinnerValueProps, getRangeValue,
618
+ getSliderLabel
617
619
  };
618
620
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "aio-range",
3
- "version": "1.0.1",
3
+ "version": "2.0.1",
4
4
  "description": "linear and circular range input",
5
5
  "main": "index.js",
6
6
  "scripts": {