@seakoi/native-ui 1.0.0 → 1.1.0

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 (51) hide show
  1. package/CHANGELOG.md +559 -265
  2. package/dist/commonjs/components/base/carousel/carousel-item.js +21 -0
  3. package/dist/commonjs/components/base/carousel/carousel.js +489 -0
  4. package/dist/commonjs/components/base/carousel/index.js +36 -0
  5. package/dist/commonjs/components/base/carousel/style/index.js +47 -0
  6. package/dist/commonjs/components/base/carousel/types.js +5 -0
  7. package/dist/commonjs/components/base/carousel/utils.js +27 -0
  8. package/dist/commonjs/components/base/index.js +34 -23
  9. package/dist/module/components/base/carousel/carousel-item.js +16 -0
  10. package/dist/module/components/base/carousel/carousel.js +484 -0
  11. package/dist/module/components/base/carousel/index.js +9 -0
  12. package/dist/module/components/base/carousel/style/index.js +43 -0
  13. package/dist/module/components/base/carousel/types.js +3 -0
  14. package/dist/module/components/base/carousel/utils.js +20 -0
  15. package/dist/module/components/base/index.js +1 -0
  16. package/dist/typescript/commonjs/src/components/base/carousel/carousel-item.d.ts +4 -0
  17. package/dist/typescript/commonjs/src/components/base/carousel/carousel-item.d.ts.map +1 -0
  18. package/dist/typescript/commonjs/src/components/base/carousel/carousel.d.ts +7 -0
  19. package/dist/typescript/commonjs/src/components/base/carousel/carousel.d.ts.map +1 -0
  20. package/dist/typescript/commonjs/src/components/base/carousel/index.d.ts +7 -0
  21. package/dist/typescript/commonjs/src/components/base/carousel/index.d.ts.map +1 -0
  22. package/dist/typescript/commonjs/src/components/base/carousel/style/index.d.ts +41 -0
  23. package/dist/typescript/commonjs/src/components/base/carousel/style/index.d.ts.map +1 -0
  24. package/dist/typescript/commonjs/src/components/base/carousel/types.d.ts +113 -0
  25. package/dist/typescript/commonjs/src/components/base/carousel/types.d.ts.map +1 -0
  26. package/dist/typescript/commonjs/src/components/base/carousel/utils.d.ts +6 -0
  27. package/dist/typescript/commonjs/src/components/base/carousel/utils.d.ts.map +1 -0
  28. package/dist/typescript/commonjs/src/components/base/index.d.ts +1 -0
  29. package/dist/typescript/commonjs/src/components/base/index.d.ts.map +1 -1
  30. package/dist/typescript/module/src/components/base/carousel/carousel-item.d.ts +4 -0
  31. package/dist/typescript/module/src/components/base/carousel/carousel-item.d.ts.map +1 -0
  32. package/dist/typescript/module/src/components/base/carousel/carousel.d.ts +7 -0
  33. package/dist/typescript/module/src/components/base/carousel/carousel.d.ts.map +1 -0
  34. package/dist/typescript/module/src/components/base/carousel/index.d.ts +7 -0
  35. package/dist/typescript/module/src/components/base/carousel/index.d.ts.map +1 -0
  36. package/dist/typescript/module/src/components/base/carousel/style/index.d.ts +41 -0
  37. package/dist/typescript/module/src/components/base/carousel/style/index.d.ts.map +1 -0
  38. package/dist/typescript/module/src/components/base/carousel/types.d.ts +113 -0
  39. package/dist/typescript/module/src/components/base/carousel/types.d.ts.map +1 -0
  40. package/dist/typescript/module/src/components/base/carousel/utils.d.ts +6 -0
  41. package/dist/typescript/module/src/components/base/carousel/utils.d.ts.map +1 -0
  42. package/dist/typescript/module/src/components/base/index.d.ts +1 -0
  43. package/dist/typescript/module/src/components/base/index.d.ts.map +1 -1
  44. package/package.json +3 -2
  45. package/src/components/base/carousel/carousel-item.tsx +11 -0
  46. package/src/components/base/carousel/carousel.tsx +691 -0
  47. package/src/components/base/carousel/index.ts +8 -0
  48. package/src/components/base/carousel/style/index.ts +42 -0
  49. package/src/components/base/carousel/types.ts +134 -0
  50. package/src/components/base/carousel/utils.ts +26 -0
  51. package/src/components/base/index.ts +1 -0
