@pushwoosh/dumb-components 1.1.147 → 1.1.149

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 (325) hide show
  1. package/AccessForbidden/AccessForbidden.d.ts +3 -0
  2. package/AccessForbidden/AccessForbidden.js +3 -0
  3. package/Alert/Alert.d.ts +7 -0
  4. package/Alert/Alert.js +7 -0
  5. package/Alert/types.d.ts +6 -0
  6. package/ApplicationPreloader/ApplicationPreloader.d.ts +8 -0
  7. package/ApplicationPreloader/ApplicationPreloader.js +6 -0
  8. package/Badge/Badge.d.ts +6 -0
  9. package/Badge/Badge.js +6 -0
  10. package/Badge/types.d.ts +6 -0
  11. package/Banner/Banner.d.ts +7 -0
  12. package/Banner/Banner.js +7 -0
  13. package/Banner/types.d.ts +16 -0
  14. package/Button/Button.d.ts +19 -0
  15. package/Button/GhostButton.d.ts +1 -0
  16. package/Button/GhostButton.js +1 -0
  17. package/Button/RemoveButton.d.ts +6 -0
  18. package/Button/RemoveButton.js +6 -0
  19. package/Button/types.d.ts +21 -0
  20. package/Calendar/CalendarDropdown/CalendarDropdown.d.ts +12 -0
  21. package/Calendar/CalendarDropdown/CalendarDropdown.js +12 -0
  22. package/Calendar/CalendarDropdown/helpers.d.ts +4 -0
  23. package/Calendar/CalendarDropdown/helpers.js +4 -0
  24. package/Calendar/CalendarDropdown/types.d.ts +33 -0
  25. package/Calendar/CalendarSuperForm/CalendarSuperForm.d.ts +7 -0
  26. package/Calendar/CalendarSuperForm/CalendarSuperForm.js +10 -1
  27. package/Calendar/CalendarSuperForm/components/CalendarRangePicker/CalendarRangePicker.d.ts +1 -0
  28. package/Calendar/CalendarSuperForm/components/CalendarRangePicker/CalendarRangePicker.js +3 -2
  29. package/Calendar/CalendarSuperForm/types.d.ts +37 -9
  30. package/Calendar/helpers.d.ts +10 -0
  31. package/Calendar/helpers.js +10 -0
  32. package/Calendar/types.d.ts +16 -1
  33. package/CardMetric/CardMetric.d.ts +7 -0
  34. package/CardMetric/CardMetric.js +7 -0
  35. package/CardMetric/types.d.ts +13 -0
  36. package/Checkbox/Checkbox.d.ts +6 -0
  37. package/Checkbox/Checkbox.js +6 -0
  38. package/Checkbox/types.d.ts +13 -0
  39. package/Chip/Chip.d.ts +7 -0
  40. package/Chip/Chip.js +7 -0
  41. package/Chip/Chip.types.d.ts +9 -0
  42. package/CodeEditor/CodeEditor.d.ts +7 -0
  43. package/CodeEditor/CodeEditor.js +7 -0
  44. package/CodeEditor/languages/html.d.ts +1 -0
  45. package/CodeEditor/languages/html.js +1 -0
  46. package/CodeEditor/languages/json.d.ts +1 -0
  47. package/CodeEditor/languages/json.js +1 -0
  48. package/CodeEditor/languages/liquid.d.ts +1 -0
  49. package/CodeEditor/languages/liquid.js +1 -0
  50. package/CodeEditor/types.d.ts +11 -0
  51. package/CrashScreen/CrashScreen.d.ts +4 -0
  52. package/CrashScreen/CrashScreen.js +4 -0
  53. package/DateTimePicker/components/DatePicker/DatePicker.d.ts +5 -0
  54. package/DateTimePicker/components/DatePicker/DatePicker.js +5 -0
  55. package/DateTimePicker/components/DatePicker/types.d.ts +9 -0
  56. package/DateTimePicker/components/DatePickerField/DatePickerField.d.ts +5 -0
  57. package/DateTimePicker/components/DatePickerField/DatePickerField.js +5 -0
  58. package/DateTimePicker/components/DatePickerField/types.d.ts +9 -0
  59. package/DateTimePicker/components/DateTimePicker/DateTimePicker.d.ts +5 -0
  60. package/DateTimePicker/components/DateTimePicker/DateTimePicker.js +5 -0
  61. package/DateTimePicker/components/DateTimePicker/types.d.ts +6 -0
  62. package/DateTimePicker/components/DateTimePickerField/DateTimePickerField.d.ts +5 -0
  63. package/DateTimePicker/components/DateTimePickerField/DateTimePickerField.js +5 -0
  64. package/DateTimePicker/components/DateTimePickerField/types.d.ts +9 -0
  65. package/DateTimePicker/types.d.ts +5 -0
  66. package/Drawer/components/Drawer/Drawer.d.ts +11 -0
  67. package/Drawer/components/Drawer/Drawer.js +11 -0
  68. package/Drawer/components/Drawer/types.d.ts +9 -0
  69. package/Drawer/components/DrawerContent/styles.d.ts +3 -0
  70. package/Drawer/components/DrawerContent/styles.js +3 -0
  71. package/Drawer/components/DrawerDocs/DrawerDocs.d.ts +7 -0
  72. package/Drawer/components/DrawerDocs/DrawerDocs.js +7 -0
  73. package/Drawer/components/DrawerDocs/hooks.d.ts +4 -0
  74. package/Drawer/components/DrawerDocs/hooks.js +4 -0
  75. package/Drawer/components/DrawerDocs/types.d.ts +4 -0
  76. package/DropdownMenu/components/DropdownMenu/DropdownMenu.d.ts +12 -0
  77. package/DropdownMenu/components/DropdownMenu/DropdownMenu.js +12 -0
  78. package/DropdownMenu/components/DropdownMenu/types.d.ts +15 -0
  79. package/DropdownMenu/components/DropdownMenuButton/DropdownMenuButton.d.ts +8 -0
  80. package/DropdownMenu/components/DropdownMenuButton/DropdownMenuButton.js +8 -0
  81. package/DropdownMenu/components/DropdownMenuButton/types.d.ts +16 -0
  82. package/DropdownMenu/components/DropdownMenuItem/DropdownMenuItem.d.ts +7 -0
  83. package/DropdownMenu/components/DropdownMenuItem/DropdownMenuItem.js +7 -0
  84. package/DropdownMenu/components/DropdownMenuItem/types.d.ts +6 -0
  85. package/DropdownMenu/components/DropdownMenuSection/DropdownMenuSection.d.ts +8 -0
  86. package/DropdownMenu/components/DropdownMenuSection/DropdownMenuSection.js +8 -0
  87. package/DropdownMenu/components/DropdownMenuSection/types.d.ts +3 -0
  88. package/DropdownMenu/components/DropdownMenuSubmenu/DropdownMenuSubmenu.d.ts +9 -0
  89. package/DropdownMenu/components/DropdownMenuSubmenu/DropdownMenuSubmenu.js +9 -0
  90. package/DropdownMenu/components/DropdownMenuSubmenu/types.d.ts +5 -0
  91. package/EditableField/EditableField.d.ts +9 -0
  92. package/EditableField/EditableField.js +9 -0
  93. package/EditableField/types.d.ts +12 -0
  94. package/EmailTemplatePreview/EmailTemplatePreview.d.ts +7 -0
  95. package/EmailTemplatePreview/EmailTemplatePreview.js +7 -0
  96. package/EmailTemplatePreview/components/NoEmailTemplatePreview/NoEmailTemplatePreview.d.ts +4 -0
  97. package/EmailTemplatePreview/components/NoEmailTemplatePreview/NoEmailTemplatePreview.js +4 -0
  98. package/EmailTemplatePreview/helpers.d.ts +8 -0
  99. package/EmailTemplatePreview/helpers.js +8 -0
  100. package/EmailTemplatePreview/types.d.ts +7 -0
  101. package/EnhancedInput/EnhancedInput.d.ts +7 -0
  102. package/EnhancedInput/EnhancedInput.js +7 -0
  103. package/EnhancedInput/SearchInput.d.ts +6 -0
  104. package/EnhancedInput/SearchInput.js +6 -0
  105. package/EnhancedInput/types.d.ts +5 -0
  106. package/ExportResult/ExportResult.d.ts +7 -0
  107. package/ExportResult/ExportResult.js +7 -0
  108. package/ExportResult/types.d.ts +7 -0
  109. package/ExternalImagePreview/ExternalImagePreview.d.ts +7 -0
  110. package/ExternalImagePreview/ExternalImagePreview.js +7 -0
  111. package/ExternalImagePreview/types.d.ts +7 -0
  112. package/FieldBox/FieldBox.d.ts +9 -0
  113. package/FieldBox/FieldBox.js +9 -0
  114. package/FieldBox/types.d.ts +10 -0
  115. package/FrequencyCapping/FrequencyCappingEdit.d.ts +7 -0
  116. package/FrequencyCapping/FrequencyCappingEdit.js +7 -0
  117. package/FrequencyCapping/FrequencyCappingInApps.d.ts +7 -0
  118. package/FrequencyCapping/FrequencyCappingInApps.js +7 -0
  119. package/FrequencyCapping/FrequencyCappingReadonly.d.ts +3 -0
  120. package/FrequencyCapping/FrequencyCappingReadonly.js +3 -0
  121. package/FrequencyCapping/types.d.ts +37 -0
  122. package/FrequencyCapping/types.js +1 -0
  123. package/GetStartedPage/GetStartedPage.d.ts +7 -0
  124. package/GetStartedPage/GetStartedPage.js +7 -0
  125. package/GetStartedPage/types.d.ts +7 -0
  126. package/InputFile/InputFile.d.ts +7 -0
  127. package/InputFile/InputFile.js +7 -0
  128. package/InputFile/types.d.ts +18 -0
  129. package/Link/Link.d.ts +18 -0
  130. package/Link/types.d.ts +17 -0
  131. package/Modal/components/Modal/Modal.d.ts +11 -0
  132. package/Modal/components/Modal/Modal.js +11 -0
  133. package/Modal/components/Modal/types.d.ts +6 -0
  134. package/Modal/components/ModalConfirm/ModalConfirm.d.ts +8 -0
  135. package/Modal/components/ModalConfirm/ModalConfirm.js +8 -0
  136. package/Modal/components/ModalConfirm/ModalConfirmProvider.d.ts +7 -0
  137. package/Modal/components/ModalConfirm/ModalConfirmProvider.js +7 -0
  138. package/Modal/components/ModalConfirm/hooks.d.ts +8 -0
  139. package/Modal/components/ModalConfirm/hooks.js +8 -0
  140. package/Modal/components/ModalConfirm/types.d.ts +16 -0
  141. package/Modal/components/ModalContent/styles.d.ts +5 -0
  142. package/Modal/components/ModalContent/styles.js +5 -0
  143. package/Modal/components/ModalTitle/ModalTitle.d.ts +6 -0
  144. package/Modal/components/ModalTitle/ModalTitle.js +6 -0
  145. package/Modal/components/ModalTitle/types.d.ts +3 -0
  146. package/NotificationInbox/NotificationBar.d.ts +7 -0
  147. package/NotificationInbox/NotificationBar.js +7 -0
  148. package/NotificationInbox/NotificationBell.d.ts +7 -0
  149. package/NotificationInbox/NotificationBell.js +7 -0
  150. package/NotificationInbox/NotificationInbox.d.ts +7 -0
  151. package/NotificationInbox/NotificationInbox.js +7 -0
  152. package/NotificationInbox/types.d.ts +31 -0
  153. package/NumberPicker/NumberPicker.d.ts +7 -0
  154. package/NumberPicker/NumberPicker.js +7 -0
  155. package/NumberPicker/types.d.ts +12 -0
  156. package/PageHeader/components/AutosizeInput/AutosizeInput.d.ts +7 -0
  157. package/PageHeader/components/AutosizeInput/AutosizeInput.js +7 -0
  158. package/PageHeader/components/AutosizeInput/types.d.ts +7 -0
  159. package/PageHeader/components/PageHeader/PageHeader.d.ts +7 -0
  160. package/PageHeader/components/PageHeader/PageHeader.js +7 -0
  161. package/PageHeader/components/PageHeader/types.d.ts +13 -0
  162. package/PageHeader/components/PageHeaderEditable/PageHeaderEditable.d.ts +7 -0
  163. package/PageHeader/components/PageHeaderEditable/PageHeaderEditable.js +7 -0
  164. package/PageHeader/components/PageHeaderEditable/types.d.ts +19 -0
  165. package/Pagination/Pagination.d.ts +7 -0
  166. package/Pagination/Pagination.js +7 -0
  167. package/Pagination/types.d.ts +7 -0
  168. package/Popover/Popover.d.ts +10 -0
  169. package/Popover/Popover.js +10 -0
  170. package/Popover/styles.d.ts +1 -0
  171. package/Popover/styles.js +1 -0
  172. package/Popover/types.d.ts +9 -0
  173. package/ProgressBar/ProgressBar.d.ts +6 -0
  174. package/ProgressBar/ProgressBar.js +6 -0
  175. package/ProgressBar/types.d.ts +7 -0
  176. package/PushPreview/PushPreview.d.ts +7 -0
  177. package/PushPreview/PushPreview.js +7 -0
  178. package/PushPreview/types.d.ts +17 -0
  179. package/Radio/Radio.d.ts +7 -0
  180. package/Radio/Radio.js +7 -0
  181. package/Radio/types.d.ts +14 -0
  182. package/RadioCard/RadioCard.d.ts +7 -0
  183. package/RadioCard/RadioCard.js +7 -0
  184. package/RadioCard/types.d.ts +7 -0
  185. package/ReCaptcha/ReCaptcha.d.ts +8 -0
  186. package/ReCaptcha/ReCaptcha.js +8 -0
  187. package/ReCaptcha/helpers.d.ts +4 -0
  188. package/ReCaptcha/helpers.js +4 -0
  189. package/ReCaptcha/hooks.d.ts +4 -0
  190. package/ReCaptcha/hooks.js +4 -0
  191. package/ReCaptcha/types.d.ts +5 -0
  192. package/RichMessageEditor/RichMessageEditor.d.ts +8 -0
  193. package/RichMessageEditor/RichMessageEditor.js +8 -0
  194. package/RichMessageEditor/RichMessageEditor.types.d.ts +10 -0
  195. package/RichMessageEditor/RichMessageViewer.d.ts +10 -0
  196. package/RichMessageEditor/RichMessageViewer.js +7 -0
  197. package/RichMessageEditor/slate/types.d.ts +5 -0
  198. package/RichMessageEditor/types.d.ts +1 -0
  199. package/RichmediaPreview/RichmediaPreview.d.ts +7 -0
  200. package/RichmediaPreview/RichmediaPreview.js +7 -0
  201. package/RichmediaPreview/hooks.d.ts +4 -0
  202. package/RichmediaPreview/hooks.js +4 -0
  203. package/RichmediaPreview/types.d.ts +13 -0
  204. package/Select/Select.d.ts +22 -0
  205. package/Select/Select.js +22 -0
  206. package/Select/constants.d.ts +1 -0
  207. package/Select/constants.js +1 -0
  208. package/Select/types.d.ts +19 -0
  209. package/SendRate/SendRateEdit.d.ts +7 -0
  210. package/SendRate/SendRateEdit.js +7 -0
  211. package/SendRate/SendRateReadonly.d.ts +3 -0
  212. package/SendRate/SendRateReadonly.js +3 -0
  213. package/SendRate/types.d.ts +20 -0
  214. package/Skeleton/TextSkeleton.d.ts +6 -0
  215. package/Skeleton/TextSkeleton.js +6 -0
  216. package/Skeleton/styles.d.ts +2 -0
  217. package/Skeleton/styles.js +2 -0
  218. package/Skeleton/types.d.ts +11 -0
  219. package/SortButton/SortButton.d.ts +6 -0
  220. package/SortButton/SortButton.js +6 -0
  221. package/SortButton/types.d.ts +11 -0
  222. package/Spinner/Spinner.d.ts +6 -0
  223. package/Spinner/Spinner.js +6 -0
  224. package/Spinner/types.d.ts +4 -0
  225. package/StatisticCard/StatisticCard.d.ts +7 -0
  226. package/StatisticCard/StatisticCard.js +7 -0
  227. package/StatisticCard/types.d.ts +21 -0
  228. package/Switch/Switch.d.ts +6 -0
  229. package/Switch/Switch.js +6 -0
  230. package/Switch/types.d.ts +8 -0
  231. package/Tabs/components/Tab/Tab.d.ts +4 -0
  232. package/Tabs/components/Tab/Tab.js +4 -0
  233. package/Tabs/components/Tab/types.d.ts +6 -0
  234. package/Tabs/components/TabBar/TabBar.d.ts +3 -0
  235. package/Tabs/components/TabBar/TabBar.js +3 -0
  236. package/Tabs/components/TabBar/types.d.ts +2 -0
  237. package/Tabs/components/TabPanel/TabPanel.d.ts +4 -0
  238. package/Tabs/components/TabPanel/TabPanel.js +4 -0
  239. package/Tabs/components/TabPanel/types.d.ts +3 -0
  240. package/Tabs/components/Tabs/Tabs.d.ts +11 -0
  241. package/Tabs/components/Tabs/Tabs.js +11 -0
  242. package/Tabs/components/Tabs/types.d.ts +4 -0
  243. package/Tabs/types.d.ts +4 -0
  244. package/Toast/Toast.d.ts +5 -0
  245. package/Toast/Toast.js +5 -0
  246. package/Toast/ToastProvider.d.ts +7 -0
  247. package/Toast/ToastProvider.js +7 -0
  248. package/Toast/hooks.d.ts +8 -0
  249. package/Toast/hooks.js +8 -0
  250. package/Toast/types.d.ts +24 -0
  251. package/Tooltip/Tooltip.d.ts +7 -0
  252. package/Tooltip/Tooltip.js +7 -0
  253. package/Tooltip/TooltipTrigger.d.ts +13 -0
  254. package/Tooltip/TooltipTrigger.js +7 -0
  255. package/Tooltip/types.d.ts +12 -0
  256. package/hooks/useElementWidth.d.ts +4 -3
  257. package/hooks/useElementWidth.js +4 -3
  258. package/hooks/useLayer.d.ts +7 -0
  259. package/hooks/useLayer.js +7 -0
  260. package/hooks/useOnClickOutside.d.ts +7 -0
  261. package/hooks/useOnClickOutside.js +7 -0
  262. package/native/Input.d.ts +3 -0
  263. package/native/Input.js +1 -0
  264. package/native/NativeTimeInput.d.ts +1 -0
  265. package/native/NativeTimeInput.js +1 -0
  266. package/native/Select.d.ts +1 -0
  267. package/native/Select.js +1 -0
  268. package/native/Textarea.d.ts +1 -0
  269. package/native/Textarea.js +1 -0
  270. package/package.json +2 -3
  271. package/polyglot/react.d.ts +19 -0
  272. package/polyglot/react.js +19 -0
  273. package/polyglot/types.d.ts +4 -0
  274. package/shared/dropdownField/FieldInput.d.ts +1 -0
  275. package/shared/dropdownField/FieldInput.js +1 -0
  276. package/shared/dropdownField/FieldShell.d.ts +4 -0
  277. package/shared/dropdownField/FieldShell.js +4 -0
  278. package/shared/dropdownField/SuggestionsDropdown.d.ts +4 -0
  279. package/shared/dropdownField/SuggestionsDropdown.js +4 -0
  280. package/shared/dropdownField/constants.d.ts +1 -0
  281. package/shared/dropdownField/constants.js +1 -0
  282. package/shared/dropdownField/shared.d.ts +7 -0
  283. package/shared/dropdownField/shared.js +7 -0
  284. package/shared/dropdownField/types.d.ts +7 -0
  285. package/shared/dropdownField/useActiveIndex.d.ts +4 -0
  286. package/shared/dropdownField/useActiveIndex.js +4 -0
  287. package/shared/dropdownField/useAsyncItems.d.ts +4 -0
  288. package/shared/dropdownField/useAsyncItems.js +4 -0
  289. package/shared/dropdownField/useDebouncedValue.d.ts +1 -0
  290. package/shared/dropdownField/useDebouncedValue.js +1 -0
  291. package/shared/dropdownField/useDropdownItems.d.ts +4 -0
  292. package/shared/dropdownField/useDropdownItems.js +4 -0
  293. package/shared/dropdownField/useDropdownPosition.d.ts +4 -0
  294. package/shared/dropdownField/useDropdownPosition.js +4 -0
  295. package/shared/dropdownField/useFieldOpenEffects.d.ts +4 -0
  296. package/shared/dropdownField/useFieldOpenEffects.js +4 -0
  297. package/shared/dropdownField/useListNavigation.d.ts +5 -0
  298. package/shared/dropdownField/useListNavigation.js +5 -0
  299. package/Alert/ai-documentation.md +0 -132
  300. package/Badge/ai-documentation.md +0 -155
  301. package/Banner/ai-documentation.md +0 -285
  302. package/Button/ai-documentation.md +0 -247
  303. package/CardMetric/ai-documentation.md +0 -277
  304. package/Checkbox/ai-documentation.md +0 -231
  305. package/Chip/ai-documentation.md +0 -281
  306. package/CodeEditor/ai-documentation.md +0 -350
  307. package/DateTimePicker/ai-documentation.md +0 -400
  308. package/Drawer/ai-documentation.md +0 -417
  309. package/EnhancedInput/ai-documentation.md +0 -352
  310. package/InputFile/ai-documentation.md +0 -420
  311. package/Modal/ai-documentation.md +0 -285
  312. package/PageHeader/ai-documentation.md +0 -511
  313. package/Pagination/ai-documentation.md +0 -509
  314. package/Popover/ai-documentation.md +0 -625
  315. package/ProgressBar/ai-documentation.md +0 -533
  316. package/Radio/ai-documentation.md +0 -243
  317. package/Select/ai-documentation.md +0 -374
  318. package/Skeleton/ai-documentation.md +0 -574
  319. package/Spinner/ai-documentation.md +0 -607
  320. package/Switch/ai-documentation.md +0 -312
  321. package/Tabs/ai-documentation.md +0 -475
  322. package/Toast/ai-documentation.md +0 -220
  323. package/Tooltip/ai-documentation.md +0 -340
  324. package/ai-documentation.md +0 -124
  325. package/native/ai-documentation.md +0 -485
