@navikt/ds-react 7.8.1 → 7.9.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 (215) hide show
  1. package/cjs/accordion/AccordionContent.js +2 -2
  2. package/cjs/accordion/AccordionContent.js.map +1 -1
  3. package/cjs/accordion/AccordionHeader.js +2 -2
  4. package/cjs/accordion/AccordionHeader.js.map +1 -1
  5. package/cjs/button/Button.js +9 -25
  6. package/cjs/button/Button.js.map +1 -1
  7. package/cjs/date/datepicker/parts/WeekNumber.js +2 -2
  8. package/cjs/date/datepicker/parts/WeekNumber.js.map +1 -1
  9. package/cjs/date/parts/DateInput.js +1 -1
  10. package/cjs/date/parts/DateInput.js.map +1 -1
  11. package/cjs/form/combobox/Combobox.d.ts +1 -1
  12. package/cjs/form/combobox/Combobox.js +1 -1
  13. package/cjs/form/combobox/Combobox.js.map +1 -1
  14. package/cjs/form/combobox/Input/InputController.d.ts +1 -1
  15. package/cjs/form/confirmation-panel/ConfirmationPanel.js +1 -1
  16. package/cjs/form/confirmation-panel/ConfirmationPanel.js.map +1 -1
  17. package/cjs/form/fieldset/Fieldset.js +1 -1
  18. package/cjs/form/fieldset/Fieldset.js.map +1 -1
  19. package/cjs/form/file-upload/parts/dropzone/Dropzone.js +1 -1
  20. package/cjs/form/file-upload/parts/dropzone/Dropzone.js.map +1 -1
  21. package/cjs/form/search/Search.js +3 -3
  22. package/cjs/form/search/Search.js.map +1 -1
  23. package/cjs/form/select/Select.js +1 -1
  24. package/cjs/form/select/Select.js.map +1 -1
  25. package/cjs/form/switch/Switch.js +1 -7
  26. package/cjs/form/switch/Switch.js.map +1 -1
  27. package/cjs/form/textarea/Textarea.js +1 -1
  28. package/cjs/form/textarea/Textarea.js.map +1 -1
  29. package/cjs/form/textfield/TextField.js +1 -1
  30. package/cjs/form/textfield/TextField.js.map +1 -1
  31. package/cjs/guide-panel/GuidePanel.js +2 -2
  32. package/cjs/guide-panel/GuidePanel.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/internal-header/InternalHeader.js +3 -3
  36. package/cjs/internal-header/InternalHeader.js.map +1 -1
  37. package/cjs/layout/base/BasePrimitive.js +2 -2
  38. package/cjs/layout/base/BasePrimitive.js.map +1 -1
  39. package/cjs/layout/bleed/Bleed.js +2 -2
  40. package/cjs/layout/bleed/Bleed.js.map +1 -1
  41. package/cjs/layout/box/Box.js +2 -2
  42. package/cjs/layout/box/Box.js.map +1 -1
  43. package/cjs/layout/grid/HGrid.js +2 -2
  44. package/cjs/layout/grid/HGrid.js.map +1 -1
  45. package/cjs/layout/page/Page.js +2 -2
  46. package/cjs/layout/page/Page.js.map +1 -1
  47. package/cjs/layout/stack/Stack.js +2 -2
  48. package/cjs/layout/stack/Stack.js.map +1 -1
  49. package/cjs/overlays/action-menu/ActionMenu.js +2 -2
  50. package/cjs/overlays/action-menu/ActionMenu.js.map +1 -1
  51. package/cjs/pagination/PaginationItem.js +2 -2
  52. package/cjs/pagination/PaginationItem.js.map +1 -1
  53. package/cjs/popover/Popover.js +2 -2
  54. package/cjs/popover/Popover.js.map +1 -1
  55. package/cjs/portal/Portal.js +12 -0
  56. package/cjs/portal/Portal.js.map +1 -1
  57. package/cjs/provider/index.d.ts +0 -1
  58. package/cjs/provider/index.js +1 -4
  59. package/cjs/provider/index.js.map +1 -1
  60. package/cjs/read-more/ReadMore.js +1 -3
  61. package/cjs/read-more/ReadMore.js.map +1 -1
  62. package/cjs/tabs/Tabs.context.d.ts +1 -1
  63. package/cjs/tabs/parts/tablist/useScrollButtons.d.ts +1 -1
  64. package/cjs/theme/Theme.d.ts +16 -0
  65. package/cjs/{provider/theme/AkselTheme.js → theme/Theme.js} +17 -18
  66. package/cjs/theme/Theme.js.map +1 -0
  67. package/cjs/theme/index.d.ts +1 -0
  68. package/cjs/theme/index.js +7 -0
  69. package/cjs/theme/index.js.map +1 -0
  70. package/cjs/timeline/Pin.js +2 -2
  71. package/cjs/timeline/Pin.js.map +1 -1
  72. package/cjs/timeline/period/ClickablePeriod.js +2 -2
  73. package/cjs/timeline/period/ClickablePeriod.js.map +1 -1
  74. package/cjs/toggle-group/parts/ToggleItem.js +1 -1
  75. package/cjs/toggle-group/parts/ToggleItem.js.map +1 -1
  76. package/cjs/tooltip/Tooltip.js +2 -2
  77. package/cjs/tooltip/Tooltip.js.map +1 -1
  78. package/cjs/typography/ErrorMessage.d.ts +4 -0
  79. package/cjs/typography/ErrorMessage.js +6 -2
  80. package/cjs/typography/ErrorMessage.js.map +1 -1
  81. package/cjs/util/TextareaAutoSize.js +1 -1
  82. package/cjs/util/TextareaAutoSize.js.map +1 -1
  83. package/cjs/util/debounce.d.ts +2 -2
  84. package/cjs/util/debounce.js +5 -1
  85. package/cjs/util/debounce.js.map +1 -1
  86. package/esm/accordion/AccordionContent.js +2 -2
  87. package/esm/accordion/AccordionContent.js.map +1 -1
  88. package/esm/accordion/AccordionHeader.js +2 -2
  89. package/esm/accordion/AccordionHeader.js.map +1 -1
  90. package/esm/button/Button.js +10 -26
  91. package/esm/button/Button.js.map +1 -1
  92. package/esm/date/datepicker/parts/WeekNumber.js +2 -2
  93. package/esm/date/datepicker/parts/WeekNumber.js.map +1 -1
  94. package/esm/date/parts/DateInput.js +1 -1
  95. package/esm/date/parts/DateInput.js.map +1 -1
  96. package/esm/form/combobox/Combobox.d.ts +1 -1
  97. package/esm/form/combobox/Combobox.js +1 -1
  98. package/esm/form/combobox/Combobox.js.map +1 -1
  99. package/esm/form/combobox/Input/InputController.d.ts +1 -1
  100. package/esm/form/confirmation-panel/ConfirmationPanel.js +1 -1
  101. package/esm/form/confirmation-panel/ConfirmationPanel.js.map +1 -1
  102. package/esm/form/fieldset/Fieldset.js +1 -1
  103. package/esm/form/fieldset/Fieldset.js.map +1 -1
  104. package/esm/form/file-upload/parts/dropzone/Dropzone.js +1 -1
  105. package/esm/form/file-upload/parts/dropzone/Dropzone.js.map +1 -1
  106. package/esm/form/search/Search.js +3 -3
  107. package/esm/form/search/Search.js.map +1 -1
  108. package/esm/form/select/Select.js +1 -1
  109. package/esm/form/select/Select.js.map +1 -1
  110. package/esm/form/switch/Switch.js +1 -7
  111. package/esm/form/switch/Switch.js.map +1 -1
  112. package/esm/form/textarea/Textarea.js +1 -1
  113. package/esm/form/textarea/Textarea.js.map +1 -1
  114. package/esm/form/textfield/TextField.js +1 -1
  115. package/esm/form/textfield/TextField.js.map +1 -1
  116. package/esm/guide-panel/GuidePanel.js +2 -2
  117. package/esm/guide-panel/GuidePanel.js.map +1 -1
  118. package/esm/help-text/HelpText.js +2 -2
  119. package/esm/help-text/HelpText.js.map +1 -1
  120. package/esm/internal-header/InternalHeader.js +3 -3
  121. package/esm/internal-header/InternalHeader.js.map +1 -1
  122. package/esm/layout/base/BasePrimitive.js +2 -2
  123. package/esm/layout/base/BasePrimitive.js.map +1 -1
  124. package/esm/layout/bleed/Bleed.js +2 -2
  125. package/esm/layout/bleed/Bleed.js.map +1 -1
  126. package/esm/layout/box/Box.js +2 -2
  127. package/esm/layout/box/Box.js.map +1 -1
  128. package/esm/layout/grid/HGrid.js +2 -2
  129. package/esm/layout/grid/HGrid.js.map +1 -1
  130. package/esm/layout/page/Page.js +2 -2
  131. package/esm/layout/page/Page.js.map +1 -1
  132. package/esm/layout/stack/Stack.js +2 -2
  133. package/esm/layout/stack/Stack.js.map +1 -1
  134. package/esm/overlays/action-menu/ActionMenu.js +2 -2
  135. package/esm/overlays/action-menu/ActionMenu.js.map +1 -1
  136. package/esm/pagination/PaginationItem.js +2 -2
  137. package/esm/pagination/PaginationItem.js.map +1 -1
  138. package/esm/popover/Popover.js +2 -2
  139. package/esm/popover/Popover.js.map +1 -1
  140. package/esm/portal/Portal.js +12 -0
  141. package/esm/portal/Portal.js.map +1 -1
  142. package/esm/provider/index.d.ts +0 -1
  143. package/esm/provider/index.js +0 -1
  144. package/esm/provider/index.js.map +1 -1
  145. package/esm/read-more/ReadMore.js +1 -3
  146. package/esm/read-more/ReadMore.js.map +1 -1
  147. package/esm/tabs/Tabs.context.d.ts +1 -1
  148. package/esm/tabs/parts/tablist/useScrollButtons.d.ts +1 -1
  149. package/esm/theme/Theme.d.ts +16 -0
  150. package/esm/theme/Theme.js +21 -0
  151. package/esm/theme/Theme.js.map +1 -0
  152. package/esm/theme/index.d.ts +1 -0
  153. package/esm/theme/index.js +3 -0
  154. package/esm/theme/index.js.map +1 -0
  155. package/esm/timeline/Pin.js +2 -2
  156. package/esm/timeline/Pin.js.map +1 -1
  157. package/esm/timeline/period/ClickablePeriod.js +2 -2
  158. package/esm/timeline/period/ClickablePeriod.js.map +1 -1
  159. package/esm/toggle-group/parts/ToggleItem.js +1 -1
  160. package/esm/toggle-group/parts/ToggleItem.js.map +1 -1
  161. package/esm/tooltip/Tooltip.js +2 -2
  162. package/esm/tooltip/Tooltip.js.map +1 -1
  163. package/esm/typography/ErrorMessage.d.ts +4 -0
  164. package/esm/typography/ErrorMessage.js +6 -2
  165. package/esm/typography/ErrorMessage.js.map +1 -1
  166. package/esm/util/TextareaAutoSize.js +1 -1
  167. package/esm/util/TextareaAutoSize.js.map +1 -1
  168. package/esm/util/debounce.d.ts +2 -2
  169. package/esm/util/debounce.js +5 -1
  170. package/esm/util/debounce.js.map +1 -1
  171. package/package.json +3 -3
  172. package/src/accordion/AccordionContent.tsx +2 -2
  173. package/src/accordion/AccordionHeader.tsx +2 -2
  174. package/src/button/Button.tsx +20 -50
  175. package/src/date/datepicker/parts/WeekNumber.tsx +2 -2
  176. package/src/date/parts/DateInput.tsx +5 -1
  177. package/src/form/combobox/Combobox.tsx +5 -1
  178. package/src/form/confirmation-panel/ConfirmationPanel.tsx +5 -1
  179. package/src/form/fieldset/Fieldset.tsx +3 -1
  180. package/src/form/file-upload/parts/dropzone/Dropzone.tsx +1 -1
  181. package/src/form/search/Search.tsx +5 -3
  182. package/src/form/select/Select.tsx +3 -1
  183. package/src/form/switch/Switch.tsx +1 -10
  184. package/src/form/textarea/Textarea.tsx +3 -1
  185. package/src/form/textfield/TextField.tsx +3 -1
  186. package/src/guide-panel/GuidePanel.tsx +2 -2
  187. package/src/help-text/HelpText.tsx +2 -2
  188. package/src/internal-header/InternalHeader.tsx +4 -4
  189. package/src/layout/base/BasePrimitive.tsx +2 -2
  190. package/src/layout/bleed/Bleed.tsx +2 -2
  191. package/src/layout/box/Box.tsx +2 -2
  192. package/src/layout/grid/HGrid.tsx +2 -2
  193. package/src/layout/page/Page.tsx +2 -2
  194. package/src/layout/stack/Stack.tsx +2 -2
  195. package/src/overlays/action-menu/ActionMenu.tsx +2 -2
  196. package/src/pagination/PaginationItem.tsx +2 -2
  197. package/src/popover/Popover.tsx +2 -2
  198. package/src/portal/Portal.tsx +17 -0
  199. package/src/provider/index.ts +0 -4
  200. package/src/read-more/ReadMore.tsx +1 -4
  201. package/src/theme/Theme.tsx +60 -0
  202. package/src/theme/index.ts +2 -0
  203. package/src/timeline/Pin.tsx +2 -2
  204. package/src/timeline/period/ClickablePeriod.tsx +2 -2
  205. package/src/toggle-group/parts/ToggleItem.tsx +1 -0
  206. package/src/tooltip/Tooltip.tsx +2 -2
  207. package/src/typography/ErrorMessage.tsx +36 -2
  208. package/src/util/TextareaAutoSize.tsx +15 -11
  209. package/src/util/debounce.ts +11 -3
  210. package/cjs/provider/theme/AkselTheme.d.ts +0 -22
  211. package/cjs/provider/theme/AkselTheme.js.map +0 -1
  212. package/esm/provider/theme/AkselTheme.d.ts +0 -22
  213. package/esm/provider/theme/AkselTheme.js +0 -22
  214. package/esm/provider/theme/AkselTheme.js.map +0 -1
  215. package/src/provider/theme/AkselTheme.tsx +0 -70
