@galyan/ui 0.0.1 → 0.0.2

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 (90) hide show
  1. package/package.json +53 -22
  2. package/.turbo/turbo-build.log +0 -20
  3. package/eslint.config.mjs +0 -4
  4. package/src/accordion/Accordion.tsx +0 -88
  5. package/src/accordion/accordion.css +0 -78
  6. package/src/accordion/index.ts +0 -2
  7. package/src/animatednumber/AnimatedNumber.tsx +0 -71
  8. package/src/animatednumber/index.ts +0 -2
  9. package/src/banner/Banner.tsx +0 -84
  10. package/src/banner/banner.css +0 -56
  11. package/src/banner/index.ts +0 -2
  12. package/src/breadcrumb/Breadcrumb.tsx +0 -94
  13. package/src/breadcrumb/breadcrumb.css +0 -58
  14. package/src/breadcrumb/index.ts +0 -2
  15. package/src/button/Button.tsx +0 -98
  16. package/src/button/button.css +0 -190
  17. package/src/button/index.ts +0 -2
  18. package/src/button.tsx +0 -20
  19. package/src/calendar/Calendar.tsx +0 -190
  20. package/src/calendar/calendar.css +0 -142
  21. package/src/calendar/index.ts +0 -2
  22. package/src/card/Card.tsx +0 -88
  23. package/src/card/card.css +0 -115
  24. package/src/card/index.ts +0 -2
  25. package/src/card.tsx +0 -27
  26. package/src/chart/Chart.tsx +0 -186
  27. package/src/chart/index.ts +0 -2
  28. package/src/checkbox/Checkbox.tsx +0 -101
  29. package/src/checkbox/checkbox.css +0 -76
  30. package/src/checkbox/index.ts +0 -2
  31. package/src/chips/Chips.tsx +0 -146
  32. package/src/chips/chips.css +0 -90
  33. package/src/chips/index.ts +0 -2
  34. package/src/code.tsx +0 -11
  35. package/src/datepicker/DatePicker.tsx +0 -104
  36. package/src/datepicker/datepicker.css +0 -22
  37. package/src/datepicker/index.ts +0 -2
  38. package/src/dragdrop/DragDrop.tsx +0 -168
  39. package/src/dragdrop/dragdrop.css +0 -122
  40. package/src/dragdrop/index.ts +0 -2
  41. package/src/dropdown/Dropdown.tsx +0 -176
  42. package/src/dropdown/dropdown.css +0 -118
  43. package/src/dropdown/index.ts +0 -2
  44. package/src/fileupload/FileUpload.tsx +0 -144
  45. package/src/fileupload/fileupload.css +0 -118
  46. package/src/fileupload/index.ts +0 -2
  47. package/src/index.ts +0 -28
  48. package/src/input/Input.tsx +0 -121
  49. package/src/input/index.ts +0 -2
  50. package/src/input/input.css +0 -120
  51. package/src/menu/Menu.tsx +0 -118
  52. package/src/menu/index.ts +0 -2
  53. package/src/menu/menu.css +0 -117
  54. package/src/modal/Modal.tsx +0 -103
  55. package/src/modal/index.ts +0 -2
  56. package/src/modal/modal.css +0 -79
  57. package/src/progressbar/ProgressBar.tsx +0 -68
  58. package/src/progressbar/index.ts +0 -2
  59. package/src/progressbar/progressbar.css +0 -73
  60. package/src/radiogroup/RadioGroup.tsx +0 -73
  61. package/src/radiogroup/index.ts +0 -2
  62. package/src/radiogroup/radiogroup.css +0 -80
  63. package/src/skeleton/Skeleton.tsx +0 -61
  64. package/src/skeleton/index.ts +0 -2
  65. package/src/skeleton/skeleton.css +0 -46
  66. package/src/spinner/Spinner.tsx +0 -29
  67. package/src/spinner/index.ts +0 -2
  68. package/src/spinner/spinner.css +0 -39
  69. package/src/stepper/Stepper.tsx +0 -127
  70. package/src/stepper/index.ts +0 -2
  71. package/src/stepper/stepper.css +0 -141
  72. package/src/tab/Tabs.tsx +0 -71
  73. package/src/tab/index.ts +0 -2
  74. package/src/tab/tab.css +0 -92
  75. package/src/table/Table.tsx +0 -205
  76. package/src/table/index.ts +0 -2
  77. package/src/table/table.css +0 -119
  78. package/src/textarea/Textarea.tsx +0 -102
  79. package/src/textarea/index.ts +0 -2
  80. package/src/textarea/textarea.css +0 -85
  81. package/src/toaster/Toaster.tsx +0 -108
  82. package/src/toaster/index.ts +0 -2
  83. package/src/toaster/toaster.css +0 -113
  84. package/src/toggle/Toggle.tsx +0 -88
  85. package/src/toggle/index.ts +0 -2
  86. package/src/toggle/toggle.css +0 -63
  87. package/src/typography/Typography.tsx +0 -58
  88. package/src/typography/index.ts +0 -2
  89. package/src/typography/typography.css +0 -102
  90. package/tsconfig.json +0 -13
