@companix/uikit 0.0.2 → 0.0.4

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 (222) hide show
  1. package/dist/Button/index.d.ts +20 -0
  2. package/dist/ButtonGroup/index.d.ts +7 -0
  3. package/dist/Checkbox/index.d.ts +10 -0
  4. package/dist/Countdown/index.d.ts +7 -0
  5. package/dist/DateInput/index.d.ts +13 -0
  6. package/dist/DatePicker/Calendar.d.ts +14 -0
  7. package/dist/DatePicker/CalendarHeader.d.ts +10 -0
  8. package/dist/DatePicker/index.d.ts +12 -0
  9. package/dist/Dialog/index.d.ts +12 -0
  10. package/dist/DialogAlert/Alert.d.ts +19 -0
  11. package/dist/DialogAlert/Viewport.d.ts +8 -0
  12. package/dist/DialogAlert/index.d.ts +11 -0
  13. package/dist/Drawer/index.d.ts +13 -0
  14. package/dist/File/index.d.ts +10 -0
  15. package/dist/Form/index.d.ts +17 -0
  16. package/dist/Icon/index.d.ts +7 -0
  17. package/dist/LoadButton/index.d.ts +5 -0
  18. package/dist/NumberInput/index.d.ts +6 -0
  19. package/dist/OptionItem/OptionItem.d.ts +7 -0
  20. package/dist/OptionItem/OptionsList.d.ts +8 -0
  21. package/dist/Popover/index.d.ts +26 -0
  22. package/dist/Radio/index.d.ts +20 -0
  23. package/dist/Scrollable/ImitateScroll.d.ts +10 -0
  24. package/dist/Scrollable/index.d.ts +33 -0
  25. package/dist/Select/SelectInput.d.ts +14 -0
  26. package/dist/Select/index.d.ts +15 -0
  27. package/dist/SelectTags/index.d.ts +15 -0
  28. package/dist/Spinner/index.d.ts +8 -0
  29. package/dist/Stepper/index.d.ts +8 -0
  30. package/dist/Switch/index.d.ts +10 -0
  31. package/dist/Tabs/index.d.ts +13 -0
  32. package/dist/TextArea/index.d.ts +7 -0
  33. package/dist/Toaster/RemoveListener.d.ts +3 -0
  34. package/dist/Toaster/Toast.d.ts +9 -0
  35. package/dist/Toaster/Viewport.d.ts +13 -0
  36. package/dist/Toaster/index.d.ts +15 -0
  37. package/dist/Tooltip/index.d.ts +8 -0
  38. package/dist/__hooks/use-frooze-closing.d.ts +5 -0
  39. package/dist/__hooks/use-loading.d.ts +8 -0
  40. package/dist/__hooks/use-local-storage.d.ts +1 -0
  41. package/dist/__hooks/use-popover-position.d.ts +8 -0
  42. package/dist/__hooks/use-previos.d.ts +2 -0
  43. package/dist/__hooks/use-resize.d.ts +3 -0
  44. package/dist/__hooks/use-scrollbox.d.ts +7 -0
  45. package/dist/__hooks/use-stepper-input.d.ts +13 -0
  46. package/dist/__hooks/use-update.d.ts +1 -0
  47. package/dist/__hooks/useCalendar.d.ts +17 -0
  48. package/dist/__hooks/useCalendarOptions-copy.d.ts +22 -0
  49. package/dist/__hooks/useCalendarOptions.d.ts +31 -0
  50. package/dist/__libs/calendar.d.ts +25 -0
  51. package/dist/__utils/utils.d.ts +25 -0
  52. package/dist/bundle.es.js +58 -0
  53. package/dist/bundle.es10.js +38 -0
  54. package/dist/bundle.es11.js +33 -0
  55. package/dist/bundle.es12.js +18 -0
  56. package/dist/bundle.es13.js +10 -0
  57. package/dist/bundle.es14.js +35 -0
  58. package/dist/bundle.es15.js +27 -0
  59. package/dist/bundle.es16.js +23 -0
  60. package/dist/bundle.es17.js +24 -0
  61. package/dist/bundle.es18.js +15 -0
  62. package/dist/bundle.es19.js +40 -0
  63. package/dist/bundle.es2.js +45 -0
  64. package/dist/bundle.es20.js +18 -0
  65. package/dist/bundle.es21.js +36 -0
  66. package/dist/bundle.es22.js +23 -0
  67. package/dist/bundle.es23.js +42 -0
  68. package/dist/bundle.es24.js +113 -0
  69. package/dist/bundle.es25.js +114 -0
  70. package/dist/bundle.es26.js +38 -0
  71. package/dist/bundle.es27.js +13 -0
  72. package/dist/bundle.es28.js +27 -0
  73. package/dist/bundle.es29.js +38 -0
  74. package/dist/bundle.es3.js +13 -0
  75. package/dist/bundle.es30.js +26 -0
  76. package/dist/bundle.es31.js +83 -0
  77. package/dist/bundle.es32.js +20 -0
  78. package/dist/bundle.es33.js +16 -0
  79. package/dist/bundle.es34.js +24 -0
  80. package/dist/bundle.es35.js +7 -0
  81. package/dist/bundle.es36.js +23 -0
  82. package/dist/bundle.es37.js +16 -0
  83. package/dist/bundle.es38.js +72 -0
  84. package/dist/bundle.es39.js +70 -0
  85. package/dist/bundle.es4.js +87 -0
  86. package/dist/bundle.es40.js +34 -0
  87. package/dist/bundle.es41.js +70 -0
  88. package/dist/bundle.es42.js +33 -0
  89. package/dist/bundle.es43.js +77 -0
  90. package/dist/bundle.es44.js +51 -0
  91. package/dist/bundle.es45.js +45 -0
  92. package/dist/bundle.es5.js +87 -0
  93. package/dist/bundle.es6.js +80 -0
  94. package/dist/bundle.es7.js +28 -0
  95. package/dist/bundle.es8.js +87 -0
  96. package/dist/bundle.es9.js +75 -0
  97. package/dist/index.d.ts +30 -0
  98. package/{src → dist}/index.scss +3 -0
  99. package/{src → dist}/mixins.scss +4 -3
  100. package/{src → dist}/theme.scss +0 -2
  101. package/dist/types.d.ts +13 -0
  102. package/package.json +10 -6
  103. package/.eslintrc +0 -54
  104. package/declaration.d.ts +0 -4
  105. package/index.html +0 -12
  106. package/playground/App.tsx +0 -166
  107. package/playground/Example.tsx +0 -14
  108. package/playground/Test.tsx +0 -44
  109. package/playground/animation-test-1/index.scss +0 -20
  110. package/playground/animation-test-1/index.tsx +0 -17
  111. package/playground/animation-test-2/index.scss +0 -62
  112. package/playground/animation-test-2/index.tsx +0 -32
  113. package/playground/bootstrap.tsx +0 -19
  114. package/playground/buttons/index.tsx +0 -132
  115. package/playground/checkbox/index.tsx +0 -64
  116. package/playground/date-input/index.tsx +0 -45
  117. package/playground/date-picker/index.tsx +0 -41
  118. package/playground/dialog/index.tsx +0 -92
  119. package/playground/dialog-alert/index.tsx +0 -47
  120. package/playground/drawer/index.tsx +0 -55
  121. package/playground/index.css +0 -33
  122. package/playground/index.scss +0 -270
  123. package/playground/input/index.tsx +0 -112
  124. package/playground/number-inputs/index.tsx +0 -50
  125. package/playground/popovers/index.tsx +0 -70
  126. package/playground/radio-group/index.tsx +0 -69
  127. package/playground/select/index.tsx +0 -72
  128. package/playground/select-tags/index.tsx +0 -36
  129. package/playground/styles.scss +0 -2
  130. package/playground/switch/index.tsx +0 -44
  131. package/playground/tabs/index.tsx +0 -16
  132. package/playground/test.scss +0 -0
  133. package/playground/text-area/index.tsx +0 -17
  134. package/playground/text-input/index.tsx +0 -12
  135. package/playground/toaster/index.tsx +0 -156
  136. package/playground/tooltip/index.tsx +0 -26
  137. package/src/Button/index.tsx +0 -72
  138. package/src/ButtonGroup/index.tsx +0 -20
  139. package/src/Checkbox/index.tsx +0 -46
  140. package/src/Countdown/index.tsx +0 -54
  141. package/src/DateInput/index.tsx +0 -96
  142. package/src/DatePicker/Calendar.tsx +0 -157
  143. package/src/DatePicker/CalendarHeader.tsx +0 -139
  144. package/src/DatePicker/index.tsx +0 -177
  145. package/src/Dialog/index.tsx +0 -31
  146. package/src/DialogAlert/Alert.tsx +0 -78
  147. package/src/DialogAlert/Viewport.tsx +0 -52
  148. package/src/DialogAlert/index.tsx +0 -37
  149. package/src/Drawer/index.tsx +0 -46
  150. package/src/File/index.tsx +0 -60
  151. package/src/Form/index.tsx +0 -131
  152. package/src/Icon/index.tsx +0 -43
  153. package/src/LoadButton/index.tsx +0 -17
  154. package/src/NumberInput/index.tsx +0 -74
  155. package/src/OptionItem/OptionItem.tsx +0 -49
  156. package/src/OptionItem/OptionsList.tsx +0 -26
  157. package/src/Popover/index.tsx +0 -117
  158. package/src/Radio/index.tsx +0 -68
  159. package/src/Scrollable/ImitateScroll.tsx +0 -141
  160. package/src/Scrollable/index.tsx +0 -141
  161. package/src/Select/SelectInput.tsx +0 -131
  162. package/src/Select/index.tsx +0 -134
  163. package/src/SelectTags/index.tsx +0 -192
  164. package/src/Spinner/index.tsx +0 -19
  165. package/src/Stepper/index.tsx +0 -76
  166. package/src/Switch/index.tsx +0 -49
  167. package/src/Tabs/index.tsx +0 -89
  168. package/src/TextArea/index.tsx +0 -51
  169. package/src/Toaster/RemoveListener.tsx +0 -11
  170. package/src/Toaster/Toast.tsx +0 -69
  171. package/src/Toaster/Viewport.tsx +0 -117
  172. package/src/Toaster/index.tsx +0 -52
  173. package/src/Tooltip/index.tsx +0 -33
  174. package/src/__hooks/use-frooze-closing.ts +0 -51
  175. package/src/__hooks/use-loading.ts +0 -34
  176. package/src/__hooks/use-local-storage.ts +0 -19
  177. package/src/__hooks/use-popover-position.ts +0 -24
  178. package/src/__hooks/use-previos.ts +0 -25
  179. package/src/__hooks/use-resize.ts +0 -41
  180. package/src/__hooks/use-scrollbox.ts +0 -45
  181. package/src/__hooks/use-stepper-input.ts +0 -82
  182. package/src/__hooks/use-update.ts +0 -19
  183. package/src/__hooks/useCalendar.ts +0 -104
  184. package/src/__hooks/useCalendarOptions-copy.ts +0 -87
  185. package/src/__hooks/useCalendarOptions.ts +0 -68
  186. package/src/__libs/calendar.ts +0 -175
  187. package/src/__utils/utils.ts +0 -137
  188. package/src/index.ts +0 -36
  189. package/src/types.ts +0 -14
  190. package/tailwind.config.js +0 -91
  191. package/themes/classic/animations.scss +0 -179
  192. package/themes/classic/classic.scss +0 -493
  193. package/tsconfig.json +0 -27
  194. package/vite.build.ts +0 -35
  195. package/vite.config.ts +0 -33
  196. /package/{src → dist}/Button/Button.scss +0 -0
  197. /package/{src → dist}/ButtonGroup/ButtonGroup.scss +0 -0
  198. /package/{src → dist}/Checkbox/Checkbox.scss +0 -0
  199. /package/{src → dist}/DateInput/DateInput.scss +0 -0
  200. /package/{src → dist}/DatePicker/Calendar.scss +0 -0
  201. /package/{src → dist}/DatePicker/DatePicker.scss +0 -0
  202. /package/{src → dist}/Dialog/Dialog.scss +0 -0
  203. /package/{src → dist}/Dialog/Popup.scss +0 -0
  204. /package/{src → dist}/DialogAlert/Alert.scss +0 -0
  205. /package/{src → dist}/Drawer/Drawer.scss +0 -0
  206. /package/{src → dist}/Form/Form.scss +0 -0
  207. /package/{src → dist}/Form/Input.scss +0 -0
  208. /package/{src → dist}/Icon/icon.scss +0 -0
  209. /package/{src → dist}/OptionItem/Option.scss +0 -0
  210. /package/{src → dist}/Popover/Popover.scss +0 -0
  211. /package/{src → dist}/Radio/Radio.scss +0 -0
  212. /package/{src → dist}/Scrollable/Scrollable.scss +0 -0
  213. /package/{src → dist}/Select/Select.scss +0 -0
  214. /package/{src → dist}/SelectTags/SelectTags.scss +0 -0
  215. /package/{src → dist}/Spinner/Spinner.scss +0 -0
  216. /package/{src → dist}/Stepper/StepperInput.scss +0 -0
  217. /package/{src → dist}/Switch/Switch.scss +0 -0
  218. /package/{src → dist}/Tabs/Tabs.scss +0 -0
  219. /package/{src → dist}/TextArea/TextArea.scss +0 -0
  220. /package/{src → dist}/Toaster/Toaster.scss +0 -0
  221. /package/{src → dist}/Tooltip/Tooltip.scss +0 -0
  222. /package/{src/css.scss → dist/css-properties.scss} +0 -0
