@schukai/monster 3.64.1 → 3.65.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 (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
  }