@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.
Files changed (107) hide show
  1. package/fesm2022/ks-digital-designsystem-angular.mjs +1100 -0
  2. package/fesm2022/ks-digital-designsystem-angular.mjs.map +1 -0
  3. package/index.d.ts +333 -0
  4. package/package.json +15 -20
  5. package/.storybook/customTheme.ts +0 -15
  6. package/.storybook/default-args.ts +0 -18
  7. package/.storybook/main.ts +0 -27
  8. package/.storybook/manager.ts +0 -10
  9. package/.storybook/preview-head.html +0 -16
  10. package/.storybook/preview.ts +0 -70
  11. package/.storybook/themes.ts +0 -9
  12. package/.storybook/tsconfig.json +0 -16
  13. package/.storybook/vite.config.mts +0 -5
  14. package/eslint.config.mjs +0 -28
  15. package/ng-package.json +0 -9
  16. package/project.json +0 -81
  17. package/src/components/alert/alert.mdx +0 -46
  18. package/src/components/alert/alert.spec.ts +0 -33
  19. package/src/components/alert/alert.stories.ts +0 -138
  20. package/src/components/alert/alert.ts +0 -46
  21. package/src/components/alert/index.ts +0 -1
  22. package/src/components/button/button.mdx +0 -40
  23. package/src/components/button/button.spec.ts +0 -86
  24. package/src/components/button/button.stories.ts +0 -123
  25. package/src/components/button/button.ts +0 -60
  26. package/src/components/button/index.ts +0 -1
  27. package/src/components/card/card-block.ts +0 -10
  28. package/src/components/card/card.mdx +0 -100
  29. package/src/components/card/card.spec.ts +0 -70
  30. package/src/components/card/card.stories.ts +0 -101
  31. package/src/components/card/card.ts +0 -44
  32. package/src/components/card/index.ts +0 -2
  33. package/src/components/checkbox/README.md +0 -13
  34. package/src/components/checkbox/checkbox.mdx +0 -50
  35. package/src/components/checkbox/checkbox.spec.ts +0 -21
  36. package/src/components/checkbox/checkbox.stories.ts +0 -182
  37. package/src/components/checkbox/index.ts +0 -0
  38. package/src/components/colors.ts +0 -36
  39. package/src/components/common-inputs.ts +0 -30
  40. package/src/components/details/controlled-details.ts +0 -63
  41. package/src/components/details/details-content.ts +0 -7
  42. package/src/components/details/details-summary.ts +0 -7
  43. package/src/components/details/details.mdx +0 -89
  44. package/src/components/details/details.spec.ts +0 -56
  45. package/src/components/details/details.stories.ts +0 -129
  46. package/src/components/details/details.ts +0 -69
  47. package/src/components/details/index.ts +0 -3
  48. package/src/components/field/field-counter.ts +0 -56
  49. package/src/components/field/field-description.ts +0 -10
  50. package/src/components/field/field-error.ts +0 -13
  51. package/src/components/field/field-observer.ts +0 -121
  52. package/src/components/field/field-state.ts +0 -21
  53. package/src/components/field/field.mdx +0 -40
  54. package/src/components/field/field.spec.ts +0 -131
  55. package/src/components/field/field.stories.ts +0 -98
  56. package/src/components/field/field.ts +0 -70
  57. package/src/components/field/index.ts +0 -3
  58. package/src/components/fieldset/fieldset-description.ts +0 -8
  59. package/src/components/fieldset/fieldset-legend.ts +0 -11
  60. package/src/components/fieldset/fieldset.spec.ts +0 -80
  61. package/src/components/fieldset/fieldset.ts +0 -11
  62. package/src/components/fieldset/index.ts +0 -3
  63. package/src/components/input/index.ts +0 -1
  64. package/src/components/input/input.mdx +0 -11
  65. package/src/components/input/input.spec.ts +0 -25
  66. package/src/components/input/input.stories.ts +0 -72
  67. package/src/components/input/input.ts +0 -67
  68. package/src/components/label/index.ts +0 -1
  69. package/src/components/label/label.ts +0 -17
  70. package/src/components/paragraph/index.ts +0 -1
  71. package/src/components/paragraph/paragraph.ts +0 -10
  72. package/src/components/popover/controlled-popover.ts +0 -62
  73. package/src/components/popover/index.ts +0 -1
  74. package/src/components/popover/popover.mdx +0 -81
  75. package/src/components/popover/popover.spec.ts +0 -143
  76. package/src/components/popover/popover.stories.ts +0 -63
  77. package/src/components/popover/popover.ts +0 -186
  78. package/src/components/radio/radio.mdx +0 -117
  79. package/src/components/radio/radio.stories.ts +0 -226
  80. package/src/components/search/index.ts +0 -4
  81. package/src/components/search/search-button.ts +0 -35
  82. package/src/components/search/search-clear.ts +0 -57
  83. package/src/components/search/search-input.ts +0 -18
  84. package/src/components/search/search.mdx +0 -56
  85. package/src/components/search/search.spec.ts +0 -48
  86. package/src/components/search/search.stories.ts +0 -205
  87. package/src/components/search/search.ts +0 -50
  88. package/src/components/spinner/index.ts +0 -1
  89. package/src/components/spinner/spinner.mdx +0 -24
  90. package/src/components/spinner/spinner.spec.ts +0 -13
  91. package/src/components/spinner/spinner.stories.ts +0 -54
  92. package/src/components/spinner/spinner.ts +0 -62
  93. package/src/components/switch/switch.mdx +0 -82
  94. package/src/components/switch/switch.stories.ts +0 -94
  95. package/src/components/textarea/textarea.mdx +0 -14
  96. package/src/components/textarea/textarea.stories.ts +0 -52
  97. package/src/components/validation-message/index.ts +0 -1
  98. package/src/components/validation-message/validation-message.ts +0 -11
  99. package/src/index.ts +0 -14
  100. package/src/test-setup.ts +0 -12
  101. package/src/utils/log-if-devmode.ts +0 -13
  102. package/src/utils/random-id.ts +0 -3
  103. package/tsconfig.json +0 -34
  104. package/tsconfig.lib.json +0 -28
  105. package/tsconfig.lib.prod.json +0 -9
  106. package/tsconfig.spec.json +0 -30
  107. 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,10 +0,0 @@
1
- import { Component } from '@angular/core'
2
-
3
- @Component({
4
- selector: 'p[ksd-paragraph]',
5
- template: `<ng-content />`,
6
- host: {
7
- class: 'ds-paragraph',
8
- },
9
- })
10
- export class 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
- }