@@ -1,176 +0,0 @@
1
- 'use client';
2
-
3
- import React, { useEffect, useId, useRef, useState } from 'react';
4
- import './dropdown.css';
5
-
6
- export interface DropdownOption {
7
- value: string;
8
- label: React.ReactNode;
9
- disabled?: boolean;
10
- group?: string;
11
- icon?: React.ReactNode;
12
- }
13
-
14
- export interface DropdownProps {
15
- options: DropdownOption[];
16
- value?: string;
17
- onChange?: (value: string) => void;
18
- placeholder?: string;
19
- searchable?: boolean;
20
- disabled?: boolean;
21
- label?: string;
22
- error?: string;
23
- className?: string;
24
- id?: string;
25
- }
26
-
27
- export function Dropdown({
28
- options,
29
- value,
30
- onChange,
31
- placeholder = 'Select an option',
32
- searchable = false,
33
- disabled = false,
34
- label,
35
- error,
36
- className = '',
37
- id,
38
- }: DropdownProps) {
39
- const uid = useId();
40
- const inputId = id ?? uid;
41
- const [open, setOpen] = useState(false);
42
- const [search, setSearch] = useState('');
43
- const [focused, setFocused] = useState(0);
44
- const rootRef = useRef<HTMLDivElement>(null);
45
- const searchRef = useRef<HTMLInputElement>(null);
46
-
47
- const selected = options.find((o) => o.value === value);
48
-
49
- const filtered = searchable && search
50
- ? options.filter((o) => String(o.label).toLowerCase().includes(search.toLowerCase()))
51
- : options;
52
-
53
- // Group options
54
- const groups = filtered.reduce<Record<string, DropdownOption[]>>((acc, opt) => {
55
- const g = opt.group ?? '__default__';
56
- acc[g] = [...(acc[g] ?? []), opt];
57
- return acc;
58
- }, {});
59
-
60
- useEffect(() => {
61
- if (!open) { setSearch(''); setFocused(0); return; }
62
- if (searchable) setTimeout(() => searchRef.current?.focus(), 50);
63
- }, [open, searchable]);
64
-
65
- // Close on outside click
66
- useEffect(() => {
67
- const handler = (e: MouseEvent) => {
68
- if (!rootRef.current?.contains(e.target as Node)) setOpen(false);
69
- };
70
- document.addEventListener('mousedown', handler);
71
- return () => document.removeEventListener('mousedown', handler);
72
- }, []);
73
-
74
- const handleSelect = (opt: DropdownOption) => {
75
- if (opt.disabled) return;
76
- onChange?.(opt.value);
77
- setOpen(false);
78
- };
79
-
80
- const handleKeyDown = (e: React.KeyboardEvent) => {
81
- const flat = filtered.filter((o) => !o.disabled);
82
- if (e.key === 'ArrowDown') { e.preventDefault(); setFocused((f) => Math.min(f + 1, flat.length - 1)); }
83
- if (e.key === 'ArrowUp') { e.preventDefault(); setFocused((f) => Math.max(f - 1, 0)); }
84
- if (e.key === 'Enter' && open) { e.preventDefault(); const opt = flat[focused]; if (opt) handleSelect(opt); }
85
- if (e.key === 'Escape') setOpen(false);
86
- if (!open && (e.key === 'Enter' || e.key === ' ')) { e.preventDefault(); setOpen(true); }
87
- };
88
-
89
- return (
90
- <div ref={rootRef} className={`gy-dropdown-root ${className}`} onKeyDown={handleKeyDown}>
91
- {label && <label className="gy-input-label" htmlFor={inputId}>{label}</label>}
92
-
93
- <button
94
- id={inputId}
95
- type="button"
96
- className={[
97
- 'gy-dropdown-trigger',
98
- open ? 'gy-dropdown-trigger--open' : '',
99
- disabled ? 'gy-dropdown-trigger--disabled' : '',
100
- !selected ? 'gy-dropdown-trigger--placeholder' : '',
101
- ]
102
- .filter(Boolean)
103
- .join(' ')}
104
- onClick={() => !disabled && setOpen((o) => !o)}
105
- disabled={disabled}
106
- aria-expanded={open}
107
- aria-haspopup="listbox"
108
- >
109
- <span>{selected ? selected.label : placeholder}</span>
110
- <span className={`gy-dropdown-chevron ${open ? 'gy-dropdown-chevron--open' : ''}`} aria-hidden="true">
111
- <svg width="14" height="14" viewBox="0 0 14 14" fill="none" stroke="currentColor" strokeWidth="2" strokeLinecap="round" strokeLinejoin="round">
112
- <polyline points="3,5 7,9 11,5" />
113
- </svg>
114
- </span>
115
- </button>
116
-
117
- {open && (
118
- <div className="gy-dropdown-menu" role="listbox">
119
- {searchable && (
120
- <div className="gy-dropdown-search">
121
- <input
122
- ref={searchRef}
123
- className="gy-dropdown-search-input"
124
- value={search}
125
- onChange={(e) => { setSearch(e.target.value); setFocused(0); }}
126
- placeholder="Search..."
127
- aria-label="Search options"
128
- />
129
- </div>
130
- )}
131
- <div className="gy-dropdown-options">
132
- {filtered.length === 0 ? (
133
- <div className="gy-dropdown-empty">No options found</div>
134
- ) : (
135
- Object.entries(groups).map(([group, opts]) => (
136
- <div key={group}>
137
- {group !== '__default__' && (
138
- <div className="gy-dropdown-group-label">{group}</div>
139
- )}
140
- {opts.map((opt, i) => (
141
- <div
142
- key={opt.value}
143
- className={[
144
- 'gy-dropdown-option',
145
- opt.value === value ? 'gy-dropdown-option--selected' : '',
146
- focused === i ? 'gy-dropdown-option--focused' : '',
147
- opt.disabled ? 'gy-dropdown-option--disabled' : '',
148
- ]
149
- .filter(Boolean)
150
- .join(' ')}
151
- role="option"
152
- aria-selected={opt.value === value}
153
- onClick={() => handleSelect(opt)}
154
- >
155
- {opt.icon && <span aria-hidden="true">{opt.icon}</span>}
156
- {opt.label}
157
- {opt.value === value && (
158
- <span className="gy-dropdown-check" aria-hidden="true">
159
- <svg width="14" height="11" viewBox="0 0 14 11" fill="none" stroke="currentColor" strokeWidth="2.5" strokeLinecap="round" strokeLinejoin="round">
160
- <polyline points="1,5 5,9 13,1" />
161
- </svg>
162
- </span>
163
- )}
164
- </div>
165
- ))}
166
- </div>
167
- ))
168
- )}
169
- </div>
170
- </div>
171
- )}
172
-
173
- {error && <span className="gy-input-helper gy-input-helper--error" role="alert">{error}</span>}
174
- </div>
175
- );
176
- }
@@ -1,118 +0,0 @@
1
- /* ── Dropdown / Select ───────────────────────────────────────────────────── */
2
- .gy-dropdown-root {
3
- position: relative;
4
- display: flex;
5
- flex-direction: column;
6
- gap: var(--gy-spacing-1-5);
7
- width: 100%;
8
- }
9
-
10
- .gy-dropdown-trigger {
11
- display: flex;
12
- align-items: center;
13
- justify-content: space-between;
14
- gap: var(--gy-spacing-2);
15
- padding: var(--gy-spacing-2-5) var(--gy-spacing-3);
16
- background: var(--gy-surface);
17
- border: 1.5px solid var(--gy-border);
18
- border-radius: var(--gy-radius-lg);
19
- cursor: pointer;
20
- transition: border-color var(--gy-duration-fast), box-shadow var(--gy-duration-fast);
21
- font-size: var(--gy-font-size-sm);
22
- color: var(--gy-text);
23
- min-height: 2.5rem;
24
- text-align: left;
25
- }
26
-
27
- .gy-dropdown-trigger:focus, .gy-dropdown-trigger--open {
28
- border-color: var(--gy-border-focus);
29
- box-shadow: 0 0 0 3px var(--gy-focus-ring);
30
- outline: none;
31
- }
32
-
33
- .gy-dropdown-trigger--disabled { opacity: 0.5; cursor: not-allowed; }
34
- .gy-dropdown-trigger--placeholder { color: var(--gy-text-subtle); }
35
-
36
- .gy-dropdown-chevron {
37
- flex-shrink: 0;
38
- color: var(--gy-text-subtle);
39
- transition: transform var(--gy-duration-normal) var(--gy-ease-spring);
40
- }
41
-
42
- .gy-dropdown-chevron--open { transform: rotate(180deg); }
43
-
44
- .gy-dropdown-menu {
45
- position: absolute;
46
- top: calc(100% + 4px);
47
- left: 0;
48
- right: 0;
49
- background: var(--gy-surface);
50
- border: 1px solid var(--gy-border);
51
- border-radius: var(--gy-radius-xl);
52
- box-shadow: var(--gy-shadow-dropdown);
53
- z-index: var(--gy-z-dropdown);
54
- overflow: hidden;
55
- animation: gy-slide-in-up var(--gy-duration-fast) var(--gy-ease-out);
56
- }
57
-
58
- .gy-dropdown-search {
59
- padding: var(--gy-spacing-2) var(--gy-spacing-3);
60
- border-bottom: 1px solid var(--gy-border);
61
- }
62
-
63
- .gy-dropdown-search-input {
64
- width: 100%;
65
- padding: var(--gy-spacing-1-5) var(--gy-spacing-2);
66
- font-size: var(--gy-font-size-sm);
67
- border: 1px solid var(--gy-border);
68
- border-radius: var(--gy-radius-md);
69
- background: var(--gy-background-subtle);
70
- color: var(--gy-text);
71
- outline: none;
72
- font-family: var(--gy-font-sans);
73
- }
74
-
75
- .gy-dropdown-search-input:focus { border-color: var(--gy-border-focus); }
76
-
77
- .gy-dropdown-options {
78
- max-height: 200px;
79
- overflow-y: auto;
80
- padding: var(--gy-spacing-1) 0;
81
- }
82
-
83
- .gy-dropdown-group-label {
84
- padding: var(--gy-spacing-2) var(--gy-spacing-3) var(--gy-spacing-1);
85
- font-size: var(--gy-font-size-xs);
86
- font-weight: var(--gy-font-weight-semibold);
87
- color: var(--gy-text-subtle);
88
- letter-spacing: var(--gy-letter-spacing-wider);
89
- text-transform: uppercase;
90
- }
91
-
92
- .gy-dropdown-option {
93
- display: flex;
94
- align-items: center;
95
- gap: var(--gy-spacing-2);
96
- padding: var(--gy-spacing-2) var(--gy-spacing-3);
97
- font-size: var(--gy-font-size-sm);
98
- color: var(--gy-text);
99
- cursor: pointer;
100
- transition: background-color var(--gy-duration-fast);
101
- }
102
-
103
- .gy-dropdown-option:hover { background: var(--gy-background-subtle); }
104
- .gy-dropdown-option--selected { color: var(--gy-primary); font-weight: var(--gy-font-weight-medium); background: var(--gy-primary-subtle); }
105
- .gy-dropdown-option--focused { background: var(--gy-background-muted); }
106
- .gy-dropdown-option--disabled { opacity: 0.4; cursor: not-allowed; pointer-events: none; }
107
-
108
- .gy-dropdown-check {
109
- margin-left: auto;
110
- color: var(--gy-primary);
111
- }
112
-
113
- .gy-dropdown-empty {
114
- padding: var(--gy-spacing-3);
115
- text-align: center;
116
- font-size: var(--gy-font-size-sm);
117
- color: var(--gy-text-subtle);
118
- }
@@ -1,2 +0,0 @@
1
- export { Dropdown } from './Dropdown';
2
- export type { DropdownProps, DropdownOption } from './Dropdown';
@@ -1,144 +0,0 @@
1
- 'use client';
2
-
3
- import React, { useRef, useState } from 'react';
4
- import './fileupload.css';
5
-
6
- export interface FileUploadProps {
7
- onFilesSelected?: (files: File[]) => void;
8
- multiple?: boolean;
9
- accept?: string;
10
- maxSize?: number; // in bytes
11
- maxFiles?: number;
12
- disabled?: boolean;
13
- label?: string;
14
- helperText?: string;
15
- className?: string;
16
- }
17
-
18
- const formatSize = (bytes: number) => {
19
- if (bytes === 0) return '0 B';
20
- const k = 1024;
21
- const sizes = ['B', 'KB', 'MB', 'GB'];
22
- const i = Math.floor(Math.log(bytes) / Math.log(k));
23
- return parseFloat((bytes / Math.pow(k, i)).toFixed(1)) + ' ' + sizes[i];
24
- };
25
-
26
- export function FileUpload({
27
- onFilesSelected,
28
- multiple = false,
29
- accept,
30
- maxSize,
31
- maxFiles,
32
- disabled = false,
33
- label = 'Click or drag files to upload',
34
- helperText,
35
- className = '',
36
- }: FileUploadProps) {
37
- const [dragActive, setDragActive] = useState(false);
38
- const [selectedFiles, setSelectedFiles] = useState<File[]>([]);
39
- const inputRef = useRef<HTMLInputElement>(null);
40
-
41
- const handleFiles = (files: FileList | null) => {
42
- if (!files) return;
43
- const valid = Array.from(files).filter(f => !maxSize || f.size <= maxSize);
44
- const newFiles = multiple ? [...selectedFiles, ...valid] : valid;
45
-
46
- const limited = maxFiles ? newFiles.slice(0, maxFiles) : newFiles;
47
- if (!multiple) limited.splice(1);
48
-
49
- setSelectedFiles(limited);
50
- onFilesSelected?.(limited);
51
- };
52
-
53
- const handleDrag = (e: React.DragEvent) => {
54
- e.preventDefault();
55
- e.stopPropagation();
56
- if (disabled) return;
57
- if (e.type === 'dragenter' || e.type === 'dragover') setDragActive(true);
58
- else if (e.type === 'dragleave') setDragActive(false);
59
- };
60
-
61
- const handleDrop = (e: React.DragEvent) => {
62
- e.preventDefault();
63
- e.stopPropagation();
64
- setDragActive(false);
65
- if (disabled) return;
66
- handleFiles(e.dataTransfer.files);
67
- };
68
-
69
- const removeFile = (idx: number) => {
70
- const updated = selectedFiles.filter((_, i) => i !== idx);
71
- setSelectedFiles(updated);
72
- onFilesSelected?.(updated);
73
- };
74
-
75
- return (
76
- <div className={`gy-fileupload ${className}`}>
77
- <div
78
- className={[
79
- 'gy-fileupload-zone',
80
- dragActive ? 'gy-fileupload-zone--drag-active' : '',
81
- disabled ? 'gy-fileupload-zone--disabled' : '',
82
- ]
83
- .filter(Boolean)
84
- .join(' ')}
85
- onClick={() => !disabled && inputRef.current?.click()}
86
- onDragEnter={handleDrag}
87
- onDragLeave={handleDrag}
88
- onDragOver={handleDrag}
89
- onDrop={handleDrop}
90
- >
91
- <input
92
- ref={inputRef}
93
- type="file"
94
- className="gy-fileupload-input"
95
- multiple={multiple}
96
- accept={accept}
97
- disabled={disabled}
98
- onChange={(e) => handleFiles(e.target.files)}
99
- />
100
- <svg className="gy-fileupload-icon" width="32" height="32" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2" strokeLinecap="round" strokeLinejoin="round">
101
- <path d="M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4"></path>
102
- <polyline points="17 8 12 3 7 8"></polyline>
103
- <line x1="12" y1="3" x2="12" y2="15"></line>
104
- </svg>
105
- <div className="gy-fileupload-text">{label}</div>
106
- {(helperText || maxSize) && (
107
- <div className="gy-fileupload-subtext">
108
- {helperText} {maxSize && `(Max ${formatSize(maxSize)})`}
109
- </div>
110
- )}
111
- </div>
112
-
113
- {selectedFiles.length > 0 && (
114
- <div className="gy-fileupload-list">
115
- {selectedFiles.map((f, i) => (
116
- <div key={`${f.name}-${i}`} className="gy-fileupload-item">
117
- <div className="gy-fileupload-item-icon">
118
- <svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2" strokeLinecap="round" strokeLinejoin="round">
119
- <path d="M13 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V9z"></path>
120
- <polyline points="13 2 13 9 20 9"></polyline>
121
- </svg>
122
- </div>
123
- <div className="gy-fileupload-item-info">
124
- <span className="gy-fileupload-item-name" title={f.name}>{f.name}</span>
125
- <span className="gy-fileupload-item-size">{formatSize(f.size)}</span>
126
- </div>
127
- <button
128
- type="button"
129
- className="gy-fileupload-item-remove"
130
- onClick={(e) => { e.stopPropagation(); removeFile(i); }}
131
- aria-label="Remove file"
132
- >
133
- <svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2" strokeLinecap="round" strokeLinejoin="round">
134
- <line x1="18" y1="6" x2="6" y2="18"></line>
135
- <line x1="6" y1="6" x2="18" y2="18"></line>
136
- </svg>
137
- </button>
138
- </div>
139
- ))}
140
- </div>
141
- )}
142
- </div>
143
- );
144
- }
@@ -1,118 +0,0 @@
1
- /* ── FileUpload ──────────────────────────────────────────────────────────── */
2
- .gy-fileupload {
3
- display: flex;
4
- flex-direction: column;
5
- gap: var(--gy-spacing-2);
6
- width: 100%;
7
- }
8
-
9
- .gy-fileupload-zone {
10
- display: flex;
11
- flex-direction: column;
12
- align-items: center;
13
- justify-content: center;
14
- gap: var(--gy-spacing-2);
15
- padding: var(--gy-spacing-8) var(--gy-spacing-4);
16
- background: var(--gy-surface);
17
- border: 2px dashed var(--gy-border-strong);
18
- border-radius: var(--gy-radius-xl);
19
- cursor: pointer;
20
- transition: all var(--gy-duration-normal) var(--gy-ease-out);
21
- text-align: center;
22
- }
23
-
24
- .gy-fileupload-zone:hover, .gy-fileupload-zone--drag-active {
25
- background: var(--gy-primary-subtle);
26
- border-color: var(--gy-primary);
27
- }
28
-
29
- .gy-fileupload-zone--disabled {
30
- opacity: 0.5;
31
- cursor: not-allowed;
32
- pointer-events: none;
33
- }
34
-
35
- .gy-fileupload-icon {
36
- color: var(--gy-primary);
37
- opacity: 0.8;
38
- margin-bottom: var(--gy-spacing-2);
39
- }
40
-
41
- .gy-fileupload-text {
42
- font-size: var(--gy-font-size-sm);
43
- color: var(--gy-text);
44
- font-weight: var(--gy-font-weight-medium);
45
- }
46
-
47
- .gy-fileupload-subtext {
48
- font-size: var(--gy-font-size-xs);
49
- color: var(--gy-text-subtle);
50
- }
51
-
52
- .gy-fileupload-input {
53
- display: none;
54
- }
55
-
56
- /* File list */
57
- .gy-fileupload-list {
58
- display: flex;
59
- flex-direction: column;
60
- gap: var(--gy-spacing-2);
61
- margin-top: var(--gy-spacing-2);
62
- }
63
-
64
- .gy-fileupload-item {
65
- display: flex;
66
- align-items: center;
67
- gap: var(--gy-spacing-3);
68
- padding: var(--gy-spacing-2) var(--gy-spacing-3);
69
- background: var(--gy-surface);
70
- border: 1px solid var(--gy-border);
71
- border-radius: var(--gy-radius-lg);
72
- }
73
-
74
- .gy-fileupload-item-icon {
75
- color: var(--gy-text-subtle);
76
- display: flex;
77
- align-items: center;
78
- }
79
-
80
- .gy-fileupload-item-info {
81
- flex: 1;
82
- min-width: 0;
83
- display: flex;
84
- flex-direction: column;
85
- }
86
-
87
- .gy-fileupload-item-name {
88
- font-size: var(--gy-font-size-sm);
89
- color: var(--gy-text);
90
- font-weight: var(--gy-font-weight-medium);
91
- white-space: nowrap;
92
- overflow: hidden;
93
- text-overflow: ellipsis;
94
- }
95
-
96
- .gy-fileupload-item-size {
97
- font-size: var(--gy-font-size-xs);
98
- color: var(--gy-text-subtle);
99
- }
100
-
101
- .gy-fileupload-item-remove {
102
- display: flex;
103
- align-items: center;
104
- justify-content: center;
105
- width: 1.5rem;
106
- height: 1.5rem;
107
- border-radius: var(--gy-radius-md);
108
- color: var(--gy-text-subtle);
109
- background: none;
110
- border: none;
111
- cursor: pointer;
112
- transition: color var(--gy-duration-fast), background var(--gy-duration-fast);
113
- }
114
-
115
- .gy-fileupload-item-remove:hover {
116
- color: var(--gy-danger);
117
- background: var(--gy-danger-subtle);
118
- }
@@ -1,2 +0,0 @@
1
- export { FileUpload } from './FileUpload';
2
- export type { FileUploadProps } from './FileUpload';
package/src/index.ts DELETED
@@ -1,28 +0,0 @@
1
- export * from './button/index';
2
- export * from './typography/index';
3
- export * from './input/index';
4
- export * from './textarea/index';
5
- export * from './checkbox/index';
6
- export * from './radiogroup/index';
7
- export * from './toggle/index';
8
- export * from './chips/index';
9
- export * from './card/index';
10
- export * from './spinner/index';
11
- export * from './progressbar/index';
12
- export * from './skeleton/index';
13
- export * from './banner/index';
14
- export * from './breadcrumb/index';
15
- export * from './animatednumber/index';
16
- export * from './accordion/index';
17
- export * from './tab/index';
18
- export * from './modal/index';
19
- export * from './dropdown/index';
20
- export * from './menu/index';
21
- export * from './toaster/index';
22
- export * from './stepper/index';
23
- export * from './table/index';
24
- export * from './dragdrop/index';
25
- export * from './fileupload/index';
26
- export * from './calendar/index';
27
- export * from './datepicker/index';
28
- export * from './chart/index';