@shipfox/react-ui 0.11.0 → 0.13.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 (115) hide show
  1. package/.turbo/turbo-build.log +6 -6
  2. package/.turbo/turbo-check.log +2 -2
  3. package/.turbo/turbo-type.log +1 -1
  4. package/CHANGELOG.md +12 -0
  5. package/dist/components/badge/index.d.ts +4 -4
  6. package/dist/components/badge/index.d.ts.map +1 -1
  7. package/dist/components/badge/index.js +4 -4
  8. package/dist/components/badge/index.js.map +1 -1
  9. package/dist/components/calendar/calendar.d.ts +5 -0
  10. package/dist/components/calendar/calendar.d.ts.map +1 -0
  11. package/dist/components/calendar/calendar.js +46 -0
  12. package/dist/components/calendar/calendar.js.map +1 -0
  13. package/dist/components/calendar/index.d.ts +2 -0
  14. package/dist/components/calendar/index.d.ts.map +1 -0
  15. package/dist/components/calendar/index.js +3 -0
  16. package/dist/components/calendar/index.js.map +1 -0
  17. package/dist/components/date-picker/date-picker.d.ts +19 -0
  18. package/dist/components/date-picker/date-picker.d.ts.map +1 -0
  19. package/dist/components/date-picker/date-picker.js +114 -0
  20. package/dist/components/date-picker/date-picker.js.map +1 -0
  21. package/dist/components/date-picker/date-picker.stories.js +333 -0
  22. package/dist/components/date-picker/date-picker.stories.js.map +1 -0
  23. package/dist/components/date-picker/index.d.ts +2 -0
  24. package/dist/components/date-picker/index.d.ts.map +1 -0
  25. package/dist/components/date-picker/index.js +3 -0
  26. package/dist/components/date-picker/index.js.map +1 -0
  27. package/dist/components/date-time-range-picker/date-time-range-picker.d.ts +24 -0
  28. package/dist/components/date-time-range-picker/date-time-range-picker.d.ts.map +1 -0
  29. package/dist/components/date-time-range-picker/date-time-range-picker.js +130 -0
  30. package/dist/components/date-time-range-picker/date-time-range-picker.js.map +1 -0
  31. package/dist/components/date-time-range-picker/index.d.ts +2 -0
  32. package/dist/components/date-time-range-picker/index.d.ts.map +1 -0
  33. package/dist/components/date-time-range-picker/index.js +3 -0
  34. package/dist/components/date-time-range-picker/index.js.map +1 -0
  35. package/dist/components/dropdown-menu/index.d.ts +1 -2
  36. package/dist/components/dropdown-menu/index.d.ts.map +1 -1
  37. package/dist/components/dropdown-menu/index.js +1 -1
  38. package/dist/components/dropdown-menu/index.js.map +1 -1
  39. package/dist/components/index.d.ts +6 -0
  40. package/dist/components/index.d.ts.map +1 -1
  41. package/dist/components/index.js +6 -0
  42. package/dist/components/index.js.map +1 -1
  43. package/dist/components/inline-tips/inline-tips.stories.js +5 -0
  44. package/dist/components/inline-tips/inline-tips.stories.js.map +1 -1
  45. package/dist/components/item/item.stories.js +15 -8
  46. package/dist/components/item/item.stories.js.map +1 -1
  47. package/dist/components/modal/index.d.ts +1 -2
  48. package/dist/components/modal/index.d.ts.map +1 -1
  49. package/dist/components/modal/index.js +1 -1
  50. package/dist/components/modal/index.js.map +1 -1
  51. package/dist/components/modal/modal.d.ts +2 -1
  52. package/dist/components/modal/modal.d.ts.map +1 -1
  53. package/dist/components/modal/modal.js +5 -3
  54. package/dist/components/modal/modal.js.map +1 -1
  55. package/dist/components/modal/modal.stories.js +16 -6
  56. package/dist/components/modal/modal.stories.js.map +1 -1
  57. package/dist/components/popover/index.d.ts +2 -0
  58. package/dist/components/popover/index.d.ts.map +1 -0
  59. package/dist/components/popover/index.js +3 -0
  60. package/dist/components/popover/index.js.map +1 -0
  61. package/dist/components/popover/popover.d.ts +10 -0
  62. package/dist/components/popover/popover.d.ts.map +1 -0
  63. package/dist/components/popover/popover.js +47 -0
  64. package/dist/components/popover/popover.js.map +1 -0
  65. package/dist/components/tabs/index.d.ts +2 -0
  66. package/dist/components/tabs/index.d.ts.map +1 -0
  67. package/dist/components/tabs/index.js +3 -0
  68. package/dist/components/tabs/index.js.map +1 -0
  69. package/dist/components/tabs/tabs.d.ts +50 -0
  70. package/dist/components/tabs/tabs.d.ts.map +1 -0
  71. package/dist/components/tabs/tabs.js +243 -0
  72. package/dist/components/tabs/tabs.js.map +1 -0
  73. package/dist/components/tabs/tabs.stories.js +179 -0
  74. package/dist/components/tabs/tabs.stories.js.map +1 -0
  75. package/dist/components/textarea/textarea.stories.js +8 -2
  76. package/dist/components/textarea/textarea.stories.js.map +1 -1
  77. package/dist/components/toast/index.d.ts +2 -2
  78. package/dist/components/toast/index.d.ts.map +1 -1
  79. package/dist/components/toast/index.js +2 -2
  80. package/dist/components/toast/index.js.map +1 -1
  81. package/dist/styles.css +1 -1
  82. package/dist/utils/debounce.d.ts +2 -0
  83. package/dist/utils/debounce.d.ts.map +1 -0
  84. package/dist/utils/debounce.js +13 -0
  85. package/dist/utils/debounce.js.map +1 -0
  86. package/dist/utils/index.d.ts +1 -0
  87. package/dist/utils/index.d.ts.map +1 -1
  88. package/dist/utils/index.js +1 -0
  89. package/dist/utils/index.js.map +1 -1
  90. package/index.css +3 -0
  91. package/package.json +1 -1
  92. package/src/components/badge/index.ts +4 -4
  93. package/src/components/calendar/calendar.tsx +90 -0
  94. package/src/components/calendar/index.ts +1 -0
  95. package/src/components/date-picker/date-picker.stories.tsx +230 -0
  96. package/src/components/date-picker/date-picker.tsx +179 -0
  97. package/src/components/date-picker/index.ts +1 -0
  98. package/src/components/date-time-range-picker/date-time-range-picker.tsx +211 -0
  99. package/src/components/date-time-range-picker/index.ts +1 -0
  100. package/src/components/dropdown-menu/index.ts +1 -29
  101. package/src/components/index.ts +6 -0
  102. package/src/components/inline-tips/inline-tips.stories.tsx +5 -0
  103. package/src/components/item/item.stories.tsx +65 -56
  104. package/src/components/modal/index.ts +1 -23
  105. package/src/components/modal/modal.stories.tsx +18 -8
  106. package/src/components/modal/modal.tsx +4 -2
  107. package/src/components/popover/index.ts +1 -0
  108. package/src/components/popover/popover.tsx +60 -0
  109. package/src/components/tabs/index.ts +1 -0
  110. package/src/components/tabs/tabs.stories.tsx +100 -0
  111. package/src/components/tabs/tabs.tsx +380 -0
  112. package/src/components/textarea/textarea.stories.tsx +8 -2
  113. package/src/components/toast/index.ts +2 -2
  114. package/src/utils/debounce.ts +15 -0
  115. package/src/utils/index.ts +1 -0
