@ornikar/bumper 2.13.0 → 2.14.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.
- package/CHANGELOG.md +14 -0
- package/README.md +90 -0
- package/dist/definitions/index.d.ts +2 -1
- package/dist/definitions/index.d.ts.map +1 -1
- package/dist/definitions/storybook.d.ts +2 -0
- package/dist/definitions/storybook.d.ts.map +1 -0
- package/dist/definitions/system/loading/loader/Loader.d.ts +19 -0
- package/dist/definitions/system/loading/loader/Loader.d.ts.map +1 -0
- package/dist/definitions/system/loading/loader/LoaderBackgroundCircle.d.ts +5 -0
- package/dist/definitions/system/loading/loader/LoaderBackgroundCircle.d.ts.map +1 -0
- package/dist/definitions/system/loading/loader/LoaderCircleWrapper.d.ts +6 -0
- package/dist/definitions/system/loading/loader/LoaderCircleWrapper.d.ts.map +1 -0
- package/dist/definitions/system/loading/loader/LoaderForegroundCircle.d.ts +11 -0
- package/dist/definitions/system/loading/loader/LoaderForegroundCircle.d.ts.map +1 -0
- package/dist/definitions/system/loading/loader/loaderConfig.d.ts +16 -0
- package/dist/definitions/system/loading/loader/loaderConfig.d.ts.map +1 -0
- package/dist/index-metro.es.android.js +162 -14
- package/dist/index-metro.es.android.js.map +1 -1
- package/dist/index-metro.es.ios.js +162 -14
- package/dist/index-metro.es.ios.js.map +1 -1
- package/dist/index-node-22.22.cjs.js +165 -12
- package/dist/index-node-22.22.cjs.js.map +1 -1
- package/dist/index-node-22.22.cjs.web.js +165 -12
- package/dist/index-node-22.22.cjs.web.js.map +1 -1
- package/dist/index-node-22.22.es.mjs +162 -14
- package/dist/index-node-22.22.es.mjs.map +1 -1
- package/dist/index-node-22.22.es.web.mjs +162 -14
- package/dist/index-node-22.22.es.web.mjs.map +1 -1
- package/dist/index.es.js +157 -14
- package/dist/index.es.js.map +1 -1
- package/dist/index.es.web.js +157 -14
- package/dist/index.es.web.js.map +1 -1
- package/dist/storybook-metro.es.android.js +402 -0
- package/dist/storybook-metro.es.android.js.map +1 -0
- package/dist/storybook-metro.es.ios.js +402 -0
- package/dist/storybook-metro.es.ios.js.map +1 -0
- package/dist/storybook-node-22.22.cjs.js +406 -0
- package/dist/storybook-node-22.22.cjs.js.map +1 -0
- package/dist/storybook-node-22.22.cjs.web.js +406 -0
- package/dist/storybook-node-22.22.cjs.web.js.map +1 -0
- package/dist/storybook-node-22.22.es.mjs +402 -0
- package/dist/storybook-node-22.22.es.mjs.map +1 -0
- package/dist/storybook-node-22.22.es.web.mjs +402 -0
- package/dist/storybook-node-22.22.es.web.mjs.map +1 -0
- package/dist/storybook.es.js +399 -0
- package/dist/storybook.es.js.map +1 -0
- package/dist/storybook.es.web.js +399 -0
- package/dist/storybook.es.web.js.map +1 -0
- package/dist/tsbuildinfo +1 -1
- package/package.json +42 -5
- package/src/index.ts +4 -1
- package/src/storybook.ts +1 -0
- package/src/system/loading/loader/Loader.features.stories.tsx +45 -0
- package/src/system/loading/loader/Loader.stories.tsx +28 -0
- package/src/system/loading/loader/Loader.tsx +65 -0
- package/src/system/loading/loader/LoaderBackgroundCircle.tsx +15 -0
- package/src/system/loading/loader/LoaderCircleWrapper.tsx +19 -0
- package/src/system/loading/loader/LoaderForegroundCircle.tsx +39 -0
- package/src/system/loading/loader/__snapshots__/Loader.features.stories.tsx.snap +703 -0
- package/src/system/loading/loader/__snapshots__/Loader.stories.tsx.snap +159 -0
- package/src/system/loading/loader/__snapshots_web__/Loader.features.stories.tsx.snap +225 -0
- package/src/system/loading/loader/__snapshots_web__/Loader.stories.tsx.snap +60 -0
- package/src/system/loading/loader/loaderConfig.ts +36 -0
package/CHANGELOG.md
CHANGED
|
@@ -3,6 +3,20 @@
|
|
|
3
3
|
All notable changes to this project will be documented in this file.
|
|
4
4
|
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
|
5
5
|
|
|
6
|
+
## [2.14.0](https://github.com/ornikar/kitt/compare/@ornikar/bumper@2.13.0...@ornikar/bumper@2.14.0) (2026-02-19)
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
### Features
|
|
10
|
+
|
|
11
|
+
* **bumper:** add Loader component [OSE-22812] ([#2889](https://github.com/ornikar/kitt/issues/2889)) ([d1029e1](https://github.com/ornikar/kitt/commit/d1029e14d509fbb0d24e400ba37c6dcc7c63f37c))
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
### Bug Fixes
|
|
15
|
+
|
|
16
|
+
* **bumper:** scoped Storybook export [OSE-22811] ([#2894](https://github.com/ornikar/kitt/issues/2894)) ([01b1039](https://github.com/ornikar/kitt/commit/01b103906dab370da12c658a685e987da190d246))
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
|
|
6
20
|
## [2.13.0](https://github.com/ornikar/kitt/compare/@ornikar/bumper@2.12.0...@ornikar/bumper@2.13.0) (2026-02-16)
|
|
7
21
|
|
|
8
22
|
|
package/README.md
ADDED
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
# @ornikar/bumper
|
|
2
|
+
|
|
3
|
+
The next-generation Ornikar design system, built on [Tamagui](https://tamagui.dev/). Bumper is the planned replacement for `@ornikar/kitt-universal`, providing cross-platform UI primitives and components that run on both web and React Native.
|
|
4
|
+
|
|
5
|
+
## Installation
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
yarn add @ornikar/bumper
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
### Peer Dependencies
|
|
12
|
+
|
|
13
|
+
| Package | Required |
|
|
14
|
+
| ------------------------ | ------------------- |
|
|
15
|
+
| `react` | Yes |
|
|
16
|
+
| `react-dom` | No (web only) |
|
|
17
|
+
| `react-native` | No (native only) |
|
|
18
|
+
| `@storybook/preview-api` | No (storybook only) |
|
|
19
|
+
|
|
20
|
+
## Setup
|
|
21
|
+
|
|
22
|
+
Wrap your application with `BumperProvider` to enable theming and Tamagui context:
|
|
23
|
+
|
|
24
|
+
```tsx
|
|
25
|
+
import { BumperProvider } from '@ornikar/bumper';
|
|
26
|
+
|
|
27
|
+
function App() {
|
|
28
|
+
return <BumperProvider>{...}</BumperProvider>;
|
|
29
|
+
}
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
### Compiler
|
|
33
|
+
|
|
34
|
+
The Tamagui config is exported to enable the Tamagui compiler on client apps. Add this plugin to your Babel configs.
|
|
35
|
+
|
|
36
|
+
```ts
|
|
37
|
+
[
|
|
38
|
+
'@tamagui/babel-plugin',
|
|
39
|
+
{
|
|
40
|
+
config: '@ornikar/bumper/src/tamagui.config.ts',
|
|
41
|
+
components: ['@tamagui/core', '@ornikar/bumper'],
|
|
42
|
+
disableExtraction: process.env.NODE_ENV === 'development',
|
|
43
|
+
},
|
|
44
|
+
],
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
## Storybook
|
|
48
|
+
|
|
49
|
+
Use `BumperDecorator` from a scoped export when writing Storybook stories.
|
|
50
|
+
|
|
51
|
+
```tsx
|
|
52
|
+
import { BumperDecorator } from '@ornikar/bumper/storybook';
|
|
53
|
+
|
|
54
|
+
export default {
|
|
55
|
+
decorators: [BumperDecorator],
|
|
56
|
+
};
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
## Structure
|
|
60
|
+
|
|
61
|
+
### Exports
|
|
62
|
+
|
|
63
|
+
| Import path | What it provides |
|
|
64
|
+
| --------------------------------------- | -------------------------------------------- |
|
|
65
|
+
| `@ornikar/bumper` | All components, hooks, and types |
|
|
66
|
+
| `@ornikar/bumper/storybook` | `BumperDecorator` for Storybook stories |
|
|
67
|
+
| `@ornikar/bumper/src/tamagui.config.ts` | Tamagui config for the Babel compiler plugin |
|
|
68
|
+
|
|
69
|
+
### Layout
|
|
70
|
+
|
|
71
|
+
```
|
|
72
|
+
src
|
|
73
|
+
├── index.ts
|
|
74
|
+
├── storybook.ts
|
|
75
|
+
├── tamagui.config.ts
|
|
76
|
+
├── shared
|
|
77
|
+
│ └── storybook
|
|
78
|
+
└── system
|
|
79
|
+
├── action
|
|
80
|
+
├── communication
|
|
81
|
+
├── content
|
|
82
|
+
├── control
|
|
83
|
+
├── core
|
|
84
|
+
├── dataDisplay
|
|
85
|
+
├── form
|
|
86
|
+
├── loading
|
|
87
|
+
├── navigation
|
|
88
|
+
├── overlay
|
|
89
|
+
└── layout
|
|
90
|
+
```
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
export { BumperDecorator } from './shared/storybook/BumperDecorator';
|
|
2
1
|
export { BumperProvider } from './system/core/provider/BumperProvider';
|
|
3
2
|
export type { CenterProps } from './system/core/primitives/Center';
|
|
4
3
|
export { Center } from './system/core/primitives/Center';
|
|
@@ -25,4 +24,6 @@ export type { SwitchBreakpointsProps } from './system/core/breakpoints/SwitchBre
|
|
|
25
24
|
export { SwitchBreakpoints } from './system/core/breakpoints/SwitchBreakpoins';
|
|
26
25
|
export type { ValueForBreakpoint } from './system/core/breakpoints/utils/breakpointsUtils';
|
|
27
26
|
export { getValueForBreakpoint } from './system/core/breakpoints/utils/breakpointsUtils';
|
|
27
|
+
export type { LoaderProps } from './system/loading/loader/Loader';
|
|
28
|
+
export { Loader } from './system/loading/loader/Loader';
|
|
28
29
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,uCAAuC,CAAC;AAGvE,YAAY,EAAE,WAAW,EAAE,MAAM,iCAAiC,CAAC;AACnE,OAAO,EAAE,MAAM,EAAE,MAAM,iCAAiC,CAAC;AACzD,YAAY,EAAE,UAAU,EAAE,MAAM,sCAAsC,CAAC;AACvE,OAAO,EAAE,KAAK,EAAE,MAAM,sCAAsC,CAAC;AAC7D,YAAY,EAAE,cAAc,EAAE,MAAM,oCAAoC,CAAC;AACzE,OAAO,EAAE,SAAS,EAAE,MAAM,oCAAoC,CAAC;AAC/D,YAAY,EAAE,eAAe,EAAE,MAAM,gDAAgD,CAAC;AACtF,OAAO,EAAE,UAAU,EAAE,MAAM,gDAAgD,CAAC;AAC5E,YAAY,EAAE,WAAW,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,gCAAgC,CAAC;AAC3F,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,gCAAgC,CAAC;AACvE,YAAY,EAAE,SAAS,EAAE,MAAM,+BAA+B,CAAC;AAC/D,OAAO,EAAE,IAAI,EAAE,MAAM,+BAA+B,CAAC;AAGrD,OAAO,EAAE,UAAU,EAAE,MAAM,6BAA6B,CAAC;AACzD,YAAY,EAAE,mBAAmB,EAAE,MAAM,wCAAwC,CAAC;AAClF,YAAY,EAAE,mBAAmB,EAAE,MAAM,4CAA4C,CAAC;AACtF,YAAY,EAAE,mBAAmB,EAAE,MAAM,4CAA4C,CAAC;AAGtF,YAAY,EAAE,UAAU,EAAE,MAAM,mCAAmC,CAAC;AACpE,OAAO,EAAE,KAAK,EAAE,MAAM,mCAAmC,CAAC;AAG1D,OAAO,EAAE,kBAAkB,EAAE,MAAM,oDAAoD,CAAC;AACxF,OAAO,EAAE,wBAAwB,EAAE,MAAM,0DAA0D,CAAC;AACpG,OAAO,EAAE,aAAa,EAAE,MAAM,+CAA+C,CAAC;AAC9E,YAAY,EAAE,sBAAsB,EAAE,MAAM,4CAA4C,CAAC;AACzF,OAAO,EAAE,iBAAiB,EAAE,MAAM,4CAA4C,CAAC;AAC/E,YAAY,EAAE,kBAAkB,EAAE,MAAM,kDAAkD,CAAC;AAC3F,OAAO,EAAE,qBAAqB,EAAE,MAAM,kDAAkD,CAAC;AAGzF,YAAY,EAAE,WAAW,EAAE,MAAM,gCAAgC,CAAC;AAClE,OAAO,EAAE,MAAM,EAAE,MAAM,gCAAgC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"storybook.d.ts","sourceRoot":"","sources":["../../src/storybook.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,oCAAoC,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { ReactNode } from 'react';
|
|
2
|
+
import type { TamaguiMediaProps } from '../../types';
|
|
3
|
+
import type { LoaderSize } from './loaderConfig';
|
|
4
|
+
interface InternalLoaderProps {
|
|
5
|
+
/** The size of the loader. `'icon'` renders a small 20px loader, `'page'` renders a larger 48px loader.
|
|
6
|
+
* @default 'page'
|
|
7
|
+
* */
|
|
8
|
+
size?: LoaderSize;
|
|
9
|
+
/** Whether the loader is displayed on a contrasted (dark) background. When `true`, uses a high-contrast foreground color.
|
|
10
|
+
* @default false
|
|
11
|
+
* */
|
|
12
|
+
isOnContrasted?: boolean;
|
|
13
|
+
/** Test ID passed to the root container for testing purposes. */
|
|
14
|
+
testID?: string;
|
|
15
|
+
}
|
|
16
|
+
export type LoaderProps = TamaguiMediaProps<InternalLoaderProps>;
|
|
17
|
+
export declare function Loader({ size, isOnContrasted, testID }: LoaderProps): ReactNode;
|
|
18
|
+
export {};
|
|
19
|
+
//# sourceMappingURL=Loader.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Loader.d.ts","sourceRoot":"","sources":["../../../../../src/system/loading/loader/Loader.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAIvC,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAIrD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAiBjD,UAAU,mBAAmB;IAC3B;;SAEK;IACL,IAAI,CAAC,EAAE,UAAU,CAAC;IAClB;;SAEK;IACL,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,iEAAiE;IACjE,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,MAAM,WAAW,GAAG,iBAAiB,CAAC,mBAAmB,CAAC,CAAC;AAEjE,wBAAgB,MAAM,CAAC,EAAE,IAAa,EAAE,cAAsB,EAAE,MAAM,EAAE,EAAE,WAAW,GAAG,SAAS,CAuBhG"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { Circle } from 'react-native-svg';
|
|
2
|
+
export declare const LoaderBackgroundCircle: import("@tamagui/core").TamaguiComponent<import("@tamagui/core").TamaDefer, Circle, import("@tamagui/core").TamaguiComponentPropsBaseBase & import("react-native-svg").CircleProps, import("@tamagui/core").StackStyleBase, {
|
|
3
|
+
size?: "page" | "icon" | undefined;
|
|
4
|
+
}, import("@tamagui/core").StaticConfigPublic>;
|
|
5
|
+
//# sourceMappingURL=LoaderBackgroundCircle.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"LoaderBackgroundCircle.d.ts","sourceRoot":"","sources":["../../../../../src/system/loading/loader/LoaderBackgroundCircle.tsx"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAK1C,eAAO,MAAM,sBAAsB;;8CAQjC,CAAC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import Svg from 'react-native-svg';
|
|
2
|
+
export declare const LoaderCircleWrapper: import("@tamagui/core").TamaguiComponent<import("@tamagui/core").TamaDefer, Svg, import("@tamagui/core").TamaguiComponentPropsBaseBase & import("react-native-svg").SvgProps, import("@tamagui/core").StackStyleBase, {
|
|
3
|
+
size?: "page" | "icon" | undefined;
|
|
4
|
+
isForeground?: boolean | undefined;
|
|
5
|
+
}, import("@tamagui/core").StaticConfigPublic>;
|
|
6
|
+
//# sourceMappingURL=LoaderCircleWrapper.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"LoaderCircleWrapper.d.ts","sourceRoot":"","sources":["../../../../../src/system/loading/loader/LoaderCircleWrapper.tsx"],"names":[],"mappings":"AACA,OAAO,GAAG,MAAM,kBAAkB,CAAC;AAKnC,eAAO,MAAM,mBAAmB;;;8CAY9B,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { ReactNode } from 'react';
|
|
2
|
+
import type { SharedValue } from 'react-native-reanimated';
|
|
3
|
+
import type { LoaderSize } from './loaderConfig';
|
|
4
|
+
interface LoaderForegroundCircleProps {
|
|
5
|
+
color: string;
|
|
6
|
+
size: LoaderSize;
|
|
7
|
+
progress: SharedValue<number>;
|
|
8
|
+
}
|
|
9
|
+
export declare function LoaderForegroundCircle({ color, size, progress }: LoaderForegroundCircleProps): ReactNode;
|
|
10
|
+
export {};
|
|
11
|
+
//# sourceMappingURL=LoaderForegroundCircle.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"LoaderForegroundCircle.d.ts","sourceRoot":"","sources":["../../../../../src/system/loading/loader/LoaderForegroundCircle.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AACvC,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAG3D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAKjD,UAAU,2BAA2B;IACnC,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,UAAU,CAAC;IACjB,QAAQ,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;CAC/B;AAED,wBAAgB,sBAAsB,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,2BAA2B,GAAG,SAAS,CAuBxG"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
export type LoaderSize = 'icon' | 'page';
|
|
2
|
+
interface LoaderConfig {
|
|
3
|
+
size: number;
|
|
4
|
+
strokeWidth: number;
|
|
5
|
+
center: number;
|
|
6
|
+
radius: number;
|
|
7
|
+
circumference: number;
|
|
8
|
+
viewBox: string;
|
|
9
|
+
}
|
|
10
|
+
export declare const LOADER_SIZE_CONFIG: Record<LoaderSize, LoaderConfig>;
|
|
11
|
+
export declare const LOADER_ANIMATION: {
|
|
12
|
+
duration: number;
|
|
13
|
+
easing: import("react-native-reanimated").EasingFunction;
|
|
14
|
+
};
|
|
15
|
+
export {};
|
|
16
|
+
//# sourceMappingURL=loaderConfig.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"loaderConfig.d.ts","sourceRoot":"","sources":["../../../../../src/system/loading/loader/loaderConfig.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,UAAU,GAAG,MAAM,GAAG,MAAM,CAAC;AACzC,UAAU,YAAY;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,aAAa,EAAE,MAAM,CAAC;IACtB,OAAO,EAAE,MAAM,CAAC;CACjB;AAiBD,eAAO,MAAM,kBAAkB,EAAE,MAAM,CAAC,UAAU,EAAE,YAAY,CAG/D,CAAC;AAEF,eAAO,MAAM,gBAAgB;;;CAG5B,CAAC"}
|
|
@@ -1,10 +1,11 @@
|
|
|
1
|
-
import { makeDecorator } from '@storybook/preview-api';
|
|
2
1
|
import { px, createFont, createTokens, createTamagui, TamaguiProvider, styled, View, Stack, Text, useStyle, useMedia } from '@tamagui/core';
|
|
3
2
|
export { Stack, View } from '@tamagui/core';
|
|
4
3
|
import _objectSpread from '@babel/runtime/helpers/objectSpread2';
|
|
5
|
-
import { jsx } from 'react/jsx-runtime';
|
|
4
|
+
import { jsx, jsxs } from 'react/jsx-runtime';
|
|
6
5
|
import _objectWithoutProperties from '@babel/runtime/helpers/objectWithoutProperties';
|
|
7
|
-
import { createContext, useContext, cloneElement, useMemo } from 'react';
|
|
6
|
+
import { createContext, useContext, cloneElement, useMemo, useEffect } from 'react';
|
|
7
|
+
import Animated, { Easing, useAnimatedProps, useSharedValue, withRepeat, withTiming } from 'react-native-reanimated';
|
|
8
|
+
import Svg, { Circle } from 'react-native-svg';
|
|
8
9
|
export { Image } from '@tamagui/image';
|
|
9
10
|
export { ScrollView } from '@tamagui/scroll-view';
|
|
10
11
|
export { useWindowDimensions as useWindowSize } from 'react-native';
|
|
@@ -398,16 +399,6 @@ function BumperProvider({
|
|
|
398
399
|
});
|
|
399
400
|
}
|
|
400
401
|
|
|
401
|
-
const BumperDecorator = makeDecorator({
|
|
402
|
-
name: 'BumperDecorator',
|
|
403
|
-
parameterName: 'bumper',
|
|
404
|
-
wrapper: (storyFn, context) => {
|
|
405
|
-
return /*#__PURE__*/jsx(BumperProvider, {
|
|
406
|
-
children: storyFn(context)
|
|
407
|
-
});
|
|
408
|
-
}
|
|
409
|
-
});
|
|
410
|
-
|
|
411
402
|
const Center = styled(View, {
|
|
412
403
|
justifyContent: 'center',
|
|
413
404
|
alignItems: 'center'
|
|
@@ -797,5 +788,162 @@ function SwitchBreakpoints(values) {
|
|
|
797
788
|
return getValueForBreakpoint(breakpoint, values);
|
|
798
789
|
}
|
|
799
790
|
|
|
800
|
-
|
|
791
|
+
function createLoaderSizeConfig(size, strokeWidth) {
|
|
792
|
+
const center = size / 2;
|
|
793
|
+
const radius = center - strokeWidth;
|
|
794
|
+
const circumference = 2 * Math.PI * radius;
|
|
795
|
+
return {
|
|
796
|
+
size,
|
|
797
|
+
strokeWidth,
|
|
798
|
+
center,
|
|
799
|
+
radius,
|
|
800
|
+
circumference,
|
|
801
|
+
viewBox: `0 0 ${size} ${size}`
|
|
802
|
+
};
|
|
803
|
+
}
|
|
804
|
+
const LOADER_SIZE_CONFIG = {
|
|
805
|
+
icon: createLoaderSizeConfig(20, 1.5),
|
|
806
|
+
page: createLoaderSizeConfig(48, 3)
|
|
807
|
+
};
|
|
808
|
+
const LOADER_ANIMATION = {
|
|
809
|
+
duration: 2000,
|
|
810
|
+
easing: Easing.inOut(Easing.ease)
|
|
811
|
+
};
|
|
812
|
+
|
|
813
|
+
const {
|
|
814
|
+
icon: icon$2,
|
|
815
|
+
page: page$2
|
|
816
|
+
} = LOADER_SIZE_CONFIG;
|
|
817
|
+
const LoaderBackgroundCircle = styled(Circle, {
|
|
818
|
+
fill: 'none',
|
|
819
|
+
variants: {
|
|
820
|
+
size: {
|
|
821
|
+
icon: {
|
|
822
|
+
strokeWidth: icon$2.strokeWidth,
|
|
823
|
+
cx: icon$2.center,
|
|
824
|
+
cy: icon$2.center,
|
|
825
|
+
r: icon$2.radius
|
|
826
|
+
},
|
|
827
|
+
page: {
|
|
828
|
+
strokeWidth: page$2.strokeWidth,
|
|
829
|
+
cx: page$2.center,
|
|
830
|
+
cy: page$2.center,
|
|
831
|
+
r: page$2.radius
|
|
832
|
+
}
|
|
833
|
+
}
|
|
834
|
+
}
|
|
835
|
+
});
|
|
836
|
+
|
|
837
|
+
const {
|
|
838
|
+
icon: icon$1,
|
|
839
|
+
page: page$1
|
|
840
|
+
} = LOADER_SIZE_CONFIG;
|
|
841
|
+
const LoaderCircleWrapper = styled(Svg, {
|
|
842
|
+
variants: {
|
|
843
|
+
size: {
|
|
844
|
+
icon: {
|
|
845
|
+
width: icon$1.size,
|
|
846
|
+
height: icon$1.size,
|
|
847
|
+
viewBox: icon$1.viewBox
|
|
848
|
+
},
|
|
849
|
+
page: {
|
|
850
|
+
width: page$1.size,
|
|
851
|
+
height: page$1.size,
|
|
852
|
+
viewBox: page$1.viewBox
|
|
853
|
+
}
|
|
854
|
+
},
|
|
855
|
+
isForeground: {
|
|
856
|
+
true: {
|
|
857
|
+
position: 'absolute'
|
|
858
|
+
}
|
|
859
|
+
}
|
|
860
|
+
}
|
|
861
|
+
});
|
|
862
|
+
|
|
863
|
+
const AnimatedCircle = Animated.createAnimatedComponent(Circle);
|
|
864
|
+
function LoaderForegroundCircle({
|
|
865
|
+
color,
|
|
866
|
+
size,
|
|
867
|
+
progress
|
|
868
|
+
}) {
|
|
869
|
+
const {
|
|
870
|
+
center,
|
|
871
|
+
radius,
|
|
872
|
+
circumference,
|
|
873
|
+
strokeWidth
|
|
874
|
+
} = LOADER_SIZE_CONFIG[size];
|
|
875
|
+
const animatedProps = useAnimatedProps(() => ({
|
|
876
|
+
strokeDashoffset: circumference - 2 * circumference * progress.value
|
|
877
|
+
}), [circumference, progress]);
|
|
878
|
+
return /*#__PURE__*/jsx(AnimatedCircle, {
|
|
879
|
+
cx: center,
|
|
880
|
+
cy: center,
|
|
881
|
+
r: radius,
|
|
882
|
+
stroke: color,
|
|
883
|
+
strokeWidth: strokeWidth,
|
|
884
|
+
strokeLinecap: "round",
|
|
885
|
+
fill: "none",
|
|
886
|
+
strokeDasharray: circumference,
|
|
887
|
+
animatedProps: animatedProps
|
|
888
|
+
});
|
|
889
|
+
}
|
|
890
|
+
|
|
891
|
+
const {
|
|
892
|
+
icon,
|
|
893
|
+
page
|
|
894
|
+
} = LOADER_SIZE_CONFIG;
|
|
895
|
+
const LoaderContainer = styled(View, {
|
|
896
|
+
name: 'Loader',
|
|
897
|
+
position: 'relative',
|
|
898
|
+
rotate: '-90deg',
|
|
899
|
+
variants: {
|
|
900
|
+
size: {
|
|
901
|
+
icon: {
|
|
902
|
+
width: icon.size,
|
|
903
|
+
height: icon.size
|
|
904
|
+
},
|
|
905
|
+
page: {
|
|
906
|
+
width: page.size,
|
|
907
|
+
height: page.size
|
|
908
|
+
}
|
|
909
|
+
}
|
|
910
|
+
}
|
|
911
|
+
});
|
|
912
|
+
function Loader({
|
|
913
|
+
size = 'page',
|
|
914
|
+
isOnContrasted = false,
|
|
915
|
+
testID
|
|
916
|
+
}) {
|
|
917
|
+
const backgroundStyle = useStyle({
|
|
918
|
+
color: '$border.base.mid'
|
|
919
|
+
});
|
|
920
|
+
const foregroundStyle = useStyle({
|
|
921
|
+
color: isOnContrasted ? '$border.base.onContrasted.hi' : '$content.accent'
|
|
922
|
+
});
|
|
923
|
+
const progress = useSharedValue(0);
|
|
924
|
+
useEffect(() => {
|
|
925
|
+
progress.value = withRepeat(withTiming(1, LOADER_ANIMATION), -1, false);
|
|
926
|
+
}, [progress]);
|
|
927
|
+
return /*#__PURE__*/jsxs(LoaderContainer, {
|
|
928
|
+
size: size,
|
|
929
|
+
testID: testID,
|
|
930
|
+
children: [/*#__PURE__*/jsx(LoaderCircleWrapper, {
|
|
931
|
+
size: size,
|
|
932
|
+
children: /*#__PURE__*/jsx(LoaderBackgroundCircle, {
|
|
933
|
+
size: size,
|
|
934
|
+
stroke: backgroundStyle.color
|
|
935
|
+
})
|
|
936
|
+
}), /*#__PURE__*/jsx(LoaderCircleWrapper, {
|
|
937
|
+
isForeground: true,
|
|
938
|
+
size: size,
|
|
939
|
+
children: /*#__PURE__*/jsx(LoaderForegroundCircle, {
|
|
940
|
+
color: String(foregroundStyle.color),
|
|
941
|
+
size: size,
|
|
942
|
+
progress: progress
|
|
943
|
+
})
|
|
944
|
+
})]
|
|
945
|
+
});
|
|
946
|
+
}
|
|
947
|
+
|
|
948
|
+
export { Badge, BumperProvider, Center, HStack, Loader, Pressable, SwitchBreakpoints, Typography, VStack, getValueForBreakpoint, useBreakpointValue, useCurrentBreakpointName };
|
|
801
949
|
//# sourceMappingURL=index-metro.es.android.js.map
|