mypgs 1.5.0 → 1.6.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 (48) hide show
  1. package/AGENTS.md +6 -3
  2. package/README.md +22 -373
  3. package/assets/javascript/_imports.js +4 -0
  4. package/assets/javascript/_pgs.js +58 -0
  5. package/assets/javascript/base/_darkmode.js +27 -105
  6. package/assets/javascript/base/_svg.js +103 -0
  7. package/assets/javascript/components/_menu.js +1 -3
  8. package/assets/javascript/components/_search.js +391 -0
  9. package/assets/javascript/index.js +2 -0
  10. package/assets/javascript/layout/_header.js +26 -7
  11. package/assets/scss/base/_color.scss +8 -15
  12. package/assets/scss/base/_general.scss +36 -48
  13. package/assets/scss/base/_heading.scss +14 -16
  14. package/assets/scss/base/_variables.scss +4 -2
  15. package/assets/scss/components/_card.scss +10 -0
  16. package/assets/scss/components/_dropdown.scss +2 -1
  17. package/assets/scss/components/_logo.scss +2 -2
  18. package/assets/scss/components/_menu.scss +20 -27
  19. package/assets/scss/components/_modals.scss +11 -1
  20. package/assets/scss/components/_search.scss +134 -0
  21. package/assets/scss/index.scss +8 -4
  22. package/assets/scss/layout/_header.scss +1 -1
  23. package/assets/scss/layout/_pageShell.scss +1 -0
  24. package/dist/css/index.css +658 -620
  25. package/dist/css/index.css.map +1 -1
  26. package/dist/css/index.min.css +1 -1
  27. package/dist/index.d.ts +78 -0
  28. package/dist/javascript/index.js +904 -370
  29. package/dist/javascript/index.js.map +1 -1
  30. package/dist/javascript/index.min.js +1 -1
  31. package/docs/componenti-e-markup.md +90 -0
  32. package/docs/convenzioni.md +12 -0
  33. package/docs/export-e-sviluppo.md +109 -0
  34. package/docs/helper-javascript.md +127 -0
  35. package/docs/utilizzo-css-scss.md +36 -0
  36. package/package.json +1 -6
  37. package/plugins/vite-plugin-pgs.d.ts +10 -0
  38. package/templates/html/components/logo.html +1 -1
  39. package/templates/html/components/menu.html +13 -1
  40. package/templates/html/components/{searchbar.html → search.html} +7 -5
  41. package/templates/html/demo.js +1 -8
  42. package/templates/html/layout/header.html +11 -5
  43. package/templates/react/components/logo.jsx +1 -1
  44. package/templates/react/components/{searchbar.jsx → search.jsx} +9 -7
  45. package/templates/react/patterns/header.jsx +16 -10
  46. package/assets/scss/components/_searchbar.scss +0 -70
  47. package/react.d.ts +0 -11
  48. package/react.js +0 -1
@@ -16,6 +16,12 @@
16
16
  <li><a href="/servizi/due">Servizio due</a></li>
17
17
  </ul>
18
18
  </li>
19
+ <li>
20
+ <a href="/about">
21
+ <i class="fa-solid fa-info-circle" aria-hidden="true"></i>
22
+ <span>about</span>
23
+ </a>
24
+ </li>
19
25
  </ul>
20
26
  </nav>
21
27
 
@@ -37,5 +43,11 @@
37
43
  <li><a href="/servizi/due">Servizio due</a></li>
38
44
  </ul>
39
45
  </li>
46
+ <li>
47
+ <a href="/about">
48
+ <i class="fa-solid fa-info-circle" aria-hidden="true"></i>
49
+ <span>about</span>
50
+ </a>
51
+ </li>
40
52
  </ul>
41
- </nav>
53
+ </nav>
@@ -1,23 +1,25 @@
1
- <form pgs="buttonNohover searchbar" autocomplete="off" action="" method="get">
1
+ <form pgs="buttonNohover search" autocomplete="off" action="" method="get">
2
2
  <button type="submit" title="Cerca"><i class="fa-solid fa-search"></i></button>
3
3
  <input type="search" name="s" placeholder="Cerca" value="">
4
+ <ul pgs="search-suggestions"></ul>
4
5
  </form>
5
6
 
6
- <div pgs="modal searchbar-modal" pgs-option="containerPGS[header]">
7
+ <div pgs="modal search-modal" pgs-option="containerPGS[header]">
7
8
 
8
9
  <button type="button" pgs="modal-button buttonIcon" title="Cerca">
9
10
  <i class="fa-solid fa-search"></i>
10
11
  </button>
