@spectrum-web-components/theme 0.12.0 → 0.12.1-devmode.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 (138) hide show
  1. package/README.md +17 -0
  2. package/core.dev.js +4 -0
  3. package/core.dev.js.map +7 -0
  4. package/core.js +4 -15
  5. package/core.js.map +7 -1
  6. package/express/scale-large.dev.js +5 -0
  7. package/express/scale-large.dev.js.map +7 -0
  8. package/express/scale-large.js +5 -16
  9. package/express/scale-large.js.map +7 -1
  10. package/express/scale-medium.dev.js +5 -0
  11. package/express/scale-medium.dev.js.map +7 -0
  12. package/express/scale-medium.js +5 -16
  13. package/express/scale-medium.js.map +7 -1
  14. package/express/theme-dark.dev.js +5 -0
  15. package/express/theme-dark.dev.js.map +7 -0
  16. package/express/theme-dark.js +5 -16
  17. package/express/theme-dark.js.map +7 -1
  18. package/express/theme-darkest.dev.js +5 -0
  19. package/express/theme-darkest.dev.js.map +7 -0
  20. package/express/theme-darkest.js +5 -16
  21. package/express/theme-darkest.js.map +7 -1
  22. package/express/theme-light.dev.js +5 -0
  23. package/express/theme-light.dev.js.map +7 -0
  24. package/express/theme-light.js +5 -16
  25. package/express/theme-light.js.map +7 -1
  26. package/express/theme-lightest.dev.js +5 -0
  27. package/express/theme-lightest.dev.js.map +7 -0
  28. package/express/theme-lightest.js +5 -16
  29. package/express/theme-lightest.js.map +7 -1
  30. package/package.json +97 -24
  31. package/scale-large.dev.js +5 -0
  32. package/scale-large.dev.js.map +7 -0
  33. package/scale-large.js +5 -16
  34. package/scale-large.js.map +7 -1
  35. package/scale-medium.dev.js +5 -0
  36. package/scale-medium.dev.js.map +7 -0
  37. package/scale-medium.js +5 -16
  38. package/scale-medium.js.map +7 -1
  39. package/sp-theme.dev.js +3 -0
  40. package/sp-theme.dev.js.map +7 -0
  41. package/sp-theme.js +3 -14
  42. package/sp-theme.js.map +7 -1
  43. package/src/Theme.dev.js +297 -0
  44. package/src/Theme.dev.js.map +7 -0
  45. package/src/Theme.js +275 -340
  46. package/src/Theme.js.map +7 -1
  47. package/src/express/core.dev.js +4 -0
  48. package/src/express/core.dev.js.map +7 -0
  49. package/src/express/core.js +4 -15
  50. package/src/express/core.js.map +7 -1
  51. package/src/express/scale-large.css.dev.js +182 -0
  52. package/src/express/scale-large.css.dev.js.map +7 -0
  53. package/src/express/scale-large.css.js +3 -14
  54. package/src/express/scale-large.css.js.map +7 -1
  55. package/src/express/scale-medium.css.dev.js +190 -0
  56. package/src/express/scale-medium.css.dev.js.map +7 -0
  57. package/src/express/scale-medium.css.js +3 -14
  58. package/src/express/scale-medium.css.js.map +7 -1
  59. package/src/express/theme-dark.css.dev.js +56 -0
  60. package/src/express/theme-dark.css.dev.js.map +7 -0
  61. package/src/express/theme-dark.css.js +3 -14
  62. package/src/express/theme-dark.css.js.map +7 -1
  63. package/src/express/theme-light.css.dev.js +56 -0
  64. package/src/express/theme-light.css.dev.js.map +7 -0
  65. package/src/express/theme-light.css.js +3 -14
  66. package/src/express/theme-light.css.js.map +7 -1
  67. package/src/express/theme.css.dev.js +1846 -0
  68. package/src/express/theme.css.dev.js.map +7 -0
  69. package/src/express/theme.css.js +3 -14
  70. package/src/express/theme.css.js.map +7 -1
  71. package/src/express/themes.dev.js +7 -0
  72. package/src/express/themes.dev.js.map +7 -0
  73. package/src/express/themes.js +7 -18
  74. package/src/express/themes.js.map +7 -1
  75. package/src/index.dev.js +2 -0
  76. package/src/index.dev.js.map +7 -0
  77. package/src/index.js +2 -13
  78. package/src/index.js.map +7 -1
  79. package/src/scale-large.css.dev.js +190 -0
  80. package/src/scale-large.css.dev.js.map +7 -0
  81. package/src/scale-large.css.js +3 -14
  82. package/src/scale-large.css.js.map +7 -1
  83. package/src/scale-medium.css.dev.js +192 -0
  84. package/src/scale-medium.css.dev.js.map +7 -0
  85. package/src/scale-medium.css.js +3 -14
  86. package/src/scale-medium.css.js.map +7 -1
  87. package/src/theme-dark.css.dev.js +58 -0
  88. package/src/theme-dark.css.dev.js.map +7 -0
  89. package/src/theme-dark.css.js +3 -14
  90. package/src/theme-dark.css.js.map +7 -1
  91. package/src/theme-darkest.css.dev.js +58 -0
  92. package/src/theme-darkest.css.dev.js.map +7 -0
  93. package/src/theme-darkest.css.js +3 -14
  94. package/src/theme-darkest.css.js.map +7 -1
  95. package/src/theme-light.css.dev.js +58 -0
  96. package/src/theme-light.css.dev.js.map +7 -0
  97. package/src/theme-light.css.js +3 -14
  98. package/src/theme-light.css.js.map +7 -1
  99. package/src/theme-lightest.css.dev.js +52 -0
  100. package/src/theme-lightest.css.dev.js.map +7 -0
  101. package/src/theme-lightest.css.js +3 -14
  102. package/src/theme-lightest.css.js.map +7 -1
  103. package/src/theme.css.dev.js +1840 -0
  104. package/src/theme.css.dev.js.map +7 -0
  105. package/src/theme.css.js +3 -14
  106. package/src/theme.css.js.map +7 -1
  107. package/src/themes.dev.js +7 -0
  108. package/src/themes.dev.js.map +7 -0
  109. package/src/themes.js +7 -18
  110. package/src/themes.js.map +7 -1
  111. package/src/typography.css.dev.js +946 -0
  112. package/src/typography.css.dev.js.map +7 -0
  113. package/src/typography.css.js +3 -14
  114. package/src/typography.css.js.map +7 -1
  115. package/stories/theme.stories.js +38 -43
  116. package/stories/theme.stories.js.map +7 -1
  117. package/test/theme-lazy.test.js +90 -108
  118. package/test/theme-lazy.test.js.map +7 -1
  119. package/test/theme.test-vrt.js +4 -15
  120. package/test/theme.test-vrt.js.map +7 -1
  121. package/test/themes.test.js +103 -120
  122. package/test/themes.test.js.map +7 -1
  123. package/theme-dark.dev.js +5 -0
  124. package/theme-dark.dev.js.map +7 -0
  125. package/theme-dark.js +5 -16
  126. package/theme-dark.js.map +7 -1
  127. package/theme-darkest.dev.js +5 -0
  128. package/theme-darkest.dev.js.map +7 -0
  129. package/theme-darkest.js +5 -16
  130. package/theme-darkest.js.map +7 -1
  131. package/theme-light.dev.js +5 -0
  132. package/theme-light.dev.js.map +7 -0
  133. package/theme-light.js +5 -16
  134. package/theme-light.js.map +7 -1
  135. package/theme-lightest.dev.js +5 -0
  136. package/theme-lightest.dev.js.map +7 -0
  137. package/theme-lightest.js +5 -16
  138. package/theme-lightest.js.map +7 -1
