@expcat/tigercat-react 0.0.65 → 0.0.66

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 (196) hide show
  1. package/dist/styles/index.css +4 -0
  2. package/dist/styles/index.d.mts +2 -0
  3. package/package.json +6 -3
  4. package/dist/chunk-2DOPHSZP.js +0 -32
  5. package/dist/chunk-2TS6X5RA.js +0 -73
  6. package/dist/chunk-2Y327ZU4.js +0 -493
  7. package/dist/chunk-3OF7XPIQ.js +0 -90
  8. package/dist/chunk-3WPKVV4N.js +0 -140
  9. package/dist/chunk-5FRENLDC.js +0 -194
  10. package/dist/chunk-5QKMQRCW.js +0 -89
  11. package/dist/chunk-5ZVSFIZD.js +0 -50
  12. package/dist/chunk-6MGEGOYJ.js +0 -108
  13. package/dist/chunk-6PUSRC6S.js +0 -68
  14. package/dist/chunk-72ZRDBXN.js +0 -25
  15. package/dist/chunk-77D7VQMG.js +0 -43
  16. package/dist/chunk-7P6PHSFM.js +0 -548
  17. package/dist/chunk-AG6GVQ5O.js +0 -271
  18. package/dist/chunk-AQ6DHCP6.js +0 -53
  19. package/dist/chunk-AQQRWISY.js +0 -184
  20. package/dist/chunk-C5EFBJBR.js +0 -540
  21. package/dist/chunk-D3I2SY7X.js +0 -301
  22. package/dist/chunk-DZJUFU55.js +0 -300
  23. package/dist/chunk-EI2GHMQS.js +0 -37
  24. package/dist/chunk-ENR3RIMM.js +0 -205
  25. package/dist/chunk-EQWQXURG.js +0 -18
  26. package/dist/chunk-EUHWE7MN.js +0 -267
  27. package/dist/chunk-FAKTU64M.js +0 -67
  28. package/dist/chunk-FQ6UHRAO.js +0 -499
  29. package/dist/chunk-GX74TC62.js +0 -54
  30. package/dist/chunk-HDDBBZQH.js +0 -321
  31. package/dist/chunk-IFY46RWU.js +0 -25
  32. package/dist/chunk-IQINYCU6.js +0 -99
  33. package/dist/chunk-IY4LEJYF.js +0 -78
  34. package/dist/chunk-JW64IJP2.js +0 -210
  35. package/dist/chunk-KUCFT2OA.js +0 -43
  36. package/dist/chunk-LNKI6HQ3.js +0 -152
  37. package/dist/chunk-LXA2YBAO.js +0 -38
  38. package/dist/chunk-MKWXJZ3T.js +0 -74
  39. package/dist/chunk-NEULKOYJ.js +0 -48
  40. package/dist/chunk-NI2WNZRT.js +0 -38
  41. package/dist/chunk-OFCKGWTS.js +0 -12
  42. package/dist/chunk-OTRGVENC.js +0 -305
  43. package/dist/chunk-P273E6XE.js +0 -219
  44. package/dist/chunk-Q3DPJHNM.js +0 -407
  45. package/dist/chunk-QFVE7GKD.js +0 -109
  46. package/dist/chunk-QL6OBKEN.js +0 -84
  47. package/dist/chunk-QL6UEG3U.js +0 -27
  48. package/dist/chunk-QORSSZX4.js +0 -144
  49. package/dist/chunk-R4JSBXGG.js +0 -12
  50. package/dist/chunk-R5BQHZWB.js +0 -698
  51. package/dist/chunk-R7MS42PL.js +0 -90
  52. package/dist/chunk-TB2UHDOZ.js +0 -19
  53. package/dist/chunk-TBIEWDY5.js +0 -175
  54. package/dist/chunk-TJFS44SH.js +0 -48
  55. package/dist/chunk-TZ26HQAW.js +0 -85
  56. package/dist/chunk-U4ZVEPYD.js +0 -71
  57. package/dist/chunk-UFAXJVMD.js +0 -120
  58. package/dist/chunk-VJJ76I7U.js +0 -19
  59. package/dist/chunk-VO4WDK4K.js +0 -37
  60. package/dist/chunk-VSF4DF7N.js +0 -84
  61. package/dist/chunk-VVO4V4IK.js +0 -56
  62. package/dist/chunk-WK5HN4OH.js +0 -113
  63. package/dist/chunk-XZDJ5FRB.js +0 -333
  64. package/dist/chunk-YE2M2HNM.js +0 -168
  65. package/dist/chunk-YYGTJKP5.js +0 -39
  66. package/dist/chunk-ZREFCRX3.js +0 -52
  67. package/dist/components/Alert.d.ts +0 -24
  68. package/dist/components/Alert.js +0 -10
  69. package/dist/components/Avatar.d.ts +0 -12
  70. package/dist/components/Avatar.js +0 -10
  71. package/dist/components/Badge.d.ts +0 -12
  72. package/dist/components/Badge.js +0 -10
  73. package/dist/components/Breadcrumb.d.ts +0 -13
  74. package/dist/components/Breadcrumb.js +0 -14
  75. package/dist/components/BreadcrumbItem.d.ts +0 -21
  76. package/dist/components/BreadcrumbItem.js +0 -11
  77. package/dist/components/Button.d.ts +0 -8
  78. package/dist/components/Button.js +0 -10
  79. package/dist/components/Card.d.ts +0 -33
  80. package/dist/components/Card.js +0 -10
  81. package/dist/components/Checkbox.d.ts +0 -48
  82. package/dist/components/Checkbox.js +0 -11
  83. package/dist/components/CheckboxGroup.d.ts +0 -39
  84. package/dist/components/CheckboxGroup.js +0 -14
  85. package/dist/components/Code.d.ts +0 -9
  86. package/dist/components/Code.js +0 -16
  87. package/dist/components/Col.d.ts +0 -7
  88. package/dist/components/Col.js +0 -11
  89. package/dist/components/ConfigProvider.d.ts +0 -14
  90. package/dist/components/ConfigProvider.js +0 -14
  91. package/dist/components/Container.d.ts +0 -13
  92. package/dist/components/Container.js +0 -10
  93. package/dist/components/Content.d.ts +0 -9
  94. package/dist/components/Content.js +0 -10
  95. package/dist/components/DatePicker.d.ts +0 -24
  96. package/dist/components/DatePicker.js +0 -10
  97. package/dist/components/Descriptions.d.ts +0 -53
  98. package/dist/components/Descriptions.js +0 -16
  99. package/dist/components/Divider.d.ts +0 -12
  100. package/dist/components/Divider.js +0 -10
  101. package/dist/components/Drawer.d.ts +0 -19
  102. package/dist/components/Drawer.js +0 -11
  103. package/dist/components/Dropdown.d.ts +0 -22
  104. package/dist/components/Dropdown.js +0 -16
  105. package/dist/components/DropdownItem.d.ts +0 -17
  106. package/dist/components/DropdownItem.js +0 -13
  107. package/dist/components/DropdownMenu.d.ts +0 -13
  108. package/dist/components/DropdownMenu.js +0 -10
  109. package/dist/components/Footer.d.ts +0 -9
  110. package/dist/components/Footer.js +0 -10
  111. package/dist/components/Form.d.ts +0 -56
  112. package/dist/components/Form.js +0 -14
  113. package/dist/components/FormItem.d.ts +0 -16
  114. package/dist/components/FormItem.js +0 -11
  115. package/dist/components/Header.d.ts +0 -9
  116. package/dist/components/Header.js +0 -10
  117. package/dist/components/Icon.d.ts +0 -9
  118. package/dist/components/Icon.js +0 -10
  119. package/dist/components/Input.d.ts +0 -28
  120. package/dist/components/Input.js +0 -10
  121. package/dist/components/Layout.d.ts +0 -9
  122. package/dist/components/Layout.js +0 -10
  123. package/dist/components/Link.d.ts +0 -10
  124. package/dist/components/Link.js +0 -10
  125. package/dist/components/List.d.ts +0 -94
  126. package/dist/components/List.js +0 -12
  127. package/dist/components/Loading.d.ts +0 -8
  128. package/dist/components/Loading.js +0 -10
  129. package/dist/components/Menu.d.ts +0 -35
  130. package/dist/components/Menu.js +0 -14
  131. package/dist/components/MenuItem.d.ts +0 -20
  132. package/dist/components/MenuItem.js +0 -11
  133. package/dist/components/MenuItemGroup.d.ts +0 -16
  134. package/dist/components/MenuItemGroup.js +0 -12
  135. package/dist/components/Message.d.ts +0 -44
  136. package/dist/components/Message.js +0 -20
  137. package/dist/components/Modal.d.ts +0 -41
  138. package/dist/components/Modal.js +0 -11
  139. package/dist/components/Notification.d.ts +0 -40
  140. package/dist/components/Notification.js +0 -20
  141. package/dist/components/Pagination.d.ts +0 -11
  142. package/dist/components/Pagination.js +0 -16
  143. package/dist/components/Popconfirm.d.ts +0 -34
  144. package/dist/components/Popconfirm.js +0 -10
  145. package/dist/components/Popover.d.ts +0 -14
  146. package/dist/components/Popover.js +0 -10
  147. package/dist/components/Progress.d.ts +0 -8
  148. package/dist/components/Progress.js +0 -10
  149. package/dist/components/Radio.d.ts +0 -20
  150. package/dist/components/Radio.js +0 -11
  151. package/dist/components/RadioGroup.d.ts +0 -28
  152. package/dist/components/RadioGroup.js +0 -14
  153. package/dist/components/Row.d.ts +0 -11
  154. package/dist/components/Row.js +0 -14
  155. package/dist/components/Select.d.ts +0 -23
  156. package/dist/components/Select.js +0 -10
  157. package/dist/components/Sidebar.d.ts +0 -9
  158. package/dist/components/Sidebar.js +0 -10
  159. package/dist/components/Skeleton.d.ts +0 -7
  160. package/dist/components/Skeleton.js +0 -10
  161. package/dist/components/Slider.d.ts +0 -12
  162. package/dist/components/Slider.js +0 -10
  163. package/dist/components/Space.d.ts +0 -11
  164. package/dist/components/Space.js +0 -10
  165. package/dist/components/Steps.d.ts +0 -31
  166. package/dist/components/Steps.js +0 -14
  167. package/dist/components/StepsItem.d.ts +0 -36
  168. package/dist/components/StepsItem.js +0 -10
  169. package/dist/components/SubMenu.d.ts +0 -20
  170. package/dist/components/SubMenu.js +0 -13
  171. package/dist/components/Switch.d.ts +0 -12
  172. package/dist/components/Switch.js +0 -10
  173. package/dist/components/TabPane.d.ts +0 -42
  174. package/dist/components/TabPane.js +0 -10
  175. package/dist/components/Table.d.ts +0 -46
  176. package/dist/components/Table.js +0 -10
  177. package/dist/components/Tabs.d.ts +0 -43
  178. package/dist/components/Tabs.js +0 -14
  179. package/dist/components/Tag.d.ts +0 -16
  180. package/dist/components/Tag.js +0 -10
  181. package/dist/components/Text.d.ts +0 -9
  182. package/dist/components/Text.js +0 -10
  183. package/dist/components/Textarea.d.ts +0 -13
  184. package/dist/components/Textarea.js +0 -10
  185. package/dist/components/TimePicker.d.ts +0 -28
  186. package/dist/components/TimePicker.js +0 -10
  187. package/dist/components/Timeline.d.ts +0 -47
  188. package/dist/components/Timeline.js +0 -10
  189. package/dist/components/Tooltip.d.ts +0 -15
  190. package/dist/components/Tooltip.js +0 -10
  191. package/dist/components/Tree.d.ts +0 -154
  192. package/dist/components/Tree.js +0 -16
  193. package/dist/components/Upload.d.ts +0 -16
  194. package/dist/components/Upload.js +0 -11
  195. package/dist/index.d.ts +0 -77
  196. package/dist/index.js +0 -364
