@ankhorage/surface 4.3.0 → 4.4.1

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 (153) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/README.md +4 -4
  3. package/dist/components/tabs/Tabs.js +2 -2
  4. package/dist/components/tabs/Tabs.js.map +1 -1
  5. package/dist/components/tabs/context.js +1 -1
  6. package/dist/components/tabs/context.js.map +1 -1
  7. package/dist/context/FontContext.d.ts.map +1 -1
  8. package/dist/context/FontContext.js +3 -3
  9. package/dist/context/FontContext.js.map +1 -1
  10. package/dist/context/TranslationContext.d.ts.map +1 -1
  11. package/dist/context/TranslationContext.js +3 -4
  12. package/dist/context/TranslationContext.js.map +1 -1
  13. package/dist/core/responsive/ResponsiveProvider.d.ts.map +1 -1
  14. package/dist/core/responsive/ResponsiveProvider.js +3 -3
  15. package/dist/core/responsive/ResponsiveProvider.js.map +1 -1
  16. package/dist/features/accordion/adapters/inbound/Accordion.js +2 -2
  17. package/dist/features/accordion/adapters/inbound/Accordion.js.map +1 -1
  18. package/dist/features/accordion/adapters/inbound/AccordionContent.js +1 -1
  19. package/dist/features/accordion/adapters/inbound/AccordionContent.js.map +1 -1
  20. package/dist/features/accordion/adapters/inbound/AccordionItem.js +3 -3
  21. package/dist/features/accordion/adapters/inbound/AccordionItem.js.map +1 -1
  22. package/dist/features/accordion/adapters/inbound/AccordionTrigger.js +1 -1
  23. package/dist/features/accordion/adapters/inbound/AccordionTrigger.js.map +1 -1
  24. package/dist/features/bottom-sheet/BottomSheetProvider.js +2 -2
  25. package/dist/features/bottom-sheet/BottomSheetProvider.js.map +1 -1
  26. package/dist/features/bottom-sheet/useBottomSheet.js +1 -1
  27. package/dist/features/bottom-sheet/useBottomSheet.js.map +1 -1
  28. package/dist/features/popover/adapters/inbound/Popover.d.ts +5 -0
  29. package/dist/features/popover/adapters/inbound/Popover.d.ts.map +1 -0
  30. package/dist/features/popover/adapters/inbound/Popover.js +31 -0
  31. package/dist/features/popover/adapters/inbound/Popover.js.map +1 -0
  32. package/dist/features/popover/adapters/inbound/PopoverOverlay.d.ts +17 -0
  33. package/dist/features/popover/adapters/inbound/PopoverOverlay.d.ts.map +1 -0
  34. package/dist/features/popover/adapters/inbound/PopoverOverlay.js +34 -0
  35. package/dist/features/popover/adapters/inbound/PopoverOverlay.js.map +1 -0
  36. package/dist/features/popover/adapters/inbound/usePopoverLayout.d.ts +21 -0
  37. package/dist/features/popover/adapters/inbound/usePopoverLayout.d.ts.map +1 -0
  38. package/dist/features/popover/adapters/inbound/usePopoverLayout.js +33 -0
  39. package/dist/features/popover/adapters/inbound/usePopoverLayout.js.map +1 -0
  40. package/dist/features/popover/public.d.ts +3 -0
  41. package/dist/features/popover/public.d.ts.map +1 -0
  42. package/dist/features/popover/public.js +2 -0
  43. package/dist/features/popover/public.js.map +1 -0
  44. package/dist/features/popover/utils/resolvePopoverPosition.d.ts +25 -0
  45. package/dist/features/popover/utils/resolvePopoverPosition.d.ts.map +1 -0
  46. package/dist/features/popover/utils/resolvePopoverPosition.js +23 -0
  47. package/dist/features/popover/utils/resolvePopoverPosition.js.map +1 -0
  48. package/dist/{components/toast → features/toast/adapters/inbound}/Toast.d.ts +2 -1
  49. package/dist/features/toast/adapters/inbound/Toast.d.ts.map +1 -0
  50. package/dist/{components/toast → features/toast/adapters/inbound}/Toast.js +37 -32
  51. package/dist/features/toast/adapters/inbound/Toast.js.map +1 -0
  52. package/dist/features/toast/adapters/inbound/ToastProvider.d.ts +5 -0
  53. package/dist/features/toast/adapters/inbound/ToastProvider.d.ts.map +1 -0
  54. package/dist/features/toast/adapters/inbound/ToastProvider.js +29 -0
  55. package/dist/features/toast/adapters/inbound/ToastProvider.js.map +1 -0
  56. package/dist/features/toast/adapters/inbound/useToast.d.ts +4 -0
  57. package/dist/features/toast/adapters/inbound/useToast.d.ts.map +1 -0
  58. package/dist/features/toast/adapters/inbound/useToast.js +11 -0
  59. package/dist/features/toast/adapters/inbound/useToast.js.map +1 -0
  60. package/dist/features/toast/composition/ToastContext.d.ts +4 -0
  61. package/dist/features/toast/composition/ToastContext.d.ts.map +1 -0
  62. package/dist/features/toast/composition/ToastContext.js +4 -0
  63. package/dist/features/toast/composition/ToastContext.js.map +1 -0
  64. package/dist/features/toast/composition/useToastRuntime.d.ts +11 -0
  65. package/dist/features/toast/composition/useToastRuntime.d.ts.map +1 -0
  66. package/dist/features/toast/composition/useToastRuntime.js +50 -0
  67. package/dist/features/toast/composition/useToastRuntime.js.map +1 -0
  68. package/dist/features/toast/public.d.ts +5 -0
  69. package/dist/features/toast/public.d.ts.map +1 -0
  70. package/dist/features/toast/public.js +4 -0
  71. package/dist/features/toast/public.js.map +1 -0
  72. package/dist/index.d.ts +4 -2
  73. package/dist/index.d.ts.map +1 -1
  74. package/dist/index.js +2 -1
  75. package/dist/index.js.map +1 -1
  76. package/dist/internal/overlay/OverlayProvider.d.ts +1 -0
  77. package/dist/internal/overlay/OverlayProvider.d.ts.map +1 -1
  78. package/dist/internal/overlay/OverlayProvider.js +9 -7
  79. package/dist/internal/overlay/OverlayProvider.js.map +1 -1
  80. package/dist/internal/overlay/useOverlayStack.js +1 -1
  81. package/dist/internal/overlay/useOverlayStack.js.map +1 -1
  82. package/dist/internal/resolvers/resolveOverlayZIndex.d.ts +1 -1
  83. package/dist/internal/resolvers/resolveOverlayZIndex.d.ts.map +1 -1
  84. package/dist/internal/resolvers/resolveOverlayZIndex.js +1 -0
  85. package/dist/internal/resolvers/resolveOverlayZIndex.js.map +1 -1
  86. package/dist/layout/AppBar.js +1 -1
  87. package/dist/layout/AppBar.js.map +1 -1
  88. package/dist/theme/ThemeContext.d.ts.map +1 -1
  89. package/dist/theme/ThemeContext.js +4 -5
  90. package/dist/theme/ThemeContext.js.map +1 -1
  91. package/dist/types/popover.d.ts +21 -0
  92. package/dist/types/popover.d.ts.map +1 -0
  93. package/dist/types/popover.js +2 -0
  94. package/dist/types/popover.js.map +1 -0
  95. package/dist/{components/toast/types.d.ts → types/toast.d.ts} +11 -3
  96. package/dist/types/toast.d.ts.map +1 -0
  97. package/dist/types/toast.js +2 -0
  98. package/dist/types/toast.js.map +1 -0
  99. package/package.json +1 -1
  100. package/src/components/tabs/Tabs.tsx +2 -2
  101. package/src/components/tabs/context.tsx +1 -1
  102. package/src/context/FontContext.tsx +3 -3
  103. package/src/context/TranslationContext.tsx +3 -4
  104. package/src/core/responsive/ResponsiveProvider.tsx +3 -3
  105. package/src/features/accordion/adapters/inbound/Accordion.tsx +2 -2
  106. package/src/features/accordion/adapters/inbound/AccordionContent.tsx +1 -1
  107. package/src/features/accordion/adapters/inbound/AccordionItem.tsx +3 -3
  108. package/src/features/accordion/adapters/inbound/AccordionTrigger.tsx +1 -1
  109. package/src/features/bottom-sheet/BottomSheetProvider.tsx +2 -2
  110. package/src/features/bottom-sheet/useBottomSheet.ts +1 -1
  111. package/src/features/popover/adapters/inbound/Popover.tsx +49 -0
  112. package/src/features/popover/adapters/inbound/PopoverOverlay.tsx +72 -0
  113. package/src/features/popover/adapters/inbound/usePopoverLayout.ts +51 -0
  114. package/src/features/popover/public.ts +2 -0
  115. package/src/features/popover/utils/resolvePopoverPosition.test.ts +31 -0
  116. package/src/features/popover/utils/resolvePopoverPosition.ts +40 -0
  117. package/src/{components/toast → features/toast/adapters/inbound}/Toast.tsx +58 -54
  118. package/src/features/toast/adapters/inbound/ToastProvider.tsx +47 -0
  119. package/src/features/toast/adapters/inbound/useToast.test.tsx +18 -0
  120. package/src/features/toast/adapters/inbound/useToast.ts +15 -0
  121. package/src/features/toast/composition/ToastContext.ts +6 -0
  122. package/src/features/toast/composition/useToastRuntime.ts +76 -0
  123. package/src/features/toast/public.ts +10 -0
  124. package/src/index.test.ts +3 -1
  125. package/src/index.ts +14 -2
  126. package/src/internal/overlay/OverlayProvider.tsx +10 -8
  127. package/src/internal/overlay/useOverlayStack.ts +1 -1
  128. package/src/internal/resolvers/resolveOverlayZIndex.test.ts +2 -1
  129. package/src/internal/resolvers/resolveOverlayZIndex.ts +2 -1
  130. package/src/layout/AppBar.tsx +1 -1
  131. package/src/theme/ThemeContext.tsx +4 -5
  132. package/src/types/popover.ts +25 -0
  133. package/src/{components/toast/types.ts → types/toast.ts} +12 -2
  134. package/dist/components/toast/Toast.d.ts.map +0 -1
  135. package/dist/components/toast/Toast.js.map +0 -1
  136. package/dist/components/toast/ToastProvider.d.ts +0 -13
  137. package/dist/components/toast/ToastProvider.d.ts.map +0 -1
  138. package/dist/components/toast/ToastProvider.js +0 -70
  139. package/dist/components/toast/ToastProvider.js.map +0 -1
  140. package/dist/components/toast/index.d.ts +0 -4
  141. package/dist/components/toast/index.d.ts.map +0 -1
  142. package/dist/components/toast/index.js +0 -3
  143. package/dist/components/toast/index.js.map +0 -1
  144. package/dist/components/toast/types.d.ts.map +0 -1
  145. package/dist/components/toast/types.js +0 -2
  146. package/dist/components/toast/types.js.map +0 -1
  147. package/dist/examples/DocsExamples.d.ts +0 -6
  148. package/dist/examples/DocsExamples.d.ts.map +0 -1
  149. package/dist/examples/DocsExamples.js +0 -97
  150. package/dist/examples/DocsExamples.js.map +0 -1
  151. package/src/components/toast/ToastProvider.tsx +0 -115
  152. package/src/components/toast/index.ts +0 -3
  153. package/src/examples/DocsExamples.tsx +0 -122
