@govtechsg/sgds-web-component 1.1.0 → 1.2.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 (123) hide show
  1. package/Masthead/index.js +1 -1
  2. package/base/sgds-element.cjs2.js +1 -1
  3. package/base/sgds-element2.js +1 -1
  4. package/components/Accordion/index.umd.js +3 -3
  5. package/components/Accordion/index.umd.js.map +1 -1
  6. package/components/Accordion/sgds-accordion.cjs.js +2 -2
  7. package/components/Accordion/sgds-accordion.cjs.js.map +1 -1
  8. package/components/Accordion/sgds-accordion.js +2 -2
  9. package/components/Accordion/sgds-accordion.js.map +1 -1
  10. package/components/ActionCard/index.umd.js +1 -1
  11. package/components/Alert/index.umd.js +1 -1
  12. package/components/Badge/index.umd.js +1 -1
  13. package/components/Breadcrumb/index.umd.js +1 -1
  14. package/components/Button/index.umd.js +1 -1
  15. package/components/Card/index.umd.js +1 -1
  16. package/components/Checkbox/index.umd.js +1 -1
  17. package/components/ComboBox/index.umd.js +10 -5
  18. package/components/ComboBox/index.umd.js.map +1 -1
  19. package/components/Datepicker/datepicker-calendar.cjs.js +43 -23
  20. package/components/Datepicker/datepicker-calendar.cjs.js.map +1 -1
  21. package/components/Datepicker/datepicker-calendar.cjs2.js +1 -1
  22. package/components/Datepicker/datepicker-calendar.d.ts +0 -1
  23. package/components/Datepicker/datepicker-calendar.js +43 -23
  24. package/components/Datepicker/datepicker-calendar.js.map +1 -1
  25. package/components/Datepicker/datepicker-calendar2.js +1 -1
  26. package/components/Datepicker/datepicker-header.cjs.js +44 -9
  27. package/components/Datepicker/datepicker-header.cjs.js.map +1 -1
  28. package/components/Datepicker/datepicker-header.cjs2.js +1 -1
  29. package/components/Datepicker/datepicker-header.d.ts +5 -1
  30. package/components/Datepicker/datepicker-header.js +44 -9
  31. package/components/Datepicker/datepicker-header.js.map +1 -1
  32. package/components/Datepicker/datepicker-header2.js +1 -1
  33. package/components/Datepicker/datepicker-input.cjs.js +4 -0
  34. package/components/Datepicker/datepicker-input.cjs.js.map +1 -1
  35. package/components/Datepicker/datepicker-input.d.ts +1 -0
  36. package/components/Datepicker/datepicker-input.js +4 -0
  37. package/components/Datepicker/datepicker-input.js.map +1 -1
  38. package/components/Datepicker/index.umd.js +252 -166
  39. package/components/Datepicker/index.umd.js.map +1 -1
  40. package/components/Datepicker/sgds-datepicker.cjs.js +25 -2
  41. package/components/Datepicker/sgds-datepicker.cjs.js.map +1 -1
  42. package/components/Datepicker/sgds-datepicker.d.ts +7 -1
  43. package/components/Datepicker/sgds-datepicker.js +25 -2
  44. package/components/Datepicker/sgds-datepicker.js.map +1 -1
  45. package/components/Datepicker/types.d.ts +0 -3
  46. package/components/Drawer/index.umd.js +1 -1
  47. package/components/Dropdown/index.umd.js +1 -1
  48. package/components/FileUpload/index.umd.js +2 -1
  49. package/components/FileUpload/index.umd.js.map +1 -1
  50. package/components/FileUpload/sgds-file-upload.cjs.js +1 -0
  51. package/components/FileUpload/sgds-file-upload.cjs.js.map +1 -1
  52. package/components/FileUpload/sgds-file-upload.d.ts +1 -0
  53. package/components/FileUpload/sgds-file-upload.js +1 -0
  54. package/components/FileUpload/sgds-file-upload.js.map +1 -1
  55. package/components/Footer/index.umd.js +1 -1
  56. package/components/Input/index.umd.js +10 -5
  57. package/components/Input/index.umd.js.map +1 -1
  58. package/components/Input/sgds-input.cjs.js +9 -4
  59. package/components/Input/sgds-input.cjs.js.map +1 -1
  60. package/components/Input/sgds-input.d.ts +1 -0
  61. package/components/Input/sgds-input.js +9 -4
  62. package/components/Input/sgds-input.js.map +1 -1
  63. package/components/Mainnav/index.umd.js +5989 -6128
  64. package/components/Mainnav/index.umd.js.map +1 -1
  65. package/components/Mainnav/sgds-mainnav.cjs.js +102 -29
  66. package/components/Mainnav/sgds-mainnav.cjs.js.map +1 -1
  67. package/components/Mainnav/sgds-mainnav.d.ts +16 -4
  68. package/components/Mainnav/sgds-mainnav.js +103 -26
  69. package/components/Mainnav/sgds-mainnav.js.map +1 -1
  70. package/components/Masthead/index.umd.js +1 -1
  71. package/components/Modal/index.umd.js +1 -1
  72. package/components/Pagination/index.umd.js +231 -41
  73. package/components/Pagination/index.umd.js.map +1 -1
  74. package/components/Pagination/sgds-pagination.cjs.js +94 -39
  75. package/components/Pagination/sgds-pagination.cjs.js.map +1 -1
  76. package/components/Pagination/sgds-pagination.cjs2.js +1 -1
  77. package/components/Pagination/sgds-pagination.d.ts +20 -13
  78. package/components/Pagination/sgds-pagination.js +95 -40
  79. package/components/Pagination/sgds-pagination.js.map +1 -1
  80. package/components/Pagination/sgds-pagination2.js +1 -1
  81. package/components/Progress/index.umd.js +1 -1
  82. package/components/QuantityToggle/index.umd.js +26 -8
  83. package/components/QuantityToggle/index.umd.js.map +1 -1
  84. package/components/QuantityToggle/sgds-quantity-toggle.cjs.js +25 -7
  85. package/components/QuantityToggle/sgds-quantity-toggle.cjs.js.map +1 -1
  86. package/components/QuantityToggle/sgds-quantity-toggle.d.ts +1 -0
  87. package/components/QuantityToggle/sgds-quantity-toggle.js +25 -7
  88. package/components/QuantityToggle/sgds-quantity-toggle.js.map +1 -1
  89. package/components/Radio/index.umd.js +1 -1
  90. package/components/Sidenav/index.umd.js +505 -1648
  91. package/components/Sidenav/index.umd.js.map +1 -1
  92. package/components/Sidenav/sgds-sidenav-item.cjs.js +122 -45
  93. package/components/Sidenav/sgds-sidenav-item.cjs.js.map +1 -1
  94. package/components/Sidenav/sgds-sidenav-item.d.ts +19 -8
  95. package/components/Sidenav/sgds-sidenav-item.js +123 -42
  96. package/components/Sidenav/sgds-sidenav-item.js.map +1 -1
  97. package/components/Sidenav/sgds-sidenav.cjs.js +38 -12
  98. package/components/Sidenav/sgds-sidenav.cjs.js.map +1 -1
  99. package/components/Sidenav/sgds-sidenav.cjs2.js +1 -1
  100. package/components/Sidenav/sgds-sidenav.d.ts +9 -0
  101. package/components/Sidenav/sgds-sidenav.js +39 -13
  102. package/components/Sidenav/sgds-sidenav.js.map +1 -1
  103. package/components/Sidenav/sgds-sidenav2.js +1 -1
  104. package/components/Spinner/index.umd.js +1 -1
  105. package/components/Stepper/index.umd.js +1 -1
  106. package/components/Tab/index.umd.js +1 -1
  107. package/components/Table/index.umd.js +1 -1
  108. package/components/Textarea/index.umd.js +1 -1
  109. package/components/Toast/index.umd.js +1 -1
  110. package/components/Tooltip/index.umd.js +1 -1
  111. package/components/index.umd.js +534 -539
  112. package/components/index.umd.js.map +1 -1
  113. package/index.umd.js +534 -539
  114. package/index.umd.js.map +1 -1
  115. package/package.json +2 -2
  116. package/react/mainnav/index.cjs.js +6 -1
  117. package/react/mainnav/index.cjs.js.map +1 -1
  118. package/react/mainnav/index.js +6 -1
  119. package/react/mainnav/index.js.map +1 -1
  120. package/react/sidenav-item/index.cjs.js +5 -1
  121. package/react/sidenav-item/index.cjs.js.map +1 -1
  122. package/react/sidenav-item/index.js +5 -1
  123. package/react/sidenav-item/index.js.map +1 -1
