@stack-spot/portal-components 2.27.0 → 2.27.2

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 (250) hide show
  1. package/CHANGELOG.md +635 -621
  2. package/dist/components/AnimatedHeight.d.ts +1 -1
  3. package/dist/components/AnimatedHeight.js +26 -26
  4. package/dist/components/AsyncContent.d.ts +1 -1
  5. package/dist/components/AsyncContent.js +1 -1
  6. package/dist/components/BannerWarning.d.ts +1 -1
  7. package/dist/components/BannerWarning.js +1 -1
  8. package/dist/components/Breadcrumb/index.d.ts +2 -2
  9. package/dist/components/Breadcrumb/index.js +1 -1
  10. package/dist/components/Breadcrumb/styled.js +31 -31
  11. package/dist/components/ButtonLoading.d.ts +1 -1
  12. package/dist/components/ButtonLoading.js +1 -1
  13. package/dist/components/ChatBot.d.ts +1 -1
  14. package/dist/components/ChatBot.js +1 -1
  15. package/dist/components/ContentValidateFilter.d.ts +1 -1
  16. package/dist/components/ContentValidateFilter.js +1 -1
  17. package/dist/components/FadingOverflow.d.ts +1 -1
  18. package/dist/components/FadingOverflow.js +69 -69
  19. package/dist/components/FileTreeView/More.d.ts +1 -1
  20. package/dist/components/FileTreeView/More.js +1 -1
  21. package/dist/components/FileTreeView/index.d.ts +1 -1
  22. package/dist/components/FileTreeView/index.js +1 -1
  23. package/dist/components/InfiniteScroll.d.ts +1 -1
  24. package/dist/components/InfiniteScroll.js +1 -1
  25. package/dist/components/InfoMaintenanceBanner.d.ts +1 -1
  26. package/dist/components/InfoMaintenanceBanner.js +2 -2
  27. package/dist/components/LazyMarkdown/BlockquoteMd.d.ts +1 -1
  28. package/dist/components/LazyMarkdown/BlockquoteMd.js +1 -1
  29. package/dist/components/LazyMarkdown/CodeViewer.d.ts +1 -1
  30. package/dist/components/LazyMarkdown/CodeViewer.js +76 -76
  31. package/dist/components/LazyMarkdown/Markdown.d.ts +1 -1
  32. package/dist/components/LazyMarkdown/Markdown.js +1 -1
  33. package/dist/components/LazyMarkdown/MarkdownButton.d.ts +1 -1
  34. package/dist/components/LazyMarkdown/MarkdownButton.js +1 -1
  35. package/dist/components/LazyMarkdown/Video.d.ts +1 -1
  36. package/dist/components/LazyMarkdown/Video.js +1 -1
  37. package/dist/components/LazyMarkdown/index.d.ts +1 -1
  38. package/dist/components/LazyMarkdown/index.js +1 -1
  39. package/dist/components/Placeholder.d.ts +7 -3
  40. package/dist/components/Placeholder.d.ts.map +1 -1
  41. package/dist/components/Placeholder.js +3 -3
  42. package/dist/components/Placeholder.js.map +1 -1
  43. package/dist/components/ScrollView.js +16 -16
  44. package/dist/components/Select/BadgeItem.d.ts +1 -1
  45. package/dist/components/Select/BadgeItem.js +1 -1
  46. package/dist/components/Select/ClearInput.d.ts +1 -1
  47. package/dist/components/Select/ClearInput.js +1 -1
  48. package/dist/components/Select/CloseItem.d.ts +1 -1
  49. package/dist/components/Select/CloseItem.js +1 -1
  50. package/dist/components/Select/CreatableSelect.js +1 -1
  51. package/dist/components/Select/CustomMenu.d.ts +1 -1
  52. package/dist/components/Select/CustomMenu.js +1 -1
  53. package/dist/components/Select/LabelItem.d.ts +1 -1
  54. package/dist/components/Select/LabelItem.js +1 -1
  55. package/dist/components/Select/MultiValue.d.ts +1 -1
  56. package/dist/components/Select/MultiValue.js +1 -1
  57. package/dist/components/Select/SelectInfiniteScroll.d.ts +1 -1
  58. package/dist/components/Select/SelectInfiniteScroll.js +1 -1
  59. package/dist/components/Select/SelectSearch.d.ts +1 -1
  60. package/dist/components/Select/SelectSearch.js +1 -1
  61. package/dist/components/SelectionList.d.ts +1 -1
  62. package/dist/components/SelectionList.js +61 -61
  63. package/dist/components/StatusCircle.d.ts +1 -1
  64. package/dist/components/StatusCircle.js +6 -6
  65. package/dist/components/Stepper/Navigation.js +4 -4
  66. package/dist/components/Stepper/Step.js +3 -3
  67. package/dist/components/Stepper/Stepper.js +6 -6
  68. package/dist/components/Stepper/headers.js +22 -22
  69. package/dist/components/Table/HeaderItem.js +1 -1
  70. package/dist/components/Table/SettingsVerticalMenu.d.ts +1 -1
  71. package/dist/components/Table/SettingsVerticalMenu.js +1 -1
  72. package/dist/components/Table/StyledLinkTable.d.ts +1 -1
  73. package/dist/components/Table/StyledLinkTable.js +5 -5
  74. package/dist/components/Table/TableData.d.ts +1 -1
  75. package/dist/components/Table/TableData.js +25 -25
  76. package/dist/components/TimelineSection.d.ts +1 -1
  77. package/dist/components/TimelineSection.js +14 -14
  78. package/dist/components/error/ErrorFeedback.d.ts +1 -1
  79. package/dist/components/error/ErrorFeedback.js +35 -35
  80. package/dist/components/error/NotFound.d.ts +1 -1
  81. package/dist/components/error/NotFound.js +1 -1
  82. package/dist/components/error/UnderMaintenance.d.ts +1 -1
  83. package/dist/components/error/UnderMaintenance.js +1 -1
  84. package/dist/components/form/Form/Form.d.ts +1 -1
  85. package/dist/components/form/Form/Form.js +1 -1
  86. package/dist/components/form/Form/FormGroup.d.ts +2 -2
  87. package/dist/components/form/Form/FormGroup.js +1 -1
  88. package/dist/components/form/SearchInput.d.ts +1 -1
  89. package/dist/components/form/SearchInput.js +1 -1
  90. package/dist/components/form/Select/CustomSelect.d.ts +1 -1
  91. package/dist/components/form/Select/CustomSelect.js +1 -1
  92. package/dist/components/form/Select/DetailedSelect.d.ts +1 -1
  93. package/dist/components/form/Select/DetailedSelect.js +1 -1
  94. package/dist/components/form/Select/Select.d.ts +1 -1
  95. package/dist/components/form/Select/Select.js +1 -1
  96. package/dist/components/form/Select/styled.js +161 -161
  97. package/dist/components/form/Select/utils.js +1 -1
  98. package/dist/components/notification/NotificationComponent.d.ts +1 -1
  99. package/dist/components/notification/NotificationComponent.js +54 -54
  100. package/dist/components/notification/NotificationItem.d.ts +1 -1
  101. package/dist/components/notification/NotificationItem.d.ts.map +1 -1
  102. package/dist/components/notification/NotificationItem.js +11 -5
  103. package/dist/components/notification/NotificationItem.js.map +1 -1
  104. package/dist/components/notification/NotificationList.d.ts +1 -1
  105. package/dist/components/notification/NotificationList.d.ts.map +1 -1
  106. package/dist/components/notification/NotificationList.js +44 -44
  107. package/dist/components/notification/NotificationList.js.map +1 -1
  108. package/dist/components/notification/NotificationPlaceholder.d.ts +1 -1
  109. package/dist/components/notification/NotificationPlaceholder.d.ts.map +1 -1
  110. package/dist/components/notification/NotificationPlaceholder.js +2 -2
  111. package/dist/components/notification/NotificationPlaceholder.js.map +1 -1
  112. package/dist/containers/NotificationsPage.d.ts +1 -1
  113. package/dist/containers/NotificationsPage.d.ts.map +1 -1
  114. package/dist/containers/NotificationsPage.js +24 -11
  115. package/dist/containers/NotificationsPage.js.map +1 -1
  116. package/dist/context/anchor.d.ts +1 -1
  117. package/dist/context/anchor.js +1 -1
  118. package/dist/context/loading.d.ts +1 -1
  119. package/dist/context/loading.js +1 -1
  120. package/dist/context/notification/context.d.ts +1 -1
  121. package/dist/context/notification/context.js +1 -1
  122. package/dist/context/notification/types.d.ts +1 -0
  123. package/dist/context/notification/types.d.ts.map +1 -1
  124. package/dist/hooks/date.js +1 -1
  125. package/dist/hooks/service-now.js +28 -28
  126. package/dist/svg/AI.d.ts +1 -1
  127. package/dist/svg/AI.js +1 -1
  128. package/dist/svg/CS.d.ts +1 -1
  129. package/dist/svg/CS.js +1 -1
  130. package/dist/svg/EDP.d.ts +1 -1
  131. package/dist/svg/EDP.js +1 -1
  132. package/dist/svg/Forbidden.d.ts +1 -1
  133. package/dist/svg/Forbidden.js +1 -1
  134. package/dist/svg/GenericPlaceholder.d.ts +4 -2
  135. package/dist/svg/GenericPlaceholder.d.ts.map +1 -1
  136. package/dist/svg/GenericPlaceholder.js +2 -2
  137. package/dist/svg/GenericPlaceholder.js.map +1 -1
  138. package/dist/svg/HUB.d.ts +1 -1
  139. package/dist/svg/HUB.js +1 -1
  140. package/dist/svg/Logo.d.ts +1 -1
  141. package/dist/svg/Logo.js +1 -1
  142. package/dist/svg/MiniLogo.d.ts +1 -1
  143. package/dist/svg/MiniLogo.js +1 -1
  144. package/dist/svg/NotFound.d.ts +1 -1
  145. package/dist/svg/NotFound.js +1 -1
  146. package/dist/svg/ServerError.d.ts +1 -1
  147. package/dist/svg/ServerError.js +1 -1
  148. package/dist/svg/Unauthenticated.d.ts +1 -1
  149. package/dist/svg/Unauthenticated.js +1 -1
  150. package/package.json +6 -6
  151. package/readme.md +66 -66
  152. package/src/components/AnimatedHeight.tsx +174 -174
  153. package/src/components/AsyncContent.tsx +78 -78
  154. package/src/components/BannerWarning.tsx +91 -91
  155. package/src/components/Breadcrumb/index.tsx +76 -76
  156. package/src/components/Breadcrumb/styled.ts +37 -37
  157. package/src/components/ButtonLoading.tsx +29 -29
  158. package/src/components/ChatBot.tsx +82 -82
  159. package/src/components/ContentValidateFilter.tsx +15 -15
  160. package/src/components/FadingOverflow.tsx +265 -265
  161. package/src/components/FileTreeView/More.tsx +114 -114
  162. package/src/components/FileTreeView/index.tsx +186 -186
  163. package/src/components/InfiniteScroll.tsx +24 -24
  164. package/src/components/InfoMaintenanceBanner.tsx +29 -29
  165. package/src/components/LazyMarkdown/BlockquoteMd.tsx +107 -107
  166. package/src/components/LazyMarkdown/CodeViewer.tsx +161 -161
  167. package/src/components/LazyMarkdown/Markdown.tsx +122 -122
  168. package/src/components/LazyMarkdown/MarkdownButton.tsx +24 -24
  169. package/src/components/LazyMarkdown/Video.tsx +13 -13
  170. package/src/components/LazyMarkdown/index.tsx +21 -21
  171. package/src/components/Placeholder.tsx +123 -118
  172. package/src/components/ScrollView.tsx +57 -57
  173. package/src/components/Select/BadgeItem.tsx +58 -58
  174. package/src/components/Select/ClearInput.tsx +24 -24
  175. package/src/components/Select/CloseItem.tsx +38 -38
  176. package/src/components/Select/CreatableSelect.tsx +155 -155
  177. package/src/components/Select/CustomMenu.tsx +16 -16
  178. package/src/components/Select/LabelItem.tsx +8 -8
  179. package/src/components/Select/MultiValue.tsx +49 -49
  180. package/src/components/Select/SelectInfiniteScroll.tsx +82 -82
  181. package/src/components/Select/SelectSearch.tsx +195 -195
  182. package/src/components/Select/index.tsx +7 -7
  183. package/src/components/Select/types.ts +8 -8
  184. package/src/components/SelectionList.tsx +427 -427
  185. package/src/components/StatusCircle.tsx +67 -67
  186. package/src/components/Stepper/Navigation.tsx +97 -97
  187. package/src/components/Stepper/Step.tsx +30 -30
  188. package/src/components/Stepper/Stepper.tsx +113 -113
  189. package/src/components/Stepper/headers.tsx +64 -64
  190. package/src/components/Stepper/index.ts +3 -3
  191. package/src/components/Table/HeaderItem.tsx +52 -52
  192. package/src/components/Table/SettingsVerticalMenu.tsx +50 -50
  193. package/src/components/Table/StyledLinkTable.tsx +22 -22
  194. package/src/components/Table/TableData.tsx +251 -251
  195. package/src/components/Table/index.tsx +2 -2
  196. package/src/components/TimelineSection.tsx +66 -66
  197. package/src/components/error/ErrorFeedback.tsx +217 -217
  198. package/src/components/error/NotFound.tsx +24 -24
  199. package/src/components/error/UnderMaintenance.tsx +30 -30
  200. package/src/components/error/index.ts +4 -4
  201. package/src/components/form/Form/Form.tsx +101 -101
  202. package/src/components/form/Form/FormGroup.tsx +221 -221
  203. package/src/components/form/Form/index.ts +2 -2
  204. package/src/components/form/SearchInput.tsx +69 -69
  205. package/src/components/form/Select/CustomSelect.tsx +232 -232
  206. package/src/components/form/Select/DetailedSelect.tsx +85 -85
  207. package/src/components/form/Select/Select.tsx +67 -67
  208. package/src/components/form/Select/index.ts +4 -4
  209. package/src/components/form/Select/styled.ts +165 -165
  210. package/src/components/form/Select/types.ts +112 -112
  211. package/src/components/form/Select/utils.tsx +28 -28
  212. package/src/components/notification/NotificationComponent.tsx +340 -340
  213. package/src/components/notification/NotificationItem.tsx +345 -336
  214. package/src/components/notification/NotificationList.tsx +179 -178
  215. package/src/components/notification/NotificationPlaceholder.tsx +44 -43
  216. package/src/components/notification/types.ts +72 -72
  217. package/src/containers/NotificationsPage.tsx +119 -98
  218. package/src/context/anchor.tsx +37 -37
  219. package/src/context/loading.tsx +36 -36
  220. package/src/context/notification/LazyNotificationList.ts +103 -103
  221. package/src/context/notification/NotificationController.ts +104 -104
  222. package/src/context/notification/context.tsx +23 -23
  223. package/src/context/notification/hooks.ts +98 -98
  224. package/src/context/notification/types.ts +66 -65
  225. package/src/hooks/date.ts +31 -31
  226. package/src/hooks/keyboard.tsx +128 -128
  227. package/src/hooks/manual-render.tsx +10 -10
  228. package/src/hooks/service-now.tsx +233 -233
  229. package/src/hooks/text.tsx +30 -30
  230. package/src/hooks/title.tsx +28 -28
  231. package/src/hooks/use-effect-once.tsx +43 -43
  232. package/src/index.ts +19 -19
  233. package/src/notifications.ts +11 -11
  234. package/src/svg/AI.tsx +41 -41
  235. package/src/svg/CS.tsx +48 -48
  236. package/src/svg/EDP.tsx +31 -31
  237. package/src/svg/Forbidden.tsx +22 -22
  238. package/src/svg/GenericPlaceholder.tsx +20 -20
  239. package/src/svg/HUB.tsx +48 -48
  240. package/src/svg/Logo.tsx +16 -16
  241. package/src/svg/MiniLogo.tsx +12 -12
  242. package/src/svg/NotFound.tsx +16 -16
  243. package/src/svg/ServerError.tsx +33 -33
  244. package/src/svg/Unauthenticated.tsx +16 -16
  245. package/src/svg/index.ts +11 -11
  246. package/src/utils/accessibility.ts +135 -135
  247. package/src/utils/cookie.ts +73 -73
  248. package/src/utils/promise.ts +5 -5
  249. package/src/utils/read-file.ts +16 -16
  250. package/tsconfig.json +10 -10
