@schukai/monster 3.86.3 → 3.86.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -2,6 +2,14 @@
2
2
 
3
3
 
4
4
 
5
+ ## [3.86.4] - 2024-11-16
6
+
7
+ ### Bug Fixes
8
+
9
+ - update darkmode and small display issues
10
+
11
+
12
+
5
13
  ## [3.86.3] - 2024-11-15
6
14
 
7
15
  ### Bug Fixes
package/package.json CHANGED
@@ -1 +1 @@
1
- {"author":"schukai GmbH","dependencies":{"@floating-ui/dom":"^1.6.12","@popperjs/core":"^2.11.8"},"description":"Monster is a simple library for creating fast, robust and lightweight websites.","homepage":"https://monsterjs.org/","keywords":["framework","web","dom","css","sass","mobile-first","app","front-end","templates","schukai","core","shopcloud","alvine","monster","buildmap","stack","observer","observable","uuid","node","nodelist","css-in-js","logger","log","theme"],"license":"AGPL 3.0","main":"source/monster.mjs","module":"source/monster.mjs","name":"@schukai/monster","repository":{"type":"git","url":"https://gitlab.schukai.com/oss/libraries/javascript/monster.git"},"type":"module","version":"3.86.3"}
1
+ {"author":"schukai GmbH","dependencies":{"@floating-ui/dom":"^1.6.12","@popperjs/core":"^2.11.8"},"description":"Monster is a simple library for creating fast, robust and lightweight websites.","homepage":"https://monsterjs.org/","keywords":["framework","web","dom","css","sass","mobile-first","app","front-end","templates","schukai","core","shopcloud","alvine","monster","buildmap","stack","observer","observable","uuid","node","nodelist","css-in-js","logger","log","theme"],"license":"AGPL 3.0","main":"source/monster.mjs","module":"source/monster.mjs","name":"@schukai/monster","repository":{"type":"git","url":"https://gitlab.schukai.com/oss/libraries/javascript/monster.git"},"type":"module","version":"3.86.4"}
@@ -33,18 +33,6 @@ const dataChangeEventHandlerSymbol = Symbol("dataChangeEventHandler");
33
33
  /**
34
34
  * The Datasource component is a basic class for the datatable component.
35
35
  *
36
- * <img src="./images/dom.png">
37
- *
38
- * Dependencies: the system uses functions of the [monsterjs](https://monsterjs.org/) library
39
- *
40
- * @startuml dom.png
41
- * skinparam monochrome true
42
- * skinparam shadowing false
43
- * HTMLElement <|-- CustomElement
44
- * CustomElement <|-- Datasource
45
- * Datasource <|-- Dom
46
- * @enduml
47
- *
48
36
  * @copyright schukai GmbH
49
37
  * @summary A dom datasource
50
38
  */
