@webmate-studio/builder 0.2.118 → 0.2.120

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.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@webmate-studio/builder",
3
- "version": "0.2.118",
3
+ "version": "0.2.120",
4
4
  "type": "module",
5
5
  "description": "Webmate Studio Component Builder",
6
6
  "keywords": [
@@ -7,6 +7,7 @@ function generateSemanticColorUtilities(tokens) {
7
7
  if (!tokens.colors) return '';
8
8
 
9
9
  let utilities = '\n/* Color Utilities */';
10
+ utilities += '\n@layer utilities {';
10
11
 
11
12
  // Map of all colors: token name -> utility class base name
12
13
  const colorMap = {
@@ -77,67 +78,32 @@ function generateSemanticColorUtilities(tokens) {
77
78
  // Determine which type(s) of utility classes to generate based on className prefix
78
79
  // If className already has prefix (bg-, text-, border-), generate only that variant
79
80
  // Otherwise generate all three variants
80
- // Using @utility instead of @layer utilities gives full Tailwind v4 variant support
81
- // (hover:, focus:, sm:, md:, lg:, xl:, 2xl:, etc.)
81
+
82
+ /** Helper: generate base + hover + focus for a single class */
83
+ function addUtility(cls, prop, varRef) {
84
+ if (processedClasses.has(cls)) return;
85
+ processedClasses.add(cls);
86
+ utilities += `\n.${cls} {\n ${prop}: var(${varRef});\n}`;
87
+ utilities += `\n.hover\\:${cls}:hover {\n ${prop}: var(${varRef});\n}`;
88
+ utilities += `\n.focus\\:${cls}:focus {\n ${prop}: var(${varRef});\n}`;
89
+ }
82
90
 
83
91
  if (className.startsWith('bg-')) {
84
- if (!processedClasses.has(className)) {
85
- processedClasses.add(className);
86
- utilities += `\n@utility ${className} {`;
87
- utilities += `\n background-color: var(${colorVar});`;
88
- utilities += `\n}`;
89
- }
92
+ addUtility(className, 'background-color', colorVar);
90
93
  } else if (className.startsWith('text-')) {
91
- if (!processedClasses.has(className)) {
92
- processedClasses.add(className);
93
- utilities += `\n@utility ${className} {`;
94
- utilities += `\n color: var(${colorVar});`;
95
- utilities += `\n}`;
96
- }
94
+ addUtility(className, 'color', colorVar);
97
95
  } else if (className.startsWith('border-')) {
98
- if (!processedClasses.has(className)) {
99
- processedClasses.add(className);
100
- utilities += `\n@utility ${className} {`;
101
- utilities += `\n border-color: var(${colorVar});`;
102
- utilities += `\n}`;
103
- }
96
+ addUtility(className, 'border-color', colorVar);
104
97
  } else {
105
- // No prefix: generate all three variants (for primary, secondary, etc.)
106
- const textClass = `text-${className}`;
107
- const bgClass = `bg-${className}`;
108
- const borderClass = `border-${className}`;
109
-
110
- if (!processedClasses.has(textClass)) {
111
- processedClasses.add(textClass);
112
- utilities += `\n@utility ${textClass} {`;
113
- utilities += `\n color: var(${colorVar});`;
114
- utilities += `\n}`;
115
- }
116
-
117
- if (!processedClasses.has(bgClass)) {
118
- processedClasses.add(bgClass);
119
- utilities += `\n@utility ${bgClass} {`;
120
- utilities += `\n background-color: var(${colorVar});`;
121
- utilities += `\n}`;
122
- }
123
-
124
- if (!processedClasses.has(borderClass)) {
125
- processedClasses.add(borderClass);
126
- utilities += `\n@utility ${borderClass} {`;
127
- utilities += `\n border-color: var(${colorVar});`;
128
- utilities += `\n}`;
129
- }
98
+ addUtility(`text-${className}`, 'color', colorVar);
99
+ addUtility(`bg-${className}`, 'background-color', colorVar);
100
+ addUtility(`border-${className}`, 'border-color', colorVar);
130
101
  }
131
102
  }
132
103
 
133
104
  // Generate opacity variants for all color utilities using color-mix()
134
- // These use @layer utilities (not @utility) because @utility doesn't support slash in names.
135
- // Opacity variants don't need responsive/hover support — the base class handles that.
136
105
  const opacitySteps = [10, 20, 30, 40, 50, 60, 70, 80, 90];
137
106
 
138
- utilities += '\n\n/* Opacity Variants */';
139
- utilities += '\n@layer utilities {';
140
-
141
107
  for (const [tokenKey, className] of Object.entries(colorMap)) {
142
108
  if (!tokens.colors[tokenKey]) continue;
143
109
  const colorVar = `--color-${tokenKey.replace(/([A-Z])/g, '-$1').toLowerCase()}`;
@@ -1012,7 +978,9 @@ body {
1012
978
 
1013
979
  // Generate utility classes for buttons
1014
980
  if (tokens.buttons) {
981
+ // IMPORTANT: Buttons in @layer components so Tailwind utilities (rounded-full, etc.) can override
1015
982
  globalStyles += '\n\n/* Button Utilities */';
983
+ globalStyles += '\n@layer components {';
1016
984
 
1017
985
  // Base button class
1018
986
  globalStyles += `\n.btn {
@@ -1058,6 +1026,8 @@ body {
1058
1026
  border-color: var(--button-${variantName}-border-hover);
1059
1027
  }`;
1060
1028
  }
1029
+
1030
+ globalStyles += '\n}'; // Close @layer components
1061
1031
  }
1062
1032
 
1063
1033
  // Add responsive media queries for textStyles (OUTSIDE @theme block!)