app-studio 0.5.21 → 0.5.28
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/dist/animation/css.d.ts +9 -14
- package/dist/app-studio.cjs.development.js +430 -51
- 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 +416 -53
- package/dist/app-studio.esm.js.map +1 -1
- package/dist/app-studio.umd.development.js +430 -51
- package/dist/app-studio.umd.development.js.map +1 -1
- package/dist/app-studio.umd.production.min.js +1 -1
- package/dist/components/View.d.ts +4 -0
- package/dist/hooks/useActive.d.ts +2 -0
- package/dist/hooks/useClickOutside.d.ts +2 -0
- package/dist/hooks/useFocus.d.ts +2 -0
- package/dist/hooks/useHover.d.ts +2 -0
- package/dist/hooks/useKeyPress.d.ts +1 -0
- package/dist/hooks/useOnScreen.d.ts +2 -0
- package/dist/hooks/useScroll.d.ts +1 -1
- package/dist/hooks/useWindowSize.d.ts +4 -0
- package/dist/index.d.ts +8 -1
- package/package.json +1 -1
package/dist/animation/css.d.ts
CHANGED
|
@@ -1,25 +1,20 @@
|
|
|
1
1
|
import { CssProps } from '../components/Element';
|
|
2
|
-
declare type StyleContext = 'base' | 'pseudo' | 'media';
|
|
2
|
+
declare type StyleContext = 'base' | 'pseudo' | 'media' | 'modifier';
|
|
3
3
|
declare class UtilityClassManager {
|
|
4
|
-
private
|
|
4
|
+
private baseStyleSheet;
|
|
5
|
+
private mediaStyleSheet;
|
|
6
|
+
private modifierStyleSheet;
|
|
5
7
|
private classCache;
|
|
6
8
|
private maxCacheSize;
|
|
7
9
|
private propertyShorthand;
|
|
10
|
+
private injectedRulesBase;
|
|
11
|
+
private injectedRulesMedia;
|
|
12
|
+
private injectedRulesModifier;
|
|
8
13
|
constructor(propertyShorthand: Record<string, string>, maxCacheSize?: number);
|
|
9
|
-
private
|
|
14
|
+
private initStyleSheets;
|
|
10
15
|
private escapeClassName;
|
|
11
|
-
injectRule(cssRule: string): void;
|
|
16
|
+
injectRule(cssRule: string, context?: StyleContext): void;
|
|
12
17
|
private addToCache;
|
|
13
|
-
/**
|
|
14
|
-
* Génère un ou plusieurs noms de classes pour une propriété et une valeur donnée.
|
|
15
|
-
* @param property La propriété CSS (ex: 'padding', 'color').
|
|
16
|
-
* @param value La valeur de la propriété (ex: '10px', '#fff').
|
|
17
|
-
* @param context Le contexte de la classe ('base', 'pseudo', 'media').
|
|
18
|
-
* @param modifier Le modificateur pour les pseudo-classes ou media queries (ex: 'hover', 'sm').
|
|
19
|
-
* @param getColor Fonction pour convertir les couleurs si nécessaire.
|
|
20
|
-
* @param mediaQueries Un tableau de media queries associées (utilisé uniquement pour le contexte 'media').
|
|
21
|
-
* @returns Un tableau de noms de classes générés.
|
|
22
|
-
*/
|
|
23
18
|
getClassNames(property: string, value: any, context?: StyleContext, modifier?: string, getColor?: (color: string) => string, mediaQueries?: string[]): string[];
|
|
24
19
|
}
|
|
25
20
|
export declare const utilityClassManager: UtilityClassManager;
|
|
@@ -743,33 +743,79 @@ class UtilityClassManager {
|
|
|
743
743
|
if (maxCacheSize === void 0) {
|
|
744
744
|
maxCacheSize = 10000;
|
|
745
745
|
}
|
|
746
|
-
this.
|
|
746
|
+
this.baseStyleSheet = null;
|
|
747
|
+
this.mediaStyleSheet = null;
|
|
748
|
+
this.modifierStyleSheet = null;
|
|
747
749
|
this.classCache = new Map();
|
|
750
|
+
this.injectedRulesBase = new Set();
|
|
751
|
+
this.injectedRulesMedia = new Set();
|
|
752
|
+
this.injectedRulesModifier = new Set();
|
|
748
753
|
this.propertyShorthand = propertyShorthand;
|
|
749
754
|
this.maxCacheSize = maxCacheSize;
|
|
750
|
-
this.
|
|
755
|
+
this.initStyleSheets();
|
|
751
756
|
}
|
|
752
|
-
|
|
757
|
+
initStyleSheets() {
|
|
753
758
|
if (typeof document !== 'undefined') {
|
|
754
|
-
|
|
755
|
-
|
|
756
|
-
|
|
757
|
-
|
|
758
|
-
|
|
759
|
+
// Feuille de style de base
|
|
760
|
+
let baseStyleTag = document.getElementById('utility-classes-base');
|
|
761
|
+
if (!baseStyleTag) {
|
|
762
|
+
baseStyleTag = document.createElement('style');
|
|
763
|
+
baseStyleTag.id = 'utility-classes-base';
|
|
764
|
+
document.head.appendChild(baseStyleTag);
|
|
759
765
|
}
|
|
760
|
-
this.
|
|
766
|
+
this.baseStyleSheet = baseStyleTag.sheet;
|
|
767
|
+
// Feuille de style pour les media queries
|
|
768
|
+
let mediaStyleTag = document.getElementById('utility-classes-media');
|
|
769
|
+
if (!mediaStyleTag) {
|
|
770
|
+
mediaStyleTag = document.createElement('style');
|
|
771
|
+
mediaStyleTag.id = 'utility-classes-media';
|
|
772
|
+
document.head.appendChild(mediaStyleTag);
|
|
773
|
+
}
|
|
774
|
+
this.mediaStyleSheet = mediaStyleTag.sheet;
|
|
775
|
+
// Feuille de style pour les modificateurs
|
|
776
|
+
let modifierStyleTag = document.getElementById('utility-classes-modifier');
|
|
777
|
+
if (!modifierStyleTag) {
|
|
778
|
+
modifierStyleTag = document.createElement('style');
|
|
779
|
+
modifierStyleTag.id = 'utility-classes-modifier';
|
|
780
|
+
document.head.appendChild(modifierStyleTag);
|
|
781
|
+
}
|
|
782
|
+
this.modifierStyleSheet = modifierStyleTag.sheet;
|
|
761
783
|
}
|
|
762
784
|
}
|
|
763
785
|
escapeClassName(className) {
|
|
764
786
|
return className.replace(/:/g, '\\:');
|
|
765
787
|
}
|
|
766
|
-
injectRule(cssRule) {
|
|
767
|
-
if (
|
|
788
|
+
injectRule(cssRule, context) {
|
|
789
|
+
if (context === void 0) {
|
|
790
|
+
context = 'base';
|
|
791
|
+
}
|
|
792
|
+
let styleSheet = null;
|
|
793
|
+
let injectedRules = new Set();
|
|
794
|
+
switch (context) {
|
|
795
|
+
case 'base':
|
|
796
|
+
styleSheet = this.baseStyleSheet;
|
|
797
|
+
injectedRules = this.injectedRulesBase;
|
|
798
|
+
break;
|
|
799
|
+
case 'pseudo':
|
|
800
|
+
styleSheet = this.baseStyleSheet; // Si les pseudo-classes sont dans la feuille de base
|
|
801
|
+
injectedRules = this.injectedRulesBase;
|
|
802
|
+
break;
|
|
803
|
+
case 'media':
|
|
804
|
+
styleSheet = this.mediaStyleSheet;
|
|
805
|
+
injectedRules = this.injectedRulesMedia;
|
|
806
|
+
break;
|
|
807
|
+
case 'modifier':
|
|
808
|
+
styleSheet = this.modifierStyleSheet;
|
|
809
|
+
injectedRules = this.injectedRulesModifier;
|
|
810
|
+
break;
|
|
811
|
+
default:
|
|
812
|
+
styleSheet = this.baseStyleSheet;
|
|
813
|
+
injectedRules = this.injectedRulesBase;
|
|
814
|
+
}
|
|
815
|
+
if (styleSheet && !injectedRules.has(cssRule)) {
|
|
768
816
|
try {
|
|
769
|
-
|
|
770
|
-
|
|
771
|
-
this.styleSheet.insertRule(cssRule, this.styleSheet.cssRules.length);
|
|
772
|
-
}
|
|
817
|
+
styleSheet.insertRule(cssRule, styleSheet.cssRules.length);
|
|
818
|
+
injectedRules.add(cssRule);
|
|
773
819
|
} catch (e) {
|
|
774
820
|
console.error(`Erreur lors de l'insertion de la règle CSS: "${cssRule}"`, e);
|
|
775
821
|
}
|
|
@@ -782,16 +828,6 @@ class UtilityClassManager {
|
|
|
782
828
|
}
|
|
783
829
|
this.classCache.set(key, className);
|
|
784
830
|
}
|
|
785
|
-
/**
|
|
786
|
-
* Génère un ou plusieurs noms de classes pour une propriété et une valeur donnée.
|
|
787
|
-
* @param property La propriété CSS (ex: 'padding', 'color').
|
|
788
|
-
* @param value La valeur de la propriété (ex: '10px', '#fff').
|
|
789
|
-
* @param context Le contexte de la classe ('base', 'pseudo', 'media').
|
|
790
|
-
* @param modifier Le modificateur pour les pseudo-classes ou media queries (ex: 'hover', 'sm').
|
|
791
|
-
* @param getColor Fonction pour convertir les couleurs si nécessaire.
|
|
792
|
-
* @param mediaQueries Un tableau de media queries associées (utilisé uniquement pour le contexte 'media').
|
|
793
|
-
* @returns Un tableau de noms de classes générés.
|
|
794
|
-
*/
|
|
795
831
|
getClassNames(property, value, context, modifier, getColor, mediaQueries) {
|
|
796
832
|
if (context === void 0) {
|
|
797
833
|
context = 'base';
|
|
@@ -806,13 +842,12 @@ class UtilityClassManager {
|
|
|
806
842
|
mediaQueries = [];
|
|
807
843
|
}
|
|
808
844
|
let processedValue = value;
|
|
809
|
-
//
|
|
845
|
+
// Si la propriété est une couleur, la convertir
|
|
810
846
|
if (property.toLowerCase().includes('color')) {
|
|
811
847
|
processedValue = getColor(value);
|
|
812
848
|
}
|
|
813
|
-
//
|
|
849
|
+
// Gérer les valeurs numériques
|
|
814
850
|
if (typeof processedValue === 'number') {
|
|
815
|
-
// Add 'px' to numeric values for properties that typically use length units
|
|
816
851
|
if (numericCssProperties.has(property)) {
|
|
817
852
|
processedValue = `${processedValue}px`;
|
|
818
853
|
}
|
|
@@ -830,42 +865,27 @@ class UtilityClassManager {
|
|
|
830
865
|
if (!shorthand) {
|
|
831
866
|
shorthand = property.replace(/([A-Z])/g, '-$1').toLowerCase();
|
|
832
867
|
}
|
|
833
|
-
|
|
834
|
-
// Normaliser la valeur pour le nom de classe
|
|
835
|
-
let normalizedValue = formattedValue.toString().replace(/\./g, 'p') // Replace dots with 'p'
|
|
836
|
-
.replace(/\s+/g, '-') // Replace spaces with '-'
|
|
837
|
-
.replace(/[^a-zA-Z0-9\-]/g, '') // Remove other special characters
|
|
838
|
-
.replace(/%/g, 'pct') // Replace % with 'pct'
|
|
839
|
-
.replace(/vw/g, 'vw') // Keep 'vw' as is
|
|
840
|
-
.replace(/vh/g, 'vh') // Keep 'vh' as is
|
|
841
|
-
.replace(/em/g, 'em') // Keep 'em' as is
|
|
842
|
-
.replace(/rem/g, 'rem'); // Keep 'rem' as is
|
|
868
|
+
let normalizedValue = formattedValue.toString().replace(/\./g, 'p').replace(/\s+/g, '-').replace(/[^a-zA-Z0-9\-]/g, '').replace(/%/g, 'pct').replace(/vw/g, 'vw').replace(/vh/g, 'vh').replace(/em/g, 'em').replace(/rem/g, 'rem');
|
|
843
869
|
let baseClassName = `${shorthand}-${normalizedValue}`;
|
|
844
|
-
|
|
845
|
-
let classNames = [baseClassName]; // Utiliser le nom de classe de base
|
|
870
|
+
let classNames = [baseClassName];
|
|
846
871
|
if (context === 'pseudo' && modifier) {
|
|
847
|
-
|
|
848
|
-
const pseudoClassName = `${baseClassName}-${modifier}`;
|
|
872
|
+
const pseudoClassName = `${baseClassName}--${modifier}`;
|
|
849
873
|
classNames.push(pseudoClassName);
|
|
850
874
|
} else if (context === 'media' && modifier) {
|
|
851
|
-
// Media query : générer une classe pour chaque media query associée
|
|
852
875
|
mediaQueries.forEach(() => {
|
|
853
|
-
const mediaClassName = `${modifier}
|
|
876
|
+
const mediaClassName = `${modifier}--${baseClassName}`;
|
|
854
877
|
classNames.push(mediaClassName);
|
|
855
878
|
});
|
|
856
879
|
} else {
|
|
857
880
|
classNames.push(baseClassName);
|
|
858
881
|
}
|
|
859
|
-
// Convertir camelCase en kebab-case
|
|
860
882
|
const cssProperty = property.replace(/([A-Z])/g, '-$1').toLowerCase();
|
|
861
883
|
let valueForCss = processedValue;
|
|
862
|
-
// Ajouter des unités si nécessaire
|
|
863
884
|
if (typeof valueForCss === 'number') {
|
|
864
885
|
if (numericCssProperties.has(cssProperty)) {
|
|
865
886
|
valueForCss = `${valueForCss}px`;
|
|
866
887
|
}
|
|
867
888
|
}
|
|
868
|
-
// Construire les règles CSS pour chaque classe générée
|
|
869
889
|
classNames.forEach(className => {
|
|
870
890
|
const escapedClassName = this.escapeClassName(className);
|
|
871
891
|
let cssRules = [];
|
|
@@ -874,11 +894,9 @@ class UtilityClassManager {
|
|
|
874
894
|
cssRules.push(`.${escapedClassName} { ${cssProperty}: ${valueForCss}; }`);
|
|
875
895
|
break;
|
|
876
896
|
case 'pseudo':
|
|
877
|
-
// Appliquer le pseudo-sélecteur au sélecteur de classe
|
|
878
897
|
cssRules.push(`.${escapedClassName}:${modifier} { ${cssProperty}: ${valueForCss}; }`);
|
|
879
898
|
break;
|
|
880
899
|
case 'media':
|
|
881
|
-
// Les media queries sont gérées séparément
|
|
882
900
|
mediaQueries.forEach(mq => {
|
|
883
901
|
cssRules.push(`@media ${mq} { .${escapedClassName} { ${cssProperty}: ${valueForCss}; } }`);
|
|
884
902
|
if (window.isResponsive === true) {
|
|
@@ -889,8 +907,12 @@ class UtilityClassManager {
|
|
|
889
907
|
default:
|
|
890
908
|
cssRules.push(`.${escapedClassName} { ${cssProperty}: ${valueForCss}; }`);
|
|
891
909
|
}
|
|
892
|
-
//
|
|
893
|
-
|
|
910
|
+
// Déterminer si la classe est un modificateur
|
|
911
|
+
const isModifier = className.includes('--');
|
|
912
|
+
// Définir le contexte approprié
|
|
913
|
+
const ruleContext = isModifier ? 'modifier' : context;
|
|
914
|
+
// Injecter les règles CSS avec le contexte approprié
|
|
915
|
+
cssRules.forEach(rule => this.injectRule(rule, ruleContext));
|
|
894
916
|
// Ajouter au cache
|
|
895
917
|
this.addToCache(key, className);
|
|
896
918
|
});
|
|
@@ -1240,6 +1262,52 @@ const Element = /*#__PURE__*/React__default.memo( /*#__PURE__*/React.forwardRef(
|
|
|
1240
1262
|
const View = /*#__PURE__*/React__default.forwardRef((props, ref) => /*#__PURE__*/React__default.createElement(Element, Object.assign({}, props, {
|
|
1241
1263
|
ref: ref
|
|
1242
1264
|
})));
|
|
1265
|
+
const Horizontal = /*#__PURE__*/React__default.forwardRef((props, ref) => /*#__PURE__*/React__default.createElement(Element, Object.assign({
|
|
1266
|
+
display: "flex",
|
|
1267
|
+
flexDirection: "row"
|
|
1268
|
+
}, props, {
|
|
1269
|
+
ref: ref
|
|
1270
|
+
})));
|
|
1271
|
+
const Vertical = /*#__PURE__*/React__default.forwardRef((props, ref) => /*#__PURE__*/React__default.createElement(Element, Object.assign({
|
|
1272
|
+
display: "flex",
|
|
1273
|
+
flexDirection: "column"
|
|
1274
|
+
}, props, {
|
|
1275
|
+
ref: ref
|
|
1276
|
+
})));
|
|
1277
|
+
const HorizontalResponsive = /*#__PURE__*/React__default.forwardRef((_ref, ref) => {
|
|
1278
|
+
let {
|
|
1279
|
+
media = {},
|
|
1280
|
+
...props
|
|
1281
|
+
} = _ref;
|
|
1282
|
+
return /*#__PURE__*/React__default.createElement(Horizontal, Object.assign({
|
|
1283
|
+
media: {
|
|
1284
|
+
...media,
|
|
1285
|
+
mobile: {
|
|
1286
|
+
...media.mobile,
|
|
1287
|
+
flexDirection: 'column'
|
|
1288
|
+
}
|
|
1289
|
+
}
|
|
1290
|
+
}, props, {
|
|
1291
|
+
ref: ref
|
|
1292
|
+
}));
|
|
1293
|
+
});
|
|
1294
|
+
const VerticalResponsive = /*#__PURE__*/React__default.forwardRef((_ref2, ref) => {
|
|
1295
|
+
let {
|
|
1296
|
+
media = {},
|
|
1297
|
+
...props
|
|
1298
|
+
} = _ref2;
|
|
1299
|
+
return /*#__PURE__*/React__default.createElement(Vertical, Object.assign({
|
|
1300
|
+
media: {
|
|
1301
|
+
...media,
|
|
1302
|
+
mobile: {
|
|
1303
|
+
...media.mobile,
|
|
1304
|
+
flexDirection: 'row'
|
|
1305
|
+
}
|
|
1306
|
+
}
|
|
1307
|
+
}, props, {
|
|
1308
|
+
ref: ref
|
|
1309
|
+
}));
|
|
1310
|
+
});
|
|
1243
1311
|
const Scroll = /*#__PURE__*/React__default.forwardRef((props, ref) => /*#__PURE__*/React__default.createElement(Element, Object.assign({}, props, {
|
|
1244
1312
|
ref: ref
|
|
1245
1313
|
})));
|
|
@@ -2499,12 +2567,130 @@ function isMobile() {
|
|
|
2499
2567
|
return navigator.userAgent.match(/(iPhone|iPod|Android|ios|iPad)/i);
|
|
2500
2568
|
}
|
|
2501
2569
|
|
|
2570
|
+
function useActive() {
|
|
2571
|
+
const [active, setActive] = React.useState(false);
|
|
2572
|
+
const ref = React.useRef(null);
|
|
2573
|
+
React.useEffect(() => {
|
|
2574
|
+
const node = ref.current;
|
|
2575
|
+
if (!node) return;
|
|
2576
|
+
const handleMouseDown = () => setActive(true);
|
|
2577
|
+
const handleMouseUp = () => setActive(false);
|
|
2578
|
+
const handleTouchStart = () => setActive(true);
|
|
2579
|
+
const handleTouchEnd = () => setActive(false);
|
|
2580
|
+
node.addEventListener('mousedown', handleMouseDown);
|
|
2581
|
+
node.addEventListener('mouseup', handleMouseUp);
|
|
2582
|
+
node.addEventListener('mouseleave', handleMouseUp);
|
|
2583
|
+
node.addEventListener('touchstart', handleTouchStart);
|
|
2584
|
+
node.addEventListener('touchend', handleTouchEnd);
|
|
2585
|
+
return () => {
|
|
2586
|
+
node.removeEventListener('mousedown', handleMouseDown);
|
|
2587
|
+
node.removeEventListener('mouseup', handleMouseUp);
|
|
2588
|
+
node.removeEventListener('mouseleave', handleMouseUp);
|
|
2589
|
+
node.removeEventListener('touchstart', handleTouchStart);
|
|
2590
|
+
node.removeEventListener('touchend', handleTouchEnd);
|
|
2591
|
+
};
|
|
2592
|
+
}, []);
|
|
2593
|
+
return [ref, active];
|
|
2594
|
+
}
|
|
2595
|
+
|
|
2596
|
+
function useClickOutside() {
|
|
2597
|
+
const [clickedOutside, setClickedOutside] = React.useState(false);
|
|
2598
|
+
const ref = React.useRef(null);
|
|
2599
|
+
React.useEffect(() => {
|
|
2600
|
+
const handleClick = e => {
|
|
2601
|
+
if (ref.current && !ref.current.contains(e.target)) {
|
|
2602
|
+
setClickedOutside(true);
|
|
2603
|
+
} else {
|
|
2604
|
+
setClickedOutside(false);
|
|
2605
|
+
}
|
|
2606
|
+
};
|
|
2607
|
+
document.addEventListener('mousedown', handleClick);
|
|
2608
|
+
return () => {
|
|
2609
|
+
document.removeEventListener('mousedown', handleClick);
|
|
2610
|
+
};
|
|
2611
|
+
}, []);
|
|
2612
|
+
return [ref, clickedOutside];
|
|
2613
|
+
}
|
|
2614
|
+
|
|
2615
|
+
function useFocus() {
|
|
2616
|
+
const [focused, setFocused] = React.useState(false);
|
|
2617
|
+
const ref = React.useRef(null);
|
|
2618
|
+
React.useEffect(() => {
|
|
2619
|
+
const node = ref.current;
|
|
2620
|
+
if (!node) return;
|
|
2621
|
+
const handleFocus = () => setFocused(true);
|
|
2622
|
+
const handleBlur = () => setFocused(false);
|
|
2623
|
+
node.addEventListener('focus', handleFocus);
|
|
2624
|
+
node.addEventListener('blur', handleBlur);
|
|
2625
|
+
return () => {
|
|
2626
|
+
node.removeEventListener('focus', handleFocus);
|
|
2627
|
+
node.removeEventListener('blur', handleBlur);
|
|
2628
|
+
};
|
|
2629
|
+
}, []);
|
|
2630
|
+
return [ref, focused];
|
|
2631
|
+
}
|
|
2632
|
+
|
|
2633
|
+
function useHover() {
|
|
2634
|
+
const [hover, setHover] = React.useState(false);
|
|
2635
|
+
const ref = React.useRef(null);
|
|
2636
|
+
React.useEffect(() => {
|
|
2637
|
+
const node = ref.current;
|
|
2638
|
+
if (!node) return;
|
|
2639
|
+
const handleMouseEnter = () => setHover(true);
|
|
2640
|
+
const handleMouseLeave = () => setHover(false);
|
|
2641
|
+
node.addEventListener('mouseenter', handleMouseEnter);
|
|
2642
|
+
node.addEventListener('mouseleave', handleMouseLeave);
|
|
2643
|
+
return () => {
|
|
2644
|
+
node.removeEventListener('mouseenter', handleMouseEnter);
|
|
2645
|
+
node.removeEventListener('mouseleave', handleMouseLeave);
|
|
2646
|
+
};
|
|
2647
|
+
}, []);
|
|
2648
|
+
return [ref, hover];
|
|
2649
|
+
}
|
|
2650
|
+
|
|
2651
|
+
function useKeyPress(targetKey) {
|
|
2652
|
+
const [keyPressed, setKeyPressed] = React.useState(false);
|
|
2653
|
+
React.useEffect(() => {
|
|
2654
|
+
const downHandler = e => {
|
|
2655
|
+
if (e.key === targetKey) setKeyPressed(true);
|
|
2656
|
+
};
|
|
2657
|
+
const upHandler = e => {
|
|
2658
|
+
if (e.key === targetKey) setKeyPressed(false);
|
|
2659
|
+
};
|
|
2660
|
+
window.addEventListener('keydown', downHandler);
|
|
2661
|
+
window.addEventListener('keyup', upHandler);
|
|
2662
|
+
return () => {
|
|
2663
|
+
window.removeEventListener('keydown', downHandler);
|
|
2664
|
+
window.removeEventListener('keyup', upHandler);
|
|
2665
|
+
};
|
|
2666
|
+
}, [targetKey]);
|
|
2667
|
+
return keyPressed;
|
|
2668
|
+
}
|
|
2669
|
+
|
|
2502
2670
|
const useMount = callback => {
|
|
2503
2671
|
React.useEffect(() => {
|
|
2504
2672
|
callback();
|
|
2505
2673
|
}, []);
|
|
2506
2674
|
};
|
|
2507
2675
|
|
|
2676
|
+
function useOnScreen(options) {
|
|
2677
|
+
const ref = React.useRef(null);
|
|
2678
|
+
const [isOnScreen, setOnScreen] = React.useState(false);
|
|
2679
|
+
React.useEffect(() => {
|
|
2680
|
+
const node = ref.current;
|
|
2681
|
+
if (!node) return;
|
|
2682
|
+
const observer = new IntersectionObserver(_ref => {
|
|
2683
|
+
let [entry] = _ref;
|
|
2684
|
+
setOnScreen(entry.isIntersecting);
|
|
2685
|
+
}, options);
|
|
2686
|
+
observer.observe(node);
|
|
2687
|
+
return () => {
|
|
2688
|
+
observer.unobserve(node);
|
|
2689
|
+
};
|
|
2690
|
+
}, [options]);
|
|
2691
|
+
return [ref, isOnScreen];
|
|
2692
|
+
}
|
|
2693
|
+
|
|
2508
2694
|
const createQuery = (keyScreen, query, set) => {
|
|
2509
2695
|
const mql = window.matchMedia(query);
|
|
2510
2696
|
const onChange = () => {
|
|
@@ -2551,11 +2737,190 @@ const useResponsive = () => {
|
|
|
2551
2737
|
};
|
|
2552
2738
|
};
|
|
2553
2739
|
|
|
2740
|
+
const getScrollDimensions = element => {
|
|
2741
|
+
if (element instanceof Window) {
|
|
2742
|
+
return {
|
|
2743
|
+
scrollHeight: document.documentElement.scrollHeight,
|
|
2744
|
+
scrollWidth: document.documentElement.scrollWidth,
|
|
2745
|
+
clientHeight: window.innerHeight,
|
|
2746
|
+
clientWidth: window.innerWidth,
|
|
2747
|
+
scrollTop: window.scrollY,
|
|
2748
|
+
scrollLeft: window.scrollX
|
|
2749
|
+
};
|
|
2750
|
+
}
|
|
2751
|
+
return {
|
|
2752
|
+
scrollHeight: element.scrollHeight,
|
|
2753
|
+
scrollWidth: element.scrollWidth,
|
|
2754
|
+
clientHeight: element.clientHeight,
|
|
2755
|
+
clientWidth: element.clientWidth,
|
|
2756
|
+
scrollTop: element.scrollTop,
|
|
2757
|
+
scrollLeft: element.scrollLeft
|
|
2758
|
+
};
|
|
2759
|
+
};
|
|
2760
|
+
const useScroll = function (_temp) {
|
|
2761
|
+
let {
|
|
2762
|
+
container,
|
|
2763
|
+
offset = [0, 0]
|
|
2764
|
+
} = _temp === void 0 ? {} : _temp;
|
|
2765
|
+
const [scrollPosition, setScrollPosition] = React.useState({
|
|
2766
|
+
x: 0,
|
|
2767
|
+
y: 0,
|
|
2768
|
+
xProgress: 0,
|
|
2769
|
+
yProgress: 0
|
|
2770
|
+
});
|
|
2771
|
+
const handleScroll = React.useCallback(() => {
|
|
2772
|
+
if (!container || !container.current) return;
|
|
2773
|
+
const element = container.current;
|
|
2774
|
+
const {
|
|
2775
|
+
scrollHeight,
|
|
2776
|
+
scrollWidth,
|
|
2777
|
+
clientHeight,
|
|
2778
|
+
clientWidth,
|
|
2779
|
+
scrollTop,
|
|
2780
|
+
scrollLeft
|
|
2781
|
+
} = getScrollDimensions(element);
|
|
2782
|
+
const x = scrollLeft + offset[0];
|
|
2783
|
+
const y = scrollTop + offset[1];
|
|
2784
|
+
const maxScrollX = scrollWidth - clientWidth;
|
|
2785
|
+
const maxScrollY = scrollHeight - clientHeight;
|
|
2786
|
+
const xProgress = maxScrollX > 0 ? x / maxScrollX : 1;
|
|
2787
|
+
const yProgress = maxScrollY > 0 ? y / maxScrollY : 1;
|
|
2788
|
+
setScrollPosition(prev => {
|
|
2789
|
+
if (prev.x !== x || prev.y !== y || prev.xProgress !== xProgress || prev.yProgress !== yProgress) {
|
|
2790
|
+
return {
|
|
2791
|
+
x,
|
|
2792
|
+
y,
|
|
2793
|
+
xProgress,
|
|
2794
|
+
yProgress
|
|
2795
|
+
};
|
|
2796
|
+
}
|
|
2797
|
+
return prev;
|
|
2798
|
+
});
|
|
2799
|
+
}, [container, offset]);
|
|
2800
|
+
React.useEffect(() => {
|
|
2801
|
+
if (!container || container.current) return;
|
|
2802
|
+
const element = container.current || window;
|
|
2803
|
+
element.addEventListener('scroll', handleScroll, {
|
|
2804
|
+
passive: true
|
|
2805
|
+
});
|
|
2806
|
+
window.addEventListener('resize', handleScroll, {
|
|
2807
|
+
passive: true
|
|
2808
|
+
});
|
|
2809
|
+
handleScroll();
|
|
2810
|
+
return () => {
|
|
2811
|
+
element.removeEventListener('scroll', handleScroll);
|
|
2812
|
+
window.removeEventListener('resize', handleScroll);
|
|
2813
|
+
};
|
|
2814
|
+
}, [handleScroll, container]);
|
|
2815
|
+
return scrollPosition;
|
|
2816
|
+
};
|
|
2817
|
+
const useScrollAnimation = function (ref, options) {
|
|
2818
|
+
if (options === void 0) {
|
|
2819
|
+
options = {};
|
|
2820
|
+
}
|
|
2821
|
+
const [isInView, setIsInView] = React.useState(false);
|
|
2822
|
+
const [progress, setProgress] = React.useState(0);
|
|
2823
|
+
React.useEffect(() => {
|
|
2824
|
+
if (!ref.current) return;
|
|
2825
|
+
const observer = new IntersectionObserver(entries => {
|
|
2826
|
+
entries.forEach(entry => {
|
|
2827
|
+
setIsInView(entry.isIntersecting);
|
|
2828
|
+
setProgress(entry.intersectionRatio);
|
|
2829
|
+
});
|
|
2830
|
+
}, {
|
|
2831
|
+
threshold: options.threshold || 0,
|
|
2832
|
+
rootMargin: options.rootMargin || '0px'
|
|
2833
|
+
});
|
|
2834
|
+
observer.observe(ref.current);
|
|
2835
|
+
return () => observer.disconnect();
|
|
2836
|
+
}, [ref, options.threshold, options.rootMargin]);
|
|
2837
|
+
return {
|
|
2838
|
+
isInView,
|
|
2839
|
+
progress
|
|
2840
|
+
};
|
|
2841
|
+
};
|
|
2842
|
+
const useSmoothScroll = () => {
|
|
2843
|
+
return React.useCallback(function (element, offset) {
|
|
2844
|
+
if (offset === void 0) {
|
|
2845
|
+
offset = 0;
|
|
2846
|
+
}
|
|
2847
|
+
if (!element) return;
|
|
2848
|
+
const targetPosition = element.getBoundingClientRect().top + window.scrollY - offset;
|
|
2849
|
+
window.scrollTo({
|
|
2850
|
+
top: targetPosition,
|
|
2851
|
+
behavior: 'smooth'
|
|
2852
|
+
});
|
|
2853
|
+
}, []);
|
|
2854
|
+
};
|
|
2855
|
+
const useInfiniteScroll = function (callback, options) {
|
|
2856
|
+
if (options === void 0) {
|
|
2857
|
+
options = {};
|
|
2858
|
+
}
|
|
2859
|
+
const [sentinel, setSentinel] = React.useState(null);
|
|
2860
|
+
React.useEffect(() => {
|
|
2861
|
+
if (!sentinel || options.isLoading) return;
|
|
2862
|
+
const observer = new IntersectionObserver(entries => {
|
|
2863
|
+
if (entries[0].isIntersecting) callback();
|
|
2864
|
+
}, {
|
|
2865
|
+
threshold: options.threshold || 0
|
|
2866
|
+
});
|
|
2867
|
+
observer.observe(sentinel);
|
|
2868
|
+
return () => observer.disconnect();
|
|
2869
|
+
}, [sentinel, callback, options.threshold, options.isLoading]);
|
|
2870
|
+
return {
|
|
2871
|
+
sentinelRef: setSentinel
|
|
2872
|
+
};
|
|
2873
|
+
};
|
|
2874
|
+
const useScrollDirection = function (threshold) {
|
|
2875
|
+
if (threshold === void 0) {
|
|
2876
|
+
threshold = 0;
|
|
2877
|
+
}
|
|
2878
|
+
const [scrollDirection, setScrollDirection] = React.useState('up');
|
|
2879
|
+
const [lastScrollY, setLastScrollY] = React.useState(0);
|
|
2880
|
+
const updateScrollDirection = React.useCallback(() => {
|
|
2881
|
+
const scrollY = window.scrollY;
|
|
2882
|
+
const direction = scrollY > lastScrollY ? 'down' : 'up';
|
|
2883
|
+
if (Math.abs(scrollY - lastScrollY) > threshold && direction !== scrollDirection) {
|
|
2884
|
+
setScrollDirection(direction);
|
|
2885
|
+
}
|
|
2886
|
+
setLastScrollY(scrollY > 0 ? scrollY : 0);
|
|
2887
|
+
}, [scrollDirection, lastScrollY, threshold]);
|
|
2888
|
+
React.useEffect(() => {
|
|
2889
|
+
window.addEventListener('scroll', updateScrollDirection, {
|
|
2890
|
+
passive: true
|
|
2891
|
+
});
|
|
2892
|
+
return () => {
|
|
2893
|
+
window.removeEventListener('scroll', updateScrollDirection);
|
|
2894
|
+
};
|
|
2895
|
+
}, [updateScrollDirection]);
|
|
2896
|
+
return scrollDirection;
|
|
2897
|
+
};
|
|
2898
|
+
|
|
2899
|
+
function useWindowSize() {
|
|
2900
|
+
const [size, setSize] = React.useState({
|
|
2901
|
+
width: window.innerWidth,
|
|
2902
|
+
height: window.innerHeight
|
|
2903
|
+
});
|
|
2904
|
+
React.useEffect(() => {
|
|
2905
|
+
const handleResize = () => {
|
|
2906
|
+
setSize({
|
|
2907
|
+
width: window.innerWidth,
|
|
2908
|
+
height: window.innerHeight
|
|
2909
|
+
});
|
|
2910
|
+
};
|
|
2911
|
+
window.addEventListener('resize', handleResize);
|
|
2912
|
+
return () => window.removeEventListener('resize', handleResize);
|
|
2913
|
+
}, []);
|
|
2914
|
+
return size;
|
|
2915
|
+
}
|
|
2916
|
+
|
|
2554
2917
|
exports.Animation = Animation;
|
|
2555
2918
|
exports.Button = Button;
|
|
2556
2919
|
exports.Div = Div;
|
|
2557
2920
|
exports.Element = Element;
|
|
2558
2921
|
exports.Form = Form;
|
|
2922
|
+
exports.Horizontal = Horizontal;
|
|
2923
|
+
exports.HorizontalResponsive = HorizontalResponsive;
|
|
2559
2924
|
exports.Image = Image;
|
|
2560
2925
|
exports.ImageBackground = ImageBackground;
|
|
2561
2926
|
exports.Input = Input;
|
|
@@ -2570,6 +2935,8 @@ exports.Text = Text;
|
|
|
2570
2935
|
exports.ThemeContext = ThemeContext;
|
|
2571
2936
|
exports.ThemeProvider = ThemeProvider;
|
|
2572
2937
|
exports.Typography = Typography;
|
|
2938
|
+
exports.Vertical = Vertical;
|
|
2939
|
+
exports.VerticalResponsive = VerticalResponsive;
|
|
2573
2940
|
exports.View = View;
|
|
2574
2941
|
exports.createQuery = createQuery;
|
|
2575
2942
|
exports.defaultColors = defaultColors;
|
|
@@ -2581,8 +2948,20 @@ exports.isMobile = isMobile;
|
|
|
2581
2948
|
exports.isProd = isProd;
|
|
2582
2949
|
exports.isSSR = isSSR;
|
|
2583
2950
|
exports.palette = palette;
|
|
2951
|
+
exports.useActive = useActive;
|
|
2952
|
+
exports.useClickOutside = useClickOutside;
|
|
2953
|
+
exports.useFocus = useFocus;
|
|
2954
|
+
exports.useHover = useHover;
|
|
2955
|
+
exports.useInfiniteScroll = useInfiniteScroll;
|
|
2956
|
+
exports.useKeyPress = useKeyPress;
|
|
2584
2957
|
exports.useMount = useMount;
|
|
2958
|
+
exports.useOnScreen = useOnScreen;
|
|
2585
2959
|
exports.useResponsive = useResponsive;
|
|
2586
2960
|
exports.useResponsiveContext = useResponsiveContext;
|
|
2961
|
+
exports.useScroll = useScroll;
|
|
2962
|
+
exports.useScrollAnimation = useScrollAnimation;
|
|
2963
|
+
exports.useScrollDirection = useScrollDirection;
|
|
2964
|
+
exports.useSmoothScroll = useSmoothScroll;
|
|
2587
2965
|
exports.useTheme = useTheme;
|
|
2966
|
+
exports.useWindowSize = useWindowSize;
|
|
2588
2967
|
//# sourceMappingURL=app-studio.cjs.development.js.map
|
|
@@ -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":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
|