@tiny-design/react 1.3.0 → 1.4.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 (41) hide show
  1. package/es/button/style/_index.scss +16 -11
  2. package/es/button/style/index.css +26 -5
  3. package/es/pop-confirm/style/_index.scss +4 -0
  4. package/es/pop-confirm/style/index.css +4 -0
  5. package/es/slider/style/_index.scss +1 -9
  6. package/es/slider/style/index.css +1 -6
  7. package/es/speed-dial/style/_index.scss +6 -7
  8. package/es/speed-dial/style/index.css +5 -5
  9. package/es/style/base.css +24 -3
  10. package/es/tag/style/_index.scss +24 -0
  11. package/es/tag/style/index.css +20 -0
  12. package/es/tag/types.d.ts +2 -1
  13. package/es/tag/types.js +7 -2
  14. package/es/tag/types.js.map +1 -1
  15. package/es/time-picker/style/_index.scss +13 -0
  16. package/es/time-picker/style/index.css +10 -0
  17. package/es/time-picker/time-panel.js +28 -28
  18. package/es/time-picker/time-panel.js.map +1 -1
  19. package/es/time-picker/time-picker.js +50 -29
  20. package/es/time-picker/time-picker.js.map +1 -1
  21. package/lib/button/style/_index.scss +16 -11
  22. package/lib/button/style/index.css +26 -5
  23. package/lib/pop-confirm/style/_index.scss +4 -0
  24. package/lib/pop-confirm/style/index.css +4 -0
  25. package/lib/slider/style/_index.scss +1 -9
  26. package/lib/slider/style/index.css +1 -6
  27. package/lib/speed-dial/style/_index.scss +6 -7
  28. package/lib/speed-dial/style/index.css +5 -5
  29. package/lib/style/base.css +24 -3
  30. package/lib/tag/style/_index.scss +24 -0
  31. package/lib/tag/style/index.css +20 -0
  32. package/lib/tag/types.d.ts +2 -1
  33. package/lib/tag/types.js +7 -2
  34. package/lib/tag/types.js.map +1 -1
  35. package/lib/time-picker/style/_index.scss +13 -0
  36. package/lib/time-picker/style/index.css +10 -0
  37. package/lib/time-picker/time-panel.js +28 -28
  38. package/lib/time-picker/time-panel.js.map +1 -1
  39. package/lib/time-picker/time-picker.js +50 -29
  40. package/lib/time-picker/time-picker.js.map +1 -1
  41. package/package.json +3 -3
@@ -88,6 +88,26 @@
88
88
  background: var(--ty-tag-purple-bg);
89
89
  border-color: var(--ty-tag-purple-border);
90
90
  }
91
+ .ty-tag_success {
92
+ color: var(--ty-color-success);
93
+ background: var(--ty-color-success-bg);
94
+ border-color: var(--ty-color-success-border);
95
+ }
96
+ .ty-tag_info {
97
+ color: var(--ty-color-info);
98
+ background: var(--ty-color-info-bg);
99
+ border-color: var(--ty-color-info-border);
100
+ }
101
+ .ty-tag_warning {
102
+ color: var(--ty-color-warning);
103
+ background: var(--ty-color-warning-bg);
104
+ border-color: var(--ty-color-warning-border);
105
+ }
106
+ .ty-tag_danger {
107
+ color: var(--ty-color-danger);
108
+ background: var(--ty-color-danger-bg);
109
+ border-color: var(--ty-color-danger-border);
110
+ }
91
111
 
