@xh/hoist 72.0.0-SNAPSHOT.1737063455869 → 72.0.0-SNAPSHOT.1737472364423

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.
Files changed (32) hide show
  1. package/CHANGELOG.md +11 -1
  2. package/build/types/kit/onsen/index.d.ts +1 -1
  3. package/build/types/kit/swiper/index.d.ts +98 -0
  4. package/build/types/mobile/cmp/navigator/Navigator.d.ts +2 -6
  5. package/build/types/mobile/cmp/navigator/NavigatorModel.d.ts +18 -11
  6. package/build/types/mobile/cmp/navigator/impl/GestureRefresh.d.ts +8 -0
  7. package/build/types/mobile/cmp/navigator/impl/{swipe/SwiperModel.d.ts → GestureRefreshModel.d.ts} +1 -8
  8. package/build/types/mobile/cmp/navigator/impl/Utils.d.ts +9 -0
  9. package/cmp/ag-grid/AgGrid.scss +6 -0
  10. package/cmp/grid/GridModel.ts +3 -2
  11. package/kit/onsen/index.ts +0 -1
  12. package/kit/onsen/theme.scss +0 -5
  13. package/kit/swiper/index.ts +14 -0
  14. package/kit/swiper/styles.scss +2 -0
  15. package/mobile/cmp/navigator/Navigator.scss +20 -0
  16. package/mobile/cmp/navigator/Navigator.ts +36 -19
  17. package/mobile/cmp/navigator/NavigatorModel.ts +156 -99
  18. package/mobile/cmp/navigator/impl/{swipe/Swiper.scss → GestureRefresh.scss} +6 -1
  19. package/mobile/cmp/navigator/impl/GestureRefresh.ts +55 -0
  20. package/mobile/cmp/navigator/impl/GestureRefreshModel.ts +86 -0
  21. package/mobile/cmp/navigator/impl/Page.scss +4 -2
  22. package/mobile/cmp/navigator/impl/Page.ts +10 -12
  23. package/mobile/cmp/navigator/impl/Utils.ts +107 -0
  24. package/package.json +2 -1
  25. package/tsconfig.tsbuildinfo +1 -1
  26. package/build/types/mobile/cmp/navigator/impl/swipe/BackIndicator.d.ts +0 -6
  27. package/build/types/mobile/cmp/navigator/impl/swipe/RefreshIndicator.d.ts +0 -6
  28. package/build/types/mobile/cmp/navigator/impl/swipe/Swiper.d.ts +0 -8
  29. package/mobile/cmp/navigator/impl/swipe/BackIndicator.ts +0 -34
  30. package/mobile/cmp/navigator/impl/swipe/RefreshIndicator.ts +0 -36
  31. package/mobile/cmp/navigator/impl/swipe/Swiper.ts +0 -35
  32. package/mobile/cmp/navigator/impl/swipe/SwiperModel.ts +0 -153
package/CHANGELOG.md CHANGED
@@ -2,15 +2,25 @@
2
2
 
3
3
  ## v72.0.0-SNAPSHOT - unreleased
4
4
 
5
+ ### 💥 Breaking Changes
6
+
7
+ * Mobile `Navigator` no longer supports `animation` prop, and `NavigatorModel` no longer supports
8
+ `swipeToGoBack`. Both of these properties are now managed internally by the `Navigator` component.
9
+
10
+ ### 🎁 New Features
11
+
12
+ * Mobile `Navigator` has been rebuilt to support smooth swipe-based navigation. The API remains
13
+ largely the same, notwithstanding the minor breaking changes detailed above.
14
+
5
15
  ### 🐞 Bug Fixes
6
16
 
7
17
  * Fixed `ViewManagerModel` unique name validation.
18
+ * `GridModel.restoreDefaultsAsync()` now restores default filter rather than simply clearing it.
8
19
 
9
20
  ### ⚙️ Technical
10
21
 
11
22
  * Added support for providing custom `PersistenceProvider` implementations to `PersistOptions`.
12
23
 
13
-
14
24
  ### ⚙️ Typescript API Adjustments
15
25
 
16
26
  * Improved signature of `HoistBase.markPersist`.
@@ -4,5 +4,5 @@ import 'onsenui/css/onsenui.css';
4
4
  import { FunctionComponent } from 'react';
5
5
  import './styles.scss';
6
6
  import './theme.scss';
