@clicktap/ui 0.14.19 → 0.14.25

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 (198) hide show
  1. package/components/ContextMenu/ContextMenu.js +1 -1
  2. package/components/Dialog/Dialog.js +1 -1
  3. package/components/DialogTrigger/DialogTrigger.js +1 -1
  4. package/components/Drawer/Drawer.js +1 -1
  5. package/components/ModalOverlay/ModalOverlay.js +1 -1
  6. package/components/PinInput/PinInput.js +1 -1
  7. package/components/Select/Select.js +1 -1
  8. package/components/Tabs/Tabs.context.d.ts +3 -0
  9. package/package.json +1 -1
  10. package/components/Accordion/Accordion.tsx +0 -82
  11. package/components/Accordion/index.ts +0 -3
  12. package/components/Avatar/Avatar.stories.tsx +0 -99
  13. package/components/Avatar/Avatar.tsx +0 -120
  14. package/components/Avatar/Avatar.types.ts +0 -3
  15. package/components/Avatar/AvatarGroup/AvatarGroup.tsx +0 -32
  16. package/components/Avatar/AvatarGroup/AvatarGroup.types.ts +0 -8
  17. package/components/Avatar/index.ts +0 -4
  18. package/components/Badge/Badge.stories.tsx +0 -72
  19. package/components/Badge/Badge.tsx +0 -169
  20. package/components/Badge/Badge.types.ts +0 -3
  21. package/components/Badge/index.ts +0 -2
  22. package/components/Breadcrumbs/BreadcrumbEllipsis.tsx +0 -47
  23. package/components/Breadcrumbs/BreadcrumbEllipsis.types.ts +0 -5
  24. package/components/Breadcrumbs/BreadcrumbItem.tsx +0 -23
  25. package/components/Breadcrumbs/BreadcrumbItem.types.ts +0 -3
  26. package/components/Breadcrumbs/BreadcrumbLink.tsx +0 -30
  27. package/components/Breadcrumbs/BreadcrumbLink.types.ts +0 -3
  28. package/components/Breadcrumbs/BreadcrumbSeparator.tsx +0 -41
  29. package/components/Breadcrumbs/BreadcrumbSeparator.types.ts +0 -9
  30. package/components/Breadcrumbs/Breadcrumbs.tsx +0 -28
  31. package/components/Breadcrumbs/Breadcrumbs.types.ts +0 -6
  32. package/components/Breadcrumbs/index.ts +0 -10
  33. package/components/Button/Button.tsx +0 -72
  34. package/components/Button/Button.types.ts +0 -7
  35. package/components/Button/index.ts +0 -2
  36. package/components/Card/Card.tsx +0 -15
  37. package/components/Card/Card.types.ts +0 -3
  38. package/components/Card/index.ts +0 -2
  39. package/components/Checkbox/Checkbox.tsx +0 -122
  40. package/components/Checkbox/Checkbox.types.ts +0 -15
  41. package/components/Checkbox/index.ts +0 -2
  42. package/components/Collapsible/Collapsible.tsx +0 -34
  43. package/components/Collapsible/Collapsible.types.ts +0 -5
  44. package/components/Collapsible/CollapsibleTrigger.tsx +0 -57
  45. package/components/Collapsible/CollapsibleTrigger.types.ts +0 -14
  46. package/components/Collapsible/index.ts +0 -10
  47. package/components/Container/Container.tsx +0 -26
  48. package/components/Container/Container.types.ts +0 -3
  49. package/components/Container/index.ts +0 -2
  50. package/components/ContextMenu/ContextMenu.tsx +0 -74
  51. package/components/ContextMenu/ContextMenu.types.ts +0 -17
  52. package/components/ContextMenu/index.ts +0 -2
  53. package/components/CreditCardExpirationInput/CreditCardExpirationInput.tsx +0 -115
  54. package/components/CreditCardExpirationInput/CreditCardExpirationInput.types.ts +0 -10
  55. package/components/CreditCardExpirationInput/index.ts +0 -2
  56. package/components/CreditCardInput/CreditCardInput.tsx +0 -147
  57. package/components/CreditCardInput/CreditCardInput.types.ts +0 -12
  58. package/components/CreditCardInput/index.ts +0 -2
  59. package/components/DateInput/DateInput.tsx +0 -81
  60. package/components/DateInput/DateInput.types.ts +0 -15
  61. package/components/DateInput/index.ts +0 -2
  62. package/components/DateTimeFormat/DateTimeFormat.tsx +0 -16
  63. package/components/DateTimeFormat/DateTimeFormat.types.ts +0 -7
  64. package/components/DateTimeFormat/index.ts +0 -2
  65. package/components/Dialog/Dialog.tsx +0 -65
  66. package/components/Dialog/Dialog.types.ts +0 -9
  67. package/components/Dialog/index.ts +0 -2
  68. package/components/DialogTrigger/DialogTrigger.tsx +0 -45
  69. package/components/DialogTrigger/DialogTrigger.types.ts +0 -6
  70. package/components/DialogTrigger/index.ts +0 -5
  71. package/components/Divider/Divider.stories.tsx +0 -37
  72. package/components/Divider/Divider.tsx +0 -34
  73. package/components/Divider/Divider.types.ts +0 -5
  74. package/components/Divider/index.ts +0 -2
  75. package/components/DobInput/DobInput.tsx +0 -120
  76. package/components/DobInput/index.ts +0 -2
  77. package/components/Drawer/Drawer.tsx +0 -126
  78. package/components/Drawer/Drawer.types.ts +0 -11
  79. package/components/Drawer/index.ts +0 -2
  80. package/components/Icon/Account.tsx +0 -50
  81. package/components/Icon/Cart.tsx +0 -43
  82. package/components/Icon/Checkmark.tsx +0 -34
  83. package/components/Icon/Cross.tsx +0 -36
  84. package/components/Icon/DownArrow.tsx +0 -23
  85. package/components/Icon/Hamburger.tsx +0 -23
  86. package/components/Icon/Icon.types.ts +0 -8
  87. package/components/Icon/LinkArrow.tsx +0 -32
  88. package/components/Icon/Minus.tsx +0 -20
  89. package/components/Icon/Plus.tsx +0 -20
  90. package/components/Icon/Search.tsx +0 -36
  91. package/components/Icon/Trash.tsx +0 -27
  92. package/components/Icon/Verified.tsx +0 -20
  93. package/components/Icon/index.ts +0 -14
  94. package/components/Image/Image.tsx +0 -32
  95. package/components/Image/index.ts +0 -2
  96. package/components/Input/Input.tsx +0 -109
  97. package/components/Input/Input.types.ts +0 -17
  98. package/components/Input/index.ts +0 -2
  99. package/components/Link/Link.stories.tsx +0 -96
  100. package/components/Link/Link.tsx +0 -39
  101. package/components/Link/Link.types.ts +0 -3
  102. package/components/Link/index.ts +0 -2
  103. package/components/Loader/CircularEasing.tsx +0 -66
  104. package/components/Loader/CircularEasing.types.ts +0 -8
  105. package/components/Loader/Pulse.tsx +0 -45
  106. package/components/Loader/Pulse.types.ts +0 -5
  107. package/components/Loader/index.ts +0 -4
  108. package/components/Menu/ContextMenu.tsx +0 -83
  109. package/components/Menu/Menu.tsx +0 -143
  110. package/components/Menu/Menu.types.ts +0 -44
  111. package/components/Menu/index.ts +0 -4
  112. package/components/Meter/Meter.stories.tsx +0 -111
  113. package/components/Meter/Meter.tsx +0 -68
  114. package/components/Meter/Meter.types.ts +0 -10
  115. package/components/Meter/index.ts +0 -2
  116. package/components/Modal/Modal.tsx +0 -16
  117. package/components/Modal/Modal.types.ts +0 -6
  118. package/components/Modal/index.ts +0 -2
  119. package/components/ModalOverlay/ModalOverlay.tsx +0 -121
  120. package/components/ModalOverlay/ModalOverlay.types.ts +0 -18
  121. package/components/ModalOverlay/index.ts +0 -2
  122. package/components/NumberFormat/NumberFormat.tsx +0 -19
  123. package/components/NumberFormat/NumberFormat.types.ts +0 -8
  124. package/components/NumberFormat/index.ts +0 -2
  125. package/components/NumberInput/NumberInput.tsx +0 -164
  126. package/components/NumberInput/NumberInput.types.ts +0 -22
  127. package/components/NumberInput/index.ts +0 -2
  128. package/components/NumberTicker/DigitResolver.tsx +0 -119
  129. package/components/NumberTicker/DigitResolver.types.ts +0 -18
  130. package/components/NumberTicker/NumberTicker.tsx +0 -56
  131. package/components/NumberTicker/NumberTicker.types.ts +0 -96
  132. package/components/NumberTicker/hooks/useColumnTransition.ts +0 -36
  133. package/components/NumberTicker/hooks/useNumberDelta.ts +0 -19
  134. package/components/NumberTicker/hooks/useNumberTicker.ts +0 -36
  135. package/components/NumberTicker/index.ts +0 -10
  136. package/components/Pagination/Pagination.tsx +0 -44
  137. package/components/Pagination/index.ts +0 -2
  138. package/components/PasswordCheck/PasswordCheck.tsx +0 -59
  139. package/components/PasswordCheck/PasswordCheck.types.ts +0 -4
  140. package/components/PasswordCheck/PasswordCheck.utils.ts +0 -47
  141. package/components/PasswordCheck/index.ts +0 -2
  142. package/components/PhoneInput/PhoneInput.tsx +0 -191
  143. package/components/PhoneInput/index.ts +0 -2
  144. package/components/PinInput/PinInput.tsx +0 -318
  145. package/components/PinInput/PinInput.types.ts +0 -21
  146. package/components/PinInput/index.ts +0 -2
  147. package/components/Progressbar/CircularProgressbar.tsx +0 -71
  148. package/components/Progressbar/CircularProgressbar.types.ts +0 -10
  149. package/components/Progressbar/LinearProgressbar.tsx +0 -75
  150. package/components/Progressbar/LinearProgressbar.types.ts +0 -11
  151. package/components/Progressbar/index.ts +0 -4
  152. package/components/Radio/Radio.tsx +0 -88
  153. package/components/Radio/Radio.types.ts +0 -16
  154. package/components/Radio/index.ts +0 -2
  155. package/components/RadioGroup/RadioGroup.tsx +0 -49
  156. package/components/RadioGroup/RadioGroup.types.ts +0 -7
  157. package/components/RadioGroup/index.ts +0 -2
  158. package/components/Select/Option.tsx +0 -32
  159. package/components/Select/Option.types.ts +0 -3
  160. package/components/Select/Select.tsx +0 -272
  161. package/components/Select/Select.types.ts +0 -48
  162. package/components/Select/index.ts +0 -8
  163. package/components/Skeleton/Skeleton.tsx +0 -15
  164. package/components/Skeleton/Skeleton.types.ts +0 -3
  165. package/components/Skeleton/index.ts +0 -2
  166. package/components/Slider/Slider.tsx +0 -110
  167. package/components/Slider/Slider.types.ts +0 -11
  168. package/components/Slider/index.ts +0 -2
  169. package/components/Switch/Switch.tsx +0 -63
  170. package/components/Switch/Switch.types.ts +0 -8
  171. package/components/Switch/index.ts +0 -2
  172. package/components/Table/Table.tsx +0 -52
  173. package/components/Table/Table.types.ts +0 -22
  174. package/components/Table/index.ts +0 -2
  175. package/components/Tabs/Tab.tsx +0 -118
  176. package/components/Tabs/Tab.types.ts +0 -10
  177. package/components/Tabs/TabList.tsx +0 -51
  178. package/components/Tabs/TabList.types.ts +0 -12
  179. package/components/Tabs/TabPanel.tsx +0 -19
  180. package/components/Tabs/TabPanel.types.ts +0 -3
  181. package/components/Tabs/Tabs.context.tsx +0 -9
  182. package/components/Tabs/Tabs.tsx +0 -39
  183. package/components/Tabs/Tabs.types.ts +0 -3
  184. package/components/Tabs/index.ts +0 -9
  185. package/components/TimeInput/TimeInput.stories.tsx +0 -125
  186. package/components/TimeInput/TimeInput.tsx +0 -81
  187. package/components/TimeInput/TimeInput.types.ts +0 -15
  188. package/components/TimeInput/index.ts +0 -2
  189. package/components/ToggleButton/ToggleButton.stories.tsx +0 -89
  190. package/components/ToggleButton/ToggleButton.tsx +0 -69
  191. package/components/ToggleButton/ToggleButton.types.ts +0 -6
  192. package/components/ToggleButton/index.ts +0 -2
  193. package/components/Tooltip/Tooltip.tsx +0 -59
  194. package/components/Tooltip/Tooltip.types.ts +0 -3
  195. package/components/Tooltip/index.ts +0 -2
  196. package/components/UploadImage/UploadImage.tsx +0 -206
  197. package/components/UploadImage/UploadImage.types.ts +0 -15
  198. package/components/UploadImage/index.ts +0 -2