92
112
  .ty-checkable-tag {
93
113
  background-color: var(--ty-tag-checkable-bg);
@@ -8,8 +8,9 @@ interface CheckableTagProps extends BaseProps {
8
8
  onChange?: (checked: boolean, e: React.MouseEvent) => void;
9
9
  children?: React.ReactNode;
10
10
  }
11
+ type StatusColor = 'success' | 'warning' | 'info' | 'danger';
11
12
  interface TagProps extends BaseProps, React.PropsWithoutRef<JSX.IntrinsicElements['div']> {
12
- color?: string;
13
+ color?: string | StatusColor;
13
14
  closable?: boolean;
14
15
  onClose?: React.MouseEventHandler;
15
16
  onClick?: React.MouseEventHandler;
package/lib/tag/types.js CHANGED
@@ -1,4 +1,3 @@
1
- //#region src/tag/types.ts
2
1
  const PresetColors = [
3
2
  "magenta",
4
3
  "red",
@@ -10,7 +9,13 @@ const PresetColors = [
10
9
  "cyan",
11
10
  "blue",
12
11
  "geekblue",
13
- "purple"
12
+ "purple",
13
+ ...[
14
+ "success",
15
+ "info",
16
+ "warning",
17
+ "danger"
18
+ ]
14
19
  ];
15
20
  //#endregion
16
21
  exports.PresetColors = PresetColors;
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","names":[],"sources":["../../src/tag/types.ts"],"sourcesContent":["import React from 'react';\nimport { BaseProps } from '../_utils/props';\n\nexport interface CheckableTagProps extends BaseProps {\n defaultChecked?: boolean;\n checked?: boolean;\n onChange?: (checked: boolean, e: React.MouseEvent) => void;\n children?: React.ReactNode;\n}\n\nexport const PresetColors = [\n 'magenta',\n 'red',\n 'volcano',\n 'orange',\n 'gold',\n 'lime',\n 'green',\n 'cyan',\n 'blue',\n 'geekblue',\n 'purple',\n];\n\nexport interface TagProps extends BaseProps, React.PropsWithoutRef<JSX.IntrinsicElements['div']> {\n color?: string;\n closable?: boolean;\n onClose?: React.MouseEventHandler;\n onClick?: React.MouseEventHandler;\n defaultVisible?: boolean;\n visible?: boolean;\n children?: React.ReactNode;\n}\n"],"mappings":";AAUA,MAAa,eAAe;CAC1B;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACD"}
1
+ {"version":3,"file":"types.js","names":[],"sources":["../../src/tag/types.ts"],"sourcesContent":["import React from 'react';\nimport { BaseProps } from '../_utils/props';\n\nexport interface CheckableTagProps extends BaseProps {\n defaultChecked?: boolean;\n checked?: boolean;\n onChange?: (checked: boolean, e: React.MouseEvent) => void;\n children?: React.ReactNode;\n}\n\nexport type StatusColor = 'success' | 'warning' | 'info' | 'danger';\n\nexport const StatusColors: StatusColor[] = ['success', 'info', 'warning', 'danger'];\n\nexport const PresetColors = [\n 'magenta',\n 'red',\n 'volcano',\n 'orange',\n 'gold',\n 'lime',\n 'green',\n 'cyan',\n 'blue',\n 'geekblue',\n 'purple',\n ...StatusColors,\n];\n\nexport interface TagProps extends BaseProps, React.PropsWithoutRef<JSX.IntrinsicElements['div']> {\n color?: string | StatusColor;\n closable?: boolean;\n onClose?: React.MouseEventHandler;\n onClick?: React.MouseEventHandler;\n defaultVisible?: boolean;\n visible?: boolean;\n children?: React.ReactNode;\n}\n"],"mappings":"AAcA,MAAa,eAAe;CAC1B;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA,GAdyC;EAAC;EAAW;EAAQ;EAAW;EAAS;CAelF"}
@@ -29,6 +29,10 @@ $tp: #{$prefix}-time-picker;
29
29
  box-shadow: var(--ty-input-focus-shadow);
30
30
  }
31
31
 
32
+ &_pending &__input-field {
33
+ color: var(--ty-color-text-tertiary);
34
+ }
35
+
32
36
  &__input-field {
33
37
  flex: 1;
34
38
  border: none;
@@ -191,6 +195,15 @@ $tp: #{$prefix}-time-picker;
191
195
  }
192
196
  }
193
197
 
198
+ &_pending {
199
+ background: var(--ty-color-primary-bg);
200
+ color: var(--ty-color-text-tertiary);
201
+
202
+ &:hover {
203
+ background: var(--ty-color-primary-bg-hover);
204
+ }
205
+ }
206
+
194
207
  &_disabled {
195
208
  color: var(--ty-color-text-quaternary);
196
209
  cursor: not-allowed;
@@ -21,6 +21,9 @@
21
21
  border-color: var(--ty-color-primary);
22
22
  box-shadow: var(--ty-input-focus-shadow);
23
23
  }
24
+ .ty-time-picker_pending .ty-time-picker__input-field {
25
+ color: var(--ty-color-text-tertiary);
26
+ }
24
27
  .ty-time-picker__input-field {
25
28
  flex: 1;
26
29
  border: none;
@@ -157,6 +160,13 @@
157
160
  .ty-time-picker__cell_selected:hover {
158
161
  background: var(--ty-color-primary-bg-hover);
159
162
  }
163
+ .ty-time-picker__cell_pending {
164
+ background: var(--ty-color-primary-bg);
165
+ color: var(--ty-color-text-tertiary);
166
+ }
167
+ .ty-time-picker__cell_pending:hover {
168
+ background: var(--ty-color-primary-bg-hover);
169
+ }
160
170
  .ty-time-picker__cell_disabled {
161
171
  color: var(--ty-color-text-quaternary);
162
172
  cursor: not-allowed;
@@ -6,14 +6,16 @@ let react_jsx_runtime = require("react/jsx-runtime");
6
6
  //#region src/time-picker/time-panel.tsx
7
7
  const ITEM_HEIGHT = 28;
8
8
  const TimePanel = (props) => {
9
- const { prefixCls, value, items, disabledItems = [], loop = false, onChange } = props;
9
+ const { prefixCls, value, pendingValue, items, disabledItems = [], loop = false, onChange } = props;
10
10
  const panelRef = (0, react.useRef)(null);
11
11
  const itemRefs = (0, react.useRef)(/* @__PURE__ */ new Map());
12
12
  const isResetting = (0, react.useRef)(false);
13
13
  const clickedRef = (0, react.useRef)(false);
14
14
  const scrollToItemRef = (0, react.useRef)(null);
15
15
  const oneGroupHeight = items.length * ITEM_HEIGHT;
16
+ const displayValue = pendingValue ?? value;
16
17
  scrollToItemRef.current = (val) => {
18
+ if (val === null) return;
17
19
  const panel = panelRef.current;
18
20
  if (!panel) return;
19
21
  if (loop) {
@@ -41,8 +43,8 @@ const TimePanel = (props) => {
41
43
  clickedRef.current = false;
42
44
  return;
43
45
  }
44
- scrollToItemRef.current?.(value);
45
- }, [value]);
46
+ scrollToItemRef.current?.(displayValue);
47
+ }, [displayValue]);
46
48
  const handleScroll = (0, react.useCallback)(() => {
47
49
  if (!loop || isResetting.current) return;
48
50
  const panel = panelRef.current;
@@ -64,6 +66,16 @@ const TimePanel = (props) => {
64
66
  clickedRef.current = true;
65
67
  onChange(num);
66
68
  };
69
+ const isPending = pendingValue !== null;
70
+ const isCommitted = value !== null && pendingValue === null;
71
+ const cellCls = (num) => {
72
+ const isSelected = num === displayValue;
73
+ return (0, classnames.default)(`${prefixCls}__cell`, {
74
+ [`${prefixCls}__cell_selected`]: isSelected && isCommitted,
75
+ [`${prefixCls}__cell_pending`]: isSelected && isPending,
76
+ [`${prefixCls}__cell_disabled`]: disabledItems.includes(num)
77
+ });
78
+ };
67
79
  if (loop) return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
68
80
  className: `${prefixCls}__column`,
69
81
  ref: panelRef,
@@ -74,17 +86,11 @@ const TimePanel = (props) => {
74
86
  0,
75
87
  1,
76
88
  2
77
- ].map((copyIdx) => items.map((num, i) => {
78
- const isDisabled = disabledItems.includes(num);
79
- return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("li", {
80
- className: (0, classnames.default)(`${prefixCls}__cell`, {
81
- [`${prefixCls}__cell_selected`]: num === value,
82
- [`${prefixCls}__cell_disabled`]: isDisabled
83
- }),
84
- onClick: () => handleClick(num),
85
- children: String(num).padStart(2, "0")
86
- }, `c${copyIdx}-${i}`);
87
- }))
89
+ ].map((copyIdx) => items.map((num, i) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)("li", {
90
+ className: cellCls(num),
91
+ onClick: () => handleClick(num),
92
+ children: String(num).padStart(2, "0")
93
+ }, `c${copyIdx}-${i}`)))
88
94
  })
89
95
  });
90
96
  return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
