tailwind-to-style 2.5.2 → 2.6.1

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.
@@ -1,5 +1,5 @@
1
1
  /**
2
- * tailwind-to-style v2.5.2
2
+ * tailwind-to-style v2.6.1
3
3
  * Convert tailwind classes to inline style
4
4
  *
5
5
  * @author Bigetion
@@ -1351,8 +1351,15 @@ const theme = {
1351
1351
  }
1352
1352
  };
1353
1353
 
1354
+ const vars = {
1355
+ transform: `transform: translateX(var(--transform-translate-x, 0)) translateY(var(--transform-translate-y, 0)) rotate(var(--transform-rotate, 0)) skewX(var(--transform-skew-x, 0)) skewY(var(--transform-skew-y, 0)) scaleX(var(--transform-scale-x, 1)) scaleY(var(--transform-scale-y, 1));`,
1356
+ filter: `filter: blur(var(--blur, 0)) brightness(var(--brightness, 1)) contrast(var(--contrast, 1)) grayscale(var(--grayscale, 0)) hue-rotate(var(--hue-rotate, 0deg)) invert(var(--invert, 0)) saturate(var(--saturate, 1)) sepia(var(--sepia, 0)) drop-shadow(var(--drop-shadow, 0 0 #0000));`,
1357
+ backdropFilter: `-webkit-backdrop-filter: blur(var(--backdrop-blur, 0)) brightness(var(--backdrop-brightness, 1)) contrast(var(--backdrop-contrast, 1)) grayscale(var(--backdrop-grayscale, 0)) hue-rotate(var(--backdrop-hue-rotate, 0deg)) invert(var(--backdrop-invert, 0)) opacity(var(--backdrop-opacity, 1)) saturate(var(--backdrop-saturate, 1)) sepia(var(--backdrop-sepia, 0)); backdrop-filter: blur(var(--backdrop-blur, 0)) brightness(var(--backdrop-brightness, 1)) contrast(var(--backdrop-contrast, 1)) grayscale(var(--backdrop-grayscale, 0)) hue-rotate(var(--backdrop-hue-rotate, 0deg)) invert(var(--backdrop-invert, 0)) opacity(var(--backdrop-opacity, 1)) saturate(var(--backdrop-saturate, 1)) sepia(var(--backdrop-sepia, 0));`
1358
+ };
1359
+
1354
1360
  const configOptions = {
1355
- theme
1361
+ theme,
1362
+ vars
1356
1363
  };
1357
1364
 
1358
1365
  function isFunction(functionToCheck) {
@@ -1391,6 +1398,7 @@ function getConfigOptions(options = {}) {
1391
1398
  });
1392
1399
  return {
1393
1400
  prefix: "",
1401
+ ...configOptions,
1394
1402
  ...options,
1395
1403
  theme: newTheme
1396
1404
  };
@@ -1865,7 +1873,8 @@ function generator$2c(configOptions = {}) {
1865
1873
  function generator$2b(configOptions = {}) {
1866
1874
  const {
1867
1875
  prefix: globalPrefix,
1868
- theme = {}
1876
+ theme = {},
1877
+ vars = {}
1869
1878
  } = configOptions;
1870
1879
  const prefix = `${globalPrefix}blur`;
1871
1880
  const basePrefix = prefix.replace(globalPrefix, "");
@@ -1879,10 +1888,12 @@ function generator$2b(configOptions = {}) {
1879
1888
  const key = keyTmp.toLowerCase() !== "default" ? `-${keyTmp}` : "";
1880
1889
  return `
1881
1890
  ${prefix}${key} {
1882
- --blur: blur(${value}) !important;
1891
+ --blur: ${value};
1892
+ ${vars.filter}
1883
1893
  }
1884
1894
  ${prefix.replace(basePrefix, `backdrop-${basePrefix}`)}${key} {
1885
- --backdrop-blur: blur(${value}) !important;
1895
+ --backdrop-blur: ${value};
1896
+ ${vars.backdropFilter}
1886
1897
  }
1887
1898
  `;
1888
1899
  });
@@ -2279,7 +2290,8 @@ function generator$21(configOptions = {}) {
2279
2290
  function generator$20(configOptions = {}) {
2280
2291
  const {
2281
2292
  prefix: globalPrefix,
2282
- theme = {}
2293
+ theme = {},
2294
+ vars = {}
2283
2295
  } = configOptions;
2284
2296
  const prefix = `${globalPrefix}brightness`;
2285
2297
  const basePrefix = prefix.replace(globalPrefix, "");
@@ -2293,10 +2305,12 @@ function generator$20(configOptions = {}) {
2293
2305
  const key = keyTmp.toLowerCase() !== "default" ? `-${keyTmp}` : "";
2294
2306
  return `
2295
2307
  ${prefix}${key} {
2296
- --brightness: brightness(${value}) !important;
2308
+ --brightness: ${value};
2309
+ ${vars.filter}
2297
2310
  }
2298
2311
  ${prefix.replace(basePrefix, `backdrop-${basePrefix}`)}${key} {
2299
- --backdrop-brightness: brightness(${value}) !important;
2312
+ --backdrop-brightness: ${value};
2313
+ ${vars.backdropFilter}
2300
2314
  }
2301
2315
  `;
2302
2316
  });
@@ -2405,7 +2419,8 @@ function generator$1Y(configOptions = {}) {
2405
2419
  function generator$1X(configOptions = {}) {
2406
2420
  const {
2407
2421
  prefix: globalPrefix,
2408
- theme = {}
2422
+ theme = {},
2423
+ vars = {}
2409
2424
  } = configOptions;
2410
2425
  const prefix = `${globalPrefix}contrast`;
2411
2426
  const basePrefix = prefix.replace(globalPrefix, "");
@@ -2419,10 +2434,12 @@ function generator$1X(configOptions = {}) {
2419
2434
  const key = keyTmp.toLowerCase() !== "default" ? `-${keyTmp}` : "";
2420
2435
  return `
2421
2436
  ${prefix}${key} {
2422
- --contrast: contrast(${value}) !important;
2437
+ --contrast: ${value};
2438
+ ${vars.filter}
2423
2439
  }
2424
2440
  ${prefix.replace(basePrefix, `backdrop-${basePrefix}`)}${key} {
2425
- --backdrop-contrast: contrast(${value}) !important;
2441
+ --backdrop-contrast: ${value};
2442
+ ${vars.backdropFilter}
2426
2443
  }
2427
2444
  `;
2428
2445
  });
@@ -2637,34 +2654,11 @@ function generator$1P(configOptions = {}) {
2637
2654
  function generator$1O({
2638
2655
  prefix
2639
2656
  }) {
2640
- return `
2641
- ${prefix}filter {
2642
- --blur: ;
2643
- --brightness: ;
2644
- --contrast: ;
2645
- --grayscale: ;
2646
- --hue-rotate: ;
2647
- --invert: ;
2648
- --saturate: ;
2649
- --sepia: ;
2650
- --drop-shadow: ;
2651
- filter: var(--blur) var(--brightness) var(--contrast) var(--grayscale) var(--hue-rotate) var(--invert) var(--saturate) var(--sepia) var(--drop-shadow);
2652
-
2653
- --backdrop-blur: ;
2654
- --backdrop-brightness: ;
2655
- --backdrop-contrast: ;
2656
- --backdrop-grayscale: ;
2657
- --backdrop-hue-rotate: ;
2658
- --backdrop-invert: ;
2659
- --backdrop-opacity: ;
2660
- --backdrop-saturate: ;
2661
- --backdrop-sepia: ;
2662
- -webkit-backdrop-filter: var(--backdrop-blur) var(--backdrop-brightness) var(--backdrop-contrast) var(--backdrop-grayscale) var(--backdrop-hue-rotate) var(--backdrop-invert) var(--backdrop-opacity) var(--backdrop-saturate) var(--backdrop-sepia);
2663
- backdrop-filter: var(--backdrop-blur) var(--backdrop-brightness) var(--backdrop-contrast) var(--backdrop-grayscale) var(--backdrop-hue-rotate) var(--backdrop-invert) var(--backdrop-opacity) var(--backdrop-saturate) var(--backdrop-sepia);
2664
- }
2657
+ return `
2665
2658
  ${prefix}filter-none {
2666
- filter: none;
2667
- backdrop-filter: none;
2659
+ filter: none !important;
2660
+ -webkit-backdrop-filter: none !important;
2661
+ backdrop-filter: none !important;
2668
2662
  }
2669
2663
  `;
2670
2664
  }
@@ -3004,7 +2998,8 @@ function generator$1A(configOptions = {}) {
3004
2998
  function generator$1z(configOptions = {}) {
3005
2999
  const {
3006
3000
  prefix: globalPrefix,
3007
- theme = {}
3001
+ theme = {},
3002
+ vars = {}
3008
3003
  } = configOptions;
3009
3004
  const prefix = `${globalPrefix}grayscale`;
3010
3005
  const basePrefix = prefix.replace(globalPrefix, "");
@@ -3018,10 +3013,12 @@ function generator$1z(configOptions = {}) {
3018
3013
  const key = keyTmp.toLowerCase() !== "default" ? `-${keyTmp}` : "";
3019
3014
  return `
3020
3015
  ${prefix}${key} {
3021
- --grayscale: grayscale(${value}) !important;
3016
+ --grayscale: ${value};
3017
+ ${vars.filter}
3022
3018
  }
3023
3019
  ${prefix.replace(basePrefix, `backdrop-${basePrefix}`)}${key} {
3024
- --backdrop-grayscale: grayscale(${value}) !important;
3020
+ --backdrop-grayscale: ${value};
3021
+ ${vars.backdropFilter}
3025
3022
  }
3026
3023
  `;
3027
3024
  });
@@ -3299,7 +3296,8 @@ function generator$1n(configOptions = {}) {
3299
3296
  function generator$1m(configOptions = {}) {
3300
3297
  const {
3301
3298
  prefix: globalPrefix,
3302
- theme = {}
3299
+ theme = {},
3300
+ vars = {}
3303
3301
  } = configOptions;
3304
3302
  const {
3305
3303
  hueRotate = {}
@@ -3317,10 +3315,12 @@ function generator$1m(configOptions = {}) {
3317
3315
  }
3318
3316
  return `
3319
3317
  ${prefix}-${key} {
3320
- --hue-rotate: hue-rotate(${value}) !important;
3318
+ --hue-rotate: ${value};
3319
+ ${vars.filter}
3321
3320
  }
3322
3321
  ${prefix.replace(basePrefix, `backdrop-${basePrefix}`)}-${key} {
3323
- --backdrop-hue-rotate: hue-rotate(${value}) !important;
3322
+ --backdrop-hue-rotate: ${value};
3323
+ ${vars.backdropFilter}
3324
3324
  }
3325
3325
  `;
3326
3326
  });
@@ -3407,7 +3407,8 @@ function generator$1k(configOptions = {}) {
3407
3407
  function generator$1j(configOptions = {}) {
3408
3408
  const {
3409
3409
  prefix: globalPrefix,
3410
- theme = {}
3410
+ theme = {},
3411
+ vars = {}
3411
3412
  } = configOptions;
3412
3413
  const prefix = `${globalPrefix}invert`;
3413
3414
  const basePrefix = prefix.replace(globalPrefix, "");
@@ -3421,10 +3422,12 @@ function generator$1j(configOptions = {}) {
3421
3422
  const key = keyTmp.toLowerCase() !== "default" ? `-${keyTmp}` : "";
3422
3423
  return `
3423
3424
  ${prefix}${key} {
3424
- --invert: invert(${value}) !important;
3425
+ --invert: ${value};
3426
+ ${vars.filter}
3425
3427
  }
3426
3428
  ${prefix.replace(basePrefix, `backdrop-${basePrefix}`)}${key} {
3427
- --backdrop-invert: invert(${value}) !important;
3429
+ --backdrop-invert: ${value};
3430
+ ${vars.backdropFilter}
3428
3431
  }
3429
3432
  `;
3430
3433
  });
@@ -3840,7 +3843,8 @@ function generator$12(configOptions = {}) {
3840
3843
  function generator$11(configOptions = {}) {
3841
3844
  const {
3842
3845
  prefix: globalPrefix,
3843
- theme = {}
3846
+ theme = {},
3847
+ vars = {}
3844
3848
  } = configOptions;
3845
3849
  const prefix = `${globalPrefix}opacity`;
3846
3850
  const basePrefix = prefix.replace(globalPrefix, "");
@@ -3853,9 +3857,11 @@ function generator$11(configOptions = {}) {
3853
3857
  const cssString = getCssByOptions(opacity, (key, value) => `
3854
3858
  ${prefix}-${key} {
3855
3859
  opacity: ${value};
3860
+ ${vars.filter}
3856
3861
  }
3857
3862
  ${prefix.replace(basePrefix, `backdrop-${basePrefix}`)}-${key} {
3858
- --backdrop-opacity: opacity(${value});
3863
+ --backdrop-opacity: ${value};
3864
+ ${vars.backdropFilter}
3859
3865
  }
3860
3866
  `);
3861
3867
  return cssString;
@@ -4394,7 +4400,8 @@ function generator$J(configOptions = {}) {
4394
4400
  function generator$I(configOptions = {}) {
4395
4401
  const {
4396
4402
  prefix: globalPrefix,
4397
- theme = {}
4403
+ theme = {},
4404
+ vars = {}
4398
4405
  } = configOptions;
4399
4406
  const prefix = `${globalPrefix}saturate`;
4400
4407
  const basePrefix = prefix.replace(globalPrefix, "");
@@ -4408,10 +4415,12 @@ function generator$I(configOptions = {}) {
4408
4415
  const key = keyTmp.toLowerCase() !== "default" ? `-${keyTmp}` : "";
4409
4416
  return `
4410
4417
  ${prefix}${key} {
4411
- --saturate: saturate(${value}) !important;
4418
+ --saturate: ${value};
4419
+ ${vars.filter}
4412
4420
  }
4413
4421
  ${prefix.replace(basePrefix, `backdrop-${basePrefix}`)}${key} {
4414
- --backdrop-saturate: saturate(${value}) !important;
4422
+ --backdrop-saturate: ${value};
4423
+ ${vars.backdropFilter}
4415
4424
  }
4416
4425
  `;
4417
4426
  });
@@ -4423,7 +4432,8 @@ function generator$I(configOptions = {}) {
4423
4432
  function generator$H(configOptions = {}) {
4424
4433
  const {
4425
4434
  prefix: globalPrefix,
4426
- theme = {}
4435
+ theme = {},
4436
+ vars = {}
4427
4437
  } = configOptions;
4428
4438
  const {
4429
4439
  rotate = {}
@@ -4444,6 +4454,7 @@ function generator$H(configOptions = {}) {
4444
4454
  return `
4445
4455
  ${prefix}-${key} {
4446
4456
  --transform-rotate: ${value};
4457
+ ${vars.transform}
4447
4458
  }
4448
4459
  `;
4449
4460
  });
@@ -4455,7 +4466,8 @@ function generator$H(configOptions = {}) {
4455
4466
  function generator$G(configOptions = {}) {
4456
4467
  const {
4457
4468
  prefix: globalPrefix,
4458
- theme = {}
4469
+ theme = {},
4470
+ vars = {}
4459
4471
  } = configOptions;
4460
4472
  const prefix = `${globalPrefix}scale`;
4461
4473
  const {
@@ -4468,12 +4480,15 @@ function generator$G(configOptions = {}) {
4468
4480
  ${prefix}-${key} {
4469
4481
  --transform-scale-x: ${value};
4470
4482
  --transform-scale-y: ${value};
4483
+ ${vars.transform}
4471
4484
  }
4472
4485
  ${prefix}-x-${key} {
4473
4486
  --transform-scale-x: ${value};
4487
+ ${vars.transform}
4474
4488
  }
4475
4489
  ${prefix}-y-${key} {
4476
4490
  --transform-scale-y: ${value};
4491
+ ${vars.transform}
4477
4492
  }
4478
4493
  `);
4479
4494
  return cssString;
@@ -4691,7 +4706,8 @@ function generator$A(configOptions = {}) {
4691
4706
  function generator$z(configOptions = {}) {
4692
4707
  const {
4693
4708
  prefix: globalPrefix,
4694
- theme = {}
4709
+ theme = {},
4710
+ vars = {}
4695
4711
  } = configOptions;
4696
4712
  const prefix = `${globalPrefix}sepia`;
4697
4713
  const basePrefix = prefix.replace(globalPrefix, "");
@@ -4705,10 +4721,12 @@ function generator$z(configOptions = {}) {
4705
4721
  const key = keyTmp.toLowerCase() !== "default" ? `-${keyTmp}` : "";
4706
4722
  return `
4707
4723
  ${prefix}${key} {
4708
- --sepia: sepia(${value}) !important;
4724
+ --sepia: ${value};
4725
+ ${vars.filter}
4709
4726
  }
4710
4727
  ${prefix.replace(basePrefix, `backdrop-${basePrefix}`)}${key} {
4711
- --backdrop-sepia: sepia(${value}) !important;
4728
+ --backdrop-sepia: ${value};
4729
+ ${vars.backdropFilter}
4712
4730
  }
4713
4731
  `;
4714
4732
  });
@@ -4743,7 +4761,8 @@ function generator$y(configOptions = {}) {
4743
4761
  function generator$x(configOptions = {}) {
4744
4762
  const {
4745
4763
  prefix: globalPrefix,
4746
- theme = {}
4764
+ theme = {},
4765
+ vars = {}
4747
4766
  } = configOptions;
4748
4767
  const {
4749
4768
  skew = {}
@@ -4764,9 +4783,11 @@ function generator$x(configOptions = {}) {
4764
4783
  return `
4765
4784
  ${prefix}-x-${key} {
4766
4785
  --transform-skew-x: ${value};
4786
+ ${vars.transform}
4767
4787
  }
4768
4788
  ${prefix}-y-${key} {
4769
4789
  --transform-skew-y: ${value};
4790
+ ${vars.transform}
4770
4791
  }
4771
4792
  `;
4772
4793
  });
@@ -5338,19 +5359,9 @@ function generator$b(configOptions = {}) {
5338
5359
  function generator$a({
5339
5360
  prefix
5340
5361
  }) {
5341
- return `
5342
- ${prefix}transform {
5343
- --transform-translate-x: 0;
5344
- --transform-translate-y: 0;
5345
- --transform-rotate: 0;
5346
- --transform-skew-x: 0;
5347
- --transform-skew-y: 0;
5348
- --transform-scale-x: 1;
5349
- --transform-scale-y: 1;
5350
- transform: translateX(var(--transform-translate-x)) translateY(var(--transform-translate-y)) rotate(var(--transform-rotate)) skewX(var(--transform-skew-x)) skewY(var(--transform-skew-y)) scaleX(var(--transform-scale-x)) scaleY(var(--transform-scale-y));
5351
- }
5362
+ return `
5352
5363
  ${prefix}transform-none {
5353
- transform: none;
5364
+ transform: none !important;
5354
5365
  }
5355
5366
  `;
5356
5367
  }
@@ -5366,7 +5377,7 @@ function generator$9(configOptions = {}) {
5366
5377
  }) => {
5367
5378
  const cssString = getCssByOptions(propertyOptions, (key, value) => `
5368
5379
  ${prefix}-${key} {
5369
- transform-origin: ${value.replace("-", " ")} !important;
5380
+ transform-origin: ${value.replace("-", " ")};
5370
5381
  }
5371
5382
  `);
5372
5383
  return cssString;
@@ -5377,7 +5388,8 @@ function generator$9(configOptions = {}) {
5377
5388
  function generator$8(configOptions = {}) {
5378
5389
  const {
5379
5390
  prefix: globalPrefix,
5380
- theme = {}
5391
+ theme = {},
5392
+ vars = {}
5381
5393
  } = configOptions;
5382
5394
  const {
5383
5395
  translate = {}
@@ -5398,9 +5410,11 @@ function generator$8(configOptions = {}) {
5398
5410
  return `
5399
5411
  ${prefix}-x-${key} {
5400
5412
  --transform-translate-x: ${value};
5413
+ ${vars.transform}
5401
5414
  }
5402
5415
  ${prefix}-y-${key} {
5403
5416
  --transform-translate-y: ${value};
5417
+ ${vars.transform}
5404
5418
  }
5405
5419
  `;
5406
5420
  });
@@ -5819,10 +5833,10 @@ function parseCustomClassWithPatterns(className) {
5819
5833
  return null;
5820
5834
  }
5821
5835
 
5822
- /**
5823
- * Resolve all CSS custom properties (var) in a CSS string and output only clear CSS (no custom property)
5824
- * @param {string} cssString
5825
- * @returns {string} e.g. 'color: rgba(255,255,255,1); background: #fff;'
5836
+ /**
5837
+ * Resolve all CSS custom properties (var) in a CSS string and output only clear CSS (no custom property)
5838
+ * @param {string} cssString
5839
+ * @returns {string} e.g. 'color: rgba(255,255,255,1); background: #fff;'
5826
5840
  */
