@politiet/sheriff-web-components 2.5.1 → 2.6.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 (179) hide show
  1. package/custom-elements.json +1774 -1341
  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 +8 -2
  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 +6 -0
  17. package/dist/mixins/index.d.ts.map +1 -0
  18. package/dist/mixins/index.js +6 -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-dialog-target-mixin.d.ts +11 -0
  25. package/dist/mixins/sds-dialog-target-mixin.d.ts.map +1 -0
  26. package/dist/mixins/sds-dialog-target-mixin.js +95 -0
  27. package/dist/mixins/sds-dialog-target-mixin.js.map +1 -0
  28. package/dist/mixins/sds-event-dispatcher-mixin.d.ts +1 -2
  29. package/dist/mixins/sds-event-dispatcher-mixin.d.ts.map +1 -1
  30. package/dist/mixins/sds-event-dispatcher-mixin.js.map +1 -1
  31. package/dist/mixins/sds-form-control-mixin.d.ts +14 -0
  32. package/dist/mixins/sds-form-control-mixin.d.ts.map +1 -0
  33. package/dist/mixins/sds-form-control-mixin.js +40 -0
  34. package/dist/mixins/sds-form-control-mixin.js.map +1 -0
  35. package/dist/mixins/sds-popover-target-mixin.d.ts +8 -0
  36. package/dist/mixins/sds-popover-target-mixin.d.ts.map +1 -0
  37. package/dist/mixins/sds-popover-target-mixin.js +77 -0
  38. package/dist/mixins/sds-popover-target-mixin.js.map +1 -0
  39. package/dist/mixins/types.d.ts +2 -0
  40. package/dist/mixins/types.d.ts.map +1 -0
  41. package/dist/mixins/types.js +2 -0
  42. package/dist/mixins/types.js.map +1 -0
  43. package/dist/react-wrappers/SDSPopoverWrapper.d.ts +3 -0
  44. package/dist/react-wrappers/SDSPopoverWrapper.d.ts.map +1 -0
  45. package/dist/react-wrappers/SDSPopoverWrapper.js +10 -0
  46. package/dist/react-wrappers/SDSPopoverWrapper.js.map +1 -0
  47. package/dist/react-wrappers/SDSProcessStepWrapper.d.ts +3 -0
  48. package/dist/react-wrappers/SDSProcessStepWrapper.d.ts.map +1 -0
  49. package/dist/react-wrappers/SDSProcessStepWrapper.js +10 -0
  50. package/dist/react-wrappers/SDSProcessStepWrapper.js.map +1 -0
  51. package/dist/react-wrappers/SDSProcessWrapper.d.ts +3 -0
  52. package/dist/react-wrappers/SDSProcessWrapper.d.ts.map +1 -0
  53. package/dist/react-wrappers/SDSProcessWrapper.js +10 -0
  54. package/dist/react-wrappers/SDSProcessWrapper.js.map +1 -0
  55. package/dist/react-wrappers/index.d.ts +3 -0
  56. package/dist/react-wrappers/index.d.ts.map +1 -1
  57. package/dist/react-wrappers/index.js +3 -0
  58. package/dist/react-wrappers/index.js.map +1 -1
  59. package/dist/sds-alert/sds-alert.component.d.ts +1 -1
  60. package/dist/sds-button/sds-button.component.d.ts +6 -4
  61. package/dist/sds-button/sds-button.component.d.ts.map +1 -1
  62. package/dist/sds-button/sds-button.component.js +27 -15
  63. package/dist/sds-button/sds-button.component.js.map +1 -1
  64. package/dist/sds-checkbox/sds-checkbox.d.ts +8 -19
  65. package/dist/sds-checkbox/sds-checkbox.d.ts.map +1 -1
  66. package/dist/sds-checkbox/sds-checkbox.js +38 -63
  67. package/dist/sds-checkbox/sds-checkbox.js.map +1 -1
  68. package/dist/sds-checkbox/sds-checkbox.styles.d.ts.map +1 -1
  69. package/dist/sds-checkbox/sds-checkbox.styles.js +1 -0
  70. package/dist/sds-checkbox/sds-checkbox.styles.js.map +1 -1
  71. package/dist/sds-checkbox-group/sds-checkbox-group.d.ts +1 -1
  72. package/dist/sds-chip/sds-chip.d.ts +15 -22
  73. package/dist/sds-chip/sds-chip.d.ts.map +1 -1
  74. package/dist/sds-chip/sds-chip.js +28 -40
  75. package/dist/sds-chip/sds-chip.js.map +1 -1
  76. package/dist/sds-chip/sds-chip.styles.js +1 -1
  77. package/dist/sds-chip/sds-chip.styles.js.map +1 -1
  78. package/dist/sds-details/sds-details.d.ts +1 -1
  79. package/dist/sds-dialog/sds-dialog.component.d.ts +56 -0
  80. package/dist/sds-dialog/sds-dialog.component.d.ts.map +1 -0
  81. package/dist/sds-dialog/sds-dialog.component.js +181 -0
  82. package/dist/sds-dialog/sds-dialog.component.js.map +1 -0
  83. package/dist/sds-dialog/sds-dialog.d.ts +2 -49
  84. package/dist/sds-dialog/sds-dialog.d.ts.map +1 -1
  85. package/dist/sds-dialog/sds-dialog.js +2 -145
  86. package/dist/sds-dialog/sds-dialog.js.map +1 -1
  87. package/dist/sds-dialog/sds-dialog.spec.d.ts +2 -0
  88. package/dist/sds-dialog/sds-dialog.spec.d.ts.map +1 -0
  89. package/dist/sds-dialog/sds-dialog.spec.js +50 -0
  90. package/dist/sds-dialog/sds-dialog.spec.js.map +1 -0
  91. package/dist/sds-dialog/sds-dialog.styles.js +4 -4
  92. package/dist/sds-dialog/sds-dialog.styles.js.map +1 -1
  93. package/dist/sds-notification/sds-notification.d.ts +1 -1
  94. package/dist/sds-popover/assets/popover-styles.d.ts +3 -0
  95. package/dist/sds-popover/assets/popover-styles.d.ts.map +1 -0
  96. package/dist/sds-popover/assets/popover-styles.js +3 -0
  97. package/dist/sds-popover/assets/popover-styles.js.map +1 -0
  98. package/dist/sds-popover/assets/positioning.js +1 -0
  99. package/dist/sds-popover/sds-popover.d.ts +25 -0
  100. package/dist/sds-popover/sds-popover.d.ts.map +1 -0
  101. package/dist/sds-popover/sds-popover.js +43 -0
  102. package/dist/sds-popover/sds-popover.js.map +1 -0
  103. package/dist/sds-popover/sds-popover.styles.d.ts +2 -0
  104. package/dist/sds-popover/sds-popover.styles.d.ts.map +1 -0
  105. package/dist/sds-popover/sds-popover.styles.js +52 -0
  106. package/dist/sds-popover/sds-popover.styles.js.map +1 -0
  107. package/dist/sds-process/sds-process.d.ts +20 -0
  108. package/dist/sds-process/sds-process.d.ts.map +1 -0
  109. package/dist/sds-process/sds-process.js +29 -0
  110. package/dist/sds-process/sds-process.js.map +1 -0
  111. package/dist/sds-process/sds-process.styles.d.ts +2 -0
  112. package/dist/sds-process/sds-process.styles.d.ts.map +1 -0
  113. package/dist/sds-process/sds-process.styles.js +8 -0
  114. package/dist/sds-process/sds-process.styles.js.map +1 -0
  115. package/dist/sds-process-step/sds-process-step.d.ts +29 -0
  116. package/dist/sds-process-step/sds-process-step.d.ts.map +1 -0
  117. package/dist/sds-process-step/sds-process-step.js +75 -0
  118. package/dist/sds-process-step/sds-process-step.js.map +1 -0
  119. package/dist/sds-process-step/sds-process-step.styles.d.ts +2 -0
  120. package/dist/sds-process-step/sds-process-step.styles.d.ts.map +1 -0
  121. package/dist/sds-process-step/sds-process-step.styles.js +143 -0
  122. package/dist/sds-process-step/sds-process-step.styles.js.map +1 -0
  123. package/dist/sds-radio/sds-radio.d.ts +14 -20
  124. package/dist/sds-radio/sds-radio.d.ts.map +1 -1
  125. package/dist/sds-radio/sds-radio.js +45 -73
  126. package/dist/sds-radio/sds-radio.js.map +1 -1
  127. package/dist/sds-radio-group/sds-radio-group.d.ts +1 -1
  128. package/dist/sds-select/sds-select.component.d.ts +54 -0
  129. package/dist/sds-select/sds-select.component.d.ts.map +1 -0
  130. package/dist/sds-select/sds-select.component.js +290 -0
  131. package/dist/sds-select/sds-select.component.js.map +1 -0
  132. package/dist/sds-select/sds-select.d.ts +2 -64
  133. package/dist/sds-select/sds-select.d.ts.map +1 -1
  134. package/dist/sds-select/sds-select.js +2 -311
  135. package/dist/sds-select/sds-select.js.map +1 -1
  136. package/dist/sds-select/sds-select.styles.js +1 -1
  137. package/dist/sds-select/sds-select.styles.js.map +1 -1
  138. package/dist/sds-stepper/sds-stepper.d.ts +1 -2
  139. package/dist/sds-stepper/sds-stepper.d.ts.map +1 -1
  140. package/dist/sds-stepper/sds-stepper.js +2 -3
  141. package/dist/sds-stepper/sds-stepper.js.map +1 -1
  142. package/dist/sds-stepper/sds-stepper.styles.d.ts.map +1 -1
  143. package/dist/sds-stepper/sds-stepper.styles.js +2 -1
  144. package/dist/sds-stepper/sds-stepper.styles.js.map +1 -1
  145. package/dist/sds-stepper-step/sds-stepper-step.d.ts +1 -1
  146. package/dist/sds-stepper-step/sds-stepper-step.styles.d.ts.map +1 -1
  147. package/dist/sds-stepper-step/sds-stepper-step.styles.js +7 -5
  148. package/dist/sds-stepper-step/sds-stepper-step.styles.js.map +1 -1
  149. package/dist/sds-switch/sds-switch.d.ts +5 -14
  150. package/dist/sds-switch/sds-switch.d.ts.map +1 -1
  151. package/dist/sds-switch/sds-switch.js +13 -26
  152. package/dist/sds-switch/sds-switch.js.map +1 -1
  153. package/dist/sds-switch/sds-switch.styles.js +1 -1
  154. package/dist/sds-switch/sds-switch.styles.js.map +1 -1
  155. package/dist/sds-textarea/sds-textarea.d.ts +12 -24
  156. package/dist/sds-textarea/sds-textarea.d.ts.map +1 -1
  157. package/dist/sds-textarea/sds-textarea.js +3 -32
  158. package/dist/sds-textarea/sds-textarea.js.map +1 -1
  159. package/dist/sds-textarea/sds-textarea.styles.d.ts.map +1 -1
  160. package/dist/sds-textarea/sds-textarea.styles.js +8 -5
  161. package/dist/sds-textarea/sds-textarea.styles.js.map +1 -1
  162. package/dist/sds-textfield/sds-textfield.d.ts +11 -23
  163. package/dist/sds-textfield/sds-textfield.d.ts.map +1 -1
  164. package/dist/sds-textfield/sds-textfield.js +4 -33
  165. package/dist/sds-textfield/sds-textfield.js.map +1 -1
  166. package/dist/sds-textfield/sds-textfield.spec.js +3 -3
  167. package/dist/sds-textfield/sds-textfield.spec.js.map +1 -1
  168. package/dist/sds-textfield/sds-textfield.styles.d.ts.map +1 -1
  169. package/dist/sds-textfield/sds-textfield.styles.js +5 -1
  170. package/dist/sds-textfield/sds-textfield.styles.js.map +1 -1
  171. package/dist/sheriff-web-components.js +388 -170
  172. package/dist/skill/SKILL.md +172 -0
  173. package/dist/skill/references/components.md +481 -0
  174. package/dist/skill/references/react-wrappers.md +66 -0
  175. package/dist/types.d.ts +1 -0
  176. package/dist/types.d.ts.map +1 -1
  177. package/dist/types.js.map +1 -1
  178. package/package.json +23 -4
  179. package/web-types.json +1559 -840
