@fristil/designsystem 0.5.1 → 0.5.3

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 (74) hide show
  1. package/CHANGELOG.md +99 -0
  2. package/dist/components/css/select/select.d.ts +18 -1
  3. package/dist/components/css/select/select.d.ts.map +1 -1
  4. package/dist/components/css/select/select.js +15 -2
  5. package/dist/components/css/select/select.js.map +1 -1
  6. package/dist/components/frittstaende/connection-status/fs-connection-status.d.ts +2 -1
  7. package/dist/components/frittstaende/connection-status/fs-connection-status.d.ts.map +1 -1
  8. package/dist/components/frittstaende/connection-status/fs-connection-status.js +3 -4
  9. package/dist/components/frittstaende/connection-status/fs-connection-status.js.map +1 -1
  10. package/dist/components/frittstaende/session-timeout/fs-session-timeout.d.ts +2 -1
  11. package/dist/components/frittstaende/session-timeout/fs-session-timeout.d.ts.map +1 -1
  12. package/dist/components/frittstaende/session-timeout/fs-session-timeout.js +3 -4
  13. package/dist/components/frittstaende/session-timeout/fs-session-timeout.js.map +1 -1
  14. package/dist/components/frittstaende/toast/fs-toast.d.ts +2 -1
  15. package/dist/components/frittstaende/toast/fs-toast.d.ts.map +1 -1
  16. package/dist/components/frittstaende/toast/fs-toast.js +3 -4
  17. package/dist/components/frittstaende/toast/fs-toast.js.map +1 -1
  18. package/dist/components/host-element.d.ts +28 -0
  19. package/dist/components/host-element.d.ts.map +1 -0
  20. package/dist/components/host-element.js +33 -0
  21. package/dist/components/host-element.js.map +1 -0
  22. package/dist/components/ramme/error-summary/fs-error-summary.d.ts +2 -1
  23. package/dist/components/ramme/error-summary/fs-error-summary.d.ts.map +1 -1
  24. package/dist/components/ramme/error-summary/fs-error-summary.js +15 -7
  25. package/dist/components/ramme/error-summary/fs-error-summary.js.map +1 -1
  26. package/dist/components/ramme/field/field-core.d.ts +15 -6
  27. package/dist/components/ramme/field/field-core.d.ts.map +1 -1
  28. package/dist/components/ramme/field/field-core.js +15 -6
  29. package/dist/components/ramme/field/field-core.js.map +1 -1
  30. package/dist/components/ramme/field/fs-field.d.ts +2 -1
  31. package/dist/components/ramme/field/fs-field.d.ts.map +1 -1
  32. package/dist/components/ramme/field/fs-field.js +3 -4
  33. package/dist/components/ramme/field/fs-field.js.map +1 -1
  34. package/dist/components/ramme/popover/fs-popover.d.ts +2 -1
  35. package/dist/components/ramme/popover/fs-popover.d.ts.map +1 -1
  36. package/dist/components/ramme/popover/fs-popover.js +3 -4
  37. package/dist/components/ramme/popover/fs-popover.js.map +1 -1
  38. package/dist/components/ramme/suggestion/fs-suggestion.d.ts +13 -2
  39. package/dist/components/ramme/suggestion/fs-suggestion.d.ts.map +1 -1
  40. package/dist/components/ramme/suggestion/fs-suggestion.js +27 -8
  41. package/dist/components/ramme/suggestion/fs-suggestion.js.map +1 -1
  42. package/dist/components/ramme/suggestion/suggestion.d.ts +10 -0
  43. package/dist/components/ramme/suggestion/suggestion.d.ts.map +1 -1
  44. package/dist/components/ramme/suggestion/suggestion.js +13 -1
  45. package/dist/components/ramme/suggestion/suggestion.js.map +1 -1
  46. package/dist/components/ramme/tabs/fs-tabs.d.ts +2 -1
  47. package/dist/components/ramme/tabs/fs-tabs.d.ts.map +1 -1
  48. package/dist/components/ramme/tabs/fs-tabs.js +3 -4
  49. package/dist/components/ramme/tabs/fs-tabs.js.map +1 -1
  50. package/dist/dom.d.ts.map +1 -1
  51. package/dist/dom.js +2 -0
  52. package/dist/dom.js.map +1 -1
  53. package/dist/fs.d.ts +5 -1
  54. package/dist/fs.d.ts.map +1 -1
  55. package/dist/index.d.ts +2 -2
  56. package/dist/index.d.ts.map +1 -1
  57. package/dist/index.js +1 -1
  58. package/dist/index.js.map +1 -1
  59. package/dist/react.d.ts +5 -1
  60. package/dist/react.d.ts.map +1 -1
  61. package/package.json +7 -2
  62. package/src/components/css/select/select.css +193 -5
  63. package/src/components/css/select/select.ts +24 -1
  64. package/src/components/frittstaende/connection-status/fs-connection-status.ts +3 -4
  65. package/src/components/frittstaende/session-timeout/fs-session-timeout.ts +3 -4
  66. package/src/components/frittstaende/toast/fs-toast.ts +3 -4
  67. package/src/components/host-element.ts +34 -0
  68. package/src/components/ramme/error-summary/fs-error-summary.ts +16 -7
  69. package/src/components/ramme/field/field-core.ts +15 -6
  70. package/src/components/ramme/field/fs-field.ts +3 -4
  71. package/src/components/ramme/popover/fs-popover.ts +3 -4
  72. package/src/components/ramme/suggestion/fs-suggestion.ts +30 -8
  73. package/src/components/ramme/suggestion/suggestion.ts +13 -1
  74. package/src/components/ramme/tabs/fs-tabs.ts +3 -4
