@politiet/sheriff-web-components 2.5.1 → 2.6.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 (133) hide show
  1. package/custom-elements.json +613 -472
  2. package/dist/frameworks/preact.d.ts +12 -3
  3. package/dist/frameworks/preact.d.ts.map +1 -1
  4. package/dist/frameworks/react.d.ts +12 -3
  5. package/dist/frameworks/react.d.ts.map +1 -1
  6. package/dist/frameworks/solidjs.d.ts +3 -0
  7. package/dist/frameworks/solidjs.d.ts.map +1 -1
  8. package/dist/frameworks/svelte.d.ts +3 -0
  9. package/dist/frameworks/svelte.d.ts.map +1 -1
  10. package/dist/frameworks/vue.d.ts +3 -0
  11. package/dist/frameworks/vue.d.ts.map +1 -1
  12. package/dist/index.d.ts +6 -0
  13. package/dist/index.d.ts.map +1 -1
  14. package/dist/index.js +3 -0
  15. package/dist/index.js.map +1 -1
  16. package/dist/mixins/index.d.ts +3 -0
  17. package/dist/mixins/index.d.ts.map +1 -0
  18. package/dist/mixins/index.js +3 -0
  19. package/dist/mixins/index.js.map +1 -0
  20. package/dist/mixins/sds-delegate-interaction-mixin.d.ts +27 -0
  21. package/dist/mixins/sds-delegate-interaction-mixin.d.ts.map +1 -0
  22. package/dist/mixins/sds-delegate-interaction-mixin.js +29 -0
  23. package/dist/mixins/sds-delegate-interaction-mixin.js.map +1 -0
  24. package/dist/mixins/sds-event-dispatcher-mixin.d.ts +1 -2
  25. package/dist/mixins/sds-event-dispatcher-mixin.d.ts.map +1 -1
  26. package/dist/mixins/sds-event-dispatcher-mixin.js.map +1 -1
  27. package/dist/mixins/sds-popover-target-mixin.d.ts +8 -0
  28. package/dist/mixins/sds-popover-target-mixin.d.ts.map +1 -0
  29. package/dist/mixins/sds-popover-target-mixin.js +77 -0
  30. package/dist/mixins/sds-popover-target-mixin.js.map +1 -0
  31. package/dist/mixins/types.d.ts +2 -0
  32. package/dist/mixins/types.d.ts.map +1 -0
  33. package/dist/mixins/types.js +2 -0
  34. package/dist/mixins/types.js.map +1 -0
  35. package/dist/react-wrappers/SDSPopoverWrapper.d.ts +3 -0
  36. package/dist/react-wrappers/SDSPopoverWrapper.d.ts.map +1 -0
  37. package/dist/react-wrappers/SDSPopoverWrapper.js +10 -0
  38. package/dist/react-wrappers/SDSPopoverWrapper.js.map +1 -0
  39. package/dist/react-wrappers/SDSProcessStepWrapper.d.ts +3 -0
  40. package/dist/react-wrappers/SDSProcessStepWrapper.d.ts.map +1 -0
  41. package/dist/react-wrappers/SDSProcessStepWrapper.js +10 -0
  42. package/dist/react-wrappers/SDSProcessStepWrapper.js.map +1 -0
  43. package/dist/react-wrappers/SDSProcessWrapper.d.ts +3 -0
  44. package/dist/react-wrappers/SDSProcessWrapper.d.ts.map +1 -0
  45. package/dist/react-wrappers/SDSProcessWrapper.js +10 -0
  46. package/dist/react-wrappers/SDSProcessWrapper.js.map +1 -0
  47. package/dist/react-wrappers/index.d.ts +3 -0
  48. package/dist/react-wrappers/index.d.ts.map +1 -1
  49. package/dist/react-wrappers/index.js +3 -0
  50. package/dist/react-wrappers/index.js.map +1 -1
  51. package/dist/sds-alert/sds-alert.component.d.ts +1 -1
  52. package/dist/sds-button/sds-button.component.d.ts +4 -4
  53. package/dist/sds-button/sds-button.component.d.ts.map +1 -1
  54. package/dist/sds-button/sds-button.component.js +17 -15
  55. package/dist/sds-button/sds-button.component.js.map +1 -1
  56. package/dist/sds-checkbox/sds-checkbox.d.ts +1 -4
  57. package/dist/sds-checkbox/sds-checkbox.d.ts.map +1 -1
  58. package/dist/sds-checkbox/sds-checkbox.js +2 -14
  59. package/dist/sds-checkbox/sds-checkbox.js.map +1 -1
  60. package/dist/sds-checkbox-group/sds-checkbox-group.d.ts +1 -1
  61. package/dist/sds-chip/sds-chip.d.ts +13 -12
  62. package/dist/sds-chip/sds-chip.d.ts.map +1 -1
  63. package/dist/sds-chip/sds-chip.js +27 -26
  64. package/dist/sds-chip/sds-chip.js.map +1 -1
  65. package/dist/sds-details/sds-details.d.ts +1 -1
  66. package/dist/sds-dialog/sds-dialog.d.ts +4 -1
  67. package/dist/sds-dialog/sds-dialog.d.ts.map +1 -1
  68. package/dist/sds-dialog/sds-dialog.js +40 -22
  69. package/dist/sds-dialog/sds-dialog.js.map +1 -1
  70. package/dist/sds-dialog/sds-dialog.styles.d.ts.map +1 -1
  71. package/dist/sds-dialog/sds-dialog.styles.js +3 -1
  72. package/dist/sds-dialog/sds-dialog.styles.js.map +1 -1
  73. package/dist/sds-notification/sds-notification.d.ts +1 -1
  74. package/dist/sds-popover/assets/popover-styles.d.ts +3 -0
  75. package/dist/sds-popover/assets/popover-styles.d.ts.map +1 -0
  76. package/dist/sds-popover/assets/popover-styles.js +3 -0
  77. package/dist/sds-popover/assets/popover-styles.js.map +1 -0
  78. package/dist/sds-popover/assets/positioning.js +1 -0
  79. package/dist/sds-popover/sds-popover.d.ts +25 -0
  80. package/dist/sds-popover/sds-popover.d.ts.map +1 -0
  81. package/dist/sds-popover/sds-popover.js +43 -0
  82. package/dist/sds-popover/sds-popover.js.map +1 -0
  83. package/dist/sds-popover/sds-popover.styles.d.ts +2 -0
  84. package/dist/sds-popover/sds-popover.styles.d.ts.map +1 -0
  85. package/dist/sds-popover/sds-popover.styles.js +52 -0
  86. package/dist/sds-popover/sds-popover.styles.js.map +1 -0
  87. package/dist/sds-process/sds-process.d.ts +20 -0
  88. package/dist/sds-process/sds-process.d.ts.map +1 -0
  89. package/dist/sds-process/sds-process.js +29 -0
  90. package/dist/sds-process/sds-process.js.map +1 -0
  91. package/dist/sds-process/sds-process.styles.d.ts +2 -0
  92. package/dist/sds-process/sds-process.styles.d.ts.map +1 -0
  93. package/dist/sds-process/sds-process.styles.js +8 -0
  94. package/dist/sds-process/sds-process.styles.js.map +1 -0
  95. package/dist/sds-process-step/sds-process-step.d.ts +29 -0
  96. package/dist/sds-process-step/sds-process-step.d.ts.map +1 -0
  97. package/dist/sds-process-step/sds-process-step.js +75 -0
  98. package/dist/sds-process-step/sds-process-step.js.map +1 -0
  99. package/dist/sds-process-step/sds-process-step.styles.d.ts +2 -0
  100. package/dist/sds-process-step/sds-process-step.styles.d.ts.map +1 -0
  101. package/dist/sds-process-step/sds-process-step.styles.js +143 -0
  102. package/dist/sds-process-step/sds-process-step.styles.js.map +1 -0
  103. package/dist/sds-radio/sds-radio.d.ts +1 -4
  104. package/dist/sds-radio/sds-radio.d.ts.map +1 -1
  105. package/dist/sds-radio/sds-radio.js +2 -14
  106. package/dist/sds-radio/sds-radio.js.map +1 -1
  107. package/dist/sds-radio-group/sds-radio-group.d.ts +1 -1
  108. package/dist/sds-select/sds-select.d.ts +1 -4
  109. package/dist/sds-select/sds-select.d.ts.map +1 -1
  110. package/dist/sds-select/sds-select.js +5 -18
  111. package/dist/sds-select/sds-select.js.map +1 -1
  112. package/dist/sds-stepper/sds-stepper.d.ts +1 -1
  113. package/dist/sds-stepper-step/sds-stepper-step.d.ts +1 -1
  114. package/dist/sds-switch/sds-switch.d.ts +1 -1
  115. package/dist/sds-textarea/sds-textarea.d.ts +1 -4
  116. package/dist/sds-textarea/sds-textarea.d.ts.map +1 -1
  117. package/dist/sds-textarea/sds-textarea.js +2 -14
  118. package/dist/sds-textarea/sds-textarea.js.map +1 -1
  119. package/dist/sds-textfield/sds-textfield.d.ts +1 -4
  120. package/dist/sds-textfield/sds-textfield.d.ts.map +1 -1
  121. package/dist/sds-textfield/sds-textfield.js +2 -14
  122. package/dist/sds-textfield/sds-textfield.js.map +1 -1
  123. package/dist/sds-textfield/sds-textfield.spec.js +3 -3
  124. package/dist/sds-textfield/sds-textfield.spec.js.map +1 -1
  125. package/dist/sheriff-web-components.js +324 -115
  126. package/dist/skill/SKILL.md +172 -0
  127. package/dist/skill/references/components.md +481 -0
  128. package/dist/skill/references/react-wrappers.md +66 -0
  129. package/dist/types.d.ts +1 -0
  130. package/dist/types.d.ts.map +1 -1
  131. package/dist/types.js.map +1 -1
  132. package/package.json +23 -4
  133. package/web-types.json +610 -38
