@oxyhq/bloom 0.81.0 → 0.83.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 (32) hide show
  1. package/lib/commonjs/theme/color-policy.js +77 -11
  2. package/lib/commonjs/theme/color-policy.js.map +1 -1
  3. package/lib/commonjs/theme/color-presets.js +85 -25
  4. package/lib/commonjs/theme/color-presets.js.map +1 -1
  5. package/lib/commonjs/theme/index.js +12 -0
  6. package/lib/commonjs/theme/index.js.map +1 -1
  7. package/lib/module/theme/color-policy.js +77 -11
  8. package/lib/module/theme/color-policy.js.map +1 -1
  9. package/lib/module/theme/color-presets.js +84 -24
  10. package/lib/module/theme/color-presets.js.map +1 -1
  11. package/lib/module/theme/index.js +1 -1
  12. package/lib/module/theme/index.js.map +1 -1
  13. package/lib/typescript/commonjs/theme/color-policy.d.ts.map +1 -1
  14. package/lib/typescript/commonjs/theme/color-presets.d.ts +26 -3
  15. package/lib/typescript/commonjs/theme/color-presets.d.ts.map +1 -1
  16. package/lib/typescript/commonjs/theme/index.d.ts +2 -2
  17. package/lib/typescript/commonjs/theme/index.d.ts.map +1 -1
  18. package/lib/typescript/module/theme/color-policy.d.ts.map +1 -1
  19. package/lib/typescript/module/theme/color-presets.d.ts +26 -3
  20. package/lib/typescript/module/theme/color-presets.d.ts.map +1 -1
  21. package/lib/typescript/module/theme/index.d.ts +2 -2
  22. package/lib/typescript/module/theme/index.d.ts.map +1 -1
  23. package/package.json +1 -1
  24. package/src/__tests__/BloomThemeProvider.test.tsx +1 -1
  25. package/src/__tests__/theme.test.ts +2 -2
  26. package/src/theme/__tests__/__fixtures__/golden-resolved-tokens.json +1160 -680
  27. package/src/theme/__tests__/__snapshots__/visual-gallery.test.tsx.snap +712 -432
  28. package/src/theme/__tests__/color-preset-gates.test.ts +50 -0
  29. package/src/theme/__tests__/policy-legibility.test.ts +46 -12
  30. package/src/theme/color-policy.ts +82 -13
  31. package/src/theme/color-presets.ts +80 -22
  32. package/src/theme/index.ts +3 -1
@@ -86,10 +86,31 @@ const foregroundFor = argb => contrastOf(argb, true) >= AA ? 'rgb(255 255 255)'
86
86
  const noLegibleForeground = argb => contrastOf(argb, true) < AA && contrastOf(argb, false) < AA;
87
87
 
88
88
  /** The tone a white-label fill sits at in LIGHT mode. */
89
- const LIGHT_FILL_TONE = 45;
89
+ const FILL_TONE_FLOOR = 45;
90
90
 
91
91
  /** The tone a white-label fill sits at in DARK: the ceiling white text allows. */
92
- const DARK_FILL_TONE = 49;
92
+ const FILL_TONE_SEARCH_CEILING = 56;
93
+
94
+ /**
95
+ * How much DEEPER the same brand sits on a light page than on a dark one.
96
+ *
97
+ * Not decoration: a colour on a near-white page has nothing to read against, so
98
+ * the mode difference is what makes a theme a theme rather than one palette shown
99
+ * twice. Dropping it is a regression that looks like a simplification — light and
100
+ * dark collapse onto the same fill for every seed that is not already bright, and
101
+ * the two modes stop being distinguishable at all.
102
+ */
103
+ const LIGHT_DEPTH_STEP = 5;
104
+
105
+ /**
106
+ * How deep a light-mode fill may go. Deliberately BELOW the search's lower bound,
107
+ * which those two used to share — and sharing them silently voided the depth step
108
+ * for any seed whose dark fill already sits at that bound. A high-chroma seed is
109
+ * exactly that case: pink loses its white label above tone 45, so dark cannot rise
110
+ * to make room and light must descend instead, or the two modes render the
111
+ * identical fill.
112
+ */
113
+ const LIGHT_FILL_FLOOR = 40;
93
114
 
94
115
  /** How far a fill may be dragged from its natural tone before the colour is lost. */
95
116
  const TONE_BUDGET = 25;
@@ -230,6 +251,47 @@ function vividHueNear(hue) {
230
251
  return bestChroma - baseChroma >= VIVID_SNAP_MIN_GAIN ? bestHue : hue;
231
252
  }
232
253
 
254
+ /**
255
+ * The most vivid tone a palette reaches while a WHITE label still clears AA on
256
+ * it — searched per HUE instead of assumed.
257
+ *
258
+ * A single tone for every hue leaves chroma on the table for some and takes it
259
+ * from others, because the sRGB gamut is not a cylinder: from tone 45 upward an
260
+ * orange keeps gaining chroma until white runs out at ~49.5 (59 -> 84), while a
261
+ * violet has already passed its peak and LOSES chroma over the same interval
262
+ * (91 -> 86). The old flat 45 spent none of the contrast headroom it had — every
263
+ * preset sat at 5.38 when 4.5 was the requirement — and orange paid for that
264
+ * twice, since its hue is also one of the gamut's narrow ones.
265
+ *
266
+ * The floor is what keeps this from trading lightness for chroma: a hue that
267
+ * peaks far below 45 stays at 45 rather than descending into a near-black slab
268
+ * that happens to be saturated. So the search can only ever improve a fill or
269
+ * leave it exactly where it was.
270
+ *
271
+ * Contrast is measured on the QUANTIZED colour, not the engine's continuous
272
+ * tone-ratio: an earlier iteration chose tones by the latter and shipped 135
273
+ * pairs at a measured 4.49.
274
+ */
275
+ function vividLegibleTone(palette) {
276
+ let bestTone = FILL_TONE_FLOOR;
277
+ let bestChroma = -1;
278
+ for (let tone = FILL_TONE_FLOOR; tone <= FILL_TONE_SEARCH_CEILING; tone += 0.5) {
279
+ const argb = palette.tone(tone);
280
+ if (contrastOf(argb, true) < AA) continue;
281
+ const chroma = _hct.Hct.fromInt(argb).chroma;
282
+ // A tie keeps the DEEPEST tone. Ties are common rather than exotic — any seed
283
+ // whose chroma sits below the gamut ceiling across this whole range has a flat
284
+ // curve here — and breaking them toward the lightest end instead changes no
285
+ // preset's output, because the light-mode floor below already supplies the
286
+ // separation that would have bought. Mutation-checked, not assumed.
287
+ if (chroma > bestChroma) {
288
+ bestChroma = chroma;
289
+ bestTone = tone;
290
+ }
291
+ }
292
+ return bestTone;
293
+ }
294
+
233
295
  /**
234
296
  * The tone a BRAND fill sits at.
235
297
  *
@@ -248,11 +310,11 @@ function whiteLabelTone(palette, seedTone, isDark) {
248
310
  // smear there, indistinguishable from the same colour in dark, which is not a
249
311
  // theme at all. Coming down is what makes faircoin a deep green in light and a
250
312
  // bright lime in dark.
251
- if (!isDark) return LIGHT_FILL_TONE;
313
+ if (!isDark) return Math.max(LIGHT_FILL_FLOOR, vividLegibleTone(palette) - LIGHT_DEPTH_STEP);
252
314
  // DARK: the budget applies. Most brands come down to where white fits, but a
253
315
  // seed that is already light cannot without ceasing to be itself, so it keeps
254
316
  // its own tone and takes a black label. That is the eleven-and-two pattern.
255
- const candidate = Math.max(DARK_FILL_TONE, seedTone - TONE_BUDGET);
317
+ const candidate = Math.max(vividLegibleTone(palette), seedTone - TONE_BUDGET);
256
318
  return contrastOf(palette.tone(candidate), true) >= AA ? candidate : Math.max(seedTone, DARK_SEED_FLOOR);
257
319
  }
258
320
 
@@ -263,10 +325,10 @@ function whiteLabelTone(palette, seedTone, isDark) {
263
325
  * peaks dark comes down and carries white.
264
326
  */
