rsuite 6.0.0-canary-20250620 → 6.0.0-canary-2025062016
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/SegmentedControl/package.json +7 -0
- package/SegmentedControl/styles/index.css +157 -0
- package/cjs/Grid/utils/styles.d.ts +1 -1
- package/cjs/RadioGroup/RadioGroup.d.ts +4 -1
- package/cjs/SegmentedControl/Indicator.d.ts +10 -0
- package/cjs/SegmentedControl/Indicator.js +22 -0
- package/cjs/SegmentedControl/SegmentedControl.d.ts +27 -0
- package/cjs/SegmentedControl/SegmentedControl.js +87 -0
- package/cjs/SegmentedControl/SegmentedItem.d.ts +16 -0
- package/cjs/SegmentedControl/SegmentedItem.js +44 -0
- package/cjs/SegmentedControl/hooks/useIndicatorPosition.d.ts +17 -0
- package/cjs/SegmentedControl/hooks/useIndicatorPosition.js +55 -0
- package/cjs/SegmentedControl/index.d.ts +4 -0
- package/cjs/SegmentedControl/index.js +11 -0
- package/cjs/Slider/ProgressBar.js +1 -1
- package/cjs/index.d.ts +1 -0
- package/cjs/index.js +6 -0
- package/cjs/internals/Provider/types.d.ts +2 -0
- package/cjs/internals/hooks/useElementResize.d.ts +2 -1
- package/cjs/internals/hooks/useElementResize.js +50 -7
- package/cjs/internals/utils/style-sheet/css.d.ts +1 -1
- package/cjs/internals/utils/style-sheet/css.js +1 -1
- package/dist/rsuite-no-reset.css +197 -18
- package/dist/rsuite-no-reset.min.css +1 -1
- package/dist/rsuite.css +197 -18
- package/dist/rsuite.js +130 -5
- package/dist/rsuite.js.map +1 -1
- package/dist/rsuite.min.css +1 -1
- package/dist/rsuite.min.js +1 -1
- package/dist/rsuite.min.js.map +1 -1
- package/esm/Grid/utils/styles.d.ts +1 -1
- package/esm/RadioGroup/RadioGroup.d.ts +4 -1
- package/esm/SegmentedControl/Indicator.d.ts +10 -0
- package/esm/SegmentedControl/Indicator.js +17 -0
- package/esm/SegmentedControl/SegmentedControl.d.ts +27 -0
- package/esm/SegmentedControl/SegmentedControl.js +81 -0
- package/esm/SegmentedControl/SegmentedItem.d.ts +16 -0
- package/esm/SegmentedControl/SegmentedItem.js +39 -0
- package/esm/SegmentedControl/hooks/useIndicatorPosition.d.ts +17 -0
- package/esm/SegmentedControl/hooks/useIndicatorPosition.js +50 -0
- package/esm/SegmentedControl/index.d.ts +4 -0
- package/esm/SegmentedControl/index.js +8 -0
- package/esm/Slider/ProgressBar.js +1 -1
- package/esm/index.d.ts +1 -0
- package/esm/index.js +1 -0
- package/esm/internals/Provider/types.d.ts +2 -0
- package/esm/internals/hooks/useElementResize.d.ts +2 -1
- package/esm/internals/hooks/useElementResize.js +50 -7
- package/esm/internals/utils/style-sheet/css.d.ts +1 -1
- package/esm/internals/utils/style-sheet/css.js +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
:root{
|
|
2
|
+
--rs-segmented-control-spacing:calc(var(--rs-spacing) * 1);
|
|
3
|
+
--rs-segmented-control-border-radius:var(--rs-radius-md);
|
|
4
|
+
--rs-segmented-control-border-width:1px;
|
|
5
|
+
--rs-segmented-control-padding:calc(var(--rs-spacing) * 0.5);
|
|
6
|
+
--rs-segmented-control-height:36px;
|
|
7
|
+
--rs-segmented-control-height-xs:24px;
|
|
8
|
+
--rs-segmented-control-height-sm:30px;
|
|
9
|
+
--rs-segmented-control-height-lg:42px;
|
|
10
|
+
--rs-segmented-control-height-xl:48px;
|
|
11
|
+
--rs-segmented-control-item-padding-y:calc(var(--rs-spacing) * 1);
|
|
12
|
+
--rs-segmented-control-item-padding-y-xs:calc(var(--rs-spacing) * 0.5);
|
|
13
|
+
--rs-segmented-control-item-padding-y-sm:calc(var(--rs-spacing) * 0.75);
|
|
14
|
+
--rs-segmented-control-item-padding-y-lg:calc(var(--rs-spacing) * 1.25);
|
|
15
|
+
--rs-segmented-control-item-padding-y-xl:calc(var(--rs-spacing) * 1.5);
|
|
16
|
+
--rs-segmented-control-item-padding-x:calc(var(--rs-spacing) * 2);
|
|
17
|
+
--rs-segmented-control-item-padding-x-xs:calc(var(--rs-spacing) * 1.5);
|
|
18
|
+
--rs-segmented-control-item-padding-x-sm:calc(var(--rs-spacing) * 1.75);
|
|
19
|
+
--rs-segmented-control-item-padding-x-lg:calc(var(--rs-spacing) * 2.25);
|
|
20
|
+
--rs-segmented-control-item-padding-x-xl:calc(var(--rs-spacing) * 2.5);
|
|
21
|
+
--rs-segmented-control-font-size:var(--rs-font-size-sm);
|
|
22
|
+
--rs-segmented-control-font-size-xs:var(--rs-font-size-extra-small);
|
|
23
|
+
--rs-segmented-control-font-size-sm:var(--rs-font-size-sm);
|
|
24
|
+
--rs-segmented-control-font-size-lg:var(--rs-font-size-base);
|
|
25
|
+
--rs-segmented-control-font-size-xl:var(--rs-font-size-large);
|
|
26
|
+
--rs-segmented-control-indicator-transition:all 0.2s cubic-bezier(0.4, 0, 0.2, 1);
|
|
27
|
+
--rs-segmented-control-indicator-border-radius:calc(var(--rs-radius-md) - 2px);
|
|
28
|
+
--rs-segmented-control-indicator-shadow:0 1px 3px 0 rgb(0 0 0 / 0.1), 0 1px 2px -1px rgb(0 0 0 / 0.1);
|
|
29
|
+
--rs-segmented-control-underline-height:2px;
|
|
30
|
+
--rs-segmented-control-pill-indicator-height:calc(var(--rs-segmented-control-height) - 8px);
|
|
31
|
+
--rs-segmented-control-pill-indicator-border-radius:var(--rs-radius-md);
|
|
32
|
+
--rs-segmented-control-pill-indicator-shadow:var(--rs-shadow-sm);
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
.rs-segmented-control{
|
|
36
|
+
display:inline-flex;
|
|
37
|
+
position:relative;
|
|
38
|
+
align-items:center;
|
|
39
|
+
height:var(--rs-segmented-control-height);
|
|
40
|
+
border-style:solid;
|
|
41
|
+
border-width:var(--rs-segmented-control-border-width);
|
|
42
|
+
border-color:var(--rs-segmented-control-border-color);
|
|
43
|
+
border-radius:var(--rs-segmented-control-border-radius);
|
|
44
|
+
padding:var(--rs-segmented-control-padding);
|
|
45
|
+
gap:var(--rs-segmented-control-spacing);
|
|
46
|
+
background-color:var(--rs-segmented-control-bg);
|
|
47
|
+
box-sizing:border-box;
|
|
48
|
+
font-size:var(--rs-segmented-control-font-size);
|
|
49
|
+
}
|
|
50
|
+
.rs-segmented-control:where([data-size=xs]){
|
|
51
|
+
--rs-segmented-control-height:var(--rs-segmented-control-height-xs);
|
|
52
|
+
--rs-segmented-control-item-padding-y:var(--rs-segmented-control-item-padding-y-xs);
|
|
53
|
+
--rs-segmented-control-item-padding-x:var(--rs-segmented-control-item-padding-x-xs);
|
|
54
|
+
--rs-segmented-control-font-size:var(--rs-segmented-control-font-size-xs);
|
|
55
|
+
}
|
|
56
|
+
.rs-segmented-control:where([data-size=sm]){
|
|
57
|
+
--rs-segmented-control-height:var(--rs-segmented-control-height-sm);
|
|
58
|
+
--rs-segmented-control-item-padding-y:var(--rs-segmented-control-item-padding-y-sm);
|
|
59
|
+
--rs-segmented-control-item-padding-x:var(--rs-segmented-control-item-padding-x-sm);
|
|
60
|
+
--rs-segmented-control-font-size:var(--rs-segmented-control-font-size-sm);
|
|
61
|
+
}
|
|
62
|
+
.rs-segmented-control:where([data-size=lg]){
|
|
63
|
+
--rs-segmented-control-height:var(--rs-segmented-control-height-lg);
|
|
64
|
+
--rs-segmented-control-item-padding-y:var(--rs-segmented-control-item-padding-y-lg);
|
|
65
|
+
--rs-segmented-control-item-padding-x:var(--rs-segmented-control-item-padding-x-lg);
|
|
66
|
+
--rs-segmented-control-font-size:var(--rs-segmented-control-font-size-lg);
|
|
67
|
+
}
|
|
68
|
+
.rs-segmented-control:where([data-size=xl]){
|
|
69
|
+
--rs-segmented-control-height:var(--rs-segmented-control-height-xl);
|
|
70
|
+
--rs-segmented-control-item-padding-y:var(--rs-segmented-control-item-padding-y-xl);
|
|
71
|
+
--rs-segmented-control-item-padding-x:var(--rs-segmented-control-item-padding-x-xl);
|
|
72
|
+
--rs-segmented-control-font-size:var(--rs-segmented-control-font-size-xl);
|
|
73
|
+
}
|
|
74
|
+
.rs-segmented-control[data-block=true]{
|
|
75
|
+
display:flex;
|
|
76
|
+
width:100%;
|
|
77
|
+
}
|
|
78
|
+
.rs-segmented-control[data-block=true] .rs-segmented-control-item{
|
|
79
|
+
flex:1 1 0%;
|
|
80
|
+
min-width:0;
|
|
81
|
+
text-align:center;
|
|
82
|
+
white-space:nowrap;
|
|
83
|
+
overflow:hidden;
|
|
84
|
+
text-overflow:ellipsis;
|
|
85
|
+
}
|
|
86
|
+
.rs-segmented-control:empty{
|
|
87
|
+
display:none;
|
|
88
|
+
}
|
|
89
|
+
.rs-segmented-control .rs-segmented-control-item{
|
|
90
|
+
position:relative;
|
|
91
|
+
z-index:1;
|
|
92
|
+
display:flex;
|
|
93
|
+
align-items:center;
|
|
94
|
+
justify-content:center;
|
|
95
|
+
height:100%;
|
|
96
|
+
padding-inline:var(--rs-segmented-control-item-padding-x);
|
|
97
|
+
padding-block:var(--rs-segmented-control-item-padding-y);
|
|
98
|
+
border-radius:var(--rs-segmented-control-indicator-border-radius);
|
|
99
|
+
cursor:pointer;
|
|
100
|
+
-webkit-user-select:none;
|
|
101
|
+
-moz-user-select:none;
|
|
102
|
+
user-select:none;
|
|
103
|
+
transition:color 0.2s ease;
|
|
104
|
+
color:var(--rs-segmented-control-item-color);
|
|
105
|
+
}
|
|
106
|
+
.rs-segmented-control .rs-segmented-control-item[data-active]{
|
|
107
|
+
color:var(--rs-segmented-control-item-active-color);
|
|
108
|
+
}
|
|
109
|
+
.rs-segmented-control .rs-segmented-control-item[data-disabled]{
|
|
110
|
+
opacity:0.5;
|
|
111
|
+
cursor:not-allowed;
|
|
112
|
+
}
|
|
113
|
+
.rs-segmented-control .rs-segmented-control-item .rs-segmented-control-radio{
|
|
114
|
+
position:absolute;
|
|
115
|
+
opacity:0;
|
|
116
|
+
width:0;
|
|
117
|
+
height:0;
|
|
118
|
+
margin:0;
|
|
119
|
+
padding:0;
|
|
120
|
+
}
|
|
121
|
+
.rs-segmented-control .rs-segmented-control-item .rs-segmented-control-label{
|
|
122
|
+
font-size:var(--rs-font-size-sm);
|
|
123
|
+
line-height:var(--rs-line-height-sm);
|
|
124
|
+
}
|
|
125
|
+
.rs-segmented-control .rs-segmented-control-indicator{
|
|
126
|
+
position:absolute;
|
|
127
|
+
z-index:0;
|
|
128
|
+
transition:var(--rs-segmented-control-indicator-transition);
|
|
129
|
+
box-shadow:var(--rs-segmented-control-indicator-shadow);
|
|
130
|
+
}
|
|
131
|
+
[data-theme=high-contrast] .rs-segmented-control .rs-segmented-control-indicator, .rs-theme-high-contrast .rs-segmented-control .rs-segmented-control-indicator{
|
|
132
|
+
transition:none;
|
|
133
|
+
}
|
|
134
|
+
.rs-segmented-control:where([data-indicator=pill]) .rs-segmented-control-indicator{
|
|
135
|
+
background-color:var(--rs-segmented-control-pill-indicator-bg);
|
|
136
|
+
border-radius:var(--rs-segmented-control-pill-indicator-border-radius);
|
|
137
|
+
box-shadow:var(--rs-segmented-control-pill-indicator-shadow);
|
|
138
|
+
height:var(--rs-segmented-control-pill-indicator-height);
|
|
139
|
+
}
|
|
140
|
+
.rs-segmented-control:where([data-indicator=underline]){
|
|
141
|
+
padding-block:0;
|
|
142
|
+
padding-inline:var(--rs-segmented-control-border-radius);
|
|
143
|
+
background-color:transparent;
|
|
144
|
+
}
|
|
145
|
+
.rs-segmented-control:where([data-indicator=underline]) .rs-segmented-control-item{
|
|
146
|
+
padding-bottom:calc(var(--rs-segmented-control-item-padding-y) + var(--rs-segmented-control-underline-height));
|
|
147
|
+
border-radius:0;
|
|
148
|
+
position:relative;
|
|
149
|
+
z-index:1;
|
|
150
|
+
}
|
|
151
|
+
.rs-segmented-control:where([data-indicator=underline]) .rs-segmented-control-indicator{
|
|
152
|
+
bottom:-1px;
|
|
153
|
+
height:var(--rs-segmented-control-underline-height);
|
|
154
|
+
background-color:var(--rs-segmented-control-underline-color);
|
|
155
|
+
border-radius:var(--rs-radius-none);
|
|
156
|
+
box-shadow:none;
|
|
157
|
+
}
|
|
@@ -3,4 +3,4 @@ import type { GutterType } from '../types';
|
|
|
3
3
|
/**
|
|
4
4
|
* Generates CSS variable styles for grid gutters, supporting both single values and arrays [horizontal, vertical]
|
|
5
5
|
*/
|
|
6
|
-
export declare const getResponsiveGutterStyles: (gutter?: GutterType | ResponsiveValue<GutterType>) => Record<string, string>;
|
|
6
|
+
export declare const getResponsiveGutterStyles: (gutter?: GutterType | ResponsiveValue<GutterType>) => Record<string, string | undefined>;
|
|
@@ -14,7 +14,10 @@ export interface RadioContextProps {
|
|
|
14
14
|
]>;
|
|
15
15
|
}
|
|
16
16
|
export interface RadioGroupProps<T = string | number> extends BoxProps, FormControlBaseProps<T> {
|
|
17
|
-
/**
|
|
17
|
+
/**
|
|
18
|
+
* A radio group can have different appearances
|
|
19
|
+
* @deprecated Use `<SegmentedControl indicator="underline" />` instead
|
|
20
|
+
*/
|
|
18
21
|
appearance?: 'default' | 'picker';
|
|
19
22
|
/** Name to use for form */
|
|
20
23
|
name?: string;
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
export interface IndicatorProps {
|
|
3
|
+
style: React.CSSProperties;
|
|
4
|
+
classPrefix: string;
|
|
5
|
+
}
|
|
6
|
+
declare const Indicator: {
|
|
7
|
+
({ style, classPrefix }: IndicatorProps): React.JSX.Element;
|
|
8
|
+
displayName: string;
|
|
9
|
+
};
|
|
10
|
+
export default Indicator;
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
"use strict";
|
|
3
|
+
|
|
4
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
5
|
+
exports.__esModule = true;
|
|
6
|
+
exports.default = void 0;
|
|
7
|
+
var _react = _interopRequireDefault(require("react"));
|
|
8
|
+
var _hooks = require("../internals/hooks");
|
|
9
|
+
const Indicator = ({
|
|
10
|
+
style,
|
|
11
|
+
classPrefix
|
|
12
|
+
}) => {
|
|
13
|
+
const {
|
|
14
|
+
prefix
|
|
15
|
+
} = (0, _hooks.useStyles)(classPrefix);
|
|
16
|
+
return /*#__PURE__*/_react.default.createElement("div", {
|
|
17
|
+
className: prefix('indicator'),
|
|
18
|
+
style: style
|
|
19
|
+
});
|
|
20
|
+
};
|
|
21
|
+
Indicator.displayName = 'Indicator';
|
|
22
|
+
var _default = exports.default = Indicator;
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { BoxProps } from '../internals/Box';
|
|
3
|
+
import type { FormControlBaseProps, Size } from '../internals/types';
|
|
4
|
+
export interface SegmentedItemDataType {
|
|
5
|
+
/** The label of the item */
|
|
6
|
+
label: React.ReactNode;
|
|
7
|
+
/** The value of the item */
|
|
8
|
+
value: string | number;
|
|
9
|
+
}
|
|
10
|
+
export interface SegmentedControlProps<T = string | number | null> extends BoxProps, Omit<FormControlBaseProps<T>, 'readOnly' | 'plaintext'> {
|
|
11
|
+
/** The indicator style of the segmented control */
|
|
12
|
+
indicator?: 'pill' | 'underline';
|
|
13
|
+
/** Name to use for form */
|
|
14
|
+
name?: string;
|
|
15
|
+
/** Data of segmented items */
|
|
16
|
+
data?: SegmentedItemDataType[];
|
|
17
|
+
/** Display block style, fit the width of the container */
|
|
18
|
+
block?: boolean;
|
|
19
|
+
/** A segmented control can have different sizes */
|
|
20
|
+
size?: Size;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* The `SegmentedControl` component is used to offer multiple exclusive options.
|
|
24
|
+
* @see https://rsuitejs.com/components/segmented-control
|
|
25
|
+
*/
|
|
26
|
+
declare const SegmentedControl: import("../internals/types").InternalRefForwardingComponent<"div", SegmentedControlProps<string | number | null>, never> & Record<string, never>;
|
|
27
|
+
export default SegmentedControl;
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
"use strict";
|
|
3
|
+
|
|
4
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
5
|
+
exports.__esModule = true;
|
|
6
|
+
exports.default = void 0;
|
|
7
|
+
var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
|
|
8
|
+
var _react = _interopRequireWildcard(require("react"));
|
|
9
|
+
var _Box = _interopRequireDefault(require("../internals/Box"));
|
|
10
|
+
var _SegmentedItem = _interopRequireDefault(require("./SegmentedItem"));
|
|
11
|
+
var _Indicator = _interopRequireDefault(require("./Indicator"));
|
|
12
|
+
var _utils = require("../internals/utils");
|
|
13
|
+
var _hooks = require("../internals/hooks");
|
|
14
|
+
var _useIndicatorPosition = _interopRequireDefault(require("./hooks/useIndicatorPosition"));
|
|
15
|
+
function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function (e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != typeof e && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (const t in e) "default" !== t && {}.hasOwnProperty.call(e, t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, t)) && (i.get || i.set) ? o(f, t, i) : f[t] = e[t]); return f; })(e, t); }
|
|
16
|
+
/**
|
|
17
|
+
* The `SegmentedControl` component is used to offer multiple exclusive options.
|
|
18
|
+
* @see https://rsuitejs.com/components/segmented-control
|
|
19
|
+
*/
|
|
20
|
+
const SegmentedControl = (0, _utils.forwardRef)((props, ref) => {
|
|
21
|
+
const {
|
|
22
|
+
propsWithDefaults
|
|
23
|
+
} = (0, _hooks.useCustom)('SegmentedControl', props);
|
|
24
|
+
const {
|
|
25
|
+
as,
|
|
26
|
+
className,
|
|
27
|
+
classPrefix = 'segmented-control',
|
|
28
|
+
value: valueProp,
|
|
29
|
+
defaultValue,
|
|
30
|
+
indicator = 'pill',
|
|
31
|
+
size = 'md',
|
|
32
|
+
block = false,
|
|
33
|
+
name,
|
|
34
|
+
disabled,
|
|
35
|
+
data,
|
|
36
|
+
onChange,
|
|
37
|
+
...rest
|
|
38
|
+
} = propsWithDefaults;
|
|
39
|
+
const {
|
|
40
|
+
merge,
|
|
41
|
+
withPrefix
|
|
42
|
+
} = (0, _hooks.useStyles)(classPrefix);
|
|
43
|
+
const classes = merge(className, withPrefix());
|
|
44
|
+
const [value, setValue] = (0, _hooks.useControlled)(valueProp, defaultValue);
|
|
45
|
+
const id = (0, _hooks.useUniqueId)('segmented', name);
|
|
46
|
+
|
|
47
|
+
// Ref for container element
|
|
48
|
+
const containerRef = (0, _react.useRef)(null);
|
|
49
|
+
|
|
50
|
+
// Get the active item index
|
|
51
|
+
const activeIndex = data === null || data === void 0 ? void 0 : data.findIndex(item => item.value === value);
|
|
52
|
+
const {
|
|
53
|
+
style: indicatorStyle
|
|
54
|
+
} = (0, _useIndicatorPosition.default)({
|
|
55
|
+
containerRef,
|
|
56
|
+
activeIndex,
|
|
57
|
+
indicator,
|
|
58
|
+
data
|
|
59
|
+
});
|
|
60
|
+
const handleChange = (0, _hooks.useEventCallback)((nextValue, event) => {
|
|
61
|
+
setValue(nextValue);
|
|
62
|
+
onChange === null || onChange === void 0 || onChange(nextValue !== null && nextValue !== void 0 ? nextValue : '', event);
|
|
63
|
+
});
|
|
64
|
+
return /*#__PURE__*/_react.default.createElement(_Box.default, (0, _extends2.default)({
|
|
65
|
+
as: as,
|
|
66
|
+
role: "radiogroup",
|
|
67
|
+
ref: (0, _utils.mergeRefs)(ref, containerRef),
|
|
68
|
+
className: classes,
|
|
69
|
+
"data-size": size,
|
|
70
|
+
"data-block": block || undefined,
|
|
71
|
+
"data-indicator": indicator
|
|
72
|
+
}, rest), data === null || data === void 0 ? void 0 : data.map((item, index) => /*#__PURE__*/_react.default.createElement(_SegmentedItem.default, {
|
|
73
|
+
key: index,
|
|
74
|
+
item: item,
|
|
75
|
+
index: index,
|
|
76
|
+
name: id,
|
|
77
|
+
active: value === item.value,
|
|
78
|
+
disabled: disabled,
|
|
79
|
+
classPrefix: classPrefix,
|
|
80
|
+
onChange: handleChange
|
|
81
|
+
})), activeIndex !== -1 && /*#__PURE__*/_react.default.createElement(_Indicator.default, {
|
|
82
|
+
style: indicatorStyle,
|
|
83
|
+
classPrefix: classPrefix
|
|
84
|
+
}));
|
|
85
|
+
});
|
|
86
|
+
SegmentedControl.displayName = 'SegmentedControl';
|
|
87
|
+
var _default = exports.default = SegmentedControl;
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { SegmentedItemDataType } from './SegmentedControl';
|
|
3
|
+
export interface SegmentedItemProps {
|
|
4
|
+
item: SegmentedItemDataType;
|
|
5
|
+
index: number;
|
|
6
|
+
name?: string;
|
|
7
|
+
active: boolean;
|
|
8
|
+
disabled?: boolean;
|
|
9
|
+
classPrefix: string;
|
|
10
|
+
onChange: (value: string | number, event: React.ChangeEvent<HTMLInputElement>) => void;
|
|
11
|
+
}
|
|
12
|
+
declare const SegmentedItem: {
|
|
13
|
+
({ item, index, name, active, disabled, classPrefix, onChange }: SegmentedItemProps): React.JSX.Element;
|
|
14
|
+
displayName: string;
|
|
15
|
+
};
|
|
16
|
+
export default SegmentedItem;
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
"use strict";
|
|
3
|
+
|
|
4
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
5
|
+
exports.__esModule = true;
|
|
6
|
+
exports.default = void 0;
|
|
7
|
+
var _react = _interopRequireDefault(require("react"));
|
|
8
|
+
var _hooks = require("../internals/hooks");
|
|
9
|
+
const SegmentedItem = ({
|
|
10
|
+
item,
|
|
11
|
+
index,
|
|
12
|
+
name,
|
|
13
|
+
active,
|
|
14
|
+
disabled,
|
|
15
|
+
classPrefix,
|
|
16
|
+
onChange
|
|
17
|
+
}) => {
|
|
18
|
+
const {
|
|
19
|
+
prefix
|
|
20
|
+
} = (0, _hooks.useStyles)(classPrefix);
|
|
21
|
+
const handleChange = event => {
|
|
22
|
+
if (disabled) return;
|
|
23
|
+
onChange(item.value, event);
|
|
24
|
+
};
|
|
25
|
+
return /*#__PURE__*/_react.default.createElement("label", {
|
|
26
|
+
className: prefix('item'),
|
|
27
|
+
"data-value": item.value,
|
|
28
|
+
"data-index": index,
|
|
29
|
+
"data-active": active || undefined,
|
|
30
|
+
"data-disabled": disabled || undefined
|
|
31
|
+
}, /*#__PURE__*/_react.default.createElement("input", {
|
|
32
|
+
type: "radio",
|
|
33
|
+
name: name,
|
|
34
|
+
value: String(item.value),
|
|
35
|
+
checked: active,
|
|
36
|
+
disabled: disabled,
|
|
37
|
+
onChange: handleChange,
|
|
38
|
+
className: prefix('radio')
|
|
39
|
+
}), /*#__PURE__*/_react.default.createElement("span", {
|
|
40
|
+
className: prefix('label')
|
|
41
|
+
}, item.label));
|
|
42
|
+
};
|
|
43
|
+
SegmentedItem.displayName = 'SegmentedItem';
|
|
44
|
+
var _default = exports.default = SegmentedItem;
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { RefObject } from 'react';
|
|
2
|
+
interface UseIndicatorPositionProps {
|
|
3
|
+
containerRef: RefObject<HTMLDivElement | null>;
|
|
4
|
+
activeIndex?: number;
|
|
5
|
+
indicator: 'pill' | 'underline';
|
|
6
|
+
data?: Array<{
|
|
7
|
+
value: string | number;
|
|
8
|
+
}>;
|
|
9
|
+
block?: boolean;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Custom hook to calculate and update the indicator position
|
|
13
|
+
*/
|
|
14
|
+
declare const useIndicatorPosition: ({ containerRef, activeIndex, indicator, data }: UseIndicatorPositionProps) => {
|
|
15
|
+
style: import("react").CSSProperties;
|
|
16
|
+
};
|
|
17
|
+
export default useIndicatorPosition;
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
"use strict";
|
|
3
|
+
|
|
4
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
5
|
+
exports.__esModule = true;
|
|
6
|
+
exports.default = void 0;
|
|
7
|
+
var _react = require("react");
|
|
8
|
+
var _isEqual = _interopRequireDefault(require("lodash/isEqual"));
|
|
9
|
+
var _hooks = require("../../internals/hooks");
|
|
10
|
+
/**
|
|
11
|
+
* Updates the indicator position based on the active item
|
|
12
|
+
*/
|
|
13
|
+
const updateIndicatorPosition = (container, activeIndex, indicator) => {
|
|
14
|
+
if (activeIndex === -1) return {};
|
|
15
|
+
const activeItem = container.querySelector(`[data-index="${activeIndex}"]`);
|
|
16
|
+
if (!activeItem) return {};
|
|
17
|
+
const containerStyle = window.getComputedStyle(container);
|
|
18
|
+
const paddingLeft = parseFloat(containerStyle.paddingLeft) || 0;
|
|
19
|
+
return {
|
|
20
|
+
transform: `translateX(${activeItem.offsetLeft - paddingLeft}px)`,
|
|
21
|
+
width: activeItem.offsetWidth,
|
|
22
|
+
height: indicator === 'underline' ? 2 : activeItem.offsetHeight
|
|
23
|
+
};
|
|
24
|
+
};
|
|
25
|
+
|
|
26
|
+
/**
|
|
27
|
+
* Custom hook to calculate and update the indicator position
|
|
28
|
+
*/
|
|
29
|
+
const useIndicatorPosition = ({
|
|
30
|
+
containerRef,
|
|
31
|
+
activeIndex,
|
|
32
|
+
indicator,
|
|
33
|
+
data
|
|
34
|
+
}) => {
|
|
35
|
+
const [indicatorStyle, setIndicatorStyle] = (0, _react.useState)({});
|
|
36
|
+
const updatePosition = (0, _react.useCallback)(() => {
|
|
37
|
+
if (!(containerRef !== null && containerRef !== void 0 && containerRef.current)) {
|
|
38
|
+
return;
|
|
39
|
+
}
|
|
40
|
+
const newStyle = updateIndicatorPosition(containerRef.current, activeIndex, indicator);
|
|
41
|
+
setIndicatorStyle(prev => (0, _isEqual.default)(prev, newStyle) ? prev : newStyle);
|
|
42
|
+
}, [containerRef, activeIndex, indicator]);
|
|
43
|
+
|
|
44
|
+
// Update position when active item or data changes
|
|
45
|
+
(0, _react.useEffect)(() => {
|
|
46
|
+
updatePosition();
|
|
47
|
+
}, [updatePosition, data]);
|
|
48
|
+
|
|
49
|
+
// Set up resize observer
|
|
50
|
+
(0, _hooks.useElementResize)(containerRef, updatePosition);
|
|
51
|
+
return {
|
|
52
|
+
style: indicatorStyle
|
|
53
|
+
};
|
|
54
|
+
};
|
|
55
|
+
var _default = exports.default = useIndicatorPosition;
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
"use strict";
|
|
3
|
+
|
|
4
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
5
|
+
exports.__esModule = true;
|
|
6
|
+
exports.default = void 0;
|
|
7
|
+
var _SegmentedControl = _interopRequireDefault(require("./SegmentedControl"));
|
|
8
|
+
exports.SegmentedControl = _SegmentedControl.default;
|
|
9
|
+
// export types
|
|
10
|
+
// export components
|
|
11
|
+
var _default = exports.default = _SegmentedControl.default;
|
|
@@ -25,7 +25,7 @@ const ProgressBar = (0, _utils.forwardRef)((props, ref) => {
|
|
|
25
25
|
withPrefix
|
|
26
26
|
} = (0, _hooks.useStyles)(classPrefix);
|
|
27
27
|
const sizeKey = vertical ? 'height' : 'width';
|
|
28
|
-
const startKey = vertical ? 'bottom' : '
|
|
28
|
+
const startKey = vertical ? 'bottom' : 'insetInlineStart';
|
|
29
29
|
const styles = (0, _utils.mergeStyles)(style, {
|
|
30
30
|
[startKey]: `${start}%`,
|
|
31
31
|
[sizeKey]: `${end - start}%`
|
package/cjs/index.d.ts
CHANGED
|
@@ -57,6 +57,7 @@ export * from './RadioGroup';
|
|
|
57
57
|
export * from './RadioTile';
|
|
58
58
|
export * from './RadioTileGroup';
|
|
59
59
|
export * from './SelectPicker';
|
|
60
|
+
export * from './SegmentedControl';
|
|
60
61
|
export * from './CheckPicker';
|
|
61
62
|
export * from './InputPicker';
|
|
62
63
|
export * from './TagPicker';
|
package/cjs/index.js
CHANGED
|
@@ -356,6 +356,12 @@ Object.keys(_SelectPicker).forEach(function (key) {
|
|
|
356
356
|
if (key in exports && exports[key] === _SelectPicker[key]) return;
|
|
357
357
|
exports[key] = _SelectPicker[key];
|
|
358
358
|
});
|
|
359
|
+
var _SegmentedControl = require("./SegmentedControl");
|
|
360
|
+
Object.keys(_SegmentedControl).forEach(function (key) {
|
|
361
|
+
if (key === "default" || key === "__esModule") return;
|
|
362
|
+
if (key in exports && exports[key] === _SegmentedControl[key]) return;
|
|
363
|
+
exports[key] = _SegmentedControl[key];
|
|
364
|
+
});
|
|
359
365
|
var _CheckPicker = require("./CheckPicker");
|
|
360
366
|
Object.keys(_CheckPicker).forEach(function (key) {
|
|
361
367
|
if (key === "default" || key === "__esModule") return;
|
|
@@ -87,6 +87,7 @@ import type { RangeSliderProps } from '../../RangeSlider';
|
|
|
87
87
|
import type { RateProps } from '../../Rate';
|
|
88
88
|
import type { RowProps } from '../../Row';
|
|
89
89
|
import type { SelectPickerProps } from '../../SelectPicker';
|
|
90
|
+
import type { SegmentedControlProps } from '../../SegmentedControl';
|
|
90
91
|
import type { SidebarProps } from '../../Sidebar';
|
|
91
92
|
import type { SidenavProps } from '../../Sidenav';
|
|
92
93
|
import type { SliderProps } from '../../Slider';
|
|
@@ -209,6 +210,7 @@ export interface ReactSuiteComponents {
|
|
|
209
210
|
Rate: ComponentProps<RateProps>;
|
|
210
211
|
Row: ComponentProps<RowProps>;
|
|
211
212
|
SelectPicker: ComponentProps<SelectPickerProps>;
|
|
213
|
+
SegmentedControl: ComponentProps<SegmentedControlProps>;
|
|
212
214
|
Sidebar: ComponentProps<SidebarProps>;
|
|
213
215
|
Sidenav: ComponentProps<SidenavProps>;
|
|
214
216
|
Slider: ComponentProps<SliderProps>;
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
/// <reference types="react" />
|
|
1
2
|
/**
|
|
2
3
|
* Attach the event handler directly to the specified DOM element,
|
|
3
4
|
* and it will be triggered when the size of the DOM element is changed.
|
|
@@ -5,5 +6,5 @@
|
|
|
5
6
|
* @param eventTarget The target to listen for events on
|
|
6
7
|
* @param listener An event handler
|
|
7
8
|
*/
|
|
8
|
-
export declare function useElementResize(eventTarget: Element | null | (() => Element | null)
|
|
9
|
+
export declare function useElementResize(eventTarget: Element | null | (() => Element | null) | React.RefObject<Element | null>, listener: ResizeObserverCallback): void;
|
|
9
10
|
export default useElementResize;
|
|
@@ -15,18 +15,61 @@ var _resizeObserver = require("@juggle/resize-observer");
|
|
|
15
15
|
*/
|
|
16
16
|
function useElementResize(eventTarget, listener) {
|
|
17
17
|
const resizeObserver = (0, _react.useRef)(null);
|
|
18
|
+
const currentElement = (0, _react.useRef)(null);
|
|
19
|
+
|
|
20
|
+
// Create the observer
|
|
18
21
|
(0, _react.useEffect)(() => {
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
22
|
+
// Get the target element
|
|
23
|
+
let target = null;
|
|
24
|
+
if (eventTarget) {
|
|
25
|
+
if (typeof eventTarget === 'function') {
|
|
26
|
+
target = eventTarget();
|
|
27
|
+
} else if ('current' in eventTarget) {
|
|
28
|
+
target = eventTarget.current;
|
|
29
|
+
} else {
|
|
30
|
+
target = eventTarget;
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
// If target changed, disconnect the previous observer
|
|
35
|
+
if (currentElement.current !== target) {
|
|
36
|
+
if (resizeObserver.current) {
|
|
37
|
+
resizeObserver.current.disconnect();
|
|
38
|
+
resizeObserver.current = null;
|
|
24
39
|
}
|
|
40
|
+
currentElement.current = target;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
// If we have a target and no observer, create one
|
|
44
|
+
if (target && !resizeObserver.current) {
|
|
45
|
+
const observer = new _resizeObserver.ResizeObserver(listener);
|
|
46
|
+
observer.observe(target);
|
|
47
|
+
resizeObserver.current = observer;
|
|
25
48
|
}
|
|
49
|
+
|
|
50
|
+
// Cleanup function
|
|
26
51
|
return () => {
|
|
27
|
-
|
|
28
|
-
|
|
52
|
+
if (resizeObserver.current) {
|
|
53
|
+
resizeObserver.current.disconnect();
|
|
54
|
+
resizeObserver.current = null;
|
|
55
|
+
}
|
|
56
|
+
currentElement.current = null;
|
|
29
57
|
};
|
|
30
58
|
}, [eventTarget, listener]);
|
|
59
|
+
|
|
60
|
+
// Update the current element reference if it changes
|
|
61
|
+
(0, _react.useEffect)(() => {
|
|
62
|
+
if (eventTarget) {
|
|
63
|
+
if (typeof eventTarget === 'function') {
|
|
64
|
+
currentElement.current = eventTarget();
|
|
65
|
+
} else if ('current' in eventTarget) {
|
|
66
|
+
currentElement.current = eventTarget.current;
|
|
67
|
+
} else {
|
|
68
|
+
currentElement.current = eventTarget;
|
|
69
|
+
}
|
|
70
|
+
} else {
|
|
71
|
+
currentElement.current = null;
|
|
72
|
+
}
|
|
73
|
+
}, [eventTarget]);
|
|
31
74
|
}
|
|
32
75
|
var _default = exports.default = useElementResize;
|
|
@@ -3,7 +3,7 @@ import type { StyleProperties } from '../../types';
|
|
|
3
3
|
/**
|
|
4
4
|
* Processes and returns a value suitable for CSS (with a unit).
|
|
5
5
|
*/
|
|
6
|
-
export declare function getCssValue(value?: number | string | null, unit?: string): string;
|
|
6
|
+
export declare function getCssValue(value?: number | string | null, unit?: string): string | undefined;
|
|
7
7
|
/**
|
|
8
8
|
* Merge multiple style objects, filtering out undefined values
|
|
9
9
|
*/
|
|
@@ -12,7 +12,7 @@ var _isEmpty = _interopRequireDefault(require("lodash/isEmpty"));
|
|
|
12
12
|
*/
|
|
13
13
|
function getCssValue(value, unit = 'px') {
|
|
14
14
|
if (value === undefined || value === null || value === '') {
|
|
15
|
-
return
|
|
15
|
+
return undefined;
|
|
16
16
|
}
|
|
17
17
|
|
|
18
18
|
// If the value is 0, return it as a string without unit
|