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,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-3302b953',
4
+ __scopeId: 'data-v-e798c5c',
5
5
  __hmrId: 'NCheckbox_nexa',
6
6
  props: {
7
7
  modelValue: { type: Boolean, default: false },
@@ -16,106 +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-3302b953": "" }, [
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-3302b953": "" }, [
34
+ h('div', { class: ["n-checkbox-box", { 'is-animating': isAnimating }], onClick: handleToggle, "data-v-e798c5c": "" }, [
28
35
  "\n ",
29
- (modelValue && !indeterminate) ? h('span', { class: "n-checkbox-icon", "data-v-3302b953": "" }, [
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: "14", height: "14", fill: "none", stroke: "currentColor", "stroke-width": "3", "stroke-linecap": "round", "stroke-linejoin": "round", focusable: "false", "aria-hidden": "true", "data-v-3302b953": "" }, [
32
- h('path', { d: "M20 6L9 17l-5-5", "data-v-3302b953": "" })
33
- ]),
38
+ h('path', { d: "M20 6L9 17l-5-5", "data-v-e798c5c": "" }),
34
39
  "\n "
35
40
  ]) : null,
36
- (indeterminate) ? h('span', { class: "n-checkbox-icon", "data-v-3302b953": "" }, [
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: "14", height: "14", fill: "none", stroke: "currentColor", "stroke-width": "3", "stroke-linecap": "round", focusable: "false", "aria-hidden": "true", "data-v-3302b953": "" }, [
39
- h('line', { x1: "4", y1: "12", x2: "20", y2: "12", "data-v-3302b953": "" })
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-3302b953": "" }, [
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-3302b953'
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-3302b953]{
58
+ const __style = `.n-checkbox[data-v-e798c5c]{
56
59
  display: inline-flex;
57
60
  align-items: center;
58
- gap: var(--n-space-3);
61
+ gap: 0.75rem;
59
62
  cursor: pointer;
60
63
  user-select: none;
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);
61
67
  }
62
-
63
- .n-checkbox-box[data-v-3302b953]{
64
- width: 22px;
65
- height: 22px;
66
- border: 2px solid var(--n-color-border);
67
- border-radius: var(--n-radius-sm);
68
+ .n-checkbox[data-v-e798c5c]:hover:not(.is-disabled){
69
+ background: rgba(99, 102, 241, 0.08);
70
+ transform: translateX(2px);
71
+ }
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);
68
77
  display: flex;
69
78
  align-items: center;
70
79
  justify-content: center;
71
- transition: all var(--n-transition-normal);
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);
72
82
  flex-shrink: 0;
73
- background: transparent;
83
+ position: relative;
74
84
  }
75
-
76
- .is-checked .n-checkbox-box[data-v-3302b953]{
77
- background: var(--n-color-primary);
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);
78
88
  border-color: var(--n-color-primary);
79
- box-shadow: var(--n-shadow-glow-primary);
80
89
  }
81
-
82
- .is-indeterminate .n-checkbox-box[data-v-3302b953]{
83
- background: var(--n-color-primary);
84
- border-color: var(--n-color-primary);
85
- box-shadow: var(--n-shadow-glow-primary);
90
+ .is-animating .n-checkbox-box[data-v-e798c5c]{
86
91
  }
87
-
88
- .n-checkbox-icon[data-v-3302b953]{
89
- display: flex;
90
- align-items: center;
91
- justify-content: center;
92
+ .n-checkbox-icon[data-v-e798c5c]{
93
+ width: 16px;
94
+ height: 16px;
92
95
  color: white;
93
- line-height: 1;
94
- animation: n-checkbox-pop 0.25s cubic-bezier(0.34, 1.56, 0.64, 1);
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));
95
98
  }
96
-
97
- .n-checkbox-icon svg[data-v-3302b953]{
98
- filter: drop-shadow(0 1px 2px rgba(0, 0, 0, 0.2));
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
+ }
99
111
  }
100
-
101
- @keyframes n-checkbox-pop {
102
- 0%[data-v-3302b953]{ transform: scale(0); opacity: 0; }
103
- 50%[data-v-3302b953]{ transform: scale(1.15); }
104
- 100%[data-v-3302b953]{ transform: scale(1); opacity: 1; }
112
+ .n-checkbox-label[data-v-e798c5c]{
113
+ font-size: 0.875rem;
114
+ color: var(--n-color-text);
115
+ font-weight: 500;
116
+ line-height: 1.5;
117
+ transition: color 0.2s;
105
118
  }
106
-
107
- .n-checkbox-label[data-v-3302b953]{
108
- font-size: var(--n-text-sm);
119
+ .is-checked .n-checkbox-label[data-v-e798c5c]{
109
120
  color: var(--n-color-text);
110
- font-weight: var(--n-weight-medium);
111
121
  }
112
-
113
- .is-disabled[data-v-3302b953]{
114
- opacity: 0.5;
122
+ .is-disabled[data-v-e798c5c]{
123
+ opacity: 0.4;
115
124
  cursor: not-allowed;
116
125
  }
117
-
118
- .n-checkbox[data-v-3302b953]:hover:not(.is-disabled) .n-checkbox-box{
126
+ .is-disabled .n-checkbox-box[data-v-e798c5c]{
127
+ background-color: var(--n-color-surface);
119
128
  border-color: var(--n-color-primary);
129
+ box-shadow: none;
130
+ }
131
+ .n-checkbox[data-v-e798c5c]:hover:not(.is-disabled) .n-checkbox-box{
132
+ border-color: var(--n-color-primary);
133
+ }
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);
120
137
  }`
121
- injectStyle('data-v-3302b953', __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
- <span v-if="modelValue && !indeterminate" class="n-checkbox-icon">
21
- <svg viewBox="0 0 24 24" width="14" height="14" fill="none" stroke="currentColor" stroke-width="3" stroke-linecap="round" stroke-linejoin="round" focusable="false" aria-hidden="true"><path d="M20 6L9 17l-5-5"/></svg>
22
- </span>
23
- <span v-if="indeterminate" class="n-checkbox-icon">
24
- <svg viewBox="0 0 24 24" width="14" height="14" fill="none" stroke="currentColor" stroke-width="3" stroke-linecap="round" focusable="false" aria-hidden="true"><line x1="4" y1="12" x2="20" y2="12"/></svg>
25
- </span>
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>
@@ -32,67 +43,82 @@ const toggle = () => {
32
43
  .n-checkbox {
33
44
  display: inline-flex;
34
45
  align-items: center;
35
- gap: var(--n-space-3);
46
+ gap: 0.75rem;
36
47
  cursor: pointer;
37
48
  user-select: none;
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);
52
+ }
53
+ .n-checkbox:hover:not(.is-disabled) {
54
+ background: rgba(99, 102, 241, 0.08);
55
+ transform: translateX(2px);
38
56
  }
39
-
40
57
  .n-checkbox-box {
41
- width: 22px;
42
- height: 22px;
43
- border: 2px solid var(--n-color-border);
44
- border-radius: var(--n-radius-sm);
58
+ width: 24px;
59
+ height: 24px;
60
+ border-radius: var(--n-radius-md);
61
+ border: 1px solid var(--n-color-border);
45
62
  display: flex;
46
63
  align-items: center;
47
64
  justify-content: center;
48
- transition: all var(--n-transition-normal);
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);
49
67
  flex-shrink: 0;
50
- background: transparent;
68
+ position: relative;
51
69
  }
52
-
53
- .is-checked .n-checkbox-box {
54
- background: var(--n-color-primary);
55
- border-color: var(--n-color-primary);
56
- box-shadow: var(--n-shadow-glow-primary);
57
- }
58
-
70
+ .is-checked .n-checkbox-box,
59
71
  .is-indeterminate .n-checkbox-box {
60
- background: var(--n-color-primary);
72
+ background-color: var(--n-color-primary);
61
73
  border-color: var(--n-color-primary);
62
- box-shadow: var(--n-shadow-glow-primary);
63
74
  }
64
-
75
+ .is-animating .n-checkbox-box {
76
+ }
65
77
  .n-checkbox-icon {
66
- display: flex;
67
- align-items: center;
68
- justify-content: center;
78
+ width: 16px;
79
+ height: 16px;
69
80
  color: white;
70
- line-height: 1;
71
- animation: n-checkbox-pop 0.25s cubic-bezier(0.34, 1.56, 0.64, 1);
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));
72
83
  }
73
-
74
- .n-checkbox-icon svg {
75
- filter: drop-shadow(0 1px 2px rgba(0, 0, 0, 0.2));
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
+ }
76
96
  }
