nexa-ui-kit 0.11.6 → 0.11.9

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 +219 -296
  12. package/dist/components/NButton.nexa +241 -320
  13. package/dist/components/NCard.js +39 -82
  14. package/dist/components/NCard.nexa +27 -71
  15. package/dist/components/NCheckbox.js +74 -63
  16. package/dist/components/NCheckbox.nexa +64 -44
  17. package/dist/components/NChips.nexa +1 -0
  18. package/dist/components/NDataTable.js +300 -356
  19. package/dist/components/NDataTable.nexa +265 -320
  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 +5 -5
  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 +241 -320
  69. package/src/components/NCard.nexa +27 -71
  70. package/src/components/NCheckbox.nexa +64 -44
  71. package/src/components/NChips.nexa +1 -0
  72. package/src/components/NDataTable.nexa +265 -320
  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,5 +1,5 @@
1
1
  <script setup>
2
- import { signal, computed, inject, effect } from 'nexa-framework'
2
+ import { signal, computed } from 'nexa-framework'
3
3
 
4
4
  const props = defineProps({
5
5
  modelValue: { type: [String, Number], default: '' },
@@ -7,327 +7,157 @@ const props = defineProps({
7
7
  placeholder: { type: String, default: '' },
8
8
  label: { type: String, default: '' },
9
9
  error: { type: String, default: '' },
10
- id: { type: String, default: '' },
11
- name: { type: String, default: '' },
12
- autocomplete: { type: String, default: '' },
13
- ariaDescribedby: { type: String, default: '' },
14
- ariaInvalid: { type: [Boolean, String], default: false },
15
- bindField: { type: Boolean, default: false },
16
10
  disabled: { type: Boolean, default: false },
17
11
  readonly: { type: Boolean, default: false },
12
+ required: { type: Boolean, default: false },
18
13
  clearable: { type: Boolean, default: false },
19
- maxlength: { type: Number, default: 0 },
20
- prefixIcon: { type: String, default: '' },
21
- suffixIcon: { type: String, default: '' }
14
+ prefix: { type: String, default: '' },
15
+ suffix: { type: String, default: '' }
22
16
  })
23
17
 
24
- const emit = defineEmits(['update:modelValue', 'clear', 'focus', 'blur'])
18
+ const emit = defineEmits(['update:modelValue', 'focus', 'blur', 'clear'])
25
19
 
26
- const field = inject('nexa-ui:form-field', undefined)
27
-
28
- const showPassword = signal(false)
29
20
  const isFocused = signal(false)
30
21
 
31
- const effectiveValue = computed(() => {
32
- if (props.bindField && field?.value) return field.value.value
33
- return props.modelValue
34
- })
35
-
36
- const draft = signal(String(effectiveValue.value ?? ''))
37
-
38
- effect(() => {
39
- const next = String(effectiveValue.value ?? '')
40
- if (draft.value === next) return
41
- draft.value = next
42
- })
43
-
44
- const effectiveId = computed(() => {
45
- if (props.id) return props.id
46
- if (props.bindField && field?.inputId) return field.inputId.value
47
- return ''
48
- })
49
-
50
- const effectiveDescribedBy = computed(() => {
51
- if (props.ariaDescribedby) return props.ariaDescribedby
52
- if (props.bindField && field?.describedBy) return field.describedBy.value || ''
53
- return ''
54
- })
55
-
56
- const effectiveInvalid = computed(() => {
57
- if (props.bindField && field?.invalid) return field.invalid.value
58
- return props.ariaInvalid
59
- })
60
-
61
- const effectiveError = computed(() => {
62
- if (props.error) return props.error
63
- if (props.bindField && field?.error) return field.error.value || ''
64
- return ''
65
- })
66
-
67
- const effectiveDisabled = computed(() => {
68
- if (props.disabled) return true
69
- if (props.bindField && field?.disabled) return !!field.disabled.value
70
- return false
71
- })
72
-
73
- const inputType = computed(() => {
74
- if (props.type === 'password' && showPassword.value) return 'text'
75
- return props.type
76
- })
77
-
78
- const currentLength = computed(() => draft.value.length)
79
-
80
- const onInput = (e) => {
81
- const next = e.target.value
82
- if (draft.value !== next) draft.value = next
83
- if (props.bindField && field?.setValue) {
84
- field.setValue(next)
85
- return
86
- }
87
- emit('update:modelValue', next)
22
+ const handleInput = (e) => {
23
+ emit('update:modelValue', e.target.value)
88
24
  }
89
25
 
90
- const onFocus = () => {
26
+ const handleFocus = (e) => {
91
27
  isFocused.value = true
92
- emit('focus')
28
+ emit('focus', e)
93
29
  }
94
30
 
95
- const onBlur = () => {
31
+ const handleBlur = (e) => {
96
32
  isFocused.value = false
97
- if (props.bindField && field?.onBlur) {
98
- field.onBlur()
99
- }
100
- emit('blur')
33
+ emit('blur', e)
101
34
  }
102
35
 
103
- const clear = () => {
104
- if (draft.value) draft.value = ''
105
- if (props.bindField && field?.setValue) {
106
- field.setValue('')
107
- emit('clear')
108
- return
109
- }
36
+ const handleClear = () => {
110
37
  emit('update:modelValue', '')
111
38
  emit('clear')
112
39
  }
113
-
114
- const togglePassword = () => {
115
- showPassword.value = !showPassword.value
116
- }
117
40
  </script>
118
41
 
119
42
  <template>
120
- <div class="n-input-group">
121
- <label v-if="label" class="n-input-label">{{ label }}</label>
122
- <div class="n-input-wrapper" :class="{ 'is-focused': isFocused.value, 'has-error': effectiveError.value, 'is-disabled': effectiveDisabled.value }">
123
- <span v-if="prefixIcon" class="n-input-icon is-prefix">{{ prefixIcon }}</span>
43
+ <div class="n-input-wrapper" :class="{ 'is-focused': isFocused, 'is-error': error, 'is-disabled': disabled }">
44
+ <label v-if="label" class="n-input-label">
45
+ {{ label }}
46
+ <span v-if="required" class="n-input-required">*</span>
47
+ </label>
48
+ <div class="n-input-container">
49
+ <span v-if="prefix" class="n-input-prefix">{{ prefix }}</span>
124
50
  <input
125
- :id="effectiveId.value || undefined"
126
- :name="name || undefined"
127
- :type="inputType.value"
128
- :value="draft.value"
51
+ :type="type"
52
+ :value="modelValue"
129
53
  :placeholder="placeholder"
130
- :disabled="effectiveDisabled.value"
54
+ :disabled="disabled"
131
55
  :readonly="readonly"
132
- :autocomplete="autocomplete || undefined"
133
- :aria-describedby="effectiveDescribedBy.value || undefined"
134
- :aria-invalid="effectiveInvalid.value || undefined"
135
- :maxlength="maxlength || undefined"
56
+ :required="required"
136
57
  class="n-input"
137
- :class="{ 'has-prefix': !!prefixIcon, 'has-suffix': !!suffixIcon || clearable || type === 'password' }"
138
- @input="onInput"
139
- @focus="onFocus"
140
- @blur="onBlur"
58
+ @input="handleInput"
59
+ @focus="handleFocus"
60
+ @blur="handleBlur"
141
61
  />
142
- <div class="n-input-focus-ring"></div>
143
- <div class="n-input-actions">
144
- <button v-if="clearable && draft.value" class="n-input-action" @click="clear" tabindex="-1" type="button" aria-label="Clear"><svg viewBox="0 0 24 24" width="14" height="14" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" focusable="false" aria-hidden="true"><path d="M18 6L6 18"/><path d="M6 6l12 12"/></svg></button>
145
- <button v-if="type === 'password'" class="n-input-action" @click="togglePassword" tabindex="-1" type="button" :aria-label="showPassword.value ? 'Hide password' : 'Show password'">
146
- <svg v-if="!showPassword.value" viewBox="0 0 24 24" width="16" height="16" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" focusable="false" aria-hidden="true"><path d="M1 12s4-8 11-8 11 8 11 8-4 8-11 8-11-8-11-8z"/><circle cx="12" cy="12" r="3"/></svg>
147
- <svg v-else viewBox="0 0 24 24" width="16" height="16" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" focusable="false" aria-hidden="true"><path d="M1 12s4-8 11-8 11 8 11 8-4 8-11 8-11-8-11-8z"/><circle cx="12" cy="12" r="3"/><path d="M23 1L1 23"/></svg>
148
- </button>
149
- <span v-if="suffixIcon" class="n-input-icon is-suffix">{{ suffixIcon }}</span>
150
- </div>
151
- </div>
152
- <div class="n-input-bottom">
153
- <span v-if="effectiveError.value" class="n-input-error-msg">{{ effectiveError.value }}</span>
154
- <span v-if="maxlength > 0" class="n-input-counter">{{ currentLength.value }}/{{ maxlength }}</span>
62
+ <button v-if="clearable && modelValue" class="n-input-clear" @click="handleClear" type="button">
63
+ <svg viewBox="0 0 24 24" width="16" height="16" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round">
64
+ <line x1="18" y1="6" x2="6" y2="18"/>
65
+ <line x1="6" y1="6" x2="18" y2="18"/>
66
+ </svg>
67
+ </button>
68
+ <span v-if="suffix" class="n-input-suffix">{{ suffix }}</span>
155
69
  </div>
70
+ <span v-if="error" class="n-input-error">{{ error }}</span>
156
71
  </div>
157
72
  </template>
158
73
 
159
74
  <style scoped>
160
- .n-input-group {
75
+ .n-input-wrapper {
161
76
  display: flex;
162
77
  flex-direction: column;
163
- gap: var(--n-space-2);
78
+ gap: 0.5rem;
164
79
  width: 100%;
165
80
  }
166
-
167
81
  .n-input-label {
168
- font-size: var(--n-text-sm);
169
- font-weight: var(--n-weight-medium);
170
- color: var(--n-color-text-secondary);
171
- margin-left: var(--n-space-1);
172
- letter-spacing: 0.01em;
82
+ font-size: 0.875rem;
83
+ font-weight: 500;
84
+ color: var(--n-color-text);
85
+ letter-spacing: normal;
173
86
  }
174
-
175
- .n-input-wrapper {
87
+ .n-input-required {
88
+ color: var(--n-color-danger);
89
+ margin-left: 0.25rem;
90
+ }
91
+ .n-input-container {
176
92
  position: relative;
177
93
  display: flex;
178
94
  align-items: center;
179
- transition: all var(--n-transition-fast);
180
- }
181
-
182
- .n-input {
183
- position: relative;
184
- z-index: 1;
185
- width: 100%;
186
- min-height: 44px;
187
- background: var(--n-color-bg);
95
+ background-color: var(--n-color-surface);
188
96
  border: 1px solid var(--n-color-border);
189
- color: var(--n-color-text);
190
- padding: 0.75rem 1.125rem;
191
97
  border-radius: var(--n-radius-md);
192
- font-family: inherit;
193
- font-size: var(--n-text-base);
194
- line-height: 1.2;
195
- box-sizing: border-box;
196
- transition: all var(--n-transition-normal) cubic-bezier(0.16, 1, 0.3, 1);
197
- outline: none;
198
- caret-color: var(--n-color-primary);
199
- -webkit-font-smoothing: antialiased;
200
- -moz-osx-font-smoothing: grayscale;
201
- }
202
-
203
- .n-input.has-prefix {
204
- padding-left: 2.5rem;
205
- }
206
-
207
- .n-input.has-suffix {
208
- padding-right: 2.5rem;
209
- }
210
-
211
- .n-input::placeholder {
212
- color: var(--n-color-text-muted);
98
+ transition: background-color var(--n-transition-fast), border-color var(--n-transition-fast), color var(--n-transition-fast), box-shadow var(--n-transition-fast);
213
99
  }
214
-
215
- .n-input-focus-ring {
216
- position: absolute;
217
- inset: 0;
218
- border-radius: var(--n-radius-md);
219
- background: linear-gradient(135deg, var(--n-color-primary), var(--n-color-info));
220
- opacity: 0;
221
- pointer-events: none;
222
- transition: opacity var(--n-transition-normal) cubic-bezier(0.16, 1, 0.3, 1);
223
- z-index: 0;
100
+ .n-input-container:hover {
101
+ border-color: var(--n-color-border-hover);
224
102
  }
225
-
226
- .is-focused .n-input-focus-ring {
227
- opacity: 0.15;
228
- }
229
-
230
- .is-focused .n-input {
103
+ .is-focused .n-input-container {
231
104
  border-color: var(--n-color-primary);
232
- background: var(--n-color-surface);
233
- box-shadow:
234
- 0 0 0 3px var(--n-color-primary-light),
235
- 0 0 0 1px var(--n-color-primary),
236
- inset 0 1px 3px rgba(0,0,0,0.04);
105
+ box-shadow: var(--n-ring-primary);
237
106
  }
238
-
239
- .has-error .n-input {
107
+ .is-error .n-input-container {
240
108
  border-color: var(--n-color-danger);
241
109
  }
242
-
243
- .has-error .n-input-focus-ring {
244
- background: var(--n-color-danger);
245
- opacity: 0.35;
110
+ .is-error.is-focused .n-input-container {
111
+ box-shadow: var(--n-ring-danger);
246
112
  }
247
-
248
- .n-input-icon {
249
- position: absolute;
250
- top: 50%;
251
- transform: translateY(-50%);
252
- color: var(--n-color-text-muted);
253
- font-size: var(--n-text-sm);
254
- pointer-events: none;
255
- display: flex;
256
- align-items: center;
257
- line-height: 1;
113
+ .is-disabled .n-input-container {
114
+ opacity: 0.6;
115
+ cursor: not-allowed;
116
+ background-color: var(--n-color-surface-alt);
258
117
  }
259
-
260
- .n-input-icon.is-prefix {
261
- left: 0.85rem;
118
+ .n-input {
119
+ flex: 1;
120
+ background: transparent;
121
+ border: none;
122
+ outline: none;
123
+ padding: 0.5rem 0.75rem;
124
+ font-size: 0.875rem;
125
+ color: var(--n-color-text);
126
+ font-family: inherit;
127
+ width: 100%;
262
128
  }
263
-
264
- .n-input-icon.is-suffix {
265
- right: 0.85rem;
129
+ .n-input::placeholder {
130
+ color: var(--n-color-text-muted);
266
131
  }
267
-
268
- .n-input-actions {
269
- position: absolute;
270
- right: 0.5rem;
271
- top: 50%;
272
- transform: translateY(-50%);
273
- display: flex;
274
- align-items: center;
275
- gap: 0.15rem;
132
+ .n-input:disabled {
133
+ cursor: not-allowed;
276
134
  }
277
-
278
- .n-input-action {
135
+ .n-input-prefix,
136
+ .n-input-suffix {
137
+ padding: 0 0.75rem;
138
+ color: var(--n-color-text-muted);
139
+ font-size: 0.875rem;
140
+ user-select: none;
141
+ }
142
+ .n-input-clear {
279
143
  background: transparent;
280
144
  border: none;
281
- color: var(--n-color-text-muted);
282
145
  cursor: pointer;
283
- padding: 0.25rem;
284
- font-size: var(--n-text-sm);
285
- border-radius: var(--n-radius-sm);
286
- transition: all var(--n-transition-fast);
146
+ padding: 0.5rem;
147
+ color: var(--n-color-text-muted);
148
+ transition: color var(--n-transition-fast);
287
149
  display: flex;
288
150
  align-items: center;
289
- line-height: 1;
151
+ justify-content: center;
290
152
  }
291
-
292
- .n-input-action:hover {
153
+ .n-input-clear:hover {
293
154
  color: var(--n-color-text);
294
- background: var(--n-color-glass);
295
155
  }
296
-
297
- .n-input-bottom {
156
+ .n-input-error {
157
+ font-size: 0.75rem;
158
+ color: var(--n-color-danger);
298
159
  display: flex;
299
- justify-content: space-between;
300
160
  align-items: center;
301
- padding: 0 var(--n-space-1);
302
- }
303
-
304
- .n-input-error-msg {
305
- font-size: var(--n-text-xs);
306
- color: var(--n-color-danger);
307
- }
308
-
309
- .n-input-counter {
310
- font-size: var(--n-text-xs);
311
- color: var(--n-color-text-muted);
312
- margin-left: auto;
313
- }
314
-
315
- .is-disabled {
316
- position: relative;
317
- }
318
-
319
- .is-disabled::after {
320
- content: '';
321
- position: absolute;
322
- inset: 0;
323
- background: var(--n-color-glass);
324
- border-radius: var(--n-radius-md);
325
- pointer-events: none;
326
- z-index: 2;
327
- }
328
-
329
- .is-disabled .n-input {
330
- cursor: not-allowed;
331
- background: var(--n-color-surface-alt);
161
+ gap: 0.25rem;
332
162
  }
333
163
  </style>
@@ -227,6 +227,6 @@ const onFocus = () => {
227
227
  </div>
228
228
  </template>
229
229
 
230
- <style scoped>
230
+ <style scoped>
231
231
  .n-inum{display:flex;flex-direction:column;gap:var(--n-space-2);width:100%;font-family:var(--n-font-sans)}.n-inum-label{display:block;font-size:var(--n-text-sm);font-weight:var(--n-weight-medium);color:var(--n-color-text-secondary);margin-bottom:var(--n-space-2)}.n-inum-wrap{display:flex;align-items:stretch;min-height:44px;background:var(--n-color-surface);border:1px solid var(--n-color-border);border-radius:var(--n-radius-md);overflow:hidden;transition:all var(--n-transition-fast)}.n-inum-wrap:focus-within{border-color:var(--n-color-primary);box-shadow:0 0 0 3px var(--n-color-primary-light)}.n-inum-input{flex:1;background:transparent;border:none;outline:none;padding:0.75rem 0.75rem;color:var(--n-color-text);font-size:var(--n-text-base);font-family:inherit;text-align:center;line-height:1.2;box-sizing:border-box}.n-inum-btn{width:2.5rem;background:transparent;border:none;color:var(--n-color-text-muted);cursor:pointer;display:flex;align-items:center;justify-content:center;font-size:var(--n-text-base);transition:all var(--n-transition-fast)}.n-inum-btn:hover:not(:disabled){background:var(--n-color-glass);color:var(--n-color-text)}.n-inum-btn:disabled{opacity:0.5;cursor:not-allowed}.is-disabled{opacity:0.6;cursor:not-allowed;background:var(--n-color-surface-alt)}
232
232
  </style>
@@ -127,122 +127,5 @@ _sfc_main.__hmrId = 'NModal_nexa'
127
127
 
128
128
  export default _sfc_main
129
129
 
130
- const __style = `.n-modal-root[data-v-46af727f]{
131
- position: fixed;
132
- top: 0;
133
- left: 0;
134
- width: 100vw;
135
- height: 100vh;
136
- display: flex;
137
- align-items: center;
138
- justify-content: center;
139
- z-index: var(--n-z-modal);
140
- }
141
-
142
- .n-modal-overlay[data-v-46af727f]{
143
- position: absolute;
144
- top: 0;
145
- left: 0;
146
- width: 100%;
147
- height: 100%;
148
- background: var(--n-color-overlay);
149
- backdrop-filter: blur(8px);
150
- opacity: 0;
151
- transition: opacity 0.4s cubic-bezier(0.16, 1, 0.3, 1);
152
- }
153
-
154
- .n-modal-overlay.is-active[data-v-46af727f]{
155
- opacity: 1;
156
- }
157
-
158
- .n-modal-container[data-v-46af727f]{
159
- position: relative;
160
- width: 90%;
161
- background: var(--n-color-surface);
162
- backdrop-filter: blur(20px);
163
- -webkit-backdrop-filter: blur(20px);
164
- border: 1px solid var(--n-color-glass-border);
165
- border-radius: var(--n-radius-2xl);
166
- box-shadow: var(--n-shadow-xl), var(--n-shadow-glow-primary), 0 0 0 1px var(--n-color-glass-border);
167
- transform: scale(0.9) translateY(20px);
168
- opacity: 0;
169
- transition: opacity 0.3s cubic-bezier(0.16, 1, 0.3, 1), transform 0.5s cubic-bezier(0.34, 1.56, 0.64, 1);
170
- overflow: hidden;
171
- outline: none;
172
- max-height: 85vh;
173
- display: flex;
174
- flex-direction: column;
175
- }
176
-
177
- .n-modal-container.is-active[data-v-46af727f]{
178
- transform: scale(1) translateY(0);
179
- opacity: 1;
180
- }
181
-
182
- .n-modal-header[data-v-46af727f]{
183
- padding: var(--n-space-6) var(--n-space-8);
184
- border-bottom: 1px solid var(--n-color-border);
185
- display: flex;
186
- justify-content: space-between;
187
- align-items: center;
188
- flex-shrink: 0;
189
- }
190
-
191
- .n-modal-header h3[data-v-46af727f]{
192
- margin: 0;
193
- font-size: var(--n-text-xl);
194
- font-weight: var(--n-weight-bold);
195
- color: var(--n-color-text);
196
- }
197
-
198
- .n-modal-close[data-v-46af727f]{
199
- background: transparent;
200
- border: none;
201
- color: var(--n-color-text-secondary);
202
- font-size: 1.75rem;
203
- cursor: pointer;
204
- transition: all 0.2s cubic-bezier(0.34, 1.56, 0.64, 1);
205
- padding: 0;
206
- line-height: 1;
207
- width: 44px;
208
- height: 44px;
209
- display: flex;
210
- align-items: center;
211
- justify-content: center;
212
- border-radius: var(--n-radius-lg);
213
- flex-shrink: 0;
214
- }
215
-
216
- .n-modal-close[data-v-46af727f]:hover{
217
- color: var(--n-color-text);
218
- background: var(--n-color-glass-hover);
219
- transform: scale(1.1);
220
- }
221
-
222
- .n-modal-close[data-v-46af727f]:active{
223
- transform: scale(0.95);
224
- }
225
-
226
- .n-modal-close[data-v-46af727f]:focus-visible{
227
- outline: 2px solid var(--n-color-primary);
228
- outline-offset: 2px;
229
- }
230
-
231
- .n-modal-content[data-v-46af727f]{
232
- padding: var(--n-space-8);
233
- color: var(--n-color-text-secondary);
234
- overflow-y: auto;
235
- overflow-x: hidden;
236
- flex: 1;
237
- }
238
-
239
- .n-modal-footer[data-v-46af727f]{
240
- padding: var(--n-space-5) var(--n-space-8);
241
- background: var(--n-color-glass);
242
- border-top: 1px solid var(--n-color-border);
243
- display: flex;
244
- justify-content: flex-end;
245
- gap: var(--n-space-4);
246
- flex-shrink: 0;
247
- }`
130
+ const __style = `.n-modal-root[data-v-46af727f]{
248
131
  position: fixed;
249
132
  top: 0;
250
133
  left: 0;
251
134
  width: 100vw;
252
135
  height: 100vh;
253
136
  display: flex;
254
137
  align-items: center;
255
138
  justify-content: center;
256
139
  z-index: var(--n-z-modal);
257
140
  position: absolute;
258
141
  top: 0;
259
142
  left: 0;
260
143
  width: 100%;
261
144
  height: 100%;
262
145
  background: var(--n-color-overlay);
263
146
  backdrop-filter: blur(8px);
264
147
  opacity: 0;
265
148
  transition: opacity 0.4s cubic-bezier(0.16, 1, 0.3, 1);
266
149
  opacity: 1;
267
150
  position: relative;
268
151
  width: 90%;
269
152
  background: var(--n-color-surface);
270
153
  backdrop-filter: blur(20px);
271
154
  -webkit-backdrop-filter: blur(20px);
272
155
  border: 1px solid var(--n-color-glass-border);
273
156
  border-radius: var(--n-radius-2xl);
274
157
  box-shadow: var(--n-shadow-xl), var(--n-shadow-glow-primary), 0 0 0 1px var(--n-color-glass-border);
275
158
  transform: scale(0.9) translateY(20px);
276
159
  opacity: 0;
277
160
  transition: opacity 0.3s cubic-bezier(0.16, 1, 0.3, 1), transform 0.5s cubic-bezier(0.34, 1.56, 0.64, 1);
278
161
  overflow: hidden;
279
162
  outline: none;
280
163
  max-height: 85vh;
281
164
  display: flex;
282
165
  flex-direction: column;
283
166
  transform: scale(1) translateY(0);
284
167
  opacity: 1;
285
168
  padding: var(--n-space-6) var(--n-space-8);
286
169
  border-bottom: 1px solid var(--n-color-border);
287
170
  display: flex;
288
171
  justify-content: space-between;
289
172
  align-items: center;
290
173
  flex-shrink: 0;
291
174
  margin: 0;
292
175
  font-size: var(--n-text-xl);
293
176
  font-weight: var(--n-weight-bold);
294
177
  color: var(--n-color-text);
295
178
  background: transparent;
296
179
  border: none;
297
180
  color: var(--n-color-text-secondary);
298
181
  font-size: 1.75rem;
299
182
  cursor: pointer;
300
183
  transition: color var(--n-transition-fast) cubic-bezier(0.34, 1.56, 0.64, 1);
301
184
  padding: 0;
302
185
  line-height: 1;
303
186
  width: 44px;
304
187
  height: 44px;
305
188
  display: flex;
306
189
  align-items: center;
307
190
  justify-content: center;
308
191
  border-radius: var(--n-radius-lg);
309
192
  flex-shrink: 0;
310
193
  color: var(--n-color-text);
311
194
  background: var(--n-color-glass-hover);
312
195
  transform: scale(0.95);
313
196
  outline: 2px solid var(--n-color-primary);
314
197
  outline-offset: 2px;
315
198
  padding: var(--n-space-8);
316
199
  color: var(--n-color-text-secondary);
317
200
  overflow-y: auto;
318
201
  overflow-x: hidden;
319
202
  flex: 1;
320
203
  padding: var(--n-space-5) var(--n-space-8);
321
204
  background: var(--n-color-glass);
322
205
  border-top: 1px solid var(--n-color-border);
323
206
  display: flex;
324
207
  justify-content: flex-end;
325
208
  gap: var(--n-space-4);
326
209
  flex-shrink: 0;
327
210
  injectStyle('data-v-46af727f', __style)