@alveole/components 1.1.2 → 1.2.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 (53) hide show
  1. package/dist/core/PdfViewer/PdfViewer.js +2 -2
  2. package/dist/generated/version.d.ts +1 -1
  3. package/dist/generated/version.js +1 -1
  4. package/dist/stories/index.d.ts +1 -0
  5. package/dist/stories/index.d.ts.map +1 -1
  6. package/dist/stories/index.js +1 -0
  7. package/dist/ui/Button/Button.d.ts.map +1 -1
  8. package/dist/ui/Button/Button.js +3 -2
  9. package/dist/ui/Button/Button.stories.d.ts +23 -12
  10. package/dist/ui/Button/Button.stories.d.ts.map +1 -1
  11. package/dist/ui/Button/Button.stories.js +18 -0
  12. package/dist/ui/Button/Button.stories.sources.d.ts +2 -0
  13. package/dist/ui/Button/Button.stories.sources.d.ts.map +1 -1
  14. package/dist/ui/Button/Button.stories.sources.js +3 -0
  15. package/dist/ui/ListItem/ListItem.d.ts.map +1 -1
  16. package/dist/ui/ListItem/ListItem.js +2 -2
  17. package/dist/ui/ListItem/ListItem.stories.d.ts +5 -0
  18. package/dist/ui/ListItem/ListItem.stories.d.ts.map +1 -1
  19. package/dist/ui/ListItem/ListItem.stories.js +5 -0
  20. package/dist/ui/ListItem/ListItem.stories.sources.d.ts.map +1 -1
  21. package/dist/ui/ListItem/ListItem.stories.sources.js +1 -0
  22. package/dist/ui/ResourceList/ResourceList.js +2 -2
  23. package/dist/ui/ResourceList/ResourceList.stories.d.ts +7 -0
  24. package/dist/ui/ResourceList/ResourceList.stories.d.ts.map +1 -1
  25. package/dist/ui/ResourceList/ResourceList.stories.js +7 -0
  26. package/dist/ui/ResourceList/ResourceList.stories.sources.d.ts +3 -0
  27. package/dist/ui/ResourceList/ResourceList.stories.sources.d.ts.map +1 -1
  28. package/dist/ui/ResourceList/ResourceList.stories.sources.js +5 -0
  29. package/dist/ui/Spinner/Spinner.d.ts +5 -0
  30. package/dist/ui/Spinner/Spinner.d.ts.map +1 -0
  31. package/dist/ui/Spinner/Spinner.js +47 -0
  32. package/dist/ui/Spinner/Spinner.shared.d.ts +12 -0
  33. package/dist/ui/Spinner/Spinner.shared.d.ts.map +1 -0
  34. package/dist/ui/Spinner/Spinner.shared.js +3 -0
  35. package/dist/ui/Spinner/Spinner.stories.d.ts +21 -0
  36. package/dist/ui/Spinner/Spinner.stories.d.ts.map +1 -0
  37. package/dist/ui/Spinner/Spinner.stories.js +25 -0
  38. package/dist/ui/Spinner/Spinner.stories.sources.d.ts +8 -0
  39. package/dist/ui/Spinner/Spinner.stories.sources.d.ts.map +1 -0
  40. package/dist/ui/Spinner/Spinner.stories.sources.js +8 -0
  41. package/dist/ui/Spinner/Spinner.styles.d.ts +9 -0
  42. package/dist/ui/Spinner/Spinner.styles.d.ts.map +1 -0
  43. package/dist/ui/Spinner/Spinner.styles.js +5 -0
  44. package/dist/ui/Spinner/Spinner.web.d.ts +5 -0
  45. package/dist/ui/Spinner/Spinner.web.d.ts.map +1 -0
  46. package/dist/ui/Spinner/Spinner.web.js +53 -0
  47. package/dist/ui/Spinner/index.d.ts +2 -0
  48. package/dist/ui/Spinner/index.d.ts.map +1 -0
  49. package/dist/ui/Spinner/index.js +1 -0
  50. package/dist/ui/index.d.ts +1 -0
  51. package/dist/ui/index.d.ts.map +1 -1
  52. package/dist/ui/index.js +1 -0
  53. package/package.json +5 -4
@@ -1,8 +1,8 @@
1
1
  import { jsx as _jsx } from "react/jsx-runtime";
2
- import { ActivityIndicator } from 'react-native';
3
2
  import WebView from 'react-native-webview';
3
+ import { Spinner } from '../../ui/Spinner';
4
4
  import { Box } from '../Box';
5
5
  export const PdfViewer = (props) => {
6
6
  const { source, headers } = props;
7
- return (_jsx(Box, { tag: "pdf-viewer", flex: 1, children: _jsx(WebView, { source: { uri: source, headers }, startInLoadingState: true, renderLoading: () => (_jsx(Box, { flex: 1, style: { alignItems: 'center', justifyContent: 'center' }, children: _jsx(ActivityIndicator, { size: "large" }) })), style: { flex: 1 } }) }));
7
+ return (_jsx(Box, { tag: "pdf-viewer", flex: 1, children: _jsx(WebView, { source: { uri: source, headers }, startInLoadingState: true, renderLoading: () => (_jsx(Box, { flex: 1, style: { alignItems: 'center', justifyContent: 'center' }, children: _jsx(Spinner, { size: "lg" }) })), style: { flex: 1 } }) }));
8
8
  };
@@ -1,2 +1,2 @@
1
- export declare const ALVEOLE_COMPONENTS_VERSION: "1.1.2";
1
+ export declare const ALVEOLE_COMPONENTS_VERSION: "1.2.0";
2
2
  //# sourceMappingURL=version.d.ts.map
@@ -1 +1 @@
1
- export const ALVEOLE_COMPONENTS_VERSION = "1.1.2";
1
+ export const ALVEOLE_COMPONENTS_VERSION = "1.2.0";
@@ -57,6 +57,7 @@ export * as SelectStory from '../ui/Select/Select.stories';
57
57
  export * as SelectMultipleStory from '../ui/SelectMultiple/SelectMultiple.stories';
58
58
  export * as SidebarStory from '../ui/Sidebar/Sidebar.stories';
59
59
  export * as SignatureStory from '../ui/Signature/Signature.stories';
60
+ export * as SpinnerStory from '../ui/Spinner/Spinner.stories';
60
61
  export * as SwitchStory from '../ui/Switch/Switch.stories';
61
62
  export * as TabsStory from '../ui/Tabs/Tabs.stories';
62
63
  export * as TagStory from '../ui/Tag/Tag.stories';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/stories/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/stories/index.ts"],"names":[],"mappings":"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"}
@@ -59,6 +59,7 @@ export * as SelectStory from '../ui/Select/Select.stories';
59
59
  export * as SelectMultipleStory from '../ui/SelectMultiple/SelectMultiple.stories';
60
60
  export * as SidebarStory from '../ui/Sidebar/Sidebar.stories';
61
61
  export * as SignatureStory from '../ui/Signature/Signature.stories';
62
+ export * as SpinnerStory from '../ui/Spinner/Spinner.stories';
62
63
  export * as SwitchStory from '../ui/Switch/Switch.stories';
63
64
  export * as TabsStory from '../ui/Tabs/Tabs.stories';
64
65
  export * as TagStory from '../ui/Tag/Tag.stories';
