@vialiq/flux-ui 0.13.0 → 0.15.0

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.
@@ -12,5 +12,6 @@
12
12
  @forward 'modal';
13
13
 
14
14
  @forward 'chip';
15
+ @forward 'tag';
15
16
  @forward 'animation';
16
17
  @forward 'switch';
@@ -55,6 +55,14 @@
55
55
  flex-shrink: 0;
56
56
  }
57
57
 
58
+ /* Draggable Modal Header styles */
59
+ .modal-dialog.is-draggable {
60
+ .modal-header {
61
+ cursor: move;
62
+ user-select: none;
63
+ }
64
+ }
65
+
58
66
  .modal-title {
59
67
  font-size: tokens.$font-size-lg;
60
68
  font-weight: tokens.$font-weight-semibold;
@@ -214,4 +222,31 @@
214
222
  animation: none !important;
215
223
  }
216
224
  }
225
+
226
+ /* Responsive Behavior (Mobile) */
227
+ @media (max-width: #{tokens.$breakpoint-sm - 1px}) {
228
+ .modal-dialog:not(.modal-variant-drawer) {
229
+ max-width: 100vw !important;
230
+ width: 100vw !important;
231
+ width: 100dvw !important;
232
+ max-height: 100vh !important;
233
+ height: 100vh !important;
234
+ height: 100dvh !important;
235
+ border-radius: 0 !important;
236
+ margin: 0 !important;
237
+ transform: none !important; // Prevent dragging from offsetting it off-screen
238
+ }
239
+
240
+ .modal-header {
241
+ padding: tokens.$spacing-md; // slightly tighter padding on mobile
242
+ }
243
+
244
+ .modal-body {
245
+ padding: tokens.$spacing-md;
246
+ }
247
+
248
+ .modal-footer {
249
+ padding: tokens.$spacing-md;
250
+ }
251
+ }
217
252
  }
