reshaped 3.2.5 → 3.2.7

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 (36) hide show
  1. package/CHANGELOG.md +5 -0
  2. package/dist/bundle.css +1 -1
  3. package/dist/bundle.js +11 -11
  4. package/dist/components/Modal/Modal.js +2 -2
  5. package/dist/components/Modal/Modal.types.d.ts +1 -1
  6. package/dist/components/Overlay/Overlay.js +5 -2
  7. package/dist/components/Overlay/Overlay.types.d.ts +2 -0
  8. package/dist/components/Reshaped/Reshaped.js +5 -1
  9. package/dist/components/Table/Table.js +4 -3
  10. package/dist/components/Table/Table.module.css +1 -1
  11. package/dist/components/Table/Table.types.d.ts +2 -0
  12. package/dist/components/Table/tests/Table.stories.d.ts +1 -1
  13. package/dist/components/Table/tests/Table.stories.js +13 -1
  14. package/dist/components/Tabs/Tabs.module.css +1 -1
  15. package/dist/components/Tabs/TabsItem.js +16 -10
  16. package/dist/components/Tabs/TabsList.js +19 -19
  17. package/dist/components/TextField/TextField.module.css +1 -1
  18. package/dist/components/Theme/GlobalColorMode.js +11 -6
  19. package/dist/components/Theme/Theme.context.js +2 -12
  20. package/dist/components/Theme/Theme.js +6 -6
  21. package/dist/components/Theme/Theme.types.d.ts +3 -2
  22. package/dist/components/Theme/Theme.utilities.d.ts +1 -1
  23. package/dist/components/Theme/Theme.utilities.js +10 -1
  24. package/dist/components/Theme/tests/Theme.stories.d.ts +1 -0
  25. package/dist/components/Theme/tests/Theme.stories.js +34 -1
  26. package/dist/components/Theme/useTheme.d.ts +1 -1
  27. package/dist/components/Theme/useTheme.js +1 -2
  28. package/dist/hooks/_private/useSingletonHotkeys.d.ts +3 -3
  29. package/dist/hooks/_private/useSingletonHotkeys.js +22 -16
  30. package/dist/hooks/tests/useHotkeys.stories.js +5 -2
  31. package/dist/hooks/useHotkeys.d.ts +2 -1
  32. package/dist/utilities/dom/find.d.ts +1 -0
  33. package/dist/utilities/dom/find.js +9 -0
  34. package/dist/utilities/dom/index.d.ts +1 -0
  35. package/dist/utilities/dom/index.js +1 -0
  36. package/package.json +1 -1
@@ -4,7 +4,7 @@ import React from "react";
4
4
  * Utilities
5
5
  */
6
6
  const COMBINATION_DELIMETER = "+";
7
- const pressedMap = {};
7
+ const pressedMap = new Map();
8
8
  let modifiedKeys = [];
9
9
  const formatHotkey = (hotkey) => {
10
10
  if (hotkey === " ")
@@ -62,9 +62,9 @@ export class HotkeyStore {
62
62
  });
63
63
  };
64
64
  handleKeyDown = (pressedMap, e) => {
65
- const pressedKeys = Object.keys(pressedMap);
66
- if (!pressedKeys.length)
65
+ if (!pressedMap.size)
67
66
  return;
67
+ const pressedKeys = [...pressedMap.keys()];
68
68
  const pressedId = getHotkeyId(pressedKeys.join(COMBINATION_DELIMETER));
69
69
  const pressedFormattedKeys = pressedId.split(COMBINATION_DELIMETER);
70
70
  const hotkeyData = this.hotkeyMap[pressedId];
@@ -86,12 +86,12 @@ export class HotkeyStore {
86
86
  !(eventTarget === data.ref.current || data.ref.current.contains(eventTarget))) {
87
87
  return;
88
88
  }
89
- const resolvedEvent = pressedMap[pressedId];
89
+ const resolvedEvent = pressedMap.get(pressedId);
90
90
  if (data.options.preventDefault) {
91
91
  resolvedEvent?.preventDefault();
92
92
  e.preventDefault();
93
93
  }
94
- data.callback(resolvedEvent);
94
+ data.callback(e);
95
95
  });
96
96
  }
97
97
  });
@@ -114,13 +114,13 @@ export const SingletonHotkeysProvider = (props) => {
114
114
  const eventKey = getEventKey(e);
115
115
  if (!eventKey)
116
116
  return;
117
- pressedMap[eventKey] = e;
118
- setTriggerCount(Object.keys(pressedMap).length);
117
+ pressedMap.set(eventKey, e);
118
+ setTriggerCount(pressedMap.size);
119
119
  // Key up won't trigger for other keys while Meta is pressed so we need to cache them
120
120
  // and remove on Meta keyup
121
121
  if (e.metaKey)
122
- modifiedKeys.push(...Object.keys(pressedMap));
123
- if (pressedMap.Meta)
122
+ modifiedKeys.push(...pressedMap.keys());
123
+ if (pressedMap.has("Meta"))
124
124
  modifiedKeys.push(eventKey);
125
125
  }, [hooksCount]);
