@govtechsg/sgds-web-component 3.28.1-rc.0 → 3.29.1-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 (195) hide show
  1. package/base/button.js +1 -1
  2. package/base/button.js.map +1 -1
  3. package/base/dropdown-list-element.d.ts +3 -3
  4. package/base/dropdown-list-element.js.map +1 -1
  5. package/components/Alert/alert.js +1 -1
  6. package/components/Alert/alert.js.map +1 -1
  7. package/components/Alert/index.umd.min.js +3 -3
  8. package/components/Alert/index.umd.min.js.map +1 -1
  9. package/components/Alert/sgds-alert.js +1 -1
  10. package/components/Alert/sgds-alert.js.map +1 -1
  11. package/components/Appnav/index.umd.min.js +3 -3
  12. package/components/Appnav/index.umd.min.js.map +1 -1
  13. package/components/Appnav/sgds-appnav.js +1 -1
  14. package/components/Appnav/sgds-appnav.js.map +1 -1
  15. package/components/Badge/index.umd.min.js +1 -1
  16. package/components/Badge/index.umd.min.js.map +1 -1
  17. package/components/Breadcrumb/index.umd.min.js +3 -3
  18. package/components/Breadcrumb/index.umd.min.js.map +1 -1
  19. package/components/Breadcrumb/sgds-breadcrumb.js +2 -2
  20. package/components/Breadcrumb/sgds-breadcrumb.js.map +1 -1
  21. package/components/Button/index.umd.min.js +2 -2
  22. package/components/Button/index.umd.min.js.map +1 -1
  23. package/components/Button/sgds-button.js +1 -1
  24. package/components/Button/sgds-button.js.map +1 -1
  25. package/components/Checkbox/index.umd.min.js +3 -2
  26. package/components/Checkbox/index.umd.min.js.map +1 -1
  27. package/components/Checkbox/sgds-checkbox.d.ts +2 -0
  28. package/components/Checkbox/sgds-checkbox.js +3 -0
  29. package/components/Checkbox/sgds-checkbox.js.map +1 -1
  30. package/components/CloseButton/close-button.js +1 -1
  31. package/components/CloseButton/close-button.js.map +1 -1
  32. package/components/CloseButton/index.umd.min.js +1 -1
  33. package/components/CloseButton/index.umd.min.js.map +1 -1
  34. package/components/ComboBox/combo-box.js +1 -1
  35. package/components/ComboBox/combo-box.js.map +1 -1
  36. package/components/ComboBox/index.umd.min.js +30 -20
  37. package/components/ComboBox/index.umd.min.js.map +1 -1
  38. package/components/ComboBox/sgds-combo-box.d.ts +23 -2
  39. package/components/ComboBox/sgds-combo-box.js +95 -4
  40. package/components/ComboBox/sgds-combo-box.js.map +1 -1
  41. package/components/ComboBox/types.d.ts +3 -0
  42. package/components/DataTable/data-table.js +1 -1
  43. package/components/DataTable/data-table.js.map +1 -1
  44. package/components/DataTable/index.umd.min.js +20 -11
  45. package/components/DataTable/index.umd.min.js.map +1 -1
  46. package/components/DataTable/sgds-data-table-row.js +12 -4
  47. package/components/DataTable/sgds-data-table-row.js.map +1 -1
  48. package/components/DataTable/sgds-data-table.js +1 -2
  49. package/components/DataTable/sgds-data-table.js.map +1 -1
  50. package/components/Datepicker/index.umd.min.js +3 -2
  51. package/components/Datepicker/index.umd.min.js.map +1 -1
  52. package/components/Drawer/index.umd.min.js +1 -1
  53. package/components/Drawer/index.umd.min.js.map +1 -1
  54. package/components/Dropdown/index.umd.min.js +1 -1
  55. package/components/Dropdown/index.umd.min.js.map +1 -1
  56. package/components/Dropdown/sgds-dropdown.js +1 -1
  57. package/components/Dropdown/sgds-dropdown.js.map +1 -1
  58. package/components/FileUpload/index.umd.min.js +3 -3
  59. package/components/FileUpload/index.umd.min.js.map +1 -1
  60. package/components/IconButton/index.umd.min.js +1 -1
  61. package/components/IconButton/index.umd.min.js.map +1 -1
  62. package/components/Input/index.umd.min.js +1 -0
  63. package/components/Input/index.umd.min.js.map +1 -1
  64. package/components/Input/sgds-input.js +1 -0
  65. package/components/Input/sgds-input.js.map +1 -1
  66. package/components/Mainnav/index.umd.min.js +3 -3
  67. package/components/Mainnav/index.umd.min.js.map +1 -1
  68. package/components/Mainnav/sgds-mainnav.js +1 -1
  69. package/components/Mainnav/sgds-mainnav.js.map +1 -1
  70. package/components/Modal/index.umd.min.js +3 -3
  71. package/components/Modal/index.umd.min.js.map +1 -1
  72. package/components/Modal/modal.js +1 -1
  73. package/components/Modal/modal.js.map +1 -1
  74. package/components/Modal/sgds-modal.js +1 -1
  75. package/components/Modal/sgds-modal.js.map +1 -1
  76. package/components/OverflowMenu/index.umd.min.js +1 -1
  77. package/components/OverflowMenu/index.umd.min.js.map +1 -1
  78. package/components/Pagination/index.umd.min.js +2 -2
  79. package/components/Pagination/index.umd.min.js.map +1 -1
  80. package/components/QuantityToggle/index.umd.min.js +2 -1
  81. package/components/QuantityToggle/index.umd.min.js.map +1 -1
  82. package/components/Select/index.umd.min.js +1 -1
  83. package/components/Select/index.umd.min.js.map +1 -1
  84. package/components/Select/sgds-select.js +1 -1
  85. package/components/Select/sgds-select.js.map +1 -1
  86. package/components/Sidebar/index.umd.min.js +1 -1
  87. package/components/Sidebar/index.umd.min.js.map +1 -1
  88. package/components/Sidenav/index.umd.min.js +1 -1
  89. package/components/Sidenav/index.umd.min.js.map +1 -1
  90. package/components/Sidenav/sgds-sidenav.js +1 -1
  91. package/components/Sidenav/sgds-sidenav.js.map +1 -1
  92. package/components/SystemBanner/index.umd.min.js +4 -2
  93. package/components/SystemBanner/index.umd.min.js.map +1 -1
  94. package/components/SystemBanner/sgds-system-banner.js +2 -0
  95. package/components/SystemBanner/sgds-system-banner.js.map +1 -1
  96. package/components/Toast/index.umd.min.js +1 -1
  97. package/components/Toast/index.umd.min.js.map +1 -1
  98. package/components/index.umd.min.js +78 -57
  99. package/components/index.umd.min.js.map +1 -1
  100. package/custom-elements.json +174 -34
  101. package/index.umd.min.js +731 -710
  102. package/index.umd.min.js.map +1 -1
  103. package/package.json +1 -1
  104. package/react/base/button.cjs.js +1 -1
  105. package/react/base/button.cjs.js.map +1 -1
  106. package/react/base/button.js +1 -1
  107. package/react/base/button.js.map +1 -1
  108. package/react/base/dropdown-list-element.cjs.js.map +1 -1
  109. package/react/base/dropdown-list-element.js.map +1 -1
  110. package/react/combo-box/index.cjs.js +1 -0
  111. package/react/combo-box/index.cjs.js.map +1 -1
  112. package/react/combo-box/index.js +1 -0
  113. package/react/combo-box/index.js.map +1 -1
  114. package/react/components/Alert/alert.cjs.js +1 -1
  115. package/react/components/Alert/alert.cjs.js.map +1 -1
  116. package/react/components/Alert/alert.js +1 -1
  117. package/react/components/Alert/alert.js.map +1 -1
  118. package/react/components/Alert/sgds-alert.cjs.js +1 -1
  119. package/react/components/Alert/sgds-alert.cjs.js.map +1 -1
  120. package/react/components/Alert/sgds-alert.js +1 -1
  121. package/react/components/Alert/sgds-alert.js.map +1 -1
  122. package/react/components/Appnav/sgds-appnav.cjs.js +1 -1
  123. package/react/components/Appnav/sgds-appnav.cjs.js.map +1 -1
  124. package/react/components/Appnav/sgds-appnav.js +1 -1
  125. package/react/components/Appnav/sgds-appnav.js.map +1 -1
  126. package/react/components/Breadcrumb/sgds-breadcrumb.cjs.js +2 -2
  127. package/react/components/Breadcrumb/sgds-breadcrumb.cjs.js.map +1 -1
  128. package/react/components/Breadcrumb/sgds-breadcrumb.js +2 -2
  129. package/react/components/Breadcrumb/sgds-breadcrumb.js.map +1 -1
  130. package/react/components/Button/sgds-button.cjs.js +1 -1
  131. package/react/components/Button/sgds-button.cjs.js.map +1 -1
  132. package/react/components/Button/sgds-button.js +1 -1
  133. package/react/components/Button/sgds-button.js.map +1 -1
  134. package/react/components/Checkbox/sgds-checkbox.cjs.js +3 -0
  135. package/react/components/Checkbox/sgds-checkbox.cjs.js.map +1 -1
  136. package/react/components/Checkbox/sgds-checkbox.js +3 -0
  137. package/react/components/Checkbox/sgds-checkbox.js.map +1 -1
  138. package/react/components/CloseButton/close-button.cjs.js +1 -1
  139. package/react/components/CloseButton/close-button.cjs.js.map +1 -1
  140. package/react/components/CloseButton/close-button.js +1 -1
  141. package/react/components/CloseButton/close-button.js.map +1 -1
  142. package/react/components/ComboBox/combo-box.cjs.js +1 -1
  143. package/react/components/ComboBox/combo-box.cjs.js.map +1 -1
  144. package/react/components/ComboBox/combo-box.js +1 -1
  145. package/react/components/ComboBox/combo-box.js.map +1 -1
  146. package/react/components/ComboBox/sgds-combo-box.cjs.js +95 -4
  147. package/react/components/ComboBox/sgds-combo-box.cjs.js.map +1 -1
  148. package/react/components/ComboBox/sgds-combo-box.js +95 -4
  149. package/react/components/ComboBox/sgds-combo-box.js.map +1 -1
  150. package/react/components/DataTable/data-table.cjs.js +1 -1
  151. package/react/components/DataTable/data-table.cjs.js.map +1 -1
  152. package/react/components/DataTable/data-table.js +1 -1
  153. package/react/components/DataTable/data-table.js.map +1 -1
  154. package/react/components/DataTable/sgds-data-table-row.cjs.js +12 -4
  155. package/react/components/DataTable/sgds-data-table-row.cjs.js.map +1 -1
  156. package/react/components/DataTable/sgds-data-table-row.js +12 -4
  157. package/react/components/DataTable/sgds-data-table-row.js.map +1 -1
  158. package/react/components/DataTable/sgds-data-table.cjs.js +1 -2
  159. package/react/components/DataTable/sgds-data-table.cjs.js.map +1 -1
  160. package/react/components/DataTable/sgds-data-table.js +1 -2
  161. package/react/components/DataTable/sgds-data-table.js.map +1 -1
  162. package/react/components/Dropdown/sgds-dropdown.cjs.js +1 -1
  163. package/react/components/Dropdown/sgds-dropdown.cjs.js.map +1 -1
  164. package/react/components/Dropdown/sgds-dropdown.js +1 -1
  165. package/react/components/Dropdown/sgds-dropdown.js.map +1 -1
  166. package/react/components/Input/sgds-input.cjs.js +1 -0
  167. package/react/components/Input/sgds-input.cjs.js.map +1 -1
  168. package/react/components/Input/sgds-input.js +1 -0
  169. package/react/components/Input/sgds-input.js.map +1 -1
  170. package/react/components/Mainnav/sgds-mainnav.cjs.js +1 -1
  171. package/react/components/Mainnav/sgds-mainnav.cjs.js.map +1 -1
  172. package/react/components/Mainnav/sgds-mainnav.js +1 -1
  173. package/react/components/Mainnav/sgds-mainnav.js.map +1 -1
  174. package/react/components/Modal/modal.cjs.js +1 -1
  175. package/react/components/Modal/modal.cjs.js.map +1 -1
  176. package/react/components/Modal/modal.js +1 -1
  177. package/react/components/Modal/modal.js.map +1 -1
  178. package/react/components/Modal/sgds-modal.cjs.js +1 -1
  179. package/react/components/Modal/sgds-modal.cjs.js.map +1 -1
  180. package/react/components/Modal/sgds-modal.js +1 -1
  181. package/react/components/Modal/sgds-modal.js.map +1 -1
  182. package/react/components/Select/sgds-select.cjs.js +1 -1
  183. package/react/components/Select/sgds-select.cjs.js.map +1 -1
  184. package/react/components/Select/sgds-select.js +1 -1
  185. package/react/components/Select/sgds-select.js.map +1 -1
  186. package/react/components/Sidenav/sgds-sidenav.cjs.js +1 -1
  187. package/react/components/Sidenav/sgds-sidenav.cjs.js.map +1 -1
  188. package/react/components/Sidenav/sgds-sidenav.js +1 -1
  189. package/react/components/Sidenav/sgds-sidenav.js.map +1 -1
  190. package/react/components/SystemBanner/sgds-system-banner.cjs.js +2 -0
  191. package/react/components/SystemBanner/sgds-system-banner.cjs.js.map +1 -1
  192. package/react/components/SystemBanner/sgds-system-banner.js +2 -0
  193. package/react/components/SystemBanner/sgds-system-banner.js.map +1 -1
  194. package/themes/night.css +8 -8
  195. package/types/react.d.ts +9 -0
@@ -80,7 +80,7 @@ var SgdsMainnav = class extends require_nav_element.default {
80
80
  xxl: 1440
81
81
  }[this.expand]);
82
82
  return lit.html`
83
- <nav>
83
+ <nav aria-label="Main navigation">
84
84
  <div class="navbar ${this._expandClass()}">
85
85
  <a class="navbar-brand" href=${require_safeUrl.sanitizeHref(this.brandHref) ?? ""} aria-label="brand-link">
86
86
  <slot name="brand"></slot>
@@ -1 +1 @@
1
- {"version":3,"file":"sgds-mainnav.cjs.js","names":["NavElement","HasSlotController","mainnavStyle","sanitizeHref","classMap","provide","MainnavBreakpointContext","state","MainnavExpandedContext","property","queryAssignedElements"],"sources":["../../../../src/components/Mainnav/sgds-mainnav.ts"],"sourcesContent":["import { provide } from \"@lit/context\";\nimport { html } from \"lit\";\nimport { property, queryAssignedElements, state } from \"lit/decorators.js\";\nimport { classMap } from \"lit/directives/class-map.js\";\nimport NavElement from \"../../base/nav-element\";\nimport { sanitizeHref } from \"../../utils/safeUrl\";\nimport { HasSlotController } from \"../../utils/slot\";\nimport { MainnavBreakpointContext, MainnavExpandedContext } from \"./mainnav-context\";\nimport mainnavStyle from \"./mainnav.css\";\nimport SgdsMainnavDropdown from \"./sgds-mainnav-dropdown\";\nimport SgdsMainnavItem from \"./sgds-mainnav-item\";\n\nexport type MainnavExpandSize = \"sm\" | \"md\" | \"lg\" | \"xl\" | \"xxl\" | \"always\" | \"never\";\n\n/**\n * @summary This component is the primary means that your users will use to navigate through your portal. It includes horizontal navigation and branding to identify your site.\n *\n * @event sgds-show - Emitted on show. Only for collapsed menu.\n * @event sgds-after-show - Emitted on show after animation has completed. Only for collapsed menu.\n * @event sgds-hide - Emitted on hide. Only for collapsed menu.\n * @event sgds-after-hide - Emitted on hide after animation has completed. Only for collapsed menu.\n *\n * @slot default - Default slot of SgdsMainnav. Pass in SgdsMainnavItem elements here.\n * @slot end - Elements in this slot will be positioned to the right end of .navbar-nav. Elements in this slot will also be included in collapsed menu.\n * @slot brand - Brand slot of SgdsMainnav. Pass in brand logo img here\n * @slot profile - Profile slot positioned at the far right in desktop. In mobile, moves into the collapsed menu as the first item.\n * @slot non-collapsible - Elements in this slot will not be collapsed\n *\n */\nexport class SgdsMainnav extends NavElement {\n static styles = [...NavElement.styles, mainnavStyle];\n\n @provide({ context: MainnavBreakpointContext })\n @state()\n private _breakpointReached = false;\n\n @provide({ context: MainnavExpandedContext })\n @state()\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n private _expanded = false;\n\n /** Used only for SSR to indicate the presence of the `non-collapsible` slot. */\n @property({ type: Boolean }) hasNonCollapsibleSlot = false;\n\n /** When true, removes max-width constraint to allow content to stretch full screen width */\n @property({ type: Boolean, reflect: true })\n fluid = false;\n\n @queryAssignedElements() private defaultNodes!: SgdsMainnavItem[] | SgdsMainnavDropdown[];\n\n @queryAssignedElements({ slot: \"end\" }) private endNodes!: SgdsMainnavItem[] | SgdsMainnavDropdown[];\n\n /** @internal */\n get defaultSlotItems(): SgdsMainnavItem[] | SgdsMainnavDropdown[] {\n return [...(this.defaultNodes || [])].filter((node: HTMLElement) => typeof node.tagName !== \"undefined\") as\n | SgdsMainnavItem[]\n | SgdsMainnavDropdown[];\n }\n\n /** @internal */\n get endSlotItems(): SgdsMainnavItem[] | SgdsMainnavDropdown[] {\n return [...(this.endNodes || [])].filter((node: HTMLElement) => typeof node.tagName !== \"undefined\") as\n | SgdsMainnavItem[]\n | SgdsMainnavDropdown[];\n }\n\n private readonly hasSlotController = new HasSlotController(this, \"non-collapsible\");\n\n updated() {\n if (!this.hasNonCollapsibleSlot) this.hasNonCollapsibleSlot = this.hasSlotController.test(\"non-collapsible\");\n // Sync expanded state to context\n this._expanded = this.expanded;\n }\n\n protected _onBreakpointReached(reached: boolean): void {\n this._breakpointReached = reached;\n }\n\n protected _isBreakpointReached(): boolean {\n return this._breakpointReached;\n }\n\n private _handleDefaultSlotChange(e: Event) {\n const childElements = (e.target as HTMLSlotElement).assignedElements({ flatten: true });\n childElements.forEach(el => {\n el.setAttribute(\"expand\", this.expand);\n });\n }\n\n private _handleSlotChange(e: Event) {\n const childElements = (e.target as HTMLSlotElement).assignedElements({ flatten: true });\n childElements.forEach(e => {\n e.setAttribute(\"name\", e.tagName.toLowerCase());\n e.setAttribute(\"expand\", this.expand);\n });\n }\n\n private _handleProfileSlotChange(e: Event) {\n const childElements = (e.target as HTMLSlotElement).assignedElements({ flatten: true });\n childElements.forEach(el => {\n el.setAttribute(\"expand\", this.expand);\n });\n }\n\n render() {\n this.breakpointReached =\n window.innerWidth <\n (this.expand === \"always\"\n ? -1\n : this.expand === \"never\"\n ? Infinity\n : { sm: 512, md: 768, lg: 1024, xl: 1280, xxl: 1440 }[this.expand]);\n\n return html`\n <nav>\n <div class=\"navbar ${this._expandClass()}\">\n <a class=\"navbar-brand\" href=${sanitizeHref(this.brandHref) ?? \"\"} aria-label=\"brand-link\">\n <slot name=\"brand\"></slot>\n </a>\n <div class=\"navbar-body navbar-collapse\" id=${this.collapseId}>\n <div class=\"navbar-nav navbar-nav-scroll\">\n <slot @slotchange=${this._handleDefaultSlotChange}></slot>\n <slot\n name=\"end\"\n class=${classMap({ \"slot-end\": !this.breakpointReached })}\n @slotchange=${this._handleSlotChange}\n ></slot>\n </div>\n </div>\n <div class=\"navbar-end\">\n <slot name=\"non-collapsible\" class=${classMap({ \"slot-empty\": !this.hasNonCollapsibleSlot })}></slot>\n <slot name=\"profile\" @slotchange=${this._handleProfileSlotChange}></slot>\n ${this._renderToggler()}\n </div>\n </div>\n </nav>\n `;\n }\n}\n\nexport default SgdsMainnav;\n"],"mappings":"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"}
1
+ {"version":3,"file":"sgds-mainnav.cjs.js","names":["NavElement","HasSlotController","mainnavStyle","sanitizeHref","classMap","provide","MainnavBreakpointContext","state","MainnavExpandedContext","property","queryAssignedElements"],"sources":["../../../../src/components/Mainnav/sgds-mainnav.ts"],"sourcesContent":["import { provide } from \"@lit/context\";\nimport { html } from \"lit\";\nimport { property, queryAssignedElements, state } from \"lit/decorators.js\";\nimport { classMap } from \"lit/directives/class-map.js\";\nimport NavElement from \"../../base/nav-element\";\nimport { sanitizeHref } from \"../../utils/safeUrl\";\nimport { HasSlotController } from \"../../utils/slot\";\nimport { MainnavBreakpointContext, MainnavExpandedContext } from \"./mainnav-context\";\nimport mainnavStyle from \"./mainnav.css\";\nimport SgdsMainnavDropdown from \"./sgds-mainnav-dropdown\";\nimport SgdsMainnavItem from \"./sgds-mainnav-item\";\n\nexport type MainnavExpandSize = \"sm\" | \"md\" | \"lg\" | \"xl\" | \"xxl\" | \"always\" | \"never\";\n\n/**\n * @summary This component is the primary means that your users will use to navigate through your portal. It includes horizontal navigation and branding to identify your site.\n *\n * @event sgds-show - Emitted on show. Only for collapsed menu.\n * @event sgds-after-show - Emitted on show after animation has completed. Only for collapsed menu.\n * @event sgds-hide - Emitted on hide. Only for collapsed menu.\n * @event sgds-after-hide - Emitted on hide after animation has completed. Only for collapsed menu.\n *\n * @slot default - Default slot of SgdsMainnav. Pass in SgdsMainnavItem elements here.\n * @slot end - Elements in this slot will be positioned to the right end of .navbar-nav. Elements in this slot will also be included in collapsed menu.\n * @slot brand - Brand slot of SgdsMainnav. Pass in brand logo img here\n * @slot profile - Profile slot positioned at the far right in desktop. In mobile, moves into the collapsed menu as the first item.\n * @slot non-collapsible - Elements in this slot will not be collapsed\n *\n */\nexport class SgdsMainnav extends NavElement {\n static styles = [...NavElement.styles, mainnavStyle];\n\n @provide({ context: MainnavBreakpointContext })\n @state()\n private _breakpointReached = false;\n\n @provide({ context: MainnavExpandedContext })\n @state()\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n private _expanded = false;\n\n /** Used only for SSR to indicate the presence of the `non-collapsible` slot. */\n @property({ type: Boolean }) hasNonCollapsibleSlot = false;\n\n /** When true, removes max-width constraint to allow content to stretch full screen width */\n @property({ type: Boolean, reflect: true })\n fluid = false;\n\n @queryAssignedElements() private defaultNodes!: SgdsMainnavItem[] | SgdsMainnavDropdown[];\n\n @queryAssignedElements({ slot: \"end\" }) private endNodes!: SgdsMainnavItem[] | SgdsMainnavDropdown[];\n\n /** @internal */\n get defaultSlotItems(): SgdsMainnavItem[] | SgdsMainnavDropdown[] {\n return [...(this.defaultNodes || [])].filter((node: HTMLElement) => typeof node.tagName !== \"undefined\") as\n | SgdsMainnavItem[]\n | SgdsMainnavDropdown[];\n }\n\n /** @internal */\n get endSlotItems(): SgdsMainnavItem[] | SgdsMainnavDropdown[] {\n return [...(this.endNodes || [])].filter((node: HTMLElement) => typeof node.tagName !== \"undefined\") as\n | SgdsMainnavItem[]\n | SgdsMainnavDropdown[];\n }\n\n private readonly hasSlotController = new HasSlotController(this, \"non-collapsible\");\n\n updated() {\n if (!this.hasNonCollapsibleSlot) this.hasNonCollapsibleSlot = this.hasSlotController.test(\"non-collapsible\");\n // Sync expanded state to context\n this._expanded = this.expanded;\n }\n\n protected _onBreakpointReached(reached: boolean): void {\n this._breakpointReached = reached;\n }\n\n protected _isBreakpointReached(): boolean {\n return this._breakpointReached;\n }\n\n private _handleDefaultSlotChange(e: Event) {\n const childElements = (e.target as HTMLSlotElement).assignedElements({ flatten: true });\n childElements.forEach(el => {\n el.setAttribute(\"expand\", this.expand);\n });\n }\n\n private _handleSlotChange(e: Event) {\n const childElements = (e.target as HTMLSlotElement).assignedElements({ flatten: true });\n childElements.forEach(e => {\n e.setAttribute(\"name\", e.tagName.toLowerCase());\n e.setAttribute(\"expand\", this.expand);\n });\n }\n\n private _handleProfileSlotChange(e: Event) {\n const childElements = (e.target as HTMLSlotElement).assignedElements({ flatten: true });\n childElements.forEach(el => {\n el.setAttribute(\"expand\", this.expand);\n });\n }\n\n render() {\n this.breakpointReached =\n window.innerWidth <\n (this.expand === \"always\"\n ? -1\n : this.expand === \"never\"\n ? Infinity\n : { sm: 512, md: 768, lg: 1024, xl: 1280, xxl: 1440 }[this.expand]);\n\n return html`\n <nav aria-label=\"Main navigation\">\n <div class=\"navbar ${this._expandClass()}\">\n <a class=\"navbar-brand\" href=${sanitizeHref(this.brandHref) ?? \"\"} aria-label=\"brand-link\">\n <slot name=\"brand\"></slot>\n </a>\n <div class=\"navbar-body navbar-collapse\" id=${this.collapseId}>\n <div class=\"navbar-nav navbar-nav-scroll\">\n <slot @slotchange=${this._handleDefaultSlotChange}></slot>\n <slot\n name=\"end\"\n class=${classMap({ \"slot-end\": !this.breakpointReached })}\n @slotchange=${this._handleSlotChange}\n ></slot>\n </div>\n </div>\n <div class=\"navbar-end\">\n <slot name=\"non-collapsible\" class=${classMap({ \"slot-empty\": !this.hasNonCollapsibleSlot })}></slot>\n <slot name=\"profile\" @slotchange=${this._handleProfileSlotChange}></slot>\n ${this._renderToggler()}\n </div>\n </div>\n </nav>\n `;\n }\n}\n\nexport default SgdsMainnav;\n"],"mappings":"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"}
@@ -80,7 +80,7 @@ var SgdsMainnav = class extends NavElement {
80
80
  xxl: 1440
81
81
  }[this.expand]);
