@fremtind/jokul 5.0.0-next.1 → 5.0.0-next.10

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 (341) hide show
  1. package/README.md +41 -22
  2. package/bin/jokul.mjs +10 -0
  3. package/bin/run-jokul-cli.mjs +63 -0
  4. package/build/build-stats.html +1 -1
  5. package/build/cjs/components/card/Card.cjs +1 -1
  6. package/build/cjs/components/card/Card.cjs.map +1 -1
  7. package/build/cjs/components/card/index.d.cts +1 -1
  8. package/build/cjs/components/card/types.cjs +1 -1
  9. package/build/cjs/components/card/types.cjs.map +1 -1
  10. package/build/cjs/components/card/types.d.cts +3 -6
  11. package/build/cjs/components/checkbox/Checkbox.cjs +1 -1
  12. package/build/cjs/components/checkbox/Checkbox.cjs.map +1 -1
  13. package/build/cjs/components/cookie-consent/CookieConsent.cjs +1 -1
  14. package/build/cjs/components/cookie-consent/CookieConsent.cjs.map +1 -1
  15. package/build/cjs/components/cookie-consent/CookieConsent.d.cts +1 -1
  16. package/build/cjs/components/cookie-consent/types.d.cts +4 -0
  17. package/build/cjs/components/datepicker/DatePicker.cjs +1 -1
  18. package/build/cjs/components/datepicker/DatePicker.cjs.map +1 -1
  19. package/build/cjs/components/expander/ExpandablePanel.cjs +1 -1
  20. package/build/cjs/components/expander/ExpandablePanel.cjs.map +1 -1
  21. package/build/cjs/components/link/Link.cjs +1 -1
  22. package/build/cjs/components/link/Link.cjs.map +1 -1
  23. package/build/cjs/components/link/Link.d.cts +2 -2
  24. package/build/cjs/components/link/types.d.cts +1 -4
  25. package/build/cjs/components/modal/Modal.cjs +1 -1
  26. package/build/cjs/components/modal/Modal.cjs.map +1 -1
  27. package/build/cjs/components/modal/Modal.d.cts +2 -9
  28. package/build/cjs/components/modal/index.d.cts +1 -1
  29. package/build/cjs/components/modal/types.d.cts +18 -0
  30. package/build/cjs/components/popover/Popover.cjs +1 -1
  31. package/build/cjs/components/popover/Popover.cjs.map +1 -1
  32. package/build/cjs/components/radio-button/BaseRadioButton.cjs +1 -1
  33. package/build/cjs/components/radio-button/BaseRadioButton.cjs.map +1 -1
  34. package/build/cjs/components/text-area/BaseTextArea.cjs +1 -1
  35. package/build/cjs/components/text-area/BaseTextArea.cjs.map +1 -1
  36. package/build/cjs/components/text-area/counter.cjs +2 -0
  37. package/build/cjs/components/text-area/counter.cjs.map +1 -0
  38. package/build/cjs/components/text-area/counter.d.cts +2 -0
  39. package/build/cjs/components/text-area/types.d.cts +21 -1
  40. package/build/cjs/components/typography/Text.cjs +2 -0
  41. package/build/cjs/components/typography/Text.cjs.map +1 -0
  42. package/build/cjs/components/typography/Text.d.cts +5 -0
  43. package/build/cjs/components/typography/Title.cjs +2 -0
  44. package/build/cjs/components/typography/Title.cjs.map +1 -0
  45. package/build/cjs/components/typography/Title.d.cts +5 -0
  46. package/build/cjs/components/typography/index.cjs +2 -0
  47. package/build/cjs/components/typography/index.cjs.map +1 -0
  48. package/build/cjs/components/typography/index.d.cts +3 -0
  49. package/build/cjs/components/typography/types.cjs +2 -0
  50. package/build/cjs/components/typography/types.cjs.map +1 -0
  51. package/build/cjs/components/typography/types.d.cts +48 -0
  52. package/build/cjs/tokens.cjs +1 -1
  53. package/build/cjs/tokens.cjs.map +1 -1
  54. package/build/cjs/tokens.d.cts +90 -38
  55. package/build/es/components/card/Card.js +1 -1
  56. package/build/es/components/card/Card.js.map +1 -1
  57. package/build/es/components/card/index.d.ts +1 -1
  58. package/build/es/components/card/types.d.ts +3 -6
  59. package/build/es/components/card/types.js +1 -1
  60. package/build/es/components/card/types.js.map +1 -1
  61. package/build/es/components/checkbox/Checkbox.js +1 -1
  62. package/build/es/components/checkbox/Checkbox.js.map +1 -1
  63. package/build/es/components/cookie-consent/CookieConsent.d.ts +1 -1
  64. package/build/es/components/cookie-consent/CookieConsent.js +1 -1
  65. package/build/es/components/cookie-consent/CookieConsent.js.map +1 -1
  66. package/build/es/components/cookie-consent/types.d.ts +4 -0
  67. package/build/es/components/datepicker/DatePicker.js +1 -1
  68. package/build/es/components/datepicker/DatePicker.js.map +1 -1
  69. package/build/es/components/expander/ExpandablePanel.js +1 -1
  70. package/build/es/components/expander/ExpandablePanel.js.map +1 -1
  71. package/build/es/components/link/Link.d.ts +2 -2
  72. package/build/es/components/link/Link.js +1 -1
  73. package/build/es/components/link/Link.js.map +1 -1
  74. package/build/es/components/link/types.d.ts +1 -4
  75. package/build/es/components/modal/Modal.d.ts +2 -9
  76. package/build/es/components/modal/Modal.js +1 -1
  77. package/build/es/components/modal/Modal.js.map +1 -1
  78. package/build/es/components/modal/index.d.ts +1 -1
  79. package/build/es/components/modal/types.d.ts +18 -0
  80. package/build/es/components/popover/Popover.js +1 -1
  81. package/build/es/components/popover/Popover.js.map +1 -1
  82. package/build/es/components/radio-button/BaseRadioButton.js +1 -1
  83. package/build/es/components/radio-button/BaseRadioButton.js.map +1 -1
  84. package/build/es/components/text-area/BaseTextArea.js +1 -1
  85. package/build/es/components/text-area/BaseTextArea.js.map +1 -1
  86. package/build/es/components/text-area/counter.d.ts +2 -0
  87. package/build/es/components/text-area/counter.js +2 -0
  88. package/build/es/components/text-area/counter.js.map +1 -0
  89. package/build/es/components/text-area/types.d.ts +21 -1
  90. package/build/es/components/typography/Text.d.ts +5 -0
  91. package/build/es/components/typography/Text.js +2 -0
  92. package/build/es/components/typography/Text.js.map +1 -0
  93. package/build/es/components/typography/Title.d.ts +5 -0
  94. package/build/es/components/typography/Title.js +2 -0
  95. package/build/es/components/typography/Title.js.map +1 -0
  96. package/build/es/components/typography/index.d.ts +3 -0
  97. package/build/es/components/typography/index.js +2 -0
  98. package/build/es/components/typography/index.js.map +1 -0
  99. package/build/es/components/typography/types.d.ts +48 -0
  100. package/build/es/components/typography/types.js +2 -0
  101. package/build/es/components/typography/types.js.map +1 -0
  102. package/build/es/tokens.d.ts +90 -38
  103. package/build/es/tokens.js +1 -1
  104. package/build/es/tokens.js.map +1 -1
  105. package/codemods/__tests__/import-paths.test.mjs +273 -0
  106. package/codemods/import-paths.mjs +527 -0
  107. package/package.json +7 -1
  108. package/src/fonts/InterVariable-Italic.woff2 +0 -0
  109. package/src/fonts/InterVariable.woff2 +0 -0
  110. package/src/fonts/brands/dnb/DNB-Bold.woff2 +0 -0
  111. package/src/fonts/brands/dnb/DNB-Medium.woff2 +0 -0
  112. package/src/fonts/brands/dnb/DNB-Regular.woff2 +0 -0
  113. package/src/fonts/brands/dnb/DNBMono-Regular.woff2 +0 -0
  114. package/src/fonts/brands/eika/OpenSans-Bold.woff2 +0 -0
  115. package/src/fonts/brands/eika/OpenSans-Light.woff2 +0 -0
  116. package/src/fonts/brands/eika/OpenSans-Regular.woff2 +0 -0
  117. package/src/fonts/brands/eika/OpenSans-SemiBold.woff2 +0 -0
  118. package/src/fonts/brands/fremtind/Fremtind-Material-Symbols.woff2 +0 -0
  119. package/src/fonts/brands/fremtind/InterVariable-Italic.woff2 +0 -0
  120. package/src/fonts/brands/fremtind/InterVariable.woff2 +0 -0
  121. package/src/fonts/brands/sparebank1/SpareBank1-Medium-Web.woff2 +0 -0
  122. package/src/fonts/brands/sparebank1/SpareBank1-Regular-Web.woff2 +0 -0
  123. package/src/fonts/brands/sparebank1/SpareBank1-Title-Medium-Web.woff2 +0 -0
  124. package/styles/base.css +804 -185
  125. package/styles/base.min.css +1 -1
  126. package/styles/components/autosuggest/autosuggest.css +4 -4
  127. package/styles/components/autosuggest/autosuggest.min.css +1 -1
  128. package/styles/components/autosuggest/autosuggest.scss +4 -4
  129. package/styles/components/beta/description-list/description-list.css +1 -1
  130. package/styles/components/beta/description-list/description-list.min.css +1 -1
  131. package/styles/components/beta/description-list/description-list.scss +1 -1
  132. package/styles/components/beta/nav-link/navlink.css +4 -4
  133. package/styles/components/beta/nav-link/navlink.min.css +1 -1
  134. package/styles/components/beta/nav-link/navlink.scss +6 -4
  135. package/styles/components/beta/select/select.css +9 -9
  136. package/styles/components/beta/select/select.min.css +1 -1
  137. package/styles/components/beta/select/select.scss +8 -7
  138. package/styles/components/breadcrumb/breadcrumb.css +1 -1
  139. package/styles/components/breadcrumb/breadcrumb.min.css +1 -1
  140. package/styles/components/button/button.css +8 -4
  141. package/styles/components/button/button.min.css +1 -1
  142. package/styles/components/button/button.scss +14 -14
  143. package/styles/components/card/card.css +6 -11
  144. package/styles/components/card/card.min.css +1 -1
  145. package/styles/components/card/card.scss +5 -12
  146. package/styles/components/checkbox/checkbox.css +43 -15
  147. package/styles/components/checkbox/checkbox.min.css +1 -1
  148. package/styles/components/checkbox/checkbox.scss +35 -24
  149. package/styles/components/checkbox-panel/checkbox-panel.css +65 -32
  150. package/styles/components/checkbox-panel/checkbox-panel.min.css +1 -1
  151. package/styles/components/checkbox-panel/checkbox-panel.scss +4 -0
  152. package/styles/components/checkbox-panel/development/styles.scss +1 -1
  153. package/styles/components/chip/chip.css +6 -6
  154. package/styles/components/chip/chip.min.css +1 -1
  155. package/styles/components/chip/chip.scss +6 -6
  156. package/styles/components/combobox/combobox.css +25 -23
  157. package/styles/components/combobox/combobox.min.css +1 -1
  158. package/styles/components/combobox/combobox.scss +15 -18
  159. package/styles/components/countdown/countdown.css +4 -4
  160. package/styles/components/countdown/countdown.min.css +1 -1
  161. package/styles/components/datepicker/_calendar-date-button.scss +11 -9
  162. package/styles/components/datepicker/_calendar-navigation-dropdown.scss +1 -1
  163. package/styles/components/datepicker/_calendar.scss +6 -7
  164. package/styles/components/datepicker/datepicker.css +20 -12
  165. package/styles/components/datepicker/datepicker.min.css +1 -1
  166. package/styles/components/description-list/description-list.css +1 -1
  167. package/styles/components/description-list/description-list.min.css +1 -1
  168. package/styles/components/description-list/description-list.scss +1 -1
  169. package/styles/components/expander/expandable.css +21 -18
  170. package/styles/components/expander/expandable.min.css +1 -1
  171. package/styles/components/expander/expandable.scss +20 -20
  172. package/styles/components/feedback/_index.scss +1 -1
  173. package/styles/components/feedback/feedback.css +6 -8
  174. package/styles/components/feedback/feedback.min.css +1 -1
  175. package/styles/components/feedback/feedback.scss +4 -9
  176. package/styles/components/file/file.css +5 -5
  177. package/styles/components/file/file.min.css +1 -1
  178. package/styles/components/file/file.scss +5 -5
  179. package/styles/components/file-input/file-input.css +29 -25
  180. package/styles/components/file-input/file-input.min.css +1 -1
  181. package/styles/components/file-input/file-input.scss +3 -3
  182. package/styles/components/help/help.css +2 -2
  183. package/styles/components/help/help.min.css +1 -1
  184. package/styles/components/help/help.scss +4 -4
  185. package/styles/components/icon/_base-styles.scss +12 -14
  186. package/styles/components/icon/icon.css +5 -5
  187. package/styles/components/icon/icon.min.css +1 -1
  188. package/styles/components/icon/icon.scss +73 -73
  189. package/styles/components/icon-button/icon-button.css +2 -2
  190. package/styles/components/icon-button/icon-button.min.css +1 -1
  191. package/styles/components/icon-button/icon-button.scss +1 -1
  192. package/styles/components/input-group/input-group.css +2 -2
  193. package/styles/components/input-group/input-group.min.css +1 -1
  194. package/styles/components/input-panel/input-panel.css +19 -17
  195. package/styles/components/input-panel/input-panel.min.css +1 -1
  196. package/styles/components/input-panel/input-panel.scss +21 -20
  197. package/styles/components/link/link.css +2 -2
  198. package/styles/components/link/link.min.css +1 -1
  199. package/styles/components/link-list/link-list.css +8 -4
  200. package/styles/components/link-list/link-list.min.css +1 -1
  201. package/styles/components/link-list/link-list.scss +7 -3
  202. package/styles/components/loader/loader.css +6 -6
  203. package/styles/components/loader/loader.min.css +1 -1
  204. package/styles/components/loader/skeleton-loader.css +4 -4
  205. package/styles/components/loader/skeleton-loader.min.css +1 -1
  206. package/styles/components/loader/skeleton-loader.scss +1 -1
  207. package/styles/components/menu/_menu-divider.scss +1 -1
  208. package/styles/components/menu/_menu-item.scss +2 -2
  209. package/styles/components/menu/menu.css +5 -5
  210. package/styles/components/menu/menu.min.css +1 -1
  211. package/styles/components/menu/menu.scss +2 -2
  212. package/styles/components/message/message.css +20 -10
  213. package/styles/components/message/message.min.css +1 -1
  214. package/styles/components/message/message.scss +19 -12
  215. package/styles/components/modal/_layout.scss +22 -0
  216. package/styles/components/modal/_modal-base.scss +32 -0
  217. package/styles/components/modal/_motion.scss +45 -0
  218. package/styles/components/modal/_overlay.scss +20 -0
  219. package/styles/components/modal/_parts.scss +33 -0
  220. package/styles/components/modal/_placement.scss +59 -0
  221. package/styles/components/modal/modal.css +118 -34
  222. package/styles/components/modal/modal.min.css +1 -1
  223. package/styles/components/modal/modal.scss +6 -95
  224. package/styles/components/nav-link/nav-link.css +1 -1
  225. package/styles/components/nav-link/nav-link.min.css +1 -1
  226. package/styles/components/pagination/development/styles.scss +1 -1
  227. package/styles/components/pagination/pagination.css +3 -3
  228. package/styles/components/pagination/pagination.min.css +1 -1
  229. package/styles/components/pagination/pagination.scss +2 -2
  230. package/styles/components/popover/popover.css +12 -1
  231. package/styles/components/popover/popover.min.css +1 -1
  232. package/styles/components/popover/popover.scss +15 -1
  233. package/styles/components/progress-bar/progress-bar.css +27 -3
  234. package/styles/components/progress-bar/progress-bar.min.css +1 -1
  235. package/styles/components/progress-bar/progress-bar.scss +5 -0
  236. package/styles/components/radio-button/radio-button.css +43 -8
  237. package/styles/components/radio-button/radio-button.min.css +1 -1
  238. package/styles/components/radio-button/radio-button.scss +35 -16
  239. package/styles/components/radio-panel/development/styles.scss +1 -1
  240. package/styles/components/radio-panel/radio-panel.css +22 -17
  241. package/styles/components/radio-panel/radio-panel.min.css +1 -1
  242. package/styles/components/radio-panel/radio-panel.scss +4 -0
  243. package/styles/components/search/search-with-submit-button.css +1 -1
  244. package/styles/components/search/search-with-submit-button.min.css +1 -1
  245. package/styles/components/search/search-with-submit-button.scss +1 -1
  246. package/styles/components/search/search.css +4 -4
  247. package/styles/components/search/search.min.css +1 -1
  248. package/styles/components/search/search.scss +3 -3
  249. package/styles/components/segmented-control/segmented-control.css +61 -26
  250. package/styles/components/segmented-control/segmented-control.min.css +1 -1
  251. package/styles/components/segmented-control/segmented-control.scss +7 -7
  252. package/styles/components/select/select.css +17 -18
  253. package/styles/components/select/select.min.css +1 -1
  254. package/styles/components/select/select.scss +24 -29
  255. package/styles/components/summary-table/development/summary-table-example.scss +1 -1
  256. package/styles/components/summary-table/summary-table.css +2 -2
  257. package/styles/components/summary-table/summary-table.min.css +1 -1
  258. package/styles/components/summary-table/summary-table.scss +2 -2
  259. package/styles/components/system-message/system-message.css +23 -13
  260. package/styles/components/system-message/system-message.min.css +1 -1
  261. package/styles/components/system-message/system-message.scss +119 -108
  262. package/styles/components/table/_table-head.scss +1 -1
  263. package/styles/components/table/_table-row.scss +5 -3
  264. package/styles/components/table/table.css +6 -4
  265. package/styles/components/table/table.min.css +1 -1
  266. package/styles/components/table-of-contents/table-of-contents.css +2 -2
  267. package/styles/components/table-of-contents/table-of-contents.min.css +1 -1
  268. package/styles/components/table-of-contents/table-of-contents.scss +3 -3
  269. package/styles/components/tabs/tabs.css +5 -5
  270. package/styles/components/tabs/tabs.min.css +1 -1
  271. package/styles/components/tabs/tabs.scss +5 -6
  272. package/styles/components/tag/tag.css +16 -6
  273. package/styles/components/tag/tag.min.css +1 -1
  274. package/styles/components/tag/tag.scss +18 -7
  275. package/styles/components/text-area/text-area.css +12 -12
  276. package/styles/components/text-area/text-area.min.css +1 -1
  277. package/styles/components/text-input/text-input.css +12 -12
  278. package/styles/components/text-input/text-input.min.css +1 -1
  279. package/styles/components/toast/toast.css +20 -13
  280. package/styles/components/toast/toast.min.css +1 -1
  281. package/styles/components/toast/toast.scss +19 -18
  282. package/styles/components/toggle-switch/_toggle-slider.scss +4 -4
  283. package/styles/components/toggle-switch/toggle-switch.css +15 -25
  284. package/styles/components/toggle-switch/toggle-switch.min.css +1 -3
  285. package/styles/components/toggle-switch/toggle-switch.scss +10 -22
  286. package/styles/components/tooltip/tooltip.css +5 -5
  287. package/styles/components/tooltip/tooltip.min.css +1 -1
  288. package/styles/components/tooltip/tooltip.scss +5 -5
  289. package/styles/components/typography/_index.scss +2 -0
  290. package/styles/components/typography/text.css +38 -0
  291. package/styles/components/typography/text.min.css +1 -0
  292. package/styles/components/typography/text.scss +54 -0
  293. package/styles/components/typography/title.css +55 -0
  294. package/styles/components/typography/title.min.css +1 -0
  295. package/styles/components/typography/title.scss +59 -0
  296. package/styles/components.css +684 -365
  297. package/styles/components.min.css +1 -3
  298. package/styles/components.scss +53 -52
  299. package/styles/core/utility/_paragraphs.scss +39 -0
  300. package/styles/global/_base-class.scss +2 -2
  301. package/styles/global/_top-layer.scss +1 -1
  302. package/styles/hooks/stories/styles.scss +3 -3
  303. package/styles/jkl/_ornaments.scss +1 -1
  304. package/styles/jkl/_tokens.scss +140 -66
  305. package/styles/jkl/_typography.scss +13 -21
  306. package/styles/shared/input/shared-input-styles.scss +11 -15
  307. package/styles/shared/track/track.scss +2 -2
  308. package/styles/tailwind.css +104 -60
  309. package/styles/theme/_color-scheme.scss +107 -60
  310. package/styles/theme/_dynamic-spacing.scss +6 -6
  311. package/styles/theme/_fonts.scss +24 -74
  312. package/styles/theme/_index.scss +4 -0
  313. package/styles/theme/_tokens.scss +3 -3
  314. package/styles/theme/brands/dnb/_color-scheme.scss +121 -0
  315. package/styles/theme/brands/dnb/_fonts.scss +46 -0
  316. package/styles/theme/brands/dnb/_index.scss +2 -0
  317. package/styles/theme/brands/eika/_color-scheme.scss +121 -0
  318. package/styles/theme/brands/eika/_fonts.scss +46 -0
  319. package/styles/theme/brands/eika/_index.scss +2 -0
  320. package/styles/theme/brands/fremtind/_color-scheme.scss +121 -0
  321. package/styles/theme/brands/fremtind/_fonts.scss +30 -0
  322. package/styles/theme/brands/fremtind/_index.scss +2 -0
  323. package/styles/theme/brands/sparebank1/_color-scheme.scss +121 -0
  324. package/styles/theme/brands/sparebank1/_fonts.scss +38 -0
  325. package/styles/theme/brands/sparebank1/_index.scss +2 -0
  326. package/styles/utility/_headings.scss +1 -1
  327. package/styles/utility/_paragraphs.scss +2 -2
  328. package/styles/utility/_screen-reader.scss +1 -1
  329. package/styles/utility/_spacing.scss +2 -2
  330. package/src/fonts/FremtindGrotesk-Bold-Web.woff +0 -0
  331. package/src/fonts/FremtindGrotesk-Bold-Web.woff2 +0 -0
  332. package/src/fonts/FremtindGrotesk-BoldItalic-Web.woff +0 -0
  333. package/src/fonts/FremtindGrotesk-BoldItalic-Web.woff2 +0 -0
  334. package/src/fonts/FremtindGrotesk-Display-Web.woff +0 -0
  335. package/src/fonts/FremtindGrotesk-Display-Web.woff2 +0 -0
  336. package/src/fonts/FremtindGrotesk-Italic-Web.woff +0 -0
  337. package/src/fonts/FremtindGrotesk-Italic-Web.woff2 +0 -0
  338. package/src/fonts/FremtindGrotesk-Regular-Web.woff +0 -0
  339. package/src/fonts/FremtindGrotesk-Regular-Web.woff2 +0 -0
  340. package/src/fonts/FremtindGroteskMono-Regular-Web.woff +0 -0
  341. package/src/fonts/FremtindGroteskMono-Regular-Web.woff2 +0 -0