126
126
  const removePressedKey = React.useCallback((e) => {
@@ -129,23 +129,23 @@ export const SingletonHotkeysProvider = (props) => {
129
129
  const eventKey = getEventKey(e);
130
130
  if (!eventKey)
131
131
  return;
132
- delete pressedMap[eventKey];
132
+ pressedMap.delete(eventKey);
133
133
  if (eventKey === "meta" || eventKey === "control") {
134
- delete pressedMap.mod;
134
+ pressedMap.delete("mod");
135
135
  }
136
136
  if (eventKey === "meta") {
137
137
  modifiedKeys.forEach((key) => {
138
- if (!pressedMap[key])
138
+ if (!pressedMap.has(key))
139
139
  return;
140
- delete pressedMap[key];
140
+ pressedMap.delete(key);
141
141
  });
142
142
  modifiedKeys = [];
143
143
  }
144
- setTriggerCount(Object.keys(pressedMap).length);
144
+ setTriggerCount(pressedMap.size);
145
145
  }, [hooksCount]);
146
146
  const isPressed = (hotkey) => {
147
147
  const keys = formatHotkey(hotkey).split(COMBINATION_DELIMETER);
148
- if (keys.some((key) => !pressedMap[key]))
148
+ if (keys.some((key) => !pressedMap.has(key)))
149
149
  return false;
150
150
  return true;
151
151
  };
@@ -161,6 +161,10 @@ export const SingletonHotkeysProvider = (props) => {
161
161
  return;
162
162
  removePressedKey(e);
163
163
  }, [removePressedKey]);
164
+ const handleWindowBlur = React.useCallback(() => {
165
+ pressedMap.clear();
166
+ modifiedKeys = [];
167
+ }, []);
164
168
  const addHotkeys = React.useCallback((hotkeys, ref, options = {}) => {
165
169
  setHooksCount((prev) => prev + 1);
166
170
  globalHotkeyStore.bindHotkeys(hotkeys, ref, options);
@@ -172,11 +176,13 @@ export const SingletonHotkeysProvider = (props) => {
172
176
  React.useEffect(() => {
173
177
  window.addEventListener("keydown", handleWindowKeyDown);
174
178
  window.addEventListener("keyup", handleWindowKeyUp);
179
+ window.addEventListener("blur", handleWindowBlur);
175
180
  return () => {
176
181
  window.removeEventListener("keydown", handleWindowKeyDown);
177
182
  window.removeEventListener("keyup", handleWindowKeyUp);
183
+ window.removeEventListener("blur", handleWindowBlur);
178
184
  };
179
- }, [handleWindowKeyDown, handleWindowKeyUp]);
185
+ }, [handleWindowKeyDown, handleWindowKeyUp, handleWindowBlur]);
180
186
  return (_jsx(HotkeyContext.Provider, { value: { addHotkeys, isPressed }, children: children }));
181
187
  };
182
188
  const useSingletonHotkeys = () => React.useContext(HotkeyContext);
@@ -4,8 +4,11 @@ export default { title: "Hooks/useHotkeys" };
4
4
  function Example() {
5
5
  const { checkHotkeyState } = useHotkeys({
6
6
  "shift + b + n": () => console.log("pressed"),
7
- "c + v": () => console.log(111),
8
- "Meta + v": () => console.log(222),
7
+ "c + v": () => console.log("c + v"),
8
+ "Meta + k": () => console.log("meta + k"),
9
+ "Meta + f": () => console.log("meta + f"),
10
+ "Meta + v": () => console.log("meta + v"),
11
+ "Meta + b": () => console.log("meta + b"),
9
12
  "control + enter": () => console.log("control + enter"),
10
13
  "meta + enter": () => console.log("meta + enter"),
11
14
  "mod + enter": () => console.log("mod + enter"),
@@ -1,5 +1,6 @@
1
1
  import React from "react";
2
- declare const useHotkeys: <Element extends HTMLElement>(hotkeys: Record<string, ((e: KeyboardEvent) => void) | null>, deps?: unknown[], options?: {
2
+ import { type Hotkeys } from "./_private/useSingletonHotkeys";
3
+ declare const useHotkeys: <Element extends HTMLElement>(hotkeys: Hotkeys, deps?: unknown[], options?: {
3
4
  ref?: React.RefObject<Element>;
4
5
  disabled?: boolean;
5
6
  preventDefault?: boolean;
@@ -0,0 +1 @@
1
+ export declare const findParent: (element: HTMLElement, condition: (el: HTMLElement) => boolean) => HTMLElement | null;
@@ -0,0 +1,9 @@
1
+ export const findParent = (element, condition) => {
2
+ let currentElement = element.parentElement;
3
+ while (currentElement) {
4
+ if (condition(currentElement))
5
+ return currentElement;
6
+ currentElement = currentElement.parentElement;
7
+ }
8
+ return null;
9
+ };
@@ -1,3 +1,4 @@
1
1
  export { getClosestFlyoutTarget } from "./flyout";
2
2
  export { getShadowRoot } from "./shadowDom";
3
3
  export { enableUserSelect, disableUserSelect } from "./userSelect";
4
+ export { findParent } from "./find";
@@ -1,3 +1,4 @@
1
1
  export { getClosestFlyoutTarget } from "./flyout.js";
2
2
  export { getShadowRoot } from "./shadowDom.js";
3
3
  export { enableUserSelect, disableUserSelect } from "./userSelect.js";
4
+ export { findParent } from "./find.js";
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "reshaped",
3
3
  "description": "Professionally crafted design system in React & Figma for building products of any scale and complexity",
4
- "version": "3.2.5",
4
+ "version": "3.2.7",
5
5
  "license": "MIT",
6
6
  "email": "hello@reshaped.so",
7
7
  "homepage": "https://reshaped.so",