@baishuyun/ai-design 1.0.7 → 1.0.9

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.
@@ -0,0 +1,460 @@
1
+ import type { Meta, StoryObj } from '@storybook/react-vite';
2
+ import { useState, useCallback } from 'react';
3
+ import { BsConditionInput } from '../components/agent-helper/condition-input';
4
+ import { conditionStringify2bsCondition } from '@baishuyun/ai-feat-utils';
5
+ import type { IField, IFieldValueService, ICondition } from '@baishuyun/types';
6
+
7
+ const mockService: IFieldValueService = {
8
+ searchUsers: async (keyword) => {
9
+ await new Promise((r) => setTimeout(r, 300));
10
+ const users = [
11
+ { id: 'user1', name: '张三' },
12
+ { id: 'user2', name: '李四' },
13
+ { id: 'user3', name: '王五' },
14
+ ];
15
+ return keyword ? users.filter((u) => u.name.includes(keyword)) : users;
16
+ },
17
+ searchDepts: async (keyword) => {
18
+ await new Promise((r) => setTimeout(r, 300));
19
+ const depts = [
20
+ { id: 'dept1', name: '技术部' },
21
+ { id: 'dept2', name: '产品部' },
22
+ { id: 'dept3', name: '设计部' },
23
+ ];
24
+ return keyword ? depts.filter((d) => d.name.includes(keyword)) : depts;
25
+ },
26
+ searchUserGroups: async (keyword) => {
27
+ await new Promise((r) => setTimeout(r, 300));
28
+ const groups = [
29
+ { id: 'ug1', name: '管理组' },
30
+ { id: 'ug2', name: '普通组' },
31
+ ];
32
+ return keyword ? groups.filter((g) => g.name.includes(keyword)) : groups;
33
+ },
34
+ searchDeptGroups: async (keyword) => {
35
+ await new Promise((r) => setTimeout(r, 300));
36
+ const groups = [
37
+ { id: 'dg1', name: '研发中心' },
38
+ { id: 'dg2', name: '销售中心' },
39
+ ];
40
+ return keyword ? groups.filter((g) => g.name.includes(keyword)) : groups;
41
+ },
42
+ searchAddress: async (keyword) => {
43
+ await new Promise((r) => setTimeout(r, 300));
44
+ const addresses = [
45
+ { province: '浙江省', city: '杭州市', district: '西湖区' },
46
+ { province: '北京市', city: '北京市', district: '朝阳区' },
47
+ ];
48
+ return keyword
49
+ ? addresses.filter(
50
+ (a) =>
51
+ a.province.includes(keyword) ||
52
+ a.city.includes(keyword) ||
53
+ a.district.includes(keyword),
54
+ )
55
+ : addresses;
56
+ },
57
+ searchLocation: async (keyword) => {
58
+ await new Promise((r) => setTimeout(r, 300));
59
+ return [
60
+ {
61
+ province: '浙江省',
62
+ city: '杭州市',
63
+ district: '西湖区',
64
+ detail: '文三路 123 号',
65
+ lnglatXY: [120.15, 30.28] as [number, number],
66
+ },
67
+ {
68
+ province: '北京市',
69
+ city: '北京市',
70
+ district: '朝阳区',
71
+ detail: '望京 SOHO',
72
+ lnglatXY: [116.48, 39.99] as [number, number],
73
+ },
74
+ ].filter((l) => !keyword || l.detail.includes(keyword));
75
+ },
76
+ searchDistinctValues: async (_field, keyword) => {
77
+ await new Promise((r) => setTimeout(r, 300));
78
+ const values = [
79
+ { label: '苹果', value: 'apple' },
80
+ { label: '香蕉', value: 'banana' },
81
+ { label: '橙子', value: 'orange' },
82
+ { label: '葡萄', value: 'grape' },
83
+ ];
84
+ return keyword ? values.filter((v) => v.label.includes(keyword)) : values;
85
+ },
86
+ };
87
+
88
+ const mockFields: IField[] = [
89
+ {
90
+ label: '姓名',
91
+ description: '请输入姓名',
92
+ widget: { type: 'text', widgetName: 'text', value: '' },
93
+ },
94
+ {
95
+ label: '年龄',
96
+ description: '请输入年龄',
97
+ widget: { type: 'number', widgetName: 'number', value: '' },
98
+ },
99
+ {
100
+ label: '出生日期',
101
+ description: '请选择出生日期',
102
+ widget: { type: 'datetime', widgetName: 'datetime', value: '' },
103
+ },
104
+ {
105
+ label: '备注',
106
+ description: '请输入备注',
107
+ widget: { type: 'textarea', widgetName: 'textarea', value: '' },
108
+ },
109
+ {
110
+ label: '性别',
111
+ widget: {
112
+ type: 'radiogroup',
113
+ widgetName: 'radiogroup',
114
+ value: '',
115
+ items: [
116
+ { label: '男', value: 'male' },
117
+ { label: '女', value: 'female' },
118
+ ],
119
+ },
120
+ },
121
+ {
122
+ label: '所在城市',
123
+ widget: {
124
+ type: 'combo',
125
+ widgetName: 'combo',
126
+ value: '',
127
+ items: [
128
+ { label: '北京', value: 'beijing' },
129
+ { label: '上海', value: 'shanghai' },
130
+ { label: '广州', value: 'guangzhou' },
131
+ ],
132
+ },
133
+ },
134
+ {
135
+ label: '兴趣爱好',
136
+ widget: {
137
+ type: 'checkboxgroup',
138
+ widgetName: 'checkboxgroup',
139
+ value: [],
140
+ items: [
141
+ { label: '阅读', value: 'reading' },
142
+ { label: '运动', value: 'sports' },
143
+ { label: '音乐', value: 'music' },
144
+ ],
145
+ },
146
+ },
147
+ {
148
+ label: '附件上传',
149
+ widget: { type: 'upload', widgetName: 'upload', value: '' },
150
+ },
151
+ {
152
+ label: '负责人',
153
+ widget: { type: 'user', widgetName: 'user', value: '' },
154
+ },
155
+ {
156
+ label: '所属部门',
157
+ widget: { type: 'dept', widgetName: 'dept', value: '' },
158
+ },
159
+ {
160
+ label: '密码',
161
+ widget: { type: 'password', widgetName: 'password', value: '' },
162
+ },
163
+ {
164
+ label: '性别(单选)',
165
+ widget: {
166
+ type: 'radio',
167
+ widgetName: 'radio',
168
+ value: '',
169
+ items: [
170
+ { label: '男', value: 'male' },
171
+ { label: '女', value: 'female' },
172
+ ],
173
+ },
174
+ },
175
+ {
176
+ label: '下拉多选',
177
+ widget: {
178
+ type: 'combocheck',
179
+ widgetName: 'combocheck',
180
+ value: [],
181
+ items: [
182
+ { label: '选项A', value: 'a' },
183
+ { label: '选项B', value: 'b' },
184
+ { label: '选项C', value: 'c' },
185
+ ],
186
+ },
187
+ },
188
+ {
189
+ label: '地址',
190
+ widget: { type: 'address', widgetName: 'address', value: {} },
191
+ },
192
+ {
193
+ label: '位置',
194
+ widget: { type: 'location', widgetName: 'location', value: {} },
195
+ },
196
+ {
197
+ label: '流水号',
198
+ widget: { type: 'sn', widgetName: 'sn', value: '' },
199
+ },
200
+ {
201
+ label: '用户组',
202
+ widget: { type: 'usergroup', widgetName: 'usergroup', value: '' },
203
+ },
204
+ {
205
+ label: '部门组',
206
+ widget: { type: 'deptgroup', widgetName: 'deptgroup', value: '' },
207
+ },
208
+ {
209
+ label: '图片',
210
+ widget: { type: 'image', widgetName: 'image', value: '' },
211
+ },
212
+ {
213
+ label: '联动数据',
214
+ widget: { type: 'linkdata', widgetName: 'linkdata', value: '' },
215
+ },
216
+ {
217
+ label: '流程状态',
218
+ widget: { type: 'flowState', widgetName: 'flowState', value: '' },
219
+ },
220
+ {
221
+ label: '签名',
222
+ widget: { type: 'signature', widgetName: 'signature', value: '' },
223
+ },
224
+ ];
225
+
226
+ function makeBSString(cond: ICondition): string {
227
+ return conditionStringify2bsCondition(cond);
228
+ }
229
+
230
+ const meta: Meta<typeof BsConditionInput> = {
231
+ title: 'Agent Helper/BsConditionInput',
232
+ component: BsConditionInput,
233
+ tags: ['autodocs'],
234
+ parameters: {
235
+ layout: 'centered',
236
+ },
237
+ args: {
238
+ targetName: '流程结束 或 流程节点',
239
+ fields: mockFields,
240
+ disabled: false,
241
+ },
242
+ decorators: [
243
+ (Story) => (
244
+ <div style={{ width: '960px' }}>
245
+ <Story />
246
+ </div>
247
+ ),
248
+ ],
249
+ };
250
+
251
+ export default meta;
252
+ type Story = StoryObj<typeof meta>;
253
+
254
+ export const Empty: Story = {
255
+ args: {
256
+ targetName: '流程结束 或 流程节点',
257
+ fields: mockFields,
258
+ },
259
+ };
260
+
261
+ export const WithConditions: Story = {
262
+ args: {
263
+ targetName: '流程结束 或 流程节点',
264
+ fields: mockFields,
265
+ defaultValue: makeBSString({
266
+ targetName: '流程结束 或 流程节点',
267
+ quantifier: 'all',
268
+ items: [
269
+ {
270
+ id: 'item-1',
271
+ field: mockFields[0],
272
+ operator: 'contains',
273
+ value: '张三',
274
+ },
275
+ {
276
+ id: 'item-2',
277
+ field: mockFields[1],
278
+ operator: 'gte',
279
+ value: 18,
280
+ },
281
+ ],
282
+ }),
283
+ },
284
+ };
285
+
286
+ export const WithDeleteAll: Story = {
287
+ args: {
288
+ targetName: '流程结束 或 流程节点',
289
+ fields: mockFields,
290
+ defaultValue: makeBSString({
291
+ targetName: '流程结束 或 流程节点',
292
+ quantifier: 'any',
293
+ items: [
294
+ {
295
+ id: 'item-1',
296
+ field: mockFields[0],
297
+ operator: 'contains',
298
+ value: '张三',
299
+ },
300
+ {
301
+ id: 'item-2',
302
+ field: mockFields[1],
303
+ operator: 'gte',
304
+ value: 18,
305
+ },
306
+ {
307
+ id: 'item-3',
308
+ field: mockFields[5],
309
+ operator: 'in',
310
+ value: ['beijing', 'shanghai'],
311
+ },
312
+ {
313
+ id: 'item-4',
314
+ field: mockFields[2],
315
+ operator: 'range',
316
+ value: undefined,
317
+ },
318
+ ],
319
+ }),
320
+ },
321
+ };
322
+
323
+ export const Controlled: Story = {
324
+ render: () => {
325
+ const [bsString, setBsString] = useState<string>(
326
+ makeBSString({
327
+ targetName: '流程结束 或 流程节点',
328
+ quantifier: 'all',
329
+ items: [
330
+ {
331
+ id: 'item-1',
332
+ field: mockFields[0],
333
+ operator: 'contains',
334
+ value: '张三',
335
+ },
336
+ {
337
+ id: 'item-2',
338
+ field: mockFields[1],
339
+ operator: 'gte',
340
+ value: 18,
341
+ },
342
+ ],
343
+ }),
344
+ );
345
+
346
+ const handleChange = useCallback((newBS: string) => {
347
+ setBsString(newBS);
348
+ }, []);
349
+
350
+ return (
351
+ <div className="flex flex-col gap-[16px]">
352
+ <BsConditionInput
353
+ targetName="流程结束 或 流程节点"
354
+ fields={mockFields}
355
+ value={bsString}
356
+ onChange={handleChange}
357
+ />
358
+ <div className="text-[12px] text-[#666666] bg-[#F5F5F5] rounded-[4px] p-[8px] font-mono">
359
+ <pre>{bsString}</pre>
360
+ </div>
361
+ </div>
362
+ );
363
+ },
364
+ };
365
+
366
+ export const RangeOperators: Story = {
367
+ args: {
368
+ targetName: '流程结束',
369
+ fields: mockFields,
370
+ service: mockService,
371
+ defaultValue: makeBSString({
372
+ targetName: '流程结束',
373
+ quantifier: 'all',
374
+ items: [
375
+ {
376
+ id: 'range-1',
377
+ field: mockFields[1],
378
+ operator: 'range',
379
+ value: { min: 18, max: 60 },
380
+ },
381
+ {
382
+ id: 'range-2',
383
+ field: mockFields[2],
384
+ operator: 'range',
385
+ value: { min: '2020-01-01T00:00', max: '2025-12-31T23:59' },
386
+ },
387
+ ],
388
+ }),
389
+ },
390
+ };
391
+
392
+ export const MixedOperators: Story = {
393
+ args: {
394
+ targetName: '表单数据',
395
+ fields: mockFields,
396
+ service: mockService,
397
+ defaultValue: makeBSString({
398
+ targetName: '表单数据',
399
+ quantifier: 'all',
400
+ items: [
401
+ {
402
+ id: 'mixed-1',
403
+ field: mockFields[0],
404
+ operator: 'contains',
405
+ value: '张',
406
+ },
407
+ {
408
+ id: 'mixed-2',
409
+ field: mockFields[1],
410
+ operator: 'range',
411
+ value: { min: 0, max: 100 },
412
+ },
413
+ {
414
+ id: 'mixed-3',
415
+ field: mockFields[2],
416
+ operator: 'range',
417
+ value: { min: '2025-01-01T00:00', max: '2025-06-30T23:59' },
418
+ },
419
+ {
420
+ id: 'mixed-4',
421
+ field: mockFields[0],
422
+ operator: 'in',
423
+ value: ['orange', 'grape'],
424
+ },
425
+ ],
426
+ }),
427
+ },
428
+ };
429
+
430
+ export const Disabled: Story = {
431
+ args: {
432
+ targetName: '流程结束 或 流程节点',
433
+ fields: mockFields,
434
+ disabled: true,
435
+ defaultValue: makeBSString({
436
+ targetName: '流程结束 或 流程节点',
437
+ quantifier: 'all',
438
+ items: [
439
+ {
440
+ id: 'item-1',
441
+ field: mockFields[0],
442
+ operator: 'contains',
443
+ value: '张三',
444
+ },
445
+ {
446
+ id: 'item-2',
447
+ field: mockFields[1],
448
+ operator: 'gte',
449
+ value: 18,
450
+ },
451
+ {
452
+ id: 'item-3',
453
+ field: mockFields[5],
454
+ operator: 'in',
455
+ value: ['beijing', 'shanghai'],
456
+ },
457
+ ],
458
+ }),
459
+ },
460
+ };
@@ -43,10 +43,8 @@ export const Default: Story = {};
43
43
  export const WithInitialValue: Story = {
44
44
  args: {
45
45
  value: {
46
- dateRange: {
47
- from: subDays(new Date(), 7),
48
- to: new Date(),
49
- },
46
+ startDate: subDays(new Date(), 7),
47
+ endDate: new Date(),
50
48
  triggerType: 'scheduler',
51
49
  execResult: 'success',
52
50
  },
package/style.css CHANGED
@@ -1,7 +1,4 @@
1
1
  /*! tailwindcss v4.3.0 | MIT License | https://tailwindcss.com */
2
- @layer properties;
3
- @layer theme, base, components, utilities;
4
- @layer theme {
5
2
  :root, :host {
6
3
  --font-sans: ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji",
7
4
  "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";
@@ -107,8 +104,6 @@
107
104
  --sidebar-border: oklch(0.929 0.013 255.508);
108
105
  --sidebar-ring: oklch(0.704 0.04 256.788);
109
106
  }
110
- }
111
- @layer base {
112
107
  *, ::after, ::before, ::backdrop, ::file-selector-button {
113
108
  box-sizing: border-box;
114
109
  margin: 0;
@@ -255,8 +250,6 @@
255
250
  [hidden]:where(:not([hidden="until-found"])) {
256
251
  display: none !important;
257
252
  }
258
- }
259
- @layer utilities {
260
253
  .pointer-events-none {
261
254
  pointer-events: none;
262
255
  }
@@ -3605,7 +3598,6 @@
3605
3598
  white-space: nowrap;
3606
3599
  }
3607
3600
  }
3608
- }
3609
3601
  @property --tw-animation-delay {
3610
3602
  syntax: "*";
3611
3603
  inherits: false;
@@ -3723,7 +3715,6 @@
3723
3715
  --sidebar-border: oklch(1 0 0 / 10%);
3724
3716
  --sidebar-ring: oklch(0.551 0.027 264.364);
3725
3717
  }
3726
- @layer base {
3727
3718
  * {
3728
3719
  border-color: var(--border);
3729
3720
  outline-color: color-mix(in srgb, oklch(0.704 0.04 256.788) 50%, transparent);
@@ -3738,8 +3729,6 @@
3738
3729
  html {
3739
3730
  font-size: 14px;
3740
3731
  }
3741
- }
3742
- @layer components {
3743
3732
  .gradient-border {
3744
3733
  position: relative;
3745
3734
  }
@@ -3756,7 +3745,6 @@
3756
3745
  -webkit-mask-composite: xor;
3757
3746
  mask-composite: exclude;
3758
3747
  }
3759
- }
3760
3748
  .prose {
3761
3749
  --tw-prose-body: #121111;
3762
3750
  }
@@ -4066,7 +4054,6 @@
4066
4054
  transform: translate3d(var(--tw-exit-translate-x, 0), var(--tw-exit-translate-y, 0), 0) scale3d(var(--tw-exit-scale, 1), var(--tw-exit-scale, 1), var(--tw-exit-scale, 1)) rotate(var(--tw-exit-rotate, 0));
4067
4055
  }