82
82
  return html`
83
- <nav>
83
+ <nav aria-label="Main navigation">
84
84
  <div class="navbar ${this._expandClass()}">
85
85
  <a class="navbar-brand" href=${sanitizeHref(this.brandHref) ?? ""} aria-label="brand-link">
86
86
  <slot name="brand"></slot>
@@ -1 +1 @@
1
- {"version":3,"file":"sgds-mainnav.js","names":["mainnavStyle"],"sources":["../../../../src/components/Mainnav/sgds-mainnav.ts"],"sourcesContent":["import { provide } from \"@lit/context\";\nimport { html } from \"lit\";\nimport { property, queryAssignedElements, state } from \"lit/decorators.js\";\nimport { classMap } from \"lit/directives/class-map.js\";\nimport NavElement from \"../../base/nav-element\";\nimport { sanitizeHref } from \"../../utils/safeUrl\";\nimport { HasSlotController } from \"../../utils/slot\";\nimport { MainnavBreakpointContext, MainnavExpandedContext } from \"./mainnav-context\";\nimport mainnavStyle from \"./mainnav.css\";\nimport SgdsMainnavDropdown from \"./sgds-mainnav-dropdown\";\nimport SgdsMainnavItem from \"./sgds-mainnav-item\";\n\nexport type MainnavExpandSize = \"sm\" | \"md\" | \"lg\" | \"xl\" | \"xxl\" | \"always\" | \"never\";\n\n/**\n * @summary This component is the primary means that your users will use to navigate through your portal. It includes horizontal navigation and branding to identify your site.\n *\n * @event sgds-show - Emitted on show. Only for collapsed menu.\n * @event sgds-after-show - Emitted on show after animation has completed. Only for collapsed menu.\n * @event sgds-hide - Emitted on hide. Only for collapsed menu.\n * @event sgds-after-hide - Emitted on hide after animation has completed. Only for collapsed menu.\n *\n * @slot default - Default slot of SgdsMainnav. Pass in SgdsMainnavItem elements here.\n * @slot end - Elements in this slot will be positioned to the right end of .navbar-nav. Elements in this slot will also be included in collapsed menu.\n * @slot brand - Brand slot of SgdsMainnav. Pass in brand logo img here\n * @slot profile - Profile slot positioned at the far right in desktop. In mobile, moves into the collapsed menu as the first item.\n * @slot non-collapsible - Elements in this slot will not be collapsed\n *\n */\nexport class SgdsMainnav extends NavElement {\n static styles = [...NavElement.styles, mainnavStyle];\n\n @provide({ context: MainnavBreakpointContext })\n @state()\n private _breakpointReached = false;\n\n @provide({ context: MainnavExpandedContext })\n @state()\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n private _expanded = false;\n\n /** Used only for SSR to indicate the presence of the `non-collapsible` slot. */\n @property({ type: Boolean }) hasNonCollapsibleSlot = false;\n\n /** When true, removes max-width constraint to allow content to stretch full screen width */\n @property({ type: Boolean, reflect: true })\n fluid = false;\n\n @queryAssignedElements() private defaultNodes!: SgdsMainnavItem[] | SgdsMainnavDropdown[];\n\n @queryAssignedElements({ slot: \"end\" }) private endNodes!: SgdsMainnavItem[] | SgdsMainnavDropdown[];\n\n /** @internal */\n get defaultSlotItems(): SgdsMainnavItem[] | SgdsMainnavDropdown[] {\n return [...(this.defaultNodes || [])].filter((node: HTMLElement) => typeof node.tagName !== \"undefined\") as\n | SgdsMainnavItem[]\n | SgdsMainnavDropdown[];\n }\n\n /** @internal */\n get endSlotItems(): SgdsMainnavItem[] | SgdsMainnavDropdown[] {\n return [...(this.endNodes || [])].filter((node: HTMLElement) => typeof node.tagName !== \"undefined\") as\n | SgdsMainnavItem[]\n | SgdsMainnavDropdown[];\n }\n\n private readonly hasSlotController = new HasSlotController(this, \"non-collapsible\");\n\n updated() {\n if (!this.hasNonCollapsibleSlot) this.hasNonCollapsibleSlot = this.hasSlotController.test(\"non-collapsible\");\n // Sync expanded state to context\n this._expanded = this.expanded;\n }\n\n protected _onBreakpointReached(reached: boolean): void {\n this._breakpointReached = reached;\n }\n\n protected _isBreakpointReached(): boolean {\n return this._breakpointReached;\n }\n\n private _handleDefaultSlotChange(e: Event) {\n const childElements = (e.target as HTMLSlotElement).assignedElements({ flatten: true });\n childElements.forEach(el => {\n el.setAttribute(\"expand\", this.expand);\n });\n }\n\n private _handleSlotChange(e: Event) {\n const childElements = (e.target as HTMLSlotElement).assignedElements({ flatten: true });\n childElements.forEach(e => {\n e.setAttribute(\"name\", e.tagName.toLowerCase());\n e.setAttribute(\"expand\", this.expand);\n });\n }\n\n private _handleProfileSlotChange(e: Event) {\n const childElements = (e.target as HTMLSlotElement).assignedElements({ flatten: true });\n childElements.forEach(el => {\n el.setAttribute(\"expand\", this.expand);\n });\n }\n\n render() {\n this.breakpointReached =\n window.innerWidth <\n (this.expand === \"always\"\n ? -1\n : this.expand === \"never\"\n ? Infinity\n : { sm: 512, md: 768, lg: 1024, xl: 1280, xxl: 1440 }[this.expand]);\n\n return html`\n <nav>\n <div class=\"navbar ${this._expandClass()}\">\n <a class=\"navbar-brand\" href=${sanitizeHref(this.brandHref) ?? \"\"} aria-label=\"brand-link\">\n <slot name=\"brand\"></slot>\n </a>\n <div class=\"navbar-body navbar-collapse\" id=${this.collapseId}>\n <div class=\"navbar-nav navbar-nav-scroll\">\n <slot @slotchange=${this._handleDefaultSlotChange}></slot>\n <slot\n name=\"end\"\n class=${classMap({ \"slot-end\": !this.breakpointReached })}\n @slotchange=${this._handleSlotChange}\n ></slot>\n </div>\n </div>\n <div class=\"navbar-end\">\n <slot name=\"non-collapsible\" class=${classMap({ \"slot-empty\": !this.hasNonCollapsibleSlot })}></slot>\n <slot name=\"profile\" @slotchange=${this._handleProfileSlotChange}></slot>\n ${this._renderToggler()}\n </div>\n </div>\n </nav>\n `;\n }\n}\n\nexport default SgdsMainnav;\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;AA6BA,IAAa,cAAb,cAAiC,WAAW;;;EAKb,KAAA,qBAAA;EAKT,KAAA,YAAA;EAGiC,KAAA,wBAAA;EAI7C,KAAA,QAAA;EAoB6B,KAAA,oBAAA,IAAI,kBAAkB,MAAM,iBAAiB;;;EApClE,KAAA,SAAA,CAAC,GAAG,WAAW,QAAQA,QAAY;;;CAuBnD,IAAI,mBAA8D;EAChE,OAAO,CAAC,GAAI,KAAK,gBAAgB,CAAC,CAAE,CAAC,CAAC,QAAQ,SAAsB,OAAO,KAAK,YAAY,WAAW;CAGzG;;CAGA,IAAI,eAA0D;EAC5D,OAAO,CAAC,GAAI,KAAK,YAAY,CAAC,CAAE,CAAC,CAAC,QAAQ,SAAsB,OAAO,KAAK,YAAY,WAAW;CAGrG;CAIA,UAAU;EACR,IAAI,CAAC,KAAK,uBAAuB,KAAK,wBAAwB,KAAK,kBAAkB,KAAK,iBAAiB;EAE3G,KAAK,YAAY,KAAK;CACxB;CAEA,qBAA+B,SAAwB;EACrD,KAAK,qBAAqB;CAC5B;CAEA,uBAA0C;EACxC,OAAO,KAAK;CACd;CAEA,yBAAiC,GAAU;EAEzC,EADyB,OAA2B,iBAAiB,EAAE,SAAS,KAAK,CACzE,CAAC,CAAC,SAAQ,OAAM;GAC1B,GAAG,aAAa,UAAU,KAAK,MAAM;EACvC,CAAC;CACH;CAEA,kBAA0B,GAAU;EAElC,EADyB,OAA2B,iBAAiB,EAAE,SAAS,KAAK,CACzE,CAAC,CAAC,SAAQ,MAAK;GACzB,EAAE,aAAa,QAAQ,EAAE,QAAQ,YAAY,CAAC;GAC9C,EAAE,aAAa,UAAU,KAAK,MAAM;EACtC,CAAC;CACH;CAEA,yBAAiC,GAAU;EAEzC,EADyB,OAA2B,iBAAiB,EAAE,SAAS,KAAK,CACzE,CAAC,CAAC,SAAQ,OAAM;GAC1B,GAAG,aAAa,UAAU,KAAK,MAAM;EACvC,CAAC;CACH;CAEA,SAAS;EACP,KAAK,oBACH,OAAO,cACN,KAAK,WAAW,WACb,KACA,KAAK,WAAW,UAChB,WACA;GAAE,IAAI;GAAK,IAAI;GAAK,IAAI;GAAM,IAAI;GAAM,KAAK;EAAK,EAAE,KAAK;EAE/D,OAAO,IAAI;;6BAEc,KAAK,aAAa,EAAE;yCACR,aAAa,KAAK,SAAS,KAAK,GAAG;;;wDAGpB,KAAK,WAAW;;kCAEtC,KAAK,yBAAyB;;;wBAGxC,SAAS,EAAE,YAAY,CAAC,KAAK,kBAAkB,CAAC,EAAE;8BAC5C,KAAK,kBAAkB;;;;;iDAKJ,SAAS,EAAE,cAAc,CAAC,KAAK,sBAAsB,CAAC,EAAE;+CAC1D,KAAK,yBAAyB;cAC/D,KAAK,eAAe,EAAE;;;;;CAKlC;AACF;AA1GG,WAAA,CAAA,QAAQ,EAAE,SAAS,yBAAyB,CAAC,GAC7C,MAAM,CAAA,GAAA,YAAA,WAAA,sBAAA,KAAA,CAAA;AAGN,WAAA,CAAA,QAAQ,EAAE,SAAS,uBAAuB,CAAC,GAC3C,MAAM,CAAA,GAAA,YAAA,WAAA,aAAA,KAAA,CAAA;AAKN,WAAA,CAAA,SAAS,EAAE,MAAM,QAAQ,CAAC,CAAA,GAAA,YAAA,WAAA,yBAAA,KAAA,CAAA;AAG1B,WAAA,CAAA,SAAS;CAAE,MAAM;CAAS,SAAS;AAAK,CAAC,CAAA,GAAA,YAAA,WAAA,SAAA,KAAA,CAAA;AAGzC,WAAA,CAAA,sBAAsB,CAAA,GAAA,YAAA,WAAA,gBAAA,KAAA,CAAA;AAEtB,WAAA,CAAA,sBAAsB,EAAE,MAAM,MAAM,CAAC,CAAA,GAAA,YAAA,WAAA,YAAA,KAAA,CAAA"}
1
+ {"version":3,"file":"sgds-mainnav.js","names":["mainnavStyle"],"sources":["../../../../src/components/Mainnav/sgds-mainnav.ts"],"sourcesContent":["import { provide } from \"@lit/context\";\nimport { html } from \"lit\";\nimport { property, queryAssignedElements, state } from \"lit/decorators.js\";\nimport { classMap } from \"lit/directives/class-map.js\";\nimport NavElement from \"../../base/nav-element\";\nimport { sanitizeHref } from \"../../utils/safeUrl\";\nimport { HasSlotController } from \"../../utils/slot\";\nimport { MainnavBreakpointContext, MainnavExpandedContext } from \"./mainnav-context\";\nimport mainnavStyle from \"./mainnav.css\";\nimport SgdsMainnavDropdown from \"./sgds-mainnav-dropdown\";\nimport SgdsMainnavItem from \"./sgds-mainnav-item\";\n\nexport type MainnavExpandSize = \"sm\" | \"md\" | \"lg\" | \"xl\" | \"xxl\" | \"always\" | \"never\";\n\n/**\n * @summary This component is the primary means that your users will use to navigate through your portal. It includes horizontal navigation and branding to identify your site.\n *\n * @event sgds-show - Emitted on show. Only for collapsed menu.\n * @event sgds-after-show - Emitted on show after animation has completed. Only for collapsed menu.\n * @event sgds-hide - Emitted on hide. Only for collapsed menu.\n * @event sgds-after-hide - Emitted on hide after animation has completed. Only for collapsed menu.\n *\n * @slot default - Default slot of SgdsMainnav. Pass in SgdsMainnavItem elements here.\n * @slot end - Elements in this slot will be positioned to the right end of .navbar-nav. Elements in this slot will also be included in collapsed menu.\n * @slot brand - Brand slot of SgdsMainnav. Pass in brand logo img here\n * @slot profile - Profile slot positioned at the far right in desktop. In mobile, moves into the collapsed menu as the first item.\n * @slot non-collapsible - Elements in this slot will not be collapsed\n *\n */\nexport class SgdsMainnav extends NavElement {\n static styles = [...NavElement.styles, mainnavStyle];\n\n @provide({ context: MainnavBreakpointContext })\n @state()\n private _breakpointReached = false;\n\n @provide({ context: MainnavExpandedContext })\n @state()\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n private _expanded = false;\n\n /** Used only for SSR to indicate the presence of the `non-collapsible` slot. */\n @property({ type: Boolean }) hasNonCollapsibleSlot = false;\n\n /** When true, removes max-width constraint to allow content to stretch full screen width */\n @property({ type: Boolean, reflect: true })\n fluid = false;\n\n @queryAssignedElements() private defaultNodes!: SgdsMainnavItem[] | SgdsMainnavDropdown[];\n\n @queryAssignedElements({ slot: \"end\" }) private endNodes!: SgdsMainnavItem[] | SgdsMainnavDropdown[];\n\n /** @internal */\n get defaultSlotItems(): SgdsMainnavItem[] | SgdsMainnavDropdown[] {\n return [...(this.defaultNodes || [])].filter((node: HTMLElement) => typeof node.tagName !== \"undefined\") as\n | SgdsMainnavItem[]\n | SgdsMainnavDropdown[];\n }\n\n /** @internal */\n get endSlotItems(): SgdsMainnavItem[] | SgdsMainnavDropdown[] {\n return [...(this.endNodes || [])].filter((node: HTMLElement) => typeof node.tagName !== \"undefined\") as\n | SgdsMainnavItem[]\n | SgdsMainnavDropdown[];\n }\n\n private readonly hasSlotController = new HasSlotController(this, \"non-collapsible\");\n\n updated() {\n if (!this.hasNonCollapsibleSlot) this.hasNonCollapsibleSlot = this.hasSlotController.test(\"non-collapsible\");\n // Sync expanded state to context\n this._expanded = this.expanded;\n }\n\n protected _onBreakpointReached(reached: boolean): void {\n this._breakpointReached = reached;\n }\n\n protected _isBreakpointReached(): boolean {\n return this._breakpointReached;\n }\n\n private _handleDefaultSlotChange(e: Event) {\n const childElements = (e.target as HTMLSlotElement).assignedElements({ flatten: true });\n childElements.forEach(el => {\n el.setAttribute(\"expand\", this.expand);\n });\n }\n\n private _handleSlotChange(e: Event) {\n const childElements = (e.target as HTMLSlotElement).assignedElements({ flatten: true });\n childElements.forEach(e => {\n e.setAttribute(\"name\", e.tagName.toLowerCase());\n e.setAttribute(\"expand\", this.expand);\n });\n }\n\n private _handleProfileSlotChange(e: Event) {\n const childElements = (e.target as HTMLSlotElement).assignedElements({ flatten: true });\n childElements.forEach(el => {\n el.setAttribute(\"expand\", this.expand);\n });\n }\n\n render() {\n this.breakpointReached =\n window.innerWidth <\n (this.expand === \"always\"\n ? -1\n : this.expand === \"never\"\n ? Infinity\n : { sm: 512, md: 768, lg: 1024, xl: 1280, xxl: 1440 }[this.expand]);\n\n return html`\n <nav aria-label=\"Main navigation\">\n <div class=\"navbar ${this._expandClass()}\">\n <a class=\"navbar-brand\" href=${sanitizeHref(this.brandHref) ?? \"\"} aria-label=\"brand-link\">\n <slot name=\"brand\"></slot>\n </a>\n <div class=\"navbar-body navbar-collapse\" id=${this.collapseId}>\n <div class=\"navbar-nav navbar-nav-scroll\">\n <slot @slotchange=${this._handleDefaultSlotChange}></slot>\n <slot\n name=\"end\"\n class=${classMap({ \"slot-end\": !this.breakpointReached })}\n @slotchange=${this._handleSlotChange}\n ></slot>\n </div>\n </div>\n <div class=\"navbar-end\">\n <slot name=\"non-collapsible\" class=${classMap({ \"slot-empty\": !this.hasNonCollapsibleSlot })}></slot>\n <slot name=\"profile\" @slotchange=${this._handleProfileSlotChange}></slot>\n ${this._renderToggler()}\n </div>\n </div>\n </nav>\n `;\n }\n}\n\nexport default SgdsMainnav;\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;AA6BA,IAAa,cAAb,cAAiC,WAAW;;;EAKb,KAAA,qBAAA;EAKT,KAAA,YAAA;EAGiC,KAAA,wBAAA;EAI7C,KAAA,QAAA;EAoB6B,KAAA,oBAAA,IAAI,kBAAkB,MAAM,iBAAiB;;;EApClE,KAAA,SAAA,CAAC,GAAG,WAAW,QAAQA,QAAY;;;CAuBnD,IAAI,mBAA8D;EAChE,OAAO,CAAC,GAAI,KAAK,gBAAgB,CAAC,CAAE,CAAC,CAAC,QAAQ,SAAsB,OAAO,KAAK,YAAY,WAAW;CAGzG;;CAGA,IAAI,eAA0D;EAC5D,OAAO,CAAC,GAAI,KAAK,YAAY,CAAC,CAAE,CAAC,CAAC,QAAQ,SAAsB,OAAO,KAAK,YAAY,WAAW;CAGrG;CAIA,UAAU;EACR,IAAI,CAAC,KAAK,uBAAuB,KAAK,wBAAwB,KAAK,kBAAkB,KAAK,iBAAiB;EAE3G,KAAK,YAAY,KAAK;CACxB;CAEA,qBAA+B,SAAwB;EACrD,KAAK,qBAAqB;CAC5B;CAEA,uBAA0C;EACxC,OAAO,KAAK;CACd;CAEA,yBAAiC,GAAU;EAEzC,EADyB,OAA2B,iBAAiB,EAAE,SAAS,KAAK,CACzE,CAAC,CAAC,SAAQ,OAAM;GAC1B,GAAG,aAAa,UAAU,KAAK,MAAM;EACvC,CAAC;CACH;CAEA,kBAA0B,GAAU;EAElC,EADyB,OAA2B,iBAAiB,EAAE,SAAS,KAAK,CACzE,CAAC,CAAC,SAAQ,MAAK;GACzB,EAAE,aAAa,QAAQ,EAAE,QAAQ,YAAY,CAAC;GAC9C,EAAE,aAAa,UAAU,KAAK,MAAM;EACtC,CAAC;CACH;CAEA,yBAAiC,GAAU;EAEzC,EADyB,OAA2B,iBAAiB,EAAE,SAAS,KAAK,CACzE,CAAC,CAAC,SAAQ,OAAM;GAC1B,GAAG,aAAa,UAAU,KAAK,MAAM;EACvC,CAAC;CACH;CAEA,SAAS;EACP,KAAK,oBACH,OAAO,cACN,KAAK,WAAW,WACb,KACA,KAAK,WAAW,UAChB,WACA;GAAE,IAAI;GAAK,IAAI;GAAK,IAAI;GAAM,IAAI;GAAM,KAAK;EAAK,EAAE,KAAK;EAE/D,OAAO,IAAI;;6BAEc,KAAK,aAAa,EAAE;yCACR,aAAa,KAAK,SAAS,KAAK,GAAG;;;wDAGpB,KAAK,WAAW;;kCAEtC,KAAK,yBAAyB;;;wBAGxC,SAAS,EAAE,YAAY,CAAC,KAAK,kBAAkB,CAAC,EAAE;8BAC5C,KAAK,kBAAkB;;;;;iDAKJ,SAAS,EAAE,cAAc,CAAC,KAAK,sBAAsB,CAAC,EAAE;+CAC1D,KAAK,yBAAyB;cAC/D,KAAK,eAAe,EAAE;;;;;CAKlC;AACF;AA1GG,WAAA,CAAA,QAAQ,EAAE,SAAS,yBAAyB,CAAC,GAC7C,MAAM,CAAA,GAAA,YAAA,WAAA,sBAAA,KAAA,CAAA;AAGN,WAAA,CAAA,QAAQ,EAAE,SAAS,uBAAuB,CAAC,GAC3C,MAAM,CAAA,GAAA,YAAA,WAAA,aAAA,KAAA,CAAA;AAKN,WAAA,CAAA,SAAS,EAAE,MAAM,QAAQ,CAAC,CAAA,GAAA,YAAA,WAAA,yBAAA,KAAA,CAAA;AAG1B,WAAA,CAAA,SAAS;CAAE,MAAM;CAAS,SAAS;AAAK,CAAC,CAAA,GAAA,YAAA,WAAA,SAAA,KAAA,CAAA;AAGzC,WAAA,CAAA,sBAAsB,CAAA,GAAA,YAAA,WAAA,gBAAA,KAAA,CAAA;AAEtB,WAAA,CAAA,sBAAsB,EAAE,MAAM,MAAM,CAAC,CAAA,GAAA,YAAA,WAAA,YAAA,KAAA,CAAA"}
@@ -1,6 +1,6 @@
1
1
  "use client";
2
2
  //#region src/components/Modal/modal.css
3
- var css_248z = require("lit").css`:host(:not([size=fullscreen])) .modal-panel{background-color:var(--sgds-surface-default);max-width:var(--sgds-dimension-640);padding:var(--sgds-padding-xl)}:host([size=sm]) .modal-panel{max-width:var(--sgds-dimension-480)}:host([size=md]) .modal-panel{max-width:var(--sgds-dimension-640)}:host([size=lg]) .modal-panel{max-width:var(--sgds-dimension-800)}:host([size=xl]) .modal-panel{max-width:var(--sgds-dimension-1280)}:host([size=fullscreen]) .modal-overlay{background-color:var(--sgds-surface-default)}:host([size=fullscreen]) .modal-panel{margin:var(--sgds-margin-xl) var(--sgds-margin-lg)}.modal{align-items:start;bottom:0;display:flex;font-family:var(--sgds-body-font-family);justify-content:center;left:0;position:fixed;right:0;top:0;z-index:var(--sgds-z-index-modal)}.modal-panel{border-radius:var(--sgds-border-radius-md);display:flex;flex-direction:column;gap:var(--sgds-gap-2-xl);margin:auto;max-height:calc(100% - var(--sgds-margin-xl) - var(--sgds-margin-xl));width:100%;z-index:2}.modal-panel:focus{outline:none}.modal-content{display:flex;flex:1 1 auto;flex-direction:column;gap:var(--sgds-gap-2-xl);min-height:0;position:relative}.modal-header__close{position:absolute;right:calc(var(--sgds-padding-md)*-1);top:calc(var(--sgds-padding-md)*-1)}@media screen and (min-width:512px){:host([size=fullscreen]) .modal-panel{margin:var(--sgds-margin-xl)}}@media screen and (min-width:768px){:host([size=fullscreen]) .modal-panel{margin:var(--sgds-margin-2-xl);max-height:calc(100% - var(--sgds-margin-2-xl) - var(--sgds-margin-2-xl))}}@media screen and (min-width:1024px){:host([size=fullscreen]) .modal-panel{margin:var(--sgds-margin-4-xl) var(--sgds-margin-lg);max-height:calc(100% - var(--sgds-margin-4-xl) - var(--sgds-margin-4-xl));max-width:var(--sgds-dimension-888)}}@media screen and (min-width:1280px){:host([size=fullscreen]) .modal-panel{max-width:var(--sgds-dimension-1168)}}@media screen and (min-width:1440px){:host([size=fullscreen]) .modal-panel{max-width:var(--sgds-dimension-1312)}}.modal.show .modal-panel{opacity:1;transform:none}.modal-header{display:flex;flex:0 0 auto;flex-direction:row;justify-content:space-between;max-width:var(--sgds-dimension-872)}.modal-header__title-description{display:flex;flex-direction:column;gap:var(--sgds-gap-sm)}:host([size=fullscreen]) .modal-header__title-description{gap:var(--sgds-gap-md)}slot[name=title]::slotted(*){align-items:center;display:flex;flex:1 1 auto;font-size:var(--sgds-font-size-heading-sm)!important;gap:1rem;line-height:var(--sgds-line-height-lg)!important;margin:var(--sgds-margin-none)!important}slot[name=description]::slotted(*){color:var(--sgds-color-subtle);line-height:var(--sgds-line-height-xs);margin:var(--sgds-margin-none)!important}.modal-body{-webkit-overflow-scrolling:touch;flex:1 1 auto;overflow:auto}.modal-body slot::slotted(*){--sgds-paragraph-spacing-xl:var(--sgds-margin-none)}.modal-footer{display:flex;flex:0 0 auto;flex-wrap:wrap;gap:var(--sgds-gap-md);justify-content:flex-end;padding-top:var(--sgds-padding-md)}.modal:not(.has-footer) .modal-footer{display:none}.modal-overlay{background-color:var(--sgds-bg-overlay);bottom:0;left:0;position:fixed;right:0;top:0}[hidden]{display:none}`;
3
+ var css_248z = require("lit").css`:host(:not([size=fullscreen])) .modal-panel{background-color:var(--sgds-surface-default);max-width:var(--sgds-dimension-640);padding:var(--sgds-padding-xl)}:host([size=sm]) .modal-panel{max-width:var(--sgds-dimension-480)}:host([size=md]) .modal-panel{max-width:var(--sgds-dimension-640)}:host([size=lg]) .modal-panel{max-width:var(--sgds-dimension-800)}:host([size=xl]) .modal-panel{max-width:var(--sgds-dimension-1280)}:host([size=fullscreen]) .modal-overlay{background-color:var(--sgds-surface-default)}:host([size=fullscreen]) .modal-panel{margin:var(--sgds-margin-xl) var(--sgds-margin-lg)}.modal{align-items:start;bottom:0;display:flex;font-family:var(--sgds-body-font-family);justify-content:center;left:0;position:fixed;right:0;top:0;z-index:var(--sgds-z-index-modal)}.modal-panel{border-radius:var(--sgds-border-radius-md);display:flex;flex-direction:column;gap:var(--sgds-gap-2-xl);margin:auto;max-height:calc(100% - var(--sgds-margin-xl) - var(--sgds-margin-xl));width:100%;z-index:2}.modal-panel:focus{outline:none}.modal-content{display:flex;flex:1 1 auto;flex-direction:column;gap:var(--sgds-gap-2-xl);min-height:0;position:relative}.modal-header__close{position:absolute;right:calc(var(--sgds-padding-md)*-1);top:calc(var(--sgds-padding-md)*-1)}@media screen and (min-width:512px){:host([size=fullscreen]) .modal-panel{margin:var(--sgds-margin-xl)}}@media screen and (min-width:768px){:host([size=fullscreen]) .modal-panel{margin:var(--sgds-margin-2-xl);max-height:calc(100% - var(--sgds-margin-2-xl) - var(--sgds-margin-2-xl))}}@media screen and (min-width:1024px){:host([size=fullscreen]) .modal-panel{margin:var(--sgds-margin-4-xl) var(--sgds-margin-lg);max-height:calc(100% - var(--sgds-margin-4-xl) - var(--sgds-margin-4-xl));max-width:var(--sgds-dimension-888)}}@media screen and (min-width:1280px){:host([size=fullscreen]) .modal-panel{max-width:var(--sgds-dimension-1168)}}@media screen and (min-width:1440px){:host([size=fullscreen]) .modal-panel{max-width:var(--sgds-dimension-1312)}}.modal.show .modal-panel{opacity:1;transform:none}.modal-header{display:flex;flex:0 0 auto;flex-direction:row;justify-content:space-between;max-width:var(--sgds-dimension-872)}.modal-header__title-description{display:flex;flex-direction:column;gap:var(--sgds-gap-sm)}:host([size=fullscreen]) .modal-header__title-description{gap:var(--sgds-gap-md)}slot[name=title]::slotted(*){align-items:center;display:flex;flex:1 1 auto;font-size:var(--sgds-font-size-heading-sm)!important;gap:1rem;line-height:var(--sgds-line-height-lg)!important;margin:var(--sgds-margin-none)!important}slot[name=description]::slotted(*){color:var(--sgds-color-subtle);line-height:var(--sgds-line-height-xs);margin:var(--sgds-margin-none)!important}.modal-body{-webkit-overflow-scrolling:touch;flex:1 1 auto;overflow:auto}.modal-body:focus-visible{outline:var(--sgds-outline-focus);outline-offset:var(--sgds-outline-offset-focus)}.modal-body slot::slotted(*){--sgds-paragraph-spacing-xl:var(--sgds-margin-none)}.modal-footer{display:flex;flex:0 0 auto;flex-wrap:wrap;gap:var(--sgds-gap-md);justify-content:flex-end;padding-top:var(--sgds-padding-md)}.modal:not(.has-footer) .modal-footer{display:none}.modal-overlay{background-color:var(--sgds-bg-overlay);bottom:0;left:0;position:fixed;right:0;top:0}[hidden]{display:none}`;
4
4
  //#endregion
5
5
  exports.default = css_248z;
6
6
 
@@ -1 +1 @@
1
- {"version":3,"file":"modal.cjs.js","names":[],"sources":["../../../../src/components/Modal/modal.css"],"sourcesContent":[":host(:not([size=\"fullscreen\"])) .modal-panel {\n background-color: var(--sgds-surface-default);\n padding: var(--sgds-padding-xl);\n max-width: var(--sgds-dimension-640);\n}\n:host([size=\"sm\"]) .modal-panel {\n max-width: var(--sgds-dimension-480);\n}\n\n:host([size=\"md\"]) .modal-panel {\n max-width: var(--sgds-dimension-640);\n}\n\n:host([size=\"lg\"]) .modal-panel {\n max-width: var(--sgds-dimension-800);\n}\n:host([size=\"xl\"]) .modal-panel {\n max-width: var(--sgds-dimension-1280);\n}\n\n:host([size=\"fullscreen\"]) .modal-overlay {\n background-color: var(--sgds-surface-default);\n}\n\n:host([size=\"fullscreen\"]) .modal-panel {\n margin: var(--sgds-margin-xl) var(--sgds-margin-lg);\n}\n\n.modal {\n display: flex;\n justify-content: center;\n align-items: start;\n position: fixed;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: var(--sgds-z-index-modal);\n font-family: var(--sgds-body-font-family);\n}\n\n.modal-panel {\n width: 100%;\n border-radius: var(--sgds-border-radius-md);\n z-index: 2; /* shift above overlay */\n display: flex;\n flex-direction: column;\n gap: var(--sgds-gap-2-xl);\n margin: auto;\n max-height: calc(100% - var(--sgds-margin-xl) - var(--sgds-margin-xl));\n}\n\n.modal-panel:focus {\n outline: none;\n}\n\n.modal-content {\n flex: 1 1 auto;\n display: flex;\n flex-direction: column;\n gap: var(--sgds-gap-2-xl);\n min-height: 0;\n position: relative;\n}\n\n.modal-header__close {\n position: absolute;\n top: calc(-1 * var(--sgds-padding-md));\n right: calc(-1 * var(--sgds-padding-md));\n}\n\n@media screen and (min-width: 512px) {\n :host([size=\"fullscreen\"]) .modal-panel {\n margin: var(--sgds-margin-xl);\n }\n}\n\n@media screen and (min-width: 768px) {\n :host([size=\"fullscreen\"]) .modal-panel {\n margin: var(--sgds-margin-2-xl);\n max-height: calc(100% - var(--sgds-margin-2-xl) - var(--sgds-margin-2-xl));\n }\n}\n\n@media screen and (min-width: 1024px) {\n :host([size=\"fullscreen\"]) .modal-panel {\n margin: var(--sgds-margin-4-xl) var(--sgds-margin-lg);\n max-height: calc(100% - var(--sgds-margin-4-xl) - var(--sgds-margin-4-xl));\n max-width: var(--sgds-dimension-888);\n }\n}\n\n@media screen and (min-width: 1280px) {\n :host([size=\"fullscreen\"]) .modal-panel {\n max-width: var(--sgds-dimension-1168);\n }\n}\n\n@media screen and (min-width: 1440px) {\n :host([size=\"fullscreen\"]) .modal-panel {\n max-width: var(--sgds-dimension-1312);\n }\n}\n\n.modal.show .modal-panel {\n opacity: 1;\n transform: none;\n}\n\n.modal-header {\n flex: 0 0 auto;\n display: flex;\n flex-direction: row;\n justify-content: space-between;\n max-width: var(--sgds-dimension-872);\n}\n\n.modal-header__title-description {\n display: flex;\n flex-direction: column;\n gap: var(--sgds-gap-sm);\n}\n\n:host([size=\"fullscreen\"]) .modal-header__title-description {\n gap: var(--sgds-gap-md);\n}\n\nslot[name=\"title\"]::slotted(*) {\n display: flex;\n flex: 1 1 auto;\n align-items: center;\n gap: 1rem;\n margin: var(--sgds-margin-none) !important;\n line-height: var(--sgds-line-height-lg) !important;\n font-size: var(--sgds-font-size-heading-sm) !important;\n}\n\nslot[name=\"description\"]::slotted(*) {\n margin: var(--sgds-margin-none) !important;\n color: var(--sgds-color-subtle);\n line-height: var(--sgds-line-height-xs);\n}\n\n.modal-body {\n flex: 1 1 auto;\n overflow: auto;\n -webkit-overflow-scrolling: touch;\n}\n\n.modal-body slot::slotted(*) {\n --sgds-paragraph-spacing-xl: var(--sgds-margin-none);\n}\n\n.modal-footer {\n flex: 0 0 auto;\n display: flex;\n flex-wrap: wrap;\n justify-content: flex-end;\n gap: var(--sgds-gap-md);\n padding-top: var(--sgds-padding-md);\n}\n\n.modal:not(.has-footer) .modal-footer {\n display: none;\n}\n\n.modal-overlay {\n position: fixed;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n background-color: var(--sgds-bg-overlay);\n}\n\n[hidden] {\n display: none;\n}\n"],"mappings":""}
1
+ {"version":3,"file":"modal.cjs.js","names":[],"sources":["../../../../src/components/Modal/modal.css"],"sourcesContent":[":host(:not([size=\"fullscreen\"])) .modal-panel {\n background-color: var(--sgds-surface-default);\n padding: var(--sgds-padding-xl);\n max-width: var(--sgds-dimension-640);\n}\n:host([size=\"sm\"]) .modal-panel {\n max-width: var(--sgds-dimension-480);\n}\n\n:host([size=\"md\"]) .modal-panel {\n max-width: var(--sgds-dimension-640);\n}\n\n:host([size=\"lg\"]) .modal-panel {\n max-width: var(--sgds-dimension-800);\n}\n:host([size=\"xl\"]) .modal-panel {\n max-width: var(--sgds-dimension-1280);\n}\n\n:host([size=\"fullscreen\"]) .modal-overlay {\n background-color: var(--sgds-surface-default);\n}\n\n:host([size=\"fullscreen\"]) .modal-panel {\n margin: var(--sgds-margin-xl) var(--sgds-margin-lg);\n}\n\n.modal {\n display: flex;\n justify-content: center;\n align-items: start;\n position: fixed;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: var(--sgds-z-index-modal);\n font-family: var(--sgds-body-font-family);\n}\n\n.modal-panel {\n width: 100%;\n border-radius: var(--sgds-border-radius-md);\n z-index: 2; /* shift above overlay */\n display: flex;\n flex-direction: column;\n gap: var(--sgds-gap-2-xl);\n margin: auto;\n max-height: calc(100% - var(--sgds-margin-xl) - var(--sgds-margin-xl));\n}\n\n.modal-panel:focus {\n outline: none;\n}\n\n.modal-content {\n flex: 1 1 auto;\n display: flex;\n flex-direction: column;\n gap: var(--sgds-gap-2-xl);\n min-height: 0;\n position: relative;\n}\n\n.modal-header__close {\n position: absolute;\n top: calc(-1 * var(--sgds-padding-md));\n right: calc(-1 * var(--sgds-padding-md));\n}\n\n@media screen and (min-width: 512px) {\n :host([size=\"fullscreen\"]) .modal-panel {\n margin: var(--sgds-margin-xl);\n }\n}\n\n@media screen and (min-width: 768px) {\n :host([size=\"fullscreen\"]) .modal-panel {\n margin: var(--sgds-margin-2-xl);\n max-height: calc(100% - var(--sgds-margin-2-xl) - var(--sgds-margin-2-xl));\n }\n}\n\n@media screen and (min-width: 1024px) {\n :host([size=\"fullscreen\"]) .modal-panel {\n margin: var(--sgds-margin-4-xl) var(--sgds-margin-lg);\n max-height: calc(100% - var(--sgds-margin-4-xl) - var(--sgds-margin-4-xl));\n max-width: var(--sgds-dimension-888);\n }\n}\n\n@media screen and (min-width: 1280px) {\n :host([size=\"fullscreen\"]) .modal-panel {\n max-width: var(--sgds-dimension-1168);\n }\n}\n\n@media screen and (min-width: 1440px) {\n :host([size=\"fullscreen\"]) .modal-panel {\n max-width: var(--sgds-dimension-1312);\n }\n}\n\n.modal.show .modal-panel {\n opacity: 1;\n transform: none;\n}\n\n.modal-header {\n flex: 0 0 auto;\n display: flex;\n flex-direction: row;\n justify-content: space-between;\n max-width: var(--sgds-dimension-872);\n}\n\n.modal-header__title-description {\n display: flex;\n flex-direction: column;\n gap: var(--sgds-gap-sm);\n}\n\n:host([size=\"fullscreen\"]) .modal-header__title-description {\n gap: var(--sgds-gap-md);\n}\n\nslot[name=\"title\"]::slotted(*) {\n display: flex;\n flex: 1 1 auto;\n align-items: center;\n gap: 1rem;\n margin: var(--sgds-margin-none) !important;\n line-height: var(--sgds-line-height-lg) !important;\n font-size: var(--sgds-font-size-heading-sm) !important;\n}\n\nslot[name=\"description\"]::slotted(*) {\n margin: var(--sgds-margin-none) !important;\n color: var(--sgds-color-subtle);\n line-height: var(--sgds-line-height-xs);\n}\n\n.modal-body {\n flex: 1 1 auto;\n overflow: auto;\n -webkit-overflow-scrolling: touch;\n}\n\n.modal-body:focus-visible {\n outline: var(--sgds-outline-focus);\n outline-offset: var(--sgds-outline-offset-focus);\n}\n\n.modal-body slot::slotted(*) {\n --sgds-paragraph-spacing-xl: var(--sgds-margin-none);\n}\n\n.modal-footer {\n flex: 0 0 auto;\n display: flex;\n flex-wrap: wrap;\n justify-content: flex-end;\n gap: var(--sgds-gap-md);\n padding-top: var(--sgds-padding-md);\n}\n\n.modal:not(.has-footer) .modal-footer {\n display: none;\n}\n\n.modal-overlay {\n position: fixed;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n background-color: var(--sgds-bg-overlay);\n}\n\n[hidden] {\n display: none;\n}\n"],"mappings":""}
@@ -1,7 +1,7 @@
1
1
  "use client";
2
2
  import { css } from "lit";
3
3
  //#region src/components/Modal/modal.css
4
- var css_248z = css`:host(:not([size=fullscreen])) .modal-panel{background-color:var(--sgds-surface-default);max-width:var(--sgds-dimension-640);padding:var(--sgds-padding-xl)}:host([size=sm]) .modal-panel{max-width:var(--sgds-dimension-480)}:host([size=md]) .modal-panel{max-width:var(--sgds-dimension-640)}:host([size=lg]) .modal-panel{max-width:var(--sgds-dimension-800)}:host([size=xl]) .modal-panel{max-width:var(--sgds-dimension-1280)}:host([size=fullscreen]) .modal-overlay{background-color:var(--sgds-surface-default)}:host([size=fullscreen]) .modal-panel{margin:var(--sgds-margin-xl) var(--sgds-margin-lg)}.modal{align-items:start;bottom:0;display:flex;font-family:var(--sgds-body-font-family);justify-content:center;left:0;position:fixed;right:0;top:0;z-index:var(--sgds-z-index-modal)}.modal-panel{border-radius:var(--sgds-border-radius-md);display:flex;flex-direction:column;gap:var(--sgds-gap-2-xl);margin:auto;max-height:calc(100% - var(--sgds-margin-xl) - var(--sgds-margin-xl));width:100%;z-index:2}.modal-panel:focus{outline:none}.modal-content{display:flex;flex:1 1 auto;flex-direction:column;gap:var(--sgds-gap-2-xl);min-height:0;position:relative}.modal-header__close{position:absolute;right:calc(var(--sgds-padding-md)*-1);top:calc(var(--sgds-padding-md)*-1)}@media screen and (min-width:512px){:host([size=fullscreen]) .modal-panel{margin:var(--sgds-margin-xl)}}@media screen and (min-width:768px){:host([size=fullscreen]) .modal-panel{margin:var(--sgds-margin-2-xl);max-height:calc(100% - var(--sgds-margin-2-xl) - var(--sgds-margin-2-xl))}}@media screen and (min-width:1024px){:host([size=fullscreen]) .modal-panel{margin:var(--sgds-margin-4-xl) var(--sgds-margin-lg);max-height:calc(100% - var(--sgds-margin-4-xl) - var(--sgds-margin-4-xl));max-width:var(--sgds-dimension-888)}}@media screen and (min-width:1280px){:host([size=fullscreen]) .modal-panel{max-width:var(--sgds-dimension-1168)}}@media screen and (min-width:1440px){:host([size=fullscreen]) .modal-panel{max-width:var(--sgds-dimension-1312)}}.modal.show .modal-panel{opacity:1;transform:none}.modal-header{display:flex;flex:0 0 auto;flex-direction:row;justify-content:space-between;max-width:var(--sgds-dimension-872)}.modal-header__title-description{display:flex;flex-direction:column;gap:var(--sgds-gap-sm)}:host([size=fullscreen]) .modal-header__title-description{gap:var(--sgds-gap-md)}slot[name=title]::slotted(*){align-items:center;display:flex;flex:1 1 auto;font-size:var(--sgds-font-size-heading-sm)!important;gap:1rem;line-height:var(--sgds-line-height-lg)!important;margin:var(--sgds-margin-none)!important}slot[name=description]::slotted(*){color:var(--sgds-color-subtle);line-height:var(--sgds-line-height-xs);margin:var(--sgds-margin-none)!important}.modal-body{-webkit-overflow-scrolling:touch;flex:1 1 auto;overflow:auto}.modal-body slot::slotted(*){--sgds-paragraph-spacing-xl:var(--sgds-margin-none)}.modal-footer{display:flex;flex:0 0 auto;flex-wrap:wrap;gap:var(--sgds-gap-md);justify-content:flex-end;padding-top:var(--sgds-padding-md)}.modal:not(.has-footer) .modal-footer{display:none}.modal-overlay{background-color:var(--sgds-bg-overlay);bottom:0;left:0;position:fixed;right:0;top:0}[hidden]{display:none}`;
4
+ var css_248z = css`:host(:not([size=fullscreen])) .modal-panel{background-color:var(--sgds-surface-default);max-width:var(--sgds-dimension-640);padding:var(--sgds-padding-xl)}:host([size=sm]) .modal-panel{max-width:var(--sgds-dimension-480)}:host([size=md]) .modal-panel{max-width:var(--sgds-dimension-640)}:host([size=lg]) .modal-panel{max-width:var(--sgds-dimension-800)}:host([size=xl]) .modal-panel{max-width:var(--sgds-dimension-1280)}:host([size=fullscreen]) .modal-overlay{background-color:var(--sgds-surface-default)}:host([size=fullscreen]) .modal-panel{margin:var(--sgds-margin-xl) var(--sgds-margin-lg)}.modal{align-items:start;bottom:0;display:flex;font-family:var(--sgds-body-font-family);justify-content:center;left:0;position:fixed;right:0;top:0;z-index:var(--sgds-z-index-modal)}.modal-panel{border-radius:var(--sgds-border-radius-md);display:flex;flex-direction:column;gap:var(--sgds-gap-2-xl);margin:auto;max-height:calc(100% - var(--sgds-margin-xl) - var(--sgds-margin-xl));width:100%;z-index:2}.modal-panel:focus{outline:none}.modal-content{display:flex;flex:1 1 auto;flex-direction:column;gap:var(--sgds-gap-2-xl);min-height:0;position:relative}.modal-header__close{position:absolute;right:calc(var(--sgds-padding-md)*-1);top:calc(var(--sgds-padding-md)*-1)}@media screen and (min-width:512px){:host([size=fullscreen]) .modal-panel{margin:var(--sgds-margin-xl)}}@media screen and (min-width:768px){:host([size=fullscreen]) .modal-panel{margin:var(--sgds-margin-2-xl);max-height:calc(100% - var(--sgds-margin-2-xl) - var(--sgds-margin-2-xl))}}@media screen and (min-width:1024px){:host([size=fullscreen]) .modal-panel{margin:var(--sgds-margin-4-xl) var(--sgds-margin-lg);max-height:calc(100% - var(--sgds-margin-4-xl) - var(--sgds-margin-4-xl));max-width:var(--sgds-dimension-888)}}@media screen and (min-width:1280px){:host([size=fullscreen]) .modal-panel{max-width:var(--sgds-dimension-1168)}}@media screen and (min-width:1440px){:host([size=fullscreen]) .modal-panel{max-width:var(--sgds-dimension-1312)}}.modal.show .modal-panel{opacity:1;transform:none}.modal-header{display:flex;flex:0 0 auto;flex-direction:row;justify-content:space-between;max-width:var(--sgds-dimension-872)}.modal-header__title-description{display:flex;flex-direction:column;gap:var(--sgds-gap-sm)}:host([size=fullscreen]) .modal-header__title-description{gap:var(--sgds-gap-md)}slot[name=title]::slotted(*){align-items:center;display:flex;flex:1 1 auto;font-size:var(--sgds-font-size-heading-sm)!important;gap:1rem;line-height:var(--sgds-line-height-lg)!important;margin:var(--sgds-margin-none)!important}slot[name=description]::slotted(*){color:var(--sgds-color-subtle);line-height:var(--sgds-line-height-xs);margin:var(--sgds-margin-none)!important}.modal-body{-webkit-overflow-scrolling:touch;flex:1 1 auto;overflow:auto}.modal-body:focus-visible{outline:var(--sgds-outline-focus);outline-offset:var(--sgds-outline-offset-focus)}.modal-body slot::slotted(*){--sgds-paragraph-spacing-xl:var(--sgds-margin-none)}.modal-footer{display:flex;flex:0 0 auto;flex-wrap:wrap;gap:var(--sgds-gap-md);justify-content:flex-end;padding-top:var(--sgds-padding-md)}.modal:not(.has-footer) .modal-footer{display:none}.modal-overlay{background-color:var(--sgds-bg-overlay);bottom:0;left:0;position:fixed;right:0;top:0}[hidden]{display:none}`;
5
5
  //#endregion
6
6
  export { css_248z as default };
7
7
 
@@ -1 +1 @@
1
- {"version":3,"file":"modal.js","names":[],"sources":["../../../../src/components/Modal/modal.css"],"sourcesContent":[":host(:not([size=\"fullscreen\"])) .modal-panel {\n background-color: var(--sgds-surface-default);\n padding: var(--sgds-padding-xl);\n max-width: var(--sgds-dimension-640);\n}\n:host([size=\"sm\"]) .modal-panel {\n max-width: var(--sgds-dimension-480);\n}\n\n:host([size=\"md\"]) .modal-panel {\n max-width: var(--sgds-dimension-640);\n}\n\n:host([size=\"lg\"]) .modal-panel {\n max-width: var(--sgds-dimension-800);\n}\n:host([size=\"xl\"]) .modal-panel {\n max-width: var(--sgds-dimension-1280);\n}\n\n:host([size=\"fullscreen\"]) .modal-overlay {\n background-color: var(--sgds-surface-default);\n}\n\n:host([size=\"fullscreen\"]) .modal-panel {\n margin: var(--sgds-margin-xl) var(--sgds-margin-lg);\n}\n\n.modal {\n display: flex;\n justify-content: center;\n align-items: start;\n position: fixed;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: var(--sgds-z-index-modal);\n font-family: var(--sgds-body-font-family);\n}\n\n.modal-panel {\n width: 100%;\n border-radius: var(--sgds-border-radius-md);\n z-index: 2; /* shift above overlay */\n display: flex;\n flex-direction: column;\n gap: var(--sgds-gap-2-xl);\n margin: auto;\n max-height: calc(100% - var(--sgds-margin-xl) - var(--sgds-margin-xl));\n}\n\n.modal-panel:focus {\n outline: none;\n}\n\n.modal-content {\n flex: 1 1 auto;\n display: flex;\n flex-direction: column;\n gap: var(--sgds-gap-2-xl);\n min-height: 0;\n position: relative;\n}\n\n.modal-header__close {\n position: absolute;\n top: calc(-1 * var(--sgds-padding-md));\n right: calc(-1 * var(--sgds-padding-md));\n}\n\n@media screen and (min-width: 512px) {\n :host([size=\"fullscreen\"]) .modal-panel {\n margin: var(--sgds-margin-xl);\n }\n}\n\n@media screen and (min-width: 768px) {\n :host([size=\"fullscreen\"]) .modal-panel {\n margin: var(--sgds-margin-2-xl);\n max-height: calc(100% - var(--sgds-margin-2-xl) - var(--sgds-margin-2-xl));\n }\n}\n\n@media screen and (min-width: 1024px) {\n :host([size=\"fullscreen\"]) .modal-panel {\n margin: var(--sgds-margin-4-xl) var(--sgds-margin-lg);\n max-height: calc(100% - var(--sgds-margin-4-xl) - var(--sgds-margin-4-xl));\n max-width: var(--sgds-dimension-888);\n }\n}\n\n@media screen and (min-width: 1280px) {\n :host([size=\"fullscreen\"]) .modal-panel {\n max-width: var(--sgds-dimension-1168);\n }\n}\n\n@media screen and (min-width: 1440px) {\n :host([size=\"fullscreen\"]) .modal-panel {\n max-width: var(--sgds-dimension-1312);\n }\n}\n\n.modal.show .modal-panel {\n opacity: 1;\n transform: none;\n}\n\n.modal-header {\n flex: 0 0 auto;\n display: flex;\n flex-direction: row;\n justify-content: space-between;\n max-width: var(--sgds-dimension-872);\n}\n\n.modal-header__title-description {\n display: flex;\n flex-direction: column;\n gap: var(--sgds-gap-sm);\n}\n\n:host([size=\"fullscreen\"]) .modal-header__title-description {\n gap: var(--sgds-gap-md);\n}\n\nslot[name=\"title\"]::slotted(*) {\n display: flex;\n flex: 1 1 auto;\n align-items: center;\n gap: 1rem;\n margin: var(--sgds-margin-none) !important;\n line-height: var(--sgds-line-height-lg) !important;\n font-size: var(--sgds-font-size-heading-sm) !important;\n}\n\nslot[name=\"description\"]::slotted(*) {\n margin: var(--sgds-margin-none) !important;\n color: var(--sgds-color-subtle);\n line-height: var(--sgds-line-height-xs);\n}\n\n.modal-body {\n flex: 1 1 auto;\n overflow: auto;\n -webkit-overflow-scrolling: touch;\n}\n\n.modal-body slot::slotted(*) {\n --sgds-paragraph-spacing-xl: var(--sgds-margin-none);\n}\n\n.modal-footer {\n flex: 0 0 auto;\n display: flex;\n flex-wrap: wrap;\n justify-content: flex-end;\n gap: var(--sgds-gap-md);\n padding-top: var(--sgds-padding-md);\n}\n\n.modal:not(.has-footer) .modal-footer {\n display: none;\n}\n\n.modal-overlay {\n position: fixed;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n background-color: var(--sgds-bg-overlay);\n}\n\n[hidden] {\n display: none;\n}\n"],"mappings":""}
1
+ {"version":3,"file":"modal.js","names":[],"sources":["../../../../src/components/Modal/modal.css"],"sourcesContent":[":host(:not([size=\"fullscreen\"])) .modal-panel {\n background-color: var(--sgds-surface-default);\n padding: var(--sgds-padding-xl);\n max-width: var(--sgds-dimension-640);\n}\n:host([size=\"sm\"]) .modal-panel {\n max-width: var(--sgds-dimension-480);\n}\n\n:host([size=\"md\"]) .modal-panel {\n max-width: var(--sgds-dimension-640);\n}\n\n:host([size=\"lg\"]) .modal-panel {\n max-width: var(--sgds-dimension-800);\n}\n:host([size=\"xl\"]) .modal-panel {\n max-width: var(--sgds-dimension-1280);\n}\n\n:host([size=\"fullscreen\"]) .modal-overlay {\n background-color: var(--sgds-surface-default);\n}\n\n:host([size=\"fullscreen\"]) .modal-panel {\n margin: var(--sgds-margin-xl) var(--sgds-margin-lg);\n}\n\n.modal {\n display: flex;\n justify-content: center;\n align-items: start;\n position: fixed;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: var(--sgds-z-index-modal);\n font-family: var(--sgds-body-font-family);\n}\n\n.modal-panel {\n width: 100%;\n border-radius: var(--sgds-border-radius-md);\n z-index: 2; /* shift above overlay */\n display: flex;\n flex-direction: column;\n gap: var(--sgds-gap-2-xl);\n margin: auto;\n max-height: calc(100% - var(--sgds-margin-xl) - var(--sgds-margin-xl));\n}\n\n.modal-panel:focus {\n outline: none;\n}\n\n.modal-content {\n flex: 1 1 auto;\n display: flex;\n flex-direction: column;\n gap: var(--sgds-gap-2-xl);\n min-height: 0;\n position: relative;\n}\n\n.modal-header__close {\n position: absolute;\n top: calc(-1 * var(--sgds-padding-md));\n right: calc(-1 * var(--sgds-padding-md));\n}\n\n@media screen and (min-width: 512px) {\n :host([size=\"fullscreen\"]) .modal-panel {\n margin: var(--sgds-margin-xl);\n }\n}\n\n@media screen and (min-width: 768px) {\n :host([size=\"fullscreen\"]) .modal-panel {\n margin: var(--sgds-margin-2-xl);\n max-height: calc(100% - var(--sgds-margin-2-xl) - var(--sgds-margin-2-xl));\n }\n}\n\n@media screen and (min-width: 1024px) {\n :host([size=\"fullscreen\"]) .modal-panel {\n margin: var(--sgds-margin-4-xl) var(--sgds-margin-lg);\n max-height: calc(100% - var(--sgds-margin-4-xl) - var(--sgds-margin-4-xl));\n max-width: var(--sgds-dimension-888);\n }\n}\n\n@media screen and (min-width: 1280px) {\n :host([size=\"fullscreen\"]) .modal-panel {\n max-width: var(--sgds-dimension-1168);\n }\n}\n\n@media screen and (min-width: 1440px) {\n :host([size=\"fullscreen\"]) .modal-panel {\n max-width: var(--sgds-dimension-1312);\n }\n}\n\n.modal.show .modal-panel {\n opacity: 1;\n transform: none;\n}\n\n.modal-header {\n flex: 0 0 auto;\n display: flex;\n flex-direction: row;\n justify-content: space-between;\n max-width: var(--sgds-dimension-872);\n}\n\n.modal-header__title-description {\n display: flex;\n flex-direction: column;\n gap: var(--sgds-gap-sm);\n}\n\n:host([size=\"fullscreen\"]) .modal-header__title-description {\n gap: var(--sgds-gap-md);\n}\n\nslot[name=\"title\"]::slotted(*) {\n display: flex;\n flex: 1 1 auto;\n align-items: center;\n gap: 1rem;\n margin: var(--sgds-margin-none) !important;\n line-height: var(--sgds-line-height-lg) !important;\n font-size: var(--sgds-font-size-heading-sm) !important;\n}\n\nslot[name=\"description\"]::slotted(*) {\n margin: var(--sgds-margin-none) !important;\n color: var(--sgds-color-subtle);\n line-height: var(--sgds-line-height-xs);\n}\n\n.modal-body {\n flex: 1 1 auto;\n overflow: auto;\n -webkit-overflow-scrolling: touch;\n}\n\n.modal-body:focus-visible {\n outline: var(--sgds-outline-focus);\n outline-offset: var(--sgds-outline-offset-focus);\n}\n\n.modal-body slot::slotted(*) {\n --sgds-paragraph-spacing-xl: var(--sgds-margin-none);\n}\n\n.modal-footer {\n flex: 0 0 auto;\n display: flex;\n flex-wrap: wrap;\n justify-content: flex-end;\n gap: var(--sgds-gap-md);\n padding-top: var(--sgds-padding-md);\n}\n\n.modal:not(.has-footer) .modal-footer {\n display: none;\n}\n\n.modal-overlay {\n position: fixed;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n background-color: var(--sgds-bg-overlay);\n}\n\n[hidden] {\n display: none;\n}\n"],"mappings":""}
@@ -213,7 +213,7 @@ var SgdsModal = class extends require_sgds_element.default {
213
213
  <slot name="description"></slot>
214
214
  </div>
215
215
  </div>
216
- <div class="modal-body">
216
+ <div class="modal-body" tabindex="0">
217
217
  <slot></slot>
218
218
  </div>
219
219
  </div class="modal-content">
@@ -1 +1 @@
1
- {"version":3,"file":"sgds-modal.cjs.js","names":["SgdsElement","HasSlotController","headerStyles","svgStyles","modalStyle","SgdsCloseButton","Modal","waitForEvent","getAnimation","stopAnimations","animateTo","classMap","nothing","query","property","watch","setDefaultAnimation"],"sources":["../../../../src/components/Modal/sgds-modal.ts"],"sourcesContent":["import { html, nothing, PropertyValueMap } from \"lit\";\nimport { property, query } from \"lit/decorators.js\";\nimport { classMap } from \"lit/directives/class-map.js\";\nimport SgdsElement from \"../../base/sgds-element\";\nimport { watch } from \"../../utils/watch\";\nimport { animateTo, stopAnimations } from \"../../utils/animate\";\nimport { getAnimation, setDefaultAnimation } from \"../../utils/animation-registry\";\nimport { waitForEvent } from \"../../utils/event\";\nimport Modal from \"../../utils/modal\";\nimport { HasSlotController } from \"../../utils/slot\";\nimport { lockBodyScrolling, unlockBodyScrolling } from \"../../utils/scroll\";\nimport { SM_BREAKPOINT, MD_BREAKPOINT } from \"../../utils/breakpoints\";\nimport SgdsButton from \"../Button/sgds-button\";\nimport SgdsCloseButton from \"../CloseButton/sgds-close-button\";\nimport modalStyle from \"./modal.css\";\nimport headerStyles from \"../../styles/header-class.css\";\nimport svgStyles from \"../../styles/svg.css\";\n/**\n * @summary The modal component inform users about a specific task and may contain critical information which users then have to make a decision.\n *\n * @slot default - The content of the Modal's body.\n * @slot title - The title of the Modal.\n * @slot description - The description of the Modal.\n * @slot footer - The content of the Modal's footer, typically used to pass in buttons for call to action.\n *\n * @event sgds-close - Emitted when the modal is called to close via mouseclick of close button, overlay or via keyboard esc key. This event is cancelable; use `event.preventDefault()` to prevent the modal from closing. `event.detail.source` indicates the trigger source: 'close-button', 'overlay', or 'keyboard'.\n * @event sgds-show - Emitted when the modal opens\n * @event sgds-hide - Emitted when the modal closes\n * @event sgds-after-show - Emitted after modal opens and the animations has completed\n * @event sgds-after-hide - Emitted after modal closes and the animations has completed\n *\n */\nexport class SgdsModal extends SgdsElement {\n static styles = [...SgdsElement.styles, headerStyles, svgStyles, modalStyle];\n /**@internal */\n static dependencies = {\n \"sgds-close-button\": SgdsCloseButton\n };\n /**@internal */\n @query(\".modal\") dialog: HTMLElement;\n /**@internal */\n @query(\".modal-panel\") panel: HTMLElement;\n /**@internal */\n @query(\".modal-overlay\") overlay: HTMLElement;\n /**@internal */\n @query(\".modal-title\") heading: HTMLElement;\n /**@internal */\n private readonly hasSlotController = new HasSlotController(this, \"footer\");\n /**@internal */\n private modal: Modal;\n /**@internal */\n private originalTrigger: HTMLElement | null;\n private _resizeHandler: () => void;\n\n /**Indicates whether or not the modal is open. You can use this in lieu of the show/hide methods. */\n @property({ type: Boolean, reflect: true }) open = false;\n\n /** Removes the default animation when opening and closing of modal */\n @property({ type: Boolean, reflect: true }) noAnimation = false;\n\n /** Specifies a small, medium, large or fullscreen modal, the size is medium by default. */\n @property({ reflect: true }) size: \"sm\" | \"md\" | \"lg\" | \"xl\" | \"fullscreen\" = \"md\";\n\n /** Used only for SSR to indicate the presence of the `footer` slot. */\n @property({ type: Boolean }) hasFooterSlot = false;\n\n /** Removes the close button in the modal header. */\n @property({ type: Boolean, reflect: true }) noCloseButton = false;\n\n connectedCallback() {\n super.connectedCallback();\n this.handleDocumentKeyDown = this.handleDocumentKeyDown.bind(this);\n this.modal = new Modal(this);\n this._resizeHandler = this._debounce(this._onWindowResize.bind(this), 200);\n }\n\n disconnectedCallback() {\n super.disconnectedCallback();\n this._removeResizeListener();\n unlockBodyScrolling(this);\n }\n\n firstUpdated(changedProperties: PropertyValueMap<this>) {\n super.firstUpdated(changedProperties);\n this._onWindowResize();\n this.dialog.hidden = !this.open;\n\n if (this.open) {\n this.addOpenListeners();\n this.modal.activate();\n lockBodyScrolling(this);\n }\n }\n\n updated() {\n if (!this.hasFooterSlot) this.hasFooterSlot = this.hasSlotController.test(\"footer\");\n }\n\n private _debounce(func: (...args: any[]) => void, wait: number) {\n let timeout: number;\n return (...args: any[]) => {\n clearTimeout(timeout);\n timeout = window.setTimeout(() => func(...args), wait);\n };\n }\n\n /** Handle the window resize event. */\n private _onWindowResize() {\n const panel = this.panel.getBoundingClientRect();\n const panelWidth = panel.width;\n const buttonElements = this.querySelectorAll(\"sgds-button[slot='footer']\");\n\n if (!this.panel) return;\n\n if (buttonElements.length <= 1) return;\n\n if (panelWidth < SM_BREAKPOINT || (this.size === \"fullscreen\" && panelWidth < MD_BREAKPOINT)) {\n buttonElements.forEach(buttonElement => {\n const button = buttonElement as SgdsButton;\n button.fullWidth = true;\n });\n } else {\n buttonElements.forEach(buttonElement => {\n const button = buttonElement as SgdsButton;\n button.fullWidth = false;\n });\n }\n }\n\n /** Add the resize event listener. */\n private _addResizeListener() {\n window.addEventListener(\"resize\", this._resizeHandler);\n }\n\n /** Remove the resize event listener. */\n private _removeResizeListener() {\n window.removeEventListener(\"resize\", this._resizeHandler);\n }\n\n /** Shows the dialog. */\n public async show() {\n if (this.open) {\n return undefined;\n }\n\n this.open = true;\n return waitForEvent(this, \"sgds-after-show\");\n }\n\n /** Hides the dialog */\n public async hide() {\n if (!this.open) {\n return undefined;\n }\n\n this.open = false;\n return waitForEvent(this, \"sgds-after-hide\");\n }\n\n private requestClose(source: \"close-button\" | \"keyboard\" | \"overlay\") {\n const sgdsRequestClose = this.emit(\"sgds-close\", {\n cancelable: true,\n detail: { source }\n });\n\n if (sgdsRequestClose.defaultPrevented) {\n const animation = getAnimation(this, \"modal.denyClose\");\n animateTo(this.panel, animation.keyframes);\n return;\n }\n\n this.hide();\n }\n\n addOpenListeners() {\n document.addEventListener(\"keydown\", this.handleDocumentKeyDown);\n }\n\n removeOpenListeners() {\n document.removeEventListener(\"keydown\", this.handleDocumentKeyDown);\n }\n\n handleDocumentKeyDown(event: KeyboardEvent) {\n if (this.open && event.key === \"Escape\") {\n event.stopPropagation();\n this.requestClose(\"keyboard\");\n }\n }\n\n private _overlayClickHandler() {\n if (this.size === \"fullscreen\") {\n return;\n }\n\n this.requestClose(\"overlay\");\n }\n\n @watch(\"open\", { waitUntilFirstUpdate: true })\n async handleOpenChange() {\n if (this.open) {\n // Show\n this.emit(\"sgds-show\");\n this.addOpenListeners();\n this.originalTrigger = document.activeElement as HTMLElement;\n this.modal.activate();\n\n lockBodyScrolling(this);\n\n await Promise.all([stopAnimations(this.dialog), stopAnimations(this.overlay)]);\n this.dialog.hidden = false;\n\n const panelAnimation = getAnimation(this, \"modal.show\");\n const overlayAnimation = getAnimation(this, \"modal.overlay.show\");\n !this.noAnimation &&\n (await Promise.all([\n animateTo(this.panel, panelAnimation.keyframes, panelAnimation.options),\n animateTo(this.overlay, overlayAnimation.keyframes, overlayAnimation.options)\n ]));\n\n this.emit(\"sgds-after-show\");\n\n // Add focus on modal heading after opening it\n this.heading.focus();\n\n // Add resize listener only when the modal is shown\n this._addResizeListener();\n } else {\n // Hide\n this.emit(\"sgds-hide\");\n this.removeOpenListeners();\n this.modal.deactivate();\n\n await Promise.all([stopAnimations(this.dialog), stopAnimations(this.overlay)]);\n const panelAnimation = getAnimation(this, \"modal.hide\");\n const overlayAnimation = getAnimation(this, \"modal.overlay.hide\");\n\n // Animate the overlay and the panel at the same time. Because animation durations might be different, we need to\n // hide each one individually when the animation finishes, otherwise the first one that finishes will reappear\n // unexpectedly. We'll unhide them after all animations have completed.\n !this.noAnimation &&\n (await Promise.all([\n animateTo(this.overlay, overlayAnimation.keyframes, overlayAnimation.options).then(() => {\n this.overlay.hidden = true;\n }),\n animateTo(this.panel, panelAnimation.keyframes, panelAnimation.options).then(() => {\n this.panel.hidden = true;\n })\n ]));\n\n this.dialog.hidden = true;\n\n // Now that the dialog is hidden, restore the overlay and panel for next time\n this.overlay.hidden = false;\n this.panel.hidden = false;\n\n unlockBodyScrolling(this);\n\n // Restore focus to the original trigger\n const trigger = this.originalTrigger;\n if (typeof trigger?.focus === \"function\") {\n setTimeout(() => trigger.focus());\n }\n\n this.emit(\"sgds-after-hide\");\n\n // Remove resize listener when the modal is hidden\n this._removeResizeListener();\n }\n }\n\n render() {\n return html`\n <div\n class=${classMap({\n modal: true,\n show: this.open,\n \"has-footer\": this.hasFooterSlot\n })}\n >\n <div class=\"modal-overlay\" @click=${this._overlayClickHandler}></div>\n\n <div\n class=\"modal-panel\"\n role=\"dialog\"\n aria-modal=\"true\"\n aria-hidden=${this.open ? \"false\" : \"true\"}\n aria-labelledby=\"title\"\n tabindex=\"-1\"\n >\n <div class=\"modal-content\">\n ${\n !this.noCloseButton\n ? html`<sgds-close-button\n class=\"modal-header__close\"\n @click=\"${() => this.requestClose(\"close-button\")}\"\n aria-label=\"close modal\"\n ></sgds-close-button>`\n : nothing\n }\n <div class=\"modal-header\">\n <div class=\"modal-header__title-description\">\n <div id=\"title\"><slot class=\"modal-title\" name=\"title\"></slot></div>\n <slot name=\"description\"></slot>\n </div>\n </div>\n <div class=\"modal-body\">\n <slot></slot>\n </div>\n </div class=\"modal-content\">\n <div class=\"modal-footer\">\n <slot name=\"footer\"></slot>\n </div>\n </div>\n </div>\n `;\n }\n}\n\nsetDefaultAnimation(\"modal.show\", {\n keyframes: [\n { opacity: 0, transform: \"scale(1) translate(0, -100%)\" },\n { opacity: 1, transform: \"scale(1) translate(0, 0%)\" }\n ],\n options: { duration: 400, easing: \"ease\" }\n});\n\nsetDefaultAnimation(\"modal.hide\", {\n keyframes: [\n { opacity: 1, transform: \"scale(1) translate(0, 0)\" },\n { opacity: 0, transform: \"scale(1) translate(0, -100%)\" }\n ],\n options: { duration: 400, easing: \"ease\" }\n});\n\nsetDefaultAnimation(\"modal.denyClose\", {\n keyframes: [{ transform: \"scale(1)\" }, { transform: \"scale(1.02)\" }, { transform: \"scale(1)\" }],\n options: { duration: 400 }\n});\n\nsetDefaultAnimation(\"modal.overlay.show\", {\n keyframes: [{ opacity: 0 }, { opacity: 1 }],\n options: { duration: 400 }\n});\n\nsetDefaultAnimation(\"modal.overlay.hide\", {\n keyframes: [{ opacity: 1 }, { opacity: 0 }],\n options: { duration: 400 }\n});\n\nexport default SgdsModal;\n"],"mappings":"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"}
1
+ {"version":3,"file":"sgds-modal.cjs.js","names":["SgdsElement","HasSlotController","headerStyles","svgStyles","modalStyle","SgdsCloseButton","Modal","waitForEvent","getAnimation","stopAnimations","animateTo","classMap","nothing","query","property","watch","setDefaultAnimation"],"sources":["../../../../src/components/Modal/sgds-modal.ts"],"sourcesContent":["import { html, nothing, PropertyValueMap } from \"lit\";\nimport { property, query } from \"lit/decorators.js\";\nimport { classMap } from \"lit/directives/class-map.js\";\nimport SgdsElement from \"../../base/sgds-element\";\nimport { watch } from \"../../utils/watch\";\nimport { animateTo, stopAnimations } from \"../../utils/animate\";\nimport { getAnimation, setDefaultAnimation } from \"../../utils/animation-registry\";\nimport { waitForEvent } from \"../../utils/event\";\nimport Modal from \"../../utils/modal\";\nimport { HasSlotController } from \"../../utils/slot\";\nimport { lockBodyScrolling, unlockBodyScrolling } from \"../../utils/scroll\";\nimport { SM_BREAKPOINT, MD_BREAKPOINT } from \"../../utils/breakpoints\";\nimport SgdsButton from \"../Button/sgds-button\";\nimport SgdsCloseButton from \"../CloseButton/sgds-close-button\";\nimport modalStyle from \"./modal.css\";\nimport headerStyles from \"../../styles/header-class.css\";\nimport svgStyles from \"../../styles/svg.css\";\n/**\n * @summary The modal component inform users about a specific task and may contain critical information which users then have to make a decision.\n *\n * @slot default - The content of the Modal's body.\n * @slot title - The title of the Modal.\n * @slot description - The description of the Modal.\n * @slot footer - The content of the Modal's footer, typically used to pass in buttons for call to action.\n *\n * @event sgds-close - Emitted when the modal is called to close via mouseclick of close button, overlay or via keyboard esc key. This event is cancelable; use `event.preventDefault()` to prevent the modal from closing. `event.detail.source` indicates the trigger source: 'close-button', 'overlay', or 'keyboard'.\n * @event sgds-show - Emitted when the modal opens\n * @event sgds-hide - Emitted when the modal closes\n * @event sgds-after-show - Emitted after modal opens and the animations has completed\n * @event sgds-after-hide - Emitted after modal closes and the animations has completed\n *\n */\nexport class SgdsModal extends SgdsElement {\n static styles = [...SgdsElement.styles, headerStyles, svgStyles, modalStyle];\n /**@internal */\n static dependencies = {\n \"sgds-close-button\": SgdsCloseButton\n };\n /**@internal */\n @query(\".modal\") dialog: HTMLElement;\n /**@internal */\n @query(\".modal-panel\") panel: HTMLElement;\n /**@internal */\n @query(\".modal-overlay\") overlay: HTMLElement;\n /**@internal */\n @query(\".modal-title\") heading: HTMLElement;\n /**@internal */\n private readonly hasSlotController = new HasSlotController(this, \"footer\");\n /**@internal */\n private modal: Modal;\n /**@internal */\n private originalTrigger: HTMLElement | null;\n private _resizeHandler: () => void;\n\n /**Indicates whether or not the modal is open. You can use this in lieu of the show/hide methods. */\n @property({ type: Boolean, reflect: true }) open = false;\n\n /** Removes the default animation when opening and closing of modal */\n @property({ type: Boolean, reflect: true }) noAnimation = false;\n\n /** Specifies a small, medium, large or fullscreen modal, the size is medium by default. */\n @property({ reflect: true }) size: \"sm\" | \"md\" | \"lg\" | \"xl\" | \"fullscreen\" = \"md\";\n\n /** Used only for SSR to indicate the presence of the `footer` slot. */\n @property({ type: Boolean }) hasFooterSlot = false;\n\n /** Removes the close button in the modal header. */\n @property({ type: Boolean, reflect: true }) noCloseButton = false;\n\n connectedCallback() {\n super.connectedCallback();\n this.handleDocumentKeyDown = this.handleDocumentKeyDown.bind(this);\n this.modal = new Modal(this);\n this._resizeHandler = this._debounce(this._onWindowResize.bind(this), 200);\n }\n\n disconnectedCallback() {\n super.disconnectedCallback();\n this._removeResizeListener();\n unlockBodyScrolling(this);\n }\n\n firstUpdated(changedProperties: PropertyValueMap<this>) {\n super.firstUpdated(changedProperties);\n this._onWindowResize();\n this.dialog.hidden = !this.open;\n\n if (this.open) {\n this.addOpenListeners();\n this.modal.activate();\n lockBodyScrolling(this);\n }\n }\n\n updated() {\n if (!this.hasFooterSlot) this.hasFooterSlot = this.hasSlotController.test(\"footer\");\n }\n\n private _debounce(func: (...args: any[]) => void, wait: number) {\n let timeout: number;\n return (...args: any[]) => {\n clearTimeout(timeout);\n timeout = window.setTimeout(() => func(...args), wait);\n };\n }\n\n /** Handle the window resize event. */\n private _onWindowResize() {\n const panel = this.panel.getBoundingClientRect();\n const panelWidth = panel.width;\n const buttonElements = this.querySelectorAll(\"sgds-button[slot='footer']\");\n\n if (!this.panel) return;\n\n if (buttonElements.length <= 1) return;\n\n if (panelWidth < SM_BREAKPOINT || (this.size === \"fullscreen\" && panelWidth < MD_BREAKPOINT)) {\n buttonElements.forEach(buttonElement => {\n const button = buttonElement as SgdsButton;\n button.fullWidth = true;\n });\n } else {\n buttonElements.forEach(buttonElement => {\n const button = buttonElement as SgdsButton;\n button.fullWidth = false;\n });\n }\n }\n\n /** Add the resize event listener. */\n private _addResizeListener() {\n window.addEventListener(\"resize\", this._resizeHandler);\n }\n\n /** Remove the resize event listener. */\n private _removeResizeListener() {\n window.removeEventListener(\"resize\", this._resizeHandler);\n }\n\n /** Shows the dialog. */\n public async show() {\n if (this.open) {\n return undefined;\n }\n\n this.open = true;\n return waitForEvent(this, \"sgds-after-show\");\n }\n\n /** Hides the dialog */\n public async hide() {\n if (!this.open) {\n return undefined;\n }\n\n this.open = false;\n return waitForEvent(this, \"sgds-after-hide\");\n }\n\n private requestClose(source: \"close-button\" | \"keyboard\" | \"overlay\") {\n const sgdsRequestClose = this.emit(\"sgds-close\", {\n cancelable: true,\n detail: { source }\n });\n\n if (sgdsRequestClose.defaultPrevented) {\n const animation = getAnimation(this, \"modal.denyClose\");\n animateTo(this.panel, animation.keyframes);\n return;\n }\n\n this.hide();\n }\n\n addOpenListeners() {\n document.addEventListener(\"keydown\", this.handleDocumentKeyDown);\n }\n\n removeOpenListeners() {\n document.removeEventListener(\"keydown\", this.handleDocumentKeyDown);\n }\n\n handleDocumentKeyDown(event: KeyboardEvent) {\n if (this.open && event.key === \"Escape\") {\n event.stopPropagation();\n this.requestClose(\"keyboard\");\n }\n }\n\n private _overlayClickHandler() {\n if (this.size === \"fullscreen\") {\n return;\n }\n\n this.requestClose(\"overlay\");\n }\n\n @watch(\"open\", { waitUntilFirstUpdate: true })\n async handleOpenChange() {\n if (this.open) {\n // Show\n this.emit(\"sgds-show\");\n this.addOpenListeners();\n this.originalTrigger = document.activeElement as HTMLElement;\n this.modal.activate();\n\n lockBodyScrolling(this);\n\n await Promise.all([stopAnimations(this.dialog), stopAnimations(this.overlay)]);\n this.dialog.hidden = false;\n\n const panelAnimation = getAnimation(this, \"modal.show\");\n const overlayAnimation = getAnimation(this, \"modal.overlay.show\");\n !this.noAnimation &&\n (await Promise.all([\n animateTo(this.panel, panelAnimation.keyframes, panelAnimation.options),\n animateTo(this.overlay, overlayAnimation.keyframes, overlayAnimation.options)\n ]));\n\n this.emit(\"sgds-after-show\");\n\n // Add focus on modal heading after opening it\n this.heading.focus();\n\n // Add resize listener only when the modal is shown\n this._addResizeListener();\n } else {\n // Hide\n this.emit(\"sgds-hide\");\n this.removeOpenListeners();\n this.modal.deactivate();\n\n await Promise.all([stopAnimations(this.dialog), stopAnimations(this.overlay)]);\n const panelAnimation = getAnimation(this, \"modal.hide\");\n const overlayAnimation = getAnimation(this, \"modal.overlay.hide\");\n\n // Animate the overlay and the panel at the same time. Because animation durations might be different, we need to\n // hide each one individually when the animation finishes, otherwise the first one that finishes will reappear\n // unexpectedly. We'll unhide them after all animations have completed.\n !this.noAnimation &&\n (await Promise.all([\n animateTo(this.overlay, overlayAnimation.keyframes, overlayAnimation.options).then(() => {\n this.overlay.hidden = true;\n }),\n animateTo(this.panel, panelAnimation.keyframes, panelAnimation.options).then(() => {\n this.panel.hidden = true;\n })\n ]));\n\n this.dialog.hidden = true;\n\n // Now that the dialog is hidden, restore the overlay and panel for next time\n this.overlay.hidden = false;\n this.panel.hidden = false;\n\n unlockBodyScrolling(this);\n\n // Restore focus to the original trigger\n const trigger = this.originalTrigger;\n if (typeof trigger?.focus === \"function\") {\n setTimeout(() => trigger.focus());\n }\n\n this.emit(\"sgds-after-hide\");\n\n // Remove resize listener when the modal is hidden\n this._removeResizeListener();\n }\n }\n\n render() {\n return html`\n <div\n class=${classMap({\n modal: true,\n show: this.open,\n \"has-footer\": this.hasFooterSlot\n })}\n >\n <div class=\"modal-overlay\" @click=${this._overlayClickHandler}></div>\n\n <div\n class=\"modal-panel\"\n role=\"dialog\"\n aria-modal=\"true\"\n aria-hidden=${this.open ? \"false\" : \"true\"}\n aria-labelledby=\"title\"\n tabindex=\"-1\"\n >\n <div class=\"modal-content\">\n ${\n !this.noCloseButton\n ? html`<sgds-close-button\n class=\"modal-header__close\"\n @click=\"${() => this.requestClose(\"close-button\")}\"\n aria-label=\"close modal\"\n ></sgds-close-button>`\n : nothing\n }\n <div class=\"modal-header\">\n <div class=\"modal-header__title-description\">\n <div id=\"title\"><slot class=\"modal-title\" name=\"title\"></slot></div>\n <slot name=\"description\"></slot>\n </div>\n </div>\n <div class=\"modal-body\" tabindex=\"0\">\n <slot></slot>\n </div>\n </div class=\"modal-content\">\n <div class=\"modal-footer\">\n <slot name=\"footer\"></slot>\n </div>\n </div>\n </div>\n `;\n }\n}\n\nsetDefaultAnimation(\"modal.show\", {\n keyframes: [\n { opacity: 0, transform: \"scale(1) translate(0, -100%)\" },\n { opacity: 1, transform: \"scale(1) translate(0, 0%)\" }\n ],\n options: { duration: 400, easing: \"ease\" }\n});\n\nsetDefaultAnimation(\"modal.hide\", {\n keyframes: [\n { opacity: 1, transform: \"scale(1) translate(0, 0)\" },\n { opacity: 0, transform: \"scale(1) translate(0, -100%)\" }\n ],\n options: { duration: 400, easing: \"ease\" }\n});\n\nsetDefaultAnimation(\"modal.denyClose\", {\n keyframes: [{ transform: \"scale(1)\" }, { transform: \"scale(1.02)\" }, { transform: \"scale(1)\" }],\n options: { duration: 400 }\n});\n\nsetDefaultAnimation(\"modal.overlay.show\", {\n keyframes: [{ opacity: 0 }, { opacity: 1 }],\n options: { duration: 400 }\n});\n\nsetDefaultAnimation(\"modal.overlay.hide\", {\n keyframes: [{ opacity: 1 }, { opacity: 0 }],\n options: { duration: 400 }\n});\n\nexport default SgdsModal;\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAgCA,IAAa,YAAb,cAA+BA,qBAAAA,QAAY;;;EAeJ,KAAA,oBAAA,IAAIC,aAAAA,kBAAkB,MAAM,QAAQ;EAQtB,KAAA,OAAA;EAGO,KAAA,cAAA;EAGoB,KAAA,OAAA;EAGjC,KAAA,gBAAA;EAGe,KAAA,gBAAA;;;EAlC5C,KAAA,SAAA;GAAC,GAAGD,qBAAAA,QAAY;GAAQE,qBAAAA;GAAcC,YAAAA;GAAWC,gBAAAA;EAAU;;;EAErD,KAAA,eAAA,EACpB,qBAAqBC,0BAAAA,gBACvB;;CAgCA,oBAAoB;EAClB,MAAM,kBAAkB;EACxB,KAAK,wBAAwB,KAAK,sBAAsB,KAAK,IAAI;EACjE,KAAK,QAAQ,IAAIC,cAAAA,QAAM,IAAI;EAC3B,KAAK,iBAAiB,KAAK,UAAU,KAAK,gBAAgB,KAAK,IAAI,GAAG,GAAG;CAC3E;CAEA,uBAAuB;EACrB,MAAM,qBAAqB;EAC3B,KAAK,sBAAsB;EAC3B,eAAA,oBAAoB,IAAI;CAC1B;CAEA,aAAa,mBAA2C;EACtD,MAAM,aAAa,iBAAiB;EACpC,KAAK,gBAAgB;EACrB,KAAK,OAAO,SAAS,CAAC,KAAK;EAE3B,IAAI,KAAK,MAAM;GACb,KAAK,iBAAiB;GACtB,KAAK,MAAM,SAAS;GACpB,eAAA,kBAAkB,IAAI;EACxB;CACF;CAEA,UAAU;EACR,IAAI,CAAC,KAAK,eAAe,KAAK,gBAAgB,KAAK,kBAAkB,KAAK,QAAQ;CACpF;CAEA,UAAkB,MAAgC,MAAc;EAC9D,IAAI;EACJ,QAAQ,GAAG,SAAgB;GACzB,aAAa,OAAO;GACpB,UAAU,OAAO,iBAAiB,KAAK,GAAG,IAAI,GAAG,IAAI;EACvD;CACF;;CAGA,kBAA0B;EAExB,MAAM,aADQ,KAAK,MAAM,sBACF,CAAC,CAAC;EACzB,MAAM,iBAAiB,KAAK,iBAAiB,4BAA4B;EAEzE,IAAI,CAAC,KAAK,OAAO;EAEjB,IAAI,eAAe,UAAU,GAAG;EAEhC,IAAI,aAAA,OAA+B,KAAK,SAAS,gBAAgB,aAAA,KAC/D,eAAe,SAAQ,kBAAiB;GACtC,MAAM,SAAS;GACf,OAAO,YAAY;EACrB,CAAC;OAED,eAAe,SAAQ,kBAAiB;GACtC,MAAM,SAAS;GACf,OAAO,YAAY;EACrB,CAAC;CAEL;;CAGA,qBAA6B;EAC3B,OAAO,iBAAiB,UAAU,KAAK,cAAc;CACvD;;CAGA,wBAAgC;EAC9B,OAAO,oBAAoB,UAAU,KAAK,cAAc;CAC1D;;CAGA,MAAa,OAAO;EAClB,IAAI,KAAK,MACP;EAGF,KAAK,OAAO;EACZ,OAAOC,cAAAA,aAAa,MAAM,iBAAiB;CAC7C;;CAGA,MAAa,OAAO;EAClB,IAAI,CAAC,KAAK,MACR;EAGF,KAAK,OAAO;EACZ,OAAOA,cAAAA,aAAa,MAAM,iBAAiB;CAC7C;CAEA,aAAqB,QAAiD;EAMpE,IALyB,KAAK,KAAK,cAAc;GAC/C,YAAY;GACZ,QAAQ,EAAE,OAAO;EACnB,CAEmB,CAAC,CAAC,kBAAkB;GACrC,MAAM,YAAYC,2BAAAA,aAAa,MAAM,iBAAiB;GACtD,gBAAA,UAAU,KAAK,OAAO,UAAU,SAAS;GACzC;EACF;EAEA,KAAK,KAAK;CACZ;CAEA,mBAAmB;EACjB,SAAS,iBAAiB,WAAW,KAAK,qBAAqB;CACjE;CAEA,sBAAsB;EACpB,SAAS,oBAAoB,WAAW,KAAK,qBAAqB;CACpE;CAEA,sBAAsB,OAAsB;EAC1C,IAAI,KAAK,QAAQ,MAAM,QAAQ,UAAU;GACvC,MAAM,gBAAgB;GACtB,KAAK,aAAa,UAAU;EAC9B;CACF;CAEA,uBAA+B;EAC7B,IAAI,KAAK,SAAS,cAChB;EAGF,KAAK,aAAa,SAAS;CAC7B;CAEA,MACM,mBAAmB;EACvB,IAAI,KAAK,MAAM;GAEb,KAAK,KAAK,WAAW;GACrB,KAAK,iBAAiB;GACtB,KAAK,kBAAkB,SAAS;GAChC,KAAK,MAAM,SAAS;GAEpB,eAAA,kBAAkB,IAAI;GAEtB,MAAM,QAAQ,IAAI,CAACC,gBAAAA,eAAe,KAAK,MAAM,GAAGA,gBAAAA,eAAe,KAAK,OAAO,CAAC,CAAC;GAC7E,KAAK,OAAO,SAAS;GAErB,MAAM,iBAAiBD,2BAAAA,aAAa,MAAM,YAAY;GACtD,MAAM,mBAAmBA,2BAAAA,aAAa,MAAM,oBAAoB;GAChE,CAAC,KAAK,eACH,MAAM,QAAQ,IAAI,CACjBE,gBAAAA,UAAU,KAAK,OAAO,eAAe,WAAW,eAAe,OAAO,GACtEA,gBAAAA,UAAU,KAAK,SAAS,iBAAiB,WAAW,iBAAiB,OAAO,CAC9E,CAAC;GAEH,KAAK,KAAK,iBAAiB;GAG3B,KAAK,QAAQ,MAAM;GAGnB,KAAK,mBAAmB;EAC1B,OAAO;GAEL,KAAK,KAAK,WAAW;GACrB,KAAK,oBAAoB;GACzB,KAAK,MAAM,WAAW;GAEtB,MAAM,QAAQ,IAAI,CAACD,gBAAAA,eAAe,KAAK,MAAM,GAAGA,gBAAAA,eAAe,KAAK,OAAO,CAAC,CAAC;GAC7E,MAAM,iBAAiBD,2BAAAA,aAAa,MAAM,YAAY;GACtD,MAAM,mBAAmBA,2BAAAA,aAAa,MAAM,oBAAoB;GAKhE,CAAC,KAAK,eACH,MAAM,QAAQ,IAAI,CACjBE,gBAAAA,UAAU,KAAK,SAAS,iBAAiB,WAAW,iBAAiB,OAAO,CAAC,CAAC,WAAW;IACvF,KAAK,QAAQ,SAAS;GACxB,CAAC,GACDA,gBAAAA,UAAU,KAAK,OAAO,eAAe,WAAW,eAAe,OAAO,CAAC,CAAC,WAAW;IACjF,KAAK,MAAM,SAAS;GACtB,CAAC,CACH,CAAC;GAEH,KAAK,OAAO,SAAS;GAGrB,KAAK,QAAQ,SAAS;GACtB,KAAK,MAAM,SAAS;GAEpB,eAAA,oBAAoB,IAAI;GAGxB,MAAM,UAAU,KAAK;GACrB,IAAI,OAAO,SAAS,UAAU,YAC5B,iBAAiB,QAAQ,MAAM,CAAC;GAGlC,KAAK,KAAK,iBAAiB;GAG3B,KAAK,sBAAsB;EAC7B;CACF;CAEA,SAAS;EACP,OAAO,IAAA,IAAI;;iBAECC,GAAAA,4BAAAA,SAAAA,CAAS;GACf,OAAO;GACP,MAAM,KAAK;GACX,cAAc,KAAK;EACrB,CAAC,EAAE;;4CAEiC,KAAK,qBAAqB;;;;;;wBAM9C,KAAK,OAAO,UAAU,OAAO;;;;;gBAMrC,CAAC,KAAK,gBACF,IAAA,IAAI;;sCAEc,KAAK,aAAa,cAAc,EAAE;;6CAGpDC,IAAAA,QACL;;;;;;;;;;;;;;;;;CAiBb;AACF;AArRGC,iBAAAA,QAAAA,EAAAA,GAAAA,kBAAAA,MAAAA,CAAM,QAAQ,CAAA,GAAA,UAAA,WAAA,UAAA,KAAA,CAAA;AAEdA,iBAAAA,QAAAA,EAAAA,GAAAA,kBAAAA,MAAAA,CAAM,cAAc,CAAA,GAAA,UAAA,WAAA,SAAA,KAAA,CAAA;AAEpBA,iBAAAA,QAAAA,EAAAA,GAAAA,kBAAAA,MAAAA,CAAM,gBAAgB,CAAA,GAAA,UAAA,WAAA,WAAA,KAAA,CAAA;AAEtBA,iBAAAA,QAAAA,EAAAA,GAAAA,kBAAAA,MAAAA,CAAM,cAAc,CAAA,GAAA,UAAA,WAAA,WAAA,KAAA,CAAA;AAUpBC,iBAAAA,QAAAA,EAAAA,GAAAA,kBAAAA,SAAAA,CAAS;CAAE,MAAM;CAAS,SAAS;AAAK,CAAC,CAAA,GAAA,UAAA,WAAA,QAAA,KAAA,CAAA;AAGzCA,iBAAAA,QAAAA,EAAAA,GAAAA,kBAAAA,SAAAA,CAAS;CAAE,MAAM;CAAS,SAAS;AAAK,CAAC,CAAA,GAAA,UAAA,WAAA,eAAA,KAAA,CAAA;AAGzCA,iBAAAA,QAAAA,EAAAA,GAAAA,kBAAAA,SAAAA,CAAS,EAAE,SAAS,KAAK,CAAC,CAAA,GAAA,UAAA,WAAA,QAAA,KAAA,CAAA;AAG1BA,iBAAAA,QAAAA,EAAAA,GAAAA,kBAAAA,SAAAA,CAAS,EAAE,MAAM,QAAQ,CAAC,CAAA,GAAA,UAAA,WAAA,iBAAA,KAAA,CAAA;AAG1BA,iBAAAA,QAAAA,EAAAA,GAAAA,kBAAAA,SAAAA,CAAS;CAAE,MAAM;CAAS,SAAS;AAAK,CAAC,CAAA,GAAA,UAAA,WAAA,iBAAA,KAAA,CAAA;AAkIzCC,iBAAAA,QAAAA,CAAAA,cAAAA,MAAM,QAAQ,EAAE,sBAAsB,KAAK,CAAC,CAAA,GAAA,UAAA,WAAA,oBAAA,IAAA;AAyH/CC,2BAAAA,oBAAoB,cAAc;CAChC,WAAW,CACT;EAAE,SAAS;EAAG,WAAW;CAA+B,GACxD;EAAE,SAAS;EAAG,WAAW;CAA4B,CACvD;CACA,SAAS;EAAE,UAAU;EAAK,QAAQ;CAAO;AAC3C,CAAC;AAEDA,2BAAAA,oBAAoB,cAAc;CAChC,WAAW,CACT;EAAE,SAAS;EAAG,WAAW;CAA2B,GACpD;EAAE,SAAS;EAAG,WAAW;CAA+B,CAC1D;CACA,SAAS;EAAE,UAAU;EAAK,QAAQ;CAAO;AAC3C,CAAC;AAEDA,2BAAAA,oBAAoB,mBAAmB;CACrC,WAAW;EAAC,EAAE,WAAW,WAAW;EAAG,EAAE,WAAW,cAAc;EAAG,EAAE,WAAW,WAAW;CAAC;CAC9F,SAAS,EAAE,UAAU,IAAI;AAC3B,CAAC;AAEDA,2BAAAA,oBAAoB,sBAAsB;CACxC,WAAW,CAAC,EAAE,SAAS,EAAE,GAAG,EAAE,SAAS,EAAE,CAAC;CAC1C,SAAS,EAAE,UAAU,IAAI;AAC3B,CAAC;AAEDA,2BAAAA,oBAAoB,sBAAsB;CACxC,WAAW,CAAC,EAAE,SAAS,EAAE,GAAG,EAAE,SAAS,EAAE,CAAC;CAC1C,SAAS,EAAE,UAAU,IAAI;AAC3B,CAAC"}
@@ -213,7 +213,7 @@ var SgdsModal = class extends SgdsElement {
213
213
  <slot name="description"></slot>
214
214
  </div>
215
215
  </div>
216
- <div class="modal-body">
216
+ <div class="modal-body" tabindex="0">
217
217
  <slot></slot>
218
218
  </div>
219
219
  </div class="modal-content">
@@ -1 +1 @@
1
- {"version":3,"file":"sgds-modal.js","names":["headerStyles","svgStyles","modalStyle"],"sources":["../../../../src/components/Modal/sgds-modal.ts"],"sourcesContent":["import { html, nothing, PropertyValueMap } from \"lit\";\nimport { property, query } from \"lit/decorators.js\";\nimport { classMap } from \"lit/directives/class-map.js\";\nimport SgdsElement from \"../../base/sgds-element\";\nimport { watch } from \"../../utils/watch\";\nimport { animateTo, stopAnimations } from \"../../utils/animate\";\nimport { getAnimation, setDefaultAnimation } from \"../../utils/animation-registry\";\nimport { waitForEvent } from \"../../utils/event\";\nimport Modal from \"../../utils/modal\";\nimport { HasSlotController } from \"../../utils/slot\";\nimport { lockBodyScrolling, unlockBodyScrolling } from \"../../utils/scroll\";\nimport { SM_BREAKPOINT, MD_BREAKPOINT } from \"../../utils/breakpoints\";\nimport SgdsButton from \"../Button/sgds-button\";\nimport SgdsCloseButton from \"../CloseButton/sgds-close-button\";\nimport modalStyle from \"./modal.css\";\nimport headerStyles from \"../../styles/header-class.css\";\nimport svgStyles from \"../../styles/svg.css\";\n/**\n * @summary The modal component inform users about a specific task and may contain critical information which users then have to make a decision.\n *\n * @slot default - The content of the Modal's body.\n * @slot title - The title of the Modal.\n * @slot description - The description of the Modal.\n * @slot footer - The content of the Modal's footer, typically used to pass in buttons for call to action.\n *\n * @event sgds-close - Emitted when the modal is called to close via mouseclick of close button, overlay or via keyboard esc key. This event is cancelable; use `event.preventDefault()` to prevent the modal from closing. `event.detail.source` indicates the trigger source: 'close-button', 'overlay', or 'keyboard'.\n * @event sgds-show - Emitted when the modal opens\n * @event sgds-hide - Emitted when the modal closes\n * @event sgds-after-show - Emitted after modal opens and the animations has completed\n * @event sgds-after-hide - Emitted after modal closes and the animations has completed\n *\n */\nexport class SgdsModal extends SgdsElement {\n static styles = [...SgdsElement.styles, headerStyles, svgStyles, modalStyle];\n /**@internal */\n static dependencies = {\n \"sgds-close-button\": SgdsCloseButton\n };\n /**@internal */\n @query(\".modal\") dialog: HTMLElement;\n /**@internal */\n @query(\".modal-panel\") panel: HTMLElement;\n /**@internal */\n @query(\".modal-overlay\") overlay: HTMLElement;\n /**@internal */\n @query(\".modal-title\") heading: HTMLElement;\n /**@internal */\n private readonly hasSlotController = new HasSlotController(this, \"footer\");\n /**@internal */\n private modal: Modal;\n /**@internal */\n private originalTrigger: HTMLElement | null;\n private _resizeHandler: () => void;\n\n /**Indicates whether or not the modal is open. You can use this in lieu of the show/hide methods. */\n @property({ type: Boolean, reflect: true }) open = false;\n\n /** Removes the default animation when opening and closing of modal */\n @property({ type: Boolean, reflect: true }) noAnimation = false;\n\n /** Specifies a small, medium, large or fullscreen modal, the size is medium by default. */\n @property({ reflect: true }) size: \"sm\" | \"md\" | \"lg\" | \"xl\" | \"fullscreen\" = \"md\";\n\n /** Used only for SSR to indicate the presence of the `footer` slot. */\n @property({ type: Boolean }) hasFooterSlot = false;\n\n /** Removes the close button in the modal header. */\n @property({ type: Boolean, reflect: true }) noCloseButton = false;\n\n connectedCallback() {\n super.connectedCallback();\n this.handleDocumentKeyDown = this.handleDocumentKeyDown.bind(this);\n this.modal = new Modal(this);\n this._resizeHandler = this._debounce(this._onWindowResize.bind(this), 200);\n }\n\n disconnectedCallback() {\n super.disconnectedCallback();\n this._removeResizeListener();\n unlockBodyScrolling(this);\n }\n\n firstUpdated(changedProperties: PropertyValueMap<this>) {\n super.firstUpdated(changedProperties);\n this._onWindowResize();\n this.dialog.hidden = !this.open;\n\n if (this.open) {\n this.addOpenListeners();\n this.modal.activate();\n lockBodyScrolling(this);\n }\n }\n\n updated() {\n if (!this.hasFooterSlot) this.hasFooterSlot = this.hasSlotController.test(\"footer\");\n }\n\n private _debounce(func: (...args: any[]) => void, wait: number) {\n let timeout: number;\n return (...args: any[]) => {\n clearTimeout(timeout);\n timeout = window.setTimeout(() => func(...args), wait);\n };\n }\n\n /** Handle the window resize event. */\n private _onWindowResize() {\n const panel = this.panel.getBoundingClientRect();\n const panelWidth = panel.width;\n const buttonElements = this.querySelectorAll(\"sgds-button[slot='footer']\");\n\n if (!this.panel) return;\n\n if (buttonElements.length <= 1) return;\n\n if (panelWidth < SM_BREAKPOINT || (this.size === \"fullscreen\" && panelWidth < MD_BREAKPOINT)) {\n buttonElements.forEach(buttonElement => {\n const button = buttonElement as SgdsButton;\n button.fullWidth = true;\n });\n } else {\n buttonElements.forEach(buttonElement => {\n const button = buttonElement as SgdsButton;\n button.fullWidth = false;\n });\n }\n }\n\n /** Add the resize event listener. */\n private _addResizeListener() {\n window.addEventListener(\"resize\", this._resizeHandler);\n }\n\n /** Remove the resize event listener. */\n private _removeResizeListener() {\n window.removeEventListener(\"resize\", this._resizeHandler);\n }\n\n /** Shows the dialog. */\n public async show() {\n if (this.open) {\n return undefined;\n }\n\n this.open = true;\n return waitForEvent(this, \"sgds-after-show\");\n }\n\n /** Hides the dialog */\n public async hide() {\n if (!this.open) {\n return undefined;\n }\n\n this.open = false;\n return waitForEvent(this, \"sgds-after-hide\");\n }\n\n private requestClose(source: \"close-button\" | \"keyboard\" | \"overlay\") {\n const sgdsRequestClose = this.emit(\"sgds-close\", {\n cancelable: true,\n detail: { source }\n });\n\n if (sgdsRequestClose.defaultPrevented) {\n const animation = getAnimation(this, \"modal.denyClose\");\n animateTo(this.panel, animation.keyframes);\n return;\n }\n\n this.hide();\n }\n\n addOpenListeners() {\n document.addEventListener(\"keydown\", this.handleDocumentKeyDown);\n }\n\n removeOpenListeners() {\n document.removeEventListener(\"keydown\", this.handleDocumentKeyDown);\n }\n\n handleDocumentKeyDown(event: KeyboardEvent) {\n if (this.open && event.key === \"Escape\") {\n event.stopPropagation();\n this.requestClose(\"keyboard\");\n }\n }\n\n private _overlayClickHandler() {\n if (this.size === \"fullscreen\") {\n return;\n }\n\n this.requestClose(\"overlay\");\n }\n\n @watch(\"open\", { waitUntilFirstUpdate: true })\n async handleOpenChange() {\n if (this.open) {\n // Show\n this.emit(\"sgds-show\");\n this.addOpenListeners();\n this.originalTrigger = document.activeElement as HTMLElement;\n this.modal.activate();\n\n lockBodyScrolling(this);\n\n await Promise.all([stopAnimations(this.dialog), stopAnimations(this.overlay)]);\n this.dialog.hidden = false;\n\n const panelAnimation = getAnimation(this, \"modal.show\");\n const overlayAnimation = getAnimation(this, \"modal.overlay.show\");\n !this.noAnimation &&\n (await Promise.all([\n animateTo(this.panel, panelAnimation.keyframes, panelAnimation.options),\n animateTo(this.overlay, overlayAnimation.keyframes, overlayAnimation.options)\n ]));\n\n this.emit(\"sgds-after-show\");\n\n // Add focus on modal heading after opening it\n this.heading.focus();\n\n // Add resize listener only when the modal is shown\n this._addResizeListener();\n } else {\n // Hide\n this.emit(\"sgds-hide\");\n this.removeOpenListeners();\n this.modal.deactivate();\n\n await Promise.all([stopAnimations(this.dialog), stopAnimations(this.overlay)]);\n const panelAnimation = getAnimation(this, \"modal.hide\");\n const overlayAnimation = getAnimation(this, \"modal.overlay.hide\");\n\n // Animate the overlay and the panel at the same time. Because animation durations might be different, we need to\n // hide each one individually when the animation finishes, otherwise the first one that finishes will reappear\n // unexpectedly. We'll unhide them after all animations have completed.\n !this.noAnimation &&\n (await Promise.all([\n animateTo(this.overlay, overlayAnimation.keyframes, overlayAnimation.options).then(() => {\n this.overlay.hidden = true;\n }),\n animateTo(this.panel, panelAnimation.keyframes, panelAnimation.options).then(() => {\n this.panel.hidden = true;\n })\n ]));\n\n this.dialog.hidden = true;\n\n // Now that the dialog is hidden, restore the overlay and panel for next time\n this.overlay.hidden = false;\n this.panel.hidden = false;\n\n unlockBodyScrolling(this);\n\n // Restore focus to the original trigger\n const trigger = this.originalTrigger;\n if (typeof trigger?.focus === \"function\") {\n setTimeout(() => trigger.focus());\n }\n\n this.emit(\"sgds-after-hide\");\n\n // Remove resize listener when the modal is hidden\n this._removeResizeListener();\n }\n }\n\n render() {\n return html`\n <div\n class=${classMap({\n modal: true,\n show: this.open,\n \"has-footer\": this.hasFooterSlot\n })}\n >\n <div class=\"modal-overlay\" @click=${this._overlayClickHandler}></div>\n\n <div\n class=\"modal-panel\"\n role=\"dialog\"\n aria-modal=\"true\"\n aria-hidden=${this.open ? \"false\" : \"true\"}\n aria-labelledby=\"title\"\n tabindex=\"-1\"\n >\n <div class=\"modal-content\">\n ${\n !this.noCloseButton\n ? html`<sgds-close-button\n class=\"modal-header__close\"\n @click=\"${() => this.requestClose(\"close-button\")}\"\n aria-label=\"close modal\"\n ></sgds-close-button>`\n : nothing\n }\n <div class=\"modal-header\">\n <div class=\"modal-header__title-description\">\n <div id=\"title\"><slot class=\"modal-title\" name=\"title\"></slot></div>\n <slot name=\"description\"></slot>\n </div>\n </div>\n <div class=\"modal-body\">\n <slot></slot>\n </div>\n </div class=\"modal-content\">\n <div class=\"modal-footer\">\n <slot name=\"footer\"></slot>\n </div>\n </div>\n </div>\n `;\n }\n}\n\nsetDefaultAnimation(\"modal.show\", {\n keyframes: [\n { opacity: 0, transform: \"scale(1) translate(0, -100%)\" },\n { opacity: 1, transform: \"scale(1) translate(0, 0%)\" }\n ],\n options: { duration: 400, easing: \"ease\" }\n});\n\nsetDefaultAnimation(\"modal.hide\", {\n keyframes: [\n { opacity: 1, transform: \"scale(1) translate(0, 0)\" },\n { opacity: 0, transform: \"scale(1) translate(0, -100%)\" }\n ],\n options: { duration: 400, easing: \"ease\" }\n});\n\nsetDefaultAnimation(\"modal.denyClose\", {\n keyframes: [{ transform: \"scale(1)\" }, { transform: \"scale(1.02)\" }, { transform: \"scale(1)\" }],\n options: { duration: 400 }\n});\n\nsetDefaultAnimation(\"modal.overlay.show\", {\n keyframes: [{ opacity: 0 }, { opacity: 1 }],\n options: { duration: 400 }\n});\n\nsetDefaultAnimation(\"modal.overlay.hide\", {\n keyframes: [{ opacity: 1 }, { opacity: 0 }],\n options: { duration: 400 }\n});\n\nexport default SgdsModal;\n"],"mappings":"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"}
1
+ {"version":3,"file":"sgds-modal.js","names":["headerStyles","svgStyles","modalStyle"],"sources":["../../../../src/components/Modal/sgds-modal.ts"],"sourcesContent":["import { html, nothing, PropertyValueMap } from \"lit\";\nimport { property, query } from \"lit/decorators.js\";\nimport { classMap } from \"lit/directives/class-map.js\";\nimport SgdsElement from \"../../base/sgds-element\";\nimport { watch } from \"../../utils/watch\";\nimport { animateTo, stopAnimations } from \"../../utils/animate\";\nimport { getAnimation, setDefaultAnimation } from \"../../utils/animation-registry\";\nimport { waitForEvent } from \"../../utils/event\";\nimport Modal from \"../../utils/modal\";\nimport { HasSlotController } from \"../../utils/slot\";\nimport { lockBodyScrolling, unlockBodyScrolling } from \"../../utils/scroll\";\nimport { SM_BREAKPOINT, MD_BREAKPOINT } from \"../../utils/breakpoints\";\nimport SgdsButton from \"../Button/sgds-button\";\nimport SgdsCloseButton from \"../CloseButton/sgds-close-button\";\nimport modalStyle from \"./modal.css\";\nimport headerStyles from \"../../styles/header-class.css\";\nimport svgStyles from \"../../styles/svg.css\";\n/**\n * @summary The modal component inform users about a specific task and may contain critical information which users then have to make a decision.\n *\n * @slot default - The content of the Modal's body.\n * @slot title - The title of the Modal.\n * @slot description - The description of the Modal.\n * @slot footer - The content of the Modal's footer, typically used to pass in buttons for call to action.\n *\n * @event sgds-close - Emitted when the modal is called to close via mouseclick of close button, overlay or via keyboard esc key. This event is cancelable; use `event.preventDefault()` to prevent the modal from closing. `event.detail.source` indicates the trigger source: 'close-button', 'overlay', or 'keyboard'.\n * @event sgds-show - Emitted when the modal opens\n * @event sgds-hide - Emitted when the modal closes\n * @event sgds-after-show - Emitted after modal opens and the animations has completed\n * @event sgds-after-hide - Emitted after modal closes and the animations has completed\n *\n */\nexport class SgdsModal extends SgdsElement {\n static styles = [...SgdsElement.styles, headerStyles, svgStyles, modalStyle];\n /**@internal */\n static dependencies = {\n \"sgds-close-button\": SgdsCloseButton\n };\n /**@internal */\n @query(\".modal\") dialog: HTMLElement;\n /**@internal */\n @query(\".modal-panel\") panel: HTMLElement;\n /**@internal */\n @query(\".modal-overlay\") overlay: HTMLElement;\n /**@internal */\n @query(\".modal-title\") heading: HTMLElement;\n /**@internal */\n private readonly hasSlotController = new HasSlotController(this, \"footer\");\n /**@internal */\n private modal: Modal;\n /**@internal */\n private originalTrigger: HTMLElement | null;\n private _resizeHandler: () => void;\n\n /**Indicates whether or not the modal is open. You can use this in lieu of the show/hide methods. */\n @property({ type: Boolean, reflect: true }) open = false;\n\n /** Removes the default animation when opening and closing of modal */\n @property({ type: Boolean, reflect: true }) noAnimation = false;\n\n /** Specifies a small, medium, large or fullscreen modal, the size is medium by default. */\n @property({ reflect: true }) size: \"sm\" | \"md\" | \"lg\" | \"xl\" | \"fullscreen\" = \"md\";\n\n /** Used only for SSR to indicate the presence of the `footer` slot. */\n @property({ type: Boolean }) hasFooterSlot = false;\n\n /** Removes the close button in the modal header. */\n @property({ type: Boolean, reflect: true }) noCloseButton = false;\n\n connectedCallback() {\n super.connectedCallback();\n this.handleDocumentKeyDown = this.handleDocumentKeyDown.bind(this);\n this.modal = new Modal(this);\n this._resizeHandler = this._debounce(this._onWindowResize.bind(this), 200);\n }\n\n disconnectedCallback() {\n super.disconnectedCallback();\n this._removeResizeListener();\n unlockBodyScrolling(this);\n }\n\n firstUpdated(changedProperties: PropertyValueMap<this>) {\n super.firstUpdated(changedProperties);\n this._onWindowResize();\n this.dialog.hidden = !this.open;\n\n if (this.open) {\n this.addOpenListeners();\n this.modal.activate();\n lockBodyScrolling(this);\n }\n }\n\n updated() {\n if (!this.hasFooterSlot) this.hasFooterSlot = this.hasSlotController.test(\"footer\");\n }\n\n private _debounce(func: (...args: any[]) => void, wait: number) {\n let timeout: number;\n return (...args: any[]) => {\n clearTimeout(timeout);\n timeout = window.setTimeout(() => func(...args), wait);\n };\n }\n\n /** Handle the window resize event. */\n private _onWindowResize() {\n const panel = this.panel.getBoundingClientRect();\n const panelWidth = panel.width;\n const buttonElements = this.querySelectorAll(\"sgds-button[slot='footer']\");\n\n if (!this.panel) return;\n\n if (buttonElements.length <= 1) return;\n\n if (panelWidth < SM_BREAKPOINT || (this.size === \"fullscreen\" && panelWidth < MD_BREAKPOINT)) {\n buttonElements.forEach(buttonElement => {\n const button = buttonElement as SgdsButton;\n button.fullWidth = true;\n });\n } else {\n buttonElements.forEach(buttonElement => {\n const button = buttonElement as SgdsButton;\n button.fullWidth = false;\n });\n }\n }\n\n /** Add the resize event listener. */\n private _addResizeListener() {\n window.addEventListener(\"resize\", this._resizeHandler);\n }\n\n /** Remove the resize event listener. */\n private _removeResizeListener() {\n window.removeEventListener(\"resize\", this._resizeHandler);\n }\n\n /** Shows the dialog. */\n public async show() {\n if (this.open) {\n return undefined;\n }\n\n this.open = true;\n return waitForEvent(this, \"sgds-after-show\");\n }\n\n /** Hides the dialog */\n public async hide() {\n if (!this.open) {\n return undefined;\n }\n\n this.open = false;\n return waitForEvent(this, \"sgds-after-hide\");\n }\n\n private requestClose(source: \"close-button\" | \"keyboard\" | \"overlay\") {\n const sgdsRequestClose = this.emit(\"sgds-close\", {\n cancelable: true,\n detail: { source }\n });\n\n if (sgdsRequestClose.defaultPrevented) {\n const animation = getAnimation(this, \"modal.denyClose\");\n animateTo(this.panel, animation.keyframes);\n return;\n }\n\n this.hide();\n }\n\n addOpenListeners() {\n document.addEventListener(\"keydown\", this.handleDocumentKeyDown);\n }\n\n removeOpenListeners() {\n document.removeEventListener(\"keydown\", this.handleDocumentKeyDown);\n }\n\n handleDocumentKeyDown(event: KeyboardEvent) {\n if (this.open && event.key === \"Escape\") {\n event.stopPropagation();\n this.requestClose(\"keyboard\");\n }\n }\n\n private _overlayClickHandler() {\n if (this.size === \"fullscreen\") {\n return;\n }\n\n this.requestClose(\"overlay\");\n }\n\n @watch(\"open\", { waitUntilFirstUpdate: true })\n async handleOpenChange() {\n if (this.open) {\n // Show\n this.emit(\"sgds-show\");\n this.addOpenListeners();\n this.originalTrigger = document.activeElement as HTMLElement;\n this.modal.activate();\n\n lockBodyScrolling(this);\n\n await Promise.all([stopAnimations(this.dialog), stopAnimations(this.overlay)]);\n this.dialog.hidden = false;\n\n const panelAnimation = getAnimation(this, \"modal.show\");\n const overlayAnimation = getAnimation(this, \"modal.overlay.show\");\n !this.noAnimation &&\n (await Promise.all([\n animateTo(this.panel, panelAnimation.keyframes, panelAnimation.options),\n animateTo(this.overlay, overlayAnimation.keyframes, overlayAnimation.options)\n ]));\n\n this.emit(\"sgds-after-show\");\n\n // Add focus on modal heading after opening it\n this.heading.focus();\n\n // Add resize listener only when the modal is shown\n this._addResizeListener();\n } else {\n // Hide\n this.emit(\"sgds-hide\");\n this.removeOpenListeners();\n this.modal.deactivate();\n\n await Promise.all([stopAnimations(this.dialog), stopAnimations(this.overlay)]);\n const panelAnimation = getAnimation(this, \"modal.hide\");\n const overlayAnimation = getAnimation(this, \"modal.overlay.hide\");\n\n // Animate the overlay and the panel at the same time. Because animation durations might be different, we need to\n // hide each one individually when the animation finishes, otherwise the first one that finishes will reappear\n // unexpectedly. We'll unhide them after all animations have completed.\n !this.noAnimation &&\n (await Promise.all([\n animateTo(this.overlay, overlayAnimation.keyframes, overlayAnimation.options).then(() => {\n this.overlay.hidden = true;\n }),\n animateTo(this.panel, panelAnimation.keyframes, panelAnimation.options).then(() => {\n this.panel.hidden = true;\n })\n ]));\n\n this.dialog.hidden = true;\n\n // Now that the dialog is hidden, restore the overlay and panel for next time\n this.overlay.hidden = false;\n this.panel.hidden = false;\n\n unlockBodyScrolling(this);\n\n // Restore focus to the original trigger\n const trigger = this.originalTrigger;\n if (typeof trigger?.focus === \"function\") {\n setTimeout(() => trigger.focus());\n }\n\n this.emit(\"sgds-after-hide\");\n\n // Remove resize listener when the modal is hidden\n this._removeResizeListener();\n }\n }\n\n render() {\n return html`\n <div\n class=${classMap({\n modal: true,\n show: this.open,\n \"has-footer\": this.hasFooterSlot\n })}\n >\n <div class=\"modal-overlay\" @click=${this._overlayClickHandler}></div>\n\n <div\n class=\"modal-panel\"\n role=\"dialog\"\n aria-modal=\"true\"\n aria-hidden=${this.open ? \"false\" : \"true\"}\n aria-labelledby=\"title\"\n tabindex=\"-1\"\n >\n <div class=\"modal-content\">\n ${\n !this.noCloseButton\n ? html`<sgds-close-button\n class=\"modal-header__close\"\n @click=\"${() => this.requestClose(\"close-button\")}\"\n aria-label=\"close modal\"\n ></sgds-close-button>`\n : nothing\n }\n <div class=\"modal-header\">\n <div class=\"modal-header__title-description\">\n <div id=\"title\"><slot class=\"modal-title\" name=\"title\"></slot></div>\n <slot name=\"description\"></slot>\n </div>\n </div>\n <div class=\"modal-body\" tabindex=\"0\">\n <slot></slot>\n </div>\n </div class=\"modal-content\">\n <div class=\"modal-footer\">\n <slot name=\"footer\"></slot>\n </div>\n </div>\n </div>\n `;\n }\n}\n\nsetDefaultAnimation(\"modal.show\", {\n keyframes: [\n { opacity: 0, transform: \"scale(1) translate(0, -100%)\" },\n { opacity: 1, transform: \"scale(1) translate(0, 0%)\" }\n ],\n options: { duration: 400, easing: \"ease\" }\n});\n\nsetDefaultAnimation(\"modal.hide\", {\n keyframes: [\n { opacity: 1, transform: \"scale(1) translate(0, 0)\" },\n { opacity: 0, transform: \"scale(1) translate(0, -100%)\" }\n ],\n options: { duration: 400, easing: \"ease\" }\n});\n\nsetDefaultAnimation(\"modal.denyClose\", {\n keyframes: [{ transform: \"scale(1)\" }, { transform: \"scale(1.02)\" }, { transform: \"scale(1)\" }],\n options: { duration: 400 }\n});\n\nsetDefaultAnimation(\"modal.overlay.show\", {\n keyframes: [{ opacity: 0 }, { opacity: 1 }],\n options: { duration: 400 }\n});\n\nsetDefaultAnimation(\"modal.overlay.hide\", {\n keyframes: [{ opacity: 1 }, { opacity: 0 }],\n options: { duration: 400 }\n});\n\nexport default SgdsModal;\n"],"mappings":"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"}
@@ -53,7 +53,7 @@ var SgdsSelect = class SgdsSelect extends require_select_element.SelectElement {
53
53
  connectedCallback() {
54
54
  super.connectedCallback();
55
55
  this.addEventListener("sgds-hide", async () => {
56
- (await this._input).focus();
56
+ (await this._input).focus({ preventScroll: true });
57
57
  });
58
58
  }
59
59
  async firstUpdated(changedProperties) {
@@ -1 +1 @@
1
- {"version":3,"file":"sgds-select.cjs.js","names":["SelectElement","formTextControlStyles","selectStyle","SgdsIcon","SgdsSpinner","SgdsSelectOption","ref","classMap","ifDefined","nothing","property","queryAssignedElements","watch"],"sources":["../../../../src/components/Select/sgds-select.ts"],"sourcesContent":["import { html, nothing, PropertyValueMap } from \"lit\";\nimport { property, queryAssignedElements } from \"lit/decorators.js\";\nimport { classMap } from \"lit/directives/class-map.js\";\nimport { ifDefined } from \"lit/directives/if-defined.js\";\nimport { ref } from \"lit/directives/ref.js\";\nimport { SelectElement } from \"../../base/select-element\";\nimport formTextControlStyles from \"../../styles/form-text-control.css\";\nimport { watch } from \"../../utils/watch\";\nimport SgdsIcon from \"../Icon/sgds-icon\";\nimport selectStyle from \"./select.css\";\nimport SgdsSelectOption from \"./sgds-select-option\";\nimport SgdsSpinner from \"../Spinner/sgds-spinner\";\n/**\n * @summary Select is used to make one selection from a list through keyboard or mouse actions\n *\n * @event sgds-select - Emitted when an option is selected.\n * @event sgds-change - Emitted when the select value changes.\n * @event sgds-focus - Emitted when user input is focused.\n * @event sgds-blur - Emitted when user input is blurred.\n * @event sgds-invalid - Emitted when the select's invalid state is set to true.\n * @event sgds-valid - Emitted when the select's invalid state is set to false.\n *\n * @slot default - slot for sgds-select-option passed into select's menu\n */\nexport class SgdsSelect extends SelectElement {\n static styles = [...SelectElement.styles, formTextControlStyles, selectStyle];\n static childName = \"sgds-select-option\";\n /** @internal */\n static dependencies = {\n \"sgds-icon\": SgdsIcon,\n \"sgds-spinner\": SgdsSpinner,\n [SgdsSelect.childName]: SgdsSelectOption\n };\n /** Disables native and sgds validation for the select. */\n @property({ type: Boolean, reflect: true }) noValidate = false;\n\n connectedCallback(): void {\n super.connectedCallback();\n this.addEventListener(\"sgds-hide\", async () => {\n const sgdsInput = await this._input;\n sgdsInput.focus();\n });\n }\n @queryAssignedElements({ flatten: true, selector: \"sgds-select-option\" })\n protected options: SgdsSelectOption[];\n\n async firstUpdated(changedProperties: PropertyValueMap<this>) {\n super.firstUpdated(changedProperties);\n this._updateDisplayValue();\n this.input = await this._input;\n this._mixinValidate(this.input);\n if (this.menuIsOpen) {\n await this.updateFloatingPosition();\n }\n }\n\n private async _handleSlotChange(e: Event) {\n const assignedElements = (e.target as HTMLSlotElement).assignedElements({ flatten: true });\n\n assignedElements.forEach(el =>\n el.addEventListener(\"click\", (e: Event) => {\n const option = e.target as SgdsSelectOption;\n if (option.disabled) return;\n this._handleItemSelected(e);\n })\n );\n assignedElements.forEach(el =>\n el.addEventListener(\"keydown\", (e: KeyboardEvent) => {\n if (e.key === \"Enter\") {\n this._handleItemSelected(e);\n }\n })\n );\n this.menuList = await this._getMenuListFromOptions(assignedElements);\n // If value was set before options slotted (e.g. React sets value prop\n // before children mount), sync the display now that options are available.\n if (this.value) {\n this._updateDisplayValue();\n this._setActiveToOption();\n }\n this.input = await this._input;\n this._mixinValidate(this.input);\n }\n private _updateDisplayValue() {\n if (this.value && this.menuList.length > 0) {\n const initialSelectedItem = this.menuList.filter(({ value }) => value === this.value);\n if (initialSelectedItem.length === 0) return;\n this.displayValue = initialSelectedItem[0].label;\n\n this._setActiveToOption();\n }\n }\n private _setActiveToOption() {\n const activeIndex = this.menuList.findIndex(item => item.value?.toString() === this.value);\n this.options.forEach((option, index) => {\n option.active = index === activeIndex;\n });\n }\n\n @watch(\"value\", { waitUntilFirstUpdate: true })\n async _handleValueChange() {\n // Guard: if options haven't slotted yet, menuList is empty.\n // _handleSlotChange will sync the display once options are available.\n if (this.menuList.length === 0) return;\n\n this._setActiveToOption();\n\n // when value change, always emit a change event\n this.emit(\"sgds-change\");\n\n if (this.value) {\n this.emit(\"sgds-select\");\n }\n const sgdsInput = await this._input;\n this._mixinSetFormValue();\n this._mixinValidate(sgdsInput);\n\n this._updateDisplayValue();\n if (!this._isTouched && this.value === \"\") return;\n if (this._mixinShouldSkipSgdsValidation()) return;\n\n this.invalid = !this._mixinReportValidity();\n }\n\n protected async _handleItemSelected(e: Event) {\n const itemEl = e.target as SgdsSelectOption;\n const itemLabel = itemEl.textContent?.trim() ?? \"\";\n const itemValueAttr = itemEl.getAttribute(\"value\") ?? itemLabel;\n const foundItem = {\n label: itemLabel,\n value: itemValueAttr\n };\n this.value = foundItem.value.toString();\n this.displayValue = foundItem.label;\n this.hideMenu();\n }\n\n protected _handleFocus() {\n this.emit(\"sgds-focus\");\n }\n\n protected async _handleInputBlur(e: Event) {\n e.preventDefault();\n this.emit(\"sgds-blur\");\n }\n\n /** For form reset */\n protected async _mixinResetFormControl() {\n this.value = this.defaultValue;\n const initialItem = this.menuList.filter(({ value }) => value === this.value);\n if (initialItem.length <= 0) {\n this.displayValue = \"\";\n } else {\n this.displayValue = initialItem[0].label;\n }\n this._mixinResetValidity(await this._input);\n }\n private _blockInputKeydown = (e: KeyboardEvent) => {\n if (e.key !== \"Tab\") {\n e.preventDefault();\n }\n };\n /** Applicable for menuList prop only */\n protected _renderMenu() {\n const menu = this.menuList.map(item => {\n const isActive = item.value === this.value;\n return html`\n <sgds-select-option\n ?active=${isActive}\n value=${item.value}\n ?disabled=${item.disabled}\n @click=${item.disabled ? null : this._handleItemSelected}\n @keydown=${(e: KeyboardEvent) => {\n if (e.key === \"Enter\") {\n this._handleItemSelected(e);\n }\n }}\n >\n ${item.label}\n </sgds-select-option>\n `;\n });\n return this.menuList.length === 0 ? this._renderEmptyMenu() : menu;\n }\n protected _renderInput() {\n const wantFeedbackStyle = this.hasFeedback;\n return html`\n <div\n ${ref(this.myDropdown)}\n class=\"form-control-group ${classMap({\n disabled: this.disabled,\n readonly: this.readonly,\n \"is-invalid\": this.invalid && wantFeedbackStyle\n })}\"\n @click=${this._handleClick}\n >\n <input\n class=\"form-control\"\n type=\"text\"\n id=${this._controlId}\n name=${ifDefined(this.name)}\n placeholder=${ifDefined(this.placeholder)}\n aria-invalid=${this.invalid ? \"true\" : \"false\"}\n ?autofocus=${this.autofocus}\n ?disabled=${this.disabled}\n ?readonly=${this.readonly}\n ?required=${this.required}\n .value=${this.displayValue}\n @blur=${this._handleInputBlur}\n @focus=${this._handleFocus}\n aria-describedby=${ifDefined(this.invalid && this.hasFeedback ? `${this._controlId}-invalid` : undefined)}\n aria-labelledby=\"${this._labelId} ${this._controlId}Help ${this.invalid && this.hasFeedback\n ? `${this._controlId}-invalid`\n : \"\"}\"\n @keydown=${this._blockInputKeydown}\n />\n <sgds-icon name=\"chevron-down\" size=\"md\"></sgds-icon>\n </div>\n `;\n }\n\n render() {\n return html`\n <div\n class=${classMap({\n disabled: this.disabled,\n select: true,\n \"form-control-container\": true,\n \"m-width-160\": true\n })}\n >\n ${this._renderLabel()}\n <!-- The input -->\n ${this._renderInput()} ${this._renderFeedback()}\n <div\n id=${this.dropdownMenuId}\n class=\"dropdown-menu\"\n tabindex=\"-1\"\n role=\"menu\"\n aria-label=${this.label || \"Options\"}\n ${ref(this.menuRef)}\n >\n <slot id=\"default\" class=${classMap({ \"is-loading\": this.loading })} @slotchange=${this._handleSlotChange}\n >${this._renderMenu()}</slot\n >\n ${this.loading ? this._renderLoadingMenu() : nothing}\n </div>\n </div>\n `;\n }\n}\n\nexport default SgdsSelect;\n"],"mappings":"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"}
1
+ {"version":3,"file":"sgds-select.cjs.js","names":["SelectElement","formTextControlStyles","selectStyle","SgdsIcon","SgdsSpinner","SgdsSelectOption","ref","classMap","ifDefined","nothing","property","queryAssignedElements","watch"],"sources":["../../../../src/components/Select/sgds-select.ts"],"sourcesContent":["import { html, nothing, PropertyValueMap } from \"lit\";\nimport { property, queryAssignedElements } from \"lit/decorators.js\";\nimport { classMap } from \"lit/directives/class-map.js\";\nimport { ifDefined } from \"lit/directives/if-defined.js\";\nimport { ref } from \"lit/directives/ref.js\";\nimport { SelectElement } from \"../../base/select-element\";\nimport formTextControlStyles from \"../../styles/form-text-control.css\";\nimport { watch } from \"../../utils/watch\";\nimport SgdsIcon from \"../Icon/sgds-icon\";\nimport selectStyle from \"./select.css\";\nimport SgdsSelectOption from \"./sgds-select-option\";\nimport SgdsSpinner from \"../Spinner/sgds-spinner\";\n/**\n * @summary Select is used to make one selection from a list through keyboard or mouse actions\n *\n * @event sgds-select - Emitted when an option is selected.\n * @event sgds-change - Emitted when the select value changes.\n * @event sgds-focus - Emitted when user input is focused.\n * @event sgds-blur - Emitted when user input is blurred.\n * @event sgds-invalid - Emitted when the select's invalid state is set to true.\n * @event sgds-valid - Emitted when the select's invalid state is set to false.\n *\n * @slot default - slot for sgds-select-option passed into select's menu\n */\nexport class SgdsSelect extends SelectElement {\n static styles = [...SelectElement.styles, formTextControlStyles, selectStyle];\n static childName = \"sgds-select-option\";\n /** @internal */\n static dependencies = {\n \"sgds-icon\": SgdsIcon,\n \"sgds-spinner\": SgdsSpinner,\n [SgdsSelect.childName]: SgdsSelectOption\n };\n /** Disables native and sgds validation for the select. */\n @property({ type: Boolean, reflect: true }) noValidate = false;\n\n connectedCallback(): void {\n super.connectedCallback();\n this.addEventListener(\"sgds-hide\", async () => {\n const sgdsInput = await this._input;\n sgdsInput.focus({ preventScroll: true });\n });\n }\n @queryAssignedElements({ flatten: true, selector: \"sgds-select-option\" })\n protected options: SgdsSelectOption[];\n\n async firstUpdated(changedProperties: PropertyValueMap<this>) {\n super.firstUpdated(changedProperties);\n this._updateDisplayValue();\n this.input = await this._input;\n this._mixinValidate(this.input);\n if (this.menuIsOpen) {\n await this.updateFloatingPosition();\n }\n }\n\n private async _handleSlotChange(e: Event) {\n const assignedElements = (e.target as HTMLSlotElement).assignedElements({ flatten: true });\n\n assignedElements.forEach(el =>\n el.addEventListener(\"click\", (e: Event) => {\n const option = e.target as SgdsSelectOption;\n if (option.disabled) return;\n this._handleItemSelected(e);\n })\n );\n assignedElements.forEach(el =>\n el.addEventListener(\"keydown\", (e: KeyboardEvent) => {\n if (e.key === \"Enter\") {\n this._handleItemSelected(e);\n }\n })\n );\n this.menuList = await this._getMenuListFromOptions(assignedElements);\n // If value was set before options slotted (e.g. React sets value prop\n // before children mount), sync the display now that options are available.\n if (this.value) {\n this._updateDisplayValue();\n this._setActiveToOption();\n }\n this.input = await this._input;\n this._mixinValidate(this.input);\n }\n private _updateDisplayValue() {\n if (this.value && this.menuList.length > 0) {\n const initialSelectedItem = this.menuList.filter(({ value }) => value === this.value);\n if (initialSelectedItem.length === 0) return;\n this.displayValue = initialSelectedItem[0].label;\n\n this._setActiveToOption();\n }\n }\n private _setActiveToOption() {\n const activeIndex = this.menuList.findIndex(item => item.value?.toString() === this.value);\n this.options.forEach((option, index) => {\n option.active = index === activeIndex;\n });\n }\n\n @watch(\"value\", { waitUntilFirstUpdate: true })\n async _handleValueChange() {\n // Guard: if options haven't slotted yet, menuList is empty.\n // _handleSlotChange will sync the display once options are available.\n if (this.menuList.length === 0) return;\n\n this._setActiveToOption();\n\n // when value change, always emit a change event\n this.emit(\"sgds-change\");\n\n if (this.value) {\n this.emit(\"sgds-select\");\n }\n const sgdsInput = await this._input;\n this._mixinSetFormValue();\n this._mixinValidate(sgdsInput);\n\n this._updateDisplayValue();\n if (!this._isTouched && this.value === \"\") return;\n if (this._mixinShouldSkipSgdsValidation()) return;\n\n this.invalid = !this._mixinReportValidity();\n }\n\n protected async _handleItemSelected(e: Event) {\n const itemEl = e.target as SgdsSelectOption;\n const itemLabel = itemEl.textContent?.trim() ?? \"\";\n const itemValueAttr = itemEl.getAttribute(\"value\") ?? itemLabel;\n const foundItem = {\n label: itemLabel,\n value: itemValueAttr\n };\n this.value = foundItem.value.toString();\n this.displayValue = foundItem.label;\n this.hideMenu();\n }\n\n protected _handleFocus() {\n this.emit(\"sgds-focus\");\n }\n\n protected async _handleInputBlur(e: Event) {\n e.preventDefault();\n this.emit(\"sgds-blur\");\n }\n\n /** For form reset */\n protected async _mixinResetFormControl() {\n this.value = this.defaultValue;\n const initialItem = this.menuList.filter(({ value }) => value === this.value);\n if (initialItem.length <= 0) {\n this.displayValue = \"\";\n } else {\n this.displayValue = initialItem[0].label;\n }\n this._mixinResetValidity(await this._input);\n }\n private _blockInputKeydown = (e: KeyboardEvent) => {\n if (e.key !== \"Tab\") {\n e.preventDefault();\n }\n };\n /** Applicable for menuList prop only */\n protected _renderMenu() {\n const menu = this.menuList.map(item => {\n const isActive = item.value === this.value;\n return html`\n <sgds-select-option\n ?active=${isActive}\n value=${item.value}\n ?disabled=${item.disabled}\n @click=${item.disabled ? null : this._handleItemSelected}\n @keydown=${(e: KeyboardEvent) => {\n if (e.key === \"Enter\") {\n this._handleItemSelected(e);\n }\n }}\n >\n ${item.label}\n </sgds-select-option>\n `;\n });\n return this.menuList.length === 0 ? this._renderEmptyMenu() : menu;\n }\n protected _renderInput() {\n const wantFeedbackStyle = this.hasFeedback;\n return html`\n <div\n ${ref(this.myDropdown)}\n class=\"form-control-group ${classMap({\n disabled: this.disabled,\n readonly: this.readonly,\n \"is-invalid\": this.invalid && wantFeedbackStyle\n })}\"\n @click=${this._handleClick}\n >\n <input\n class=\"form-control\"\n type=\"text\"\n id=${this._controlId}\n name=${ifDefined(this.name)}\n placeholder=${ifDefined(this.placeholder)}\n aria-invalid=${this.invalid ? \"true\" : \"false\"}\n ?autofocus=${this.autofocus}\n ?disabled=${this.disabled}\n ?readonly=${this.readonly}\n ?required=${this.required}\n .value=${this.displayValue}\n @blur=${this._handleInputBlur}\n @focus=${this._handleFocus}\n aria-describedby=${ifDefined(this.invalid && this.hasFeedback ? `${this._controlId}-invalid` : undefined)}\n aria-labelledby=\"${this._labelId} ${this._controlId}Help ${this.invalid && this.hasFeedback\n ? `${this._controlId}-invalid`\n : \"\"}\"\n @keydown=${this._blockInputKeydown}\n />\n <sgds-icon name=\"chevron-down\" size=\"md\"></sgds-icon>\n </div>\n `;\n }\n\n render() {\n return html`\n <div\n class=${classMap({\n disabled: this.disabled,\n select: true,\n \"form-control-container\": true,\n \"m-width-160\": true\n })}\n >\n ${this._renderLabel()}\n <!-- The input -->\n ${this._renderInput()} ${this._renderFeedback()}\n <div\n id=${this.dropdownMenuId}\n class=\"dropdown-menu\"\n tabindex=\"-1\"\n role=\"menu\"\n aria-label=${this.label || \"Options\"}\n ${ref(this.menuRef)}\n >\n <slot id=\"default\" class=${classMap({ \"is-loading\": this.loading })} @slotchange=${this._handleSlotChange}\n >${this._renderMenu()}</slot\n >\n ${this.loading ? this._renderLoadingMenu() : nothing}\n </div>\n </div>\n `;\n }\n}\n\nexport default SgdsSelect;\n"],"mappings":"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"}
@@ -53,7 +53,7 @@ var SgdsSelect = class SgdsSelect extends SelectElement {
53
53
  connectedCallback() {
54
54
  super.connectedCallback();
55
55
  this.addEventListener("sgds-hide", async () => {
56
- (await this._input).focus();
56
+ (await this._input).focus({ preventScroll: true });
57
57
  });
58
58
  }
59
59
  async firstUpdated(changedProperties) {
@@ -1 +1 @@
1
- {"version":3,"file":"sgds-select.js","names":["formTextControlStyles","selectStyle"],"sources":["../../../../src/components/Select/sgds-select.ts"],"sourcesContent":["import { html, nothing, PropertyValueMap } from \"lit\";\nimport { property, queryAssignedElements } from \"lit/decorators.js\";\nimport { classMap } from \"lit/directives/class-map.js\";\nimport { ifDefined } from \"lit/directives/if-defined.js\";\nimport { ref } from \"lit/directives/ref.js\";\nimport { SelectElement } from \"../../base/select-element\";\nimport formTextControlStyles from \"../../styles/form-text-control.css\";\nimport { watch } from \"../../utils/watch\";\nimport SgdsIcon from \"../Icon/sgds-icon\";\nimport selectStyle from \"./select.css\";\nimport SgdsSelectOption from \"./sgds-select-option\";\nimport SgdsSpinner from \"../Spinner/sgds-spinner\";\n/**\n * @summary Select is used to make one selection from a list through keyboard or mouse actions\n *\n * @event sgds-select - Emitted when an option is selected.\n * @event sgds-change - Emitted when the select value changes.\n * @event sgds-focus - Emitted when user input is focused.\n * @event sgds-blur - Emitted when user input is blurred.\n * @event sgds-invalid - Emitted when the select's invalid state is set to true.\n * @event sgds-valid - Emitted when the select's invalid state is set to false.\n *\n * @slot default - slot for sgds-select-option passed into select's menu\n */\nexport class SgdsSelect extends SelectElement {\n static styles = [...SelectElement.styles, formTextControlStyles, selectStyle];\n static childName = \"sgds-select-option\";\n /** @internal */\n static dependencies = {\n \"sgds-icon\": SgdsIcon,\n \"sgds-spinner\": SgdsSpinner,\n [SgdsSelect.childName]: SgdsSelectOption\n };\n /** Disables native and sgds validation for the select. */\n @property({ type: Boolean, reflect: true }) noValidate = false;\n\n connectedCallback(): void {\n super.connectedCallback();\n this.addEventListener(\"sgds-hide\", async () => {\n const sgdsInput = await this._input;\n sgdsInput.focus();\n });\n }\n @queryAssignedElements({ flatten: true, selector: \"sgds-select-option\" })\n protected options: SgdsSelectOption[];\n\n async firstUpdated(changedProperties: PropertyValueMap<this>) {\n super.firstUpdated(changedProperties);\n this._updateDisplayValue();\n this.input = await this._input;\n this._mixinValidate(this.input);\n if (this.menuIsOpen) {\n await this.updateFloatingPosition();\n }\n }\n\n private async _handleSlotChange(e: Event) {\n const assignedElements = (e.target as HTMLSlotElement).assignedElements({ flatten: true });\n\n assignedElements.forEach(el =>\n el.addEventListener(\"click\", (e: Event) => {\n const option = e.target as SgdsSelectOption;\n if (option.disabled) return;\n this._handleItemSelected(e);\n })\n );\n assignedElements.forEach(el =>\n el.addEventListener(\"keydown\", (e: KeyboardEvent) => {\n if (e.key === \"Enter\") {\n this._handleItemSelected(e);\n }\n })\n );\n this.menuList = await this._getMenuListFromOptions(assignedElements);\n // If value was set before options slotted (e.g. React sets value prop\n // before children mount), sync the display now that options are available.\n if (this.value) {\n this._updateDisplayValue();\n this._setActiveToOption();\n }\n this.input = await this._input;\n this._mixinValidate(this.input);\n }\n private _updateDisplayValue() {\n if (this.value && this.menuList.length > 0) {\n const initialSelectedItem = this.menuList.filter(({ value }) => value === this.value);\n if (initialSelectedItem.length === 0) return;\n this.displayValue = initialSelectedItem[0].label;\n\n this._setActiveToOption();\n }\n }\n private _setActiveToOption() {\n const activeIndex = this.menuList.findIndex(item => item.value?.toString() === this.value);\n this.options.forEach((option, index) => {\n option.active = index === activeIndex;\n });\n }\n\n @watch(\"value\", { waitUntilFirstUpdate: true })\n async _handleValueChange() {\n // Guard: if options haven't slotted yet, menuList is empty.\n // _handleSlotChange will sync the display once options are available.\n if (this.menuList.length === 0) return;\n\n this._setActiveToOption();\n\n // when value change, always emit a change event\n this.emit(\"sgds-change\");\n\n if (this.value) {\n this.emit(\"sgds-select\");\n }\n const sgdsInput = await this._input;\n this._mixinSetFormValue();\n this._mixinValidate(sgdsInput);\n\n this._updateDisplayValue();\n if (!this._isTouched && this.value === \"\") return;\n if (this._mixinShouldSkipSgdsValidation()) return;\n\n this.invalid = !this._mixinReportValidity();\n }\n\n protected async _handleItemSelected(e: Event) {\n const itemEl = e.target as SgdsSelectOption;\n const itemLabel = itemEl.textContent?.trim() ?? \"\";\n const itemValueAttr = itemEl.getAttribute(\"value\") ?? itemLabel;\n const foundItem = {\n label: itemLabel,\n value: itemValueAttr\n };\n this.value = foundItem.value.toString();\n this.displayValue = foundItem.label;\n this.hideMenu();\n }\n\n protected _handleFocus() {\n this.emit(\"sgds-focus\");\n }\n\n protected async _handleInputBlur(e: Event) {\n e.preventDefault();\n this.emit(\"sgds-blur\");\n }\n\n /** For form reset */\n protected async _mixinResetFormControl() {\n this.value = this.defaultValue;\n const initialItem = this.menuList.filter(({ value }) => value === this.value);\n if (initialItem.length <= 0) {\n this.displayValue = \"\";\n } else {\n this.displayValue = initialItem[0].label;\n }\n this._mixinResetValidity(await this._input);\n }\n private _blockInputKeydown = (e: KeyboardEvent) => {\n if (e.key !== \"Tab\") {\n e.preventDefault();\n }\n };\n /** Applicable for menuList prop only */\n protected _renderMenu() {\n const menu = this.menuList.map(item => {\n const isActive = item.value === this.value;\n return html`\n <sgds-select-option\n ?active=${isActive}\n value=${item.value}\n ?disabled=${item.disabled}\n @click=${item.disabled ? null : this._handleItemSelected}\n @keydown=${(e: KeyboardEvent) => {\n if (e.key === \"Enter\") {\n this._handleItemSelected(e);\n }\n }}\n >\n ${item.label}\n </sgds-select-option>\n `;\n });\n return this.menuList.length === 0 ? this._renderEmptyMenu() : menu;\n }\n protected _renderInput() {\n const wantFeedbackStyle = this.hasFeedback;\n return html`\n <div\n ${ref(this.myDropdown)}\n class=\"form-control-group ${classMap({\n disabled: this.disabled,\n readonly: this.readonly,\n \"is-invalid\": this.invalid && wantFeedbackStyle\n })}\"\n @click=${this._handleClick}\n >\n <input\n class=\"form-control\"\n type=\"text\"\n id=${this._controlId}\n name=${ifDefined(this.name)}\n placeholder=${ifDefined(this.placeholder)}\n aria-invalid=${this.invalid ? \"true\" : \"false\"}\n ?autofocus=${this.autofocus}\n ?disabled=${this.disabled}\n ?readonly=${this.readonly}\n ?required=${this.required}\n .value=${this.displayValue}\n @blur=${this._handleInputBlur}\n @focus=${this._handleFocus}\n aria-describedby=${ifDefined(this.invalid && this.hasFeedback ? `${this._controlId}-invalid` : undefined)}\n aria-labelledby=\"${this._labelId} ${this._controlId}Help ${this.invalid && this.hasFeedback\n ? `${this._controlId}-invalid`\n : \"\"}\"\n @keydown=${this._blockInputKeydown}\n />\n <sgds-icon name=\"chevron-down\" size=\"md\"></sgds-icon>\n </div>\n `;\n }\n\n render() {\n return html`\n <div\n class=${classMap({\n disabled: this.disabled,\n select: true,\n \"form-control-container\": true,\n \"m-width-160\": true\n })}\n >\n ${this._renderLabel()}\n <!-- The input -->\n ${this._renderInput()} ${this._renderFeedback()}\n <div\n id=${this.dropdownMenuId}\n class=\"dropdown-menu\"\n tabindex=\"-1\"\n role=\"menu\"\n aria-label=${this.label || \"Options\"}\n ${ref(this.menuRef)}\n >\n <slot id=\"default\" class=${classMap({ \"is-loading\": this.loading })} @slotchange=${this._handleSlotChange}\n >${this._renderMenu()}</slot\n >\n ${this.loading ? this._renderLoadingMenu() : nothing}\n </div>\n </div>\n `;\n }\n}\n\nexport default SgdsSelect;\n"],"mappings":"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"}
1
+ {"version":3,"file":"sgds-select.js","names":["formTextControlStyles","selectStyle"],"sources":["../../../../src/components/Select/sgds-select.ts"],"sourcesContent":["import { html, nothing, PropertyValueMap } from \"lit\";\nimport { property, queryAssignedElements } from \"lit/decorators.js\";\nimport { classMap } from \"lit/directives/class-map.js\";\nimport { ifDefined } from \"lit/directives/if-defined.js\";\nimport { ref } from \"lit/directives/ref.js\";\nimport { SelectElement } from \"../../base/select-element\";\nimport formTextControlStyles from \"../../styles/form-text-control.css\";\nimport { watch } from \"../../utils/watch\";\nimport SgdsIcon from \"../Icon/sgds-icon\";\nimport selectStyle from \"./select.css\";\nimport SgdsSelectOption from \"./sgds-select-option\";\nimport SgdsSpinner from \"../Spinner/sgds-spinner\";\n/**\n * @summary Select is used to make one selection from a list through keyboard or mouse actions\n *\n * @event sgds-select - Emitted when an option is selected.\n * @event sgds-change - Emitted when the select value changes.\n * @event sgds-focus - Emitted when user input is focused.\n * @event sgds-blur - Emitted when user input is blurred.\n * @event sgds-invalid - Emitted when the select's invalid state is set to true.\n * @event sgds-valid - Emitted when the select's invalid state is set to false.\n *\n * @slot default - slot for sgds-select-option passed into select's menu\n */\nexport class SgdsSelect extends SelectElement {\n static styles = [...SelectElement.styles, formTextControlStyles, selectStyle];\n static childName = \"sgds-select-option\";\n /** @internal */\n static dependencies = {\n \"sgds-icon\": SgdsIcon,\n \"sgds-spinner\": SgdsSpinner,\n [SgdsSelect.childName]: SgdsSelectOption\n };\n /** Disables native and sgds validation for the select. */\n @property({ type: Boolean, reflect: true }) noValidate = false;\n\n connectedCallback(): void {\n super.connectedCallback();\n this.addEventListener(\"sgds-hide\", async () => {\n const sgdsInput = await this._input;\n sgdsInput.focus({ preventScroll: true });\n });\n }\n @queryAssignedElements({ flatten: true, selector: \"sgds-select-option\" })\n protected options: SgdsSelectOption[];\n\n async firstUpdated(changedProperties: PropertyValueMap<this>) {\n super.firstUpdated(changedProperties);\n this._updateDisplayValue();\n this.input = await this._input;\n this._mixinValidate(this.input);\n if (this.menuIsOpen) {\n await this.updateFloatingPosition();\n }\n }\n\n private async _handleSlotChange(e: Event) {\n const assignedElements = (e.target as HTMLSlotElement).assignedElements({ flatten: true });\n\n assignedElements.forEach(el =>\n el.addEventListener(\"click\", (e: Event) => {\n const option = e.target as SgdsSelectOption;\n if (option.disabled) return;\n this._handleItemSelected(e);\n })\n );\n assignedElements.forEach(el =>\n el.addEventListener(\"keydown\", (e: KeyboardEvent) => {\n if (e.key === \"Enter\") {\n this._handleItemSelected(e);\n }\n })\n );\n this.menuList = await this._getMenuListFromOptions(assignedElements);\n // If value was set before options slotted (e.g. React sets value prop\n // before children mount), sync the display now that options are available.\n if (this.value) {\n this._updateDisplayValue();\n this._setActiveToOption();\n }\n this.input = await this._input;\n this._mixinValidate(this.input);\n }\n private _updateDisplayValue() {\n if (this.value && this.menuList.length > 0) {\n const initialSelectedItem = this.menuList.filter(({ value }) => value === this.value);\n if (initialSelectedItem.length === 0) return;\n this.displayValue = initialSelectedItem[0].label;\n\n this._setActiveToOption();\n }\n }\n private _setActiveToOption() {\n const activeIndex = this.menuList.findIndex(item => item.value?.toString() === this.value);\n this.options.forEach((option, index) => {\n option.active = index === activeIndex;\n });\n }\n\n @watch(\"value\", { waitUntilFirstUpdate: true })\n async _handleValueChange() {\n // Guard: if options haven't slotted yet, menuList is empty.\n // _handleSlotChange will sync the display once options are available.\n if (this.menuList.length === 0) return;\n\n this._setActiveToOption();\n\n // when value change, always emit a change event\n this.emit(\"sgds-change\");\n\n if (this.value) {\n this.emit(\"sgds-select\");\n }\n const sgdsInput = await this._input;\n this._mixinSetFormValue();\n this._mixinValidate(sgdsInput);\n\n this._updateDisplayValue();\n if (!this._isTouched && this.value === \"\") return;\n if (this._mixinShouldSkipSgdsValidation()) return;\n\n this.invalid = !this._mixinReportValidity();\n }\n\n protected async _handleItemSelected(e: Event) {\n const itemEl = e.target as SgdsSelectOption;\n const itemLabel = itemEl.textContent?.trim() ?? \"\";\n const itemValueAttr = itemEl.getAttribute(\"value\") ?? itemLabel;\n const foundItem = {\n label: itemLabel,\n value: itemValueAttr\n };\n this.value = foundItem.value.toString();\n this.displayValue = foundItem.label;\n this.hideMenu();\n }\n\n protected _handleFocus() {\n this.emit(\"sgds-focus\");\n }\n\n protected async _handleInputBlur(e: Event) {\n e.preventDefault();\n this.emit(\"sgds-blur\");\n }\n\n /** For form reset */\n protected async _mixinResetFormControl() {\n this.value = this.defaultValue;\n const initialItem = this.menuList.filter(({ value }) => value === this.value);\n if (initialItem.length <= 0) {\n this.displayValue = \"\";\n } else {\n this.displayValue = initialItem[0].label;\n }\n this._mixinResetValidity(await this._input);\n }\n private _blockInputKeydown = (e: KeyboardEvent) => {\n if (e.key !== \"Tab\") {\n e.preventDefault();\n }\n };\n /** Applicable for menuList prop only */\n protected _renderMenu() {\n const menu = this.menuList.map(item => {\n const isActive = item.value === this.value;\n return html`\n <sgds-select-option\n ?active=${isActive}\n value=${item.value}\n ?disabled=${item.disabled}\n @click=${item.disabled ? null : this._handleItemSelected}\n @keydown=${(e: KeyboardEvent) => {\n if (e.key === \"Enter\") {\n this._handleItemSelected(e);\n }\n }}\n >\n ${item.label}\n </sgds-select-option>\n `;\n });\n return this.menuList.length === 0 ? this._renderEmptyMenu() : menu;\n }\n protected _renderInput() {\n const wantFeedbackStyle = this.hasFeedback;\n return html`\n <div\n ${ref(this.myDropdown)}\n class=\"form-control-group ${classMap({\n disabled: this.disabled,\n readonly: this.readonly,\n \"is-invalid\": this.invalid && wantFeedbackStyle\n })}\"\n @click=${this._handleClick}\n >\n <input\n class=\"form-control\"\n type=\"text\"\n id=${this._controlId}\n name=${ifDefined(this.name)}\n placeholder=${ifDefined(this.placeholder)}\n aria-invalid=${this.invalid ? \"true\" : \"false\"}\n ?autofocus=${this.autofocus}\n ?disabled=${this.disabled}\n ?readonly=${this.readonly}\n ?required=${this.required}\n .value=${this.displayValue}\n @blur=${this._handleInputBlur}\n @focus=${this._handleFocus}\n aria-describedby=${ifDefined(this.invalid && this.hasFeedback ? `${this._controlId}-invalid` : undefined)}\n aria-labelledby=\"${this._labelId} ${this._controlId}Help ${this.invalid && this.hasFeedback\n ? `${this._controlId}-invalid`\n : \"\"}\"\n @keydown=${this._blockInputKeydown}\n />\n <sgds-icon name=\"chevron-down\" size=\"md\"></sgds-icon>\n </div>\n `;\n }\n\n render() {\n return html`\n <div\n class=${classMap({\n disabled: this.disabled,\n select: true,\n \"form-control-container\": true,\n \"m-width-160\": true\n })}\n >\n ${this._renderLabel()}\n <!-- The input -->\n ${this._renderInput()} ${this._renderFeedback()}\n <div\n id=${this.dropdownMenuId}\n class=\"dropdown-menu\"\n tabindex=\"-1\"\n role=\"menu\"\n aria-label=${this.label || \"Options\"}\n ${ref(this.menuRef)}\n >\n <slot id=\"default\" class=${classMap({ \"is-loading\": this.loading })} @slotchange=${this._handleSlotChange}\n >${this._renderMenu()}</slot\n >\n ${this.loading ? this._renderLoadingMenu() : nothing}\n </div>\n </div>\n `;\n }\n}\n\nexport default SgdsSelect;\n"],"mappings":"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"}
@@ -34,7 +34,7 @@ var SgdsSidenav = class extends require_sgds_element.default {
34
34
  }
35
35
  render() {
36
36
  return lit.html`
37
- <nav class=${(0, lit_directives_class_map_js.classMap)({ sticky: this.sticky })}>
37
+ <nav aria-label="Side navigation" class=${(0, lit_directives_class_map_js.classMap)({ sticky: this.sticky })}>
38
38
  <div>
39
39
  <slot @click=${this.onToggle}></slot>
40
40
  </div>