@@ -1,46 +0,0 @@
1
- import classNames from 'classnames'
2
- import * as DialogPrimitive from '@radix-ui/react-dialog'
3
- import { VisuallyHidden } from '@radix-ui/react-visually-hidden'
4
- import { varToStyle } from '@companix/utils-browser'
5
-
6
- export interface DrawerProps {
7
- open: boolean
8
- onOpenChange: (value: boolean) => void
9
- children: React.ReactNode
10
- direction?: 'bottom' | 'top' | 'left' | 'right'
11
- className?: string
12
- /**
13
- * CSS size of the drawer. This sets `width` if horizontal position (default)
14
- * and `height` otherwise.
15
- *
16
- * Constants are available for common sizes:
17
- * - `DrawerSize.SMALL = 360px`
18
- * - `DrawerSize.STANDARD = 50%`
19
- * - `DrawerSize.LARGE = 90%`
20
- *
21
- * @default DrawerSize.STANDARD = "50%"
22
- */
23
- size?: string
24
- }
25
-
26
- export const Drawer = ({ open, onOpenChange, children, size, direction, className }: DrawerProps) => {
27
- return (
28
- <DialogPrimitive.Root open={open} onOpenChange={onOpenChange}>
29
- <DialogPrimitive.Portal>
30
- <DialogPrimitive.Overlay className="drawer-overlay" />
31
- <DialogPrimitive.Content
32
- style={varToStyle({ '--drawer-size': size ?? '50%' })}
33
- className={classNames('drawer', className)}
34
- data-direction={direction}
35
- >
36
- <VisuallyHidden>
37
- <DialogPrimitive.Title />
38
- </VisuallyHidden>
39
- {children}
40
- </DialogPrimitive.Content>
41
- </DialogPrimitive.Portal>
42
- </DialogPrimitive.Root>
43
- )
44
- }
45
-
46
- Drawer.Close = DialogPrimitive.Close
@@ -1,60 +0,0 @@
1
- import { VisuallyHidden } from '@radix-ui/react-visually-hidden'
2
- import { useRef } from 'react'
3
-
4
- export interface FileOverlayProps {
5
- multiple?: true
6
- onChange?: (file: File[]) => void
7
- children: React.ReactNode
8
- mimes?: string[]
9
- disabled?: boolean
10
- className?: string
11
- }
12
-
13
- const FileOverlay = ({
14
- onChange,
15
- disabled,
16
- mimes,
17
- children,
18
- multiple,
19
- className
20
- }: FileOverlayProps) => {
21
- const ref = useRef<HTMLInputElement>(null)
22
-
23
- const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {
24
- if (disabled) {
25
- return
26
- }
27
-
28
- if (e.target.files) {
29
- onChange?.(Array.from(e.target.files))
30
- }
31
-
32
- if (ref.current) {
33
- ref.current.value = ''
34
- }
35
- }
36
-
37
- return (
38
- <label className={className}>
39
- {children}
40
- <VisuallyHidden asChild>
41
- <input
42
- ref={ref}
43
- hidden
44
- type="file"
45
- autoComplete="off"
46
- autoCapitalize="none"
47
- autoCorrect="off"
48
- spellCheck="false"
49
- aria-autocomplete="none"
50
- multiple={multiple}
51
- accept={(mimes ?? []).join(', ')}
52
- onChange={handleChange}
53
- disabled={disabled}
54
- />
55
- </VisuallyHidden>
56
- </label>
57
- )
58
- }
59
-
60
- export { FileOverlay }
@@ -1,131 +0,0 @@
1
- import cn from 'classnames'
2
- import InputMask from 'react-input-mask'
3
-
4
- import { useLayoutAndUpdate } from '../__hooks/use-update'
5
- import { attr } from '@companix/utils-browser'
6
- import { forwardRef, useCallback, useRef } from 'react'
7
- import { mergeRefs } from 'react-merge-refs'
8
-
9
- export interface FormProps extends React.HTMLAttributes<HTMLDivElement> {
10
- required?: boolean
11
- disabled?: boolean
12
- leftElement?: React.ReactNode
13
- rightElement?: React.ReactNode
14
- placeholder?: string
15
- value?: string | number
16
- readOnly?: boolean
17
- onValueChange?: (value: string, targetElement: HTMLInputElement) => void
18
- onChange?: (event: React.ChangeEvent<HTMLInputElement>) => void
19
- inputRef?: React.RefObject<HTMLInputElement>
20
- size?: 'sm' | 'md' | 'lg'
21
- fill?: boolean
22
- mask?: string
23
- maskChar?: string
24
- }
25
-
26
- export const Form = forwardRef<HTMLDivElement, FormProps>(
27
- (
28
- {
29
- required,
30
- size,
31
- fill,
32
- leftElement,
33
- rightElement,
34
- onChange,
35
- onValueChange,
36
- readOnly,
37
- className,
38
- value,
39
- placeholder,
40
- disabled,
41
- mask,
42
- maskChar,
43
- inputRef: clientInputRef,
44
- ...containerProps
45
- },
46
- ref
47
- ) => {
48
- const inputRef = useRef<HTMLInputElement>(null)
49
-
50
- const rightRef = useRef<HTMLSpanElement>(null)
51
- const leftRef = useRef<HTMLSpanElement>(null)
52
-
53
- const elements = { Right: rightRef, Left: leftRef }
54
-
55
- const updateInputWidth = useCallback((side: 'Left' | 'Right') => {
56
- if (inputRef.current) {
57
- const input = inputRef.current.style
58
- const element = elements[side]
59
-
60
- if (element.current && element.current.clientWidth) {
61
- if (input[`padding${side}`] !== `${element.current.clientWidth}px`) {
62
- input[`padding${side}`] = `${element.current.clientWidth}px`
63
- }
64
- } else {
65
- if (input[`padding${side}`]) {
66
- input[`padding${side}`] = ''
67
- }
68
- }
69
- }
70
- }, [])
71
-
72
- useLayoutAndUpdate(() => {
73
- updateInputWidth('Left')
74
- updateInputWidth('Right')
75
- }, [rightElement, leftElement])
76
-
77
- const handleInputChange = useCallback((event: React.ChangeEvent<HTMLInputElement>) => {
78
- onChange?.(event)
79
- onValueChange?.(event.target.value, event.target)
80
- }, [])
81
-
82
- return (
83
- <div
84
- ref={ref}
85
- className={cn('form', className)}
86
- data-size={size ?? 'md'}
87
- data-fill={attr(fill)}
88
- data-required={attr(required)}
89
- data-disabled={attr(disabled)}
90
- {...containerProps}
91
- >
92
- {leftElement && (
93
- <span ref={leftRef} className="form-input-base-left-element">
94
- {leftElement}
95
- </span>
96
- )}
97
- <Input
98
- type="text"
99
- ref={mergeRefs([inputRef, clientInputRef])}
100
- className="form-input form-input-base"
101
- aria-disabled={disabled}
102
- onChange={handleInputChange}
103
- value={value}
104
- placeholder={placeholder}
105
- disabled={disabled}
106
- readOnly={readOnly}
107
- maskChar={maskChar}
108
- mask={mask}
109
- />
110
- {rightElement && (
111
- <span ref={rightRef} className="form-input-base-right-element">
112
- {rightElement}
113
- </span>
114
- )}
115
- </div>
116
- )
117
- }
118
- )
119
-
120
- interface InputProps extends Omit<React.InputHTMLAttributes<HTMLInputElement>, 'children'> {
121
- mask?: string
122
- maskChar?: string
123
- }
124
-
125
- const Input = forwardRef<HTMLInputElement, InputProps>(({ mask, maskChar, ...inputProps }, ref) => {
126
- if (mask) {
127
- return <InputMask inputRef={ref} mask={mask} maskChar={maskChar} {...inputProps} />
128
- }
129
-
130
- return <input ref={ref} {...inputProps} />
131
- })
@@ -1,43 +0,0 @@
1
- import classNames from 'classnames'
2
- import { IconDefinition } from '@fortawesome/free-solid-svg-icons'
3
- import { forwardRef } from 'react'
4
-
5
- export interface IconProps {
6
- icon: IconDefinition
7
- size?: 'xxxs' | 'xxs' | 'xs' | 's' | 'm' | 'l' | 'xl' | 'xxl' | 'xxxl'
8
- className?: string
9
- }
10
-
11
- export const Icon = forwardRef<SVGSVGElement, IconProps>(
12
- ({ icon, className, size = 'm', ...restProps }, ref) => {
13
- const [width, height, , , svgPathData] = icon.icon
14
-
15
- return (
16
- <svg
17
- ref={ref}
18
- data-prefix={icon.prefix}
19
- data-icon={icon.iconName}
20
- viewBox={`0 0 ${width} ${height}`}
21
- className={classNames(`icon icon-size-${size}`, className)}
22
- {...restProps}
23
- role="img"
24
- >
25
- <Paths paths={svgPathData} />
26
- </svg>
27
- )
28
- }
29
- )
30
-
31
- const Paths = ({ paths }: { paths: string[] | string }) => {
32
- if (Array.isArray(paths)) {
33
- return (
34
- <g>
35
- {paths.map((d, i) => (
36
- <path key={`-d-${i}`} fill="currentColor" d={d} />
37
- ))}
38
- </g>
39
- )
40
- }
41
-
42
- return <path fill="currentColor" d={paths} />
43
- }
@@ -1,17 +0,0 @@
1
- import { Button, ButtonProps } from '../Button'
2
- import { UseLoadingProps, useLoading } from '../__hooks/use-loading'
3
-
4
- export interface LoadButtonProps extends UseLoadingProps, Omit<ButtonProps, 'onClick'> {}
5
-
6
- export const LoadButton = ({ onClick, appearance = 'primary', ...rest }: LoadButtonProps) => {
7
- const { isLoading, isError, handleClick } = useLoading({ onClick })
8
-
9
- return (
10
- <Button
11
- appearance={isError ? 'negative' : appearance}
12
- {...rest}
13
- loading={isLoading}
14
- onClick={handleClick}
15
- />
16
- )
17
- }
@@ -1,74 +0,0 @@
1
- import { useRef, useState } from 'react'
2
- import { Form, FormProps } from '../Form'
3
-
4
- export interface NumberInputProps extends Omit<FormProps, 'value' | 'onChange'> {
5
- value: number | null
6
- onChange: (value: number | null) => void
7
- }
8
-
9
- export const NumberInput = ({ value, onChange, ...props }: NumberInputProps) => {
10
- const [, rerender] = useState([])
11
- const input = useRef<string>(getInputValue(value))
12
-
13
- if (+input.current !== value) {
14
- input.current = getInputValue(value)
15
- }
16
-
17
- return (
18
- <Form
19
- {...props}
20
- value={input.current}
21
- onChange={(e) => {
22
- const source = (e.currentTarget.value as string).trim()
23
-
24
- if (source === '') {
25
- input.current = ''
26
- return onChange(null)
27
- }
28
-
29
- if (source.startsWith('.')) {
30
- return
31
- }
32
-
33
- const numbersigns = source.replace('.', '').split('')
34
-
35
- if (numbersigns.some((symbol) => isNaN(parseInt(symbol)))) {
36
- return
37
- }
38
-
39
- input.current = clean(source.split(''))
40
-
41
- if (+input.current === value) {
42
- return rerender([])
43
- }
44
-
45
- onChange(+input.current)
46
- }}
47
- />
48
- )
49
- }
50
-
51
- const getInputValue = (value: number | null) => {
52
- return value === null ? '' : value.toString()
53
- }
54
-
55
- const clean = (signs: string[]) => {
56
- const result = [...signs]
57
- const source = [...signs]
58
-
59
- if (source.every((value) => value === '0')) {
60
- return '0'
61
- }
62
-
63
- for (let i = 0; i < source.length; i++) {
64
- if (source[i] !== '0') {
65
- break
66
- }
67
-
68
- if (source[i] === '0' && source[i + 1] !== '.') {
69
- result.shift()
70
- }
71
- }
72
-
73
- return result.join('')
74
- }
@@ -1,49 +0,0 @@
1
- import cn from 'classnames'
2
-
3
- import { Icon } from '../Icon'
4
- import { attr } from '@companix/utils-browser'
5
- import { forwardRef } from 'react'
6
- import { faCheck } from '@fortawesome/free-solid-svg-icons'
7
- import { Option } from '../types'
8
-
9
- interface OptionProps
10
- extends Omit<React.HTMLAttributes<HTMLDivElement>, 'title'>,
11
- Omit<Option<unknown>, 'value'> {
12
- active?: boolean
13
- minimal?: boolean
14
- }
15
-
16
- export const OptionItem = forwardRef<HTMLDivElement, OptionProps>(
17
- ({ title, icon, active, label, disabled, minimal, onClick, className, ...rest }, ref) => {
18
- const handleClick = (event: React.MouseEvent<HTMLDivElement>) => {
19
- if (!disabled) {
20
- onClick?.(event)
21
- }
22
- }
23
-
24
- return (
25
- <div
26
- ref={ref}
27
- {...rest}
28
- className={cn('option', className)}
29
- data-selected={attr(active)}
30
- data-disabled={attr(disabled)}
31
- data-minimal={attr(minimal)}
32
- onClick={handleClick}
33
- >
34
- <div className="option-content">
35
- {icon && <div className="option-icon">{icon}</div>}
36
- <div className="option-content-layout">
37
- <div className="option-title">{title}</div>
38
- {label && <div className="option-label">{label}</div>}
39
- </div>
40
- </div>
41
- {active && !minimal && (
42
- <div className="option-check">
43
- <Icon icon={faCheck} />
44
- </div>
45
- )}
46
- </div>
47
- )
48
- }
49
- )
@@ -1,26 +0,0 @@
1
- import { Scrollable } from '../Scrollable'
2
-
3
- interface MenuProps {
4
- children: React.ReactNode
5
- maxHeight?: number
6
- scrollboxRef?: React.Ref<HTMLDivElement>
7
- optionsWrapperRef?: React.Ref<HTMLDivElement>
8
- }
9
-
10
- export const OptionsList = ({ children, maxHeight, scrollboxRef, optionsWrapperRef }: MenuProps) => {
11
- return (
12
- <Scrollable
13
- ref={scrollboxRef}
14
- implementation="inner"
15
- padding={10}
16
- thumbPadding={3}
17
- thumbColor="#0000002b"
18
- maxHeight={maxHeight}
19
- scrollY
20
- >
21
- <div className="option-list" ref={optionsWrapperRef}>
22
- {children}
23
- </div>
24
- </Scrollable>
25
- )
26
- }
@@ -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,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
- }