@x-plat/design-system 0.10.0 → 0.12.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 (115) hide show
  1. package/dist/components/AutoResizeTextArea/index.cjs +14 -5
  2. package/dist/components/AutoResizeTextArea/index.css +15 -0
  3. package/dist/components/AutoResizeTextArea/index.d.cts +4 -0
  4. package/dist/components/AutoResizeTextArea/index.d.ts +4 -0
  5. package/dist/components/AutoResizeTextArea/index.js +14 -5
  6. package/dist/components/Badge/index.d.cts +1 -1
  7. package/dist/components/Badge/index.d.ts +1 -1
  8. package/dist/components/ChatInput/index.cjs +20 -7
  9. package/dist/components/ChatInput/index.css +15 -0
  10. package/dist/components/ChatInput/index.d.cts +4 -0
  11. package/dist/components/ChatInput/index.d.ts +4 -0
  12. package/dist/components/ChatInput/index.js +20 -7
  13. package/dist/components/CheckBox/index.cjs +8 -3
  14. package/dist/components/CheckBox/index.css +15 -0
  15. package/dist/components/CheckBox/index.d.cts +1 -1
  16. package/dist/components/CheckBox/index.d.ts +1 -1
  17. package/dist/components/CheckBox/index.js +8 -3
  18. package/dist/components/DatePicker/index.cjs +179 -64
  19. package/dist/components/DatePicker/index.css +19 -0
  20. package/dist/components/DatePicker/index.js +179 -64
  21. package/dist/components/Drawer/index.cjs +83 -4
  22. package/dist/components/Drawer/index.js +83 -4
  23. package/dist/components/Dropdown/index.cjs +57 -16
  24. package/dist/components/Dropdown/index.css +3 -0
  25. package/dist/components/Dropdown/index.js +57 -16
  26. package/dist/components/Editor/index.cjs +779 -50
  27. package/dist/components/Editor/index.css +100 -0
  28. package/dist/components/Editor/index.d.cts +1 -1
  29. package/dist/components/Editor/index.d.ts +1 -1
  30. package/dist/components/Editor/index.js +779 -50
  31. package/dist/components/FieldMessage/index.cjs +8 -3
  32. package/dist/components/FieldMessage/index.css +15 -0
  33. package/dist/components/FieldMessage/index.d.cts +11 -4
  34. package/dist/components/FieldMessage/index.d.ts +11 -4
  35. package/dist/components/FieldMessage/index.js +8 -3
  36. package/dist/components/FileUpload/index.cjs +8 -3
  37. package/dist/components/FileUpload/index.css +15 -0
  38. package/dist/components/FileUpload/index.js +8 -3
  39. package/dist/components/ImageSelector/index.cjs +8 -3
  40. package/dist/components/ImageSelector/index.css +15 -0
  41. package/dist/components/ImageSelector/index.js +8 -3
  42. package/dist/components/Input/index.cjs +15 -5
  43. package/dist/components/Input/index.css +15 -0
  44. package/dist/components/Input/index.d.cts +4 -0
  45. package/dist/components/Input/index.d.ts +4 -0
  46. package/dist/components/Input/index.js +15 -5
  47. package/dist/components/Modal/index.cjs +84 -5
  48. package/dist/components/Modal/index.js +84 -5
  49. package/dist/components/NotificationBadge/index.d.cts +1 -1
  50. package/dist/components/NotificationBadge/index.d.ts +1 -1
  51. package/dist/components/Pagination/index.d.cts +1 -1
  52. package/dist/components/Pagination/index.d.ts +1 -1
  53. package/dist/components/PopOver/index.cjs +55 -13
  54. package/dist/components/PopOver/index.css +3 -0
  55. package/dist/components/PopOver/index.js +55 -13
  56. package/dist/components/Progress/index.d.cts +1 -1
  57. package/dist/components/Progress/index.d.ts +1 -1
  58. package/dist/components/Radio/index.cjs +8 -3
  59. package/dist/components/Radio/index.css +15 -0
  60. package/dist/components/Radio/index.d.cts +1 -1
  61. package/dist/components/Radio/index.d.ts +1 -1
  62. package/dist/components/Radio/index.js +8 -3
  63. package/dist/components/Select/index.cjs +120 -39
  64. package/dist/components/Select/index.css +57 -0
  65. package/dist/components/Select/index.d.cts +11 -0
  66. package/dist/components/Select/index.d.ts +11 -0
  67. package/dist/components/Select/index.js +120 -39
  68. package/dist/components/Spinner/index.d.cts +1 -1
  69. package/dist/components/Spinner/index.d.ts +1 -1
  70. package/dist/components/Stat/index.cjs +84 -0
  71. package/dist/components/Stat/index.css +96 -0
  72. package/dist/components/Stat/index.d.cts +37 -0
  73. package/dist/components/Stat/index.d.ts +37 -0
  74. package/dist/components/Stat/index.js +57 -0
  75. package/dist/components/Steps/index.d.cts +1 -1
  76. package/dist/components/Steps/index.d.ts +1 -1
  77. package/dist/components/Switch/index.cjs +14 -5
  78. package/dist/components/Switch/index.css +15 -0
  79. package/dist/components/Switch/index.d.cts +6 -1
  80. package/dist/components/Switch/index.d.ts +6 -1
  81. package/dist/components/Switch/index.js +14 -5
  82. package/dist/components/Tab/index.cjs +49 -25
  83. package/dist/components/Tab/index.css +4 -0
  84. package/dist/components/Tab/index.js +49 -25
  85. package/dist/components/TextArea/index.cjs +14 -4
  86. package/dist/components/TextArea/index.css +15 -0
  87. package/dist/components/TextArea/index.d.cts +4 -0
  88. package/dist/components/TextArea/index.d.ts +4 -0
  89. package/dist/components/TextArea/index.js +14 -4
  90. package/dist/components/TimePicker/index.cjs +461 -0
  91. package/dist/components/TimePicker/index.css +175 -0
  92. package/dist/components/TimePicker/index.d.cts +42 -0
  93. package/dist/components/TimePicker/index.d.ts +42 -0
  94. package/dist/components/TimePicker/index.js +424 -0
  95. package/dist/components/index.cjs +1500 -398
  96. package/dist/components/index.css +385 -0
  97. package/dist/components/index.d.cts +3 -1
  98. package/dist/components/index.d.ts +3 -1
  99. package/dist/components/index.js +1498 -398
  100. package/dist/index.cjs +1524 -422
  101. package/dist/index.css +385 -0
  102. package/dist/index.d.cts +3 -1
  103. package/dist/index.d.ts +3 -1
  104. package/dist/index.js +1522 -422
  105. package/dist/status-njWqQWFV.d.cts +20 -0
  106. package/dist/status-njWqQWFV.d.ts +20 -0
  107. package/guidelines/AGENT_PROMPT.md +3 -3
  108. package/guidelines/Guidelines.md +3 -0
  109. package/guidelines/components/editor.md +141 -0
  110. package/guidelines/components/form.md +19 -0
  111. package/guidelines/components/stat.md +31 -0
  112. package/guidelines/components/time-picker.md +49 -0
  113. package/package.json +1 -1
  114. package/dist/status-g_KP3qT6.d.cts +0 -8
  115. package/dist/status-g_KP3qT6.d.ts +0 -8
