@internetarchive/modal-manager 0.2.12 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (84) hide show
  1. package/.editorconfig +29 -29
  2. package/.eslintrc.js +14 -14
  3. package/.github/workflows/ci.yml +26 -26
  4. package/.github/workflows/gh-pages-main.yml +42 -0
  5. package/.github/workflows/pr-preview.yml +40 -0
  6. package/LICENSE +661 -661
  7. package/README.md +139 -139
  8. package/custom-elements.json +170 -170
  9. package/dist/index.d.ts +7 -7
  10. package/dist/index.js +5 -5
  11. package/dist/index.js.map +1 -1
  12. package/dist/src/modal-config.d.ts +92 -92
  13. package/dist/src/modal-config.js +22 -22
  14. package/dist/src/modal-config.js.map +1 -1
  15. package/dist/src/modal-manager-host-bridge-interface.d.ts +12 -12
  16. package/dist/src/modal-manager-host-bridge-interface.js +1 -0
  17. package/dist/src/modal-manager-host-bridge-interface.js.map +1 -1
  18. package/dist/src/modal-manager-host-bridge.d.ts +34 -34
  19. package/dist/src/modal-manager-host-bridge.js +62 -62
  20. package/dist/src/modal-manager-host-bridge.js.map +1 -1
  21. package/dist/src/modal-manager-interface.d.ts +25 -25
  22. package/dist/src/modal-manager-interface.js +1 -0
  23. package/dist/src/modal-manager-interface.js.map +1 -1
  24. package/dist/src/modal-manager-mode.d.ts +10 -10
  25. package/dist/src/modal-manager-mode.js +11 -11
  26. package/dist/src/modal-manager-mode.js.map +1 -1
  27. package/dist/src/modal-manager.d.ts +108 -108
  28. package/dist/src/modal-manager.js +192 -189
  29. package/dist/src/modal-manager.js.map +1 -1
  30. package/dist/src/modal-template.d.ts +32 -32
  31. package/dist/src/modal-template.js +276 -276
  32. package/dist/src/modal-template.js.map +1 -1
  33. package/dist/test/modal-config.test.d.ts +1 -1
  34. package/dist/test/modal-config.test.js +61 -61
  35. package/dist/test/modal-config.test.js.map +1 -1
  36. package/dist/test/modal-manager.test.d.ts +1 -1
  37. package/dist/test/modal-manager.test.js +204 -200
  38. package/dist/test/modal-manager.test.js.map +1 -1
  39. package/dist/test/modal-template.test.d.ts +1 -1
  40. package/dist/test/modal-template.test.js +95 -95
  41. package/dist/test/modal-template.test.js.map +1 -1
  42. package/dist/vite.config.d.ts +2 -0
  43. package/dist/vite.config.js +23 -0
  44. package/dist/vite.config.js.map +1 -0
  45. package/docs/assets/css/main.css +2678 -2678
  46. package/docs/classes/_src_modal_config_.modalconfig.html +429 -429
  47. package/docs/classes/_src_modal_manager_.modalmanager.html +7702 -7702
  48. package/docs/classes/_src_modal_manager_host_bridge_.modalmanagerhostbridge.html +409 -409
  49. package/docs/classes/_src_modal_template_.modaltemplate.html +7096 -7096
  50. package/docs/enums/_src_modal_manager_mode_.modalmanagermode.html +196 -196
  51. package/docs/globals.html +150 -150
  52. package/docs/index.html +252 -252
  53. package/docs/interfaces/_src_modal_manager_host_bridge_interface_.modalmanagerhostbridgeinterface.html +210 -210
  54. package/docs/interfaces/_src_modal_manager_interface_.modalmanagerinterface.html +7095 -7095
  55. package/docs/modules/_index_.html +208 -208
  56. package/docs/modules/_src_modal_config_.html +146 -146
  57. package/docs/modules/_src_modal_manager_.html +146 -146
  58. package/docs/modules/_src_modal_manager_host_bridge_.html +146 -146
  59. package/docs/modules/_src_modal_manager_host_bridge_interface_.html +146 -146
  60. package/docs/modules/_src_modal_manager_interface_.html +146 -146
  61. package/docs/modules/_src_modal_manager_mode_.html +146 -146
  62. package/docs/modules/_src_modal_template_.html +146 -146
  63. package/docs/modules/_test_modal_config_test_.html +106 -106
  64. package/docs/modules/_test_modal_manager_test_.html +106 -106
  65. package/docs/modules/_test_modal_template_test_.html +106 -106
  66. package/{demo/index.html → index.html} +278 -278
  67. package/index.ts +7 -7
  68. package/karma.conf.js +24 -24
  69. package/package.json +85 -82
  70. package/renovate.json +7 -0
  71. package/src/modal-config.ts +117 -117
  72. package/src/modal-manager-host-bridge-interface.ts +13 -13
  73. package/src/modal-manager-host-bridge.ts +82 -82
  74. package/src/modal-manager-interface.ts +28 -28
  75. package/src/modal-manager-mode.ts +10 -10
  76. package/src/modal-manager.ts +230 -228
  77. package/src/modal-template.ts +279 -279
  78. package/test/modal-config.test.ts +69 -69
  79. package/test/modal-manager.test.ts +250 -245
  80. package/test/modal-template.test.ts +111 -111
  81. package/tsconfig.json +21 -20
  82. package/vite.config.ts +23 -0
  83. /package/{demo → assets/images}/100x100.jpg +0 -0
  84. /package/{demo → assets/images}/200x200.jpg +0 -0
