scb-wc 0.1.128 → 0.1.129
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/README.md +22 -41
- package/all.js +6 -0
- package/blazor/ScbBlazorInteropBase.cs +65 -0
- package/blazor/scb-blazor-bridge.js +46 -0
- package/fonts/material-symbols-outlined/files/material-symbols-outlined-subset.woff2 +0 -0
- package/icons.json +11 -3
- package/index.js +95 -89
- package/mvc/components/all.js +6 -0
- package/mvc/components/scb-accordion/scb-accordion-item.js +2 -1
- package/mvc/components/scb-accordion/scb-accordion.js +7 -7
- package/mvc/components/scb-app-bar/scb-app-bar.js +11 -11
- package/mvc/components/scb-badge/scb-badge.js +5 -5
- package/mvc/components/scb-breadcrumb/scb-breadcrumb-item.js +2 -2
- package/mvc/components/scb-breadcrumb/scb-breadcrumb.js +7 -7
- package/mvc/components/scb-button/scb-button.js +4 -4
- package/mvc/components/scb-calendar/scb-calendar.js +35 -27
- package/mvc/components/scb-calendar-card/scb-calendar-card.js +5 -5
- package/mvc/components/scb-card/scb-card.js +29 -29
- package/mvc/components/scb-checkbox/scb-checkbox.js +19 -13
- package/mvc/{vendor → components/scb-chevron}/scb-chevron.js +1 -1
- package/mvc/components/scb-chip/scb-chip.js +2 -2
- package/mvc/components/scb-collapse/scb-collapse.js +13 -9
- package/mvc/components/scb-datepicker/scb-datepicker.js +132 -0
- package/mvc/components/scb-dialog/scb-dialog.js +16 -16
- package/mvc/components/scb-drawer/scb-drawer.js +5 -4
- package/mvc/components/scb-drop-zone/scb-drop-zone.js +39 -30
- package/mvc/components/scb-dropdown/scb-dropdown.js +4 -2
- package/mvc/components/scb-fab/scb-fab.js +10 -9
- package/mvc/components/scb-fact-card/scb-fact-card.js +3 -2
- package/mvc/components/scb-footer/scb-footer.js +13 -13
- package/mvc/components/scb-form-error-summary/scb-form-error-summary.js +24 -0
- package/mvc/components/scb-gallery-grid/scb-gallery-grid.js +14 -9
- package/mvc/components/scb-header/scb-header-menu-group.js +1 -1
- package/mvc/components/scb-header/scb-header-menu-item.js +1 -1
- package/mvc/components/scb-header/scb-header-tab.js +1 -1
- package/mvc/components/scb-header/scb-header.js +25 -25
- package/mvc/components/scb-horizontal-scroller/scb-horizontal-scroller.js +10 -10
- package/mvc/components/scb-icon-button/scb-icon-button.js +5 -5
- package/mvc/components/scb-keyfigure-card/scb-keyfigure-card.js +6 -6
- package/mvc/components/scb-link/scb-link.js +2 -2
- package/mvc/components/scb-list/scb-list-item.js +14 -6
- package/mvc/components/scb-list/scb-list.js +2 -2
- package/mvc/components/scb-menu/scb-menu-item.js +16 -16
- package/mvc/components/scb-menu/scb-menu.js +6 -6
- package/mvc/components/scb-nav/scb-nav.js +5 -5
- package/mvc/components/scb-notification-card/scb-notification-card.js +7 -7
- package/mvc/components/scb-options-menu/scb-options-menu-item.js +3 -3
- package/mvc/components/scb-options-menu/scb-options-menu.js +2 -2
- package/mvc/components/scb-overlay/scb-overlay.js +5 -5
- package/mvc/components/scb-pagination/scb-pagination.js +56 -90
- package/mvc/components/scb-progress-indicator/scb-progress-indicator.js +4 -4
- package/mvc/components/scb-progress-stepper/scb-progress-step.js +14 -9
- package/mvc/components/scb-progress-stepper/scb-progress-stepper.js +14 -8
- package/mvc/components/scb-radio-button/scb-radio-group.js +11 -4
- package/mvc/components/scb-search/scb-search.js +13 -9
- package/mvc/components/scb-segmented-button/scb-segmented-item.js +1 -1
- package/mvc/components/scb-select/scb-select-option.js +3 -3
- package/mvc/components/scb-select/scb-select.js +33 -12
- package/mvc/components/scb-skeleton/scb-skeleton.js +2 -2
- package/mvc/components/scb-slider/scb-slider.js +55 -48
- package/mvc/components/scb-snackbar/scb-snackbar.js +21 -7
- package/mvc/components/scb-stepper/scb-step.js +7 -7
- package/mvc/components/scb-stepper/scb-stepper.js +3 -3
- package/mvc/components/scb-switch/scb-switch.js +20 -8
- package/mvc/components/scb-table/scb-table.js +2 -2
- package/mvc/components/scb-table-advanced/scb-table-advanced.js +5 -5
- package/mvc/components/scb-textfield/scb-textfield.js +35 -152
- package/mvc/components/scb-toc/scb-toc-item.js +5 -4
- package/mvc/components/scb-toc/scb-toc.js +7 -5
- package/mvc/components/scb-tooltip/scb-tooltip.js +1 -1
- package/mvc/components/scb-viz/scb-viz.js +1 -1
- package/mvc/components/shared/lazy-focus-ring.js +2 -0
- package/mvc/components/shared/lazy-ripple.js +2 -0
- package/mvc/components/shared/scb-icon-svg.js +11 -0
- package/mvc/fonts/material-symbols-outlined/files/material-symbols-outlined-subset.woff2 +0 -0
- package/mvc/scb-blazor-bridge.js +46 -0
- package/mvc/scb-logo.svg +20 -20
- package/mvc/scb-wc-core.css +1 -1
- package/mvc/scb-wc-selfhost.css +1 -1
- package/mvc/scb-wc.css +1 -1
- package/mvc/scb.svg +13 -13
- package/mvc/vendor/scb-card-variants.internal.js +20 -21
- package/mvc/vendor/scb-header-drawer.internal.js +4 -2
- package/package.json +6 -2
- package/scb-accordion/scb-accordion-item.js +1 -0
- package/scb-accordion/scb-accordion.js +12 -3
- package/scb-app-bar/scb-app-bar.js +25 -12
- package/scb-badge/scb-badge.js +23 -23
- package/scb-breadcrumb/scb-breadcrumb-item.js +9 -0
- package/scb-breadcrumb/scb-breadcrumb.js +5 -2
- package/scb-button/scb-button.js +27 -4
- package/scb-calendar/scb-calendar.js +97 -72
- package/scb-calendar-card/scb-calendar-card.js +10 -4
- package/scb-card/scb-card-variants.internal.js +23 -22
- package/scb-card/scb-card.js +72 -38
- package/scb-checkbox/scb-checkbox.js +86 -23
- package/scb-chevron/scb-chevron.js +1 -0
- package/scb-chip/scb-chip.js +15 -6
- package/scb-collapse/scb-collapse.js +26 -9
- package/scb-components/index.d.ts +104 -0
- package/scb-components/scb-accordion/scb-accordion.d.ts +3 -0
- package/scb-components/scb-app-bar/scb-app-bar.d.ts +3 -0
- package/scb-components/scb-breadcrumb/scb-breadcrumb.d.ts +1 -0
- package/scb-components/scb-button/scb-button.d.ts +2 -0
- package/scb-components/scb-calendar/scb-calendar.d.ts +2 -0
- package/scb-components/scb-calendar-card/scb-calendar-card.d.ts +2 -0
- package/scb-components/scb-card/scb-card.d.ts +6 -0
- package/scb-components/scb-checkbox/scb-checkbox.d.ts +10 -0
- package/scb-components/scb-chevron/scb-chevron.d.ts +11 -0
- package/scb-components/scb-collapse/scb-collapse.d.ts +2 -0
- package/scb-components/scb-datepicker/scb-datepicker.d.ts +45 -0
- package/scb-components/scb-dialog/scb-dialog.d.ts +7 -0
- package/scb-components/scb-drawer/scb-drawer.d.ts +8 -1
- package/scb-components/scb-drop-zone/scb-drop-zone.d.ts +49 -0
- package/scb-components/scb-fact-card/scb-fact-card.d.ts +1 -0
- package/scb-components/scb-footer/scb-footer.d.ts +1 -0
- package/scb-components/scb-form-error-summary/scb-form-error-summary.d.ts +22 -0
- package/scb-components/scb-gallery-grid/scb-gallery-grid.d.ts +4 -0
- package/scb-components/scb-header/scb-header-drawer.internal.d.ts +2 -0
- package/scb-components/scb-header/scb-header-menu-item.d.ts +2 -0
- package/scb-components/scb-header/scb-header-tab.d.ts +2 -0
- package/scb-components/scb-header/scb-header.d.ts +6 -0
- package/scb-components/scb-list/scb-list-item.d.ts +3 -0
- package/scb-components/scb-list/scb-list.d.ts +2 -0
- package/scb-components/scb-menu/scb-menu-item.d.ts +7 -0
- package/scb-components/scb-nav/scb-nav.d.ts +2 -0
- package/scb-components/scb-notification-card/scb-notification-card.d.ts +1 -0
- package/scb-components/scb-pagination/scb-pagination.d.ts +6 -0
- package/scb-components/scb-progress-indicator/scb-progress-indicator.d.ts +4 -0
- package/scb-components/scb-progress-stepper/scb-progress-step.d.ts +3 -0
- package/scb-components/scb-progress-stepper/scb-progress-stepper.d.ts +6 -0
- package/scb-components/scb-radio-button/scb-radio-group.d.ts +7 -0
- package/scb-components/scb-search/scb-search.d.ts +9 -0
- package/scb-components/scb-select/scb-select-option.d.ts +1 -0
- package/scb-components/scb-select/scb-select.d.ts +20 -0
- package/scb-components/scb-skeleton/scb-skeleton.d.ts +8 -0
- package/scb-components/scb-slider/scb-slider.d.ts +35 -0
- package/scb-components/scb-snackbar/scb-snackbar.d.ts +2 -0
- package/scb-components/scb-switch/scb-switch.d.ts +11 -0
- package/scb-components/scb-table/scb-table.d.ts +6 -0
- package/scb-components/scb-table-advanced/scb-table-advanced.d.ts +6 -0
- package/scb-components/scb-textfield/scb-textfield.d.ts +12 -0
- package/scb-components/scb-toc/scb-toc-item.d.ts +2 -0
- package/scb-components/scb-toc/scb-toc.d.ts +2 -0
- package/scb-components/scb-tooltip/scb-tooltip.d.ts +5 -0
- package/scb-components/scb-viz/scb-viz.d.ts +1 -1
- package/scb-components/shared/lazy-focus-ring.d.ts +4 -0
- package/scb-components/shared/lazy-ripple.d.ts +9 -0
- package/scb-components/shared/scb-icon-svg.d.ts +3 -0
- package/scb-datepicker/scb-datepicker.js +38 -8
- package/scb-dialog/scb-dialog.js +88 -35
- package/scb-drawer/scb-drawer.js +77 -19
- package/scb-drop-zone/scb-drop-zone.js +187 -52
- package/scb-dropdown/scb-dropdown.js +3 -1
- package/scb-fab/scb-fab.js +1 -0
- package/scb-fact-card/scb-fact-card.js +6 -2
- package/scb-footer/scb-footer.js +30 -25
- package/scb-form-error-summary/scb-form-error-summary.js +151 -0
- package/scb-gallery-grid/scb-gallery-grid.js +79 -35
- package/scb-header/scb-header-drawer.internal.js +2 -0
- package/scb-header/scb-header-menu-group.js +1 -1
- package/scb-header/scb-header-menu-item.js +6 -0
- package/scb-header/scb-header-tab.js +6 -0
- package/scb-header/scb-header.js +35 -15
- package/scb-horizontal-scroller/scb-horizontal-scroller.js +4 -4
- package/scb-link/scb-link.js +10 -0
- package/scb-list/scb-list-item.js +52 -35
- package/scb-list/scb-list.js +21 -11
- package/scb-menu/scb-menu-item.js +53 -13
- package/scb-menu/scb-menu.js +1 -1
- package/scb-nav/scb-nav.js +9 -3
- package/scb-notification-card/scb-notification-card.js +29 -8
- package/scb-options-menu/scb-options-menu-item.js +4 -4
- package/scb-options-menu/scb-options-menu.js +5 -10
- package/scb-overlay/scb-overlay.js +73 -11
- package/scb-pagination/scb-pagination.js +131 -117
- package/scb-progress-indicator/scb-progress-indicator.js +17 -9
- package/scb-progress-stepper/scb-progress-step.js +26 -10
- package/scb-progress-stepper/scb-progress-stepper.js +55 -31
- package/scb-radio-button/scb-radio-group.js +92 -16
- package/scb-search/scb-search.js +104 -16
- package/scb-select/scb-select-option.js +4 -1
- package/scb-select/scb-select.js +235 -71
- package/scb-skeleton/scb-skeleton.js +26 -2
- package/scb-slider/scb-slider.js +162 -29
- package/scb-snackbar/scb-snackbar.js +34 -7
- package/scb-stepper/scb-step.js +12 -5
- package/scb-stepper/scb-stepper.js +4 -4
- package/scb-switch/scb-switch.js +103 -16
- package/scb-table/scb-table.js +53 -16
- package/scb-table-advanced/scb-table-advanced.js +50 -14
- package/scb-textfield/scb-textfield.js +42 -18
- package/scb-toc/scb-toc-item.js +24 -15
- package/scb-toc/scb-toc.js +24 -9
- package/scb-tooltip/scb-tooltip.js +14 -4
- package/scb-viz/scb-viz.js +1 -0
- package/scb-wc-core.css +1 -1
- package/scb-wc-selfhost.css +1 -1
- package/scb-wc.bundle.js +3896 -3341
- package/scb-wc.css +1 -1
- package/scb-wc.d.ts +208 -196
- package/shared/scb-icon-svg.js +5 -2
- package/mvc/vendor/lazy-focus-ring.js +0 -2
- package/mvc/vendor/lazy-ripple.js +0 -2
- package/mvc/vendor/scb-icon-svg.js +0 -11
- package/scb-wc-public-entry/index.d.ts +0 -98
package/README.md
CHANGED
|
@@ -1,6 +1,9 @@
|
|
|
1
|
-
# Om SCB Web Components
|
|
1
|
+
# Om SCB Web Components Preview
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
> ⚠️ **Previewkanal**
|
|
4
|
+
> Installera `scb-wc` via `@next` för komponenter under utveckling. API, utseende och beteende kan ändras eller tas bort mellan versioner.
|
|
5
|
+
|
|
6
|
+
SCB Web Components preview finns för att underlätta skapandet av enhetliga, tillgängliga och användbara webbapplikationer.
|
|
4
7
|
|
|
5
8
|
Komponenterna bygger på:
|
|
6
9
|
- [Lit](https://lit.dev/)
|
|
@@ -8,54 +11,32 @@ Komponenterna bygger på:
|
|
|
8
11
|
|
|
9
12
|
## Storybook och dokumentation (internt)
|
|
10
13
|
|
|
11
|
-
|
|
14
|
+
Previewkomponenterna dokumenteras och demonstreras i Storybook på SCB:s interna testadress:
|
|
12
15
|
|
|
13
|
-
-
|
|
16
|
+
- Test: <https://webcomponentstest.scb.intra>
|
|
14
17
|
|
|
15
|
-
|
|
18
|
+
Den publika/stabila Storybooken finns på:
|
|
16
19
|
|
|
17
|
-
-
|
|
20
|
+
- Prod: <https://webcomponents.scb.intra>
|
|
18
21
|
|
|
19
22
|
---
|
|
20
23
|
|
|
21
24
|
## Kom igång
|
|
22
25
|
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
```sh
|
|
26
|
-
npx scb-wc init html my-app
|
|
27
|
-
npx scb-wc init html-service my-service
|
|
28
|
-
npx scb-wc init react my-react-app
|
|
29
|
-
npx scb-wc init react-service my-react-service
|
|
30
|
-
npx scb-wc init blazor my-blazor-app
|
|
31
|
-
npx scb-wc init blazor-service my-blazor-service
|
|
32
|
-
```
|
|
33
|
-
|
|
34
|
-
Webbplatsmallarna skapar en liten starterapp med:
|
|
35
|
-
- `scb-header`
|
|
36
|
-
- `scb-footer`
|
|
37
|
-
- `scb-grid`
|
|
38
|
-
- några vanliga komponenter
|
|
39
|
-
|
|
40
|
-
Webbtjänstmallarna skapar en starterapp med:
|
|
41
|
-
- `scb-app-bar`
|
|
42
|
-
- `scb-search`
|
|
43
|
-
- `scb-table-advanced`
|
|
44
|
-
- komponenter för actions och status
|
|
45
|
-
|
|
46
|
-
Välj sedan den starter som ligger närmast din app och kör `npm install` i den nya mappen.
|
|
26
|
+
> **Obs:** Kör alla kommandon i mappen där din `package.json` ligger.
|
|
27
|
+
> Har du ingen? Kör `npm init -y` i projektroten (eller annan lämplig mapp).
|
|
47
28
|
|
|
48
|
-
|
|
29
|
+
Installera previewkanalen:
|
|
49
30
|
|
|
50
31
|
```sh
|
|
51
|
-
npm install scb-wc
|
|
32
|
+
npm install scb-wc@next
|
|
52
33
|
```
|
|
53
34
|
|
|
54
35
|
---
|
|
55
36
|
|
|
56
37
|
## Alternativ 1: Använd som ES‑moduler (t.ex. i React, Vue, SPA)
|
|
57
38
|
|
|
58
|
-
Importera CSS och de
|
|
39
|
+
Importera CSS och de testkomponenter du använder (bäst för tree‑shaking):
|
|
59
40
|
|
|
60
41
|
```js
|
|
61
42
|
// Global CSS + tokens (måste bara importeras en gång)
|
|
@@ -121,7 +102,7 @@ För MVC/MPA räcker det normalt att använda `scb-wc-selfhost.css`, eftersom de
|
|
|
121
102
|
|
|
122
103
|
## Alternativ 2: Använd i MVC/MPA via `<script type="module">`
|
|
123
104
|
|
|
124
|
-
Det här läget använder den färdig‑
|
|
105
|
+
Det här läget använder den färdig‑splittade **MVC‑ESM**‑builden som följer med paketet under:
|
|
125
106
|
|
|
126
107
|
```text
|
|
127
108
|
node_modules/scb-wc/mvc/
|
|
@@ -134,7 +115,7 @@ Lägg till i din apps `package.json`:
|
|
|
134
115
|
```jsonc
|
|
135
116
|
{
|
|
136
117
|
"scripts": {
|
|
137
|
-
"ui:install": "node -e \"const fs=require('fs'),p=require('path');const src=p.resolve('node_modules/scb-wc/mvc');if(!fs.existsSync(src)){console.error('Hittar inte '+src+'. Har du kört npm install scb-wc?');process.exit(1);}const start=process.env.INIT_CWD||process.cwd();const ov=process.env.npm_config_ui_wwwroot;function findBase(){if(ov){return p.isAbsolute(ov)?ov:p.resolve(start,ov);}let d=start;while(true){const cand=p.join(d,'wwwroot');if(fs.existsSync(cand)) return cand;const up=p.dirname(d);if(up===d) return p.resolve(start,'wwwroot');d=up;}}const base=findBase();const dst=p.resolve(base,'ui');fs.rmSync(dst,{recursive:true,force:true});fs.mkdirSync(base,{recursive:true});fs.cpSync(src,dst,{recursive:true});console.log('Kopierade '+src+' → '+dst);\""
|
|
118
|
+
"ui:install": "node -e \"const fs=require('fs'),p=require('path');const src=p.resolve('node_modules/scb-wc/mvc');if(!fs.existsSync(src)){console.error('Hittar inte '+src+'. Har du kört npm install scb-wc@next?');process.exit(1);}const start=process.env.INIT_CWD||process.cwd();const ov=process.env.npm_config_ui_wwwroot;function findBase(){if(ov){return p.isAbsolute(ov)?ov:p.resolve(start,ov);}let d=start;while(true){const cand=p.join(d,'wwwroot');if(fs.existsSync(cand)) return cand;const up=p.dirname(d);if(up===d) return p.resolve(start,'wwwroot');d=up;}}const base=findBase();const dst=p.resolve(base,'ui');fs.rmSync(dst,{recursive:true,force:true});fs.mkdirSync(base,{recursive:true});fs.cpSync(src,dst,{recursive:true});console.log('Kopierade '+src+' → '+dst);\""
|
|
138
119
|
}
|
|
139
120
|
}
|
|
140
121
|
```
|
|
@@ -183,7 +164,7 @@ Behöver du en annan webbrotsökväg (t.ex. om din `wwwroot` ligger någon annan
|
|
|
183
164
|
|
|
184
165
|
## Alternativ 3: Bundlad version (IIFE) för äldre miljöer
|
|
185
166
|
|
|
186
|
-
Om ESM inte stöds kan du använda den bundlade varianten från paketroten.
|
|
167
|
+
Om ESM inte stöds kan du använda den bundlade test‑varianten från paketroten.
|
|
187
168
|
Flytta följande tre filer från `node_modules/scb-wc` och använd dem i applikationen:
|
|
188
169
|
|
|
189
170
|
```text
|
|
@@ -208,7 +189,7 @@ Lägg till `scb-compact.css` om sidan ska använda compact-typografi.
|
|
|
208
189
|
|
|
209
190
|
SCB Web Components fungerar även i Blazor‑appar när du vill använda samma komponenter i både MVC/MPA och Blazor.
|
|
210
191
|
|
|
211
|
-
Grundprincipen är
|
|
192
|
+
Grundprincipen är samma som för `scb-wc`:
|
|
212
193
|
|
|
213
194
|
1. Använd MVC‑ESM‑builden (`node_modules/scb-wc/mvc`) och kopiera den till `wwwroot/ui` med `ui:install`.
|
|
214
195
|
2. Ladda `scb-blazor-bridge.js` från `wwwroot/ui` i din Blazor‑layout.
|
|
@@ -221,8 +202,8 @@ Lägg till ett script som kopierar interop-filen från `node_modules` till ditt
|
|
|
221
202
|
```jsonc
|
|
222
203
|
{
|
|
223
204
|
"scripts": {
|
|
224
|
-
"ui:install": "node -e \"const fs=require('fs'),p=require('path');const src=p.resolve('node_modules/scb-wc/mvc');if(!fs.existsSync(src)){console.error('Hittar inte '+src+'. Har du kört npm install scb-wc?');process.exit(1);}const start=process.env.INIT_CWD||process.cwd();const ov=process.env.npm_config_ui_wwwroot;function findBase(){if(ov){return p.isAbsolute(ov)?ov:p.resolve(start,ov);}let d=start;while(true){const cand=p.join(d,'wwwroot');if(fs.existsSync(cand)) return cand;const up=p.dirname(d);if(up===d) return p.resolve(start,'wwwroot');d=up;}}const base=findBase();const dst=p.resolve(base,'ui');fs.rmSync(dst,{recursive:true,force:true});fs.mkdirSync(base,{recursive:true});fs.cpSync(src,dst,{recursive:true});console.log('Kopierade '+src+' → '+dst);\"",
|
|
225
|
-
"ui:blazor:interop": "node -e \"const fs=require('fs'),p=require('path');const start=process.env.INIT_CWD||process.cwd();const src=p.resolve('node_modules/scb-wc/blazor/ScbBlazorInteropBase.cs');if(!fs.existsSync(src)){console.error('Hittar inte '+src+'. Har du kört npm install scb-wc?');process.exit(1);}const dst=p.resolve(start,'ScbBlazor/ScbBlazorInteropBase.cs');fs.mkdirSync(p.dirname(dst),{recursive:true});fs.copyFileSync(src,dst);console.log('Kopierade '+src+' → '+dst);\""
|
|
205
|
+
"ui:install": "node -e \"const fs=require('fs'),p=require('path');const src=p.resolve('node_modules/scb-wc/mvc');if(!fs.existsSync(src)){console.error('Hittar inte '+src+'. Har du kört npm install scb-wc@next?');process.exit(1);}const start=process.env.INIT_CWD||process.cwd();const ov=process.env.npm_config_ui_wwwroot;function findBase(){if(ov){return p.isAbsolute(ov)?ov:p.resolve(start,ov);}let d=start;while(true){const cand=p.join(d,'wwwroot');if(fs.existsSync(cand)) return cand;const up=p.dirname(d);if(up===d) return p.resolve(start,'wwwroot');d=up;}}const base=findBase();const dst=p.resolve(base,'ui');fs.rmSync(dst,{recursive:true,force:true});fs.mkdirSync(base,{recursive:true});fs.cpSync(src,dst,{recursive:true});console.log('Kopierade '+src+' → '+dst);\"",
|
|
206
|
+
"ui:blazor:interop": "node -e \"const fs=require('fs'),p=require('path');const start=process.env.INIT_CWD||process.cwd();const src=p.resolve('node_modules/scb-wc/blazor/ScbBlazorInteropBase.cs');if(!fs.existsSync(src)){console.error('Hittar inte '+src+'. Har du kört npm install scb-wc@next?');process.exit(1);}const dst=p.resolve(start,'ScbBlazor/ScbBlazorInteropBase.cs');fs.mkdirSync(p.dirname(dst),{recursive:true});fs.copyFileSync(src,dst);console.log('Kopierade '+src+' → '+dst);\""
|
|
226
207
|
}
|
|
227
208
|
}
|
|
228
209
|
```
|
|
@@ -236,13 +217,13 @@ Exempel på layout:
|
|
|
236
217
|
<script type="module" src="~/ui/scb-blazor-bridge.js"></script>
|
|
237
218
|
```
|
|
238
219
|
|
|
239
|
-
`ScbBlazorInteropBase` kan
|
|
220
|
+
`ScbBlazorInteropBase` är samma bas‑klass i preview- och public-kanalen. Du kan därför dela samma C#‑fil mellan projekt som använder `scb-wc@next` och `scb-wc@latest`.
|
|
240
221
|
|
|
241
222
|
---
|
|
242
223
|
|
|
243
224
|
## Viktigt
|
|
244
225
|
|
|
245
|
-
- `scb-wc@
|
|
226
|
+
- `scb-wc@next` är **previewkanalen**. Komponenter kan ändras eller tas bort mellan versioner. Använd `scb-wc@latest` i externa produktionsmiljöer.
|
|
246
227
|
- **Kör kommandon i mappen med din `package.json`.** Placeringen av `package.json` styr standardmål för `ui:install` (rot → `wwwroot/ui`, `ClientApp/` → använd `--ui_wwwroot=../wwwroot`).
|
|
247
228
|
- **Blanda inte MVC‑ESM och IIFE på samma sida.** Välj en distributionsform per sida/app.
|
|
248
229
|
- **Blazor:** Se till att `scb-blazor-bridge.js` laddas efter att komponent‑JS:et finns på sidan, och att `ScbBlazorInteropBase` inte dupliceras i flera namespaces i samma lösning.
|
package/all.js
CHANGED
|
@@ -18,10 +18,12 @@ import './scb-card/scb-list-card.js';
|
|
|
18
18
|
import './scb-card/scb-social-card.js';
|
|
19
19
|
import './scb-checkbox/scb-checkbox-group.js';
|
|
20
20
|
import './scb-checkbox/scb-checkbox.js';
|
|
21
|
+
import './scb-chevron/scb-chevron.js';
|
|
21
22
|
import './scb-chip/scb-chip.js';
|
|
22
23
|
import './scb-collapse/scb-collapse.js';
|
|
23
24
|
import './scb-container-card/scb-container-card.js';
|
|
24
25
|
import './scb-cookies-consent/scb-cookies-consent.js';
|
|
26
|
+
import './scb-datepicker/scb-datepicker.js';
|
|
25
27
|
import './scb-dialog/scb-dialog.js';
|
|
26
28
|
import './scb-divider/scb-divider.js';
|
|
27
29
|
import './scb-drawer/scb-drawer.js';
|
|
@@ -32,6 +34,7 @@ import './scb-fact-card/scb-fact-card-content.js';
|
|
|
32
34
|
import './scb-fact-card/scb-fact-card.js';
|
|
33
35
|
import './scb-footer/scb-footer-section.js';
|
|
34
36
|
import './scb-footer/scb-footer.js';
|
|
37
|
+
import './scb-form-error-summary/scb-form-error-summary.js';
|
|
35
38
|
import './scb-gallery-grid/scb-gallery-grid.js';
|
|
36
39
|
import './scb-grid/scb-grid-item.js';
|
|
37
40
|
import './scb-grid/scb-grid.js';
|
|
@@ -96,3 +99,6 @@ import './scb-viz/scb-viz-series-differentiation-registry.js';
|
|
|
96
99
|
import './scb-viz/scb-viz-series-differentiation-runtime.js';
|
|
97
100
|
import './scb-viz/scb-viz-table-runtime.js';
|
|
98
101
|
import './scb-viz/scb-viz.js';
|
|
102
|
+
import './shared/lazy-focus-ring.js';
|
|
103
|
+
import './shared/lazy-ripple.js';
|
|
104
|
+
import './shared/scb-icon-svg.js';
|
|
@@ -203,6 +203,9 @@ namespace ScbBlazor
|
|
|
203
203
|
// Alla länkar (scb-link) på sidan
|
|
204
204
|
protected LinkState[] Links { get; private set; } = Array.Empty<LinkState>();
|
|
205
205
|
|
|
206
|
+
// Alla felöversikter (scb-form-error-summary) på sidan
|
|
207
|
+
protected FormErrorSummaryState[] FormErrorSummaries { get; private set; } = Array.Empty<FormErrorSummaryState>();
|
|
208
|
+
|
|
206
209
|
|
|
207
210
|
// Alla avatars (scb-avatar) på sidan
|
|
208
211
|
protected AvatarState[] Avatars { get; private set; } = Array.Empty<AvatarState>();
|
|
@@ -1308,6 +1311,7 @@ namespace ScbBlazor
|
|
|
1308
1311
|
Value = dto.Value ?? string.Empty,
|
|
1309
1312
|
Label = dto.Label ?? string.Empty,
|
|
1310
1313
|
SupportingText = dto.SupportingText ?? string.Empty,
|
|
1314
|
+
HelpText = dto.HelpText ?? string.Empty,
|
|
1311
1315
|
Error = dto.Error,
|
|
1312
1316
|
Name = dto.Name ?? string.Empty,
|
|
1313
1317
|
Id = dto.Id ?? string.Empty
|
|
@@ -1378,6 +1382,9 @@ namespace ScbBlazor
|
|
|
1378
1382
|
selects[i] = new SelectState
|
|
1379
1383
|
{
|
|
1380
1384
|
Id = dto.Id ?? string.Empty,
|
|
1385
|
+
Label = dto.Label ?? string.Empty,
|
|
1386
|
+
SupportingText = dto.SupportingText ?? string.Empty,
|
|
1387
|
+
HelpText = dto.HelpText ?? string.Empty,
|
|
1381
1388
|
Variant = dto.Variant ?? string.Empty,
|
|
1382
1389
|
Open = dto.Open,
|
|
1383
1390
|
Value = dto.Value ?? string.Empty,
|
|
@@ -1616,6 +1623,32 @@ namespace ScbBlazor
|
|
|
1616
1623
|
Links = Array.Empty<LinkState>();
|
|
1617
1624
|
}
|
|
1618
1625
|
|
|
1626
|
+
// Form error summaries
|
|
1627
|
+
if (state.FormErrorSummaries is not null && state.FormErrorSummaries.Length > 0)
|
|
1628
|
+
{
|
|
1629
|
+
var summaries = new FormErrorSummaryState[state.FormErrorSummaries.Length];
|
|
1630
|
+
for (var i = 0; i < state.FormErrorSummaries.Length; i++)
|
|
1631
|
+
{
|
|
1632
|
+
var dto = state.FormErrorSummaries[i];
|
|
1633
|
+
summaries[i] = new FormErrorSummaryState
|
|
1634
|
+
{
|
|
1635
|
+
Heading = dto.Heading ?? string.Empty,
|
|
1636
|
+
HeadingLevel = dto.HeadingLevel ?? string.Empty,
|
|
1637
|
+
Spacing = dto.Spacing ?? string.Empty,
|
|
1638
|
+
SpacingTop = dto.SpacingTop ?? string.Empty,
|
|
1639
|
+
SpacingBottom = dto.SpacingBottom ?? string.Empty,
|
|
1640
|
+
SpacingLeft = dto.SpacingLeft ?? string.Empty,
|
|
1641
|
+
SpacingRight = dto.SpacingRight ?? string.Empty
|
|
1642
|
+
};
|
|
1643
|
+
}
|
|
1644
|
+
|
|
1645
|
+
FormErrorSummaries = summaries;
|
|
1646
|
+
}
|
|
1647
|
+
else
|
|
1648
|
+
{
|
|
1649
|
+
FormErrorSummaries = Array.Empty<FormErrorSummaryState>();
|
|
1650
|
+
}
|
|
1651
|
+
|
|
1619
1652
|
// Avatars
|
|
1620
1653
|
if (state.Avatars is not null && state.Avatars.Length > 0)
|
|
1621
1654
|
{
|
|
@@ -3235,6 +3268,7 @@ namespace ScbBlazor
|
|
|
3235
3268
|
public string Value { get; set; } = string.Empty;
|
|
3236
3269
|
public string Label { get; set; } = string.Empty;
|
|
3237
3270
|
public string SupportingText { get; set; } = string.Empty;
|
|
3271
|
+
public string HelpText { get; set; } = string.Empty;
|
|
3238
3272
|
public bool Error { get; set; }
|
|
3239
3273
|
public string Name { get; set; } = string.Empty;
|
|
3240
3274
|
public string Id { get; set; } = string.Empty;
|
|
@@ -3263,6 +3297,9 @@ namespace ScbBlazor
|
|
|
3263
3297
|
protected sealed class SelectState
|
|
3264
3298
|
{
|
|
3265
3299
|
public string Id { get; set; } = string.Empty;
|
|
3300
|
+
public string Label { get; set; } = string.Empty;
|
|
3301
|
+
public string SupportingText { get; set; } = string.Empty;
|
|
3302
|
+
public string HelpText { get; set; } = string.Empty;
|
|
3266
3303
|
public string Variant { get; set; } = string.Empty;
|
|
3267
3304
|
public bool Open { get; set; }
|
|
3268
3305
|
public string Value { get; set; } = string.Empty;
|
|
@@ -3371,6 +3408,17 @@ namespace ScbBlazor
|
|
|
3371
3408
|
public string Text { get; set; } = string.Empty;
|
|
3372
3409
|
}
|
|
3373
3410
|
|
|
3411
|
+
protected sealed class FormErrorSummaryState
|
|
3412
|
+
{
|
|
3413
|
+
public string Heading { get; set; } = string.Empty;
|
|
3414
|
+
public string HeadingLevel { get; set; } = string.Empty;
|
|
3415
|
+
public string Spacing { get; set; } = string.Empty;
|
|
3416
|
+
public string SpacingTop { get; set; } = string.Empty;
|
|
3417
|
+
public string SpacingBottom { get; set; } = string.Empty;
|
|
3418
|
+
public string SpacingLeft { get; set; } = string.Empty;
|
|
3419
|
+
public string SpacingRight { get; set; } = string.Empty;
|
|
3420
|
+
}
|
|
3421
|
+
|
|
3374
3422
|
|
|
3375
3423
|
protected sealed class AvatarState
|
|
3376
3424
|
{
|
|
@@ -3638,6 +3686,8 @@ namespace ScbBlazor
|
|
|
3638
3686
|
|
|
3639
3687
|
public LinkDto[] Links { get; set; } = Array.Empty<LinkDto>();
|
|
3640
3688
|
|
|
3689
|
+
public FormErrorSummaryDto[] FormErrorSummaries { get; set; } = Array.Empty<FormErrorSummaryDto>();
|
|
3690
|
+
|
|
3641
3691
|
public AvatarDto[] Avatars { get; set; } = Array.Empty<AvatarDto>();
|
|
3642
3692
|
|
|
3643
3693
|
public BadgeDto[] Badges { get; set; } = Array.Empty<BadgeDto>();
|
|
@@ -4105,6 +4155,7 @@ namespace ScbBlazor
|
|
|
4105
4155
|
public string? Value { get; set; }
|
|
4106
4156
|
public string? Label { get; set; }
|
|
4107
4157
|
public string? SupportingText { get; set; }
|
|
4158
|
+
public string? HelpText { get; set; }
|
|
4108
4159
|
public bool Error { get; set; }
|
|
4109
4160
|
public string? Name { get; set; }
|
|
4110
4161
|
public string? Id { get; set; }
|
|
@@ -4133,6 +4184,9 @@ namespace ScbBlazor
|
|
|
4133
4184
|
private sealed class SelectDto
|
|
4134
4185
|
{
|
|
4135
4186
|
public string? Id { get; set; }
|
|
4187
|
+
public string? Label { get; set; }
|
|
4188
|
+
public string? SupportingText { get; set; }
|
|
4189
|
+
public string? HelpText { get; set; }
|
|
4136
4190
|
public string? Variant { get; set; }
|
|
4137
4191
|
public bool Open { get; set; }
|
|
4138
4192
|
public string? Value { get; set; }
|
|
@@ -4223,6 +4277,17 @@ namespace ScbBlazor
|
|
|
4223
4277
|
public string? Text { get; set; }
|
|
4224
4278
|
}
|
|
4225
4279
|
|
|
4280
|
+
private sealed class FormErrorSummaryDto
|
|
4281
|
+
{
|
|
4282
|
+
public string? Heading { get; set; }
|
|
4283
|
+
public string? HeadingLevel { get; set; }
|
|
4284
|
+
public string? Spacing { get; set; }
|
|
4285
|
+
public string? SpacingTop { get; set; }
|
|
4286
|
+
public string? SpacingBottom { get; set; }
|
|
4287
|
+
public string? SpacingLeft { get; set; }
|
|
4288
|
+
public string? SpacingRight { get; set; }
|
|
4289
|
+
}
|
|
4290
|
+
|
|
4226
4291
|
private sealed class ButtonDto
|
|
4227
4292
|
{
|
|
4228
4293
|
public string? Variant { get; set; }
|
|
@@ -1978,6 +1978,7 @@ window.SCBBlazor.getState = function (root) {
|
|
|
1978
1978
|
const buttons = ctx.querySelectorAll('scb-button');
|
|
1979
1979
|
const chips = ctx.querySelectorAll('scb-chip');
|
|
1980
1980
|
const links = ctx.querySelectorAll('scb-link');
|
|
1981
|
+
const formErrorSummaries = ctx.querySelectorAll('scb-form-error-summary');
|
|
1981
1982
|
const subMenus = ctx.querySelectorAll('scb-options-sub-menu');
|
|
1982
1983
|
const avatars = ctx.querySelectorAll('scb-avatar');
|
|
1983
1984
|
const badges = ctx.querySelectorAll('scb-badge');
|
|
@@ -3084,6 +3085,12 @@ window.SCBBlazor.getState = function (root) {
|
|
|
3084
3085
|
''
|
|
3085
3086
|
).toString();
|
|
3086
3087
|
|
|
3088
|
+
const helpText = (
|
|
3089
|
+
anyTf.helpText ??
|
|
3090
|
+
tf.getAttribute('help-text') ??
|
|
3091
|
+
''
|
|
3092
|
+
).toString();
|
|
3093
|
+
|
|
3087
3094
|
const error =
|
|
3088
3095
|
typeof anyTf.error === 'boolean'
|
|
3089
3096
|
? anyTf.error
|
|
@@ -3105,6 +3112,7 @@ window.SCBBlazor.getState = function (root) {
|
|
|
3105
3112
|
value,
|
|
3106
3113
|
label,
|
|
3107
3114
|
supportingText,
|
|
3115
|
+
helpText,
|
|
3108
3116
|
error,
|
|
3109
3117
|
name,
|
|
3110
3118
|
id,
|
|
@@ -3187,6 +3195,17 @@ window.SCBBlazor.getState = function (root) {
|
|
|
3187
3195
|
|
|
3188
3196
|
const selectsState = Array.from(selects).map((sel) => {
|
|
3189
3197
|
const anySel = sel;
|
|
3198
|
+
const label = (anySel.label ?? sel.getAttribute('label') ?? '').toString();
|
|
3199
|
+
const supportingText = (
|
|
3200
|
+
anySel.supportingText ??
|
|
3201
|
+
sel.getAttribute('supporting-text') ??
|
|
3202
|
+
''
|
|
3203
|
+
).toString();
|
|
3204
|
+
const helpText = (
|
|
3205
|
+
anySel.helpText ??
|
|
3206
|
+
sel.getAttribute('help-text') ??
|
|
3207
|
+
''
|
|
3208
|
+
).toString();
|
|
3190
3209
|
const variant = (anySel.variant ?? sel.getAttribute('variant') ?? '').toString();
|
|
3191
3210
|
const open =
|
|
3192
3211
|
typeof anySel.open === 'boolean' ? anySel.open : sel.hasAttribute('open');
|
|
@@ -3201,6 +3220,9 @@ window.SCBBlazor.getState = function (root) {
|
|
|
3201
3220
|
|
|
3202
3221
|
return {
|
|
3203
3222
|
id: sel.id || '',
|
|
3223
|
+
label,
|
|
3224
|
+
supportingText,
|
|
3225
|
+
helpText,
|
|
3204
3226
|
variant,
|
|
3205
3227
|
open: !!open,
|
|
3206
3228
|
value,
|
|
@@ -3883,6 +3905,29 @@ window.SCBBlazor.getState = function (root) {
|
|
|
3883
3905
|
};
|
|
3884
3906
|
});
|
|
3885
3907
|
|
|
3908
|
+
// Alla scb-form-error-summary på sidan
|
|
3909
|
+
const formErrorSummariesState = Array.from(formErrorSummaries).map((summary) => {
|
|
3910
|
+
const anySummary = summary;
|
|
3911
|
+
|
|
3912
|
+
const heading = (anySummary.heading ?? summary.getAttribute('heading') ?? '').toString();
|
|
3913
|
+
const headingLevel = (anySummary.headingLevel ?? summary.getAttribute('heading-level') ?? '').toString();
|
|
3914
|
+
const spacing = (anySummary.spacing ?? summary.getAttribute('spacing') ?? '').toString();
|
|
3915
|
+
const spacingTop = (anySummary.spacingTop ?? summary.getAttribute('spacing-top') ?? '').toString();
|
|
3916
|
+
const spacingBottom = (anySummary.spacingBottom ?? summary.getAttribute('spacing-bottom') ?? '').toString();
|
|
3917
|
+
const spacingLeft = (anySummary.spacingLeft ?? summary.getAttribute('spacing-left') ?? '').toString();
|
|
3918
|
+
const spacingRight = (anySummary.spacingRight ?? summary.getAttribute('spacing-right') ?? '').toString();
|
|
3919
|
+
|
|
3920
|
+
return {
|
|
3921
|
+
heading,
|
|
3922
|
+
headingLevel,
|
|
3923
|
+
spacing,
|
|
3924
|
+
spacingTop,
|
|
3925
|
+
spacingBottom,
|
|
3926
|
+
spacingLeft,
|
|
3927
|
+
spacingRight,
|
|
3928
|
+
};
|
|
3929
|
+
});
|
|
3930
|
+
|
|
3886
3931
|
// Alla scb-avatar på sidan
|
|
3887
3932
|
const avatarsState = Array.from(avatars).map((av) => {
|
|
3888
3933
|
const anyAv = av;
|
|
@@ -4233,6 +4278,7 @@ window.SCBBlazor.getState = function (root) {
|
|
|
4233
4278
|
buttons: buttonsState,
|
|
4234
4279
|
chips: chipsState,
|
|
4235
4280
|
links: linksState,
|
|
4281
|
+
formErrorSummaries: formErrorSummariesState,
|
|
4236
4282
|
avatars: avatarsState,
|
|
4237
4283
|
badges: badgesState,
|
|
4238
4284
|
iconButtons: iconButtonsState,
|
|
Binary file
|
package/icons.json
CHANGED
|
@@ -26,12 +26,14 @@
|
|
|
26
26
|
"refresh",
|
|
27
27
|
"print",
|
|
28
28
|
"group",
|
|
29
|
+
"groups",
|
|
29
30
|
"person_add",
|
|
30
31
|
"person",
|
|
31
32
|
"download",
|
|
32
33
|
"mobile_arrow_down",
|
|
33
34
|
"upload",
|
|
34
35
|
"mail",
|
|
36
|
+
"email",
|
|
35
37
|
"calendar_month",
|
|
36
38
|
"calendar_today",
|
|
37
39
|
"volume_up",
|
|
@@ -77,6 +79,7 @@
|
|
|
77
79
|
"style",
|
|
78
80
|
"restore",
|
|
79
81
|
"payment",
|
|
82
|
+
"payments",
|
|
80
83
|
"shopping_cart",
|
|
81
84
|
"list",
|
|
82
85
|
"ballot",
|
|
@@ -88,6 +91,8 @@
|
|
|
88
91
|
"data_table",
|
|
89
92
|
"share",
|
|
90
93
|
"home",
|
|
94
|
+
"query_stats",
|
|
95
|
+
"analytics",
|
|
91
96
|
"arrow_back",
|
|
92
97
|
"arrow_forward",
|
|
93
98
|
"arrow_upward",
|
|
@@ -104,15 +109,18 @@
|
|
|
104
109
|
"event_note",
|
|
105
110
|
"image",
|
|
106
111
|
"language",
|
|
112
|
+
"apps",
|
|
107
113
|
"repeat",
|
|
108
114
|
"insert_chart",
|
|
109
115
|
"insert_chart_filled",
|
|
110
116
|
"leaderboard",
|
|
111
117
|
"article",
|
|
118
|
+
"assignment",
|
|
112
119
|
"reorder",
|
|
113
120
|
"subject",
|
|
114
121
|
"visibility",
|
|
115
122
|
"visibility_off",
|
|
123
|
+
"lock",
|
|
116
124
|
"arrow_right",
|
|
117
125
|
"arrow_drop_down",
|
|
118
126
|
"tune",
|
|
@@ -144,6 +152,7 @@
|
|
|
144
152
|
"filter_alt",
|
|
145
153
|
"open_in_new",
|
|
146
154
|
"search",
|
|
155
|
+
"notifications",
|
|
147
156
|
"support",
|
|
148
157
|
"location_searching",
|
|
149
158
|
"explore",
|
|
@@ -173,8 +182,7 @@
|
|
|
173
182
|
"work",
|
|
174
183
|
"person_4",
|
|
175
184
|
"price_change",
|
|
185
|
+
"trending_up",
|
|
176
186
|
"keyboard_arrow_down",
|
|
177
|
-
"keyboard_arrow_up"
|
|
178
|
-
"stop",
|
|
179
|
-
"pause"
|
|
187
|
+
"keyboard_arrow_up"
|
|
180
188
|
]
|