scb-wc-test 0.1.1

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 (178) hide show
  1. package/README.md +130 -0
  2. package/all.js +54 -0
  3. package/dummy.png +0 -0
  4. package/index.d.ts +54 -0
  5. package/index.js +108 -0
  6. package/mvc/components/all.js +53 -0
  7. package/mvc/components/scb-accordion/scb-accordion-item.js +194 -0
  8. package/mvc/components/scb-accordion/scb-accordion.js +5 -0
  9. package/mvc/components/scb-app-bar/scb-app-bar.js +144 -0
  10. package/mvc/components/scb-avatar/scb-avatar.js +99 -0
  11. package/mvc/components/scb-breadcrumb/scb-breadcrumb-item.js +17 -0
  12. package/mvc/components/scb-breadcrumb/scb-breadcrumb.js +52 -0
  13. package/mvc/components/scb-button/scb-button.js +121 -0
  14. package/mvc/components/scb-calendar-card/scb-calendar-card.js +140 -0
  15. package/mvc/components/scb-card/scb-card.js +256 -0
  16. package/mvc/components/scb-checkbox/scb-checkbox-group.js +33 -0
  17. package/mvc/components/scb-checkbox/scb-checkbox.js +99 -0
  18. package/mvc/components/scb-chips/scb-chip.js +46 -0
  19. package/mvc/components/scb-dialog/scb-dialog.js +158 -0
  20. package/mvc/components/scb-divider/scb-divider.js +53 -0
  21. package/mvc/components/scb-drawer/scb-drawer-item.js +114 -0
  22. package/mvc/components/scb-drawer/scb-drawer-section.js +19 -0
  23. package/mvc/components/scb-drawer/scb-drawer.js +79 -0
  24. package/mvc/components/scb-drawer/scb-sub-drawer.js +10 -0
  25. package/mvc/components/scb-fact-card/scb-fact-card-content.js +44 -0
  26. package/mvc/components/scb-fact-card/scb-fact-card.js +66 -0
  27. package/mvc/components/scb-footer/scb-footer-section.js +3 -0
  28. package/mvc/components/scb-footer/scb-footer.js +205 -0
  29. package/mvc/components/scb-grid/scb-grid-item.js +9 -0
  30. package/mvc/components/scb-grid/scb-grid.js +81 -0
  31. package/mvc/components/scb-grid/scb-stack.js +16 -0
  32. package/mvc/components/scb-header/scb-header-drawer-group.js +1 -0
  33. package/mvc/components/scb-header/scb-header-drawer-item.js +1 -0
  34. package/mvc/components/scb-header/scb-header-tab.js +1 -0
  35. package/mvc/components/scb-header/scb-header-utility.js +1 -0
  36. package/mvc/components/scb-header/scb-header.js +240 -0
  37. package/mvc/components/scb-icon-button/scb-icon-button.js +95 -0
  38. package/mvc/components/scb-keyfigure-card/scb-keyfigure-card.js +69 -0
  39. package/mvc/components/scb-link/scb-link.js +31 -0
  40. package/mvc/components/scb-list/scb-list-item.js +38 -0
  41. package/mvc/components/scb-list/scb-list.js +10 -0
  42. package/mvc/components/scb-menu/scb-menu-item.js +44 -0
  43. package/mvc/components/scb-menu/scb-menu.js +17 -0
  44. package/mvc/components/scb-menu/scb-sub-menu.js +29 -0
  45. package/mvc/components/scb-notification/scb-notification.js +120 -0
  46. package/mvc/components/scb-progress-indicator/scb-progress-indicator.js +84 -0
  47. package/mvc/components/scb-radio-button/scb-radio-button.js +95 -0
  48. package/mvc/components/scb-radio-button/scb-radio-group.js +28 -0
  49. package/mvc/components/scb-search/scb-search.js +211 -0
  50. package/mvc/components/scb-snackbar/scb-snackbar.js +83 -0
  51. package/mvc/components/scb-status-pill/scb-status-pill.js +31 -0
  52. package/mvc/components/scb-switch/scb-switch.js +54 -0
  53. package/mvc/components/scb-tabs/scb-primary-tab.js +7 -0
  54. package/mvc/components/scb-tabs/scb-secondary-tab.js +7 -0
  55. package/mvc/components/scb-tabs/scb-tabs.js +23 -0
  56. package/mvc/components/scb-textfield/scb-textfield.js +135 -0
  57. package/mvc/components/scb-toc/scb-toc-item.js +84 -0
  58. package/mvc/components/scb-toc/scb-toc.js +6 -0
  59. package/mvc/components/scb-tooltip/scb-tooltip.js +216 -0
  60. package/mvc/scb-logo.svg +21 -0
  61. package/mvc/scb-wc-test.css +1 -0
  62. package/mvc/scb.svg +14 -0
  63. package/mvc/vendor/preload-helper.js +1 -0
  64. package/mvc/vendor/vendor-lit.js +1 -0
  65. package/mvc/vendor/vendor-material.js +764 -0
  66. package/mvc/vendor/vendor.js +68 -0
  67. package/package.json +248 -0
  68. package/scb-accordion/scb-accordion-item.d.ts +37 -0
  69. package/scb-accordion/scb-accordion-item.js +343 -0
  70. package/scb-accordion/scb-accordion.d.ts +6 -0
  71. package/scb-accordion/scb-accordion.js +33 -0
  72. package/scb-app-bar/scb-app-bar.d.ts +10 -0
  73. package/scb-app-bar/scb-app-bar.js +192 -0
  74. package/scb-avatar/scb-avatar.d.ts +30 -0
  75. package/scb-avatar/scb-avatar.js +169 -0
  76. package/scb-breadcrumb/scb-breadcrumb-item.d.ts +9 -0
  77. package/scb-breadcrumb/scb-breadcrumb-item.js +54 -0
  78. package/scb-breadcrumb/scb-breadcrumb.d.ts +16 -0
  79. package/scb-breadcrumb/scb-breadcrumb.js +105 -0
  80. package/scb-button/scb-button.d.ts +26 -0
  81. package/scb-button/scb-button.js +247 -0
  82. package/scb-calendar-card/scb-calendar-card.d.ts +20 -0
  83. package/scb-calendar-card/scb-calendar-card.js +191 -0
  84. package/scb-card/scb-card.d.ts +24 -0
  85. package/scb-card/scb-card.js +345 -0
  86. package/scb-checkbox/scb-checkbox-group.d.ts +17 -0
  87. package/scb-checkbox/scb-checkbox-group.js +80 -0
  88. package/scb-checkbox/scb-checkbox.d.ts +20 -0
  89. package/scb-checkbox/scb-checkbox.js +157 -0
  90. package/scb-chips/scb-chip.d.ts +24 -0
  91. package/scb-chips/scb-chip.js +150 -0
  92. package/scb-dialog/scb-dialog.d.ts +58 -0
  93. package/scb-dialog/scb-dialog.js +390 -0
  94. package/scb-divider/scb-divider.d.ts +9 -0
  95. package/scb-divider/scb-divider.js +85 -0
  96. package/scb-drawer/scb-drawer-item.d.ts +61 -0
  97. package/scb-drawer/scb-drawer-item.js +220 -0
  98. package/scb-drawer/scb-drawer-section.d.ts +7 -0
  99. package/scb-drawer/scb-drawer-section.js +44 -0
  100. package/scb-drawer/scb-drawer.d.ts +97 -0
  101. package/scb-drawer/scb-drawer.js +258 -0
  102. package/scb-drawer/scb-sub-drawer.d.ts +10 -0
  103. package/scb-drawer/scb-sub-drawer.js +43 -0
  104. package/scb-fact-card/scb-fact-card-content.d.ts +10 -0
  105. package/scb-fact-card/scb-fact-card-content.js +83 -0
  106. package/scb-fact-card/scb-fact-card.d.ts +15 -0
  107. package/scb-fact-card/scb-fact-card.js +110 -0
  108. package/scb-footer/scb-footer-section.d.ts +21 -0
  109. package/scb-footer/scb-footer-section.js +28 -0
  110. package/scb-footer/scb-footer.d.ts +27 -0
  111. package/scb-footer/scb-footer.js +326 -0
  112. package/scb-grid/scb-grid-item.d.ts +28 -0
  113. package/scb-grid/scb-grid-item.js +66 -0
  114. package/scb-grid/scb-grid.d.ts +33 -0
  115. package/scb-grid/scb-grid.js +152 -0
  116. package/scb-grid/scb-stack.d.ts +29 -0
  117. package/scb-grid/scb-stack.js +82 -0
  118. package/scb-header/scb-header-drawer-group.d.ts +13 -0
  119. package/scb-header/scb-header-drawer-group.js +28 -0
  120. package/scb-header/scb-header-drawer-item.d.ts +14 -0
  121. package/scb-header/scb-header-drawer-item.js +31 -0
  122. package/scb-header/scb-header-tab.d.ts +13 -0
  123. package/scb-header/scb-header-tab.js +28 -0
  124. package/scb-header/scb-header-utility.d.ts +14 -0
  125. package/scb-header/scb-header-utility.js +31 -0
  126. package/scb-header/scb-header.d.ts +105 -0
  127. package/scb-header/scb-header.js +618 -0
  128. package/scb-icon-button/scb-icon-button.d.ts +31 -0
  129. package/scb-icon-button/scb-icon-button.js +208 -0
  130. package/scb-keyfigure-card/scb-keyfigure-card.d.ts +13 -0
  131. package/scb-keyfigure-card/scb-keyfigure-card.js +119 -0
  132. package/scb-link/scb-link.d.ts +17 -0
  133. package/scb-link/scb-link.js +74 -0
  134. package/scb-list/scb-list-item.d.ts +32 -0
  135. package/scb-list/scb-list-item.js +144 -0
  136. package/scb-list/scb-list.d.ts +8 -0
  137. package/scb-list/scb-list.js +39 -0
  138. package/scb-logo.svg +21 -0
  139. package/scb-menu/scb-menu-item.d.ts +22 -0
  140. package/scb-menu/scb-menu-item.js +107 -0
  141. package/scb-menu/scb-menu.d.ts +21 -0
  142. package/scb-menu/scb-menu.js +98 -0
  143. package/scb-menu/scb-sub-menu.d.ts +12 -0
  144. package/scb-menu/scb-sub-menu.js +69 -0
  145. package/scb-notification/scb-notification.d.ts +16 -0
  146. package/scb-notification/scb-notification.js +187 -0
  147. package/scb-progress-indicator/scb-progress-indicator.d.ts +11 -0
  148. package/scb-progress-indicator/scb-progress-indicator.js +122 -0
  149. package/scb-radio-button/scb-radio-button.d.ts +19 -0
  150. package/scb-radio-button/scb-radio-button.js +176 -0
  151. package/scb-radio-button/scb-radio-group.d.ts +20 -0
  152. package/scb-radio-button/scb-radio-group.js +81 -0
  153. package/scb-search/scb-search.d.ts +45 -0
  154. package/scb-search/scb-search.js +410 -0
  155. package/scb-snackbar/scb-snackbar.d.ts +17 -0
  156. package/scb-snackbar/scb-snackbar.js +140 -0
  157. package/scb-status-pill/scb-status-pill.d.ts +9 -0
  158. package/scb-status-pill/scb-status-pill.js +62 -0
  159. package/scb-switch/scb-switch.d.ts +21 -0
  160. package/scb-switch/scb-switch.js +111 -0
  161. package/scb-tabs/scb-primary-tab.d.ts +17 -0
  162. package/scb-tabs/scb-primary-tab.js +93 -0
  163. package/scb-tabs/scb-secondary-tab.d.ts +17 -0
  164. package/scb-tabs/scb-secondary-tab.js +97 -0
  165. package/scb-tabs/scb-tabs.d.ts +10 -0
  166. package/scb-tabs/scb-tabs.js +66 -0
  167. package/scb-textfield/scb-textfield.d.ts +41 -0
  168. package/scb-textfield/scb-textfield.js +258 -0
  169. package/scb-toc/scb-toc-item.d.ts +21 -0
  170. package/scb-toc/scb-toc-item.js +196 -0
  171. package/scb-toc/scb-toc.d.ts +6 -0
  172. package/scb-toc/scb-toc.js +27 -0
  173. package/scb-tooltip/scb-tooltip.d.ts +32 -0
  174. package/scb-tooltip/scb-tooltip.js +329 -0
  175. package/scb-wc-test.bundle.js +5429 -0
  176. package/scb-wc-test.css +1 -0
  177. package/scb-wc-test.d.ts +106 -0
  178. package/scb.svg +14 -0