7
- export declare const button: ElementFactory, Button: FunctionComponent<{}>, checkbox: ElementFactory, Checkbox: FunctionComponent<{}>, gestureDetector: ElementFactory, GestureDetector: FunctionComponent<{}>, input: ElementFactory, Input: FunctionComponent<{}>, navigator: ElementFactory, Navigator: FunctionComponent<{}>, searchInput: ElementFactory, SearchInput: FunctionComponent<{}>, select: ElementFactory, Select: FunctionComponent<{}>, switchControl: ElementFactory, SwitchControl: FunctionComponent<{}>;
7
+ export declare const button: ElementFactory, Button: FunctionComponent<{}>, checkbox: ElementFactory, Checkbox: FunctionComponent<{}>, gestureDetector: ElementFactory, GestureDetector: FunctionComponent<{}>, input: ElementFactory, Input: FunctionComponent<{}>, searchInput: ElementFactory, SearchInput: FunctionComponent<{}>, select: ElementFactory, Select: FunctionComponent<{}>, switchControl: ElementFactory, SwitchControl: FunctionComponent<{}>;
8
8
  export declare const dialog: ElementFactory, Dialog: FunctionComponent<{}>, listItem: ElementFactory, ListItem: FunctionComponent<{}>, page: ElementFactory, Page: FunctionComponent<{}>, tab: ElementFactory, Tab: FunctionComponent<{}>, tabbar: ElementFactory, Tabbar: FunctionComponent<{}>, toast: ElementFactory, Toast: FunctionComponent<{}>, toolbar: ElementFactory, Toolbar: FunctionComponent<{}>, bottomToolbar: ElementFactory, BottomToolbar: FunctionComponent<{}>;
