css-calipers 0.15.0 → 1.1.0-beta.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (207) hide show
  1. package/LICENSE.txt +1 -1
  2. package/README.md +70 -434
  3. package/dist/cjs/color/formats/display-p3/display-p3.js +25 -0
  4. package/dist/cjs/color/formats/escalate.js +41 -0
  5. package/dist/cjs/color/formats/hex/hex.js +28 -0
  6. package/dist/cjs/color/formats/hexAlpha/hexAlpha.js +25 -0
  7. package/dist/cjs/color/formats/hsl/hsl.js +23 -0
  8. package/dist/cjs/color/formats/hwb/hwb.js +24 -0
  9. package/dist/cjs/color/formats/index.js +36 -0
  10. package/dist/cjs/color/formats/internals.js +93 -0
  11. package/dist/cjs/color/formats/lab/lab.js +24 -0
  12. package/dist/cjs/color/formats/lch/lch.js +23 -0
  13. package/dist/cjs/color/formats/oklab/oklab.js +24 -0
  14. package/dist/cjs/color/formats/oklch/oklch.js +28 -0
  15. package/dist/cjs/color/formats/resolve.js +16 -0
  16. package/dist/cjs/color/formats/rgb/rgb.js +29 -0
  17. package/dist/cjs/color/formats/rgba/rgba.js +27 -0
  18. package/dist/cjs/color/formats/types.js +11 -0
  19. package/dist/cjs/color/index.js +619 -0
  20. package/dist/cjs/color/types.js +2 -0
  21. package/dist/cjs/core.js +11 -8
  22. package/dist/cjs/corpus.js +53 -0
  23. package/dist/cjs/css-values/cssValues.js +78 -0
  24. package/dist/cjs/css-values/index.js +36 -0
  25. package/dist/cjs/css-values/multi.js +290 -0
  26. package/dist/cjs/css-values/propertyMap.js +2 -0
  27. package/dist/cjs/css-values/spec.js +197 -0
  28. package/dist/cjs/default.js +17 -0
  29. package/dist/cjs/factory.js +1 -1
  30. package/dist/cjs/float.js +110 -0
  31. package/dist/cjs/index.js +29 -9
  32. package/dist/cjs/integer.js +114 -0
  33. package/dist/cjs/internal/createCoreApi.js +103 -38
  34. package/dist/cjs/internal/errors.js +13 -14
  35. package/dist/cjs/internal/toPlainDecimal.js +31 -0
  36. package/dist/cjs/measurements.js +41 -0
  37. package/dist/cjs/ratio.js +57 -22
  38. package/dist/cjs/scalar.js +9 -0
  39. package/dist/cjs/units/absolute.js +8 -8
  40. package/dist/cjs/units/angle.js +5 -5
  41. package/dist/cjs/units/container.js +7 -7
  42. package/dist/cjs/units/font-relative.js +13 -13
  43. package/dist/cjs/units/frequency.js +3 -3
  44. package/dist/cjs/units/grid.js +2 -2
  45. package/dist/cjs/units/index.js +9 -9
  46. package/dist/cjs/units/percent.js +4 -4
  47. package/dist/cjs/units/resolution.js +4 -4
  48. package/dist/cjs/units/time.js +3 -3
  49. package/dist/cjs/units/viewport-dynamic.js +7 -7
  50. package/dist/cjs/units/viewport-large.js +7 -7
  51. package/dist/cjs/units/viewport-small.js +7 -7
  52. package/dist/cjs/units/viewport.js +7 -7
  53. package/dist/esm/color/formats/display-p3/display-p3.d.ts +10 -0
  54. package/dist/esm/color/formats/display-p3/display-p3.d.ts.map +1 -0
  55. package/dist/esm/color/formats/display-p3/display-p3.js +22 -0
  56. package/dist/esm/color/formats/escalate.d.ts +10 -0
  57. package/dist/esm/color/formats/escalate.d.ts.map +1 -0
  58. package/dist/esm/color/formats/escalate.js +37 -0
  59. package/dist/esm/color/formats/hex/hex.d.ts +9 -0
  60. package/dist/esm/color/formats/hex/hex.d.ts.map +1 -0
  61. package/dist/esm/color/formats/hex/hex.js +25 -0
  62. package/dist/esm/color/formats/hexAlpha/hexAlpha.d.ts +9 -0
  63. package/dist/esm/color/formats/hexAlpha/hexAlpha.d.ts.map +1 -0
  64. package/dist/esm/color/formats/hexAlpha/hexAlpha.js +22 -0
  65. package/dist/esm/color/formats/hsl/hsl.d.ts +8 -0
  66. package/dist/esm/color/formats/hsl/hsl.d.ts.map +1 -0
  67. package/dist/esm/color/formats/hsl/hsl.js +20 -0
  68. package/dist/esm/color/formats/hwb/hwb.d.ts +9 -0
  69. package/dist/esm/color/formats/hwb/hwb.d.ts.map +1 -0
  70. package/dist/esm/color/formats/hwb/hwb.js +21 -0
  71. package/dist/esm/color/formats/index.d.ts +24 -0
  72. package/dist/esm/color/formats/index.d.ts.map +1 -0
  73. package/dist/esm/color/formats/index.js +32 -0
  74. package/dist/esm/color/formats/internals.d.ts +35 -0
  75. package/dist/esm/color/formats/internals.d.ts.map +1 -0
  76. package/dist/esm/color/formats/internals.js +78 -0
  77. package/dist/esm/color/formats/lab/lab.d.ts +9 -0
  78. package/dist/esm/color/formats/lab/lab.d.ts.map +1 -0
  79. package/dist/esm/color/formats/lab/lab.js +21 -0
  80. package/dist/esm/color/formats/lch/lch.d.ts +8 -0
  81. package/dist/esm/color/formats/lch/lch.d.ts.map +1 -0
  82. package/dist/esm/color/formats/lch/lch.js +20 -0
  83. package/dist/esm/color/formats/oklab/oklab.d.ts +9 -0
  84. package/dist/esm/color/formats/oklab/oklab.d.ts.map +1 -0
  85. package/dist/esm/color/formats/oklab/oklab.js +21 -0
  86. package/dist/esm/color/formats/oklch/oklch.d.ts +13 -0
  87. package/dist/esm/color/formats/oklch/oklch.d.ts.map +1 -0
  88. package/dist/esm/color/formats/oklch/oklch.js +25 -0
  89. package/dist/esm/color/formats/resolve.d.ts +15 -0
  90. package/dist/esm/color/formats/resolve.d.ts.map +1 -0
  91. package/dist/esm/color/formats/resolve.js +12 -0
  92. package/dist/esm/color/formats/rgb/rgb.d.ts +11 -0
  93. package/dist/esm/color/formats/rgb/rgb.d.ts.map +1 -0
  94. package/dist/esm/color/formats/rgb/rgb.js +26 -0
  95. package/dist/esm/color/formats/rgba/rgba.d.ts +9 -0
  96. package/dist/esm/color/formats/rgba/rgba.d.ts.map +1 -0
  97. package/dist/esm/color/formats/rgba/rgba.js +24 -0
  98. package/dist/esm/color/formats/types.d.ts +48 -0
  99. package/dist/esm/color/formats/types.d.ts.map +1 -0
  100. package/dist/esm/color/formats/types.js +7 -0
  101. package/dist/esm/color/index.d.ts +81 -0
  102. package/dist/esm/color/index.d.ts.map +1 -0
  103. package/dist/esm/color/index.js +609 -0
  104. package/dist/esm/color/types.d.ts +294 -0
  105. package/dist/esm/color/types.d.ts.map +1 -0
  106. package/dist/esm/color/types.js +1 -0
  107. package/dist/esm/core.d.ts +76 -270
  108. package/dist/esm/core.d.ts.map +1 -1
  109. package/dist/esm/core.js +5 -7
  110. package/dist/esm/corpus.d.ts +26 -0
  111. package/dist/esm/corpus.d.ts.map +1 -0
  112. package/dist/esm/corpus.js +37 -0
  113. package/dist/esm/css-values/cssValues.d.ts +60 -0
  114. package/dist/esm/css-values/cssValues.d.ts.map +1 -0
  115. package/dist/esm/css-values/cssValues.js +74 -0
  116. package/dist/esm/css-values/index.d.ts +6 -0
  117. package/dist/esm/css-values/index.d.ts.map +1 -0
  118. package/dist/esm/css-values/index.js +12 -0
  119. package/dist/esm/css-values/multi.d.ts +188 -0
  120. package/dist/esm/css-values/multi.d.ts.map +1 -0
  121. package/dist/esm/css-values/multi.js +281 -0
  122. package/dist/esm/css-values/propertyMap.d.ts +39 -0
  123. package/dist/esm/css-values/propertyMap.d.ts.map +1 -0
  124. package/dist/esm/css-values/propertyMap.js +1 -0
  125. package/dist/esm/css-values/spec.d.ts +36 -0
  126. package/dist/esm/css-values/spec.d.ts.map +1 -0
  127. package/dist/esm/css-values/spec.js +194 -0
  128. package/dist/esm/default.d.ts +267 -0
  129. package/dist/esm/default.d.ts.map +1 -0
  130. package/dist/esm/default.js +14 -0
  131. package/dist/esm/factory.d.ts +1 -1
  132. package/dist/esm/factory.d.ts.map +1 -1
  133. package/dist/esm/factory.js +3 -3
  134. package/dist/esm/float.d.ts +35 -0
  135. package/dist/esm/float.d.ts.map +1 -0
  136. package/dist/esm/float.js +104 -0
  137. package/dist/esm/index.d.ts +11 -9
  138. package/dist/esm/index.d.ts.map +1 -1
  139. package/dist/esm/index.js +19 -9
  140. package/dist/esm/integer.d.ts +36 -0
  141. package/dist/esm/integer.d.ts.map +1 -0
  142. package/dist/esm/integer.js +108 -0
  143. package/dist/esm/internal/buildMeasurementCreationError.tests.d.ts +1 -1
  144. package/dist/esm/internal/buildMeasurementCreationError.tests.d.ts.map +1 -1
  145. package/dist/esm/internal/createCoreApi.d.ts +9 -1
  146. package/dist/esm/internal/createCoreApi.d.ts.map +1 -1
  147. package/dist/esm/internal/createCoreApi.js +103 -38
  148. package/dist/esm/internal/createUnitsApi.d.ts +1 -1
  149. package/dist/esm/internal/createUnitsApi.d.ts.map +1 -1
  150. package/dist/esm/internal/errors.d.ts +3 -3
  151. package/dist/esm/internal/errors.d.ts.map +1 -1
  152. package/dist/esm/internal/errors.js +13 -14
  153. package/dist/esm/internal/toPlainDecimal.d.ts +2 -0
  154. package/dist/esm/internal/toPlainDecimal.d.ts.map +1 -0
  155. package/dist/esm/internal/toPlainDecimal.js +27 -0
  156. package/dist/esm/measurements.d.ts +16 -0
  157. package/dist/esm/measurements.d.ts.map +1 -0
  158. package/dist/esm/measurements.js +25 -0
  159. package/dist/esm/ratio.d.ts +14 -5
  160. package/dist/esm/ratio.d.ts.map +1 -1
  161. package/dist/esm/ratio.js +57 -22
  162. package/dist/esm/scalar.d.ts +14 -0
  163. package/dist/esm/scalar.d.ts.map +1 -0
  164. package/dist/esm/scalar.js +5 -0
  165. package/dist/esm/units/absolute.d.ts +1 -1
  166. package/dist/esm/units/absolute.d.ts.map +1 -1
  167. package/dist/esm/units/absolute.js +1 -1
  168. package/dist/esm/units/angle.d.ts +1 -1
  169. package/dist/esm/units/angle.d.ts.map +1 -1
  170. package/dist/esm/units/angle.js +1 -1
  171. package/dist/esm/units/container.d.ts +1 -1
  172. package/dist/esm/units/container.d.ts.map +1 -1
  173. package/dist/esm/units/container.js +1 -1
  174. package/dist/esm/units/font-relative.d.ts +1 -1
  175. package/dist/esm/units/font-relative.d.ts.map +1 -1
  176. package/dist/esm/units/font-relative.js +1 -1
  177. package/dist/esm/units/frequency.d.ts +1 -1
  178. package/dist/esm/units/frequency.d.ts.map +1 -1
  179. package/dist/esm/units/frequency.js +1 -1
  180. package/dist/esm/units/grid.d.ts +1 -1
  181. package/dist/esm/units/grid.d.ts.map +1 -1
  182. package/dist/esm/units/grid.js +1 -1
  183. package/dist/esm/units/index.d.ts +9 -9
  184. package/dist/esm/units/index.d.ts.map +1 -1
  185. package/dist/esm/units/index.js +9 -9
  186. package/dist/esm/units/percent.d.ts +1 -1
  187. package/dist/esm/units/percent.d.ts.map +1 -1
  188. package/dist/esm/units/percent.js +1 -1
  189. package/dist/esm/units/resolution.d.ts +1 -1
  190. package/dist/esm/units/resolution.d.ts.map +1 -1
  191. package/dist/esm/units/resolution.js +1 -1
  192. package/dist/esm/units/time.d.ts +1 -1
  193. package/dist/esm/units/time.d.ts.map +1 -1
  194. package/dist/esm/units/time.js +1 -1
  195. package/dist/esm/units/viewport-dynamic.d.ts +1 -1
  196. package/dist/esm/units/viewport-dynamic.d.ts.map +1 -1
  197. package/dist/esm/units/viewport-dynamic.js +1 -1
  198. package/dist/esm/units/viewport-large.d.ts +1 -1
  199. package/dist/esm/units/viewport-large.d.ts.map +1 -1
  200. package/dist/esm/units/viewport-large.js +1 -1
  201. package/dist/esm/units/viewport-small.d.ts +1 -1
  202. package/dist/esm/units/viewport-small.d.ts.map +1 -1
  203. package/dist/esm/units/viewport-small.js +1 -1
  204. package/dist/esm/units/viewport.d.ts +1 -1
  205. package/dist/esm/units/viewport.d.ts.map +1 -1
  206. package/dist/esm/units/viewport.js +1 -1
  207. package/package.json +55 -13
