@ -1,8 +1,17 @@
/ * ColorPicker — visual layer .
/ * ColorPicker — visual layer .
*
*
* Composes the segmented ` color-field ` recipe for ChannelInput / Segment /
* Layering notes
* FormatSelect and adds picker-specific surfaces : trigger , popover content ,
* --------------
* 2D area , channel sliders , swatches , eye-dropper .
* Soma emits inline ` style = "background: …" ` on :
* • [ data-color-picker-area-background ] — pure hue ( background-color )
* • [ data-color-picker-channel-slider-track ] — channel gradient
* That means any CSS ` background : ` shorthand on the same element is replaced
* by the inline rule . So :
* • Area saturation / brightness overlays go on :: before / :: after of the
* AreaBackground ( pseudo-elements don ' t conflict with the inline bg ) .
* • Alpha-channel transparency checker goes on :: before of the slider
* TRACK , with z-index : -1 + isolation : isolate so the soma gradient
* sits above it and the transparent end reveals the checker .
* /
* /
[ data-color-picker ] {
[ data-color-picker ] {
@ -14,6 +23,14 @@
--_color-picker-swatch-size : var ( --color-picker-swatch-size-md ) ;
--_color-picker-swatch-size : var ( --color-picker-swatch-size-md ) ;
--_color-picker-accent : var ( --color-primary-border ) ;
--_color-picker-accent : var ( --color-primary-border ) ;
/* Transparency checker — reusable on any descendant element. */
--cp-checker-cell : 6px ;
--cp-checker :
linear-gradient ( 45deg , var ( --color-picker-transparency-cell ) 25 % , transparent 25 % ) ,
linear-gradient ( -45deg , var ( --color-picker-transparency-cell ) 25 % , transparent 25 % ) ,
linear-gradient ( 45deg , transparent 75 % , var ( --color-picker-transparency-cell ) 75 % ) ,
linear-gradient ( -45deg , transparent 75 % , var ( --color-picker-transparency-cell ) 75 % ) ;
display : inline-flex ;
display : inline-flex ;
flex-direction : column ;
flex-direction : column ;
gap : var ( --space-1-5 ) ;
gap : var ( --space-1-5 ) ;
@ -39,32 +56,19 @@
--_color-picker-swatch-size : var ( --color-picker-swatch-size-lg ) ;
--_color-picker-swatch-size : var ( --color-picker-swatch-size-lg ) ;
}
}
[ data-color-picker ] [ data-color = 'secondary' ] {
[ data-color-picker ] [ data-color = 'secondary' ] { --_color-picker-accent : var ( - - color - secondary - border ) ; }
--_color-picker-accent : var ( --color-secondary-border ) ;
[ data-color-picker ] [ data-color = 'neutral' ] { --_color-picker-accent : var ( - - color - neutral - border ) ; }
}
[ data-color-picker ] [ data-color = 'affirm' ] { --_color-picker-accent : var ( - - color - affirm - border ) ; }
[ data-color-picker ] [ data-color = 'neutral' ] {
[ data-color-picker ] [ data-color = 'fulfill' ] { --_color-picker-accent : var ( - - color - fulfill - border ) ; }
--_color-picker-accent : var ( --color-neutral-border ) ;
[ data-color-picker ] [ data-color = 'risk' ] { --_color-picker-accent : var ( - - color - risk - border ) ; }
}
[ data-color-picker ] [ data-color = 'threat' ] { --_color-picker-accent : var ( - - color - threat - border ) ; }
[ data-color-picker ] [ data-color = 'affirm' ] {
[ data-color-picker ] [ data-color = 'loss' ] { --_color-picker-accent : var ( - - color - loss - border ) ; }
--_color-picker-accent : var ( --color-affirm-border ) ;
}
[ data-color-picker ] [ data-color = 'fulfill' ] {
--_color-picker-accent : var ( --color-fulfill-border ) ;
}
[ data-color-picker ] [ data-color = 'risk' ] {
--_color-picker-accent : var ( --color-risk-border ) ;
}
[ data-color-picker ] [ data-color = 'threat' ] {
--_color-picker-accent : var ( --color-threat-border ) ;
}
[ data-color-picker ] [ data-color = 'loss' ] {
--_color-picker-accent : var ( --color-loss-border ) ;
}
[ data-color-picker-label ] {
[ data-color-picker-label ] {
color : var ( --color-content-secondary ) ;
color : var ( --color-content-secondary ) ;
font : inherit ;
font : inherit ;
font-weight : var ( --font-weight-medium ) ;
font-weight : var ( --font-weight-medium ) ;
font-size : var ( --font-size-sm ) ;
}
}
[ data-color-picker-control ] {
[ data-color-picker-control ] {
@ -74,6 +78,29 @@
min-inline-size : 0 ;
min-inline-size : 0 ;
}
}
/ * ─ ─ Popover content portals outside the root : re-declare the checker var
so any descendant of the portaled Content can still consume it . ─ ─ ─ ─ ─ ─ ─ * /
[ data-popover-content ] [ data-color-picker-content ] {
--cp-checker-cell : 6px ;
--cp-checker :
linear-gradient ( 45deg , var ( --color-picker-transparency-cell ) 25 % , transparent 25 % ) ,
linear-gradient ( -45deg , var ( --color-picker-transparency-cell ) 25 % , transparent 25 % ) ,
linear-gradient ( 45deg , transparent 75 % , var ( --color-picker-transparency-cell ) 75 % ) ,
linear-gradient ( -45deg , transparent 75 % , var ( --color-picker-transparency-cell ) 75 % ) ;
--_color-picker-accent : var ( --color-primary-border ) ;
--_color-picker-swatch-size : var ( --color-picker-swatch-size-md ) ;
--_popover-content-width-override : var ( --color-picker-content-width-md ) ;
--_popover-content-min-width-override : var ( --color-picker-content-width-md ) ;
--_popover-content-max-width-override : calc ( 100vw - var ( --space-4 ) ) ;
display : flex ;
flex-direction : column ;
gap : var ( --color-picker-content-gap ) ;
padding : var ( --color-picker-content-padding-md ) ;
}
/* ── Trigger ─────────────────────────────────────────────────────────────── */
/* ── Trigger ─────────────────────────────────────────────────────────────── */
[ data-color-picker-trigger ] {
[ data-color-picker-trigger ] {
@ -87,6 +114,7 @@
background : var ( --color-picker-trigger-bg ) ;
background : var ( --color-picker-trigger-bg ) ;
color : var ( --color-picker-trigger-color ) ;
color : var ( --color-picker-trigger-color ) ;
font : inherit ;
font : inherit ;
font-size : var ( --font-size-sm ) ;
cursor : pointer ;
cursor : pointer ;
transition :
transition :
background var ( --color-picker-transition-duration ) var ( --color-picker-transition-ease ) ,
background var ( --color-picker-transition-duration ) var ( --color-picker-transition-ease ) ,
@ -110,67 +138,63 @@
opacity : var ( --color-picker-disabled-opacity ) ;
opacity : var ( --color-picker-disabled-opacity ) ;
}
}
/ * Trigger swatch dot — paints with ` --cp-trigger-color ` on top of a
transparency checker so alpha < 1 reveals the checker beneath . * /
[ data-color-picker-trigger ] . color-picker-trigger-swatch {
[ data-color-picker-trigger ] . color-picker-trigger-swatch {
position : relative ;
display : inline-block ;
display : inline-block ;
flex : 0 0 auto ;
flex : 0 0 auto ;
inline-size : var ( --_color-picker-trigger-swatch-size ) ;
inline-size : var ( --_color-picker-trigger-swatch-size ) ;
block-size : var ( --_color-picker-trigger-swatch-size ) ;
block-size : var ( --_color-picker-trigger-swatch-size ) ;
border-radius : var ( --color-picker-trigger-swatch-radius ) ;
border-radius : var ( --color-picker-trigger-swatch-radius ) ;
border : 1px solid var ( --color-picker-trigger-swatch-border ) ;
border : 1px solid var ( --color-picker-trigger-swatch-border ) ;
background :
background-image : var ( --cp-checker ) ;
linear-gradient ( var ( --cp-trigger-color , transparent ) , var ( --cp-trigger-color , transparent ) ) ,
background-size : var ( --cp-checker-cell ) var ( --cp-checker-cell ) ;
conic-gradient (
background-position :
var ( --color-picker-transparency-cell ) 0 % 25 % ,
0 0 ,
var ( --color-picker-transparency-cell-alt ) 0 % 50 % ,
0 calc ( var ( --cp-checker-cell ) / 2 ) ,
var ( --color-picker-transparency-cell ) 0 % 75 % ,
calc ( var ( --cp-checker-cell ) / 2 ) calc ( var ( --cp-checker-cell ) / -2 ) ,
var ( --color-picker-transparency-cell-alt ) 0 % 100 %
calc ( var ( --cp-checker-cell ) / -2 ) 0 ;
) ;
overflow : hidden ;
background-size :
isolation : isolate ;
100 % 100 % ,
}
8px 8px ;
box-shadow : inset 0 0 0 1px color-mix ( in srgb , var ( --color-surface-default ) 40 % , transparent ) ;
[ data-color-picker-trigger ] . color-picker-trigger-swatch :: after {
content : '' ;
position : absolute ;
inset : 0 ;
border-radius : inherit ;
background : var ( --cp-trigger-color , transparent ) ;
}
}
/* ── ValueSwatch / ValueText ─────────────────────────────────────────────── */
/* ── ValueSwatch / ValueText ─────────────────────────────────────────────── */
[ data-color-picker-value-swatch ] {
[ data-color-picker-value-swatch ] {
position : relative ;
display : inline-block ;
display : inline-block ;
inline-size : var ( --_color-picker-swatch-size ) ;
inline-size : var ( --_color-picker-swatch-size ) ;
block-size : var ( --_color-picker-swatch-size ) ;
block-size : var ( --_color-picker-swatch-size ) ;
border-radius : var ( --color-picker-swatch-radius ) ;
border-radius : var ( --color-picker-swatch-radius ) ;
border : 1px solid var ( --color-picker-swatch-border ) ;
border : 1px solid var ( --color-picker-swatch-border ) ;
background :
background-image : var ( --cp-checker ) ;
linear-gradient ( var ( --cp-trigger-color , currentColor ) , var ( --cp-trigger-color , currentColor ) ) ,
background-size : var ( --cp-checker-cell ) var ( --cp-checker-cell ) ;
conic-gradient (
overflow : hidden ;
var ( --color-picker-transparency-cell ) 0 % 25 % ,
isolation : isolate ;
var ( --color-picker-transparency-cell-alt ) 0 % 50 % ,
}
var ( --color-picker-transparency-cell ) 0 % 75 % ,
[ data-color-picker-value-swatch ] :: after {
var ( --color-picker-transparency-cell-alt ) 0 % 100 %
content : '' ;
) ;
position : absolute ;
background-size :
inset : 0 ;
100 % 100 % ,
background : var ( --cp-trigger-color , currentColor ) ;
8px 8px ;
}
}
[ data-color-picker-value-text ] {
[ data-color-picker-value-text ] {
font-family : var ( --font-mono , var ( --font-ui ) ) ;
font-family : var ( --font-mono , var ( --font-ui ) ) ;
font-size : var ( --font-size-sm ) ;
font-size : var ( --font-size-sm ) ;
color : var ( --color-content-secondary ) ;
color : var ( --color-content-primary ) ;
}
font-weight : var ( --font-weight-medium ) ;
letter-spacing : 0 . 01em ;
/* ── Popover content ─────────────────────────────────────────────────────── */
min-inline-size : 7ch ;
[ data-popover-content ] [ data-color-picker-content ] {
--_popover-content-width-override : var ( --_color-picker-content-width , var ( --color-picker-content-width-md ) ) ;
--_popover-content-min-width-override : var ( --_color-picker-content-width , var ( --color-picker-content-width-md ) ) ;
--_popover-content-max-width-override : calc ( 100vw - var ( --space-4 ) ) ;
}
[ data-popover-content ] [ data-color-picker-content ] {
display : flex ;
flex-direction : column ;
gap : var ( --color-picker-content-gap ) ;
padding : var ( --_color-picker-content-padding , var ( --color-picker-content-padding-md ) ) ;
}
}
/* ── 2D Area (saturation/brightness gradient field) ──────────────────────── */
/* ── 2D Area (saturation/brightness gradient field) ──────────────────────── */
@ -185,25 +209,54 @@
cursor : crosshair ;
cursor : crosshair ;
touch-action : none ;
touch-action : none ;
user-select : none ;
user-select : none ;
isolation : isolate ;
}
}
/ * The Background element receives ` background-color : hsl ( H , 100 % , 50 % ) ` inline
from soma . We overlay saturation ( white → transparent ) and brightness
( transparent → black ) via pseudo-elements so the inline bg-color stays . * /
[ data-color-picker-area-background ] {
[ data-color-picker-area-background ] {
position : absolute ;
position : absolute ;
inset : 0 ;
inset : 0 ;
border-radius : inherit ;
border-radius : inherit ;
}
}
[ data-color-picker-area-background ] :: before ,
[ data-color-picker-area-background ] :: after {
content : '' ;
position : absolute ;
inset : 0 ;
border-radius : inherit ;
pointer-events : none ;
}
/ * Saturation overlay : pure white on the left , transparent on the right .
Uses CSS color keywords ( ` white ` / ` black ` ) — these are mathematical end-
points of the saturation / brightness gradient , not theme colors , so the
eidos no-raw-colors rule doesn ' t apply . * /
[ data-color-picker-area-background ] :: before {
background : linear-gradient ( to right , white , transparent ) ;
}
/* Brightness overlay: transparent at top, pure black at the bottom. */
[ data-color-picker-area-background ] :: after {
background : linear-gradient ( to top , black , transparent ) ;
}
/ * Area thumb — white ring with a dark shadow to remain visible against any
color in the area . Position comes inline from soma . * /
[ data-color-picker-area-thumb ] {
[ data-color-picker-area-thumb ] {
position : absolute ;
position : absolute ;
z-index : 2 ;
inline-size : var ( --color-picker-area-thumb-size ) ;
inline-size : var ( --color-picker-area-thumb-size ) ;
block-size : var ( --color-picker-area-thumb-size ) ;
block-size : var ( --color-picker-area-thumb-size ) ;
border : var ( --color-picker-area-thumb-border-width ) solid
border : var ( --color-picker-area-thumb-border-width ) solid var ( --color-picker-area-thumb-border ) ;
var ( --color-picker-area-thumb-border ) ;
border-radius : var ( --color-picker-area-thumb-radius ) ;
border-radius : var ( --color-picker-area-thumb-radius ) ;
box-shadow : var ( --color-picker-area-thumb-shadow ) ;
box-shadow : var ( --color-picker-area-thumb-shadow ) ;
transform : translate ( -50 % , -50 % ) ;
transform : translate ( -50 % , -50 % ) ;
cursor : grab ;
cursor : grab ;
background : transparent ;
background : transparent ;
outline : none ;
}
}
[ data-color-picker-area-thumb ] [ data-dragging ] ,
[ data-color-picker-area-thumb ] [ data-dragging ] ,
@ -211,84 +264,100 @@
cursor : grabbing ;
cursor : grabbing ;
}
}
/* ── Channel sliders ─────────────────────────────────────────────────────── */
[ data-color-picker-area-thumb ] : focus-visible {
box-shadow :
var ( --color-picker-area-thumb-shadow ) ,
0 0 0 2px var ( --_color-picker-accent ) ;
}
/ * ─ ─ Channel sliders ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─
*
* The channel slider composes the generic SliderProvider underneath , so the
* inner DOM looks like :
* < div data-color-picker-channel-slider data-channel = "hue" data-slider … >
* < div data-slider-range / > ← hidden ( gradient lives on track :: before )
* < div data-slider-thumb / > ← positioned by slider
* < / div >
*
* The wrapper sets ` --cp-channel-gradient ` inline ( computed by soma from
* the current colour + channel ) . We route that onto [ data-slider ] :: before
* so the slider ' s track shows the gradient , with a transparency checker
* behind it ( via the wrapper ' s own :: before , z-index -1 ) for alpha . * /
[ data-color-picker-channel-slider ] {
[ data-color-picker-channel-slider ] {
position : relative ;
position : relative ;
inline-size : 100 % ;
inline-size : 100 % ;
block-size : var ( --color-picker-channel-slider-thumb-size ) ;
isolation : isolate ;
display : flex ;
align-items : center ;
cursor : pointer ;
touch-action : none ;
user-select : none ;
}
}
[ data-color-picker-channel-slider-track ] {
/ * Transparency checker sits BEHIND the slider track for the alpha channel
position : relative ;
( where the gradient ramps to transparent ) . For non-alpha channels the
inline-size : 100 % ;
gradient is opaque , so the checker stays hidden . * /
block-size : var ( --color-picker-channel-slider-track-size ) ;
[ data-color-picker-channel-slider ] :: before {
border-radius : var ( --color-picker-channel-slider-track-radius ) ;
content : '' ;
border : var ( --color-picker-channel-slider-track-border-width ) solid
position : absolute ;
var ( --color-picker-channel-slider-track-border ) ;
z-index : 0 ;
background :
inset-inline : 0 ;
linear-gradient (
inset-block-start : 50 % ;
to right ,
block-size : var ( --slider-track-size-md ) ;
transparent ,
transform : translateY ( -50 % ) ;
transparent
border-radius : var ( --slider-track-radius ) ;
) ,
background-image : var ( --cp-checker ) ;
conic-gradient (
background-size : var ( --cp-checker-cell ) var ( --cp-checker-cell ) ;
var ( --color-picker-transparency-cell ) 0 % 25 % ,
background-position :
var ( --color-picker-transparency-cell-alt ) 0 % 50 % ,
0 0 ,
var ( --color-picker-transparency-cell ) 0 % 75 % ,
0 calc ( var ( --cp-checker-cell ) / 2 ) ,
var ( --color-picker-transparency-cell-alt ) 0 % 100 %
calc ( var ( --cp-checker-cell ) / 2 ) calc ( var ( --cp-checker-cell ) / -2 ) ,
) ;
calc ( var ( --cp-checker-cell ) / -2 ) 0 ;
background-size :
pointer-events : none ;
100 % 100 % ,
8px 8px ;
overflow : hidden ;
}
}
[ data-color-picker-channel-slider-thumb ] {
/ * The slider ' s own track ( :: before of [ data-slider ] ) gets the channel
position : absolute ;
gradient . Slider . Range is hidden because color sliders show the full
inline-size : var ( --color-picker-channel-slider-thumb-size ) ;
channel range as a single gradient , not a "left-of-thumb" fill . * /
block-size : var ( --color-picker-channel-slider-thumb-size ) ;
[ data-color-picker-channel-slider ] [ data-slider ] :: before {
border : var ( --color-picker-channel-slider-thumb-border-width ) solid
background : var ( --cp-channel-gradient , var ( --slider-track-bg ) ) ;
var ( --color-picker-channel-slider-thumb-border ) ;
}
border-radius : var ( --color-picker-channel-slider-thumb-radius ) ;
box-shadow : var ( --color-picker-channel-slider-thumb-shadow ) ;
[ data-color-picker-channel-slider ] [ data-slider-range ] {
transform : translateX ( -50 % ) ;
background : transparent ;
background : transparent ;
cursor : grab ;
}
}
[ data-color-picker-channel-slider-thumb ] [ data-dragging ] ,
/ * Reinforce thumb visibility against any colour : bright ring + dark shadow .
[ data-color-picker-channel-slider-thumb ] : active {
We tweak the slider thumb only within the colour-picker scope . * /
cursor : grabbing ;
[ data-color-picker-channel-slider ] [ data-slider-thumb ] {
border : 2px solid var ( --color-surface-default ) ;
box-shadow :
0 0 0 1px color-mix ( in srgb , var ( --color-neutral-contrast ) 45 % , transparent ) ,
0 1px 2px color-mix ( in srgb , var ( --color-neutral-contrast ) 20 % , transparent ) ;
background : transparent ;
}
[ data-color-picker-channel-slider ] [ data-slider-thumb ] : focus-visible {
box-shadow :
0 0 0 1px color-mix ( in srgb , var ( --color-neutral-contrast ) 45 % , transparent ) ,
0 1px 2px color-mix ( in srgb , var ( --color-neutral-contrast ) 20 % , transparent ) ,
0 0 0 3px var ( --_color-picker-accent ) ;
}
}
/* ── Transparency grid (decorative checker under alpha channels) ─────────── */
/* ── Standalone transparency grid utility ─────────────────────── ─────────── */
[ data-color-picker-transparency-grid ] {
[ data-color-picker-transparency-grid ] {
background-color : var ( --color-picker-transparency-cell-alt ) ;
background-color : var ( --color-picker-transparency-cell-alt ) ;
background-image :
background-image : var ( --cp-checker ) ;
linear-gradient ( 45deg , var ( --color-picker-transparency-cell ) 25 % , transparent 25 % ) ,
background-size : var ( --cp-checker-cell ) var ( --cp-checker-cell ) ;
linear-gradient ( -45deg , var ( --color-picker-transparency-cell ) 25 % , transparent 25 % ) ,
linear-gradient ( 45deg , transparent 75 % , var ( --color-picker-transparency-cell ) 75 % ) ,
linear-gradient ( -45deg , transparent 75 % , var ( --color-picker-transparency-cell ) 75 % ) ;
background-size : 8px 8px ;
background-position :
background-position :
0 0 ,
0 0 ,
0 4px ,
0 calc ( var ( --cp-checker-cell ) / 2 ) ,
4px -4px ,
calc ( var ( --cp-checker-cell ) / 2 ) calc ( var ( --cp-checker-cell ) / -2 ) ,
-4px 0px ;
calc( var ( --cp-checker-cell ) / -2 ) 0 ;
}
}
/* ── Swatches ─────────────────────────────────────────────────────────────── */
/* ── Swatches ─────────────────────────────────────────────────────────────── */
[ data-color-picker-swatch-group ] {
[ data-color-picker-swatch-group ] {
display : flex ;
display : grid ;
flex-wrap: wrap ;
grid-template-columns: repeat ( auto-fill , minmax ( var ( --_color-picker-swatch-size ) , 1fr ) ) ;
gap : var ( --color-picker-swatch-gap ) ;
gap : var ( --color-picker-swatch-gap ) ;
}
}
@ -302,41 +371,47 @@
padding : 0 ;
padding : 0 ;
border : 1px solid var ( --color-picker-swatch-border ) ;
border : 1px solid var ( --color-picker-swatch-border ) ;
border-radius : var ( --color-picker-swatch-radius ) ;
border-radius : var ( --color-picker-swatch-radius ) ;
background : transparent ;
background-image : var ( --cp-checker ) ;
background-size : var ( --cp-checker-cell ) var ( --cp-checker-cell ) ;
cursor : pointer ;
cursor : pointer ;
overflow : hidden ;
isolation : isolate ;
transition :
transition :
box-shadow var ( --color-picker-transition-duration ) var ( --color-picker-transition-ease ) ,
box-shadow var ( --color-picker-transition-duration ) var ( --color-picker-transition-ease ) ,
transform var ( --color-picker-transition-duration ) var ( --color-picker-transition-ease ) ;
transform var ( --color-picker-transition-duration ) var ( --color-picker-transition-ease ) ;
}
}
[ data-color-picker-swatch-trigger ] : hover : not ( [ data-disabled ] ) {
[ data-color-picker-swatch-trigger ] : hover : not ( [ data-disabled ] ) {
transform : scale ( 1 . 06 ) ;
transform : scale ( 1 . 08 ) ;
}
[ data-color-picker-swatch-trigger ] : focus-visible {
outline : none ;
box-shadow : 0 0 0 2px var ( --color-picker-swatch-checked-ring ) ;
}
}
[ data-color-picker-swatch-trigger ] : focus-visible ,
[ data-color-picker-swatch-trigger ] [ data-checked ] {
[ data-color-picker-swatch-trigger ] [ data-checked ] {
box-shadow : 0 0 0 2px var ( --color-picker-swatch-checked-ring ) ;
outline : none ;
box-shadow :
0 0 0 1px var ( --color-surface-default ) ,
0 0 0 3px var ( --color-picker-swatch-checked-ring ) ;
}
}
/* The Swatch element renders inline; soma emits the color via inline style. */
[ data-color-picker-swatch ] {
[ data-color-picker-swatch ] {
position : absolute ;
position : absolute ;
inset : 0 ;
inset : 0 ;
border-radius : inherit ;
border-radius : inherit ;
pointer-events : none ;
}
}
[ data-color-picker-swatch-indicator ] {
[ data-color-picker-swatch-indicator ] {
position : absolute ;
position : absolute ;
inset-inline-end : - 2px;
inset-inline-end : 2px;
inset-block-start : - 2px;
inset-block-start : 2px;
display : none ;
display : none ;
inline-size : 0 . 5rem ;
inline-size : 0 . 5rem ;
block-size : 0 . 5rem ;
block-size : 0 . 5rem ;
border-radius : var ( --color-picker-trigger-swatch-radius ) ;
border-radius : var ( --color-picker-trigger-swatch-radius ) ;
background : var ( --color-picker-swatch-checked-ring ) ;
background : var ( --color-picker-swatch-checked-ring ) ;
box-shadow : 0 0 0 1px var ( --color-surface-default ) ;
z-index : 1 ;
}
}
[ data-color-picker-swatch-indicator ] [ data-checked ] {
[ data-color-picker-swatch-indicator ] [ data-checked ] {
@ -377,6 +452,17 @@
opacity : var ( --color-picker-disabled-opacity ) ;
opacity : var ( --color-picker-disabled-opacity ) ;
}
}
/* ── ChannelInput integration with ColorField inside the popover ────────── */
[ data-popover-content ] [ data-color-picker-content ] [ data-color-field-input ] {
background : var ( --color-surface-overlay ) ;
border-color : transparent ;
}
[ data-popover-content ] [ data-color-picker-content ] [ data-color-field-format-select ] {
font-size : var ( --font-size-xs ) ;
}
@ media ( prefers-reduced-motion : reduce ) {
@ media ( prefers-reduced-motion : reduce ) {
[ data-color-picker-trigger ] ,
[ data-color-picker-trigger ] ,
[ data-color-picker-area-thumb ] ,
[ data-color-picker-area-thumb ] ,