@govtechsg/sgds-web-component 3.26.1 → 3.27.0-rc.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 (243) hide show
  1. package/base/dropdown-list-element.js +9 -2
  2. package/base/dropdown-list-element.js.map +1 -1
  3. package/base/nav-element.d.ts +64 -0
  4. package/base/nav-element.js +263 -0
  5. package/base/nav-element.js.map +1 -0
  6. package/base/nav-profile-element.d.ts +47 -0
  7. package/base/nav-profile-element.js +191 -0
  8. package/base/nav-profile-element.js.map +1 -0
  9. package/base/nav-profile.js +6 -0
  10. package/base/nav-profile.js.map +1 -0
  11. package/components/Appnav/appnav-context.d.ts +6 -0
  12. package/components/Appnav/appnav-context.js +7 -0
  13. package/components/Appnav/appnav-context.js.map +1 -0
  14. package/components/Appnav/appnav.js +6 -0
  15. package/components/Appnav/appnav.js.map +1 -0
  16. package/components/Appnav/index.d.ts +9 -0
  17. package/components/Appnav/index.js +8 -0
  18. package/components/Appnav/index.js.map +1 -0
  19. package/components/Appnav/index.umd.min.js +2542 -0
  20. package/components/Appnav/index.umd.min.js.map +1 -0
  21. package/components/Appnav/sgds-appnav-profile.d.ts +17 -0
  22. package/components/Appnav/sgds-appnav-profile.js +31 -0
  23. package/components/Appnav/sgds-appnav-profile.js.map +1 -0
  24. package/components/Appnav/sgds-appnav.d.ts +44 -0
  25. package/components/Appnav/sgds-appnav.js +183 -0
  26. package/components/Appnav/sgds-appnav.js.map +1 -0
  27. package/components/Breadcrumb/index.umd.min.js +25 -25
  28. package/components/Breadcrumb/index.umd.min.js.map +1 -1
  29. package/components/Checkbox/index.umd.min.js +233 -233
  30. package/components/Checkbox/index.umd.min.js.map +1 -1
  31. package/components/Checkbox/sgds-checkbox.d.ts +1 -0
  32. package/components/Checkbox/sgds-checkbox.js +6 -1
  33. package/components/Checkbox/sgds-checkbox.js.map +1 -1
  34. package/components/ComboBox/index.umd.min.js +254 -254
  35. package/components/ComboBox/index.umd.min.js.map +1 -1
  36. package/components/DataTable/data-table.js +6 -0
  37. package/components/DataTable/data-table.js.map +1 -0
  38. package/components/DataTable/index.d.ts +12 -0
  39. package/components/DataTable/index.js +11 -0
  40. package/components/DataTable/index.js.map +1 -0
  41. package/components/DataTable/index.umd.min.js +2634 -0
  42. package/components/DataTable/index.umd.min.js.map +1 -0
  43. package/components/DataTable/sgds-data-table-cell.d.ts +15 -0
  44. package/components/DataTable/sgds-data-table-cell.js +32 -0
  45. package/components/DataTable/sgds-data-table-cell.js.map +1 -0
  46. package/components/DataTable/sgds-data-table-head.d.ts +28 -0
  47. package/components/DataTable/sgds-data-table-head.js +69 -0
  48. package/components/DataTable/sgds-data-table-head.js.map +1 -0
  49. package/components/DataTable/sgds-data-table-row.d.ts +76 -0
  50. package/components/DataTable/sgds-data-table-row.js +333 -0
  51. package/components/DataTable/sgds-data-table-row.js.map +1 -0
  52. package/components/DataTable/sgds-data-table.d.ts +82 -0
  53. package/components/DataTable/sgds-data-table.js +405 -0
  54. package/components/DataTable/sgds-data-table.js.map +1 -0
  55. package/components/Datepicker/index.umd.min.js +86 -86
  56. package/components/Datepicker/index.umd.min.js.map +1 -1
  57. package/components/Dropdown/dropdown-item.js +1 -1
  58. package/components/Dropdown/index.umd.min.js +5 -5
  59. package/components/Dropdown/index.umd.min.js.map +1 -1
  60. package/components/Dropdown/sgds-dropdown-item.d.ts +2 -0
  61. package/components/Dropdown/sgds-dropdown-item.js +8 -2
  62. package/components/Dropdown/sgds-dropdown-item.js.map +1 -1
  63. package/components/Input/index.umd.min.js +2 -2
  64. package/components/Input/index.umd.min.js.map +1 -1
  65. package/components/Input/input.js +1 -1
  66. package/components/Mainnav/index.d.ts +2 -0
  67. package/components/Mainnav/index.js +2 -0
  68. package/components/Mainnav/index.js.map +1 -1
  69. package/components/Mainnav/index.umd.min.js +339 -286
  70. package/components/Mainnav/index.umd.min.js.map +1 -1
  71. package/components/Mainnav/mainnav-dropdown.js +1 -1
  72. package/components/Mainnav/mainnav-item.js +1 -1
  73. package/components/Mainnav/mainnav.js +1 -1
  74. package/components/Mainnav/sgds-mainnav-profile.d.ts +15 -0
  75. package/components/Mainnav/sgds-mainnav-profile.js +29 -0
  76. package/components/Mainnav/sgds-mainnav-profile.js.map +1 -0
  77. package/components/Mainnav/sgds-mainnav.d.ts +8 -51
  78. package/components/Mainnav/sgds-mainnav.js +40 -238
  79. package/components/Mainnav/sgds-mainnav.js.map +1 -1
  80. package/components/OverflowMenu/index.umd.min.js +25 -25
  81. package/components/OverflowMenu/index.umd.min.js.map +1 -1
  82. package/components/QuantityToggle/index.umd.min.js +1 -1
  83. package/components/QuantityToggle/index.umd.min.js.map +1 -1
  84. package/components/Select/index.umd.min.js +1 -1
  85. package/components/Select/index.umd.min.js.map +1 -1
  86. package/components/Tab/index.umd.min.js +1 -1
  87. package/components/Tab/index.umd.min.js.map +1 -1
  88. package/components/Tab/tab-panel.js +1 -1
  89. package/components/Textarea/index.umd.min.js +1 -1
  90. package/components/Textarea/index.umd.min.js.map +1 -1
  91. package/components/Textarea/textarea.js +1 -1
  92. package/components/index.d.ts +7 -0
  93. package/components/index.js +7 -0
  94. package/components/index.js.map +1 -1
  95. package/components/index.umd.min.js +812 -628
  96. package/components/index.umd.min.js.map +1 -1
  97. package/css/fouc.css +9 -2
  98. package/custom-elements.json +11501 -7967
  99. package/index.d.ts +2 -0
  100. package/index.js +2 -0
  101. package/index.js.map +1 -1
  102. package/index.umd.min.js +699 -510
  103. package/index.umd.min.js.map +1 -1
  104. package/package.json +1 -1
  105. package/react/appnav/index.cjs.js +45 -0
  106. package/react/appnav/index.cjs.js.map +1 -0
  107. package/react/appnav/index.d.ts +4 -0
  108. package/react/appnav/index.js +21 -0
  109. package/react/appnav/index.js.map +1 -0
  110. package/react/appnav-profile/index.cjs.js +40 -0
  111. package/react/appnav-profile/index.cjs.js.map +1 -0
  112. package/react/appnav-profile/index.d.ts +4 -0
  113. package/react/appnav-profile/index.js +16 -0
  114. package/react/appnav-profile/index.js.map +1 -0
  115. package/react/base/dropdown-list-element.cjs.js +9 -2
  116. package/react/base/dropdown-list-element.cjs.js.map +1 -1
  117. package/react/base/dropdown-list-element.js +9 -2
  118. package/react/base/dropdown-list-element.js.map +1 -1
  119. package/react/base/nav-element.cjs.js +268 -0
  120. package/react/base/nav-element.cjs.js.map +1 -0
  121. package/react/base/nav-element.js +264 -0
  122. package/react/base/nav-element.js.map +1 -0
  123. package/react/base/nav-profile-element.cjs.js +196 -0
  124. package/react/base/nav-profile-element.cjs.js.map +1 -0
  125. package/react/base/nav-profile-element.js +192 -0
  126. package/react/base/nav-profile-element.js.map +1 -0
  127. package/react/base/nav-profile.cjs.js +11 -0
  128. package/react/base/nav-profile.cjs.js.map +1 -0
  129. package/react/base/nav-profile.js +7 -0
  130. package/react/base/nav-profile.js.map +1 -0
  131. package/react/components/Appnav/appnav-context.cjs.js +13 -0
  132. package/react/components/Appnav/appnav-context.cjs.js.map +1 -0
  133. package/react/components/Appnav/appnav-context.js +8 -0
  134. package/react/components/Appnav/appnav-context.js.map +1 -0
  135. package/react/components/Appnav/appnav.cjs.js +11 -0
  136. package/react/components/Appnav/appnav.cjs.js.map +1 -0
  137. package/react/components/Appnav/appnav.js +7 -0
  138. package/react/components/Appnav/appnav.js.map +1 -0
  139. package/react/components/Appnav/sgds-appnav-profile.cjs.js +37 -0
  140. package/react/components/Appnav/sgds-appnav-profile.cjs.js.map +1 -0
  141. package/react/components/Appnav/sgds-appnav-profile.js +32 -0
  142. package/react/components/Appnav/sgds-appnav-profile.js.map +1 -0
  143. package/react/components/Appnav/sgds-appnav.cjs.js +189 -0
  144. package/react/components/Appnav/sgds-appnav.cjs.js.map +1 -0
  145. package/react/components/Appnav/sgds-appnav.js +184 -0
  146. package/react/components/Appnav/sgds-appnav.js.map +1 -0
  147. package/react/components/Checkbox/sgds-checkbox.cjs.js +6 -1
  148. package/react/components/Checkbox/sgds-checkbox.cjs.js.map +1 -1
  149. package/react/components/Checkbox/sgds-checkbox.js +6 -1
  150. package/react/components/Checkbox/sgds-checkbox.js.map +1 -1
  151. package/react/components/DataTable/data-table.cjs.js +11 -0
  152. package/react/components/DataTable/data-table.cjs.js.map +1 -0
  153. package/react/components/DataTable/data-table.js +7 -0
  154. package/react/components/DataTable/data-table.js.map +1 -0
  155. package/react/components/DataTable/sgds-data-table-cell.cjs.js +38 -0
  156. package/react/components/DataTable/sgds-data-table-cell.cjs.js.map +1 -0
  157. package/react/components/DataTable/sgds-data-table-cell.js +33 -0
  158. package/react/components/DataTable/sgds-data-table-cell.js.map +1 -0
  159. package/react/components/DataTable/sgds-data-table-head.cjs.js +75 -0
  160. package/react/components/DataTable/sgds-data-table-head.cjs.js.map +1 -0
  161. package/react/components/DataTable/sgds-data-table-head.js +70 -0
  162. package/react/components/DataTable/sgds-data-table-head.js.map +1 -0
  163. package/react/components/DataTable/sgds-data-table-row.cjs.js +339 -0
  164. package/react/components/DataTable/sgds-data-table-row.cjs.js.map +1 -0
  165. package/react/components/DataTable/sgds-data-table-row.js +334 -0
  166. package/react/components/DataTable/sgds-data-table-row.js.map +1 -0
  167. package/react/components/DataTable/sgds-data-table.cjs.js +411 -0
  168. package/react/components/DataTable/sgds-data-table.cjs.js.map +1 -0
  169. package/react/components/DataTable/sgds-data-table.js +406 -0
  170. package/react/components/DataTable/sgds-data-table.js.map +1 -0
  171. package/react/components/Dropdown/dropdown-item.cjs.js +1 -1
  172. package/react/components/Dropdown/dropdown-item.js +1 -1
  173. package/react/components/Dropdown/sgds-dropdown-item.cjs.js +8 -2
  174. package/react/components/Dropdown/sgds-dropdown-item.cjs.js.map +1 -1
  175. package/react/components/Dropdown/sgds-dropdown-item.js +8 -2
  176. package/react/components/Dropdown/sgds-dropdown-item.js.map +1 -1
  177. package/react/components/Input/input.cjs.js +1 -1
  178. package/react/components/Input/input.js +1 -1
  179. package/react/components/Mainnav/mainnav-dropdown.cjs.js +1 -1
  180. package/react/components/Mainnav/mainnav-dropdown.js +1 -1
  181. package/react/components/Mainnav/mainnav-item.cjs.js +1 -1
  182. package/react/components/Mainnav/mainnav-item.js +1 -1
  183. package/react/components/Mainnav/mainnav.cjs.js +1 -1
  184. package/react/components/Mainnav/mainnav.js +1 -1
  185. package/react/components/Mainnav/sgds-mainnav-profile.cjs.js +35 -0
  186. package/react/components/Mainnav/sgds-mainnav-profile.cjs.js.map +1 -0
  187. package/react/components/Mainnav/sgds-mainnav-profile.js +30 -0
  188. package/react/components/Mainnav/sgds-mainnav-profile.js.map +1 -0
  189. package/react/components/Mainnav/sgds-mainnav.cjs.js +39 -237
  190. package/react/components/Mainnav/sgds-mainnav.cjs.js.map +1 -1
  191. package/react/components/Mainnav/sgds-mainnav.js +40 -238
  192. package/react/components/Mainnav/sgds-mainnav.js.map +1 -1
  193. package/react/components/Tab/tab-panel.cjs.js +1 -1
  194. package/react/components/Tab/tab-panel.js +1 -1
  195. package/react/components/Textarea/textarea.cjs.js +1 -1
  196. package/react/components/Textarea/textarea.js +1 -1
  197. package/react/data-table/index.cjs.js +44 -0
  198. package/react/data-table/index.cjs.js.map +1 -0
  199. package/react/data-table/index.d.ts +4 -0
  200. package/react/data-table/index.js +20 -0
  201. package/react/data-table/index.js.map +1 -0
  202. package/react/data-table-cell/index.cjs.js +40 -0
  203. package/react/data-table-cell/index.cjs.js.map +1 -0
  204. package/react/data-table-cell/index.d.ts +4 -0
  205. package/react/data-table-cell/index.js +16 -0
  206. package/react/data-table-cell/index.js.map +1 -0
  207. package/react/data-table-head/index.cjs.js +40 -0
  208. package/react/data-table-head/index.cjs.js.map +1 -0
  209. package/react/data-table-head/index.d.ts +4 -0
  210. package/react/data-table-head/index.js +16 -0
  211. package/react/data-table-head/index.js.map +1 -0
  212. package/react/data-table-row/index.cjs.js +45 -0
  213. package/react/data-table-row/index.cjs.js.map +1 -0
  214. package/react/data-table-row/index.d.ts +4 -0
  215. package/react/data-table-row/index.js +21 -0
  216. package/react/data-table-row/index.js.map +1 -0
  217. package/react/index.cjs.js +152 -138
  218. package/react/index.cjs.js.map +1 -1
  219. package/react/index.d.ts +9 -2
  220. package/react/index.js +9 -2
  221. package/react/index.js.map +1 -1
  222. package/react/mainnav-profile/index.cjs.js +40 -0
  223. package/react/mainnav-profile/index.cjs.js.map +1 -0
  224. package/react/mainnav-profile/index.d.ts +4 -0
  225. package/react/mainnav-profile/index.js +16 -0
  226. package/react/mainnav-profile/index.js.map +1 -0
  227. package/react/styles/form-text-control.cjs.js +1 -1
  228. package/react/styles/form-text-control.js +1 -1
  229. package/styles/form-text-control.js +1 -1
  230. package/themes/blue.css +11 -11
  231. package/themes/cyan.css +10 -10
  232. package/themes/gt/blue.css +11 -11
  233. package/themes/gt/cyan.css +10 -10
  234. package/themes/gt/magenta.css +11 -11
  235. package/themes/gt/pink.css +11 -11
  236. package/themes/gt/purple.css +11 -11
  237. package/themes/gt/red.css +11 -11
  238. package/themes/magenta.css +11 -11
  239. package/themes/pink.css +11 -11
  240. package/themes/purple.css +11 -11
  241. package/themes/red.css +11 -11
  242. package/themes/root.css +5 -0
  243. package/types/react.d.ts +244 -92
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@govtechsg/sgds-web-component",
3
- "version": "3.26.1",
3
+ "version": "3.27.0-rc.0",
4
4
  "description": "",
