color

The colour model behind color3d — parsing, conversion and canonical formatting. Pure: no DOM, no Babylon, so a consumer can validate a document's colours in a headless runner. Same split as light-settings/light-editor and curve/curve-field.

Why HSV and not HSL

A picker is a saturation×value SQUARE under a hue strip, and that square is HSV. HSL's lightness puts white and black at both ends of the axis with the pure hue stranded in the middle, so the square becomes a diamond of unreachable corners — you cannot drag to white without also losing saturation. HSV puts white at one corner, black along an edge, and the pure hue at the opposite corner, which is the shape of every picker anyone has used.

lightEditor3d deliberately does NOT use this: a light has hue and saturation but its VALUE is intensity, so a third axis there would be two controls for one quantity. That is a property of lights, not of colour.

Alpha is part of the colour, not beside it

Half this library's palette is rgba()w3d-theme's panelBg is #14161cf0. A colour type that drops alpha forces every consumer to carry a second field and reunite them at the end, and they will disagree eventually.

Tolerant in, canonical out

Parsing accepts what people and stylesheets actually write — #abc, #aabbcc, #aabbccdd, rgb(), rgba(), and named CSS colours it can resolve without a DOM. Formatting emits ONE shape: #rrggbb, or #rrggbbaa when alpha is not fully opaque. That asymmetry is deliberate — a document that round-trips through an editor should not churn its bytes because someone typed #ABC.