@@ -1,607 +0,0 @@
1
- # Spinner Component - @pushwoosh/dumb-components
2
-
3
- ## Overview
4
-
5
- - **Component Name**: Spinner
6
- - **Import Path**: `@pushwoosh/dumb-components`
7
- - **Files**:
8
- - `/src/Spinner/Spinner.tsx` - Main component implementation
9
- - `/src/Spinner/types.ts` - TypeScript type definitions
10
- - `/src/Spinner/styles.ts` - Styled components and animations
11
- - `/src/Spinner/maps.ts` - Size mapping utilities
12
- - `/src/Spinner/assets/` - SVG icon assets
13
- - `/src/Spinner/index.ts` - Component exports
14
- - **Type**: Feedback/Loading
15
- - **Description**: A spinning loading indicator component available in small and medium sizes. Features smooth CSS animations and customizable colors to indicate loading or processing states.
16
-
17
- ## TypeScript Interfaces
18
-
19
- ```typescript
20
- export interface SpinnerProps {
21
- readonly boxRef?: Ref<HTMLDivElement>;
22
- readonly color?: string;
23
- readonly size: 'small' | 'medium';
24
- }
25
- ```
26
-
27
- ## Import & Usage
28
-
29
- ```typescript
30
- import { Spinner } from '@pushwoosh/dumb-components';
31
-
32
- // Basic usage
33
- function MyComponent() {
34
- const [isLoading, setIsLoading] = useState(false);
35
-
36
- const handleLoad = async () => {
37
- setIsLoading(true);
38
- try {
39
- await fetchData();
40
- } finally {
41
- setIsLoading(false);
42
- }
43
- };
44
-
45
- return (
46
- <div>
47
- <button onClick={handleLoad} disabled={isLoading}>
48
- {isLoading ? 'Loading...' : 'Load Data'}
49
- </button>
50
-
51
- {isLoading && (
52
- <div style={{ marginTop: '16px' }}>
53
- <Spinner size="medium" />
54
- </div>
55
- )}
56
- </div>
57
- );
58
- }
59
-
60
- // Different sizes
61
- function SpinnerSizes() {
62
- return (
63
- <div style={{ display: 'flex', gap: '16px', alignItems: 'center' }}>
64
- <div>
65
- <p>Small:</p>
66
- <Spinner size="small" />
67
- </div>
68
-
69
- <div>
70
- <p>Medium:</p>
71
- <Spinner size="medium" />
72
- </div>
73
- </div>
74
- );
75
- }
76
-
77
- // Custom colors
78
- function ColoredSpinners() {
79
- return (
80
- <div style={{ display: 'flex', gap: '16px' }}>
81
- <Spinner size="medium" color="#007bff" />
82
- <Spinner size="medium" color="#28a745" />
83
- <Spinner size="medium" color="#dc3545" />
84
- <Spinner size="medium" color="#ffc107" />
85
- </div>
86
- );
87
- }
88
- ```
89
-
90
- ## Advanced Examples
91
-
92
- ```typescript
93
- // Loading button
94
- function LoadingButton() {
95
- const [isLoading, setIsLoading] = useState(false);
96
-
97
- const handleClick = async () => {
98
- setIsLoading(true);
99
- try {
100
- await performAction();
101
- console.log('Action completed');
102
- } catch (error) {
103
- console.error('Action failed:', error);
104
- } finally {
105
- setIsLoading(false);
106
- }
107
- };
108
-
109
- return (
110
- <button
111
- onClick={handleClick}
112
- disabled={isLoading}
113
- style={{
114
- padding: '12px 20px',
115
- display: 'flex',
116
- alignItems: 'center',
117
- gap: '8px',
118
- backgroundColor: '#007bff',
119
- color: 'white',
120
- border: 'none',
121
- borderRadius: '4px',
122
- cursor: isLoading ? 'not-allowed' : 'pointer',
123
- opacity: isLoading ? 0.7 : 1,
124
- }}
125
- >
126
- {isLoading && <Spinner size="small" color="white" />}
127
- {isLoading ? 'Processing...' : 'Submit'}
128
- </button>
129
- );
130
- }
131
-
132
- // Loading overlay
133
- function LoadingOverlay({ isLoading, children }: { isLoading: boolean, children: React.ReactNode }) {
134
- return (
135
- <div style={{ position: 'relative' }}>
136
- {children}
137
-
138
- {isLoading && (
139
- <div
140
- style={{
141
- position: 'absolute',
142
- top: 0,
143
- left: 0,
144
- right: 0,
145
- bottom: 0,
146
- backgroundColor: 'rgba(255, 255, 255, 0.8)',
147
- display: 'flex',
148
- flexDirection: 'column',
149
- alignItems: 'center',
150
- justifyContent: 'center',
151
- gap: '16px',
152
- zIndex: 10,
153
- }}
154
- >
155
- <Spinner size="medium" color="#007bff" />
156
- <p style={{ margin: 0, color: '#666' }}>Loading...</p>
157
- </div>
158
- )}
159
- </div>
160
- );
161
- }
162
-
163
- // Usage with LoadingOverlay
164
- function DataTable() {
165
- const [data, setData] = useState([]);
166
- const [isLoading, setIsLoading] = useState(false);
167
-
168
- const loadData = async () => {
169
- setIsLoading(true);
170
- try {
171
- const result = await fetchTableData();
172
- setData(result);
173
- } catch (error) {
174
- console.error('Failed to load data:', error);
175
- } finally {
176
- setIsLoading(false);
177
- }
178
- };
179
-
180
- useEffect(() => {
181
- loadData();
182
- }, []);
183
-
184
- return (
185
- <LoadingOverlay isLoading={isLoading}>
186
- <table style={{ width: '100%', minHeight: '200px' }}>
187
- <thead>
188
- <tr>
189
- <th>ID</th>
190
- <th>Name</th>
191
- <th>Status</th>
192
- </tr>
193
- </thead>
194
- <tbody>
195
- {data.map(item => (
196
- <tr key={item.id}>
197
- <td>{item.id}</td>
198
- <td>{item.name}</td>
199
- <td>{item.status}</td>
200
- </tr>
201
- ))}
202
- </tbody>
203
- </table>
204
- </LoadingOverlay>
205
- );
206
- }
207
-
208
- // Conditional loading states
209
- function ConditionalLoading() {
210
- const [loadingStates, setLoadingStates] = useState({
211
- user: false,
212
- posts: false,
213
- comments: false,
214
- });
215
-
216
- const loadResource = async (resource: keyof typeof loadingStates) => {
217
- setLoadingStates(prev => ({ ...prev, [resource]: true }));
218
-
219
- try {
220
- // Simulate different loading times
221
- const delay = resource === 'user' ? 1000 : resource === 'posts' ? 2000 : 1500;
222
- await new Promise(resolve => setTimeout(resolve, delay));
223
-
224
- console.log(`${resource} loaded`);
225
- } catch (error) {
226
- console.error(`Failed to load ${resource}:`, error);
227
- } finally {
228
- setLoadingStates(prev => ({ ...prev, [resource]: false }));
229
- }
230
- };
231
-
232
- return (
233
- <div style={{ display: 'flex', flexDirection: 'column', gap: '16px' }}>
234
- <div style={{ display: 'flex', alignItems: 'center', gap: '12px' }}>
235
- <button
236
- onClick={() => loadResource('user')}
237
- disabled={loadingStates.user}
238
- >
239
- Load User
240
- </button>
241
- {loadingStates.user && <Spinner size="small" color="#007bff" />}
242
- </div>
243
-
244
- <div style={{ display: 'flex', alignItems: 'center', gap: '12px' }}>
245
- <button
246
- onClick={() => loadResource('posts')}
247
- disabled={loadingStates.posts}
248
- >
249
- Load Posts
250
- </button>
251
- {loadingStates.posts && <Spinner size="small" color="#28a745" />}
252
- </div>
253
-
254
- <div style={{ display: 'flex', alignItems: 'center', gap: '12px' }}>
255
- <button
256
- onClick={() => loadResource('comments')}
257
- disabled={loadingStates.comments}
258
- >
259
- Load Comments
260
- </button>
261
- {loadingStates.comments && <Spinner size="small" color="#ffc107" />}
262
- </div>
263
- </div>
264
- );
265
- }
266
-
267
- // Page loading spinner
268
- function PageLoader() {
269
- const [isPageLoading, setIsPageLoading] = useState(true);
270
-
271
- useEffect(() => {
272
- // Simulate page load
273
- const timer = setTimeout(() => {
274
- setIsPageLoading(false);
275
- }, 2000);
276
-
277
- return () => clearTimeout(timer);
278
- }, []);
279
-
280
- if (isPageLoading) {
281
- return (
282
- <div
283
- style={{
284
- position: 'fixed',
285
- top: 0,
286
- left: 0,
287
- right: 0,
288
- bottom: 0,
289
- backgroundColor: 'white',
290
- display: 'flex',
291
- flexDirection: 'column',
292
- alignItems: 'center',
293
- justifyContent: 'center',
294
- gap: '20px',
295
- zIndex: 9999,
296
- }}
297
- >
298
- <Spinner size="medium" color="#007bff" />
299
- <h2 style={{ margin: 0, color: '#333' }}>Loading Application...</h2>
300
- <p style={{ margin: 0, color: '#666' }}>Please wait while we set things up</p>
301
- </div>
302
- );
303
- }
304
-
305
- return (
306
- <div>
307
- <h1>Welcome to the Application!</h1>
308
- <p>The application has finished loading.</p>
309
- </div>
310
- );
311
- }
312
-
313
- // Inline loading states
314
- function InlineLoading() {
315
- const [sections, setSections] = useState({
316
- header: { loading: false, loaded: false },
317
- sidebar: { loading: false, loaded: false },
318
- content: { loading: false, loaded: false },
319
- });
320
-
321
- const loadSection = async (sectionName: keyof typeof sections) => {
322
- setSections(prev => ({
323
- ...prev,
324
- [sectionName]: { loading: true, loaded: false }
325
- }));
326
-
327
- try {
328
- await new Promise(resolve => setTimeout(resolve, 1500));
329
-
330
- setSections(prev => ({
331
- ...prev,
332
- [sectionName]: { loading: false, loaded: true }
333
- }));
334
- } catch (error) {
335
- setSections(prev => ({
336
- ...prev,
337
- [sectionName]: { loading: false, loaded: false }
338
- }));
339
- }
340
- };
341
-
342
- const renderSection = (name: keyof typeof sections, title: string) => {
343
- const section = sections[name];
344
-
345
- return (
346
- <div
347
- style={{
348
- padding: '20px',
349
- border: '1px solid #ddd',
350
- borderRadius: '4px',
351
- minHeight: '100px',
352
- display: 'flex',
353
- flexDirection: 'column',
354
- justifyContent: 'center',
355
- alignItems: 'center',
356
- }}
357
- >
358
- {!section.loaded && !section.loading && (
359
- <button onClick={() => loadSection(name)}>
360
- Load {title}
361
- </button>
362
- )}
363
-
364
- {section.loading && (
365
- <div style={{ display: 'flex', alignItems: 'center', gap: '12px' }}>
366
- <Spinner size="small" />
367
- <span>Loading {title.toLowerCase()}...</span>
368
- </div>
369
- )}
370
-
371
- {section.loaded && (
372
- <div>
373
- <h3>{title}</h3>
374
- <p>{title} content has been loaded successfully!</p>
375
- </div>
376
- )}
377
- </div>
378
- );
379
- };
380
-
381
- return (
382
- <div style={{ display: 'grid', gridTemplateColumns: '1fr 1fr', gap: '16px' }}>
383
- {renderSection('header', 'Header')}
384
- {renderSection('sidebar', 'Sidebar')}
385
- {renderSection('content', 'Content')}
386
- <div style={{ gridColumn: '1 / -1' }}>
387
- <button
388
- onClick={() => {
389
- Object.keys(sections).forEach(section => {
390
- loadSection(section as keyof typeof sections);
391
- });
392
- }}
393
- style={{
394
- padding: '12px 24px',
395
- backgroundColor: '#28a745',
396
- color: 'white',
397
- border: 'none',
398
- borderRadius: '4px',
399
- cursor: 'pointer',
400
- }}
401
- >
402
- Load All Sections
403
- </button>
404
- </div>
405
- </div>
406
- );
407
- }
408
-
409
- // Search with debounced loading
410
- function SearchWithSpinner() {
411
- const [query, setQuery] = useState('');
412
- const [results, setResults] = useState([]);
413
- const [isSearching, setIsSearching] = useState(false);
414
- const [debouncedQuery, setDebouncedQuery] = useState('');
415
-
416
- // Debounce the search query
417
- useEffect(() => {
418
- const timer = setTimeout(() => {
419
- setDebouncedQuery(query);
420
- }, 500);
421
-
422
- return () => clearTimeout(timer);
423
- }, [query]);
424
-
425
- // Perform search when debounced query changes
426
- useEffect(() => {
427
- if (debouncedQuery) {
428
- performSearch(debouncedQuery);
429
- } else {
430
- setResults([]);
431
- }
432
- }, [debouncedQuery]);
433
-
434
- const performSearch = async (searchQuery: string) => {
435
- setIsSearching(true);
436
-
437
- try {
438
- // Simulate search API call
439
- await new Promise(resolve => setTimeout(resolve, 1000));
440
-
441
- // Mock results
442
- const mockResults = [
443
- `Result 1 for "${searchQuery}"`,
444
- `Result 2 for "${searchQuery}"`,
445
- `Result 3 for "${searchQuery}"`,
446
- ];
447
-
448
- setResults(mockResults);
449
- } catch (error) {
450
- console.error('Search failed:', error);
451
- setResults([]);
452
- } finally {
453
- setIsSearching(false);
454
- }
455
- };
456
-
457
- return (
458
- <div>
459
- <div style={{ display: 'flex', alignItems: 'center', gap: '12px', marginBottom: '16px' }}>
460
- <input
461
- type="text"
462
- placeholder="Search..."
463
- value={query}
464
- onChange={(e) => setQuery(e.target.value)}
465
- style={{
466
- padding: '8px 12px',
467
- border: '1px solid #ddd',
468
- borderRadius: '4px',
469
- flex: 1,
470
- }}
471
- />
472
- {isSearching && <Spinner size="small" color="#007bff" />}
473
- </div>
474
-
475
- <div>
476
- {results.length > 0 ? (
477
- <div>
478
- <h4>Search Results:</h4>
479
- <ul>
480
- {results.map((result, index) => (
481
- <li key={index}>{result}</li>
482
- ))}
483
- </ul>
484
- </div>
485
- ) : query && !isSearching ? (
486
- <p>No results found for "{query}"</p>
487
- ) : null}
488
- </div>
489
- </div>
490
- );
491
- }
492
- ```
493
-
494
- ## Props Reference
495
-
496
- | Prop | Type | Default | Required | Description |
497
- |------|------|---------|----------|-------------|
498
- | `boxRef` | `Ref<HTMLDivElement>` | `undefined` | No | Ref for the spinner container element |
499
- | `color` | `string` | `undefined` | No | Custom color for the spinner |
500
- | `size` | `'small' \| 'medium'` | - | Yes | Size variant of the spinner |
501
-
502
- ## AI Agent Guidelines
503
-
504
- ### Recommended Patterns
505
-
506
- 1. **Size Selection**: Choose appropriate size for context
507
- ```typescript
508
- // Small for inline elements
509
- <Button disabled={loading}>
510
- {loading && <Spinner size="small" />}
511
- Submit
512
- </Button>
513
-
514
- // Medium for standalone loading states
515
- <div>
516
- <Spinner size="medium" />
517
- <p>Loading content...</p>
518
- </div>
519
- ```
520
-
521
- 2. **Color Consistency**: Match spinner colors to your theme
522
- ```typescript
523
- // Match brand colors
524
- <Spinner size="medium" color="#007bff" /> // Primary
525
- <Spinner size="medium" color="#28a745" /> // Success
526
- <Spinner size="medium" color="#dc3545" /> // Error
527
- ```
528
-
529
- 3. **Conditional Rendering**: Only show when actually loading
530
- ```typescript
531
- const [isLoading, setIsLoading] = useState(false);
532
-
533
- // Good - conditional rendering
534
- {isLoading && <Spinner size="medium" />}
535
-
536
- // Avoid - always rendered
537
- <Spinner size="medium" style={{ display: isLoading ? 'block' : 'none' }} />
538
- ```
539
-
540
- ### Common Mistakes to Avoid
541
-
542
- 1. **Missing Size Prop**: Always provide the required `size` prop
543
- 2. **Performance Issues**: Don't render multiple spinners unnecessarily
544
- 3. **Accessibility**: Provide appropriate ARIA labels for screen readers
545
- 4. **Overlapping Spinners**: Avoid multiple spinners in the same area
546
- 5. **Infinite Loading**: Always have a timeout or error handling for loading states
547
-
548
- ### Integration Tips
549
-
550
- 1. **Loading States**: Use with React state management
551
- ```typescript
552
- const [isLoading, setIsLoading] = useState(false);
553
-
554
- const handleAction = async () => {
555
- setIsLoading(true);
556
- try {
557
- await performAction();
558
- } finally {
559
- setIsLoading(false);
560
- }
561
- };
562
- ```
563
-
564
- 2. **Button Integration**: Common pattern for loading buttons
565
- ```typescript
566
- <button disabled={isLoading}>
567
- {isLoading && <Spinner size="small" color="white" />}
568
- {isLoading ? 'Loading...' : 'Click Me'}
569
- </button>
570
- ```
571
-
572
- 3. **Overlay Pattern**: For loading overlays
573
- ```typescript
574
- {isLoading && (
575
- <div style={{
576
- position: 'absolute',
577
- top: 0,
578
- left: 0,
579
- right: 0,
580
- bottom: 0,
581
- display: 'flex',
582
- alignItems: 'center',
583
- justifyContent: 'center',
584
- backgroundColor: 'rgba(255,255,255,0.8)'
585
- }}>
586
- <Spinner size="medium" />
587
- </div>
588
- )}
589
- ```
590
-
591
- 4. **Accessibility**: Include proper ARIA labels
592
- ```typescript
593
- <div role="status" aria-live="polite">
594
- <Spinner size="medium" />
595
- <span className="sr-only">Loading...</span>
596
- </div>
597
- ```
598
-
599
- 5. **Performance**: Use React.memo for components with spinners to prevent unnecessary re-renders
600
-
601
- ## Related Components
602
-
603
- - **Button**: Often used together for loading button states
604
- - **ProgressBar**: Alternative for progress indication
605
- - **Modal**: For loading dialogs
606
- - **Skeleton**: Alternative loading pattern for content placeholders
607
- - **Alert**: For loading completion notifications