@rainbow-oh/yee-c 0.8.1 → 0.8.3

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 (225) hide show
  1. package/dist/cjs/Cascader/cascader.js +38 -30
  2. package/dist/cjs/Cascader/column.js +17 -9
  3. package/dist/cjs/Cascader/search-list.js +30 -22
  4. package/dist/cjs/Cascader/utils/index.js +1 -5
  5. package/dist/cjs/Checkbox/checkbox-group.js +23 -14
  6. package/dist/cjs/Dialog/dialog.js +1 -1
  7. package/dist/cjs/Dialog/interface.d.ts +1 -1
  8. package/dist/cjs/Dialog/style/index.less +2 -1
  9. package/dist/cjs/Drawer/drawer.js +9 -1
  10. package/dist/cjs/Form/Group.js +1 -1
  11. package/dist/cjs/Form/demo/tooltip.js +1 -3
  12. package/dist/cjs/Input/style/index.less +1 -0
  13. package/dist/cjs/List/hooks/useListKeyboard.js +3 -1
  14. package/dist/cjs/Menu/menu.js +18 -2
  15. package/dist/cjs/Pagination/items.js +54 -26
  16. package/dist/cjs/Pagination/pagination.js +25 -9
  17. package/dist/cjs/PickerPanel/panels/DateTimePanel/index.d.ts +1 -1
  18. package/dist/cjs/PickerPanel/panels/MonthPanel/MonthHeader.js +7 -1
  19. package/dist/cjs/Rate/star.js +27 -3
  20. package/dist/cjs/Segmented/demo/variant.js +15 -1
  21. package/dist/cjs/Segmented/index.d.ts +1 -1
  22. package/dist/cjs/Segmented/segmented.js +12 -15
  23. package/dist/cjs/Select/option.js +8 -1
  24. package/dist/cjs/Select/options.js +9 -1
  25. package/dist/cjs/Select/select.js +3 -1
  26. package/dist/cjs/Selector/style/index.less +1 -0
  27. package/dist/cjs/Steps/step.js +14 -2
  28. package/dist/cjs/Steps/steps.js +11 -1
  29. package/dist/cjs/Table/demo/components-override.js +31 -2
  30. package/dist/cjs/Table/demo/grouping.js +7 -1
  31. package/dist/cjs/Table/hooks/useColumns.d.ts +3 -3
  32. package/dist/cjs/Table/hooks/useColumns.js +11 -14
  33. package/dist/cjs/Table/icon/arrow-icon.js +1 -1
  34. package/dist/cjs/Table/index.d.ts +1 -1
  35. package/dist/cjs/Table/style/index.less +2 -4
  36. package/dist/cjs/Table/tbody/row.js +1 -4
  37. package/dist/cjs/Table/theader/cell.js +6 -3
  38. package/dist/cjs/Table/theader/index.js +12 -4
  39. package/dist/cjs/TextArea/style/index.less +1 -0
  40. package/dist/cjs/Tour/index.d.ts +1 -1
  41. package/dist/cjs/Tree/style/index.less +1 -5
  42. package/dist/cjs/Tree/tree.js +38 -35
  43. package/dist/cjs/VerificationCode/style/index.less +1 -0
  44. package/dist/cjs/hooks/useCountdown.d.ts +2 -1
  45. package/dist/cjs/hooks/useCountdown.js +46 -23
  46. package/dist/cjs/hooks/useEvent.js +1 -4
  47. package/dist/cjs/locale/interface.d.ts +3 -0
  48. package/dist/cjs/locale/lang/en_US.js +4 -1
  49. package/dist/cjs/locale/lang/ja_JP.js +4 -1
  50. package/dist/cjs/locale/lang/zh_CN.js +4 -1
  51. package/dist/cjs/locale/lang/zh_TW.js +4 -1
  52. package/dist/cjs/message/demo/base.js +1 -1
  53. package/dist/cjs/message/index.d.ts +1 -1
  54. package/dist/cjs/message/interface.d.ts +16 -7
  55. package/dist/cjs/message/message-provider.d.ts +2 -1
  56. package/dist/cjs/message/message-provider.js +1 -1
  57. package/dist/cjs/message/message.js +14 -9
  58. package/dist/cjs/message/style/index.less +3 -1
  59. package/dist/cjs/message/use-message.d.ts +3 -12
  60. package/dist/cjs/message/use-message.js +103 -45
  61. package/dist/cjs/message/wrapper.d.ts +21 -27
  62. package/dist/cjs/message/wrapper.js +49 -19
  63. package/dist/cjs/notice/index.d.ts +1 -1
  64. package/dist/cjs/notice/interface.d.ts +17 -7
  65. package/dist/cjs/notice/notice-list.d.ts +3 -3
  66. package/dist/cjs/notice/notice-provider.d.ts +2 -1
  67. package/dist/cjs/notice/notice-provider.js +1 -1
  68. package/dist/cjs/notice/notice.js +63 -20
  69. package/dist/cjs/notice/style/index.less +13 -1
  70. package/dist/cjs/notice/use-notice.d.ts +2 -11
  71. package/dist/cjs/notice/use-notice.js +156 -71
  72. package/dist/cjs/notice/wrapper.d.ts +19 -15
  73. package/dist/cjs/notice/wrapper.js +122 -52
  74. package/dist/cjs/style/size.css +5 -3
  75. package/dist/cjs/style/themes.css +1 -1
  76. package/dist/cjs/style/variables.css +6 -4
  77. package/dist/cjs/version.d.ts +1 -1
  78. package/dist/cjs/version.js +1 -1
  79. package/dist/esm/Dialog/dialog.js +2 -2
  80. package/dist/esm/Dialog/interface.d.ts +1 -1
  81. package/dist/esm/Dialog/style/index.less +2 -1
  82. package/dist/esm/Form/Group.js +1 -1
  83. package/dist/esm/Input/style/index.less +1 -0
  84. package/dist/esm/PickerPanel/panels/DateTimePanel/index.d.ts +1 -1
  85. package/dist/esm/Segmented/index.d.ts +1 -1
  86. package/dist/esm/Segmented/segmented.js +1 -1
  87. package/dist/esm/Selector/style/index.less +1 -0
  88. package/dist/esm/Table/demo/components-override.js +1 -0
  89. package/dist/esm/Table/hooks/useColumns.d.ts +3 -3
  90. package/dist/esm/Table/hooks/useColumns.js +13 -16
  91. package/dist/esm/Table/icon/arrow-icon.js +1 -1
  92. package/dist/esm/Table/index.d.ts +1 -1
  93. package/dist/esm/Table/style/index.less +2 -4
  94. package/dist/esm/Table/theader/cell.js +7 -3
  95. package/dist/esm/TextArea/style/index.less +1 -0
  96. package/dist/esm/Tour/index.d.ts +1 -1
  97. package/dist/esm/Tree/style/index.less +1 -5
  98. package/dist/esm/Tree/tree.js +1 -1
  99. package/dist/esm/VerificationCode/style/index.less +1 -0
  100. package/dist/esm/hooks/useCountdown.d.ts +2 -1
  101. package/dist/esm/hooks/useCountdown.js +44 -14
  102. package/dist/esm/locale/interface.d.ts +3 -0
  103. package/dist/esm/locale/lang/en_US.js +4 -1
  104. package/dist/esm/locale/lang/ja_JP.js +4 -1
  105. package/dist/esm/locale/lang/zh_CN.js +4 -1
  106. package/dist/esm/locale/lang/zh_TW.js +4 -1
  107. package/dist/esm/message/demo/base.js +4 -1
  108. package/dist/esm/message/index.d.ts +1 -1
  109. package/dist/esm/message/interface.d.ts +16 -7
  110. package/dist/esm/message/message-provider.d.ts +2 -1
  111. package/dist/esm/message/message-provider.js +1 -1
  112. package/dist/esm/message/message.js +22 -9
  113. package/dist/esm/message/style/index.less +3 -1
  114. package/dist/esm/message/use-message.d.ts +3 -12
  115. package/dist/esm/message/use-message.js +129 -79
  116. package/dist/esm/message/wrapper.d.ts +21 -27
  117. package/dist/esm/message/wrapper.js +60 -18
  118. package/dist/esm/notice/index.d.ts +1 -1
  119. package/dist/esm/notice/interface.d.ts +17 -7
  120. package/dist/esm/notice/notice-list.d.ts +3 -3
  121. package/dist/esm/notice/notice-provider.d.ts +2 -1
  122. package/dist/esm/notice/notice-provider.js +1 -1
  123. package/dist/esm/notice/notice.js +73 -21
  124. package/dist/esm/notice/style/index.less +13 -1
  125. package/dist/esm/notice/use-notice.d.ts +2 -11
  126. package/dist/esm/notice/use-notice.js +180 -100
  127. package/dist/esm/notice/wrapper.d.ts +19 -15
  128. package/dist/esm/notice/wrapper.js +144 -62
  129. package/dist/esm/style/size.css +5 -3
  130. package/dist/esm/style/themes.css +1 -1
  131. package/dist/esm/style/variables.css +6 -4
  132. package/dist/esm/version.d.ts +1 -1
  133. package/dist/esm/version.js +1 -1
  134. package/dist/umd/yee-c.min.css +2 -2
  135. package/dist/umd/yee-c.min.js +1 -1
  136. package/package.json +1 -1
  137. package/src/Anchor/anchor.tsx +2 -2
  138. package/src/Carousel/carousel.tsx +1 -2
  139. package/src/Cascader/cascader.tsx +5 -1
  140. package/src/Cascader/column.tsx +5 -1
  141. package/src/Cascader/search-list.tsx +10 -3
  142. package/src/Cascader/utils/index.ts +3 -6
  143. package/src/Checkbox/checkbox-group.tsx +6 -1
  144. package/src/Dialog/dialog.tsx +7 -3
  145. package/src/Dialog/interface.ts +1 -1
  146. package/src/Dialog/style/index.less +2 -1
  147. package/src/Drawer/drawer.tsx +7 -1
  148. package/src/Form/Group.tsx +2 -4
  149. package/src/Form/demo/tooltip.tsx +2 -11
  150. package/src/Form/utils/validate.ts +1 -4
  151. package/src/Input/style/index.less +1 -0
  152. package/src/List/hooks/useListKeyboard.ts +3 -3
  153. package/src/List/list.tsx +2 -1
  154. package/src/Menu/menu.tsx +14 -3
  155. package/src/Pagination/items.tsx +16 -4
  156. package/src/Pagination/pagination.tsx +18 -4
  157. package/src/PickerPanel/panels/DatePanel/DateBody.tsx +1 -1
  158. package/src/PickerPanel/panels/DateTimePanel/index.tsx +1 -1
  159. package/src/PickerPanel/panels/MonthPanel/MonthHeader.tsx +7 -2
  160. package/src/PickerPanel/panels/PanelBody.tsx +1 -1
  161. package/src/PickerPanel/panels/QuarterPanel/QuarterHeader.tsx +1 -1
  162. package/src/PickerPanel/panels/RangePanel/index.tsx +1 -1
  163. package/src/PickerPanel/panels/TimePanel/TimeBody.tsx +1 -1
  164. package/src/PickerPanel/panels/YearPanel/YearHeader.tsx +1 -1
  165. package/src/PickerPanel/utils/pickerUtils.ts +2 -1
  166. package/src/RangePicker/range-picker-mobile.tsx +1 -3
  167. package/src/Rate/star.tsx +16 -4
  168. package/src/Segmented/demo/variant.tsx +10 -2
  169. package/src/Segmented/index.ts +2 -2
  170. package/src/Segmented/segmented.tsx +4 -11
  171. package/src/Select/interface.ts +0 -1
  172. package/src/Select/option.tsx +8 -2
  173. package/src/Select/options.tsx +11 -4
  174. package/src/Select/select.tsx +4 -4
  175. package/src/Selector/style/index.less +1 -0
  176. package/src/Steps/step.tsx +11 -3
  177. package/src/Steps/steps.tsx +8 -1
  178. package/src/Table/demo/components-override.tsx +34 -7
  179. package/src/Table/demo/grouping.tsx +8 -4
  180. package/src/Table/hooks/useColumns.ts +14 -18
  181. package/src/Table/icon/arrow-icon.tsx +1 -1
  182. package/src/Table/index.ts +3 -3
  183. package/src/Table/style/index.less +2 -4
  184. package/src/Table/table.tsx +2 -4
  185. package/src/Table/tbody/row.tsx +1 -3
  186. package/src/Table/theader/cell.tsx +6 -3
  187. package/src/Table/theader/index.tsx +9 -10
  188. package/src/TextArea/style/index.less +1 -0
  189. package/src/Tour/demo/placement.tsx +2 -1
  190. package/src/Tour/index.ts +1 -1
  191. package/src/Tree/style/index.less +1 -5
  192. package/src/Tree/tree.tsx +16 -11
  193. package/src/Tree/utils/tree-tools.ts +4 -1
  194. package/src/VerificationCode/style/index.less +1 -0
  195. package/src/hooks/useCountdown.ts +52 -21
  196. package/src/hooks/useEvent.ts +1 -3
  197. package/src/locale/context.tsx +5 -1
  198. package/src/locale/interface.ts +6 -1
  199. package/src/locale/lang/en_US.ts +3 -0
  200. package/src/locale/lang/ja_JP.ts +3 -0
  201. package/src/locale/lang/zh_CN.ts +3 -0
  202. package/src/locale/lang/zh_TW.ts +3 -0
  203. package/src/message/demo/base.tsx +1 -1
  204. package/src/message/index.ts +1 -1
  205. package/src/message/interface.ts +22 -7
  206. package/src/message/message-provider.tsx +3 -2
  207. package/src/message/message.test.tsx +283 -0
  208. package/src/message/message.tsx +14 -9
  209. package/src/message/style/index.less +3 -1
  210. package/src/message/use-message.tsx +144 -67
  211. package/src/message/wrapper.tsx +62 -20
  212. package/src/notice/index.en-US.md +76 -75
  213. package/src/notice/index.ts +6 -1
  214. package/src/notice/index.zh-CN.md +3 -2
  215. package/src/notice/interface.ts +31 -14
  216. package/src/notice/notice-list.tsx +3 -9
  217. package/src/notice/notice-provider.tsx +3 -2
  218. package/src/notice/notice.test.tsx +450 -0
  219. package/src/notice/notice.tsx +69 -21
  220. package/src/notice/style/index.less +13 -1
  221. package/src/notice/use-notice.tsx +210 -94
  222. package/src/notice/wrapper.tsx +159 -71
  223. package/src/style/size.css +5 -3
  224. package/src/utils/debounce.ts +1 -3
  225. package/src/version.ts +1 -1
