surface(): parent-relative colour

The second plugin on scope() and the same runtime. A surface passes its colour down the tree; a nested surface is that colour with its OKLCH lightness moved, through any number of plain wrappers. These are tonal steps, not a contrast guarantee: contrast() and ink() pick a direction by lightness and never compute a ratio.

import * as import csscss from "cssints" with { type: "cssints" };
import { 
const surface: () => Chain<"surface", {
    readonly color: {
        readonly args: "<color>";
        readonly emit: (v: string) => [string, string][];
    };
    readonly lighten: {
        readonly args: "<number [0,1]>";
        readonly excludes: readonly ["darken", "contrast"];
        readonly emit: (v: string) => [string, string][];
    };
    readonly darken: {
        readonly args: "<number [0,1]>";
        readonly excludes: readonly ["lighten", "contrast"];
        readonly emit: (v: string) => [string, string][];
    };
    readonly contrast: {
        readonly args: "<number [0,1]>";
        readonly excludes: readonly ["lighten", "darken"];
        readonly emit: (v: string) => [string, string][];
    };
    readonly ink: {
        readonly args: "";
        readonly emit: () => [...][];
    };
}, AliasesOf<...>>
surface
} from "cssints/surface" with { type: "cssints" };
const const canvas: Token<"color", true, string>canvas = import csscss.
const token: {
    readonly number: TokenFn<"number">;
    readonly length: TokenFn<"length">;
    readonly color: TokenFn<"color">;
    readonly percentage: TokenFn<"percentage">;
    readonly integer: TokenFn<"integer">;
    readonly angle: TokenFn<"angle">;
    readonly time: TokenFn<"time">;
    readonly resolution: TokenFn<"resolution">;
    readonly url: TokenFn<"url">;
    readonly image: TokenFn<"image">;
    readonly shadow: TokenFn<"shadow">;
    readonly lengthPercentage: TokenFn<"lengthPercentage">;
    readonly customIdent: TokenFn<...>;
    readonly transformList: TokenFn<...>;
    readonly easingFunction: TokenFn<...>;
} & {
    ...;
}
`token.<type>(initial, name?)`: a Typed OM value of the type, `var(--name)`. With a name it can be set.
token
.color: <"#2b3a67", "canvas">(initial: "#2b3a67", name?: "canvas" | undefined) => Token<"color", true, string>color("#2b3a67", "canvas");
// a base, then a lighter card on it (a token or a colour), a field a step darker, a button pushed away from its parent export const
const page: Chain<"surface", Omit<{
    readonly color: {
        readonly args: "<color>";
        readonly emit: (v: string) => [string, string][];
    };
    readonly lighten: {
        readonly args: "<number [0,1]>";
        readonly excludes: readonly ["darken", "contrast"];
        readonly emit: (v: string) => [string, string][];
    };
    readonly darken: {
        readonly args: "<number [0,1]>";
        readonly excludes: readonly ["lighten", "contrast"];
        readonly emit: (v: string) => [string, string][];
    };
    readonly contrast: {
        readonly args: "<number [0,1]>";
        readonly excludes: readonly ["lighten", "darken"];
        readonly emit: (v: string) => [string, string][];
    };
    readonly ink: {
        readonly args: "";
        readonly emit: () => [...][];
    };
}, "color">, AliasesOf<...>>
page
=
function surface(): Chain<"surface", {
    readonly color: {
        readonly args: "<color>";
        readonly emit: (v: string) => [string, string][];
    };
    readonly lighten: {
        readonly args: "<number [0,1]>";
        readonly excludes: readonly ["darken", "contrast"];
        readonly emit: (v: string) => [string, string][];
    };
    readonly darken: {
        readonly args: "<number [0,1]>";
        readonly excludes: readonly ["lighten", "contrast"];
        readonly emit: (v: string) => [string, string][];
    };
    readonly contrast: {
        readonly args: "<number [0,1]>";
        readonly excludes: readonly ["lighten", "darken"];
        readonly emit: (v: string) => [string, string][];
    };
    readonly ink: {
        readonly args: "";
        readonly emit: () => [...][];
    };
}, AliasesOf<...>>
surface
().
color: <readonly [Token<"color", true, string>]>(parts_0: Token<"color", true, string>) => Chain<"surface", Omit<{
    readonly color: {
        readonly args: "<color>";
        readonly emit: (v: string) => [string, string][];
    };
    readonly lighten: {
        readonly args: "<number [0,1]>";
        readonly excludes: readonly ["darken", "contrast"];
        readonly emit: (v: string) => [string, string][];
    };
    readonly darken: {
        readonly args: "<number [0,1]>";
        readonly excludes: readonly ["lighten", "contrast"];
        readonly emit: (v: string) => [string, string][];
    };
    readonly contrast: {
        readonly args: "<number [0,1]>";
        readonly excludes: readonly ["lighten", "darken"];
        readonly emit: (v: string) => [...][];
    };
    readonly ink: {
        ...;
    };
}, "color">, AliasesOf<...>>
color
(const canvas: Token<"color", true, string>canvas);
export const const card: css.Stylecard = import csscss.const cn: (...styles: css.Style[]) => css.Stylecn(
function surface(): Chain<"surface", {
    readonly color: {
        readonly args: "<color>";
        readonly emit: (v: string) => [string, string][];
    };
    readonly lighten: {
        readonly args: "<number [0,1]>";
        readonly excludes: readonly ["darken", "contrast"];
        readonly emit: (v: string) => [string, string][];
    };
    readonly darken: {
        readonly args: "<number [0,1]>";
        readonly excludes: readonly ["lighten", "contrast"];
        readonly emit: (v: string) => [string, string][];
    };
    readonly contrast: {
        readonly args: "<number [0,1]>";
        readonly excludes: readonly ["lighten", "darken"];
        readonly emit: (v: string) => [string, string][];
    };
    readonly ink: {
        readonly args: "";
        readonly emit: () => [...][];
    };
}, AliasesOf<...>>
surface
().
lighten: <readonly [0.06]>(parts_0: 0.06) => Chain<"surface", Omit<{
    readonly color: {
        readonly args: "<color>";
        readonly emit: (v: string) => [string, string][];
    };
    readonly lighten: {
        readonly args: "<number [0,1]>";
        readonly excludes: readonly ["darken", "contrast"];
        readonly emit: (v: string) => [string, string][];
    };
    readonly darken: {
        readonly args: "<number [0,1]>";
        readonly excludes: readonly ["lighten", "contrast"];
        readonly emit: (v: string) => [string, string][];
    };
    readonly contrast: {
        readonly args: "<number [0,1]>";
        readonly excludes: readonly ["lighten", "darken"];
        readonly emit: (v: string) => [string, string][];
    };
    readonly ink: {
        ...;
    };
}, "lighten" | ... 1 more ... | "contrast">, AliasesOf<...>>
lighten
(0.06), import csscss.const hover: (...styles: css.Style[]) => css.Style
Chrome 1, Edge 12, Firefox 1, Safari 2, iOS 1, Android 18. [MDN](https://developer.mozilla.org/docs/Web/CSS/:hover)
hover
(
function surface(): Chain<"surface", {
    readonly color: {
        readonly args: "<color>";
        readonly emit: (v: string) => [string, string][];
    };
    readonly lighten: {
        readonly args: "<number [0,1]>";
        readonly excludes: readonly ["darken", "contrast"];
        readonly emit: (v: string) => [string, string][];
    };
    readonly darken: {
        readonly args: "<number [0,1]>";
        readonly excludes: readonly ["lighten", "contrast"];
        readonly emit: (v: string) => [string, string][];
    };
    readonly contrast: {
        readonly args: "<number [0,1]>";
        readonly excludes: readonly ["lighten", "darken"];
        readonly emit: (v: string) => [string, string][];
    };
    readonly ink: {
        readonly args: "";
        readonly emit: () => [...][];
    };
}, AliasesOf<...>>
surface
().
lighten: <readonly [0.1]>(parts_0: 0.1) => Chain<"surface", Omit<{
    readonly color: {
        readonly args: "<color>";
        readonly emit: (v: string) => [string, string][];
    };
    readonly lighten: {
        readonly args: "<number [0,1]>";
        readonly excludes: readonly ["darken", "contrast"];
        readonly emit: (v: string) => [string, string][];
    };
    readonly darken: {
        readonly args: "<number [0,1]>";
        readonly excludes: readonly ["lighten", "contrast"];
        readonly emit: (v: string) => [string, string][];
    };
    readonly contrast: {
        readonly args: "<number [0,1]>";
        readonly excludes: readonly ["lighten", "darken"];
        readonly emit: (v: string) => [string, string][];
    };
    readonly ink: {
        ...;
    };
}, "lighten" | ... 1 more ... | "contrast">, AliasesOf<...>>
lighten
(0.1)));
export const
const field: Chain<"surface", Omit<{
    readonly color: {
        readonly args: "<color>";
        readonly emit: (v: string) => [string, string][];
    };
    readonly lighten: {
        readonly args: "<number [0,1]>";
        readonly excludes: readonly ["darken", "contrast"];
        readonly emit: (v: string) => [string, string][];
    };
    readonly darken: {
        readonly args: "<number [0,1]>";
        readonly excludes: readonly ["lighten", "contrast"];
        readonly emit: (v: string) => [string, string][];
    };
    readonly contrast: {
        readonly args: "<number [0,1]>";
        readonly excludes: readonly ["lighten", "darken"];
        readonly emit: (v: string) => [string, string][];
    };
    readonly ink: {
        readonly args: "";
        readonly emit: () => [...][];
    };
}, "lighten" | ... 1 more ... | "contrast">, AliasesOf<...>>
field
=
function surface(): Chain<"surface", {
    readonly color: {
        readonly args: "<color>";
        readonly emit: (v: string) => [string, string][];
    };
    readonly lighten: {
        readonly args: "<number [0,1]>";
        readonly excludes: readonly ["darken", "contrast"];
        readonly emit: (v: string) => [string, string][];
    };
    readonly darken: {
        readonly args: "<number [0,1]>";
        readonly excludes: readonly ["lighten", "contrast"];
        readonly emit: (v: string) => [string, string][];
    };
    readonly contrast: {
        readonly args: "<number [0,1]>";
        readonly excludes: readonly ["lighten", "darken"];
        readonly emit: (v: string) => [string, string][];
    };
    readonly ink: {
        readonly args: "";
        readonly emit: () => [...][];
    };
}, AliasesOf<...>>
surface
().
darken: <readonly [0.03]>(parts_0: 0.03) => Chain<"surface", Omit<{
    readonly color: {
        readonly args: "<color>";
        readonly emit: (v: string) => [string, string][];
    };
    readonly lighten: {
        readonly args: "<number [0,1]>";
        readonly excludes: readonly ["darken", "contrast"];
        readonly emit: (v: string) => [string, string][];
    };
    readonly darken: {
        readonly args: "<number [0,1]>";
        readonly excludes: readonly ["lighten", "contrast"];
        readonly emit: (v: string) => [string, string][];
    };
    readonly contrast: {
        readonly args: "<number [0,1]>";
        readonly excludes: readonly ["lighten", "darken"];
        readonly emit: (v: string) => [string, string][];
    };
    readonly ink: {
        ...;
    };
}, "lighten" | ... 1 more ... | "contrast">, AliasesOf<...>>
darken
(0.03);
export const
const cta: Chain<"surface", Omit<Omit<Omit<{
    readonly color: {
        readonly args: "<color>";
        readonly emit: (v: string) => [string, string][];
    };
    readonly lighten: {
        readonly args: "<number [0,1]>";
        readonly excludes: readonly ["darken", "contrast"];
        readonly emit: (v: string) => [string, string][];
    };
    readonly darken: {
        readonly args: "<number [0,1]>";
        readonly excludes: readonly ["lighten", "contrast"];
        readonly emit: (v: string) => [string, string][];
    };
    readonly contrast: {
        readonly args: "<number [0,1]>";
        readonly excludes: readonly ["lighten", "darken"];
        readonly emit: (v: string) => [string, string][];
    };
    readonly ink: {
        readonly args: "";
        readonly emit: () => [...][];
    };
}, "color">, "lighten" | ... 1 more ... | "contrast">, "ink">, AliasesOf<...>>
cta
=
function surface(): Chain<"surface", {
    readonly color: {
        readonly args: "<color>";
        readonly emit: (v: string) => [string, string][];
    };
    readonly lighten: {
        readonly args: "<number [0,1]>";
        readonly excludes: readonly ["darken", "contrast"];
        readonly emit: (v: string) => [string, string][];
    };
    readonly darken: {
        readonly args: "<number [0,1]>";
        readonly excludes: readonly ["lighten", "contrast"];
        readonly emit: (v: string) => [string, string][];
    };
    readonly contrast: {
        readonly args: "<number [0,1]>";
        readonly excludes: readonly ["lighten", "darken"];
        readonly emit: (v: string) => [string, string][];
    };
    readonly ink: {
        readonly args: "";
        readonly emit: () => [...][];
    };
}, AliasesOf<...>>
surface
().
color: <readonly ["oklch(from #e11d48 l c h)"]>(parts_0: "oklch(from #e11d48 l c h)") => Chain<"surface", Omit<{
    readonly color: {
        readonly args: "<color>";
        readonly emit: (v: string) => [string, string][];
    };
    readonly lighten: {
        readonly args: "<number [0,1]>";
        readonly excludes: readonly ["darken", "contrast"];
        readonly emit: (v: string) => [string, string][];
    };
    readonly darken: {
        readonly args: "<number [0,1]>";
        readonly excludes: readonly ["lighten", "contrast"];
        readonly emit: (v: string) => [string, string][];
    };
    readonly contrast: {
        readonly args: "<number [0,1]>";
        readonly excludes: readonly ["lighten", "darken"];
        readonly emit: (v: string) => [...][];
    };
    readonly ink: {
        ...;
    };
}, "color">, AliasesOf<...>>
color
("oklch(from #e11d48 l c h)").
contrast: <readonly [0.15]>(parts_0: 0.15) => Chain<"surface", Omit<Omit<{
    readonly color: {
        readonly args: "<color>";
        readonly emit: (v: string) => [string, string][];
    };
    readonly lighten: {
        readonly args: "<number [0,1]>";
        readonly excludes: readonly ["darken", "contrast"];
        readonly emit: (v: string) => [string, string][];
    };
    readonly darken: {
        readonly args: "<number [0,1]>";
        readonly excludes: readonly ["lighten", "contrast"];
        readonly emit: (v: string) => [string, string][];
    };
    readonly contrast: {
        readonly args: "<number [0,1]>";
        readonly excludes: readonly ["lighten", "darken"];
        readonly emit: (v: string) => [string, string][];
    };
    readonly ink: {
        ...;
    };
}, "color">, "lighten" | ... 1 more ... | "contrast">, AliasesOf<...>>
contrast
(0.15).
ink: () => Chain<"surface", Omit<Omit<Omit<{
    readonly color: {
        readonly args: "<color>";
        readonly emit: (v: string) => [string, string][];
    };
    readonly lighten: {
        readonly args: "<number [0,1]>";
        readonly excludes: readonly ["darken", "contrast"];
        readonly emit: (v: string) => [string, string][];
    };
    readonly darken: {
        readonly args: "<number [0,1]>";
        readonly excludes: readonly ["lighten", "contrast"];
        readonly emit: (v: string) => [string, string][];
    };
    readonly contrast: {
        readonly args: "<number [0,1]>";
        readonly excludes: readonly ["lighten", "darken"];
        readonly emit: (v: string) => [string, string][];
    };
    readonly ink: {
        readonly args: "";
        readonly emit: () => [...][];
    };
}, "color">, "lighten" | ... 1 more ... | "contrast">, "ink">, AliasesOf<...>>
ink
();
export const const both: anyboth =
function surface(): Chain<"surface", {
    readonly color: {
        readonly args: "<color>";
        readonly emit: (v: string) => [string, string][];
    };
    readonly lighten: {
        readonly args: "<number [0,1]>";
        readonly excludes: readonly ["darken", "contrast"];
        readonly emit: (v: string) => [string, string][];
    };
    readonly darken: {
        readonly args: "<number [0,1]>";
        readonly excludes: readonly ["lighten", "contrast"];
        readonly emit: (v: string) => [string, string][];
    };
    readonly contrast: {
        readonly args: "<number [0,1]>";
        readonly excludes: readonly ["lighten", "darken"];
        readonly emit: (v: string) => [string, string][];
    };
    readonly ink: {
        readonly args: "";
        readonly emit: () => [...][];
    };
}, AliasesOf<...>>
surface
().
lighten: <readonly [0.1]>(parts_0: 0.1) => Chain<"surface", Omit<{
    readonly color: {
        readonly args: "<color>";
        readonly emit: (v: string) => [string, string][];
    };
    readonly lighten: {
        readonly args: "<number [0,1]>";
        readonly excludes: readonly ["darken", "contrast"];
        readonly emit: (v: string) => [string, string][];
    };
    readonly darken: {
        readonly args: "<number [0,1]>";
        readonly excludes: readonly ["lighten", "contrast"];
        readonly emit: (v: string) => [string, string][];
    };
    readonly contrast: {
        readonly args: "<number [0,1]>";
        readonly excludes: readonly ["lighten", "darken"];
        readonly emit: (v: string) => [string, string][];
    };
    readonly ink: {
        ...;
    };
}, "lighten" | ... 1 more ... | "contrast">, AliasesOf<...>>
lighten
(0.1).darken(0.1); // error: lighten, darken and contrast do not go together
Property 'darken' does not exist on type 'Chain<"surface", Omit<{ readonly color: { readonly args: "<color>"; readonly emit: (v: string) => [string, string][]; }; readonly lighten: { readonly args: "<number [0,1]>"; readonly excludes: readonly ["darken", "contrast"]; readonly emit: (v: string) => [...][]; }; readonly darken: { ...; }; readonly contrast: { ....'.
export const
const wide: Chain<"surface", Omit<{
    readonly color: {
        readonly args: "<color>";
        readonly emit: (v: string) => [string, string][];
    };
    readonly lighten: {
        readonly args: "<number [0,1]>";
        readonly excludes: readonly ["darken", "contrast"];
        readonly emit: (v: string) => [string, string][];
    };
    readonly darken: {
        readonly args: "<number [0,1]>";
        readonly excludes: readonly ["lighten", "contrast"];
        readonly emit: (v: string) => [string, string][];
    };
    readonly contrast: {
        readonly args: "<number [0,1]>";
        readonly excludes: readonly ["lighten", "darken"];
        readonly emit: (v: string) => [string, string][];
    };
    readonly ink: {
        readonly args: "";
        readonly emit: () => [...][];
    };
}, "color">, AliasesOf<...>>
wide
=
function surface(): Chain<"surface", {
    readonly color: {
        readonly args: "<color>";
        readonly emit: (v: string) => [string, string][];
    };
    readonly lighten: {
        readonly args: "<number [0,1]>";
        readonly excludes: readonly ["darken", "contrast"];
        readonly emit: (v: string) => [string, string][];
    };
    readonly darken: {
        readonly args: "<number [0,1]>";
        readonly excludes: readonly ["lighten", "contrast"];
        readonly emit: (v: string) => [string, string][];
    };
    readonly contrast: {
        readonly args: "<number [0,1]>";
        readonly excludes: readonly ["lighten", "darken"];
        readonly emit: (v: string) => [string, string][];
    };
    readonly ink: {
        readonly args: "";
        readonly emit: () => [...][];
    };
}, AliasesOf<...>>
surface
().
color: <readonly ["wide"]>(parts_0: "surface.color: unexpected \"wide\" in \"wide\", grammar <color>") => Chain<"surface", Omit<{
    readonly color: {
        readonly args: "<color>";
        readonly emit: (v: string) => [string, string][];
    };
    readonly lighten: {
        readonly args: "<number [0,1]>";
        readonly excludes: readonly ["darken", "contrast"];
        readonly emit: (v: string) => [string, string][];
    };
    readonly darken: {
        readonly args: "<number [0,1]>";
        readonly excludes: readonly ["lighten", "contrast"];
        readonly emit: (v: string) => [string, string][];
    };
    readonly contrast: {
        readonly args: "<number [0,1]>";
        readonly excludes: readonly ["lighten", "darken"];
        readonly emit: (v: string) => [...][];
    };
    readonly ink: {
        ...;
    };
}, "color">, AliasesOf<...>>
color
("wide"); // error: not a colour
Argument of type '"wide"' is not assignable to parameter of type '"surface.color: unexpected \"wide\" in \"wide\", grammar <color>"'.
export const
const noValue: Chain<"surface", Omit<{
    readonly color: {
        readonly args: "<color>";
        readonly emit: (v: string) => [string, string][];
    };
    readonly lighten: {
        readonly args: "<number [0,1]>";
        readonly excludes: readonly ["darken", "contrast"];
        readonly emit: (v: string) => [string, string][];
    };
    readonly darken: {
        readonly args: "<number [0,1]>";
        readonly excludes: readonly ["lighten", "contrast"];
        readonly emit: (v: string) => [string, string][];
    };
    readonly contrast: {
        readonly args: "<number [0,1]>";
        readonly excludes: readonly ["lighten", "darken"];
        readonly emit: (v: string) => [string, string][];
    };
    readonly ink: {
        readonly args: "";
        readonly emit: () => [...][];
    };
}, "ink">, AliasesOf<...>>
noValue
=
function surface(): Chain<"surface", {
    readonly color: {
        readonly args: "<color>";
        readonly emit: (v: string) => [string, string][];
    };
    readonly lighten: {
        readonly args: "<number [0,1]>";
        readonly excludes: readonly ["darken", "contrast"];
        readonly emit: (v: string) => [string, string][];
    };
    readonly darken: {
        readonly args: "<number [0,1]>";
        readonly excludes: readonly ["lighten", "contrast"];
        readonly emit: (v: string) => [string, string][];
    };
    readonly contrast: {
        readonly args: "<number [0,1]>";
        readonly excludes: readonly ["lighten", "darken"];
        readonly emit: (v: string) => [string, string][];
    };
    readonly ink: {
        readonly args: "";
        readonly emit: () => [...][];
    };
}, AliasesOf<...>>
surface
().
ink: () => Chain<"surface", Omit<{
    readonly color: {
        readonly args: "<color>";
        readonly emit: (v: string) => [string, string][];
    };
    readonly lighten: {
        readonly args: "<number [0,1]>";
        readonly excludes: readonly ["darken", "contrast"];
        readonly emit: (v: string) => [string, string][];
    };
    readonly darken: {
        readonly args: "<number [0,1]>";
        readonly excludes: readonly ["lighten", "contrast"];
        readonly emit: (v: string) => [string, string][];
    };
    readonly contrast: {
        readonly args: "<number [0,1]>";
        readonly excludes: readonly ["lighten", "darken"];
        readonly emit: (v: string) => [string, string][];
    };
    readonly ink: {
        readonly args: "";
        readonly emit: () => [...][];
    };
}, "ink">, AliasesOf<...>>
ink
("black"); // error: ink() takes no value
Expected 0 arguments, but got 1.
export const const own: anyown =
function surface(): Chain<"surface", {
    readonly color: {
        readonly args: "<color>";
        readonly emit: (v: string) => [string, string][];
    };
    readonly lighten: {
        readonly args: "<number [0,1]>";
        readonly excludes: readonly ["darken", "contrast"];
        readonly emit: (v: string) => [string, string][];
    };
    readonly darken: {
        readonly args: "<number [0,1]>";
        readonly excludes: readonly ["lighten", "contrast"];
        readonly emit: (v: string) => [string, string][];
    };
    readonly contrast: {
        readonly args: "<number [0,1]>";
        readonly excludes: readonly ["lighten", "darken"];
        readonly emit: (v: string) => [string, string][];
    };
    readonly ink: {
        readonly args: "";
        readonly emit: () => [...][];
    };
}, AliasesOf<...>>
surface
().radius("4px"); // error: a surface chains its own methods only
Property 'radius' does not exist on type 'Chain<"surface", { readonly color: { readonly args: "<color>"; readonly emit: (v: string) => [string, string][]; }; readonly lighten: { readonly args: "<number [0,1]>"; readonly excludes: readonly ["darken", "contrast"]; readonly emit: (v: string) => [...][]; }; readonly darken: { ...; }; readonly contrast: { ...; }...'.