5
5
  "main": "./index.umd.js",
6
6
  "module": "./index.js",
@@ -0,0 +1,45 @@
1
+ 'use client';
2
+ 'use strict';
3
+
4
+ Object.defineProperty(exports, '__esModule', { value: true });
5
+
6
+ var React = require('react');
7
+ var react = require('@lit/react');
8
+ var sgdsAppnav = require('../components/Appnav/sgds-appnav.cjs.js');
9
+ var ceRegistry = require('../utils/ce-registry.cjs.js');
10
+
11
+ function _interopNamespace(e) {
12
+ if (e && e.__esModule) return e;
13
+ var n = Object.create(null);
14
+ if (e) {
15
+ Object.keys(e).forEach(function (k) {
16
+ if (k !== 'default') {
17
+ var d = Object.getOwnPropertyDescriptor(e, k);
18
+ Object.defineProperty(n, k, d.get ? d : {
19
+ enumerable: true,
20
+ get: function () { return e[k]; }
21
+ });
22
+ }
23
+ });
24
+ }
25
+ n["default"] = e;
26
+ return Object.freeze(n);
27
+ }
28
+
29
+ var React__namespace = /*#__PURE__*/_interopNamespace(React);
30
+
31
+ ceRegistry.register("sgds-appnav", sgdsAppnav.SgdsAppnav);
32
+ var index = react.createComponent({
33
+ react: React__namespace,
34
+ tagName: "sgds-appnav",
35
+ elementClass: sgdsAppnav.SgdsAppnav,
36
+ events: {
37
+ onSgdsShow: "sgds-show",
38
+ onSgdsAfterShow: "sgds-after-show",
39
+ onSgdsHide: "sgds-hide",
40
+ onSgdsAfterHide: "sgds-after-hide"
41
+ }
42
+ });
43
+
44
+ exports["default"] = index;
45
+ //# sourceMappingURL=index.cjs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.cjs.js","sources":["../../../src/react/appnav/index.ts"],"sourcesContent":["import * as React from \"react\";\nimport { createComponent } from \"@lit/react\";\nimport Component from \"../../components/Appnav/sgds-appnav\";\nimport { register } from \"../../utils/ce-registry\";\n\nregister(\"sgds-appnav\", Component);\n\nexport default createComponent({\n react: React,\n tagName: \"sgds-appnav\",\n elementClass: Component,\n events: {\n onSgdsShow: \"sgds-show\",\n onSgdsAfterShow: \"sgds-after-show\",\n onSgdsHide: \"sgds-hide\",\n onSgdsAfterHide: \"sgds-after-hide\"\n }\n});\n"],"names":["register","Component","createComponent","React"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAKAA,mBAAQ,CAAC,aAAa,EAAEC,qBAAS,CAAC,CAAC;AAEnC,YAAeC,qBAAe,CAAC;AAC7B,IAAA,KAAK,EAAEC,gBAAK;AACZ,IAAA,OAAO,EAAE,aAAa;AACtB,IAAA,YAAY,EAAEF,qBAAS;AACvB,IAAA,MAAM,EAAE;AACN,QAAA,UAAU,EAAE,WAAW;AACvB,QAAA,eAAe,EAAE,iBAAiB;AAClC,QAAA,UAAU,EAAE,WAAW;AACvB,QAAA,eAAe,EAAE,iBAAiB;AACnC,KAAA;AACF,CAAA,CAAC;;;;"}
@@ -0,0 +1,4 @@
1
+ import type { SgdsAppnavProps } from '../../types/react';
2
+ import * as React from 'react';
3
+ declare const _default: React.ForwardRefExoticComponent<React.PropsWithChildren<SgdsAppnavProps> & React.RefAttributes<HTMLElement>>;
4
+ export default _default;
@@ -0,0 +1,21 @@
1
+ 'use client';
2
+ import * as React from 'react';
3
+ import { createComponent } from '@lit/react';
4
+ import { SgdsAppnav } from '../components/Appnav/sgds-appnav.js';
5
+ import { register } from '../utils/ce-registry.js';
6
+
7
+ register("sgds-appnav", SgdsAppnav);
8
+ var index = createComponent({
9
+ react: React,
10
+ tagName: "sgds-appnav",
11
+ elementClass: SgdsAppnav,
12
+ events: {
13
+ onSgdsShow: "sgds-show",
14
+ onSgdsAfterShow: "sgds-after-show",
15
+ onSgdsHide: "sgds-hide",
16
+ onSgdsAfterHide: "sgds-after-hide"
17
+ }
18
+ });
19
+
20
+ export { index as default };
21
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sources":["../../../src/react/appnav/index.ts"],"sourcesContent":["import * as React from \"react\";\nimport { createComponent } from \"@lit/react\";\nimport Component from \"../../components/Appnav/sgds-appnav\";\nimport { register } from \"../../utils/ce-registry\";\n\nregister(\"sgds-appnav\", Component);\n\nexport default createComponent({\n react: React,\n tagName: \"sgds-appnav\",\n elementClass: Component,\n events: {\n onSgdsShow: \"sgds-show\",\n onSgdsAfterShow: \"sgds-after-show\",\n onSgdsHide: \"sgds-hide\",\n onSgdsAfterHide: \"sgds-after-hide\"\n }\n});\n"],"names":["Component"],"mappings":";;;;;;AAKA,QAAQ,CAAC,aAAa,EAAEA,UAAS,CAAC,CAAC;AAEnC,YAAe,eAAe,CAAC;AAC7B,IAAA,KAAK,EAAE,KAAK;AACZ,IAAA,OAAO,EAAE,aAAa;AACtB,IAAA,YAAY,EAAEA,UAAS;AACvB,IAAA,MAAM,EAAE;AACN,QAAA,UAAU,EAAE,WAAW;AACvB,QAAA,eAAe,EAAE,iBAAiB;AAClC,QAAA,UAAU,EAAE,WAAW;AACvB,QAAA,eAAe,EAAE,iBAAiB;AACnC,KAAA;AACF,CAAA,CAAC;;;;"}
@@ -0,0 +1,40 @@
1
+ 'use client';
2
+ 'use strict';
3
+
4
+ Object.defineProperty(exports, '__esModule', { value: true });
5
+
6
+ var React = require('react');
7
+ var react = require('@lit/react');
8
+ var sgdsAppnavProfile = require('../components/Appnav/sgds-appnav-profile.cjs.js');
9
+ var ceRegistry = require('../utils/ce-registry.cjs.js');
10
+
11
+ function _interopNamespace(e) {
12
+ if (e && e.__esModule) return e;
13
+ var n = Object.create(null);
14
+ if (e) {
15
+ Object.keys(e).forEach(function (k) {
16
+ if (k !== 'default') {
17
+ var d = Object.getOwnPropertyDescriptor(e, k);
18
+ Object.defineProperty(n, k, d.get ? d : {
19
+ enumerable: true,
20
+ get: function () { return e[k]; }
21
+ });
22
+ }
23
+ });
24
+ }
25
+ n["default"] = e;
26
+ return Object.freeze(n);
27
+ }
28
+
29
+ var React__namespace = /*#__PURE__*/_interopNamespace(React);
30
+
31
+ ceRegistry.register("sgds-appnav-profile", sgdsAppnavProfile.SgdsAppnavProfile);
32
+ var index = react.createComponent({
33
+ react: React__namespace,
34
+ tagName: "sgds-appnav-profile",
35
+ elementClass: sgdsAppnavProfile.SgdsAppnavProfile,
36
+ events: {}
37
+ });
38
+
39
+ exports["default"] = index;
40
+ //# sourceMappingURL=index.cjs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.cjs.js","sources":["../../../src/react/appnav-profile/index.ts"],"sourcesContent":["import * as React from \"react\";\nimport { createComponent } from \"@lit/react\";\nimport Component from \"../../components/Appnav/sgds-appnav-profile\";\nimport { register } from \"../../utils/ce-registry\";\n\nregister(\"sgds-appnav-profile\", Component);\n\nexport default createComponent({\n react: React,\n tagName: \"sgds-appnav-profile\",\n elementClass: Component,\n events: {}\n});\n"],"names":["register","Component","createComponent","React"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAKAA,mBAAQ,CAAC,qBAAqB,EAAEC,mCAAS,CAAC,CAAC;AAE3C,YAAeC,qBAAe,CAAC;AAC7B,IAAA,KAAK,EAAEC,gBAAK;AACZ,IAAA,OAAO,EAAE,qBAAqB;AAC9B,IAAA,YAAY,EAAEF,mCAAS;AACvB,IAAA,MAAM,EAAE,EAAE;AACX,CAAA,CAAC;;;;"}
@@ -0,0 +1,4 @@
1
+ import type { SgdsAppnavProfileProps } from '../../types/react';
2
+ import * as React from 'react';
3
+ declare const _default: React.ForwardRefExoticComponent<React.PropsWithChildren<SgdsAppnavProfileProps> & React.RefAttributes<HTMLElement>>;
4
+ export default _default;
@@ -0,0 +1,16 @@
1
+ 'use client';
2
+ import * as React from 'react';
3
+ import { createComponent } from '@lit/react';
4
+ import { SgdsAppnavProfile } from '../components/Appnav/sgds-appnav-profile.js';
5
+ import { register } from '../utils/ce-registry.js';
6
+
7
+ register("sgds-appnav-profile", SgdsAppnavProfile);
8
+ var index = createComponent({
9
+ react: React,
10
+ tagName: "sgds-appnav-profile",
11
+ elementClass: SgdsAppnavProfile,
12
+ events: {}
13
+ });
14
+
15
+ export { index as default };
16
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sources":["../../../src/react/appnav-profile/index.ts"],"sourcesContent":["import * as React from \"react\";\nimport { createComponent } from \"@lit/react\";\nimport Component from \"../../components/Appnav/sgds-appnav-profile\";\nimport { register } from \"../../utils/ce-registry\";\n\nregister(\"sgds-appnav-profile\", Component);\n\nexport default createComponent({\n react: React,\n tagName: \"sgds-appnav-profile\",\n elementClass: Component,\n events: {}\n});\n"],"names":["Component"],"mappings":";;;;;;AAKA,QAAQ,CAAC,qBAAqB,EAAEA,iBAAS,CAAC,CAAC;AAE3C,YAAe,eAAe,CAAC;AAC7B,IAAA,KAAK,EAAE,KAAK;AACZ,IAAA,OAAO,EAAE,qBAAqB;AAC9B,IAAA,YAAY,EAAEA,iBAAS;AACvB,IAAA,MAAM,EAAE,EAAE;AACX,CAAA,CAAC;;;;"}
@@ -11,6 +11,7 @@ const TAB = "Tab";
11
11
  const ARROW_DOWN = "ArrowDown";