@@ -0,0 +1,98 @@
1
+ /// <reference types="react" />
2
+ import { Swiper, SwiperSlide } from 'swiper/react';
3
+ import { EffectCreative } from 'swiper/modules';
4
+ import './styles.scss';
5
+ export { Swiper, SwiperSlide, EffectCreative };
6
+ export declare const swiper: import("@xh/hoist/core").ElementFactory<import("react").RefAttributes<import("swiper/react").SwiperRef> & Omit<import("react").HTMLAttributes<HTMLElement>, "onClick" | "onKeyPress" | "onProgress" | "onResize" | "onDoubleClick" | "onTouchEnd" | "onTouchMove" | "onTouchStart" | "onScroll" | "onTransitionEnd"> & import("swiper/types").SwiperOptions & {
7
+ tag?: string;
8
+ wrapperTag?: string;
9
+ onSwiper?: (swiper: import("swiper/types/swiper-class").default) => void;
10
+ onAutoplayStart?: (swiper: import("swiper/types/swiper-class").default) => void;
11
+ onAutoplayStop?: (swiper: import("swiper/types/swiper-class").default) => void;
12
+ onAutoplayPause?: (swiper: import("swiper/types/swiper-class").default) => void;
13
+ onAutoplayResume?: (swiper: import("swiper/types/swiper-class").default) => void;
14
+ onAutoplayTimeLeft?: (swiper: import("swiper/types/swiper-class").default, timeLeft: number, percentage: number) => void;
15
+ onAutoplay?: (swiper: import("swiper/types/swiper-class").default) => void;
16
+ onHashChange?: (swiper: import("swiper/types/swiper-class").default) => void;
17
+ onHashSet?: (swiper: import("swiper/types/swiper-class").default) => void;
18
+ onKeyPress?: (swiper: import("swiper/types/swiper-class").default, keyCode: string) => void;
19
+ onScroll?: (swiper: import("swiper/types/swiper-class").default, event: WheelEvent) => void;
20
+ onScrollbarDragStart?: (swiper: import("swiper/types/swiper-class").default, event: MouseEvent | PointerEvent | TouchEvent) => void;
21
+ onScrollbarDragMove?: (swiper: import("swiper/types/swiper-class").default, event: MouseEvent | PointerEvent | TouchEvent) => void;
22
+ onScrollbarDragEnd?: (swiper: import("swiper/types/swiper-class").default, event: MouseEvent | PointerEvent | TouchEvent) => void;
23
+ onNavigationHide?: (swiper: import("swiper/types/swiper-class").default) => void;
24
+ onNavigationShow?: (swiper: import("swiper/types/swiper-class").default) => void;
25
+ onNavigationPrev?: (swiper: import("swiper/types/swiper-class").default) => void;
26
+ onNavigationNext?: (swiper: import("swiper/types/swiper-class").default) => void;
27
+ onPaginationRender?: (swiper: import("swiper/types/swiper-class").default, paginationEl: HTMLElement) => void;
28
+ onPaginationUpdate?: (swiper: import("swiper/types/swiper-class").default, paginationEl: HTMLElement) => void;
29
+ onPaginationHide?: (swiper: import("swiper/types/swiper-class").default) => void;
30
+ onPaginationShow?: (swiper: import("swiper/types/swiper-class").default) => void;
31
+ onZoomChange?: (swiper: import("swiper/types/swiper-class").default, scale: number, imageEl: HTMLElement, slideEl: HTMLElement) => void;
32
+ onInit?: (swiper: import("swiper/types/swiper-class").default) => any;
33
+ onBeforeDestroy?: (swiper: import("swiper/types/swiper-class").default) => void;
34
+ onSlidesUpdated?: (swiper: import("swiper/types/swiper-class").default) => void;
35
+ onSlideChange?: (swiper: import("swiper/types/swiper-class").default) => void;
36
+ onSlideChangeTransitionStart?: (swiper: import("swiper/types/swiper-class").default) => void;
37
+ onSlideChangeTransitionEnd?: (swiper: import("swiper/types/swiper-class").default) => void;
38
+ onSlideNextTransitionStart?: (swiper: import("swiper/types/swiper-class").default) => void;
39
+ onSlideNextTransitionEnd?: (swiper: import("swiper/types/swiper-class").default) => void;
40
+ onSlidePrevTransitionStart?: (swiper: import("swiper/types/swiper-class").default) => void;
41
+ onSlidePrevTransitionEnd?: (swiper: import("swiper/types/swiper-class").default) => void;
42
+ onTransitionStart?: (swiper: import("swiper/types/swiper-class").default) => void;
43
+ onTransitionEnd?: (swiper: import("swiper/types/swiper-class").default) => void;
44
+ onTouchStart?: (swiper: import("swiper/types/swiper-class").default, event: MouseEvent | PointerEvent | TouchEvent) => void;
45
+ onTouchMove?: (swiper: import("swiper/types/swiper-class").default, event: MouseEvent | PointerEvent | TouchEvent) => void;
46
+ onTouchMoveOpposite?: (swiper: import("swiper/types/swiper-class").default, event: MouseEvent | PointerEvent | TouchEvent) => void;
47
+ onSliderMove?: (swiper: import("swiper/types/swiper-class").default, event: MouseEvent | PointerEvent | TouchEvent) => void;
48
+ onTouchEnd?: (swiper: import("swiper/types/swiper-class").default, event: MouseEvent | PointerEvent | TouchEvent) => void;
49
+ onClick?: (swiper: import("swiper/types/swiper-class").default, event: MouseEvent | PointerEvent | TouchEvent) => void;
50
+ onTap?: (swiper: import("swiper/types/swiper-class").default, event: MouseEvent | PointerEvent | TouchEvent) => void;
51
+ onDoubleTap?: (swiper: import("swiper/types/swiper-class").default, event: MouseEvent | PointerEvent | TouchEvent) => void;
52
+ onProgress?: (swiper: import("swiper/types/swiper-class").default, progress: number) => void;
53
+ onReachBeginning?: (swiper: import("swiper/types/swiper-class").default) => void;
54
+ onReachEnd?: (swiper: import("swiper/types/swiper-class").default) => void;
55
+ onToEdge?: (swiper: import("swiper/types/swiper-class").default) => void;
56
+ onFromEdge?: (swiper: import("swiper/types/swiper-class").default) => void;
57
+ onSetTranslate?: (swiper: import("swiper/types/swiper-class").default, translate: number) => void;
58
+ onSetTransition?: (swiper: import("swiper/types/swiper-class").default, transition: number) => void;
59
+ onResize?: (swiper: import("swiper/types/swiper-class").default) => void;
60
+ onObserverUpdate?: (swiper: import("swiper/types/swiper-class").default) => void;
61
+ onBeforeLoopFix?: (swiper: import("swiper/types/swiper-class").default) => void;
62
+ onLoopFix?: (swiper: import("swiper/types/swiper-class").default) => void;
63
+ onBreakpoint?: (swiper: import("swiper/types/swiper-class").default, breakpointParams: import("swiper/types").SwiperOptions) => void;
64
+ _beforeBreakpoint?: (swiper: import("swiper/types/swiper-class").default, breakpointParams: import("swiper/types").SwiperOptions) => void;
65
+ _containerClasses?: (swiper: import("swiper/types/swiper-class").default, classNames: string) => void;
66
+ _slideClass?: (swiper: import("swiper/types/swiper-class").default, slideEl: HTMLElement, classNames: string) => void;
67
+ _slideClasses?: (swiper: import("swiper/types/swiper-class").default, slides: {
68
+ slideEl: HTMLElement;
69
+ classNames: string;
70
+ index: number;
71
+ }[]) => void;
72
+ _swiper?: (swiper: import("swiper/types/swiper-class").default) => void;
73
+ _freeModeNoMomentumRelease?: (swiper: import("swiper/types/swiper-class").default) => void;
74
+ onActiveIndexChange?: (swiper: import("swiper/types/swiper-class").default) => void;
75
+ onSnapIndexChange?: (swiper: import("swiper/types/swiper-class").default) => void;
76
+ onRealIndexChange?: (swiper: import("swiper/types/swiper-class").default) => void;
77
+ onAfterInit?: (swiper: import("swiper/types/swiper-class").default) => void;
78
+ onBeforeInit?: (swiper: import("swiper/types/swiper-class").default) => void;
79
+ onBeforeResize?: (swiper: import("swiper/types/swiper-class").default) => void;
80
+ onBeforeSlideChangeStart?: (swiper: import("swiper/types/swiper-class").default) => void;
81
+ onBeforeTransitionStart?: (swiper: import("swiper/types/swiper-class").default, speed: number, internal: any) => void;
82
+ onChangeDirection?: (swiper: import("swiper/types/swiper-class").default) => void;
83
+ onDoubleClick?: (swiper: import("swiper/types/swiper-class").default, event: MouseEvent | PointerEvent | TouchEvent) => void;
84
+ onDestroy?: (swiper: import("swiper/types/swiper-class").default) => void;
85
+ onMomentumBounce?: (swiper: import("swiper/types/swiper-class").default) => void;
86
+ onOrientationchange?: (swiper: import("swiper/types/swiper-class").default) => void;
87
+ onSlideResetTransitionStart?: (swiper: import("swiper/types/swiper-class").default) => void;
88
+ onSlideResetTransitionEnd?: (swiper: import("swiper/types/swiper-class").default) => void;
89
+ onSliderFirstMove?: (swiper: import("swiper/types/swiper-class").default, event: TouchEvent) => void;
90
+ onSlidesLengthChange?: (swiper: import("swiper/types/swiper-class").default) => void;
91
+ onSlidesGridLengthChange?: (swiper: import("swiper/types/swiper-class").default) => void;
92
+ onSnapGridLengthChange?: (swiper: import("swiper/types/swiper-class").default) => void;
93
+ onUpdate?: (swiper: import("swiper/types/swiper-class").default) => void;
94
+ onLock?: (swiper: import("swiper/types/swiper-class").default) => void;
95
+ onUnlock?: (swiper: import("swiper/types/swiper-class").default) => void;
96
+ } & {
97
+ children?: import("react").ReactNode;
98
+ }>, swiperSlide: import("@xh/hoist/core").ElementFactory<import("swiper/react").SwiperSlideProps>;
@@ -1,13 +1,9 @@
1
1
  /// <reference types="react" />
