mypgs 1.3.7 → 1.4.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.
@@ -8,6 +8,7 @@ import { PGS_notification } from "./components/_notifications.js";
8
8
  import { PGS_slides } from "./components/_slides.js";
9
9
  import { PGS_stepTabs } from "./components/_stepTabs.js";
10
10
  import { PGS_steps } from "./components/_steps.js";
11
+ import { PGS_summary } from "./components/_summary.js";
11
12
  import { PGS_formValidate } from "./functions/_formValidate.js";
12
13
  import { PGS_scrollHorizontal } from "./functions/_scrollY.js";
13
14
 
@@ -20,7 +21,7 @@ pgs.registerModules({
20
21
  slides: PGS_slides,
21
22
  stepTabs: PGS_stepTabs,
22
23
  steps: PGS_steps,
24
+ summary: PGS_summary,
23
25
  formValidate: PGS_formValidate,
24
26
  scrollHorizontal: PGS_scrollHorizontal,
25
27
  });
26
-
@@ -0,0 +1,105 @@
1
+ //= SUMMARY
2
+ const API = new WeakMap();
3
+ let summaryId = 0;
4
+
5
+ function nextSummaryId() {
6
+ summaryId += 1;
7
+ return summaryId;
8
+ }
9
+
10
+ function getLineHeight(element) {
11
+ const style = window.getComputedStyle(element);
12
+ const lineHeight = parseFloat(style.lineHeight);
13
+ if (Number.isFinite(lineHeight)) return lineHeight;
14
+
15
+ const fontSize = parseFloat(style.fontSize);
16
+ return Number.isFinite(fontSize) ? fontSize * 1.2 : 0;
17
+ }
18
+
19
+ function directPgsChild(element, token) {
20
+ return Array.from(element.children).find(child => pgs(child).contains(token));
21
+ }
22
+
23
+ export function PGS_summary_init(root = document) {
24
+ pgs(root).querySelectorAll("summary").forEach((summary) => {
25
+ if (API.has(summary)) return;
26
+
27
+ const content = directPgsChild(summary, "summary-content");
28
+ const button = directPgsChild(summary, "summary-button");
29
+ if (!content || !button) return;
30
+
31
+ const id = nextSummaryId();
32
+ const contentId = content.id || `summary-content-${id}`;
33
+ content.id = contentId;
34
+
35
+ button.type ||= "button";
36
+ button.setAttribute("aria-controls", content.id);
37
+
38
+ function isOpen() {
39
+ return pgs(summary).state.contains("open");
40
+ }
41
+
42
+ function getCollapsedHeight() {
43
+ return getLineHeight(content) * 3;
44
+ }
45
+
46
+ function isOverflowing() {
47
+ return content.scrollHeight > Math.ceil(getCollapsedHeight()) + 1;
48
+ }
49
+
50
+ function setExpanded(expanded) {
51
+ const overflow = isOverflowing();
52
+
53
+ pgs(summary).state.toggle("overflow", overflow);
54
+ pgs(summary).state.toggle("open", expanded && overflow);
55
+
56
+ button.hidden = !overflow;
57
+ button.setAttribute("aria-hidden", String(!overflow));
58
+ button.setAttribute("aria-expanded", String(expanded && overflow));
59
+ button.textContent = expanded && overflow ? "Mostra meno" : "Mostra di più";
60
+
61
+ const nextHeight = expanded && overflow ? content.scrollHeight : getCollapsedHeight();
62
+ content.style.setProperty("--summary-content-max-height", `${nextHeight}px`);
63
+ }
64
+
65
+ function refresh() {
66
+ const wasOpen = isOpen();
67
+ content.style.setProperty("--summary-content-max-height", "none");
68
+ setExpanded(wasOpen);
69
+ }
70
+
71
+ function toggle() {
72
+ setExpanded(!isOpen());
73
+ }
74
+
75
+ button.addEventListener("click", toggle);
76
+ window.addEventListener("resize", refresh, { passive: true });
77
+
78
+ refresh();
79
+ requestAnimationFrame(refresh);
80
+
81
+ API.set(summary, {
82
+ element: summary,
83
+ content,
84
+ button,
85
+ open: () => setExpanded(true),
86
+ close: () => setExpanded(false),
87
+ toggle,
88
+ refresh,
89
+ isOpen,
90
+ });
91
+ });
92
+ }
93
+
94
+ //# INIT
95
+ PGS_summary_init();
96
+
97
+ //# API
98
+ export function PGS_summary_api(selector) {
99
+ return API.get(selector);
100
+ }
101
+
102
+ export const PGS_summary = {
103
+ init: PGS_summary_init,
104
+ api: PGS_summary_api
105
+ };
@@ -14,6 +14,7 @@ import "./components/_modals.js";
14
14
  import "./components/_slides.js"