@@ -0,0 +1,333 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { argosScreenshot } from '@argos-ci/storybook/vitest';
3
+ import { within } from '@testing-library/react';
4
+ import userEvent from '@testing-library/user-event';
5
+ import { subDays } from 'date-fns';
6
+ import { useState } from 'react';
7
+ import { DateTimeRangePicker } from '../date-time-range-picker/date-time-range-picker.js';
8
+ import { DatePicker } from './date-picker.js';
9
+ const meta = {
10
+ title: 'Components/DatePicker',
11
+ component: DatePicker,
12
+ parameters: {
13
+ layout: 'centered'
14
+ }
15
+ };
16
+ export default meta;
17
+ const OPEN_CALENDAR_REGEX = /open calendar/i;
18
+ const isTestEnvironment = ()=>typeof navigator !== 'undefined' && navigator.webdriver === true;
19
+ async function openCalendarAndScreenshot(ctx, screenshotName) {
20
+ const { canvasElement, step } = ctx;
21
+ const canvas = within(canvasElement);
22
+ const user = userEvent.setup();
23
+ let triggerButton = null;
24
+ await step('Open the calendar popover', async ()=>{
25
+ triggerButton = canvas.getByRole('button', {
26
+ name: OPEN_CALENDAR_REGEX
27
+ });
28
+ await user.click(triggerButton);
29
+ });
30
+ await step('Wait for calendar to appear and render', async ()=>{
31
+ await new Promise((resolve)=>setTimeout(resolve, 300));
32
+ if (isTestEnvironment() && triggerButton instanceof HTMLElement) {
33
+ triggerButton.style.display = 'none';
34
+ }
35
+ await new Promise((resolve)=>setTimeout(resolve, 100));
36
+ });
37
+ await argosScreenshot(ctx, screenshotName);
38
+ }
39
+ export const DatePickerStory = {
40
+ play: (ctx)=>openCalendarAndScreenshot(ctx, 'DatePicker Calendar Open'),
41
+ render: ()=>{
42
+ const [date, setDate] = useState(new Date());
43
+ return /*#__PURE__*/ _jsx("div", {
44
+ className: "relative flex h-600 w-500 items-center justify-center rounded-16 bg-background-subtle-base shadow-tooltip overflow-visible",
45
+ children: /*#__PURE__*/ _jsx(DatePicker, {
46
+ date: date,
47
+ onDateSelect: setDate,
48
+ onClear: ()=>setDate(undefined),
49
+ placeholder: "DD/MM/YYYY"
50
+ })
51
+ });
52
+ }
53
+ };
54
+ export const DateRangePickerStory = {
55
+ play: (ctx)=>openCalendarAndScreenshot(ctx, 'DateRangePicker Calendar Open'),
56
+ render: ()=>{
57
+ const [dateRange, setDateRange] = useState({
58
+ start: new Date(),
59
+ end: subDays(new Date(), -30)
60
+ });
61
+ return /*#__PURE__*/ _jsx("div", {
62
+ className: "relative flex h-600 w-800 items-center justify-center rounded-16 bg-background-subtle-base shadow-tooltip overflow-visible",
63
+ children: /*#__PURE__*/ _jsx(DateTimeRangePicker, {
64
+ dateRange: dateRange,
65
+ onDateRangeSelect: setDateRange,
66
+ onClear: ()=>setDateRange(undefined),
67
+ placeholder: "DD/MM/YYYY - DD/MM/YYYY",
68
+ className: "min-w-280"
69
+ })
70
+ });
71
+ }
72
+ };
73
+ export const AllStates = {
74
+ render: ()=>{
75
+ const now = new Date();
76
+ const past = subDays(now, 30);
77
+ return /*#__PURE__*/ _jsxs("div", {
78
+ className: "flex flex-col gap-32 p-32 min-w-350",
79
+ children: [
80
+ /*#__PURE__*/ _jsxs("div", {
81
+ children: [
82
+ /*#__PURE__*/ _jsx("h3", {
83
+ className: "text-lg font-semibold mb-16 text-foreground-neutral-base",
84
+ children: "Single Date Picker"
85
+ }),
86
+ /*#__PURE__*/ _jsxs("div", {
87
+ className: "flex flex-col gap-16",
88
+ children: [
89
+ /*#__PURE__*/ _jsxs("div", {
90
+ children: [
91
+ /*#__PURE__*/ _jsx("p", {
92
+ className: "text-xs text-foreground-neutral-subtle mb-8 font-mono",
93
+ children: "DEFAULT"
94
+ }),
95
+ /*#__PURE__*/ _jsx(DatePicker, {
96
+ placeholder: "DD/MM/YYYY"
97
+ })
98
+ ]
99
+ }),
100
+ /*#__PURE__*/ _jsxs("div", {
101
+ children: [
102
+ /*#__PURE__*/ _jsx("p", {
103
+ className: "text-xs text-foreground-neutral-subtle mb-8 font-mono",
104
+ children: "FILLED"
105
+ }),
106
+ /*#__PURE__*/ _jsx(DatePicker, {
107
+ date: new Date(),
108
+ onClear: ()=>{
109
+ /* noop for demo */ },
110
+ placeholder: "DD/MM/YYYY"
111
+ })
112
+ ]
113
+ }),
114
+ /*#__PURE__*/ _jsxs("div", {
115
+ children: [
116
+ /*#__PURE__*/ _jsx("p", {
117
+ className: "text-xs text-foreground-neutral-subtle mb-8 font-mono",
118
+ children: "ERROR"
119
+ }),
120
+ /*#__PURE__*/ _jsx(DatePicker, {
121
+ date: new Date(),
122
+ onClear: ()=>{
123
+ /* noop for demo */ },
124
+ state: "error",
125
+ placeholder: "DD/MM/YYYY"
126
+ })
127
+ ]
128
+ }),
129
+ /*#__PURE__*/ _jsxs("div", {
130
+ children: [
131
+ /*#__PURE__*/ _jsx("p", {
132
+ className: "text-xs text-foreground-neutral-subtle mb-8 font-mono",
133
+ children: "DISABLED"
134
+ }),
135
+ /*#__PURE__*/ _jsx(DatePicker, {
136
+ placeholder: "DD/MM/YYYY",
137
+ state: "disabled"
138
+ })
139
+ ]
140
+ }),
141
+ /*#__PURE__*/ _jsxs("div", {
142
+ children: [
143
+ /*#__PURE__*/ _jsx("p", {
144
+ className: "text-xs text-foreground-neutral-subtle mb-8 font-mono",
145
+ children: "SMALL"
146
+ }),
147
+ /*#__PURE__*/ _jsx(DatePicker, {
148
+ size: "small",
149
+ placeholder: "DD/MM/YYYY"
150
+ })
151
+ ]
152
+ }),
153
+ /*#__PURE__*/ _jsxs("div", {
154
+ children: [
155
+ /*#__PURE__*/ _jsx("p", {
156
+ className: "text-xs text-foreground-neutral-subtle mb-8 font-mono",
157
+ children: "COMPONENT VARIANT"
158
+ }),
159
+ /*#__PURE__*/ _jsx(DatePicker, {
160
+ variant: "component",
161
+ placeholder: "DD/MM/YYYY"
162
+ })
163
+ ]
164
+ })
165
+ ]
166
+ })
167
+ ]
168
+ }),
169
+ /*#__PURE__*/ _jsxs("div", {
170
+ children: [
171
+ /*#__PURE__*/ _jsx("h3", {
172
+ className: "text-lg font-semibold mb-16 text-foreground-neutral-base",
173
+ children: "Date Range Picker"
174
+ }),
175
+ /*#__PURE__*/ _jsxs("div", {
176
+ className: "flex flex-col gap-16",
177
+ children: [
178
+ /*#__PURE__*/ _jsxs("div", {
179
+ children: [
180
+ /*#__PURE__*/ _jsx("p", {
181
+ className: "text-xs text-foreground-neutral-subtle mb-8 font-mono",
182
+ children: "DEFAULT"
183
+ }),
184
+ /*#__PURE__*/ _jsx(DateTimeRangePicker, {
185
+ placeholder: "DD/MM/YYYY - DD/MM/YYYY"
186
+ })
187
+ ]
188
+ }),
189
+ /*#__PURE__*/ _jsxs("div", {
190
+ children: [
191
+ /*#__PURE__*/ _jsx("p", {
192
+ className: "text-xs text-foreground-neutral-subtle mb-8 font-mono",
193
+ children: "FILLED"
194
+ }),
195
+ /*#__PURE__*/ _jsx(DateTimeRangePicker, {
196
+ dateRange: {
197
+ start: past,
198
+ end: now
199
+ },
200
+ onClear: ()=>{
201
+ /* noop for demo */ },
202
+ placeholder: "DD/MM/YYYY - DD/MM/YYYY"
203
+ })
204
+ ]
205
+ }),
206
+ /*#__PURE__*/ _jsxs("div", {
207
+ children: [
208
+ /*#__PURE__*/ _jsx("p", {
209
+ className: "text-xs text-foreground-neutral-subtle mb-8 font-mono",
210
+ children: "ERROR"
211
+ }),
212
+ /*#__PURE__*/ _jsx(DateTimeRangePicker, {
213
+ dateRange: {
214
+ start: past,
215
+ end: now
216
+ },
217
+ onClear: ()=>{
218
+ /* noop for demo */ },
219
+ state: "error",
220
+ placeholder: "DD/MM/YYYY - DD/MM/YYYY"
221
+ })
222
+ ]
223
+ }),
224
+ /*#__PURE__*/ _jsxs("div", {
225
+ children: [
226
+ /*#__PURE__*/ _jsx("p", {
227
+ className: "text-xs text-foreground-neutral-subtle mb-8 font-mono",
228
+ children: "DISABLED"
229
+ }),
230
+ /*#__PURE__*/ _jsx(DateTimeRangePicker, {
231
+ placeholder: "DD/MM/YYYY - DD/MM/YYYY",
232
+ state: "disabled"
233
+ })
234
+ ]
235
+ }),
236
+ /*#__PURE__*/ _jsxs("div", {
237
+ children: [
238
+ /*#__PURE__*/ _jsx("p", {
239
+ className: "text-xs text-foreground-neutral-subtle mb-8 font-mono",
240
+ children: "SMALL"
241
+ }),
242
+ /*#__PURE__*/ _jsx(DateTimeRangePicker, {
243
+ size: "small",
244
+ placeholder: "DD/MM/YYYY - DD/MM/YYYY"
245
+ })
246
+ ]
247
+ }),
248
+ /*#__PURE__*/ _jsxs("div", {
249
+ children: [
250
+ /*#__PURE__*/ _jsx("p", {
251
+ className: "text-xs text-foreground-neutral-subtle mb-8 font-mono",
252
+ children: "COMPONENT VARIANT"
253
+ }),
254
+ /*#__PURE__*/ _jsx(DateTimeRangePicker, {
255
+ variant: "component",
256
+ placeholder: "DD/MM/YYYY - DD/MM/YYYY"
257
+ })
258
+ ]
259
+ })
260
+ ]
261
+ })
262
+ ]
263
+ })
264
+ ]
265
+ });
266
+ }
267
+ };
268
+ export const DateFormats = {
269
+ render: ()=>{
270
+ const [date, setDate] = useState(new Date());
271
+ const formats = [
272
+ {
273
+ format: 'MMMM dd, yyyy',
274
+ placeholder: 'Month DD, YYYY',
275
+ label: 'MMMM dd, yyyy'
276
+ },
277
+ {
278
+ format: 'MMMM d, yyyy',
279
+ placeholder: 'Month D, YYYY',
280
+ label: 'MMMM d, yyyy'
281
+ },
282
+ {
283
+ format: 'MMM dd, yyyy',
284
+ placeholder: 'Mon DD, YYYY',
285
+ label: 'MMM dd, yyyy'
286
+ },
287
+ {
288
+ format: 'dd/MM/yyyy',
289
+ placeholder: 'DD/MM/YYYY',
290
+ label: 'dd/MM/yyyy'
291
+ },
292
+ {
293
+ format: 'MM/dd/yyyy',
294
+ placeholder: 'MM/DD/YYYY',
295
+ label: 'MM/dd/yyyy'
296
+ },
297
+ {
298
+ format: 'yyyy-MM-dd',
299
+ placeholder: 'YYYY-MM-DD',
300
+ label: 'yyyy-MM-dd'
301
+ }
302
+ ];
303
+ return /*#__PURE__*/ _jsxs("div", {
304
+ className: "flex flex-col gap-32 p-32 min-w-350",
305
+ children: [
306
+ /*#__PURE__*/ _jsx("h3", {
307
+ className: "text-lg font-semibold mb-16 text-foreground-neutral-base",
308
+ children: "Date Format Examples"
309
+ }),
310
+ /*#__PURE__*/ _jsx("div", {
311
+ className: "flex flex-col gap-16",
312
+ children: formats.map(({ format, placeholder, label })=>/*#__PURE__*/ _jsxs("div", {
313
+ children: [
314
+ /*#__PURE__*/ _jsx("p", {
315
+ className: "text-xs text-foreground-neutral-subtle mb-8 font-mono",
316
+ children: label
317
+ }),
318
+ /*#__PURE__*/ _jsx(DatePicker, {
319
+ date: date,
320
+ onDateSelect: setDate,
321
+ onClear: ()=>setDate(undefined),
322
+ dateFormat: format,
323
+ placeholder: placeholder
324
+ })
325
+ ]
326
+ }, format))
327
+ })
328
+ ]
329
+ });
330
+ }
331
+ };
332
+
333
+ //# sourceMappingURL=date-picker.stories.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/components/date-picker/date-picker.stories.tsx"],"sourcesContent":["import {argosScreenshot} from '@argos-ci/storybook/vitest';\nimport type {Meta, StoryObj} from '@storybook/react';\nimport {within} from '@testing-library/react';\nimport userEvent from '@testing-library/user-event';\nimport {subDays} from 'date-fns';\nimport {useState} from 'react';\nimport {\n type DateRange,\n DateTimeRangePicker,\n} from '../date-time-range-picker/date-time-range-picker';\nimport {DatePicker} from './date-picker';\n\nconst meta: Meta<typeof DatePicker> = {\n title: 'Components/DatePicker',\n component: DatePicker,\n parameters: {\n layout: 'centered',\n },\n};\nexport default meta;\n\ntype Story = StoryObj<typeof DatePicker>;\n\nconst OPEN_CALENDAR_REGEX = /open calendar/i;\n\nconst isTestEnvironment = () => typeof navigator !== 'undefined' && navigator.webdriver === true;\n\ntype StoryContext = Parameters<NonNullable<Story['play']>>[0];\n\nasync function openCalendarAndScreenshot(ctx: StoryContext, screenshotName: string): Promise<void> {\n const {canvasElement, step} = ctx;\n const canvas = within(canvasElement);\n const user = userEvent.setup();\n\n let triggerButton: HTMLElement | null = null;\n\n await step('Open the calendar popover', async () => {\n triggerButton = canvas.getByRole('button', {name: OPEN_CALENDAR_REGEX});\n await user.click(triggerButton);\n });\n\n await step('Wait for calendar to appear and render', async () => {\n await new Promise((resolve) => setTimeout(resolve, 300));\n\n if (isTestEnvironment() && triggerButton instanceof HTMLElement) {\n triggerButton.style.display = 'none';\n }\n await new Promise((resolve) => setTimeout(resolve, 100));\n });\n\n await argosScreenshot(ctx, screenshotName);\n}\n\nexport const DatePickerStory: Story = {\n play: (ctx) => openCalendarAndScreenshot(ctx, 'DatePicker Calendar Open'),\n render: () => {\n const [date, setDate] = useState<Date | undefined>(new Date());\n return (\n <div className=\"relative flex h-600 w-500 items-center justify-center rounded-16 bg-background-subtle-base shadow-tooltip overflow-visible\">\n <DatePicker\n date={date}\n onDateSelect={setDate}\n onClear={() => setDate(undefined)}\n placeholder=\"DD/MM/YYYY\"\n />\n </div>\n );\n },\n};\n\nexport const DateRangePickerStory: Story = {\n play: (ctx) => openCalendarAndScreenshot(ctx, 'DateRangePicker Calendar Open'),\n render: () => {\n const [dateRange, setDateRange] = useState<DateRange | undefined>({\n start: new Date(),\n end: subDays(new Date(), -30),\n });\n return (\n <div className=\"relative flex h-600 w-800 items-center justify-center rounded-16 bg-background-subtle-base shadow-tooltip overflow-visible\">\n <DateTimeRangePicker\n dateRange={dateRange}\n onDateRangeSelect={setDateRange}\n onClear={() => setDateRange(undefined)}\n placeholder=\"DD/MM/YYYY - DD/MM/YYYY\"\n className=\"min-w-280\"\n />\n </div>\n );\n },\n};\n\nexport const AllStates: Story = {\n render: () => {\n const now = new Date();\n const past = subDays(now, 30);\n return (\n <div className=\"flex flex-col gap-32 p-32 min-w-350\">\n <div>\n <h3 className=\"text-lg font-semibold mb-16 text-foreground-neutral-base\">\n Single Date Picker\n </h3>\n <div className=\"flex flex-col gap-16\">\n <div>\n <p className=\"text-xs text-foreground-neutral-subtle mb-8 font-mono\">DEFAULT</p>\n <DatePicker placeholder=\"DD/MM/YYYY\" />\n </div>\n <div>\n <p className=\"text-xs text-foreground-neutral-subtle mb-8 font-mono\">FILLED</p>\n <DatePicker\n date={new Date()}\n onClear={() => {\n /* noop for demo */\n }}\n placeholder=\"DD/MM/YYYY\"\n />\n </div>\n <div>\n <p className=\"text-xs text-foreground-neutral-subtle mb-8 font-mono\">ERROR</p>\n <DatePicker\n date={new Date()}\n onClear={() => {\n /* noop for demo */\n }}\n state=\"error\"\n placeholder=\"DD/MM/YYYY\"\n />\n </div>\n <div>\n <p className=\"text-xs text-foreground-neutral-subtle mb-8 font-mono\">DISABLED</p>\n <DatePicker placeholder=\"DD/MM/YYYY\" state=\"disabled\" />\n </div>\n <div>\n <p className=\"text-xs text-foreground-neutral-subtle mb-8 font-mono\">SMALL</p>\n <DatePicker size=\"small\" placeholder=\"DD/MM/YYYY\" />\n </div>\n <div>\n <p className=\"text-xs text-foreground-neutral-subtle mb-8 font-mono\">\n COMPONENT VARIANT\n </p>\n <DatePicker variant=\"component\" placeholder=\"DD/MM/YYYY\" />\n </div>\n </div>\n </div>\n\n <div>\n <h3 className=\"text-lg font-semibold mb-16 text-foreground-neutral-base\">\n Date Range Picker\n </h3>\n <div className=\"flex flex-col gap-16\">\n <div>\n <p className=\"text-xs text-foreground-neutral-subtle mb-8 font-mono\">DEFAULT</p>\n <DateTimeRangePicker placeholder=\"DD/MM/YYYY - DD/MM/YYYY\" />\n </div>\n <div>\n <p className=\"text-xs text-foreground-neutral-subtle mb-8 font-mono\">FILLED</p>\n <DateTimeRangePicker\n dateRange={{start: past, end: now}}\n onClear={() => {\n /* noop for demo */\n }}\n placeholder=\"DD/MM/YYYY - DD/MM/YYYY\"\n />\n </div>\n <div>\n <p className=\"text-xs text-foreground-neutral-subtle mb-8 font-mono\">ERROR</p>\n <DateTimeRangePicker\n dateRange={{start: past, end: now}}\n onClear={() => {\n /* noop for demo */\n }}\n state=\"error\"\n placeholder=\"DD/MM/YYYY - DD/MM/YYYY\"\n />\n </div>\n <div>\n <p className=\"text-xs text-foreground-neutral-subtle mb-8 font-mono\">DISABLED</p>\n <DateTimeRangePicker placeholder=\"DD/MM/YYYY - DD/MM/YYYY\" state=\"disabled\" />\n </div>\n <div>\n <p className=\"text-xs text-foreground-neutral-subtle mb-8 font-mono\">SMALL</p>\n <DateTimeRangePicker size=\"small\" placeholder=\"DD/MM/YYYY - DD/MM/YYYY\" />\n </div>\n <div>\n <p className=\"text-xs text-foreground-neutral-subtle mb-8 font-mono\">\n COMPONENT VARIANT\n </p>\n <DateTimeRangePicker variant=\"component\" placeholder=\"DD/MM/YYYY - DD/MM/YYYY\" />\n </div>\n </div>\n </div>\n </div>\n );\n },\n};\n\nexport const DateFormats: Story = {\n render: () => {\n const [date, setDate] = useState<Date | undefined>(new Date());\n const formats = [\n {format: 'MMMM dd, yyyy', placeholder: 'Month DD, YYYY', label: 'MMMM dd, yyyy'},\n {format: 'MMMM d, yyyy', placeholder: 'Month D, YYYY', label: 'MMMM d, yyyy'},\n {format: 'MMM dd, yyyy', placeholder: 'Mon DD, YYYY', label: 'MMM dd, yyyy'},\n {format: 'dd/MM/yyyy', placeholder: 'DD/MM/YYYY', label: 'dd/MM/yyyy'},\n {format: 'MM/dd/yyyy', placeholder: 'MM/DD/YYYY', label: 'MM/dd/yyyy'},\n {format: 'yyyy-MM-dd', placeholder: 'YYYY-MM-DD', label: 'yyyy-MM-dd'},\n ];\n\n return (\n <div className=\"flex flex-col gap-32 p-32 min-w-350\">\n <h3 className=\"text-lg font-semibold mb-16 text-foreground-neutral-base\">\n Date Format Examples\n </h3>\n <div className=\"flex flex-col gap-16\">\n {formats.map(({format, placeholder, label}) => (\n <div key={format}>\n <p className=\"text-xs text-foreground-neutral-subtle mb-8 font-mono\">{label}</p>\n <DatePicker\n date={date}\n onDateSelect={setDate}\n onClear={() => setDate(undefined)}\n dateFormat={format}\n placeholder={placeholder}\n />\n </div>\n ))}\n </div>\n </div>\n );\n },\n};\n"],"names":["argosScreenshot","within","userEvent","subDays","useState","DateTimeRangePicker","DatePicker","meta","title","component","parameters","layout","OPEN_CALENDAR_REGEX","isTestEnvironment","navigator","webdriver","openCalendarAndScreenshot","ctx","screenshotName","canvasElement","step","canvas","user","setup","triggerButton","getByRole","name","click","Promise","resolve","setTimeout","HTMLElement","style","display","DatePickerStory","play","render","date","setDate","Date","div","className","onDateSelect","onClear","undefined","placeholder","DateRangePickerStory","dateRange","setDateRange","start","end","onDateRangeSelect","AllStates","now","past","h3","p","state","size","variant","DateFormats","formats","format","label","map","dateFormat"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export * from './date-picker';
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/date-picker/index.ts"],"names":[],"mappings":"AAAA,cAAc,eAAe,CAAC"}
@@ -0,0 +1,3 @@
1
+ export * from './date-picker.js';
2
+
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/components/date-picker/index.ts"],"sourcesContent":["export * from './date-picker';\n"],"names":[],"mappings":"AAAA,cAAc,gBAAgB"}
@@ -0,0 +1,24 @@
1
+ import { type VariantProps } from 'class-variance-authority';
2
+ import type { ComponentProps, ReactNode } from 'react';
3
+ export declare const dateTimeRangePickerVariants: (props?: ({
4
+ variant?: "base" | "component" | null | undefined;
5
+ size?: "base" | "small" | null | undefined;
6
+ state?: "default" | "error" | "disabled" | null | undefined;
7
+ } & import("class-variance-authority/types").ClassProp) | undefined) => string;
8
+ export type DateRange = {
9
+ start?: Date;
10
+ end?: Date;
11
+ };
12
+ export type DateTimeRangePickerProps = Omit<ComponentProps<'input'>, 'size' | 'type'> & VariantProps<typeof dateTimeRangePickerVariants> & {
13
+ dateRange?: DateRange;
14
+ onDateRangeSelect?: (range: DateRange | undefined) => void;
15
+ placeholder?: string;
16
+ dateFormat?: string;
17
+ leftIcon?: ReactNode;
18
+ rightIcon?: ReactNode;
19
+ onClear?: () => void;
20
+ numberOfMonths?: number;
21
+ closeOnSelect?: boolean;
22
+ };
23
+ export declare const DateTimeRangePicker: import("react").ForwardRefExoticComponent<Omit<DateTimeRangePickerProps, "ref"> & import("react").RefAttributes<HTMLInputElement>>;
24
+ //# sourceMappingURL=date-time-range-picker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"date-time-range-picker.d.ts","sourceRoot":"","sources":["../../../src/components/date-time-range-picker/date-time-range-picker.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAM,KAAK,YAAY,EAAC,MAAM,0BAA0B,CAAC;AAKhE,OAAO,KAAK,EAAC,cAAc,EAAE,SAAS,EAAC,MAAM,OAAO,CAAC;AAKrD,eAAO,MAAM,2BAA2B;;;;8EAyBvC,CAAC;AAEF,MAAM,MAAM,SAAS,GAAG;IACtB,KAAK,CAAC,EAAE,IAAI,CAAC;IACb,GAAG,CAAC,EAAE,IAAI,CAAC;CACZ,CAAC;AAEF,MAAM,MAAM,wBAAwB,GAAG,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC,GACnF,YAAY,CAAC,OAAO,2BAA2B,CAAC,GAAG;IACjD,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB,iBAAiB,CAAC,EAAE,CAAC,KAAK,EAAE,SAAS,GAAG,SAAS,KAAK,IAAI,CAAC;IAC3D,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,SAAS,CAAC;IACrB,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB,CAAC;AAEJ,eAAO,MAAM,mBAAmB,oIAyJ/B,CAAC"}
@@ -0,0 +1,130 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { cva } from 'class-variance-authority';
3
+ import { Calendar } from '../../components/calendar/index.js';
4
+ import { Icon } from '../../components/icon/index.js';
5
+ import { Popover, PopoverContent, PopoverTrigger } from '../../components/popover/index.js';
6
+ import { format } from 'date-fns';
7
+ import { forwardRef, useState } from 'react';
8
+ import { cn } from '../../utils/cn.js';
9
+ export const dateTimeRangePickerVariants = cva('min-w-240 relative flex items-center rounded-6 shadow-button-neutral transition-[background-color,box-shadow] outline-none', {
10
+ variants: {
11
+ variant: {
12
+ base: 'bg-background-field-base hover:bg-background-field-hover',
13
+ component: 'bg-background-field-component hover:bg-background-field-component-hover'
14
+ },
15
+ size: {
16
+ base: 'h-32',
17
+ small: 'h-28'
18
+ },
19
+ state: {
20
+ default: '',
21
+ error: 'shadow-border-error',
22
+ disabled: 'bg-background-neutral-disabled shadow-none pointer-events-none cursor-not-allowed'
23
+ }
24
+ },
25
+ defaultVariants: {
26
+ variant: 'base',
27
+ size: 'base',
28
+ state: 'default'
29
+ }
30
+ });
31
+ export const DateTimeRangePicker = /*#__PURE__*/ forwardRef(({ className, variant, size, state, dateRange, onDateRangeSelect, placeholder = 'DD/MM/YYYY - DD/MM/YYYY', dateFormat = 'dd/MM/yyyy', leftIcon, rightIcon, onClear, disabled, numberOfMonths = 2, closeOnSelect = false, ...props }, ref)=>{
32
+ const [open, setOpen] = useState(false);
33
+ const isDisabled = disabled || state === 'disabled';
34
+ const hasRange = dateRange?.start && dateRange?.end;
35
+ const displayValue = hasRange && dateRange.start && dateRange.end ? `${format(dateRange.start, dateFormat)} - ${format(dateRange.end, dateFormat)}` : '';
36
+ // Convert our DateRange to react-day-picker's DateRange format
37
+ const dayPickerRange = dateRange?.start || dateRange?.end ? {
38
+ from: dateRange?.start,
39
+ to: dateRange?.end
40
+ } : undefined;
41
+ const handleSelect = (selectedRange)=>{
42
+ if (selectedRange) {
43
+ onDateRangeSelect?.({
44
+ start: selectedRange.from,
45
+ end: selectedRange.to
46
+ });
47
+ // Only close if both dates are selected and closeOnSelect is true
48
+ if (closeOnSelect && selectedRange.from && selectedRange.to) {
49
+ setOpen(false);
50
+ }
51
+ } else {
52
+ onDateRangeSelect?.(undefined);
53
+ }
54
+ };
55
+ const handleClear = (e)=>{
56
+ e.stopPropagation();
57
+ onClear?.();
58
+ setOpen(false);
59
+ };
60
+ return /*#__PURE__*/ _jsxs(Popover, {
61
+ open: open,
62
+ onOpenChange: setOpen,
63
+ children: [
64
+ /*#__PURE__*/ _jsxs("div", {
65
+ className: cn(open && 'shadow-border-interactive-with-active', dateTimeRangePickerVariants({
66
+ variant,
67
+ size,
68
+ state: isDisabled ? 'disabled' : state
69
+ }), className),
70
+ children: [
71
+ /*#__PURE__*/ _jsx(PopoverTrigger, {
72
+ asChild: true,
73
+ children: /*#__PURE__*/ _jsx("button", {
74
+ type: "button",
75
+ disabled: isDisabled,
76
+ className: cn('flex items-center justify-center shrink-0 transition-colors', size === 'small' ? 'size-28' : 'size-32', isDisabled && 'text-foreground-neutral-disabled'),
77
+ "aria-label": "Open calendar",
78
+ children: leftIcon || /*#__PURE__*/ _jsx(Icon, {
79
+ name: "calendar2Line",
80
+ className: cn('size-16 text-foreground-neutral-muted', isDisabled && 'text-foreground-neutral-disabled')
81
+ })
82
+ })
83
+ }),
84
+ /*#__PURE__*/ _jsx("div", {
85
+ className: "h-full w-px bg-border-neutral-base shrink-0"
86
+ }),
87
+ /*#__PURE__*/ _jsx("input", {
88
+ ref: ref,
89
+ type: "text",
90
+ disabled: isDisabled,
91
+ placeholder: placeholder,
92
+ value: displayValue,
93
+ readOnly: true,
94
+ className: cn('flex-1 min-w-0 px-8 text-sm leading-20 bg-transparent outline-none border-none cursor-pointer', 'placeholder:text-foreground-neutral-muted', 'text-foreground-neutral-base', 'disabled:text-foreground-neutral-disabled disabled:cursor-not-allowed', size === 'small' ? 'py-4' : 'py-6'),
95
+ onClick: ()=>!isDisabled && setOpen(true),
96
+ ...props
97
+ }),
98
+ /*#__PURE__*/ _jsx("button", {
99
+ type: "button",
100
+ onClick: handleClear,
101
+ className: cn('flex items-center justify-center shrink-0 transition-colors hover:text-foreground-neutral-base', size === 'small' ? 'size-28' : 'size-32', hasRange && onClear && !isDisabled ? 'visible' : 'invisible'),
102
+ "aria-label": "Clear date range",
103
+ children: /*#__PURE__*/ _jsx(Icon, {
104
+ name: "closeLine",
105
+ className: "size-16 text-foreground-neutral-muted"
106
+ })
107
+ }),
108
+ rightIcon && !hasRange && /*#__PURE__*/ _jsx("div", {
109
+ className: cn('flex items-center justify-center shrink-0', size === 'small' ? 'size-28' : 'size-32'),
110
+ children: rightIcon
111
+ })
112
+ ]
113
+ }),
114
+ /*#__PURE__*/ _jsx(PopoverContent, {
115
+ className: "w-auto p-0",
116
+ align: "start",
117
+ children: /*#__PURE__*/ _jsx(Calendar, {
118
+ mode: "range",
119
+ defaultMonth: dayPickerRange?.from,
120
+ selected: dayPickerRange,
121
+ onSelect: handleSelect,
122
+ numberOfMonths: numberOfMonths
123
+ })
124
+ })
125
+ ]
126
+ });
127
+ });
128
+ DateTimeRangePicker.displayName = 'DateTimeRangePicker';
129
+
130
+ //# sourceMappingURL=date-time-range-picker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/components/date-time-range-picker/date-time-range-picker.tsx"],"sourcesContent":["import {cva, type VariantProps} from 'class-variance-authority';\nimport {Calendar} from 'components/calendar';\nimport {Icon} from 'components/icon';\nimport {Popover, PopoverContent, PopoverTrigger} from 'components/popover';\nimport {format} from 'date-fns';\nimport type {ComponentProps, ReactNode} from 'react';\nimport {forwardRef, useState} from 'react';\nimport type {DateRange as DayPickerDateRange} from 'react-day-picker';\nimport {cn} from 'utils/cn';\n\nexport const dateTimeRangePickerVariants = cva(\n 'min-w-240 relative flex items-center rounded-6 shadow-button-neutral transition-[background-color,box-shadow] outline-none',\n {\n variants: {\n variant: {\n base: 'bg-background-field-base hover:bg-background-field-hover',\n component: 'bg-background-field-component hover:bg-background-field-component-hover',\n },\n size: {\n base: 'h-32',\n small: 'h-28',\n },\n state: {\n default: '',\n error: 'shadow-border-error',\n disabled:\n 'bg-background-neutral-disabled shadow-none pointer-events-none cursor-not-allowed',\n },\n },\n defaultVariants: {\n variant: 'base',\n size: 'base',\n state: 'default',\n },\n },\n);\n\nexport type DateRange = {\n start?: Date;\n end?: Date;\n};\n\nexport type DateTimeRangePickerProps = Omit<ComponentProps<'input'>, 'size' | 'type'> &\n VariantProps<typeof dateTimeRangePickerVariants> & {\n dateRange?: DateRange;\n onDateRangeSelect?: (range: DateRange | undefined) => void;\n placeholder?: string;\n dateFormat?: string;\n leftIcon?: ReactNode;\n rightIcon?: ReactNode;\n onClear?: () => void;\n numberOfMonths?: number;\n closeOnSelect?: boolean;\n };\n\nexport const DateTimeRangePicker = forwardRef<HTMLInputElement, DateTimeRangePickerProps>(\n (\n {\n className,\n variant,\n size,\n state,\n dateRange,\n onDateRangeSelect,\n placeholder = 'DD/MM/YYYY - DD/MM/YYYY',\n dateFormat = 'dd/MM/yyyy',\n leftIcon,\n rightIcon,\n onClear,\n disabled,\n numberOfMonths = 2,\n closeOnSelect = false,\n ...props\n },\n ref,\n ) => {\n const [open, setOpen] = useState(false);\n const isDisabled = disabled || state === 'disabled';\n const hasRange = dateRange?.start && dateRange?.end;\n const displayValue =\n hasRange && dateRange.start && dateRange.end\n ? `${format(dateRange.start, dateFormat)} - ${format(dateRange.end, dateFormat)}`\n : '';\n\n // Convert our DateRange to react-day-picker's DateRange format\n const dayPickerRange: DayPickerDateRange | undefined =\n dateRange?.start || dateRange?.end\n ? {\n from: dateRange?.start,\n to: dateRange?.end,\n }\n : undefined;\n\n const handleSelect = (selectedRange: DayPickerDateRange | undefined) => {\n if (selectedRange) {\n onDateRangeSelect?.({\n start: selectedRange.from,\n end: selectedRange.to,\n });\n // Only close if both dates are selected and closeOnSelect is true\n if (closeOnSelect && selectedRange.from && selectedRange.to) {\n setOpen(false);\n }\n } else {\n onDateRangeSelect?.(undefined);\n }\n };\n\n const handleClear = (e: React.MouseEvent) => {\n e.stopPropagation();\n onClear?.();\n setOpen(false);\n };\n\n return (\n <Popover open={open} onOpenChange={setOpen}>\n <div\n className={cn(\n open && 'shadow-border-interactive-with-active',\n dateTimeRangePickerVariants({variant, size, state: isDisabled ? 'disabled' : state}),\n className,\n )}\n >\n {/* Calendar Icon Button */}\n <PopoverTrigger asChild>\n <button\n type=\"button\"\n disabled={isDisabled}\n className={cn(\n 'flex items-center justify-center shrink-0 transition-colors',\n size === 'small' ? 'size-28' : 'size-32',\n isDisabled && 'text-foreground-neutral-disabled',\n )}\n aria-label=\"Open calendar\"\n >\n {leftIcon || (\n <Icon\n name=\"calendar2Line\"\n className={cn(\n 'size-16 text-foreground-neutral-muted',\n isDisabled && 'text-foreground-neutral-disabled',\n )}\n />\n )}\n </button>\n </PopoverTrigger>\n\n {/* Divider */}\n <div className=\"h-full w-px bg-border-neutral-base shrink-0\" />\n\n {/* Input Field */}\n <input\n ref={ref}\n type=\"text\"\n disabled={isDisabled}\n placeholder={placeholder}\n value={displayValue}\n readOnly\n className={cn(\n 'flex-1 min-w-0 px-8 text-sm leading-20 bg-transparent outline-none border-none cursor-pointer',\n 'placeholder:text-foreground-neutral-muted',\n 'text-foreground-neutral-base',\n 'disabled:text-foreground-neutral-disabled disabled:cursor-not-allowed',\n size === 'small' ? 'py-4' : 'py-6',\n )}\n onClick={() => !isDisabled && setOpen(true)}\n {...props}\n />\n\n {/* Clear Button (shown when date range is selected) */}\n <button\n type=\"button\"\n onClick={handleClear}\n className={cn(\n 'flex items-center justify-center shrink-0 transition-colors hover:text-foreground-neutral-base',\n size === 'small' ? 'size-28' : 'size-32',\n hasRange && onClear && !isDisabled ? 'visible' : 'invisible',\n )}\n aria-label=\"Clear date range\"\n >\n <Icon name=\"closeLine\" className=\"size-16 text-foreground-neutral-muted\" />\n </button>\n\n {/* Custom Right Icon */}\n {rightIcon && !hasRange && (\n <div\n className={cn(\n 'flex items-center justify-center shrink-0',\n size === 'small' ? 'size-28' : 'size-32',\n )}\n >\n {rightIcon}\n </div>\n )}\n </div>\n\n <PopoverContent className=\"w-auto p-0\" align=\"start\">\n <Calendar\n mode=\"range\"\n defaultMonth={dayPickerRange?.from}\n selected={dayPickerRange}\n onSelect={handleSelect}\n numberOfMonths={numberOfMonths}\n />\n </PopoverContent>\n </Popover>\n );\n },\n);\n\nDateTimeRangePicker.displayName = 'DateTimeRangePicker';\n"],"names":["cva","Calendar","Icon","Popover","PopoverContent","PopoverTrigger","format","forwardRef","useState","cn","dateTimeRangePickerVariants","variants","variant","base","component","size","small","state","default","error","disabled","defaultVariants","DateTimeRangePicker","className","dateRange","onDateRangeSelect","placeholder","dateFormat","leftIcon","rightIcon","onClear","numberOfMonths","closeOnSelect","props","ref","open","setOpen","isDisabled","hasRange","start","end","displayValue","dayPickerRange","from","to","undefined","handleSelect","selectedRange","handleClear","e","stopPropagation","onOpenChange","div","asChild","button","type","aria-label","name","input","value","readOnly","onClick","align","mode","defaultMonth","selected","onSelect","displayName"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export * from './date-time-range-picker';
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/date-time-range-picker/index.ts"],"names":[],"mappings":"AAAA,cAAc,0BAA0B,CAAC"}
@@ -0,0 +1,3 @@
1
+ export * from './date-time-range-picker.js';
2
+
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/components/date-time-range-picker/index.ts"],"sourcesContent":["export * from './date-time-range-picker';\n"],"names":[],"mappings":"AAAA,cAAc,2BAA2B"}
@@ -1,3 +1,2 @@
1
- export type { DropdownMenuCheckboxItemProps, DropdownMenuContentProps, DropdownMenuItemProps, DropdownMenuLabelProps, DropdownMenuRadioItemProps, DropdownMenuShortcutProps, DropdownMenuSubTriggerProps, } from './dropdown-menu';
2
- export { DropdownMenu, DropdownMenuCheckboxItem, DropdownMenuContent, DropdownMenuGroup, DropdownMenuItem, DropdownMenuLabel, DropdownMenuPortal, DropdownMenuRadioGroup, DropdownMenuRadioItem, DropdownMenuSeparator, DropdownMenuShortcut, DropdownMenuSub, DropdownMenuSubContent, DropdownMenuSubTrigger, DropdownMenuTrigger, dropdownMenuContentVariants, dropdownMenuItemVariants, dropdownMenuLabelVariants, } from './dropdown-menu';
1
+ export * from './dropdown-menu';
3
2
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/dropdown-menu/index.ts"],"names":[],"mappings":"AAAA,YAAY,EACV,6BAA6B,EAC7B,wBAAwB,EACxB,qBAAqB,EACrB,sBAAsB,EACtB,0BAA0B,EAC1B,yBAAyB,EACzB,2BAA2B,GAC5B,MAAM,iBAAiB,CAAC;AACzB,OAAO,EACL,YAAY,EACZ,wBAAwB,EACxB,mBAAmB,EACnB,iBAAiB,EACjB,gBAAgB,EAChB,iBAAiB,EACjB,kBAAkB,EAClB,sBAAsB,EACtB,qBAAqB,EACrB,qBAAqB,EACrB,oBAAoB,EACpB,eAAe,EACf,sBAAsB,EACtB,sBAAsB,EACtB,mBAAmB,EACnB,2BAA2B,EAC3B,wBAAwB,EACxB,yBAAyB,GAC1B,MAAM,iBAAiB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/dropdown-menu/index.ts"],"names":[],"mappings":"AAAA,cAAc,iBAAiB,CAAC"}
@@ -1,3 +1,3 @@
1
- export { DropdownMenu, DropdownMenuCheckboxItem, DropdownMenuContent, DropdownMenuGroup, DropdownMenuItem, DropdownMenuLabel, DropdownMenuPortal, DropdownMenuRadioGroup, DropdownMenuRadioItem, DropdownMenuSeparator, DropdownMenuShortcut, DropdownMenuSub, DropdownMenuSubContent, DropdownMenuSubTrigger, DropdownMenuTrigger, dropdownMenuContentVariants, dropdownMenuItemVariants, dropdownMenuLabelVariants } from './dropdown-menu.js';
1
+ export * from './dropdown-menu.js';
2
2
 
