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,16 +1,14 @@
1
1
  import { h, hText, effect, defineComponent, registerComponent, reloadComponent, injectStyle } from 'nexa-framework'
2
2
 
3
3
  const _sfc_main = defineComponent({
4
- __scopeId: 'data-v-28bb4c76',
4
+ __scopeId: 'data-v-51ea59b6',
5
5
  __hmrId: 'NCard_nexa',
6
6
  props: {
7
7
  title: { type: String, default: '' },
8
8
  subtitle: { type: String, default: '' },
9
- padding: { type: Boolean, default: true },
10
- compact: { type: Boolean, default: false },
9
+ elevated: { type: Boolean, default: true },
11
10
  hoverable: { type: Boolean, default: false },
12
- variant: { type: String, default: 'elevated' },
13
- image: { type: String, default: '' }
11
+ bordered: { type: Boolean, default: false }
14
12
  },
15
13
  setup(props, setupContext) {
16
14
  const { emit, slots, slots: $slots } = setupContext
@@ -19,113 +17,72 @@ const _sfc_main = defineComponent({
19
17
  })
20
18
  // Injected render function
21
19
  _sfc_main.render = function(ctx) {
22
- let { $slots, title, subtitle, padding, compact, hoverable, variant, image, Fragment: _ntc_Fragment } = ctx
23
- return h('div', { class: ['n-card', `is-${variant}`, hoverable ? 'is-hoverable' : '', compact ? 'is-compact' : ''], "data-v-28bb4c76": "" }, [
20
+ let { $slots, title, subtitle, elevated, hoverable, bordered, Fragment: _ntc_Fragment } = ctx
21
+ return h('div', { class: ["n-card", { 'is-elevated': elevated, 'is-hoverable': hoverable, 'is-bordered': bordered }], "data-v-51ea59b6": "" }, [
24
22
  "\n ",
25
- (image) ? h('img', { class: "n-card-image", src: image, "data-v-28bb4c76": "" }) : null,
26
- (title || $slots.header) ? h('div', { class: "n-card-header", "data-v-28bb4c76": "" }, [
23
+ (title || subtitle) ? h('div', { class: "n-card-header", "data-v-51ea59b6": "" }, [
27
24
  "\n ",
28
- ctx.$slots.header ? ctx.$slots.header() : ["\n ", h('h3', { class: "n-card-title" }, [
25
+ (title) ? h('h3', { class: "n-card-title", "data-v-51ea59b6": "" }, [
29
26
  title
30
- ]), "\n ", h('p', { class: "n-card-subtitle" }, [
27
+ ]) : null,
28
+ (subtitle) ? h('p', { class: "n-card-subtitle", "data-v-51ea59b6": "" }, [
31
29
  subtitle
32
- ]), "\n "],
33
- "\n "
30
+ ]) : null
34
31
  ]) : null,
35
- h('div', { class: ['n-card-body', padding ? 'has-padding' : ''], "data-v-28bb4c76": "" }, [
32
+ h('div', { class: "n-card-body", "data-v-51ea59b6": "" }, [
36
33
  "\n ",
37
34
  ctx.$slots.default ? ctx.$slots.default() : null,
38
35
  "\n "
39
36
  ]),
40
37
  "\n ",
41
- ($slots.footer) ? h('div', { class: "n-card-footer", "data-v-28bb4c76": "" }, [
38
+ ($slots.footer) ? h('div', { class: "n-card-footer", "data-v-51ea59b6": "" }, [
42
39
  "\n ",
43
40
  ctx.$slots.footer ? ctx.$slots.footer() : null,
44
41
  "\n "
45
42
  ]) : null
46
43
  ])
47
44
  }
48
- _sfc_main.__scopeId = 'data-v-28bb4c76'
45
+ _sfc_main.__scopeId = 'data-v-51ea59b6'
49
46
  _sfc_main.__hmrId = 'NCard_nexa'
50
47
 
51
48
  export default _sfc_main
52
49
 
53
- const __style = `.n-card[data-v-28bb4c76]{
54
- background: var(--n-color-surface);
55
- border: 1px solid var(--n-color-border);
50
+ const __style = `.n-card[data-v-51ea59b6]{
51
+ background-color: var(--n-color-surface);
56
52
  border-radius: var(--n-radius-lg);
57
53
  overflow: hidden;
58
54
  transition: all 0.3s cubic-bezier(0.16, 1, 0.3, 1);
59
- display: flex;
60
- flex-direction: column;
61
- will-change: transform, box-shadow;
55
+ position: relative;
62
56
  }
63
-
64
- .is-elevated[data-v-28bb4c76]{
65
- background: var(--n-color-surface-elevated);
66
- box-shadow: var(--n-shadow-md);
57
+ .is-elevated[data-v-51ea59b6]{
67
58
  }
68
-
69
- .is-outlined[data-v-28bb4c76]{
70
- background: transparent;
71
- border-color: var(--n-color-border);
72
- box-shadow: none;
59
+ .is-bordered[data-v-51ea59b6]{
60
+ border: 1px solid #334155;
73
61
  }
74
-
75
- .is-flat[data-v-28bb4c76]{
76
- background: var(--n-color-surface-alt);
77
- border: none;
78
- box-shadow: none;
62
+ .is-hoverable[data-v-51ea59b6]:hover{
79
63
  }
80
-
81
- .n-card.is-hoverable[data-v-28bb4c76]:hover{
82
- transform: translateY(-2px);
83
- border-color: var(--n-color-border-hover);
84
- box-shadow: var(--n-shadow-lg);
85
- }
86
-
87
- .n-card-image[data-v-28bb4c76]{
88
- width: 100%;
89
- height: 200px;
90
- object-fit: cover;
91
- display: block;
92
- }
93
-
94
- .n-card-header[data-v-28bb4c76]{
95
- padding: var(--n-space-6);
96
- border-bottom: 1px solid var(--n-color-border);
64
+ .n-card-header[data-v-51ea59b6]{
65
+ padding: 1.5rem 1.5rem 1rem 1.5rem;
66
+ border-bottom: 1px solid #334155;
97
67
  }
98
-
99
- .is-compact .n-card-header[data-v-28bb4c76]{
100
- padding: var(--n-space-4);
101
- }
102
-
103
- .is-compact .n-card-body.has-padding{
104
- padding: var(--n-space-4);
105
- }
106
-
107
- .n-card-title[data-v-28bb4c76]{
108
- margin: 0;
109
- font-size: var(--n-text-xl);
110
- font-weight: var(--n-weight-bold);
68
+ .n-card-title[data-v-51ea59b6]{
69
+ font-size: 1.25rem;
70
+ font-weight: 700;
111
71
  color: var(--n-color-text);
112
- letter-spacing: var(--n-tracking-tight);
72
+ margin: 0 0 0.25rem 0;
73
+ letter-spacing: -0.01em;
113
74
  }
114
-
115
- .n-card-subtitle[data-v-28bb4c76]{
116
- margin: var(--n-space-1) 0 0 0;
117
- font-size: var(--n-text-sm);
118
- color: var(--n-color-text-secondary);
75
+ .n-card-subtitle[data-v-51ea59b6]{
76
+ font-size: 0.875rem;
77
+ color: var(--n-color-text-muted);
78
+ margin: 0;
119
79
  }
120
-
121
- .n-card-body.has-padding{
122
- padding: var(--n-space-6);
80
+ .n-card-body{
81
+ padding: 1.5rem;
123
82
  }
124
-
125
- .n-card-footer[data-v-28bb4c76]{
126
- padding: var(--n-space-4) var(--n-space-6);
127
- background: var(--n-color-glass);
128
- border-top: 1px solid var(--n-color-border);
129
- margin-top: auto;
83
+ .n-card-footer[data-v-51ea59b6]{
84
+ padding: 1rem 1.5rem;
85
+ border-top: 1px solid #334155;
86
+ background: rgba(0, 0, 0, 0.1);
130
87
  }`
131
- injectStyle('data-v-28bb4c76', __style)
88
+ injectStyle('data-v-51ea59b6', __style)
@@ -2,24 +2,19 @@
2
2
  const props = defineProps({
3
3
  title: { type: String, default: '' },
4
4
  subtitle: { type: String, default: '' },
5
- padding: { type: Boolean, default: true },
6
- compact: { type: Boolean, default: false },
5
+ elevated: { type: Boolean, default: true },
7
6
  hoverable: { type: Boolean, default: false },
8
- variant: { type: String, default: 'elevated' },
9
- image: { type: String, default: '' }
7
+ bordered: { type: Boolean, default: false }
10
8
  })
11
9
  </script>
12
10
 
13
11
  <template>
14
- <div :class="['n-card', `is-${variant}`, hoverable ? 'is-hoverable' : '', compact ? 'is-compact' : '']">
15
- <img v-if="image" :src="image" class="n-card-image" />
16
- <div v-if="title || $slots.header" class="n-card-header">
17
- <slot name="header">
18
- <h3 v-if="title" class="n-card-title">{{ title }}</h3>
19
- <p v-if="subtitle" class="n-card-subtitle">{{ subtitle }}</p>
20
- </slot>
12
+ <div class="n-card" :class="{ 'is-elevated': elevated, 'is-hoverable': hoverable, 'is-bordered': bordered }">
13
+ <div v-if="title || subtitle" class="n-card-header">
14
+ <h3 v-if="title" class="n-card-title">{{ title }}</h3>
15
+ <p v-if="subtitle" class="n-card-subtitle">{{ subtitle }}</p>
21
16
  </div>
22
- <div :class="['n-card-body', padding ? 'has-padding' : '']">
17
+ <div class="n-card-body">
23
18
  <slot />
24
19
  </div>
25
20
  <div v-if="$slots.footer" class="n-card-footer">
@@ -30,81 +25,42 @@ const props = defineProps({
30
25
 
31
26
  <style scoped>
32
27
  .n-card {
33
- background: var(--n-color-surface);
34
- border: 1px solid var(--n-color-border);
28
+ background-color: var(--n-color-surface);
35
29
  border-radius: var(--n-radius-lg);
36
30
  overflow: hidden;
37
31
  transition: all 0.3s cubic-bezier(0.16, 1, 0.3, 1);
38
- display: flex;
39
- flex-direction: column;
40
- will-change: transform, box-shadow;
32
+ position: relative;
41
33
  }
42
-
43
34
  .is-elevated {
44
- background: var(--n-color-surface-elevated);
45
- box-shadow: var(--n-shadow-md);
46
- }
47
-
48
- .is-outlined {
49
- background: transparent;
50
- border-color: var(--n-color-border);
51
- box-shadow: none;
52
- }
53
-
54
- .is-flat {
55
- background: var(--n-color-surface-alt);
56
- border: none;
57
- box-shadow: none;
58
35
  }
59
-
60
- .n-card.is-hoverable:hover {
61
- transform: translateY(-2px);
62
- border-color: var(--n-color-border-hover);
63
- box-shadow: var(--n-shadow-lg);
36
+ .is-bordered {
37
+ border: 1px solid #334155;
64
38
  }
65
-
66
- .n-card-image {
67
- width: 100%;
68
- height: 200px;
69
- object-fit: cover;
70
- display: block;
39
+ .is-hoverable:hover {
71
40
  }
72
-
73
41
  .n-card-header {
74
- padding: var(--n-space-6);
75
- border-bottom: 1px solid var(--n-color-border);
76
- }
77
-
78
- .is-compact .n-card-header {
79
- padding: var(--n-space-4);
42
+ padding: 1.5rem 1.5rem 1rem 1.5rem;
43
+ border-bottom: 1px solid #334155;
80
44
  }
81
-
82
- .is-compact .n-card-body.has-padding {
83
- padding: var(--n-space-4);
84
- }
85
-
86
45
  .n-card-title {
87
- margin: 0;
88
- font-size: var(--n-text-xl);
89
- font-weight: var(--n-weight-bold);
46
+ font-size: 1.25rem;
47
+ font-weight: 700;
90
48
  color: var(--n-color-text);
91
- letter-spacing: var(--n-tracking-tight);
49
+ margin: 0 0 0.25rem 0;
50
+ letter-spacing: -0.01em;
92
51
  }
93
-
94
52
  .n-card-subtitle {
95
- margin: var(--n-space-1) 0 0 0;
96
- font-size: var(--n-text-sm);
97
- color: var(--n-color-text-secondary);
53
+ font-size: 0.875rem;
54
+ color: var(--n-color-text-muted);
55
+ margin: 0;
98
56
  }
99
-
100
- .n-card-body.has-padding {
101
- padding: var(--n-space-6);
57
+ .n-card-body {
58
+ padding: 1.5rem;
102
59
  }
103
-
104
60
  .n-card-footer {
105
- padding: var(--n-space-4) var(--n-space-6);
106
- background: var(--n-color-glass);
107
- border-top: 1px solid var(--n-color-border);
108
- margin-top: auto;
61
+ padding: 1rem 1.5rem;
62
+ border-top: 1px solid #334155;
63
+ background: rgba(0, 0, 0, 0.1);
109
64
  }
65
+
110
66
  </style>
@@ -1,7 +1,7 @@
1
- import { h, hText, effect, defineComponent, registerComponent, reloadComponent, injectStyle } from 'nexa-framework'
1
+ import { signal, computed, h, hText, effect, defineComponent, registerComponent, reloadComponent, injectStyle } from 'nexa-framework'
2
2
 
3
3
  const _sfc_main = defineComponent({
4
- __scopeId: 'data-v-50293982',
4
+ __scopeId: 'data-v-e798c5c',
5
5
  __hmrId: 'NCheckbox_nexa',
6
6
  props: {
7
7
  modelValue: { type: Boolean, default: false },
@@ -16,112 +16,123 @@ const _sfc_main = defineComponent({
16
16
  if (props.disabled) return
17
17
  emit('update:modelValue', !props.modelValue)
18
18
  }
19
- return { toggle, $slots, emit }
19
+ const isAnimating = signal(false)
20
+ const handleToggle = () => {
21
+ if (props.disabled) return
22
+ isAnimating.value = true
23
+ setTimeout(() => { isAnimating.value = false }, 300)
24
+ toggle()
25
+ }
26
+ return { toggle, isAnimating, handleToggle, $slots, emit }
20
27
  }
21
28
  })
22
29
  // Injected render function
23
30
  _sfc_main.render = function(ctx) {
24
- let { toggle, $slots, emit, modelValue, label, disabled, indeterminate, Fragment: _ntc_Fragment } = ctx
25
- return h('label', { class: ["n-checkbox", { 'is-checked': modelValue && !indeterminate, 'is-indeterminate': indeterminate, 'is-disabled': disabled }], "data-v-50293982": "" }, [
31
+ let { toggle, isAnimating, handleToggle, $slots, emit, modelValue, label, disabled, indeterminate, Fragment: _ntc_Fragment } = ctx
32
+ return h('label', { class: ["n-checkbox", { 'is-checked': modelValue && !indeterminate, 'is-indeterminate': indeterminate, 'is-disabled': disabled }], "data-v-e798c5c": "" }, [
26
33
  "\n ",
27
- h('div', { class: "n-checkbox-box", onClick: toggle, "data-v-50293982": "" }, [
34
+ h('div', { class: ["n-checkbox-box", { 'is-animating': isAnimating }], onClick: handleToggle, "data-v-e798c5c": "" }, [
28
35
  "\n ",
29
- (modelValue && !indeterminate) ? h('div', { class: "n-checkbox-check", "data-v-50293982": "" }, [
36
+ (modelValue && !indeterminate) ? h('svg', { class: "n-checkbox-icon", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", "stroke-width": "3", "stroke-linecap": "round", "stroke-linejoin": "round", "data-v-e798c5c": "" }, [
30
37
  "\n ",
31
- h('svg', { viewBox: "0 0 24 24", width: "12", height: "12", fill: "none", stroke: "white", "stroke-width": "3", "stroke-linecap": "round", "stroke-linejoin": "round", focusable: "false", "data-v-50293982": "" }, [
32
- h('path', { d: "M5 12l5 5L20 7", "data-v-50293982": "" })
33
- ]),
38
+ h('path', { d: "M20 6L9 17l-5-5", "data-v-e798c5c": "" }),
34
39
  "\n "
35
40
  ]) : null,
36
- (indeterminate) ? h('div', { class: "n-checkbox-check", "data-v-50293982": "" }, [
41
+ (indeterminate) ? h('svg', { class: "n-checkbox-icon", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", "stroke-width": "3", "stroke-linecap": "round", "data-v-e798c5c": "" }, [
37
42
  "\n ",
38
- h('svg', { viewBox: "0 0 24 24", width: "12", height: "12", fill: "none", stroke: "white", "stroke-width": "3", "stroke-linecap": "round", focusable: "false", "data-v-50293982": "" }, [
39
- h('line', { x1: "5", y1: "12", x2: "19", y2: "12", "data-v-50293982": "" })
40
- ]),
43
+ h('line', { x1: "5", y1: "12", x2: "19", y2: "12", "data-v-e798c5c": "" }),
41
44
  "\n "
42
45
  ]) : null
43
46
  ]),
44
47
  "\n ",
45
- (label) ? h('span', { class: "n-checkbox-label", "data-v-50293982": "" }, [
48
+ (label) ? h('span', { class: "n-checkbox-label", "data-v-e798c5c": "" }, [
46
49
  label
47
50
  ]) : null
48
51
  ])
49
52
  }
50
- _sfc_main.__scopeId = 'data-v-50293982'
53
+ _sfc_main.__scopeId = 'data-v-e798c5c'
51
54
  _sfc_main.__hmrId = 'NCheckbox_nexa'
52
55
 
53
56
  export default _sfc_main
54
57
 
55
- const __style = `.n-checkbox[data-v-50293982]{
58
+ const __style = `.n-checkbox[data-v-e798c5c]{
56
59
  display: inline-flex;
57
60
  align-items: center;
58
61
  gap: 0.75rem;
59
62
  cursor: pointer;
60
63
  user-select: none;
61
- padding: 0.375rem 0.5rem;
62
- border-radius: 6px;
63
- transition: background 0.15s;
64
+ padding: 0.5rem 0.75rem;
65
+ border-radius: var(--n-radius-md);
66
+ transition: color var(--n-transition-fast) cubic-bezier(0.16, 1, 0.3, 1);
64
67
  }
65
-
66
- .n-checkbox[data-v-50293982]:hover:not(.is-disabled){
68
+ .n-checkbox[data-v-e798c5c]:hover:not(.is-disabled){
67
69
  background: rgba(99, 102, 241, 0.08);
70
+ transform: translateX(2px);
68
71
  }
69
-
70
- .n-checkbox-box[data-v-50293982]{
71
- width: 20px;
72
- height: 20px;
73
- border-radius: 6px;
74
- border: 2px solid #475569;
72
+ .n-checkbox-box[data-v-e798c5c]{
73
+ width: 24px;
74
+ height: 24px;
75
+ border-radius: var(--n-radius-md);
76
+ border: 1px solid var(--n-color-border);
75
77
  display: flex;
76
78
  align-items: center;
77
79
  justify-content: center;
78
- transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1);
79
- background: #0f172a;
80
+ transition: background-color var(--n-transition-fast), border-color var(--n-transition-fast), color var(--n-transition-fast), box-shadow var(--n-transition-fast);
81
+ background-color: var(--n-color-surface);
80
82
  flex-shrink: 0;
83
+ position: relative;
81
84
  }
82
-
83
- .is-checked .n-checkbox-box[data-v-50293982],
84
- .is-indeterminate .n-checkbox-box[data-v-50293982]{
85
- background: #6366f1;
86
- border-color: #6366f1;
87
- box-shadow: 0 0 0 4px rgba(99, 102, 241, 0.2), 0 4px 12px rgba(99, 102, 241, 0.4);
85
+ .is-checked .n-checkbox-box[data-v-e798c5c],
86
+ .is-indeterminate .n-checkbox-box[data-v-e798c5c]{
87
+ background-color: var(--n-color-primary);
88
+ border-color: var(--n-color-primary);
88
89
  }
89
-
90
- .n-checkbox-check[data-v-50293982]{
91
- display: flex;
92
- align-items: center;
93
- justify-content: center;
94
- animation: n-check 0.25s cubic-bezier(0.4, 0, 0.2, 1);
90
+ .is-animating .n-checkbox-box[data-v-e798c5c]{
95
91
  }
96
-
97
- @keyframes n-check {
98
- 0%[data-v-50293982]{ transform: scale(0); opacity: 0; }
99
- 50%[data-v-50293982]{ transform: scale(1.2); }
100
- 100%[data-v-50293982]{ transform: scale(1); opacity: 1; }
92
+ .n-checkbox-icon[data-v-e798c5c]{
93
+ width: 16px;
94
+ height: 16px;
95
+ color: white;
96
+ animation: n-check-pop 0.3s cubic-bezier(0.34, 1.56, 0.64, 1);
97
+ filter: drop-shadow(0 1px 2px rgba(0, 0, 0, 0.3));
101
98
  }
102
-
103
- .n-checkbox-label[data-v-50293982]{
99
+ @keyframes n-check-pop {
100
+ 0%[data-v-e798c5c]{
101
+ transform: scale(0) rotate(-45deg);
102
+ opacity: 0;
103
+ }
104
+ 50%[data-v-e798c5c]{
105
+ transform: scale(1.3) rotate(0deg);
106
+ }
107
+ 100%[data-v-e798c5c]{
108
+ transform: scale(1) rotate(0deg);
109
+ opacity: 1;
110
+ }
111
+ }
112
+ .n-checkbox-label[data-v-e798c5c]{
104
113
  font-size: 0.875rem;
105
- color: #e2e8f0;
114
+ color: var(--n-color-text);
106
115
  font-weight: 500;
107
116
  line-height: 1.5;
117
+ transition: color 0.2s;
108
118
  }
109
-
110
- .is-disabled[data-v-50293982]{
119
+ .is-checked .n-checkbox-label[data-v-e798c5c]{
120
+ color: var(--n-color-text);
121
+ }
122
+ .is-disabled[data-v-e798c5c]{
111
123
  opacity: 0.4;
112
124
  cursor: not-allowed;
113
125
  }
114
-
115
- .is-disabled .n-checkbox-box[data-v-50293982]{
116
- background: #1e293b;
117
- border-color: #334155;
126
+ .is-disabled .n-checkbox-box[data-v-e798c5c]{
127
+ background-color: var(--n-color-surface);
128
+ border-color: var(--n-color-primary);
129
+ box-shadow: none;
118
130
  }
119
-
120
- .n-checkbox[data-v-50293982]:hover:not(.is-disabled) .n-checkbox-box{
121
- border-color: #6366f1;
131
+ .n-checkbox[data-v-e798c5c]:hover:not(.is-disabled) .n-checkbox-box{
132
+ border-color: var(--n-color-primary);
122
133
  }
123
-
124
- .is-checked .n-checkbox-box[data-v-50293982]:active{
125
- transform: scale(0.9);
134
+ .is-checked .n-checkbox-box[data-v-e798c5c]:active,
135
+ .is-indeterminate .n-checkbox-box[data-v-e798c5c]:active{
136
+ transform: scale(0.92);
126
137
  }`
127
- injectStyle('data-v-50293982', __style)
138
+ injectStyle('data-v-e798c5c', __style)
@@ -1,4 +1,6 @@
1
1
  <script setup>
2
+ import { signal, computed } from 'nexa-framework'
3
+
2
4
  const props = defineProps({
3
5
  modelValue: { type: Boolean, default: false },
4
6
  label: { type: String, default: '' },
@@ -12,17 +14,26 @@ const toggle = () => {
12
14
  if (props.disabled) return
13
15
  emit('update:modelValue', !props.modelValue)
14
16
  }
17
+
18
+ const isAnimating = signal(false)
19
+
20
+ const handleToggle = () => {
21
+ if (props.disabled) return
22
+ isAnimating.value = true
23
+ setTimeout(() => { isAnimating.value = false }, 300)
24
+ toggle()
25
+ }
15
26
  </script>
16
27
 
17
28
  <template>
18
29
  <label class="n-checkbox" :class="{ 'is-checked': modelValue && !indeterminate, 'is-indeterminate': indeterminate, 'is-disabled': disabled }">
19
- <div class="n-checkbox-box" @click="toggle">
20
- <div v-if="modelValue && !indeterminate" class="n-checkbox-check">
21
- <svg viewBox="0 0 24 24" width="12" height="12" fill="none" stroke="white" stroke-width="3" stroke-linecap="round" stroke-linejoin="round" focusable="false"><path d="M5 12l5 5L20 7"/></svg>
22
- </div>
23
- <div v-if="indeterminate" class="n-checkbox-check">
24
- <svg viewBox="0 0 24 24" width="12" height="12" fill="none" stroke="white" stroke-width="3" stroke-linecap="round" focusable="false"><line x1="5" y1="12" x2="19" y2="12"/></svg>
25
- </div>
30
+ <div class="n-checkbox-box" @click="handleToggle" :class="{ 'is-animating': isAnimating }">
31
+ <svg v-if="modelValue && !indeterminate" class="n-checkbox-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="3" stroke-linecap="round" stroke-linejoin="round">
32
+ <path d="M20 6L9 17l-5-5"/>
33
+ </svg>
34
+ <svg v-if="indeterminate" class="n-checkbox-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="3" stroke-linecap="round">
35
+ <line x1="5" y1="12" x2="19" y2="12"/>
36
+ </svg>
26
37
  </div>
27
38
  <span v-if="label" class="n-checkbox-label">{{ label }}</span>
28
39
  </label>
@@ -35,70 +46,79 @@ const toggle = () => {
35
46
  gap: 0.75rem;
36
47
  cursor: pointer;
37
48
  user-select: none;
38
- padding: 0.375rem 0.5rem;
39
- border-radius: 6px;
40
- transition: background 0.15s;
49
+ padding: 0.5rem 0.75rem;
50
+ border-radius: var(--n-radius-md);
51
+ transition: color var(--n-transition-fast) cubic-bezier(0.16, 1, 0.3, 1);
41
52
  }
42
-
43
53
  .n-checkbox:hover:not(.is-disabled) {
44
54
  background: rgba(99, 102, 241, 0.08);
55
+ transform: translateX(2px);
45
56
  }
46
-
47
57
  .n-checkbox-box {
48
- width: 20px;
49
- height: 20px;
50
- border-radius: 6px;
51
- border: 2px solid #475569;
58
+ width: 24px;
59
+ height: 24px;
60
+ border-radius: var(--n-radius-md);
61
+ border: 1px solid var(--n-color-border);
52
62
  display: flex;
53
63
  align-items: center;
54
64
  justify-content: center;
55
- transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1);
56
- background: #0f172a;
65
+ transition: background-color var(--n-transition-fast), border-color var(--n-transition-fast), color var(--n-transition-fast), box-shadow var(--n-transition-fast);
66
+ background-color: var(--n-color-surface);
57
67
  flex-shrink: 0;
68
+ position: relative;
58
69
  }
59
-
60
70
  .is-checked .n-checkbox-box,
61
71
  .is-indeterminate .n-checkbox-box {
62
- background: #6366f1;
63
- border-color: #6366f1;
64
- box-shadow: 0 0 0 4px rgba(99, 102, 241, 0.2), 0 4px 12px rgba(99, 102, 241, 0.4);
72
+ background-color: var(--n-color-primary);
73
+ border-color: var(--n-color-primary);
65
74
  }
66
-
67
- .n-checkbox-check {
68
- display: flex;
69
- align-items: center;
70
- justify-content: center;
71
- animation: n-check 0.25s cubic-bezier(0.4, 0, 0.2, 1);
75
+ .is-animating .n-checkbox-box {
72
76
  }
73
-
74
- @keyframes n-check {
75
- 0% { transform: scale(0); opacity: 0; }
76
- 50% { transform: scale(1.2); }
77
- 100% { transform: scale(1); opacity: 1; }
77
+ .n-checkbox-icon {
78
+ width: 16px;
79
+ height: 16px;
80
+ color: white;
81
+ animation: n-check-pop 0.3s cubic-bezier(0.34, 1.56, 0.64, 1);
82
+ filter: drop-shadow(0 1px 2px rgba(0, 0, 0, 0.3));
83
+ }
84
+ @keyframes n-check-pop {
85
+ 0% {
86
+ transform: scale(0) rotate(-45deg);
87
+ opacity: 0;
88
+ }
89
+ 50% {
90
+ transform: scale(1.3) rotate(0deg);
91
+ }
92
+ 100% {
93
+ transform: scale(1) rotate(0deg);
94
+ opacity: 1;
95
+ }
78
96
  }
79
-
80
97
  .n-checkbox-label {
81
98
  font-size: 0.875rem;
82
- color: #e2e8f0;
99
+ color: var(--n-color-text);
83
100
  font-weight: 500;
84
101
  line-height: 1.5;
102
+ transition: color 0.2s;
103
+ }
104
+ .is-checked .n-checkbox-label {
105
+ color: var(--n-color-text);
85
106
  }
86
-
87
107
  .is-disabled {
88
108
  opacity: 0.4;
89
109
  cursor: not-allowed;
90
110
  }
91
-
92
111
  .is-disabled .n-checkbox-box {
93
- background: #1e293b;
94
- border-color: #334155;
112
+ background-color: var(--n-color-surface);
113
+ border-color: var(--n-color-primary);
114
+ box-shadow: none;
95
115
  }
96
-
97
116
  .n-checkbox:hover:not(.is-disabled) .n-checkbox-box {
98
- border-color: #6366f1;
117
+ border-color: var(--n-color-primary);
99
118
  }
100
-
101
- .is-checked .n-checkbox-box:active {
102
- transform: scale(0.9);
119
+ .is-checked .n-checkbox-box:active,
120
+ .is-indeterminate .n-checkbox-box:active {
121
+ transform: scale(0.92);
103
122
  }
123
+
104
124
  </style>
@@ -54,4 +54,5 @@ const removeAt = (index) => {
54
54
 
55
55
  <style scoped>
56
56
  .n-chips{display:flex;flex-wrap:wrap;gap:var(--n-space-2);align-items:center}.n-chip{display:inline-flex;align-items:center;gap:0.35rem;padding:0.25rem 0.5rem;border-radius:999px;background:var(--n-color-glass);border:1px solid var(--n-color-border);color:var(--n-color-text);font-size:var(--n-text-xs);line-height:1}.n-chip-remove{background:transparent;border:none;color:var(--n-color-text-muted);cursor:pointer;padding:0;border-radius:var(--n-radius-sm);line-height:1;display:flex;align-items:center}.n-chip-remove:hover:not(:disabled){color:var(--n-color-text)}.n-chip-remove:disabled{opacity:0.5;cursor:not-allowed}.is-disabled{opacity:0.6}
57
+
57
58
  </style>