77
-
78
- @keyframes n-checkbox-pop {
79
- 0% { transform: scale(0); opacity: 0; }
80
- 50% { transform: scale(1.15); }
81
- 100% { transform: scale(1); opacity: 1; }
82
- }
83
-
84
97
  .n-checkbox-label {
85
- font-size: var(--n-text-sm);
98
+ font-size: 0.875rem;
99
+ color: var(--n-color-text);
100
+ font-weight: 500;
101
+ line-height: 1.5;
102
+ transition: color 0.2s;
103
+ }
104
+ .is-checked .n-checkbox-label {
86
105
  color: var(--n-color-text);
87
- font-weight: var(--n-weight-medium);
88
106
  }
89
-
90
107
  .is-disabled {
91
- opacity: 0.5;
108
+ opacity: 0.4;
92
109
  cursor: not-allowed;
93
110
  }
94
-
111
+ .is-disabled .n-checkbox-box {
112
+ background-color: var(--n-color-surface);
113
+ border-color: var(--n-color-primary);
114
+ box-shadow: none;
115
+ }
95
116
  .n-checkbox:hover:not(.is-disabled) .n-checkbox-box {
96
117
  border-color: var(--n-color-primary);
97
118
  }
119
+ .is-checked .n-checkbox-box:active,
120
+ .is-indeterminate .n-checkbox-box:active {
121
+ transform: scale(0.92);
122
+ }
123
+
98
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>