@oslokommune/punkt-elements 16.17.2 → 16.18.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 (126) hide show
  1. package/CHANGELOG.md +34 -0
  2. package/dist/{alert-ePJuDtmm.js → alert-D_eXGOez.js} +2 -2
  3. package/dist/{alert-BEEnTiCb.cjs → alert-NyLr62jZ.cjs} +1 -1
  4. package/dist/{backlink-Ba03LlbB.cjs → backlink-BsQ0Rmxj.cjs} +1 -1
  5. package/dist/{backlink-CiwXrQYD.js → backlink-CTu44BHn.js} +1 -1
  6. package/dist/{breadcrumbs-CD1zib3s.cjs → breadcrumbs-BNZ1L-0q.cjs} +1 -1
  7. package/dist/{breadcrumbs-CpuVqWhF.js → breadcrumbs-DPnoURvl.js} +1 -1
  8. package/dist/{button-D-TOBaJB.cjs → button-DsGvcLIn.cjs} +1 -1
  9. package/dist/{button-BIpd1xJh.js → button-ZYlrRRfu.js} +1 -1
  10. package/dist/{calendar-DkjXla0I.cjs → calendar-CDDVoUby.cjs} +1 -1
  11. package/dist/{calendar-Ch1dgnBo.js → calendar-VOqO5um6.js} +1 -1
  12. package/dist/{card-CEDbo1t7.js → card-B4oDGIRP.js} +2 -2
  13. package/dist/{card-C3POnP3O.cjs → card-DZuZy0ay.cjs} +1 -1
  14. package/dist/{combobox-DjvRMKOD.js → combobox-BDYoPZmg.js} +3 -3
  15. package/dist/{combobox-DYttdLJ4.cjs → combobox-Ct9gCFa1.cjs} +1 -1
  16. package/dist/components/icon/icon.d.ts +6 -1
  17. package/dist/components/icon/icon.test.d.ts +2 -0
  18. package/dist/components/modal/modal.d.ts +1 -0
  19. package/dist/{consent-DSHrt9eS.js → consent-1IUuWZAh.js} +2 -2
  20. package/dist/{consent-B5dIDyLD.cjs → consent-BME_rQ2w.cjs} +1 -1
  21. package/dist/{datepicker-M_jcY3wp.js → datepicker-BGpoabCM.js} +4 -4
  22. package/dist/{datepicker-D3QQbd_H.cjs → datepicker-ByqXCpCd.cjs} +1 -1
  23. package/dist/docs/components/modal.d.ts +8 -0
  24. package/dist/{fileupload-F9UMO7eS.js → fileupload-B6W7qOQT.js} +5 -5
  25. package/dist/{fileupload-BD_0oMrW.cjs → fileupload-a2OL3dzG.cjs} +1 -1
  26. package/dist/{header-DZranHLm.cjs → header-BZFSan0_.cjs} +5 -5
  27. package/dist/{header-j0SSHF4C.js → header-BgVpJMHQ.js} +8 -8
  28. package/dist/{header-menu-CPI1_5oZ.cjs → header-menu-BLngov1D.cjs} +1 -1
  29. package/dist/{header-menu-zhGYdnvz.js → header-menu-BXzVVOHq.js} +1 -1
  30. package/dist/{helptext-BdqoW19r.js → helptext-BeU-enix.js} +1 -1
  31. package/dist/{helptext-KWXjKljV.cjs → helptext-DWMFqMnV.cjs} +1 -1
  32. package/dist/{icon-Co72KtgF.js → icon-CZQkrK6B.js} +24 -3
  33. package/dist/icon-PbaC9uUg.cjs +1 -0
  34. package/dist/{input-wrapper-DOIWggEv.cjs → input-wrapper-Y98KV-sy.cjs} +1 -1
  35. package/dist/{input-wrapper-DVU68NcJ.js → input-wrapper-oYcbCFow.js} +3 -3
  36. package/dist/{link-DMKjKawh.cjs → link-BMMIjg50.cjs} +1 -1
  37. package/dist/{link-F51Ho7CV.js → link-CT0LB3S7.js} +1 -1
  38. package/dist/{linkcard-E07qJZMP.js → linkcard-Bz5zb69P.js} +1 -1
  39. package/dist/{linkcard-CBmJbSoV.cjs → linkcard-CupEMkvj.cjs} +1 -1
  40. package/dist/{loader-q_eO6zaE.cjs → loader-8T6M0FCQ.cjs} +1 -1
  41. package/dist/{loader-teN65oWo.js → loader-Cbrc4FFx.js} +1 -1
  42. package/dist/{messagebox-D1QeQqb8.cjs → messagebox-C6LHT78_.cjs} +1 -1
  43. package/dist/{messagebox-Ct9lfe0Z.js → messagebox-TKKUVTo4.js} +1 -1
  44. package/dist/{modal-Ca7dETTw.js → modal-BVHH8koz.js} +21 -11
  45. package/dist/modal-CRzbtqL3.cjs +35 -0
  46. package/dist/pkt-alert.cjs +1 -1
  47. package/dist/pkt-alert.js +1 -1
  48. package/dist/pkt-backlink.cjs +1 -1
  49. package/dist/pkt-backlink.js +1 -1
  50. package/dist/pkt-breadcrumbs.cjs +1 -1
  51. package/dist/pkt-breadcrumbs.js +1 -1
  52. package/dist/pkt-button.cjs +1 -1
  53. package/dist/pkt-button.js +1 -1
  54. package/dist/pkt-calendar.cjs +1 -1
  55. package/dist/pkt-calendar.js +1 -1
  56. package/dist/pkt-card.cjs +1 -1
  57. package/dist/pkt-card.js +1 -1
  58. package/dist/pkt-combobox.cjs +1 -1
  59. package/dist/pkt-combobox.js +1 -1
  60. package/dist/pkt-consent.cjs +1 -1
  61. package/dist/pkt-consent.js +1 -1
  62. package/dist/pkt-datepicker.cjs +1 -1
  63. package/dist/pkt-datepicker.js +1 -1
  64. package/dist/pkt-fileupload.cjs +1 -1
  65. package/dist/pkt-fileupload.js +1 -1
  66. package/dist/pkt-header-menu.cjs +1 -1
  67. package/dist/pkt-header-menu.js +1 -1
  68. package/dist/pkt-header.cjs +1 -1
  69. package/dist/pkt-header.js +1 -1
  70. package/dist/pkt-helptext.cjs +1 -1
  71. package/dist/pkt-helptext.js +1 -1
  72. package/dist/pkt-icon.cjs +1 -1
  73. package/dist/pkt-icon.js +1 -1
  74. package/dist/pkt-index.cjs +1 -1
  75. package/dist/pkt-index.js +27 -27
  76. package/dist/pkt-input-wrapper.cjs +1 -1
  77. package/dist/pkt-input-wrapper.js +1 -1
  78. package/dist/pkt-link.cjs +1 -1
  79. package/dist/pkt-link.js +1 -1
  80. package/dist/pkt-linkcard.cjs +1 -1
  81. package/dist/pkt-linkcard.js +1 -1
  82. package/dist/pkt-loader.cjs +1 -1
  83. package/dist/pkt-loader.js +1 -1
  84. package/dist/pkt-messagebox.cjs +1 -1
  85. package/dist/pkt-messagebox.js +1 -1
  86. package/dist/pkt-modal.cjs +1 -1
  87. package/dist/pkt-modal.js +1 -1
  88. package/dist/pkt-progressbar.cjs +1 -1
  89. package/dist/pkt-progressbar.js +1 -1
  90. package/dist/pkt-searchinput.cjs +1 -1
  91. package/dist/pkt-searchinput.js +1 -1
  92. package/dist/pkt-select.cjs +1 -1
  93. package/dist/pkt-select.js +1 -1
  94. package/dist/pkt-tag.cjs +1 -1
  95. package/dist/pkt-tag.js +1 -1
  96. package/dist/pkt-textarea.cjs +1 -1
  97. package/dist/pkt-textarea.js +1 -1
  98. package/dist/pkt-textinput.cjs +1 -1
  99. package/dist/pkt-textinput.js +1 -1
  100. package/dist/pkt-timepicker.cjs +1 -1
  101. package/dist/pkt-timepicker.js +1 -1
  102. package/dist/{progressbar-o-M17HPA.js → progressbar-C-5oESiB.js} +1 -1
  103. package/dist/{progressbar-Ca7pRjmt.cjs → progressbar-C0g830Tk.cjs} +1 -1
  104. package/dist/{searchinput-CIseS5tL.js → searchinput-C9FP89qD.js} +1 -1
  105. package/dist/{searchinput-BVIaoetB.cjs → searchinput-DUgZb_zm.cjs} +1 -1
  106. package/dist/{select-DO0xGhQQ.cjs → select-DAs8kzN4.cjs} +1 -1
  107. package/dist/{select-6XCVj1lP.js → select-DkKIW7zD.js} +1 -1
  108. package/dist/shared-types/index.d.ts +1 -1
  109. package/dist/shared-types/skin.d.ts +4 -0
  110. package/dist/shared-utils/modal-scroll-lock.d.ts +10 -0
  111. package/dist/{tag-hl59gziI.js → tag-DSZ-czu-.js} +1 -1
  112. package/dist/{tag-DWtajZk6.cjs → tag-vgKH9B4k.cjs} +1 -1
  113. package/dist/{textarea-DBSNSvrX.js → textarea-BfjI6d7Q.js} +2 -2
  114. package/dist/{textarea-CV6z3LDf.cjs → textarea-C7YiheLo.cjs} +1 -1
  115. package/dist/{textinput-Dsc-8-BB.cjs → textinput-BM66vo5e.cjs} +1 -1
  116. package/dist/{textinput-BZZnFDk3.js → textinput-DhoupEyI.js} +2 -2
  117. package/dist/{timepicker-C2Ua6vHY.cjs → timepicker-C4oRmmRd.cjs} +1 -1
  118. package/dist/{timepicker-DDQ7CfOy.js → timepicker-CtRGbypF.js} +2 -2
  119. package/package.json +2 -2
  120. package/src/components/header/header-service.ts +4 -4
  121. package/src/components/header/types.ts +2 -2
  122. package/src/components/icon/icon.test.ts +101 -0
  123. package/src/components/icon/icon.ts +40 -1
  124. package/src/components/modal/modal.ts +12 -2
  125. package/dist/icon-Dr8sfT2X.cjs +0 -1
  126. package/dist/modal-C_LxgxzC.cjs +0 -35