@@ -0,0 +1,56 @@
1
+ import { LitElement, type PropertyValues } from 'lit';
2
+ type ClosedBy = 'none' | 'closerequest' | 'any';
3
+ export interface SDSDialogProps {
4
+ open?: boolean;
5
+ /**
6
+ * Set if dialog opens as a modal or not
7
+ *
8
+ * If non-modal, the user is allowed to interact with content outside of the dialog.
9
+ * If modal, the dialog is placed in the top layer with a ::backdrop pseudo-element.
10
+ *
11
+ * Docs:
12
+ * - https://developer.mozilla.org/en-US/docs/Web/API/HTMLDialogElement/show
13
+ * - https://developer.mozilla.org/en-US/docs/Web/API/HTMLDialogElement/showModal
14
+ */
15
+ modal?: boolean;
16
+ /**
17
+ * Set what type of dismiss behavior closes the dialog
18
+ * - 'none': Dialog can only be closed programmatically
19
+ * - 'closerequest': Dialog closes on ESC key (default)
20
+ * - 'any': Dialog closes on ESC key or clicking outside
21
+ *
22
+ * Docs: https://developer.mozilla.org/en-US/docs/Web/API/HTMLDialogElement/closedBy
23
+ */
24
+ closedby?: ClosedBy;
25
+ 'close-button-label'?: string;
26
+ }
27
+ declare const SDSDialogComponent_base: import("../mixins/types").Constructable<import("../mixins/sds-event-dispatcher-mixin").SDSEventDispatcherMixinInterface> & typeof LitElement;
28
+ export declare class SDSDialogComponent extends SDSDialogComponent_base {
29
+ static styles: import("lit").CSSResult[];
30
+ open: boolean;
31
+ modal: boolean;
32
+ closedby: ClosedBy;
33
+ closeButtonLabel: string;
34
+ private _dialog;
35
+ private _isHeaderSlotEmpty;
36
+ private _pointerDownInside;
37
+ firstUpdated(): void;
38
+ updated(changedProperties: PropertyValues): void;
39
+ private _setupEventListeners;
40
+ private _openDialog;
41
+ private _closeDialog;
42
+ private readonly _handleClose;
43
+ private readonly _handleClick;
44
+ private readonly _handlePointerDown;
45
+ private readonly _handlePointerUp;
46
+ private readonly _handleCancel;
47
+ private readonly _handleHeaderSlotChange;
48
+ private readonly _handleAutoFocus;
49
+ show(): void;
50
+ showModal(): void;
51
+ close(): void;
52
+ requestClose(): void;
53
+ render(): import("lit-html").TemplateResult<1>;
54
+ }
55
+ export {};
56
+ //# sourceMappingURL=sds-dialog.component.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sds-dialog.component.d.ts","sourceRoot":"","sources":["../../src/sds-dialog/sds-dialog.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAiB,KAAK,cAAc,EAAE,MAAM,KAAK,CAAC;AAKrE,KAAK,QAAQ,GAAG,MAAM,GAAG,cAAc,GAAG,KAAK,CAAC;AAEhD,MAAM,WAAW,cAAc;IAC9B,IAAI,CAAC,EAAE,OAAO,CAAC;IACf;;;;;;;;;OASG;IACH,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB;;;;;;;OAOG;IACH,QAAQ,CAAC,EAAE,QAAQ,CAAC;IACpB,oBAAoB,CAAC,EAAE,MAAM,CAAC;CAC9B;;AAED,qBAAa,kBAAmB,SAAQ,uBAAmC;IAC1E,OAAgB,MAAM,4BAAY;IAEU,IAAI,EAAE,OAAO,CAAS;IACtB,KAAK,EAAE,OAAO,CAAS;IACxB,QAAQ,EAAE,QAAQ,CAAkB;IAClB,gBAAgB,EAAE,MAAM,CAAsB;IAE1F,OAAO,CAAC,OAAO,CAAqB;IAE5C,OAAO,CAAC,kBAAkB,CAAiB;IAGpD,OAAO,CAAC,kBAAkB,CAAS;IAE1B,YAAY,IAAI,IAAI;IAOpB,OAAO,CAAC,iBAAiB,EAAE,cAAc,GAAG,IAAI;IAYzD,OAAO,CAAC,oBAAoB;IAS5B,OAAO,CAAC,WAAW;IAYnB,OAAO,CAAC,YAAY;IAOpB,OAAO,CAAC,QAAQ,CAAC,YAAY,CAG3B;IAEF,OAAO,CAAC,QAAQ,CAAC,YAAY,CAM3B;IAKF,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAIjC;IAEF,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAsB/B;IAEF,OAAO,CAAC,QAAQ,CAAC,aAAa,CAI5B;IAEF,OAAO,CAAC,QAAQ,CAAC,uBAAuB,CAGtC;IAEF,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAkB/B;IAEK,IAAI,IAAI,IAAI;IAIZ,SAAS,IAAI,IAAI;IAKjB,KAAK,IAAI,IAAI;IAIb,YAAY,IAAI,IAAI;IAQlB,MAAM;CAkBf"}
@@ -0,0 +1,181 @@
1
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ };
7
+ import { LitElement, html, nothing } from 'lit';
8
+ import { property, query, state } from 'lit/decorators.js';
9
+ import { styles } from './sds-dialog.styles';
10
+ import { SDSEventDispatcherMixin } from '../mixins/sds-event-dispatcher-mixin';
11
+ export class SDSDialogComponent extends SDSEventDispatcherMixin(LitElement) {
12
+ constructor() {
13
+ super(...arguments);
14
+ this.open = false;
15
+ this.modal = false;
16
+ this.closedby = 'closerequest';
17
+ this.closeButtonLabel = 'Lukk dialogvindu';
18
+ this._isHeaderSlotEmpty = true;
19
+ // Safari closedBy=any polyfill state
20
+ this._pointerDownInside = false;
21
+ this._handleClose = () => {
22
+ this.open = false;
23
+ this.dispatchSheriffEvent('sds-close');
24
+ };
25
+ this._handleClick = (event) => {
26
+ const target = event.target;
27
+ if (target?.closest('[data-command="close"],[command="close"]')) {
28
+ this._closeDialog();
29
+ }
30
+ };
31
+ // Safari closedBy="any" polyfill
32
+ // Calculate whether the user's pointer down event is outside or inside dialog
33
+ // If outside, close the dialog
34
+ this._handlePointerDown = (event) => {
35
+ const rect = this._dialog.getBoundingClientRect();
36
+ const { clientX: x, clientY: y } = event;
37
+ this._pointerDownInside = rect.top <= y && y <= rect.bottom && rect.left <= x && x <= rect.right;
38
+ };
39
+ this._handlePointerUp = (event) => {
40
+ const wasDownInside = this._pointerDownInside;
41
+ this._pointerDownInside = false;
42
+ if (this.closedby !== 'any' || wasDownInside) {
43
+ return;
44
+ }
45
+ // Clicking the backdrop will have the dialog as the target in Safari/Chrome.
46
+ // Firefox does not fire this callback when ::backdrop is clicked.
47
+ if (event.target !== this._dialog) {
48
+ return;
49
+ }
50
+ // Use requestAnimationFrame to let the browser handle native closedBy first.
51
+ // This avoids checking for the closedBy property, which Safari 26.2 exposes
52
+ // without implementing.
53
+ requestAnimationFrame(() => {
54
+ if (this._dialog && this._dialog.open) {
55
+ this._closeDialog();
56
+ }
57
+ });
58
+ };
59
+ this._handleCancel = (event) => {
60
+ if (this.closedby === 'none') {
61
+ event.preventDefault();
62
+ }
63
+ };
64
+ this._handleHeaderSlotChange = (event) => {
65
+ const slot = event.target;
66
+ this._isHeaderSlotEmpty = slot.assignedElements().length === 0;
67
+ };
68
+ this._handleAutoFocus = () => {
69
+ // slot:not([name]) finds the default nameless slot
70
+ const contentSlotElements = this.shadowRoot?.querySelector('slot:not([name])')?.assignedElements({ flatten: true });
71
+ if (!contentSlotElements || contentSlotElements.length === 0) {
72
+ return;
73
+ }
74
+ const elementToFocus = contentSlotElements.find((element) => {
75
+ return element.getAttribute('autofocus') != null;
76
+ });
77
+ if (!(elementToFocus instanceof HTMLElement)) {
78
+ return;
79
+ }
80
+ if (document.activeElement !== elementToFocus) {
81
+ elementToFocus.focus();
82
+ }
83
+ };
84
+ }
85
+ firstUpdated() {
86
+ this._setupEventListeners();
87
+ if (this.open) {
88
+ this._openDialog();
89
+ }
90
+ }
91
+ updated(changedProperties) {
92
+ if (!changedProperties.has('open')) {
93
+ return;
94
+ }
95
+ if (this.open) {
96
+ this._openDialog();
97
+ }
98
+ else {
99
+ this._closeDialog();
100
+ }
101
+ }
102
+ _setupEventListeners() {
103
+ this._dialog.addEventListener('close', this._handleClose);
104
+ this._dialog.addEventListener('cancel', this._handleCancel);
105
+ this._dialog.addEventListener('click', this._handleClick);
106
+ this._dialog.addEventListener('pointerdown', this._handlePointerDown);
107
+ this._dialog.addEventListener('pointerup', this._handlePointerUp);
108
+ this._dialog.addEventListener('animationend', this._handleAutoFocus);
109
+ }
110
+ _openDialog() {
111
+ if (!this._dialog) {
112
+ return;
113
+ }
114
+ if (this.modal) {
115
+ this._dialog.showModal();
116
+ }
117
+ else {
118
+ this._dialog.show();
119
+ }
120
+ }
121
+ _closeDialog() {
122
+ if (!this._dialog) {
123
+ return;
124
+ }
125
+ this._dialog.close();
126
+ }
127
+ show() {
128
+ this.open = true;
129
+ }
130
+ showModal() {
131
+ this.modal = true;
132
+ this.open = true;
133
+ }
134
+ close() {
135
+ this.open = false;
136
+ }
137
+ requestClose() {
138
+ if (!this._dialog) {
139
+ return;
140
+ }
141
+ this._dialog.requestClose();
142
+ }
143
+ render() {
144
+ return html `
145
+ <dialog .closedBy="${this.closedby}" class=${this._isHeaderSlotEmpty ? 'sds-dialog__empty-header' : ''}>
146
+ <div class="sds-dialog__header">
147
+ <slot name="header" @slotchange=${this._handleHeaderSlotChange}></slot>
148
+ ${this.closeButtonLabel
149
+ ? html `
150
+ <sds-button class="sds-dialog__close-button" icon variant="tertiary" size="md" data-command="close" aria-label="${this.closeButtonLabel}">
151
+ <sds-icon name="close-material-outlined" size="md"></sds-icon>
152
+ </sds-button>
153
+ `
154
+ : nothing}
155
+ </div>
156
+ <slot></slot>
157
+ <slot name="footer"></slot>
158
+ </dialog>
159
+ `;
160
+ }
161
+ }
162
+ SDSDialogComponent.styles = [styles];
163
+ __decorate([
164
+ property({ type: Boolean, reflect: true })
165
+ ], SDSDialogComponent.prototype, "open", void 0);
166
+ __decorate([
167
+ property({ type: Boolean, reflect: true })
168
+ ], SDSDialogComponent.prototype, "modal", void 0);
169
+ __decorate([
170
+ property({ type: String, reflect: true })
171
+ ], SDSDialogComponent.prototype, "closedby", void 0);
172
+ __decorate([
173
+ property({ type: String, attribute: 'close-button-label' })
174
+ ], SDSDialogComponent.prototype, "closeButtonLabel", void 0);
175
+ __decorate([
176
+ query('dialog')
177
+ ], SDSDialogComponent.prototype, "_dialog", void 0);
178
+ __decorate([
179
+ state()
180
+ ], SDSDialogComponent.prototype, "_isHeaderSlotEmpty", void 0);
181
+ //# sourceMappingURL=sds-dialog.component.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sds-dialog.component.js","sourceRoot":"","sources":["../../src/sds-dialog/sds-dialog.component.ts"],"names":[],"mappings":"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","sourcesContent":["import { LitElement, html, nothing, type PropertyValues } from 'lit';\nimport { property, query, state } from 'lit/decorators.js';\nimport { styles } from './sds-dialog.styles';\nimport { SDSEventDispatcherMixin } from '../mixins/sds-event-dispatcher-mixin';\n\ntype ClosedBy = 'none' | 'closerequest' | 'any';\n\nexport interface SDSDialogProps {\n\topen?: boolean;\n\t/**\n\t * Set if dialog opens as a modal or not\n\t *\n\t * If non-modal, the user is allowed to interact with content outside of the dialog.\n\t * If modal, the dialog is placed in the top layer with a ::backdrop pseudo-element.\n\t *\n\t * Docs:\n\t * - https://developer.mozilla.org/en-US/docs/Web/API/HTMLDialogElement/show\n\t * - https://developer.mozilla.org/en-US/docs/Web/API/HTMLDialogElement/showModal\n\t */\n\tmodal?: boolean;\n\t/**\n\t * Set what type of dismiss behavior closes the dialog\n\t * - 'none': Dialog can only be closed programmatically\n\t * - 'closerequest': Dialog closes on ESC key (default)\n\t * - 'any': Dialog closes on ESC key or clicking outside\n\t *\n\t * Docs: https://developer.mozilla.org/en-US/docs/Web/API/HTMLDialogElement/closedBy\n\t */\n\tclosedby?: ClosedBy;\n\t'close-button-label'?: string;\n}\n\nexport class SDSDialogComponent extends SDSEventDispatcherMixin(LitElement) {\n\tstatic override styles = [styles];\n\n\t@property({ type: Boolean, reflect: true }) open: boolean = false;\n\t@property({ type: Boolean, reflect: true }) modal: boolean = false;\n\t@property({ type: String, reflect: true }) closedby: ClosedBy = 'closerequest';\n\t@property({ type: String, attribute: 'close-button-label' }) closeButtonLabel: string = 'Lukk dialogvindu';\n\n\t@query('dialog') private _dialog!: HTMLDialogElement;\n\n\t@state() private _isHeaderSlotEmpty: boolean = true;\n\n\t// Safari closedBy=any polyfill state\n\tprivate _pointerDownInside = false;\n\n\toverride firstUpdated(): void {\n\t\tthis._setupEventListeners();\n\t\tif (this.open) {\n\t\t\tthis._openDialog();\n\t\t}\n\t}\n\n\toverride updated(changedProperties: PropertyValues): void {\n\t\tif (!changedProperties.has('open')) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (this.open) {\n\t\t\tthis._openDialog();\n\t\t} else {\n\t\t\tthis._closeDialog();\n\t\t}\n\t}\n\n\tprivate _setupEventListeners(): void {\n\t\tthis._dialog.addEventListener('close', this._handleClose);\n\t\tthis._dialog.addEventListener('cancel', this._handleCancel);\n\t\tthis._dialog.addEventListener('click', this._handleClick);\n\t\tthis._dialog.addEventListener('pointerdown', this._handlePointerDown);\n\t\tthis._dialog.addEventListener('pointerup', this._handlePointerUp);\n\t\tthis._dialog.addEventListener('animationend', this._handleAutoFocus);\n\t}\n\n\tprivate _openDialog(): void {\n\t\tif (!this._dialog) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (this.modal) {\n\t\t\tthis._dialog.showModal();\n\t\t} else {\n\t\t\tthis._dialog.show();\n\t\t}\n\t}\n\n\tprivate _closeDialog(): void {\n\t\tif (!this._dialog) {\n\t\t\treturn;\n\t\t}\n\t\tthis._dialog.close();\n\t}\n\n\tprivate readonly _handleClose = (): void => {\n\t\tthis.open = false;\n\t\tthis.dispatchSheriffEvent('sds-close');\n\t};\n\n\tprivate readonly _handleClick = (event: MouseEvent): void => {\n\t\tconst target = event.target as Element | null;\n\n\t\tif (target?.closest('[data-command=\"close\"],[command=\"close\"]')) {\n\t\t\tthis._closeDialog();\n\t\t}\n\t};\n\n\t// Safari closedBy=\"any\" polyfill\n\t// Calculate whether the user's pointer down event is outside or inside dialog\n\t// If outside, close the dialog\n\tprivate readonly _handlePointerDown = (event: PointerEvent): void => {\n\t\tconst rect = this._dialog.getBoundingClientRect();\n\t\tconst { clientX: x, clientY: y } = event;\n\t\tthis._pointerDownInside = rect.top <= y && y <= rect.bottom && rect.left <= x && x <= rect.right;\n\t};\n\n\tprivate readonly _handlePointerUp = (event: PointerEvent): void => {\n\t\tconst wasDownInside = this._pointerDownInside;\n\t\tthis._pointerDownInside = false;\n\n\t\tif (this.closedby !== 'any' || wasDownInside) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Clicking the backdrop will have the dialog as the target in Safari/Chrome.\n\t\t// Firefox does not fire this callback when ::backdrop is clicked.\n\t\tif (event.target !== this._dialog) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Use requestAnimationFrame to let the browser handle native closedBy first.\n\t\t// This avoids checking for the closedBy property, which Safari 26.2 exposes\n\t\t// without implementing.\n\t\trequestAnimationFrame(() => {\n\t\t\tif (this._dialog && this._dialog.open) {\n\t\t\t\tthis._closeDialog();\n\t\t\t}\n\t\t});\n\t};\n\n\tprivate readonly _handleCancel = (event: Event): void => {\n\t\tif (this.closedby === 'none') {\n\t\t\tevent.preventDefault();\n\t\t}\n\t};\n\n\tprivate readonly _handleHeaderSlotChange = (event: Event): void => {\n\t\tconst slot = event.target as HTMLSlotElement;\n\t\tthis._isHeaderSlotEmpty = slot.assignedElements().length === 0;\n\t};\n\n\tprivate readonly _handleAutoFocus = (): void => {\n\t\t// slot:not([name]) finds the default nameless slot\n\t\tconst contentSlotElements = this.shadowRoot?.querySelector<HTMLSlotElement>('slot:not([name])')?.assignedElements({ flatten: true });\n\t\tif (!contentSlotElements || contentSlotElements.length === 0) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst elementToFocus = contentSlotElements.find((element) => {\n\t\t\treturn element.getAttribute('autofocus') != null;\n\t\t});\n\n\t\tif (!(elementToFocus instanceof HTMLElement)) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (document.activeElement !== elementToFocus) {\n\t\t\telementToFocus.focus();\n\t\t}\n\t};\n\n\tpublic show(): void {\n\t\tthis.open = true;\n\t}\n\n\tpublic showModal(): void {\n\t\tthis.modal = true;\n\t\tthis.open = true;\n\t}\n\n\tpublic close(): void {\n\t\tthis.open = false;\n\t}\n\n\tpublic requestClose(): void {\n\t\tif (!this._dialog) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis._dialog.requestClose();\n\t}\n\n\toverride render() {\n\t\treturn html`\n\t\t\t<dialog .closedBy=\"${this.closedby}\" class=${this._isHeaderSlotEmpty ? 'sds-dialog__empty-header' : ''}>\n\t\t\t\t<div class=\"sds-dialog__header\">\n\t\t\t\t\t<slot name=\"header\" @slotchange=${this._handleHeaderSlotChange}></slot>\n\t\t\t\t\t${this.closeButtonLabel\n\t\t\t\t\t\t? html`\n\t\t\t\t\t\t\t\t<sds-button class=\"sds-dialog__close-button\" icon variant=\"tertiary\" size=\"md\" data-command=\"close\" aria-label=\"${this.closeButtonLabel}\">\n\t\t\t\t\t\t\t\t\t<sds-icon name=\"close-material-outlined\" size=\"md\"></sds-icon>\n\t\t\t\t\t\t\t\t</sds-button>\n\t\t\t\t\t\t\t`\n\t\t\t\t\t\t: nothing}\n\t\t\t\t</div>\n\t\t\t\t<slot></slot>\n\t\t\t\t<slot name=\"footer\"></slot>\n\t\t\t</dialog>\n\t\t`;\n\t}\n}\n"]}
@@ -1,54 +1,8 @@
1
- import { LitElement, type PropertyValues } from 'lit';
2
1
  import { SheriffEvent } from '../types';
