@xjur-ui/react 2.1.1 → 2.2.1

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 (147) hide show
  1. package/CHANGELOG.md +18 -0
  2. package/dist/{chunk-DT44JTXB.js → chunk-4M3WR2KJ.js} +2 -2
  3. package/dist/{chunk-DT44JTXB.js.map → chunk-4M3WR2KJ.js.map} +1 -1
  4. package/dist/{chunk-7HG6Y3VV.js → chunk-BYXTOSM6.js} +2 -2
  5. package/dist/{chunk-7HG6Y3VV.js.map → chunk-BYXTOSM6.js.map} +1 -1
  6. package/dist/{chunk-4PTFZTVU.js → chunk-HLWHETF5.js} +2 -2
  7. package/dist/{chunk-4PTFZTVU.js.map → chunk-HLWHETF5.js.map} +1 -1
  8. package/dist/{chunk-ASZAHSU5.js → chunk-SLMHDBWO.js} +2 -2
  9. package/dist/{chunk-ASZAHSU5.js.map → chunk-SLMHDBWO.js.map} +1 -1
  10. package/dist/{chunk-MQ7YTZBI.js → chunk-TTKENFBF.js} +2 -2
  11. package/dist/{chunk-MQ7YTZBI.js.map → chunk-TTKENFBF.js.map} +1 -1
  12. package/dist/components/accordion.d.ts +54 -0
  13. package/dist/components/accordion.js +2 -0
  14. package/dist/components/accordion.js.map +1 -0
  15. package/dist/components/badge.d.ts +1 -1
  16. package/dist/components/controls/rating.d.ts +137 -0
  17. package/dist/components/controls/rating.js +2 -0
  18. package/dist/components/controls/rating.js.map +1 -0
  19. package/dist/components/controls/rich-editor.js +1 -1
  20. package/dist/components/controls/slider.d.ts +172 -0
  21. package/dist/components/controls/slider.js +2 -0
  22. package/dist/components/controls/slider.js.map +1 -0
  23. package/dist/components/custom/pessoa/index.js +1 -1
  24. package/dist/components/drag-and-drop/index.js +1 -1
  25. package/dist/components/full-calendar/calendar-cell.js +1 -1
  26. package/dist/components/full-calendar/calendar-day-view.js +1 -1
  27. package/dist/components/full-calendar/calendar-month-view.js +1 -1
  28. package/dist/components/full-calendar/calendar-view-renderer.js +1 -1
  29. package/dist/components/full-calendar/calendar-week-view.js +1 -1
  30. package/dist/components/full-calendar/index.js +1 -1
  31. package/dist/components/selection-bar.d.ts +1 -1
  32. package/dist/components/status.d.ts +1 -1
  33. package/dist/components/steps/index.js +1 -1
  34. package/dist/components/table/index.js +1 -1
  35. package/dist/components/toast.d.ts +27 -0
  36. package/dist/components/toast.js +2 -0
  37. package/dist/components/toast.js.map +1 -0
  38. package/dist/components/typography.d.ts +1 -1
  39. package/dist/components/upload.js +1 -1
  40. package/dist/index.css +1 -1
  41. package/dist/index.css.map +1 -1
  42. package/package.json +25 -16
  43. package/.turbo/turbo-build.log +0 -419
  44. package/eslint.config.js +0 -10
  45. package/postcss.config.js +0 -5
  46. package/prettier.config.js +0 -7
  47. package/src/components/avatar-group.tsx +0 -76
  48. package/src/components/avatar.tsx +0 -54
  49. package/src/components/badge.tsx +0 -40
  50. package/src/components/breadcrumb.tsx +0 -119
  51. package/src/components/chip.tsx +0 -117
  52. package/src/components/collapsible.tsx +0 -35
  53. package/src/components/controls/button.tsx +0 -107
  54. package/src/components/controls/calendar.tsx +0 -124
  55. package/src/components/controls/checkbox.tsx +0 -57
  56. package/src/components/controls/context/field.context.ts +0 -27
  57. package/src/components/controls/date-picker.tsx +0 -199
  58. package/src/components/controls/floating-label.tsx +0 -60
  59. package/src/components/controls/input.tsx +0 -237
  60. package/src/components/controls/otp-input.tsx +0 -45
  61. package/src/components/controls/radio.tsx +0 -74
  62. package/src/components/controls/rich-editor.tsx +0 -372
  63. package/src/components/controls/search-input.tsx +0 -154
  64. package/src/components/controls/search-selector.tsx +0 -98
  65. package/src/components/controls/select.tsx +0 -274
  66. package/src/components/controls/switch.tsx +0 -31
  67. package/src/components/custom/pessoa/index.ts +0 -9
  68. package/src/components/custom/pessoa/pessoa-add-button.tsx +0 -35
  69. package/src/components/custom/pessoa/pessoa-body.tsx +0 -22
  70. package/src/components/custom/pessoa/pessoa-close-button.tsx +0 -13
  71. package/src/components/custom/pessoa/pessoa-content.tsx +0 -25
  72. package/src/components/custom/pessoa/pessoa-footer.tsx +0 -15
  73. package/src/components/custom/pessoa/pessoa-header.tsx +0 -35
  74. package/src/components/custom/pessoa/pessoa-trigger.tsx +0 -25
  75. package/src/components/custom/pessoa/pessoa.context.tsx +0 -73
  76. package/src/components/custom/pessoa/pessoa.tsx +0 -35
  77. package/src/components/dialog.tsx +0 -242
  78. package/src/components/divider.tsx +0 -24
  79. package/src/components/drag-and-drop/drag-handle.tsx +0 -46
  80. package/src/components/drag-and-drop/drag-list-item.tsx +0 -91
  81. package/src/components/drag-and-drop/drag-list.tsx +0 -47
  82. package/src/components/drag-and-drop/drag-root.tsx +0 -30
  83. package/src/components/drag-and-drop/index.ts +0 -39
  84. package/src/components/drag-and-drop/types/drag-item.ts +0 -7
  85. package/src/components/dropdown-menu.tsx +0 -101
  86. package/src/components/full-calendar/calendar-add-event.tsx +0 -15
  87. package/src/components/full-calendar/calendar-body.tsx +0 -12
  88. package/src/components/full-calendar/calendar-cell.tsx +0 -120
  89. package/src/components/full-calendar/calendar-day-view.tsx +0 -76
  90. package/src/components/full-calendar/calendar-event.tsx +0 -178
  91. package/src/components/full-calendar/calendar-header.tsx +0 -14
  92. package/src/components/full-calendar/calendar-month-view.tsx +0 -69
  93. package/src/components/full-calendar/calendar-more-events-dropdown.tsx +0 -39
  94. package/src/components/full-calendar/calendar-navigator.tsx +0 -86
  95. package/src/components/full-calendar/calendar-root.tsx +0 -165
  96. package/src/components/full-calendar/calendar-today-button.tsx +0 -21
  97. package/src/components/full-calendar/calendar-toggle-view.tsx +0 -61
  98. package/src/components/full-calendar/calendar-view-renderer.tsx +0 -19
  99. package/src/components/full-calendar/calendar-week-day.tsx +0 -49
  100. package/src/components/full-calendar/calendar-week-view.tsx +0 -88
  101. package/src/components/full-calendar/helpers/calendar.ts +0 -158
  102. package/src/components/full-calendar/index.ts +0 -16
  103. package/src/components/full-calendar/types/calendar-cell.ts +0 -4
  104. package/src/components/full-calendar/types/calendar-event.ts +0 -7
  105. package/src/components/full-calendar/types/calendar-view.ts +0 -1
  106. package/src/components/full-calendar/types/calendar-week-hour.ts +0 -4
  107. package/src/components/horizontal-scroll.tsx +0 -159
  108. package/src/components/icon.tsx +0 -29
  109. package/src/components/list.tsx +0 -111
  110. package/src/components/logo.tsx +0 -44
  111. package/src/components/selection-bar.tsx +0 -273
  112. package/src/components/sheet.tsx +0 -150
  113. package/src/components/skeleton.tsx +0 -12
  114. package/src/components/status.tsx +0 -43
  115. package/src/components/steps/index.ts +0 -6
  116. package/src/components/steps/step.tsx +0 -23
  117. package/src/components/steps/steps-action.tsx +0 -65
  118. package/src/components/steps/steps-content.tsx +0 -12
  119. package/src/components/steps/steps-context.tsx +0 -121
  120. package/src/components/steps/steps-navigation.tsx +0 -80
  121. package/src/components/steps/steps-root.tsx +0 -9
  122. package/src/components/table/index.ts +0 -8
  123. package/src/components/table/table-body.tsx +0 -17
  124. package/src/components/table/table-cell.tsx +0 -14
  125. package/src/components/table/table-footer.tsx +0 -17
  126. package/src/components/table/table-head.tsx +0 -31
  127. package/src/components/table/table-header.tsx +0 -17
  128. package/src/components/table/table-row.tsx +0 -21
  129. package/src/components/table/table-sort.tsx +0 -34
  130. package/src/components/table/table.tsx +0 -16
  131. package/src/components/tabs.tsx +0 -72
  132. package/src/components/tag.tsx +0 -99
  133. package/src/components/tooltip.tsx +0 -63
  134. package/src/components/typography.tsx +0 -85
  135. package/src/components/upload.tsx +0 -647
  136. package/src/hooks/index.ts +0 -1
  137. package/src/hooks/use-os.ts +0 -32
  138. package/src/index.css +0 -5
  139. package/src/resources/icons.ts +0 -154
  140. package/src/resources/input-mask.ts +0 -91
  141. package/src/resources/logo/horizontal.tsx +0 -70
  142. package/src/resources/logo/icon.tsx +0 -54
  143. package/src/resources/logo/index.tsx +0 -33
  144. package/src/resources/logo/vertical.tsx +0 -70
  145. package/src/types.d.ts +0 -4
  146. package/tsconfig.json +0 -4
  147. package/tsup.config.ts +0 -30