@@ -1 +1 @@
1
- {"version":3,"file":"Button.d.ts","sourceRoot":"","sources":["../../../src/ui/Button/Button.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAwB,MAAM,OAAO,CAAC;AAC7C,OAAO,EAAgC,cAAc,EAA8B,IAAI,EAAE,MAAM,cAAc,CAAC;AAC9G,OAAO,EAAO,QAAQ,EAAc,MAAM,YAAY,CAAC;AACvD,OAAO,EAAE,SAAS,EAAc,MAAM,eAAe,CAAC;AAOtD,MAAM,MAAM,WAAW,GAAG,IAAI,CAAC,cAAc,EAAE,UAAU,GAAG,OAAO,CAAC,GAAG;IACrE,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;IACjC,OAAO,EAAE,SAAS,GAAG,WAAW,GAAG,UAAU,GAAG,QAAQ,GAAG,MAAM,CAAC;IAClE,SAAS,CAAC,EAAE,SAAS,CAAC,MAAM,CAAC,CAAC;IAC9B,OAAO,CAAC,EAAE,SAAS,CAAC,MAAM,CAAC,CAAC;IAC5B,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,cAAc,CAAC,EAAE,QAAQ,CAAC;IAC1B,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,IAAI,CAAC,EAAE,QAAQ,GAAG,QAAQ,CAAC;IAC3B,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB,CAAC;AAEF,eAAO,MAAM,MAAM;WAhBV,MAAM;WACN,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI;aACvB,SAAS,GAAG,WAAW,GAAG,UAAU,GAAG,QAAQ,GAAG,MAAM;gBACrD,SAAS,CAAC,MAAM,CAAC;cACnB,SAAS,CAAC,MAAM,CAAC;eAChB,OAAO;qBACD,QAAQ;gBACb,OAAO;gBACP,OAAO;iBACN,OAAO;gBACR,OAAO;WACZ,QAAQ,GAAG,QAAQ;aACjB,OAAO;gBACJ,OAAO;8BAiPnB,CAAC"}
1
+ {"version":3,"file":"Button.d.ts","sourceRoot":"","sources":["../../../src/ui/Button/Button.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAwB,MAAM,OAAO,CAAC;AAC7C,OAAO,EAAa,cAAc,EAA8B,IAAI,EAAE,MAAM,cAAc,CAAC;AAC3F,OAAO,EAAO,QAAQ,EAAc,MAAM,YAAY,CAAC;AACvD,OAAO,EAAE,SAAS,EAAc,MAAM,eAAe,CAAC;AAQtD,MAAM,MAAM,WAAW,GAAG,IAAI,CAAC,cAAc,EAAE,UAAU,GAAG,OAAO,CAAC,GAAG;IACrE,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;IACjC,OAAO,EAAE,SAAS,GAAG,WAAW,GAAG,UAAU,GAAG,QAAQ,GAAG,MAAM,CAAC;IAClE,SAAS,CAAC,EAAE,SAAS,CAAC,MAAM,CAAC,CAAC;IAC9B,OAAO,CAAC,EAAE,SAAS,CAAC,MAAM,CAAC,CAAC;IAC5B,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,cAAc,CAAC,EAAE,QAAQ,CAAC;IAC1B,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,IAAI,CAAC,EAAE,QAAQ,GAAG,QAAQ,CAAC;IAC3B,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB,CAAC;AAEF,eAAO,MAAM,MAAM;WAhBV,MAAM;WACN,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI;aACvB,SAAS,GAAG,WAAW,GAAG,UAAU,GAAG,QAAQ,GAAG,MAAM;gBACrD,SAAS,CAAC,MAAM,CAAC;cACnB,SAAS,CAAC,MAAM,CAAC;eAChB,OAAO;qBACD,QAAQ;gBACb,OAAO;gBACP,OAAO;iBACN,OAAO;gBACR,OAAO;WACZ,QAAQ,GAAG,QAAQ;aACjB,OAAO;gBACJ,OAAO;8BAiPnB,CAAC"}
@@ -1,8 +1,9 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  import React from 'react';
3
- import { ActivityIndicator, Pressable } from 'react-native';
3
+ import { Pressable } from 'react-native';
4
4
  import { Box, Typography } from '../../core';
5
5
  import { LucideIcon } from '../LucideIcon';
6
+ import { Spinner } from '../Spinner';
6
7
  import { useStyles } from './Button.styles';
7
8
  export const Button = React.forwardRef(function Button(props, ref) {
8
9
  const { title, type, size, variant, disabled, startIcon, endIcon, noPadding, borderNone, leftAlign, isLoading, selected, fullWidth = false, ContainerProps = {}, active = false, ...buttonProps } = props;
@@ -233,5 +234,5 @@ export const Button = React.forwardRef(function Button(props, ref) {
233
234
  ...(fullWidth ? { width: '100%' } : {}),
234
235
  };
235
236
  };
236
- return (_jsx(Pressable, { ref: ref, disabled: disabled, accessibilityRole: "button", ...(type === 'submit' ? { 'aria-selected': true } : {}), ...buttonProps, style: (state) => getPressableStyle(state), children: (state) => (_jsxs(Box, { style: [buttonContainerStyle({ pressed: state.pressed }), style], hoverStyle: { ...buttonContainerHoverStyle(), ...hoverStyle }, ...containerProps, children: [startIcon && _jsx(LucideIcon, { name: startIcon, ...iconStyle({ hovered: !!state.hovered }) }), _jsx(Typography, { "user-select": "false", style: textStyle({ hovered: !!state.hovered, pressed: !!state.pressed }), children: title }), isLoading ? (_jsx(ActivityIndicator, { size: "small", style: styles.buttonLoader })) : (endIcon && _jsx(LucideIcon, { name: endIcon, ...iconStyle({ hovered: !!state.hovered }) }))] })) }));
237
+ return (_jsx(Pressable, { ref: ref, disabled: disabled, accessibilityRole: "button", ...(type === 'submit' ? { 'aria-selected': true } : {}), ...buttonProps, style: (state) => getPressableStyle(state), children: (state) => (_jsxs(Box, { style: [buttonContainerStyle({ pressed: state.pressed }), style], hoverStyle: { ...buttonContainerHoverStyle(), ...hoverStyle }, ...containerProps, children: [startIcon && _jsx(LucideIcon, { name: startIcon, ...iconStyle({ hovered: !!state.hovered }) }), _jsx(Typography, { "user-select": "false", style: textStyle({ hovered: !!state.hovered, pressed: !!state.pressed }), children: title }), isLoading ? (_jsx(Spinner, { size: "sm", delay: "long", style: styles.buttonLoader })) : (endIcon && _jsx(LucideIcon, { name: endIcon, ...iconStyle({ hovered: !!state.hovered }) }))] })) }));
237
238
  });
@@ -1,10 +1,11 @@
1
+ import React from 'react';
1
2
  declare const _default: {
2
3
  title: string;
3
4
  tags: "ui"[];
4
5
  experimental: false;
5
6
  figmaURL: string;
6
7
  description: string;
7
- component: import("react").ForwardRefExoticComponent<Omit<import("react-native").PressableProps, "children" | "style"> & {
8
+ component: React.ForwardRefExoticComponent<Omit<import("react-native").PressableProps, "children" | "style"> & {
8
9
  title: string;
9
10
  size?: "xs" | "sm" | "md" | "lg";
10
11
  variant: "primary" | "secondary" | "tertiary" | "danger" | "link";
@@ -19,7 +20,7 @@ declare const _default: {
19
20
  type?: "button" | "submit";
20
21
  active?: boolean;
21
22
  isLoading?: boolean;
22
- } & import("react").RefAttributes<import("react-native").View>>;
23
+ } & React.RefAttributes<import("react-native").View>>;
23
24
  styleFn: () => {
24
25
  container: {
25
26
  borderTopLeftRadius: import("@alveole/theme").Radius;
@@ -304,17 +305,27 @@ declare const _default: {
304
305
  };
305
306
  };
306
307
  export default _default;
307
- export declare const Sizes: () => import("react").JSX.Element;
308
- export declare const Primary: () => import("react").JSX.Element;
309
- export declare const Secondary: () => import("react").JSX.Element;
310
- export declare const Tertiary: () => import("react").JSX.Element;
311
- export declare const Danger: () => import("react").JSX.Element;
308
+ export declare const Sizes: () => React.JSX.Element;
309
+ export declare const Primary: () => React.JSX.Element;
310
+ export declare const Secondary: () => React.JSX.Element;
311
+ export declare const Tertiary: () => React.JSX.Element;
312
+ export declare const Danger: () => React.JSX.Element;
312
313
  /** @deprecated Préférer les variants `primary`, `secondary` ou `tertiary`. */
313
- export declare const Link: () => import("react").JSX.Element;
314
- export declare const Icons: () => import("react").JSX.Element;
315
- export declare const FullWidth: () => import("react").JSX.Element;
316
- export declare const Selected: () => import("react").JSX.Element;
314
+ export declare const Link: () => React.JSX.Element;
315
+ export declare const Icons: () => React.JSX.Element;
316
+ export declare const FullWidth: () => React.JSX.Element;
317
+ export declare const Selected: () => React.JSX.Element;
317
318
  /** Utilisé quand le bouton est actif (ex : quand un menu est ouvert). */
318
- export declare const Active: () => import("react").JSX.Element;
319
+ export declare const Active: () => React.JSX.Element;
320
+ /**
321
+ * Le spinner n'apparaît qu'après **1 000 ms** (`delay="long"`).
322
+ *
323
+ * Ce délai évite un clignotement visuel quand l'opération se termine rapidement :
324
+ * si le serveur répond en moins d'une seconde, l'utilisateur ne voit jamais le spinner.
325
+ * Au-delà, le spinner s'affiche pour signaler que l'attente va durer.
326
+ *
327
+ * Appuyez sur le bouton pour simuler une opération de 3 secondes.
328
+ */
329
+ export declare const Loading: () => React.JSX.Element;
319
330
  export * as Sources from './Button.stories.sources';
320
331
  //# sourceMappingURL=Button.stories.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"Button.stories.d.ts","sourceRoot":"","sources":["../../../src/ui/Button/Button.stories.tsx"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAMA,wBAQkB;AAElB,eAAO,MAAM,KAAK,mCAMjB,CAAC;AAEF,eAAO,MAAM,OAAO,mCAKnB,CAAC;AAEF,eAAO,MAAM,SAAS,mCAKrB,CAAC;AAEF,eAAO,MAAM,QAAQ,mCAKpB,CAAC;AAEF,eAAO,MAAM,MAAM,mCAKlB,CAAC;AAEF,8EAA8E;AAC9E,eAAO,MAAM,IAAI,mCAMhB,CAAC;AAEF,eAAO,MAAM,KAAK,mCAQjB,CAAC;AAEF,eAAO,MAAM,SAAS,mCAAkE,CAAC;AAEzF,eAAO,MAAM,QAAQ,mCAIpB,CAAC;AAEF,yEAAyE;AACzE,eAAO,MAAM,MAAM,mCAIlB,CAAC;AAEF,OAAO,KAAK,OAAO,MAAM,0BAA0B,CAAC"}
1
+ {"version":3,"file":"Button.stories.d.ts","sourceRoot":"","sources":["../../../src/ui/Button/Button.stories.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAO1B,wBAQkB;AAElB,eAAO,MAAM,KAAK,yBAMjB,CAAC;AAEF,eAAO,MAAM,OAAO,yBAKnB,CAAC;AAEF,eAAO,MAAM,SAAS,yBAKrB,CAAC;AAEF,eAAO,MAAM,QAAQ,yBAKpB,CAAC;AAEF,eAAO,MAAM,MAAM,yBAKlB,CAAC;AAEF,8EAA8E;AAC9E,eAAO,MAAM,IAAI,yBAMhB,CAAC;AAEF,eAAO,MAAM,KAAK,yBAQjB,CAAC;AAEF,eAAO,MAAM,SAAS,yBAAkE,CAAC;AAEzF,eAAO,MAAM,QAAQ,yBAIpB,CAAC;AAEF,yEAAyE;AACzE,eAAO,MAAM,MAAM,yBAIlB,CAAC;AAEF;;;;;;;;GAQG;AACH,eAAO,MAAM,OAAO,yBASnB,CAAC;AAEF,OAAO,KAAK,OAAO,MAAM,0BAA0B,CAAC"}
@@ -1,4 +1,5 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import React from 'react';
2
3
  import { Box } from '../../core';
3
4
  import { Button } from './Button';
4
5
  import { useStyles } from './Button.styles';
@@ -24,4 +25,21 @@ export const FullWidth = () => _jsx(Button, { variant: "primary", title: "Full W
24
25
  export const Selected = () => (_jsx(Box, { display: "flex", flexDirection: "row", gap: 4, children: _jsx(Button, { variant: "secondary", title: "Selected", selected: true }) }));
25
26
  /** Utilisé quand le bouton est actif (ex : quand un menu est ouvert). */
26
27
  export const Active = () => (_jsx(Box, { display: "block", children: _jsx(Button, { variant: "secondary", title: "Active", active: true }) }));
28
+ /**
29
+ * Le spinner n'apparaît qu'après **1 000 ms** (`delay="long"`).
30
+ *
31
+ * Ce délai évite un clignotement visuel quand l'opération se termine rapidement :
32
+ * si le serveur répond en moins d'une seconde, l'utilisateur ne voit jamais le spinner.
33
+ * Au-delà, le spinner s'affiche pour signaler que l'attente va durer.
34
+ *
35
+ * Appuyez sur le bouton pour simuler une opération de 3 secondes.
36
+ */
37
+ export const Loading = () => {
38
+ const [isLoading, setIsLoading] = React.useState(false);
39
+ const handlePress = () => {
40
+ setIsLoading(true);
41
+ setTimeout(() => setIsLoading(false), 3000);
42
+ };
43
+ return _jsx(Button, { variant: "primary", title: "Enregistrer", isLoading: isLoading, onPress: handlePress });
44
+ };
27
45
  export * as Sources from './Button.stories.sources';
@@ -8,6 +8,7 @@ export declare const Icons: () => string;
8
8
  export declare const FullWidth: () => string;
9
9
  export declare const Selected: () => string;
10
10
  export declare const Active: () => string;
11
+ export declare const Loading: () => string;
11
12
  export declare const storySources: {
12
13
  readonly Sizes: () => string;
13
14
  readonly Primary: () => string;
@@ -19,6 +20,7 @@ export declare const storySources: {
19
20
  readonly FullWidth: () => string;
20
21
  readonly Selected: () => string;
21
22
  readonly Active: () => string;
23
+ readonly Loading: () => string;
22
24
  };
23
25
  export type StorySourceName = keyof typeof storySources;
24
26
  export declare const storyDescriptions: Partial<Record<StorySourceName, string>>;
@@ -1 +1 @@
1
- {"version":3,"file":"Button.stories.sources.d.ts","sourceRoot":"","sources":["../../../src/ui/Button/Button.stories.sources.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,KAAK,cAAoW,CAAC;AAEvX,eAAO,MAAM,OAAO,cAA4O,CAAC;AAEjQ,eAAO,MAAM,SAAS,cAAoP,CAAC;AAE3Q,eAAO,MAAM,QAAQ,cAAgP,CAAC;AAEtQ,eAAO,MAAM,MAAM,cAAwO,CAAC;AAE5P,eAAO,MAAM,IAAI,cAA+S,CAAC;AAEjU,eAAO,MAAM,KAAK,cAAic,CAAC;AAEpd,eAAO,MAAM,SAAS,cAAwG,CAAC;AAE/H,eAAO,MAAM,QAAQ,cAAkL,CAAC;AAExM,eAAO,MAAM,MAAM,cAA+I,CAAC;AAEnK,eAAO,MAAM,YAAY;;;;;;;;;;;CAWf,CAAC;AAEX,MAAM,MAAM,eAAe,GAAG,MAAM,OAAO,YAAY,CAAC;AAExD,eAAO,MAAM,iBAAiB,EAAE,OAAO,CAAC,MAAM,CAAC,eAAe,EAAE,MAAM,CAAC,CAGtE,CAAC"}
1
+ {"version":3,"file":"Button.stories.sources.d.ts","sourceRoot":"","sources":["../../../src/ui/Button/Button.stories.sources.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,KAAK,cAAoW,CAAC;AAEvX,eAAO,MAAM,OAAO,cAA4O,CAAC;AAEjQ,eAAO,MAAM,SAAS,cAAoP,CAAC;AAE3Q,eAAO,MAAM,QAAQ,cAAgP,CAAC;AAEtQ,eAAO,MAAM,MAAM,cAAwO,CAAC;AAE5P,eAAO,MAAM,IAAI,cAA+S,CAAC;AAEjU,eAAO,MAAM,KAAK,cAAic,CAAC;AAEpd,eAAO,MAAM,SAAS,cAAwG,CAAC;AAE/H,eAAO,MAAM,QAAQ,cAAkL,CAAC;AAExM,eAAO,MAAM,MAAM,cAA+I,CAAC;AAEnK,eAAO,MAAM,OAAO,cAAyU,CAAC;AAE9V,eAAO,MAAM,YAAY;;;;;;;;;;;;CAYf,CAAC;AAEX,MAAM,MAAM,eAAe,GAAG,MAAM,OAAO,YAAY,CAAC;AAExD,eAAO,MAAM,iBAAiB,EAAE,OAAO,CAAC,MAAM,CAAC,eAAe,EAAE,MAAM,CAAC,CAItE,CAAC"}
@@ -10,6 +10,7 @@ export const Icons = () => "export const Icons = () => (\n <Box display=\"flex\
10
10
  export const FullWidth = () => "export const FullWidth = () => <Button variant=\"primary\" title=\"Full Width\" fullWidth />;";
11
11
  export const Selected = () => "export const Selected = () => (\n <Box display=\"flex\" flexDirection=\"row\" gap={4}>\n <Button variant=\"secondary\" title=\"Selected\" selected />\n </Box>\n);";
12
12
  export const Active = () => "export const Active = () => (\n <Box display=\"block\">\n <Button variant=\"secondary\" title=\"Active\" active />\n </Box>\n);";
13
+ export const Loading = () => "export const Loading = () => {\n const [isLoading, setIsLoading] = React.useState(false);\n\n const handlePress = () => {\n setIsLoading(true);\n setTimeout(() => setIsLoading(false), 3000);\n };\n\n return <Button variant=\"primary\" title=\"Enregistrer\" isLoading={isLoading} onPress={handlePress} />;\n};";
13
14
  export const storySources = {
14
15
  Sizes,
15
16
  Primary,
@@ -21,8 +22,10 @@ export const storySources = {
21
22
  FullWidth,
22
23
  Selected,
23
24
  Active,
25
+ Loading,
24
26
  };
25
27
  export const storyDescriptions = {
26
28
  Link: "@deprecated Préférer les variants `primary`, `secondary` ou `tertiary`.",
27
29
  Active: "Utilisé quand le bouton est actif (ex : quand un menu est ouvert).",
30
+ Loading: "Le spinner n'apparaît qu'après **1 000 ms** (`delay=\"long\"`).\n\nCe délai évite un clignotement visuel quand l'opération se termine rapidement :\nsi le serveur répond en moins d'une seconde, l'utilisateur ne voit jamais le spinner.\nAu-delà, le spinner s'affiche pour signaler que l'attente va durer.\n\nAppuyez sur le bouton pour simuler une opération de 3 secondes.",
28
31
  };
@@ -1 +1 @@
1
- {"version":3,"file":"ListItem.d.ts","sourceRoot":"","sources":["../../../src/ui/ListItem/ListItem.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,EAAO,QAAQ,EAAqB,MAAM,YAAY,CAAC;AAC9D,OAAO,EAAU,WAAW,EAAE,MAAM,WAAW,CAAC;AAChD,OAAO,EAAE,SAAS,EAAc,MAAM,eAAe,CAAC;AAGtD,MAAM,MAAM,aAAa,GAAG,QAAQ,GAAG;IACrC,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,IAAI,CAAC,SAAS,EAAE,OAAO,GAAG,MAAM,CAAC,CAAC;IAC9C,WAAW,CAAC,EAAE,IAAI,CAAC,WAAW,EAAE,cAAc,GAAG,KAAK,CAAC,CAAC;IACxD,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,KAAK,CAAC,SAAS,CAAC;IACjC,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,cAAc,CAAC,EAAE,OAAO,CAAC;CAC1B,CAAC;AAEF,eAAO,MAAM,QAAQ,GAAI,OAAO,aAAa,sBA6D5C,CAAC"}
1
+ {"version":3,"file":"ListItem.d.ts","sourceRoot":"","sources":["../../../src/ui/ListItem/ListItem.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAO,QAAQ,EAAqB,MAAM,YAAY,CAAC;AAC9D,OAAO,EAAU,WAAW,EAAE,MAAM,WAAW,CAAC;AAChD,OAAO,EAAE,SAAS,EAAc,MAAM,eAAe,CAAC;AAItD,MAAM,MAAM,aAAa,GAAG,QAAQ,GAAG;IACrC,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,IAAI,CAAC,SAAS,EAAE,OAAO,GAAG,MAAM,CAAC,CAAC;IAC9C,WAAW,CAAC,EAAE,IAAI,CAAC,WAAW,EAAE,cAAc,GAAG,KAAK,CAAC,CAAC;IACxD,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,KAAK,CAAC,SAAS,CAAC;IACjC,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,cAAc,CAAC,EAAE,OAAO,CAAC;CAC1B,CAAC;AAEF,eAAO,MAAM,QAAQ,GAAI,OAAO,aAAa,sBA6D5C,CAAC"}
@@ -1,11 +1,11 @@
1
1
  import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
2
- import { ActivityIndicator } from 'react-native';
3
2
  import { Box, Image, Typography } from '../../core';
4
3
  import { Avatar } from '../Avatar';
5
4
  import { LucideIcon } from '../LucideIcon';
5
+ import { Spinner } from '../Spinner';
6
6
  import { useStyles } from './ListItem.styles';
7
7
  export const ListItem = (props) => {
8
8
  const { children, title, description, style, AvatarProps, IconProps, preview_url, trailing, loading = false, showSeparateur = true, ...itemProps } = props;
9
9
  const styles = useStyles();
10
- return (_jsxs(Box, { children: [_jsxs(Box, { tag: "resource-item", style: [styles.item, style], hoverStyle: itemProps['onPress'] ? styles.itemHover : {}, ...itemProps, children: [preview_url ? (_jsx(Box, { style: styles.previewContainer, children: _jsx(Image, { source: { uri: preview_url }, width: styles.preview.width, height: styles.preview.height, contentFit: "contain" }) })) : (_jsxs(_Fragment, { children: [IconProps && _jsx(LucideIcon, { size: "sm", color: styles.defaultIcon.color, ...IconProps }), AvatarProps && _jsx(Avatar, { size: "xs", ...AvatarProps })] })), _jsxs(Box, { style: styles.detail, children: [showSeparateur && _jsx(Box, { style: styles.separateur }), _jsxs(Box, { style: styles.principal, children: [_jsx(Typography, { style: styles.title, children: title }), description && _jsx(Typography, { style: styles.description, children: description })] }), trailing && trailing()] }), loading && (_jsx(Box, { style: styles.loading, children: _jsx(ActivityIndicator, { size: "small", color: styles.loading.color }) }))] }), children] }));
10
+ return (_jsxs(Box, { children: [_jsxs(Box, { tag: "resource-item", style: [styles.item, style], hoverStyle: itemProps['onPress'] ? styles.itemHover : {}, ...itemProps, children: [preview_url ? (_jsx(Box, { style: styles.previewContainer, children: _jsx(Image, { source: { uri: preview_url }, width: styles.preview.width, height: styles.preview.height, contentFit: "contain" }) })) : (_jsxs(_Fragment, { children: [IconProps && _jsx(LucideIcon, { size: "sm", color: styles.defaultIcon.color, ...IconProps }), AvatarProps && _jsx(Avatar, { size: "xs", ...AvatarProps })] })), _jsxs(Box, { style: styles.detail, children: [showSeparateur && _jsx(Box, { style: styles.separateur }), _jsxs(Box, { style: styles.principal, children: [_jsx(Typography, { style: styles.title, children: title }), description && _jsx(Typography, { style: styles.description, children: description })] }), trailing && trailing()] }), loading && (_jsx(Box, { style: styles.loading, children: _jsx(Spinner, { size: "sm" }) }))] }), children] }));
11
11
  };
@@ -99,6 +99,11 @@ declare const _default: {
99
99
  export default _default;
100
100
  export declare const Default: () => import("react").JSX.Element;
101
101
  export declare const WithTrailing: () => import("react").JSX.Element;
102
+ /**
103
+ * Le spinner remplace l'icône de trailing et s'affiche immédiatement
104
+ * (pas de délai) car le chargement porte sur l'item lui-même, pas sur
105
+ * une action utilisateur déclenchée par un bouton.
106
+ */
102
107
  export declare const WithLoading: () => import("react").JSX.Element;
103
108
  export declare const WithoutSeparator: () => import("react").JSX.Element;
104
109
  export declare const WithIcon: () => import("react").JSX.Element;
@@ -1 +1 @@
1
- {"version":3,"file":"ListItem.stories.d.ts","sourceRoot":"","sources":["../../../src/ui/ListItem/ListItem.stories.tsx"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAKA,wBAQkB;AAElB,eAAO,MAAM,OAAO,mCAQnB,CAAC;AAEF,eAAO,MAAM,YAAY,mCASxB,CAAC;AAEF,eAAO,MAAM,WAAW,mCASvB,CAAC;AAEF,eAAO,MAAM,gBAAgB,mCAS5B,CAAC;AAEF,eAAO,MAAM,QAAQ,mCASpB,CAAC;AAEF,eAAO,MAAM,UAAU,mCAYtB,CAAC;AAEF,eAAO,MAAM,gBAAgB,mCAS5B,CAAC;AAEF,4DAA4D;AAC5D,eAAO,MAAM,YAAY,mCAA6D,CAAC;AAEvF,OAAO,KAAK,OAAO,MAAM,4BAA4B,CAAC"}
1
+ {"version":3,"file":"ListItem.stories.d.ts","sourceRoot":"","sources":["../../../src/ui/ListItem/ListItem.stories.tsx"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAKA,wBAQkB;AAElB,eAAO,MAAM,OAAO,mCAQnB,CAAC;AAEF,eAAO,MAAM,YAAY,mCASxB,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,WAAW,mCASvB,CAAC;AAEF,eAAO,MAAM,gBAAgB,mCAS5B,CAAC;AAEF,eAAO,MAAM,QAAQ,mCASpB,CAAC;AAEF,eAAO,MAAM,UAAU,mCAYtB,CAAC;AAEF,eAAO,MAAM,gBAAgB,mCAS5B,CAAC;AAEF,4DAA4D;AAC5D,eAAO,MAAM,YAAY,mCAA6D,CAAC;AAEvF,OAAO,KAAK,OAAO,MAAM,4BAA4B,CAAC"}
@@ -17,6 +17,11 @@ export const Default = () => (_jsx(ListItem, { title: "Titre", description: "Des
17
17
  export const WithTrailing = () => (_jsx(ListItem, { title: "Titre", description: "Description", trailing: () => _jsx(ButtonIcon, { variant: "tertiary", icon: "CircleX", onPress: () => console.log('remove') }), onPress: () => {
18
18
  window.alert('click !');
19
19
  } }));
20
+ /**
21
+ * Le spinner remplace l'icône de trailing et s'affiche immédiatement
22
+ * (pas de délai) car le chargement porte sur l'item lui-même, pas sur
23
+ * une action utilisateur déclenchée par un bouton.
24
+ */
20
25
  export const WithLoading = () => (_jsx(ListItem, { title: "Titre", description: "Description", loading: true, onPress: () => {
21
26
  window.alert('click !');
22
27
  } }));
@@ -1 +1 @@
1
- {"version":3,"file":"ListItem.stories.sources.d.ts","sourceRoot":"","sources":["../../../src/ui/ListItem/ListItem.stories.sources.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,OAAO,cAAoL,CAAC;AAEzM,eAAO,MAAM,YAAY,cAA0S,CAAC;AAEpU,eAAO,MAAM,WAAW,cAA4M,CAAC;AAErO,eAAO,MAAM,gBAAgB,cAAyN,CAAC;AAEvP,eAAO,MAAM,QAAQ,cAA6O,CAAC;AAEnQ,eAAO,MAAM,UAAU,cAAyU,CAAC;AAEjW,eAAO,MAAM,gBAAgB,cAAqR,CAAC;AAEnT,eAAO,MAAM,YAAY,cAAsG,CAAC;AAEhI,eAAO,MAAM,YAAY;;;;;;;;;CASf,CAAC;AAEX,MAAM,MAAM,eAAe,GAAG,MAAM,OAAO,YAAY,CAAC;AAExD,eAAO,MAAM,iBAAiB,EAAE,OAAO,CAAC,MAAM,CAAC,eAAe,EAAE,MAAM,CAAC,CAEtE,CAAC"}
1
+ {"version":3,"file":"ListItem.stories.sources.d.ts","sourceRoot":"","sources":["../../../src/ui/ListItem/ListItem.stories.sources.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,OAAO,cAAoL,CAAC;AAEzM,eAAO,MAAM,YAAY,cAA0S,CAAC;AAEpU,eAAO,MAAM,WAAW,cAA4M,CAAC;AAErO,eAAO,MAAM,gBAAgB,cAAyN,CAAC;AAEvP,eAAO,MAAM,QAAQ,cAA6O,CAAC;AAEnQ,eAAO,MAAM,UAAU,cAAyU,CAAC;AAEjW,eAAO,MAAM,gBAAgB,cAAqR,CAAC;AAEnT,eAAO,MAAM,YAAY,cAAsG,CAAC;AAEhI,eAAO,MAAM,YAAY;;;;;;;;;CASf,CAAC;AAEX,MAAM,MAAM,eAAe,GAAG,MAAM,OAAO,YAAY,CAAC;AAExD,eAAO,MAAM,iBAAiB,EAAE,OAAO,CAAC,MAAM,CAAC,eAAe,EAAE,MAAM,CAAC,CAGtE,CAAC"}
@@ -19,5 +19,6 @@ export const storySources = {
19
19
  withoutHover,
20
20
  };
21
21
  export const storyDescriptions = {
22
+ WithLoading: "Le spinner remplace l'icône de trailing et s'affiche immédiatement\n(pas de délai) car le chargement porte sur l'item lui-même, pas sur\nune action utilisateur déclenchée par un bouton.",
22
23
  withoutHover: "Sans prop `onPress`, l’effet de hover n’apparaît pas.",
23
24
  };
@@ -1,13 +1,13 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  import { FlashList } from '@shopify/flash-list';
3
- import { ActivityIndicator } from 'react-native';
4
3
  import { Box, Typography } from '../../core';
4
+ import { Spinner } from '../Spinner';
5
5
  import { useStyles } from './ResourceList.styles';
6
6
  export const ResourceList = (props) => {
7
7
  const { style, data, isLoading, withPagination, renderNoContent, noBorder = false, withWhiteBackground = false, titre, ...listProps } = props;
8
8
  const styles = useStyles();
9
9
  if (isLoading) {
10
- return (_jsx(Box, { tag: "resource-list-loader", style: styles.loader, children: _jsx(ActivityIndicator, { size: "large", style: { margin: 'auto' } }) }));
10
+ return (_jsx(Box, { tag: "resource-list-loader", style: styles.loader, children: _jsx(Spinner, { size: "lg" }) }));
11
11
  }
12
12
  if (!data || data.length === 0)
13
13
  return renderNoContent();
@@ -53,6 +53,13 @@ export declare const Default: () => import("react").JSX.Element;
53
53
  export declare const WithTitle: () => import("react").JSX.Element;
54
54
  export declare const WithIcon: () => import("react").JSX.Element;
55
55
  export declare const WithPreviewImageAndTrailing: () => import("react").JSX.Element;
56
+ /**
57
+ * Quand `isLoading` est `true`, la liste entière est remplacée par un
58
+ * spinner centré. Aucun délai n'est appliqué ici : le chargement initial
59
+ * d'une liste vide n'a rien à afficher, le spinner apparaît donc
60
+ * immédiatement pour éviter un écran blanc sans feedback.
61
+ */
62
+ export declare const IsLoading: () => import("react").JSX.Element;
56
63
  export declare const WithNoContent: () => import("react").JSX.Element;
57
64
  export declare const WithDivider: () => import("react").JSX.Element;
58
65
  export * as Sources from './ResourceList.stories.sources';
@@ -1 +1 @@
1
- {"version":3,"file":"ResourceList.stories.d.ts","sourceRoot":"","sources":["../../../src/ui/ResourceList/ResourceList.stories.tsx"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAQA,wBASkB;AA6BlB,eAAO,MAAM,OAAO,mCASnB,CAAC;AAEF,eAAO,MAAM,SAAS,mCAUrB,CAAC;AAEF,eAAO,MAAM,QAAQ,mCAcpB,CAAC;AAEF,eAAO,MAAM,2BAA2B,mCAevC,CAAC;AAEF,eAAO,MAAM,aAAa,mCAOzB,CAAC;AAEF,eAAO,MAAM,WAAW,mCAUvB,CAAC;AAEF,OAAO,KAAK,OAAO,MAAM,gCAAgC,CAAC"}
1
+ {"version":3,"file":"ResourceList.stories.d.ts","sourceRoot":"","sources":["../../../src/ui/ResourceList/ResourceList.stories.tsx"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAQA,wBASkB;AA6BlB,eAAO,MAAM,OAAO,mCASnB,CAAC;AAEF,eAAO,MAAM,SAAS,mCAUrB,CAAC;AAEF,eAAO,MAAM,QAAQ,mCAcpB,CAAC;AAEF,eAAO,MAAM,2BAA2B,mCAevC,CAAC;AAEF;;;;;GAKG;AACH,eAAO,MAAM,SAAS,mCAQrB,CAAC;AAEF,eAAO,MAAM,aAAa,mCAOzB,CAAC;AAEF,eAAO,MAAM,WAAW,mCAUvB,CAAC;AAEF,OAAO,KAAK,OAAO,MAAM,gCAAgC,CAAC"}
@@ -43,6 +43,13 @@ export const Default = () => (_jsx(ResourceList, { data: exampleData, keyExtract
43
43
  export const WithTitle = () => (_jsx(ResourceList, { titre: "Titre de la liste", data: exampleData, keyExtractor: item => item.id, renderItem: ({ item, index }) => (_jsx(ListItem, { title: item.name, description: item.description, showSeparateur: index !== 0 })), renderNoContent: () => _jsx(EmptyState, { title: "Aucun \u00E9l\u00E9ment", description: "Cliquez sur le bouton", iconName: "House" }) }));
44
44
  export const WithIcon = () => (_jsx(ResourceList, { data: exampleData, keyExtractor: item => item.id, renderItem: ({ item, index }) => (_jsx(ListItem, { title: item.name, description: item.description, IconProps: { name: 'Settings' }, showSeparateur: index !== 0 })), renderNoContent: () => _jsx(EmptyState, { title: "Aucun \u00E9l\u00E9ment", description: "Cliquez sur le bouton", iconName: "House" }) }));
45
45
  export const WithPreviewImageAndTrailing = () => (_jsx(ResourceList, { data: exampleDataWithPreview, keyExtractor: item => item.id, renderItem: ({ item, index }) => (_jsx(ListItem, { title: item.name, description: item.description, preview_url: item.preview_url, trailing: () => _jsx(LucideIcon, { name: "ChevronRight", size: "sm" }), showSeparateur: index !== 0 })), renderNoContent: () => _jsx(EmptyState, { title: "Aucun \u00E9l\u00E9ment", description: "Cliquez sur le bouton", iconName: "House" }) }));
46
+ /**
47
+ * Quand `isLoading` est `true`, la liste entière est remplacée par un
48
+ * spinner centré. Aucun délai n'est appliqué ici : le chargement initial
49
+ * d'une liste vide n'a rien à afficher, le spinner apparaît donc
50
+ * immédiatement pour éviter un écran blanc sans feedback.
51
+ */
52
+ export const IsLoading = () => (_jsx(ResourceList, { data: [], isLoading: true, keyExtractor: item => item.id, renderItem: () => null, renderNoContent: () => null }));
46
53
  export const WithNoContent = () => (_jsx(ResourceList, { data: [], keyExtractor: item => item.id, renderItem: ({ item }) => _jsx(ListItem, { title: item.name, description: item.description }), renderNoContent: () => _jsx(EmptyState, { title: "Aucun \u00E9l\u00E9ment", description: "Cliquez sur le bouton", iconName: "House" }) }));
47
54
  export const WithDivider = () => (_jsx(ResourceList, { data: exampleData, keyExtractor: item => item.id, renderItem: ({ item, index }) => (_jsx(ListItem, { title: item.name, description: item.description, showSeparateur: index !== 0 })), ItemSeparatorComponent: ResourceListDivider, renderNoContent: () => _jsx(EmptyState, { title: "Aucun \u00E9l\u00E9ment", description: "Cliquez sur le bouton", iconName: "House" }) }));
48
55
  export * as Sources from './ResourceList.stories.sources';
@@ -2,6 +2,7 @@ export declare const Default: () => string;
2
2
  export declare const WithTitle: () => string;
3
3
  export declare const WithIcon: () => string;
4
4
  export declare const WithPreviewImageAndTrailing: () => string;
5
+ export declare const IsLoading: () => string;
5
6
  export declare const WithNoContent: () => string;
6
7
  export declare const WithDivider: () => string;
7
8
  export declare const storySources: {
@@ -9,8 +10,10 @@ export declare const storySources: {
9
10
  readonly WithTitle: () => string;
10
11
  readonly WithIcon: () => string;
11
12
  readonly WithPreviewImageAndTrailing: () => string;
13
+ readonly IsLoading: () => string;
12
14
  readonly WithNoContent: () => string;
13
15
  readonly WithDivider: () => string;
14
16
  };
15
17
  export type StorySourceName = keyof typeof storySources;
18
+ export declare const storyDescriptions: Partial<Record<StorySourceName, string>>;
16
19
  //# sourceMappingURL=ResourceList.stories.sources.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"ResourceList.stories.sources.d.ts","sourceRoot":"","sources":["../../../src/ui/ResourceList/ResourceList.stories.sources.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,OAAO,cAA+Y,CAAC;AAEpa,eAAO,MAAM,SAAS,cAAkb,CAAC;AAEzc,eAAO,MAAM,QAAQ,cAA4d,CAAC;AAElf,eAAO,MAAM,2BAA2B,cAAmkB,CAAC;AAE5mB,eAAO,MAAM,aAAa,cAA8W,CAAC;AAEzY,eAAO,MAAM,WAAW,cAAqc,CAAC;AAE9d,eAAO,MAAM,YAAY;;;;;;;CAOf,CAAC;AAEX,MAAM,MAAM,eAAe,GAAG,MAAM,OAAO,YAAY,CAAC"}
1
+ {"version":3,"file":"ResourceList.stories.sources.d.ts","sourceRoot":"","sources":["../../../src/ui/ResourceList/ResourceList.stories.sources.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,OAAO,cAA+Y,CAAC;AAEpa,eAAO,MAAM,SAAS,cAAkb,CAAC;AAEzc,eAAO,MAAM,QAAQ,cAA4d,CAAC;AAElf,eAAO,MAAM,2BAA2B,cAAmkB,CAAC;AAE5mB,eAAO,MAAM,SAAS,cAAoO,CAAC;AAE3P,eAAO,MAAM,aAAa,cAA8W,CAAC;AAEzY,eAAO,MAAM,WAAW,cAAqc,CAAC;AAE9d,eAAO,MAAM,YAAY;;;;;;;;CAQf,CAAC;AAEX,MAAM,MAAM,eAAe,GAAG,MAAM,OAAO,YAAY,CAAC;AAExD,eAAO,MAAM,iBAAiB,EAAE,OAAO,CAAC,MAAM,CAAC,eAAe,EAAE,MAAM,CAAC,CAEtE,CAAC"}
@@ -4,6 +4,7 @@ export const Default = () => "export const Default = () => (\n <ResourceList\n
4
4
  export const WithTitle = () => "export const WithTitle = () => (\n <ResourceList\n titre=\"Titre de la liste\"\n data={exampleData}\n keyExtractor={item => item.id}\n renderItem={({ item, index }) => (\n <ListItem title={item.name} description={item.description} showSeparateur={index !== 0} />\n )}\n renderNoContent={() => <EmptyState title=\"Aucun élément\" description=\"Cliquez sur le bouton\" iconName=\"House\" />}\n />\n);";
5
5
  export const WithIcon = () => "export const WithIcon = () => (\n <ResourceList\n data={exampleData}\n keyExtractor={item => item.id}\n renderItem={({ item, index }) => (\n <ListItem\n title={item.name}\n description={item.description}\n IconProps={{ name: 'Settings' }}\n showSeparateur={index !== 0}\n />\n )}\n renderNoContent={() => <EmptyState title=\"Aucun élément\" description=\"Cliquez sur le bouton\" iconName=\"House\" />}\n />\n);";
6
6
  export const WithPreviewImageAndTrailing = () => "export const WithPreviewImageAndTrailing = () => (\n <ResourceList\n data={exampleDataWithPreview}\n keyExtractor={item => item.id}\n renderItem={({ item, index }) => (\n <ListItem\n title={item.name}\n description={item.description}\n preview_url={item.preview_url}\n trailing={() => <LucideIcon name=\"ChevronRight\" size=\"sm\" />}\n showSeparateur={index !== 0}\n />\n )}\n renderNoContent={() => <EmptyState title=\"Aucun élément\" description=\"Cliquez sur le bouton\" iconName=\"House\" />}\n />\n);";
7
+ export const IsLoading = () => "export const IsLoading = () => (\n <ResourceList\n data={[] as typeof exampleData}\n isLoading={true}\n keyExtractor={item => item.id}\n renderItem={() => null}\n renderNoContent={() => null}\n />\n);";
7
8
  export const WithNoContent = () => "export const WithNoContent = () => (\n <ResourceList\n data={[] as typeof exampleData}\n keyExtractor={item => item.id}\n renderItem={({ item }) => <ListItem title={item.name} description={item.description} />}\n renderNoContent={() => <EmptyState title=\"Aucun élément\" description=\"Cliquez sur le bouton\" iconName=\"House\" />}\n />\n);";
8
9
  export const WithDivider = () => "export const WithDivider = () => (\n <ResourceList\n data={exampleData}\n keyExtractor={item => item.id}\n renderItem={({ item, index }) => (\n <ListItem title={item.name} description={item.description} showSeparateur={index !== 0} />\n )}\n ItemSeparatorComponent={ResourceListDivider}\n renderNoContent={() => <EmptyState title=\"Aucun élément\" description=\"Cliquez sur le bouton\" iconName=\"House\" />}\n />\n);";
9
10
  export const storySources = {
@@ -11,6 +12,10 @@ export const storySources = {
11
12
  WithTitle,
12
13
  WithIcon,
13
14
  WithPreviewImageAndTrailing,
15
+ IsLoading,
14
16
  WithNoContent,
15
17
  WithDivider,
16
18
  };
19
+ export const storyDescriptions = {
20
+ IsLoading: "Quand `isLoading` est `true`, la liste entière est remplacée par un\nspinner centré. Aucun délai n'est appliqué ici : le chargement initial\nd'une liste vide n'a rien à afficher, le spinner apparaît donc\nimmédiatement pour éviter un écran blanc sans feedback.",
21
+ };
@@ -0,0 +1,5 @@
1
+ import React from 'react';
2
+ import { SpinnerProps } from './Spinner.shared';
3
+ export type { SpinnerProps };
4
+ export declare const Spinner: ({ size, delay, style }: SpinnerProps) => React.JSX.Element | null;
5
+ //# sourceMappingURL=Spinner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Spinner.d.ts","sourceRoot":"","sources":["../../../src/ui/Spinner/Spinner.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAG1B,OAAO,EAAsB,YAAY,EAAc,MAAM,kBAAkB,CAAC;AAGhF,YAAY,EAAE,YAAY,EAAE,CAAC;AAS7B,eAAO,MAAM,OAAO,GAAI,wBAA+B,YAAY,6BAsDlE,CAAC"}
@@ -0,0 +1,47 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import React from 'react';
3
+ import { Animated, Easing } from 'react-native';
4
+ import { Circle, Svg } from 'react-native-svg';
5
+ import { DELAY_MS, SIZE_MAP, STROKE_MAP } from './Spinner.shared';
6
+ import { useStyles } from './Spinner.styles';
7
+ function resolveDelay(delay) {
8
+ if (delay === undefined || delay === false)
9
+ return null;
10
+ if (delay === true)
11
+ return 1000;
12
+ if (typeof delay === 'string')
13
+ return DELAY_MS[delay] ?? 0;
14
+ return delay;
15
+ }
16
+ export const Spinner = ({ size = 'md', delay, style }) => {
17
+ const styles = useStyles();
18
+ const [rotation] = React.useState(() => new Animated.Value(0));
19
+ const delayMs = React.useMemo(() => resolveDelay(delay), [delay]);
20
+ const [visible, setVisible] = React.useState(delayMs === null);
21
+ const px = SIZE_MAP[size];
22
+ const strokeWidth = STROKE_MAP[size];
23
+ const r = (px - strokeWidth) / 2;
24
+ const cx = px / 2;
25
+ const circumference = 2 * Math.PI * r;
26
+ const dashArray = `${circumference * 0.75} ${circumference * 0.25}`;
27
+ const spin = rotation.interpolate({ inputRange: [0, 1], outputRange: ['0deg', '360deg'] });
28
+ React.useEffect(() => {
29
+ if (delayMs === null)
30
+ return;
31
+ const timer = setTimeout(() => setVisible(true), delayMs);
32
+ return () => clearTimeout(timer);
33
+ }, [delayMs]);
34
+ React.useEffect(() => {
35
+ const anim = Animated.loop(Animated.timing(rotation, {
36
+ toValue: 1,
37
+ duration: 800,
38
+ easing: Easing.linear,
39
+ useNativeDriver: true,
40
+ }));
41
+ anim.start();
42
+ return () => anim.stop();
43
+ }, [rotation]);
44
+ if (!visible)
45
+ return null;
46
+ return (_jsx(Animated.View, { style: [{ transform: [{ rotate: spin }] }, style], children: _jsxs(Svg, { width: px, height: px, viewBox: `0 0 ${px} ${px}`, children: [_jsx(Circle, { cx: cx, cy: cx, r: r, fill: "none", strokeWidth: strokeWidth, stroke: styles.track.color }), _jsx(Circle, { cx: cx, cy: cx, r: r, fill: "none", strokeWidth: strokeWidth, stroke: styles.arc.color, strokeDasharray: dashArray, strokeLinecap: "round", rotation: -90, origin: `${cx}, ${cx}` })] }) }));
47
+ };
@@ -0,0 +1,12 @@
1
+ import type { ViewStyle } from 'react-native';
2
+ export type SpinnerSize = 'sm' | 'md' | 'lg';
3
+ export type SpinnerDelay = boolean | 'short' | 'long' | number;
4
+ export type SpinnerProps = {
5
+ size?: SpinnerSize;
6
+ delay?: SpinnerDelay;
7
+ style?: ViewStyle;
8
+ };
9
+ export declare const SIZE_MAP: Record<SpinnerSize, number>;
10
+ export declare const STROKE_MAP: Record<SpinnerSize, number>;
11
+ export declare const DELAY_MS: Record<string, number>;
12
+ //# sourceMappingURL=Spinner.shared.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Spinner.shared.d.ts","sourceRoot":"","sources":["../../../src/ui/Spinner/Spinner.shared.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAE9C,MAAM,MAAM,WAAW,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;AAE7C,MAAM,MAAM,YAAY,GAAG,OAAO,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,CAAC;AAE/D,MAAM,MAAM,YAAY,GAAG;IACzB,IAAI,CAAC,EAAE,WAAW,CAAC;IACnB,KAAK,CAAC,EAAE,YAAY,CAAC;IACrB,KAAK,CAAC,EAAE,SAAS,CAAC;CACnB,CAAC;AAEF,eAAO,MAAM,QAAQ,EAAE,MAAM,CAAC,WAAW,EAAE,MAAM,CAA8B,CAAC;AAChF,eAAO,MAAM,UAAU,EAAE,MAAM,CAAC,WAAW,EAAE,MAAM,CAA2B,CAAC;AAC/E,eAAO,MAAM,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAA8B,CAAC"}
@@ -0,0 +1,3 @@
1
+ export const SIZE_MAP = { sm: 16, md: 32, lg: 64 };
2
+ export const STROKE_MAP = { sm: 2, md: 3, lg: 5 };
3
+ export const DELAY_MS = { short: 300, long: 1000 };
@@ -0,0 +1,21 @@
1
+ declare const _default: {
2
+ title: string;
3
+ tags: "ui"[];
4
+ experimental: false;
5
+ description: string;
6
+ shortDescription: string;
7
+ component: ({ size, delay, style }: import("./Spinner.shared").SpinnerProps) => import("react").JSX.Element | null;
8
+ styleFn: () => {
9
+ track: {
10
+ color: string;
11
+ };
12
+ arc: {
13
+ color: string;
14
+ };
15
+ };
16
+ };
17
+ export default _default;
18
+ export declare const Sizes: () => import("react").JSX.Element;
19
+ export declare const WithDelay: () => import("react").JSX.Element;
20
+ export * as Sources from './Spinner.stories.sources';
21
+ //# sourceMappingURL=Spinner.stories.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Spinner.stories.d.ts","sourceRoot":"","sources":["../../../src/ui/Spinner/Spinner.stories.tsx"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAKA,wBAiBkB;AAElB,eAAO,MAAM,KAAK,mCAMjB,CAAC;AAEF,eAAO,MAAM,SAAS,mCAKrB,CAAC;AAEF,OAAO,KAAK,OAAO,MAAM,2BAA2B,CAAC"}
@@ -0,0 +1,25 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { Box } from '../../core';
3
+ import { Spinner } from './Spinner';
4
+ import { useStyles } from './Spinner.styles';
5
+ export default {
6
+ title: 'Spinner',
7
+ tags: ['ui'],
8
+ experimental: false,
9
+ description: `Indicateur de chargement animé en rotation.
10
+
11
+ Trois tailles disponibles : \`sm\` (16 px), \`md\` (32 px, défaut) et \`lg\` (64 px).
12
+
13
+ La prop \`delay\` permet de retarder l'apparition du spinner pour éviter un flash sur les opérations rapides :
14
+ - \`false\` / absent : visible immédiatement
15
+ - \`true\` : délai de 1 000 ms
16
+ - \`"short"\` : 300 ms
17
+ - \`"long"\` : 1 000 ms
18
+ - \`number\` : délai personnalisé en millisecondes`,
19
+ shortDescription: 'Indicateur de chargement animé disponible en trois tailles.',
20
+ component: Spinner,
21
+ styleFn: useStyles,
22
+ };
23
+ export const Sizes = () => (_jsxs(Box, { display: "flex", flexDirection: "row", style: { alignItems: 'center' }, gap: 16, children: [_jsx(Spinner, { size: "sm" }), _jsx(Spinner, { size: "md" }), _jsx(Spinner, { size: "lg" })] }));
24
+ export const WithDelay = () => (_jsxs(Box, { display: "flex", flexDirection: "row", style: { alignItems: 'center' }, gap: 16, children: [_jsx(Spinner, { size: "md", delay: "short" }, "short"), _jsx(Spinner, { size: "md", delay: "long" }, "long")] }));
25
+ export * as Sources from './Spinner.stories.sources';
@@ -0,0 +1,8 @@
1
+ export declare const Sizes: () => string;
2
+ export declare const WithDelay: () => string;
3
+ export declare const storySources: {
4
+ readonly Sizes: () => string;
5
+ readonly WithDelay: () => string;
6
+ };
7
+ export type StorySourceName = keyof typeof storySources;
8
+ //# sourceMappingURL=Spinner.stories.sources.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Spinner.stories.sources.d.ts","sourceRoot":"","sources":["../../../src/ui/Spinner/Spinner.stories.sources.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,KAAK,cAAsO,CAAC;AAEzP,eAAO,MAAM,SAAS,cAAuQ,CAAC;AAE9R,eAAO,MAAM,YAAY;;;CAGf,CAAC;AAEX,MAAM,MAAM,eAAe,GAAG,MAAM,OAAO,YAAY,CAAC"}
@@ -0,0 +1,8 @@
1
+ // This file is generated. Do not edit manually.
2
+ // Source: src/ui/Spinner/Spinner.stories.tsx
3
+ export const Sizes = () => "export const Sizes = () => (\n <Box display=\"flex\" flexDirection=\"row\" style={{ alignItems: 'center' }} gap={16}>\n <Spinner size=\"sm\" />\n <Spinner size=\"md\" />\n <Spinner size=\"lg\" />\n </Box>\n);";
4
+ export const WithDelay = () => "export const WithDelay = () => (\n <Box display=\"flex\" flexDirection=\"row\" style={{ alignItems: 'center' }} gap={16}>\n <Spinner size=\"md\" delay=\"short\" key=\"short\" />\n <Spinner size=\"md\" delay=\"long\" key=\"long\" />\n </Box>\n);";
5
+ export const storySources = {
6
+ Sizes,
7
+ WithDelay,
8
+ };
@@ -0,0 +1,9 @@
1
+ export declare const useStyles: () => {
2
+ track: {
3
+ color: string;
4
+ };
5
+ arc: {
6
+ color: string;
7
+ };
8
+ };
9
+ //# sourceMappingURL=Spinner.styles.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Spinner.styles.d.ts","sourceRoot":"","sources":["../../../src/ui/Spinner/Spinner.styles.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,SAAS;;;;;;;CAGnB,CAAC"}
@@ -0,0 +1,5 @@
1
+ import { makeStyles } from '@alveole/theme';
2
+ export const useStyles = makeStyles(({ color }) => ({
3
+ track: { color: color.light.border['default-grey'] },
4
+ arc: { color: color.light.artwork['major-primary'] },
5
+ }));
@@ -0,0 +1,5 @@
1
+ import React from 'react';
2
+ import { SpinnerProps } from './Spinner.shared';
3
+ export type { SpinnerProps };
4
+ export declare const Spinner: ({ size, delay, style }: SpinnerProps) => React.JSX.Element | null;
5
+ //# sourceMappingURL=Spinner.web.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Spinner.web.d.ts","sourceRoot":"","sources":["../../../src/ui/Spinner/Spinner.web.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,EAAsB,YAAY,EAAc,MAAM,kBAAkB,CAAC;AAGhF,YAAY,EAAE,YAAY,EAAE,CAAC;AAS7B,eAAO,MAAM,OAAO,GAAI,wBAA+B,YAAY,6BA+ClE,CAAC"}
@@ -0,0 +1,53 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import React from 'react';
3
+ import { Animated, Easing } from 'react-native';
4
+ import { DELAY_MS, SIZE_MAP, STROKE_MAP } from './Spinner.shared';
5
+ import { useStyles } from './Spinner.styles';
6
+ function resolveDelay(delay) {
7
+ if (delay === undefined || delay === false)
8
+ return null;
9
+ if (delay === true)
10
+ return 1000;
11
+ if (typeof delay === 'string')
12
+ return DELAY_MS[delay] ?? 0;
13
+ return delay;
14
+ }
15
+ export const Spinner = ({ size = 'md', delay, style }) => {
16
+ const styles = useStyles();
17
+ const [rotation] = React.useState(() => new Animated.Value(0));
18
+ const delayMs = React.useMemo(() => resolveDelay(delay), [delay]);
19
+ const [visible, setVisible] = React.useState(delayMs === null);
20
+ const px = SIZE_MAP[size];
21
+ const strokeWidth = STROKE_MAP[size];
22
+ const spin = rotation.interpolate({ inputRange: [0, 1], outputRange: ['0deg', '360deg'] });
23
+ React.useEffect(() => {
24
+ if (delayMs === null)
25
+ return;
26
+ const timer = setTimeout(() => setVisible(true), delayMs);
27
+ return () => clearTimeout(timer);
28
+ }, [delayMs]);
29
+ React.useEffect(() => {
30
+ const anim = Animated.loop(Animated.timing(rotation, {
31
+ toValue: 1,
32
+ duration: 800,
33
+ easing: Easing.linear,
34
+ useNativeDriver: false,
35
+ }));
36
+ anim.start();
37
+ return () => anim.stop();
38
+ }, [rotation]);
39
+ if (!visible)
40
+ return null;
41
+ return (_jsx(Animated.View, { style: [
42
+ {
43
+ width: px,
44
+ height: px,
45
+ borderRadius: px / 2,
46
+ borderWidth: strokeWidth,
47
+ borderColor: styles.track.color,
48
+ borderTopColor: styles.arc.color,
49
+ transform: [{ rotate: spin }],
50
+ },
51
+ style,
52
+ ] }));
53
+ };
@@ -0,0 +1,2 @@
1
+ export * from './Spinner';
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/ui/Spinner/index.ts"],"names":[],"mappings":"AAAA,cAAc,WAAW,CAAC"}
@@ -0,0 +1 @@
1
+ export * from './Spinner';
@@ -40,6 +40,7 @@ export * from './Select';
40
40
  export * from './SelectMultiple';
41
41
  export * from './Sidebar';
42
42
  export * from './Signature';
43
+ export * from './Spinner';
43
44
  export * from './Switch';
44
45
  export * from './Tabs';
45
46
  export * from './Tag';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/ui/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,cAAc,cAAc,CAAC;AAC7B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,uBAAuB,CAAC;AACtC,cAAc,UAAU,CAAC;AACzB,cAAc,SAAS,CAAC;AACxB,cAAc,eAAe,CAAC;AAC9B,cAAc,UAAU,CAAC;AACzB,cAAc,QAAQ,CAAC;AACvB,cAAc,YAAY,CAAC;AAC3B,cAAc,WAAW,CAAC;AAC1B,cAAc,aAAa,CAAC;AAC5B,cAAc,WAAW,CAAC;AAC1B,cAAc,kBAAkB,CAAC;AACjC,cAAc,mBAAmB,CAAC;AAClC,cAAc,iBAAiB,CAAC;AAChC,cAAc,cAAc,CAAC;AAC7B,cAAc,cAAc,CAAC;AAC7B,cAAc,cAAc,CAAC;AAC7B,cAAc,aAAa,CAAC;AAC5B,cAAc,eAAe,CAAC;AAC9B,cAAc,QAAQ,CAAC;AACvB,cAAc,UAAU,CAAC;AACzB,cAAc,wBAAwB,CAAC;AACvC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,YAAY,CAAC;AAC3B,cAAc,cAAc,CAAC;AAC7B,cAAc,eAAe,CAAC;AAC9B,cAAc,YAAY,CAAC;AAC3B,cAAc,cAAc,CAAC;AAC7B,cAAc,iBAAiB,CAAC;AAChC,cAAc,cAAc,CAAC;AAC7B,cAAc,cAAc,CAAC;AAC7B,cAAc,WAAW,CAAC;AAC1B,cAAc,cAAc,CAAC;AAC7B,cAAc,eAAe,CAAC;AAC9B,cAAc,cAAc,CAAC;AAC7B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,UAAU,CAAC;AACzB,cAAc,kBAAkB,CAAC;AACjC,cAAc,WAAW,CAAC;AAC1B,cAAc,aAAa,CAAC;AAC5B,cAAc,UAAU,CAAC;AACzB,cAAc,QAAQ,CAAC;AACvB,cAAc,OAAO,CAAC;AACtB,cAAc,iBAAiB,CAAC;AAChC,cAAc,iBAAiB,CAAC;AAChC,cAAc,aAAa,CAAC;AAC5B,cAAc,kBAAkB,CAAC;AACjC,cAAc,aAAa,CAAC;AAC5B,cAAc,SAAS,CAAC;AACxB,cAAc,oBAAoB,CAAC;AACnC,cAAc,cAAc,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/ui/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,cAAc,cAAc,CAAC;AAC7B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,uBAAuB,CAAC;AACtC,cAAc,UAAU,CAAC;AACzB,cAAc,SAAS,CAAC;AACxB,cAAc,eAAe,CAAC;AAC9B,cAAc,UAAU,CAAC;AACzB,cAAc,QAAQ,CAAC;AACvB,cAAc,YAAY,CAAC;AAC3B,cAAc,WAAW,CAAC;AAC1B,cAAc,aAAa,CAAC;AAC5B,cAAc,WAAW,CAAC;AAC1B,cAAc,kBAAkB,CAAC;AACjC,cAAc,mBAAmB,CAAC;AAClC,cAAc,iBAAiB,CAAC;AAChC,cAAc,cAAc,CAAC;AAC7B,cAAc,cAAc,CAAC;AAC7B,cAAc,cAAc,CAAC;AAC7B,cAAc,aAAa,CAAC;AAC5B,cAAc,eAAe,CAAC;AAC9B,cAAc,QAAQ,CAAC;AACvB,cAAc,UAAU,CAAC;AACzB,cAAc,wBAAwB,CAAC;AACvC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,YAAY,CAAC;AAC3B,cAAc,cAAc,CAAC;AAC7B,cAAc,eAAe,CAAC;AAC9B,cAAc,YAAY,CAAC;AAC3B,cAAc,cAAc,CAAC;AAC7B,cAAc,iBAAiB,CAAC;AAChC,cAAc,cAAc,CAAC;AAC7B,cAAc,cAAc,CAAC;AAC7B,cAAc,WAAW,CAAC;AAC1B,cAAc,cAAc,CAAC;AAC7B,cAAc,eAAe,CAAC;AAC9B,cAAc,cAAc,CAAC;AAC7B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,UAAU,CAAC;AACzB,cAAc,kBAAkB,CAAC;AACjC,cAAc,WAAW,CAAC;AAC1B,cAAc,aAAa,CAAC;AAC5B,cAAc,WAAW,CAAC;AAC1B,cAAc,UAAU,CAAC;AACzB,cAAc,QAAQ,CAAC;AACvB,cAAc,OAAO,CAAC;AACtB,cAAc,iBAAiB,CAAC;AAChC,cAAc,iBAAiB,CAAC;AAChC,cAAc,aAAa,CAAC;AAC5B,cAAc,kBAAkB,CAAC;AACjC,cAAc,aAAa,CAAC;AAC5B,cAAc,SAAS,CAAC;AACxB,cAAc,oBAAoB,CAAC;AACnC,cAAc,cAAc,CAAC"}
package/dist/ui/index.js CHANGED
@@ -40,6 +40,7 @@ export * from './Select';
40
40
  export * from './SelectMultiple';
41
41
  export * from './Sidebar';
42
42
  export * from './Signature';
43
+ export * from './Spinner';
43
44
  export * from './Switch';
44
45
  export * from './Tabs';
45
46
  export * from './Tag';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@alveole/components",
3
- "version": "1.1.2",
3
+ "version": "1.2.0",
4
4
  "description": "Shared UI components.",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -28,7 +28,8 @@
28
28
  "postinstall": "node ./scripts/postinstall.mjs",
29
29
  "test:unit": "NODE_OPTIONS=--max-old-space-size=4096 npx jest --maxWorkers=2 --ci",
30
30
  "typecheck": "npm run generate:sources && tsc -p tsconfig.typecheck.json --noEmit",
31
- "generate:sources": "node scripts/generate-stories-sources.mjs"
31
+ "generate:sources": "node scripts/generate-stories-sources.mjs",
32
+ "doctor:fix": "npx expo install --check"
32
33
  },
33
34
  "devDependencies": {
34
35
  "@alveole/eslint-config": "file:../eslint-config",
@@ -44,10 +45,10 @@
44
45
  "@types/react-syntax-highlighter": "15.5.13",
45
46
  "babel-preset-expo": "56.0.17",
46
47
  "eslint": "9.39.5",
47
- "expo": "56.0.17",
48
+ "expo": "56.0.18",
48
49
  "expo-asset": "56.0.21",
49
50
  "expo-document-picker": "56.0.4",
50
- "expo-router": "56.2.16",
51
+ "expo-router": "56.2.17",
51
52
  "expo-modules-core": "56.0.22",
52
53
  "jest": "29.7.0",
53
54
  "jest-expo": "56.0.5",