@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 +25 -24
- package/components/accordion.css +22 -10
- package/components/alert.css +80 -1
- package/components/avatar.css +1 -1
- package/components/button.css +6 -0
- package/components/index.css +3 -0
- package/components/list.css +304 -0
- package/components/tabs.css +212 -0
- package/components/tooltip.css +32 -0
- package/index.css +0 -1
- package/package.json +5 -1
- package/themes/default.css +2 -0
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
|
|
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
|
|
34
|
-
import
|
|
35
|
-
import
|
|
36
|
-
import
|
|
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);
|
|
70
|
-
--vuesax-success: oklch(0.77 0.2 145.5);
|
|
71
|
-
--vuesax-warning: oklch(0.82 0.18 83.7);
|
|
72
|
-
--vuesax-danger: oklch(0.62 0.22 10);
|
|
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:
|
|
105
|
-
|
|
106
|
-
--shadow-
|
|
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
|
|
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
|
|
172
|
-
@import
|
|
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
|
|
183
|
-
@import
|
|
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
|
package/components/accordion.css
CHANGED
|
@@ -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
|
-
|
|
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
|
-
|
|
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:
|
|
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:
|
|
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
|
|
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
|
|
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
|
|
181
|
+
@apply rounded-lg mb-2;
|
|
182
|
+
background: var(--default);
|
|
171
183
|
|
|
172
184
|
&::after {
|
|
173
185
|
content: none;
|
package/components/alert.css
CHANGED
|
@@ -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-
|
|
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
|
+
}
|
package/components/avatar.css
CHANGED
package/components/button.css
CHANGED
|
@@ -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;
|
package/components/index.css
CHANGED
|
@@ -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
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@vifui/styles",
|
|
3
|
-
"version": "0.
|
|
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"
|
package/themes/default.css
CHANGED
|
@@ -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
|
|