265
327
  function accentTone(hue, isDark) {
266
- if (!isDark) return LIGHT_FILL_TONE;
267
- const peak = Math.max(peakTone(hue), DARK_ACCENT_FLOOR);
268
328
  const palette = _tonalPalette.TonalPalette.fromHueAndChroma(hue, ACCENT_CHROMA);
269
- const candidate = Math.max(DARK_FILL_TONE, peak - TONE_BUDGET);
329
+ if (!isDark) return Math.max(LIGHT_FILL_FLOOR, vividLegibleTone(palette) - LIGHT_DEPTH_STEP);
330
+ const peak = Math.max(peakTone(hue), DARK_ACCENT_FLOOR);
331
+ const candidate = Math.max(vividLegibleTone(palette), peak - TONE_BUDGET);
270
332
  return contrastOf(palette.tone(candidate), true) >= AA ? candidate : peak;
271
333
  }
272
334
 
@@ -333,13 +395,17 @@ function buildPolicyTokens(seedHex, isDark, roles, pinned = {}) {
333
395
  // dark fill sit at the seed's own tone instead makes it brighter, but every one
334
396
  // of those labels turns black, which costs more than the brightness buys.
335
397
  const monochrome = seed.chroma <= MONOCHROME_MAX_CHROMA;
336
- // DARK keys off the seed itself so the fill IS the brand hex; LIGHT uses the
337
- // max-chroma palette, which is what stops a deepened fill from going pastel.
398
+ // BOTH modes key off the seed itself, so the fill carries the brand's SATURATION
399
+ // as well as its hue. Light used to force the hue to maximum chroma, which reads
400
+ // as "the seed only chose a hue" — and that silently renames a colour: a muted
401
+ // blue-grey seed resolved to a vivid cyan, and a brown seed to an orange, since
402
+ // both differ from a saturated neighbour by chroma alone. A deliberately soft
403
+ // brand now stays soft instead of being argued with.
338
404
  // A monochrome seed has no chroma to preserve either way, and its fill goes to
339
405
  // the far end of the scale rather than the white-label ceiling: a mid-grey
340
406
  // button reads as disabled, where near-black on white reads as the primary
341
407
  // action.
342
- const brandPalette = monochrome ? _tonalPalette.TonalPalette.fromHueAndChroma(0, 0) : isDark ? _tonalPalette.TonalPalette.fromInt((0, _index.argbFromHex)(seedHex)) : _tonalPalette.TonalPalette.fromHueAndChroma(seed.hue, 200);
408
+ const brandPalette = monochrome ? _tonalPalette.TonalPalette.fromHueAndChroma(0, 0) : _tonalPalette.TonalPalette.fromInt((0, _index.argbFromHex)(seedHex));
343
409
  const primary = fillPair(brandPalette, monochrome ? isDark ? MONOCHROME_FILL_TONE.dark : MONOCHROME_FILL_TONE.light : whiteLabelTone(brandPalette, seed.tone, isDark));
344
410
  const tokens = {
345
411
  '--primary': primary.fill,
@@ -416,7 +482,7 @@ function buildPolicyTokens(seedHex, isDark, roles, pinned = {}) {
416
482
  for (const [role, hex] of Object.entries(STATUS_SEEDS)) {
417
483
  const status = _hct.Hct.fromInt((0, _index.argbFromHex)(hex));
418
484
  const palette = _tonalPalette.TonalPalette.fromHueAndChroma(status.hue, status.chroma);
419
- const pair = fillPair(palette, isDark ? DARK_FILL_TONE : LIGHT_FILL_TONE);
485
+ const pair = fillPair(palette, isDark ? vividLegibleTone(palette) : Math.max(LIGHT_FILL_FLOOR, vividLegibleTone(palette) - LIGHT_DEPTH_STEP));
420
486
  tokens[`--${role}`] = pair.fill;
421
487
  tokens[`--${role}-foreground`] = pair.foreground;
422
488
  tokens[`--${role}-text`] = rgb(_tonalPalette.TonalPalette.fromHueAndChroma(status.hue, TEXT_CHROMA).tone(isDark ? TEXT_TONE.dark : TEXT_TONE.light));
@@ -1 +1 @@
1
- {"version":3,"names":["_index","require","_hct","_tonalPalette","_colorUtils","STATUS_SEEDS","exports","success","error","warning","info","AA","rgb","argb","redFromArgb","greenFromArgb","blueFromArgb","rgba","alpha","contrastOf","onWhite","channel","v","c","Math","pow","luminance","foregroundFor","noLegibleForeground","LIGHT_FILL_TONE","DARK_FILL_TONE","TONE_BUDGET","DARK_SEED_FLOOR","DARK_ACCENT_FLOOR","ACCENT_CHROMA","TEXT_TONE","light","dark","TEXT_CHROMA","SUBTLE_SOURCE_TONE","SUBTLE_ALPHA","MONOCHROME_MAX_CHROMA","isColourlessSeed","seedHex","Hct","fromInt","argbFromHex","chroma","MONOCHROME_FILL_TONE","MONOCHROME_SECONDARY_TONE","SPLIT_ROTATIONS","VIVID_SNAP_WINDOW","VIVID_SNAP_MIN_GAIN","MIN_ACCENT_SEPARATION","DESTRUCTIVE_PROXIMITY","hueDistance","a","b","d","abs","min","peakTone","hue","palette","TonalPalette","fromHueAndChroma","bestTone","bestChroma","tone","peakChroma","vividHueNear","baseChroma","bestHue","delta","candidate","whiteLabelTone","seedTone","isDark","max","accentTone","peak","fillPair","startTone","fill","foreground","accentHues","seedHue","firstRotation","secondRotation","geometricA","geometricB","geometricStandout","quiet","snapped","standout","errorHue","secondary","tertiary","buildPolicyTokens","roles","pinned","seed","monochrome","brandPalette","primary","tokens","surfaceContainer","surfaceContainerLowest","surfaceContainerHigh","onSurfaceVariant","hues","role","pin","undefined","fillPalette","textPalette","vividPalette","pair","i","hex","Object","entries","status"],"sourceRoot":"../../../src","sources":["theme/color-policy.ts"],"mappings":";;;;;;;;AAwBA,IAAAA,MAAA,GAAAC,OAAA;AACA,IAAAC,IAAA,GAAAD,OAAA;AACA,IAAAE,aAAA,GAAAF,OAAA;AACA,IAAAG,WAAA,GAAAH,OAAA;AA3BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAMA;AACO,MAAMI,YAAY,GAAAC,OAAA,CAAAD,YAAA,GAAG;EAC1BE,OAAO,EAAE,SAAS;EAClBC,KAAK,EAAE,SAAS;EAChBC,OAAO,EAAE,SAAS;EAClBC,IAAI,EAAE;AACR,CAAU;;AAEV;;AAMA;;AAGA,MAAMC,EAAE,GAAG,GAAG;AAEd,MAAMC,GAAG,GAAIC,IAAY,IACvB,OAAO,IAAAC,uBAAW,EAACD,IAAI,CAAC,IAAI,IAAAE,yBAAa,EAACF,IAAI,CAAC,IAAI,IAAAG,wBAAY,EAACH,IAAI,CAAC,GAAG;;AAE1E;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAMI,IAAI,GAAGA,CAACJ,IAAY,EAAEK,KAAa,KACvC,QAAQ,IAAAJ,uBAAW,EAACD,IAAI,CAAC,KAAK,IAAAE,yBAAa,EAACF,IAAI,CAAC,KAAK,IAAAG,wBAAY,EAACH,IAAI,CAAC,KAAKK,KAAK,GAAG;;AAEvF;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAASC,UAAUA,CAACN,IAAY,EAAEO,OAAgB,EAAU;EAC1D,MAAMC,OAAO,GAAIC,CAAS,IAAa;IACrC,MAAMC,CAAC,GAAGD,CAAC,GAAG,GAAG;IACjB,OAAOC,CAAC,IAAI,OAAO,GAAGA,CAAC,GAAG,KAAK,GAAGC,IAAI,CAACC,GAAG,CAAC,CAACF,CAAC,GAAG,KAAK,IAAI,KAAK,EAAE,GAAG,CAAC;EACtE,CAAC;EACD,MAAMG,SAAS,GACb,MAAM,GAAGL,OAAO,CAAC,IAAAP,uBAAW,EAACD,IAAI,CAAC,CAAC,GACnC,MAAM,GAAGQ,OAAO,CAAC,IAAAN,yBAAa,EAACF,IAAI,CAAC,CAAC,GACrC,MAAM,GAAGQ,OAAO,CAAC,IAAAL,wBAAY,EAACH,IAAI,CAAC,CAAC;EACtC,OAAOO,OAAO,GAAG,IAAI,IAAIM,SAAS,GAAG,IAAI,CAAC,GAAG,CAACA,SAAS,GAAG,IAAI,IAAI,IAAI;AACxE;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAMC,aAAa,GAAId,IAAY,IACjCM,UAAU,CAACN,IAAI,EAAE,IAAI,CAAC,IAAIF,EAAE,GAAG,kBAAkB,GAAG,YAAY;AAElE,MAAMiB,mBAAmB,GAAIf,IAAY,IACvCM,UAAU,CAACN,IAAI,EAAE,IAAI,CAAC,GAAGF,EAAE,IAAIQ,UAAU,CAACN,IAAI,EAAE,KAAK,CAAC,GAAGF,EAAE;;AAE7D;AACA,MAAMkB,eAAe,GAAG,EAAE;;AAE1B;AACA,MAAMC,cAAc,GAAG,EAAE;;AAEzB;AACA,MAAMC,WAAW,GAAG,EAAE;;AAEtB;AACA,MAAMC,eAAe,GAAG,EAAE;;AAE1B;AACA;AACA;AACA;AACA,MAAMC,iBAAiB,GAAG,EAAE;;AAE5B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,MAAMC,aAAa,GAAG,EAAE;;AAExB;AACA,MAAMC,SAAS,GAAG;EAAEC,KAAK,EAAE,EAAE;EAAEC,IAAI,EAAE;AAAG,CAAU;AAClD,MAAMC,WAAW,GAAG,EAAE;;AAEtB;AACA,MAAMC,kBAAkB,GAAG,EAAE;AAC7B,MAAMC,YAAY,GAAG;EAAEJ,KAAK,EAAE,IAAI;EAAEC,IAAI,EAAE;AAAK,CAAU;;AAEzD;AACA;AACA;AACA;AACA;AACA;AACA,MAAMI,qBAAqB,GAAG,CAAC;;AAE/B;AACA;AACA;AACA;AACA;AACO,SAASC,gBAAgBA,CAACC,OAAe,EAAW;EACzD,OAAOC,QAAG,CAACC,OAAO,CAAC,IAAAC,kBAAW,EAACH,OAAO,CAAC,CAAC,CAACI,MAAM,IAAIN,qBAAqB;AAC1E;;AAEA;AACA,MAAMO,oBAAoB,GAAG;EAAEZ,KAAK,EAAE,EAAE;EAAEC,IAAI,EAAE;AAAG,CAAU;;AAE7D;AACA,MAAMY,yBAAyB,GAAG;EAAEb,KAAK,EAAE,EAAE;EAAEC,IAAI,EAAE;AAAG,CAAU;;AAElE;AACA,MAAMa,eAAe,GAAG,CAAC,GAAG,EAAE,GAAG,CAAU;;AAE3C;AACA,MAAMC,iBAAiB,GAAG,EAAE;AAC5B,MAAMC,mBAAmB,GAAG,EAAE;;AAE9B;AACA,MAAMC,qBAAqB,GAAG,EAAE;;AAEhC;AACA,MAAMC,qBAAqB,GAAG,EAAE;AAEhC,SAASC,WAAWA,CAACC,CAAS,EAAEC,CAAS,EAAU;EACjD,MAAMC,CAAC,GAAGlC,IAAI,CAACmC,GAAG,CAACH,CAAC,GAAGC,CAAC,CAAC,GAAG,GAAG;EAC/B,OAAOjC,IAAI,CAACoC,GAAG,CAACF,CAAC,EAAE,GAAG,GAAGA,CAAC,CAAC;AAC7B;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAASG,QAAQA,CAACC,GAAW,EAAU;EACrC,MAAMC,OAAO,GAAGC,0BAAY,CAACC,gBAAgB,CAACH,GAAG,EAAE,GAAG,CAAC;EACvD,IAAII,QAAQ,GAAG,EAAE;EACjB,IAAIC,UAAU,GAAG,CAAC,CAAC;EACnB,KAAK,IAAIC,IAAI,GAAG,EAAE,EAAEA,IAAI,IAAI,EAAE,EAAEA,IAAI,IAAI,CAAC,EAAE;IACzC,MAAMrB,MAAM,GAAGH,QAAG,CAACC,OAAO,CAACkB,OAAO,CAACK,IAAI,CAACA,IAAI,CAAC,CAAC,CAACrB,MAAM;IACrD,IAAIA,MAAM,GAAGoB,UAAU,EAAE;MACvBA,UAAU,GAAGpB,MAAM;MACnBmB,QAAQ,GAAGE,IAAI;IACjB;EACF;EACA,OAAOF,QAAQ;AACjB;;AAEA;AACA,SAASG,UAAUA,CAACP,GAAW,EAAU;EACvC,OAAOlB,QAAG,CAACC,OAAO,CAACmB,0BAAY,CAACC,gBAAgB,CAACH,GAAG,EAAE,GAAG,CAAC,CAACM,IAAI,CAACP,QAAQ,CAACC,GAAG,CAAC,CAAC,CAAC,CAACf,MAAM;AACxF;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAASuB,YAAYA,CAACR,GAAW,EAAU;EACzC,MAAMS,UAAU,GAAGF,UAAU,CAACP,GAAG,CAAC;EAClC,IAAIU,OAAO,GAAGV,GAAG;EACjB,IAAIK,UAAU,GAAGI,UAAU;EAC3B,KAAK,IAAIE,KAAK,GAAG,CAACtB,iBAAiB,EAAEsB,KAAK,IAAItB,iBAAiB,EAAEsB,KAAK,IAAI,CAAC,EAAE;IAC3E,MAAMC,SAAS,GAAG,CAAE,CAACZ,GAAG,GAAGW,KAAK,IAAI,GAAG,GAAI,GAAG,IAAI,GAAG;IACrD,MAAM1B,MAAM,GAAGsB,UAAU,CAACK,SAAS,CAAC;IACpC,IAAI3B,MAAM,GAAGoB,UAAU,EAAE;MACvBA,UAAU,GAAGpB,MAAM;MACnByB,OAAO,GAAGE,SAAS;IACrB;EACF;EACA,OAAOP,UAAU,GAAGI,UAAU,IAAInB,mBAAmB,GAAGoB,OAAO,GAAGV,GAAG;AACvE;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAASa,cAAcA,CAACZ,OAAqB,EAAEa,QAAgB,EAAEC,MAAe,EAAU;EACxF;EACA;EACA;EACA;EACA;EACA,IAAI,CAACA,MAAM,EAAE,OAAOhD,eAAe;EACnC;EACA;EACA;EACA,MAAM6C,SAAS,GAAGlD,IAAI,CAACsD,GAAG,CAAChD,cAAc,EAAE8C,QAAQ,GAAG7C,WAAW,CAAC;EAClE,OAAOZ,UAAU,CAAC4C,OAAO,CAACK,IAAI,CAACM,SAAS,CAAC,EAAE,IAAI,CAAC,IAAI/D,EAAE,GAClD+D,SAAS,GACTlD,IAAI,CAACsD,GAAG,CAACF,QAAQ,EAAE5C,eAAe,CAAC;AACzC;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS+C,UAAUA,CAACjB,GAAW,EAAEe,MAAe,EAAU;EACxD,IAAI,CAACA,MAAM,EAAE,OAAOhD,eAAe;EACnC,MAAMmD,IAAI,GAAGxD,IAAI,CAACsD,GAAG,CAACjB,QAAQ,CAACC,GAAG,CAAC,EAAE7B,iBAAiB,CAAC;EACvD,MAAM8B,OAAO,GAAGC,0BAAY,CAACC,gBAAgB,CAACH,GAAG,EAAE5B,aAAa,CAAC;EACjE,MAAMwC,SAAS,GAAGlD,IAAI,CAACsD,GAAG,CAAChD,cAAc,EAAEkD,IAAI,GAAGjD,WAAW,CAAC;EAC9D,OAAOZ,UAAU,CAAC4C,OAAO,CAACK,IAAI,CAACM,SAAS,CAAC,EAAE,IAAI,CAAC,IAAI/D,EAAE,GAAG+D,SAAS,GAAGM,IAAI;AAC3E;;AAEA;AACA,SAASC,QAAQA,CAAClB,OAAqB,EAAEmB,SAAiB,EAAwC;EAChG,IAAId,IAAI,GAAGc,SAAS;EACpB,OAAOtD,mBAAmB,CAACmC,OAAO,CAACK,IAAI,CAACA,IAAI,CAAC,CAAC,IAAIA,IAAI,GAAG,CAAC,IAAIA,IAAI,GAAG,EAAE,EAAE;IACvEA,IAAI,IAAIA,IAAI,GAAG,EAAE,GAAG,CAAC,CAAC,GAAG,CAAC;EAC5B;EACA,OAAO;IAAEe,IAAI,EAAEvE,GAAG,CAACmD,OAAO,CAACK,IAAI,CAACA,IAAI,CAAC,CAAC;IAAEgB,UAAU,EAAEzD,aAAa,CAACoC,OAAO,CAACK,IAAI,CAACA,IAAI,CAAC;EAAE,CAAC;AACzF;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAASiB,UAAUA,CAACC,OAAe,EAA2C;EAC5E,MAAM,CAACC,aAAa,EAAEC,cAAc,CAAC,GAAGtC,eAAe;EACvD,MAAMuC,UAAU,GAAG,CAACH,OAAO,GAAGC,aAAa,IAAI,GAAG;EAClD,MAAMG,UAAU,GAAG,CAACJ,OAAO,GAAGE,cAAc,IAAI,GAAG;EAEnD,MAAMG,iBAAiB,GACrBtB,UAAU,CAACoB,UAAU,CAAC,IAAIpB,UAAU,CAACqB,UAAU,CAAC,GAAGD,UAAU,GAAGC,UAAU;EAC5E,MAAME,KAAK,GAAGD,iBAAiB,KAAKF,UAAU,GAAGC,UAAU,GAAGD,UAAU;EACxE,MAAMI,OAAO,GAAGvB,YAAY,CAACqB,iBAAiB,CAAC;EAC/C,MAAMG,QAAQ,GACZvC,WAAW,CAACsC,OAAO,EAAED,KAAK,CAAC,IAAIvC,qBAAqB,GAAGwC,OAAO,GAAGF,iBAAiB;;EAEpF;EACA;EACA;EACA,MAAMI,QAAQ,GAAGnD,QAAG,CAACC,OAAO,CAAC,IAAAC,kBAAW,EAACzC,YAAY,CAACG,KAAK,CAAC,CAAC,CAACsD,GAAG;EACjE,OAAOP,WAAW,CAACuC,QAAQ,EAAEC,QAAQ,CAAC,GAAGzC,qBAAqB,GAC1D;IAAE0C,SAAS,EAAEF,QAAQ;IAAEG,QAAQ,EAAEL;EAAM,CAAC,GACxC;IAAEI,SAAS,EAAEJ,KAAK;IAAEK,QAAQ,EAAEH;EAAS,CAAC;AAC9C;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,SAASI,iBAAiBA,CAC/BvD,OAAe,EACfkC,MAAe,EACfsB,KAAiB,EACjBC,MAAqB,GAAG,CAAC,CAAC,EACZ;EACd,MAAMC,IAAI,GAAGzD,QAAG,CAACC,OAAO,CAAC,IAAAC,kBAAW,EAACH,OAAO,CAAC,CAAC;;EAE9C;EACA;EACA;EACA;EACA;EACA;EACA;EACA,MAAM2D,UAAU,GAAGD,IAAI,CAACtD,MAAM,IAAIN,qBAAqB;EACvD;EACA;EACA;EACA;EACA;EACA;EACA,MAAM8D,YAAY,GAAGD,UAAU,GAC3BtC,0BAAY,CAACC,gBAAgB,CAAC,CAAC,EAAE,CAAC,CAAC,GACnCY,MAAM,GACJb,0BAAY,CAACnB,OAAO,CAAC,IAAAC,kBAAW,EAACH,OAAO,CAAC,CAAC,GAC1CqB,0BAAY,CAACC,gBAAgB,CAACoC,IAAI,CAACvC,GAAG,EAAE,GAAG,CAAC;EAClD,MAAM0C,OAAO,GAAGvB,QAAQ,CACtBsB,YAAY,EACZD,UAAU,GACLzB,MAAM,GAAG7B,oBAAoB,CAACX,IAAI,GAAGW,oBAAoB,CAACZ,KAAK,GAChEuC,cAAc,CAAC4B,YAAY,EAAEF,IAAI,CAACjC,IAAI,EAAES,MAAM,CACpD,CAAC;EAED,MAAM4B,MAAoB,GAAG;IAC3B,WAAW,EAAED,OAAO,CAACrB,IAAI;IACzB,sBAAsB,EAAEqB,OAAO,CAACpB,UAAU;IAC1C;IACA;IACA,gBAAgB,EAAEe,KAAK,CAACK,OAAO;IAC/B,kBAAkB,EAAEvF,IAAI,CACtB+C,0BAAY,CAACC,gBAAgB,CAACoC,IAAI,CAACvC,GAAG,EAAEwC,UAAU,GAAG,CAAC,GAAG,GAAG,CAAC,CAAClC,IAAI,CAAC7B,kBAAkB,CAAC,EACtFsC,MAAM,GAAGrC,YAAY,CAACH,IAAI,GAAGG,YAAY,CAACJ,KAC5C,CAAC;IACD,QAAQ,EAAE+D,KAAK,CAACK,OAAO;IACvB;IACA;IACA;IACA;IACA;IACA,QAAQ,EAAE3B,MAAM,GAAGsB,KAAK,CAACO,gBAAgB,GAAGP,KAAK,CAACQ,sBAAsB;IACxE;IACA;IACA,cAAc,EAAE/F,GAAG,CACjBoD,0BAAY,CAACC,gBAAgB,CAACoC,IAAI,CAACvC,GAAG,EAAEwC,UAAU,GAAG,CAAC,GAAG,EAAE,CAAC,CAAClC,IAAI,CAACS,MAAM,GAAG,CAAC,GAAG,EAAE,CACnF,CAAC;IACD;IACA,UAAU,EAAEsB,KAAK,CAACS,oBAAoB;IACtC,qBAAqB,EAAET,KAAK,CAACU;EAC/B,CAAC;EAED,MAAMC,IAAI,GAAGzB,UAAU,CAACgB,IAAI,CAACvC,GAAG,CAAC;EACjC,KAAK,MAAMiD,IAAI,IAAI,CAAC,WAAW,EAAE,UAAU,CAAC,EAAW;IACrD,MAAMC,GAAG,GAAGZ,MAAM,CAACW,IAAI,CAAC;IACxB,MAAMjD,GAAG,GAAGkD,GAAG,KAAKC,SAAS,GAAGrE,QAAG,CAACC,OAAO,CAAC,IAAAC,kBAAW,EAACkE,GAAG,CAAC,CAAC,CAAClD,GAAG,GAAGgD,IAAI,CAACC,IAAI,CAAC;IAC9E;IACA;IACA;IACA;IACA,MAAMG,WAAW,GAAGlD,0BAAY,CAACC,gBAAgB,CAACH,GAAG,EAAEwC,UAAU,GAAG,CAAC,GAAGpE,aAAa,CAAC;IACtF,MAAMiF,WAAW,GAAGnD,0BAAY,CAACC,gBAAgB,CAACH,GAAG,EAAEwC,UAAU,GAAG,CAAC,GAAGhE,WAAW,CAAC;IACpF,MAAM8E,YAAY,GAAGpD,0BAAY,CAACC,gBAAgB,CAACH,GAAG,EAAEwC,UAAU,GAAG,CAAC,GAAG,GAAG,CAAC;IAC7E;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA,MAAMlC,IAAI,GAAGkC,UAAU,GACnBS,IAAI,KAAK,UAAU,GACjBlC,MAAM,GACJ7B,oBAAoB,CAACX,IAAI,GACzBW,oBAAoB,CAACZ,KAAK,GAC5ByC,MAAM,GACJ5B,yBAAyB,CAACZ,IAAI,GAC9BY,yBAAyB,CAACb,KAAK,GACnC2C,UAAU,CAACjB,GAAG,EAAEe,MAAM,CAAC;IAC3B,MAAMwC,IAAI,GAAGpC,QAAQ,CAACiC,WAAW,EAAE9C,IAAI,CAAC;IACxCqC,MAAM,CAAC,KAAKM,IAAI,EAAE,CAAC,GAAGM,IAAI,CAAClC,IAAI;IAC/BsB,MAAM,CAAC,KAAKM,IAAI,aAAa,CAAC,GAAGM,IAAI,CAACjC,UAAU;IAChDqB,MAAM,CAAC,KAAKM,IAAI,OAAO,CAAC,GAAGnG,GAAG,CAACuG,WAAW,CAAC/C,IAAI,CAACS,MAAM,GAAG1C,SAAS,CAACE,IAAI,GAAGF,SAAS,CAACC,KAAK,CAAC,CAAC;IAC3FqE,MAAM,CAAC,KAAKM,IAAI,SAAS,CAAC,GAAG9F,IAAI,CAC/BmG,YAAY,CAAChD,IAAI,CAAC7B,kBAAkB,CAAC,EACrCsC,MAAM,GAAGrC,YAAY,CAACH,IAAI,GAAGG,YAAY,CAACJ,KAC5C,CAAC;EACH;;EAEA;EACA;EACA;EACA,KAAK,IAAIkF,CAAC,GAAG,CAAC,EAAEA,CAAC,GAAG,CAAC,EAAEA,CAAC,IAAI,CAAC,EAAE;IAC7B;IACAb,MAAM,CAAC,WAAWa,CAAC,GAAG,CAAC,EAAE,CAAC,GAAGhB,UAAU,GACnC1F,GAAG,CAACoD,0BAAY,CAACC,gBAAgB,CAAC,CAAC,EAAE,CAAC,CAAC,CAACG,IAAI,CAACS,MAAM,GAAG,EAAE,GAAGyC,CAAC,GAAG,EAAE,GAAG,EAAE,GAAGA,CAAC,GAAG,EAAE,CAAC,CAAC,GACjF1G,GAAG,CAACoD,0BAAY,CAACC,gBAAgB,CAAC,CAACoC,IAAI,CAACvC,GAAG,GAAGwD,CAAC,GAAG,EAAE,IAAI,GAAG,EAAE,EAAE,CAAC,CAAClD,IAAI,CAACS,MAAM,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC;EAC9F;;EAEA;EACA;EACA;EACA;EACA,KAAK,MAAM,CAACkC,IAAI,EAAEQ,GAAG,CAAC,IAAIC,MAAM,CAACC,OAAO,CAACpH,YAAY,CAAC,EAAE;IACtD,MAAMqH,MAAM,GAAG9E,QAAG,CAACC,OAAO,CAAC,IAAAC,kBAAW,EAACyE,GAAG,CAAC,CAAC;IAC5C,MAAMxD,OAAO,GAAGC,0BAAY,CAACC,gBAAgB,CAACyD,MAAM,CAAC5D,GAAG,EAAE4D,MAAM,CAAC3E,MAAM,CAAC;IACxE,MAAMsE,IAAI,GAAGpC,QAAQ,CAAClB,OAAO,EAAEc,MAAM,GAAG/C,cAAc,GAAGD,eAAe,CAAC;IACzE4E,MAAM,CAAC,KAAKM,IAAI,EAAE,CAAC,GAAGM,IAAI,CAAClC,IAAI;IAC/BsB,MAAM,CAAC,KAAKM,IAAI,aAAa,CAAC,GAAGM,IAAI,CAACjC,UAAU;IAChDqB,MAAM,CAAC,KAAKM,IAAI,OAAO,CAAC,GAAGnG,GAAG,CAC5BoD,0BAAY,CAACC,gBAAgB,CAACyD,MAAM,CAAC5D,GAAG,EAAExB,WAAW,CAAC,CAAC8B,IAAI,CACzDS,MAAM,GAAG1C,SAAS,CAACE,IAAI,GAAGF,SAAS,CAACC,KACtC,CACF,CAAC;IACD;IACA;IACA;IACA;IACAqE,MAAM,CAAC,KAAKM,IAAI,SAAS,CAAC,GAAG9F,IAAI,CAC/B8C,OAAO,CAACK,IAAI,CAACsD,MAAM,CAACtD,IAAI,CAAC,EACzBS,MAAM,GAAGrC,YAAY,CAACH,IAAI,GAAGG,YAAY,CAACJ,KAC5C,CAAC;EACH;EAEA,OAAOqE,MAAM;AACf","ignoreList":[]}
1
+ {"version":3,"names":["_index","require","_hct","_tonalPalette","_colorUtils","STATUS_SEEDS","exports","success","error","warning","info","AA","rgb","argb","redFromArgb","greenFromArgb","blueFromArgb","rgba","alpha","contrastOf","onWhite","channel","v","c","Math","pow","luminance","foregroundFor","noLegibleForeground","FILL_TONE_FLOOR","FILL_TONE_SEARCH_CEILING","LIGHT_DEPTH_STEP","LIGHT_FILL_FLOOR","TONE_BUDGET","DARK_SEED_FLOOR","DARK_ACCENT_FLOOR","ACCENT_CHROMA","TEXT_TONE","light","dark","TEXT_CHROMA","SUBTLE_SOURCE_TONE","SUBTLE_ALPHA","MONOCHROME_MAX_CHROMA","isColourlessSeed","seedHex","Hct","fromInt","argbFromHex","chroma","MONOCHROME_FILL_TONE","MONOCHROME_SECONDARY_TONE","SPLIT_ROTATIONS","VIVID_SNAP_WINDOW","VIVID_SNAP_MIN_GAIN","MIN_ACCENT_SEPARATION","DESTRUCTIVE_PROXIMITY","hueDistance","a","b","d","abs","min","peakTone","hue","palette","TonalPalette","fromHueAndChroma","bestTone","bestChroma","tone","peakChroma","vividHueNear","baseChroma","bestHue","delta","candidate","vividLegibleTone","whiteLabelTone","seedTone","isDark","max","accentTone","peak","fillPair","startTone","fill","foreground","accentHues","seedHue","firstRotation","secondRotation","geometricA","geometricB","geometricStandout","quiet","snapped","standout","errorHue","secondary","tertiary","buildPolicyTokens","roles","pinned","seed","monochrome","brandPalette","primary","tokens","surfaceContainer","surfaceContainerLowest","surfaceContainerHigh","onSurfaceVariant","hues","role","pin","undefined","fillPalette","textPalette","vividPalette","pair","i","hex","Object","entries","status"],"sourceRoot":"../../../src","sources":["theme/color-policy.ts"],"mappings":"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","ignoreList":[]}
@@ -3,7 +3,7 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
- exports.PREMIUM_COLOR_NAMES = exports.HEX_TO_APP_COLOR = exports.APP_COLOR_PRESETS = exports.APP_COLOR_NAMES = void 0;
6
+ exports.PREMIUM_COLOR_NAMES = exports.HEX_TO_APP_COLOR = exports.HANDLE_COLOR_NAMES = exports.FREE_COLOR_NAMES = exports.APP_COLOR_PRESETS = exports.APP_COLOR_NAMES = void 0;
7
7
  exports.hexToAppColorName = hexToAppColorName;
8
8
  /**
9
9
  * A single colour preset: a brand SEED colour plus the tonal scheme variant to
@@ -16,6 +16,14 @@ exports.hexToAppColorName = hexToAppColorName;
16
16
  * maps those roles onto Bloom's canonical token names. A user-picked colour
17
17
  * flows through the identical path — a preset is just a fixed seed.
18
18
  */
19
+ /**
20
+ * Why a preset is not offered to every user. Absent means it is.
21
+ *
22
+ * The two are NOT interchangeable and must not collapse back into one list: a
23
+ * `handle` preset belongs to a specific account and cannot be bought, while a
24
+ * `premium` one is exactly what is bought. Conflating them is how the picker
25
+ * came to offer both of Oxy's reserved brand colours to everybody.
26
+ */
19
27
 
20
28
  /**
21
29
  * Historically each preset carried a full light/dark map of raw HSL triples.
@@ -24,24 +32,25 @@ exports.hexToAppColorName = hexToAppColorName;
24
32
  * resolved `--token -> value` record that `getPresetVars` produces).
25
33
  */
26
34
 
27
- const APP_COLOR_NAMES = exports.APP_COLOR_NAMES = ['teal', 'blue', 'green', 'amber', 'yellow', 'red', 'purple', 'pink', 'sky', 'orange', 'mint', 'oxy', 'faircoin', 'mono'];
28
-
29
- /** Premium-exclusive presets, hidden from the standard color picker. */
30
- const PREMIUM_COLOR_NAMES = exports.PREMIUM_COLOR_NAMES = ['oxy', 'faircoin'];
35
+ const APP_COLOR_NAMES = exports.APP_COLOR_NAMES = ['teal', 'blue', 'green', 'yellow', 'red', 'purple', 'pink', 'sky', 'orange', 'mint', 'oxy', 'faircoin', 'pumpkin', 'gray', 'brown', 'peach', 'rose', 'mono'];
31
36
  const HEX_TO_APP_COLOR = exports.HEX_TO_APP_COLOR = {
32
37
  '#005c67': 'teal',
33
- '#1d9bf0': 'blue',
38
+ '#0085fe': 'blue',
34
39
  '#10b981': 'green',
35
- '#f59e0b': 'amber',
36
- '#ffc300': 'yellow',
40
+ '#fcdc00': 'yellow',
37
41
  '#ef4444': 'red',
38
- '#8b5cf6': 'purple',
39
- '#ec4899': 'pink',
40
- '#0ea5e9': 'sky',
41
- '#f97316': 'orange',
42
+ '#b866ff': 'purple',
43
+ '#ff3c7f': 'pink',
44
+ '#03a9f4': 'sky',
45
+ '#ff5722': 'orange',
42
46
  '#14b8a6': 'mint',
43
47
  '#c46ede': 'oxy',
44
48
  '#9ffb50': 'faircoin',
49
+ '#ff9800': 'pumpkin',
50
+ '#607d8b': 'gray',
51
+ '#813519': 'brown',
52
+ '#ffb28d': 'peach',
53
+ '#fcaffe': 'rose',
45
54
  '#000000': 'mono'
46
55
  };
47
56
  function hexToAppColorName(hex) {
@@ -62,7 +71,7 @@ const APP_COLOR_PRESETS = exports.APP_COLOR_PRESETS = {
62
71
  },
63
72
  blue: {
64
73
  name: 'blue',
65
- hex: '#1d9bf0',
74
+ hex: '#0085fe',
66
75
  variant: 'vivid'
67
76
  },
68
77
  green: {
@@ -70,14 +79,9 @@ const APP_COLOR_PRESETS = exports.APP_COLOR_PRESETS = {
70
79
  hex: '#10b981',
71
80
  variant: 'vivid'
72
81
  },
73
- amber: {
74
- name: 'amber',
75
- hex: '#f59e0b',
76
- variant: 'vivid'
77
- },
78
82
  yellow: {
79
83
  name: 'yellow',
80
- hex: '#ffc300',
84
+ hex: '#fcdc00',
81
85
  variant: 'vivid'
82
86
  },
83
87
  red: {
@@ -87,22 +91,28 @@ const APP_COLOR_PRESETS = exports.APP_COLOR_PRESETS = {
87
91
  },
88
92
  purple: {
89
93
  name: 'purple',
90
- hex: '#8b5cf6',
94
+ hex: '#b866ff',
91
95
  variant: 'vivid'
92
96
  },
93
97
  pink: {
94
98
  name: 'pink',
95
- hex: '#ec4899',
99
+ hex: '#ff3c7f',
96
100
  variant: 'vivid'
97
101
  },
98
102
  sky: {
99
103
  name: 'sky',
100
- hex: '#0ea5e9',
104
+ hex: '#03a9f4',
101
105
  variant: 'vivid'
102
106
  },
107
+ // Deliberately NOT Tailwind's orange-500 (`#f97316`). That seed sits at HCT hue
108
+ // 46, which reads as orange only because it is also light: at hue 46 the sRGB
109
+ // gamut allows a chroma of just 62 at the tones a white label needs (<= 49), so
110
+ // the brand fill resolved to `rgb(177 76 0)` — a brown. Hue 34 carries a chroma
111
+ // of 84 at that same tone, with the same white label and the same contrast
112
+ // headroom, so the fill reads as orange instead of paying for the hue twice.
103
113
  orange: {
104
114
  name: 'orange',
105
- hex: '#f97316',
115
+ hex: '#ff5722',
106
116
  variant: 'vivid'
107
117
  },
108
118
  mint: {
@@ -113,11 +123,38 @@ const APP_COLOR_PRESETS = exports.APP_COLOR_PRESETS = {
113
123
  oxy: {
114
124
  name: 'oxy',
115
125
  hex: '#c46ede',
116
- variant: 'vivid'
126
+ variant: 'vivid',
127
+ gate: 'handle'
117
128
  },
118
129
  faircoin: {
119
130
  name: 'faircoin',
120
131
  hex: '#9ffb50',
132
+ variant: 'vivid',
133
+ gate: 'handle'
134
+ },
135
+ pumpkin: {
136
+ name: 'pumpkin',
137
+ hex: '#ff9800',
138
+ variant: 'vivid'
139
+ },
140
+ gray: {
141
+ name: 'gray',
142
+ hex: '#607d8b',
143
+ variant: 'vivid'
144
+ },
145
+ brown: {
146
+ name: 'brown',
147
+ hex: '#813519',
148
+ variant: 'vivid'
149
+ },
150
+ peach: {
151
+ name: 'peach',
152
+ hex: '#ffb28d',
153
+ variant: 'vivid'
154
+ },
155
+ rose: {
156
+ name: 'rose',
157
+ hex: '#fcaffe',
121
158
  variant: 'vivid'
122
159
  },
123
160
  /**
@@ -129,7 +166,30 @@ const APP_COLOR_PRESETS = exports.APP_COLOR_PRESETS = {
129
166
  mono: {
130
167
  name: 'mono',
131
168
  hex: '#000000',
132
- variant: 'monochrome'
169
+ variant: 'monochrome',
170
+ gate: 'premium'
133
171
  }
134
172
  };
173
+
174
+ /**
175
+ * The three gate groups, DERIVED from the presets rather than listed again, so a
176
+ * preset cannot be gated in one place and offered in another. Together they
177
+ * partition {@link APP_COLOR_NAMES} exactly — asserted in
178
+ * `__tests__/color-preset-gates.test.ts`, since a preset silently missing from
179
+ * every group would simply vanish from a picker with no error anywhere.
180
+ *
181
+ * A consumer builds its visible list from these; it must NOT start from
182
+ * `APP_COLOR_NAMES` and add the unlocked ones, which yields the gated presets to
183
+ * everybody and duplicates whatever the viewer did unlock.
184
+ */
185
+ const namesGatedBy = gate => APP_COLOR_NAMES.filter(name => APP_COLOR_PRESETS[name].gate === gate);
186
+
187
+ /** Available to every user, signed in or not. */
188
+ const FREE_COLOR_NAMES = exports.FREE_COLOR_NAMES = namesGatedBy(undefined);
189
+
190
+ /** Reserved for the account whose brand it is (`oxy`, `faircoin`) — not for sale. */
191
+ const HANDLE_COLOR_NAMES = exports.HANDLE_COLOR_NAMES = namesGatedBy('handle');
192
+
193
+ /** Sold with a subscription. */
194
+ const PREMIUM_COLOR_NAMES = exports.PREMIUM_COLOR_NAMES = namesGatedBy('premium');
135
195
  //# sourceMappingURL=color-presets.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["APP_COLOR_NAMES","exports","PREMIUM_COLOR_NAMES","HEX_TO_APP_COLOR","hexToAppColorName","hex","toLowerCase","APP_COLOR_PRESETS","teal","name","variant","blue","green","amber","yellow","red","purple","pink","sky","orange","mint","oxy","faircoin","mono"],"sourceRoot":"../../../src","sources":["theme/color-presets.ts"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["APP_COLOR_NAMES","exports","HEX_TO_APP_COLOR","hexToAppColorName","hex","toLowerCase","APP_COLOR_PRESETS","teal","name","variant","blue","green","yellow","red","purple","pink","sky","orange","mint","oxy","gate","faircoin","pumpkin","gray","brown","peach","rose","mono","namesGatedBy","filter","FREE_COLOR_NAMES","undefined","HANDLE_COLOR_NAMES","PREMIUM_COLOR_NAMES"],"sourceRoot":"../../../src","sources":["theme/color-presets.ts"],"mappings":"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","ignoreList":[]}
@@ -33,6 +33,18 @@ Object.defineProperty(exports, "BloomThemeProvider", {
33
33
  return _BloomThemeProvider.BloomThemeProvider;
34
34
  }
35
35
  });
36
+ Object.defineProperty(exports, "FREE_COLOR_NAMES", {
37
+ enumerable: true,
38
+ get: function () {
39
+ return _colorPresets.FREE_COLOR_NAMES;
40
+ }
41
+ });
42
+ Object.defineProperty(exports, "HANDLE_COLOR_NAMES", {
43
+ enumerable: true,
44
+ get: function () {
45
+ return _colorPresets.HANDLE_COLOR_NAMES;
46
+ }
47
+ });
36
48
  Object.defineProperty(exports, "HEX_TO_APP_COLOR", {
37
49
  enumerable: true,
38
50
  get: function () {
@@ -1 +1 @@
1
- {"version":3,"names":["_BloomThemeProvider","require","_colorScope","_seedScope","_seedScope2","_index","_buildTheme","_buildThemeFromSeed","_gradients","_useTheme","_ambientStore","_useNavigationTheme","_colorPresets","_colorUtils","_presetVars","_applyDarkClass","_setColorSchemeSafe","_initCssInterop","_persistence"],"sourceRoot":"../../../src","sources":["theme/index.ts"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,IAAAA,mBAAA,GAAAC,OAAA;AAKA,IAAAC,WAAA,GAAAD,OAAA;AAEA,IAAAE,UAAA,GAAAF,OAAA;AAEA,IAAAG,WAAA,GAAAH,OAAA;AAKA,IAAAI,MAAA,GAAAJ,OAAA;AAaA,IAAAK,WAAA,GAAAL,OAAA;AACA,IAAAM,mBAAA,GAAAN,OAAA;AAEA,IAAAO,UAAA,GAAAP,OAAA;AACA,IAAAQ,SAAA,GAAAR,OAAA;AACA,IAAAS,aAAA,GAAAT,OAAA;AAOA,IAAAU,mBAAA,GAAAV,OAAA;AAIA,IAAAW,aAAA,GAAAX,OAAA;AAOA,IAAAY,WAAA,GAAAZ,OAAA;AAEA,IAAAa,WAAA,GAAAb,OAAA;AAEA,IAAAc,eAAA,GAAAd,OAAA;AACA,IAAAe,mBAAA,GAAAf,OAAA;AACA,IAAAgB,eAAA,GAAAhB,OAAA;AAEA,IAAAiB,YAAA,GAAAjB,OAAA","ignoreList":[]}
1
+ {"version":3,"names":["_BloomThemeProvider","require","_colorScope","_seedScope","_seedScope2","_index","_buildTheme","_buildThemeFromSeed","_gradients","_useTheme","_ambientStore","_useNavigationTheme","_colorPresets","_colorUtils","_presetVars","_applyDarkClass","_setColorSchemeSafe","_initCssInterop","_persistence"],"sourceRoot":"../../../src","sources":["theme/index.ts"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,IAAAA,mBAAA,GAAAC,OAAA;AAKA,IAAAC,WAAA,GAAAD,OAAA;AAEA,IAAAE,UAAA,GAAAF,OAAA;AAEA,IAAAG,WAAA,GAAAH,OAAA;AAKA,IAAAI,MAAA,GAAAJ,OAAA;AAaA,IAAAK,WAAA,GAAAL,OAAA;AACA,IAAAM,mBAAA,GAAAN,OAAA;AAEA,IAAAO,UAAA,GAAAP,OAAA;AACA,IAAAQ,SAAA,GAAAR,OAAA;AACA,IAAAS,aAAA,GAAAT,OAAA;AAOA,IAAAU,mBAAA,GAAAV,OAAA;AAIA,IAAAW,aAAA,GAAAX,OAAA;AASA,IAAAY,WAAA,GAAAZ,OAAA;AAEA,IAAAa,WAAA,GAAAb,OAAA;AAEA,IAAAc,eAAA,GAAAd,OAAA;AACA,IAAAe,mBAAA,GAAAf,OAAA;AACA,IAAAgB,eAAA,GAAAhB,OAAA;AAEA,IAAAiB,YAAA,GAAAjB,OAAA","ignoreList":[]}
@@ -80,10 +80,31 @@ const foregroundFor = argb => contrastOf(argb, true) >= AA ? 'rgb(255 255 255)'
80
80
  const noLegibleForeground = argb => contrastOf(argb, true) < AA && contrastOf(argb, false) < AA;
81
81
 
82
82
  /** The tone a white-label fill sits at in LIGHT mode. */
83
- const LIGHT_FILL_TONE = 45;
83
+ const FILL_TONE_FLOOR = 45;
84
84
 
85
85
  /** The tone a white-label fill sits at in DARK: the ceiling white text allows. */
86
- const DARK_FILL_TONE = 49;
86
+ const FILL_TONE_SEARCH_CEILING = 56;
87
+
88
+ /**
89
+ * How much DEEPER the same brand sits on a light page than on a dark one.
90
+ *
91
+ * Not decoration: a colour on a near-white page has nothing to read against, so
92
+ * the mode difference is what makes a theme a theme rather than one palette shown
93
+ * twice. Dropping it is a regression that looks like a simplification — light and
94
+ * dark collapse onto the same fill for every seed that is not already bright, and
95
+ * the two modes stop being distinguishable at all.
96
+ */
97
+ const LIGHT_DEPTH_STEP = 5;
98
+
99
+ /**
100
+ * How deep a light-mode fill may go. Deliberately BELOW the search's lower bound,
101
+ * which those two used to share — and sharing them silently voided the depth step
102
+ * for any seed whose dark fill already sits at that bound. A high-chroma seed is
103
+ * exactly that case: pink loses its white label above tone 45, so dark cannot rise
104
+ * to make room and light must descend instead, or the two modes render the
105
+ * identical fill.
106
+ */
107
+ const LIGHT_FILL_FLOOR = 40;
87
108
 
88
109
  /** How far a fill may be dragged from its natural tone before the colour is lost. */
89
110
  const TONE_BUDGET = 25;
@@ -224,6 +245,47 @@ function vividHueNear(hue) {
224
245
  return bestChroma - baseChroma >= VIVID_SNAP_MIN_GAIN ? bestHue : hue;
225
246
  }
226
247
 
248
+ /**
249
+ * The most vivid tone a palette reaches while a WHITE label still clears AA on
250
+ * it — searched per HUE instead of assumed.
251
+ *
252
+ * A single tone for every hue leaves chroma on the table for some and takes it
253
+ * from others, because the sRGB gamut is not a cylinder: from tone 45 upward an
254
+ * orange keeps gaining chroma until white runs out at ~49.5 (59 -> 84), while a
255
+ * violet has already passed its peak and LOSES chroma over the same interval
256
+ * (91 -> 86). The old flat 45 spent none of the contrast headroom it had — every
257
+ * preset sat at 5.38 when 4.5 was the requirement — and orange paid for that
258
+ * twice, since its hue is also one of the gamut's narrow ones.
259
+ *
260
+ * The floor is what keeps this from trading lightness for chroma: a hue that
261
+ * peaks far below 45 stays at 45 rather than descending into a near-black slab
262
+ * that happens to be saturated. So the search can only ever improve a fill or
263
+ * leave it exactly where it was.
264
+ *
265
+ * Contrast is measured on the QUANTIZED colour, not the engine's continuous
266
+ * tone-ratio: an earlier iteration chose tones by the latter and shipped 135
267
+ * pairs at a measured 4.49.
268
+ */
269
+ function vividLegibleTone(palette) {
270
+ let bestTone = FILL_TONE_FLOOR;
271
+ let bestChroma = -1;
272
+ for (let tone = FILL_TONE_FLOOR; tone <= FILL_TONE_SEARCH_CEILING; tone += 0.5) {
273
+ const argb = palette.tone(tone);
274
+ if (contrastOf(argb, true) < AA) continue;
275
+ const chroma = Hct.fromInt(argb).chroma;
276
+ // A tie keeps the DEEPEST tone. Ties are common rather than exotic — any seed
277
+ // whose chroma sits below the gamut ceiling across this whole range has a flat
278
+ // curve here — and breaking them toward the lightest end instead changes no
279
+ // preset's output, because the light-mode floor below already supplies the
280
+ // separation that would have bought. Mutation-checked, not assumed.
281
+ if (chroma > bestChroma) {
282
+ bestChroma = chroma;
283
+ bestTone = tone;
284
+ }
285
+ }
286
+ return bestTone;
287
+ }
288
+
227
289
  /**
228
290
  * The tone a BRAND fill sits at.
229
291
  *
@@ -242,11 +304,11 @@ function whiteLabelTone(palette, seedTone, isDark) {
242
304
  // smear there, indistinguishable from the same colour in dark, which is not a
243
305
  // theme at all. Coming down is what makes faircoin a deep green in light and a
244
306
  // bright lime in dark.
245
- if (!isDark) return LIGHT_FILL_TONE;
307
+ if (!isDark) return Math.max(LIGHT_FILL_FLOOR, vividLegibleTone(palette) - LIGHT_DEPTH_STEP);
246
308
  // DARK: the budget applies. Most brands come down to where white fits, but a
247
309
  // seed that is already light cannot without ceasing to be itself, so it keeps
248
310
  // its own tone and takes a black label. That is the eleven-and-two pattern.
249
- const candidate = Math.max(DARK_FILL_TONE, seedTone - TONE_BUDGET);
311
+ const candidate = Math.max(vividLegibleTone(palette), seedTone - TONE_BUDGET);
250
312
  return contrastOf(palette.tone(candidate), true) >= AA ? candidate : Math.max(seedTone, DARK_SEED_FLOOR);
251
313
  }
252
314
 
@@ -257,10 +319,10 @@ function whiteLabelTone(palette, seedTone, isDark) {
257
319
  * peaks dark comes down and carries white.
258
320
  */
259
321
  function accentTone(hue, isDark) {
260
- if (!isDark) return LIGHT_FILL_TONE;
261
- const peak = Math.max(peakTone(hue), DARK_ACCENT_FLOOR);
262
322
  const palette = TonalPalette.fromHueAndChroma(hue, ACCENT_CHROMA);
263
- const candidate = Math.max(DARK_FILL_TONE, peak - TONE_BUDGET);
323
+ if (!isDark) return Math.max(LIGHT_FILL_FLOOR, vividLegibleTone(palette) - LIGHT_DEPTH_STEP);
324
+ const peak = Math.max(peakTone(hue), DARK_ACCENT_FLOOR);
325
+ const candidate = Math.max(vividLegibleTone(palette), peak - TONE_BUDGET);
264
326
  return contrastOf(palette.tone(candidate), true) >= AA ? candidate : peak;
265
327
  }
266
328
 
@@ -327,13 +389,17 @@ export function buildPolicyTokens(seedHex, isDark, roles, pinned = {}) {
327
389
  // dark fill sit at the seed's own tone instead makes it brighter, but every one
328
390
  // of those labels turns black, which costs more than the brightness buys.
329
391
  const monochrome = seed.chroma <= MONOCHROME_MAX_CHROMA;
330
- // DARK keys off the seed itself so the fill IS the brand hex; LIGHT uses the
331
- // max-chroma palette, which is what stops a deepened fill from going pastel.
392
+ // BOTH modes key off the seed itself, so the fill carries the brand's SATURATION
393
+ // as well as its hue. Light used to force the hue to maximum chroma, which reads
394
+ // as "the seed only chose a hue" — and that silently renames a colour: a muted
395
+ // blue-grey seed resolved to a vivid cyan, and a brown seed to an orange, since
396
+ // both differ from a saturated neighbour by chroma alone. A deliberately soft
397
+ // brand now stays soft instead of being argued with.
332
398
  // A monochrome seed has no chroma to preserve either way, and its fill goes to
333
399
  // the far end of the scale rather than the white-label ceiling: a mid-grey
334
400
  // button reads as disabled, where near-black on white reads as the primary
335
401
  // action.
336
- const brandPalette = monochrome ? TonalPalette.fromHueAndChroma(0, 0) : isDark ? TonalPalette.fromInt(argbFromHex(seedHex)) : TonalPalette.fromHueAndChroma(seed.hue, 200);
402
+ const brandPalette = monochrome ? TonalPalette.fromHueAndChroma(0, 0) : TonalPalette.fromInt(argbFromHex(seedHex));
337
403
  const primary = fillPair(brandPalette, monochrome ? isDark ? MONOCHROME_FILL_TONE.dark : MONOCHROME_FILL_TONE.light : whiteLabelTone(brandPalette, seed.tone, isDark));
338
404
  const tokens = {
339
405
  '--primary': primary.fill,
@@ -410,7 +476,7 @@ export function buildPolicyTokens(seedHex, isDark, roles, pinned = {}) {
410
476
  for (const [role, hex] of Object.entries(STATUS_SEEDS)) {
411
477
  const status = Hct.fromInt(argbFromHex(hex));
412
478
  const palette = TonalPalette.fromHueAndChroma(status.hue, status.chroma);
413
- const pair = fillPair(palette, isDark ? DARK_FILL_TONE : LIGHT_FILL_TONE);
479
+ const pair = fillPair(palette, isDark ? vividLegibleTone(palette) : Math.max(LIGHT_FILL_FLOOR, vividLegibleTone(palette) - LIGHT_DEPTH_STEP));
414
480
  tokens[`--${role}`] = pair.fill;
415
481
  tokens[`--${role}-foreground`] = pair.foreground;
416
482
  tokens[`--${role}-text`] = rgb(TonalPalette.fromHueAndChroma(status.hue, TEXT_CHROMA).tone(isDark ? TEXT_TONE.dark : TEXT_TONE.light));