@fremtind/jokul 5.0.0-next.9 → 5.0.1

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 (305) hide show
  1. package/build/build-stats.html +1 -1
  2. package/build/cjs/components/autosuggest/BaseAutosuggest.cjs +1 -1
  3. package/build/cjs/components/autosuggest/BaseAutosuggest.cjs.map +1 -1
  4. package/build/cjs/components/checkbox-panel/CheckboxPanel.cjs +1 -1
  5. package/build/cjs/components/checkbox-panel/CheckboxPanel.cjs.map +1 -1
  6. package/build/cjs/components/checkbox-panel/CheckboxPanel.d.cts +1 -1
  7. package/build/cjs/components/expander/Accordion.cjs +2 -0
  8. package/build/cjs/components/expander/Accordion.cjs.map +1 -0
  9. package/build/cjs/components/expander/Accordion.d.cts +2 -0
  10. package/build/cjs/components/expander/ExpandablePanel.cjs +1 -1
  11. package/build/cjs/components/expander/ExpandablePanel.cjs.map +1 -1
  12. package/build/cjs/components/expander/ExpandablePanelContent.cjs +1 -1
  13. package/build/cjs/components/expander/ExpandablePanelContent.cjs.map +1 -1
  14. package/build/cjs/components/expander/Expander.cjs +1 -1
  15. package/build/cjs/components/expander/Expander.cjs.map +1 -1
  16. package/build/cjs/components/expander/index.cjs +1 -1
  17. package/build/cjs/components/expander/index.d.cts +2 -1
  18. package/build/cjs/components/expander/types.d.cts +5 -2
  19. package/build/cjs/components/icon/Icon.cjs +1 -1
  20. package/build/cjs/components/icon/Icon.cjs.map +1 -1
  21. package/build/cjs/components/icon/Icon.d.cts +2 -2
  22. package/build/cjs/components/icon/icons/GreenCheckIcon.cjs +1 -1
  23. package/build/cjs/components/icon/icons/GreenCheckIcon.cjs.map +1 -1
  24. package/build/cjs/components/icon/icons/GreenCheckIcon.d.cts +2 -3
  25. package/build/cjs/components/icon/icons/RedCrossIcon.cjs +1 -1
  26. package/build/cjs/components/icon/icons/RedCrossIcon.cjs.map +1 -1
  27. package/build/cjs/components/icon/icons/RedCrossIcon.d.cts +2 -3
  28. package/build/cjs/components/input-panel/InputPanel.cjs +1 -1
  29. package/build/cjs/components/input-panel/InputPanel.cjs.map +1 -1
  30. package/build/cjs/components/input-panel/InputPanel.d.cts +1 -1
  31. package/build/cjs/components/input-panel/types.d.cts +2 -1
  32. package/build/cjs/components/link-list/LinkList.cjs +1 -1
  33. package/build/cjs/components/link-list/LinkList.cjs.map +1 -1
  34. package/build/cjs/components/link-list/LinkList.d.cts +1 -1
  35. package/build/cjs/components/link-list/types.d.cts +1 -0
  36. package/build/cjs/components/message/Message.cjs +1 -1
  37. package/build/cjs/components/message/Message.cjs.map +1 -1
  38. package/build/cjs/components/number-input/NumberInput.cjs +2 -0
  39. package/build/cjs/components/number-input/NumberInput.cjs.map +1 -0
  40. package/build/cjs/components/number-input/NumberInput.d.cts +7 -0
  41. package/build/cjs/components/number-input/index.cjs +2 -0
  42. package/build/cjs/components/number-input/index.cjs.map +1 -0
  43. package/build/cjs/components/number-input/index.d.cts +2 -0
  44. package/build/cjs/components/number-input/types.cjs +2 -0
  45. package/build/cjs/components/number-input/types.cjs.map +1 -0
  46. package/build/cjs/components/number-input/types.d.cts +20 -0
  47. package/build/cjs/components/popover/Popover.cjs +1 -1
  48. package/build/cjs/components/popover/Popover.cjs.map +1 -1
  49. package/build/cjs/components/popover/types.d.cts +8 -1
  50. package/build/cjs/components/radio-panel/RadioPanel.cjs +1 -1
  51. package/build/cjs/components/radio-panel/RadioPanel.cjs.map +1 -1
  52. package/build/cjs/components/select/Select.cjs +1 -1
  53. package/build/cjs/components/select/Select.cjs.map +1 -1
  54. package/build/cjs/components/system-message/types.d.cts +7 -2
  55. package/build/cjs/components/toast/Toast.cjs +1 -1
  56. package/build/cjs/components/toast/Toast.cjs.map +1 -1
  57. package/build/cjs/components/typography/Title.cjs +1 -1
  58. package/build/cjs/components/typography/Title.cjs.map +1 -1
  59. package/build/cjs/hooks/useListNavigation/useListNavigation.cjs +1 -1
  60. package/build/cjs/hooks/useListNavigation/useListNavigation.cjs.map +1 -1
  61. package/build/cjs/hooks/useListNavigation/useListNavigation.d.cts +11 -2
  62. package/build/cjs/tokens.cjs +1 -1
  63. package/build/cjs/tokens.cjs.map +1 -1
  64. package/build/cjs/utilities/index.cjs +1 -1
  65. package/build/cjs/utilities/types.cjs +1 -1
  66. package/build/cjs/utilities/types.cjs.map +1 -1
  67. package/build/cjs/utilities/types.d.cts +13 -1
  68. package/build/es/components/autosuggest/BaseAutosuggest.js +1 -1
  69. package/build/es/components/autosuggest/BaseAutosuggest.js.map +1 -1
  70. package/build/es/components/checkbox-panel/CheckboxPanel.d.ts +1 -1
  71. package/build/es/components/checkbox-panel/CheckboxPanel.js +1 -1
  72. package/build/es/components/checkbox-panel/CheckboxPanel.js.map +1 -1
  73. package/build/es/components/datepicker/DatePicker.js +1 -1
  74. package/build/es/components/datepicker/internal/Calendar.js +1 -1
  75. package/build/es/components/datepicker/internal/useCalendar.js +1 -1
  76. package/build/es/components/datepicker/internal/utils.js +1 -1
  77. package/build/es/components/expander/Accordion.d.ts +2 -0
  78. package/build/es/components/expander/Accordion.js +2 -0
  79. package/build/es/components/expander/Accordion.js.map +1 -0
  80. package/build/es/components/expander/ExpandablePanel.js +1 -1
  81. package/build/es/components/expander/ExpandablePanel.js.map +1 -1
  82. package/build/es/components/expander/ExpandablePanelContent.js +1 -1
  83. package/build/es/components/expander/ExpandablePanelContent.js.map +1 -1
  84. package/build/es/components/expander/Expander.js +1 -1
  85. package/build/es/components/expander/Expander.js.map +1 -1
  86. package/build/es/components/expander/index.d.ts +2 -1
  87. package/build/es/components/expander/index.js +1 -1
  88. package/build/es/components/expander/types.d.ts +5 -2
  89. package/build/es/components/icon/Icon.d.ts +2 -2
  90. package/build/es/components/icon/Icon.js +1 -1
  91. package/build/es/components/icon/Icon.js.map +1 -1
  92. package/build/es/components/icon/icons/GreenCheckIcon.d.ts +2 -3
  93. package/build/es/components/icon/icons/GreenCheckIcon.js +1 -1
  94. package/build/es/components/icon/icons/GreenCheckIcon.js.map +1 -1
  95. package/build/es/components/icon/icons/RedCrossIcon.d.ts +2 -3
  96. package/build/es/components/icon/icons/RedCrossIcon.js +1 -1
  97. package/build/es/components/icon/icons/RedCrossIcon.js.map +1 -1
  98. package/build/es/components/input-panel/InputPanel.d.ts +1 -1
  99. package/build/es/components/input-panel/InputPanel.js +1 -1
  100. package/build/es/components/input-panel/InputPanel.js.map +1 -1
  101. package/build/es/components/input-panel/types.d.ts +2 -1
  102. package/build/es/components/link-list/LinkList.d.ts +1 -1
  103. package/build/es/components/link-list/LinkList.js +1 -1
  104. package/build/es/components/link-list/LinkList.js.map +1 -1
  105. package/build/es/components/link-list/types.d.ts +1 -0
  106. package/build/es/components/menu/Menu.js +1 -1
  107. package/build/es/components/message/Message.js +1 -1
  108. package/build/es/components/message/Message.js.map +1 -1
  109. package/build/es/components/number-input/NumberInput.d.ts +7 -0
  110. package/build/es/components/number-input/NumberInput.js +2 -0
  111. package/build/es/components/number-input/NumberInput.js.map +1 -0
  112. package/build/es/components/number-input/index.d.ts +2 -0
  113. package/build/es/components/number-input/index.js +2 -0
  114. package/build/es/components/number-input/index.js.map +1 -0
  115. package/build/es/components/number-input/types.d.ts +20 -0
  116. package/build/es/components/number-input/types.js +2 -0
  117. package/build/es/components/number-input/types.js.map +1 -0
  118. package/build/es/components/popover/Popover.js +1 -1
  119. package/build/es/components/popover/Popover.js.map +1 -1
  120. package/build/es/components/popover/types.d.ts +8 -1
  121. package/build/es/components/radio-panel/RadioPanel.js +1 -1
  122. package/build/es/components/radio-panel/RadioPanel.js.map +1 -1
  123. package/build/es/components/select/Select.js +1 -1
  124. package/build/es/components/select/Select.js.map +1 -1
  125. package/build/es/components/system-message/types.d.ts +7 -2
  126. package/build/es/components/toast/Toast.js +1 -1
  127. package/build/es/components/toast/Toast.js.map +1 -1
  128. package/build/es/components/toast/toastContext.js +1 -1
  129. package/build/es/components/tooltip/Tooltip.js +1 -1
  130. package/build/es/components/typography/Title.js +1 -1
  131. package/build/es/components/typography/Title.js.map +1 -1
  132. package/build/es/hooks/stories/content.js +1 -1
  133. package/build/es/hooks/useListNavigation/useListNavigation.d.ts +11 -2
  134. package/build/es/hooks/useListNavigation/useListNavigation.js +1 -1
  135. package/build/es/hooks/useListNavigation/useListNavigation.js.map +1 -1
  136. package/build/es/tokens.js +1 -1
  137. package/build/es/tokens.js.map +1 -1
  138. package/build/es/utilities/constants/index.js +1 -1
  139. package/build/es/utilities/constants/unicode.js +1 -1
  140. package/build/es/utilities/formatters/bytes/formatBytes.js +1 -1
  141. package/build/es/utilities/formatters/fodselsnummer/formatFodselsnummer.js +1 -1
  142. package/build/es/utilities/formatters/kontonummer/formatKontonummer.js +1 -1
  143. package/build/es/utilities/formatters/kortnummer/formatKortnummer.js +1 -1
  144. package/build/es/utilities/formatters/organisasjonsnummer/formatOrganisasjonsnummer.js +1 -1
  145. package/build/es/utilities/formatters/telefonnummer/formatTelefonnummer.js +1 -1
  146. package/build/es/utilities/formatters/valuta/formatValuta.js +1 -1
  147. package/build/es/utilities/index.js +1 -1
  148. package/build/es/utilities/types.d.ts +13 -1
  149. package/build/es/utilities/types.js +1 -1
  150. package/build/es/utilities/types.js.map +1 -1
  151. package/build/{index-CWRMnfcx.js → index-C1iqmqvT.js} +2 -2
  152. package/build/{index-CWRMnfcx.js.map → index-C1iqmqvT.js.map} +1 -1
  153. package/build/{utils-CcE6HjQp.js → utils-CtwpNW4I.js} +2 -2
  154. package/build/{utils-CcE6HjQp.js.map → utils-CtwpNW4I.js.map} +1 -1
  155. package/codemods/CODEMODS.md +133 -0
  156. package/codemods/__tests__/import-paths.test.mjs +568 -94
  157. package/codemods/import-paths.mjs +34 -339
  158. package/codemods/transforms/color-tokens.mjs +102 -0
  159. package/codemods/transforms/expandable-panel.mjs +41 -0
  160. package/codemods/transforms/font-family.mjs +23 -0
  161. package/codemods/transforms/import-specifiers.mjs +226 -0
  162. package/codemods/transforms/warnings.mjs +41 -0
  163. package/codemods/utils.mjs +35 -0
  164. package/package.json +8 -4
  165. package/styles/base.css +183 -805
  166. package/styles/base.min.css +1 -1
  167. package/styles/components/autosuggest/autosuggest.css +4 -3
  168. package/styles/components/autosuggest/autosuggest.min.css +1 -1
  169. package/styles/components/autosuggest/autosuggest.scss +4 -3
  170. package/styles/components/breadcrumb/breadcrumb.css +0 -1
  171. package/styles/components/breadcrumb/breadcrumb.min.css +1 -1
  172. package/styles/components/breadcrumb/breadcrumb.scss +0 -1
  173. package/styles/components/button/button.css +9 -4
  174. package/styles/components/button/button.min.css +1 -1
  175. package/styles/components/button/button.scss +11 -5
  176. package/styles/components/checkbox/checkbox.css +1 -1
  177. package/styles/components/checkbox/checkbox.min.css +1 -1
  178. package/styles/components/checkbox/checkbox.scss +1 -1
  179. package/styles/components/checkbox-panel/checkbox-panel.css +1 -1
  180. package/styles/components/checkbox-panel/checkbox-panel.min.css +1 -1
  181. package/styles/components/chip/chip.css +0 -1
  182. package/styles/components/chip/chip.min.css +1 -1
  183. package/styles/components/chip/chip.scss +0 -1
  184. package/styles/components/combobox/combobox.css +4 -5
  185. package/styles/components/combobox/combobox.min.css +1 -1
  186. package/styles/components/combobox/combobox.scss +4 -5
  187. package/styles/components/countdown/countdown.css +2 -2
  188. package/styles/components/countdown/countdown.min.css +1 -1
  189. package/styles/components/datepicker/_calendar-date-button.scss +0 -2
  190. package/styles/components/datepicker/datepicker.css +0 -2
  191. package/styles/components/datepicker/datepicker.min.css +1 -1
  192. package/styles/components/expander/_index.scss +1 -0
  193. package/styles/components/expander/accordion.css +21 -0
  194. package/styles/components/expander/accordion.min.css +1 -0
  195. package/styles/components/expander/accordion.scss +24 -0
  196. package/styles/components/expander/expandable.css +32 -37
  197. package/styles/components/expander/expandable.min.css +1 -1
  198. package/styles/components/expander/expandable.scss +27 -36
  199. package/styles/components/feedback/feedback.css +2 -2
  200. package/styles/components/feedback/feedback.min.css +1 -1
  201. package/styles/components/feedback/feedback.scss +0 -1
  202. package/styles/components/file/file.css +4 -1
  203. package/styles/components/file/file.min.css +1 -1
  204. package/styles/components/file/file.scss +5 -1
  205. package/styles/components/file-input/file-input.css +36 -21
  206. package/styles/components/file-input/file-input.min.css +1 -1
  207. package/styles/components/icon/icon.scss +1 -1
  208. package/styles/components/icon-button/icon-button.css +0 -1
  209. package/styles/components/icon-button/icon-button.min.css +1 -1
  210. package/styles/components/icon-button/icon-button.scss +0 -1
  211. package/styles/components/input-group/input-group.css +2 -2
  212. package/styles/components/input-group/input-group.min.css +1 -1
  213. package/styles/components/link/link.css +14 -7
  214. package/styles/components/link/link.min.css +1 -1
  215. package/styles/components/link/link.scss +18 -10
  216. package/styles/components/link-list/link-list.css +7 -2
  217. package/styles/components/link-list/link-list.min.css +1 -1
  218. package/styles/components/link-list/link-list.scss +10 -3
  219. package/styles/components/list/list.css +33 -21
  220. package/styles/components/list/list.min.css +1 -1
  221. package/styles/components/list/list.scss +24 -24
  222. package/styles/components/loader/loader.css +6 -6
  223. package/styles/components/loader/loader.min.css +1 -1
  224. package/styles/components/loader/skeleton-loader.css +3 -3
  225. package/styles/components/loader/skeleton-loader.min.css +1 -1
  226. package/styles/components/menu/_menu-item.scss +1 -2
  227. package/styles/components/menu/menu.css +1 -2
  228. package/styles/components/menu/menu.min.css +1 -1
  229. package/styles/components/message/message.css +9 -10
  230. package/styles/components/message/message.min.css +1 -1
  231. package/styles/components/message/message.scss +7 -8
  232. package/styles/components/modal/_index.scss +7 -0
  233. package/styles/components/modal/_overlay.scss +4 -0
  234. package/styles/components/modal/modal.css +32 -116
  235. package/styles/components/modal/modal.min.css +1 -1
  236. package/styles/components/modal/modal.scss +96 -6
  237. package/styles/components/number-input/_index.scss +2 -0
  238. package/styles/components/number-input/number-input.css +214 -0
  239. package/styles/components/number-input/number-input.min.css +1 -0
  240. package/styles/components/number-input/number-input.scss +115 -0
  241. package/styles/components/pagination/pagination.css +1 -1
  242. package/styles/components/pagination/pagination.scss +1 -1
  243. package/styles/components/progress-bar/progress-bar.css +1 -1
  244. package/styles/components/progress-bar/progress-bar.min.css +1 -1
  245. package/styles/components/radio-button/radio-button.css +1 -5
  246. package/styles/components/radio-button/radio-button.min.css +1 -1
  247. package/styles/components/radio-button/radio-button.scss +2 -7
  248. package/styles/components/search/search.css +0 -1
  249. package/styles/components/search/search.min.css +1 -1
  250. package/styles/components/search/search.scss +0 -1
  251. package/styles/components/segmented-control/segmented-control.css +3 -7
  252. package/styles/components/segmented-control/segmented-control.min.css +1 -1
  253. package/styles/components/select/select.css +65 -7
  254. package/styles/components/select/select.min.css +1 -1
  255. package/styles/components/select/select.scss +129 -18
  256. package/styles/components/system-message/system-message.css +9 -14
  257. package/styles/components/system-message/system-message.min.css +1 -1
  258. package/styles/components/system-message/system-message.scss +113 -121
  259. package/styles/components/table/_table-pagination.scss +0 -1
  260. package/styles/components/table/table.css +0 -1
  261. package/styles/components/table/table.min.css +1 -1
  262. package/styles/components/tabs/tabs.css +0 -1
  263. package/styles/components/tabs/tabs.min.css +1 -1
  264. package/styles/components/tabs/tabs.scss +0 -1
  265. package/styles/components/tag/tag.css +4 -4
  266. package/styles/components/tag/tag.min.css +1 -1
  267. package/styles/components/tag/tag.scss +4 -4
  268. package/styles/components/toast/toast.css +34 -9
  269. package/styles/components/toast/toast.min.css +1 -1
  270. package/styles/components/toast/toast.scss +44 -9
  271. package/styles/components/toggle-switch/toggle-switch.css +0 -1
  272. package/styles/components/toggle-switch/toggle-switch.min.css +1 -1
  273. package/styles/components/toggle-switch/toggle-switch.scss +0 -1
  274. package/styles/components/typography/text.css +2 -2
  275. package/styles/components/typography/text.min.css +1 -1
  276. package/styles/components/typography/text.scss +4 -4
  277. package/styles/components/typography/title.css +8 -30
  278. package/styles/components/typography/title.min.css +1 -1
  279. package/styles/components/typography/title.scss +8 -31
  280. package/styles/components.css +582 -189
  281. package/styles/components.min.css +1 -1
  282. package/styles/components.scss +2 -1
  283. package/styles/global/_base-class.scss +4 -0
  284. package/styles/jkl/_convert.scss +15 -6
  285. package/styles/jkl/_tokens.scss +4 -4
  286. package/styles/tailwind.css +97 -97
  287. package/styles/theme/_color-scheme.scss +95 -95
  288. package/styles/theme/_dynamic-spacing.scss +21 -15
  289. package/styles/theme/_fonts.scss +3 -12
  290. package/styles/theme/_index.scss +0 -4
  291. package/styles/theme/_size.scss +20 -20
  292. package/styles/theme/_tokens.scss +11 -11
  293. package/styles/core/utility/_paragraphs.scss +0 -39
  294. package/styles/theme/brands/dnb/_color-scheme.scss +0 -121
  295. package/styles/theme/brands/dnb/_fonts.scss +0 -46
  296. package/styles/theme/brands/dnb/_index.scss +0 -2
  297. package/styles/theme/brands/eika/_color-scheme.scss +0 -121
  298. package/styles/theme/brands/eika/_fonts.scss +0 -46
  299. package/styles/theme/brands/eika/_index.scss +0 -2
  300. package/styles/theme/brands/fremtind/_color-scheme.scss +0 -121
  301. package/styles/theme/brands/fremtind/_fonts.scss +0 -30
  302. package/styles/theme/brands/fremtind/_index.scss +0 -2
  303. package/styles/theme/brands/sparebank1/_color-scheme.scss +0 -121
  304. package/styles/theme/brands/sparebank1/_fonts.scss +0 -38
  305. package/styles/theme/brands/sparebank1/_index.scss +0 -2
