@evolve.ui/theme-system 1.1.0 → 1.2.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 (99) hide show
  1. package/{allThemes-CFS_9-tk.cjs → allThemes-3d8nhymo.cjs} +12 -2
  2. package/allThemes-3d8nhymo.cjs.map +1 -0
  3. package/{allThemes-OV-ayn4C.mjs → allThemes-Abn6KDm7.mjs} +7 -3
  4. package/allThemes-Abn6KDm7.mjs.map +1 -0
  5. package/allThemes.cjs +1 -1
  6. package/allThemes.d.cts +1 -0
  7. package/allThemes.d.cts.map +1 -1
  8. package/allThemes.d.mts +1 -0
  9. package/allThemes.d.mts.map +1 -1
  10. package/allThemes.mjs +1 -1
  11. package/brands-CE0wIkKX.d.cts +58 -0
  12. package/brands-CE0wIkKX.d.cts.map +1 -0
  13. package/brands-CE0wIkKX.d.mts +58 -0
  14. package/brands-CE0wIkKX.d.mts.map +1 -0
  15. package/brands.cjs +16 -13
  16. package/brands.cjs.map +1 -1
  17. package/brands.d.cts +2 -2
  18. package/brands.d.mts +2 -2
  19. package/brands.mjs +16 -13
  20. package/brands.mjs.map +1 -1
  21. package/css/EverydayHarbor.css +377 -0
  22. package/css/EverydayHarbor.effects.css +650 -0
  23. package/{default-b-tgfyxR.cjs → default-B6VWF0Js.cjs} +237 -36
  24. package/default-B6VWF0Js.cjs.map +1 -0
  25. package/{default-B2n4PnsJ.mjs → default-BogJDhKE.mjs} +238 -37
  26. package/default-BogJDhKE.mjs.map +1 -0
  27. package/effects.cjs +26 -0
  28. package/effects.cjs.map +1 -0
  29. package/effects.d.cts +22 -0
  30. package/effects.d.cts.map +1 -0
  31. package/effects.d.mts +22 -0
  32. package/effects.d.mts.map +1 -0
  33. package/effects.mjs +22 -0
  34. package/effects.mjs.map +1 -0
  35. package/evolve-ui.entries.json +5 -0
  36. package/index.cjs +12 -5
  37. package/index.cjs.map +1 -1
  38. package/index.d.cts +108 -4
  39. package/index.d.cts.map +1 -1
  40. package/index.d.mts +108 -4
  41. package/index.d.mts.map +1 -1
  42. package/index.mjs +9 -6
  43. package/index.mjs.map +1 -1
  44. package/package.json +5 -1
  45. package/{plugin-DPtvp4lp.cjs → plugin-B3PF4RMI.cjs} +299 -110
  46. package/plugin-B3PF4RMI.cjs.map +1 -0
  47. package/{plugin-D4eCyUJe.mjs → plugin-D6aLCeNB.mjs} +258 -111
  48. package/plugin-D6aLCeNB.mjs.map +1 -0
  49. package/src/effects/__fixtures__/fixtureLayer.ts +88 -0
  50. package/src/effects/brands/EverydayHarbor.ts +392 -0
  51. package/src/effects/classes.ts +19 -0
  52. package/src/effects/emit.ts +314 -0
  53. package/src/effects/hooks.ts +493 -0
  54. package/src/effects/index.ts +2 -0
  55. package/src/effects/layers.ts +18 -0
  56. package/src/effects/rules.ts +90 -0
  57. package/src/effects/rules.typecheck.ts +50 -0
  58. package/src/effects/tokens.ts +148 -0
  59. package/src/effects/validate.ts +683 -0
  60. package/src/effects/vocabulary.ts +32 -0
  61. package/src/index.ts +3 -0
  62. package/src/tailwind/animation.ts +30 -0
  63. package/src/tailwind/borderWidth.ts +14 -0
  64. package/src/tailwind/plugin.ts +230 -239
  65. package/src/tailwind/reducedMotion.ts +164 -0
  66. package/src/tailwind/text.ts +4 -2
  67. package/src/themeValues.snapshot.ts +6735 -0
  68. package/src/themes/EverydayHarbor.ts +147 -0
  69. package/src/themes/allThemes.ts +2 -0
  70. package/src/themes/brandSources.ts +37 -0
  71. package/src/themes/brands.ts +41 -15
  72. package/src/themes/contrastFloors.ts +26 -0
  73. package/src/themes/inkRamps.ts +43 -0
  74. package/src/themes/runtime/buildTheme.ts +6 -19
  75. package/src/themes/runtime/everydayHarbor.ts +3 -0
  76. package/src/themes/semanticColorTokenSteps.ts +5 -2
  77. package/src/themes/themeValues.ts +374 -0
  78. package/src/themes/wcag.ts +48 -0
  79. package/tailwind/plugin.cjs +5 -1
  80. package/tailwind/plugin.d.cts +458 -1
  81. package/tailwind/plugin.d.cts.map +1 -1
  82. package/tailwind/plugin.d.mts +458 -1
  83. package/tailwind/plugin.d.mts.map +1 -1
  84. package/tailwind/plugin.mjs +2 -2
  85. package/themes/runtime/default.cjs +1 -1
  86. package/themes/runtime/default.mjs +1 -1
  87. package/themes/themeType.d.cts +1 -1
  88. package/themes/themeType.d.mts +1 -1
  89. package/allThemes-CFS_9-tk.cjs.map +0 -1
  90. package/allThemes-OV-ayn4C.mjs.map +0 -1
  91. package/brands-n30rolHQ.d.cts +0 -33
  92. package/brands-n30rolHQ.d.cts.map +0 -1
  93. package/brands-n30rolHQ.d.mts +0 -33
  94. package/brands-n30rolHQ.d.mts.map +0 -1
  95. package/default-B2n4PnsJ.mjs.map +0 -1
  96. package/default-b-tgfyxR.cjs.map +0 -1
  97. package/plugin-D4eCyUJe.mjs.map +0 -1
  98. package/plugin-DPtvp4lp.cjs.map +0 -1
  99. package/src/themes/generate.ts +0 -46
@@ -2,6 +2,52 @@ const require_fontFamily = require("./fontFamily-BBoee6cS.cjs");
2
2
  const require_spacing = require("./spacing-B2mhXYOl.cjs");
3
3
  let tailwindcss_plugin_js = require("tailwindcss/plugin.js");
4
4
  tailwindcss_plugin_js = require_fontFamily.__toESM(tailwindcss_plugin_js);
5
+ //#region src/tailwind/animation.ts
6
+ /**
7
+ * Animation registry for the theme system
8
+ *
9
+ * The `animate-*` utilities this library registers, extracted from `plugin.ts` so the
10
+ * reduced-motion policy can be checked against them (see `./reducedMotion`). These sit under
11
+ * `theme.extend`, so Tailwind's own defaults (`spin`, `ping`, `pulse`, `bounce`, `none`) survive
12
+ * alongside them — the resolved registry is this object layered over `defaultTheme.animation`,
13
+ * and the policy must cover both.
14
+ *
15
+ * Keyframes stay in `plugin.ts` next to the `addBase` block that emits some of them.
16
+ */
17
+ const animation = {
18
+ fadeIn: "fadeIn .2s ease-in-out",
19
+ fadeInOpacity: "fadeInOpacity 0.5s ease-in-out",
20
+ fadeInScaled: "fadeInScaled .2s ease-in",
21
+ fadeOut: "fadeOut .2s ease-in-out",
22
+ loading: "loading 1.4s infinite ease-in-out",
23
+ "progress-completion": "shrink 0.15s ease-in-out both, grow 0.15s ease-in-out 0.15s both",
24
+ "progress-icon-fade-in": "fadeInOpacity 0.15s ease-in-out 0.15s both",
25
+ "progress-wave": "progressWave 1333ms cubic-bezier(0.4, 0, 0.2, 1) infinite both, progressWaveRotate 1568ms linear infinite both",
26
+ saveButtonPulse: "saveButtonPulse 500ms cubic-bezier(0.34, 1.56, 0.64, 1)",
27
+ saveButtonWiggle: "saveButtonWiggle 500ms ease-in-out",
28
+ saveHeartColorFlash: "saveHeartColorFlash 500ms cubic-bezier(0.45, 0, 0.55, 1)",
29
+ saveHeartPop: "saveHeartPop 480ms cubic-bezier(0.34, 1.56, 0.64, 1)",
30
+ saveHeartTwirlBloom: "saveHeartTwirlBloom 500ms cubic-bezier(0.45, 0, 0.55, 1)",
31
+ saveLabelShimmer: "saveLabelShimmer 500ms ease-in-out",
32
+ slideDown: "slideDown 0.3s ease-in forwards",
33
+ slideUp: "slideUp 0.3s ease-out forwards"
34
+ };
35
+ //#endregion
36
+ //#region src/tailwind/borderWidth.ts
37
+ /**
38
+ * Border width scale the theme ships.
39
+ *
40
+ * These match the widths Tailwind uses when a plugin does not replace `borderWidth`.
41
+ * They sit on the theme object so the value snapshot locks the same scale.
42
+ */
43
+ const borderWidth = {
44
+ DEFAULT: "1px",
45
+ 0: "0px",
46
+ 2: "2px",
47
+ 4: "4px",
48
+ 8: "8px"
49
+ };
50
+ //#endregion
5
51
  //#region src/tailwind/colors.ts
