@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,114 +1,114 @@
1
- import { Box, IconBox, Text } from '@citric/core'
2
- import { SxProperties } from '@citric/core/dist/sx'
3
- import * as icons from '@citric/icons'
4
- import { EllipsisVertical } from '@citric/icons'
5
- import { IconButton } from '@citric/ui'
6
- import { theme } from '@stack-spot/portal-theme'
7
- import { createElement, useState } from 'react'
8
-
9
- export type IconName = keyof typeof icons
10
-
11
- export type MenuOption = {
12
- /**
13
- * The text that will be displayed for the option.
14
- */
15
- label: string,
16
- /**
17
- * The icon that will be displayed alongside the text.
18
- */
19
- icon: IconName,
20
- /**
21
- * The function that will be executed when the option is clicked.
22
- */
23
- onClick: VoidFunction,
24
- }
25
-
26
- interface Props {
27
- loading?: boolean,
28
- menu: MenuOption[],
29
- }
30
-
31
- const styles = {
32
- MoreWrapper: {
33
- position: 'relative',
34
- 'button': {
35
- width: '2rem',
36
- height: '2rem',
37
- },
38
- '.drop': {
39
- zIndex: 1,
40
- position: 'absolute',
41
- listStyle: 'none',
42
- display: 'flex',
43
- margin: '0',
44
- padding: '0.25rem',
45
- flexDirection: 'column',
46
- justifyContent: 'center',
47
- alignItems: 'flex-start',
48
- gap: '0.5rem',
49
- borderRadius: '0.25rem',
50
- border: `0.063rem solid ${theme.color.light[400]}`,
51
- backgroundColor: `${theme.color.light[500]}`,
52
- boxShadow: `0 0 0 0.125rem ${theme.color.gray[600]}`,
53
- right: '2px',
54
- width: 'max-content',
55
- 'ul': {
56
- padding: 0,
57
- margin: 0,
58
- },
59
- '.item-list-float': {
60
- minWidth: '230px',
61
- listStyleType: 'none',
62
- padding: '8px',
63
- paddingRight: '12px',
64
- display: 'flex',
65
- alignItems: 'center',
66
- cursor: 'pointer',
67
- '&:hover': {
68
- backgroundColor: `${theme.color.light[600]}`,
69
- },
70
- },
71
- },
72
- },
73
- }
74
-
75
- export function More({ loading, menu }: Props) {
76
-
77
- const [opened, setOpened] = useState(false)
78
-
79
- return (
80
- <Box sx={styles.MoreWrapper as SxProperties}>
81
- <IconButton
82
- color="light"
83
- size="sm"
84
- appearance="circle"
85
- aria-label="More options"
86
- disabled={loading}
87
- onClick={() => setOpened((old) => !old)}
88
- onBlur={() => setTimeout(() => setOpened(false), 200)}
89
- >
90
- <IconBox size="xs">
91
- <EllipsisVertical />
92
- </IconBox>
93
- </IconButton>
94
- {
95
- opened && (
96
- <div className="drop">
97
- <ul className="drop-wrapper">
98
- {
99
- menu.map((menuItem, key) => (
100
- <li role="button" className="item-list-float" key={key} onClick={menuItem.onClick}>
101
- <IconBox size="sm">
102
- {createElement(icons[menuItem.icon])}
103
- </IconBox>
104
- <Text appearance="body2">{menuItem.label}</Text>
105
- </li>
106
- ))
107
- }
108
- </ul>
109
- </div>
110
- )
111
- }
112
- </Box>
113
- )
114
- }
1
+ import { Box, IconBox, Text } from '@citric/core'
2
+ import { SxProperties } from '@citric/core/dist/sx'
3
+ import * as icons from '@citric/icons'
4
+ import { EllipsisVertical } from '@citric/icons'
5
+ import { IconButton } from '@citric/ui'
6
+ import { theme } from '@stack-spot/portal-theme'
7
+ import { createElement, useState } from 'react'
8
+
9
+ export type IconName = keyof typeof icons
10
+
11
+ export type MenuOption = {
12
+ /**
13
+ * The text that will be displayed for the option.
14
+ */
15
+ label: string,
16
+ /**
17
+ * The icon that will be displayed alongside the text.
18
+ */
19
+ icon: IconName,
20
+ /**
21
+ * The function that will be executed when the option is clicked.
22
+ */
23
+ onClick: VoidFunction,
24
+ }
25
+
26
+ interface Props {
27
+ loading?: boolean,
28
+ menu: MenuOption[],
29
+ }
30
+
31
+ const styles = {
32
+ MoreWrapper: {
33
+ position: 'relative',
34
+ 'button': {
35
+ width: '2rem',
36
+ height: '2rem',
37
+ },
38
+ '.drop': {
39
+ zIndex: 1,
40
+ position: 'absolute',
41
+ listStyle: 'none',
42
+ display: 'flex',
43
+ margin: '0',
44
+ padding: '0.25rem',
45
+ flexDirection: 'column',
46
+ justifyContent: 'center',
47
+ alignItems: 'flex-start',
48
+ gap: '0.5rem',
49
+ borderRadius: '0.25rem',
50
+ border: `0.063rem solid ${theme.color.light[400]}`,
51
+ backgroundColor: `${theme.color.light[500]}`,
52
+ boxShadow: `0 0 0 0.125rem ${theme.color.gray[600]}`,
53
+ right: '2px',
54
+ width: 'max-content',
55
+ 'ul': {
56
+ padding: 0,
57
+ margin: 0,
58
+ },
59
+ '.item-list-float': {
60
+ minWidth: '230px',
61
+ listStyleType: 'none',
62
+ padding: '8px',
63
+ paddingRight: '12px',
64
+ display: 'flex',
65
+ alignItems: 'center',
66
+ cursor: 'pointer',
67
+ '&:hover': {
68
+ backgroundColor: `${theme.color.light[600]}`,
69
+ },
70
+ },
71
+ },
72
+ },
73
+ }
74
+
75
+ export function More({ loading, menu }: Props) {
76
+
77
+ const [opened, setOpened] = useState(false)
78
+
79
+ return (
80
+ <Box sx={styles.MoreWrapper as SxProperties}>
81
+ <IconButton
82
+ color="light"
83
+ size="sm"
84
+ appearance="circle"
85
+ aria-label="More options"
86
+ disabled={loading}
87
+ onClick={() => setOpened((old) => !old)}
88
+ onBlur={() => setTimeout(() => setOpened(false), 200)}
89
+ >
90
+ <IconBox size="xs">
91
+ <EllipsisVertical />
92
+ </IconBox>
93
+ </IconButton>
94
+ {
95
+ opened && (
96
+ <div className="drop">
97
+ <ul className="drop-wrapper">
98
+ {
99
+ menu.map((menuItem, key) => (
100
+ <li role="button" className="item-list-float" key={key} onClick={menuItem.onClick}>
101
+ <IconBox size="sm">
102
+ {createElement(icons[menuItem.icon])}
103
+ </IconBox>
104
+ <Text appearance="body2">{menuItem.label}</Text>
105
+ </li>
106
+ ))
107
+ }
108
+ </ul>
109
+ </div>
110
+ )
111
+ }
112
+ </Box>
113
+ )
114
+ }
@@ -1,186 +1,186 @@
1
-
2
- import { Box, IconBox, Text } from '@citric/core'
3
- import { SxProperties } from '@citric/core/dist/sx'
4
- import { ChevronRight, Code, Folder } from '@citric/icons'
5
- import { theme } from '@stack-spot/portal-theme'
6
- import { useState } from 'react'
7
- import { useAnchorTag } from '../../context/anchor'
8
- import { MenuOption, More } from './More'
9
-
10
- const styles = {
11
- FileTreeViewWrapper: {
12
- height: '100%',
13
- display: 'flex',
14
- flexDirection: 'column',
15
- margin: '16px',
16
- },
17
- AccordionItemWrapper: {
18
- width: '100%',
19
- 'ul': {
20
- listStyleType: 'none',
21
- margin: 0,
22
- padding: 0,
23
- flexDirection: 'column',
24
- marginLeft: '20px',
25
- justifyContent: 'center',
26
- },
27
- 'li': {
28
- display: 'flex',
29
- listStyleType: 'none',
30
- margin: '2px 0',
31
- padding: 0,
32
- flexDirection: 'row',
33
- alignItems: 'center',
34
- gap: '4px',
35
- },
36
-
37
- '.accordion-node-group': {
38
- justifyContent: 'space-between',
39
- width: '100%',
40
- '&:hover': {
41
- backgroundColor: `${theme.color.light[500]}`,
42
- borderRadius: '4px',
43
- },
44
-
45
- 'a': {
46
- display: 'flex',
47
- alignItems: 'center',
48
- textDecoration: 'underline',
49
- 'label':{
50
- '&:hover': {
51
- cursor: 'pointer',
52
- },
53
- },
54
- },
55
- },
56
-
57
- '.accordion-node': {
58
- cursor: 'pointer',
59
- flexDirection: 'row',
60
- display: 'flex',
61
- gap: '4px',
62
- alignItems: 'center',
63
- background: 'transparent',
64
- color: 'inherit',
65
- border: 'none',
66
- '.icon': {
67
- transition: 'transform ease-in-out 0.3s',
68
- },
69
- '.open':{
70
- transform: 'rotate(90deg)',
71
- },
72
- },
73
-
74
- 'actions': {
75
- display: 'flex',
76
- flexDirection: 'row',
77
- gap: '4px',
78
- alignItems: 'center',
79
- },
80
- },
81
- }
82
-
83
-
84
- export interface FileDir {
85
- /**
86
- * The name of the directory or file.
87
- * */
88
- name: string,
89
- /**
90
- * dirs - An array containing the directories present in the file tree.
91
- */
92
- dirs: FileDir[],
93
- /**
94
- * isFile - A flag indicating whether the item is a file (`true`) or a directory (`false`).
95
- */
96
- isFile?: boolean,
97
- /**
98
- * itemLink - The URL or path link associated with the item in the file tree.
99
- */
100
- itemLink: string,
101
- /**
102
- * The menu options that will be rendered at the end of the line for this item.
103
- */
104
- menuOptions?: MenuOption[],
105
- }
106
-
107
- interface Props {
108
- /**
109
- * Represents the hierarchical structure of directories and files, providing the component with an organized view of the file system.
110
- */
111
- fileTree: FileDir,
112
- }
113
-
114
- export const FileTreeView = ({ fileTree }: Props) => {
115
-
116
- const AccordionItem = ({ name, isFile, dirs, defaultOpened = false, menuOptions, itemLink }: FileDir
117
- & { defaultOpened?: boolean }) => {
118
-
119
- const Link = useAnchorTag()
120
- const [opened, setOpened] = useState<boolean>(defaultOpened)
121
-
122
- const onExpand = () => {
123
- setOpened(old => !old)
124
- }
125
-
126
- const FolderItem = () => (
127
- <li className="accordion-node-group">
128
- <button className="accordion-node" onClick={onExpand}>
129
- <IconBox className={`icon ${opened ? 'open' : ''}`} >
130
- <ChevronRight />
131
- </IconBox>
132
- <IconBox>
133
- <Folder />
134
- </IconBox>
135
- <Text>{name !== '' ? name : '/'}</Text>
136
- </button>
137
- { menuOptions &&
138
- <div className="actions">
139
- <More menu={menuOptions} />
140
- </div>
141
- }
142
- </li>
143
- )
144
-
145
- const FileItem = () => (
146
- <li className="accordion-node-group">
147
- <Link href={itemLink}>
148
- <IconBox>
149
- <Code />
150
- </IconBox>
151
- <Text as="label">{name}</Text>
152
- </Link>
153
- { menuOptions &&
154
- <div className="actions">
155
- <More menu={menuOptions} />
156
- </div>
157
- }
158
- </li >
159
- )
160
-
161
- return (
162
- <Box sx={styles.AccordionItemWrapper}>
163
- {
164
- isFile ? <FileItem /> : <FolderItem />
165
- }
166
- <ul className="accordion-children">
167
- {opened && !isFile && dirs && dirs.length > 0 && (
168
- <>
169
- {dirs?.map((subDir, index) => (
170
- <li key={index}>{
171
- <AccordionItem {...subDir} />
172
- }</li>
173
- ))}
174
- </>
175
- )}
176
- </ul>
177
- </Box>
178
- )
179
- }
180
-
181
- return (
182
- <Box sx={styles.FileTreeViewWrapper as SxProperties}>
183
- <AccordionItem {...fileTree} defaultOpened={true} />
184
- </Box>
185
- )
186
- }
1
+
2
+ import { Box, IconBox, Text } from '@citric/core'
3
+ import { SxProperties } from '@citric/core/dist/sx'
4
+ import { ChevronRight, Code, Folder } from '@citric/icons'
5
+ import { theme } from '@stack-spot/portal-theme'
6
+ import { useState } from 'react'
7
+ import { useAnchorTag } from '../../context/anchor'
8
+ import { MenuOption, More } from './More'
9
+
10
+ const styles = {
11
+ FileTreeViewWrapper: {
12
+ height: '100%',
13
+ display: 'flex',
14
+ flexDirection: 'column',
15
+ margin: '16px',
16
+ },
17
+ AccordionItemWrapper: {
18
+ width: '100%',
19
+ 'ul': {
20
+ listStyleType: 'none',
21
+ margin: 0,
22
+ padding: 0,
23
+ flexDirection: 'column',
24
+ marginLeft: '20px',
25
+ justifyContent: 'center',
26
+ },
27
+ 'li': {
28
+ display: 'flex',
29
+ listStyleType: 'none',
30
+ margin: '2px 0',
31
+ padding: 0,
32
+ flexDirection: 'row',
33
+ alignItems: 'center',
34
+ gap: '4px',
35
+ },
36
+
37
+ '.accordion-node-group': {
38
+ justifyContent: 'space-between',
39
+ width: '100%',
40
+ '&:hover': {
41
+ backgroundColor: `${theme.color.light[500]}`,
42
+ borderRadius: '4px',
43
+ },
44
+
45
+ 'a': {
46
+ display: 'flex',
47
+ alignItems: 'center',
48
+ textDecoration: 'underline',
49
+ 'label':{
50
+ '&:hover': {
51
+ cursor: 'pointer',
52
+ },
53
+ },
54
+ },
55
+ },
56
+
57
+ '.accordion-node': {
58
+ cursor: 'pointer',
59
+ flexDirection: 'row',
60
+ display: 'flex',
61
+ gap: '4px',
62
+ alignItems: 'center',
63
+ background: 'transparent',
64
+ color: 'inherit',
65
+ border: 'none',
66
+ '.icon': {
67
+ transition: 'transform ease-in-out 0.3s',
68
+ },
69
+ '.open':{
70
+ transform: 'rotate(90deg)',
71
+ },
72
+ },
73
+
74
+ 'actions': {
75
+ display: 'flex',
76
+ flexDirection: 'row',
77
+ gap: '4px',
78
+ alignItems: 'center',
79
+ },
80
+ },
81
+ }
82
+
83
+
84
+ export interface FileDir {
85
+ /**
86
+ * The name of the directory or file.
87
+ * */
88
+ name: string,
89
+ /**
90
+ * dirs - An array containing the directories present in the file tree.
91
+ */
92
+ dirs: FileDir[],
93
+ /**
94
+ * isFile - A flag indicating whether the item is a file (`true`) or a directory (`false`).
95
+ */
96
+ isFile?: boolean,
97
+ /**
98
+ * itemLink - The URL or path link associated with the item in the file tree.
99
+ */
100
+ itemLink: string,
101
+ /**
102
+ * The menu options that will be rendered at the end of the line for this item.
103
+ */
104
+ menuOptions?: MenuOption[],
105
+ }
106
+
107
+ interface Props {
108
+ /**
109
+ * Represents the hierarchical structure of directories and files, providing the component with an organized view of the file system.
110
+ */
111
+ fileTree: FileDir,
112
+ }
113
+
114
+ export const FileTreeView = ({ fileTree }: Props) => {
115
+
116
+ const AccordionItem = ({ name, isFile, dirs, defaultOpened = false, menuOptions, itemLink }: FileDir
117
+ & { defaultOpened?: boolean }) => {
118
+
119
+ const Link = useAnchorTag()
120
+ const [opened, setOpened] = useState<boolean>(defaultOpened)
121
+
122
+ const onExpand = () => {
123
+ setOpened(old => !old)
124
+ }
125
+
126
+ const FolderItem = () => (
127
+ <li className="accordion-node-group">
128
+ <button className="accordion-node" onClick={onExpand}>
129
+ <IconBox className={`icon ${opened ? 'open' : ''}`} >
130
+ <ChevronRight />
131
+ </IconBox>
132
+ <IconBox>
133
+ <Folder />
134
+ </IconBox>
135
+ <Text>{name !== '' ? name : '/'}</Text>
136
+ </button>
137
+ { menuOptions &&
138
+ <div className="actions">
139
+ <More menu={menuOptions} />
140
+ </div>
141
+ }
142
+ </li>
143
+ )
144
+
145
+ const FileItem = () => (
146
+ <li className="accordion-node-group">
147
+ <Link href={itemLink}>
148
+ <IconBox>
149
+ <Code />
150
+ </IconBox>
151
+ <Text as="label">{name}</Text>
152
+ </Link>
153
+ { menuOptions &&
154
+ <div className="actions">
155
+ <More menu={menuOptions} />
156
+ </div>
157
+ }
158
+ </li >
159
+ )
160
+
161
+ return (
162
+ <Box sx={styles.AccordionItemWrapper}>
163
+ {
164
+ isFile ? <FileItem /> : <FolderItem />
165
+ }
166
+ <ul className="accordion-children">
167
+ {opened && !isFile && dirs && dirs.length > 0 && (
168
+ <>
169
+ {dirs?.map((subDir, index) => (
170
+ <li key={index}>{
171
+ <AccordionItem {...subDir} />
172
+ }</li>
173
+ ))}
174
+ </>
175
+ )}
176
+ </ul>
177
+ </Box>
178
+ )
179
+ }
180
+
181
+ return (
182
+ <Box sx={styles.FileTreeViewWrapper as SxProperties}>
183
+ <AccordionItem {...fileTree} defaultOpened={true} />
184
+ </Box>
185
+ )
186
+ }
@@ -1,24 +1,24 @@
1
- import { Flex } from '@citric/core'
2
- import { LoadingCircular } from '@citric/ui'
3
- import ReactInfiniteScroll, { Props as ReactInfiniteScrollProps } from 'react-infinite-scroll-component'
4
-
5
- /**
6
- * Renders a component that provides infinite scroll.
7
- *
8
- * The component wraps around the ReactInfiniteScroll component.
9
- * It provides a loading indicator using citric loading circular and custom styles.
10
- *
11
- * By default, it adds the scrollable target as page and overflow hidden.
12
- */
13
- export const InfiniteScroll = ({ style, children, scrollableTarget, ...props }: Omit<ReactInfiniteScrollProps, 'loader'>) => (
14
- <ReactInfiniteScroll
15
- loader={<Flex alignItems="center" justifyContent="center" p={4} flex={1} data-test-hint="loading">
16
- <LoadingCircular />
17
- </Flex>}
18
- scrollableTarget={scrollableTarget || 'page'}
19
- style={{ overflow: 'hidden', ...style }}
20
- {...props}
21
- >
22
- {children}
23
- </ReactInfiniteScroll>
24
- )
1
+ import { Flex } from '@citric/core'
2
+ import { LoadingCircular } from '@citric/ui'
3
+ import ReactInfiniteScroll, { Props as ReactInfiniteScrollProps } from 'react-infinite-scroll-component'
4
+
5
+ /**
6
+ * Renders a component that provides infinite scroll.
7
+ *
8
+ * The component wraps around the ReactInfiniteScroll component.
9
+ * It provides a loading indicator using citric loading circular and custom styles.
10
+ *
11
+ * By default, it adds the scrollable target as page and overflow hidden.
12
+ */
13
+ export const InfiniteScroll = ({ style, children, scrollableTarget, ...props }: Omit<ReactInfiniteScrollProps, 'loader'>) => (
14
+ <ReactInfiniteScroll
15
+ loader={<Flex alignItems="center" justifyContent="center" p={4} flex={1} data-test-hint="loading">
16
+ <LoadingCircular />
17
+ </Flex>}
18
+ scrollableTarget={scrollableTarget || 'page'}
19
+ style={{ overflow: 'hidden', ...style }}
20
+ {...props}
21
+ >
22
+ {children}
23
+ </ReactInfiniteScroll>
24
+ )