@@ -0,0 +1,172 @@
1
+ ---
2
+ name: sheriff-web-components
3
+ description: >
4
+ Assists developers using @politiet/sheriff-web-components — Lit-based custom
5
+ elements with the sds-* prefix. Covers all 22 components (alert, button, card,
6
+ checkbox, chip, details, dialog, heading, icon, loader, radio, select, stepper,
7
+ switch, tag, text, textarea, textfield), React wrappers, form-associated
8
+ elements, slots, events, and data-palette theming. Use when the user references
9
+ sds-* components, @politiet/sheriff-web-components imports, or React wrappers.
10
+ Do not use for CSS-only questions, icon loading configuration, or SSR/RSC usage.
11
+ ---
12
+
13
+ # Sheriff Web Components
14
+
15
+ ## Source File Conventions
16
+
17
+ When looking up component details not covered here, read the source directly:
18
+
19
+ - Most components: `packages/sheriff/web-components/src/sds-{name}/sds-{name}.ts`
20
+ - Exception components (alert, button, heading, icon, text): `packages/sheriff/web-components/src/sds-{name}/sds-{name}.component.ts`
21
+ - Usage examples: `packages/sheriff/web-components/src/sds-{name}/sds-{name}.stories.ts`
22
+ - Documentation: `packages/sheriff/web-components/src/sds-{name}/sds-{name}.mdx`
23
+
24
+ ## Architecture
25
+
26
+ 1. Components that dispatch events extend `LitElement` via `SDSEventDispatcherMixin`.
27
+ 2. Properties use `@property({ reflect: true })` — settable as HTML attributes or JS properties.
28
+ 3. Content distribution uses named slots (`slot="before"`, `slot="after"`) and a default slot.
29
+ 4. Form-associated components implement `ElementInternals` with `formAssociated = true`.
30
+ 5. Events dispatch via `dispatchSheriffEvent()` as `CustomEvent` with `bubbles: true, composed: true`.
31
+ 6. Color theming uses the `data-palette` attribute (see `@politiet/sheriff-css-framework` skill for palette details).
32
+
33
+ ## Prerequisites
34
+
35
+ Import the CSS framework (components depend on it for CSS custom properties):
36
+
37
+ ```js
38
+ import '@politiet/sheriff-css-framework';
39
+ ```
40
+
41
+ Recommended to apply `sds-reset` to the root container. Not required for components:
42
+
43
+ ```html
44
+ <body class="sds-reset">
45
+ ...
46
+ </body>
47
+ ```
48
+
49
+ ## Register Components
50
+
51
+ Import once early at app entry point for performance. Importing a component multiple times is harmless but wasteful.
52
+
53
+ For `sds-icon` specifically, repeated imports can overwrite resolver/loader configuration.
54
+ This can cause loading bugs where the intended resolve/loader is overwritten.
55
+
56
+ Import all components:
57
+
58
+ ```js
59
+ import '@politiet/sheriff-web-components';
60
+ ```
61
+
62
+ Or import individually for tree-shaking:
63
+
64
+ ```js
65
+ import '@politiet/sheriff-web-components/sds-button';
66
+ import '@politiet/sheriff-web-components/sds-textfield';
67
+ ```
68
+
69
+ ## Component Quick Reference
70
+
71
+ All components use the `sds-` prefix. Sizes are `"lg"` | `"md"` | `"sm"` (default `"md"`).
72
+
73
+ | Component | Description | Key Props |
74
+ | -------------------- | -------------------------------------------- | ---------------------------------------------------------------- |
75
+ | `sds-alert` | Contextual alert banner | `variant`, `data-palette`, `removable-label`, `size` |
76
+ | `sds-button` | Button or link-as-button | `variant`, `size`, `type`, `disabled`, `loading`, `icon`, `href` |
77
+ | `sds-card` | Content container; link card when `link` set | `link` |
78
+ | `sds-checkbox` | Single checkbox | `label`, `name`, `value`, `checked`, `error` |
79
+ | `sds-checkbox-group` | Grouped checkboxes with legend | `legend`, `error-message`, `help-text` |
80
+ | `sds-chip` | Selectable or removable chip/pill | `variant`, `checked`, `name`, `value` |
81
+ | `sds-details` | Expandable accordion | `open`, `standalone`, `name` (exclusive group) |
82
+ | `sds-dialog` | Modal/dialog wrapping native `<dialog>` | `open`, `modal`, `closedby` |
83
+ | `sds-heading` | Semantic heading | `level`, `size` |
84
+ | `sds-icon` | Dynamic SVG icon | `name`, `size`, `label`, `data-palette` |
85
+ | `sds-loader` | Loading spinner | `size`, `contrast` |
86
+ | `sds-notification` | **Deprecated** — use `sds-alert` | `variant`, `removable-label` |
87
+ | `sds-radio` | Single radio button | `label`, `name`, `value`, `checked` |
88
+ | `sds-radio-group` | Grouped radios with legend | `legend`, `direction`, `error-message` |
89
+ | `sds-select` | Dropdown select | `label`, `name`, `default-value`, `error-message` |
90
+ | `sds-stepper` | Step indicator for multi-step flows | `orientation` |
91
+ | `sds-stepper-step` | Individual step in stepper | `complete`, `interactive`, `active` |
92
+ | `sds-switch` | Toggle switch | `label`, `name`, `checked`, `reverse`, `hide-label` |
93
+ | `sds-tag` | Non-interactive label/badge | `size`, `data-palette` |
94
+ | `sds-text` | Text container with typography | `size`, `strong`, `tall` |
95
+ | `sds-textarea` | Multi-line text input | `label`, `name`, `counter`, `error-message` |
96
+ | `sds-textfield` | Single-line text input | `label`, `name`, `type`, `error-message` |
97
+
98
+ For full component API (all props, slots, events, code examples), see `references/components.md`.
99
+
100
+ ## React Wrappers
101
+
102
+ React versions before v19 do not natively handle web component events. Use the provided wrappers from `@politiet/sheriff-web-components/react-wrappers`:
103
+
104
+ ```tsx
105
+ import { SDSButtonWrapper, SDSTextFieldWrapper } from '@politiet/sheriff-web-components/react-wrappers';
106
+
107
+ function MyForm() {
108
+ return (
109
+ <form>
110
+ <SDSTextFieldWrapper label="Name" name="name" />
111
+ <SDSButtonWrapper variant="primary" type="submit">
112
+ Submit
113
+ </SDSButtonWrapper>
114
+ </form>
115
+ );
116
+ }
117
+ ```
118
+
119
+ React 19+ supports custom elements natively — can use web components directly without wrappers.
120
+
121
+ For the full list of available wrappers and event mappings, see `references/react-wrappers.md`.
122
+
123
+ ## Common Patterns
124
+
125
+ ### Form layout
126
+
127
+ ```html
128
+ <div class="sds-stack-y-xs">
129
+ <sds-textfield label="Name" name="name" required></sds-textfield>
130
+ <sds-textfield label="Email" name="email" type="email" required></sds-textfield>
131
+ <sds-textarea label="Message" name="message" rows="4"></sds-textarea>
132
+ <div class="sds-stack-x-sm">
133
+ <sds-button variant="secondary">Cancel</sds-button>
134
+ <sds-button variant="primary" type="submit">Submit</sds-button>
135
+ </div>
136
+ </div>
137
+ ```
138
+
139
+ ### Dialog with actions
140
+
141
+ ```html
142
+ <sds-dialog modal closedby="any">
143
+ <sds-heading level="h2" size="md" slot="header">Confirm</sds-heading>
144
+ <sds-text>Are you sure?</sds-text>
145
+ <div slot="footer" class="sds-stack-x-2xs">
146
+ <sds-button size="md">Confirm</sds-button>
147
+ <sds-button size="md" variant="secondary" data-command="close">Cancel</sds-button>
148
+ </div>
149
+ </sds-dialog>
150
+ ```
151
+
152
+ ### Alert with title
153
+
154
+ ```html
155
+ <sds-alert data-palette="success">
156
+ <h2 slot="title">Success!</h2>
157
+ <p slot="message">Your changes have been saved.</p>
158
+ </sds-alert>
159
+ ```
160
+
161
+ ### Danger button
162
+
163
+ ```html
164
+ <sds-button variant="primary" data-palette="danger">Delete</sds-button>
165
+ ```
166
+
167
+ ## Error Handling
168
+
169
+ - **Component does not render or render weird**: Verify the CSS framework is imported. This is needed for CSS custom properties.
170
+ - **Events do not fire in React (pre-v19)**: Confirm React wrappers are used instead of web components.
171
+ - **Icons do not load**: Check the icon name format (`{name}-{source}-{variant}`) and network access to jsDelivr CDN. If in secure/isolated network, use Artifactory. If needed, see `@politiet/sheriff-icons` for icon skill.
172
+ - **Form values not submitted**: Ensure the component has both `name` and `value` attributes set.
@@ -0,0 +1,481 @@
1
+ # Component Reference
2
+
3
+ Full API for each SDS web component. All components support `size` (`"lg"` | `"md"` | `"sm"`, default `"md"`) unless noted otherwise.
4
+
5
+ ---
6
+
7
+ ## sds-alert
8
+
9
+ Contextual alert/message banner. Source: `sds-alert.component.ts`.
10
+
11
+ ```html
12
+ <sds-alert data-palette="info">
13
+ <p slot="message">Informational message.</p>
14
+ </sds-alert>
15
+
16
+ <sds-alert data-palette="success">
17
+ <h2 slot="title">Success!</h2>
18
+ <p slot="message">Your changes have been saved.</p>
19
+ </sds-alert>
20
+
21
+ <sds-alert variant="secondary" data-palette="attention">
22
+ <h2 slot="title">Notice</h2>
23
+ <p slot="message">Please review your submission.</p>
24
+ </sds-alert>
25
+
26
+ <sds-alert data-palette="danger" removable-label="Close alert">
27
+ <h2 slot="title">Error</h2>
28
+ <p slot="message">Something went wrong.</p>
29
+ </sds-alert>
30
+
31
+ <sds-alert variant="secondary" data-palette="info" size="sm">
32
+ <p slot="message">Compact info message.</p>
33
+ </sds-alert>
34
+ ```
35
+
36
+ **Props:** `variant` (`"primary"` | `"secondary"`, default `"primary"`), `size` (`"lg"` | `"md"` | `"sm"`), `removable-label` (string — shows close button on primary variant), `data-palette` (`"info"` | `"success"` | `"attention"` | `"danger"`, default `"info"`)
37
+ **Slots:** `title` (heading element), `message` (`<p>`)
38
+ **Events:** `sds-remove` (close button clicked)
39
+
40
+ ---
41
+
42
+ ## sds-button
43
+
44
+ Button or link-styled-as-button. Source: `sds-button.component.ts`.
45
+
46
+ ```html
47
+ <sds-button variant="primary" size="lg">Save</sds-button>
48
+ <sds-button variant="secondary">Cancel</sds-button>
49
+ <sds-button variant="tertiary">Learn more</sds-button>
50
+ <sds-button href="https://example.com" target="_blank">Visit site</sds-button>
51
+
52
+ <!-- Icon-only -->
53
+ <sds-button variant="primary" icon>
54
+ <sds-icon name="search-material-outlined" label="Search"></sds-icon>
55
+ </sds-button>
56
+
57
+ <!-- With leading/trailing icons -->
58
+ <sds-button variant="primary">
59
+ <sds-icon name="file_upload-material-outlined" slot="before"></sds-icon>
60
+ Upload
61
+ </sds-button>
62
+
63
+ <sds-button variant="primary">
64
+ Continue
65
+ <sds-icon name="arrow_forward-material-outlined" slot="after"></sds-icon>
66
+ </sds-button>
67
+
68
+ <sds-button variant="primary" loading>Saving...</sds-button>
69
+ <sds-button variant="primary" type="submit">Submit</sds-button>
70
+ ```
71
+
72
+ **Props:** `variant` (`"primary"` | `"secondary"` | `"tertiary"`, default `"primary"`), `size` (`"lg"` | `"md"` | `"sm"`, default `"lg"`), `type` (`"button"` | `"submit"` | `"reset"`, default `"button"`), `disabled`, `loading`, `icon` (compact icon-only mode), `href`, `target`, `name`, `value`, `form`
73
+ **Slots:** default (label), `before`, `after`
74
+ **Events:** `click`, `submit`, `reset`
75
+ **Danger pattern:** `<sds-button variant="primary" data-palette="danger">Delete</sds-button>`
76
+
77
+ ---
78
+
79
+ ## sds-card
80
+
81
+ Content container card. Renders as `<a>` with arrow icon when `link` is set.
82
+
83
+ ```html
84
+ <sds-card link="https://www.example.com">
85
+ <h2 slot="heading">Pass og ID-kort</h2>
86
+ <p slot="text">Søke pass eller ID-kort, bestille time.</p>
87
+ </sds-card>
88
+
89
+ <sds-card>
90
+ <h2 slot="heading">Kort uten lenke</h2>
91
+ <p slot="text">Dette er et kort uten lenke</p>
92
+ </sds-card>
93
+ ```
94
+
95
+ **Props:** `link` (URL — renders as anchor)
96
+ **Slots:** `heading` (`<h2>`–`<h6>` only), `text` (`<p>` only, no nested elements)
97
+ **Note:** Slots enforce strict content validation — use native heading/paragraph elements.
98
+
99
+ ---
100
+
101
+ ## sds-checkbox
102
+
103
+ Single checkbox input.
104
+
105
+ ```html
106
+ <sds-checkbox label="I agree to the terms" name="terms" value="accepted"></sds-checkbox>
107
+ <sds-checkbox label="Subscribe" name="subscribe" checked></sds-checkbox>
108
+ <sds-checkbox label="Remember me" name="remember" help-text="Stay logged in for 30 days"></sds-checkbox>
109
+ <sds-checkbox label="Required option" name="required" error></sds-checkbox>
110
+ <sds-checkbox label="Locked choice" name="locked" checked readonly></sds-checkbox>
111
+ ```
112
+
113
+ **Props:** `label`, `name`, `value`, `checked`, `disabled`, `required`, `readonly`, `error` (boolean — use checkbox-group for text error messages), `help-text`, `size`
114
+ **Events:** `change`, `focus`, `blur`
115
+
116
+ ---
117
+
118
+ ## sds-checkbox-group
119
+
120
+ Groups multiple checkboxes with shared legend and validation.
121
+
122
+ ```html
123
+ <sds-checkbox-group legend="Select toppings">
124
+ <sds-checkbox label="Cheese" name="toppings" value="cheese"></sds-checkbox>
125
+ <sds-checkbox label="Pepperoni" name="toppings" value="pepperoni"></sds-checkbox>
126
+ </sds-checkbox-group>
127
+
128
+ <sds-checkbox-group legend="Select at least one" error-message="Please select at least one">
129
+ <sds-checkbox label="Option A" name="options" value="a"></sds-checkbox>
130
+ <sds-checkbox label="Option B" name="options" value="b"></sds-checkbox>
131
+ </sds-checkbox-group>
132
+
133
+ <sds-checkbox-group legend="Locked choices" readonly>
134
+ <sds-checkbox label="Fixed A" name="fixed" value="a" checked></sds-checkbox>
135
+ <sds-checkbox label="Fixed B" name="fixed" value="b"></sds-checkbox>
136
+ </sds-checkbox-group>
137
+ ```
138
+
139
+ **Props:** `legend`, `disabled` (propagates), `readonly` (propagates), `error-message`, `help-text`, `size` (propagates)
140
+ **Slots:** default (`sds-checkbox` children — `name`/`value` go on each child)
141
+ **Events:** `sds-update`
142
+
143
+ ---
144
+
145
+ ## sds-chip
146
+
147
+ Form-associated chip/pill. Two variants: `selectable` (toggle) and `removable` (dismiss).
148
+
149
+ ```html
150
+ <sds-chip name="category" value="east">Øst politidistrikt</sds-chip>
151
+ <sds-chip name="filter" value="active" checked>Active</sds-chip>
152
+ <sds-chip variant="removable">Removable tag</sds-chip>
153
+ <sds-chip name="secure" value="locked">
154
+ Locked
155
+ <sds-icon size="sm" name="lock-material-outlined"></sds-icon>
156
+ </sds-chip>
157
+ ```
158
+
159
+ **Props:** `variant` (`"selectable"` | `"removable"`, default `"selectable"`), `checked`, `name`, `value`, `disabled`, `readonly`, `size`
160
+ **Slots:** default (label, can include `sds-icon`)
161
+ **Events:** `change` (selectable), `sds-remove` (removable)
162
+
163
+ ---
164
+
165
+ ## sds-details
166
+
167
+ Expandable/collapsible accordion. Summary text is a slot.
168
+
169
+ ```html
170
+ <sds-details>
171
+ <span slot="summary">Click to expand</span>
172
+ <p>Hidden content.</p>
173
+ </sds-details>
174
+
175
+ <sds-details open standalone>
176
+ <span slot="summary">Standalone</span>
177
+ <p>Has rounded corners and border.</p>
178
+ </sds-details>
179
+
180
+ <!-- Exclusive accordion (only one open at a time) -->
181
+ <sds-details name="faq">
182
+ <span slot="summary">Question 1</span>
183
+ <p>Answer 1</p>
184
+ </sds-details>
185
+ <sds-details name="faq">
186
+ <span slot="summary">Question 2</span>
187
+ <p>Answer 2</p>
188
+ </sds-details>
189
+ ```
190
+
191
+ **Props:** `open`, `standalone` (rounded corners + border), `name` (exclusive accordion group)
192
+ **Slots:** `summary` (always visible), default (expandable content)
193
+ **Events:** `sds-toggle` (detail: `{ open: boolean }`)
194
+
195
+ ---
196
+
197
+ ## sds-dialog
198
+
199
+ Modal/dialog wrapping native `<dialog>`.
200
+
201
+ ```html
202
+ <sds-dialog modal closedby="any">
203
+ <sds-heading level="h2" size="md" slot="header">Confirm Action</sds-heading>
204
+ <sds-text>Are you sure you want to proceed?</sds-text>
205
+ <div slot="footer" style="display: flex; gap: var(--sds-spacing-2xs);">
206
+ <sds-button size="md">Confirm</sds-button>
207
+ <sds-button size="md" variant="secondary" data-command="close">Cancel</sds-button>
208
+ </div>
209
+ </sds-dialog>
210
+ ```
211
+
212
+ **Props:** `open`, `modal`, `closedby` (`"none"` | `"closerequest"` | `"any"`, default `"closerequest"`), `close-button-label` (default `"Lukk dialogvindu"`, empty string hides button)
213
+ **Slots:** `header`, default (body), `footer`
214
+ **Events:** `sds-close`
215
+ **Methods:** `show()`, `showModal()`, `close()`
216
+ **Note:** `data-command="close"` on any inner button closes the dialog.
217
+
218
+ ---
219
+
220
+ ## sds-heading
221
+
222
+ Semantic heading. Source: `sds-heading.component.ts`.
223
+
224
+ ```html
225
+ <sds-heading level="h1">Page Title</sds-heading>
226
+ <sds-heading level="h3" size="xl">Looks XL, semantically h3</sds-heading>
227
+ <sds-heading level="h2" data-palette="accent">Accent heading</sds-heading>
228
+ ```
229
+
230
+ **Props:** `level` (`"h1"`–`"h6"`, default `"h1"`), `size` (`"xl"` | `"lg"` | `"md"` | `"sm"` | `"xs"` — visual override)
231
+ **Slots:** default
232
+
233
+ ---
234
+
235
+ ## sds-icon
236
+
237
+ Dynamic SVG icon. Source: `sds-icon.component.ts`.
238
+
239
+ ```html
240
+ <sds-icon name="search-material-filled"></sds-icon>
241
+ <sds-icon name="close-material-outlined" size="lg" label="Close"></sds-icon>
242
+ <sds-icon name="lock-material-filled" color="red"></sds-icon>
243
+
244
+ <!-- Inline custom SVG -->
245
+ <sds-icon label="Custom icon">
246
+ <svg viewBox="0 0 24 24" fill="none">
247
+ <path fill="currentColor" d="M12 2L2 22h20L12 2z" />
248
+ </svg>
249
+ </sds-icon>
250
+ ```
251
+
252
+ **Props:** `name` (`{icon}-{source}-{variant}`), `size` (`"sm"` | `"md"` | `"lg"`), `label` (sets `role="img"` + `aria-label`), `color`
253
+ **Slots:** default (custom `<svg>` — use instead of `name`)
254
+ **CSS vars:** `--sds-icon-size`, `--sds-icon-color`, `--sds-icon-display`
255
+
256
+ For icon naming, loading, and resolvers, see `@politiet/sheriff-icons` package skill.
257
+
258
+ ---
259
+
260
+ ## sds-loader
261
+
262
+ Loading spinner with built-in `aria-label="Laster"`.
263
+
264
+ ```html
265
+ <sds-loader></sds-loader>
266
+ <sds-loader size="lg"></sds-loader>
267
+ <sds-loader contrast></sds-loader>
268
+ <sds-loader data-palette="accent"></sds-loader>
269
+ ```
270
+
271
+ **Props:** `size`, `contrast` (for colored backgrounds)
272
+
273
+ ---
274
+
275
+ ## sds-notification
276
+
277
+ > **Deprecated** — use `sds-alert` instead.
278
+
279
+ ```html
280
+ <sds-notification variant="success">
281
+ <p slot="title">Success</p>
282
+ <p slot="message">Profile updated.</p>
283
+ </sds-notification>
284
+ ```
285
+
286
+ **Props:** `variant` (`"info"` | `"success"` | `"attention"` | `"danger"`), `removable-label`
287
+ **Slots:** `title`, `message`
288
+ **Events:** `sds-remove`
289
+
290
+ ---
291
+
292
+ ## sds-radio
293
+
294
+ Single radio button.
295
+
296
+ ```html
297
+ <sds-radio label="Option A" name="choice" value="a"></sds-radio>
298
+ <sds-radio label="Option B" name="choice" value="b" checked></sds-radio>
299
+ <sds-radio label="Express" name="shipping" value="express" help-text="2-3 business days"></sds-radio>
300
+ <sds-radio label="Locked" name="locked" value="y" checked readonly></sds-radio>
301
+ ```
302
+
303
+ **Props:** `label`, `name`, `value` (default `"on"`), `checked`, `disabled`, `required`, `readonly`, `error`, `hide-label`, `help-text`, `size`
304
+ **Events:** `change`, `focus`, `blur`
305
+
306
+ ---
307
+
308
+ ## sds-radio-group
309
+
310
+ Groups radio buttons with shared legend and validation.
311
+
312
+ ```html
313
+ <sds-radio-group legend="Choose one">
314
+ <sds-radio label="A" name="choice" value="a"></sds-radio>
315
+ <sds-radio label="B" name="choice" value="b"></sds-radio>
316
+ </sds-radio-group>
317
+
318
+ <sds-radio-group legend="Direction" direction="row">
319
+ <sds-radio label="Left" name="dir" value="left"></sds-radio>
320
+ <sds-radio label="Right" name="dir" value="right"></sds-radio>
321
+ </sds-radio-group>
322
+
323
+ <sds-radio-group legend="Required" error-message="Please select an option">
324
+ <sds-radio label="Yes" name="req" value="yes"></sds-radio>
325
+ <sds-radio label="No" name="req" value="no"></sds-radio>
326
+ </sds-radio-group>
327
+ ```
328
+
329
+ **Props:** `legend`, `disabled` (propagates), `required` (propagates), `readonly` (propagates), `direction` (`"column"` | `"row"`), `error-message`, `help-text`, `size` (propagates)
330
+ **Slots:** default (`sds-radio` children)
331
+ **Events:** `sds-update`
332
+
333
+ ---
334
+
335
+ ## sds-select
336
+
337
+ Dropdown select using native `<option>`/`<optgroup>` elements.
338
+
339
+ ```html
340
+ <sds-select label="Country" name="country">
341
+ <option value="no">Norway</option>
342
+ <option value="se">Sweden</option>
343
+ <option value="dk">Denmark</option>
344
+ </sds-select>
345
+
346
+ <sds-select label="Category" name="category" default-value="b">
347
+ <option value="a">Category A</option>
348
+ <option value="b">Category B</option>
349
+ </sds-select>
350
+
351
+ <sds-select label="Location" name="location">
352
+ <optgroup label="Norway">
353
+ <option value="oslo">Oslo</option>
354
+ <option value="bergen">Bergen</option>
355
+ </optgroup>
356
+ <hr />
357
+ <optgroup label="Sweden">
358
+ <option value="stockholm">Stockholm</option>
359
+ </optgroup>
360
+ </sds-select>
361
+ ```
362
+
363
+ **Props:** `label`, `name`, `value` (property only), `default-value` (attribute), `disabled`, `required`, `readonly`, `error-message`, `help-text`, `size`
364
+ **Slots:** default (`<option>` / `<optgroup>` / `<hr>`)
365
+ **Events:** `input`, `change`, `focus`, `blur`
366
+
367
+ ---
368
+
369
+ ## sds-stepper
370
+
371
+ Step indicator for multi-step flows. Contains `sds-stepper-step` children.
372
+
373
+ ```html
374
+ <sds-stepper>
375
+ <sds-stepper-step interactive complete>Innledning</sds-stepper-step>
376
+ <sds-stepper-step interactive active>Saksopplysninger</sds-stepper-step>
377
+ <sds-stepper-step>Oppsummering</sds-stepper-step>
378
+ </sds-stepper>
379
+
380
+ <sds-stepper orientation="vertical">
381
+ <sds-stepper-step interactive complete>Step 1</sds-stepper-step>
382
+ <sds-stepper-step interactive active>Step 2</sds-stepper-step>
383
+ <sds-stepper-step>Step 3</sds-stepper-step>
384
+ </sds-stepper>
385
+ ```
386
+
387
+ **Props:** `orientation` (`"horizontal"` | `"vertical"`, default `"horizontal"`)
388
+ **Slots:** default (`sds-stepper-step` children)
389
+ **Events:** `change` (detail: `{ index: number }`)
390
+ **Methods:** `getActiveStep()` (returns index or -1), `goToStep(index)`
391
+
392
+ ### sds-stepper-step
393
+
394
+ **Props:** `complete`, `interactive` (clickable), `active` (current step)
395
+ **Slots:** default (label text)
396
+
397
+ ---
398
+
399
+ ## sds-switch
400
+
401
+ Toggle switch input.
402
+
403
+ ```html
404
+ <sds-switch label="Enable notifications" name="notifications"></sds-switch>
405
+ <sds-switch label="Dark mode" name="darkmode" checked></sds-switch>
406
+ <sds-switch label="Auto-save" name="autosave" reverse></sds-switch>
407
+ <sds-switch label="Toggle" name="toggle" hide-label></sds-switch>
408
+ <sds-switch label="Locked" name="locked" checked readonly></sds-switch>
409
+ ```
410
+
411
+ **Props:** `label`, `name`, `checked`, `disabled`, `readonly`, `reverse` (flip order), `hide-label`, `size`
412
+ **Events:** `change`, `focus`, `blur`
413
+ **Note:** No `error-message`, `help-text`, or `required`. Value getter returns `"on"` | `"off"`.
414
+
415
+ ---
416
+
417
+ ## sds-tag
418
+
419
+ Non-interactive label/badge.
420
+
421
+ ```html
422
+ <sds-tag>Default</sds-tag>
423
+ <sds-tag data-palette="success">Approved</sds-tag>
424
+ <sds-tag data-palette="danger">Rejected</sds-tag>
425
+ <sds-tag size="sm">Small</sds-tag>
426
+ ```
427
+
428
+ **Props:** `size`
429
+ **Slots:** default
430
+
431
+ ---
432
+
433
+ ## sds-text
434
+
435
+ Text container with typography styling. Source: `sds-text.component.ts`.
436
+
437
+ ```html
438
+ <sds-text>Regular body text.</sds-text>
439
+ <sds-text size="lg" strong tall>Large bold text with tall line height.</sds-text>
440
+ <sds-text data-palette="danger">Red danger text.</sds-text>
441
+ ```
442
+
443
+ **Props:** `size` (`"xl"` | `"lg"` | `"md"` | `"sm"` | `"xs"`), `strong` (bold), `tall` (increased line height)
444
+ **Slots:** default
445
+
446
+ ---
447
+
448
+ ## sds-textarea
449
+
450
+ Multi-line text input.
451
+
452
+ ```html
453
+ <sds-textarea label="Description" name="description" placeholder="Enter a description..."></sds-textarea>
454
+ <sds-textarea label="Comments" name="comments" required error-message="Required"></sds-textarea>
455
+ <sds-textarea label="Bio" name="bio" counter="500"></sds-textarea>
456
+ <sds-textarea label="Address" name="address" rows="4" wrap="soft"></sds-textarea>
457
+ ```
458
+
459
+ **Props:** `label`, `name`, `value`, `placeholder`, `disabled`, `readonly`, `required`, `rows`, `cols`, `wrap` (`"hard"` | `"soft"`), `minlength`, `maxlength`, `counter` (shows character count), `autocomplete`, `help-text`, `error-message`, `size`
460
+ **Events:** `input`, `change`, `select`, `focus`, `blur`
461
+
462
+ ---
463
+
464
+ ## sds-textfield
465
+
466
+ Single-line text input.
467
+
468
+ ```html
469
+ <sds-textfield label="Email" name="email" type="email" placeholder="you@example.com"></sds-textfield>
470
+ <sds-textfield label="Username" name="username" required help-text="3-20 characters" minlength="3" maxlength="20"></sds-textfield>
471
+ <sds-textfield label="Phone" name="phone" type="tel" error-message="Invalid phone"></sds-textfield>
472
+ <sds-textfield label="Search" name="search" type="search">
473
+ <sds-icon name="search-material-filled" slot="after"></sds-icon>
474
+ </sds-textfield>
475
+ <sds-textfield label="Password" name="password" type="password"></sds-textfield>
476
+ <sds-textfield label="ID" name="id" value="12345" readonly></sds-textfield>
477
+ ```
478
+
479
+ **Props:** `label`, `name`, `value`, `type` (HTML input types), `placeholder`, `disabled`, `readonly`, `required`, `autocomplete`, `pattern`, `minlength`, `maxlength`, `help-text`, `error-message`, `size`
480
+ **Slots:** `after` (e.g., icon)
481
+ **Events:** `input`, `change`, `select`, `focus`, `blur`, `keydown`