2
- import { HoistProps } from '@xh/hoist/core';
3
2
  import '@xh/hoist/mobile/register';
3
+ import './Navigator.scss';
4
4
  import { NavigatorModel } from './NavigatorModel';
5
- export interface NavigatorProps extends HoistProps<NavigatorModel> {
6
- /** Set animation style or turn off, default 'slide'. */
7
- animation?: 'slide' | 'lift' | 'fade' | 'none';
8
- }
9
5
  /**
10
6
  * Top-level Component within an application, responsible for rendering a stack of
11
7
  * pages and managing transitions between pages.
12
8
  */
13
- export declare const Navigator: import("react").FC<NavigatorProps>, navigator: import("@xh/hoist/core").ElementFactory<NavigatorProps>;
9
+ export declare const Navigator: import("react").FC<import("@xh/hoist/core").DefaultHoistProps<NavigatorModel>>, navigator: import("@xh/hoist/core").ElementFactory<import("@xh/hoist/core").DefaultHoistProps<NavigatorModel>>;
@@ -1,5 +1,5 @@
1
- /// <reference types="react" />
2
1
  import { HoistModel, RefreshMode, RenderMode } from '@xh/hoist/core';
2
+ import { Swiper } from 'swiper/types';
3
3
  import '@xh/hoist/mobile/register';
