app-studio 0.7.15 → 0.7.17
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/README.md +1 -1
- package/dist/app-studio.cjs.development.js +79 -9
- package/dist/app-studio.cjs.development.js.map +1 -1
- package/dist/app-studio.cjs.production.min.js +1 -1
- package/dist/app-studio.esm.js +79 -9
- package/dist/app-studio.esm.js.map +1 -1
- package/dist/app-studio.umd.development.js +79 -9
- package/dist/app-studio.umd.development.js.map +1 -1
- package/dist/app-studio.umd.production.min.js +1 -1
- package/dist/element/Element.types.d.ts +8 -0
- package/dist/element/css.d.ts +2 -2
- package/package.json +1 -1
package/dist/app-studio.esm.js
CHANGED
|
@@ -1696,7 +1696,7 @@ const NumberProps = /*#__PURE__*/new Set(['numberOfLines', 'fontWeight', 'timeSt
|
|
|
1696
1696
|
// Keys to exclude when passing props to the component
|
|
1697
1697
|
const excludedKeys = /*#__PURE__*/new Set([
|
|
1698
1698
|
// Standard styling props
|
|
1699
|
-
'on', 'shadow', 'only', 'media', 'css', 'widthHeight', 'paddingHorizontal', 'paddingVertical', 'marginHorizontal', 'marginVertical', 'animate', 'animateIn', 'animateOut',
|
|
1699
|
+
'on', 'shadow', 'only', 'media', 'css', 'widthHeight', 'paddingHorizontal', 'paddingVertical', 'marginHorizontal', 'marginVertical', 'animate', 'animateIn', 'animateOut', 'theme',
|
|
1700
1700
|
// Underscore-prefixed event props
|
|
1701
1701
|
'_hover', '_active', '_focus', '_visited', '_disabled', '_enabled', '_checked', '_unchecked', '_invalid', '_valid', '_required', '_optional', '_selected', '_target', '_firstChild', '_lastChild', '_onlyChild', '_firstOfType', '_lastOfType', '_empty', '_focusVisible', '_focusWithin', '_placeholder',
|
|
1702
1702
|
// Pseudo-element props
|
|
@@ -2021,6 +2021,24 @@ function hash(str) {
|
|
|
2021
2021
|
}
|
|
2022
2022
|
|
|
2023
2023
|
/* eslint-disable @typescript-eslint/no-unused-vars */
|
|
2024
|
+
// Top-level CSS shorthands that reset a wide set of longhands on conflict.
|
|
2025
|
+
// Rules for these properties are injected into a stylesheet that appears
|
|
2026
|
+
// FIRST in the document, so longhand overrides written later in source order
|
|
2027
|
+
// win the cascade regardless of which element first instantiated each class.
|
|
2028
|
+
const TIER2_SHORTHANDS = /*#__PURE__*/new Set(['all', 'background', 'border', 'borderRadius', 'font', 'margin', 'padding', 'animation', 'transition', 'flex', 'grid', 'gridTemplate', 'gridArea', 'outline', 'inset', 'gap', 'gridGap', 'listStyle', 'textDecoration', 'placeItems', 'placeContent', 'placeSelf', 'overflow', 'mask', 'columns', 'columnRule']);
|
|
2029
|
+
// Sub-shorthands: reset some longhands but are themselves reset by tier-2.
|
|
2030
|
+
// Example: `border` resets `borderColor`; `borderColor` resets `borderTopColor`.
|
|
2031
|
+
const TIER3_SUB_SHORTHANDS = /*#__PURE__*/new Set(['borderTop', 'borderRight', 'borderBottom', 'borderLeft', 'borderColor', 'borderStyle', 'borderWidth', 'borderImage', 'flexFlow', 'overflowX', 'overflowY']);
|
|
2032
|
+
function baseContextForProperty(property) {
|
|
2033
|
+
if (TIER2_SHORTHANDS.has(property)) return 'base-shorthand';
|
|
2034
|
+
if (TIER3_SUB_SHORTHANDS.has(property)) return 'base-sub';
|
|
2035
|
+
return 'base';
|
|
2036
|
+
}
|
|
2037
|
+
function overrideContextForProperty(property) {
|
|
2038
|
+
if (TIER2_SHORTHANDS.has(property)) return 'override-shorthand';
|
|
2039
|
+
if (TIER3_SUB_SHORTHANDS.has(property)) return 'override-sub';
|
|
2040
|
+
return 'override';
|
|
2041
|
+
}
|
|
2024
2042
|
// Implement a simple LRU cache for classCache
|
|
2025
2043
|
class LRUCache {
|
|
2026
2044
|
constructor(maxSize) {
|
|
@@ -2262,11 +2280,20 @@ class UtilityClassManager {
|
|
|
2262
2280
|
if (!this.styleSheets.has(targetDocument)) {
|
|
2263
2281
|
const sheetMap = {};
|
|
2264
2282
|
// Initialize all style sheets at once
|
|
2283
|
+
// Order matters: <style> tags are appended to <head> in the order
|
|
2284
|
+
// listed here, and the cascade resolves equal-specificity rules by
|
|
2285
|
+
// source order. Earlier entries cascade FIRST (lower priority), so
|
|
2286
|
+
// top-level shorthands like `border` are listed before their
|
|
2287
|
+
// sub-shorthands and longhands.
|
|
2265
2288
|
const contextIds = {
|
|
2289
|
+
'base-shorthand': 'utility-classes-base-shorthand',
|
|
2290
|
+
'base-sub': 'utility-classes-base-sub',
|
|
2266
2291
|
base: 'utility-classes-base',
|
|
2267
2292
|
pseudo: 'utility-classes-pseudo',
|
|
2268
2293
|
media: 'utility-classes-media',
|
|
2269
2294
|
modifier: 'utility-classes-modifier',
|
|
2295
|
+
'override-shorthand': 'utility-classes-override-shorthand',
|
|
2296
|
+
'override-sub': 'utility-classes-override-sub',
|
|
2270
2297
|
override: 'utility-classes-override'
|
|
2271
2298
|
};
|
|
2272
2299
|
for (const [context, id] of Object.entries(contextIds)) {
|
|
@@ -2343,7 +2370,7 @@ class UtilityClassManager {
|
|
|
2343
2370
|
}
|
|
2344
2371
|
}
|
|
2345
2372
|
getServerStyles() {
|
|
2346
|
-
const contexts = ['base', 'pseudo', 'media', 'modifier', 'override'];
|
|
2373
|
+
const contexts = ['base-shorthand', 'base-sub', 'base', 'pseudo', 'media', 'modifier', 'override-shorthand', 'override-sub', 'override'];
|
|
2347
2374
|
let css = '';
|
|
2348
2375
|
contexts.forEach(context => {
|
|
2349
2376
|
const rules = this.serverRules.get(context);
|
|
@@ -2461,12 +2488,16 @@ class UtilityClassManager {
|
|
|
2461
2488
|
});
|
|
2462
2489
|
} else {
|
|
2463
2490
|
const escapedClassName = this.escapeClassName(baseClassName);
|
|
2464
|
-
// Add rules for all necessary vendor prefixes
|
|
2465
|
-
//
|
|
2491
|
+
// Add rules for all necessary vendor prefixes.
|
|
2492
|
+
// Route to a tiered sheet (shorthand → sub → longhand) within the
|
|
2493
|
+
// passed context (base or override), so shorthand properties cascade
|
|
2494
|
+
// BEFORE their longhands regardless of which element first
|
|
2495
|
+
// instantiated each utility class.
|
|
2496
|
+
const tier = context === 'override' ? overrideContextForProperty(property) : baseContextForProperty(property);
|
|
2466
2497
|
cssProperties.forEach(prefixedProperty => {
|
|
2467
2498
|
rules.push({
|
|
2468
2499
|
rule: `.${escapedClassName} { ${prefixedProperty}: ${valueForCss}; }`,
|
|
2469
|
-
context:
|
|
2500
|
+
context: tier
|
|
2470
2501
|
});
|
|
2471
2502
|
});
|
|
2472
2503
|
}
|
|
@@ -3084,6 +3115,28 @@ function useStableStyleMemo(propsToProcess, getColor, mediaQueries, devices, man
|
|
|
3084
3115
|
}
|
|
3085
3116
|
return cacheRef.current.classes;
|
|
3086
3117
|
}
|
|
3118
|
+
const THEME_PREFIX$1 = 'theme-';
|
|
3119
|
+
// Build a getColor that resolves `theme-*` tokens against a component-scoped
|
|
3120
|
+
// theme override before falling back to the global getColor. Tokens not
|
|
3121
|
+
// covered by the override (color-*, light-*, dark-*, theme-* keys not in the
|
|
3122
|
+
// override) pass straight through.
|
|
3123
|
+
function makeScopedGetColor(componentTheme, baseGetColor) {
|
|
3124
|
+
return name => {
|
|
3125
|
+
if (!name || typeof name !== 'string') return String(name);
|
|
3126
|
+
if (!name.startsWith(THEME_PREFIX$1)) return baseGetColor(name);
|
|
3127
|
+
const parts = name.substring(THEME_PREFIX$1.length).split('-');
|
|
3128
|
+
const lastPart = parts[parts.length - 1];
|
|
3129
|
+
const maybeAlpha = parseInt(lastPart, 10);
|
|
3130
|
+
const hasAlpha = parts.length >= 2 && !isNaN(maybeAlpha) && maybeAlpha >= 0 && maybeAlpha <= 1000;
|
|
3131
|
+
const themeKey = hasAlpha ? parts.slice(0, -1).join('-') : parts.join('-');
|
|
3132
|
+
const overrideValue = componentTheme[themeKey];
|
|
3133
|
+
if (typeof overrideValue !== 'string') return baseGetColor(name);
|
|
3134
|
+
const resolved = baseGetColor(overrideValue);
|
|
3135
|
+
if (!hasAlpha) return resolved;
|
|
3136
|
+
const percentage = Math.round(maybeAlpha / 1000 * 100);
|
|
3137
|
+
return `color-mix(in srgb, ${resolved} ${percentage}%, transparent)`;
|
|
3138
|
+
};
|
|
3139
|
+
}
|
|
3087
3140
|
const Element = /*#__PURE__*/React.memo(/*#__PURE__*/forwardRef((_ref, ref) => {
|
|
3088
3141
|
let {
|
|
3089
3142
|
as = 'div',
|
|
@@ -3098,6 +3151,7 @@ const Element = /*#__PURE__*/React.memo(/*#__PURE__*/forwardRef((_ref, ref) => {
|
|
|
3098
3151
|
onPress,
|
|
3099
3152
|
blend,
|
|
3100
3153
|
animateOn = 'Both',
|
|
3154
|
+
theme: componentTheme,
|
|
3101
3155
|
...rest
|
|
3102
3156
|
} = props;
|
|
3103
3157
|
const elementRef = useRef(null);
|
|
@@ -3113,6 +3167,17 @@ const Element = /*#__PURE__*/React.memo(/*#__PURE__*/forwardRef((_ref, ref) => {
|
|
|
3113
3167
|
getColor,
|
|
3114
3168
|
theme
|
|
3115
3169
|
} = useTheme();
|
|
3170
|
+
// When a component-level `theme` prop is supplied, wrap getColor so
|
|
3171
|
+
// `theme-*` tokens resolve against the override first. Memoize on a
|
|
3172
|
+
// serialized signature so the function identity stays stable across
|
|
3173
|
+
// renders that don't change the override.
|
|
3174
|
+
const componentThemeKey = componentTheme ? Object.entries(componentTheme).map(_ref2 => {
|
|
3175
|
+
let [k, v] = _ref2;
|
|
3176
|
+
return `${k}=${v}`;
|
|
3177
|
+
}).join('|') : '';
|
|
3178
|
+
const scopedGetColor = useMemo(() => componentTheme ? makeScopedGetColor(componentTheme, getColor) : getColor,
|
|
3179
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
3180
|
+
[componentThemeKey, getColor]);
|
|
3116
3181
|
const {
|
|
3117
3182
|
trackEvent
|
|
3118
3183
|
} = useAnalytics();
|
|
@@ -3133,8 +3198,8 @@ const Element = /*#__PURE__*/React.memo(/*#__PURE__*/forwardRef((_ref, ref) => {
|
|
|
3133
3198
|
setIsVisible(true);
|
|
3134
3199
|
return;
|
|
3135
3200
|
}
|
|
3136
|
-
const observer = new IntersectionObserver(
|
|
3137
|
-
let [entry] =
|
|
3201
|
+
const observer = new IntersectionObserver(_ref3 => {
|
|
3202
|
+
let [entry] = _ref3;
|
|
3138
3203
|
if (entry.isIntersecting) {
|
|
3139
3204
|
setIsVisible(true);
|
|
3140
3205
|
observer.disconnect();
|
|
@@ -3203,8 +3268,13 @@ const Element = /*#__PURE__*/React.memo(/*#__PURE__*/forwardRef((_ref, ref) => {
|
|
|
3203
3268
|
return anim;
|
|
3204
3269
|
});
|
|
3205
3270
|
}
|
|
3206
|
-
// Use hash-based memoization for style extraction
|
|
3207
|
-
|
|
3271
|
+
// Use hash-based memoization for style extraction. Mix the component
|
|
3272
|
+
// theme signature into the `theme` argument so the cache invalidates
|
|
3273
|
+
// when an override changes between renders.
|
|
3274
|
+
const utilityClasses = useStableStyleMemo(propsToProcess, scopedGetColor, mediaQueries, devices, manager, componentTheme ? {
|
|
3275
|
+
...theme,
|
|
3276
|
+
__scope: componentThemeKey
|
|
3277
|
+
} : theme);
|
|
3208
3278
|
const newProps = {
|
|
3209
3279
|
ref: setRef
|
|
3210
3280
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"app-studio.esm.js","sources":[],"sourcesContent":[],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"app-studio.esm.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
|
|
@@ -1702,7 +1702,7 @@
|
|
|
1702
1702
|
// Keys to exclude when passing props to the component
|
|
1703
1703
|
const excludedKeys = /*#__PURE__*/new Set([
|
|
1704
1704
|
// Standard styling props
|
|
1705
|
-
'on', 'shadow', 'only', 'media', 'css', 'widthHeight', 'paddingHorizontal', 'paddingVertical', 'marginHorizontal', 'marginVertical', 'animate', 'animateIn', 'animateOut',
|
|
1705
|
+
'on', 'shadow', 'only', 'media', 'css', 'widthHeight', 'paddingHorizontal', 'paddingVertical', 'marginHorizontal', 'marginVertical', 'animate', 'animateIn', 'animateOut', 'theme',
|
|
1706
1706
|
// Underscore-prefixed event props
|
|
1707
1707
|
'_hover', '_active', '_focus', '_visited', '_disabled', '_enabled', '_checked', '_unchecked', '_invalid', '_valid', '_required', '_optional', '_selected', '_target', '_firstChild', '_lastChild', '_onlyChild', '_firstOfType', '_lastOfType', '_empty', '_focusVisible', '_focusWithin', '_placeholder',
|
|
1708
1708
|
// Pseudo-element props
|
|
@@ -2027,6 +2027,24 @@
|
|
|
2027
2027
|
}
|
|
2028
2028
|
|
|
2029
2029
|
/* eslint-disable @typescript-eslint/no-unused-vars */
|
|
2030
|
+
// Top-level CSS shorthands that reset a wide set of longhands on conflict.
|
|
2031
|
+
// Rules for these properties are injected into a stylesheet that appears
|
|
2032
|
+
// FIRST in the document, so longhand overrides written later in source order
|
|
2033
|
+
// win the cascade regardless of which element first instantiated each class.
|
|
2034
|
+
const TIER2_SHORTHANDS = /*#__PURE__*/new Set(['all', 'background', 'border', 'borderRadius', 'font', 'margin', 'padding', 'animation', 'transition', 'flex', 'grid', 'gridTemplate', 'gridArea', 'outline', 'inset', 'gap', 'gridGap', 'listStyle', 'textDecoration', 'placeItems', 'placeContent', 'placeSelf', 'overflow', 'mask', 'columns', 'columnRule']);
|
|
2035
|
+
// Sub-shorthands: reset some longhands but are themselves reset by tier-2.
|
|
2036
|
+
// Example: `border` resets `borderColor`; `borderColor` resets `borderTopColor`.
|
|
2037
|
+
const TIER3_SUB_SHORTHANDS = /*#__PURE__*/new Set(['borderTop', 'borderRight', 'borderBottom', 'borderLeft', 'borderColor', 'borderStyle', 'borderWidth', 'borderImage', 'flexFlow', 'overflowX', 'overflowY']);
|
|
2038
|
+
function baseContextForProperty(property) {
|
|
2039
|
+
if (TIER2_SHORTHANDS.has(property)) return 'base-shorthand';
|
|
2040
|
+
if (TIER3_SUB_SHORTHANDS.has(property)) return 'base-sub';
|
|
2041
|
+
return 'base';
|
|
2042
|
+
}
|
|
2043
|
+
function overrideContextForProperty(property) {
|
|
2044
|
+
if (TIER2_SHORTHANDS.has(property)) return 'override-shorthand';
|
|
2045
|
+
if (TIER3_SUB_SHORTHANDS.has(property)) return 'override-sub';
|
|
2046
|
+
return 'override';
|
|
2047
|
+
}
|
|
2030
2048
|
// Implement a simple LRU cache for classCache
|
|
2031
2049
|
class LRUCache {
|
|
2032
2050
|
constructor(maxSize) {
|
|
@@ -2268,11 +2286,20 @@
|
|
|
2268
2286
|
if (!this.styleSheets.has(targetDocument)) {
|
|
2269
2287
|
const sheetMap = {};
|
|
2270
2288
|
// Initialize all style sheets at once
|
|
2289
|
+
// Order matters: <style> tags are appended to <head> in the order
|
|
2290
|
+
// listed here, and the cascade resolves equal-specificity rules by
|
|
2291
|
+
// source order. Earlier entries cascade FIRST (lower priority), so
|
|
2292
|
+
// top-level shorthands like `border` are listed before their
|
|
2293
|
+
// sub-shorthands and longhands.
|
|
2271
2294
|
const contextIds = {
|
|
2295
|
+
'base-shorthand': 'utility-classes-base-shorthand',
|
|
2296
|
+
'base-sub': 'utility-classes-base-sub',
|
|
2272
2297
|
base: 'utility-classes-base',
|
|
2273
2298
|
pseudo: 'utility-classes-pseudo',
|
|
2274
2299
|
media: 'utility-classes-media',
|
|
2275
2300
|
modifier: 'utility-classes-modifier',
|
|
2301
|
+
'override-shorthand': 'utility-classes-override-shorthand',
|
|
2302
|
+
'override-sub': 'utility-classes-override-sub',
|
|
2276
2303
|
override: 'utility-classes-override'
|
|
2277
2304
|
};
|
|
2278
2305
|
for (const [context, id] of Object.entries(contextIds)) {
|
|
@@ -2349,7 +2376,7 @@
|
|
|
2349
2376
|
}
|
|
2350
2377
|
}
|
|
2351
2378
|
getServerStyles() {
|
|
2352
|
-
const contexts = ['base', 'pseudo', 'media', 'modifier', 'override'];
|
|
2379
|
+
const contexts = ['base-shorthand', 'base-sub', 'base', 'pseudo', 'media', 'modifier', 'override-shorthand', 'override-sub', 'override'];
|
|
2353
2380
|
let css = '';
|
|
2354
2381
|
contexts.forEach(context => {
|
|
2355
2382
|
const rules = this.serverRules.get(context);
|
|
@@ -2467,12 +2494,16 @@
|
|
|
2467
2494
|
});
|
|
2468
2495
|
} else {
|
|
2469
2496
|
const escapedClassName = this.escapeClassName(baseClassName);
|
|
2470
|
-
// Add rules for all necessary vendor prefixes
|
|
2471
|
-
//
|
|
2497
|
+
// Add rules for all necessary vendor prefixes.
|
|
2498
|
+
// Route to a tiered sheet (shorthand → sub → longhand) within the
|
|
2499
|
+
// passed context (base or override), so shorthand properties cascade
|
|
2500
|
+
// BEFORE their longhands regardless of which element first
|
|
2501
|
+
// instantiated each utility class.
|
|
2502
|
+
const tier = context === 'override' ? overrideContextForProperty(property) : baseContextForProperty(property);
|
|
2472
2503
|
cssProperties.forEach(prefixedProperty => {
|
|
2473
2504
|
rules.push({
|
|
2474
2505
|
rule: `.${escapedClassName} { ${prefixedProperty}: ${valueForCss}; }`,
|
|
2475
|
-
context:
|
|
2506
|
+
context: tier
|
|
2476
2507
|
});
|
|
2477
2508
|
});
|
|
2478
2509
|
}
|
|
@@ -3090,6 +3121,28 @@
|
|
|
3090
3121
|
}
|
|
3091
3122
|
return cacheRef.current.classes;
|
|
3092
3123
|
}
|
|
3124
|
+
const THEME_PREFIX$1 = 'theme-';
|
|
3125
|
+
// Build a getColor that resolves `theme-*` tokens against a component-scoped
|
|
3126
|
+
// theme override before falling back to the global getColor. Tokens not
|
|
3127
|
+
// covered by the override (color-*, light-*, dark-*, theme-* keys not in the
|
|
3128
|
+
// override) pass straight through.
|
|
3129
|
+
function makeScopedGetColor(componentTheme, baseGetColor) {
|
|
3130
|
+
return name => {
|
|
3131
|
+
if (!name || typeof name !== 'string') return String(name);
|
|
3132
|
+
if (!name.startsWith(THEME_PREFIX$1)) return baseGetColor(name);
|
|
3133
|
+
const parts = name.substring(THEME_PREFIX$1.length).split('-');
|
|
3134
|
+
const lastPart = parts[parts.length - 1];
|
|
3135
|
+
const maybeAlpha = parseInt(lastPart, 10);
|
|
3136
|
+
const hasAlpha = parts.length >= 2 && !isNaN(maybeAlpha) && maybeAlpha >= 0 && maybeAlpha <= 1000;
|
|
3137
|
+
const themeKey = hasAlpha ? parts.slice(0, -1).join('-') : parts.join('-');
|
|
3138
|
+
const overrideValue = componentTheme[themeKey];
|
|
3139
|
+
if (typeof overrideValue !== 'string') return baseGetColor(name);
|
|
3140
|
+
const resolved = baseGetColor(overrideValue);
|
|
3141
|
+
if (!hasAlpha) return resolved;
|
|
3142
|
+
const percentage = Math.round(maybeAlpha / 1000 * 100);
|
|
3143
|
+
return `color-mix(in srgb, ${resolved} ${percentage}%, transparent)`;
|
|
3144
|
+
};
|
|
3145
|
+
}
|
|
3093
3146
|
const Element = /*#__PURE__*/React__default.memo(/*#__PURE__*/React.forwardRef((_ref, ref) => {
|
|
3094
3147
|
let {
|
|
3095
3148
|
as = 'div',
|
|
@@ -3104,6 +3157,7 @@
|
|
|
3104
3157
|
onPress,
|
|
3105
3158
|
blend,
|
|
3106
3159
|
animateOn = 'Both',
|
|
3160
|
+
theme: componentTheme,
|
|
3107
3161
|
...rest
|
|
3108
3162
|
} = props;
|
|
3109
3163
|
const elementRef = React.useRef(null);
|
|
@@ -3119,6 +3173,17 @@
|
|
|
3119
3173
|
getColor,
|
|
3120
3174
|
theme
|
|
3121
3175
|
} = useTheme();
|
|
3176
|
+
// When a component-level `theme` prop is supplied, wrap getColor so
|
|
3177
|
+
// `theme-*` tokens resolve against the override first. Memoize on a
|
|
3178
|
+
// serialized signature so the function identity stays stable across
|
|
3179
|
+
// renders that don't change the override.
|
|
3180
|
+
const componentThemeKey = componentTheme ? Object.entries(componentTheme).map(_ref2 => {
|
|
3181
|
+
let [k, v] = _ref2;
|
|
3182
|
+
return `${k}=${v}`;
|
|
3183
|
+
}).join('|') : '';
|
|
3184
|
+
const scopedGetColor = React.useMemo(() => componentTheme ? makeScopedGetColor(componentTheme, getColor) : getColor,
|
|
3185
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
3186
|
+
[componentThemeKey, getColor]);
|
|
3122
3187
|
const {
|
|
3123
3188
|
trackEvent
|
|
3124
3189
|
} = useAnalytics();
|
|
@@ -3139,8 +3204,8 @@
|
|
|
3139
3204
|
setIsVisible(true);
|
|
3140
3205
|
return;
|
|
3141
3206
|
}
|
|
3142
|
-
const observer = new IntersectionObserver(
|
|
3143
|
-
let [entry] =
|
|
3207
|
+
const observer = new IntersectionObserver(_ref3 => {
|
|
3208
|
+
let [entry] = _ref3;
|
|
3144
3209
|
if (entry.isIntersecting) {
|
|
3145
3210
|
setIsVisible(true);
|
|
3146
3211
|
observer.disconnect();
|
|
@@ -3209,8 +3274,13 @@
|
|
|
3209
3274
|
return anim;
|
|
3210
3275
|
});
|
|
3211
3276
|
}
|
|
3212
|
-
// Use hash-based memoization for style extraction
|
|
3213
|
-
|
|
3277
|
+
// Use hash-based memoization for style extraction. Mix the component
|
|
3278
|
+
// theme signature into the `theme` argument so the cache invalidates
|
|
3279
|
+
// when an override changes between renders.
|
|
3280
|
+
const utilityClasses = useStableStyleMemo(propsToProcess, scopedGetColor, mediaQueries, devices, manager, componentTheme ? {
|
|
3281
|
+
...theme,
|
|
3282
|
+
__scope: componentThemeKey
|
|
3283
|
+
} : theme);
|
|
3214
3284
|
const newProps = {
|
|
3215
3285
|
ref: setRef
|
|
3216
3286
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"app-studio.umd.development.js","sources":[],"sourcesContent":[],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"app-studio.umd.development.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
|