2
+ import { SDSDialogComponent } from './sds-dialog.component';
3
3
  import '../sds-icon/sds-icon';
4
4
  import '../sds-button/sds-button';
5
- type ClosedBy = 'none' | 'closerequest' | 'any';
6
- export interface SDSDialogProps {
7
- open?: boolean;
8
- /**
9
- * Set if dialog opens as a modal or not
10
- *
11
- * If non-modal, the user is allowed to interact with content outside of the dialog.
12
- * If modal, the dialog is placed in the top layer with a ::backdrop pseudo-element.
13
- *
14
- * Docs:
15
- * - https://developer.mozilla.org/en-US/docs/Web/API/HTMLDialogElement/show
16
- * - https://developer.mozilla.org/en-US/docs/Web/API/HTMLDialogElement/showModal
17
- */
18
- modal?: boolean;
19
- /**
20
- * Set what type of dismiss behavior closes the dialog
21
- * - 'none': Dialog can only be closed programmatically
22
- * - 'closerequest': Dialog closes on ESC key (default)
23
- * - 'any': Dialog closes on ESC key or clicking outside
24
- *
25
- * Docs: https://developer.mozilla.org/en-US/docs/Web/API/HTMLDialogElement/closedBy
26
- */
27
- closedby?: ClosedBy;
28
- 'close-button-label'?: string;
29
- }
30
- declare const SDSDialog_base: (new (...args: any[]) => import("../mixins/sds-event-dispatcher-mixin").SDSEventDispatcherMixinInterface) & typeof LitElement;
31
- export declare class SDSDialog extends SDSDialog_base {
32
- static styles: import("lit").CSSResult[];
33
- open: boolean;
34
- modal: boolean;
35
- closedby: ClosedBy;
36
- closeButtonLabel: string;
37
- private _dialog;
38
- private headerSlotElements;
39
- firstUpdated(): void;
40
- updated(changedProperties: PropertyValues): void;
41
- private _setupEventListeners;
42
- private _openDialog;
43
- private _closeDialog;
44
- private readonly _handleClose;
45
- private readonly _handleClick;
46
- private readonly _handleCancel;
47
- private readonly _handleAutoFocus;
48
- show(): void;
49
- showModal(): void;
50
- close(): void;
51
- render(): import("lit-html").TemplateResult<1>;
5
+ export declare class SDSDialog extends SDSDialogComponent {
52
6
  }
53
7
  declare global {
54
8
  interface HTMLElementTagNameMap {
@@ -58,5 +12,4 @@ declare global {
58
12
  'sds-close': SheriffEvent;
59
13
  }
60
14
  }
61
- export {};
62
15
  //# sourceMappingURL=sds-dialog.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"sds-dialog.d.ts","sourceRoot":"","sources":["../../src/sds-dialog/sds-dialog.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAiB,KAAK,cAAc,EAAE,MAAM,KAAK,CAAC;AAIrE,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAGxC,OAAO,sBAAsB,CAAC;AAC9B,OAAO,0BAA0B,CAAC;AAElC,KAAK,QAAQ,GAAG,MAAM,GAAG,cAAc,GAAG,KAAK,CAAC;AAEhD,MAAM,WAAW,cAAc;IAC9B,IAAI,CAAC,EAAE,OAAO,CAAC;IACf;;;;;;;;;OASG;IACH,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB;;;;;;;OAOG;IACH,QAAQ,CAAC,EAAE,QAAQ,CAAC;IACpB,oBAAoB,CAAC,EAAE,MAAM,CAAC;CAC9B;;AAED,qBACa,SAAU,SAAQ,cAAmC;IACjE,OAAgB,MAAM,4BAAY;IAEU,IAAI,EAAE,OAAO,CAAS;IACtB,KAAK,EAAE,OAAO,CAAS;IACxB,QAAQ,EAAE,QAAQ,CAAkB;IAClB,gBAAgB,EAAE,MAAM,CAAsB;IAE1F,OAAO,CAAC,OAAO,CAAqB;IAEM,OAAO,CAAC,kBAAkB,CAAa;IAEzF,YAAY,IAAI,IAAI;IAOpB,OAAO,CAAC,iBAAiB,EAAE,cAAc,GAAG,IAAI;IAOzD,OAAO,CAAC,oBAAoB;IAO5B,OAAO,CAAC,WAAW;IAQnB,OAAO,CAAC,YAAY;IAOpB,OAAO,CAAC,QAAQ,CAAC,YAAY,CAG3B;IAEF,OAAO,CAAC,QAAQ,CAAC,YAAY,CAkC3B;IAEF,OAAO,CAAC,QAAQ,CAAC,aAAa,CAI5B;IAEF,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAkB/B;IAEK,IAAI,IAAI,IAAI;IAIZ,SAAS,IAAI,IAAI;IAKjB,KAAK,IAAI,IAAI;IAIX,MAAM;CAmBf;AAED,OAAO,CAAC,MAAM,CAAC;IACd,UAAU,qBAAqB;QAC9B,YAAY,EAAE,SAAS,CAAC;KACxB;IACD,UAAU,2BAA2B;QACpC,WAAW,EAAE,YAAY,CAAC;KAC1B;CACD"}
1
+ {"version":3,"file":"sds-dialog.d.ts","sourceRoot":"","sources":["../../src/sds-dialog/sds-dialog.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AACxC,OAAO,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAE5D,OAAO,sBAAsB,CAAC;AAC9B,OAAO,0BAA0B,CAAC;AAElC,qBACa,SAAU,SAAQ,kBAAkB;CAAG;AAEpD,OAAO,CAAC,MAAM,CAAC;IACd,UAAU,qBAAqB;QAC9B,YAAY,EAAE,SAAS,CAAC;KACxB;IACD,UAAU,2BAA2B;QACpC,WAAW,EAAE,YAAY,CAAC;KAC1B;CACD"}
@@ -4,155 +4,12 @@ var __decorate = (this && this.__decorate) || function (decorators, target, key,
4
4
  else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
5
  return c > 3 && r && Object.defineProperty(target, key, r), r;
6
6
  };
7
- import { LitElement, html, nothing } from 'lit';
8
- import { property, query, queryAssignedElements } from 'lit/decorators.js';
9
7
  import { guardedCustomElement } from '../utils/guarded-custom-element';
10
- import { styles } from './sds-dialog.styles';
11
- import { SDSEventDispatcherMixin } from '../mixins/sds-event-dispatcher-mixin';
8
+ import { SDSDialogComponent } from './sds-dialog.component';
12
9
  import '../sds-icon/sds-icon';
13
10
  import '../sds-button/sds-button';
14
- let SDSDialog = class SDSDialog extends SDSEventDispatcherMixin(LitElement) {
15
- constructor() {
16
- super(...arguments);
17
- this.open = false;
18
- this.modal = false;
19
- this.closedby = 'closerequest';
20
- this.closeButtonLabel = 'Lukk dialogvindu';
21
- this._handleClose = () => {
22
- this.open = false;
23
- this.dispatchSheriffEvent('sds-close');
24
- };
25
- this._handleClick = (event) => {
26
- const target = event.target;
27
- if (target?.closest('[data-command="close"]')) {
28
- this._closeDialog();
29
- return;
30
- }
31
- // Clicking the backdrop will have the dialog as the target in Safari/Chrome.
32
- // Firefox does not fire this callback when ::backdrop is clicked.
33
- if (target !== this._dialog) {
34
- return;
35
- }
36
- if (this.closedby !== 'any') {
37
- return;
38
- }
39
- // Cast _dialog to its own type to avoid it being narrowed to never by TS.
40
- // The types defines that `closedBy` _is_ in dialog.
41
- // So, if it is not, it can't be that type and is cast to never.
42
- // Do this test to check if closedBy is supported in current browser.
43
- const hasClosedBy = 'closedBy' in this._dialog;
44
- if (hasClosedBy) {
45
- return;
46
- }
47
- // Manual bounds checking for Safari as it does not (yet) support closedby="any".
48
- const { clientX: x, clientY: y } = event;
49
- const { top, bottom, left, right } = this._dialog.getBoundingClientRect();
50
- const clickedOutsideDialog = top > y || bottom < y || left > x || right < x;
51
- if (clickedOutsideDialog) {
52
- this._closeDialog();
53
- }
54
- };
55
- this._handleCancel = (event) => {
56
- if (this.closedby === 'none') {
57
- event.preventDefault();
58
- }
59
- };
60
- this._handleAutoFocus = () => {
61
- // slot:not([name]) finds the default nameless slot
62
- const contentSlotElements = this.shadowRoot?.querySelector('slot:not([name])')?.assignedElements({ flatten: true });
63
- if (!contentSlotElements || contentSlotElements.length === 0) {
64
- return;
65
- }
66
- const elementToFocus = contentSlotElements.find((element) => {
67
- return element.getAttribute('autofocus') != null;
68
- });
69
- if (!(elementToFocus instanceof HTMLElement)) {
70
- return;
71
- }
72
- if (document.activeElement !== elementToFocus) {
73
- elementToFocus.focus();
74
- }
75
- };
76
- }
77
- firstUpdated() {
78
- this._setupEventListeners();
79
- if (this.open) {
80
- this._openDialog();
81
- }
82
- }
83
- updated(changedProperties) {
84
- if (!changedProperties.has('open')) {
85
- return;
86
- }
87
- this.open ? this._openDialog() : this._closeDialog();
88
- }
89
- _setupEventListeners() {
90
- this._dialog.addEventListener('close', this._handleClose);
91
- this._dialog.addEventListener('cancel', this._handleCancel);
92
- this._dialog.addEventListener('click', this._handleClick);
93
- this._dialog.addEventListener('animationend', this._handleAutoFocus);
94
- }
95
- _openDialog() {
96
- if (!this._dialog) {
97
- return;
98
- }
99
- this.modal ? this._dialog.showModal() : this._dialog.show();
100
- }
101
- _closeDialog() {
102
- if (!this._dialog) {
103
- return;
104
- }
105
- this._dialog.close();
106
- }
107
- show() {
108
- this.open = true;
109
- }
110
- showModal() {
111
- this.modal = true;
112
- this.open = true;
113
- }
114
- close() {
115
- this.open = false;
116
- }
117
- render() {
118
- const headerIsEmpty = this.headerSlotElements.length === 0;
119
- return html `
120
- <dialog closedby="${this.closedby}" class=${headerIsEmpty ? 'sds-dialog__empty-header' : ''}>
121
- <div class="sds-dialog__header">
122
- <slot name="header"></slot>
123
- ${this.closeButtonLabel
124
- ? html `
125
- <sds-button class="sds-dialog__close-button" icon variant="tertiary" size="md" data-command="close" aria-label="${this.closeButtonLabel}">
126
- <sds-icon name="close-material-outlined" size="md"></sds-icon>
127
- </sds-button>
128
- `
129
- : nothing}
130
- </div>
131
- <slot></slot>
132
- <slot name="footer"></slot>
133
- </dialog>
134
- `;
135
- }
11
+ let SDSDialog = class SDSDialog extends SDSDialogComponent {
136
12
  };
137
- SDSDialog.styles = [styles];
138
- __decorate([
139
- property({ type: Boolean, reflect: true })
140
- ], SDSDialog.prototype, "open", void 0);
141
- __decorate([
142
- property({ type: Boolean, reflect: true })
143
- ], SDSDialog.prototype, "modal", void 0);
144
- __decorate([
145
- property({ type: String, reflect: true })
146
- ], SDSDialog.prototype, "closedby", void 0);
147
- __decorate([
148
- property({ type: String, attribute: 'close-button-label' })
149
- ], SDSDialog.prototype, "closeButtonLabel", void 0);
150
- __decorate([
151
- query('dialog')
152
- ], SDSDialog.prototype, "_dialog", void 0);
153
- __decorate([
154
- queryAssignedElements({ slot: 'header', flatten: false })
155
- ], SDSDialog.prototype, "headerSlotElements", void 0);
156
13
  SDSDialog = __decorate([
157
14
  guardedCustomElement('sds-dialog')
158
15
  ], SDSDialog);
@@ -1 +1 @@
1
- {"version":3,"file":"sds-dialog.js","sourceRoot":"","sources":["../../src/sds-dialog/sds-dialog.ts"],"names":[],"mappings":"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","sourcesContent":["import { LitElement, html, nothing, type PropertyValues } from 'lit';\nimport { property, query, queryAssignedElements } from 'lit/decorators.js';\nimport { guardedCustomElement } from '../utils/guarded-custom-element';\nimport { styles } from './sds-dialog.styles';\nimport { SheriffEvent } from '../types';\nimport { SDSEventDispatcherMixin } from '../mixins/sds-event-dispatcher-mixin';\n\nimport '../sds-icon/sds-icon';\nimport '../sds-button/sds-button';\n\ntype ClosedBy = 'none' | 'closerequest' | 'any';\n\nexport interface SDSDialogProps {\n\topen?: boolean;\n\t/**\n\t * Set if dialog opens as a modal or not\n\t *\n\t * If non-modal, the user is allowed to interact with content outside of the dialog.\n\t * If modal, the dialog is placed in the top layer with a ::backdrop pseudo-element.\n\t *\n\t * Docs:\n\t * - https://developer.mozilla.org/en-US/docs/Web/API/HTMLDialogElement/show\n\t * - https://developer.mozilla.org/en-US/docs/Web/API/HTMLDialogElement/showModal\n\t */\n\tmodal?: boolean;\n\t/**\n\t * Set what type of dismiss behavior closes the dialog\n\t * - 'none': Dialog can only be closed programmatically\n\t * - 'closerequest': Dialog closes on ESC key (default)\n\t * - 'any': Dialog closes on ESC key or clicking outside\n\t *\n\t * Docs: https://developer.mozilla.org/en-US/docs/Web/API/HTMLDialogElement/closedBy\n\t */\n\tclosedby?: ClosedBy;\n\t'close-button-label'?: string;\n}\n\n@guardedCustomElement('sds-dialog')\nexport class SDSDialog extends SDSEventDispatcherMixin(LitElement) {\n\tstatic override styles = [styles];\n\n\t@property({ type: Boolean, reflect: true }) open: boolean = false;\n\t@property({ type: Boolean, reflect: true }) modal: boolean = false;\n\t@property({ type: String, reflect: true }) closedby: ClosedBy = 'closerequest';\n\t@property({ type: String, attribute: 'close-button-label' }) closeButtonLabel: string = 'Lukk dialogvindu';\n\n\t@query('dialog') private _dialog!: HTMLDialogElement;\n\n\t@queryAssignedElements({ slot: 'header', flatten: false }) private headerSlotElements!: Element[];\n\n\toverride firstUpdated(): void {\n\t\tthis._setupEventListeners();\n\t\tif (this.open) {\n\t\t\tthis._openDialog();\n\t\t}\n\t}\n\n\toverride updated(changedProperties: PropertyValues): void {\n\t\tif (!changedProperties.has('open')) {\n\t\t\treturn;\n\t\t}\n\t\tthis.open ? this._openDialog() : this._closeDialog();\n\t}\n\n\tprivate _setupEventListeners(): void {\n\t\tthis._dialog.addEventListener('close', this._handleClose);\n\t\tthis._dialog.addEventListener('cancel', this._handleCancel);\n\t\tthis._dialog.addEventListener('click', this._handleClick);\n\t\tthis._dialog.addEventListener('animationend', this._handleAutoFocus);\n\t}\n\n\tprivate _openDialog(): void {\n\t\tif (!this._dialog) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.modal ? this._dialog.showModal() : this._dialog.show();\n\t}\n\n\tprivate _closeDialog(): void {\n\t\tif (!this._dialog) {\n\t\t\treturn;\n\t\t}\n\t\tthis._dialog.close();\n\t}\n\n\tprivate readonly _handleClose = (): void => {\n\t\tthis.open = false;\n\t\tthis.dispatchSheriffEvent('sds-close');\n\t};\n\n\tprivate readonly _handleClick = (event: MouseEvent): void => {\n\t\tconst target = event.target as Element | null;\n\n\t\tif (target?.closest('[data-command=\"close\"]')) {\n\t\t\tthis._closeDialog();\n\t\t\treturn;\n\t\t}\n\n\t\t// Clicking the backdrop will have the dialog as the target in Safari/Chrome.\n\t\t// Firefox does not fire this callback when ::backdrop is clicked.\n\t\tif (target !== this._dialog) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (this.closedby !== 'any') {\n\t\t\treturn;\n\t\t}\n\n\t\t// Cast _dialog to its own type to avoid it being narrowed to never by TS.\n\t\t// The types defines that `closedBy` _is_ in dialog.\n\t\t// So, if it is not, it can't be that type and is cast to never.\n\t\t// Do this test to check if closedBy is supported in current browser.\n\t\tconst hasClosedBy = 'closedBy' in (this._dialog as typeof this._dialog);\n\t\tif (hasClosedBy) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Manual bounds checking for Safari as it does not (yet) support closedby=\"any\".\n\t\tconst { clientX: x, clientY: y } = event;\n\t\tconst { top, bottom, left, right } = this._dialog.getBoundingClientRect();\n\t\tconst clickedOutsideDialog = top > y || bottom < y || left > x || right < x;\n\t\tif (clickedOutsideDialog) {\n\t\t\tthis._closeDialog();\n\t\t}\n\t};\n\n\tprivate readonly _handleCancel = (event: Event): void => {\n\t\tif (this.closedby === 'none') {\n\t\t\tevent.preventDefault();\n\t\t}\n\t};\n\n\tprivate readonly _handleAutoFocus = (): void => {\n\t\t// slot:not([name]) finds the default nameless slot\n\t\tconst contentSlotElements = this.shadowRoot?.querySelector<HTMLSlotElement>('slot:not([name])')?.assignedElements({ flatten: true });\n\t\tif (!contentSlotElements || contentSlotElements.length === 0) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst elementToFocus = contentSlotElements.find((element) => {\n\t\t\treturn element.getAttribute('autofocus') != null;\n\t\t});\n\n\t\tif (!(elementToFocus instanceof HTMLElement)) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (document.activeElement !== elementToFocus) {\n\t\t\telementToFocus.focus();\n\t\t}\n\t};\n\n\tpublic show(): void {\n\t\tthis.open = true;\n\t}\n\n\tpublic showModal(): void {\n\t\tthis.modal = true;\n\t\tthis.open = true;\n\t}\n\n\tpublic close(): void {\n\t\tthis.open = false;\n\t}\n\n\toverride render() {\n\t\tconst headerIsEmpty = this.headerSlotElements.length === 0;\n\t\treturn html`\n\t\t\t<dialog closedby=\"${this.closedby}\" class=${headerIsEmpty ? 'sds-dialog__empty-header' : ''}>\n\t\t\t\t<div class=\"sds-dialog__header\">\n\t\t\t\t\t<slot name=\"header\"></slot>\n\t\t\t\t\t${this.closeButtonLabel\n\t\t\t\t\t\t? html`\n\t\t\t\t\t\t\t\t<sds-button class=\"sds-dialog__close-button\" icon variant=\"tertiary\" size=\"md\" data-command=\"close\" aria-label=\"${this.closeButtonLabel}\">\n\t\t\t\t\t\t\t\t\t<sds-icon name=\"close-material-outlined\" size=\"md\"></sds-icon>\n\t\t\t\t\t\t\t\t</sds-button>\n\t\t\t\t\t\t\t`\n\t\t\t\t\t\t: nothing}\n\t\t\t\t</div>\n\t\t\t\t<slot></slot>\n\t\t\t\t<slot name=\"footer\"></slot>\n\t\t\t</dialog>\n\t\t`;\n\t}\n}\n\ndeclare global {\n\tinterface HTMLElementTagNameMap {\n\t\t'sds-dialog': SDSDialog;\n\t}\n\tinterface GlobalEventHandlersEventMap {\n\t\t'sds-close': SheriffEvent;\n\t}\n}\n"]}
1
+ {"version":3,"file":"sds-dialog.js","sourceRoot":"","sources":["../../src/sds-dialog/sds-dialog.ts"],"names":[],"mappings":";;;;;;AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,iCAAiC,CAAC;AAEvE,OAAO,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAE5D,OAAO,sBAAsB,CAAC;AAC9B,OAAO,0BAA0B,CAAC;AAG3B,IAAM,SAAS,GAAf,MAAM,SAAU,SAAQ,kBAAkB;CAAG,CAAA;AAAvC,SAAS;IADrB,oBAAoB,CAAC,YAAY,CAAC;GACtB,SAAS,CAA8B","sourcesContent":["import { guardedCustomElement } from '../utils/guarded-custom-element';\nimport { SheriffEvent } from '../types';\nimport { SDSDialogComponent } from './sds-dialog.component';\n\nimport '../sds-icon/sds-icon';\nimport '../sds-button/sds-button';\n\n@guardedCustomElement('sds-dialog')\nexport class SDSDialog extends SDSDialogComponent {}\n\ndeclare global {\n\tinterface HTMLElementTagNameMap {\n\t\t'sds-dialog': SDSDialog;\n\t}\n\tinterface GlobalEventHandlersEventMap {\n\t\t'sds-close': SheriffEvent;\n\t}\n}\n"]}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=sds-dialog.spec.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sds-dialog.spec.d.ts","sourceRoot":"","sources":["../../src/sds-dialog/sds-dialog.spec.ts"],"names":[],"mappings":""}
@@ -0,0 +1,50 @@
1
+ import { test, expect } from '@playwright/test';
2
+ test.describe('dialog-component', () => {
3
+ test.describe('commandfor', () => {
4
+ test.beforeEach(async ({ page }) => {
5
+ await page.goto('iframe.html?id=komponenter-dialog--dialog');
6
+ });
7
+ test('sets aria-haspopup on the trigger button', async ({ page }) => {
8
+ const innerButton = page.locator('sds-button[commandfor="dialog-example"][command="show-modal"]').locator('button');
9
+ await expect(innerButton).toHaveAttribute('aria-haspopup', 'dialog');
10
+ });
11
+ test('sets aria-controls on the trigger button', async ({ page }) => {
12
+ const innerButton = page.locator('sds-button[commandfor="dialog-example"][command="show-modal"]').locator('button');
13
+ await expect(innerButton).toHaveAttribute('aria-controls', 'dialog-example');
14
+ });
15
+ test('aria-expanded is false before opening', async ({ page }) => {
16
+ const innerButton = page.locator('sds-button[commandfor="dialog-example"][command="show-modal"]').locator('button');
17
+ await expect(innerButton).toHaveAttribute('aria-expanded', 'false');
18
+ });
19
+ test('clicking the trigger opens the dialog', async ({ page }) => {
20
+ const trigger = page.locator('sds-button[commandfor="dialog-example"][command="show-modal"]');
21
+ const dialog = page.locator('sds-dialog#dialog-example');
22
+ await trigger.click();
23
+ await expect(dialog).toHaveAttribute('open');
24
+ });
25
+ test('aria-expanded is true when dialog is open', async ({ page }) => {
26
+ const trigger = page.locator('sds-button[commandfor="dialog-example"][command="show-modal"]');
27
+ const innerButton = trigger.locator('button');
28
+ await trigger.click();
29
+ await expect(innerButton).toHaveAttribute('aria-expanded', 'true');
30
+ });
31
+ test('closing via command="close" resets aria-expanded', async ({ page }) => {
32
+ const trigger = page.locator('sds-button[commandfor="dialog-example"][command="show-modal"]');
33
+ const innerButton = trigger.locator('button');
34
+ await trigger.click();
35
+ await expect(innerButton).toHaveAttribute('aria-expanded', 'true');
36
+ const closeButton = page.locator('sds-dialog#dialog-example sds-button[slot="footer"][command="close"]');
37
+ await closeButton.click();
38
+ await expect(innerButton).toHaveAttribute('aria-expanded', 'false');
39
+ });
40
+ test('closing via ESC resets aria-expanded', async ({ page }) => {
41
+ const trigger = page.locator('sds-button[commandfor="dialog-example"][command="show-modal"]');
42
+ const innerButton = trigger.locator('button');
43
+ await trigger.click();
44
+ await expect(innerButton).toHaveAttribute('aria-expanded', 'true');
45
+ await page.keyboard.press('Escape');
46
+ await expect(innerButton).toHaveAttribute('aria-expanded', 'false');
47
+ });
48
+ });
49
+ });
50
+ //# sourceMappingURL=sds-dialog.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sds-dialog.spec.js","sourceRoot":"","sources":["../../src/sds-dialog/sds-dialog.spec.ts"],"names":[],"mappings":"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","sourcesContent":["import { test, expect } from '@playwright/test';\n\ntest.describe('dialog-component', () => {\n\ttest.describe('commandfor', () => {\n\t\ttest.beforeEach(async ({ page }) => {\n\t\t\tawait page.goto('iframe.html?id=komponenter-dialog--dialog');\n\t\t});\n\n\t\ttest('sets aria-haspopup on the trigger button', async ({ page }) => {\n\t\t\tconst innerButton = page.locator('sds-button[commandfor=\"dialog-example\"][command=\"show-modal\"]').locator('button');\n\t\t\tawait expect(innerButton).toHaveAttribute('aria-haspopup', 'dialog');\n\t\t});\n\n\t\ttest('sets aria-controls on the trigger button', async ({ page }) => {\n\t\t\tconst innerButton = page.locator('sds-button[commandfor=\"dialog-example\"][command=\"show-modal\"]').locator('button');\n\t\t\tawait expect(innerButton).toHaveAttribute('aria-controls', 'dialog-example');\n\t\t});\n\n\t\ttest('aria-expanded is false before opening', async ({ page }) => {\n\t\t\tconst innerButton = page.locator('sds-button[commandfor=\"dialog-example\"][command=\"show-modal\"]').locator('button');\n\t\t\tawait expect(innerButton).toHaveAttribute('aria-expanded', 'false');\n\t\t});\n\n\t\ttest('clicking the trigger opens the dialog', async ({ page }) => {\n\t\t\tconst trigger = page.locator('sds-button[commandfor=\"dialog-example\"][command=\"show-modal\"]');\n\t\t\tconst dialog = page.locator('sds-dialog#dialog-example');\n\n\t\t\tawait trigger.click();\n\n\t\t\tawait expect(dialog).toHaveAttribute('open');\n\t\t});\n\n\t\ttest('aria-expanded is true when dialog is open', async ({ page }) => {\n\t\t\tconst trigger = page.locator('sds-button[commandfor=\"dialog-example\"][command=\"show-modal\"]');\n\t\t\tconst innerButton = trigger.locator('button');\n\n\t\t\tawait trigger.click();\n\n\t\t\tawait expect(innerButton).toHaveAttribute('aria-expanded', 'true');\n\t\t});\n\n\t\ttest('closing via command=\"close\" resets aria-expanded', async ({ page }) => {\n\t\t\tconst trigger = page.locator('sds-button[commandfor=\"dialog-example\"][command=\"show-modal\"]');\n\t\t\tconst innerButton = trigger.locator('button');\n\n\t\t\tawait trigger.click();\n\t\t\tawait expect(innerButton).toHaveAttribute('aria-expanded', 'true');\n\n\t\t\tconst closeButton = page.locator('sds-dialog#dialog-example sds-button[slot=\"footer\"][command=\"close\"]');\n\t\t\tawait closeButton.click();\n\n\t\t\tawait expect(innerButton).toHaveAttribute('aria-expanded', 'false');\n\t\t});\n\n\t\ttest('closing via ESC resets aria-expanded', async ({ page }) => {\n\t\t\tconst trigger = page.locator('sds-button[commandfor=\"dialog-example\"][command=\"show-modal\"]');\n\t\t\tconst innerButton = trigger.locator('button');\n\n\t\t\tawait trigger.click();\n\t\t\tawait expect(innerButton).toHaveAttribute('aria-expanded', 'true');\n\n\t\t\tawait page.keyboard.press('Escape');\n\n\t\t\tawait expect(innerButton).toHaveAttribute('aria-expanded', 'false');\n\t\t});\n\t});\n});\n"]}
@@ -11,6 +11,7 @@ export const styles = css `
11
11
  --_sds-dialog-max-width: var(--sds-dialog-max-width, min(60ch, 100vw));
12
12
  --_sds-dialog-max-height: var(--sds-dialog-max-height, calc(100dvh - var(--sds-spacing-lg)));
13
13
 
14
+ --_sds-dialog-margin: var(--sds-dialog-margin, auto);
14
15
  --_sds-dialog-padding-block: var(--sds-dialog-padding-block, var(--sds-spacing-sm));
15
16
  --_sds-dialog-padding-inline: var(--sds-dialog-padding-inline, var(--sds-spacing-sm));
16
17
  --_sds-dialog-gap: var(--sds-dialog-gap, var(--sds-spacing-xs));
@@ -54,14 +55,13 @@ export const styles = css `
54
55
  &[open] {
55
56
  display: flex;
56
57
  flex-direction: column;
58
+ margin: var(--_sds-dialog-margin);
57
59
  padding-block: var(--_sds-dialog-padding-block);
58
60
  padding-inline: var(--_sds-dialog-padding-inline);
59
61
  gap: var(--_sds-dialog-gap);
60
62
  }
61
63
 
62
- &.sds-dialog__empty-header {
63
- /* Set gap to 0 to collapse empty header */
64
- --_sds-dialog-gap: var(--sds-dialog-gap, var(--sds-spacing-zero));
64
+ &.sds-dialog__empty-header:has(.sds-dialog__close-button) {
65
65
  /* Set padding right to avoid overflowing the close button */
66
66
  padding-right: var(--sds-dialog-padding-right, var(--sds-spacing-lg));
67
67
  }
@@ -102,7 +102,7 @@ export const styles = css `
102
102
  @media (max-width: 640px) {
103
103
  :host {
104
104
  --_sds-dialog-max-width: var(--sds-dialog-max-width, 100%);
105
- --_sds-dialog-border-radius: var(--sds-dialog-border-radius, var(--sds-spacing-zero));
105
+ --_sds-dialog-margin: var(--sds-dialog-margin, var(--sds-spacing-xs));
106
106
  }
107
107
  }
108
108