@@ -0,0 +1,4 @@
1
+ @import "tailwindcss";
2
+
3
+ /* src/styles/index.css */
4
+ @source "../components/**/*.{tsx,ts}";
@@ -0,0 +1,2 @@
1
+
2
+ export { }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@expcat/tigercat-react",
3
- "version": "0.0.65",
3
+ "version": "0.0.66",
4
4
  "description": "React components for Tigercat UI library",
5
5
  "license": "MIT",
6
6
  "author": "Yizhe Wang",
@@ -18,13 +18,16 @@
18
18
  "main": "./dist/index.js",
19
19
  "module": "./dist/index.mjs",
20
20
  "types": "./dist/index.d.ts",
21
- "sideEffects": false,
21
+ "sideEffects": [
22
+ "**/*.css"
23
+ ],
22
24
  "exports": {
23
25
  ".": {
24
26
  "types": "./dist/index.d.ts",
25
27
  "import": "./dist/index.mjs",
26
28
  "require": "./dist/index.js"
27
29
  },
30
+ "./style": "./dist/styles/index.css",
28
31
  "./*": {
29
32
  "types": "./dist/components/*.d.ts",
30
33
  "import": "./dist/components/*.mjs",
@@ -38,7 +41,7 @@
38
41
  "access": "public"
39
42
  },
40
43
  "dependencies": {
41
- "@expcat/tigercat-core": "0.0.65"
44
+ "@expcat/tigercat-core": "0.0.66"
42
45
  },
43
46
  "devDependencies": {
44
47
  "@types/node": "^25.0.3",
@@ -1,32 +0,0 @@
1
- 'use strict';
2
-
3
- var React = require('react');
4
- var tigercatCore = require('@expcat/tigercat-core');
5
- var jsxRuntime = require('react/jsx-runtime');
6
-
7
- function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
8
-
9
- var React__default = /*#__PURE__*/_interopDefault(React);
10
-
11
- // src/components/Breadcrumb.tsx
12
- var BreadcrumbContext = React.createContext(null);
13
- function useBreadcrumbContext() {
14
- return React.useContext(BreadcrumbContext);
15
- }
16
- var Breadcrumb = ({
17
- separator = "/",
18
- className,
19
- style,
20
- children,
21
- ...props
22
- }) => {
23
- const containerClasses = React__default.default.useMemo(
24
- () => tigercatCore.classNames(tigercatCore.breadcrumbContainerClasses, className),
25
- [className]
26
- );
27
- const contextValue = React__default.default.useMemo(() => ({ separator }), [separator]);
28
- return /* @__PURE__ */ jsxRuntime.jsx(BreadcrumbContext.Provider, { value: contextValue, children: /* @__PURE__ */ jsxRuntime.jsx("nav", { className: containerClasses, "aria-label": "Breadcrumb", style, ...props, children: /* @__PURE__ */ jsxRuntime.jsx("ol", { className: "flex items-center flex-wrap gap-2", children }) }) });
29
- };
30
-
31
- exports.Breadcrumb = Breadcrumb;
32
- exports.useBreadcrumbContext = useBreadcrumbContext;
@@ -1,73 +0,0 @@
1
- 'use strict';
2
-
3
- var react = require('react');
4
- var tigercatCore = require('@expcat/tigercat-core');
5
- var jsxRuntime = require('react/jsx-runtime');
6
-
7
- // src/components/Tag.tsx
8
- var CloseIcon = () => /* @__PURE__ */ jsxRuntime.jsx(
9
- "svg",
10
- {
11
- className: "h-3 w-3",
12
- xmlns: "http://www.w3.org/2000/svg",
13
- fill: "none",
14
- viewBox: tigercatCore.icon24ViewBox,
15
- stroke: "currentColor",
16
- strokeWidth: tigercatCore.icon24StrokeWidth,
17
- "aria-hidden": "true",
18
- focusable: "false",
19
- children: /* @__PURE__ */ jsxRuntime.jsx(
20
- "path",
21
- {
22
- strokeLinecap: tigercatCore.icon24PathStrokeLinecap,
23
- strokeLinejoin: tigercatCore.icon24PathStrokeLinejoin,
24
- d: tigercatCore.tagCloseIconPath
25
- }
26
- )
27
- }
28
- );
29
- var Tag = ({
30
- variant = "default",
31
- size = "md",
32
- closable = false,
33
- closeAriaLabel = "Close tag",
34
- onClose,
35
- children,
36
- className,
37
- ...props
38
- }) => {
39
- const [isVisible, setIsVisible] = react.useState(true);
40
- const tagClasses = tigercatCore.classNames(
41
- tigercatCore.tagBaseClasses,
42
- tigercatCore.getTagVariantClasses(variant),
43
- tigercatCore.tagSizeClasses[size],
44
- className
45
- );
46
- const scheme = tigercatCore.defaultTagThemeColors[variant];
47
- const closeButtonClasses = tigercatCore.classNames(tigercatCore.tagCloseButtonBaseClasses, scheme.closeBgHover, scheme.text);
48
- const handleClose = (event) => {
49
- event.stopPropagation();
50
- onClose?.(event);
51
- if (!event.defaultPrevented) {
52
- setIsVisible(false);
53
- }
54
- };
55
- if (!isVisible) {
56
- return null;
57
- }
58
- return /* @__PURE__ */ jsxRuntime.jsxs("span", { className: tagClasses, role: "status", ...props, children: [
59
- children != null && /* @__PURE__ */ jsxRuntime.jsx("span", { children }),
60
- closable && /* @__PURE__ */ jsxRuntime.jsx(
61
- "button",
62
- {
63
- className: closeButtonClasses,
64
- onClick: handleClose,
65
- "aria-label": closeAriaLabel,
66
- type: "button",
67
- children: /* @__PURE__ */ jsxRuntime.jsx(CloseIcon, {})
68
- }
69
- )
70
- ] });
71
- };
72
-
73
- exports.Tag = Tag;
@@ -1,493 +0,0 @@
1
- 'use strict';
2
-
3
- var react = require('react');
4
- var tigercatCore = require('@expcat/tigercat-core');
5
- var jsxRuntime = require('react/jsx-runtime');
6
-
7
- // src/components/DatePicker.tsx
8
- var Icon = ({ path, className }) => /* @__PURE__ */ jsxRuntime.jsx(
9
- "svg",
10
- {
11
- className,
12
- xmlns: "http://www.w3.org/2000/svg",
13
- viewBox: tigercatCore.icon20ViewBox,
14
- fill: "currentColor",
15
- children: /* @__PURE__ */ jsxRuntime.jsx("path", { fillRule: "evenodd", d: path, clipRule: "evenodd" })
16
- }
17
- );
18
- var isRangeDatePicker = (props) => props.range === true;
19
- var DatePicker = (props) => {
20
- const {
21
- size = "md",
22
- disabled = false,
23
- readonly = false,
24
- required = false,
25
- clearable = true,
26
- format = "yyyy-MM-dd"
27
- } = props;
28
- const isRangeMode = isRangeDatePicker(props);
29
- const placeholder = props.placeholder ?? (isRangeMode ? "Select date range" : "Select date");
30
- const divProps = (({
31
- value: _value,
32
- defaultValue: _defaultValue,
33
- range: _range,
34
- locale: _locale,
35
- labels: _labels,
36
- size: _size,
37
- format: _format,
38
- placeholder: _placeholder,
39
- disabled: _disabled,
40
- readonly: _readonly,
41
- required: _required,
42
- minDate: _minDate,
43
- maxDate: _maxDate,
44
- clearable: _clearable,
45
- name: _name,
46
- id: _id,
47
- onChange: _onChange,
48
- onClear: _onClear,
49
- className: _className,
50
- ...rest
51
- }) => rest)(props);
52
- const [isOpen, setIsOpen] = react.useState(false);
53
- const [activeDateIso, setActiveDateIso] = react.useState(null);
54
- const [internalValue, setInternalValue] = react.useState(() => {
55
- if (isRangeMode) return null;
56
- return tigercatCore.parseDate(props.defaultValue ?? null);
57
- });
58
- const [internalRangeValue, setInternalRangeValue] = react.useState(() => {
59
- if (!isRangeMode) return [null, null];
60
- const tuple = props.defaultValue ?? null;
61
- if (!tuple) return [null, null];
62
- const start = Array.isArray(tuple) ? tigercatCore.parseDate(tuple[0]) : null;
63
- const end = Array.isArray(tuple) ? tigercatCore.parseDate(tuple[1]) : null;
64
- return [start, end];
65
- });
66
- const calendarRef = react.useRef(null);
67
- const inputWrapperRef = react.useRef(null);
68
- const inputRef = react.useRef(null);
69
- const pendingFocusIsoRef = react.useRef(null);
70
- const restoreFocusRef = react.useRef(null);
71
- const isControlled = props.value !== void 0;
72
- const selectedDate = (() => {
73
- if (isRangeMode) return null;
74
- const current = isControlled ? props.value : internalValue;
75
- return tigercatCore.parseDate(current ?? null);
76
- })();
77
- const selectedRange = (() => {
78
- if (!isRangeMode) return [null, null];
79
- const tuple = isControlled ? props.value : internalRangeValue;
80
- if (!tuple) return [null, null];
81
- const start = Array.isArray(tuple) ? tigercatCore.parseDate(tuple[0]) : null;
82
- const end = Array.isArray(tuple) ? tigercatCore.parseDate(tuple[1]) : null;
83
- return [start, end];
84
- })();
85
- const minDateParsed = tigercatCore.parseDate(props.minDate ?? null);
86
- const maxDateParsed = tigercatCore.parseDate(props.maxDate ?? null);
87
- const [viewingMonth, setViewingMonth] = react.useState(
88
- (selectedDate ?? selectedRange[0])?.getMonth() ?? (/* @__PURE__ */ new Date()).getMonth()
89
- );
90
- const [viewingYear, setViewingYear] = react.useState(
91
- (selectedDate ?? selectedRange[0])?.getFullYear() ?? (/* @__PURE__ */ new Date()).getFullYear()
92
- );
93
- const displayValue = (() => {
94
- if (!isRangeMode) {
95
- return selectedDate ? tigercatCore.formatDate(selectedDate, format) : "";
96
- }
97
- const [start, end] = selectedRange;
98
- const startText = start ? tigercatCore.formatDate(start, format) : "";
99
- const endText = end ? tigercatCore.formatDate(end, format) : "";
100
- if (!startText && !endText) return "";
101
- if (startText && endText) return `${startText} - ${endText}`;
102
- return startText ? `${startText} - ` : ` - ${endText}`;
103
- })();
104
- const showClearButton = (() => {
105
- if (!clearable || disabled || readonly) return false;
106
- if (!isRangeMode) return selectedDate !== null;
107
- return selectedRange[0] !== null || selectedRange[1] !== null;
108
- })();
109
- const calendarDays = tigercatCore.getCalendarDays(viewingYear, viewingMonth);
110
- const dayNames = tigercatCore.getShortDayNames(props.locale);
111
- const labels = tigercatCore.getDatePickerLabels(props.locale, props.labels);
112
- const toggleCalendar = () => {
113
- if (!disabled && !readonly) {
114
- setIsOpen(!isOpen);
115
- if (!isOpen) {
116
- restoreFocusRef.current = document.activeElement ?? null;
117
- const baseDate = selectedDate ?? selectedRange[0];
118
- if (baseDate) {
119
- setViewingMonth(baseDate.getMonth());
120
- setViewingYear(baseDate.getFullYear());
121
- }
122
- }
123
- }
124
- };
125
- const closeCalendar = () => {
126
- setIsOpen(false);
127
- };
128
- const getFirstEnabledIsoInView = () => {
129
- for (const date of calendarDays) {
130
- if (!date) continue;
131
- const iso = tigercatCore.formatDate(date, "yyyy-MM-dd");
132
- const isDisabled = isDateDisabled(date);
133
- if (!isDisabled) return iso;
134
- }
135
- return null;
136
- };
137
- const getPreferredFocusIso = () => {
138
- const focusDate = isRangeMode ? selectedRange[0] ?? selectedRange[1] : selectedDate;
139
- if (focusDate) {
140
- return tigercatCore.formatDate(focusDate, "yyyy-MM-dd");
141
- }
142
- const today = tigercatCore.normalizeDate(/* @__PURE__ */ new Date());
143
- if (tigercatCore.isDateInRange(today, minDateParsed, maxDateParsed)) {
144
- return tigercatCore.formatDate(today, "yyyy-MM-dd");
145
- }
146
- return getFirstEnabledIsoInView();
147
- };
148
- const focusDateButtonByIso = (iso) => {
149
- const button = calendarRef.current?.querySelector(
150
- `button[data-date="${iso}"]`
151
- );
152
- if (!button || button.disabled) return false;
153
- button.focus();
154
- setActiveDateIso(iso);
155
- return true;
156
- };
157
- const restoreFocus = () => {
158
- const target = restoreFocusRef.current ?? inputRef.current;
159
- if (!target) return;
160
- if (typeof target.focus === "function") {
161
- target.focus();
162
- }
163
- };
164
- const addDays = (date, days) => {
165
- const next = new Date(date);
166
- next.setDate(next.getDate() + days);
167
- return next;
168
- };
169
- const moveFocus = (deltaDays) => {
170
- const activeEl = document.activeElement;
171
- const currentIso = activeEl?.getAttribute("data-date") ?? activeDateIso ?? null;
172
- const baseIso = currentIso ?? getPreferredFocusIso();
173
- if (!baseIso) return;
174
- const baseDate = tigercatCore.parseDate(baseIso);
175
- if (!baseDate) return;
176
- let candidate = addDays(baseDate, deltaDays);
177
- for (let attempts = 0; attempts < 42; attempts++) {
178
- const iso = tigercatCore.formatDate(candidate, "yyyy-MM-dd");
179
- const el = calendarRef.current?.querySelector(
180
- `button[data-date="${iso}"]`
181
- );
182
- if (el && !el.disabled) {
183
- el.focus();
184
- setActiveDateIso(iso);
185
- return;
186
- }
187
- if (!el) {
188
- pendingFocusIsoRef.current = iso;
189
- setViewingYear(candidate.getFullYear());
190
- setViewingMonth(candidate.getMonth());
191
- setActiveDateIso(iso);
192
- return;
193
- }
194
- candidate = addDays(candidate, deltaDays);
195
- }
196
- };
197
- const handleCalendarKeyDown = (event) => {
198
- if (!isOpen) return;
199
- switch (event.key) {
200
- case "Escape": {
201
- event.preventDefault();
202
- closeCalendar();
203
- return;
204
- }
205
- case "ArrowRight": {
206
- event.preventDefault();
207
- moveFocus(1);
208
- return;
209
- }
210
- case "ArrowLeft": {
211
- event.preventDefault();
212
- moveFocus(-1);
213
- return;
214
- }
215
- case "ArrowDown": {
216
- event.preventDefault();
217
- moveFocus(7);
218
- return;
219
- }
220
- case "ArrowUp": {
221
- event.preventDefault();
222
- moveFocus(-7);
223
- return;
224
- }
225
- case "Enter":
226
- case " ": {
227
- const activeEl = document.activeElement;
228
- if (activeEl?.tagName === "BUTTON" && activeEl.dataset.date) {
229
- event.preventDefault();
230
- if (!activeEl.disabled) activeEl.click();
231
- }
232
- return;
233
- }
234
- }
235
- };
236
- const setRangeValue = (next) => {
237
- if (!isControlled) {
238
- setInternalRangeValue(next);
239
- }
240
- props.onChange?.(next);
241
- };
242
- const selectDate = (date) => {
243
- if (!date) return;
244
- const normalizedDate = tigercatCore.normalizeDate(date);
245
- if (!tigercatCore.isDateInRange(normalizedDate, minDateParsed, maxDateParsed)) {
246
- return;
247
- }
248
- if (!isRangeMode) {
249
- if (!isControlled) {
250
- setInternalValue(normalizedDate);
251
- }
252
- props.onChange?.(normalizedDate);
253
- closeCalendar();
254
- return;
255
- }
256
- const [start, end] = selectedRange;
257
- if (!start || start && end) {
258
- setRangeValue([normalizedDate, null]);
259
- return;
260
- }
261
- if (normalizedDate < start) {
262
- setRangeValue([start, start]);
263
- } else {
264
- setRangeValue([start, normalizedDate]);
265
- }
266
- };
267
- const setToday = () => {
268
- selectDate(/* @__PURE__ */ new Date());
269
- };
270
- const clearDate = (event) => {
271
- event.stopPropagation();
272
- if (!isRangeMode) {
273
- if (!isControlled) {
274
- setInternalValue(null);
275
- }
276
- props.onChange?.(null);
277
- } else {
278
- setRangeValue([null, null]);
279
- }
280
- props.onClear?.();
281
- };
282
- const previousMonth = () => {
283
- if (viewingMonth === 0) {
284
- setViewingMonth(11);
285
- setViewingYear(viewingYear - 1);
286
- } else {
287
- setViewingMonth(viewingMonth - 1);
288
- }
289
- };
290
- const nextMonth = () => {
291
- if (viewingMonth === 11) {
292
- setViewingMonth(0);
293
- setViewingYear(viewingYear + 1);
294
- } else {
295
- setViewingMonth(viewingMonth + 1);
296
- }
297
- };
298
- const isDateDisabled = (date) => {
299
- if (!date) return true;
300
- return !tigercatCore.isDateInRange(date, minDateParsed, maxDateParsed);
301
- };
302
- const isCurrentMonth = (date) => {
303
- if (!date) return false;
304
- return date.getMonth() === viewingMonth;
305
- };
306
- const handleInputClick = () => {
307
- toggleCalendar();
308
- };
309
- react.useEffect(() => {
310
- const handleClickOutside = (event) => {
311
- if (calendarRef.current && inputWrapperRef.current && !calendarRef.current.contains(event.target) && !inputWrapperRef.current.contains(event.target)) {
312
- closeCalendar();
313
- }
314
- };
315
- if (isOpen) {
316
- document.addEventListener("click", handleClickOutside);
317
- return () => {
318
- document.removeEventListener("click", handleClickOutside);
319
- };
320
- }
321
- }, [isOpen]);
322
- react.useEffect(() => {
323
- if (isOpen) {
324
- restoreFocusRef.current = document.activeElement ?? null;
325
- const preferred = pendingFocusIsoRef.current ?? getPreferredFocusIso();
326
- pendingFocusIsoRef.current = null;
327
- setTimeout(() => {
328
- if (preferred && focusDateButtonByIso(preferred)) return;
329
- const fallback = getFirstEnabledIsoInView();
330
- if (fallback) focusDateButtonByIso(fallback);
331
- }, 0);
332
- return;
333
- }
334
- setTimeout(() => {
335
- restoreFocus();
336
- }, 0);
337
- }, [isOpen]);
338
- react.useEffect(() => {
339
- if (!isOpen) return;
340
- const pending = pendingFocusIsoRef.current;
341
- if (!pending) return;
342
- pendingFocusIsoRef.current = null;
343
- setTimeout(() => {
344
- if (focusDateButtonByIso(pending)) return;
345
- const fallback = getFirstEnabledIsoInView();
346
- if (fallback) focusDateButtonByIso(fallback);
347
- }, 0);
348
- }, [isOpen, viewingMonth, viewingYear]);
349
- const inputClasses = tigercatCore.getDatePickerInputClasses(size, disabled || readonly);
350
- const iconButtonClasses = tigercatCore.getDatePickerIconButtonClasses(size);
351
- return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: tigercatCore.classNames(tigercatCore.datePickerBaseClasses, props.className), ...divProps, children: [
352
- /* @__PURE__ */ jsxRuntime.jsxs("div", { ref: inputWrapperRef, className: tigercatCore.datePickerInputWrapperClasses, children: [
353
- /* @__PURE__ */ jsxRuntime.jsx(
354
- "input",
355
- {
356
- ref: inputRef,
357
- type: "text",
358
- className: inputClasses,
359
- value: displayValue,
360
- placeholder,
361
- disabled,
362
- readOnly: true,
363
- required,
364
- name: props.name,
365
- id: props.id,
366
- onClick: handleInputClick,
367
- "aria-label": placeholder || "Select date"
368
- }
369
- ),
370
- showClearButton && /* @__PURE__ */ jsxRuntime.jsx(
371
- "button",
372
- {
373
- type: "button",
374
- className: tigercatCore.datePickerClearButtonClasses,
375
- onClick: clearDate,
376
- "aria-label": labels.clearDate,
377
- children: /* @__PURE__ */ jsxRuntime.jsx(Icon, { path: tigercatCore.CloseIconPath, className: "w-4 h-4" })
378
- }
379
- ),
380
- /* @__PURE__ */ jsxRuntime.jsx(
381
- "button",
382
- {
383
- type: "button",
384
- className: iconButtonClasses,
385
- disabled: disabled || readonly,
386
- onClick: toggleCalendar,
387
- "aria-label": labels.toggleCalendar,
388
- children: /* @__PURE__ */ jsxRuntime.jsx(Icon, { path: tigercatCore.CalendarIconPath, className: "w-5 h-5" })
389
- }
390
- )
391
- ] }),
392
- isOpen && /* @__PURE__ */ jsxRuntime.jsxs(
393
- "div",
394
- {
395
- ref: calendarRef,
396
- className: tigercatCore.datePickerCalendarClasses,
397
- role: "dialog",
398
- "aria-modal": "true",
399
- "aria-label": labels.calendar,
400
- onKeyDown: handleCalendarKeyDown,
401
- children: [
402
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: tigercatCore.datePickerCalendarHeaderClasses, children: [
403
- /* @__PURE__ */ jsxRuntime.jsx(
404
- "button",
405
- {
406
- type: "button",
407
- className: tigercatCore.datePickerNavButtonClasses,
408
- onClick: previousMonth,
409
- "aria-label": labels.previousMonth,
410
- children: /* @__PURE__ */ jsxRuntime.jsx(Icon, { path: tigercatCore.ChevronLeftIconPath, className: "w-5 h-5" })
411
- }
412
- ),
413
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: tigercatCore.datePickerMonthYearClasses, children: tigercatCore.formatMonthYear(viewingYear, viewingMonth, props.locale) }),
414
- /* @__PURE__ */ jsxRuntime.jsx(
415
- "button",
416
- {
417
- type: "button",
418
- className: tigercatCore.datePickerNavButtonClasses,
419
- onClick: nextMonth,
420
- "aria-label": labels.nextMonth,
421
- children: /* @__PURE__ */ jsxRuntime.jsx(Icon, { path: tigercatCore.ChevronRightIconPath, className: "w-5 h-5" })
422
- }
423
- )
424
- ] }),
425
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: tigercatCore.datePickerCalendarGridClasses, role: "row", children: dayNames.map((day) => /* @__PURE__ */ jsxRuntime.jsx("div", { className: tigercatCore.datePickerDayNameClasses, role: "columnheader", children: day }, day)) }),
426
- /* @__PURE__ */ jsxRuntime.jsx(
427
- "div",
428
- {
429
- className: tigercatCore.datePickerCalendarGridClasses,
430
- role: "grid",
431
- "aria-rowcount": 6,
432
- "aria-colcount": 7,
433
- children: calendarDays.map((date, index) => {
434
- if (!date) return null;
435
- const [rangeStart, rangeEnd] = selectedRange;
436
- const isRangeStart = isRangeMode && rangeStart ? tigercatCore.isSameDay(date, rangeStart) : false;
437
- const isRangeEnd = isRangeMode && rangeEnd ? tigercatCore.isSameDay(date, rangeEnd) : false;
438
- const isInRange = isRangeMode && rangeStart && rangeEnd && tigercatCore.normalizeDate(date) >= tigercatCore.normalizeDate(rangeStart) && tigercatCore.normalizeDate(date) <= tigercatCore.normalizeDate(rangeEnd);
439
- const isSelected = !isRangeMode ? selectedDate ? tigercatCore.isSameDay(date, selectedDate) : false : isRangeStart || isRangeEnd;
440
- const isCurrentMonthDay = isCurrentMonth(date);
441
- const isTodayDay = tigercatCore.isToday(date);
442
- const isSelectingRangeEnd = isRangeMode && Boolean(rangeStart) && !rangeEnd;
443
- const isBeforeRangeStart = isSelectingRangeEnd && rangeStart && tigercatCore.normalizeDate(date) < tigercatCore.normalizeDate(rangeStart);
444
- const isDisabled = isDateDisabled(date) || Boolean(isBeforeRangeStart);
445
- const iso = tigercatCore.formatDate(date, "yyyy-MM-dd");
446
- return /* @__PURE__ */ jsxRuntime.jsx(
447
- "button",
448
- {
449
- type: "button",
450
- className: tigercatCore.getDatePickerDayCellClasses(
451
- isCurrentMonthDay,
452
- isSelected,
453
- isTodayDay,
454
- isDisabled,
455
- Boolean(isInRange),
456
- Boolean(isRangeStart),
457
- Boolean(isRangeEnd)
458
- ),
459
- disabled: isDisabled,
460
- onClick: () => selectDate(date),
461
- role: "gridcell",
462
- "data-date": iso,
463
- onFocus: () => setActiveDateIso(iso),
464
- tabIndex: activeDateIso === iso && !isDisabled ? 0 : -1,
465
- "aria-label": iso,
466
- "aria-selected": isSelected,
467
- "aria-current": isTodayDay ? "date" : void 0,
468
- children: date.getDate()
469
- },
470
- index
471
- );
472
- })
473
- }
474
- ),
475
- isRangeMode && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: tigercatCore.datePickerFooterClasses, children: [
476
- /* @__PURE__ */ jsxRuntime.jsx("button", { type: "button", className: tigercatCore.datePickerFooterButtonClasses, onClick: setToday, children: labels.today }),
477
- /* @__PURE__ */ jsxRuntime.jsx(
478
- "button",
479
- {
480
- type: "button",
481
- className: tigercatCore.datePickerFooterButtonClasses,
482
- onClick: closeCalendar,
483
- children: labels.ok
484
- }
485
- )
486
- ] })
487
- ]
488
- }
489
- )
490
- ] });
491
- };
492
-
493
- exports.DatePicker = DatePicker;