@@ -0,0 +1,390 @@
1
+ import { css as h, LitElement as u, nothing as p, html as d } from "lit";
2
+ import { property as a, customElement as m } from "lit/decorators.js";
3
+ var b = Object.defineProperty, f = Object.getOwnPropertyDescriptor, s = (t, e, r, c) => {
4
+ for (var n = c > 1 ? void 0 : c ? f(e, r) : e, o = t.length - 1, l; o >= 0; o--)
5
+ (l = t[o]) && (n = (c ? l(e, r, n) : l(n)) || n);
6
+ return c && n && b(e, r, n), n;
7
+ };
8
+ let i = class extends u {
9
+ constructor() {
10
+ super(...arguments), this.open = !1, this.inSb = !1, this.scrimClose = !0, this.variant = "basic", this.label = "", this.icon = "", this.supportingText = "", this.okButton = "OK", this.cancelButton = "Avbryt", this.deleteButton = "Delete", this.confirmButton = "Ta bort", this.denyButton = "Avbryt", this.resetButton = "Återställ", this.submitButton = "Spara", this.formId = "", this.formAction = "", this.formMethod = "", this.__lastTriggerEl = null, this.__slotDeps = {
11
+ "SCB-TEXTFIELD": () => import("../scb-textfield/scb-textfield.js"),
12
+ "SCB-CHECKBOX": () => import("../scb-checkbox/scb-checkbox.js"),
13
+ "SCB-RADIO-BUTTON": () => import("../scb-radio-button/scb-radio-button.js"),
14
+ "SCB-SWITCH": () => import("../scb-switch/scb-switch.js"),
15
+ "SCB-CHIP": () => import("../scb-chips/scb-chip.js")
16
+ }, this.__onDocumentClick = (t) => {
17
+ this.__getActionFromEvent(t) === "toggle" && (this.__setOpen(!this.open), t.stopPropagation());
18
+ }, this.__onDocumentKeydown = (t) => {
19
+ this.open && t.key === "Escape" && (this.__fire("esc"), this.__setOpen(!1));
20
+ }, this.__onScrimClick = () => {
21
+ this.scrimClose && (this.__fire("scrim"), this.__setOpen(!1));
22
+ }, this.__onOk = () => {
23
+ this.__fire("ok"), this.__setOpen(!1);
24
+ }, this.__onCancel = () => {
25
+ this.__fire("cancel"), this.__setOpen(!1);
26
+ }, this.__onConfirm = () => {
27
+ this.__fire("confirm"), this.__setOpen(!1);
28
+ }, this.__onDeny = () => {
29
+ this.__fire("deny"), this.__setOpen(!1);
30
+ }, this.__onReset = () => {
31
+ var e, r, c, n;
32
+ (r = (e = this.shadowRoot) == null ? void 0 : e.querySelector("form")) == null || r.reset(), (((n = (c = this.shadowRoot) == null ? void 0 : c.querySelector("slot")) == null ? void 0 : n.assignedElements({ flatten: !0 })) ?? []).forEach((o) => {
33
+ const l = o.tagName;
34
+ l === "SCB-TEXTFIELD" && (o.value = ""), l === "SCB-CHECKBOX" && (o.checked = !1), l === "SCB-RADIO-BUTTON" && (o.checked = !1), l === "SCB-SWITCH" && (o.selected = !1), l === "SCB-CHIP" && (o.selected = !1);
35
+ }), this.__fire("reset");
36
+ }, this.__onSubmit = () => {
37
+ var t, e;
38
+ (e = (t = this.shadowRoot) == null ? void 0 : t.querySelector("form")) == null || e.requestSubmit(), this.__fire("submit"), this.__setOpen(!1);
39
+ }, this.__onKeydownTrap = (t) => {
40
+ if (!this.open || t.key !== "Tab") return;
41
+ const e = Array.from(
42
+ this.shadowRoot.querySelectorAll(
43
+ 'button,[href],input,select,textarea,[tabindex]:not([tabindex="-1"])'
44
+ )
45
+ ).filter((n) => !n.hasAttribute("disabled"));
46
+ if (!e.length) return;
47
+ const r = e[0], c = e[e.length - 1];
48
+ t.shiftKey && document.activeElement === r ? (c.focus(), t.preventDefault()) : !t.shiftKey && document.activeElement === c && (r.focus(), t.preventDefault());
49
+ };
50
+ }
51
+ /* Första uppdatering: se till att knappar/ikoner finns och slottade deps laddas on-demand. */
52
+ async firstUpdated() {
53
+ await import("../scb-button/scb-button.js"), await import("../scb-icon-button/scb-icon-button.js"), this.icon && await import("@material/web/icon/icon.js"), await this.__ensureSlottedDeps();
54
+ }
55
+ /* Ladda underkomponenter som faktiskt används i slotten (prestanda: undvik onödiga imports). */
56
+ async __ensureSlottedDeps() {
57
+ var r;
58
+ const t = (r = this.shadowRoot) == null ? void 0 : r.querySelector("slot");
59
+ if (!t) return;
60
+ const e = async (c) => {
61
+ const n = new Set(c.map((o) => o.tagName));
62
+ for (const o of n) {
63
+ const l = this.__slotDeps[o];
64
+ l && await l();
65
+ }
66
+ };
67
+ await e(t.assignedElements({ flatten: !0 })), t.addEventListener(
68
+ "slotchange",
69
+ async () => e(t.assignedElements({ flatten: !0 }))
70
+ );
71
+ }
72
+ /* Triggers + ESC + fokusåterställning
73
+ – aria-controls="dlg-id" eller data-dialog-toggle="dlg-id" växlar open-state
74
+ – ESC stänger och skickar 'esc'-event
75
+ – minns senaste trigger för att refocus på close
76
+ */
77
+ __getActionFromEvent(t) {
78
+ if (!this.id) return null;
79
+ for (const e of t.composedPath())
80
+ if (e instanceof Element) {
81
+ if (e.getAttribute("data-dialog-toggle") === this.id)
82
+ return this.__lastTriggerEl = e, "toggle";
83
+ if (e.getAttribute("aria-controls") === this.id)
84
+ return this.__lastTriggerEl = e, "toggle";
85
+ }
86
+ return null;
87
+ }
88
+ /* Koppla in global listeners (klick/tangentbord) och focus trap. */
89
+ connectedCallback() {
90
+ super.connectedCallback(), document.addEventListener("click", this.__onDocumentClick, !1), document.addEventListener("keydown", this.__onDocumentKeydown, !0), this.addEventListener("keydown", this.__onKeydownTrap);
91
+ }
92
+ disconnectedCallback() {
93
+ document.removeEventListener("click", this.__onDocumentClick, !1), document.removeEventListener("keydown", this.__onDocumentKeydown, !0), this.removeEventListener("keydown", this.__onKeydownTrap), super.disconnectedCallback();
94
+ }
95
+ /* Reagera på stateändringar (framförallt open):
96
+ – uppdatera aria-expanded på triggers
97
+ – sätt fokus inuti dialogen när den öppnas
98
+ – återställ fokus till triggern när den stängs
99
+ – lås/lås upp sid-scroll (inte i SB-läge)
100
+ */
101
+ updated(t) {
102
+ var e, r;
103
+ if (t.has("open")) {
104
+ const c = t.get("open");
105
+ this.__updateTriggersExpanded(), this.open && !c ? this.updateComplete.then(() => {
106
+ var n, o, l;
107
+ (l = (o = (n = this.shadowRoot) == null ? void 0 : n.querySelector(
108
+ 'button,[href],input,select,textarea,[tabindex]:not([tabindex="-1"])'
109
+ )) == null ? void 0 : o.focus) == null || l.call(o);
110
+ }) : !this.open && c && ((r = (e = this.__lastTriggerEl) == null ? void 0 : e.focus) == null || r.call(e)), this.__toggleScrollLock(this.open);
111
+ }
112
+ t.has("icon") && this.icon && import("@material/web/icon/icon.js");
113
+ }
114
+ /* Håll aria-expanded i synk på alla triggers som pekar på dialogens id. */
115
+ __updateTriggersExpanded() {
116
+ this.id && document.querySelectorAll(`[aria-controls="${this.id}"], [data-dialog-toggle="${this.id}"]`).forEach((t) => {
117
+ t.hasAttribute("aria-controls") && t.setAttribute("aria-expanded", String(this.open));
118
+ });
119
+ }
120
+ /* Sid-scroll låses upp/ner när dialogen är öppen – men aldrig i SB-läge. */
121
+ __toggleScrollLock(t) {
122
+ if (this.inSb) return;
123
+ const e = document.documentElement;
124
+ e.style.overflow = t ? "hidden" : "";
125
+ }
126
+ /* Helpers för att byta state och fire events på ett ställe. */
127
+ __setOpen(t) {
128
+ this.open = t, this.__fire(t ? "open" : "close");
129
+ }
130
+ __fire(t, e) {
131
+ this.dispatchEvent(new CustomEvent(t, { detail: e, bubbles: !0, composed: !0 }));
132
+ }
133
+ /* Helper: avgör om det finns något slottat innehåll (för att välja mellan supportingText/slot). */
134
+ __slotIsEmpty() {
135
+ var e;
136
+ const t = (e = this.shadowRoot) == null ? void 0 : e.querySelector("slot");
137
+ return t ? t.assignedElements({ flatten: !0 }).length === 0 : !0;
138
+ }
139
+ /* Render-delar */
140
+ /* Header: ikon (om satt), titel + ev. stäng-ikon i form/floating. */
141
+ renderHeader(t) {
142
+ const e = this.variant === "form" || this.variant === "floating";
143
+ return d`
144
+ <div class="header">
145
+ <div class="title">
146
+ ${this.icon ? d`<md-icon class="dialog-icon">${this.icon}</md-icon>` : p}
147
+ <div class="label" id=${t}>${this.label}</div>
148
+ </div>
149
+ ${e ? d`<scb-icon-button class="close" icon="close" @click=${this.__onCancel}></scb-icon-button>` : p}
150
+ </div>
151
+ `;
152
+ }
153
+ /* Content för varianter som inte använder form. Faller tillbaka till supportingText om slotten är tom. */
154
+ renderContentDefault(t) {
155
+ const e = this.__slotIsEmpty();
156
+ return d`
157
+ <div class="content" id=${t}>
158
+ ${e && this.supportingText ? d`${this.supportingText}` : d`<slot></slot>`}
159
+ </div>
160
+ `;
161
+ }
162
+ /* Actions längst ned — varierar per variant. */
163
+ renderActions() {
164
+ switch (this.variant) {
165
+ case "alert":
166
+ return d`<div class="actions">
167
+ <scb-button variant="text" label=${this.okButton} @click=${this.__onOk}></scb-button>
168
+ </div>`;
169
+ case "confirm":
170
+ return d`<div class="actions">
171
+ <scb-button variant="text" label=${this.confirmButton} @click=${this.__onConfirm}></scb-button>
172
+ <scb-button variant="text" label=${this.denyButton} @click=${this.__onDeny}></scb-button>
173
+ </div>`;
174
+ case "choose":
175
+ return d`<div class="actions">
176
+ <scb-button variant="text" label=${this.cancelButton} @click=${this.__onCancel}></scb-button>
177
+ <scb-button variant="text" label=${this.okButton} @click=${this.__onOk}></scb-button>
178
+ </div>`;
179
+ case "form":
180
+ return d`<div class="actions">
181
+ <scb-button class="start" variant="text" label=${this.resetButton} @click=${this.__onReset}></scb-button>
182
+ <scb-button variant="text" label=${this.cancelButton} @click=${this.__onCancel}></scb-button>
183
+ <scb-button variant="text" label=${this.submitButton} @click=${this.__onSubmit}></scb-button>
184
+ </div>`;
185
+ case "floating":
186
+ return p;
187
+ default:
188
+ return d`<div class="actions">
189
+ <scb-button variant="text" label=${this.cancelButton} @click=${this.__onCancel}></scb-button>
190
+ <scb-button variant="text" label=${this.okButton} @click=${this.__onOk}></scb-button>
191
+ </div>`;
192
+ }
193
+ }
194
+ /* Body skiljer på form-varianten (wrapper <form>) och övriga. */
195
+ renderBody(t, e) {
196
+ return this.variant === "form" ? d`
197
+ ${this.renderHeader(t)}
198
+ <div class="content" id=${e}>
199
+ <form id=${this.formId} action=${this.formAction} method=${this.formMethod || p}>
200
+ <slot></slot>
201
+ </form>
202
+ </div>
203
+ ${this.renderActions()}
204
+ ` : d`${this.renderHeader(t)} ${this.renderContentDefault(e)} ${this.renderActions()}`;
205
+ }
206
+ /* Root render: role/aria-attribut sätts här för att para ihop titel och beskrivning. */
207
+ render() {
208
+ const t = "dlg-title", e = "dlg-desc";
209
+ return d`
210
+ <div class="scrim" @click=${this.__onScrimClick} aria-hidden="true"></div>
211
+ <div
212
+ class="container"
213
+ role="dialog"
214
+ aria-modal="true"
215
+ aria-labelledby=${t}
216
+ aria-describedby=${e}
217
+ >
218
+ ${this.renderBody(t, e)}
219
+ </div>
220
+ `;
221
+ }
222
+ };
223
+ i.styles = h`
224
+ :host { display:block; position:relative; }
225
+
226
+ .scrim {
227
+ position: var(--scb-dialog-scrim-position, fixed);
228
+ inset: 0;
229
+ /* var från tokens, tonas med opacity via color-mix */
230
+ background: color-mix(in srgb, var(--md-sys-color-scrim) 32%, transparent);
231
+ z-index: var(--z-dialog-scrim, 1000);
232
+ opacity: 1;
233
+ transition: opacity var(--motion-duration-short, 0.25s);
234
+ height: var(--scb-dialog-scrim-height, auto);
235
+ }
236
+
237
+ .container {
238
+ position: var(--scb-dialog-container-position, fixed);
239
+ inset: 50% auto auto 50%;
240
+ transform: translate(-50%, -50%) scale(1);
241
+
242
+ background: var(--md-sys-color-surface);
243
+ color: var(--md-sys-color-on-surface);
244
+
245
+ /* radius mappad till spacing-token som fallback */
246
+ border-radius: var(--scb-dialog-radius, var(--spacing-5, 16px));
247
+
248
+ /* skugga mappad till shadow-token + spacing-tokens */
249
+ box-shadow:
250
+ 0 var(--spacing-1, 2px)
251
+ var(--spacing-5, 16px)
252
+ color-mix(in srgb, var(--md-sys-color-shadow) 20%, transparent);
253
+
254
+ /* width/height via CSS custom props med px-fallback */
255
+ min-width: var(--scb-dialog-min-w, 340px);
256
+ max-width: var(--scb-dialog-max-w, 90vw);
257
+ max-height: var(--scb-dialog-max-h, 90vh);
258
+
259
+ display:flex; flex-direction:column;
260
+
261
+ /* padding mappad till spacing-token */
262
+ padding: var(--scb-dialog-padding, var(--spacing-7, 24px));
263
+
264
+ z-index: var(--z-dialog, 1001);
265
+ opacity: 1;
266
+ transition:
267
+ opacity var(--motion-duration-short, 0.25s),
268
+ transform var(--motion-duration-short, 0.25s);
269
+ }
270
+
271
+ :host(:not([open])) .scrim,
272
+ :host(:not([open])) .container { opacity:0; pointer-events:none; }
273
+
274
+ /* Header: ikon över rubrik */
275
+ .header {
276
+ display:flex;
277
+ align-items:flex-start;
278
+ gap: var(--spacing-4, 12px);
279
+ margin-bottom: var(--spacing-5, 16px);
280
+ }
281
+ .header .title {
282
+ display:flex;
283
+ flex-direction:column; /* ikon ovanför label */
284
+ gap: var(--spacing-3, 8px);
285
+ }
286
+ .header .label {
287
+ /* typografi mappad till md-sys-typescale tokens */
288
+ font-weight: var(--md-sys-typescale-headline-small-weight, 700);
289
+ font-size: var(--md-sys-typescale-headline-small-size, 1.5rem);
290
+ line-height: var(--md-sys-typescale-headline-small-line-height, 2rem);
291
+ }
292
+ .header .close { margin-left:auto; }
293
+
294
+ .dialog-icon {
295
+ inline-size: var(--scb-dialog-icon-size, var(--spacing-7, 24px));
296
+ block-size: var(--scb-dialog-icon-size, var(--spacing-7, 24px));
297
+ }
298
+
299
+ .content {
300
+ flex: 1 1 auto;
301
+ overflow:auto;
302
+ margin-bottom: var(--spacing-5, 16px);
303
+ color: var(--md-sys-color-on-surface-variant);
304
+ }
305
+
306
+ .actions {
307
+ display:flex;
308
+ align-items:center;
309
+ gap: var(--spacing-3, 8px);
310
+ justify-content:flex-end;
311
+ }
312
+ .actions .start { margin-right:auto; }
313
+
314
+ /* Min-bredder per variant (override-ningsbara via CSS custom props) */
315
+ :host([variant="choose"]) .container { --scb-dialog-min-w: var(--scb-dialog-min-w-choose, 280px); }
316
+ :host([variant="alert"]) .container { --scb-dialog-min-w: var(--scb-dialog-min-w-alert, 320px); }
317
+ :host([variant="confirm"]) .container { --scb-dialog-min-w: var(--scb-dialog-min-w-confirm, 360px); }
318
+
319
+ /* Form-layout: enkel kolumn-grid med gap */
320
+ :host([variant="form"]) form{
321
+ display:grid;
322
+ grid-template-columns: 1fr;
323
+ gap: var(--scb-form-gap, var(--spacing-6, 20px)); /* <— token + fallback */
324
+ }
325
+
326
+ :host([variant="floating"]) .container { --scb-dialog-min-w: var(--scb-dialog-min-w-floating, 360px); }
327
+
328
+ /* Choose: gör slottade radios vertikala med spacing */
329
+ :host([variant="choose"]) ::slotted(scb-radio-button) {
330
+ display:block;
331
+ margin-block: var(--scb-choice-gap, 6px);
332
+ }
333
+ `;
334
+ s([
335
+ a({ type: Boolean, reflect: !0 })
336
+ ], i.prototype, "open", 2);
337
+ s([
338
+ a({ type: Boolean, attribute: !1 })
339
+ ], i.prototype, "inSb", 2);
340
+ s([
341
+ a({ type: Boolean, attribute: "scrim-close" })
342
+ ], i.prototype, "scrimClose", 2);
343
+ s([
344
+ a({ type: String })
345
+ ], i.prototype, "variant", 2);
346
+ s([
347
+ a({ type: String })
348
+ ], i.prototype, "label", 2);
349
+ s([
350
+ a({ type: String })
351
+ ], i.prototype, "icon", 2);
352
+ s([
353
+ a({ type: String, attribute: "supporting-text" })
354
+ ], i.prototype, "supportingText", 2);
355
+ s([
356
+ a({ type: String, attribute: "ok-button" })
357
+ ], i.prototype, "okButton", 2);
358
+ s([
359
+ a({ type: String, attribute: "cancel-button" })
360
+ ], i.prototype, "cancelButton", 2);
361
+ s([
362
+ a({ type: String, attribute: "delete-button" })
363
+ ], i.prototype, "deleteButton", 2);
364
+ s([
365
+ a({ type: String, attribute: "confirm-button" })
366
+ ], i.prototype, "confirmButton", 2);
367
+ s([
368
+ a({ type: String, attribute: "deny-button" })
369
+ ], i.prototype, "denyButton", 2);
370
+ s([
371
+ a({ type: String, attribute: "reset-button" })
372
+ ], i.prototype, "resetButton", 2);
373
+ s([
374
+ a({ type: String, attribute: "submit-button" })
375
+ ], i.prototype, "submitButton", 2);
376
+ s([
377
+ a({ type: String, attribute: "form-id" })
378
+ ], i.prototype, "formId", 2);
379
+ s([
380
+ a({ type: String, attribute: "form-action" })
381
+ ], i.prototype, "formAction", 2);
382
+ s([
383
+ a({ type: String, attribute: "form-method" })
384
+ ], i.prototype, "formMethod", 2);
385
+ i = s([
386
+ m("scb-dialog")
387
+ ], i);
388
+ export {
389
+ i as ScbDialog
390
+ };
@@ -0,0 +1,9 @@
1
+ import { LitElement } from 'lit';
2
+
3
+ export declare class ScbDivider extends LitElement {
4
+ variant: 'thin' | 'bold';
5
+ direction: 'horizontal' | 'vertical';
6
+ inset: 'both' | 'start' | 'end';
7
+ static styles: import('lit').CSSResult[];
8
+ render(): import('lit-html').TemplateResult<1>;
9
+ }
@@ -0,0 +1,85 @@
1
+ import { css as d, LitElement as p, html as v } from "lit";
2
+ import { property as c, customElement as h } from "lit/decorators.js";
3
+ var m = Object.defineProperty, b = Object.getOwnPropertyDescriptor, o = (l, i, n, e) => {
4
+ for (var t = e > 1 ? void 0 : e ? b(i, n) : i, s = l.length - 1, a; s >= 0; s--)
5
+ (a = l[s]) && (t = (e ? a(i, n, t) : a(t)) || t);
6
+ return e && t && m(i, n, t), t;
7
+ };
8
+ let r = class extends p {
9
+ constructor() {
10
+ super(...arguments), this.variant = "thin", this.direction = "horizontal", this.inset = "both";
11
+ }
12
+ render() {
13
+ return v`
14
+ <div class="scb-divider"
15
+ variant=${this.variant}
16
+ direction=${this.direction}
17
+ ></div>
18
+ `;
19
+ }
20
+ };
21
+ r.styles = [
22
+ d`
23
+ :host {
24
+ content: '';
25
+ display: block;
26
+ border-top: 1px solid var(--md-sys-color-outline-variant);
27
+ width: 100%;
28
+ }
29
+
30
+ :host([variant="bold"]) {
31
+ border-top: 1px solid var(--md-sys-color-outline);
32
+ }
33
+ :host([direction="vertical"]) {
34
+ border-top: none;
35
+ border-left: 1px solid var(--md-sys-color-outline-variant);
36
+ height: calc(100% - 20px);
37
+ margin: 10px;
38
+ width: 2px;
39
+ }
40
+
41
+ :host([variant="bold"][direction="vertical"]) {
42
+ border-left: 1px solid var(--md-sys-color-outline);
43
+ }
44
+
45
+
46
+ // // // :host([inset="both"]:not([direction="vertical"])) {
47
+ // // // margin: 0 32px;
48
+ // // // }
49
+
50
+ // // // :host([inset="start"]:not([direction="vertical"])) {
51
+ // // // margin-left: 32px;
52
+ // // // }
53
+
54
+ // // // :host([inset="end"]:not([direction="vertical"])) {
55
+ // // // margin-right: 32px;
56
+ // // // }
57
+
58
+ // // // :host([inset="both"][direction="vertical"]) {
59
+ // // // margin: 32px 0;
60
+ // // // }
61
+
62
+ // // // :host([inset="start"][direction="vertical"]) {
63
+ // // // margin-top: 32px;
64
+ // // // }
65
+
66
+ // // // :host([inset="end"][direction="vertical"]) {
67
+ // // // margin-bottom: 32px;
68
+ // // // }
69
+ `
70
+ ];
71
+ o([
72
+ c({ type: String, reflect: !0 })
73
+ ], r.prototype, "variant", 2);
74
+ o([
75
+ c({ type: String, reflect: !0 })
76
+ ], r.prototype, "direction", 2);
77
+ o([
78
+ c({ type: String, reflect: !0 })
79
+ ], r.prototype, "inset", 2);
80
+ r = o([
81
+ h("scb-divider")
82
+ ], r);
83
+ export {
84
+ r as ScbDivider
85
+ };
@@ -0,0 +1,61 @@
1
+ import { LitElement, TemplateResult } from 'lit';
2
+
3
+ /**
4
+ <scb-drawer-item>
5
+
6
+ Ett menyval för <scb-drawer>. Kan vara länk (item-href) eller knapp.
7
+ Funktioner
8
+ — Valbar leading-icon (lazy-loadar md-icon).
9
+ — md-ripple lazy-loadas första gången.
10
+ — Kan innehålla en slottad <scb-sub-drawer> som expanderas/kolapsas.
11
+ — Skickar "scb-drawer-select" när item väljs (bubblar och composed).
12
+ Tillgänglighet
13
+ — När undermeny finns sätts aria-expanded och aria-controls på knappen.
14
+ — selected-reflektion används för visuell markering.
15
+ Tangentbord
16
+ — arrowUp/arrowDown/home/end flyttar fokus mellan syskon-items i menyn.
17
+ — Enter/Space hanteras av respektive native element (knapp/länk).
18
+ */
19
+ export declare class ScbDrawerItem extends LitElement {
20
+ /** Visad text/label. */
21
+ label: string;
22
+ /** Markerad/vald state */
23
+ selected: boolean;
24
+ /** Ikonnamn före label (Material icon glyph). */
25
+ leadingIcon: string;
26
+ /** Om satt blir item en länk (<a>) istället för knapp. */
27
+ itemHref: string;
28
+ /** Om slotten innehåller en <scb-sub-drawer>. */
29
+ private hasSlotContent;
30
+ /** Öppen/stängd undermeny. */
31
+ private expanded;
32
+ /** Stabilt id för aria-controls på knappen som styr undermenyn. */
33
+ private __submenuId;
34
+ private static __rippleLoaded;
35
+ private static __iconLoaded;
36
+ private static __iconButtonLoaded;
37
+ /** Ladda alltid md-ripple, md-icon bara om leadingIcon används. */
38
+ private __ensureDepsLoaded;
39
+ static styles: import('lit').CSSResult;
40
+ /** Håll koll på att slotten endast innehåller <scb-sub-drawer>. */
41
+ private _onSlotChange;
42
+ /** Växla undermeny (om sådan finns); stoppa bubbla så att inte överordnat item fångar klicket. */
43
+ private _toggleExpand;
44
+ /** Skicka ”val”-event uppåt så att <scb-drawer> kan markera selected. */
45
+ private _dispatchSelect;
46
+ /** Klick på knapp-variant: välj och eventuellt expandera undermeny. */
47
+ private _onButtonClick;
48
+ /** Klick på länk-variant: välj (navigering sköts av <a>). */
49
+ private _onLinkClick;
50
+ /** Vid initiering, kolla slotten och lazy-loada depemdencies. */
51
+ firstUpdated(): Promise<void>;
52
+ /** Om leadingIcon sätts i efterhand, se till att md-icon finns. */
53
+ protected updated(changed: Map<string, unknown>): void;
54
+ render(): TemplateResult;
55
+ private _onKeyDown;
56
+ }
57
+ declare global {
58
+ interface HTMLElementTagNameMap {
59
+ 'scb-drawer-item': ScbDrawerItem;
60
+ }
61
+ }