@@ -0,0 +1,448 @@
1
+ @use '../styles/variables' as tokens;
2
+
3
+ @layer components {
4
+ :host,
5
+ :root {
6
+ --vi-tag-height: 24px;
7
+ --vi-tag-padding-x: 10px;
8
+ --vi-tag-border-radius: 4px;
9
+ --vi-tag-font-size: var(--vi-font-size-xs, #{tokens.$font-size-xs});
10
+ --vi-tag-font-weight: var(--vi-font-weight-medium, #{tokens.$font-weight-medium});
11
+ --vi-tag-gap: 6px;
12
+ --vi-tag-remove-size: 16px;
13
+ --vi-tag-dot-size: 6px;
14
+ --vi-tag-avatar-size: 14px;
15
+ --vi-tag-icon-size: 14px;
16
+ --vi-tag-transition: all 150ms cubic-bezier(0.4, 0, 0.2, 1);
17
+ --vi-tag-disabled-opacity: 0.5;
18
+ --vi-tag-max-width: 100%;
19
+ }
20
+
21
+ .tag {
22
+ display: inline-flex;
23
+ align-items: center;
24
+ justify-content: center;
25
+ box-sizing: border-box;
26
+ height: var(--vi-tag-height);
27
+ padding-inline: var(--vi-tag-padding-x);
28
+ border-radius: var(--vi-tag-border-radius);
29
+ font-family: #{tokens.$font-family-base};
30
+ font-size: var(--vi-tag-font-size);
31
+ font-weight: var(--vi-tag-font-weight);
32
+ line-height: 1;
33
+ gap: var(--vi-tag-gap);
34
+ transition: var(--vi-tag-transition);
35
+ user-select: none;
36
+ border: #{tokens.$border-width-thin} solid transparent;
37
+ cursor: default;
38
+ max-width: var(--vi-tag-max-width);
39
+ vertical-align: middle;
40
+ position: relative;
41
+
42
+ // ── Pill shape modifier ──────────────────────────────────────────────────
43
+ &.tag--pill {
44
+ border-radius: 9999px;
45
+ }
46
+
47
+ // ── Removable padding adjustment ──────────────────────────────────────────
48
+ &.tag--removable {
49
+ padding-inline-end: calc(var(--vi-tag-padding-x) - 4px);
50
+ }
51
+
52
+ // ── Content wrapper & optical vertical alignment ─────────────────────────
53
+ .tag-content-wrapper {
54
+ display: inline-flex;
55
+ align-items: center;
56
+ justify-content: center;
57
+ gap: var(--vi-tag-gap);
58
+ min-width: 0;
59
+ flex: 1 1 auto;
60
+ height: 100%;
61
+ line-height: 1;
62
+ outline: none;
63
+ border-radius: inherit;
64
+ }
65
+
66
+ .tag-label {
67
+ overflow: hidden;
68
+ text-overflow: ellipsis;
69
+ white-space: nowrap;
70
+ min-width: 0;
71
+ line-height: 1;
72
+ display: inline-block;
73
+ }
74
+
75
+ // ── Icon & Avatar slots ──────────────────────────────────────────────────
76
+ .tag-icon,
77
+ .tag-avatar,
78
+ .tag-checkmark {
79
+ display: inline-flex;
80
+ align-items: center;
81
+ justify-content: center;
82
+ line-height: 1;
83
+ flex-shrink: 0;
84
+ }
85
+
86
+ .tag-avatar ::slotted(*) {
87
+ width: var(--vi-tag-avatar-size, calc(var(--vi-tag-height) - 10px));
88
+ height: var(--vi-tag-avatar-size, calc(var(--vi-tag-height) - 10px));
89
+ border-radius: 50%;
90
+ object-fit: cover;
91
+ display: block;
92
+ }
93
+
94
+ // ── Status Dot indicator ────────────────────────────────────────────────
95
+ .tag-dot {
96
+ display: inline-block;
97
+ width: var(--vi-tag-dot-size);
98
+ height: var(--vi-tag-dot-size);
99
+ border-radius: 50%;
100
+ background-color: currentColor;
101
+ flex-shrink: 0;
102
+ }
103
+
104
+ // ── Suffix Count Badge ──────────────────────────────────────────────────
105
+ .tag-count {
106
+ display: inline-flex;
107
+ align-items: center;
108
+ justify-content: center;
109
+ padding-inline: 5px;
110
+ height: calc(var(--vi-tag-height) - 10px);
111
+ min-width: calc(var(--vi-tag-height) - 10px);
112
+ font-size: 10px;
113
+ font-weight: #{tokens.$font-weight-semibold};
114
+ border-radius: 9999px;
115
+ background-color: rgba(0, 0, 0, 0.08);
116
+ color: inherit;
117
+ line-height: 1;
118
+ flex-shrink: 0;
119
+ margin-inline-start: 2px;
120
+ }
121
+
122
+ // ── Interactive state styles ─────────────────────────────────────────────
123
+ &.tag-clickable {
124
+ cursor: pointer;
125
+
126
+ &:hover {
127
+ transform: translateY(-1px);
128
+ }
129
+
130
+ &:active {
131
+ transform: translateY(0px) scale(0.98);
132
+ }
133
+ }
134
+
135
+ // ────────────────────────────────────────────────────────────────────────
136
+ // APPEARANCE: Subtle (Soft background tint + subtle border)
137
+ // ────────────────────────────────────────────────────────────────────────
138
+ &.appearance-subtle {
139
+ &.variant-neutral {
140
+ background-color: var(--vi-tag-neutral-bg, #{tokens.$layer-02});
141
+ color: var(--vi-tag-neutral-color, #{tokens.$text-primary});
142
+ border-color: var(--vi-tag-neutral-border, #{tokens.$border-03});
143
+
144
+ &.tag-clickable:hover {
145
+ background-color: var(--vi-tag-neutral-hover-bg, #{tokens.$layer-03});
146
+ border-color: var(--vi-tag-neutral-hover-border, #{tokens.$border-04});
147
+ }
148
+ &.tag-selected {
149
+ background-color: var(--vi-tag-neutral-selected-bg, #{tokens.$layer-03});
150
+ border-color: var(--vi-tag-neutral-selected-border, #{tokens.$color-primary});
151
+ color: var(--vi-tag-neutral-selected-color, #{tokens.$color-primary});
152
+ }
153
+ }
154
+
155
+ &.variant-primary {
156
+ background-color: var(--vi-tag-primary-bg, #{tokens.$bg-info});
157
+ color: var(--vi-tag-primary-color, #{tokens.$text-info});
158
+ border-color: var(--vi-tag-primary-border, #{tokens.$color-blue-300});
159
+
160
+ &.tag-clickable:hover {
161
+ background-color: var(--vi-tag-primary-hover-bg, #{tokens.$color-blue-100});
162
+ border-color: var(--vi-tag-primary-hover-border, #{tokens.$color-blue-400});
163
+ }
164
+ &.tag-selected {
165
+ background-color: var(--vi-tag-primary-selected-bg, #{tokens.$color-blue-100});
166
+ border-color: var(--vi-tag-primary-selected-border, #{tokens.$color-primary});
167
+ color: var(--vi-tag-primary-selected-color, #{tokens.$color-blue-800});
168
+ }
169
+ }
170
+
171
+ &.variant-success {
172
+ background-color: var(--vi-tag-success-bg, #{tokens.$bg-success});
173
+ color: var(--vi-tag-success-color, #{tokens.$text-success});
174
+ border-color: var(--vi-tag-success-border, #{tokens.$color-green-300});
175
+
176
+ &.tag-clickable:hover {
177
+ background-color: var(--vi-tag-success-hover-bg, #{tokens.$color-green-100});
178
+ border-color: var(--vi-tag-success-hover-border, #{tokens.$color-green-400});
179
+ }
180
+ &.tag-selected {
181
+ background-color: var(--vi-tag-success-selected-bg, #{tokens.$color-green-100});
182
+ border-color: var(--vi-tag-success-selected-border, #{tokens.$color-success});
183
+ color: var(--vi-tag-success-selected-color, #{tokens.$color-green-800});
184
+ }
185
+ }
186
+
187
+ &.variant-warning {
188
+ background-color: var(--vi-tag-warning-bg, #{tokens.$bg-warning});
189
+ color: var(--vi-tag-warning-color, #{tokens.$text-warning});
190
+ border-color: var(--vi-tag-warning-border, #{tokens.$color-yellow-300});
191
+
192
+ &.tag-clickable:hover {
193
+ background-color: var(--vi-tag-warning-hover-bg, #{tokens.$color-yellow-100});
194
+ border-color: var(--vi-tag-warning-hover-border, #{tokens.$color-yellow-400});
195
+ }
196
+ &.tag-selected {
197
+ background-color: var(--vi-tag-warning-selected-bg, #{tokens.$color-yellow-100});
198
+ border-color: var(--vi-tag-warning-selected-border, #{tokens.$color-warning});
199
+ color: var(--vi-tag-warning-selected-color, #{tokens.$color-yellow-800});
200
+ }
201
+ }
202
+
203
+ &.variant-danger {
204
+ background-color: var(--vi-tag-danger-bg, #{tokens.$bg-error});
205
+ color: var(--vi-tag-danger-color, #{tokens.$text-error});
206
+ border-color: var(--vi-tag-danger-border, #{tokens.$color-red-300});
207
+
208
+ &.tag-clickable:hover {
209
+ background-color: var(--vi-tag-danger-hover-bg, #{tokens.$color-red-100});
210
+ border-color: var(--vi-tag-danger-hover-border, #{tokens.$color-red-400});
211
+ }
212
+ &.tag-selected {
213
+ background-color: var(--vi-tag-danger-selected-bg, #{tokens.$color-red-100});
214
+ border-color: var(--vi-tag-danger-selected-border, #{tokens.$color-error});
215
+ color: var(--vi-tag-danger-selected-color, #{tokens.$color-red-800});
216
+ }
217
+ }
218
+
219
+ &.variant-info {
220
+ background-color: var(--vi-tag-info-bg, #{tokens.$color-blue-100});
221
+ color: var(--vi-tag-info-color, #{tokens.$color-blue-700});
222
+ border-color: var(--vi-tag-info-border, #{tokens.$color-blue-300});
223
+
224
+ &.tag-clickable:hover {
225
+ background-color: var(--vi-tag-info-hover-bg, #{tokens.$color-blue-200});
226
+ border-color: var(--vi-tag-info-hover-border, #{tokens.$color-blue-500});
227
+ }
228
+ &.tag-selected {
229
+ background-color: var(--vi-tag-info-selected-bg, #{tokens.$color-blue-200});
230
+ border-color: var(--vi-tag-info-selected-border, #{tokens.$color-blue-700});
231
+ color: var(--vi-tag-info-selected-color, #{tokens.$color-blue-900});
232
+ }
233
+ }
234
+
235
+ &.variant-contrast {
236
+ background-color: var(--vi-tag-contrast-bg, #{tokens.$text-primary});
237
+ color: var(--vi-tag-contrast-color, #{tokens.$text-primary-inverse});
238
+ border-color: var(--vi-tag-contrast-border, #{tokens.$text-primary});
239
+
240
+ .tag-count {
241
+ background-color: rgba(255, 255, 255, 0.2);
242
+ }
243
+ }
244
+ }
245
+
246
+ // ────────────────────────────────────────────────────────────────────────
247
+ // APPEARANCE: Outline (Transparent bg, crisp theme border)
248
+ // ────────────────────────────────────────────────────────────────────────
249
+ &.appearance-outline {
250
+ background-color: transparent;
251
+
252
+ &.variant-neutral {
253
+ color: var(--vi-tag-outline-neutral-color, #{tokens.$text-primary});
254
+ border-color: var(--vi-tag-outline-neutral-border, #{tokens.$border-04});
255
+ &.tag-clickable:hover, &.tag-selected {
256
+ background-color: var(--vi-tag-outline-neutral-hover-bg, #{tokens.$layer-02});
257
+ }
258
+ }
259
+
260
+ &.variant-primary {
261
+ color: var(--vi-tag-outline-primary-color, #{tokens.$color-primary});
262
+ border-color: var(--vi-tag-outline-primary-border, #{tokens.$color-primary});
263
+ &.tag-clickable:hover, &.tag-selected {
264
+ background-color: var(--vi-tag-outline-primary-hover-bg, #{tokens.$bg-info});
265
+ }
266
+ }
267
+
268
+ &.variant-success {
269
+ color: var(--vi-tag-outline-success-color, #{tokens.$color-success});
270
+ border-color: var(--vi-tag-outline-success-border, #{tokens.$color-success});
271
+ &.tag-clickable:hover, &.tag-selected {
272
+ background-color: var(--vi-tag-outline-success-hover-bg, #{tokens.$bg-success});
273
+ }
274
+ }
275
+
276
+ &.variant-warning {
277
+ color: var(--vi-tag-outline-warning-color, #{tokens.$color-warning});
278
+ border-color: var(--vi-tag-outline-warning-border, #{tokens.$color-warning});
279
+ &.tag-clickable:hover, &.tag-selected {
280
+ background-color: var(--vi-tag-outline-warning-hover-bg, #{tokens.$bg-warning});
281
+ }
282
+ }
283
+
284
+ &.variant-danger {
285
+ color: var(--vi-tag-outline-danger-color, #{tokens.$color-error});
286
+ border-color: var(--vi-tag-outline-danger-border, #{tokens.$color-error});
287
+ &.tag-clickable:hover, &.tag-selected {
288
+ background-color: var(--vi-tag-outline-danger-hover-bg, #{tokens.$bg-error});
289
+ }
290
+ }
291
+
292
+ &.variant-info {
293
+ color: var(--vi-tag-outline-info-color, #{tokens.$color-blue-700});
294
+ border-color: var(--vi-tag-outline-info-border, #{tokens.$color-blue-500});
295
+ &.tag-clickable:hover, &.tag-selected {
296
+ background-color: var(--vi-tag-outline-info-hover-bg, #{tokens.$color-blue-100});
297
+ }
298
+ }
299
+
300
+ &.variant-contrast {
301
+ color: var(--vi-tag-outline-contrast-color, #{tokens.$text-primary});
302
+ border-color: var(--vi-tag-outline-contrast-border, #{tokens.$text-primary});
303
+ &.tag-clickable:hover, &.tag-selected {
304
+ background-color: var(--vi-tag-outline-contrast-hover-bg, #{tokens.$layer-02});
305
+ }
306
+ }
307
+ }
308
+
309
+ // ────────────────────────────────────────────────────────────────────────
310
+ // APPEARANCE: Solid (Filled theme background)
311
+ // ────────────────────────────────────────────────────────────────────────
312
+ &.appearance-solid {
313
+ border-color: transparent;
314
+ box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05);
315
+
316
+ &.variant-neutral {
317
+ background-color: var(--vi-tag-solid-neutral-bg, #{tokens.$border-inverse-03});
318
+ color: var(--vi-tag-solid-neutral-color, #{tokens.$text-primary-inverse});
319
+ &.tag-clickable:hover, &.tag-selected {
320
+ background-color: var(--vi-tag-solid-neutral-hover-bg, #{tokens.$text-primary});
321
+ }
322
+ }
323
+
324
+ &.variant-primary {
325
+ background-color: var(--vi-tag-solid-primary-bg, #{tokens.$color-primary});
326
+ color: var(--vi-tag-solid-primary-color, #{tokens.$text-primary-inverse});
327
+ &.tag-clickable:hover, &.tag-selected {
328
+ background-color: var(--vi-tag-solid-primary-hover-bg, #{tokens.$color-blue-800});
329
+ }
330
+ }
331
+
332
+ &.variant-success {
333
+ background-color: var(--vi-tag-solid-success-bg, #{tokens.$color-success});
334
+ color: var(--vi-tag-solid-success-color, #{tokens.$text-primary-inverse});
335
+ &.tag-clickable:hover, &.tag-selected {
336
+ background-color: var(--vi-tag-solid-success-hover-bg, #{tokens.$color-green-700});
337
+ }
338
+ }
339
+
340
+ &.variant-warning {
341
+ background-color: var(--vi-tag-solid-warning-bg, #{tokens.$color-warning});
342
+ color: var(--vi-tag-solid-warning-color, #{tokens.$text-primary-inverse});
343
+ &.tag-clickable:hover, &.tag-selected {
344
+ background-color: var(--vi-tag-solid-warning-hover-bg, #{tokens.$color-yellow-700});
345
+ }
346
+ }
347
+
348
+ &.variant-danger {
349
+ background-color: var(--vi-tag-solid-danger-bg, #{tokens.$color-error});
350
+ color: var(--vi-tag-solid-danger-color, #{tokens.$text-primary-inverse});
351
+ &.tag-clickable:hover, &.tag-selected {
352
+ background-color: var(--vi-tag-solid-danger-hover-bg, #{tokens.$color-red-700});
353
+ }
354
+ }
355
+
356
+ &.variant-info {
357
+ background-color: var(--vi-tag-solid-info-bg, #{tokens.$color-blue-600});
358
+ color: var(--vi-tag-solid-info-color, #{tokens.$text-primary-inverse});
359
+ &.tag-clickable:hover, &.tag-selected {
360
+ background-color: var(--vi-tag-solid-info-hover-bg, #{tokens.$color-blue-800});
361
+ }
362
+ }
363
+
364
+ &.variant-contrast {
365
+ background-color: var(--vi-tag-solid-contrast-bg, #{tokens.$text-primary});
366
+ color: var(--vi-tag-solid-contrast-color, #{tokens.$text-primary-inverse});
367
+ }
368
+
369
+ .tag-count {
370
+ background-color: rgba(255, 255, 255, 0.25);
371
+ }
372
+ }
373
+
374
+ // ────────────────────────────────────────────────────────────────────────
375
+ // SIZES
376
+ // ────────────────────────────────────────────────────────────────────────
377
+ &.size-xs {
378
+ --vi-tag-height: 18px;
379
+ --vi-tag-font-size: 10px;
380
+ --vi-tag-padding-x: 6px;
381
+ --vi-tag-gap: 4px;
382
+ --vi-tag-remove-size: 12px;
383
+ --vi-tag-dot-size: 4px;
384
+ --vi-tag-avatar-size: 10px;
385
+ --vi-tag-icon-size: 10px;
386
+ }
387
+
388
+ &.size-sm {
389
+ --vi-tag-height: 20px;
390
+ --vi-tag-font-size: 11px;
391
+ --vi-tag-padding-x: 8px;
392
+ --vi-tag-gap: 5px;
393
+ --vi-tag-remove-size: 14px;
394
+ --vi-tag-dot-size: 5px;
395
+ --vi-tag-avatar-size: 12px;
396
+ --vi-tag-icon-size: 12px;
397
+ }
398
+
399
+ &.size-lg {
400
+ --vi-tag-height: 28px;
401
+ --vi-tag-font-size: 13px;
402
+ --vi-tag-padding-x: 12px;
403
+ --vi-tag-gap: 8px;
404
+ --vi-tag-remove-size: 18px;
405
+ --vi-tag-dot-size: 7px;
406
+ --vi-tag-avatar-size: 18px;
407
+ --vi-tag-icon-size: 16px;
408
+ }
409
+
410
+ // ── Disabled state ───────────────────────────────────────────────────────
411
+ &.is-disabled {
412
+ opacity: var(--vi-tag-disabled-opacity);
413
+ pointer-events: none;
414
+ cursor: not-allowed;
415
+ box-shadow: none !important;
416
+ transform: none !important;
417
+ }
418
+ }
419
+
420
+ // ── Remove Button styling ──────────────────────────────────────────────────
421
+ .tag-remove-btn {
422
+ display: inline-flex;
423
+ align-items: center;
424
+ justify-content: center;
425
+ width: var(--vi-tag-remove-size);
426
+ height: var(--vi-tag-remove-size);
427
+ min-width: var(--vi-tag-remove-size);
428
+ padding: 0;
429
+ border-radius: 50%;
430
+ margin-inline-start: 2px;
431
+ margin-inline-end: 0;
432
+ cursor: pointer;
433
+ background: transparent;
434
+ border: none;
435
+ color: inherit;
436
+ transition: var(--vi-tag-transition);
437
+ flex-shrink: 0;
438
+ line-height: 1;
439
+
440
+ &:hover {
441
+ background-color: rgba(0, 0, 0, 0.12);
442
+ }
443
+
444
+ &:active {
445
+ transform: scale(0.92);
446
+ }
447
+ }
448
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@vialiq/flux-ui",
3
- "version": "0.13.0",
3
+ "version": "0.15.0",
4
4
  "private": false,
5
5
  "publishConfig": {
6
6
  "access": "public"