5827
5841
  function resolveCssToClearCss(cssString) {
5828
5842
  const customVars = {};
@@ -5982,7 +5996,7 @@ function inlineStyleToJson(styleString) {
5982
5996
  const cssResolutionCache = new Map();
5983
5997
  function separateAndResolveCSS(arr) {
5984
5998
  // Perbaiki: cacheKey harus unik untuk setiap input array
5985
- const cacheKey = Array.isArray(arr) ? arr.join('|') : String(arr);
5999
+ const cacheKey = Array.isArray(arr) ? arr.join("|") : String(arr);
5986
6000
  if (cssResolutionCache.has(cacheKey)) {
5987
6001
  return cssResolutionCache.get(cacheKey);
5988
6002
  }
@@ -6052,11 +6066,11 @@ function debounce(func, wait = 100) {
6052
6066
  };
6053
6067
  }
6054
6068
 
6055
- /**
6056
- * Mengkonversi string kelas Tailwind menjadi inline styles CSS atau objek JSON
6057
- * @param {string} classNames - String berisi kelas Tailwind yang akan dikonversi
6058
- * @param {boolean} convertToJson - Jika true, hasil akan menjadi objek JSON, jika false menjadi string CSS
6059
- * @returns {string|Object} String CSS inline atau objek style JSON
6069
+ /**
6070
+ * Mengkonversi string kelas Tailwind menjadi inline styles CSS atau objek JSON
6071
+ * @param {string} classNames - String berisi kelas Tailwind yang akan dikonversi
6072
+ * @param {boolean} convertToJson - Jika true, hasil akan menjadi objek JSON, jika false menjadi string CSS
6073
+ * @returns {string|Object} String CSS inline atau objek style JSON
6060
6074
  */
6061
6075
  function tws(classNames, convertToJson) {
6062
6076
  if ([!classNames, typeof classNames !== "string", classNames.trim() === ""].includes(true)) {
@@ -6098,17 +6112,21 @@ function tws(classNames, convertToJson) {
6098
6112
  return cssResult;
6099
6113
  }
6100
6114
 
6101
- /**
6102
- * Menghasilkan string CSS dari objek style dengan sintaks mirip SCSS
6103
- * Mendukung nested selectors, state variants, responsive variants, dan @css directives
6104
- * @param {Object} obj - Objek dengan format style mirip SCSS
6105
- * @returns {string} String CSS yang dihasilkan
6115
+ /**
6116
+ * Menghasilkan string CSS dari objek style dengan sintaks mirip SCSS
6117
+ * Mendukung nested selectors, state variants, responsive variants, dan @css directives
6118
+ * @param {Object} obj - Objek dengan format style mirip SCSS
6119
+ * @param {Object} [options] - Opsi tambahan, misal { inject: true/false }
6120
+ * @returns {string} String CSS yang dihasilkan
6106
6121
  */
6107
- function twsx(obj) {
6122
+ function twsx(obj, options = {}) {
6108
6123
  if (!obj || typeof obj !== "object") {
6109
6124
  console.warn("twsx: Expected an object but received:", obj);
6110
6125
  return "";
6111
6126
  }
6127
+ const {
6128
+ inject = true
6129
+ } = options;
6112
6130
  const styles = {};
6113
6131
  function expandGroupedClass(input) {
6114
6132
  function expandDirectiveGroups(str) {
@@ -6363,24 +6381,59 @@ function twsx(obj) {
6363
6381
  }
6364
6382
  cssString += `}`;
6365
6383
  }
6366
- return cssString.trim();
6384
+ cssString = cssString.trim();
6385
+ if (inject && typeof window !== "undefined" && typeof document !== "undefined") {
6386
+ autoInjectCss(cssString);
6387
+ }
6388
+ return cssString;
6389
+ }
6390
+
6391
+ // Fungsi hashCode sederhana untuk deduplikasi CSS
6392
+ function getCssHash(str) {
6393
+ let hash = 0,
6394
+ i,
6395
+ chr;
6396
+ if (str.length === 0) return hash;
6397
+ for (i = 0; i < str.length; i++) {
6398
+ chr = str.charCodeAt(i);
6399
+ hash = (hash << 5) - hash + chr;
6400
+ hash |= 0; // Convert to 32bit integer
6401
+ }
6402
+ return hash;
6403
+ }
6404
+
6405
+ // Cache untuk deduplikasi auto-inject CSS pakai hash
6406
+ const injectedCssHashSet = new Set();
6407
+ function autoInjectCss(cssString) {
6408
+ if (typeof window !== "undefined" && typeof document !== "undefined") {
6409
+ const cssHash = getCssHash(cssString);
6410
+ if (injectedCssHashSet.has(cssHash)) return;
6411
+ injectedCssHashSet.add(cssHash);
6412
+ let styleTag = document.getElementById("twsx-auto-style");
6413
+ if (!styleTag) {
6414
+ styleTag = document.createElement("style");
6415
+ styleTag.id = "twsx-auto-style";
6416
+ document.head.appendChild(styleTag);
6417
+ }
6418
+ styleTag.textContent += `\n${cssString}`;
6419
+ }
6367
6420
  }
6368
6421
 
6369
6422
  // Daftarkan versi debounced dari fungsi-fungsi export
6370
- /**
6371
- * Versi debounced dari fungsi tws
6372
- * Membantu mengoptimalkan performa ketika memanggil tws berulang kali
6373
- * @param {string} classNames - String berisi kelas Tailwind yang akan dikonversi
6374
- * @param {boolean} convertToJson - Jika true, hasil akan menjadi objek JSON, jika false menjadi string CSS
6375
- * @returns {string|Object} String CSS inline atau objek style JSON
6423
+ /**
6424
+ * Versi debounced dari fungsi tws
6425
+ * Membantu mengoptimalkan performa ketika memanggil tws berulang kali
6426
+ * @param {string} classNames - String berisi kelas Tailwind yang akan dikonversi
6427
+ * @param {boolean} convertToJson - Jika true, hasil akan menjadi objek JSON, jika false menjadi string CSS
6428
+ * @returns {string|Object} String CSS inline atau objek style JSON
6376
6429
  */
6377
6430
  const debouncedTws = debounce(tws);
6378
6431
 
6379
- /**
6380
- * Versi debounced dari fungsi twsx
6381
- * Membantu mengoptimalkan performa ketika memanggil twsx berulang kali
6382
- * @param {Object} obj - Objek dengan format style mirip SCSS
6383
- * @returns {string} String CSS yang dihasilkan
6432
+ /**
6433
+ * Versi debounced dari fungsi twsx
6434
+ * Membantu mengoptimalkan performa ketika memanggil twsx berulang kali
6435
+ * @param {Object} obj - Objek dengan format style mirip SCSS
6436
+ * @returns {string} String CSS yang dihasilkan
6384
6437
  */
6385
6438
  const debouncedTwsx = debounce(twsx);
6386
6439