@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.
Files changed (63) hide show
  1. package/CHANGELOG.md +14 -0
  2. package/README.md +90 -0
  3. package/dist/definitions/index.d.ts +2 -1
  4. package/dist/definitions/index.d.ts.map +1 -1
  5. package/dist/definitions/storybook.d.ts +2 -0
  6. package/dist/definitions/storybook.d.ts.map +1 -0
  7. package/dist/definitions/system/loading/loader/Loader.d.ts +19 -0
  8. package/dist/definitions/system/loading/loader/Loader.d.ts.map +1 -0
  9. package/dist/definitions/system/loading/loader/LoaderBackgroundCircle.d.ts +5 -0
  10. package/dist/definitions/system/loading/loader/LoaderBackgroundCircle.d.ts.map +1 -0
  11. package/dist/definitions/system/loading/loader/LoaderCircleWrapper.d.ts +6 -0
  12. package/dist/definitions/system/loading/loader/LoaderCircleWrapper.d.ts.map +1 -0
  13. package/dist/definitions/system/loading/loader/LoaderForegroundCircle.d.ts +11 -0
  14. package/dist/definitions/system/loading/loader/LoaderForegroundCircle.d.ts.map +1 -0
  15. package/dist/definitions/system/loading/loader/loaderConfig.d.ts +16 -0
  16. package/dist/definitions/system/loading/loader/loaderConfig.d.ts.map +1 -0
  17. package/dist/index-metro.es.android.js +162 -14
  18. package/dist/index-metro.es.android.js.map +1 -1
  19. package/dist/index-metro.es.ios.js +162 -14
  20. package/dist/index-metro.es.ios.js.map +1 -1
  21. package/dist/index-node-22.22.cjs.js +165 -12
  22. package/dist/index-node-22.22.cjs.js.map +1 -1
  23. package/dist/index-node-22.22.cjs.web.js +165 -12
  24. package/dist/index-node-22.22.cjs.web.js.map +1 -1
  25. package/dist/index-node-22.22.es.mjs +162 -14
  26. package/dist/index-node-22.22.es.mjs.map +1 -1
  27. package/dist/index-node-22.22.es.web.mjs +162 -14
  28. package/dist/index-node-22.22.es.web.mjs.map +1 -1
  29. package/dist/index.es.js +157 -14
  30. package/dist/index.es.js.map +1 -1
  31. package/dist/index.es.web.js +157 -14
  32. package/dist/index.es.web.js.map +1 -1
  33. package/dist/storybook-metro.es.android.js +402 -0
  34. package/dist/storybook-metro.es.android.js.map +1 -0
  35. package/dist/storybook-metro.es.ios.js +402 -0
  36. package/dist/storybook-metro.es.ios.js.map +1 -0
  37. package/dist/storybook-node-22.22.cjs.js +406 -0
  38. package/dist/storybook-node-22.22.cjs.js.map +1 -0
  39. package/dist/storybook-node-22.22.cjs.web.js +406 -0
  40. package/dist/storybook-node-22.22.cjs.web.js.map +1 -0
  41. package/dist/storybook-node-22.22.es.mjs +402 -0
  42. package/dist/storybook-node-22.22.es.mjs.map +1 -0
  43. package/dist/storybook-node-22.22.es.web.mjs +402 -0
  44. package/dist/storybook-node-22.22.es.web.mjs.map +1 -0
  45. package/dist/storybook.es.js +399 -0
  46. package/dist/storybook.es.js.map +1 -0
  47. package/dist/storybook.es.web.js +399 -0
  48. package/dist/storybook.es.web.js.map +1 -0
  49. package/dist/tsbuildinfo +1 -1
  50. package/package.json +42 -5
  51. package/src/index.ts +4 -1
  52. package/src/storybook.ts +1 -0
  53. package/src/system/loading/loader/Loader.features.stories.tsx +45 -0
  54. package/src/system/loading/loader/Loader.stories.tsx +28 -0
  55. package/src/system/loading/loader/Loader.tsx +65 -0
  56. package/src/system/loading/loader/LoaderBackgroundCircle.tsx +15 -0
  57. package/src/system/loading/loader/LoaderCircleWrapper.tsx +19 -0
  58. package/src/system/loading/loader/LoaderForegroundCircle.tsx +39 -0
  59. package/src/system/loading/loader/__snapshots__/Loader.features.stories.tsx.snap +703 -0
  60. package/src/system/loading/loader/__snapshots__/Loader.stories.tsx.snap +159 -0
  61. package/src/system/loading/loader/__snapshots_web__/Loader.features.stories.tsx.snap +225 -0
  62. package/src/system/loading/loader/__snapshots_web__/Loader.stories.tsx.snap +60 -0
  63. 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,eAAe,EAAE,MAAM,oCAAoC,CAAC;AACrE,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"}
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,2 @@
1
+ export { BumperDecorator } from './shared/storybook/BumperDecorator';
2
+ //# sourceMappingURL=storybook.d.ts.map
@@ -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
- export { Badge, BumperDecorator, BumperProvider, Center, HStack, Pressable, SwitchBreakpoints, Typography, VStack, getValueForBreakpoint, useBreakpointValue, useCurrentBreakpointName };
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