@navikt/ds-react 7.22.0 → 7.23.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 (178) hide show
  1. package/cjs/alert/Alert.d.ts +4 -0
  2. package/cjs/alert/Alert.js +15 -1
  3. package/cjs/alert/Alert.js.map +1 -1
  4. package/cjs/button/Button.js +30 -2
  5. package/cjs/button/Button.js.map +1 -1
  6. package/cjs/chat/Chat.js +14 -2
  7. package/cjs/chat/Chat.js.map +1 -1
  8. package/cjs/chips/Removable.js +22 -2
  9. package/cjs/chips/Removable.js.map +1 -1
  10. package/cjs/chips/Toggle.js +24 -5
  11. package/cjs/chips/Toggle.js.map +1 -1
  12. package/cjs/expansion-card/ExpansionCard.js +2 -2
  13. package/cjs/expansion-card/ExpansionCard.js.map +1 -1
  14. package/cjs/form/checkbox/Checkbox.js +1 -1
  15. package/cjs/form/checkbox/Checkbox.js.map +1 -1
  16. package/cjs/form/combobox/SelectedOptions/SelectedOptions.js +1 -1
  17. package/cjs/form/combobox/SelectedOptions/SelectedOptions.js.map +1 -1
  18. package/cjs/form/confirmation-panel/ConfirmationPanel.js +2 -2
  19. package/cjs/form/confirmation-panel/ConfirmationPanel.js.map +1 -1
  20. package/cjs/form/error-summary/ErrorSummary.js +1 -1
  21. package/cjs/form/error-summary/ErrorSummary.js.map +1 -1
  22. package/cjs/form/form-summary/FormSummaryAnswers.js +2 -2
  23. package/cjs/form/form-summary/FormSummaryAnswers.js.map +1 -1
  24. package/cjs/form/radio/Radio.js +1 -1
  25. package/cjs/form/radio/Radio.js.map +1 -1
  26. package/cjs/form/search/Search.d.ts +1 -1
  27. package/cjs/form/search/Search.js +2 -2
  28. package/cjs/form/search/Search.js.map +1 -1
  29. package/cjs/guide-panel/GuidePanel.js +3 -3
  30. package/cjs/guide-panel/GuidePanel.js.map +1 -1
  31. package/cjs/guide-panel/Illustration.darkside.js +1 -1
  32. package/cjs/guide-panel/Illustration.darkside.js.map +1 -1
  33. package/cjs/help-text/HelpText.js +2 -2
  34. package/cjs/help-text/HelpText.js.map +1 -1
  35. package/cjs/layout/box/Box.darkside.d.ts +4 -4
  36. package/cjs/layout/box/Box.darkside.js.map +1 -1
  37. package/cjs/layout/utilities/types.d.ts +8 -8
  38. package/cjs/link/Link.js +26 -2
  39. package/cjs/link/Link.js.map +1 -1
  40. package/cjs/loader/Loader.d.ts +5 -0
  41. package/cjs/loader/Loader.js +15 -2
  42. package/cjs/loader/Loader.js.map +1 -1
  43. package/cjs/overlays/action-menu/ActionMenu.js +5 -5
  44. package/cjs/overlays/action-menu/ActionMenu.js.map +1 -1
  45. package/cjs/pagination/Pagination.js +5 -7
  46. package/cjs/pagination/Pagination.js.map +1 -1
  47. package/cjs/pagination/PaginationItem.js +2 -2
  48. package/cjs/pagination/PaginationItem.js.map +1 -1
  49. package/cjs/portal/Portal.js +1 -1
  50. package/cjs/portal/Portal.js.map +1 -1
  51. package/cjs/stepper/Stepper.js +3 -2
  52. package/cjs/stepper/Stepper.js.map +1 -1
  53. package/cjs/tag/Tag.js +39 -3
  54. package/cjs/tag/Tag.js.map +1 -1
  55. package/cjs/theme/Theme.d.ts +10 -1
  56. package/cjs/theme/Theme.js +3 -3
  57. package/cjs/theme/Theme.js.map +1 -1
  58. package/cjs/timeline/Pin.js +1 -3
  59. package/cjs/timeline/Pin.js.map +1 -1
  60. package/cjs/timeline/period/ClickablePeriod.js +3 -5
  61. package/cjs/timeline/period/ClickablePeriod.js.map +1 -1
  62. package/cjs/timeline/period/NonClickablePeriod.js +2 -1
  63. package/cjs/timeline/period/NonClickablePeriod.js.map +1 -1
  64. package/cjs/timeline/utils/period.d.ts +1 -1
  65. package/cjs/timeline/utils/period.js.map +1 -1
  66. package/cjs/toggle-group/ToggleGroup.js +21 -3
  67. package/cjs/toggle-group/ToggleGroup.js.map +1 -1
  68. package/cjs/types/index.d.ts +1 -0
  69. package/cjs/types/index.js +18 -0
  70. package/cjs/types/index.js.map +1 -0
  71. package/esm/alert/Alert.d.ts +4 -0
  72. package/esm/alert/Alert.js +15 -1
  73. package/esm/alert/Alert.js.map +1 -1
  74. package/esm/button/Button.js +30 -2
  75. package/esm/button/Button.js.map +1 -1
  76. package/esm/chat/Chat.js +14 -2
  77. package/esm/chat/Chat.js.map +1 -1
  78. package/esm/chips/Removable.js +23 -3
  79. package/esm/chips/Removable.js.map +1 -1
  80. package/esm/chips/Toggle.js +25 -6
  81. package/esm/chips/Toggle.js.map +1 -1
  82. package/esm/expansion-card/ExpansionCard.js +2 -2
  83. package/esm/expansion-card/ExpansionCard.js.map +1 -1
  84. package/esm/form/checkbox/Checkbox.js +1 -1
  85. package/esm/form/checkbox/Checkbox.js.map +1 -1
  86. package/esm/form/combobox/SelectedOptions/SelectedOptions.js +1 -1
  87. package/esm/form/combobox/SelectedOptions/SelectedOptions.js.map +1 -1
  88. package/esm/form/confirmation-panel/ConfirmationPanel.js +2 -2
  89. package/esm/form/confirmation-panel/ConfirmationPanel.js.map +1 -1
  90. package/esm/form/error-summary/ErrorSummary.js +1 -1
  91. package/esm/form/error-summary/ErrorSummary.js.map +1 -1
  92. package/esm/form/form-summary/FormSummaryAnswers.js +2 -2
  93. package/esm/form/form-summary/FormSummaryAnswers.js.map +1 -1
  94. package/esm/form/radio/Radio.js +1 -1
  95. package/esm/form/radio/Radio.js.map +1 -1
  96. package/esm/form/search/Search.d.ts +1 -1
  97. package/esm/form/search/Search.js +2 -2
  98. package/esm/form/search/Search.js.map +1 -1
  99. package/esm/guide-panel/GuidePanel.js +3 -3
  100. package/esm/guide-panel/GuidePanel.js.map +1 -1
  101. package/esm/guide-panel/Illustration.darkside.js +1 -1
  102. package/esm/guide-panel/Illustration.darkside.js.map +1 -1
  103. package/esm/help-text/HelpText.js +2 -2
  104. package/esm/help-text/HelpText.js.map +1 -1
  105. package/esm/layout/box/Box.darkside.d.ts +4 -4
  106. package/esm/layout/box/Box.darkside.js.map +1 -1
  107. package/esm/layout/utilities/types.d.ts +8 -8
  108. package/esm/link/Link.js +27 -3
  109. package/esm/link/Link.js.map +1 -1
  110. package/esm/loader/Loader.d.ts +5 -0
  111. package/esm/loader/Loader.js +15 -2
  112. package/esm/loader/Loader.js.map +1 -1
  113. package/esm/overlays/action-menu/ActionMenu.js +5 -5
  114. package/esm/overlays/action-menu/ActionMenu.js.map +1 -1
  115. package/esm/pagination/Pagination.js +5 -7
  116. package/esm/pagination/Pagination.js.map +1 -1
  117. package/esm/pagination/PaginationItem.js +2 -2
  118. package/esm/pagination/PaginationItem.js.map +1 -1
  119. package/esm/portal/Portal.js +1 -1
  120. package/esm/portal/Portal.js.map +1 -1
  121. package/esm/stepper/Stepper.js +3 -2
  122. package/esm/stepper/Stepper.js.map +1 -1
  123. package/esm/tag/Tag.js +39 -3
  124. package/esm/tag/Tag.js.map +1 -1
  125. package/esm/theme/Theme.d.ts +10 -1
  126. package/esm/theme/Theme.js +3 -3
  127. package/esm/theme/Theme.js.map +1 -1
  128. package/esm/timeline/Pin.js +2 -4
  129. package/esm/timeline/Pin.js.map +1 -1
  130. package/esm/timeline/period/ClickablePeriod.js +4 -6
  131. package/esm/timeline/period/ClickablePeriod.js.map +1 -1
  132. package/esm/timeline/period/NonClickablePeriod.js +2 -1
  133. package/esm/timeline/period/NonClickablePeriod.js.map +1 -1
  134. package/esm/timeline/utils/period.d.ts +1 -1
  135. package/esm/timeline/utils/period.js.map +1 -1
  136. package/esm/toggle-group/ToggleGroup.js +22 -4
  137. package/esm/toggle-group/ToggleGroup.js.map +1 -1
  138. package/esm/types/index.d.ts +1 -0
  139. package/esm/types/index.js +2 -0
  140. package/esm/types/index.js.map +1 -0
  141. package/esm/types/theme.d.ts +15 -0
  142. package/package.json +12 -7
  143. package/src/alert/Alert.tsx +22 -0
  144. package/src/button/Button.tsx +38 -0
  145. package/src/chat/Chat.tsx +17 -0
  146. package/src/chips/Removable.tsx +30 -3
  147. package/src/chips/Toggle.tsx +31 -13
  148. package/src/expansion-card/ExpansionCard.tsx +2 -0
  149. package/src/form/checkbox/Checkbox.tsx +1 -0
  150. package/src/form/combobox/SelectedOptions/SelectedOptions.tsx +6 -1
  151. package/src/form/confirmation-panel/ConfirmationPanel.tsx +2 -2
  152. package/src/form/error-summary/ErrorSummary.tsx +1 -1
  153. package/src/form/form-summary/FormSummaryAnswers.tsx +23 -12
  154. package/src/form/radio/Radio.tsx +1 -0
  155. package/src/form/search/Search.tsx +3 -2
  156. package/src/guide-panel/GuidePanel.tsx +13 -2
  157. package/src/guide-panel/Illustration.darkside.tsx +1 -6
  158. package/src/help-text/HelpText.tsx +5 -1
  159. package/src/layout/box/Box.darkside.tsx +10 -8
  160. package/src/layout/utilities/css.ts +8 -8
  161. package/src/layout/utilities/types.ts +18 -16
  162. package/src/link/Link.tsx +36 -3
  163. package/src/loader/Loader.tsx +24 -0
  164. package/src/overlays/action-menu/ActionMenu.tsx +5 -5
  165. package/src/pagination/Pagination.tsx +5 -0
  166. package/src/pagination/PaginationItem.tsx +3 -1
  167. package/src/portal/Portal.tsx +6 -1
  168. package/src/react-css.d.ts +0 -4
  169. package/src/stepper/Stepper.tsx +4 -3
  170. package/src/tag/Tag.tsx +53 -4
  171. package/src/theme/Theme.tsx +13 -2
  172. package/src/timeline/Pin.tsx +1 -3
  173. package/src/timeline/period/ClickablePeriod.tsx +2 -3
  174. package/src/timeline/period/NonClickablePeriod.tsx +1 -0
  175. package/src/timeline/utils/period.ts +1 -1
  176. package/src/toggle-group/ToggleGroup.tsx +28 -3
  177. package/src/types/index.ts +1 -0
  178. package/src/types/theme.d.ts +15 -0
