@expcat/tigercat-react 2.0.19 → 2.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (186) hide show
  1. package/README.md +25 -16
  2. package/dist/chunk-246DAUEF.mjs +181 -0
  3. package/dist/{chunk-PU3JY6RE.mjs → chunk-2JMI7TCM.mjs} +1 -1
  4. package/dist/chunk-2YBLMVDT.mjs +428 -0
  5. package/dist/chunk-2YOP55OF.mjs +639 -0
  6. package/dist/{chunk-25D5TXZH.mjs → chunk-32MCQMBJ.mjs} +8 -6
  7. package/dist/chunk-3HHEVMHE.mjs +180 -0
  8. package/dist/{chunk-HSBN5MLS.mjs → chunk-3LACOSJQ.mjs} +1 -1
  9. package/dist/{chunk-F6WV53BS.mjs → chunk-3LDDXHW2.mjs} +28 -11
  10. package/dist/{chunk-IXQAECFP.mjs → chunk-3QNIFKVF.mjs} +12 -14
  11. package/dist/{chunk-UD4DTVJZ.mjs → chunk-4C2X5PZO.mjs} +57 -25
  12. package/dist/chunk-5JETWHLJ.mjs +28 -0
  13. package/dist/{chunk-VA6PZWOH.mjs → chunk-5SEMRHBD.mjs} +14 -6
  14. package/dist/{chunk-EKILTLUO.mjs → chunk-72CJNKDY.mjs} +1 -1
  15. package/dist/{chunk-XE4YFBOZ.mjs → chunk-AUD3VOLO.mjs} +1 -1
  16. package/dist/{chunk-UT5BV2VO.mjs → chunk-AYFKHWJS.mjs} +16 -10
  17. package/dist/{chunk-RPSHILHD.mjs → chunk-BXAH2GH3.mjs} +8 -2
  18. package/dist/{chunk-EW5EO7VE.mjs → chunk-BYD7EAWK.mjs} +1 -1
  19. package/dist/{chunk-BOGOQ44C.mjs → chunk-CQOLQAB5.mjs} +105 -90
  20. package/dist/{chunk-L55UK45A.mjs → chunk-CRIEUKMD.mjs} +5 -2
  21. package/dist/{chunk-DKNVSQSV.mjs → chunk-CUAXRBKO.mjs} +12 -0
  22. package/dist/{chunk-E7OTDBI6.mjs → chunk-DECUASRW.mjs} +17 -19
  23. package/dist/{chunk-XMTEMBQV.mjs → chunk-EAAWB3CK.mjs} +16 -13
  24. package/dist/{chunk-D33BIMGK.mjs → chunk-EG7EMDKK.mjs} +12 -2
  25. package/dist/chunk-EW43YBPV.mjs +457 -0
  26. package/dist/{chunk-HOYBHB7B.mjs → chunk-FNK2VWPP.mjs} +1 -1
  27. package/dist/{chunk-RJPNBYK5.mjs → chunk-FQS24AUH.mjs} +12 -3
  28. package/dist/{chunk-LADKKOJT.mjs → chunk-GBEDWXLL.mjs} +16 -10
  29. package/dist/chunk-GR3Y3XWP.mjs +47 -0
  30. package/dist/{chunk-2ENQZECC.mjs → chunk-HAXRHSCN.mjs} +4 -3
  31. package/dist/{chunk-K4GIKSZE.mjs → chunk-I2BENK5X.mjs} +2 -1
  32. package/dist/chunk-IGBQGR6G.mjs +234 -0
  33. package/dist/chunk-J76R2S62.mjs +161 -0
  34. package/dist/{chunk-DNOPEJ5I.mjs → chunk-JZZPLKTW.mjs} +7 -4
  35. package/dist/{chunk-7KCQMXJA.mjs → chunk-KDURW5AS.mjs} +4 -3
  36. package/dist/{chunk-TFMEHUVZ.mjs → chunk-KKN7KLTB.mjs} +0 -1
  37. package/dist/{chunk-6MGQAJ62.mjs → chunk-KL6YJIZ3.mjs} +24 -7
  38. package/dist/chunk-KRDHM5KB.mjs +259 -0
  39. package/dist/{chunk-HHIW7V7B.mjs → chunk-M6ZPTGBV.mjs} +2 -10
  40. package/dist/chunk-MFPVVGNA.mjs +248 -0
  41. package/dist/{chunk-PXRZ6CKY.mjs → chunk-MJVSZ2UJ.mjs} +46 -16
  42. package/dist/{chunk-LZKBDQE4.mjs → chunk-MYI3FPG4.mjs} +23 -4
  43. package/dist/{chunk-OIGEBCAS.mjs → chunk-NADODEZX.mjs} +69 -1
  44. package/dist/{chunk-KMP5CVNK.mjs → chunk-NJWTZ5MO.mjs} +57 -45
  45. package/dist/chunk-NLGLBTSM.mjs +138 -0
  46. package/dist/chunk-NT7GW2FD.mjs +40 -0
  47. package/dist/{chunk-773LH7BK.mjs → chunk-O6VYD4E4.mjs} +24 -2
  48. package/dist/{chunk-G7D4QV7A.mjs → chunk-O7TV5OKS.mjs} +33 -6
  49. package/dist/{chunk-DPWRXXXW.mjs → chunk-OJ6SHHOZ.mjs} +3 -3
  50. package/dist/chunk-OKYMTHFQ.mjs +279 -0
  51. package/dist/{chunk-UYJJLHVA.mjs → chunk-PMQJ6AYT.mjs} +23 -21
  52. package/dist/chunk-PY2VUNEJ.mjs +494 -0
  53. package/dist/{chunk-BEJZPJIK.mjs → chunk-QOAOOD53.mjs} +10 -4
  54. package/dist/{chunk-2WGEHH5A.mjs → chunk-QU3QXUTC.mjs} +49 -23
  55. package/dist/{chunk-V6P7ZK6O.mjs → chunk-QXSUG7SN.mjs} +3 -3
  56. package/dist/{chunk-FYINJRYN.mjs → chunk-R7YZ6FKP.mjs} +27 -16
  57. package/dist/{chunk-YI6YWH66.mjs → chunk-RE5ZLA5D.mjs} +6 -6
  58. package/dist/{chunk-UCBW5RJN.mjs → chunk-RGVU4EMA.mjs} +11 -6
  59. package/dist/{chunk-IBSOUQGB.mjs → chunk-RRGPDFDI.mjs} +7 -4
  60. package/dist/{chunk-ZH5ZBLAN.mjs → chunk-RUQ3F3MV.mjs} +34 -7
  61. package/dist/chunk-SEOG5AGS.mjs +72 -0
  62. package/dist/{chunk-PGD5RPKF.mjs → chunk-SVIJ2UZA.mjs} +2 -1
  63. package/dist/chunk-SXWEFZOF.mjs +766 -0
  64. package/dist/{chunk-NCHUEGUW.mjs → chunk-TEVEXDY2.mjs} +27 -16
  65. package/dist/{chunk-DJOFM2VO.mjs → chunk-TO6MZFNQ.mjs} +52 -40
  66. package/dist/chunk-TQ6RIFWR.mjs +135 -0
  67. package/dist/chunk-U4M3DC2P.mjs +48 -0
  68. package/dist/{chunk-ZCGIZOMT.mjs → chunk-V7HJ5HLC.mjs} +6 -10
  69. package/dist/{chunk-SIDDYP3O.mjs → chunk-VJWSKJLJ.mjs} +1 -1
  70. package/dist/{chunk-ZG56T75O.mjs → chunk-WTHWLCRL.mjs} +51 -11
  71. package/dist/{chunk-KP6DEYWB.mjs → chunk-X4L3W7RQ.mjs} +1 -1
  72. package/dist/{chunk-ZMRTETN2.mjs → chunk-X6C6MNG5.mjs} +4 -3
  73. package/dist/chunk-XT43B7ZI.mjs +58 -0
  74. package/dist/{chunk-OGG2TQDG.mjs → chunk-XVHTJQ4T.mjs} +12 -1
  75. package/dist/{chunk-QJE3MZBO.mjs → chunk-Y6UH3EKE.mjs} +1 -1
  76. package/dist/chunk-YJ5T4XZN.mjs +81 -0
  77. package/dist/{chunk-VVNFXJMN.mjs → chunk-YNDPQVEK.mjs} +8 -1
  78. package/dist/{chunk-QGZ32NFQ.mjs → chunk-Z23KOLNU.mjs} +4 -3
  79. package/dist/{chunk-5CKMYMTS.mjs → chunk-ZATZRXMW.mjs} +27 -8
  80. package/dist/components/ActivityFeed.mjs +3 -3
  81. package/dist/components/Affix.mjs +1 -1
  82. package/dist/components/Anchor.mjs +1 -1
  83. package/dist/components/AreaChart.mjs +5 -4
  84. package/dist/components/AspectRatio.d.mts +10 -0
  85. package/dist/components/AspectRatio.mjs +8 -0
  86. package/dist/components/AutoComplete.mjs +1 -1
  87. package/dist/components/BarChart.mjs +5 -4
  88. package/dist/components/Calendar.mjs +1 -1
  89. package/dist/components/Cascader.mjs +1 -1
  90. package/dist/components/ChartCanvas.mjs +1 -1
  91. package/dist/components/ChatWindow.mjs +4 -4
  92. package/dist/components/Code.mjs +3 -1
  93. package/dist/components/CollapsePanel.mjs +1 -1
  94. package/dist/components/ColorPicker.mjs +1 -1
  95. package/dist/components/CommentThread.mjs +2 -2
  96. package/dist/components/ContextMenu.d.mts +36 -0
  97. package/dist/components/ContextMenu.mjs +17 -0
  98. package/dist/components/DataExport.mjs +2 -2
  99. package/dist/components/DataTableWithToolbar.mjs +7 -7
  100. package/dist/components/DonutChart.mjs +4 -4
  101. package/dist/components/Dropdown.mjs +1 -1
  102. package/dist/components/FileManager.mjs +2 -1
  103. package/dist/components/FloatButton.mjs +1 -1
  104. package/dist/components/FormItem.mjs +1 -1
  105. package/dist/components/FormWizard.mjs +1 -1
  106. package/dist/components/FunnelChart.mjs +3 -3
  107. package/dist/components/Gantt.d.mts +3 -1
  108. package/dist/components/Gantt.mjs +2 -2
  109. package/dist/components/GaugeChart.mjs +2 -2
  110. package/dist/components/HeatmapChart.mjs +3 -3
  111. package/dist/components/Highlight.d.mts +11 -0
  112. package/dist/components/Highlight.mjs +8 -0
  113. package/dist/components/Image.mjs +4 -4
  114. package/dist/components/ImageCompare.d.mts +15 -0
  115. package/dist/components/ImageCompare.mjs +8 -0
  116. package/dist/components/ImageGroup.mjs +2 -2
  117. package/dist/components/ImagePreview.mjs +1 -1
  118. package/dist/components/Input.mjs +1 -1
  119. package/dist/components/InputNumber.d.mts +1 -1
  120. package/dist/components/InputNumber.mjs +1 -1
  121. package/dist/components/InputOTP.d.mts +33 -0
  122. package/dist/components/InputOTP.mjs +12 -0
  123. package/dist/components/Kanban.mjs +2 -2
  124. package/dist/components/Kbd.d.mts +10 -0
  125. package/dist/components/Kbd.mjs +8 -0
  126. package/dist/components/LineChart.mjs +5 -4
  127. package/dist/components/List.mjs +2 -2
  128. package/dist/components/Loading.mjs +1 -1
  129. package/dist/components/LoadingBar.d.mts +8 -0
  130. package/dist/components/LoadingBar.mjs +138 -0
  131. package/dist/components/LoadingBarContainer.d.mts +8 -0
  132. package/dist/components/LoadingBarContainer.mjs +8 -0
  133. package/dist/components/LoadingBarRoot.d.mts +6 -0
  134. package/dist/components/LoadingBarRoot.mjs +6 -0
  135. package/dist/components/Marquee.d.mts +10 -0
  136. package/dist/components/Marquee.mjs +8 -0
  137. package/dist/components/MaskInput.d.mts +37 -0
  138. package/dist/components/MaskInput.mjs +10 -0
  139. package/dist/components/Masonry.d.mts +10 -0
  140. package/dist/components/Masonry.mjs +8 -0
  141. package/dist/components/NavigationMenu.d.mts +84 -0
  142. package/dist/components/NavigationMenu.mjs +23 -0
  143. package/dist/components/NotificationCenter.mjs +4 -4
  144. package/dist/components/OrgChart.mjs +2 -2
  145. package/dist/components/PageHeader.d.mts +34 -0
  146. package/dist/components/PageHeader.mjs +11 -0
  147. package/dist/components/Pagination.mjs +1 -1
  148. package/dist/components/PieChart.mjs +3 -3
  149. package/dist/components/Popconfirm.mjs +2 -2
  150. package/dist/components/Popover.mjs +2 -2
  151. package/dist/components/QRCode.d.mts +2 -2
  152. package/dist/components/QRCode.mjs +1 -1
  153. package/dist/components/RadarChart.mjs +4 -4
  154. package/dist/components/Rate.mjs +1 -1
  155. package/dist/components/ScatterChart.mjs +5 -4
  156. package/dist/components/ScrollArea.d.mts +10 -0
  157. package/dist/components/ScrollArea.mjs +8 -0
  158. package/dist/components/ScrollSpy.mjs +1 -1
  159. package/dist/components/Signature.mjs +1 -1
  160. package/dist/components/SplitButton.d.mts +38 -0
  161. package/dist/components/SplitButton.mjs +12 -0
  162. package/dist/components/Splitter.mjs +1 -1
  163. package/dist/components/Stepper.d.mts +2 -0
  164. package/dist/components/Stepper.mjs +2 -1
  165. package/dist/components/SunburstChart.mjs +3 -3
  166. package/dist/components/Switch.d.mts +5 -1
  167. package/dist/components/Switch.mjs +2 -1
  168. package/dist/components/Table.mjs +2 -2
  169. package/dist/components/TagsInput.d.mts +41 -0
  170. package/dist/components/TagsInput.mjs +13 -0
  171. package/dist/components/TaskBoard.mjs +1 -1
  172. package/dist/components/Textarea.mjs +1 -1
  173. package/dist/components/Tooltip.mjs +2 -2
  174. package/dist/components/Tour.mjs +1 -1
  175. package/dist/components/TreeMapChart.mjs +3 -3
  176. package/dist/components/TreeSelect.mjs +2 -1
  177. package/dist/components/Upload.mjs +1 -1
  178. package/dist/hooks/useChartInteraction.d.mts +5 -0
  179. package/dist/hooks/useChartInteraction.mjs +1 -1
  180. package/dist/index.d.mts +17 -1
  181. package/dist/index.mjs +406 -0
  182. package/package.json +117 -2
  183. package/dist/chunk-7AFRHC7P.mjs +0 -312
  184. package/dist/chunk-CB4SK5AU.mjs +0 -235
  185. package/dist/chunk-KPACLRQH.mjs +0 -55
  186. package/dist/chunk-YIB6ZXZF.mjs +0 -386
