@companix/uikit 0.0.1 → 0.0.3

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 (254) hide show
  1. package/dist/bundle.es.js +61 -0
  2. package/dist/bundle.es10.js +87 -0
  3. package/dist/bundle.es11.js +75 -0
  4. package/dist/bundle.es12.js +38 -0
  5. package/dist/bundle.es13.js +33 -0
  6. package/dist/bundle.es14.js +18 -0
  7. package/dist/bundle.es15.js +11 -0
  8. package/dist/bundle.es16.js +35 -0
  9. package/dist/bundle.es17.js +27 -0
  10. package/dist/bundle.es18.js +23 -0
  11. package/dist/bundle.es19.js +24 -0
  12. package/dist/bundle.es20.js +15 -0
  13. package/dist/bundle.es21.js +41 -0
  14. package/dist/bundle.es22.js +18 -0
  15. package/dist/bundle.es23.js +36 -0
  16. package/dist/bundle.es24.js +23 -0
  17. package/dist/bundle.es25.js +42 -0
  18. package/dist/bundle.es26.js +114 -0
  19. package/dist/bundle.es27.js +115 -0
  20. package/dist/bundle.es28.js +38 -0
  21. package/dist/bundle.es29.js +13 -0
  22. package/dist/bundle.es3.js +45 -0
  23. package/dist/bundle.es30.js +27 -0
  24. package/dist/bundle.es31.js +38 -0
  25. package/dist/bundle.es35.js +43 -0
  26. package/dist/bundle.es36.js +442 -0
  27. package/dist/bundle.es37.js +24 -0
  28. package/dist/bundle.es38.js +26 -0
  29. package/dist/bundle.es39.js +83 -0
  30. package/dist/bundle.es4.js +14 -0
  31. package/dist/bundle.es40.js +20 -0
  32. package/dist/bundle.es41.js +16 -0
  33. package/dist/bundle.es43.js +7 -0
  34. package/dist/bundle.es44.js +23 -0
  35. package/dist/bundle.es45.js +16 -0
  36. package/dist/bundle.es46.js +72 -0
  37. package/dist/bundle.es47.js +70 -0
  38. package/dist/bundle.es48.js +34 -0
  39. package/dist/bundle.es49.js +70 -0
  40. package/dist/bundle.es5.js +88 -0
  41. package/dist/bundle.es50.js +33 -0
  42. package/dist/bundle.es51.js +78 -0
  43. package/dist/bundle.es52.js +51 -0
  44. package/dist/bundle.es53.js +45 -0
  45. package/dist/bundle.es54.js +40 -0
  46. package/dist/bundle.es55.js +36 -0
  47. package/dist/bundle.es56.js +9 -0
  48. package/dist/bundle.es57.js +9 -0
  49. package/dist/bundle.es58.js +7 -0
  50. package/dist/bundle.es59.js +9 -0
  51. package/dist/bundle.es6.js +87 -0
  52. package/dist/bundle.es60.js +8 -0
  53. package/dist/bundle.es61.js +19 -0
  54. package/dist/bundle.es62.js +15 -0
  55. package/dist/bundle.es63.js +22 -0
  56. package/dist/bundle.es64.js +45 -0
  57. package/dist/bundle.es65.js +28 -0
  58. package/dist/bundle.es66.js +34 -0
  59. package/dist/bundle.es67.js +6 -0
  60. package/dist/bundle.es68.js +12 -0
  61. package/dist/bundle.es69.js +47 -0
  62. package/dist/bundle.es7.js +80 -0
  63. package/dist/bundle.es70.js +11 -0
  64. package/dist/bundle.es71.js +18 -0
  65. package/dist/bundle.es72.js +32 -0
  66. package/dist/bundle.es73.js +35 -0
  67. package/dist/bundle.es74.js +6 -0
  68. package/dist/bundle.es75.js +7 -0
  69. package/dist/bundle.es76.js +7 -0
  70. package/dist/bundle.es77.js +11 -0
  71. package/dist/bundle.es78.js +17 -0
  72. package/dist/bundle.es79.js +7 -0
  73. package/dist/bundle.es8.js +29 -0
  74. package/dist/bundle.es80.js +17 -0
  75. package/dist/bundle.es81.js +25 -0
  76. package/dist/bundle.es9.js +47 -0
  77. package/dist/types/Button/index.d.ts +20 -0
  78. package/dist/types/ButtonGroup/index.d.ts +7 -0
  79. package/dist/types/Checkbox/index.d.ts +10 -0
  80. package/dist/types/Countdown/index.d.ts +7 -0
  81. package/dist/types/DateInput/index.d.ts +13 -0
  82. package/dist/types/DatePicker/Calendar.d.ts +14 -0
  83. package/dist/types/DatePicker/CalendarHeader.d.ts +10 -0
  84. package/dist/types/DatePicker/index.d.ts +12 -0
  85. package/dist/types/Dialog/index.d.ts +12 -0
  86. package/dist/types/DialogAlert/Alert.d.ts +19 -0
  87. package/dist/types/DialogAlert/Viewport.d.ts +8 -0
  88. package/dist/types/DialogAlert/index.d.ts +11 -0
  89. package/dist/types/Drawer/index.d.ts +13 -0
  90. package/dist/types/File/index.d.ts +10 -0
  91. package/dist/types/Form/index.d.ts +17 -0
  92. package/dist/types/Icon/index.d.ts +7 -0
  93. package/dist/types/LoadButton/index.d.ts +5 -0
  94. package/dist/types/NumberInput/index.d.ts +6 -0
  95. package/dist/types/OptionItem/OptionItem.d.ts +7 -0
  96. package/dist/types/OptionItem/OptionsList.d.ts +8 -0
  97. package/dist/types/Popover/index.d.ts +26 -0
  98. package/dist/types/Radio/index.d.ts +20 -0
  99. package/dist/types/Scrollable/ImitateScroll.d.ts +10 -0
  100. package/dist/types/Scrollable/index.d.ts +33 -0
  101. package/dist/types/Select/SelectInput.d.ts +14 -0
  102. package/dist/types/Select/index.d.ts +15 -0
  103. package/dist/types/SelectTags/index.d.ts +15 -0
  104. package/dist/types/Spinner/index.d.ts +8 -0
  105. package/dist/types/Stepper/index.d.ts +8 -0
  106. package/dist/types/Switch/index.d.ts +10 -0
  107. package/dist/types/Tabs/index.d.ts +13 -0
  108. package/dist/types/TextArea/index.d.ts +7 -0
  109. package/dist/types/Toaster/RemoveListener.d.ts +3 -0
  110. package/dist/types/Toaster/Toast.d.ts +9 -0
  111. package/dist/types/Toaster/Viewport.d.ts +13 -0
  112. package/dist/types/Toaster/index.d.ts +15 -0
  113. package/dist/types/Tooltip/index.d.ts +8 -0
  114. package/dist/types/__hooks/use-frooze-closing.d.ts +5 -0
  115. package/dist/types/__hooks/use-loading.d.ts +8 -0
  116. package/dist/types/__hooks/use-local-storage.d.ts +1 -0
  117. package/dist/types/__hooks/use-popover-position.d.ts +8 -0
  118. package/dist/types/__hooks/use-previos.d.ts +2 -0
  119. package/dist/types/__hooks/use-resize.d.ts +3 -0
  120. package/dist/types/__hooks/use-scrollbox.d.ts +7 -0
  121. package/dist/types/__hooks/use-stepper-input.d.ts +13 -0
  122. package/dist/types/__hooks/use-update.d.ts +1 -0
  123. package/dist/types/__hooks/useCalendar.d.ts +17 -0
  124. package/dist/types/__hooks/useCalendarOptions-copy.d.ts +22 -0
  125. package/dist/types/__hooks/useCalendarOptions.d.ts +31 -0
  126. package/dist/types/__libs/calendar.d.ts +25 -0
  127. package/dist/types/__utils/utils.d.ts +25 -0
  128. package/dist/types/index.d.ts +31 -0
  129. package/dist/types/types.d.ts +13 -0
  130. package/dist/uikit.css +1 -0
  131. package/package.json +10 -6
  132. package/.eslintrc +0 -54
  133. package/declaration.d.ts +0 -4
  134. package/index.html +0 -12
  135. package/playground/App.tsx +0 -166
  136. package/playground/Example.tsx +0 -14
  137. package/playground/Test.tsx +0 -44
  138. package/playground/animation-test-1/index.scss +0 -20
  139. package/playground/animation-test-1/index.tsx +0 -17
  140. package/playground/animation-test-2/index.scss +0 -62
  141. package/playground/animation-test-2/index.tsx +0 -32
  142. package/playground/bootstrap.tsx +0 -19
  143. package/playground/buttons/index.tsx +0 -132
  144. package/playground/checkbox/index.tsx +0 -64
  145. package/playground/date-input/index.tsx +0 -45
  146. package/playground/date-picker/index.tsx +0 -41
  147. package/playground/dialog/index.tsx +0 -92
  148. package/playground/dialog-alert/index.tsx +0 -47
  149. package/playground/drawer/index.tsx +0 -55
  150. package/playground/index.css +0 -33
  151. package/playground/index.scss +0 -270
  152. package/playground/input/index.tsx +0 -112
  153. package/playground/number-inputs/index.tsx +0 -50
  154. package/playground/popovers/index.tsx +0 -70
  155. package/playground/radio-group/index.tsx +0 -69
  156. package/playground/select/index.tsx +0 -72
  157. package/playground/select-tags/index.tsx +0 -36
  158. package/playground/styles.scss +0 -2
  159. package/playground/switch/index.tsx +0 -44
  160. package/playground/tabs/index.tsx +0 -16
  161. package/playground/test.scss +0 -0
  162. package/playground/text-area/index.tsx +0 -17
  163. package/playground/text-input/index.tsx +0 -12
  164. package/playground/toaster/index.tsx +0 -156
  165. package/playground/tooltip/index.tsx +0 -26
  166. package/src/Button/Button.scss +0 -128
  167. package/src/Button/index.tsx +0 -72
  168. package/src/ButtonGroup/ButtonGroup.scss +0 -18
  169. package/src/ButtonGroup/index.tsx +0 -20
  170. package/src/Checkbox/Checkbox.scss +0 -115
  171. package/src/Checkbox/index.tsx +0 -46
  172. package/src/Countdown/index.tsx +0 -54
  173. package/src/DateInput/DateInput.scss +0 -11
  174. package/src/DateInput/index.tsx +0 -96
  175. package/src/DatePicker/Calendar.scss +0 -125
  176. package/src/DatePicker/Calendar.tsx +0 -157
  177. package/src/DatePicker/CalendarHeader.tsx +0 -139
  178. package/src/DatePicker/DatePicker.scss +0 -0
  179. package/src/DatePicker/index.tsx +0 -177
  180. package/src/Dialog/Dialog.scss +0 -25
  181. package/src/Dialog/Popup.scss +0 -55
  182. package/src/Dialog/index.tsx +0 -31
  183. package/src/DialogAlert/Alert.scss +0 -52
  184. package/src/DialogAlert/Alert.tsx +0 -78
  185. package/src/DialogAlert/Viewport.tsx +0 -52
  186. package/src/DialogAlert/index.tsx +0 -37
  187. package/src/Drawer/Drawer.scss +0 -112
  188. package/src/Drawer/index.tsx +0 -46
  189. package/src/File/index.tsx +0 -60
  190. package/src/Form/Form.scss +0 -70
  191. package/src/Form/Input.scss +0 -24
  192. package/src/Form/index.tsx +0 -131
  193. package/src/Icon/icon.scss +0 -18
  194. package/src/Icon/index.tsx +0 -43
  195. package/src/LoadButton/index.tsx +0 -17
  196. package/src/NumberInput/index.tsx +0 -74
  197. package/src/OptionItem/Option.scss +0 -89
  198. package/src/OptionItem/OptionItem.tsx +0 -49
  199. package/src/OptionItem/OptionsList.tsx +0 -26
  200. package/src/Popover/Popover.scss +0 -80
  201. package/src/Popover/index.tsx +0 -117
  202. package/src/Radio/Radio.scss +0 -148
  203. package/src/Radio/index.tsx +0 -68
  204. package/src/Scrollable/ImitateScroll.tsx +0 -141
  205. package/src/Scrollable/Scrollable.scss +0 -50
  206. package/src/Scrollable/index.tsx +0 -141
  207. package/src/Select/Select.scss +0 -80
  208. package/src/Select/SelectInput.tsx +0 -131
  209. package/src/Select/index.tsx +0 -134
  210. package/src/SelectTags/SelectTags.scss +0 -66
  211. package/src/SelectTags/index.tsx +0 -192
  212. package/src/Spinner/Spinner.scss +0 -14
  213. package/src/Spinner/index.tsx +0 -19
  214. package/src/Stepper/StepperInput.scss +0 -35
  215. package/src/Stepper/index.tsx +0 -76
  216. package/src/Switch/Switch.scss +0 -102
  217. package/src/Switch/index.tsx +0 -49
  218. package/src/Tabs/Tabs.scss +0 -58
  219. package/src/Tabs/index.tsx +0 -89
  220. package/src/TextArea/TextArea.scss +0 -34
  221. package/src/TextArea/index.tsx +0 -51
  222. package/src/Toaster/RemoveListener.tsx +0 -11
  223. package/src/Toaster/Toast.tsx +0 -69
  224. package/src/Toaster/Toaster.scss +0 -151
  225. package/src/Toaster/Viewport.tsx +0 -117
  226. package/src/Toaster/index.tsx +0 -52
  227. package/src/Tooltip/Tooltip.scss +0 -28
  228. package/src/Tooltip/index.tsx +0 -33
  229. package/src/__hooks/use-frooze-closing.ts +0 -51
  230. package/src/__hooks/use-loading.ts +0 -34
  231. package/src/__hooks/use-local-storage.ts +0 -19
  232. package/src/__hooks/use-popover-position.ts +0 -24
  233. package/src/__hooks/use-previos.ts +0 -25
  234. package/src/__hooks/use-resize.ts +0 -41
  235. package/src/__hooks/use-scrollbox.ts +0 -45
  236. package/src/__hooks/use-stepper-input.ts +0 -82
  237. package/src/__hooks/use-update.ts +0 -19
  238. package/src/__hooks/useCalendar.ts +0 -104
  239. package/src/__hooks/useCalendarOptions-copy.ts +0 -87
  240. package/src/__hooks/useCalendarOptions.ts +0 -68
  241. package/src/__libs/calendar.ts +0 -175
  242. package/src/__utils/utils.ts +0 -137
  243. package/src/css.scss +0 -120
  244. package/src/index.scss +0 -22
  245. package/src/index.ts +0 -36
  246. package/src/mixins.scss +0 -99
  247. package/src/theme.scss +0 -103
  248. package/src/types.ts +0 -14
  249. package/tailwind.config.js +0 -91
  250. package/themes/classic/animations.scss +0 -179
  251. package/themes/classic/classic.scss +0 -493
  252. package/tsconfig.json +0 -27
  253. package/vite.build.ts +0 -35
  254. package/vite.config.ts +0 -33