6
52
  /**
7
53
  * Color configuration for Tailwind CSS
@@ -191,6 +237,120 @@ const colors = {
191
237
  }
192
238
  };
193
239
  //#endregion
240
+ //#region src/tailwind/reducedMotion.ts
241
+ const REDUCED_MOTION_POLICY = {
242
+ fadeIn: {
243
+ reason: "Opacity only, but collapsed alongside fadeInScaled so a modal opens the same way in both variants (ComposableModal picks between them on hasContentPager).",
244
+ tier: "instant"
245
+ },
246
+ fadeInOpacity: {
247
+ reason: "Opacity and visibility only; collapsing a fade is not a motion regression.",
248
+ tier: "instant"
249
+ },
250
+ fadeInScaled: {
251
+ reason: "Scales 0.7 to 1.",
252
+ tier: "instant"
253
+ },
254
+ fadeOut: {
255
+ reason: "Scales 1 to 0.7. Modal close depends on its animationend, so it is collapsed rather than removed.",
256
+ tier: "instant"
257
+ },
258
+ loading: {
259
+ reason: "Infinite indeterminate loading indicator (LoadingDot). Collapsing it removes the only signal that work is in progress.",
260
+ tier: "retain"
261
+ },
262
+ "progress-completion": {
263
+ reason: "Scales. Zeroing the delay matters here: the composite is \"shrink 0.15s both, grow 0.15s ease-in-out 0.15s both\", so a duration-only collapse would hold the ring at scale(0.5) for 150ms and then snap.",
264
+ tier: "instant"
265
+ },
266
+ "progress-icon-fade-in": {
267
+ reason: "Opacity only, but its 0.15s delay sequences it after progress-completion. Retaining it would leave a completed ProgressCircle ring with an empty centre for 150ms.",
268
+ tier: "instant"
269
+ },
270
+ "progress-wave": {
271
+ reason: "Infinite indeterminate progress indicator (ProgressCircle). Same essential-feedback rationale as loading.",
272
+ tier: "retain"
273
+ },
274
+ saveButtonPulse: {
275
+ reason: "Scales.",
276
+ tier: "instant"
277
+ },
278
+ saveButtonWiggle: {
279
+ reason: "Rotates and scales.",
280
+ tier: "instant"
281
+ },
282
+ saveHeartColorFlash: {
283
+ reason: "Animates fill only, but it was already gated before DS-95 and must stay gated. Shipped via .hui-fb-color-flash, not the animate-* utility (which has no call sites), so it needs the explicit selector below.",
284
+ selectors: [".hui-fb-color-flash .hui-fb-icon-frame svg path"],
285
+ tier: "instant"
286
+ },
287
+ saveHeartPop: {
288
+ reason: "Scales.",
289
+ tier: "instant"
290
+ },
291
+ saveHeartTwirlBloom: {
292
+ reason: "Rotates 180 degrees at 1.15x scale.",
293
+ tier: "instant"
294
+ },
295
+ saveLabelShimmer: {
296
+ reason: "Animates background-position. The .hui-fb-shimmer paint block in plugin.ts separately drops the gradient under reduce so the label stays legible.",
297
+ tier: "instant"
298
+ },
299
+ slideDown: {
300
+ reason: "Translates on Y. Collapsed rather than removed so CookieConsent still receives animationend.",
301
+ tier: "instant"
302
+ },
303
+ slideUp: {
304
+ reason: "Translates on Y. Same animationend rationale as slideDown.",
305
+ tier: "instant"
306
+ },
307
+ bounce: {
308
+ reason: "Translates on Y.",
309
+ tier: "instant"
310
+ },
311
+ none: {
312
+ reason: "Not an animation — animate-none is the absence utility.",
313
+ tier: "n/a"
314
+ },
315
+ ping: {
316
+ reason: "Scales and fades. No in-repo call site, but consumers can use it.",
317
+ tier: "instant"
318
+ },
319
+ pulse: {
320
+ reason: "Infinite, but opacity only — the conventional skeleton-loading indicator. Retained as essential feedback with no motion component.",
321
+ tier: "retain"
322
+ },
323
+ spin: {
324
+ reason: "Infinite indeterminate spinner (LoadingSpinner, ProgressCircle). A Tailwind default rather than a local entry, which is exactly why the policy is keyed on the resolved registry.",
325
+ tier: "retain"
326
+ }
327
+ };
328
+ const REDUCE_QUERY = "@media (prefers-reduced-motion: reduce)";
329
+ const COLLAPSED_DECLARATIONS = {
330
+ "animation-delay": "0ms !important",
331
+ "animation-duration": "1ms !important",
332
+ "animation-iteration-count": "1 !important"
333
+ };
334
+ /**
335
+ * Builds the `@media (prefers-reduced-motion: reduce)` block for `addBase`.
336
+ *
337
+ * Emitted from `addBase` rather than `addComponents` deliberately: `addComponents` is subject to
338
+ * caching discrepancies in this monorepo's Storybook build that stop newly added rules landing.
339
+ */
340
+ const buildReducedMotionBase = () => {
341
+ const rules = {};
342
+ const addRule = (selector) => {
343
+ if (rules[selector]) throw new Error(`Duplicate reduced-motion selector: ${selector}`);
344
+ rules[selector] = { ...COLLAPSED_DECLARATIONS };
345
+ };
346
+ Object.entries(REDUCED_MOTION_POLICY).forEach(([key, entry]) => {
347
+ if (entry.tier !== "instant") return;
348
+ addRule(`.animate-${key}.animate-${key}`);
349
+ entry.selectors?.forEach(addRule);
350
+ });
351
+ return { [REDUCE_QUERY]: rules };
352
+ };
353
+ //#endregion
194
354
  //#region src/tailwind/text.ts
