nexa-ui-kit 0.11.5 → 0.11.8

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 (95) hide show
  1. package/dist/components/NAlert.js +2 -14
  2. package/dist/components/NAlert.nexa +3 -14
  3. package/dist/components/NAutocomplete.js +1 -1
  4. package/dist/components/NAutocomplete.nexa +2 -1
  5. package/dist/components/NAvatar.js +0 -5
  6. package/dist/components/NAvatar.nexa +1 -5
  7. package/dist/components/NBadge.js +0 -6
  8. package/dist/components/NBadge.nexa +1 -6
  9. package/dist/components/NBottomSheet.js +0 -5
  10. package/dist/components/NBottomSheet.nexa +1 -5
  11. package/dist/components/NButton.js +202 -294
  12. package/dist/components/NButton.nexa +224 -318
  13. package/dist/components/NCard.js +39 -82
  14. package/dist/components/NCard.nexa +27 -71
  15. package/dist/components/NCheckbox.js +77 -60
  16. package/dist/components/NCheckbox.nexa +71 -45
  17. package/dist/components/NChips.nexa +1 -0
  18. package/dist/components/NDataTable.js +1 -313
  19. package/dist/components/NDataTable.nexa +2 -314
  20. package/dist/components/NDatepicker.js +4 -25
  21. package/dist/components/NDatepicker.nexa +5 -25
  22. package/dist/components/NForm.nexa +1 -0
  23. package/dist/components/NFormField.js +0 -5
  24. package/dist/components/NFormField.nexa +1 -5
  25. package/dist/components/NImage.js +1 -6
  26. package/dist/components/NImage.nexa +2 -6
  27. package/dist/components/NInput.js +96 -263
  28. package/dist/components/NInput.nexa +89 -259
  29. package/dist/components/NInputNumber.nexa +1 -1
  30. package/dist/components/NModal.js +1 -118
  31. package/dist/components/NModal.nexa +2 -119
  32. package/dist/components/NMultiSelect.js +1 -1
  33. package/dist/components/NMultiSelect.nexa +2 -1
  34. package/dist/components/NPaginator.js +1 -11
  35. package/dist/components/NPaginator.nexa +2 -11
  36. package/dist/components/NPassword.nexa +1 -0
  37. package/dist/components/NProgressBar.js +0 -11
  38. package/dist/components/NProgressBar.nexa +1 -11
  39. package/dist/components/NRadio.js +1 -8
  40. package/dist/components/NRadio.nexa +2 -8
  41. package/dist/components/NScrollView.js +0 -6
  42. package/dist/components/NScrollView.nexa +1 -6
  43. package/dist/components/NSelect.js +7 -35
  44. package/dist/components/NSelect.nexa +8 -35
  45. package/dist/components/NSkeleton.js +3 -9
  46. package/dist/components/NSkeleton.nexa +4 -9
  47. package/dist/components/NSwitch.js +0 -6
  48. package/dist/components/NSwitch.nexa +1 -6
  49. package/dist/components/NTabs.js +0 -11
  50. package/dist/components/NTabs.nexa +1 -11
  51. package/dist/components/NTag.js +1 -11
  52. package/dist/components/NTag.nexa +2 -11
  53. package/dist/components/NToastContainer.js +3 -27
  54. package/dist/components/NToastContainer.nexa +4 -27
  55. package/dist/components/NTooltip.js +0 -13
  56. package/dist/components/NTooltip.nexa +1 -13
  57. package/dist/components/NTreeMenu.js +1 -21
  58. package/dist/components/NTreeMenu.nexa +2 -21
  59. package/dist/components/NVirtualList.js +0 -2
  60. package/dist/components/NVirtualList.nexa +1 -2
  61. package/dist/styles/tokens.css +82 -173
  62. package/package.json +4 -4
  63. package/src/components/NAlert.nexa +3 -14
  64. package/src/components/NAutocomplete.nexa +2 -1
  65. package/src/components/NAvatar.nexa +1 -5
  66. package/src/components/NBadge.nexa +1 -6
  67. package/src/components/NBottomSheet.nexa +1 -5
  68. package/src/components/NButton.nexa +224 -318
  69. package/src/components/NCard.nexa +27 -71
  70. package/src/components/NCheckbox.nexa +71 -45
  71. package/src/components/NChips.nexa +1 -0
  72. package/src/components/NDataTable.nexa +2 -314
  73. package/src/components/NDatepicker.nexa +5 -25
  74. package/src/components/NForm.nexa +1 -0
  75. package/src/components/NFormField.nexa +1 -5
  76. package/src/components/NImage.nexa +2 -6
  77. package/src/components/NInput.nexa +89 -259
  78. package/src/components/NInputNumber.nexa +1 -1
  79. package/src/components/NModal.nexa +2 -119
  80. package/src/components/NMultiSelect.nexa +2 -1
  81. package/src/components/NPaginator.nexa +2 -11
  82. package/src/components/NPassword.nexa +1 -0
  83. package/src/components/NProgressBar.nexa +1 -11
  84. package/src/components/NRadio.nexa +2 -8
  85. package/src/components/NScrollView.nexa +1 -6
  86. package/src/components/NSelect.nexa +8 -35
  87. package/src/components/NSkeleton.nexa +4 -9
  88. package/src/components/NSwitch.nexa +1 -6
  89. package/src/components/NTabs.nexa +1 -11
  90. package/src/components/NTag.nexa +2 -11
  91. package/src/components/NToastContainer.nexa +4 -27
  92. package/src/components/NTooltip.nexa +1 -13
  93. package/src/components/NTreeMenu.nexa +2 -21
  94. package/src/components/NVirtualList.nexa +1 -2
  95. package/src/styles/tokens.css +82 -173