@@ -54,11 +54,17 @@ var import_react = __toESM(require("react"));
54
54
  var import_client = require("react-dom/client");
55
55
  var import_message_list = __toESM(require("./message-list"));
56
56
  var import_use_message = __toESM(require("./use-message"));
57
+ var noop = () => {
58
+ };
57
59
  var MessageWrapper = class {
58
60
  constructor() {
59
61
  this.root = null;
60
62
  this.messages = [];
61
63
  this.container = null;
64
+ this.generationByKey = /* @__PURE__ */ new Map();
65
+ this.generation = 0;
66
+ this.timerGeneration = 0;
67
+ this.destroy = this.destroy.bind(this);
62
68
  }
63
69
  createContainer() {
64
70
  if (!this.container) {
@@ -87,8 +93,12 @@ var MessageWrapper = class {
87
93
  this.root = null;
88
94
  this.cleanupContainer();
89
95
  this.messages = [];
96
+ this.generationByKey.clear();
90
97
  }
91
98
  render() {
99
+ if (typeof document === "undefined") {
100
+ return;
101
+ }
92
102
  if (this.messages.length === 0) {
93
103
  if (this.root) {
94
104
  this.root.unmount();
@@ -102,55 +112,75 @@ var MessageWrapper = class {
102
112
  this.root = (0, import_client.createRoot)(container);
103
113
  }
104
114
  this.root.render(
105
- /* @__PURE__ */ import_react.default.createElement(import_message_list.default, { items: this.messages, onDestroy: this.destroy.bind(this) })
115
+ /* @__PURE__ */ import_react.default.createElement(import_message_list.default, { items: this.messages, onDestroy: this.destroy })
106
116
  );
107
117
  }
108
118
  show(params) {
109
- if (!params.key) {
110
- params.key = this.uuid();
119
+ var _a, _b;
120
+ if (typeof document === "undefined") {
121
+ return noop;
111
122
  }
112
- const isExit = this.messages.find((item) => item.key === params.key);
113
- if (isExit) {
114
- this.messages = this.messages.map((item) => {
115
- if (item.key === params.key) {
116
- return params;
117
- }
118
- return item;
119
- });
123
+ const key = (_a = params.key) != null ? _a : this.uuid();
124
+ const keyGeneration = (_b = this.generationByKey.get(key)) != null ? _b : this.generation++;
125
+ this.generationByKey.set(key, keyGeneration);
126
+ const nextMessage = __spreadProps(__spreadValues({}, params), {
127
+ key,
128
+ timerGeneration: this.timerGeneration++
129
+ });
130
+ const exists = this.messages.some((item) => item.key === key);
131
+ if (exists) {
132
+ this.messages = this.messages.map(
133
+ (item) => item.key === key ? nextMessage : item
134
+ );
120
135
  } else {
121
- this.messages.push(params);
136
+ this.messages = [...this.messages, nextMessage];
122
137
  }
123
138
  this.render();
139
+ return () => {
140
+ if (this.generationByKey.get(key) === keyGeneration) {
141
+ this.destroy(key);
142
+ }
143
+ };
124
144
  }
125
- destroy(key) {
145
+ destroy(key, expectedTimerGeneration) {
146
+ var _a;
147
+ const target = this.messages.find((item) => item.key === key);
148
+ if (expectedTimerGeneration !== void 0 && (target == null ? void 0 : target.timerGeneration) !== expectedTimerGeneration) {
149
+ return;
150
+ }
151
+ if (!target) {
152
+ return;
153
+ }
154
+ this.generationByKey.delete(key);
126
155
  this.messages = this.messages.filter((item) => item.key !== key);
127
156
  this.render();
157
+ (_a = target.onClose) == null ? void 0 : _a.call(target);
128
158
  }
129
159
  open(params) {
130
- this.show(typeof params === "string" ? { content: params } : params);
160
+ return this.show(typeof params === "string" ? { content: params } : params);
131
161
  }
132
162
  info(params) {
133
- this.show(
163
+ return this.show(
134
164
  typeof params === "string" ? { status: "info", content: params } : __spreadProps(__spreadValues({}, params), { status: "info" })
135
165
  );
136
166
  }
137
167
  success(params) {
138
- this.show(
168
+ return this.show(
139
169
  typeof params === "string" ? { status: "success", content: params } : __spreadProps(__spreadValues({}, params), { status: "success" })
140
170
  );
141
171
  }
142
172
  warning(params) {
143
- this.show(
173
+ return this.show(
144
174
  typeof params === "string" ? { status: "warning", content: params } : __spreadProps(__spreadValues({}, params), { status: "warning" })
145
175
  );
146
176
  }
147
177
  error(params) {
148
- this.show(
178
+ return this.show(
149
179
  typeof params === "string" ? { status: "error", content: params } : __spreadProps(__spreadValues({}, params), { status: "error" })
150
180
  );
151
181
  }
152
182
  loading(params) {
153
- this.show(
183
+ return this.show(
154
184
  typeof params === "string" ? { status: "loading", content: params } : __spreadProps(__spreadValues({}, params), { status: "loading" })
155
185
  );
156
186
  }
@@ -1,5 +1,5 @@
1
1
  import { notice } from './wrapper';
2
- export type { NoticeConfig } from './interface';
2
+ export type { NoticeApi, NoticeClose, NoticeConfig, PlacementType, } from './interface';
3
3
  export * from './notice-provider';
4
4
  export { default as useNotice } from './use-notice';
5
5
  export default notice;
@@ -1,9 +1,7 @@
1
1
  /// <reference types="react" />
2
+ export type PlacementType = 'topLeft' | 'topRight' | 'bottomLeft' | 'bottomRight' | 'top' | 'bottom';
2
3
  export type NoticeConfig = {
3
- /**
4
- * test identifier
5
- */
6
- 'data-testid'?: string;
4
+ [dataAttribute: `data-${string}`]: string | number | boolean | undefined;
7
5
  /**
8
6
  * Custom prefix class name
9
7
  */
@@ -25,7 +23,7 @@ export type NoticeConfig = {
25
23
  */
26
24
  content: React.ReactNode;
27
25
  /**
28
- * Auto close time (ms), 0 means no auto close
26
+ * Auto close time (milliseconds), 0 means no auto close
29
27
  * @default 4500
30
28
  */
31
29
  duration?: number;
@@ -41,7 +39,7 @@ export type NoticeConfig = {
41
39
  * Display position
42
40
  * @default 'topRight'
43
41
  */
44
- placement?: 'topLeft' | 'topRight' | 'bottomLeft' | 'bottomRight' | 'top' | 'bottom';
42
+ placement?: PlacementType;
45
43
  /**
46
44
  * Whether to show progress bar
47
45
  */
@@ -64,15 +62,27 @@ export type NoticeConfig = {
64
62
  */
65
63
  closable?: boolean;
66
64
  };
65
+ export type NoticeClose = () => void;
66
+ export interface NoticeApi {
67
+ open: (config: string | NoticeConfig) => NoticeClose;
68
+ info: (config: string | NoticeConfig) => NoticeClose;
69
+ success: (config: string | NoticeConfig) => NoticeClose;
70
+ warning: (config: string | NoticeConfig) => NoticeClose;
71
+ error: (config: string | NoticeConfig) => NoticeClose;
72
+ destroy: (key: string | number) => void;
73
+ clear: (placement?: PlacementType) => void;
74
+ }
67
75
  export type WrapperedNoticeConfig = NoticeConfig & {
68
76
  status?: 'info' | 'success' | 'warning' | 'error';
69
77
  };
70
78
  export type NoticeType = WrapperedNoticeConfig & {
71
79
  key: string | number;
80
+ placement: PlacementType;
81
+ timerGeneration: number;
72
82
  };
73
83
  export interface NoticeProps extends NoticeType {
74
84
  /**
75
85
  * Destroy component callback
76
86
  */
77
- onDestroy?: (key: string | number) => void;
87
+ onDestroy?: (key: string | number, timerGeneration?: number) => void;
78
88
  }
@@ -1,9 +1,9 @@
1
1
  import React from 'react';
2
- import { NoticeProps } from './interface';
2
+ import type { NoticeProps, PlacementType } from './interface';
3
3
  import './style/index.less';
4
4
  declare const NoticeList: ({ items, placement, onDestroy, }: {
5
5
  items: NoticeProps[];
6
- placement?: "top" | "bottom" | "topLeft" | "topRight" | "bottomLeft" | "bottomRight" | undefined;
7
- onDestroy: (key: string | number) => void;
6
+ placement?: PlacementType | undefined;
7
+ onDestroy: (key: string | number, timerGeneration?: number) => void;
8
8
  }) => React.JSX.Element | null;
9
9
  export default NoticeList;
@@ -1,5 +1,6 @@
1
1
  import React from 'react';
2
+ import type { NoticeApi } from './interface';
2
3
  export declare function NoticeProvider({ children }: {
3
4
  children: React.ReactNode;
4
5
  }): React.JSX.Element;
5
- export declare function useGlobalNotice(): any;
6
+ export declare function useGlobalNotice(): NoticeApi;
@@ -35,7 +35,7 @@ __export(notice_provider_exports, {
35
35
  module.exports = __toCommonJS(notice_provider_exports);
36
36
  var import_react = __toESM(require("react"));
37
37
  var import_use_notice = __toESM(require("./use-notice"));
38
- var NoticeContext = (0, import_react.createContext)({});
38
+ var NoticeContext = (0, import_react.createContext)(void 0);
39
39
  function NoticeProvider({ children }) {
40
40
  const { noticeApi, noticeHolders } = (0, import_use_notice.default)();
41
41
  return /* @__PURE__ */ import_react.default.createElement(NoticeContext.Provider, { value: noticeApi }, noticeHolders, children);
@@ -66,16 +66,19 @@ var import_lucide_react = require("lucide-react");
66
66
  var import_react = __toESM(require("react"));
67
67
  var import_Progress = __toESM(require("../Progress"));
68
68
  var import_useCountdown = __toESM(require("../hooks/useCountdown"));
69
+ var import_Button = __toESM(require("../Button"));
69
70
  var icons = {
70
- info: /* @__PURE__ */ import_react.default.createElement(import_lucide_react.Info, { size: 20, strokeWidth: 2 }),
71
- success: /* @__PURE__ */ import_react.default.createElement(import_lucide_react.CircleCheck, { size: 20, strokeWidth: 2 }),
72
- warning: /* @__PURE__ */ import_react.default.createElement(import_lucide_react.CircleAlert, { size: 20, strokeWidth: 2 }),
73
- error: /* @__PURE__ */ import_react.default.createElement(import_lucide_react.CircleX, { size: 20, strokeWidth: 2 })
71
+ info: /* @__PURE__ */ import_react.default.createElement(import_lucide_react.Info, { size: 22, fill: "currentColor", stroke: "#FFF", strokeWidth: 2 }),
72
+ success: /* @__PURE__ */ import_react.default.createElement(import_lucide_react.CircleCheck, { size: 22, fill: "currentColor", stroke: "#FFF", strokeWidth: 2 }),
73
+ warning: /* @__PURE__ */ import_react.default.createElement(import_lucide_react.CircleAlert, { size: 22, fill: "currentColor", stroke: "#FFF", strokeWidth: 2 }),
74
+ error: /* @__PURE__ */ import_react.default.createElement(import_lucide_react.CircleX, { size: 22, fill: "currentColor", stroke: "#FFF", strokeWidth: 2 })
74
75
  };
75
76
  var Notice = (props) => {
76
77
  const _a = props, {
77
78
  prefixCls = "yee-notice",
78
79
  id: key,
80
+ timerGeneration,
81
+ placement,
79
82
  status,
80
83
  title,
81
84
  content,
@@ -93,6 +96,8 @@ var Notice = (props) => {
93
96
  } = _a, rest = __objRest(_a, [
94
97
  "prefixCls",
95
98
  "id",
99
+ "timerGeneration",
100
+ "placement",
96
101
  "status",
97
102
  "title",
98
103
  "content",
@@ -108,52 +113,90 @@ var Notice = (props) => {
108
113
  "onDestroy",
109
114
  "data-testid"
110
115
  ]);
111
- const { remaining, onPause, onResume } = (0, import_useCountdown.default)({
116
+ const isHoveredRef = import_react.default.useRef(false);
117
+ const { remaining, isPaused, onPause, onResume } = (0, import_useCountdown.default)({
112
118
  duration,
119
+ resetKey: timerGeneration,
113
120
  onComplete: () => {
114
- onDestroy == null ? void 0 : onDestroy(key);
115
- onClose == null ? void 0 : onClose();
121
+ onDestroy == null ? void 0 : onDestroy(key, timerGeneration);
116
122
  }
117
123
  });
118
- const handleClose = (e) => {
119
- e.stopPropagation();
120
- onDestroy == null ? void 0 : onDestroy(key);
121
- onClose == null ? void 0 : onClose();
124
+ import_react.default.useEffect(() => {
125
+ if (pauseOnHover && isHoveredRef.current && !isPaused) {
126
+ onPause();
127
+ } else if ((!pauseOnHover || !isHoveredRef.current) && isPaused) {
128
+ onResume();
129
+ }
130
+ }, [isPaused, onPause, onResume, pauseOnHover]);
131
+ const handleMouseEnter = () => {
132
+ isHoveredRef.current = true;
133
+ if (pauseOnHover) {
134
+ onPause();
135
+ }
136
+ };
137
+ const handleMouseLeave = () => {
138
+ isHoveredRef.current = false;
139
+ if (isPaused) {
140
+ onResume();
141
+ }
142
+ };
143
+ const handleClose = (event) => {
144
+ event.stopPropagation();
145
+ onDestroy == null ? void 0 : onDestroy(key, timerGeneration);
146
+ };
147
+ const handleKeyDown = (event) => {
148
+ if (!onClick || event.key !== "Enter" && event.key !== " ") {
149
+ return;
150
+ }
151
+ event.preventDefault();
152
+ onClick();
122
153
  };
123
154
  const renderIcon = () => {
124
155
  if (!icon && !status) {
125
156
  return null;
126
157
  }
127
- return /* @__PURE__ */ import_react.default.createElement("span", { className: `${prefixCls}-icon` }, icon ? icon : status ? icons[status] : null);
158
+ return /* @__PURE__ */ import_react.default.createElement("span", { "aria-hidden": "true", className: `${prefixCls}-icon` }, icon ? icon : status ? icons[status] : null);
128
159
  };
129
160
  const renderCloseButton = () => {
130
161
  if (!closable) {
131
162
  return null;
132
163
  }
133
164
  return /* @__PURE__ */ import_react.default.createElement(
134
- "button",
165
+ import_Button.default,
135
166
  {
167
+ variant: "text",
168
+ size: "small",
136
169
  className: `${prefixCls}-close`,
137
170
  onClick: handleClose,
138
- type: "button",
139
- "aria-label": "Close"
140
- },
141
- /* @__PURE__ */ import_react.default.createElement(import_lucide_react.X, { size: 14, strokeWidth: 2 })
171
+ "aria-label": "Close notice",
172
+ icon: /* @__PURE__ */ import_react.default.createElement(import_lucide_react.X, { "aria-hidden": "true", size: 14, strokeWidth: 2 })
173
+ }
142
174
  );
143
175
  };
176
+ const isAssertive = status === "error" || status === "warning";
144
177
  return /* @__PURE__ */ import_react.default.createElement(
145
178
  "div",
146
179
  __spreadProps(__spreadValues({}, rest), {
180
+ "aria-atomic": "true",
181
+ "aria-live": isAssertive ? "assertive" : "polite",
182
+ role: onClick ? "button" : isAssertive ? "alert" : "status",
183
+ tabIndex: onClick ? 0 : void 0,
184
+ "data-placement": placement,
147
185
  "data-testid": dataTestId,
148
186
  className: (0, import_clsx.default)(
149
187
  prefixCls,
150
- { [`${prefixCls}-${status}`]: status },
188
+ {
189
+ [`${prefixCls}-${status}`]: status,
190
+ [`${prefixCls}-clickable`]: onClick,
191
+ [`${prefixCls}-closable`]: closable
192
+ },
151
193
  className
152
194
  ),
153
195
  style,
154
196
  onClick,
155
- onMouseEnter: pauseOnHover ? onPause : void 0,
156
- onMouseLeave: pauseOnHover ? onResume : void 0
197
+ onKeyDown: handleKeyDown,
198
+ onMouseEnter: handleMouseEnter,
199
+ onMouseLeave: handleMouseLeave
157
200
  }),
158
201
  /* @__PURE__ */ import_react.default.createElement("div", { className: `${prefixCls}-content-wrapper` }, renderIcon(), /* @__PURE__ */ import_react.default.createElement("div", { className: `${prefixCls}-content` }, title && /* @__PURE__ */ import_react.default.createElement("div", { className: `${prefixCls}-title` }, title), /* @__PURE__ */ import_react.default.createElement("div", { className: `${prefixCls}-description` }, content))),
159
202
  showProgress && duration > 0 && remaining > 0 && /* @__PURE__ */ import_react.default.createElement(
@@ -12,7 +12,7 @@
12
12
  background-color: var(--yee-notice-bg-color);
13
13
  border-radius: var(--yee-notice-border-radius);
14
14
  box-shadow: var(--yee-notice-box-shadow);
15
- cursor: pointer;
15
+ cursor: default;
16
16
  transition: all 0.3s ease;
17
17
  border: var(--yee-notice-border-width) solid transparent;
18
18
  overflow: hidden;
@@ -21,6 +21,18 @@
21
21
  box-shadow: var(--yee-notice-box-shadow-hover);
22
22
  }
23
23
 
24
+ &-clickable {
25
+ cursor: pointer;
26
+ }
27
+
28
+ &-closable {
29
+ @{pls}-content-wrapper {
30
+ padding-right: calc(
31
+ var(--yee-notice-close-size) + var(--yee-notice-close-right)
32
+ );
33
+ }
34
+ }
35
+
24
36
  &-content-wrapper {
25
37
  display: flex;
26
38
  align-items: flex-start;
@@ -1,16 +1,7 @@
1
1
  import React from 'react';
2
- import { NoticeConfig } from './interface';
3
- type PlacementType = 'topLeft' | 'topRight' | 'bottomLeft' | 'bottomRight' | 'top' | 'bottom';
2
+ import { NoticeApi } from './interface';
4
3
  declare const useNotice: () => {
5
- noticeApi: {
6
- open: (props: string | NoticeConfig) => void;
7
- success: (props: string | NoticeConfig) => void;
8
- error: (props: string | NoticeConfig) => void;
9
- warning: (props: string | NoticeConfig) => void;
10
- info: (props: string | NoticeConfig) => void;
11
- destroy: (key: string | number) => void;
12
- clear: (placement?: PlacementType) => void;
13
- };
4
+ noticeApi: NoticeApi;
14
5
  noticeHolders: React.ReactPortal[];
15
6
  };
16
7
  export default useNotice;
@@ -52,85 +52,170 @@ module.exports = __toCommonJS(use_notice_exports);
52
52
  var import_react = __toESM(require("react"));
53
53
  var import_react_dom = require("react-dom");
54
54
  var import_notice_list = __toESM(require("./notice-list"));
55
+ var invokeOnClose = (notices) => {
56
+ const errors = [];
57
+ notices.forEach((notice) => {
58
+ var _a;
59
+ try {
60
+ (_a = notice.onClose) == null ? void 0 : _a.call(notice);
61
+ } catch (error) {
62
+ errors.push(error);
63
+ }
64
+ });
65
+ errors.forEach((error) => {
66
+ const reportError = globalThis.reportError;
67
+ if (reportError) {
68
+ reportError(error);
69
+ } else {
70
+ console.error(error);
71
+ }
72
+ });
73
+ };
55
74
  var useNotice = () => {
56
75
  const [noticesByPlacement, setNoticesByPlacement] = (0, import_react.useState)(/* @__PURE__ */ new Map());
57
- const count = (0, import_react.useRef)(0);
58
- const add = (0, import_react.useCallback)((props) => {
59
- const placement = props.placement || "topRight";
60
- const id = count.current++;
61
- setNoticesByPlacement((prev) => {
62
- const newMap = new Map(prev);
63
- const notices = newMap.get(placement) || [];
64
- newMap.set(placement, [...notices, __spreadValues({ key: id }, props)]);
65
- return newMap;
66
- });
76
+ const [portalContainer, setPortalContainer] = (0, import_react.useState)(
77
+ null
78
+ );
79
+ const noticesRef = (0, import_react.useRef)(/* @__PURE__ */ new Map());
80
+ const generationByKey = (0, import_react.useRef)(/* @__PURE__ */ new Map());
81
+ const generation = (0, import_react.useRef)(0);
82
+ const timerGeneration = (0, import_react.useRef)(0);
83
+ const autoKey = (0, import_react.useRef)(0);
84
+ (0, import_react.useEffect)(() => {
85
+ setPortalContainer(document.body);
67
86
  }, []);
68
- const onDestroy = (key, placement) => {
69
- setNoticesByPlacement((prev) => {
70
- const newMap = new Map(prev);
71
- const notices = newMap.get(placement) || [];
72
- const filtered = notices.filter((notice) => notice.key !== key);
73
- if (filtered.length === 0) {
74
- newMap.delete(placement);
75
- } else {
76
- newMap.set(placement, filtered);
77
- }
78
- return newMap;
79
- });
80
- };
81
- const noticeApi = {
82
- open: (props) => {
83
- add(
84
- typeof props === "string" ? { content: props, status: "info" } : __spreadValues({ status: "info" }, props)
85
- );
87
+ const updateNotices = (0, import_react.useCallback)(
88
+ (updater) => {
89
+ const nextNotices = updater(noticesRef.current);
90
+ noticesRef.current = nextNotices;
91
+ setNoticesByPlacement(nextNotices);
86
92
  },
87
- success: (props) => {
88
- add(
89
- typeof props === "string" ? { content: props, status: "success" } : __spreadProps(__spreadValues({}, props), { status: "success" })
90
- );
91
- },
92
- error: (props) => {
93
- add(
94
- typeof props === "string" ? { content: props, status: "error" } : __spreadProps(__spreadValues({}, props), { status: "error" })
95
- );
96
- },
97
- warning: (props) => {
98
- add(
99
- typeof props === "string" ? { content: props, status: "warning" } : __spreadProps(__spreadValues({}, props), { status: "warning" })
100
- );
101
- },
102
- info: (props) => {
103
- add(
104
- typeof props === "string" ? { content: props, status: "info" } : __spreadProps(__spreadValues({}, props), { status: "info" })
105
- );
106
- },
107
- destroy: (key) => {
108
- setNoticesByPlacement((prev) => {
109
- const newMap = new Map(prev);
110
- newMap.forEach((notices, placement) => {
111
- const filtered = notices.filter((notice) => notice.key !== key);
93
+ []
94
+ );
95
+ const onDestroy = (0, import_react.useCallback)(
96
+ (key, expectedTimerGeneration) => {
97
+ var _a;
98
+ let target;
99
+ noticesRef.current.forEach((items) => {
100
+ target != null ? target : target = items.find((item) => item.key === key);
101
+ });
102
+ if (!target || expectedTimerGeneration !== void 0 && target.timerGeneration !== expectedTimerGeneration) {
103
+ return;
104
+ }
105
+ generationByKey.current.delete(key);
106
+ updateNotices((current) => {
107
+ const next = new Map(current);
108
+ next.forEach((items, placement) => {
109
+ const filtered = items.filter((item) => item.key !== key);
112
110
  if (filtered.length === 0) {
113
- newMap.delete(placement);
114
- } else if (filtered.length !== notices.length) {
115
- newMap.set(placement, filtered);
111
+ next.delete(placement);
112
+ } else if (filtered.length !== items.length) {
113
+ next.set(placement, filtered);
116
114
  }
117
115
  });
118
- return newMap;
116
+ return next;
119
117
  });
118
+ (_a = target.onClose) == null ? void 0 : _a.call(target);
120
119
  },
121
- clear: (placement) => {
122
- if (placement) {
123
- setNoticesByPlacement((prev) => {
124
- const newMap = new Map(prev);
125
- newMap.delete(placement);
126
- return newMap;
127
- });
128
- } else {
129
- setNoticesByPlacement(/* @__PURE__ */ new Map());
120
+ [updateNotices]
121
+ );
122
+ const add = (0, import_react.useCallback)(
123
+ (props) => {
124
+ var _a, _b;
125
+ const placement = (_a = props.placement) != null ? _a : "topRight";
126
+ let key = props.key;
127
+ if (key === void 0 || key === null) {
128
+ do {
129
+ key = `__yee_notice_auto_${autoKey.current++}`;
130
+ } while (generationByKey.current.has(key));
130
131
  }
132
+ const keyGeneration = (_b = generationByKey.current.get(key)) != null ? _b : generation.current++;
133
+ generationByKey.current.set(key, keyGeneration);
134
+ const nextNotice = __spreadProps(__spreadValues({}, props), {
135
+ key,
136
+ placement,
137
+ timerGeneration: timerGeneration.current++
138
+ });
139
+ updateNotices((current) => {
140
+ const next = new Map(current);
141
+ let existingIndex = -1;
142
+ next.forEach((items, currentPlacement) => {
143
+ const index = items.findIndex((item) => item.key === key);
144
+ if (index < 0) {
145
+ return;
146
+ }
147
+ if (currentPlacement === placement) {
148
+ existingIndex = index;
149
+ } else {
150
+ const filtered = items.filter((item) => item.key !== key);
151
+ if (filtered.length === 0) {
152
+ next.delete(currentPlacement);
153
+ } else {
154
+ next.set(currentPlacement, filtered);
155
+ }
156
+ }
157
+ });
158
+ const targetNotices = (next.get(placement) || []).filter(
159
+ (item) => item.key !== key
160
+ );
161
+ if (existingIndex >= 0) {
162
+ targetNotices.splice(existingIndex, 0, nextNotice);
163
+ } else {
164
+ targetNotices.push(nextNotice);
165
+ }
166
+ next.set(placement, targetNotices);
167
+ return next;
168
+ });
169
+ return () => {
170
+ if (generationByKey.current.get(key) === keyGeneration) {
171
+ onDestroy(key);
172
+ }
173
+ };
174
+ },
175
+ [onDestroy, updateNotices]
176
+ );
177
+ const clear = (0, import_react.useCallback)(
178
+ (placement) => {
179
+ const removed = placement ? noticesRef.current.get(placement) || [] : Array.from(noticesRef.current.values()).flat();
180
+ removed.forEach((item) => generationByKey.current.delete(item.key));
181
+ updateNotices((current) => {
182
+ if (!placement) {
183
+ return /* @__PURE__ */ new Map();
184
+ }
185
+ const next = new Map(current);
186
+ next.delete(placement);
187
+ return next;
188
+ });
189
+ invokeOnClose(removed);
190
+ },
191
+ [updateNotices]
192
+ );
193
+ const noticeApi = (0, import_react.useMemo)(
194
+ () => ({
195
+ open: (props) => add(
196
+ typeof props === "string" ? { content: props, status: "info" } : __spreadValues({ status: "info" }, props)
197
+ ),
198
+ success: (props) => add(
199
+ typeof props === "string" ? { content: props, status: "success" } : __spreadProps(__spreadValues({}, props), { status: "success" })
200
+ ),
201
+ error: (props) => add(
202
+ typeof props === "string" ? { content: props, status: "error" } : __spreadProps(__spreadValues({}, props), { status: "error" })
203
+ ),
204
+ warning: (props) => add(
205
+ typeof props === "string" ? { content: props, status: "warning" } : __spreadProps(__spreadValues({}, props), { status: "warning" })
206
+ ),
207
+ info: (props) => add(
208
+ typeof props === "string" ? { content: props, status: "info" } : __spreadProps(__spreadValues({}, props), { status: "info" })
209
+ ),
210
+ destroy: onDestroy,
211
+ clear
212
+ }),
213
+ [add, clear, onDestroy]
214
+ );
215
+ const noticeHolders = (0, import_react.useMemo)(() => {
216
+ if (!portalContainer) {
217
+ return [];
131
218
  }
132
- };
133
- const noticeHolders = import_react.default.useMemo(() => {
134
219
  const holders = [];
135
220
  noticesByPlacement.forEach((notices, placement) => {
136
221
  holders.push(
@@ -140,16 +225,16 @@ var useNotice = () => {
140
225
  {
141
226
  items: notices,
142
227
  placement,
143
- onDestroy: (key) => onDestroy(key, placement)
228
+ onDestroy
144
229
  }
145
230
  ),
146
- document.body,
231
+ portalContainer,
147
232
  `notice-${placement}`
148
233
  )
149
234
  );
150
235
  });
151
236
  return holders;
152
- }, [noticesByPlacement]);
237
+ }, [noticesByPlacement, onDestroy, portalContainer]);
153
238
  return { noticeApi, noticeHolders };
154
239
  };
155
240
  var use_notice_default = useNotice;