@@ -7,6 +7,7 @@ var lit = require('lit');
7
7
  var decorators_js = require('lit/decorators.js');
8
8
  var sgdsElement = require('../../base/sgds-element.cjs.js');
9
9
  var sgdsSidenav = require('./sgds-sidenav.cjs2.js');
10
+ var classMap_js = require('lit/directives/class-map.js');
10
11
 
11
12
  /**
12
13
  * @summary The side navigation is used to display a list of links to move between pages within a related category.
@@ -16,28 +17,47 @@ var sgdsSidenav = require('./sgds-sidenav.cjs2.js');
16
17
  * @slot default - Default slot for SgdsSidenavItem element.
17
18
  *
18
19
  * @cssproperty --sidenav-theme-color - overall sidenav theme color
20
+ * @cssproperty --sidenav-sticky-top - set the top value of the sticky sidenav. Defaults to 0rem
19
21
  */
20
22
  class SgdsSidenav extends sgdsElement["default"] {
21
23
  constructor() {
22
24
  super(...arguments);
23
25
  /** Allow sidenav items to stay open when another item is opened */
24
26
  this.alwaysOpen = false;
27
+ /** Apply position sticky to the sidenav */
28
+ this.sticky = false;
29
+ }
30
+ /** @internal */
31
+ get items() {
32
+ return [...(this.defaultNodes || [])].filter((node) => typeof node.tagName !== "undefined");
33
+ }
34
+ async onToggle(event) {
35
+ const target = event.target;
36
+ const isSidenavLink = target.tagName === "SGDS-SIDENAV-LINK";
37
+ // Let the event pass through the DOM so that it can be
38
+ // prevented from the outside if a user so desires.
39
+ if (this.alwaysOpen || event.defaultPrevented || isSidenavLink) {
40
+ // No toggling when `alwaysOpen` or the user prevents it.
41
+ return;
42
+ }
43
+ const items = [...this.items];
44
+ if (items && !items.length) {
45
+ // no toggling when there aren't items.
46
+ return;
47
+ }
48
+ items.forEach(item => {
49
+ // Covers all elements within sidenav-item
50
+ if (!event.composedPath().includes(item)) {
51
+ // Close all the items that didn't dispatch the event.
52
+ item.active = false;
53
+ }
54
+ });
25
55
  }
26
56
  render() {
27
- this.alwaysOpen
28
- ? null
29
- : this.addEventListener("sgds-toggle", (e) => {
30
- const children = this.shadowRoot.querySelector("slot").assignedElements({ flatten: true });
31
- for (let i = 0; i < children.length; i++) {
32
- if (e.detail.index != i) {
33
- children[i].closeItem();
34
- }
35
- }
36
- });
37
57
  return lit.html `
38
- <nav class="sidenav">
58
+ <nav class=${classMap_js.classMap({ sticky: this.sticky })}>
39
59
  <ul>
40
- <slot></slot>
60
+ <slot @click=${this.onToggle}></slot>
41
61
  </ul>
42
62
  </nav>
43
63
  `;
@@ -47,6 +67,12 @@ SgdsSidenav.styles = sgdsSidenav["default"];
47
67
  tslib.__decorate([
48
68
  decorators_js.property({ type: Boolean, attribute: true })
49
69
  ], SgdsSidenav.prototype, "alwaysOpen", void 0);
70
+ tslib.__decorate([
71
+ decorators_js.property({ type: Boolean, attribute: true })
72
+ ], SgdsSidenav.prototype, "sticky", void 0);
73
+ tslib.__decorate([
74
+ decorators_js.queryAssignedNodes()
75
+ ], SgdsSidenav.prototype, "defaultNodes", void 0);
50
76
 
51
77
  exports.SgdsSidenav = SgdsSidenav;
52
78
  exports["default"] = SgdsSidenav;
@@ -1 +1 @@
1
- {"version":3,"file":"sgds-sidenav.cjs.js","sources":["../../../src/components/Sidenav/sgds-sidenav.ts"],"sourcesContent":["import { html } from \"lit\";\nimport { property } from \"lit/decorators.js\";\nimport SgdsElement from \"../../base/sgds-element\";\nimport SgdsSidenavItem from \"./sgds-sidenav-item\";\nimport styles from \"./sgds-sidenav.scss\";\n\n/**\n * @summary The side navigation is used to display a list of links to move between pages within a related category.\n * It is used as a secondary form of navigation where the primary navigation is located hierachically above the page frame.\n * Maximum two levels of navigations are allowed.\n *\n * @slot default - Default slot for SgdsSidenavItem element.\n *\n * @cssproperty --sidenav-theme-color - overall sidenav theme color\n */\nexport class SgdsSidenav extends SgdsElement {\n static styles = styles;\n\n /** Allow sidenav items to stay open when another item is opened */\n @property({ type: Boolean, attribute: true })\n alwaysOpen = false;\n\n render() {\n this.alwaysOpen\n ? null\n : this.addEventListener(\"sgds-toggle\", (e: CustomEvent) => {\n const children = this.shadowRoot.querySelector(\"slot\").assignedElements({ flatten: true });\n for (let i = 0; i < children.length; i++) {\n if (e.detail.index != i) {\n (children[i] as SgdsSidenavItem).closeItem();\n }\n }\n });\n\n return html`\n <nav class=\"sidenav\">\n <ul>\n <slot></slot>\n </ul>\n </nav>\n `;\n }\n}\n\nexport default SgdsSidenav;\n"],"names":["SgdsElement","html","styles","__decorate","property"],"mappings":";;;;;;;;;;AAMA;;;;;;;;AAQG;AACG,MAAO,WAAY,SAAQA,sBAAW,CAAA;AAA5C,IAAA,WAAA,GAAA;;;QAKE,IAAU,CAAA,UAAA,GAAG,KAAK,CAAC;KAsBpB;IApBC,MAAM,GAAA;AACJ,QAAA,IAAI,CAAC,UAAU;AACb,cAAE,IAAI;cACJ,IAAI,CAAC,gBAAgB,CAAC,aAAa,EAAE,CAAC,CAAc,KAAI;AACtD,gBAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,gBAAgB,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;AAC3F,gBAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;oBACxC,IAAI,CAAC,CAAC,MAAM,CAAC,KAAK,IAAI,CAAC,EAAE;AACtB,wBAAA,QAAQ,CAAC,CAAC,CAAqB,CAAC,SAAS,EAAE,CAAC;qBAC9C;iBACF;AACH,aAAC,CAAC,CAAC;AAEP,QAAA,OAAOC,QAAI,CAAA,CAAA;;;;;;KAMV,CAAC;KACH;;AAzBM,WAAM,CAAA,MAAA,GAAGC,sBAAH,CAAU;AAIvBC,gBAAA,CAAA;IADCC,sBAAQ,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;AAC1B,CAAA,EAAA,WAAA,CAAA,SAAA,EAAA,YAAA,EAAA,KAAA,CAAA,CAAA;;;;;"}
1
+ {"version":3,"file":"sgds-sidenav.cjs.js","sources":["../../../src/components/Sidenav/sgds-sidenav.ts"],"sourcesContent":["import { html } from \"lit\";\nimport { property, queryAssignedNodes } from \"lit/decorators.js\";\nimport SgdsElement from \"../../base/sgds-element\";\nimport SgdsSidenavItem from \"./sgds-sidenav-item\";\nimport styles from \"./sgds-sidenav.scss\";\nimport { classMap } from \"lit/directives/class-map.js\";\n\n/**\n * @summary The side navigation is used to display a list of links to move between pages within a related category.\n * It is used as a secondary form of navigation where the primary navigation is located hierachically above the page frame.\n * Maximum two levels of navigations are allowed.\n *\n * @slot default - Default slot for SgdsSidenavItem element.\n *\n * @cssproperty --sidenav-theme-color - overall sidenav theme color\n * @cssproperty --sidenav-sticky-top - set the top value of the sticky sidenav. Defaults to 0rem\n */\nexport class SgdsSidenav extends SgdsElement {\n static styles = styles;\n\n /** Allow sidenav items to stay open when another item is opened */\n @property({ type: Boolean, attribute: true })\n alwaysOpen = false;\n\n /** Apply position sticky to the sidenav */\n @property({ type: Boolean, attribute: true })\n sticky = false;\n\n /** @internal */\n @queryAssignedNodes()\n private defaultNodes!: NodeListOf<SgdsSidenavItem>;\n\n /** @internal */\n get items(): SgdsSidenavItem[] {\n return [...(this.defaultNodes || [])].filter(\n (node: HTMLElement) => typeof node.tagName !== \"undefined\"\n ) as SgdsSidenavItem[];\n }\n\n async onToggle(event: Event): Promise<void> {\n const target = event.target as SgdsSidenavItem;\n const isSidenavLink = target.tagName === \"SGDS-SIDENAV-LINK\";\n // Let the event pass through the DOM so that it can be\n // prevented from the outside if a user so desires.\n if (this.alwaysOpen || event.defaultPrevented || isSidenavLink) {\n // No toggling when `alwaysOpen` or the user prevents it.\n return;\n }\n const items = [...this.items] as SgdsSidenavItem[];\n\n if (items && !items.length) {\n // no toggling when there aren't items.\n return;\n }\n items.forEach(item => {\n // Covers all elements within sidenav-item\n if (!event.composedPath().includes(item)) {\n // Close all the items that didn't dispatch the event.\n item.active = false;\n }\n });\n }\n\n render() {\n return html`\n <nav class=${classMap({ sticky: this.sticky })}>\n <ul>\n <slot @click=${this.onToggle}></slot>\n </ul>\n </nav>\n `;\n }\n}\n\nexport default SgdsSidenav;\n"],"names":["SgdsElement","html","classMap","styles","__decorate","property","queryAssignedNodes"],"mappings":";;;;;;;;;;;AAOA;;;;;;;;;AASG;AACG,MAAO,WAAY,SAAQA,sBAAW,CAAA;AAA5C,IAAA,WAAA,GAAA;;;QAKE,IAAU,CAAA,UAAA,GAAG,KAAK,CAAC;;QAInB,IAAM,CAAA,MAAA,GAAG,KAAK,CAAC;KA8ChB;;AAvCC,IAAA,IAAI,KAAK,GAAA;QACP,OAAO,CAAC,IAAI,IAAI,CAAC,YAAY,IAAI,EAAE,CAAC,CAAC,CAAC,MAAM,CAC1C,CAAC,IAAiB,KAAK,OAAO,IAAI,CAAC,OAAO,KAAK,WAAW,CACtC,CAAC;KACxB;IAED,MAAM,QAAQ,CAAC,KAAY,EAAA;AACzB,QAAA,MAAM,MAAM,GAAG,KAAK,CAAC,MAAyB,CAAC;AAC/C,QAAA,MAAM,aAAa,GAAG,MAAM,CAAC,OAAO,KAAK,mBAAmB,CAAC;;;QAG7D,IAAI,IAAI,CAAC,UAAU,IAAI,KAAK,CAAC,gBAAgB,IAAI,aAAa,EAAE;;YAE9D,OAAO;SACR;QACD,MAAM,KAAK,GAAG,CAAC,GAAG,IAAI,CAAC,KAAK,CAAsB,CAAC;AAEnD,QAAA,IAAI,KAAK,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE;;YAE1B,OAAO;SACR;AACD,QAAA,KAAK,CAAC,OAAO,CAAC,IAAI,IAAG;;YAEnB,IAAI,CAAC,KAAK,CAAC,YAAY,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE;;AAExC,gBAAA,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC;aACrB;AACH,SAAC,CAAC,CAAC;KACJ;IAED,MAAM,GAAA;AACJ,QAAA,OAAOC,QAAI,CAAA,CAAA;mBACIC,oBAAQ,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC,CAAA;;AAE3B,uBAAA,EAAA,IAAI,CAAC,QAAQ,CAAA;;;KAGjC,CAAC;KACH;;AArDM,WAAM,CAAA,MAAA,GAAGC,sBAAH,CAAU;AAIvBC,gBAAA,CAAA;IADCC,sBAAQ,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;AAC1B,CAAA,EAAA,WAAA,CAAA,SAAA,EAAA,YAAA,EAAA,KAAA,CAAA,CAAA,CAAA;AAInBD,gBAAA,CAAA;IADCC,sBAAQ,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;AAC9B,CAAA,EAAA,WAAA,CAAA,SAAA,EAAA,QAAA,EAAA,KAAA,CAAA,CAAA,CAAA;AAIPD,gBAAA,CAAA;AADP,IAAAE,gCAAkB,EAAE;AAC8B,CAAA,EAAA,WAAA,CAAA,SAAA,EAAA,cAAA,EAAA,KAAA,CAAA,CAAA;;;;;"}
@@ -4,7 +4,7 @@ Object.defineProperty(exports, '__esModule', { value: true });
4
4
 
5
5
  var lit = require('lit');
6
6
 
7
- var css_248z = lit.css`:host{--sidenav-theme-color:#5925dc}ul{display:flex;flex-direction:column;gap:1rem;list-style:none;padding-left:0}`;
7
+ var css_248z = lit.css`:host{--sidenav-theme-color:#5925dc;--sidenav-sticky-top:0rem}ul{display:flex;flex-direction:column;gap:1rem;list-style:none;padding-left:0}.sticky{height:calc(100vh - var(--sidenav-sticky-top, 0rem));overflow-y:auto;position:sticky;top:var(--sidenav-sticky-top,0)}`;
8
8
 
9
9
  exports["default"] = css_248z;
10
10
  //# sourceMappingURL=sgds-sidenav.cjs2.js.map
@@ -1,4 +1,5 @@
1
1
  import SgdsElement from "../../base/sgds-element";
2
+ import SgdsSidenavItem from "./sgds-sidenav-item";
2
3
  /**
3
4
  * @summary The side navigation is used to display a list of links to move between pages within a related category.
4
5
  * It is used as a secondary form of navigation where the primary navigation is located hierachically above the page frame.
@@ -7,11 +8,19 @@ import SgdsElement from "../../base/sgds-element";
7
8
  * @slot default - Default slot for SgdsSidenavItem element.
8
9
  *
9
10
  * @cssproperty --sidenav-theme-color - overall sidenav theme color
11
+ * @cssproperty --sidenav-sticky-top - set the top value of the sticky sidenav. Defaults to 0rem
10
12
  */
11
13
  export declare class SgdsSidenav extends SgdsElement {
12
14
  static styles: import("lit").CSSResultGroup;
13
15
  /** Allow sidenav items to stay open when another item is opened */
14
16
  alwaysOpen: boolean;
17
+ /** Apply position sticky to the sidenav */
18
+ sticky: boolean;
19
+ /** @internal */
20
+ private defaultNodes;
21
+ /** @internal */
22
+ get items(): SgdsSidenavItem[];
23
+ onToggle(event: Event): Promise<void>;
15
24
  render(): import("lit-html").TemplateResult<1>;
16
25
  }
17
26
  export default SgdsSidenav;
@@ -1,8 +1,9 @@
1
1
  import { __decorate } from 'tslib';
2
2
  import { html } from 'lit';
3
- import { property } from 'lit/decorators.js';
3
+ import { property, queryAssignedNodes } from 'lit/decorators.js';
4
4
  import SgdsElement from '../../base/sgds-element.js';
5
5
  import css_248z from './sgds-sidenav2.js';
6
+ import { classMap } from 'lit/directives/class-map.js';
6
7
 
7
8
  /**
8
9
  * @summary The side navigation is used to display a list of links to move between pages within a related category.
@@ -12,28 +13,47 @@ import css_248z from './sgds-sidenav2.js';
12
13
  * @slot default - Default slot for SgdsSidenavItem element.
13
14
  *
14
15
  * @cssproperty --sidenav-theme-color - overall sidenav theme color
16
+ * @cssproperty --sidenav-sticky-top - set the top value of the sticky sidenav. Defaults to 0rem
15
17
  */
16
18
  class SgdsSidenav extends SgdsElement {
17
19
  constructor() {
18
20
  super(...arguments);
19
21
  /** Allow sidenav items to stay open when another item is opened */
20
22
  this.alwaysOpen = false;
23
+ /** Apply position sticky to the sidenav */
24
+ this.sticky = false;
25
+ }
26
+ /** @internal */
27
+ get items() {
28
+ return [...(this.defaultNodes || [])].filter((node) => typeof node.tagName !== "undefined");
29
+ }
30
+ async onToggle(event) {
31
+ const target = event.target;
32
+ const isSidenavLink = target.tagName === "SGDS-SIDENAV-LINK";
33
+ // Let the event pass through the DOM so that it can be
34
+ // prevented from the outside if a user so desires.
35
+ if (this.alwaysOpen || event.defaultPrevented || isSidenavLink) {
36
+ // No toggling when `alwaysOpen` or the user prevents it.
37
+ return;
38
+ }
39
+ const items = [...this.items];
40
+ if (items && !items.length) {
41
+ // no toggling when there aren't items.
42
+ return;
43
+ }
44
+ items.forEach(item => {
45
+ // Covers all elements within sidenav-item
46
+ if (!event.composedPath().includes(item)) {
47
+ // Close all the items that didn't dispatch the event.
48
+ item.active = false;
49
+ }
50
+ });
21
51
  }
22
52
  render() {
23
- this.alwaysOpen
24
- ? null
25
- : this.addEventListener("sgds-toggle", (e) => {
26
- const children = this.shadowRoot.querySelector("slot").assignedElements({ flatten: true });
27
- for (let i = 0; i < children.length; i++) {
28
- if (e.detail.index != i) {
29
- children[i].closeItem();
30
- }
31
- }
32
- });
33
53
  return html `
34
- <nav class="sidenav">
54
+ <nav class=${classMap({ sticky: this.sticky })}>
35
55
  <ul>
36
- <slot></slot>
56
+ <slot @click=${this.onToggle}></slot>
37
57
  </ul>
38
58
  </nav>
39
59
  `;
@@ -43,6 +63,12 @@ SgdsSidenav.styles = css_248z;
43
63
  __decorate([
44
64
  property({ type: Boolean, attribute: true })
45
65
  ], SgdsSidenav.prototype, "alwaysOpen", void 0);
66
+ __decorate([
67
+ property({ type: Boolean, attribute: true })
68
+ ], SgdsSidenav.prototype, "sticky", void 0);
69
+ __decorate([
70
+ queryAssignedNodes()
71
+ ], SgdsSidenav.prototype, "defaultNodes", void 0);
46
72
 
47
73
  export { SgdsSidenav, SgdsSidenav as default };
48
74
  //# sourceMappingURL=sgds-sidenav.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"sgds-sidenav.js","sources":["../../../src/components/Sidenav/sgds-sidenav.ts"],"sourcesContent":["import { html } from \"lit\";\nimport { property } from \"lit/decorators.js\";\nimport SgdsElement from \"../../base/sgds-element\";\nimport SgdsSidenavItem from \"./sgds-sidenav-item\";\nimport styles from \"./sgds-sidenav.scss\";\n\n/**\n * @summary The side navigation is used to display a list of links to move between pages within a related category.\n * It is used as a secondary form of navigation where the primary navigation is located hierachically above the page frame.\n * Maximum two levels of navigations are allowed.\n *\n * @slot default - Default slot for SgdsSidenavItem element.\n *\n * @cssproperty --sidenav-theme-color - overall sidenav theme color\n */\nexport class SgdsSidenav extends SgdsElement {\n static styles = styles;\n\n /** Allow sidenav items to stay open when another item is opened */\n @property({ type: Boolean, attribute: true })\n alwaysOpen = false;\n\n render() {\n this.alwaysOpen\n ? null\n : this.addEventListener(\"sgds-toggle\", (e: CustomEvent) => {\n const children = this.shadowRoot.querySelector(\"slot\").assignedElements({ flatten: true });\n for (let i = 0; i < children.length; i++) {\n if (e.detail.index != i) {\n (children[i] as SgdsSidenavItem).closeItem();\n }\n }\n });\n\n return html`\n <nav class=\"sidenav\">\n <ul>\n <slot></slot>\n </ul>\n </nav>\n `;\n }\n}\n\nexport default SgdsSidenav;\n"],"names":["styles"],"mappings":";;;;;;AAMA;;;;;;;;AAQG;AACG,MAAO,WAAY,SAAQ,WAAW,CAAA;AAA5C,IAAA,WAAA,GAAA;;;QAKE,IAAU,CAAA,UAAA,GAAG,KAAK,CAAC;KAsBpB;IApBC,MAAM,GAAA;AACJ,QAAA,IAAI,CAAC,UAAU;AACb,cAAE,IAAI;cACJ,IAAI,CAAC,gBAAgB,CAAC,aAAa,EAAE,CAAC,CAAc,KAAI;AACtD,gBAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,gBAAgB,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;AAC3F,gBAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;oBACxC,IAAI,CAAC,CAAC,MAAM,CAAC,KAAK,IAAI,CAAC,EAAE;AACtB,wBAAA,QAAQ,CAAC,CAAC,CAAqB,CAAC,SAAS,EAAE,CAAC;qBAC9C;iBACF;AACH,aAAC,CAAC,CAAC;AAEP,QAAA,OAAO,IAAI,CAAA,CAAA;;;;;;KAMV,CAAC;KACH;;AAzBM,WAAM,CAAA,MAAA,GAAGA,QAAH,CAAU;AAIvB,UAAA,CAAA;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;AAC1B,CAAA,EAAA,WAAA,CAAA,SAAA,EAAA,YAAA,EAAA,KAAA,CAAA,CAAA;;;;"}
1
+ {"version":3,"file":"sgds-sidenav.js","sources":["../../../src/components/Sidenav/sgds-sidenav.ts"],"sourcesContent":["import { html } from \"lit\";\nimport { property, queryAssignedNodes } from \"lit/decorators.js\";\nimport SgdsElement from \"../../base/sgds-element\";\nimport SgdsSidenavItem from \"./sgds-sidenav-item\";\nimport styles from \"./sgds-sidenav.scss\";\nimport { classMap } from \"lit/directives/class-map.js\";\n\n/**\n * @summary The side navigation is used to display a list of links to move between pages within a related category.\n * It is used as a secondary form of navigation where the primary navigation is located hierachically above the page frame.\n * Maximum two levels of navigations are allowed.\n *\n * @slot default - Default slot for SgdsSidenavItem element.\n *\n * @cssproperty --sidenav-theme-color - overall sidenav theme color\n * @cssproperty --sidenav-sticky-top - set the top value of the sticky sidenav. Defaults to 0rem\n */\nexport class SgdsSidenav extends SgdsElement {\n static styles = styles;\n\n /** Allow sidenav items to stay open when another item is opened */\n @property({ type: Boolean, attribute: true })\n alwaysOpen = false;\n\n /** Apply position sticky to the sidenav */\n @property({ type: Boolean, attribute: true })\n sticky = false;\n\n /** @internal */\n @queryAssignedNodes()\n private defaultNodes!: NodeListOf<SgdsSidenavItem>;\n\n /** @internal */\n get items(): SgdsSidenavItem[] {\n return [...(this.defaultNodes || [])].filter(\n (node: HTMLElement) => typeof node.tagName !== \"undefined\"\n ) as SgdsSidenavItem[];\n }\n\n async onToggle(event: Event): Promise<void> {\n const target = event.target as SgdsSidenavItem;\n const isSidenavLink = target.tagName === \"SGDS-SIDENAV-LINK\";\n // Let the event pass through the DOM so that it can be\n // prevented from the outside if a user so desires.\n if (this.alwaysOpen || event.defaultPrevented || isSidenavLink) {\n // No toggling when `alwaysOpen` or the user prevents it.\n return;\n }\n const items = [...this.items] as SgdsSidenavItem[];\n\n if (items && !items.length) {\n // no toggling when there aren't items.\n return;\n }\n items.forEach(item => {\n // Covers all elements within sidenav-item\n if (!event.composedPath().includes(item)) {\n // Close all the items that didn't dispatch the event.\n item.active = false;\n }\n });\n }\n\n render() {\n return html`\n <nav class=${classMap({ sticky: this.sticky })}>\n <ul>\n <slot @click=${this.onToggle}></slot>\n </ul>\n </nav>\n `;\n }\n}\n\nexport default SgdsSidenav;\n"],"names":["styles"],"mappings":";;;;;;;AAOA;;;;;;;;;AASG;AACG,MAAO,WAAY,SAAQ,WAAW,CAAA;AAA5C,IAAA,WAAA,GAAA;;;QAKE,IAAU,CAAA,UAAA,GAAG,KAAK,CAAC;;QAInB,IAAM,CAAA,MAAA,GAAG,KAAK,CAAC;KA8ChB;;AAvCC,IAAA,IAAI,KAAK,GAAA;QACP,OAAO,CAAC,IAAI,IAAI,CAAC,YAAY,IAAI,EAAE,CAAC,CAAC,CAAC,MAAM,CAC1C,CAAC,IAAiB,KAAK,OAAO,IAAI,CAAC,OAAO,KAAK,WAAW,CACtC,CAAC;KACxB;IAED,MAAM,QAAQ,CAAC,KAAY,EAAA;AACzB,QAAA,MAAM,MAAM,GAAG,KAAK,CAAC,MAAyB,CAAC;AAC/C,QAAA,MAAM,aAAa,GAAG,MAAM,CAAC,OAAO,KAAK,mBAAmB,CAAC;;;QAG7D,IAAI,IAAI,CAAC,UAAU,IAAI,KAAK,CAAC,gBAAgB,IAAI,aAAa,EAAE;;YAE9D,OAAO;SACR;QACD,MAAM,KAAK,GAAG,CAAC,GAAG,IAAI,CAAC,KAAK,CAAsB,CAAC;AAEnD,QAAA,IAAI,KAAK,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE;;YAE1B,OAAO;SACR;AACD,QAAA,KAAK,CAAC,OAAO,CAAC,IAAI,IAAG;;YAEnB,IAAI,CAAC,KAAK,CAAC,YAAY,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE;;AAExC,gBAAA,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC;aACrB;AACH,SAAC,CAAC,CAAC;KACJ;IAED,MAAM,GAAA;AACJ,QAAA,OAAO,IAAI,CAAA,CAAA;mBACI,QAAQ,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC,CAAA;;AAE3B,uBAAA,EAAA,IAAI,CAAC,QAAQ,CAAA;;;KAGjC,CAAC;KACH;;AArDM,WAAM,CAAA,MAAA,GAAGA,QAAH,CAAU;AAIvB,UAAA,CAAA;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;AAC1B,CAAA,EAAA,WAAA,CAAA,SAAA,EAAA,YAAA,EAAA,KAAA,CAAA,CAAA,CAAA;AAInB,UAAA,CAAA;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;AAC9B,CAAA,EAAA,WAAA,CAAA,SAAA,EAAA,QAAA,EAAA,KAAA,CAAA,CAAA,CAAA;AAIP,UAAA,CAAA;AADP,IAAA,kBAAkB,EAAE;AAC8B,CAAA,EAAA,WAAA,CAAA,SAAA,EAAA,cAAA,EAAA,KAAA,CAAA,CAAA;;;;"}
@@ -1,6 +1,6 @@
1
1
  import { css } from 'lit';
2
2
 
3
- var css_248z = css`:host{--sidenav-theme-color:#5925dc}ul{display:flex;flex-direction:column;gap:1rem;list-style:none;padding-left:0}`;
3
+ var css_248z = css`:host{--sidenav-theme-color:#5925dc;--sidenav-sticky-top:0rem}ul{display:flex;flex-direction:column;gap:1rem;list-style:none;padding-left:0}.sticky{height:calc(100vh - var(--sidenav-sticky-top, 0rem));overflow-y:auto;position:sticky;top:var(--sidenav-sticky-top,0)}`;
4
4
 
5
5
  export { css_248z as default };
6
6
  //# sourceMappingURL=sgds-sidenav2.js.map