rsuite 6.0.1 → 6.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (275) hide show
  1. package/Accordion/styles/index.scss +3 -0
  2. package/Animation/styles/_animation.scss +95 -0
  3. package/Animation/styles/_bounce.scss +36 -0
  4. package/Animation/styles/_collapse.scss +23 -0
  5. package/Animation/styles/_fade.scss +10 -0
  6. package/Animation/styles/_mixin.scss +15 -0
  7. package/Animation/styles/_slide.scss +34 -0
  8. package/Animation/styles/_variables.scss +4 -0
  9. package/Animation/styles/index.scss +8 -0
  10. package/AutoComplete/styles/index.scss +43 -0
  11. package/Avatar/styles/index.scss +48 -0
  12. package/AvatarGroup/styles/index.scss +27 -0
  13. package/Badge/styles/_variables.scss +48 -0
  14. package/Badge/styles/index.scss +111 -0
  15. package/Box/styles/index.scss +1 -0
  16. package/Breadcrumb/styles/index.scss +50 -0
  17. package/Button/styles/_mixin.scss +83 -0
  18. package/Button/styles/_variables.scss +38 -0
  19. package/Button/styles/index.scss +374 -0
  20. package/ButtonGroup/styles/index.scss +96 -0
  21. package/ButtonToolbar/styles/index.scss +9 -0
  22. package/CHANGELOG.md +20 -0
  23. package/Calendar/styles/_variables.scss +16 -0
  24. package/Calendar/styles/index.scss +673 -0
  25. package/Card/styles/index.scss +63 -0
  26. package/CardGroup/styles/index.scss +10 -0
  27. package/Carousel/styles/index.scss +204 -0
  28. package/CascadeTree/styles/_search.scss +39 -0
  29. package/CascadeTree/styles/index.scss +83 -0
  30. package/Cascader/styles/index.scss +5 -0
  31. package/Center/styles/index.scss +11 -0
  32. package/CheckPicker/styles/index.scss +23 -0
  33. package/CheckTree/styles/_variables.scss +5 -0
  34. package/CheckTree/styles/index.scss +121 -0
  35. package/CheckTreePicker/styles/index.scss +20 -0
  36. package/Checkbox/styles/_mixin.scss +5 -0
  37. package/Checkbox/styles/_variables.scss +4 -0
  38. package/Checkbox/styles/index.scss +158 -0
  39. package/CheckboxGroup/styles/index.scss +14 -0
  40. package/Col/styles/index.scss +2 -0
  41. package/Container/stories/styles.scss +23 -0
  42. package/Container/styles/index.scss +16 -0
  43. package/Content/styles/index.scss +6 -0
  44. package/DateInput/styles/index.scss +1 -0
  45. package/DatePicker/styles/_mixin.scss +10 -0
  46. package/DatePicker/styles/index.scss +171 -0
  47. package/DateRangeInput/styles/index.scss +1 -0
  48. package/DateRangePicker/styles/index.scss +151 -0
  49. package/Divider/styles/index.scss +85 -0
  50. package/Drawer/styles/_mixin.scss +23 -0
  51. package/Drawer/styles/_variables.scss +18 -0
  52. package/Drawer/styles/index.scss +244 -0
  53. package/Dropdown/styles/_mixin.scss +4 -0
  54. package/Dropdown/styles/_variables.scss +12 -0
  55. package/Dropdown/styles/index.scss +334 -0
  56. package/FlexboxGrid/styles/index.scss +82 -0
  57. package/Footer/styles/index.scss +5 -0
  58. package/Form/styles/index.scss +3 -0
  59. package/FormControl/styles/_variables.scss +4 -0
  60. package/FormControl/styles/index.scss +82 -0
  61. package/FormControlLabel/styles/index.scss +7 -0
  62. package/FormErrorMessage/styles/_animation.scss +43 -0
  63. package/FormErrorMessage/styles/_variables.scss +7 -0
  64. package/FormErrorMessage/styles/index.scss +146 -0
  65. package/FormGroup/styles/index.scss +75 -0
  66. package/FormHelpText/styles/index.scss +21 -0
  67. package/FormStack/styles/index.scss +15 -0
  68. package/Grid/styles/_columns.scss +23 -0
  69. package/Grid/styles/_mixin.scss +110 -0
  70. package/Grid/styles/_row.scss +44 -0
  71. package/Grid/styles/_variables.scss +6 -0
  72. package/Grid/styles/index.scss +115 -0
  73. package/Header/styles/index.scss +5 -0
  74. package/Heading/styles/_variables.scss +19 -0
  75. package/Heading/styles/index.scss +42 -0
  76. package/HeadingGroup/styles/index.scss +5 -0
  77. package/Highlight/styles/index.scss +9 -0
  78. package/IconButton/styles/index.scss +90 -0
  79. package/Image/styles/index.scss +36 -0
  80. package/InlineEdit/styles/index.scss +51 -0
  81. package/Input/styles/_mixin.scss +39 -0
  82. package/Input/styles/_variables.scss +27 -0
  83. package/Input/styles/index.scss +23 -0
  84. package/InputGroup/styles/index.scss +264 -0
  85. package/InputNumber/styles/index.scss +1 -0
  86. package/InputPicker/styles/_mixin.scss +7 -0
  87. package/InputPicker/styles/index.scss +64 -0
  88. package/Kbd/styles/_mixin.scss +24 -0
  89. package/Kbd/styles/_variables.scss +13 -0
  90. package/Kbd/styles/index.scss +21 -0
  91. package/Link/styles/index.scss +41 -0
  92. package/List/styles/index.scss +111 -0
  93. package/Loader/styles/_mixin.scss +37 -0
  94. package/Loader/styles/_variables.scss +19 -0
  95. package/Loader/styles/index.scss +120 -0
  96. package/Menu/styles/index.scss +109 -0
  97. package/Message/styles/index.scss +189 -0
  98. package/Modal/styles/_animation.scss +15 -0
  99. package/Modal/styles/_variables.scss +16 -0
  100. package/Modal/styles/index.scss +186 -0
  101. package/MultiCascadeTree/styles/index.scss +35 -0
  102. package/MultiCascader/styles/index.scss +3 -0
  103. package/Nav/styles/index.scss +383 -0
  104. package/Navbar/styles/index.scss +253 -0
  105. package/Notification/styles/index.scss +116 -0
  106. package/NumberInput/styles/_mixin.scss +11 -0
  107. package/NumberInput/styles/index.scss +78 -0
  108. package/Pagination/styles/_pagination-group.scss +52 -0
  109. package/Pagination/styles/index.scss +77 -0
  110. package/Panel/styles/index.scss +122 -0
  111. package/PanelGroup/styles/index.scss +34 -0
  112. package/PasswordInput/styles/index.scss +3 -0
  113. package/PasswordStrengthMeter/styles/index.scss +41 -0
  114. package/PinInput/styles/index.scss +93 -0
  115. package/Placeholder/styles/_mixin.scss +9 -0
  116. package/Placeholder/styles/index.scss +155 -0
  117. package/Popover/styles/index.scss +224 -0
  118. package/Popover/styles/mixins.scss +54 -0
  119. package/Progress/styles/_animation.scss +69 -0
  120. package/Progress/styles/_mixins.scss +6 -0
  121. package/Progress/styles/_progress-line.scss +343 -0
  122. package/Progress/styles/index.scss +3 -0
  123. package/ProgressCircle/styles/index.scss +2 -0
  124. package/ProgressCircle/styles/progress-circle.scss +49 -0
  125. package/Radio/styles/_mixin.scss +5 -0
  126. package/Radio/styles/_variables.scss +5 -0
  127. package/Radio/styles/index.scss +147 -0
  128. package/RadioGroup/styles/_variables.scss +10 -0
  129. package/RadioGroup/styles/index.scss +83 -0
  130. package/RadioTile/styles/index.scss +80 -0
  131. package/RadioTileGroup/styles/index.scss +1 -0
  132. package/RangeSlider/styles/index.scss +4 -0
  133. package/Rate/styles/index.scss +141 -0
  134. package/Row/styles/index.scss +2 -0
  135. package/SegmentedControl/styles/_mixin.scss +7 -0
  136. package/SegmentedControl/styles/_variables.scss +43 -0
  137. package/SegmentedControl/styles/index.scss +147 -0
  138. package/SelectPicker/styles/index.scss +44 -0
  139. package/Sidebar/styles/index.scss +17 -0
  140. package/Sidenav/styles/index.scss +635 -0
  141. package/Sidenav/styles/mixin.scss +23 -0
  142. package/Slider/styles/index.scss +298 -0
  143. package/Stack/styles/_variables.scss +11 -0
  144. package/Stack/styles/index.scss +79 -0
  145. package/Stat/styles/index.scss +126 -0
  146. package/StatGroup/styles/index.scss +10 -0
  147. package/Steps/styles/index.scss +222 -0
  148. package/Table/styles/index.scss +473 -0
  149. package/Table/styles/mixin.scss +8 -0
  150. package/Tabs/styles/index.scss +24 -0
  151. package/Tag/styles/_variables.scss +13 -0
  152. package/Tag/styles/index.scss +62 -0
  153. package/TagGroup/styles/index.scss +14 -0
  154. package/TagInput/styles/index.scss +5 -0
  155. package/TagPicker/styles/index.scss +141 -0
  156. package/Text/styles/index.scss +142 -0
  157. package/Text/styles/variables.scss +9 -0
  158. package/Textarea/styles/index.scss +9 -0
  159. package/TimePicker/styles/index.scss +1 -0
  160. package/TimeRangePicker/styles/index.scss +1 -0
  161. package/Timeline/stories/styles.scss +29 -0
  162. package/Timeline/styles/_mixin.scss +13 -0
  163. package/Timeline/styles/index.scss +187 -0
  164. package/Toggle/styles/index.scss +284 -0
  165. package/Tooltip/styles/index.scss +160 -0
  166. package/Tooltip/styles/mixins.scss +56 -0
  167. package/Tree/styles/_indent-line.scss +8 -0
  168. package/Tree/styles/_toggle.scss +32 -0
  169. package/Tree/styles/_variables.scss +8 -0
  170. package/Tree/styles/index.scss +184 -0
  171. package/TreePicker/styles/index.scss +16 -0
  172. package/Uploader/styles/_mixin.scss +11 -0
  173. package/Uploader/styles/index.scss +491 -0
  174. package/VisuallyHidden/styles/index.scss +11 -0
  175. package/cjs/Breadcrumb/BreadcrumbItem.js +12 -7
  176. package/cjs/CheckTree/CheckTree.js +3 -0
  177. package/cjs/CheckTree/CheckTreeView.js +7 -3
  178. package/cjs/CheckTree/hooks/useTreeCheckState.d.ts +1 -0
  179. package/cjs/CheckTree/hooks/useTreeCheckState.js +54 -3
  180. package/cjs/CheckTree/utils.d.ts +9 -2
  181. package/cjs/CheckTree/utils.js +70 -11
  182. package/cjs/CheckTreePicker/CheckTreePicker.js +1 -0
  183. package/cjs/Checkbox/Checkbox.js +2 -1
  184. package/cjs/Checkbox/hooks/useIndeterminateCheckbox.d.ts +19 -0
  185. package/cjs/Checkbox/hooks/useIndeterminateCheckbox.js +32 -0
  186. package/cjs/DateInput/DateInput.js +24 -0
  187. package/cjs/DateInput/hooks/useKeyboardInputEvent.d.ts +2 -1
  188. package/cjs/DateInput/hooks/useKeyboardInputEvent.js +14 -0
  189. package/cjs/DateRangeInput/DateRangeInput.js +24 -0
  190. package/cjs/Form/Form.js +5 -1
  191. package/cjs/Rate/Rate.d.ts +8 -0
  192. package/cjs/Rate/Rate.js +3 -1
  193. package/cjs/Tree/hooks/useFlattenTree.d.ts +4 -0
  194. package/cjs/Tree/hooks/useFlattenTree.js +22 -1
  195. package/cjs/Tree/hooks/useFocusTree.js +19 -1
  196. package/cjs/Tree/hooks/useVirtualizedTreeData.d.ts +1 -0
  197. package/cjs/Tree/hooks/useVirtualizedTreeData.js +5 -2
  198. package/cjs/Tree/utils/focusableTree.d.ts +8 -0
  199. package/cjs/Tree/utils/focusableTree.js +40 -2
  200. package/cjs/Tree/utils/index.d.ts +1 -1
  201. package/cjs/Tree/utils/index.js +3 -1
  202. package/cjs/internals/Picker/utils.d.ts +2 -0
  203. package/cjs/internals/Picker/utils.js +13 -1
  204. package/cjs/internals/StyledBox/StyledBox.d.ts +1 -1
  205. package/cjs/internals/StyledBox/StyledBox.js +2 -2
  206. package/dist/rsuite.js +34 -23
  207. package/dist/rsuite.js.map +1 -1
  208. package/dist/rsuite.min.js +1 -1
  209. package/dist/rsuite.min.js.map +1 -1
  210. package/esm/Breadcrumb/BreadcrumbItem.js +10 -5
  211. package/esm/CheckTree/CheckTree.js +3 -0
  212. package/esm/CheckTree/CheckTreeView.js +7 -3
  213. package/esm/CheckTree/hooks/useTreeCheckState.d.ts +1 -0
  214. package/esm/CheckTree/hooks/useTreeCheckState.js +55 -4
  215. package/esm/CheckTree/utils.d.ts +9 -2
  216. package/esm/CheckTree/utils.js +71 -12
  217. package/esm/CheckTreePicker/CheckTreePicker.js +1 -0
  218. package/esm/Checkbox/Checkbox.js +3 -2
  219. package/esm/Checkbox/hooks/useIndeterminateCheckbox.d.ts +19 -0
  220. package/esm/Checkbox/hooks/useIndeterminateCheckbox.js +29 -0
  221. package/esm/DateInput/DateInput.js +24 -0
  222. package/esm/DateInput/hooks/useKeyboardInputEvent.d.ts +2 -1
  223. package/esm/DateInput/hooks/useKeyboardInputEvent.js +14 -0
  224. package/esm/DateRangeInput/DateRangeInput.js +24 -0
  225. package/esm/Form/Form.js +5 -1
  226. package/esm/Rate/Rate.d.ts +8 -0
  227. package/esm/Rate/Rate.js +3 -1
  228. package/esm/Tree/hooks/useFlattenTree.d.ts +4 -0
  229. package/esm/Tree/hooks/useFlattenTree.js +22 -1
  230. package/esm/Tree/hooks/useFocusTree.js +20 -2
  231. package/esm/Tree/hooks/useVirtualizedTreeData.d.ts +1 -0
  232. package/esm/Tree/hooks/useVirtualizedTreeData.js +5 -2
  233. package/esm/Tree/utils/focusableTree.d.ts +8 -0
  234. package/esm/Tree/utils/focusableTree.js +36 -0
  235. package/esm/Tree/utils/index.d.ts +1 -1
  236. package/esm/Tree/utils/index.js +1 -1
  237. package/esm/internals/Picker/utils.d.ts +2 -0
  238. package/esm/internals/Picker/utils.js +13 -1
  239. package/esm/internals/StyledBox/StyledBox.d.ts +1 -1
  240. package/esm/internals/StyledBox/StyledBox.js +2 -2
  241. package/internals/Box/styles/index.scss +31 -0
  242. package/internals/Burger/styles/index.scss +72 -0
  243. package/internals/CloseButton/styles/index.scss +14 -0
  244. package/internals/Picker/styles/_mixin.scss +219 -0
  245. package/internals/Picker/styles/_variables.scss +9 -0
  246. package/internals/Picker/styles/index.scss +476 -0
  247. package/internals/Ripple/styles/_mixins.scss +10 -0
  248. package/internals/Ripple/styles/index.scss +40 -0
  249. package/internals/ScrollView/styles/index.scss +77 -0
  250. package/internals/SearchBox/styles/index.scss +7 -0
  251. package/package.json +4 -4
  252. package/styles/_base.scss +37 -0
  253. package/styles/_css-reset.scss +345 -0
  254. package/styles/_themes.scss +132 -0
  255. package/styles/_variables.scss +48 -0
  256. package/styles/color-modes/_dark.scss +458 -0
  257. package/styles/color-modes/_high-contrast.scss +469 -0
  258. package/styles/color-modes/_light.scss +475 -0
  259. package/styles/colors/_colors-base.scss +39 -0
  260. package/styles/colors/_dark.scss +114 -0
  261. package/styles/colors/_high-contrast.scss +114 -0
  262. package/styles/colors/_light.scss +115 -0
  263. package/styles/colors/_palette.scss +413 -0
  264. package/styles/components.scss +114 -0
  265. package/styles/index.scss +2 -0
  266. package/styles/mixins/_color-modes.scss +20 -0
  267. package/styles/mixins/_combobox.scss +6 -0
  268. package/styles/mixins/_hacks.scss +33 -0
  269. package/styles/mixins/_input.scss +30 -0
  270. package/styles/mixins/_listbox.scss +70 -0
  271. package/styles/mixins/_menu.scss +12 -0
  272. package/styles/mixins/_utilities.scss +130 -0
  273. package/toaster/styles/animation.scss +54 -0
  274. package/toaster/styles/index.scss +109 -0
  275. package/useToaster/styles/index.scss +1 -0
