css-calipers 1.0.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 -424
  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 +54 -12
@@ -0,0 +1,28 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.hex = void 0;
4
+ const culori_1 = require("culori");
5
+ const internals_1 = require("../internals");
6
+ const types_1 = require("../types");
7
+ /**
8
+ * hex — sRGB, no alpha, 8-bit (`#rrggbb`). The most compact universal form; a safe
9
+ * floor with no `@supports` probe. A real alpha can't be held and is a violation
10
+ * (use `hexAlpha`); out-of-sRGB is clamped (strictness-governed).
11
+ *
12
+ * See `hex.md`.
13
+ */
14
+ exports.hex = (0, types_1.defineColorSpace)({
15
+ format: 'hex',
16
+ hasAlpha: false,
17
+ gamut: 'srgb',
18
+ supportsProbe: null,
19
+ gamutDependent: false,
20
+ srgbFloor: true,
21
+ render: (color, cfg) => {
22
+ if ((0, internals_1.hasRealAlpha)(color)) {
23
+ (0, internals_1.violate)(`color: alpha ${(0, internals_1.alphaOf)(color)} dropped by 'hex' (no alpha channel); use hexAlpha or solid()`, cfg.strictness);
24
+ }
25
+ const c = (0, internals_1.toRgb)((0, internals_1.fitGamut)(color, internals_1.inSrgb, 'rgb', cfg.strictness));
26
+ return (0, culori_1.formatHex)(c);
27
+ },
28
+ });
@@ -0,0 +1,25 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.hexAlpha = void 0;
4
+ const culori_1 = require("culori");
5
+ const internals_1 = require("../internals");
6
+ const types_1 = require("../types");
7
+ /**
8
+ * hexAlpha — sRGB with alpha, 8-bit (`#rrggbbaa`). The alpha counterpart of `hex`;
9
+ * universal, a safe floor, always carries the alpha byte. Out-of-sRGB is clamped
10
+ * (strictness-governed).
11
+ *
12
+ * See `hexAlpha.md`.
13
+ */
14
+ exports.hexAlpha = (0, types_1.defineColorSpace)({
15
+ format: 'hexAlpha',
16
+ hasAlpha: true,
17
+ gamut: 'srgb',
18
+ supportsProbe: null,
19
+ gamutDependent: false,
20
+ srgbFloor: true,
21
+ render: (color, cfg) => {
22
+ const c = (0, internals_1.toRgb)((0, internals_1.fitGamut)(color, internals_1.inSrgb, 'rgb', cfg.strictness));
23
+ return (0, culori_1.formatHex8)(c);
24
+ },
25
+ });
@@ -0,0 +1,23 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.hsl = void 0;
4
+ const internals_1 = require("../internals");
5
+ const types_1 = require("../types");
6
+ /**
7
+ * hsl — sRGB, alpha, higher precision than 8-bit. Universal, so no `@supports` probe
8
+ * and a safe floor. Out-of-sRGB is clamped (strictness-governed).
9
+ *
10
+ * See `hsl.md`.
11
+ */
12
+ exports.hsl = (0, types_1.defineColorSpace)({
13
+ format: 'hsl',
14
+ hasAlpha: true,
15
+ gamut: 'srgb',
16
+ supportsProbe: null,
17
+ gamutDependent: false,
18
+ srgbFloor: true,
19
+ render: (color, cfg) => {
20
+ const c = (0, internals_1.toHsl)((0, internals_1.fitGamut)(color, internals_1.inSrgb, 'rgb', cfg.strictness));
21
+ return `hsl(${(0, internals_1.hueOf)(c.h)} ${(0, internals_1.pct)(c.s)}% ${(0, internals_1.pct)(c.l)}%${(0, internals_1.alphaSlot)(color, cfg)})`;
22
+ },
23
+ });
@@ -0,0 +1,24 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.hwb = void 0;
4
+ const internals_1 = require("../internals");
5
+ const types_1 = require("../types");
6
+ /**
7
+ * hwb — sRGB, alpha, higher precision. Newer than `hsl`/`rgb` (~96% support), so it
8
+ * carries an `@supports` probe and is not treated as the safe floor. Out-of-sRGB is
9
+ * clamped (strictness-governed).
10
+ *
11
+ * See `hwb.md`.
12
+ */
13
+ exports.hwb = (0, types_1.defineColorSpace)({
14
+ format: 'hwb',
15
+ hasAlpha: true,
16
+ gamut: 'srgb',
17
+ supportsProbe: '(color: hwb(0 0% 0%))',
18
+ gamutDependent: false,
19
+ srgbFloor: false,
20
+ render: (color, cfg) => {
21
+ const c = (0, internals_1.toHwb)((0, internals_1.fitGamut)(color, internals_1.inSrgb, 'rgb', cfg.strictness));
22
+ return `hwb(${(0, internals_1.hueOf)(c.h)} ${(0, internals_1.pct)(c.w)}% ${(0, internals_1.pct)(c.b)}%${(0, internals_1.alphaSlot)(color, cfg)})`;
23
+ },
24
+ });
@@ -0,0 +1,36 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.defineColorSpace = exports.colorFormats = void 0;
4
+ const display_p3_1 = require("./display-p3/display-p3");
5
+ const hex_1 = require("./hex/hex");
6
+ const hexAlpha_1 = require("./hexAlpha/hexAlpha");
7
+ const hsl_1 = require("./hsl/hsl");
8
+ const hwb_1 = require("./hwb/hwb");
9
+ const lab_1 = require("./lab/lab");
10
+ const lch_1 = require("./lch/lch");
11
+ const oklab_1 = require("./oklab/oklab");
12
+ const oklch_1 = require("./oklch/oklch");
13
+ const rgb_1 = require("./rgb/rgb");
14
+ const rgba_1 = require("./rgba/rgba");
15
+ /**
16
+ * The unified color-format registry: every built-in format's descriptor, keyed by
17
+ * its format name. Each entry doubles as the book's output selector (it satisfies
18
+ * `CssFormat`, having a `format`) and as the fallback descriptor (render + metadata).
19
+ * Custom/experimental formats join a priority list via `defineColorSpace`, they do
20
+ * not need to live here.
21
+ */
22
+ exports.colorFormats = {
23
+ rgba: rgba_1.rgba,
24
+ rgb: rgb_1.rgb,
25
+ hex: hex_1.hex,
26
+ hexAlpha: hexAlpha_1.hexAlpha,
27
+ hsl: hsl_1.hsl,
28
+ hwb: hwb_1.hwb,
29
+ lab: lab_1.lab,
30
+ lch: lch_1.lch,
31
+ oklab: oklab_1.oklab,
32
+ oklch: oklch_1.oklch,
33
+ displayP3: display_p3_1.displayP3,
34
+ };
35
+ var types_1 = require("./types");
36
+ Object.defineProperty(exports, "defineColorSpace", { enumerable: true, get: function () { return types_1.defineColorSpace; } });
@@ -0,0 +1,93 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.hasRealAlpha = exports.fitGamut = exports.inP3 = exports.inSrgb = exports.toP3 = exports.toOklch = exports.toOklab = exports.toLch = exports.toLab = exports.toHwb = exports.toHsl = exports.toRgb = exports.alphaSlot = exports.alphaOf = exports.pct = exports.hueOf = exports.channel255 = exports.clamp01 = exports.round = exports.violate = void 0;
4
+ const culori_1 = require("culori");
5
+ /**
6
+ * Shared render toolkit for the per-format descriptors under `formats/` (and, for
7
+ * now, for `../color.ts`'s `serialize`, which imports from here). Descriptors own
8
+ * their render and build it from these; `serialize` will retire once every format
9
+ * has a descriptor.
10
+ */
11
+ const notRelease = () => {
12
+ var _a, _b;
13
+ return ((_b = (_a = globalThis
14
+ .process) === null || _a === void 0 ? void 0 : _a.env) === null || _b === void 0 ? void 0 : _b.NODE_ENV) !== 'production';
15
+ };
16
+ /**
17
+ * Surface a "can't faithfully represent this" violation (dropped alpha,
18
+ * out-of-gamut) per the strictness knob. `auto` = throw in dev / warn in prod.
19
+ */
20
+ const violate = (message, strictness) => {
21
+ const mode = strictness === 'auto'
22
+ ? notRelease()
23
+ ? 'throw'
24
+ : 'warn'
25
+ : strictness;
26
+ if (mode === 'throw')
27
+ throw new Error(message);
28
+ if (mode === 'warn')
29
+ console.warn(message);
30
+ };
31
+ exports.violate = violate;
32
+ /** Round to `precision` decimal places (default 3). */
33
+ const round = (value, precision = 3) => {
34
+ const factor = 10 ** precision;
35
+ return Math.round(value * factor) / factor;
36
+ };
37
+ exports.round = round;
38
+ const clamp01 = (value) => Math.min(1, Math.max(0, value));
39
+ exports.clamp01 = clamp01;
40
+ const channel255 = (value) => Math.round((0, exports.clamp01)(value) * 255);
41
+ exports.channel255 = channel255;
42
+ /** Normalize a hue to `[0, 360)` at 2dp; a missing hue reads as 0. */
43
+ const hueOf = (h) => (0, exports.round)((((h !== null && h !== void 0 ? h : 0) % 360) + 360) % 360, 2);
44
+ exports.hueOf = hueOf;
45
+ const pct = (value) => (0, exports.round)(value * 100, 2);
46
+ exports.pct = pct;
47
+ /** A color's alpha rounded to 3dp; a missing alpha is opaque (1). */
48
+ const alphaOf = (color) => { var _a; return (0, exports.round)((_a = color.alpha) !== null && _a !== void 0 ? _a : 1, 3); };
49
+ exports.alphaOf = alphaOf;
50
+ /**
51
+ * The ` / <alpha>` slot for alpha-capable formats. Emitted unless the color is
52
+ * opaque and the config drops opaque alpha (`omitOpaqueAlpha`).
53
+ */
54
+ const alphaSlot = (color, cfg) => {
55
+ const alpha = (0, exports.alphaOf)(color);
56
+ const dropOpaque = cfg.omitOpaqueAlpha && alpha === 1;
57
+ return dropOpaque ? '' : ` / ${alpha}`;
58
+ };
59
+ exports.alphaSlot = alphaSlot;
60
+ exports.toRgb = (0, culori_1.converter)('rgb');
61
+ exports.toHsl = (0, culori_1.converter)('hsl');
62
+ exports.toHwb = (0, culori_1.converter)('hwb');
63
+ exports.toLab = (0, culori_1.converter)('lab');
64
+ exports.toLch = (0, culori_1.converter)('lch');
65
+ exports.toOklab = (0, culori_1.converter)('oklab');
66
+ exports.toOklch = (0, culori_1.converter)('oklch');
67
+ exports.toP3 = (0, culori_1.converter)('p3');
68
+ // Tolerant gamut check: a color round-tripped through OKLCH can drift a hair past a
69
+ // channel bound (sRGB `red` -> 1.0000001), so allow a tiny epsilon before calling it
70
+ // out-of-gamut. Genuinely out-of-gamut colors miss by far more.
71
+ const GAMUT_EPSILON = 1e-4;
72
+ const within01 = (n) => n >= -GAMUT_EPSILON && n <= 1 + GAMUT_EPSILON;
73
+ const inSrgb = (color) => {
74
+ const c = (0, exports.toRgb)(color);
75
+ return within01(c.r) && within01(c.g) && within01(c.b);
76
+ };
77
+ exports.inSrgb = inSrgb;
78
+ const inP3 = (color) => {
79
+ const c = (0, exports.toP3)(color);
80
+ return within01(c.r) && within01(c.g) && within01(c.b);
81
+ };
82
+ exports.inP3 = inP3;
83
+ /** Bring a color into a target gamut, surfacing a violation if it wasn't inside. */
84
+ const fitGamut = (color, within, gamut, strictness) => {
85
+ if (within(color)) {
86
+ return color;
87
+ }
88
+ (0, exports.violate)(`color: out of ${gamut === 'rgb' ? 'sRGB' : 'display-p3'} gamut; chroma clamped to fit`, strictness);
89
+ return (0, culori_1.clampChroma)(color, 'oklch', gamut);
90
+ };
91
+ exports.fitGamut = fitGamut;
92
+ const hasRealAlpha = (color) => color.alpha !== undefined && color.alpha !== 1;
93
+ exports.hasRealAlpha = hasRealAlpha;
@@ -0,0 +1,24 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.lab = void 0;
4
+ const internals_1 = require("../internals");
5
+ const types_1 = require("../types");
6
+ /**
7
+ * lab — CIELAB, unbounded gamut (holds any color), float precision. Syntax-level
8
+ * (browser gamut-maps to the display), so a fallback needs only an `@supports`
9
+ * probe; not a floor.
10
+ *
11
+ * See `lab.md`.
12
+ */
13
+ exports.lab = (0, types_1.defineColorSpace)({
14
+ format: 'lab',
15
+ hasAlpha: true,
16
+ gamut: 'unbounded',
17
+ supportsProbe: '(color: lab(0 0 0))',
18
+ gamutDependent: false,
19
+ srgbFloor: false,
20
+ render: (color, cfg) => {
21
+ const c = (0, internals_1.toLab)(color);
22
+ return `lab(${(0, internals_1.round)(c.l, 3)} ${(0, internals_1.round)(c.a, 3)} ${(0, internals_1.round)(c.b, 3)}${(0, internals_1.alphaSlot)(color, cfg)})`;
23
+ },
24
+ });
@@ -0,0 +1,23 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.lch = void 0;
4
+ const internals_1 = require("../internals");
5
+ const types_1 = require("../types");
6
+ /**
7
+ * lch — CIELCH (cylindrical CIELAB), unbounded gamut, float precision. Syntax-level,
8
+ * so a fallback needs only an `@supports` probe; not a floor.
9
+ *
10
+ * See `lch.md`.
11
+ */
12
+ exports.lch = (0, types_1.defineColorSpace)({
13
+ format: 'lch',
14
+ hasAlpha: true,
15
+ gamut: 'unbounded',
16
+ supportsProbe: '(color: lch(0 0 0))',
17
+ gamutDependent: false,
18
+ srgbFloor: false,
19
+ render: (color, cfg) => {
20
+ const c = (0, internals_1.toLch)(color);
21
+ return `lch(${(0, internals_1.round)(c.l, 3)} ${(0, internals_1.round)(c.c, 3)} ${(0, internals_1.hueOf)(c.h)}${(0, internals_1.alphaSlot)(color, cfg)})`;
22
+ },
23
+ });
@@ -0,0 +1,24 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.oklab = void 0;
4
+ const internals_1 = require("../internals");
5
+ const types_1 = require("../types");
6
+ /**
7
+ * oklab — OKLab (rectangular), unbounded gamut, float precision. Perceptual, like
8
+ * `oklch` but in a/b coordinates. Syntax-level, so a fallback needs only an
9
+ * `@supports` probe; not a floor.
10
+ *
11
+ * See `oklab.md`.
12
+ */
13
+ exports.oklab = (0, types_1.defineColorSpace)({
14
+ format: 'oklab',
15
+ hasAlpha: true,
16
+ gamut: 'unbounded',
17
+ supportsProbe: '(color: oklab(0 0 0))',
18
+ gamutDependent: false,
19
+ srgbFloor: false,
20
+ render: (color, cfg) => {
21
+ const c = (0, internals_1.toOklab)(color);
22
+ return `oklab(${(0, internals_1.round)(c.l, 4)} ${(0, internals_1.round)(c.a, 4)} ${(0, internals_1.round)(c.b, 4)}${(0, internals_1.alphaSlot)(color, cfg)})`;
23
+ },
24
+ });
@@ -0,0 +1,28 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.oklch = void 0;
4
+ const internals_1 = require("../internals");
5
+ const types_1 = require("../types");
6
+ /**
7
+ * oklch — the perceptual modern default (CSS Color 4).
8
+ *
9
+ * Fidelity: carries alpha; gamut is unbounded, so it can hold any color losslessly
10
+ * from the OKLCH store (it is the storage space). Browser: a syntax-level format, so
11
+ * a fallback needs only an `@supports` probe, not `@media (color-gamut)`, and it is
12
+ * not an sRGB floor. Render is a direct read of l / c / h, hardened to
13
+ * `ColorString<'oklch'>`.
14
+ *
15
+ * See `oklch.md` for the format's tests and possible fallbacks.
16
+ */
17
+ exports.oklch = (0, types_1.defineColorSpace)({
18
+ format: 'oklch',
19
+ hasAlpha: true,
20
+ gamut: 'unbounded',
21
+ supportsProbe: '(color: oklch(0 0 0))',
22
+ gamutDependent: false,
23
+ srgbFloor: false,
24
+ render: (color, cfg) => {
25
+ const c = (0, internals_1.toOklch)(color);
26
+ return `oklch(${(0, internals_1.round)(c.l, 4)} ${(0, internals_1.round)(c.c, 4)} ${(0, internals_1.hueOf)(c.h)}${(0, internals_1.alphaSlot)(color, cfg)})`;
27
+ },
28
+ });
@@ -0,0 +1,16 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.asDescriptor = void 0;
4
+ /**
5
+ * Resolve an `output` entry to the descriptor that owns its render + fidelity bits.
6
+ *
7
+ * An `output` entry is already a full `ColorSpaceDescriptor` (e.g. `colorFormats.hex`
8
+ * IS one), OR a bare `CssFormat` selector (`{ format: 'hex' }`). A CUSTOM format
9
+ * authored via `defineColorSpace` carries an arbitrary `format` string, so it can
10
+ * never be found by name in the built-in registry; it must be used as-is. So: if the
11
+ * passed object already carries descriptor fields (it has a `render`), use it
12
+ * directly; otherwise fall back to the registry by name. No global mutable registry,
13
+ * the custom descriptor travels through the config object.
14
+ */
15
+ const asDescriptor = (format, registry) => 'render' in format ? format : registry[format.format];
16
+ exports.asDescriptor = asDescriptor;
@@ -0,0 +1,29 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.rgb = void 0;
4
+ const internals_1 = require("../internals");
5
+ const types_1 = require("../types");
6
+ /**
7
+ * rgb — the sRGB floor: 8-bit, no alpha, universally renderable.
8
+ *
9
+ * Fidelity: sRGB gamut, no alpha. Browser: universal, so no `@supports` probe, and
10
+ * the fallback chain stops here (`srgbFloor`). An out-of-sRGB color is clamped
11
+ * (strictness-governed); a real alpha can't be held and is a violation.
12
+ *
13
+ * See `rgb.md`.
14
+ */
15
+ exports.rgb = (0, types_1.defineColorSpace)({
16
+ format: 'rgb',
17
+ hasAlpha: false,
18
+ gamut: 'srgb',
19
+ supportsProbe: null,
20
+ gamutDependent: false,
21
+ srgbFloor: true,
22
+ render: (color, cfg) => {
23
+ if ((0, internals_1.hasRealAlpha)(color)) {
24
+ (0, internals_1.violate)(`color: alpha ${(0, internals_1.alphaOf)(color)} dropped by 'rgb' (no alpha channel); use rgba or solid()`, cfg.strictness);
25
+ }
26
+ const c = (0, internals_1.toRgb)((0, internals_1.fitGamut)(color, internals_1.inSrgb, 'rgb', cfg.strictness));
27
+ return `rgb(${(0, internals_1.channel255)(c.r)}, ${(0, internals_1.channel255)(c.g)}, ${(0, internals_1.channel255)(c.b)})`;
28
+ },
29
+ });
@@ -0,0 +1,27 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.rgba = void 0;
4
+ const internals_1 = require("../internals");
5
+ const types_1 = require("../types");
6
+ /**
7
+ * rgba — sRGB with alpha (8-bit). Universal, so no `@supports` probe and a safe
8
+ * floor. When the color is opaque and `omitOpaqueAlpha` is set it collapses to
9
+ * `rgb(...)` (lossless), matching the book.
10
+ *
11
+ * See `rgba.md`.
12
+ */
13
+ exports.rgba = (0, types_1.defineColorSpace)({
14
+ format: 'rgba',
15
+ hasAlpha: true,
16
+ gamut: 'srgb',
17
+ supportsProbe: null,
18
+ gamutDependent: false,
19
+ srgbFloor: true,
20
+ render: (color, cfg) => {
21
+ const alpha = (0, internals_1.alphaOf)(color);
22
+ const dropOpaque = cfg.omitOpaqueAlpha && alpha === 1;
23
+ const c = (0, internals_1.toRgb)((0, internals_1.fitGamut)(color, internals_1.inSrgb, 'rgb', cfg.strictness));
24
+ const body = `${(0, internals_1.channel255)(c.r)}, ${(0, internals_1.channel255)(c.g)}, ${(0, internals_1.channel255)(c.b)}`;
25
+ return (dropOpaque ? `rgb(${body})` : `rgba(${body}, ${alpha})`);
26
+ },
27
+ });
@@ -0,0 +1,11 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.defineColorSpace = void 0;
4
+ /**
5
+ * Author a color-format descriptor (built-in or custom/experimental). A thin
6
+ * identity that pins the type and infers the format brand `F`, so a new format can
7
+ * be registered for the priority list / fallback chain without the library shipping
8
+ * it.
9
+ */
10
+ const defineColorSpace = (descriptor) => descriptor;
11
+ exports.defineColorSpace = defineColorSpace;