@angular/cdk 14.0.0-next.10 → 14.0.0-next.13
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/a11y/index.d.ts +1119 -5
- package/accordion/index.d.ts +108 -6
- package/bidi/index.d.ts +77 -5
- package/clipboard/index.d.ts +112 -5
- package/coercion/index.d.ts +64 -5
- package/collections/index.d.ts +348 -5
- package/dialog/index.d.ts +410 -0
- package/drag-drop/index.d.ts +1456 -5
- package/esm2020/a11y/a11y-module.mjs +5 -5
- package/esm2020/a11y/aria-describer/aria-describer.mjs +4 -4
- package/esm2020/a11y/focus-monitor/focus-monitor.mjs +7 -7
- package/esm2020/a11y/focus-trap/configurable-focus-trap-factory.mjs +4 -4
- package/esm2020/a11y/focus-trap/focus-trap-manager.mjs +4 -4
- package/esm2020/a11y/focus-trap/focus-trap.mjs +7 -7
- package/esm2020/a11y/high-contrast-mode/high-contrast-mode-detector.mjs +4 -4
- package/esm2020/a11y/input-modality/input-modality-detector.mjs +4 -4
- package/esm2020/a11y/interactivity-checker/interactivity-checker.mjs +4 -4
- package/esm2020/a11y/live-announcer/live-announcer.mjs +7 -7
- package/esm2020/accordion/accordion-item.mjs +4 -4
- package/esm2020/accordion/accordion-module.mjs +5 -5
- package/esm2020/accordion/accordion.mjs +4 -4
- package/esm2020/bidi/bidi-module.mjs +5 -5
- package/esm2020/bidi/dir.mjs +4 -4
- package/esm2020/bidi/directionality.mjs +4 -4
- package/esm2020/clipboard/clipboard-module.mjs +5 -5
- package/esm2020/clipboard/clipboard.mjs +4 -4
- package/esm2020/clipboard/copy-to-clipboard.mjs +4 -4
- package/esm2020/collections/unique-selection-dispatcher.mjs +4 -4
- package/esm2020/dialog/dialog-config.mjs +63 -0
- package/esm2020/dialog/dialog-container.mjs +278 -0
- package/esm2020/dialog/dialog-injectors.mjs +26 -0
- package/esm2020/dialog/dialog-module.mjs +42 -0
- package/esm2020/dialog/dialog-ref.mjs +76 -0
- package/esm2020/dialog/dialog.mjs +298 -0
- package/esm2020/dialog/dialog_public_index.mjs +5 -0
- package/esm2020/dialog/index.mjs +9 -0
- package/esm2020/dialog/public-api.mjs +14 -0
- package/esm2020/drag-drop/directives/drag-handle.mjs +4 -4
- package/esm2020/drag-drop/directives/drag-placeholder.mjs +4 -4
- package/esm2020/drag-drop/directives/drag-preview.mjs +4 -4
- package/esm2020/drag-drop/directives/drag.mjs +11 -4
- package/esm2020/drag-drop/directives/drop-list-group.mjs +4 -4
- package/esm2020/drag-drop/directives/drop-list.mjs +4 -4
- package/esm2020/drag-drop/drag-drop-module.mjs +5 -5
- package/esm2020/drag-drop/drag-drop-registry.mjs +4 -4
- package/esm2020/drag-drop/drag-drop.mjs +4 -4
- package/esm2020/layout/breakpoints-observer.mjs +4 -4
- package/esm2020/layout/layout-module.mjs +5 -5
- package/esm2020/layout/media-matcher.mjs +4 -4
- package/esm2020/menu/context-menu-trigger.mjs +229 -0
- package/esm2020/menu/index.mjs +9 -0
- package/esm2020/menu/menu-aim.mjs +204 -0
- package/esm2020/menu/menu-bar.mjs +159 -0
- package/esm2020/menu/menu-base.mjs +203 -0
- package/esm2020/menu/menu-errors.mjs +22 -0
- package/esm2020/menu/menu-group.mjs +30 -0
- package/esm2020/menu/menu-interface.mjs +11 -0
- package/esm2020/menu/menu-item-checkbox.mjs +48 -0
- package/esm2020/menu/menu-item-radio.mjs +114 -0
- package/esm2020/menu/menu-item-selectable.mjs +42 -0
- package/esm2020/menu/menu-item.mjs +289 -0
- package/esm2020/menu/menu-module.mjs +62 -0
- package/esm2020/menu/menu-stack.mjs +156 -0
- package/esm2020/menu/menu-trigger-base.mjs +114 -0
- package/esm2020/menu/menu-trigger.mjs +304 -0
- package/esm2020/menu/menu.mjs +168 -0
- package/esm2020/menu/menu_public_index.mjs +5 -0
- package/esm2020/menu/pointer-focus-tracker.mjs +51 -0
- package/esm2020/menu/public-api.mjs +24 -0
- package/esm2020/observers/observe-content.mjs +14 -14
- package/esm2020/overlay/dispatchers/base-overlay-dispatcher.mjs +4 -4
- package/esm2020/overlay/dispatchers/overlay-keyboard-dispatcher.mjs +4 -4
- package/esm2020/overlay/dispatchers/overlay-outside-click-dispatcher.mjs +4 -4
- package/esm2020/overlay/fullscreen-overlay-container.mjs +4 -4
- package/esm2020/overlay/overlay-container.mjs +4 -4
- package/esm2020/overlay/overlay-directives.mjs +7 -7
- package/esm2020/overlay/overlay-module.mjs +5 -5
- package/esm2020/overlay/overlay-ref.mjs +4 -3
- package/esm2020/overlay/overlay.mjs +4 -4
- package/esm2020/overlay/position/overlay-position-builder.mjs +4 -4
- package/esm2020/overlay/scroll/scroll-strategy-options.mjs +4 -4
- package/esm2020/platform/platform-module.mjs +5 -5
- package/esm2020/platform/platform.mjs +4 -4
- package/esm2020/portal/dom-portal-outlet.mjs +6 -2
- package/esm2020/portal/portal-directives.mjs +17 -17
- package/esm2020/scrolling/fixed-size-virtual-scroll.mjs +4 -4
- package/esm2020/scrolling/scroll-dispatcher.mjs +4 -4
- package/esm2020/scrolling/scrollable.mjs +4 -4
- package/esm2020/scrolling/scrolling-module.mjs +9 -9
- package/esm2020/scrolling/viewport-ruler.mjs +4 -4
- package/esm2020/scrolling/virtual-for-of.mjs +4 -4
- package/esm2020/scrolling/virtual-scroll-viewport.mjs +4 -4
- package/esm2020/stepper/step-header.mjs +4 -4
- package/esm2020/stepper/step-label.mjs +4 -4
- package/esm2020/stepper/stepper-button.mjs +7 -7
- package/esm2020/stepper/stepper-module.mjs +5 -5
- package/esm2020/stepper/stepper.mjs +7 -7
- package/esm2020/table/cell.mjs +22 -22
- package/esm2020/table/coalesced-style-scheduler.mjs +4 -4
- package/esm2020/table/row.mjs +28 -28
- package/esm2020/table/table-module.mjs +5 -5
- package/esm2020/table/table.mjs +20 -20
- package/esm2020/table/text-column.mjs +5 -5
- package/esm2020/testing/selenium-webdriver/selenium-web-driver-harness-environment.mjs +1 -1
- package/esm2020/testing/test-element.mjs +1 -1
- package/esm2020/text-field/autofill.mjs +7 -7
- package/esm2020/text-field/autosize.mjs +4 -4
- package/esm2020/text-field/text-field-module.mjs +5 -5
- package/esm2020/tree/nested-node.mjs +4 -4
- package/esm2020/tree/node.mjs +4 -4
- package/esm2020/tree/outlet.mjs +4 -4
- package/esm2020/tree/padding.mjs +4 -4
- package/esm2020/tree/toggle.mjs +4 -4
- package/esm2020/tree/tree-module.mjs +5 -5
- package/esm2020/tree/tree.mjs +7 -7
- package/esm2020/version.mjs +1 -1
- package/fesm2015/a11y.mjs +40 -40
- package/fesm2015/a11y.mjs.map +1 -1
- package/fesm2015/accordion.mjs +10 -10
- package/fesm2015/accordion.mjs.map +1 -1
- package/fesm2015/bidi.mjs +10 -10
- package/fesm2015/bidi.mjs.map +1 -1
- package/fesm2015/cdk.mjs +1 -1
- package/fesm2015/cdk.mjs.map +1 -1
- package/fesm2015/clipboard.mjs +10 -10
- package/fesm2015/clipboard.mjs.map +1 -1
- package/fesm2015/collections.mjs +3 -3
- package/fesm2015/collections.mjs.map +1 -1
- package/fesm2015/dialog.mjs +780 -0
- package/fesm2015/dialog.mjs.map +1 -0
- package/fesm2015/drag-drop.mjs +35 -28
- package/fesm2015/drag-drop.mjs.map +1 -1
- package/fesm2015/layout.mjs +10 -10
- package/fesm2015/layout.mjs.map +1 -1
- package/fesm2015/menu.mjs +2135 -0
- package/fesm2015/menu.mjs.map +1 -0
- package/fesm2015/observers.mjs +13 -13
- package/fesm2015/observers.mjs.map +1 -1
- package/fesm2015/overlay.mjs +37 -36
- package/fesm2015/overlay.mjs.map +1 -1
- package/fesm2015/platform.mjs +7 -7
- package/fesm2015/platform.mjs.map +1 -1
- package/fesm2015/portal.mjs +21 -17
- package/fesm2015/portal.mjs.map +1 -1
- package/fesm2015/scrolling.mjs +26 -26
- package/fesm2015/scrolling.mjs.map +1 -1
- package/fesm2015/stepper.mjs +22 -22
- package/fesm2015/stepper.mjs.map +1 -1
- package/fesm2015/table.mjs +78 -78
- package/fesm2015/table.mjs.map +1 -1
- package/fesm2015/testing/selenium-webdriver.mjs.map +1 -1
- package/fesm2015/testing.mjs.map +1 -1
- package/fesm2015/text-field.mjs +13 -13
- package/fesm2015/text-field.mjs.map +1 -1
- package/fesm2015/tree.mjs +25 -25
- package/fesm2015/tree.mjs.map +1 -1
- package/fesm2020/a11y.mjs +40 -40
- package/fesm2020/a11y.mjs.map +1 -1
- package/fesm2020/accordion.mjs +10 -10
- package/fesm2020/accordion.mjs.map +1 -1
- package/fesm2020/bidi.mjs +10 -10
- package/fesm2020/bidi.mjs.map +1 -1
- package/fesm2020/cdk.mjs +1 -1
- package/fesm2020/cdk.mjs.map +1 -1
- package/fesm2020/clipboard.mjs +10 -10
- package/fesm2020/clipboard.mjs.map +1 -1
- package/fesm2020/collections.mjs +3 -3
- package/fesm2020/collections.mjs.map +1 -1
- package/fesm2020/dialog.mjs +784 -0
- package/fesm2020/dialog.mjs.map +1 -0
- package/fesm2020/drag-drop.mjs +35 -28
- package/fesm2020/drag-drop.mjs.map +1 -1
- package/fesm2020/layout.mjs +10 -10
- package/fesm2020/layout.mjs.map +1 -1
- package/fesm2020/menu.mjs +2108 -0
- package/fesm2020/menu.mjs.map +1 -0
- package/fesm2020/observers.mjs +13 -13
- package/fesm2020/observers.mjs.map +1 -1
- package/fesm2020/overlay.mjs +37 -36
- package/fesm2020/overlay.mjs.map +1 -1
- package/fesm2020/platform.mjs +7 -7
- package/fesm2020/platform.mjs.map +1 -1
- package/fesm2020/portal.mjs +21 -17
- package/fesm2020/portal.mjs.map +1 -1
- package/fesm2020/scrolling.mjs +26 -26
- package/fesm2020/scrolling.mjs.map +1 -1
- package/fesm2020/stepper.mjs +22 -22
- package/fesm2020/stepper.mjs.map +1 -1
- package/fesm2020/table.mjs +78 -78
- package/fesm2020/table.mjs.map +1 -1
- package/fesm2020/testing/selenium-webdriver.mjs.map +1 -1
- package/fesm2020/testing.mjs.map +1 -1
- package/fesm2020/text-field.mjs +13 -13
- package/fesm2020/text-field.mjs.map +1 -1
- package/fesm2020/tree.mjs +25 -25
- package/fesm2020/tree.mjs.map +1 -1
- package/index.d.ts +6 -8
- package/keycodes/index.d.ts +247 -6
- package/layout/index.d.ts +91 -8
- package/menu/index.d.ts +992 -0
- package/observers/index.d.ts +89 -6
- package/overlay/index.d.ts +1202 -5
- package/package.json +34 -18
- package/platform/index.d.ts +104 -6
- package/portal/index.d.ts +325 -5
- package/schematics/ng-add/index.js +1 -1
- package/schematics/ng-add/index.mjs +1 -1
- package/schematics/utils/build-component.js +2 -2
- package/schematics/utils/build-component.mjs +2 -2
- package/schematics/utils/schematic-options.js +2 -2
- package/schematics/utils/schematic-options.mjs +2 -2
- package/scrolling/index.d.ts +647 -6
- package/stepper/index.d.ts +328 -6
- package/table/index.d.ts +1172 -5
- package/testing/index.d.ts +726 -5
- package/testing/selenium-webdriver/index.d.ts +134 -8
- package/testing/testbed/index.d.ts +161 -8
- package/text-field/index.d.ts +175 -6
- package/tree/index.d.ts +498 -6
- package/a11y/a11y-module.d.ts +0 -12
- package/a11y/a11y_public_index.d.ts +0 -4
- package/a11y/aria-describer/aria-describer.d.ts +0 -101
- package/a11y/aria-describer/aria-reference.d.ts +0 -22
- package/a11y/fake-event-detection.d.ts +0 -11
- package/a11y/focus-monitor/focus-monitor.d.ts +0 -209
- package/a11y/focus-trap/configurable-focus-trap-config.d.ts +0 -16
- package/a11y/focus-trap/configurable-focus-trap-factory.d.ts +0 -30
- package/a11y/focus-trap/configurable-focus-trap.d.ts +0 -33
- package/a11y/focus-trap/event-listener-inert-strategy.d.ts +0 -29
- package/a11y/focus-trap/focus-trap-inert-strategy.d.ts +0 -21
- package/a11y/focus-trap/focus-trap-manager.d.ts +0 -26
- package/a11y/focus-trap/focus-trap.d.ts +0 -163
- package/a11y/high-contrast-mode/high-contrast-mode-detector.d.ts +0 -48
- package/a11y/input-modality/input-modality-detector.d.ts +0 -99
- package/a11y/interactivity-checker/interactivity-checker.d.ts +0 -60
- package/a11y/key-manager/activedescendant-key-manager.d.ts +0 -35
- package/a11y/key-manager/focus-key-manager.d.ts +0 -37
- package/a11y/key-manager/list-key-manager.d.ts +0 -152
- package/a11y/live-announcer/live-announcer-tokens.d.ts +0 -22
- package/a11y/live-announcer/live-announcer.d.ts +0 -85
- package/a11y/package.json +0 -9
- package/a11y/public-api.d.ts +0 -25
- package/accordion/accordion-item.d.ts +0 -59
- package/accordion/accordion-module.d.ts +0 -8
- package/accordion/accordion.d.ts +0 -40
- package/accordion/accordion_public_index.d.ts +0 -4
- package/accordion/package.json +0 -9
- package/accordion/public-api.d.ts +0 -10
- package/bidi/bidi-module.d.ts +0 -7
- package/bidi/bidi_public_index.d.ts +0 -4
- package/bidi/dir-document-token.d.ts +0 -26
- package/bidi/dir.d.ts +0 -36
- package/bidi/directionality.d.ts +0 -26
- package/bidi/package.json +0 -9
- package/bidi/public-api.d.ts +0 -11
- package/clipboard/clipboard-module.d.ts +0 -7
- package/clipboard/clipboard.d.ts +0 -28
- package/clipboard/clipboard_public_index.d.ts +0 -4
- package/clipboard/copy-to-clipboard.d.ts +0 -49
- package/clipboard/package.json +0 -9
- package/clipboard/pending-copy.d.ts +0 -29
- package/clipboard/public-api.d.ts +0 -11
- package/coercion/array.d.ts +0 -10
- package/coercion/boolean-property.d.ts +0 -14
- package/coercion/css-pixel-value.d.ts +0 -9
- package/coercion/element.d.ts +0 -13
- package/coercion/number-property.d.ts +0 -20
- package/coercion/package.json +0 -9
- package/coercion/public-api.d.ts +0 -13
- package/coercion/string-array.d.ts +0 -25
- package/collections/array-data-source.d.ts +0 -16
- package/collections/collection-viewer.d.ts +0 -24
- package/collections/collections_public_index.d.ts +0 -4
- package/collections/data-source.d.ts +0 -30
- package/collections/dispose-view-repeater-strategy.d.ts +0 -22
- package/collections/package.json +0 -9
- package/collections/public-api.d.ts +0 -16
- package/collections/recycle-view-repeater-strategy.d.ts +0 -54
- package/collections/selection-model.d.ts +0 -95
- package/collections/tree-adapter.d.ts +0 -26
- package/collections/unique-selection-dispatcher.d.ts +0 -36
- package/collections/view-repeater.d.ts +0 -92
- package/drag-drop/client-rect.d.ts +0 -38
- package/drag-drop/clone-node.d.ts +0 -9
- package/drag-drop/directives/assertions.d.ts +0 -13
- package/drag-drop/directives/config.d.ts +0 -43
- package/drag-drop/directives/drag-handle.d.ts +0 -33
- package/drag-drop/directives/drag-placeholder.d.ts +0 -27
- package/drag-drop/directives/drag-preview.d.ts +0 -32
- package/drag-drop/directives/drag.d.ts +0 -160
- package/drag-drop/directives/drop-list-group.d.ts +0 -33
- package/drag-drop/directives/drop-list.d.ts +0 -123
- package/drag-drop/drag-drop-module.d.ts +0 -13
- package/drag-drop/drag-drop-registry.d.ts +0 -89
- package/drag-drop/drag-drop.d.ts +0 -36
- package/drag-drop/drag-drop_public_index.d.ts +0 -4
- package/drag-drop/drag-events.d.ts +0 -124
- package/drag-drop/drag-parent.d.ts +0 -15
- package/drag-drop/drag-ref.d.ts +0 -448
- package/drag-drop/drag-styling.d.ts +0 -42
- package/drag-drop/drag-utils.d.ts +0 -32
- package/drag-drop/drop-list-ref.d.ts +0 -312
- package/drag-drop/package.json +0 -9
- package/drag-drop/parent-position-tracker.d.ts +0 -39
- package/drag-drop/public-api.d.ts +0 -22
- package/drag-drop/transition-duration.d.ts +0 -9
- package/keycodes/keycodes.d.ts +0 -126
- package/keycodes/keycodes_public_index.d.ts +0 -4
- package/keycodes/modifiers.d.ts +0 -14
- package/keycodes/package.json +0 -9
- package/keycodes/public-api.d.ts +0 -9
- package/layout/breakpoints-observer.d.ts +0 -45
- package/layout/breakpoints.d.ts +0 -23
- package/layout/layout-module.d.ts +0 -6
- package/layout/layout_public_index.d.ts +0 -4
- package/layout/media-matcher.d.ts +0 -18
- package/layout/package.json +0 -9
- package/layout/public-api.d.ts +0 -11
- package/observers/observe-content.d.ts +0 -87
- package/observers/observers_public_index.d.ts +0 -4
- package/observers/package.json +0 -9
- package/observers/public-api.d.ts +0 -8
- package/overlay/dispatchers/base-overlay-dispatcher.d.ts +0 -24
- package/overlay/dispatchers/index.d.ts +0 -9
- package/overlay/dispatchers/overlay-keyboard-dispatcher.d.ts +0 -24
- package/overlay/dispatchers/overlay-outside-click-dispatcher.d.ts +0 -32
- package/overlay/fullscreen-overlay-container.d.ts +0 -35
- package/overlay/overlay-config.d.ts +0 -47
- package/overlay/overlay-container.d.ts +0 -25
- package/overlay/overlay-directives.d.ts +0 -148
- package/overlay/overlay-module.d.ts +0 -10
- package/overlay/overlay-ref.d.ts +0 -145
- package/overlay/overlay-reference.d.ts +0 -38
- package/overlay/overlay.d.ts +0 -76
- package/overlay/overlay_public_index.d.ts +0 -4
- package/overlay/package.json +0 -9
- package/overlay/position/connected-position.d.ts +0 -102
- package/overlay/position/flexible-connected-position-strategy.d.ts +0 -282
- package/overlay/position/global-position-strategy.d.ts +0 -99
- package/overlay/position/overlay-position-builder.d.ts +0 -32
- package/overlay/position/position-strategy.d.ts +0 -19
- package/overlay/position/scroll-clip.d.ts +0 -26
- package/overlay/public-api.d.ts +0 -23
- package/overlay/scroll/block-scroll-strategy.d.ts +0 -27
- package/overlay/scroll/close-scroll-strategy.d.ts +0 -40
- package/overlay/scroll/index.d.ts +0 -14
- package/overlay/scroll/noop-scroll-strategy.d.ts +0 -17
- package/overlay/scroll/reposition-scroll-strategy.d.ts +0 -39
- package/overlay/scroll/scroll-strategy-options.d.ts +0 -44
- package/overlay/scroll/scroll-strategy.d.ts +0 -25
- package/platform/features/input-types.d.ts +0 -9
- package/platform/features/passive-listeners.d.ts +0 -19
- package/platform/features/scrolling.d.ts +0 -32
- package/platform/features/shadow-dom.d.ts +0 -18
- package/platform/features/test-environment.d.ts +0 -9
- package/platform/package.json +0 -9
- package/platform/platform-module.d.ts +0 -6
- package/platform/platform.d.ts +0 -29
- package/platform/platform_public_index.d.ts +0 -4
- package/platform/public-api.d.ts +0 -14
- package/portal/dom-portal-outlet.d.ts +0 -71
- package/portal/package.json +0 -9
- package/portal/portal-directives.d.ts +0 -99
- package/portal/portal-errors.d.ts +0 -37
- package/portal/portal-injector.d.ts +0 -21
- package/portal/portal.d.ts +0 -140
- package/portal/portal_public_index.d.ts +0 -4
- package/portal/public-api.d.ts +0 -11
- package/public-api.d.ts +0 -8
- package/scrolling/fixed-size-virtual-scroll.d.ts +0 -97
- package/scrolling/package.json +0 -9
- package/scrolling/public-api.d.ts +0 -16
- package/scrolling/scroll-dispatcher.d.ts +0 -71
- package/scrolling/scrollable.d.ts +0 -85
- package/scrolling/scrolling-module.d.ts +0 -19
- package/scrolling/scrolling_public_index.d.ts +0 -4
- package/scrolling/viewport-ruler.d.ts +0 -63
- package/scrolling/virtual-for-of.d.ts +0 -117
- package/scrolling/virtual-scroll-repeater.d.ts +0 -16
- package/scrolling/virtual-scroll-strategy.d.ts +0 -38
- package/scrolling/virtual-scroll-viewport.d.ts +0 -147
- package/stepper/package.json +0 -9
- package/stepper/public-api.d.ts +0 -12
- package/stepper/step-header.d.ts +0 -18
- package/stepper/step-label.d.ts +0 -15
- package/stepper/stepper-button.d.ts +0 -20
- package/stepper/stepper-module.d.ts +0 -11
- package/stepper/stepper.d.ts +0 -233
- package/stepper/stepper_public_index.d.ts +0 -4
- package/table/can-stick.d.ts +0 -34
- package/table/cell.d.ts +0 -126
- package/table/coalesced-style-scheduler.d.ts +0 -46
- package/table/package.json +0 -9
- package/table/public-api.d.ts +0 -19
- package/table/row.d.ts +0 -175
- package/table/sticky-position-listener.d.ts +0 -31
- package/table/sticky-styler.d.ts +0 -126
- package/table/table-errors.d.ts +0 -48
- package/table/table-module.d.ts +0 -11
- package/table/table.d.ts +0 -494
- package/table/table_public_index.d.ts +0 -4
- package/table/text-column.d.ts +0 -73
- package/table/tokens.d.ts +0 -25
- package/testing/change-detection.d.ts +0 -83
- package/testing/component-harness.d.ts +0 -426
- package/testing/element-dimensions.d.ts +0 -16
- package/testing/harness-environment.d.ts +0 -62
- package/testing/package.json +0 -9
- package/testing/public-api.d.ts +0 -14
- package/testing/selenium-webdriver/package.json +0 -9
- package/testing/selenium-webdriver/public-api.d.ts +0 -9
- package/testing/selenium-webdriver/selenium-web-driver-element.d.ts +0 -91
- package/testing/selenium-webdriver/selenium-web-driver-harness-environment.d.ts +0 -66
- package/testing/selenium-webdriver/selenium-webdriver-keys.d.ts +0 -46
- package/testing/test-element-errors.d.ts +0 -12
- package/testing/test-element.d.ts +0 -135
- package/testing/testbed/fake-events/dispatch-events.d.ts +0 -39
- package/testing/testbed/fake-events/element-focus.d.ts +0 -18
- package/testing/testbed/fake-events/event-objects.d.ts +0 -39
- package/testing/testbed/fake-events/index.d.ts +0 -11
- package/testing/testbed/fake-events/type-in-element.d.ts +0 -41
- package/testing/testbed/package.json +0 -9
- package/testing/testbed/proxy-zone-types.d.ts +0 -29
- package/testing/testbed/public-api.d.ts +0 -9
- package/testing/testbed/task-state-zone-interceptor.d.ts +0 -37
- package/testing/testbed/testbed-harness-environment.d.ts +0 -64
- package/testing/testbed/unit-test-element.d.ts +0 -98
- package/testing/testbed/zone-types.d.ts +0 -22
- package/testing/text-filtering.d.ts +0 -13
- package/text-field/autofill.d.ts +0 -66
- package/text-field/autosize.d.ts +0 -95
- package/text-field/package.json +0 -9
- package/text-field/public-api.d.ts +0 -10
- package/text-field/text-field-module.d.ts +0 -8
- package/text-field/text-field_public_index.d.ts +0 -4
- package/tree/control/base-tree-control.d.ts +0 -54
- package/tree/control/flat-tree-control.d.ts +0 -34
- package/tree/control/nested-tree-control.d.ts +0 -31
- package/tree/control/tree-control.d.ts +0 -49
- package/tree/nested-node.d.ts +0 -38
- package/tree/node.d.ts +0 -40
- package/tree/outlet.d.ts +0 -26
- package/tree/package.json +0 -9
- package/tree/padding.d.ts +0 -60
- package/tree/public-api.d.ts +0 -19
- package/tree/toggle.d.ts +0 -25
- package/tree/tree-errors.d.ts +0 -32
- package/tree/tree-module.d.ts +0 -12
- package/tree/tree.d.ts +0 -128
- package/tree/tree_public_index.d.ts +0 -4
- package/version.d.ts +0 -10
|
@@ -0,0 +1,204 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright Google LLC All Rights Reserved.
|
|
4
|
+
*
|
|
5
|
+
* Use of this source code is governed by an MIT-style license that can be
|
|
6
|
+
* found in the LICENSE file at https://angular.io/license
|
|
7
|
+
*/
|
|
8
|
+
import { Injectable, NgZone, InjectionToken, Directive } from '@angular/core';
|
|
9
|
+
import { fromEvent, Subject } from 'rxjs';
|
|
10
|
+
import { takeUntil, filter } from 'rxjs/operators';
|
|
11
|
+
import { throwMissingPointerFocusTracker, throwMissingMenuReference } from './menu-errors';
|
|
12
|
+
import * as i0 from "@angular/core";
|
|
13
|
+
/** Injection token used for an implementation of MenuAim. */
|
|
14
|
+
export const MENU_AIM = new InjectionToken('cdk-menu-aim');
|
|
15
|
+
/** Capture every nth mouse move event. */
|
|
16
|
+
const MOUSE_MOVE_SAMPLE_FREQUENCY = 3;
|
|
17
|
+
/** The number of mouse move events to track. */
|
|
18
|
+
const NUM_POINTS = 5;
|
|
19
|
+
/**
|
|
20
|
+
* How long to wait before closing a sibling menu if a user stops short of the submenu they were
|
|
21
|
+
* predicted to go into.
|
|
22
|
+
*/
|
|
23
|
+
const CLOSE_DELAY = 300;
|
|
24
|
+
/** Calculate the slope between point a and b. */
|
|
25
|
+
function getSlope(a, b) {
|
|
26
|
+
return (b.y - a.y) / (b.x - a.x);
|
|
27
|
+
}
|
|
28
|
+
/** Calculate the y intercept for the given point and slope. */
|
|
29
|
+
function getYIntercept(point, slope) {
|
|
30
|
+
return point.y - slope * point.x;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Whether the given mouse trajectory line defined by the slope and y intercept falls within the
|
|
34
|
+
* submenu as defined by `submenuPoints`
|
|
35
|
+
* @param submenuPoints the submenu DOMRect points.
|
|
36
|
+
* @param m the slope of the trajectory line.
|
|
37
|
+
* @param b the y intercept of the trajectory line.
|
|
38
|
+
* @return true if any point on the line falls within the submenu.
|
|
39
|
+
*/
|
|
40
|
+
function isWithinSubmenu(submenuPoints, m, b) {
|
|
41
|
+
const { left, right, top, bottom } = submenuPoints;
|
|
42
|
+
// Check for intersection with each edge of the submenu (left, right, top, bottom)
|
|
43
|
+
// by fixing one coordinate to that edge's coordinate (either x or y) and checking if the
|
|
44
|
+
// other coordinate is within bounds.
|
|
45
|
+
return ((m * left + b >= top && m * left + b <= bottom) ||
|
|
46
|
+
(m * right + b >= top && m * right + b <= bottom) ||
|
|
47
|
+
((top - b) / m >= left && (top - b) / m <= right) ||
|
|
48
|
+
((bottom - b) / m >= left && (bottom - b) / m <= right));
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* TargetMenuAim predicts if a user is moving into a submenu. It calculates the
|
|
52
|
+
* trajectory of the user's mouse movement in the current menu to determine if the
|
|
53
|
+
* mouse is moving towards an open submenu.
|
|
54
|
+
*
|
|
55
|
+
* The determination is made by calculating the slope of the users last NUM_POINTS moves where each
|
|
56
|
+
* pair of points determines if the trajectory line points into the submenu. It uses consensus
|
|
57
|
+
* approach by checking if at least NUM_POINTS / 2 pairs determine that the user is moving towards
|
|
58
|
+
* to submenu.
|
|
59
|
+
*/
|
|
60
|
+
export class TargetMenuAim {
|
|
61
|
+
constructor(
|
|
62
|
+
/** The Angular zone. */
|
|
63
|
+
_ngZone) {
|
|
64
|
+
this._ngZone = _ngZone;
|
|
65
|
+
/** The last NUM_POINTS mouse move events. */
|
|
66
|
+
this._points = [];
|
|
67
|
+
/** Emits when this service is destroyed. */
|
|
68
|
+
this._destroyed = new Subject();
|
|
69
|
+
}
|
|
70
|
+
ngOnDestroy() {
|
|
71
|
+
this._destroyed.next();
|
|
72
|
+
this._destroyed.complete();
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Set the Menu and its PointerFocusTracker.
|
|
76
|
+
* @param menu The menu that this menu aim service controls.
|
|
77
|
+
* @param pointerTracker The `PointerFocusTracker` for the given menu.
|
|
78
|
+
*/
|
|
79
|
+
initialize(menu, pointerTracker) {
|
|
80
|
+
this._menu = menu;
|
|
81
|
+
this._pointerTracker = pointerTracker;
|
|
82
|
+
this._subscribeToMouseMoves();
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Calls the `doToggle` callback when it is deemed that the user is not moving towards
|
|
86
|
+
* the submenu.
|
|
87
|
+
* @param doToggle the function called when the user is not moving towards the submenu.
|
|
88
|
+
*/
|
|
89
|
+
toggle(doToggle) {
|
|
90
|
+
// If the menu is horizontal the sub-menus open below and there is no risk of premature
|
|
91
|
+
// closing of any sub-menus therefore we automatically resolve the callback.
|
|
92
|
+
if (this._menu.orientation === 'horizontal') {
|
|
93
|
+
doToggle();
|
|
94
|
+
}
|
|
95
|
+
this._checkConfigured();
|
|
96
|
+
const siblingItemIsWaiting = !!this._timeoutId;
|
|
97
|
+
const hasPoints = this._points.length > 1;
|
|
98
|
+
if (hasPoints && !siblingItemIsWaiting) {
|
|
99
|
+
if (this._isMovingToSubmenu()) {
|
|
100
|
+
this._startTimeout(doToggle);
|
|
101
|
+
}
|
|
102
|
+
else {
|
|
103
|
+
doToggle();
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
else if (!siblingItemIsWaiting) {
|
|
107
|
+
doToggle();
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* Start the delayed toggle handler if one isn't running already.
|
|
112
|
+
*
|
|
113
|
+
* The delayed toggle handler executes the `doToggle` callback after some period of time iff the
|
|
114
|
+
* users mouse is on an item in the current menu.
|
|
115
|
+
*
|
|
116
|
+
* @param doToggle the function called when the user is not moving towards the submenu.
|
|
117
|
+
*/
|
|
118
|
+
_startTimeout(doToggle) {
|
|
119
|
+
// If the users mouse is moving towards a submenu we don't want to immediately resolve.
|
|
120
|
+
// Wait for some period of time before determining if the previous menu should close in
|
|
121
|
+
// cases where the user may have moved towards the submenu but stopped on a sibling menu
|
|
122
|
+
// item intentionally.
|
|
123
|
+
const timeoutId = setTimeout(() => {
|
|
124
|
+
// Resolve if the user is currently moused over some element in the root menu
|
|
125
|
+
if (this._pointerTracker.activeElement && timeoutId === this._timeoutId) {
|
|
126
|
+
doToggle();
|
|
127
|
+
}
|
|
128
|
+
this._timeoutId = null;
|
|
129
|
+
}, CLOSE_DELAY);
|
|
130
|
+
this._timeoutId = timeoutId;
|
|
131
|
+
}
|
|
132
|
+
/** Whether the user is heading towards the open submenu. */
|
|
133
|
+
_isMovingToSubmenu() {
|
|
134
|
+
const submenuPoints = this._getSubmenuBounds();
|
|
135
|
+
if (!submenuPoints) {
|
|
136
|
+
return false;
|
|
137
|
+
}
|
|
138
|
+
let numMoving = 0;
|
|
139
|
+
const currPoint = this._points[this._points.length - 1];
|
|
140
|
+
// start from the second last point and calculate the slope between each point and the last
|
|
141
|
+
// point.
|
|
142
|
+
for (let i = this._points.length - 2; i >= 0; i--) {
|
|
143
|
+
const previous = this._points[i];
|
|
144
|
+
const slope = getSlope(currPoint, previous);
|
|
145
|
+
if (isWithinSubmenu(submenuPoints, slope, getYIntercept(currPoint, slope))) {
|
|
146
|
+
numMoving++;
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
return numMoving >= Math.floor(NUM_POINTS / 2);
|
|
150
|
+
}
|
|
151
|
+
/** Get the bounding DOMRect for the open submenu. */
|
|
152
|
+
_getSubmenuBounds() {
|
|
153
|
+
return this._pointerTracker?.previousElement?.getMenu()?.nativeElement.getBoundingClientRect();
|
|
154
|
+
}
|
|
155
|
+
/**
|
|
156
|
+
* Check if a reference to the PointerFocusTracker and menu element is provided.
|
|
157
|
+
* @throws an error if neither reference is provided.
|
|
158
|
+
*/
|
|
159
|
+
_checkConfigured() {
|
|
160
|
+
if (typeof ngDevMode === 'undefined' || ngDevMode) {
|
|
161
|
+
if (!this._pointerTracker) {
|
|
162
|
+
throwMissingPointerFocusTracker();
|
|
163
|
+
}
|
|
164
|
+
if (!this._menu) {
|
|
165
|
+
throwMissingMenuReference();
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
/** Subscribe to the root menus mouse move events and update the tracked mouse points. */
|
|
170
|
+
_subscribeToMouseMoves() {
|
|
171
|
+
this._ngZone.runOutsideAngular(() => {
|
|
172
|
+
fromEvent(this._menu.nativeElement, 'mousemove')
|
|
173
|
+
.pipe(filter((_, index) => index % MOUSE_MOVE_SAMPLE_FREQUENCY === 0), takeUntil(this._destroyed))
|
|
174
|
+
.subscribe((event) => {
|
|
175
|
+
this._points.push({ x: event.clientX, y: event.clientY });
|
|
176
|
+
if (this._points.length > NUM_POINTS) {
|
|
177
|
+
this._points.shift();
|
|
178
|
+
}
|
|
179
|
+
});
|
|
180
|
+
});
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
TargetMenuAim.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.0.0-next.15", ngImport: i0, type: TargetMenuAim, deps: [{ token: i0.NgZone }], target: i0.ɵɵFactoryTarget.Injectable });
|
|
184
|
+
TargetMenuAim.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "14.0.0-next.15", ngImport: i0, type: TargetMenuAim });
|
|
185
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.0-next.15", ngImport: i0, type: TargetMenuAim, decorators: [{
|
|
186
|
+
type: Injectable
|
|
187
|
+
}], ctorParameters: function () { return [{ type: i0.NgZone }]; } });
|
|
188
|
+
/**
|
|
189
|
+
* CdkTargetMenuAim is a provider for the TargetMenuAim service. It can be added to an
|
|
190
|
+
* element with either the `cdkMenu` or `cdkMenuBar` directive and child menu items.
|
|
191
|
+
*/
|
|
192
|
+
export class CdkTargetMenuAim {
|
|
193
|
+
}
|
|
194
|
+
CdkTargetMenuAim.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.0.0-next.15", ngImport: i0, type: CdkTargetMenuAim, deps: [], target: i0.ɵɵFactoryTarget.Directive });
|
|
195
|
+
CdkTargetMenuAim.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "12.0.0", version: "14.0.0-next.15", type: CdkTargetMenuAim, selector: "[cdkTargetMenuAim]", providers: [{ provide: MENU_AIM, useClass: TargetMenuAim }], exportAs: ["cdkTargetMenuAim"], ngImport: i0 });
|
|
196
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.0-next.15", ngImport: i0, type: CdkTargetMenuAim, decorators: [{
|
|
197
|
+
type: Directive,
|
|
198
|
+
args: [{
|
|
199
|
+
selector: '[cdkTargetMenuAim]',
|
|
200
|
+
exportAs: 'cdkTargetMenuAim',
|
|
201
|
+
providers: [{ provide: MENU_AIM, useClass: TargetMenuAim }],
|
|
202
|
+
}]
|
|
203
|
+
}] });
|
|
204
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVudS1haW0uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvY2RrL21lbnUvbWVudS1haW0udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7OztHQU1HO0FBRUgsT0FBTyxFQUFDLFVBQVUsRUFBRSxNQUFNLEVBQWEsY0FBYyxFQUFFLFNBQVMsRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUN2RixPQUFPLEVBQUMsU0FBUyxFQUFFLE9BQU8sRUFBQyxNQUFNLE1BQU0sQ0FBQztBQUN4QyxPQUFPLEVBQUMsU0FBUyxFQUFFLE1BQU0sRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBR2pELE9BQU8sRUFBQywrQkFBK0IsRUFBRSx5QkFBeUIsRUFBQyxNQUFNLGVBQWUsQ0FBQzs7QUF1QnpGLDZEQUE2RDtBQUM3RCxNQUFNLENBQUMsTUFBTSxRQUFRLEdBQUcsSUFBSSxjQUFjLENBQVUsY0FBYyxDQUFDLENBQUM7QUFFcEUsMENBQTBDO0FBQzFDLE1BQU0sMkJBQTJCLEdBQUcsQ0FBQyxDQUFDO0FBRXRDLGdEQUFnRDtBQUNoRCxNQUFNLFVBQVUsR0FBRyxDQUFDLENBQUM7QUFFckI7OztHQUdHO0FBQ0gsTUFBTSxXQUFXLEdBQUcsR0FBRyxDQUFDO0FBUXhCLGlEQUFpRDtBQUNqRCxTQUFTLFFBQVEsQ0FBQyxDQUFRLEVBQUUsQ0FBUTtJQUNsQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNuQyxDQUFDO0FBRUQsK0RBQStEO0FBQy9ELFNBQVMsYUFBYSxDQUFDLEtBQVksRUFBRSxLQUFhO0lBQ2hELE9BQU8sS0FBSyxDQUFDLENBQUMsR0FBRyxLQUFLLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQztBQUNuQyxDQUFDO0FBS0Q7Ozs7Ozs7R0FPRztBQUNILFNBQVMs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QUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxhQUFhLEVBQUMsQ0FBQzttR0FFOUMsZ0JBQWdCO2tCQUw1QixTQUFTO21CQUFDO29CQUNULFFBQVEsRUFBRSxvQkFBb0I7b0JBQzlCLFFBQVEsRUFBRSxrQkFBa0I7b0JBQzVCLFNBQVMsRUFBRSxDQUFDLEVBQUMsT0FBTyxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsYUFBYSxFQUFDLENBQUM7aUJBQzFEIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZVxuICovXG5cbmltcG9ydCB7SW5qZWN0YWJsZSwgTmdab25lLCBPbkRlc3Ryb3ksIEluamVjdGlvblRva2VuLCBEaXJlY3RpdmV9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtmcm9tRXZlbnQsIFN1YmplY3R9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHt0YWtlVW50aWwsIGZpbHRlcn0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHtQb2ludGVyRm9jdXNUcmFja2VyLCBGb2N1c2FibGVFbGVtZW50fSBmcm9tICcuL3BvaW50ZXItZm9jdXMtdHJhY2tlcic7XG5pbXBvcnQge01lbnV9IGZyb20gJy4vbWVudS1pbnRlcmZhY2UnO1xuaW1wb3J0IHt0aHJvd01pc3NpbmdQb2ludGVyRm9jdXNUcmFja2VyLCB0aHJvd01pc3NpbmdNZW51UmVmZXJlbmNlfSBmcm9tICcuL21lbnUtZXJyb3JzJztcblxuLyoqXG4gKiBNZW51QWltIGlzIHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyBpZiBhIHNpYmxpbmcgbWVudWl0ZW0ncyBtZW51IHNob3VsZCBiZSBjbG9zZWQgd2hlbiBhXG4gKiBUb2dnbGVyIGl0ZW0gaXMgaG92ZXJlZCBpbnRvLiBJdCBpcyB1cCB0byB0aGUgaG92ZXJlZCBpbiBpdGVtIHRvIGNhbGwgdGhlIE1lbnVBaW0gc2VydmljZSBpblxuICogb3JkZXIgdG8gZGV0ZXJtaW5lIGlmIGl0IG1heSBwZXJmb3JtIGl0cyBjbG9zZSBhY3Rpb25zLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIE1lbnVBaW0ge1xuICAvKipcbiAgICogU2V0IHRoZSBNZW51IGFuZCBpdHMgUG9pbnRlckZvY3VzVHJhY2tlci5cbiAgICogQHBhcmFtIG1lbnUgVGhlIG1lbnUgdGhhdCB0aGlzIG1lbnUgYWltIHNlcnZpY2UgY29udHJvbHMuXG4gICAqIEBwYXJhbSBwb2ludGVyVHJhY2tlciBUaGUgYFBvaW50ZXJGb2N1c1RyYWNrZXJgIGZvciB0aGUgZ2l2ZW4gbWVudS5cbiAgICovXG4gIGluaXRpYWxpemUobWVudTogTWVudSwgcG9pbnRlclRyYWNrZXI6IFBvaW50ZXJGb2N1c1RyYWNrZXI8Rm9jdXNhYmxlRWxlbWVudCAmIFRvZ2dsZXI+KTogdm9pZDtcblxuICAvKipcbiAgICogQ2FsbHMgdGhlIGBkb1RvZ2dsZWAgY2FsbGJhY2sgd2hlbiBpdCBpcyBkZWVtZWQgdGhhdCB0aGUgdXNlciBpcyBub3QgbW92aW5nIHRvd2FyZHNcbiAgICogdGhlIHN1Ym1lbnUuXG4gICAqIEBwYXJhbSBkb1RvZ2dsZSB0aGUgZnVuY3Rpb24gY2FsbGVkIHdoZW4gdGhlIHVzZXIgaXMgbm90IG1vdmluZyB0b3dhcmRzIHRoZSBzdWJtZW51LlxuICAgKi9cbiAgdG9nZ2xlKGRvVG9nZ2xlOiAoKSA9PiB2b2lkKTogdm9pZDtcbn1cblxuLyoqIEluamVjdGlvbiB0b2tlbiB1c2VkIGZvciBhbiBpbXBsZW1lbnRhdGlvbiBvZiBNZW51QWltLiAqL1xuZXhwb3J0IGNvbnN0IE1FTlVfQUlNID0gbmV3IEluamVjdGlvblRva2VuPE1lbnVBaW0+KCdjZGstbWVudS1haW0nKTtcblxuLyoqIENhcHR1cmUgZXZlcnkgbnRoIG1vdXNlIG1vdmUgZXZlbnQuICovXG5jb25zdCBNT1VTRV9NT1ZFX1NBTVBMRV9GUkVRVUVOQ1kgPSAzO1xuXG4vKiogVGhlIG51bWJlciBvZiBtb3VzZSBtb3ZlIGV2ZW50cyB0byB0cmFjay4gKi9cbmNvbnN0IE5VTV9QT0lOVFMgPSA1O1xuXG4vKipcbiAqIEhvdyBsb25nIHRvIHdhaXQgYmVmb3JlIGNsb3NpbmcgYSBzaWJsaW5nIG1lbnUgaWYgYSB1c2VyIHN0b3BzIHNob3J0IG9mIHRoZSBzdWJtZW51IHRoZXkgd2VyZVxuICogcHJlZGljdGVkIHRvIGdvIGludG8uXG4gKi9cbmNvbnN0IENMT1NFX0RFTEFZID0gMzAwO1xuXG4vKiogQW4gZWxlbWVudCB3aGljaCB3aGVuIGhvdmVyZWQgb3ZlciBtYXkgb3BlbiBvciBjbG9zZSBhIG1lbnUuICovXG5leHBvcnQgaW50ZXJmYWNlIFRvZ2dsZXIge1xuICAvKiogR2V0cyB0aGUgb3BlbiBtZW51LCBvciB1bmRlZmluZWQgaWYgbm8gbWVudSBpcyBvcGVuLiAqL1xuICBnZXRNZW51KCk6IE1lbnUgfCB1bmRlZmluZWQ7XG59XG5cbi8qKiBDYWxjdWxhdGUgdGhlIHNsb3BlIGJldHdlZW4gcG9pbnQgYSBhbmQgYi4gKi9cbmZ1bmN0aW9uIGdldFNsb3BlKGE6IFBvaW50LCBiOiBQb2ludCkge1xuICByZXR1cm4gKGIueSAtIGEueSkgLyAoYi54IC0gYS54KTtcbn1cblxuLyoqIENhbGN1bGF0ZSB0aGUgeSBpbnRlcmNlcHQgZm9yIHRoZSBnaXZlbiBwb2ludCBhbmQgc2xvcGUuICovXG5mdW5jdGlvbiBnZXRZSW50ZXJjZXB0KHBvaW50OiBQb2ludCwgc2xvcGU6IG51bWJlcikge1xuICByZXR1cm4gcG9pbnQueSAtIHNsb3BlICogcG9pbnQueDtcbn1cblxuLyoqIFJlcHJlc2VudHMgYSBjb29yZGluYXRlIG9mIG1vdXNlIHRyYXZlbC4gKi9cbnR5cGUgUG9pbnQgPSB7eDogbnVtYmVyOyB5OiBudW1iZXJ9O1xuXG4vKipcbiAqIFdoZXRoZXIgdGhlIGdpdmVuIG1vdXNlIHRyYWplY3RvcnkgbGluZSBkZWZpbmVkIGJ5IHRoZSBzbG9wZSBhbmQgeSBpbnRlcmNlcHQgZmFsbHMgd2l0aGluIHRoZVxuICogc3VibWVudSBhcyBkZWZpbmVkIGJ5IGBzdWJtZW51UG9pbnRzYFxuICogQHBhcmFtIHN1Ym1lbnVQb2ludHMgdGhlIHN1Ym1lbnUgRE9NUmVjdCBwb2ludHMuXG4gKiBAcGFyYW0gbSB0aGUgc2xvcGUgb2YgdGhlIHRyYWplY3RvcnkgbGluZS5cbiAqIEBwYXJhbSBiIHRoZSB5IGludGVyY2VwdCBvZiB0aGUgdHJhamVjdG9yeSBsaW5lLlxuICogQHJldHVybiB0cnVlIGlmIGFueSBwb2ludCBvbiB0aGUgbGluZSBmYWxscyB3aXRoaW4gdGhlIHN1Ym1lbnUuXG4gKi9cbmZ1bmN0aW9uIGlzV2l0aGluU3VibWVudShzdWJtZW51UG9pbnRzOiBET01SZWN0LCBtOiBudW1iZXIsIGI6IG51bWJlcikge1xuICBjb25zdCB7bGVmdCwgcmlnaHQsIHRvcCwgYm90dG9tfSA9IHN1Ym1lbnVQb2ludHM7XG5cbiAgLy8gQ2hlY2sgZm9yIGludGVyc2VjdGlvbiB3aXRoIGVhY2ggZWRnZSBvZiB0aGUgc3VibWVudSAobGVmdCwgcmlnaHQsIHRvcCwgYm90dG9tKVxuICAvLyBieSBmaXhpbmcgb25lIGNvb3JkaW5hdGUgdG8gdGhhdCBlZGdlJ3MgY29vcmRpbmF0ZSAoZWl0aGVyIHggb3IgeSkgYW5kIGNoZWNraW5nIGlmIHRoZVxuICAvLyBvdGhlciBjb29yZGluYXRlIGlzIHdpdGhpbiBib3VuZHMuXG4gIHJldHVybiAoXG4gICAgKG0gKiBsZWZ0ICsgYiA+PSB0b3AgJiYgbSAqIGxlZnQgKyBiIDw9IGJvdHRvbSkgfHxcbiAgICAobSAqIHJpZ2h0ICsgYiA+PSB0b3AgJiYgbSAqIHJpZ2h0ICsgYiA8PSBib3R0b20pIHx8XG4gICAgKCh0b3AgLSBiKSAvIG0gPj0gbGVmdCAmJiAodG9wIC0gYikgLyBtIDw9IHJpZ2h0KSB8fFxuICAgICgoYm90dG9tIC0gYikgLyBtID49IGxlZnQgJiYgKGJvdHRvbSAtIGIpIC8gbSA8PSByaWdodClcbiAgKTtcbn1cblxuLyoqXG4gKiBUYXJnZXRNZW51QWltIHByZWRpY3RzIGlmIGEgdXNlciBpcyBtb3ZpbmcgaW50byBhIHN1Ym1lbnUuIEl0IGNhbGN1bGF0ZXMgdGhlXG4gKiB0cmFqZWN0b3J5IG9mIHRoZSB1c2VyJ3MgbW91c2UgbW92ZW1lbnQgaW4gdGhlIGN1cnJlbnQgbWVudSB0byBkZXRlcm1pbmUgaWYgdGhlXG4gKiBtb3VzZSBpcyBtb3ZpbmcgdG93YXJkcyBhbiBvcGVuIHN1Ym1lbnUuXG4gKlxuICogVGhlIGRldGVybWluYXRpb24gaXMgbWFkZSBieSBjYWxjdWxhdGluZyB0aGUgc2xvcGUgb2YgdGhlIHVzZXJzIGxhc3QgTlVNX1BPSU5UUyBtb3ZlcyB3aGVyZSBlYWNoXG4gKiBwYWlyIG9mIHBvaW50cyBkZXRlcm1pbmVzIGlmIHRoZSB0cmFqZWN0b3J5IGxpbmUgcG9pbnRzIGludG8gdGhlIHN1Ym1lbnUuIEl0IHVzZXMgY29uc2Vuc3VzXG4gKiBhcHByb2FjaCBieSBjaGVja2luZyBpZiBhdCBsZWFzdCBOVU1fUE9JTlRTIC8gMiBwYWlycyBkZXRlcm1pbmUgdGhhdCB0aGUgdXNlciBpcyBtb3ZpbmcgdG93YXJkc1xuICogdG8gc3VibWVudS5cbiAqL1xuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIFRhcmdldE1lbnVBaW0gaW1wbGVtZW50cyBNZW51QWltLCBPbkRlc3Ryb3kge1xuICAvKiogVGhlIGxhc3QgTlVNX1BPSU5UUyBtb3VzZSBtb3ZlIGV2ZW50cy4gKi9cbiAgcHJpdmF0ZSByZWFkb25seSBfcG9pbnRzOiBQb2ludFtdID0gW107XG5cbiAgLyoqIFJlZmVyZW5jZSB0byB0aGUgcm9vdCBtZW51IGluIHdoaWNoIHdlIGFyZSB0cmFja2luZyBtb3VzZSBtb3Zlcy4gKi9cbiAgcHJpdmF0ZSBfbWVudTogTWVudTtcblxuICAvKiogUmVmZXJlbmNlIHRvIHRoZSByb290IG1lbnUncyBtb3VzZSBtYW5hZ2VyLiAqL1xuICBwcml2YXRlIF9wb2ludGVyVHJhY2tlcjogUG9pbnRlckZvY3VzVHJhY2tlcjxUb2dnbGVyICYgRm9jdXNhYmxlRWxlbWVudD47XG5cbiAgLyoqIFRoZSBpZCBhc3NvY2lhdGVkIHdpdGggdGhlIGN1cnJlbnQgdGltZW91dCBjYWxsIHdhaXRpbmcgdG8gcmVzb2x2ZS4gKi9cbiAgcHJpdmF0ZSBfdGltZW91dElkOiBudW1iZXIgfCBudWxsO1xuXG4gIC8qKiBFbWl0cyB3aGVuIHRoaXMgc2VydmljZSBpcyBkZXN0cm95ZWQuICovXG4gIHByaXZhdGUgcmVhZG9ubHkgX2Rlc3Ryb3llZDogU3ViamVjdDx2b2lkPiA9IG5ldyBTdWJqZWN0KCk7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgLyoqIFRoZSBBbmd1bGFyIHpvbmUuICovXG4gICAgcHJpdmF0ZSByZWFkb25seSBfbmdab25lOiBOZ1pvbmUsXG4gICkge31cblxuICBuZ09uRGVzdHJveSgpIHtcbiAgICB0aGlzLl9kZXN0cm95ZWQubmV4dCgpO1xuICAgIHRoaXMuX2Rlc3Ryb3llZC5jb21wbGV0ZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCB0aGUgTWVudSBhbmQgaXRzIFBvaW50ZXJGb2N1c1RyYWNrZXIuXG4gICAqIEBwYXJhbSBtZW51IFRoZSBtZW51IHRoYXQgdGhpcyBtZW51IGFpbSBzZXJ2aWNlIGNvbnRyb2xzLlxuICAgKiBAcGFyYW0gcG9pbnRlclRyYWNrZXIgVGhlIGBQb2ludGVyRm9jdXNUcmFja2VyYCBmb3IgdGhlIGdpdmVuIG1lbnUuXG4gICAqL1xuICBpbml0aWFsaXplKG1lbnU6IE1lbnUsIHBvaW50ZXJUcmFja2VyOiBQb2ludGVyRm9jdXNUcmFja2VyPEZvY3VzYWJsZUVsZW1lbnQgJiBUb2dnbGVyPikge1xuICAgIHRoaXMuX21lbnUgPSBtZW51O1xuICAgIHRoaXMuX3BvaW50ZXJUcmFja2VyID0gcG9pbnRlclRyYWNrZXI7XG4gICAgdGhpcy5fc3Vic2NyaWJlVG9Nb3VzZU1vdmVzKCk7XG4gIH1cblxuICAvKipcbiAgICogQ2FsbHMgdGhlIGBkb1RvZ2dsZWAgY2FsbGJhY2sgd2hlbiBpdCBpcyBkZWVtZWQgdGhhdCB0aGUgdXNlciBpcyBub3QgbW92aW5nIHRvd2FyZHNcbiAgICogdGhlIHN1Ym1lbnUuXG4gICAqIEBwYXJhbSBkb1RvZ2dsZSB0aGUgZnVuY3Rpb24gY2FsbGVkIHdoZW4gdGhlIHVzZXIgaXMgbm90IG1vdmluZyB0b3dhcmRzIHRoZSBzdWJtZW51LlxuICAgKi9cbiAgdG9nZ2xlKGRvVG9nZ2xlOiAoKSA9PiB2b2lkKSB7XG4gICAgLy8gSWYgdGhlIG1lbnUgaXMgaG9yaXpvbnRhbCB0aGUgc3ViLW1lbnVzIG9wZW4gYmVsb3cgYW5kIHRoZXJlIGlzIG5vIHJpc2sgb2YgcHJlbWF0dXJlXG4gICAgLy8gY2xvc2luZyBvZiBhbnkgc3ViLW1lbnVzIHRoZXJlZm9yZSB3ZSBhdXRvbWF0aWNhbGx5IHJlc29sdmUgdGhlIGNhbGxiYWNrLlxuICAgIGlmICh0aGlzLl9tZW51Lm9yaWVudGF0aW9uID09PSAnaG9yaXpvbnRhbCcpIHtcbiAgICAgIGRvVG9nZ2xlKCk7XG4gICAgfVxuXG4gICAgdGhpcy5fY2hlY2tDb25maWd1cmVkKCk7XG5cbiAgICBjb25zdCBzaWJsaW5nSXRlbUlzV2FpdGluZyA9ICEhdGhpcy5fdGltZW91dElkO1xuICAgIGNvbnN0IGhhc1BvaW50cyA9IHRoaXMuX3BvaW50cy5sZW5ndGggPiAxO1xuXG4gICAgaWYgKGhhc1BvaW50cyAmJiAhc2libGluZ0l0ZW1Jc1dhaXRpbmcpIHtcbiAgICAgIGlmICh0aGlzLl9pc01vdmluZ1RvU3VibWVudSgpKSB7XG4gICAgICAgIHRoaXMuX3N0YXJ0VGltZW91dChkb1RvZ2dsZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkb1RvZ2dsZSgpO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoIXNpYmxpbmdJdGVtSXNXYWl0aW5nKSB7XG4gICAgICBkb1RvZ2dsZSgpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTdGFydCB0aGUgZGVsYXllZCB0b2dnbGUgaGFuZGxlciBpZiBvbmUgaXNuJ3QgcnVubmluZyBhbHJlYWR5LlxuICAgKlxuICAgKiBUaGUgZGVsYXllZCB0b2dnbGUgaGFuZGxlciBleGVjdXRlcyB0aGUgYGRvVG9nZ2xlYCBjYWxsYmFjayBhZnRlciBzb21lIHBlcmlvZCBvZiB0aW1lIGlmZiB0aGVcbiAgICogdXNlcnMgbW91c2UgaXMgb24gYW4gaXRlbSBpbiB0aGUgY3VycmVudCBtZW51LlxuICAgKlxuICAgKiBAcGFyYW0gZG9Ub2dnbGUgdGhlIGZ1bmN0aW9uIGNhbGxlZCB3aGVuIHRoZSB1c2VyIGlzIG5vdCBtb3ZpbmcgdG93YXJkcyB0aGUgc3VibWVudS5cbiAgICovXG4gIHByaXZhdGUgX3N0YXJ0VGltZW91dChkb1RvZ2dsZTogKCkgPT4gdm9pZCkge1xuICAgIC8vIElmIHRoZSB1c2VycyBtb3VzZSBpcyBtb3ZpbmcgdG93YXJkcyBhIHN1Ym1lbnUgd2UgZG9uJ3Qgd2FudCB0byBpbW1lZGlhdGVseSByZXNvbHZlLlxuICAgIC8vIFdhaXQgZm9yIHNvbWUgcGVyaW9kIG9mIHRpbWUgYmVmb3JlIGRldGVybWluaW5nIGlmIHRoZSBwcmV2aW91cyBtZW51IHNob3VsZCBjbG9zZSBpblxuICAgIC8vIGNhc2VzIHdoZXJlIHRoZSB1c2VyIG1heSBoYXZlIG1vdmVkIHRvd2FyZHMgdGhlIHN1Ym1lbnUgYnV0IHN0b3BwZWQgb24gYSBzaWJsaW5nIG1lbnVcbiAgICAvLyBpdGVtIGludGVudGlvbmFsbHkuXG4gICAgY29uc3QgdGltZW91dElkID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAvLyBSZXNvbHZlIGlmIHRoZSB1c2VyIGlzIGN1cnJlbnRseSBtb3VzZWQgb3ZlciBzb21lIGVsZW1lbnQgaW4gdGhlIHJvb3QgbWVudVxuICAgICAgaWYgKHRoaXMuX3BvaW50ZXJUcmFja2VyIS5hY3RpdmVFbGVtZW50ICYmIHRpbWVvdXRJZCA9PT0gdGhpcy5fdGltZW91dElkKSB7XG4gICAgICAgIGRvVG9nZ2xlKCk7XG4gICAgICB9XG4gICAgICB0aGlzLl90aW1lb3V0SWQgPSBudWxsO1xuICAgIH0sIENMT1NFX0RFTEFZKSBhcyBhbnkgYXMgbnVtYmVyO1xuXG4gICAgdGhpcy5fdGltZW91dElkID0gdGltZW91dElkO1xuICB9XG5cbiAgLyoqIFdoZXRoZXIgdGhlIHVzZXIgaXMgaGVhZGluZyB0b3dhcmRzIHRoZSBvcGVuIHN1Ym1lbnUuICovXG4gIHByaXZhdGUgX2lzTW92aW5nVG9TdWJtZW51KCkge1xuICAgIGNvbnN0IHN1Ym1lbnVQb2ludHMgPSB0aGlzLl9nZXRTdWJtZW51Qm91bmRzKCk7XG4gICAgaWYgKCFzdWJtZW51UG9pbnRzKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgbGV0IG51bU1vdmluZyA9IDA7XG4gICAgY29uc3QgY3VyclBvaW50ID0gdGhpcy5fcG9pbnRzW3RoaXMuX3BvaW50cy5sZW5ndGggLSAxXTtcbiAgICAvLyBzdGFydCBmcm9tIHRoZSBzZWNvbmQgbGFzdCBwb2ludCBhbmQgY2FsY3VsYXRlIHRoZSBzbG9wZSBiZXR3ZWVuIGVhY2ggcG9pbnQgYW5kIHRoZSBsYXN0XG4gICAgLy8gcG9pbnQuXG4gICAgZm9yIChsZXQgaSA9IHRoaXMuX3BvaW50cy5sZW5ndGggLSAyOyBpID49IDA7IGktLSkge1xuICAgICAgY29uc3QgcHJldmlvdXMgPSB0aGlzLl9wb2ludHNbaV07XG4gICAgICBjb25zdCBzbG9wZSA9IGdldFNsb3BlKGN1cnJQb2ludCwgcHJldmlvdXMpO1xuICAgICAgaWYgKGlzV2l0aGluU3VibWVudShzdWJtZW51UG9pbnRzLCBzbG9wZSwgZ2V0WUludGVyY2VwdChjdXJyUG9pbnQsIHNsb3BlKSkpIHtcbiAgICAgICAgbnVtTW92aW5nKys7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBudW1Nb3ZpbmcgPj0gTWF0aC5mbG9vcihOVU1fUE9JTlRTIC8gMik7XG4gIH1cblxuICAvKiogR2V0IHRoZSBib3VuZGluZyBET01SZWN0IGZvciB0aGUgb3BlbiBzdWJtZW51LiAqL1xuICBwcml2YXRlIF9nZXRTdWJtZW51Qm91bmRzKCk6IERPTVJlY3QgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9wb2ludGVyVHJhY2tlcj8ucHJldmlvdXNFbGVtZW50Py5nZXRNZW51KCk/Lm5hdGl2ZUVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgaWYgYSByZWZlcmVuY2UgdG8gdGhlIFBvaW50ZXJGb2N1c1RyYWNrZXIgYW5kIG1lbnUgZWxlbWVudCBpcyBwcm92aWRlZC5cbiAgICogQHRocm93cyBhbiBlcnJvciBpZiBuZWl0aGVyIHJlZmVyZW5jZSBpcyBwcm92aWRlZC5cbiAgICovXG4gIHByaXZhdGUgX2NoZWNrQ29uZmlndXJlZCgpIHtcbiAgICBpZiAodHlwZW9mIG5nRGV2TW9kZSA9PT0gJ3VuZGVmaW5lZCcgfHwgbmdEZXZNb2RlKSB7XG4gICAgICBpZiAoIXRoaXMuX3BvaW50ZXJUcmFja2VyKSB7XG4gICAgICAgIHRocm93TWlzc2luZ1BvaW50ZXJGb2N1c1RyYWNrZXIoKTtcbiAgICAgIH1cbiAgICAgIGlmICghdGhpcy5fbWVudSkge1xuICAgICAgICB0aHJvd01pc3NpbmdNZW51UmVmZXJlbmNlKCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqIFN1YnNjcmliZSB0byB0aGUgcm9vdCBtZW51cyBtb3VzZSBtb3ZlIGV2ZW50cyBhbmQgdXBkYXRlIHRoZSB0cmFja2VkIG1vdXNlIHBvaW50cy4gKi9cbiAgcHJpdmF0ZSBfc3Vic2NyaWJlVG9Nb3VzZU1vdmVzKCkge1xuICAgIHRoaXMuX25nWm9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7XG4gICAgICBmcm9tRXZlbnQ8TW91c2VFdmVudD4odGhpcy5fbWVudS5uYXRpdmVFbGVtZW50LCAnbW91c2Vtb3ZlJylcbiAgICAgICAgLnBpcGUoXG4gICAgICAgICAgZmlsdGVyKChfOiBNb3VzZUV2ZW50LCBpbmRleDogbnVtYmVyKSA9PiBpbmRleCAlIE1PVVNFX01PVkVfU0FNUExFX0ZSRVFVRU5DWSA9PT0gMCksXG4gICAgICAgICAgdGFrZVVudGlsKHRoaXMuX2Rlc3Ryb3llZCksXG4gICAgICAgIClcbiAgICAgICAgLnN1YnNjcmliZSgoZXZlbnQ6IE1vdXNlRXZlbnQpID0+IHtcbiAgICAgICAgICB0aGlzLl9wb2ludHMucHVzaCh7eDogZXZlbnQuY2xpZW50WCwgeTogZXZlbnQuY2xpZW50WX0pO1xuICAgICAgICAgIGlmICh0aGlzLl9wb2ludHMubGVuZ3RoID4gTlVNX1BPSU5UUykge1xuICAgICAgICAgICAgdGhpcy5fcG9pbnRzLnNoaWZ0KCk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9KTtcbiAgfVxufVxuXG4vKipcbiAqIENka1RhcmdldE1lbnVBaW0gaXMgYSBwcm92aWRlciBmb3IgdGhlIFRhcmdldE1lbnVBaW0gc2VydmljZS4gSXQgY2FuIGJlIGFkZGVkIHRvIGFuXG4gKiBlbGVtZW50IHdpdGggZWl0aGVyIHRoZSBgY2RrTWVudWAgb3IgYGNka01lbnVCYXJgIGRpcmVjdGl2ZSBhbmQgY2hpbGQgbWVudSBpdGVtcy5cbiAqL1xuQERpcmVjdGl2ZSh7XG4gIHNlbGVjdG9yOiAnW2Nka1RhcmdldE1lbnVBaW1dJyxcbiAgZXhwb3J0QXM6ICdjZGtUYXJnZXRNZW51QWltJyxcbiAgcHJvdmlkZXJzOiBbe3Byb3ZpZGU6IE1FTlVfQUlNLCB1c2VDbGFzczogVGFyZ2V0TWVudUFpbX1dLFxufSlcbmV4cG9ydCBjbGFzcyBDZGtUYXJnZXRNZW51QWltIHt9XG4iXX0=
|
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright Google LLC All Rights Reserved.
|
|
4
|
+
*
|
|
5
|
+
* Use of this source code is governed by an MIT-style license that can be
|
|
6
|
+
* found in the LICENSE file at https://angular.io/license
|
|
7
|
+
*/
|
|
8
|
+
import { Directive, ElementRef, Inject, NgZone, Optional, Self, } from '@angular/core';
|
|
9
|
+
import { Directionality } from '@angular/cdk/bidi';
|
|
10
|
+
import { DOWN_ARROW, ESCAPE, hasModifierKey, LEFT_ARROW, RIGHT_ARROW, TAB, UP_ARROW, } from '@angular/cdk/keycodes';
|
|
11
|
+
import { takeUntil } from 'rxjs/operators';
|
|
12
|
+
import { CdkMenuGroup } from './menu-group';
|
|
13
|
+
import { CDK_MENU } from './menu-interface';
|
|
14
|
+
import { MENU_STACK, MenuStack } from './menu-stack';
|
|
15
|
+
import { MENU_AIM } from './menu-aim';
|
|
16
|
+
import { CdkMenuBase } from './menu-base';
|
|
17
|
+
import * as i0 from "@angular/core";
|
|
18
|
+
import * as i1 from "@angular/cdk/bidi";
|
|
19
|
+
import * as i2 from "./menu-stack";
|
|
20
|
+
/**
|
|
21
|
+
* Directive applied to an element which configures it as a MenuBar by setting the appropriate
|
|
22
|
+
* role, aria attributes, and accessible keyboard and mouse handling logic. The component that
|
|
23
|
+
* this directive is applied to should contain components marked with CdkMenuItem.
|
|
24
|
+
*
|
|
25
|
+
*/
|
|
26
|
+
export class CdkMenuBar extends CdkMenuBase {
|
|
27
|
+
constructor(
|
|
28
|
+
/** The host element. */
|
|
29
|
+
elementRef,
|
|
30
|
+
/** The Angular zone. */
|
|
31
|
+
ngZone,
|
|
32
|
+
/** The menu stack this menu is part of. */
|
|
33
|
+
menuStack,
|
|
34
|
+
/** The menu aim service used by this menu. */
|
|
35
|
+
menuAim,
|
|
36
|
+
/** The directionality of the page. */
|
|
37
|
+
dir) {
|
|
38
|
+
super(elementRef, ngZone, menuStack, menuAim, dir);
|
|
39
|
+
/** The direction items in the menu flow. */
|
|
40
|
+
this.orientation = 'horizontal';
|
|
41
|
+
/** Whether the menu is displayed inline (i.e. always present vs a conditional popup that the user triggers with a trigger element). */
|
|
42
|
+
this.isInline = true;
|
|
43
|
+
}
|
|
44
|
+
ngAfterContentInit() {
|
|
45
|
+
super.ngAfterContentInit();
|
|
46
|
+
this._subscribeToMenuStackEmptied();
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Handle keyboard events for the Menu.
|
|
50
|
+
* @param event The keyboard event to be handled.
|
|
51
|
+
*/
|
|
52
|
+
_handleKeyEvent(event) {
|
|
53
|
+
const keyManager = this.keyManager;
|
|
54
|
+
switch (event.keyCode) {
|
|
55
|
+
case UP_ARROW:
|
|
56
|
+
case DOWN_ARROW:
|
|
57
|
+
case LEFT_ARROW:
|
|
58
|
+
case RIGHT_ARROW:
|
|
59
|
+
if (!hasModifierKey(event)) {
|
|
60
|
+
const horizontalArrows = event.keyCode === LEFT_ARROW || event.keyCode === RIGHT_ARROW;
|
|
61
|
+
// For a horizontal menu if the left/right keys were clicked, or a vertical menu if the
|
|
62
|
+
// up/down keys were clicked: if the current menu is open, close it then focus and open the
|
|
63
|
+
// next menu.
|
|
64
|
+
if (horizontalArrows) {
|
|
65
|
+
event.preventDefault();
|
|
66
|
+
const prevIsOpen = keyManager.activeItem?.isMenuOpen();
|
|
67
|
+
keyManager.activeItem?.getMenuTrigger()?.close();
|
|
68
|
+
keyManager.setFocusOrigin('keyboard');
|
|
69
|
+
keyManager.onKeydown(event);
|
|
70
|
+
if (prevIsOpen) {
|
|
71
|
+
keyManager.activeItem?.getMenuTrigger()?.open();
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
break;
|
|
76
|
+
case ESCAPE:
|
|
77
|
+
if (!hasModifierKey(event)) {
|
|
78
|
+
event.preventDefault();
|
|
79
|
+
keyManager.activeItem?.getMenuTrigger()?.close();
|
|
80
|
+
}
|
|
81
|
+
break;
|
|
82
|
+
case TAB:
|
|
83
|
+
if (!hasModifierKey(event, 'altKey', 'metaKey', 'ctrlKey')) {
|
|
84
|
+
keyManager.activeItem?.getMenuTrigger()?.close();
|
|
85
|
+
}
|
|
86
|
+
break;
|
|
87
|
+
default:
|
|
88
|
+
keyManager.onKeydown(event);
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Set focus to either the current, previous or next item based on the FocusNext event, then
|
|
93
|
+
* open the previous or next item.
|
|
94
|
+
* @param focusNext The element to focus.
|
|
95
|
+
*/
|
|
96
|
+
_toggleOpenMenu(focusNext) {
|
|
97
|
+
const keyManager = this.keyManager;
|
|
98
|
+
switch (focusNext) {
|
|
99
|
+
case 0 /* nextItem */:
|
|
100
|
+
keyManager.setFocusOrigin('keyboard');
|
|
101
|
+
keyManager.setNextItemActive();
|
|
102
|
+
keyManager.activeItem?.getMenuTrigger()?.open();
|
|
103
|
+
break;
|
|
104
|
+
case 1 /* previousItem */:
|
|
105
|
+
keyManager.setFocusOrigin('keyboard');
|
|
106
|
+
keyManager.setPreviousItemActive();
|
|
107
|
+
keyManager.activeItem?.getMenuTrigger()?.open();
|
|
108
|
+
break;
|
|
109
|
+
case 2 /* currentItem */:
|
|
110
|
+
if (keyManager.activeItem) {
|
|
111
|
+
keyManager.setFocusOrigin('keyboard');
|
|
112
|
+
keyManager.setActiveItem(keyManager.activeItem);
|
|
113
|
+
}
|
|
114
|
+
break;
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
/** Subscribe to the MenuStack emptied events. */
|
|
118
|
+
_subscribeToMenuStackEmptied() {
|
|
119
|
+
this.menuStack?.emptied
|
|
120
|
+
.pipe(takeUntil(this.destroyed))
|
|
121
|
+
.subscribe(event => this._toggleOpenMenu(event));
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
CdkMenuBar.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.0.0-next.15", ngImport: i0, type: CdkMenuBar, deps: [{ token: i0.ElementRef }, { token: i0.NgZone }, { token: MENU_STACK }, { token: MENU_AIM, optional: true, self: true }, { token: i1.Directionality, optional: true }], target: i0.ɵɵFactoryTarget.Directive });
|
|
125
|
+
CdkMenuBar.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "12.0.0", version: "14.0.0-next.15", type: CdkMenuBar, selector: "[cdkMenuBar]", host: { attributes: { "role": "menubar" }, listeners: { "keydown": "_handleKeyEvent($event)" }, classAttribute: "cdk-menu-bar" }, providers: [
|
|
126
|
+
{ provide: CdkMenuGroup, useExisting: CdkMenuBar },
|
|
127
|
+
{ provide: CDK_MENU, useExisting: CdkMenuBar },
|
|
128
|
+
{ provide: MENU_STACK, useFactory: () => MenuStack.inline('horizontal') },
|
|
129
|
+
], exportAs: ["cdkMenuBar"], usesInheritance: true, ngImport: i0 });
|
|
130
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.0-next.15", ngImport: i0, type: CdkMenuBar, decorators: [{
|
|
131
|
+
type: Directive,
|
|
132
|
+
args: [{
|
|
133
|
+
selector: '[cdkMenuBar]',
|
|
134
|
+
exportAs: 'cdkMenuBar',
|
|
135
|
+
host: {
|
|
136
|
+
'role': 'menubar',
|
|
137
|
+
'class': 'cdk-menu-bar',
|
|
138
|
+
'(keydown)': '_handleKeyEvent($event)',
|
|
139
|
+
},
|
|
140
|
+
providers: [
|
|
141
|
+
{ provide: CdkMenuGroup, useExisting: CdkMenuBar },
|
|
142
|
+
{ provide: CDK_MENU, useExisting: CdkMenuBar },
|
|
143
|
+
{ provide: MENU_STACK, useFactory: () => MenuStack.inline('horizontal') },
|
|
144
|
+
],
|
|
145
|
+
}]
|
|
146
|
+
}], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i0.NgZone }, { type: i2.MenuStack, decorators: [{
|
|
147
|
+
type: Inject,
|
|
148
|
+
args: [MENU_STACK]
|
|
149
|
+
}] }, { type: undefined, decorators: [{
|
|
150
|
+
type: Self
|
|
151
|
+
}, {
|
|
152
|
+
type: Optional
|
|
153
|
+
}, {
|
|
154
|
+
type: Inject,
|
|
155
|
+
args: [MENU_AIM]
|
|
156
|
+
}] }, { type: i1.Directionality, decorators: [{
|
|
157
|
+
type: Optional
|
|
158
|
+
}] }]; } });
|
|
159
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVudS1iYXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvY2RrL21lbnUvbWVudS1iYXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7OztHQU1HO0FBRUgsT0FBTyxFQUVMLFNBQVMsRUFDVCxVQUFVLEVBQ1YsTUFBTSxFQUNOLE1BQU0sRUFDTixRQUFRLEVBQ1IsSUFBSSxHQUNMLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBQyxjQUFjLEVBQUMsTUFBTSxtQkFBbUIsQ0FBQztBQUNqRCxPQUFPLEVBQ0wsVUFBVSxFQUNWLE1BQU0sRUFDTixjQUFjLEVBQ2QsVUFBVSxFQUNWLFdBQVcsRUFDWCxHQUFHLEVBQ0gsUUFBUSxHQUNULE1BQU0sdUJBQXVCLENBQUM7QUFDL0IsT0FBTyxFQUFDLFNBQVMsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBQ3pDLE9BQU8sRUFBQyxZQUFZLEVBQUMsTUFBTSxjQUFjLENBQUM7QUFDMUMsT0FBTyxFQUFDLFFBQVEsRUFBQyxNQUFNLGtCQUFrQixDQUFDO0FBQzFDLE9BQU8sRUFBWSxVQUFVLEVBQUUsU0FBUyxFQUFDLE1BQU0sY0FBYyxDQUFDO0FBQzlELE9BQU8sRUFBQyxRQUFRLEVBQVUsTUFBTSxZQUFZLENBQUM7QUFDN0MsT0FBTyxFQUFDLFdBQVcsRUFBQyxNQUFNLGFBQWEsQ0FBQzs7OztBQUV4Qzs7Ozs7R0FLRztBQWVILE1BQU0sT0FBTyxVQUFXLFNBQVEsV0FBVztJQU96QztJQUNFLHdCQUF3QjtJQUN4QixVQUFtQztJQUNuQyx3QkFBd0I7SUFDeEIsTUFBYztJQUNkLDJDQUEyQztJQUN2QixTQUFvQjtJQUN4Qyw4Q0FBOEM7SUFDUixPQUFpQjtJQUN2RCxzQ0FBc0M7SUFDMUIsR0FBb0I7UUFFaEMsS0FBSyxDQUFDLFVBQVUsRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxHQUFHLENBQUMsQ0FBQztRQWxCckQsNENBQTRD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OzJCQUFDLFFBQVE7OzBCQUVuQyxRQUFRIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZVxuICovXG5cbmltcG9ydCB7XG4gIEFmdGVyQ29udGVudEluaXQsXG4gIERpcmVjdGl2ZSxcbiAgRWxlbWVudFJlZixcbiAgSW5qZWN0LFxuICBOZ1pvbmUsXG4gIE9wdGlvbmFsLFxuICBTZWxmLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7RGlyZWN0aW9uYWxpdHl9IGZyb20gJ0Bhbmd1bGFyL2Nkay9iaWRpJztcbmltcG9ydCB7XG4gIERPV05fQVJST1csXG4gIEVTQ0FQRSxcbiAgaGFzTW9kaWZpZXJLZXksXG4gIExFRlRfQVJST1csXG4gIFJJR0hUX0FSUk9XLFxuICBUQUIsXG4gIFVQX0FSUk9XLFxufSBmcm9tICdAYW5ndWxhci9jZGsva2V5Y29kZXMnO1xuaW1wb3J0IHt0YWtlVW50aWx9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7Q2RrTWVudUdyb3VwfSBmcm9tICcuL21lbnUtZ3JvdXAnO1xuaW1wb3J0IHtDREtfTUVOVX0gZnJvbSAnLi9tZW51LWludGVyZmFjZSc7XG5pbXBvcnQge0ZvY3VzTmV4dCwgTUVOVV9TVEFDSywgTWVudVN0YWNrfSBmcm9tICcuL21lbnUtc3RhY2snO1xuaW1wb3J0IHtNRU5VX0FJTSwgTWVudUFpbX0gZnJvbSAnLi9tZW51LWFpbSc7XG5pbXBvcnQge0Nka01lbnVCYXNlfSBmcm9tICcuL21lbnUtYmFzZSc7XG5cbi8qKlxuICogRGlyZWN0aXZlIGFwcGxpZWQgdG8gYW4gZWxlbWVudCB3aGljaCBjb25maWd1cmVzIGl0IGFzIGEgTWVudUJhciBieSBzZXR0aW5nIHRoZSBhcHByb3ByaWF0ZVxuICogcm9sZSwgYXJpYSBhdHRyaWJ1dGVzLCBhbmQgYWNjZXNzaWJsZSBrZXlib2FyZCBhbmQgbW91c2UgaGFuZGxpbmcgbG9naWMuIFRoZSBjb21wb25lbnQgdGhhdFxuICogdGhpcyBkaXJlY3RpdmUgaXMgYXBwbGllZCB0byBzaG91bGQgY29udGFpbiBjb21wb25lbnRzIG1hcmtlZCB3aXRoIENka01lbnVJdGVtLlxuICpcbiAqL1xuQERpcmVjdGl2ZSh7XG4gIHNlbGVjdG9yOiAnW2Nka01lbnVCYXJdJyxcbiAgZXhwb3J0QXM6ICdjZGtNZW51QmFyJyxcbiAgaG9zdDoge1xuICAgICdyb2xlJzogJ21lbnViYXInLFxuICAgICdjbGFzcyc6ICdjZGstbWVudS1iYXInLFxuICAgICcoa2V5ZG93biknOiAnX2hhbmRsZUtleUV2ZW50KCRldmVudCknLFxuICB9LFxuICBwcm92aWRlcnM6IFtcbiAgICB7cHJvdmlkZTogQ2RrTWVudUdyb3VwLCB1c2VFeGlzdGluZzogQ2RrTWVudUJhcn0sXG4gICAge3Byb3ZpZGU6IENES19NRU5VLCB1c2VFeGlzdGluZzogQ2RrTWVudUJhcn0sXG4gICAge3Byb3ZpZGU6IE1FTlVfU1RBQ0ssIHVzZUZhY3Rvcnk6ICgpID0+IE1lbnVTdGFjay5pbmxpbmUoJ2hvcml6b250YWwnKX0sXG4gIF0sXG59KVxuZXhwb3J0IGNsYXNzIENka01lbnVCYXIgZXh0ZW5kcyBDZGtNZW51QmFzZSBpbXBsZW1lbnRzIEFmdGVyQ29udGVudEluaXQge1xuICAvKiogVGhlIGRpcmVjdGlvbiBpdGVtcyBpbiB0aGUgbWVudSBmbG93LiAqL1xuICBvdmVycmlkZSByZWFkb25seSBvcmllbnRhdGlvbiA9ICdob3Jpem9udGFsJztcblxuICAvKiogV2hldGhlciB0aGUgbWVudSBpcyBkaXNwbGF5ZWQgaW5saW5lIChpLmUuIGFsd2F5cyBwcmVzZW50IHZzIGEgY29uZGl0aW9uYWwgcG9wdXAgdGhhdCB0aGUgdXNlciB0cmlnZ2VycyB3aXRoIGEgdHJpZ2dlciBlbGVtZW50KS4gKi9cbiAgb3ZlcnJpZGUgcmVhZG9ubHkgaXNJbmxpbmUgPSB0cnVlO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIC8qKiBUaGUgaG9zdCBlbGVtZW50LiAqL1xuICAgIGVsZW1lbnRSZWY6IEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+LFxuICAgIC8qKiBUaGUgQW5ndWxhciB6b25lLiAqL1xuICAgIG5nWm9uZTogTmdab25lLFxuICAgIC8qKiBUaGUgbWVudSBzdGFjayB0aGlzIG1lbnUgaXMgcGFydCBvZi4gKi9cbiAgICBASW5qZWN0KE1FTlVfU1RBQ0spIG1lbnVTdGFjazogTWVudVN0YWNrLFxuICAgIC8qKiBUaGUgbWVudSBhaW0gc2VydmljZSB1c2VkIGJ5IHRoaXMgbWVudS4gKi9cbiAgICBAU2VsZigpIEBPcHRpb25hbCgpIEBJbmplY3QoTUVOVV9BSU0pIG1lbnVBaW0/OiBNZW51QWltLFxuICAgIC8qKiBUaGUgZGlyZWN0aW9uYWxpdHkgb2YgdGhlIHBhZ2UuICovXG4gICAgQE9wdGlvbmFsKCkgZGlyPzogRGlyZWN0aW9uYWxpdHksXG4gICkge1xuICAgIHN1cGVyKGVsZW1lbnRSZWYsIG5nWm9uZSwgbWVudVN0YWNrLCBtZW51QWltLCBkaXIpO1xuICB9XG5cbiAgb3ZlcnJpZGUgbmdBZnRlckNvbnRlbnRJbml0KCkge1xuICAgIHN1cGVyLm5nQWZ0ZXJDb250ZW50SW5pdCgpO1xuICAgIHRoaXMuX3N1YnNjcmliZVRvTWVudVN0YWNrRW1wdGllZCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZSBrZXlib2FyZCBldmVudHMgZm9yIHRoZSBNZW51LlxuICAgKiBAcGFyYW0gZXZlbnQgVGhlIGtleWJvYXJkIGV2ZW50IHRvIGJlIGhhbmRsZWQuXG4gICAqL1xuICBfaGFuZGxlS2V5RXZlbnQoZXZlbnQ6IEtleWJvYXJkRXZlbnQpIHtcbiAgICBjb25zdCBrZXlNYW5hZ2VyID0gdGhpcy5rZXlNYW5hZ2VyO1xuICAgIHN3aXRjaCAoZXZlbnQua2V5Q29kZSkge1xuICAgICAgY2FzZSBVUF9BUlJPVzpcbiAgICAgIGNhc2UgRE9XTl9BUlJPVzpcbiAgICAgIGNhc2UgTEVGVF9BUlJPVzpcbiAgICAgIGNhc2UgUklHSFRfQVJST1c6XG4gICAgICAgIGlmICghaGFzTW9kaWZpZXJLZXkoZXZlbnQpKSB7XG4gICAgICAgICAgY29uc3QgaG9yaXpvbnRhbEFycm93cyA9IGV2ZW50LmtleUNvZGUgPT09IExFRlRfQVJST1cgfHwgZXZlbnQua2V5Q29kZSA9PT0gUklHSFRfQVJST1c7XG4gICAgICAgICAgLy8gRm9yIGEgaG9yaXpvbnRhbCBtZW51IGlmIHRoZSBsZWZ0L3JpZ2h0IGtleXMgd2VyZSBjbGlja2VkLCBvciBhIHZlcnRpY2FsIG1lbnUgaWYgdGhlXG4gICAgICAgICAgLy8gdXAvZG93biBrZXlzIHdlcmUgY2xpY2tlZDogaWYgdGhlIGN1cnJlbnQgbWVudSBpcyBvcGVuLCBjbG9zZSBpdCB0aGVuIGZvY3VzIGFuZCBvcGVuIHRoZVxuICAgICAgICAgIC8vIG5leHQgIG1lbnUuXG4gICAgICAgICAgaWYgKGhvcml6b250YWxBcnJvd3MpIHtcbiAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cbiAgICAgICAgICAgIGNvbnN0IHByZXZJc09wZW4gPSBrZXlNYW5hZ2VyLmFjdGl2ZUl0ZW0/LmlzTWVudU9wZW4oKTtcbiAgICAgICAgICAgIGtleU1hbmFnZXIuYWN0aXZlSXRlbT8uZ2V0TWVudVRyaWdnZXIoKT8uY2xvc2UoKTtcblxuICAgICAgICAgICAga2V5TWFuYWdlci5zZXRGb2N1c09yaWdpbigna2V5Ym9hcmQnKTtcbiAgICAgICAgICAgIGtleU1hbmFnZXIub25LZXlkb3duKGV2ZW50KTtcbiAgICAgICAgICAgIGlmIChwcmV2SXNPcGVuKSB7XG4gICAgICAgICAgICAgIGtleU1hbmFnZXIuYWN0aXZlSXRlbT8uZ2V0TWVudVRyaWdnZXIoKT8ub3BlbigpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSBFU0NBUEU6XG4gICAgICAgIGlmICghaGFzTW9kaWZpZXJLZXkoZXZlbnQpKSB7XG4gICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICBrZXlNYW5hZ2VyLmFjdGl2ZUl0ZW0/LmdldE1lbnVUcmlnZ2VyKCk/LmNsb3NlKCk7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgVEFCOlxuICAgICAgICBpZiAoIWhhc01vZGlmaWVyS2V5KGV2ZW50LCAnYWx0S2V5JywgJ21ldGFLZXknLCAnY3RybEtleScpKSB7XG4gICAgICAgICAga2V5TWFuYWdlci5hY3RpdmVJdGVtPy5nZXRNZW51VHJpZ2dlcigpPy5jbG9zZSgpO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICBrZXlNYW5hZ2VyLm9uS2V5ZG93bihldmVudCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNldCBmb2N1cyB0byBlaXRoZXIgdGhlIGN1cnJlbnQsIHByZXZpb3VzIG9yIG5leHQgaXRlbSBiYXNlZCBvbiB0aGUgRm9jdXNOZXh0IGV2ZW50LCB0aGVuXG4gICAqIG9wZW4gdGhlIHByZXZpb3VzIG9yIG5leHQgaXRlbS5cbiAgICogQHBhcmFtIGZvY3VzTmV4dCBUaGUgZWxlbWVudCB0byBmb2N1cy5cbiAgICovXG4gIHByaXZhdGUgX3RvZ2dsZU9wZW5NZW51KGZvY3VzTmV4dDogRm9jdXNOZXh0IHwgdW5kZWZpbmVkKSB7XG4gICAgY29uc3Qga2V5TWFuYWdlciA9IHRoaXMua2V5TWFuYWdlcjtcbiAgICBzd2l0Y2ggKGZvY3VzTmV4dCkge1xuICAgICAgY2FzZSBGb2N1c05leHQubmV4dEl0ZW06XG4gICAgICAgIGtleU1hbmFnZXIuc2V0Rm9jdXNPcmlnaW4oJ2tleWJvYXJkJyk7XG4gICAgICAgIGtleU1hbmFnZXIuc2V0TmV4dEl0ZW1BY3RpdmUoKTtcbiAgICAgICAga2V5TWFuYWdlci5hY3RpdmVJdGVtPy5nZXRNZW51VHJpZ2dlcigpPy5vcGVuKCk7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlIEZvY3VzTmV4dC5wcmV2aW91c0l0ZW06XG4gICAgICAgIGtleU1hbmFnZXIuc2V0Rm9jdXNPcmlnaW4oJ2tleWJvYXJkJyk7XG4gICAgICAgIGtleU1hbmFnZXIuc2V0UHJldmlvdXNJdGVtQWN0aXZlKCk7XG4gICAgICAgIGtleU1hbmFnZXIuYWN0aXZlSXRlbT8uZ2V0TWVudVRyaWdnZXIoKT8ub3BlbigpO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSBGb2N1c05leHQuY3VycmVudEl0ZW06XG4gICAgICAgIGlmIChrZXlNYW5hZ2VyLmFjdGl2ZUl0ZW0pIHtcbiAgICAgICAgICBrZXlNYW5hZ2VyLnNldEZvY3VzT3JpZ2luKCdrZXlib2FyZCcpO1xuICAgICAgICAgIGtleU1hbmFnZXIuc2V0QWN0aXZlSXRlbShrZXlNYW5hZ2VyLmFjdGl2ZUl0ZW0pO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBTdWJzY3JpYmUgdG8gdGhlIE1lbnVTdGFjayBlbXB0aWVkIGV2ZW50cy4gKi9cbiAgcHJpdmF0ZSBfc3Vic2NyaWJlVG9NZW51U3RhY2tFbXB0aWVkKCkge1xuICAgIHRoaXMubWVudVN0YWNrPy5lbXB0aWVkXG4gICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95ZWQpKVxuICAgICAgLnN1YnNjcmliZShldmVudCA9PiB0aGlzLl90b2dnbGVPcGVuTWVudShldmVudCkpO1xuICB9XG59XG4iXX0=
|