@fristil/designsystem 0.2.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 (314) hide show
  1. package/CHANGELOG.md +85 -0
  2. package/LICENSE +21 -0
  3. package/README.md +101 -0
  4. package/dist/cli.d.ts +31 -0
  5. package/dist/cli.d.ts.map +1 -0
  6. package/dist/cli.js +261 -0
  7. package/dist/cli.js.map +1 -0
  8. package/dist/components/css/accordion/accordion.d.ts +37 -0
  9. package/dist/components/css/accordion/accordion.d.ts.map +1 -0
  10. package/dist/components/css/accordion/accordion.js +31 -0
  11. package/dist/components/css/accordion/accordion.js.map +1 -0
  12. package/dist/components/css/alert/alert.d.ts +35 -0
  13. package/dist/components/css/alert/alert.d.ts.map +1 -0
  14. package/dist/components/css/alert/alert.js +29 -0
  15. package/dist/components/css/alert/alert.js.map +1 -0
  16. package/dist/components/css/avatar/avatar.d.ts +40 -0
  17. package/dist/components/css/avatar/avatar.d.ts.map +1 -0
  18. package/dist/components/css/avatar/avatar.js +30 -0
  19. package/dist/components/css/avatar/avatar.js.map +1 -0
  20. package/dist/components/css/badge/badge.d.ts +24 -0
  21. package/dist/components/css/badge/badge.d.ts.map +1 -0
  22. package/dist/components/css/badge/badge.js +24 -0
  23. package/dist/components/css/badge/badge.js.map +1 -0
  24. package/dist/components/css/breadcrumbs/breadcrumbs.d.ts +25 -0
  25. package/dist/components/css/breadcrumbs/breadcrumbs.d.ts.map +1 -0
  26. package/dist/components/css/breadcrumbs/breadcrumbs.js +23 -0
  27. package/dist/components/css/breadcrumbs/breadcrumbs.js.map +1 -0
  28. package/dist/components/css/button/button.d.ts +26 -0
  29. package/dist/components/css/button/button.d.ts.map +1 -0
  30. package/dist/components/css/button/button.js +25 -0
  31. package/dist/components/css/button/button.js.map +1 -0
  32. package/dist/components/css/card/card.d.ts +36 -0
  33. package/dist/components/css/card/card.d.ts.map +1 -0
  34. package/dist/components/css/card/card.js +28 -0
  35. package/dist/components/css/card/card.js.map +1 -0
  36. package/dist/components/css/checkbox/checkbox.d.ts +32 -0
  37. package/dist/components/css/checkbox/checkbox.d.ts.map +1 -0
  38. package/dist/components/css/checkbox/checkbox.js +27 -0
  39. package/dist/components/css/checkbox/checkbox.js.map +1 -0
  40. package/dist/components/css/dialog/dialog.d.ts +30 -0
  41. package/dist/components/css/dialog/dialog.d.ts.map +1 -0
  42. package/dist/components/css/dialog/dialog.js +28 -0
  43. package/dist/components/css/dialog/dialog.js.map +1 -0
  44. package/dist/components/css/divider/divider.d.ts +28 -0
  45. package/dist/components/css/divider/divider.d.ts.map +1 -0
  46. package/dist/components/css/divider/divider.js +22 -0
  47. package/dist/components/css/divider/divider.js.map +1 -0
  48. package/dist/components/css/error-text/error-text.d.ts +24 -0
  49. package/dist/components/css/error-text/error-text.d.ts.map +1 -0
  50. package/dist/components/css/error-text/error-text.js +18 -0
  51. package/dist/components/css/error-text/error-text.js.map +1 -0
  52. package/dist/components/css/fieldset/fieldset.d.ts +55 -0
  53. package/dist/components/css/fieldset/fieldset.d.ts.map +1 -0
  54. package/dist/components/css/fieldset/fieldset.js +39 -0
  55. package/dist/components/css/fieldset/fieldset.js.map +1 -0
  56. package/dist/components/css/file-upload/file-upload.d.ts +41 -0
  57. package/dist/components/css/file-upload/file-upload.d.ts.map +1 -0
  58. package/dist/components/css/file-upload/file-upload.js +32 -0
  59. package/dist/components/css/file-upload/file-upload.js.map +1 -0
  60. package/dist/components/css/heading/heading.d.ts +29 -0
  61. package/dist/components/css/heading/heading.d.ts.map +1 -0
  62. package/dist/components/css/heading/heading.js +23 -0
  63. package/dist/components/css/heading/heading.js.map +1 -0
  64. package/dist/components/css/help-text/help-text.d.ts +24 -0
  65. package/dist/components/css/help-text/help-text.d.ts.map +1 -0
  66. package/dist/components/css/help-text/help-text.js +23 -0
  67. package/dist/components/css/help-text/help-text.js.map +1 -0
  68. package/dist/components/css/input/input.d.ts +39 -0
  69. package/dist/components/css/input/input.d.ts.map +1 -0
  70. package/dist/components/css/input/input.js +44 -0
  71. package/dist/components/css/input/input.js.map +1 -0
  72. package/dist/components/css/label/label.d.ts +33 -0
  73. package/dist/components/css/label/label.d.ts.map +1 -0
  74. package/dist/components/css/label/label.js +23 -0
  75. package/dist/components/css/label/label.js.map +1 -0
  76. package/dist/components/css/link/link.d.ts +21 -0
  77. package/dist/components/css/link/link.d.ts.map +1 -0
  78. package/dist/components/css/link/link.js +14 -0
  79. package/dist/components/css/link/link.js.map +1 -0
  80. package/dist/components/css/list/list.d.ts +29 -0
  81. package/dist/components/css/list/list.d.ts.map +1 -0
  82. package/dist/components/css/list/list.js +23 -0
  83. package/dist/components/css/list/list.js.map +1 -0
  84. package/dist/components/css/pagination/pagination.d.ts +27 -0
  85. package/dist/components/css/pagination/pagination.d.ts.map +1 -0
  86. package/dist/components/css/pagination/pagination.js +25 -0
  87. package/dist/components/css/pagination/pagination.js.map +1 -0
  88. package/dist/components/css/paragraph/paragraph.d.ts +36 -0
  89. package/dist/components/css/paragraph/paragraph.d.ts.map +1 -0
  90. package/dist/components/css/paragraph/paragraph.js +26 -0
  91. package/dist/components/css/paragraph/paragraph.js.map +1 -0
  92. package/dist/components/css/radio/radio.d.ts +32 -0
  93. package/dist/components/css/radio/radio.d.ts.map +1 -0
  94. package/dist/components/css/radio/radio.js +27 -0
  95. package/dist/components/css/radio/radio.js.map +1 -0
  96. package/dist/components/css/search/search.d.ts +33 -0
  97. package/dist/components/css/search/search.d.ts.map +1 -0
  98. package/dist/components/css/search/search.js +31 -0
  99. package/dist/components/css/search/search.js.map +1 -0
  100. package/dist/components/css/select/select.d.ts +23 -0
  101. package/dist/components/css/select/select.d.ts.map +1 -0
  102. package/dist/components/css/select/select.js +18 -0
  103. package/dist/components/css/select/select.js.map +1 -0
  104. package/dist/components/css/shared.d.ts +26 -0
  105. package/dist/components/css/shared.d.ts.map +1 -0
  106. package/dist/components/css/shared.js +34 -0
  107. package/dist/components/css/shared.js.map +1 -0
  108. package/dist/components/css/skeleton/skeleton.d.ts +29 -0
  109. package/dist/components/css/skeleton/skeleton.d.ts.map +1 -0
  110. package/dist/components/css/skeleton/skeleton.js +23 -0
  111. package/dist/components/css/skeleton/skeleton.js.map +1 -0
  112. package/dist/components/css/skip-link/skip-link.d.ts +18 -0
  113. package/dist/components/css/skip-link/skip-link.d.ts.map +1 -0
  114. package/dist/components/css/skip-link/skip-link.js +16 -0
  115. package/dist/components/css/skip-link/skip-link.js.map +1 -0
  116. package/dist/components/css/spinner/spinner.d.ts +33 -0
  117. package/dist/components/css/spinner/spinner.d.ts.map +1 -0
  118. package/dist/components/css/spinner/spinner.js +25 -0
  119. package/dist/components/css/spinner/spinner.js.map +1 -0
  120. package/dist/components/css/sr-only/sr-only.d.ts +17 -0
  121. package/dist/components/css/sr-only/sr-only.d.ts.map +1 -0
  122. package/dist/components/css/sr-only/sr-only.js +14 -0
  123. package/dist/components/css/sr-only/sr-only.js.map +1 -0
  124. package/dist/components/css/switch/switch.d.ts +33 -0
  125. package/dist/components/css/switch/switch.d.ts.map +1 -0
  126. package/dist/components/css/switch/switch.js +29 -0
  127. package/dist/components/css/switch/switch.js.map +1 -0
  128. package/dist/components/css/table/table.d.ts +36 -0
  129. package/dist/components/css/table/table.d.ts.map +1 -0
  130. package/dist/components/css/table/table.js +28 -0
  131. package/dist/components/css/table/table.js.map +1 -0
  132. package/dist/components/css/tag/tag.d.ts +35 -0
  133. package/dist/components/css/tag/tag.d.ts.map +1 -0
  134. package/dist/components/css/tag/tag.js +27 -0
  135. package/dist/components/css/tag/tag.js.map +1 -0
  136. package/dist/components/css/textarea/textarea.d.ts +23 -0
  137. package/dist/components/css/textarea/textarea.d.ts.map +1 -0
  138. package/dist/components/css/textarea/textarea.js +18 -0
  139. package/dist/components/css/textarea/textarea.js.map +1 -0
  140. package/dist/components/css/toggle-group/toggle-group.d.ts +31 -0
  141. package/dist/components/css/toggle-group/toggle-group.d.ts.map +1 -0
  142. package/dist/components/css/toggle-group/toggle-group.js +29 -0
  143. package/dist/components/css/toggle-group/toggle-group.js.map +1 -0
  144. package/dist/components/css/tooltip/tooltip.d.ts +30 -0
  145. package/dist/components/css/tooltip/tooltip.d.ts.map +1 -0
  146. package/dist/components/css/tooltip/tooltip.js +28 -0
  147. package/dist/components/css/tooltip/tooltip.js.map +1 -0
  148. package/dist/components/frittstaende/calendar/fs-calendar.d.ts +52 -0
  149. package/dist/components/frittstaende/calendar/fs-calendar.d.ts.map +1 -0
  150. package/dist/components/frittstaende/calendar/fs-calendar.js +462 -0
  151. package/dist/components/frittstaende/calendar/fs-calendar.js.map +1 -0
  152. package/dist/components/frittstaende/date-field/fs-date-field.d.ts +110 -0
  153. package/dist/components/frittstaende/date-field/fs-date-field.d.ts.map +1 -0
  154. package/dist/components/frittstaende/date-field/fs-date-field.js +264 -0
  155. package/dist/components/frittstaende/date-field/fs-date-field.js.map +1 -0
  156. package/dist/components/frittstaende/suggestion/fs-suggestion.d.ts +133 -0
  157. package/dist/components/frittstaende/suggestion/fs-suggestion.d.ts.map +1 -0
  158. package/dist/components/frittstaende/suggestion/fs-suggestion.js +280 -0
  159. package/dist/components/frittstaende/suggestion/fs-suggestion.js.map +1 -0
  160. package/dist/components/frittstaende/toast/fs-toast.d.ts +67 -0
  161. package/dist/components/frittstaende/toast/fs-toast.d.ts.map +1 -0
  162. package/dist/components/frittstaende/toast/fs-toast.js +108 -0
  163. package/dist/components/frittstaende/toast/fs-toast.js.map +1 -0
  164. package/dist/components/ramme/error-summary/fs-error-summary.d.ts +70 -0
  165. package/dist/components/ramme/error-summary/fs-error-summary.d.ts.map +1 -0
  166. package/dist/components/ramme/error-summary/fs-error-summary.js +155 -0
  167. package/dist/components/ramme/error-summary/fs-error-summary.js.map +1 -0
  168. package/dist/components/ramme/field/field-core.d.ts +70 -0
  169. package/dist/components/ramme/field/field-core.d.ts.map +1 -0
  170. package/dist/components/ramme/field/field-core.js +60 -0
  171. package/dist/components/ramme/field/field-core.js.map +1 -0
  172. package/dist/components/ramme/field/fs-field.d.ts +49 -0
  173. package/dist/components/ramme/field/fs-field.d.ts.map +1 -0
  174. package/dist/components/ramme/field/fs-field.js +118 -0
  175. package/dist/components/ramme/field/fs-field.js.map +1 -0
  176. package/dist/components/ramme/popover/fs-popover.d.ts +68 -0
  177. package/dist/components/ramme/popover/fs-popover.d.ts.map +1 -0
  178. package/dist/components/ramme/popover/fs-popover.js +167 -0
  179. package/dist/components/ramme/popover/fs-popover.js.map +1 -0
  180. package/dist/components/ramme/tabs/fs-tabs.d.ts +61 -0
  181. package/dist/components/ramme/tabs/fs-tabs.d.ts.map +1 -0
  182. package/dist/components/ramme/tabs/fs-tabs.js +156 -0
  183. package/dist/components/ramme/tabs/fs-tabs.js.map +1 -0
  184. package/dist/dom.d.ts +33 -0
  185. package/dist/dom.d.ts.map +1 -0
  186. package/dist/dom.js +77 -0
  187. package/dist/dom.js.map +1 -0
  188. package/dist/fs.d.ts +199 -0
  189. package/dist/fs.d.ts.map +1 -0
  190. package/dist/fs.js +128 -0
  191. package/dist/fs.js.map +1 -0
  192. package/dist/index.d.ts +84 -0
  193. package/dist/index.d.ts.map +1 -0
  194. package/dist/index.js +48 -0
  195. package/dist/index.js.map +1 -0
  196. package/dist/jsx/react.d.ts +127 -0
  197. package/dist/jsx/react.d.ts.map +1 -0
  198. package/dist/jsx/react.js +2 -0
  199. package/dist/jsx/react.js.map +1 -0
  200. package/dist/react.d.ts +207 -0
  201. package/dist/react.d.ts.map +1 -0
  202. package/dist/react.js +109 -0
  203. package/dist/react.js.map +1 -0
  204. package/dist/tailwind/preset.d.ts +120 -0
  205. package/dist/tailwind/preset.d.ts.map +1 -0
  206. package/dist/tailwind/preset.js +107 -0
  207. package/dist/tailwind/preset.js.map +1 -0
  208. package/dist/takeover.d.ts +79 -0
  209. package/dist/takeover.d.ts.map +1 -0
  210. package/dist/takeover.js +119 -0
  211. package/dist/takeover.js.map +1 -0
  212. package/dist/tokens/color.d.ts +85 -0
  213. package/dist/tokens/color.d.ts.map +1 -0
  214. package/dist/tokens/color.js +212 -0
  215. package/dist/tokens/color.js.map +1 -0
  216. package/dist/tokens/theme.d.ts +52 -0
  217. package/dist/tokens/theme.d.ts.map +1 -0
  218. package/dist/tokens/theme.js +197 -0
  219. package/dist/tokens/theme.js.map +1 -0
  220. package/dist/tokens/tokens.d.ts +210 -0
  221. package/dist/tokens/tokens.d.ts.map +1 -0
  222. package/dist/tokens/tokens.js +238 -0
  223. package/dist/tokens/tokens.js.map +1 -0
  224. package/package.json +334 -0
  225. package/src/components/css/accordion/accordion.css +74 -0
  226. package/src/components/css/accordion/accordion.ts +50 -0
  227. package/src/components/css/alert/alert.css +50 -0
  228. package/src/components/css/alert/alert.ts +48 -0
  229. package/src/components/css/avatar/avatar.css +64 -0
  230. package/src/components/css/avatar/avatar.ts +57 -0
  231. package/src/components/css/badge/badge.css +42 -0
  232. package/src/components/css/badge/badge.ts +43 -0
  233. package/src/components/css/breadcrumbs/breadcrumbs.css +50 -0
  234. package/src/components/css/breadcrumbs/breadcrumbs.ts +29 -0
  235. package/src/components/css/button/button.css +101 -0
  236. package/src/components/css/button/button.ts +44 -0
  237. package/src/components/css/card/card.css +48 -0
  238. package/src/components/css/card/card.ts +50 -0
  239. package/src/components/css/checkbox/checkbox.css +96 -0
  240. package/src/components/css/checkbox/checkbox.ts +50 -0
  241. package/src/components/css/dialog/dialog.css +50 -0
  242. package/src/components/css/dialog/dialog.ts +36 -0
  243. package/src/components/css/divider/divider.css +18 -0
  244. package/src/components/css/divider/divider.ts +41 -0
  245. package/src/components/css/error-text/error-text.css +21 -0
  246. package/src/components/css/error-text/error-text.ts +37 -0
  247. package/src/components/css/fieldset/fieldset.css +57 -0
  248. package/src/components/css/fieldset/fieldset.ts +87 -0
  249. package/src/components/css/file-upload/file-upload.css +92 -0
  250. package/src/components/css/file-upload/file-upload.ts +65 -0
  251. package/src/components/css/heading/heading.css +33 -0
  252. package/src/components/css/heading/heading.ts +42 -0
  253. package/src/components/css/help-text/help-text.css +24 -0
  254. package/src/components/css/help-text/help-text.ts +42 -0
  255. package/src/components/css/input/input.css +131 -0
  256. package/src/components/css/input/input.ts +76 -0
  257. package/src/components/css/label/label.css +34 -0
  258. package/src/components/css/label/label.ts +51 -0
  259. package/src/components/css/link/link.css +36 -0
  260. package/src/components/css/link/link.ts +29 -0
  261. package/src/components/css/list/list.css +40 -0
  262. package/src/components/css/list/list.ts +42 -0
  263. package/src/components/css/pagination/pagination.css +77 -0
  264. package/src/components/css/pagination/pagination.ts +33 -0
  265. package/src/components/css/paragraph/paragraph.css +31 -0
  266. package/src/components/css/paragraph/paragraph.ts +53 -0
  267. package/src/components/css/radio/radio.css +76 -0
  268. package/src/components/css/radio/radio.ts +50 -0
  269. package/src/components/css/search/search.css +49 -0
  270. package/src/components/css/search/search.ts +52 -0
  271. package/src/components/css/select/select.css +95 -0
  272. package/src/components/css/select/select.ts +40 -0
  273. package/src/components/css/shared.ts +40 -0
  274. package/src/components/css/skeleton/skeleton.css +49 -0
  275. package/src/components/css/skeleton/skeleton.ts +43 -0
  276. package/src/components/css/skip-link/skip-link.css +36 -0
  277. package/src/components/css/skip-link/skip-link.ts +22 -0
  278. package/src/components/css/spinner/spinner.css +48 -0
  279. package/src/components/css/spinner/spinner.ts +48 -0
  280. package/src/components/css/sr-only/sr-only.css +16 -0
  281. package/src/components/css/sr-only/sr-only.ts +18 -0
  282. package/src/components/css/switch/switch.css +101 -0
  283. package/src/components/css/switch/switch.ts +46 -0
  284. package/src/components/css/table/table.css +63 -0
  285. package/src/components/css/table/table.ts +50 -0
  286. package/src/components/css/tag/tag.css +58 -0
  287. package/src/components/css/tag/tag.ts +49 -0
  288. package/src/components/css/textarea/textarea.css +71 -0
  289. package/src/components/css/textarea/textarea.ts +40 -0
  290. package/src/components/css/toggle-group/toggle-group.css +82 -0
  291. package/src/components/css/toggle-group/toggle-group.ts +37 -0
  292. package/src/components/css/tooltip/tooltip.css +47 -0
  293. package/src/components/css/tooltip/tooltip.ts +36 -0
  294. package/src/components/frittstaende/calendar/fs-calendar.ts +525 -0
  295. package/src/components/frittstaende/date-field/date-field.css +54 -0
  296. package/src/components/frittstaende/date-field/fs-date-field.ts +309 -0
  297. package/src/components/frittstaende/suggestion/fs-suggestion.ts +333 -0
  298. package/src/components/frittstaende/suggestion/suggestion.css +63 -0
  299. package/src/components/frittstaende/toast/fs-toast.ts +146 -0
  300. package/src/components/frittstaende/toast/toast.css +71 -0
  301. package/src/components/ramme/error-summary/error-summary.css +45 -0
  302. package/src/components/ramme/error-summary/fs-error-summary.ts +197 -0
  303. package/src/components/ramme/field/field-core.ts +132 -0
  304. package/src/components/ramme/field/field.css +6 -0
  305. package/src/components/ramme/field/fs-field.ts +154 -0
  306. package/src/components/ramme/popover/fs-popover.ts +205 -0
  307. package/src/components/ramme/popover/popover.css +34 -0
  308. package/src/components/ramme/tabs/fs-tabs.ts +182 -0
  309. package/src/components/ramme/tabs/tabs.css +68 -0
  310. package/src/tailwind/tailwind.css +134 -0
  311. package/src/tokens/color.ts +267 -0
  312. package/src/tokens/theme.ts +350 -0
  313. package/src/tokens/tokens.css +214 -0
  314. package/src/tokens/tokens.ts +293 -0
