@vifui/styles 0.4.0-alpha.6 → 0.6.0-alpha.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.
package/README.md CHANGED
@@ -23,17 +23,17 @@ npm install @vifui/styles
23
23
 
24
24
  ```js
25
25
  // In your main.js or main entry file
26
- import '@vifui/styles'
26
+ import "@vifui/styles";
27
27
  ```
28
28
 
29
29
  ### Import Specific Components
30
30
 
31
31
  ```js
32
32
  // Import only what you need for better tree-shaking
33
- import '@vifui/styles/base'
34
- import '@vifui/styles/components/button'
35
- import '@vifui/styles/components/card'
36
- import '@vifui/styles/themes/default'
33
+ import "@vifui/styles/base";
34
+ import "@vifui/styles/components/button";
35
+ import "@vifui/styles/components/card";
36
+ import "@vifui/styles/themes/default";
37
37
  ```
38
38
 
39
39
  ## Structure
@@ -66,10 +66,10 @@ import '@vifui/styles/themes/default'
66
66
 
67
67
  ```css
68
68
  /* Primary palette (Vuesax authentic) */
69
- --vuesax-primary: oklch(0.61 0.2 263.6); /* Blue */
70
- --vuesax-success: oklch(0.77 0.2 145.5); /* Green */
71
- --vuesax-warning: oklch(0.82 0.18 83.7); /* Yellow */
72
- --vuesax-danger: oklch(0.62 0.22 10); /* Red */
69
+ --vuesax-primary: oklch(0.61 0.2 263.6); /* Blue */
70
+ --vuesax-success: oklch(0.77 0.2 145.5); /* Green */
71
+ --vuesax-warning: oklch(0.82 0.18 83.7); /* Yellow */
72
+ --vuesax-danger: oklch(0.62 0.22 10); /* Red */
73
73
 
74
74
  /* Semantic tokens */
75
75
  --primary: var(--vuesax-primary);
@@ -101,9 +101,12 @@ import '@vifui/styles/themes/default'
101
101
  ```css
102
102
  --shadow-xs: 0 1px 2px 0 rgba(0, 0, 0, 0.05);
103
103
  --shadow-sm: 0 1px 3px 0 rgba(0, 0, 0, 0.1), 0 1px 2px 0 rgba(0, 0, 0, 0.06);
104
- --shadow-md: 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06);
105
- --shadow-lg: 0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -2px rgba(0, 0, 0, 0.05);
106
- --shadow-xl: 0 20px 25px -5px rgba(0, 0, 0, 0.1), 0 10px 10px -5px rgba(0, 0, 0, 0.04);
104
+ --shadow-md:
105
+ 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06);
106
+ --shadow-lg:
107
+ 0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -2px rgba(0, 0, 0, 0.05);
108
+ --shadow-xl:
109
+ 0 20px 25px -5px rgba(0, 0, 0, 0.1), 0 10px 10px -5px rgba(0, 0, 0, 0.04);
107
110
  ```
108
111
 
109
112
  ### Transitions
@@ -150,15 +153,15 @@ Dark mode is automatically supported. The theme switches based on:
150
153
 
151
154
  ```css
152
155
  /* In your global CSS file */
153
- @import '@vifui/styles';
156
+ @import "@vifui/styles";
154
157
 
155
158
  :root {
156
159
  /* Customize primary color */
157
160
  --primary: oklch(0.7 0.25 270);
158
-
161
+
159
162
  /* Customize radius */
160
163
  --radius: 0.5rem;
161
-
164
+
162
165
  /* Customize transitions */
163
166
  --transition-base: 300ms;
164
167
  }
@@ -168,8 +171,8 @@ Dark mode is automatically supported. The theme switches based on:
168
171
 
169
172
  ```css
170
173
  /* custom-theme.css */
171
- @import '@vifui/styles/base';
172
- @import '@vifui/styles/utilities';
174
+ @import "@vifui/styles/base";
175
+ @import "@vifui/styles/utilities";
173
176
 
174
177
  :root {
175
178
  /* Your custom colors */
@@ -179,8 +182,8 @@ Dark mode is automatically supported. The theme switches based on:
179
182
  }
180
183
 
181
184
  /* Import only needed components */
182
- @import '@vifui/styles/components/button';
183
- @import '@vifui/styles/components/card';
185
+ @import "@vifui/styles/components/button";
186
+ @import "@vifui/styles/components/card";
184
187
  ```