@@ -92,20 +98,14 @@ const TimePanel = (props) => {
92
98
  ref: panelRef,
93
99
  children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("ul", {
94
100
  className: `${prefixCls}__column-list`,
95
- children: items.map((num) => {
96
- const isDisabled = disabledItems.includes(num);
97
- return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("li", {
98
- ref: (el) => {
99
- if (el) itemRefs.current.set(num, el);
100
- },
101
- className: (0, classnames.default)(`${prefixCls}__cell`, {
102
- [`${prefixCls}__cell_selected`]: num === value,
103
- [`${prefixCls}__cell_disabled`]: isDisabled
104
- }),
105
- onClick: () => handleClick(num),
106
- children: String(num).padStart(2, "0")
107
- }, num);
108
- })
101
+ children: items.map((num) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)("li", {
102
+ ref: (el) => {
103
+ if (el) itemRefs.current.set(num, el);
104
+ },
105
+ className: cellCls(num),
106
+ onClick: () => handleClick(num),
107
+ children: String(num).padStart(2, "0")
108
+ }, num))
109
109
  })
110
110
  });
111
111
  };
@@ -1 +1 @@
1
- {"version":3,"file":"time-panel.js","names":[],"sources":["../../src/time-picker/time-panel.tsx"],"sourcesContent":["import { useRef, useEffect, useCallback } from 'react';\nimport classNames from 'classnames';\n\nexport interface TimePanelProps {\n value: number;\n items: number[];\n disabledItems?: number[];\n loop?: boolean;\n onChange: (num: number) => void;\n prefixCls: string;\n}\n\nconst ITEM_HEIGHT = 28; // 4px padding-top + 20px line-height + 4px padding-bottom\n\nconst TimePanel = (props: TimePanelProps): React.ReactElement => {\n const { prefixCls, value, items, disabledItems = [], loop = false, onChange } = props;\n const panelRef = useRef<HTMLDivElement>(null);\n const itemRefs = useRef<Map<number, HTMLLIElement>>(new Map());\n const isResetting = useRef(false);\n const clickedRef = useRef(false);\n const scrollToItemRef = useRef<((val: number) => void) | null>(null);\n\n const oneGroupHeight = items.length * ITEM_HEIGHT;\n\n scrollToItemRef.current = (val: number) => {\n const panel = panelRef.current;\n if (!panel) return;\n\n if (loop) {\n const idx = items.indexOf(val);\n if (idx === -1) return;\n const top = oneGroupHeight + idx * ITEM_HEIGHT;\n isResetting.current = true;\n panel.scrollTo({ top, behavior: 'auto' });\n requestAnimationFrame(() => { isResetting.current = false; });\n } else {\n const el = itemRefs.current.get(val);\n if (el) {\n panel.scrollTo({ top: el.offsetTop, behavior: 'auto' });\n }\n }\n };\n\n useEffect(() => {\n if (clickedRef.current) {\n clickedRef.current = false;\n return;\n }\n scrollToItemRef.current?.(value);\n }, [value]);\n\n // Scroll reset for loop mode\n const handleScroll = useCallback(() => {\n if (!loop || isResetting.current) return;\n const panel = panelRef.current;\n if (!panel) return;\n\n const st = panel.scrollTop;\n if (st < oneGroupHeight || st >= 2 * oneGroupHeight) {\n isResetting.current = true;\n panel.scrollTo({ top: (st % oneGroupHeight) + oneGroupHeight, behavior: 'auto' });\n requestAnimationFrame(() => { isResetting.current = false; });\n }\n }, [loop, oneGroupHeight]);\n\n const handleClick = (num: number) => {\n if (disabledItems.includes(num)) return;\n clickedRef.current = true;\n onChange(num);\n };\n\n if (loop) {\n const copies = [0, 1, 2];\n return (\n <div className={`${prefixCls}__column`} ref={panelRef} onScroll={handleScroll}>\n <ul className={`${prefixCls}__column-list`}>\n {copies.map((copyIdx) =>\n items.map((num, i) => {\n const isDisabled = disabledItems.includes(num);\n const cls = classNames(`${prefixCls}__cell`, {\n [`${prefixCls}__cell_selected`]: num === value,\n [`${prefixCls}__cell_disabled`]: isDisabled,\n });\n return (\n <li\n key={`c${copyIdx}-${i}`}\n className={cls}\n onClick={() => handleClick(num)}>\n {String(num).padStart(2, '0')}\n </li>\n );\n })\n )}\n </ul>\n </div>\n );\n }\n\n return (\n <div className={`${prefixCls}__column`} ref={panelRef}>\n <ul className={`${prefixCls}__column-list`}>\n {items.map((num) => {\n const isDisabled = disabledItems.includes(num);\n const cls = classNames(`${prefixCls}__cell`, {\n [`${prefixCls}__cell_selected`]: num === value,\n [`${prefixCls}__cell_disabled`]: isDisabled,\n });\n return (\n <li\n key={num}\n ref={(el) => {\n if (el) itemRefs.current.set(num, el);\n }}\n className={cls}\n onClick={() => handleClick(num)}>\n {String(num).padStart(2, '0')}\n </li>\n );\n })}\n </ul>\n </div>\n );\n};\n\nexport default TimePanel;\n"],"mappings":"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"}
1
+ {"version":3,"file":"time-panel.js","names":[],"sources":["../../src/time-picker/time-panel.tsx"],"sourcesContent":["import { useRef, useEffect, useCallback } from 'react';\nimport classNames from 'classnames';\n\nexport interface TimePanelProps {\n value: number | null;\n pendingValue: number | null;\n items: number[];\n disabledItems?: number[];\n loop?: boolean;\n onChange: (num: number) => void;\n prefixCls: string;\n}\n\nconst ITEM_HEIGHT = 28; // 4px padding-top + 20px line-height + 4px padding-bottom\n\nconst TimePanel = (props: TimePanelProps): React.ReactElement => {\n const { prefixCls, value, pendingValue, items, disabledItems = [], loop = false, onChange } = props;\n const panelRef = useRef<HTMLDivElement>(null);\n const itemRefs = useRef<Map<number, HTMLLIElement>>(new Map());\n const isResetting = useRef(false);\n const clickedRef = useRef(false);\n const scrollToItemRef = useRef<((val: number | null) => void) | null>(null);\n\n const oneGroupHeight = items.length * ITEM_HEIGHT;\n\n // The displayed value: pending takes priority, then committed\n const displayValue = pendingValue ?? value;\n\n scrollToItemRef.current = (val: number | null) => {\n if (val === null) return;\n const panel = panelRef.current;\n if (!panel) return;\n\n if (loop) {\n const idx = items.indexOf(val);\n if (idx === -1) return;\n const top = oneGroupHeight + idx * ITEM_HEIGHT;\n isResetting.current = true;\n panel.scrollTo({ top, behavior: 'auto' });\n requestAnimationFrame(() => { isResetting.current = false; });\n } else {\n const el = itemRefs.current.get(val);\n if (el) {\n panel.scrollTo({ top: el.offsetTop, behavior: 'auto' });\n }\n }\n };\n\n useEffect(() => {\n if (clickedRef.current) {\n clickedRef.current = false;\n return;\n }\n scrollToItemRef.current?.(displayValue);\n }, [displayValue]);\n\n // Scroll reset for loop mode\n const handleScroll = useCallback(() => {\n if (!loop || isResetting.current) return;\n const panel = panelRef.current;\n if (!panel) return;\n\n const st = panel.scrollTop;\n if (st < oneGroupHeight || st >= 2 * oneGroupHeight) {\n isResetting.current = true;\n panel.scrollTo({ top: (st % oneGroupHeight) + oneGroupHeight, behavior: 'auto' });\n requestAnimationFrame(() => { isResetting.current = false; });\n }\n }, [loop, oneGroupHeight]);\n\n const handleClick = (num: number) => {\n if (disabledItems.includes(num)) return;\n clickedRef.current = true;\n onChange(num);\n };\n\n const isPending = pendingValue !== null;\n const isCommitted = value !== null && pendingValue === null;\n\n const cellCls = (num: number) => {\n const isSelected = num === displayValue;\n return classNames(`${prefixCls}__cell`, {\n [`${prefixCls}__cell_selected`]: isSelected && isCommitted,\n [`${prefixCls}__cell_pending`]: isSelected && isPending,\n [`${prefixCls}__cell_disabled`]: disabledItems.includes(num),\n });\n };\n\n if (loop) {\n const copies = [0, 1, 2];\n return (\n <div className={`${prefixCls}__column`} ref={panelRef} onScroll={handleScroll}>\n <ul className={`${prefixCls}__column-list`}>\n {copies.map((copyIdx) =>\n items.map((num, i) => (\n <li\n key={`c${copyIdx}-${i}`}\n className={cellCls(num)}\n onClick={() => handleClick(num)}>\n {String(num).padStart(2, '0')}\n </li>\n ))\n )}\n </ul>\n </div>\n );\n }\n\n return (\n <div className={`${prefixCls}__column`} ref={panelRef}>\n <ul className={`${prefixCls}__column-list`}>\n {items.map((num) => (\n <li\n key={num}\n ref={(el) => {\n if (el) itemRefs.current.set(num, el);\n }}\n className={cellCls(num)}\n onClick={() => handleClick(num)}>\n {String(num).padStart(2, '0')}\n </li>\n ))}\n </ul>\n </div>\n );\n};\n\nexport default TimePanel;\n"],"mappings":"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"}
@@ -10,6 +10,11 @@ let classnames = require("classnames");
10
10
  classnames = require_runtime.__toESM(classnames);
