@schukai/monster 3.64.1 → 3.65.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (52) hide show
  1. package/CHANGELOG.md +19 -0
  2. package/example/components/form/button.mjs +1 -1
  3. package/example/components/form/field-set.mjs +4 -0
  4. package/example/components/form/select.mjs +1 -1
  5. package/package.json +2 -1
  6. package/source/components/datatable/datatable/header.mjs +228 -221
  7. package/source/components/datatable/style/dataset.pcss +1 -0
  8. package/source/components/datatable/style/datatable.pcss +1 -0
  9. package/source/components/datatable/stylesheet/dataset.mjs +1 -1
  10. package/source/components/datatable/stylesheet/datatable.mjs +1 -1
  11. package/source/components/form/button.mjs +263 -281
  12. package/source/components/form/field-set.mjs +300 -0
  13. package/source/components/form/popper.mjs +13 -480
  14. package/source/components/form/style/field-set.pcss +13 -0
  15. package/source/components/form/stylesheet/button-bar.mjs +1 -1
  16. package/source/components/form/stylesheet/confirm-button.mjs +1 -1
  17. package/source/components/form/stylesheet/field-set.mjs +31 -0
  18. package/source/components/form/stylesheet/form.mjs +1 -1
  19. package/source/components/host/collapse.mjs +14 -516
  20. package/source/components/host/config-manager.mjs +9 -2
  21. package/source/components/host/constants.mjs +9 -4
  22. package/source/components/host/details.mjs +14 -253
  23. package/source/components/host/stylesheet/host.mjs +1 -1
  24. package/source/components/host/stylesheet/overlay.mjs +1 -1
  25. package/source/components/layout/collapse.mjs +542 -0
  26. package/source/components/layout/details.mjs +271 -0
  27. package/source/components/layout/popper.mjs +476 -0
  28. package/source/components/layout/tabs.mjs +3 -3
  29. package/source/components/layout/width-toggle.mjs +3 -3
  30. package/source/components/navigation/style/table-of-content.pcss +84 -0
  31. package/source/components/navigation/stylesheet/table-of-content.mjs +31 -0
  32. package/source/components/navigation/table-of-content.mjs +418 -0
  33. package/source/components/state/stylesheet/state.mjs +1 -1
  34. package/source/components/style/link.pcss +0 -1
  35. package/source/components/style/mixin/typography.pcss +7 -7
  36. package/source/components/style/typography.pcss +1 -1
  37. package/source/components/stylesheet/typography.mjs +1 -1
  38. package/source/dom/ready.mjs +10 -4
  39. package/source/monster.mjs +5 -84
  40. package/source/types/proxyobserver.mjs +4 -2
  41. package/source/types/version.mjs +1 -1
  42. package/test/cases/monster.mjs +1 -1
  43. package/test/web/tests.js +4 -4
  44. package/source/components/form/form-field.mjs +0 -341
  45. package/source/components/form/style/form-field.pcss +0 -4
  46. package/source/components/form/stylesheet/form-field.mjs +0 -31
  47. /package/source/components/{host → layout}/style/collapse.pcss +0 -0
  48. /package/source/components/{host → layout}/style/details.pcss +0 -0
  49. /package/source/components/{form → layout}/style/popper.pcss +0 -0
  50. /package/source/components/{host → layout}/stylesheet/collapse.mjs +0 -0
  51. /package/source/components/{host → layout}/stylesheet/details.mjs +0 -0
  52. /package/source/components/{form → layout}/stylesheet/popper.mjs +0 -0