@@ -669,7 +669,7 @@ export const ActionMenuCheckboxItem = forwardRef<
669
669
  width="24"
670
670
  height="24"
671
671
  rx="4"
672
- fill="var(--ax-bg-accent-strong-pressed, var(--a-surface-action-selected))"
672
+ fill="var(--ax-bg-strong-pressed, var(--a-surface-action-selected))"
673
673
  />
674
674
  <rect
675
675
  x="6"
@@ -685,7 +685,7 @@ export const ActionMenuCheckboxItem = forwardRef<
685
685
  width="24"
686
686
  height="24"
687
687
  rx="4"
688
- fill="var(--ax-bg-accent-strong-pressed, var(--a-surface-action-selected))"
688
+ fill="var(--ax-bg-strong-pressed, var(--a-surface-action-selected))"
689
689
  />
690
690
  <path
691
691
  d="M10.0352 13.4148L16.4752 7.40467C17.0792 6.83965 18.029 6.86933 18.5955 7.47478C19.162 8.08027 19.1296 9.03007 18.5245 9.59621L11.0211 16.5993C10.741 16.859 10.3756 17 10.0002 17C9.60651 17 9.22717 16.8462 8.93914 16.5611L6.43914 14.0611C5.85362 13.4756 5.85362 12.5254 6.43914 11.9399C7.02467 11.3544 7.97483 11.3544 8.56036 11.9399L10.0352 13.4148Z"
