app-studio 0.7.11 → 0.7.13
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 +149 -18
- package/dist/app-studio.cjs.development.js +75 -4
- 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 +75 -4
- package/dist/app-studio.esm.js.map +1 -1
- package/dist/app-studio.umd.development.js +75 -4
- 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 +1 -0
- package/docs/Hooks.md +3 -2
- package/docs/README.md +12 -13
- package/docs/Styling.md +572 -0
- package/docs/Theming.md +461 -0
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -85,15 +85,134 @@ The `Element` component is the cornerstone of App-Studio. Most other components
|
|
|
85
85
|
* **Animation:** Integrates with the animation system via the `animate` prop.
|
|
86
86
|
* **Theming:** Automatically resolves theme colors (e.g., `color="theme.primary"`).
|
|
87
87
|
|
|
88
|
-
##
|
|
88
|
+
## Styling System
|
|
89
89
|
|
|
90
|
+
App-Studio uses a powerful, declarative styling system with multiple levels:
|
|
91
|
+
|
|
92
|
+
### Utility-First Styling
|
|
90
93
|
App-Studio generates CSS utility classes based on the props you provide to `Element` and its derived components. This approach keeps styles co-located with the component logic and optimizes performance by reusing generated classes.
|
|
91
94
|
|
|
92
|
-
|
|
95
|
+
### State Modifiers
|
|
96
|
+
Control styles for interactive states using underscore-prefixed props:
|
|
97
|
+
- **Interaction**: `_hover`, `_active`, `_focus`, `_visited`
|
|
98
|
+
- **Form**: `_disabled`, `_enabled`, `_checked`, `_invalid`, `_valid`
|
|
99
|
+
- **Children**: `_firstChild`, `_lastChild`, `_onlyChild`
|
|
100
|
+
- **Group/Peer**: `_groupHover`, `_peerHover`, `_peerActive`, `_peerChecked`
|
|
101
|
+
- **Pseudo-elements**: `_before`, `_after`, `_firstLetter`, `_selection`
|
|
102
|
+
|
|
103
|
+
```jsx
|
|
104
|
+
<Element
|
|
105
|
+
backgroundColor="color-blue-500"
|
|
106
|
+
_hover={{ backgroundColor: "color-blue-600" }}
|
|
107
|
+
_disabled={{ opacity: 0.5 }}
|
|
108
|
+
_focus={{ outline: "2px solid color-blue-400" }}
|
|
109
|
+
/>
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
### Media Queries
|
|
113
|
+
Define responsive styles with the `media` prop for different breakpoints:
|
|
114
|
+
```jsx
|
|
115
|
+
<View
|
|
116
|
+
padding={8}
|
|
117
|
+
media={{
|
|
118
|
+
tablet: { padding: 16 },
|
|
119
|
+
desktop: { padding: 24 }
|
|
120
|
+
}}
|
|
121
|
+
/>
|
|
122
|
+
```
|
|
123
|
+
|
|
124
|
+
## Theming & Colors
|
|
125
|
+
|
|
126
|
+
Use `ThemeProvider` to define global theme settings, including light/dark mode colors and custom theme tokens (e.g., `primary`, `secondary`). The `useTheme` hook provides access to the current theme mode (`themeMode`), theme configuration (`theme`), and a function to switch modes (`setThemeMode`).
|
|
127
|
+
|
|
128
|
+
**App-Studio components resolve color strings automatically.** Pass color strings like `"color-blue-500"` or `"theme-primary"` directly as props (e.g., `backgroundColor="theme-primary"`) — no manual resolution required. `useTheme` also exposes a `getColor` function, but you only need it when passing a color to a non-App-Studio element (e.g., a third-party library, an inline `style`, or a computed value outside the prop system).
|
|
129
|
+
|
|
130
|
+
**Color System Features:**
|
|
131
|
+
- **Color Palettes**: 34 palettes with 9 shades each (50, 100, 200...900) - e.g., `color-blue-500`
|
|
132
|
+
- **Singleton Colors**: 30 named colors like `color-white`, `color-gold`, `color-turquoise`
|
|
133
|
+
- **Theme Colors**: Custom theme tokens like `theme-primary`, `theme-secondary`
|
|
134
|
+
- **Alpha Transparency**: Add opacity to any color - `color-blue-500-200` (20% opacity)
|
|
135
|
+
- **Mode-Specific**: Direct access via `light-white` or `dark-blue-500` (ignores current theme mode)
|
|
136
|
+
|
|
137
|
+
You can also directly access specific theme mode colors using the `light-` or `dark-` prefix (e.g., `light-white` or `dark-red-200`), which will always use that specific theme mode's color regardless of the current theme setting.
|
|
138
|
+
|
|
139
|
+
### Color System Hierarchy
|
|
140
|
+
|
|
141
|
+
```
|
|
142
|
+
color-* → Direct color access (current theme mode)
|
|
143
|
+
├─ color-white → Singleton colors
|
|
144
|
+
├─ color-blue-500 → Palette colors with shades
|
|
145
|
+
└─ color-blue-500-200 → Palette colors with alpha (20% opacity)
|
|
146
|
+
|
|
147
|
+
theme-* → Custom theme configuration
|
|
148
|
+
├─ theme-primary → Theme color
|
|
149
|
+
├─ theme-primary-100 → Theme color with alpha (10% opacity)
|
|
150
|
+
└─ theme-button-background → Nested theme path
|
|
151
|
+
|
|
152
|
+
light-* → Always use light mode colors
|
|
153
|
+
├─ light-white
|
|
154
|
+
└─ light-blue-500
|
|
155
|
+
|
|
156
|
+
dark-* → Always use dark mode colors
|
|
157
|
+
├─ dark-white
|
|
158
|
+
└─ dark-red-200
|
|
159
|
+
```
|
|
160
|
+
|
|
161
|
+
### Alpha Transparency
|
|
162
|
+
|
|
163
|
+
Append a 4th parameter (0–1000, mapping to 0%–100% opacity) to any palette or theme color to apply transparency. Under the hood this compiles to `color-mix(in srgb, var(--color-…) N%, transparent)`, so colors stay theme-aware and update automatically on mode switch.
|
|
164
|
+
|
|
165
|
+
**Syntax:** `color-{palette}-{shade}-{alpha}` or `theme-{token}-{alpha}`
|
|
166
|
+
|
|
167
|
+
- `0` → fully transparent
|
|
168
|
+
- `500` → 50% opacity
|
|
169
|
+
- `1000` → fully opaque
|
|
170
|
+
|
|
171
|
+
**Example — using transparency directly on App-Studio components:**
|
|
172
|
+
|
|
173
|
+
```jsx
|
|
174
|
+
import { View, Text, Button } from 'app-studio';
|
|
93
175
|
|
|
94
|
-
|
|
176
|
+
function TransparencyShowcase() {
|
|
177
|
+
return (
|
|
178
|
+
<View padding={20} backgroundColor="color-gray-100" gap={12}>
|
|
179
|
+
{/* Translucent overlay card */}
|
|
180
|
+
<View
|
|
181
|
+
padding={16}
|
|
182
|
+
backgroundColor="color-black-900-200" // black at 20% opacity
|
|
183
|
+
borderRadius={8}
|
|
184
|
+
>
|
|
185
|
+
<Text color="color-white">Glass-style overlay</Text>
|
|
186
|
+
</View>
|
|
95
187
|
|
|
96
|
-
|
|
188
|
+
{/* Subtle border using a theme color at 30% opacity */}
|
|
189
|
+
<View
|
|
190
|
+
padding={16}
|
|
191
|
+
borderWidth={1}
|
|
192
|
+
borderStyle="solid"
|
|
193
|
+
borderColor="theme-primary-300" // primary at 30% opacity
|
|
194
|
+
backgroundColor="theme-primary-100" // primary at 10% opacity
|
|
195
|
+
borderRadius={8}
|
|
196
|
+
>
|
|
197
|
+
<Text color="theme-primary">Tinted panel</Text>
|
|
198
|
+
</View>
|
|
199
|
+
|
|
200
|
+
{/* Hover state with softened background */}
|
|
201
|
+
<Button
|
|
202
|
+
padding={10}
|
|
203
|
+
backgroundColor="color-blue-500"
|
|
204
|
+
color="color-white"
|
|
205
|
+
borderRadius={6}
|
|
206
|
+
on={{
|
|
207
|
+
hover: { backgroundColor: 'color-blue-500-700' }, // 70% opacity on hover
|
|
208
|
+
}}
|
|
209
|
+
>
|
|
210
|
+
Hover me
|
|
211
|
+
</Button>
|
|
212
|
+
</View>
|
|
213
|
+
);
|
|
214
|
+
}
|
|
215
|
+
```
|
|
97
216
|
|
|
98
217
|
## Responsiveness
|
|
99
218
|
|
|
@@ -152,7 +271,7 @@ function MyStyledElement() {
|
|
|
152
271
|
}
|
|
153
272
|
```
|
|
154
273
|
|
|
155
|
-
In addition to global theming via `ThemeProvider`, the `Element` component offers granular control through the `themeMode`, `colors`, and `theme` props. When specified, these props locally override the context provided by `ThemeProvider` for this specific element instance and how its style props (like `backgroundColor="theme
|
|
274
|
+
In addition to global theming via `ThemeProvider`, the `Element` component offers granular control through the `themeMode`, `colors`, and `theme` props. When specified, these props locally override the context provided by `ThemeProvider` for this specific element instance and how its style props (like `backgroundColor="theme-primary"` or `color="color-blue-500"`) resolve color values. `themeMode` forces 'light' or 'dark' mode resolution, `colors` provides a custom `{ main, palette }` object, and `theme` supplies custom token mappings (e.g., `{ primary: 'color-purple-500' }`). This allows creating distinctly styled sections or components without altering the global theme, useful for sidebars, specific UI states, or component variations.
|
|
156
275
|
|
|
157
276
|
**Example (Local Theme Override):**
|
|
158
277
|
|
|
@@ -179,7 +298,7 @@ function LocallyThemedSection() {
|
|
|
179
298
|
theme={localThemeOverride}
|
|
180
299
|
colors={localDarkColorsOverride}
|
|
181
300
|
// Styles below will resolve using the LOCAL dark theme override defined above:
|
|
182
|
-
backgroundColor="theme
|
|
301
|
+
backgroundColor="theme-secondary" // Resolves to 'color-teal-300' via localThemeOverride in dark mode
|
|
183
302
|
borderRadius={8}
|
|
184
303
|
>
|
|
185
304
|
<Text color="color-white"
|
|
@@ -187,7 +306,7 @@ function LocallyThemedSection() {
|
|
|
187
306
|
This section forces dark mode with an orange primary, even if the app is light-
|
|
188
307
|
</Text>
|
|
189
308
|
<Element marginTop={8} padding={10} backgroundColor="color-gray-700"> {/* Uses local dark palette */}
|
|
190
|
-
<Text color="theme
|
|
309
|
+
<Text color="theme-primary">Nested Primary (Orange)</Text> {/* Still uses local override */}
|
|
191
310
|
</Element>
|
|
192
311
|
</Element>
|
|
193
312
|
);
|
|
@@ -259,7 +378,7 @@ function MyText() {
|
|
|
259
378
|
<Text
|
|
260
379
|
fontSize="xl"
|
|
261
380
|
fontWeight="bold"
|
|
262
|
-
color="theme
|
|
381
|
+
color="theme-primary"
|
|
263
382
|
textAlign="center"
|
|
264
383
|
toUpperCase
|
|
265
384
|
>
|
|
@@ -619,7 +738,7 @@ Manages the application's theme, including color palettes, light/dark modes, and
|
|
|
619
738
|
|
|
620
739
|
**Context Values (via `useTheme`)**
|
|
621
740
|
|
|
622
|
-
* `getColor(colorName, mode?)`: Resolves a color string (e.g., `color-blue
|
|
741
|
+
* `getColor(colorName, mode?)`: Resolves a color string (e.g., `color-blue-500`, `theme-primary`, `blackAlpha-500`) to its CSS value for the specified or current theme mode. Most of the time you don't need this — App-Studio components resolve color strings passed as props automatically. Use `getColor` only when you need the raw CSS value (e.g., for non-App-Studio elements or computed styles).
|
|
623
742
|
* `theme`: The merged theme configuration object.
|
|
624
743
|
* `themeMode`: The current mode ('light' or 'dark').
|
|
625
744
|
* `setThemeMode(mode)`: Function to change the theme mode.
|
|
@@ -680,22 +799,21 @@ App-Studio exports utility objects and functions.
|
|
|
680
799
|
|
|
681
800
|
## Colors (`utils/colors.ts`)
|
|
682
801
|
|
|
683
|
-
Defines the default color palettes (`defaultLightPalette`, `defaultDarkPalette`) and singleton colors (`defaultLightColors`, `defaultDarkColors`) used by `ThemeProvider`. You can import these if needed for custom theme configurations.
|
|
802
|
+
Defines the default color palettes (`defaultLightPalette`, `defaultDarkPalette`) and singleton colors (`defaultLightColors`, `defaultDarkColors`) used by `ThemeProvider`. You can import these if needed for custom theme configurations.
|
|
684
803
|
|
|
685
804
|
**Accessing Colors:**
|
|
686
805
|
|
|
806
|
+
App-Studio components resolve color strings automatically — just pass them as props:
|
|
807
|
+
|
|
687
808
|
```jsx
|
|
688
|
-
import {
|
|
689
|
-
import { View } from './components/View';
|
|
809
|
+
import { View } from 'app-studio';
|
|
690
810
|
|
|
691
811
|
function ThemedComponent() {
|
|
692
|
-
const { getColor } = useTheme();
|
|
693
|
-
|
|
694
812
|
return (
|
|
695
813
|
<View
|
|
696
|
-
backgroundColor=
|
|
697
|
-
color=
|
|
698
|
-
borderColor=
|
|
814
|
+
backgroundColor="theme-primary" // Theme color
|
|
815
|
+
color="color-white" // Singleton color
|
|
816
|
+
borderColor="color-blue-300" // Palette color
|
|
699
817
|
padding={10}
|
|
700
818
|
>
|
|
701
819
|
My Themed Content
|
|
@@ -704,6 +822,18 @@ function ThemedComponent() {
|
|
|
704
822
|
}
|
|
705
823
|
```
|
|
706
824
|
|
|
825
|
+
If you need the raw CSS value (e.g., to pass to a non-App-Studio element or a third-party library), use `getColor` from `useTheme`:
|
|
826
|
+
|
|
827
|
+
```jsx
|
|
828
|
+
import { useTheme } from 'app-studio';
|
|
829
|
+
|
|
830
|
+
function CustomChart() {
|
|
831
|
+
const { getColor } = useTheme();
|
|
832
|
+
// Pass resolved CSS color to a third-party component
|
|
833
|
+
return <ThirdPartyChart color={getColor('theme-primary')} />;
|
|
834
|
+
}
|
|
835
|
+
```
|
|
836
|
+
|
|
707
837
|
## Typography (`utils/typography.ts`)
|
|
708
838
|
|
|
709
839
|
Exports the `Typography` object containing pre-defined scales for `letterSpacings`, `lineHeights`, `fontWeights`, and `fontSizes`. These are typically used internally or can be referenced when customizing themes.
|
|
@@ -789,7 +919,8 @@ Explore our comprehensive documentation to learn more about App-Studio:
|
|
|
789
919
|
- [Getting Started](docs/README.md) - Quick start guide and core concepts
|
|
790
920
|
- [Components](docs/Components.md) - Detailed documentation of all available components
|
|
791
921
|
- [Hooks](docs/Hooks.md) - Guide to the React hooks provided by App-Studio
|
|
792
|
-
- [Theming](docs/Theming.md) -
|
|
922
|
+
- [Theming](docs/Theming.md) - Color systems, theme colors, palettes, and light/dark modes
|
|
923
|
+
- [Styling](docs/Styling.md) - Advanced guide to state modifiers, pseudo-elements, media queries, and CSS system
|
|
793
924
|
- [Animation](docs/Animation.md) - Creating animations with App-Studio
|
|
794
925
|
- [Responsive Design](docs/Responsive.md) - Building responsive layouts
|
|
795
926
|
- [Design System](docs/Design.md) - Understanding the design system
|
|
@@ -1873,6 +1873,10 @@ const processStyleProperty = (property, value, getColor) => {
|
|
|
1873
1873
|
const kebabProperty = toKebabCase(property);
|
|
1874
1874
|
// Convert numbers to pixels for appropriate properties
|
|
1875
1875
|
if (typeof value === 'number') {
|
|
1876
|
+
// lineHeight only accepts integers: 1-3 are unitless multipliers, 4+ are pixel sizes
|
|
1877
|
+
if (property === 'lineHeight' && Number.isInteger(value) && value <= 3) {
|
|
1878
|
+
return value;
|
|
1879
|
+
}
|
|
1876
1880
|
// Check if this is a property that should have px units
|
|
1877
1881
|
// First check the property as is, then check with vendor prefixes removed
|
|
1878
1882
|
const shouldAddPx = !NumberProps.has(property) && (numericCssProperties.has(kebabProperty) ||
|
|
@@ -2408,8 +2412,11 @@ class UtilityClassManager {
|
|
|
2408
2412
|
const cssProperty = propertyToKebabCase(property);
|
|
2409
2413
|
let valueForCss = processedValue;
|
|
2410
2414
|
// Handle numeric values for CSS
|
|
2411
|
-
if (typeof valueForCss === 'number'
|
|
2412
|
-
|
|
2415
|
+
if (typeof valueForCss === 'number') {
|
|
2416
|
+
// lineHeight only accepts integers: 1-3 are unitless multipliers, 4+ are pixel sizes
|
|
2417
|
+
if (property === 'lineHeight' && Number.isInteger(valueForCss) && valueForCss <= 3) ; else if (numericCssProperties.has(cssProperty)) {
|
|
2418
|
+
valueForCss = `${valueForCss}px`;
|
|
2419
|
+
}
|
|
2413
2420
|
}
|
|
2414
2421
|
// Check if this property needs vendor prefixes
|
|
2415
2422
|
const needsPrefixes = needsVendorPrefix(property);
|
|
@@ -2607,9 +2614,10 @@ function processStyles(styles, context, modifier, getColor, mediaQueries, device
|
|
|
2607
2614
|
mediaQueriesForClass = devices[modifier].map(mq => mediaQueries[mq]).filter(mq => mq);
|
|
2608
2615
|
}
|
|
2609
2616
|
}
|
|
2610
|
-
const
|
|
2617
|
+
const expandedStyles = expandShorthandStyles(styles);
|
|
2618
|
+
const keys = Object.keys(expandedStyles);
|
|
2611
2619
|
for (let i = 0; i < keys.length; i++) {
|
|
2612
|
-
const value =
|
|
2620
|
+
const value = expandedStyles[keys[i]];
|
|
2613
2621
|
if (value !== undefined && value !== '') {
|
|
2614
2622
|
const classNames = activeManager.getClassNames(keys[i], value, context, modifier, getColor, mediaQueriesForClass);
|
|
2615
2623
|
classes.push(...classNames);
|
|
@@ -2617,6 +2625,56 @@ function processStyles(styles, context, modifier, getColor, mediaQueries, device
|
|
|
2617
2625
|
}
|
|
2618
2626
|
return classes;
|
|
2619
2627
|
}
|
|
2628
|
+
/**
|
|
2629
|
+
* Expand shorthand props (widthHeight, paddingHorizontal, marginVertical, ...)
|
|
2630
|
+
* into their canonical CSS properties. Returns a new object so the caller's
|
|
2631
|
+
* input is not mutated. Keeps unknown shorthands only if their value is set.
|
|
2632
|
+
*/
|
|
2633
|
+
function expandShorthandStyles(styles) {
|
|
2634
|
+
const wh = styles.widthHeight;
|
|
2635
|
+
const ph = styles.paddingHorizontal;
|
|
2636
|
+
const pv = styles.paddingVertical;
|
|
2637
|
+
const mh = styles.marginHorizontal;
|
|
2638
|
+
const mv = styles.marginVertical;
|
|
2639
|
+
if (wh === undefined && ph === undefined && pv === undefined && mh === undefined && mv === undefined) {
|
|
2640
|
+
return styles;
|
|
2641
|
+
}
|
|
2642
|
+
const out = {};
|
|
2643
|
+
const keys = Object.keys(styles);
|
|
2644
|
+
for (let i = 0; i < keys.length; i++) {
|
|
2645
|
+
const k = keys[i];
|
|
2646
|
+
if (k === 'widthHeight' || k === 'paddingHorizontal' || k === 'paddingVertical' || k === 'marginHorizontal' || k === 'marginVertical') {
|
|
2647
|
+
continue;
|
|
2648
|
+
}
|
|
2649
|
+
out[k] = styles[k];
|
|
2650
|
+
}
|
|
2651
|
+
if (wh !== undefined) {
|
|
2652
|
+
const v = typeof wh === 'number' ? `${wh}px` : wh;
|
|
2653
|
+
if (out.width === undefined) out.width = v;
|
|
2654
|
+
if (out.height === undefined) out.height = v;
|
|
2655
|
+
}
|
|
2656
|
+
if (ph !== undefined) {
|
|
2657
|
+
const v = typeof ph === 'number' ? `${ph}px` : ph;
|
|
2658
|
+
if (out.paddingLeft === undefined) out.paddingLeft = v;
|
|
2659
|
+
if (out.paddingRight === undefined) out.paddingRight = v;
|
|
2660
|
+
}
|
|
2661
|
+
if (pv !== undefined) {
|
|
2662
|
+
const v = typeof pv === 'number' ? `${pv}px` : pv;
|
|
2663
|
+
if (out.paddingTop === undefined) out.paddingTop = v;
|
|
2664
|
+
if (out.paddingBottom === undefined) out.paddingBottom = v;
|
|
2665
|
+
}
|
|
2666
|
+
if (mh !== undefined) {
|
|
2667
|
+
const v = typeof mh === 'number' ? `${mh}px` : mh;
|
|
2668
|
+
if (out.marginLeft === undefined) out.marginLeft = v;
|
|
2669
|
+
if (out.marginRight === undefined) out.marginRight = v;
|
|
2670
|
+
}
|
|
2671
|
+
if (mv !== undefined) {
|
|
2672
|
+
const v = typeof mv === 'number' ? `${mv}px` : mv;
|
|
2673
|
+
if (out.marginTop === undefined) out.marginTop = v;
|
|
2674
|
+
if (out.marginBottom === undefined) out.marginBottom = v;
|
|
2675
|
+
}
|
|
2676
|
+
return out;
|
|
2677
|
+
}
|
|
2620
2678
|
// Add a function to handle nested pseudo-classes
|
|
2621
2679
|
function processPseudoStyles(styles, parentPseudo, getColor, manager) {
|
|
2622
2680
|
if (parentPseudo === void 0) {
|
|
@@ -2741,6 +2799,19 @@ const extractUtilityClasses = (props, getColor, mediaQueries, devices, manager)
|
|
|
2741
2799
|
computedStyles.width = formattedValue;
|
|
2742
2800
|
computedStyles.height = formattedValue;
|
|
2743
2801
|
}
|
|
2802
|
+
if (props.lineHeight) {
|
|
2803
|
+
const lh = props.lineHeight;
|
|
2804
|
+
if (typeof lh === 'number') {
|
|
2805
|
+
computedStyles.lineHeight = `${lh.toFixed(0)}px`;
|
|
2806
|
+
} else if (lh.indexOf('px') === -1) {
|
|
2807
|
+
const numericValue = parseFloat(lh);
|
|
2808
|
+
if (!isNaN(numericValue) && Number.isInteger(numericValue)) {
|
|
2809
|
+
computedStyles.lineHeight = `${numericValue.toFixed(0)}px`;
|
|
2810
|
+
} else {
|
|
2811
|
+
computedStyles.lineHeight = lh;
|
|
2812
|
+
}
|
|
2813
|
+
}
|
|
2814
|
+
}
|
|
2744
2815
|
// Handle padding and margin shorthands (inlined to avoid Object.entries overhead)
|
|
2745
2816
|
const ph = props.paddingHorizontal;
|
|
2746
2817
|
if (ph !== undefined) {
|
|
@@ -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":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
|