app-studio 0.7.2 → 0.7.5

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.
@@ -757,15 +757,15 @@ const defaultDarkColors = {
757
757
  black: '#FFFFFF'
758
758
  };
759
759
  // Centralized regex for color token detection
760
- // Matches color.x.y.z or theme.x.y
761
- const COLOR_TOKEN_REGEX = /(color\.[a-zA-Z0-9.]+|theme\.[a-zA-Z0-9.]+)/g;
760
+ // Matches color-x-y-z or theme-x-y (dash notation)
761
+ const COLOR_TOKEN_REGEX = /(color-[a-zA-Z0-9-]+|theme-[a-zA-Z0-9-]+)/g;
762
762
  /**
763
763
  * Checks if a value contains color tokens.
764
764
  * @param value - The string to check.
765
765
  * @returns True if the value contains color tokens.
766
766
  */
767
767
  const hasColorToken = value => {
768
- return value.includes('color.') || value.includes('theme.');
768
+ return value.includes('color-') || value.includes('theme-');
769
769
  };
770
770
  /**
771
771
  * Replaces color tokens in a string with values returned by a resolver function.
@@ -783,8 +783,11 @@ const replaceColorTokens = (value, resolver) => {
783
783
  };
784
784
 
785
785
  // --- Constants ---
786
- const THEME_PREFIX = 'theme.';
787
- const COLOR_PREFIX = 'color.';
786
+ // Public API prefixes (dash notation: theme-primary, color-blue-500)
787
+ const THEME_PREFIX = 'theme-';
788
+ const COLOR_PREFIX = 'color-';
789
+ const LIGHT_PREFIX = 'light-';
790
+ const DARK_PREFIX = 'dark-';
788
791
  const TRANSPARENT = 'transparent';
789
792
  // --- CSS Variable Injection Helper ---
790
793
  const generateCSSVariables = (theme, lightColors, darkColors) => {
@@ -828,21 +831,17 @@ const generateCSSVariables = (theme, lightColors, darkColors) => {
828
831
  collectGenericNames(lightColors.main, 'color');
829
832
  collectGenericNames(lightColors.palette, 'color');
830
833
  // 3. Process Theme variables (references)
834
+ // Theme config uses dash notation (color-blue-500, theme-primary)
831
835
  const processTheme = (obj, prefix) => {
832
836
  Object.keys(obj).forEach(key => {
833
837
  const value = obj[key];
834
- const variableName = `${prefix}-${key}`.replace(/\./g, '-');
838
+ const variableName = `${prefix}-${key}`;
835
839
  if (typeof value === 'object' && value !== null) {
836
840
  processTheme(value, variableName);
837
841
  } else if (typeof value === 'string') {
838
- if (value.startsWith(COLOR_PREFIX)) {
839
- // Convert 'color.blue.500' -> 'var(--color-blue-500)'
840
- // The underlying --color-blue-500 will change based on scope!
841
- const refVar = value.replace(/\./g, '-');
842
- themeVariables.push(`--${variableName}: var(--${refVar});`);
843
- } else if (value.startsWith(THEME_PREFIX)) {
844
- const refVar = value.replace(/\./g, '-');
845
- themeVariables.push(`--${variableName}: var(--${refVar});`);
842
+ if (value.startsWith('color-') || value.startsWith('theme-')) {
843
+ // Convert 'color-blue-500' -> 'var(--color-blue-500)'
844
+ themeVariables.push(`--${variableName}: var(--${value});`);
846
845
  } else {
847
846
  themeVariables.push(`--${variableName}: ${value};`);
848
847
  }
@@ -878,14 +877,16 @@ const generateCSSVariables = (theme, lightColors, darkColors) => {
878
877
  return css;
879
878
  };
880
879
  // --- Default Configuration ---
880
+ // Theme values use dash notation (color-X or color-X-shade)
881
+ // which gets resolved to CSS variables (var(--color-X-shade))
881
882
  const defaultThemeMain = {
882
- primary: `${COLOR_PREFIX}black`,
883
- secondary: `${COLOR_PREFIX}blue`,
884
- success: `${COLOR_PREFIX}green.500`,
885
- error: `${COLOR_PREFIX}red.500`,
886
- warning: `${COLOR_PREFIX}orange.500`,
887
- disabled: `${COLOR_PREFIX}gray.500`,
888
- loading: `${COLOR_PREFIX}dark.500`
883
+ primary: 'color-black',
884
+ secondary: 'color-blue',
885
+ success: 'color-green-500',
886
+ error: 'color-red-500',
887
+ warning: 'color-orange-500',
888
+ disabled: 'color-gray-500',
889
+ loading: 'color-dark-500'
889
890
  };
890
891
  const defaultLightColorConfig = {
891
892
  main: defaultLightColors,
@@ -943,9 +944,9 @@ const convertToRgba = (color, alpha) => {
943
944
  // Handle rgb/rgba colors
944
945
  if (color.startsWith('rgb')) {
945
946
  // Extract the values from rgb() or rgba()
946
- const match = color.match(/rgba?\(([^)]+)\)/);
947
- if (match) {
948
- const values = match[1].split(',').map(v => v.trim());
947
+ const rgbMatch = color.match(/rgba?\(([^)]+)\)/);
948
+ if (rgbMatch) {
949
+ const values = rgbMatch[1].split(',').map(v => v.trim());
949
950
  const r = values[0];
950
951
  const g = values[1];
951
952
  const b = values[2];
@@ -1100,83 +1101,111 @@ const ThemeProvider = _ref => {
1100
1101
  if (token === TRANSPARENT) return token;
1101
1102
  if (depth > 25) return token;
1102
1103
  const effectiveTheme = override?.theme ? deepMerge(mergedTheme, override.theme) : mergedTheme;
1103
- // Resolve theme.* tokens recursively
1104
+ // Convert dash notation to internal format for resolution
1105
+ // theme-primary-100 -> parts for processing
1104
1106
  if (token.startsWith(THEME_PREFIX)) {
1105
- const themeKey = token.substring(THEME_PREFIX.length);
1107
+ const parts = token.substring(THEME_PREFIX.length).split('-');
1108
+ const lastPart = parts[parts.length - 1];
1109
+ const maybeAlpha = parseInt(lastPart, 10);
1110
+ // Check for alpha suffix: theme-primary-100 (2+ parts after prefix, last is 0-1000)
1111
+ if (parts.length >= 2 && !isNaN(maybeAlpha) && maybeAlpha >= 0 && maybeAlpha <= 1000) {
1112
+ const themeKey = parts.slice(0, -1).join('-');
1113
+ const baseToken = `${THEME_PREFIX}${themeKey}`;
1114
+ const resolvedBase = resolveColorTokenForMode(baseToken, mode, override, depth + 1);
1115
+ return convertToRgba(resolvedBase, maybeAlpha);
1116
+ }
1117
+ const themeKey = parts.join('-');
1106
1118
  const themeValue = effectiveTheme[themeKey];
1107
1119
  if (typeof themeValue === 'string') {
1120
+ // Theme values use dash notation (color-blue-500)
1108
1121
  return resolveColorTokenForMode(themeValue, mode, override, depth + 1);
1109
1122
  }
1110
1123
  return token;
1111
1124
  }
1112
- // Resolve explicit mode paths like "light.blue.500" / "dark.blue.500"
1113
- if (token.startsWith('light.') || token.startsWith('dark.')) {
1114
- const explicitMode = token.startsWith('light.') ? 'light' : 'dark';
1115
- const prefixLength = token.startsWith('light.') ? 6 : 5;
1116
- const modifiedName = `${COLOR_PREFIX}${token.substring(prefixLength)}`;
1117
- return resolveColorTokenForMode(modifiedName, explicitMode, override, depth + 1);
1118
- }
1119
- // Resolve color.* tokens
1125
+ // Handle dash notation: color-blue-500, light-blue-500, dark-blue-500
1120
1126
  if (token.startsWith(COLOR_PREFIX)) {
1121
- const keys = token.substring(COLOR_PREFIX.length).split('.');
1127
+ const parts = token.substring(COLOR_PREFIX.length).split('-');
1122
1128
  const colorsToUse = themeColors[mode];
1123
1129
  const palette = deepMerge(colorsToUse.palette, override?.colors?.palette || {});
1124
1130
  const main = deepMerge(colorsToUse.main, override?.colors?.main || {});
1125
- if (keys.length === 3) {
1126
- // e.g. color.blue.500.200 (alpha)
1127
- const [colorName, variant, alphaStr] = keys;
1128
- const base = palette?.[colorName]?.[variant];
1129
- const alpha = parseInt(alphaStr, 10);
1130
- if (typeof base === 'string' && !isNaN(alpha)) {
1131
- return convertToRgba(base, alpha);
1131
+ // color-blue-500-200 (alpha)
1132
+ if (parts.length >= 3) {
1133
+ const lastPart = parts[parts.length - 1];
1134
+ const maybeAlpha = parseInt(lastPart, 10);
1135
+ if (!isNaN(maybeAlpha) && maybeAlpha >= 0 && maybeAlpha <= 1000) {
1136
+ const colorName = parts[0];
1137
+ const variant = parts[1];
1138
+ const base = palette?.[colorName]?.[variant];
1139
+ if (typeof base === 'string') {
1140
+ return convertToRgba(base, maybeAlpha);
1141
+ }
1132
1142
  }
1133
- return token;
1134
1143
  }
1135
- if (keys.length === 2) {
1136
- const [colorName, variant] = keys;
1144
+ // color-blue-500
1145
+ if (parts.length === 2) {
1146
+ const [colorName, variant] = parts;
1137
1147
  const value = palette?.[colorName]?.[variant];
1138
1148
  return typeof value === 'string' ? value : token;
1139
1149
  }
1140
- if (keys.length === 1) {
1141
- const [colorName] = keys;
1142
- const value = main?.[colorName];
1150
+ // color-blue
1151
+ if (parts.length === 1) {
1152
+ const value = main?.[parts[0]];
1143
1153
  return typeof value === 'string' ? value : token;
1144
1154
  }
1145
1155
  return token;
1146
1156
  }
1157
+ // Handle light-* and dark-* tokens
1158
+ if (token.startsWith(LIGHT_PREFIX) || token.startsWith(DARK_PREFIX)) {
1159
+ const explicitMode = token.startsWith(LIGHT_PREFIX) ? 'light' : 'dark';
1160
+ const prefix = token.startsWith(LIGHT_PREFIX) ? LIGHT_PREFIX : DARK_PREFIX;
1161
+ const colorPart = token.substring(prefix.length);
1162
+ return resolveColorTokenForMode(`${COLOR_PREFIX}${colorPart}`, explicitMode, override, depth + 1);
1163
+ }
1147
1164
  return token;
1148
1165
  }, [mergedTheme, themeColors]);
1149
1166
  // --- Helper function to resolve color tokens to actual values ---
1167
+ // This is used internally and handles dash notation (public API)
1150
1168
  const resolveColorToken = React.useCallback(token => {
1151
1169
  if (!token || typeof token !== 'string') return String(token);
1152
1170
  if (token === TRANSPARENT) return token;
1153
1171
  const colors = currentColors;
1154
- // Resolve color.* tokens
1172
+ // Handle dash notation: color-blue-500
1155
1173
  if (token.startsWith(COLOR_PREFIX)) {
1156
- const keys = token.substring(COLOR_PREFIX.length).split('.');
1157
- if (keys.length === 1) {
1158
- // e.g., "color.blue" -> main color
1159
- const colorValue = colors.main[keys[0]];
1160
- return typeof colorValue === 'string' ? colorValue : token;
1161
- } else if (keys.length === 2) {
1162
- // e.g., "color.blue.500" -> palette color
1163
- const [colorName, shade] = keys;
1174
+ const parts = token.substring(COLOR_PREFIX.length).split('-');
1175
+ // color-blue-500-200 (alpha)
1176
+ if (parts.length >= 3) {
1177
+ const lastPart = parts[parts.length - 1];
1178
+ const maybeAlpha = parseInt(lastPart, 10);
1179
+ if (!isNaN(maybeAlpha) && maybeAlpha >= 0 && maybeAlpha <= 1000) {
1180
+ const percentage = Math.round(maybeAlpha / 1000 * 100);
1181
+ const baseVar = `color-${parts.slice(0, -1).join('-')}`;
1182
+ return `color-mix(in srgb, var(--${baseVar}) ${percentage}%, transparent)`;
1183
+ }
1184
+ }
1185
+ // color-blue-500
1186
+ if (parts.length === 2) {
1187
+ const [colorName, shade] = parts;
1164
1188
  const shadeValue = colors.palette[colorName]?.[Number(shade)];
1165
1189
  return typeof shadeValue === 'string' ? shadeValue : token;
1166
- } else if (keys.length === 3) {
1167
- // e.g., "color.blue.500.200" -> palette color with alpha
1168
- // Use color-mix() to apply alpha via CSS variables
1169
- const [colorName, shade, alphaStr] = keys;
1170
- const alpha = parseInt(alphaStr, 10);
1171
- if (!isNaN(alpha)) {
1172
- const percentage = Math.round(alpha / 1000 * 100);
1173
- return `color-mix(in srgb, var(--color-${colorName}-${shade}) ${percentage}%, transparent)`;
1174
- }
1190
+ }
1191
+ // color-blue
1192
+ if (parts.length === 1) {
1193
+ const colorValue = colors.main[parts[0]];
1194
+ return typeof colorValue === 'string' ? colorValue : token;
1175
1195
  }
1176
1196
  }
1177
- // Resolve theme.* tokens (recursive resolution)
1197
+ // Handle dash notation: theme-primary, theme-primary-100
1178
1198
  if (token.startsWith(THEME_PREFIX)) {
1179
- const themeKey = token.substring(THEME_PREFIX.length);
1199
+ const parts = token.substring(THEME_PREFIX.length).split('-');
1200
+ const lastPart = parts[parts.length - 1];
1201
+ const maybeAlpha = parseInt(lastPart, 10);
1202
+ // theme-primary-100 (alpha)
1203
+ if (parts.length >= 2 && !isNaN(maybeAlpha) && maybeAlpha >= 0 && maybeAlpha <= 1000) {
1204
+ const percentage = Math.round(maybeAlpha / 1000 * 100);
1205
+ const baseVar = `theme-${parts.slice(0, -1).join('-')}`;
1206
+ return `color-mix(in srgb, var(--${baseVar}) ${percentage}%, transparent)`;
1207
+ }
1208
+ const themeKey = parts.join('-');
1180
1209
  const themeValue = mergedTheme[themeKey];
1181
1210
  if (typeof themeValue === 'string') {
1182
1211
  return resolveColorToken(themeValue);
@@ -1185,86 +1214,46 @@ const ThemeProvider = _ref => {
1185
1214
  return token;
1186
1215
  }, [currentColors, mergedTheme]);
1187
1216
  // The mode is now handled by the data-attribute on the container
1188
- // --- Memoized getColor function - Revised for Robustness ---
1189
- const getColor = React.useCallback((name, override) => {
1190
- if (!name || typeof name !== 'string') return String(name); // Handle invalid input
1217
+ // --- Memoized getColor function - Dash notation only ---
1218
+ const getColor = React.useCallback(name => {
1219
+ if (!name || typeof name !== 'string') return String(name);
1191
1220
  if (name === TRANSPARENT) return name;
1192
- // 1. Check for optimization (CSS vars) if no overrides
1193
- // This allows instant theme switching via CSS variables without re-render
1194
- if (!override || Object.keys(override).length === 0) {
1195
- if (name.startsWith(THEME_PREFIX)) {
1196
- return `var(--${name.replace(/\./g, '-')})`;
1197
- }
1198
- if (name.startsWith(COLOR_PREFIX)) {
1199
- const parts = name.split('.');
1200
- // Simple lookup (e.g. color.blue or color.blue.500)
1201
- if (parts.length < 4) {
1202
- return `var(--${name.replace(/\./g, '-')})`;
1203
- }
1204
- }
1221
+ // Strict Mode Check - only dash notation is supported
1222
+ if (strict && !name.startsWith(COLOR_PREFIX) && !name.startsWith(THEME_PREFIX) && !name.startsWith(LIGHT_PREFIX) && !name.startsWith(DARK_PREFIX)) {
1223
+ console.warn(`[Theme] Invalid color token: '${name}'. Use dash notation: theme-primary, color-blue-500`);
1205
1224
  }
1206
- // 2. Manual Resolution (Fallback for overrides or complex keys)
1207
- const effectiveMode = override?.themeMode ?? themeMode;
1208
- const needCache = override && Object.keys(override).length === 0;
1209
- const cacheKey = `${name}-${effectiveMode}`;
1210
- if (needCache && colorCache.has(cacheKey)) {
1211
- return colorCache.get(cacheKey);
1212
- }
1213
- // Strict Mode Check
1214
- if (strict && !name.startsWith(COLOR_PREFIX) && !name.startsWith(THEME_PREFIX) && !name.startsWith('light.') && !name.startsWith('dark.')) {
1215
- console.warn(`[Theme] Strict mode enabled: '${name}' is not a valid color token.`);
1216
- }
1217
- // 3. Select the correct color set (light/dark) based on the effective mode
1218
- const colorsToUse = themeColors[effectiveMode];
1219
- if (!colorsToUse) {
1220
- console.warn(`Color set for mode "${effectiveMode}" not found.`);
1221
- return name;
1222
- }
1223
- let resolvedColor = name;
1224
- try {
1225
- // Resolve "light.*" or "dark.*" paths directly
1226
- if (name.startsWith('light.') || name.startsWith('dark.')) {
1227
- const prefixLength = name.startsWith('light.') ? 6 : 5;
1228
- const modifiedName = `${COLOR_PREFIX}${name.substring(prefixLength)}`;
1229
- return `var(--${modifiedName.replace(/\./g, '-')})`;
1225
+ const parts = name.split('-');
1226
+ const lastPart = parts[parts.length - 1];
1227
+ const maybeAlpha = parseInt(lastPart, 10);
1228
+ // Handle theme-* tokens (e.g., theme-primary, theme-primary-100)
1229
+ if (name.startsWith(THEME_PREFIX)) {
1230
+ // Check for alpha suffix: theme-primary-100 (3+ parts, last is 0-1000)
1231
+ if (parts.length >= 3 && !isNaN(maybeAlpha) && maybeAlpha >= 0 && maybeAlpha <= 1000) {
1232
+ const baseVar = parts.slice(0, -1).join('-');
1233
+ const percentage = Math.round(maybeAlpha / 1000 * 100);
1234
+ return `color-mix(in srgb, var(--${baseVar}) ${percentage}%, transparent)`;
1230
1235
  }
1231
- // Resolve "color.*" paths
1232
- if (name.startsWith(COLOR_PREFIX)) {
1233
- const keys = name.substring(COLOR_PREFIX.length).split('.');
1234
- if (keys.length === 3) {
1235
- // e.g. "color.black.900.200" (alpha)
1236
- const [colorName, variant, alphaStr] = keys;
1237
- const palette = deepMerge(colorsToUse.palette, override?.colors?.palette || {});
1238
- const shadeValue = palette?.[colorName]?.[variant];
1239
- const alpha = parseInt(alphaStr, 10);
1240
- if (typeof shadeValue === 'string' && !isNaN(alpha)) {
1241
- resolvedColor = convertToRgba(shadeValue, alpha);
1242
- }
1243
- } else if (keys.length === 2) {
1244
- // e.g. "color.blue.500"
1245
- const [colorName, variant] = keys;
1246
- const palette = deepMerge(colorsToUse.palette, override?.colors?.palette || {});
1247
- const shadeValue = palette?.[colorName]?.[variant];
1248
- if (typeof shadeValue === 'string') {
1249
- resolvedColor = shadeValue;
1250
- }
1251
- } else if (keys.length === 1) {
1252
- // e.g. "color.blue"
1253
- const [colorName] = keys;
1254
- const main = deepMerge(colorsToUse.main, override?.colors?.main || {});
1255
- const colorValue = main?.[colorName];
1256
- if (typeof colorValue === 'string') {
1257
- resolvedColor = colorValue;
1258
- }
1259
- }
1236
+ return `var(--${name})`;
1237
+ }
1238
+ // Handle color-* tokens (e.g., color-blue-500, color-blue-500-200)
1239
+ if (name.startsWith(COLOR_PREFIX)) {
1240
+ // Check for alpha suffix: color-blue-500-200 (4+ parts, last is 0-1000)
1241
+ if (parts.length >= 4 && !isNaN(maybeAlpha) && maybeAlpha >= 0 && maybeAlpha <= 1000) {
1242
+ const baseVar = parts.slice(0, -1).join('-');
1243
+ const percentage = Math.round(maybeAlpha / 1000 * 100);
1244
+ return `color-mix(in srgb, var(--${baseVar}) ${percentage}%, transparent)`;
1260
1245
  }
1261
- } catch (e) {
1262
- console.error(`Error resolving color "${name}"`, e);
1263
- resolvedColor = name;
1246
+ return `var(--${name})`;
1264
1247
  }
1265
- if (needCache) colorCache.set(cacheKey, resolvedColor);
1266
- return resolvedColor;
1267
- }, [mergedTheme, themeColors, themeMode, colorCache, strict]);
1248
+ // Handle light-* and dark-* tokens (e.g., light-blue-500, dark-red-200)
1249
+ if (name.startsWith(LIGHT_PREFIX) || name.startsWith(DARK_PREFIX)) {
1250
+ const prefix = name.startsWith(LIGHT_PREFIX) ? LIGHT_PREFIX : DARK_PREFIX;
1251
+ const colorPart = name.substring(prefix.length);
1252
+ return `var(--${prefix}color-${colorPart})`;
1253
+ }
1254
+ // Return as-is for direct values (#hex, rgb(), etc.)
1255
+ return name;
1256
+ }, [strict]);
1268
1257
  const getColorHex = React.useCallback((name, override) => {
1269
1258
  if (!name || typeof name !== 'string') return String(name);
1270
1259
  if (name === TRANSPARENT) return '#00000000';
@@ -1298,7 +1287,7 @@ const ThemeProvider = _ref => {
1298
1287
  if (!name || typeof name !== 'string') return undefined;
1299
1288
  const effectiveMode = override?.themeMode ?? themeMode;
1300
1289
  const effectiveTheme = override?.theme ? deepMerge(mergedTheme, override.theme) : mergedTheme;
1301
- // Resolve theme.* tokens to get the underlying color token
1290
+ // Resolve theme-* tokens to get the underlying color token
1302
1291
  let colorToken = name;
1303
1292
  if (name.startsWith(THEME_PREFIX)) {
1304
1293
  const themeKey = name.substring(THEME_PREFIX.length);
@@ -1307,16 +1296,16 @@ const ThemeProvider = _ref => {
1307
1296
  colorToken = themeValue;
1308
1297
  }
1309
1298
  }
1310
- // Handle light.* or dark.* prefixes
1311
- if (colorToken.startsWith('light.') || colorToken.startsWith('dark.')) {
1312
- const prefixLength = colorToken.startsWith('light.') ? 6 : 5;
1313
- colorToken = `${COLOR_PREFIX}${colorToken.substring(prefixLength)}`;
1299
+ // Handle light-* or dark-* prefixes
1300
+ if (colorToken.startsWith(LIGHT_PREFIX) || colorToken.startsWith(DARK_PREFIX)) {
1301
+ const prefix = colorToken.startsWith(LIGHT_PREFIX) ? LIGHT_PREFIX : DARK_PREFIX;
1302
+ colorToken = `${COLOR_PREFIX}${colorToken.substring(prefix.length)}`;
1314
1303
  }
1315
- // Extract color scheme from color.* tokens (e.g., color.blue.500 -> 'blue')
1304
+ // Extract color scheme from color-* tokens (e.g., color-blue-500 -> 'blue')
1316
1305
  if (colorToken.startsWith(COLOR_PREFIX)) {
1317
- const keys = colorToken.substring(COLOR_PREFIX.length).split('.');
1318
- if (keys.length >= 1) {
1319
- return keys[0]; // Return the color scheme name (e.g., 'blue', 'pink')
1306
+ const parts = colorToken.substring(COLOR_PREFIX.length).split('-');
1307
+ if (parts.length >= 1) {
1308
+ return parts[0]; // Return the color scheme name (e.g., 'blue', 'pink')
1320
1309
  }
1321
1310
  }
1322
1311
  // Handle hex or rgba colors by finding the closest match in the palette
@@ -2702,7 +2691,7 @@ function processPseudoStyles(styles, parentPseudo, getColor, manager) {
2702
2691
  */