@@ -808,7 +808,7 @@ export const ActionMenuRadioItem = forwardRef<
808
808
  width="24"
809
809
  height="24"
810
810
  rx="12"
811
- fill="var(--ax-bg-accent-strong-pressed)"
811
+ fill="var(--ax-bg-strong-pressed)"
812
812
  />
813
813
  <rect
814
814
  x="8"
@@ -835,12 +835,12 @@ export const ActionMenuRadioItem = forwardRef<
835
835
  width="22"
836
836
  height="22"
837
837
  rx="11"
838
- stroke="var(--ax-bg-accent-strong-pressed, var(--a-surface-action-selected))"
838
+ stroke="var(--ax-bg-strong-pressed, var(--a-surface-action-selected))"
839
839
  strokeWidth="2"
840
840
  />
841
841
  <path
842
842
  d="M20 12C20 16.4178 16.4178 20 12 20C7.58222 20 4 16.4178 4 12C4 7.58222 7.58222 4 12 4C16.4178 4 20 7.58222 20 12Z"
843
- fill="var(--ax-bg-accent-strong-pressed, var(--a-surface-action-selected))"
843
+ fill="var(--ax-bg-strong-pressed, var(--a-surface-action-selected))"
844
844
  />
845
845
  </g>
846
846
  )}