@@ -1,11 +1,9 @@
1
1
  import cl from "clsx";
2
- import React, { forwardRef, useRef, useState } from "react";
2
+ import React, { forwardRef } from "react";
3
3
  import { Loader } from "../loader";
4
4
  import { Label } from "../typography";
5
5
  import { omit } from "../util";
6
6
  import { composeEventHandlers } from "../util/composeEventHandlers";
7
- import { useClientLayoutEffect } from "../util/hooks";
8
- import { useMergeRefs } from "../util/hooks/useMergeRefs";
9
7
  import { OverridableComponent } from "../util/types";
10
8
 
11
9
  export interface ButtonProps
@@ -74,37 +72,18 @@ export const Button: OverridableComponent<ButtonProps, HTMLButtonElement> =
74
72
  size = "medium",
75
73
  loading = false,
76
74
  disabled,
77
- style,
78
75
  icon,
79
76
  iconPosition = "left",
77
+ onKeyUp,
80
78
  ...rest
81
79
  },
82
80
  ref,
83
81
  ) => {
84
- const buttonRef = useRef<HTMLButtonElement | null>(null);
85
- const [widthOverride, setWidthOverride] = useState<number>();
86
-
87
- const mergedRef = useMergeRefs(buttonRef, ref);
88
-
89
- useClientLayoutEffect(() => {
90
- if (loading) {
91
- const requestID = window.requestAnimationFrame(() => {
92
- setWidthOverride(
93
- buttonRef?.current?.getBoundingClientRect()?.width,
94
- );
95
- });
96
- return () => {
97
- setWidthOverride(undefined);
98
- cancelAnimationFrame(requestID);
99
- };
100
- }
101
- }, [loading, children]);
102
-
103
82
  const filterProps: React.ButtonHTMLAttributes<HTMLButtonElement> =
104
- disabled ?? widthOverride ? omit(rest, ["href"]) : rest;
83
+ disabled || loading ? omit(rest, ["href"]) : rest;
105
84
 
106
85
  const handleKeyUp = (e: React.KeyboardEvent<HTMLButtonElement>) => {
107
- if (e.key === " " && !disabled && !widthOverride) {
86
+ if (e.key === " " && !disabled && !loading) {
108
87
  e.currentTarget.click();
109
88
  }
110
89
  };
@@ -113,41 +92,32 @@ export const Button: OverridableComponent<ButtonProps, HTMLButtonElement> =
113
92
  <Component
114
93
  {...(Component !== "button" ? { role: "button" } : {})}
115
94
  {...filterProps}
116
- ref={mergedRef}
117
- onKeyUp={composeEventHandlers(filterProps.onKeyUp, handleKeyUp)}
95
+ ref={ref}
96
+ onKeyUp={composeEventHandlers(onKeyUp, handleKeyUp)}
118
97
  className={cl(
119
98
  className,
120
99
  "navds-button",
121
100
  `navds-button--${variant}`,
122
101
  `navds-button--${size}`,
123
102
  {
124
- "navds-button--loading": widthOverride,
103
+ "navds-button--loading": loading,
125
104
  "navds-button--icon-only": !!icon && !children,
126
- "navds-button--disabled": disabled ?? widthOverride,
105
+ "navds-button--disabled": disabled ?? loading,
127
106
  },
128
107
  )}
129
- style={{
130
- ...style,
131
- width: widthOverride,
132
- }}
133
- disabled={disabled ?? widthOverride ? true : undefined}
108
+ disabled={disabled ?? loading ? true : undefined}
134
109
  >
135
- {widthOverride ? (
136
- <Loader size={size} />
137
- ) : (
138
- <>
139
- {icon && iconPosition === "left" && (
140
- <span className="navds-button__icon">{icon}</span>
141
- )}
142
- {children && (
143
- <Label as="span" size={size === "medium" ? "medium" : "small"}>
144
- {children}
145
- </Label>
146
- )}
147
- {icon && iconPosition === "right" && (
148
- <span className="navds-button__icon">{icon}</span>
149
- )}
150
- </>
110
+ {icon && iconPosition === "left" && (
111
+ <span className="navds-button__icon">{icon}</span>
112
+ )}
113
+ {loading && <Loader size={size} />}
114
+ {children && (
115
+ <Label as="span" size={size === "medium" ? "medium" : "small"}>
116
+ {children}
117
+ </Label>
118
+ )}
119
+ {icon && iconPosition === "right" && (
120
+ <span className="navds-button__icon">{icon}</span>
151
121
  )}
152
122
  </Component>
153
123
  );
@@ -2,7 +2,7 @@
2
2
  import React from "react";
3
3
  import { Button as RDPButton, useDayPicker } from "react-day-picker";
4
4
  import { Button } from "../../../button";
5
- import { UNSAFE_useAkselTheme } from "../../../provider";
5
+ import { useThemeInternal } from "../../../theme/Theme";
6
6
  import { Detail } from "../../../typography";
7
7
  import { useDateTranslationContext } from "../../context";
8
8
 
@@ -21,7 +21,7 @@ function WeekNumber({
21
21
  dates,
22
22
  }: WeekNumberProps): JSX.Element {
23
23
  const { onWeekNumberClick, styles, classNames } = useDayPicker();
24
- const themeContext = UNSAFE_useAkselTheme(false);
24
+ const themeContext = useThemeInternal(false);
25
25
  const translate = useDateTranslationContext().translate;
26
26
 
27
27
  if (!onWeekNumberClick) {
@@ -150,7 +150,11 @@ const DateInput = forwardRef<HTMLInputElement, DateInputProps>((props, ref) => {
150
150
  aria-relevant="additions removals"
151
151
  aria-live="polite"
152
152
  >
153
- {showErrorMsg && <ErrorMessage size={size}>{props.error}</ErrorMessage>}
153
+ {showErrorMsg && (
154
+ <ErrorMessage size={size} showIcon>
155
+ {props.error}
156
+ </ErrorMessage>
157
+ )}
154
158
  </div>
155
159
  </div>
156
160
  );
@@ -71,7 +71,11 @@ export const Combobox = forwardRef<
71
71
  aria-relevant="additions removals"
72
72
  aria-live="polite"
73
73
  >
74
- {showErrorMsg && <ErrorMessage size={size}>{error}</ErrorMessage>}
74
+ {showErrorMsg && (
75
+ <ErrorMessage size={size} showIcon>
76
+ {error}
77
+ </ErrorMessage>
78
+ )}
75
79
  </div>
76
80
  </ComboboxWrapper>
77
81
  );
@@ -91,7 +91,11 @@ export const ConfirmationPanel = forwardRef<
91
91
  </Checkbox>
92
92
  </div>
93
93
  <div className="navds-form-field__error" id={errorId} role="alert">
94
- {showErrorMsg && <ErrorMessage size={size}>{props.error}</ErrorMessage>}
94
+ {showErrorMsg && (
95
+ <ErrorMessage size={size} showIcon>
96
+ {props.error}
97
+ </ErrorMessage>
98
+ )}
95
99
  </div>
96
100
  </div>
97
101
  );
@@ -113,7 +113,9 @@ export const Fieldset = forwardRef<HTMLFieldSetElement, FieldsetProps>(
113
113
  className="navds-fieldset__error"
114
114
  >
115
115
  {showErrorMsg && (
116
- <ErrorMessage size={size}>{props.error}</ErrorMessage>
116
+ <ErrorMessage size={size} showIcon>
117
+ {props.error}
118
+ </ErrorMessage>
117
119
  )}
118
120
  </div>
119
121
  </fieldset>
@@ -177,7 +177,7 @@ const Dropzone = forwardRef<HTMLInputElement, FileUploadDropzoneProps>(
177
177
  aria-relevant="additions removals"
178
178
  aria-live="polite"
179
179
  >
180
- {showErrorMsg && <ErrorMessage>{error}</ErrorMessage>}
180
+ {showErrorMsg && <ErrorMessage showIcon>{error}</ErrorMessage>}
181
181
  </div>
182
182
  </div>
183
183
  );
@@ -7,7 +7,7 @@ import React, {
7
7
  } from "react";
8
8
  import { MagnifyingGlassIcon, XMarkIcon } from "@navikt/aksel-icons";
9
9
  import { Button } from "../../button";
10
- import { UNSAFE_useAkselTheme } from "../../provider";
10
+ import { useThemeInternal } from "../../theme/Theme";
11
11
  import { BodyShort, ErrorMessage, Label } from "../../typography";
12
12
  import { omit } from "../../util";
13
13
  import { useMergeRefs } from "../../util/hooks/useMergeRefs";
@@ -125,7 +125,7 @@ export const Search = forwardRef<HTMLInputElement, SearchProps>(
125
125
  ...rest
126
126
  } = props;
127
127
 
128
- const themeContext = UNSAFE_useAkselTheme(false);
128
+ const themeContext = useThemeInternal(false);
129
129
 
130
130
  const searchRef = useRef<HTMLInputElement | null>(null);
131
131
  const mergedRef = useMergeRefs(searchRef, ref);
@@ -263,7 +263,9 @@ export const Search = forwardRef<HTMLInputElement, SearchProps>(
263
263
  aria-live="polite"
264
264
  >
265
265
  {showErrorMsg && (
266
- <ErrorMessage size={size}>{props.error}</ErrorMessage>
266
+ <ErrorMessage size={size} showIcon>
267
+ {props.error}
268
+ </ErrorMessage>
267
269
  )}
268
270
  </div>
269
271
  </div>
@@ -151,7 +151,9 @@ export const Select = forwardRef<HTMLSelectElement, SelectProps>(
151
151
  aria-live="polite"
152
152
  >
153
153
  {showErrorMsg && (
154
- <ErrorMessage size={size}>{props.error}</ErrorMessage>
154
+ <ErrorMessage size={size} showIcon>
155
+ {props.error}
156
+ </ErrorMessage>
155
157
  )}
156
158
  </div>
157
159
  </div>
@@ -6,7 +6,6 @@ import React, {
6
6
  useState,
7
7
  } from "react";
8
8
  import { Loader } from "../../loader";
9
- import { UNSAFE_useAkselTheme } from "../../provider";
10
9
  import { BodyShort } from "../../typography";
11
10
  import { omit } from "../../util";
12
11
  import { ReadOnlyIconWithTitle } from "../ReadOnlyIcon";
@@ -69,8 +68,6 @@ export const Switch = forwardRef<HTMLInputElement, SwitchProps>(
69
68
  defaultChecked ?? checkedProp ?? false,
70
69
  );
71
70
 
72
- const themeContext = UNSAFE_useAkselTheme(false);
73
-
74
71
  useEffect(() => {
75
72
  checkedProp !== undefined && setChecked(checkedProp);
76
73
  }, [checkedProp]);
@@ -121,13 +118,7 @@ export const Switch = forwardRef<HTMLInputElement, SwitchProps>(
121
118
  <Loader
122
119
  size="xsmall"
123
120
  aria-live="polite"
124
- variant={
125
- checked
126
- ? "interaction"
127
- : themeContext
128
- ? "inverted"
129
- : "neutral"
130
- }
121
+ variant={checked ? "interaction" : "inverted"}
131
122
  />
132
123
  ) : (
133
124
  <svg
@@ -193,7 +193,9 @@ export const Textarea = forwardRef<HTMLTextAreaElement, TextareaProps>(
193
193
  aria-live="polite"
194
194
  >
195
195
  {showErrorMsg && (
196
- <ErrorMessage size={size}>{props.error}</ErrorMessage>
196
+ <ErrorMessage size={size} showIcon>
197
+ {props.error}
198
+ </ErrorMessage>
197
199
  )}
198
200
  </div>
199
201
  </div>
@@ -127,7 +127,9 @@ export const TextField = forwardRef<HTMLInputElement, TextFieldProps>(
127
127
  aria-live="polite"
128
128
  >
129
129
  {showErrorMsg && (
130
- <ErrorMessage size={size}>{props.error}</ErrorMessage>
130
+ <ErrorMessage size={size} showIcon>
131
+ {props.error}
132
+ </ErrorMessage>
131
133
  )}
132
134
  </div>
133
135
  </div>
@@ -1,6 +1,6 @@
1
1
  import cl from "clsx";
2
2
  import React, { HTMLAttributes, forwardRef } from "react";
3
- import { UNSAFE_useAkselTheme } from "../provider";
3
+ import { useThemeInternal } from "../theme/Theme";
4
4
  import { DefaultIllustration } from "./Illustration";
5
5
  import { DarksideGudiepanelIllustration } from "./Illustration.darkside";
6
6
 
@@ -37,7 +37,7 @@ export interface GuidePanelProps extends HTMLAttributes<HTMLDivElement> {
37
37
  */
38
38
  export const GuidePanel = forwardRef<HTMLDivElement, GuidePanelProps>(
39
39
  ({ children, className, illustration, poster, ...rest }, ref) => {
40
- const themeContext = UNSAFE_useAkselTheme(false);
40
+ const themeContext = useThemeInternal(false);
41
41
 
42
42
  return (
43
43
  <div
@@ -1,7 +1,7 @@
1
1
  import cl from "clsx";
2
2
  import React, { forwardRef, useRef, useState } from "react";
3
3
  import { Popover, PopoverProps } from "../popover";
4
- import { UNSAFE_useAkselTheme } from "../provider";
4
+ import { useThemeInternal } from "../theme/Theme";
5
5
  import { composeEventHandlers } from "../util/composeEventHandlers";
6
6
  import { useMergeRefs } from "../util/hooks/useMergeRefs";
7
7
  import { useI18n } from "../util/i18n/i18n.context";
@@ -52,7 +52,7 @@ export const HelpText = forwardRef<HTMLButtonElement, HelpTextProps>(
52
52
  const buttonRef = useRef<HTMLButtonElement | null>(null);
53
53
  const mergedRef = useMergeRefs(buttonRef, ref);
54
54
  const [open, setOpen] = useState(false);
55
- const themeContext = UNSAFE_useAkselTheme(false);
55
+ const themeContext = useThemeInternal(false);
56
56
  const translate = useI18n("HelpText");
57
57
 
58
58
  const titleWithFallback = title || translate("title");
@@ -1,6 +1,6 @@
1
1
  import cl from "clsx";
2
2
  import React, { HTMLAttributes, forwardRef } from "react";
3
- import { UNSAFE_AkselTheme, UNSAFE_useAkselTheme } from "../provider";
3
+ import { Theme, useThemeInternal } from "../theme/Theme";
4
4
  import { OverridableComponent } from "../util/types";
5
5
  import InternalHeaderButton, {
6
6
  InternalHeaderButtonProps,
@@ -78,20 +78,20 @@ interface InternalHeaderComponent
78
78
  * ```
79
79
  */
80
80
  export const InternalHeader = forwardRef(({ className, ...rest }, ref) => {
81
- const themeContext = UNSAFE_useAkselTheme(false);
81
+ const themeContext = useThemeInternal(false);
82
82
 
83
83
  /*
84
84
  * Component is always in "dark" mode, so we manually override global theme.
85
85
  */
86
86
  if (themeContext) {
87
87
  return (
88
- <UNSAFE_AkselTheme theme="dark" asChild>
88
+ <Theme theme="dark" asChild>
89
89
  <header
90
90
  {...rest}
91
91
  ref={ref}
92
92
  className={cl("navds-internalheader", className)}
93
93
  />
94
- </UNSAFE_AkselTheme>
94
+ </Theme>
95
95
  );
96
96
  }
97
97
 
@@ -1,7 +1,7 @@
1
1
  import cl from "clsx";
2
2
  import React from "react";
3
- import { UNSAFE_useAkselTheme } from "../../provider";
4
3
  import { Slot } from "../../slot/Slot";
4
+ import { useThemeInternal } from "../../theme/Theme";
5
5
  import { getResponsiveProps, getResponsiveValue } from "../utilities/css";
6
6
  import { ResponsiveProp, SpacingScale } from "../utilities/types";
7
7
 
@@ -252,7 +252,7 @@ export const BasePrimitive = ({
252
252
  flexShrink,
253
253
  gridColumn,
254
254
  }: BasePrimitiveProps) => {
255
- const themeContext = UNSAFE_useAkselTheme(false);
255
+ const themeContext = useThemeInternal(false);
256
256
  const prefix = themeContext ? "ax" : "a";
257
257
 
258
258
  const style: React.CSSProperties = {
@@ -1,7 +1,7 @@
1
1
  import cl from "clsx";
2
2
  import React, { forwardRef } from "react";
3
- import { UNSAFE_useAkselTheme } from "../../provider";
4
3
  import { Slot } from "../../slot/Slot";
4
+ import { useThemeInternal } from "../../theme/Theme";
5
5
  import { getResponsiveProps } from "../utilities/css";
6
6
  import { ResponsiveProp, SpacingScale } from "../utilities/types";
7
7
 
@@ -81,7 +81,7 @@ export const Bleed = forwardRef<HTMLDivElement, BleedProps>(
81
81
  },
82
82
  ref,
83
83
  ) => {
84
- const themeContext = UNSAFE_useAkselTheme(false);
84
+ const themeContext = useThemeInternal(false);
85
85
  const prefix = themeContext ? "ax" : "a";
86
86
 
87
87
  let style: React.CSSProperties = {
@@ -1,8 +1,8 @@
1
1
  import cl from "clsx";
2
2
  import React, { forwardRef } from "react";
3
3
  import { type BorderRadiusKeys } from "@navikt/ds-tokens/types";
4
- import { UNSAFE_useAkselTheme } from "../../provider";
5
4
  import { Slot } from "../../slot/Slot";
5
+ import { useThemeInternal } from "../../theme/Theme";
6
6
  import { omit } from "../../util";
7
7
  import { OverridableComponent } from "../../util/types";
8
8
  import BasePrimitive, {
@@ -109,7 +109,7 @@ export const BoxComponent: OverridableComponent<BoxProps, HTMLDivElement> =
109
109
  },
110
110
  ref,
111
111
  ) => {
112
- const themeContext = UNSAFE_useAkselTheme(false);
112
+ const themeContext = useThemeInternal(false);
113
113
 
114
114
  if (
115
115
  process.env.NODE_ENV !== "production" &&
@@ -1,7 +1,7 @@
1
1
  import cl from "clsx";
2
2
  import React, { forwardRef } from "react";
3
- import { UNSAFE_useAkselTheme } from "../../provider";
4
3
  import { Slot } from "../../slot/Slot";
4
+ import { useThemeInternal } from "../../theme/Theme";
5
5
  import { OverridableComponent, omit } from "../../util";
6
6
  import BasePrimitive, {
7
7
  PRIMITIVE_PROPS,
@@ -78,7 +78,7 @@ export const HGrid: OverridableComponent<HGridProps, HTMLDivElement> =
78
78
  },
79
79
  ref,
80
80
  ) => {
81
- const themeContext = UNSAFE_useAkselTheme(false);
81
+ const themeContext = useThemeInternal(false);
82
82
  const prefix = themeContext ? "ax" : "a";
83
83
 
84
84
  const styles: React.CSSProperties = {
@@ -1,6 +1,6 @@
1
1
  import cl from "clsx";
2
2
  import React, { forwardRef } from "react";
3
- import { UNSAFE_useAkselTheme } from "../../provider";
3
+ import { useThemeInternal } from "../../theme/Theme";
4
4
  import { OverridableComponent } from "../../util";
5
5
  import { BackgroundColorToken } from "../utilities/types";
6
6
  import { PageBlock } from "./parts/PageBlock";
@@ -54,7 +54,7 @@ export const PageComponent: OverridableComponent<PageProps, HTMLElement> =
54
54
  },
55
55
  ref,
56
56
  ) => {
57
- const themeContext = UNSAFE_useAkselTheme(false);
57
+ const themeContext = useThemeInternal(false);
58
58
 
59
59
  if (process.env.NODE_ENV !== "production" && themeContext && background) {
60
60
  console.warn(
@@ -1,7 +1,7 @@
1
1
  import cl from "clsx";
2
2
  import React, { HTMLAttributes, forwardRef } from "react";
3
- import { UNSAFE_useAkselTheme } from "../../provider";
4
3
  import { Slot } from "../../slot/Slot";
4
+ import { useThemeInternal } from "../../theme/Theme";
5
5
  import { omit } from "../../util";
6
6
  import { OverridableComponent } from "../../util/types";
7
7
  import BasePrimitive, {
@@ -84,7 +84,7 @@ export const Stack: OverridableComponent<StackProps, HTMLDivElement> =
84
84
  },
85
85
  ref,
86
86
  ) => {
87
- const themeContext = UNSAFE_useAkselTheme(false);
87
+ const themeContext = useThemeInternal(false);
88
88
  const prefix = themeContext ? "ax" : "a";
89
89
 
90
90
  const style: React.CSSProperties = {
@@ -2,8 +2,8 @@ import cl from "clsx";
2
2
  import React, { forwardRef, useRef } from "react";
3
3
  import { ChevronRightIcon } from "@navikt/aksel-icons";
4
4
  import { useModalContext } from "../../modal/Modal.context";
5
- import { UNSAFE_useAkselTheme } from "../../provider";
6
5
  import { Slot } from "../../slot/Slot";
6
+ import { useThemeInternal } from "../../theme/Theme";
7
7
  import { OverridableComponent, useId } from "../../util";
8
8
  import { composeEventHandlers } from "../../util/composeEventHandlers";
9
9
  import { createContext } from "../../util/create-context";
@@ -736,7 +736,7 @@ export const ActionMenuRadioItem = forwardRef<
736
736
  { children, className, onSelect, ...rest }: ActionMenuRadioItemProps,
737
737
  ref,
738
738
  ) => {
739
- const themeContext = UNSAFE_useAkselTheme(false);
739
+ const themeContext = useThemeInternal(false);
740
740
 
741
741
  return (
742
742
  <Menu.RadioItem
@@ -1,7 +1,7 @@
1
1
  import cl from "clsx";
2
2
  import React, { forwardRef } from "react";
3
3
  import { Button, ButtonProps } from "../button";
4
- import { UNSAFE_useAkselTheme } from "../provider";
4
+ import { useThemeInternal } from "../theme/Theme";
5
5
  import { OverridableComponent } from "../util/types";
6
6
 
7
7
  export interface PaginationItemProps extends ButtonProps {
@@ -40,7 +40,7 @@ export const Item: PaginationItemType = forwardRef(
40
40
  },
41
41
  ref,
42
42
  ) => {
43
- const themeContext = UNSAFE_useAkselTheme(false);
43
+ const themeContext = useThemeInternal(false);
44
44
 
45
45
  return (
46
46
  <Button
@@ -11,7 +11,7 @@ import React, { HTMLAttributes, forwardRef, useContext, useRef } from "react";
11
11
  import { DateInputContext } from "../date/context";
12
12
  import { useModalContext } from "../modal/Modal.context";
13
13
  import { DismissableLayer } from "../overlays/dismissablelayer/DismissableLayer";
14
- import { UNSAFE_useAkselTheme } from "../provider";
14
+ import { useThemeInternal } from "../theme/Theme";
15
15
  import { useClientLayoutEffect } from "../util/hooks";
16
16
  import { useMergeRefs } from "../util/hooks/useMergeRefs";
17
17
  import PopoverContent, { PopoverContentType } from "./PopoverContent";
@@ -125,7 +125,7 @@ export const Popover = forwardRef<HTMLDivElement, PopoverProps>(
125
125
  const chosenStrategy = userStrategy ?? (isInModal ? "fixed" : "absolute");
126
126
  const chosenFlip = isInDatepicker ? false : _flip;
127
127
 
128
- const themeContext = UNSAFE_useAkselTheme(false);
128
+ const themeContext = useThemeInternal(false);
129
129
 
130
130
  const {
131
131
  update,
@@ -2,6 +2,7 @@ import React, { HTMLAttributes, forwardRef } from "react";
2
2
  import ReactDOM from "react-dom";
3
3
  import { useProvider } from "../provider/Provider";
4
4
  import { Slot } from "../slot/Slot";
5
+ import { Theme, useThemeInternal } from "../theme/Theme";
5
6
  import { AsChildProps } from "../util/types";
6
7
 
7
8
  interface PortalBaseProps extends HTMLAttributes<HTMLDivElement> {
@@ -15,11 +16,27 @@ export type PortalProps = PortalBaseProps & AsChildProps;
15
16
 
16
17
  export const Portal = forwardRef<HTMLDivElement, PortalProps>(
17
18
  ({ rootElement, asChild, ...rest }, ref) => {
19
+ const themeContext = useThemeInternal(false);
18
20
  const contextRoot = useProvider()?.rootElement;
19
21
  const root = rootElement ?? contextRoot ?? globalThis?.document?.body;
20
22
 
21
23
  const Component = asChild ? Slot : "div";
22
24
 
25
+ /**
26
+ * Portal can be mounted outside of theme-classNames.
27
+ * If a theme is present, we want to make sure that theme cascades to portaled element.
28
+ */
29
+ if (themeContext) {
30
+ return root
31
+ ? ReactDOM.createPortal(
32
+ <Theme theme={themeContext.theme} asChild hasBackground={false}>
33
+ <Component ref={ref} data-aksel-portal="" {...rest} />
34
+ </Theme>,
35
+ root,
36
+ )
37
+ : null;
38
+ }
39
+
23
40
  return root
24
41
  ? ReactDOM.createPortal(
25
42
  <Component ref={ref} data-aksel-portal="" {...rest} />,
@@ -1,6 +1,2 @@
1
1
  "use client";
2
2
  export { default as Provider, type ProviderProps } from "./Provider";
3
- export {
4
- AkselTheme as UNSAFE_AkselTheme,
5
- useAkselTheme as UNSAFE_useAkselTheme,
6
- } from "./theme/AkselTheme";
@@ -1,7 +1,6 @@
1
1
  import cl from "clsx";
2
2
  import React, { forwardRef } from "react";
3
3
  import { ChevronDownIcon } from "@navikt/aksel-icons";
4
- import { UNSAFE_useAkselTheme } from "../provider";
5
4
  import { BodyLong } from "../typography";
6
5
  import { composeEventHandlers } from "../util/composeEventHandlers";
7
6
  import { useControllableState } from "../util/hooks/useControllableState";
@@ -75,8 +74,6 @@ export const ReadMore = forwardRef<HTMLButtonElement, ReadMoreProps>(
75
74
  onChange: onOpenChange,
76
75
  });
77
76
 
78
- const themeContext = UNSAFE_useAkselTheme(false);
79
-
80
77
  const typoSize = size === "small" ? "small" : "medium";
81
78
 
82
79
  return (
@@ -87,7 +84,7 @@ export const ReadMore = forwardRef<HTMLButtonElement, ReadMoreProps>(
87
84
  className,
88
85
  { "navds-read-more--open": _open },
89
86
  )}
90
- data-volume={themeContext?.volume}
87
+ data-volume="low"
91
88
  >
92
89
  <button
93
90
  {...rest}