aetherx-dt-ui 0.1.7 → 0.1.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.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "aetherx-dt-ui",
3
- "version": "0.1.7",
3
+ "version": "0.1.9",
4
4
  "description": "Lightweight, customizable Vue components for DT projects",
5
5
  "type": "module",
6
6
  "bin": {
@@ -1,22 +1,22 @@
1
1
  <script setup lang="ts">
2
2
  import { computed } from 'vue'
3
3
 
4
- export type BadgeVariant = 'default' | 'secondary' | 'outline' | 'destructive' | 'success' | 'warning'
5
- export type BadgeSize = 'sm' | 'default'
4
+ export type BadgeVariant = 'gray' | 'green' | 'red' | 'blue' | 'orange' | 'yellow'
5
+ export type BadgeSize = 'sm' | 'md' | 'lg'
6
6
 
7
7
  const props = withDefaults(defineProps<{
8
8
  variant?: BadgeVariant
9
9
  size?: BadgeSize
10
10
  dot?: boolean
11
11
  }>(), {
12
- variant: 'default',
13
- size: 'default',
12
+ variant: 'gray',
13
+ size: 'md',
14
14
  })
15
15
 
16
16
  const classes = computed(() => [
17
17
  'dt-badge',
18
18
  `dt-badge--${props.variant}`,
19
- `dt-badge--${props.size}`,
19
+ `dt-badge--size-${props.size}`,
20
20
  props.dot && 'dt-badge--dot',
21
21
  ].filter(Boolean))
22
22
  </script>
@@ -33,62 +33,63 @@ const classes = computed(() => [
33
33
  display: inline-flex;
34
34
  align-items: center;
35
35
  gap: var(--dt-space-1);
36
- font-weight: 500;
36
+ font-weight: var(--dt-font-medium);
37
37
  border-radius: var(--dt-radius-sm);
38
38
  white-space: nowrap;
39
- transition: background-color var(--dt-transition-base), color var(--dt-transition-base);
40
- border: 1px solid transparent;
41
39
  line-height: 1;
42
40
  }
43
41
 
44
- /* Sizes */
45
- .dt-badge--sm {
46
- padding: 0.125rem 0.375rem;
42
+ /* Sizes (Figma: SM/MD/LG) */
43
+ .dt-badge--size-sm {
44
+ padding: 4px 6px;
47
45
  font-size: var(--dt-text-xs);
48
46
  }
49
- .dt-badge--default {
50
- padding: 0.25rem 0.5rem;
51
- font-size: var(--dt-text-xs);
47
+ .dt-badge--size-md {
48
+ padding: 4px 8px;
49
+ font-size: var(--dt-text-sm);
50
+ }
51
+ .dt-badge--size-lg {
52
+ padding: 4px 10px;
53
+ font-size: var(--dt-text-sm);
52
54
  }
53
55
 
54
- /* Variants */
55
- .dt-badge--default {
56
- background-color: var(--dt-color-accent-light);
57
- color: var(--dt-color-accent);
56
+ /* Variants (Figma colors) */
57
+ .dt-badge--gray {
58
+ background: var(--dt-gray-100);
59
+ color: var(--dt-gray-800);
58
60
  }
59
61
 
60
- .dt-badge--secondary {
61
- background-color: var(--dt-color-background-tertiary);
62
- color: var(--dt-color-text-secondary);
62
+ .dt-badge--green {
63
+ background: var(--dt-success-100);
64
+ color: var(--dt-success-600);
63
65
  }
64
66
 
65
- .dt-badge--outline {
66
- border-color: var(--dt-color-border);
67
- background-color: transparent;
68
- color: var(--dt-color-text);
67
+ .dt-badge--red {
68
+ background: var(--dt-error-100);
69
+ color: var(--dt-error-500);
69
70
  }
70
71
 
71
- .dt-badge--destructive {
72
- background-color: var(--dt-color-error-light);
73
- color: var(--dt-color-error);
72
+ .dt-badge--blue {
73
+ background: var(--dt-blue-100);
74
+ color: var(--dt-blue-500);
74
75
  }
75
76
 
76
- .dt-badge--success {
77
- background-color: var(--dt-color-success-light);
78
- color: var(--dt-color-success);
77
+ .dt-badge--orange {
78
+ background: var(--dt-warning-100);
79
+ color: var(--dt-warning-600);
79
80
  }
80
81
 
81
- .dt-badge--warning {
82
- background-color: var(--dt-color-warning-light);
83
- color: var(--dt-color-warning);
82
+ .dt-badge--yellow {
83
+ background: var(--dt-yellow-100);
84
+ color: var(--dt-yellow-600);
84
85
  }
85
86
 
86
87
  /* Dot */
87
88
  .dt-badge__dot {
88
- width: 0.375rem;
89
- height: 0.375rem;
90
- border-radius: var(--dt-radius-full);
91
- background-color: currentColor;
89
+ width: 6px;
90
+ height: 6px;
91
+ border-radius: 50%;
92
+ background: currentColor;
92
93
  flex-shrink: 0;
93
94
  }
94
95
  </style>
@@ -1,8 +1,8 @@
1
1
  <script setup lang="ts">
2
2
  import { computed } from 'vue'
3
3
 
4
- export type ButtonVariant = 'default' | 'secondary' | 'outline' | 'ghost' | 'destructive' | 'link'
5
- export type ButtonSize = 'sm' | 'default' | 'lg' | 'icon'
4
+ export type ButtonVariant = 'primary' | 'secondary' | 'outline' | 'ghost'
5
+ export type ButtonSize = 'xl' | 'lg' | 'md' | 'sm' | 'xs'
6
6
 
7
7
  const props = withDefaults(defineProps<{
8
8
  variant?: ButtonVariant
@@ -10,14 +10,14 @@ const props = withDefaults(defineProps<{
10
10
  disabled?: boolean
11
11
  loading?: boolean
12
12
  }>(), {
13
- variant: 'default',
14
- size: 'default',
13
+ variant: 'primary',
14
+ size: 'md',
15
15
  })
16
16
 
17
17
  const classes = computed(() => [
18
18
  'dt-button',
19
19
  `dt-button--${props.variant}`,
20
- `dt-button--${props.size}`,
20
+ `dt-button--size-${props.size}`,
21
21
  props.disabled && 'dt-button--disabled',
22
22
  props.loading && 'dt-button--loading',
23
23
  ].filter(Boolean))
@@ -30,11 +30,11 @@ const classes = computed(() => [
30
30
  v-bind="$attrs"
31
31
  >
32
32
  <span v-if="loading" class="dt-button__spinner" aria-hidden="true" />
33
- <span v-if="$slots['icon-left']" class="dt-button__icon dt-button__icon--left">
33
+ <span v-if="$slots['icon-left']" class="dt-button__icon">
34
34
  <slot name="icon-left" />
35
35
  </span>
36
36
  <slot />
37
- <span v-if="$slots['icon-right']" class="dt-button__icon dt-button__icon--right">
37
+ <span v-if="$slots['icon-right']" class="dt-button__icon">
38
38
  <slot name="icon-right" />
39
39
  </span>
40
40
  </button>
@@ -46,103 +46,110 @@ const classes = computed(() => [
46
46
  align-items: center;
47
47
  justify-content: center;
48
48
  gap: var(--dt-space-2);
49
- font-weight: 500;
50
- border-radius: var(--dt-radius-base);
51
- transition: background-color var(--dt-transition-base),
52
- border-color var(--dt-transition-base),
53
- color var(--dt-transition-base),
54
- box-shadow var(--dt-transition-base);
49
+ font-weight: var(--dt-font-medium);
55
50
  cursor: pointer;
56
51
  border: 1px solid transparent;
57
52
  font-family: inherit;
58
53
  line-height: 1;
59
54
  white-space: nowrap;
60
55
  user-select: none;
56
+ transition: background-color var(--dt-transition-base),
57
+ border-color var(--dt-transition-base),
58
+ color var(--dt-transition-base);
61
59
  }
62
60
 
63
- /* Variants */
64
- .dt-button--default {
65
- background-color: var(--dt-color-accent);
61
+ /* ── Variants ───────────────────────────── */
62
+ .dt-button--primary {
63
+ background: var(--dt-color-accent);
66
64
  color: var(--dt-color-accent-foreground);
67
65
  }
68
- .dt-button--default:hover {
69
- background-color: var(--dt-color-accent-hover);
66
+ .dt-button--primary:hover:not(:disabled) {
67
+ background: var(--dt-color-accent-hover);
68
+ }
69
+ .dt-button--primary:active:not(:disabled) {
70
+ background: var(--dt-color-accent-active);
70
71
  }
71
72
 
72
73
  .dt-button--secondary {
73
- background-color: var(--dt-color-secondary);
74
+ background: var(--dt-color-secondary);
74
75
  color: var(--dt-color-secondary-foreground);
75
76
  }
76
- .dt-button--secondary:hover {
77
- background-color: var(--dt-color-secondary-hover);
77
+ .dt-button--secondary:hover:not(:disabled) {
78
+ background: var(--dt-color-secondary-hover);
79
+ }
80
+ .dt-button--secondary:active:not(:disabled) {
81
+ background: var(--dt-color-secondary-active);
78
82
  }
79
83
 
80
84
  .dt-button--outline {
85
+ background: var(--dt-color-background);
86
+ color: var(--dt-gray-800);
81
87
  border-color: var(--dt-color-border);
82
- background-color: transparent;
83
- color: var(--dt-color-text);
84
- }
85
- .dt-button--outline:hover {
86
- background-color: var(--dt-color-surface-hover);
87
- border-color: var(--dt-color-border-hover);
88
88
  }
89
-
90
- .dt-button--ghost {
91
- background-color: transparent;
92
- color: var(--dt-color-text);
89
+ .dt-button--outline:hover:not(:disabled) {
90
+ color: var(--dt-color-accent);
91
+ border-color: var(--dt-color-accent);
93
92
  }
94
- .dt-button--ghost:hover {
95
- background-color: var(--dt-color-surface-hover);
93
+ .dt-button--outline:active:not(:disabled) {
94
+ background: var(--dt-brand-100);
95
+ color: var(--dt-color-accent);
96
+ border-color: var(--dt-color-accent);
96
97
  }
97
98
 
98
- .dt-button--destructive {
99
- background-color: var(--dt-color-error);
100
- color: var(--dt-color-error-foreground);
101
- }
102
- .dt-button--destructive:hover {
103
- background-color: var(--dt-color-error-hover);
99
+ .dt-button--ghost {
100
+ background: transparent;
101
+ color: var(--dt-gray-800);
104
102
  }
105
-
106
- .dt-button--link {
107
- background-color: transparent;
103
+ .dt-button--ghost:hover:not(:disabled) {
104
+ background: var(--dt-brand-100);
108
105
  color: var(--dt-color-accent);
109
- text-decoration: underline;
110
- text-underline-offset: 4px;
111
106
  }
112
- .dt-button--link:hover {
113
- color: var(--dt-color-accent-hover);
107
+ .dt-button--ghost:active:not(:disabled) {
108
+ background: transparent;
109
+ color: var(--dt-color-accent);
114
110
  }
115
111
 
116
- /* Sizes */
117
- .dt-button--sm {
118
- height: 2rem;
119
- padding: 0 0.75rem;
112
+ /* ── Sizes (Figma: xl/lg/md/sm/xs) ──────── */
113
+ .dt-button--size-xl {
114
+ height: 56px;
115
+ padding: 18px 24px;
116
+ border-radius: var(--dt-radius-xl);
117
+ font-size: var(--dt-text-base);
118
+ }
119
+ .dt-button--size-lg {
120
+ height: 48px;
121
+ padding: 16px 24px;
122
+ border-radius: var(--dt-radius-lg);
120
123
  font-size: var(--dt-text-sm);
121
124
  }
122
- .dt-button--default {
123
- height: 2.5rem;
124
- padding: 0 1rem;
125
+ .dt-button--size-md {
126
+ height: 40px;
127
+ padding: 12px 18px;
128
+ border-radius: var(--dt-radius-base);
125
129
  font-size: var(--dt-text-sm);
126
130
  }
127
- .dt-button--lg {
128
- height: 2.75rem;
129
- padding: 0 1.5rem;
130
- font-size: var(--dt-text-base);
131
+ .dt-button--size-sm {
132
+ height: 32px;
133
+ padding: 8px 16px;
134
+ border-radius: var(--dt-radius-md);
135
+ font-size: var(--dt-text-xs);
131
136
  }
132
- .dt-button--icon {
133
- height: 2.5rem;
134
- width: 2.5rem;
135
- padding: 0;
137
+ .dt-button--size-xs {
138
+ height: 24px;
139
+ padding: 4px 8px;
140
+ border-radius: var(--dt-radius-sm);
141
+ font-size: var(--dt-text-xs);
136
142
  }
137
143
 
138
- /* States */
144
+ /* ── States ──────────────────────────────── */
139
145
  .dt-button--disabled {
140
- opacity: 0.5;
141
- pointer-events: none;
146
+ background: var(--dt-color-disabled-bg);
147
+ color: var(--dt-color-disabled-text);
148
+ border-color: transparent;
149
+ cursor: not-allowed;
142
150
  }
143
151
 
144
152
  .dt-button--loading {
145
- position: relative;
146
153
  pointer-events: none;
147
154
  }
148
155
 
@@ -151,7 +158,7 @@ const classes = computed(() => [
151
158
  outline-offset: 2px;
152
159
  }
153
160
 
154
- /* Spinner */
161
+ /* ── Spinner ─────────────────────────────── */
155
162
  .dt-button__spinner {
156
163
  width: 1em;
157
164
  height: 1em;
@@ -169,8 +176,6 @@ const classes = computed(() => [
169
176
  }
170
177
 
171
178
  @keyframes dt-spin {
172
- to {
173
- transform: rotate(360deg);
174
- }
179
+ to { transform: rotate(360deg); }
175
180
  }
176
181
  </style>
@@ -0,0 +1,148 @@
1
+ <script setup lang="ts">
2
+ import { computed } from 'vue'
3
+
4
+ export type CheckboxSize = 'lg' | 'md' | 'sm'
5
+
6
+ const props = withDefaults(defineProps<{
7
+ modelValue?: boolean
8
+ size?: CheckboxSize
9
+ disabled?: boolean
10
+ id?: string
11
+ }>(), {
12
+ modelValue: false,
13
+ size: 'md',
14
+ })
15
+
16
+ const emit = defineEmits<{
17
+ 'update:modelValue': [value: boolean]
18
+ }>()
19
+
20
+ const inputId = computed(() => props.id || `dt-checkbox-${Math.random().toString(36).slice(2, 9)}`)
21
+
22
+ const toggle = () => {
23
+ if (!props.disabled) {
24
+ emit('update:modelValue', !props.modelValue)
25
+ }
26
+ }
27
+
28
+ const classes = computed(() => [
29
+ 'dt-checkbox',
30
+ `dt-checkbox--${props.size}`,
31
+ props.modelValue && 'dt-checkbox--checked',
32
+ props.disabled && 'dt-checkbox--disabled',
33
+ ].filter(Boolean))
34
+ </script>
35
+
36
+ <template>
37
+ <label :class="classes" :for="inputId">
38
+ <input
39
+ :id="inputId"
40
+ type="checkbox"
41
+ :checked="modelValue"
42
+ :disabled="disabled"
43
+ class="dt-checkbox__input"
44
+ @change="toggle"
45
+ />
46
+ <span class="dt-checkbox__box">
47
+ <svg v-if="modelValue" class="dt-checkbox__check" viewBox="0 0 12 12" fill="none">
48
+ <path d="M2.5 6L5 8.5L9.5 3.5" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
49
+ </svg>
50
+ </span>
51
+ <span v-if="$slots.default" class="dt-checkbox__label">
52
+ <slot />
53
+ </span>
54
+ </label>
55
+ </template>
56
+
57
+ <style scoped>
58
+ .dt-checkbox {
59
+ display: inline-flex;
60
+ align-items: center;
61
+ gap: var(--dt-space-2);
62
+ cursor: pointer;
63
+ user-select: none;
64
+ }
65
+
66
+ .dt-checkbox__input {
67
+ position: absolute;
68
+ opacity: 0;
69
+ width: 0;
70
+ height: 0;
71
+ }
72
+
73
+ .dt-checkbox__box {
74
+ display: flex;
75
+ align-items: center;
76
+ justify-content: center;
77
+ border-radius: var(--dt-radius-xs);
78
+ background: var(--dt-gray-200);
79
+ transition: background-color var(--dt-transition-base);
80
+ flex-shrink: 0;
81
+ }
82
+
83
+ .dt-checkbox:hover:not(.dt-checkbox--disabled) .dt-checkbox__box {
84
+ background: var(--dt-gray-300);
85
+ }
86
+
87
+ .dt-checkbox--checked .dt-checkbox__box {
88
+ background: var(--dt-color-accent);
89
+ }
90
+
91
+ .dt-checkbox--checked:hover:not(.dt-checkbox--disabled) .dt-checkbox__box {
92
+ background: var(--dt-color-accent-hover);
93
+ }
94
+
95
+ .dt-checkbox__check {
96
+ color: #ffffff;
97
+ }
98
+
99
+ /* Sizes */
100
+ .dt-checkbox--lg .dt-checkbox__box {
101
+ width: 24px;
102
+ height: 24px;
103
+ }
104
+ .dt-checkbox--lg .dt-checkbox__check {
105
+ width: 14px;
106
+ height: 14px;
107
+ }
108
+
109
+ .dt-checkbox--md .dt-checkbox__box {
110
+ width: 20px;
111
+ height: 20px;
112
+ }
113
+ .dt-checkbox--md .dt-checkbox__check {
114
+ width: 12px;
115
+ height: 12px;
116
+ }
117
+
118
+ .dt-checkbox--sm .dt-checkbox__box {
119
+ width: 16px;
120
+ height: 16px;
121
+ }
122
+ .dt-checkbox--sm .dt-checkbox__check {
123
+ width: 10px;
124
+ height: 10px;
125
+ }
126
+
127
+ .dt-checkbox__label {
128
+ font-size: var(--dt-text-sm);
129
+ color: var(--dt-color-text);
130
+ }
131
+
132
+ /* Disabled */
133
+ .dt-checkbox--disabled {
134
+ cursor: not-allowed;
135
+ }
136
+ .dt-checkbox--disabled .dt-checkbox__box {
137
+ background: var(--dt-gray-100);
138
+ }
139
+ .dt-checkbox--disabled .dt-checkbox__label {
140
+ color: var(--dt-color-disabled-text);
141
+ }
142
+
143
+ /* Focus */
144
+ .dt-checkbox__input:focus-visible + .dt-checkbox__box {
145
+ outline: 2px solid var(--dt-color-ring);
146
+ outline-offset: 2px;
147
+ }
148
+ </style>
@@ -0,0 +1,2 @@
1
+ export { default as DtCheckbox } from './DtCheckbox.vue'
2
+ export type { CheckboxSize } from './DtCheckbox.vue'