3
3
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/components/dropdown-menu/index.ts"],"sourcesContent":["export type {\n DropdownMenuCheckboxItemProps,\n DropdownMenuContentProps,\n DropdownMenuItemProps,\n DropdownMenuLabelProps,\n DropdownMenuRadioItemProps,\n DropdownMenuShortcutProps,\n DropdownMenuSubTriggerProps,\n} from './dropdown-menu';\nexport {\n DropdownMenu,\n DropdownMenuCheckboxItem,\n DropdownMenuContent,\n DropdownMenuGroup,\n DropdownMenuItem,\n DropdownMenuLabel,\n DropdownMenuPortal,\n DropdownMenuRadioGroup,\n DropdownMenuRadioItem,\n DropdownMenuSeparator,\n DropdownMenuShortcut,\n DropdownMenuSub,\n DropdownMenuSubContent,\n DropdownMenuSubTrigger,\n DropdownMenuTrigger,\n dropdownMenuContentVariants,\n dropdownMenuItemVariants,\n dropdownMenuLabelVariants,\n} from './dropdown-menu';\n"],"names":["DropdownMenu","DropdownMenuCheckboxItem","DropdownMenuContent","DropdownMenuGroup","DropdownMenuItem","DropdownMenuLabel","DropdownMenuPortal","DropdownMenuRadioGroup","DropdownMenuRadioItem","DropdownMenuSeparator","DropdownMenuShortcut","DropdownMenuSub","DropdownMenuSubContent","DropdownMenuSubTrigger","DropdownMenuTrigger","dropdownMenuContentVariants","dropdownMenuItemVariants","dropdownMenuLabelVariants"],"mappings":"AASA,SACEA,YAAY,EACZC,wBAAwB,EACxBC,mBAAmB,EACnBC,iBAAiB,EACjBC,gBAAgB,EAChBC,iBAAiB,EACjBC,kBAAkB,EAClBC,sBAAsB,EACtBC,qBAAqB,EACrBC,qBAAqB,EACrBC,oBAAoB,EACpBC,eAAe,EACfC,sBAAsB,EACtBC,sBAAsB,EACtBC,mBAAmB,EACnBC,2BAA2B,EAC3BC,wBAAwB,EACxBC,yBAAyB,QACpB,kBAAkB"}
1
+ {"version":3,"sources":["../../../src/components/dropdown-menu/index.ts"],"sourcesContent":["export * from './dropdown-menu';\n"],"names":[],"mappings":"AAAA,cAAc,kBAAkB"}
@@ -2,8 +2,11 @@ export * from './alert';
2
2
  export * from './avatar';
3
3
  export * from './badge';
4
4
  export * from './button';
5
+ export * from './calendar';
5
6
  export * from './checkbox';
6
7
  export * from './code-block';
8
+ export * from './date-picker';
9
+ export * from './date-time-range-picker';
7
10
  export * from './dot-grid';
8
11
  export * from './dropdown-menu';
9
12
  export * from './dynamic-item';
@@ -14,6 +17,9 @@ export * from './input';
14
17
  export * from './item';
15
18
  export * from './label';
16
19
  export * from './modal';
20
+ export * from './moving-border';
21
+ export * from './popover';
22
+ export * from './tabs';
17
23
  export * from './textarea';
18
24
  export * from './theme';
19
25
  export * from './toast';