@@ -0,0 +1,42 @@
1
+ import { createThemedStyles } from '#native-provider';
2
+
3
+ export const useCarouselStyles = createThemedStyles(theme => ({
4
+ container: {
5
+ overflow: 'hidden',
6
+ height: '100%',
7
+ width: '100%',
8
+ },
9
+ track: {
10
+ flex: 1,
11
+ overflow: 'hidden',
12
+ },
13
+ trackInner: {
14
+ flexGrow: 0,
15
+ flexShrink: 0,
16
+ },
17
+ slide: {
18
+ flexGrow: 0,
19
+ flexShrink: 0,
20
+ overflow: 'hidden',
21
+ },
22
+ indicatorContainer: {
23
+ position: 'absolute',
24
+ left: 0,
25
+ right: 0,
26
+ bottom: 8,
27
+ flexDirection: 'row',
28
+ justifyContent: 'center',
29
+ alignItems: 'center',
30
+ gap: 6,
31
+ },
32
+ indicatorDot: {
33
+ width: 6,
34
+ height: 6,
35
+ borderRadius: theme.roundness.full,
36
+ backgroundColor: theme.palette.fontGray5,
37
+ opacity: 0.6,
38
+ },
39
+ indicatorDotActive: {
40
+ opacity: 1,
41
+ },
42
+ }));
@@ -0,0 +1,134 @@
1
+ import type { ReactElement, ReactNode } from 'react';
2
+ import type { StyleProp, ViewStyle } from 'react-native';
3
+
4
+ /** Carousel 组件暴露的实例方法 */
5
+ export interface CarouselRef {
6
+ /** 滚动到指定索引 */
7
+ swipeTo: (index: number) => void;
8
+ /** 滚动到下一页 */
9
+ swipeNext: () => void;
10
+ /** 滚动到上一页 */
11
+ swipePrev: () => void;
12
+ }
13
+
14
+ /** Carousel 组件属性 */
15
+ export interface CarouselProps {
16
+ /**
17
+ * 初始展示的索引
18
+ * @default 0
19
+ */
20
+ defaultIndex?: number;
21
+
22
+ /**
23
+ * 是否允许手势滑动
24
+ * @default true
25
+ */
26
+ allowTouchMove?: boolean;
27
+
28
+ /**
29
+ * 是否自动轮播
30
+ * - `false`: 不自动轮播
31
+ * - `true`: 正向自动轮播
32
+ * - `'reverse'`: 反向自动轮播
33
+ * @default false
34
+ */
35
+ autoplay?: boolean | 'reverse';
36
+
37
+ /**
38
+ * 自动轮播间隔,单位:毫秒
39
+ * @default 3000
40
+ */
41
+ autoplayInterval?: number;
42
+
43
+ /**
44
+ * 是否开启循环播放
45
+ * @default false
46
+ */
47
+ loop?: boolean;
48
+
49
+ /**
50
+ * 滑动方向
51
+ * @default 'horizontal'
52
+ */
53
+ direction?: 'horizontal' | 'vertical';
54
+
55
+ /** 索引变化回调 */
56
+ onIndexChange?: (index: number) => void;
57
+
58
+ /** 指示器配置 */
59
+ indicatorProps?: {
60
+ /** 指示器激活状态颜色 */
61
+ color?: string;
62
+ /** 指示器容器样式 */
63
+ style?: StyleProp<ViewStyle>;
64
+ };
65
+
66
+ /**
67
+ * 自定义指示器
68
+ * - `false`: 不展示指示器
69
+ * - 函数:接收总数与当前索引,返回自定义节点
70
+ */
71
+ indicator?: false | ((total: number, current: number) => ReactNode);
72
+
73
+ /**
74
+ * 单个滑块所占轨道宽(高)度百分比
75
+ * 取值范围 0 ~ 100
76
+ * @default 100
77
+ */
78
+ slideSize?: number;
79
+
80
+ /**
81
+ * 轨道两侧预留的偏移量百分比
82
+ * 用于在两端留出空白
83
+ * @default 0
84
+ */
85
+ trackOffset?: number;
86
+
87
+ /**
88
+ * 是否在边界处卡住
89
+ * 开启后滑动到边缘不会完全滑出可视区域
90
+ * @default true
91
+ */
92
+ stuckAtBoundary?: boolean;
93
+
94
+ /**
95
+ * 是否开启橡皮筋效果
96
+ * 关闭后到达边界时不再有超出回弹
97
+ * @default true
98
+ */
99
+ rubberband?: boolean;
100
+
101
+ /**
102
+ * 虚拟渲染时前后额外渲染的滑块个数
103
+ * 仅在使用 render prop 且传入 total 时生效
104
+ * @default 2
105
+ */
106
+ virtualOverscan?: number;
107
+
108
+ /**
109
+ * 总滑块数量
110
+ * 使用 render prop children 时需要手动传入
111
+ */
112
+ total?: number;
113
+
114
+ /**
115
+ * 滑块内容
116
+ * - 直接传入 CarouselItem 列表
117
+ * - 或者传入 render prop,根据索引返回节点
118
+ */
119
+ children?:
120
+ | ReactElement<CarouselItemProps>
121
+ | ReactElement<CarouselItemProps>[]
122
+ | ((index: number) => ReactElement<CarouselItemProps>);
123
+
124
+ /** 容器样式 */
125
+ style?: StyleProp<ViewStyle>;
126
+ }
127
+
128
+ /** CarouselItem 组件属性 */
129
+ export interface CarouselItemProps {
130
+ /** 滑块内容 */
131
+ children?: ReactNode;
132
+ /** 滑块容器样式 */
133
+ style?: StyleProp<ViewStyle>;
134
+ }
@@ -0,0 +1,26 @@
1
+ import { Children, type ReactElement } from 'react';
2
+
3
+ import type { CarouselItemProps, CarouselProps } from '#components/base';
4
+
5
+ export const isRenderPropChildren = (
6
+ children: CarouselProps['children'],
7
+ ): children is (index: number) => ReactElement<CarouselItemProps> => {
8
+ return typeof children === 'function';
9
+ };
10
+
11
+ export const normalizeChildren = (
12
+ children: CarouselProps['children'],
13
+ total: number,
14
+ ): ReactElement[] => {
15
+ if (!children) return [];
16
+ if (isRenderPropChildren(children)) {
17
+ return Array.from({ length: total }, (_, i) => children(i));
18
+ }
19
+ return Children.toArray(children) as ReactElement[];
20
+ };
21
+
22
+ export const getDefaultTotal = (children: CarouselProps['children']) => {
23
+ if (!children) return 0;
24
+ if (isRenderPropChildren(children)) return 0;
25
+ return Array.isArray(children) ? children.length : 1;
26
+ };
@@ -6,6 +6,7 @@ export * from './back-to-top';
6
6
  export * from './badge';
7
7
  export * from './button';
8
8
  export * from './calendar';
9
+ export * from './carousel';
9
10
  export * from './cell';
10
11
  export * from './checkbox';
11
12
  export * from './collapse';