package/src/Theme.js CHANGED
@@ -1,362 +1,297 @@
1
- /*
2
- Copyright 2020 Adobe. All rights reserved.
3
- This file is licensed to you under the Apache License, Version 2.0 (the "License");
4
- you may not use this file except in compliance with the License. You may obtain a copy
5
- of the License at http://www.apache.org/licenses/LICENSE-2.0
6
-
7
- Unless required by applicable law or agreed to in writing, software distributed under
8
- the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS
9
- OF ANY KIND, either express or implied. See the License for the specific language
10
- governing permissions and limitations under the License.
11
- */
12
- import { supportsAdoptingStyleSheets, } from '@spectrum-web-components/base';
13
- const ThemeVariantValues = ['spectrum', 'express'];
14
- const ScaleValues = ['medium', 'large', 'medium-express', 'large-express'];
1
+ import {
2
+ supportsAdoptingStyleSheets
3
+ } from "@spectrum-web-components/base";
4
+ const ThemeVariantValues = ["spectrum", "express"];
5
+ const ScaleValues = ["medium", "large", "medium-express", "large-express"];
15
6
  const ColorValues = [
16
- 'light',
17
- 'lightest',
18
- 'dark',
19
- 'darkest',
20
- 'light-express',
21
- 'lightest-express',
22
- 'dark-express',
23
- 'darkest-express',
7
+ "light",
8
+ "lightest",
9
+ "dark",
10
+ "darkest",
11
+ "light-express",
12
+ "lightest-express",
13
+ "dark-express",
14
+ "darkest-express"
24
15
  ];
