@bookklik/senangstart-css 0.2.9 → 0.2.10

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 (42) hide show
  1. package/dist/senangstart-css.js +254 -38
  2. package/dist/senangstart-css.min.js +191 -153
  3. package/dist/senangstart-tw.js +271 -5
  4. package/dist/senangstart-tw.min.js +1 -1
  5. package/docs/SYNTAX-REFERENCE.md +1731 -1590
  6. package/docs/guide/preflight.md +20 -1
  7. package/docs/ms/guide/preflight.md +19 -0
  8. package/docs/ms/reference/breakpoints.md +14 -0
  9. package/docs/ms/reference/visual/border-radius.md +50 -10
  10. package/docs/ms/reference/visual/contain.md +57 -0
  11. package/docs/ms/reference/visual/content-visibility.md +53 -0
  12. package/docs/ms/reference/visual/placeholder-color.md +92 -0
  13. package/docs/ms/reference/visual/writing-mode.md +53 -0
  14. package/docs/ms/reference/visual.md +6 -0
  15. package/docs/public/assets/senangstart-css.min.js +191 -153
  16. package/docs/public/llms.txt +35 -2
  17. package/docs/reference/breakpoints.md +14 -0
  18. package/docs/reference/visual/border-radius.md +50 -10
  19. package/docs/reference/visual/contain.md +57 -0
  20. package/docs/reference/visual/content-visibility.md +53 -0
  21. package/docs/reference/visual/placeholder-color.md +92 -0
  22. package/docs/reference/visual/writing-mode.md +53 -0
  23. package/docs/reference/visual.md +7 -0
  24. package/docs/syntax-reference.json +2185 -2009
  25. package/package.json +1 -1
  26. package/scripts/convert-tailwind.js +300 -26
  27. package/scripts/generate-docs.js +403 -403
  28. package/src/cdn/senangstart-engine.js +5 -5
  29. package/src/cdn/tw-conversion-engine.js +302 -5
  30. package/src/cli/commands/build.js +10 -0
  31. package/src/compiler/generators/css.js +102 -15
  32. package/src/compiler/generators/preflight.js +26 -13
  33. package/src/compiler/generators/typescript.js +3 -1
  34. package/src/compiler/index.js +27 -3
  35. package/src/compiler/parser.js +13 -6
  36. package/src/config/defaults.js +3 -0
  37. package/src/definitions/index.js +4 -1
  38. package/src/definitions/visual-performance.js +126 -0
  39. package/src/definitions/visual.js +25 -9
  40. package/src/utils/common.js +17 -5
  41. package/tests/unit/compiler/generators/css.test.js +102 -5
  42. package/tests/unit/convert-tailwind.test.js +15 -4
@@ -39,11 +39,16 @@
39
39
  if (typeof value !== "string") {
40
40
  return "";
41
41
  }
42
+ let sanitized = value;
42
43
  const dangerousChars = /[;]/g;
