@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.
- package/CHANGELOG.md +635 -621
- package/dist/components/AnimatedHeight.d.ts +1 -1
- package/dist/components/AnimatedHeight.js +26 -26
- package/dist/components/AsyncContent.d.ts +1 -1
- package/dist/components/AsyncContent.js +1 -1
- package/dist/components/BannerWarning.d.ts +1 -1
- package/dist/components/BannerWarning.js +1 -1
- package/dist/components/Breadcrumb/index.d.ts +2 -2
- package/dist/components/Breadcrumb/index.js +1 -1
- package/dist/components/Breadcrumb/styled.js +31 -31
- package/dist/components/ButtonLoading.d.ts +1 -1
- package/dist/components/ButtonLoading.js +1 -1
- package/dist/components/ChatBot.d.ts +1 -1
- package/dist/components/ChatBot.js +1 -1
- package/dist/components/ContentValidateFilter.d.ts +1 -1
- package/dist/components/ContentValidateFilter.js +1 -1
- package/dist/components/FadingOverflow.d.ts +1 -1
- package/dist/components/FadingOverflow.js +69 -69
- package/dist/components/FileTreeView/More.d.ts +1 -1
- package/dist/components/FileTreeView/More.js +1 -1
- package/dist/components/FileTreeView/index.d.ts +1 -1
- package/dist/components/FileTreeView/index.js +1 -1
- package/dist/components/InfiniteScroll.d.ts +1 -1
- package/dist/components/InfiniteScroll.js +1 -1
- package/dist/components/InfoMaintenanceBanner.d.ts +1 -1
- package/dist/components/InfoMaintenanceBanner.js +2 -2
- package/dist/components/LazyMarkdown/BlockquoteMd.d.ts +1 -1
- package/dist/components/LazyMarkdown/BlockquoteMd.js +1 -1
- package/dist/components/LazyMarkdown/CodeViewer.d.ts +1 -1
- package/dist/components/LazyMarkdown/CodeViewer.js +76 -76
- package/dist/components/LazyMarkdown/Markdown.d.ts +1 -1
- package/dist/components/LazyMarkdown/Markdown.js +1 -1
- package/dist/components/LazyMarkdown/MarkdownButton.d.ts +1 -1
- package/dist/components/LazyMarkdown/MarkdownButton.js +1 -1
- package/dist/components/LazyMarkdown/Video.d.ts +1 -1
- package/dist/components/LazyMarkdown/Video.js +1 -1
- package/dist/components/LazyMarkdown/index.d.ts +1 -1
- package/dist/components/LazyMarkdown/index.js +1 -1
- package/dist/components/Placeholder.d.ts +7 -3
- package/dist/components/Placeholder.d.ts.map +1 -1
- package/dist/components/Placeholder.js +3 -3
- package/dist/components/Placeholder.js.map +1 -1
- package/dist/components/ScrollView.js +16 -16
- package/dist/components/Select/BadgeItem.d.ts +1 -1
- package/dist/components/Select/BadgeItem.js +1 -1
- package/dist/components/Select/ClearInput.d.ts +1 -1
- package/dist/components/Select/ClearInput.js +1 -1
- package/dist/components/Select/CloseItem.d.ts +1 -1
- package/dist/components/Select/CloseItem.js +1 -1
- package/dist/components/Select/CreatableSelect.js +1 -1
- package/dist/components/Select/CustomMenu.d.ts +1 -1
- package/dist/components/Select/CustomMenu.js +1 -1
- package/dist/components/Select/LabelItem.d.ts +1 -1
- package/dist/components/Select/LabelItem.js +1 -1
- package/dist/components/Select/MultiValue.d.ts +1 -1
- package/dist/components/Select/MultiValue.js +1 -1
- package/dist/components/Select/SelectInfiniteScroll.d.ts +1 -1
- package/dist/components/Select/SelectInfiniteScroll.js +1 -1
- package/dist/components/Select/SelectSearch.d.ts +1 -1
- package/dist/components/Select/SelectSearch.js +1 -1
- package/dist/components/SelectionList.d.ts +1 -1
- package/dist/components/SelectionList.js +61 -61
- package/dist/components/StatusCircle.d.ts +1 -1
- package/dist/components/StatusCircle.js +6 -6
- package/dist/components/Stepper/Navigation.js +4 -4
- package/dist/components/Stepper/Step.js +3 -3
- package/dist/components/Stepper/Stepper.js +6 -6
- package/dist/components/Stepper/headers.js +22 -22
- package/dist/components/Table/HeaderItem.js +1 -1
- package/dist/components/Table/SettingsVerticalMenu.d.ts +1 -1
- package/dist/components/Table/SettingsVerticalMenu.js +1 -1
- package/dist/components/Table/StyledLinkTable.d.ts +1 -1
- package/dist/components/Table/StyledLinkTable.js +5 -5
- package/dist/components/Table/TableData.d.ts +1 -1
- package/dist/components/Table/TableData.js +25 -25
- package/dist/components/TimelineSection.d.ts +1 -1
- package/dist/components/TimelineSection.js +14 -14
- package/dist/components/error/ErrorFeedback.d.ts +1 -1
- package/dist/components/error/ErrorFeedback.js +35 -35
- package/dist/components/error/NotFound.d.ts +1 -1
- package/dist/components/error/NotFound.js +1 -1
- package/dist/components/error/UnderMaintenance.d.ts +1 -1
- package/dist/components/error/UnderMaintenance.js +1 -1
- package/dist/components/form/Form/Form.d.ts +1 -1
- package/dist/components/form/Form/Form.js +1 -1
- package/dist/components/form/Form/FormGroup.d.ts +2 -2
- package/dist/components/form/Form/FormGroup.js +1 -1
- package/dist/components/form/SearchInput.d.ts +1 -1
- package/dist/components/form/SearchInput.js +1 -1
- package/dist/components/form/Select/CustomSelect.d.ts +1 -1
- package/dist/components/form/Select/CustomSelect.js +1 -1
- package/dist/components/form/Select/DetailedSelect.d.ts +1 -1
- package/dist/components/form/Select/DetailedSelect.js +1 -1
- package/dist/components/form/Select/Select.d.ts +1 -1
- package/dist/components/form/Select/Select.js +1 -1
- package/dist/components/form/Select/styled.js +161 -161
- package/dist/components/form/Select/utils.js +1 -1
- package/dist/components/notification/NotificationComponent.d.ts +1 -1
- package/dist/components/notification/NotificationComponent.js +54 -54
- package/dist/components/notification/NotificationItem.d.ts +1 -1
- package/dist/components/notification/NotificationItem.d.ts.map +1 -1
- package/dist/components/notification/NotificationItem.js +11 -5
- package/dist/components/notification/NotificationItem.js.map +1 -1
- package/dist/components/notification/NotificationList.d.ts +1 -1
- package/dist/components/notification/NotificationList.d.ts.map +1 -1
- package/dist/components/notification/NotificationList.js +44 -44
- package/dist/components/notification/NotificationList.js.map +1 -1
- package/dist/components/notification/NotificationPlaceholder.d.ts +1 -1
- package/dist/components/notification/NotificationPlaceholder.d.ts.map +1 -1
- package/dist/components/notification/NotificationPlaceholder.js +2 -2
- package/dist/components/notification/NotificationPlaceholder.js.map +1 -1
- package/dist/containers/NotificationsPage.d.ts +1 -1
- package/dist/containers/NotificationsPage.d.ts.map +1 -1
- package/dist/containers/NotificationsPage.js +24 -11
- package/dist/containers/NotificationsPage.js.map +1 -1
- package/dist/context/anchor.d.ts +1 -1
- package/dist/context/anchor.js +1 -1
- package/dist/context/loading.d.ts +1 -1
- package/dist/context/loading.js +1 -1
- package/dist/context/notification/context.d.ts +1 -1
- package/dist/context/notification/context.js +1 -1
- package/dist/context/notification/types.d.ts +1 -0
- package/dist/context/notification/types.d.ts.map +1 -1
- package/dist/hooks/date.js +1 -1
- package/dist/hooks/service-now.js +28 -28
- package/dist/svg/AI.d.ts +1 -1
- package/dist/svg/AI.js +1 -1
- package/dist/svg/CS.d.ts +1 -1
- package/dist/svg/CS.js +1 -1
- package/dist/svg/EDP.d.ts +1 -1
- package/dist/svg/EDP.js +1 -1
- package/dist/svg/Forbidden.d.ts +1 -1
- package/dist/svg/Forbidden.js +1 -1
- package/dist/svg/GenericPlaceholder.d.ts +4 -2
- package/dist/svg/GenericPlaceholder.d.ts.map +1 -1
- package/dist/svg/GenericPlaceholder.js +2 -2
- package/dist/svg/GenericPlaceholder.js.map +1 -1
- package/dist/svg/HUB.d.ts +1 -1
- package/dist/svg/HUB.js +1 -1
- package/dist/svg/Logo.d.ts +1 -1
- package/dist/svg/Logo.js +1 -1
- package/dist/svg/MiniLogo.d.ts +1 -1
- package/dist/svg/MiniLogo.js +1 -1
- package/dist/svg/NotFound.d.ts +1 -1
- package/dist/svg/NotFound.js +1 -1
- package/dist/svg/ServerError.d.ts +1 -1
- package/dist/svg/ServerError.js +1 -1
- package/dist/svg/Unauthenticated.d.ts +1 -1
- package/dist/svg/Unauthenticated.js +1 -1
- package/package.json +6 -6
- package/readme.md +66 -66
- package/src/components/AnimatedHeight.tsx +174 -174
- package/src/components/AsyncContent.tsx +78 -78
- package/src/components/BannerWarning.tsx +91 -91
- package/src/components/Breadcrumb/index.tsx +76 -76
- package/src/components/Breadcrumb/styled.ts +37 -37
- package/src/components/ButtonLoading.tsx +29 -29
- package/src/components/ChatBot.tsx +82 -82
- package/src/components/ContentValidateFilter.tsx +15 -15
- package/src/components/FadingOverflow.tsx +265 -265
- package/src/components/FileTreeView/More.tsx +114 -114
- package/src/components/FileTreeView/index.tsx +186 -186
- package/src/components/InfiniteScroll.tsx +24 -24
- package/src/components/InfoMaintenanceBanner.tsx +29 -29
- package/src/components/LazyMarkdown/BlockquoteMd.tsx +107 -107
- package/src/components/LazyMarkdown/CodeViewer.tsx +161 -161
- package/src/components/LazyMarkdown/Markdown.tsx +122 -122
- package/src/components/LazyMarkdown/MarkdownButton.tsx +24 -24
- package/src/components/LazyMarkdown/Video.tsx +13 -13
- package/src/components/LazyMarkdown/index.tsx +21 -21
- package/src/components/Placeholder.tsx +123 -118
- package/src/components/ScrollView.tsx +57 -57
- package/src/components/Select/BadgeItem.tsx +58 -58
- package/src/components/Select/ClearInput.tsx +24 -24
- package/src/components/Select/CloseItem.tsx +38 -38
- package/src/components/Select/CreatableSelect.tsx +155 -155
- package/src/components/Select/CustomMenu.tsx +16 -16
- package/src/components/Select/LabelItem.tsx +8 -8
- package/src/components/Select/MultiValue.tsx +49 -49
- package/src/components/Select/SelectInfiniteScroll.tsx +82 -82
- package/src/components/Select/SelectSearch.tsx +195 -195
- package/src/components/Select/index.tsx +7 -7
- package/src/components/Select/types.ts +8 -8
- package/src/components/SelectionList.tsx +427 -427
- package/src/components/StatusCircle.tsx +67 -67
- package/src/components/Stepper/Navigation.tsx +97 -97
- package/src/components/Stepper/Step.tsx +30 -30
- package/src/components/Stepper/Stepper.tsx +113 -113
- package/src/components/Stepper/headers.tsx +64 -64
- package/src/components/Stepper/index.ts +3 -3
- package/src/components/Table/HeaderItem.tsx +52 -52
- package/src/components/Table/SettingsVerticalMenu.tsx +50 -50
- package/src/components/Table/StyledLinkTable.tsx +22 -22
- package/src/components/Table/TableData.tsx +251 -251
- package/src/components/Table/index.tsx +2 -2
- package/src/components/TimelineSection.tsx +66 -66
- package/src/components/error/ErrorFeedback.tsx +217 -217
- package/src/components/error/NotFound.tsx +24 -24
- package/src/components/error/UnderMaintenance.tsx +30 -30
- package/src/components/error/index.ts +4 -4
- package/src/components/form/Form/Form.tsx +101 -101
- package/src/components/form/Form/FormGroup.tsx +221 -221
- package/src/components/form/Form/index.ts +2 -2
- package/src/components/form/SearchInput.tsx +69 -69
- package/src/components/form/Select/CustomSelect.tsx +232 -232
- package/src/components/form/Select/DetailedSelect.tsx +85 -85
- package/src/components/form/Select/Select.tsx +67 -67
- package/src/components/form/Select/index.ts +4 -4
- package/src/components/form/Select/styled.ts +165 -165
- package/src/components/form/Select/types.ts +112 -112
- package/src/components/form/Select/utils.tsx +28 -28
- package/src/components/notification/NotificationComponent.tsx +340 -340
- package/src/components/notification/NotificationItem.tsx +345 -336
- package/src/components/notification/NotificationList.tsx +179 -178
- package/src/components/notification/NotificationPlaceholder.tsx +44 -43
- package/src/components/notification/types.ts +72 -72
- package/src/containers/NotificationsPage.tsx +119 -98
- package/src/context/anchor.tsx +37 -37
- package/src/context/loading.tsx +36 -36
- package/src/context/notification/LazyNotificationList.ts +103 -103
- package/src/context/notification/NotificationController.ts +104 -104
- package/src/context/notification/context.tsx +23 -23
- package/src/context/notification/hooks.ts +98 -98
- package/src/context/notification/types.ts +66 -65
- package/src/hooks/date.ts +31 -31
- package/src/hooks/keyboard.tsx +128 -128
- package/src/hooks/manual-render.tsx +10 -10
- package/src/hooks/service-now.tsx +233 -233
- package/src/hooks/text.tsx +30 -30
- package/src/hooks/title.tsx +28 -28
- package/src/hooks/use-effect-once.tsx +43 -43
- package/src/index.ts +19 -19
- package/src/notifications.ts +11 -11
- package/src/svg/AI.tsx +41 -41
- package/src/svg/CS.tsx +48 -48
- package/src/svg/EDP.tsx +31 -31
- package/src/svg/Forbidden.tsx +22 -22
- package/src/svg/GenericPlaceholder.tsx +20 -20
- package/src/svg/HUB.tsx +48 -48
- package/src/svg/Logo.tsx +16 -16
- package/src/svg/MiniLogo.tsx +12 -12
- package/src/svg/NotFound.tsx +16 -16
- package/src/svg/ServerError.tsx +33 -33
- package/src/svg/Unauthenticated.tsx +16 -16
- package/src/svg/index.ts +11 -11
- package/src/utils/accessibility.ts +135 -135
- package/src/utils/cookie.ts +73 -73
- package/src/utils/promise.ts +5 -5
- package/src/utils/read-file.ts +16 -16
- package/tsconfig.json +10 -10
|
@@ -1,29 +1,29 @@
|
|
|
1
|
-
import { Text } from '@citric/core'
|
|
2
|
-
import { interpolate, useLanguage, useTranslate } from '@stack-spot/portal-translate'
|
|
3
|
-
import { format } from 'date-fns'
|
|
4
|
-
import { enUS, ptBR } from 'date-fns/locale'
|
|
5
|
-
|
|
6
|
-
interface InfoMaintenanceBannerProps {
|
|
7
|
-
date: Date,
|
|
8
|
-
initialHour: string,
|
|
9
|
-
endHour: string,
|
|
10
|
-
}
|
|
11
|
-
|
|
12
|
-
export const InfoMaintenanceBanner = ({ date, initialHour, endHour }: InfoMaintenanceBannerProps) => {
|
|
13
|
-
const t = useTranslate(dictionary)
|
|
14
|
-
const language = useLanguage()
|
|
15
|
-
const locale = language === 'pt' ? ptBR : enUS
|
|
16
|
-
const dateToString = language === 'en' ?
|
|
17
|
-
format(date, "MMMM do',' yyyy", { locale }) :
|
|
18
|
-
format(date, "dd 'de' MMMM 'de' yyyy", { locale })
|
|
19
|
-
return <Text>{interpolate(t.info, dateToString, initialHour, endHour)}</Text>
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
const dictionary = {
|
|
23
|
-
en: {
|
|
24
|
-
info: 'We would like to inform you that StackSpot will undergo maintenance on $0, from $1 (GMT-3) to $2. During this period, this web portal will be temporarily unavailable.',
|
|
25
|
-
},
|
|
26
|
-
pt: {
|
|
27
|
-
info: 'Gostaríamos de informar que a StackSpot passará por manutenção no dia $0, das $1 (GMT-3) às $2. Durante este período, este portal web estará temporariamente indisponível.',
|
|
28
|
-
},
|
|
29
|
-
}
|
|
1
|
+
import { Text } from '@citric/core'
|
|
2
|
+
import { interpolate, useLanguage, useTranslate } from '@stack-spot/portal-translate'
|
|
3
|
+
import { format } from 'date-fns'
|
|
4
|
+
import { enUS, ptBR } from 'date-fns/locale'
|
|
5
|
+
|
|
6
|
+
interface InfoMaintenanceBannerProps {
|
|
7
|
+
date: Date,
|
|
8
|
+
initialHour: string,
|
|
9
|
+
endHour: string,
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
export const InfoMaintenanceBanner = ({ date, initialHour, endHour }: InfoMaintenanceBannerProps) => {
|
|
13
|
+
const t = useTranslate(dictionary)
|
|
14
|
+
const language = useLanguage()
|
|
15
|
+
const locale = language === 'pt' ? ptBR : enUS
|
|
16
|
+
const dateToString = language === 'en' ?
|
|
17
|
+
format(date, "MMMM do',' yyyy", { locale }) :
|
|
18
|
+
format(date, "dd 'de' MMMM 'de' yyyy", { locale })
|
|
19
|
+
return <Text>{interpolate(t.info, dateToString, initialHour, endHour)}</Text>
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
const dictionary = {
|
|
23
|
+
en: {
|
|
24
|
+
info: 'We would like to inform you that StackSpot will undergo maintenance on $0, from $1 (GMT-3) to $2. During this period, this web portal will be temporarily unavailable.',
|
|
25
|
+
},
|
|
26
|
+
pt: {
|
|
27
|
+
info: 'Gostaríamos de informar que a StackSpot passará por manutenção no dia $0, das $1 (GMT-3) às $2. Durante este período, este portal web estará temporariamente indisponível.',
|
|
28
|
+
},
|
|
29
|
+
}
|
|
@@ -1,107 +1,107 @@
|
|
|
1
|
-
import { Blockquote, Box, Flex, IconBox, Text } from '@citric/core'
|
|
2
|
-
import { OneOfColorSchemes } from '@citric/core/dist/theme-types'
|
|
3
|
-
import * as icons from '@citric/icons'
|
|
4
|
-
import { Dictionary, useTranslate } from '@stack-spot/portal-translate'
|
|
5
|
-
import { createElement } from 'react'
|
|
6
|
-
|
|
7
|
-
type IconName = keyof typeof icons
|
|
8
|
-
|
|
9
|
-
/**
|
|
10
|
-
* BlockquoteMd component that renders a styled blockquote with an icon and text based on the provided props.
|
|
11
|
-
*
|
|
12
|
-
* @param {Object} props - The props for the BlockquoteMd component.
|
|
13
|
-
* @param {any} props.props - The properties passed to the component.
|
|
14
|
-
* @returns {JSX.Element} The BlockquoteMd component.
|
|
15
|
-
*/
|
|
16
|
-
export const BlockquoteMd = ({ props }: { props: any }) => {
|
|
17
|
-
const t = useTranslate(dictionary)
|
|
18
|
-
const arrayNode = props.node
|
|
19
|
-
const blockItem = arrayNode?.children[1]?.children[0]?.value
|
|
20
|
-
const blockStyle = blockquoteAlertStyle(blockItem)
|
|
21
|
-
|
|
22
|
-
if (blockStyle) {
|
|
23
|
-
const childrenBlock = arrayNode?.children[3]?.children[1].children[0].value
|
|
24
|
-
return (
|
|
25
|
-
<Flex sx={{ borderRadius: 'sm', bg: 'light.500', my: 3 }}>
|
|
26
|
-
<Blockquote colorScheme={blockStyle.color}>
|
|
27
|
-
<Box>
|
|
28
|
-
<Flex>
|
|
29
|
-
<IconBox appearance="square" colorIcon={`${blockStyle.color}.400`} sx={{ mr: 4 }}>
|
|
30
|
-
{createElement(icons[blockStyle.icon])}
|
|
31
|
-
</IconBox>
|
|
32
|
-
<Text sx={{ color: `${blockStyle.color}.400` }} weight="medium">
|
|
33
|
-
{t[blockItem as keyof typeof t]}
|
|
34
|
-
</Text>
|
|
35
|
-
</Flex>
|
|
36
|
-
<Box my={3}>
|
|
37
|
-
<Text>{childrenBlock}</Text>
|
|
38
|
-
</Box>
|
|
39
|
-
</Box>
|
|
40
|
-
</Blockquote>
|
|
41
|
-
</Flex>
|
|
42
|
-
)
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
return (
|
|
46
|
-
<Flex sx={{ borderRadius: 'sm', bg: 'light.500', my: 3 }}>
|
|
47
|
-
<Blockquote>
|
|
48
|
-
<Text {...props} />
|
|
49
|
-
</Blockquote>
|
|
50
|
-
</Flex>
|
|
51
|
-
)
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
/**
|
|
55
|
-
* Get the style for the blockquote based on the block rule.
|
|
56
|
-
*
|
|
57
|
-
* @param {string} blockRule - The block rule to determine the style.
|
|
58
|
-
* @returns {{ color: OneOfColorSchemes, icon: IconName }} The style object containing color and icon.
|
|
59
|
-
*/
|
|
60
|
-
function blockquoteAlertStyle(blockRule: string) {
|
|
61
|
-
const style: Record<string, { color: OneOfColorSchemes, icon: IconName }> = {
|
|
62
|
-
'[!NOTE]': {
|
|
63
|
-
color: 'inverse',
|
|
64
|
-
icon: 'Document',
|
|
65
|
-
},
|
|
66
|
-
'[!INFO]': {
|
|
67
|
-
color: 'secondary',
|
|
68
|
-
icon: 'InfoCircle',
|
|
69
|
-
},
|
|
70
|
-
'[!IMPORTANT]': {
|
|
71
|
-
color: 'tertiary',
|
|
72
|
-
icon: 'MobileComments',
|
|
73
|
-
},
|
|
74
|
-
'[!TIP]': {
|
|
75
|
-
color: 'success',
|
|
76
|
-
icon: 'Star',
|
|
77
|
-
},
|
|
78
|
-
'[!WARNING]': {
|
|
79
|
-
color: 'warning',
|
|
80
|
-
icon: 'ExclamationTriangle',
|
|
81
|
-
},
|
|
82
|
-
'[!DANGER]': {
|
|
83
|
-
color: 'danger',
|
|
84
|
-
icon: 'Bug',
|
|
85
|
-
},
|
|
86
|
-
}
|
|
87
|
-
return style[blockRule]
|
|
88
|
-
}
|
|
89
|
-
|
|
90
|
-
const dictionary = {
|
|
91
|
-
en: {
|
|
92
|
-
'[!NOTE]': 'Note',
|
|
93
|
-
'[!INFO]': 'Info',
|
|
94
|
-
'[!IMPORTANT]': 'Important',
|
|
95
|
-
'[!TIP]': 'Tip',
|
|
96
|
-
'[!WARNING]xw': 'Warning',
|
|
97
|
-
'[!DANGER]': 'Danger',
|
|
98
|
-
},
|
|
99
|
-
pt: {
|
|
100
|
-
'[!NOTE]': 'Nota',
|
|
101
|
-
'[!INFO]': 'Informação',
|
|
102
|
-
'[!IMPORTANT]': 'Importante',
|
|
103
|
-
'[!TIP]': 'Dica',
|
|
104
|
-
'[!WARNING]': 'Atenção',
|
|
105
|
-
'[!DANGER]': 'Risco',
|
|
106
|
-
},
|
|
107
|
-
} satisfies Dictionary
|
|
1
|
+
import { Blockquote, Box, Flex, IconBox, Text } from '@citric/core'
|
|
2
|
+
import { OneOfColorSchemes } from '@citric/core/dist/theme-types'
|
|
3
|
+
import * as icons from '@citric/icons'
|
|
4
|
+
import { Dictionary, useTranslate } from '@stack-spot/portal-translate'
|
|
5
|
+
import { createElement } from 'react'
|
|
6
|
+
|
|
7
|
+
type IconName = keyof typeof icons
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* BlockquoteMd component that renders a styled blockquote with an icon and text based on the provided props.
|
|
11
|
+
*
|
|
12
|
+
* @param {Object} props - The props for the BlockquoteMd component.
|
|
13
|
+
* @param {any} props.props - The properties passed to the component.
|
|
14
|
+
* @returns {JSX.Element} The BlockquoteMd component.
|
|
15
|
+
*/
|
|
16
|
+
export const BlockquoteMd = ({ props }: { props: any }) => {
|
|
17
|
+
const t = useTranslate(dictionary)
|
|
18
|
+
const arrayNode = props.node
|
|
19
|
+
const blockItem = arrayNode?.children[1]?.children[0]?.value
|
|
20
|
+
const blockStyle = blockquoteAlertStyle(blockItem)
|
|
21
|
+
|
|
22
|
+
if (blockStyle) {
|
|
23
|
+
const childrenBlock = arrayNode?.children[3]?.children[1].children[0].value
|
|
24
|
+
return (
|
|
25
|
+
<Flex sx={{ borderRadius: 'sm', bg: 'light.500', my: 3 }}>
|
|
26
|
+
<Blockquote colorScheme={blockStyle.color}>
|
|
27
|
+
<Box>
|
|
28
|
+
<Flex>
|
|
29
|
+
<IconBox appearance="square" colorIcon={`${blockStyle.color}.400`} sx={{ mr: 4 }}>
|
|
30
|
+
{createElement(icons[blockStyle.icon])}
|
|
31
|
+
</IconBox>
|
|
32
|
+
<Text sx={{ color: `${blockStyle.color}.400` }} weight="medium">
|
|
33
|
+
{t[blockItem as keyof typeof t]}
|
|
34
|
+
</Text>
|
|
35
|
+
</Flex>
|
|
36
|
+
<Box my={3}>
|
|
37
|
+
<Text>{childrenBlock}</Text>
|
|
38
|
+
</Box>
|
|
39
|
+
</Box>
|
|
40
|
+
</Blockquote>
|
|
41
|
+
</Flex>
|
|
42
|
+
)
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
return (
|
|
46
|
+
<Flex sx={{ borderRadius: 'sm', bg: 'light.500', my: 3 }}>
|
|
47
|
+
<Blockquote>
|
|
48
|
+
<Text {...props} />
|
|
49
|
+
</Blockquote>
|
|
50
|
+
</Flex>
|
|
51
|
+
)
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
/**
|
|
55
|
+
* Get the style for the blockquote based on the block rule.
|
|
56
|
+
*
|
|
57
|
+
* @param {string} blockRule - The block rule to determine the style.
|
|
58
|
+
* @returns {{ color: OneOfColorSchemes, icon: IconName }} The style object containing color and icon.
|
|
59
|
+
*/
|
|
60
|
+
function blockquoteAlertStyle(blockRule: string) {
|
|
61
|
+
const style: Record<string, { color: OneOfColorSchemes, icon: IconName }> = {
|
|
62
|
+
'[!NOTE]': {
|
|
63
|
+
color: 'inverse',
|
|
64
|
+
icon: 'Document',
|
|
65
|
+
},
|
|
66
|
+
'[!INFO]': {
|
|
67
|
+
color: 'secondary',
|
|
68
|
+
icon: 'InfoCircle',
|
|
69
|
+
},
|
|
70
|
+
'[!IMPORTANT]': {
|
|
71
|
+
color: 'tertiary',
|
|
72
|
+
icon: 'MobileComments',
|
|
73
|
+
},
|
|
74
|
+
'[!TIP]': {
|
|
75
|
+
color: 'success',
|
|
76
|
+
icon: 'Star',
|
|
77
|
+
},
|
|
78
|
+
'[!WARNING]': {
|
|
79
|
+
color: 'warning',
|
|
80
|
+
icon: 'ExclamationTriangle',
|
|
81
|
+
},
|
|
82
|
+
'[!DANGER]': {
|
|
83
|
+
color: 'danger',
|
|
84
|
+
icon: 'Bug',
|
|
85
|
+
},
|
|
86
|
+
}
|
|
87
|
+
return style[blockRule]
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
const dictionary = {
|
|
91
|
+
en: {
|
|
92
|
+
'[!NOTE]': 'Note',
|
|
93
|
+
'[!INFO]': 'Info',
|
|
94
|
+
'[!IMPORTANT]': 'Important',
|
|
95
|
+
'[!TIP]': 'Tip',
|
|
96
|
+
'[!WARNING]xw': 'Warning',
|
|
97
|
+
'[!DANGER]': 'Danger',
|
|
98
|
+
},
|
|
99
|
+
pt: {
|
|
100
|
+
'[!NOTE]': 'Nota',
|
|
101
|
+
'[!INFO]': 'Informação',
|
|
102
|
+
'[!IMPORTANT]': 'Importante',
|
|
103
|
+
'[!TIP]': 'Dica',
|
|
104
|
+
'[!WARNING]': 'Atenção',
|
|
105
|
+
'[!DANGER]': 'Risco',
|
|
106
|
+
},
|
|
107
|
+
} satisfies Dictionary
|
|
@@ -1,161 +1,161 @@
|
|
|
1
|
-
import { Box, Flex, Text } from '@citric/core'
|
|
2
|
-
import { getColor, getRadius } from '@citric/core/dist/utils/theme'
|
|
3
|
-
import { Copy, Refresh } from '@citric/icons'
|
|
4
|
-
import { IconButton } from '@citric/ui'
|
|
5
|
-
import { theme } from '@stack-spot/portal-theme'
|
|
6
|
-
import { useTranslate } from '@stack-spot/portal-translate'
|
|
7
|
-
import SyntaxHighlighter from 'react-syntax-highlighter'
|
|
8
|
-
import styled from 'styled-components'
|
|
9
|
-
|
|
10
|
-
const style = {
|
|
11
|
-
scrollable: {
|
|
12
|
-
minHeight: '64px',
|
|
13
|
-
maxHeight: '232px',
|
|
14
|
-
overflow: 'auto',
|
|
15
|
-
'&::-webkit-scrollbar': {
|
|
16
|
-
width: '4px',
|
|
17
|
-
height: '4px',
|
|
18
|
-
},
|
|
19
|
-
'&::-webkit-scrollbar-track': {
|
|
20
|
-
background: 'light.400',
|
|
21
|
-
borderRadius: '2px',
|
|
22
|
-
},
|
|
23
|
-
'&::-webkit-scrollbar-thumb': {
|
|
24
|
-
background: 'light.700',
|
|
25
|
-
borderRadius: '2px',
|
|
26
|
-
},
|
|
27
|
-
},
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
const Wrapper = styled(Box)`
|
|
31
|
-
background-color: ${theme.color.gray[900]};
|
|
32
|
-
border-radius: ${({ theme }) => getRadius(theme as any, 'xs')};
|
|
33
|
-
position: relative;
|
|
34
|
-
padding: 8px;
|
|
35
|
-
overflow: hidden;
|
|
36
|
-
|
|
37
|
-
> .scrollable-container {
|
|
38
|
-
min-height: 64px;
|
|
39
|
-
max-height: 232px;
|
|
40
|
-
overflow: auto;
|
|
41
|
-
&::-webkit-scrollbar {
|
|
42
|
-
width: 4px;
|
|
43
|
-
height: 4px;
|
|
44
|
-
}
|
|
45
|
-
&::-webkit-scrollbar-track {
|
|
46
|
-
background: ${theme.color.light[400]};
|
|
47
|
-
border-radius: 2px;
|
|
48
|
-
}
|
|
49
|
-
&::-webkit-scrollbar-thumb,
|
|
50
|
-
&::-webkit-scrollbar-thumb:hover {
|
|
51
|
-
background: ${theme.color.light[700]};
|
|
52
|
-
border-radius: 2px;
|
|
53
|
-
}
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
pre {
|
|
57
|
-
background-color: transparent;
|
|
58
|
-
font-family: 'Roboto Mono';
|
|
59
|
-
font-size: 14.4px;
|
|
60
|
-
padding: 0;
|
|
61
|
-
margin-top: 0;
|
|
62
|
-
overflow: unset;
|
|
63
|
-
text-shadow: none;
|
|
64
|
-
color: ${theme.color.gray[50]};
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
.hljs-string {
|
|
68
|
-
color: ${theme.color.teal[300]};
|
|
69
|
-
}
|
|
70
|
-
.hljs-tag {
|
|
71
|
-
color: ${({ theme }) => getColor(theme as any, 'teal')};
|
|
72
|
-
}
|
|
73
|
-
.hljs-attr {
|
|
74
|
-
color: ${theme.color.gray[50]};
|
|
75
|
-
}
|
|
76
|
-
.hljs-number {
|
|
77
|
-
color: ${theme.color.gray[300]};
|
|
78
|
-
}
|
|
79
|
-
.hljs-property {
|
|
80
|
-
color: ${theme.color.gray[50]};
|
|
81
|
-
}
|
|
82
|
-
.hljs-keyword {
|
|
83
|
-
color: ${theme.color.blue[200]};
|
|
84
|
-
}
|
|
85
|
-
.comment {
|
|
86
|
-
color: ${theme.color.gray[400]};
|
|
87
|
-
}
|
|
88
|
-
.hljs-expression {
|
|
89
|
-
color: ${theme.color.orange[400]};
|
|
90
|
-
}
|
|
91
|
-
|
|
92
|
-
.button-group {
|
|
93
|
-
position: absolute;
|
|
94
|
-
top: 8px;
|
|
95
|
-
right: 24px;
|
|
96
|
-
display: flex;
|
|
97
|
-
|
|
98
|
-
button {
|
|
99
|
-
margin-left: 6px;
|
|
100
|
-
&:focus {
|
|
101
|
-
background-color: ${({ theme }) => getColor(theme as any, 'light.300')};
|
|
102
|
-
}
|
|
103
|
-
}
|
|
104
|
-
}
|
|
105
|
-
`
|
|
106
|
-
|
|
107
|
-
interface Props {
|
|
108
|
-
language: string,
|
|
109
|
-
data: string,
|
|
110
|
-
onClickRefresh?: () => void,
|
|
111
|
-
height?: string,
|
|
112
|
-
scrollable?: boolean,
|
|
113
|
-
copyButton?: boolean,
|
|
114
|
-
}
|
|
115
|
-
|
|
116
|
-
/**
|
|
117
|
-
* CodeViewer component that displays code with syntax highlighting based on application theme and optional copy and refresh buttons.
|
|
118
|
-
*
|
|
119
|
-
* @param options the props for rendering the component: {@link Props}.
|
|
120
|
-
*/
|
|
121
|
-
export const CodeViewer = ({ language, data, onClickRefresh, scrollable = true, copyButton }: Props) => {
|
|
122
|
-
const t = useTranslate(codeViewerLocale)
|
|
123
|
-
|
|
124
|
-
return (
|
|
125
|
-
<Wrapper>
|
|
126
|
-
{data ? (
|
|
127
|
-
<>
|
|
128
|
-
<Flex style={scrollable ? style.scrollable : undefined}>
|
|
129
|
-
<SyntaxHighlighter language={language} showLineNumbers useInlineStyles={false}>
|
|
130
|
-
{String(data).replace(/\n$/, '')}
|
|
131
|
-
</SyntaxHighlighter>
|
|
132
|
-
</Flex>
|
|
133
|
-
<div className="button-group">
|
|
134
|
-
{onClickRefresh && (
|
|
135
|
-
<IconButton onClick={onClickRefresh}>
|
|
136
|
-
<Refresh />
|
|
137
|
-
</IconButton>
|
|
138
|
-
)}
|
|
139
|
-
|
|
140
|
-
{copyButton ? (
|
|
141
|
-
<IconButton onClick={() => navigator.clipboard.writeText(data)}>
|
|
142
|
-
<Copy />
|
|
143
|
-
</IconButton>
|
|
144
|
-
) : null}
|
|
145
|
-
</div>
|
|
146
|
-
</>
|
|
147
|
-
) : (
|
|
148
|
-
<Text appearance="body2">{t.noData}</Text>
|
|
149
|
-
)}
|
|
150
|
-
</Wrapper>
|
|
151
|
-
)
|
|
152
|
-
}
|
|
153
|
-
|
|
154
|
-
export const codeViewerLocale = {
|
|
155
|
-
en: {
|
|
156
|
-
noData: 'No data available.',
|
|
157
|
-
},
|
|
158
|
-
pt: {
|
|
159
|
-
noData: 'Sem dados disponíveis.',
|
|
160
|
-
},
|
|
161
|
-
}
|
|
1
|
+
import { Box, Flex, Text } from '@citric/core'
|
|
2
|
+
import { getColor, getRadius } from '@citric/core/dist/utils/theme'
|
|
3
|
+
import { Copy, Refresh } from '@citric/icons'
|
|
4
|
+
import { IconButton } from '@citric/ui'
|
|
5
|
+
import { theme } from '@stack-spot/portal-theme'
|
|
6
|
+
import { useTranslate } from '@stack-spot/portal-translate'
|
|
7
|
+
import SyntaxHighlighter from 'react-syntax-highlighter'
|
|
8
|
+
import styled from 'styled-components'
|
|
9
|
+
|
|
10
|
+
const style = {
|
|
11
|
+
scrollable: {
|
|
12
|
+
minHeight: '64px',
|
|
13
|
+
maxHeight: '232px',
|
|
14
|
+
overflow: 'auto',
|
|
15
|
+
'&::-webkit-scrollbar': {
|
|
16
|
+
width: '4px',
|
|
17
|
+
height: '4px',
|
|
18
|
+
},
|
|
19
|
+
'&::-webkit-scrollbar-track': {
|
|
20
|
+
background: 'light.400',
|
|
21
|
+
borderRadius: '2px',
|
|
22
|
+
},
|
|
23
|
+
'&::-webkit-scrollbar-thumb': {
|
|
24
|
+
background: 'light.700',
|
|
25
|
+
borderRadius: '2px',
|
|
26
|
+
},
|
|
27
|
+
},
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
const Wrapper = styled(Box)`
|
|
31
|
+
background-color: ${theme.color.gray[900]};
|
|
32
|
+
border-radius: ${({ theme }) => getRadius(theme as any, 'xs')};
|
|
33
|
+
position: relative;
|
|
34
|
+
padding: 8px;
|
|
35
|
+
overflow: hidden;
|
|
36
|
+
|
|
37
|
+
> .scrollable-container {
|
|
38
|
+
min-height: 64px;
|
|
39
|
+
max-height: 232px;
|
|
40
|
+
overflow: auto;
|
|
41
|
+
&::-webkit-scrollbar {
|
|
42
|
+
width: 4px;
|
|
43
|
+
height: 4px;
|
|
44
|
+
}
|
|
45
|
+
&::-webkit-scrollbar-track {
|
|
46
|
+
background: ${theme.color.light[400]};
|
|
47
|
+
border-radius: 2px;
|
|
48
|
+
}
|
|
49
|
+
&::-webkit-scrollbar-thumb,
|
|
50
|
+
&::-webkit-scrollbar-thumb:hover {
|
|
51
|
+
background: ${theme.color.light[700]};
|
|
52
|
+
border-radius: 2px;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
pre {
|
|
57
|
+
background-color: transparent;
|
|
58
|
+
font-family: 'Roboto Mono';
|
|
59
|
+
font-size: 14.4px;
|
|
60
|
+
padding: 0;
|
|
61
|
+
margin-top: 0;
|
|
62
|
+
overflow: unset;
|
|
63
|
+
text-shadow: none;
|
|
64
|
+
color: ${theme.color.gray[50]};
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
.hljs-string {
|
|
68
|
+
color: ${theme.color.teal[300]};
|
|
69
|
+
}
|
|
70
|
+
.hljs-tag {
|
|
71
|
+
color: ${({ theme }) => getColor(theme as any, 'teal')};
|
|
72
|
+
}
|
|
73
|
+
.hljs-attr {
|
|
74
|
+
color: ${theme.color.gray[50]};
|
|
75
|
+
}
|
|
76
|
+
.hljs-number {
|
|
77
|
+
color: ${theme.color.gray[300]};
|
|
78
|
+
}
|
|
79
|
+
.hljs-property {
|
|
80
|
+
color: ${theme.color.gray[50]};
|
|
81
|
+
}
|
|
82
|
+
.hljs-keyword {
|
|
83
|
+
color: ${theme.color.blue[200]};
|
|
84
|
+
}
|
|
85
|
+
.comment {
|
|
86
|
+
color: ${theme.color.gray[400]};
|
|
87
|
+
}
|
|
88
|
+
.hljs-expression {
|
|
89
|
+
color: ${theme.color.orange[400]};
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
.button-group {
|
|
93
|
+
position: absolute;
|
|
94
|
+
top: 8px;
|
|
95
|
+
right: 24px;
|
|
96
|
+
display: flex;
|
|
97
|
+
|
|
98
|
+
button {
|
|
99
|
+
margin-left: 6px;
|
|
100
|
+
&:focus {
|
|
101
|
+
background-color: ${({ theme }) => getColor(theme as any, 'light.300')};
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
`
|
|
106
|
+
|
|
107
|
+
interface Props {
|
|
108
|
+
language: string,
|
|
109
|
+
data: string,
|
|
110
|
+
onClickRefresh?: () => void,
|
|
111
|
+
height?: string,
|
|
112
|
+
scrollable?: boolean,
|
|
113
|
+
copyButton?: boolean,
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
/**
|
|
117
|
+
* CodeViewer component that displays code with syntax highlighting based on application theme and optional copy and refresh buttons.
|
|
118
|
+
*
|
|
119
|
+
* @param options the props for rendering the component: {@link Props}.
|
|
120
|
+
*/
|
|
121
|
+
export const CodeViewer = ({ language, data, onClickRefresh, scrollable = true, copyButton }: Props) => {
|
|
122
|
+
const t = useTranslate(codeViewerLocale)
|
|
123
|
+
|
|
124
|
+
return (
|
|
125
|
+
<Wrapper>
|
|
126
|
+
{data ? (
|
|
127
|
+
<>
|
|
128
|
+
<Flex style={scrollable ? style.scrollable : undefined}>
|
|
129
|
+
<SyntaxHighlighter language={language} showLineNumbers useInlineStyles={false}>
|
|
130
|
+
{String(data).replace(/\n$/, '')}
|
|
131
|
+
</SyntaxHighlighter>
|
|
132
|
+
</Flex>
|
|
133
|
+
<div className="button-group">
|
|
134
|
+
{onClickRefresh && (
|
|
135
|
+
<IconButton onClick={onClickRefresh}>
|
|
136
|
+
<Refresh />
|
|
137
|
+
</IconButton>
|
|
138
|
+
)}
|
|
139
|
+
|
|
140
|
+
{copyButton ? (
|
|
141
|
+
<IconButton onClick={() => navigator.clipboard.writeText(data)}>
|
|
142
|
+
<Copy />
|
|
143
|
+
</IconButton>
|
|
144
|
+
) : null}
|
|
145
|
+
</div>
|
|
146
|
+
</>
|
|
147
|
+
) : (
|
|
148
|
+
<Text appearance="body2">{t.noData}</Text>
|
|
149
|
+
)}
|
|
150
|
+
</Wrapper>
|
|
151
|
+
)
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
export const codeViewerLocale = {
|
|
155
|
+
en: {
|
|
156
|
+
noData: 'No data available.',
|
|
157
|
+
},
|
|
158
|
+
pt: {
|
|
159
|
+
noData: 'Sem dados disponíveis.',
|
|
160
|
+
},
|
|
161
|
+
}
|