@ -15,8 +15,11 @@
[ data-chronos ] {
--_chronos-cell-min-block : var ( --chronos-cell-min-block-md ) ;
--_chronos-lane-height : var ( --chronos-lane-height-md ) ;
/* Accent (today marker · now-indicator · drag feedback) — follows the `color` prop. */
--_chronos-accent : var ( --color-primary-solid ) ;
--_chronos-accent-border : var ( --color-primary-border ) ;
/* Drop-target highlight tint (single source; state tokens are pending). */
--_chronos-dragover-bg : color-mix ( in oklab , var ( --color-primary-solid ) 14 % , transparent ) ;
--_chronos-dragover-bg : color-mix ( in oklab , var ( -- _chronos-accent ) 14 % , transparent ) ;
/* Depth of the multi-day chip continuation arrow / notch. */
--_chronos-chip-arrow : var ( --space-1-5 ) ;
@ -25,7 +28,7 @@
gap : var ( --space-3 ) ;
inline-size : 100 % ;
color : var ( --color-content-primary ) ;
font-family : var ( -- font-ui ) ;
font-family : var ( -- style-label-font-family ) ;
font-size : var ( --font-size-sm ) ;
line-height : var ( --leading-ui ) ;
}
@ -44,6 +47,42 @@
pointer-events : none ;
}
/ * The ` color ` prop retints the accent ( today marker · now-indicator · drag feedback ) .
Portaled surfaces ( the day-peek popover ) keep primary — they render outside
[ data-chronos ] so this private token can ' t reach them . * /
[ data-chronos ] [ data-color = 'secondary' ] {
--_chronos-accent : var ( --color-secondary-solid ) ;
--_chronos-accent-border : var ( --color-secondary-border ) ;
}
[ data-chronos ] [ data-color = 'tertiary' ] {
--_chronos-accent : var ( --color-tertiary-solid ) ;
--_chronos-accent-border : var ( --color-tertiary-border ) ;
}
[ data-chronos ] [ data-color = 'neutral' ] {
--_chronos-accent : var ( --color-neutral-solid ) ;
--_chronos-accent-border : var ( --color-neutral-border ) ;
}
[ data-chronos ] [ data-color = 'affirm' ] {
--_chronos-accent : var ( --color-affirm-solid ) ;
--_chronos-accent-border : var ( --color-affirm-border ) ;
}
[ data-chronos ] [ data-color = 'fulfill' ] {
--_chronos-accent : var ( --color-fulfill-solid ) ;
--_chronos-accent-border : var ( --color-fulfill-border ) ;
}
[ data-chronos ] [ data-color = 'risk' ] {
--_chronos-accent : var ( --color-risk-solid ) ;
--_chronos-accent-border : var ( --color-risk-border ) ;
}
[ data-chronos ] [ data-color = 'threat' ] {
--_chronos-accent : var ( --color-threat-solid ) ;
--_chronos-accent-border : var ( --color-threat-border ) ;
}
[ data-chronos ] [ data-color = 'loss' ] {
--_chronos-accent : var ( --color-loss-solid ) ;
--_chronos-accent-border : var ( --color-loss-border ) ;
}
/* ── Header ──────────────────────────────────────────────────────────────── */
[ data-chronos-toolbar ] {
@ -65,12 +104,12 @@
padding : var ( --space-1 ) var ( --space-2 ) ;
border : var ( --border-width ) solid var ( --color-border-subtle ) ;
border-radius : var ( --radius-md ) ;
line-height : 1. 1 ;
line-height : var( --leading-tight ) ;
}
. chronos-date-badge-month {
font-size : var ( --font-size-xs ) ;
font-weight : var ( --font-weight-semibold ) ;
letter-spacing : 0 . 04em ;
letter-spacing : 0 . 04em ; /* literal: optical tracking on the compact date badge */
color : var ( --color-content-muted ) ;
}
. chronos-date-badge-day {
@ -170,10 +209,10 @@
}
[ data-chronos-day-cell ] [ data-outside-month ] [ data-chronos-day-number ] {
color : var ( --color-content-muted ) ;
opacity : 0. 6 ;
opacity : var( --opacity-muted ) ;
}
[ data-chronos-day-cell ] : hover {
background : var ( --color-surface-overlay ) ;
background -image: linear-gradient ( var ( --state-hover ) , var ( --state-hover ) ) ;
}
[ data-chronos ] [ data-readonly ] [ data-chronos-day-cell ] ,
[ data-chronos ] [ data-disabled ] [ data-chronos-day-cell ] {
@ -181,15 +220,15 @@
}
[ data-chronos ] [ data-readonly ] [ data-chronos-day-cell ] : hover ,
[ data-chronos ] [ data-disabled ] [ data-chronos-day-cell ] : hover {
background : transparent ;
background -image: none ;
}
[ data-chronos-day-cell ] : focus-visible {
outline : none ;
box-shadow: var ( --chronos-focus-shadow ) ;
outline : var( --focus-ring-width ) solid var ( --focus-ring-color ) ;
outline-offset: calc ( var ( --focus-ring-width ) * -1 ) ;
}
[ data-chronos-day-cell ] [ data-dragover ] {
background : var ( --_chronos-dragover-bg ) ;
box-shadow : inset 0 0 0 var ( --focus-ring-width ) var ( -- color-primary -border) ;
box-shadow : inset 0 0 0 var ( --focus-ring-width ) var ( -- _chronos-accent -border) ;
}
. chronos-day-cell-head {
display : flex ;
@ -221,7 +260,7 @@
color : var ( --color-content-primary ) ;
}
[ data-chronos-day-cell ] [ data-today ] [ data-chronos-day-number ] {
background : var ( -- color-primary-solid ) ;
background : var ( -- _chronos-accent ) ;
color : var ( --color-content-on-solid ) ;
border-radius : var ( --radius-full ) ;
font-weight : var ( --font-weight-semibold ) ;
@ -254,14 +293,14 @@
font-size : var ( --font-size-xs ) ;
cursor : pointer ;
text-align : start ;
transition : filte r var ( --duration-fast ) var ( --ease-default ) ;
transition : background-colo r var ( --duration-fast ) var ( --ease-default ) ;
}
[ data-chronos-event-chip ] : hover {
filter: brightness ( 0 . 97 ) ;
background-image: linear-gradient ( var ( --state-hover ) , var ( --state-hover ) ) ;
}
[ data-chronos-event-chip ] : focus-visible {
outline : none ;
box-shadow: var ( --chronos-focus-shadow ) ;
outline : var( --focus-ring-width ) solid var ( --focus-ring-color ) ;
outline-offset: calc ( var ( --focus-ring-width ) * -1 ) ;
}
/ * Continuation shapes : a bar that runs past the week boundary ends in an arrow
point ( continues-after ) and the next week resumes with a matching notch
@ -306,9 +345,19 @@
}
. chronos-chip-time {
flex : 0 0 auto ;
opacity : 0. 75 ;
opacity : var( --opacity-subtle ) ;
font-variant-numeric : tabular-nums ;
}
/* Default event-chip tooltip body (inside the system Tooltip.Content surface). */
. chronos-tooltip {
display : flex ;
flex-direction : column ;
gap : var ( --space-0-5 ) ;
}
. chronos-tooltip-meta {
color : var ( --color-content-muted ) ;
font-size : var ( --font-size-xs ) ;
}
/ * Drag preview — the event ' s chip , lifted off the surface while dragging .
Size comes inline from the source chip , so keep border-box to match exactly . * /
. chronos-drag-preview {
@ -352,7 +401,7 @@
. chronos-legend-swatch {
inline-size : var ( --space-2-5 ) ;
block-size : var ( --space-2-5 ) ;
border-radius : var ( --radius- x s) ;
border-radius : var ( --radius- sm ) ;
}
/* ── Editor field layout (controls are framework Dialog/Field/DateField/…) ─── */
@ -365,25 +414,10 @@
inset-inline-end : var ( --dialog-content-padding-md ) ;
}
/ * View mode = readonly . Field / date / time pickers use their ` readonly ` prop ( values
stay legible ) . Select + ToggleGroup have no ` readonly ` , so they ' re ` disabled ` ;
strip the disabled dimming here so they read like the rest , while staying
non-interactive ( and still announced as disabled to AT ) . * /
. chronos-editor-fields [ data-view ] [ data-select ] [ data-disabled ] ,
. chronos-editor-fields [ data-view ] [ data-select-trigger ] [ data-disabled ] {
opacity : 1 ;
}
. chronos-editor-fields [ data-view ] [ data-select-trigger ] [ data-disabled ] {
border-color : var ( --select-trigger-border ) ;
background : var ( --select-trigger-bg ) ;
color : var ( --select-trigger-color ) ;
cursor : default ;
}
. chronos-when [ data-view ] [ data-toggle-group ] [ data-disabled ] ,
. chronos-when [ data-view ] [ data-toggle ] [ data-disabled ] {
opacity : 1 ;
cursor : default ;
}
/ * View mode uses the controls ' own ` readonly ` ( Field / date-time pickers +
Select / ToggleGroup now all support it ) — legible , not dimmed , non-interactive .
The ` [ data-view ] ` disabled-stripping workaround was retired once Select +
ToggleGroup gained ` readonly ` ( P7 ) . Only the segment-flatten rule remains . * /
/ * The date / time field ' s readonly mode paints each segment with a per-segment bg
affordance ( ` --date-field-segment-readonly-bg ` ) . In an all-readonly view dialog
that reads as noisy chips — flatten to plain text . ( Only matches in view mode ;
@ -531,7 +565,7 @@
justify-content : space-between ;
}
. chronos-field-label {
font-family : var ( -- font-ui ) ;
font-family : var ( -- style-label-font-family ) ;
font-size : var ( --font-size-md ) ;
font-weight : var ( --font-weight-medium ) ;
color : var ( --color-content-secondary ) ;
@ -626,7 +660,7 @@
justify-content : center ;
min-inline-size : var ( --space-6 ) ;
block-size : var ( --space-6 ) ;
background : var ( -- color-primary-solid ) ;
background : var ( -- _chronos-accent ) ;
color : var ( --color-content-on-solid ) ;
border-radius : var ( --radius-full ) ;
font-weight : var ( --font-weight-semibold ) ;
@ -686,7 +720,7 @@
. chronos-tg-slot [ data-dragover ] ,
. chronos-tg-alldaycol [ data-dragover ] {
background : var ( --_chronos-dragover-bg ) ;
box-shadow : inset 0 0 0 var ( --focus-ring-width ) var ( -- color-primary -border) ;
box-shadow : inset 0 0 0 var ( --focus-ring-width ) var ( -- _chronos-accent -border) ;
}
/ * During an active drag , event chips must not intercept the pointer — the drop
hit-test ( elementFromPoint ) has to reach the slots / cells beneath them . * /
@ -706,7 +740,7 @@
position : absolute ;
inset-inline : 0 ;
block-size : 0 ;
border-block-start : var ( --border-width ) solid var ( -- color-primary-solid ) ;
border-block-start : var ( --border-width ) solid var ( -- _chronos-accent ) ;
z-index : 2 ;
pointer-events : none ;
}
@ -717,7 +751,7 @@
inset-inline-start : calc ( var ( --space-1 ) * -1 ) ;
inline-size : var ( --space-2 ) ;
block-size : var ( --space-2 ) ;
background : var ( -- color-primary-solid ) ;
background : var ( -- _chronos-accent ) ;
border-radius : var ( --radius-full ) ;
}
@ -914,7 +948,7 @@
cursor : pointer ;
}
. chronos-agenda-item : hover {
background : var ( --color-surface-overlay ) ;
background -image: linear-gradient ( var ( --state-hover ) , var ( --state-hover ) ) ;
}
. chronos-agenda-dot {
flex : 0 0 auto ;