@@ -1,318 +1,224 @@
1
- <script setup>
2
- import { signal, computed } from 'nexa-framework'
3
-
4
- const props = defineProps({
5
- variant: { type: String, default: 'primary' },
6
- size: { type: String, default: 'md' },
7
- type: { type: String, default: 'button' },
8
- disabled: { type: Boolean, default: false },
9
- loading: { type: Boolean, default: false },
10
- block: { type: Boolean, default: false },
11
- rounded: { type: Boolean, default: false },
12
- loadingText: { type: String, default: '' }
13
- })
14
-
15
- const emit = defineEmits(['click'])
16
-
17
- const ripple = signal([])
18
-
19
- const handleClick = (e) => {
20
- if (props.disabled || props.loading) return
21
- emit('click', e)
22
- const rect = e.currentTarget.getBoundingClientRect()
23
- const x = e.clientX - rect.left
24
- const y = e.clientY - rect.top
25
- const id = Date.now()
26
- ripple.value = [...ripple.value, { id, x, y }]
27
- setTimeout(() => {
28
- ripple.value = ripple.value.filter(r => r.id !== id)
29
- }, 600)
30
- }
31
-
32
- const btnClass = computed(() => {
33
- return [
34
- 'n-btn',
35
- `n-btn-${props.variant}`,
36
- `n-btn-${props.size}`,
37
- props.loading ? 'is-loading' : '',
38
- props.block ? 'is-block' : '',
39
- props.rounded ? 'is-rounded' : ''
40
- ].join(' ')
41
- })
42
- </script>
43
-
44
- <template>
45
- <button
46
- :class="btnClass.value"
47
- :type="type"
48
- :disabled="disabled || loading"
49
- :aria-busy="loading ? 'true' : undefined"
50
- @click="handleClick"
51
- >
52
- <span v-if="loading" class="n-btn-loader"></span>
53
- <span v-if="loading && loadingText" class="n-btn-loading-text">{{ loadingText }}</span>
54
- <span v-if="!loading || (loading && !loadingText)" class="n-btn-content">
55
- <slot />
56
- </span>
57
- <span v-for="r in ripple.value" :key="r.id" class="n-btn-ripple" :style="{ left: r.x + 'px', top: r.y + 'px' }"></span>
58
- </button>
59
- </template>
60
-
61
- <style scoped>
62
- .n-btn {
63
- position: relative;
64
- display: inline-flex;
65
- align-items: center;
66
- justify-content: center;
67
- gap: var(--n-space-2);
68
- font-family: var(--n-font-sans);
69
- font-weight: var(--n-weight-semibold);
70
- letter-spacing: 0.01em;
71
- border-radius: var(--n-radius-md);
72
- cursor: pointer;
73
- transition: all 0.25s cubic-bezier(0.16, 1, 0.3, 1);
74
- border: 1px solid transparent;
75
- outline: none;
76
- white-space: nowrap;
77
- user-select: none;
78
- overflow: hidden;
79
- text-decoration: none;
80
- line-height: var(--n-leading-normal, 1.5);
81
- min-width: fit-content;
82
- will-change: transform;
83
- -webkit-tap-highlight-color: transparent;
84
- }
85
-
86
- .n-btn:focus-visible {
87
- box-shadow: 0 0 0 3px var(--n-color-primary-light), 0 0 0 1px var(--n-color-primary);
88
- }
89
-
90
- /* Sizes */
91
- .n-btn-sm { padding: 0.5rem 1.5rem; font-size: var(--n-text-sm); gap: var(--n-space-1); border-radius: var(--n-radius-sm); min-height: 36px; }
92
- .n-btn-md { padding: 0.75rem 2rem; font-size: var(--n-text-base); min-height: 44px; }
93
- .n-btn-lg { padding: 1rem 2.75rem; font-size: var(--n-text-lg); border-radius: var(--n-radius-lg); min-height: 52px; }
94
-
95
- /* Block */
96
- .is-block { width: 100%; }
97
-
98
- /* Rounded */
99
- .is-rounded { border-radius: var(--n-radius-full); }
100
-
101
- /* Active/Press */
102
- .n-btn:active:not(:disabled) {
103
- transform: scale(0.97);
104
- }
105
-
106
- /* Variant: Primary */
107
- .n-btn-primary {
108
- background: linear-gradient(135deg, var(--n-color-primary) 0%, var(--n-color-primary-hover) 100%);
109
- color: white;
110
- box-shadow: var(--n-shadow-glow-primary);
111
- }
112
- .n-btn-primary:hover:not(:disabled) {
113
- transform: translateY(-2px);
114
- box-shadow: 0 8px 20px -3px var(--n-color-primary-glow);
115
- }
116
- .n-btn-primary:active:not(:disabled) {
117
- box-shadow: var(--n-shadow-glow-primary), inset 0 1px 3px rgba(0,0,0,0.15);
118
- }
119
-
120
- /* Variant: Secondary */
121
- .n-btn-secondary {
122
- background: var(--n-color-surface-alt);
123
- color: var(--n-color-text);
124
- border-color: var(--n-color-border);
125
- }
126
- .n-btn-secondary:hover:not(:disabled) {
127
- background: var(--n-color-surface-hover);
128
- border-color: var(--n-color-border-hover);
129
- transform: translateY(-1px);
130
- }
131
- .n-btn-secondary:active:not(:disabled) {
132
- box-shadow: inset 0 1px 3px rgba(0,0,0,0.08);
133
- }
134
-
135
- /* Variant: Success */
136
- .n-btn-success {
137
- background: linear-gradient(135deg, var(--n-color-success) 0%, var(--n-color-success-hover) 100%);
138
- color: white;
139
- box-shadow: var(--n-shadow-glow-success);
140
- }
141
- .n-btn-success:hover:not(:disabled) {
142
- transform: translateY(-2px);
143
- box-shadow: var(--n-shadow-glow-success);
144
- }
145
- .n-btn-success:active:not(:disabled) {
146
- box-shadow: var(--n-shadow-glow-success), inset 0 1px 3px rgba(0,0,0,0.15);
147
- }
148
-
149
- /* Variant: Warning */
150
- .n-btn-warning {
151
- background: linear-gradient(135deg, var(--n-color-warning) 0%, var(--n-color-warning-hover) 100%);
152
- color: white;
153
- box-shadow: var(--n-shadow-glow-warning);
154
- }
155
- .n-btn-warning:hover:not(:disabled) {
156
- transform: translateY(-2px);
157
- box-shadow: var(--n-shadow-glow-warning);
158
- }
159
- .n-btn-warning:active:not(:disabled) {
160
- box-shadow: var(--n-shadow-glow-warning), inset 0 1px 3px rgba(0,0,0,0.15);
161
- }
162
-
163
- /* Variant: Info */
164
- .n-btn-info {
165
- background: linear-gradient(135deg, var(--n-color-info) 0%, var(--n-color-info-hover) 100%);
166
- color: white;
167
- box-shadow: var(--n-shadow-glow-info);
168
- }
169
- .n-btn-info:hover:not(:disabled) {
170
- transform: translateY(-2px);
171
- box-shadow: var(--n-shadow-glow-info);
172
- }
173
- .n-btn-info:active:not(:disabled) {
174
- box-shadow: var(--n-shadow-glow-info), inset 0 1px 3px rgba(0,0,0,0.15);
175
- }
176
-
177
- /* Variant: Danger */
178
- .n-btn-danger {
179
- background: linear-gradient(135deg, var(--n-color-danger) 0%, var(--n-color-danger-hover) 100%);
180
- color: white;
181
- box-shadow: var(--n-shadow-glow-danger);
182
- }
183
- .n-btn-danger:hover:not(:disabled) {
184
- transform: translateY(-2px);
185
- box-shadow: var(--n-shadow-glow-danger);
186
- }
187
- .n-btn-danger:active:not(:disabled) {
188
- box-shadow: var(--n-shadow-glow-danger), inset 0 1px 3px rgba(0,0,0,0.15);
189
- }
190
-
191
- /* Variant: Ghost */
192
- .n-btn-ghost {
193
- background: transparent;
194
- backdrop-filter: blur(12px);
195
- -webkit-backdrop-filter: blur(12px);
196
- color: var(--n-color-text-secondary);
197
- border-color: transparent;
198
- }
199
- .n-btn-ghost:hover:not(:disabled) {
200
- background: var(--n-color-glass);
201
- backdrop-filter: blur(12px);
202
- -webkit-backdrop-filter: blur(12px);
203
- color: var(--n-color-text);
204
- border-color: var(--n-color-glass-border);
205
- }
206
- .n-btn-ghost:active:not(:disabled) {
207
- background: var(--n-color-glass-hover);
208
- box-shadow: inset 0 1px 3px rgba(0,0,0,0.06);
209
- }
210
-
211
- /* Variant: Outline */
212
- .n-btn-outline {
213
- background: transparent;
214
- color: var(--n-color-primary);
215
- border: 1.5px solid transparent;
216
- background-image: linear-gradient(transparent, transparent), linear-gradient(135deg, var(--n-color-primary), var(--n-color-primary-hover));
217
- background-origin: padding-box, border-box;
218
- background-clip: padding-box, border-box;
219
- }
220
- .n-btn-outline:hover:not(:disabled) {
221
- background-image: linear-gradient(var(--n-color-primary-light), var(--n-color-primary-light)), linear-gradient(135deg, var(--n-color-primary-hover), var(--n-color-primary));
222
- background-origin: padding-box, border-box;
223
- background-clip: padding-box, border-box;
224
- color: var(--n-color-primary-hover);
225
- }
226
- .n-btn-outline:active:not(:disabled) {
227
- box-shadow: inset 0 1px 3px rgba(0,0,0,0.08);
228
- }
229
-
230
- /* Variant: Glass */
231
- .n-btn-glass {
232
- background: var(--n-color-glass);
233
- backdrop-filter: blur(10px);
234
- border-color: var(--n-color-glass-border);
235
- color: var(--n-color-text);
236
- }
237
- .n-btn-glass:hover:not(:disabled) {
238
- background: var(--n-color-glass-hover);
239
- border-color: var(--n-color-border-hover);
240
- }
241
- .n-btn-glass:active:not(:disabled) {
242
- box-shadow: inset 0 1px 3px rgba(0,0,0,0.08);
243
- }
244
-
245
- /* Disabled */
246
- .n-btn:disabled {
247
- cursor: not-allowed;
248
- transform: none !important;
249
- box-shadow: none !important;
250
- pointer-events: none;
251
- opacity: 0.55;
252
- }
253
- .n-btn:disabled::after {
254
- content: '';
255
- position: absolute;
256
- inset: 0;
257
- border-radius: inherit;
258
- background: var(--n-color-surface, #fff);
259
- opacity: 0.3;
260
- pointer-events: none;
261
- }
262
-
263
- /* Loader */
264
- .n-btn-loader {
265
- width: 1rem;
266
- height: 1rem;
267
- border: 2px solid currentColor;
268
- border-right-color: transparent;
269
- border-radius: var(--n-radius-full);
270
- animation: n-spin 0.7s linear infinite;
271
- flex-shrink: 0;
272
- }
273
-
274
- .n-btn-lg .n-btn-loader {
275
- width: 1.25rem;
276
- height: 1.25rem;
277
- border-width: 2.5px;
278
- }
279
-
280
- .n-btn-sm .n-btn-loader {
281
- width: 0.85rem;
282
- height: 0.85rem;
283
- }
284
-
285
- .n-btn-loading-text {
286
- opacity: 0.8;
287
- font-weight: var(--n-weight-normal);
288
- }
289
-
290
- .n-btn-content {
291
- display: inline-flex;
292
- align-items: center;
293
- gap: var(--n-space-2);
294
- }
295
-
296
- @keyframes n-spin {
297
- from { transform: rotate(0deg); }
298
- to { transform: rotate(360deg); }
299
- }
300
-
301
- /* Ripple */
302
- .n-btn-ripple {
303
- position: absolute;
304
- border-radius: var(--n-radius-full);
305
- background: var(--n-color-glass);
306
- width: 20px;
307
- height: 20px;
308
- margin-left: -10px;
309
- margin-top: -10px;
310
- pointer-events: none;
311
- animation: n-ripple 0.6s ease-out forwards;
312
- }
313
-
314
- @keyframes n-ripple {
315
- from { transform: scale(0); opacity: 1; }
316
- to { transform: scale(8); opacity: 0; }
317
- }
318
- </style>
1
+ <script setup>
2
+ import { signal, computed } from 'nexa-framework'
3
+
4
+ const props = defineProps({
5
+ label: { type: String, default: '' },
6
+ variant: { type: String, default: 'primary' },
7
+ size: { type: String, default: 'md' },
8
+ disabled: { type: Boolean, default: false },
9
+ loading: { type: Boolean, default: false },
10
+ icon: { type: String, default: '' },
11
+ iconRight: { type: String, default: '' },
12
+ block: { type: Boolean, default: false },
13
+ rounded: { type: Boolean, default: false },
14
+ outlined: { type: Boolean, default: false }
15
+ })
16
+
17
+ const emit = defineEmits(['click'])
18
+
19
+ const isPressed = signal(false)
20
+
21
+ const handleClick = (e) => {
22
+ if (props.disabled || props.loading) return
23
+ isPressed.value = true
24
+ setTimeout(() => { isPressed.value = false }, 150)
25
+ emit('click', e)
26
+ }
27
+ </script>
28
+
29
+ <template>
30
+ <button
31
+ class="n-btn"
32
+ :class="[
33
+ `n-btn-${variant}`,
34
+ `n-btn-${size}`,
35
+ { 'is-block': block, 'is-rounded': rounded, 'is-outlined': outlined, 'is-pressed': isPressed }
36
+ ]"
37
+ :disabled="disabled || loading"
38
+ @click="handleClick"
39
+ >
40
+ <span v-if="loading" class="n-btn-spinner"></span>
41
+ <span v-if="icon && !loading" class="n-btn-icon">{{ icon }}</span>
42
+ <span v-if="label" class="n-btn-label">{{ label }}</span>
43
+ <span v-if="iconRight" class="n-btn-icon-right">{{ iconRight }}</span>
44
+ <slot />
45
+ </button>
46
+ </template>
47
+
48
+ <style scoped>
49
+ .n-btn {
50
+ display: inline-flex;
51
+ align-items: center;
52
+ justify-content: center;
53
+ gap: 0.5rem;
54
+ font-family: inherit;
55
+ font-weight: 500;
56
+ border: 1px solid transparent;
57
+ cursor: pointer;
58
+ transition: background-color var(--n-transition-fast), border-color var(--n-transition-fast), color var(--n-transition-fast), box-shadow var(--n-transition-fast);
59
+ position: relative;
60
+ overflow: hidden;
61
+ user-select: none;
62
+ }
63
+ .n-btn:disabled {
64
+ opacity: 0.6;
65
+ cursor: not-allowed;
66
+ }
67
+ .n-btn:focus-visible {
68
+ outline: none;
69
+ }
70
+
71
+ /* Sizes */
72
+ .n-btn-sm {
73
+ padding: 0.375rem 0.75rem;
74
+ font-size: var(--n-text-sm);
75
+ border-radius: var(--n-radius-md);
76
+ min-height: 32px;
77
+ }
78
+ .n-btn-md {
79
+ padding: 0.5rem 1rem;
80
+ font-size: var(--n-text-base);
81
+ border-radius: var(--n-radius-md);
82
+ min-height: 40px;
83
+ }
84
+ .n-btn-lg {
85
+ padding: 0.75rem 1.5rem;
86
+ font-size: var(--n-text-lg);
87
+ border-radius: var(--n-radius-lg);
88
+ min-height: 48px;
89
+ }
90
+
91
+ /* Block & Rounded */
92
+ .is-block { width: 100%; }
93
+ .is-rounded { border-radius: var(--n-radius-full); }
94
+
95
+ /* Primary */
96
+ .n-btn-primary {
97
+ background-color: var(--n-color-primary);
98
+ color: var(--n-color-primary-text);
99
+ border-color: var(--n-color-primary);
100
+ }
101
+ .n-btn-primary:hover:not(:disabled) {
102
+ background-color: var(--n-color-primary-hover);
103
+ border-color: var(--n-color-primary-hover);
104
+ }
105
+ .n-btn-primary:active:not(:disabled), .is-pressed.n-btn-primary {
106
+ background-color: var(--n-color-primary-active);
107
+ border-color: var(--n-color-primary-active);
108
+ }
109
+ .n-btn-primary:focus-visible {
110
+ box-shadow: var(--n-ring-primary);
111
+ }
112
+
113
+ /* Secondary */
114
+ .n-btn-secondary {
115
+ background-color: var(--n-color-surface-alt);
116
+ color: var(--n-color-text);
117
+ border-color: var(--n-color-border);
118
+ }
119
+ .n-btn-secondary:hover:not(:disabled) {
120
+ background-color: var(--n-color-surface-hover);
121
+ border-color: var(--n-color-border-hover);
122
+ }
123
+ .n-btn-secondary:active:not(:disabled), .is-pressed.n-btn-secondary {
124
+ background-color: var(--n-color-border);
125
+ }
126
+ .n-btn-secondary:focus-visible {
127
+ box-shadow: var(--n-ring-surface);
128
+ }
129
+
130
+ /* Success */
131
+ .n-btn-success {
132
+ background-color: var(--n-color-success);
133
+ color: #fff;
134
+ border-color: var(--n-color-success);
135
+ }
136
+ .n-btn-success:hover:not(:disabled) {
137
+ background-color: var(--n-color-success-hover);
138
+ border-color: var(--n-color-success-hover);
139
+ }
140
+ .n-btn-success:active:not(:disabled), .is-pressed.n-btn-success {
141
+ background-color: var(--n-color-success-active);
142
+ }
143
+ .n-btn-success:focus-visible { box-shadow: var(--n-ring-success); }
144
+
145
+ /* Danger */
146
+ .n-btn-danger {
147
+ background-color: var(--n-color-danger);
148
+ color: #fff;
149
+ border-color: var(--n-color-danger);
150
+ }
151
+ .n-btn-danger:hover:not(:disabled) {
152
+ background-color: var(--n-color-danger-hover);
153
+ border-color: var(--n-color-danger-hover);
154
+ }
155
+ .n-btn-danger:active:not(:disabled), .is-pressed.n-btn-danger {
156
+ background-color: var(--n-color-danger-active);
157
+ }
158
+ .n-btn-danger:focus-visible { box-shadow: var(--n-ring-danger); }
159
+
160
+ /* Warning */
161
+ .n-btn-warning {
162
+ background-color: var(--n-color-warning);
163
+ color: #fff;
164
+ border-color: var(--n-color-warning);
165
+ }
166
+ .n-btn-warning:hover:not(:disabled) {
167
+ background-color: var(--n-color-warning-hover);
168
+ border-color: var(--n-color-warning-hover);
169
+ }
170
+ .n-btn-warning:active:not(:disabled), .is-pressed.n-btn-warning {
171
+ background-color: var(--n-color-warning-active);
172
+ }
173
+ .n-btn-warning:focus-visible { box-shadow: var(--n-ring-warning); }
174
+
175
+ /* Info */
176
+ .n-btn-info {
177
+ background-color: var(--n-color-info);
178
+ color: #fff;
179
+ border-color: var(--n-color-info);
180
+ }
181
+ .n-btn-info:hover:not(:disabled) {
182
+ background-color: var(--n-color-info-hover);
183
+ border-color: var(--n-color-info-hover);
184
+ }
185
+ .n-btn-info:active:not(:disabled), .is-pressed.n-btn-info {
186
+ background-color: var(--n-color-info-active);
187
+ }
188
+ .n-btn-info:focus-visible { box-shadow: var(--n-ring-info); }
189
+
190
+ /* Outlined variants */
191
+ .is-outlined {
192
+ background-color: transparent !important;
193
+ }
194
+ .is-outlined.n-btn-primary { color: var(--n-color-primary); }
195
+ .is-outlined.n-btn-primary:hover:not(:disabled) { background-color: var(--n-color-primary-light) !important; }
196
+
197
+ .is-outlined.n-btn-success { color: var(--n-color-success); border-color: var(--n-color-success); }
198
+ .is-outlined.n-btn-success:hover:not(:disabled) { background-color: rgba(34, 197, 94, 0.1) !important; }
199
+
200
+ .is-outlined.n-btn-danger { color: var(--n-color-danger); border-color: var(--n-color-danger); }
201
+ .is-outlined.n-btn-danger:hover:not(:disabled) { background-color: rgba(239, 68, 68, 0.1) !important; }
202
+
203
+ /* Spinner */
204
+ .n-btn-spinner {
205
+ width: 16px;
206
+ height: 16px;
207
+ border: 2px solid currentColor;
208
+ border-right-color: transparent;
209
+ border-radius: 50%;
210
+ animation: n-spin 0.6s linear infinite;
211
+ }
212
+ @keyframes n-spin {
213
+ to { transform: rotate(360deg); }
214
+ }
215
+
216
+ .n-btn-icon, .n-btn-icon-right {
217
+ display: flex;
218
+ align-items: center;
219
+ justify-content: center;
220
+ }
221
+ .n-btn-label {
222
+ line-height: 1;
223
+ }
224
+ </style>