25
- /**
26
- * @element sp-theme
27
- * @attr {string} [lang=""] - The language of the content scoped to this `sp-theme` element, see: <a href="https://developer.mozilla.org/en-US/docs/Web/HTML/Global_attributes/lang" target="_blank">MDN reference</a>.
28
- *
29
- * @slot - Content on which to apply the CSS Custom Properties defined by the current theme configuration
30
- */
31
- export class Theme extends HTMLElement {
32
- constructor() {
33
- super();
34
- this._dir = '';
35
- this._theme = 'spectrum';
36
- this._color = '';
37
- this._scale = '';
38
- this.trackedChildren = new Set();
39
- this._updateRequested = false;
40
- this._contextConsumers = new Map();
41
- this.attachShadow({ mode: 'open' });
42
- const node = document.importNode(Theme.template.content, true);
43
- this.shadowRoot.appendChild(node);
44
- this.shouldAdoptStyles();
45
- this.addEventListener('sp-query-theme', this.onQueryTheme);
46
- this.addEventListener('sp-language-context', this._handleContextPresence);
47
- this.updateComplete = this.__createDeferredPromise();
16
+ const _Theme = class extends HTMLElement {
17
+ constructor() {
18
+ super();
19
+ this._dir = "";
20
+ this._theme = "spectrum";
21
+ this._color = "";
22
+ this._scale = "";
23
+ this.trackedChildren = /* @__PURE__ */ new Set();
24
+ this._updateRequested = false;
25
+ this._contextConsumers = /* @__PURE__ */ new Map();
26
+ this.attachShadow({ mode: "open" });
27
+ const node = document.importNode(_Theme.template.content, true);
28
+ this.shadowRoot.appendChild(node);
29
+ this.shouldAdoptStyles();
30
+ this.addEventListener("sp-query-theme", this.onQueryTheme);
31
+ this.addEventListener("sp-language-context", this._handleContextPresence);
32
+ this.updateComplete = this.__createDeferredPromise();
33
+ }
34
+ static get observedAttributes() {
35
+ return ["color", "scale", "theme", "lang", "dir"];
36
+ }
37
+ set dir(dir) {
38
+ if (dir === this.dir)
39
+ return;
40
+ this.setAttribute("dir", dir);
41
+ this._dir = dir;
42
+ const targetDir = dir === "rtl" ? dir : "ltr";
43
+ this.trackedChildren.forEach((el) => {
44
+ el.setAttribute("dir", targetDir);
45
+ });
46
+ }
47
+ get dir() {
48
+ return this._dir;
49
+ }
50
+ attributeChangedCallback(attrName, old, value) {
51
+ if (old === value) {
52
+ return;
48
53
  }
49
- static get observedAttributes() {
50
- return ['color', 'scale', 'theme', 'lang', 'dir'];
54
+ if (attrName === "color") {
55
+ this.color = value;
56
+ } else if (attrName === "scale") {
57
+ this.scale = value;
58
+ } else if (attrName === "lang" && !!value) {
59
+ this.lang = value;
60
+ this._provideContext();
61
+ } else if (attrName === "theme") {
62
+ this.theme = value;
63
+ } else if (attrName === "dir") {
64
+ this.dir = value;
51
65
  }
52
- set dir(dir) {
53
- if (dir === this.dir)
54
- return;
55
- this.setAttribute('dir', dir);
56
- this._dir = dir;
57
- const targetDir = dir === 'rtl' ? dir : 'ltr';
58
- this.trackedChildren.forEach((el) => {
59
- el.setAttribute('dir', targetDir);
60
- });
66
+ }
67
+ requestUpdate() {
68
+ if (window.ShadyCSS !== void 0 && !window.ShadyCSS.nativeShadow) {
69
+ window.ShadyCSS.styleElement(this);
70
+ } else {
71
+ this.shouldAdoptStyles();
61
72
  }
62
- /**
63
- * Reading direction of the content scoped to this `sp-theme` element.
64
- * @type {"ltr" | "rtl" | ""}
65
- * @attr
66
- */
67
- get dir() {
68
- return this._dir;
73
+ }
74
+ get theme() {
75
+ const themeFragments = _Theme.themeFragmentsByKind.get("theme");
76
+ const { name } = themeFragments && themeFragments.get("default") || {};
77
+ return this._theme || name || "";
78
+ }
79
+ set theme(newValue) {
80
+ if (newValue === this._theme)
81
+ return;
82
+ const theme = !!newValue && ThemeVariantValues.includes(newValue) ? newValue : this.theme;
83
+ if (theme !== this._theme) {
84
+ this._theme = theme;
85
+ this.requestUpdate();
69
86
  }
70
- attributeChangedCallback(attrName, old, value) {
71
- if (old === value) {
72
- return;
73
- }
74
- if (attrName === 'color') {
75
- this.color = value;
76
- }
77
- else if (attrName === 'scale') {
78
- this.scale = value;
79
- }
80
- else if (attrName === 'lang' && !!value) {
81
- this.lang = value;
82
- this._provideContext();
83
- }
84
- else if (attrName === 'theme') {
85
- this.theme = value;
86
- }
87
- else if (attrName === 'dir') {
88
- this.dir = value;
89
- }
87
+ if (theme) {
88
+ this.setAttribute("theme", theme);
89
+ } else {
90
+ this.removeAttribute("theme");
90
91
  }
91
- requestUpdate() {
92
- if (window.ShadyCSS !== undefined && !window.ShadyCSS.nativeShadow) {
93
- window.ShadyCSS.styleElement(this);
94
- }
95
- else {
96
- this.shouldAdoptStyles();
97
- }
92
+ }
93
+ get color() {
94
+ const themeFragments = _Theme.themeFragmentsByKind.get("color");
95
+ const { name } = themeFragments && themeFragments.get("default") || {};
96
+ return this._color || name || "";
97
+ }
98
+ set color(newValue) {
99
+ if (newValue === this._color)
100
+ return;
101
+ const color = !!newValue && ColorValues.includes(newValue) ? newValue : this.color;
102
+ if (color !== this._color) {
103
+ this._color = color;
104
+ this.requestUpdate();
98
105
  }
99
- /**
100
- * The Spectrum theme that is applied to the content scoped to this `sp-theme` element.
101
- *
102
- * A value is requried.
103
- * @type {"spectrum" | "express" | ""}
104
- * @attr
105
- */
106
- get theme() {
107
- const themeFragments = Theme.themeFragmentsByKind.get('theme');
108
- const { name } = (themeFragments && themeFragments.get('default')) || {};
109
- return this._theme || name || '';
106
+ if (color) {
107
+ this.setAttribute("color", color);
108
+ } else {
109
+ this.removeAttribute("color");
110
110
  }
111
- set theme(newValue) {
112
- if (newValue === this._theme)
113
- return;
114
- const theme = !!newValue && ThemeVariantValues.includes(newValue)
115
- ? newValue
116
- : this.theme;
117
- if (theme !== this._theme) {
118
- this._theme = theme;
119
- this.requestUpdate();
120
- }
121
- if (theme) {
122
- this.setAttribute('theme', theme);
123
- }
124
- else {
125
- this.removeAttribute('theme');
126
- }
111
+ }
112
+ get scale() {
113
+ const themeFragments = _Theme.themeFragmentsByKind.get("scale");
114
+ const { name } = themeFragments && themeFragments.get("default") || {};
115
+ return this._scale || name || "";
116
+ }
117
+ set scale(newValue) {
118
+ if (newValue === this._scale)
119
+ return;
120
+ const scale = !!newValue && ScaleValues.includes(newValue) ? newValue : this.scale;
121
+ if (scale !== this._scale) {
122
+ this._scale = scale;
123
+ this.requestUpdate();
127
124
  }
128
- /**
129
- * The Spectrum color stops to apply to content scoped by this `sp-theme` element.
130
- *
131
- * A value is requried.
132
- * @type {"lightest" | "light" | "dark" | "darkest" | ""}
133
- * @attr
134
- */
135
- get color() {
136
- const themeFragments = Theme.themeFragmentsByKind.get('color');
137
- const { name } = (themeFragments && themeFragments.get('default')) || {};
138
- return this._color || name || '';
125
+ if (scale) {
126
+ this.setAttribute("scale", scale);
127
+ } else {
128
+ this.removeAttribute("scale");
139
129
  }
140
- set color(newValue) {
141
- if (newValue === this._color)
142
- return;
143
- const color = !!newValue && ColorValues.includes(newValue)
144
- ? newValue
145
- : this.color;
146
- if (color !== this._color) {
147
- this._color = color;
148
- this.requestUpdate();
149
- }
150
- if (color) {
151
- this.setAttribute('color', color);
152
- }
153
- else {
154
- this.removeAttribute('color');
130
+ }
131
+ get styles() {
132
+ const themeKinds = [
133
+ ..._Theme.themeFragmentsByKind.keys()
134
+ ];
135
+ const getStyle = (fragments, name, kind) => {
136
+ const currentStyles = kind && kind !== "theme" && this.theme === "express" ? fragments.get(`${name}-express`) : fragments.get(name);
137
+ const isAppliedFragment = name === "spectrum" || !kind || this.hasAttribute(kind);
138
+ if (currentStyles && isAppliedFragment) {
139
+ return currentStyles.styles;
140
+ }
141
+ return;
142
+ };
143
+ const styles = themeKinds.reduce((acc, kind) => {
144
+ const kindFragments = _Theme.themeFragmentsByKind.get(kind);
145
+ let style;
146
+ if (kind === "app" || kind === "core") {
147
+ style = getStyle(kindFragments, kind);
148
+ } else {
149
+ const { [kind]: name } = this;
150
+ style = getStyle(kindFragments, name, kind);
151
+ }
152
+ if (style) {
153
+ acc.push(style);
154
+ }
155
+ return acc;
156
+ }, []);
157
+ if (false) {
158
+ const issues = [];
159
+ const checkForAttribute = (name, resolvedValue, actualValue) => {
160
+ var _a;
161
+ const themeModifier = this.theme && this.theme !== "spectrum" ? `-${this.theme}` : "";
162
+ if (!resolvedValue) {
163
+ issues.push(`You have not explicitly set the "${name}" attribute and there is no default value on which to fallback.`);
164
+ } else if (!actualValue) {
165
+ issues.push(`You have not explicitly set the "${name}" attribute, the default value ("${resolvedValue}") is being used as a fallback.`);
166
+ } else if (!((_a = _Theme.themeFragmentsByKind.get(name)) == null ? void 0 : _a.get(resolvedValue + themeModifier))) {
167
+ issues.push(`You have set "${name}=${resolvedValue}" but the associated theme fragment has not been loaded.`);
155
168
  }
169
+ };
170
+ checkForAttribute("theme", this.theme, this._theme);
171
+ checkForAttribute("color", this.color, this._color);
172
+ checkForAttribute("scale", this.scale, this._scale);
173
+ if (issues.length) {
174
+ window.__swc.issueWarning("theme:api:default", "You are leveraging an <sp-theme> element and the following issues may disrupt your theme delivery:", "https://opensource.adobe.com/spectrum-web-components/components/theme/#example", issues);
175
+ }
156
176
  }
157
- /**
158
- * The Spectrum platform scale to apply to content scoped by this `sp-theme` element.
159
- *
160
- * A value is requried.
161
- * @type {"medium" | "large" | ""}
162
- * @attr
163
- */
164
- get scale() {
165
- const themeFragments = Theme.themeFragmentsByKind.get('scale');
166
- const { name } = (themeFragments && themeFragments.get('default')) || {};
167
- return this._scale || name || '';
177
+ return [...styles];
178
+ }
179
+ static get template() {
180
+ if (!this.templateElement) {
181
+ this.templateElement = document.createElement("template");
182
+ this.templateElement.innerHTML = "<slot></slot>";
168
183
  }
169
- set scale(newValue) {
170
- if (newValue === this._scale)
171
- return;
172
- const scale = !!newValue && ScaleValues.includes(newValue)
173
- ? newValue
174
- : this.scale;
175
- if (scale !== this._scale) {
176
- this._scale = scale;
177
- this.requestUpdate();
178
- }
179
- if (scale) {
180
- this.setAttribute('scale', scale);
181
- }
182
- else {
183
- this.removeAttribute('scale');
184
- }
184
+ return this.templateElement;
185
+ }
186
+ __createDeferredPromise() {
187
+ return new Promise((resolve) => {
188
+ this.__resolve = resolve;
189
+ });
190
+ }
191
+ onQueryTheme(event) {
192
+ if (event.defaultPrevented) {
193
+ return;
185
194
  }
186
- get styles() {
187
- const themeKinds = [
188
- ...Theme.themeFragmentsByKind.keys(),
189
- ];
190
- const getStyle = (fragments, name, kind) => {
191
- const currentStyles = kind && kind !== 'theme' && this.theme === 'express'
192
- ? fragments.get(`${name}-express`)
193
- : fragments.get(name);
194
- // theme="spectrum" is available by default and doesn't need to be applied.
195
- const isAppliedFragment = name === 'spectrum' || !kind || this.hasAttribute(kind);
196
- if (currentStyles && isAppliedFragment) {
197
- return currentStyles.styles;
198
- }
199
- return;
200
- };
201
- const styles = themeKinds.reduce((acc, kind) => {
202
- const kindFragments = Theme.themeFragmentsByKind.get(kind);
203
- let style;
204
- if (kind === 'app' || kind === 'core') {
205
- style = getStyle(kindFragments, kind);
206
- }
207
- else {
208
- const { [kind]: name } = this;
209
- style = getStyle(kindFragments, name, kind);
210
- }
211
- if (style) {
212
- acc.push(style);
213
- }
214
- return acc;
215
- }, []);
216
- return [...styles];
195
+ event.preventDefault();
196
+ const { detail: theme } = event;
197
+ theme.color = this.color || void 0;
198
+ theme.scale = this.scale || void 0;
199
+ theme.lang = this.lang || document.documentElement.lang || navigator.language;
200
+ theme.theme = this.theme || void 0;
201
+ }
202
+ connectedCallback() {
203
+ this.shouldAdoptStyles();
204
+ if (window.ShadyCSS !== void 0) {
205
+ window.ShadyCSS.styleElement(this);
217
206
  }
218
- static get template() {
219
- if (!this.templateElement) {
220
- this.templateElement = document.createElement('template');
221
- this.templateElement.innerHTML = '<slot></slot>';
222
- }
223
- return this.templateElement;
207
+ _Theme.instances.add(this);
208
+ if (!this.hasAttribute("dir")) {
209
+ let dirParent = this.assignedSlot || this.parentNode;
210
+ while (dirParent !== document.documentElement && !(dirParent instanceof _Theme)) {
211
+ dirParent = dirParent.assignedSlot || dirParent.parentNode || dirParent.host;
212
+ }
213
+ this.dir = dirParent.dir === "rtl" ? dirParent.dir : "ltr";
224
214
  }
225
- __createDeferredPromise() {
226
- return new Promise((resolve) => {
227
- this.__resolve = resolve;
228
- });
215
+ }
216
+ disconnectedCallback() {
217
+ _Theme.instances.delete(this);
218
+ }
219
+ startManagingContentDirection(el) {
220
+ this.trackedChildren.add(el);
221
+ }
222
+ stopManagingContentDirection(el) {
223
+ this.trackedChildren.delete(el);
224
+ }
225
+ async shouldAdoptStyles() {
226
+ if (!this._updateRequested) {
227
+ this.updateComplete = this.__createDeferredPromise();
228
+ this._updateRequested = true;
229
+ this._updateRequested = await false;
230
+ this.adoptStyles();
231
+ this.__resolve(true);
229
232
  }
230
- onQueryTheme(event) {
231
- if (event.defaultPrevented) {
232
- return;
233
+ }
234
+ adoptStyles() {
235
+ const styles = this.styles;
236
+ if (window.ShadyCSS !== void 0 && !window.ShadyCSS.nativeShadow && window.ShadyCSS.ScopingShim) {
237
+ const fragmentCSS = [];
238
+ for (const [kind, fragments] of _Theme.themeFragmentsByKind) {
239
+ for (const [name, { styles: styles2 }] of fragments) {
240
+ if (name === "default")
241
+ continue;
242
+ let cssText = styles2.cssText;
243
+ if (!_Theme.defaultFragments.has(name)) {
244
+ cssText = cssText.replace(":host", `:host([${kind}='${name}'])`);
245
+ }
246
+ fragmentCSS.push(cssText);
233
247
  }
234
- event.preventDefault();
235
- const { detail: theme } = event;
236
- theme.color = this.color || undefined;
237
- theme.scale = this.scale || undefined;
238
- theme.lang =
239
- this.lang || document.documentElement.lang || navigator.language;
240
- theme.theme = this.theme || undefined;
248
+ }
249
+ window.ShadyCSS.ScopingShim.prepareAdoptedCssText(fragmentCSS, this.localName);
250
+ window.ShadyCSS.prepareTemplate(_Theme.template, this.localName);
251
+ } else if (supportsAdoptingStyleSheets) {
252
+ const styleSheets = [];
253
+ for (const style of styles) {
254
+ styleSheets.push(style.styleSheet);
255
+ }
256
+ this.shadowRoot.adoptedStyleSheets = styleSheets;
257
+ } else {
258
+ const styleNodes = this.shadowRoot.querySelectorAll("style");
259
+ styleNodes.forEach((element) => element.remove());
260
+ styles.forEach((s) => {
261
+ const style = document.createElement("style");
262
+ style.textContent = s.cssText;
263
+ this.shadowRoot.appendChild(style);
264
+ });
241
265
  }
242
- connectedCallback() {
243
- this.shouldAdoptStyles();
244
- // Note, first update/render handles styleElement so we only call this if
245
- // connected after first update.
246
- /* c8 ignore next 3 */
247
- if (window.ShadyCSS !== undefined) {
248
- window.ShadyCSS.styleElement(this);
249
- }
250
- // Add `this` to the instances array.
251
- Theme.instances.add(this);
252
- if (!this.hasAttribute('dir')) {
253
- let dirParent = (this.assignedSlot ||
254
- this.parentNode);
255
- while (dirParent !== document.documentElement &&
256
- !(dirParent instanceof Theme)) {
257
- dirParent = (dirParent.assignedSlot || // step into the shadow DOM of the parent of a slotted node
258
- dirParent.parentNode || // DOM Element detected
259
- dirParent.host);
260
- }
261
- this.dir = dirParent.dir === 'rtl' ? dirParent.dir : 'ltr';
262
- }
263
- }
264
- disconnectedCallback() {
265
- // Remove `this` to the instances array.
266
- Theme.instances.delete(this);
267
- }
268
- startManagingContentDirection(el) {
269
- this.trackedChildren.add(el);
270
- }
271
- stopManagingContentDirection(el) {
272
- this.trackedChildren.delete(el);
273
- }
274
- async shouldAdoptStyles() {
275
- if (!this._updateRequested) {
276
- this.updateComplete = this.__createDeferredPromise();
277
- this._updateRequested = true;
278
- this._updateRequested = await false;
279
- this.adoptStyles();
280
- this.__resolve(true);
281
- }
282
- }
283
- adoptStyles() {
284
- const styles = this.styles; // No test coverage on Edge
285
- // There are three separate cases here based on Shadow DOM support.
286
- // (1) shadowRoot polyfilled: use ShadyCSS
287
- // (2) shadowRoot.adoptedStyleSheets available: use it.
288
- // (3) shadowRoot.adoptedStyleSheets polyfilled: append styles after
289
- // rendering
290
- /* c8 ignore next */ if (window.ShadyCSS !== undefined &&
291
- !window.ShadyCSS.nativeShadow &&
292
- window.ShadyCSS.ScopingShim) {
293
- // For browsers using the shim, there seems to be one set of
294
- // processed styles per template, so it is hard to nest styles. So,
295
- // for those, we load in all style fragments and then switch using a
296
- // host selector (e.g. :host([color='dark']))
297
- const fragmentCSS = [];
298
- for (const [kind, fragments] of Theme.themeFragmentsByKind) {
299
- for (const [name, { styles }] of fragments) {
300
- if (name === 'default')
301
- continue;
302
- let cssText = styles.cssText;
303
- if (!Theme.defaultFragments.has(name)) {
304
- cssText = cssText.replace(':host', `:host([${kind}='${name}'])`);
305
- }
306
- fragmentCSS.push(cssText);
307
- }
308
- }
309
- window.ShadyCSS.ScopingShim.prepareAdoptedCssText(fragmentCSS, this.localName);
310
- window.ShadyCSS.prepareTemplate(Theme.template, this.localName);
311
- }
312
- else if (supportsAdoptingStyleSheets) {
313
- const styleSheets = [];
314
- for (const style of styles) {
315
- styleSheets.push(style.styleSheet);
316
- }
317
- this.shadowRoot.adoptedStyleSheets = styleSheets;
318
- }
319
- else {
320
- const styleNodes = this.shadowRoot.querySelectorAll('style');
321
- styleNodes.forEach((element) => element.remove());
322
- styles.forEach((s) => {
323
- const style = document.createElement('style');
324
- style.textContent = s.cssText;
325
- this.shadowRoot.appendChild(style);
326
- });
327
- }
328
- }
329
- static registerThemeFragment(name, kind, styles) {
330
- const fragmentMap = Theme.themeFragmentsByKind.get(kind) || new Map();
331
- if (fragmentMap.size === 0) {
332
- Theme.themeFragmentsByKind.set(kind, fragmentMap);
333
- // we're adding our first fragment for this kind, set as default
334
- fragmentMap.set('default', { name, styles });
335
- Theme.defaultFragments.add(name);
336
- }
337
- fragmentMap.set(name, { name, styles });
338
- Theme.instances.forEach((instance) => instance.shouldAdoptStyles());
339
- }
340
- _provideContext() {
341
- this._contextConsumers.forEach((consume) => consume(this.lang));
266
+ }
267
+ static registerThemeFragment(name, kind, styles) {
268
+ const fragmentMap = _Theme.themeFragmentsByKind.get(kind) || /* @__PURE__ */ new Map();
269
+ if (fragmentMap.size === 0) {
270
+ _Theme.themeFragmentsByKind.set(kind, fragmentMap);
271
+ fragmentMap.set("default", { name, styles });
272
+ _Theme.defaultFragments.add(name);
342
273
  }
343
- _handleContextPresence(event) {
344
- const target = event.composedPath()[0];
345
- if (this._contextConsumers.has(target)) {
346
- this._contextConsumers.delete(target);
347
- }
348
- else {
349
- this._contextConsumers.set(target, event.detail.callback);
350
- const callback = this._contextConsumers.get(target);
351
- if (callback) {
352
- callback(this.lang ||
353
- document.documentElement.lang ||
354
- navigator.language);
355
- }
356
- }
274
+ fragmentMap.set(name, { name, styles });
275
+ _Theme.instances.forEach((instance) => instance.shouldAdoptStyles());
276
+ }
277
+ _provideContext() {
278
+ this._contextConsumers.forEach((consume) => consume(this.lang));
279
+ }
280
+ _handleContextPresence(event) {
281
+ const target = event.composedPath()[0];
282
+ if (this._contextConsumers.has(target)) {
283
+ this._contextConsumers.delete(target);
284
+ } else {
285
+ this._contextConsumers.set(target, event.detail.callback);
286
+ const callback = this._contextConsumers.get(target);
287
+ if (callback) {
288
+ callback(this.lang || document.documentElement.lang || navigator.language);
289
+ }
357
290
  }
358
- }
359
- Theme.themeFragmentsByKind = new Map();
360
- Theme.defaultFragments = new Set(['spectrum']);
361
- Theme.instances = new Set();
362
- //# sourceMappingURL=Theme.js.map
291
+ }
292
+ };
293
+ export let Theme = _Theme;
294
+ Theme.themeFragmentsByKind = /* @__PURE__ */ new Map();
295
+ Theme.defaultFragments = /* @__PURE__ */ new Set(["spectrum"]);
296
+ Theme.instances = /* @__PURE__ */ new Set();
297
+ //# sourceMappingURL=Theme.js.map