@@ -0,0 +1,21 @@
1
+ import { alphaSlot, fitGamut, hueOf, inSrgb, pct, toHwb, } from '../internals';
2
+ import { defineColorSpace } from '../types';
3
+ /**
4
+ * hwb — sRGB, alpha, higher precision. Newer than `hsl`/`rgb` (~96% support), so it
5
+ * carries an `@supports` probe and is not treated as the safe floor. Out-of-sRGB is
6
+ * clamped (strictness-governed).
7
+ *
8
+ * See `hwb.md`.
9
+ */
10
+ export const hwb = defineColorSpace({
11
+ format: 'hwb',
12
+ hasAlpha: true,
13
+ gamut: 'srgb',
14
+ supportsProbe: '(color: hwb(0 0% 0%))',
15
+ gamutDependent: false,
16
+ srgbFloor: false,
17
+ render: (color, cfg) => {
18
+ const c = toHwb(fitGamut(color, inSrgb, 'rgb', cfg.strictness));
19
+ return `hwb(${hueOf(c.h)} ${pct(c.w)}% ${pct(c.b)}%${alphaSlot(color, cfg)})`;
20
+ },
21
+ });
@@ -0,0 +1,24 @@
1
+ import type { ColorSpaceDescriptor } from './types';
2
+ /**
3
+ * The unified color-format registry: every built-in format's descriptor, keyed by
4
+ * its format name. Each entry doubles as the book's output selector (it satisfies
5
+ * `CssFormat`, having a `format`) and as the fallback descriptor (render + metadata).
6
+ * Custom/experimental formats join a priority list via `defineColorSpace`, they do
7
+ * not need to live here.
8
+ */
9
+ export declare const colorFormats: {
10
+ rgba: ColorSpaceDescriptor<"rgba">;
11
+ rgb: ColorSpaceDescriptor<"rgb">;
12
+ hex: ColorSpaceDescriptor<"hex">;
13
+ hexAlpha: ColorSpaceDescriptor<"hexAlpha">;
14
+ hsl: ColorSpaceDescriptor<"hsl">;
15
+ hwb: ColorSpaceDescriptor<"hwb">;
16
+ lab: ColorSpaceDescriptor<"lab">;
17
+ lch: ColorSpaceDescriptor<"lch">;
18
+ oklab: ColorSpaceDescriptor<"oklab">;
19
+ oklch: ColorSpaceDescriptor<"oklch">;
20
+ displayP3: ColorSpaceDescriptor<"displayP3">;
21
+ };
22
+ export type { ColorSpaceDescriptor, ColorString, Gamut, } from './types';
23
+ export { defineColorSpace } from './types';
24
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/color/formats/index.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,SAAS,CAAC;AAEpD;;;;;;GAMG;AACH,eAAO,MAAM,YAAY;;;;;;;;;;;;CAY2B,CAAC;AAErD,YAAY,EACV,oBAAoB,EACpB,WAAW,EACX,KAAK,GACN,MAAM,SAAS,CAAC;AACjB,OAAO,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC"}
@@ -0,0 +1,32 @@
1
+ import { displayP3 } from './display-p3/display-p3';
2
+ import { hex } from './hex/hex';
3
+ import { hexAlpha } from './hexAlpha/hexAlpha';
4
+ import { hsl } from './hsl/hsl';
5
+ import { hwb } from './hwb/hwb';
6
+ import { lab } from './lab/lab';
7
+ import { lch } from './lch/lch';
8
+ import { oklab } from './oklab/oklab';
9
+ import { oklch } from './oklch/oklch';
10
+ import { rgb } from './rgb/rgb';
11
+ import { rgba } from './rgba/rgba';
12
+ /**
13
+ * The unified color-format registry: every built-in format's descriptor, keyed by
14
+ * its format name. Each entry doubles as the book's output selector (it satisfies
15
+ * `CssFormat`, having a `format`) and as the fallback descriptor (render + metadata).
16
+ * Custom/experimental formats join a priority list via `defineColorSpace`, they do
17
+ * not need to live here.
18
+ */
19
+ export const colorFormats = {
20
+ rgba,
21
+ rgb,
22
+ hex,
23
+ hexAlpha,
24
+ hsl,
25
+ hwb,
26
+ lab,
27
+ lch,
28
+ oklab,
29
+ oklch,
30
+ displayP3,
31
+ };
32
+ export { defineColorSpace } from './types';
@@ -0,0 +1,35 @@
1
+ import type { Color } from 'culori';
2
+ import type { ColorConfig, Strictness } from '../types';
3
+ /**
4
+ * Surface a "can't faithfully represent this" violation (dropped alpha,
5
+ * out-of-gamut) per the strictness knob. `auto` = throw in dev / warn in prod.
6
+ */
7
+ export declare const violate: (message: string, strictness: Strictness) => void;
8
+ /** Round to `precision` decimal places (default 3). */
9
+ export declare const round: (value: number, precision?: number) => number;
10
+ export declare const clamp01: (value: number) => number;
11
+ export declare const channel255: (value: number) => number;
12
+ /** Normalize a hue to `[0, 360)` at 2dp; a missing hue reads as 0. */
13
+ export declare const hueOf: (h: number | undefined) => number;
14
+ export declare const pct: (value: number) => number;
15
+ /** A color's alpha rounded to 3dp; a missing alpha is opaque (1). */
16
+ export declare const alphaOf: (color: Color) => number;
17
+ /**
18
+ * The ` / <alpha>` slot for alpha-capable formats. Emitted unless the color is
19
+ * opaque and the config drops opaque alpha (`omitOpaqueAlpha`).
20
+ */
21
+ export declare const alphaSlot: (color: Color, cfg: ColorConfig) => string;
22
+ export declare const toRgb: import("culori/src/converter").ConvertFn<"rgb">;
23
+ export declare const toHsl: import("culori/src/converter").ConvertFn<"hsl">;
24
+ export declare const toHwb: import("culori/src/converter").ConvertFn<"hwb">;
25
+ export declare const toLab: import("culori/src/converter").ConvertFn<"lab">;
26
+ export declare const toLch: import("culori/src/converter").ConvertFn<"lch">;
27
+ export declare const toOklab: import("culori/src/converter").ConvertFn<"oklab">;
28
+ export declare const toOklch: import("culori/src/converter").ConvertFn<"oklch">;
29
+ export declare const toP3: import("culori/src/converter").ConvertFn<"p3">;
30
+ export declare const inSrgb: (color: Color) => boolean;
31
+ export declare const inP3: (color: Color) => boolean;
32
+ /** Bring a color into a target gamut, surfacing a violation if it wasn't inside. */
33
+ export declare const fitGamut: (color: Color, within: (c: Color) => boolean, gamut: "rgb" | "p3", strictness: Strictness) => Color;
34
+ export declare const hasRealAlpha: (color: Color) => boolean;
35
+ //# sourceMappingURL=internals.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"internals.d.ts","sourceRoot":"","sources":["../../../../src/color/formats/internals.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAC;AAGpC,OAAO,KAAK,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAaxD;;;GAGG;AACH,eAAO,MAAM,OAAO,GAClB,SAAS,MAAM,EACf,YAAY,UAAU,KACrB,IASF,CAAC;AAEF,uDAAuD;AACvD,eAAO,MAAM,KAAK,GAAI,OAAO,MAAM,EAAE,kBAAa,KAAG,MAGpD,CAAC;AACF,eAAO,MAAM,OAAO,GAAI,OAAO,MAAM,KAAG,MACP,CAAC;AAClC,eAAO,MAAM,UAAU,GAAI,OAAO,MAAM,KAAG,MACT,CAAC;AACnC,sEAAsE;AACtE,eAAO,MAAM,KAAK,GAAI,GAAG,MAAM,GAAG,SAAS,KAAG,MACJ,CAAC;AAC3C,eAAO,MAAM,GAAG,GAAI,OAAO,MAAM,KAAG,MAA+B,CAAC;AACpE,qEAAqE;AACrE,eAAO,MAAM,OAAO,GAAI,OAAO,KAAK,KAAG,MACX,CAAC;AAE7B;;;GAGG;AACH,eAAO,MAAM,SAAS,GAAI,OAAO,KAAK,EAAE,KAAK,WAAW,KAAG,MAI1D,CAAC;AAEF,eAAO,MAAM,KAAK,iDAAmB,CAAC;AACtC,eAAO,MAAM,KAAK,iDAAmB,CAAC;AACtC,eAAO,MAAM,KAAK,iDAAmB,CAAC;AACtC,eAAO,MAAM,KAAK,iDAAmB,CAAC;AACtC,eAAO,MAAM,KAAK,iDAAmB,CAAC;AACtC,eAAO,MAAM,OAAO,mDAAqB,CAAC;AAC1C,eAAO,MAAM,OAAO,mDAAqB,CAAC;AAC1C,eAAO,MAAM,IAAI,gDAAkB,CAAC;AAQpC,eAAO,MAAM,MAAM,GAAI,OAAO,KAAK,KAAG,OAGrC,CAAC;AACF,eAAO,MAAM,IAAI,GAAI,OAAO,KAAK,KAAG,OAGnC,CAAC;AAEF,oFAAoF;AACpF,eAAO,MAAM,QAAQ,GACnB,OAAO,KAAK,EACZ,QAAQ,CAAC,CAAC,EAAE,KAAK,KAAK,OAAO,EAC7B,OAAO,KAAK,GAAG,IAAI,EACnB,YAAY,UAAU,KACrB,KASF,CAAC;AAEF,eAAO,MAAM,YAAY,GAAI,OAAO,KAAK,KAAG,OACI,CAAC"}
@@ -0,0 +1,78 @@
1
+ import { clampChroma, converter } from 'culori';
2
+ /**
3
+ * Shared render toolkit for the per-format descriptors under `formats/` (and, for
4
+ * now, for `../color.ts`'s `serialize`, which imports from here). Descriptors own
5
+ * their render and build it from these; `serialize` will retire once every format
6
+ * has a descriptor.
7
+ */
8
+ const notRelease = () => {
9
+ var _a, _b;
10
+ return ((_b = (_a = globalThis
11
+ .process) === null || _a === void 0 ? void 0 : _a.env) === null || _b === void 0 ? void 0 : _b.NODE_ENV) !== 'production';
12
+ };
13
+ /**
14
+ * Surface a "can't faithfully represent this" violation (dropped alpha,
15
+ * out-of-gamut) per the strictness knob. `auto` = throw in dev / warn in prod.
16
+ */
17
+ export const violate = (message, strictness) => {
18
+ const mode = strictness === 'auto'
19
+ ? notRelease()
20
+ ? 'throw'
21
+ : 'warn'
22
+ : strictness;
23
+ if (mode === 'throw')
24
+ throw new Error(message);
25
+ if (mode === 'warn')
26
+ console.warn(message);
27
+ };
28
+ /** Round to `precision` decimal places (default 3). */
29
+ export const round = (value, precision = 3) => {
30
+ const factor = 10 ** precision;
31
+ return Math.round(value * factor) / factor;
32
+ };
33
+ export const clamp01 = (value) => Math.min(1, Math.max(0, value));
34
+ export const channel255 = (value) => Math.round(clamp01(value) * 255);
35
+ /** Normalize a hue to `[0, 360)` at 2dp; a missing hue reads as 0. */
36
+ export const hueOf = (h) => round((((h !== null && h !== void 0 ? h : 0) % 360) + 360) % 360, 2);
37
+ export const pct = (value) => round(value * 100, 2);
38
+ /** A color's alpha rounded to 3dp; a missing alpha is opaque (1). */
39
+ export const alphaOf = (color) => { var _a; return round((_a = color.alpha) !== null && _a !== void 0 ? _a : 1, 3); };
40
+ /**
41
+ * The ` / <alpha>` slot for alpha-capable formats. Emitted unless the color is
42
+ * opaque and the config drops opaque alpha (`omitOpaqueAlpha`).
43
+ */
44
+ export const alphaSlot = (color, cfg) => {
45
+ const alpha = alphaOf(color);
46
+ const dropOpaque = cfg.omitOpaqueAlpha && alpha === 1;
47
+ return dropOpaque ? '' : ` / ${alpha}`;
48
+ };
49
+ export const toRgb = converter('rgb');
50
+ export const toHsl = converter('hsl');
51
+ export const toHwb = converter('hwb');
52
+ export const toLab = converter('lab');
53
+ export const toLch = converter('lch');
54
+ export const toOklab = converter('oklab');
55
+ export const toOklch = converter('oklch');
56
+ export const toP3 = converter('p3');
57
+ // Tolerant gamut check: a color round-tripped through OKLCH can drift a hair past a
58
+ // channel bound (sRGB `red` -> 1.0000001), so allow a tiny epsilon before calling it
59
+ // out-of-gamut. Genuinely out-of-gamut colors miss by far more.
60
+ const GAMUT_EPSILON = 1e-4;
61
+ const within01 = (n) => n >= -GAMUT_EPSILON && n <= 1 + GAMUT_EPSILON;
62
+ export const inSrgb = (color) => {
63
+ const c = toRgb(color);
64
+ return within01(c.r) && within01(c.g) && within01(c.b);
65
+ };
66
+ export const inP3 = (color) => {
67
+ const c = toP3(color);
68
+ return within01(c.r) && within01(c.g) && within01(c.b);
69
+ };
70
+ /** Bring a color into a target gamut, surfacing a violation if it wasn't inside. */
71
+ export const fitGamut = (color, within, gamut, strictness) => {
72
+ if (within(color)) {
73
+ return color;
74
+ }
75
+ violate(`color: out of ${gamut === 'rgb' ? 'sRGB' : 'display-p3'} gamut; chroma clamped to fit`, strictness);
76
+ return clampChroma(color, 'oklch', gamut);
77
+ };
78
+ export const hasRealAlpha = (color) => color.alpha !== undefined && color.alpha !== 1;
@@ -0,0 +1,9 @@
1
+ /**
2
+ * lab — CIELAB, unbounded gamut (holds any color), float precision. Syntax-level
3
+ * (browser gamut-maps to the display), so a fallback needs only an `@supports`
4
+ * probe; not a floor.
5
+ *
6
+ * See `lab.md`.
7
+ */
8
+ export declare const lab: import("../types").ColorSpaceDescriptor<"lab">;
9
+ //# sourceMappingURL=lab.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lab.d.ts","sourceRoot":"","sources":["../../../../../src/color/formats/lab/lab.ts"],"names":[],"mappings":"AAOA;;;;;;GAMG;AACH,eAAO,MAAM,GAAG,gDAWd,CAAC"}
@@ -0,0 +1,21 @@
1
+ import { alphaSlot, round, toLab } from '../internals';
2
+ import { defineColorSpace } from '../types';
3
+ /**
4
+ * lab — CIELAB, unbounded gamut (holds any color), float precision. Syntax-level
5
+ * (browser gamut-maps to the display), so a fallback needs only an `@supports`
6
+ * probe; not a floor.
7
+ *
8
+ * See `lab.md`.
9
+ */
10
+ export const lab = defineColorSpace({
11
+ format: 'lab',
12
+ hasAlpha: true,
13
+ gamut: 'unbounded',
14
+ supportsProbe: '(color: lab(0 0 0))',
15
+ gamutDependent: false,
16
+ srgbFloor: false,
17
+ render: (color, cfg) => {
18
+ const c = toLab(color);
19
+ return `lab(${round(c.l, 3)} ${round(c.a, 3)} ${round(c.b, 3)}${alphaSlot(color, cfg)})`;
20
+ },
21
+ });
@@ -0,0 +1,8 @@
1
+ /**
2
+ * lch — CIELCH (cylindrical CIELAB), unbounded gamut, float precision. Syntax-level,
3
+ * so a fallback needs only an `@supports` probe; not a floor.
4
+ *
5
+ * See `lch.md`.
6
+ */
7
+ export declare const lch: import("../types").ColorSpaceDescriptor<"lch">;
8
+ //# sourceMappingURL=lch.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lch.d.ts","sourceRoot":"","sources":["../../../../../src/color/formats/lch/lch.ts"],"names":[],"mappings":"AAOA;;;;;GAKG;AACH,eAAO,MAAM,GAAG,gDAWd,CAAC"}
@@ -0,0 +1,20 @@
1
+ import { alphaSlot, hueOf, round, toLch } from '../internals';
2
+ import { defineColorSpace } from '../types';
3
+ /**
4
+ * lch — CIELCH (cylindrical CIELAB), unbounded gamut, float precision. Syntax-level,
5
+ * so a fallback needs only an `@supports` probe; not a floor.
6
+ *
7
+ * See `lch.md`.
8
+ */
9
+ export const lch = defineColorSpace({
10
+ format: 'lch',
11
+ hasAlpha: true,
12
+ gamut: 'unbounded',
13
+ supportsProbe: '(color: lch(0 0 0))',
14
+ gamutDependent: false,
15
+ srgbFloor: false,
16
+ render: (color, cfg) => {
17
+ const c = toLch(color);
18
+ return `lch(${round(c.l, 3)} ${round(c.c, 3)} ${hueOf(c.h)}${alphaSlot(color, cfg)})`;
19
+ },
20
+ });
@@ -0,0 +1,9 @@
1
+ /**
2
+ * oklab — OKLab (rectangular), unbounded gamut, float precision. Perceptual, like
3
+ * `oklch` but in a/b coordinates. Syntax-level, so a fallback needs only an
4
+ * `@supports` probe; not a floor.
5
+ *
6
+ * See `oklab.md`.
7
+ */
8
+ export declare const oklab: import("../types").ColorSpaceDescriptor<"oklab">;
9
+ //# sourceMappingURL=oklab.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"oklab.d.ts","sourceRoot":"","sources":["../../../../../src/color/formats/oklab/oklab.ts"],"names":[],"mappings":"AAOA;;;;;;GAMG;AACH,eAAO,MAAM,KAAK,kDAWhB,CAAC"}
@@ -0,0 +1,21 @@
1
+ import { alphaSlot, round, toOklab } from '../internals';
2
+ import { defineColorSpace } from '../types';
3
+ /**
4
+ * oklab — OKLab (rectangular), unbounded gamut, float precision. Perceptual, like
5
+ * `oklch` but in a/b coordinates. Syntax-level, so a fallback needs only an
6
+ * `@supports` probe; not a floor.
7
+ *
8
+ * See `oklab.md`.
9
+ */
10
+ export const oklab = defineColorSpace({
11
+ format: 'oklab',
12
+ hasAlpha: true,
13
+ gamut: 'unbounded',
14
+ supportsProbe: '(color: oklab(0 0 0))',
15
+ gamutDependent: false,
16
+ srgbFloor: false,
17
+ render: (color, cfg) => {
18
+ const c = toOklab(color);
19
+ return `oklab(${round(c.l, 4)} ${round(c.a, 4)} ${round(c.b, 4)}${alphaSlot(color, cfg)})`;
20
+ },
21
+ });
@@ -0,0 +1,13 @@
1
+ /**
2
+ * oklch — the perceptual modern default (CSS Color 4).
3
+ *
4
+ * Fidelity: carries alpha; gamut is unbounded, so it can hold any color losslessly
5
+ * from the OKLCH store (it is the storage space). Browser: a syntax-level format, so
6
+ * a fallback needs only an `@supports` probe, not `@media (color-gamut)`, and it is
7
+ * not an sRGB floor. Render is a direct read of l / c / h, hardened to
8
+ * `ColorString<'oklch'>`.
9
+ *
10
+ * See `oklch.md` for the format's tests and possible fallbacks.
11
+ */
12
+ export declare const oklch: import("../types").ColorSpaceDescriptor<"oklch">;
13
+ //# sourceMappingURL=oklch.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"oklch.d.ts","sourceRoot":"","sources":["../../../../../src/color/formats/oklch/oklch.ts"],"names":[],"mappings":"AAOA;;;;;;;;;;GAUG;AACH,eAAO,MAAM,KAAK,kDAWhB,CAAC"}
@@ -0,0 +1,25 @@
1
+ import { alphaSlot, hueOf, round, toOklch } from '../internals';
2
+ import { defineColorSpace } from '../types';
3
+ /**
4
+ * oklch — the perceptual modern default (CSS Color 4).
5
+ *
6
+ * Fidelity: carries alpha; gamut is unbounded, so it can hold any color losslessly
7
+ * from the OKLCH store (it is the storage space). Browser: a syntax-level format, so
8
+ * a fallback needs only an `@supports` probe, not `@media (color-gamut)`, and it is
9
+ * not an sRGB floor. Render is a direct read of l / c / h, hardened to
10
+ * `ColorString<'oklch'>`.
11
+ *
12
+ * See `oklch.md` for the format's tests and possible fallbacks.
13
+ */
14
+ export const oklch = defineColorSpace({
15
+ format: 'oklch',
16
+ hasAlpha: true,
17
+ gamut: 'unbounded',
18
+ supportsProbe: '(color: oklch(0 0 0))',
19
+ gamutDependent: false,
20
+ srgbFloor: false,
21
+ render: (color, cfg) => {
22
+ const c = toOklch(color);
23
+ return `oklch(${round(c.l, 4)} ${round(c.c, 4)} ${hueOf(c.h)}${alphaSlot(color, cfg)})`;
24
+ },
25
+ });
@@ -0,0 +1,15 @@
1
+ import type { OutputFormat } from '../types';
2
+ import type { ColorSpaceDescriptor } from './types';
3
+ /**
4
+ * Resolve an `output` entry to the descriptor that owns its render + fidelity bits.
5
+ *
6
+ * An `output` entry is already a full `ColorSpaceDescriptor` (e.g. `colorFormats.hex`
7
+ * IS one), OR a bare `CssFormat` selector (`{ format: 'hex' }`). A CUSTOM format
8
+ * authored via `defineColorSpace` carries an arbitrary `format` string, so it can
9
+ * never be found by name in the built-in registry; it must be used as-is. So: if the
10
+ * passed object already carries descriptor fields (it has a `render`), use it
11
+ * directly; otherwise fall back to the registry by name. No global mutable registry,
12
+ * the custom descriptor travels through the config object.
13
+ */
14
+ export declare const asDescriptor: (format: OutputFormat, registry: Readonly<Record<string, ColorSpaceDescriptor<string>>>) => ColorSpaceDescriptor<string>;
15
+ //# sourceMappingURL=resolve.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolve.d.ts","sourceRoot":"","sources":["../../../../src/color/formats/resolve.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAC7C,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,SAAS,CAAC;AAEpD;;;;;;;;;;GAUG;AACH,eAAO,MAAM,YAAY,GACvB,QAAQ,YAAY,EACpB,UAAU,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,oBAAoB,CAAC,MAAM,CAAC,CAAC,CAAC,KAC/D,oBAAoB,CAAC,MAAM,CACyB,CAAC"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Resolve an `output` entry to the descriptor that owns its render + fidelity bits.
3
+ *
4
+ * An `output` entry is already a full `ColorSpaceDescriptor` (e.g. `colorFormats.hex`
5
+ * IS one), OR a bare `CssFormat` selector (`{ format: 'hex' }`). A CUSTOM format
6
+ * authored via `defineColorSpace` carries an arbitrary `format` string, so it can
7
+ * never be found by name in the built-in registry; it must be used as-is. So: if the
8
+ * passed object already carries descriptor fields (it has a `render`), use it
9
+ * directly; otherwise fall back to the registry by name. No global mutable registry,
10
+ * the custom descriptor travels through the config object.
11
+ */
12
+ export const asDescriptor = (format, registry) => 'render' in format ? format : registry[format.format];
@@ -0,0 +1,11 @@
1
+ /**
2
+ * rgb — the sRGB floor: 8-bit, no alpha, universally renderable.
3
+ *
4
+ * Fidelity: sRGB gamut, no alpha. Browser: universal, so no `@supports` probe, and
5
+ * the fallback chain stops here (`srgbFloor`). An out-of-sRGB color is clamped
6
+ * (strictness-governed); a real alpha can't be held and is a violation.
7
+ *
8
+ * See `rgb.md`.
9
+ */
10
+ export declare const rgb: import("../types").ColorSpaceDescriptor<"rgb">;
11
+ //# sourceMappingURL=rgb.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rgb.d.ts","sourceRoot":"","sources":["../../../../../src/color/formats/rgb/rgb.ts"],"names":[],"mappings":"AAeA;;;;;;;;GAQG;AACH,eAAO,MAAM,GAAG,gDAiBd,CAAC"}
@@ -0,0 +1,26 @@
1
+ import { alphaOf, channel255, fitGamut, hasRealAlpha, inSrgb, toRgb, violate, } from '../internals';
2
+ import { defineColorSpace } from '../types';
3
+ /**
4
+ * rgb — the sRGB floor: 8-bit, no alpha, universally renderable.
5
+ *
6
+ * Fidelity: sRGB gamut, no alpha. Browser: universal, so no `@supports` probe, and
7
+ * the fallback chain stops here (`srgbFloor`). An out-of-sRGB color is clamped
8
+ * (strictness-governed); a real alpha can't be held and is a violation.
9
+ *
10
+ * See `rgb.md`.
11
+ */
12
+ export const rgb = defineColorSpace({
13
+ format: 'rgb',
14
+ hasAlpha: false,
15
+ gamut: 'srgb',
16
+ supportsProbe: null,
17
+ gamutDependent: false,
18
+ srgbFloor: true,
19
+ render: (color, cfg) => {
20
+ if (hasRealAlpha(color)) {
21
+ violate(`color: alpha ${alphaOf(color)} dropped by 'rgb' (no alpha channel); use rgba or solid()`, cfg.strictness);
22
+ }
23
+ const c = toRgb(fitGamut(color, inSrgb, 'rgb', cfg.strictness));
24
+ return `rgb(${channel255(c.r)}, ${channel255(c.g)}, ${channel255(c.b)})`;
25
+ },
26
+ });
@@ -0,0 +1,9 @@
1
+ /**
2
+ * rgba — sRGB with alpha (8-bit). Universal, so no `@supports` probe and a safe
3
+ * floor. When the color is opaque and `omitOpaqueAlpha` is set it collapses to
4
+ * `rgb(...)` (lossless), matching the book.
5
+ *
6
+ * See `rgba.md`.
7
+ */
8
+ export declare const rgba: import("../types").ColorSpaceDescriptor<"rgba">;
9
+ //# sourceMappingURL=rgba.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rgba.d.ts","sourceRoot":"","sources":["../../../../../src/color/formats/rgba/rgba.ts"],"names":[],"mappings":"AAaA;;;;;;GAMG;AACH,eAAO,MAAM,IAAI,iDAgBf,CAAC"}
@@ -0,0 +1,24 @@
1
+ import { alphaOf, channel255, fitGamut, inSrgb, toRgb, } from '../internals';
2
+ import { defineColorSpace } from '../types';
3
+ /**
4
+ * rgba — sRGB with alpha (8-bit). Universal, so no `@supports` probe and a safe
5
+ * floor. When the color is opaque and `omitOpaqueAlpha` is set it collapses to
6
+ * `rgb(...)` (lossless), matching the book.
7
+ *
8
+ * See `rgba.md`.
9
+ */
10
+ export const rgba = defineColorSpace({
11
+ format: 'rgba',
12
+ hasAlpha: true,
13
+ gamut: 'srgb',
14
+ supportsProbe: null,
15
+ gamutDependent: false,
16
+ srgbFloor: true,
17
+ render: (color, cfg) => {
18
+ const alpha = alphaOf(color);
19
+ const dropOpaque = cfg.omitOpaqueAlpha && alpha === 1;
20
+ const c = toRgb(fitGamut(color, inSrgb, 'rgb', cfg.strictness));
21
+ const body = `${channel255(c.r)}, ${channel255(c.g)}, ${channel255(c.b)}`;
22
+ return (dropOpaque ? `rgb(${body})` : `rgba(${body}, ${alpha})`);
23
+ },
24
+ });
@@ -0,0 +1,48 @@
1
+ import type { Color } from 'culori';
2
+ import type { ColorConfig, ColorString, FormatName } from '../types';
3
+ export type { ColorString };
4
+ /** The gamut a format can represent, widening `srgb` ⊂ `p3` ⊂ `unbounded`. */
5
+ export type Gamut = 'srgb' | 'p3' | 'unbounded';
6
+ /**
7
+ * A color-format descriptor: how to render the format from the canonical OKLCH
8
+ * store, plus the metadata its two readers need.
9
+ *
10
+ * - **fidelity** (`hasAlpha`, `gamut`): the color book reads these to pick the
11
+ * single simplest format that faithfully holds a color (the output escalation).
12
+ * - **browser** (`supportsProbe`, `gamutDependent`, `srgbFloor`): a separate
13
+ * fallback helper reads these to assemble multi-declaration browser fallbacks.
14
+ *
15
+ * `render` returns a `ColorString<F>` so each format's output is hardened to its
16
+ * own type. Built-ins use a `FormatName`; a custom format (via `defineColorSpace`)
17
+ * uses any string and is then usable in the priority list / fallback chain.
18
+ */
19
+ export interface ColorSpaceDescriptor<F extends string = FormatName> {
20
+ /** the format's key; also keys it in the registry and brands its output. */
21
+ readonly format: F;
22
+ /** render a stored (OKLCH) color to this format's CSS value, typed to the brand. */
23
+ readonly render: (color: Color, cfg: ColorConfig) => ColorString<F>;
24
+ /** fidelity: whether the format carries an alpha channel. */
25
+ readonly hasAlpha: boolean;
26
+ /** fidelity: the gamut the format can represent. */
27
+ readonly gamut: Gamut;
28
+ /**
29
+ * browser: the `@supports` test that detects parse-support (e.g.
30
+ * `'(color: oklch(0 0 0))'`), or `null` for a universally-supported format.
31
+ */
32
+ readonly supportsProbe: string | null;
33
+ /**
34
+ * browser: whether a fallback should also gate on `@media (color-gamut: ...)`
35
+ * (e.g. `display-p3`). Syntax-only modern formats (`oklch`, `lab`) are `false`.
36
+ */
37
+ readonly gamutDependent: boolean;
38
+ /** browser: a safe sRGB floor; the fallback chain stops here. */
39
+ readonly srgbFloor: boolean;
40
+ }
41
+ /**
42
+ * Author a color-format descriptor (built-in or custom/experimental). A thin
43
+ * identity that pins the type and infers the format brand `F`, so a new format can
44
+ * be registered for the priority list / fallback chain without the library shipping
45
+ * it.
46
+ */
47
+ export declare const defineColorSpace: <F extends string>(descriptor: ColorSpaceDescriptor<F>) => ColorSpaceDescriptor<F>;
48
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/color/formats/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAC;AAEpC,OAAO,KAAK,EAAE,WAAW,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAIrE,YAAY,EAAE,WAAW,EAAE,CAAC;AAE5B,8EAA8E;AAC9E,MAAM,MAAM,KAAK,GAAG,MAAM,GAAG,IAAI,GAAG,WAAW,CAAC;AAEhD;;;;;;;;;;;;GAYG;AACH,MAAM,WAAW,oBAAoB,CAAC,CAAC,SAAS,MAAM,GAAG,UAAU;IACjE,4EAA4E;IAC5E,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;IACnB,oFAAoF;IACpF,QAAQ,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,WAAW,KAAK,WAAW,CAAC,CAAC,CAAC,CAAC;IACpE,6DAA6D;IAC7D,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;IAC3B,oDAAoD;IACpD,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC;IACtB;;;OAGG;IACH,QAAQ,CAAC,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IACtC;;;OAGG;IACH,QAAQ,CAAC,cAAc,EAAE,OAAO,CAAC;IACjC,iEAAiE;IACjE,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;CAC7B;AAED;;;;;GAKG;AACH,eAAO,MAAM,gBAAgB,GAAI,CAAC,SAAS,MAAM,EAC/C,YAAY,oBAAoB,CAAC,CAAC,CAAC,KAClC,oBAAoB,CAAC,CAAC,CAAe,CAAC"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Author a color-format descriptor (built-in or custom/experimental). A thin
3
+ * identity that pins the type and infers the format brand `F`, so a new format can
4
+ * be registered for the priority list / fallback chain without the library shipping
5
+ * it.
6
+ */
7
+ export const defineColorSpace = (descriptor) => descriptor;
@@ -0,0 +1,81 @@
1
+ import type { Color } from 'culori';
2
+ import { colorFormats, type ColorSpaceDescriptor, defineColorSpace, type Gamut } from './formats';
3
+ import type { ColorConfig, ColorFormatPlugin, ColorInput, CssFormat, FormatName, ResolvedColor, Store } from './types';
4
+ export * from './types';
5
+ /**
6
+ * Parse any `ColorInput` into the canonical store (built-in formats only). The public,
7
+ * instance-agnostic parser. Factory instances thread their own plugin-aware parser
8
+ * internally; this stays the bare built-in entry point.
9
+ */
10
+ export declare const parseColor: (input: ColorInput | Color) => Store;
11
+ /** Normalize a parsed store into the canonical OKLCH working space. */
12
+ export declare const storeColor: (store: Store) => Store;
13
+ export { colorFormats, type ColorSpaceDescriptor, defineColorSpace, type Gamut, };
14
+ /**
15
+ * Resolve a store + config into an immutable, navigable `ResolvedColor`, using the
16
+ * built-in parser and no custom plugins. The public, instance-agnostic resolver
17
+ * (re-exported as `resolveColor`). Factory instances use `resolveWith` internally to
18
+ * thread their own plugin-aware parser and named selectors.
19
+ */
20
+ export declare const resolve: <F extends FormatName = FormatName>(store: Store, cfg: ColorConfig) => ResolvedColor<F>;
21
+ /**
22
+ * The default output priority: the simplest faithful format first. With no argument
23
+ * `.css()` escalates down this ladder to the first format that holds the color (see
24
+ * `formats/README.md`). Overridable per book via `publishBookColor({ config })`.
25
+ *
26
+ * Pared to one format per distinct output space, most popular first (see
27
+ * `docs/color-format-popularity.md`). Every other built-in format is a redundant
28
+ * cover of one of these three, so it would never win escalation; it stays reachable
29
+ * via a named selector (`.hwb()`, ...) or `.formatAs(colorFormats.x)`.
30
+ * - `hex`: solids (opaque sRGB). ~76% of real-world colour declarations.
31
+ * - `rgba`: translucent sRGB. The dominant alpha form (rgba >> #rrggbbaa, hsla).
32
+ * - `oklch`: the unbounded floor, holds any colour (P3 and beyond), and is the
33
+ * primitive's own storage space, so it is the zero-loss fallback.
34
+ */
35
+ export declare const defaultFormatPriority: CssFormat[];
36
+ /** The colour primitive's defaults. */
37
+ export declare const defaultColorConfig: ColorConfig;
38
+ /** The format-literal union carried by a plugins tuple (`'zoo' | ...`). */
39
+ type PluginFormat<P extends ReadonlyArray<ColorFormatPlugin>> = P[number]['format'];
40
+ /**
41
+ * A `ResolvedColor` augmented with one typed, lazy named selector per registered
42
+ * plugin format (e.g. `.zoo`): each returns this colour reconfigured to render through
43
+ * that plugin's descriptor, then finished via `.css()`. Typed from the passed formats
44
+ * tuple, not `any`.
45
+ */
46
+ type CustomResolvedColor<P extends ReadonlyArray<ColorFormatPlugin>> = ResolvedColor & {
47
+ readonly [K in PluginFormat<P>]: ResolvedColor<K>;
48
+ };
49
+ /** A factory-bound `color()`: same call shape, plus the per-instance registry. */
50
+ export interface CustomColor<P extends ReadonlyArray<ColorFormatPlugin>> {
51
+ (input: ColorInput, config?: Partial<ColorConfig>): CustomResolvedColor<P>;
52
+ /**
53
+ * The per-instance format registry (built-ins + plugins), keyed by format name. A
54
+ * future gilding/fallback seam reads each descriptor's fidelity / browser bits from
55
+ * here.
56
+ */
57
+ readonly formats: Readonly<Record<string, ColorSpaceDescriptor<string>>>;
58
+ }
59
+ /** The config a custom colour instance is built from. */
60
+ export interface CreateColorConfig<P extends ReadonlyArray<ColorFormatPlugin>> {
61
+ /** the custom format plugins to register at the input + output edges. */
62
+ formats: P;
63
+ }
64
+ /**
65
+ * Build a `color()`-shaped function bound to the given custom format plugins. The
66
+ * instance parser tries the built-in parse first, then each plugin's `parse` in order;
67
+ * the plugins are valid `output` descriptors and resolve through `asDescriptor`. The
68
+ * returned result exposes a typed lazy selector per plugin format.
69
+ */
70
+ export declare const createColor: <const P extends ReadonlyArray<ColorFormatPlugin>>(config: CreateColorConfig<P>) => CustomColor<P>;
71
+ /**
72
+ * `color(input, config?)`: the native colour input, alongside `m()`, `r()`, `i()`,
73
+ * `f()`. Parses + normalizes `input` to OKLCH and resolves it with the default
74
+ * config (override per call via `config`). Mirrors how `m()` wraps a measurement.
75
+ *
76
+ * It is `createColor({ formats: [] })` at defaults: the module-level instance is just
77
+ * the factory with no custom plugins, so the default and the factory share one
78
+ * construction path. Typed as the bare `(input, config?) => ResolvedColor` surface.
79
+ */
80
+ export declare const color: (input: ColorInput, config?: Partial<ColorConfig>) => ResolvedColor;
81
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/color/index.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EACV,KAAK,EAQN,MAAM,QAAQ,CAAC;AAUhB,OAAO,EACL,YAAY,EACZ,KAAK,oBAAoB,EACzB,gBAAgB,EAChB,KAAK,KAAK,EACX,MAAM,WAAW,CAAC;AASnB,OAAO,KAAK,EAEV,WAAW,EACX,iBAAiB,EACjB,UAAU,EAIV,SAAS,EACT,UAAU,EAEV,aAAa,EACb,KAAK,EAGN,MAAM,SAAS,CAAC;AAEjB,cAAc,SAAS,CAAC;AAmPxB;;;;GAIG;AACH,eAAO,MAAM,UAAU,GAAI,OAAO,UAAU,GAAG,KAAK,KAAG,KAChC,CAAC;AAexB,uEAAuE;AACvE,eAAO,MAAM,UAAU,GAAI,OAAO,KAAK,KAAG,KAKzC,CAAC;AAeF,OAAO,EACL,YAAY,EACZ,KAAK,oBAAoB,EACzB,gBAAgB,EAChB,KAAK,KAAK,GACX,CAAC;AA2WF;;;;;GAKG;AACH,eAAO,MAAM,OAAO,GAAI,CAAC,SAAS,UAAU,GAAG,UAAU,EACvD,OAAO,KAAK,EACZ,KAAK,WAAW,KACf,aAAa,CAAC,CAAC,CAA+C,CAAC;AAElE;;;;;;;;;;;;;GAaG;AACH,eAAO,MAAM,qBAAqB,EAAE,SAAS,EAI5C,CAAC;AAEF,uCAAuC;AACvC,eAAO,MAAM,kBAAkB,EAAE,WAKhC,CAAC;AAaF,2EAA2E;AAC3E,KAAK,YAAY,CAAC,CAAC,SAAS,aAAa,CAAC,iBAAiB,CAAC,IAC1D,CAAC,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,CAAC;AAEtB;;;;;GAKG;AACH,KAAK,mBAAmB,CAAC,CAAC,SAAS,aAAa,CAAC,iBAAiB,CAAC,IACjE,aAAa,GAAG;IACd,QAAQ,EAAE,CAAC,IAAI,YAAY,CAAC,CAAC,CAAC,GAAG,aAAa,CAAC,CAAC,CAAC;CAClD,CAAC;AAEJ,kFAAkF;AAClF,MAAM,WAAW,WAAW,CAC1B,CAAC,SAAS,aAAa,CAAC,iBAAiB,CAAC;IAE1C,CACE,KAAK,EAAE,UAAU,EACjB,MAAM,CAAC,EAAE,OAAO,CAAC,WAAW,CAAC,GAC5B,mBAAmB,CAAC,CAAC,CAAC,CAAC;IAC1B;;;;OAIG;IACH,QAAQ,CAAC,OAAO,EAAE,QAAQ,CACxB,MAAM,CAAC,MAAM,EAAE,oBAAoB,CAAC,MAAM,CAAC,CAAC,CAC7C,CAAC;CACH;AAED,yDAAyD;AACzD,MAAM,WAAW,iBAAiB,CAChC,CAAC,SAAS,aAAa,CAAC,iBAAiB,CAAC;IAE1C,yEAAyE;IACzE,OAAO,EAAE,CAAC,CAAC;CACZ;AAED;;;;;GAKG;AACH,eAAO,MAAM,WAAW,GACtB,KAAK,CAAC,CAAC,SAAS,aAAa,CAAC,iBAAiB,CAAC,EAEhD,QAAQ,iBAAiB,CAAC,CAAC,CAAC,KAC3B,WAAW,CAAC,CAAC,CA6Bf,CAAC;AAEF;;;;;;;;GAQG;AACH,eAAO,MAAM,KAAK,EAAE,CAClB,KAAK,EAAE,UAAU,EACjB,MAAM,CAAC,EAAE,OAAO,CAAC,WAAW,CAAC,KAC1B,aAA4C,CAAC"}