@@ -150,6 +150,7 @@ export const Pagination = forwardRef<HTMLElement, PaginationProps>(
150
150
  srHeading,
151
151
  "aria-labelledby": ariaLabelledBy,
152
152
  renderItem: Item = PaginationItem,
153
+ "data-color": color,
153
154
  ...rest
154
155
  },
155
156
  ref,
@@ -179,6 +180,7 @@ export const Pagination = forwardRef<HTMLElement, PaginationProps>(
179
180
  <nav
180
181
  ref={ref}
181
182
  {...rest}
183
+ data-color={color}
182
184
  aria-labelledby={
183
185
  srHeading ? cl(headingId, ariaLabelledBy) : ariaLabelledBy
184
186
  }
@@ -201,6 +203,7 @@ export const Pagination = forwardRef<HTMLElement, PaginationProps>(
201
203
  <ul className={cn("navds-pagination__list")}>
202
204
  <li>
203
205
  <Item
206
+ data-color={color}
204
207
  className={cn("navds-pagination__prev-next", {
205
208
  "navds-pagination--invisible": page === 1,
206
209
  "navds-pagination--prev-next--with-text": prevNextTexts,
@@ -238,6 +241,7 @@ export const Pagination = forwardRef<HTMLElement, PaginationProps>(
238
241
  ) : (
239
242
  <li key={step}>
240
243
  <Item
244
+ data-color={color}
241
245
  /* Remember to update RenderItemProps if you make changes to props sent into Item */
242
246
  onClick={() => onPageChange?.(n)}
243
247
  selected={page === n}
@@ -252,6 +256,7 @@ export const Pagination = forwardRef<HTMLElement, PaginationProps>(
252
256
  )}
253
257
  <li>
254
258
  <Item
259
+ data-color={color}
255
260
  className={cn("navds-pagination__prev-next", {
256
261
  "navds-pagination--invisible": page === count,
257
262
  "navds-pagination--prev-next--with-text": prevNextTexts,
@@ -35,6 +35,7 @@ export const Item: PaginationItemType = forwardRef(
35
35
  selected = false,
36
36
  className,
37
37
  page,
38
+ "data-color": color,
38
39
  ...rest
39
40
  },
40
41
  ref,
@@ -46,8 +47,9 @@ export const Item: PaginationItemType = forwardRef(
46
47
  <Button
47
48
  as={Component}
48
49
  variant={themeContext ? "tertiary-neutral" : "tertiary"}
50
+ data-color={color}
49
51
  aria-current={selected}
50
- data-selected={selected}
52
+ data-pressed={selected}
51
53
  ref={ref}
52
54
  className={cn("navds-pagination__item", className, {
53
55
  "navds-pagination__item--selected": selected,
@@ -29,7 +29,12 @@ export const Portal = forwardRef<HTMLDivElement, PortalProps>(
29
29
  if (themeContext) {
30
30
  return root
31
31
  ? ReactDOM.createPortal(
32
- <Theme theme={themeContext.theme} asChild hasBackground={false}>
32
+ <Theme
33
+ theme={themeContext.theme}
34
+ asChild
35
+ hasBackground={false}
36
+ data-color={themeContext.color}
37
+ >
33
38
  <Component ref={ref} data-aksel-portal="" {...rest} />
34
39
  </Theme>,
35
40
  root,
@@ -1,5 +1,4 @@
1
1
  import "react";
2
- import type { GlobalColorRoles } from "@navikt/ds-tokens/types";
3
2
 
4
3
  declare module "react" {
5
4
  interface CSSProperties {
@@ -8,7 +7,4 @@ declare module "react" {
8
7
  [key: `--axc-${string}`]: string | number | undefined;
9
8
  [key: `--__axc-${string}`]: string | number | undefined;
10
9
  }
11
- interface HTMLAttributes {
12
- "data-color-role"?: GlobalColorRoles;
13
- }
14
10
  }
@@ -100,16 +100,17 @@ export const Stepper: StepperComponent = forwardRef<
100
100
  const stepProps: Partial<StepperStepProps> =
101
101
  React.isValidElement<StepperStepProps>(step) ? step.props : {};
102
102
 
103
+ const isInteractive = stepProps.interactive ?? interactive;
104
+
103
105
  return (
104
106
  <li
105
107
  className={cn("navds-stepper__item", {
106
108
  /* TODO: Remove these 3 classNames in darkmode update */
107
109
  "navds-stepper__item--behind": activeStep > index,
108
110
  "navds-stepper__item--completed": stepProps.completed,
109
- "navds-stepper__item--non-interactive": !(
110
- stepProps.interactive ?? interactive
111
- ),
111
+ "navds-stepper__item--non-interactive": !isInteractive,
112
112
  })}
113
+ data-color={isInteractive ? undefined : "neutral"}
113
114
  key={index + (children?.toString?.() ?? "")}
114
115
  >
115
116
  <span
package/src/tag/Tag.tsx CHANGED
@@ -1,5 +1,6 @@
1
1
  import React, { HTMLAttributes, forwardRef } from "react";
2
2
  import { useRenameCSS } from "../theme/Theme";
3
+ import { AkselColor } from "../types";
3
4
  import { BodyShort } from "../typography";
4
5
 
5
6
  export interface TagProps extends HTMLAttributes<HTMLSpanElement> {
@@ -62,14 +63,26 @@ export interface TagProps extends HTMLAttributes<HTMLSpanElement> {
62
63
  * ```
63
64
  */
64
65
  export const Tag = forwardRef<HTMLSpanElement, TagProps>(
65
- ({ children, className, variant, size = "medium", icon, ...rest }, ref) => {
66
+ (
67
+ {
68
+ children,
69
+ className,
70
+ variant,
71
+ size = "medium",
72
+ icon,
73
+ "data-color": color,
74
+ ...rest
75
+ },
76
+ ref,
77
+ ) => {
66
78
  const { cn } = useRenameCSS();
67
79
  const filledVariant = variant?.endsWith("-filled") && "strong";
68
80
  const moderateVariant = variant?.endsWith("-moderate") && "moderate";
69
- const color = variant?.replace("-filled", "").replace("-moderate", "");
70
81
 
71
82
  return (
72
83
  <BodyShort
84
+ data-color={color ?? variantToColor(variant)}
85
+ data-variant={filledVariant || moderateVariant || "outline"}
73
86
  {...rest}
74
87
  ref={ref}
75
88
  as="span"
@@ -79,8 +92,6 @@ export const Tag = forwardRef<HTMLSpanElement, TagProps>(
79
92
  className,
80
93
  `navds-tag--${variant}`,
81
94
  `navds-tag--${size}`,
82
- `navds-tag--${filledVariant || moderateVariant || "outline"}`,
83
- `navds-tag--${color}`,
84
95
  )}
85
96
  >
86
97
  {icon && <span className={cn("navds-tag__icon--left")}>{icon}</span>}
@@ -90,4 +101,42 @@ export const Tag = forwardRef<HTMLSpanElement, TagProps>(
90
101
  },
91
102
  );
92
103
 
104
+ function variantToColor(variant: TagProps["variant"]): AkselColor {
105
+ switch (variant) {
106
+ case "warning":
107
+ case "warning-filled":
108
+ case "warning-moderate":
109
+ return "warning";
110
+ case "error":
111
+ case "error-filled":
112
+ case "error-moderate":
113
+ return "danger";
114
+ case "info":
115
+ case "info-filled":
116
+ case "info-moderate":
117
+ case "alt3":
118
+ case "alt3-filled":
119
+ case "alt3-moderate":
120
+ return "info";
121
+ case "success":
122
+ case "success-filled":
123
+ case "success-moderate":
124
+ return "success";
125
+ case "neutral":
126
+ case "neutral-filled":
127
+ case "neutral-moderate":
128
+ return "neutral";
129
+ case "alt1":
130
+ case "alt1-filled":
131
+ case "alt1-moderate":
132
+ return "meta-purple";
133
+ case "alt2":
134
+ case "alt2-filled":
135
+ case "alt2-moderate":
136
+ return "meta-lime";
137
+ default:
138
+ return "neutral";
139
+ }
140
+ }
141
+
93
142
  export default Tag;
@@ -1,6 +1,7 @@
1
1
  import cl from "clsx";
2
2
  import React, { forwardRef } from "react";
3
3
  import { Slot } from "../slot/Slot";
4
+ import { AkselColor } from "../types";
4
5
  import { createContext } from "../util/create-context";
5
6
  import { AsChildProps } from "../util/types";
6
7
 
@@ -50,6 +51,7 @@ type ThemeContext = {
50
51
  * @default Inherits parent theme, or "light" if root
51
52
  */
52
53
  theme?: "light" | "dark";
54
+ color?: AkselColor;
53
55
  };
54
56
 
55
57
  const [ThemeProvider, useThemeInternal] = createContext<ThemeContext>({
@@ -60,8 +62,15 @@ const [ThemeProvider, useThemeInternal] = createContext<ThemeContext>({
60
62
 
61
63
  export type ThemeProps = {
62
64
  className?: string;
65
+ /**
66
+ * Sets default background when enabled
67
+ */
63
68
  hasBackground?: boolean;
64
- } & ThemeContext &
69
+ /**
70
+ * Sets default 'base'-color for application
71
+ */
72
+ "data-color"?: AkselColor;
73
+ } & Omit<ThemeContext, "color"> &
65
74
  AsChildProps;
66
75
 
67
76
  const Theme = forwardRef<HTMLDivElement, ThemeProps>(
@@ -74,6 +83,7 @@ const Theme = forwardRef<HTMLDivElement, ThemeProps>(
74
83
  asChild = false,
75
84
  theme = context?.theme,
76
85
  hasBackground: hasBackgroundProp = true,
86
+ "data-color": color = context?.color,
77
87
  } = props;
78
88
 
79
89
  const isRoot = context === undefined;
@@ -84,12 +94,13 @@ const Theme = forwardRef<HTMLDivElement, ThemeProps>(
84
94
  const SlotElement = asChild ? Slot : "div";
85
95
 
86
96
  return (
87
- <ThemeProvider theme={theme}>
97
+ <ThemeProvider theme={theme} color={color}>
88
98
  <RenameCSS>
89
99
  <SlotElement
90
100
  ref={ref}
91
101
  className={cl("aksel-theme", className, theme)}
92
102
  data-background={hasBackground}
103
+ data-color={color}
93
104
  >
94
105
  {children}
95
106
  </SlotElement>
@@ -11,7 +11,6 @@ import {
11
11
  useFocus,
12
12
  useHover,
13
13
  useInteractions,
14
- useRole,
15
14
  } from "@floating-ui/react";
16
15
  import { format } from "date-fns";
17
16
  import React, { forwardRef, useRef, useState } from "react";
@@ -79,13 +78,11 @@ export const Pin = forwardRef<HTMLButtonElement, TimelinePinProps>(
79
78
  });
80
79
  const focus = useFocus(context);
81
80
  const dismiss = useDismiss(context);
82
- const role = useRole(context, { role: "dialog" });
83
81
 
84
82
  const { getFloatingProps, getReferenceProps } = useInteractions([
85
83
  hover,
86
84
  focus,
87
85
  dismiss,
88
- role,
89
86
  ]);
90
87
 
91
88
  const mergedRef = useMergeRefs(refs.setReference, ref);
@@ -135,6 +132,7 @@ export const Pin = forwardRef<HTMLButtonElement, TimelinePinProps>(
135
132
  className={cn("navds-timeline__popover")}
136
133
  data-placement={placement}
137
134
  ref={refs.setFloating}
135
+ role="dialog"
138
136
  {...getFloatingProps()}
139
137
  style={floatingStyles}
140
138
  >
@@ -11,7 +11,6 @@ import {
11
11
  useFocus,
12
12
  useHover,
13
13
  useInteractions,
14
- useRole,
15
14
  } from "@floating-ui/react";
16
15
  import React, { useRef, useState } from "react";
17
16
  import { useRenameCSS, useThemeInternal } from "../../theme/Theme";
@@ -91,13 +90,11 @@ const ClickablePeriod = React.memo(
91
90
  });
92
91
  const focus = useFocus(context);
93
92
  const dismiss = useDismiss(context);
94
- const role = useRole(context, { role: "dialog" });
95
93
 
96
94
  const { getFloatingProps, getReferenceProps } = useInteractions([
97
95
  hover,
98
96
  focus,
99
97
  dismiss,
100
- role,
101
98
  ]);
102
99
 
103
100
  const mergedRef = useMergeRefs(refs.setReference, periodRef);
@@ -113,6 +110,7 @@ const ClickablePeriod = React.memo(
113
110
  <>
114
111
  <button
115
112
  {...restProps}
113
+ data-color={restProps?.["data-color"] ?? status}
116
114
  type="button"
117
115
  ref={(r) => {
118
116
  firstFocus && addFocusable(r, index);
@@ -169,6 +167,7 @@ const ClickablePeriod = React.memo(
169
167
  className={cn("navds-timeline__popover")}
170
168
  data-placement={placement}
171
169
  ref={refs.setFloating}
170
+ role="dialog"
172
171
  {...getFloatingProps()}
173
172
  style={floatingStyles}
174
173
  >
@@ -28,6 +28,7 @@ const NonClickablePeriod = ({
28
28
  <div
29
29
  ref={periodRef}
30
30
  {...restProps}
31
+ data-color={restProps?.["data-color"] ?? status}
31
32
  className={cn(
32
33
  getConditionalClasses(cropped, direction, status),
33
34
  restProps?.className,
@@ -6,7 +6,7 @@ import type { PeriodProps } from "../period/types";
6
6
  export const getConditionalClasses = (
7
7
  cropped: string,
8
8
  direction: string,
9
- status: string,
9
+ status: PeriodProps["status"],
10
10
  ) => {
11
11
  /* Renaming to aksel-* happends where these are used, so no need to rename here */
12
12
  return cl(`navds-timeline__period navds-timeline__period--${status}`, {
@@ -1,6 +1,7 @@
1
1
  import cl from "clsx";
2
2
  import React, { forwardRef } from "react";
3
- import { useRenameCSS } from "../theme/Theme";
3
+ import { useRenameCSS, useThemeInternal } from "../theme/Theme";
4
+ import { AkselColor } from "../types";
4
5
  import { Label } from "../typography";
5
6
  import { useId } from "../util";
6
7
  import {
@@ -48,13 +49,15 @@ export const ToggleGroup = forwardRef<HTMLDivElement, ToggleGroupProps>(
48
49
  value,
49
50
  defaultValue,
50
51
  "aria-describedby": userDescribedby,
51
- variant = "action",
52
+ variant,
52
53
  fill = false,
54
+ "data-color": color,
53
55
  ...rest
54
56
  },
55
57
  ref,
56
58
  ) => {
57
59
  const { cn } = useRenameCSS();
60
+ const themeContext = useThemeInternal(false);
58
61
  const descendants = useToggleGroupDescendants();
59
62
 
60
63
  const toggleGroupContext = useToggleGroup({
@@ -81,6 +84,14 @@ export const ToggleGroup = forwardRef<HTMLDivElement, ToggleGroupProps>(
81
84
  console.error("ToggleGroup needs either a value or defaultValue");
82
85
  }
83
86
 
87
+ let localVariant: ToggleGroupProps["variant"] | undefined;
88
+
89
+ if (themeContext) {
90
+ localVariant = variant;
91
+ } else {
92
+ localVariant = variant ?? "action";
93
+ }
94
+
84
95
  return (
85
96
  <ToggleGroupDescendantsProvider value={descendants}>
86
97
  <ToggleGroupProvider {...context}>
@@ -88,6 +99,7 @@ export const ToggleGroup = forwardRef<HTMLDivElement, ToggleGroupProps>(
88
99
  className={cn("navds-toggle-group__wrapper", className, {
89
100
  "navds-toggle-group__wrapper--fill": fill,
90
101
  })}
102
+ data-color={color ?? variantToColor(localVariant)}
91
103
  >
92
104
  {label && (
93
105
  <Label
@@ -104,7 +116,7 @@ export const ToggleGroup = forwardRef<HTMLDivElement, ToggleGroupProps>(
104
116
  className={cn(
105
117
  "navds-toggle-group",
106
118
  `navds-toggle-group--${size}`,
107
- `navds-toggle-group--${variant}`,
119
+ { [`navds-toggle-group--${localVariant}`]: localVariant },
108
120
  )}
109
121
  aria-describedby={
110
122
  cl(userDescribedby, !!label && labelId) || undefined
@@ -120,6 +132,19 @@ export const ToggleGroup = forwardRef<HTMLDivElement, ToggleGroupProps>(
120
132
  },
121
133
  ) as ToggleGroupComponent;
122
134
 
135
+ function variantToColor(
136
+ variant?: ToggleGroupProps["variant"],
137
+ ): AkselColor | undefined {
138
+ switch (variant) {
139
+ case "action":
140
+ return "accent";
141
+ case "neutral":
142
+ return "neutral";
143
+ default:
144
+ return undefined;
145
+ }
146
+ }
147
+
123
148
  ToggleGroup.Item = ToggleItem;
124
149
 
125
150
  export default ToggleGroup;
@@ -0,0 +1 @@
1
+ export * from "./theme";
@@ -0,0 +1,15 @@
1
+ /* eslint-disable @typescript-eslint/no-empty-object-type */
2
+ import type { AkselColorRole } from "@navikt/ds-tokens/types";
3
+
4
+ // biome-ignore lint/suspicious/noEmptyInterface: Users can/will augment this interface
5
+ export interface CustomAkselColor {}
6
+
7
+ export type AkselColor = AkselColorRole | keyof CustomAkselColor;
8
+
9
+ declare global {
10
+ namespace React {
11
+ interface HTMLAttributes {
12
+ "data-color"?: AkselColor | (string & {});
13
+ }
14
+ }
15
+ }