frutjam 2.0.5 → 2.0.6

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 (62) hide show
  1. package/dist/base.css +1 -1
  2. package/dist/components/accordion.css +1 -1
  3. package/dist/components/alert.css +1 -1
  4. package/dist/components/avatar.css +1 -1
  5. package/dist/components/badge.css +1 -1
  6. package/dist/components/breadcrumb.css +1 -1
  7. package/dist/components/button.css +1 -1
  8. package/dist/components/card.css +1 -1
  9. package/dist/components/carousel.css +1 -1
  10. package/dist/components/chat.css +1 -1
  11. package/dist/components/checkbox.css +1 -1
  12. package/dist/components/collapsible.css +1 -1
  13. package/dist/components/combobox.css +1 -1
  14. package/dist/components/countdown.css +1 -1
  15. package/dist/components/diff.css +1 -1
  16. package/dist/components/divider.css +1 -1
  17. package/dist/components/drawer.css +1 -1
  18. package/dist/components/footer.css +1 -1
  19. package/dist/components/header.css +1 -1
  20. package/dist/components/hero.css +1 -1
  21. package/dist/components/indicator.css +1 -1
  22. package/dist/components/input.css +1 -1
  23. package/dist/components/join.css +1 -1
  24. package/dist/components/kbd.css +1 -1
  25. package/dist/components/link.css +1 -1
  26. package/dist/components/loading.css +1 -1
  27. package/dist/components/mask.css +1 -1
  28. package/dist/components/menu.css +1 -1
  29. package/dist/components/modal.css +1 -1
  30. package/dist/components/navbar.css +1 -1
  31. package/dist/components/popover.css +1 -1
  32. package/dist/components/progress.css +1 -1
  33. package/dist/components/radial-progress.css +1 -1
  34. package/dist/components/radio.css +1 -1
  35. package/dist/components/range.css +1 -1
  36. package/dist/components/rating.css +1 -1
  37. package/dist/components/select.css +1 -1
  38. package/dist/components/sidebar.css +1 -1
  39. package/dist/components/skeleton.css +1 -1
  40. package/dist/components/stat.css +1 -1
  41. package/dist/components/status.css +1 -1
  42. package/dist/components/steps.css +1 -1
  43. package/dist/components/surface.css +1 -1
  44. package/dist/components/swap.css +1 -1
  45. package/dist/components/table.css +1 -1
  46. package/dist/components/tabs.css +1 -1
  47. package/dist/components/tag.css +1 -1
  48. package/dist/components/textarea.css +1 -1
  49. package/dist/components/timeline.css +1 -1
  50. package/dist/components/toast.css +1 -1
  51. package/dist/components/toggle.css +1 -1
  52. package/dist/components/tooltip.css +1 -1
  53. package/dist/frutjam.min.css +2 -2
  54. package/dist/plugin.js +17 -3
  55. package/dist/themes/darkberry.css +1 -1
  56. package/dist/themes/snowberry.css +1 -1
  57. package/dist/utilities/headings.css +1 -1
  58. package/dist/utilities/para.css +1 -1
  59. package/dist/utilities/typography.css +1 -1
  60. package/dist/utilities/wrapper.css +1 -1
  61. package/index.js +22 -5
  62. package/package.json +3 -1
package/dist/plugin.js CHANGED
@@ -1,4 +1,4 @@
1
- /*! frutjam v2.0.5 (c) 2026 Nezanuha | MIT License | https://frutjam.com */
1
+ /*! frutjam v2.0.6 (c) 2026 Nezanuha | MIT License | https://frutjam.com */
2
2
 
3
3
  // Tailwind v4 plugin.withOptions implementation