2703
2692
  function processEventStyles(eventName, eventStyles, getColor, manager) {
2704
2693
  const classes = [];
2705
- // Handle string shorthand (e.g., _hover: "color.red.500")
2694
+ // Handle string shorthand (e.g., _hover: "color-red-500")
2706
2695
  if (typeof eventStyles === 'string') {
2707
2696
  eventStyles = {
2708
2697
  color: eventStyles
@@ -3022,20 +3011,10 @@ const Element = /*#__PURE__*/React__default.memo(/*#__PURE__*/React.forwardRef((
3022
3011
  }
3023
3012
  const {
3024
3013
  onPress,
3025
- blend: initialBlend,
3014
+ blend,
3026
3015
  animateOn = 'Both',
3027
3016
  ...rest
3028
3017
  } = props;
3029
- let blend = initialBlend;
3030
- if (blend !== false && props.color === undefined && typeof props.children === 'string' && (as === 'span' || as === 'div' || as === 'sub' || as === 'sup')) {
3031
- const otherMediaProps = {
3032
- ...(props.on || {}),
3033
- ...(props.media || {})
3034
- };
3035
- if (otherMediaProps.color === undefined) {
3036
- blend = true;
3037
- }
3038
- }
3039
3018
  const elementRef = React.useRef(null);
3040
3019
  const setRef = React.useCallback(node => {
3041
3020
  elementRef.current = node;
@@ -4952,7 +4931,7 @@ const Skeleton = /*#__PURE__*/React__default.memo(_ref => {
4952
4931
  ...props
4953
4932
  } = _ref;
4954
4933
  return /*#__PURE__*/React__default.createElement(View, Object.assign({
4955
- backgroundColor: "color.black.300"
4934
+ backgroundColor: "color-black-300"
4956
4935
  }, props, {
4957
4936
  overflow: "hidden"
4958
4937
  }), /*#__PURE__*/React__default.createElement(View, {
@@ -1 +1 @@
1
- {"version":3,"file":"app-studio.cjs.development.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"app-studio.cjs.development.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}