@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,280 @@
1
+ import { html, LitElement } from "lit";
2
+ import { ifDefined } from "lit/directives/if-defined.js";
3
+ import { live } from "lit/directives/live.js";
4
+ import { computeFieldAttributes } from "../../ramme/field/field-core.js";
5
+ export const FS_SUGGESTION_TAG = "fs-suggestion";
6
+ /**
7
+ * Et tekstfelt med forslag som snevres inn mens brukeren skriver.
8
+ *
9
+ * Alternativene skrives som `<option>`-barn, slik de ville stått i en
10
+ * `<datalist>`. Komponenten leser dem én gang og bygger lista selv, fordi
11
+ * nettleserens egen `<datalist>` ikke kan styles, oppfører seg ulikt i hver
12
+ * nettleser, og ikke melder antall treff til skjermlesere.
13
+ *
14
+ * Feltet er et fritekstfelt, ikke en nedtrekksliste. Brukeren kan skrive noe
15
+ * som ikke står i lista. Skal bare gitte verdier godtas, er
16
+ * [Select](../../css/select/select.js) riktig.
17
+ *
18
+ * ```html
19
+ * <fs-suggestion label="Kommune" name="kommune">
20
+ * <option>Bergen</option>
21
+ * <option>Oslo</option>
22
+ * </fs-suggestion>
23
+ * ```
24
+ */
25
+ export class FsSuggestion extends LitElement {
26
+ constructor() {
27
+ super(...arguments);
28
+ this.label = "";
29
+ this.value = "";
30
+ this.invalid = false;
31
+ this.required = false;
32
+ this.optional = false;
33
+ this.disabled = false;
34
+ this.noResultsText = "Ingen treff";
35
+ this.open = false;
36
+ /** Alternativet som er markert med piltastene. */
37
+ this.activeIndex = -1;
38
+ this.options = [];
39
+ this.uid = `fs-suggestion-${Math.random().toString(36).slice(2, 9)}`;
40
+ this.handleFocus = () => {
41
+ if (!this.disabled)
42
+ this.show();
43
+ };
44
+ this.handleInput = (event) => {
45
+ const input = event.target;
46
+ this.value = input.value;
47
+ this.activeIndex = -1;
48
+ this.show();
49
+ };
50
+ this.handleKeydown = (event) => {
51
+ const matches = this.filteredOptions;
52
+ if (event.key === "Escape") {
53
+ event.preventDefault();
54
+ this.hide();
55
+ return;
56
+ }
57
+ if (event.key === "ArrowDown" || event.key === "ArrowUp") {
58
+ event.preventDefault();
59
+ if (!this.open)
60
+ this.show();
61
+ if (matches.length === 0)
62
+ return;
63
+ const step = event.key === "ArrowDown" ? 1 : -1;
64
+ const next = this.activeIndex + step;
65
+ this.activeIndex =
66
+ next < 0 ? matches.length - 1 : next >= matches.length ? 0 : next;
67
+ this.requestUpdate();
68
+ return;
69
+ }
70
+ if (event.key === "Enter" && this.open && this.activeIndex >= 0) {
71
+ event.preventDefault();
72
+ this.select(matches[this.activeIndex]);
73
+ }
74
+ };
75
+ this.handleOptionClick = (event, option) => {
76
+ // mousedown og ikke click: feltet mister ellers fokus før valget rekker
77
+ // å skje, og lista lukker seg med den.
78
+ event.preventDefault();
79
+ this.select(option);
80
+ };
81
+ this.handleOutsideClick = (event) => {
82
+ if (!this.open)
83
+ return;
84
+ if (this.contains(event.target))
85
+ return;
86
+ this.hide();
87
+ };
88
+ }
89
+ createRenderRoot() {
90
+ return this;
91
+ }
92
+ connectedCallback() {
93
+ super.connectedCallback();
94
+ this.readOptions();
95
+ document.addEventListener("click", this.handleOutsideClick, true);
96
+ // Alternativene byttes ofte ut mens brukeren skriver, for eksempel med
97
+ // treff fra en server. Uten dette ville bare det første settet telt.
98
+ this.observer = new MutationObserver(() => {
99
+ if (this.querySelector("option")) {
100
+ this.readOptions();
101
+ this.requestUpdate();
102
+ }
103
+ });
104
+ this.observer.observe(this, { childList: true });
105
+ }
106
+ disconnectedCallback() {
107
+ document.removeEventListener("click", this.handleOutsideClick, true);
108
+ this.observer?.disconnect();
109
+ this.observer = undefined;
110
+ super.disconnectedCallback();
111
+ }
112
+ /** Leser `<option>`-barna og fjerner dem fra visningen. */
113
+ readOptions() {
114
+ const options = [...this.querySelectorAll("option")];
115
+ if (options.length === 0)
116
+ return;
117
+ this.options = options.map((option) => ({
118
+ value: option.value || (option.textContent ?? "").trim(),
119
+ label: (option.textContent ?? "").trim() || option.value,
120
+ }));
121
+ for (const option of options)
122
+ option.remove();
123
+ }
124
+ /** Alternativene som passer med det som står i feltet. */
125
+ get filteredOptions() {
126
+ const query = this.value.trim().toLowerCase();
127
+ if (query === "")
128
+ return this.options;
129
+ return this.options.filter((option) => option.label.toLowerCase().includes(query));
130
+ }
131
+ get inputId() {
132
+ return this.controlId || `${this.uid}-input`;
133
+ }
134
+ get listId() {
135
+ return `${this.uid}-list`;
136
+ }
137
+ get statusId() {
138
+ return `${this.uid}-status`;
139
+ }
140
+ render() {
141
+ const field = computeFieldAttributes({
142
+ id: this.inputId,
143
+ help: Boolean(this.helpText),
144
+ error: Boolean(this.errorText),
145
+ helpId: `${this.uid}-help`,
146
+ errorId: `${this.uid}-error`,
147
+ required: this.required ? "symbol" : undefined,
148
+ optional: this.optional,
149
+ invalid: this.invalid,
150
+ disabled: this.disabled,
151
+ describedBy: [this.statusId, this.describedBy ?? ""].filter(Boolean),
152
+ });
153
+ const matches = this.filteredOptions;
154
+ const open = this.open && !this.disabled;
155
+ return html `
156
+ <label class="fs-label" for=${field.label.for}
157
+ data-required=${ifDefined(field.label["data-required"])}
158
+ data-optional=${ifDefined(field.label["data-optional"])}
159
+ aria-disabled=${ifDefined(field.label["aria-disabled"])}
160
+ >${this.label}</label
161
+ >
162
+
163
+ <div class="fs-suggestion__field">
164
+ <input
165
+ class="fs-input"
166
+ id=${field.control.id}
167
+ name=${ifDefined(this.name)}
168
+ type="text"
169
+ role="combobox"
170
+ autocomplete="off"
171
+ .value=${live(this.value)}
172
+ placeholder=${ifDefined(this.placeholder)}
173
+ aria-expanded=${String(open)}
174
+ aria-controls=${this.listId}
175
+ aria-autocomplete="list"
176
+ aria-activedescendant=${ifDefined(open && this.activeIndex >= 0
177
+ ? `${this.uid}-option-${this.activeIndex}`
178
+ : undefined)}
179
+ aria-describedby=${ifDefined(field.control["aria-describedby"])}
180
+ aria-invalid=${ifDefined(field.control["aria-invalid"])}
181
+ data-state=${ifDefined(field.control["data-state"])}
182
+ ?disabled=${this.disabled}
183
+ @input=${this.handleInput}
184
+ @keydown=${this.handleKeydown}
185
+ @focus=${this.handleFocus}
186
+ />
187
+
188
+ <ul
189
+ class="fs-suggestion__list"
190
+ id=${this.listId}
191
+ role="listbox"
192
+ ?hidden=${!open}
193
+ >
194
+ ${matches.map((option, index) => html `<li
195
+ class="fs-suggestion__option"
196
+ id=${`${this.uid}-option-${index}`}
197
+ role="option"
198
+ aria-selected=${String(index === this.activeIndex)}
199
+ @mousedown=${(event) => this.handleOptionClick(event, option)}
200
+ >
201
+ ${option.label}
202
+ </li>`)}
203
+ ${matches.length === 0
204
+ ? html `<li class="fs-suggestion__empty" role="presentation">
205
+ ${this.noResultsText}
206
+ </li>`
207
+ : null}
208
+ </ul>
209
+ </div>
210
+
211
+ ${this.helpText
212
+ ? html `<p class="fs-help-text" id=${field.help.id}>${this.helpText}</p>`
213
+ : null}
214
+ ${this.errorText
215
+ ? html `<p
216
+ class="fs-error-text"
217
+ id=${field.error.id}
218
+ ?hidden=${Boolean(field.error.hidden)}
219
+ >
220
+ ${this.errorText}
221
+ </p>`
222
+ : null}
223
+
224
+ <p class="fs-sr-only" id=${this.statusId} role="status">
225
+ ${open ? this.statusText(matches.length) : ""}
226
+ </p>
227
+ `;
228
+ }
229
+ /** Antall treff, som tekst skjermleseren leser opp. */
230
+ statusText(count) {
231
+ if (count === 0)
232
+ return this.noResultsText;
233
+ return count === 1 ? "1 forslag" : `${count} forslag`;
234
+ }
235
+ /** Velger et alternativ og melder fra. */
236
+ select(option) {
237
+ this.value = option.value;
238
+ this.hide();
239
+ const input = this.querySelector("input");
240
+ if (input)
241
+ input.value = option.value;
242
+ this.dispatchEvent(new CustomEvent("suggestion-select", {
243
+ detail: { value: option.value, label: option.label },
244
+ bubbles: true,
245
+ composed: true,
246
+ }));
247
+ this.dispatchEvent(new Event("change", { bubbles: true }));
248
+ }
249
+ /** Åpner forslagslista. */
250
+ show() {
251
+ this.open = true;
252
+ }
253
+ /** Lukker forslagslista. */
254
+ hide() {
255
+ this.open = false;
256
+ this.activeIndex = -1;
257
+ }
258
+ }
259
+ FsSuggestion.properties = {
260
+ label: { type: String },
261
+ value: { type: String, reflect: true },
262
+ name: { type: String },
263
+ placeholder: { type: String },
264
+ helpText: { type: String, attribute: "help-text" },
265
+ errorText: { type: String, attribute: "error-text" },
266
+ invalid: { type: Boolean, reflect: true },
267
+ required: { type: Boolean, reflect: true },
268
+ optional: { type: Boolean, reflect: true },
269
+ disabled: { type: Boolean, reflect: true },
270
+ controlId: { type: String, attribute: "control-id" },
271
+ describedBy: { type: String, attribute: "described-by" },
272
+ noResultsText: { type: String, attribute: "no-results-text" },
273
+ open: { type: Boolean, reflect: true },
274
+ };
275
+ export function defineFsSuggestion(tagName = FS_SUGGESTION_TAG) {
276
+ if (!customElements.get(tagName)) {
277
+ customElements.define(tagName, FsSuggestion);
278
+ }
279
+ }
280
+ //# sourceMappingURL=fs-suggestion.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fs-suggestion.js","sourceRoot":"","sources":["../../../../src/components/frittstaende/suggestion/fs-suggestion.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,KAAK,CAAA;AACtC,OAAO,EAAE,SAAS,EAAE,MAAM,8BAA8B,CAAA;AACxD,OAAO,EAAE,IAAI,EAAE,MAAM,wBAAwB,CAAA;AAE7C,OAAO,EAAE,sBAAsB,EAAE,MAAM,iCAAiC,CAAA;AAExE,MAAM,CAAC,MAAM,iBAAiB,GAAG,eAAwB,CAAA;AAIzD;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,OAAO,YAAa,SAAQ,UAAU;IAA5C;;QAkBE,UAAK,GAAG,EAAE,CAAA;QACV,UAAK,GAAG,EAAE,CAAA;QAKV,YAAO,GAAG,KAAK,CAAA;QACf,aAAQ,GAAG,KAAK,CAAA;QAChB,aAAQ,GAAG,KAAK,CAAA;QAChB,aAAQ,GAAG,KAAK,CAAA;QAGhB,kBAAa,GAAG,aAAa,CAAA;QAC7B,SAAI,GAAG,KAAK,CAAA;QAEZ,kDAAkD;QAC1C,gBAAW,GAAG,CAAC,CAAC,CAAA;QAChB,YAAO,GAAa,EAAE,CAAA;QACb,QAAG,GAClB,iBAAiB,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAA;QA6KnD,gBAAW,GAAG,GAAG,EAAE;YACzB,IAAI,CAAC,IAAI,CAAC,QAAQ;gBAAE,IAAI,CAAC,IAAI,EAAE,CAAA;QACjC,CAAC,CAAA;QAEO,gBAAW,GAAG,CAAC,KAAY,EAAE,EAAE;YACrC,MAAM,KAAK,GAAG,KAAK,CAAC,MAA0B,CAAA;YAC9C,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,KAAK,CAAA;YACxB,IAAI,CAAC,WAAW,GAAG,CAAC,CAAC,CAAA;YACrB,IAAI,CAAC,IAAI,EAAE,CAAA;QACb,CAAC,CAAA;QAEO,kBAAa,GAAG,CAAC,KAAoB,EAAE,EAAE;YAC/C,MAAM,OAAO,GAAG,IAAI,CAAC,eAAe,CAAA;YAEpC,IAAI,KAAK,CAAC,GAAG,KAAK,QAAQ,EAAE,CAAC;gBAC3B,KAAK,CAAC,cAAc,EAAE,CAAA;gBACtB,IAAI,CAAC,IAAI,EAAE,CAAA;gBACX,OAAM;YACR,CAAC;YAED,IAAI,KAAK,CAAC,GAAG,KAAK,WAAW,IAAI,KAAK,CAAC,GAAG,KAAK,SAAS,EAAE,CAAC;gBACzD,KAAK,CAAC,cAAc,EAAE,CAAA;gBACtB,IAAI,CAAC,IAAI,CAAC,IAAI;oBAAE,IAAI,CAAC,IAAI,EAAE,CAAA;gBAC3B,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;oBAAE,OAAM;gBAEhC,MAAM,IAAI,GAAG,KAAK,CAAC,GAAG,KAAK,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;gBAC/C,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,GAAG,IAAI,CAAA;gBAEpC,IAAI,CAAC,WAAW;oBACd,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAA;gBACnE,IAAI,CAAC,aAAa,EAAE,CAAA;gBACpB,OAAM;YACR,CAAC;YAED,IAAI,KAAK,CAAC,GAAG,KAAK,OAAO,IAAI,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,WAAW,IAAI,CAAC,EAAE,CAAC;gBAChE,KAAK,CAAC,cAAc,EAAE,CAAA;gBACtB,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAA;YACxC,CAAC;QACH,CAAC,CAAA;QAEO,sBAAiB,GAAG,CAAC,KAAY,EAAE,MAAc,EAAE,EAAE;YAC3D,wEAAwE;YACxE,uCAAuC;YACvC,KAAK,CAAC,cAAc,EAAE,CAAA;YACtB,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAA;QACrB,CAAC,CAAA;QAEO,uBAAkB,GAAG,CAAC,KAAY,EAAE,EAAE;YAC5C,IAAI,CAAC,IAAI,CAAC,IAAI;gBAAE,OAAM;YACtB,IAAI,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,MAAc,CAAC;gBAAE,OAAM;YAC/C,IAAI,CAAC,IAAI,EAAE,CAAA;QACb,CAAC,CAAA;IA8BH,CAAC;IA5PC,gBAAgB;QACd,OAAO,IAAI,CAAA;IACb,CAAC;IAID,iBAAiB;QACf,KAAK,CAAC,iBAAiB,EAAE,CAAA;QACzB,IAAI,CAAC,WAAW,EAAE,CAAA;QAClB,QAAQ,CAAC,gBAAgB,CAAC,OAAO,EAAE,IAAI,CAAC,kBAAkB,EAAE,IAAI,CAAC,CAAA;QAEjE,uEAAuE;QACvE,qEAAqE;QACrE,IAAI,CAAC,QAAQ,GAAG,IAAI,gBAAgB,CAAC,GAAG,EAAE;YACxC,IAAI,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,EAAE,CAAC;gBACjC,IAAI,CAAC,WAAW,EAAE,CAAA;gBAClB,IAAI,CAAC,aAAa,EAAE,CAAA;YACtB,CAAC;QACH,CAAC,CAAC,CAAA;QACF,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;IAClD,CAAC;IAED,oBAAoB;QAClB,QAAQ,CAAC,mBAAmB,CAAC,OAAO,EAAE,IAAI,CAAC,kBAAkB,EAAE,IAAI,CAAC,CAAA;QACpE,IAAI,CAAC,QAAQ,EAAE,UAAU,EAAE,CAAA;QAC3B,IAAI,CAAC,QAAQ,GAAG,SAAS,CAAA;QACzB,KAAK,CAAC,oBAAoB,EAAE,CAAA;IAC9B,CAAC;IAED,2DAA2D;IACnD,WAAW;QACjB,MAAM,OAAO,GAAG,CAAC,GAAG,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC,CAAA;QACpD,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;YAAE,OAAM;QAEhC,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;YACtC,KAAK,EAAE,MAAM,CAAC,KAAK,IAAI,CAAC,MAAM,CAAC,WAAW,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE;YACxD,KAAK,EAAE,CAAC,MAAM,CAAC,WAAW,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,IAAI,MAAM,CAAC,KAAK;SACzD,CAAC,CAAC,CAAA;QAEH,KAAK,MAAM,MAAM,IAAI,OAAO;YAAE,MAAM,CAAC,MAAM,EAAE,CAAA;IAC/C,CAAC;IAED,0DAA0D;IAC1D,IAAY,eAAe;QACzB,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAA;QAC7C,IAAI,KAAK,KAAK,EAAE;YAAE,OAAO,IAAI,CAAC,OAAO,CAAA;QACrC,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CACpC,MAAM,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,CAC3C,CAAA;IACH,CAAC;IAED,IAAY,OAAO;QACjB,OAAO,IAAI,CAAC,SAAS,IAAI,GAAG,IAAI,CAAC,GAAG,QAAQ,CAAA;IAC9C,CAAC;IAED,IAAY,MAAM;QAChB,OAAO,GAAG,IAAI,CAAC,GAAG,OAAO,CAAA;IAC3B,CAAC;IAED,IAAY,QAAQ;QAClB,OAAO,GAAG,IAAI,CAAC,GAAG,SAAS,CAAA;IAC7B,CAAC;IAED,MAAM;QACJ,MAAM,KAAK,GAAG,sBAAsB,CAAC;YACnC,EAAE,EAAE,IAAI,CAAC,OAAO;YAChB,IAAI,EAAE,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC;YAC5B,KAAK,EAAE,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC;YAC9B,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,OAAO;YAC1B,OAAO,EAAE,GAAG,IAAI,CAAC,GAAG,QAAQ;YAC5B,QAAQ,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS;YAC9C,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,WAAW,EAAE,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,WAAW,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC;SACrE,CAAC,CAAA;QAEF,MAAM,OAAO,GAAG,IAAI,CAAC,eAAe,CAAA;QACpC,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAA;QAExC,OAAO,IAAI,CAAA;oCACqB,KAAK,CAAC,KAAK,CAAC,GAAG;wBAC3B,SAAS,CAAC,KAAK,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC;wBACvC,SAAS,CAAC,KAAK,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC;wBACvC,SAAS,CAAC,KAAK,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC;WACpD,IAAI,CAAC,KAAK;;;;;;eAMN,KAAK,CAAC,OAAO,CAAC,EAAE;iBACd,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC;;;;mBAIlB,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC;wBACX,SAAS,CAAC,IAAI,CAAC,WAAW,CAAC;0BACzB,MAAM,CAAC,IAAI,CAAC;0BACZ,IAAI,CAAC,MAAM;;kCAEH,SAAS,CAC/B,IAAI,IAAI,IAAI,CAAC,WAAW,IAAI,CAAC;YAC3B,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,WAAW,IAAI,CAAC,WAAW,EAAE;YAC1C,CAAC,CAAC,SAAS,CACd;6BACkB,SAAS,CAAC,KAAK,CAAC,OAAO,CAAC,kBAAkB,CAAC,CAAC;yBAChD,SAAS,CAAC,KAAK,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC;uBAC1C,SAAS,CAAC,KAAK,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;sBACvC,IAAI,CAAC,QAAQ;mBAChB,IAAI,CAAC,WAAW;qBACd,IAAI,CAAC,aAAa;mBACpB,IAAI,CAAC,WAAW;;;;;eAKpB,IAAI,CAAC,MAAM;;oBAEN,CAAC,IAAI;;YAEb,OAAO,CAAC,GAAG,CACX,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,CAAC,IAAI,CAAA;;mBAEhB,GAAG,IAAI,CAAC,GAAG,WAAW,KAAK,EAAE;;8BAElB,MAAM,CAAC,KAAK,KAAK,IAAI,CAAC,WAAW,CAAC;2BACrC,CAAC,KAAY,EAAE,EAAE,CAAC,IAAI,CAAC,iBAAiB,CAAC,KAAK,EAAE,MAAM,CAAC;;gBAElE,MAAM,CAAC,KAAK;kBACV,CACP;YAEC,OAAO,CAAC,MAAM,KAAK,CAAC;YAClB,CAAC,CAAC,IAAI,CAAA;kBACF,IAAI,CAAC,aAAa;oBAChB;YACN,CAAC,CAAC,IACN;;;;QAKF,IAAI,CAAC,QAAQ;YACX,CAAC,CAAC,IAAI,CAAA,8BAA8B,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,IAAI,CAAC,QAAQ,MAAM;YACxE,CAAC,CAAC,IACN;QAEE,IAAI,CAAC,SAAS;YACZ,CAAC,CAAC,IAAI,CAAA;;iBAEC,KAAK,CAAC,KAAK,CAAC,EAAE;sBACT,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC;;cAEnC,IAAI,CAAC,SAAS;eACb;YACL,CAAC,CAAC,IACN;;iCAE2B,IAAI,CAAC,QAAQ;UACpC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE;;KAEhD,CAAA;IACH,CAAC;IAED,uDAAuD;IAC/C,UAAU,CAAC,KAAa;QAC9B,IAAI,KAAK,KAAK,CAAC;YAAE,OAAO,IAAI,CAAC,aAAa,CAAA;QAC1C,OAAO,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,GAAG,KAAK,UAAU,CAAA;IACvD,CAAC;IAuDD,0CAA0C;IAC1C,MAAM,CAAC,MAAc;QACnB,IAAI,CAAC,KAAK,GAAG,MAAM,CAAC,KAAK,CAAA;QACzB,IAAI,CAAC,IAAI,EAAE,CAAA;QAEX,MAAM,KAAK,GAAG,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,CAAA;QACzC,IAAI,KAAK;YAAE,KAAK,CAAC,KAAK,GAAG,MAAM,CAAC,KAAK,CAAA;QAErC,IAAI,CAAC,aAAa,CAChB,IAAI,WAAW,CAAC,mBAAmB,EAAE;YACnC,MAAM,EAAE,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE;YACpD,OAAO,EAAE,IAAI;YACb,QAAQ,EAAE,IAAI;SACf,CAAC,CACH,CAAA;QACD,IAAI,CAAC,aAAa,CAAC,IAAI,KAAK,CAAC,QAAQ,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAA;IAC5D,CAAC;IAED,2BAA2B;IAC3B,IAAI;QACF,IAAI,CAAC,IAAI,GAAG,IAAI,CAAA;IAClB,CAAC;IAED,4BAA4B;IAC5B,IAAI;QACF,IAAI,CAAC,IAAI,GAAG,KAAK,CAAA;QACjB,IAAI,CAAC,WAAW,GAAG,CAAC,CAAC,CAAA;IACvB,CAAC;;AAjSM,uBAAU,GAAG;IAClB,KAAK,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE;IACvB,KAAK,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE;IACtC,IAAI,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE;IACtB,WAAW,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE;IAC7B,QAAQ,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,WAAW,EAAE;IAClD,SAAS,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,YAAY,EAAE;IACpD,OAAO,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE;IACzC,QAAQ,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE;IAC1C,QAAQ,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE;IAC1C,QAAQ,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE;IAC1C,SAAS,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,YAAY,EAAE;IACpD,WAAW,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,cAAc,EAAE;IACxD,aAAa,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,iBAAiB,EAAE;IAC7D,IAAI,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE;CACvC,AAfgB,CAehB;AA2RH,MAAM,UAAU,kBAAkB,CAAC,OAAO,GAAG,iBAAiB;IAC5D,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC;QACjC,cAAc,CAAC,MAAM,CAAC,OAAO,EAAE,YAAY,CAAC,CAAA;IAC9C,CAAC;AACH,CAAC"}
@@ -0,0 +1,67 @@
1
+ import { LitElement } from "lit";
2
+ export declare const FS_TOAST_TAG: "fs-toast";
3
+ export declare const TOAST_CLASS: "fs-toast";
4
+ export declare const TOAST_CLOSE_CLASS: "fs-toast__close";
5
+ export declare const toastColors: readonly ["neutral", "success", "warning", "danger"];
6
+ export type ToastColor = (typeof toastColors)[number];
7
+ export type ToastOptions = {
8
+ /** Hva meldingen betyr. Standard: `neutral`. */
9
+ color?: ToastColor;
10
+ /** Millisekunder før meldingen forsvinner. `0` lar den bli stående. */
11
+ duration?: number;
12
+ /** Tekst på lukkeknappen. Standard: «Lukk melding». */
13
+ closeLabel?: string;
14
+ };
15
+ /**
16
+ * Køen av korte meldinger i hjørnet av skjermen.
17
+ *
18
+ * Elementet er beholderen, ikke meldingen. Du legger det inn én gang i
19
+ * appen og kaller `show()` når noe skal meldes.
20
+ *
21
+ * Beholderen er en `role="status"`-region, ikke `role="alert"`. En melding
22
+ * som dukker opp i hjørnet skal ikke avbryte det skjermleseren holder på med;
23
+ * er beskjeden så viktig at den må avbryte, hører den hjemme i en
24
+ * [Alert](../../css/alert/alert.js) i selve siden.
25
+ *
26
+ * Meldinger som forsvinner av seg selv er en tilgjengelighetsfelle: den som
27
+ * leser sakte eller bruker forstørrelse rekker ikke lese dem. Derfor er
28
+ * lukkeknappen alltid der, og tiden stopper mens musa eller fokus er i
29
+ * meldingen.
30
+ *
31
+ * ```ts
32
+ * document.querySelector("fs-toast").show("Søknaden er sendt", {
33
+ * color: "success",
34
+ * })
35
+ * ```
36
+ */
37
+ export declare class FsToast extends LitElement {
38
+ static properties: {
39
+ duration: {
40
+ type: NumberConstructor;
41
+ };
42
+ label: {
43
+ type: StringConstructor;
44
+ };
45
+ };
46
+ /** Standard levetid i millisekunder. `0` lar meldingene bli stående. */
47
+ duration: number;
48
+ /** Tekst som sier hva regionen er. Blir `aria-label`. */
49
+ label: string;
50
+ createRenderRoot(): this;
51
+ render(): import("lit").TemplateResult<1>;
52
+ connectedCallback(): void;
53
+ updated(): void;
54
+ /** Viser en melding, og returnerer elementet den ble lagt i. */
55
+ show(message: string, options?: ToastOptions): HTMLElement;
56
+ /** Fjerner en melding. */
57
+ dismiss(toast: HTMLElement): void;
58
+ /** Fjerner alle meldingene. */
59
+ clear(): void;
60
+ }
61
+ declare global {
62
+ interface HTMLElementTagNameMap {
63
+ "fs-toast": FsToast;
64
+ }
65
+ }
66
+ export declare function defineFsToast(tagName?: "fs-toast"): void;
67
+ //# sourceMappingURL=fs-toast.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fs-toast.d.ts","sourceRoot":"","sources":["../../../../src/components/frittstaende/toast/fs-toast.ts"],"names":[],"mappings":"AAAA,OAAO,EAAQ,UAAU,EAAE,MAAM,KAAK,CAAA;AAEtC,eAAO,MAAM,YAAY,EAAG,UAAmB,CAAA;AAE/C,eAAO,MAAM,WAAW,EAAG,UAAmB,CAAA;AAC9C,eAAO,MAAM,iBAAiB,EAAG,iBAA0B,CAAA;AAE3D,eAAO,MAAM,WAAW,sDAAuD,CAAA;AAC/E,MAAM,MAAM,UAAU,GAAG,CAAC,OAAO,WAAW,CAAC,CAAC,MAAM,CAAC,CAAA;AAErD,MAAM,MAAM,YAAY,GAAG;IACzB,gDAAgD;IAChD,KAAK,CAAC,EAAE,UAAU,CAAA;IAClB,uEAAuE;IACvE,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,uDAAuD;IACvD,UAAU,CAAC,EAAE,MAAM,CAAA;CACpB,CAAA;AAED;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,qBAAa,OAAQ,SAAQ,UAAU;IACrC,MAAM,CAAC,UAAU;;;;;;;MAGhB;IAED,wEAAwE;IACxE,QAAQ,SAAO;IACf,yDAAyD;IACzD,KAAK,SAAc;IAEnB,gBAAgB;IAIhB,MAAM;IAIN,iBAAiB;IAOjB,OAAO;IAMP,gEAAgE;IAChE,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,GAAE,YAAiB,GAAG,WAAW;IA2C9D,0BAA0B;IAC1B,OAAO,CAAC,KAAK,EAAE,WAAW;IAS1B,+BAA+B;IAC/B,KAAK;CAKN;AAED,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,qBAAqB;QAC7B,UAAU,EAAE,OAAO,CAAA;KACpB;CACF;AAED,wBAAgB,aAAa,CAAC,OAAO,aAAe,GAAG,IAAI,CAI1D"}
@@ -0,0 +1,108 @@
1
+ import { html, LitElement } from "lit";
2
+ export const FS_TOAST_TAG = "fs-toast";
3
+ export const TOAST_CLASS = "fs-toast";
4
+ export const TOAST_CLOSE_CLASS = "fs-toast__close";
5
+ export const toastColors = ["neutral", "success", "warning", "danger"];
6
+ /**
7
+ * Køen av korte meldinger i hjørnet av skjermen.
8
+ *
9
+ * Elementet er beholderen, ikke meldingen. Du legger det inn én gang i
10
+ * appen og kaller `show()` når noe skal meldes.
11
+ *
12
+ * Beholderen er en `role="status"`-region, ikke `role="alert"`. En melding
13
+ * som dukker opp i hjørnet skal ikke avbryte det skjermleseren holder på med;
14
+ * er beskjeden så viktig at den må avbryte, hører den hjemme i en
15
+ * [Alert](../../css/alert/alert.js) i selve siden.
16
+ *
17
+ * Meldinger som forsvinner av seg selv er en tilgjengelighetsfelle: den som
18
+ * leser sakte eller bruker forstørrelse rekker ikke lese dem. Derfor er
19
+ * lukkeknappen alltid der, og tiden stopper mens musa eller fokus er i
20
+ * meldingen.
21
+ *
22
+ * ```ts
23
+ * document.querySelector("fs-toast").show("Søknaden er sendt", {
24
+ * color: "success",
25
+ * })
26
+ * ```
27
+ */
28
+ export class FsToast extends LitElement {
29
+ constructor() {
30
+ super(...arguments);
31
+ /** Standard levetid i millisekunder. `0` lar meldingene bli stående. */
32
+ this.duration = 6000;
33
+ /** Tekst som sier hva regionen er. Blir `aria-label`. */
34
+ this.label = "Meldinger";
35
+ }
36
+ createRenderRoot() {
37
+ return this;
38
+ }
39
+ render() {
40
+ return html `<slot></slot>`;
41
+ }
42
+ connectedCallback() {
43
+ super.connectedCallback();
44
+ this.setAttribute("role", "status");
45
+ this.setAttribute("aria-live", "polite");
46
+ this.setAttribute("aria-label", this.label);
47
+ }
48
+ updated() {
49
+ // `label` kan settes etter at elementet står i DOM-en, for eksempel av et
50
+ // rammeverk som fyller inn attributtene i et senere steg.
51
+ this.setAttribute("aria-label", this.label);
52
+ }
53
+ /** Viser en melding, og returnerer elementet den ble lagt i. */
54
+ show(message, options = {}) {
55
+ const { color = "neutral", duration = this.duration, closeLabel = "Lukk melding", } = options;
56
+ const toast = document.createElement("div");
57
+ toast.className = TOAST_CLASS;
58
+ if (color !== "neutral")
59
+ toast.dataset.color = color;
60
+ const text = document.createElement("span");
61
+ text.textContent = message;
62
+ toast.append(text);
63
+ const close = document.createElement("button");
64
+ close.type = "button";
65
+ close.className = TOAST_CLOSE_CLASS;
66
+ close.setAttribute("aria-label", closeLabel);
67
+ close.textContent = "×";
68
+ close.addEventListener("click", () => this.dismiss(toast));
69
+ toast.append(close);
70
+ this.prepend(toast);
71
+ if (duration > 0) {
72
+ let timer = window.setTimeout(() => this.dismiss(toast), duration);
73
+ // Tiden stopper mens brukeren leser eller er på vei til lukkeknappen.
74
+ const pause = () => window.clearTimeout(timer);
75
+ const resume = () => {
76
+ timer = window.setTimeout(() => this.dismiss(toast), duration);
77
+ };
78
+ toast.addEventListener("mouseenter", pause);
79
+ toast.addEventListener("mouseleave", resume);
80
+ toast.addEventListener("focusin", pause);
81
+ toast.addEventListener("focusout", resume);
82
+ }
83
+ return toast;
84
+ }
85
+ /** Fjerner en melding. */
86
+ dismiss(toast) {
87
+ if (!this.contains(toast))
88
+ return;
89
+ toast.remove();
90
+ this.dispatchEvent(new CustomEvent("toast-dismiss", { bubbles: true, composed: true }));
91
+ }
92
+ /** Fjerner alle meldingene. */
93
+ clear() {
94
+ for (const toast of this.querySelectorAll(`.${TOAST_CLASS}`)) {
95
+ toast.remove();
96
+ }
97
+ }
98
+ }
99
+ FsToast.properties = {
100
+ duration: { type: Number },
101
+ label: { type: String },
102
+ };
103
+ export function defineFsToast(tagName = FS_TOAST_TAG) {
104
+ if (!customElements.get(tagName)) {
105
+ customElements.define(tagName, FsToast);
106
+ }
107
+ }
108
+ //# sourceMappingURL=fs-toast.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fs-toast.js","sourceRoot":"","sources":["../../../../src/components/frittstaende/toast/fs-toast.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,70 @@
1
+ import { LitElement } from "lit";
2
+ export declare const FS_ERROR_SUMMARY_TAG: "fs-error-summary";
3
+ export declare const ERROR_SUMMARY_CLASS: "fs-error-summary";
4
+ export declare const ERROR_SUMMARY_TITLE_CLASS: "fs-error-summary__title";
5
+ /**
6
+ * Samler feilene i et skjema og sender brukeren til feltet som feilet.
7
+ *
8
+ * Du skriver lista med feil selv, som lenker til id-en på hvert felt.
9
+ * Komponenten gjør tre ting som er lette å glemme, og som avgjør om
10
+ * oppsummeringen er til nytte:
11
+ *
12
+ * 1. Flytter fokus til boksen når den kommer til syne, så den som hører siden
13
+ * får vite at innsendingen stoppet.
14
+ * 2. Gir fokus til selve kontrollen når en lenke følges. En vanlig ankerlenke
15
+ * ruller bare dit, og neste tastetrykk fortsetter der fokus sto før.
16
+ * 3. Holder boksen skjult mens lista er tom, så en tom overskrift ikke blir
17
+ * stående i skjemaet.
18
+ *
19
+ * ```html
20
+ * <fs-error-summary heading="Skjemaet har to feil">
21
+ * <ul class="fs-list">
22
+ * <li><a href="#epost">Skriv en gyldig e-postadresse</a></li>
23
+ * </ul>
24
+ * </fs-error-summary>
25
+ * ```
26
+ */
27
+ export declare class FsErrorSummary extends LitElement {
28
+ static properties: {
29
+ heading: {
30
+ type: StringConstructor;
31
+ };
32
+ autofocus: {
33
+ type: BooleanConstructor;
34
+ reflect: boolean;
35
+ };
36
+ };
37
+ /** Overskriften over lista. */
38
+ heading: string;
39
+ /** Flytt fokus hit når boksen kommer til syne. Standard: på. */
40
+ autofocus: boolean;
41
+ private hasFocused;
42
+ /** Tittelen komponenten selv har laget, til forskjell fra konsumentens. */
43
+ private ownTitle?;
44
+ createRenderRoot(): this;
45
+ render(): import("lit").TemplateResult<1>;
46
+ /**
47
+ * Ser etter at lista med feil endrer seg.
48
+ *
49
+ * Komponenten rendrer i vanlig DOM, og da melder ikke `slotchange` fra når
50
+ * konsumenten bytter ut innholdet. Feilene kommer og går mens brukeren
51
+ * fyller ut skjemaet, så endringen må observeres.
52
+ */
53
+ private observer?;
54
+ private syncing;
55
+ connectedCallback(): void;
56
+ disconnectedCallback(): void;
57
+ firstUpdated(): void;
58
+ updated(): void;
59
+ private handleSlotChange;
60
+ private get items();
61
+ private sync;
62
+ private handleLinkClick;
63
+ }
64
+ declare global {
65
+ interface HTMLElementTagNameMap {
66
+ "fs-error-summary": FsErrorSummary;
67
+ }
68
+ }
69
+ export declare function defineFsErrorSummary(tagName?: "fs-error-summary"): void;
70
+ //# sourceMappingURL=fs-error-summary.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fs-error-summary.d.ts","sourceRoot":"","sources":["../../../../src/components/ramme/error-summary/fs-error-summary.ts"],"names":[],"mappings":"AAAA,OAAO,EAAQ,UAAU,EAAE,MAAM,KAAK,CAAA;AAEtC,eAAO,MAAM,oBAAoB,EAAG,kBAA2B,CAAA;AAE/D,eAAO,MAAM,mBAAmB,EAAG,kBAA2B,CAAA;AAC9D,eAAO,MAAM,yBAAyB,EAAG,yBAAkC,CAAA;AAE3E;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,qBAAa,cAAe,SAAQ,UAAU;IAC5C,MAAM,CAAC,UAAU;;;;;;;;MAGhB;IAED,+BAA+B;IAC/B,OAAO,SAAsB;IAC7B,gEAAgE;IAChE,SAAS,UAAO;IAEhB,OAAO,CAAC,UAAU,CAAQ;IAC1B,2EAA2E;IAC3E,OAAO,CAAC,QAAQ,CAAC,CAAa;IAE9B,gBAAgB;IAIhB,MAAM;IAIN;;;;;;OAMG;IACH,OAAO,CAAC,QAAQ,CAAC,CAAkB;IACnC,OAAO,CAAC,OAAO,CAAQ;IAEvB,iBAAiB;IAQjB,oBAAoB;IAMpB,YAAY;IAIZ,OAAO;IAIP,OAAO,CAAC,gBAAgB,CAEvB;IAED,OAAO,KAAK,KAAK,GAEhB;IAED,OAAO,CAAC,IAAI;IA0DZ,OAAO,CAAC,eAAe,CAuBtB;CACF;AAYD,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,qBAAqB;QAC7B,kBAAkB,EAAE,cAAc,CAAA;KACnC;CACF;AAED,wBAAgB,oBAAoB,CAAC,OAAO,qBAAuB,GAAG,IAAI,CAIzE"}