@universal-material/web 3.0.101 → 3.0.103

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.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@universal-material/web",
3
- "version": "3.0.101",
3
+ "version": "3.0.103",
4
4
  "description": "Material web components",
5
5
  "type": "module",
6
6
  "keywords": [
@@ -1 +1 @@
1
- {"version":3,"file":"menu-field-navigation-controller.d.ts","sourceRoot":"","sources":["../../../src/shared/menu-field/menu-field-navigation-controller.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AACrD,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAE9C,qBAAa,6BAA6B,CAAC,MAAM,SAAS,WAAW,EAAE,SAAS,SAAS,UAAU;;IAEjG,SAAS,CAAC,WAAW,EAAE,SAAS,GAAG,IAAI,CAAQ;IAC/C,SAAS,CAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAEhC,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAiC;gBAEvD,IAAI,EAAE,MAAM;IAKxB,MAAM,CAAC,OAAO,EAAE,WAAW;IAQ3B,MAAM;IAQN,SAAS,CAAC,aAAa,CAAC,KAAK,EAAE,aAAa,GAAG,OAAO;IAwCtD,OAAO,CAAC,QAAQ;IAsBhB,SAAS,CAAC,UAAU,CAAC,KAAK,EAAE,aAAa,EAAE,IAAI,EAAE,SAAS,GAAG,SAAS;IAYtE,SAAS,CAAC,IAAI,EAAE,SAAS,EAAE,MAAM,UAAO,EAAE,MAAM,UAAO;IAWvD,QAAQ;IAUR,OAAO,CAAC,gBAAgB;IASxB,SAAS,CAAC,UAAU,CAAC,CAAC,EAAE,SAAS;IAIjC,SAAS,CAAC,SAAS;CAGpB"}
1
+ {"version":3,"file":"menu-field-navigation-controller.d.ts","sourceRoot":"","sources":["../../../src/shared/menu-field/menu-field-navigation-controller.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AACrD,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAE9C,qBAAa,6BAA6B,CAAC,MAAM,SAAS,WAAW,EAAE,SAAS,SAAS,UAAU;;IAEjG,SAAS,CAAC,WAAW,EAAE,SAAS,GAAG,IAAI,CAAQ;IAC/C,SAAS,CAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAEhC,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAiC;gBAEvD,IAAI,EAAE,MAAM;IAKxB,MAAM,CAAC,OAAO,EAAE,WAAW;IAQ3B,MAAM;IAQN,SAAS,CAAC,aAAa,CAAC,KAAK,EAAE,aAAa,GAAG,OAAO;IAwCtD,OAAO,CAAC,QAAQ;IAsBhB,SAAS,CAAC,UAAU,CAAC,KAAK,EAAE,aAAa,EAAE,IAAI,EAAE,SAAS,GAAG,SAAS;IAYtE,SAAS,CAAC,IAAI,EAAE,SAAS,EAAE,MAAM,UAAO,EAAE,MAAM,UAAO;IAWvD,QAAQ;IAUR,OAAO,CAAC,gBAAgB;IASxB,SAAS,CAAC,UAAU,CAAC,CAAC,EAAE,SAAS;IAEjC,SAAS,CAAC,SAAS;CACpB"}
@@ -20,7 +20,7 @@ export class MenuFieldNavigationController {
20
20
  }
21
21
  #handleMenuClose;
22
22
  handleKeyDown(event) {
23
- if (!this.host._menu.open) {
23
+ if (this.host._menu?.open !== true) {
24
24
  return false;
25
25
  }
26
26
  const isEscape = event.key === 'Escape';
@@ -95,9 +95,7 @@ export class MenuFieldNavigationController {
95
95
  event.preventDefault();
96
96
  this.focusedMenu.click();
97
97
  }
98
- afterFocus(_) {
99
- }
100
- afterBlur() {
101
- }
98
+ afterFocus(_) { }
99
+ afterBlur() { }
102
100
  }
103
101
  //# sourceMappingURL=menu-field-navigation-controller.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"menu-field-navigation-controller.js","sourceRoot":"","sources":["../../../src/shared/menu-field/menu-field-navigation-controller.ts"],"names":[],"mappings":"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","sourcesContent":["import { UmMenuItem } from '../../menu/menu-item.js';\nimport { UmMenuField } from './menu-field.js';\n\nexport class MenuFieldNavigationController<TField extends UmMenuField, TMenuItem extends UmMenuItem> {\n #element: HTMLElement | null = null;\n protected focusedMenu: TMenuItem | null = null;\n protected readonly host: TField;\n\n private readonly bindHandleKeyDown: (event: KeyboardEvent) => void;\n\n constructor(host: TField) {\n this.host = host;\n this.bindHandleKeyDown = this.handleKeyDown.bind(this);\n }\n\n attach(element: HTMLElement) {\n this.detach();\n\n element?.addEventListener('keydown', this.bindHandleKeyDown, {capture: true});\n this.host._menu?.addEventListener('close', this.#handleMenuClose);\n this.#element = element;\n }\n\n detach() {\n this.#element?.removeEventListener('keydown', this.bindHandleKeyDown);\n this.host._menu?.removeEventListener('close', this.#handleMenuClose);\n this.#element = null;\n }\n\n #handleMenuClose = () => this.blurMenu();\n\n protected handleKeyDown(event: KeyboardEvent): boolean {\n if (!this.host._menu.open) {\n return false;\n }\n\n const isEscape = event.key === 'Escape';\n\n if (isEscape) {\n this.host._menu.close();\n }\n\n if (event.key === 'Home') {\n this.navigateTo(event, <TMenuItem>this.host._menuItems[0]);\n return true;\n }\n\n if (event.key === 'End') {\n this.navigateTo(event, <TMenuItem>this.host._menuItems[this.host._menuItems.length - 1]);\n return true;\n }\n\n const isDown = event.key === 'ArrowDown';\n const isUp = event.key === 'ArrowUp';\n\n if (isDown || isUp) {\n this.navigate(event, isDown);\n return true;\n }\n\n const isEnter = event.key === 'Enter';\n const isTab = event.key === 'Tab';\n\n if (isEnter || isTab) {\n this.selectActiveItem(event);\n return true;\n }\n\n return false;\n }\n\n private navigate(event: KeyboardEvent, forwards: boolean) {\n const menuItems = this.host._menuItems;\n\n if (!menuItems.length) {\n return;\n }\n\n event.preventDefault();\n\n const activeMenu = this.focusedMenu;\n\n const nextMenu = forwards\n ? (<TMenuItem>activeMenu?.nextElementSibling) ?? menuItems[0]\n : (<TMenuItem>activeMenu?.previousElementSibling) ?? menuItems[menuItems.length - 1];\n\n if (!nextMenu) {\n return;\n }\n\n this.navigateTo(event, nextMenu);\n }\n\n protected navigateTo(event: KeyboardEvent, menu: TMenuItem | undefined) {\n event.preventDefault();\n\n this.blurMenu();\n\n if (!menu) {\n return;\n }\n\n this.focusMenu(menu);\n }\n\n focusMenu(menu: TMenuItem, active = true, scroll = true) {\n this.focusedMenu = menu;\n menu.active = active;\n\n if (scroll) {\n menu.scrollIntoView({block: 'nearest'});\n }\n\n this.afterFocus(menu);\n }\n\n blurMenu() {\n if (!this.focusedMenu) {\n return;\n }\n\n this.focusedMenu.active = false;\n this.focusedMenu = null;\n this.afterBlur();\n }\n\n private selectActiveItem(event: KeyboardEvent) {\n if (!this.focusedMenu) {\n return;\n }\n\n event.preventDefault();\n this.focusedMenu.click();\n }\n\n protected afterFocus(_: TMenuItem) {\n\n }\n\n protected afterBlur() {\n\n }\n}\n"]}
1
+ {"version":3,"file":"menu-field-navigation-controller.js","sourceRoot":"","sources":["../../../src/shared/menu-field/menu-field-navigation-controller.ts"],"names":[],"mappings":"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","sourcesContent":["import { UmMenuItem } from '../../menu/menu-item.js';\nimport { UmMenuField } from './menu-field.js';\n\nexport class MenuFieldNavigationController<TField extends UmMenuField, TMenuItem extends UmMenuItem> {\n #element: HTMLElement | null = null;\n protected focusedMenu: TMenuItem | null = null;\n protected readonly host: TField;\n\n private readonly bindHandleKeyDown: (event: KeyboardEvent) => void;\n\n constructor(host: TField) {\n this.host = host;\n this.bindHandleKeyDown = this.handleKeyDown.bind(this);\n }\n\n attach(element: HTMLElement) {\n this.detach();\n\n element?.addEventListener('keydown', this.bindHandleKeyDown, { capture: true });\n this.host._menu?.addEventListener('close', this.#handleMenuClose);\n this.#element = element;\n }\n\n detach() {\n this.#element?.removeEventListener('keydown', this.bindHandleKeyDown);\n this.host._menu?.removeEventListener('close', this.#handleMenuClose);\n this.#element = null;\n }\n\n #handleMenuClose = () => this.blurMenu();\n\n protected handleKeyDown(event: KeyboardEvent): boolean {\n if (this.host._menu?.open !== true) {\n return false;\n }\n\n const isEscape = event.key === 'Escape';\n\n if (isEscape) {\n this.host._menu.close();\n }\n\n if (event.key === 'Home') {\n this.navigateTo(event, <TMenuItem>this.host._menuItems[0]);\n return true;\n }\n\n if (event.key === 'End') {\n this.navigateTo(event, <TMenuItem>this.host._menuItems[this.host._menuItems.length - 1]);\n return true;\n }\n\n const isDown = event.key === 'ArrowDown';\n const isUp = event.key === 'ArrowUp';\n\n if (isDown || isUp) {\n this.navigate(event, isDown);\n return true;\n }\n\n const isEnter = event.key === 'Enter';\n const isTab = event.key === 'Tab';\n\n if (isEnter || isTab) {\n this.selectActiveItem(event);\n return true;\n }\n\n return false;\n }\n\n private navigate(event: KeyboardEvent, forwards: boolean) {\n const menuItems = this.host._menuItems;\n\n if (!menuItems.length) {\n return;\n }\n\n event.preventDefault();\n\n const activeMenu = this.focusedMenu;\n\n const nextMenu = forwards\n ? <TMenuItem>activeMenu?.nextElementSibling ?? menuItems[0]\n : <TMenuItem>activeMenu?.previousElementSibling ?? menuItems[menuItems.length - 1];\n\n if (!nextMenu) {\n return;\n }\n\n this.navigateTo(event, nextMenu);\n }\n\n protected navigateTo(event: KeyboardEvent, menu: TMenuItem | undefined) {\n event.preventDefault();\n\n this.blurMenu();\n\n if (!menu) {\n return;\n }\n\n this.focusMenu(menu);\n }\n\n focusMenu(menu: TMenuItem, active = true, scroll = true) {\n this.focusedMenu = menu;\n menu.active = active;\n\n if (scroll) {\n menu.scrollIntoView({ block: 'nearest' });\n }\n\n this.afterFocus(menu);\n }\n\n blurMenu() {\n if (!this.focusedMenu) {\n return;\n }\n\n this.focusedMenu.active = false;\n this.focusedMenu = null;\n this.afterBlur();\n }\n\n private selectActiveItem(event: KeyboardEvent) {\n if (!this.focusedMenu) {\n return;\n }\n\n event.preventDefault();\n this.focusedMenu.click();\n }\n\n protected afterFocus(_: TMenuItem) {}\n\n protected afterBlur() {}\n}\n"]}