@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
@@ -8,6 +8,11 @@ import { useCallback, useContext, useEffect, useMemo, useRef, useState } from "r
8
8
  import classNames from "classnames";
9
9
  import { jsx, jsxs } from "react/jsx-runtime";
10
10
  //#region src/time-picker/time-picker.tsx
11
+ const EMPTY_PENDING = {
12
+ h: null,
13
+ m: null,
14
+ s: null
15
+ };
11
16
  function formatTime(date, format, use12Hours) {
12
17
  let h = date.getHours();
13
18
  const m = String(date.getMinutes()).padStart(2, "0");
@@ -35,6 +40,7 @@ const TimePicker = (props) => {
35
40
  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;
36
41
  const prefixCls = getPrefixCls("time-picker", useContext(ConfigContext).prefixCls, customisedCls);
37
42
  const [date, setDate] = useState(value ?? defaultValue ?? null);
43
+ const [pending, setPending] = useState(EMPTY_PENDING);
38
44
  const [open, setOpen] = useState(false);
39
45
  const wrapperRef = useRef(null);
40
46
  const dropdownRef = useRef(null);
@@ -51,6 +57,7 @@ const TimePicker = (props) => {
51
57
  if (wrapperRef.current?.contains(target) || dropdownRef.current?.contains(target)) return;
52
58
  if (controlledOpen === void 0) setOpen(false);
53
59
  onOpenChange?.(false);
60
+ setPending(EMPTY_PENDING);
54
61
  };
55
62
  document.addEventListener("click", listener);
56
63
  return () => document.removeEventListener("click", listener);
@@ -58,43 +65,51 @@ const TimePicker = (props) => {
58
65
  const toggleOpen = useCallback((val) => {
59
66
  if (controlledOpen === void 0) setOpen(val);
60
67
  onOpenChange?.(val);
68
+ if (!val) setPending(EMPTY_PENDING);
61
69
  }, [controlledOpen, onOpenChange]);
62
- const updateTime = useCallback((type, num) => {
70
+ /** Build a Date from committed date + pending overrides */
71
+ const buildDate = useCallback((p) => {
63
72
  const base = date ? new Date(date) : new Date(0, 0, 0, 0, 0, 0, 0);
64
- if (type === "h") base.setHours(num);
65
- else if (type === "m") base.setMinutes(num);
66
- else base.setSeconds(num);
67
- if (value === void 0) setDate(base);
68
- onChange?.(base);
69
- }, [
70
- date,
71
- value,
72
- onChange
73
- ]);
73
+ if (p.h !== null) base.setHours(p.h);
74
+ if (p.m !== null) base.setMinutes(p.m);
75
+ if (p.s !== null) base.setSeconds(p.s);
76
+ return base;
77
+ }, [date]);
78
+ const updatePending = useCallback((type, num) => {
79
+ setPending((prev) => ({
80
+ ...prev,
81
+ [type]: num
82
+ }));
83
+ }, []);
84
+ const commit = useCallback((newDate) => {
85
+ if (value === void 0) setDate(newDate);
86
+ onChange?.(newDate);
87
+ setPending(EMPTY_PENDING);
88
+ }, [value, onChange]);
74
89
  const handleClear = (e) => {
75
90
  e.stopPropagation();
76
91
  if (value === void 0) setDate(null);
77
92
  onChange?.(null);
93
+ setPending(EMPTY_PENDING);
78
94
  toggleOpen(false);
79
95
  };
80
96
  const handleNow = () => {
81
- const now = /* @__PURE__ */ new Date();
82
- if (value === void 0) setDate(now);
83
- onChange?.(now);
97
+ commit(/* @__PURE__ */ new Date());
84
98
  toggleOpen(false);
85
99
  };
86
100
  const handleOk = () => {
101
+ if (pending.h !== null || pending.m !== null || pending.s !== null) commit(buildDate(pending));
87
102
  toggleOpen(false);
88
103
  };
104
+ const effectiveHour = pending.h ?? date?.getHours() ?? 0;
105
+ const effectiveMinute = pending.m ?? date?.getMinutes() ?? 0;
89
106
  const disabled12 = useMemo(() => disabledTime?.() ?? {}, [disabledTime]);
90
107
  const disabledHours = useMemo(() => disabled12.disabledHours?.() ?? [], [disabled12]);
91
- const currentHour = date?.getHours() ?? 0;
92
- const disabledMinutes = useMemo(() => disabled12.disabledMinutes?.(currentHour) ?? [], [disabled12, currentHour]);
93
- const currentMinute = date?.getMinutes() ?? 0;
94
- const disabledSeconds = useMemo(() => disabled12.disabledSeconds?.(currentHour, currentMinute) ?? [], [
108
+ const disabledMinutes = useMemo(() => disabled12.disabledMinutes?.(effectiveHour) ?? [], [disabled12, effectiveHour]);
109
+ const disabledSeconds = useMemo(() => disabled12.disabledSeconds?.(effectiveHour, effectiveMinute) ?? [], [
95
110
  disabled12,
96
- currentHour,
97
- currentMinute
111
+ effectiveHour,
112
+ effectiveMinute
98
113
  ]);
99
114
  const hours = generateSteps(24, hourStep);
100
115
  const minutes = generateSteps(60, minuteStep);
@@ -102,12 +117,15 @@ const TimePicker = (props) => {
102
117
  const filteredHours = hideDisabledOptions ? hours.filter((h) => !disabledHours.includes(h)) : hours;
103
118
  const filteredMinutes = hideDisabledOptions ? minutes.filter((m) => !disabledMinutes.includes(m)) : minutes;
104
119
  const filteredSeconds = hideDisabledOptions ? seconds.filter((s) => !disabledSeconds.includes(s)) : seconds;
105
- const hasValue = date !== null;
106
- const displayValue = hasValue ? formatTime(date, format, use12Hours) : "";
120
+ const hasPending = pending.h !== null || pending.m !== null || pending.s !== null;
121
+ const effectiveDate = (hasPending ? buildDate(pending) : null) ?? date;
122
+ const hasValue = effectiveDate !== null;
123
+ const displayValue = hasValue ? formatTime(effectiveDate, format, use12Hours) : "";
107
124
  const cls = classNames(prefixCls, className, `${prefixCls}_${size}`, {
108
125
  [`${prefixCls}_disabled`]: disabled,
109
126
  [`${prefixCls}_open`]: isOpen,
110
- [`${prefixCls}_has-value`]: hasValue
127
+ [`${prefixCls}_has-value`]: hasValue,
128
+ [`${prefixCls}_pending`]: hasPending
111
129
  });
112
130
  const renderOverlay = () => /* @__PURE__ */ jsxs("div", {
113
131
  className: `${prefixCls}__dropdown`,
@@ -117,27 +135,30 @@ const TimePicker = (props) => {
117
135
  children: [
118
136
  /* @__PURE__ */ jsx(TimePanel, {
119
137
  prefixCls,
120
- value: date?.getHours() ?? 0,
138
+ value: date?.getHours() ?? null,
139
+ pendingValue: pending.h,
121
140
  items: filteredHours,
122
141
  disabledItems: hideDisabledOptions ? [] : disabledHours,
123
142
  loop,
124
- onChange: (h) => updateTime("h", h)
143
+ onChange: (h) => updatePending("h", h)
125
144
  }),
126
145
  showsMinutes(format) && /* @__PURE__ */ jsx(TimePanel, {
127
146
  prefixCls,
128
- value: date?.getMinutes() ?? 0,
147
+ value: date?.getMinutes() ?? null,
148
+ pendingValue: pending.m,
129
149
  items: filteredMinutes,
130
150
  disabledItems: hideDisabledOptions ? [] : disabledMinutes,
131
151
  loop,
132
- onChange: (m) => updateTime("m", m)
152
+ onChange: (m) => updatePending("m", m)
133
153
  }),
134
154
  showsSeconds(format) && /* @__PURE__ */ jsx(TimePanel, {
135
155
  prefixCls,
136
- value: date?.getSeconds() ?? 0,
156
+ value: date?.getSeconds() ?? null,
157
+ pendingValue: pending.s,
137
158
  items: filteredSeconds,
138
159
  disabledItems: hideDisabledOptions ? [] : disabledSeconds,
139
160
  loop,
140
- onChange: (s) => updateTime("s", s)
161
+ onChange: (s) => updatePending("s", s)
141
162
  })
142
163
  ]
143
164
  }), /* @__PURE__ */ jsxs("div", {
@@ -1 +1 @@
1
- {"version":3,"file":"time-picker.js","names":["Popup"],"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":["Popup"],"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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"}
@@ -24,7 +24,7 @@ $btn-prefix: #{$prefix}-btn;
24
24
  line-height: $btn-line-height;
25
25
 
26
26
  &__loader {
27
- @include loader();
27
+ @include loader;
28
28
  }
29
29
 
30
30
  &__icon-container, &__loader {
@@ -91,19 +91,27 @@ $btn-prefix: #{$prefix}-btn;
91
91
  }
92
92
 
93
93
  &_info {
94
- @include button-style(#fff, var(--ty-color-info), var(--ty-color-info));
94
+ @include button-style(#fff, var(--ty-color-info), var(--ty-color-info),
95
+ var(--ty-color-info-hover), var(--ty-color-info-hover), #fff,
96
+ var(--ty-color-info-active), var(--ty-color-info-active), #fff);
95
97
  }
96
98
 
97
99
  &_success {
98
- @include button-style(#fff, var(--ty-color-success), var(--ty-color-success));
100
+ @include button-style(#fff, var(--ty-color-success), var(--ty-color-success),
101
+ var(--ty-color-success-hover), var(--ty-color-success-hover), #fff,
102
+ var(--ty-color-success-active), var(--ty-color-success-active), #fff);
99
103
  }
100
104
 
101
105
  &_warning {
102
- @include button-style(#fff, var(--ty-color-warning), var(--ty-color-warning));
106
+ @include button-style(#fff, var(--ty-color-warning), var(--ty-color-warning),
107
+ var(--ty-color-warning-hover), var(--ty-color-warning-hover), #fff,
108
+ var(--ty-color-warning-active), var(--ty-color-warning-active), #fff);
103
109
  }
104
110
 
105
111
  &_danger {
106
- @include button-style(#fff, var(--ty-color-danger), var(--ty-color-danger));
112
+ @include button-style(#fff, var(--ty-color-danger), var(--ty-color-danger),
113
+ var(--ty-color-danger-hover), var(--ty-color-danger-hover), #fff,
114
+ var(--ty-color-danger-active), var(--ty-color-danger-active), #fff);
107
115
  }
108
116
 
109
117
  // Sizes
@@ -135,13 +143,10 @@ $btn-prefix: #{$prefix}-btn;
135
143
  position: relative;
136
144
  pointer-events: none;
137
145
 
138
- &:before {
146
+ &::before {
139
147
  content: '';
140
148
  position: absolute;
141
- top: -1px;
142
- right: -1px;
143
- bottom: -1px;
144
- left: -1px;
149
+ inset: -1px;
145
150
  z-index: 1;
146
151
  display: block;
147
152
  background: var(--ty-btn-loading-bg);
@@ -208,7 +213,7 @@ $btn-prefix: #{$prefix}-btn;
208
213
  &_danger {
209
214
  .#{$btn-prefix} {
210
215
  &:not(:first-child) {
211
- border-left-color: rgba(255, 255, 255, 0.2);
216
+ border-left-color: rgb(255 255 255 / 20%);
212
217
  }
213
218
  }
214
219
  }
@@ -212,13 +212,19 @@
212
212
  }
213
213
  .ty-btn_info:hover {
214
214
  color: #fff;
215
+ background: var(--ty-color-info-hover);
216
+ border-color: var(--ty-color-info-hover);
215
217
  }
216
218
  .ty-btn_info:focus {
217
219
  color: #fff;
220
+ background: var(--ty-color-info-hover);
221
+ border-color: var(--ty-color-info-hover);
218
222
  z-index: 1;
219
223
  }
220
224
  .ty-btn_info:active {
221
225
  color: #fff;
226
+ background: var(--ty-color-info-active);
227
+ border-color: var(--ty-color-info-active);
222
228
  }
223
229
  .ty-btn_info:disabled {
224
230
  color: var(--ty-btn-disabled-color);
@@ -232,13 +238,19 @@
232
238
  }
233
239
  .ty-btn_success:hover {
234
240
  color: #fff;
241
+ background: var(--ty-color-success-hover);
242
+ border-color: var(--ty-color-success-hover);
235
243
  }
236
244
  .ty-btn_success:focus {
237
245
  color: #fff;
246
+ background: var(--ty-color-success-hover);
247
+ border-color: var(--ty-color-success-hover);
238
248
  z-index: 1;
239
249
  }
240
250
  .ty-btn_success:active {
241
251
  color: #fff;
252
+ background: var(--ty-color-success-active);
253
+ border-color: var(--ty-color-success-active);
242
254
  }
243
255
  .ty-btn_success:disabled {
244
256
  color: var(--ty-btn-disabled-color);
@@ -252,13 +264,19 @@
252
264
  }
253
265
  .ty-btn_warning:hover {
254
266
  color: #fff;
267
+ background: var(--ty-color-warning-hover);
268
+ border-color: var(--ty-color-warning-hover);
255
269
  }
256
270
  .ty-btn_warning:focus {
257
271
  color: #fff;
272
+ background: var(--ty-color-warning-hover);
273
+ border-color: var(--ty-color-warning-hover);
258
274
  z-index: 1;
259
275
  }
260
276
  .ty-btn_warning:active {
261
277
  color: #fff;
278
+ background: var(--ty-color-warning-active);
279
+ border-color: var(--ty-color-warning-active);
262
280
  }
263
281
  .ty-btn_warning:disabled {
264
282
  color: var(--ty-btn-disabled-color);
@@ -272,13 +290,19 @@
272
290
  }
273
291
  .ty-btn_danger:hover {
274
292
  color: #fff;
293
+ background: var(--ty-color-danger-hover);
294
+ border-color: var(--ty-color-danger-hover);
275
295
  }
276
296
  .ty-btn_danger:focus {
277
297
  color: #fff;
298
+ background: var(--ty-color-danger-hover);
299
+ border-color: var(--ty-color-danger-hover);
278
300
  z-index: 1;
279
301
  }
280
302
  .ty-btn_danger:active {
281
303
  color: #fff;
304
+ background: var(--ty-color-danger-active);
305
+ border-color: var(--ty-color-danger-active);
282
306
  }
283
307
  .ty-btn_danger:disabled {
284
308
  color: var(--ty-btn-disabled-color);
@@ -313,13 +337,10 @@
313
337
  position: relative;
314
338
  pointer-events: none;
315
339
  }
316
- .ty-btn_loading:before {
340
+ .ty-btn_loading::before {
317
341
  content: "";
318
342
  position: absolute;
319
- top: -1px;
320
- right: -1px;
321
- bottom: -1px;
322
- left: -1px;
343
+ inset: -1px;
323
344
  z-index: 1;
324
345
  display: block;
325
346
  background: var(--ty-btn-loading-bg);
@@ -15,6 +15,10 @@
15
15
  }
16
16
 
17
17
  &__buttons {
18
+ display: flex;
19
+ align-items: center;
20
+ justify-content: flex-end;
21
+ gap: 8px;
18
22
  text-align: right;
19
23
  }
20
24
 
@@ -11,6 +11,10 @@
11
11
  align-items: center;
12
12
  }
13
13
  .ty-pop-confirm__buttons {
14
+ display: flex;
15
+ align-items: center;
16
+ justify-content: flex-end;
17
+ gap: 8px;
14
18
  text-align: right;
15
19
  }
16
20
  .ty-pop-confirm__title {
@@ -5,21 +5,13 @@
5
5
  box-sizing: border-box;
6
6
  cursor: pointer;
7
7
 
8
- &_horizontal.#{$prefix}-slider {
9
- margin-bottom: $slider-margin-bottom-with-marks;
10
- }
11
-
12
- &_vertical.#{$prefix}-slider {
13
- margin-right: $slider-margin-bottom-with-marks;
14
- }
15
-
16
8
  &_horizontal {
9
+ width: 100%;
17
10
  min-height: $slider-size;
18
11
  margin: 13px 7px;
19
12
  padding: 4px 0;
20
13
 
21
14
  .#{$prefix}-slider {
22
-
23
15
  &__rail {
24
16
  width: 100%;
25
17
  height: $slider-track-size;
@@ -3,13 +3,8 @@
3
3
  box-sizing: border-box;
4
4
  cursor: pointer;
5
5
  }
6
- .ty-slider_horizontal.ty-slider {
7
- margin-bottom: 30px;
8
- }
9
- .ty-slider_vertical.ty-slider {
10
- margin-right: 30px;
11
- }
12
6
  .ty-slider_horizontal {
7
+ width: 100%;
13
8
  min-height: 12px;
14
9
  margin: 13px 7px;
15
10
  padding: 4px 0;
@@ -1,5 +1,4 @@
1
1
  @use "../../style/variables" as *;
2
- @use "sass:color";
3
2
 
4
3
  $speed-dial-fab-size: 56px;
5
4
  $speed-dial-action-size: 40px;
@@ -18,8 +17,8 @@ $speed-dial-actions-gap: 16px;
18
17
  height: $speed-dial-fab-size;
19
18
  border-radius: 50%;
20
19
  border: none;
21
- background-color: var(--ty-speed-dial-bg, #{$primary-color});
22
- color: var(--ty-speed-dial-color, #{$white-color});
20
+ background-color: var(--ty-speed-dial-bg, var(--ty-color-primary));
21
+ color: var(--ty-speed-dial-color, #fff);
23
22
  font-size: 24px;
24
23
  cursor: pointer;
25
24
  box-shadow: $box-shadow;
@@ -27,11 +26,11 @@ $speed-dial-actions-gap: 16px;
27
26
  outline: none;
28
27
 
29
28
  &:hover:not(.#{$prefix}-speed-dial__button_disabled) {
30
- background-color: var(--ty-speed-dial-bg-hover, #{color.adjust($primary-color, $lightness: -8%)});
29
+ background-color: var(--ty-speed-dial-bg-hover, var(--ty-color-primary-active));
31
30
  }
32
31
 
33
32
  &:focus-visible {
34
- box-shadow: 0 0 0 3px rgba($primary-color, 0.3), $box-shadow;
33
+ box-shadow: 0 0 0 3px var(--ty-input-focus-shadow, rgb(110 65 191 / 20%)), $box-shadow;
35
34
  }
36
35
 
37
36
  &_open {
@@ -59,7 +58,7 @@ $speed-dial-actions-gap: 16px;
59
58
  position: absolute;
60
59
  top: 50%;
61
60
  left: 50%;
62
- background-color: currentColor;
61
+ background-color: currentcolor;
63
62
  border-radius: 1px;
64
63
  translate: -50% -50%;
65
64
  }
@@ -183,7 +182,7 @@ $speed-dial-actions-gap: 16px;
183
182
  }
184
183
 
185
184
  &:focus-visible {
186
- box-shadow: 0 0 0 3px rgba($primary-color, 0.3), $box-shadow-sm;
185
+ box-shadow: 0 0 0 3px var(--ty-input-focus-shadow, rgb(110 65 191 / 20%)), $box-shadow-sm;
187
186
  }
188
187
 
189
188
  &_disabled {
@@ -10,7 +10,7 @@
10
10
  height: 56px;
11
11
  border-radius: 50%;
12
12
  border: none;
13
- background-color: var(--ty-speed-dial-bg, #6e41bf);
13
+ background-color: var(--ty-speed-dial-bg, var(--ty-color-primary));
14
14
  color: var(--ty-speed-dial-color, #fff);
15
15
  font-size: 24px;
16
16
  cursor: pointer;
@@ -19,10 +19,10 @@
19
19
  outline: none;
20
20
  }
21
21
  .ty-speed-dial__button:hover:not(.ty-speed-dial__button_disabled) {
22
- background-color: var(--ty-speed-dial-bg-hover, rgb(92.3496062992, 54.2236220472, 160.9763779528));
22
+ background-color: var(--ty-speed-dial-bg-hover, var(--ty-color-primary-active));
23
23
  }
24
24
  .ty-speed-dial__button:focus-visible {
25
- box-shadow: 0 0 0 3px rgba(110, 65, 191, 0.3), 0 0.5rem 1rem rgba(0, 0, 0, 0.15);
25
+ box-shadow: 0 0 0 3px var(--ty-input-focus-shadow, rgba(110, 65, 191, 0.2)), 0 0.5rem 1rem rgba(0, 0, 0, 0.15);
26
26
  }
27
27
  .ty-speed-dial__button_open .ty-speed-dial__icon-default {
28
28
  transform: rotate(45deg);
@@ -43,7 +43,7 @@
43
43
  position: absolute;
44
44
  top: 50%;
45
45
  left: 50%;
46
- background-color: currentColor;
46
+ background-color: currentcolor;
47
47
  border-radius: 1px;
48
48
  translate: -50% -50%;
49
49
  }
@@ -145,7 +145,7 @@
145
145
  box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15);
146
146
  }
147
147
  .ty-speed-dial__action:focus-visible {
148
- box-shadow: 0 0 0 3px rgba(110, 65, 191, 0.3), 0 0.125rem 0.25rem rgba(0, 0, 0, 0.075);
148
+ box-shadow: 0 0 0 3px var(--ty-input-focus-shadow, rgba(110, 65, 191, 0.2)), 0 0.125rem 0.25rem rgba(0, 0, 0, 0.075);
149
149
  }
150
150
  .ty-speed-dial__action_disabled {
151
151
  opacity: 0.5;
@@ -27,19 +27,26 @@
27
27
  --ty-color-fill-secondary: #f5f5f5;
28
28
  --ty-color-fill-tertiary: #f0f0f0;
29
29
  --ty-color-success: #52c41a;
30
+ --ty-color-success-hover: #73d13d;
31
+ --ty-color-success-active: #389e0d;
30
32
  --ty-color-success-bg: #f6ffed;
31
33
  --ty-color-success-border: #b7eb8f;
32
34
  --ty-color-success-text: #49b10e;
33
35
  --ty-color-warning: #ff9800;
36
+ --ty-color-warning-hover: #ffad33;
37
+ --ty-color-warning-active: #e68a00;
34
38
  --ty-color-warning-bg: #fffbe6;
35
39
  --ty-color-warning-border: #ffe58f;
36
40
  --ty-color-warning-text: #d48806;
37
41
  --ty-color-danger: #f44336;
42
+ --ty-color-danger-hover: #ff7875;
43
+ --ty-color-danger-active: #cf1322;
38
44
  --ty-color-danger-bg: #fff1f0;
39
45
  --ty-color-danger-border: #ffa39e;
40
46
  --ty-color-danger-text: #cf1322;
41
- --ty-color-danger-hover: #ff7875;
42
47
  --ty-color-info: #1890ff;
48
+ --ty-color-info-hover: #40a9ff;
49
+ --ty-color-info-active: #096dd9;
43
50
  --ty-color-info-bg: #e6f7ff;
44
51
  --ty-color-info-border: #91d5ff;
45
52
  --ty-color-info-text: #096dd9;
@@ -294,19 +301,26 @@ html[data-tiny-theme=dark] {
294
301
  --ty-color-fill-secondary: #2a2a2a;
295
302
  --ty-color-fill-tertiary: #303030;
296
303
  --ty-color-success: #49aa19;
304
+ --ty-color-success-hover: #6abe39;
305
+ --ty-color-success-active: #3c8c14;
297
306
  --ty-color-success-bg: #162312;
298
307
  --ty-color-success-border: #274916;
299
308
  --ty-color-success-text: #6abe39;
300
309
  --ty-color-warning: #d89614;
310
+ --ty-color-warning-hover: #e8b339;
311
+ --ty-color-warning-active: #b37a10;
301
312
  --ty-color-warning-bg: #2b2111;
302
313
  --ty-color-warning-border: #594214;
303
314
  --ty-color-warning-text: #e8b339;
304
315
  --ty-color-danger: #d32029;
316
+ --ty-color-danger-hover: #e84749;
317
+ --ty-color-danger-active: #ab1a20;
305
318
  --ty-color-danger-bg: #2a1215;
306
319
  --ty-color-danger-border: #58181c;
307
320
  --ty-color-danger-text: #e84749;
308
- --ty-color-danger-hover: #e84749;
309
321
  --ty-color-info: #177ddc;
322
+ --ty-color-info-hover: #3c9ae8;
323
+ --ty-color-info-active: #1268b3;
310
324
  --ty-color-info-bg: #111d2c;
311
325
  --ty-color-info-border: #15395b;
312
326
  --ty-color-info-text: #3c9ae8;
@@ -562,19 +576,26 @@ html[data-tiny-theme=dark] {
562
576
  --ty-color-fill-secondary: #2a2a2a;
563
577
  --ty-color-fill-tertiary: #303030;
564
578
  --ty-color-success: #49aa19;
579
+ --ty-color-success-hover: #6abe39;
580
+ --ty-color-success-active: #3c8c14;
565
581
  --ty-color-success-bg: #162312;
566
582
  --ty-color-success-border: #274916;
567
583
  --ty-color-success-text: #6abe39;
568
584
  --ty-color-warning: #d89614;
585
+ --ty-color-warning-hover: #e8b339;
586
+ --ty-color-warning-active: #b37a10;
569
587
  --ty-color-warning-bg: #2b2111;
570
588
  --ty-color-warning-border: #594214;
571
589
  --ty-color-warning-text: #e8b339;
572
590
  --ty-color-danger: #d32029;
591
+ --ty-color-danger-hover: #e84749;
592
+ --ty-color-danger-active: #ab1a20;
573
593
  --ty-color-danger-bg: #2a1215;
574
594
  --ty-color-danger-border: #58181c;
575
595
  --ty-color-danger-text: #e84749;
576
- --ty-color-danger-hover: #e84749;
577
596
  --ty-color-info: #177ddc;
597
+ --ty-color-info-hover: #3c9ae8;
598
+ --ty-color-info-active: #1268b3;
578
599
  --ty-color-info-bg: #111d2c;
579
600
  --ty-color-info-border: #15395b;
580
601
  --ty-color-info-text: #3c9ae8;
@@ -102,6 +102,30 @@
102
102
  background: var(--ty-tag-purple-bg);
103
103
  border-color: var(--ty-tag-purple-border);
104
104
  }
105
+
106
+ &_success {
107
+ color: var(--ty-color-success);
108
+ background: var(--ty-color-success-bg);
109
+ border-color: var(--ty-color-success-border);
110
+ }
111
+
112
+ &_info {
113
+ color: var(--ty-color-info);
114
+ background: var(--ty-color-info-bg);
115
+ border-color: var(--ty-color-info-border);
116
+ }
117
+
118
+ &_warning {
119
+ color: var(--ty-color-warning);
120
+ background: var(--ty-color-warning-bg);
121
+ border-color: var(--ty-color-warning-border);
122
+ }
123
+
124
+ &_danger {
125
+ color: var(--ty-color-danger);
126
+ background: var(--ty-color-danger-bg);
127
+ border-color: var(--ty-color-danger-border);
128
+ }
105
129
  }
106
130
 
107
131
  .#{$prefix}-checkable-tag {