@@ -35,7 +35,7 @@ __export(Dropdown_exports, {
35
35
  module.exports = __toCommonJS(Dropdown_exports);
36
36
 
37
37
  // src/components/Dropdown/Dropdown.tsx
38
- var import_react3 = __toESM(require("react"), 1);
38
+ var import_react4 = __toESM(require("react"), 1);
39
39
 
40
40
  // src/tokens/hooks/Portal.tsx
41
41
  var import_react_dom = __toESM(require("react-dom"), 1);
@@ -51,8 +51,10 @@ var import_react = __toESM(require("react"), 1);
51
51
  var useAutoPosition = (triggerRef, popRef, enabled = true) => {
52
52
  const [position, setPosition] = import_react.default.useState({
53
53
  position: {},
54
- direction: "bottom"
54
+ direction: "bottom",
55
+ repositioning: false
55
56
  });
57
+ const placedRef = import_react.default.useRef(false);
56
58
  const calculatePosition = import_react.default.useCallback(() => {
57
59
  if (!triggerRef.current || !popRef.current) return;
58
60
  const triggerRect = triggerRef.current.getBoundingClientRect();
@@ -77,11 +79,16 @@ var useAutoPosition = (triggerRef, popRef, enabled = true) => {
77
79
  if (left < 8) left = 8;
78
80
  setPosition({
79
81
  position: { top, left },
80
- direction
82
+ direction,
83
+ repositioning: placedRef.current
81
84
  });
85
+ placedRef.current = true;
82
86
  }, [triggerRef, popRef]);
83
87
  import_react.default.useLayoutEffect(() => {
84
- if (!enabled) return;
88
+ if (!enabled) {
89
+ placedRef.current = false;
90
+ return;
91
+ }
85
92
  calculatePosition();
86
93
  const raf = requestAnimationFrame(calculatePosition);
87
94
  return () => cancelAnimationFrame(raf);
@@ -96,11 +103,17 @@ var useAutoPosition = (triggerRef, popRef, enabled = true) => {
96
103
  }, [calculatePosition, enabled, popRef]);
97
104
  import_react.default.useEffect(() => {
98
105
  if (!enabled) return;
99
- window.addEventListener("resize", calculatePosition);
100
- window.addEventListener("scroll", calculatePosition, true);
106
+ let raf = 0;
107
+ const onScrollOrResize = () => {
108
+ cancelAnimationFrame(raf);
109
+ raf = requestAnimationFrame(calculatePosition);
110
+ };
111
+ window.addEventListener("resize", onScrollOrResize, { passive: true });
112
+ window.addEventListener("scroll", onScrollOrResize, { passive: true, capture: true });
101
113
  return () => {
102
- window.removeEventListener("resize", calculatePosition);
103
- window.removeEventListener("scroll", calculatePosition, true);
114
+ cancelAnimationFrame(raf);
115
+ window.removeEventListener("resize", onScrollOrResize);
116
+ window.removeEventListener("scroll", onScrollOrResize, true);
104
117
  };
105
118
  }, [calculatePosition, enabled]);
106
119
  return position;
@@ -132,6 +145,30 @@ var useClickOutside = (refs, handler, enabled = true) => {
132
145
  };
133
146
  var useClickOutside_default = useClickOutside;
134
147
 
148
+ // src/tokens/hooks/useOverlayKeyboard.ts
149
+ var import_react3 = __toESM(require("react"), 1);
150
+ var FOCUSABLE = [
151
+ "a[href]",
152
+ "button:not([disabled])",
153
+ "input:not([disabled]):not([type='hidden'])",
154
+ "select:not([disabled])",
155
+ "textarea:not([disabled])",
156
+ "[tabindex]:not([tabindex='-1'])"
157
+ ].join(",");
158
+ var useEscapeKey = (enabled, onEscape) => {
159
+ import_react3.default.useEffect(() => {
160
+ if (!enabled) return;
161
+ const onKey = (e) => {
162
+ if (e.key !== "Escape") return;
163
+ if (e.defaultPrevented) return;
164
+ e.preventDefault();
165
+ onEscape();
166
+ };
167
+ document.addEventListener("keydown", onKey);
168
+ return () => document.removeEventListener("keydown", onKey);
169
+ }, [enabled, onEscape]);
170
+ };
171
+
135
172
  // ../../node_modules/clsx/dist/clsx.mjs
136
173
  function r(e) {
137
174
  var t, f, n = "";
@@ -152,14 +189,18 @@ var clsx_default = clsx;
152
189
  var import_jsx_runtime = require("react/jsx-runtime");
153
190
  var Dropdown = (props) => {
154
191
  const { items, children } = props;
155
- const [isOpen, setIsOpen] = import_react3.default.useState(false);
156
- const [mounted, setMounted] = import_react3.default.useState(false);
157
- const [visible, setVisible] = import_react3.default.useState(false);
158
- const triggerRef = import_react3.default.useRef(null);
159
- const menuRef = import_react3.default.useRef(null);
160
- const { position, direction } = useAutoPosition_default(triggerRef, menuRef, mounted);
192
+ const [isOpen, setIsOpen] = import_react4.default.useState(false);
193
+ const [mounted, setMounted] = import_react4.default.useState(false);
194
+ const [visible, setVisible] = import_react4.default.useState(false);
195
+ const triggerRef = import_react4.default.useRef(null);
196
+ const menuRef = import_react4.default.useRef(null);
197
+ const { position, direction, repositioning } = useAutoPosition_default(triggerRef, menuRef, mounted);
161
198
  useClickOutside_default([triggerRef, menuRef], () => setIsOpen(false), isOpen);
162
- import_react3.default.useEffect(() => {
199
+ useEscapeKey(isOpen, () => {
200
+ setIsOpen(false);
201
+ triggerRef.current?.focus({ preventScroll: true });
202
+ });
203
+ import_react4.default.useEffect(() => {
163
204
  if (isOpen) {
164
205
  setMounted(true);
165
206
  const t2 = setTimeout(() => setVisible(true), 1);
@@ -188,7 +229,7 @@ var Dropdown = (props) => {
188
229
  "div",
189
230
  {
190
231
  ref: menuRef,
191
- className: clsx_default("lib-xplat-dropdown-menu", direction, { visible }),
232
+ className: clsx_default("lib-xplat-dropdown-menu", direction, { visible }, repositioning && "repositioning"),
192
233
  style: { top: position.top, left: position.left },
193
234
  role: "menu",
194
235
  children: items.map((item) => /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
@@ -57,3 +57,6 @@
57
57
  color: var(--semantic-text-disabled);
58
58
  cursor: not-allowed;
59
59
  }
60
+ .lib-xplat-dropdown-menu.repositioning {
61
+ transition: none;
62
+ }
@@ -1,5 +1,5 @@
1
1
  // src/components/Dropdown/Dropdown.tsx
2
- import React3 from "react";
2
+ import React4 from "react";
3
3
 
4
4
  // src/tokens/hooks/Portal.tsx
5
5
  import ReactDOM from "react-dom";
@@ -15,8 +15,10 @@ import React from "react";
15
15
  var useAutoPosition = (triggerRef, popRef, enabled = true) => {
16
16
  const [position, setPosition] = React.useState({
17
17
  position: {},
18
- direction: "bottom"
18
+ direction: "bottom",
19
+ repositioning: false
19
20
  });
21
+ const placedRef = React.useRef(false);
20
22
  const calculatePosition = React.useCallback(() => {
21
23
  if (!triggerRef.current || !popRef.current) return;
22
24
  const triggerRect = triggerRef.current.getBoundingClientRect();
@@ -41,11 +43,16 @@ var useAutoPosition = (triggerRef, popRef, enabled = true) => {
41
43
  if (left < 8) left = 8;
42
44
  setPosition({
43
45
  position: { top, left },
44
- direction
46
+ direction,
47
+ repositioning: placedRef.current
45
48
  });
49
+ placedRef.current = true;
46
50
  }, [triggerRef, popRef]);
47
51
  React.useLayoutEffect(() => {
48
- if (!enabled) return;
52
+ if (!enabled) {
53
+ placedRef.current = false;
54
+ return;
55
+ }
49
56
  calculatePosition();
50
57
  const raf = requestAnimationFrame(calculatePosition);
51
58
  return () => cancelAnimationFrame(raf);
@@ -60,11 +67,17 @@ var useAutoPosition = (triggerRef, popRef, enabled = true) => {
60
67
  }, [calculatePosition, enabled, popRef]);
61
68
  React.useEffect(() => {
62
69
  if (!enabled) return;
63
- window.addEventListener("resize", calculatePosition);
64
- window.addEventListener("scroll", calculatePosition, true);
70
+ let raf = 0;
71
+ const onScrollOrResize = () => {
72
+ cancelAnimationFrame(raf);
73
+ raf = requestAnimationFrame(calculatePosition);
74
+ };
75
+ window.addEventListener("resize", onScrollOrResize, { passive: true });
76
+ window.addEventListener("scroll", onScrollOrResize, { passive: true, capture: true });
65
77
  return () => {
66
- window.removeEventListener("resize", calculatePosition);
67
- window.removeEventListener("scroll", calculatePosition, true);
78
+ cancelAnimationFrame(raf);
79
+ window.removeEventListener("resize", onScrollOrResize);
80
+ window.removeEventListener("scroll", onScrollOrResize, true);
68
81
  };
69
82
  }, [calculatePosition, enabled]);
70
83
  return position;
@@ -96,6 +109,30 @@ var useClickOutside = (refs, handler, enabled = true) => {
96
109
  };
97
110
  var useClickOutside_default = useClickOutside;
98
111
 
112
+ // src/tokens/hooks/useOverlayKeyboard.ts
113
+ import React3 from "react";
114
+ var FOCUSABLE = [
115
+ "a[href]",
116
+ "button:not([disabled])",
117
+ "input:not([disabled]):not([type='hidden'])",
118
+ "select:not([disabled])",
119
+ "textarea:not([disabled])",
120
+ "[tabindex]:not([tabindex='-1'])"
121
+ ].join(",");
122
+ var useEscapeKey = (enabled, onEscape) => {
123
+ React3.useEffect(() => {
124
+ if (!enabled) return;
125
+ const onKey = (e) => {
126
+ if (e.key !== "Escape") return;
127
+ if (e.defaultPrevented) return;
128
+ e.preventDefault();
129
+ onEscape();
130
+ };
131
+ document.addEventListener("keydown", onKey);
132
+ return () => document.removeEventListener("keydown", onKey);
133
+ }, [enabled, onEscape]);
134
+ };
135
+
99
136
  // ../../node_modules/clsx/dist/clsx.mjs
100
137
  function r(e) {
101
138
  var t, f, n = "";
@@ -116,14 +153,18 @@ var clsx_default = clsx;
116
153
  import { jsx, jsxs } from "react/jsx-runtime";
117
154
  var Dropdown = (props) => {
118
155
  const { items, children } = props;
119
- const [isOpen, setIsOpen] = React3.useState(false);
120
- const [mounted, setMounted] = React3.useState(false);
121
- const [visible, setVisible] = React3.useState(false);
122
- const triggerRef = React3.useRef(null);
123
- const menuRef = React3.useRef(null);
124
- const { position, direction } = useAutoPosition_default(triggerRef, menuRef, mounted);
156
+ const [isOpen, setIsOpen] = React4.useState(false);
157
+ const [mounted, setMounted] = React4.useState(false);
158
+ const [visible, setVisible] = React4.useState(false);
159
+ const triggerRef = React4.useRef(null);
160
+ const menuRef = React4.useRef(null);
161
+ const { position, direction, repositioning } = useAutoPosition_default(triggerRef, menuRef, mounted);
125
162
  useClickOutside_default([triggerRef, menuRef], () => setIsOpen(false), isOpen);
126
- React3.useEffect(() => {
163
+ useEscapeKey(isOpen, () => {
164
+ setIsOpen(false);
165
+ triggerRef.current?.focus({ preventScroll: true });
166
+ });
167
+ React4.useEffect(() => {
127
168
  if (isOpen) {
128
169
  setMounted(true);
129
170
  const t2 = setTimeout(() => setVisible(true), 1);
@@ -152,7 +193,7 @@ var Dropdown = (props) => {
152
193
  "div",
153
194
  {
154
195
  ref: menuRef,
155
- className: clsx_default("lib-xplat-dropdown-menu", direction, { visible }),
196
+ className: clsx_default("lib-xplat-dropdown-menu", direction, { visible }, repositioning && "repositioning"),
156
197
  style: { top: position.top, left: position.left },
157
198
  role: "menu",
158
199
  children: items.map((item) => /* @__PURE__ */ jsx(