@@ -1,78 +1,78 @@
1
- import { Flex } from '@citric/core'
2
- import { LoadingCircular } from '@citric/ui'
3
- import { MutableRefObject, useEffect, useLayoutEffect } from 'react'
4
-
5
- export interface ErrorProps {
6
- /**
7
- * The error component to be rendered in case of error. It should receive error props
8
- */
9
- errorComponent: React.FC<{ error: any }>,
10
- /**
11
- * The function to report the error.
12
- */
13
- reportError: (error: any) => void,
14
- }
15
-
16
- interface Props {
17
- /**
18
- * Whether or not to show the loading feedback.
19
- */
20
- loading: boolean,
21
- /**
22
- * A javascript error. Used to show error feedbacks.
23
- */
24
- error?: any,
25
- /**
26
- * If provided, this element will receive focus as soon as the content is loaded and has no errors.
27
- * Can be either a React Ref Object or a query selector.
28
- */
29
- autofocus?: string | MutableRefObject<HTMLElement>,
30
- /**
31
- * The content to show if it's not loading or has errors.
32
- */
33
- children: React.ReactNode,
34
- /**
35
- * The error details component.
36
- */
37
- errorDetails: ErrorProps,
38
- }
39
-
40
- /**
41
- * Renders a component that provides user feedback on async requests.
42
- * It renders either a loading component, an error component (which is received as prop)
43
- * or the received children props.
44
- *
45
- * @param options the props for rendering the component: {@link Props}.
46
- */
47
-
48
- export const AsyncContent = ({ loading, error, autofocus, children, errorDetails }: Props) => {
49
- const ErrorComponent = errorDetails.errorComponent
50
-
51
- useEffect(() => {
52
- if (error) {
53
- errorDetails.reportError(error)
54
- // eslint-disable-next-line no-console
55
- console.error(error)
56
- }
57
- }, [error])
58
-
59
- useLayoutEffect(() => {
60
- if (!loading && !error) {
61
- typeof autofocus === 'string' ? (document.querySelector(autofocus) as HTMLElement)?.focus?.() : autofocus?.current?.focus()
62
- }
63
- }, [loading, error])
64
-
65
- if (loading) {
66
- return (
67
- <Flex alignItems="center" justifyContent="center" flex={1} style={{ padding: '80px' }} data-test-hint="loading">
68
- <LoadingCircular />
69
- </Flex>
70
- )
71
- }
72
-
73
- if (error) {
74
- return <ErrorComponent error={error} />
75
- }
76
-
77
- return children
78
- }
1
+ import { Flex } from '@citric/core'
2
+ import { LoadingCircular } from '@citric/ui'
3
+ import { MutableRefObject, useEffect, useLayoutEffect } from 'react'
4
+
5
+ export interface ErrorProps {
6
+ /**
7
+ * The error component to be rendered in case of error. It should receive error props
8
+ */
9
+ errorComponent: React.FC<{ error: any }>,
10
+ /**
11
+ * The function to report the error.
12
+ */
13
+ reportError: (error: any) => void,
14
+ }
15
+
16
+ interface Props {
17
+ /**
18
+ * Whether or not to show the loading feedback.
19
+ */
20
+ loading: boolean,
21
+ /**
22
+ * A javascript error. Used to show error feedbacks.
23
+ */
24
+ error?: any,
25
+ /**
26
+ * If provided, this element will receive focus as soon as the content is loaded and has no errors.
27
+ * Can be either a React Ref Object or a query selector.
28
+ */
29
+ autofocus?: string | MutableRefObject<HTMLElement>,
30
+ /**
31
+ * The content to show if it's not loading or has errors.
32
+ */
33
+ children: React.ReactNode,
34
+ /**
35
+ * The error details component.
36
+ */
37
+ errorDetails: ErrorProps,
38
+ }
39
+
40
+ /**
41
+ * Renders a component that provides user feedback on async requests.
42
+ * It renders either a loading component, an error component (which is received as prop)
43
+ * or the received children props.
44
+ *
45
+ * @param options the props for rendering the component: {@link Props}.
46
+ */
47
+
48
+ export const AsyncContent = ({ loading, error, autofocus, children, errorDetails }: Props) => {
49
+ const ErrorComponent = errorDetails.errorComponent
50
+
51
+ useEffect(() => {
52
+ if (error) {
53
+ errorDetails.reportError(error)
54
+ // eslint-disable-next-line no-console
55
+ console.error(error)
56
+ }
57
+ }, [error])
58
+
59
+ useLayoutEffect(() => {
60
+ if (!loading && !error) {
61
+ typeof autofocus === 'string' ? (document.querySelector(autofocus) as HTMLElement)?.focus?.() : autofocus?.current?.focus()
62
+ }
63
+ }, [loading, error])
64
+
65
+ if (loading) {
66
+ return (
67
+ <Flex alignItems="center" justifyContent="center" flex={1} style={{ padding: '80px' }} data-test-hint="loading">
68
+ <LoadingCircular />
69
+ </Flex>
70
+ )
71
+ }
72
+
73
+ if (error) {
74
+ return <ErrorComponent error={error} />
75
+ }
76
+
77
+ return children
78
+ }
@@ -1,91 +1,91 @@
1
-
2
- import { Button, Flex, IconBox, SxProp, Text } from '@citric/core'
3
- import { ExclamationTriangle, TimesCircleFill } from '@citric/icons'
4
- import { Alert } from '@citric/ui'
5
- import { useState } from 'react'
6
- import { getCookie, setCookie } from '../utils/cookie'
7
-
8
- /**
9
- * A styled and dismissible alert box for showing important warnings for the user.
10
- *
11
- * This renders a yellow box with an exclamation icon. The content passed as parameter is placed on the right of the icon.
12
- * @param props an object containing the content (children) to show inside the alert box.
13
- */
14
- export const BannerWarning = ({ children, showCloseButton = true }:
15
- { children: React.ReactNode, sx?: SxProp, showCloseButton?: boolean }) => {
16
- const bannerKey = 'bannerClosed'
17
-
18
- const [isVisible, setIsVisible] = useState(() => {
19
- if (typeof window !== 'undefined') {
20
- const isBannerClosed = getCookie(bannerKey) === 'true'
21
- return !isBannerClosed
22
- }
23
- return false
24
- })
25
-
26
- const handleClose = () => {
27
- setCookie(bannerKey, 'true')
28
- setIsVisible(false)
29
- }
30
-
31
- if (!isVisible) {
32
- return null
33
- }
34
-
35
- return (
36
- <Flex sx={{ zIndex: '1', w: '12', mb: 7 }}>
37
- <Alert
38
- colorScheme="warning"
39
- sx={{
40
- position: 'relative',
41
- px: 3,
42
- py: 1,
43
- alignItems: 'center',
44
- display: 'flex',
45
- justifyContent: 'space-between',
46
- height: 'auto',
47
- padding: `${showCloseButton ? '0.5rem' : '1rem'}`,
48
- }}
49
- >
50
- <Flex
51
- sx={{
52
- alignItems: 'center',
53
- flexWrap: 'nowrap',
54
- }}
55
- >
56
- <IconBox
57
- size="sm"
58
- colorIcon="light.500"
59
- >
60
- <ExclamationTriangle />
61
- </IconBox>
62
- <Text
63
- sx={{
64
- ml: 5,
65
- }}
66
- appearance="body2"
67
- colorScheme="warning.contrastText"
68
- >
69
- {children}
70
- </Text>
71
- </Flex>
72
-
73
- {showCloseButton && <Button
74
- appearance={'text'}
75
- onClick={handleClose}
76
- sx={{
77
- p: 0,
78
- ml: 2,
79
- }}
80
- >
81
- <IconBox
82
- size="lg"
83
- colorIcon="light.500"
84
- >
85
- <TimesCircleFill />
86
- </IconBox>
87
- </Button>}
88
- </Alert>
89
- </Flex>
90
- )
91
- }
1
+
2
+ import { Button, Flex, IconBox, SxProp, Text } from '@citric/core'
3
+ import { ExclamationTriangle, TimesCircleFill } from '@citric/icons'
4
+ import { Alert } from '@citric/ui'
5
+ import { useState } from 'react'
6
+ import { getCookie, setCookie } from '../utils/cookie'
7
+
8
+ /**
9
+ * A styled and dismissible alert box for showing important warnings for the user.
10
+ *
11
+ * This renders a yellow box with an exclamation icon. The content passed as parameter is placed on the right of the icon.
12
+ * @param props an object containing the content (children) to show inside the alert box.
13
+ */
14
+ export const BannerWarning = ({ children, showCloseButton = true }:
15
+ { children: React.ReactNode, sx?: SxProp, showCloseButton?: boolean }) => {
16
+ const bannerKey = 'bannerClosed'
17
+
18
+ const [isVisible, setIsVisible] = useState(() => {
19
+ if (typeof window !== 'undefined') {
20
+ const isBannerClosed = getCookie(bannerKey) === 'true'
21
+ return !isBannerClosed
22
+ }
23
+ return false
24
+ })
25
+
26
+ const handleClose = () => {
27
+ setCookie(bannerKey, 'true')
28
+ setIsVisible(false)
29
+ }
30
+
31
+ if (!isVisible) {
32
+ return null
33
+ }
34
+
35
+ return (
36
+ <Flex sx={{ zIndex: '1', w: '12', mb: 7 }}>
37
+ <Alert
38
+ colorScheme="warning"
39
+ sx={{
40
+ position: 'relative',
41
+ px: 3,
42
+ py: 1,
43
+ alignItems: 'center',
44
+ display: 'flex',
45
+ justifyContent: 'space-between',
46
+ height: 'auto',
47
+ padding: `${showCloseButton ? '0.5rem' : '1rem'}`,
48
+ }}
49
+ >
50
+ <Flex
51
+ sx={{
52
+ alignItems: 'center',
53
+ flexWrap: 'nowrap',
54
+ }}
55
+ >
56
+ <IconBox
57
+ size="sm"
58
+ colorIcon="light.500"
59
+ >
60
+ <ExclamationTriangle />
61
+ </IconBox>
62
+ <Text
63
+ sx={{
64
+ ml: 5,
65
+ }}
66
+ appearance="body2"
67
+ colorScheme="warning.contrastText"
68
+ >
69
+ {children}
70
+ </Text>
71
+ </Flex>
72
+
73
+ {showCloseButton && <Button
74
+ appearance={'text'}
75
+ onClick={handleClose}
76
+ sx={{
77
+ p: 0,
78
+ ml: 2,
79
+ }}
80
+ >
81
+ <IconBox
82
+ size="lg"
83
+ colorIcon="light.500"
84
+ >
85
+ <TimesCircleFill />
86
+ </IconBox>
87
+ </Button>}
88
+ </Alert>
89
+ </Flex>
90
+ )
91
+ }
@@ -1,76 +1,76 @@
1
- import { Text } from '@citric/core'
2
- import { Skeleton } from '@citric/ui'
3
- import { last } from 'lodash'
4
- import { useEffect, useMemo } from 'react'
5
- import { useAnchorTag } from '../../context/anchor'
6
- import { titleEffect } from '../../hooks/title'
7
- import { Box } from './styled'
8
-
9
- export type AnchorComponent = (props: React.AnchorHTMLAttributes<HTMLAnchorElement>) => React.ReactElement
10
-
11
- interface BreadcrumbItem {
12
- /**
13
- * A unique id for this link of the breadcrumb. If not provided, the label will be used.
14
- */
15
- key?: string,
16
- /**
17
- * Label for this route in the breadcrumb.
18
- */
19
- label: string,
20
- /**
21
- * If this route is accessible, the link to it.
22
- */
23
- href?: string,
24
- }
25
-
26
- interface Props {
27
- /**
28
- * The items to show.
29
- */
30
- items: BreadcrumbItem[],
31
- /**
32
- * When true, a loading feedback (skeleton) will show instead of the list.
33
- */
34
- isLoading?: boolean,
35
- /**
36
- * If set to true, after mounted, as soon as loading is false, the page title will be prepended with `$name - `, where `$name` is the
37
- * label of the last item in `items`.
38
- *
39
- * When unmounted, the title will go back to the previous value.
40
- *
41
- * @default false
42
- */
43
- shouldUpdatePageTitle?: boolean,
44
- /**
45
- * Key of the current page. If an item has this key, it won't be rendered as a link and will be marked as active.
46
- */
47
- currentPageKey?: string,
48
- }
49
-
50
- interface ItemProps extends Pick<Props, 'currentPageKey'> {
51
- item: BreadcrumbItem,
52
- }
53
-
54
- const BreadcrumbItem = ({ item: { label, href, key }, currentPageKey }: ItemProps) => {
55
- const text = <Text appearance="breadcrumb">{label}</Text>
56
- const Link = useAnchorTag()
57
- const shouldBeLink = href && currentPageKey != key
58
- return <li>{shouldBeLink ? <Link href={href}>{text}</Link> : text}</li>
59
- }
60
-
61
- /**
62
- * Builds a breadcrumb navigator based on the items passed in the properties.
63
- *
64
- * If the breadcrumb is obtained asynchronously, pass `isLoading = true` in order to show a loading feedback.
65
- */
66
- export const BreadcrumbList = ({ items, isLoading, shouldUpdatePageTitle, currentPageKey }: Props) => {
67
- const listItems = useMemo(
68
- () => items.map(item => <BreadcrumbItem key={item.key || item.label} item={item} currentPageKey={currentPageKey} />),
69
- [items],
70
- )
71
- useEffect(() => {
72
- const title = last(items)?.label
73
- if (shouldUpdatePageTitle && title && !isLoading) return titleEffect(title)
74
- }, [items, isLoading])
75
- return <Box>{isLoading ? <Skeleton height="21px" /> : <ul>{listItems}</ul>}</Box>
76
- }
1
+ import { Text } from '@citric/core'
2
+ import { Skeleton } from '@citric/ui'
3
+ import { last } from 'lodash'
4
+ import { useEffect, useMemo } from 'react'
5
+ import { useAnchorTag } from '../../context/anchor'
6
+ import { titleEffect } from '../../hooks/title'
7
+ import { Box } from './styled'
8
+
9
+ export type AnchorComponent = (props: React.AnchorHTMLAttributes<HTMLAnchorElement>) => React.ReactElement
10
+
11
+ interface BreadcrumbItem {
12
+ /**
13
+ * A unique id for this link of the breadcrumb. If not provided, the label will be used.
14
+ */
15
+ key?: string,
16
+ /**
17
+ * Label for this route in the breadcrumb.
18
+ */
19
+ label: string,
20
+ /**
21
+ * If this route is accessible, the link to it.
22
+ */
23
+ href?: string,
24
+ }
25
+
26
+ interface Props {
27
+ /**
28
+ * The items to show.
29
+ */
30
+ items: BreadcrumbItem[],
31
+ /**
32
+ * When true, a loading feedback (skeleton) will show instead of the list.
33
+ */
34
+ isLoading?: boolean,
35
+ /**
36
+ * If set to true, after mounted, as soon as loading is false, the page title will be prepended with `$name - `, where `$name` is the
37
+ * label of the last item in `items`.
38
+ *
39
+ * When unmounted, the title will go back to the previous value.
40
+ *
41
+ * @default false
42
+ */
43
+ shouldUpdatePageTitle?: boolean,
44
+ /**
45
+ * Key of the current page. If an item has this key, it won't be rendered as a link and will be marked as active.
46
+ */
47
+ currentPageKey?: string,
48
+ }
49
+
50
+ interface ItemProps extends Pick<Props, 'currentPageKey'> {
51
+ item: BreadcrumbItem,
52
+ }
53
+
54
+ const BreadcrumbItem = ({ item: { label, href, key }, currentPageKey }: ItemProps) => {
55
+ const text = <Text appearance="breadcrumb">{label}</Text>
56
+ const Link = useAnchorTag()
57
+ const shouldBeLink = href && currentPageKey != key
58
+ return <li>{shouldBeLink ? <Link href={href}>{text}</Link> : text}</li>
59
+ }
60
+
61
+ /**
62
+ * Builds a breadcrumb navigator based on the items passed in the properties.
63
+ *
64
+ * If the breadcrumb is obtained asynchronously, pass `isLoading = true` in order to show a loading feedback.
65
+ */
66
+ export const BreadcrumbList = ({ items, isLoading, shouldUpdatePageTitle, currentPageKey }: Props) => {
67
+ const listItems = useMemo(
68
+ () => items.map(item => <BreadcrumbItem key={item.key || item.label} item={item} currentPageKey={currentPageKey} />),
69
+ [items],
70
+ )
71
+ useEffect(() => {
72
+ const title = last(items)?.label
73
+ if (shouldUpdatePageTitle && title && !isLoading) return titleEffect(title)
74
+ }, [items, isLoading])
75
+ return <Box>{isLoading ? <Skeleton height="21px" /> : <ul>{listItems}</ul>}</Box>
76
+ }
@@ -1,37 +1,37 @@
1
- import { getFontAppearance } from '@citric/core/dist/utils/theme'
2
- import { theme } from '@stack-spot/portal-theme'
3
- import { styled } from 'styled-components'
4
-
5
- // the type below should be inferred, but a bug in TS+PNPM prevents it: https://github.com/microsoft/TypeScript/issues/42873
6
- export const Box: React.FC<React.DetailedHTMLProps<React.HTMLAttributes<HTMLElement>, HTMLElement>> = styled.nav`
7
- margin-bottom: 24px;
8
-
9
- ul {
10
- display: flex;
11
- flex-direction: row;
12
- }
13
-
14
- li {
15
- display: flex;
16
- flex-direction: row;
17
-
18
- &:before {
19
- content: '/';
20
- font: ${({ theme }) => getFontAppearance(theme as any, 'breadcrumb') as any};
21
- margin: 0 10px;
22
- color: ${theme.color.light['700']};
23
- }
24
-
25
- &:first-child:before {
26
- content: none;
27
- }
28
- }
29
-
30
- a {
31
- color: ${theme.color.light['700']};
32
- &:hover {
33
- text-decoration: underline;
34
- color: ${theme.color.light.contrastText};
35
- }
36
- }
37
- `
1
+ import { getFontAppearance } from '@citric/core/dist/utils/theme'
2
+ import { theme } from '@stack-spot/portal-theme'
3
+ import { styled } from 'styled-components'
4
+
5
+ // the type below should be inferred, but a bug in TS+PNPM prevents it: https://github.com/microsoft/TypeScript/issues/42873
6
+ export const Box: React.FC<React.DetailedHTMLProps<React.HTMLAttributes<HTMLElement>, HTMLElement>> = styled.nav`
7
+ margin-bottom: 24px;
8
+
9
+ ul {
10
+ display: flex;
11
+ flex-direction: row;
12
+ }
13
+
14
+ li {
15
+ display: flex;
16
+ flex-direction: row;
17
+
18
+ &:before {
19
+ content: '/';
20
+ font: ${({ theme }) => getFontAppearance(theme as any, 'breadcrumb') as any};
21
+ margin: 0 10px;
22
+ color: ${theme.color.light['700']};
23
+ }
24
+
25
+ &:first-child:before {
26
+ content: none;
27
+ }
28
+ }
29
+
30
+ a {
31
+ color: ${theme.color.light['700']};
32
+ &:hover {
33
+ text-decoration: underline;
34
+ color: ${theme.color.light.contrastText};
35
+ }
36
+ }
37
+ `
@@ -1,29 +1,29 @@
1
- import { Button, Text } from '@citric/core'
2
- import { ButtonProps } from '@citric/core/dist/Button'
3
- import { LoadingCircular } from '@citric/ui'
4
- import { ReactNode } from 'react'
5
-
6
- interface Props extends ButtonProps {
7
- isLoading?: boolean,
8
- loadingSize?: 'sm' | 'md' | 'lg',
9
- children: ReactNode,
10
- onClick?: () => void,
11
- }
12
-
13
- export const ButtonLoading = ({ isLoading, loadingSize = 'sm', children, disabled, sx, ...props }: Props) => (
14
- <Button
15
- type="submit"
16
- {...props}
17
- disabled={isLoading || disabled}
18
- sx={{ ...sx, position: 'relative' }}
19
- >
20
- <Text as="span" sx={{ visibility: isLoading ? 'hidden' : 'visible' }}>
21
- {children}
22
- </Text>
23
- <LoadingCircular
24
- colorScheme={props.colorScheme}
25
- size={loadingSize}
26
- sx={{ visibility: isLoading ? 'visible' : 'hidden', position: 'absolute' }}
27
- />
28
- </Button>
29
- )
1
+ import { Button, Text } from '@citric/core'
2
+ import { ButtonProps } from '@citric/core/dist/Button'
3
+ import { LoadingCircular } from '@citric/ui'
4
+ import { ReactNode } from 'react'
5
+
6
+ interface Props extends ButtonProps {
7
+ isLoading?: boolean,
8
+ loadingSize?: 'sm' | 'md' | 'lg',
9
+ children: ReactNode,
10
+ onClick?: () => void,
11
+ }
12
+
13
+ export const ButtonLoading = ({ isLoading, loadingSize = 'sm', children, disabled, sx, ...props }: Props) => (
14
+ <Button
15
+ type="submit"
16
+ {...props}
17
+ disabled={isLoading || disabled}
18
+ sx={{ ...sx, position: 'relative' }}
19
+ >
20
+ <Text as="span" sx={{ visibility: isLoading ? 'hidden' : 'visible' }}>
21
+ {children}
22
+ </Text>
23
+ <LoadingCircular
24
+ colorScheme={props.colorScheme}
25
+ size={loadingSize}
26
+ sx={{ visibility: isLoading ? 'visible' : 'hidden', position: 'absolute' }}
27
+ />
28
+ </Button>
29
+ )