@@ -1,3 +1,4 @@
1
+ import { defineElement, HostElement } from "../../host-element.js"
1
2
  import {
2
3
  SUGGESTION_EMPTY_CLASS,
3
4
  SUGGESTION_OPTION_CLASS,
@@ -35,10 +36,9 @@ export const FS_SUGGESTION_TAG = "fs-suggestion" as const
35
36
  * </fs-suggestion>
36
37
  * ```
37
38
  */
38
- export class FsSuggestion extends HTMLElement {
39
+ export class FsSuggestion extends HostElement {
39
40
  static observedAttributes = ["server-filtered"]
40
41
 
41
- private activeIndex = -1
42
42
  private observer?: MutationObserver
43
43
  private control?: HTMLInputElement
44
44
  /** Alternativene som alt har fått lytteren sin. */
@@ -75,6 +75,22 @@ export class FsSuggestion extends HTMLElement {
75
75
  ]
76
76
  }
77
77
 
78
+ /**
79
+ * Hvilket synlig alternativ som er markert nå.
80
+ *
81
+ * Den leses fra `aria-selected` i markupen, ikke fra en teller inni
82
+ * komponenten. Serveren kan sette markeringen selv med
83
+ * `fs.suggestion({ activeIndex })`, og en parallell teller ville hoppet
84
+ * til toppen av lista ved første piltast i stedet for til alternativet
85
+ * etter. Filtreringen flytter også på alternativene, og da svarer
86
+ * oppslaget riktig av seg selv.
87
+ */
88
+ private get activeIndex(): number {
89
+ return this.visible.findIndex(
90
+ (option) => option.getAttribute("aria-selected") === "true",
91
+ )
92
+ }
93
+
78
94
  /** Alternativene som er synlige nå. */
79
95
  private get visible(): HTMLElement[] {
80
96
  return this.options.filter((option) => !option.hidden)
@@ -120,7 +136,6 @@ export class FsSuggestion extends HTMLElement {
120
136
  this.control.setAttribute("aria-expanded", String(open))
121
137
 
122
138
  if (!open) {
123
- this.activeIndex = -1
124
139
  this.control.removeAttribute("aria-activedescendant")
125
140
  for (const option of this.options) {
126
141
  option.setAttribute("aria-selected", "false")
@@ -166,7 +181,6 @@ export class FsSuggestion extends HTMLElement {
166
181
  if (synlige.length === 0 || !this.control) return
167
182
 
168
183
  const neste = (index + synlige.length) % synlige.length
169
- this.activeIndex = neste
170
184
 
171
185
  for (const option of this.options) {
172
186
  option.setAttribute("aria-selected", "false")
@@ -228,7 +242,17 @@ export class FsSuggestion extends HTMLElement {
228
242
  this.markActive(this.activeIndex + 1)
229
243
  } else if (event.key === "ArrowUp") {
230
244
  event.preventDefault()
231
- this.markActive(this.activeIndex - 1)
245
+ // Lista må åpnes først, som med pil ned. Uten det pekte
246
+ // `aria-activedescendant` på et alternativ i en liste feltet samtidig
247
+ // meldte som lukket, og skjermleseren leste opp noe som ikke sto på
248
+ // skjermen.
249
+ if (!åpen) {
250
+ this.filter()
251
+ this.setOpen(true)
252
+ }
253
+ // Er ingenting markert, går pil opp til det siste. `activeIndex - 1`
254
+ // ville gitt det nest siste, siden ingenting markert er -1.
255
+ this.markActive(this.activeIndex < 0 ? -1 : this.activeIndex - 1)
232
256
  } else if (event.key === "Enter" && åpen && this.activeIndex >= 0) {
233
257
  event.preventDefault()
234
258
  const valgt = this.visible[this.activeIndex]
@@ -259,7 +283,5 @@ declare global {
259
283
  }
260
284
 
261
285
  export function defineFsSuggestion(tagName = FS_SUGGESTION_TAG): void {
262
- if (!customElements.get(tagName)) {
263
- customElements.define(tagName, FsSuggestion)
264
- }
286
+ defineElement(tagName, FsSuggestion)
265
287
  }
@@ -82,7 +82,19 @@ export const suggestion = ({
82
82
  "data-preserve-attr": "aria-selected hidden" as const,
83
83
  }),
84
84
  ),
85
- empty: { class: SUGGESTION_EMPTY_CLASS },
85
+ /**
86
+ * Teksten som vises når ingenting passer.
87
+ *
88
+ * Den er skjult så lenge serveren sender noe å velge mellom, og
89
+ * komponenten skjuler og viser den igjen mens brukeren skriver.
90
+ * `data-preserve-attr` må derfor ha `hidden` med: uten den dukket
91
+ * «Ingen treff» opp igjen ved hver patch, også når noe passet.
92
+ */
93
+ empty: attributes({
94
+ class: SUGGESTION_EMPTY_CLASS,
95
+ hidden: count > 0 ? (true as const) : undefined,
96
+ "data-preserve-attr": "hidden" as const,
97
+ }),
86
98
  /**
87
99
  * Området som melder antall treff til skjermlesere.
88
100
  *
@@ -1,3 +1,4 @@
1
+ import { defineElement, HostElement } from "../../host-element.js"
1
2
  export const FS_TABS_TAG = "fs-tabs" as const
2
3
 
3
4
  /**
@@ -27,7 +28,7 @@ export const FS_TABS_TAG = "fs-tabs" as const
27
28
  * </fs-tabs>
28
29
  * ```
29
30
  */
30
- export class FsTabs extends HTMLElement {
31
+ export class FsTabs extends HostElement {
31
32
  /**
32
33
  * Ingen attributter. Hvilken fane som er valgt står i markupen serveren
33
34
  * sendte, som `aria-selected` på fanen og `hidden` på panelene, og leses
@@ -145,7 +146,5 @@ declare global {
145
146
  }
146
147
 
147
148
  export function defineFsTabs(tagName = FS_TABS_TAG): void {
148
- if (!customElements.get(tagName)) {
149
- customElements.define(tagName, FsTabs)
150
- }
149
+ defineElement(tagName, FsTabs)
151
150
  }