@@ -1,108 +1,108 @@
1
- import { LitElement, CSSResult, TemplateResult, PropertyValues } from 'lit';
2
- import './modal-template';
3
- import { ModalConfig } from './modal-config';
4
- import { ModalManagerInterface } from './modal-manager-interface';
5
- import { ModalManagerHostBridgeInterface } from './modal-manager-host-bridge-interface';
6
- import { ModalManagerMode } from './modal-manager-mode';
7
- export declare class ModalManager extends LitElement implements ModalManagerInterface {
8
- /**
9
- * The current mode of the ModalManager
10
- *
11
- * Current options are `modal` or `closed`
12
- *
13
- * @type {ModalManagerMode}
14
- * @memberof ModalManager
15
- */
16
- mode: ModalManagerMode;
17
- /**
18
- * Custom content to display in the modal's content slot
19
- *
20
- * @type {(TemplateResult | undefined)}
21
- * @memberof ModalManager
22
- */
23
- customModalContent?: TemplateResult;
24
- /**
25
- * Thie hostBridge handles environmental-specific interactions such as adding classes
26
- * to the body tag or event listeners needed to support the modal manager in the host environment.
27
- *
28
- * There is a default `ModalManagerHostBridge`, but consumers can override it with a custom
29
- * `ModalManagerHostBridgeInterface`
30
- *
31
- * @type {ModalManagerHostBridgeInterface}
32
- * @memberof ModalManager
33
- */
34
- hostBridge: ModalManagerHostBridgeInterface;
35
- /**
36
- * Reference to the ModalTemplate DOM element
37
- *
38
- * @private
39
- * @type {ModalTemplate}
40
- * @memberof ModalManager
41
- */
42
- private modalTemplate;
43
- /** @inheritdoc */
44
- render(): TemplateResult;
45
- /** @inheritdoc */
46
- getMode(): ModalManagerMode;
47
- /** @inheritdoc */
48
- closeModal(): void;
49
- /**
50
- * Whether the modal should close if the user taps on the backdrop
51
- *
52
- * @private
53
- * @memberof ModalManager
54
- */
55
- private closeOnBackdropClick;
56
- /**
57
- * A callback if the user closes the modal
58
- *
59
- * @private
60
- * @memberof ModalManager
61
- */
62
- private userClosedModalCallback?;
63
- /**
64
- * Call the userClosedModalCallback and reset it if it exists
65
- *
66
- * @private
67
- * @memberof ModalManager
68
- */
69
- private callUserClosedModalCallback;
70
- /** @inheritdoc */
71
- showModal(options: {
72
- config: ModalConfig;
73
- customModalContent?: TemplateResult;
74
- userClosedModalCallback?: () => void;
75
- }): Promise<void>;
76
- /** @inheritdoc */
77
- updated(changed: PropertyValues): void;
78
- /**
79
- * Called when the backdrop is clicked
80
- *
81
- * @private
82
- * @memberof ModalManager
83
- */
84
- private backdropClicked;
85
- /**
86
- * Handle the mode change
87
- *
88
- * @private
89
- * @memberof ModalManager
90
- */
91
- private handleModeChange;
92
- /**
93
- * Emit a modeChange event
94
- *
95
- * @private
96
- * @memberof ModalManager
97
- */
98
- private emitModeChangeEvent;
99
- /**
100
- * Called when the modal close button is pressed. Closes the modal.
101
- *
102
- * @private
103
- * @memberof ModalManager
104
- */
105
- private closeButtonPressed;
106
- /** @inheritdoc */
107
- static get styles(): CSSResult;
108
- }
1
+ import { LitElement, CSSResult, TemplateResult, PropertyValues } from 'lit';
2
+ import './modal-template';
3
+ import { ModalConfig } from './modal-config';
4
+ import { ModalManagerInterface } from './modal-manager-interface';
5
+ import { ModalManagerHostBridgeInterface } from './modal-manager-host-bridge-interface';
6
+ import { ModalManagerMode } from './modal-manager-mode';
7
+ export declare class ModalManager extends LitElement implements ModalManagerInterface {
8
+ /**
9
+ * The current mode of the ModalManager
10
+ *
11
+ * Current options are `modal` or `closed`
12
+ *
13
+ * @type {ModalManagerMode}
14
+ * @memberof ModalManager
15
+ */
16
+ mode: ModalManagerMode;
17
+ /**
18
+ * Custom content to display in the modal's content slot
19
+ *
20
+ * @type {(TemplateResult | undefined)}
21
+ * @memberof ModalManager
22
+ */
23
+ customModalContent?: TemplateResult;
24
+ /**
25
+ * Thie hostBridge handles environmental-specific interactions such as adding classes
26
+ * to the body tag or event listeners needed to support the modal manager in the host environment.
27
+ *
28
+ * There is a default `ModalManagerHostBridge`, but consumers can override it with a custom
29
+ * `ModalManagerHostBridgeInterface`
30
+ *
31
+ * @type {ModalManagerHostBridgeInterface}
32
+ * @memberof ModalManager
33
+ */
34
+ hostBridge: ModalManagerHostBridgeInterface;
35
+ /**
36
+ * Reference to the ModalTemplate DOM element
37
+ *
38
+ * @private
39
+ * @type {ModalTemplate}
40
+ * @memberof ModalManager
41
+ */
42
+ private modalTemplate;
43
+ /** @inheritdoc */
44
+ render(): TemplateResult;
45
+ /** @inheritdoc */
46
+ getMode(): ModalManagerMode;
47
+ /** @inheritdoc */
48
+ closeModal(): void;
49
+ /**
50
+ * Whether the modal should close if the user taps on the backdrop
51
+ *
52
+ * @private
53
+ * @memberof ModalManager
54
+ */
55
+ private closeOnBackdropClick;
56
+ /**
57
+ * A callback if the user closes the modal
58
+ *
59
+ * @private
60
+ * @memberof ModalManager
61
+ */
62
+ private userClosedModalCallback?;
63
+ /**
64
+ * Call the userClosedModalCallback and reset it if it exists
65
+ *
66
+ * @private
67
+ * @memberof ModalManager
68
+ */
69
+ private callUserClosedModalCallback;
70
+ /** @inheritdoc */
71
+ showModal(options: {
72
+ config: ModalConfig;
73
+ customModalContent?: TemplateResult;
74
+ userClosedModalCallback?: () => void;
75
+ }): Promise<void>;
76
+ /** @inheritdoc */
77
+ updated(changed: PropertyValues): void;
78
+ /**
79
+ * Called when the backdrop is clicked
80
+ *
81
+ * @private
82
+ * @memberof ModalManager
83
+ */
84
+ private backdropClicked;
85
+ /**
86
+ * Handle the mode change
87
+ *
88
+ * @private
89
+ * @memberof ModalManager
90
+ */
91
+ private handleModeChange;
92
+ /**
93
+ * Emit a modeChange event
94
+ *
95
+ * @private
96
+ * @memberof ModalManager
97
+ */
98
+ private emitModeChangeEvent;
99
+ /**
100
+ * Called when the modal close button is pressed. Closes the modal.
101
+ *
102
+ * @private
103
+ * @memberof ModalManager
104
+ */
105
+ private closeButtonPressed;
106
+ /** @inheritdoc */
107
+ static get styles(): CSSResult;
108
+ }
@@ -1,190 +1,193 @@
1
- import { __awaiter, __decorate } from "tslib";
2
- import { LitElement, html, css, } from 'lit';
3
- import { property, customElement, query } from 'lit/decorators.js';
4
- import './modal-template';
5
- import { ModalManagerHostBridge } from './modal-manager-host-bridge';
6
- import { ModalManagerMode } from './modal-manager-mode';
7
- let ModalManager = class ModalManager extends LitElement {
8
- constructor() {
9
- super(...arguments);
10
- /**
11
- * The current mode of the ModalManager
12
- *
13
- * Current options are `modal` or `closed`
14
- *
15
- * @type {ModalManagerMode}
16
- * @memberof ModalManager
17
- */
18
- this.mode = ModalManagerMode.Closed;
19
- /**
20
- * Thie hostBridge handles environmental-specific interactions such as adding classes
21
- * to the body tag or event listeners needed to support the modal manager in the host environment.
22
- *
23
- * There is a default `ModalManagerHostBridge`, but consumers can override it with a custom
24
- * `ModalManagerHostBridgeInterface`
25
- *
26
- * @type {ModalManagerHostBridgeInterface}
27
- * @memberof ModalManager
28
- */
29
- this.hostBridge = new ModalManagerHostBridge(this);
30
- /**
31
- * Whether the modal should close if the user taps on the backdrop
32
- *
33
- * @private
34
- * @memberof ModalManager
35
- */
36
- this.closeOnBackdropClick = true;
37
- }
38
- /** @inheritdoc */
39
- render() {
40
- return html `
41
- <div class="container">
42
- <div class="backdrop" @click=${this.backdropClicked}></div>
43
- <modal-template
44
- @closeButtonPressed=${this.closeButtonPressed}
45
- tabindex="0"
46
- >
47
- ${this.customModalContent}
48
- </modal-template>
49
- </div>
50
- `;
51
- }
52
- /** @inheritdoc */
53
- getMode() {
54
- return this.mode;
55
- }
56
- /** @inheritdoc */
57
- closeModal() {
58
- this.mode = ModalManagerMode.Closed;
59
- }
60
- /**
61
- * Call the userClosedModalCallback and reset it if it exists
62
- *
63
- * @private
64
- * @memberof ModalManager
65
- */
66
- callUserClosedModalCallback() {
67
- // we assign the callback to a temp var and undefine it before calling it
68
- // otherwise, we run into the potential for an infinite loop if the
69
- // callback triggers another `showModal()`, which would execute `userClosedModalCallback`
70
- const callback = this.userClosedModalCallback;
71
- this.userClosedModalCallback = undefined;
72
- if (callback)
73
- callback();
74
- }
75
- /** @inheritdoc */
76
- showModal(options) {
77
- return __awaiter(this, void 0, void 0, function* () {
78
- this.closeOnBackdropClick = options.config.closeOnBackdropClick;
79
- this.userClosedModalCallback = options.userClosedModalCallback;
80
- this.modalTemplate.config = options.config;
81
- this.customModalContent = options.customModalContent;
82
- this.mode = ModalManagerMode.Open;
83
- yield this.modalTemplate.updateComplete;
84
- this.modalTemplate.focus();
85
- });
86
- }
87
- /** @inheritdoc */
88
- updated(changed) {
89
- /* istanbul ignore else */
90
- if (changed.has('mode')) {
91
- this.handleModeChange();
92
- }
93
- }
94
- /**
95
- * Called when the backdrop is clicked
96
- *
97
- * @private
98
- * @memberof ModalManager
99
- */
100
- backdropClicked() {
101
- if (this.closeOnBackdropClick) {
102
- this.closeModal();
103
- this.callUserClosedModalCallback();
104
- }
105
- }
106
- /**
107
- * Handle the mode change
108
- *
109
- * @private
110
- * @memberof ModalManager
111
- */
112
- handleModeChange() {
113
- this.hostBridge.handleModeChange(this.mode);
114
- this.emitModeChangeEvent();
115
- }
116
- /**
117
- * Emit a modeChange event
118
- *
119
- * @private
120
- * @memberof ModalManager
121
- */
122
- emitModeChangeEvent() {
123
- const event = new CustomEvent('modeChanged', {
124
- detail: { mode: this.mode },
125
- });
126
- this.dispatchEvent(event);
127
- }
128
- /**
129
- * Called when the modal close button is pressed. Closes the modal.
130
- *
131
- * @private
132
- * @memberof ModalManager
133
- */
134
- closeButtonPressed() {
135
- this.closeModal();
136
- this.callUserClosedModalCallback();
137
- }
138
- /** @inheritdoc */
139
- static get styles() {
140
- const modalBackdropColor = css `var(--modalBackdropColor, rgba(10, 10, 10, 0.9))`;
141
- const modalBackdropZindex = css `var(--modalBackdropZindex, 1000)`;
142
- const modalWidth = css `var(--modalWidth, 32rem)`;
143
- const modalMaxWidth = css `var(--modalMaxWidth, 95%)`;
144
- const modalZindex = css `var(--modalZindex, 2000)`;
145
- return css `
146
- .container {
147
- width: 100%;
148
- height: 100%;
149
- }
150
-
151
- .backdrop {
152
- position: fixed;
153
- top: 0;
154
- left: 0;
155
- background-color: ${modalBackdropColor};
156
- width: 100%;
157
- height: 100%;
158
- z-index: ${modalBackdropZindex};
159
- }
160
-
161
- modal-template {
162
- outline: 0;
163
- position: fixed;
164
- top: 0;
165
- left: 50%;
166
- transform: translate(-50%, 0);
167
- z-index: ${modalZindex};
168
- width: ${modalWidth};
169
- max-width: ${modalMaxWidth};
170
- }
171
- `;
172
- }
173
- };
174
- __decorate([
175
- property({ type: String, reflect: true })
176
- ], ModalManager.prototype, "mode", void 0);
177
- __decorate([
178
- property({ type: Object })
179
- ], ModalManager.prototype, "customModalContent", void 0);
180
- __decorate([
181
- property({ type: Object })
182
- ], ModalManager.prototype, "hostBridge", void 0);
183
- __decorate([
184
- query('modal-template')
185
- ], ModalManager.prototype, "modalTemplate", void 0);
186
- ModalManager = __decorate([
187
- customElement('modal-manager')
188
- ], ModalManager);
189
- export { ModalManager };
1
+ import { __awaiter, __decorate } from "tslib";
2
+ import { LitElement, html, css, } from 'lit';
3
+ import { property, customElement, query } from 'lit/decorators.js';
4
+ import './modal-template';
5
+ import { ModalConfig } from './modal-config';
6
+ import { ModalManagerHostBridge } from './modal-manager-host-bridge';
7
+ import { ModalManagerMode } from './modal-manager-mode';
8
+ let ModalManager = class ModalManager extends LitElement {
9
+ constructor() {
10
+ super(...arguments);
11
+ /**
12
+ * The current mode of the ModalManager
13
+ *
14
+ * Current options are `modal` or `closed`
15
+ *
16
+ * @type {ModalManagerMode}
17
+ * @memberof ModalManager
18
+ */
19
+ this.mode = ModalManagerMode.Closed;
20
+ /**
21
+ * Thie hostBridge handles environmental-specific interactions such as adding classes
22
+ * to the body tag or event listeners needed to support the modal manager in the host environment.
23
+ *
24
+ * There is a default `ModalManagerHostBridge`, but consumers can override it with a custom
25
+ * `ModalManagerHostBridgeInterface`
26
+ *
27
+ * @type {ModalManagerHostBridgeInterface}
28
+ * @memberof ModalManager
29
+ */
30
+ this.hostBridge = new ModalManagerHostBridge(this);
31
+ /**
32
+ * Whether the modal should close if the user taps on the backdrop
33
+ *
34
+ * @private
35
+ * @memberof ModalManager
36
+ */
37
+ this.closeOnBackdropClick = true;
38
+ }
39
+ /** @inheritdoc */
40
+ render() {
41
+ return html `
42
+ <div class="container">
43
+ <div class="backdrop" @click=${this.backdropClicked}></div>
44
+ <modal-template
45
+ @closeButtonPressed=${this.closeButtonPressed}
46
+ tabindex="0"
47
+ >
48
+ ${this.customModalContent}
49
+ </modal-template>
50
+ </div>
51
+ `;
52
+ }
53
+ /** @inheritdoc */
54
+ getMode() {
55
+ return this.mode;
56
+ }
57
+ /** @inheritdoc */
58
+ closeModal() {
59
+ this.mode = ModalManagerMode.Closed;
60
+ this.customModalContent = undefined;
61
+ this.modalTemplate.config = new ModalConfig();
62
+ }
63
+ /**
64
+ * Call the userClosedModalCallback and reset it if it exists
65
+ *
66
+ * @private
67
+ * @memberof ModalManager
68
+ */
69
+ callUserClosedModalCallback() {
70
+ // we assign the callback to a temp var and undefine it before calling it
71
+ // otherwise, we run into the potential for an infinite loop if the
72
+ // callback triggers another `showModal()`, which would execute `userClosedModalCallback`
73
+ const callback = this.userClosedModalCallback;
74
+ this.userClosedModalCallback = undefined;
75
+ if (callback)
76
+ callback();
77
+ }
78
+ /** @inheritdoc */
79
+ showModal(options) {
80
+ return __awaiter(this, void 0, void 0, function* () {
81
+ this.closeOnBackdropClick = options.config.closeOnBackdropClick;
82
+ this.userClosedModalCallback = options.userClosedModalCallback;
83
+ this.modalTemplate.config = options.config;
84
+ this.customModalContent = options.customModalContent;
85
+ this.mode = ModalManagerMode.Open;
86
+ yield this.modalTemplate.updateComplete;
87
+ this.modalTemplate.focus();
88
+ });
89
+ }
90
+ /** @inheritdoc */
91
+ updated(changed) {
92
+ /* istanbul ignore else */
93
+ if (changed.has('mode')) {
94
+ this.handleModeChange();
95
+ }
96
+ }
97
+ /**
98
+ * Called when the backdrop is clicked
99
+ *
100
+ * @private
101
+ * @memberof ModalManager
102
+ */
103
+ backdropClicked() {
104
+ if (this.closeOnBackdropClick) {
105
+ this.closeModal();
106
+ this.callUserClosedModalCallback();
107
+ }
108
+ }
109
+ /**
110
+ * Handle the mode change
111
+ *
112
+ * @private
113
+ * @memberof ModalManager
114
+ */
115
+ handleModeChange() {
116
+ this.hostBridge.handleModeChange(this.mode);
117
+ this.emitModeChangeEvent();
118
+ }
119
+ /**
120
+ * Emit a modeChange event
121
+ *
122
+ * @private
123
+ * @memberof ModalManager
124
+ */
125
+ emitModeChangeEvent() {
126
+ const event = new CustomEvent('modeChanged', {
127
+ detail: { mode: this.mode },
128
+ });
129
+ this.dispatchEvent(event);
130
+ }
131
+ /**
132
+ * Called when the modal close button is pressed. Closes the modal.
133
+ *
134
+ * @private
135
+ * @memberof ModalManager
136
+ */
137
+ closeButtonPressed() {
138
+ this.closeModal();
139
+ this.callUserClosedModalCallback();
140
+ }
141
+ /** @inheritdoc */
142
+ static get styles() {
143
+ const modalBackdropColor = css `var(--modalBackdropColor, rgba(10, 10, 10, 0.9))`;
144
+ const modalBackdropZindex = css `var(--modalBackdropZindex, 1000)`;
145
+ const modalWidth = css `var(--modalWidth, 32rem)`;
146
+ const modalMaxWidth = css `var(--modalMaxWidth, 95%)`;
147
+ const modalZindex = css `var(--modalZindex, 2000)`;
148
+ return css `
149
+ .container {
150
+ width: 100%;
151
+ height: 100%;
152
+ }
153
+
154
+ .backdrop {
155
+ position: fixed;
156
+ top: 0;
157
+ left: 0;
158
+ background-color: ${modalBackdropColor};
159
+ width: 100%;
160
+ height: 100%;
161
+ z-index: ${modalBackdropZindex};
162
+ }
163
+
164
+ modal-template {
165
+ outline: 0;
166
+ position: fixed;
167
+ top: 0;
168
+ left: 50%;
169
+ transform: translate(-50%, 0);
170
+ z-index: ${modalZindex};
171
+ width: ${modalWidth};
172
+ max-width: ${modalMaxWidth};
173
+ }
174
+ `;
175
+ }
176
+ };
177
+ __decorate([
178
+ property({ type: String, reflect: true })
179
+ ], ModalManager.prototype, "mode", void 0);
180
+ __decorate([
181
+ property({ type: Object })
182
+ ], ModalManager.prototype, "customModalContent", void 0);
183
+ __decorate([
184
+ property({ type: Object })
185
+ ], ModalManager.prototype, "hostBridge", void 0);
186
+ __decorate([
187
+ query('modal-template')
188
+ ], ModalManager.prototype, "modalTemplate", void 0);
189
+ ModalManager = __decorate([
190
+ customElement('modal-manager')
191
+ ], ModalManager);
192
+ export { ModalManager };
190
193
  //# sourceMappingURL=modal-manager.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"modal-manager.js","sourceRoot":"","sources":["../../src/modal-manager.ts"],"names":[],"mappings":"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","sourcesContent":["import {\r\n LitElement,\r\n html,\r\n css,\r\n CSSResult,\r\n TemplateResult,\r\n PropertyValues,\r\n} from 'lit';\r\nimport { property, customElement, query } from 'lit/decorators.js';\r\n\r\nimport './modal-template';\r\nimport { ModalTemplate } from './modal-template';\r\nimport { ModalConfig } from './modal-config';\r\nimport { ModalManagerHostBridge } from './modal-manager-host-bridge';\r\nimport { ModalManagerInterface } from './modal-manager-interface';\r\nimport { ModalManagerHostBridgeInterface } from './modal-manager-host-bridge-interface';\r\nimport { ModalManagerMode } from './modal-manager-mode';\r\n\r\n@customElement('modal-manager')\r\nexport class ModalManager extends LitElement implements ModalManagerInterface {\r\n /**\r\n * The current mode of the ModalManager\r\n *\r\n * Current options are `modal` or `closed`\r\n *\r\n * @type {ModalManagerMode}\r\n * @memberof ModalManager\r\n */\r\n @property({ type: String, reflect: true }) mode: ModalManagerMode =\r\n ModalManagerMode.Closed;\r\n\r\n /**\r\n * Custom content to display in the modal's content slot\r\n *\r\n * @type {(TemplateResult | undefined)}\r\n * @memberof ModalManager\r\n */\r\n @property({ type: Object }) customModalContent?: TemplateResult;\r\n\r\n /**\r\n * Thie hostBridge handles environmental-specific interactions such as adding classes\r\n * to the body tag or event listeners needed to support the modal manager in the host environment.\r\n *\r\n * There is a default `ModalManagerHostBridge`, but consumers can override it with a custom\r\n * `ModalManagerHostBridgeInterface`\r\n *\r\n * @type {ModalManagerHostBridgeInterface}\r\n * @memberof ModalManager\r\n */\r\n @property({ type: Object })\r\n hostBridge: ModalManagerHostBridgeInterface = new ModalManagerHostBridge(\r\n this\r\n );\r\n\r\n /**\r\n * Reference to the ModalTemplate DOM element\r\n *\r\n * @private\r\n * @type {ModalTemplate}\r\n * @memberof ModalManager\r\n */\r\n @query('modal-template') private modalTemplate!: ModalTemplate;\r\n\r\n /** @inheritdoc */\r\n render(): TemplateResult {\r\n return html`\r\n <div class=\"container\">\r\n <div class=\"backdrop\" @click=${this.backdropClicked}></div>\r\n <modal-template\r\n @closeButtonPressed=${this.closeButtonPressed}\r\n tabindex=\"0\"\r\n >\r\n ${this.customModalContent}\r\n </modal-template>\r\n </div>\r\n `;\r\n }\r\n\r\n /** @inheritdoc */\r\n getMode(): ModalManagerMode {\r\n return this.mode;\r\n }\r\n\r\n /** @inheritdoc */\r\n closeModal(): void {\r\n this.mode = ModalManagerMode.Closed;\r\n }\r\n\r\n /**\r\n * Whether the modal should close if the user taps on the backdrop\r\n *\r\n * @private\r\n * @memberof ModalManager\r\n */\r\n private closeOnBackdropClick = true;\r\n\r\n /**\r\n * A callback if the user closes the modal\r\n *\r\n * @private\r\n * @memberof ModalManager\r\n */\r\n private userClosedModalCallback?: () => void;\r\n\r\n /**\r\n * Call the userClosedModalCallback and reset it if it exists\r\n *\r\n * @private\r\n * @memberof ModalManager\r\n */\r\n private callUserClosedModalCallback(): void {\r\n // we assign the callback to a temp var and undefine it before calling it\r\n // otherwise, we run into the potential for an infinite loop if the\r\n // callback triggers another `showModal()`, which would execute `userClosedModalCallback`\r\n const callback = this.userClosedModalCallback;\r\n this.userClosedModalCallback = undefined;\r\n if (callback) callback();\r\n }\r\n\r\n /** @inheritdoc */\r\n async showModal(options: {\r\n config: ModalConfig;\r\n customModalContent?: TemplateResult;\r\n userClosedModalCallback?: () => void;\r\n }): Promise<void> {\r\n this.closeOnBackdropClick = options.config.closeOnBackdropClick;\r\n this.userClosedModalCallback = options.userClosedModalCallback;\r\n this.modalTemplate.config = options.config;\r\n this.customModalContent = options.customModalContent;\r\n this.mode = ModalManagerMode.Open;\r\n await this.modalTemplate.updateComplete;\r\n this.modalTemplate.focus();\r\n }\r\n\r\n /** @inheritdoc */\r\n updated(changed: PropertyValues): void {\r\n /* istanbul ignore else */\r\n if (changed.has('mode')) {\r\n this.handleModeChange();\r\n }\r\n }\r\n\r\n /**\r\n * Called when the backdrop is clicked\r\n *\r\n * @private\r\n * @memberof ModalManager\r\n */\r\n private backdropClicked(): void {\r\n if (this.closeOnBackdropClick) {\r\n this.closeModal();\r\n this.callUserClosedModalCallback();\r\n }\r\n }\r\n\r\n /**\r\n * Handle the mode change\r\n *\r\n * @private\r\n * @memberof ModalManager\r\n */\r\n private handleModeChange(): void {\r\n this.hostBridge.handleModeChange(this.mode);\r\n this.emitModeChangeEvent();\r\n }\r\n\r\n /**\r\n * Emit a modeChange event\r\n *\r\n * @private\r\n * @memberof ModalManager\r\n */\r\n private emitModeChangeEvent(): void {\r\n const event = new CustomEvent('modeChanged', {\r\n detail: { mode: this.mode },\r\n });\r\n this.dispatchEvent(event);\r\n }\r\n\r\n /**\r\n * Called when the modal close button is pressed. Closes the modal.\r\n *\r\n * @private\r\n * @memberof ModalManager\r\n */\r\n private closeButtonPressed(): void {\r\n this.closeModal();\r\n this.callUserClosedModalCallback();\r\n }\r\n\r\n /** @inheritdoc */\r\n static get styles(): CSSResult {\r\n const modalBackdropColor = css`var(--modalBackdropColor, rgba(10, 10, 10, 0.9))`;\r\n const modalBackdropZindex = css`var(--modalBackdropZindex, 1000)`;\r\n\r\n const modalWidth = css`var(--modalWidth, 32rem)`;\r\n const modalMaxWidth = css`var(--modalMaxWidth, 95%)`;\r\n const modalZindex = css`var(--modalZindex, 2000)`;\r\n\r\n return css`\r\n .container {\r\n width: 100%;\r\n height: 100%;\r\n }\r\n\r\n .backdrop {\r\n position: fixed;\r\n top: 0;\r\n left: 0;\r\n background-color: ${modalBackdropColor};\r\n width: 100%;\r\n height: 100%;\r\n z-index: ${modalBackdropZindex};\r\n }\r\n\r\n modal-template {\r\n outline: 0;\r\n position: fixed;\r\n top: 0;\r\n left: 50%;\r\n transform: translate(-50%, 0);\r\n z-index: ${modalZindex};\r\n width: ${modalWidth};\r\n max-width: ${modalMaxWidth};\r\n }\r\n `;\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"modal-manager.js","sourceRoot":"","sources":["../../src/modal-manager.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n LitElement,\n html,\n css,\n CSSResult,\n TemplateResult,\n PropertyValues,\n} from 'lit';\nimport { property, customElement, query } from 'lit/decorators.js';\n\nimport './modal-template';\nimport { ModalTemplate } from './modal-template';\nimport { ModalConfig } from './modal-config';\nimport { ModalManagerHostBridge } from './modal-manager-host-bridge';\nimport { ModalManagerInterface } from './modal-manager-interface';\nimport { ModalManagerHostBridgeInterface } from './modal-manager-host-bridge-interface';\nimport { ModalManagerMode } from './modal-manager-mode';\n\n@customElement('modal-manager')\nexport class ModalManager extends LitElement implements ModalManagerInterface {\n /**\n * The current mode of the ModalManager\n *\n * Current options are `modal` or `closed`\n *\n * @type {ModalManagerMode}\n * @memberof ModalManager\n */\n @property({ type: String, reflect: true }) mode: ModalManagerMode =\n ModalManagerMode.Closed;\n\n /**\n * Custom content to display in the modal's content slot\n *\n * @type {(TemplateResult | undefined)}\n * @memberof ModalManager\n */\n @property({ type: Object }) customModalContent?: TemplateResult;\n\n /**\n * Thie hostBridge handles environmental-specific interactions such as adding classes\n * to the body tag or event listeners needed to support the modal manager in the host environment.\n *\n * There is a default `ModalManagerHostBridge`, but consumers can override it with a custom\n * `ModalManagerHostBridgeInterface`\n *\n * @type {ModalManagerHostBridgeInterface}\n * @memberof ModalManager\n */\n @property({ type: Object })\n hostBridge: ModalManagerHostBridgeInterface = new ModalManagerHostBridge(\n this\n );\n\n /**\n * Reference to the ModalTemplate DOM element\n *\n * @private\n * @type {ModalTemplate}\n * @memberof ModalManager\n */\n @query('modal-template') private modalTemplate!: ModalTemplate;\n\n /** @inheritdoc */\n render(): TemplateResult {\n return html`\n <div class=\"container\">\n <div class=\"backdrop\" @click=${this.backdropClicked}></div>\n <modal-template\n @closeButtonPressed=${this.closeButtonPressed}\n tabindex=\"0\"\n >\n ${this.customModalContent}\n </modal-template>\n </div>\n `;\n }\n\n /** @inheritdoc */\n getMode(): ModalManagerMode {\n return this.mode;\n }\n\n /** @inheritdoc */\n closeModal(): void {\n this.mode = ModalManagerMode.Closed;\n this.customModalContent = undefined;\n this.modalTemplate.config = new ModalConfig();\n }\n\n /**\n * Whether the modal should close if the user taps on the backdrop\n *\n * @private\n * @memberof ModalManager\n */\n private closeOnBackdropClick = true;\n\n /**\n * A callback if the user closes the modal\n *\n * @private\n * @memberof ModalManager\n */\n private userClosedModalCallback?: () => void;\n\n /**\n * Call the userClosedModalCallback and reset it if it exists\n *\n * @private\n * @memberof ModalManager\n */\n private callUserClosedModalCallback(): void {\n // we assign the callback to a temp var and undefine it before calling it\n // otherwise, we run into the potential for an infinite loop if the\n // callback triggers another `showModal()`, which would execute `userClosedModalCallback`\n const callback = this.userClosedModalCallback;\n this.userClosedModalCallback = undefined;\n if (callback) callback();\n }\n\n /** @inheritdoc */\n async showModal(options: {\n config: ModalConfig;\n customModalContent?: TemplateResult;\n userClosedModalCallback?: () => void;\n }): Promise<void> {\n this.closeOnBackdropClick = options.config.closeOnBackdropClick;\n this.userClosedModalCallback = options.userClosedModalCallback;\n this.modalTemplate.config = options.config;\n this.customModalContent = options.customModalContent;\n this.mode = ModalManagerMode.Open;\n await this.modalTemplate.updateComplete;\n this.modalTemplate.focus();\n }\n\n /** @inheritdoc */\n updated(changed: PropertyValues): void {\n /* istanbul ignore else */\n if (changed.has('mode')) {\n this.handleModeChange();\n }\n }\n\n /**\n * Called when the backdrop is clicked\n *\n * @private\n * @memberof ModalManager\n */\n private backdropClicked(): void {\n if (this.closeOnBackdropClick) {\n this.closeModal();\n this.callUserClosedModalCallback();\n }\n }\n\n /**\n * Handle the mode change\n *\n * @private\n * @memberof ModalManager\n */\n private handleModeChange(): void {\n this.hostBridge.handleModeChange(this.mode);\n this.emitModeChangeEvent();\n }\n\n /**\n * Emit a modeChange event\n *\n * @private\n * @memberof ModalManager\n */\n private emitModeChangeEvent(): void {\n const event = new CustomEvent('modeChanged', {\n detail: { mode: this.mode },\n });\n this.dispatchEvent(event);\n }\n\n /**\n * Called when the modal close button is pressed. Closes the modal.\n *\n * @private\n * @memberof ModalManager\n */\n private closeButtonPressed(): void {\n this.closeModal();\n this.callUserClosedModalCallback();\n }\n\n /** @inheritdoc */\n static get styles(): CSSResult {\n const modalBackdropColor = css`var(--modalBackdropColor, rgba(10, 10, 10, 0.9))`;\n const modalBackdropZindex = css`var(--modalBackdropZindex, 1000)`;\n\n const modalWidth = css`var(--modalWidth, 32rem)`;\n const modalMaxWidth = css`var(--modalMaxWidth, 95%)`;\n const modalZindex = css`var(--modalZindex, 2000)`;\n\n return css`\n .container {\n width: 100%;\n height: 100%;\n }\n\n .backdrop {\n position: fixed;\n top: 0;\n left: 0;\n background-color: ${modalBackdropColor};\n width: 100%;\n height: 100%;\n z-index: ${modalBackdropZindex};\n }\n\n modal-template {\n outline: 0;\n position: fixed;\n top: 0;\n left: 50%;\n transform: translate(-50%, 0);\n z-index: ${modalZindex};\n width: ${modalWidth};\n max-width: ${modalMaxWidth};\n }\n `;\n }\n}\n"]}