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.
@@ -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 styleSheet;
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 initStyleSheet;
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.styleSheet = null;
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.initStyleSheet();
755
+ this.initStyleSheets();
751
756
  }
752
- initStyleSheet() {
757
+ initStyleSheets() {
753
758
  if (typeof document !== 'undefined') {
754
- let styleTag = document.getElementById('utility-classes');
755
- if (!styleTag) {
756
- styleTag = document.createElement('style');
757
- styleTag.id = 'utility-classes';
758
- document.head.appendChild(styleTag);
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.styleSheet = styleTag.sheet;
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 (this.styleSheet) {
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
- const existingRules = Array.from(this.styleSheet.cssRules).map(rule => rule.cssText);
770
- if (!existingRules.includes(cssRule)) {
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
- // If the property is a color, convert it to a hexadecimal or RGB value
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
- // Handle compound values (like padding and margin)
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
- // console.log({ shorthand, property, processedValue });
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
- // Préfixer les noms de classe pour les pseudo-classes et media queries
845
- let classNames = [baseClassName]; // Utiliser le nom de classe de base
870
+ let classNames = [baseClassName];
846
871
  if (context === 'pseudo' && modifier) {
847
- // Pseudo-class : ajouter '-modifier' suffix
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}:${baseClassName}`;
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
- // Injecter les règles CSS
893
- cssRules.forEach(rule => this.injectRule(rule));
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":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}