@govtechsg/sgds-web-component 3.26.1 → 3.27.0-rc.1

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 (239) 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 +2649 -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 +84 -0
  53. package/components/DataTable/sgds-data-table.js +438 -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/index.d.ts +7 -0
  91. package/components/index.js +7 -0
  92. package/components/index.js.map +1 -1
  93. package/components/index.umd.min.js +851 -662
  94. package/components/index.umd.min.js.map +1 -1
  95. package/css/fouc.css +7 -0
  96. package/custom-elements.json +11304 -7831
  97. package/index.d.ts +2 -0
  98. package/index.js +2 -0
  99. package/index.js.map +1 -1
  100. package/index.umd.min.js +705 -511
  101. package/index.umd.min.js.map +1 -1
  102. package/package.json +1 -1
  103. package/react/appnav/index.cjs.js +45 -0
  104. package/react/appnav/index.cjs.js.map +1 -0
  105. package/react/appnav/index.d.ts +4 -0
  106. package/react/appnav/index.js +21 -0
  107. package/react/appnav/index.js.map +1 -0
  108. package/react/appnav-profile/index.cjs.js +40 -0
  109. package/react/appnav-profile/index.cjs.js.map +1 -0
  110. package/react/appnav-profile/index.d.ts +4 -0
  111. package/react/appnav-profile/index.js +16 -0
  112. package/react/appnav-profile/index.js.map +1 -0
  113. package/react/base/dropdown-list-element.cjs.js +9 -2
  114. package/react/base/dropdown-list-element.cjs.js.map +1 -1
  115. package/react/base/dropdown-list-element.js +9 -2
  116. package/react/base/dropdown-list-element.js.map +1 -1
  117. package/react/base/nav-element.cjs.js +268 -0
  118. package/react/base/nav-element.cjs.js.map +1 -0
  119. package/react/base/nav-element.js +264 -0
  120. package/react/base/nav-element.js.map +1 -0
  121. package/react/base/nav-profile-element.cjs.js +196 -0
  122. package/react/base/nav-profile-element.cjs.js.map +1 -0
  123. package/react/base/nav-profile-element.js +192 -0
  124. package/react/base/nav-profile-element.js.map +1 -0
  125. package/react/base/nav-profile.cjs.js +11 -0
  126. package/react/base/nav-profile.cjs.js.map +1 -0
  127. package/react/base/nav-profile.js +7 -0
  128. package/react/base/nav-profile.js.map +1 -0
  129. package/react/components/Appnav/appnav-context.cjs.js +13 -0
  130. package/react/components/Appnav/appnav-context.cjs.js.map +1 -0
  131. package/react/components/Appnav/appnav-context.js +8 -0
  132. package/react/components/Appnav/appnav-context.js.map +1 -0
  133. package/react/components/Appnav/appnav.cjs.js +11 -0
  134. package/react/components/Appnav/appnav.cjs.js.map +1 -0
  135. package/react/components/Appnav/appnav.js +7 -0
  136. package/react/components/Appnav/appnav.js.map +1 -0
  137. package/react/components/Appnav/sgds-appnav-profile.cjs.js +37 -0
  138. package/react/components/Appnav/sgds-appnav-profile.cjs.js.map +1 -0
  139. package/react/components/Appnav/sgds-appnav-profile.js +32 -0
  140. package/react/components/Appnav/sgds-appnav-profile.js.map +1 -0
  141. package/react/components/Appnav/sgds-appnav.cjs.js +189 -0
  142. package/react/components/Appnav/sgds-appnav.cjs.js.map +1 -0
  143. package/react/components/Appnav/sgds-appnav.js +184 -0
  144. package/react/components/Appnav/sgds-appnav.js.map +1 -0
  145. package/react/components/Checkbox/sgds-checkbox.cjs.js +6 -1
  146. package/react/components/Checkbox/sgds-checkbox.cjs.js.map +1 -1
  147. package/react/components/Checkbox/sgds-checkbox.js +6 -1
  148. package/react/components/Checkbox/sgds-checkbox.js.map +1 -1
  149. package/react/components/DataTable/data-table.cjs.js +11 -0
  150. package/react/components/DataTable/data-table.cjs.js.map +1 -0
  151. package/react/components/DataTable/data-table.js +7 -0
  152. package/react/components/DataTable/data-table.js.map +1 -0
  153. package/react/components/DataTable/sgds-data-table-cell.cjs.js +38 -0
  154. package/react/components/DataTable/sgds-data-table-cell.cjs.js.map +1 -0
  155. package/react/components/DataTable/sgds-data-table-cell.js +33 -0
  156. package/react/components/DataTable/sgds-data-table-cell.js.map +1 -0
  157. package/react/components/DataTable/sgds-data-table-head.cjs.js +75 -0
  158. package/react/components/DataTable/sgds-data-table-head.cjs.js.map +1 -0
  159. package/react/components/DataTable/sgds-data-table-head.js +70 -0
  160. package/react/components/DataTable/sgds-data-table-head.js.map +1 -0
  161. package/react/components/DataTable/sgds-data-table-row.cjs.js +339 -0
  162. package/react/components/DataTable/sgds-data-table-row.cjs.js.map +1 -0
  163. package/react/components/DataTable/sgds-data-table-row.js +334 -0
  164. package/react/components/DataTable/sgds-data-table-row.js.map +1 -0
  165. package/react/components/DataTable/sgds-data-table.cjs.js +444 -0
  166. package/react/components/DataTable/sgds-data-table.cjs.js.map +1 -0
  167. package/react/components/DataTable/sgds-data-table.js +439 -0
  168. package/react/components/DataTable/sgds-data-table.js.map +1 -0
  169. package/react/components/Dropdown/dropdown-item.cjs.js +1 -1
  170. package/react/components/Dropdown/dropdown-item.js +1 -1
  171. package/react/components/Dropdown/sgds-dropdown-item.cjs.js +8 -2
  172. package/react/components/Dropdown/sgds-dropdown-item.cjs.js.map +1 -1
  173. package/react/components/Dropdown/sgds-dropdown-item.js +8 -2
  174. package/react/components/Dropdown/sgds-dropdown-item.js.map +1 -1
  175. package/react/components/Input/input.cjs.js +1 -1
  176. package/react/components/Input/input.js +1 -1
  177. package/react/components/Mainnav/mainnav-dropdown.cjs.js +1 -1
  178. package/react/components/Mainnav/mainnav-dropdown.js +1 -1
  179. package/react/components/Mainnav/mainnav-item.cjs.js +1 -1
  180. package/react/components/Mainnav/mainnav-item.js +1 -1
  181. package/react/components/Mainnav/mainnav.cjs.js +1 -1
  182. package/react/components/Mainnav/mainnav.js +1 -1
  183. package/react/components/Mainnav/sgds-mainnav-profile.cjs.js +35 -0
  184. package/react/components/Mainnav/sgds-mainnav-profile.cjs.js.map +1 -0
  185. package/react/components/Mainnav/sgds-mainnav-profile.js +30 -0
  186. package/react/components/Mainnav/sgds-mainnav-profile.js.map +1 -0
  187. package/react/components/Mainnav/sgds-mainnav.cjs.js +39 -237
  188. package/react/components/Mainnav/sgds-mainnav.cjs.js.map +1 -1
  189. package/react/components/Mainnav/sgds-mainnav.js +40 -238
  190. package/react/components/Mainnav/sgds-mainnav.js.map +1 -1
  191. package/react/components/Tab/tab-panel.cjs.js +1 -1
  192. package/react/components/Tab/tab-panel.js +1 -1
  193. package/react/data-table/index.cjs.js +44 -0
  194. package/react/data-table/index.cjs.js.map +1 -0
  195. package/react/data-table/index.d.ts +4 -0
  196. package/react/data-table/index.js +20 -0
  197. package/react/data-table/index.js.map +1 -0
  198. package/react/data-table-cell/index.cjs.js +40 -0
  199. package/react/data-table-cell/index.cjs.js.map +1 -0
  200. package/react/data-table-cell/index.d.ts +4 -0
  201. package/react/data-table-cell/index.js +16 -0
  202. package/react/data-table-cell/index.js.map +1 -0
  203. package/react/data-table-head/index.cjs.js +40 -0
  204. package/react/data-table-head/index.cjs.js.map +1 -0
  205. package/react/data-table-head/index.d.ts +4 -0
  206. package/react/data-table-head/index.js +16 -0
  207. package/react/data-table-head/index.js.map +1 -0
  208. package/react/data-table-row/index.cjs.js +45 -0
  209. package/react/data-table-row/index.cjs.js.map +1 -0
  210. package/react/data-table-row/index.d.ts +4 -0
  211. package/react/data-table-row/index.js +21 -0
  212. package/react/data-table-row/index.js.map +1 -0
  213. package/react/index.cjs.js +152 -138
  214. package/react/index.cjs.js.map +1 -1
  215. package/react/index.d.ts +7 -0
  216. package/react/index.js +7 -0
  217. package/react/index.js.map +1 -1
  218. package/react/mainnav-profile/index.cjs.js +40 -0
  219. package/react/mainnav-profile/index.cjs.js.map +1 -0
  220. package/react/mainnav-profile/index.d.ts +4 -0
  221. package/react/mainnav-profile/index.js +16 -0
  222. package/react/mainnav-profile/index.js.map +1 -0
  223. package/react/styles/form-text-control.cjs.js +1 -1
  224. package/react/styles/form-text-control.js +1 -1
  225. package/styles/form-text-control.js +1 -1
  226. package/themes/blue.css +11 -11
  227. package/themes/cyan.css +10 -10
  228. package/themes/gt/blue.css +11 -11
  229. package/themes/gt/cyan.css +10 -10
  230. package/themes/gt/magenta.css +11 -11
  231. package/themes/gt/pink.css +11 -11
  232. package/themes/gt/purple.css +11 -11
  233. package/themes/gt/red.css +11 -11
  234. package/themes/magenta.css +11 -11
  235. package/themes/pink.css +11 -11
  236. package/themes/purple.css +11 -11
  237. package/themes/red.css +11 -11
  238. package/themes/root.css +5 -0
  239. package/types/react.d.ts +146 -2
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nav-element.cjs.js","sources":["../../../src/base/nav-element.ts"],"sourcesContent":["import { html, nothing, PropertyValueMap, TemplateResult } from \"lit\";\nimport { property, query, state } from \"lit/decorators.js\";\nimport { ifDefined } from \"lit/directives/if-defined.js\";\nimport SgdsElement from \"./sgds-element\";\nimport { animateTo, shimKeyframesHeightAuto, stopAnimations } from \"../utils/animate\";\nimport { getAnimation, setDefaultAnimation } from \"../utils/animation-registry\";\nimport { LG_BREAKPOINT, MD_BREAKPOINT, SM_BREAKPOINT, XL_BREAKPOINT, XXL_BREAKPOINT } from \"../utils/breakpoints\";\nimport { waitForEvent } from \"../utils/event\";\nimport genId from \"../utils/generateId\";\nimport { watch } from \"../utils/watch\";\nimport SgdsIconButton from \"../components/IconButton/sgds-icon-button\";\n\nexport type NavExpandSize = \"sm\" | \"md\" | \"lg\" | \"xl\" | \"xxl\" | \"always\" | \"never\";\nexport type NavTone = \"default\" | \"brand\" | \"gradient-1\" | \"gradient-2\" | \"gradient-3\" | \"gradient-4\";\n\nconst SIZES: Record<NavExpandSize, number> = {\n sm: SM_BREAKPOINT,\n md: MD_BREAKPOINT,\n lg: LG_BREAKPOINT,\n xl: XL_BREAKPOINT,\n xxl: XXL_BREAKPOINT,\n never: Infinity,\n always: -1\n};\n\n/**\n * Base class for navigation components (sgds-mainnav and sgds-appnav).\n * Provides collapse/expand behavior, breakpoint handling, and animation logic.\n * Subclasses must implement `render()` and provide their own context.\n */\nexport default abstract class NavElement extends SgdsElement {\n /** @internal */\n static dependencies = {\n \"sgds-icon-button\": SgdsIconButton\n };\n\n /** Indicates if mobile menu is open or closed */\n @state()\n protected expanded = false;\n\n /** Denotes the transition state of mobile mainnav menu opening */\n @state()\n protected expanding = false;\n\n @query(\"nav\") protected nav!: HTMLElement;\n @query(\".navbar\") protected navbar!: HTMLElement;\n @query(\".navbar-toggler\") protected header!: HTMLElement;\n @query(\".navbar-body\") protected body!: HTMLElement;\n @query(\".navbar-nav-scroll\") protected navScroll!: HTMLElement;\n @query(\".navbar-end\") protected navbarEnd!: HTMLElement;\n\n /** The href link for brand logo */\n @property({ type: String })\n brandHref = \"\";\n\n /** @internal */\n protected collapseId = genId(\"nav\", \"collapse\");\n\n /** 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 */\n @property({ type: String })\n expand: NavExpandSize = \"lg\";\n\n @state()\n protected breakpointReached = false;\n\n /** @internal Whether sgds-*-profile is slotted in the profile slot */\n @state()\n protected _hasProfileComponent = false;\n\n connectedCallback() {\n super.connectedCallback();\n this._handleResize();\n window.addEventListener(\"click\", this._handleClickOutsideBound);\n window.addEventListener(\"resize\", this._handleResizeBound);\n }\n\n disconnectedCallback() {\n super.disconnectedCallback();\n window.removeEventListener(\"click\", this._handleClickOutsideBound);\n window.removeEventListener(\"resize\", this._handleResizeBound);\n }\n\n firstUpdated(changedProperties: PropertyValueMap<this>) {\n super.firstUpdated(changedProperties);\n if (this.breakpointReached && this.body) {\n this.expanded = false;\n this.body.hidden = true;\n this._handleMobileNav();\n this._onBreakpointReached(true);\n }\n }\n\n private _handleClickOutsideBound = (event: MouseEvent) => this._handleClickOutOfElement(event, this.body);\n private _handleResizeBound = () => this._handleResize();\n\n private _handleClickOutOfElement(e: MouseEvent, self: HTMLElement) {\n if (!e.composedPath().includes(self) && !(this.header && e.composedPath().includes(this.header))) {\n this.hide();\n }\n }\n\n protected _handleSummaryClick() {\n if (this.expanded) {\n this.hide();\n } else {\n document.body.style.overflow = \"hidden\";\n this.show();\n }\n }\n\n protected _handleResize() {\n const newBreakpointReachedValue = window.innerWidth < SIZES[this.expand];\n if (newBreakpointReachedValue !== this.breakpointReached) {\n this.requestUpdate();\n } else {\n this.body ? (this.body.hidden = true) : null;\n this.expanding = false;\n }\n\n if (newBreakpointReachedValue) {\n this._handleMobileNav();\n if (!this._isBreakpointReached()) {\n this._onBreakpointReached(true);\n window.addEventListener(\"scrollend\", this._handleMobileNavBound);\n }\n } else {\n this._handleDesktopNav();\n this._onBreakpointReached(false);\n window.removeEventListener(\"scrollend\", this._handleMobileNavBound);\n }\n }\n\n /** Hook for subclasses to update context providers when breakpoint state changes */\n protected abstract _onBreakpointReached(reached: boolean): void;\n\n /** Hook for subclasses to check current breakpoint context state */\n protected abstract _isBreakpointReached(): boolean;\n\n private _handleMobileNavBound = this._handleMobileNav.bind(this);\n\n protected async _handleMobileNav() {\n if (!this.nav) return;\n this.nav.appendChild(this.body);\n await customElements.whenDefined(\"sgds-masthead\");\n\n const { bottom } = this.nav.getBoundingClientRect();\n const navBodyPaddingY =\n parseFloat(getComputedStyle(this.body).paddingTop) + parseFloat(getComputedStyle(this.body).paddingBottom);\n\n this.navScroll.style.maxHeight = `calc(100dvh - ${bottom}px - ${navBodyPaddingY}px)`;\n }\n\n protected _handleDesktopNav() {\n this.navbar?.insertBefore(this.body, this.navbarEnd);\n }\n\n private async _animateToShow() {\n const sgdsShow = this.emit(\"sgds-show\", { cancelable: true });\n if (sgdsShow.defaultPrevented) {\n this.expanding = false;\n this.expanded = false;\n return;\n }\n\n await stopAnimations(this.body);\n this.body.hidden = false;\n\n const { keyframes, options } = getAnimation(this, \"nav.show\");\n await animateTo(this.body, shimKeyframesHeightAuto(keyframes, this.body.scrollHeight), options);\n this.body.style.height = \"auto\";\n\n this._onMenuShown();\n this.emit(\"sgds-after-show\");\n }\n\n /** Hook for subclasses to perform actions after the mobile menu opens (e.g., focus management) */\n protected _onMenuShown(): void {\n // Default: no-op. Subclasses can override.\n }\n\n private async _animateToHide() {\n const sgdsHide = this.emit(\"sgds-hide\", { cancelable: true });\n if (sgdsHide.defaultPrevented) {\n this.expanding = false;\n this.expanded = true;\n return;\n }\n\n await stopAnimations(this.body);\n\n const { keyframes, options } = getAnimation(this, \"nav.hide\");\n await animateTo(this.body, shimKeyframesHeightAuto(keyframes, this.body.scrollHeight), options);\n this.body.hidden = true;\n this.body.style.height = \"auto\";\n this.emit(\"sgds-after-hide\");\n }\n\n /** @internal */\n @watch(\"expanding\", { waitUntilFirstUpdate: true })\n async handleOpenChange() {\n if (this.expanding) {\n await this._animateToShow();\n this.expanded = true;\n } else {\n this.header?.focus();\n await this._animateToHide();\n this.expanded = false;\n }\n }\n\n /** Shows the menu. For when nav is in the collapsed form */\n public async show() {\n if (this.expanded) return;\n this.expanding = true;\n return waitForEvent(this, \"sgds-after-show\");\n }\n\n /** Hide the menu. For when nav is in the collapsed form */\n public async hide() {\n if (!this.expanded) return;\n this.expanding = false;\n document.body.style.removeProperty(\"overflow\");\n return waitForEvent(this, \"sgds-after-hide\");\n }\n\n /** Helper to get the expand CSS class */\n protected _expandClass() {\n switch (this.expand) {\n case \"always\":\n return \"navbar-expand\";\n case \"never\":\n break;\n default:\n return `navbar-expand-${this.expand}`;\n }\n }\n\n /** Helper: renders the hamburger toggler icon-button. Subclasses should call this in their render(). */\n protected _renderToggler(tone?: NavTone): TemplateResult | typeof nothing {\n return html`<sgds-icon-button\n name=${this.expanded ? \"cross\" : \"menu\"}\n variant=\"ghost\"\n size=\"sm\"\n tone=${ifDefined(tone && tone !== \"default\" ? \"fixed-light\" : undefined)}\n class=\"navbar-toggler\"\n @click=${this._handleSummaryClick}\n aria-controls=\"${this.collapseId}\"\n aria-expanded=\"${this.expanded}\"\n .ariaLabel=${\"Toggle navigation\"}\n ></sgds-icon-button>`;\n }\n}\n\nsetDefaultAnimation(\"nav.show\", {\n keyframes: [\n { height: \"0\", opacity: \"0\" },\n { height: \"auto\", opacity: \"1\" }\n ],\n options: { duration: 200, easing: \"ease-in-out\" }\n});\n\nsetDefaultAnimation(\"nav.hide\", {\n keyframes: [\n { height: \"auto\", opacity: \"1\" },\n { height: \"0\", opacity: \"0\" }\n ],\n options: { duration: 200, easing: \"ease-in-out\" }\n});\n"],"names":["SM_BREAKPOINT","MD_BREAKPOINT","LG_BREAKPOINT","XL_BREAKPOINT","XXL_BREAKPOINT","SgdsElement","genId","stopAnimations","getAnimation","animateTo","shimKeyframesHeightAuto","waitForEvent","html","ifDefined","SgdsIconButton","__decorate","state","query","property","watch","setDefaultAnimation"],"mappings":"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"}
@@ -0,0 +1,264 @@
1
+ 'use client';
2
+ import { __decorate } from 'tslib';
3
+ import { html } from 'lit';
4
+ import { state, query, property } from 'lit/decorators.js';
5
+ import { ifDefined } from 'lit/directives/if-defined.js';
6
+ import SgdsElement from './sgds-element.js';
7
+ import { stopAnimations, animateTo, shimKeyframesHeightAuto } from '../utils/animate.js';
8
+ import { setDefaultAnimation, getAnimation } from '../utils/animation-registry.js';
9
+ import { SM_BREAKPOINT, MD_BREAKPOINT, LG_BREAKPOINT, XL_BREAKPOINT, XXL_BREAKPOINT } from '../utils/breakpoints.js';
10
+ import { waitForEvent } from '../utils/event.js';
11
+ import genId from '../utils/generateId.js';
12
+ import { watch } from '../utils/watch.js';
13
+ import { SgdsIconButton } from '../components/IconButton/sgds-icon-button.js';
14
+
15
+ const SIZES = {
16
+ sm: SM_BREAKPOINT,
17
+ md: MD_BREAKPOINT,
18
+ lg: LG_BREAKPOINT,
19
+ xl: XL_BREAKPOINT,
20
+ xxl: XXL_BREAKPOINT,
21
+ never: Infinity,
22
+ always: -1
23
+ };
24
+ /**
25
+ * Base class for navigation components (sgds-mainnav and sgds-appnav).
26
+ * Provides collapse/expand behavior, breakpoint handling, and animation logic.
27
+ * Subclasses must implement `render()` and provide their own context.
28
+ */
29
+ class NavElement extends SgdsElement {
30
+ constructor() {
31
+ super(...arguments);
32
+ /** Indicates if mobile menu is open or closed */
33
+ this.expanded = false;
34
+ /** Denotes the transition state of mobile mainnav menu opening */
35
+ this.expanding = false;
36
+ /** The href link for brand logo */
37
+ this.brandHref = "";
38
+ /** @internal */
39
+ this.collapseId = genId("nav", "collapse");
40
+ /** 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 */
41
+ this.expand = "lg";
42
+ this.breakpointReached = false;
43
+ /** @internal Whether sgds-*-profile is slotted in the profile slot */
44
+ this._hasProfileComponent = false;
45
+ this._handleClickOutsideBound = (event) => this._handleClickOutOfElement(event, this.body);
46
+ this._handleResizeBound = () => this._handleResize();
47
+ this._handleMobileNavBound = this._handleMobileNav.bind(this);
48
+ }
49
+ connectedCallback() {
50
+ super.connectedCallback();
51
+ this._handleResize();
52
+ window.addEventListener("click", this._handleClickOutsideBound);
53
+ window.addEventListener("resize", this._handleResizeBound);
54
+ }
55
+ disconnectedCallback() {
56
+ super.disconnectedCallback();
57
+ window.removeEventListener("click", this._handleClickOutsideBound);
58
+ window.removeEventListener("resize", this._handleResizeBound);
59
+ }
60
+ firstUpdated(changedProperties) {
61
+ super.firstUpdated(changedProperties);
62
+ if (this.breakpointReached && this.body) {
63
+ this.expanded = false;
64
+ this.body.hidden = true;
65
+ this._handleMobileNav();
66
+ this._onBreakpointReached(true);
67
+ }
68
+ }
69
+ _handleClickOutOfElement(e, self) {
70
+ if (!e.composedPath().includes(self) && !(this.header && e.composedPath().includes(this.header))) {
71
+ this.hide();
72
+ }
73
+ }
74
+ _handleSummaryClick() {
75
+ if (this.expanded) {
76
+ this.hide();
77
+ }
78
+ else {
79
+ document.body.style.overflow = "hidden";
80
+ this.show();
81
+ }
82
+ }
83
+ _handleResize() {
84
+ const newBreakpointReachedValue = window.innerWidth < SIZES[this.expand];
85
+ if (newBreakpointReachedValue !== this.breakpointReached) {
86
+ this.requestUpdate();
87
+ }
88
+ else {
89
+ this.body ? (this.body.hidden = true) : null;
90
+ this.expanding = false;
91
+ }
92
+ if (newBreakpointReachedValue) {
93
+ this._handleMobileNav();
94
+ if (!this._isBreakpointReached()) {
95
+ this._onBreakpointReached(true);
96
+ window.addEventListener("scrollend", this._handleMobileNavBound);
97
+ }
98
+ }
99
+ else {
100
+ this._handleDesktopNav();
101
+ this._onBreakpointReached(false);
102
+ window.removeEventListener("scrollend", this._handleMobileNavBound);
103
+ }
104
+ }
105
+ async _handleMobileNav() {
106
+ if (!this.nav)
107
+ return;
108
+ this.nav.appendChild(this.body);
109
+ await customElements.whenDefined("sgds-masthead");
110
+ const { bottom } = this.nav.getBoundingClientRect();
111
+ const navBodyPaddingY = parseFloat(getComputedStyle(this.body).paddingTop) + parseFloat(getComputedStyle(this.body).paddingBottom);
112
+ this.navScroll.style.maxHeight = `calc(100dvh - ${bottom}px - ${navBodyPaddingY}px)`;
113
+ }
114
+ _handleDesktopNav() {
115
+ var _a;
116
+ (_a = this.navbar) === null || _a === void 0 ? void 0 : _a.insertBefore(this.body, this.navbarEnd);
117
+ }
118
+ async _animateToShow() {
119
+ const sgdsShow = this.emit("sgds-show", { cancelable: true });
120
+ if (sgdsShow.defaultPrevented) {
121
+ this.expanding = false;
122
+ this.expanded = false;
123
+ return;
124
+ }
125
+ await stopAnimations(this.body);
126
+ this.body.hidden = false;
127
+ const { keyframes, options } = getAnimation(this, "nav.show");
128
+ await animateTo(this.body, shimKeyframesHeightAuto(keyframes, this.body.scrollHeight), options);
129
+ this.body.style.height = "auto";
130
+ this._onMenuShown();
131
+ this.emit("sgds-after-show");
132
+ }
133
+ /** Hook for subclasses to perform actions after the mobile menu opens (e.g., focus management) */
134
+ _onMenuShown() {
135
+ // Default: no-op. Subclasses can override.
136
+ }
137
+ async _animateToHide() {
138
+ const sgdsHide = this.emit("sgds-hide", { cancelable: true });
139
+ if (sgdsHide.defaultPrevented) {
140
+ this.expanding = false;
141
+ this.expanded = true;
142
+ return;
143
+ }
144
+ await stopAnimations(this.body);
145
+ const { keyframes, options } = getAnimation(this, "nav.hide");
146
+ await animateTo(this.body, shimKeyframesHeightAuto(keyframes, this.body.scrollHeight), options);
147
+ this.body.hidden = true;
148
+ this.body.style.height = "auto";
149
+ this.emit("sgds-after-hide");
150
+ }
151
+ /** @internal */
152
+ async handleOpenChange() {
153
+ var _a;
154
+ if (this.expanding) {
155
+ await this._animateToShow();
156
+ this.expanded = true;
157
+ }
158
+ else {
159
+ (_a = this.header) === null || _a === void 0 ? void 0 : _a.focus();
160
+ await this._animateToHide();
161
+ this.expanded = false;
162
+ }
163
+ }
164
+ /** Shows the menu. For when nav is in the collapsed form */
165
+ async show() {
166
+ if (this.expanded)
167
+ return;
168
+ this.expanding = true;
169
+ return waitForEvent(this, "sgds-after-show");
170
+ }
171
+ /** Hide the menu. For when nav is in the collapsed form */
172
+ async hide() {
173
+ if (!this.expanded)
174
+ return;
175
+ this.expanding = false;
176
+ document.body.style.removeProperty("overflow");
177
+ return waitForEvent(this, "sgds-after-hide");
178
+ }
179
+ /** Helper to get the expand CSS class */
180
+ _expandClass() {
181
+ switch (this.expand) {
182
+ case "always":
183
+ return "navbar-expand";
184
+ case "never":
185
+ break;
186
+ default:
187
+ return `navbar-expand-${this.expand}`;
188
+ }
189
+ }
190
+ /** Helper: renders the hamburger toggler icon-button. Subclasses should call this in their render(). */
191
+ _renderToggler(tone) {
192
+ return html `<sgds-icon-button
193
+ name=${this.expanded ? "cross" : "menu"}
194
+ variant="ghost"
195
+ size="sm"
196
+ tone=${ifDefined(tone && tone !== "default" ? "fixed-light" : undefined)}
197
+ class="navbar-toggler"
198
+ @click=${this._handleSummaryClick}
199
+ aria-controls="${this.collapseId}"
200
+ aria-expanded="${this.expanded}"
201
+ .ariaLabel=${"Toggle navigation"}
202
+ ></sgds-icon-button>`;
203
+ }
204
+ }
205
+ /** @internal */
206
+ NavElement.dependencies = {
207
+ "sgds-icon-button": SgdsIconButton
208
+ };
209
+ __decorate([
210
+ state()
211
+ ], NavElement.prototype, "expanded", void 0);
212
+ __decorate([
213
+ state()
214
+ ], NavElement.prototype, "expanding", void 0);
215
+ __decorate([
216
+ query("nav")
217
+ ], NavElement.prototype, "nav", void 0);
218
+ __decorate([
219
+ query(".navbar")
220
+ ], NavElement.prototype, "navbar", void 0);
221
+ __decorate([
222
+ query(".navbar-toggler")
223
+ ], NavElement.prototype, "header", void 0);
224
+ __decorate([
225
+ query(".navbar-body")
226
+ ], NavElement.prototype, "body", void 0);
227
+ __decorate([
228
+ query(".navbar-nav-scroll")
229
+ ], NavElement.prototype, "navScroll", void 0);
230
+ __decorate([
231
+ query(".navbar-end")
232
+ ], NavElement.prototype, "navbarEnd", void 0);
233
+ __decorate([
234
+ property({ type: String })
235
+ ], NavElement.prototype, "brandHref", void 0);
236
+ __decorate([
237
+ property({ type: String })
238
+ ], NavElement.prototype, "expand", void 0);
239
+ __decorate([
240
+ state()
241
+ ], NavElement.prototype, "breakpointReached", void 0);
242
+ __decorate([
243
+ state()
244
+ ], NavElement.prototype, "_hasProfileComponent", void 0);
245
+ __decorate([
246
+ watch("expanding", { waitUntilFirstUpdate: true })
247
+ ], NavElement.prototype, "handleOpenChange", null);
248
+ setDefaultAnimation("nav.show", {
249
+ keyframes: [
250
+ { height: "0", opacity: "0" },
251
+ { height: "auto", opacity: "1" }
252
+ ],
253
+ options: { duration: 200, easing: "ease-in-out" }
254
+ });
255
+ setDefaultAnimation("nav.hide", {
256
+ keyframes: [
257
+ { height: "auto", opacity: "1" },
258
+ { height: "0", opacity: "0" }
259
+ ],
260
+ options: { duration: 200, easing: "ease-in-out" }
261
+ });
262
+
263
+ export { NavElement as default };
264
+ //# sourceMappingURL=nav-element.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nav-element.js","sources":["../../../src/base/nav-element.ts"],"sourcesContent":["import { html, nothing, PropertyValueMap, TemplateResult } from \"lit\";\nimport { property, query, state } from \"lit/decorators.js\";\nimport { ifDefined } from \"lit/directives/if-defined.js\";\nimport SgdsElement from \"./sgds-element\";\nimport { animateTo, shimKeyframesHeightAuto, stopAnimations } from \"../utils/animate\";\nimport { getAnimation, setDefaultAnimation } from \"../utils/animation-registry\";\nimport { LG_BREAKPOINT, MD_BREAKPOINT, SM_BREAKPOINT, XL_BREAKPOINT, XXL_BREAKPOINT } from \"../utils/breakpoints\";\nimport { waitForEvent } from \"../utils/event\";\nimport genId from \"../utils/generateId\";\nimport { watch } from \"../utils/watch\";\nimport SgdsIconButton from \"../components/IconButton/sgds-icon-button\";\n\nexport type NavExpandSize = \"sm\" | \"md\" | \"lg\" | \"xl\" | \"xxl\" | \"always\" | \"never\";\nexport type NavTone = \"default\" | \"brand\" | \"gradient-1\" | \"gradient-2\" | \"gradient-3\" | \"gradient-4\";\n\nconst SIZES: Record<NavExpandSize, number> = {\n sm: SM_BREAKPOINT,\n md: MD_BREAKPOINT,\n lg: LG_BREAKPOINT,\n xl: XL_BREAKPOINT,\n xxl: XXL_BREAKPOINT,\n never: Infinity,\n always: -1\n};\n\n/**\n * Base class for navigation components (sgds-mainnav and sgds-appnav).\n * Provides collapse/expand behavior, breakpoint handling, and animation logic.\n * Subclasses must implement `render()` and provide their own context.\n */\nexport default abstract class NavElement extends SgdsElement {\n /** @internal */\n static dependencies = {\n \"sgds-icon-button\": SgdsIconButton\n };\n\n /** Indicates if mobile menu is open or closed */\n @state()\n protected expanded = false;\n\n /** Denotes the transition state of mobile mainnav menu opening */\n @state()\n protected expanding = false;\n\n @query(\"nav\") protected nav!: HTMLElement;\n @query(\".navbar\") protected navbar!: HTMLElement;\n @query(\".navbar-toggler\") protected header!: HTMLElement;\n @query(\".navbar-body\") protected body!: HTMLElement;\n @query(\".navbar-nav-scroll\") protected navScroll!: HTMLElement;\n @query(\".navbar-end\") protected navbarEnd!: HTMLElement;\n\n /** The href link for brand logo */\n @property({ type: String })\n brandHref = \"\";\n\n /** @internal */\n protected collapseId = genId(\"nav\", \"collapse\");\n\n /** 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 */\n @property({ type: String })\n expand: NavExpandSize = \"lg\";\n\n @state()\n protected breakpointReached = false;\n\n /** @internal Whether sgds-*-profile is slotted in the profile slot */\n @state()\n protected _hasProfileComponent = false;\n\n connectedCallback() {\n super.connectedCallback();\n this._handleResize();\n window.addEventListener(\"click\", this._handleClickOutsideBound);\n window.addEventListener(\"resize\", this._handleResizeBound);\n }\n\n disconnectedCallback() {\n super.disconnectedCallback();\n window.removeEventListener(\"click\", this._handleClickOutsideBound);\n window.removeEventListener(\"resize\", this._handleResizeBound);\n }\n\n firstUpdated(changedProperties: PropertyValueMap<this>) {\n super.firstUpdated(changedProperties);\n if (this.breakpointReached && this.body) {\n this.expanded = false;\n this.body.hidden = true;\n this._handleMobileNav();\n this._onBreakpointReached(true);\n }\n }\n\n private _handleClickOutsideBound = (event: MouseEvent) => this._handleClickOutOfElement(event, this.body);\n private _handleResizeBound = () => this._handleResize();\n\n private _handleClickOutOfElement(e: MouseEvent, self: HTMLElement) {\n if (!e.composedPath().includes(self) && !(this.header && e.composedPath().includes(this.header))) {\n this.hide();\n }\n }\n\n protected _handleSummaryClick() {\n if (this.expanded) {\n this.hide();\n } else {\n document.body.style.overflow = \"hidden\";\n this.show();\n }\n }\n\n protected _handleResize() {\n const newBreakpointReachedValue = window.innerWidth < SIZES[this.expand];\n if (newBreakpointReachedValue !== this.breakpointReached) {\n this.requestUpdate();\n } else {\n this.body ? (this.body.hidden = true) : null;\n this.expanding = false;\n }\n\n if (newBreakpointReachedValue) {\n this._handleMobileNav();\n if (!this._isBreakpointReached()) {\n this._onBreakpointReached(true);\n window.addEventListener(\"scrollend\", this._handleMobileNavBound);\n }\n } else {\n this._handleDesktopNav();\n this._onBreakpointReached(false);\n window.removeEventListener(\"scrollend\", this._handleMobileNavBound);\n }\n }\n\n /** Hook for subclasses to update context providers when breakpoint state changes */\n protected abstract _onBreakpointReached(reached: boolean): void;\n\n /** Hook for subclasses to check current breakpoint context state */\n protected abstract _isBreakpointReached(): boolean;\n\n private _handleMobileNavBound = this._handleMobileNav.bind(this);\n\n protected async _handleMobileNav() {\n if (!this.nav) return;\n this.nav.appendChild(this.body);\n await customElements.whenDefined(\"sgds-masthead\");\n\n const { bottom } = this.nav.getBoundingClientRect();\n const navBodyPaddingY =\n parseFloat(getComputedStyle(this.body).paddingTop) + parseFloat(getComputedStyle(this.body).paddingBottom);\n\n this.navScroll.style.maxHeight = `calc(100dvh - ${bottom}px - ${navBodyPaddingY}px)`;\n }\n\n protected _handleDesktopNav() {\n this.navbar?.insertBefore(this.body, this.navbarEnd);\n }\n\n private async _animateToShow() {\n const sgdsShow = this.emit(\"sgds-show\", { cancelable: true });\n if (sgdsShow.defaultPrevented) {\n this.expanding = false;\n this.expanded = false;\n return;\n }\n\n await stopAnimations(this.body);\n this.body.hidden = false;\n\n const { keyframes, options } = getAnimation(this, \"nav.show\");\n await animateTo(this.body, shimKeyframesHeightAuto(keyframes, this.body.scrollHeight), options);\n this.body.style.height = \"auto\";\n\n this._onMenuShown();\n this.emit(\"sgds-after-show\");\n }\n\n /** Hook for subclasses to perform actions after the mobile menu opens (e.g., focus management) */\n protected _onMenuShown(): void {\n // Default: no-op. Subclasses can override.\n }\n\n private async _animateToHide() {\n const sgdsHide = this.emit(\"sgds-hide\", { cancelable: true });\n if (sgdsHide.defaultPrevented) {\n this.expanding = false;\n this.expanded = true;\n return;\n }\n\n await stopAnimations(this.body);\n\n const { keyframes, options } = getAnimation(this, \"nav.hide\");\n await animateTo(this.body, shimKeyframesHeightAuto(keyframes, this.body.scrollHeight), options);\n this.body.hidden = true;\n this.body.style.height = \"auto\";\n this.emit(\"sgds-after-hide\");\n }\n\n /** @internal */\n @watch(\"expanding\", { waitUntilFirstUpdate: true })\n async handleOpenChange() {\n if (this.expanding) {\n await this._animateToShow();\n this.expanded = true;\n } else {\n this.header?.focus();\n await this._animateToHide();\n this.expanded = false;\n }\n }\n\n /** Shows the menu. For when nav is in the collapsed form */\n public async show() {\n if (this.expanded) return;\n this.expanding = true;\n return waitForEvent(this, \"sgds-after-show\");\n }\n\n /** Hide the menu. For when nav is in the collapsed form */\n public async hide() {\n if (!this.expanded) return;\n this.expanding = false;\n document.body.style.removeProperty(\"overflow\");\n return waitForEvent(this, \"sgds-after-hide\");\n }\n\n /** Helper to get the expand CSS class */\n protected _expandClass() {\n switch (this.expand) {\n case \"always\":\n return \"navbar-expand\";\n case \"never\":\n break;\n default:\n return `navbar-expand-${this.expand}`;\n }\n }\n\n /** Helper: renders the hamburger toggler icon-button. Subclasses should call this in their render(). */\n protected _renderToggler(tone?: NavTone): TemplateResult | typeof nothing {\n return html`<sgds-icon-button\n name=${this.expanded ? \"cross\" : \"menu\"}\n variant=\"ghost\"\n size=\"sm\"\n tone=${ifDefined(tone && tone !== \"default\" ? \"fixed-light\" : undefined)}\n class=\"navbar-toggler\"\n @click=${this._handleSummaryClick}\n aria-controls=\"${this.collapseId}\"\n aria-expanded=\"${this.expanded}\"\n .ariaLabel=${\"Toggle navigation\"}\n ></sgds-icon-button>`;\n }\n}\n\nsetDefaultAnimation(\"nav.show\", {\n keyframes: [\n { height: \"0\", opacity: \"0\" },\n { height: \"auto\", opacity: \"1\" }\n ],\n options: { duration: 200, easing: \"ease-in-out\" }\n});\n\nsetDefaultAnimation(\"nav.hide\", {\n keyframes: [\n { height: \"auto\", opacity: \"1\" },\n { height: \"0\", opacity: \"0\" }\n ],\n options: { duration: 200, easing: \"ease-in-out\" }\n});\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,196 @@
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 classMap_js = require('lit/directives/class-map.js');
10
+ var ifDefined_js = require('lit/directives/if-defined.js');
11
+ var dom = require('@floating-ui/dom');
12
+ var sgdsElement = require('./sgds-element.cjs.js');
13
+ var sgdsDropdown = require('../components/Dropdown/sgds-dropdown.cjs.js');
14
+ var sgdsIcon = require('../components/Icon/sgds-icon.cjs.js');
15
+ var navProfile = require('./nav-profile.cjs.js');
16
+ var generateId = require('../utils/generateId.cjs.js');
17
+
18
+ /**
19
+ * Base class for navigation profile components (sgds-mainnav-profile and sgds-appnav-profile).
20
+ * Provides the full profile dropdown (desktop) and mobile panel behavior.
21
+ * When no dropdown items are slotted into the default slot, renders as a non-interactive
22
+ * read-only element (no dropdown menu, no caret icon, cursor default, not focusable by keyboard or mouse).
23
+ * Subclasses must consume the appropriate breakpoint context and set `_breakpointReached`.
24
+ *
25
+ * @slot avatar - Avatar element displayed in both desktop (before label) and mobile (as toggler)
26
+ * @slot default - Profile menu items (sgds-dropdown-item elements). When empty, the component becomes read-only.
27
+ */
28
+ class NavProfileElement extends sgdsElement["default"] {
29
+ constructor() {
30
+ super(...arguments);
31
+ /** @internal Whether the breakpoint is reached (mobile mode). Subclasses set this via context consumption. */
32
+ this._breakpointReached = true;
33
+ /** @internal Whether the mobile menu is open */
34
+ this._mobileMenuOpen = false;
35
+ /** @internal Whether dropdown items are slotted */
36
+ this._hasDropdownItems = false;
37
+ /** Primary text displayed next to the avatar in desktop (e.g. user name) */
38
+ this.label = "";
39
+ /** Secondary text displayed below the label in desktop (e.g. agency or role) */
40
+ this.secondaryText = "";
41
+ /** When true, disables the profile dropdown */
42
+ this.disabled = false;
43
+ /** Accessible label for the profile toggle button */
44
+ this.ariaLabel = "";
45
+ /** Controls dropdown close behavior. "default" auto-closes on item/outside click, "outside" closes only on outside click, "inside" prevents auto-close. */
46
+ this.close = "default";
47
+ /** @internal */
48
+ this.togglerId = generateId["default"]("profile", "button");
49
+ this._handleMobileToggle = () => {
50
+ this._mobileMenuOpen = !this._mobileMenuOpen;
51
+ };
52
+ this._handleClickOutside = (e) => {
53
+ if (!this._mobileMenuOpen)
54
+ return;
55
+ if (this.close === "inside")
56
+ return;
57
+ if (!e.composedPath().includes(this)) {
58
+ this._mobileMenuOpen = false;
59
+ }
60
+ };
61
+ this._handleSlotChange = () => {
62
+ this._hasDropdownItems = this._defaultSlotElements.length > 0;
63
+ };
64
+ this._handleKeydown = (e) => {
65
+ if (e.key === "Enter" || e.key === " ") {
66
+ e.preventDefault();
67
+ this._handleMobileToggle();
68
+ }
69
+ };
70
+ }
71
+ connectedCallback() {
72
+ super.connectedCallback();
73
+ window.addEventListener("click", this._handleClickOutside);
74
+ }
75
+ disconnectedCallback() {
76
+ super.disconnectedCallback();
77
+ window.removeEventListener("click", this._handleClickOutside);
78
+ }
79
+ render() {
80
+ if (!this._breakpointReached) {
81
+ // Desktop: read-only (no dropdown items)
82
+ if (!this._hasDropdownItems) {
83
+ return lit.html `
84
+ <div
85
+ class="${classMap_js.classMap({
86
+ "nav-link": true,
87
+ "read-only": true
88
+ })}"
89
+ aria-label=${ifDefined_js.ifDefined(this.ariaLabel)}
90
+ >
91
+ <slot name="avatar"></slot>
92
+ ${this.label || this.secondaryText
93
+ ? lit.html `<div class="profile-text">
94
+ ${this.label ? lit.html `<span class="profile-label">${this.label}</span>` : lit.nothing}
95
+ ${this.secondaryText
96
+ ? lit.html `<span class="profile-secondary-text">${this.secondaryText}</span>`
97
+ : lit.nothing}
98
+ </div>`
99
+ : lit.nothing}
100
+ </div>
101
+ <slot @slotchange=${this._handleSlotChange}></slot>
102
+ `;
103
+ }
104
+ // Desktop: dropdown with avatar + label + secondaryText
105
+ return lit.html `
106
+ <sgds-dropdown .floatingOpts=${{ middleware: [dom.offset(0)] }} ?disabled=${this.disabled} close=${this.close}>
107
+ <button
108
+ class="${classMap_js.classMap({
109
+ "nav-link": true,
110
+ disabled: this.disabled
111
+ })}"
112
+ aria-disabled=${this.disabled ? "true" : "false"}
113
+ aria-label=${ifDefined_js.ifDefined(this.ariaLabel)}
114
+ id=${this.togglerId}
115
+ tabindex=${this.disabled ? "-1" : "0"}
116
+ slot="toggler"
117
+ >
118
+ <slot name="avatar"></slot>
119
+ ${this.label || this.secondaryText
120
+ ? lit.html `<div class="profile-text">
121
+ ${this.label ? lit.html `<span class="profile-label">${this.label}</span>` : lit.nothing}
122
+ ${this.secondaryText
123
+ ? lit.html `<span class="profile-secondary-text">${this.secondaryText}</span>`
124
+ : lit.nothing}
125
+ </div>`
126
+ : lit.nothing}
127
+ <sgds-icon name="chevron-down" size="md"></sgds-icon>
128
+ </button>
129
+ <slot @slotchange=${this._handleSlotChange}></slot>
130
+ </sgds-dropdown>
131
+ `;
132
+ }
133
+ // Mobile: read-only (no dropdown items)
134
+ if (!this._hasDropdownItems) {
135
+ return lit.html `
136
+ <div class="profile-avatar-mobile read-only">
137
+ <slot name="avatar"></slot>
138
+ </div>
139
+ <slot @slotchange=${this._handleSlotChange}></slot>
140
+ `;
141
+ }
142
+ // Mobile: avatar toggler + self-contained mobile panel
143
+ return lit.html `
144
+ <button
145
+ class="profile-avatar-mobile"
146
+ aria-label=${this.ariaLabel || "Toggle navigation"}
147
+ aria-expanded=${this._mobileMenuOpen ? "true" : "false"}
148
+ @click=${this._handleMobileToggle}
149
+ @keydown=${this._handleKeydown}
150
+ >
151
+ <slot name="avatar"></slot>
152
+ </button>
153
+ <div class="profile-mobile-panel" ?hidden=${!this._mobileMenuOpen}>
154
+ <div class="profile-mobile-items">
155
+ <slot @slotchange=${this._handleSlotChange}></slot>
156
+ </div>
157
+ </div>
158
+ `;
159
+ }
160
+ }
161
+ NavProfileElement.styles = [...sgdsElement["default"].styles, navProfile["default"]];
162
+ /** @internal */
163
+ NavProfileElement.dependencies = {
164
+ "sgds-dropdown": sgdsDropdown.SgdsDropdown,
165
+ "sgds-icon": sgdsIcon.SgdsIcon
166
+ };
167
+ tslib.__decorate([
168
+ decorators_js.state()
169
+ ], NavProfileElement.prototype, "_breakpointReached", void 0);
170
+ tslib.__decorate([
171
+ decorators_js.state()
172
+ ], NavProfileElement.prototype, "_mobileMenuOpen", void 0);
173
+ tslib.__decorate([
174
+ decorators_js.state()
175
+ ], NavProfileElement.prototype, "_hasDropdownItems", void 0);
176
+ tslib.__decorate([
177
+ decorators_js.queryAssignedElements({ flatten: true })
178
+ ], NavProfileElement.prototype, "_defaultSlotElements", void 0);
179
+ tslib.__decorate([
180
+ decorators_js.property({ type: String, reflect: true })
181
+ ], NavProfileElement.prototype, "label", void 0);
182
+ tslib.__decorate([
183
+ decorators_js.property({ type: String, reflect: true })
184
+ ], NavProfileElement.prototype, "secondaryText", void 0);
185
+ tslib.__decorate([
186
+ decorators_js.property({ type: Boolean })
187
+ ], NavProfileElement.prototype, "disabled", void 0);
188
+ tslib.__decorate([
189
+ decorators_js.property({ type: String })
190
+ ], NavProfileElement.prototype, "ariaLabel", void 0);
191
+ tslib.__decorate([
192
+ decorators_js.property({ type: String })
193
+ ], NavProfileElement.prototype, "close", void 0);
194
+
195
+ exports["default"] = NavProfileElement;
196
+ //# sourceMappingURL=nav-profile-element.cjs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nav-profile-element.cjs.js","sources":["../../../src/base/nav-profile-element.ts"],"sourcesContent":["import { html, nothing } from \"lit\";\nimport { property, queryAssignedElements, state } from \"lit/decorators.js\";\nimport { classMap } from \"lit/directives/class-map.js\";\nimport { ifDefined } from \"lit/directives/if-defined.js\";\nimport { offset } from \"@floating-ui/dom\";\nimport SgdsElement from \"./sgds-element\";\nimport SgdsDropdown from \"../components/Dropdown/sgds-dropdown\";\nimport SgdsIcon from \"../components/Icon/sgds-icon\";\nimport navProfileStyle from \"./nav-profile.css\";\nimport genId from \"../utils/generateId\";\n\n/**\n * Base class for navigation profile components (sgds-mainnav-profile and sgds-appnav-profile).\n * Provides the full profile dropdown (desktop) and mobile panel behavior.\n * When no dropdown items are slotted into the default slot, renders as a non-interactive\n * read-only element (no dropdown menu, no caret icon, cursor default, not focusable by keyboard or mouse).\n * Subclasses must consume the appropriate breakpoint context and set `_breakpointReached`.\n *\n * @slot avatar - Avatar element displayed in both desktop (before label) and mobile (as toggler)\n * @slot default - Profile menu items (sgds-dropdown-item elements). When empty, the component becomes read-only.\n */\nexport default abstract class NavProfileElement extends SgdsElement {\n static styles = [...SgdsElement.styles, navProfileStyle];\n /** @internal */\n static dependencies = {\n \"sgds-dropdown\": SgdsDropdown,\n \"sgds-icon\": SgdsIcon\n };\n\n /** @internal Whether the breakpoint is reached (mobile mode). Subclasses set this via context consumption. */\n @state()\n protected _breakpointReached = true;\n\n /** @internal Whether the mobile menu is open */\n @state()\n private _mobileMenuOpen = false;\n\n /** @internal Whether dropdown items are slotted */\n @state()\n private _hasDropdownItems = false;\n\n @queryAssignedElements({ flatten: true })\n private _defaultSlotElements!: HTMLElement[];\n\n /** Primary text displayed next to the avatar in desktop (e.g. user name) */\n @property({ type: String, reflect: true })\n label = \"\";\n\n /** Secondary text displayed below the label in desktop (e.g. agency or role) */\n @property({ type: String, reflect: true })\n secondaryText = \"\";\n\n /** When true, disables the profile dropdown */\n @property({ type: Boolean })\n disabled = false;\n\n /** Accessible label for the profile toggle button */\n @property({ type: String })\n ariaLabel = \"\";\n\n /** Controls dropdown close behavior. \"default\" auto-closes on item/outside click, \"outside\" closes only on outside click, \"inside\" prevents auto-close. */\n @property({ type: String })\n close: \"default\" | \"outside\" | \"inside\" = \"default\";\n\n /** @internal */\n private togglerId: string = genId(\"profile\", \"button\");\n\n private _handleMobileToggle = () => {\n this._mobileMenuOpen = !this._mobileMenuOpen;\n };\n\n private _handleClickOutside = (e: MouseEvent) => {\n if (!this._mobileMenuOpen) return;\n if (this.close === \"inside\") return;\n if (!e.composedPath().includes(this)) {\n this._mobileMenuOpen = false;\n }\n };\n\n connectedCallback() {\n super.connectedCallback();\n window.addEventListener(\"click\", this._handleClickOutside);\n }\n\n disconnectedCallback() {\n super.disconnectedCallback();\n window.removeEventListener(\"click\", this._handleClickOutside);\n }\n\n private _handleSlotChange = () => {\n this._hasDropdownItems = this._defaultSlotElements.length > 0;\n };\n\n private _handleKeydown = (e: KeyboardEvent) => {\n if (e.key === \"Enter\" || e.key === \" \") {\n e.preventDefault();\n this._handleMobileToggle();\n }\n };\n\n render() {\n if (!this._breakpointReached) {\n // Desktop: read-only (no dropdown items)\n if (!this._hasDropdownItems) {\n return html`\n <div\n class=\"${classMap({\n \"nav-link\": true,\n \"read-only\": true\n })}\"\n aria-label=${ifDefined(this.ariaLabel)}\n >\n <slot name=\"avatar\"></slot>\n ${this.label || this.secondaryText\n ? html`<div class=\"profile-text\">\n ${this.label ? html`<span class=\"profile-label\">${this.label}</span>` : nothing}\n ${this.secondaryText\n ? html`<span class=\"profile-secondary-text\">${this.secondaryText}</span>`\n : nothing}\n </div>`\n : nothing}\n </div>\n <slot @slotchange=${this._handleSlotChange}></slot>\n `;\n }\n\n // Desktop: dropdown with avatar + label + secondaryText\n return html`\n <sgds-dropdown .floatingOpts=${{ middleware: [offset(0)] }} ?disabled=${this.disabled} close=${this.close}>\n <button\n class=\"${classMap({\n \"nav-link\": true,\n disabled: this.disabled\n })}\"\n aria-disabled=${this.disabled ? \"true\" : \"false\"}\n aria-label=${ifDefined(this.ariaLabel)}\n id=${this.togglerId}\n tabindex=${this.disabled ? \"-1\" : \"0\"}\n slot=\"toggler\"\n >\n <slot name=\"avatar\"></slot>\n ${this.label || this.secondaryText\n ? html`<div class=\"profile-text\">\n ${this.label ? html`<span class=\"profile-label\">${this.label}</span>` : nothing}\n ${this.secondaryText\n ? html`<span class=\"profile-secondary-text\">${this.secondaryText}</span>`\n : nothing}\n </div>`\n : nothing}\n <sgds-icon name=\"chevron-down\" size=\"md\"></sgds-icon>\n </button>\n <slot @slotchange=${this._handleSlotChange}></slot>\n </sgds-dropdown>\n `;\n }\n\n // Mobile: read-only (no dropdown items)\n if (!this._hasDropdownItems) {\n return html`\n <div class=\"profile-avatar-mobile read-only\">\n <slot name=\"avatar\"></slot>\n </div>\n <slot @slotchange=${this._handleSlotChange}></slot>\n `;\n }\n\n // Mobile: avatar toggler + self-contained mobile panel\n return html`\n <button\n class=\"profile-avatar-mobile\"\n aria-label=${this.ariaLabel || \"Toggle navigation\"}\n aria-expanded=${this._mobileMenuOpen ? \"true\" : \"false\"}\n @click=${this._handleMobileToggle}\n @keydown=${this._handleKeydown}\n >\n <slot name=\"avatar\"></slot>\n </button>\n <div class=\"profile-mobile-panel\" ?hidden=${!this._mobileMenuOpen}>\n <div class=\"profile-mobile-items\">\n <slot @slotchange=${this._handleSlotChange}></slot>\n </div>\n </div>\n `;\n }\n}\n"],"names":["SgdsElement","genId","html","classMap","ifDefined","nothing","offset","navProfileStyle","SgdsDropdown","SgdsIcon","__decorate","state","queryAssignedElements","property"],"mappings":"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"}