@vygruppen/spor-react 12.24.16 → 13.0.0

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 (84) hide show
  1. package/.turbo/turbo-build.log +10 -10
  2. package/.turbo/turbo-postinstall.log +4 -3
  3. package/CHANGELOG.md +18 -0
  4. package/dist/index.cjs +2753 -2646
  5. package/dist/index.cjs.map +1 -1
  6. package/dist/index.d.cts +887 -601
  7. package/dist/index.d.ts +887 -601
  8. package/dist/index.mjs +2712 -2605
  9. package/dist/index.mjs.map +1 -1
  10. package/package.json +8 -8
  11. package/src/accordion/Accordion.tsx +34 -29
  12. package/src/accordion/Expandable.tsx +20 -21
  13. package/src/alert/Alert.tsx +7 -5
  14. package/src/alert/AlertIcon.tsx +19 -20
  15. package/src/alert/ExpandableAlert.tsx +65 -64
  16. package/src/alert/ServiceAlert.tsx +78 -78
  17. package/src/breadcrumb/Breadcrumb.tsx +37 -34
  18. package/src/button/Button.tsx +64 -57
  19. package/src/button/ButtonGroup.tsx +12 -10
  20. package/src/button/Clipboard.tsx +21 -18
  21. package/src/button/CloseButton.tsx +19 -17
  22. package/src/button/FloatingActionButton.tsx +41 -47
  23. package/src/button/IconButton.tsx +20 -18
  24. package/src/calendar/CalendarContext.tsx +1 -1
  25. package/src/color-mode/color-mode.tsx +7 -5
  26. package/src/datepicker/CalendarTriggerButton.tsx +11 -7
  27. package/src/datepicker/DateField.tsx +53 -51
  28. package/src/datepicker/DatePicker.tsx +127 -134
  29. package/src/datepicker/DateTimeSegment.tsx +44 -40
  30. package/src/datepicker/StyledField.tsx +39 -36
  31. package/src/dialog/Dialog.tsx +14 -11
  32. package/src/dialog/Drawer.tsx +74 -67
  33. package/src/input/AttachedInputs.tsx +35 -41
  34. package/src/input/Autocomplete.tsx +118 -129
  35. package/src/input/CardSelect.tsx +67 -65
  36. package/src/input/Checkbox.tsx +19 -17
  37. package/src/input/CheckboxGroup.tsx +0 -2
  38. package/src/input/ChoiceChip.tsx +42 -38
  39. package/src/input/Combobox.tsx +4 -4
  40. package/src/input/CountryCodeSelect.tsx +8 -8
  41. package/src/input/Field.tsx +78 -75
  42. package/src/input/FloatingLabel.tsx +6 -8
  43. package/src/input/Input.tsx +87 -92
  44. package/src/input/ListBox.tsx +3 -4
  45. package/src/input/Menu.tsx +149 -142
  46. package/src/input/NativeSelect.tsx +7 -5
  47. package/src/input/NumericStepper.tsx +15 -12
  48. package/src/input/PasswordInput.tsx +65 -61
  49. package/src/input/PhoneNumberInput.tsx +7 -7
  50. package/src/input/Popover.tsx +52 -55
  51. package/src/input/Radio.tsx +16 -11
  52. package/src/input/SearchInput.tsx +32 -31
  53. package/src/input/Select.tsx +106 -96
  54. package/src/input/Switch.tsx +43 -41
  55. package/src/input/Textarea.tsx +68 -66
  56. package/src/layout/PressableCard.tsx +11 -10
  57. package/src/layout/RadioCard.tsx +57 -53
  58. package/src/layout/Separator.tsx +8 -7
  59. package/src/layout/StaticCard.tsx +11 -10
  60. package/src/linjetag/LineIcon.tsx +48 -54
  61. package/src/linjetag/TravelTag.tsx +57 -59
  62. package/src/link/TextLink.tsx +50 -40
  63. package/src/loader/ProgressBar.tsx +41 -46
  64. package/src/loader/ProgressLoader.tsx +83 -86
  65. package/src/loader/Skeleton.tsx +56 -48
  66. package/src/logo/CargonetLogo.tsx +88 -87
  67. package/src/logo/VyLogo.tsx +80 -77
  68. package/src/logo/VyLogoPride.tsx +137 -135
  69. package/src/media-controller/JumpButton.tsx +30 -28
  70. package/src/media-controller/PlayPauseButton.tsx +8 -7
  71. package/src/media-controller/SkipButton.tsx +28 -26
  72. package/src/nudge/Nudge.tsx +66 -70
  73. package/src/pagination/Pagination.tsx +52 -46
  74. package/src/popover/index.tsx +46 -41
  75. package/src/progress-indicator/ProgressIndicator.tsx +10 -7
  76. package/src/stepper/Stepper.tsx +84 -81
  77. package/src/tab/Tabs.tsx +8 -4
  78. package/src/table/Table.tsx +89 -109
  79. package/src/tooltip.tsx +26 -22
  80. package/src/typography/Badge.tsx +8 -5
  81. package/src/typography/Code.tsx +8 -5
  82. package/src/typography/Heading.tsx +22 -23
  83. package/src/typography/Text.tsx +11 -9
  84. package/tsconfig.json +1 -0
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@vygruppen/spor-react",
3
3
  "type": "module",