43
- if (dangerousChars.test(value)) {
44
- return value.replace(dangerousChars, "_");
45
- }
46
- return value;
44
+ sanitized = sanitized.replace(dangerousChars, "_");
45
+ const atRules = /@import|@charset|@namespace|@supports|@keyframes/gi;
46
+ sanitized = sanitized.replace(atRules, "");
47
+ const expression = /expression\s*\(/gi;
48
+ sanitized = sanitized.replace(expression, "");
49
+ const dangerousUrls = /(url\s*\(\s*['"]?)(javascript:|data:)([^)]*\))/gi;
50
+ sanitized = sanitized.replace(dangerousUrls, "$1about:blank$3");
51
+ return sanitized;
47
52
  }
48
53
 
49
54
  // src/core/tokenizer-core.js
@@ -221,10 +226,13 @@ hr {
221
226
  }
222
227
 
223
228
  /*
224
- * Add the correct text decoration in Chrome, Edge, and Safari
229
+ * Set default placeholder color to a semi-transparent gray
230
+ * Uses theme variable for customization with fallback
225
231
  */
226
- abbr:where([title]) {
227
- text-decoration: underline dotted;
232
+ input::placeholder,
233
+ textarea::placeholder {
234
+ opacity: 1; /* 1 */
235
+ color: var(--placeholder-color, #9ca3af); /* 2 */
228
236
  }
229
237
 
230
238
  /*
@@ -367,10 +375,17 @@ input:where([type='submit']) {
367
375
  }
368
376
 
369
377
  /*
370
- * Add the correct vertical alignment in Chrome and Firefox
378
+ * Add the correct text decoration in Chrome, Edge, and Safari
371
379
  */
372
- progress {
373
- vertical-align: baseline;
380
+ abbr:where([title]) {
381
+ text-decoration: underline dotted;
382
+ }
383
+
384
+ /*
385
+ * Make sure links don't get underlined in headings
386
+ */
387
+ h1, h2, h3, h4, h5, h6 {
388
+ text-decoration: none;
374
389
  }
375
390
 
376
391
  /*
@@ -442,14 +457,17 @@ legend {
442
457
  }
443
458
 
444
459
  /*
445
- * Remove default list styles
460
+ * 1. Use a more sensible default box-sizing strategy
446
461
  */
447
- ol,
448
- ul,
449
- menu {
450
- list-style: none;
451
- margin: 0;
452
- padding: 0;
462
+ *,
463
+ ::before,
464
+ ::after {
465
+ box-sizing: border-box;
466
+ /* Support safe-area-inset for modern devices with notches */
467
+ padding-top: env(safe-area-inset-top);
468
+ padding-right: env(safe-area-inset-right);
469
+ padding-bottom: env(safe-area-inset-bottom);
470
+ padding-left: env(safe-area-inset-left);
453
471
  }
454
472
 
455
473
  /*
@@ -3151,11 +3169,12 @@ video {
3151
3169
  var borderRadius = {
3152
3170
  name: "border-radius",
3153
3171
  property: "visual",
3154
- syntax: 'visual="rounded:[value]"',
3155
- description: "Set border radius",
3156
- descriptionMs: "Tetapkan jejari sempadan",
3172
+ syntax: 'visual="rounded:[value]" | visual="rounded-{t|b|l|r|tl|tr|bl|br}:[value]"',
3173
+ description: "Set border radius for all corners or specific corners",
3174
+ descriptionMs: "Tetapkan jejari sempadan untuk semua bucu atau bucu tertentu",
3157
3175
  category: "visual",
3158
3176
  usesScale: "radius",
3177
+ supportsArbitrary: true,
3159
3178
  values: [
3160
3179
  { value: "none", css: "border-radius: var(--r-none);", description: "No rounding", descriptionMs: "Tiada pembulatan" },
3161
3180
  { value: "small", css: "border-radius: var(--r-small);", description: "Small radius", descriptionMs: "Jejari kecil" },
@@ -3164,8 +3183,10 @@ video {
3164
3183
  { value: "round", css: "border-radius: var(--r-round);", description: "Fully round", descriptionMs: "Sepenuhnya bulat" }
3165
3184
  ],
3166
3185
  examples: [
3167
- { code: '<div visual="rounded:medium">Rounded corners</div>', description: "Medium radius" },
3168
- { code: '<div visual="rounded:round">Pill shape</div>', description: "Pill" }
3186
+ { code: '<div visual="rounded:medium">Rounded corners</div>', description: "All corners rounded" },
3187
+ { code: '<div visual="rounded:round">Pill shape</div>', description: "Fully round" },
3188
+ { code: '<div visual="rounded-t:medium">Top rounded</div>', description: "Top corners only" },
3189
+ { code: '<div visual="rounded-tl:big rounded-br:big">Opposite corners</div>', description: "Specific corners" }
3169
3190
  ],
3170
3191
  footnotes: [
3171
3192
  {
@@ -3183,12 +3204,25 @@ video {
3183
3204
  description: "Round element corners from subtle to pill-shaped",
3184
3205
  descriptionMs: "Bulatkan sudut elemen dari halus hingga berbentuk pil",
3185
3206
  html: `<div layout="flex" space="g:medium p:medium" visual="bg:neutral-100 dark:bg:neutral-900 rounded:medium">
3186
- <div space="p:small" visual="bg:primary text:white rounded:none">none</div>
3187
- <div space="p:small" visual="bg:primary text:white rounded:small">small</div>
3188
- <div space="p:small" visual="bg:primary text:white rounded:medium">medium</div>
3189
- <div space="p:small" visual="bg:primary text:white rounded:round">round</div>
3207
+ <div space="p:small" visual="bg:primary text:white rounded:none">none</div>
3208
+ <div space="p:small" visual="bg:primary text:white rounded:small">small</div>
3209
+ <div space="p:small" visual="bg:primary text:white rounded:medium">medium</div>
3210
+ <div space="p:small" visual="bg:primary text:white rounded:round">round</div>
3190
3211
  </div>`,
3191
3212
  highlightValue: "rounded:medium"
3213
+ },
3214
+ {
3215
+ title: "Directional Border Radius",
3216
+ titleMs: "Jejari Sempadan Arah",
3217
+ description: "Round specific corners for unique shapes",
3218
+ descriptionMs: "Bulatkan bucu tertentu untuk bentuk unik",
3219
+ html: `<div layout="flex" space="g:medium p:medium" visual="bg:neutral-100 dark:bg:neutral-900 rounded:medium">
3220
+ <div space="p:small" visual="bg:primary text:white rounded-t:medium">top</div>
3221
+ <div space="p:small" visual="bg:primary text:white rounded-b:medium">bottom</div>
3222
+ <div space="p:small" visual="bg:primary text:white rounded-l:medium">left</div>
3223
+ <div space="p:small" visual="bg:primary text:white rounded-r:medium">right</div>
3224
+ </div>`,
3225
+ highlightValue: "rounded-t:medium"
3192
3226
  }
3193
3227
  ]
3194
3228
  };
@@ -6828,6 +6862,112 @@ video {
6828
6862
  };
6829
6863
  var visual_svg_default = svgDefinitions;
6830
6864
 
6865
+ // src/definitions/visual-performance.js
6866
+ var contentVisibility = {
6867
+ name: "content-visibility",
6868
+ property: "visual",
6869
+ syntax: 'visual="content-visibility:[value]"',
6870
+ description: "Optimize rendering by skipping off-screen content",
6871
+ descriptionMs: "Optimumkan rendering dengan melangkau kandungan luar skrin",
6872
+ category: "visual",
6873
+ values: [
6874
+ { value: "visible", css: "content-visibility: visible;", description: "Render all content", descriptionMs: "Render semua kandungan" },
6875
+ { value: "auto", css: "content-visibility: auto;", description: "Skip when off-screen", descriptionMs: "Langkau bila luar skrin" },
6876
+ { value: "hidden", css: "content-visibility: hidden;", description: "Never render off-screen", descriptionMs: "Jangan render luar skrin" }
6877
+ ],
6878
+ examples: [
6879
+ { code: '<section visual="content-visibility:auto">Large list</section>', description: "Auto-optimize large content" },
6880
+ { code: '<div visual="content-visibility:hidden">Hidden until needed</div>', description: "Hide until revealed" }
6881
+ ],
6882
+ preview: [
6883
+ {
6884
+ title: "Content Visibility",
6885
+ titleMs: "Ketampakan Kandungan",
6886
+ description: "Performance optimization for off-screen content",
6887
+ descriptionMs: "Pengoptimuman prestasi untuk kandungan luar skrin",
6888
+ html: `<div layout="flex" space="g:medium p:medium" visual="bg:neutral-100 dark:bg:neutral-900 rounded:medium">
6889
+ <div space="p:small" visual="bg:primary text:white rounded:small">visible</div>
6890
+ <div space="p:small" visual="bg:primary text:white rounded:small">auto</div>
6891
+ <div space="p:small" visual="bg:primary text:white rounded:small">hidden</div>
6892
+ </div>`,
6893
+ highlightValue: "content-visibility:auto"
6894
+ }
6895
+ ]
6896
+ };
6897
+ var contain = {
6898
+ name: "contain",
6899
+ property: "visual",
6900
+ syntax: 'visual="contain:[value]"',
6901
+ description: "Isolate element rendering for performance",
6902
+ descriptionMs: "Pencil rendering elemen untuk prestasi",
6903
+ category: "visual",
6904
+ values: [
6905
+ { value: "none", css: "contain: none;", description: "No containment", descriptionMs: "Tiada pengandungan" },
6906
+ { value: "strict", css: "contain: strict;", description: "Full containment", descriptionMs: "Pengandungan penuh" },
6907
+ { value: "content", css: "contain: content;", description: "Content containment", descriptionMs: "Pengandungan kandungan" },
6908
+ { value: "size", css: "contain: size;", description: "Size containment", descriptionMs: "Pengandungan saiz" },
6909
+ { value: "layout", css: "contain: layout;", description: "Layout containment", descriptionMs: "Pengandungan susun atur" },
6910
+ { value: "style", css: "contain: style;", description: "Style containment", descriptionMs: "Pengandungan gaya" },
6911
+ { value: "paint", css: "contain: paint;", description: "Paint containment", descriptionMs: "Pengandungan lukis" }
6912
+ ],
6913
+ examples: [
6914
+ { code: '<div visual="contain:strict">Isolated rendering</div>', description: "Full containment" },
6915
+ { code: '<div visual="contain:content">Content isolation</div>', description: "Content only" }
6916
+ ],
6917
+ preview: [
6918
+ {
6919
+ title: "Contain",
6920
+ titleMs: "Mengandung",
6921
+ description: "Isolate element from rest of page for performance",
6922
+ descriptionMs: "Pencil elemen dari halaman lain untuk prestasi",
6923
+ html: `<div layout="flex" space="g:medium p:medium" visual="bg:neutral-100 dark:bg:neutral-900 rounded:medium">
6924
+ <div space="p:small" visual="bg:primary text:white rounded:small">none</div>
6925
+ <div space="p:small" visual="bg:primary text:white rounded:small">content</div>
6926
+ <div space="p:small" visual="bg:primary text:white rounded:small">strict</div>
6927
+ </div>`,
6928
+ highlightValue: "contain:strict"
6929
+ }
6930
+ ]
6931
+ };
6932
+ var writingMode = {
6933
+ name: "writing-mode",
6934
+ property: "visual",
6935
+ syntax: 'visual="writing-mode:[value]"',
6936
+ description: "Set writing direction for RTL/vertical text",
6937
+ descriptionMs: "Tetapkan arah penulisan untuk teks RTL/menegak",
6938
+ category: "visual",
6939
+ values: [
6940
+ { value: "horizontal-tb", css: "writing-mode: horizontal-tb;", description: "Left to right", descriptionMs: "Kiri ke kanan" },
6941
+ { value: "vertical-rl", css: "writing-mode: vertical-rl;", description: "Top to bottom RTL", descriptionMs: "Atas ke bawah RTL" },
6942
+ { value: "vertical-lr", css: "writing-mode: vertical-lr;", description: "Top to bottom LTR", descriptionMs: "Atas ke bawah LTR" },
6943
+ { value: "sideways-rl", css: "writing-mode: sideways-rl;", description: "Sideways RTL", descriptionMs: "Menyerong RTL" },
6944
+ { value: "sideways-lr", css: "writing-mode: sideways-lr;", description: "Sideways LTR", descriptionMs: "Menyerong LTR" }
6945
+ ],
6946
+ examples: [
6947
+ { code: '<div visual="writing-mode:vertical-rl">Vertical text</div>', description: "Vertical text RTL" },
6948
+ { code: '<div visual="writing-mode:horizontal-tb">Horizontal text</div>', description: "Horizontal text LTR" }
6949
+ ],
6950
+ preview: [
6951
+ {
6952
+ title: "Writing Mode",
6953
+ titleMs: "Mod Penulisan",
6954
+ description: "Control text direction and orientation",
6955
+ descriptionMs: "Kawal arah dan orientasi teks",
6956
+ html: `<div layout="flex" space="g:medium p:medium" visual="bg:neutral-100 dark:bg:neutral-900 rounded:medium">
6957
+ <div space="p:small" visual="bg:primary text:white rounded:small">horizontal-tb</div>
6958
+ <div space="p:small" visual="bg:primary text:white rounded:small">vertical-rl</div>
6959
+ </div>`,
6960
+ highlightValue: "writing-mode:vertical-rl"
6961
+ }
6962
+ ]
6963
+ };
6964
+ var performanceDefinitions = {
6965
+ contentVisibility,
6966
+ contain,
6967
+ writingMode
6968
+ };
6969
+ var visual_performance_default = performanceDefinitions;
6970
+
6831
6971
  // src/definitions/index.js
6832
6972
  var allVisualDefinitions = {
6833
6973
  ...visual_default,
@@ -6840,7 +6980,8 @@ video {
6840
6980
  ...visual_transforms_default,
6841
6981
  ...visual_borders_default,
6842
6982
  ...visual_divide_default,
6843
- ...visual_svg_default
6983
+ ...visual_svg_default,
6984
+ ...visual_performance_default
6844
6985
  };
6845
6986
  function buildAllMaps() {
6846
6987
  return {
@@ -6898,6 +7039,16 @@ video {
6898
7039
  css += ` --c-${key}: ${value};
6899
7040
  `;
6900
7041
  }
7042
+ if (theme.placeholder) {
7043
+ css += ` --placeholder-color: ${theme.placeholder};
7044
+ `;
7045
+ } else {
7046
+ css += " --placeholder-color: #9ca3af;\n";
7047
+ }
7048
+ css += " --gradient-from: transparent;\n";
7049
+ css += " --gradient-via: transparent;\n";
7050
+ css += " --gradient-to: transparent;\n";
7051
+ css += " --gradient-stops: var(--gradient-from), var(--gradient-via), var(--gradient-to);\n";
6901
7052
  for (const [key, value] of Object.entries(theme.zIndex)) {
6902
7053
  css += ` --z-${key}: ${value};
6903
7054
  `;
@@ -7025,6 +7176,9 @@ video {
7025
7176
  css += ` --tw-font-${key}: ${value};
7026
7177
  `;
7027
7178
  }
7179
+ css += " --ss-divide-x-reverse: 0;\n";
7180
+ css += " --ss-divide-y-reverse: 0;\n";
7181
+ css += " --ring-inset: 0 0 0 0;\n";
7028
7182
  css += "}\n\n";
7029
7183
  return css;
7030
7184
  }
@@ -7130,6 +7284,31 @@ video {
7130
7284
  const cssValue = isArbitrary ? value.replace(/_/g, " ") : value;
7131
7285
  return `object-position: ${cssValue};`;
7132
7286
  }
7287
+ if (property === "content-visibility") {
7288
+ return `content-visibility: ${value};`;
7289
+ }
7290
+ if (property === "contain") {
7291
+ const containMap = {
7292
+ "none": "none",
7293
+ "strict": "strict",
7294
+ "content": "content",
7295
+ "size": "size",
7296
+ "layout": "layout",
7297
+ "style": "style",
7298
+ "paint": "paint"
7299
+ };
7300
+ const cssValue = isArbitrary ? value : containMap[value] || value;
7301
+ return `contain: ${cssValue};`;
7302
+ }
7303
+ if (property === "writing") {
7304
+ const writingMap = {
7305
+ "horizontal-tb": "horizontal-tb",
7306
+ "vertical-rl": "vertical-rl",
7307
+ "vertical-lr": "vertical-lr"
7308
+ };
7309
+ const cssValue = isArbitrary ? value.replace(/_/g, " ") : writingMap[value] || value;
7310
+ return `writing-mode: ${cssValue};`;
7311
+ }
7133
7312
  const positioningPercentages = {
7134
7313
  "full": "100%",
7135
7314
  "half": "50%",
@@ -7659,32 +7838,32 @@ video {
7659
7838
  // Border width
7660
7839
  "border-w": () => {
7661
7840
  const cssValue = isArbitrary ? value : `var(--s-${value})`;
7662
- return `border-width: ${cssValue}; border-style: solid;`;
7841
+ return `border-width: ${cssValue};`;
7663
7842
  },
7664
7843
  // Border width - directional
7665
7844
  "border-t-w": () => {
7666
7845
  const cssValue = isArbitrary ? value : `var(--s-${value})`;
7667
- return `border-top-width: ${cssValue}; border-top-style: solid;`;
7846
+ return `border-top-width: ${cssValue};`;
7668
7847
  },
7669
7848
  "border-b-w": () => {
7670
7849
  const cssValue = isArbitrary ? value : `var(--s-${value})`;
7671
- return `border-bottom-width: ${cssValue}; border-bottom-style: solid;`;
7850
+ return `border-bottom-width: ${cssValue};`;
7672
7851
  },
7673
7852
  "border-l-w": () => {
7674
7853
  const cssValue = isArbitrary ? value : `var(--s-${value})`;
7675
- return `border-left-width: ${cssValue}; border-left-style: solid;`;
7854
+ return `border-left-width: ${cssValue};`;
7676
7855
  },
7677
7856
  "border-r-w": () => {
7678
7857
  const cssValue = isArbitrary ? value : `var(--s-${value})`;
7679
- return `border-right-width: ${cssValue}; border-right-style: solid;`;
7858
+ return `border-right-width: ${cssValue};`;
7680
7859
  },
7681
7860
  "border-x-w": () => {
7682
7861
  const cssValue = isArbitrary ? value : `var(--s-${value})`;
7683
- return `border-left-width: ${cssValue}; border-right-width: ${cssValue}; border-left-style: solid; border-right-style: solid;`;
7862
+ return `border-left-width: ${cssValue}; border-right-width: ${cssValue};`;
7684
7863
  },
7685
7864
  "border-y-w": () => {
7686
7865
  const cssValue = isArbitrary ? value : `var(--s-${value})`;
7687
- return `border-top-width: ${cssValue}; border-bottom-width: ${cssValue}; border-top-style: solid; border-bottom-style: solid;`;
7866
+ return `border-top-width: ${cssValue}; border-bottom-width: ${cssValue};`;
7688
7867
  },
7689
7868
  // Border style
7690
7869
  "border-style": () => {
@@ -7694,6 +7873,39 @@ video {
7694
7873
  "rounded": () => {
7695
7874
  return `border-radius: var(--r-${value});`;
7696
7875
  },
7876
+ // Directional border radius
7877
+ "rounded-t": () => {
7878
+ const cssValue = isArbitrary ? value : `var(--r-${value})`;
7879
+ return `border-top-left-radius: ${cssValue}; border-top-right-radius: ${cssValue};`;
7880
+ },
7881
+ "rounded-b": () => {
7882
+ const cssValue = isArbitrary ? value : `var(--r-${value})`;
7883
+ return `border-bottom-left-radius: ${cssValue}; border-bottom-right-radius: ${cssValue};`;
7884
+ },
7885
+ "rounded-l": () => {
7886
+ const cssValue = isArbitrary ? value : `var(--r-${value})`;
7887
+ return `border-top-left-radius: ${cssValue}; border-bottom-left-radius: ${cssValue};`;
7888
+ },
7889
+ "rounded-r": () => {
7890
+ const cssValue = isArbitrary ? value : `var(--r-${value})`;
7891
+ return `border-top-right-radius: ${cssValue}; border-bottom-right-radius: ${cssValue};`;
7892
+ },
7893
+ "rounded-tl": () => {
7894
+ const cssValue = isArbitrary ? value : `var(--r-${value})`;
7895
+ return `border-top-left-radius: ${cssValue};`;
7896
+ },
7897
+ "rounded-tr": () => {
7898
+ const cssValue = isArbitrary ? value : `var(--r-${value})`;
7899
+ return `border-top-right-radius: ${cssValue};`;
7900
+ },
7901
+ "rounded-bl": () => {
7902
+ const cssValue = isArbitrary ? value : `var(--r-${value})`;
7903
+ return `border-bottom-left-radius: ${cssValue};`;
7904
+ },
7905
+ "rounded-br": () => {
7906
+ const cssValue = isArbitrary ? value : `var(--r-${value})`;
7907
+ return `border-bottom-right-radius: ${cssValue};`;
7908
+ },
7697
7909
  // =====================
7698
7910
  // DIVIDE UTILITIES
7699
7911
  // =====================
@@ -7720,16 +7932,16 @@ video {
7720
7932
  // Divide width - all sides
7721
7933
  "divide-w": () => {
7722
7934
  const cssValue = isArbitrary ? value : `var(--s-${value})`;
7723
- return `border-width: ${cssValue}; border-style: solid;`;
7935
+ return `border-top-width: calc(${cssValue} * (1 - var(--ss-divide-y-reverse))); border-bottom-width: calc(${cssValue} * var(--ss-divide-y-reverse)); border-left-width: calc(${cssValue} * (1 - var(--ss-divide-x-reverse))); border-right-width: calc(${cssValue} * var(--ss-divide-x-reverse));`;
7724
7936
  },
7725
7937
  // Divide width - directional
7726
7938
  "divide-x-w": () => {
7727
7939
  const cssValue = isArbitrary ? value : `var(--s-${value})`;
7728
- return `border-left-width: ${cssValue}; border-right-width: ${cssValue}; border-left-style: solid; border-right-style: solid;`;
7940
+ return `border-right-width: calc(${cssValue} * var(--ss-divide-x-reverse)); border-left-width: calc(${cssValue} * (1 - var(--ss-divide-x-reverse)));`;
7729
7941
  },
7730
7942
  "divide-y-w": () => {
7731
7943
  const cssValue = isArbitrary ? value : `var(--s-${value})`;
7732
- return `border-top-width: ${cssValue}; border-bottom-width: ${cssValue}; border-top-style: solid; border-bottom-style: solid;`;
7944
+ return `border-bottom-width: calc(${cssValue} * var(--ss-divide-y-reverse)); border-top-width: calc(${cssValue} * (1 - var(--ss-divide-y-reverse)));`;
7733
7945
  },
7734
7946
  // Divide style
7735
7947
  "divide-style": () => {
@@ -7787,7 +7999,7 @@ video {
7787
7999
  "big": "8px"
7788
8000
  };
7789
8001
  const width2 = isArbitrary ? value : ringPresets[value] || (parseInt(value) ? `${value}px` : `var(--s-${value})`);
7790
- return `--ss-ring-width: ${width2}; box-shadow: var(--ss-ring-inset) 0 0 0 calc(var(--ss-ring-width) + var(--ss-ring-offset-width, 0px)) var(--ss-ring-color, currentColor);`;
8002
+ return `--ss-ring-width: ${width2}; box-shadow: var(--ring-inset) 0 0 0 calc(var(--ss-ring-width) + var(--ss-ring-offset-width, 0px)) var(--c-primary);`;
7791
8003
  },
7792
8004
  // Box shadow
7793
8005
  "shadow": () => {
@@ -8953,6 +9165,8 @@ video {
8953
9165
  // Laptop
8954
9166
  "desk": "1280px",
8955
9167
  // Desktop
9168
+ "print": "print",
9169
+ // Print media query
8956
9170
  // Tailwind Compatibility
8957
9171
  "tw-sm": "640px",
8958
9172
  "tw-md": "768px",
@@ -8961,6 +9175,8 @@ video {
8961
9175
  "tw-2xl": "1536px"
8962
9176
  },
8963
9177
  // 7. COLORS: Palette Scales
9178
+ // Placeholder color for form inputs
9179
+ placeholder: "#9ca3af",
8964
9180
  colors: {
8965
9181
  // Base colors
8966
9182
  "white": "#FFFFFF",