4
4
  import { PageConfig, PageModel } from './PageModel';
5
5
  export interface NavigatorConfig {
@@ -10,10 +10,13 @@ export interface NavigatorConfig {
10
10
  * Viewing of each page will be tracked with the `oncePerSession` flag, to avoid duplication.
11
11
  */
12
12
  track?: boolean;
13
- /** True to enable 'swipe to go back' functionality. */
14
- swipeToGoBack?: boolean;
15
13
  /** True to enable 'pull down to refresh' functionality. */
16
14
  pullDownToRefresh?: boolean;
15
+ /**
16
+ * Time (in milliseconds) for the transition between pages on route change.
17
+ * Defaults to 500.
18
+ */
19
+ transitionMs?: number;
17
20
  /**
18
21
  * Strategy for rendering pages. Can be set per-page via `PageModel.renderMode`.
19
22
  * See enum for description of supported modes.
@@ -26,7 +29,7 @@ export interface NavigatorConfig {
26
29
  refreshMode?: RefreshMode;
27
30
  }
28
31
  /**
29
- * Model for handling stack-based navigation between Onsen pages.
32
+ * Model for handling stack-based navigation between pages.
30
33
  * Provides support for routing based navigation.
31
34
  */
32
35
  export declare class NavigatorModel extends HoistModel {
@@ -34,22 +37,26 @@ export declare class NavigatorModel extends HoistModel {
34
37
  stack: PageModel[];
35
38
  pages: PageConfig[];
36
39
  track: boolean;
37
- swipeToGoBack: boolean;
38
40
  pullDownToRefresh: boolean;
41
+ transitionMs: number;
39
42
  renderMode: RenderMode;
40
43
  refreshMode: RefreshMode;
41
- private _navigator;
44
+ private _swiper;
42
45
  private _callback;
43
- private _prevKeyStack;
46
+ private _touchStartX;
44
47
  get activePageId(): string;
45
48
  get activePage(): PageModel;
46
- constructor({ pages, track, swipeToGoBack, pullDownToRefresh, renderMode, refreshMode }: NavigatorConfig);
49
+ get activePageIdx(): number;
50
+ get allowSlideNext(): boolean;
51
+ get allowSlidePrev(): boolean;
52
+ constructor({ pages, track, pullDownToRefresh, transitionMs, renderMode, refreshMode }: NavigatorConfig);
47
53
  /**
48
54
  * @param callback - function to execute (once) after the next page transition.
49
55
  */
50
56
  setCallback(callback: () => void): void;
51
- private onRouteChange;
52
- private onStackChangeAsync;
53
- renderPage: (model: any, navigator: any) => import("react").ReactElement<import("@xh/hoist/core").DefaultHoistProps<PageModel>, any>;
57
+ /** @internal */
58
+ setSwiper(swiper: Swiper): void;
59
+ /** @internal */
54
60
  onPageChange: () => void;
61
+ private onRouteChange;
55
62
  }
@@ -0,0 +1,8 @@
1
+ import './GestureRefresh.scss';
2
+ import { GestureRefreshModel } from './GestureRefreshModel';
3
+ /**
4
+ * Wrap the Navigator with gesture that triggers a refresh by pulling down.
5
+ *
6
+ * @internal
7
+ */
8
+ export declare const gestureRefresh: import("@xh/hoist/core").ElementFactory<import("@xh/hoist/core").DefaultHoistProps<GestureRefreshModel>>;
@@ -1,16 +1,10 @@
1
1
  import { HoistModel } from '@xh/hoist/core';
2
- import './Swiper.scss';
3
2
  /**
4
3
  * @internal
5
4
  */
6
- export declare class SwiperModel extends HoistModel {
5
+ export declare class GestureRefreshModel extends HoistModel {
7
6
  navigatorModel: any;
8
- backProgress: any;
9
7
  refreshProgress: any;
10
- get backStarted(): boolean;
11
- get backCompleted(): boolean;
12
- backStart(): void;
13
- backEnd(): void;
14
8
  get refreshStarted(): boolean;
15
9
  get refreshCompleted(): boolean;
16
10
  refreshStart(): void;
@@ -19,5 +13,4 @@ export declare class SwiperModel extends HoistModel {
19
13
  onDragStart: (e: any) => void;
20
14
  onDrag: (e: any) => void;
21
15
  onDragEnd: (e: any) => void;
22
- isDraggingChild(e: any, dir: any): boolean;
23
16
  }
@@ -0,0 +1,9 @@
1
+ /**
2
+ * @internal
3
+ */
4
+ export declare function hasScrollableParent(e: TouchEvent, axis: 'horizontal' | 'vertical'): boolean;
5
+ export declare function findScrollableParent(e: TouchEvent, axis: 'horizontal' | 'vertical'): HTMLElement;
6
+ export declare function isScrollableEl(el: HTMLElement, axis: 'horizontal' | 'vertical'): boolean;
7
+ export declare function hasDraggableParent(e: TouchEvent, direction: 'up' | 'right' | 'down' | 'left'): boolean;
8
+ export declare function findDraggableParent(e: TouchEvent, direction: 'up' | 'right' | 'down' | 'left'): HTMLElement;
9
+ export declare function isDraggableEl(el: HTMLElement, direction: 'up' | 'right' | 'down' | 'left'): boolean;
@@ -26,6 +26,12 @@
26
26
  .ag-floating-bottom {
27
27
  overflow-y: hidden !important;
28
28
  }
29
+
30
+ // Prevent the "bounce" overscroll effect for horizontal scrolling on mobile devices, as it
31
+ // conflicts with the drag management in the Navigator.
32
+ .ag-center-cols-viewport {
33
+ overscroll-behavior-x: none;
34
+ }
29
35
  }
30
36
 
31
37
  // Ag-Grid themes referenced here to help ensure a high enough level of specificity for our rules.
@@ -600,6 +600,7 @@ export class GridModel extends HoistModel {
600
600
  this.colChooserModel = this.parseChooserModel(colChooserModel);
601
601
  this.selModel = this.parseSelModel(selModel);
602
602
  this.filterModel = this.parseFilterModel(filterModel);
603
+ if (this.filterModel) this._defaultState.filter = this.filterModel.filter;
603
604
  if (persistWith) initPersist(this, persistWith);
604
605
  this.experimental = this.parseExperimental(experimental);
605
606
  this.onKeyDown = onKeyDown;
@@ -644,12 +645,12 @@ export class GridModel extends HoistModel {
644
645
  if (!confirmed) return false;
645
646
  }
646
647
 
647
- const {columns, sortBy, groupBy} = this._defaultState;
648
+ const {columns, sortBy, groupBy, filter} = this._defaultState;
648
649
  this.setColumns(columns);
649
650
  this.setSortBy(sortBy);
650
651
  this.setGroupBy(groupBy);
651
652
 
652
- this.filterModel?.clear();
653
+ this.filterModel?.setFilter(filter);
653
654
 
654
655
  if (this.autosizeOptions.mode === 'managed') {
655
656
  await this.autosizeAsync();
@@ -23,7 +23,6 @@ export const [button, Button] = wrappedCmp(ons.Button),
23
23
  [checkbox, Checkbox] = wrappedCmp(ons.Checkbox),
24
24
  [gestureDetector, GestureDetector] = wrappedCmp(ons.GestureDetector),
25
25
  [input, Input] = wrappedCmp(ons.Input),
26
- [navigator, Navigator] = wrappedCmp(ons.Navigator),
27
26
  [searchInput, SearchInput] = wrappedCmp(ons.SearchInput),
28
27
  [select, Select] = wrappedCmp(ons.Select),
29
28
  [switchControl, SwitchControl] = wrappedCmp(ons.Switch);
@@ -11,15 +11,10 @@
11
11
  // Override styles provided in onsenui.css and onsen-css-components.css to use variable declarations
12
12
  body.xh-app.xh-mobile {
13
13
  // Background
14
- .page,
15
- .page__content,
16
- .page__background,
17
14
  .textarea {
18
15
  background-color: var(--xh-bg);
19
16
  }
20
17
 
21
- .page--material,
22
- .page--material__background,
23
18
  .bottom-bar,
24
19
  .tabbar {
25
20
  background-color: var(--xh-bg-alt);
@@ -0,0 +1,14 @@
1
+ /*
2
+ * This file belongs to Hoist, an application development toolkit
3
+ * developed by Extremely Heavy Industries (www.xh.io | info@xh.io)
4
+ *
5
+ * Copyright © 2025 Extremely Heavy Industries Inc.
6
+ */
7
+ import {elementFactory} from '@xh/hoist/core';
8
+ import {Swiper, SwiperSlide} from 'swiper/react';
9
+ import {EffectCreative} from 'swiper/modules';
10
+ import './styles.scss';
11
+
12
+ export {Swiper, SwiperSlide, EffectCreative};
13
+ export const swiper = elementFactory(Swiper),
14
+ swiperSlide = elementFactory(SwiperSlide);
@@ -0,0 +1,2 @@
1
+ @import 'swiper/scss';
2
+ @import 'swiper/scss/effect-creative';
@@ -0,0 +1,20 @@
1
+ /*
2
+ * This file belongs to Hoist, an application development toolkit
3
+ * developed by Extremely Heavy Industries (www.xh.io | info@xh.io)
4
+ *
5
+ * Copyright © 2025 Extremely Heavy Industries Inc.
6
+ */
7
+ .xh-navigator {
8
+ width: 100%;
9
+ height: 100%;
10
+
11
+ .swiper-slide {
12
+ box-shadow:
13
+ 0 0 0 1px var(--xh-border-color),
14
+ 0 0 20px rgba(0, 0, 0, 0.3);
15
+ }
16
+
17
+ .div.swiper-container {
18
+ touch-action: pan-x;
19
+ }
20
+ }
@@ -4,36 +4,53 @@
4
4
  *
5
5
  * Copyright © 2025 Extremely Heavy Industries Inc.
6
6
  */
7
- import {hoistCmp, HoistProps, uses} from '@xh/hoist/core';
8
- import {navigator as onsenNavigator} from '@xh/hoist/kit/onsen';
7
+ import {hoistCmp, uses} from '@xh/hoist/core';
8
+ import {swiper, swiperSlide, EffectCreative} from '@xh/hoist/kit/swiper';
9
9
  import '@xh/hoist/mobile/register';
10
- import {swiper} from './impl/swipe/Swiper';
10
+ import './Navigator.scss';
11
11
  import {NavigatorModel} from './NavigatorModel';
12
-
13
- export interface NavigatorProps extends HoistProps<NavigatorModel> {
14
- /** Set animation style or turn off, default 'slide'. */
15
- animation?: 'slide' | 'lift' | 'fade' | 'none';
16
- }
12
+ import {PageModel} from './PageModel';
13
+ import {gestureRefresh} from './impl/GestureRefresh';
14
+ import {page} from './impl/Page';
17
15
 
18
16
  /**
19
17
  * Top-level Component within an application, responsible for rendering a stack of
20
18
  * pages and managing transitions between pages.
21
19
  */
22
- export const [Navigator, navigator] = hoistCmp.withFactory<NavigatorProps>({
20
+ export const [Navigator, navigator] = hoistCmp.withFactory<NavigatorModel>({
23
21
  displayName: 'Navigator',
24
22
  model: uses(NavigatorModel),
25
23
  className: 'xh-navigator',
26
-
27
- render({model, className, animation = 'slide'}) {
28
- return swiper(
29
- onsenNavigator({
24
+ render({model, className}) {
25
+ const {stack, allowSlideNext, allowSlidePrev} = model;
26
+ return gestureRefresh(
27
+ swiper({
30
28
  className,
31
- initialRoute: {init: true},
32
- animation,
33
- animationOptions: {duration: 0.2, delay: 0, timing: 'ease-in'},
34
- renderPage: model.renderPage,
35
- onPostPush: model.onPageChange,
36
- onPostPop: model.onPageChange
29
+ allowSlideNext,
30
+ allowSlidePrev,
31
+ slidesPerView: 1,
32
+ modules: [EffectCreative],
33
+ effect: 'creative',
34
+ creativeEffect: {
35
+ prev: {
36
+ shadow: true,
37
+ translate: ['-15%', 0, -1]
38
+ },
39
+ next: {
40
+ translate: ['100%', 0, 0]
41
+ }
42
+ },
43
+ onSwiper: swiper => model.setSwiper(swiper),
44
+ items: stack.map(it => {
45
+ const {key} = it as PageModel;
46
+ return swiperSlide({
47
+ key: `slide-${key}`,
48
+ item: page({
49
+ key: `page-${key}`,
50
+ model: it
51
+ })
52
+ });
53
+ })
37
54
  })
38
55
  );
39
56
  }