@@ -1 +0,0 @@
1
- {"version":3,"file":"Toast.js","sourceRoot":"","sources":["../../../src/components/toast/Toast.tsx"],"names":[],"mappings":"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","sourcesContent":["import React from 'react';\nimport { Pressable } from 'react-native';\n\nimport { Box } from '../../features/layout/public';\nimport { Surface } from '../../features/surface/public';\nimport { Text } from '../../features/typography/public';\nimport { Inline } from '../../layout';\nimport type { SurfaceColor } from '../../surfaceColor';\nimport { useTheme } from '../../theme/ThemeContext';\nimport type { SurfaceTheme } from '../../theme/types';\nimport type { ToastProps } from './types';\n\nfunction resolveToastStatusColor(theme: SurfaceTheme, status: ToastProps['status']) {\n switch (status) {\n case 'success':\n return theme.semantics.success.base;\n case 'warning':\n return theme.semantics.warning.base;\n case 'error':\n return theme.semantics.error.base;\n case 'info':\n return theme.semantics.info.base;\n default:\n return theme.semantics.action.primary.base;\n }\n}\n\nfunction resolveToastStatusTextColor(status: ToastProps['status']): SurfaceColor {\n switch (status) {\n case 'success':\n return 'success';\n case 'warning':\n return 'warning';\n case 'error':\n return 'error';\n case 'info':\n return 'info';\n default:\n return 'primary';\n }\n}\n\nexport function Toast({\n title,\n description,\n status = 'default',\n onDismiss,\n interactionPolicy = 'enabled',\n testID,\n}: ToastProps) {\n const { theme } = useTheme();\n const statusColor = resolveToastStatusColor(theme, status);\n const statusTextColor = resolveToastStatusTextColor(status);\n const passive = interactionPolicy === 'passive';\n\n return (\n <Surface\n p=\"m\"\n style={{\n borderLeftColor: statusColor,\n borderLeftWidth: 3,\n minWidth: 280,\n shadowOpacity: 0.14,\n shadowRadius: 12,\n shadowOffset: { width: 0, height: 6 },\n }}\n testID={testID}\n variant=\"raised\"\n >\n <Inline align=\"center\" justify=\"space-between\">\n <Box flex={1}>\n {title ? (\n <Text variant=\"label\" weight=\"medium\">\n {title}\n </Text>\n ) : null}\n {description ? <Text emphasis=\"muted\">{description}</Text> : null}\n </Box>\n {onDismiss ? (\n <Pressable\n accessibilityLabel=\"Dismiss notification\"\n accessibilityRole=\"button\"\n onPress={passive ? undefined : onDismiss}\n testID={testID ? `${testID}-dismiss` : undefined}\n >\n <Text color={statusTextColor}>×</Text>\n </Pressable>\n ) : null}\n </Inline>\n </Surface>\n );\n}\n"]}
@@ -1,13 +0,0 @@
1
- import React from 'react';
2
- import type { ToastOptions } from './types';
3
- interface ToastContextValue {
4
- dismissToast: (id: string) => void;
5
- showToast: (options: ToastOptions) => string;
6
- }
7
- export declare function ToastProvider({ children, defaultDuration, }: {
8
- children: React.ReactNode;
9
- defaultDuration?: number;
10
- }): React.JSX.Element;
11
- export declare function useToast(): ToastContextValue;
12
- export {};
13
- //# sourceMappingURL=ToastProvider.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"ToastProvider.d.ts","sourceRoot":"","sources":["../../../src/components/toast/ToastProvider.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAM1B,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAM5C,UAAU,iBAAiB;IACzB,YAAY,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;IACnC,SAAS,EAAE,CAAC,OAAO,EAAE,YAAY,KAAK,MAAM,CAAC;CAC9C;AAMD,wBAAgB,aAAa,CAAC,EAC5B,QAAQ,EACR,eAAsB,GACvB,EAAE;IACD,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B,qBA6EA;AAED,wBAAgB,QAAQ,sBAQvB"}
@@ -1,70 +0,0 @@
1
- import React from 'react';
2
- import { Stack } from '../../features/layout/public';
3
- import { Portal } from '../../internal/overlay/Portal';
4
- import { resolveOverlayAnimation } from '../../internal/resolvers';
5
- import { Toast } from './Toast';
6
- const ToastContext = React.createContext(null);
7
- let toastCounter = 0;
8
- export function ToastProvider({ children, defaultDuration = 4000, }) {
9
- const [toasts, setToasts] = React.useState([]);
10
- const animation = resolveOverlayAnimation('toast');
11
- const timersRef = React.useRef(new Map());
12
- const dismissToast = React.useCallback((id) => {
13
- const timer = timersRef.current.get(id);
14
- if (timer) {
15
- clearTimeout(timer);
16
- timersRef.current.delete(id);
17
- }
18
- setToasts((current) => current.filter((toast) => toast.id !== id));
19
- }, []);
20
- const showToast = React.useCallback((options) => {
21
- const id = options.id ?? `toast-${toastCounter++}`;
22
- setToasts((current) => [...current, { ...options, id }]);
23
- return id;
24
- }, []);
25
- React.useEffect(() => {
26
- toasts.forEach((toast) => {
27
- if (timersRef.current.has(toast.id)) {
28
- return;
29
- }
30
- const timer = setTimeout(() => {
31
- dismissToast(toast.id);
32
- }, toast.duration ?? defaultDuration);
33
- timersRef.current.set(toast.id, timer);
34
- });
35
- const activeToastIds = new Set(toasts.map((toast) => toast.id));
36
- timersRef.current.forEach((timer, id) => {
37
- if (!activeToastIds.has(id)) {
38
- clearTimeout(timer);
39
- timersRef.current.delete(id);
40
- }
41
- });
42
- }, [defaultDuration, dismissToast, toasts]);
43
- React.useEffect(() => {
44
- const timers = timersRef.current;
45
- return () => {
46
- timers.forEach((timer) => clearTimeout(timer));
47
- timers.clear();
48
- };
49
- }, []);
50
- return (<ToastContext.Provider value={{ dismissToast, showToast }}>
51
- {children}
52
- <Portal layer="toast" visible={toasts.length > 0}>
53
- <Stack gap="s" pointerEvents="box-none" style={{
54
- alignItems: 'flex-end',
55
- padding: 16,
56
- paddingTop: 16 + animation.offset,
57
- }}>
58
- {toasts.map((toast) => (<Toast description={toast.description} key={toast.id} onDismiss={() => dismissToast(toast.id)} status={toast.status} testID={toast.testID} title={toast.title}/>))}
59
- </Stack>
60
- </Portal>
61
- </ToastContext.Provider>);
62
- }
63
- export function useToast() {
64
- const context = React.useContext(ToastContext);
65
- if (!context) {
66
- throw new Error('useToast must be used within <ToastProvider>.');
67
- }
68
- return context;
69
- }
70
- //# sourceMappingURL=ToastProvider.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"ToastProvider.js","sourceRoot":"","sources":["../../../src/components/toast/ToastProvider.tsx"],"names":[],"mappings":"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","sourcesContent":["import React from 'react';\n\nimport { Stack } from '../../features/layout/public';\nimport { Portal } from '../../internal/overlay/Portal';\nimport { resolveOverlayAnimation } from '../../internal/resolvers';\nimport { Toast } from './Toast';\nimport type { ToastOptions } from './types';\n\ninterface ToastEntry extends ToastOptions {\n id: string;\n}\n\ninterface ToastContextValue {\n dismissToast: (id: string) => void;\n showToast: (options: ToastOptions) => string;\n}\n\nconst ToastContext = React.createContext<ToastContextValue | null>(null);\n\nlet toastCounter = 0;\n\nexport function ToastProvider({\n children,\n defaultDuration = 4000,\n}: {\n children: React.ReactNode;\n defaultDuration?: number;\n}) {\n const [toasts, setToasts] = React.useState<ToastEntry[]>([]);\n const animation = resolveOverlayAnimation('toast');\n const timersRef = React.useRef(new Map<string, ReturnType<typeof setTimeout>>());\n\n const dismissToast = React.useCallback((id: string) => {\n const timer = timersRef.current.get(id);\n if (timer) {\n clearTimeout(timer);\n timersRef.current.delete(id);\n }\n setToasts((current) => current.filter((toast) => toast.id !== id));\n }, []);\n\n const showToast = React.useCallback((options: ToastOptions) => {\n const id = options.id ?? `toast-${toastCounter++}`;\n setToasts((current) => [...current, { ...options, id }]);\n return id;\n }, []);\n\n React.useEffect(() => {\n toasts.forEach((toast) => {\n if (timersRef.current.has(toast.id)) {\n return;\n }\n\n const timer = setTimeout(() => {\n dismissToast(toast.id);\n }, toast.duration ?? defaultDuration);\n\n timersRef.current.set(toast.id, timer);\n });\n\n const activeToastIds = new Set(toasts.map((toast) => toast.id));\n timersRef.current.forEach((timer, id) => {\n if (!activeToastIds.has(id)) {\n clearTimeout(timer);\n timersRef.current.delete(id);\n }\n });\n }, [defaultDuration, dismissToast, toasts]);\n\n React.useEffect(() => {\n const timers = timersRef.current;\n return () => {\n timers.forEach((timer) => clearTimeout(timer));\n timers.clear();\n };\n }, []);\n\n return (\n <ToastContext.Provider value={{ dismissToast, showToast }}>\n {children}\n <Portal layer=\"toast\" visible={toasts.length > 0}>\n <Stack\n gap=\"s\"\n pointerEvents=\"box-none\"\n style={{\n alignItems: 'flex-end',\n padding: 16,\n paddingTop: 16 + animation.offset,\n }}\n >\n {toasts.map((toast) => (\n <Toast\n description={toast.description}\n key={toast.id}\n onDismiss={() => dismissToast(toast.id)}\n status={toast.status}\n testID={toast.testID}\n title={toast.title}\n />\n ))}\n </Stack>\n </Portal>\n </ToastContext.Provider>\n );\n}\n\nexport function useToast() {\n const context = React.useContext(ToastContext);\n\n if (!context) {\n throw new Error('useToast must be used within <ToastProvider>.');\n }\n\n return context;\n}\n"]}
@@ -1,4 +0,0 @@
1
- export { Toast } from './Toast';
2
- export { ToastProvider, useToast } from './ToastProvider';
3
- export type { ToastOptions, ToastProps, ToastStatus } from './types';
4
- //# sourceMappingURL=index.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/toast/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAChC,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAC1D,YAAY,EAAE,YAAY,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC"}
@@ -1,3 +0,0 @@
1
- export { Toast } from './Toast';
2
- export { ToastProvider, useToast } from './ToastProvider';
3
- //# sourceMappingURL=index.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/components/toast/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAChC,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC","sourcesContent":["export { Toast } from './Toast';\nexport { ToastProvider, useToast } from './ToastProvider';\nexport type { ToastOptions, ToastProps, ToastStatus } from './types';\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/components/toast/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAE/B,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AACjE,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAE7D,MAAM,MAAM,WAAW,GAAG,SAAS,GAAG,kBAAkB,CAAC;AAEzD,MAAM,WAAW,UAAU;IACzB,KAAK,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACxB,WAAW,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC9B,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,SAAS,CAAC,EAAE,CAAC,MAAM,IAAI,CAAC,GAAG,SAAS,CAAC;IACrC,iBAAiB,CAAC,EAAE,iBAAiB,CAAC;IACtC,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,YAAa,SAAQ,IAAI,CAAC,UAAU,EAAE,WAAW,CAAC;IACjE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,EAAE,CAAC,EAAE,MAAM,CAAC;CACb"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=types.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/components/toast/types.ts"],"names":[],"mappings":"","sourcesContent":["import type React from 'react';\n\nimport type { InteractionPolicy } from '../../interactionPolicy';\nimport type { SurfaceStatusColor } from '../../surfaceColor';\n\nexport type ToastStatus = 'default' | SurfaceStatusColor;\n\nexport interface ToastProps {\n title?: React.ReactNode;\n description?: React.ReactNode;\n status?: ToastStatus;\n onDismiss?: (() => void) | undefined;\n interactionPolicy?: InteractionPolicy;\n testID?: string;\n}\n\nexport interface ToastOptions extends Omit<ToastProps, 'onDismiss'> {\n duration?: number;\n id?: string;\n}\n"]}
@@ -1,6 +0,0 @@
1
- import React from 'react';
2
- export declare function FormExample(): React.JSX.Element;
3
- export declare function FeedbackExample(): React.JSX.Element;
4
- export declare function OverlayExample(): React.JSX.Element;
5
- export declare function NavigationExample(): React.JSX.Element;
6
- //# sourceMappingURL=DocsExamples.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"DocsExamples.d.ts","sourceRoot":"","sources":["../../src/examples/DocsExamples.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAyB1B,wBAAgB,WAAW,sBAY1B;AAeD,wBAAgB,eAAe,sBAa9B;AAED,wBAAgB,cAAc,sBAoB7B;AAED,wBAAgB,iBAAiB,sBAgChC"}
@@ -1,97 +0,0 @@
1
- import React from 'react';
2
- import { Field } from '../components/field';
3
- import { HelperText } from '../components/helper-text';
4
- import { Menu } from '../components/menu';
5
- import { Modal } from '../components/modal';
6
- import { Tab, TabList, TabPanel, Tabs } from '../components/tabs';
7
- import { ToastProvider, useToast } from '../components/toast';
8
- import { Tooltip } from '../components/tooltip';
9
- import { Button } from '../features/button/public';
10
- import { Card } from '../features/card/public';
11
- import { Checkbox } from '../features/form/checkbox/public';
12
- import { TextInput } from '../features/form/text-input/public';
13
- import { Box, Stack } from '../features/layout/public';
14
- import { Text } from '../features/typography/public';
15
- import { ThemeProvider } from '../theme';
16
- const docsThemeConfig = {
17
- id: 'docs',
18
- name: 'Docs',
19
- light: { primaryColor: '#2563EB', harmony: 'analogous' },
20
- dark: { primaryColor: '#60A5FA', harmony: 'analogous' },
21
- };
22
- export function FormExample() {
23
- return (<ThemeProvider initialConfig={docsThemeConfig}>
24
- <Stack gap="m" p="l">
25
- <Field helperText="Use your work email." label="Email" required>
26
- <TextInput placeholder="you@example.com"/>
27
- </Field>
28
- <Checkbox checked>Accept terms</Checkbox>
29
- <HelperText emphasis="muted">Looks good.</HelperText>
30
- </Stack>
31
- </ThemeProvider>);
32
- }
33
- function ToastButton() {
34
- const { showToast } = useToast();
35
- return (<Button onPress={() => showToast({ description: 'Your changes were saved.', status: 'success', title: 'Saved' })}>
36
- Show toast
37
- </Button>);
38
- }
39
- export function FeedbackExample() {
40
- return (<ThemeProvider initialConfig={docsThemeConfig}>
41
- <ToastProvider>
42
- <Stack gap="m" p="l">
43
- <Tooltip content="Helpful contextual information">
44
- <Text>Hover for tooltip</Text>
45
- </Tooltip>
46
- <ToastButton />
47
- </Stack>
48
- </ToastProvider>
49
- </ThemeProvider>);
50
- }
51
- export function OverlayExample() {
52
- const [modalVisible, setModalVisible] = React.useState(false);
53
- return (<ThemeProvider initialConfig={docsThemeConfig}>
54
- <Stack gap="m" p="l">
55
- <Button onPress={() => setModalVisible(true)}>Open modal</Button>
56
- <Modal onDismiss={() => setModalVisible(false)} visible={modalVisible}>
57
- <Card>
58
- <Stack gap="s">
59
- <Text variant="label" weight="semiBold">
60
- Modal title
61
- </Text>
62
- <Text>Modal content</Text>
63
- </Stack>
64
- </Card>
65
- </Modal>
66
- </Stack>
67
- </ThemeProvider>);
68
- }
69
- export function NavigationExample() {
70
- return (<ThemeProvider initialConfig={docsThemeConfig}>
71
- <Stack gap="m" p="l">
72
- <Tabs defaultValue="account">
73
- <TabList>
74
- <Tab value="account">Account</Tab>
75
- <Tab disabled value="security">
76
- Security
77
- </Tab>
78
- <Tab value="billing">Billing</Tab>
79
- </TabList>
80
- <TabPanel value="account">
81
- <Text>Account settings</Text>
82
- </TabPanel>
83
- <TabPanel value="billing">
84
- <Text>Billing settings</Text>
85
- </TabPanel>
86
- </Tabs>
87
- <Menu actions={[
88
- { id: 'edit', title: 'Edit' },
89
- { disabled: true, id: 'archive', title: 'Archive' },
90
- ]} trigger={<Text>Open menu</Text>}/>
91
- <Box>
92
- <Text color="success">Theme overrides can stay semantic.</Text>
93
- </Box>
94
- </Stack>
95
- </ThemeProvider>);
96
- }
97
- //# sourceMappingURL=DocsExamples.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"DocsExamples.js","sourceRoot":"","sources":["../../src/examples/DocsExamples.tsx"],"names":[],"mappings":"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","sourcesContent":["import React from 'react';\n\nimport { Field } from '../components/field';\nimport { HelperText } from '../components/helper-text';\nimport { Menu } from '../components/menu';\nimport { Modal } from '../components/modal';\nimport { Tab, TabList, TabPanel, Tabs } from '../components/tabs';\nimport { ToastProvider, useToast } from '../components/toast';\nimport { Tooltip } from '../components/tooltip';\nimport { Button } from '../features/button/public';\nimport { Card } from '../features/card/public';\nimport { Checkbox } from '../features/form/checkbox/public';\nimport { TextInput } from '../features/form/text-input/public';\nimport { Box, Stack } from '../features/layout/public';\nimport { Text } from '../features/typography/public';\nimport { ThemeProvider } from '../theme';\nimport type { ThemeConfig } from '../theme/types';\n\nconst docsThemeConfig: ThemeConfig = {\n id: 'docs',\n name: 'Docs',\n light: { primaryColor: '#2563EB', harmony: 'analogous' },\n dark: { primaryColor: '#60A5FA', harmony: 'analogous' },\n};\n\nexport function FormExample() {\n return (\n <ThemeProvider initialConfig={docsThemeConfig}>\n <Stack gap=\"m\" p=\"l\">\n <Field helperText=\"Use your work email.\" label=\"Email\" required>\n <TextInput placeholder=\"you@example.com\" />\n </Field>\n <Checkbox checked>Accept terms</Checkbox>\n <HelperText emphasis=\"muted\">Looks good.</HelperText>\n </Stack>\n </ThemeProvider>\n );\n}\n\nfunction ToastButton() {\n const { showToast } = useToast();\n return (\n <Button\n onPress={() =>\n showToast({ description: 'Your changes were saved.', status: 'success', title: 'Saved' })\n }\n >\n Show toast\n </Button>\n );\n}\n\nexport function FeedbackExample() {\n return (\n <ThemeProvider initialConfig={docsThemeConfig}>\n <ToastProvider>\n <Stack gap=\"m\" p=\"l\">\n <Tooltip content=\"Helpful contextual information\">\n <Text>Hover for tooltip</Text>\n </Tooltip>\n <ToastButton />\n </Stack>\n </ToastProvider>\n </ThemeProvider>\n );\n}\n\nexport function OverlayExample() {\n const [modalVisible, setModalVisible] = React.useState(false);\n\n return (\n <ThemeProvider initialConfig={docsThemeConfig}>\n <Stack gap=\"m\" p=\"l\">\n <Button onPress={() => setModalVisible(true)}>Open modal</Button>\n <Modal onDismiss={() => setModalVisible(false)} visible={modalVisible}>\n <Card>\n <Stack gap=\"s\">\n <Text variant=\"label\" weight=\"semiBold\">\n Modal title\n </Text>\n <Text>Modal content</Text>\n </Stack>\n </Card>\n </Modal>\n </Stack>\n </ThemeProvider>\n );\n}\n\nexport function NavigationExample() {\n return (\n <ThemeProvider initialConfig={docsThemeConfig}>\n <Stack gap=\"m\" p=\"l\">\n <Tabs defaultValue=\"account\">\n <TabList>\n <Tab value=\"account\">Account</Tab>\n <Tab disabled value=\"security\">\n Security\n </Tab>\n <Tab value=\"billing\">Billing</Tab>\n </TabList>\n <TabPanel value=\"account\">\n <Text>Account settings</Text>\n </TabPanel>\n <TabPanel value=\"billing\">\n <Text>Billing settings</Text>\n </TabPanel>\n </Tabs>\n <Menu\n actions={[\n { id: 'edit', title: 'Edit' },\n { disabled: true, id: 'archive', title: 'Archive' },\n ]}\n trigger={<Text>Open menu</Text>}\n />\n <Box>\n <Text color=\"success\">Theme overrides can stay semantic.</Text>\n </Box>\n </Stack>\n </ThemeProvider>\n );\n}\n"]}
@@ -1,115 +0,0 @@
1
- import React from 'react';
2
-
3
- import { Stack } from '../../features/layout/public';
4
- import { Portal } from '../../internal/overlay/Portal';
5
- import { resolveOverlayAnimation } from '../../internal/resolvers';
6
- import { Toast } from './Toast';
7
- import type { ToastOptions } from './types';
8
-
9
- interface ToastEntry extends ToastOptions {
10
- id: string;
11
- }
12
-
13
- interface ToastContextValue {
14
- dismissToast: (id: string) => void;
15
- showToast: (options: ToastOptions) => string;
16
- }
17
-
18
- const ToastContext = React.createContext<ToastContextValue | null>(null);
19
-
20
- let toastCounter = 0;
21
-
22
- export function ToastProvider({
23
- children,
24
- defaultDuration = 4000,
25
- }: {
26
- children: React.ReactNode;
27
- defaultDuration?: number;
28
- }) {
29
- const [toasts, setToasts] = React.useState<ToastEntry[]>([]);
30
- const animation = resolveOverlayAnimation('toast');
31
- const timersRef = React.useRef(new Map<string, ReturnType<typeof setTimeout>>());
32
-
33
- const dismissToast = React.useCallback((id: string) => {
34
- const timer = timersRef.current.get(id);
35
- if (timer) {
36
- clearTimeout(timer);
37
- timersRef.current.delete(id);
38
- }
39
- setToasts((current) => current.filter((toast) => toast.id !== id));
40
- }, []);
41
-
42
- const showToast = React.useCallback((options: ToastOptions) => {
43
- const id = options.id ?? `toast-${toastCounter++}`;
44
- setToasts((current) => [...current, { ...options, id }]);
45
- return id;
46
- }, []);
47
-
48
- React.useEffect(() => {
49
- toasts.forEach((toast) => {
50
- if (timersRef.current.has(toast.id)) {
51
- return;
52
- }
53
-
54
- const timer = setTimeout(() => {
55
- dismissToast(toast.id);
56
- }, toast.duration ?? defaultDuration);
57
-
58
- timersRef.current.set(toast.id, timer);
59
- });
60
-
61
- const activeToastIds = new Set(toasts.map((toast) => toast.id));
62
- timersRef.current.forEach((timer, id) => {
63
- if (!activeToastIds.has(id)) {
64
- clearTimeout(timer);
65
- timersRef.current.delete(id);
66
- }
67
- });
68
- }, [defaultDuration, dismissToast, toasts]);
69
-
70
- React.useEffect(() => {
71
- const timers = timersRef.current;
72
- return () => {
73
- timers.forEach((timer) => clearTimeout(timer));
74
- timers.clear();
75
- };
76
- }, []);
77
-
78
- return (
79
- <ToastContext.Provider value={{ dismissToast, showToast }}>
80
- {children}
81
- <Portal layer="toast" visible={toasts.length > 0}>
82
- <Stack
83
- gap="s"
84
- pointerEvents="box-none"
85
- style={{
86
- alignItems: 'flex-end',
87
- padding: 16,
88
- paddingTop: 16 + animation.offset,
89
- }}
90
- >
91
- {toasts.map((toast) => (
92
- <Toast
93
- description={toast.description}
94
- key={toast.id}
95
- onDismiss={() => dismissToast(toast.id)}
96
- status={toast.status}
97
- testID={toast.testID}
98
- title={toast.title}
99
- />
100
- ))}
101
- </Stack>
102
- </Portal>
103
- </ToastContext.Provider>
104
- );
105
- }
106
-
107
- export function useToast() {
108
- const context = React.useContext(ToastContext);
109
-
110
- if (!context) {
111
- throw new Error('useToast must be used within <ToastProvider>.');
112
- }
113
-
114
- return context;
115
- }
@@ -1,3 +0,0 @@
1
- export { Toast } from './Toast';
2
- export { ToastProvider, useToast } from './ToastProvider';
3
- export type { ToastOptions, ToastProps, ToastStatus } from './types';
@@ -1,122 +0,0 @@
1
- import React from 'react';
2
-
3
- import { Field } from '../components/field';
4
- import { HelperText } from '../components/helper-text';
5
- import { Menu } from '../components/menu';
6
- import { Modal } from '../components/modal';
7
- import { Tab, TabList, TabPanel, Tabs } from '../components/tabs';
8
- import { ToastProvider, useToast } from '../components/toast';
9
- import { Tooltip } from '../components/tooltip';
10
- import { Button } from '../features/button/public';
11
- import { Card } from '../features/card/public';
12
- import { Checkbox } from '../features/form/checkbox/public';
13
- import { TextInput } from '../features/form/text-input/public';
14
- import { Box, Stack } from '../features/layout/public';
15
- import { Text } from '../features/typography/public';
16
- import { ThemeProvider } from '../theme';
17
- import type { ThemeConfig } from '../theme/types';
18
-
19
- const docsThemeConfig: ThemeConfig = {
20
- id: 'docs',
21
- name: 'Docs',
22
- light: { primaryColor: '#2563EB', harmony: 'analogous' },
23
- dark: { primaryColor: '#60A5FA', harmony: 'analogous' },
24
- };
25
-
26
- export function FormExample() {
27
- return (
28
- <ThemeProvider initialConfig={docsThemeConfig}>
29
- <Stack gap="m" p="l">
30
- <Field helperText="Use your work email." label="Email" required>
31
- <TextInput placeholder="you@example.com" />
32
- </Field>
33
- <Checkbox checked>Accept terms</Checkbox>
34
- <HelperText emphasis="muted">Looks good.</HelperText>
35
- </Stack>
36
- </ThemeProvider>
37
- );
38
- }
39
-
40
- function ToastButton() {
41
- const { showToast } = useToast();
42
- return (
43
- <Button
44
- onPress={() =>
45
- showToast({ description: 'Your changes were saved.', status: 'success', title: 'Saved' })
46
- }
47
- >
48
- Show toast
49
- </Button>
50
- );
51
- }
52
-
53
- export function FeedbackExample() {
54
- return (
55
- <ThemeProvider initialConfig={docsThemeConfig}>
56
- <ToastProvider>
57
- <Stack gap="m" p="l">
58
- <Tooltip content="Helpful contextual information">
59
- <Text>Hover for tooltip</Text>
60
- </Tooltip>
61
- <ToastButton />
62
- </Stack>
63
- </ToastProvider>
64
- </ThemeProvider>
65
- );
66
- }
67
-
68
- export function OverlayExample() {
69
- const [modalVisible, setModalVisible] = React.useState(false);
70
-
71
- return (
72
- <ThemeProvider initialConfig={docsThemeConfig}>
73
- <Stack gap="m" p="l">
74
- <Button onPress={() => setModalVisible(true)}>Open modal</Button>
75
- <Modal onDismiss={() => setModalVisible(false)} visible={modalVisible}>
76
- <Card>
77
- <Stack gap="s">
78
- <Text variant="label" weight="semiBold">
79
- Modal title
80
- </Text>
81
- <Text>Modal content</Text>
82
- </Stack>
83
- </Card>
84
- </Modal>
85
- </Stack>
86
- </ThemeProvider>
87
- );
88
- }
89
-
90
- export function NavigationExample() {
91
- return (
92
- <ThemeProvider initialConfig={docsThemeConfig}>
93
- <Stack gap="m" p="l">
94
- <Tabs defaultValue="account">
95
- <TabList>
96
- <Tab value="account">Account</Tab>
97
- <Tab disabled value="security">
98
- Security
99
- </Tab>
100
- <Tab value="billing">Billing</Tab>
101
- </TabList>
102
- <TabPanel value="account">
103
- <Text>Account settings</Text>
104
- </TabPanel>
105
- <TabPanel value="billing">
106
- <Text>Billing settings</Text>
107
- </TabPanel>
108
- </Tabs>
109
- <Menu
110
- actions={[
111
- { id: 'edit', title: 'Edit' },
112
- { disabled: true, id: 'archive', title: 'Archive' },
113
- ]}
114
- trigger={<Text>Open menu</Text>}
115
- />
116
- <Box>
117
- <Text color="success">Theme overrides can stay semantic.</Text>
118
- </Box>
119
- </Stack>
120
- </ThemeProvider>
121
- );
122
- }