@justin_evo/evo-ui 1.0.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 (110) hide show
  1. package/dist/Alert/Alert.d.ts +11 -0
  2. package/dist/AutoComplete/AutoComplete.d.ts +95 -0
  3. package/dist/Badge/Badge.d.ts +23 -0
  4. package/dist/Breadcrumb/Breadcrumb.d.ts +16 -0
  5. package/dist/Button/Button.d.ts +54 -0
  6. package/dist/Card/Card.d.ts +60 -0
  7. package/dist/Checkbox/Checkbox.d.ts +16 -0
  8. package/dist/CommandPalette/CommandPalette.d.ts +17 -0
  9. package/dist/Container/Container.d.ts +10 -0
  10. package/dist/Divider/Divider.d.ts +7 -0
  11. package/dist/Form/Form.d.ts +61 -0
  12. package/dist/Grid/Grid.d.ts +23 -0
  13. package/dist/ImageCropper/ImageCropper.d.ts +111 -0
  14. package/dist/Input/Input.d.ts +12 -0
  15. package/dist/Modal/Modal.d.ts +26 -0
  16. package/dist/Nav/Nav.d.ts +63 -0
  17. package/dist/Notification/Notification.d.ts +186 -0
  18. package/dist/Pagination/Pagination.d.ts +10 -0
  19. package/dist/Radio/Radio.d.ts +20 -0
  20. package/dist/RichTextArea/RichTextArea.d.ts +70 -0
  21. package/dist/Select/Select.d.ts +44 -0
  22. package/dist/Skeleton/Skeleton.d.ts +23 -0
  23. package/dist/Stack/Stack.d.ts +16 -0
  24. package/dist/Table/Table.d.ts +77 -0
  25. package/dist/Tabs/Tabs.d.ts +28 -0
  26. package/dist/Theme/ThemeProvider.d.ts +96 -0
  27. package/dist/Theme/ThemeToggle.d.ts +22 -0
  28. package/dist/Toggle/Toggle.d.ts +11 -0
  29. package/dist/Tooltip/Tooltip.d.ts +10 -0
  30. package/dist/TopNav/TopNav.d.ts +76 -0
  31. package/dist/TreeSelect/TreeSelect.d.ts +50 -0
  32. package/dist/declarations.d.ts +6 -0
  33. package/dist/evo-ui.css +1 -0
  34. package/dist/index.cjs.js +1 -0
  35. package/dist/index.d.ts +31 -0
  36. package/dist/index.es.js +5688 -0
  37. package/package.json +52 -0
  38. package/src/Alert/Alert.tsx +49 -0
  39. package/src/AutoComplete/AutoComplete.tsx +810 -0
  40. package/src/Badge/Badge.tsx +53 -0
  41. package/src/Breadcrumb/Breadcrumb.tsx +53 -0
  42. package/src/Button/Button.tsx +125 -0
  43. package/src/Card/Card.tsx +257 -0
  44. package/src/Checkbox/Checkbox.tsx +59 -0
  45. package/src/CommandPalette/CommandPalette.tsx +185 -0
  46. package/src/Container/Container.tsx +31 -0
  47. package/src/Divider/Divider.tsx +31 -0
  48. package/src/Form/Form.tsx +185 -0
  49. package/src/Grid/Grid.tsx +66 -0
  50. package/src/ImageCropper/ImageCropper.tsx +911 -0
  51. package/src/Input/Input.tsx +74 -0
  52. package/src/Modal/Modal.tsx +77 -0
  53. package/src/Nav/Nav.tsx +626 -0
  54. package/src/Notification/Notification.tsx +1503 -0
  55. package/src/Pagination/Pagination.tsx +76 -0
  56. package/src/Radio/Radio.tsx +69 -0
  57. package/src/RichTextArea/RichTextArea.tsx +869 -0
  58. package/src/Select/Select.tsx +515 -0
  59. package/src/Skeleton/Skeleton.tsx +70 -0
  60. package/src/Stack/Stack.tsx +52 -0
  61. package/src/Table/Table.tsx +335 -0
  62. package/src/Tabs/Tabs.tsx +90 -0
  63. package/src/Theme/ThemeProvider.tsx +253 -0
  64. package/src/Theme/ThemeToggle.tsx +79 -0
  65. package/src/Toggle/Toggle.tsx +48 -0
  66. package/src/Tooltip/Tooltip.tsx +38 -0
  67. package/src/TopNav/TopNav.tsx +994 -0
  68. package/src/TreeSelect/TreeSelect.tsx +825 -0
  69. package/src/css/alert.module.scss +93 -0
  70. package/src/css/autocomplete.module.scss +416 -0
  71. package/src/css/badge.module.scss +82 -0
  72. package/src/css/base/_color.scss +159 -0
  73. package/src/css/base/_theme.scss +237 -0
  74. package/src/css/base/_variables.scss +161 -0
  75. package/src/css/breadcrumb.module.scss +50 -0
  76. package/src/css/button.module.scss +385 -0
  77. package/src/css/card.module.scss +217 -0
  78. package/src/css/checkbox.module.scss +120 -0
  79. package/src/css/commandpalette.module.scss +211 -0
  80. package/src/css/container.module.scss +18 -0
  81. package/src/css/divider.module.scss +41 -0
  82. package/src/css/form.module.scss +245 -0
  83. package/src/css/imagecropper.module.scss +397 -0
  84. package/src/css/input.module.scss +89 -0
  85. package/src/css/modal.module.scss +105 -0
  86. package/src/css/nav.module.scss +339 -0
  87. package/src/css/notification.module.scss +691 -0
  88. package/src/css/pagination.module.scss +63 -0
  89. package/src/css/radio.module.scss +89 -0
  90. package/src/css/richtextarea.module.scss +307 -0
  91. package/src/css/select.module.scss +525 -0
  92. package/src/css/skeleton.module.scss +30 -0
  93. package/src/css/table.module.scss +386 -0
  94. package/src/css/tabs.module.scss +63 -0
  95. package/src/css/theme-toggle.module.scss +83 -0
  96. package/src/css/toggle.module.scss +54 -0
  97. package/src/css/tooltip.module.scss +97 -0
  98. package/src/css/topnav.module.scss +396 -0
  99. package/src/css/treeselect.module.scss +558 -0
  100. package/src/css/utilities/_borders.scss +111 -0
  101. package/src/css/utilities/_colors.scss +66 -0
  102. package/src/css/utilities/_effects.scss +216 -0
  103. package/src/css/utilities/_layout.scss +181 -0
  104. package/src/css/utilities/_position.scss +75 -0
  105. package/src/css/utilities/_sizing.scss +138 -0
  106. package/src/css/utilities/_spacing.scss +99 -0
  107. package/src/css/utilities/_typography.scss +121 -0
  108. package/src/css/utilities/index.scss +24 -0
  109. package/src/declarations.d.ts +6 -0
  110. package/src/index.ts +60 -0