4068
4056
  }
4069
- @layer properties {
4070
4057
  @supports ((-webkit-hyphens: none) and (not (margin-trim: inline))) or ((-moz-orient: inline) and (not (color:rgb(from red r g b)))) {
4071
4058
  *, ::before, ::after, ::backdrop {
4072
4059
  --tw-translate-x: 0;
@@ -4142,5 +4129,4 @@
4142
4129
  --tw-exit-translate-y: 0;
4143
4130
  }
4144
4131
  }
4145
- }
4146
4132
  .rdp-root{--rdp-accent-color: blue;--rdp-accent-background-color: #f0f0ff;--rdp-day-height: 44px;--rdp-day-width: 44px;--rdp-day_button-border-radius: 100%;--rdp-day_button-border: 2px solid transparent;--rdp-day_button-height: 42px;--rdp-day_button-width: 42px;--rdp-selected-border: 2px solid var(--rdp-accent-color);--rdp-disabled-opacity: .5;--rdp-outside-opacity: .75;--rdp-today-color: var(--rdp-accent-color);--rdp-dropdown-gap: .5rem;--rdp-months-gap: 2rem;--rdp-nav_button-disabled-opacity: .5;--rdp-nav_button-height: 2.25rem;--rdp-nav_button-width: 2.25rem;--rdp-nav-height: 2.75rem;--rdp-range_middle-background-color: var(--rdp-accent-background-color);--rdp-range_middle-color: inherit;--rdp-range_start-color: white;--rdp-range_start-background: linear-gradient( var(--rdp-gradient-direction), transparent 50%, var(--rdp-range_middle-background-color) 50% );--rdp-range_start-date-background-color: var(--rdp-accent-color);--rdp-range_end-background: linear-gradient( var(--rdp-gradient-direction), var(--rdp-range_middle-background-color) 50%, transparent 50% );--rdp-range_end-color: white;--rdp-range_end-date-background-color: var(--rdp-accent-color);--rdp-week_number-border-radius: 100%;--rdp-week_number-border: 2px solid transparent;--rdp-week_number-height: var(--rdp-day-height);--rdp-week_number-opacity: .75;--rdp-week_number-width: var(--rdp-day-width);--rdp-weeknumber-text-align: center;--rdp-weekday-opacity: .75;--rdp-weekday-padding: .5rem 0rem;--rdp-weekday-text-align: center;--rdp-gradient-direction: 90deg;--rdp-animation_duration: .3s;--rdp-animation_timing: cubic-bezier(.4, 0, .2, 1)}.rdp-root[dir=rtl]{--rdp-gradient-direction: -90deg}.rdp-root[data-broadcast-calendar=true]{--rdp-outside-opacity: unset}.rdp-root{position:relative;box-sizing:border-box}.rdp-root *{box-sizing:border-box}.rdp-day{width:var(--rdp-day-width);height:var(--rdp-day-height);text-align:center}.rdp-day_button{background:none;padding:0;margin:0;cursor:pointer;font:inherit;color:inherit;justify-content:center;align-items:center;display:flex;width:var(--rdp-day_button-width);height:var(--rdp-day_button-height);border:var(--rdp-day_button-border);border-radius:var(--rdp-day_button-border-radius)}.rdp-day_button:disabled{cursor:revert}.rdp-caption_label{z-index:1;position:relative;display:inline-flex;align-items:center;white-space:nowrap;border:0}.rdp-dropdown:focus-visible~.rdp-caption_label{outline:5px auto Highlight;outline:5px auto -webkit-focus-ring-color}.rdp-button_next,.rdp-button_previous{border:none;background:none;padding:0;margin:0;cursor:pointer;font:inherit;color:inherit;-moz-appearance:none;-webkit-appearance:none;display:inline-flex;align-items:center;justify-content:center;position:relative;appearance:none;width:var(--rdp-nav_button-width);height:var(--rdp-nav_button-height)}.rdp-button_next:disabled,.rdp-button_next[aria-disabled=true],.rdp-button_previous:disabled,.rdp-button_previous[aria-disabled=true]{cursor:revert;opacity:var(--rdp-nav_button-disabled-opacity)}.rdp-chevron{display:inline-block;fill:var(--rdp-accent-color)}.rdp-root[dir=rtl] .rdp-nav .rdp-chevron{transform:rotate(180deg);transform-origin:50%}.rdp-dropdowns{position:relative;display:inline-flex;align-items:center;gap:var(--rdp-dropdown-gap)}.rdp-dropdown{z-index:2;opacity:0;appearance:none;position:absolute;inset-block-start:0;inset-block-end:0;inset-inline-start:0;width:100%;margin:0;padding:0;cursor:inherit;border:none;line-height:inherit}.rdp-dropdown_root{position:relative;display:inline-flex;align-items:center}.rdp-dropdown_root[data-disabled=true] .rdp-chevron{opacity:var(--rdp-disabled-opacity)}.rdp-month_caption{display:flex;align-content:center;height:var(--rdp-nav-height);font-weight:700;font-size:large}.rdp-root[data-nav-layout=around] .rdp-month,.rdp-root[data-nav-layout=after] .rdp-month{position:relative}.rdp-root[data-nav-layout=around] .rdp-month_caption{justify-content:center;margin-inline-start:var(--rdp-nav_button-width);margin-inline-end:var(--rdp-nav_button-width);position:relative}.rdp-root[data-nav-layout=around] .rdp-button_previous{position:absolute;inset-inline-start:0;top:0;height:var(--rdp-nav-height);display:inline-flex}.rdp-root[data-nav-layout=around] .rdp-button_next{position:absolute;inset-inline-end:0;top:0;height:var(--rdp-nav-height);display:inline-flex;justify-content:center}.rdp-months{position:relative;display:flex;flex-wrap:wrap;gap:var(--rdp-months-gap);max-width:fit-content}.rdp-month_grid{border-collapse:collapse}.rdp-nav{position:absolute;inset-block-start:0;inset-inline-end:0;display:flex;align-items:center;height:var(--rdp-nav-height)}.rdp-weekday{opacity:var(--rdp-weekday-opacity);padding:var(--rdp-weekday-padding);font-weight:500;font-size:smaller;text-align:var(--rdp-weekday-text-align);text-transform:var(--rdp-weekday-text-transform)}.rdp-week_number{opacity:var(--rdp-week_number-opacity);font-weight:400;font-size:small;height:var(--rdp-week_number-height);width:var(--rdp-week_number-width);border:var(--rdp-week_number-border);border-radius:var(--rdp-week_number-border-radius);text-align:var(--rdp-weeknumber-text-align)}.rdp-today:not(.rdp-outside){color:var(--rdp-today-color)}.rdp-selected{font-weight:700;font-size:large}.rdp-selected .rdp-day_button{border:var(--rdp-selected-border)}.rdp-outside{opacity:var(--rdp-outside-opacity)}.rdp-disabled:not(.rdp-selected){opacity:var(--rdp-disabled-opacity)}.rdp-hidden{visibility:hidden;color:var(--rdp-range_start-color)}.rdp-range_start{background:var(--rdp-range_start-background)}.rdp-range_start .rdp-day_button{background-color:var(--rdp-range_start-date-background-color);color:var(--rdp-range_start-color)}.rdp-range_middle{background-color:var(--rdp-range_middle-background-color)}.rdp-range_middle .rdp-day_button{border:unset;border-radius:unset;color:var(--rdp-range_middle-color)}.rdp-range_end{background:var(--rdp-range_end-background);color:var(--rdp-range_end-color)}.rdp-range_end .rdp-day_button{color:var(--rdp-range_start-color);background-color:var(--rdp-range_end-date-background-color)}.rdp-range_start.rdp-range_end{background:revert}.rdp-focusable{cursor:pointer}@keyframes rdp-slide_in_left{0%{transform:translate(-100%)}to{transform:translate(0)}}@keyframes rdp-slide_in_right{0%{transform:translate(100%)}to{transform:translate(0)}}@keyframes rdp-slide_out_left{0%{transform:translate(0)}to{transform:translate(-100%)}}@keyframes rdp-slide_out_right{0%{transform:translate(0)}to{transform:translate(100%)}}.rdp-weeks_before_enter{animation:rdp-slide_in_left var(--rdp-animation_duration) var(--rdp-animation_timing) forwards}.rdp-weeks_before_exit{animation:rdp-slide_out_left var(--rdp-animation_duration) var(--rdp-animation_timing) forwards}.rdp-weeks_after_enter{animation:rdp-slide_in_right var(--rdp-animation_duration) var(--rdp-animation_timing) forwards}.rdp-weeks_after_exit{animation:rdp-slide_out_right var(--rdp-animation_duration) var(--rdp-animation_timing) forwards}.rdp-root[dir=rtl] .rdp-weeks_after_enter{animation:rdp-slide_in_left var(--rdp-animation_duration) var(--rdp-animation_timing) forwards}.rdp-root[dir=rtl] .rdp-weeks_before_exit{animation:rdp-slide_out_right var(--rdp-animation_duration) var(--rdp-animation_timing) forwards}.rdp-root[dir=rtl] .rdp-weeks_before_enter{animation:rdp-slide_in_right var(--rdp-animation_duration) var(--rdp-animation_timing) forwards}.rdp-root[dir=rtl] .rdp-weeks_after_exit{animation:rdp-slide_out_left var(--rdp-animation_duration) var(--rdp-animation_timing) forwards}@keyframes rdp-fade_in{0%{opacity:0}to{opacity:1}}@keyframes rdp-fade_out{0%{opacity:1}to{opacity:0}}.rdp-caption_after_enter{animation:rdp-fade_in var(--rdp-animation_duration) var(--rdp-animation_timing) forwards}.rdp-caption_after_exit{animation:rdp-fade_out var(--rdp-animation_duration) var(--rdp-animation_timing) forwards}.rdp-caption_before_enter{animation:rdp-fade_in var(--rdp-animation_duration) var(--rdp-animation_timing) forwards}.rdp-caption_before_exit{animation:rdp-fade_out var(--rdp-animation_duration) var(--rdp-animation_timing) forwards}