@@ -0,0 +1,293 @@
1
+ export const Breakpoints = {
2
+ sm: "640px",
3
+ md: "768px",
4
+ lg: "1024px",
5
+ xl: "1280px",
6
+ "2xl": "1536px",
7
+ } as const
8
+
9
+ export const Containers = {
10
+ xs: "100%",
11
+ sm: "576px",
12
+ md: "960px",
13
+ lg: "1152px",
14
+ xl: "1536px",
15
+ aside: "384px",
16
+ asideNarrow: "288px",
17
+ wideContent: "768px",
18
+ } as const
19
+
20
+ export type Breakpoint = keyof typeof Breakpoints
21
+ export type Container = keyof typeof Containers
22
+
23
+ export const cssTokens = {
24
+ // Font sizes
25
+ "--font-size-reference": "16px",
26
+ "--font-size-xxs": "0.625rem",
27
+ "--font-size-xs": "0.75rem",
28
+ "--font-size-s": "0.875rem",
29
+ "--font-size-m": "1rem",
30
+ "--font-size-l": "1.125rem",
31
+ "--font-size-xl": "1.375rem",
32
+ "--font-size-xxl": "1.875rem",
33
+ "--font-size-mega": "2.625rem",
34
+
35
+ // Size scale (Tailwind-kompatibel, 4px-base)
36
+ "--size-px": "1px",
37
+ "--size-0-5": "0.125rem",
38
+ "--size-1": "0.25rem",
39
+ "--size-2": "0.5rem",
40
+ "--size-3": "0.75rem",
41
+ "--size-4": "1rem",
42
+ "--size-5": "1.25rem",
43
+ "--size-6": "1.5rem",
44
+ "--size-7": "1.75rem",
45
+ "--size-8": "2rem",
46
+ "--size-10": "2.5rem",
47
+ "--size-12": "3rem",
48
+ "--size-16": "4rem",
49
+
50
+ // Semantic: størrelse og avstand
51
+ "--semantic-size-default": "var(--size-4)",
52
+ "--semantic-spacing-default": "var(--size-4)",
53
+
54
+ // Palette: Burgundy
55
+ "--palette-burgundy-5": "#faf0f3",
56
+ "--palette-burgundy-10": "#f7e2e8",
57
+ "--palette-burgundy-30": "#f3a7b0",
58
+ "--palette-burgundy-50": "#f06674",
59
+ "--palette-burgundy-70": "#b04c5c",
60
+ "--palette-burgundy-100": "#6f2c3f",
61
+
62
+ // Palette: Forest
63
+ "--palette-forest-5": "#f4faf5",
64
+ "--palette-forest-10": "#e3f5ea",
65
+ "--palette-forest-30": "#b9e1c8",
66
+ "--palette-forest-50": "#91d6ac",
67
+ "--palette-forest-70": "#5d9b73",
68
+ "--palette-forest-100": "#2b6940",
69
+
70
+ // Palette: Ochre
71
+ "--palette-ochre-5": "#f9f4f0",
72
+ "--palette-ochre-10": "#f9ede2",
73
+ "--palette-ochre-30": "#f0d2b6",
74
+ "--palette-ochre-50": "#e7b78a",
75
+ "--palette-ochre-70": "#a9805b",
76
+ "--palette-ochre-100": "#6b492c",
77
+
78
+ // Palette: Denim
79
+ "--palette-denim-5": "#eff3f9",
80
+ "--palette-denim-10": "#e2eaf7",
81
+ "--palette-denim-30": "#b5cbee",
82
+ "--palette-denim-50": "#89abe5",
83
+ "--palette-denim-70": "#5a77a8",
84
+ "--palette-denim-100": "#2c436b",
85
+
86
+ // Palette: Azure
87
+ "--palette-azure-10": "#cde1f9",
88
+ "--palette-azure-30": "#9ccff2",
89
+ "--palette-azure-70": "#1362ae",
90
+ "--palette-azure-100": "#093e61",
91
+
92
+ // Palette: Graphite
93
+ "--palette-graphite-0": "#ffffff",
94
+ "--palette-graphite-5": "#f4f4f4",
95
+ "--palette-graphite-10": "#e5e5e5",
96
+ "--palette-graphite-30": "#b2b2b2",
97
+ "--palette-graphite-50": "#757575",
98
+ "--palette-graphite-70": "#4d4d4d",
99
+ "--palette-graphite-100": "#1a1a1a",
100
+
101
+ // Palette: Alpha
102
+ "--palette-dark-alpha-50": "#1a1a1a80",
103
+
104
+ // Semantic: side
105
+ "--semantic-page-background": "var(--palette-graphite-0)",
106
+ "--semantic-page-foreground": "var(--palette-graphite-100)",
107
+
108
+ // Semantic: status
109
+ "--semantic-danger-background": "var(--palette-burgundy-10)",
110
+ "--semantic-danger-foreground": "#a82e39",
111
+ "--semantic-warning-background": "var(--palette-ochre-10)",
112
+ "--semantic-warning-foreground": "#896508",
113
+ "--semantic-success-background": "var(--palette-forest-10)",
114
+ "--semantic-success-foreground": "#316f2a",
115
+
116
+ /**
117
+ * Deaktiverte kontroller. WCAG 1.4.3 unntar inaktive komponenter fra
118
+ * kontrastkravet, men teksten bør fortsatt kunne leses, siden et avslått
119
+ * felt ofte viser innhold brukeren trenger. Bruk den bare på noe som faktisk er
120
+ * slått av; dempet tekst som skal leses bruker `muted-foreground`.
121
+ */
122
+ "--semantic-disabled-background": "var(--palette-graphite-10)",
123
+ "--semantic-disabled-foreground": "var(--palette-graphite-50)",
124
+
125
+ /**
126
+ * Dempet tekst som likevel skal leses: hjelpetekst, plassholdere,
127
+ * «(valgfri)»-markeringen, ukedagene i kalenderen. Holder 4,5:1 mot
128
+ * sideflaten i begge temaer.
129
+ */
130
+ "--semantic-muted-foreground": "var(--palette-graphite-50)",
131
+
132
+ // Nøytral status: informasjon brukeren skal lese, ikke en avslått
133
+ // kontroll. Derfor mørkere enn disabled: 6,71:1 mot egen bakgrunn.
134
+ "--semantic-neutral-background": "var(--palette-graphite-10)",
135
+ "--semantic-neutral-foreground": "var(--palette-graphite-70)",
136
+
137
+ // Semantic: interaktiv
138
+ "--semantic-interactive-background": "var(--palette-azure-10)",
139
+ "--semantic-interactive-main": "var(--palette-azure-70)",
140
+ "--semantic-interactive-foreground": "var(--palette-azure-100)",
141
+ /** Tekst oppå `interactive-main`. Snur med temaet. */
142
+ "--semantic-interactive-contrast": "var(--palette-graphite-0)",
143
+ "--semantic-interactive-visited": "var(--palette-denim-70)",
144
+
145
+ // Semantic: skjemafelt
146
+ /**
147
+ * Rammen rundt input, textarea, select og kalenderpanelet.
148
+ *
149
+ * graphite-50, ikke graphite-30. WCAG 1.4.11 krever 3:1 for grafiske
150
+ * avgrensninger, og graphite-30 gir bare 2,12:1 mot hvit flate. Feltet var
151
+ * så vidt synlig for den som ser dårlig.
152
+ */
153
+ "--semantic-field-border": "var(--palette-graphite-50)",
154
+ "--semantic-field-border-hover": "var(--palette-graphite-70)",
155
+
156
+ // Semantic: farefylte handlinger
157
+ /**
158
+ * Fylt flate på danger-knappen når den holdes over, med `danger-contrast`
159
+ * som tekst. Før mørknet bakgrunnen mens teksten ble stående, og hover
160
+ * havnet på 3,52:1, altså svakere enn hviletilstanden.
161
+ */
162
+ "--semantic-danger-main": "#a82e39",
163
+ "--semantic-danger-contrast": "var(--palette-graphite-0)",
164
+
165
+ // Semantic: skillelinjer
166
+ "--semantic-divider-30": "var(--palette-graphite-30)",
167
+ "--semantic-divider-100": "var(--palette-graphite-100)",
168
+
169
+ /** Forstørrelsesglasset i søkefeltet. */
170
+ "--semantic-icon-search":
171
+ "url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%234d4d4d' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='11' cy='11' r='7'/%3E%3Cline x1='16.5' y1='16.5' x2='21' y2='21'/%3E%3C/svg%3E\")",
172
+
173
+ /**
174
+ * Haken og streken i avkryssingsboksen.
175
+ *
176
+ * De tegnes oppå `interactive-main`, og må derfor følge
177
+ * `interactive-contrast`, ikke sideflaten.
178
+ */
179
+ "--semantic-icon-check":
180
+ "url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23ffffff' stroke-width='3' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='20 6 9 17 4 12'/%3E%3C/svg%3E\")",
181
+ "--semantic-icon-dash":
182
+ "url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23ffffff' stroke-width='3' stroke-linecap='round'%3E%3Cline x1='6' y1='12' x2='18' y2='12'/%3E%3C/svg%3E\")",
183
+
184
+ /**
185
+ * Ikonene som tegnes inn i bakgrunnen til dato- og klokkeslettfeltet.
186
+ *
187
+ * De hører hjemme her og ikke i komponenten, fordi en data-URL ikke kan
188
+ * lese en CSS-variabel: streken er malt inn i selve bildet. Med ikonet som
189
+ * token snur det med temaet, som alt annet. Før var streken fast
190
+ * graphite-70, altså 2,03:1 mot den mørke flaten, og så vidt synlig.
191
+ */
192
+ "--semantic-icon-calendar":
193
+ "url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%234d4d4d' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Crect x='3' y='4' width='18' height='18' rx='2' ry='2'/%3E%3Cline x1='16' y1='2' x2='16' y2='6'/%3E%3Cline x1='8' y1='2' x2='8' y2='6'/%3E%3Cline x1='3' y1='10' x2='21' y2='10'/%3E%3C/svg%3E\")",
194
+ "--semantic-icon-clock":
195
+ "url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%234d4d4d' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='12' cy='12' r='9'/%3E%3Cpolyline points='12 7 12 12 15 15'/%3E%3C/svg%3E\")",
196
+
197
+ /**
198
+ * Flaten bak en dialog som er åpnet med `showModal()`.
199
+ *
200
+ * Den ligger mellom siden og dialogen, og må dempe sideinnholdet i begge
201
+ * temaer. I mørkt tema er en sort flate nesten usynlig mot bakgrunnen, så
202
+ * den er kraftigere der.
203
+ */
204
+ "--semantic-overlay-backdrop": "var(--palette-dark-alpha-50)",
205
+
206
+ /**
207
+ * Skyggen under flater som ligger over siden, som kalenderpanelet.
208
+ *
209
+ * Hører til det semantiske laget fordi den må snu med temaet: en svak
210
+ * sort skygge er usynlig mot en nesten sort flate, og panelet mistet
211
+ * dybden si i mørkt tema.
212
+ */
213
+ "--semantic-shadow-overlay": "0 16px 40px rgba(0, 0, 0, 0.12)",
214
+ } as const
215
+
216
+ export type CssToken = keyof typeof cssTokens
217
+
218
+ /**
219
+ * Verdiene som overstyres i mørkt tema.
220
+ *
221
+ * Bare det semantiske laget snur. Paletten er råverdier og er den samme i
222
+ * begge temaer. Det er hva fargene *betyr* som endrer seg, ikke hvilke
223
+ * farger som finnes.
224
+ *
225
+ * Alle par er kontrollert mot WCAG AA. Se `tokens.browser.test.ts`.
226
+ */
227
+ export const darkTokens = {
228
+ // Side: nær sort flate, dempet hvit tekst
229
+ "--semantic-page-background": "var(--palette-graphite-100)",
230
+ "--semantic-page-foreground": "var(--palette-graphite-5)",
231
+
232
+ // Status: mørk flate, lys tekst. Speilvendt av lyst tema.
233
+ "--semantic-danger-background": "var(--palette-burgundy-100)",
234
+ "--semantic-danger-foreground": "var(--palette-burgundy-30)",
235
+ "--semantic-warning-background": "var(--palette-ochre-100)",
236
+ "--semantic-warning-foreground": "var(--palette-ochre-30)",
237
+ "--semantic-success-background": "var(--palette-forest-100)",
238
+ "--semantic-success-foreground": "var(--palette-forest-30)",
239
+
240
+ // Deaktivert: graphite-50 på graphite-70 ga 1,83:1 og var uleselig.
241
+ // graphite-30 gir 3,99:1: fortsatt tydelig av, men mulig å lese.
242
+ "--semantic-disabled-background": "var(--palette-graphite-70)",
243
+ "--semantic-disabled-foreground": "var(--palette-graphite-30)",
244
+
245
+ // Dempet, lesbar tekst som holder 8,21:1 mot den mørke flaten
246
+ "--semantic-muted-foreground": "var(--palette-graphite-30)",
247
+
248
+ // Nøytral status som fortsatt skal leses, og holder 6,71:1
249
+ "--semantic-neutral-background": "var(--palette-graphite-70)",
250
+ "--semantic-neutral-foreground": "var(--palette-graphite-10)",
251
+
252
+ // Interaktiv: lys blå på mørk flate, med mørk tekst oppå
253
+ "--semantic-interactive-background": "var(--palette-azure-100)",
254
+ "--semantic-interactive-main": "var(--palette-azure-30)",
255
+ "--semantic-interactive-foreground": "var(--palette-azure-10)",
256
+ "--semantic-interactive-contrast": "var(--palette-graphite-100)",
257
+ "--semantic-interactive-visited": "var(--palette-denim-30)",
258
+
259
+ // Skjemafelt: rammen må være lysere enn flaten, ikke mørkere
260
+ "--semantic-field-border": "var(--palette-graphite-50)",
261
+ "--semantic-field-border-hover": "var(--palette-graphite-30)",
262
+
263
+ // Farefylte handlinger
264
+ "--semantic-danger-main": "var(--palette-burgundy-30)",
265
+ "--semantic-danger-contrast": "var(--palette-graphite-100)",
266
+
267
+ // Skillelinjer
268
+ "--semantic-divider-30": "var(--palette-graphite-70)",
269
+ "--semantic-divider-100": "var(--palette-graphite-30)",
270
+
271
+ "--semantic-icon-search":
272
+ "url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23b2b2b2' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='11' cy='11' r='7'/%3E%3Cline x1='16.5' y1='16.5' x2='21' y2='21'/%3E%3C/svg%3E\")",
273
+
274
+ // Hake og strek ligger oppå interactive-main, som er lys i mørkt tema
275
+ "--semantic-icon-check":
276
+ "url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%231a1a1a' stroke-width='3' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='20 6 9 17 4 12'/%3E%3C/svg%3E\")",
277
+ "--semantic-icon-dash":
278
+ "url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%231a1a1a' stroke-width='3' stroke-linecap='round'%3E%3Cline x1='6' y1='12' x2='18' y2='12'/%3E%3C/svg%3E\")",
279
+
280
+ // Ikoner: lysere strek, så de holder seg synlige mot den mørke flaten
281
+ "--semantic-icon-calendar":
282
+ "url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23b2b2b2' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Crect x='3' y='4' width='18' height='18' rx='2' ry='2'/%3E%3Cline x1='16' y1='2' x2='16' y2='6'/%3E%3Cline x1='8' y1='2' x2='8' y2='6'/%3E%3Cline x1='3' y1='10' x2='21' y2='10'/%3E%3C/svg%3E\")",
283
+ "--semantic-icon-clock":
284
+ "url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23b2b2b2' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='12' cy='12' r='9'/%3E%3Cpolyline points='12 7 12 12 15 15'/%3E%3C/svg%3E\")",
285
+
286
+ // Flaten bak en dialog må dempe mer når siden under alt er mørk
287
+ "--semantic-overlay-backdrop": "rgba(0, 0, 0, 0.72)",
288
+
289
+ // Skygge: kraftigere, siden flaten under er nesten sort
290
+ "--semantic-shadow-overlay": "0 16px 40px rgba(0, 0, 0, 0.6)",
291
+ } as const satisfies Partial<Record<CssToken, string>>
292
+
293
+ export type DarkToken = keyof typeof darkTokens