15
15
  import "./components/_steps.js";
16
16
  import "./components/_stepTabs.js";
17
+ import "./components/_summary.js";
17
18
  import "./components/_notifications.js";
18
19
 
19
20
  //= IMPORT REGISTRY
@@ -21,4 +22,4 @@ import "./_imports.js";
21
22
 
22
23
  //= PATTERNS
23
24
  import "./patterns/_header.js";
24
- import "./patterns/_cookieConsent.js";
25
+ import "./patterns/_cookieConsent.js";
@@ -3,11 +3,11 @@ const header = pgs(document).querySelector("header");
3
3
 
4
4
  //= HEADER
5
5
  function PGS_header(selectHeader = document) {
6
-
6
+
7
7
  if (!header) return;
8
8
 
9
9
  const headerElements = pgs(header).querySelectorAll("header-element");
10
-
10
+
11
11
  if (!headerElements.length) return;
12
12
 
13
13
  headerElements.forEach(selectHeader => {
@@ -87,12 +87,11 @@ function headerHeight() {
87
87
  if (!header) return;
88
88
  const wordPressBar = window.getComputedStyle(document.documentElement).marginTop ?? 0;
89
89
  const headerHeight = header.offsetHeight
90
-
91
- const body = document.querySelector("body");
92
90
  const height = headerHeight + parseInt(wordPressBar);
93
91
  const scrollHeight = document.querySelector("header").getAttribute("data-header-scroll") === "true" ? 0 : height;
94
- body.style.setProperty('--heightOfHeader', `${height}px`);
95
- body.style.setProperty('--heightOfHeaderScroll', `${scrollHeight}px`);
92
+
93
+ document.documentElement.style.setProperty("--heightOfHeader", `${height}px`);
94
+ document.documentElement.style.setProperty("--heightOfHeaderScroll", `${scrollHeight}px`);
96
95
  }
97
96
  headerHeight()
98
97
  window.addEventListener("resize", headerHeight);
@@ -54,6 +54,7 @@ declare global {
54
54
  slides?: any;
55
55
  stepTabs?: any;
56
56
  steps?: any;
57
+ summary?: any;
57
58
  formValidate?: any;
58
59
  scrollHorizontal?: any;
59
60
  [moduleName: string]: any;
@@ -19,7 +19,7 @@
19
19
  --text-shadow: 0px 0px 50px #000000;
20
20
  --backdrop: #0000003e;
21
21
  --blur: blur(20px);
22
- --page-top: 20svh;
22
+ --page-top: calc(var(--heightOfHeaderScroll) + (var(--gap-elements)*2));
23
23
  --page-width: 1280px;
24
24
  --page-space: clamp(var(--padding-page), calc((100% - var(--section-width)) / 2 + var(--padding-page)), 100%);
25
25
  --gap-texts: 1.0rem;
@@ -0,0 +1,93 @@
1
+ @use "../mixin/mixin" as *;
2
+
3
+ @mixin _badge() {
4
+ --badge-background: var(--color-box);
5
+ --badge-color: var(--color-black);
6
+ --badge-size: 1.25rem;
7
+ --badge-icon-size: 1.4rem;
8
+ display: inline-flex;
9
+ align-items: center;
10
+ justify-content: center;
11
+ gap: calc(var(--badge-size) / 2);
12
+ width: max-content;
13
+ max-width: 100%;
14
+ min-height: calc(var(--badge-size) * 2.2);
15
+ padding: calc(var(--badge-size) / 2) var(--badge-size);
16
+ border-radius: var(--border-radius-input);
17
+ background: var(--badge-background);
18
+ color: var(--badge-color);
19
+ font-size: var(--badge-size);
20
+ font-weight: 700;
21
+ line-height: 1;
22
+ text-decoration: none;
23
+ white-space: nowrap;
24
+ overflow-wrap: normal;
25
+
26
+ i {
27
+ color: var(--badge-color);
28
+ font-size: var(--badge-icon-size);
29
+ --fa-size: var(--badge-icon-size);
30
+ --fa-primary-color: var(--badge-color);
31
+ --fa-secondary-color: var(--badge-color);
32
+ --fa-secondary-opacity: 0.5;
33
+ }
34
+ }
35
+
36
+ [pgs~="badge"],
37
+ [pgs~="badgePrimary"],
38
+ [pgs~="badgeStrong"],
39
+ [pgs~="badgeSuccess"],
40
+ [pgs~="badgeWarning"],
41
+ [pgs~="badgeError"],
42
+ [pgs~="badgeInfo"],
43
+ [pgs~="badgeNeutral"],
44
+ [pgs~="badgeDot"] {
45
+ @include _badge();
46
+ }
47
+
48
+ [pgs~="badgePrimary"] {
49
+ --badge-background: var(--color-primary-soft);
50
+ --badge-color: var(--color-primary-strong);
51
+ }
52
+
53
+ [pgs~="badgeStrong"] {
54
+ --badge-background: var(--color-primary);
55
+ --badge-color: var(--color-whiteFixed);
56
+ }
57
+
58
+ [pgs~="badgeSuccess"] {
59
+ --badge-background: var(--color-success-background);
60
+ --badge-color: var(--color-success);
61
+ }
62
+
63
+ [pgs~="badgeWarning"] {
64
+ --badge-background: var(--color-warning-background);
65
+ --badge-color: var(--color-warning);
66
+ }
67
+
68
+ [pgs~="badgeError"] {
69
+ --badge-background: var(--color-error-background);
70
+ --badge-color: var(--color-error);
71
+ }
72
+
73
+ [pgs~="badgeInfo"] {
74
+ --badge-background: var(--color-linkBackgorud);
75
+ --badge-color: var(--color-link);
76
+ }
77
+
78
+ [pgs~="badgeNeutral"] {
79
+ --badge-background: var(--color-box-transparent);
80
+ --badge-color: var(--color-text);
81
+ }
82
+
83
+ [pgs~="badgeDot"] {
84
+ &::before {
85
+ content: "";
86
+ display: block;
87
+ inline-size: 0.65em;
88
+ block-size: 0.65em;
89
+ flex: 0 0 auto;
90
+ border-radius: 50%;
91
+ background: currentColor;
92
+ }
93
+ }
@@ -0,0 +1,56 @@
1
+ @use "../mixin/mixin" as *;
2
+
3
+ [pgs~="summary"] {
4
+ --summary-fade-size: 4rem;
5
+ --summary-fade-background: var(--color-background);
6
+ --summary-content-max-height: 5.7rem;
7
+ position: relative;
8
+ display: flex;
9
+ flex-direction: column;
10
+ gap: var(--gap-texts);
11
+ isolation: isolate;
12
+
13
+ [pgs~="summary-content"] {
14
+ max-height: var(--summary-content-max-height, none);
15
+ overflow: hidden;
16
+ transition: max-height 300ms ease;
17
+ }
18
+
19
+ &[pgs-state~="overflow"]:not([pgs-state~="open"]) {
20
+ [pgs~="summary-content"] {
21
+ position: relative;
22
+
23
+ &::after {
24
+ content: "";
25
+ position: absolute;
26
+ inset: auto 0 0;
27
+ height: var(--summary-fade-size);
28
+ pointer-events: none;
29
+ background: linear-gradient(to bottom, transparent, var(--summary-fade-background));
30
+ }
31
+ }
32
+ }
33
+
34
+ &:has([pgs~="summary-button"][hidden]) {
35
+ [pgs~="summary-content"]{
36
+ max-height: unset;
37
+ }
38
+ }
39
+
40
+ [pgs~="summary-button"] {
41
+ padding: 5px;
42
+ cursor: pointer;
43
+ background-color: transparent;
44
+ border: unset;
45
+ margin-top: calc(var(--gap-texts) * -1);
46
+ z-index: 1;
47
+ color: var(--color-primary-strong);
48
+ font-family: var(--font);
49
+ font-weight: 600;
50
+ font-size: 1.6rem;
51
+
52
+ &[hidden] {
53
+ display: none !important;
54
+ }
55
+ }
56
+ }
@@ -42,6 +42,8 @@
42
42
  @include meta.load-css("components/steps");
43
43
  @include meta.load-css("components/table");
44
44
  @include meta.load-css("components/stepTabs");
45
+ @include meta.load-css("components/summary");
46
+ @include meta.load-css("components/badges");
45
47
  @include meta.load-css("components/notification");
46
48
  @include meta.load-css("components/tooltip");
47
49
  @include meta.load-css("components/searchbar");
@@ -1,5 +1,4 @@
1
1
  @use "../mixin/mixin" as *;
2
-
3
2
  //# pageShell
4
3
  $aside-size: 400px;
5
4
  $content-size: 500px;
@@ -9,16 +8,18 @@ $pageShell-test-gap: 4rem;
9
8
  position: relative;
10
9
  top: auto;
11
10
  max-height: none;
12
- overflow: visible;
13
- scrollbar-gutter: auto;
14
11
  width: 100%;
15
12
  min-width: 100%;
13
+
14
+ [pgs~="pageShell-aside"] {
15
+ scrollbar-gutter: auto;
16
+ overflow: visible;
17
+ }
16
18
  }
17
19
 
18
20
  [pgs~="pageShell"] {
19
21
  --pageShell-aside-sticky-top: 0;
20
- --pageShell-asideLeft-width: #{$aside-size};
21
- --pageShell-asideRight-width: #{$aside-size};
22
+ --pageShell-aside-width: #{$aside-size};
22
23
  --pageShell-content-width: 500px;
23
24
  --pageShell-gap: var(--gap-elements);
24
25
  display: flex;
@@ -29,7 +30,6 @@ $pageShell-test-gap: 4rem;
29
30
  justify-content: center;
30
31
  width: 100%;
31
32
  max-width: calc(var(--page-width) + (var(--padding-page) * 2));
32
- padding-bottom: var(--page-top);
33
33
  padding-inline: var(--padding-page);
34
34
  container-type: inline-size;
35
35
 
@@ -40,10 +40,10 @@ $pageShell-test-gap: 4rem;
40
40
  width: min(100%, var(--page-width));
41
41
  max-width: var(--page-width);
42
42
  padding-top: var(--page-top);
43
+ padding-bottom: var(--gap-elements);
43
44
  }
44
45
 
45
- [pgs~="pageShell-asideLeft"],
46
- [pgs~="pageShell-asideRight"] {
46
+ [pgs~="pageShell-aside"] {
47
47
  @include flexColumn;
48
48
  align-items: flex-start;
49
49
  isolation: isolate;
@@ -56,6 +56,10 @@ $pageShell-test-gap: 4rem;
56
56
  scrollbar-gutter: stable;
57
57
  scrollbar-width: none;
58
58
  padding-top: var(--page-top);
59
+ padding-bottom: var(--gap-elements);
60
+ flex: 1 1 var(--pageShell-aside-width);
61
+ min-width: min(100%, var(--pageShell-aside-width));
62
+ max-width: var(--pageShell-aside-width);
59
63
 
60
64
  &::-webkit-scrollbar {
61
65
  display: none;
@@ -65,38 +69,63 @@ $pageShell-test-gap: 4rem;
65
69
  width: 100%;
66
70
  }
67
71
 
68
- &:is([pgs~="pageShell-asideLeft"]) {
72
+ &:has(+ [pgs~="pageShell-content"]) {
69
73
  grid-area: asideLeft;
70
- flex: 1 1 var(--pageShell-asideLeft-width);
71
- min-width: min(100%, var(--pageShell-asideLeft-width));
72
- max-width: var(--pageShell-asideLeft-width);
73
74
  }
74
75
 
75
- &:is([pgs~="pageShell-asideRight"]) {
76
- grid-area: asideRight;
77
- flex: 1 1 var(--pageShell-asideRight-width);
78
- min-width: min(100%, var(--pageShell-asideRight-width));
79
- max-width: var(--pageShell-asideRight-width);
76
+ [pgs~="pageShell-aside-scroll"] {
77
+ @include flexColumn;
78
+ align-items: flex-start;
79
+ width: 100%;
80
+ overflow-y: auto;
81
+ overscroll-behavior: contain;
82
+ scrollbar-gutter: stable;
83
+ scrollbar-width: none;
84
+ padding-top: var(--page-top);
85
+ padding-bottom: calc(var(--gap-elements)*2);
86
+
87
+ &::-webkit-scrollbar {
88
+ display: none;
89
+ }
90
+
91
+ >* {
92
+ width: 100%;
93
+ }
94
+ }
95
+
96
+ &:has([pgs~="pageShell-aside-scroll"]) {
97
+ padding-top: 0;
98
+ padding-bottom: 0;
99
+
100
+ &::after {
101
+ content: "";
102
+ position: absolute;
103
+ inset-inline: 0;
104
+ bottom: 0;
105
+ height: calc(var(--gap-elements)*2);
106
+ background: linear-gradient(0deg, var(--color-background) 25%, transparent);
107
+ pointer-events: none;
108
+ z-index: 1;
109
+ }
80
110
  }
81
111
  }
82
112
 
83
- &:has(> [pgs~="pageShell-asideLeft"]) {
84
- max-width: calc(var(--page-width) + var(--pageShell-asideLeft-width) + var(--pageShell-gap) + (var(--padding-page) * 2));
113
+ [pgs~="pageShell-content"]+[pgs~="pageShell-aside"] {
114
+ grid-area: asideRight;
85
115
  }
86
116
 
87
- &:has(> [pgs~="pageShell-asideRight"]) {
88
- max-width: calc(var(--page-width) + var(--pageShell-asideRight-width) + var(--pageShell-gap) + (var(--padding-page) * 2));
117
+ &:has(> [pgs~="pageShell-aside"]) {
118
+ max-width: calc(var(--page-width) + var(--pageShell-aside-width) + var(--pageShell-gap) + (var(--padding-page) * 2));
89
119
  }
90
120
 
91
- &:has(> [pgs~="pageShell-asideLeft"]):has(> [pgs~="pageShell-asideRight"]) {
92
- max-width: calc(var(--page-width) + var(--pageShell-asideLeft-width) + var(--pageShell-asideRight-width) + (var(--pageShell-gap) * 2) + (var(--padding-page) * 2));
121
+ &:has(> [pgs~="pageShell-aside"] ~ [pgs~="pageShell-aside"]) {
122
+ max-width: calc(var(--page-width) + (var(--pageShell-aside-width) * 2) + (var(--pageShell-gap) * 2) + (var(--padding-page) * 2));
93
123
  }
94
124
 
95
125
  //== RESPONSIVE ==//
96
-
97
- &:has(> [pgs~="pageShell-asideLeft"]) {
126
+ &:has(> [pgs~="pageShell-aside"]) {
98
127
  @container (max-width: calc(#{$aside-size} + #{$content-size} + #{$pageShell-test-gap})) {
99
- [pgs~="pageShell-asideLeft"] {
128
+ [pgs~="pageShell-aside"] {
100
129
  @include pageShell-aside-flow;
101
130
  }
102
131
 
@@ -107,9 +136,9 @@ $pageShell-test-gap: 4rem;
107
136
  }
108
137
  }
109
138
 
110
- &:has(> [pgs~="pageShell-asideRight"]) {
139
+ &:has(> [pgs~="pageShell-content"] + [pgs~="pageShell-aside"]) {
111
140
  @container (max-width: calc(#{$content-size} + #{$aside-size} + #{$pageShell-test-gap})) {
112
- [pgs~="pageShell-asideRight"] {
141
+ [pgs~="pageShell-content"]+[pgs~="pageShell-aside"] {
113
142
  @include pageShell-aside-flow;
114
143
  padding-top: 0;
115
144
  min-width: 100%;
@@ -117,32 +146,31 @@ $pageShell-test-gap: 4rem;
117
146
  }
118
147
  }
119
148
 
120
- &:has(> [pgs~="pageShell-asideLeft"]):has(> [pgs~="pageShell-asideRight"]) {
149
+ &:has(> [pgs~="pageShell-aside"]):has(> [pgs~="pageShell-content"] + [pgs~="pageShell-aside"]) {
121
150
  @container (max-width: calc(#{$aside-size} + #{$content-size} + #{$aside-size} + (#{$pageShell-test-gap} * 2))) {
122
151
  display: grid;
123
- grid-template-columns: var(--pageShell-asideLeft-width) minmax(0, var(--page-width));
152
+ grid-template-columns: var(--pageShell-aside-width) minmax(0, var(--page-width));
124
153
  grid-template-areas:
125
154
  "asideLeft content"
126
155
  "asideLeft asideRight";
127
156
  justify-content: center;
128
157
 
129
- [pgs~="pageShell-asideRight"] {
158
+ [pgs~="pageShell-content"]+[pgs~="pageShell-aside"] {
130
159
  @include pageShell-aside-flow;
131
160
  padding-top: 0;
132
- min-width: min(100%, var(--pageShell-asideRight-width));
161
+ min-width: min(100%, var(--pageShell-aside-width));
133
162
  }
134
163
  }
135
164
 
136
165
  @container (max-width: calc(#{$aside-size} + #{$content-size} + #{$pageShell-test-gap})) {
137
166
  display: flex;
138
167
 
139
- [pgs~="pageShell-asideLeft"],
140
- [pgs~="pageShell-asideRight"] {
168
+ [pgs~="pageShell-aside"] {
141
169
  @include pageShell-aside-flow;
142
170
  }
143
171
 
144
172
  [pgs~="pageShell-content"],
145
- [pgs~="pageShell-asideRight"] {
173
+ [pgs~="pageShell-content"]+[pgs~="pageShell-aside"] {
146
174
  padding-top: 0;
147
175
  min-width: 100%;
148
176
  }
@@ -153,15 +181,13 @@ $pageShell-test-gap: 4rem;
153
181
  padding-top: var(--page-top);
154
182
 
155
183
  [pgs~="pageShell-content"],
156
- [pgs~="pageShell-asideLeft"],
157
- [pgs~="pageShell-asideRight"] {
184
+ [pgs~="pageShell-aside"] {
158
185
  padding-top: 0;
159
186
  min-width: 100% !important;
160
187
  }
161
188
 
162
- [pgs~="pageShell-asideLeft"],
163
- [pgs~="pageShell-asideRight"] {
189
+ [pgs~="pageShell-aside"] {
164
190
  @include pageShell-aside-flow;
165
191
  }
166
192
  }
167
- }
193
+ }
@@ -110,8 +110,12 @@
110
110
 
111
111
  [pgs~="modal-dialog-content"] {
112
112
  nav {
113
- padding: var(--padding-2);
114
- border-radius: var(--padding-2);
113
+
114
+ // padding: var(--padding-2);
115
+ // border-radius: var(--padding-2);
116
+ a {
117
+ --button-background: var(--modal-background);
118
+ }
115
119
  }
116
120
  }
117
121