@@ -1,125 +0,0 @@
1
- import type { Meta, StoryObj } from '@storybook/react';
2
- import { Form } from 'react-aria-components';
3
- import { action } from '@storybook/addon-actions';
4
- import { TimeInput } from './TimeInput';
5
- import { TimeInputProps } from './TimeInput.types';
6
- import { Button } from '../Button/Button';
7
-
8
- type Story = StoryObj<typeof TimeInput>;
9
-
10
- function Component({ children, ...props }: TimeInputProps) {
11
- return (
12
- <Form
13
- style={{
14
- display: 'flex',
15
- flexDirection: 'column',
16
- gap: '0.5rem',
17
- width: '20rem',
18
- }}
19
- onSubmit={(e) => {
20
- e.preventDefault();
21
- action('onPress');
22
- }}
23
- >
24
- {/* eslint-disable-next-line react/jsx-props-no-spreading */}
25
- <TimeInput {...props}>{children}</TimeInput>
26
- <Button size="sm" type="submit">
27
- Submit
28
- </Button>
29
- </Form>
30
- );
31
- }
32
-
33
- const meta: Meta<typeof TimeInput> = {
34
- component: Component,
35
- };
36
-
37
- export default meta;
38
-
39
- export const Base: Story = {
40
- argTypes: {
41
- label: {
42
- control: 'text',
43
- description: 'The content to display as label',
44
- },
45
- description: {
46
- control: 'text',
47
- description: 'The content to display as description',
48
- },
49
- isDisabled: {
50
- control: 'boolean',
51
- description: 'Whether the input is disabled.',
52
- },
53
- isInvalid: {
54
- control: 'boolean',
55
- description: 'Whether the input value is invalid.',
56
- },
57
- isRequired: {
58
- control: 'boolean',
59
- description:
60
- 'Whether user input is required on the input before form submission.',
61
- },
62
- isReadOnly: {
63
- control: 'boolean',
64
- description:
65
- 'Whether the input can be selected but not changed by the user.',
66
- },
67
- hideTimeZone: {
68
- control: 'boolean',
69
- description: 'Whether to hide the time zone abbreviation.',
70
- },
71
- shouldForceLeadingZeros: {
72
- control: 'boolean',
73
- description:
74
- 'Whether to always show leading zeros in the hour field. By default, this is determined by the user&aposs locale.',
75
- },
76
- hourCycle: {
77
- options: [12, 24],
78
- control: { type: 'inline-radio' },
79
- description:
80
- 'Whether to display the time in 12 or 24 hour format. By default, this is determined by the user&apos;s locale.',
81
- },
82
- granularity: {
83
- options: ['hour', 'minute', 'second'],
84
- control: { type: 'inline-radio' },
85
- description:
86
- 'Determines the smallest unit that is displayed in the time picker',
87
- table: {
88
- defaultValue: { summary: 'minute' },
89
- },
90
- },
91
- errorMessage: {
92
- control: 'text',
93
- description: 'The current error messages for the input if it is invalid.',
94
- },
95
- style: {
96
- control: 'object',
97
- description:
98
- 'The inline style for the element. A function may be provided to compute the style based on component state',
99
- },
100
- className: {
101
- control: 'text',
102
- description: 'The CSS className for the element.',
103
- },
104
- autoFocus: {
105
- control: 'boolean',
106
- description: 'Whether the element should receive focus on render.',
107
- },
108
- },
109
- args: {
110
- label: '',
111
- description: '',
112
- isDisabled: false,
113
- isInvalid: false,
114
- isRequired: false,
115
- isReadOnly: false,
116
- errorMessage: 'Please fill out this field.',
117
- shouldForceLeadingZeros: false,
118
- hideTimeZone: false,
119
- hourCycle: 24,
120
- granularity: 'minute',
121
- autoFocus: false,
122
- style: {},
123
- className: '',
124
- },
125
- };
@@ -1,81 +0,0 @@
1
- 'use client';
2
-
3
- import {
4
- DateInput,
5
- DateSegment,
6
- FieldError,
7
- Label,
8
- Text,
9
- TimeField,
10
- } from 'react-aria-components';
11
- import { TimeInputProps } from './TimeInput.types';
12
- import { cn } from '../../utils/cn';
13
-
14
- export function TimeInput({
15
- label,
16
- description,
17
- errorMessage,
18
- className,
19
- classNames,
20
- ...props
21
- }: TimeInputProps) {
22
- return (
23
- <TimeField
24
- className={cn('text-slate-900', className)}
25
- // eslint-disable-next-line react/jsx-props-no-spreading
26
- {...props}
27
- >
28
- <Label className={cn('flex text-slate-500 text-sm', classNames?.label)}>
29
- {label}
30
- </Label>
31
- <DateInput
32
- className={cn(
33
- 'flex items-center',
34
- 'border-solid border border-slate-300 rounded-md',
35
- 'text-sm text-slate-900',
36
- 'h-10 px-1 py-0 m-0 w-full',
37
- 'bg-white',
38
- 'transition-all duration-200 ease-in-out',
39
- 'hover:border-slate-400',
40
- 'focus-within:outline-2 focus-within:outline focus-within:outline-slate-200 focus-within:border-slate-400',
41
- 'disabled:border-slate-200 disabled:bg-slate-100',
42
- 'invalid:border-red-500 invalid:bg-red-100 invalid:text-red-600',
43
- 'invalid:hover:border-red-600 invalid:focus-within:border-red-600 invalid:focus-within:outline-red-200',
44
- classNames?.input
45
- )}
46
- >
47
- {(segment) => (
48
- <DateSegment
49
- segment={segment}
50
- className={cn(
51
- 'p-1 tabular-nums text-end text-slate-900',
52
- 'invalid:text-red-500',
53
- 'disabled:cursor-default disabled:select-none disabled:text-slate-400',
54
- 'focus:text-slate-900 focus:bg-slate-200 focus:outline-0 focus:rounded-md focus:caret-transparent focus:invalid:bg-red-500 focus:invalid:text-white',
55
- 'type-literal:p-0.5',
56
- 'data-[placeholder]:text-slate-400 data-[placeholder]:invalid:text-red-500 data-[placeholder]:invalid:focus:text-white',
57
- 'aria-[readonly]:focus-visible:outline aria-[readonly]:focus-visible:outline-slate-500 aria-[readonly]:focus-visible:outline-1',
58
- 'aria-[readonly]:focus:outline aria-[readonly]:focus:outline-slate-500 aria-[readonly]:focus:bg-transparent aria-[readonly]:focus:outline-2',
59
- classNames?.segment
60
- )}
61
- />
62
- )}
63
- </DateInput>
64
- {description && (
65
- <Text
66
- className={cn('flex text-slate-500 text-sm', classNames?.description)}
67
- slot="description"
68
- >
69
- {description}
70
- </Text>
71
- )}
72
- <FieldError
73
- className={cn('flex text-red-500 text-sm', classNames?.error)}
74
- >
75
- {errorMessage}
76
- </FieldError>
77
- </TimeField>
78
- );
79
- }
80
-
81
- export default TimeInput;
@@ -1,15 +0,0 @@
1
- import type {
2
- TimeFieldProps,
3
- TimeValue,
4
- ValidationResult,
5
- } from 'react-aria-components';
6
- import type { SlotsToClasses } from '../../types/SlotsToClasses';
7
-
8
- export interface TimeInputProps extends TimeFieldProps<TimeValue> {
9
- label?: string;
10
- description?: string;
11
- errorMessage?: string | ((validation: ValidationResult) => string);
12
- classNames?: SlotsToClasses<
13
- 'label' | 'input' | 'description' | 'error' | 'segment'
14
- >;
15
- }
@@ -1,2 +0,0 @@
1
- export { TimeInput } from './TimeInput';
2
- export type { TimeInputProps } from './TimeInput.types';
@@ -1,89 +0,0 @@
1
- import type { Meta, StoryObj } from '@storybook/react';
2
- import { action } from '@storybook/addon-actions';
3
- import { ToggleButtonProps } from 'react-aria-components';
4
- import { ToggleButton } from './ToggleButton';
5
-
6
- type Story = StoryObj<typeof ToggleButton>;
7
-
8
- function Component({ children, ...props }: ToggleButtonProps) {
9
- return <ToggleButton {...props}>{children}</ToggleButton>;
10
- }
11
-
12
- const meta: Meta<typeof ToggleButton> = {
13
- component: Component,
14
- };
15
-
16
- export default meta;
17
-
18
- export const Example: Story = {
19
- argTypes: {
20
- variant: {
21
- options: ['solid', 'outline', 'ghost'],
22
- control: 'select',
23
- },
24
- size: {
25
- options: ['sm', 'md', 'lg'],
26
- control: 'select',
27
- },
28
- isSelected: {
29
- control: 'boolean',
30
- },
31
- isDisabled: {
32
- control: 'boolean',
33
- },
34
- defaultSelected: {
35
- control: 'boolean',
36
- },
37
- autoFocus: {
38
- control: 'boolean',
39
- },
40
- // type: {
41
- // options: ['button', 'submit', 'reset'],
42
- // control: { type: 'radio' },
43
- // },
44
- excludeFromTabOrder: {
45
- control: 'boolean',
46
- },
47
- children: {
48
- control: 'text',
49
- },
50
- className: {
51
- control: 'object',
52
- },
53
- style: {
54
- control: 'object',
55
- },
56
- onChange: {},
57
- onPress: {},
58
- onPressStart: {},
59
- onPressEnd: {},
60
- onPressChange: {},
61
- onPressUp: {},
62
- onFocus: {},
63
- onBlur: {},
64
- onFocusChange: {},
65
- onKeyDown: {},
66
- onKeyUp: {},
67
- },
68
- args: {
69
- variant: 'solid',
70
- size: 'md',
71
- isSelected: false,
72
- isDisabled: false,
73
- autoFocus: false,
74
- defaultSelected: false,
75
- excludeFromTabOrder: false,
76
- // type: 'button',
77
- children: 'Press me',
78
- onPress: action('onPress'),
79
- onPressStart: action('onPressStart'),
80
- onPressEnd: action('onPressEnd'),
81
- onPressChange: action('onPressChange'),
82
- onPressUp: action('onPressUp'),
83
- onFocus: action('onFocus'),
84
- onBlur: action('onBlur'),
85
- onFocusChange: action('onFocusChange'),
86
- onKeyDown: action('onKeyDown'),
87
- onKeyUp: action('onKeyUp'),
88
- },
89
- };
@@ -1,69 +0,0 @@
1
- 'use client';
2
-
3
- import { ToggleButton as AriaToggleButton } from 'react-aria-components';
4
- import { cn } from '../../utils/cn';
5
- import { ToggleButtonProps } from './ToggleButton.types';
6
-
7
- export function ToggleButton({
8
- children,
9
- size = 'md',
10
- variant = 'solid',
11
- className,
12
- ...props
13
- }: ToggleButtonProps) {
14
- return (
15
- <AriaToggleButton
16
- className={(renderProps) => {
17
- const { isDisabled } = renderProps;
18
- return cn(
19
- 'flex items-center justify-center',
20
- 'font-semibold text-sm',
21
- 'rounded-md border-solid border',
22
- 'px-4',
23
- 'transition-all duration-200 ease-in-out',
24
- 'focus:outline-2 focus:outline focus:outline-slate-200 pressed:scale-95',
25
- {
26
- 'h-8': size === 'sm',
27
- 'h-10': size === 'md',
28
- 'h-12': size === 'lg',
29
- },
30
- [
31
- variant === 'ghost' && [
32
- 'bg-transparent hover:bg-transparent focus:bg-transparent disabled:bg-transparent',
33
- 'border-transparent hover:border-transparent focus:border-transparent disabled:border-transparent',
34
- 'text-slate-900 disabled:text-slate-400',
35
- isDisabled && ['disabled:text-slate-900', 'opacity-75'],
36
- ],
37
- variant === 'outline' && [
38
- 'bg-transparent hover:bg-transparent focus:bg-transparent disabled:bg-transparent',
39
- 'border-slate-300 hover:border-slate-400 focus:border-slate-400 disabled:border-slate-200',
40
- 'text-slate-900 disabled:text-slate-500',
41
- isDisabled && [
42
- 'disabled:border-slate-300',
43
- 'disabled:text-slate-900',
44
- 'opacity-75',
45
- ],
46
- ],
47
- variant === 'solid' && [
48
- 'bg-slate-800 hover:bg-slate-900 focus:bg-slate-900 disabled:bg-slate-900',
49
- 'border-slate-800 hover:border-slate-900 focus:border-slate-900 disabled:border-slate-200',
50
- 'text-white disabled:text-slate-400',
51
- isDisabled && [
52
- 'disabled:border-slate-900',
53
- 'disabled:text-white',
54
- 'opacity-75',
55
- ],
56
- ],
57
- ],
58
- typeof className === 'function' ? className(renderProps) : className
59
- );
60
- }}
61
- // eslint-disable-next-line react/jsx-props-no-spreading
62
- {...props}
63
- >
64
- {children}
65
- </AriaToggleButton>
66
- );
67
- }
68
-
69
- export default ToggleButton;
@@ -1,6 +0,0 @@
1
- import { ToggleButtonProps as AriaToggleButtonProps } from 'react-aria-components';
2
-
3
- export type ToggleButtonProps = AriaToggleButtonProps & {
4
- variant?: 'solid' | 'outline' | 'ghost';
5
- size?: 'sm' | 'md' | 'lg';
6
- };
@@ -1,2 +0,0 @@
1
- export { ToggleButton } from './ToggleButton';
2
- export type { ToggleButtonProps } from './ToggleButton.types';
@@ -1,59 +0,0 @@
1
- 'use client';
2
-
3
- import { forwardRef } from 'react';
4
- import { Tooltip as UiTooltip } from '@nextui-org/tooltip';
5
- import { cn } from '../../utils/cn';
6
- import type { TooltipProps } from './Tooltip.types';
7
-
8
- export const Tooltip = forwardRef<HTMLDivElement, TooltipProps>(
9
- function Tooltip(
10
- { classNames, placement, showArrow = false, ...props },
11
- ref
12
- ) {
13
- return (
14
- <UiTooltip
15
- classNames={{
16
- base: [
17
- cn([
18
- 'z-0 relative bg-transparent outline-none',
19
- 'focus-visible:z-10 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-slate-500',
20
-
21
- // arrow styles
22
- 'before:absolute before:rotate-45 before:w-2.5 before:h-2.5 before:rounded-sm before:bg-slate-500 before:shadow-sm',
23
- 'before:hidden data-[arrow=true]:before:block',
24
- 'data-[placement=bottom]:before:-top-1 data-[placement=bottom]:before:left-1/2 data-[placement=bottom]:before:rotate-45 data-[placement=bottom]:before:-translate-x-1/2',
25
- 'data-[placement=bottom-end]:before:-top-1 data-[placement=bottom-end]:before:left-1/2 data-[placement=bottom-end]:before:rotate-45 data-[placement=bottom-end]:before:-translate-x-1/2',
26
- 'data-[placement=bottom-start]:before:-top-1 data-[placement=bottom-start]:before:left-1/2 data-[placement=bottom-start]:before:rotate-45 data-[placement=bottom-start]:before:-translate-x-1/2',
27
- 'data-[placement=left]:before:-right-1 data-[placement=left]:before:top-1/2 data-[placement=left]:before:-translate-y-1/2',
28
- 'data-[placement=left-end]:before:-right-1 data-[placement=left-end]:before:top-1/2 data-[placement=left-end]:before:-translate-y-1/2',
29
- 'data-[placement=left-start]:before:-right-1 data-[placement=left-start]:before:top-1/2 data-[placement=left-start]:before:-translate-y-1/2',
30
- 'data-[placement=right]:before:-left-1 data-[placement=right]:before:top-1/2 data-[placement=right]:before:-translate-y-1/2',
31
- 'data-[placement=right-end]:before:-left-1 data-[placement=right-end]:before:top-1/2 data-[placement=right-end]:before:-translate-y-1/2',
32
- 'data-[placement=right-start]:before:-left-1 data-[placement=right-start]:before:top-1/2 data-[placement=right-start]:before:-translate-y-1/2',
33
- 'data-[placement=top]:before:-bottom-1 data-[placement=top]:before:left-1/2 data-[placement=top]:before:rotate-45 data-[placement=top]:before:-translate-x-1/2',
34
- 'data-[placement=top-end]:before:-bottom-1 data-[placement=top-end]:before:left-1/2 data-[placement=top-end]:before:rotate-45 data-[placement=top-end]:before:-translate-x-1/2',
35
- 'data-[placement=top-start]:before:-bottom-1 data-[placement=top-start]:before:left-1/2 data-[placement=top-start]:before:rotate-45 data-[placement=top-start]:before:-translate-x-1/2',
36
-
37
- classNames?.base,
38
- ]),
39
- ],
40
- content: [
41
- cn([
42
- 'inline-flex flex-col items-center justify-center outline-none',
43
- 'w-full py-1 px-2.5 z-10 box-border bg-slate-500 rounded-md shadow-sm',
44
- 'text-sm text-white subpixel-antialiased',
45
- classNames?.content,
46
- ]),
47
- ],
48
- }}
49
- placement={placement}
50
- showArrow={showArrow}
51
- // eslint-disable-next-line react/jsx-props-no-spreading
52
- {...props}
53
- ref={ref}
54
- />
55
- );
56
- }
57
- );
58
-
59
- export default Tooltip;
@@ -1,3 +0,0 @@
1
- import type { TooltipProps as UITooltipProps } from '@nextui-org/tooltip';
2
-
3
- export type TooltipProps = UITooltipProps;
@@ -1,2 +0,0 @@
1
- export { Tooltip } from './Tooltip';
2
- export type { TooltipProps } from './Tooltip.types';
@@ -1,206 +0,0 @@
1
- 'use client';
2
-
3
- import { forwardRef, useState } from 'react';
4
- import type { ChangeEvent } from 'react';
5
- import { motion } from 'framer-motion';
6
- import Image from 'next/image';
7
-
8
- import { FieldError } from 'react-aria-components';
9
- import { cn } from '../../utils/cn';
10
- import type { UploadImageProps } from './UploadImage.types';
11
- import { useIsClient } from '../../hooks/useIsClient';
12
- import { Skeleton } from '../Skeleton';
13
-
14
- function UploadImageLoader({
15
- hasTitle,
16
- className,
17
- }: {
18
- hasTitle: boolean;
19
- className: NonNullable<UploadImageProps['classNames']>['skeleton'];
20
- }) {
21
- return (
22
- <div className="w-full h-full flex flex-col gap-4">
23
- {hasTitle && <Skeleton className="w-1/2 h-8 mx-auto rounded-md z-20" />}
24
- <Skeleton
25
- className={cn('w-full h-56 rounded-md z-20 relative', className)}
26
- />
27
- </div>
28
- );
29
- }
30
-
31
- export const UploadImage = forwardRef<HTMLInputElement, UploadImageProps>(
32
- (
33
- {
34
- title,
35
- description = 'Preview will display here.',
36
- fileExtension,
37
- actionTitle = 'select file',
38
- variant,
39
- errorMessage,
40
- defaultImagePath,
41
- classNames,
42
- ...props
43
- },
44
- ref
45
- ) => {
46
- const isClient = useIsClient();
47
- const [image, setImage] = useState<{
48
- src: string | null;
49
- alt: string | null;
50
- }>({
51
- src: null,
52
- alt: null,
53
- });
54
-
55
- const invalid = !!errorMessage;
56
-
57
- const accept = fileExtension
58
- ? fileExtension
59
- .split(',')
60
- .map((val) => `image/${val.trim()}`)
61
- .join(', ')
62
- : 'image/*';
63
-
64
- return (
65
- <div className={cn('w-full h-full', 'flex flex-col gap-4')}>
66
- {isClient ? (
67
- <>
68
- {title && (
69
- <h6 className={cn('text-center', 'text-2xl', 'm-0 mb-4')}>
70
- {title}
71
- </h6>
72
- )}
73
- <div
74
- className={cn(
75
- 'w-full h-full',
76
- 'flex flex-col justify-between gap-5 items-center',
77
- ['bg-slate-100', variant === 'base' && 'bg-transparent'],
78
- 'rounded-md',
79
- [variant === 'base' && 'rounded-none'],
80
- ['p-6 lg:p-7', variant === 'base' && 'p-0 lg:p-0']
81
- )}
82
- >
83
- <label
84
- htmlFor={`${props?.name}-upload-file`}
85
- aria-label="image upload"
86
- // eslint-disable-next-line @typescript-eslint/ban-ts-comment
87
- // @ts-ignore
88
- onChange={(e: ChangeEvent<HTMLInputElement>) => {
89
- const {
90
- target: { files },
91
- } = e;
92
- if (files) {
93
- setImage({
94
- src: URL.createObjectURL(files[0]),
95
- alt: files[0].name,
96
- });
97
- }
98
- }}
99
- className={cn(
100
- 'inline-flex justify-center items-center',
101
- 'uppercase text-base border-slate-200',
102
- 'bg-transparent',
103
- 'border-1 border-solid',
104
- 'px-4 py-0',
105
- 'rounded-2xl',
106
- 'cursor-pointer',
107
- 'w-full h-9',
108
- ['max-w-48', variant === 'base' && 'max-w-none'],
109
- 'my-0 mx-auto',
110
- 'has-[:disabled]:bg-transparent has-[:disabled]:text-slate-950',
111
- 'hover:bg-slate-100s hover:text-black',
112
- classNames?.label
113
- )}
114
- >
115
- {actionTitle}
116
- <input
117
- id={`${props?.name}-upload-file`}
118
- accept={accept}
119
- type="file"
120
- hidden
121
- // eslint-disable-next-line react/jsx-props-no-spreading
122
- {...props}
123
- ref={ref}
124
- className="hidden"
125
- />
126
- </label>
127
-
128
- {defaultImagePath && !image.src ? (
129
- <div className="flex justify-center items-center w-60">
130
- <a href={defaultImagePath} target="_blank" rel="noreferrer">
131
- <img
132
- src={defaultImagePath}
133
- alt=""
134
- className="w-full h-auto"
135
- />
136
- </a>
137
- </div>
138
- ) : (
139
- <>
140
- <motion.div
141
- initial={{ opacity: 0 }}
142
- animate={{ opacity: 1 }}
143
- transition={{ type: 'spring', duration: 3, bounce: 0 }}
144
- key={image.src}
145
- className="flex justify-center items-center w-52 h-auto"
146
- >
147
- {image.src ? (
148
- <Image
149
- src={image.src}
150
- height={96}
151
- width={200}
152
- alt={image.alt || ''}
153
- className="max-h-full object-contain"
154
- />
155
- ) : (
156
- <svg
157
- xmlns="http://www.w3.org/2000/svg"
158
- width="31"
159
- height="55"
160
- viewBox="0 0 31 55"
161
- fill="none"
162
- >
163
- <g clipPath="url(#clip0_15607_32844)">
164
- <path
165
- d="M15.9521 0.721924C24.2431 0.721924 30.9521 7.36392 30.9521 15.5719V43.9219C30.9521 49.8889 26.0703 54.7219 20.0431 54.7219C14.0158 54.7219 9.13397 49.8889 9.13397 43.9219V20.9719C9.13397 17.2459 12.1885 14.2219 15.9521 14.2219C19.7158 14.2219 22.7703 17.2459 22.7703 20.9719V41.2219H17.3158V20.7289C17.3158 19.2439 14.5885 19.2439 14.5885 20.7289V43.9219C14.5885 46.8919 17.0431 49.3219 20.0431 49.3219C23.0431 49.3219 25.4976 46.8919 25.4976 43.9219V15.5719C25.4976 10.3609 21.2158 6.12192 15.9521 6.12192C10.6885 6.12192 6.40669 10.3609 6.40669 15.5719V41.2219H0.952148V15.5719C0.952148 7.36392 7.66124 0.721924 15.9521 0.721924Z"
166
- fill="#646464"
167
- />
168
- </g>
169
- <defs>
170
- <clipPath id="clip0_15607_32844">
171
- <rect
172
- width="30"
173
- height="54"
174
- fill="white"
175
- transform="translate(0.952148 0.721924)"
176
- />
177
- </clipPath>
178
- </defs>
179
- </svg>
180
- )}
181
- </motion.div>
182
- <p className="m-0 text-slate-950 text-center">
183
- {image.alt || description}
184
- </p>
185
- </>
186
- )}
187
- </div>
188
- </>
189
- ) : (
190
- <UploadImageLoader
191
- hasTitle={Boolean(title)}
192
- className={classNames?.skeleton}
193
- />
194
- )}
195
-
196
- {invalid && (
197
- <FieldError className={cn('-mt-2', 'self-start')}>
198
- {errorMessage}
199
- </FieldError>
200
- )}
201
- </div>
202
- );
203
- }
204
- );
205
-
206
- export default UploadImage;