@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.
- package/CHANGELOG.md +34 -0
- package/dist/{alert-ePJuDtmm.js → alert-D_eXGOez.js} +2 -2
- package/dist/{alert-BEEnTiCb.cjs → alert-NyLr62jZ.cjs} +1 -1
- package/dist/{backlink-Ba03LlbB.cjs → backlink-BsQ0Rmxj.cjs} +1 -1
- package/dist/{backlink-CiwXrQYD.js → backlink-CTu44BHn.js} +1 -1
- package/dist/{breadcrumbs-CD1zib3s.cjs → breadcrumbs-BNZ1L-0q.cjs} +1 -1
- package/dist/{breadcrumbs-CpuVqWhF.js → breadcrumbs-DPnoURvl.js} +1 -1
- package/dist/{button-D-TOBaJB.cjs → button-DsGvcLIn.cjs} +1 -1
- package/dist/{button-BIpd1xJh.js → button-ZYlrRRfu.js} +1 -1
- package/dist/{calendar-DkjXla0I.cjs → calendar-CDDVoUby.cjs} +1 -1
- package/dist/{calendar-Ch1dgnBo.js → calendar-VOqO5um6.js} +1 -1
- package/dist/{card-CEDbo1t7.js → card-B4oDGIRP.js} +2 -2
- package/dist/{card-C3POnP3O.cjs → card-DZuZy0ay.cjs} +1 -1
- package/dist/{combobox-DjvRMKOD.js → combobox-BDYoPZmg.js} +3 -3
- package/dist/{combobox-DYttdLJ4.cjs → combobox-Ct9gCFa1.cjs} +1 -1
- package/dist/components/icon/icon.d.ts +6 -1
- package/dist/components/icon/icon.test.d.ts +2 -0
- package/dist/components/modal/modal.d.ts +1 -0
- package/dist/{consent-DSHrt9eS.js → consent-1IUuWZAh.js} +2 -2
- package/dist/{consent-B5dIDyLD.cjs → consent-BME_rQ2w.cjs} +1 -1
- package/dist/{datepicker-M_jcY3wp.js → datepicker-BGpoabCM.js} +4 -4
- package/dist/{datepicker-D3QQbd_H.cjs → datepicker-ByqXCpCd.cjs} +1 -1
- package/dist/docs/components/modal.d.ts +8 -0
- package/dist/{fileupload-F9UMO7eS.js → fileupload-B6W7qOQT.js} +5 -5
- package/dist/{fileupload-BD_0oMrW.cjs → fileupload-a2OL3dzG.cjs} +1 -1
- package/dist/{header-DZranHLm.cjs → header-BZFSan0_.cjs} +5 -5
- package/dist/{header-j0SSHF4C.js → header-BgVpJMHQ.js} +8 -8
- package/dist/{header-menu-CPI1_5oZ.cjs → header-menu-BLngov1D.cjs} +1 -1
- package/dist/{header-menu-zhGYdnvz.js → header-menu-BXzVVOHq.js} +1 -1
- package/dist/{helptext-BdqoW19r.js → helptext-BeU-enix.js} +1 -1
- package/dist/{helptext-KWXjKljV.cjs → helptext-DWMFqMnV.cjs} +1 -1
- package/dist/{icon-Co72KtgF.js → icon-CZQkrK6B.js} +24 -3
- package/dist/icon-PbaC9uUg.cjs +1 -0
- package/dist/{input-wrapper-DOIWggEv.cjs → input-wrapper-Y98KV-sy.cjs} +1 -1
- package/dist/{input-wrapper-DVU68NcJ.js → input-wrapper-oYcbCFow.js} +3 -3
- package/dist/{link-DMKjKawh.cjs → link-BMMIjg50.cjs} +1 -1
- package/dist/{link-F51Ho7CV.js → link-CT0LB3S7.js} +1 -1
- package/dist/{linkcard-E07qJZMP.js → linkcard-Bz5zb69P.js} +1 -1
- package/dist/{linkcard-CBmJbSoV.cjs → linkcard-CupEMkvj.cjs} +1 -1
- package/dist/{loader-q_eO6zaE.cjs → loader-8T6M0FCQ.cjs} +1 -1
- package/dist/{loader-teN65oWo.js → loader-Cbrc4FFx.js} +1 -1
- package/dist/{messagebox-D1QeQqb8.cjs → messagebox-C6LHT78_.cjs} +1 -1
- package/dist/{messagebox-Ct9lfe0Z.js → messagebox-TKKUVTo4.js} +1 -1
- package/dist/{modal-Ca7dETTw.js → modal-BVHH8koz.js} +21 -11
- package/dist/modal-CRzbtqL3.cjs +35 -0
- package/dist/pkt-alert.cjs +1 -1
- package/dist/pkt-alert.js +1 -1
- package/dist/pkt-backlink.cjs +1 -1
- package/dist/pkt-backlink.js +1 -1
- package/dist/pkt-breadcrumbs.cjs +1 -1
- package/dist/pkt-breadcrumbs.js +1 -1
- package/dist/pkt-button.cjs +1 -1
- package/dist/pkt-button.js +1 -1
- package/dist/pkt-calendar.cjs +1 -1
- package/dist/pkt-calendar.js +1 -1
- package/dist/pkt-card.cjs +1 -1
- package/dist/pkt-card.js +1 -1
- package/dist/pkt-combobox.cjs +1 -1
- package/dist/pkt-combobox.js +1 -1
- package/dist/pkt-consent.cjs +1 -1
- package/dist/pkt-consent.js +1 -1
- package/dist/pkt-datepicker.cjs +1 -1
- package/dist/pkt-datepicker.js +1 -1
- package/dist/pkt-fileupload.cjs +1 -1
- package/dist/pkt-fileupload.js +1 -1
- package/dist/pkt-header-menu.cjs +1 -1
- package/dist/pkt-header-menu.js +1 -1
- package/dist/pkt-header.cjs +1 -1
- package/dist/pkt-header.js +1 -1
- package/dist/pkt-helptext.cjs +1 -1
- package/dist/pkt-helptext.js +1 -1
- package/dist/pkt-icon.cjs +1 -1
- package/dist/pkt-icon.js +1 -1
- package/dist/pkt-index.cjs +1 -1
- package/dist/pkt-index.js +27 -27
- package/dist/pkt-input-wrapper.cjs +1 -1
- package/dist/pkt-input-wrapper.js +1 -1
- package/dist/pkt-link.cjs +1 -1
- package/dist/pkt-link.js +1 -1
- package/dist/pkt-linkcard.cjs +1 -1
- package/dist/pkt-linkcard.js +1 -1
- package/dist/pkt-loader.cjs +1 -1
- package/dist/pkt-loader.js +1 -1
- package/dist/pkt-messagebox.cjs +1 -1
- package/dist/pkt-messagebox.js +1 -1
- package/dist/pkt-modal.cjs +1 -1
- package/dist/pkt-modal.js +1 -1
- package/dist/pkt-progressbar.cjs +1 -1
- package/dist/pkt-progressbar.js +1 -1
- package/dist/pkt-searchinput.cjs +1 -1
- package/dist/pkt-searchinput.js +1 -1
- package/dist/pkt-select.cjs +1 -1
- package/dist/pkt-select.js +1 -1
- package/dist/pkt-tag.cjs +1 -1
- package/dist/pkt-tag.js +1 -1
- package/dist/pkt-textarea.cjs +1 -1
- package/dist/pkt-textarea.js +1 -1
- package/dist/pkt-textinput.cjs +1 -1
- package/dist/pkt-textinput.js +1 -1
- package/dist/pkt-timepicker.cjs +1 -1
- package/dist/pkt-timepicker.js +1 -1
- package/dist/{progressbar-o-M17HPA.js → progressbar-C-5oESiB.js} +1 -1
- package/dist/{progressbar-Ca7pRjmt.cjs → progressbar-C0g830Tk.cjs} +1 -1
- package/dist/{searchinput-CIseS5tL.js → searchinput-C9FP89qD.js} +1 -1
- package/dist/{searchinput-BVIaoetB.cjs → searchinput-DUgZb_zm.cjs} +1 -1
- package/dist/{select-DO0xGhQQ.cjs → select-DAs8kzN4.cjs} +1 -1
- package/dist/{select-6XCVj1lP.js → select-DkKIW7zD.js} +1 -1
- package/dist/shared-types/index.d.ts +1 -1
- package/dist/shared-types/skin.d.ts +4 -0
- package/dist/shared-utils/modal-scroll-lock.d.ts +10 -0
- package/dist/{tag-hl59gziI.js → tag-DSZ-czu-.js} +1 -1
- package/dist/{tag-DWtajZk6.cjs → tag-vgKH9B4k.cjs} +1 -1
- package/dist/{textarea-DBSNSvrX.js → textarea-BfjI6d7Q.js} +2 -2
- package/dist/{textarea-CV6z3LDf.cjs → textarea-C7YiheLo.cjs} +1 -1
- package/dist/{textinput-Dsc-8-BB.cjs → textinput-BM66vo5e.cjs} +1 -1
- package/dist/{textinput-BZZnFDk3.js → textinput-DhoupEyI.js} +2 -2
- package/dist/{timepicker-C2Ua6vHY.cjs → timepicker-C4oRmmRd.cjs} +1 -1
- package/dist/{timepicker-DDQ7CfOy.js → timepicker-CtRGbypF.js} +2 -2
- package/package.json +2 -2
- package/src/components/header/header-service.ts +4 -4
- package/src/components/header/types.ts +2 -2
- package/src/components/icon/icon.test.ts +101 -0
- package/src/components/icon/icon.ts +40 -1
- package/src/components/modal/modal.ts +12 -2
- package/dist/icon-Dr8sfT2X.cjs +0 -1
- 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
|
-
|
|
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
|
-
|
|
146
|
+
acquireModalScrollLock(this._scrollLockToken)
|
|
137
147
|
this.dispatchEvent(
|
|
138
148
|
new CustomEvent('showModal', { detail: { origin: event }, bubbles: true, composed: true }),
|
|
139
149
|
)
|
package/dist/icon-Dr8sfT2X.cjs
DELETED
|
@@ -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}});
|
package/dist/modal-C_LxgxzC.cjs
DELETED
|
@@ -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}});
|