@@ -0,0 +1,527 @@
1
+ import { readdir, readFile, stat, writeFile } from "node:fs/promises";
2
+ import path from "node:path";
3
+
4
+ const TEXT_EXTENSIONS = new Set([
5
+ ".cjs",
6
+ ".css",
7
+ ".cts",
8
+ ".js",
9
+ ".jsx",
10
+ ".md",
11
+ ".mdx",
12
+ ".mjs",
13
+ ".mts",
14
+ ".sass",
15
+ ".scss",
16
+ ".ts",
17
+ ".tsx",
18
+ ]);
19
+
20
+ const IGNORED_DIRECTORIES = new Set([
21
+ ".changeset",
22
+ ".git",
23
+ ".github",
24
+ ".next",
25
+ ".turbo",
26
+ "build",
27
+ "coverage",
28
+ "dist",
29
+ "node_modules",
30
+ "storybook-static",
31
+ ]);
32
+
33
+ const IGNORED_FILE_PATTERNS = [
34
+ "/packages/jokul/CHANGELOG.md",
35
+ "/packages/jokul/MIGRATION.md",
36
+ "/packages/jokul/build-styles.mjs",
37
+ "/packages/jokul/bin/",
38
+ "/packages/jokul/codemods/",
39
+ ];
40
+
41
+ const DIRECT_REPLACEMENTS = [
42
+ [
43
+ "@fremtind/jokul/styles/core/core.min.css",
44
+ "@fremtind/jokul/styles/base.min.css",
45
+ ],
46
+ [
47
+ "@fremtind/jokul/styles/core/core.css",
48
+ "@fremtind/jokul/styles/base.css",
49
+ ],
50
+ [
51
+ "@fremtind/jokul/styles/core/core.scss",
52
+ "@fremtind/jokul/styles/base.scss",
53
+ ],
54
+ ["@fremtind/jokul/styles/core/core", "@fremtind/jokul/styles/base"],
55
+ [
56
+ "@fremtind/jokul/styles/styles.min.css",
57
+ "@fremtind/jokul/styles/components.min.css",
58
+ ],
59
+ ["@fremtind/jokul/styles/styles.css", "@fremtind/jokul/styles/components.css"],
60
+ [
61
+ "@fremtind/jokul/styles/styles.scss",
62
+ "@fremtind/jokul/styles/components.scss",
63
+ ],
64
+ ["@fremtind/jokul/styles/styles", "@fremtind/jokul/styles/components"],
65
+ [
66
+ "@fremtind/jokul/styles/core/jkl/index",
67
+ "@fremtind/jokul/styles/jkl",
68
+ ],
69
+ ["@fremtind/jokul/styles/core/jkl", "@fremtind/jokul/styles/jkl"],
70
+ [
71
+ "@fremtind/jokul/styles/fonts/webfonts.scss",
72
+ "@fremtind/jokul/styles/theme/fonts",
73
+ ],
74
+ [
75
+ "@fremtind/jokul/styles/fonts/webfonts",
76
+ "@fremtind/jokul/styles/theme/fonts",
77
+ ],
78
+ ["@fremtind/jokul/styles/fonts", "@fremtind/jokul/styles/theme/fonts"],
79
+ ["../../../core/jkl/index", "../../../styles/jkl"],
80
+ ["../../../core/jkl", "../../../styles/jkl"],
81
+ ["../../core/jkl/index", "../../styles/jkl"],
82
+ ["../../core/jkl", "../../styles/jkl"],
83
+ ["../core/jkl/index", "../styles/jkl"],
84
+ ["../core/jkl", "../styles/jkl"],
85
+ ["@fremtind/jokul/tailwind/v4", "@fremtind/jokul/styles/tailwind"],
86
+ ["@fremtind/jokul/styles/core", "@fremtind/jokul/styles/base.scss"],
87
+ ["@fremtind/jokul/styles", "@fremtind/jokul/styles/components.scss"],
88
+ ["@fremtind/jokul/core", "@fremtind/jokul/utilities"],
89
+ ].sort(([a], [b]) => b.length - a.length);
90
+
91
+ const BETA_STYLE_MIGRATIONS = [
92
+ {
93
+ component: "DescriptionList",
94
+ betaIdentifiers: ["BETA_DescriptionList", "BETA_DescriptionListItem"],
95
+ replacements: [
96
+ [
97
+ "@fremtind/jokul/styles/components/description-list/_index.scss",
98
+ "@fremtind/jokul/styles/components/beta/description-list/_index.scss",
99
+ ],
100
+ [
101
+ "@fremtind/jokul/styles/components/description-list/description-list.scss",
102
+ "@fremtind/jokul/styles/components/beta/description-list/description-list.scss",
103
+ ],
104
+ [
105
+ "@fremtind/jokul/styles/components/description-list",
106
+ "@fremtind/jokul/styles/components/beta/description-list",
107
+ ],
108
+ ],
109
+ },
110
+ {
111
+ component: "NavLink",
112
+ betaIdentifiers: ["BETA_NavLink"],
113
+ replacements: [
114
+ [
115
+ "@fremtind/jokul/styles/components/nav-link/_index.scss",
116
+ "@fremtind/jokul/styles/components/beta/nav-link/_index.scss",
117
+ ],
118
+ [
119
+ "@fremtind/jokul/styles/components/nav-link/nav-link.scss",
120
+ "@fremtind/jokul/styles/components/beta/nav-link/navlink.scss",
121
+ ],
122
+ [
123
+ "@fremtind/jokul/styles/components/nav-link",
124
+ "@fremtind/jokul/styles/components/beta/nav-link",
125
+ ],
126
+ ],
127
+ },
128
+ {
129
+ component: "Select",
130
+ betaIdentifiers: ["BETA_Select"],
131
+ replacements: [
132
+ [
133
+ "@fremtind/jokul/styles/components/select/_index.scss",
134
+ "@fremtind/jokul/styles/components/beta/select/_index.scss",
135
+ ],
136
+ [
137
+ "@fremtind/jokul/styles/components/select/select.scss",
138
+ "@fremtind/jokul/styles/components/beta/select/select.scss",
139
+ ],
140
+ [
141
+ "@fremtind/jokul/styles/components/select",
142
+ "@fremtind/jokul/styles/components/beta/select",
143
+ ],
144
+ ],
145
+ },
146
+ ];
147
+
148
+ function shouldIgnoreFile(filePath) {
149
+ const normalizedPath = filePath.split(path.sep).join("/");
150
+
151
+ return IGNORED_FILE_PATTERNS.some((pattern) =>
152
+ normalizedPath.includes(pattern),
153
+ );
154
+ }
155
+
156
+ function shouldIgnoreDirectory(directoryPath) {
157
+ return IGNORED_DIRECTORIES.has(path.basename(directoryPath));
158
+ }
159
+
160
+ function escapeRegExp(value) {
161
+ return value.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
162
+ }
163
+
164
+ function replaceSpecifier(text, from, to) {
165
+ const pattern = new RegExp(
166
+ `(?<![A-Za-z0-9_./-])${escapeRegExp(from)}(?![A-Za-z0-9_./-])`,
167
+ "g",
168
+ );
169
+
170
+ let count = 0;
171
+ const next = text.replace(pattern, () => {
172
+ count += 1;
173
+ return to;
174
+ });
175
+
176
+ return { text: next, count };
177
+ }
178
+
179
+ function applyDirectReplacements(text) {
180
+ let next = text;
181
+ let replacements = 0;
182
+
183
+ for (const [from, to] of DIRECT_REPLACEMENTS) {
184
+ const result = replaceSpecifier(next, from, to);
185
+ next = result.text;
186
+ replacements += result.count;
187
+ }
188
+
189
+ return { text: next, replacements };
190
+ }
191
+
192
+ function applyBetaStyleReplacements(text) {
193
+ let next = text;
194
+ let replacements = 0;
195
+ const warnings = [];
196
+
197
+ for (const migration of BETA_STYLE_MIGRATIONS) {
198
+ const mentionsBeta = migration.betaIdentifiers.some((identifier) =>
199
+ next.includes(identifier),
200
+ );
201
+
202
+ const hasOldSpecifier = migration.replacements.some(([from]) =>
203
+ new RegExp(
204
+ `(?<![A-Za-z0-9_./-])${escapeRegExp(from)}(?![A-Za-z0-9_./-])`,
205
+ ).test(next),
206
+ );
207
+
208
+ if (!hasOldSpecifier) {
209
+ continue;
210
+ }
211
+
212
+ if (!mentionsBeta) {
213
+ warnings.push(
214
+ `Manuell vurdering: gammel stilimport for ${migration.component} kan peke på enten stabil eller beta-variant.`,
215
+ );
216
+ continue;
217
+ }
218
+
219
+ for (const [from, to] of migration.replacements) {
220
+ const result = replaceSpecifier(next, from, to);
221
+ next = result.text;
222
+ replacements += result.count;
223
+ }
224
+ }
225
+
226
+ return { text: next, replacements, warnings };
227
+ }
228
+
229
+ /**
230
+ * Font-family-navnet "Fremtind Material Symbols" (og tilhørende fallback) ble
231
+ * omdøpt til "Jokul Icons" i Jøkul 5. Konsumenter som har skrevet font-family
232
+ * direkte i sin egen CSS/SCSS får ellers en stille brutt referanse.
233
+ *
234
+ * Fallback-navnet erstattes først (lengst først), slik at det ikke blir
235
+ * delvis overskrevet av kortere mønster.
236
+ */
237
+ const FONT_FAMILY_REPLACEMENTS = [
238
+ ["Fremtind Material Symbols Fallback", "Jokul Icons Fallback"],
239
+ ["Fremtind Material Symbols", "Jokul Icons"],
240
+ ];
241
+
242
+ function applyFontFamilyReplacements(text) {
243
+ let next = text;
244
+ let count = 0;
245
+
246
+ for (const [from, to] of FONT_FAMILY_REPLACEMENTS) {
247
+ const pattern = new RegExp(escapeRegExp(from), "g");
248
+ next = next.replace(pattern, () => {
249
+ count += 1;
250
+ return to;
251
+ });
252
+ }
253
+
254
+ return { text: next, count };
255
+ }
256
+
257
+ const WEBFONTS_CSS_SPECIFIER =
258
+ "@fremtind/jokul/styles/fonts/webfonts(?:\\.min)?\\.css";
259
+
260
+ const BASE_OR_COMPONENT_CSS_PATTERN = new RegExp(
261
+ "@fremtind/jokul/styles/(?:base|components)(?:\\.min)?\\.css",
262
+ );
263
+
264
+ const WEBFONTS_CSS_REMOVAL_PATTERNS = [
265
+ // import "@fremtind/jokul/styles/fonts/webfonts.css"; (ESM)
266
+ new RegExp(
267
+ `^[ \\t]*import\\s+["']${WEBFONTS_CSS_SPECIFIER}["']\\s*;?[ \\t]*\\r?\\n?`,
268
+ "gm",
269
+ ),
270
+ // require("@fremtind/jokul/styles/fonts/webfonts.css"); (CJS)
271
+ new RegExp(
272
+ `^[ \\t]*require\\(\\s*["']${WEBFONTS_CSS_SPECIFIER}["']\\s*\\)\\s*;?[ \\t]*\\r?\\n?`,
273
+ "gm",
274
+ ),
275
+ // @import "@fremtind/jokul/styles/fonts/webfonts.css"; (CSS / SCSS)
276
+ new RegExp(
277
+ `^[ \\t]*@import\\s+["']${WEBFONTS_CSS_SPECIFIER}["']\\s*;?[ \\t]*\\r?\\n?`,
278
+ "gm",
279
+ ),
280
+ ];
281
+
282
+ /**
283
+ * I Jøkul 5 er `@font-face`-definisjonene flyttet inn i `styles/base.css`, og den
284
+ * frittstående `styles/fonts/webfonts.css` finnes ikke lenger i pakken. For
285
+ * .css-konsumenter betyr det at gamle `webfonts.css`-imports må fjernes – ellers
286
+ * blir bygget brutt fordi filen er borte. SCSS-konsumenter håndteres av
287
+ * `DIRECT_REPLACEMENTS` siden de kan ha behov for å overstyre `$webfonts-dir`.
288
+ */
289
+ function removeRedundantWebfontsCssImport(text) {
290
+ let next = text;
291
+ let count = 0;
292
+
293
+ for (const pattern of WEBFONTS_CSS_REMOVAL_PATTERNS) {
294
+ next = next.replace(pattern, () => {
295
+ count += 1;
296
+ return "";
297
+ });
298
+ }
299
+
300
+ return { text: next, count };
301
+ }
302
+
303
+ /**
304
+ * Patterns som ikke kan auto-erstattes, men som krever manuell migrering ved
305
+ * oppgradering fra Jøkul 4 til 5. Hvert mønster gir én advarsel per fil det
306
+ * matcher i (uavhengig av antall forekomster), med peker til hva man skal
307
+ * gjøre i stedet.
308
+ */
309
+ const MANUAL_MIGRATION_WARNINGS = [
310
+ {
311
+ // jkl.$color-granitt, jkl.$color-varde, osv. Alle Sass-fargevariabler
312
+ // ble fjernet i Jøkul 5 til fordel for semantiske CSS-variabler.
313
+ pattern: /\bjkl\.\$color-[a-z][a-z0-9-]*/i,
314
+ message:
315
+ "Fjernede Sass-fargevariabler (jkl.$color-*). I Jøkul 5 er alle gamle fargenavn (granitt, varde, snohvit osv.) fjernet — bruk semantiske CSS-variabler, f.eks. var(--jkl-color-text-default). Se https://jokul-portal.intern.app.prodaws.fremtind.no/fundamenter/farger.",
316
+ },
317
+ {
318
+ // @include jkl.light-mode-variables { ... } / dark-mode-variables { ... }
319
+ pattern: /@include\s+jkl\.(?:light|dark)-mode-variables\b/,
320
+ message:
321
+ "Fjernede mixins for custom light/dark-farger (jkl.light-mode-variables / jkl.dark-mode-variables). I Jøkul 5 må du bruke semantiske CSS-variabler i stedet for å definere egne dark/light-varianter.",
322
+ },
323
+ {
324
+ // @include jkl.text-style("body") / text-style("small")
325
+ pattern: /\btext-style\(\s*["'](?:body|small)["']\s*\)/,
326
+ message:
327
+ 'Fjernede tekststiler ("body", "small") i text-style-mixin. Foretrekk å bruke <Text>-komponenten der det er mulig (`import { Text } from "@fremtind/jokul/components/typography"`). Hvis du må sette stiler direkte, bytt til "paragraph-large/medium/small" eller "text-large/medium/small/micro" — se https://jokul-portal.intern.app.prodaws.fremtind.no/fundamenter/typografi.',
328
+ },
329
+ ];
330
+
331
+ function collectManualMigrationWarnings(text) {
332
+ const warnings = [];
333
+
334
+ for (const { pattern, message } of MANUAL_MIGRATION_WARNINGS) {
335
+ if (pattern.test(text)) {
336
+ warnings.push(`Manuell vurdering: ${message}`);
337
+ }
338
+ }
339
+
340
+ return warnings;
341
+ }
342
+
343
+ function reorderConfiguredFontImport(text) {
344
+ const fontImportPattern =
345
+ /^@use\s+["']@fremtind\/jokul\/styles\/theme\/fonts["'][\s\S]*?;\s*/m;
346
+ const baseImportPattern =
347
+ /^@use\s+["']@fremtind\/jokul\/styles\/base(?:\.scss)?["'][^;]*;\s*/m;
348
+
349
+ const fontMatch = fontImportPattern.exec(text);
350
+ const baseMatch = baseImportPattern.exec(text);
351
+
352
+ if (!fontMatch || !baseMatch || fontMatch.index < baseMatch.index) {
353
+ return { text, reordered: false };
354
+ }
355
+
356
+ const withoutFontImport =
357
+ text.slice(0, fontMatch.index) +
358
+ text.slice(fontMatch.index + fontMatch[0].length);
359
+ const nextBaseMatch = baseImportPattern.exec(withoutFontImport);
360
+
361
+ if (!nextBaseMatch) {
362
+ return { text, reordered: false };
363
+ }
364
+
365
+ const nextText =
366
+ withoutFontImport.slice(0, nextBaseMatch.index) +
367
+ fontMatch[0] +
368
+ withoutFontImport.slice(nextBaseMatch.index);
369
+
370
+ return { text: nextText, reordered: true };
371
+ }
372
+
373
+ export function transformImportPaths(text, filePath = "") {
374
+ const webfontsRemoval = removeRedundantWebfontsCssImport(text);
375
+ const fontFamily = applyFontFamilyReplacements(webfontsRemoval.text);
376
+ const direct = applyDirectReplacements(fontFamily.text);
377
+ const beta = applyBetaStyleReplacements(direct.text);
378
+ let next = beta.text;
379
+ let reordered = false;
380
+
381
+ if (/\.(sass|scss)$/i.test(filePath)) {
382
+ const reorderedResult = reorderConfiguredFontImport(next);
383
+ next = reorderedResult.text;
384
+ reordered = reorderedResult.reordered;
385
+ }
386
+
387
+ const warnings = [
388
+ ...beta.warnings,
389
+ ...collectManualMigrationWarnings(text),
390
+ ];
391
+
392
+ if (
393
+ webfontsRemoval.count > 0 &&
394
+ !BASE_OR_COMPONENT_CSS_PATTERN.test(next)
395
+ ) {
396
+ warnings.push(
397
+ "Manuell vurdering: fjernet import av `styles/fonts/webfonts.css`. `@font-face`-definisjonene ligger nå i `@fremtind/jokul/styles/base.css`, så den må importeres for at fontene skal lastes.",
398
+ );
399
+ }
400
+
401
+ return {
402
+ text: next,
403
+ changed: next !== text,
404
+ replacements:
405
+ direct.replacements +
406
+ beta.replacements +
407
+ webfontsRemoval.count +
408
+ fontFamily.count,
409
+ warnings,
410
+ reordered,
411
+ };
412
+ }
413
+
414
+ async function collectFiles(targetPath, collected) {
415
+ const stats = await stat(targetPath);
416
+
417
+ if (stats.isDirectory()) {
418
+ if (shouldIgnoreDirectory(targetPath)) {
419
+ return collected;
420
+ }
421
+
422
+ const entries = await readdir(targetPath, { withFileTypes: true });
423
+ const sortedEntries = [...entries].sort((a, b) =>
424
+ a.name.localeCompare(b.name),
425
+ );
426
+
427
+ for (const entry of sortedEntries) {
428
+ if (entry.isDirectory() && IGNORED_DIRECTORIES.has(entry.name)) {
429
+ continue;
430
+ }
431
+
432
+ await collectFiles(path.join(targetPath, entry.name), collected);
433
+ }
434
+
435
+ return collected;
436
+ }
437
+
438
+ if (TEXT_EXTENSIONS.has(path.extname(targetPath)) && !shouldIgnoreFile(targetPath)) {
439
+ collected.push(targetPath);
440
+ }
441
+
442
+ return collected;
443
+ }
444
+
445
+ function parseArguments(rawArgs) {
446
+ const options = {
447
+ dryRun: false,
448
+ verbose: false,
449
+ };
450
+ const targets = [];
451
+
452
+ for (const arg of rawArgs) {
453
+ if (arg === "--dry-run") {
454
+ options.dryRun = true;
455
+ continue;
456
+ }
457
+
458
+ if (arg === "--verbose") {
459
+ options.verbose = true;
460
+ continue;
461
+ }
462
+
463
+ if (arg === "--help" || arg === "-h") {
464
+ throw new Error(
465
+ "Bruk: jokul codemod [import-paths] [sti ...] [--dry-run] [--verbose]",
466
+ );
467
+ }
468
+
469
+ targets.push(arg);
470
+ }
471
+
472
+ return {
473
+ options,
474
+ targets: targets.length > 0 ? targets : ["."],
475
+ };
476
+ }
477
+
478
+ export async function runImportPathsCodemod(rawArgs = []) {
479
+ const { options, targets } = parseArguments(rawArgs);
480
+ const files = [];
481
+
482
+ for (const target of targets) {
483
+ await collectFiles(path.resolve(target), files);
484
+ }
485
+
486
+ const uniqueFiles = [...new Set(files)].sort((a, b) => a.localeCompare(b));
487
+ let changedFiles = 0;
488
+ let changedSpecifiers = 0;
489
+ let reorderedFiles = 0;
490
+ const warnings = [];
491
+
492
+ for (const filePath of uniqueFiles) {
493
+ const source = await readFile(filePath, "utf-8");
494
+ const result = transformImportPaths(source, filePath);
495
+
496
+ for (const warning of result.warnings) {
497
+ warnings.push(`${filePath}: ${warning}`);
498
+ }
499
+
500
+ if (!result.changed) {
501
+ continue;
502
+ }
503
+
504
+ changedFiles += 1;
505
+ changedSpecifiers += result.replacements;
506
+ reorderedFiles += result.reordered ? 1 : 0;
507
+
508
+ if (!options.dryRun) {
509
+ await writeFile(filePath, result.text, "utf-8");
510
+ }
511
+
512
+ if (options.verbose || options.dryRun) {
513
+ console.log(`${options.dryRun ? "Ville endret" : "Endret"} ${filePath}`);
514
+ }
515
+ }
516
+
517
+ if (warnings.length > 0) {
518
+ console.warn("\nFiler som trenger manuell oppfølging:");
519
+ for (const warning of warnings) {
520
+ console.warn(`- ${warning}`);
521
+ }
522
+ }
523
+
524
+ console.log(
525
+ `\n${options.dryRun ? "Dry run ferdig" : "Codemod ferdig"}: ${changedFiles} filer, ${changedSpecifiers} erstattede imports${reorderedFiles > 0 ? `, ${reorderedFiles} justerte font-importrekkefølger` : ""}.`,
526
+ );
527
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fremtind/jokul",
3
- "version": "5.0.0-next.1",
3
+ "version": "5.0.0-next.10",
4
4
  "type": "module",
5
5
  "publishConfig": {
6
6
  "access": "public"
@@ -14,13 +14,19 @@
14
14
  "*.scss"
15
15
  ],
16
16
  "files": [
17
+ "./bin",
17
18
  "./build",
19
+ "./codemods",
18
20
  "./styles",
19
21
  "./src/fonts",
20
22
  "./package.json"
21
23
  ],
24
+ "bin": {
25
+ "jokul": "./bin/jokul.mjs"
26
+ },
22
27
  "exports": {
23
28
  "./package.json": "./package.json",
29
+ "./styles/jkl": "./styles/jkl/_index.scss",
24
30
  "./styles/*": "./styles/*",
25
31
  "./tailwind": {
26
32
  "import": {
Binary file