@@ -1,117 +0,0 @@
1
- import * as PopoverPrimitive from '@radix-ui/react-popover'
2
- import { attr } from '@companix/utils-browser'
3
- import classNames from 'classnames'
4
- import { forwardRef, useRef } from 'react'
5
-
6
- export type Align = 'start' | 'center' | 'end'
7
- export type Side = 'top' | 'right' | 'bottom' | 'left'
8
-
9
- export interface PopoverProps {
10
- children: React.ReactNode
11
- open?: boolean
12
- triggerRef?: React.Ref<HTMLButtonElement>
13
- triggerProps?: React.ButtonHTMLAttributes<HTMLButtonElement>
14
- onOpenChange?: (open: boolean) => void
15
- content: ({ close }: { close: () => void }) => React.ReactNode
16
- onAnimationEnd?: () => void
17
- onAnimationStart?: () => void
18
- onOpenAutoFocus?: (event: Event) => void
19
- onCloseAutoFocus?: (event: Event) => void
20
- side?: Side
21
- align?: Align
22
- showArrows?: boolean
23
- minimal?: boolean
24
- sideOffset?: number
25
- matchTarget?: 'width' | 'min-width'
26
- className?: string
27
- fitMaxHeight?: boolean
28
- disabled?: boolean
29
- }
30
-
31
- export const Popover = forwardRef<HTMLDivElement, PopoverProps>((props, ref) => {
32
- const {
33
- children,
34
- sideOffset,
35
- matchTarget,
36
- onAnimationEnd,
37
- onAnimationStart,
38
- onOpenAutoFocus,
39
- onCloseAutoFocus,
40
- triggerRef,
41
- triggerProps,
42
- open,
43
- content,
44
- onOpenChange,
45
- align,
46
- disabled,
47
- minimal,
48
- className,
49
- fitMaxHeight = true,
50
- side,
51
- showArrows
52
- } = props
53
-
54
- const buttonRef = useRef<HTMLButtonElement>(null)
55
-
56
- const close = () => {
57
- if (buttonRef.current) {
58
- buttonRef.current.click()
59
- }
60
- }
61
-
62
- const handleOpen = (e: React.MouseEvent) => {
63
- if (disabled) {
64
- e.preventDefault()
65
- }
66
- }
67
-
68
- return (
69
- <PopoverPrimitive.Root open={open} onOpenChange={onOpenChange}>
70
- <PopoverPrimitive.Trigger ref={triggerRef} {...triggerProps} onClick={handleOpen} asChild>
71
- {children}
72
- </PopoverPrimitive.Trigger>
73
- <PopoverPrimitive.Portal>
74
- <PopoverPrimitive.Content
75
- ref={ref}
76
- className={classNames('popover', className)}
77
- side={side}
78
- align={align}
79
- data-appearance={minimal ? 'minimal' : 'default'}
80
- data-match-target={matchTarget}
81
- sideOffset={sideOffset ?? 6}
82
- avoidCollisions
83
- arrowPadding={10}
84
- onAnimationStart={onAnimationStart}
85
- onAnimationEnd={onAnimationEnd}
86
- onOpenAutoFocus={onOpenAutoFocus}
87
- onCloseAutoFocus={onCloseAutoFocus}
88
- >
89
- <PopoverPrimitive.Close ref={buttonRef} style={{ display: 'none' }} />
90
- {showArrows && (
91
- <PopoverPrimitive.Arrow width={30} height={11} asChild>
92
- <div className="popover-arrow">
93
- <svg className="popover-arrow-icon" viewBox="0 0 30 11" width={30} height={11}>
94
- <path
95
- className="popover-arrow-border"
96
- d="M 18.112 -2.704 C 19.127 -3.64 19.999 -5.626 19.999 -7.001 L 19.999 18.999 C 19.999 17.621 19.131 15.642 18.111 14.702 L 10.927 8.084 C 9.69 6.944 9.694 5.05 10.927 3.914 L 18.112 -2.704 Z"
97
- style={{ transformBox: 'fill-box', transformOrigin: '50% 50%' }}
98
- transform="matrix(0, -1, 1, 0, 0.000001, 0)"
99
- />
100
- <path
101
- className="popover-arrow-fill"
102
- d="M 17.789 -2.965 C 19.009 -4.09 19.999 -6.341 19.999 -7.995 L 19.999 -10.001 L 19.999 19.999 L 19.999 17.994 C 19.999 16.34 19.016 14.094 17.789 12.964 L 10.606 6.348 C 9.796 5.602 9.804 4.388 10.606 3.648 L 17.789 -2.966 L 17.789 -2.965 Z"
103
- style={{ transformBox: 'fill-box', transformOrigin: '50% 50%' }}
104
- transform="matrix(0, -1, 1, 0, 0, 0)"
105
- />
106
- </svg>
107
- </div>
108
- </PopoverPrimitive.Arrow>
109
- )}
110
- <div className="popover-content" data-fit-max-height={attr(fitMaxHeight)}>
111
- {content({ close })}
112
- </div>
113
- </PopoverPrimitive.Content>
114
- </PopoverPrimitive.Portal>
115
- </PopoverPrimitive.Root>
116
- )
117
- })
@@ -1,148 +0,0 @@
1
- @use '../mixins.scss';
2
-
3
- .radio {
4
- display: inline-table;
5
- -webkit-user-select: none;
6
- -moz-user-select: none;
7
- -ms-user-select: none;
8
- user-select: none;
9
- -webkit-tap-highlight-color: transparent;
10
- -ms-touch-action: manipulation;
11
- touch-action: manipulation;
12
- max-width: max-content;
13
-
14
- @include mixins.use-styles(radio);
15
-
16
- &:not([data-required]):not([data-disabled]):hover {
17
- .radio-box[data-state='unchecked'] {
18
- @include mixins.use-styles(radio, box, hover);
19
- }
20
- }
21
-
22
- &:not([data-required]):not([data-disabled]):active {
23
- .radio-box[data-state='unchecked'] {
24
- @include mixins.use-styles(radio, box, active);
25
- }
26
- }
27
-
28
- &[data-disabled] {
29
- @include mixins.use-styles(radio, disabled);
30
- }
31
-
32
- &[data-required] {
33
- @include mixins.use-styles(radio, required);
34
-
35
- .radio-box {
36
- &::before {
37
- content: ' ';
38
- position: absolute;
39
- width: 100%;
40
- height: 100%;
41
- left: 0;
42
-
43
- @include mixins.use-styles(radio, required, box);
44
- border-radius: mixins.get-var-name(radio, box, border-radius);
45
- }
46
- }
47
- }
48
-
49
- &[data-size='sm'] {
50
- @include mixins.use-styles(radio, size, sm);
51
-
52
- .radio-box {
53
- @include mixins.use-size(radio, size, sm, box);
54
- }
55
-
56
- .radio-mark {
57
- @include mixins.use-size(radio, size, sm, mark);
58
- }
59
- }
60
-
61
- &[data-size='md'] {
62
- @include mixins.use-styles(radio, size, md);
63
-
64
- .radio-box {
65
- @include mixins.use-size(radio, size, md, box);
66
- }
67
-
68
- .radio-mark {
69
- @include mixins.use-size(radio, size, md, mark);
70
- }
71
- }
72
-
73
- &-box {
74
- cursor: pointer;
75
- outline: none;
76
- transition: background-color 0.1s linear;
77
- position: relative;
78
- display: flex;
79
- align-items: center;
80
- justify-content: center;
81
-
82
- @include mixins.use-styles(radio, box);
83
-
84
- &[data-disabled] {
85
- cursor: default;
86
- }
87
-
88
- &:after {
89
- visibility: hidden;
90
- content: '\00A0';
91
- }
92
-
93
- &[data-state='checked'] {
94
- @include mixins.use-styles(radio, box, checked);
95
- }
96
- }
97
-
98
- &-mark {
99
- position: absolute;
100
- @include mixins.use-styles(radio, mark);
101
-
102
- &[data-state='checked'] {
103
- @include mixins.use-styles(radio, mark, in);
104
- }
105
-
106
- &[data-state='unchecked'] {
107
- @include mixins.use-styles(radio, mark, out);
108
- }
109
- }
110
-
111
- &-label {
112
- cursor: pointer;
113
- display: table-cell;
114
- word-break: break-word;
115
-
116
- &[data-disabled] {
117
- cursor: default;
118
- }
119
-
120
- @include mixins.use-styles(radio, label);
121
- }
122
- }
123
-
124
- .radio-group {
125
- display: flex;
126
- flex-direction: column;
127
- @include mixins.use-styles(radio, group);
128
- }
129
-
130
- // .radio-icon {
131
- // width: 16px;
132
- // height: 16px;
133
- // background-color: transparent;
134
- // border: 1px solid #ffffff75;
135
- // border-radius: 100px;
136
-
137
- // &[data-checked] {
138
- // background-color: #fff;
139
- // }
140
- // }
141
-
142
- // .radio {
143
- // display: flex;
144
- // align-items: center;
145
- // outline: none;
146
- // cursor: pointer;
147
- // gap: 6px;
148
- // }
@@ -1,68 +0,0 @@
1
- import { useId } from 'react'
2
- import * as RadioPrimitive from '@radix-ui/react-radio-group'
3
- import { attr } from '@companix/utils-browser'
4
-
5
- interface RadioOption<T> {
6
- value: T
7
- label: React.ReactNode
8
- }
9
-
10
- interface RadioGroupProps<T> {
11
- options: RadioOption<T>[]
12
- onChange: (event: T) => void
13
- value: T | null
14
- disabled?: boolean
15
- required?: boolean
16
- size?: 'sm' | 'md'
17
- }
18
-
19
- export const RadioGroup = <T extends string>(props: RadioGroupProps<T>) => {
20
- const { options, value, onChange, disabled, required, size } = props
21
-
22
- return (
23
- <RadioPrimitive.Root
24
- className="radio-group"
25
- disabled={disabled}
26
- data-required={attr(required && !value)}
27
- data-v={value}
28
- value={value}
29
- onValueChange={(e) => onChange(e as T)}
30
- >
31
- {options.map((option, i) => (
32
- <Radio
33
- key={`radio-${option.value}-${i}`}
34
- {...option}
35
- size={size}
36
- disabled={disabled}
37
- required={required && !value}
38
- />
39
- ))}
40
- </RadioPrimitive.Root>
41
- )
42
- }
43
-
44
- interface RadioProps extends RadioOption<string> {
45
- size?: 'sm' | 'md'
46
- disabled?: boolean
47
- required?: boolean
48
- }
49
-
50
- export const Radio = ({ value, label, size = 'md', disabled, required }: RadioProps) => {
51
- const id = useId()
52
-
53
- return (
54
- <span
55
- className="radio"
56
- data-disabled={attr(disabled)}
57
- data-size={size}
58
- data-required={attr(required)}
59
- >
60
- <RadioPrimitive.Item className="radio-box" value={value} disabled={disabled} id={id}>
61
- <RadioPrimitive.Indicator className="radio-mark" />
62
- </RadioPrimitive.Item>
63
- <label className="radio-label" htmlFor={id} data-disabled={attr(disabled)}>
64
- {label}
65
- </label>
66
- </span>
67
- )
68
- }
@@ -1,141 +0,0 @@
1
- import cn from 'classnames'
2
-
3
- import { useRef, useLayoutEffect, useMemo, useCallback, useEffect } from 'react'
4
- import { getContainers, pc, px } from '@companix/utils-browser'
5
-
6
- interface Props {
7
- children: React.ReactNode
8
- thumbClassName: string
9
- thumbColor?: string
10
- trackWidth?: number
11
- thumbMargin?: number
12
- scrollableClassName?: string
13
- }
14
-
15
- // Отслеживание изменений scrollHeight:
16
- // https://stackoverflow.com/questions/44428370/detect-scrollheight-change-with-mutationobserver
17
-
18
- const ImitateScroll = ({
19
- children,
20
- thumbClassName,
21
- scrollableClassName,
22
- thumbMargin = 0,
23
- trackWidth = 20
24
- }: Props) => {
25
- const scrollThumbRef = useRef<HTMLDivElement>(null)
26
- const scrollableRef = useRef<HTMLDivElement>(null)
27
-
28
- const data = useMemo(() => {
29
- return { positons: { top: 0, y: 0 }, scrollRatio: 0 }
30
- }, [])
31
-
32
- const listeners = useMemo(() => {
33
- return {
34
- start() {
35
- document.addEventListener('mousemove', handleMouseMove)
36
- document.addEventListener('mouseup', handleMouseUp)
37
- },
38
- clear() {
39
- document.removeEventListener('mousemove', handleMouseMove)
40
- document.removeEventListener('mouseup', handleMouseUp)
41
- }
42
- }
43
- }, [])
44
-
45
- useEffect(() => {
46
- const observer = new ResizeObserver(setThumbHeight)
47
-
48
- if (scrollableRef.current) {
49
- getContainers(scrollableRef.current, (element) => {
50
- observer.observe(element)
51
- })
52
- }
53
-
54
- return () => {
55
- if (scrollableRef.current) {
56
- getContainers(scrollableRef.current, (element) => {
57
- observer.unobserve(element)
58
- })
59
- }
60
- }
61
- }, [])
62
-
63
- useLayoutEffect(() => {
64
- setThumbHeight()
65
- }, [])
66
-
67
- const setThumbHeight = useCallback(() => {
68
- const { current: container } = scrollableRef
69
- const { current: thumb } = scrollThumbRef
70
-
71
- if (thumb && container) {
72
- const scrollRatio = container.clientHeight / container.scrollHeight
73
-
74
- thumb.style.height = pc(scrollRatio * 100)
75
- thumb.style.display = scrollRatio === 1 ? 'none' : 'block'
76
-
77
- data.scrollRatio = scrollRatio
78
- }
79
- }, [])
80
-
81
- const handleMouseMove = useCallback(({ clientY }: MouseEvent) => {
82
- const { current: container } = scrollableRef
83
-
84
- if (container) {
85
- const dy = clientY - data.positons.y
86
- container.scrollTop = data.positons.top + dy / data.scrollRatio
87
- }
88
- }, [])
89
-
90
- const handleMouseUp = useCallback(() => {
91
- listeners.clear()
92
- }, [])
93
-
94
- const handleMouseDown = useCallback(({ clientY }: React.MouseEvent) => {
95
- const { current: container } = scrollableRef
96
-
97
- if (container) {
98
- data.positons = {
99
- top: container.scrollTop,
100
- y: clientY
101
- }
102
- }
103
-
104
- listeners.start()
105
- }, [])
106
-
107
- const handleScroll = () => {
108
- requestAnimationFrame(() => {
109
- const { current: container } = scrollableRef
110
- const { current: thumb } = scrollThumbRef
111
-
112
- if (thumb && container) {
113
- thumb.style.top = pc((container.scrollTop * 100) / container.scrollHeight)
114
- }
115
- })
116
- }
117
-
118
- return (
119
- <div className="relative h-full overflow-hidden">
120
- <div
121
- className={cn('hidden-scroll h-full overflow-y-scroll', scrollableClassName)}
122
- onScroll={handleScroll}
123
- ref={scrollableRef}
124
- >
125
- {children}
126
- </div>
127
- <div
128
- className="absolute right-0 top-0 box-border h-full"
129
- style={{ width: px(trackWidth), padding: px(thumbMargin) }}
130
- >
131
- <div
132
- onMouseDown={handleMouseDown}
133
- className={`${thumbClassName} relative w-full rounded-full`}
134
- ref={scrollThumbRef}
135
- />
136
- </div>
137
- </div>
138
- )
139
- }
140
-
141
- export { ImitateScroll }
@@ -1,50 +0,0 @@
1
- .scrollable::-webkit-scrollbar {
2
- width: var(--scrollbar-width);
3
- height: var(--scrollbar-width);
4
- }
5
-
6
- .scrollable::-webkit-scrollbar-thumb {
7
- background-clip: padding-box;
8
- border: var(--thumb-padding) solid transparent;
9
- border-radius: 999px;
10
- background-color: var(--thumb-color);
11
- }
12
-
13
- .scrollable::-webkit-scrollbar-corner {
14
- background-color: transparent;
15
- }
16
-
17
- .scrollable-hover-interaction::-webkit-scrollbar-thumb,
18
- .scrollable-hover-interaction::-webkit-scrollbar-track {
19
- visibility: hidden;
20
- }
21
- .scrollable-hover-interaction:hover::-webkit-scrollbar-thumb,
22
- .scrollable-hover-interaction:hover::-webkit-scrollbar-track {
23
- visibility: visible;
24
- }
25
-
26
- .scrollable-border-position::-webkit-scrollbar-thumb {
27
- border-radius: 0px;
28
-
29
- border-right-width: 0px;
30
- border-bottom-width: 0px;
31
-
32
- border-left-width: calc(var(--thumb-padding) * 2);
33
- border-top-width: calc(var(--thumb-padding) * 2);
34
- }
35
-
36
- .hidden-scroll::-webkit-scrollbar {
37
- display: none;
38
- }
39
-
40
- .hidden-scroll::-webkit-scrollbar-thumb {
41
- display: none;
42
- }
43
-
44
- .hidden-scroll::-webkit-scrollbar-track {
45
- display: none;
46
- }
47
-
48
- .hidden-scroll::-webkit-scrollbar-corner {
49
- display: none;
50
- }
@@ -1,141 +0,0 @@
1
- import './Scrollable.scss'
2
-
3
- import classNames from 'classnames'
4
- import { forwardRef } from 'react'
5
- import { px, varToStyle } from '@companix/utils-browser'
6
-
7
- interface OuterImplementation {
8
- implementation: 'outer'
9
- shadowPadding?: number
10
- scrollbarWidth: number
11
- noneCorrect?: boolean
12
- }
13
-
14
- interface EdgeImplementation {
15
- implementation: 'edge'
16
- scrollbarWidth: number
17
- padding: number
18
- }
19
-
20
- interface InnerImplementation {
21
- implementation: 'inner'
22
- padding: number
23
- }
24
-
25
- interface ScrollableProps {
26
- heightAuto?: boolean
27
- scrollX?: boolean
28
- scrollY?: boolean
29
- interactionKind?: 'static' | 'hover'
30
- thumbPos?: 'center' | 'border'
31
- thumbPadding?: number
32
- thumbColor?: string
33
- onWheel?: React.WheelEventHandler<HTMLDivElement>
34
- onScroll?: React.UIEventHandler<HTMLDivElement>
35
- maxHeight?: number
36
- children: React.ReactNode
37
- style?: React.CSSProperties
38
- className?: string
39
- }
40
-
41
- type Implementation = InnerImplementation | OuterImplementation | EdgeImplementation
42
-
43
- const Scrollable = forwardRef<HTMLDivElement, ScrollableProps & Implementation>((props, ref) => {
44
- let {
45
- interactionKind = 'static',
46
- thumbPos = 'center',
47
- thumbPadding = 4,
48
- heightAuto,
49
- scrollX,
50
- className,
51
- scrollY,
52
- onWheel,
53
- maxHeight,
54
- onScroll,
55
- thumbColor,
56
- children
57
- } = props
58
-
59
- const style: React.CSSProperties = (() => {
60
- if (props.implementation === 'edge') {
61
- thumbPadding = 0
62
-
63
- const { padding, scrollbarWidth } = props
64
-
65
- return {
66
- ...varToStyle({ '--scrollbar-width': px(scrollbarWidth) }),
67
- padding: `0px ${padding - scrollbarWidth}px 0px ${padding}px`
68
- }
69
- }
70
-
71
- if (props.implementation === 'outer') {
72
- const { shadowPadding = 0, noneCorrect, scrollbarWidth } = props
73
-
74
- if ((window as any).IS_MOBILE) {
75
- return {
76
- padding: shadowPadding,
77
- margin: -shadowPadding
78
- }
79
- }
80
-
81
- return {
82
- ...varToStyle({ '--scrollbar-width': px(scrollbarWidth) }),
83
- padding: shadowPadding,
84
- margin: -shadowPadding,
85
- marginRight: noneCorrect ? undefined : `calc(-${scrollbarWidth}px - ${shadowPadding}px)`,
86
- marginBottom: 0
87
- }
88
- }
89
-
90
- if (props.implementation === 'inner') {
91
- const { padding } = props
92
-
93
- if ((window as any).IS_MOBILE) {
94
- return {
95
- [scrollY ? 'paddingLeft' : 'paddingTop']: padding,
96
- [scrollY ? 'paddingRight' : 'paddingBottom']: padding
97
- }
98
- }
99
-
100
- return {
101
- [scrollY ? 'paddingLeft' : 'paddingTop']: padding,
102
- ...varToStyle({ '--scrollbar-width': px(padding) })
103
- }
104
- }
105
-
106
- return {}
107
- })()
108
-
109
- return (
110
- <div
111
- ref={ref}
112
- onWheel={onWheel}
113
- onScroll={onScroll}
114
- onMouseDown={(e) => {
115
- e.preventDefault()
116
- }}
117
- style={{
118
- ...style,
119
- ...props.style,
120
- ...{ maxHeight: maxHeight ? px(maxHeight) : undefined },
121
- ...varToStyle({ '--thumb-padding': px(thumbPadding) }),
122
- ...varToStyle({ '--thumb-color': thumbColor ?? '#c1c2c8bd' })
123
- }}
124
- className={classNames(
125
- !(window as any).IS_MOBILE && 'scrollable',
126
- className,
127
- heightAuto ? '' : 'h-full',
128
- {
129
- 'overflow-y-scroll': scrollY,
130
- 'overflow-x-scroll': scrollX,
131
- 'scrollable-hover-interaction': interactionKind === 'hover',
132
- 'scrollable-border-position': thumbPos === 'border'
133
- }
134
- )}
135
- >
136
- {children}
137
- </div>
138
- )
139
- })
140
-
141
- export { Scrollable }