@threadlabs/looma 0.23.6 → 0.23.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/components/ui-badge/ui-badge.html +34 -3
- package/components/ui-disclosure/ui-disclosure.html +71 -19
- package/components/ui-disclosure/ui-disclosure.js +50 -4
- package/components/ui-nav-item/ui-nav-item.html +16 -11
- package/components/ui-sidebar/ui-sidebar.html +36 -7
- package/components/ui-sidebar/ui-sidebar.js +6 -0
- package/dist/index.js +1 -1
- package/package.json +1 -1
- package/styles/ui-badge.css +31 -0
- package/styles/ui-disclosure.css +65 -17
- package/styles/ui-nav-item.css +14 -11
- package/styles/ui-sidebar.css +34 -6
- package/tokens.css +15 -0
- package/vanilla/UiBadge.d.ts +1 -1
- package/vanilla/UiBadge.js +1 -1
- package/vanilla/UiDisclosure.d.ts +2 -0
- package/vanilla/UiDisclosure.js +33 -18
- package/vanilla/UiNavItem.js +42 -18
- package/vanilla/UiSidebar.js +19 -16
- package/vue/UiBadge.d.ts +3 -3
- package/vue/UiBadge.vue +38 -6
- package/vue/UiDisclosure.d.ts +24 -4
- package/vue/UiDisclosure.vue +130 -22
- package/vue/UiNavItem.d.ts +8 -4
- package/vue/UiNavItem.vue +17 -12
- package/vue/UiSection.d.ts +1 -1
- package/vue/UiSidebar.vue +42 -8
- package/vue/chunks/UiBadge.js +5 -4
- package/vue/chunks/UiDisclosure.js +70 -14
- package/vue/chunks/UiNavItem.js +14 -10
- package/vue/chunks/UiSidebar.js +12 -7
- package/vue/components.css +235 -123
package/vue/UiDisclosure.vue
CHANGED
|
@@ -57,6 +57,14 @@ const propValidityContract = {
|
|
|
57
57
|
'Whether the disclosure is open initially or when set externally. The trigger toggles it from there, reporting each change as an open or close event.',
|
|
58
58
|
default: false,
|
|
59
59
|
},
|
|
60
|
+
requiredOpen: {
|
|
61
|
+
type: { kind: 'terminal', name: 'boolean' },
|
|
62
|
+
required: false,
|
|
63
|
+
target: { attribute: 'requiredopen' },
|
|
64
|
+
description:
|
|
65
|
+
'In a named exclusive group, keeps at least one member open. Clicking the last open trigger does not close it; opening another member transfers the open\n state.',
|
|
66
|
+
default: false,
|
|
67
|
+
},
|
|
60
68
|
summary: {
|
|
61
69
|
type: { kind: 'terminal', name: 'string' },
|
|
62
70
|
required: false,
|
|
@@ -65,6 +73,15 @@ const propValidityContract = {
|
|
|
65
73
|
'The text of the trigger row that opens and closes the disclosure. It is the trigger button\'s accessible name, so name what the content is.',
|
|
66
74
|
default: 'Details',
|
|
67
75
|
},
|
|
76
|
+
variant: {
|
|
77
|
+
type: { kind: 'terminal', name: 'keyword' },
|
|
78
|
+
required: false,
|
|
79
|
+
target: { attribute: 'variant' },
|
|
80
|
+
description:
|
|
81
|
+
'Navigation shares icon columns, spacing, type, hover, and corners with Nav Item. Plain retains the standard disclosure treatment.',
|
|
82
|
+
values: ['plain', 'navigation'],
|
|
83
|
+
default: 'plain',
|
|
84
|
+
},
|
|
68
85
|
},
|
|
69
86
|
} as const
|
|
70
87
|
const props = defineProps({
|
|
@@ -77,7 +94,9 @@ const props = defineProps({
|
|
|
77
94
|
headingLevel: { type: null as unknown as PropType<number | null>, default: 0 },
|
|
78
95
|
name: { type: null as unknown as PropType<string | null>, default: '' },
|
|
79
96
|
open: { type: null as unknown as PropType<boolean | null>, default: false },
|
|
97
|
+
requiredOpen: { type: null as unknown as PropType<boolean | null>, default: false },
|
|
80
98
|
summary: { type: null as unknown as PropType<string | null>, default: 'Details' },
|
|
99
|
+
variant: { type: null as unknown as PropType<'plain' | 'navigation' | null>, default: 'plain' },
|
|
81
100
|
})
|
|
82
101
|
const acceptedProps: Record<string, unknown> = {
|
|
83
102
|
density: 'comfortable',
|
|
@@ -86,7 +105,9 @@ const acceptedProps: Record<string, unknown> = {
|
|
|
86
105
|
headingLevel: 0,
|
|
87
106
|
name: '',
|
|
88
107
|
open: false,
|
|
108
|
+
requiredOpen: false,
|
|
89
109
|
summary: 'Details',
|
|
110
|
+
variant: 'plain',
|
|
90
111
|
}
|
|
91
112
|
const checkedProps = computed(() => ({
|
|
92
113
|
density: checkedProp<'comfortable' | 'compact'>(
|
|
@@ -131,6 +152,13 @@ const checkedProps = computed(() => ({
|
|
|
131
152
|
'open',
|
|
132
153
|
acceptedProps,
|
|
133
154
|
) as boolean,
|
|
155
|
+
requiredOpen: checkedProp<boolean>(
|
|
156
|
+
props['requiredOpen'],
|
|
157
|
+
{ kind: 'terminal', name: 'boolean' },
|
|
158
|
+
false,
|
|
159
|
+
'requiredOpen',
|
|
160
|
+
acceptedProps,
|
|
161
|
+
) as boolean,
|
|
134
162
|
summary: checkedProp<string>(
|
|
135
163
|
props['summary'],
|
|
136
164
|
{ kind: 'terminal', name: 'string' },
|
|
@@ -138,6 +166,13 @@ const checkedProps = computed(() => ({
|
|
|
138
166
|
'summary',
|
|
139
167
|
acceptedProps,
|
|
140
168
|
) as string,
|
|
169
|
+
variant: checkedProp<'plain' | 'navigation'>(
|
|
170
|
+
props['variant'],
|
|
171
|
+
{ kind: 'terminal', name: 'keyword' },
|
|
172
|
+
false,
|
|
173
|
+
'variant',
|
|
174
|
+
acceptedProps,
|
|
175
|
+
) as 'plain' | 'navigation',
|
|
141
176
|
}))
|
|
142
177
|
void checkedProps.value
|
|
143
178
|
watchSyncEffect(() => {
|
|
@@ -199,6 +234,7 @@ const emit = defineEmits<{
|
|
|
199
234
|
}>()
|
|
200
235
|
|
|
201
236
|
const root = ref<HTMLElement | null>(null)
|
|
237
|
+
const headingElement = useTemplateRef<HTMLElement>('heading')
|
|
202
238
|
const triggerElement = useTemplateRef<HTMLElement>('trigger')
|
|
203
239
|
const panelElement = useTemplateRef<HTMLElement>('panel')
|
|
204
240
|
const internalOpen = ref(false)
|
|
@@ -267,6 +303,9 @@ const hostState = computed(() =>
|
|
|
267
303
|
&& `density=${encodeURIComponent(checkedProps.value.density)}`,
|
|
268
304
|
internalOpen.value && 'internalOpen',
|
|
269
305
|
checkedProps.value.fill && 'fill',
|
|
306
|
+
checkedProps.value.variant && 'variant',
|
|
307
|
+
checkedProps.value.variant != null
|
|
308
|
+
&& `variant=${encodeURIComponent(checkedProps.value.variant)}`,
|
|
270
309
|
].filter(Boolean).join(' ')
|
|
271
310
|
)
|
|
272
311
|
|
|
@@ -304,10 +343,20 @@ useComponentHost(() => import('../components/ui-disclosure/ui-disclosure.js'), {
|
|
|
304
343
|
? (incoming[name] ?? incoming[kebab] ?? null)
|
|
305
344
|
: null
|
|
306
345
|
},
|
|
307
|
-
propNames: [
|
|
346
|
+
propNames: [
|
|
347
|
+
'density',
|
|
348
|
+
'disabled',
|
|
349
|
+
'fill',
|
|
350
|
+
'headingLevel',
|
|
351
|
+
'name',
|
|
352
|
+
'open',
|
|
353
|
+
'requiredOpen',
|
|
354
|
+
'summary',
|
|
355
|
+
'variant',
|
|
356
|
+
],
|
|
308
357
|
propValidity: (name: string) =>
|
|
309
358
|
propValidityState({ contract: propValidityContract, values: { ...props } }, name),
|
|
310
|
-
refs: { trigger: triggerElement, panel: panelElement },
|
|
359
|
+
refs: { heading: headingElement, trigger: triggerElement, panel: panelElement },
|
|
311
360
|
state: { internalOpen, contentId, headingRole, headingAriaLevel },
|
|
312
361
|
})
|
|
313
362
|
</script>
|
|
@@ -323,11 +372,13 @@ useComponentHost(() => import('../components/ui-disclosure/ui-disclosure.js'), {
|
|
|
323
372
|
:data-heading-level="reflectedProp('headingLevel', 'heading-level', checkedProps.headingLevel, undefined, false)"
|
|
324
373
|
:data-name="reflectedProp('name', 'name', checkedProps.name, undefined, false)"
|
|
325
374
|
:data-open="reflectedProp('open', 'open', checkedProps.open, undefined, false)"
|
|
375
|
+
:data-required-open="reflectedProp('requiredOpen', 'required-open', checkedProps.requiredOpen, undefined, false)"
|
|
326
376
|
:data-summary="reflectedProp('summary', 'summary', checkedProps.summary, undefined, false)"
|
|
377
|
+
:data-variant="reflectedProp('variant', 'variant', checkedProps.variant, undefined, false)"
|
|
327
378
|
:data-ui-disclosure-state="hostState || undefined"
|
|
328
379
|
ref="root"
|
|
329
380
|
>
|
|
330
|
-
<div class="heading" :role="guarded" :aria-level="guardedBinding">
|
|
381
|
+
<div class="heading" :role="guarded" :aria-level="guardedBinding" ref="heading">
|
|
331
382
|
<button
|
|
332
383
|
class="trigger"
|
|
333
384
|
type="button"
|
|
@@ -336,8 +387,11 @@ useComponentHost(() => import('../components/ui-disclosure/ui-disclosure.js'), {
|
|
|
336
387
|
:disabled="checkedProps.disabled ?? undefined"
|
|
337
388
|
ref="trigger"
|
|
338
389
|
>
|
|
390
|
+
<span class="leading"><slot name="leading" /></span>
|
|
339
391
|
<span class="summary"><slot name="summary">{{ checkedProps.summary }}</slot></span>
|
|
340
|
-
<
|
|
392
|
+
<span class="indicator" aria-hidden="true"><slot name="indicator"><span
|
|
393
|
+
class="chevron"
|
|
394
|
+
></span></slot></span>
|
|
341
395
|
</button>
|
|
342
396
|
</div>
|
|
343
397
|
<div class="panel" :id="guardedBinding4" ref="panel">
|
|
@@ -390,8 +444,7 @@ useComponentHost(() => import('../components/ui-disclosure/ui-disclosure.js'), {
|
|
|
390
444
|
}
|
|
391
445
|
|
|
392
446
|
.trigger {
|
|
393
|
-
display:
|
|
394
|
-
grid-template-columns: minmax(0, 1fr) auto;
|
|
447
|
+
display: flex;
|
|
395
448
|
gap: var(--ui-space-3);
|
|
396
449
|
align-items: center;
|
|
397
450
|
inline-size: 100%;
|
|
@@ -422,20 +475,42 @@ useComponentHost(() => import('../components/ui-disclosure/ui-disclosure.js'), {
|
|
|
422
475
|
cursor: not-allowed;
|
|
423
476
|
}
|
|
424
477
|
|
|
478
|
+
.summary {
|
|
479
|
+
flex: 1;
|
|
480
|
+
min-inline-size: 0;
|
|
481
|
+
}
|
|
482
|
+
|
|
483
|
+
.leading,
|
|
484
|
+
.indicator {
|
|
485
|
+
display: inline-flex;
|
|
486
|
+
align-items: center;
|
|
487
|
+
justify-content: center;
|
|
488
|
+
flex: none;
|
|
489
|
+
}
|
|
490
|
+
.leading:empty {
|
|
491
|
+
display: none;
|
|
492
|
+
}
|
|
493
|
+
.indicator {
|
|
494
|
+
transition: transform var(--ui-motion-feedback) var(--ui-motion-feedback-ease);
|
|
495
|
+
}
|
|
496
|
+
[data-component~="ui-disclosure"][data-ui-disclosure-state~="internalOpen"] .indicator {
|
|
497
|
+
transform: rotate(180deg);
|
|
498
|
+
}
|
|
499
|
+
|
|
425
500
|
.chevron {
|
|
426
501
|
inline-size: 0.5rem;
|
|
427
502
|
block-size: 0.5rem;
|
|
428
503
|
border-inline-end: 2px solid currentColor;
|
|
429
504
|
border-block-end: 2px solid currentColor;
|
|
430
505
|
transform: rotate(45deg) translate(-1px, -1px);
|
|
431
|
-
transition: transform var(--ui-motion-fast) var(--ui-motion-ease);
|
|
432
506
|
}
|
|
433
507
|
|
|
434
508
|
.panel {
|
|
435
509
|
display: grid;
|
|
436
510
|
grid-template-rows: 0fr;
|
|
437
|
-
transition:
|
|
438
|
-
var(--ui-motion-
|
|
511
|
+
transition:
|
|
512
|
+
grid-template-rows var(--ui-motion-reveal) var(--ui-motion-reveal-ease),
|
|
513
|
+
content-visibility var(--ui-motion-reveal) allow-discrete;
|
|
439
514
|
}
|
|
440
515
|
|
|
441
516
|
.panel-inner {
|
|
@@ -450,22 +525,22 @@ useComponentHost(() => import('../components/ui-disclosure/ui-disclosure.js'), {
|
|
|
450
525
|
[data-component~="ui-disclosure"][data-ui-disclosure-state~="internalOpen"] .panel-inner {
|
|
451
526
|
padding-block: 0 var(--ui-space-3);
|
|
452
527
|
}
|
|
453
|
-
[data-component~="ui-disclosure"][data-ui-disclosure-state~="internalOpen"] .chevron {
|
|
454
|
-
transform: rotate(225deg) translate(-1px, -1px);
|
|
455
|
-
}
|
|
456
528
|
|
|
457
529
|
/* A bounded accordion owns one flexible body, so its trigger never scrolls away. The
|
|
458
530
|
* normal content-sized layout and its animation remain unchanged when fill is omitted. */
|
|
459
531
|
[data-component~="ui-disclosure"][data-ui-disclosure-state~="fill"] {
|
|
460
532
|
display: flex;
|
|
461
533
|
flex-direction: column;
|
|
462
|
-
flex:
|
|
463
|
-
min-block-size:
|
|
534
|
+
flex: 0 0 var(--_ui-disclosure-heading-size, var(--_trigger-min-block-size));
|
|
535
|
+
min-block-size: calc(
|
|
536
|
+
var(--_ui-disclosure-heading-size, var(--_trigger-min-block-size)) + var(--ui-border-width)
|
|
537
|
+
);
|
|
538
|
+
transition: flex-grow var(--ui-motion-layout) var(--ui-motion-layout-ease);
|
|
464
539
|
border-block-end: 0;
|
|
465
540
|
border-block-start: var(--ui-border-width) solid var(--ui-border-divider);
|
|
466
541
|
}
|
|
467
542
|
[data-component~="ui-disclosure"][data-ui-disclosure-state~="fill"][data-ui-disclosure-state~="internalOpen"] {
|
|
468
|
-
flex: 1;
|
|
543
|
+
flex-grow: 1;
|
|
469
544
|
}
|
|
470
545
|
[data-component~="ui-disclosure"][data-ui-disclosure-state~="fill"] .heading {
|
|
471
546
|
flex: none;
|
|
@@ -474,14 +549,8 @@ useComponentHost(() => import('../components/ui-disclosure/ui-disclosure.js'), {
|
|
|
474
549
|
border-radius: 0;
|
|
475
550
|
}
|
|
476
551
|
[data-component~="ui-disclosure"][data-ui-disclosure-state~="fill"] .panel {
|
|
477
|
-
display: flex;
|
|
478
552
|
flex: 1;
|
|
479
553
|
min-block-size: 0;
|
|
480
|
-
transition: none;
|
|
481
|
-
}
|
|
482
|
-
[data-component~="ui-disclosure"][data-ui-disclosure-state~="fill"] .panel[hidden] {
|
|
483
|
-
flex: none;
|
|
484
|
-
block-size: 0;
|
|
485
554
|
}
|
|
486
555
|
[data-component~="ui-disclosure"][data-ui-disclosure-state~="fill"] .panel-inner {
|
|
487
556
|
display: flex;
|
|
@@ -491,9 +560,48 @@ useComponentHost(() => import('../components/ui-disclosure/ui-disclosure.js'), {
|
|
|
491
560
|
padding: 0;
|
|
492
561
|
}
|
|
493
562
|
|
|
563
|
+
[data-component~="ui-disclosure"][data-ui-disclosure-state~="variant=navigation"] .trigger {
|
|
564
|
+
gap: var(--ui-nav-gap);
|
|
565
|
+
padding-inline: var(--ui-nav-padding-inline);
|
|
566
|
+
min-block-size: var(--ui-nav-min-block-size);
|
|
567
|
+
padding-block: var(--ui-nav-padding-block);
|
|
568
|
+
border-radius: var(--ui-selection-radius);
|
|
569
|
+
font-size: var(--ui-font-size-md);
|
|
570
|
+
font-weight: var(--ui-font-normal);
|
|
571
|
+
color: var(--ui-text-secondary);
|
|
572
|
+
}
|
|
573
|
+
[data-component~="ui-disclosure"][data-ui-disclosure-state~="variant=navigation"][data-ui-disclosure-state~="density=compact"]
|
|
574
|
+
.trigger {
|
|
575
|
+
padding-inline: var(--ui-nav-compact-padding-inline);
|
|
576
|
+
padding-block: var(--ui-nav-compact-padding-block);
|
|
577
|
+
min-block-size: var(--ui-nav-compact-min-block-size);
|
|
578
|
+
font-size: var(--ui-font-size-sm);
|
|
579
|
+
}
|
|
580
|
+
[data-component~="ui-disclosure"][data-ui-disclosure-state~="variant=navigation"]
|
|
581
|
+
.trigger:hover:not(:disabled) {
|
|
582
|
+
background: var(--ui-nav-hover-surface);
|
|
583
|
+
color: var(--ui-text-primary);
|
|
584
|
+
}
|
|
585
|
+
[data-component~="ui-disclosure"][data-ui-disclosure-state~="variant=navigation"][data-ui-disclosure-state~="internalOpen"]
|
|
586
|
+
.trigger {
|
|
587
|
+
color: var(--ui-selection-text);
|
|
588
|
+
}
|
|
589
|
+
[data-component~="ui-disclosure"][data-ui-disclosure-state~="variant=navigation"]
|
|
590
|
+
:is(.leading, .indicator) {
|
|
591
|
+
inline-size: var(--ui-nav-icon-size);
|
|
592
|
+
font-size: var(--ui-nav-icon-size);
|
|
593
|
+
}
|
|
594
|
+
@media (pointer: coarse) {
|
|
595
|
+
[data-component~="ui-disclosure"][data-ui-disclosure-state~="variant=navigation"][data-ui-disclosure-state~="density=compact"]
|
|
596
|
+
.trigger {
|
|
597
|
+
min-block-size: var(--ui-control-min-block-size);
|
|
598
|
+
}
|
|
599
|
+
}
|
|
600
|
+
|
|
494
601
|
@media (prefers-reduced-motion: reduce) {
|
|
602
|
+
[data-component~="ui-disclosure"][data-ui-disclosure-state~="fill"],
|
|
495
603
|
.panel,
|
|
496
|
-
.
|
|
604
|
+
.indicator {
|
|
497
605
|
transition: none;
|
|
498
606
|
}
|
|
499
607
|
}
|
package/vue/UiNavItem.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { PropType } from 'vue';
|
|
2
|
-
declare var __VLS_1: {}, __VLS_3: {}, __VLS_5: {}, __VLS_7: {}, __VLS_9: {}, __VLS_11: {};
|
|
2
|
+
declare var __VLS_1: {}, __VLS_3: {}, __VLS_5: {}, __VLS_7: {}, __VLS_9: {}, __VLS_11: {}, __VLS_13: {}, __VLS_15: {};
|
|
3
3
|
type __VLS_Slots = {} & {
|
|
4
4
|
leading?: (props: typeof __VLS_1) => any;
|
|
5
5
|
} & {
|
|
@@ -7,11 +7,15 @@ type __VLS_Slots = {} & {
|
|
|
7
7
|
} & {
|
|
8
8
|
description?: (props: typeof __VLS_5) => any;
|
|
9
9
|
} & {
|
|
10
|
-
|
|
10
|
+
trailing?: (props: typeof __VLS_7) => any;
|
|
11
11
|
} & {
|
|
12
|
-
|
|
12
|
+
leading?: (props: typeof __VLS_9) => any;
|
|
13
13
|
} & {
|
|
14
|
-
|
|
14
|
+
default?: (props: typeof __VLS_11) => any;
|
|
15
|
+
} & {
|
|
16
|
+
description?: (props: typeof __VLS_13) => any;
|
|
17
|
+
} & {
|
|
18
|
+
trailing?: (props: typeof __VLS_15) => any;
|
|
15
19
|
};
|
|
16
20
|
declare const __VLS_base: import("vue").DefineComponent<import("vue").ExtractPropTypes<{
|
|
17
21
|
as: {
|
package/vue/UiNavItem.vue
CHANGED
|
@@ -267,7 +267,8 @@ function attribute(value: unknown): any {
|
|
|
267
267
|
><span class="indicator" aria-hidden="true"></span>
|
|
268
268
|
<span class="leading"><slot name="leading" /></span>
|
|
269
269
|
<span class="content"><span class="label"><slot /></span>
|
|
270
|
-
<span class="description"><slot name="description" /></span></span
|
|
270
|
+
<span class="description"><slot name="description" /></span></span>
|
|
271
|
+
<span class="trailing"><slot name="trailing" /></span></a>
|
|
271
272
|
<button
|
|
272
273
|
v-else
|
|
273
274
|
data-component="ui-nav-item"
|
|
@@ -307,6 +308,7 @@ function attribute(value: unknown): any {
|
|
|
307
308
|
<span class="leading"><slot name="leading" /></span>
|
|
308
309
|
<span class="content"><span class="label"><slot /></span>
|
|
309
310
|
<span class="description"><slot name="description" /></span></span>
|
|
311
|
+
<span class="trailing"><slot name="trailing" /></span>
|
|
310
312
|
</button>
|
|
311
313
|
</template>
|
|
312
314
|
|
|
@@ -340,13 +342,13 @@ function attribute(value: unknown): any {
|
|
|
340
342
|
box-sizing: border-box;
|
|
341
343
|
display: flex;
|
|
342
344
|
align-items: center;
|
|
343
|
-
gap: var(--ui-
|
|
345
|
+
gap: var(--ui-nav-gap);
|
|
344
346
|
inline-size: var(--ui-nav-item-inline-size, 100%);
|
|
345
347
|
min-inline-size: 0;
|
|
346
|
-
min-block-size: var(--ui-
|
|
348
|
+
min-block-size: var(--ui-nav-min-block-size);
|
|
347
349
|
margin: 0;
|
|
348
|
-
padding-block: var(--ui-
|
|
349
|
-
padding-inline: var(--ui-
|
|
350
|
+
padding-block: var(--ui-nav-padding-block);
|
|
351
|
+
padding-inline: var(--ui-nav-padding-inline);
|
|
350
352
|
border: 0;
|
|
351
353
|
border-radius: var(--ui-selection-radius);
|
|
352
354
|
background: transparent;
|
|
@@ -363,7 +365,7 @@ function attribute(value: unknown): any {
|
|
|
363
365
|
}
|
|
364
366
|
|
|
365
367
|
[data-component~="ui-nav-item"]:hover:not([aria-current]) {
|
|
366
|
-
background: var(--ui-
|
|
368
|
+
background: var(--ui-nav-hover-surface);
|
|
367
369
|
color: var(--ui-text-primary);
|
|
368
370
|
}
|
|
369
371
|
|
|
@@ -412,12 +414,15 @@ function attribute(value: unknown): any {
|
|
|
412
414
|
}
|
|
413
415
|
}
|
|
414
416
|
|
|
415
|
-
.leading
|
|
417
|
+
.leading,
|
|
418
|
+
.trailing {
|
|
416
419
|
display: inline-flex;
|
|
417
420
|
flex: none;
|
|
418
421
|
align-items: center;
|
|
422
|
+
justify-content: center;
|
|
423
|
+
inline-size: var(--ui-nav-icon-size);
|
|
419
424
|
color: inherit;
|
|
420
|
-
font-size: var(--ui-
|
|
425
|
+
font-size: var(--ui-nav-icon-size);
|
|
421
426
|
}
|
|
422
427
|
|
|
423
428
|
.content {
|
|
@@ -450,11 +455,10 @@ function attribute(value: unknown): any {
|
|
|
450
455
|
}
|
|
451
456
|
|
|
452
457
|
[data-component~="ui-nav-item"][data-ui-nav-item-state~="density=compact"] {
|
|
453
|
-
min-block-size: var(--ui-
|
|
454
|
-
padding-block: var(--ui-
|
|
455
|
-
padding-inline: var(--ui-
|
|
458
|
+
min-block-size: var(--ui-nav-compact-min-block-size);
|
|
459
|
+
padding-block: var(--ui-nav-compact-padding-block);
|
|
460
|
+
padding-inline: var(--ui-nav-compact-padding-inline);
|
|
456
461
|
}
|
|
457
|
-
[data-component~="ui-nav-item"][data-ui-nav-item-state~="density=compact"] .leading,
|
|
458
462
|
[data-component~="ui-nav-item"][data-ui-nav-item-state~="density=compact"] .label {
|
|
459
463
|
font-size: var(--ui-font-size-sm);
|
|
460
464
|
}
|
|
@@ -467,6 +471,7 @@ function attribute(value: unknown): any {
|
|
|
467
471
|
|
|
468
472
|
/* An unused region takes no space. */
|
|
469
473
|
.leading:empty,
|
|
474
|
+
.trailing:empty,
|
|
470
475
|
.description:empty {
|
|
471
476
|
display: none;
|
|
472
477
|
}
|
package/vue/UiSection.d.ts
CHANGED
|
@@ -35,7 +35,7 @@ declare const __VLS_base: import("vue").DefineComponent<import("vue").ExtractPro
|
|
|
35
35
|
};
|
|
36
36
|
}>> & Readonly<{}>, {
|
|
37
37
|
tone: "neutral" | "danger" | null;
|
|
38
|
-
variant: "
|
|
38
|
+
variant: "plain" | "card" | "divided" | null;
|
|
39
39
|
heading: string | null;
|
|
40
40
|
}, {}, {}, {}, string, import("vue").ComponentProvideOptions, true, {}, any>;
|
|
41
41
|
declare const __VLS_export: __VLS_WithSlots<typeof __VLS_base, __VLS_Slots>;
|
package/vue/UiSidebar.vue
CHANGED
|
@@ -224,6 +224,7 @@ const root = ref<HTMLElement | null>(null)
|
|
|
224
224
|
const resizerElement = useTemplateRef<HTMLElement>('resizer')
|
|
225
225
|
const internalCollapsed = ref(false)
|
|
226
226
|
const drawer = ref(false)
|
|
227
|
+
const resizing = ref(false)
|
|
227
228
|
let guardedPrevious: any
|
|
228
229
|
const guarded = computed(() => {
|
|
229
230
|
if (
|
|
@@ -234,6 +235,7 @@ const guarded = computed(() => {
|
|
|
234
235
|
})
|
|
235
236
|
provide('html-next:ui-sidebar:internalCollapsed', internalCollapsed)
|
|
236
237
|
provide('html-next:ui-sidebar:drawer', drawer)
|
|
238
|
+
provide('html-next:ui-sidebar:resizing', resizing)
|
|
237
239
|
const hydrationNode = hydrationInstance?.vnode.el
|
|
238
240
|
if (
|
|
239
241
|
typeof window !== 'undefined' && hydrationNode != null
|
|
@@ -257,6 +259,7 @@ const hostState = computed(() =>
|
|
|
257
259
|
checkedProps.value.side && 'side',
|
|
258
260
|
checkedProps.value.side != null && `side=${encodeURIComponent(checkedProps.value.side)}`,
|
|
259
261
|
internalCollapsed.value && 'internalCollapsed',
|
|
262
|
+
resizing.value && 'resizing',
|
|
260
263
|
].filter(Boolean).join(' ')
|
|
261
264
|
)
|
|
262
265
|
|
|
@@ -314,7 +317,7 @@ useComponentHost(() => import('../components/ui-sidebar/ui-sidebar.js'), {
|
|
|
314
317
|
propValidity: (name: string) =>
|
|
315
318
|
propValidityState({ contract: propValidityContract, values: { ...props } }, name),
|
|
316
319
|
refs: { resizer: resizerElement },
|
|
317
|
-
state: { internalCollapsed, drawer },
|
|
320
|
+
state: { internalCollapsed, drawer, resizing },
|
|
318
321
|
})
|
|
319
322
|
</script>
|
|
320
323
|
|
|
@@ -335,7 +338,7 @@ useComponentHost(() => import('../components/ui-sidebar/ui-sidebar.js'), {
|
|
|
335
338
|
:data-ui-sidebar-state="hostState || undefined"
|
|
336
339
|
ref="root"
|
|
337
340
|
>
|
|
338
|
-
<div class="content"><slot /></div>
|
|
341
|
+
<div class="viewport"><div class="content"><slot /></div></div>
|
|
339
342
|
<div
|
|
340
343
|
class="resizer"
|
|
341
344
|
role="separator"
|
|
@@ -369,10 +372,15 @@ useComponentHost(() => import('../components/ui-sidebar/ui-sidebar.js'), {
|
|
|
369
372
|
syntax: "*";
|
|
370
373
|
inherits: false;
|
|
371
374
|
}
|
|
375
|
+
@property --ui-sidebar-collapsed-width {
|
|
376
|
+
syntax: "*";
|
|
377
|
+
inherits: false;
|
|
378
|
+
}
|
|
372
379
|
|
|
373
380
|
[data-component~="ui-sidebar"] {
|
|
374
381
|
/* Hooks do not inherit, so the parts below read them from the root. */
|
|
375
382
|
--_ui-sidebar-backdrop: var(--ui-sidebar-backdrop);
|
|
383
|
+
--_ui-sidebar-expanded-width: var(--_sidebar-width, var(--ui-sidebar-width, 280px));
|
|
376
384
|
|
|
377
385
|
position: relative;
|
|
378
386
|
box-sizing: border-box;
|
|
@@ -385,6 +393,9 @@ useComponentHost(() => import('../components/ui-sidebar/ui-sidebar.js'), {
|
|
|
385
393
|
background: var(--ui-sidebar-surface, var(--ui-surface-default));
|
|
386
394
|
border-inline-end: var(--ui-border-width) solid
|
|
387
395
|
var(--ui-sidebar-border, var(--ui-border-divider));
|
|
396
|
+
transition:
|
|
397
|
+
inline-size var(--ui-motion-layout) var(--ui-motion-layout-ease),
|
|
398
|
+
visibility var(--ui-motion-layout);
|
|
388
399
|
}
|
|
389
400
|
|
|
390
401
|
[data-component~="ui-sidebar"][data-ui-sidebar-state~="side=end"] {
|
|
@@ -395,10 +406,17 @@ useComponentHost(() => import('../components/ui-sidebar/ui-sidebar.js'), {
|
|
|
395
406
|
|
|
396
407
|
/* The panel's content scrolls, and each edge that hides content fades: the scroll fade every
|
|
397
408
|
Looma scroller uses (see ui-scroll-area). */
|
|
398
|
-
.
|
|
409
|
+
.viewport {
|
|
399
410
|
flex: 1;
|
|
400
411
|
min-block-size: 0;
|
|
412
|
+
overflow: clip;
|
|
413
|
+
}
|
|
414
|
+
.content {
|
|
415
|
+
block-size: 100%;
|
|
416
|
+
inline-size: calc(var(--_ui-sidebar-expanded-width) - var(--ui-border-width));
|
|
417
|
+
min-block-size: 0;
|
|
401
418
|
overflow: auto;
|
|
419
|
+
transition: transform var(--ui-motion-layout) var(--ui-motion-layout-ease);
|
|
402
420
|
--_ui-scroll-fade-direction: to bottom;
|
|
403
421
|
--_ui-scroll-fade-size: var(--ui-scroll-fade-size, 24px);
|
|
404
422
|
mask-image: linear-gradient(
|
|
@@ -423,7 +441,18 @@ useComponentHost(() => import('../components/ui-sidebar/ui-sidebar.js'), {
|
|
|
423
441
|
|
|
424
442
|
/* Collapsed while docked. */
|
|
425
443
|
[data-component~="ui-sidebar"][data-ui-sidebar-state~="internalCollapsed"]:not([popover]) {
|
|
426
|
-
|
|
444
|
+
inline-size: var(--ui-sidebar-collapsed-width, 0px);
|
|
445
|
+
visibility: hidden;
|
|
446
|
+
}
|
|
447
|
+
[data-component~="ui-sidebar"][data-ui-sidebar-state~="resizing"] {
|
|
448
|
+
transition: none;
|
|
449
|
+
}
|
|
450
|
+
[data-component~="ui-sidebar"][data-ui-sidebar-state~="internalCollapsed"]:not([popover]) .content {
|
|
451
|
+
transform: translateX(-100%);
|
|
452
|
+
}
|
|
453
|
+
[data-component~="ui-sidebar"][data-ui-sidebar-state~="side=end"][data-ui-sidebar-state~="internalCollapsed"]:not([popover])
|
|
454
|
+
.content {
|
|
455
|
+
transform: translateX(100%);
|
|
427
456
|
}
|
|
428
457
|
|
|
429
458
|
.resizer {
|
|
@@ -506,9 +535,9 @@ useComponentHost(() => import('../components/ui-sidebar/ui-sidebar.js'), {
|
|
|
506
535
|
box-shadow: var(--ui-elevation-overlay, var(--ui-shadow-lg));
|
|
507
536
|
transform: translateX(0);
|
|
508
537
|
transition:
|
|
509
|
-
transform var(--ui-motion-
|
|
510
|
-
display var(--ui-motion-
|
|
511
|
-
overlay var(--ui-motion-
|
|
538
|
+
transform var(--ui-motion-reveal) var(--ui-motion-reveal-ease),
|
|
539
|
+
display var(--ui-motion-reveal) allow-discrete,
|
|
540
|
+
overlay var(--ui-motion-reveal) allow-discrete;
|
|
512
541
|
}
|
|
513
542
|
|
|
514
543
|
/* The author display above would otherwise override the UA rule that hides a closed popover. */
|
|
@@ -538,9 +567,14 @@ useComponentHost(() => import('../components/ui-sidebar/ui-sidebar.js'), {
|
|
|
538
567
|
[data-component~="ui-sidebar"][popover]::backdrop {
|
|
539
568
|
background: var(--_ui-sidebar-backdrop, rgb(0 0 0 / 0.32));
|
|
540
569
|
}
|
|
570
|
+
[data-component~="ui-sidebar"][popover] .content {
|
|
571
|
+
inline-size: 100%;
|
|
572
|
+
}
|
|
541
573
|
|
|
542
574
|
@media (prefers-reduced-motion: reduce) {
|
|
543
|
-
[data-component~="ui-sidebar"]
|
|
575
|
+
[data-component~="ui-sidebar"],
|
|
576
|
+
[data-component~="ui-sidebar"][popover],
|
|
577
|
+
.content {
|
|
544
578
|
transition: none;
|
|
545
579
|
}
|
|
546
580
|
}
|
package/vue/chunks/UiBadge.js
CHANGED
|
@@ -42,11 +42,12 @@ var UiBadge_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @__PURE
|
|
|
42
42
|
},
|
|
43
43
|
required: false,
|
|
44
44
|
target: { attribute: "shape" },
|
|
45
|
-
description: "Silhouette. pill is rounded at both ends; tag is a pointed label. dot is a compact circular signal with visually hidden text: include a state label, or set\n aria-hidden when the surrounding control already names that state.",
|
|
45
|
+
description: "Silhouette. pill is rounded at both ends; tag is a pointed label. dot is a compact circular signal with visually hidden text: include a state label, or set\n aria-hidden when the surrounding control already names that state. square is a fixed rounded square for an icon or single glyph beside a heading; hide a\n decorative icon when adjacent words name it.",
|
|
46
46
|
values: [
|
|
47
47
|
"pill",
|
|
48
48
|
"tag",
|
|
49
|
-
"dot"
|
|
49
|
+
"dot",
|
|
50
|
+
"square"
|
|
50
51
|
],
|
|
51
52
|
default: "pill"
|
|
52
53
|
},
|
|
@@ -57,7 +58,7 @@ var UiBadge_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @__PURE
|
|
|
57
58
|
},
|
|
58
59
|
required: false,
|
|
59
60
|
target: { attribute: "size" },
|
|
60
|
-
description: "Scale. xs is a compact count beside small controls; md is the usual text badge.",
|
|
61
|
+
description: "Scale. xs is a compact count beside small controls; md is the usual text badge. A square is 24px at xs and 32px at md with default spacing.",
|
|
61
62
|
values: ["xs", "md"],
|
|
62
63
|
default: "md"
|
|
63
64
|
},
|
|
@@ -168,6 +169,6 @@ var UiBadge_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @__PURE
|
|
|
168
169
|
}]]);
|
|
169
170
|
};
|
|
170
171
|
}
|
|
171
|
-
}), [["__scopeId", "data-v-
|
|
172
|
+
}), [["__scopeId", "data-v-470f6e28"]]);
|
|
172
173
|
//#endregion
|
|
173
174
|
export { UiBadge_default as t };
|