@@ -0,0 +1,418 @@
1
+ /**
2
+ * Copyright © schukai GmbH and all contributing authors, {{copyRightYear}}. All rights reserved.
3
+ * Node module: @schukai/monster
4
+ *
5
+ * This source code is licensed under the GNU Affero General Public License version 3 (AGPLv3).
6
+ * The full text of the license can be found at: https://www.gnu.org/licenses/agpl-3.0.en.html
7
+ *
8
+ * For those who do not wish to adhere to the AGPLv3, a commercial license is available.
9
+ * Acquiring a commercial license allows you to use this software without complying with the AGPLv3 terms.
10
+ * For more information about purchasing a commercial license, please contact schukai GmbH.
11
+ */
12
+
13
+ import {instanceSymbol} from "../../constants.mjs";
14
+ import {addAttributeToken} from "../../dom/attributes.mjs";
15
+ import {
16
+ ATTRIBUTE_ERRORMESSAGE,
17
+ ATTRIBUTE_ROLE,
18
+ } from "../../dom/constants.mjs";
19
+ import {CustomElement} from "../../dom/customelement.mjs";
20
+ import {
21
+ assembleMethodSymbol,
22
+ registerCustomElement,
23
+ } from "../../dom/customelement.mjs";
24
+ import {findTargetElementFromEvent} from "../../dom/events.mjs";
25
+ import {isFunction} from "../../types/is.mjs";
26
+ import {TableOfContentStyleSheet} from "./stylesheet/table-of-content.mjs";
27
+ import {fireCustomEvent} from "../../dom/events.mjs";
28
+ import {getWindow} from "../../dom/util.mjs";
29
+ import "../layout/popper.mjs";
30
+
31
+ export {TableOfContent};
32
+
33
+ /**
34
+ * @private
35
+ * @type {symbol}
36
+ */
37
+ const tableOfContentElementSymbol = Symbol("tableOfContentElement");
38
+
39
+ /**
40
+ * @private
41
+ * @type {symbol}
42
+ */
43
+ const navigationElementSymbol = Symbol("navigation");
44
+
45
+
46
+ /**
47
+ * @private
48
+ * @type {symbol}
49
+ */
50
+ const navigationControlElementSymbol = Symbol("navigationControlElement");
51
+
52
+ /**
53
+ * @private
54
+ * @type {symbol}
55
+ */
56
+ const navigationListElementSymbol = Symbol("navigationListElement");
57
+
58
+ /**
59
+ * @private
60
+ * @type {symbol}
61
+ */
62
+ const windowEventHandlerSymbol = Symbol("windowsEventHandler");
63
+
64
+ /**
65
+ * @private
66
+ * @type {symbol}
67
+ */
68
+ const scrollableParentSymbol = Symbol("scrollableParent");
69
+
70
+ /**
71
+ * @private
72
+ * @type {symbol}
73
+ */
74
+ const scrollableEventHandlerSymbol = Symbol("scrollableEventHandler");
75
+
76
+ /**
77
+ * A TableOfContent
78
+ *
79
+ * @fragments /fragments/components/form/table-of-content/
80
+ *
81
+ * @example /examples/components/form/table-of-content-simple
82
+ *
83
+ * @since 3.66.0
84
+ * @copyright schukai GmbH
85
+ * @summary A beautiful TableOfContent that can make your life easier and also looks good.
86
+ */
87
+ class TableOfContent extends CustomElement {
88
+ /**
89
+ * This method is called by the `instanceof` operator.
90
+ * @returns {symbol}
91
+ */
92
+ static get [instanceSymbol]() {
93
+ return Symbol.for("@schukai/monster/components/navigation/table-of-content@@instance");
94
+ }
95
+
96
+ /**
97
+ *
98
+ * @return {Components.Navigation.TableOfContent
99
+ */
100
+ [assembleMethodSymbol]() {
101
+ super[assembleMethodSymbol]();
102
+ initControlReferences.call(this);
103
+ initEventHandler.call(this);
104
+ return this;
105
+ }
106
+
107
+ /**
108
+ * To set the options via the html tag the attribute `data-monster-options` must be used.
109
+ * @see {@link https://monsterjs.org/en/doc/#configurate-a-monster-control}
110
+ *
111
+ * The individual configuration values can be found in the table.
112
+ *
113
+ * @property {Object} templates Template definitions
114
+ * @property {string} templates.main Main template
115
+ * @property {Object} labels Label definitions
116
+ * @property {Object} actions Callbacks
117
+ * @property {string} actions.click="throw Error" Callback when clicked
118
+ * @property {Object} features Features
119
+ * @property {number} offset=100 Navigation offset from top
120
+ * @property {Object} classes CSS classes
121
+ * @property {boolean} disabled=false Disabled state
122
+ */
123
+ get defaults() {
124
+ return Object.assign({}, super.defaults, {
125
+ templates: {
126
+ main: getTemplate(),
127
+ },
128
+ labels: {},
129
+ classes: {},
130
+ disabled: false,
131
+ features: {},
132
+ offset: 100,
133
+ actions: {
134
+ click: () => {
135
+ throw new Error("the click action is not defined");
136
+ },
137
+ }
138
+ });
139
+ }
140
+
141
+ /**
142
+ * @return {void}
143
+ */
144
+ connectedCallback() {
145
+ super.connectedCallback();
146
+
147
+ initNavigation.call(this);
148
+
149
+ setTimeout(() => {
150
+
151
+ this[scrollableParentSymbol] = findScrollableParent(this);
152
+
153
+ if (this[scrollableParentSymbol] === getWindow()) {
154
+ this[scrollableParentSymbol].addEventListener('scroll', this[windowEventHandlerSymbol]);
155
+ calcAndSetNavigationTopWindowContext.call(this);
156
+ } else {
157
+ this[scrollableParentSymbol].addEventListener('scroll', this[scrollableEventHandlerSymbol]);
158
+ calcAndSetNavigationTopScrollableParentContext.call(this);
159
+ }
160
+ }, 100);
161
+ }
162
+
163
+ /**
164
+ * @return {void}
165
+ */
166
+ disconnectedCallback() {
167
+ super.disconnectedCallback();
168
+
169
+ if (this[scrollableParentSymbol] === getWindow()) {
170
+ this[scrollableParentSymbol].removeEventListener('scroll', this[windowEventHandlerSymbol]);
171
+ } else {
172
+ this[scrollableParentSymbol].removeEventListener('scroll', this[scrollableEventHandlerSymbol]);
173
+ }
174
+ }
175
+
176
+ /**
177
+ * @return {string}
178
+ */
179
+ static getTag() {
180
+ return "monster-table-of-content";
181
+ }
182
+
183
+ /**
184
+ * @return {CSSStyleSheet[]}
185
+ */
186
+ static getCSSStyleSheet() {
187
+ return [TableOfContentStyleSheet];
188
+ }
189
+
190
+
191
+ }
192
+
193
+ /**
194
+ * @private
195
+ */
196
+ function calcAndSetNavigationTopWindowContext() {
197
+
198
+ const thisTop = this.getBoundingClientRect().top;
199
+ const topViewport = window.scrollY;
200
+ let top = Math.max(topViewport, thisTop);
201
+
202
+ const offset = this.getOption('offset');
203
+ if (offset > 0) {
204
+ top += offset;
205
+ }
206
+ this[navigationElementSymbol].style.top = top + "px";
207
+ }
208
+
209
+ /**
210
+ * @private
211
+ */
212
+ function calcAndSetNavigationTopScrollableParentContext() {
213
+
214
+ const windowTop = getWindow().scrollY;
215
+ const thisRect = this.getBoundingClientRect();
216
+ const thisTop = thisRect.top;
217
+ const thisBottom = thisRect.bottom;
218
+ const scrollTop = this[scrollableParentSymbol].scrollTop;
219
+ let top = windowTop + thisTop + scrollTop;
220
+
221
+ if (thisBottom < top) {
222
+ top = thisBottom;
223
+ this[navigationElementSymbol].style.visibility = "hidden";
224
+ } else {
225
+ this[navigationElementSymbol].style.visibility = "visible";
226
+ }
227
+ const offset = this.getOption('offset');
228
+ if (offset > 0) {
229
+ top += offset;
230
+ }
231
+
232
+ this[navigationElementSymbol].style.top = top + "px";
233
+ }
234
+
235
+ /**
236
+ * @private
237
+ */
238
+ function initNavigation() {
239
+
240
+ const headings = getHeadings.call(this);
241
+
242
+ for (const heading of headings) {
243
+ const div = document.createElement('div');
244
+ div.classList.add('heading-strip');
245
+ div.classList.add('level-' + heading.tagName.toLowerCase());
246
+ this[navigationControlElementSymbol].appendChild(div);
247
+ }
248
+
249
+ this[navigationListElementSymbol].appendChild(createListFromHeadings.call(this, headings).sublist);
250
+ }
251
+
252
+ /**
253
+ * Recursively creates a nested list (UL) from a list of heading elements.
254
+ * @param {HTMLElement[]} nodeList - The list of heading elements.
255
+ * @param {number} currentLevel - The current heading level we are processing.
256
+ * @returns {{sublist: HTMLUListElement, lastIndex: number}} An object containing the sublist and the index of the last processed element.
257
+ */
258
+ function createListFromHeadings(nodeList, currentLevel = 1) {
259
+ const self = this;
260
+ let ul = document.createElement('ul');
261
+ let i = 0;
262
+
263
+ while (i < nodeList.length) {
264
+ const node = nodeList[i];
265
+ const level = parseInt(node.tagName.substring(1));
266
+
267
+ if (level === currentLevel) {
268
+ const li = document.createElement('li');
269
+ li.textContent = node.textContent;
270
+
271
+ li.addEventListener('click', (e) => {
272
+ e.stopPropagation();
273
+ getWindow().requestAnimationFrame(() => {
274
+ window.scrollTo(0, 0);
275
+ // https://developer.mozilla.org/en-US/docs/Web/API/Element/scrollIntoView
276
+ // mostly supported
277
+ node?.scrollIntoView({behavior: "smooth"});
278
+ });
279
+ });
280
+
281
+ ul.appendChild(li);
282
+ i++;
283
+ } else if (level > currentLevel) {
284
+ if (ul.lastChild) {
285
+ const {sublist, lastIndex} = createListFromHeadings.call(self, nodeList.slice(i), level);
286
+ ul.lastChild.appendChild(sublist);
287
+ i += lastIndex;
288
+ } else {
289
+ throw new Error("Heading structure error: higher level heading without a preceding lower level heading.");
290
+ }
291
+ } else {
292
+ break;
293
+ }
294
+ }
295
+
296
+ return {sublist: ul, lastIndex: i};
297
+ }
298
+
299
+ /**
300
+ * @private
301
+ * @returns {*[]}
302
+ */
303
+ function getHeadings() {
304
+ const allHeadings = [];
305
+
306
+ const slots = this.shadowRoot.querySelectorAll('slot');
307
+
308
+ slots.forEach(slot => {
309
+ const slottedElements = slot.assignedElements();
310
+ slottedElements.forEach(element => {
311
+ if (element instanceof HTMLHeadingElement) {
312
+ allHeadings.push(element);
313
+ return;
314
+ }
315
+
316
+ const headings = element.querySelectorAll("h1, h2, h3, h4, h5, h6");
317
+ let nodeList = Array.from(headings);
318
+ allHeadings.push(...nodeList);
319
+ });
320
+ });
321
+ return allHeadings;
322
+ }
323
+
324
+
325
+ /**
326
+ * @private
327
+ * @return {initEventHandler}
328
+ */
329
+ function initEventHandler() {
330
+
331
+ const self = this;
332
+ let ticking = false;
333
+
334
+ this[windowEventHandlerSymbol] = function () {
335
+ if (!ticking) {
336
+ getWindow().requestAnimationFrame(() => {
337
+ calcAndSetNavigationTopWindowContext.call(self);
338
+ ticking = false;
339
+ });
340
+ ticking = true;
341
+ }
342
+ }
343
+
344
+ this[scrollableEventHandlerSymbol] = function () {
345
+ if (!ticking) {
346
+ getWindow().requestAnimationFrame(() => {
347
+ calcAndSetNavigationTopScrollableParentContext.call(self);
348
+ ticking = false;
349
+ });
350
+ ticking = true;
351
+ }
352
+ }
353
+
354
+ return this;
355
+ }
356
+
357
+ /**
358
+ *
359
+ * @param {HTMLElement} element
360
+ * @return {HTMLElement|Window}
361
+ */
362
+ function findScrollableParent(element) {
363
+
364
+ let parent = element.parentElement;
365
+ while (parent) {
366
+ const overflowY = getWindow().getComputedStyle(parent).overflowY;
367
+ if (overflowY === 'scroll' || overflowY === 'auto') {
368
+ return parent;
369
+ }
370
+ parent = parent.parentElement;
371
+ }
372
+ return getWindow();
373
+ }
374
+
375
+ /**
376
+ * @private
377
+ * @return {void}
378
+ */
379
+ function initControlReferences() {
380
+ this[tableOfContentElementSymbol] = this.shadowRoot.querySelector(
381
+ `[${ATTRIBUTE_ROLE}="control"]`,
382
+ );
383
+
384
+ this[navigationElementSymbol] = this.shadowRoot.querySelector(
385
+ `[${ATTRIBUTE_ROLE}="navigation"]`,
386
+ );
387
+
388
+ this[navigationControlElementSymbol] = this.shadowRoot.querySelector(
389
+ `[${ATTRIBUTE_ROLE}="navigation-control"]`,
390
+ );
391
+
392
+ this[navigationListElementSymbol] = this.shadowRoot.querySelector(
393
+ `[${ATTRIBUTE_ROLE}="navigation-list"]`,
394
+ );
395
+ }
396
+
397
+ /**
398
+ * @private
399
+ * @return {string}
400
+ */
401
+ function getTemplate() {
402
+ // language=HTML
403
+ return `
404
+ <div data-monster-role="control" part="control">
405
+ <div class="navigation" data-monster-role="navigation">
406
+ <monster-popper data-monster-option-mode="enter">
407
+ <div slot="button" data-monster-role="navigation-control">
408
+ </div>
409
+ <div data-monster-role="navigation-list">
410
+ </div>
411
+ </monster-popper>
412
+ </div>
413
+ <slot></slot>
414
+ </div>`;
415
+ }
416
+
417
+
418
+ registerCustomElement(TableOfContent);
@@ -24,7 +24,7 @@ const StateStyleSheet = new CSSStyleSheet();
24
24
  try {
25
25
  StateStyleSheet.insertRule(`
26
26
  @layer state {
27
- .block{display:block}.inline{display:inline}.inline-block{display:inline-block}.grid{display:grid}.inline-grid{display:inline-grid}.flex{display:flex}.inline-flex{display:inline-flex}.hidden,.hide,.none{display:none}.visible{visibility:visible}.invisible{visibility:hidden}.monster-border-primary-1,.monster-border-primary-2,.monster-border-primary-3,.monster-border-primary-4{border-radius:var(--monster-border-radius);border-style:var(--monster-border-style);border-width:var(--monster-border-width)}.monster-border-0{border-radius:0;border-style:none;border-width:0}.monster-border-primary-1{border-color:var(--monster-bg-color-primary-1)}.monster-border-primary-2{border-color:var(--monster-bg-color-primary-2)}.monster-border-primary-3{border-color:var(--monster-bg-color-primary-3)}.monster-border-primary-4{border-color:var(--monster-bg-color-primary-4)}.monster-border-secondary-1,.monster-border-secondary-2,.monster-border-secondary-3,.monster-border-secondary-4{border-radius:var(--monster-border-radius);border-style:var(--monster-border-style);border-width:var(--monster-border-width)}.monster-border-secondary-1{border-color:var(--monster-bg-color-secondary-1)}.monster-border-secondary-2{border-color:var(--monster-bg-color-secondary-2)}.monster-border-secondary-3{border-color:var(--monster-bg-color-secondary-3)}.monster-border-secondary-4{border-color:var(--monster-bg-color-secondary-4)}.monster-border-tertiary-1,.monster-border-tertiary-2,.monster-border-tertiary-3,.monster-border-tertiary-4{border-radius:var(--monster-border-radius);border-style:var(--monster-border-style);border-width:var(--monster-border-width)}.monster-border-tertiary-1{border-color:var(--monster-bg-color-tertiary-1)}.monster-border-tertiary-2{border-color:var(--monster-bg-color-tertiary-2)}.monster-border-tertiary-3{border-color:var(--monster-bg-color-tertiary-3)}.monster-border-tertiary-4{border-color:var(--monster-bg-color-tertiary-4)}[data-monster-role=control]{outline:none;width:100%}[data-monster-role=control].flex{align-items:center;display:flex;flex-direction:row}div{text-align:center}::slotted(:empty:not(img)){display:none}slot{align-items:center;display:flex;flex-direction:column;justify-content:center}::slotted(svg[slot=visual]){height:40vmin;min-height:200px;width:auto}::slotted(h1){font-size:3rem;font-weight:400;line-height:1.15;margin-bottom:1.5rem;text-align:center}::slotted(h2){font-size:2.5rem;font-weight:400;line-height:1.2;margin-bottom:1.5rem;text-align:center}::slotted(h3){font-size:2rem;font-weight:400;line-height:1.25;margin-bottom:1.25rem;text-align:center}::slotted(h4){font-size:1.5rem;font-weight:400;line-height:1.3;margin-bottom:1.25rem;text-align:center}::slotted(h5){font-size:1.4rem;font-weight:bolder;line-height:1.3;margin-bottom:1.25rem;text-align:center}::slotted(h6){font-size:1.3rem;font-weight:700;line-height:1.3;margin-bottom:1.25rem;text-align:center}::slotted(p){font-size:1rem;font-weight:400;line-height:1.6;text-align:center;text-align:justify}::slotted(button[slot=action]){align-items:center;background-color:var(--monster-bg-color-primary-1);background-position:50%;border-radius:var(--monster-border-radius);border-style:var(--monster-border-style);border-width:var(--monster-border-width);box-shadow:var(--monster-box-shadow-1);color:var(--monster-color-primary-1);cursor:pointer;display:flex;font-family:var(--monster-font-family);font-size:1rem;font-weight:400;gap:.4rem;justify-content:center;line-height:1.5;outline:none;overflow:hidden;padding:.375rem .75rem;position:relative;text-align:center;text-decoration:none;-webkit-user-select:none;-moz-user-select:none;user-select:none;vertical-align:middle;width:-webkit-fill-available;width:-moz-available;width:stretch}::slotted(button[slot=action]:hover){box-shadow:var(--monster-box-shadow-2);transition:background .8s,color .25s .0833333333s}::slotted(*){flex-grow:1}slot[name=action]{align-content:center;align-items:stretch;-moz-column-gap:1rem;column-gap:1rem;display:flex;flex-direction:row;padding:2rem 1rem;place-content:center space-evenly;justify-content:space-between}@media (max-width:480px){slot[name=action]{-moz-column-gap:0;column-gap:0;flex-direction:column;padding:1rem 0;row-gap:1rem}}
27
+ .block{display:block}.inline{display:inline}.inline-block{display:inline-block}.grid{display:grid}.inline-grid{display:inline-grid}.flex{display:flex}.inline-flex{display:inline-flex}.hidden,.hide,.none{display:none}.visible{visibility:visible}.invisible{visibility:hidden}.monster-border-primary-1,.monster-border-primary-2,.monster-border-primary-3,.monster-border-primary-4{border-radius:var(--monster-border-radius);border-style:var(--monster-border-style);border-width:var(--monster-border-width)}.monster-border-0{border-radius:0;border-style:none;border-width:0}.monster-border-primary-1{border-color:var(--monster-bg-color-primary-1)}.monster-border-primary-2{border-color:var(--monster-bg-color-primary-2)}.monster-border-primary-3{border-color:var(--monster-bg-color-primary-3)}.monster-border-primary-4{border-color:var(--monster-bg-color-primary-4)}.monster-border-secondary-1,.monster-border-secondary-2,.monster-border-secondary-3,.monster-border-secondary-4{border-radius:var(--monster-border-radius);border-style:var(--monster-border-style);border-width:var(--monster-border-width)}.monster-border-secondary-1{border-color:var(--monster-bg-color-secondary-1)}.monster-border-secondary-2{border-color:var(--monster-bg-color-secondary-2)}.monster-border-secondary-3{border-color:var(--monster-bg-color-secondary-3)}.monster-border-secondary-4{border-color:var(--monster-bg-color-secondary-4)}.monster-border-tertiary-1,.monster-border-tertiary-2,.monster-border-tertiary-3,.monster-border-tertiary-4{border-radius:var(--monster-border-radius);border-style:var(--monster-border-style);border-width:var(--monster-border-width)}.monster-border-tertiary-1{border-color:var(--monster-bg-color-tertiary-1)}.monster-border-tertiary-2{border-color:var(--monster-bg-color-tertiary-2)}.monster-border-tertiary-3{border-color:var(--monster-bg-color-tertiary-3)}.monster-border-tertiary-4{border-color:var(--monster-bg-color-tertiary-4)}[data-monster-role=control]{outline:none;width:100%}[data-monster-role=control].flex{align-items:center;display:flex;flex-direction:row}div{text-align:center}::slotted(:empty:not(img)){display:none}slot{align-items:center;display:flex;flex-direction:column;justify-content:center}::slotted(svg[slot=visual]){height:40vmin;min-height:200px;width:auto}::slotted(h1){font-size:3rem;font-weight:400;line-height:1.15;margin:4rem 0 1.5rem;text-align:center}::slotted(h2){font-size:2.5rem;font-weight:400;line-height:1.2;margin:4rem 0 1.5rem;text-align:center}::slotted(h3){font-size:2rem;font-weight:400;line-height:1.25;margin:4rem 0 1.25rem;text-align:center}::slotted(h4){font-size:1.5rem;font-weight:400;line-height:1.3;margin:4rem 0 1.25rem;text-align:center}::slotted(h5){font-size:1.4rem;font-weight:bolder;line-height:1.3;margin:4rem 0 1.25rem;text-align:center}::slotted(h6){font-size:1.3rem;font-weight:700;line-height:1.3;margin:4rem 0 1.25rem;text-align:center}::slotted(p){font-size:1rem;font-weight:400;line-height:1.6;text-align:center;text-align:justify}::slotted(button[slot=action]){align-items:center;background-color:var(--monster-bg-color-primary-1);background-position:50%;border-radius:var(--monster-border-radius);border-style:var(--monster-border-style);border-width:var(--monster-border-width);box-shadow:var(--monster-box-shadow-1);color:var(--monster-color-primary-1);cursor:pointer;display:flex;font-family:var(--monster-font-family);font-size:1rem;font-weight:400;gap:.4rem;justify-content:center;line-height:1.5;outline:none;overflow:hidden;padding:.375rem .75rem;position:relative;text-align:center;text-decoration:none;-webkit-user-select:none;-moz-user-select:none;user-select:none;vertical-align:middle;width:-webkit-fill-available;width:-moz-available;width:stretch}::slotted(button[slot=action]:hover){box-shadow:var(--monster-box-shadow-2);transition:background .8s,color .25s .0833333333s}::slotted(*){flex-grow:1}slot[name=action]{align-content:center;align-items:stretch;-moz-column-gap:1rem;column-gap:1rem;display:flex;flex-direction:row;padding:2rem 1rem;place-content:center space-evenly;justify-content:space-between}@media (max-width:480px){slot[name=action]{-moz-column-gap:0;column-gap:0;flex-direction:column;padding:1rem 0;row-gap:1rem}}
28
28
  }`, 0);
29
29
  } catch (e) {
30
30
  addAttributeToken(document.getRootNode().querySelector('html'), ATTRIBUTE_ERRORMESSAGE, e + "");
@@ -39,7 +39,6 @@ a:focus {
39
39
 
40
40
  a, a:link, a:visited, a:hover, a:active, a:focus {
41
41
  color: var(--monster-color-amber-2);
42
-
43
42
  }
44
43
 
45
44
  a:focus {
@@ -3,46 +3,46 @@
3
3
  @define-mixin h1 {
4
4
  font-size: 3rem;
5
5
  line-height: 1.15;
6
- margin-bottom: 1.5rem;
6
+ margin: 4rem 0 1.5rem;
7
7
  font-weight: normal;
8
8
  }
9
9
 
10
10
  @define-mixin h2 {
11
11
  font-size: 2.5rem;
12
12
  line-height: 1.2;
13
- margin-bottom: 1.5rem;
13
+ margin: 4rem 0 1.5rem;
14
14
  font-weight: normal;
15
15
  }
16
16
 
17
17
  @define-mixin h3 {
18
18
  font-size: 2rem;
19
19
  line-height: 1.25;
20
- margin-bottom: 1.25rem;
20
+ margin: 4rem 0 1.25rem;
21
21
  font-weight: normal;
22
22
  }
23
23
 
24
24
  @define-mixin h4 {
25
25
  font-size: 1.5rem;
26
26
  line-height: 1.3;
27
- margin-bottom: 1.25rem;
27
+ margin: 4rem 0 1.25rem;
28
28
  font-weight: normal;
29
29
  }
30
30
 
31
31
  @define-mixin h5 {
32
32
  font-size: 1.4rem;
33
33
  line-height: 1.3;
34
- margin-bottom: 1.25rem;
34
+ margin: 4rem 0 1.25rem;
35
35
  font-weight: bolder;
36
36
  }
37
37
 
38
38
  @define-mixin h6 {
39
39
  font-size: 1.3rem;
40
40
  line-height: 1.3;
41
- margin-bottom: 1.25rem;
41
+ margin: 4rem 0 1.25rem;
42
42
  font-weight: bold;
43
43
  }
44
44
 
45
- @define-mixin paragraph {
45
+ @define-mixin paragraph {
46
46
  font-size: 1rem;
47
47
  line-height: 1.6;
48
48
  font-weight: normal;
@@ -42,7 +42,7 @@ p {
42
42
  }
43
43
 
44
44
  /*noinspection ALL*/
45
- @for $i from 1 to 6 {
45
+ @for $i from 1 to 6 {
46
46
  h$(i) { @mixin h$(i) {
47
47
  }
48
48
  }