@@ -110,6 +98,9 @@ class Dom extends Datasource {
110
98
  */
111
99
  reload() {}
112
100
 
101
+ /**
102
+ * @return {void}
103
+ */
113
104
  connectedCallback() {
114
105
  super.connectedCallback();
115
106
 
@@ -99,36 +99,35 @@ class Rest extends Datasource {
99
99
  }
100
100
 
101
101
  /**
102
- * To set the options via the HTML tag, the attribute `data-monster-options` must be used.
103
- * @see {@link https://monsterjs.org/en/doc/#configurate-a-monster-control}
104
- *
105
- * The individual configuration values can be found in the table.
106
- *
107
- * @property {Object} templates Template definitions
108
- * @property {string} templates.main Main template
109
- * @property {Object} features Feature definitions
110
- * @property {boolean} features.autoInit If true, the component is initialized automatically
111
- * @property {boolean} features.filter If true, the component is initialized automatically
112
- * @property {Object} autoInit Auto init definitions
113
- * @property {boolean} autoInit.intersectionObserver If true, the intersection observer is initialized automatically
114
- * @property {boolean} autoInit.oneTime If true, the intersection observer is initialized only once
115
- * @property {Object} filter Filter definitions
116
- * @property {string} filter.id The id of the filter control
117
- * @property {Object} datatable Datatable definitions
118
- * @property {string} datatable.id The id of the datatable control
119
- * @property {Object} response Response definitions
120
- * @property {Object} response.path Path definitions (changed in 3.56.0)
121
- * @property {string} response.path.message Path to the message (changed in 3.56.0)
122
- * @property {Object} read Read configuration
123
- * @property {string} read.url The url of the rest api
124
- * @property {string} read.method The method of the rest api
125
- * @property {Object} read.parameters The parameters of the rest api
126
- * @property {Object} read.parameters.filter The filter of the rest api
127
- * @property {Object} read.parameters.orderBy The order by of the rest api
128
- * @property {Object} read.parameters.page The page of the rest api
129
- * @property {Object} write Write configuration
130
-
131
- */
102
+ * To set the options via the HTML tag, the attribute `data-monster-options` must be used.
103
+ * @see {@link https://monsterjs.org/en/doc/#configurate-a-monster-control}
104
+ *
105
+ * The individual configuration values can be found in the table.
106
+ *
107
+ * @property {Object} templates Template definitions
108
+ * @property {string} templates.main Main template
109
+ * @property {Object} features Feature definitions
110
+ * @property {boolean} features.autoInit If true, the component is initialized automatically
111
+ * @property {boolean} features.filter If true, the component is initialized automatically
112
+ * @property {Object} autoInit Auto init definitions
113
+ * @property {boolean} autoInit.intersectionObserver If true, the intersection observer is initialized automatically
114
+ * @property {boolean} autoInit.oneTime If true, the intersection observer is initialized only once
115
+ * @property {Object} filter Filter definitions
116
+ * @property {string} filter.id The id of the filter control
117
+ * @property {Object} datatable Datatable definitions
118
+ * @property {string} datatable.id The id of the datatable control
119
+ * @property {Object} response Response definitions
120
+ * @property {Object} response.path Path definitions (changed in 3.56.0)
121
+ * @property {string} response.path.message Path to the message (changed in 3.56.0)
122
+ * @property {Object} read Read configuration
123
+ * @property {string} read.url The url of the rest api
124
+ * @property {string} read.method The method of the rest api
125
+ * @property {Object} read.parameters The parameters of the rest api
126
+ * @property {Object} read.parameters.filter The filter of the rest api
127
+ * @property {Object} read.parameters.orderBy The order by of the rest api
128
+ * @property {Object} read.parameters.page The page of the rest api
129
+ * @property {Object} write Write configuration
130
+ */
132
131
  get defaults() {
133
132
  const restOptions = new RestAPI().defaults;
134
133
 
@@ -175,7 +174,7 @@ class Rest extends Datasource {
175
174
  * @param {string} page
176
175
  * @param {string} query
177
176
  * @param {string} orderBy
178
- * @return {Monster.Components.Datatable.Datasource.Rest}
177
+ * @return {Rest}
179
178
  */
180
179
  setParameters({ page, query, orderBy }) {
181
180
  const parameters = this.getOption("read.parameters");
@@ -88,6 +88,12 @@ export { DataTable };
88
88
  */
89
89
  const gridElementSymbol = Symbol("gridElement");
90
90
 
91
+ /**
92
+ * @private
93
+ * @type {symbol}
94
+ */
95
+ const dataControlElementSymbol = Symbol("dataControlElement");
96
+
91
97
  /**
92
98
  * @private
93
99
  * @type {symbol}
@@ -100,6 +106,12 @@ const gridHeadersElementSymbol = Symbol("gridHeadersElement");
100
106
  */
101
107
  const columnBarElementSymbol = Symbol("columnBarElement");
102
108
 
109
+ /**
110
+ * @private
111
+ * @type {symbol}
112
+ */
113
+ const resizeObserverSymbol = Symbol("resizeObserver");
114
+
103
115
  /**
104
116
  * The DataTable component is used to show the data from a data source.
105
117
  *
@@ -233,6 +245,30 @@ class DataTable extends CustomElement {
233
245
  return "monster-datatable";
234
246
  }
235
247
 
248
+ /**
249
+ * @return {void}
250
+ */
251
+ disconnectedCallback() {
252
+ super.disconnectedCallback();
253
+ if (this?.[resizeObserverSymbol] instanceof ResizeObserver) {
254
+ this[resizeObserverSymbol].disconnect();
255
+ }
256
+ }
257
+
258
+ /**
259
+ * @return {void}
260
+ */
261
+ connectedCallback() {
262
+ const self = this;
263
+ super.connectedCallback();
264
+
265
+ this[resizeObserverSymbol] = new ResizeObserver((entries) => {
266
+ updateGrid.call(self);
267
+ });
268
+
269
+ this[resizeObserverSymbol].observe(this.parentNode);
270
+ }
271
+
236
272
  /**
237
273
  * @return void
238
274
  */
@@ -625,10 +661,6 @@ function updateConfigColumnBar() {
625
661
  function initEventHandler() {
626
662
  const self = this;
627
663
 
628
- getWindow().addEventListener("resize", (event) => {
629
- updateGrid.call(self);
630
- });
631
-
632
664
  self[columnBarElementSymbol].attachObserver(
633
665
  new Observer((e) => {
634
666
  updateHeaderFromColumnBar.call(self);
@@ -858,9 +890,13 @@ function updateGrid() {
858
890
  if (styles !== "") sheet.replaceSync(styles);
859
891
  this.shadowRoot.adoptedStyleSheets = [...DataTable.getCSSStyleSheet(), sheet];
860
892
 
861
- const bodyWidth = getDocument().body.getBoundingClientRect().width;
893
+ const bodyWidth = this.parentNode.clientWidth;
862
894
 
863
895
  const breakpoint = this.getOption("responsive.breakpoint");
896
+ this[dataControlElementSymbol].classList.toggle(
897
+ "small",
898
+ bodyWidth <= breakpoint,
899
+ );
864
900
 
865
901
  if (bodyWidth > breakpoint) {
866
902
  this[gridElementSymbol].style.gridTemplateColumns =
@@ -875,7 +911,7 @@ function updateGrid() {
875
911
 
876
912
  /**
877
913
  * @private
878
- * @param {Monster.Components.Datatable.Header[]} headers
914
+ * @param {Header[]} headers
879
915
  * @param {bool} doFetch
880
916
  */
881
917
  function setDataSource({ orderBy }, doFetch) {
@@ -896,13 +932,17 @@ function setDataSource({ orderBy }, doFetch) {
896
932
 
897
933
  /**
898
934
  * @private
899
- * @return {Monster.Components.Datatable.Form}
935
+ * @return {DataTable}
900
936
  */
901
937
  function initControlReferences() {
902
938
  if (!this.shadowRoot) {
903
939
  throw new Error("no shadow-root is defined");
904
940
  }
905
941
 
942
+ this[dataControlElementSymbol] = this.shadowRoot.querySelector(
943
+ "[data-monster-role=control]",
944
+ );
945
+
906
946
  this[gridElementSymbol] = this.shadowRoot.querySelector(
907
947
  "[data-monster-role=datatable]",
908
948
  );
@@ -20,44 +20,10 @@ import { ToggleButton } from "../host/toggle-button.mjs";
20
20
  export { FilterButton };
21
21
 
22
22
  /**
23
- * The Filter Button component is used to show and handle the filter values.
24
- *
25
- * <img src="./images/filter-button.png">
26
- *
27
- * Dependencies: the system uses functions of the [monsterjs](https://monsterjs.org/) library
28
- *
29
- * You can create this control either by specifying the HTML tag <monster-filter-button />` directly in the HTML or using
30
- * Javascript via the `document.createElement('monster-filter-button');` method.
31
- *
32
- * ```html
33
- * <monster-datatable-filter-button></monster-datatable-filter-button>
34
- * ```
35
- *
36
- * Or you can create this CustomControl directly in Javascript:
37
- *
38
- * ```js
39
- * import '@schukai/component-datatable/source/filter.mjs';
40
- * document.createElement('monster-datatable-filter-button');
41
- * ```
42
- *
43
- * The Body should have a class "hidden" to ensure that the styles are applied correctly.
44
- *
45
- * ```css
46
- * body.hidden {
47
- * visibility: hidden;
48
- * }
49
- * ```
50
- *
51
- * @startuml filter-button.png
52
- * skinparam monochrome true
53
- * skinparam shadowing false
54
- * HTMLElement <|-- CustomElement
55
- * CustomElement <|-- ToggleButton
56
- * ToggleButton <|-- FilterButton
57
- * @enduml
23
+ * A FilterButton is a button that can be used to show the filter.
58
24
  *
59
25
  * @copyright schukai GmbH
60
- * @summary A data set
26
+ * @summary A Button that can be used to show the filter.
61
27
  */
62
28
  class FilterButton extends ToggleButton {
63
29
  /**
@@ -86,7 +52,6 @@ class FilterButton extends ToggleButton {
86
52
  }
87
53
 
88
54
  /**
89
- *
90
55
  * @return {string}
91
56
  */
92
57
  static getTag() {
@@ -94,7 +59,7 @@ class FilterButton extends ToggleButton {
94
59
  }
95
60
 
96
61
  /**
97
- * @return {Array}
62
+ * @return {CSSStyleSheet[]}
98
63
  */
99
64
  static getCSSStyleSheet() {
100
65
  const styles = super.getCSSStyleSheet();
@@ -738,7 +738,6 @@ function initTabEvents() {
738
738
  * @private
739
739
  */
740
740
  function updateFilterTabs() {
741
-
742
741
  const element = this[filterTabElementSymbol];
743
742
  if (!element) {
744
743
  return;
@@ -17,7 +17,8 @@ import {
17
17
  CustomElement,
18
18
  registerCustomElement,
19
19
  } from "../../dom/customelement.mjs";
20
- import { findElementWithSelectorUpwards } from "../../dom/util.mjs";
20
+ import { findElementWithSelectorUpwards, getWindow } from "../../dom/util.mjs";
21
+ import { DeadMansSwitch } from "../../util/deadmansswitch.mjs";
21
22
  import { ThemeStyleSheet } from "../stylesheet/theme.mjs";
22
23
  import { ATTRIBUTE_DATASOURCE_SELECTOR } from "./constants.mjs";
23
24
  import { Datasource } from "./datasource.mjs";
@@ -51,6 +52,24 @@ const paginationElementSymbol = Symbol.for("paginationElement");
51
52
  */
52
53
  const datasourceLinkedElementSymbol = Symbol("datasourceLinkedElement");
53
54
 
55
+ /**
56
+ * @private
57
+ * @type {symbol}
58
+ */
59
+ const resizeObserverSymbol = Symbol("resizeObserver");
60
+
61
+ /**
62
+ * @private
63
+ * @type {symbol}
64
+ */
65
+ const sizeDataSymbol = Symbol("sizeData");
66
+
67
+ /**
68
+ * @private
69
+ * @type {symbol}
70
+ */
71
+ const debounceSizeSymbol = Symbol("debounceSize");
72
+
54
73
  /**
55
74
  * The Pagination component
56
75
  *
@@ -148,6 +167,81 @@ class Pagination extends CustomElement {
148
167
  return "monster-pagination";
149
168
  }
150
169
 
170
+ /**
171
+ * @return {void}
172
+ */
173
+ disconnectedCallback() {
174
+ super.disconnectedCallback();
175
+ if (this?.[resizeObserverSymbol] instanceof ResizeObserver) {
176
+ this[resizeObserverSymbol].disconnect();
177
+ }
178
+ }
179
+
180
+ /**
181
+ * @return {void}
182
+ */
183
+ connectedCallback() {
184
+ const self = this;
185
+ super.connectedCallback();
186
+
187
+ const parentNode = this.parentNode;
188
+ if (!parentNode) {
189
+ return;
190
+ }
191
+
192
+ const parentParentNode = parentNode?.parentNode || parentNode;
193
+
194
+ const parentWidth = parentParentNode.clientWidth;
195
+ const ownWidth = this.clientWidth;
196
+
197
+ this[sizeDataSymbol] = {
198
+ last: {
199
+ parentWidth: parentParentNode.clientWidth || 0,
200
+ ownWidth: this.clientWidth || 0,
201
+ },
202
+ showNumbers: ownWidth < parentWidth,
203
+ };
204
+
205
+ handleDataSourceChanges.call(this);
206
+
207
+ setTimeout(() => {
208
+ this[resizeObserverSymbol] = new ResizeObserver((entries) => {
209
+ if (this[debounceSizeSymbol] instanceof DeadMansSwitch) {
210
+ try {
211
+ this[debounceSizeSymbol].touch();
212
+ return;
213
+ } catch (e) {
214
+ delete this[debounceSizeSymbol];
215
+ }
216
+ }
217
+
218
+ this[debounceSizeSymbol] = new DeadMansSwitch(400, () => {
219
+ queueMicrotask(() => {
220
+ const parentWidth = parentParentNode.clientWidth;
221
+ const ownWidth = this.clientWidth;
222
+
223
+ if (
224
+ this[sizeDataSymbol]?.last?.parentWidth === parentWidth &&
225
+ this[sizeDataSymbol]?.last?.ownWidth === ownWidth
226
+ ) {
227
+ return;
228
+ }
229
+
230
+ this[sizeDataSymbol].last = {
231
+ parentWidth: parentWidth,
232
+ ownWidth: ownWidth,
233
+ };
234
+
235
+ this[sizeDataSymbol].showNumbers = ownWidth < parentWidth;
236
+ handleDataSourceChanges.call(this);
237
+ });
238
+ });
239
+ });
240
+
241
+ this[resizeObserverSymbol].observe(this?.parentNode?.parentNode);
242
+ }, 500);
243
+ }
244
+
151
245
  /**
152
246
  * @return {void}
153
247
  */
@@ -173,6 +267,7 @@ class Pagination extends CustomElement {
173
267
  element.datasource.attachObserver(
174
268
  new Observer(handleDataSourceChanges.bind(this)),
175
269
  );
270
+
176
271
  handleDataSourceChanges.call(this);
177
272
  }
178
273
  }
@@ -244,6 +339,10 @@ function initEventHandler() {
244
339
  }
245
340
  }
246
341
 
342
+ if (!(element instanceof HTMLElement)) {
343
+ return;
344
+ }
345
+
247
346
  let page = null;
248
347
 
249
348
  if (!element.hasAttribute("data-page-no")) {
@@ -264,7 +363,17 @@ function initEventHandler() {
264
363
  return;
265
364
  }
266
365
 
267
- datasource.setParameters({ page }).reload();
366
+ if (typeof datasource.setParameters !== "function") {
367
+ return;
368
+ }
369
+
370
+ datasource.setParameters({ page });
371
+
372
+ if (typeof datasource.reload !== "function") {
373
+ return;
374
+ }
375
+
376
+ datasource.reload();
268
377
  });
269
378
  }
270
379
 
@@ -320,11 +429,18 @@ function handleDataSourceChanges() {
320
429
  this.getOption("currentPage"),
321
430
  this.getOption("pages"),
322
431
  );
323
- this.setOption("pagination", pagination);
432
+
433
+ if (this?.[sizeDataSymbol]?.showNumbers !== true) {
434
+ pagination.items = [];
435
+ }
436
+
437
+ getWindow().requestAnimationFrame(() => {
438
+ this.setOption("pagination", pagination);
439
+ });
324
440
  }
325
441
 
326
442
  /**
327
- *
443
+ * @private
328
444
  * @param current
329
445
  * @param max
330
446
  * @return {object}
@@ -436,17 +552,19 @@ function getTemplate() {
436
552
  <nav data-monster-role="pagination" role="navigation" aria-label="pagination">
437
553
  <ul class="pagination-list" data-monster-insert="items path:pagination.items"
438
554
  data-monster-select-this="true">
439
- <li part="pagination-prev"><a data-monster-role="pagination-prev"
440
- data-monster-attributes="
555
+ <li part="pagination-prev" data-monster-role="pagination-prev"><a
556
+ data-monster-role="pagination-prev"
557
+ data-monster-attributes="
441
558
  class path:pagination.prevClass | prefix: previous,
442
559
  data-page-no path:pagination.prevNo,
443
560
  href path:pagination.prevHref | prefix: #"
444
- data-monster-replace="path:labels.previous">Previous</a></li>
445
- <li part="pagination-next"><a data-monster-role="pagination-next"
446
- data-monster-attributes="class path:pagination.nextClass | prefix: next,
561
+ data-monster-replace="path:labels.previous">Previous</a></li>
562
+ <li part="pagination-next" data-monster-role="pagination-next"><a
563
+ data-monster-role="pagination-next"
564
+ data-monster-attributes="class path:pagination.nextClass | prefix: next,
447
565
  data-page-no path:pagination.nextNo,
448
566
  href path:pagination.nextHref | prefix: #"
449
- data-monster-replace="path:labels.next">Next</a></li>
567
+ data-monster-replace="path:labels.next">Next</a></li>
450
568
  </ul>
451
569
  </nav>
452
570
  </div>
@@ -18,12 +18,6 @@
18
18
  @import "../../style/theme.pcss";
19
19
  @import "../../style/skeleton.pcss";
20
20
 
21
- [data-monster-role="control"] {
22
- container-type: inline-size ;
23
- container-name: datatable;
24
- @mixin text;
25
- }
26
-
27
21
  ::slotted(monster-collapse) {
28
22
  --monster-color-gradient-1: none;
29
23
  --monster-color-gradient-2: none;
@@ -252,15 +246,14 @@ monster-state[data-monster-role=empty-without-action]::part(action) {
252
246
  padding: var(--monster-space-7) 0;
253
247
  }
254
248
 
255
-
256
- @container datatable (max-width: 900px) {
249
+ [data-monster-role="control"].small {
257
250
 
258
251
 
259
- [data-monster-role="datatable-headers"] {
252
+ & [data-monster-role="datatable-headers"] {
260
253
  display: none;
261
254
  }
262
255
 
263
- [data-monster-role="table-container"] {
256
+ & [data-monster-role="table-container"] {
264
257
 
265
258
  & .bar {
266
259
  display: flex;
@@ -285,7 +278,7 @@ monster-state[data-monster-role=empty-without-action]::part(action) {
285
278
  }
286
279
  }
287
280
 
288
- ::slotted(.monster-button-group) {
281
+ & ::slotted(.monster-button-group) {
289
282
  display: flex;
290
283
  flex-direction: column !important;
291
284
  }
@@ -7,6 +7,8 @@
7
7
  @import "../../style/control.pcss";
8
8
  @import "../../style/property.pcss";
9
9
 
10
+
11
+
10
12
  [data-monster-role=pagination] {
11
13
  @mixin text;
12
14
  display: flex;
@@ -15,21 +17,27 @@
15
17
 
16
18
  & ul {
17
19
  display: flex;
18
- flex-wrap: wrap;
20
+ flex-wrap: nowrap;
19
21
  justify-content: center;
20
22
  align-items: center;
21
23
  list-style: none;
22
24
 
23
25
  padding-left: 0;
24
26
  margin: 20px 0;
27
+
25
28
 
26
29
  }
27
30
 
28
31
  & ul li {
29
32
 
30
33
  margin: 0;
31
- border-left: solid 1px black;
34
+ border-left: solid 1px var(--monster-theme-control-border-color);
32
35
  padding: 0 10px;
36
+
37
+ display: flex;
38
+ align-items: center;
39
+ justify-content: center;
40
+
33
41
 
34
42
  & a, & a:link, & a:visited, & a:hover, & a:active, & a:focus {
35
43
  width: max-content;
@@ -73,7 +81,7 @@
73
81
  }
74
82
  }
75
83
 
76
- @mixin viewport-7 {
84
+ @mixin viewport-7 {
77
85
 
78
86
  & ul li {
79
87
  padding: 0 2px;
@@ -92,67 +100,14 @@
92
100
  }
93
101
 
94
102
  }
95
- /*
96
- & [data-monster-error-state=hidden] {
97
- display: none;
98
- }
99
-
100
- & [data-monster-loading-state=hidden] {
101
- display: none;
102
- }
103
- */
104
- /** & .pagination-loading-state {
105
- align-items: center;
106
- display: flex;
107
103
 
108
- &.hidden {
109
- display: none;
110
- }
111
104
 
112
- }
105
+ }
113
106
 
114
- & .pagination-error-state {
115
- align-items: center;
116
- display: flex;
117
107
 
118
- &.hidden {
119
- display: none;
120
- }
121
- & .state-icon-container {
122
- width:2em;
123
- height:2em;
124
- margin:0 5px 0 2px;
108
+ @container (min-width: 800px) {
109
+ [data-monster-role=pagination] {
110
+ background-color: red;
111
+ color: red;
125
112
  }
126
- }*/
127
- /*
128
- & .pagination-state {
129
- display: flex !important;
130
- flex-wrap: nowrap;
131
- flex-direction: row;
132
- align-items: center;
133
- justify-content: center;
134
-
135
- & [data-monster-error-state] {
136
- width:2em;
137
- height:2em;
138
- margin:0 5px 0 2px;
139
-
140
- display: flex;
141
- align-items: center;
142
- justify-content: center;
143
- }
144
-
145
- & [data-monster-loading-state] {
146
- width:2em;
147
- height:2em;
148
- margin:0 5px 0 2px;
149
- }
150
-
151
-
152
- }*/
153
-
154
-
155
-
156
-
157
113
  }
158
-