@ -1,155 +1,63 @@
[ data-time-field ] {
--_time-field-height : var ( --time-field-height-md ) ;
--_time-field-padding-inline : var ( --time-field-padding-inline-md ) ;
/ * time-field IS-A Field : the stack ( display / flex-direction / gap / inline-size /
color / font-family ) , the control height / padding-inline , the value font-size , and
the FOCUS ring are ALL owned by field . css ( ` [ data-field ] ` , ` [ data-field ] [ data-size ] ` ,
` [ data-field-control ] ` , ` [ data-field-control ] : focus-within ` ) . time-field must NOT
re-declare tokens that alias them , so only its GENUINE specifics live here : the
inter-SEGMENT gap and the per-segment inline padding . * /
--_time-field-gap : var ( --time-field-gap-md ) ;
--_time-field-segment-padding-inline : var ( --time-field-segment-padding-inline-md ) ;
--_time-field-font-size : var ( --time-field-font-size-md ) ;
--_time-field-accent-border : var ( --color-primary-border ) ;
--_time-field-accent-track : var ( --color-primary-track ) ;
--_time-field-accent-text : var ( --color-primary-text ) ;
display : inline-flex ;
flex-direction : column ;
gap : var ( --time-field-stack-gap ) ;
inline-size : 100 % ;
min-inline-size : 0 ;
color : var ( --time-field-color ) ;
font-family : var ( --time-field-font-family ) ;
font-size : var ( --_time-field-font-size ) ;
line-height : var ( --time-field-line-height ) ;
}
[ data-time-field ] [ data-size = 'xs' ] {
--_time-field-height : var ( --time-field-height-xs ) ;
--_time-field-padding-inline : var ( --time-field-padding-inline-xs ) ;
--_time-field-gap : var ( --time-field-gap-xs ) ;
--_time-field-segment-padding-inline : var ( --time-field-segment-padding-inline-xs ) ;
--_time-field-font-size : var ( --time-field-font-size-xs ) ;
}
[ data-time-field ] [ data-size = 'sm' ] {
--_time-field-height : var ( --time-field-height-sm ) ;
--_time-field-padding-inline : var ( --time-field-padding-inline-sm ) ;
--_time-field-gap : var ( --time-field-gap-sm ) ;
--_time-field-segment-padding-inline : var ( --time-field-segment-padding-inline-sm ) ;
--_time-field-font-size : var ( --time-field-font-size-sm ) ;
}
[ data-time-field ] [ data-size = 'lg' ] {
--_time-field-height : var ( --time-field-height-lg ) ;
--_time-field-padding-inline : var ( --time-field-padding-inline-lg ) ;
--_time-field-gap : var ( --time-field-gap-lg ) ;
--_time-field-segment-padding-inline : var ( --time-field-segment-padding-inline-lg ) ;
--_time-field-font-size : var ( --time-field-font-size-lg ) ;
}
[ data-time-field ] [ data-size = 'xl' ] {
--_time-field-height : var ( --time-field-height-xl ) ;
--_time-field-padding-inline : var ( --time-field-padding-inline-xl ) ;
--_time-field-gap : var ( --time-field-gap-xl ) ;
--_time-field-segment-padding-inline : var ( --time-field-segment-padding-inline-xl ) ;
--_time-field-font-size : var ( --time-field-font-size-xl ) ;
}
[ data-time-field ] [ data-color = 'secondary' ] {
--_time-field-accent-border : var ( --color-secondary-border ) ;
--_time-field-accent-track : var ( --color-secondary-track ) ;
--_time-field-accent-text : var ( --color-secondary-text ) ;
}
[ data-time-field ] [ data-color = 'neutral' ] {
--_time-field-accent-border : var ( --color-neutral-border ) ;
--_time-field-accent-track : var ( --color-neutral-track ) ;
--_time-field-accent-text : var ( --color-neutral-text ) ;
}
[ data-time-field ] [ data-color = 'affirm' ] {
--_time-field-accent-border : var ( --color-affirm-border ) ;
--_time-field-accent-track : var ( --color-affirm-track ) ;
--_time-field-accent-text : var ( --color-affirm-text ) ;
}
/ * The ` data-color ` accent apparatus was removed : its only reader was the segment
focus border , now aligned to Field ' s ` [ data-field-control ] : focus-within ` ( a
color-agnostic focus ring ) , so per-color accent tokens have no consumer . * /
[ data-time-field ] [ data-color = 'fulfill' ] {
--_time-field-accent-border : var ( --color-fulfill-border ) ;
--_time-field-accent-track : var ( --color-fulfill-track ) ;
--_time-field-accent-text : var ( --color-fulfill-text ) ;
}
/ * The label ( color / step-down font-size / weight / invalid + disabled color ) is owned
by field . css ` [ data-field-label ] ` — time-field ' s Label carries ` data-field-label `
via ` fieldRole ( 'label' ) ` , so re-declaring it here would only alias the Field base . * /
[ data-time-field ] [ data-color = 'risk' ] {
--_time-field-accent-border : var ( --color-risk-border ) ;
--_time-field-accent-track : var ( --color-risk-track ) ;
--_time-field-accent-text : var ( --color-risk-text ) ;
}
[ data-time-field ] [ data-color = 'threat' ] {
--_time-field-accent-border : var ( --color-threat-border ) ;
--_time-field-accent-track : var ( --color-threat-track ) ;
--_time-field-accent-text : var ( --color-threat-text ) ;
}
[ data-time-field ] [ data-color = 'loss' ] {
--_time-field-accent-border : var ( --color-loss-border ) ;
--_time-field-accent-track : var ( --color-loss-track ) ;
--_time-field-accent-text : var ( --color-loss-text ) ;
}
[ data-time-field-label ] {
color : var ( --time-field-label-color ) ;
font : inherit ;
/ * Label one typographic step below the input ( don ' t inherit its size ) . The step
is ` md − sm ` ( = 2px ) , tokenized ; ` 1em ` is the inherited input font . Scales . * /
font-size : calc ( 1em - ( var ( --font-size-md ) - var ( --font-size-sm ) ) ) ; /* literal: one-step-down from context; the delta is token-derived (Field label doctrine) */
font-weight : var ( --time-field-label-font-weight ) ;
}
[ data-time-field-input ] {
display : inline-flex ;
align-items : center ;
/ * Chrome ( display / size / border / radius / bg / padding / font-weight ) is owned by
` field . css [ data-field-control ] ` — the segment container carries ` data-field-control `
via ` fieldRole ( 'control' ) ` . Only two GENUINE time-field specifics remain , both on the
compound ` [ data-time-field ] [ data-time-field-input ] ` ( 0 , 2 , 0 ) so they out-rank field . css ' s
` [ data-field-control ] ` ( 0 , 1 , 0 ) regardless of bundle load order : the inter-SEGMENT gap ,
and the ` transition ` OVERRIDE — ` border-color ` must be INSTANT ( field . css transitions it ,
but a keyboard increment briefly blurs / refocuses the segment , so a transitioned border
flickers every step ; the focus ring is an ` outline ` , instant ) . * /
[ data-time-field ] [ data-time-field-input ] {
gap : var ( --_time-field-gap ) ;
min-inline-size : 0 ;
inline-size : 100 % ;
min-block-size : var ( --_time-field-height ) ;
padding-inline : var ( --_time-field-padding-inline ) ;
border : var ( --time-field-border-width ) solid var ( --time-field-border ) ;
border-radius : var ( --time-field-radius ) ;
background : var ( --time-field-bg ) ;
color : inherit ;
font-weight : var ( --font-weight-medium ) ;
/ * Only ` background ` transitions . ` border-color ` must be INSTANT : the focus
border toggles via ` : has ( segment : focus-visible ) ` , and a keyboard increment
briefly blurs / refocuses the segment — a transitioned border-color would
fade out / in on every step ( visible flicker ) . The focus ring is an
` outline ` ( instant ) . ` box-shadow ` is no longer used here ( post focus-ring
migration ) — dropped from the transition . * /
transition : background var ( --time-field-transition-duration ) var ( --time-field-transition-ease ) ;
}
[ data-time-field ] [ data-variant = 'outline' ] [ data-time-field-input ] {
background : transparent ;
}
[ data-time-field ] [ data-variant = 'ghost' ] [ data-time-field-input ] {
border-color : transparent ;
background : transparent ;
padding-inline : 0 ;
}
[ data-time-field-input ] : has ( [ data-time-field-segment ] : focus-visible ) {
border-color : var ( --_time-field-accent-border ) ;
/* Focus ring as a flush outline (no offset → no gap) — survives forced-colors. */
outline : var ( --focus-ring-width ) solid var ( --focus-ring-color ) ;
outline-offset : 0 ;
}
/ * Variants ( surface / outline / ghost ) are owned by field . css
( ` [ data-field ] [ data-variant ] ` retargets ` --_field-control-bg ` / ` --_field-control-border ` )
— time-field passes ` data-variant ` on the ` [ data-field ] ` root , so no re-declaration . * /
[ data-time-field ] [ data-invalid ] [ data-time-field-input ] ,
[ data-time-field-input ] [ data-invalid ] {
border-color : var ( --time-field-border-invalid ) ;
}
[ data-time-field ] [ data-disabled ] ,
[ data-time-field-input ] [ data-disabled ] {
opacity : var ( --time-field-disabled-opacity ) ;
}
/ * Focus ring ( border-color-focus + outline ) , invalid ( border-color ) and disabled
( opacity ) on the control are owned by field . css ` [ data-field-control ] : focus-within `
/ ` [ data-field ] [ data-invalid ] [ data-field-control ] ` / ` [ data-field ] [ data-disabled ] `
— the segment container carries ` data-field-control ` , so time-field must not alias them . * /
[ data-time-field-segment ] {
display : inline-flex ;