195
355
  const textComponents = {
196
356
  ".hui-link-md": {
@@ -266,9 +426,9 @@ const textComponents = {
266
426
  letterSpacing: require_spacing.wrapVar(require_spacing.letterSpacingH3),
267
427
  lineHeight: "30px",
268
428
  [`@media (width < ${require_spacing.screens.smMax.max})`]: {
269
- fontSize: "16px",
429
+ fontSize: "18px",
270
430
  letterSpacing: require_spacing.wrapVar(require_spacing.letterSpacingH3Mobile),
271
- lineHeight: "24px"
431
+ lineHeight: "27px"
272
432
  }
273
433
  },
274
434
  ".hui-text-h4": {
@@ -345,109 +505,13 @@ const autofillStyles = {
345
505
  "-webkit-box-shadow": "0 0 0 12px rgb(var(--color-background-primary)) inset !important",
346
506
  "box-shadow": "0 0 0 12px rgb(var(--color-background-primary)) inset !important"
347
507
  };
348
- const themePlugin = (0, tailwindcss_plugin_js.default)(({ addBase, addComponents, matchUtilities }) => {
349
- addComponents(textComponents);
350
- addComponents({
351
- ".hui-autofill-transparent": {
352
- "&:-webkit-autofill": autofillStyles,
353
- "&:-webkit-autofill:active": autofillStyles,
354
- "&:-webkit-autofill:focus": autofillStyles,
355
- "&:-webkit-autofill:hover": autofillStyles
356
- },
357
- ".hui-focus-visible-outline": { "@apply focus-visible:outline-focus-primary focus-visible:outline focus-visible:outline-4": {} },
358
- ".hui-focus-visible-outline-inverse": { "@apply focus-visible:outline-focus-inverse focus-visible:outline focus-visible:outline-4": {} },
359
- ".scrollbar-default": {
360
- "&::-webkit-scrollbar": { display: "block" },
361
- "-ms-overflow-style": "auto",
362
- "scrollbar-width": "auto"
363
- },
364
- ".scrollbar-hide": {
365
- "&::-webkit-scrollbar": { display: "none" },
366
- "-ms-overflow-style": "none",
367
- "scrollbar-width": "none"
368
- }
369
- });
370
- addBase({
371
- "@keyframes saveButtonWiggle": {
372
- "0%, 100%": { transform: "rotate(0deg) scale(1)" },
373
- "10%": { transform: "rotate(-6deg) scale(1.03)" },
374
- "25%": { transform: "rotate(5deg) scale(1.03)" },
375
- "40%": { transform: "rotate(-4deg) scale(1.02)" },
376
- "55%": { transform: "rotate(3deg) scale(1.02)" },
377
- "70%": { transform: "rotate(-1.5deg) scale(1.01)" },
378
- "85%": { transform: "rotate(0.5deg) scale(1)" }
379
- },
380
- "@keyframes saveHeartTwirlBloom": {
381
- "0%": { transform: "rotateY(0deg) scale(1)" },
382
- "50%": { transform: "rotateY(180deg) scale(1.35)" },
383
- "100%": { transform: "rotateY(360deg) scale(1)" }
384
- },
385
- "@keyframes saveHeartColorFlash": {
386
- "0%": { fill: "rgb(var(--hui-save-color-critical-500, var(--color-critical-500)))" },
387
- "40%": { fill: "rgb(var(--hui-save-color-critical-300, var(--color-critical-300)))" },
388
- "60%": { fill: "rgb(var(--hui-save-color-critical-500, var(--color-critical-500)))" },
389
- "100%": { fill: "rgb(var(--hui-save-color-critical-500, var(--color-critical-500)))" }
390
- },
391
- "@keyframes saveLabelShimmer": {
392
- "0%": { backgroundPosition: "200% center" },
393
- "100%": { backgroundPosition: "-200% center" }
394
- },
395
- "@keyframes saveButtonPulse": {
396
- "0%": { transform: "scale(1)" },
397
- "35%": { transform: "scale(1.08)" },
398
- "65%": { transform: "scale(0.97)" },
399
- "100%": { transform: "scale(1)" }
400
- },
401
- "@keyframes saveHeartPop": {
402
- "0%": { transform: "scale(1)" },
403
- "20%": { transform: "scale(0.6)" },
404
- "60%": { transform: "scale(1.35)" },
405
- "100%": { transform: "scale(1)" }
406
- },
407
- ".hui-fb-shimmer": {
408
- lineHeight: "normal",
409
- backgroundImage: "linear-gradient(90deg, currentColor 0%, currentColor 20%, rgb(var(--hui-save-color-critical-200, var(--color-critical-200))) 33%, rgb(var(--hui-save-color-critical-500, var(--color-critical-500))) 50%, rgb(var(--hui-save-color-tertiary-400, var(--color-tertiary-400))) 67%, currentColor 80%, currentColor 100%)",
410
- backgroundSize: "200% 100%",
411
- backgroundClip: "text",
412
- "-webkit-background-clip": "text",
413
- "-webkit-text-fill-color": "transparent",
414
- "@media (prefers-reduced-motion: reduce)": {
415
- backgroundImage: "none !important",
416
- "-webkit-text-fill-color": "currentColor !important"
417
- }
418
- },
419
- ".hui-fb-color-flash .hui-fb-icon-frame svg path": {
420
- animation: "saveHeartColorFlash 1100ms cubic-bezier(0.45, 0, 0.55, 1) 1",
421
- animationFillMode: "forwards"
422
- },
423
- "@media (prefers-reduced-motion: reduce)": { ".hui-fb-color-flash .hui-fb-icon-frame svg path": { animation: "none !important" } }
424
- });
425
- matchUtilities({ "grid-area": (value) => {
426
- return { "grid-area": value };
427
- } });
428
- }, { theme: {
508
+ const tailwindTheme = {
429
509
  borderRadius: require_spacing.borderRadius,
510
+ borderWidth,
430
511
  boxShadow: require_fontFamily.boxShadow,
431
512
  colors,
432
513
  extend: {
433
- animation: {
434
- fadeIn: "fadeIn .2s ease-in-out",
435
- fadeInOpacity: "fadeInOpacity 0.5s ease-in-out",
436
- fadeInScaled: "fadeInScaled .2s ease-in",
437
- fadeOut: "fadeOut .2s ease-in-out",
438
- loading: "loading 1.4s infinite ease-in-out",
439
- "progress-completion": "shrink 0.15s ease-in-out both, grow 0.15s ease-in-out 0.15s both",
440
- "progress-icon-fade-in": "fadeInOpacity 0.15s ease-in-out 0.15s both",
441
- "progress-wave": "progressWave 1333ms cubic-bezier(0.4, 0, 0.2, 1) infinite both, progressWaveRotate 1568ms linear infinite both",
442
- saveButtonPulse: "saveButtonPulse 500ms cubic-bezier(0.34, 1.56, 0.64, 1)",
443
- saveButtonWiggle: "saveButtonWiggle 1.3s cubic-bezier(0.36, 0, 0.66, -0.56)",
444
- saveHeartColorFlash: "saveHeartColorFlash 1100ms cubic-bezier(0.45, 0, 0.55, 1)",
445
- saveHeartPop: "saveHeartPop 480ms cubic-bezier(0.34, 1.56, 0.64, 1)",
446
- saveHeartTwirlBloom: "saveHeartTwirlBloom 1100ms cubic-bezier(0.45, 0, 0.55, 1)",
447
- saveLabelShimmer: "saveLabelShimmer 1100ms ease-in-out",
448
- slideDown: "slideDown 0.3s ease-in forwards",
449
- slideUp: "slideUp 0.3s ease-out forwards"
450
- },
514
+ animation,
451
515
  keyframes: {
452
516
  fadeIn: {
453
517
  from: { opacity: "0" },
@@ -517,11 +581,11 @@ const themePlugin = (0, tailwindcss_plugin_js.default)(({ addBase, addComponents
517
581
  },
518
582
  saveButtonWiggle: {
519
583
  "0%, 100%": { transform: "rotate(0deg) scale(1)" },
520
- "10%": { transform: "rotate(-6deg) scale(1.03)" },
521
- "25%": { transform: "rotate(5deg) scale(1.03)" },
522
- "40%": { transform: "rotate(-4deg) scale(1.02)" },
523
- "55%": { transform: "rotate(3deg) scale(1.02)" },
524
- "70%": { transform: "rotate(-1.5deg) scale(1.01)" },
584
+ "10%": { transform: "rotate(-4deg) scale(1.02)" },
585
+ "25%": { transform: "rotate(3.5deg) scale(1.02)" },
586
+ "40%": { transform: "rotate(-2.5deg) scale(1.015)" },
587
+ "55%": { transform: "rotate(2deg) scale(1.015)" },
588
+ "70%": { transform: "rotate(-1deg) scale(1.01)" },
525
589
  "85%": { transform: "rotate(0.5deg) scale(1)" }
526
590
  },
527
591
  saveHeartColorFlash: {
@@ -538,8 +602,8 @@ const themePlugin = (0, tailwindcss_plugin_js.default)(({ addBase, addComponents
538
602
  },
539
603
  saveHeartTwirlBloom: {
540
604
  "0%": { transform: "rotateY(0deg) scale(1)" },
541
- "50%": { transform: "rotateY(180deg) scale(1.35)" },
542
- "100%": { transform: "rotateY(360deg) scale(1)" }
605
+ "30%": { transform: "rotateY(54deg) scale(1.15)" },
606
+ "100%": { transform: "rotateY(180deg) scale(1)" }
543
607
  },
544
608
  saveLabelShimmer: {
545
609
  "0%": { backgroundPosition: "200% center" },
@@ -577,14 +641,139 @@ const themePlugin = (0, tailwindcss_plugin_js.default)(({ addBase, addComponents
577
641
  },
578
642
  fontFamily: require_fontFamily.fontFamily,
579
643
  screens: require_spacing.screens
580
- } });
644
+ };
645
+ const pluginComponentStyles = {
646
+ ".hui-autofill-transparent": {
647
+ "&:-webkit-autofill": autofillStyles,
648
+ "&:-webkit-autofill:active": autofillStyles,
649
+ "&:-webkit-autofill:focus": autofillStyles,
650
+ "&:-webkit-autofill:hover": autofillStyles
651
+ },
652
+ ".hui-focus-visible-outline": { "@apply focus-visible:outline-focus-primary focus-visible:outline focus-visible:outline-4": {} },
653
+ ".hui-focus-visible-outline-inverse": { "@apply focus-visible:outline-focus-inverse focus-visible:outline focus-visible:outline-4": {} },
654
+ ".scrollbar-default": {
655
+ "&::-webkit-scrollbar": { display: "block" },
656
+ "-ms-overflow-style": "auto",
657
+ "scrollbar-width": "auto"
658
+ },
659
+ ".scrollbar-hide": {
660
+ "&::-webkit-scrollbar": { display: "none" },
661
+ "-ms-overflow-style": "none",
662
+ "scrollbar-width": "none"
663
+ }
664
+ };
665
+ const pluginBaseStyles = {
666
+ "@keyframes saveButtonWiggle": {
667
+ "0%, 100%": { transform: "rotate(0deg) scale(1)" },
668
+ "10%": { transform: "rotate(-4deg) scale(1.02)" },
669
+ "25%": { transform: "rotate(3.5deg) scale(1.02)" },
670
+ "40%": { transform: "rotate(-2.5deg) scale(1.015)" },
671
+ "55%": { transform: "rotate(2deg) scale(1.015)" },
672
+ "70%": { transform: "rotate(-1deg) scale(1.01)" },
673
+ "85%": { transform: "rotate(0.5deg) scale(1)" }
674
+ },
675
+ "@keyframes saveHeartTwirlBloom": {
676
+ "0%": { transform: "rotateY(0deg) scale(1)" },
677
+ "30%": { transform: "rotateY(54deg) scale(1.15)" },
678
+ "100%": { transform: "rotateY(180deg) scale(1)" }
679
+ },
680
+ "@keyframes saveHeartColorFlash": {
681
+ "0%": { fill: "rgb(var(--hui-save-color-critical-500, var(--color-critical-500)))" },
682
+ "40%": { fill: "rgb(var(--hui-save-color-critical-300, var(--color-critical-300)))" },
683
+ "60%": { fill: "rgb(var(--hui-save-color-critical-500, var(--color-critical-500)))" },
684
+ "100%": { fill: "rgb(var(--hui-save-color-critical-500, var(--color-critical-500)))" }
685
+ },
686
+ "@keyframes saveLabelShimmer": {
687
+ "0%": { backgroundPosition: "200% center" },
688
+ "100%": { backgroundPosition: "-200% center" }
689
+ },
690
+ "@keyframes saveButtonPulse": {
691
+ "0%": { transform: "scale(1)" },
692
+ "35%": { transform: "scale(1.08)" },
693
+ "65%": { transform: "scale(0.97)" },
694
+ "100%": { transform: "scale(1)" }
695
+ },
696
+ "@keyframes saveHeartPop": {
697
+ "0%": { transform: "scale(1)" },
698
+ "20%": { transform: "scale(0.6)" },
699
+ "60%": { transform: "scale(1.35)" },
700
+ "100%": { transform: "scale(1)" }
701
+ },
702
+ ".hui-fb-shimmer": {
703
+ lineHeight: "normal",
704
+ backgroundImage: "linear-gradient(90deg, currentColor 0%, currentColor 20%, rgb(var(--hui-save-color-critical-200, var(--color-critical-200))) 33%, rgb(var(--hui-save-color-critical-500, var(--color-critical-500))) 50%, rgb(var(--hui-save-color-tertiary-400, var(--color-tertiary-400))) 67%, currentColor 80%, currentColor 100%)",
705
+ backgroundSize: "200% 100%",
706
+ backgroundClip: "text",
707
+ "-webkit-background-clip": "text",
708
+ "-webkit-text-fill-color": "transparent",
709
+ "@media (prefers-reduced-motion: reduce)": {
710
+ backgroundImage: "none !important",
711
+ "-webkit-text-fill-color": "currentColor !important"
712
+ }
713
+ },
714
+ ".hui-fb-color-flash .hui-fb-icon-frame svg path": {
715
+ animation: "saveHeartColorFlash 500ms cubic-bezier(0.45, 0, 0.55, 1) 1",
716
+ animationFillMode: "forwards"
717
+ },
718
+ ...buildReducedMotionBase()
719
+ };
720
+ const themePlugin = (0, tailwindcss_plugin_js.default)(({ addBase, addComponents, matchUtilities }) => {
721
+ addComponents(textComponents);
722
+ addComponents(pluginComponentStyles);
723
+ addBase(pluginBaseStyles);
724
+ matchUtilities({ "grid-area": (value) => {
725
+ return { "grid-area": value };
726
+ } });
727
+ }, { theme: tailwindTheme });
581
728
  //#endregion
729
+ Object.defineProperty(exports, "REDUCED_MOTION_POLICY", {
730
+ enumerable: true,
731
+ get: function() {
732
+ return REDUCED_MOTION_POLICY;
733
+ }
734
+ });
735
+ Object.defineProperty(exports, "animation", {
736
+ enumerable: true,
737
+ get: function() {
738
+ return animation;
739
+ }
740
+ });
741
+ Object.defineProperty(exports, "autofillStyles", {
742
+ enumerable: true,
743
+ get: function() {
744
+ return autofillStyles;
745
+ }
746
+ });
747
+ Object.defineProperty(exports, "buildReducedMotionBase", {
748
+ enumerable: true,
749
+ get: function() {
750
+ return buildReducedMotionBase;
751
+ }
752
+ });
582
753
  Object.defineProperty(exports, "colors", {
583
754
  enumerable: true,
584
755
  get: function() {
585
756
  return colors;
586
757
  }
587
758
  });
759
+ Object.defineProperty(exports, "pluginBaseStyles", {
760
+ enumerable: true,
761
+ get: function() {
762
+ return pluginBaseStyles;
763
+ }
764
+ });
765
+ Object.defineProperty(exports, "pluginComponentStyles", {
766
+ enumerable: true,
767
+ get: function() {
768
+ return pluginComponentStyles;
769
+ }
770
+ });
771
+ Object.defineProperty(exports, "tailwindTheme", {
772
+ enumerable: true,
773
+ get: function() {
774
+ return tailwindTheme;
775
+ }
776
+ });
588
777
  Object.defineProperty(exports, "textComponents", {
589
778
  enumerable: true,
590
779
  get: function() {
@@ -598,4 +787,4 @@ Object.defineProperty(exports, "themePlugin", {
598
787
  }
599
788
  });
600
789
 
601
- //# sourceMappingURL=plugin-DPtvp4lp.cjs.map
790
+ //# sourceMappingURL=plugin-B3PF4RMI.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plugin-B3PF4RMI.cjs","names":["wrapVariableOpacity","wrapVar","colorBackgroundCriticalDark","colorBackgroundCriticalLight","colorBackgroundDisabled","wrapOpacity","colorBackgroundHover","colorBackgroundHoverInverse","colorBackgroundInfoDark","colorBackgroundInfoLight","colorBackgroundInverse","colorBackgroundOverlay","colorBackgroundPressed","colorBackgroundPressedInverse","colorBackgroundPrimary","colorBackgroundSecondary","colorBackgroundSubdued","colorBackgroundSuccessDark","colorBackgroundSuccessLight","colorBackgroundTertiary","colorBackgroundWarningDark","colorBackgroundWarningLight","colorBorderBlack","colorBorderCritical","colorBorderDisabled","colorBorderHover","colorBorderInfo","colorBorderInverse","colorBorderPrimary","colorBorderSecondary","colorBorderSelected","colorBorderSuccess","colorBorderTertiary","colorBorderWarning","colorCritical100","colorCritical200","colorCritical300","colorCritical400","colorCritical50","colorCritical500","colorCritical600","colorCritical700","colorCritical800","colorCritical900","colorFocusInverse","colorFocusPrimary","colorIconCritical","colorIconPrimary","colorIconDisabled","colorIconSecondary","colorIconInfo","colorIconInverse","colorIconSuccess","colorIconWarning","colorInfo100","colorInfo200","colorInfo300","colorInfo400","colorInfo50","colorInfo500","colorInfo600","colorInfo700","colorInfo800","colorInfo900","colorLinkDisabled","colorLinkHover","colorLinkInverse","colorLinkInverseDisabled","colorLinkInverseHover","colorLinkInversePressed","colorLinkMonochrome","colorLinkPressed","colorLinkPrimary","colorLinkSecondary","colorPrimary100","colorPrimary200","colorPrimary300","colorPrimary400","colorPrimary50","colorPrimary500","colorPrimary600","colorPrimary700","colorPrimary800","colorPrimary900","colorSecondary100","colorSecondary200","colorSecondary300","colorSecondary400","colorSecondary50","colorSecondary500","colorSecondary600","colorSecondary700","colorSecondary800","colorSecondary900","colorSuccess100","colorSuccess200","colorSuccess300","colorSuccess400","colorSuccess50","colorSuccess500","colorSuccess600","colorSuccess700","colorSuccess800","colorSuccess900","colorSurface100","colorSurface200","colorSurface300","colorSurface400","colorSurface50","colorSurface500","colorSurface600","colorSurface700","colorSurface800","colorSurface900","colorTertiary100","colorTertiary200","colorTertiary300","colorTertiary400","colorTertiary50","colorTertiary500","colorTertiary600","colorTertiary700","colorTertiary800","colorTertiary900","colorTextCritical","colorTextDisabled","colorTextInactive","colorTextInfo","colorTextInverse","colorTextPrimary","colorTextSecondary","colorTextSuccess","colorTextWarning","colorWarning100","colorWarning200","colorWarning300","colorWarning400","colorWarning50","colorWarning500","colorWarning600","colorWarning700","colorWarning800","colorWarning900","fontFamily","wrapVar","fontWeightBodyPrimary","letterSpacingBodyPrimary","fontWeightBodySecondary","letterSpacingBodySecondary","fontWeightCaption","letterSpacingCaption","fontWeightH1","letterSpacingH1","screens","letterSpacingH1Mobile","fontWeightH2","letterSpacingH2","letterSpacingH2Mobile","fontWeightH3","letterSpacingH3","letterSpacingH3Mobile","fontWeightH4","letterSpacingH4","fontWeightH5","letterSpacingH5","fontWeightH6","letterSpacingH6","textTransformH6","fontWeightLabelMini","letterSpacingLabelMini","textTransformLabelMini","fontWeightLabelStrong","letterSpacingLabelStrong","wrapVar","widthDense","widthPage"],"sources":["../src/tailwind/animation.ts","../src/tailwind/borderWidth.ts","../src/tailwind/colors.ts","../src/tailwind/reducedMotion.ts","../src/tailwind/text.ts","../src/tailwind/width.ts","../src/tailwind/plugin.ts"],"sourcesContent":["/**\n * Animation registry for the theme system\n *\n * The `animate-*` utilities this library registers, extracted from `plugin.ts` so the\n * reduced-motion policy can be checked against them (see `./reducedMotion`). These sit under\n * `theme.extend`, so Tailwind's own defaults (`spin`, `ping`, `pulse`, `bounce`, `none`) survive\n * alongside them — the resolved registry is this object layered over `defaultTheme.animation`,\n * and the policy must cover both.\n *\n * Keyframes stay in `plugin.ts` next to the `addBase` block that emits some of them.\n */\nexport const animation = {\n fadeIn: 'fadeIn .2s ease-in-out',\n fadeInOpacity: 'fadeInOpacity 0.5s ease-in-out',\n fadeInScaled: 'fadeInScaled .2s ease-in',\n fadeOut: 'fadeOut .2s ease-in-out',\n loading: 'loading 1.4s infinite ease-in-out',\n 'progress-completion': 'shrink 0.15s ease-in-out both, grow 0.15s ease-in-out 0.15s both',\n 'progress-icon-fade-in': 'fadeInOpacity 0.15s ease-in-out 0.15s both',\n 'progress-wave':\n 'progressWave 1333ms cubic-bezier(0.4, 0, 0.2, 1) infinite both, progressWaveRotate 1568ms linear infinite both',\n saveButtonPulse: 'saveButtonPulse 500ms cubic-bezier(0.34, 1.56, 0.64, 1)',\n saveButtonWiggle: 'saveButtonWiggle 500ms ease-in-out',\n saveHeartColorFlash: 'saveHeartColorFlash 500ms cubic-bezier(0.45, 0, 0.55, 1)',\n saveHeartPop: 'saveHeartPop 480ms cubic-bezier(0.34, 1.56, 0.64, 1)',\n saveHeartTwirlBloom: 'saveHeartTwirlBloom 500ms cubic-bezier(0.45, 0, 0.55, 1)',\n saveLabelShimmer: 'saveLabelShimmer 500ms ease-in-out',\n slideDown: 'slideDown 0.3s ease-in forwards',\n slideUp: 'slideUp 0.3s ease-out forwards',\n};\n","/**\n * Border width scale the theme ships.\n *\n * These match the widths Tailwind uses when a plugin does not replace `borderWidth`.\n * They sit on the theme object so the value snapshot locks the same scale.\n */\n\nexport const borderWidth = {\n DEFAULT: '1px',\n 0: '0px',\n 2: '2px',\n 4: '4px',\n 8: '8px',\n};\n","/**\n * Color configuration for Tailwind CSS\n *\n * Maps CSS custom properties to Tailwind color utilities using nested objects.\n * Uses wrapVariableOpacity() for dynamic alpha support (e.g., `bg-primary-500/50`)\n * and wrapOpacity() for fixed opacity values.\n *\n * @see https://tailwindcss.com/docs/customizing-colors#using-css-variables\n * Internal reference: Hammer UI patterns\n * Ported from the upstream theme system.\n */\n\nimport { wrapOpacity, wrapVar, wrapVariableOpacity } from '../utils/wrapVar';\nimport {\n colorBackgroundCriticalDark,\n colorBackgroundCriticalLight,\n colorBackgroundDisabled,\n colorBackgroundHover,\n colorBackgroundHoverInverse,\n colorBackgroundInfoDark,\n colorBackgroundInfoLight,\n colorBackgroundInverse,\n colorBackgroundOverlay,\n colorBackgroundPressed,\n colorBackgroundPressedInverse,\n colorBackgroundPrimary,\n colorBackgroundSecondary,\n colorBackgroundSubdued,\n colorBackgroundSuccessDark,\n colorBackgroundSuccessLight,\n colorBackgroundTertiary,\n colorBackgroundWarningDark,\n colorBackgroundWarningLight,\n colorBorderBlack,\n colorBorderCritical,\n colorBorderDisabled,\n colorBorderHover,\n colorBorderInfo,\n colorBorderInverse,\n colorBorderPrimary,\n colorBorderSecondary,\n colorBorderSelected,\n colorBorderSuccess,\n colorBorderTertiary,\n colorBorderWarning,\n colorCritical100,\n colorCritical200,\n colorCritical300,\n colorCritical400,\n colorCritical50,\n colorCritical500,\n colorCritical600,\n colorCritical700,\n colorCritical800,\n colorCritical900,\n colorFocusInverse,\n colorFocusPrimary,\n colorIconCritical,\n colorIconDisabled,\n colorIconInfo,\n colorIconInverse,\n colorIconPrimary,\n colorIconSecondary,\n colorIconSuccess,\n colorIconWarning,\n colorInfo100,\n colorInfo200,\n colorInfo300,\n colorInfo400,\n colorInfo50,\n colorInfo500,\n colorInfo600,\n colorInfo700,\n colorInfo800,\n colorInfo900,\n colorLinkDisabled,\n colorLinkHover,\n colorLinkInverse,\n colorLinkInverseDisabled,\n colorLinkInverseHover,\n colorLinkInversePressed,\n colorLinkMonochrome,\n colorLinkPressed,\n colorLinkPrimary,\n colorLinkSecondary,\n colorPrimary100,\n colorPrimary200,\n colorPrimary300,\n colorPrimary400,\n colorPrimary50,\n colorPrimary500,\n colorPrimary600,\n colorPrimary700,\n colorPrimary800,\n colorPrimary900,\n colorSecondary100,\n colorSecondary200,\n colorSecondary300,\n colorSecondary400,\n colorSecondary50,\n colorSecondary500,\n colorSecondary600,\n colorSecondary700,\n colorSecondary800,\n colorSecondary900,\n colorSuccess100,\n colorSuccess200,\n colorSuccess300,\n colorSuccess400,\n colorSuccess50,\n colorSuccess500,\n colorSuccess600,\n colorSuccess700,\n colorSuccess800,\n colorSuccess900,\n colorSurface100,\n colorSurface200,\n colorSurface300,\n colorSurface400,\n colorSurface50,\n colorSurface500,\n colorSurface600,\n colorSurface700,\n colorSurface800,\n colorSurface900,\n colorTertiary100,\n colorTertiary200,\n colorTertiary300,\n colorTertiary400,\n colorTertiary50,\n colorTertiary500,\n colorTertiary600,\n colorTertiary700,\n colorTertiary800,\n colorTertiary900,\n colorTextCritical,\n colorTextDisabled,\n colorTextInactive,\n colorTextInfo,\n colorTextInverse,\n colorTextPrimary,\n colorTextSecondary,\n colorTextSuccess,\n colorTextWarning,\n colorWarning100,\n colorWarning200,\n colorWarning300,\n colorWarning400,\n colorWarning50,\n colorWarning500,\n colorWarning600,\n colorWarning700,\n colorWarning800,\n colorWarning900,\n} from './cssVars';\n\nexport const colors: Record<string, Record<string, string> | string> = {\n background: {\n 'critical-dark': wrapVariableOpacity(wrapVar(colorBackgroundCriticalDark)),\n 'critical-light': wrapVariableOpacity(wrapVar(colorBackgroundCriticalLight)),\n disabled: wrapVariableOpacity(wrapVar(colorBackgroundDisabled)),\n hover: wrapOpacity(wrapVar(colorBackgroundHover), 5),\n 'hover-inverse': wrapOpacity(wrapVar(colorBackgroundHoverInverse), 5),\n 'info-dark': wrapVariableOpacity(wrapVar(colorBackgroundInfoDark)),\n 'info-light': wrapVariableOpacity(wrapVar(colorBackgroundInfoLight)),\n inverse: wrapVariableOpacity(wrapVar(colorBackgroundInverse)),\n overlay: wrapOpacity(wrapVar(colorBackgroundOverlay), 40),\n pressed: wrapOpacity(wrapVar(colorBackgroundPressed), 20),\n 'pressed-inverse': wrapOpacity(wrapVar(colorBackgroundPressedInverse), 20),\n primary: wrapVariableOpacity(wrapVar(colorBackgroundPrimary)),\n secondary: wrapVariableOpacity(wrapVar(colorBackgroundSecondary)),\n subdued: wrapVariableOpacity(wrapVar(colorBackgroundSubdued)),\n 'success-dark': wrapVariableOpacity(wrapVar(colorBackgroundSuccessDark)),\n 'success-light': wrapVariableOpacity(wrapVar(colorBackgroundSuccessLight)),\n tertiary: wrapVariableOpacity(wrapVar(colorBackgroundTertiary)),\n 'warning-dark': wrapVariableOpacity(wrapVar(colorBackgroundWarningDark)),\n 'warning-light': wrapVariableOpacity(wrapVar(colorBackgroundWarningLight)),\n },\n border: {\n black: wrapVariableOpacity(wrapVar(colorBorderBlack)),\n critical: wrapVariableOpacity(wrapVar(colorBorderCritical)),\n disabled: wrapVariableOpacity(wrapVar(colorBorderDisabled)),\n hover: wrapVariableOpacity(wrapVar(colorBorderHover)),\n info: wrapVariableOpacity(wrapVar(colorBorderInfo)),\n inverse: wrapVariableOpacity(wrapVar(colorBorderInverse)),\n primary: wrapVariableOpacity(wrapVar(colorBorderPrimary)),\n secondary: wrapVariableOpacity(wrapVar(colorBorderSecondary)),\n selected: wrapVariableOpacity(wrapVar(colorBorderSelected)),\n success: wrapVariableOpacity(wrapVar(colorBorderSuccess)),\n tertiary: wrapVariableOpacity(wrapVar(colorBorderTertiary)),\n warning: wrapVariableOpacity(wrapVar(colorBorderWarning)),\n },\n critical: {\n '100': wrapVariableOpacity(wrapVar(colorCritical100)),\n '200': wrapVariableOpacity(wrapVar(colorCritical200)),\n '300': wrapVariableOpacity(wrapVar(colorCritical300)),\n '400': wrapVariableOpacity(wrapVar(colorCritical400)),\n '50': wrapVariableOpacity(wrapVar(colorCritical50)),\n '500': wrapVariableOpacity(wrapVar(colorCritical500)),\n '600': wrapVariableOpacity(wrapVar(colorCritical600)),\n '700': wrapVariableOpacity(wrapVar(colorCritical700)),\n '800': wrapVariableOpacity(wrapVar(colorCritical800)),\n '900': wrapVariableOpacity(wrapVar(colorCritical900)),\n },\n current: 'currentColor',\n focus: {\n inverse: wrapOpacity(wrapVar(colorFocusInverse), 50),\n primary: wrapOpacity(wrapVar(colorFocusPrimary), 50),\n },\n 'focus-inverse': wrapVariableOpacity(wrapVar(colorFocusInverse)),\n 'focus-primary': wrapVariableOpacity(wrapVar(colorFocusPrimary)),\n icon: {\n critical: wrapVariableOpacity(wrapVar(colorIconCritical)),\n default: wrapVariableOpacity(wrapVar(colorIconPrimary)),\n disabled: wrapVariableOpacity(wrapVar(colorIconDisabled)),\n hover: wrapVariableOpacity(wrapVar(colorIconSecondary)),\n info: wrapVariableOpacity(wrapVar(colorIconInfo)),\n inverse: wrapVariableOpacity(wrapVar(colorIconInverse)),\n primary: wrapVariableOpacity(wrapVar(colorIconPrimary)),\n secondary: wrapVariableOpacity(wrapVar(colorIconSecondary)),\n success: wrapVariableOpacity(wrapVar(colorIconSuccess)),\n warning: wrapVariableOpacity(wrapVar(colorIconWarning)),\n },\n info: {\n '100': wrapVariableOpacity(wrapVar(colorInfo100)),\n '200': wrapVariableOpacity(wrapVar(colorInfo200)),\n '300': wrapVariableOpacity(wrapVar(colorInfo300)),\n '400': wrapVariableOpacity(wrapVar(colorInfo400)),\n '50': wrapVariableOpacity(wrapVar(colorInfo50)),\n '500': wrapVariableOpacity(wrapVar(colorInfo500)),\n '600': wrapVariableOpacity(wrapVar(colorInfo600)),\n '700': wrapVariableOpacity(wrapVar(colorInfo700)),\n '800': wrapVariableOpacity(wrapVar(colorInfo800)),\n '900': wrapVariableOpacity(wrapVar(colorInfo900)),\n },\n link: {\n disabled: wrapVariableOpacity(wrapVar(colorLinkDisabled)),\n hover: wrapVariableOpacity(wrapVar(colorLinkHover)),\n inverse: wrapVariableOpacity(wrapVar(colorLinkInverse)),\n 'inverse-disabled': wrapVariableOpacity(wrapVar(colorLinkInverseDisabled)),\n 'inverse-hover': wrapVariableOpacity(wrapVar(colorLinkInverseHover)),\n 'inverse-pressed': wrapVariableOpacity(wrapVar(colorLinkInversePressed)),\n monochrome: wrapVariableOpacity(wrapVar(colorLinkMonochrome)),\n pressed: wrapVariableOpacity(wrapVar(colorLinkPressed)),\n primary: wrapVariableOpacity(wrapVar(colorLinkPrimary)),\n secondary: wrapVariableOpacity(wrapVar(colorLinkSecondary)),\n },\n primary: {\n '100': wrapVariableOpacity(wrapVar(colorPrimary100)),\n '200': wrapVariableOpacity(wrapVar(colorPrimary200)),\n '300': wrapVariableOpacity(wrapVar(colorPrimary300)),\n '400': wrapVariableOpacity(wrapVar(colorPrimary400)),\n '50': wrapVariableOpacity(wrapVar(colorPrimary50)),\n '500': wrapVariableOpacity(wrapVar(colorPrimary500)),\n '600': wrapVariableOpacity(wrapVar(colorPrimary600)),\n '700': wrapVariableOpacity(wrapVar(colorPrimary700)),\n '800': wrapVariableOpacity(wrapVar(colorPrimary800)),\n '900': wrapVariableOpacity(wrapVar(colorPrimary900)),\n },\n secondary: {\n '100': wrapVariableOpacity(wrapVar(colorSecondary100)),\n '200': wrapVariableOpacity(wrapVar(colorSecondary200)),\n '300': wrapVariableOpacity(wrapVar(colorSecondary300)),\n '400': wrapVariableOpacity(wrapVar(colorSecondary400)),\n '50': wrapVariableOpacity(wrapVar(colorSecondary50)),\n '500': wrapVariableOpacity(wrapVar(colorSecondary500)),\n '600': wrapVariableOpacity(wrapVar(colorSecondary600)),\n '700': wrapVariableOpacity(wrapVar(colorSecondary700)),\n '800': wrapVariableOpacity(wrapVar(colorSecondary800)),\n '900': wrapVariableOpacity(wrapVar(colorSecondary900)),\n },\n success: {\n '100': wrapVariableOpacity(wrapVar(colorSuccess100)),\n '200': wrapVariableOpacity(wrapVar(colorSuccess200)),\n '300': wrapVariableOpacity(wrapVar(colorSuccess300)),\n '400': wrapVariableOpacity(wrapVar(colorSuccess400)),\n '50': wrapVariableOpacity(wrapVar(colorSuccess50)),\n '500': wrapVariableOpacity(wrapVar(colorSuccess500)),\n '600': wrapVariableOpacity(wrapVar(colorSuccess600)),\n '700': wrapVariableOpacity(wrapVar(colorSuccess700)),\n '800': wrapVariableOpacity(wrapVar(colorSuccess800)),\n '900': wrapVariableOpacity(wrapVar(colorSuccess900)),\n },\n surface: {\n '100': wrapVariableOpacity(wrapVar(colorSurface100)),\n '200': wrapVariableOpacity(wrapVar(colorSurface200)),\n '300': wrapVariableOpacity(wrapVar(colorSurface300)),\n '400': wrapVariableOpacity(wrapVar(colorSurface400)),\n '50': wrapVariableOpacity(wrapVar(colorSurface50)),\n '500': wrapVariableOpacity(wrapVar(colorSurface500)),\n '600': wrapVariableOpacity(wrapVar(colorSurface600)),\n '700': wrapVariableOpacity(wrapVar(colorSurface700)),\n '800': wrapVariableOpacity(wrapVar(colorSurface800)),\n '900': wrapVariableOpacity(wrapVar(colorSurface900)),\n },\n tertiary: {\n '100': wrapVariableOpacity(wrapVar(colorTertiary100)),\n '200': wrapVariableOpacity(wrapVar(colorTertiary200)),\n '300': wrapVariableOpacity(wrapVar(colorTertiary300)),\n '400': wrapVariableOpacity(wrapVar(colorTertiary400)),\n '50': wrapVariableOpacity(wrapVar(colorTertiary50)),\n '500': wrapVariableOpacity(wrapVar(colorTertiary500)),\n '600': wrapVariableOpacity(wrapVar(colorTertiary600)),\n '700': wrapVariableOpacity(wrapVar(colorTertiary700)),\n '800': wrapVariableOpacity(wrapVar(colorTertiary800)),\n '900': wrapVariableOpacity(wrapVar(colorTertiary900)),\n },\n text: {\n critical: wrapVariableOpacity(wrapVar(colorTextCritical)),\n disabled: wrapVariableOpacity(wrapVar(colorTextDisabled)),\n inactive: wrapVariableOpacity(wrapVar(colorTextInactive)),\n info: wrapVariableOpacity(wrapVar(colorTextInfo)),\n inverse: wrapVariableOpacity(wrapVar(colorTextInverse)),\n primary: wrapVariableOpacity(wrapVar(colorTextPrimary)),\n secondary: wrapVariableOpacity(wrapVar(colorTextSecondary)),\n success: wrapVariableOpacity(wrapVar(colorTextSuccess)),\n warning: wrapVariableOpacity(wrapVar(colorTextWarning)),\n },\n transparent: 'transparent',\n warning: {\n '100': wrapVariableOpacity(wrapVar(colorWarning100)),\n '200': wrapVariableOpacity(wrapVar(colorWarning200)),\n '300': wrapVariableOpacity(wrapVar(colorWarning300)),\n '400': wrapVariableOpacity(wrapVar(colorWarning400)),\n '50': wrapVariableOpacity(wrapVar(colorWarning50)),\n '500': wrapVariableOpacity(wrapVar(colorWarning500)),\n '600': wrapVariableOpacity(wrapVar(colorWarning600)),\n '700': wrapVariableOpacity(wrapVar(colorWarning700)),\n '800': wrapVariableOpacity(wrapVar(colorWarning800)),\n '900': wrapVariableOpacity(wrapVar(colorWarning900)),\n },\n};\n","/**\n * Reduced-motion policy for the animation registry (DS-95 / audit findings SA-02 + SA-03).\n *\n * Every animation Tailwind resolves for this library — the local `theme.extend.animation`\n * entries *and* Tailwind's own defaults — gets exactly one entry here. `reducedMotion.spec.ts`\n * fails if the two key sets ever diverge, so a new animation cannot ship untriaged.\n *\n * ## Why duration-collapse rather than `animation: none`\n *\n * `animation: none` fires no `animationend`. `Modal/ComposableModal` and\n * `Modal/hooks/useCloseModal` both depend on that event to finish closing — `useCloseModal`\n * clears a 450ms watchdog there that otherwise logs an error and rejects an awaited promise. A\n * naive `none` gate would strand the modal open *for reduced-motion users only*, which is worse\n * than the gap it fixes. Collapsing the duration keeps the event, and keeps `forwards`/`both`\n * fill end-states intact (`slideUp`, `slideDown`, `progress-completion`).\n *\n * ## Why the doubled class selector\n *\n * Tailwind emits `base` before `utilities`. A consumer building with `important: true` gets\n * `!important` utilities too, and two equal-specificity `!important` rules resolve by source\n * order — the utility would win. `.animate-x.animate-x` (0-2-0) beats it on specificity instead,\n * and is inert for everyone else.\n *\n * Two known limitations, both external-consumer only:\n * - `prefix` renames the utility classes (`.tw-animate-*`), which these selectors will not match.\n * - `important: '#selector'` (the selector strategy, not `important: true`) emits\n * `#selector .animate-x` at specificity 0-1-0 *plus* an id — which outranks 0-2-0 regardless\n * of `!important`. The doubled class only defends against `important: true`.\n *\n * Components in this repo hardcode unprefixed class strings and no in-repo config sets either\n * option, so neither affects this monorepo.\n */\nexport type ReducedMotionTier =\n /** Collapse to ~1ms under reduce. The animation still runs, so `animationend` still fires. */\n | 'instant'\n /** Left alone — infinite indeterminate status indicators, where stopping removes feedback. */\n | 'retain'\n /** Not an animation (`animate-none` is the absence utility). */\n | 'n/a';\n\n/**\n * `selectors` is only meaningful on `instant` entries — nothing is emitted for `retain`/`n/a`,\n * so allowing it there would let a future entry declare a selector that silently does nothing.\n * The union makes that a type error rather than a quiet no-op.\n */\nexport type ReducedMotionPolicyEntry =\n | {\n /** Why this tier was chosen. Asserted non-empty, so every entry carries a justification. */\n reason: string;\n /**\n * Extra selectors for animations applied through a component class rather than an\n * `animate-*` utility. Emitted verbatim, so they are written at full specificity.\n */\n selectors?: readonly string[];\n tier: 'instant';\n }\n | { reason: string; selectors?: never; tier: 'n/a' | 'retain' };\n\nexport const REDUCED_MOTION_POLICY: Record<string, ReducedMotionPolicyEntry> = {\n // --- Local registry (theme.extend.animation) ---\n fadeIn: {\n reason: 'Opacity only, but collapsed alongside fadeInScaled so a modal opens the same way in both variants (ComposableModal picks between them on hasContentPager).',\n tier: 'instant',\n },\n fadeInOpacity: {\n reason: 'Opacity and visibility only; collapsing a fade is not a motion regression.',\n tier: 'instant',\n },\n fadeInScaled: { reason: 'Scales 0.7 to 1.', tier: 'instant' },\n fadeOut: {\n reason: 'Scales 1 to 0.7. Modal close depends on its animationend, so it is collapsed rather than removed.',\n tier: 'instant',\n },\n loading: {\n reason: 'Infinite indeterminate loading indicator (LoadingDot). Collapsing it removes the only signal that work is in progress.',\n tier: 'retain',\n },\n 'progress-completion': {\n reason: 'Scales. Zeroing the delay matters here: the composite is \"shrink 0.15s both, grow 0.15s ease-in-out 0.15s both\", so a duration-only collapse would hold the ring at scale(0.5) for 150ms and then snap.',\n tier: 'instant',\n },\n 'progress-icon-fade-in': {\n reason: 'Opacity only, but its 0.15s delay sequences it after progress-completion. Retaining it would leave a completed ProgressCircle ring with an empty centre for 150ms.',\n tier: 'instant',\n },\n 'progress-wave': {\n reason: 'Infinite indeterminate progress indicator (ProgressCircle). Same essential-feedback rationale as loading.',\n tier: 'retain',\n },\n saveButtonPulse: { reason: 'Scales.', tier: 'instant' },\n saveButtonWiggle: { reason: 'Rotates and scales.', tier: 'instant' },\n saveHeartColorFlash: {\n reason: 'Animates fill only, but it was already gated before DS-95 and must stay gated. Shipped via .hui-fb-color-flash, not the animate-* utility (which has no call sites), so it needs the explicit selector below.',\n selectors: ['.hui-fb-color-flash .hui-fb-icon-frame svg path'],\n tier: 'instant',\n },\n saveHeartPop: { reason: 'Scales.', tier: 'instant' },\n saveHeartTwirlBloom: { reason: 'Rotates 180 degrees at 1.15x scale.', tier: 'instant' },\n saveLabelShimmer: {\n reason: 'Animates background-position. The .hui-fb-shimmer paint block in plugin.ts separately drops the gradient under reduce so the label stays legible.',\n tier: 'instant',\n },\n slideDown: {\n reason: 'Translates on Y. Collapsed rather than removed so CookieConsent still receives animationend.',\n tier: 'instant',\n },\n slideUp: { reason: 'Translates on Y. Same animationend rationale as slideDown.', tier: 'instant' },\n\n // --- Tailwind defaults, which survive theme.extend and are reachable by consumers ---\n bounce: { reason: 'Translates on Y.', tier: 'instant' },\n none: { reason: 'Not an animation — animate-none is the absence utility.', tier: 'n/a' },\n ping: { reason: 'Scales and fades. No in-repo call site, but consumers can use it.', tier: 'instant' },\n pulse: {\n reason: 'Infinite, but opacity only — the conventional skeleton-loading indicator. Retained as essential feedback with no motion component.',\n tier: 'retain',\n },\n spin: {\n reason: 'Infinite indeterminate spinner (LoadingSpinner, ProgressCircle). A Tailwind default rather than a local entry, which is exactly why the policy is keyed on the resolved registry.',\n tier: 'retain',\n },\n};\n\nconst REDUCE_QUERY = '@media (prefers-reduced-motion: reduce)';\n\nconst COLLAPSED_DECLARATIONS = {\n 'animation-delay': '0ms !important',\n 'animation-duration': '1ms !important',\n 'animation-iteration-count': '1 !important',\n};\n\n/**\n * Builds the `@media (prefers-reduced-motion: reduce)` block for `addBase`.\n *\n * Emitted from `addBase` rather than `addComponents` deliberately: `addComponents` is subject to\n * caching discrepancies in this monorepo's Storybook build that stop newly added rules landing.\n */\nexport const buildReducedMotionBase = () => {\n const rules: Record<string, typeof COLLAPSED_DECLARATIONS> = {};\n\n const addRule = (selector: string) => {\n if (rules[selector]) {\n // Two policy entries claiming one selector would silently overwrite each other.\n // Every rule emits identical declarations today, so this can only fire on a\n // genuine authoring mistake — fail loudly rather than ship half a gate.\n throw new Error(`Duplicate reduced-motion selector: ${selector}`);\n }\n\n rules[selector] = { ...COLLAPSED_DECLARATIONS };\n };\n\n Object.entries(REDUCED_MOTION_POLICY).forEach(([key, entry]) => {\n if (entry.tier !== 'instant') {\n return;\n }\n\n // Doubled class (0-2-0) so an `important: true` consumer's utility cannot win on\n // source order — Tailwind emits `base` before `utilities`.\n addRule(`.animate-${key}.animate-${key}`);\n\n entry.selectors?.forEach(addRule);\n });\n\n return { [REDUCE_QUERY]: rules };\n};\n","/**\n * Typography component classes for Tailwind CSS plugin\n *\n * Defines .hui-text-* and .hui-link-* utility classes that apply\n * complete typography styles (font, size, weight, spacing, line-height).\n *\n * Internal reference: Hammer UI patterns\n * Ported from the upstream theme system.\n */\n\nimport { CSSRuleObject } from 'tailwindcss/types/config';\n\nimport { wrapVar } from '../utils/wrapVar';\nimport {\n fontWeightBodyPrimary,\n fontWeightBodySecondary,\n fontWeightCaption,\n fontWeightH1,\n fontWeightH2,\n fontWeightH3,\n fontWeightH4,\n fontWeightH5,\n fontWeightH6,\n fontWeightLabelMini,\n fontWeightLabelStrong,\n letterSpacingBodyPrimary,\n letterSpacingBodySecondary,\n letterSpacingCaption,\n letterSpacingH1,\n letterSpacingH1Mobile,\n letterSpacingH2,\n letterSpacingH2Mobile,\n letterSpacingH3,\n letterSpacingH3Mobile,\n letterSpacingH4,\n letterSpacingH5,\n letterSpacingH6,\n letterSpacingLabelMini,\n letterSpacingLabelStrong,\n textTransformH6,\n textTransformLabelMini,\n} from './cssVars';\nimport { fontFamily } from './fontFamily';\nimport { screens } from './screens';\n\nexport const textComponents = {\n '.hui-link-md': {\n fontFamily: fontFamily.primary,\n fontSize: '16px',\n fontWeight: wrapVar(fontWeightBodyPrimary),\n letterSpacing: wrapVar(letterSpacingBodyPrimary),\n lineHeight: '24px',\n },\n '.hui-link-sm': {\n fontFamily: fontFamily.primary,\n fontSize: '14px',\n fontWeight: wrapVar(fontWeightBodyPrimary),\n letterSpacing: wrapVar(letterSpacingBodyPrimary),\n lineHeight: '22px',\n },\n '.hui-link-xs': {\n fontFamily: fontFamily.primary,\n fontSize: '12px',\n fontWeight: wrapVar(fontWeightBodyPrimary),\n letterSpacing: wrapVar(letterSpacingBodyPrimary),\n lineHeight: '18px',\n },\n '.hui-text-body-primary': {\n fontFamily: fontFamily.primary,\n fontSize: '16px',\n fontWeight: wrapVar(fontWeightBodyPrimary),\n letterSpacing: wrapVar(letterSpacingBodyPrimary),\n lineHeight: '24px',\n },\n '.hui-text-body-secondary': {\n fontFamily: fontFamily.primary,\n fontSize: '14px',\n fontWeight: wrapVar(fontWeightBodySecondary),\n letterSpacing: wrapVar(letterSpacingBodySecondary),\n lineHeight: '22px',\n },\n '.hui-text-caption': {\n fontFamily: fontFamily.primary,\n fontSize: '12px',\n fontWeight: wrapVar(fontWeightCaption),\n letterSpacing: wrapVar(letterSpacingCaption),\n lineHeight: '18px',\n },\n '.hui-text-h1': {\n fontFamily: fontFamily.secondary,\n fontSize: '32px',\n fontWeight: wrapVar(fontWeightH1),\n letterSpacing: wrapVar(letterSpacingH1),\n lineHeight: '48px',\n [`@media (width < ${screens.smMax.max})`]: {\n fontSize: '24px',\n letterSpacing: wrapVar(letterSpacingH1Mobile),\n lineHeight: '36px',\n },\n },\n '.hui-text-h2': {\n fontFamily: fontFamily.secondary,\n fontSize: '24px',\n fontWeight: wrapVar(fontWeightH2),\n letterSpacing: wrapVar(letterSpacingH2),\n lineHeight: '36px',\n [`@media (width < ${screens.smMax.max})`]: {\n fontSize: '20px',\n letterSpacing: wrapVar(letterSpacingH2Mobile),\n lineHeight: '30px',\n },\n },\n '.hui-text-h3': {\n fontFamily: fontFamily.secondary,\n fontSize: '20px',\n fontWeight: wrapVar(fontWeightH3),\n letterSpacing: wrapVar(letterSpacingH3),\n lineHeight: '30px',\n [`@media (width < ${screens.smMax.max})`]: {\n // 18px/27px, not 16px/24px: at 16px this rule rendered identically to `.hui-text-h4`\n // below the breakpoint, collapsing two adjacent heading levels (DS-97 / SA-04).\n fontSize: '18px',\n letterSpacing: wrapVar(letterSpacingH3Mobile),\n lineHeight: '27px',\n },\n },\n '.hui-text-h4': {\n fontFamily: fontFamily.secondary,\n fontSize: '16px',\n fontWeight: wrapVar(fontWeightH4),\n letterSpacing: wrapVar(letterSpacingH4),\n lineHeight: '24px',\n },\n '.hui-text-h5': {\n fontFamily: fontFamily.primary,\n fontSize: '16px',\n fontWeight: wrapVar(fontWeightH5),\n letterSpacing: wrapVar(letterSpacingH5),\n lineHeight: '24px',\n },\n '.hui-text-h6': {\n fontFamily: fontFamily.primary,\n fontSize: '14px',\n fontWeight: wrapVar(fontWeightH6),\n letterSpacing: wrapVar(letterSpacingH6),\n lineHeight: '22px',\n textTransform: wrapVar(textTransformH6),\n },\n '.hui-text-label-mini': {\n fontFamily: fontFamily.primary,\n fontSize: '12px',\n fontWeight: wrapVar(fontWeightLabelMini),\n letterSpacing: wrapVar(letterSpacingLabelMini),\n lineHeight: '14px',\n textTransform: wrapVar(textTransformLabelMini),\n },\n '.hui-text-label-mini-strong': {\n fontFamily: fontFamily.primary,\n fontSize: '12px',\n fontWeight: wrapVar(fontWeightLabelStrong),\n letterSpacing: wrapVar(letterSpacingLabelMini),\n lineHeight: '14px',\n textTransform: wrapVar(textTransformLabelMini),\n },\n '.hui-text-label-strong': {\n fontFamily: fontFamily.primary,\n fontSize: '14px',\n fontWeight: wrapVar(fontWeightLabelStrong),\n letterSpacing: wrapVar(letterSpacingLabelStrong),\n lineHeight: '22px',\n },\n} satisfies Record<string, CSSRuleObject>;\n","/**\n * Layout width configuration for Tailwind CSS\n *\n * Internal reference: Hammer UI patterns\n * Ported from the upstream theme system.\n */\n\nimport { wrapVar } from '../utils/wrapVar';\nimport { widthDense, widthPage } from './cssVars';\n\nexport const width = {\n dense: wrapVar(widthDense),\n page: wrapVar(widthPage),\n} as const;\n","/**\n * Main Tailwind CSS plugin for the theme system\n *\n * Composes all theme configuration modules (colors, spacing, typography, etc.)\n * into a single Tailwind plugin. The plugin's second argument defines the complete\n * theme, so consumers only need `plugins: [themePlugin]` — no separate theme extension.\n *\n * Internal reference: Hammer UI patterns\n * Ported from the upstream theme system.\n */\n\nimport plugin from 'tailwindcss/plugin';\n\nimport { animation } from './animation';\nimport { borderRadius } from './borderRadius';\nimport { borderWidth } from './borderWidth';\nimport { boxShadow } from './boxShadow';\nimport { colors } from './colors';\nimport { fontFamily } from './fontFamily';\nimport { buildReducedMotionBase } from './reducedMotion';\nimport { screens } from './screens';\nimport { spacing } from './spacing';\nimport { textComponents } from './text';\nimport { width } from './width';\n\nexport const autofillStyles = {\n '-webkit-box-shadow': '0 0 0 12px rgb(var(--color-background-primary)) inset !important',\n 'box-shadow': '0 0 0 12px rgb(var(--color-background-primary)) inset !important',\n};\n\nexport const tailwindTheme = {\n borderRadius,\n borderWidth,\n boxShadow,\n colors,\n extend: {\n animation,\n keyframes: {\n fadeIn: {\n from: {\n opacity: '0',\n },\n to: {\n opacity: '1',\n },\n },\n fadeInOpacity: {\n from: {\n opacity: '0',\n visibility: 'hidden',\n },\n to: {\n opacity: '1',\n visibility: 'visible',\n },\n },\n fadeInScaled: {\n from: {\n opacity: '0',\n transform: 'scale(0.7)',\n },\n to: {\n opacity: '1',\n transform: 'scale(1)',\n },\n },\n fadeOut: {\n from: {\n opacity: '1',\n transform: 'scale(1)',\n },\n to: {\n opacity: '0',\n transform: 'scale(0.7)',\n },\n },\n grow: {\n from: { transform: 'scale(0.5)' },\n to: { transform: 'scale(1)' },\n },\n loading: {\n '0%, 100%, 80%': { transform: 'scale(0)' },\n '40%': { transform: 'scale(1)' },\n },\n progressWave: {\n '0%': {\n strokeDasharray: 'var(--progress-wave-start)',\n strokeDashoffset: '0',\n },\n '100%': {\n strokeDasharray: 'var(--progress-wave-end)',\n strokeDashoffset: 'var(--progress-wave-full)',\n },\n '50%': {\n strokeDasharray: 'var(--progress-wave-mid)',\n strokeDashoffset: 'var(--progress-wave-offset)',\n },\n },\n progressWaveRotate: {\n '0%': { transform: 'rotate(-90deg)' },\n '100%': { transform: 'rotate(270deg)' },\n },\n saveButtonPulse: {\n '0%': { transform: 'scale(1)' },\n '35%': { transform: 'scale(1.08)' },\n '65%': { transform: 'scale(0.97)' },\n '100%': { transform: 'scale(1)' },\n },\n saveButtonWiggle: {\n '0%, 100%': { transform: 'rotate(0deg) scale(1)' },\n '10%': { transform: 'rotate(-4deg) scale(1.02)' },\n '25%': { transform: 'rotate(3.5deg) scale(1.02)' },\n '40%': { transform: 'rotate(-2.5deg) scale(1.015)' },\n '55%': { transform: 'rotate(2deg) scale(1.015)' },\n '70%': { transform: 'rotate(-1deg) scale(1.01)' },\n '85%': { transform: 'rotate(0.5deg) scale(1)' },\n },\n saveHeartColorFlash: {\n '0%': {\n fill: 'rgb(var(--hui-save-color-critical-500, var(--color-critical-500)))',\n },\n '40%': {\n fill: 'rgb(var(--hui-save-color-critical-300, var(--color-critical-300)))',\n },\n '60%': {\n fill: 'rgb(var(--hui-save-color-critical-500, var(--color-critical-500)))',\n },\n '100%': {\n fill: 'rgb(var(--hui-save-color-critical-500, var(--color-critical-500)))',\n },\n },\n saveHeartPop: {\n '0%': { transform: 'scale(1)' },\n '20%': { transform: 'scale(0.6)' },\n '60%': { transform: 'scale(1.35)' },\n '100%': { transform: 'scale(1)' },\n },\n saveHeartTwirlBloom: {\n '0%': { transform: 'rotateY(0deg) scale(1)' },\n '30%': { transform: 'rotateY(54deg) scale(1.15)' },\n '100%': { transform: 'rotateY(180deg) scale(1)' },\n },\n saveLabelShimmer: {\n '0%': { backgroundPosition: '200% center' },\n '100%': { backgroundPosition: '-200% center' },\n },\n shrink: {\n from: { transform: 'scale(1)' },\n to: { transform: 'scale(0.5)' },\n },\n slideDown: {\n '0%': { opacity: '1', transform: 'translateY(0)' },\n '100%': { opacity: '0', transform: 'translateY(100%)' },\n },\n slideUp: {\n '0%': { opacity: '0', transform: 'translateY(100%)' },\n '100%': { opacity: '1', transform: 'translateY(0)' },\n },\n },\n\n maxWidth: width,\n minWidth: width,\n spacing,\n width,\n },\n fontFamily,\n screens,\n};\n\nexport const pluginComponentStyles = {\n '.hui-autofill-transparent': {\n '&:-webkit-autofill': autofillStyles,\n '&:-webkit-autofill:active': autofillStyles,\n '&:-webkit-autofill:focus': autofillStyles,\n '&:-webkit-autofill:hover': autofillStyles,\n },\n '.hui-focus-visible-outline': {\n '@apply focus-visible:outline-focus-primary focus-visible:outline focus-visible:outline-4': {},\n },\n '.hui-focus-visible-outline-inverse': {\n '@apply focus-visible:outline-focus-inverse focus-visible:outline focus-visible:outline-4': {},\n },\n '.scrollbar-default': {\n /* Safari and Chrome */\n '&::-webkit-scrollbar': {\n display: 'block',\n },\n /* IE and Edge */\n '-ms-overflow-style': 'auto',\n /* Firefox */\n 'scrollbar-width': 'auto',\n },\n '.scrollbar-hide': {\n /* Safari and Chrome */\n '&::-webkit-scrollbar': {\n display: 'none',\n },\n /* IE and Edge */\n '-ms-overflow-style': 'none',\n /* Firefox */\n 'scrollbar-width': 'none',\n },\n};\n\n// Save/Favorite button keyframes — emitted unconditionally via addBase so they are\n// available in all consumer builds regardless of Tailwind content scanning.\n// The corresponding animate-* utilities are registered in theme.extend.animation.\nexport const pluginBaseStyles = {\n '@keyframes saveButtonWiggle': {\n '0%, 100%': { transform: 'rotate(0deg) scale(1)' },\n '10%': { transform: 'rotate(-4deg) scale(1.02)' },\n '25%': { transform: 'rotate(3.5deg) scale(1.02)' },\n '40%': { transform: 'rotate(-2.5deg) scale(1.015)' },\n '55%': { transform: 'rotate(2deg) scale(1.015)' },\n '70%': { transform: 'rotate(-1deg) scale(1.01)' },\n '85%': { transform: 'rotate(0.5deg) scale(1)' },\n },\n '@keyframes saveHeartTwirlBloom': {\n '0%': { transform: 'rotateY(0deg) scale(1)' },\n '30%': { transform: 'rotateY(54deg) scale(1.15)' },\n '100%': { transform: 'rotateY(180deg) scale(1)' },\n },\n '@keyframes saveHeartColorFlash': {\n '0%': {\n fill: 'rgb(var(--hui-save-color-critical-500, var(--color-critical-500)))',\n },\n '40%': {\n fill: 'rgb(var(--hui-save-color-critical-300, var(--color-critical-300)))',\n },\n '60%': {\n fill: 'rgb(var(--hui-save-color-critical-500, var(--color-critical-500)))',\n },\n '100%': {\n fill: 'rgb(var(--hui-save-color-critical-500, var(--color-critical-500)))',\n },\n },\n '@keyframes saveLabelShimmer': {\n '0%': { backgroundPosition: '200% center' },\n '100%': { backgroundPosition: '-200% center' },\n },\n '@keyframes saveButtonPulse': {\n '0%': { transform: 'scale(1)' },\n '35%': { transform: 'scale(1.08)' },\n '65%': { transform: 'scale(0.97)' },\n '100%': { transform: 'scale(1)' },\n },\n '@keyframes saveHeartPop': {\n '0%': { transform: 'scale(1)' },\n '20%': { transform: 'scale(0.6)' },\n '60%': { transform: 'scale(1.35)' },\n '100%': { transform: 'scale(1)' },\n },\n // Save/Favorite button animated variant — shimmer and color-flash helpers.\n // Placed in addBase (not addComponents) so Vite's PostCSS pipeline emits\n // them unconditionally. addComponents is subject to caching discrepancies\n // in this monorepo's Storybook build that prevent new rules from landing.\n '.hui-fb-shimmer': {\n lineHeight: 'normal',\n backgroundImage:\n 'linear-gradient(90deg, currentColor 0%, currentColor 20%, rgb(var(--hui-save-color-critical-200, var(--color-critical-200))) 33%, rgb(var(--hui-save-color-critical-500, var(--color-critical-500))) 50%, rgb(var(--hui-save-color-tertiary-400, var(--color-tertiary-400))) 67%, currentColor 80%, currentColor 100%)',\n backgroundSize: '200% 100%',\n backgroundClip: 'text',\n '-webkit-background-clip': 'text',\n '-webkit-text-fill-color': 'transparent',\n '@media (prefers-reduced-motion: reduce)': {\n backgroundImage: 'none !important',\n '-webkit-text-fill-color': 'currentColor !important',\n },\n },\n '.hui-fb-color-flash .hui-fb-icon-frame svg path': {\n animation: 'saveHeartColorFlash 500ms cubic-bezier(0.45, 0, 0.55, 1) 1',\n animationFillMode: 'forwards',\n },\n // Reduced-motion gating for the whole animation registry (DS-95). This replaces the\n // per-selector `animation: none` block that used to live here — see\n // `./reducedMotion` for why duration-collapse rather than removal, and why the\n // `.hui-fb-shimmer` paint block above is a deliberate exception to it.\n ...buildReducedMotionBase(),\n};\n\nexport const themePlugin = plugin(\n ({ addBase, addComponents, matchUtilities }) => {\n // https://tailwindcss.com/docs/plugins#css-in-js-syntax\n addComponents(textComponents);\n addComponents(pluginComponentStyles);\n addBase(pluginBaseStyles);\n\n matchUtilities({\n 'grid-area': (value) => {\n return {\n 'grid-area': value,\n };\n },\n });\n },\n {\n theme: tailwindTheme,\n }\n);\n"],"mappings":"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"}