@schukai/monster 3.86.3 → 3.86.4

Sign up to get free protection for your applications and to get access to all the features.
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
-