@@ -455,7 +455,7 @@ export class PktHeaderService extends PktElementWithSlot<IPktHeader> implements
455
455
  // If serviceLink is a non-empty string, render as link (but still dispatch event on click)
456
456
  if (this.serviceLink && typeof this.serviceLink === 'string') {
457
457
  return html`
458
- <span class="pkt-header-service__service-name">
458
+ <span class="pkt-header-service__service-name" translate="no">
459
459
  <pkt-link
460
460
  href=${this.serviceLink}
461
461
  class="pkt-header-service__service-link"
@@ -470,7 +470,7 @@ export class PktHeaderService extends PktElementWithSlot<IPktHeader> implements
470
470
  // If service-link attribute is present but empty, render as clickable button
471
471
  if (this.hasAttribute('service-link')) {
472
472
  return html`
473
- <span class="pkt-header-service__service-name">
473
+ <span class="pkt-header-service__service-name" translate="no">
474
474
  <button
475
475
  class="pkt-link-button pkt-link pkt-header-service__service-link"
476
476
  @click=${this.handleServiceClick}
@@ -483,7 +483,7 @@ export class PktHeaderService extends PktElementWithSlot<IPktHeader> implements
483
483
 
484
484
  // No link - just render the text
485
485
  return html`
486
- <span class="pkt-header-service__service-name" @click=${this.handleServiceClick}>
486
+ <span class="pkt-header-service__service-name" translate="no" @click=${this.handleServiceClick}>
487
487
  <span class="pkt-header-service__service-link">${this.serviceName}</span>
488
488
  </span>
489
489
  `
@@ -642,7 +642,7 @@ export class PktHeaderService extends PktElementWithSlot<IPktHeader> implements
642
642
  @click=${() => this.handleMenuToggle('user')}
643
643
  >
644
644
  <span class="pkt-sr-only">Brukermeny: </span>
645
- <span>${this.representing?.name || this.user.name}</span>
645
+ <span translate="no">${this.representing?.name || this.user.name}</span>
646
646
  </pkt-button>
647
647
  ${this.openMenu === 'user' && this.user
648
648
  ? html`
@@ -1,5 +1,6 @@
1
1
  import { PktIconName } from '@oslokommune/punkt-assets/dist/icons/icon'
2
- import { booleanishConverter } from 'shared-types'
2
+ import { booleanishConverter, convertUserMenuItem as sharedConvertUserMenuItem } from 'shared-types'
3
+ /* eslint-disable no-duplicate-imports */
3
4
  import type {
4
5
  Booleanish,
5
6
  User as SharedUser,
@@ -12,7 +13,6 @@ import type {
12
13
  THeaderPosition,
13
14
  THeaderScrollBehavior,
14
15
  } from 'shared-types'
15
- import { convertUserMenuItem as sharedConvertUserMenuItem } from 'shared-types'
16
16
 
17
17
  export type {
18
18
  Booleanish,
@@ -16,6 +16,8 @@ expect.extend(toHaveNoViolations)
16
16
  export interface IconTestConfig extends BaseTestConfig {
17
17
  name?: string
18
18
  path?: string
19
+ 'aria-hidden'?: string
20
+ 'aria-label'?: string
19
21
  }
20
22
 
21
23
  // Use shared framework
@@ -326,6 +328,105 @@ describe('PktIcon', () => {
326
328
  const results = await axe(container)
327
329
  expect(results).toHaveNoViolations()
328
330
  })
331
+
332
+ describe('aria-hidden', () => {
333
+ test('defaults to true on the SVG', async () => {
334
+ const { icon } = await createIconTest({ name: 'arrow-right' })
335
+ await icon.updateComplete
336
+ await new Promise((resolve) => setTimeout(resolve, 0))
337
+ await icon.updateComplete
338
+
339
+ const svg = icon.querySelector('svg')
340
+ expect(svg?.getAttribute('aria-hidden')).toBe('true')
341
+ expect(svg?.getAttribute('aria-label')).toBeNull()
342
+ })
343
+
344
+ test('aria-hidden="false" attribute renders aria-hidden="false" on the SVG with name fallback as aria-label', async () => {
345
+ const { icon } = await createIconTest({
346
+ name: 'arrow-right',
347
+ 'aria-hidden': 'false',
348
+ })
349
+ await icon.updateComplete
350
+ await new Promise((resolve) => setTimeout(resolve, 0))
351
+ await icon.updateComplete
352
+
353
+ const svg = icon.querySelector('svg')
354
+ expect(svg?.getAttribute('aria-hidden')).toBe('false')
355
+ expect(svg?.getAttribute('aria-label')).toBe('arrow-right')
356
+ })
357
+
358
+ test('aria-hidden="true" attribute renders aria-hidden="true" on the SVG', async () => {
359
+ const { icon } = await createIconTest({
360
+ name: 'arrow-right',
361
+ 'aria-hidden': 'true',
362
+ })
363
+ await icon.updateComplete
364
+ await new Promise((resolve) => setTimeout(resolve, 0))
365
+ await icon.updateComplete
366
+
367
+ const svg = icon.querySelector('svg')
368
+ expect(svg?.getAttribute('aria-hidden')).toBe('true')
369
+ expect(svg?.getAttribute('aria-label')).toBeNull()
370
+ })
371
+
372
+ test('updates the SVG when the ariaHidden property changes', async () => {
373
+ const { icon } = await createIconTest({ name: 'arrow-right' })
374
+ await icon.updateComplete
375
+ await new Promise((resolve) => setTimeout(resolve, 0))
376
+ await icon.updateComplete
377
+
378
+ icon.ariaHidden = 'false'
379
+ await icon.updateComplete
380
+
381
+ const svg = icon.querySelector('svg')
382
+ expect(svg?.getAttribute('aria-hidden')).toBe('false')
383
+ })
384
+ })
385
+
386
+ describe('aria-label', () => {
387
+ test('aria-label alone makes aria-hidden default to false on the SVG', async () => {
388
+ const { icon } = await createIconTest({
389
+ name: 'arrow-right',
390
+ 'aria-label': 'Gå til forsiden',
391
+ })
392
+ await icon.updateComplete
393
+ await new Promise((resolve) => setTimeout(resolve, 0))
394
+ await icon.updateComplete
395
+
396
+ const svg = icon.querySelector('svg')
397
+ expect(svg?.getAttribute('aria-hidden')).toBe('false')
398
+ expect(svg?.getAttribute('aria-label')).toBe('Gå til forsiden')
399
+ })
400
+
401
+ test('aria-label plus explicit aria-hidden="true" keeps the icon hidden and omits the label', async () => {
402
+ const { icon } = await createIconTest({
403
+ name: 'arrow-right',
404
+ 'aria-label': 'Lukk',
405
+ 'aria-hidden': 'true',
406
+ })
407
+ await icon.updateComplete
408
+ await new Promise((resolve) => setTimeout(resolve, 0))
409
+ await icon.updateComplete
410
+
411
+ const svg = icon.querySelector('svg')
412
+ expect(svg?.getAttribute('aria-hidden')).toBe('true')
413
+ expect(svg?.getAttribute('aria-label')).toBeNull()
414
+ })
415
+
416
+ test('setting ariaLabel via JS flips aria-hidden to false on the SVG', async () => {
417
+ const { icon } = await createIconTest({ name: 'arrow-right' })
418
+ await icon.updateComplete
419
+ await new Promise((resolve) => setTimeout(resolve, 0))
420
+ await icon.updateComplete
421
+
422
+ icon.ariaLabel = 'Lukk'
423
+ await icon.updateComplete
424
+
425
+ const svg = icon.querySelector('svg')
426
+ expect(svg?.getAttribute('aria-hidden')).toBe('false')
427
+ expect(svg?.getAttribute('aria-label')).toBe('Lukk')
428
+ })
429
+ })
329
430
  })
330
431
 
331
432
  describe('Integration scenarios', () => {
@@ -73,7 +73,7 @@ const downloadIconOrGetFromCache = async (
73
73
  return errorSvg
74
74
  }
75
75
 
76
- type Props = ElementProps<PktIcon, 'path' | 'name'>
76
+ type Props = ElementProps<PktIcon, 'path' | 'name' | 'ariaHidden' | 'ariaLabel'>
77
77
 
78
78
  export class PktIcon extends PktElement<Props> {
79
79
  @property({ type: String, reflect: false })
@@ -82,12 +82,38 @@ export class PktIcon extends PktElement<Props> {
82
82
  @property({ type: String, reflect: true })
83
83
  name: PktIconName = ''
84
84
 
85
+ @property({
86
+ type: String,
87
+ attribute: 'aria-hidden',
88
+ reflect: true,
89
+ })
90
+ override ariaHidden: string | null = null
91
+
92
+ @property({
93
+ type: String,
94
+ attribute: 'aria-label',
95
+ reflect: true,
96
+ })
97
+ override ariaLabel: string | null = null
98
+
85
99
  @property({ type: SVGElement })
86
100
  private icon: ReturnType<typeof unsafeSVG> = unsafeSVG(errorSvg)
87
101
 
88
102
  @property({ type: Array, noAccessor: true })
89
103
  private _updatedProps: string[] = []
90
104
 
105
+ private get effectiveAriaHidden(): boolean {
106
+ if (this.ariaHidden !== null && this.ariaHidden !== undefined) {
107
+ return this.ariaHidden === '' || this.ariaHidden === 'true'
108
+ }
109
+ return !this.ariaLabel
110
+ }
111
+
112
+ private get effectiveAriaLabel(): string | null {
113
+ if (this.effectiveAriaHidden) return null
114
+ return this.ariaLabel || this.name || null
115
+ }
116
+
91
117
  connectedCallback(): void {
92
118
  super.connectedCallback()
93
119
  this.classList.add('pkt-icon')
@@ -102,6 +128,19 @@ export class PktIcon extends PktElement<Props> {
102
128
  if (_changedProperties.has('name') || _changedProperties.has('path')) {
103
129
  this.getIcon(this.name)
104
130
  }
131
+ this.applyAriaToSvg()
132
+ }
133
+
134
+ private applyAriaToSvg() {
135
+ const svg = this.querySelector('svg')
136
+ if (!svg) return
137
+ svg.setAttribute('aria-hidden', String(this.effectiveAriaHidden))
138
+ const label = this.effectiveAriaLabel
139
+ if (label) {
140
+ svg.setAttribute('aria-label', label)
141
+ } else {
142
+ svg.removeAttribute('aria-label')
143
+ }
105
144
  }
106
145
 
107
146
  protected async getIcon(name: PktIconName = '') {
@@ -6,6 +6,12 @@ import { slotContent } from '@/directives/slot-content'
6
6
  import { ref } from 'lit/directives/ref.js'
7
7
  import { Ref, createRef } from 'lit/directives/ref.js'
8
8
  import { TPktSize } from '@/types/size'
9
+ import {
10
+ acquireModalScrollLock,
11
+ createModalScrollLockToken,
12
+ releaseModalScrollLock,
13
+ type ModalScrollLockToken,
14
+ } from 'shared-utils/modal-scroll-lock'
9
15
  import specs from 'componentSpecs/modal.json'
10
16
  import '@/components/icon'
11
17
 
@@ -40,6 +46,8 @@ export class PktModal extends PktElementWithSlot implements IPktModal {
40
46
 
41
47
  dialogRef: Ref<HTMLDialogElement> = createRef()
42
48
 
49
+ private _scrollLockToken: ModalScrollLockToken = createModalScrollLockToken()
50
+
43
51
  @state() _isOpen: boolean = false
44
52
 
45
53
  constructor() {
@@ -57,6 +65,8 @@ export class PktModal extends PktElementWithSlot implements IPktModal {
57
65
  super.disconnectedCallback()
58
66
  document.removeEventListener('keydown', this.handleKeyDown)
59
67
  document.removeEventListener('click', this.handleBackdropClick)
68
+ // Rydd opp scroll-lock hvis elementet fjernes fra DOM mens det er åpent
69
+ releaseModalScrollLock(this._scrollLockToken)
60
70
  }
61
71
 
62
72
  protected updated(changedProperties: PropertyValues): void {
@@ -112,7 +122,7 @@ export class PktModal extends PktElementWithSlot implements IPktModal {
112
122
  this._isOpen = false
113
123
  this.open = false
114
124
 
115
- document.body.classList.remove('pkt-modal--open')
125
+ releaseModalScrollLock(this._scrollLockToken)
116
126
 
117
127
  // Scroll to the opener element if it's not in the viewport
118
128
  const openerElement = document.activeElement as HTMLElement
@@ -133,7 +143,7 @@ export class PktModal extends PktElementWithSlot implements IPktModal {
133
143
  this.open = true
134
144
  this.dialogRef.value?.showModal()
135
145
 
136
- document.body.classList.add('pkt-modal--open')
146
+ acquireModalScrollLock(this._scrollLockToken)
137
147
  this.dispatchEvent(
138
148
  new CustomEvent('showModal', { detail: { origin: event }, bubbles: true, composed: true }),
139
149
  )
@@ -1 +0,0 @@
1
- const e=require(`./element-DjtxO-1r.cjs`),t=require(`./directive-CJ2giQBZ.cjs`);var n=class extends t.n{constructor(n){if(super(n),this.it=e.l,n.type!==t.r.CHILD)throw Error(this.constructor.directiveName+`() can only be used in child bindings`)}render(t){if(t===e.l||t==null)return this._t=void 0,this.it=t;if(t===e.u)return t;if(typeof t!=`string`)throw Error(this.constructor.directiveName+`() called with a non-string value`);if(t===this.it)return this._t;this.it=t;let n=[t];return n.raw=n,this._t={_$litType$:this.constructor.resultType,strings:n,values:[]}}};n.directiveName=`unsafeHTML`,n.resultType=1;var r=t.t(n),i=class extends n{};i.directiveName=`unsafeSVG`,i.resultType=2;var a=t.t(i),o=`https://punkt-cdn.oslo.kommune.no/latest/icons/`;typeof window<`u`&&(window.pktFetch=window.pktFetch===void 0?fetch:window.pktFetch,window.pktIconPath=window.pktIconPath||o);var s=`<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32"></svg>`,c={},l=2,u=1500,d=typeof Storage<`u`&&typeof sessionStorage<`u`,f=e=>window.pktFetch(e).then(t=>{if(!t.ok)throw Error(`Missing icon: `+e);return t.text()}),p=async(e,t=l)=>{try{return await f(e)}catch{return t>0?(await new Promise(e=>setTimeout(e,u)),p(e,t-1)):(console.error(`Failed to fetch icon: `+e),s)}},m=async(e,t)=>{let n=t+e+`.svg`;return d&&sessionStorage.getItem(n)?sessionStorage.getItem(n):n in c?c[n]:typeof window<`u`&&typeof window.pktFetch==`function`?(c[n]=p(n).then(e=>(e!==s&&d&&sessionStorage.setItem(n,e),delete c[n],e)),c[n]):s},h=class extends e.t{constructor(...e){super(...e),this.path=typeof window<`u`?window.pktIconPath:o,this.name=``,this.icon=a(s),this._updatedProps=[]}connectedCallback(){super.connectedCallback(),this.classList.add(`pkt-icon`)}async attributeChangedCallback(e,t,n){super.attributeChangedCallback(e,t,n),(e===`name`||e===`path`)&&this.getIcon(this.name)}async updated(e){super.updated(e),(e.has(`name`)||e.has(`path`))&&this.getIcon(this.name)}async getIcon(e=``){if(this._updatedProps.length>0){this.path||=typeof window<`u`?window.pktIconPath:o;try{this.icon=a(await m(this.name||``,this.path))}catch{this.icon=a(s)}this._updatedProps=[]}else this._updatedProps.includes(e)||this._updatedProps.push(e)}render(){return e.d`${this.name&&this.icon}`}};e.r([e.s({type:String,reflect:!1})],h.prototype,`path`,void 0),e.r([e.s({type:String,reflect:!0})],h.prototype,`name`,void 0),e.r([e.s({type:SVGElement})],h.prototype,`icon`,void 0),e.r([e.s({type:Array,noAccessor:!0})],h.prototype,`_updatedProps`,void 0);try{e.c(`pkt-icon`)(h)}catch{console.warn(`Forsøker å definere <pkt-icon>, men den er allerede definert`)}var g=h;Object.defineProperty(exports,`n`,{enumerable:!0,get:function(){return h}}),Object.defineProperty(exports,`r`,{enumerable:!0,get:function(){return r}}),Object.defineProperty(exports,`t`,{enumerable:!0,get:function(){return g}});
@@ -1,35 +0,0 @@
1
- const e=require(`./element-DjtxO-1r.cjs`),t=require(`./class-map-CJ-msbHs.cjs`),n=require(`./element-with-slot-CWoTGA1B.cjs`);require(`./icon-Dr8sfT2X.cjs`);const r=require(`./ref-BaJ0mBT_.cjs`);var i={name:`pkt-modal`,react:`PktModal`,"css-class":`pkt-modal`,isElement:!0,isPureReact:!0,events:{"background-click":{description:`Event som trigges når bakgrunnen trykkes på`},close:{description:`Event som trigges når meldingsboksen lukkes`}},props:{open:{name:`Åpen`,description:`Deklarativ styring av modalens åpen/lukket-tilstand. Kan brukes i stedet for showModal()/close()-metodene.`,type:`boolean`,category:`tech`,default:!1},headingText:{name:`Heading text`,description:`Heading tekst på modalen`,type:`string`,category:`contents`},hideCloseButton:{name:`Gjem 'Lukk'-knapp`,description:`Gjemmer lukkeknappen. Dersom denne er satt til true, vil ikke lukkeknappen vises, og dermed er det viktig at man tilbyr en annen måte som f.eks. en knapp for å lukke modalen på.`,type:`boolean`,category:`ui`,default:!1},closeOnBackdropClick:{name:`Lukk modalen når bakgrunnen trykkes på`,description:`Lukk modalen når bakgrunnen trykkes på`,type:`boolean`,category:`tech`,default:!1},closeButtonSkin:{name:`Stil på lukkeknappen`,description:`Stil på lukkeknappen`,type:[`blue`,`yellow-filled`],category:`ui`,default:`blue`},size:{name:`Størrelse`,description:`Størrelsen på modalen`,type:[`small`,`medium`,`large`,`fit-content`],category:`ui`,default:`medium`},variant:{name:`Variant`,description:`Standard dialog eller skuff`,type:[`dialog`,`drawer`],category:`ui`,default:`dialog`},drawerPosition:{name:`Skuffposisjon`,description:`Posisjonen til skuffen`,type:[`left`,`right`],category:`ui`,default:`right`},transparentBackdrop:{name:`Gjennomsiktig bakgrunn`,description:`Bakgrunnen er gjennomsiktig`,type:`boolean`,category:`ui`,default:!1},removePadding:{name:`Fjern padding`,description:`Fjerner paddingen rundt innholdet i modalen`,type:`boolean`,category:`ui`,default:!1}},slots:{default:{description:`Innholdet i meldingen. Her tilbyr vi støtteklasser for å style 1-3 knapper i modalen.`}}},a=class extends n.t{constructor(){super(),this.open=!1,this.headingText=``,this.removePadding=!1,this.hideCloseButton=i.props.hideCloseButton.default,this.closeOnBackdropClick=i.props.closeOnBackdropClick.default,this.closeButtonSkin=`blue`,this.size=i.props.size.default,this.variant=`dialog`,this.drawerPosition=`right`,this.transparentBackdrop=!1,this.dialogRef=r.t(),this._isOpen=!1,this.close=(e,t=!1)=>{if(!this._isOpen)return;this._isOpen=!1,this.open=!1,document.body.classList.remove(`pkt-modal--open`);let n=document.activeElement;n&&!this.isElementInViewport(n)&&n.scrollIntoView({behavior:`smooth`,block:`nearest`}),this.dispatchEvent(new CustomEvent(`close`,{detail:{origin:e},bubbles:!0,composed:!0})),t||this.dialogRef.value?.close(),this.requestUpdate()},this.showModal=(e=null)=>{this._isOpen=!0,this.open=!0,this.dialogRef.value?.showModal(),document.body.classList.add(`pkt-modal--open`),this.dispatchEvent(new CustomEvent(`showModal`,{detail:{origin:e},bubbles:!0,composed:!0})),this.requestUpdate()},this._isOpen=!1}async connectedCallback(){super.connectedCallback(),document.addEventListener(`keydown`,this.handleKeyDown.bind(this)),document.addEventListener(`click`,this.handleBackdropClick.bind(this))}disconnectedCallback(){super.disconnectedCallback(),document.removeEventListener(`keydown`,this.handleKeyDown),document.removeEventListener(`click`,this.handleBackdropClick)}updated(e){super.updated(e),e.has(`open`)&&(this.open&&!this._isOpen?this.showModal():!this.open&&this._isOpen&&this.close(new Event(`close`),!1))}async firstUpdated(e){super.firstUpdated(e),this.dialogRef.value&&!window.HTMLDialogElement&&!this.dialogRef.value.showModal&&(`document`in window&&`createElement`in document&&(await Promise.resolve().then(()=>require(`./dialog-polyfill.esm-BnAQvMQO.cjs`)).then(e=>e.default)).registerDialog(this.dialogRef.value),this.dialogRef.value.addEventListener(`close`,()=>{this.close(new Event(`close`),!0)}))}handleKeyDown(e){e.key===`Escape`&&this.close(e)}handleBackdropClick(e){this.closeOnBackdropClick&&e.target===this.dialogRef?.value&&this.close(e)}isElementInViewport(e){let t=e.getBoundingClientRect();return t.top>=0&&t.left>=0&&t.bottom<=(window.innerHeight||document.documentElement.clientHeight)&&t.right<=(window.innerWidth||document.documentElement.clientWidth)}render(){let i={"pkt-modal":!0,"pkt-modal--removePadding":this.removePadding??!1,"pkt-modal--noHeadingText":this.headingText===``||this.headingText===void 0,"pkt-modal--noShadow":this.closeButtonSkin===`yellow-filled`,"pkt-modal--transparentBackdrop":this.transparentBackdrop??!1,[`pkt-modal--${this.size}`]:this.size!==void 0,[`pkt-modal__${this.variant}`]:this.variant!==void 0,[`pkt-modal__drawer--${this.drawerPosition}`]:this.variant===`drawer`},a={"pkt-modal__headingText":!0,"pkt-txt-24":!0},o={"pkt-modal__content":!0,"pkt-txt-18-light":!0},s=this.closeButtonSkin===`blue`,c={"pkt-modal__closeButton":!0,[`pkt-modal__closeButton--${this.closeButtonSkin}`]:!0};return e.d`
2
- <dialog
3
- class=${t.t(i)}
4
- ${r.n(this.dialogRef)}
5
- aria-labelledby=${this.headingText?`pkt-modal__headingText`:e.l}
6
- aria-describedby="pkt-modal__content"
7
- @close=${e=>this.close(e,!0)}
8
- >
9
- <div class="pkt-modal__wrapper">
10
- ${this.headingText||!this.hideCloseButton?e.d`<div class="pkt-modal__header">
11
- <div class="pkt-modal__header-background"></div>
12
- ${this.headingText?e.d`<h1 id="pkt-modal__headingText" class=${t.t(a)}>
13
- ${this.headingText}
14
- </h1>`:e.d`<div class="pkt-modal__headingText"></div>`}
15
- ${this.hideCloseButton?e.d`<div class="pkt-modal__noCloseButton"></div>`:e.d`<div class="${t.t(c)}">
16
- <pkt-button
17
- @click=${e=>this.close(e)}
18
- aria-label="close"
19
- iconname="close"
20
- variant="icon-only"
21
- size="medium"
22
- skin=${s?`tertiary`:`primary`}
23
- >
24
- Lukk
25
- </pkt-button>
26
- </div>`}
27
- </div>`:e.l}
28
- <div class="pkt-modal__container">
29
- <div id="pkt-modal__content" class=${t.t(o)}>
30
- ${n.n(this)}
31
- </div>
32
- </div>
33
- </div>
34
- </dialog>
35
- `}};e.r([e.s({type:Boolean,reflect:!0})],a.prototype,`open`,void 0),e.r([e.s({type:String})],a.prototype,`headingText`,void 0),e.r([e.s({type:Boolean})],a.prototype,`removePadding`,void 0),e.r([e.s({type:Boolean})],a.prototype,`hideCloseButton`,void 0),e.r([e.s({type:Boolean})],a.prototype,`closeOnBackdropClick`,void 0),e.r([e.s({type:String})],a.prototype,`closeButtonSkin`,void 0),e.r([e.s({type:String})],a.prototype,`size`,void 0),e.r([e.s({type:String})],a.prototype,`variant`,void 0),e.r([e.s({type:String})],a.prototype,`drawerPosition`,void 0),e.r([e.s({type:Boolean})],a.prototype,`transparentBackdrop`,void 0),e.r([e.o()],a.prototype,`_isOpen`,void 0);try{e.c(`pkt-modal`)(a)}catch{console.warn(`Forsøker å definere <pkt-modal>, men den er allerede definert`)}var o=a;Object.defineProperty(exports,`n`,{enumerable:!0,get:function(){return a}}),Object.defineProperty(exports,`t`,{enumerable:!0,get:function(){return o}});