@@ -0,0 +1,494 @@
1
+ import {
2
+ VirtualList
3
+ } from "./chunk-Y5X3G2LD.mjs";
4
+ import {
5
+ renderOverlayPortal,
6
+ useAnchoredOverlay
7
+ } from "./chunk-HKAZXG74.mjs";
8
+ import {
9
+ useTigerConfig
10
+ } from "./chunk-YSIXURBW.mjs";
11
+
12
+ // src/components/TreeSelect.tsx
13
+ import { useState, useMemo, useRef, useId, useLayoutEffect, useCallback } from "react";
14
+ import {
15
+ resolveLocaleText,
16
+ mergeTigerLocale,
17
+ treeSelectBaseClasses,
18
+ treeSelectSearchClasses,
19
+ treeSelectEmptyClasses,
20
+ getTreeSelectTriggerClasses,
21
+ getTreeSelectNodeClasses,
22
+ getTreeSelectDropdownClasses,
23
+ getTreeSelectDisplayLabel,
24
+ getAllTreeSelectKeys,
25
+ flattenTreeSelectNodes,
26
+ filterTreeSelectNodes,
27
+ getTreeSelectVisibleIndex,
28
+ alignTreeSelectVirtualScroll,
29
+ TREE_SELECT_DEFAULT_HEIGHT,
30
+ TREE_SELECT_DEFAULT_ITEM_HEIGHT,
31
+ getPickerComboboxAria,
32
+ getPickerListboxAria,
33
+ getPickerOptionAria,
34
+ getPickerTriggerKeyAction,
35
+ getPickerNavigationIndex,
36
+ getPickerOptionId,
37
+ findFirstEnabledIndex,
38
+ classNames,
39
+ icon20ViewBox,
40
+ chevronDownSolidIcon20PathD,
41
+ chevronRightSolidIcon20PathD,
42
+ closeSolidIcon20PathD
43
+ } from "@expcat/tigercat-core";
44
+ import { jsx, jsxs } from "react/jsx-runtime";
45
+ var TREESELECT_KEYS = /* @__PURE__ */ new Set([
46
+ "value",
47
+ "treeData",
48
+ "placeholder",
49
+ "size",
50
+ "disabled",
51
+ "clearable",
52
+ "multiple",
53
+ "searchable",
54
+ "searchValue",
55
+ "defaultSearchValue",
56
+ "emptyText",
57
+ "defaultExpandAll",
58
+ "virtual",
59
+ "height",
60
+ "itemHeight",
61
+ "onChange",
62
+ "onSearchChange"
63
+ ]);
64
+ var TreeSelect = (props) => {
65
+ const {
66
+ value,
67
+ treeData = [],
68
+ placeholder = "Please select",
69
+ size = "md",
70
+ disabled = false,
71
+ clearable = false,
72
+ multiple = false,
73
+ searchable = false,
74
+ searchValue,
75
+ defaultSearchValue = "",
76
+ emptyText,
77
+ defaultExpandAll = false,
78
+ virtual = false,
79
+ height = TREE_SELECT_DEFAULT_HEIGHT,
80
+ itemHeight = TREE_SELECT_DEFAULT_ITEM_HEIGHT,
81
+ className,
82
+ onChange,
83
+ onSearchChange,
84
+ locale,
85
+ ...rest
86
+ } = props;
87
+ const config = useTigerConfig();
88
+ const mergedLocale = useMemo(
89
+ () => mergeTigerLocale(config.locale, locale),
90
+ [config.locale, locale]
91
+ );
92
+ const divProps = {};
93
+ for (const key of Object.keys(rest)) {
94
+ if (!TREESELECT_KEYS.has(key)) {
95
+ divProps[key] = rest[key];
96
+ }
97
+ }
98
+ const instanceId = useId();
99
+ const listboxId = `tiger-treeselect-listbox-${instanceId}`;
100
+ const [isOpen, setIsOpen] = useState(false);
101
+ const [uncontrolledSearchValue, setUncontrolledSearchValue] = useState(defaultSearchValue);
102
+ const searchQuery = searchValue ?? uncontrolledSearchValue;
103
+ const [expandedKeys, setExpandedKeys] = useState(
104
+ () => defaultExpandAll ? new Set(getAllTreeSelectKeys(treeData)) : /* @__PURE__ */ new Set()
105
+ );
106
+ const containerRef = useRef(null);
107
+ const triggerRef = useRef(null);
108
+ const dropdownRef = useRef(null);
109
+ const virtualListWrapperRef = useRef(null);
110
+ const [activeIndex, setActiveIndex] = useState(-1);
111
+ const overlay = useAnchoredOverlay({
112
+ enabled: isOpen,
113
+ referenceRef: triggerRef,
114
+ floatingRef: dropdownRef,
115
+ containerRef,
116
+ placement: "bottom-start",
117
+ offset: 4,
118
+ matchReferenceWidth: true,
119
+ dismissOnOutside: true,
120
+ dismissOnEscape: true,
121
+ restoreFocusOnDismiss: true,
122
+ onDismiss: closeDropdown
123
+ });
124
+ const displayLabel = useMemo(() => getTreeSelectDisplayLabel(treeData, value), [treeData, value]);
125
+ const showClearButton = clearable && !disabled && value !== void 0 && (Array.isArray(value) ? value.length > 0 : value !== "");
126
+ const matchedKeys = useMemo(() => {
127
+ if (!searchQuery) return null;
128
+ return filterTreeSelectNodes(treeData, searchQuery);
129
+ }, [treeData, searchQuery]);
130
+ const effectiveExpandedKeys = matchedKeys ?? expandedKeys;
131
+ const flatNodes = useMemo(
132
+ () => flattenTreeSelectNodes(treeData, effectiveExpandedKeys),
133
+ [treeData, effectiveExpandedKeys]
134
+ );
135
+ const visibleNodes = useMemo(() => {
136
+ if (!matchedKeys) return flatNodes;
137
+ return flatNodes.filter((f) => matchedKeys.has(f.node.key));
138
+ }, [flatNodes, matchedKeys]);
139
+ const isNodeDisabled = useCallback((item) => !!item.node.disabled, []);
140
+ const visibleNodesRef = useRef(visibleNodes);
141
+ visibleNodesRef.current = visibleNodes;
142
+ const valueRef = useRef(value);
143
+ valueRef.current = value;
144
+ const lastActiveKeyRef = useRef(void 0);
145
+ const resolveActiveIndex = useCallback(() => {
146
+ const nodes = visibleNodesRef.current;
147
+ const selected = getTreeSelectVisibleIndex(nodes, valueRef.current);
148
+ if (selected >= 0 && !nodes[selected]?.node.disabled) return selected;
149
+ return findFirstEnabledIndex(nodes, isNodeDisabled);
150
+ }, [isNodeDisabled]);
151
+ const commitActiveIndex = useCallback((index) => {
152
+ lastActiveKeyRef.current = index >= 0 ? visibleNodesRef.current[index]?.node.key : void 0;
153
+ setActiveIndex(index);
154
+ }, []);
155
+ const alignVirtualScroll = useCallback(
156
+ (index) => {
157
+ if (!virtual) return;
158
+ const wrapper = virtualListWrapperRef.current;
159
+ const el = wrapper?.firstElementChild ?? wrapper;
160
+ alignTreeSelectVirtualScroll(el, index, itemHeight, height);
161
+ },
162
+ [virtual, itemHeight, height]
163
+ );
164
+ useLayoutEffect(() => {
165
+ if (!isOpen) {
166
+ commitActiveIndex(-1);
167
+ return;
168
+ }
169
+ commitActiveIndex(resolveActiveIndex());
170
+ }, [isOpen, searchQuery, commitActiveIndex, resolveActiveIndex]);
171
+ useLayoutEffect(() => {
172
+ if (!isOpen) return;
173
+ const remapped = getTreeSelectVisibleIndex(visibleNodesRef.current, lastActiveKeyRef.current);
174
+ if (remapped >= 0) setActiveIndex(remapped);
175
+ }, [expandedKeys, treeData, isOpen]);
176
+ useLayoutEffect(() => {
177
+ if (!isOpen) return;
178
+ alignVirtualScroll(activeIndex);
179
+ }, [activeIndex, isOpen, alignVirtualScroll, visibleNodes.length]);
180
+ function handleVirtualListKeyDown(e) {
181
+ if (e.key !== "ArrowDown" && e.key !== "ArrowUp" && e.key !== "Home" && e.key !== "End") {
182
+ return;
183
+ }
184
+ e.preventDefault();
185
+ e.stopPropagation();
186
+ setActiveIndex((current) => {
187
+ const next = getPickerNavigationIndex(visibleNodes, current, e.key, isNodeDisabled);
188
+ lastActiveKeyRef.current = visibleNodes[next]?.node.key;
189
+ return next;
190
+ });
191
+ }
192
+ function openDropdown() {
193
+ if (disabled) return;
194
+ setIsOpen(true);
195
+ }
196
+ function closeDropdown() {
197
+ setIsOpen(false);
198
+ updateSearchValue("");
199
+ }
200
+ function updateSearchValue(value2) {
201
+ if (searchValue === void 0) {
202
+ setUncontrolledSearchValue(value2);
203
+ }
204
+ onSearchChange?.(value2);
205
+ }
206
+ function toggleDropdown() {
207
+ if (isOpen) closeDropdown();
208
+ else openDropdown();
209
+ }
210
+ function toggleExpandKey(key) {
211
+ setExpandedKeys((prev) => {
212
+ const next = new Set(prev);
213
+ if (next.has(key)) next.delete(key);
214
+ else next.add(key);
215
+ return next;
216
+ });
217
+ }
218
+ function toggleExpand(key, e) {
219
+ e.stopPropagation();
220
+ toggleExpandKey(key);
221
+ }
222
+ function isSelected(key) {
223
+ if (multiple && Array.isArray(value)) {
224
+ return value.includes(key);
225
+ }
226
+ return value === key;
227
+ }
228
+ function handleNodeSelect(node) {
229
+ if (node.disabled) return;
230
+ if (multiple) {
231
+ const current = Array.isArray(value) ? [...value] : [];
232
+ const idx = current.indexOf(node.key);
233
+ if (idx >= 0) current.splice(idx, 1);
234
+ else current.push(node.key);
235
+ onChange?.(current);
236
+ } else {
237
+ onChange?.(node.key);
238
+ closeDropdown();
239
+ }
240
+ }
241
+ function handleClear(e) {
242
+ e.stopPropagation();
243
+ onChange?.(multiple ? [] : void 0);
244
+ }
245
+ function handleOpenListKeyDown(e, fromSearchInput = false) {
246
+ const key = e.key;
247
+ if (fromSearchInput && key === " ") return false;
248
+ if (key === "ArrowDown" || key === "ArrowUp" || key === "Home" || key === "End") {
249
+ e.preventDefault();
250
+ e.stopPropagation();
251
+ setActiveIndex((current) => {
252
+ const next = getPickerNavigationIndex(visibleNodes, current, key, isNodeDisabled);
253
+ lastActiveKeyRef.current = visibleNodes[next]?.node.key;
254
+ return next;
255
+ });
256
+ return true;
257
+ }
258
+ if (key === "Enter" || key === " ") {
259
+ e.preventDefault();
260
+ e.stopPropagation();
261
+ const item = visibleNodes[activeIndex];
262
+ if (item && !item.node.disabled) {
263
+ handleNodeSelect(item.node);
264
+ }
265
+ return true;
266
+ }
267
+ if (key === "ArrowRight") {
268
+ e.preventDefault();
269
+ e.stopPropagation();
270
+ const item = visibleNodes[activeIndex];
271
+ if (item?.hasChildren && !item.isExpanded) {
272
+ toggleExpandKey(item.node.key);
273
+ }
274
+ return true;
275
+ }
276
+ if (key === "ArrowLeft") {
277
+ e.preventDefault();
278
+ e.stopPropagation();
279
+ const item = visibleNodes[activeIndex];
280
+ if (item?.hasChildren && item.isExpanded) {
281
+ toggleExpandKey(item.node.key);
282
+ }
283
+ return true;
284
+ }
285
+ return false;
286
+ }
287
+ function handleKeyDown(e) {
288
+ if (disabled) return;
289
+ if (isOpen && handleOpenListKeyDown(e)) return;
290
+ const action = getPickerTriggerKeyAction(e.key, isOpen);
291
+ if (action === "none") return;
292
+ e.preventDefault();
293
+ if (action === "toggle") {
294
+ if (isOpen) closeDropdown();
295
+ else openDropdown();
296
+ } else if (action === "open") {
297
+ openDropdown();
298
+ } else if (action === "close") {
299
+ closeDropdown();
300
+ }
301
+ }
302
+ function handleDropdownKeyDown(e) {
303
+ if (e.target instanceof HTMLInputElement) return;
304
+ if (!isOpen) return;
305
+ handleOpenListKeyDown(e);
306
+ }
307
+ function handleSearchKeyDown(e) {
308
+ switch (e.key) {
309
+ case " ":
310
+ e.stopPropagation();
311
+ return;
312
+ case "ArrowDown":
313
+ case "ArrowUp":
314
+ case "Enter":
315
+ handleOpenListKeyDown(e, true);
316
+ return;
317
+ case "Escape":
318
+ e.preventDefault();
319
+ e.stopPropagation();
320
+ closeDropdown();
321
+ triggerRef.current?.focus();
322
+ return;
323
+ default:
324
+ return;
325
+ }
326
+ }
327
+ function renderFlatNode(flatNode, index) {
328
+ const { node, level, hasChildren, isExpanded } = flatNode;
329
+ const selected = isSelected(node.key);
330
+ const isActive = index === activeIndex;
331
+ const indent = level * 20;
332
+ return /* @__PURE__ */ jsxs(
333
+ "div",
334
+ {
335
+ id: getPickerOptionId(listboxId, index),
336
+ "data-active": isActive || void 0,
337
+ ...getPickerOptionAria({ selected, disabled: !!node.disabled }),
338
+ className: getTreeSelectNodeClasses(selected || isActive, !!node.disabled, size),
339
+ style: { paddingLeft: `${indent + 8}px`, height: virtual ? "100%" : void 0 },
340
+ onClick: (e) => {
341
+ e.stopPropagation();
342
+ handleNodeSelect(node);
343
+ },
344
+ children: [
345
+ hasChildren ? /* @__PURE__ */ jsx(
346
+ "span",
347
+ {
348
+ className: classNames(
349
+ "inline-flex items-center justify-center w-4 h-4 mr-1 transition-transform",
350
+ isExpanded ? "rotate-90" : ""
351
+ ),
352
+ onClick: (e) => toggleExpand(node.key, e),
353
+ children: /* @__PURE__ */ jsx("svg", { className: "w-3 h-3", viewBox: icon20ViewBox, fill: "currentColor", children: /* @__PURE__ */ jsx("path", { d: chevronRightSolidIcon20PathD, fillRule: "evenodd", clipRule: "evenodd" }) })
354
+ }
355
+ ) : /* @__PURE__ */ jsx("span", { className: "w-4 mr-1" }),
356
+ /* @__PURE__ */ jsx("span", { className: "flex-1 truncate", children: node.label })
357
+ ]
358
+ },
359
+ String(node.key)
360
+ );
361
+ }
362
+ return /* @__PURE__ */ jsxs("div", { ref: containerRef, className: classNames(treeSelectBaseClasses, className), ...divProps, children: [
363
+ /* @__PURE__ */ jsx(
364
+ "button",
365
+ {
366
+ ref: triggerRef,
367
+ type: "button",
368
+ className: classNames(
369
+ getTreeSelectTriggerClasses(size, disabled, isOpen),
370
+ showClearButton ? "pr-14" : void 0
371
+ ),
372
+ ...getPickerComboboxAria({
373
+ expanded: isOpen,
374
+ listboxId,
375
+ activeIndex: isOpen ? activeIndex : -1
376
+ }),
377
+ disabled,
378
+ onClick: toggleDropdown,
379
+ onKeyDown: handleKeyDown,
380
+ children: /* @__PURE__ */ jsx(
381
+ "span",
382
+ {
383
+ className: classNames(
384
+ "flex-1 truncate",
385
+ !displayLabel ? "text-[var(--tiger-treeselect-placeholder,var(--tiger-text-muted,#9ca3af))]" : ""
386
+ ),
387
+ children: displayLabel || placeholder
388
+ }
389
+ )
390
+ }
391
+ ),
392
+ /* @__PURE__ */ jsxs("span", { className: "pointer-events-none absolute inset-y-0 right-3 flex items-center gap-1", children: [
393
+ showClearButton && /* @__PURE__ */ jsx(
394
+ "button",
395
+ {
396
+ type: "button",
397
+ className: "pointer-events-auto inline-flex rounded-sm focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[var(--tiger-treeselect-ring,var(--tiger-primary,#2563eb))] text-[var(--tiger-treeselect-clear,var(--tiger-text-muted,#9ca3af))] hover:text-[var(--tiger-treeselect-clear-hover,var(--tiger-text,#111827))]",
398
+ "data-tiger-treeselect-clear": "",
399
+ "aria-label": resolveLocaleText("Clear selection", mergedLocale?.common?.clearText),
400
+ onClick: handleClear,
401
+ children: /* @__PURE__ */ jsx(
402
+ "svg",
403
+ {
404
+ className: "w-4 h-4",
405
+ viewBox: icon20ViewBox,
406
+ fill: "currentColor",
407
+ xmlns: "http://www.w3.org/2000/svg",
408
+ children: /* @__PURE__ */ jsx("path", { d: closeSolidIcon20PathD, fillRule: "evenodd", clipRule: "evenodd" })
409
+ }
410
+ )
411
+ }
412
+ ),
413
+ /* @__PURE__ */ jsx(
414
+ "span",
415
+ {
416
+ className: classNames(
417
+ "inline-flex text-[var(--tiger-text-muted,#9ca3af)]",
418
+ isOpen && "rotate-180"
419
+ ),
420
+ "aria-hidden": "true",
421
+ children: /* @__PURE__ */ jsx(
422
+ "svg",
423
+ {
424
+ className: "w-4 h-4 transition-transform",
425
+ viewBox: icon20ViewBox,
426
+ fill: "currentColor",
427
+ xmlns: "http://www.w3.org/2000/svg",
428
+ children: /* @__PURE__ */ jsx("path", { d: chevronDownSolidIcon20PathD, fillRule: "evenodd", clipRule: "evenodd" })
429
+ }
430
+ )
431
+ }
432
+ )
433
+ ] }),
434
+ renderOverlayPortal(
435
+ isOpen ? /* @__PURE__ */ jsxs(
436
+ "div",
437
+ {
438
+ ref: dropdownRef,
439
+ ...getPickerListboxAria({ id: listboxId }),
440
+ className: classNames(getTreeSelectDropdownClasses(virtual), overlay.floatingClasses),
441
+ style: overlay.floatingStyles,
442
+ "data-positioned": overlay.positioned,
443
+ onKeyDown: handleDropdownKeyDown,
444
+ children: [
445
+ searchable && /* @__PURE__ */ jsx(
446
+ "input",
447
+ {
448
+ type: "text",
449
+ className: treeSelectSearchClasses,
450
+ placeholder: resolveLocaleText(
451
+ "Search...",
452
+ mergedLocale?.common?.searchPlaceholder
453
+ ),
454
+ value: searchQuery,
455
+ "aria-label": resolveLocaleText(
456
+ "Search tree",
457
+ mergedLocale?.common?.searchPlaceholder
458
+ ),
459
+ onChange: (e) => updateSearchValue(e.target.value),
460
+ onKeyDown: handleSearchKeyDown
461
+ }
462
+ ),
463
+ visibleNodes.length > 0 ? virtual ? /* @__PURE__ */ jsx(
464
+ "div",
465
+ {
466
+ ref: virtualListWrapperRef,
467
+ "data-tiger-treeselect-virtual": "",
468
+ tabIndex: 0,
469
+ onKeyDown: handleVirtualListKeyDown,
470
+ children: /* @__PURE__ */ jsx(
471
+ VirtualList,
472
+ {
473
+ itemCount: visibleNodes.length,
474
+ itemHeight,
475
+ height,
476
+ renderItem: ({ index }) => {
477
+ const item = visibleNodes[index];
478
+ return item ? renderFlatNode(item, index) : null;
479
+ }
480
+ }
481
+ )
482
+ }
483
+ ) : visibleNodes.map((flatNode, index) => renderFlatNode(flatNode, index)) : /* @__PURE__ */ jsx("div", { className: treeSelectEmptyClasses, children: resolveLocaleText("No data", emptyText, mergedLocale?.common?.emptyText) })
484
+ ]
485
+ }
486
+ ) : null,
487
+ overlay.target
488
+ )
489
+ ] });
490
+ };
491
+
492
+ export {
493
+ TreeSelect
494
+ };
@@ -13,6 +13,7 @@ import {
13
13
  calendarWeekdayClasses,
14
14
  getCalendarDayClasses,
15
15
  getCalendarMonthClasses,
16
+ isCalendarMonthDisabled,
16
17
  isSameDay,
17
18
  getMonthDays,
18
19
  getShortDayNames,
@@ -91,10 +92,13 @@ var Calendar = ({
91
92
  );
92
93
  const selectMonth = useCallback(
93
94
  (monthIdx) => {
95
+ if (isCalendarMonthDisabled(viewYear, monthIdx, disabledDate)) return;
94
96
  setViewMonth(monthIdx);
95
- onPanelChange?.(new Date(viewYear, monthIdx, 1), mode);
97
+ const date = new Date(viewYear, monthIdx, 1);
98
+ onChange?.(date);
99
+ onPanelChange?.(date, "month");
96
100
  },
97
- [viewYear, mode, onPanelChange]
101
+ [viewYear, disabledDate, onChange, onPanelChange]
98
102
  );
99
103
  const dayGridRef = useRef(null);
100
104
  const pendingFocusIsoRef = useRef(null);
@@ -256,14 +260,16 @@ var Calendar = ({
256
260
  ] }),
257
261
  mode === "year" ? /* @__PURE__ */ jsx("div", { className: "grid grid-cols-1 gap-2", role: "grid", ref: monthGridRef, children: monthRows.map((row, ri) => /* @__PURE__ */ jsx("div", { className: "grid grid-cols-3 gap-2", role: "row", children: row.map((m, ci) => {
258
262
  const i = ri * 3 + ci;
263
+ const isDisabled = isCalendarMonthDisabled(viewYear, i, disabledDate);
259
264
  return /* @__PURE__ */ jsx(
260
265
  "button",
261
266
  {
262
267
  type: "button",
263
268
  role: "gridcell",
264
269
  "aria-selected": viewMonth === i,
265
- tabIndex: rovingMonthIdx === i ? 0 : -1,
266
- className: getCalendarMonthClasses(viewMonth === i),
270
+ disabled: isDisabled,
271
+ tabIndex: rovingMonthIdx === i && !isDisabled ? 0 : -1,
272
+ className: getCalendarMonthClasses(viewMonth === i, isDisabled),
267
273
  onClick: () => selectMonth(i),
268
274
  onFocus: () => setActiveMonthIdx(i),
269
275
  onKeyDown: (e) => handleMonthKeyDown(e, i),
@@ -4,26 +4,32 @@ import {
4
4
  } from "./chunk-Z3CRHC5F.mjs";
5
5
  import {
6
6
  List
7
- } from "./chunk-QJE3MZBO.mjs";
7
+ } from "./chunk-Y6UH3EKE.mjs";
8
8
  import {
9
9
  Button
10
10
  } from "./chunk-5TE7KLE5.mjs";
11
11
  import {
12
12
  Loading
13
- } from "./chunk-K4GIKSZE.mjs";
13
+ } from "./chunk-I2BENK5X.mjs";
14
14
  import {
15
15
  Text
16
16
  } from "./chunk-HLS4CHWX.mjs";
17
17
  import {
18
18
  Card
19
19
  } from "./chunk-IXV5YBCZ.mjs";
20
+ import {
21
+ useTigerConfig
22
+ } from "./chunk-YSIXURBW.mjs";
20
23
 
21
24
  // src/components/NotificationCenter.tsx
22
25
  import { useMemo, useEffect, useState, useCallback } from "react";
23
26
  import {
24
27
  classNames,
25
28
  buildNotificationGroups,
26
- formatActivityTime
29
+ formatActivityTime,
30
+ getNotificationCenterLabels,
31
+ mergeTigerLocale,
32
+ resolveLocaleText
27
33
  } from "@expcat/tigercat-core";
28
34
 
29
35
  // ../core/src/internal/notification-center-styles.ts
@@ -75,15 +81,17 @@ var NotificationCenter = ({
75
81
  readFilter,
76
82
  defaultReadFilter = "all",
77
83
  loading = false,
78
- loadingText = "\u52A0\u8F7D\u4E2D...",
79
- emptyText = "\u6682\u65E0\u901A\u77E5",
80
- title = "\u901A\u77E5\u4E2D\u5FC3",
81
- allLabel = "\u5168\u90E8",
82
- unreadLabel = "\u672A\u8BFB",
83
- readLabel = "\u5DF2\u8BFB",
84
- markAllReadText = "\u5168\u90E8\u6807\u8BB0\u5DF2\u8BFB",
85
- markReadText = "\u6807\u8BB0\u5DF2\u8BFB",
86
- markUnreadText = "\u6807\u8BB0\u672A\u8BFB",
84
+ loadingText,
85
+ emptyText,
86
+ title,
87
+ allLabel,
88
+ unreadLabel,
89
+ readLabel,
90
+ markAllReadText,
91
+ markReadText,
92
+ markUnreadText,
93
+ locale,
94
+ labels: labelsOverride,
87
95
  manageReadState = false,
88
96
  onGroupChange,
89
97
  onReadFilterChange,
@@ -93,6 +101,24 @@ var NotificationCenter = ({
93
101
  className,
94
102
  ...props
95
103
  }) => {
104
+ const config = useTigerConfig();
105
+ const mergedLocale = useMemo(
106
+ () => mergeTigerLocale(config.locale, locale),
107
+ [config.locale, locale]
108
+ );
109
+ const labels = useMemo(
110
+ () => getNotificationCenterLabels(mergedLocale, labelsOverride),
111
+ [mergedLocale, labelsOverride]
112
+ );
113
+ const resolvedTitle = resolveLocaleText(labels.title, title);
114
+ const resolvedEmptyText = resolveLocaleText(labels.emptyText, emptyText);
115
+ const resolvedLoadingText = resolveLocaleText(labels.loadingText, loadingText);
116
+ const resolvedAllLabel = resolveLocaleText(labels.allLabel, allLabel);
117
+ const resolvedUnreadLabel = resolveLocaleText(labels.unreadLabel, unreadLabel);
118
+ const resolvedReadLabel = resolveLocaleText(labels.readLabel, readLabel);
119
+ const resolvedMarkAllReadText = resolveLocaleText(labels.markAllReadText, markAllReadText);
120
+ const resolvedMarkReadText = resolveLocaleText(labels.markReadText, markReadText);
121
+ const resolvedMarkUnreadText = resolveLocaleText(labels.markUnreadText, markUnreadText);
96
122
  const resolvedGroups = useMemo(
97
123
  () => buildNotificationGroups(items, groups, groupBy, groupOrder),
98
124
  [items, groups, groupBy, groupOrder]
@@ -168,11 +194,11 @@ var NotificationCenter = ({
168
194
  );
169
195
  const filterButtons = useMemo(
170
196
  () => [
171
- { key: "all", label: allLabel },
172
- { key: "unread", label: unreadLabel },
173
- { key: "read", label: readLabel }
197
+ { key: "all", label: resolvedAllLabel },
198
+ { key: "unread", label: resolvedUnreadLabel },
199
+ { key: "read", label: resolvedReadLabel }
174
200
  ],
175
- [allLabel, unreadLabel, readLabel]
201
+ [resolvedAllLabel, resolvedUnreadLabel, resolvedReadLabel]
176
202
  );
177
203
  const groupTabData = useMemo(
178
204
  () => resolvedGroups.map((group, index) => {
@@ -270,7 +296,7 @@ var NotificationCenter = ({
270
296
  }
271
297
  onItemReadChange?.(item, !isRead);
272
298
  },
273
- children: isRead ? markUnreadText : markReadText
299
+ children: isRead ? resolvedMarkUnreadText : resolvedMarkReadText
274
300
  }
275
301
  )
276
302
  ]
@@ -298,7 +324,7 @@ var NotificationCenter = ({
298
324
  )
299
325
  }
300
326
  ) }),
301
- /* @__PURE__ */ jsx(Text, { tag: "div", size: "sm", color: "muted", className: notificationCenterEmptyTextClasses, children: emptyText })
327
+ /* @__PURE__ */ jsx(Text, { tag: "div", size: "sm", color: "muted", className: notificationCenterEmptyTextClasses, children: resolvedEmptyText })
302
328
  ] });
303
329
  }
304
330
  return /* @__PURE__ */ jsx(
@@ -308,13 +334,13 @@ var NotificationCenter = ({
308
334
  split: true,
309
335
  bordered: "divided",
310
336
  hoverable: true,
311
- emptyText,
337
+ emptyText: resolvedEmptyText,
312
338
  onItemClick: (item, index) => onItemClick?.(item, index),
313
339
  renderItem
314
340
  }
315
341
  );
316
342
  };
317
- const content = loading ? /* @__PURE__ */ jsx("div", { className: "flex items-center justify-center py-16", children: /* @__PURE__ */ jsx(Loading, { text: loadingText, className: notificationCenterLoadingClasses }) }) : resolvedGroups.length > 0 ? /* @__PURE__ */ jsx("div", { className: "-mx-4 -mb-4", children: /* @__PURE__ */ jsx(
343
+ const content = loading ? /* @__PURE__ */ jsx("div", { className: "flex items-center justify-center py-16", children: /* @__PURE__ */ jsx(Loading, { text: resolvedLoadingText, className: notificationCenterLoadingClasses }) }) : resolvedGroups.length > 0 ? /* @__PURE__ */ jsx("div", { className: "-mx-4 -mb-4", children: /* @__PURE__ */ jsx(
318
344
  Tabs,
319
345
  {
320
346
  type: "line",
@@ -329,7 +355,7 @@ var NotificationCenter = ({
329
355
  {
330
356
  className: wrapperClasses,
331
357
  role: props.role ?? "region",
332
- "aria-label": props["aria-label"] ?? (props["aria-labelledby"] ? void 0 : title),
358
+ "aria-label": props["aria-label"] ?? (props["aria-labelledby"] ? void 0 : resolvedTitle),
333
359
  ...props,
334
360
  "data-tiger-notification-center": true,
335
361
  children: /* @__PURE__ */ jsx(
@@ -347,7 +373,7 @@ var NotificationCenter = ({
347
373
  size: "base",
348
374
  weight: "bold",
349
375
  className: notificationCenterTitleClasses,
350
- children: title
376
+ children: resolvedTitle
351
377
  }
352
378
  ),
353
379
  totalUnread > 0 ? /* @__PURE__ */ jsx("span", { className: notificationCenterUnreadBadgeClasses, children: totalUnread }) : null
@@ -363,7 +389,7 @@ var NotificationCenter = ({
363
389
  notificationCenterMarkAllBaseClasses,
364
390
  hasUnread ? notificationCenterMarkAllEnabledClasses : notificationCenterMarkAllDisabledClasses
365
391
  ),
366
- children: markAllReadText
392
+ children: resolvedMarkAllReadText
367
393
  }
368
394
  )
369
395
  ] }),