@@ -0,0 +1,396 @@
1
+ @use 'base/variables' as *;
2
+ @use 'base/color' as *;
3
+
4
+ // ---------------------------------------------------------------------------
5
+ // Animations (token-aligned with modal.module.scss — see CLAUDE.md §0.2)
6
+ // ---------------------------------------------------------------------------
7
+
8
+ @keyframes topNavOverlayFadeIn {
9
+ from { opacity: 0; }
10
+ to { opacity: 1; }
11
+ }
12
+
13
+ @keyframes topNavDrawerSlideIn {
14
+ from { transform: translateX(100%); }
15
+ to { transform: translateX(0); }
16
+ }
17
+
18
+ @keyframes topNavDropdownFadeIn {
19
+ from { opacity: 0; transform: translateY(-4px); }
20
+ to { opacity: 1; transform: translateY(0); }
21
+ }
22
+
23
+ // ---------------------------------------------------------------------------
24
+ // Root
25
+ // ---------------------------------------------------------------------------
26
+
27
+ .topNav {
28
+ position: relative;
29
+ width: 100%;
30
+ font-family: $font-sans;
31
+ background-color: $color-surface;
32
+ border-bottom: 1px solid $color-border;
33
+ }
34
+
35
+ .topNavInner {
36
+ display: flex;
37
+ align-items: center;
38
+ gap: 1.5rem;
39
+ padding: 0 1rem;
40
+ min-height: 3.25rem;
41
+ }
42
+
43
+ // ---------------------------------------------------------------------------
44
+ // Brand
45
+ // ---------------------------------------------------------------------------
46
+
47
+ .topNavBrand {
48
+ display: flex;
49
+ align-items: center;
50
+ flex-shrink: 0;
51
+ font-size: $text-base;
52
+ font-weight: 600;
53
+ color: $color-text-primary;
54
+ }
55
+
56
+ // ---------------------------------------------------------------------------
57
+ // Menu — horizontal on desktop
58
+ // ---------------------------------------------------------------------------
59
+
60
+ .topNavMenu {
61
+ display: flex;
62
+ align-items: center;
63
+ list-style: none;
64
+ margin: 0;
65
+ padding: 0;
66
+ gap: 0.125rem;
67
+ flex: 1;
68
+ min-width: 0;
69
+ }
70
+
71
+ .topNavItemRow {
72
+ display: flex;
73
+ align-items: stretch;
74
+ }
75
+
76
+ // ---------------------------------------------------------------------------
77
+ // Menu — horizontal-scroll fallback (only when collapsed AND no Toggle present)
78
+ // ---------------------------------------------------------------------------
79
+
80
+ .topNavMenuScroll {
81
+ overflow-x: auto;
82
+ flex-wrap: nowrap;
83
+ -webkit-overflow-scrolling: touch;
84
+ scrollbar-width: none;
85
+
86
+ &::-webkit-scrollbar { display: none; }
87
+
88
+ > li { flex-shrink: 0; }
89
+ }
90
+
91
+ // ---------------------------------------------------------------------------
92
+ // Item / Dropdown trigger (shared visual class)
93
+ // ---------------------------------------------------------------------------
94
+
95
+ .topNavItem {
96
+ display: inline-flex;
97
+ align-items: center;
98
+ gap: 0.5rem;
99
+ padding: 0.4375rem 0.75rem;
100
+ min-height: 2rem;
101
+ font-size: $text-sm;
102
+ font-weight: 500;
103
+ color: $color-text-secondary;
104
+ background: transparent;
105
+ border: none;
106
+ border-radius: $radius-sm;
107
+ cursor: pointer;
108
+ white-space: nowrap;
109
+ text-decoration: none;
110
+ transition:
111
+ background-color $transition-fast,
112
+ color $transition-fast;
113
+ font-family: inherit;
114
+
115
+ &:hover {
116
+ background-color: $color-surface-hover;
117
+ color: $color-text-primary;
118
+ }
119
+
120
+ &:focus-visible {
121
+ outline: 2px solid $evo-primary-focus;
122
+ outline-offset: 2px;
123
+ }
124
+ }
125
+
126
+ .topNavItemActive {
127
+ background-color: color-mix(in srgb, $evo-primary-color 12%, transparent);
128
+ color: $evo-primary-color;
129
+
130
+ &:hover {
131
+ background-color: color-mix(in srgb, $evo-primary-color 18%, transparent);
132
+ color: $evo-primary-color;
133
+ }
134
+ }
135
+
136
+ .topNavItemLabel {
137
+ display: inline-block;
138
+ }
139
+
140
+ .topNavIcon {
141
+ display: inline-flex;
142
+ align-items: center;
143
+ justify-content: center;
144
+ flex-shrink: 0;
145
+ width: 1.125rem;
146
+ height: 1.125rem;
147
+ font-size: 1rem;
148
+ }
149
+
150
+ // ---------------------------------------------------------------------------
151
+ // Actions slot
152
+ // ---------------------------------------------------------------------------
153
+
154
+ .topNavActions {
155
+ display: flex;
156
+ align-items: center;
157
+ gap: 0.5rem;
158
+ margin-left: auto;
159
+ flex-shrink: 0;
160
+ }
161
+
162
+ // ---------------------------------------------------------------------------
163
+ // Toggle (hamburger) — hidden above the collapse breakpoint
164
+ // ---------------------------------------------------------------------------
165
+
166
+ .topNavToggle {
167
+ display: none;
168
+ align-items: center;
169
+ justify-content: center;
170
+ width: 2.75rem;
171
+ height: 2.75rem;
172
+ min-width: 2.75rem;
173
+ min-height: 2.75rem;
174
+ margin-left: 0.25rem;
175
+ background: transparent;
176
+ border: none;
177
+ border-radius: $radius-sm;
178
+ color: $color-text-primary;
179
+ cursor: pointer;
180
+ transition: background-color $transition-fast;
181
+
182
+ &:hover {
183
+ background-color: $color-surface-hover;
184
+ }
185
+
186
+ &:focus-visible {
187
+ outline: 2px solid $evo-primary-focus;
188
+ outline-offset: 2px;
189
+ }
190
+ }
191
+
192
+ .toggleIcon {
193
+ display: block;
194
+ }
195
+
196
+ // ---------------------------------------------------------------------------
197
+ // Dropdown
198
+ // ---------------------------------------------------------------------------
199
+
200
+ .topNavDropdown {
201
+ position: relative;
202
+ display: flex;
203
+ align-items: stretch;
204
+ }
205
+
206
+ .topNavDropdownTrigger {
207
+ // inherits .topNavItem styles
208
+ }
209
+
210
+ .topNavDropdownChevron {
211
+ transition: transform $transition-fast;
212
+ margin-left: 0.125rem;
213
+ opacity: 0.7;
214
+ }
215
+
216
+ .topNavDropdownChevronOpen {
217
+ transform: rotate(180deg);
218
+ }
219
+
220
+ .topNavDropdownContent {
221
+ position: absolute;
222
+ top: calc(100% + 0.375rem);
223
+ left: 0;
224
+ min-width: 12rem;
225
+ list-style: none;
226
+ margin: 0;
227
+ padding: 0.375rem;
228
+ background-color: $color-surface-elevated;
229
+ border: 1px solid $color-border;
230
+ border-radius: $radius-md;
231
+ box-shadow: $shadow-lg;
232
+ z-index: 50;
233
+ // Hidden by default — the .topNavDropdownContentOpen modifier flips display
234
+ // to flex. Using display:none here keeps focus + tab order behaviour correct
235
+ // and avoids the [hidden] / display:flex specificity conflict that left the
236
+ // empty panel visible.
237
+ display: none;
238
+ flex-direction: column;
239
+ gap: 0.125rem;
240
+
241
+ > li {
242
+ margin: 0;
243
+ padding: 0;
244
+ list-style: none;
245
+ }
246
+ }
247
+
248
+ .topNavDropdownContentOpen {
249
+ display: flex;
250
+ animation: topNavDropdownFadeIn 140ms ease;
251
+ }
252
+
253
+ .topNavDropdownItem {
254
+ display: flex;
255
+ align-items: center;
256
+ gap: 0.5rem;
257
+ width: 100%;
258
+ padding: 0.5rem 0.625rem;
259
+ min-height: 2rem;
260
+ font-size: $text-sm;
261
+ font-weight: 500;
262
+ color: $color-text-secondary;
263
+ background: transparent;
264
+ border: none;
265
+ border-radius: $radius-sm;
266
+ cursor: pointer;
267
+ white-space: nowrap;
268
+ text-align: left;
269
+ text-decoration: none;
270
+ transition: background-color $transition-fast, color $transition-fast;
271
+ font-family: inherit;
272
+
273
+ &:hover,
274
+ &:focus-visible {
275
+ background-color: $color-surface-hover;
276
+ color: $color-text-primary;
277
+ }
278
+
279
+ &:focus-visible {
280
+ outline: 2px solid $evo-primary-focus;
281
+ outline-offset: 2px;
282
+ }
283
+ }
284
+
285
+ // ---------------------------------------------------------------------------
286
+ // Mobile drawer (≤ collapseBelow breakpoint)
287
+ // ---------------------------------------------------------------------------
288
+
289
+ @media (max-width: 767px) {
290
+ .topNavInner {
291
+ gap: 0.75rem;
292
+ }
293
+
294
+ .topNavToggle {
295
+ display: inline-flex;
296
+ }
297
+
298
+ // Menu becomes the drawer panel (only when a Toggle is registered —
299
+ // see .topNavMenuScroll for the no-Toggle fallback handled above).
300
+ .topNavMenuDrawer {
301
+ position: fixed;
302
+ top: 0;
303
+ right: 0;
304
+ bottom: 0;
305
+ width: min(20rem, 88vw);
306
+ flex-direction: column;
307
+ align-items: stretch;
308
+ gap: 0.25rem;
309
+ padding: 4rem 1rem 1.5rem;
310
+ background-color: $color-surface-elevated;
311
+ border-left: 1px solid $color-border;
312
+ box-shadow: $shadow-2xl;
313
+ overflow-y: auto;
314
+ z-index: 60;
315
+ animation: topNavDrawerSlideIn 220ms ease;
316
+
317
+ // Items in the drawer take the full row and become taller for touch.
318
+ .topNavItem,
319
+ .topNavDropdownTrigger {
320
+ width: 100%;
321
+ justify-content: flex-start;
322
+ min-height: 2.75rem;
323
+ padding: 0.625rem 0.75rem;
324
+ font-size: $text-base;
325
+ }
326
+ }
327
+
328
+ // Drawer closed → keep it mounted (state preserved) but visually hidden
329
+ // and removed from the a11y tree.
330
+ .topNavMenuDrawerClosed {
331
+ transform: translateX(100%);
332
+ pointer-events: none;
333
+ animation: none;
334
+ visibility: hidden;
335
+ }
336
+
337
+ // Dropdowns inside the drawer flatten to an inline expandable section
338
+ // (no floating panel — would clip on mobile).
339
+ .topNavDropdownInDrawer {
340
+ flex-direction: column;
341
+ align-items: stretch;
342
+
343
+ .topNavDropdownContent {
344
+ position: static;
345
+ box-shadow: none;
346
+ border: none;
347
+ background: transparent;
348
+ padding: 0.125rem 0 0.125rem 1rem;
349
+ min-width: 0;
350
+ animation: none;
351
+ }
352
+ }
353
+
354
+ .topNavBackdrop {
355
+ position: fixed;
356
+ inset: 0;
357
+ background-color: $color-backdrop;
358
+ -webkit-backdrop-filter: blur(2px);
359
+ backdrop-filter: blur(2px);
360
+ z-index: 55;
361
+ animation: topNavOverlayFadeIn 180ms ease;
362
+ }
363
+ }
364
+
365
+ // Above the breakpoint, drawer-specific bits never render visually.
366
+ @media (min-width: 768px) {
367
+ .topNavMenuDrawer,
368
+ .topNavMenuDrawerClosed,
369
+ .topNavBackdrop {
370
+ // no-op: structural classes shouldn't leak desktop styles
371
+ }
372
+ }
373
+
374
+ // ---------------------------------------------------------------------------
375
+ // Reduced motion — kill animations
376
+ // ---------------------------------------------------------------------------
377
+
378
+ .topNavReducedMotion {
379
+ .topNavMenuDrawer,
380
+ .topNavDropdownContentOpen,
381
+ .topNavBackdrop {
382
+ animation: none;
383
+ }
384
+
385
+ .topNavDropdownChevron {
386
+ transition: none;
387
+ }
388
+ }
389
+
390
+ @media (prefers-reduced-motion: reduce) {
391
+ .topNavMenuDrawer,
392
+ .topNavDropdownContentOpen,
393
+ .topNavBackdrop {
394
+ animation: none;
395
+ }
396
+ }