@tonyarbor/components 0.2.0 → 0.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 (140) hide show
  1. package/dist/Avatar.d.mts +42 -0
  2. package/dist/Avatar.d.ts +42 -0
  3. package/dist/Avatar.js +158 -0
  4. package/dist/Avatar.js.map +1 -0
  5. package/dist/Avatar.mjs +7 -0
  6. package/dist/Avatar.mjs.map +1 -0
  7. package/dist/Banner.d.mts +59 -0
  8. package/dist/Banner.d.ts +59 -0
  9. package/dist/Banner.js +222 -0
  10. package/dist/Banner.js.map +1 -0
  11. package/dist/Banner.mjs +7 -0
  12. package/dist/Banner.mjs.map +1 -0
  13. package/dist/Breadcrumbs.d.mts +51 -0
  14. package/dist/Breadcrumbs.d.ts +51 -0
  15. package/dist/Breadcrumbs.js +276 -0
  16. package/dist/Breadcrumbs.js.map +1 -0
  17. package/dist/Breadcrumbs.mjs +7 -0
  18. package/dist/Breadcrumbs.mjs.map +1 -0
  19. package/dist/Checkbox.d.mts +4 -0
  20. package/dist/Checkbox.d.ts +4 -0
  21. package/dist/Checkbox.js +45 -16
  22. package/dist/Checkbox.js.map +1 -1
  23. package/dist/Checkbox.mjs +1 -1
  24. package/dist/DatePicker.d.mts +68 -0
  25. package/dist/DatePicker.d.ts +68 -0
  26. package/dist/DatePicker.js +490 -0
  27. package/dist/DatePicker.js.map +1 -0
  28. package/dist/DatePicker.mjs +7 -0
  29. package/dist/DatePicker.mjs.map +1 -0
  30. package/dist/Pagination.d.mts +36 -0
  31. package/dist/Pagination.d.ts +36 -0
  32. package/dist/Pagination.js +301 -0
  33. package/dist/Pagination.js.map +1 -0
  34. package/dist/Pagination.mjs +7 -0
  35. package/dist/Pagination.mjs.map +1 -0
  36. package/dist/Radio.js +32 -12
  37. package/dist/Radio.js.map +1 -1
  38. package/dist/Radio.mjs +1 -1
  39. package/dist/SearchGlobal.d.mts +45 -0
  40. package/dist/SearchGlobal.d.ts +45 -0
  41. package/dist/SearchGlobal.js +209 -0
  42. package/dist/SearchGlobal.js.map +1 -0
  43. package/dist/SearchGlobal.mjs +7 -0
  44. package/dist/SearchGlobal.mjs.map +1 -0
  45. package/dist/SearchOnPage.d.mts +45 -0
  46. package/dist/SearchOnPage.d.ts +45 -0
  47. package/dist/SearchOnPage.js +171 -0
  48. package/dist/SearchOnPage.js.map +1 -0
  49. package/dist/SearchOnPage.mjs +7 -0
  50. package/dist/SearchOnPage.mjs.map +1 -0
  51. package/dist/Table.d.mts +80 -0
  52. package/dist/Table.d.ts +80 -0
  53. package/dist/Table.js +347 -0
  54. package/dist/Table.js.map +1 -0
  55. package/dist/Table.mjs +8 -0
  56. package/dist/Table.mjs.map +1 -0
  57. package/dist/TableControls.d.mts +76 -0
  58. package/dist/TableControls.d.ts +76 -0
  59. package/dist/TableControls.js +461 -0
  60. package/dist/TableControls.js.map +1 -0
  61. package/dist/TableControls.mjs +7 -0
  62. package/dist/TableControls.mjs.map +1 -0
  63. package/dist/TableFooterPagination.d.mts +56 -0
  64. package/dist/TableFooterPagination.d.ts +56 -0
  65. package/dist/TableFooterPagination.js +499 -0
  66. package/dist/TableFooterPagination.js.map +1 -0
  67. package/dist/TableFooterPagination.mjs +7 -0
  68. package/dist/TableFooterPagination.mjs.map +1 -0
  69. package/dist/Tabs.d.mts +50 -0
  70. package/dist/Tabs.d.ts +50 -0
  71. package/dist/Tabs.js +187 -0
  72. package/dist/Tabs.js.map +1 -0
  73. package/dist/Tabs.mjs +7 -0
  74. package/dist/Tabs.mjs.map +1 -0
  75. package/dist/TextArea.d.mts +64 -0
  76. package/dist/TextArea.d.ts +64 -0
  77. package/dist/TextArea.js +171 -0
  78. package/dist/TextArea.js.map +1 -0
  79. package/dist/TextArea.mjs +7 -0
  80. package/dist/TextArea.mjs.map +1 -0
  81. package/dist/Toast.d.mts +48 -0
  82. package/dist/Toast.d.ts +48 -0
  83. package/dist/Toast.js +169 -0
  84. package/dist/Toast.js.map +1 -0
  85. package/dist/Toast.mjs +7 -0
  86. package/dist/Toast.mjs.map +1 -0
  87. package/dist/Toggle.d.mts +48 -0
  88. package/dist/Toggle.d.ts +48 -0
  89. package/dist/Toggle.js +291 -0
  90. package/dist/Toggle.js.map +1 -0
  91. package/dist/Toggle.mjs +7 -0
  92. package/dist/Toggle.mjs.map +1 -0
  93. package/dist/Tooltip.d.mts +32 -0
  94. package/dist/Tooltip.d.ts +32 -0
  95. package/dist/Tooltip.js +109 -0
  96. package/dist/Tooltip.js.map +1 -0
  97. package/dist/Tooltip.mjs +7 -0
  98. package/dist/Tooltip.mjs.map +1 -0
  99. package/dist/chunk-52TG3BFX.mjs +463 -0
  100. package/dist/chunk-52TG3BFX.mjs.map +1 -0
  101. package/dist/chunk-AI2U34CF.mjs +159 -0
  102. package/dist/chunk-AI2U34CF.mjs.map +1 -0
  103. package/dist/chunk-B7RX3TPX.mjs +135 -0
  104. package/dist/chunk-B7RX3TPX.mjs.map +1 -0
  105. package/dist/chunk-C25FFMRQ.mjs +255 -0
  106. package/dist/chunk-C25FFMRQ.mjs.map +1 -0
  107. package/dist/{chunk-BCYJIUQX.mjs → chunk-CUTYEIFE.mjs} +47 -18
  108. package/dist/chunk-CUTYEIFE.mjs.map +1 -0
  109. package/dist/chunk-DULH2KRW.mjs +133 -0
  110. package/dist/chunk-DULH2KRW.mjs.map +1 -0
  111. package/dist/chunk-G5NVKF2G.mjs +434 -0
  112. package/dist/chunk-G5NVKF2G.mjs.map +1 -0
  113. package/dist/chunk-JSG27ZZS.mjs +122 -0
  114. package/dist/chunk-JSG27ZZS.mjs.map +1 -0
  115. package/dist/{chunk-ARBHNHO7.mjs → chunk-M6DVBEEL.mjs} +33 -13
  116. package/dist/chunk-M6DVBEEL.mjs.map +1 -0
  117. package/dist/chunk-MBUMR2XJ.mjs +135 -0
  118. package/dist/chunk-MBUMR2XJ.mjs.map +1 -0
  119. package/dist/chunk-MNH2TGUX.mjs +73 -0
  120. package/dist/chunk-MNH2TGUX.mjs.map +1 -0
  121. package/dist/chunk-RQP6ZGD7.mjs +240 -0
  122. package/dist/chunk-RQP6ZGD7.mjs.map +1 -0
  123. package/dist/chunk-RRMG2SSZ.mjs +265 -0
  124. package/dist/chunk-RRMG2SSZ.mjs.map +1 -0
  125. package/dist/chunk-U4JXKZZG.mjs +186 -0
  126. package/dist/chunk-U4JXKZZG.mjs.map +1 -0
  127. package/dist/chunk-UPBHDBAK.mjs +173 -0
  128. package/dist/chunk-UPBHDBAK.mjs.map +1 -0
  129. package/dist/chunk-W55QJIAN.mjs +467 -0
  130. package/dist/chunk-W55QJIAN.mjs.map +1 -0
  131. package/dist/chunk-YV4OXFIM.mjs +151 -0
  132. package/dist/chunk-YV4OXFIM.mjs.map +1 -0
  133. package/dist/index.d.mts +15 -0
  134. package/dist/index.d.ts +15 -0
  135. package/dist/index.js +3414 -30
  136. package/dist/index.js.map +1 -1
  137. package/dist/index.mjs +63 -3
  138. package/package.json +78 -1
  139. package/dist/chunk-ARBHNHO7.mjs.map +0 -1
  140. package/dist/chunk-BCYJIUQX.mjs.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/SearchGlobal/SearchGlobal.tsx"],"sourcesContent":["import * as React from 'react';\nimport { Search, X } from 'lucide-react';\n\nexport interface SearchGlobalProps {\n /**\n * Value of the search input\n */\n value?: string;\n /**\n * Callback when value changes\n */\n onChange?: (value: string) => void;\n /**\n * Callback when search is submitted\n */\n onSubmit?: (value: string) => void;\n /**\n * Callback when clear button is clicked\n */\n onClear?: () => void;\n /**\n * Placeholder text\n */\n placeholder?: string;\n /**\n * Custom className\n */\n className?: string;\n /**\n * Custom style\n */\n style?: React.CSSProperties;\n /**\n * Test ID for testing\n */\n 'data-testid'?: string;\n}\n\n/**\n * SearchGlobal component - Arbor Design System\n *\n * A search input that expands from 160px to 300px when focused.\n * Shows keyboard shortcut (⌘ K) on hover and X button when focused.\n */\nexport const SearchGlobal = React.forwardRef<HTMLInputElement, SearchGlobalProps>(\n (\n {\n value = '',\n onChange,\n onSubmit,\n onClear,\n placeholder = 'Search',\n className,\n style,\n 'data-testid': dataTestId,\n },\n ref\n ) => {\n const [isFocused, setIsFocused] = React.useState(false);\n const [isHovered, setIsHovered] = React.useState(false);\n const inputRef = React.useRef<HTMLInputElement>(null);\n\n // Merge refs\n React.useImperativeHandle(ref, () => inputRef.current as HTMLInputElement);\n\n const handleFocus = () => {\n setIsFocused(true);\n };\n\n const handleBlur = () => {\n setIsFocused(false);\n };\n\n const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n onChange?.(e.target.value);\n };\n\n const handleKeyDown = (e: React.KeyboardEvent<HTMLInputElement>) => {\n if (e.key === 'Enter') {\n onSubmit?.(value);\n }\n };\n\n const handleClear = () => {\n onChange?.('');\n onClear?.();\n inputRef.current?.focus();\n };\n\n const containerStyles: React.CSSProperties = {\n position: 'relative',\n width: isFocused ? '300px' : '160px',\n height: '32px',\n backgroundColor: isFocused ? '#ffffff' : isHovered ? '#efefef' : '#f8f8f8',\n borderRadius: '16px',\n padding: '8px 16px',\n display: 'flex',\n alignItems: 'center',\n gap: isFocused ? '8px' : '8px',\n cursor: 'text',\n transition: 'all 0.2s ease-in-out',\n boxSizing: 'border-box',\n border: isFocused ? '1px solid #efefef' : 'none',\n boxShadow: isFocused ? '0px 0px 0px 3px #3cad51' : 'none',\n marginLeft: isFocused ? '-140px' : '0', // Expand to the left\n ...style,\n };\n\n const iconContainerStyles: React.CSSProperties = {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n flexShrink: 0,\n padding: '2px',\n };\n\n const inputStyles: React.CSSProperties = {\n border: 'none',\n outline: 'none',\n backgroundColor: 'transparent',\n fontFamily: \"'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif\",\n fontSize: '13px',\n fontWeight: 400,\n color: '#2f2f2f',\n lineHeight: '1.5',\n flex: 1,\n width: '100%',\n minWidth: 0,\n };\n\n const keyboardShortcutStyles: React.CSSProperties = {\n display: 'flex',\n alignItems: 'center',\n gap: '0px',\n flexShrink: 0,\n };\n\n const keyStyles: React.CSSProperties = {\n border: '1px solid #2f2f2f',\n borderRadius: '5px',\n padding: '0px 3px',\n height: '16px',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n fontFamily: \"'Work Sans', sans-serif\",\n fontSize: '8px',\n fontWeight: 400,\n color: '#2f2f2f',\n letterSpacing: '-0.08px',\n lineHeight: '1.5',\n minWidth: '16px',\n };\n\n const plusStyles: React.CSSProperties = {\n fontFamily: \"'Work Sans', sans-serif\",\n fontSize: '8px',\n fontWeight: 400,\n color: '#2f2f2f',\n letterSpacing: '-0.08px',\n lineHeight: '1.5',\n padding: '0 2px',\n };\n\n const clearButtonStyles: React.CSSProperties = {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n flexShrink: 0,\n width: '16px',\n height: '16px',\n cursor: 'pointer',\n border: 'none',\n background: 'none',\n padding: 0,\n };\n\n const showKeyboardShortcut = isHovered && !isFocused;\n const showClearButton = isFocused;\n\n return (\n <div\n className={className}\n style={containerStyles}\n onMouseEnter={() => setIsHovered(true)}\n onMouseLeave={() => setIsHovered(false)}\n onClick={() => inputRef.current?.focus()}\n data-testid={dataTestId}\n >\n <div style={iconContainerStyles}>\n <Search size={12} color=\"#2f2f2f\" strokeWidth={2} />\n </div>\n\n <input\n ref={inputRef}\n type=\"text\"\n value={value}\n onChange={handleChange}\n onFocus={handleFocus}\n onBlur={handleBlur}\n onKeyDown={handleKeyDown}\n placeholder={isFocused ? '' : placeholder}\n style={inputStyles}\n />\n\n {showKeyboardShortcut && (\n <div style={keyboardShortcutStyles}>\n <div style={keyStyles}>⌘</div>\n <span style={plusStyles}>+</span>\n <div style={keyStyles}>K</div>\n </div>\n )}\n\n {showClearButton && (\n <button\n type=\"button\"\n onClick={handleClear}\n style={clearButtonStyles}\n aria-label=\"Clear search\"\n >\n <X size={13.333} color=\"#2f2f2f\" strokeWidth={2} />\n </button>\n )}\n </div>\n );\n }\n);\n\nSearchGlobal.displayName = 'SearchGlobal';\n"],"mappings":"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","names":[]}
@@ -0,0 +1,467 @@
1
+ // src/DatePicker/DatePicker.tsx
2
+ import * as React from "react";
3
+ import { clsx } from "clsx";
4
+ import * as Popover from "@radix-ui/react-popover";
5
+ import { Calendar, ChevronLeft, ChevronRight } from "lucide-react";
6
+ import {
7
+ format,
8
+ parse,
9
+ isValid,
10
+ startOfMonth,
11
+ endOfMonth,
12
+ eachDayOfInterval,
13
+ isSameDay,
14
+ isToday,
15
+ addMonths,
16
+ subMonths,
17
+ startOfWeek,
18
+ endOfWeek
19
+ } from "date-fns";
20
+ import { jsx, jsxs } from "react/jsx-runtime";
21
+ var wrapperStyles = {
22
+ display: "flex",
23
+ flexDirection: "column",
24
+ gap: "4px"
25
+ };
26
+ var labelStyles = {
27
+ fontSize: "11px",
28
+ fontWeight: 600,
29
+ color: "#2f2f2f",
30
+ textTransform: "uppercase",
31
+ letterSpacing: "0.5px",
32
+ fontFamily: "'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif"
33
+ };
34
+ var inputContainerStyles = {
35
+ position: "relative",
36
+ display: "flex",
37
+ alignItems: "center"
38
+ };
39
+ var inputStyles = {
40
+ width: "100%",
41
+ height: "36px",
42
+ padding: "0 36px 0 12px",
43
+ fontSize: "13px",
44
+ border: "1px solid #d1d1d1",
45
+ borderRadius: "8px",
46
+ outline: "none",
47
+ transition: "all 0.2s ease-in-out",
48
+ fontFamily: "'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif",
49
+ backgroundColor: "#ffffff",
50
+ color: "#2f2f2f"
51
+ };
52
+ var iconButtonStyles = {
53
+ position: "absolute",
54
+ right: "8px",
55
+ display: "flex",
56
+ alignItems: "center",
57
+ justifyContent: "center",
58
+ padding: "4px",
59
+ cursor: "pointer",
60
+ color: "#595959",
61
+ backgroundColor: "transparent",
62
+ border: "none"
63
+ };
64
+ var helperTextStyles = {
65
+ fontSize: "11px",
66
+ color: "#595959",
67
+ fontFamily: "'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif"
68
+ };
69
+ var calendarPopoverStyles = {
70
+ backgroundColor: "#ffffff",
71
+ border: "1px solid #efefef",
72
+ borderRadius: "8px",
73
+ padding: "16px",
74
+ boxShadow: "0 4px 12px rgba(0, 0, 0, 0.1)",
75
+ minWidth: "320px",
76
+ zIndex: 1e3
77
+ };
78
+ var calendarHeaderStyles = {
79
+ display: "flex",
80
+ alignItems: "center",
81
+ justifyContent: "space-between",
82
+ marginBottom: "16px",
83
+ gap: "8px"
84
+ };
85
+ var monthYearContainerStyles = {
86
+ display: "flex",
87
+ gap: "8px",
88
+ flex: 1
89
+ };
90
+ var selectStyles = {
91
+ padding: "6px 8px",
92
+ fontSize: "13px",
93
+ border: "1px solid #d1d1d1",
94
+ borderRadius: "6px",
95
+ backgroundColor: "#ffffff",
96
+ color: "#2f2f2f",
97
+ cursor: "pointer",
98
+ fontFamily: "'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif",
99
+ outline: "none"
100
+ };
101
+ var navButtonStyles = {
102
+ display: "flex",
103
+ alignItems: "center",
104
+ justifyContent: "center",
105
+ width: "28px",
106
+ height: "28px",
107
+ border: "none",
108
+ backgroundColor: "transparent",
109
+ cursor: "pointer",
110
+ borderRadius: "4px",
111
+ color: "#2f2f2f",
112
+ transition: "background-color 0.2s"
113
+ };
114
+ var weekDaysStyles = {
115
+ display: "grid",
116
+ gridTemplateColumns: "repeat(7, 1fr)",
117
+ gap: "4px",
118
+ marginBottom: "8px"
119
+ };
120
+ var weekDayStyles = {
121
+ fontSize: "11px",
122
+ fontWeight: 600,
123
+ color: "#7e7e7e",
124
+ textAlign: "center",
125
+ padding: "4px",
126
+ fontFamily: "'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif"
127
+ };
128
+ var daysGridStyles = {
129
+ display: "grid",
130
+ gridTemplateColumns: "repeat(7, 1fr)",
131
+ gap: "4px"
132
+ };
133
+ var dayButtonStyles = {
134
+ width: "36px",
135
+ height: "36px",
136
+ display: "flex",
137
+ alignItems: "center",
138
+ justifyContent: "center",
139
+ border: "none",
140
+ backgroundColor: "transparent",
141
+ borderRadius: "50%",
142
+ cursor: "pointer",
143
+ fontSize: "13px",
144
+ color: "#2f2f2f",
145
+ fontFamily: "'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif",
146
+ transition: "all 0.2s"
147
+ };
148
+ var footerStyles = {
149
+ display: "flex",
150
+ justifyContent: "flex-end",
151
+ marginTop: "12px",
152
+ paddingTop: "12px",
153
+ borderTop: "1px solid #efefef"
154
+ };
155
+ var todayButtonStyles = {
156
+ padding: "6px 12px",
157
+ fontSize: "13px",
158
+ fontWeight: 500,
159
+ color: "#16a33d",
160
+ backgroundColor: "transparent",
161
+ border: "none",
162
+ cursor: "pointer",
163
+ borderRadius: "6px",
164
+ fontFamily: "'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif",
165
+ transition: "background-color 0.2s"
166
+ };
167
+ var MONTHS = [
168
+ "January",
169
+ "February",
170
+ "March",
171
+ "April",
172
+ "May",
173
+ "June",
174
+ "July",
175
+ "August",
176
+ "September",
177
+ "October",
178
+ "November",
179
+ "December"
180
+ ];
181
+ var WEEKDAYS = ["Mo", "Tu", "We", "Th", "Fr", "Sa", "Su"];
182
+ var DatePicker = React.forwardRef(
183
+ ({
184
+ value,
185
+ onChange,
186
+ label,
187
+ placeholder = "DD/MM/YYYY",
188
+ helperText,
189
+ error,
190
+ state = "default",
191
+ disabled = false,
192
+ className,
193
+ style,
194
+ "data-testid": dataTestId,
195
+ minDate,
196
+ maxDate,
197
+ dateFormat = "dd/MM/yyyy"
198
+ }, ref) => {
199
+ const [open, setOpen] = React.useState(false);
200
+ const [inputValue, setInputValue] = React.useState("");
201
+ const [viewDate, setViewDate] = React.useState(value || /* @__PURE__ */ new Date());
202
+ const inputId = React.useId();
203
+ React.useEffect(() => {
204
+ if (value && isValid(value)) {
205
+ setInputValue(format(value, dateFormat));
206
+ } else {
207
+ setInputValue("");
208
+ }
209
+ }, [value, dateFormat]);
210
+ React.useEffect(() => {
211
+ if (value && isValid(value)) {
212
+ setViewDate(value);
213
+ }
214
+ }, [value]);
215
+ const handleInputChange = (e) => {
216
+ const newValue = e.target.value;
217
+ setInputValue(newValue);
218
+ const parsedDate = parse(newValue, dateFormat, /* @__PURE__ */ new Date());
219
+ if (isValid(parsedDate)) {
220
+ onChange?.(parsedDate);
221
+ setViewDate(parsedDate);
222
+ }
223
+ };
224
+ const handleInputBlur = () => {
225
+ if (value && isValid(value)) {
226
+ setInputValue(format(value, dateFormat));
227
+ } else if (!inputValue) {
228
+ onChange?.(void 0);
229
+ }
230
+ };
231
+ const handleDateSelect = (date) => {
232
+ onChange?.(date);
233
+ setOpen(false);
234
+ };
235
+ const handleTodayClick = () => {
236
+ const today = /* @__PURE__ */ new Date();
237
+ onChange?.(today);
238
+ setViewDate(today);
239
+ setOpen(false);
240
+ };
241
+ const handleMonthChange = (e) => {
242
+ const newMonth = parseInt(e.target.value, 10);
243
+ const newDate = new Date(viewDate);
244
+ newDate.setMonth(newMonth);
245
+ setViewDate(newDate);
246
+ };
247
+ const handleYearChange = (e) => {
248
+ const newYear = parseInt(e.target.value, 10);
249
+ const newDate = new Date(viewDate);
250
+ newDate.setFullYear(newYear);
251
+ setViewDate(newDate);
252
+ };
253
+ const handlePrevMonth = () => {
254
+ setViewDate(subMonths(viewDate, 1));
255
+ };
256
+ const handleNextMonth = () => {
257
+ setViewDate(addMonths(viewDate, 1));
258
+ };
259
+ const monthStart = startOfMonth(viewDate);
260
+ const monthEnd = endOfMonth(viewDate);
261
+ const startDate = startOfWeek(monthStart, { weekStartsOn: 1 });
262
+ const endDate = endOfWeek(monthEnd, { weekStartsOn: 1 });
263
+ const days = eachDayOfInterval({ start: startDate, end: endDate });
264
+ const isDateDisabled = (date) => {
265
+ if (minDate && date < minDate) return true;
266
+ if (maxDate && date > maxDate) return true;
267
+ return false;
268
+ };
269
+ const currentYear = viewDate.getFullYear();
270
+ const yearOptions = Array.from({ length: 201 }, (_, i) => currentYear - 100 + i);
271
+ const currentState = error ? "error" : state;
272
+ const getInputStyles = () => {
273
+ const styles = { ...inputStyles };
274
+ if (disabled) {
275
+ styles.backgroundColor = "#f8f8f8";
276
+ styles.borderColor = "#efefef";
277
+ styles.color = "#7e7e7e";
278
+ styles.cursor = "not-allowed";
279
+ } else if (currentState === "error") {
280
+ styles.borderColor = "#e02f1d";
281
+ } else if (currentState === "success") {
282
+ styles.borderColor = "#16a33d";
283
+ }
284
+ return styles;
285
+ };
286
+ return /* @__PURE__ */ jsxs(
287
+ "div",
288
+ {
289
+ className: clsx("arbor-datepicker-wrapper", className),
290
+ style: { ...wrapperStyles, ...style },
291
+ "data-testid": dataTestId,
292
+ children: [
293
+ label && /* @__PURE__ */ jsx("label", { htmlFor: inputId, style: labelStyles, children: label }),
294
+ /* @__PURE__ */ jsxs(Popover.Root, { open, onOpenChange: setOpen, children: [
295
+ /* @__PURE__ */ jsxs("div", { style: inputContainerStyles, children: [
296
+ /* @__PURE__ */ jsx(
297
+ "input",
298
+ {
299
+ ref,
300
+ id: inputId,
301
+ type: "text",
302
+ value: inputValue,
303
+ onChange: handleInputChange,
304
+ onBlur: handleInputBlur,
305
+ placeholder,
306
+ disabled,
307
+ style: getInputStyles(),
308
+ "aria-label": label || "Date picker"
309
+ }
310
+ ),
311
+ /* @__PURE__ */ jsx(Popover.Trigger, { asChild: true, children: /* @__PURE__ */ jsx(
312
+ "button",
313
+ {
314
+ type: "button",
315
+ style: {
316
+ ...iconButtonStyles,
317
+ cursor: disabled ? "not-allowed" : "pointer"
318
+ },
319
+ disabled,
320
+ "aria-label": "Open calendar",
321
+ children: /* @__PURE__ */ jsx(Calendar, { size: 16 })
322
+ }
323
+ ) })
324
+ ] }),
325
+ /* @__PURE__ */ jsx(Popover.Portal, { children: /* @__PURE__ */ jsxs(
326
+ Popover.Content,
327
+ {
328
+ align: "start",
329
+ sideOffset: 4,
330
+ style: calendarPopoverStyles,
331
+ children: [
332
+ /* @__PURE__ */ jsxs("div", { style: calendarHeaderStyles, children: [
333
+ /* @__PURE__ */ jsx(
334
+ "button",
335
+ {
336
+ type: "button",
337
+ onClick: handlePrevMonth,
338
+ style: navButtonStyles,
339
+ onMouseEnter: (e) => {
340
+ e.currentTarget.style.backgroundColor = "#f8f8f8";
341
+ },
342
+ onMouseLeave: (e) => {
343
+ e.currentTarget.style.backgroundColor = "transparent";
344
+ },
345
+ "aria-label": "Previous month",
346
+ children: /* @__PURE__ */ jsx(ChevronLeft, { size: 16 })
347
+ }
348
+ ),
349
+ /* @__PURE__ */ jsxs("div", { style: monthYearContainerStyles, children: [
350
+ /* @__PURE__ */ jsx(
351
+ "select",
352
+ {
353
+ value: viewDate.getMonth(),
354
+ onChange: handleMonthChange,
355
+ style: selectStyles,
356
+ "aria-label": "Select month",
357
+ children: MONTHS.map((month, index) => /* @__PURE__ */ jsx("option", { value: index, children: month }, month))
358
+ }
359
+ ),
360
+ /* @__PURE__ */ jsx(
361
+ "select",
362
+ {
363
+ value: viewDate.getFullYear(),
364
+ onChange: handleYearChange,
365
+ style: selectStyles,
366
+ "aria-label": "Select year",
367
+ children: yearOptions.map((year) => /* @__PURE__ */ jsx("option", { value: year, children: year }, year))
368
+ }
369
+ )
370
+ ] }),
371
+ /* @__PURE__ */ jsx(
372
+ "button",
373
+ {
374
+ type: "button",
375
+ onClick: handleNextMonth,
376
+ style: navButtonStyles,
377
+ onMouseEnter: (e) => {
378
+ e.currentTarget.style.backgroundColor = "#f8f8f8";
379
+ },
380
+ onMouseLeave: (e) => {
381
+ e.currentTarget.style.backgroundColor = "transparent";
382
+ },
383
+ "aria-label": "Next month",
384
+ children: /* @__PURE__ */ jsx(ChevronRight, { size: 16 })
385
+ }
386
+ )
387
+ ] }),
388
+ /* @__PURE__ */ jsx("div", { style: weekDaysStyles, children: WEEKDAYS.map((day) => /* @__PURE__ */ jsx("div", { style: weekDayStyles, children: day }, day)) }),
389
+ /* @__PURE__ */ jsx("div", { style: daysGridStyles, children: days.map((day) => {
390
+ const isCurrentMonth = day.getMonth() === viewDate.getMonth();
391
+ const isSelected = value && isSameDay(day, value);
392
+ const isTodayDate = isToday(day);
393
+ const isDayDisabled = isDateDisabled(day);
394
+ const getDayButtonStyles = () => {
395
+ const styles = { ...dayButtonStyles };
396
+ if (!isCurrentMonth) {
397
+ styles.color = "#d1d1d1";
398
+ }
399
+ if (isDayDisabled) {
400
+ styles.color = "#d1d1d1";
401
+ styles.cursor = "not-allowed";
402
+ }
403
+ if (isSelected) {
404
+ styles.backgroundColor = "#3cad51";
405
+ styles.color = "#ffffff";
406
+ } else if (isTodayDate && !isDayDisabled) {
407
+ styles.fontWeight = 600;
408
+ styles.color = "#16a33d";
409
+ }
410
+ return styles;
411
+ };
412
+ return /* @__PURE__ */ jsx(
413
+ "button",
414
+ {
415
+ type: "button",
416
+ onClick: () => !isDayDisabled && handleDateSelect(day),
417
+ disabled: isDayDisabled,
418
+ style: getDayButtonStyles(),
419
+ onMouseEnter: (e) => {
420
+ if (!isSelected && !isDayDisabled && isCurrentMonth) {
421
+ e.currentTarget.style.backgroundColor = "#f8f8f8";
422
+ }
423
+ },
424
+ onMouseLeave: (e) => {
425
+ if (!isSelected) {
426
+ e.currentTarget.style.backgroundColor = "transparent";
427
+ }
428
+ },
429
+ "aria-label": format(day, "MMMM d, yyyy"),
430
+ "aria-selected": isSelected,
431
+ children: format(day, "d")
432
+ },
433
+ day.toISOString()
434
+ );
435
+ }) }),
436
+ /* @__PURE__ */ jsx("div", { style: footerStyles, children: /* @__PURE__ */ jsx(
437
+ "button",
438
+ {
439
+ type: "button",
440
+ onClick: handleTodayClick,
441
+ style: todayButtonStyles,
442
+ onMouseEnter: (e) => {
443
+ e.currentTarget.style.backgroundColor = "#f8f8f8";
444
+ },
445
+ onMouseLeave: (e) => {
446
+ e.currentTarget.style.backgroundColor = "transparent";
447
+ },
448
+ children: "Today"
449
+ }
450
+ ) })
451
+ ]
452
+ }
453
+ ) })
454
+ ] }),
455
+ error && /* @__PURE__ */ jsx("span", { style: { ...helperTextStyles, color: "#e02f1d" }, children: error }),
456
+ !error && helperText && /* @__PURE__ */ jsx("span", { style: helperTextStyles, children: helperText })
457
+ ]
458
+ }
459
+ );
460
+ }
461
+ );
462
+ DatePicker.displayName = "DatePicker";
463
+
464
+ export {
465
+ DatePicker
466
+ };
467
+ //# sourceMappingURL=chunk-W55QJIAN.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/DatePicker/DatePicker.tsx"],"sourcesContent":["import * as React from 'react';\nimport { clsx } from 'clsx';\nimport * as Popover from '@radix-ui/react-popover';\nimport { Calendar, ChevronLeft, ChevronRight } from 'lucide-react';\nimport {\n format,\n parse,\n isValid,\n startOfMonth,\n endOfMonth,\n eachDayOfInterval,\n isSameDay,\n isToday,\n addMonths,\n subMonths,\n startOfWeek,\n endOfWeek,\n} from 'date-fns';\n\nexport interface DatePickerProps {\n /**\n * The selected date value\n */\n value?: Date;\n /**\n * Callback when date changes\n */\n onChange?: (date: Date | undefined) => void;\n /**\n * Label for the input\n */\n label?: string;\n /**\n * Placeholder text\n */\n placeholder?: string;\n /**\n * Helper text below the input\n */\n helperText?: string;\n /**\n * Error message\n */\n error?: string;\n /**\n * Success state\n */\n state?: 'default' | 'success' | 'error';\n /**\n * Whether the input is disabled\n */\n disabled?: boolean;\n /**\n * Custom className\n */\n className?: string;\n /**\n * Custom style\n */\n style?: React.CSSProperties;\n /**\n * Test ID for testing\n */\n 'data-testid'?: string;\n /**\n * Minimum selectable date\n */\n minDate?: Date;\n /**\n * Maximum selectable date\n */\n maxDate?: Date;\n /**\n * Date format string (default: dd/MM/yyyy)\n */\n dateFormat?: string;\n}\n\nconst wrapperStyles: React.CSSProperties = {\n display: 'flex',\n flexDirection: 'column',\n gap: '4px',\n};\n\nconst labelStyles: React.CSSProperties = {\n fontSize: '11px',\n fontWeight: 600,\n color: '#2f2f2f',\n textTransform: 'uppercase',\n letterSpacing: '0.5px',\n fontFamily: \"'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif\",\n};\n\nconst inputContainerStyles: React.CSSProperties = {\n position: 'relative',\n display: 'flex',\n alignItems: 'center',\n};\n\nconst inputStyles: React.CSSProperties = {\n width: '100%',\n height: '36px',\n padding: '0 36px 0 12px',\n fontSize: '13px',\n border: '1px solid #d1d1d1',\n borderRadius: '8px',\n outline: 'none',\n transition: 'all 0.2s ease-in-out',\n fontFamily: \"'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif\",\n backgroundColor: '#ffffff',\n color: '#2f2f2f',\n};\n\nconst iconButtonStyles: React.CSSProperties = {\n position: 'absolute',\n right: '8px',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n padding: '4px',\n cursor: 'pointer',\n color: '#595959',\n backgroundColor: 'transparent',\n border: 'none',\n};\n\nconst helperTextStyles: React.CSSProperties = {\n fontSize: '11px',\n color: '#595959',\n fontFamily: \"'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif\",\n};\n\nconst calendarPopoverStyles: React.CSSProperties = {\n backgroundColor: '#ffffff',\n border: '1px solid #efefef',\n borderRadius: '8px',\n padding: '16px',\n boxShadow: '0 4px 12px rgba(0, 0, 0, 0.1)',\n minWidth: '320px',\n zIndex: 1000,\n};\n\nconst calendarHeaderStyles: React.CSSProperties = {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n marginBottom: '16px',\n gap: '8px',\n};\n\nconst monthYearContainerStyles: React.CSSProperties = {\n display: 'flex',\n gap: '8px',\n flex: 1,\n};\n\nconst selectStyles: React.CSSProperties = {\n padding: '6px 8px',\n fontSize: '13px',\n border: '1px solid #d1d1d1',\n borderRadius: '6px',\n backgroundColor: '#ffffff',\n color: '#2f2f2f',\n cursor: 'pointer',\n fontFamily: \"'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif\",\n outline: 'none',\n};\n\nconst navButtonStyles: React.CSSProperties = {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: '28px',\n height: '28px',\n border: 'none',\n backgroundColor: 'transparent',\n cursor: 'pointer',\n borderRadius: '4px',\n color: '#2f2f2f',\n transition: 'background-color 0.2s',\n};\n\nconst weekDaysStyles: React.CSSProperties = {\n display: 'grid',\n gridTemplateColumns: 'repeat(7, 1fr)',\n gap: '4px',\n marginBottom: '8px',\n};\n\nconst weekDayStyles: React.CSSProperties = {\n fontSize: '11px',\n fontWeight: 600,\n color: '#7e7e7e',\n textAlign: 'center',\n padding: '4px',\n fontFamily: \"'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif\",\n};\n\nconst daysGridStyles: React.CSSProperties = {\n display: 'grid',\n gridTemplateColumns: 'repeat(7, 1fr)',\n gap: '4px',\n};\n\nconst dayButtonStyles: React.CSSProperties = {\n width: '36px',\n height: '36px',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n border: 'none',\n backgroundColor: 'transparent',\n borderRadius: '50%',\n cursor: 'pointer',\n fontSize: '13px',\n color: '#2f2f2f',\n fontFamily: \"'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif\",\n transition: 'all 0.2s',\n};\n\nconst footerStyles: React.CSSProperties = {\n display: 'flex',\n justifyContent: 'flex-end',\n marginTop: '12px',\n paddingTop: '12px',\n borderTop: '1px solid #efefef',\n};\n\nconst todayButtonStyles: React.CSSProperties = {\n padding: '6px 12px',\n fontSize: '13px',\n fontWeight: 500,\n color: '#16a33d',\n backgroundColor: 'transparent',\n border: 'none',\n cursor: 'pointer',\n borderRadius: '6px',\n fontFamily: \"'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif\",\n transition: 'background-color 0.2s',\n};\n\nconst MONTHS = [\n 'January', 'February', 'March', 'April', 'May', 'June',\n 'July', 'August', 'September', 'October', 'November', 'December'\n];\n\nconst WEEKDAYS = ['Mo', 'Tu', 'We', 'Th', 'Fr', 'Sa', 'Su'];\n\n/**\n * DatePicker component - Arbor Design System\n *\n * A date picker with calendar popup for selecting dates.\n */\nexport const DatePicker = React.forwardRef<HTMLInputElement, DatePickerProps>(\n (\n {\n value,\n onChange,\n label,\n placeholder = 'DD/MM/YYYY',\n helperText,\n error,\n state = 'default',\n disabled = false,\n className,\n style,\n 'data-testid': dataTestId,\n minDate,\n maxDate,\n dateFormat = 'dd/MM/yyyy',\n },\n ref\n ) => {\n const [open, setOpen] = React.useState(false);\n const [inputValue, setInputValue] = React.useState('');\n const [viewDate, setViewDate] = React.useState(value || new Date());\n const inputId = React.useId();\n\n // Sync input value with prop value\n React.useEffect(() => {\n if (value && isValid(value)) {\n setInputValue(format(value, dateFormat));\n } else {\n setInputValue('');\n }\n }, [value, dateFormat]);\n\n // Update view date when value changes\n React.useEffect(() => {\n if (value && isValid(value)) {\n setViewDate(value);\n }\n }, [value]);\n\n const handleInputChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n const newValue = e.target.value;\n setInputValue(newValue);\n\n // Try to parse the input\n const parsedDate = parse(newValue, dateFormat, new Date());\n if (isValid(parsedDate)) {\n onChange?.(parsedDate);\n setViewDate(parsedDate);\n }\n };\n\n const handleInputBlur = () => {\n // If input is invalid, reset to current value\n if (value && isValid(value)) {\n setInputValue(format(value, dateFormat));\n } else if (!inputValue) {\n onChange?.(undefined);\n }\n };\n\n const handleDateSelect = (date: Date) => {\n onChange?.(date);\n setOpen(false);\n };\n\n const handleTodayClick = () => {\n const today = new Date();\n onChange?.(today);\n setViewDate(today);\n setOpen(false);\n };\n\n const handleMonthChange = (e: React.ChangeEvent<HTMLSelectElement>) => {\n const newMonth = parseInt(e.target.value, 10);\n const newDate = new Date(viewDate);\n newDate.setMonth(newMonth);\n setViewDate(newDate);\n };\n\n const handleYearChange = (e: React.ChangeEvent<HTMLSelectElement>) => {\n const newYear = parseInt(e.target.value, 10);\n const newDate = new Date(viewDate);\n newDate.setFullYear(newYear);\n setViewDate(newDate);\n };\n\n const handlePrevMonth = () => {\n setViewDate(subMonths(viewDate, 1));\n };\n\n const handleNextMonth = () => {\n setViewDate(addMonths(viewDate, 1));\n };\n\n // Get days to display in calendar\n const monthStart = startOfMonth(viewDate);\n const monthEnd = endOfMonth(viewDate);\n const startDate = startOfWeek(monthStart, { weekStartsOn: 1 }); // Start week on Monday\n const endDate = endOfWeek(monthEnd, { weekStartsOn: 1 });\n const days = eachDayOfInterval({ start: startDate, end: endDate });\n\n // Check if date is selectable\n const isDateDisabled = (date: Date) => {\n if (minDate && date < minDate) return true;\n if (maxDate && date > maxDate) return true;\n return false;\n };\n\n // Generate year options (current year ± 100 years)\n const currentYear = viewDate.getFullYear();\n const yearOptions = Array.from({ length: 201 }, (_, i) => currentYear - 100 + i);\n\n const currentState = error ? 'error' : state;\n\n const getInputStyles = (): React.CSSProperties => {\n const styles = { ...inputStyles };\n\n if (disabled) {\n styles.backgroundColor = '#f8f8f8';\n styles.borderColor = '#efefef';\n styles.color = '#7e7e7e';\n styles.cursor = 'not-allowed';\n } else if (currentState === 'error') {\n styles.borderColor = '#e02f1d';\n } else if (currentState === 'success') {\n styles.borderColor = '#16a33d';\n }\n\n return styles;\n };\n\n return (\n <div\n className={clsx('arbor-datepicker-wrapper', className)}\n style={{ ...wrapperStyles, ...style }}\n data-testid={dataTestId}\n >\n {label && (\n <label htmlFor={inputId} style={labelStyles}>\n {label}\n </label>\n )}\n <Popover.Root open={open} onOpenChange={setOpen}>\n <div style={inputContainerStyles}>\n <input\n ref={ref}\n id={inputId}\n type=\"text\"\n value={inputValue}\n onChange={handleInputChange}\n onBlur={handleInputBlur}\n placeholder={placeholder}\n disabled={disabled}\n style={getInputStyles()}\n aria-label={label || 'Date picker'}\n />\n <Popover.Trigger asChild>\n <button\n type=\"button\"\n style={{\n ...iconButtonStyles,\n cursor: disabled ? 'not-allowed' : 'pointer',\n }}\n disabled={disabled}\n aria-label=\"Open calendar\"\n >\n <Calendar size={16} />\n </button>\n </Popover.Trigger>\n </div>\n\n <Popover.Portal>\n <Popover.Content\n align=\"start\"\n sideOffset={4}\n style={calendarPopoverStyles}\n >\n {/* Calendar Header */}\n <div style={calendarHeaderStyles}>\n <button\n type=\"button\"\n onClick={handlePrevMonth}\n style={navButtonStyles}\n onMouseEnter={(e) => {\n e.currentTarget.style.backgroundColor = '#f8f8f8';\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.backgroundColor = 'transparent';\n }}\n aria-label=\"Previous month\"\n >\n <ChevronLeft size={16} />\n </button>\n\n <div style={monthYearContainerStyles}>\n <select\n value={viewDate.getMonth()}\n onChange={handleMonthChange}\n style={selectStyles}\n aria-label=\"Select month\"\n >\n {MONTHS.map((month, index) => (\n <option key={month} value={index}>\n {month}\n </option>\n ))}\n </select>\n\n <select\n value={viewDate.getFullYear()}\n onChange={handleYearChange}\n style={selectStyles}\n aria-label=\"Select year\"\n >\n {yearOptions.map((year) => (\n <option key={year} value={year}>\n {year}\n </option>\n ))}\n </select>\n </div>\n\n <button\n type=\"button\"\n onClick={handleNextMonth}\n style={navButtonStyles}\n onMouseEnter={(e) => {\n e.currentTarget.style.backgroundColor = '#f8f8f8';\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.backgroundColor = 'transparent';\n }}\n aria-label=\"Next month\"\n >\n <ChevronRight size={16} />\n </button>\n </div>\n\n {/* Weekday Headers */}\n <div style={weekDaysStyles}>\n {WEEKDAYS.map((day) => (\n <div key={day} style={weekDayStyles}>\n {day}\n </div>\n ))}\n </div>\n\n {/* Days Grid */}\n <div style={daysGridStyles}>\n {days.map((day) => {\n const isCurrentMonth = day.getMonth() === viewDate.getMonth();\n const isSelected = value && isSameDay(day, value);\n const isTodayDate = isToday(day);\n const isDayDisabled = isDateDisabled(day);\n\n const getDayButtonStyles = (): React.CSSProperties => {\n const styles = { ...dayButtonStyles };\n\n if (!isCurrentMonth) {\n styles.color = '#d1d1d1';\n }\n\n if (isDayDisabled) {\n styles.color = '#d1d1d1';\n styles.cursor = 'not-allowed';\n }\n\n if (isSelected) {\n styles.backgroundColor = '#3cad51';\n styles.color = '#ffffff';\n } else if (isTodayDate && !isDayDisabled) {\n styles.fontWeight = 600;\n styles.color = '#16a33d';\n }\n\n return styles;\n };\n\n return (\n <button\n key={day.toISOString()}\n type=\"button\"\n onClick={() => !isDayDisabled && handleDateSelect(day)}\n disabled={isDayDisabled}\n style={getDayButtonStyles()}\n onMouseEnter={(e) => {\n if (!isSelected && !isDayDisabled && isCurrentMonth) {\n e.currentTarget.style.backgroundColor = '#f8f8f8';\n }\n }}\n onMouseLeave={(e) => {\n if (!isSelected) {\n e.currentTarget.style.backgroundColor = 'transparent';\n }\n }}\n aria-label={format(day, 'MMMM d, yyyy')}\n aria-selected={isSelected}\n >\n {format(day, 'd')}\n </button>\n );\n })}\n </div>\n\n {/* Footer with Today button */}\n <div style={footerStyles}>\n <button\n type=\"button\"\n onClick={handleTodayClick}\n style={todayButtonStyles}\n onMouseEnter={(e) => {\n e.currentTarget.style.backgroundColor = '#f8f8f8';\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.backgroundColor = 'transparent';\n }}\n >\n Today\n </button>\n </div>\n </Popover.Content>\n </Popover.Portal>\n </Popover.Root>\n\n {error && (\n <span style={{ ...helperTextStyles, color: '#e02f1d' }}>{error}</span>\n )}\n {!error && helperText && (\n <span style={helperTextStyles}>{helperText}</span>\n )}\n </div>\n );\n }\n);\n\nDatePicker.displayName = 'DatePicker';\n"],"mappings":"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","names":[]}