185
188
 
186
189
  ## Tailwind CSS Integration
@@ -190,12 +193,9 @@ This package requires Tailwind CSS 4.0+. Make sure your project is configured:
190
193
  ```js
191
194
  // tailwind.config.js
192
195
  export default {
193
- content: [
194
- './index.html',
195
- './src/**/*.{vue,js,ts,jsx,tsx}',
196
- ],
196
+ content: ["./index.html", "./src/**/*.{vue,js,ts,jsx,tsx}"],
197
197
  // VifUI uses theme colors automatically
198
- }
198
+ };
199
199
  ```
200
200
 
201
201
  ## Browser Support
@@ -206,6 +206,7 @@ export default {
206
206
  - Edge (latest)
207
207
 
208
208
  Modern CSS features used:
209
+
209
210
  - CSS Variables
210
211
  - `oklch()` color space
211
212
  - CSS Grid
@@ -22,13 +22,14 @@
22
22
  .vif-accordion__item {
23
23
  @apply relative;
24
24
  border: 0;
25
+ border-radius: 50px;
25
26
  }
26
27
 
27
28
  /* Divider between items */
28
29
  .vif-accordion__item::after {
29
30
  content: "";
30
31
  @apply absolute inset-x-0 bottom-0 h-px;
31
- border-bottom: 1px solid var(--divider);
32
+ background: var(--divider);
32
33
  }
33
34
 
34
35
  /* Remove divider from last item */
@@ -54,23 +55,32 @@
54
55
  @apply px-4 py-4;
55
56
  @apply text-left text-sm font-medium;
56
57
 
57
- /* Cursor */
58
+ color: var(--foreground);
59
+ background: transparent;
60
+
58
61
  cursor: var(--cursor-interactive);
59
62
 
60
- /* Transitions - smooth like Vuesax */
61
63
  transition:
62
64
  background-color 150ms var(--ease-smooth),
63
65
  opacity 150ms var(--ease-smooth);
64
66
 
65
- /* Hover state - only when closed */
66
67
  &:hover:not([data-state="open"]) {
67
- background: color-mix(in srgb, var(--foreground) 2%, transparent);
68
+ background: var(--default-accordion-hover);
68
69
  border-radius: var(--radius);
69
70
  }
70
71
 
72
+ &:active {
73
+ background: transparent !important;
74
+ }
75
+
76
+ /* Open state */
77
+ &[data-state="open"] {
78
+ background: transparent;
79
+ }
80
+
71
81
  /* Focus state */
72
82
  &:focus-visible {
73
- outline: 1px solid var(--focus);
83
+ outline: 2px solid var(--focus);
74
84
  outline-offset: -2px;
75
85
  }
76
86
 
@@ -128,7 +138,7 @@
128
138
  .vif-accordion__body {
129
139
  @apply px-4 pb-4 pt-0;
130
140
  @apply text-sm;
131
- color: var(--muted);
141
+ color: var(--muted-foreground);
132
142
  }
133
143
 
134
144
  /* ============================================ */
@@ -137,7 +147,8 @@
137
147
 
138
148
  .vif-accordion--bordered {
139
149
  .vif-accordion__item {
140
- @apply border border-default rounded-lg mb-2;
150
+ @apply rounded-lg mb-2;
151
+ border: 1px solid var(--border);
141
152
 
142
153
  &::after {
143
154
  content: none;
@@ -152,7 +163,7 @@
152
163
  .vif-accordion--shadow {
153
164
  .vif-accordion__item {
154
165
  @apply rounded-lg mb-2;
155
- box-shadow: 0 2px 8px 0
166
+ box-shadow: 0 2px 3px 0
156
167
  color-mix(in srgb, var(--foreground) 8%, transparent);
157
168
 
158
169
  &::after {
@@ -167,7 +178,8 @@
167
178
 
168
179
  .vif-accordion--flat {
169
180
  .vif-accordion__item {
170
- @apply bg-default rounded-lg mb-2;
181
+ @apply rounded-lg mb-2;
182
+ background: var(--default);
171
183
 
172
184
  &::after {
173
185
  content: none;
@@ -16,7 +16,7 @@
16
16
  /* Close */
17
17
  /* ============================================ */
18
18
  .vif-alert__close {
19
- @apply absolute right-4 top-4 hover:bg-none! p-0 h-min;
19
+ @apply absolute right-4 top-4 hover:bg-none! p-1 h-min;
20
20
  }
21
21
 
22
22
  /* ============================================ */
@@ -211,3 +211,82 @@
211
211
  opacity: 1;
212
212
  transform: translateY(0);
213
213
  }
214
+
215
+ /* ============================================ */
216
+ /* Close Button Styles */
217
+ /* ============================================ */
218
+
219
+ /* Primary/Solid variants - light close button on dark bg */
220
+ .vif-alert-brand-primary .vif-alert__close,
221
+ .vif-alert-success-primary .vif-alert__close,
222
+ .vif-alert-danger-primary .vif-alert__close,
223
+ .vif-alert-neutral-primary .vif-alert__close {
224
+ @apply text-current opacity-70 hover:opacity-100 hover:bg-white/10;
225
+ }
226
+
227
+ .vif-alert-warning-primary .vif-alert__close {
228
+ @apply text-current opacity-70 hover:opacity-100 hover:bg-black/10;
229
+ }
230
+
231
+ /* Soft variants - colored close button on light bg */
232
+ .vif-alert-brand-soft .vif-alert__close {
233
+ @apply hover:bg-primary/10;
234
+ }
235
+
236
+ .vif-alert-success-soft .vif-alert__close {
237
+ @apply hover:bg-success/10;
238
+ }
239
+
240
+ .vif-alert-warning-soft .vif-alert__close {
241
+ @apply hover:bg-warning/10;
242
+ }
243
+
244
+ .vif-alert-danger-soft .vif-alert__close {
245
+ @apply hover:bg-danger/10;
246
+ }
247
+
248
+ .vif-alert-neutral-soft .vif-alert__close {
249
+ @apply hover:bg-default/20;
250
+ }
251
+
252
+ /* Secondary variants - colored with ring */
253
+ .vif-alert-brand-secondary .vif-alert__close {
254
+ @apply hover:bg-primary/10;
255
+ }
256
+
257
+ .vif-alert-success-secondary .vif-alert__close {
258
+ @apply hover:bg-success/10;
259
+ }
260
+
261
+ .vif-alert-warning-secondary .vif-alert__close {
262
+ @apply hover:bg-warning/10;
263
+ }
264
+
265
+ .vif-alert-danger-secondary .vif-alert__close {
266
+ @apply hover:bg-danger/10;
267
+ }
268
+
269
+ .vif-alert-neutral-secondary .vif-alert__close {
270
+ @apply hover:bg-default/20;
271
+ }
272
+
273
+ /* Outline variants - colored close button */
274
+ .vif-alert-brand-outline .vif-alert__close {
275
+ @apply hover:bg-primary/10;
276
+ }
277
+
278
+ .vif-alert-success-outline .vif-alert__close {
279
+ @apply hover:bg-success/10;
280
+ }
281
+
282
+ .vif-alert-warning-outline .vif-alert__close {
283
+ @apply hover:bg-warning/10;
284
+ }
285
+
286
+ .vif-alert-danger-outline .vif-alert__close {
287
+ @apply hover:bg-danger/10;
288
+ }
289
+
290
+ .vif-alert-neutral-outline .vif-alert__close {
291
+ @apply hover:bg-default/20;
292
+ }
@@ -137,4 +137,4 @@
137
137
 
138
138
  .vif-avatar-group > .vif-avatar:not(:first-child):hover {
139
139
  @apply -translate-x-1;
140
- }
140
+ }
@@ -19,6 +19,12 @@
19
19
  @apply h-10 px-4;
20
20
  @apply text-sm font-medium;
21
21
 
22
+ /* fixes --tw-leading variable not defined */
23
+ @apply leading-0;
24
+
25
+ /* fixes button being squashed up when the screen size is at its smallest */
26
+ @apply min-w-max;
27
+
22
28
  /* Borders */
23
29
  border-radius: var(--radius);
24
30
  border: 0;
@@ -6,5 +6,8 @@
6
6
  @import "./card.css";
7
7
  @import "./checkbox.css";
8
8
  @import "./divider.css";
9
+ @import "./list.css";
9
10
  @import "./spinner.css";
10
11
  @import "./alert.css";
12
+ @import "./tooltip.css";
13
+ @import "./tabs.css";
@@ -0,0 +1,304 @@
1
+ /**
2
+ * List Component
3
+ *
4
+ * Architecture inspired by Vuesax v3 (MIT License)
5
+ * Built with modern Tailwind CSS and CSS variables
6
+ */
7
+
8
+ /* ============================================ */
9
+ /* Base List */
10
+ /* ============================================ */
11
+
12
+ .vif-list {
13
+ @apply relative w-full;
14
+ padding: 5px;
15
+ }
16
+
17
+ /* ============================================ */
18
+ /* List Header */
19
+ /* ============================================ */
20
+
21
+ .vif-list__header {
22
+ @apply flex items-center justify-start;
23
+ @apply font-semibold;
24
+ padding: 8px 0;
25
+ margin-bottom: 5px;
26
+ box-shadow: 0px 7px 7px -5px rgba(0, 0, 0, 0.08);
27
+ color: var(--foreground);
28
+ }
29
+
30
+ /* Dark mode shadow */
31
+ .dark .vif-list__header {
32
+ box-shadow: 0px 7px 7px -5px rgba(0, 0, 0, 0.3);
33
+ }
34
+
35
+ /* Header color variants */
36
+ .vif-list__header--brand {
37
+ color: var(--primary);
38
+ }
39
+
40
+ .vif-list__header--success {
41
+ color: var(--success);
42
+ }
43
+
44
+ .vif-list__header--warning {
45
+ color: var(--warning);
46
+ }
47
+
48
+ .vif-list__header--danger {
49
+ color: var(--danger);
50
+ }
51
+
52
+ .vif-list__header--neutral {
53
+ color: var(--muted-foreground);
54
+ }
55
+
56
+ /* ============================================ */
57
+ /* List Item */
58
+ /* ============================================ */
59
+
60
+ .vif-list__item {
61
+ @apply flex items-center justify-start;
62
+ padding: 5px;
63
+ border-bottom: 1px solid rgba(0, 0, 0, 0.08);
64
+ transition: background-color 150ms var(--ease-smooth);
65
+ }
66
+
67
+ /* Dark mode border */
68
+ .dark .vif-list__item {
69
+ border-bottom: 1px solid rgba(255, 255, 255, 0.08);
70
+ }
71
+
72
+ /* Remove border from last item */
73
+ .vif-list__item:last-child {
74
+ border-bottom: none;
75
+ }
76
+
77
+ /* Hoverable items */
78
+ .vif-list__item--hoverable {
79
+ cursor: var(--cursor-interactive);
80
+ }
81
+
82
+ .vif-list__item--hoverable:hover {
83
+ background: var(--default);
84
+ border-radius: var(--radius);
85
+ }
86
+
87
+ /* Active/Selected item */
88
+ .vif-list__item--active {
89
+ background: var(--default);
90
+ border-radius: var(--radius);
91
+ }
92
+
93
+ /* Interactive button items */
94
+ .vif-list__item[role="listitem"]:is(button) {
95
+ @apply w-full text-left;
96
+ border: none;
97
+ background: transparent;
98
+ font: inherit;
99
+ color: inherit;
100
+ outline: none;
101
+ }
102
+
103
+ /* Keyboard focus */
104
+ .vif-list__item:focus-visible {
105
+ outline: 2px solid var(--focus);
106
+ outline-offset: -2px;
107
+ border-radius: var(--radius);
108
+ }
109
+
110
+ /* Disabled state */
111
+ .vif-list__item[aria-disabled="true"],
112
+ .vif-list__item:disabled {
113
+ opacity: var(--disabled-opacity);
114
+ cursor: var(--cursor-disabled);
115
+ pointer-events: none;
116
+ }
117
+
118
+ /* ============================================ */
119
+ /* List Icon */
120
+ /* ============================================ */
121
+
122
+ .vif-list__icon {
123
+ @apply flex items-center justify-center;
124
+ @apply shrink-0;
125
+ padding: 6px;
126
+
127
+ /* Icon sizing */
128
+ & > * {
129
+ @apply size-5;
130
+ }
131
+ }
132
+
133
+ /* ============================================ */
134
+ /* List Avatar */
135
+ /* ============================================ */
136
+
137
+ .vif-list__avatar {
138
+ @apply flex items-center justify-center;
139
+ @apply shrink-0;
140
+ margin-right: 12px;
141
+ }
142
+
143
+ /* ============================================ */
144
+ /* List Content */
145
+ /* ============================================ */
146
+
147
+ .vif-list__content {
148
+ @apply flex flex-1 flex-col;
149
+ @apply min-w-0; /* Allow text truncation */
150
+ }
151
+
152
+ /* ============================================ */
153
+ /* List Title */
154
+ /* ============================================ */
155
+
156
+ .vif-list__title {
157
+ @apply font-semibold;
158
+ @apply text-sm;
159
+ color: var(--foreground);
160
+ }
161
+
162
+ /* ============================================ */
163
+ /* List Subtitle */
164
+ /* ============================================ */
165
+
166
+ .vif-list__subtitle {
167
+ @apply text-xs;
168
+ color: var(--muted-foreground);
169
+ margin-top: 2px;
170
+ }
171
+
172
+ /* ============================================ */
173
+ /* List Slot (End Content) */
174
+ /* ============================================ */
175
+
176
+ .vif-list__slot {
177
+ @apply ml-auto flex items-center;
178
+ @apply shrink-0;
179
+ }
180
+
181
+ /* ============================================ */
182
+ /* Variant: Bordered */
183
+ /* ============================================ */
184
+
185
+ .vif-list--outline {
186
+ @apply rounded-lg;
187
+ border: 1px solid var(--border);
188
+ padding: 8px;
189
+ }
190
+
191
+ .vif-list--outline .vif-list__item {
192
+ border-bottom: none;
193
+ margin-bottom: 4px;
194
+ padding: 8px;
195
+ border-radius: var(--radius);
196
+ }
197
+
198
+ .vif-list--outline .vif-list__item:last-child {
199
+ margin-bottom: 0;
200
+ }
201
+
202
+ /* ============================================ */
203
+ /* Variant: Shadow */
204
+ /* ============================================ */
205
+
206
+ .vif-list--shadow {
207
+ @apply rounded-lg;
208
+ box-shadow: var(--shadow-md);
209
+ background: var(--surface);
210
+ padding: 8px;
211
+ }
212
+
213
+ .vif-list--shadow .vif-list__item {
214
+ border-bottom: none;
215
+ margin-bottom: 4px;
216
+ padding: 8px;
217
+ border-radius: var(--radius);
218
+ }
219
+
220
+ .vif-list--shadow .vif-list__item:last-child {
221
+ margin-bottom: 0;
222
+ }
223
+
224
+ /* ============================================ */
225
+ /* Variant: Flat */
226
+ /* ============================================ */
227
+
228
+ .vif-list--flat {
229
+ @apply rounded-lg;
230
+ background: var(--default-accordion-hover);
231
+ padding: 8px;
232
+ }
233
+
234
+ .vif-list--flat .vif-list__item {
235
+ border-bottom: none;
236
+ margin-bottom: 4px;
237
+ padding: 8px;
238
+ border-radius: var(--radius);
239
+ }
240
+
241
+ .vif-list--flat .vif-list__item:last-child {
242
+ margin-bottom: 0;
243
+ }
244
+
245
+ .vif-list--flat .vif-list__item--hoverable:hover {
246
+ background: var(--default-hover);
247
+ }
248
+
249
+ /* ============================================ */
250
+ /* Size Variants */
251
+ /* ============================================ */
252
+
253
+ .vif-list--sm {
254
+ padding: 4px;
255
+ }
256
+
257
+ .vif-list--sm .vif-list__item {
258
+ padding: 4px;
259
+ }
260
+
261
+ .vif-list--sm .vif-list__title {
262
+ @apply text-xs;
263
+ }
264
+
265
+ .vif-list--sm .vif-list__subtitle {
266
+ @apply text-[10px];
267
+ }
268
+
269
+ .vif-list--sm .vif-list__icon > * {
270
+ @apply size-4;
271
+ }
272
+
273
+ .vif-list--lg {
274
+ padding: 8px;
275
+ }
276
+
277
+ .vif-list--lg .vif-list__item {
278
+ padding: 12px;
279
+ }
280
+
281
+ .vif-list--lg .vif-list__title {
282
+ @apply text-base;
283
+ }
284
+
285
+ .vif-list--lg .vif-list__subtitle {
286
+ @apply text-sm;
287
+ }
288
+
289
+ .vif-list--lg .vif-list__icon > * {
290
+ @apply size-6;
291
+ }
292
+
293
+ /* ============================================ */
294
+ /* Divider Variant */
295
+ /* ============================================ */
296
+
297
+ .vif-list--divided .vif-list__item {
298
+ border-bottom: 1px solid var(--divider);
299
+ padding: 12px 5px;
300
+ }
301
+
302
+ .vif-list--divided .vif-list__item:last-child {
303
+ border-bottom: none;
304
+ }
@@ -0,0 +1,212 @@
1
+ /**
2
+ * Tab Component - Tailwind v4 + Modern CSS
3
+ */
4
+
5
+ /* ROOT */
6
+ .vif-tabs__root {
7
+ @apply w-full overflow-hidden relative flex;
8
+ }
9
+
10
+ /* ROOT ORIENTATION*/
11
+ .vif-tabs__root[data-orientation="vertical"] {
12
+ @apply flex-row;
13
+
14
+ .vif-tabs__indicator {
15
+ @apply h-(--reka-tabs-indicator-size) left-0 w-0.5 translate-y-(--reka-tabs-indicator-position) translate-x-0.5;
16
+ }
17
+
18
+ .vif-tabs__list {
19
+ @apply flex flex-col;
20
+ }
21
+
22
+ .vif-tabs__list::after {
23
+ @apply w-0.5 left-0 translate-x-0.5 h-full;
24
+ }
25
+
26
+ /* Vertical Pill Indicator - confined to trigger */
27
+ .vif-tabs__indicator:has(~ .vif-tabs__trigger[data-variant="pill"]) {
28
+ @apply inset-0 w-auto h-(--reka-tabs-indicator-size);
29
+ @apply translate-y-(--reka-tabs-indicator-position) translate-x-0;
30
+ @apply mx-1 my-0;
31
+ }
32
+
33
+ .vif-tabs__trigger {
34
+ @apply min-w-full;
35
+ }
36
+ }
37
+
38
+ .vif-tabs__root[data-orientation="horizontal"] {
39
+ @apply flex-col;
40
+
41
+ .vif-tabs__indicator {
42
+ @apply w-(--reka-tabs-indicator-size) bottom-0 h-0.5 translate-x-(--reka-tabs-indicator-position) translate-y-0.5;
43
+ }
44
+
45
+ .vif-tabs__list::after {
46
+ @apply w-full bottom-0 translate-y-0.5 h-0.5;
47
+ }
48
+
49
+ /* Horizontal Pill Indicator - confined to trigger */
50
+ .vif-tabs__indicator:has(~ .vif-tabs__trigger[data-variant="pill"]) {
51
+ @apply inset-0 w-(--reka-tabs-indicator-size) h-auto;
52
+ @apply translate-x-(--reka-tabs-indicator-position) translate-y-0;
53
+ @apply mx-0 my-1;
54
+ }
55
+ }
56
+
57
+ /* LIST */
58
+ .vif-tabs__list {
59
+ @apply relative shrink-0 flex;
60
+ }
61
+
62
+ .vif-tabs__list::after {
63
+ @apply absolute content-[''] z-[-1] bg-(--divider) rounded-full;
64
+ }
65
+
66
+ /* LIST - Pill Variant */
67
+ .vif-tabs__list:has(.vif-tabs__trigger[data-variant="pill"]) {
68
+ @apply after:hidden gap-1 p-1 bg-(--muted)/10 rounded-lg;
69
+ }
70
+
71
+ /* INDICATOR - Base */
72
+ .vif-tabs__indicator {
73
+ @apply absolute transition-all z-0;
74
+ }
75
+
76
+ /* INDICATOR - Link variant keeps rounded-full */
77
+ .vif-tabs__indicator:not(:has(~ .vif-tabs__trigger[data-variant="pill"])) {
78
+ @apply rounded-full;
79
+ }
80
+
81
+ /* INDICATOR - Pill Variant (acts as background) - matches trigger radius */
82
+ .vif-tabs__indicator:has(~ .vif-tabs__trigger[data-variant="pill"]) {
83
+ @apply bg-(--background) rounded-md;
84
+ }
85
+
86
+ /* INDICATOR - Color Variants for Link */
87
+ .vif-tabs__indicator:has(
88
+ ~ .vif-tabs__trigger[data-variant="link"][data-color="brand"][data-state="active"]:not(
89
+ [data-disabled]
90
+ )
91
+ ),
92
+ .vif-tabs__indicator:has(
93
+ ~ .vif-tabs__trigger:not(
94
+ [data-variant]
95
+ )[data-color="brand"][data-state="active"]:not([data-disabled])
96
+ ) {
97
+ @apply bg-(--primary);
98
+ }
99
+
100
+ .vif-tabs__indicator:has(
101
+ ~ .vif-tabs__trigger[data-variant="link"][data-color="danger"][data-state="active"]:not(
102
+ [data-disabled]
103
+ )
104
+ ),
105
+ .vif-tabs__indicator:has(
106
+ ~ .vif-tabs__trigger:not(
107
+ [data-variant]
108
+ )[data-color="danger"][data-state="active"]:not([data-disabled])
109
+ ) {
110
+ @apply bg-(--danger);
111
+ }
112
+
113
+ .vif-tabs__indicator:has(
114
+ ~ .vif-tabs__trigger[data-variant="link"][data-color="success"][data-state="active"]:not(
115
+ [data-disabled]
116
+ )
117
+ ),
118
+ .vif-tabs__indicator:has(
119
+ ~ .vif-tabs__trigger:not(
120
+ [data-variant]
121
+ )[data-color="success"][data-state="active"]:not([data-disabled])
122
+ ) {
123
+ @apply bg-(--success);
124
+ }
125
+
126
+ .vif-tabs__indicator:has(
127
+ ~ .vif-tabs__trigger[data-variant="link"][data-color="neutral"][data-state="active"]:not(
128
+ [data-disabled]
129
+ )
130
+ ),
131
+ .vif-tabs__indicator:has(
132
+ ~ .vif-tabs__trigger:not(
133
+ [data-variant]
134
+ )[data-color="neutral"][data-state="active"]:not([data-disabled])
135
+ ) {
136
+ @apply bg-(--foreground);
137
+ }
138
+
139
+ .vif-tabs__indicator:has(
140
+ ~ .vif-tabs__trigger[data-variant="link"][data-color="warning"][data-state="active"]:not(
141
+ [data-disabled]
142
+ )
143
+ ),
144
+ .vif-tabs__indicator:has(
145
+ ~ .vif-tabs__trigger:not(
146
+ [data-variant]
147
+ )[data-color="warning"][data-state="active"]:not([data-disabled])
148
+ ) {
149
+ @apply bg-(--warning);
150
+ }
151
+
152
+ /* TRIGGER - Base Styles */
153
+ .vif-tabs__trigger {
154
+ @apply relative p-2.5 gap-2 cursor-(--cursor-interactive) flex items-center text-sm leading-none flex-1;
155
+ @apply data-[state=inactive]:not-data-disabled:text-(--muted-foreground);
156
+ @apply data-disabled:cursor-(--cursor-disabled) data-disabled:text-(--muted);
157
+ @apply data-[orientation=vertical]:justify-start;
158
+ @apply data-[orientation=horizontal]:justify-center;
159
+ }
160
+
161
+ /* TRIGGER - Link Variant Colors */
162
+ .vif-tabs__trigger[data-variant="link"],
163
+ .vif-tabs__trigger:not([data-variant]) {
164
+ @apply data-[color=brand]:data-[state=active]:not-data-disabled:text-(--primary);
165
+ @apply data-[color=warning]:data-[state=active]:not-data-disabled:text-(--warning);
166
+ @apply data-[color=neutral]:data-[state=active]:not-data-disabled:text-(--foreground);
167
+ @apply data-[color=success]:data-[state=active]:not-data-disabled:text-(--success);
168
+ @apply data-[color=danger]:data-[state=active]:not-data-disabled:text-(--danger);
169
+ }
170
+
171
+ /* TRIGGER - Pill Variant */
172
+ .vif-tabs__trigger[data-variant="pill"] {
173
+ @apply rounded-md transition-all z-10;
174
+ @apply data-[state=inactive]:not-data-disabled:hover:bg-(--muted)/5;
175
+ @apply data-[state=inactive]:not-data-disabled:hover:text-(--foreground);
176
+ }
177
+
178
+ /* TRIGGER - Pill Variant Active States (text color only, bg handled by indicator) */
179
+ .vif-tabs__trigger[data-variant="pill"][data-color="brand"][data-state="active"]:not(
180
+ [data-disabled]
181
+ ) {
182
+ @apply text-(--primary);
183
+ }
184
+
185
+ .vif-tabs__trigger[data-variant="pill"][data-color="warning"][data-state="active"]:not(
186
+ [data-disabled]
187
+ ) {
188
+ @apply text-(--warning);
189
+ }
190
+
191
+ .vif-tabs__trigger[data-variant="pill"][data-color="neutral"][data-state="active"]:not(
192
+ [data-disabled]
193
+ ) {
194
+ @apply text-(--foreground);
195
+ }
196
+
197
+ .vif-tabs__trigger[data-variant="pill"][data-color="success"][data-state="active"]:not(
198
+ [data-disabled]
199
+ ) {
200
+ @apply text-(--success);
201
+ }
202
+
203
+ .vif-tabs__trigger[data-variant="pill"][data-color="danger"][data-state="active"]:not(
204
+ [data-disabled]
205
+ ) {
206
+ @apply text-(--danger);
207
+ }
208
+
209
+ /* CONTENT */
210
+ .vif-tabs__content {
211
+ @apply relative w-full block p-2.5 flex-1;
212
+ }
@@ -0,0 +1,32 @@
1
+ /**
2
+ * Tooltip component styles
3
+ *
4
+ * Architecture inspired by Vuesax v3 (MIT License)
5
+ * Built with modern Tailwind CSS and CSS variables
6
+ */
7
+
8
+ /* TRIGGER */
9
+ .vif-tooltip__trigger {
10
+ @apply relative;
11
+ }
12
+
13
+ /* CONTENT */
14
+ .vif-tooltip__content {
15
+ @apply select-none leading-none will-change-[transform,opacity];
16
+ @apply shadow-sm rounded-sm ring ring-default pointer-events-auto;
17
+ @apply bg-default px-2.5 py-1 text-xs origin-(--reka-tooltip-content-transform-origin);
18
+ }
19
+
20
+ /* CONTENT ANIMATIONS */
21
+ .vif-tooltip__content[data-state="delayed-open"] {
22
+ animation: vif-scale-in var(--transition-base) var(--ease-out);
23
+ }
24
+
25
+ .vif-tooltip__content[data-state="closed"] {
26
+ animation: vif-scale-out var(--transition-base) var(--ease-in);
27
+ }
28
+
29
+ /* ARROW */
30
+ .vif-tooltip__arrow {
31
+ @apply fill-default;
32
+ }
package/index.css CHANGED
@@ -21,4 +21,3 @@
21
21
 
22
22
  /* Component styles */
23
23
  @import "./components/index.css" layer(components);
24
-
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@vifui/styles",
3
- "version": "0.4.0-alpha.6",
3
+ "version": "0.6.0-alpha.8",
4
4
  "description": "CSS styles and design tokens for VifUI",
5
5
  "license": "MIT",
6
6
  "type": "module",
@@ -68,6 +68,10 @@
68
68
  "default": "./components/divider.css",
69
69
  "style": "./components/divider.css"
70
70
  },
71
+ "./components/list": {
72
+ "default": "./components/list.css",
73
+ "style": "./components/list.css"
74
+ },
71
75
  "./components/spinner": {
72
76
  "default": "./components/spinner.css",
73
77
  "style": "./components/spinner.css"
@@ -68,6 +68,7 @@
68
68
 
69
69
  /* Default/Secondary elements */
70
70
  --default: var(--color-neutral-100);
71
+ --default-accordion-hover: var(--color-neutral-50);
71
72
  --default-foreground: var(--eclipse);
72
73
  --default-hover: var(--color-neutral-200);
73
74
 
@@ -202,6 +203,7 @@
202
203
  /* ============================================ */
203
204
 
204
205
  .dark,
206
+ .htw-dark,
205
207
  [data-theme="dark"] {
206
208
  color-scheme: dark;
207
209