package/esm/Rate/Rate.js CHANGED
@@ -26,6 +26,7 @@ const Rate = forwardRef((props, ref) => {
26
26
  classPrefix = 'rate',
27
27
  disabled,
28
28
  max = 5,
29
+ name,
29
30
  readOnly,
30
31
  vertical,
31
32
  size,
@@ -128,7 +129,8 @@ const Rate = forwardRef((props, ref) => {
128
129
  style: mergedStyle,
129
130
  onMouseLeave: handleMouseLeave,
130
131
  "data-disabled": disabled,
131
- "data-readonly": readOnly
132
+ "data-readonly": readOnly,
133
+ "data-name": name
132
134
  }, rest), starStates.map((status, index) => /*#__PURE__*/React.createElement(Character, {
133
135
  role: "radio",
134
136
  "aria-posinset": index + 1,
@@ -28,6 +28,10 @@ interface UseFlattenTreeOptions {
28
28
  * An array of item values that should not be selectable.
29
29
  */
30
30
  uncheckableItemValues?: any[];
31
+ /**
32
+ * An array of item values that should be disabled.
33
+ */
34
+ disabledItemValues?: any[];
31
35
  /**
32
36
  * A callback function that will be called when the tree nodes change.
33
37
  * It receives a map of the tree nodes.
@@ -16,6 +16,7 @@ function useFlattenTree(data, options) {
16
16
  valueKey,
17
17
  childrenKey,
18
18
  uncheckableItemValues = [],
19
+ disabledItemValues = [],
19
20
  cascade,
20
21
  multiple,
21
22
  callback
@@ -27,6 +28,26 @@ function useFlattenTree(data, options) {
27
28
  // Reset values to false
28
29
  Object.keys(flattenedNodes.current).forEach(refKey => {
29
30
  const node = flattenedNodes.current[refKey];
31
+
32
+ // Check if this node or any of its parents is disabled
33
+ const isNodeDisabled = disabledItemValues.some(disabledValue => shallowEqual(node[valueKey], disabledValue));
34
+ let hasDisabledParent = false;
35
+ let currentNode = node;
36
+ while (currentNode.parent && !hasDisabledParent) {
37
+ const parentRefKey = currentNode.parent.refKey;
38
+ if (parentRefKey && flattenedNodes.current[parentRefKey]) {
39
+ const parentValue = flattenedNodes.current[parentRefKey][valueKey];
40
+ if (disabledItemValues.some(disabledValue => shallowEqual(parentValue, disabledValue))) {
41
+ hasDisabledParent = true;
42
+ }
43
+ }
44
+ currentNode = currentNode.parent;
45
+ }
46
+
47
+ // Skip disabled nodes - they should not be affected by cascade or value changes
48
+ if (isNodeDisabled || hasDisabledParent) {
49
+ return;
50
+ }
30
51
  if (cascade && !isNil(node.parent) && !isNil(node.parent.refKey)) {
31
52
  node.check = flattenedNodes.current[node.parent.refKey].check;
32
53
  } else {
@@ -38,7 +59,7 @@ function useFlattenTree(data, options) {
38
59
  }
39
60
  });
40
61
  });
41
- }, [cascade, uncheckableItemValues, valueKey]);
62
+ }, [cascade, uncheckableItemValues, disabledItemValues, valueKey]);
42
63
  const flattenTreeData = useCallback((treeData, parent, layer = 1) => {
43
64
  if (!Array.isArray(treeData) || treeData.length === 0) {
44
65
  return [];
@@ -5,7 +5,7 @@ import { KEY_VALUES } from "../../internals/constants/index.js";
5
5
  import { useEventCallback, useCustom } from "../../internals/hooks/index.js";
6
6
  import { onMenuKeyDown } from "../../internals/Picker/index.js";
7
7
  import { useItemDataKeys, useRegisterTreeMethods } from "../../internals/Tree/TreeProvider.js";
8
- import { isSearching, focusNextItem, getFocusableItems, getActiveItem, focusPreviousItem, focusCurrentItem, focusTreeNode, handleLeftArrow, handleRightArrow } from "../utils/index.js";
8
+ import { isSearching, focusNextItem, getFocusableItems, getActiveItem, focusPreviousItem, focusFirstItem, focusLastItem, focusCurrentItem, focusTreeNode, handleLeftArrow, handleRightArrow } from "../utils/index.js";
9
9
  import useTreeNodeRefs from "./useTreeNodeRefs.js";
10
10
  /**
11
11
  * Custom hook that manages the focus behavior of a tree component.
@@ -99,12 +99,30 @@ function useFocusTree(props) {
99
99
  onFocusItem
100
100
  });
101
101
  });
102
+ const handleHomeKey = useEventCallback(() => {
103
+ const focusProps = getFocusProps();
104
+ const focusedValue = focusFirstItem(focusProps);
105
+ if (focusedValue) {
106
+ setFocusItemValue(focusedValue);
107
+ onFocused === null || onFocused === void 0 || onFocused(focusedValue);
108
+ }
109
+ });
110
+ const handleEndKey = useEventCallback(() => {
111
+ const focusProps = getFocusProps();
112
+ const focusedValue = focusLastItem(focusProps);
113
+ if (focusedValue) {
114
+ setFocusItemValue(focusedValue);
115
+ onFocused === null || onFocused === void 0 || onFocused(focusedValue);
116
+ }
117
+ });
102
118
  const onTreeKeydown = useEventCallback(event => {
103
119
  onMenuKeyDown(event, {
104
120
  down: () => handleFocusItem(KEY_VALUES.DOWN),
105
121
  up: () => handleFocusItem(KEY_VALUES.UP),
106
122
  left: rtl ? handleRightArrowEvent : handleLeftArrowEvent,
107
- right: rtl ? handleLeftArrowEvent : handleRightArrowEvent
123
+ right: rtl ? handleLeftArrowEvent : handleRightArrowEvent,
124
+ home: handleHomeKey,
125
+ end: handleEndKey
108
126
  });
109
127
  });
110
128
  const focusTreeFirstNode = useEventCallback(() => {
@@ -3,5 +3,6 @@ declare function useVirtualizedTreeData(nodes: TreeNodeMap, data: TreeNode[], op
3
3
  expandItemValues: (string | number)[];
4
4
  cascade?: boolean;
5
5
  searchKeyword?: string;
6
+ disabledItemValues?: (string | number)[];
6
7
  }): () => TreeNode[];
7
8
  export default useVirtualizedTreeData;
@@ -30,7 +30,8 @@ function useVirtualizedTreeData(nodes, data, options) {
30
30
  const {
31
31
  cascade,
32
32
  searchKeyword,
33
- expandItemValues
33
+ expandItemValues,
34
+ disabledItemValues = []
34
35
  } = options;
35
36
  return UNSAFE_flattenTree(data, childrenKey, node => {
36
37
  let formatted = {};
@@ -54,7 +55,9 @@ function useVirtualizedTreeData(nodes, data, options) {
54
55
  const checkState = !isUndefined(cascade) ? getNodeCheckState(curNode, {
55
56
  cascade,
56
57
  nodes,
57
- childrenKey
58
+ childrenKey,
59
+ disabledItemValues,
60
+ valueKey
58
61
  }) : undefined;
59
62
  formatted = {
60
63
  ...node,
@@ -35,6 +35,14 @@ export declare const focusNextItem: (props: FocusItemProps) => any;
35
35
  * Focuses on the previous item in a tree.
36
36
  */
37
37
  export declare const focusPreviousItem: (props: FocusItemProps) => any;
38
+ /**
39
+ * Focuses on the first item in a tree.
40
+ */
41
+ export declare const focusFirstItem: (props: FocusItemProps) => any;
42
+ /**
43
+ * Focuses on the last item in a tree.
44
+ */
45
+ export declare const focusLastItem: (props: FocusItemProps) => any;
38
46
  interface ScrollToActiveTreeNodeProps {
39
47
  value: any;
40
48
  valueKey: string;
@@ -108,6 +108,42 @@ export const focusPreviousItem = props => {
108
108
  return value;
109
109
  };
110
110
 
111
+ /**
112
+ * Focuses on the first item in a tree.
113
+ */
114
+ export const focusFirstItem = props => {
115
+ const {
116
+ focusableItems,
117
+ treeNodesRefs,
118
+ valueKey
119
+ } = props;
120
+ if (focusableItems.length === 0) {
121
+ return;
122
+ }
123
+ const firstItem = focusableItems[0];
124
+ const value = firstItem[valueKey];
125
+ focusTreeNode(firstItem.refKey, treeNodesRefs);
126
+ return value;
127
+ };
128
+
129
+ /**
130
+ * Focuses on the last item in a tree.
131
+ */
132
+ export const focusLastItem = props => {
133
+ const {
134
+ focusableItems,
135
+ treeNodesRefs,
136
+ valueKey
137
+ } = props;
138
+ if (focusableItems.length === 0) {
139
+ return;
140
+ }
141
+ const lastItem = focusableItems[focusableItems.length - 1];
142
+ const value = lastItem[valueKey];
143
+ focusTreeNode(lastItem.refKey, treeNodesRefs);
144
+ return value;
145
+ };
146
+
111
147
  /**
112
148
  * Returns the index of the first visible node in the tree that matches the given value.
113
149
  */
@@ -7,5 +7,5 @@ export { formatNodeRefKey } from './formatNodeRefKey';
7
7
  export { indentTreeNode } from './indentTreeNode';
8
8
  export { isSearching } from './isSearching';
9
9
  export { isExpand } from './isExpand';
10
- export { getFocusableItems, getActiveItem, focusNextItem, focusPreviousItem, focusTreeNode, focusCurrentItem } from './focusableTree';
10
+ export { getFocusableItems, getActiveItem, focusNextItem, focusPreviousItem, focusFirstItem, focusLastItem, focusTreeNode, focusCurrentItem } from './focusableTree';
11
11
  export { handleLeftArrow, handleRightArrow } from './treeKeyboardInteractions';
@@ -10,5 +10,5 @@ export { isSearching } from "./isSearching.js";
10
10
  export { isExpand } from "./isExpand.js";
11
11
 
12
12
  // Utility functions for managing focusable items in a tree.
13
- export { getFocusableItems, getActiveItem, focusNextItem, focusPreviousItem, focusTreeNode, focusCurrentItem } from "./focusableTree.js";
13
+ export { getFocusableItems, getActiveItem, focusNextItem, focusPreviousItem, focusFirstItem, focusLastItem, focusTreeNode, focusCurrentItem } from "./focusableTree.js";
14
14
  export { handleLeftArrow, handleRightArrow } from "./treeKeyboardInteractions.js";
@@ -13,6 +13,8 @@ export interface KeyboardEvents {
13
13
  esc?: React.KeyboardEventHandler;
14
14
  right?: React.KeyboardEventHandler;
15
15
  left?: React.KeyboardEventHandler;
16
+ home?: React.KeyboardEventHandler;
17
+ end?: React.KeyboardEventHandler;
16
18
  }
17
19
  /**
18
20
  * Handling keyboard events...
@@ -47,7 +47,9 @@ export function onMenuKeyDown(event, events) {
47
47
  del,
48
48
  esc,
49
49
  right,
50
- left
50
+ left,
51
+ home,
52
+ end
51
53
  } = events;
52
54
  switch (event.key) {
53
55
  // down
@@ -82,6 +84,16 @@ export function onMenuKeyDown(event, events) {
82
84
  case KEY_VALUES.RIGHT:
83
85
  right === null || right === void 0 || right(event);
84
86
  break;
87
+ // home
88
+ case KEY_VALUES.HOME:
89
+ home === null || home === void 0 || home(event);
90
+ event.preventDefault();
91
+ break;
92
+ // end
93
+ case KEY_VALUES.END:
94
+ end === null || end === void 0 || end(event);
95
+ event.preventDefault();
96
+ break;
85
97
  default:
86
98
  }
87
99
  }
@@ -2,7 +2,7 @@ import React from 'react';
2
2
  import { BoxProps } from '../Box';
3
3
  import type { Size, Color } from '../types';
4
4
  export interface StyledBoxProps extends BoxProps {
5
- /** Name of the Box */
5
+ /** Component identifier for CSS variable generation */
6
6
  name: string;
7
7
  /** Size of the Box */
8
8
  size?: Size | number | string;
@@ -7,12 +7,12 @@ const StyledBox = forwardRef((props, ref) => {
7
7
  const {
8
8
  as,
9
9
  color,
10
- name,
10
+ name: componentName,
11
11
  style,
12
12
  size,
13
13
  ...rest
14
14
  } = props;
15
- const boxStyle = mergeStyles(style, getSizeStyle(size, name), getColorStyle(color, name));
15
+ const boxStyle = mergeStyles(style, getSizeStyle(size, componentName), getColorStyle(color, componentName));
16
16
  return /*#__PURE__*/React.createElement(Box, _extends({
17
17
  as: as,
18
18
  ref: ref,
@@ -0,0 +1,31 @@
1
+ @use '../../../styles/base' as base;
2
+ @use '../../../styles/themes' as themes;
3
+ @use '../../../styles/variables' as vars;
4
+
5
+ // Define breakpoints map
6
+ $breakpoints: (
7
+ xs: vars.$screen-sm,
8
+ sm: vars.$screen-md,
9
+ md: vars.$screen-lg,
10
+ lg: vars.$screen-xl,
11
+ xl: vars.$screen-xxl
12
+ );
13
+
14
+ // Generate responsive visibility styles
15
+ @each $key, $value in $breakpoints {
16
+ $bp: calc(#{$value} - 1px);
17
+
18
+ // Visible from breakpoint
19
+ @media (max-width: $bp) {
20
+ [data-visible-from='#{$key}'] {
21
+ display: none !important;
22
+ }
23
+ }
24
+
25
+ // Hidden from breakpoint
26
+ @media (min-width: #{$value}) {
27
+ [data-hidden-from='#{$key}'] {
28
+ display: none !important;
29
+ }
30
+ }
31
+ }
@@ -0,0 +1,72 @@
1
+ @use '../../Box/styles/index' as box;
2
+
3
+ .rs-burger {
4
+ --rs-burger-size: 36px;
5
+ --rs-burger-thickness: 2px;
6
+ --rs-burger-color: currentColor;
7
+ --rs-burger-spacing: calc(var(--rs-spacing) * 1.5);
8
+ --rs-burger-line-size: calc(var(--rs-burger-size) - var(--rs-burger-spacing) * 2);
9
+
10
+ border: none;
11
+ background: transparent;
12
+ cursor: pointer;
13
+ outline: none;
14
+ transition: background 0.2s;
15
+ box-sizing: border-box;
16
+ width: var(--rs-burger-size);
17
+ height: var(--rs-burger-size);
18
+ padding: var(--rs-burger-spacing);
19
+
20
+ // The burger line (middle)
21
+ &-line {
22
+ position: relative;
23
+ display: block;
24
+ width: var(--rs-burger-line-size);
25
+ height: var(--rs-burger-thickness);
26
+ background: var(--rs-burger-color);
27
+ border-radius: var(--rs-burger-thickness);
28
+ transition-property: background, transform;
29
+ transition-duration: 0.2s, 0.3s;
30
+ transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
31
+ pointer-events: none;
32
+
33
+ // Top and bottom lines
34
+ &::before,
35
+ &::after {
36
+ content: '';
37
+ position: absolute;
38
+ display: block;
39
+ inset-inline-start: 0;
40
+ width: 100%;
41
+ height: var(--rs-burger-thickness);
42
+ background: var(--rs-burger-color);
43
+ border-radius: var(--rs-burger-thickness);
44
+ transition-property: transform;
45
+ transition-duration: 0.3s;
46
+ transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
47
+ }
48
+
49
+ &::before {
50
+ top: calc(var(--rs-burger-line-size) / -3);
51
+ }
52
+
53
+ &::after {
54
+ top: calc(var(--rs-burger-line-size) / 3);
55
+ }
56
+ }
57
+
58
+ // Opened state animation
59
+ &:where([data-opened='true']) {
60
+ .rs-burger-line {
61
+ background: transparent;
62
+
63
+ &::before {
64
+ transform: translateY(calc(var(--rs-burger-line-size) / 3)) rotate(45deg);
65
+ }
66
+
67
+ &::after {
68
+ transform: translateY(calc(var(--rs-burger-line-size) / -3)) rotate(-45deg);
69
+ }
70
+ }
71
+ }
72
+ }
@@ -0,0 +1,14 @@
1
+ @use '../../../IconButton/styles/index' as icon-button;
2
+
3
+ // Close button
4
+ .rs-btn-close {
5
+ border: none;
6
+ outline: none !important;
7
+ background: transparent;
8
+ line-height: 1;
9
+ cursor: pointer;
10
+
11
+ .rs-icon {
12
+ vertical-align: bottom;
13
+ }
14
+ }
@@ -0,0 +1,219 @@
1
+ @use 'sass:map';
2
+ @use '../../../styles/mixins/color-modes';
3
+ @use '../../../Dropdown/styles/mixin' as dropdown;
4
+
5
+ // Picker Menu items common styles
6
+ @mixin picker-listbox-reset {
7
+ overflow-y: auto;
8
+
9
+ ul {
10
+ list-style: none;
11
+ margin: 0;
12
+ padding: 0;
13
+ }
14
+ }
15
+
16
+ // Picker Menu group common styles
17
+ @mixin picker-menu-group-common($prefix) {
18
+ // Set border & padding to menu group if it isn't the first.
19
+ .rs-#{$prefix}-menu-group:not(:first-child) {
20
+ margin-top: var(--rs-picker-group-select-menu-gap);
21
+ border-top: 1px solid var(--rs-divider-border);
22
+ padding-top: var(--rs-picker-group-select-menu-gap);
23
+ }
24
+ }
25
+
26
+ // Group title common styles
27
+ @mixin picker-menu-group-title($prefix) {
28
+ .rs-#{$prefix}-menu-group-title {
29
+ padding-block: var(--rs-picker-item-content-padding-vertical);
30
+ padding-inline: var(--rs-picker-item-content-padding-horizontal);
31
+ padding-inline-end: calc(var(--rs-padding-inline-md) + 20px);
32
+ position: relative;
33
+ cursor: pointer;
34
+ color: var(--rs-text-heading);
35
+
36
+ .rs-#{$prefix}-menu-group-caret {
37
+ display: inline-block;
38
+ margin-inline-start: 2px;
39
+ position: absolute;
40
+ top: var(--rs-padding-block-md);
41
+ inset-inline-end: var(--rs-padding-inline-md);
42
+ color: var(--rs-text-secondary);
43
+ }
44
+ }
45
+ }
46
+
47
+ // Group closed common styles
48
+ @mixin picker-menu-group-closed($prefix) {
49
+ .rs-#{$prefix}-menu-group.folded {
50
+ .rs-#{$prefix}-menu-group-caret {
51
+ transform: rotate(90deg);
52
+ }
53
+ }
54
+ }
55
+
56
+ @mixin picker-item-hover {
57
+ color: var(--rs-text-primary);
58
+ background-color: var(--rs-state-hover-bg);
59
+ }
60
+
61
+ @mixin picker-item-active {
62
+ font-weight: var(--rs-picker-select-menu-item-selected-font-weight);
63
+ }
64
+
65
+ @mixin picker-calendar-cell-content {
66
+ display: inline-block;
67
+ cursor: pointer;
68
+ font-size: var(--rs-calendar-cell-font-size);
69
+ line-height: var(--rs-calendar-cell-line-height);
70
+ padding: var(--rs-calendar-cell-padding);
71
+ border-radius: var(--rs-calendar-border-radius);
72
+
73
+ &:hover {
74
+ background-color: var(--rs-state-hover-bg);
75
+ }
76
+ }
77
+
78
+ @mixin picker-calendar-cell-content-selected {
79
+ color: var(--rs-calendar-date-selected-text);
80
+ background-color: var(--rs-bg-active);
81
+ box-shadow: none;
82
+
83
+ @include color-modes.high-contrast-mode {
84
+ text-decoration: underline;
85
+ }
86
+ }
87
+
88
+ @mixin picker-calendar-title-show {
89
+ color: var(--rs-text-active);
90
+ background: transparent;
91
+ }
92
+
93
+ // Default picker toggle
94
+ @mixin picker-default-toggle {
95
+ [data-appearance='default'] & {
96
+ color: var(--rs-text-primary);
97
+ border-width: var(--rs-picker-toggle-border-width);
98
+ border-color: var(--rs-picker-toggle-border-color);
99
+ border-style: solid;
100
+ }
101
+
102
+ [data-disabled='true'] & {
103
+ cursor: var(--rs-cursor-disabled);
104
+ }
105
+
106
+ [data-appearance='default']:not([data-disabled='true']) {
107
+ &:focus {
108
+ border-color: var(--rs-input-focus-border);
109
+ }
110
+ }
111
+ }
112
+
113
+ // Subtle picker toggle
114
+ @mixin picker-subtle-toggle {
115
+ .rs-picker[data-appearance='subtle'] & {
116
+ --rs-picker-toggle-border-width: 0px;
117
+ @include dropdown.dropdown-toggle;
118
+ }
119
+
120
+ .rs-picker[data-appearance='subtle'][data-disabled='true'] & {
121
+ cursor: var(--rs-cursor-disabled);
122
+
123
+ &:focus,
124
+ &:active {
125
+ background: none;
126
+
127
+ &::after {
128
+ display: none;
129
+ }
130
+ }
131
+ }
132
+ }
133
+
134
+ // Group closed common styles
135
+ @mixin picker-menu-group-closed($prefix) {
136
+ .rs-#{$prefix}-menu-group.folded {
137
+ .rs-#{$prefix}-menu-group-caret {
138
+ transform: rotate(90deg);
139
+ }
140
+ }
141
+ }
142
+
143
+ @mixin picker-item-hover {
144
+ color: var(--rs-text-primary);
145
+ background-color: var(--rs-state-hover-bg);
146
+ }
147
+
148
+ @mixin picker-item-active {
149
+ font-weight: var(--rs-picker-select-menu-item-selected-font-weight);
150
+ }
151
+
152
+ @mixin picker-calendar-cell-content {
153
+ display: inline-block;
154
+ cursor: pointer;
155
+ font-size: var(--rs-calendar-cell-font-size);
156
+ line-height: var(--rs-calendar-cell-line-height);
157
+ padding: var(--rs-calendar-cell-padding);
158
+ border-radius: var(--rs-calendar-border-radius);
159
+
160
+ &:hover {
161
+ background-color: var(--rs-state-hover-bg);
162
+ }
163
+ }
164
+
165
+ @mixin picker-calendar-cell-content-selected {
166
+ color: var(--rs-calendar-date-selected-text);
167
+ background-color: var(--rs-bg-active);
168
+ box-shadow: none;
169
+
170
+ @include color-modes.high-contrast-mode {
171
+ text-decoration: underline;
172
+ }
173
+ }
174
+
175
+ @mixin picker-calendar-title-show {
176
+ color: var(--rs-text-active);
177
+ background: transparent;
178
+ }
179
+
180
+ // Default picker toggle
181
+ @mixin picker-default-toggle {
182
+ [data-appearance='default'] & {
183
+ color: var(--rs-text-primary);
184
+ border-width: var(--rs-picker-toggle-border-width);
185
+ border-color: var(--rs-picker-toggle-border-color);
186
+ border-style: solid;
187
+ }
188
+
189
+ [data-disabled='true'] & {
190
+ cursor: var(--rs-cursor-disabled);
191
+ }
192
+
193
+ [data-appearance='default']:not([data-disabled='true']) {
194
+ &:focus {
195
+ border-color: var(--rs-input-focus-border);
196
+ }
197
+ }
198
+ }
199
+
200
+ // Subtle picker toggle
201
+ @mixin picker-subtle-toggle {
202
+ .rs-picker[data-appearance='subtle'] & {
203
+ --rs-picker-toggle-border-width: 0px;
204
+ @include dropdown.dropdown-toggle;
205
+ }
206
+
207
+ .rs-picker[data-appearance='subtle'][data-disabled='true'] & {
208
+ cursor: var(--rs-cursor-disabled);
209
+
210
+ &:focus,
211
+ &:active {
212
+ background: none;
213
+
214
+ &::after {
215
+ display: none;
216
+ }
217
+ }
218
+ }
219
+ }
@@ -0,0 +1,9 @@
1
+ // Picker variables
2
+ :root {
3
+ --rs-picker-transition: var(--rs-input-transition);
4
+ --rs-picker-select-menu-item-selected-font-weight: bold;
5
+ --rs-picker-group-select-menu-gap: 6px;
6
+ --rs-picker-menu-padding: 12px;
7
+ --rs-picker-item-content-padding-vertical: 8px;
8
+ --rs-picker-item-content-padding-horizontal: var(--rs-picker-menu-padding);
9
+ }