4
4
  const plugin = {
@@ -24,6 +24,11 @@ const COMPONENTS = {"accordion":{".accordion":{"--radius-accordion":"calc(var(--
24
24
 
25
25
  const UTILITIES = {"headings":{".heading-2xl":{"--heading-size":"1.5rem ","color":"var(--color-on-base)","font-weight":"bold","text-wrap-style":"balance","font-size":"var(--heading-size)","line-height":1.15},".heading-3xl":{"--heading-size":"1.875rem ","color":"var(--color-on-base)","font-weight":"bold","text-wrap-style":"balance","font-size":"var(--heading-size)","line-height":1.15},".heading-4xl":{"--heading-size":"2.25rem ","color":"var(--color-on-base)","font-weight":"bold","text-wrap-style":"balance","font-size":"var(--heading-size)","line-height":1.15},".heading-5xl":{"--heading-size":"3rem ","color":"var(--color-on-base)","font-weight":"bold","text-wrap-style":"balance","font-size":"var(--heading-size)","line-height":1.15},".heading-6xl":{"--heading-size":"3.75rem ","color":"var(--color-on-base)","font-weight":"bold","text-wrap-style":"balance","font-size":"var(--heading-size)","line-height":1.15},".heading-7xl":{"--heading-size":"4.5rem ","color":"var(--color-on-base)","font-weight":"bold","text-wrap-style":"balance","font-size":"var(--heading-size)","line-height":1.15},".heading-8xl":{"--heading-size":"6rem ","color":"var(--color-on-base)","font-weight":"bold","text-wrap-style":"balance","font-size":"var(--heading-size)","line-height":1.15},".heading-9xl":{"--heading-size":"8rem ","color":"var(--color-on-base)","font-weight":"bold","text-wrap-style":"balance","font-size":"var(--heading-size)","line-height":1.15},".heading-lg":{"--heading-size":"1.125rem ","color":"var(--color-on-base)","font-weight":"bold","text-wrap-style":"balance","font-size":"var(--heading-size)","line-height":1.15},".heading-md":{"color":"var(--color-on-base)","font-weight":"bold","text-wrap-style":"balance","font-size":"var(--heading-size)","line-height":1.15,"--heading-size":"1rem "},".heading-sm":{"--heading-size":"0.875rem ","color":"var(--color-on-base)","font-weight":"bold","text-wrap-style":"balance","font-size":"var(--heading-size)","line-height":1.15},".heading-xl":{"--heading-size":"1.25rem ","color":"var(--color-on-base)","font-weight":"bold","text-wrap-style":"balance","font-size":"var(--heading-size)","line-height":1.15},".heading-xs":{"--heading-size":"0.75rem ","color":"var(--color-on-base)","font-weight":"bold","text-wrap-style":"balance","font-size":"var(--heading-size)","line-height":1.15},".heading":{"--heading-size":"1rem ","color":"var(--color-on-base)","font-weight":"bold","text-wrap-style":"balance","font-size":"var(--heading-size)","line-height":1.15}},"para":{".para-2xl":{"text-wrap-style":"pretty","font-size":"var(--text-2xl)","line-height":1.6},".para-3xl":{"text-wrap-style":"pretty","font-size":"var(--text-3xl)","line-height":1.6},".para-4xl":{"text-wrap-style":"pretty","font-size":"var(--text-4xl)","line-height":1.6},".para-5xl":{"text-wrap-style":"pretty","font-size":"var(--text-5xl)","line-height":1.6},".para-6xl":{"text-wrap-style":"pretty","font-size":"var(--text-6xl)","line-height":1.6},".para-7xl":{"text-wrap-style":"pretty","font-size":"var(--text-7xl)","line-height":1.6},".para-8xl":{"text-wrap-style":"pretty","font-size":"var(--text-8xl)","line-height":1.6},".para-9xl":{"text-wrap-style":"pretty","font-size":"var(--text-9xl)","line-height":1.6},".para-lg":{"text-wrap-style":"pretty","font-size":"var(--text-lg)","line-height":1.6},".para-md":{"text-wrap-style":"pretty","line-height":1.6,"font-size":"var(--text-base)"},".para-sm":{"text-wrap-style":"pretty","font-size":"var(--text-sm)","line-height":1.6},".para-xl":{"text-wrap-style":"pretty","font-size":"var(--text-xl)","line-height":1.6},".para-xs":{"text-wrap-style":"pretty","font-size":"var(--text-xs)","line-height":1.6},".para":{"text-wrap-style":"pretty","font-size":"var(--text-base)","line-height":1.6}},"typography":{".prose-frutjam":{"--tw-prose-body":"var(--color-body)","--tw-prose-headings":"var(--color-on-base)","--tw-prose-lead":"var(--color-on-neutral)","--tw-prose-bold":"var(--color-on-base)","--tw-prose-links":"var(--color-primary)","--tw-prose-counters":"var(--color-neutral)","--tw-prose-bullets":"var(--color-neutral)","--tw-prose-hr":"var(--color-base-soft)","--tw-prose-quotes":"var(--color-on-base)","--tw-prose-quote-borders":"var(--color-primary)","--tw-prose-code":"var(--color-on-base)","--tw-prose-pre-code":"var(--color-on-base)","--tw-prose-pre-bg":"var(--color-base-soft)","--tw-prose-th-borders":"var(--color-base-soft)","--tw-prose-td-borders":"var(--color-base-soft)","--tw-prose-captions":"var(--color-on-neutral)","--tw-prose-kbd":"var(--color-body)","--tw-prose-invert-body":"var(--color-on-neutral)","--tw-prose-invert-headings":"var(--color-on-base)","--tw-prose-invert-links":"var(--color-primary)"}},"wrapper":{".wrapper-full":{"width":"100%","max-width":"100%","box-sizing":"border-box","margin-inline":"auto","padding-inline":"1rem","@media (width >= 40rem)":{"padding-inline":"2rem"},"@media (width >= 64rem)":{"padding-inline":"4rem"}},".wrapper-2xl":{"box-sizing":"border-box","max-width":"1536px","margin-inline":"auto","padding-inline":"1rem","@media (width >= 40rem)":{"padding-inline":"2rem"},"@media (width >= 64rem)":{"padding-inline":"4rem"}},".wrapper-lg":{"box-sizing":"border-box","max-width":"1024px","margin-inline":"auto","padding-inline":"1rem","@media (width >= 40rem)":{"padding-inline":"2rem"},"@media (width >= 64rem)":{"padding-inline":"4rem"}},".wrapper-md":{"box-sizing":"border-box","max-width":"768px","margin-inline":"auto","padding-inline":"1rem","@media (width >= 40rem)":{"padding-inline":"2rem"},"@media (width >= 64rem)":{"padding-inline":"4rem"}},".wrapper-sm":{"box-sizing":"border-box","max-width":"640px","margin-inline":"auto","padding-inline":"1rem","@media (width >= 40rem)":{"padding-inline":"2rem"},"@media (width >= 64rem)":{"padding-inline":"4rem"}},".wrapper-xl":{"box-sizing":"border-box","max-width":"1280px","margin-inline":"auto","padding-inline":"1rem","@media (width >= 40rem)":{"padding-inline":"2rem"},"@media (width >= 64rem)":{"padding-inline":"4rem"}},".wrapper-xs":{"box-sizing":"border-box","max-width":"320px","margin-inline":"auto","padding-inline":"1rem","@media (width >= 40rem)":{"padding-inline":"2rem"},"@media (width >= 64rem)":{"padding-inline":"4rem"}},".wrapper":{"box-sizing":"border-box","margin-inline":"auto","padding-inline":"1rem","@media (width >= 40rem)":{"padding-inline":"2rem"},"@media (width >= 64rem)":{"padding-inline":"4rem"}}}}
26
26
 
27
+ // Text-color semantic overrides — registered without prefix so they override Tailwind's
28
+ // theme-generated text-{color} utilities (which use --color-{color}-500 flat value).
29
+ // These use light-dark() for automatic light/dark mode contrast without dark: variants.
30
+ const TEXT_COLOR_OVERRIDES = {".text-base":{"color":"light-dark(var(--color-base-700), var(--color-base-300))"},".text-neutral":{"color":"light-dark(var(--color-neutral-700), var(--color-neutral-300))"},".text-primary":{"color":"light-dark(var(--color-primary-700), var(--color-primary-300))"},".text-secondary":{"color":"light-dark(var(--color-secondary-700), var(--color-secondary-300))"},".text-accent":{"color":"light-dark(var(--color-accent-700), var(--color-accent-300))"},".text-info":{"color":"light-dark(var(--color-info-700), var(--color-info-300))"},".text-success":{"color":"light-dark(var(--color-success-700), var(--color-success-300))"},".text-warning":{"color":"light-dark(var(--color-warning-700), var(--color-warning-300))"},".text-error":{"color":"light-dark(var(--color-error-700), var(--color-error-300))"}}
31
+
27
32
  // Color name → CSS variable mapping (mirrors @theme inline in frutjam/theme)
28
33
  const THEME_CONFIG = {"base":"var(--color-base-500)","on-base":"var(--color-on-base)","base-soft":"var(--color-base-soft)","on-base-soft":"var(--color-on-base-soft)","base-active":"var(--color-base-active)","base-50":"var(--color-base-50)","base-100":"var(--color-base-100)","base-200":"var(--color-base-200)","base-300":"var(--color-base-300)","base-400":"var(--color-base-400)","base-500":"var(--color-base-500)","base-600":"var(--color-base-600)","base-700":"var(--color-base-700)","base-800":"var(--color-base-800)","base-900":"var(--color-base-900)","base-950":"var(--color-base-950)","neutral":"var(--color-neutral-500)","on-neutral":"var(--color-on-neutral)","neutral-soft":"var(--color-neutral-soft)","on-neutral-soft":"var(--color-on-neutral-soft)","neutral-active":"var(--color-neutral-active)","neutral-50":"var(--color-neutral-50)","neutral-100":"var(--color-neutral-100)","neutral-200":"var(--color-neutral-200)","neutral-300":"var(--color-neutral-300)","neutral-400":"var(--color-neutral-400)","neutral-500":"var(--color-neutral-500)","neutral-600":"var(--color-neutral-600)","neutral-700":"var(--color-neutral-700)","neutral-800":"var(--color-neutral-800)","neutral-900":"var(--color-neutral-900)","neutral-950":"var(--color-neutral-950)","primary":"var(--color-primary-500)","on-primary":"var(--color-on-primary)","primary-soft":"var(--color-primary-soft)","on-primary-soft":"var(--color-on-primary-soft)","primary-active":"var(--color-primary-active)","primary-50":"var(--color-primary-50)","primary-100":"var(--color-primary-100)","primary-200":"var(--color-primary-200)","primary-300":"var(--color-primary-300)","primary-400":"var(--color-primary-400)","primary-500":"var(--color-primary-500)","primary-600":"var(--color-primary-600)","primary-700":"var(--color-primary-700)","primary-800":"var(--color-primary-800)","primary-900":"var(--color-primary-900)","primary-950":"var(--color-primary-950)","secondary":"var(--color-secondary-500)","on-secondary":"var(--color-on-secondary)","secondary-soft":"var(--color-secondary-soft)","on-secondary-soft":"var(--color-on-secondary-soft)","secondary-active":"var(--color-secondary-active)","secondary-50":"var(--color-secondary-50)","secondary-100":"var(--color-secondary-100)","secondary-200":"var(--color-secondary-200)","secondary-300":"var(--color-secondary-300)","secondary-400":"var(--color-secondary-400)","secondary-500":"var(--color-secondary-500)","secondary-600":"var(--color-secondary-600)","secondary-700":"var(--color-secondary-700)","secondary-800":"var(--color-secondary-800)","secondary-900":"var(--color-secondary-900)","secondary-950":"var(--color-secondary-950)","accent":"var(--color-accent-500)","on-accent":"var(--color-on-accent)","accent-soft":"var(--color-accent-soft)","on-accent-soft":"var(--color-on-accent-soft)","accent-active":"var(--color-accent-active)","accent-50":"var(--color-accent-50)","accent-100":"var(--color-accent-100)","accent-200":"var(--color-accent-200)","accent-300":"var(--color-accent-300)","accent-400":"var(--color-accent-400)","accent-500":"var(--color-accent-500)","accent-600":"var(--color-accent-600)","accent-700":"var(--color-accent-700)","accent-800":"var(--color-accent-800)","accent-900":"var(--color-accent-900)","accent-950":"var(--color-accent-950)","info":"var(--color-info-500)","on-info":"var(--color-on-info)","info-soft":"var(--color-info-soft)","on-info-soft":"var(--color-on-info-soft)","info-active":"var(--color-info-active)","info-50":"var(--color-info-50)","info-100":"var(--color-info-100)","info-200":"var(--color-info-200)","info-300":"var(--color-info-300)","info-400":"var(--color-info-400)","info-500":"var(--color-info-500)","info-600":"var(--color-info-600)","info-700":"var(--color-info-700)","info-800":"var(--color-info-800)","info-900":"var(--color-info-900)","info-950":"var(--color-info-950)","success":"var(--color-success-500)","on-success":"var(--color-on-success)","success-soft":"var(--color-success-soft)","on-success-soft":"var(--color-on-success-soft)","success-active":"var(--color-success-active)","success-50":"var(--color-success-50)","success-100":"var(--color-success-100)","success-200":"var(--color-success-200)","success-300":"var(--color-success-300)","success-400":"var(--color-success-400)","success-500":"var(--color-success-500)","success-600":"var(--color-success-600)","success-700":"var(--color-success-700)","success-800":"var(--color-success-800)","success-900":"var(--color-success-900)","success-950":"var(--color-success-950)","warning":"var(--color-warning-500)","on-warning":"var(--color-on-warning)","warning-soft":"var(--color-warning-soft)","on-warning-soft":"var(--color-on-warning-soft)","warning-active":"var(--color-warning-active)","warning-50":"var(--color-warning-50)","warning-100":"var(--color-warning-100)","warning-200":"var(--color-warning-200)","warning-300":"var(--color-warning-300)","warning-400":"var(--color-warning-400)","warning-500":"var(--color-warning-500)","warning-600":"var(--color-warning-600)","warning-700":"var(--color-warning-700)","warning-800":"var(--color-warning-800)","warning-900":"var(--color-warning-900)","warning-950":"var(--color-warning-950)","error":"var(--color-error-500)","on-error":"var(--color-on-error)","error-soft":"var(--color-error-soft)","on-error-soft":"var(--color-on-error-soft)","error-active":"var(--color-error-active)","error-50":"var(--color-error-50)","error-100":"var(--color-error-100)","error-200":"var(--color-error-200)","error-300":"var(--color-error-300)","error-400":"var(--color-error-400)","error-500":"var(--color-error-500)","error-600":"var(--color-error-600)","error-700":"var(--color-error-700)","error-800":"var(--color-error-800)","error-900":"var(--color-error-900)","error-950":"var(--color-error-950)"}
29
34
 
@@ -127,7 +132,7 @@ function remapRoot(obj, rootSelector) {
127
132
  }
128
133
 
129
134
  export default plugin.withOptions(
130
- (options = {}) => ({ addBase, addUtilities }) => {
135
+ (options = {}) => ({ addBase, addUtilities, matchUtilities, theme }) => {
131
136
  const {
132
137
  prefix = "",
133
138
  reset = true,
@@ -150,7 +155,7 @@ export default plugin.withOptions(
150
155
  if (logs) {
151
156
  const d = "\x1b[2m", r = "\x1b[0m"
152
157
  const badge = "\x1b[46m\x1b[30m frutjam \x1b[0m"
153
- console.log("\n" + badge + " " + d + "v2.0.5" + r + "\n")
158
+ console.log("\n" + badge + " " + d + "v2.0.6" + r + "\n")
154
159
  }
155
160
 
156
161
  // Base
@@ -182,6 +187,15 @@ export default plugin.withOptions(
182
187
  if (Object.keys(utils).length) addUtilities(sortUtils(utils))
183
188
  }
184
189
  }
190
+
191
+ // Text-color semantic overrides — use matchUtilities to override theme-generated text-{color}.
192
+ // addUtilities() cannot override theme utilities; matchUtilities() with explicit values can.
193
+ if (Object.keys(TEXT_COLOR_OVERRIDES).length) {
194
+ const values = Object.fromEntries(
195
+ Object.entries(TEXT_COLOR_OVERRIDES).map(([cls, style]) => [cls.slice('.text-'.length), style.color])
196
+ )
197
+ matchUtilities({ text: (value) => ({ color: value }) }, { values })
198
+ }
185
199
  },
186
200
  () => ({
187
201
  theme: {
@@ -1,2 +1,2 @@
1
- /*! frutjam v2.0.5 (c) 2026 Nezanuha | Released under the MIT License | https://frutjam.com */
1
+ /*! frutjam v2.0.6 (c) 2026 Nezanuha | Released under the MIT License | https://frutjam.com */
2
2
  @layer theme{:is([data-theme=darkberry],[data-theme=dark]){--scheme-color:dark;--border-radius:0.25rem;--color-base:oklch(10.889% 0.00301 17.398);--color-on-base:oklch(98% 0.01 270);--color-neutral:oklch(85% 0 0);--color-on-neutral:oklch(20% 0 0);--color-primary:oklch(66.385% 0.18368 285.592);--color-on-primary:oklch(10% 0.01 270);--color-secondary:oklch(65% 0.18 220);--color-on-secondary:oklch(10% 0.01 220);--color-accent:oklch(75% 0.18 50);--color-on-accent:oklch(10% 0.01 50);--color-info:oklch(91.67% .077 205.04);--color-on-info:oklch(10% 0.01 250);--color-success:oklch(65% 0.18 140);--color-on-success:oklch(10% 0.01 140);--color-warning:oklch(75% 0.20 85);--color-on-warning:oklch(10% 0.01 85);--color-error:oklch(60% 0.22 30);--color-on-error:oklch(10% 0.01 30)}}
@@ -1,2 +1,2 @@
1
- /*! frutjam v2.0.5 (c) 2026 Nezanuha | Released under the MIT License | https://frutjam.com */
1
+ /*! frutjam v2.0.6 (c) 2026 Nezanuha | Released under the MIT License | https://frutjam.com */
2
2
  @layer theme{:is([data-theme=snowberry],[data-theme=light]),:root:not([data-theme]){--scheme-color:light;--border-radius:0.25rem;--color-base:oklch(1 0 0);--color-on-base:oklch(0.22 0 0);--color-neutral:oklch(0.15 0 0);--color-on-neutral:oklch(1 0 0);--color-primary:oklch(51.1% 0.262 276.966);--color-on-primary:oklch(96.2% 0.018 272.314);--color-secondary:oklch(0.591 0.293 322.896);--color-on-secondary:oklch(1 0 0);--color-accent:oklch(0.541 0.281 293.009);--color-on-accent:oklch(1 0 0);--color-info:oklch(0.685 0.169 237.323);--color-on-info:oklch(0.15 0 0);--color-success:oklch(0.792 0.209 151.711);--color-on-success:oklch(0.15 0 0);--color-warning:oklch(0.852 0.199 91.936);--color-on-warning:oklch(0.15 0 0);--color-error:oklch(0.577 0.245 27.325);--color-on-error:oklch(1 0 0)}}
@@ -1,2 +1,2 @@
1
- /*! frutjam v2.0.5 (c) 2026 Nezanuha | Released under the MIT License | https://frutjam.com */
1
+ /*! frutjam v2.0.6 (c) 2026 Nezanuha | Released under the MIT License | https://frutjam.com */
2
2
  /*! tailwindcss v4.3.0 | MIT License | https://tailwindcss.com */.heading-2xl{--heading-size:1rem;--heading-size:1.5rem}.heading-2xl,.heading-3xl{color:var(--color-on-base);font-weight:700;text-wrap-style:balance;font-size:var(--heading-size);line-height:1.15}.heading-3xl{--heading-size:1rem;--heading-size:1.875rem}.heading-4xl{--heading-size:1rem;--heading-size:2.25rem}.heading-4xl,.heading-5xl{color:var(--color-on-base);font-weight:700;text-wrap-style:balance;font-size:var(--heading-size);line-height:1.15}.heading-5xl{--heading-size:1rem;--heading-size:3rem}.heading-6xl{--heading-size:1rem;--heading-size:3.75rem}.heading-6xl,.heading-7xl{color:var(--color-on-base);font-weight:700;text-wrap-style:balance;font-size:var(--heading-size);line-height:1.15}.heading-7xl{--heading-size:1rem;--heading-size:4.5rem}.heading-8xl{--heading-size:1rem;--heading-size:6rem}.heading-8xl,.heading-9xl{color:var(--color-on-base);font-weight:700;text-wrap-style:balance;font-size:var(--heading-size);line-height:1.15}.heading-9xl{--heading-size:1rem;--heading-size:8rem}.heading-lg{--heading-size:1rem;--heading-size:1.125rem}.heading-lg,.heading-md{color:var(--color-on-base);font-weight:700;text-wrap-style:balance;font-size:var(--heading-size);line-height:1.15}.heading-md{--heading-size:1rem}.heading-sm{--heading-size:1rem;--heading-size:0.875rem}.heading-sm,.heading-xl{color:var(--color-on-base);font-weight:700;text-wrap-style:balance;font-size:var(--heading-size);line-height:1.15}.heading-xl{--heading-size:1rem;--heading-size:1.25rem}.heading-xs{--heading-size:1rem;--heading-size:0.75rem}.heading,.heading-xs{color:var(--color-on-base);font-weight:700;text-wrap-style:balance;font-size:var(--heading-size);line-height:1.15}.heading{--heading-size:1rem}
@@ -1,2 +1,2 @@
1
- /*! frutjam v2.0.5 (c) 2026 Nezanuha | Released under the MIT License | https://frutjam.com */
1
+ /*! frutjam v2.0.6 (c) 2026 Nezanuha | Released under the MIT License | https://frutjam.com */
2
2
  /*! tailwindcss v4.3.0 | MIT License | https://tailwindcss.com */.para-2xl{font-size:var(--text-base);font-size:var(--text-2xl)}.para-2xl,.para-3xl{text-wrap-style:pretty;line-height:1.6}.para-3xl{font-size:var(--text-base);font-size:var(--text-3xl)}.para-4xl{font-size:var(--text-base);font-size:var(--text-4xl)}.para-4xl,.para-5xl{text-wrap-style:pretty;line-height:1.6}.para-5xl{font-size:var(--text-base);font-size:var(--text-5xl)}.para-6xl{font-size:var(--text-base);font-size:var(--text-6xl)}.para-6xl,.para-7xl{text-wrap-style:pretty;line-height:1.6}.para-7xl{font-size:var(--text-base);font-size:var(--text-7xl)}.para-8xl{font-size:var(--text-base);font-size:var(--text-8xl)}.para-8xl,.para-9xl{text-wrap-style:pretty;line-height:1.6}.para-9xl{font-size:var(--text-base);font-size:var(--text-9xl)}.para-lg{font-size:var(--text-base);font-size:var(--text-lg)}.para-lg,.para-md{text-wrap-style:pretty;line-height:1.6}.para-md{font-size:var(--text-base)}.para-sm{font-size:var(--text-base);font-size:var(--text-sm)}.para-sm,.para-xl{text-wrap-style:pretty;line-height:1.6}.para-xl{font-size:var(--text-base);font-size:var(--text-xl)}.para-xs{font-size:var(--text-base);font-size:var(--text-xs)}.para,.para-xs{text-wrap-style:pretty;line-height:1.6}.para{font-size:var(--text-base)}
@@ -1,2 +1,2 @@
1
- /*! frutjam v2.0.5 (c) 2026 Nezanuha | Released under the MIT License | https://frutjam.com */
1
+ /*! frutjam v2.0.6 (c) 2026 Nezanuha | Released under the MIT License | https://frutjam.com */
2
2
  .prose-frutjam{--tw-prose-body:var(--color-body);--tw-prose-headings:var(--color-on-base);--tw-prose-lead:var(--color-on-neutral);--tw-prose-bold:var(--color-on-base);--tw-prose-links:var(--color-primary);--tw-prose-counters:var(--color-neutral);--tw-prose-bullets:var(--color-neutral);--tw-prose-hr:var(--color-base-soft);--tw-prose-quotes:var(--color-on-base);--tw-prose-quote-borders:var(--color-primary);--tw-prose-code:var(--color-on-base);--tw-prose-pre-code:var(--color-on-base);--tw-prose-pre-bg:var(--color-base-soft);--tw-prose-th-borders:var(--color-base-soft);--tw-prose-td-borders:var(--color-base-soft);--tw-prose-captions:var(--color-on-neutral);--tw-prose-kbd:var(--color-body);--tw-prose-invert-body:var(--color-on-neutral);--tw-prose-invert-headings:var(--color-on-base);--tw-prose-invert-links:var(--color-primary)}
@@ -1,2 +1,2 @@
1
- /*! frutjam v2.0.5 (c) 2026 Nezanuha | Released under the MIT License | https://frutjam.com */
1
+ /*! frutjam v2.0.6 (c) 2026 Nezanuha | Released under the MIT License | https://frutjam.com */
2
2
  /*! tailwindcss v4.3.0 | MIT License | https://tailwindcss.com */.wrapper-full{width:100%;max-width:100%;box-sizing:border-box;margin-inline:auto;padding-inline:1rem;@media (width >= 40rem){padding-inline:2rem}@media (width >= 64rem){padding-inline:4rem}}.wrapper-2xl{box-sizing:border-box;max-width:1536px;margin-inline:auto;padding-inline:1rem;@media (width >= 40rem){padding-inline:2rem}@media (width >= 64rem){padding-inline:4rem}}.wrapper-lg{box-sizing:border-box;max-width:1024px;margin-inline:auto;padding-inline:1rem;@media (width >= 40rem){padding-inline:2rem}@media (width >= 64rem){padding-inline:4rem}}.wrapper-md{box-sizing:border-box;max-width:768px;margin-inline:auto;padding-inline:1rem;@media (width >= 40rem){padding-inline:2rem}@media (width >= 64rem){padding-inline:4rem}}.wrapper-sm{box-sizing:border-box;max-width:640px;margin-inline:auto;padding-inline:1rem;@media (width >= 40rem){padding-inline:2rem}@media (width >= 64rem){padding-inline:4rem}}.wrapper-xl{box-sizing:border-box;max-width:1280px;margin-inline:auto;padding-inline:1rem;@media (width >= 40rem){padding-inline:2rem}@media (width >= 64rem){padding-inline:4rem}}.wrapper-xs{box-sizing:border-box;max-width:320px;margin-inline:auto;padding-inline:1rem;@media (width >= 40rem){padding-inline:2rem}@media (width >= 64rem){padding-inline:4rem}}.wrapper{box-sizing:border-box;margin-inline:auto;padding-inline:1rem;@media (width >= 40rem){padding-inline:2rem}@media (width >= 64rem){padding-inline:4rem}}
package/index.js CHANGED
@@ -193,13 +193,19 @@ function buildCSS(prefix, themes, reset, rootSelector, include, exclude) {
193
193
 
194
194
  const combined = baseCss + "\n" + modulesCss
195
195
  const utilMap = buildUtilityMap(combined)
196
- let css = resolveCopy(combined, utilMap)
196
+
197
+ // Base CSS (theme variables, token definitions, text-color overrides) must NOT be prefixed —
198
+ // the @utility text-* declarations target the same class names as Tailwind's theme-generated
199
+ // utilities and must stay unprefixed (e.g. text-primary, not fj-text-primary).
200
+ let resolvedBase = resolveCopy(baseCss, utilMap)
201
+ let resolvedModules = resolveCopy(modulesCss, utilMap)
197
202
 
198
203
  if (rootSelector !== ":root") {
199
- css = css.replace(/:root\b/g, rootSelector)
204
+ resolvedBase = resolvedBase.replace(/:root\b/g, rootSelector)
205
+ resolvedModules = resolvedModules.replace(/:root\b/g, rootSelector)
200
206
  }
201
207
 
202
- css = applyPrefix(css, prefix)
208
+ let css = resolvedBase + "\n" + applyPrefix(resolvedModules, prefix)
203
209
 
204
210
  const customThemes = buildCustomThemes(themes)
205
211
  if (customThemes) css += "\n\n" + customThemes
@@ -212,7 +218,17 @@ function buildCSS(prefix, themes, reset, rootSelector, include, exclude) {
212
218
  css = ast.toString()
213
219
  }
214
220
 
215
- return { css, utilMap }
221
+ // Extract @utility text-* rules from base CSS and convert to plain CSS for late injection.
222
+ // In the PostCSS path, Tailwind's theme-generated text-{color} utilities take precedence over
223
+ // same-named @utility definitions. Injecting them as plain CSS at the end of @layer utilities
224
+ // via OnceExit ensures they appear after the theme-generated rules and therefore win.
225
+ const baseUtilMap = buildUtilityMap(resolvedBase)
226
+ const textColorOverrides = [...baseUtilMap.entries()]
227
+ .filter(([name]) => name.startsWith('text-'))
228
+ .map(([name, body]) => `.${name} {${body}}`)
229
+ .join('\n')
230
+
231
+ return { css, utilMap, textColorOverrides }
216
232
  }
217
233
 
218
234
  function buildLateCSS(prefix, include, exclude, utilMap = new Map()) {
@@ -284,9 +300,10 @@ export default function frutjam(options = {}) {
284
300
  const include = parseList(merged.include)
285
301
  const exclude = parseList(merged.exclude)
286
302
 
287
- const { css, utilMap } = buildCSS(prefix, themes, reset, rootSelector, include, exclude)
303
+ const { css, utilMap, textColorOverrides } = buildCSS(prefix, themes, reset, rootSelector, include, exclude)
288
304
  root.append(postcss.parse(css).nodes)
289
305
  _lateCss = buildLateCSS(prefix, include, exclude, utilMap)
306
+ if (textColorOverrides) _lateCss += '\n' + textColorOverrides
290
307
  if (logs) {
291
308
  const d = "\x1b[2m", r = "\x1b[0m"
292
309
  const badge = "\x1b[46m\x1b[30m frutjam \x1b[0m"
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "frutjam",
3
- "version": "2.0.5",
3
+ "version": "2.0.6",
4
4
  "description": "A utility-first CSS UI Library for Tailwind CSS",
5
5
  "type": "module",
6
6
  "exports": {
@@ -23,6 +23,8 @@
23
23
  "packages/"
24
24
  ],
25
25
  "style": "./dist/frutjam.min.css",
26
+ "unpkg": "./dist/frutjam.min.css",
27
+ "jsdelivr": "./dist/frutjam.min.css",
26
28
  "scripts": {
27
29
  "clean": "rimraf ./dist",
28
30
  "build:cdn": "node scripts/build-cdn.mjs",