11
12
 
12
13
  <dialog>
13
- <div pgs="flexRow section searchbar-mobile">
14
+ <div pgs="flexRow section search-mobile">
14
15
 
15
- <form pgs="buttonNohover searchbar" autocomplete="off" action="/" method="get">
16
+ <form pgs="buttonNohover search" autocomplete="off" action="/" method="get">
16
17
  <button type="submit" title="Cerca">
17
18
  <i class="fa-solid fa-search"></i>
18
19
  </button>
19
20
 
20
21
  <input type="search" name="s" placeholder="Cerca" value="">
22
+ <ul pgs="search-suggestions"></ul>
21
23
  </form>
22
24
 
23
25
  <button type="button" pgs="modal-close buttonIcon">
@@ -26,4 +28,4 @@
26
28
 
27
29
  </div>
28
30
  </dialog>
29
- </div>
31
+ </div>
@@ -1,11 +1,4 @@
1
1
 
2
- if (localStorage.getItem("screenIsDarkMode") === "true") {
3
- document.body.classList.add("darkmode");
4
- document.querySelector(":root").setAttribute("data-darkmode", "true");
5
- document.body.setAttribute("data-darkmode", "true");
6
- }
7
-
8
-
9
2
  const templateFiles = [
10
3
  "components/summary.html",
11
4
  "components/menu.html",
@@ -21,7 +14,7 @@ const templateFiles = [
21
14
  "components/tooltip.html",
22
15
  "components/form.html",
23
16
  "components/logo.html",
24
- "components/searchbar.html",
17
+ "components/search.html",
25
18
  "components/slides.html",
26
19
  "components/steps.html",
27
20
  "components/table.html",
@@ -46,15 +46,21 @@
46
46
  <!-- //# HEADER BOTTOM -->
47
47
 
48
48
  <script>
49
+ const addPgsState = (element, state) => {
50
+ if (!element) return;
51
+
52
+ const states = element.getAttribute("pgs-state")?.split(/\s+/) ?? [];
53
+ element.setAttribute("pgs-state", [...new Set([...states, state])].join(" "));
54
+ };
55
+
49
56
  if (localStorage.getItem("screenIsDarkMode") === "true") {
50
- document.body.classList.add("darkmode");
51
- document.querySelector(":root").setAttribute("data-darkmode", "true");
52
- document.body.setAttribute("data-darkmode", "true");
57
+ addPgsState(document.documentElement, "darkmode");
58
+ addPgsState(document.body, "darkmode");
53
59
  }
54
60
 
55
61
  if (window.innerWidth < 600) {
56
- pgs(document.querySelector("header")).state.add("mobileActive");
57
- pgs(document.querySelector("[pgs~=header-element]")).state.add("mobileActive");
62
+ addPgsState(document.querySelector("header"), "mobileActive");
63
+ addPgsState(document.querySelector("[pgs~=header-element]"), "mobileActive");
58
64
  }
59
65
  </script>
60
66
  </header>
@@ -1,6 +1,6 @@
1
1
  export default function Logo() {
2
2
  return (
3
- <a aria-label="Logo" pgs="logo logo-darkmode" href="/">
3
+ <a aria-label="Logo" pgs="logo" pgs-option="logoDarkmode" href="/">
4
4
  <img pgs="logo-image" src="https://placehold.co/240x80?text=MyPGS" alt="MyPGS" />
5
5
  </a>
6
6
  );
@@ -1,27 +1,29 @@
1
- export default function Searchbar() {
1
+ export default function Search() {
2
2
  return (
3
- <form pgs="buttonNohover searchbar" autoComplete="off" action="" method="get">
3
+ <form pgs="buttonNohover search" autoComplete="off" action="" method="get">
4
4
  <button type="submit" title="Cerca"><i className="fa-solid fa-search"></i></button>
5
5
  <input type="search" name="s" placeholder="Cerca" defaultValue="" />
6
+ <ul pgs="search-suggestions"></ul>
6
7
  </form>
7
8
  );
8
9
  }
9
- export default function SearchbarModal() {
10
- return (
11
10
 
12
- <div pgs="modal searchbar-modal" pgs-option="containerPGS[header]">
11
+ export function SearchModal() {
12
+ return (
13
+ <div pgs="modal search-modal" pgs-option="containerPGS[header]">
13
14
  <button type="button" pgs="modal-button buttonIcon" title="Cerca">
14
15
  <i className="fa-solid fa-search"></i>
15
16
  </button>
16
17
 
17
18
  <dialog>
18
- <div pgs="flexRow section searchbar-mobile">
19
- <form pgs="buttonNohover searchbar" autoComplete="off" action="/" method="get">
19
+ <div pgs="flexRow section search-mobile">
20
+ <form pgs="buttonNohover search" autoComplete="off" action="/" method="get">
20
21
  <button type="submit" title="Cerca">
21
22
  <i className="fa-solid fa-search"></i>
22
23
  </button>
23
24
 
24
25
  <input type="search" name="s" placeholder="Cerca" defaultValue="" />
26
+ <ul pgs="search-suggestions"></ul>
25
27
  </form>
26
28
 
27
29
  <button type="button" pgs="modal-close buttonIcon">
@@ -2,16 +2,22 @@ import { useEffect } from "react";
2
2
 
3
3
  export default function Header() {
4
4
  useEffect(() => {
5
- if (localStorage.getItem("screenIsDarkMode") === "true") {
6
- document.body.classList.add("darkmode");
7
- document.querySelector(":root")?.setAttribute("data-darkmode", "true");
8
- document.body.setAttribute("data-darkmode", "true");
9
- }
10
-
11
- if (window.innerWidth < 600 && window.pgs) {
12
- window.pgs(document.querySelector("header")).state.add("mobileActive");
13
- window.pgs(document.querySelector("[pgs~=header-element]")).state.add("mobileActive");
14
- }
5
+ const addPgsState = (element, state) => {
6
+ if (!element) return;
7
+
8
+ const states = element.getAttribute("pgs-state")?.split(/\s+/) ?? [];
9
+ element.setAttribute("pgs-state", [...new Set([...states, state])].join(" "));
10
+ };
11
+
12
+ if (localStorage.getItem("screenIsDarkMode") === "true") {
13
+ addPgsState(document.documentElement, "darkmode");
14
+ addPgsState(document.body, "darkmode");
15
+ }
16
+
17
+ if (window.innerWidth < 600) {
18
+ addPgsState(document.querySelector("header"), "mobileActive");
19
+ addPgsState(document.querySelector("[pgs~=header-element]"), "mobileActive");
20
+ }
15
21
  }, []);
16
22
 
17
23
  return (
@@ -1,70 +0,0 @@
1
- @use "../mixin/mixin" as *;
2
-
3
- //= SEARCH BAR
4
- [pgs~="searchbar"] {
5
- position: relative;
6
- flex: 1;
7
- width: 100%;
8
- overflow: hidden;
9
- margin-inline: auto;
10
- @include button_header();
11
- padding: 0;
12
- gap: 0;
13
-
14
- //+ mobile
15
- @media (min-width: $mobile) {
16
- min-width: 21.4rem;
17
- }
18
-
19
- button {
20
- outline: none;
21
- border: none;
22
- background: none;
23
- padding-left: var(--button-size);
24
- aspect-ratio: 1;
25
- height: 100%;
26
- border-radius: var(--border-radius-input);
27
- cursor: pointer;
28
- }
29
-
30
- input {
31
- cursor: text !important;
32
- border: 0;
33
- padding: var(--button-size);
34
- margin: 2px;
35
- margin-left: 0;
36
- font-family: var(--font);
37
- font-weight: 600;
38
- font-size: 1.6rem;
39
- border-radius: var(--border-radius-input);
40
- height: 100%;
41
- width: 100%;
42
- min-width: 21.4rem;
43
- background-color: transparent;
44
- color: contrast-color(color-mix(in srgb, var(--button-background) 77%, black));
45
-
46
- &::placeholder {
47
- color: contrast-color(color-mix(in srgb, var(--button-background) 77%, black));
48
- opacity: .6;
49
- }
50
-
51
- &:focus-visible {
52
- outline: unset;
53
- }
54
- }
55
-
56
- &:has(input:focus-visible){
57
- outline: var(--focus-visible);
58
- }
59
-
60
- @at-root dialog #{&} {
61
- margin-inline: auto;
62
- max-width: calc(100% - var(--padding-page) * 2);
63
- height: max-content;
64
- background-color: var(--color-white);
65
-
66
- input {
67
- padding-block: 20px;
68
- }
69
- }
70
- }
package/react.d.ts DELETED
@@ -1,11 +0,0 @@
1
- import "react";
2
-
3
- declare module "react" {
4
- interface HTMLAttributes<T> {
5
- /** Use pgsHtml in JSX/TSX. The Vite plugin converts it to pgs. */
6
- pgs?: never;
7
- pgsHtml?: string;
8
- }
9
- }
10
-
11
- export {};
package/react.js DELETED
@@ -1 +0,0 @@
1
- export {};