@ -5,6 +5,7 @@
type CarouselVariant,
type CarouselVariant,
type CarouselColor
type CarouselColor
} from '$uix/eidos/components/carousel';
} from '$uix/eidos/components/carousel';
import type { CarouselAlign , CarouselProviderSnippetProps } from '$soma/components/carousel';
import { compileMorfo } from '$uix/morfo';
import { compileMorfo } from '$uix/morfo';
import { carouselMorfo } from '@/uix/morfo/components/carousel';
import { carouselMorfo } from '@/uix/morfo/components/carousel';
import { getActiveUix } from '$active-uix';
import { getActiveUix } from '$active-uix';
@ -17,17 +18,40 @@
// ── Live state ────────────────────────────────────────────────────────
// ── Live state ────────────────────────────────────────────────────────
let value = $state(0);
let value = $state(0);
let orientation = $state< 'horizontal' | 'vertical'>('horizontal');
let orientation = $state< 'horizontal' | 'vertical'>('horizontal');
// Layout
let slidesPerView = $state(1);
let slidesToScroll = $state(1);
let align = $state< CarouselAlign > ('start');
let gap = $state(0); // in rem; converted to `${ gap } rem` when forwarded
let verticalBlockSize = $state(16); // rem
let loop = $state(false);
let loop = $state(false);
// Drag
let dragEnabled = $state(true);
let dragEnabled = $state(true);
let dragThreshold = $state(0.25);
// Autoplay
let autoplay = $state(false);
let autoplay = $state(false);
let autoplayDelay = $state(4000);
let autoplayDelay = $state(4000);
let playOnInit = $state(true);
let pauseOnHover = $state(true);
let pauseOnHover = $state(true);
let stopOnInteraction = $state(false);
let stopOnFocusIn = $state(true);
let stopOnMouseEnter = $state(false);
let stopOnLastSnap = $state(false);
let disabled = $state(false);
let disabled = $state(false);
let size = $state< CarouselSize > ('md');
let size = $state< CarouselSize > ('md');
let variant = $state< CarouselVariant > ('surface');
let variant = $state< CarouselVariant > ('surface');
let color = $state< CarouselColor > ('primary');
let color = $state< CarouselColor > ('primary');
// Imperative-API demo: store the handle exposed via the snippet so the
// footer buttons + keyboard shortcut can drive the carousel.
let api = $state< CarouselProviderSnippetProps [ ' api ' ] | null > (null);
let isPlaying = $state(false);
type TraceEntry = { event : string ; family : string ; intent? : string ; at : number } ;
type TraceEntry = { event : string ; family : string ; intent? : string ; at : number } ;
let trace = $state< TraceEntry [ ] > ([]);
let trace = $state< TraceEntry [ ] > ([]);
let stageRef = $state< HTMLElement | null > (null);
let stageRef = $state< HTMLElement | null > (null);
@ -82,14 +106,25 @@
'< Carousel ' ,
'< Carousel ' ,
' bind:value',
' bind:value',
orientation !== 'horizontal' && ` orientation="${ orientation } "`,
orientation !== 'horizontal' && ` orientation="${ orientation } "`,
slidesPerView !== 1 && ` slidesPerView={ $ { slidesPerView }} `,
slidesToScroll !== 1 && ` slidesToScroll={ $ { slidesToScroll }} `,
align !== 'start' && ` align="${ align } "`,
gap !== 0 && ` gap="${ gap } rem"`,
orientation === 'vertical' && verticalBlockSize !== 16 && ` verticalBlockSize="${ verticalBlockSize } rem"`,
size !== 'md' && ` size="${ size } "`,
size !== 'md' && ` size="${ size } "`,
variant !== 'surface' && ` variant="${ variant } "`,
variant !== 'surface' && ` variant="${ variant } "`,
color !== 'primary' && ` color="${ color } "`,
color !== 'primary' && ` color="${ color } "`,
loop & & ' loop',
loop & & ' loop',
!dragEnabled && ' dragEnabled={ false } ',
!dragEnabled && ' dragEnabled={ false } ',
dragEnabled && dragThreshold !== 0.25 && ` dragThreshold={ $ { dragThreshold }} `,
autoplay & & ' autoplay',
autoplay & & ' autoplay',
autoplay && autoplayDelay !== 4000 && ` autoplayDelay={ $ { autoplayDelay }} `,
autoplay && autoplayDelay !== 4000 && ` autoplayDelay={ $ { autoplayDelay }} `,
autoplay && !playOnInit && ' playOnInit={ false } ',
autoplay && !pauseOnHover && ' pauseOnHover={ false } ',
autoplay && !pauseOnHover && ' pauseOnHover={ false } ',
autoplay & & stopOnInteraction & & ' stopOnInteraction',
autoplay && !stopOnFocusIn && ' stopOnFocusIn={ false } ',
autoplay & & stopOnMouseEnter & & ' stopOnMouseEnter',
autoplay & & stopOnLastSnap & & ' stopOnLastSnap',
disabled & & ' disabled',
disabled & & ' disabled',
'>',
'>',
' < Carousel.Viewport > ',
' < Carousel.Viewport > ',
@ -146,52 +181,66 @@
< div data-uix-stage >
< div data-uix-stage >
< div data-uix-stage-area bind:this = { stageRef } style="padding: var ( --uix-space-3 ); display: flex ; justify-content: center ;" >
< div data-uix-stage-area bind:this = { stageRef } style="padding: var ( --uix-space-3 ); display: flex ; justify-content: center ;" >
< div style = "inline-size: min( 36rem, 100%); { orientation === 'vertical' ? 'block-size: 18rem;' : '' } " >
< div style = "inline-size: min( 40rem, 100%);" >
< Carousel
< Carousel
bind:value
bind:value
{ orientation }
{ orientation }
{ slidesPerView }
{ slidesToScroll }
{ align }
gap="{ gap } rem"
verticalBlockSize="{ verticalBlockSize } rem"
{ loop }
{ loop }
{ dragEnabled }
{ dragEnabled }
{ dragThreshold }
{ autoplay }
{ autoplay }
{ autoplayDelay }
{ autoplayDelay }
{ playOnInit }
{ pauseOnHover }
{ pauseOnHover }
{ stopOnInteraction }
{ stopOnFocusIn }
{ stopOnMouseEnter }
{ stopOnLastSnap }
{ disabled }
{ disabled }
{ size }
{ size }
{ variant }
{ variant }
{ color }
{ color }
>
>
< Carousel.Viewport >
{ # snippet children ( snippet : CarouselProviderSnippetProps )}
< Carousel.ItemGroup >
{( api = snippet . api , isPlaying = snippet . isPlaying , '' )}
{ #each slides as slide , i ( slide . label )}
< Carousel.Viewport >
< Carousel.Item index = { i } >
< Carousel.ItemGroup >
< div
{ #each slides as slide , i ( slide . label )}
style="
< Carousel.Item index = { i } >
display: flex;
< div
flex-direction: column;
style="
align-items: center;
display: flex;
justify-content: center;
flex-direction: column;
background: { slide . tone } ;
align-items: center;
color: var(--color-content-primary);
justify-content: center;
padding: var(--space-6) var(--space-4);
background: { slide . tone } ;
border-radius: var(--radius-md);
color: var(--color-content-primary);
{ orientation === 'vertical' ? 'block-size: 100%;' : 'min-block-size: 12rem;' }
padding: var(--space-6) var(--space-4);
user-select: none;
border-radius: var(--radius-md);
"
{ orientation === 'vertical' ? 'block-size: 100%;' : 'min-block-size: 12rem;' }
>
user-select: none;
< strong style = "font-size: var(--font-size-lg); margin-block-end: var(--space-2);" > { slide . label } </ strong >
"
< span style = "font-size: var(--font-size-sm); color: var(--color-content-secondary);" > { slide . sub } </ span >
>
< / div >
< strong style = "font-size: var(--font-size-lg); margin-block-end: var(--space-2);" > { slide . label } </ strong >
< / Carousel.Item >
< span style = "font-size: var(--font-size-sm); color: var(--color-content-secondary);" > { slide . sub } </ span >
< / div >
< / Carousel.Item >
{ /each }
< / Carousel.ItemGroup >
< Carousel.PrevTrigger / >
< Carousel.NextTrigger / >
< / Carousel.Viewport >
< Carousel.IndicatorGroup >
{ #each slides as _ , i ( i )}
< Carousel.Indicator index = { i } / >
{ /each }
{ /each }
< / Carousel.ItemGroup >
< / Carousel.IndicatorGroup >
< Carousel.PrevTrigger / >
{ /snippet }
< Carousel.NextTrigger / >
< / Carousel.Viewport >
< Carousel.IndicatorGroup >
{ #each slides as _ , i ( i )}
< Carousel.Indicator index = { i } / >
{ /each }
< / Carousel.IndicatorGroup >
< / Carousel >
< / Carousel >
< / div >
< / div >
< / div >
< / div >
@ -239,7 +288,7 @@
< / p >
< / p >
< div data-uix-subsection-head >
< div data-uix-subsection-head >
< span data-uix-layer-badge = "soma" > soma< / span > Provider props
< span data-uix-layer-badge = "soma" > soma< / span > layout
< / div >
< / div >
< div data-uix-controls >
< div data-uix-controls >
< label data-uix-control >
< label data-uix-control >
@ -250,6 +299,40 @@
{ /each }
{ /each }
< / span >
< / span >
< / label >
< / label >
< label data-uix-control >
< span data-uix-control-label > slidesPerView< / span >
< span data-uix-chips role = "radiogroup" >
{ #each [ 1 , 2 , 3 , 4 ] as n ( n )}
< button data-uix-chip data-active = { slidesPerView === n } onclick= {() => ( slidesPerView = n )} > { n } </ button >
{ /each }
< / span >
< / label >
< label data-uix-control >
< span data-uix-control-label > slidesToScroll< / span >
< span data-uix-chips role = "radiogroup" >
{ #each [ 1 , 2 , 3 ] as n ( n )}
< button data-uix-chip data-active = { slidesToScroll === n } onclick= {() => ( slidesToScroll = n )} > { n } </ button >
{ /each }
< / span >
< / label >
< label data-uix-control >
< span data-uix-control-label > align< / span >
< span data-uix-chips role = "radiogroup" >
{ #each [ 'start' , 'center' , 'end' ] as a ( a )}
< button data-uix-chip data-active = { align === a } onclick= {() => ( align = a as CarouselAlign )} > { a } </ button >
{ /each }
< / span >
< / label >
< label data-uix-control >
< span data-uix-control-label > gap (rem)< / span >
< input type = "range" min = "0" max = "2" step = "0.25" bind:value = { gap } / >
< span data-uix-control-label-aux > { gap } </ span >
< / label >
< label data-uix-control >
< span data-uix-control-label > verticalBlockSize (rem)< / span >
< input type = "range" min = "8" max = "32" step = "1" bind:value = { verticalBlockSize } disabled= { orientation !== 'vertical' } />
< span data-uix-control-label-aux > { verticalBlockSize } </ span >
< / label >
< label data-uix-control >
< label data-uix-control >
< span data-uix-control-label > loop< / span >
< span data-uix-control-label > loop< / span >
< span data-uix-switch >
< span data-uix-switch >
@ -257,6 +340,19 @@
< span data-uix-switch-label > { loop ? 'on' : 'off' } </ span >
< span data-uix-switch-label > { loop ? 'on' : 'off' } </ span >
< / span >
< / span >
< / label >
< / label >
< label data-uix-control >
< span data-uix-control-label > disabled< / span >
< span data-uix-switch >
< input type = "checkbox" bind:checked = { disabled } / >
< span data-uix-switch-label > { disabled ? 'on' : 'off' } </ span >
< / span >
< / label >
< / div >
< div data-uix-subsection-head >
< span data-uix-layer-badge = "soma" > soma< / span > drag
< / div >
< div data-uix-controls >
< label data-uix-control >
< label data-uix-control >
< span data-uix-control-label > dragEnabled< / span >
< span data-uix-control-label > dragEnabled< / span >
< span data-uix-switch >
< span data-uix-switch >
@ -264,6 +360,17 @@
< span data-uix-switch-label > { dragEnabled ? 'on' : 'off' } </ span >
< span data-uix-switch-label > { dragEnabled ? 'on' : 'off' } </ span >
< / span >
< / span >
< / label >
< / label >
< label data-uix-control >
< span data-uix-control-label > dragThreshold (0– 1)< / span >
< input type = "range" min = "0.05" max = "0.6" step = "0.05" bind:value = { dragThreshold } disabled= { ! dragEnabled } />
< span data-uix-control-label-aux > { dragThreshold . toFixed ( 2 )} </ span >
< / label >
< / div >
< div data-uix-subsection-head >
< span data-uix-layer-badge = "soma" > soma< / span > autoplay
< / div >
< div data-uix-controls >
< label data-uix-control >
< label data-uix-control >
< span data-uix-control-label > autoplay< / span >
< span data-uix-control-label > autoplay< / span >
< span data-uix-switch >
< span data-uix-switch >
@ -276,6 +383,13 @@
< input type = "range" min = "1000" max = "8000" step = "500" bind:value = { autoplayDelay } disabled= { ! autoplay } />
< input type = "range" min = "1000" max = "8000" step = "500" bind:value = { autoplayDelay } disabled= { ! autoplay } />
< span data-uix-control-label-aux > { autoplayDelay } </ span >
< span data-uix-control-label-aux > { autoplayDelay } </ span >
< / label >
< / label >
< label data-uix-control >
< span data-uix-control-label > playOnInit< / span >
< span data-uix-switch >
< input type = "checkbox" bind:checked = { playOnInit } disabled= { ! autoplay } />
< span data-uix-switch-label > { playOnInit ? 'on' : 'off' } </ span >
< / span >
< / label >
< label data-uix-control >
< label data-uix-control >
< span data-uix-control-label > pauseOnHover< / span >
< span data-uix-control-label > pauseOnHover< / span >
< span data-uix-switch >
< span data-uix-switch >
@ -284,12 +398,50 @@
< / span >
< / span >
< / label >
< / label >
< label data-uix-control >
< label data-uix-control >
< span data-uix-control-label > disabled < / span >
< span data-uix-control-label > stopOnInteraction < / span >
< span data-uix-switch >
< span data-uix-switch >
< input type = "checkbox" bind:checked = { disabled} / >
< input type = "checkbox" bind:checked = { stopOnInteraction} disabled= { ! autoplay } / >
< span data-uix-switch-label > { disabled ? 'on' : 'off' } </ span >
< span data-uix-switch-label > { stopOnInteraction ? 'on' : 'off' } </ span >
< / span >
< / span >
< / label >
< / label >
< label data-uix-control >
< span data-uix-control-label > stopOnFocusIn< / span >
< span data-uix-switch >
< input type = "checkbox" bind:checked = { stopOnFocusIn } disabled= { ! autoplay } />
< span data-uix-switch-label > { stopOnFocusIn ? 'on' : 'off' } </ span >
< / span >
< / label >
< label data-uix-control >
< span data-uix-control-label > stopOnMouseEnter< / span >
< span data-uix-switch >
< input type = "checkbox" bind:checked = { stopOnMouseEnter } disabled= { ! autoplay } />
< span data-uix-switch-label > { stopOnMouseEnter ? 'on' : 'off' } </ span >
< / span >
< / label >
< label data-uix-control >
< span data-uix-control-label > stopOnLastSnap< / span >
< span data-uix-switch >
< input type = "checkbox" bind:checked = { stopOnLastSnap } disabled= { ! autoplay || loop } />
< span data-uix-switch-label > { stopOnLastSnap ? 'on' : 'off' } </ span >
< / span >
< / label >
< / div >
< div data-uix-subsection-head >
< span data-uix-layer-badge = "soma" > soma< / span > imperative API
< span style = "margin-inline-start: auto; color: var(--color-content-secondary); font-size: var(--font-size-xs);" >
exposed via the < code > api< / code > snippet prop — drive the carousel from external buttons
< / span >
< / div >
< div data-uix-controls >
< button data-uix-chip onclick = {() => api ? . scrollPrev ()} > scrollPrev()</button >
< button data-uix-chip onclick = {() => api ? . scrollNext ()} > scrollNext()</button >
< button data-uix-chip onclick = {() => api ? . scrollTo ( 0 )} > scrollTo(0)</button >
< button data-uix-chip onclick = {() => api ? . scrollTo ( slides . length - 1 )} > scrollTo(last)</button >
< button data-uix-chip onclick = {() => api ? . play ()} disabled= { ! autoplay || isPlaying } > play()</ button >
< button data-uix-chip onclick = {() => api ? . pause ()} disabled= { ! autoplay || ! isPlaying } > pause()</ button >
< button data-uix-chip onclick = {() => api ? . reset ()} disabled= { ! autoplay } > reset()</ button >
< span data-uix-control-label-aux > isPlaying = { isPlaying } </ span >
< / div >
< / div >
< div data-uix-subsection-head >
< div data-uix-subsection-head >
@ -344,20 +496,31 @@
< thead > < tr > < th > Prop< / th > < th > Type< / th > < th > Default< / th > < th > Description< / th > < / tr > < / thead >
< thead > < tr > < th > Prop< / th > < th > Type< / th > < th > Default< / th > < th > Description< / th > < / tr > < / thead >
< tbody >
< tbody >
< tr > < td class = "name" > value < span data-uix-tag data-kind = "bindable" > bindable< / span > < / td > < td class = "type" > number< / td > < td class = "default" > 0< / td > < td > Current slide index (0-based).< / td > < / tr >
< tr > < td class = "name" > value < span data-uix-tag data-kind = "bindable" > bindable< / span > < / td > < td class = "type" > number< / td > < td class = "default" > 0< / td > < td > Current slide index (0-based).< / td > < / tr >
< tr > < td class = "name" > defaultValue< / td > < td class = "type" > number< / td > < td class = "default" > 0< / td > < td > Initial slide index when uncontrolled.< / td > < / tr >
< tr > < td class = "name" > onValueChange< / td > < td class = "type" > (i: number) => void< / td > < td class = "default empty" > —< / td > < td > Called on every index change.< / td > < / tr >
< tr > < td class = "name" > onValueChange< / td > < td class = "type" > (i: number) => void< / td > < td class = "default empty" > —< / td > < td > Called on every index change.< / td > < / tr >
< tr > < td class = "name" > orientation< / td > < td class = "type" > 'horizontal' | 'vertical'< / td > < td class = "default" > 'horizontal'< / td > < td > Scroll axis.< / td > < / tr >
< tr > < td class = "name" > orientation< / td > < td class = "type" > 'horizontal' | 'vertical'< / td > < td class = "default" > 'horizontal'< / td > < td > Scroll axis.< / td > < / tr >
< tr > < td class = "name" > slidesPerView< / td > < td class = "type" > number< / td > < td class = "default" > 1< / td > < td > Slides visible at once (each Item basis = 100% / slidesPerView).< / td > < / tr >
< tr > < td class = "name" > slidesToScroll< / td > < td class = "type" > number< / td > < td class = "default" > 1< / td > < td > Slides advanced per next() / prev().< / td > < / tr >
< tr > < td class = "name" > align< / td > < td class = "type" > 'start' | 'center' | 'end'< / td > < td class = "default" > 'start'< / td > < td > Alignment of active slide(s) within viewport.< / td > < / tr >
< tr > < td class = "name" > gap< / td > < td class = "type" > string (CSS length)< / td > < td class = "default" > '0px'< / td > < td > Inline-axis gap between slides.< / td > < / tr >
< tr > < td class = "name" > loop< / td > < td class = "type" > boolean< / td > < td class = "default" > false< / td > < td > Wrap at edges (also wraps autoplay).< / td > < / tr >
< tr > < td class = "name" > loop< / td > < td class = "type" > boolean< / td > < td class = "default" > false< / td > < td > Wrap at edges (also wraps autoplay).< / td > < / tr >
< tr > < td class = "name" > dragEnabled< / td > < td class = "type" > boolean< / td > < td class = "default" > true< / td > < td > Allow pointer drag to scrub.< / td > < / tr >
< tr > < td class = "name" > dragEnabled< / td > < td class = "type" > boolean< / td > < td class = "default" > true< / td > < td > Allow pointer drag to scrub.< / td > < / tr >
< tr > < td class = "name" > dragThreshold< / td > < td class = "type" > number< / td > < td class = "default" > 0.25< / td > < td > Release fraction past which next slide commits.< / td > < / tr >
< tr > < td class = "name" > dragThreshold< / td > < td class = "type" > number (0– 1) < / td > < td class = "default" > 0.25< / td > < td > Release fraction past which next slide commits.< / td > < / tr >
< tr > < td class = "name" > autoplay< / td > < td class = "type" > boolean< / td > < td class = "default" > false< / td > < td > Enable timer-driven advance.< / td > < / tr >
< tr > < td class = "name" > autoplay< / td > < td class = "type" > boolean< / td > < td class = "default" > false< / td > < td > Enable timer-driven advance.< / td > < / tr >
< tr > < td class = "name" > autoplayDelay< / td > < td class = "type" > number< / td > < td class = "default" > 4000< / td > < td > Interval in milliseconds.< / td > < / tr >
< tr > < td class = "name" > autoplayDelay< / td > < td class = "type" > number (ms)< / td > < td class = "default" > 4000< / td > < td > Interval in milliseconds.< / td > < / tr >
< tr > < td class = "name" > pauseOnHover< / td > < td class = "type" > boolean< / td > < td class = "default" > true< / td > < td > Pause autoplay while hovered / focused.< / td > < / tr >
< tr > < td class = "name" > playOnInit< / td > < td class = "type" > boolean< / td > < td class = "default" > true< / td > < td > Start the autoplay timer on mount.< / td > < / tr >
< tr > < td class = "name" > pauseOnHover< / td > < td class = "type" > boolean< / td > < td class = "default" > true< / td > < td > Pause autoplay while hovered.< / td > < / tr >
< tr > < td class = "name" > stopOnInteraction< / td > < td class = "type" > boolean< / td > < td class = "default" > false< / td > < td > Latch-stop after user clicks prev/next/indicator or drags.< / td > < / tr >
< tr > < td class = "name" > stopOnFocusIn< / td > < td class = "type" > boolean< / td > < td class = "default" > true< / td > < td > Pause while focus is inside root.< / td > < / tr >
< tr > < td class = "name" > stopOnMouseEnter< / td > < td class = "type" > boolean< / td > < td class = "default" > false< / td > < td > Pause while cursor over root (Embla parity).< / td > < / tr >
< tr > < td class = "name" > stopOnLastSnap< / td > < td class = "type" > boolean< / td > < td class = "default" > false< / td > < td > Latch-stop when last snap reached (loop=false only).< / td > < / tr >
< tr > < td class = "name" > disabled< / td > < td class = "type" > boolean< / td > < td class = "default" > false< / td > < td > Disable all navigation.< / td > < / tr >
< tr > < td class = "name" > disabled< / td > < td class = "type" > boolean< / td > < td class = "default" > false< / td > < td > Disable all navigation.< / td > < / tr >
< tr > < td class = "name" > aria-label< / td > < td class = "type" > string< / td > < td class = "default empty" > —< / td > < td > Override accessible name (falls back to lang ref).< / td > < / tr >
< tr > < td class = "name" > aria-label< / td > < td class = "type" > string< / td > < td class = "default empty" > —< / td > < td > Override accessible name (falls back to lang ref).< / td > < / tr >
< tr > < td class = "name" > variant < span data-uix-tag data-kind = "eidos" > eidos< / span > < / td > < td class = "type" > ControlVariant: 'surface' | 'outline' | 'ghost'< / td > < td class = "default" > 'surface'< / td > < td > Container chrome.< / td > < / tr >
< tr > < td class = "name" > variant < span data-uix-tag data-kind = "eidos" > eidos< / span > < / td > < td class = "type" > ControlVariant: 'surface' | 'outline' | 'ghost'< / td > < td class = "default" > 'surface'< / td > < td > Container chrome.< / td > < / tr >
< tr > < td class = "name" > size < span data-uix-tag data-kind = "eidos" > eidos< / span > < / td > < td class = "type" > 'xs' | 'sm' | 'md' | 'lg' | 'xl'< / td > < td class = "default" > 'md'< / td > < td > Cascades to indicator + trigger size.< / td > < / tr >
< tr > < td class = "name" > size < span data-uix-tag data-kind = "eidos" > eidos< / span > < / td > < td class = "type" > 'xs' | 'sm' | 'md' | 'lg' | 'xl'< / td > < td class = "default" > 'md'< / td > < td > Cascades to indicator + trigger size.< / td > < / tr >
< tr > < td class = "name" > color < span data-uix-tag data-kind = "eidos" > eidos< / span > < / td > < td class = "type" > ColorRole< / td > < td class = "default" > 'primary'< / td > < td > Indicator + focus accent.< / td > < / tr >
< tr > < td class = "name" > color < span data-uix-tag data-kind = "eidos" > eidos< / span > < / td > < td class = "type" > ColorRole< / td > < td class = "default" > 'primary'< / td > < td > Indicator + focus accent.< / td > < / tr >
< tr > < td class = "name" > block < span data-uix-tag data-kind = "eidos" > eidos< / span > < / td > < td class = "type" > boolean< / td > < td class = "default" > true< / td > < td > Stretch root inline-size to container.< / td > < / tr >
< tr > < td class = "name" > block < span data-uix-tag data-kind = "eidos" > eidos< / span > < / td > < td class = "type" > boolean< / td > < td class = "default" > true< / td > < td > Stretch root inline-size to container.< / td > < / tr >
< tr > < td class = "name" > verticalBlockSize < span data-uix-tag data-kind = "eidos" > eidos< / span > < / td > < td class = "type" > string (CSS length)< / td > < td class = "default" > '16rem'< / td > < td > Viewport block-size in vertical orientation.< / td > < / tr >
< / tbody >
< / tbody >
< / table >
< / table >
< / div >
< / div >