@ks-digital/designsystem-angular 0.0.1-alpha.25 → 0.0.1-alpha.27
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/fesm2022/ks-digital-designsystem-angular.mjs +1100 -0
- package/fesm2022/ks-digital-designsystem-angular.mjs.map +1 -0
- package/index.d.ts +333 -0
- package/package.json +15 -20
- package/.storybook/customTheme.ts +0 -15
- package/.storybook/default-args.ts +0 -18
- package/.storybook/main.ts +0 -27
- package/.storybook/manager.ts +0 -10
- package/.storybook/preview-head.html +0 -16
- package/.storybook/preview.ts +0 -70
- package/.storybook/themes.ts +0 -9
- package/.storybook/tsconfig.json +0 -16
- package/.storybook/vite.config.mts +0 -5
- package/eslint.config.mjs +0 -28
- package/ng-package.json +0 -9
- package/project.json +0 -81
- package/src/components/alert/alert.mdx +0 -46
- package/src/components/alert/alert.spec.ts +0 -33
- package/src/components/alert/alert.stories.ts +0 -138
- package/src/components/alert/alert.ts +0 -46
- package/src/components/alert/index.ts +0 -1
- package/src/components/button/button.mdx +0 -40
- package/src/components/button/button.spec.ts +0 -86
- package/src/components/button/button.stories.ts +0 -123
- package/src/components/button/button.ts +0 -60
- package/src/components/button/index.ts +0 -1
- package/src/components/card/card-block.ts +0 -10
- package/src/components/card/card.mdx +0 -100
- package/src/components/card/card.spec.ts +0 -70
- package/src/components/card/card.stories.ts +0 -101
- package/src/components/card/card.ts +0 -44
- package/src/components/card/index.ts +0 -2
- package/src/components/checkbox/README.md +0 -13
- package/src/components/checkbox/checkbox.mdx +0 -50
- package/src/components/checkbox/checkbox.spec.ts +0 -21
- package/src/components/checkbox/checkbox.stories.ts +0 -182
- package/src/components/checkbox/index.ts +0 -0
- package/src/components/colors.ts +0 -36
- package/src/components/common-inputs.ts +0 -30
- package/src/components/details/controlled-details.ts +0 -63
- package/src/components/details/details-content.ts +0 -7
- package/src/components/details/details-summary.ts +0 -7
- package/src/components/details/details.mdx +0 -89
- package/src/components/details/details.spec.ts +0 -56
- package/src/components/details/details.stories.ts +0 -129
- package/src/components/details/details.ts +0 -69
- package/src/components/details/index.ts +0 -3
- package/src/components/field/field-counter.ts +0 -56
- package/src/components/field/field-description.ts +0 -10
- package/src/components/field/field-error.ts +0 -13
- package/src/components/field/field-observer.ts +0 -121
- package/src/components/field/field-state.ts +0 -21
- package/src/components/field/field.mdx +0 -40
- package/src/components/field/field.spec.ts +0 -131
- package/src/components/field/field.stories.ts +0 -98
- package/src/components/field/field.ts +0 -70
- package/src/components/field/index.ts +0 -3
- package/src/components/fieldset/fieldset-description.ts +0 -8
- package/src/components/fieldset/fieldset-legend.ts +0 -11
- package/src/components/fieldset/fieldset.spec.ts +0 -80
- package/src/components/fieldset/fieldset.ts +0 -11
- package/src/components/fieldset/index.ts +0 -3
- package/src/components/input/index.ts +0 -1
- package/src/components/input/input.mdx +0 -11
- package/src/components/input/input.spec.ts +0 -25
- package/src/components/input/input.stories.ts +0 -72
- package/src/components/input/input.ts +0 -67
- package/src/components/label/index.ts +0 -1
- package/src/components/label/label.ts +0 -17
- package/src/components/paragraph/index.ts +0 -1
- package/src/components/paragraph/paragraph.ts +0 -10
- package/src/components/popover/controlled-popover.ts +0 -62
- package/src/components/popover/index.ts +0 -1
- package/src/components/popover/popover.mdx +0 -81
- package/src/components/popover/popover.spec.ts +0 -143
- package/src/components/popover/popover.stories.ts +0 -63
- package/src/components/popover/popover.ts +0 -186
- package/src/components/radio/radio.mdx +0 -117
- package/src/components/radio/radio.stories.ts +0 -226
- package/src/components/search/index.ts +0 -4
- package/src/components/search/search-button.ts +0 -35
- package/src/components/search/search-clear.ts +0 -57
- package/src/components/search/search-input.ts +0 -18
- package/src/components/search/search.mdx +0 -56
- package/src/components/search/search.spec.ts +0 -48
- package/src/components/search/search.stories.ts +0 -205
- package/src/components/search/search.ts +0 -50
- package/src/components/spinner/index.ts +0 -1
- package/src/components/spinner/spinner.mdx +0 -24
- package/src/components/spinner/spinner.spec.ts +0 -13
- package/src/components/spinner/spinner.stories.ts +0 -54
- package/src/components/spinner/spinner.ts +0 -62
- package/src/components/switch/switch.mdx +0 -82
- package/src/components/switch/switch.stories.ts +0 -94
- package/src/components/textarea/textarea.mdx +0 -14
- package/src/components/textarea/textarea.stories.ts +0 -52
- package/src/components/validation-message/index.ts +0 -1
- package/src/components/validation-message/validation-message.ts +0 -11
- package/src/index.ts +0 -14
- package/src/test-setup.ts +0 -12
- package/src/utils/log-if-devmode.ts +0 -13
- package/src/utils/random-id.ts +0 -3
- package/tsconfig.json +0 -34
- package/tsconfig.lib.json +0 -28
- package/tsconfig.lib.prod.json +0 -9
- package/tsconfig.spec.json +0 -30
- package/vite.config.mts +0 -35
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
import { Meta, Primary, Controls, Story } from '@storybook/addon-docs/blocks'
|
|
2
|
-
|
|
3
|
-
import * as InputStories from './input.stories'
|
|
4
|
-
|
|
5
|
-
<Meta of={InputStories} />
|
|
6
|
-
|
|
7
|
-
# Input
|
|
8
|
-
|
|
9
|
-
`Input` gir brukere muligheten til å skrive fritekst eller tall.
|
|
10
|
-
|
|
11
|
-
<Primary />
|
|
@@ -1,25 +0,0 @@
|
|
|
1
|
-
import { render, screen } from '@testing-library/angular'
|
|
2
|
-
import { Input } from './input'
|
|
3
|
-
|
|
4
|
-
test('should render', async () => {
|
|
5
|
-
await render(
|
|
6
|
-
`
|
|
7
|
-
<input ksd-input type="text" />
|
|
8
|
-
`,
|
|
9
|
-
{ imports: [Input] },
|
|
10
|
-
)
|
|
11
|
-
|
|
12
|
-
expect(screen.getByRole('textbox')).toBeDefined()
|
|
13
|
-
})
|
|
14
|
-
|
|
15
|
-
test('should set aria-invalid', async () => {
|
|
16
|
-
await render(
|
|
17
|
-
`
|
|
18
|
-
<input ksd-input type="text" aria-invalid="true" />
|
|
19
|
-
`,
|
|
20
|
-
{ imports: [Input] },
|
|
21
|
-
)
|
|
22
|
-
|
|
23
|
-
expect(screen.getByRole('textbox')).toBeDefined()
|
|
24
|
-
expect(screen.getByRole('textbox').getAttribute('aria-invalid')).toBe('true')
|
|
25
|
-
})
|
|
@@ -1,72 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
argsToTemplate,
|
|
3
|
-
moduleMetadata,
|
|
4
|
-
type Meta,
|
|
5
|
-
type StoryObj,
|
|
6
|
-
} from '@storybook/angular'
|
|
7
|
-
import { CommonArgs, commonArgTypes } from '../../../.storybook/default-args'
|
|
8
|
-
import { Field } from '../field/field'
|
|
9
|
-
import { Label } from '../label/label'
|
|
10
|
-
import { Input } from './input'
|
|
11
|
-
|
|
12
|
-
type InputArgs = CommonArgs & {
|
|
13
|
-
readonly: boolean
|
|
14
|
-
disabled: boolean
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
const meta: Meta<InputArgs> = {
|
|
18
|
-
component: Input,
|
|
19
|
-
title: 'Komponenter/Input',
|
|
20
|
-
argTypes: {
|
|
21
|
-
...commonArgTypes,
|
|
22
|
-
readonly: {
|
|
23
|
-
control: { type: 'boolean' },
|
|
24
|
-
},
|
|
25
|
-
disabled: {
|
|
26
|
-
control: { type: 'boolean' },
|
|
27
|
-
},
|
|
28
|
-
},
|
|
29
|
-
decorators: [
|
|
30
|
-
moduleMetadata({
|
|
31
|
-
imports: [Label, Field, Input],
|
|
32
|
-
}),
|
|
33
|
-
],
|
|
34
|
-
}
|
|
35
|
-
export default meta
|
|
36
|
-
type Story = StoryObj<InputArgs>
|
|
37
|
-
|
|
38
|
-
export const Preview: Story = {
|
|
39
|
-
render: (args) => ({
|
|
40
|
-
props: args,
|
|
41
|
-
template: `
|
|
42
|
-
<ksd-field>
|
|
43
|
-
<ksd-label>Label</ksd-label>
|
|
44
|
-
<input ${argsToTemplate(args)} ksd-input />
|
|
45
|
-
</ksd-field>
|
|
46
|
-
`,
|
|
47
|
-
}),
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
export const Rows: Story = {
|
|
51
|
-
render: (args) => ({
|
|
52
|
-
props: args,
|
|
53
|
-
template: `
|
|
54
|
-
<ksd-field>
|
|
55
|
-
<ksd-label>Label</ksd-label>
|
|
56
|
-
<textarea ksd-input type="text" rows="4" ${argsToTemplate(args)} ></textarea>
|
|
57
|
-
</ksd-field>
|
|
58
|
-
`,
|
|
59
|
-
}),
|
|
60
|
-
}
|
|
61
|
-
|
|
62
|
-
export const Counter: Story = {
|
|
63
|
-
render: (args) => ({
|
|
64
|
-
props: args,
|
|
65
|
-
template: `
|
|
66
|
-
<ksd-field>
|
|
67
|
-
<ksd-label>Label</ksd-label>
|
|
68
|
-
<input ksd-input [counter]="5" type="text" ${argsToTemplate(args)} />
|
|
69
|
-
</ksd-field>
|
|
70
|
-
`,
|
|
71
|
-
}),
|
|
72
|
-
}
|
|
@@ -1,67 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
booleanAttribute,
|
|
3
|
-
Directive,
|
|
4
|
-
inject,
|
|
5
|
-
input,
|
|
6
|
-
numberAttribute,
|
|
7
|
-
signal,
|
|
8
|
-
} from '@angular/core'
|
|
9
|
-
import { CommonInputs } from '../common-inputs'
|
|
10
|
-
import { FieldState } from '../field/field-state'
|
|
11
|
-
|
|
12
|
-
@Directive({
|
|
13
|
-
// eslint-disable-next-line @angular-eslint/directive-selector
|
|
14
|
-
selector: 'input[ksd-input], textarea[ksd-input], select[ksd-input]',
|
|
15
|
-
hostDirectives: [
|
|
16
|
-
{
|
|
17
|
-
directive: CommonInputs,
|
|
18
|
-
inputs: ['data-size', 'data-color'],
|
|
19
|
-
},
|
|
20
|
-
],
|
|
21
|
-
host: {
|
|
22
|
-
class: 'ds-input',
|
|
23
|
-
'[attr.readonly]': 'readonly() ? true : null',
|
|
24
|
-
'[attr.disabled]': 'disabled() ? true : null',
|
|
25
|
-
'[attr.aria-invalid]':
|
|
26
|
-
'ariaInvalid() ? true : (fieldState?.hasError() ? true: null)',
|
|
27
|
-
'(click)': 'onClick($event)',
|
|
28
|
-
'(input)': 'value.set($event.target.value)',
|
|
29
|
-
},
|
|
30
|
-
})
|
|
31
|
-
export class Input {
|
|
32
|
-
/**
|
|
33
|
-
* The value of the input
|
|
34
|
-
*/
|
|
35
|
-
value = signal('')
|
|
36
|
-
|
|
37
|
-
/**
|
|
38
|
-
* Whether the input is readonly
|
|
39
|
-
*/
|
|
40
|
-
readonly readonly = input(false, { transform: booleanAttribute })
|
|
41
|
-
|
|
42
|
-
/**
|
|
43
|
-
* Disables element
|
|
44
|
-
*/
|
|
45
|
-
readonly disabled = input(false, { transform: booleanAttribute })
|
|
46
|
-
|
|
47
|
-
/**
|
|
48
|
-
* Whether the element is invalid.
|
|
49
|
-
*/
|
|
50
|
-
readonly ariaInvalid = input(false, {
|
|
51
|
-
transform: booleanAttribute,
|
|
52
|
-
alias: 'aria-invalid',
|
|
53
|
-
})
|
|
54
|
-
|
|
55
|
-
/**
|
|
56
|
-
* Displays a character counter. pass a number to set a limit.
|
|
57
|
-
*/
|
|
58
|
-
counter = input(0, { transform: numberAttribute })
|
|
59
|
-
|
|
60
|
-
protected fieldState = inject(FieldState, { optional: true })
|
|
61
|
-
|
|
62
|
-
onClick(event: Event) {
|
|
63
|
-
if (this.readonly()) {
|
|
64
|
-
event.preventDefault()
|
|
65
|
-
}
|
|
66
|
-
}
|
|
67
|
-
}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export { Label } from './label'
|
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
import { Component } from '@angular/core'
|
|
2
|
-
import { CommonInputs } from '../common-inputs'
|
|
3
|
-
|
|
4
|
-
@Component({
|
|
5
|
-
selector: 'ksd-label',
|
|
6
|
-
hostDirectives: [
|
|
7
|
-
{
|
|
8
|
-
directive: CommonInputs,
|
|
9
|
-
inputs: ['data-size', 'data-color'],
|
|
10
|
-
},
|
|
11
|
-
],
|
|
12
|
-
template: `
|
|
13
|
-
<!-- eslint-disable @angular-eslint/template/label-has-associated-control -- Fieldobserver handles binding the label to the input -->
|
|
14
|
-
<label class="ds-label"><ng-content /></label>
|
|
15
|
-
`,
|
|
16
|
-
})
|
|
17
|
-
export class Label {}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export { Paragraph } from './paragraph'
|
|
@@ -1,62 +0,0 @@
|
|
|
1
|
-
/* eslint-disable @angular-eslint/no-input-rename */
|
|
2
|
-
|
|
3
|
-
import { Component, input, signal } from '@angular/core'
|
|
4
|
-
import { Button } from '../button'
|
|
5
|
-
import { Color, SeverityColors } from '../colors'
|
|
6
|
-
import { Size } from '../common-inputs'
|
|
7
|
-
import { Popover } from './popover'
|
|
8
|
-
|
|
9
|
-
/* Demo component to be used in story only */
|
|
10
|
-
|
|
11
|
-
@Component({
|
|
12
|
-
selector: 'ksd-controlled-popover',
|
|
13
|
-
template: `
|
|
14
|
-
<button
|
|
15
|
-
ksd-button
|
|
16
|
-
variant="primary"
|
|
17
|
-
popovertarget="controlled-popover"
|
|
18
|
-
(click)="togglePopover()"
|
|
19
|
-
>
|
|
20
|
-
Kontrollert popover
|
|
21
|
-
</button>
|
|
22
|
-
|
|
23
|
-
<ksd-popover
|
|
24
|
-
popoverId="controlled-popover"
|
|
25
|
-
placement="top"
|
|
26
|
-
[open]="popoverOpen()"
|
|
27
|
-
(triggeredClose)="setPopoverClosed()"
|
|
28
|
-
[variant]="variant()"
|
|
29
|
-
[data-size]="dataSize()"
|
|
30
|
-
[data-color]="dataColor()"
|
|
31
|
-
[placement]="placement()"
|
|
32
|
-
>
|
|
33
|
-
<p>Her er det noe innhold</p>
|
|
34
|
-
<button
|
|
35
|
-
ksd-button
|
|
36
|
-
variant="secondary"
|
|
37
|
-
data-color="danger"
|
|
38
|
-
(click)="setPopoverClosed()"
|
|
39
|
-
>
|
|
40
|
-
Lukk popover
|
|
41
|
-
</button>
|
|
42
|
-
</ksd-popover>
|
|
43
|
-
`,
|
|
44
|
-
imports: [Popover, Button],
|
|
45
|
-
})
|
|
46
|
-
export class ControlledPopover {
|
|
47
|
-
protected popoverOpen = signal(false)
|
|
48
|
-
readonly variant = input<'tinted' | 'default'>('default')
|
|
49
|
-
readonly dataSize = input<Size>('md', { alias: 'data-size' })
|
|
50
|
-
readonly dataColor = input<Color | SeverityColors>('neutral', {
|
|
51
|
-
alias: 'data-color',
|
|
52
|
-
})
|
|
53
|
-
readonly placement = input<'top' | 'bottom' | 'left' | 'right'>('top')
|
|
54
|
-
|
|
55
|
-
togglePopover() {
|
|
56
|
-
this.popoverOpen.update((open) => !open)
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
setPopoverClosed() {
|
|
60
|
-
this.popoverOpen.set(false)
|
|
61
|
-
}
|
|
62
|
-
}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export { Popover } from './popover'
|
|
@@ -1,81 +0,0 @@
|
|
|
1
|
-
import { Meta, Canvas, Controls, Primary } from '@storybook/addon-docs/blocks'
|
|
2
|
-
import * as PopoverStories from './popover.stories.ts'
|
|
3
|
-
|
|
4
|
-
<Meta of={PopoverStories} />
|
|
5
|
-
|
|
6
|
-
# Popover
|
|
7
|
-
|
|
8
|
-
`Popover` vises over andre elementer i grensesnittet og er koblet til et spesifikt element. Den brukes til å vise tilleggsinformasjon, interaktive elementer eller korte forklaringer uten å navigere bort fra siden. `Popover` kan brukes som en utvidet løsning når [`Tooltip`](/docs/komponenter-tooltip--docs) ikke strekker til.
|
|
9
|
-
|
|
10
|
-
<Primary />
|
|
11
|
-
<Controls />
|
|
12
|
-
|
|
13
|
-
## Bruk
|
|
14
|
-
|
|
15
|
-
```tsx
|
|
16
|
-
|
|
17
|
-
<button ksd-button variant="primary" popovertarget="my-popover"> Enkel popover </button>
|
|
18
|
-
<ksd-popover popoverId="my-popover"> Her er det noe innhold </ksd-popover>
|
|
19
|
-
```
|
|
20
|
-
|
|
21
|
-
### Polyfill
|
|
22
|
-
|
|
23
|
-
`Popover` bruker [popover (mozilla.org)](https://developer.mozilla.org/en-US/docs/Web/HTML/Reference/Global_attributes/popover). Dette apiet er klassifisert som [Baseline: Newly available (mozilla.org)](https://developer.mozilla.org/en-US/docs/Glossary/Baseline/Compatibility) fra april 2024, da Firefox som siste nettleser la det til. I noen tilfeller kan en oppleve at brukere av ulike grunner er låst til eldre nettleserversjoner, og da kan det være aktuelt å legge til en [Popover-Polyfill (github.com)](https://github.com/oddbird/popover-polyfill) for å sikre at `Popover` fungerer for alle.
|
|
24
|
-
|
|
25
|
-
## Kodeeksempler
|
|
26
|
-
|
|
27
|
-
### Farger
|
|
28
|
-
|
|
29
|
-
`Popover` kommer i alle farger, du kan endre den med `data-color`.
|
|
30
|
-
Du kan også sette `variant` direkte for å endre bakgrunnsfarge.
|
|
31
|
-
|
|
32
|
-
### Kontrollert
|
|
33
|
-
|
|
34
|
-
Dersom du sender inn `open`, så bruker du `popover` kontrollert. Du kan bruke `triggeredClose` for å få beskjed når `popover` vil lukkes.
|
|
35
|
-
Dette er nyttig dersom du har innhold som skal lukke `popover` når du klikker på det.
|
|
36
|
-
|
|
37
|
-
```tsx
|
|
38
|
-
|
|
39
|
-
<button ksd-button popovertarget="my-popover">Kontrollert popover</button>
|
|
40
|
-
<ksd-popover id="my-popover" [open]="isPopoverOpen()" (triggeredClose)="setPopoverClosed()">
|
|
41
|
-
<p>Her er det noe innhold</p>
|
|
42
|
-
<button
|
|
43
|
-
ksd-button
|
|
44
|
-
variant="secondary"
|
|
45
|
-
data-color="danger"
|
|
46
|
-
(click)="setPopoverClosed()"
|
|
47
|
-
>
|
|
48
|
-
Lukk popover
|
|
49
|
-
</button>
|
|
50
|
-
</ksd-popover>
|
|
51
|
-
```
|
|
52
|
-
|
|
53
|
-
<Canvas of={PopoverStories.Controlled} />
|
|
54
|
-
|
|
55
|
-
## Retningslinjer
|
|
56
|
-
|
|
57
|
-
`Popover` brukes for å vise mer detaljert eller interaktiv tilleggsinformasjon uten å ta brukeren bort fra konteksten. Den åpnes ved et bevisst brukerklikk og kan inneholde både tekst, lenker og enkle skjemaelementer. Innholdet bør være kort og relevant, og ikke kritisk for å fullføre oppgaven.
|
|
58
|
-
|
|
59
|
-
**Passer til:**
|
|
60
|
-
|
|
61
|
-
- Utfyllende forklaringer som krever mer plass enn en kort [`Tooltip`](/docs/komponenter-tooltip--docs), f.eks. definisjoner eller utdypende instruksjoner.
|
|
62
|
-
- Kontekstspesifikk hjelp som brukeren kan velge å åpne/lukke uten å forlate siden.
|
|
63
|
-
- Visning av tilleggsinformasjon som ikke er kritisk for å fullføre oppgaven, men som kan være nyttig for enkelte brukere.
|
|
64
|
-
|
|
65
|
-
**Passer ikke til:**
|
|
66
|
-
|
|
67
|
-
- Å beskrive et symbol eller tastatursnartvei, bruk heller [`Tooltip`](/docs/komponenter-tooltip--docs).
|
|
68
|
-
- Navigasjon eller valg av alternativer (bruk [`Dropdown`](/docs/komponenter-dropdown--docs) i stedet)
|
|
69
|
-
- Å vise innhold ved `hover`.
|
|
70
|
-
|
|
71
|
-
### Plassering
|
|
72
|
-
|
|
73
|
-
`Popover` plasseres etter ønske, men holder seg automatisk innenfor det synlige området i nettleseren. Denne oppførselen kan deaktiveres med `autoPlacement`.
|
|
74
|
-
|
|
75
|
-
## Tekst
|
|
76
|
-
|
|
77
|
-
Unngå lange tekster og kompliserte forklaringer. I noen tilfeller er det kanskje bedre å lenke til en annen side med utdypende informasjon om temaet.
|
|
78
|
-
|
|
79
|
-
## Tilgjengelighet
|
|
80
|
-
|
|
81
|
-
Det er innebygd tilgjengelighet i [Popover APIet (mozilla.org)](https://developer.mozilla.org/en-US/docs/Web/API/Popover_API) i henhold til åpne/lukket tilstand og tastatur navigasjon.
|
|
@@ -1,143 +0,0 @@
|
|
|
1
|
-
import { render, screen } from '@testing-library/angular'
|
|
2
|
-
import userEvent from '@testing-library/user-event'
|
|
3
|
-
import { Popover } from './popover'
|
|
4
|
-
|
|
5
|
-
const renderPopover = async () => {
|
|
6
|
-
return await render(
|
|
7
|
-
`
|
|
8
|
-
<button popovertarget="my-popover"> enkel popover</button>
|
|
9
|
-
<ksd-popover popoverId="my-popover" placement="top" >
|
|
10
|
-
her er det noe innhold
|
|
11
|
-
</ksd-popover>
|
|
12
|
-
`,
|
|
13
|
-
{
|
|
14
|
-
imports: [Popover],
|
|
15
|
-
},
|
|
16
|
-
)
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
const contentText = 'her er det noe innhold'
|
|
20
|
-
|
|
21
|
-
describe('Popover', () => {
|
|
22
|
-
const user = userEvent.setup()
|
|
23
|
-
|
|
24
|
-
it('should render popover on trigger-click when closed', async () => {
|
|
25
|
-
await renderPopover()
|
|
26
|
-
const popoverButton = await screen.findByRole('button', {
|
|
27
|
-
name: /enkel popover/i,
|
|
28
|
-
})
|
|
29
|
-
|
|
30
|
-
//popover button should be visible
|
|
31
|
-
expect(popoverButton).toBeVisible()
|
|
32
|
-
|
|
33
|
-
//the popover content should not be visible yet
|
|
34
|
-
expect(screen.queryByText(contentText)).not.toBeInTheDocument()
|
|
35
|
-
|
|
36
|
-
//click button to see popover
|
|
37
|
-
await user.click(popoverButton)
|
|
38
|
-
expect(screen.queryByText(contentText)).toBeInTheDocument()
|
|
39
|
-
})
|
|
40
|
-
|
|
41
|
-
it('should close when we click the button twice', async () => {
|
|
42
|
-
await renderPopover()
|
|
43
|
-
const popoverButton = await screen.findByRole('button', {
|
|
44
|
-
name: /enkel popover/i,
|
|
45
|
-
})
|
|
46
|
-
|
|
47
|
-
//the popover content should not be visible yet
|
|
48
|
-
expect(screen.queryByText(contentText)).not.toBeInTheDocument()
|
|
49
|
-
|
|
50
|
-
//click button to see popover
|
|
51
|
-
await user.click(popoverButton)
|
|
52
|
-
expect(screen.queryByText(contentText)).toBeInTheDocument()
|
|
53
|
-
|
|
54
|
-
//click button again to hide popover
|
|
55
|
-
await user.click(popoverButton)
|
|
56
|
-
expect(screen.queryByText(contentText)).not.toBeInTheDocument()
|
|
57
|
-
})
|
|
58
|
-
|
|
59
|
-
it('should close when we click outside', async () => {
|
|
60
|
-
await renderPopover()
|
|
61
|
-
const popoverButton = await screen.findByRole('button', {
|
|
62
|
-
name: /enkel popover/i,
|
|
63
|
-
})
|
|
64
|
-
|
|
65
|
-
//click button to see popover
|
|
66
|
-
await user.click(popoverButton)
|
|
67
|
-
expect(screen.queryByText(contentText)).toBeInTheDocument()
|
|
68
|
-
|
|
69
|
-
//click outside to hide popover
|
|
70
|
-
await user.click(document.body)
|
|
71
|
-
expect(screen.queryByText(contentText)).not.toBeInTheDocument()
|
|
72
|
-
})
|
|
73
|
-
|
|
74
|
-
it('should close when we press ESC', async () => {
|
|
75
|
-
await renderPopover()
|
|
76
|
-
const popoverButton = await screen.findByRole('button', {
|
|
77
|
-
name: /enkel popover/i,
|
|
78
|
-
})
|
|
79
|
-
|
|
80
|
-
//click button to see popover
|
|
81
|
-
await user.click(popoverButton)
|
|
82
|
-
expect(screen.queryByText(contentText)).toBeInTheDocument()
|
|
83
|
-
|
|
84
|
-
//press ESC to hide popover
|
|
85
|
-
await user.keyboard('[Escape]')
|
|
86
|
-
expect(screen.queryByText(contentText)).not.toBeInTheDocument()
|
|
87
|
-
})
|
|
88
|
-
|
|
89
|
-
it('should close when we press SPACE', async () => {
|
|
90
|
-
await renderPopover()
|
|
91
|
-
const popoverButton = await screen.findByRole('button', {
|
|
92
|
-
name: /enkel popover/i,
|
|
93
|
-
})
|
|
94
|
-
|
|
95
|
-
//click button to see popover
|
|
96
|
-
await user.click(popoverButton)
|
|
97
|
-
expect(screen.queryByText(contentText)).toBeInTheDocument()
|
|
98
|
-
|
|
99
|
-
//press SPACE to hide popover
|
|
100
|
-
await user.keyboard('[Space]')
|
|
101
|
-
expect(screen.queryByText(contentText)).not.toBeInTheDocument()
|
|
102
|
-
})
|
|
103
|
-
|
|
104
|
-
it('should close when we press ENTER', async () => {
|
|
105
|
-
await renderPopover()
|
|
106
|
-
const popoverButton = await screen.findByRole('button', {
|
|
107
|
-
name: /enkel popover/i,
|
|
108
|
-
})
|
|
109
|
-
|
|
110
|
-
//click button to see popover
|
|
111
|
-
await user.click(popoverButton)
|
|
112
|
-
expect(screen.queryByText(contentText)).toBeInTheDocument()
|
|
113
|
-
|
|
114
|
-
//press ENTER to hide popover
|
|
115
|
-
await user.keyboard('[Enter]')
|
|
116
|
-
expect(screen.queryByText(contentText)).not.toBeInTheDocument()
|
|
117
|
-
})
|
|
118
|
-
|
|
119
|
-
it('should not close if we click inside the popover', async () => {
|
|
120
|
-
await renderPopover()
|
|
121
|
-
const popoverButton = await screen.findByRole('button', {
|
|
122
|
-
name: /enkel popover/i,
|
|
123
|
-
})
|
|
124
|
-
|
|
125
|
-
//click button to see popover
|
|
126
|
-
await user.click(popoverButton)
|
|
127
|
-
expect(screen.queryByText(contentText)).toBeInTheDocument()
|
|
128
|
-
|
|
129
|
-
//click inside the popover
|
|
130
|
-
await user.click(screen.getByText(contentText))
|
|
131
|
-
expect(screen.queryByText(contentText)).toBeInTheDocument()
|
|
132
|
-
})
|
|
133
|
-
|
|
134
|
-
it('should have correct id and popovertarget attributes', async () => {
|
|
135
|
-
await renderPopover()
|
|
136
|
-
const popoverButton = await screen.findByRole('button', {
|
|
137
|
-
name: /enkel popover/i,
|
|
138
|
-
})
|
|
139
|
-
const popover = screen.getByTestId('popover')
|
|
140
|
-
|
|
141
|
-
expect(popoverButton.getAttribute('popovertarget')).toBe(popover.id)
|
|
142
|
-
})
|
|
143
|
-
})
|
|
@@ -1,63 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
Meta,
|
|
3
|
-
StoryObj,
|
|
4
|
-
argsToTemplate,
|
|
5
|
-
moduleMetadata,
|
|
6
|
-
} from '@storybook/angular'
|
|
7
|
-
import { CommonArgs, commonArgTypes } from '../../../.storybook/default-args'
|
|
8
|
-
import { Button } from '../button/button'
|
|
9
|
-
import { ControlledPopover } from './controlled-popover'
|
|
10
|
-
import { Popover } from './popover'
|
|
11
|
-
|
|
12
|
-
type PopoverArgs = CommonArgs & {
|
|
13
|
-
variant: 'default' | 'tinted'
|
|
14
|
-
placement: 'top' | 'bottom' | 'left' | 'right'
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
const meta: Meta<PopoverArgs> = {
|
|
18
|
-
component: Popover,
|
|
19
|
-
decorators: [
|
|
20
|
-
moduleMetadata({
|
|
21
|
-
imports: [ControlledPopover, Button],
|
|
22
|
-
}),
|
|
23
|
-
],
|
|
24
|
-
title: 'Komponenter/Popover',
|
|
25
|
-
argTypes: {
|
|
26
|
-
...commonArgTypes,
|
|
27
|
-
variant: {
|
|
28
|
-
options: ['default', 'tinted'],
|
|
29
|
-
control: { type: 'radio' },
|
|
30
|
-
},
|
|
31
|
-
placement: {
|
|
32
|
-
options: ['top', 'bottom', 'left', 'right'],
|
|
33
|
-
control: { type: 'radio' },
|
|
34
|
-
},
|
|
35
|
-
},
|
|
36
|
-
}
|
|
37
|
-
export default meta
|
|
38
|
-
type Story = StoryObj<Popover>
|
|
39
|
-
|
|
40
|
-
export const Preview: Story = {
|
|
41
|
-
args: {},
|
|
42
|
-
render: (args) => ({
|
|
43
|
-
props: args,
|
|
44
|
-
template: `
|
|
45
|
-
<div style="margin: 0 auto; width:100%; text-align:center;" >
|
|
46
|
-
<button ksd-button variant="primary" popovertarget="my-popover"> Enkel popover </button>
|
|
47
|
-
<ksd-popover popoverId="my-popover" ${argsToTemplate(args)}> Her er det noe innhold </ksd-popover>
|
|
48
|
-
</div>
|
|
49
|
-
`,
|
|
50
|
-
}),
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
export const Controlled: StoryObj<ControlledPopover> = {
|
|
54
|
-
render: (args) => ({
|
|
55
|
-
props: args,
|
|
56
|
-
template: `
|
|
57
|
-
|
|
58
|
-
<div style="margin: 0 auto; width:100%; text-align:center;" >
|
|
59
|
-
<ksd-controlled-popover ${argsToTemplate(args)}/>
|
|
60
|
-
</div>
|
|
61
|
-
`,
|
|
62
|
-
}),
|
|
63
|
-
}
|