@@ -1,5 +1,5 @@
1
- import test from "node:test";
2
1
  import assert from "node:assert/strict";
2
+ import test from "node:test";
3
3
  import { transformImportPaths } from "../import-paths.mjs";
4
4
 
5
5
  test("migrates core, styles and utilities imports", () => {
@@ -16,7 +16,9 @@ import type { WithChildren } from "@fremtind/jokul/core";
16
16
  true,
17
17
  );
18
18
  assert.equal(
19
- result.text.includes('import "@fremtind/jokul/styles/components.scss";'),
19
+ result.text.includes(
20
+ 'import "@fremtind/jokul/styles/components.scss";',
21
+ ),
20
22
  true,
21
23
  );
22
24
  assert.equal(
@@ -58,71 +60,40 @@ test("migrates internal relative core jkl imports", () => {
58
60
  test("rewrites beta style imports when the beta component is used in the same file", () => {
59
61
  const source = `
60
62
  import { BETA_Select } from "@fremtind/jokul/select";
61
- import "@fremtind/jokul/styles/components/select/_index.scss";
63
+ import "@fremtind/jokul/styles/components/select";
62
64
  `;
63
65
 
64
- const result = transformImportPaths(source, "/tmp/example.tsx");
66
+ const result = transformImportPaths(source, "/tmp/MyForm.tsx");
65
67
 
66
68
  assert.equal(
67
- result.text.includes(
68
- '@fremtind/jokul/styles/components/beta/select/_index.scss',
69
- ),
69
+ result.text.includes("@fremtind/jokul/styles/components/beta/select"),
70
70
  true,
71
71
  );
72
72
  assert.deepEqual(result.warnings, []);
73
73
  });
74
74
 
75
- test("warns when beta style imports are ambiguous", () => {
75
+ test("warns when beta style import is ambiguous (no beta identifier in file)", () => {
76
76
  const source = `
77
- import "@fremtind/jokul/styles/components/nav-link";
77
+ import "@fremtind/jokul/styles/components/select";
78
78
  `;
79
79
 
80
- const result = transformImportPaths(source, "/tmp/example.scss");
80
+ const result = transformImportPaths(source, "/tmp/global.scss");
81
81
 
82
- assert.equal(result.changed, false);
83
82
  assert.equal(result.warnings.length, 1);
83
+ assert.match(result.warnings[0], /Select/);
84
84
  });
85
85
 
86
- test("removes redundant webfonts.css imports when base or components css is also imported", () => {
87
- const source = `import "@fremtind/jokul/styles/styles.css";
88
- import "@fremtind/jokul/styles/core/core.css";
86
+ test("removes esm webfonts.css import when base or components css is present", () => {
87
+ const source = `import "@fremtind/jokul/styles/base.css";
89
88
  import "@fremtind/jokul/styles/fonts/webfonts.css";
90
89
  `;
91
90
 
92
91
  const result = transformImportPaths(source, "/tmp/main.tsx");
93
92
 
94
- assert.equal(
95
- result.text.includes("@fremtind/jokul/styles/fonts/webfonts.css"),
96
- false,
97
- );
98
- assert.equal(
99
- result.text.includes('import "@fremtind/jokul/styles/components.css";'),
100
- true,
101
- );
102
- assert.equal(
103
- result.text.includes('import "@fremtind/jokul/styles/base.css";'),
104
- true,
105
- );
93
+ assert.equal(result.text.includes("webfonts"), false);
106
94
  assert.deepEqual(result.warnings, []);
107
95
  });
108
96
 
109
- test("removes minified webfonts.css imports as well", () => {
110
- const source = `import "@fremtind/jokul/styles/core/core.min.css";
111
- import "@fremtind/jokul/styles/fonts/webfonts.min.css";
112
- `;
113
-
114
- const result = transformImportPaths(source, "/tmp/main.ts");
115
-
116
- assert.equal(
117
- result.text.includes("webfonts"),
118
- false,
119
- );
120
- assert.equal(
121
- result.text.includes('import "@fremtind/jokul/styles/base.min.css";'),
122
- true,
123
- );
124
- });
125
-
126
97
  test("warns when webfonts.css is removed without a base or components import", () => {
127
98
  const source = `import "@fremtind/jokul/styles/fonts/webfonts.css";
128
99
  `;
@@ -143,127 +114,574 @@ test("removes css @import of webfonts.css", () => {
143
114
 
144
115
  assert.equal(result.text.includes("webfonts"), false);
145
116
  assert.equal(
146
- result.text.includes('@import "@fremtind/jokul/styles/components.css";'),
117
+ result.text.includes(
118
+ '@import "@fremtind/jokul/styles/components.css";',
119
+ ),
147
120
  true,
148
121
  );
149
122
  assert.deepEqual(result.warnings, []);
150
123
  });
151
124
 
152
- test("warns about removed sass color variables", () => {
153
- const source = `@use "@fremtind/jokul/styles/jkl";
154
-
155
- .banner {
156
- background: jkl.$color-granitt;
157
- color: jkl.$color-snohvit;
125
+ test("renames Fremtind Material Symbols font-family", () => {
126
+ const source = `.icon {
127
+ font-family: "Fremtind Material Symbols", "Fremtind Material Symbols Fallback", sans-serif;
158
128
  }
159
129
  `;
160
130
 
161
- const result = transformImportPaths(source, "/tmp/banner.scss");
131
+ const result = transformImportPaths(source, "/tmp/icons.scss");
162
132
 
133
+ assert.equal(result.text.includes("Fremtind Material Symbols"), false);
163
134
  assert.equal(
164
- result.warnings.some((warning) =>
165
- /jkl\.\$color-\*/.test(warning),
135
+ result.text.includes(
136
+ '"Jokul Icons", "Jokul Icons Fallback", sans-serif',
166
137
  ),
167
138
  true,
168
139
  );
169
- // Bare én advarsel per mønster, selv om det er flere forekomster
140
+ assert.equal(result.replacements, 2);
141
+ });
142
+
143
+ test("renames Fremtind Material Symbols inside CSS files too", () => {
144
+ const source = `.icon {
145
+ font-family: 'Fremtind Material Symbols';
146
+ }
147
+ `;
148
+
149
+ const result = transformImportPaths(source, "/tmp/icons.css");
150
+
151
+ assert.equal(result.text.includes("Fremtind Material Symbols"), false);
152
+ assert.equal(result.text.includes("'Jokul Icons'"), true);
153
+ });
154
+
155
+ test("renames CSS background-action token", () => {
156
+ const source = `.btn {
157
+ background: var(--jkl-color-background-action);
158
+ color: var(--jkl-color-text-on-action);
159
+ }
160
+ `;
161
+
162
+ const result = transformImportPaths(source, "/tmp/button.css");
163
+
164
+ assert.equal(result.text.includes("--jkl-color-background-action"), false);
165
+ assert.equal(result.text.includes("--jkl-color-text-on-action"), false);
166
+ assert.equal(result.text.includes("--jkl-color-background-contrast"), true);
167
+ assert.equal(result.text.includes("--jkl-color-text-on-contrast"), true);
168
+ assert.equal(result.changed, true);
169
+ });
170
+
171
+ test("renames CSS text-inverted token to text-on-contrast", () => {
172
+ const source = `.inverted {
173
+ color: var(--jkl-color-text-inverted);
174
+ }
175
+ `;
176
+
177
+ const result = transformImportPaths(source, "/tmp/theme.css");
178
+
179
+ assert.equal(result.text.includes("--jkl-color-text-inverted"), false);
180
+ assert.equal(result.text.includes("--jkl-color-text-on-contrast"), true);
181
+ });
182
+
183
+ test("renames CSS container-high and container-low tokens", () => {
184
+ const source = `.card-high {
185
+ background: var(--jkl-color-background-container-high);
186
+ }
187
+ .card-low {
188
+ background: var(--jkl-color-background-container-low);
189
+ }
190
+ `;
191
+
192
+ const result = transformImportPaths(source, "/tmp/card.css");
193
+
170
194
  assert.equal(
171
- result.warnings.filter((warning) =>
172
- /jkl\.\$color-\*/.test(warning),
173
- ).length,
174
- 1,
195
+ result.text.includes("--jkl-color-background-container-high"),
196
+ false,
197
+ );
198
+ assert.equal(
199
+ result.text.includes("--jkl-color-background-container-low"),
200
+ false,
201
+ );
202
+ assert.equal(
203
+ result.text.split("--jkl-color-background-container").length - 1,
204
+ 2,
205
+ "should have two occurrences of the new token",
175
206
  );
176
207
  });
177
208
 
178
- test("warns about removed light/dark mode mixins", () => {
179
- const source = `@use "@fremtind/jokul/styles/jkl";
209
+ test("renames CSS alert tokens to feedback tokens", () => {
210
+ const source = `.info { background: var(--jkl-color-background-alert-info); }
211
+ .warning { background: var(--jkl-color-background-alert-warning); }
212
+ .error { background: var(--jkl-color-background-alert-error); }
213
+ .success { background: var(--jkl-color-background-alert-success); }
214
+ `;
180
215
 
181
- @include jkl.light-mode-variables {
182
- --min-farge: jkl.$color-granitt;
183
- }
184
- @include jkl.dark-mode-variables {
185
- --min-farge: jkl.$color-snohvit;
216
+ const result = transformImportPaths(source, "/tmp/alerts.css");
217
+
218
+ assert.equal(result.text.includes("--jkl-color-background-alert-"), false);
219
+ assert.equal(
220
+ result.text.includes("--jkl-color-info-background-container"),
221
+ true,
222
+ );
223
+ assert.equal(
224
+ result.text.includes("--jkl-color-warning-background-container"),
225
+ true,
226
+ );
227
+ assert.equal(
228
+ result.text.includes("--jkl-color-error-background-container"),
229
+ true,
230
+ );
231
+ assert.equal(
232
+ result.text.includes("--jkl-color-success-background-container"),
233
+ true,
234
+ );
235
+ });
236
+
237
+ test("warns about removed interactive tokens", () => {
238
+ const source = `.item {
239
+ background: var(--jkl-color-background-interactive);
240
+ color: var(--jkl-color-text-interactive);
186
241
  }
187
242
  `;
188
243
 
189
- const result = transformImportPaths(source, "/tmp/theme.scss");
244
+ const result = transformImportPaths(source, "/tmp/interactive.css");
190
245
 
191
246
  assert.equal(
192
- result.warnings.some((warning) =>
193
- /light-mode-variables/.test(warning),
194
- ),
247
+ result.warnings.some((w) => /interactive/.test(w)),
195
248
  true,
196
249
  );
250
+ assert.equal(
251
+ result.warnings.filter((w) => /interactive/.test(w)).length,
252
+ 1,
253
+ "should produce one warning for both interactive tokens",
254
+ );
197
255
  });
198
256
 
199
- test("warns about deprecated text-style names", () => {
200
- const source = `@use "@fremtind/jokul/styles/jkl";
257
+ test("warns about removed text-on-alert tokens", () => {
258
+ const source = `.info { color: var(--jkl-color-text-on-alert-info); }
259
+ `;
201
260
 
202
- .lead {
203
- @include jkl.text-style("body");
204
- }
261
+ const result = transformImportPaths(source, "/tmp/alerts.css");
205
262
 
206
- .fineprint {
207
- @include jkl.text-style("small");
208
- }
263
+ assert.equal(
264
+ result.warnings.some((w) => /text-on-alert/.test(w)),
265
+ true,
266
+ );
267
+ });
268
+
269
+ test("warns about Card variant prop", () => {
270
+ const source = `<Card variant="outlined">
271
+ <p>Innhold</p>
272
+ </Card>
209
273
  `;
210
274
 
211
- const result = transformImportPaths(source, "/tmp/typography.scss");
275
+ const result = transformImportPaths(source, "/tmp/MyCard.tsx");
212
276
 
213
277
  assert.equal(
214
- result.warnings.some((warning) =>
215
- /paragraph-large\/medium\/small/.test(warning),
216
- ),
278
+ result.warnings.some((w) => /variant/.test(w) && /Card/.test(w)),
217
279
  true,
218
280
  );
281
+ });
282
+
283
+ test("warns about Card variant high and low", () => {
284
+ const source = `function Page() {
285
+ return (
286
+ <>
287
+ <Card variant="high">Høy</Card>
288
+ <Card variant="low">Lav</Card>
289
+ </>
290
+ );
291
+ }
292
+ `;
293
+
294
+ const result = transformImportPaths(source, "/tmp/Page.tsx");
295
+
219
296
  assert.equal(
220
- result.warnings.some((warning) => /<Text>-komponenten/.test(warning)),
297
+ result.warnings.some((w) => /variant/.test(w)),
221
298
  true,
222
299
  );
300
+ assert.equal(
301
+ result.warnings.filter((w) => /variant/.test(w)).length,
302
+ 1,
303
+ "should produce one warning even with multiple variant usages",
304
+ );
223
305
  });
224
306
 
225
- test("renames Fremtind Material Symbols font-family", () => {
226
- const source = `.icon {
227
- font-family: "Fremtind Material Symbols", "Fremtind Material Symbols Fallback", sans-serif;
307
+ test("renames container-inverted to background-contrast", () => {
308
+ const source = `.inverted { background: var(--jkl-color-background-container-inverted); }
309
+ `;
310
+
311
+ const result = transformImportPaths(source, "/tmp/inverted.css");
312
+
313
+ assert.equal(
314
+ result.text.includes("--jkl-color-background-container-inverted"),
315
+ false,
316
+ );
317
+ assert.equal(result.text.includes("--jkl-color-background-contrast"), true);
318
+ assert.deepEqual(result.warnings, []);
319
+ });
320
+
321
+ // --- idempotency ---
322
+
323
+ test("is idempotent — running twice gives same result", () => {
324
+ const source = `import "@fremtind/jokul/styles/core/core.scss";
325
+
326
+ .btn { background: var(--jkl-color-background-action); }
327
+ `;
328
+
329
+ const first = transformImportPaths(source, "/tmp/page.scss");
330
+ const second = transformImportPaths(first.text, "/tmp/page.scss");
331
+
332
+ assert.equal(second.changed, false);
333
+ assert.equal(second.replacements, 0);
334
+ assert.equal(second.text, first.text);
335
+ });
336
+
337
+ // --- no-op ---
338
+
339
+ test("returns changed: false for an already-migrated file", () => {
340
+ const source = `import "@fremtind/jokul/styles/base.scss";
341
+
342
+ .btn { background: var(--jkl-color-background-contrast); }
343
+ `;
344
+
345
+ const result = transformImportPaths(source, "/tmp/page.ts");
346
+
347
+ assert.equal(result.changed, false);
348
+ assert.equal(result.replacements, 0);
349
+ assert.deepEqual(result.warnings, []);
350
+ });
351
+
352
+ // --- token boundary safety ---
353
+
354
+ test("does not rename token that is a prefix of a longer token", () => {
355
+ // --jkl-color-text-inverted should not match inside --jkl-color-text-inverted-extra
356
+ const source = ".x { color: var(--jkl-color-text-inverted-extra); }";
357
+
358
+ const result = transformImportPaths(source, "/tmp/x.css");
359
+
360
+ assert.equal(result.text.includes("--jkl-color-text-inverted-extra"), true);
361
+ assert.equal(result.changed, false);
362
+ });
363
+
364
+ test("does not rename --jkl-color-background-container (base token, not a v4 token)", () => {
365
+ const source = ".x { background: var(--jkl-color-background-container); }";
366
+
367
+ const result = transformImportPaths(source, "/tmp/x.css");
368
+
369
+ assert.equal(result.text, source);
370
+ assert.equal(result.changed, false);
371
+ });
372
+
373
+ test("renames container-high but leaves sibling container-low and base container intact in same rule", () => {
374
+ const source = `.x {
375
+ --high: var(--jkl-color-background-container-high);
376
+ --low: var(--jkl-color-background-container-low);
377
+ --base: var(--jkl-color-background-container);
228
378
  }
229
379
  `;
230
380
 
231
- const result = transformImportPaths(source, "/tmp/icons.scss");
381
+ const result = transformImportPaths(source, "/tmp/x.css");
232
382
 
233
383
  assert.equal(
234
- result.text.includes("Fremtind Material Symbols"),
384
+ result.text.includes("--jkl-color-background-container-high"),
235
385
  false,
236
386
  );
237
387
  assert.equal(
238
- result.text.includes(
239
- '"Jokul Icons", "Jokul Icons Fallback", sans-serif',
240
- ),
388
+ result.text.includes("--jkl-color-background-container-low"),
389
+ false,
390
+ );
391
+ assert.equal(
392
+ result.text.includes("var(--jkl-color-background-container)"),
241
393
  true,
394
+ "base container token must survive unchanged",
242
395
  );
243
396
  assert.equal(result.replacements, 2);
244
397
  });
245
398
 
246
- test("renames Fremtind Material Symbols inside CSS files too", () => {
399
+ test("does not rename alert-info token that has a longer suffix", () => {
400
+ const source =
401
+ ".x { background: var(--jkl-color-background-alert-info-extra); }";
402
+
403
+ const result = transformImportPaths(source, "/tmp/x.css");
404
+
405
+ assert.equal(result.changed, false);
406
+ });
407
+
408
+ // --- CSS token as custom property definition ---
409
+
410
+ test("renames token used as a custom property definition, not just inside var()", () => {
411
+ const source = `:root {
412
+ --jkl-color-background-action: #005aa4;
413
+ --jkl-color-text-inverted: #fff;
414
+ }
415
+ `;
416
+
417
+ const result = transformImportPaths(source, "/tmp/overrides.css");
418
+
419
+ assert.equal(result.text.includes("--jkl-color-background-action:"), false);
420
+ assert.equal(result.text.includes("--jkl-color-text-inverted:"), false);
421
+ assert.equal(
422
+ result.text.includes("--jkl-color-background-contrast:"),
423
+ true,
424
+ );
425
+ assert.equal(result.text.includes("--jkl-color-text-on-contrast:"), true);
426
+ });
427
+
428
+ // --- webfonts edge cases ---
429
+
430
+ test("removes webfonts.min.css import", () => {
431
+ const source = `import "@fremtind/jokul/styles/base.css";
432
+ import "@fremtind/jokul/styles/fonts/webfonts.min.css";
433
+ `;
434
+
435
+ const result = transformImportPaths(source, "/tmp/main.tsx");
436
+
437
+ assert.equal(result.text.includes("webfonts"), false);
438
+ assert.deepEqual(result.warnings, []);
439
+ });
440
+
441
+ test("removes webfonts.css when imported with require()", () => {
442
+ const source = `require("@fremtind/jokul/styles/base.css");
443
+ require("@fremtind/jokul/styles/fonts/webfonts.css");
444
+ `;
445
+
446
+ const result = transformImportPaths(source, "/tmp/main.cjs");
447
+
448
+ assert.equal(result.text.includes("webfonts"), false);
449
+ assert.deepEqual(result.warnings, []);
450
+ });
451
+
452
+ // --- font family edge cases ---
453
+
454
+ test("renames only the fallback font-family if primary is absent", () => {
247
455
  const source = `.icon {
248
- font-family: 'Fremtind Material Symbols';
456
+ font-family: "Fremtind Material Symbols Fallback";
249
457
  }
250
458
  `;
251
459
 
252
460
  const result = transformImportPaths(source, "/tmp/icons.css");
253
461
 
254
462
  assert.equal(
255
- result.text.includes("Fremtind Material Symbols"),
463
+ result.text.includes("Fremtind Material Symbols Fallback"),
256
464
  false,
257
465
  );
258
- assert.equal(result.text.includes("'Jokul Icons'"), true);
466
+ assert.equal(result.text.includes("Jokul Icons Fallback"), true);
467
+ assert.equal(result.replacements, 1);
259
468
  });
260
469
 
470
+ // --- combined transforms ---
471
+
472
+ test("applies import path and token rename in one pass", () => {
473
+ const source = `import "@fremtind/jokul/styles/core/core.scss";
474
+
475
+ .inverted {
476
+ background: var(--jkl-color-background-action);
477
+ }
478
+
479
+ export default function Page() {
480
+ return <section />;
481
+ }
482
+ `;
483
+
484
+ const result = transformImportPaths(source, "/tmp/page.tsx");
485
+
486
+ assert.equal(result.text.includes("styles/core/core"), false);
487
+ assert.equal(result.text.includes("--jkl-color-background-action"), false);
488
+ assert.equal(result.text.includes("styles/base.scss"), true);
489
+ assert.equal(result.text.includes("--jkl-color-background-contrast"), true);
490
+ assert.equal(result.replacements, 2);
491
+ });
492
+
493
+ // --- SCSS-only transforms ---
494
+
495
+ test("does not reorder font import in a .css file", () => {
496
+ const source = `@import "@fremtind/jokul/styles/base.css";
497
+ @import "@fremtind/jokul/styles/theme/fonts";
498
+ `;
499
+
500
+ const result = transformImportPaths(source, "/tmp/global.css");
501
+
502
+ assert.equal(result.reordered, false);
503
+ });
504
+
505
+ // --- Tailwind color class renames ---
506
+
507
+ test("renames bg-background-action to bg-background-contrast", () => {
508
+ const source = `<div className="bg-background-action text-white">Innhold</div>`;
509
+
510
+ const result = transformImportPaths(source, "/tmp/component.tsx");
511
+
512
+ assert.equal(result.text.includes("bg-background-action"), false);
513
+ assert.equal(result.text.includes("bg-background-contrast"), true);
514
+ assert.equal(result.replacements, 1);
515
+ });
516
+
517
+ test("renames text-text-inverted to text-text-on-contrast", () => {
518
+ const source = `<p className="text-text-inverted">Tekst</p>`;
519
+
520
+ const result = transformImportPaths(source, "/tmp/page.tsx");
521
+
522
+ assert.equal(result.text.includes("text-text-inverted"), false);
523
+ assert.equal(result.text.includes("text-text-on-contrast"), true);
524
+ });
525
+
526
+ test("renames text-text-on-action to text-text-on-contrast", () => {
527
+ const source = `<button className="bg-background-contrast text-text-on-action">Knapp</button>`;
528
+
529
+ const result = transformImportPaths(source, "/tmp/button.tsx");
530
+
531
+ assert.equal(result.text.includes("text-text-on-action"), false);
532
+ assert.equal(result.text.includes("text-text-on-contrast"), true);
533
+ });
534
+
535
+ test("renames bg-background-container-high and -low", () => {
536
+ const source = `<div className="bg-background-container-high md:bg-background-container-low">
537
+ Innhold
538
+ </div>`;
539
+
540
+ const result = transformImportPaths(source, "/tmp/card.tsx");
541
+
542
+ assert.equal(result.text.includes("bg-background-container-high"), false);
543
+ assert.equal(result.text.includes("bg-background-container-low"), false);
544
+ assert.equal(result.text.includes("bg-background-container"), true);
545
+ assert.equal(result.replacements, 2);
546
+ });
547
+
548
+ test("does not rename bg-background-container (base Tailwind class)", () => {
549
+ const source = `<div className="bg-background-container">Innhold</div>`;
550
+
551
+ const result = transformImportPaths(source, "/tmp/card.tsx");
552
+
553
+ assert.equal(result.text, source);
554
+ assert.equal(result.changed, false);
555
+ });
556
+
557
+ test("renames bg-background-alert-info to bg-info-background-container", () => {
558
+ const source = `<div className="bg-background-alert-info border-border-subdued">
559
+ Info
560
+ </div>`;
561
+
562
+ const result = transformImportPaths(source, "/tmp/alert.tsx");
563
+
564
+ assert.equal(result.text.includes("bg-background-alert-info"), false);
565
+ assert.equal(result.text.includes("bg-info-background-container"), true);
566
+ assert.equal(result.replacements, 1);
567
+ });
568
+
569
+ test("renames all four alert color classes", () => {
570
+ const source = `className="bg-background-alert-info bg-background-alert-warning bg-background-alert-error bg-background-alert-success"`;
571
+
572
+ const result = transformImportPaths(source, "/tmp/alerts.tsx");
573
+
574
+ assert.equal(result.text.includes("bg-background-alert-"), false);
575
+ assert.equal(result.text.includes("bg-info-background-container"), true);
576
+ assert.equal(result.text.includes("bg-warning-background-container"), true);
577
+ assert.equal(result.text.includes("bg-error-background-container"), true);
578
+ assert.equal(result.text.includes("bg-success-background-container"), true);
579
+ assert.equal(result.replacements, 4);
580
+ });
581
+
582
+ test("renames Tailwind class with hover: modifier", () => {
583
+ const source = `<div className="hover:bg-background-action focus:bg-background-action">X</div>`;
584
+
585
+ const result = transformImportPaths(source, "/tmp/cmp.tsx");
586
+
587
+ assert.equal(result.text.includes("bg-background-action"), false);
588
+ assert.equal(result.text.includes("hover:bg-background-contrast"), true);
589
+ assert.equal(result.text.includes("focus:bg-background-contrast"), true);
590
+ assert.equal(result.replacements, 2);
591
+ });
592
+
593
+ test("renames Tailwind class with opacity modifier (/50)", () => {
594
+ const source = `<div className="bg-background-action/50">X</div>`;
595
+
596
+ const result = transformImportPaths(source, "/tmp/cmp.tsx");
597
+
598
+ assert.equal(result.text.includes("bg-background-action/50"), false);
599
+ assert.equal(result.text.includes("bg-background-contrast/50"), true);
600
+ assert.equal(result.replacements, 1);
601
+ });
602
+
603
+ test("renames Tailwind class in @apply rule", () => {
604
+ const source = `.btn {
605
+ @apply bg-background-action text-text-inverted;
606
+ }
607
+ `;
608
+
609
+ const result = transformImportPaths(source, "/tmp/styles.css");
610
+
611
+ assert.equal(result.text.includes("bg-background-action"), false);
612
+ assert.equal(result.text.includes("text-text-inverted"), false);
613
+ assert.equal(result.text.includes("bg-background-contrast"), true);
614
+ assert.equal(result.text.includes("text-text-on-contrast"), true);
615
+ assert.equal(result.replacements, 2);
616
+ });
617
+
618
+ test("renames non-bg prefix: border-background-action", () => {
619
+ const source = `<div className="border-background-action">X</div>`;
620
+
621
+ const result = transformImportPaths(source, "/tmp/cmp.tsx");
622
+
623
+ assert.equal(result.text.includes("border-background-action"), false);
624
+ assert.equal(result.text.includes("border-background-contrast"), true);
625
+ });
626
+
627
+ test("does not rename longer Tailwind class that shares a prefix", () => {
628
+ // bg-background-container-inverted-extra must not match bg-background-container-inverted
629
+ const source = `<div className="bg-background-container-inverted-extra">X</div>`;
630
+
631
+ const result = transformImportPaths(source, "/tmp/cmp.tsx");
632
+
633
+ assert.equal(result.text, source);
634
+ assert.equal(result.changed, false);
635
+ });
636
+
637
+ test("Tailwind renames are idempotent", () => {
638
+ const source = `<div className="bg-background-contrast text-text-on-contrast">X</div>`;
639
+
640
+ const result = transformImportPaths(source, "/tmp/cmp.tsx");
641
+
642
+ assert.equal(result.changed, false);
643
+ assert.equal(result.replacements, 0);
644
+ });
645
+
646
+ // --- Tailwind warnings ---
647
+
648
+ test("warns about bg-background-interactive Tailwind class", () => {
649
+ const source = `<div className="bg-background-interactive hover:bg-background-interactive-hover">X</div>`;
650
+
651
+ const result = transformImportPaths(source, "/tmp/cmp.tsx");
652
+
653
+ assert.equal(
654
+ result.warnings.some((w) => /background-interactive/.test(w)),
655
+ true,
656
+ );
657
+ assert.equal(
658
+ result.warnings.filter((w) => /background-interactive/.test(w)).length,
659
+ 1,
660
+ );
661
+ });
662
+
663
+ test("warns about border-border-separator Tailwind class", () => {
664
+ const source = `<div className="border border-border-separator">X</div>`;
665
+
666
+ const result = transformImportPaths(source, "/tmp/cmp.tsx");
667
+
668
+ assert.equal(
669
+ result.warnings.some(
670
+ (w) => /border-border-separator/.test(w) || /kantklasser/.test(w),
671
+ ),
672
+ true,
673
+ );
674
+ });
675
+
676
+ // --- does not warn about valid 5.0 patterns ---
677
+
261
678
  test("does not warn about valid 5.0 patterns", () => {
262
679
  const source = `@use "@fremtind/jokul/styles/jkl";
263
680
 
264
681
  .title {
265
682
  @include jkl.text-style("heading-1");
266
683
  color: var(--jkl-color-text-default);
684
+ background: var(--jkl-color-background-contrast);
267
685
  }
268
686
  `;
269
687
 
@@ -271,3 +689,59 @@ test("does not warn about valid 5.0 patterns", () => {
271
689
 
272
690
  assert.deepEqual(result.warnings, []);
273
691
  });
692
+
693
+ test('ExpandablePanel: fjerner variant="fill" prop (fill er nå default)', () => {
694
+ const source = `<ExpandablePanel variant="fill" open={open}>`;
695
+ const result = transformImportPaths(source, "/tmp/MyPage.tsx");
696
+ assert.equal(result.text, "<ExpandablePanel open={open}>");
697
+ assert.equal(result.changed, true);
698
+ });
699
+
700
+ test("ExpandablePanel: fjerner variant={'fill'} prop", () => {
701
+ const source = `<ExpandablePanel variant={'fill'}>`;
702
+ const result = transformImportPaths(source, "/tmp/MyPage.tsx");
703
+ assert.equal(result.text, "<ExpandablePanel>");
704
+ assert.equal(result.changed, true);
705
+ });
706
+
707
+ test('ExpandablePanel: endrer variant="stroke" til outlined', () => {
708
+ const source = `<ExpandablePanel variant="stroke" className="my-panel">`;
709
+ const result = transformImportPaths(source, "/tmp/MyPage.tsx");
710
+ assert.equal(
711
+ result.text,
712
+ `<ExpandablePanel outlined className="my-panel">`,
713
+ );
714
+ assert.equal(result.changed, true);
715
+ });
716
+
717
+ test("ExpandablePanel: endrer variant={'stroke'} til outlined", () => {
718
+ const source = `<ExpandablePanel variant={'stroke'}>`;
719
+ const result = transformImportPaths(source, "/tmp/MyPage.tsx");
720
+ assert.equal(result.text, "<ExpandablePanel outlined>");
721
+ assert.equal(result.changed, true);
722
+ });
723
+
724
+ test("ExpandablePanel: endrer CSS-klasse jkl-expandable--stroke til jkl-expandable-panel--outlined", () => {
725
+ const source = ".jkl-expandable--stroke { border-color: red; }";
726
+ const result = transformImportPaths(source, "/tmp/custom.scss");
727
+ assert.equal(
728
+ result.text,
729
+ ".jkl-expandable-panel--outlined { border-color: red; }",
730
+ );
731
+ assert.equal(result.changed, true);
732
+ });
733
+
734
+ test("ExpandablePanel: håndterer flerlinjet JSX korrekt", () => {
735
+ const source = `<ExpandablePanel
736
+ variant="fill"
737
+ open={open}
738
+ >`;
739
+ const result = transformImportPaths(source, "/tmp/MyPage.tsx");
740
+ assert.equal(
741
+ result.text,
742
+ `<ExpandablePanel
743
+ open={open}
744
+ >`,
745
+ );
746
+ assert.equal(result.changed, true);
747
+ });