11
11
  let react_jsx_runtime = require("react/jsx-runtime");
12
12
  //#region src/time-picker/time-picker.tsx
13
+ const EMPTY_PENDING = {
14
+ h: null,
15
+ m: null,
16
+ s: null
17
+ };
13
18
  function formatTime(date, format, use12Hours) {
14
19
  let h = date.getHours();
15
20
  const m = String(date.getMinutes()).padStart(2, "0");
@@ -37,6 +42,7 @@ const TimePicker = (props) => {
37
42
  const { defaultValue, value, open: controlledOpen, format = "HH:mm:ss", use12Hours = false, hourStep = 1, minuteStep = 1, secondStep = 1, disabled = false, placeholder = locale.TimePicker.selectTime, allowClear = true, size = "md", inputReadOnly = true, disabledTime, hideDisabledOptions = false, loop = false, showNow = true, renderExtraFooter, suffixIcon, onChange, onOpenChange, className, style, prefixCls: customisedCls } = props;
38
43
  const prefixCls = require_general.getPrefixCls("time-picker", (0, react.useContext)(require_config_context.ConfigContext).prefixCls, customisedCls);
39
44
  const [date, setDate] = (0, react.useState)(value ?? defaultValue ?? null);
45
+ const [pending, setPending] = (0, react.useState)(EMPTY_PENDING);
40
46
  const [open, setOpen] = (0, react.useState)(false);
41
47
  const wrapperRef = (0, react.useRef)(null);
42
48
  const dropdownRef = (0, react.useRef)(null);
@@ -53,6 +59,7 @@ const TimePicker = (props) => {
53
59
  if (wrapperRef.current?.contains(target) || dropdownRef.current?.contains(target)) return;
54
60
  if (controlledOpen === void 0) setOpen(false);
55
61
  onOpenChange?.(false);
62
+ setPending(EMPTY_PENDING);
56
63
  };
57
64
  document.addEventListener("click", listener);
58
65
  return () => document.removeEventListener("click", listener);
@@ -60,43 +67,51 @@ const TimePicker = (props) => {
60
67
  const toggleOpen = (0, react.useCallback)((val) => {
61
68
  if (controlledOpen === void 0) setOpen(val);
62
69
  onOpenChange?.(val);
70
+ if (!val) setPending(EMPTY_PENDING);
63
71
  }, [controlledOpen, onOpenChange]);
64
- const updateTime = (0, react.useCallback)((type, num) => {
72
+ /** Build a Date from committed date + pending overrides */
73
+ const buildDate = (0, react.useCallback)((p) => {
65
74
  const base = date ? new Date(date) : new Date(0, 0, 0, 0, 0, 0, 0);
66
- if (type === "h") base.setHours(num);
67
- else if (type === "m") base.setMinutes(num);
68
- else base.setSeconds(num);
69
- if (value === void 0) setDate(base);
70
- onChange?.(base);
71
- }, [
72
- date,
73
- value,
74
- onChange
75
- ]);
75
+ if (p.h !== null) base.setHours(p.h);
76
+ if (p.m !== null) base.setMinutes(p.m);
77
+ if (p.s !== null) base.setSeconds(p.s);
78
+ return base;
79
+ }, [date]);
80
+ const updatePending = (0, react.useCallback)((type, num) => {
81
+ setPending((prev) => ({
82
+ ...prev,
83
+ [type]: num
84
+ }));
85
+ }, []);
86
+ const commit = (0, react.useCallback)((newDate) => {
87
+ if (value === void 0) setDate(newDate);
88
+ onChange?.(newDate);
89
+ setPending(EMPTY_PENDING);
90
+ }, [value, onChange]);
76
91
  const handleClear = (e) => {
77
92
  e.stopPropagation();
78
93
  if (value === void 0) setDate(null);
79
94
  onChange?.(null);
95
+ setPending(EMPTY_PENDING);
80
96
  toggleOpen(false);
81
97
  };
82
98
  const handleNow = () => {
83
- const now = /* @__PURE__ */ new Date();
84
- if (value === void 0) setDate(now);
85
- onChange?.(now);
99
+ commit(/* @__PURE__ */ new Date());
86
100
  toggleOpen(false);
87
101
  };
88
102
  const handleOk = () => {
103
+ if (pending.h !== null || pending.m !== null || pending.s !== null) commit(buildDate(pending));
89
104
  toggleOpen(false);
90
105
  };
106
+ const effectiveHour = pending.h ?? date?.getHours() ?? 0;
107
+ const effectiveMinute = pending.m ?? date?.getMinutes() ?? 0;
91
108
  const disabled12 = (0, react.useMemo)(() => disabledTime?.() ?? {}, [disabledTime]);
92
109
  const disabledHours = (0, react.useMemo)(() => disabled12.disabledHours?.() ?? [], [disabled12]);
93
- const currentHour = date?.getHours() ?? 0;
94
- const disabledMinutes = (0, react.useMemo)(() => disabled12.disabledMinutes?.(currentHour) ?? [], [disabled12, currentHour]);
95
- const currentMinute = date?.getMinutes() ?? 0;
96
- const disabledSeconds = (0, react.useMemo)(() => disabled12.disabledSeconds?.(currentHour, currentMinute) ?? [], [
110
+ const disabledMinutes = (0, react.useMemo)(() => disabled12.disabledMinutes?.(effectiveHour) ?? [], [disabled12, effectiveHour]);
111
+ const disabledSeconds = (0, react.useMemo)(() => disabled12.disabledSeconds?.(effectiveHour, effectiveMinute) ?? [], [
97
112
  disabled12,
98
- currentHour,
99
- currentMinute
113
+ effectiveHour,
114
+ effectiveMinute
100
115
  ]);
101
116
  const hours = generateSteps(24, hourStep);
102
117
  const minutes = generateSteps(60, minuteStep);
@@ -104,12 +119,15 @@ const TimePicker = (props) => {
104
119
  const filteredHours = hideDisabledOptions ? hours.filter((h) => !disabledHours.includes(h)) : hours;
105
120
  const filteredMinutes = hideDisabledOptions ? minutes.filter((m) => !disabledMinutes.includes(m)) : minutes;
106
121
  const filteredSeconds = hideDisabledOptions ? seconds.filter((s) => !disabledSeconds.includes(s)) : seconds;
107
- const hasValue = date !== null;
108
- const displayValue = hasValue ? formatTime(date, format, use12Hours) : "";
122
+ const hasPending = pending.h !== null || pending.m !== null || pending.s !== null;
123
+ const effectiveDate = (hasPending ? buildDate(pending) : null) ?? date;
124
+ const hasValue = effectiveDate !== null;
125
+ const displayValue = hasValue ? formatTime(effectiveDate, format, use12Hours) : "";
109
126
  const cls = (0, classnames.default)(prefixCls, className, `${prefixCls}_${size}`, {
110
127
  [`${prefixCls}_disabled`]: disabled,
111
128
  [`${prefixCls}_open`]: isOpen,
112
- [`${prefixCls}_has-value`]: hasValue
129
+ [`${prefixCls}_has-value`]: hasValue,
130
+ [`${prefixCls}_pending`]: hasPending
113
131
  });
114
132
  const renderOverlay = () => /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
115
133
  className: `${prefixCls}__dropdown`,
@@ -119,27 +137,30 @@ const TimePicker = (props) => {
119
137
  children: [
120
138
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_time_panel.default, {
121
139
  prefixCls,
122
- value: date?.getHours() ?? 0,
140
+ value: date?.getHours() ?? null,
141
+ pendingValue: pending.h,
123
142
  items: filteredHours,
124
143
  disabledItems: hideDisabledOptions ? [] : disabledHours,
125
144
  loop,
126
- onChange: (h) => updateTime("h", h)
145
+ onChange: (h) => updatePending("h", h)
127
146
  }),
128
147
  showsMinutes(format) && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_time_panel.default, {
129
148
  prefixCls,
130
- value: date?.getMinutes() ?? 0,
149
+ value: date?.getMinutes() ?? null,
150
+ pendingValue: pending.m,
131
151
  items: filteredMinutes,
132
152
  disabledItems: hideDisabledOptions ? [] : disabledMinutes,
133
153
  loop,
134
- onChange: (m) => updateTime("m", m)
154
+ onChange: (m) => updatePending("m", m)
135
155
  }),
136
156
  showsSeconds(format) && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_time_panel.default, {
137
157
  prefixCls,
138
- value: date?.getSeconds() ?? 0,
158
+ value: date?.getSeconds() ?? null,
159
+ pendingValue: pending.s,
139
160
  items: filteredSeconds,
140
161
  disabledItems: hideDisabledOptions ? [] : disabledSeconds,
141
162
  loop,
142
- onChange: (s) => updateTime("s", s)
163
+ onChange: (s) => updatePending("s", s)
143
164
  })
144
165
  ]
145
166
  }), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
@@ -1 +1 @@
1
- {"version":3,"file":"time-picker.js","names":["useLocale","getPrefixCls","ConfigContext","TimePanel","Popup","ClearIcon","ClockIcon"],"sources":["../../src/time-picker/time-picker.tsx"],"sourcesContent":["import { useEffect, useState, useRef, useCallback, useContext, useMemo } from 'react';\nimport classNames from 'classnames';\nimport { ConfigContext } from '../config-provider/config-context';\nimport { getPrefixCls } from '../_utils/general';\nimport { useLocale } from '../_utils/use-locale';\nimport { ClockIcon, ClearIcon } from '../_utils/components';\nimport Popup from '../popup';\nimport TimePanel from './time-panel';\nimport { TimePickerProps } from './types';\n\nfunction formatTime(date: Date, format: string, use12Hours: boolean): string {\n let h = date.getHours();\n const m = String(date.getMinutes()).padStart(2, '0');\n const s = String(date.getSeconds()).padStart(2, '0');\n let period = '';\n\n if (use12Hours) {\n period = h >= 12 ? ' PM' : ' AM';\n h = h % 12 || 12;\n }\n\n return format\n .replace('HH', String(h).padStart(2, '0'))\n .replace('H', String(h))\n .replace('mm', m)\n .replace('ss', s) + period;\n}\n\nfunction generateSteps(count: number, step: number): number[] {\n const items: number[] = [];\n for (let i = 0; i < count; i += step) {\n items.push(i);\n }\n return items;\n}\n\nfunction showsSeconds(format: string): boolean {\n return format.includes('ss') || format.includes('s');\n}\n\nfunction showsMinutes(format: string): boolean {\n return format.includes('mm') || format.includes('m');\n}\n\nconst TimePicker = (props: TimePickerProps): React.ReactElement => {\n const locale = useLocale();\n const {\n defaultValue,\n value,\n open: controlledOpen,\n format = 'HH:mm:ss',\n use12Hours = false,\n hourStep = 1,\n minuteStep = 1,\n secondStep = 1,\n disabled = false,\n placeholder = locale.TimePicker.selectTime,\n allowClear = true,\n size = 'md',\n inputReadOnly = true,\n disabledTime,\n hideDisabledOptions = false,\n loop = false,\n showNow = true,\n renderExtraFooter,\n suffixIcon,\n onChange,\n onOpenChange,\n className,\n style,\n prefixCls: customisedCls,\n } = props;\n\n const configContext = useContext(ConfigContext);\n const prefixCls = getPrefixCls('time-picker', configContext.prefixCls, customisedCls);\n\n const [date, setDate] = useState<Date | null>(value ?? defaultValue ?? null);\n const [open, setOpen] = useState(false);\n const wrapperRef = useRef<HTMLDivElement>(null);\n const dropdownRef = useRef<HTMLDivElement>(null);\n\n const isOpen = controlledOpen ?? open;\n\n // Controlled value\n useEffect(() => {\n if (value !== undefined) setDate(value);\n }, [value]);\n\n useEffect(() => {\n if (controlledOpen !== undefined) setOpen(controlledOpen);\n }, [controlledOpen]);\n\n useEffect(() => {\n const listener = (event: MouseEvent) => {\n const target = event.target as HTMLElement;\n if (wrapperRef.current?.contains(target) || dropdownRef.current?.contains(target)) return;\n if (controlledOpen === undefined) setOpen(false);\n onOpenChange?.(false);\n };\n document.addEventListener('click', listener);\n return () => document.removeEventListener('click', listener);\n }, [controlledOpen, onOpenChange]);\n\n const toggleOpen = useCallback((val: boolean) => {\n if (controlledOpen === undefined) setOpen(val);\n onOpenChange?.(val);\n }, [controlledOpen, onOpenChange]);\n\n const updateTime = useCallback((type: 'h' | 'm' | 's', num: number) => {\n const base = date ? new Date(date) : new Date(0, 0, 0, 0, 0, 0, 0);\n if (type === 'h') base.setHours(num);\n else if (type === 'm') base.setMinutes(num);\n else base.setSeconds(num);\n\n if (value === undefined) setDate(base);\n onChange?.(base);\n }, [date, value, onChange]);\n\n const handleClear = (e: React.MouseEvent) => {\n e.stopPropagation();\n if (value === undefined) setDate(null);\n onChange?.(null);\n toggleOpen(false);\n };\n\n const handleNow = () => {\n const now = new Date();\n if (value === undefined) setDate(now);\n onChange?.(now);\n toggleOpen(false);\n };\n\n const handleOk = () => {\n toggleOpen(false);\n };\n\n // Disabled time calculation\n const disabled12 = useMemo(() => disabledTime?.() ?? {}, [disabledTime]);\n const disabledHours = useMemo(() => disabled12.disabledHours?.() ?? [], [disabled12]);\n const currentHour = date?.getHours() ?? 0;\n const disabledMinutes = useMemo(\n () => disabled12.disabledMinutes?.(currentHour) ?? [],\n [disabled12, currentHour]\n );\n const currentMinute = date?.getMinutes() ?? 0;\n const disabledSeconds = useMemo(\n () => disabled12.disabledSeconds?.(currentHour, currentMinute) ?? [],\n [disabled12, currentHour, currentMinute]\n );\n\n const hours = generateSteps(24, hourStep);\n const minutes = generateSteps(60, minuteStep);\n const seconds = generateSteps(60, secondStep);\n\n const filteredHours = hideDisabledOptions ? hours.filter((h) => !disabledHours.includes(h)) : hours;\n const filteredMinutes = hideDisabledOptions ? minutes.filter((m) => !disabledMinutes.includes(m)) : minutes;\n const filteredSeconds = hideDisabledOptions ? seconds.filter((s) => !disabledSeconds.includes(s)) : seconds;\n\n const hasValue = date !== null;\n const displayValue = hasValue ? formatTime(date, format, use12Hours) : '';\n\n const cls = classNames(prefixCls, className, `${prefixCls}_${size}`, {\n [`${prefixCls}_disabled`]: disabled,\n [`${prefixCls}_open`]: isOpen,\n [`${prefixCls}_has-value`]: hasValue,\n });\n\n const renderOverlay = () => (\n <div className={`${prefixCls}__dropdown`} ref={dropdownRef}>\n <div className={`${prefixCls}__panel`}>\n <TimePanel\n prefixCls={prefixCls}\n value={date?.getHours() ?? 0}\n items={filteredHours}\n disabledItems={hideDisabledOptions ? [] : disabledHours}\n loop={loop}\n onChange={(h) => updateTime('h', h)}\n />\n {showsMinutes(format) && (\n <TimePanel\n prefixCls={prefixCls}\n value={date?.getMinutes() ?? 0}\n items={filteredMinutes}\n disabledItems={hideDisabledOptions ? [] : disabledMinutes}\n loop={loop}\n onChange={(m) => updateTime('m', m)}\n />\n )}\n {showsSeconds(format) && (\n <TimePanel\n prefixCls={prefixCls}\n value={date?.getSeconds() ?? 0}\n items={filteredSeconds}\n disabledItems={hideDisabledOptions ? [] : disabledSeconds}\n loop={loop}\n onChange={(s) => updateTime('s', s)}\n />\n )}\n </div>\n <div className={`${prefixCls}__footer`}>\n {renderExtraFooter && <div className={`${prefixCls}__extra-footer`}>{renderExtraFooter()}</div>}\n <div className={`${prefixCls}__footer-actions`}>\n {showNow && <a className={`${prefixCls}__now-btn`} onClick={handleNow}>{locale.TimePicker.now}</a>}\n <button type=\"button\" className={`${prefixCls}__ok-btn`} onClick={handleOk}>{locale.TimePicker.okText}</button>\n </div>\n </div>\n </div>\n );\n\n return (\n <div className={cls} style={style} ref={wrapperRef}>\n <Popup\n trigger=\"manual\"\n placement=\"bottom-start\"\n arrow={false}\n visible={isOpen}\n content={renderOverlay()}>\n <div\n className={`${prefixCls}__input`}\n onClick={() => !disabled && toggleOpen(!isOpen)}>\n <input\n className={`${prefixCls}__input-field`}\n readOnly={inputReadOnly}\n disabled={disabled}\n placeholder={placeholder}\n value={displayValue}\n aria-expanded={isOpen}\n aria-haspopup=\"dialog\"\n onKeyDown={(e) => {\n if (e.key === 'Escape' && isOpen) toggleOpen(false);\n }}\n />\n <span className={`${prefixCls}__suffix`}>\n {allowClear && hasValue && !disabled ? (\n <button type=\"button\" className={`${prefixCls}__clear`} onClick={handleClear} aria-label=\"Clear time\">\n <ClearIcon size=\"1em\" />\n </button>\n ) : null}\n <span className={`${prefixCls}__icon`}>\n {suffixIcon ?? <ClockIcon size=\"1em\" />}\n </span>\n </span>\n </div>\n </Popup>\n </div>\n );\n};\n\nTimePicker.displayName = 'TimePicker';\n\nexport default TimePicker;\n"],"mappings":"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"}
1
+ {"version":3,"file":"time-picker.js","names":["useLocale","getPrefixCls","ConfigContext","TimePanel","Popup","ClearIcon","ClockIcon"],"sources":["../../src/time-picker/time-picker.tsx"],"sourcesContent":["import { useEffect, useState, useRef, useCallback, useContext, useMemo } from 'react';\nimport classNames from 'classnames';\nimport { ConfigContext } from '../config-provider/config-context';\nimport { getPrefixCls } from '../_utils/general';\nimport { useLocale } from '../_utils/use-locale';\nimport { ClockIcon, ClearIcon } from '../_utils/components';\nimport Popup from '../popup';\nimport TimePanel from './time-panel';\nimport { TimePickerProps } from './types';\n\ninterface PendingTime {\n h: number | null;\n m: number | null;\n s: number | null;\n}\n\nconst EMPTY_PENDING: PendingTime = { h: null, m: null, s: null };\n\nfunction formatTime(date: Date, format: string, use12Hours: boolean): string {\n let h = date.getHours();\n const m = String(date.getMinutes()).padStart(2, '0');\n const s = String(date.getSeconds()).padStart(2, '0');\n let period = '';\n\n if (use12Hours) {\n period = h >= 12 ? ' PM' : ' AM';\n h = h % 12 || 12;\n }\n\n return format\n .replace('HH', String(h).padStart(2, '0'))\n .replace('H', String(h))\n .replace('mm', m)\n .replace('ss', s) + period;\n}\n\nfunction generateSteps(count: number, step: number): number[] {\n const items: number[] = [];\n for (let i = 0; i < count; i += step) {\n items.push(i);\n }\n return items;\n}\n\nfunction showsSeconds(format: string): boolean {\n return format.includes('ss') || format.includes('s');\n}\n\nfunction showsMinutes(format: string): boolean {\n return format.includes('mm') || format.includes('m');\n}\n\nconst TimePicker = (props: TimePickerProps): React.ReactElement => {\n const locale = useLocale();\n const {\n defaultValue,\n value,\n open: controlledOpen,\n format = 'HH:mm:ss',\n use12Hours = false,\n hourStep = 1,\n minuteStep = 1,\n secondStep = 1,\n disabled = false,\n placeholder = locale.TimePicker.selectTime,\n allowClear = true,\n size = 'md',\n inputReadOnly = true,\n disabledTime,\n hideDisabledOptions = false,\n loop = false,\n showNow = true,\n renderExtraFooter,\n suffixIcon,\n onChange,\n onOpenChange,\n className,\n style,\n prefixCls: customisedCls,\n } = props;\n\n const configContext = useContext(ConfigContext);\n const prefixCls = getPrefixCls('time-picker', configContext.prefixCls, customisedCls);\n\n const [date, setDate] = useState<Date | null>(value ?? defaultValue ?? null);\n const [pending, setPending] = useState<PendingTime>(EMPTY_PENDING);\n const [open, setOpen] = useState(false);\n const wrapperRef = useRef<HTMLDivElement>(null);\n const dropdownRef = useRef<HTMLDivElement>(null);\n\n const isOpen = controlledOpen ?? open;\n\n // Controlled value\n useEffect(() => {\n if (value !== undefined) setDate(value);\n }, [value]);\n\n useEffect(() => {\n if (controlledOpen !== undefined) setOpen(controlledOpen);\n }, [controlledOpen]);\n\n useEffect(() => {\n const listener = (event: MouseEvent) => {\n const target = event.target as HTMLElement;\n if (wrapperRef.current?.contains(target) || dropdownRef.current?.contains(target)) return;\n if (controlledOpen === undefined) setOpen(false);\n onOpenChange?.(false);\n setPending(EMPTY_PENDING);\n };\n document.addEventListener('click', listener);\n return () => document.removeEventListener('click', listener);\n }, [controlledOpen, onOpenChange]);\n\n const toggleOpen = useCallback((val: boolean) => {\n if (controlledOpen === undefined) setOpen(val);\n onOpenChange?.(val);\n if (!val) setPending(EMPTY_PENDING);\n }, [controlledOpen, onOpenChange]);\n\n /** Build a Date from committed date + pending overrides */\n const buildDate = useCallback((p: PendingTime): Date => {\n const base = date ? new Date(date) : new Date(0, 0, 0, 0, 0, 0, 0);\n if (p.h !== null) base.setHours(p.h);\n if (p.m !== null) base.setMinutes(p.m);\n if (p.s !== null) base.setSeconds(p.s);\n return base;\n }, [date]);\n\n const updatePending = useCallback((type: 'h' | 'm' | 's', num: number) => {\n setPending((prev) => ({ ...prev, [type]: num }));\n }, []);\n\n const commit = useCallback((newDate: Date) => {\n if (value === undefined) setDate(newDate);\n onChange?.(newDate);\n setPending(EMPTY_PENDING);\n }, [value, onChange]);\n\n const handleClear = (e: React.MouseEvent) => {\n e.stopPropagation();\n if (value === undefined) setDate(null);\n onChange?.(null);\n setPending(EMPTY_PENDING);\n toggleOpen(false);\n };\n\n const handleNow = () => {\n const now = new Date();\n commit(now);\n toggleOpen(false);\n };\n\n const handleOk = () => {\n if (pending.h !== null || pending.m !== null || pending.s !== null) {\n commit(buildDate(pending));\n }\n toggleOpen(false);\n };\n\n // Disabled time calculation — use pending values when available\n const effectiveHour = pending.h ?? date?.getHours() ?? 0;\n const effectiveMinute = pending.m ?? date?.getMinutes() ?? 0;\n\n const disabled12 = useMemo(() => disabledTime?.() ?? {}, [disabledTime]);\n const disabledHours = useMemo(() => disabled12.disabledHours?.() ?? [], [disabled12]);\n const disabledMinutes = useMemo(\n () => disabled12.disabledMinutes?.(effectiveHour) ?? [],\n [disabled12, effectiveHour]\n );\n const disabledSeconds = useMemo(\n () => disabled12.disabledSeconds?.(effectiveHour, effectiveMinute) ?? [],\n [disabled12, effectiveHour, effectiveMinute]\n );\n\n const hours = generateSteps(24, hourStep);\n const minutes = generateSteps(60, minuteStep);\n const seconds = generateSteps(60, secondStep);\n\n const filteredHours = hideDisabledOptions ? hours.filter((h) => !disabledHours.includes(h)) : hours;\n const filteredMinutes = hideDisabledOptions ? minutes.filter((m) => !disabledMinutes.includes(m)) : minutes;\n const filteredSeconds = hideDisabledOptions ? seconds.filter((s) => !disabledSeconds.includes(s)) : seconds;\n\n const hasPending = pending.h !== null || pending.m !== null || pending.s !== null;\n const previewDate = hasPending ? buildDate(pending) : null;\n const effectiveDate = previewDate ?? date;\n const hasValue = effectiveDate !== null;\n const displayValue = hasValue ? formatTime(effectiveDate, format, use12Hours) : '';\n\n const cls = classNames(prefixCls, className, `${prefixCls}_${size}`, {\n [`${prefixCls}_disabled`]: disabled,\n [`${prefixCls}_open`]: isOpen,\n [`${prefixCls}_has-value`]: hasValue,\n [`${prefixCls}_pending`]: hasPending,\n });\n\n const renderOverlay = () => (\n <div className={`${prefixCls}__dropdown`} ref={dropdownRef}>\n <div className={`${prefixCls}__panel`}>\n <TimePanel\n prefixCls={prefixCls}\n value={date?.getHours() ?? null}\n pendingValue={pending.h}\n items={filteredHours}\n disabledItems={hideDisabledOptions ? [] : disabledHours}\n loop={loop}\n onChange={(h) => updatePending('h', h)}\n />\n {showsMinutes(format) && (\n <TimePanel\n prefixCls={prefixCls}\n value={date?.getMinutes() ?? null}\n pendingValue={pending.m}\n items={filteredMinutes}\n disabledItems={hideDisabledOptions ? [] : disabledMinutes}\n loop={loop}\n onChange={(m) => updatePending('m', m)}\n />\n )}\n {showsSeconds(format) && (\n <TimePanel\n prefixCls={prefixCls}\n value={date?.getSeconds() ?? null}\n pendingValue={pending.s}\n items={filteredSeconds}\n disabledItems={hideDisabledOptions ? [] : disabledSeconds}\n loop={loop}\n onChange={(s) => updatePending('s', s)}\n />\n )}\n </div>\n <div className={`${prefixCls}__footer`}>\n {renderExtraFooter && <div className={`${prefixCls}__extra-footer`}>{renderExtraFooter()}</div>}\n <div className={`${prefixCls}__footer-actions`}>\n {showNow && <a className={`${prefixCls}__now-btn`} onClick={handleNow}>{locale.TimePicker.now}</a>}\n <button type=\"button\" className={`${prefixCls}__ok-btn`} onClick={handleOk}>{locale.TimePicker.okText}</button>\n </div>\n </div>\n </div>\n );\n\n return (\n <div className={cls} style={style} ref={wrapperRef}>\n <Popup\n trigger=\"manual\"\n placement=\"bottom-start\"\n arrow={false}\n visible={isOpen}\n content={renderOverlay()}>\n <div\n className={`${prefixCls}__input`}\n onClick={() => !disabled && toggleOpen(!isOpen)}>\n <input\n className={`${prefixCls}__input-field`}\n readOnly={inputReadOnly}\n disabled={disabled}\n placeholder={placeholder}\n value={displayValue}\n aria-expanded={isOpen}\n aria-haspopup=\"dialog\"\n onKeyDown={(e) => {\n if (e.key === 'Escape' && isOpen) toggleOpen(false);\n }}\n />\n <span className={`${prefixCls}__suffix`}>\n {allowClear && hasValue && !disabled ? (\n <button type=\"button\" className={`${prefixCls}__clear`} onClick={handleClear} aria-label=\"Clear time\">\n <ClearIcon size=\"1em\" />\n </button>\n ) : null}\n <span className={`${prefixCls}__icon`}>\n {suffixIcon ?? <ClockIcon size=\"1em\" />}\n </span>\n </span>\n </div>\n </Popup>\n </div>\n );\n};\n\nTimePicker.displayName = 'TimePicker';\n\nexport default TimePicker;\n"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tiny-design/react",
3
- "version": "1.3.0",
3
+ "version": "1.4.0",
4
4
  "description": "A friendly UI component set for React",
5
5
  "license": "MIT",
6
6
  "keywords": [
@@ -54,8 +54,8 @@
54
54
  "@popperjs/core": "^2.11.4",
55
55
  "classnames": "^2.3.1",
56
56
  "tslib": "^2.3.1",
57
- "@tiny-design/icons": "1.3.0",
58
- "@tiny-design/tokens": "1.3.0"
57
+ "@tiny-design/icons": "1.4.0",
58
+ "@tiny-design/tokens": "1.4.0"
59
59
  },
60
60
  "devDependencies": {
61
61
  "@testing-library/jest-dom": "^6.0.0",