12
12
  const ARROW_UP = "ArrowUp";
13
13
  const ENTER = "Enter";
14
+ const ESCAPE = "Escape";
14
15
  /**
15
16
  * @event sgds-select - Emitted when a dropdown item is selected. `event.detail.item` is the clicked `SgdsDropdownItem` element.
16
17
  */
@@ -88,6 +89,12 @@ class DropdownListElement extends dropdownElement.DropdownElement {
88
89
  this._setMenuItem(this.nextDropdownItemNo);
89
90
  }
90
91
  break;
92
+ case ESCAPE:
93
+ if (this.menuIsOpen) {
94
+ e.preventDefault();
95
+ this.hideMenu();
96
+ }
97
+ break;
91
98
  case ENTER: {
92
99
  const target = menuItems.find(item => e.composedPath().includes(item));
93
100
  if (target) {
@@ -104,7 +111,7 @@ class DropdownListElement extends dropdownElement.DropdownElement {
104
111
  if (defaultSlot) {
105
112
  const defaultSlotItems = (_a = this.shadowRoot.querySelector("slot#default")) === null || _a === void 0 ? void 0 : _a.assignedElements({
106
113
  flatten: true
107
- }).filter(el => !el.classList.contains("empty-menu") && !el.hasAttribute("hidden"));
114
+ }).filter(el => el.getAttribute("role") === "menuitem" && !el.classList.contains("empty-menu") && !el.hasAttribute("hidden"));
108
115
  return defaultSlotItems;
109
116
  }
110
117
  // for case when there is no slot e.g. combobox
@@ -115,7 +122,7 @@ class DropdownListElement extends dropdownElement.DropdownElement {
115
122
  return [];
116
123
  }
117
124
  _getActiveMenuItems() {
118
- return this._getMenuItems().filter(item => !item.disabled && !item.hidden);
125
+ return this._getMenuItems().filter(item => !item.disabled && !item.hidden && !item.readonly);
119
126
  }
120
127
  _setMenuItem(currentItemIdx) {
121
128
  const items = this._getActiveMenuItems();
@@ -1 +1 @@
1
- {"version":3,"file":"dropdown-list-element.cjs.js","sources":["../../../src/base/dropdown-list-element.ts"],"sourcesContent":["import { property, query, state } from \"lit/decorators.js\";\nimport { DropdownElement } from \"./dropdown-element\";\nimport { SgdsDropdownItem } from \"../components\";\nimport { PropertyValueMap } from \"lit\";\n\nconst TAB = \"Tab\";\nconst ARROW_DOWN = \"ArrowDown\";\nconst ARROW_UP = \"ArrowUp\";\nconst ENTER = \"Enter\";\n\n/**\n * @event sgds-select - Emitted when a dropdown item is selected. `event.detail.item` is the clicked `SgdsDropdownItem` element.\n */\nexport class DropdownListElement extends DropdownElement {\n static styles = DropdownElement.styles;\n\n /**@internal */\n @query(\"ul.dropdown-menu\")\n private menu: HTMLUListElement;\n\n /** @internal */\n @state()\n nextDropdownItemNo = 0;\n\n /** @internal */\n @state()\n prevDropdownItemNo = -1;\n\n @property({ type: Boolean, reflect: true })\n hidden = false;\n\n connectedCallback() {\n super.connectedCallback();\n this.addEventListener(\"sgds-hide\", this._resetMenu);\n }\n\n disconnectedCallback() {\n super.disconnectedCallback();\n this.removeEventListener(\"sgds-hide\", this._resetMenu);\n }\n\n firstUpdated(changedProperties: PropertyValueMap<this>) {\n super.firstUpdated(changedProperties);\n this.addEventListener(\"keydown\", this._handleKeyboardMenuItemsEvent);\n }\n\n protected handleSelectSlot(e: KeyboardEvent | MouseEvent) {\n const items = this._getActiveMenuItems();\n\n const selectedItem = items.find(item => e.composedPath().includes(item));\n if (!selectedItem) return;\n\n const currentItemNo = items.indexOf(selectedItem);\n this.nextDropdownItemNo = currentItemNo + 1;\n this.prevDropdownItemNo = currentItemNo <= 0 ? items.length - 1 : currentItemNo - 1;\n\n /** Emitted event from SgdsDropdown element when a slot item is selected */\n if (!selectedItem.disabled) {\n this.emit(\"sgds-select\", { detail: { item: selectedItem } });\n if (this.close !== \"outside\") {\n this.hideMenu(); // <-- Use new API\n }\n }\n }\n\n private _resetMenu() {\n this.nextDropdownItemNo = 0;\n this.prevDropdownItemNo = -1;\n // reset the tabindex\n const items = this._getMenuItems();\n items.forEach(item => {\n const dropdownItem = item?.shadowRoot?.querySelector(\".dropdown-item\") as HTMLAnchorElement;\n dropdownItem && dropdownItem.removeAttribute(\"tabindex\");\n });\n }\n protected _handleKeyboardMenuItemsEvent(e: KeyboardEvent) {\n if (this.readonly) return;\n const menuItems = this._getActiveMenuItems();\n if (menuItems.length === 0) return;\n\n switch (e.key) {\n case ARROW_DOWN:\n e.preventDefault();\n this._setMenuItem(this.nextDropdownItemNo);\n break;\n case ARROW_UP:\n e.preventDefault();\n this._setMenuItem(this.prevDropdownItemNo);\n break;\n case TAB:\n if (!this.menuIsOpen) return;\n e.preventDefault();\n if (e.shiftKey) {\n this._setMenuItem(this.prevDropdownItemNo);\n } else {\n this._setMenuItem(this.nextDropdownItemNo);\n }\n break;\n case ENTER: {\n const target = menuItems.find(item => e.composedPath().includes(item));\n if (target) {\n this.handleSelectSlot(e);\n }\n break;\n }\n default:\n break;\n }\n }\n\n private _getMenuItems(): SgdsDropdownItem[] {\n const defaultSlot = this.shadowRoot.querySelector(\"slot#default\");\n // for case when default slot is used e.g. dropdown, mainnavdropdown\n if (defaultSlot) {\n const defaultSlotItems = (this.shadowRoot.querySelector(\"slot#default\") as HTMLSlotElement)\n ?.assignedElements({\n flatten: true\n })\n .filter(el => !el.classList.contains(\"empty-menu\") && !el.hasAttribute(\"hidden\")) as SgdsDropdownItem[];\n return defaultSlotItems;\n }\n // for case when there is no slot e.g. combobox\n if (this.menu?.hasChildNodes()) {\n const menuItems = Array.from(this.menu.children);\n return [...menuItems] as SgdsDropdownItem[];\n }\n\n return [];\n }\n\n private _getActiveMenuItems(): SgdsDropdownItem[] {\n return this._getMenuItems().filter(item => !item.disabled && !item.hidden);\n }\n private _setMenuItem(currentItemIdx: number) {\n const items = this._getActiveMenuItems();\n if (items.length === 0) return;\n\n // Use modulo for looping\n const idx = ((currentItemIdx % items.length) + items.length) % items.length;\n const activeItem = items[idx];\n this.emit(\"i-sgds-option-focus\", { detail: { option: activeItem } });\n this.nextDropdownItemNo = (idx + 1) % items.length;\n this.prevDropdownItemNo = (idx - 1 + items.length) % items.length;\n\n items.forEach(item => {\n const dropdownItem = item.shadowRoot.querySelector(\".dropdown-item\") as HTMLAnchorElement;\n dropdownItem.setAttribute(\"tabindex\", item === activeItem ? \"0\" : \"-1\");\n if (item === activeItem) dropdownItem.focus();\n });\n }\n}\n\nexport interface IDropdownListElement {\n item: SgdsDropdownItem;\n}\n"],"names":["DropdownElement","__decorate","query","state","property"],"mappings":"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"}
1
+ {"version":3,"file":"dropdown-list-element.cjs.js","sources":["../../../src/base/dropdown-list-element.ts"],"sourcesContent":["import { property, query, state } from \"lit/decorators.js\";\nimport { DropdownElement } from \"./dropdown-element\";\nimport { SgdsDropdownItem } from \"../components\";\nimport { PropertyValueMap } from \"lit\";\n\nconst TAB = \"Tab\";\nconst ARROW_DOWN = \"ArrowDown\";\nconst ARROW_UP = \"ArrowUp\";\nconst ENTER = \"Enter\";\nconst ESCAPE = \"Escape\";\n\n/**\n * @event sgds-select - Emitted when a dropdown item is selected. `event.detail.item` is the clicked `SgdsDropdownItem` element.\n */\nexport class DropdownListElement extends DropdownElement {\n static styles = DropdownElement.styles;\n\n /**@internal */\n @query(\"ul.dropdown-menu\")\n private menu: HTMLUListElement;\n\n /** @internal */\n @state()\n nextDropdownItemNo = 0;\n\n /** @internal */\n @state()\n prevDropdownItemNo = -1;\n\n @property({ type: Boolean, reflect: true })\n hidden = false;\n\n connectedCallback() {\n super.connectedCallback();\n this.addEventListener(\"sgds-hide\", this._resetMenu);\n }\n\n disconnectedCallback() {\n super.disconnectedCallback();\n this.removeEventListener(\"sgds-hide\", this._resetMenu);\n }\n\n firstUpdated(changedProperties: PropertyValueMap<this>) {\n super.firstUpdated(changedProperties);\n this.addEventListener(\"keydown\", this._handleKeyboardMenuItemsEvent);\n }\n\n protected handleSelectSlot(e: KeyboardEvent | MouseEvent) {\n const items = this._getActiveMenuItems();\n\n const selectedItem = items.find(item => e.composedPath().includes(item));\n if (!selectedItem) return;\n\n const currentItemNo = items.indexOf(selectedItem);\n this.nextDropdownItemNo = currentItemNo + 1;\n this.prevDropdownItemNo = currentItemNo <= 0 ? items.length - 1 : currentItemNo - 1;\n\n /** Emitted event from SgdsDropdown element when a slot item is selected */\n if (!selectedItem.disabled) {\n this.emit(\"sgds-select\", { detail: { item: selectedItem } });\n if (this.close !== \"outside\") {\n this.hideMenu(); // <-- Use new API\n }\n }\n }\n\n private _resetMenu() {\n this.nextDropdownItemNo = 0;\n this.prevDropdownItemNo = -1;\n // reset the tabindex\n const items = this._getMenuItems();\n items.forEach(item => {\n const dropdownItem = item?.shadowRoot?.querySelector(\".dropdown-item\") as HTMLAnchorElement;\n dropdownItem && dropdownItem.removeAttribute(\"tabindex\");\n });\n }\n protected _handleKeyboardMenuItemsEvent(e: KeyboardEvent) {\n if (this.readonly) return;\n const menuItems = this._getActiveMenuItems();\n if (menuItems.length === 0) return;\n\n switch (e.key) {\n case ARROW_DOWN:\n e.preventDefault();\n this._setMenuItem(this.nextDropdownItemNo);\n break;\n case ARROW_UP:\n e.preventDefault();\n this._setMenuItem(this.prevDropdownItemNo);\n break;\n case TAB:\n if (!this.menuIsOpen) return;\n e.preventDefault();\n if (e.shiftKey) {\n this._setMenuItem(this.prevDropdownItemNo);\n } else {\n this._setMenuItem(this.nextDropdownItemNo);\n }\n break;\n case ESCAPE:\n if (this.menuIsOpen) {\n e.preventDefault();\n this.hideMenu();\n }\n break;\n case ENTER: {\n const target = menuItems.find(item => e.composedPath().includes(item));\n if (target) {\n this.handleSelectSlot(e);\n }\n break;\n }\n default:\n break;\n }\n }\n\n private _getMenuItems(): SgdsDropdownItem[] {\n const defaultSlot = this.shadowRoot.querySelector(\"slot#default\");\n // for case when default slot is used e.g. dropdown, mainnavdropdown\n if (defaultSlot) {\n const defaultSlotItems = (this.shadowRoot.querySelector(\"slot#default\") as HTMLSlotElement)\n ?.assignedElements({\n flatten: true\n })\n .filter(\n el =>\n el.getAttribute(\"role\") === \"menuitem\" && !el.classList.contains(\"empty-menu\") && !el.hasAttribute(\"hidden\")\n ) as SgdsDropdownItem[];\n return defaultSlotItems;\n }\n // for case when there is no slot e.g. combobox\n if (this.menu?.hasChildNodes()) {\n const menuItems = Array.from(this.menu.children);\n return [...menuItems] as SgdsDropdownItem[];\n }\n\n return [];\n }\n\n private _getActiveMenuItems(): SgdsDropdownItem[] {\n return this._getMenuItems().filter(item => !item.disabled && !item.hidden && !item.readonly);\n }\n private _setMenuItem(currentItemIdx: number) {\n const items = this._getActiveMenuItems();\n if (items.length === 0) return;\n\n // Use modulo for looping\n const idx = ((currentItemIdx % items.length) + items.length) % items.length;\n const activeItem = items[idx];\n this.emit(\"i-sgds-option-focus\", { detail: { option: activeItem } });\n this.nextDropdownItemNo = (idx + 1) % items.length;\n this.prevDropdownItemNo = (idx - 1 + items.length) % items.length;\n\n items.forEach(item => {\n const dropdownItem = item.shadowRoot.querySelector(\".dropdown-item\") as HTMLAnchorElement;\n dropdownItem.setAttribute(\"tabindex\", item === activeItem ? \"0\" : \"-1\");\n if (item === activeItem) dropdownItem.focus();\n });\n }\n}\n\nexport interface IDropdownListElement {\n item: SgdsDropdownItem;\n}\n"],"names":["DropdownElement","__decorate","query","state","property"],"mappings":"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"}
@@ -7,6 +7,7 @@ const TAB = "Tab";
7
7
  const ARROW_DOWN = "ArrowDown";
8
8
  const ARROW_UP = "ArrowUp";
9
9
  const ENTER = "Enter";
10
+ const ESCAPE = "Escape";
10
11
  /**
11
12
  * @event sgds-select - Emitted when a dropdown item is selected. `event.detail.item` is the clicked `SgdsDropdownItem` element.
12
13
  */
@@ -84,6 +85,12 @@ class DropdownListElement extends DropdownElement {
84
85
  this._setMenuItem(this.nextDropdownItemNo);
85
86
  }
86
87
  break;
88
+ case ESCAPE:
89
+ if (this.menuIsOpen) {
90
+ e.preventDefault();
91
+ this.hideMenu();
92
+ }
93
+ break;
87
94
  case ENTER: {
88
95
  const target = menuItems.find(item => e.composedPath().includes(item));
89
96
  if (target) {
@@ -100,7 +107,7 @@ class DropdownListElement extends DropdownElement {
100
107
  if (defaultSlot) {
101
108
  const defaultSlotItems = (_a = this.shadowRoot.querySelector("slot#default")) === null || _a === void 0 ? void 0 : _a.assignedElements({
102
109
  flatten: true
103
- }).filter(el => !el.classList.contains("empty-menu") && !el.hasAttribute("hidden"));
110
+ }).filter(el => el.getAttribute("role") === "menuitem" && !el.classList.contains("empty-menu") && !el.hasAttribute("hidden"));
104
111
  return defaultSlotItems;
105
112
  }
106
113
  // for case when there is no slot e.g. combobox
@@ -111,7 +118,7 @@ class DropdownListElement extends DropdownElement {
111
118
  return [];
112
119
  }
113
120
  _getActiveMenuItems() {
114
- return this._getMenuItems().filter(item => !item.disabled && !item.hidden);
121
+ return this._getMenuItems().filter(item => !item.disabled && !item.hidden && !item.readonly);
115
122
  }
116
123
  _setMenuItem(currentItemIdx) {
117
124
  const items = this._getActiveMenuItems();
@@ -1 +1 @@
1
- {"version":3,"file":"dropdown-list-element.js","sources":["../../../src/base/dropdown-list-element.ts"],"sourcesContent":["import { property, query, state } from \"lit/decorators.js\";\nimport { DropdownElement } from \"./dropdown-element\";\nimport { SgdsDropdownItem } from \"../components\";\nimport { PropertyValueMap } from \"lit\";\n\nconst TAB = \"Tab\";\nconst ARROW_DOWN = \"ArrowDown\";\nconst ARROW_UP = \"ArrowUp\";\nconst ENTER = \"Enter\";\n\n/**\n * @event sgds-select - Emitted when a dropdown item is selected. `event.detail.item` is the clicked `SgdsDropdownItem` element.\n */\nexport class DropdownListElement extends DropdownElement {\n static styles = DropdownElement.styles;\n\n /**@internal */\n @query(\"ul.dropdown-menu\")\n private menu: HTMLUListElement;\n\n /** @internal */\n @state()\n nextDropdownItemNo = 0;\n\n /** @internal */\n @state()\n prevDropdownItemNo = -1;\n\n @property({ type: Boolean, reflect: true })\n hidden = false;\n\n connectedCallback() {\n super.connectedCallback();\n this.addEventListener(\"sgds-hide\", this._resetMenu);\n }\n\n disconnectedCallback() {\n super.disconnectedCallback();\n this.removeEventListener(\"sgds-hide\", this._resetMenu);\n }\n\n firstUpdated(changedProperties: PropertyValueMap<this>) {\n super.firstUpdated(changedProperties);\n this.addEventListener(\"keydown\", this._handleKeyboardMenuItemsEvent);\n }\n\n protected handleSelectSlot(e: KeyboardEvent | MouseEvent) {\n const items = this._getActiveMenuItems();\n\n const selectedItem = items.find(item => e.composedPath().includes(item));\n if (!selectedItem) return;\n\n const currentItemNo = items.indexOf(selectedItem);\n this.nextDropdownItemNo = currentItemNo + 1;\n this.prevDropdownItemNo = currentItemNo <= 0 ? items.length - 1 : currentItemNo - 1;\n\n /** Emitted event from SgdsDropdown element when a slot item is selected */\n if (!selectedItem.disabled) {\n this.emit(\"sgds-select\", { detail: { item: selectedItem } });\n if (this.close !== \"outside\") {\n this.hideMenu(); // <-- Use new API\n }\n }\n }\n\n private _resetMenu() {\n this.nextDropdownItemNo = 0;\n this.prevDropdownItemNo = -1;\n // reset the tabindex\n const items = this._getMenuItems();\n items.forEach(item => {\n const dropdownItem = item?.shadowRoot?.querySelector(\".dropdown-item\") as HTMLAnchorElement;\n dropdownItem && dropdownItem.removeAttribute(\"tabindex\");\n });\n }\n protected _handleKeyboardMenuItemsEvent(e: KeyboardEvent) {\n if (this.readonly) return;\n const menuItems = this._getActiveMenuItems();\n if (menuItems.length === 0) return;\n\n switch (e.key) {\n case ARROW_DOWN:\n e.preventDefault();\n this._setMenuItem(this.nextDropdownItemNo);\n break;\n case ARROW_UP:\n e.preventDefault();\n this._setMenuItem(this.prevDropdownItemNo);\n break;\n case TAB:\n if (!this.menuIsOpen) return;\n e.preventDefault();\n if (e.shiftKey) {\n this._setMenuItem(this.prevDropdownItemNo);\n } else {\n this._setMenuItem(this.nextDropdownItemNo);\n }\n break;\n case ENTER: {\n const target = menuItems.find(item => e.composedPath().includes(item));\n if (target) {\n this.handleSelectSlot(e);\n }\n break;\n }\n default:\n break;\n }\n }\n\n private _getMenuItems(): SgdsDropdownItem[] {\n const defaultSlot = this.shadowRoot.querySelector(\"slot#default\");\n // for case when default slot is used e.g. dropdown, mainnavdropdown\n if (defaultSlot) {\n const defaultSlotItems = (this.shadowRoot.querySelector(\"slot#default\") as HTMLSlotElement)\n ?.assignedElements({\n flatten: true\n })\n .filter(el => !el.classList.contains(\"empty-menu\") && !el.hasAttribute(\"hidden\")) as SgdsDropdownItem[];\n return defaultSlotItems;\n }\n // for case when there is no slot e.g. combobox\n if (this.menu?.hasChildNodes()) {\n const menuItems = Array.from(this.menu.children);\n return [...menuItems] as SgdsDropdownItem[];\n }\n\n return [];\n }\n\n private _getActiveMenuItems(): SgdsDropdownItem[] {\n return this._getMenuItems().filter(item => !item.disabled && !item.hidden);\n }\n private _setMenuItem(currentItemIdx: number) {\n const items = this._getActiveMenuItems();\n if (items.length === 0) return;\n\n // Use modulo for looping\n const idx = ((currentItemIdx % items.length) + items.length) % items.length;\n const activeItem = items[idx];\n this.emit(\"i-sgds-option-focus\", { detail: { option: activeItem } });\n this.nextDropdownItemNo = (idx + 1) % items.length;\n this.prevDropdownItemNo = (idx - 1 + items.length) % items.length;\n\n items.forEach(item => {\n const dropdownItem = item.shadowRoot.querySelector(\".dropdown-item\") as HTMLAnchorElement;\n dropdownItem.setAttribute(\"tabindex\", item === activeItem ? \"0\" : \"-1\");\n if (item === activeItem) dropdownItem.focus();\n });\n }\n}\n\nexport interface IDropdownListElement {\n item: SgdsDropdownItem;\n}\n"],"names":[],"mappings":";;;;;AAKA,MAAM,GAAG,GAAG,KAAK,CAAC;AAClB,MAAM,UAAU,GAAG,WAAW,CAAC;AAC/B,MAAM,QAAQ,GAAG,SAAS,CAAC;AAC3B,MAAM,KAAK,GAAG,OAAO,CAAC;AAEtB;;AAEG;AACG,MAAO,mBAAoB,SAAQ,eAAe,CAAA;AAAxD,IAAA,WAAA,GAAA;;;QASE,IAAkB,CAAA,kBAAA,GAAG,CAAC,CAAC;;QAIvB,IAAkB,CAAA,kBAAA,GAAG,CAAC,CAAC,CAAC;QAGxB,IAAM,CAAA,MAAA,GAAG,KAAK,CAAC;KAyHhB;IAvHC,iBAAiB,GAAA;QACf,KAAK,CAAC,iBAAiB,EAAE,CAAC;QAC1B,IAAI,CAAC,gBAAgB,CAAC,WAAW,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;KACrD;IAED,oBAAoB,GAAA;QAClB,KAAK,CAAC,oBAAoB,EAAE,CAAC;QAC7B,IAAI,CAAC,mBAAmB,CAAC,WAAW,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;KACxD;AAED,IAAA,YAAY,CAAC,iBAAyC,EAAA;AACpD,QAAA,KAAK,CAAC,YAAY,CAAC,iBAAiB,CAAC,CAAC;QACtC,IAAI,CAAC,gBAAgB,CAAC,SAAS,EAAE,IAAI,CAAC,6BAA6B,CAAC,CAAC;KACtE;AAES,IAAA,gBAAgB,CAAC,CAA6B,EAAA;AACtD,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,mBAAmB,EAAE,CAAC;QAEzC,MAAM,YAAY,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,CAAC,YAAY,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC;AACzE,QAAA,IAAI,CAAC,YAAY;YAAE,OAAO;QAE1B,MAAM,aAAa,GAAG,KAAK,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;AAClD,QAAA,IAAI,CAAC,kBAAkB,GAAG,aAAa,GAAG,CAAC,CAAC;QAC5C,IAAI,CAAC,kBAAkB,GAAG,aAAa,IAAI,CAAC,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,GAAG,aAAa,GAAG,CAAC,CAAC;;AAGpF,QAAA,IAAI,CAAC,YAAY,CAAC,QAAQ,EAAE;AAC1B,YAAA,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,YAAY,EAAE,EAAE,CAAC,CAAC;AAC7D,YAAA,IAAI,IAAI,CAAC,KAAK,KAAK,SAAS,EAAE;AAC5B,gBAAA,IAAI,CAAC,QAAQ,EAAE,CAAC;aACjB;SACF;KACF;IAEO,UAAU,GAAA;AAChB,QAAA,IAAI,CAAC,kBAAkB,GAAG,CAAC,CAAC;AAC5B,QAAA,IAAI,CAAC,kBAAkB,GAAG,CAAC,CAAC,CAAC;;AAE7B,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,aAAa,EAAE,CAAC;AACnC,QAAA,KAAK,CAAC,OAAO,CAAC,IAAI,IAAG;;AACnB,YAAA,MAAM,YAAY,GAAG,CAAA,EAAA,GAAA,IAAI,aAAJ,IAAI,KAAA,KAAA,CAAA,GAAA,KAAA,CAAA,GAAJ,IAAI,CAAE,UAAU,MAAE,IAAA,IAAA,EAAA,KAAA,KAAA,CAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAA,aAAa,CAAC,gBAAgB,CAAsB,CAAC;AAC5F,YAAA,YAAY,IAAI,YAAY,CAAC,eAAe,CAAC,UAAU,CAAC,CAAC;AAC3D,SAAC,CAAC,CAAC;KACJ;AACS,IAAA,6BAA6B,CAAC,CAAgB,EAAA;QACtD,IAAI,IAAI,CAAC,QAAQ;YAAE,OAAO;AAC1B,QAAA,MAAM,SAAS,GAAG,IAAI,CAAC,mBAAmB,EAAE,CAAC;AAC7C,QAAA,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO;AAEnC,QAAA,QAAQ,CAAC,CAAC,GAAG;AACX,YAAA,KAAK,UAAU;gBACb,CAAC,CAAC,cAAc,EAAE,CAAC;AACnB,gBAAA,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;gBAC3C,MAAM;AACR,YAAA,KAAK,QAAQ;gBACX,CAAC,CAAC,cAAc,EAAE,CAAC;AACnB,gBAAA,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;gBAC3C,MAAM;AACR,YAAA,KAAK,GAAG;gBACN,IAAI,CAAC,IAAI,CAAC,UAAU;oBAAE,OAAO;gBAC7B,CAAC,CAAC,cAAc,EAAE,CAAC;AACnB,gBAAA,IAAI,CAAC,CAAC,QAAQ,EAAE;AACd,oBAAA,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;iBAC5C;qBAAM;AACL,oBAAA,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;iBAC5C;gBACD,MAAM;YACR,KAAK,KAAK,EAAE;gBACV,MAAM,MAAM,GAAG,SAAS,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,CAAC,YAAY,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC;gBACvE,IAAI,MAAM,EAAE;AACV,oBAAA,IAAI,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC;iBAC1B;gBACD,MAAM;aACP;SAGF;KACF;IAEO,aAAa,GAAA;;QACnB,MAAM,WAAW,GAAG,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,cAAc,CAAC,CAAC;;QAElE,IAAI,WAAW,EAAE;AACf,YAAA,MAAM,gBAAgB,GAAG,CAAC,EAAA,GAAA,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,cAAc,CAAqB,MAAA,IAAA,IAAA,EAAA,KAAA,KAAA,CAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CACvF,gBAAgB,CAAC;AACjB,gBAAA,OAAO,EAAE,IAAI;aACd,CACA,CAAA,MAAM,CAAC,EAAE,IAAI,CAAC,EAAE,CAAC,SAAS,CAAC,QAAQ,CAAC,YAAY,CAAC,IAAI,CAAC,EAAE,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAuB,CAAC;AAC1G,YAAA,OAAO,gBAAgB,CAAC;SACzB;;QAED,IAAI,CAAA,EAAA,GAAA,IAAI,CAAC,IAAI,0CAAE,aAAa,EAAE,EAAE;AAC9B,YAAA,MAAM,SAAS,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;AACjD,YAAA,OAAO,CAAC,GAAG,SAAS,CAAuB,CAAC;SAC7C;AAED,QAAA,OAAO,EAAE,CAAC;KACX;IAEO,mBAAmB,GAAA;QACzB,OAAO,IAAI,CAAC,aAAa,EAAE,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,QAAQ,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;KAC5E;AACO,IAAA,YAAY,CAAC,cAAsB,EAAA;AACzC,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,mBAAmB,EAAE,CAAC;AACzC,QAAA,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO;;AAG/B,QAAA,MAAM,GAAG,GAAG,CAAC,CAAC,cAAc,GAAG,KAAK,CAAC,MAAM,IAAI,KAAK,CAAC,MAAM,IAAI,KAAK,CAAC,MAAM,CAAC;AAC5E,QAAA,MAAM,UAAU,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC;AAC9B,QAAA,IAAI,CAAC,IAAI,CAAC,qBAAqB,EAAE,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,EAAE,CAAC,CAAC;AACrE,QAAA,IAAI,CAAC,kBAAkB,GAAG,CAAC,GAAG,GAAG,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC;AACnD,QAAA,IAAI,CAAC,kBAAkB,GAAG,CAAC,GAAG,GAAG,CAAC,GAAG,KAAK,CAAC,MAAM,IAAI,KAAK,CAAC,MAAM,CAAC;AAElE,QAAA,KAAK,CAAC,OAAO,CAAC,IAAI,IAAG;YACnB,MAAM,YAAY,GAAG,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,gBAAgB,CAAsB,CAAC;AAC1F,YAAA,YAAY,CAAC,YAAY,CAAC,UAAU,EAAE,IAAI,KAAK,UAAU,GAAG,GAAG,GAAG,IAAI,CAAC,CAAC;YACxE,IAAI,IAAI,KAAK,UAAU;gBAAE,YAAY,CAAC,KAAK,EAAE,CAAC;AAChD,SAAC,CAAC,CAAC;KACJ;;AAvIM,mBAAA,CAAA,MAAM,GAAG,eAAe,CAAC,MAAM,CAAC;AAI/B,UAAA,CAAA;IADP,KAAK,CAAC,kBAAkB,CAAC;AACK,CAAA,EAAA,mBAAA,CAAA,SAAA,EAAA,MAAA,EAAA,KAAA,CAAA,CAAA,CAAA;AAI/B,UAAA,CAAA;AADC,IAAA,KAAK,EAAE;AACe,CAAA,EAAA,mBAAA,CAAA,SAAA,EAAA,oBAAA,EAAA,KAAA,CAAA,CAAA,CAAA;AAIvB,UAAA,CAAA;AADC,IAAA,KAAK,EAAE;AACgB,CAAA,EAAA,mBAAA,CAAA,SAAA,EAAA,oBAAA,EAAA,KAAA,CAAA,CAAA,CAAA;AAGxB,UAAA,CAAA;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;AAC5B,CAAA,EAAA,mBAAA,CAAA,SAAA,EAAA,QAAA,EAAA,KAAA,CAAA,CAAA;;;;"}
1
+ {"version":3,"file":"dropdown-list-element.js","sources":["../../../src/base/dropdown-list-element.ts"],"sourcesContent":["import { property, query, state } from \"lit/decorators.js\";\nimport { DropdownElement } from \"./dropdown-element\";\nimport { SgdsDropdownItem } from \"../components\";\nimport { PropertyValueMap } from \"lit\";\n\nconst TAB = \"Tab\";\nconst ARROW_DOWN = \"ArrowDown\";\nconst ARROW_UP = \"ArrowUp\";\nconst ENTER = \"Enter\";\nconst ESCAPE = \"Escape\";\n\n/**\n * @event sgds-select - Emitted when a dropdown item is selected. `event.detail.item` is the clicked `SgdsDropdownItem` element.\n */\nexport class DropdownListElement extends DropdownElement {\n static styles = DropdownElement.styles;\n\n /**@internal */\n @query(\"ul.dropdown-menu\")\n private menu: HTMLUListElement;\n\n /** @internal */\n @state()\n nextDropdownItemNo = 0;\n\n /** @internal */\n @state()\n prevDropdownItemNo = -1;\n\n @property({ type: Boolean, reflect: true })\n hidden = false;\n\n connectedCallback() {\n super.connectedCallback();\n this.addEventListener(\"sgds-hide\", this._resetMenu);\n }\n\n disconnectedCallback() {\n super.disconnectedCallback();\n this.removeEventListener(\"sgds-hide\", this._resetMenu);\n }\n\n firstUpdated(changedProperties: PropertyValueMap<this>) {\n super.firstUpdated(changedProperties);\n this.addEventListener(\"keydown\", this._handleKeyboardMenuItemsEvent);\n }\n\n protected handleSelectSlot(e: KeyboardEvent | MouseEvent) {\n const items = this._getActiveMenuItems();\n\n const selectedItem = items.find(item => e.composedPath().includes(item));\n if (!selectedItem) return;\n\n const currentItemNo = items.indexOf(selectedItem);\n this.nextDropdownItemNo = currentItemNo + 1;\n this.prevDropdownItemNo = currentItemNo <= 0 ? items.length - 1 : currentItemNo - 1;\n\n /** Emitted event from SgdsDropdown element when a slot item is selected */\n if (!selectedItem.disabled) {\n this.emit(\"sgds-select\", { detail: { item: selectedItem } });\n if (this.close !== \"outside\") {\n this.hideMenu(); // <-- Use new API\n }\n }\n }\n\n private _resetMenu() {\n this.nextDropdownItemNo = 0;\n this.prevDropdownItemNo = -1;\n // reset the tabindex\n const items = this._getMenuItems();\n items.forEach(item => {\n const dropdownItem = item?.shadowRoot?.querySelector(\".dropdown-item\") as HTMLAnchorElement;\n dropdownItem && dropdownItem.removeAttribute(\"tabindex\");\n });\n }\n protected _handleKeyboardMenuItemsEvent(e: KeyboardEvent) {\n if (this.readonly) return;\n const menuItems = this._getActiveMenuItems();\n if (menuItems.length === 0) return;\n\n switch (e.key) {\n case ARROW_DOWN:\n e.preventDefault();\n this._setMenuItem(this.nextDropdownItemNo);\n break;\n case ARROW_UP:\n e.preventDefault();\n this._setMenuItem(this.prevDropdownItemNo);\n break;\n case TAB:\n if (!this.menuIsOpen) return;\n e.preventDefault();\n if (e.shiftKey) {\n this._setMenuItem(this.prevDropdownItemNo);\n } else {\n this._setMenuItem(this.nextDropdownItemNo);\n }\n break;\n case ESCAPE:\n if (this.menuIsOpen) {\n e.preventDefault();\n this.hideMenu();\n }\n break;\n case ENTER: {\n const target = menuItems.find(item => e.composedPath().includes(item));\n if (target) {\n this.handleSelectSlot(e);\n }\n break;\n }\n default:\n break;\n }\n }\n\n private _getMenuItems(): SgdsDropdownItem[] {\n const defaultSlot = this.shadowRoot.querySelector(\"slot#default\");\n // for case when default slot is used e.g. dropdown, mainnavdropdown\n if (defaultSlot) {\n const defaultSlotItems = (this.shadowRoot.querySelector(\"slot#default\") as HTMLSlotElement)\n ?.assignedElements({\n flatten: true\n })\n .filter(\n el =>\n el.getAttribute(\"role\") === \"menuitem\" && !el.classList.contains(\"empty-menu\") && !el.hasAttribute(\"hidden\")\n ) as SgdsDropdownItem[];\n return defaultSlotItems;\n }\n // for case when there is no slot e.g. combobox\n if (this.menu?.hasChildNodes()) {\n const menuItems = Array.from(this.menu.children);\n return [...menuItems] as SgdsDropdownItem[];\n }\n\n return [];\n }\n\n private _getActiveMenuItems(): SgdsDropdownItem[] {\n return this._getMenuItems().filter(item => !item.disabled && !item.hidden && !item.readonly);\n }\n private _setMenuItem(currentItemIdx: number) {\n const items = this._getActiveMenuItems();\n if (items.length === 0) return;\n\n // Use modulo for looping\n const idx = ((currentItemIdx % items.length) + items.length) % items.length;\n const activeItem = items[idx];\n this.emit(\"i-sgds-option-focus\", { detail: { option: activeItem } });\n this.nextDropdownItemNo = (idx + 1) % items.length;\n this.prevDropdownItemNo = (idx - 1 + items.length) % items.length;\n\n items.forEach(item => {\n const dropdownItem = item.shadowRoot.querySelector(\".dropdown-item\") as HTMLAnchorElement;\n dropdownItem.setAttribute(\"tabindex\", item === activeItem ? \"0\" : \"-1\");\n if (item === activeItem) dropdownItem.focus();\n });\n }\n}\n\nexport interface IDropdownListElement {\n item: SgdsDropdownItem;\n}\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,268 @@
1
+ 'use client';
2
+ 'use strict';
3
+
4
+ Object.defineProperty(exports, '__esModule', { value: true });
5
+
6
+ var tslib = require('tslib');
7
+ var lit = require('lit');
8
+ var decorators_js = require('lit/decorators.js');
9
+ var ifDefined_js = require('lit/directives/if-defined.js');
10
+ var sgdsElement = require('./sgds-element.cjs.js');
11
+ var animate = require('../utils/animate.cjs.js');
12
+ var animationRegistry = require('../utils/animation-registry.cjs.js');
13
+ var breakpoints = require('../utils/breakpoints.cjs.js');
14
+ var event = require('../utils/event.cjs.js');
15
+ var generateId = require('../utils/generateId.cjs.js');
16
+ var watch = require('../utils/watch.cjs.js');
17
+ var sgdsIconButton = require('../components/IconButton/sgds-icon-button.cjs.js');
18
+
19
+ const SIZES = {
20
+ sm: breakpoints.SM_BREAKPOINT,
21
+ md: breakpoints.MD_BREAKPOINT,
22
+ lg: breakpoints.LG_BREAKPOINT,
23
+ xl: breakpoints.XL_BREAKPOINT,
24
+ xxl: breakpoints.XXL_BREAKPOINT,
25
+ never: Infinity,
26
+ always: -1
27
+ };
28
+ /**
29
+ * Base class for navigation components (sgds-mainnav and sgds-appnav).
30
+ * Provides collapse/expand behavior, breakpoint handling, and animation logic.
31
+ * Subclasses must implement `render()` and provide their own context.
32
+ */
33
+ class NavElement extends sgdsElement["default"] {
34
+ constructor() {
35
+ super(...arguments);
36
+ /** Indicates if mobile menu is open or closed */
37
+ this.expanded = false;
38
+ /** Denotes the transition state of mobile mainnav menu opening */
39
+ this.expanding = false;
40
+ /** The href link for brand logo */
41
+ this.brandHref = "";
42
+ /** @internal */
43
+ this.collapseId = generateId["default"]("nav", "collapse");
44
+ /** The breakpoint, below which, the Navbar will collapse. When always the Navbar will always be expanded regardless of screen size. When never, the Navbar will always be collapsed */
45
+ this.expand = "lg";
46
+ this.breakpointReached = false;
47
+ /** @internal Whether sgds-*-profile is slotted in the profile slot */
48
+ this._hasProfileComponent = false;
49
+ this._handleClickOutsideBound = (event) => this._handleClickOutOfElement(event, this.body);
50
+ this._handleResizeBound = () => this._handleResize();
51
+ this._handleMobileNavBound = this._handleMobileNav.bind(this);
52
+ }
53
+ connectedCallback() {
54
+ super.connectedCallback();
55
+ this._handleResize();
56
+ window.addEventListener("click", this._handleClickOutsideBound);
57
+ window.addEventListener("resize", this._handleResizeBound);
58
+ }
59
+ disconnectedCallback() {
60
+ super.disconnectedCallback();
61
+ window.removeEventListener("click", this._handleClickOutsideBound);
62
+ window.removeEventListener("resize", this._handleResizeBound);
63
+ }
64
+ firstUpdated(changedProperties) {
65
+ super.firstUpdated(changedProperties);
66
+ if (this.breakpointReached && this.body) {
67
+ this.expanded = false;
68
+ this.body.hidden = true;
69
+ this._handleMobileNav();
70
+ this._onBreakpointReached(true);
71
+ }
72
+ }
73
+ _handleClickOutOfElement(e, self) {
74
+ if (!e.composedPath().includes(self) && !(this.header && e.composedPath().includes(this.header))) {
75
+ this.hide();
76
+ }
77
+ }
78
+ _handleSummaryClick() {
79
+ if (this.expanded) {
80
+ this.hide();
81
+ }
82
+ else {
83
+ document.body.style.overflow = "hidden";
84
+ this.show();
85
+ }
86
+ }
87
+ _handleResize() {
88
+ const newBreakpointReachedValue = window.innerWidth < SIZES[this.expand];
89
+ if (newBreakpointReachedValue !== this.breakpointReached) {
90
+ this.requestUpdate();
91
+ }
92
+ else {
93
+ this.body ? (this.body.hidden = true) : null;
94
+ this.expanding = false;
95
+ }
96
+ if (newBreakpointReachedValue) {
97
+ this._handleMobileNav();
98
+ if (!this._isBreakpointReached()) {
99
+ this._onBreakpointReached(true);
100
+ window.addEventListener("scrollend", this._handleMobileNavBound);
101
+ }
102
+ }
103
+ else {
104
+ this._handleDesktopNav();
105
+ this._onBreakpointReached(false);
106
+ window.removeEventListener("scrollend", this._handleMobileNavBound);
107
+ }
108
+ }
109
+ async _handleMobileNav() {
110
+ if (!this.nav)
111
+ return;
112
+ this.nav.appendChild(this.body);
113
+ await customElements.whenDefined("sgds-masthead");
114
+ const { bottom } = this.nav.getBoundingClientRect();
115
+ const navBodyPaddingY = parseFloat(getComputedStyle(this.body).paddingTop) + parseFloat(getComputedStyle(this.body).paddingBottom);
116
+ this.navScroll.style.maxHeight = `calc(100dvh - ${bottom}px - ${navBodyPaddingY}px)`;
117
+ }
118
+ _handleDesktopNav() {
119
+ var _a;
120
+ (_a = this.navbar) === null || _a === void 0 ? void 0 : _a.insertBefore(this.body, this.navbarEnd);
121
+ }
122
+ async _animateToShow() {
123
+ const sgdsShow = this.emit("sgds-show", { cancelable: true });
124
+ if (sgdsShow.defaultPrevented) {
125
+ this.expanding = false;
126
+ this.expanded = false;
127
+ return;
128
+ }
129
+ await animate.stopAnimations(this.body);
130
+ this.body.hidden = false;
131
+ const { keyframes, options } = animationRegistry.getAnimation(this, "nav.show");
132
+ await animate.animateTo(this.body, animate.shimKeyframesHeightAuto(keyframes, this.body.scrollHeight), options);
133
+ this.body.style.height = "auto";
134
+ this._onMenuShown();
135
+ this.emit("sgds-after-show");
136
+ }
137
+ /** Hook for subclasses to perform actions after the mobile menu opens (e.g., focus management) */
138
+ _onMenuShown() {
139
+ // Default: no-op. Subclasses can override.
140
+ }
141
+ async _animateToHide() {
142
+ const sgdsHide = this.emit("sgds-hide", { cancelable: true });
143
+ if (sgdsHide.defaultPrevented) {
144
+ this.expanding = false;
145
+ this.expanded = true;
146
+ return;
147
+ }
148
+ await animate.stopAnimations(this.body);
149
+ const { keyframes, options } = animationRegistry.getAnimation(this, "nav.hide");
150
+ await animate.animateTo(this.body, animate.shimKeyframesHeightAuto(keyframes, this.body.scrollHeight), options);
151
+ this.body.hidden = true;
152
+ this.body.style.height = "auto";
153
+ this.emit("sgds-after-hide");
154
+ }
155
+ /** @internal */
156
+ async handleOpenChange() {
157
+ var _a;
158
+ if (this.expanding) {
159
+ await this._animateToShow();
160
+ this.expanded = true;
161
+ }
162
+ else {
163
+ (_a = this.header) === null || _a === void 0 ? void 0 : _a.focus();
164
+ await this._animateToHide();
165
+ this.expanded = false;
166
+ }
167
+ }
168
+ /** Shows the menu. For when nav is in the collapsed form */
169
+ async show() {
170
+ if (this.expanded)
171
+ return;
172
+ this.expanding = true;
173
+ return event.waitForEvent(this, "sgds-after-show");
174
+ }
175
+ /** Hide the menu. For when nav is in the collapsed form */
176
+ async hide() {
177
+ if (!this.expanded)
178
+ return;
179
+ this.expanding = false;
180
+ document.body.style.removeProperty("overflow");
181
+ return event.waitForEvent(this, "sgds-after-hide");
182
+ }
183
+ /** Helper to get the expand CSS class */
184
+ _expandClass() {
185
+ switch (this.expand) {
186
+ case "always":
187
+ return "navbar-expand";
188
+ case "never":
189
+ break;
190
+ default:
191
+ return `navbar-expand-${this.expand}`;
192
+ }
193
+ }
194
+ /** Helper: renders the hamburger toggler icon-button. Subclasses should call this in their render(). */
195
+ _renderToggler(tone) {
196
+ return lit.html `<sgds-icon-button
197
+ name=${this.expanded ? "cross" : "menu"}
198
+ variant="ghost"
199
+ size="sm"
200
+ tone=${ifDefined_js.ifDefined(tone && tone !== "default" ? "fixed-light" : undefined)}
201
+ class="navbar-toggler"
202
+ @click=${this._handleSummaryClick}
203
+ aria-controls="${this.collapseId}"
204
+ aria-expanded="${this.expanded}"
205
+ .ariaLabel=${"Toggle navigation"}
206
+ ></sgds-icon-button>`;
207
+ }
208
+ }
209
+ /** @internal */
210
+ NavElement.dependencies = {
211
+ "sgds-icon-button": sgdsIconButton.SgdsIconButton
212
+ };
213
+ tslib.__decorate([
214
+ decorators_js.state()
215
+ ], NavElement.prototype, "expanded", void 0);
216
+ tslib.__decorate([
217
+ decorators_js.state()
218
+ ], NavElement.prototype, "expanding", void 0);
219
+ tslib.__decorate([
220
+ decorators_js.query("nav")
221
+ ], NavElement.prototype, "nav", void 0);
222
+ tslib.__decorate([
223
+ decorators_js.query(".navbar")
224
+ ], NavElement.prototype, "navbar", void 0);
225
+ tslib.__decorate([
226
+ decorators_js.query(".navbar-toggler")
227
+ ], NavElement.prototype, "header", void 0);
228
+ tslib.__decorate([
229
+ decorators_js.query(".navbar-body")
230
+ ], NavElement.prototype, "body", void 0);
231
+ tslib.__decorate([
232
+ decorators_js.query(".navbar-nav-scroll")
233
+ ], NavElement.prototype, "navScroll", void 0);
234
+ tslib.__decorate([
235
+ decorators_js.query(".navbar-end")
236
+ ], NavElement.prototype, "navbarEnd", void 0);
237
+ tslib.__decorate([
238
+ decorators_js.property({ type: String })
239
+ ], NavElement.prototype, "brandHref", void 0);
240
+ tslib.__decorate([
241
+ decorators_js.property({ type: String })
242
+ ], NavElement.prototype, "expand", void 0);
243
+ tslib.__decorate([
244
+ decorators_js.state()
245
+ ], NavElement.prototype, "breakpointReached", void 0);
246
+ tslib.__decorate([
247
+ decorators_js.state()
248
+ ], NavElement.prototype, "_hasProfileComponent", void 0);
249
+ tslib.__decorate([
250
+ watch.watch("expanding", { waitUntilFirstUpdate: true })
251
+ ], NavElement.prototype, "handleOpenChange", null);
252
+ animationRegistry.setDefaultAnimation("nav.show", {
253
+ keyframes: [
254
+ { height: "0", opacity: "0" },
255
+ { height: "auto", opacity: "1" }
256
+ ],
257
+ options: { duration: 200, easing: "ease-in-out" }
258
+ });
259
+ animationRegistry.setDefaultAnimation("nav.hide", {
260
+ keyframes: [
261
+ { height: "auto", opacity: "1" },
262
+ { height: "0", opacity: "0" }
263
+ ],
264
+ options: { duration: 200, easing: "ease-in-out" }
265
+ });
266
+
267
+ exports["default"] = NavElement;
268
+ //# sourceMappingURL=nav-element.cjs.js.map