@@ -1,647 +0,0 @@
1
- import type { ComponentProps, DragEvent, ChangeEvent } from 'react'
2
- import { useRef, useState, useCallback, createContext, useContext } from 'react'
3
- import { cva, cx, type ClassVariantProps } from '@xjur-ui/util'
4
- import { Icon, type IconType } from './icon'
5
- import { Button } from './controls/button'
6
- import { Switch } from './controls/switch'
7
- import { InputRoot, InputContent, InputText } from './controls/input'
8
- import {
9
- SelectRoot,
10
- SelectTrigger,
11
- SelectContent,
12
- SelectOption
13
- } from './controls/select'
14
-
15
- export interface FileFormat {
16
- name: string
17
- type: string
18
- fileBinary: File
19
- restrict?: boolean
20
- description?: string
21
- fileType?: string
22
- }
23
-
24
- export interface FileTypeOption {
25
- value: string
26
- label: string
27
- }
28
-
29
- interface UploadContextValue {
30
- files: FileFormat[]
31
- onFilesChange?: (files: FileFormat[]) => void
32
- accept?: string
33
- multiple?: boolean
34
- disabled?: boolean
35
- maxFiles?: number
36
- maxSize?: number
37
- acceptedFormats?: string[]
38
- }
39
-
40
- const UploadContext = createContext<UploadContextValue | null>(null)
41
-
42
- function useUploadContext() {
43
- const context = useContext(UploadContext)
44
- if (!context) {
45
- throw new Error('Upload components must be used within UploadRoot')
46
- }
47
- return context
48
- }
49
-
50
- interface UploadRootProps extends ComponentProps<'div'> {
51
- files: FileFormat[]
52
- onFilesChange?: (files: FileFormat[]) => void
53
- accept?: string
54
- multiple?: boolean
55
- disabled?: boolean
56
- maxFiles?: number
57
- maxSize?: number
58
- acceptedFormats?: string[]
59
- }
60
-
61
- function UploadRoot({
62
- children,
63
- className,
64
- files,
65
- onFilesChange,
66
- accept,
67
- multiple = false,
68
- disabled = false,
69
- maxFiles = 1,
70
- maxSize,
71
- acceptedFormats = ['.jpeg', '.png', '.webp'],
72
- ...props
73
- }: UploadRootProps) {
74
- return (
75
- <UploadContext.Provider
76
- value={{
77
- files,
78
- onFilesChange,
79
- accept,
80
- multiple,
81
- disabled,
82
- maxFiles,
83
- maxSize,
84
- acceptedFormats
85
- }}
86
- >
87
- <div className={cx('flex flex-col gap-4', className)} {...props}>
88
- {children}
89
- </div>
90
- </UploadContext.Provider>
91
- )
92
- }
93
-
94
- const uploadAreaVariants = cva(
95
- [
96
- 'flex flex-col items-center justify-center',
97
- 'relative border-2 border-dashed border-border-layer-2 rounded-lg transition-all duration-200 ease-in-out cursor-pointer',
98
- 'hover:border-border-layer-2 hover:bg-transparent',
99
- 'focus-within:border-primary-idle focus-within:ring-2 focus-within:ring-primary-idle/20',
100
- 'data-[drag-over=true]:border-primary-idle data-[drag-over=true]:bg-primary-alt-idle/10'
101
- ],
102
- {
103
- variants: {
104
- size: {
105
- large: 'p-6 min-h-[200px] ',
106
- medium: 'p-6 min-h-[160px]',
107
- small: 'p-6 min-h-[130px]',
108
- oneLine: 'p-4 min-h-[18px]'
109
- },
110
- showButton: {
111
- true: '',
112
- false: ''
113
- },
114
- variant: {
115
- default: 'bg-white',
116
- transparent: 'bg-transparent',
117
- minimal: 'bg-white',
118
- oneLineWhite: 'bg-white',
119
- oneLineTransparent: 'bg-transparent'
120
- }
121
- },
122
- compoundVariants: [
123
- {
124
- size: 'large',
125
- showButton: true
126
- },
127
- {
128
- size: 'medium',
129
- showButton: true
130
- },
131
- {
132
- size: 'small',
133
- showButton: true
134
- },
135
- {
136
- variant: 'oneLineWhite',
137
- showButton: false,
138
- className: 'items-center flex flex-row justify-center'
139
- },
140
- {
141
- variant: 'oneLineTransparent',
142
- showButton: false,
143
- className: 'items-center flex flex-row justify-center'
144
- }
145
- ],
146
- defaultVariants: {
147
- size: 'large',
148
- variant: 'default',
149
- showButton: true
150
- }
151
- }
152
- )
153
-
154
- interface UploadAreaProps
155
- extends Omit<ComponentProps<'div'>, 'onChange'>,
156
- ClassVariantProps<typeof uploadAreaVariants> {
157
- showAcceptedFormats?: boolean
158
- buttonText?: string
159
- description?: string
160
- icon?: string
161
- showButton?: boolean
162
- }
163
-
164
- function UploadArea({
165
- className,
166
- size = 'large',
167
- showButton = true,
168
- variant = 'default',
169
- showAcceptedFormats = true,
170
- buttonText = 'Selecionar arquivo',
171
- description = 'Clique ou solte os arquivos para fazer o upload',
172
- icon = 'upload',
173
- ...props
174
- }: UploadAreaProps) {
175
- const {
176
- onFilesChange,
177
- accept,
178
- multiple,
179
- disabled,
180
- maxFiles,
181
- maxSize,
182
- acceptedFormats
183
- } = useUploadContext()
184
- const [isDragOver, setIsDragOver] = useState(false)
185
- const fileInputRef = useRef<HTMLInputElement>(null)
186
- const [dragCounter, setDragCounter] = useState(0)
187
-
188
- const validateFiles = useCallback(
189
- (files: File[]): FileFormat[] => {
190
- let validFiles = files
191
-
192
- if (maxFiles && maxFiles > 0) {
193
- validFiles = validFiles.slice(0, maxFiles)
194
- }
195
-
196
- if (maxSize) {
197
- validFiles = validFiles.filter(file => file.size <= maxSize)
198
- }
199
-
200
- if (accept) {
201
- validFiles = validFiles.filter(file => {
202
- const fileExtension = `.${file.name.split('.').pop()?.toLowerCase()}`
203
- return acceptedFormats?.some(format =>
204
- format.startsWith('.')
205
- ? format === fileExtension
206
- : file.type.includes(format)
207
- )
208
- })
209
- }
210
-
211
- return validFiles.map(file => ({
212
- name: file.name,
213
- type: file.type,
214
- fileBinary: file,
215
- restrict: false
216
- }))
217
- },
218
- [maxFiles, maxSize, accept, acceptedFormats]
219
- )
220
-
221
- const handleDragEnter = useCallback((e: DragEvent<HTMLDivElement>) => {
222
- e.preventDefault()
223
- e.stopPropagation()
224
- setDragCounter(prev => prev + 1)
225
- setIsDragOver(true)
226
- }, [])
227
-
228
- const handleDragLeave = useCallback(
229
- (e: DragEvent<HTMLDivElement>) => {
230
- e.preventDefault()
231
- e.stopPropagation()
232
- setDragCounter(prev => prev - 1)
233
- if (dragCounter <= 1) {
234
- setIsDragOver(false)
235
- }
236
- },
237
- [dragCounter]
238
- )
239
-
240
- const handleDragOver = useCallback((e: DragEvent<HTMLDivElement>) => {
241
- e.preventDefault()
242
- e.stopPropagation()
243
- }, [])
244
-
245
- const handleDrop = useCallback(
246
- (e: DragEvent<HTMLDivElement>) => {
247
- e.preventDefault()
248
- e.stopPropagation()
249
- setIsDragOver(false)
250
- setDragCounter(0)
251
-
252
- if (disabled) return
253
-
254
- const files = Array.from(e.dataTransfer.files)
255
- const validFiles = validateFiles(files)
256
-
257
- if (validFiles.length > 0) {
258
- onFilesChange?.(validFiles)
259
- }
260
- },
261
- [disabled, onFilesChange, validateFiles]
262
- )
263
-
264
- const handleFileSelect = useCallback(
265
- (e: ChangeEvent<HTMLInputElement>) => {
266
- if (disabled) return
267
-
268
- const files = Array.from(e.target.files || [])
269
- const validFiles = validateFiles(files)
270
-
271
- if (validFiles.length > 0) {
272
- onFilesChange?.(validFiles)
273
- }
274
- },
275
- [disabled, onFilesChange, validateFiles]
276
- )
277
-
278
- return (
279
- <UploadAreaTrigger
280
- {...props}
281
- aria-disabled={disabled}
282
- aria-label={description}
283
- className={cx(
284
- uploadAreaVariants({ size, showButton, variant }),
285
- className
286
- )}
287
- data-drag-over={isDragOver}
288
- fileInputRef={fileInputRef}
289
- onDragEnter={handleDragEnter}
290
- onDragLeave={handleDragLeave}
291
- onDragOver={handleDragOver}
292
- onDrop={handleDrop}
293
- >
294
- <input
295
- accept={accept}
296
- className="hidden"
297
- disabled={disabled}
298
- multiple={multiple}
299
- ref={fileInputRef}
300
- type="file"
301
- onChange={handleFileSelect}
302
- />
303
-
304
- <UploadAreaContent
305
- buttonText={buttonText}
306
- description={description}
307
- icon={icon}
308
- showAcceptedFormats={showAcceptedFormats}
309
- showButton={showButton}
310
- variant={variant || 'default'}
311
- onButtonClick={() => {
312
- if (!disabled && fileInputRef.current) {
313
- fileInputRef.current.click()
314
- }
315
- }}
316
- />
317
- </UploadAreaTrigger>
318
- )
319
- }
320
-
321
- function UploadTitle({ children, className, ...props }: ComponentProps<'h3'>) {
322
- return (
323
- <h3
324
- className={cx('text-neutral-dark text-lg font-semibold', className)}
325
- {...props}
326
- >
327
- {children}
328
- </h3>
329
- )
330
- }
331
-
332
- interface UploadAreaContentProps extends ComponentProps<'div'> {
333
- description?: string
334
- icon?: string
335
- showAcceptedFormats?: boolean
336
- buttonText?: string
337
- showButton?: boolean
338
- onButtonClick?: () => void
339
- variant?:
340
- | 'default'
341
- | 'transparent'
342
- | 'minimal'
343
- | 'oneLineWhite'
344
- | 'oneLineTransparent'
345
- }
346
-
347
- function UploadAreaContent({
348
- description = 'Clique ou solte os arquivos para fazer o upload',
349
- icon = 'upload',
350
- showAcceptedFormats = true,
351
- buttonText = 'Selecionar arquivo',
352
- showButton = true,
353
- onButtonClick,
354
- variant = 'default',
355
- className,
356
- ...props
357
- }: UploadAreaContentProps) {
358
- const { acceptedFormats } = useUploadContext()
359
-
360
- const formatAcceptedFormats = () => {
361
- if (!showAcceptedFormats) return null
362
-
363
- return (
364
- <p className="text-neutral-secondary mt-2 text-sm">
365
- Formatos aceitos: {acceptedFormats?.join(' ')}
366
- </p>
367
- )
368
- }
369
-
370
- const isOneLineVariant =
371
- variant === 'oneLineWhite' || variant === 'oneLineTransparent'
372
-
373
- if (isOneLineVariant) {
374
- return (
375
- <div
376
- {...props}
377
- className={cx(
378
- 'flex h-full items-center justify-center gap-4 text-center',
379
- className
380
- )}
381
- >
382
- <Icon
383
- className="text-neutral-secondary text-4xl"
384
- name={icon as IconType}
385
- />
386
- <p className="text-neutral-dark text-base font-medium">{description}</p>
387
- {formatAcceptedFormats()}
388
- </div>
389
- )
390
- }
391
-
392
- return (
393
- <div
394
- {...props}
395
- className={cx(
396
- 'flex h-full w-full flex-col items-center gap-4 text-center',
397
- className
398
- )}
399
- >
400
- <div className="flex flex-col items-center">
401
- <Icon
402
- className="text-neutral-secondary mb-3 text-4xl"
403
- name={icon as IconType}
404
- />
405
-
406
- <p className="text-neutral-dark mb-2 text-base font-medium">
407
- {description}
408
- </p>
409
-
410
- {formatAcceptedFormats()}
411
- </div>
412
-
413
- {showButton && (
414
- <div>
415
- <Button
416
- size="md"
417
- variant="primary"
418
- onClick={e => {
419
- e.stopPropagation()
420
- onButtonClick?.()
421
- }}
422
- >
423
- {buttonText}
424
- </Button>
425
- </div>
426
- )}
427
- </div>
428
- )
429
- }
430
-
431
- interface UploadAreaTriggerProps extends ComponentProps<'div'> {
432
- fileInputRef?: React.RefObject<HTMLInputElement | null>
433
- }
434
-
435
- function UploadAreaTrigger({
436
- children,
437
- fileInputRef,
438
- ...props
439
- }: UploadAreaTriggerProps) {
440
- const { disabled } = useUploadContext()
441
-
442
- const handleClick = useCallback(() => {
443
- if (!disabled && fileInputRef?.current) {
444
- fileInputRef.current.click()
445
- }
446
- }, [disabled, fileInputRef])
447
-
448
- return (
449
- <div
450
- role="button"
451
- tabIndex={disabled ? -1 : 0}
452
- onClick={handleClick}
453
- onKeyDown={e => {
454
- if (e.key === 'Enter' || e.key === ' ') {
455
- e.preventDefault()
456
- handleClick()
457
- }
458
- }}
459
- {...props}
460
- >
461
- {children}
462
- </div>
463
- )
464
- }
465
-
466
- interface EditableFilesListProps {
467
- fileTypeOptions?: FileTypeOption[]
468
- onUpdateFile?: (index: number, file: Partial<FileFormat>) => void
469
- onDeleteFile?: (index: number) => void
470
- onReorderFiles?: (fromIndex: number, toIndex: number) => void
471
- className?: string
472
- }
473
-
474
- function EditableFilesList({
475
- fileTypeOptions = [
476
- { value: 'document', label: 'Documento' },
477
- { value: 'image', label: 'Imagem' },
478
- { value: 'video', label: 'Vídeo' },
479
- { value: 'audio', label: 'Áudio' },
480
- { value: 'other', label: 'Outro' }
481
- ],
482
- onUpdateFile,
483
- onDeleteFile,
484
- className,
485
- ...props
486
- }: EditableFilesListProps) {
487
- const { files, onFilesChange } = useUploadContext()
488
-
489
- if (!files || files.length === 0) return null
490
-
491
- const handleDescriptionChange = (index: number, description: string) => {
492
- if (onUpdateFile) {
493
- onUpdateFile(index, { description })
494
- } else {
495
- const updatedFiles = [...files]
496
- updatedFiles[index] = { ...updatedFiles[index], description }
497
- onFilesChange?.(updatedFiles)
498
- }
499
- }
500
-
501
- const handleFileTypeChange = (index: number, fileType: string) => {
502
- if (onUpdateFile) {
503
- onUpdateFile(index, { fileType })
504
- } else {
505
- const updatedFiles = [...files]
506
- updatedFiles[index] = { ...updatedFiles[index], fileType }
507
- onFilesChange?.(updatedFiles)
508
- }
509
- }
510
-
511
- const handleRestrictChange = (index: number, restrict: boolean) => {
512
- if (onUpdateFile) {
513
- onUpdateFile(index, { restrict })
514
- } else {
515
- const updatedFiles = [...files]
516
- updatedFiles[index] = { ...updatedFiles[index], restrict }
517
- onFilesChange?.(updatedFiles)
518
- }
519
- }
520
-
521
- const handleDelete = (index: number) => {
522
- if (onDeleteFile) {
523
- onDeleteFile(index)
524
- } else {
525
- const updatedFiles = files.filter((_, i) => i !== index)
526
- onFilesChange?.(updatedFiles)
527
- }
528
- }
529
-
530
- return (
531
- <div className={cx('space-y-2', className)} {...props}>
532
- <div className="border-border-layer-2 p-4">
533
- <div className="border-border-layer-2 mb-3 flex w-full flex-row items-center justify-between gap-4 border-b pb-2">
534
- <div className="w-full">
535
- <span className="text-sm font-medium text-gray-300">Descrição</span>
536
- </div>
537
- <div className="w-full">
538
- <span className="text-sm font-medium text-gray-300">Tipo</span>
539
- </div>
540
- <div className="flex justify-end">
541
- <span className="text-sm font-medium text-gray-300">Restrito</span>
542
- </div>
543
- </div>
544
-
545
- <div className="space-y-3">
546
- {files.map((file, index) => (
547
- <div className="flex flex-row items-center gap-4 py-3" key={index}>
548
- <div className="flex justify-start">
549
- <Icon
550
- className="text-neutral-secondary hover:text-neutral-dark cursor-grab"
551
- name="drag_indicator"
552
- />
553
- </div>
554
-
555
- <div className="w-full">
556
- <InputRoot>
557
- <InputContent>
558
- <InputText
559
- placeholder="Nome do arquivo"
560
- value={file.description || file.name}
561
- onChange={e =>
562
- handleDescriptionChange(index, e.target.value)
563
- }
564
- />
565
- </InputContent>
566
- </InputRoot>
567
- </div>
568
-
569
- <div className="w-full">
570
- <SelectRoot>
571
- <SelectTrigger className="flex justify-between">
572
- <span className="text-neutral-dark">
573
- {fileTypeOptions.find(
574
- option => option.value === file.fileType
575
- )?.label || 'Tipo'}
576
- </span>
577
- <Icon
578
- className="text-neutral-secondary"
579
- name="keyboard_arrow_down"
580
- />
581
- </SelectTrigger>
582
- <SelectContent>
583
- {fileTypeOptions.map(option => (
584
- <SelectOption
585
- key={option.value}
586
- value={option.value}
587
- onSelect={() =>
588
- handleFileTypeChange(index, option.value)
589
- }
590
- >
591
- {option.label}
592
- </SelectOption>
593
- ))}
594
- </SelectContent>
595
- </SelectRoot>
596
- </div>
597
-
598
- <div className="flex justify-end">
599
- <Switch
600
- checked={file.restrict || false}
601
- onCheckedChange={checked =>
602
- handleRestrictChange(index, checked)
603
- }
604
- />
605
- </div>
606
-
607
- <div className="flex justify-end">
608
- <Button
609
- appearance="ghost"
610
- size="sm"
611
- variant="destructive"
612
- onClick={() => handleDelete(index)}
613
- >
614
- <Icon name="delete" />
615
- </Button>
616
- </div>
617
- </div>
618
- ))}
619
- </div>
620
- </div>
621
- </div>
622
- )
623
- }
624
-
625
- export const Upload = {
626
- Root: UploadRoot,
627
- Area: UploadArea,
628
- Title: UploadTitle,
629
- AreaContent: UploadAreaContent,
630
- AreaTrigger: UploadAreaTrigger,
631
- EditableList: EditableFilesList
632
- }
633
-
634
- export { UploadRoot }
635
- export { UploadArea }
636
- export { UploadTitle }
637
- export { UploadAreaContent }
638
- export { UploadAreaTrigger }
639
- export { EditableFilesList }
640
- export { uploadAreaVariants }
641
- export type {
642
- UploadRootProps,
643
- UploadAreaProps,
644
- UploadAreaContentProps,
645
- UploadAreaTriggerProps,
646
- EditableFilesListProps
647
- }
@@ -1 +0,0 @@
1
- export { useOS } from './use-os'
@@ -1,32 +0,0 @@
1
- import { useState, useEffect } from 'react'
2
-
3
- export type OS = 'ios' | 'macos' | 'windows' | 'android' | 'linux' | 'unknown'
4
-
5
- export function useOS() {
6
- const [os, setOs] = useState<OS>('unknown')
7
-
8
- useEffect(() => {
9
- if (typeof window === 'undefined') return
10
-
11
- const userAgent = window.navigator.userAgent
12
-
13
- if (/iPad|iPhone|iPod/.test(userAgent)) {
14
- setOs('ios')
15
- } else if (/Mac/.test(userAgent)) {
16
- setOs('macos')
17
- } else if (/Win/.test(userAgent)) {
18
- setOs('windows')
19
- } else if (/Android/.test(userAgent)) {
20
- setOs('android')
21
- } else if (/Linux/.test(userAgent)) {
22
- setOs('linux')
23
- } else {
24
- setOs('unknown')
25
- }
26
- }, [])
27
-
28
- return {
29
- os,
30
- shortcut: ['macos', 'ios'].includes(os) ? '⌘' : 'Ctrl'
31
- }
32
- }
package/src/index.css DELETED
@@ -1,5 +0,0 @@
1
- @import "tailwindcss";
2
- @import "@xjur-ui/styles/theme.css";
3
- @import "tw-animate-css";
4
- @plugin "tailwind-scrollbar";
5
- @plugin "tailwind-scrollbar-hide";