4
- "version": "12.24.16",
4
+ "version": "13.0.0",
5
5
  "exports": {
6
6
  ".": {
7
7
  "types": "./dist/index.d.ts",
@@ -46,8 +46,8 @@
46
46
  "react-stately": "^3.31.1",
47
47
  "react-swipeable": "^7.0.1",
48
48
  "usehooks-ts": "^3.1.0",
49
- "@vygruppen/spor-icon-react": "4.5.3",
50
49
  "@vygruppen/spor-design-tokens": "4.3.3",
50
+ "@vygruppen/spor-icon-react": "5.0.0",
51
51
  "@vygruppen/spor-loader": "0.7.0"
52
52
  },
53
53
  "devDependencies": {
@@ -56,13 +56,13 @@
56
56
  "@testing-library/jest-dom": "^6.4.5",
57
57
  "@testing-library/react": "^14.3.1",
58
58
  "@types/node": "^22.13.4",
59
- "@types/react": "^18.3.3",
60
- "@types/react-dom": "^18.3.0",
59
+ "@types/react": "19.2.3",
60
+ "@types/react-dom": "19.2.3",
61
61
  "clsx": "^2.1.1",
62
62
  "concurrently": "^9.1.2",
63
63
  "eslint": "^9.39.1",
64
- "react": "^18.3.1",
65
- "react-dom": "^18.3.1",
64
+ "react": "19.2.3",
65
+ "react-dom": "19.2.3",
66
66
  "tsup": "^7.2.0",
67
67
  "typescript": "^5.7.3",
68
68
  "vitest": "^0.26.3",
@@ -72,8 +72,8 @@
72
72
  "@vygruppen/tsconfig": "0.1.1"
73
73
  },
74
74
  "peerDependencies": {
75
- "react": ">=18.0.0 <19.0.0",
76
- "react-dom": ">=18.0.0 <19.0.0"
75
+ "react": ">=19.0.0",
76
+ "react-dom": ">=19.0.0"
77
77
  },
78
78
  "scripts": {
79
79
  "build": "tsup",
@@ -8,7 +8,6 @@ import {
8
8
  useSlotRecipe,
9
9
  } from "@chakra-ui/react";
10
10
  import { DropdownDownFill24Icon } from "@vygruppen/spor-icon-react";
11
- import { forwardRef } from "react";
12
11
 
13
12
  import { warnAboutMismatchingIcon } from "./helpers";
14
13
  import {
@@ -53,28 +52,33 @@ import {
53
52
  * @see https://spor.vy.no/components/accordion
54
53
  */
55
54
 
56
- export const Accordion = forwardRef<HTMLDivElement, AccordionProps>(
57
- (props, ref) => {
58
- const { variant = "core", children, gap = 2, css, ...rest } = props;
59
- const recipe = useSlotRecipe({ key: "accordion" });
60
- const styles = recipe({ variant });
61
- return (
62
- <ChakraAccordion.Root
63
- {...rest}
64
- ref={ref}
65
- css={{ ...styles.root, ...css }}
66
- variant={variant}
67
- >
68
- <Stack gap={gap}>{children}</Stack>
69
- </ChakraAccordion.Root>
70
- );
71
- },
72
- );
55
+ export const Accordion = ({
56
+ ref,
57
+ ...props
58
+ }: AccordionProps & {
59
+ ref?: React.RefObject<HTMLDivElement>;
60
+ }) => {
61
+ const { variant = "core", children, gap = 2, css, ...rest } = props;
62
+ const recipe = useSlotRecipe({ key: "accordion" });
63
+ const styles = recipe({ variant });
64
+ return (
65
+ <ChakraAccordion.Root
66
+ {...rest}
67
+ ref={ref}
68
+ css={{ ...styles.root, ...css }}
69
+ variant={variant}
70
+ >
71
+ <Stack gap={gap}>{children}</Stack>
72
+ </ChakraAccordion.Root>
73
+ );
74
+ };
73
75
 
74
- export const AccordionItemTrigger = forwardRef<
75
- HTMLButtonElement,
76
- AccordionItemTriggerProps
77
- >(function AccordionItemTrigger(props, ref) {
76
+ export const AccordionItemTrigger = function AccordionItemTrigger({
77
+ ref,
78
+ ...props
79
+ }: AccordionItemTriggerProps & {
80
+ ref?: React.RefObject<HTMLButtonElement>;
81
+ }) {
78
82
  const {
79
83
  startElement,
80
84
  children,
@@ -105,12 +109,14 @@ export const AccordionItemTrigger = forwardRef<
105
109
  </ChakraAccordion.ItemTrigger>
106
110
  </Box>
107
111
  );
108
- });
112
+ };
109
113
 
110
- export const AccordionItemContent = forwardRef<
111
- HTMLDivElement,
112
- AccordionItemContentProps
113
- >(function AccordionItemContent(props, ref) {
114
+ export const AccordionItemContent = function AccordionItemContent({
115
+ ref,
116
+ ...props
117
+ }: AccordionItemContentProps & {
118
+ ref?: React.RefObject<HTMLDivElement>;
119
+ }) {
114
120
  const {
115
121
  children,
116
122
  css,
@@ -133,7 +139,6 @@ export const AccordionItemContent = forwardRef<
133
139
  </ChakraAccordion.ItemBody>
134
140
  </ChakraAccordion.ItemContent>
135
141
  );
136
- });
137
- Accordion.displayName = "Accordion";
142
+ };
138
143
 
139
144
  export const AccordionItem = ChakraAccordion.Item;
@@ -1,7 +1,5 @@
1
1
  "use client";
2
2
 
3
- import { forwardRef } from "react";
4
-
5
3
  import {
6
4
  Accordion,
7
5
  AccordionItem,
@@ -24,23 +22,26 @@ import { ExpandableItemProps, ExpandableProps } from "./types";
24
22
  * ```
25
23
  */
26
24
 
27
- export const Expandable = forwardRef<HTMLDivElement, ExpandableProps>(
28
- (props, ref) => {
29
- const { title, children, headingLevel, startElement, ...rest } = props;
30
- return (
31
- <Accordion ref={ref} {...rest}>
32
- <ExpandableItem
33
- title={title}
34
- headingLevel={headingLevel}
35
- startElement={startElement}
36
- value="single-expandable"
37
- >
38
- {children}
39
- </ExpandableItem>
40
- </Accordion>
41
- );
42
- },
43
- );
25
+ export const Expandable = ({
26
+ ref,
27
+ ...props
28
+ }: ExpandableProps & {
29
+ ref?: React.RefObject<HTMLDivElement>;
30
+ }) => {
31
+ const { title, children, headingLevel, startElement, ...rest } = props;
32
+ return (
33
+ <Accordion ref={ref} {...rest}>
34
+ <ExpandableItem
35
+ title={title}
36
+ headingLevel={headingLevel}
37
+ startElement={startElement}
38
+ value="single-expandable"
39
+ >
40
+ {children}
41
+ </ExpandableItem>
42
+ </Accordion>
43
+ );
44
+ };
44
45
 
45
46
  /**
46
47
  * An item in a set of Expandables. Must be wrapped in an `<Accordion>` component.
@@ -85,5 +86,3 @@ export const ExpandableItem = (props: ExpandableItemProps) => {
85
86
  </AccordionItem>
86
87
  );
87
88
  };
88
-
89
- Expandable.displayName = "Expandable";
@@ -7,7 +7,6 @@ import {
7
7
  useSlotRecipe,
8
8
  } from "@chakra-ui/react";
9
9
  import { IconComponent } from "@vygruppen/spor-icon-react";
10
- import { forwardRef } from "react";
11
10
 
12
11
  import { CloseButton } from "@/button";
13
12
 
@@ -44,7 +43,12 @@ export type AlertProps = Omit<ChakraAlert.RootProps, "colorPalette"> & {
44
43
  * @see Docs https://spor.vy.no/alert
45
44
  */
46
45
 
47
- export const Alert = forwardRef<HTMLDivElement, AlertProps>((props, ref) => {
46
+ export const Alert = ({
47
+ ref,
48
+ ...props
49
+ }: AlertProps & {
50
+ ref?: React.RefObject<HTMLDivElement>;
51
+ }) => {
48
52
  const {
49
53
  title,
50
54
  showIndicator = true,
@@ -109,6 +113,4 @@ export const Alert = forwardRef<HTMLDivElement, AlertProps>((props, ref) => {
109
113
  )}
110
114
  </ChakraAlert.Root>
111
115
  );
112
- });
113
-
114
- Alert.displayName = "Alert";
116
+ };
@@ -12,7 +12,6 @@ import {
12
12
  SuccessFill24Icon,
13
13
  WarningFill24Icon,
14
14
  } from "@vygruppen/spor-icon-react";
15
- import { forwardRef } from "react";
16
15
  import { VisuallyHidden } from "react-aria";
17
16
 
18
17
  import { createTexts, useTranslation } from "../i18n";
@@ -26,26 +25,26 @@ type AlertIconProps = {
26
25
  /**
27
26
  * Internal component that shows the correct icon for the alert
28
27
  */
29
- export const AlertIcon = forwardRef<SVGSVGElement, AlertIconProps>(
30
- ({ variant, customIcon: CustomAlertIcon }, ref) => {
31
- const { t } = useTranslation();
32
-
33
- return (
34
- <Box ref={ref}>
35
- <VisuallyHidden>
36
- {t(texts[variant as keyof typeof texts])}
37
- </VisuallyHidden>
38
- {CustomAlertIcon ? (
39
- <CustomAlertIcon color={`alert.${variant}.icon`} />
40
- ) : (
41
- <BaseAlertIcon variant={variant} />
42
- )}
43
- </Box>
44
- );
45
- },
46
- );
28
+ export const AlertIcon = ({
29
+ ref,
30
+ variant,
31
+ customIcon: CustomAlertIcon,
32
+ }: AlertIconProps & {
33
+ ref?: React.RefObject<SVGSVGElement>;
34
+ }) => {
35
+ const { t } = useTranslation();
47
36
 
48
- AlertIcon.displayName = "AlertIcon";
37
+ return (
38
+ <Box ref={ref}>
39
+ <VisuallyHidden>{t(texts[variant as keyof typeof texts])}</VisuallyHidden>
40
+ {CustomAlertIcon ? (
41
+ <CustomAlertIcon color={`alert.${variant}.icon`} />
42
+ ) : (
43
+ <BaseAlertIcon variant={variant} />
44
+ )}
45
+ </Box>
46
+ );
47
+ };
49
48
 
50
49
  export const BaseAlertIcon = ({
51
50
  variant,
@@ -10,7 +10,7 @@ import {
10
10
  useSlotRecipe,
11
11
  } from "@chakra-ui/react";
12
12
  import { DropdownDownFill18Icon } from "@vygruppen/spor-icon-react";
13
- import { forwardRef, PropsWithChildren } from "react";
13
+ import { PropsWithChildren } from "react";
14
14
 
15
15
  import { AccordionItemContent } from "@/accordion";
16
16
  import { alertExpandableSlotRecipe } from "@/theme/slot-recipes/alert-expandable";
@@ -59,70 +59,71 @@ type ExpandableAlertProps = PropsWithChildren<ExpandableAlertVariantProps> &
59
59
  * </ExpandableAlert>
60
60
  * ```
61
61
  */
62
- export const ExpandableAlert = forwardRef<HTMLDivElement, ExpandableAlertProps>(
63
- (props, ref) => {
64
- const {
65
- variant = "info",
66
- children,
67
- title,
68
- collapsible = true,
69
- headingLevel = "h3",
70
- defaultOpen = false,
71
- css,
72
- ...rest
73
- } = props;
74
- const recipe = useSlotRecipe({ key: "alertExpandable" });
75
- const styles = recipe({ variant });
62
+ export const ExpandableAlert = ({
63
+ ref,
64
+ ...props
65
+ }: ExpandableAlertProps & {
66
+ ref?: React.RefObject<HTMLDivElement>;
67
+ }) => {
68
+ const {
69
+ variant = "info",
70
+ children,
71
+ title,
72
+ collapsible = true,
73
+ headingLevel = "h3",
74
+ defaultOpen = false,
75
+ css,
76
+ ...rest
77
+ } = props;
78
+ const recipe = useSlotRecipe({ key: "alertExpandable" });
79
+ const styles = recipe({ variant });
76
80
 
77
- const defaultValue = "alert-expandable";
81
+ const defaultValue = "alert-expandable";
78
82
 
79
- return (
80
- <Accordion.Root
81
- defaultValue={defaultOpen ? [defaultValue] : undefined}
82
- ref={ref}
83
- css={{ ...styles.root, ...css }}
84
- collapsible={collapsible}
85
- {...rest}
86
- >
87
- <Accordion.Item value={defaultValue}>
88
- <Accordion.ItemTrigger css={styles.itemTrigger}>
89
- <HStack
90
- gap="1"
91
- alignItems="center"
92
- justifyContent="space-between"
93
- flex="1"
94
- width="full"
95
- >
96
- <HStack gap="1" alignItems="center">
97
- <Box css={styles.indicator}>
98
- <AlertIcon variant={variant} />
99
- </Box>
100
- <Span
101
- as={headingLevel}
102
- css={{
103
- // Truncate the title to one line
104
- display: "-webkit-box",
105
- overflow: "hidden",
106
- WebkitLineClamp: "1",
107
- WebkitBoxOrient: "vertical",
108
- }}
109
- >
110
- {title}
111
- </Span>
112
- </HStack>
113
-
114
- <Accordion.ItemIndicator>
115
- <DropdownDownFill18Icon />
116
- </Accordion.ItemIndicator>
83
+ return (
84
+ <Accordion.Root
85
+ defaultValue={defaultOpen ? [defaultValue] : undefined}
86
+ ref={ref}
87
+ css={{ ...styles.root, ...css }}
88
+ collapsible={collapsible}
89
+ {...rest}
90
+ >
91
+ <Accordion.Item value={defaultValue}>
92
+ <Accordion.ItemTrigger css={styles.itemTrigger}>
93
+ <HStack
94
+ gap="1"
95
+ alignItems="center"
96
+ justifyContent="space-between"
97
+ flex="1"
98
+ width="full"
99
+ >
100
+ <HStack gap="1" alignItems="center">
101
+ <Box css={styles.indicator}>
102
+ <AlertIcon variant={variant} />
103
+ </Box>
104
+ <Span
105
+ as={headingLevel}
106
+ css={{
107
+ // Truncate the title to one line
108
+ display: "-webkit-box",
109
+ overflow: "hidden",
110
+ WebkitLineClamp: "1",
111
+ WebkitBoxOrient: "vertical",
112
+ }}
113
+ >
114
+ {title}
115
+ </Span>
117
116
  </HStack>
118
- </Accordion.ItemTrigger>
119
- <AccordionItemContent css={styles.itemContent}>
120
- {children}
121
- </AccordionItemContent>
122
- </Accordion.Item>
123
- </Accordion.Root>
124
- );
125
- },
126
- );
127
117
 
128
- ExpandableAlert.displayName = "ExpandableAlert";
118
+ <Accordion.ItemIndicator>
119
+ <DropdownDownFill18Icon />
120
+ </Accordion.ItemIndicator>
121
+ </HStack>
122
+ </Accordion.ItemTrigger>
123
+ <AccordionItemContent css={styles.itemContent}>
124
+ {children}
125
+ </AccordionItemContent>
126
+ </Accordion.Item>
127
+ </Accordion.Root>
128
+ );
129
+ };
@@ -14,7 +14,7 @@ import {
14
14
  ServiceFill24Icon,
15
15
  WarningFill24Icon,
16
16
  } from "@vygruppen/spor-icon-react";
17
- import { forwardRef, PropsWithChildren } from "react";
17
+ import { PropsWithChildren } from "react";
18
18
 
19
19
  import { createTexts, useTranslation } from "../i18n";
20
20
  import { alertServiceSlotRecipe } from "../theme/slot-recipes/alert-service";
@@ -57,86 +57,86 @@ type ServiceAlertProps = Omit<AlertProps, "variant"> &
57
57
  * ```
58
58
  */
59
59
 
60
- export const ServiceAlert = forwardRef<HTMLDivElement, ServiceAlertProps>(
61
- (props, ref) => {
62
- const {
63
- variant = "service",
64
- children,
65
- title,
66
- notification,
67
- contentWidth = "container.md",
68
- headingLevel = "h3",
69
- defaultOpen = false,
70
- collapsible = true,
71
- css,
72
- ...rest
73
- } = props;
74
- const { t } = useTranslation();
75
- const recipe = useSlotRecipe({ key: "alertService" });
76
- const styles = recipe({ variant });
60
+ export const ServiceAlert = ({
61
+ ref,
62
+ ...props
63
+ }: ServiceAlertProps & {
64
+ ref?: React.RefObject<HTMLDivElement>;
65
+ }) => {
66
+ const {
67
+ variant = "service",
68
+ children,
69
+ title,
70
+ notification,
71
+ contentWidth = "container.md",
72
+ headingLevel = "h3",
73
+ defaultOpen = false,
74
+ collapsible = true,
75
+ css,
76
+ ...rest
77
+ } = props;
78
+ const { t } = useTranslation();
79
+ const recipe = useSlotRecipe({ key: "alertService" });
80
+ const styles = recipe({ variant });
77
81
 
78
- const defaultValue = "spor-service-alert";
79
- return (
80
- <Accordion.Root
81
- defaultValue={defaultOpen ? [defaultValue] : undefined}
82
- collapsible={collapsible}
83
- css={{ ...styles.root, ...css }}
84
- ref={ref}
85
- {...rest}
86
- >
87
- <Accordion.Item value={defaultValue}>
88
- <Accordion.ItemTrigger css={styles.itemTrigger}>
89
- <HStack
90
- justifyContent="space-between"
91
- alignContent="center"
92
- width="100%"
93
- maxWidth={contentWidth}
94
- >
95
- <HStack as={headingLevel} alignItems="center" gap="1">
96
- {variant === "service" ? (
97
- <ServiceFill24Icon aria-label={t(texts.service)} />
98
- ) : (
99
- <WarningFill24Icon
100
- aria-label={t(texts["global-deviation"])}
101
- />
102
- )}
103
- <Span
104
- css={{
105
- // Truncate the title to one line
106
- display: "-webkit-box",
107
- overflow: "hidden",
108
- WebkitLineClamp: "1",
109
- WebkitBoxOrient: "vertical",
110
- ...styles.itemTriggerTitle,
111
- }}
112
- >
113
- {title}
114
- </Span>
115
- </HStack>
116
- <Flex alignItems="center" gap={[0.5, null, null, 1]}>
117
- {notification && (
118
- <Text css={styles.notificationText}>
119
- {t(texts.notification(notification))}
120
- </Text>
121
- )}
122
- <Accordion.ItemIndicator>
123
- <DropdownDownFill24Icon color="icon.inverted" />
124
- </Accordion.ItemIndicator>
125
- </Flex>
82
+ const defaultValue = "spor-service-alert";
83
+ return (
84
+ <Accordion.Root
85
+ defaultValue={defaultOpen ? [defaultValue] : undefined}
86
+ collapsible={collapsible}
87
+ css={{ ...styles.root, ...css }}
88
+ ref={ref}
89
+ {...rest}
90
+ >
91
+ <Accordion.Item value={defaultValue}>
92
+ <Accordion.ItemTrigger css={styles.itemTrigger}>
93
+ <HStack
94
+ justifyContent="space-between"
95
+ alignContent="center"
96
+ width="100%"
97
+ maxWidth={contentWidth}
98
+ >
99
+ <HStack as={headingLevel} alignItems="center" gap="1">
100
+ {variant === "service" ? (
101
+ <ServiceFill24Icon aria-label={t(texts.service)} />
102
+ ) : (
103
+ <WarningFill24Icon aria-label={t(texts["global-deviation"])} />
104
+ )}
105
+ <Span
106
+ css={{
107
+ // Truncate the title to one line
108
+ display: "-webkit-box",
109
+ overflow: "hidden",
110
+ WebkitLineClamp: "1",
111
+ WebkitBoxOrient: "vertical",
112
+ ...styles.itemTriggerTitle,
113
+ }}
114
+ >
115
+ {title}
116
+ </Span>
126
117
  </HStack>
127
- </Accordion.ItemTrigger>
118
+ <Flex alignItems="center" gap={[0.5, null, null, 1]}>
119
+ {notification && (
120
+ <Text css={styles.notificationText}>
121
+ {t(texts.notification(notification))}
122
+ </Text>
123
+ )}
124
+ <Accordion.ItemIndicator>
125
+ <DropdownDownFill24Icon color="icon.inverted" />
126
+ </Accordion.ItemIndicator>
127
+ </Flex>
128
+ </HStack>
129
+ </Accordion.ItemTrigger>
128
130
 
129
- <Accordion.ItemContent css={styles.itemContent}>
130
- <Accordion.ItemBody maxWidth={contentWidth} css={styles.itemBody}>
131
- {children}
132
- </Accordion.ItemBody>
133
- </Accordion.ItemContent>
134
- </Accordion.Item>
135
- </Accordion.Root>
136
- );
137
- },
138
- );
139
- ServiceAlert.displayName = "ServiceAlert";
131
+ <Accordion.ItemContent css={styles.itemContent}>
132
+ <Accordion.ItemBody maxWidth={contentWidth} css={styles.itemBody}>
133
+ {children}
134
+ </Accordion.ItemBody>
135
+ </Accordion.ItemContent>
136
+ </Accordion.Item>
137
+ </Accordion.Root>
138
+ );
139
+ };
140
140
 
141
141
  const texts = createTexts({
142
142
  notification: (notification) => {