From c15fde6d283ef6c2cd6561a348e2071adb4d8fe4 Mon Sep 17 00:00:00 2001 From: Murhaf Sousli Date: Sat, 23 Dec 2023 10:28:01 +0100 Subject: [PATCH] Beta release v12 --- CHANGELOG.md | 77 +- README.md | 8 +- angular.json | 97 +- build-storybook.log | 807 + documentation/changelog.html | 793 + documentation/classes/ActiveItemObserver.html | 320 + documentation/classes/GalleryRef.html | 2182 ++ documentation/classes/HorizontalAdapter.html | 1109 + documentation/classes/IframeItem.html | 385 + documentation/classes/ImageItem.html | 385 + documentation/classes/SliderAdapter.html | 861 + documentation/classes/VerticalAdapter.html | 1109 + documentation/classes/VideoItem.html | 385 + documentation/classes/YoutubeItem.html | 385 + .../components/CustomTemplateComponent.html | 469 + .../components/GalleryComponent.html | 3717 ++ .../components/GalleryCoreComponent.html | 2015 ++ .../components/GalleryCounterComponent.html | 336 + .../components/GalleryDotsComponent.html | 520 + .../components/GalleryExampleComponent.html | 1432 + .../components/GalleryIframeComponent.html | 733 + .../components/GalleryImageComponent.html | 1203 + .../components/GalleryItemComponent.html | 1414 + .../components/GalleryNavComponent.html | 652 + .../components/GallerySliderComponent.html | 1494 + .../components/GalleryThumbComponent.html | 851 + .../components/GalleryThumbsComponent.html | 1350 + .../components/GalleryVideoComponent.html | 917 + .../components/LightboxComponent.html | 1223 + .../components/LightboxExampleComponent.html | 378 + documentation/coverage.html | 1360 + documentation/dependencies.html | 169 + .../directives/AutoplayDirective.html | 675 + .../directives/GallerizeDirective.html | 1030 + documentation/directives/GalleryBoxDef.html | 408 + documentation/directives/GalleryImageDef.html | 402 + documentation/directives/GalleryItemDef.html | 424 + documentation/directives/GalleryThumbDef.html | 401 + documentation/directives/HammerSliding.html | 1031 + documentation/directives/ImgRecognizer.html | 608 + .../directives/ItemIntersectionObserver.html | 755 + .../directives/LightboxDirective.html | 508 + .../SliderIntersectionObserver.html | 770 + .../directives/SliderResizeObserver.html | 1383 + documentation/directives/SmoothScroll.html | 1675 + .../directives/ThumbResizeObserver.html | 713 + documentation/fonts/ionicons.eot | Bin 0 -> 112650 bytes documentation/fonts/ionicons.svg | 2090 ++ documentation/fonts/ionicons.ttf | Bin 0 -> 112472 bytes documentation/fonts/ionicons.woff | Bin 0 -> 65912 bytes documentation/fonts/ionicons.woff2 | Bin 0 -> 50632 bytes documentation/fonts/roboto-v15-latin-300.eot | Bin 0 -> 16205 bytes documentation/fonts/roboto-v15-latin-300.svg | 314 + documentation/fonts/roboto-v15-latin-300.ttf | Bin 0 -> 32664 bytes documentation/fonts/roboto-v15-latin-300.woff | Bin 0 -> 18520 bytes .../fonts/roboto-v15-latin-300.woff2 | Bin 0 -> 14524 bytes documentation/fonts/roboto-v15-latin-700.eot | Bin 0 -> 16208 bytes documentation/fonts/roboto-v15-latin-700.svg | 310 + documentation/fonts/roboto-v15-latin-700.ttf | Bin 0 -> 32500 bytes documentation/fonts/roboto-v15-latin-700.woff | Bin 0 -> 18568 bytes .../fonts/roboto-v15-latin-700.woff2 | Bin 0 -> 14552 bytes .../fonts/roboto-v15-latin-italic.eot | Bin 0 -> 17534 bytes .../fonts/roboto-v15-latin-italic.svg | 323 + .../fonts/roboto-v15-latin-italic.ttf | Bin 0 -> 33404 bytes .../fonts/roboto-v15-latin-italic.woff | Bin 0 -> 19880 bytes .../fonts/roboto-v15-latin-italic.woff2 | Bin 0 -> 11500 bytes .../fonts/roboto-v15-latin-regular.eot | Bin 0 -> 16227 bytes .../fonts/roboto-v15-latin-regular.svg | 308 + .../fonts/roboto-v15-latin-regular.ttf | Bin 0 -> 32652 bytes .../fonts/roboto-v15-latin-regular.woff | Bin 0 -> 18520 bytes .../fonts/roboto-v15-latin-regular.woff2 | Bin 0 -> 14584 bytes documentation/graph/dependencies.svg | 236 + .../images/compodoc-vectorise-inverted.png | Bin 0 -> 21782 bytes .../images/compodoc-vectorise-inverted.svg | 201 + documentation/images/compodoc-vectorise.png | Bin 0 -> 21325 bytes documentation/images/compodoc-vectorise.svg | 201 + .../images/coverage-badge-documentation.svg | 9 + documentation/images/favicon.ico | Bin 0 -> 1150 bytes documentation/index.html | 139 + documentation/injectables/Gallery.html | 717 + documentation/injectables/ImgManager.html | 546 + documentation/injectables/Lightbox.html | 786 + documentation/injectables/Pixabay.html | 382 + .../interfaces/BezierEasingOptions.html | 357 + documentation/interfaces/GalleryConfig.html | 2155 ++ documentation/interfaces/GalleryError.html | 270 + documentation/interfaces/GalleryItem.html | 282 + .../interfaces/GalleryItemContext.html | 571 + documentation/interfaces/GalleryState.html | 507 + .../interfaces/GalleryStateContext.html | 288 + documentation/interfaces/Hit.html | 1043 + documentation/interfaces/Hit2.html | 887 + documentation/interfaces/ImageRegistry.html | 294 + documentation/interfaces/LightboxConfig.html | 682 + documentation/interfaces/PixabayHDModel.html | 341 + documentation/interfaces/PixabayModel.html | 341 + documentation/interfaces/SliderState.html | 257 + .../interfaces/SmoothScrollOptions.html | 291 + .../interfaces/SmoothScrollStep.html | 603 + documentation/interfaces/WorkerState.html | 257 + documentation/js/compodoc.js | 14 + documentation/js/lazy-load-graphs.js | 44 + documentation/js/libs/EventDispatcher.js | 5 + documentation/js/libs/bootstrap-native.js | 2 + documentation/js/libs/clipboard.min.js | 7 + .../js/libs/custom-elements-es5-adapter.js | 15 + documentation/js/libs/custom-elements.min.js | 38 + documentation/js/libs/d3.v3.min.js | 2 + documentation/js/libs/deep-iterator.js | 2 + documentation/js/libs/es6-shim.min.js | 11 + documentation/js/libs/htmlparser.js | 23 + documentation/js/libs/innersvg.js | 9 + documentation/js/libs/lit-html.js | 1 + documentation/js/libs/prism.js | 46 + documentation/js/libs/promise.min.js | 6 + documentation/js/libs/svg-pan-zoom.min.js | 3 + documentation/js/libs/tablesort.min.js | 6 + documentation/js/libs/tablesort.number.min.js | 6 + documentation/js/libs/vis.min.js | 46 + documentation/js/libs/zepto.min.js | 2 + documentation/js/menu-wc.js | 391 + documentation/js/menu-wc_es5.js | 60 + documentation/js/menu.js | 319 + documentation/js/routes.js | 280 + documentation/js/search/lunr.min.js | 6 + documentation/js/search/search-lunr.js | 67 + documentation/js/search/search.js | 268 + documentation/js/search/search_index.js | 4 + documentation/js/sourceCode.js | 58 + documentation/js/svg-pan-zoom.controls.js | 53 + documentation/js/tabs.js | 21 + documentation/js/tree.js | 147 + documentation/license.html | 130 + documentation/miscellaneous/enumerations.html | 587 + documentation/miscellaneous/functions.html | 941 + documentation/miscellaneous/typealiases.html | 370 + documentation/miscellaneous/variables.html | 1340 + documentation/modules.html | 152 + documentation/modules/GalleryModule.html | 384 + .../modules/GalleryModule/dependencies.svg | 152 + documentation/modules/LightboxModule.html | 310 + .../modules/LightboxModule/dependencies.svg | 104 + documentation/overview.html | 418 + documentation/styles/bootstrap-card.css | 219 + documentation/styles/bootstrap.min.css | 6 + documentation/styles/compodoc.css | 1074 + documentation/styles/dark.css | 117 + documentation/styles/ionicons.min.css | 11 + documentation/styles/laravel.css | 113 + documentation/styles/material.css | 131 + documentation/styles/original.css | 51 + documentation/styles/postmark.css | 238 + documentation/styles/prism.css | 301 + documentation/styles/readthedocs.css | 117 + documentation/styles/reset.css | 129 + documentation/styles/stripe.css | 106 + documentation/styles/style.css | 7 + documentation/styles/tablesort.css | 33 + documentation/styles/vagrant.css | 130 + package-lock.json | 29595 +++++++++++----- package.json | 77 +- projects/ng-gallery-demo/server.ts | 59 + .../src/app/app.config.server.ts | 13 + .../ng-gallery-demo/src/app/app.config.ts | 42 + .../gallerize-example.component.html | 2 +- .../gallerize-example.component.ts | 4 +- .../gallery-example.component.html | 3 +- .../src/app/pages/home/home.component.html | 6 +- .../src/app/pages/lab/lab.component.html | 87 +- .../src/app/pages/lab/lab.component.ts | 41 +- .../lightbox-example.component.ts | 5 +- .../templates-example.component.html | 17 +- projects/ng-gallery-demo/src/main.server.ts | 7 + projects/ng-gallery-demo/src/main.ts | 46 +- projects/ng-gallery-demo/tsconfig.server.json | 14 + projects/ng-gallery/.storybook/colors.mdx | 33 + projects/ng-gallery/.storybook/main.ts | 18 + projects/ng-gallery/.storybook/manager.js | 6 + projects/ng-gallery/.storybook/preview.ts | 20 + .../.storybook/storybook-logo-dark.png | Bin 0 -> 3665 bytes .../ng-gallery/.storybook/storybook-logo.png | Bin 0 -> 3456 bytes projects/ng-gallery/.storybook/theme.js | 38 + projects/ng-gallery/.storybook/tsconfig.json | 11 + projects/ng-gallery/.storybook/typings.d.ts | 4 + projects/ng-gallery/README.md | 8 +- projects/ng-gallery/documentation.json | 14949 ++++++++ .../lightbox/src/gallerize.directive.ts | 24 +- projects/ng-gallery/package.json | 2 +- .../src/lib/autoplay/autoplay.directive.ts | 72 + .../lib/components/adapters/base-adapter.ts | 36 +- .../lib/components/adapters/common-adapter.ts | 56 - .../src/lib/components/adapters/index.ts | 1 - .../lib/components/adapters/main-adapters.ts | 135 +- .../lib/components/adapters/thumb-adapters.ts | 110 - ...ponent.ts => gallery-bullets.component.ts} | 18 +- .../src/lib/components/gallery-bullets.scss | 40 + .../lib/components/gallery-core.component.ts | 119 +- .../src/lib/components/gallery-core.scss | 219 + .../components/gallery-counter.component.ts | 3 +- .../src/lib/components/gallery-counter.scss | 23 + .../lib/components/gallery-item.component.ts | 93 +- .../src/lib/components/gallery-item.scss | 55 + .../lib/components/gallery-nav.component.ts | 20 +- .../src/lib/components/gallery-nav.scss | 46 + .../components/gallery-slider.component.ts | 425 +- .../src/lib/components/gallery-slider.scss | 62 + .../lib/components/gallery-thumb.component.ts | 24 +- .../src/lib/components/gallery-thumb.scss | 39 + .../components/gallery-thumbs.component.ts | 207 +- .../src/lib/components/gallery-thumbs.scss | 58 + .../src/lib/components/gallery.component.ts | 444 +- .../src/lib/components/gallery.scss | 20 + .../templates/gallery-image.component.ts | 46 +- .../components/templates/gallery-image.scss | 118 + .../lib/components/templates/items.model.ts | 2 + .../lib/gestures/hammer-sliding.directive.ts | 160 + .../lib/gestures/mouse-sliding.directive.ts | 142 + .../ng-gallery/src/lib/models/config.model.ts | 108 +- .../ng-gallery/src/lib/models/constants.ts | 9 +- .../src/lib/observers/active-item-observer.ts | 40 + .../item-intersection-observer.directive.ts | 77 + .../slider-intersection-observer.directive.ts | 67 + .../slider-resize-observer.directive.ts | 219 + .../thumb-resize-observer.directive.ts | 65 + .../src/lib/services/gallery-ref.ts | 31 +- .../src/lib/services/gallery.service.ts | 4 +- .../ng-gallery/src/lib/smooth-scroll/index.ts | 2 +- .../smooth-scroll/smooth-scroll-manager.ts | 245 - .../smooth-scroll/smooth-scroll.directive.ts | 275 + .../lib/smooth-scroll/smooth-scroll.model.ts | 17 +- projects/ng-gallery/src/lib/styles/core.scss | 163 - .../ng-gallery/src/lib/styles/counter.scss | 33 - projects/ng-gallery/src/lib/styles/debug.scss | 128 + projects/ng-gallery/src/lib/styles/dots.scss | 48 - .../ng-gallery/src/lib/styles/gallery.scss | 7 - .../src/lib/styles/navigations.scss | 52 - .../ng-gallery/src/lib/styles/slider.scss | 104 - .../ng-gallery/src/lib/styles/templates.scss | 149 - .../ng-gallery/src/lib/styles/thumbnails.scss | 148 - .../src/lib/utils/gallery.default.ts | 43 +- .../ng-gallery/src/lib/utils/img-manager.ts | 46 + .../src/lib/utils/img-recognizer.ts | 42 + .../src/lib/utils/resize-observer.ts | 18 +- .../ng-gallery/src/stories/.eslintrc.json | 5 + .../ng-gallery/src/stories/GettingStarted.mdx | 114 + projects/ng-gallery/src/stories/LoadItems.mdx | 192 + .../ng-gallery/src/stories/Responsiveness.mdx | 54 + .../ng-gallery/src/stories/basic/Bullets.mdx | 43 + .../ng-gallery/src/stories/basic/Counter.mdx | 29 + .../src/stories/basic/Gallery.stories.ts | 470 + .../src/stories/basic/Navigation.mdx | 20 + .../ng-gallery/src/stories/basic/Player.mdx | 101 + .../ng-gallery/src/stories/basic/Slider.mdx | 127 + .../src/stories/basic/Thumbnails.mdx | 89 + .../CustomTemplates.stories.ts | 119 + .../custom-templates/CustomTemplatesUsage.mdx | 144 + .../custom-template.component.ts | 46 + .../src/stories/lightbox/CustomTemplates.mdx | 48 + .../src/stories/lightbox/Gallerize.mdx | 120 + .../src/stories/lightbox/GettingStarted.mdx | 49 + .../src/stories/lightbox/Lightbox.mdx | 123 + .../src/stories/lightbox/Lightbox.stories.ts | 94 + .../src/stories/lightbox/lightbox-example.ts | 60 + .../src/stories/pixabay/pixabay.model.ts | 54 + .../src/stories/pixabay/pixabay.service.ts | 30 + 265 files changed, 107334 insertions(+), 10401 deletions(-) create mode 100644 build-storybook.log create mode 100644 documentation/changelog.html create mode 100644 documentation/classes/ActiveItemObserver.html create mode 100644 documentation/classes/GalleryRef.html create mode 100644 documentation/classes/HorizontalAdapter.html create mode 100644 documentation/classes/IframeItem.html create mode 100644 documentation/classes/ImageItem.html create mode 100644 documentation/classes/SliderAdapter.html create mode 100644 documentation/classes/VerticalAdapter.html create mode 100644 documentation/classes/VideoItem.html create mode 100644 documentation/classes/YoutubeItem.html create mode 100644 documentation/components/CustomTemplateComponent.html create mode 100644 documentation/components/GalleryComponent.html create mode 100644 documentation/components/GalleryCoreComponent.html create mode 100644 documentation/components/GalleryCounterComponent.html create mode 100644 documentation/components/GalleryDotsComponent.html create mode 100644 documentation/components/GalleryExampleComponent.html create mode 100644 documentation/components/GalleryIframeComponent.html create mode 100644 documentation/components/GalleryImageComponent.html create mode 100644 documentation/components/GalleryItemComponent.html create mode 100644 documentation/components/GalleryNavComponent.html create mode 100644 documentation/components/GallerySliderComponent.html create mode 100644 documentation/components/GalleryThumbComponent.html create mode 100644 documentation/components/GalleryThumbsComponent.html create mode 100644 documentation/components/GalleryVideoComponent.html create mode 100644 documentation/components/LightboxComponent.html create mode 100644 documentation/components/LightboxExampleComponent.html create mode 100644 documentation/coverage.html create mode 100644 documentation/dependencies.html create mode 100644 documentation/directives/AutoplayDirective.html create mode 100644 documentation/directives/GallerizeDirective.html create mode 100644 documentation/directives/GalleryBoxDef.html create mode 100644 documentation/directives/GalleryImageDef.html create mode 100644 documentation/directives/GalleryItemDef.html create mode 100644 documentation/directives/GalleryThumbDef.html create mode 100644 documentation/directives/HammerSliding.html create mode 100644 documentation/directives/ImgRecognizer.html create mode 100644 documentation/directives/ItemIntersectionObserver.html create mode 100644 documentation/directives/LightboxDirective.html create mode 100644 documentation/directives/SliderIntersectionObserver.html create mode 100644 documentation/directives/SliderResizeObserver.html create mode 100644 documentation/directives/SmoothScroll.html create mode 100644 documentation/directives/ThumbResizeObserver.html create mode 100644 documentation/fonts/ionicons.eot create mode 100644 documentation/fonts/ionicons.svg create mode 100644 documentation/fonts/ionicons.ttf create mode 100644 documentation/fonts/ionicons.woff create mode 100644 documentation/fonts/ionicons.woff2 create mode 100644 documentation/fonts/roboto-v15-latin-300.eot create mode 100644 documentation/fonts/roboto-v15-latin-300.svg create mode 100644 documentation/fonts/roboto-v15-latin-300.ttf create mode 100644 documentation/fonts/roboto-v15-latin-300.woff create mode 100644 documentation/fonts/roboto-v15-latin-300.woff2 create mode 100644 documentation/fonts/roboto-v15-latin-700.eot create mode 100644 documentation/fonts/roboto-v15-latin-700.svg create mode 100644 documentation/fonts/roboto-v15-latin-700.ttf create mode 100644 documentation/fonts/roboto-v15-latin-700.woff create mode 100644 documentation/fonts/roboto-v15-latin-700.woff2 create mode 100644 documentation/fonts/roboto-v15-latin-italic.eot create mode 100644 documentation/fonts/roboto-v15-latin-italic.svg create mode 100644 documentation/fonts/roboto-v15-latin-italic.ttf create mode 100644 documentation/fonts/roboto-v15-latin-italic.woff create mode 100644 documentation/fonts/roboto-v15-latin-italic.woff2 create mode 100644 documentation/fonts/roboto-v15-latin-regular.eot create mode 100644 documentation/fonts/roboto-v15-latin-regular.svg create mode 100644 documentation/fonts/roboto-v15-latin-regular.ttf create mode 100644 documentation/fonts/roboto-v15-latin-regular.woff create mode 100644 documentation/fonts/roboto-v15-latin-regular.woff2 create mode 100644 documentation/graph/dependencies.svg create mode 100644 documentation/images/compodoc-vectorise-inverted.png create mode 100644 documentation/images/compodoc-vectorise-inverted.svg create mode 100644 documentation/images/compodoc-vectorise.png create mode 100644 documentation/images/compodoc-vectorise.svg create mode 100644 documentation/images/coverage-badge-documentation.svg create mode 100644 documentation/images/favicon.ico create mode 100644 documentation/index.html create mode 100644 documentation/injectables/Gallery.html create mode 100644 documentation/injectables/ImgManager.html create mode 100644 documentation/injectables/Lightbox.html create mode 100644 documentation/injectables/Pixabay.html create mode 100644 documentation/interfaces/BezierEasingOptions.html create mode 100644 documentation/interfaces/GalleryConfig.html create mode 100644 documentation/interfaces/GalleryError.html create mode 100644 documentation/interfaces/GalleryItem.html create mode 100644 documentation/interfaces/GalleryItemContext.html create mode 100644 documentation/interfaces/GalleryState.html create mode 100644 documentation/interfaces/GalleryStateContext.html create mode 100644 documentation/interfaces/Hit.html create mode 100644 documentation/interfaces/Hit2.html create mode 100644 documentation/interfaces/ImageRegistry.html create mode 100644 documentation/interfaces/LightboxConfig.html create mode 100644 documentation/interfaces/PixabayHDModel.html create mode 100644 documentation/interfaces/PixabayModel.html create mode 100644 documentation/interfaces/SliderState.html create mode 100644 documentation/interfaces/SmoothScrollOptions.html create mode 100644 documentation/interfaces/SmoothScrollStep.html create mode 100644 documentation/interfaces/WorkerState.html create mode 100644 documentation/js/compodoc.js create mode 100644 documentation/js/lazy-load-graphs.js create mode 100644 documentation/js/libs/EventDispatcher.js create mode 100644 documentation/js/libs/bootstrap-native.js create mode 100644 documentation/js/libs/clipboard.min.js create mode 100644 documentation/js/libs/custom-elements-es5-adapter.js create mode 100644 documentation/js/libs/custom-elements.min.js create mode 100644 documentation/js/libs/d3.v3.min.js create mode 100644 documentation/js/libs/deep-iterator.js create mode 100644 documentation/js/libs/es6-shim.min.js create mode 100644 documentation/js/libs/htmlparser.js create mode 100644 documentation/js/libs/innersvg.js create mode 100644 documentation/js/libs/lit-html.js create mode 100644 documentation/js/libs/prism.js create mode 100644 documentation/js/libs/promise.min.js create mode 100644 documentation/js/libs/svg-pan-zoom.min.js create mode 100644 documentation/js/libs/tablesort.min.js create mode 100644 documentation/js/libs/tablesort.number.min.js create mode 100644 documentation/js/libs/vis.min.js create mode 100644 documentation/js/libs/zepto.min.js create mode 100644 documentation/js/menu-wc.js create mode 100644 documentation/js/menu-wc_es5.js create mode 100644 documentation/js/menu.js create mode 100644 documentation/js/routes.js create mode 100644 documentation/js/search/lunr.min.js create mode 100644 documentation/js/search/search-lunr.js create mode 100644 documentation/js/search/search.js create mode 100644 documentation/js/search/search_index.js create mode 100644 documentation/js/sourceCode.js create mode 100644 documentation/js/svg-pan-zoom.controls.js create mode 100644 documentation/js/tabs.js create mode 100644 documentation/js/tree.js create mode 100644 documentation/license.html create mode 100644 documentation/miscellaneous/enumerations.html create mode 100644 documentation/miscellaneous/functions.html create mode 100644 documentation/miscellaneous/typealiases.html create mode 100644 documentation/miscellaneous/variables.html create mode 100644 documentation/modules.html create mode 100644 documentation/modules/GalleryModule.html create mode 100644 documentation/modules/GalleryModule/dependencies.svg create mode 100644 documentation/modules/LightboxModule.html create mode 100644 documentation/modules/LightboxModule/dependencies.svg create mode 100644 documentation/overview.html create mode 100644 documentation/styles/bootstrap-card.css create mode 100644 documentation/styles/bootstrap.min.css create mode 100644 documentation/styles/compodoc.css create mode 100644 documentation/styles/dark.css create mode 100644 documentation/styles/ionicons.min.css create mode 100644 documentation/styles/laravel.css create mode 100644 documentation/styles/material.css create mode 100644 documentation/styles/original.css create mode 100644 documentation/styles/postmark.css create mode 100644 documentation/styles/prism.css create mode 100644 documentation/styles/readthedocs.css create mode 100644 documentation/styles/reset.css create mode 100644 documentation/styles/stripe.css create mode 100644 documentation/styles/style.css create mode 100644 documentation/styles/tablesort.css create mode 100644 documentation/styles/vagrant.css create mode 100644 projects/ng-gallery-demo/server.ts create mode 100644 projects/ng-gallery-demo/src/app/app.config.server.ts create mode 100644 projects/ng-gallery-demo/src/app/app.config.ts create mode 100644 projects/ng-gallery-demo/src/main.server.ts create mode 100644 projects/ng-gallery-demo/tsconfig.server.json create mode 100644 projects/ng-gallery/.storybook/colors.mdx create mode 100644 projects/ng-gallery/.storybook/main.ts create mode 100644 projects/ng-gallery/.storybook/manager.js create mode 100644 projects/ng-gallery/.storybook/preview.ts create mode 100644 projects/ng-gallery/.storybook/storybook-logo-dark.png create mode 100644 projects/ng-gallery/.storybook/storybook-logo.png create mode 100644 projects/ng-gallery/.storybook/theme.js create mode 100644 projects/ng-gallery/.storybook/tsconfig.json create mode 100644 projects/ng-gallery/.storybook/typings.d.ts create mode 100644 projects/ng-gallery/documentation.json create mode 100644 projects/ng-gallery/src/lib/autoplay/autoplay.directive.ts delete mode 100644 projects/ng-gallery/src/lib/components/adapters/common-adapter.ts delete mode 100644 projects/ng-gallery/src/lib/components/adapters/thumb-adapters.ts rename projects/ng-gallery/src/lib/components/{gallery-dots.component.ts => gallery-bullets.component.ts} (60%) create mode 100644 projects/ng-gallery/src/lib/components/gallery-bullets.scss create mode 100644 projects/ng-gallery/src/lib/components/gallery-core.scss create mode 100644 projects/ng-gallery/src/lib/components/gallery-counter.scss create mode 100644 projects/ng-gallery/src/lib/components/gallery-item.scss create mode 100644 projects/ng-gallery/src/lib/components/gallery-nav.scss create mode 100644 projects/ng-gallery/src/lib/components/gallery-slider.scss create mode 100644 projects/ng-gallery/src/lib/components/gallery-thumb.scss create mode 100644 projects/ng-gallery/src/lib/components/gallery-thumbs.scss create mode 100644 projects/ng-gallery/src/lib/components/gallery.scss create mode 100644 projects/ng-gallery/src/lib/components/templates/gallery-image.scss create mode 100644 projects/ng-gallery/src/lib/gestures/hammer-sliding.directive.ts create mode 100644 projects/ng-gallery/src/lib/gestures/mouse-sliding.directive.ts create mode 100644 projects/ng-gallery/src/lib/observers/active-item-observer.ts create mode 100644 projects/ng-gallery/src/lib/observers/item-intersection-observer.directive.ts create mode 100644 projects/ng-gallery/src/lib/observers/slider-intersection-observer.directive.ts create mode 100644 projects/ng-gallery/src/lib/observers/slider-resize-observer.directive.ts create mode 100644 projects/ng-gallery/src/lib/observers/thumb-resize-observer.directive.ts delete mode 100644 projects/ng-gallery/src/lib/smooth-scroll/smooth-scroll-manager.ts create mode 100644 projects/ng-gallery/src/lib/smooth-scroll/smooth-scroll.directive.ts delete mode 100644 projects/ng-gallery/src/lib/styles/core.scss delete mode 100644 projects/ng-gallery/src/lib/styles/counter.scss create mode 100644 projects/ng-gallery/src/lib/styles/debug.scss delete mode 100644 projects/ng-gallery/src/lib/styles/dots.scss delete mode 100644 projects/ng-gallery/src/lib/styles/gallery.scss delete mode 100644 projects/ng-gallery/src/lib/styles/navigations.scss delete mode 100644 projects/ng-gallery/src/lib/styles/slider.scss delete mode 100644 projects/ng-gallery/src/lib/styles/templates.scss delete mode 100644 projects/ng-gallery/src/lib/styles/thumbnails.scss create mode 100644 projects/ng-gallery/src/lib/utils/img-manager.ts create mode 100644 projects/ng-gallery/src/lib/utils/img-recognizer.ts create mode 100644 projects/ng-gallery/src/stories/.eslintrc.json create mode 100644 projects/ng-gallery/src/stories/GettingStarted.mdx create mode 100644 projects/ng-gallery/src/stories/LoadItems.mdx create mode 100644 projects/ng-gallery/src/stories/Responsiveness.mdx create mode 100644 projects/ng-gallery/src/stories/basic/Bullets.mdx create mode 100644 projects/ng-gallery/src/stories/basic/Counter.mdx create mode 100644 projects/ng-gallery/src/stories/basic/Gallery.stories.ts create mode 100644 projects/ng-gallery/src/stories/basic/Navigation.mdx create mode 100644 projects/ng-gallery/src/stories/basic/Player.mdx create mode 100644 projects/ng-gallery/src/stories/basic/Slider.mdx create mode 100644 projects/ng-gallery/src/stories/basic/Thumbnails.mdx create mode 100644 projects/ng-gallery/src/stories/custom-templates/CustomTemplates.stories.ts create mode 100644 projects/ng-gallery/src/stories/custom-templates/CustomTemplatesUsage.mdx create mode 100644 projects/ng-gallery/src/stories/custom-templates/custom-template.component.ts create mode 100644 projects/ng-gallery/src/stories/lightbox/CustomTemplates.mdx create mode 100644 projects/ng-gallery/src/stories/lightbox/Gallerize.mdx create mode 100644 projects/ng-gallery/src/stories/lightbox/GettingStarted.mdx create mode 100644 projects/ng-gallery/src/stories/lightbox/Lightbox.mdx create mode 100644 projects/ng-gallery/src/stories/lightbox/Lightbox.stories.ts create mode 100644 projects/ng-gallery/src/stories/lightbox/lightbox-example.ts create mode 100644 projects/ng-gallery/src/stories/pixabay/pixabay.model.ts create mode 100644 projects/ng-gallery/src/stories/pixabay/pixabay.service.ts diff --git a/CHANGELOG.md b/CHANGELOG.md index a4b89cfa..9ee9a722 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,8 +1,79 @@ # Changelog +## 12.0.0-beta.0 + +> See the [storybook documentation](https://ngx-gallery-next.netlify.app/) + +- feat: Add RTL support, closes [#540](https://github.com/MurhafSousli/ngx-gallery/issues/540). +- All boolean inputs of `` components can be used as string attributes + - e.g. ``, `` and `` sets the option's value to true. + - e.g. `` and `` sets the option's value to false. +- All number inputs of `` components can be used as string attributes + - e.g. `` and `` sets the option's value to 2000 + +**Improved performance** + +- refactor: Replace the scroll event with intersection observer to detect the active item while scrolling. + +**ItemAutoSize, ThumbAutoSize features** + +- enhance: Toggling `itemAutoSize` option is now reactive. +- fix: `[thumbAutosize]` causes random invalid starting thumbnail scroller position when scrolling possible, closes [#521](https://github.com/MurhafSousli/ngx-gallery/issues/521) +- fix: `[ItemAutosize]` in website/safari browsers do not work as expected, closes [#543](https://github.com/MurhafSousli/ngx-gallery/issues/543) + +**AutoHeight feature** + +- enhance: Auto-height feature is not more precise and works well with or without height transition +- fix: Auto-height issue when screen size changes + +**Autoplay feature** + +- fix: `autoplay` resets the timer after navigated. +- fix: `autoplay` only start the timer after the image is loaded. + +**Bullets (previously named 'Dots')** + +- feat: `disableBullets` disable bullets' clicks + +**Custom template** + +- feature: Introduce `galleryImage` directive within `galleryItemDef`, to allow recognizing the img element in your custom item template. + +### Breaking changes + +#### Options renamed: + +**Core** +- `slidingDirection` → `orientation` +- `slidingEase` → `scrollEase` +- `slidingDuration` → `scrollDuration` +- `slidingDisabled` → `disableScroll` +- `mouseSlidingDisabled` → `disableMouseScroll` +- `autoPlay` → `autoplay` + +**Thumbs** +- `thumb` → `thumbs` +- `thumbMode` → `thumbCentralized` +- `thumbMode` → `thumbCentralized` +- `thumbDetached` → `detachThumbs` +- `thumbSlidingDisabled` → `disableThumbMouseScroll` +- `thumbMouseSlidingDisabled` → `disableThumbMouseScroll` + +**Bullets** +- `dots` → `bullets` +- `dotSize` → `bulletSize` +- `dotPosition` → `bulletPosition` + +#### Input removed (no longer exist) + +- `navScrollBehavior` the option is now removed, use `scrollBehavior` instead. + + +*** + ## 11.0.0 -- feat: Add `GalleryThumbDef`, `GalleryImageDef`, `GalleryItemDef`, `GalleryBoxDef` to set custom templates. +- feat: Add `galleryThumbDef`, `galleryImageDef`, `galleryItemDef`, `galleryBoxDef` to set custom templates, closes [#487](https://github.com/MurhafSousli/ngx-gallery/issues/487). - feat: Add `imageTemplate` property to `GalleryConfig`. - feat: Add `args` property in case need to attach extra data with the gallery item. - enhance: Improve overall typings. @@ -290,7 +361,7 @@ export class FeatureModule { } - **feat(core):** Add indeterminate option to the radial progress, in [df682c4](https://github.com/MurhafSousli/ngx-gallery/pull/233/commits/df682c4353f3795dd3f45f53dfa488b428fdb99f). - **enhance(core):** Enhance thumbnails loading styles, in [f34f90a](https://github.com/MurhafSousli/ngx-gallery/pull/233/commits/f34f90a542aa437fa12b996dc77f6b7dd9fd819c). -- **fix(core):** Expose `[dotSize]`, `[dotsPosition]` and `[counterPosition]` options as inputs, in [946a856](https://github.com/MurhafSousli/ngx-gallery/pull/233/commits/946a85618acdc91692183f8f65765bbd137815cc). +- **fix(core):** Expose `[dotSize]`, `[bulletsPosition]` and `[counterPosition]` options as inputs, in [946a856](https://github.com/MurhafSousli/ngx-gallery/pull/233/commits/946a85618acdc91692183f8f65765bbd137815cc). - **fix(core):** Add `[loadingMode]` option to gallery images which accepts `determinate` or `indeterminate` , in [e8bdfb2](https://github.com/MurhafSousli/ngx-gallery/pull/233/commits/e8bdfb2a28d485e3d89290dda1edb595ae3efecf). - **regression(core):** Fix undisplayed thumb image when a custom thumb template is used, in [34f2cc6](https://github.com/MurhafSousli/ngx-gallery/pull/233/commits/34f2cc6f7f5316a929a1efc2ceb6bde8d42d0551). - **enhance(gallerize):** Run gallerize detector outside angular zone, makes opening the lightbox smoother, in [284925d](https://github.com/MurhafSousli/ngx-gallery/pull/233/commits/284925dd53a67e6a2a2d0b208a30623783db37bc) and [98901b9](https://github.com/MurhafSousli/ngx-gallery/pull/233/commits/98901b9136b4405a5d549fed08a36ec654279a26). @@ -298,7 +369,7 @@ export class FeatureModule { } ## 4.0.0-beta.0 - **update(core, lightbox, gallerize)**: Update peer dependencies, closes [#228](https://github.com/MurhafSousli/ngx-gallery/issues/228) in [bd8cdd3](https://github.com/MurhafSousli/ngx-gallery/pull/231/commits/bd8cdd302c55e285dc32a195e1d5f70b4312ac46). -- **feat(core):** Add `dotsPosition` option, closes [#211](https://github.com/MurhafSousli/ngx-gallery/issues/211) in [263d297](https://github.com/MurhafSousli/ngx-gallery/pull/231/commits/263d297ccc27692fc9fd9702f775dcf2b753d5de). +- **feat(core):** Add `bulletsPosition` option, closes [#211](https://github.com/MurhafSousli/ngx-gallery/issues/211) in [263d297](https://github.com/MurhafSousli/ngx-gallery/pull/231/commits/263d297ccc27692fc9fd9702f775dcf2b753d5de). - **feat(core):** Add `dotsSize` option, in [e2e58b6](https://github.com/MurhafSousli/ngx-gallery/pull/231/commits/e2e58b62e4eb3cbcf5dd6f17417830bfc956f7eb). - **feat(core):** Add `counterPosition` option, closes in [ce7a8ad](https://github.com/MurhafSousli/ngx-gallery/pull/231/commits/ce7a8ad62816b3ba344a22e6e459cfdb06ad18ab). - **feat(core):** Use `HttpClient` to load and cache images in `[lazyImage]` directive, in [15c3e88](https://github.com/MurhafSousli/ngx-gallery/pull/231/commits/15c3e88d89434eb4860eabf3959a08ce746298e7). diff --git a/README.md b/README.md index 59cac248..8a758cff 100644 --- a/README.md +++ b/README.md @@ -16,7 +16,13 @@ ___ -### The documentation is available at the [wiki page](https://github.com/MurhafSousli/ngx-gallery/wiki) 📚 +### Explore ngx-gallery Documentation + +- **For stable version (v11):** Visit our [wiki page](https://github.com/MurhafSousli/ngx-gallery/wiki) 📚. + +- **For the latest features (v12 Beta):** Check out our [storybook documentation](https://ngx-gallery-next.netlify.app/) + +We value your feedback and appreciate your support in testing this beta release! ___ diff --git a/angular.json b/angular.json index 9a314c23..02efefc8 100644 --- a/angular.json +++ b/angular.json @@ -28,6 +28,38 @@ "tsConfig": "projects/ng-gallery/tsconfig.spec.json", "karmaConfig": "projects/ng-gallery/karma.conf.js" } + }, + "storybook": { + "builder": "@storybook/angular:start-storybook", + "options": { + "configDir": "projects/ng-gallery/.storybook", + "browserTarget": "ng-gallery:build", + "styles": ["@angular/cdk/overlay-prebuilt.css"], + "compodoc": true, + "compodocArgs": [ + "-e", + "json", + "-d", + "projects/ng-gallery" + ], + "port": 6006 + } + }, + "build-storybook": { + "builder": "@storybook/angular:build-storybook", + "options": { + "configDir": "projects/ng-gallery/.storybook", + "browserTarget": "ng-gallery:build", + "styles": ["@angular/cdk/overlay-prebuilt.css"], + "compodoc": true, + "compodocArgs": [ + "-e", + "json", + "-d", + "projects/ng-gallery" + ], + "outputDir": "dist/storybook/ng-gallery" + } } } }, @@ -45,7 +77,7 @@ "build": { "builder": "@angular-devkit/build-angular:browser", "options": { - "outputPath": "dist/ng-gallery-demo", + "outputPath": "dist/ng-gallery-demo/browser", "index": "projects/ng-gallery-demo/src/index.html", "main": "projects/ng-gallery-demo/src/main.ts", "polyfills": "projects/ng-gallery-demo/src/polyfills.ts", @@ -147,6 +179,69 @@ "devServerTarget": "ng-gallery-demo:serve:production" } } + }, + "server": { + "builder": "@angular-devkit/build-angular:server", + "options": { + "outputPath": "dist/ng-gallery-demo/server", + "main": "projects/ng-gallery-demo/server.ts", + "tsConfig": "projects/ng-gallery-demo/tsconfig.server.json", + "buildOptimizer": false, + "optimization": false, + "sourceMap": true, + "extractLicenses": false, + "vendorChunk": true + }, + "configurations": { + "production": { + "buildOptimizer": true, + "outputHashing": "media", + "fileReplacements": [ + { + "replace": "projects/ng-gallery-demo/src/environments/environment.ts", + "with": "projects/ng-gallery-demo/src/environments/environment.prod.ts" + } + ], + "optimization": true, + "sourceMap": false, + "extractLicenses": true, + "vendorChunk": false + } + }, + "defaultConfiguration": "production" + }, + "serve-ssr": { + "builder": "@nguniversal/builders:ssr-dev-server", + "configurations": { + "development": { + "browserTarget": "ng-gallery-demo:build", + "serverTarget": "ng-gallery-demo:server" + }, + "production": { + "browserTarget": "ng-gallery-demo:build:production", + "serverTarget": "ng-gallery-demo:server:production" + } + }, + "defaultConfiguration": "development" + }, + "prerender": { + "builder": "@nguniversal/builders:prerender", + "options": { + "routes": [ + "/" + ] + }, + "configurations": { + "production": { + "browserTarget": "ng-gallery-demo:build:production", + "serverTarget": "ng-gallery-demo:server:production" + }, + "development": { + "browserTarget": "ng-gallery-demo:build:development", + "serverTarget": "ng-gallery-demo:server:development" + } + }, + "defaultConfiguration": "production" } } } diff --git a/build-storybook.log b/build-storybook.log new file mode 100644 index 00000000..483b4491 --- /dev/null +++ b/build-storybook.log @@ -0,0 +1,807 @@ + +> ng-gallery-project@0.0.0 build-storybook +> ng run ng-gallery:build-storybook --output-dir C:\Users\Murhaf\AppData\Local\Temp\chromatic--28884-PtdM9I0wjZqE + + +                                                                         +                                                                         +                                                                         +                                                                                  +                                                                            +                                                                            +                                                                            +                                                                                  +                                               +                                               +                                               + +1.1.21 + +TypeScript version used by Compodoc : 5.0.2 + +TypeScript version of current project : 5.0.4 + +Node.js version : v20.2.0 + +Operating system : Windows 10 + +[06:13:25] No configuration file found, switching to CLI flags. +[06:13:25] Using tsconfig file : C:\Users\Murhaf\Desktop\Projects\ngx-gallery\projects\ng-gallery\.storybook\tsconfig.json +[06:13:25] Including : C:/Users/Murhaf/Desktop/Projects/ngx-gallery/projects/ng-gallery/.storybook/preview.ts +[06:13:25] Including : C:/Users/Murhaf/Desktop/Projects/ngx-gallery/projects/ng-gallery/src/public-api.ts +[06:13:25] Including : C:/Users/Murhaf/Desktop/Projects/ngx-gallery/projects/ng-gallery/src/lib/gallery.module.ts +[06:13:25] Excluding : C:/Users/Murhaf/Desktop/Projects/ngx-gallery/projects/ng-gallery/src/stories/Configure.mdx +[06:13:25] Excluding : C:/Users/Murhaf/Desktop/Projects/ngx-gallery/projects/ng-gallery/src/stories/GettingStarted.mdx +[06:13:25] Including : C:/Users/Murhaf/Desktop/Projects/ngx-gallery/projects/ng-gallery/src/lib/components/gallery-core.component.ts +[06:13:25] Excluding : C:/Users/Murhaf/Desktop/Projects/ngx-gallery/projects/ng-gallery/src/lib/components/gallery-core.scss +[06:13:25] Including : C:/Users/Murhaf/Desktop/Projects/ngx-gallery/projects/ng-gallery/src/lib/components/gallery-counter.component.ts +[06:13:25] Excluding : C:/Users/Murhaf/Desktop/Projects/ngx-gallery/projects/ng-gallery/src/lib/components/gallery-counter.scss +[06:13:25] Including : C:/Users/Murhaf/Desktop/Projects/ngx-gallery/projects/ng-gallery/src/lib/components/gallery-bullets.component.ts +[06:13:25] Excluding : C:/Users/Murhaf/Desktop/Projects/ngx-gallery/projects/ng-gallery/src/lib/components/gallery-dots.scss +[06:13:25] Including : C:/Users/Murhaf/Desktop/Projects/ngx-gallery/projects/ng-gallery/src/lib/components/gallery-item.component.ts +[06:13:25] Excluding : C:/Users/Murhaf/Desktop/Projects/ngx-gallery/projects/ng-gallery/src/lib/components/gallery-item.scss +[06:13:25] Including : C:/Users/Murhaf/Desktop/Projects/ngx-gallery/projects/ng-gallery/src/lib/components/gallery-nav.component.ts +[06:13:25] Excluding : C:/Users/Murhaf/Desktop/Projects/ngx-gallery/projects/ng-gallery/src/lib/components/gallery-nav.scss +[06:13:25] Including : C:/Users/Murhaf/Desktop/Projects/ngx-gallery/projects/ng-gallery/src/lib/components/gallery-slider.component.ts +[06:13:25] Excluding : C:/Users/Murhaf/Desktop/Projects/ngx-gallery/projects/ng-gallery/src/lib/components/gallery-slider.scss +[06:13:25] Including : C:/Users/Murhaf/Desktop/Projects/ngx-gallery/projects/ng-gallery/src/lib/components/gallery-thumb.component.ts +[06:13:25] Excluding : C:/Users/Murhaf/Desktop/Projects/ngx-gallery/projects/ng-gallery/src/lib/components/gallery-thumb.scss +[06:13:25] Including : C:/Users/Murhaf/Desktop/Projects/ngx-gallery/projects/ng-gallery/src/lib/components/gallery-thumbs.component.ts +[06:13:25] Excluding : C:/Users/Murhaf/Desktop/Projects/ngx-gallery/projects/ng-gallery/src/lib/components/gallery-thumbs.scss +[06:13:25] Including : C:/Users/Murhaf/Desktop/Projects/ngx-gallery/projects/ng-gallery/src/lib/components/gallery.component.ts +[06:13:25] Excluding : C:/Users/Murhaf/Desktop/Projects/ngx-gallery/projects/ng-gallery/src/lib/components/gallery.scss +[06:13:25] Including : C:/Users/Murhaf/Desktop/Projects/ngx-gallery/projects/ng-gallery/src/lib/autoplay/autoplay.directive.ts +[06:13:25] Including : C:/Users/Murhaf/Desktop/Projects/ngx-gallery/projects/ng-gallery/src/lib/directives/gallery-box-def.directive.ts +[06:13:25] Including : C:/Users/Murhaf/Desktop/Projects/ngx-gallery/projects/ng-gallery/src/lib/directives/gallery-image-def.directive.ts +[06:13:25] Including : C:/Users/Murhaf/Desktop/Projects/ngx-gallery/projects/ng-gallery/src/lib/directives/gallery-item-def.directive.ts +[06:13:25] Including : C:/Users/Murhaf/Desktop/Projects/ngx-gallery/projects/ng-gallery/src/lib/directives/gallery-thumb-def.directive.ts +[06:13:25] Including : C:/Users/Murhaf/Desktop/Projects/ngx-gallery/projects/ng-gallery/src/lib/gestures/hammer-sliding.directive.ts +[06:13:25] Including : C:/Users/Murhaf/Desktop/Projects/ngx-gallery/projects/ng-gallery/src/lib/gestures/mouse-sliding.directive.ts +[06:13:25] Including : C:/Users/Murhaf/Desktop/Projects/ngx-gallery/projects/ng-gallery/src/lib/models/config.model.ts +[06:13:25] Including : C:/Users/Murhaf/Desktop/Projects/ngx-gallery/projects/ng-gallery/src/lib/models/constants.ts +[06:13:25] Including : C:/Users/Murhaf/Desktop/Projects/ngx-gallery/projects/ng-gallery/src/lib/models/gallery.model.ts +[06:13:25] Including : C:/Users/Murhaf/Desktop/Projects/ngx-gallery/projects/ng-gallery/src/lib/models/slider.model.ts +[06:13:25] Including : C:/Users/Murhaf/Desktop/Projects/ngx-gallery/projects/ng-gallery/src/lib/models/styles.model.ts +[06:13:25] Including : C:/Users/Murhaf/Desktop/Projects/ngx-gallery/projects/ng-gallery/src/lib/services/gallery-ref.ts +[06:13:25] Including : C:/Users/Murhaf/Desktop/Projects/ngx-gallery/projects/ng-gallery/src/lib/services/gallery.service.ts +[06:13:25] Including : C:/Users/Murhaf/Desktop/Projects/ngx-gallery/projects/ng-gallery/src/lib/observers/active-item-observer.ts +[06:13:25] Including : C:/Users/Murhaf/Desktop/Projects/ngx-gallery/projects/ng-gallery/src/lib/observers/item-intersection-observer.directive.ts +[06:13:25] Including : C:/Users/Murhaf/Desktop/Projects/ngx-gallery/projects/ng-gallery/src/lib/observers/slider-intersection-observer.directive.ts +[06:13:25] Including : C:/Users/Murhaf/Desktop/Projects/ngx-gallery/projects/ng-gallery/src/lib/observers/slider-resize-observer.directive.ts +[06:13:25] Including : C:/Users/Murhaf/Desktop/Projects/ngx-gallery/projects/ng-gallery/src/lib/observers/thumb-resize-observer.directive.ts +[06:13:25] Including : C:/Users/Murhaf/Desktop/Projects/ngx-gallery/projects/ng-gallery/src/lib/smooth-scroll/bezier-easing.ts +[06:13:25] Including : C:/Users/Murhaf/Desktop/Projects/ngx-gallery/projects/ng-gallery/src/lib/smooth-scroll/index.ts +[06:13:25] Including : C:/Users/Murhaf/Desktop/Projects/ngx-gallery/projects/ng-gallery/src/lib/smooth-scroll/smooth-scroll.directive.ts +[06:13:25] Including : C:/Users/Murhaf/Desktop/Projects/ngx-gallery/projects/ng-gallery/src/lib/smooth-scroll/smooth-scroll.model.ts +[06:13:25] Excluding : C:/Users/Murhaf/Desktop/Projects/ngx-gallery/projects/ng-gallery/src/lib/styles/debug.scss +[06:13:25] Including : C:/Users/Murhaf/Desktop/Projects/ngx-gallery/projects/ng-gallery/src/lib/utils/gallery.default.ts +[06:13:25] Including : C:/Users/Murhaf/Desktop/Projects/ngx-gallery/projects/ng-gallery/src/lib/utils/img-manager.ts +[06:13:25] Including : C:/Users/Murhaf/Desktop/Projects/ngx-gallery/projects/ng-gallery/src/lib/utils/img-recognizer.ts +[06:13:25] Including : C:/Users/Murhaf/Desktop/Projects/ngx-gallery/projects/ng-gallery/src/lib/utils/resize-observer.ts +[06:13:25] Excluding : C:/Users/Murhaf/Desktop/Projects/ngx-gallery/projects/ng-gallery/src/stories/assets/accessibility.png +[06:13:25] Excluding : C:/Users/Murhaf/Desktop/Projects/ngx-gallery/projects/ng-gallery/src/stories/assets/accessibility.svg +[06:13:25] Excluding : C:/Users/Murhaf/Desktop/Projects/ngx-gallery/projects/ng-gallery/src/stories/assets/addon-library.png +[06:13:25] Excluding : C:/Users/Murhaf/Desktop/Projects/ngx-gallery/projects/ng-gallery/src/stories/assets/assets.png +[06:13:25] Excluding : C:/Users/Murhaf/Desktop/Projects/ngx-gallery/projects/ng-gallery/src/stories/assets/context.png +[06:13:25] Excluding : C:/Users/Murhaf/Desktop/Projects/ngx-gallery/projects/ng-gallery/src/stories/assets/discord.svg +[06:13:25] Excluding : C:/Users/Murhaf/Desktop/Projects/ngx-gallery/projects/ng-gallery/src/stories/assets/docs.png +[06:13:25] Excluding : C:/Users/Murhaf/Desktop/Projects/ngx-gallery/projects/ng-gallery/src/stories/assets/figma-plugin.png +[06:13:25] Excluding : C:/Users/Murhaf/Desktop/Projects/ngx-gallery/projects/ng-gallery/src/stories/assets/github.svg +[06:13:25] Excluding : C:/Users/Murhaf/Desktop/Projects/ngx-gallery/projects/ng-gallery/src/stories/assets/lightbox.png +[06:13:25] Excluding : C:/Users/Murhaf/Desktop/Projects/ngx-gallery/projects/ng-gallery/src/stories/assets/share.png +[06:13:25] Excluding : C:/Users/Murhaf/Desktop/Projects/ngx-gallery/projects/ng-gallery/src/stories/assets/styling.png +[06:13:25] Excluding : C:/Users/Murhaf/Desktop/Projects/ngx-gallery/projects/ng-gallery/src/stories/assets/testing.png +[06:13:25] Excluding : C:/Users/Murhaf/Desktop/Projects/ngx-gallery/projects/ng-gallery/src/stories/assets/theming.png +[06:13:25] Excluding : C:/Users/Murhaf/Desktop/Projects/ngx-gallery/projects/ng-gallery/src/stories/assets/tutorials.svg +[06:13:25] Excluding : C:/Users/Murhaf/Desktop/Projects/ngx-gallery/projects/ng-gallery/src/stories/assets/youtube.svg +[06:13:25] Including : C:/Users/Murhaf/Desktop/Projects/ngx-gallery/projects/ng-gallery/src/stories/basic/gallery-example.component.ts +[06:13:25] Including : C:/Users/Murhaf/Desktop/Projects/ngx-gallery/projects/ng-gallery/src/stories/basic/Gallery.stories.ts +[06:13:25] Excluding : C:/Users/Murhaf/Desktop/Projects/ngx-gallery/projects/ng-gallery/src/stories/basic/GalleryDocs.mdx +[06:13:25] Including : C:/Users/Murhaf/Desktop/Projects/ngx-gallery/projects/ng-gallery/src/stories/custom-templates/custom-template.component.ts +[06:13:25] Excluding : C:/Users/Murhaf/Desktop/Projects/ngx-gallery/projects/ng-gallery/src/stories/custom-templates/CustomTemplates.mdx +[06:13:25] Including : C:/Users/Murhaf/Desktop/Projects/ngx-gallery/projects/ng-gallery/src/stories/custom-templates/CustomTemplates.stories.ts +[06:13:25] Including : C:/Users/Murhaf/Desktop/Projects/ngx-gallery/projects/ng-gallery/src/stories/lightbox/lightbox-example.component.ts +[06:13:25] Excluding : C:/Users/Murhaf/Desktop/Projects/ngx-gallery/projects/ng-gallery/src/stories/lightbox/Lightbox.mdx +[06:13:25] Including : C:/Users/Murhaf/Desktop/Projects/ngx-gallery/projects/ng-gallery/src/stories/lightbox/Lightbox.stories.ts +[06:13:25] Including : C:/Users/Murhaf/Desktop/Projects/ngx-gallery/projects/ng-gallery/src/stories/pixabay/pixabay.model.ts +[06:13:25] Including : C:/Users/Murhaf/Desktop/Projects/ngx-gallery/projects/ng-gallery/src/stories/pixabay/pixabay.service.ts +[06:13:25] Including : C:/Users/Murhaf/Desktop/Projects/ngx-gallery/projects/ng-gallery/src/lib/components/adapters/base-adapter.ts +[06:13:25] Including : C:/Users/Murhaf/Desktop/Projects/ngx-gallery/projects/ng-gallery/src/lib/components/adapters/index.ts +[06:13:25] Including : C:/Users/Murhaf/Desktop/Projects/ngx-gallery/projects/ng-gallery/src/lib/components/adapters/main-adapters.ts +[06:13:25] Including : C:/Users/Murhaf/Desktop/Projects/ngx-gallery/projects/ng-gallery/src/lib/components/templates/gallery-iframe.component.ts +[06:13:25] Including : C:/Users/Murhaf/Desktop/Projects/ngx-gallery/projects/ng-gallery/src/lib/components/templates/gallery-image.component.ts +[06:13:25] Excluding : C:/Users/Murhaf/Desktop/Projects/ngx-gallery/projects/ng-gallery/src/lib/components/templates/gallery-image.scss +[06:13:25] Including : C:/Users/Murhaf/Desktop/Projects/ngx-gallery/projects/ng-gallery/src/lib/components/templates/gallery-video.component.ts +[06:13:25] Including : C:/Users/Murhaf/Desktop/Projects/ngx-gallery/projects/ng-gallery/src/lib/components/templates/items.model.ts +[06:13:25] Including : C:/Users/Murhaf/Desktop/Projects/ngx-gallery/projects/ng-gallery/src/lib/components/templates/svg-assets.ts +[06:13:25] Searching package.json file +[06:13:25] package.json file found +[06:13:25] Processing package.json dependencies +[06:13:25] Searching README.md, CHANGELOG.md, CONTRIBUTING.md, LICENSE.md, TODO.md files +[06:13:25] README.md file found +[06:13:25] CHANGELOG.md file found +[06:13:25] Error during C:\Users\Murhaf\Desktop\Projects\ngx-gallery\CONTRIBUTING read +[06:13:25] Continuing without CONTRIBUTING.md file +[06:13:25] LICENSE.md file found +[06:13:25] Error during C:\Users\Murhaf\Desktop\Projects\ngx-gallery\TODO read +[06:13:25] Continuing without TODO.md file +[06:13:25] Get dependencies data +[06:13:26] parsing : C:/Users/Murhaf/Desktop/Projects/ngx-gallery/projects/ng-gallery/.storybook/preview.ts +[06:13:26] found : preview +[06:13:26] parsing : C:/Users/Murhaf/Desktop/Projects/ngx-gallery/projects/ng-gallery/src/public-api.ts +[06:13:26] parsing : C:/Users/Murhaf/Desktop/Projects/ngx-gallery/projects/ng-gallery/src/lib/gallery.module.ts +[06:13:26] found : GalleryModule +[06:13:26] : - imports: +[06:13:26] : - GalleryComponent +[06:13:26] : - GalleryItemDef +[06:13:26] : - GalleryImageDef +[06:13:26] : - GalleryThumbDef +[06:13:26] : - GalleryBoxDef +[06:13:26] : - exports: +[06:13:26] : - GalleryComponent +[06:13:26] : - GalleryItemDef +[06:13:26] : - GalleryImageDef +[06:13:26] : - GalleryThumbDef +[06:13:26] : - GalleryBoxDef +[06:13:26] parsing : C:/Users/Murhaf/Desktop/Projects/ngx-gallery/projects/ng-gallery/src/lib/components/gallery-core.component.ts +[06:13:26] found : GalleryCoreComponent +[06:13:26] : - imports: +[06:13:26] : - CommonModule +[06:13:26] : - GalleryThumbsComponent +[06:13:26] : - GallerySliderComponent +[06:13:26] : - GalleryNavComponent +[06:13:26] : - GalleryBulletsComponent +[06:13:26] : - GalleryCounterComponent +[06:13:26] parsing : C:/Users/Murhaf/Desktop/Projects/ngx-gallery/projects/ng-gallery/src/lib/components/gallery-counter.component.ts +[06:13:26] found : GalleryCounterComponent +[06:13:26] parsing : C:/Users/Murhaf/Desktop/Projects/ngx-gallery/projects/ng-gallery/src/lib/components/gallery-bullets.component.ts +[06:13:26] found : GalleryBulletsComponent +[06:13:26] : - imports: +[06:13:26] : - CommonModule +[06:13:26] parsing : C:/Users/Murhaf/Desktop/Projects/ngx-gallery/projects/ng-gallery/src/lib/components/gallery-item.component.ts +[06:13:26] found : GalleryItemComponent +[06:13:26] : - imports: +[06:13:26] : - CommonModule +[06:13:26] : - GalleryImageComponent +[06:13:26] : - GalleryVideoComponent +[06:13:26] : - GalleryIframeComponent +[06:13:26] parsing : C:/Users/Murhaf/Desktop/Projects/ngx-gallery/projects/ng-gallery/src/lib/components/gallery-nav.component.ts +[06:13:26] found : GalleryNavComponent +[06:13:26] : - imports: +[06:13:26] : - CommonModule +[06:13:26] parsing : C:/Users/Murhaf/Desktop/Projects/ngx-gallery/projects/ng-gallery/src/lib/components/gallery-slider.component.ts +[06:13:26] found : GallerySliderComponent +[06:13:26] : - imports: +[06:13:26] : - CommonModule +[06:13:26] : - GalleryItemComponent +[06:13:26] : - SmoothScroll +[06:13:26] : - HammerSliding +[06:13:26] : - SliderIntersectionObserver +[06:13:26] : - ItemIntersectionObserver +[06:13:26] : - SliderResizeObserver +[06:13:26] parsing : C:/Users/Murhaf/Desktop/Projects/ngx-gallery/projects/ng-gallery/src/lib/components/gallery-thumb.component.ts +[06:13:26] found : GalleryThumbComponent +[06:13:26] : - imports: +[06:13:26] : - CommonModule +[06:13:26] : - GalleryImageComponent +[06:13:26] parsing : C:/Users/Murhaf/Desktop/Projects/ngx-gallery/projects/ng-gallery/src/lib/components/gallery-thumbs.component.ts +[06:13:26] found : GalleryThumbsComponent +[06:13:26] : - imports: +[06:13:26] : - CommonModule +[06:13:26] : - GalleryThumbComponent +[06:13:26] : - SmoothScroll +[06:13:26] : - HammerSliding +[06:13:26] : - ThumbResizeObserver +[06:13:26] parsing : C:/Users/Murhaf/Desktop/Projects/ngx-gallery/projects/ng-gallery/src/lib/components/gallery.component.ts +[06:13:26] found : GalleryComponent +[06:13:26] : - imports: +[06:13:26] : - CommonModule +[06:13:26] : - GalleryCoreComponent +[06:13:26] : - AutoplayDirective +[06:13:26] : - providers: +[06:13:26] : - ImgManager +[06:13:26] parsing : C:/Users/Murhaf/Desktop/Projects/ngx-gallery/projects/ng-gallery/src/lib/autoplay/autoplay.directive.ts +[06:13:26] found : AutoplayDirective +[06:13:26] parsing : C:/Users/Murhaf/Desktop/Projects/ngx-gallery/projects/ng-gallery/src/lib/directives/gallery-box-def.directive.ts +[06:13:26] found : GalleryBoxDef +[06:13:26] found : GalleryStateContext +[06:13:26] parsing : C:/Users/Murhaf/Desktop/Projects/ngx-gallery/projects/ng-gallery/src/lib/directives/gallery-image-def.directive.ts +[06:13:26] found : GalleryImageDef +[06:13:26] parsing : C:/Users/Murhaf/Desktop/Projects/ngx-gallery/projects/ng-gallery/src/lib/directives/gallery-item-def.directive.ts +[06:13:26] found : GalleryItemDef +[06:13:26] found : GalleryItemContext +[06:13:26] parsing : C:/Users/Murhaf/Desktop/Projects/ngx-gallery/projects/ng-gallery/src/lib/directives/gallery-thumb-def.directive.ts +[06:13:26] found : GalleryThumbDef +[06:13:26] parsing : C:/Users/Murhaf/Desktop/Projects/ngx-gallery/projects/ng-gallery/src/lib/gestures/hammer-sliding.directive.ts +[06:13:26] found : Hammer +[06:13:26] found : HammerSliding +[06:13:26] parsing : C:/Users/Murhaf/Desktop/Projects/ngx-gallery/projects/ng-gallery/src/lib/gestures/mouse-sliding.directive.ts +[06:13:26] parsing : C:/Users/Murhaf/Desktop/Projects/ngx-gallery/projects/ng-gallery/src/lib/models/config.model.ts +[06:13:26] found : GALLERY_CONFIG +[06:13:26] found : GalleryConfig +[06:13:26] parsing : C:/Users/Murhaf/Desktop/Projects/ngx-gallery/projects/ng-gallery/src/lib/models/constants.ts +[06:13:26] found : GalleryAction +[06:13:26] found : ImageSize +[06:13:26] found : LoadingStrategy +[06:13:26] found : LoadingAttr +[06:13:26] found : ThumbnailsPosition +[06:13:26] found : bulletsPosition +[06:13:26] found : CounterPosition +[06:13:26] found : SlidingDirection +[06:13:26] found : GalleryItemTypes +[06:13:26] found : ThumbnailsView +[06:13:26] found : GalleryItemType +[06:13:26] parsing : C:/Users/Murhaf/Desktop/Projects/ngx-gallery/projects/ng-gallery/src/lib/models/gallery.model.ts +[06:13:26] found : GalleryState +[06:13:26] found : GalleryItem +[06:13:26] found : GalleryError +[06:13:26] parsing : C:/Users/Murhaf/Desktop/Projects/ngx-gallery/projects/ng-gallery/src/lib/models/slider.model.ts +[06:13:26] found : SliderState +[06:13:26] found : WorkerState +[06:13:26] parsing : C:/Users/Murhaf/Desktop/Projects/ngx-gallery/projects/ng-gallery/src/lib/models/styles.model.ts +[06:13:26] parsing : C:/Users/Murhaf/Desktop/Projects/ngx-gallery/projects/ng-gallery/src/lib/services/gallery-ref.ts +[06:13:26] found : filterActions +[06:13:26] found : GalleryRef +[06:13:26] parsing : C:/Users/Murhaf/Desktop/Projects/ngx-gallery/projects/ng-gallery/src/lib/services/gallery.service.ts +[06:13:26] found : Gallery +[06:13:26] parsing : C:/Users/Murhaf/Desktop/Projects/ngx-gallery/projects/ng-gallery/src/lib/observers/active-item-observer.ts +[06:13:26] found : ActiveItemObserver +[06:13:26] found : createIntersectionObserver +[06:13:26] parsing : C:/Users/Murhaf/Desktop/Projects/ngx-gallery/projects/ng-gallery/src/lib/observers/item-intersection-observer.directive.ts +[06:13:26] found : ItemIntersectionObserver +[06:13:26] parsing : C:/Users/Murhaf/Desktop/Projects/ngx-gallery/projects/ng-gallery/src/lib/observers/slider-intersection-observer.directive.ts +[06:13:26] found : SliderIntersectionObserver +[06:13:26] parsing : C:/Users/Murhaf/Desktop/Projects/ngx-gallery/projects/ng-gallery/src/lib/observers/slider-resize-observer.directive.ts +[06:13:26] found : SliderResizeObserver +[06:13:26] parsing : C:/Users/Murhaf/Desktop/Projects/ngx-gallery/projects/ng-gallery/src/lib/observers/thumb-resize-observer.directive.ts +[06:13:26] found : ThumbResizeObserver +[06:13:26] parsing : C:/Users/Murhaf/Desktop/Projects/ngx-gallery/projects/ng-gallery/src/lib/smooth-scroll/bezier-easing.ts +[06:13:26] found : NEWTON_ITERATIONS +[06:13:26] found : NEWTON_MIN_SLOPE +[06:13:26] found : SUBDIVISION_PRECISION +[06:13:26] found : SUBDIVISION_MAX_ITERATIONS +[06:13:26] found : kSplineTableSize +[06:13:26] found : kSampleStepSize +[06:13:26] found : float32ArraySupported +[06:13:26] found : A +[06:13:26] found : B +[06:13:26] found : C +[06:13:26] found : calcBezier +[06:13:26] found : getSlope +[06:13:26] found : binarySubdivide +[06:13:26] found : newtonRaphsonIterate +[06:13:26] found : LinearEasing +[06:13:26] found : bezier +[06:13:26] parsing : C:/Users/Murhaf/Desktop/Projects/ngx-gallery/projects/ng-gallery/src/lib/smooth-scroll/index.ts +[06:13:26] parsing : C:/Users/Murhaf/Desktop/Projects/ngx-gallery/projects/ng-gallery/src/lib/smooth-scroll/smooth-scroll.directive.ts +[06:13:26] found : Hammer +[06:13:26] found : SmoothScroll +[06:13:26] : - providers: +[06:13:26] : - Dir +[06:13:26] parsing : C:/Users/Murhaf/Desktop/Projects/ngx-gallery/projects/ng-gallery/src/lib/smooth-scroll/smooth-scroll.model.ts +[06:13:26] found : SMOOTH_SCROLL_OPTIONS +[06:13:26] found : SmoothScrollToOptions +[06:13:26] found : SmoothScrollOptions +[06:13:26] found : SmoothScrollStep +[06:13:26] found : BezierEasingOptions +[06:13:26] parsing : C:/Users/Murhaf/Desktop/Projects/ngx-gallery/projects/ng-gallery/src/lib/utils/gallery.default.ts +[06:13:26] found : defaultState +[06:13:26] found : defaultConfig +[06:13:26] parsing : C:/Users/Murhaf/Desktop/Projects/ngx-gallery/projects/ng-gallery/src/lib/utils/img-manager.ts +[06:13:26] found : ImageRegistry +[06:13:26] found : ImgManager +[06:13:26] parsing : C:/Users/Murhaf/Desktop/Projects/ngx-gallery/projects/ng-gallery/src/lib/utils/img-recognizer.ts +[06:13:26] found : ImgRecognizer +[06:13:26] parsing : C:/Users/Murhaf/Desktop/Projects/ngx-gallery/projects/ng-gallery/src/lib/utils/resize-observer.ts +[06:13:26] found : resizeObservable +[06:13:26] parsing : C:/Users/Murhaf/Desktop/Projects/ngx-gallery/projects/ng-gallery/src/stories/basic/gallery-example.component.ts +[06:13:26] found : GalleryExampleComponent +[06:13:26] : - imports: +[06:13:26] : - CommonModule +[06:13:26] : - GalleryModule +[06:13:26] parsing : C:/Users/Murhaf/Desktop/Projects/ngx-gallery/projects/ng-gallery/src/stories/basic/Gallery.stories.ts +[06:13:26] found : meta +[06:13:26] found : Story +[06:13:26] found : All +[06:13:26] found : Thumbnails +[06:13:26] found : Navigation +[06:13:26] found : Dots +[06:13:26] found : Counter +[06:13:26] parsing : C:/Users/Murhaf/Desktop/Projects/ngx-gallery/projects/ng-gallery/src/stories/custom-templates/custom-template.component.ts +[06:13:26] found : CustomTemplateComponent +[06:13:26] : - imports: +[06:13:26] : - CommonModule +[06:13:26] : - GalleryModule +[06:13:26] parsing : C:/Users/Murhaf/Desktop/Projects/ngx-gallery/projects/ng-gallery/src/stories/custom-templates/CustomTemplates.stories.ts +[06:13:26] found : meta +[06:13:26] found : Story +[06:13:26] found : All +[06:13:26] parsing : C:/Users/Murhaf/Desktop/Projects/ngx-gallery/projects/ng-gallery/src/stories/lightbox/lightbox-example.component.ts +[06:13:26] found : LightboxExampleComponent +[06:13:26] : - imports: +[06:13:26] : - CommonModule +[06:13:26] : - LightboxModule +[06:13:26] parsing : C:/Users/Murhaf/Desktop/Projects/ngx-gallery/projects/ng-gallery/src/stories/lightbox/Lightbox.stories.ts +[06:13:26] found : meta +[06:13:26] found : Story +[06:13:26] found : All +[06:13:26] parsing : C:/Users/Murhaf/Desktop/Projects/ngx-gallery/projects/ng-gallery/src/stories/pixabay/pixabay.model.ts +[06:13:26] found : PixabayModel +[06:13:26] found : Hit +[06:13:26] found : PixabayHDModel +[06:13:26] found : Hit2 +[06:13:26] parsing : C:/Users/Murhaf/Desktop/Projects/ngx-gallery/projects/ng-gallery/src/stories/pixabay/pixabay.service.ts +[06:13:26] found : Pixabay +[06:13:26] parsing : C:/Users/Murhaf/Desktop/Projects/ngx-gallery/projects/ng-gallery/src/lib/components/adapters/base-adapter.ts +[06:13:26] found : SliderAdapter +[06:13:26] parsing : C:/Users/Murhaf/Desktop/Projects/ngx-gallery/projects/ng-gallery/src/lib/components/adapters/index.ts +[06:13:26] parsing : C:/Users/Murhaf/Desktop/Projects/ngx-gallery/projects/ng-gallery/src/lib/components/adapters/main-adapters.ts +[06:13:26] found : Hammer +[06:13:26] found : HorizontalAdapter +[06:13:26] found : VerticalAdapter +[06:13:26] parsing : C:/Users/Murhaf/Desktop/Projects/ngx-gallery/projects/ng-gallery/src/lib/components/templates/gallery-iframe.component.ts +[06:13:26] found : GalleryIframeComponent +[06:13:26] : - imports: +[06:13:26] : - NgIf +[06:13:26] parsing : C:/Users/Murhaf/Desktop/Projects/ngx-gallery/projects/ng-gallery/src/lib/components/templates/gallery-image.component.ts +[06:13:26] found : GalleryImageComponent +[06:13:26] : - imports: +[06:13:26] : - NgSwitch +[06:13:26] : - NgSwitchCase +[06:13:26] : - NgIf +[06:13:26] : - ImgRecognizer +[06:13:26] parsing : C:/Users/Murhaf/Desktop/Projects/ngx-gallery/projects/ng-gallery/src/lib/components/templates/gallery-video.component.ts +[06:13:26] found : GalleryVideoComponent +[06:13:26] : - imports: +[06:13:26] : - NgFor +[06:13:26] : - NgIf +[06:13:26] parsing : C:/Users/Murhaf/Desktop/Projects/ngx-gallery/projects/ng-gallery/src/lib/components/templates/items.model.ts +[06:13:26] found : ImageItem +[06:13:26] found : VideoItem +[06:13:26] found : IframeItem +[06:13:26] found : YoutubeItem +[06:13:26] found : GalleryItemModel +[06:13:26] found : ImageItemData +[06:13:26] found : IframeItemData +[06:13:26] found : YoutubeItemData +[06:13:26] found : VideoItemData +[06:13:26] found : GalleryItemData +[06:13:26] found : ItemState +[06:13:26] parsing : C:/Users/Murhaf/Desktop/Projects/ngx-gallery/projects/ng-gallery/src/lib/components/templates/svg-assets.ts +[06:13:26] found : imageFailedSvg +[06:13:26] ------------------- +[06:13:26] Project statistics +[06:13:26] - files : 56 +[06:13:26] - module : 1 +[06:13:26] - component : 15 +[06:13:26] - directive : 12 +[06:13:26] - injectable : 3 +[06:13:26] - class : 9 +[06:13:26] - interface : 16 +[06:13:26] ------------------- +[06:13:26] Prepare components +[06:13:26] CustomTemplateComponent has styles, include them +[06:13:26] GalleryComponent has styleUrls, include them +[06:13:26] GalleryCoreComponent has styleUrls, include them +[06:13:26] GalleryCounterComponent has styleUrls, include them +[06:13:26] GalleryBulletsComponent has styleUrls, include them +[06:13:26] GalleryImageComponent has styleUrls, include them +[06:13:26] GalleryItemComponent has styleUrls, include them +[06:13:26] GalleryNavComponent has styleUrls, include them +[06:13:26] GallerySliderComponent has styleUrls, include them +[06:13:26] GalleryThumbComponent has styleUrls, include them +[06:13:26] GalleryThumbsComponent has styleUrls, include them +[06:13:26] Prepare modules +[06:13:26] Prepare directives +[06:13:26] Prepare injectables +[06:13:26] Prepare classes +[06:13:26] Prepare interfaces +[06:13:26] Prepare miscellaneous +[06:13:26] Process documentation coverage report +[06:13:26] Generating documentation in export format json +[06:13:26] Documentation generated in projects/ng-gallery/ in 0.646 seconds +info => Cleaning outputDir: C:\Users\Murhaf\AppData\Local\Temp\chromatic--28884-PtdM9I0wjZqE + +info => Loading presets +info => Building manager.. +info => Manager built (128 ms) +info => Building preview.. +info => Copying static files: C:\Users\Murhaf\Desktop\Projects\ngx-gallery\node_modules\@storybook\manager\static at C:\Users\Murhaf\AppData\Local\Temp\chromatic--28884-PtdM9I0wjZqE\sb-common-assets +info Addon-docs: using MDX2 +info => Using implicit CSS loaders +info => Using angular browser target options from "ng-gallery:build" +info => Using angular project with "tsConfig:C:\Users\Murhaf\Desktop\Projects\ngx-gallery\projects\ng-gallery\.storybook\tsconfig.json" +One or more browsers which are configured in the project's Browserslist configuration will be ignored as ES5 output is not supported by the Angular CLI. +Ignored browsers: kaios 2.5, op_mini all +info => Using default Webpack5 setup + [webpack.Progress] 0% + + [webpack.Progress] 1% setup before run + [webpack.Progress] 1% setup before run NodeEnvironmentPlugin + [webpack.Progress] 1% setup before run + [webpack.Progress] 2% setup run + [webpack.Progress] 2% setup run + [webpack.Progress] 4% setup normal module factory + [webpack.Progress] 4% setup normal module factory CaseSensitivePathsPlugin + [webpack.Progress] 4% setup normal module factory + [webpack.Progress] 5% setup context module factory + [webpack.Progress] 5% setup context module factory + [webpack.Progress] 6% setup before compile + [webpack.Progress] 6% setup before compile angular-compiler + [webpack.Progress] 6% setup before compile ProgressPlugin + [webpack.Progress] 6% setup before compile + [webpack.Progress] 7% setup compile + [webpack.Progress] 7% setup compile ExternalsPlugin + [webpack.Progress] 7% setup compile ExternalsPlugin + [webpack.Progress] 7% setup compile + [webpack.Progress] 8% setup compilation + [webpack.Progress] 8% setup compilation angular-occurrences-plugin + [webpack.Progress] 8% setup compilation angular-compiler + [webpack.Progress] 8% setup compilation mini-css-extract-plugin + [webpack.Progress] 8% setup compilation unplugin-csf + [webpack.Progress] 8% setup compilation storybook-normalize-angular-entry-plugin + [webpack.Progress] 8% setup compilation ArrayPushCallbackChunkFormatPlugin + [webpack.Progress] 8% setup compilation JsonpChunkLoadingPlugin + [webpack.Progress] 8% setup compilation StartupChunkDependenciesPlugin + [webpack.Progress] 8% setup compilation ImportScriptsChunkLoadingPlugin + [webpack.Progress] 8% setup compilation FetchCompileWasmPlugin + [webpack.Progress] 8% setup compilation FetchCompileAsyncWasmPlugin + [webpack.Progress] 8% setup compilation WorkerPlugin + [webpack.Progress] 8% setup compilation SplitChunksPlugin + [webpack.Progress] 8% setup compilation RuntimeChunkPlugin + [webpack.Progress] 8% setup compilation ResolverCachePlugin + [webpack.Progress] 8% setup compilation HtmlWebpackPlugin + [webpack.Progress] 8% setup compilation + [webpack.Progress] 9% setup compilation + [webpack.Progress] 9% setup compilation named-chunks-plugin + [webpack.Progress] 9% setup compilation DedupeModuleResolvePlugin + [webpack.Progress] 9% setup compilation AnyComponentStyleBudgetChecker + [webpack.Progress] 9% setup compilation mini-css-extract-plugin + [webpack.Progress] 9% setup compilation SuppressExtractedTextChunks + [webpack.Progress] 9% setup compilation DefinePlugin + [webpack.Progress] 9% setup compilation ProvidePlugin + [webpack.Progress] 9% setup compilation ProgressPlugin + [webpack.Progress] 9% setup compilation ChunkPrefetchPreloadPlugin + [webpack.Progress] 9% setup compilation SourceMapDevToolPlugin + [webpack.Progress] 9% setup compilation JavascriptModulesPlugin + [webpack.Progress] 9% setup compilation JsonModulesPlugin + [webpack.Progress] 9% setup compilation AssetModulesPlugin + [webpack.Progress] 9% setup compilation DynamicEntryPlugin + [webpack.Progress] 9% setup compilation RuntimePlugin + [webpack.Progress] 9% setup compilation InferAsyncModulesPlugin + [webpack.Progress] 9% setup compilation DataUriPlugin + [webpack.Progress] 9% setup compilation FileUriPlugin + [webpack.Progress] 9% setup compilation CompatibilityPlugin + [webpack.Progress] 9% setup compilation HarmonyModulesPlugin + [webpack.Progress] 9% setup compilation AMDPlugin + [webpack.Progress] 9% setup compilation RequireJsStuffPlugin + [webpack.Progress] 9% setup compilation CommonJsPlugin + [webpack.Progress] 9% setup compilation LoaderPlugin + [webpack.Progress] 9% setup compilation LoaderPlugin + [webpack.Progress] 9% setup compilation NodeStuffPlugin + [webpack.Progress] 9% setup compilation APIPlugin + [webpack.Progress] 9% setup compilation ExportsInfoApiPlugin + [webpack.Progress] 9% setup compilation WebpackIsIncludedPlugin + [webpack.Progress] 9% setup compilation ConstPlugin + [webpack.Progress] 9% setup compilation UseStrictPlugin + [webpack.Progress] 9% setup compilation RequireIncludePlugin + [webpack.Progress] 9% setup compilation RequireEnsurePlugin + [webpack.Progress] 9% setup compilation RequireContextPlugin + [webpack.Progress] 9% setup compilation ImportPlugin + [webpack.Progress] 9% setup compilation ImportMetaContextPlugin + [webpack.Progress] 9% setup compilation SystemPlugin + [webpack.Progress] 9% setup compilation ImportMetaPlugin + [webpack.Progress] 9% setup compilation URLPlugin + [webpack.Progress] 9% setup compilation DefaultStatsFactoryPlugin + [webpack.Progress] 9% setup compilation DefaultStatsPresetPlugin + [webpack.Progress] 9% setup compilation DefaultStatsPrinterPlugin + [webpack.Progress] 9% setup compilation JavascriptMetaInfoPlugin + [webpack.Progress] 9% setup compilation EnsureChunkConditionsPlugin + [webpack.Progress] 9% setup compilation RemoveEmptyChunksPlugin + [webpack.Progress] 9% setup compilation MergeDuplicateChunksPlugin + [webpack.Progress] 9% setup compilation FlagIncludedChunksPlugin + [webpack.Progress] 9% setup compilation SideEffectsFlagPlugin + [webpack.Progress] 9% setup compilation FlagDependencyExportsPlugin + [webpack.Progress] 9% setup compilation FlagDependencyUsagePlugin + [webpack.Progress] 9% setup compilation InnerGraphPlugin + [webpack.Progress] 9% setup compilation MangleExportsPlugin + [webpack.Progress] 9% setup compilation ModuleConcatenationPlugin + [webpack.Progress] 9% setup compilation NoEmitOnErrorsPlugin + [webpack.Progress] 9% setup compilation RealContentHashPlugin + [webpack.Progress] 9% setup compilation WasmFinalizeExportsPlugin + [webpack.Progress] 9% setup compilation NamedModuleIdsPlugin + [webpack.Progress] 9% setup compilation DeterministicChunkIdsPlugin + [webpack.Progress] 9% setup compilation DefinePlugin + [webpack.Progress] 9% setup compilation TerserPlugin + [webpack.Progress] 9% setup compilation TemplatedPathPlugin + [webpack.Progress] 9% setup compilation RecordIdsPlugin + [webpack.Progress] 9% setup compilation WarnCaseSensitiveModulesPlugin + [webpack.Progress] 9% setup compilation IgnoreWarningsPlugin + [webpack.Progress] 9% setup compilation + [webpack.Progress] 10% building + [webpack.Progress] 10% building 0/1 entries 0/0 dependencies 0/0 modules + [webpack.Progress] 10% building import loader ./node_modules/@angular-devkit/build-angular/src/tools/babel/webpack-loader.js + [webpack.Progress] 10% building 0/2 entries 1/2 dependencies 0/1 modules + [webpack.Progress] 10% building 0/2 entries 7/21 dependencies 3/6 modules + [webpack.Progress] 30% building 1/2 entries 8/21 dependencies 4/8 modules + [webpack.Progress] 37% building import loader ./node_modules/@ngtools/webpack/src/ivy/index.js + [webpack.Progress] 37% building 1/2 entries 33/54 dependencies 5/31 modules + [webpack.Progress] 37% building import loader ./node_modules/@storybook/mdx2-csf/loader.js + [webpack.Progress] 37% building 1/2 entries 38/54 dependencies 5/36 modules + [webpack.Progress] 37% building import loader ./node_modules/unplugin/dist/webpack/loaders/load.js + [webpack.Progress] 37% building 1/2 entries 61/115 dependencies 11/42 modules + [webpack.Progress] 37% building 1/2 entries 197/234 dependencies 35/106 modules + [webpack.Progress] 37% building import loader ./node_modules/css-loader/dist/cjs.js + [webpack.Progress] 37% building import loader ./node_modules/postcss-loader/dist/cjs.js + [webpack.Progress] 37% building import loader ./node_modules/@ngtools/webpack/src/loaders/inline-resource.js + [webpack.Progress] 37% building 1/2 entries 256/295 dependencies 58/128 modules + [webpack.Progress] 37% building import loader ./node_modules/resolve-url-loader/index.js + [webpack.Progress] 37% building import loader ./node_modules/sass-loader/dist/cjs.js + [webpack.Progress] 37% building 1/2 entries 348/384 dependencies 74/154 modules + [webpack.Progress] 37% building 1/2 entries 993/1000 dependencies 92/534 modules + [webpack.Progress] 37% building 1/2 entries 1590/1638 dependencies 121/600 modules + [webpack.Progress] 37% building 1/2 entries 2286/2300 dependencies 182/737 modules + [webpack.Progress] 37% building 1/2 entries 2547/2600 dependencies 441/775 modules + [webpack.Progress] 55% building 1/2 entries 3062/3075 dependencies 822/900 modules + [webpack.Progress] 65% building 2/2 entries 3203/3203 dependencies 947/947 modules + [webpack.Progress] 65% building + [webpack.Progress] 69% building finish + [webpack.Progress] 69% building finish + [webpack.Progress] 70% sealing finish module graph + [webpack.Progress] 70% sealing finish module graph angular-compiler + [webpack.Progress] 70% sealing finish module graph ResolverCachePlugin + [webpack.Progress] 70% sealing finish module graph InferAsyncModulesPlugin + [webpack.Progress] 70% sealing finish module graph FlagDependencyExportsPlugin + [webpack.Progress] 70% sealing finish module graph InnerGraphPlugin + [webpack.Progress] 70% sealing finish module graph WasmFinalizeExportsPlugin + [webpack.Progress] 70% sealing finish module graph + [webpack.Progress] 70% sealing plugins + [webpack.Progress] 70% sealing plugins WarnCaseSensitiveModulesPlugin + [webpack.Progress] 70% sealing plugins + [webpack.Progress] 71% sealing dependencies optimization + [webpack.Progress] 71% sealing dependencies optimization SideEffectsFlagPlugin + [webpack.Progress] 71% sealing dependencies optimization FlagDependencyUsagePlugin + [webpack.Progress] 71% sealing dependencies optimization + [webpack.Progress] 71% sealing after dependencies optimization + [webpack.Progress] 71% sealing after dependencies optimization + [webpack.Progress] 72% sealing chunk graph + [webpack.Progress] 72% sealing chunk graph + [webpack.Progress] 73% sealing after chunk graph + [webpack.Progress] 73% sealing after chunk graph + [webpack.Progress] 73% sealing optimizing + [webpack.Progress] 73% sealing optimizing + [webpack.Progress] 74% sealing module optimization + [webpack.Progress] 74% sealing module optimization + [webpack.Progress] 75% sealing after module optimization + [webpack.Progress] 75% sealing after module optimization + [webpack.Progress] 75% sealing chunk optimization + [webpack.Progress] 75% sealing chunk optimization EnsureChunkConditionsPlugin + [webpack.Progress] 75% sealing chunk optimization RemoveEmptyChunksPlugin + [webpack.Progress] 75% sealing chunk optimization MergeDuplicateChunksPlugin + [webpack.Progress] 75% sealing chunk optimization SplitChunksPlugin + [webpack.Progress] 75% sealing chunk optimization RemoveEmptyChunksPlugin + [webpack.Progress] 75% sealing chunk optimization + [webpack.Progress] 76% sealing after chunk optimization + [webpack.Progress] 76% sealing after chunk optimization + [webpack.Progress] 77% sealing module and chunk tree optimization + [webpack.Progress] 77% sealing module and chunk tree optimization PersistentChildCompilerSingletonPlugin + [webpack.Progress] 77% sealing module and chunk tree optimization + [webpack.Progress] 77% sealing after module and chunk tree optimization + [webpack.Progress] 77% sealing after module and chunk tree optimization + [webpack.Progress] 78% sealing chunk modules optimization + [webpack.Progress] 78% sealing chunk modules optimization ModuleConcatenationPlugin + [webpack.Progress] 78% sealing chunk modules optimization + [webpack.Progress] 78% sealing after chunk modules optimization + [webpack.Progress] 78% sealing after chunk modules optimization + [webpack.Progress] 79% sealing module reviving + [webpack.Progress] 79% sealing module reviving RecordIdsPlugin + [webpack.Progress] 79% sealing module reviving + [webpack.Progress] 80% sealing before module ids + [webpack.Progress] 80% sealing before module ids + [webpack.Progress] 80% sealing module ids + [webpack.Progress] 80% sealing module ids NamedModuleIdsPlugin + [webpack.Progress] 80% sealing module ids + [webpack.Progress] 81% sealing module id optimization + [webpack.Progress] 81% sealing module id optimization + [webpack.Progress] 82% sealing module id optimization + [webpack.Progress] 82% sealing module id optimization + [webpack.Progress] 82% sealing chunk reviving + [webpack.Progress] 82% sealing chunk reviving RecordIdsPlugin + [webpack.Progress] 82% sealing chunk reviving + [webpack.Progress] 83% sealing before chunk ids + [webpack.Progress] 83% sealing before chunk ids + [webpack.Progress] 84% sealing chunk ids + [webpack.Progress] 84% sealing chunk ids DeterministicChunkIdsPlugin + [webpack.Progress] 84% sealing chunk ids + [webpack.Progress] 84% sealing chunk id optimization + [webpack.Progress] 84% sealing chunk id optimization FlagIncludedChunksPlugin + [webpack.Progress] 84% sealing chunk id optimization + [webpack.Progress] 85% sealing after chunk id optimization + [webpack.Progress] 85% sealing after chunk id optimization + [webpack.Progress] 86% sealing record modules + [webpack.Progress] 86% sealing record modules RecordIdsPlugin + [webpack.Progress] 86% sealing record modules + [webpack.Progress] 86% sealing record chunks + [webpack.Progress] 86% sealing record chunks RecordIdsPlugin + [webpack.Progress] 86% sealing record chunks + [webpack.Progress] 87% sealing module hashing + [webpack.Progress] 87% sealing module hashing + [webpack.Progress] 87% sealing code generation + [webpack.Progress] 87% sealing code generation + [webpack.Progress] 88% sealing runtime requirements + [webpack.Progress] 88% sealing runtime requirements + [webpack.Progress] 89% sealing hashing + [webpack.Progress] 89% sealing hashing + [webpack.Progress] 89% sealing after hashing + [webpack.Progress] 89% sealing after hashing + [webpack.Progress] 90% sealing record hash + [webpack.Progress] 90% sealing record hash + [webpack.Progress] 91% sealing module assets processing + [webpack.Progress] 91% sealing module assets processing + [webpack.Progress] 91% sealing chunk assets processing + [webpack.Progress] 91% sealing chunk assets processing + [webpack.Progress] 92% sealing asset processing + [webpack.Progress] 92% sealing asset processing PersistentChildCompilerSingletonPlugin + [webpack.Progress] 92% sealing asset processing TerserPlugin + [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin + [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin + [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin main.2f2e4fe5.iframe.bundle.js generate SourceMap + [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin main.2f2e4fe5.iframe.bundle.js generated SourceMap + [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin runtime~main.099e8817.iframe.bundle.js generate SourceMap + [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin runtime~main.099e8817.iframe.bundle.js generated SourceMap + [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin stories-Configure-mdx.4295d53f.iframe.bundle.js generate SourceMap + [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin stories-Configure-mdx.4295d53f.iframe.bundle.js generated SourceMap + [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin stories-GettingStarted-mdx.326d5516.iframe.bundle.js generate SourceMap + [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin stories-GettingStarted-mdx.326d5516.iframe.bundle.js generated SourceMap + [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin stories-basic-GalleryDocs-mdx.ad2559cf.iframe.bundle.js generate SourceMap + [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin stories-basic-GalleryDocs-mdx.ad2559cf.iframe.bundle.js generated SourceMap + [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin stories-custom-templates-CustomTemplates-mdx.b8e7734b.iframe.bundle.js generate SourceMap + [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin stories-custom-templates-CustomTemplates-mdx.b8e7734b.iframe.bundle.js generated SourceMap + [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin stories-lightbox-Lightbox-mdx.50f71ad5.iframe.bundle.js generate SourceMap + [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin stories-lightbox-Lightbox-mdx.50f71ad5.iframe.bundle.js generated SourceMap + [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin stories-basic-Gallery-stories.51d521f0.iframe.bundle.js generate SourceMap + [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin stories-basic-Gallery-stories.51d521f0.iframe.bundle.js generated SourceMap + [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin stories-custom-templates-CustomTemplates-stories.5d2c1f40.iframe.bundle.js generate SourceMap + [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin stories-custom-templates-CustomTemplates-stories.5d2c1f40.iframe.bundle.js generated SourceMap + [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin stories-lightbox-Lightbox-stories.913b5ecd.iframe.bundle.js generate SourceMap + [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin stories-lightbox-Lightbox-stories.913b5ecd.iframe.bundle.js generated SourceMap + [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin 924.d6bb3452.iframe.bundle.js generate SourceMap + [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin 924.d6bb3452.iframe.bundle.js generated SourceMap + [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin 21.b1500a41.iframe.bundle.js generate SourceMap + [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin 21.b1500a41.iframe.bundle.js generated SourceMap + [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin 90.5c3788eb.iframe.bundle.js generate SourceMap + [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin 90.5c3788eb.iframe.bundle.js generated SourceMap + [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin 841.cdaecacf.iframe.bundle.js generate SourceMap + [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin 841.cdaecacf.iframe.bundle.js generated SourceMap + [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin 396.bdf3ceea.iframe.bundle.js generate SourceMap + [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin 396.bdf3ceea.iframe.bundle.js generated SourceMap + [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin 542.183bc20b.iframe.bundle.js generate SourceMap + [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin 542.183bc20b.iframe.bundle.js generated SourceMap + [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin 155.50520d59.iframe.bundle.js generate SourceMap + [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin 155.50520d59.iframe.bundle.js generated SourceMap + [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin 464.ac19979f.iframe.bundle.js generate SourceMap + [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin 464.ac19979f.iframe.bundle.js generated SourceMap + [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin 428.7431c361.iframe.bundle.js generate SourceMap + [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin 428.7431c361.iframe.bundle.js generated SourceMap + [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin 615.617880a0.iframe.bundle.js generate SourceMap + [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin 615.617880a0.iframe.bundle.js generated SourceMap + [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin 221.84d3d9cd.iframe.bundle.js generate SourceMap + [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin 221.84d3d9cd.iframe.bundle.js generated SourceMap + [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin 29.9879b084.iframe.bundle.js generate SourceMap + [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin 29.9879b084.iframe.bundle.js generated SourceMap + [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin 96.b9cc46b5.iframe.bundle.js generate SourceMap + [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin 96.b9cc46b5.iframe.bundle.js generated SourceMap + [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin resolve sources + [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin 841.cdaecacf.iframe.bundle.js attach SourceMap + [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin 841.cdaecacf.iframe.bundle.js attached SourceMap + [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin 615.617880a0.iframe.bundle.js attach SourceMap + [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin 615.617880a0.iframe.bundle.js attached SourceMap + [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin 29.9879b084.iframe.bundle.js attach SourceMap + [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin 29.9879b084.iframe.bundle.js attached SourceMap + [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin + [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin + [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin resolve sources + [webpack.Progress] 92% sealing asset processing SourceMapDevToolPlugin + [webpack.Progress] 92% sealing asset processing HtmlWebpackPlugin + [webpack.Progress] 92% sealing asset processing HtmlWebpackPlugin + [webpack.Progress] 92% sealing asset processing HtmlWebpackPlugin resolve sources + [webpack.Progress] 92% sealing asset processing HtmlWebpackPlugin + [webpack.Progress] 92% sealing asset processing RealContentHashPlugin + [webpack.Progress] 92% sealing asset processing RealContentHashPlugin + [webpack.Progress] 92% sealing asset processing RealContentHashPlugin main.71b3a662.iframe.bundle.js generate SourceMap + [webpack.Progress] 92% sealing asset processing RealContentHashPlugin main.71b3a662.iframe.bundle.js generated SourceMap + [webpack.Progress] 92% sealing asset processing RealContentHashPlugin runtime~main.43f1b8ae.iframe.bundle.js generate SourceMap + [webpack.Progress] 92% sealing asset processing RealContentHashPlugin runtime~main.43f1b8ae.iframe.bundle.js generated SourceMap + [webpack.Progress] 92% sealing asset processing RealContentHashPlugin stories-basic-Gallery-stories.e97c9669.iframe.bundle.js generate SourceMap + [webpack.Progress] 92% sealing asset processing RealContentHashPlugin stories-basic-Gallery-stories.e97c9669.iframe.bundle.js generated SourceMap + [webpack.Progress] 92% sealing asset processing RealContentHashPlugin stories-custom-templates-CustomTemplates-stories.f1bb4deb.iframe.bundle.js generate SourceMap + [webpack.Progress] 92% sealing asset processing RealContentHashPlugin stories-custom-templates-CustomTemplates-stories.f1bb4deb.iframe.bundle.js generated SourceMap + [webpack.Progress] 92% sealing asset processing RealContentHashPlugin stories-lightbox-Lightbox-stories.79f83458.iframe.bundle.js generate SourceMap + [webpack.Progress] 92% sealing asset processing RealContentHashPlugin stories-lightbox-Lightbox-stories.79f83458.iframe.bundle.js generated SourceMap + [webpack.Progress] 92% sealing asset processing RealContentHashPlugin 924.20677aff.iframe.bundle.js generate SourceMap + [webpack.Progress] 92% sealing asset processing RealContentHashPlugin 924.20677aff.iframe.bundle.js generated SourceMap + [webpack.Progress] 92% sealing asset processing RealContentHashPlugin 21.471740d9.iframe.bundle.js generate SourceMap + [webpack.Progress] 92% sealing asset processing RealContentHashPlugin 21.471740d9.iframe.bundle.js generated SourceMap + [webpack.Progress] 92% sealing asset processing RealContentHashPlugin 90.8a4ddb01.iframe.bundle.js generate SourceMap + [webpack.Progress] 92% sealing asset processing RealContentHashPlugin 90.8a4ddb01.iframe.bundle.js generated SourceMap + [webpack.Progress] 92% sealing asset processing RealContentHashPlugin 396.ef294ade.iframe.bundle.js generate SourceMap + [webpack.Progress] 92% sealing asset processing RealContentHashPlugin 396.ef294ade.iframe.bundle.js generated SourceMap + [webpack.Progress] 92% sealing asset processing RealContentHashPlugin 542.1bce3b83.iframe.bundle.js generate SourceMap + [webpack.Progress] 92% sealing asset processing RealContentHashPlugin 542.1bce3b83.iframe.bundle.js generated SourceMap + [webpack.Progress] 92% sealing asset processing RealContentHashPlugin 155.7a0fd931.iframe.bundle.js generate SourceMap + [webpack.Progress] 92% sealing asset processing RealContentHashPlugin 155.7a0fd931.iframe.bundle.js generated SourceMap + [webpack.Progress] 92% sealing asset processing RealContentHashPlugin 464.74d64343.iframe.bundle.js generate SourceMap + [webpack.Progress] 92% sealing asset processing RealContentHashPlugin 464.74d64343.iframe.bundle.js generated SourceMap + [webpack.Progress] 92% sealing asset processing RealContentHashPlugin 221.a2e6c5ab.iframe.bundle.js generate SourceMap + [webpack.Progress] 92% sealing asset processing RealContentHashPlugin 221.a2e6c5ab.iframe.bundle.js generated SourceMap + [webpack.Progress] 92% sealing asset processing RealContentHashPlugin 96.8869b5c8.iframe.bundle.js generate SourceMap + [webpack.Progress] 92% sealing asset processing RealContentHashPlugin 96.8869b5c8.iframe.bundle.js generated SourceMap + [webpack.Progress] 92% sealing asset processing RealContentHashPlugin stories-Configure-mdx.6b1e4db5.iframe.bundle.js generate SourceMap + [webpack.Progress] 92% sealing asset processing RealContentHashPlugin stories-Configure-mdx.6b1e4db5.iframe.bundle.js generated SourceMap + [webpack.Progress] 92% sealing asset processing RealContentHashPlugin stories-GettingStarted-mdx.fa63fb05.iframe.bundle.js generate SourceMap + [webpack.Progress] 92% sealing asset processing RealContentHashPlugin stories-GettingStarted-mdx.fa63fb05.iframe.bundle.js generated SourceMap + [webpack.Progress] 92% sealing asset processing RealContentHashPlugin stories-basic-GalleryDocs-mdx.0168c7ea.iframe.bundle.js generate SourceMap + [webpack.Progress] 92% sealing asset processing RealContentHashPlugin stories-basic-GalleryDocs-mdx.0168c7ea.iframe.bundle.js generated SourceMap + [webpack.Progress] 92% sealing asset processing RealContentHashPlugin stories-custom-templates-CustomTemplates-mdx.fcf7e6c2.iframe.bundle.js generate SourceMap + [webpack.Progress] 92% sealing asset processing RealContentHashPlugin stories-custom-templates-CustomTemplates-mdx.fcf7e6c2.iframe.bundle.js generated SourceMap + [webpack.Progress] 92% sealing asset processing RealContentHashPlugin stories-lightbox-Lightbox-mdx.0ccb302b.iframe.bundle.js generate SourceMap + [webpack.Progress] 92% sealing asset processing RealContentHashPlugin stories-lightbox-Lightbox-mdx.0ccb302b.iframe.bundle.js generated SourceMap + [webpack.Progress] 92% sealing asset processing RealContentHashPlugin 428.29fd87c4.iframe.bundle.js generate SourceMap + [webpack.Progress] 92% sealing asset processing RealContentHashPlugin 428.29fd87c4.iframe.bundle.js generated SourceMap + [webpack.Progress] 92% sealing asset processing RealContentHashPlugin resolve sources + [webpack.Progress] 92% sealing asset processing RealContentHashPlugin + [webpack.Progress] 92% sealing asset processing angular-occurrences-plugin + [webpack.Progress] 92% sealing asset processing AnyComponentStyleBudgetChecker + [webpack.Progress] 92% sealing asset processing + [webpack.Progress] 93% sealing after asset optimization + [webpack.Progress] 93% sealing after asset optimization + [webpack.Progress] 93% sealing recording + [webpack.Progress] 93% sealing recording + [webpack.Progress] 94% sealing after seal + [webpack.Progress] 94% sealing after seal + [webpack.Progress] 95% emitting emit + [webpack.Progress] 95% emitting emit + [webpack.Progress] 98% emitting after emit + [webpack.Progress] 98% emitting after emit SizeLimitsPlugin + [webpack.Progress] 98% emitting after emit + [webpack.Progress] 99% done plugins + [webpack.Progress] 99% done plugins CaseSensitivePathsPlugin + [webpack.Progress] 99% done plugins + [webpack.Progress] 99% + + [webpack.Progress] 99% cache store build dependencies + [webpack.Progress] 99% cache store build dependencies + [webpack.Progress] 99% cache begin idle + [webpack.Progress] 99% cache begin idle + [webpack.Progress] 100% + +C:/Users/Murhaf/Desktop/Projects/ngx-gallery/projects/ng-gallery/src/lib/gestures/mouse-sliding.directive.ts is part of the TypeScript compilation but it's unused. +Add only entry points to the 'files' or 'include' properties in your tsconfig. +C:/Users/Murhaf/Desktop/Projects/ngx-gallery/projects/ng-gallery/src/lib/models/slider.model.ts is part of the TypeScript compilation but it's unused. +Add only entry points to the 'files' or 'include' properties in your tsconfig. +C:/Users/Murhaf/Desktop/Projects/ngx-gallery/projects/ng-gallery/src/lib/models/styles.model.ts is part of the TypeScript compilation but it's unused. +Add only entry points to the 'files' or 'include' properties in your tsconfig. +C:/Users/Murhaf/Desktop/Projects/ngx-gallery/projects/ng-gallery/src/stories/basic/gallery-example.component.ts is part of the TypeScript compilation but it's unused. +Add only entry points to the 'files' or 'include' properties in your tsconfig. +asset size limit: The following asset(s) exceed the recommended size limit (244 KiB). +This can impact web performance. +Assets: + static/media/addon-library.7a58d2cb.png (456 KiB) + static/media/lightbox.436bc8f2.png (4.71 MiB) + main.71b3a662.iframe.bundle.js (468 KiB) + 841.7266fd30.iframe.bundle.js (583 KiB) + 615.cf78c208.iframe.bundle.js (795 KiB) + 29.d1709051.iframe.bundle.js (2.23 MiB) +entrypoint size limit: The following entrypoint(s) combined asset size exceeds the recommended limit (244 KiB). This can impact web performance. +Entrypoints: + main (2.69 MiB) + runtime~main.43f1b8ae.iframe.bundle.js + 29.d1709051.iframe.bundle.js + main.71b3a662.iframe.bundle.js + + [webpack.Progress] 99% cache shutdown + [webpack.Progress] 99% cache shutdown + [webpack.Progress] 100% + +info => Preview built (23 s) +info => Output directory: C:\Users\Murhaf\AppData\Local\Temp\chromatic--28884-PtdM9I0wjZqE diff --git a/documentation/changelog.html b/documentation/changelog.html new file mode 100644 index 00000000..50ad96c7 --- /dev/null +++ b/documentation/changelog.html @@ -0,0 +1,793 @@ + + + + + + ng-gallery-project documentation + + + + + + + + + + + + + +
+
+ + +
+
+ +

Changelog

+

12.0.0-beta.0

+
    +
  • All boolean inputs of <gallery> components can be set as string attributes
      +
    • e.g. <gallery autoHeight>, <gallery autoHeight="true"> and <gallery [autoHeight]="true"> sets the option's value to true.
    • +
    • e.g. <gallery autoHeight="false"> and <gallery [autoHeight]="false"> sets the option's value to false.
    • +
    +
  • +
  • All number inputs of <gallery> components can be set as string attributes
      +
    • e.g. <gallery playerInterval="2000"> and <gallery [playerInterval]="2000"> sets the option's value to 2000
    • +
    +
  • +
+

Improved performance

+
    +
  • refactor: Replace the scroll event with intersection observer to detect the active item while scrolling.
  • +
+

ItemAutoSize, ThumbAutoSize features

+
    +
  • enhance: Toggling itemAutoSize option is now reactive.
  • +
  • fix: [thumbAutosize] causes random invalid starting thumbnail scroller position when scrolling possible, closes #521
  • +
  • fix: [ItemAutosize] in website/safari browsers do not work as expected, closes #543
  • +
+

AutoHeight feature

+
    +
  • enhance: Auto-height feature is not more precise and works well with or without height transition
  • +
  • fix: Auto-height issue when screen size changes
  • +
+

Autoplay feature

+
    +
  • fix: autoplay resets the timer after navigated.
  • +
  • fix: autoplay only start the timer after the image is loaded.
  • +
+

Custom template

+
    +
  • feature: galleryImage directive has been added, which allows user to set this directive on img element inside their custom templates.
  • +
+

Breaking changes

+
    +
  • autoPlay option has been renamed to autoplay in small letters.
  • +
+

11.0.0

+
    +
  • feat: Add GalleryThumbDef, GalleryImageDef, GalleryItemDef, GalleryBoxDef to set custom templates.
  • +
  • feat: Add imageTemplate property to GalleryConfig.
  • +
  • feat: Add args property in case need to attach extra data with the gallery item.
  • +
  • enhance: Improve overall typings.
  • +
+

Breaking changes

+
    +
  • Usage of setting custom template has been changed! see the wiki page for more info.
  • +
  • The inputs itemTemplate, thumbTemplate and boxTemplate has been removed from the gallery component, however they still exist in GalleryConfig
  • +
+

10.0.0

+
    +
  • feat: Migrate to standalone components.
  • +
+

Breaking Changes

+
    +
  • Both GalleryModule and LightboxModule no longer provide the withConfig() method.
  • +
+

9.0.1

+
    +
  • Remove bezier-easing package from dependencies, closes #525 and #551 in 6c47ecb.
  • +
+

9.0.0

+
    +
  • Upgrade to Angular 16
  • +
+

8.0.4

+
    +
  • fix(core): Fix VideoItem typo, closes #529.
  • +
  • enhance(lightbox): Allow multiple classes for backdropPanel and panelClass config, closes 31368ed and #541.
  • +
+

8.0.3

+
    +
  • fix(core): SSR error, closes 532 in #533.
  • +
+

8.0.2

+
    +
  • feat(core): Add loadingAttr option to img and iframe elements, closes #513 in 093789b.
  • +
  • fix(core): Videos are unplayable if type not specified, closes #515 in 11ba153.
  • +
+

8.0.1

+
    +
  • fix(core): Gallery nav icons are not alignment properly, in d4dca8b.
  • +
  • fox(core): Gallery dots is not horizontally centralized, in f2d6910.
  • +
  • fix(core): Fix lib's angular peerDependencies version to >=15 in 9ea5ea3.
  • +
+

8.0.0

+
    +
  • feat(core): Add isActive to custom gallery template context, in 0b3f8bf.
  • +
  • refactor(core): Fix the iframe error regarding the allow attribute.
  • +
  • refactor(core): Change default navigation icons.
  • +
  • refactor(core): Change default dots size.
  • +
  • refactor(core): Change default counter styles.
  • +
  • regret(core): RemoveitemLoaded output.
  • +
+

8.0.0-beta.5

+
    +
  • regret(core): RemovecontentVisibilityAuto option for version 8.
  • +
  • feat(core): Add itemLoaded output which emits after an item is loaded, for image items it emits after the image is loaded.
  • +
  • feat(core): Add autoHeight option, when set to true, the gallery height will fit the active item height.
  • +
  • feat(core): Add autoItemSize option, when set to true, the item will fit its image aspect ratio.
  • +
  • feat(core): Add autoThumbSize option, when set to true, the thumb will fit its image aspect ratio.
  • +
  • feat(core): Add scrollBehavior option.
  • +
  • feat(core): Add navScrollBehavior option.
  • +
  • feat(core): Add thumbImageSize option.
  • +
  • feat(core): Add more options to the video item.
  • +
  • feat(core): Add configSnapshot to GalleryRef class.
  • +
  • feat(core): Add an optional parameter behavior to all next(behavior?), prev(behavior?), set(index, behavior?) functions, fallbacks to the scrollBehavior config.
  • +
  • refactor(core): Only display custom item template container when itemTemplate is provided.
  • +
+

8.0.0-beta.4

+
    +
  • feat(core): Add contentVisibilityAuto option to set the proper content-visibility and contain-intrinsic-size value on all gallery items/thumbs, in 73b20a9.
  • +
  • feat(core): Use native loading attribute on all img and iframe for native lazy loading.
  • +
  • refactor(core): Fix loop issue when sliding with using the mouse, in 1572bea.
  • +
  • refactor(core): Remove lazy-image directive.
  • +
+

8.0.0-beta.3

+
    +
  • fix(core): Set current index in sliding event does not work if slider size number has fraction, in 58e89fb.
  • +
+

8.0.0-beta.2

+
    +
  • fix(lightbox): close button is not displayed, in 506249b.
  • +
+

8.0.0-beta.1

+
    +
  • feat(core): Use scrolling slider instead of transform method, allows touchpad scroll to slide the gallery as well as native sliding on mobile browser.
  • +
  • feat(core): Add resizeDebounceTime option which is used to update the gallery on window resize event in 34a2723 and d867630.
  • +
  • feat(core): Add slidingEase and slidingDuration to customize sliding ease and duration in 4c1db03.
  • +
  • feat(core): Add thumbDetached to detach thumb slider, closes #289 in 1f47484.
  • +
  • feat(core): Add boxTemplate to the gallery, closes #487 in f46e33a.
  • +
  • feat(core): Add slidingDisabled and thumbSlidingDisabled options to enable/disable sliding on Mobile and Desktop using the touchpad. in 2451581.
  • +
  • feat(core): Add mouseSlidingDisabled and mouseThumbSlidingDisabled options to enable/disable sliding on Desktop using the mouse. in 2451581.
  • +
  • feat(core): Images not shown, when number of images get larger, closes #484 in e819ebe.
  • +
  • fix(core): thumbView="contain" Sliding thumbnails using gestures has an issue, closes #417 in e819ebe.
  • +
  • refactor(core): Remove thumbMode option from the gallery, in 18f71e3
  • +
  • refactor(core): Remove tapClick event and use native click event, in 3d960cc.
  • +
  • refactor(core): Remove ng-content from the gallery, in 63e3b6b.
  • +
  • refactor(core): Remove panSensitivity option, in d1f8d34.
  • +
  • refactor(core): Remove gestures option, in 70cb00c.
  • +
  • refactor(core): Remove reserveGesturesAction option, in 4b07fc7.
  • +
  • refactor(core): Remove zoomOut option, in 19ba2b8.
  • +
+

Breaking changes:

+

HammerJs is only used for sliding using the mouse on desktop only, Sliding on mobile devices is now native scroll.

+
    +
  • gestures option has been deprecated.
  • +
  • thumbMode option has been deprecated, sliding thumbnails is free.
  • +
  • zoomOut has been deprecated.
  • +
  • reserveGesturesAction has been deprecated.
  • +
  • panSensitivity has been deprecated.
  • +
  • Remove ng-content from the gallery, use boxTemplate option to add your custom layer.
  • +
  • The default value for loadingStrategy option has changed to LoadingStrategy.Preload.
  • +
  • Added new dependency bezier-easing.
  • +
+

7.1.2

+
    +
  • fix(core): Fix reserveGestureAction input and its default value in the lightbox, in ba95036.
  • +
  • fix(core): Update gallery sliding position properly on window resize, in f786d0a.
  • +
  • fix(core): Slide bug with touch scroll with gallery thumbnails, related to #465 in eb1e60c in a26d63f.
  • +
+

7.1.1

+
    +
  • feat(core): New option reserveGesturesAction adds the ability to block the scrolling of page when sliding the gallery on mobile browser, closes #477 in c105f21.
  • +
  • fix(core): Slide bug with touch scroll, closes #465 in eb1e60c.
  • +
+

7.1.0

+
    +
  • feat(core): Settings change shouldn't require restart, closes #466 in ee71e52.
  • +
  • fix(core): Unable to drag thumbnails properly, closes 473 in 8635701.
  • +
  • fix(core): Setting gestures to false breaks the gallery, closes #464, #467 and #469 in a374603.
  • +
  • fix(core): Set alt on gallery thumbnails and add role="button" to gallery nav, closes #468 in 57bebca.
  • +
  • fix(lightbox): Close icon in lightbox container being re-rendered all the time due to bug in template, closes #307 in 6bdc7a4.
  • +
  • enhance(core, lightbox): Remove deprecated usage, in 23506eb.
  • +
+

7.0.4

+
    +
  • fix(core): imageSize option when set to contain, in 3ecf94e.
  • +
+

7.0.3

+
    +
  • enhance(core): Use img element instead of div background image to display images, in b6b5120.
  • +
  • feat(core): Add alt property to GalleryImage, in b6b5120.
  • +
+

7.0.2

+
    +
  • fix(core): Should not show sliding effect on initial state, closes #458 in c810039.
  • +
+

7.0.1

+
    +
  • feat(core): Avoid triggering change detection while dragging in 8ed5948.
  • +
  • fix(core): Gallery thumbs vertical slider does not navigate when direction is up, closes #454 in 4eb7d2f.
  • +
+

7.0.0

+
    +
  • Update to Angular 14 in 64d5620.
  • +
+

6.0.1

+
    +
  • fix: Downgrade rxjs peerDependencies to v6 in 35f58fd.
  • +
+

6.0.0

+
    +
  • Update to Angular 13, closes #424 in #420.
  • +
+

5.1.1

+

Adds a new option to the global config as well as an input called thumbView which is expects a value of either default or contain

+
    +
  • feat(core): Thumbnails should always use the available space, closes #340 in ad3e514 and 5523b2e.
  • +
  • feat(core): Add stateSnapshot property to GalleryRef to get an instant snapshot of the gallery state observable.
  • +
  • fix(core): Video item displays the application instead of video, closes #398 in f07c304.
  • +
  • fix(core): Issue with gallery.remove() function, closes #405 in f0fb1c3 and 6e080b4.
  • +
+
+

Special thanks to @NexGenUA for his PR

+
+

5.0.0

+
    +
  • Upgrade to Angular 10.
  • +
  • feat(Lightbox): Add start/exit animation options, closes #346 in 6799a1c.
  • +
  • feat(video item): ability to disable video controls, in f6b48b1.
  • +
  • feat(video item, youtube item): Ability to autoplay, closes #304 in 9caf8bf.
  • +
  • feat(youtube item): Allow url parameters, closes #302 in 3760789.
  • +
  • fix(lightbox): Remove cdk styles import from the library.
  • +
  • fix(video item): Cannot read property 'nativeElement' of undefined, closes #353 in ff10363.
  • +
  • fix(video item): Sanitized urls not working in
  • +
+

5.0.0-beta.1

+
    +
  • Upgrade to Angular 9.
  • +
  • Combine all packages in one package.
  • +
  • Remove import HttpClientModule from GalleryModule.
  • +
+

Breaking changes

+

Before:

+
    +
  • The packages were published on @ngx-gallery/core, @ngx-gallery/lightbox and @ngx-gallery/gallerize.
  • +
+

After:

+
    +
  • All the packages are now combined in ng-gallery (NOTE: it is not ngx-gallery that is a different package).
  • +
  • Import GalleryMlodule from ng-gallery and LightboxModule from ng-gallery/lightbox.
  • +
  • The module GallerizeModule has been removed, the [gallerize] directive can still be used from the LightboxModule.
  • +
+

5.0.0-beta.0

+
    +
  • regret: Remove mode=intermediate option, closes #309 and #297 in b1df18c.
  • +
+

Breaking changes (There could be more breaking changes until version 5 is released which will make it compatible with Angular 9 and ivy)

+
    +
  • The loadingMode option has been removed from the gallery component's input and from the global options.
  • +
+

4.0.3

+
    +
  • fix(core): Fix universal error, closes #262 in fc6c3f7.
  • +
  • fix(core): clean up state subject in <gallery-image> component in 7796b50.
  • +
+

4.0.2-beta.0

+
    +
  • feat(core): Add thumbLoadingIcon and thumbLoadingError to gallery config, in 3f8cdca and f2cae92.
  • +
  • refactor(core): refactor the if/else logic in gallery image template, in f7d6a22.
  • +
+

4.0.1

+
    +
  • fix(core): Encapsulate the cache interceptor to gallery images only, closes #237 in 4616eec.
  • +
+

4.0.0

+
    +
  • feat(gallerize): Scan imageSrc and thumbSrc attributes for image sources, in 4826d52.
  • +
  • enhance(core, lightbox, gallerize): Ability to lazy load the library.
  • +
  • enhance(core, lightbox): Export GALLERY_CONFIG and LIGHTBOX_CONFIG tokens, in 56c704f and 9cab04b.
  • +
  • fix(core, lightbox): Add Optional() on injected config in gallery and lightbox services, closes #234 in 31624f9.
  • +
  • refactor(core, lightbox): Rename forRoot(config?) to withConfig(config), in 8446c1a.
  • +
  • refactor(lightbox): Remove providedIn: 'root' from Lightbox service and provid it locally in its module, in 7ba8dd9.
  • +
+

Breaking Changes

+
    +
  • The function forRoot() has been removed from GalleryModule and LightboxModule.
  • +
  • Use GalleryModule.withConfig({ ... }) to set config that applies on a module and its children (same applies on LightboxModule).
  • +
  • To set global config across the entire app while still lazy load the library, provide the GALLERY_CONFIG token with the config value in the root module (same applies on LightboxModule with LIGHTBOX_CONFIG).
  • +
+
Example: Lazy load the library
+

In this example, will set global config without importing the library in the main bundle

+
    +
  • Provide GALLERY_CONFIG value in the root module
  • +
+
import { GALLERY_CONFIG } from '@ngx-gallery/core';
+
+@NgModule({
+  providers: [
+    {
+      provide: GALLERY_CONFIG,
+      useValue: {
+        dots: true,
+        imageSize: 'cover'
+      }
+    }
+  ]
+})
+export class AppModule { }
    +
  • Import GalleryModule in a feature module
  • +
+
import { GalleryModule } from '@ngx-gallery/core';
+
+@NgModule({
+  imports: [
+    GalleryModule
+  ]
+})
+export class FeatureModule { }

4.0.0-beta.1

+
    +
  • feat(core): Add indeterminate option to the radial progress, in df682c4.
  • +
  • enhance(core): Enhance thumbnails loading styles, in f34f90a.
  • +
  • fix(core): Expose [dotSize], [bulletsPosition] and [counterPosition] options as inputs, in 946a856.
  • +
  • fix(core): Add [loadingMode] option to gallery images which accepts determinate or indeterminate , in e8bdfb2.
  • +
  • regression(core): Fix undisplayed thumb image when a custom thumb template is used, in 34f2cc6.
  • +
  • enhance(gallerize): Run gallerize detector outside angular zone, makes opening the lightbox smoother, in 284925d and 98901b9.
  • +
+

4.0.0-beta.0

+
    +
  • update(core, lightbox, gallerize): Update peer dependencies, closes #228 in bd8cdd3.

    +
  • +
  • feat(core): Add bulletsPosition option, closes #211 in 263d297.

    +
  • +
  • feat(core): Add dotsSize option, in e2e58b6.

    +
  • +
  • feat(core): Add counterPosition option, closes in ce7a8ad.

    +
  • +
  • feat(core): Use HttpClient to load and cache images in [lazyImage] directive, in 15c3e88.

    +
  • +
  • feat(core): Replace icon loader with a new radial progress component to report image loading progress while keeping the svg loading icon as an option, in a1028e8.

    +
  • +
  • feat(core): Add default error template to <gallery-image> in case if loading failed and add loadingError option for custom error template, in cd258f5 and 9dbf6c4.

    +
  • +
  • enhance(core): Enhance gallery dots styles, in de8d22b.

    +
  • +
  • enhance(core): Allow gallery image to use unsafe URLs, closes #218 in da1ace1.

    +
  • +
  • enhance(core): Use animationFrameScheduler for smoother sliding animation, in 38b0aa6.

    +
  • +
  • fix(core): Fix vertical scroll when using the gallery on touch devices, closes #161 in a239c29. (kudos goes to @harm-less)

    +
  • +
  • refactor(core): [lazyImage] directive => (loaded) event no longer emits on error.

    +
  • +
  • feat(lightbox): Set the focus back on the previously focused element when the lightbox is closed, in 266eddb.

    +
  • +
  • feat(lightbox): Add role, ariaLabel, ariaLabelledBy and ariaDescribedBy attributes to the lightbox config LightboxConfig, in a11d20d, 5b550e7.

    +
  • +
  • enhance(lightbox): Import overlay default styles from @angular/cdk/overlay, in 54c5d88.

    +
  • +
  • enhance(lightbox): Improve lightbox styles, in 4a52161.

    +
  • +
  • enhance(lightbox): Update lightbox overlay animation, closes #224 in bec077f.

    +
  • +
  • refactor(lightbox): Use disposeOnNavigation instead of Location service, in 2262164.

    +
  • +
+

3.3.1

+
    +
  • fix(core): Remove duplicate delete execution in the destroyer function, in ae541ca
  • +
  • fix(core): Check galleryRef exists before deleting, in a2b32e2
  • +
  • fix(core): Remove duplicate config set, in 834c001
  • +
  • fix(core): Remove unnecessary PortalModule import from GalleryModule, in 46ef735
  • +
  • refactor(core): Use povidedIn: 'root' for the Gallery service, in 86eeaa7
  • +
  • fix(core, lightbox): Fix peer dependencies, in 236e540.
  • +
+

3.3.0

+
    +
  • refactor(core): Use Map<string, GalleryRef> for instances holder type instead of untyped object in ac08077.
  • +
  • refactor(core): Rename gallery state$ and config$ to state and config in 8de515b and 1e4fd06.
  • +
  • enhance(core): Improve instance destroyer, gallery delete its instance on component destroy in 65f3358.
  • +
+

Breaking Changes

+
    +
  • Gallery can now be destroyed using its instance galleryRef.destroy().
  • +
  • In Gallery service the function destroy() has been removed.
  • +
+

3.2.0

+
    +
  • feature(core): Do not require importing global styles, closes #197 in ea041a5.
  • +
  • feature(core): Set the video type attribute on videos items, closes #199 in 06b3601.
  • +
  • feature(lightbox): Add a lightbox directive, closes #200 in ad2255b.
  • +
  • fix(gallery): fix LazyImage error event, closes #205 in db231aa
  • +
+

Breaking changes

+
    +
  • No need to manually import the styles anymore, they are imported internally with the components.

    +
  • +
  • Adding a video item with multiple url sources

    +

    Before:

    +
  • +
+
galleryRef.addVideo({
+  src: ['MP4_URL', 'OGG_URL'],
+  thumb: '(OPTIONAL)VIDEO_THUMBNAIL_URL',
+  poster: '(OPTIONAL)VIDEO_POSTER_URL'
+});

After:

+
galleryRef.addVideo({
+  src: [
+    { url: 'MP4_URL', type: 'video/mp4' },
+    { url: 'OGG_URL', type: 'video/ogg' }
+  ],
+  thumb: '(OPTIONAL)VIDEO_THUMBNAIL_URL',
+  poster: '(OPTIONAL)VIDEO_POSTER_URL'
+});

3.1.2

+
    +
  • fix(Lightbox): Check if location is defined before subscribing, closes #189 in 169b813.
  • +
+

3.1.1

+
    +
  • refactor(core): Convert imageSize attribute to an input + add it to gallery config, this makes it possible to use it in lightbox mode, closes #183 in 1fc70c4.
  • +
  • refactor(core): Make contain as the default value for imageSize option, in c7b3d39.
  • +
+

3.1.0

+
    +
  • feat(core): Add auto-play option, in e7fc03f.
  • +
  • feat(core): Add support for error handling, closes #154 in 12f6e5e.
  • +
  • refactor(core): Remove opacity transition from gallery-item, in a5b227e.
  • +
  • refactor(core): Use imageSize as an attribute, in 96c5c07.
  • +
  • refactor(core): Rename (player) output to (playingChange), in e209493.
  • +
  • enhance(core): Use default cursor when thumbnails are disabled, in 3582e95.
  • +
  • fix(core): fix vertical sliding direction, in cba5d59.
  • +
  • fix(core): fix thumbClick Output, in a730116.
  • +
+

3.1.0-beta.0

+ +
    +
  • feat(core): Add thumbMode option on thumbnails' slider (free scroll thumbnails), closes #135 in 8c6c99d.
  • +
  • feat(core): Add slide show player option, closes #152 in a331f46.
  • +
  • enhance(core): Ability to Import gallery styles individually #144 in ebb6667.
  • +
  • enhance(core): Run HammerJS gestures outside angular zone 6fabf6c.
  • +
  • enhance(core): Put SCSS and CSS each in its own folder, close #153 in 9783fc3.
  • +
  • enhance(core): Check if loadingSvg is defined before embedding it, close #150 in 5286640.
  • +
  • fix(core): fix wrong (thumbClick) emitter.
  • +
  • fix(core): fix gallery slider width which is set to 0 at the beginning, closes #151 in c26a286.
  • +
  • refactor(core): Set loop option to true by default.
  • +
  • refactor(core): Remove fluid option from gallery config and use it as an attribute instead. fixed in ecf3f88.
  • +
+ +
    +
  • feat(Lightbox): Close the lightbox when the location is changed, closes #108 in 1543374.
  • +
+

Breaking changes:

+ +
    +
  • Fluid option is now used as an attribute, not as an input.
  • +
+

Before:

+
<gallery [fluid]="true"></gallery>

After:

+
<gallery fluid></gallery>
    +
  • Scss and css styles are put each in its own folder
  • +
+

Before:

+
@import '~@ngx-gallery/core/styles/gallery';

After:

+
@import '~@ngx-gallery/core/styles/scss/gallery';
+// or for css
+@import '~@ngx-gallery/core/styles/css/gallery';

3.0.2

+
    +
  • refactor(Lightbox): fix the close button small size on iphone browser.
  • +
  • refactor(Lightbox): use <i> tag instead of <button> tag for the close button.
  • +
  • fix(core): Check if loadingIcon is defined in <gallery-image>, closes #133 and #132 in 24e6e26.
  • +
+

3.0.1

+
    +
  • feat(core): Allow using custom gallery item with custom template, closes #125 in 7e4c302.
  • +
+

3.0.0

+
    +
  • fix(Lightbox): Close the lightbox when the active route is changed #108 in d099abd.
  • +
+

3.0.0-beta.1

+
    +
  • refactor(core): add the loop input to gallery component, closes #98 in 727a4ca.
  • +
+

3.0.0-beta.0

+

Features:

+
    +
  • Support Angular 6 and RxJS 6, closes #91.
  • +
  • feat(core): Add helper functions to add different gallery items on <gallery> and GalleryRef.
  • +
  • feat(core): Add fluid option to gallery for full width size.
  • +
  • feat(core): Add navIcon option to gallery config to set a custom nav icon.
  • +
  • feat(core): AddloadingStrategy option to gallery which accepts one of the following: 'preload', 'lazy' or 'default', closes #87.
  • +
  • feat(core): Add itemClick output which emits when an item is clicked, closes #106.
  • +
  • feat(core): Support custom template inside the default item templates, add itemTemplate and thumbTemplate to gallery options.
  • +
  • feat(core): Multiple video sources support.
  • +
  • feat(core): Pause Video and Youtube items when active item changes.
  • +
  • feat(Gallerize): Add support to detect Gallery component.
  • +
  • feat(Gallerize): Add support to detect DOM background images.
  • +
+

Bug fixes:

+
    +
  • fix(core): Skip re-setting the config from <gallery> input in lightbox mode, closes #104.
  • +
  • fix(core): Fix wrong thumbnail position when [thumbPosition] is changed.
  • +
+

Improvements:

+
    +
  • refactor(core): Improve icon rendering, use svg element instead of background-image to render the nav icon in <gallery-nav>.
  • +
  • refactor(core): Add .g-active-item on current item and .g-active-thumb on current thumbnail.
  • +
  • refactor(core): Add .g-image-loaded class on <gallery-image> to indicates that the image has been loaded.
  • +
  • refactor(core): Replace loading output with loaded, which emits the image path after it loads.
  • +
  • refactor(core): Set an initial height of 500px.
  • +
  • refactor(core): Replace ImageItem VideoItem YoutubeItem and IframeItem constructor parameters with a single data parameter.
  • +
  • refactor(core, Lightbox): Set aria-label on all buttons.
  • +
  • refactor(Gallerize): Remove forClass input and replace it for selector input.
  • +
  • refactor(Gallerize): Remove CommonModule as it is not needed.
  • +
  • refactor(Styles): Add a prefix to all classes used in the plugin.
  • +
  • refactor(Styles): Add a transition for animate the opacity on current item and thumbnail.
  • +
+

Breaking changes:

+ +
    +
  • Before, To Create an image item, we used to pass the src and the thumbnail separate parameters.
  • +
+
const item: GalleryItem = new ImageItem('IMAGE_SRC', 'THUMB_SRC');
    +
  • After, The parameters are replaced with a single data object.
  • +
+
const item: GalleryItem = new ImageItem({ src: 'IMAGE_SRC', thumb: 'THUMB_SRC' });

Gallerize

+
    +
  • Before, Limiting auto-detection to a specific class used to be done as in the following code:
  • +
+
<div class="grid" gallerize forClass="my-img-class">
+  <img class="my-img-class" src="{{item.src}}">
+</div>
    +
  • After, Now forClass input has been replaced with selector input.
  • +
+
<div class="grid" gallerize selector=".my-img-class">
+  <img class="my-img-class" src="{{imgSource1}}">
+  <div class="my-img-class" [style.background]="'url(' + imgSource2 + ')'">
+</div>

2.1.1

+
    +
  • refactor(Lightbox Style): Clean up.
  • +
  • fix(HammerJS): Don't throw an error if hammer is not defined, just fallback to default.
  • +
  • feat(VideoItem): add a 3rd parameter to VideoItem to set custom poster.
  • +
+
const viewItem = new VideoItem(video.src, video.thumb, video.poster);
    +
  • refactor(core): rename thumbSrc to thumb.
  • +
+

Breaking Changes

+

This won't effect the usage, but you might need to update

+

GalleryItem data object has changed the name of the thumbnail source property from thumbSrc to thumb

+

This would only effect your app if you display the thumbnails list of your gallery items

+

Before

+
<div class="grid">
+  <div  class="grid-item"
+        *ngFor="let item of galleryItems$ | async; let i = index"
+        (click)="lightbox.open(i)">
+    <img class="grid-image" [src]="item.data.thumbSrc">
+  </div>
+</div>

After

+
<div class="grid">
+  <div  class="grid-item"
+        *ngFor="let item of galleryItems$ | async; let i = index"
+        (click)="lightbox.open(i)">
+    <img class="grid-image" [src]="item.data.thumb">
+  </div>
+</div>

2.0.4

+
    +
  • feat(GalleryConfig): add loadingIcon to GalleryConfig that accepts inline image.
  • +
+

2.0.3

+
    +
  • fix(Lightbox): Exit animation, closes #73.
  • +
  • fix(Lightbox): close button is clicking behind, closes #54.
  • +
  • refactor(Lightbox): Use the button tag instead of div for close button.
  • +
+

2.0.2

+
    +
  • enhancement(Gallerize): Use MutationObserver instead of ngAfterContentChecked to prevent infinite loop in default change detection strategy, closes #70.
  • +
+

2.0.1

+
    +
  • feat(GallerySlider): Rearrange slider on window resize, closes #67.
  • +
+

2.0.0

+
    +
  • fix(Swiping): Remove ngZone, closes #64.
  • +
+

2.0.0-beta.4

+
    +
  • feat(LightboxConfig): Adds fullscreen option to the lightbox, closes #43.
  • +
+

By default fullscreen is obtained on small screen (mobile) but now you can make it as default for all screens

+
GalleryModule.forRoot()
+LightboxModule.forRoot({
+  panelClass: 'fullscreen'
+})
    +
  • feat(Lightbox): Ability to define lightbox config using lightbox.open() method
  • +
+
openLightbox() {
+  this.lightbox.open(0, 'lightbox', {
+    panelClass: 'fullscreen'
+  });
+}

2.0.0-beta.3

+
    +
  • Prevents native click event bubbling, closes #57
  • +
+

2.0.0-beta

+

Written from scratch

+

1.0.1

+
    +
  • fix double click on thumbnails and bullets, closes #45.
  • +
+

1.0.0

+

Fixes:

+
    +
  • fix(GalleryNav): Hide navigation on panning.
  • +
  • fix(GalleryPlayer): Wait until image is loaded before starting the timer.
  • +
+

Features:

+
    +
  • feat(GalleryPlayer): Add progressbar color option.
  • +
  • feat(GalleryPlayer): Add progressbar thickness option.
  • +
  • feat(GalleryPlayer): Add position option top and bottom.
  • +
  • feat(GalleryActions): Add gallery events
  • +
  • feat(GalleryNav): Add prevClass and nextClass options to customize navigation icons
  • +
  • feat(classNames) Add className option to container, thumbnails, bullets
  • +
+

Performance Improvements:

+
    +
  • refactor(GalleryThumbnail) improve performance
  • +
+

Breaking Changes:

+
    +
  • refactor(GalleryConfig): rename config.thumbnails.space to config.thumbnails.margin
  • +
  • refactor(GalleryBullets): remove vertical positioning right and left
  • +
+

1.0.0-beta.8

+
    +
  • fix(keyboard listener in lightbox) closes #24, #33.
  • +
  • refactor(Gallerize directive) Use MutationObserver instead of DOMSubtreeModified, closes #26.
  • +
  • fix(Universal support), closes #9.
  • +
  • fix Angular 5 warning, closes #21.
  • +
  • Improve gallery lightbox, closes #20.
  • +
  • Improve gallery lightbox slide animation, closes #8.
  • +
  • Use Angular CDK for the gallery lightbox.
  • +
  • refactor(GalleryConfig)
  • +
  • Remove image transition animation option because it was not implemented properly.
  • +
+

0.7.1

+
    +
  • General refactor
  • +
  • fix(GalleryDirective) apply gallerize only once when content changes
  • +
  • decode gallery nav icons and close button from base64 to decrease the size
  • +
+

0.7.0

+
    +
  • feat(LazyLoad) emit only last selected image.
  • +
  • fix(GalleryImage) fade animation is working properly with image load.
  • +
  • refactor(GalleryConfig)
  • +
+

0.6.3

+
    +
  • fix(GalleryModal) close button is hidden on mobile, closes #9
  • +
  • fix umd bundle for systemjs, closes #10
  • +
+

0.6.2

+
    +
  • fix(gestures) remove navigation element on mobile which was blocking gestures events
  • +
  • fix(gestures) enable/disable gestures using config.gestures
  • +
  • refactor(config) interfaces
  • +
+

0.6.0 beta

+
    +
  • Add popup animation for gallery modal
  • +
  • Remove incorrect slide animation
  • +
  • Make gestures optional, closes #2
  • +
  • Remove thumbnail vertical position (right and left) positions, closes #3
  • +
+

0.5.2 beta

+
    +
  • (feat) gestures support
  • +
  • (refactor) gallery config
  • +
+

0.5.0 beta

+
    +
  • Initial release
  • +
+ + + + + + + + + + + + + + + + + + + + +
+
+

results matching ""

+
    +
    +
    +

    No results matching ""

    +
    +
    +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/documentation/classes/ActiveItemObserver.html b/documentation/classes/ActiveItemObserver.html new file mode 100644 index 00000000..e2ee6791 --- /dev/null +++ b/documentation/classes/ActiveItemObserver.html @@ -0,0 +1,320 @@ + + + + + + ng-gallery-project documentation + + + + + + + + + + + + + +
    +
    + + +
    +
    + + + + + + + + + + + + + + + + +
    +
    +

    +

    File

    +

    +

    + projects/ng-gallery/src/lib/observers/active-item-observer.ts +

    + + + + + + +
    +

    Index

    + + + + + + + + + + + + + + + +
    +
    Methods
    +
    + +
    +
    + + + +
    + +

    + Methods +

    + + + + + + + + + + + + + + + + + + + +
    + + + observe + + +
    +observe(root: HTMLElement, elements: HTMLElement[], rootMargin: string) +
    + +
    + +
    + Parameters : + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    NameTypeOptional
    root + HTMLElement + + No +
    elements + HTMLElement[] + + No +
    rootMargin + string + + No +
    +
    +
    +
    +
    + Returns : Observable<number> + +
    +
    + +
    +
    +
    + + + + + +
    + + +
    +
    import { Observable, Subscriber, mergeMap, filter, map } from 'rxjs';
    +
    +export class ActiveItemObserver {
    +
    +  observe(root: HTMLElement, elements: HTMLElement[], rootMargin: string): Observable<number> {
    +    return createIntersectionObserver(root, elements, rootMargin).pipe(
    +      map((entry: IntersectionObserverEntry) => {
    +        if (entry.isIntersecting) {
    +          entry.target.classList.add('g-item-highlight');
    +          return +entry.target.getAttribute('galleryIndex');
    +        } else {
    +          entry.target.classList.remove('g-item-highlight');
    +          return -1;
    +        }
    +      }),
    +      filter((index: number) => index !== -1)
    +    );
    +  }
    +}
    +
    +function createIntersectionObserver(root: HTMLElement, elements: HTMLElement[], rootMargin: string): Observable<IntersectionObserverEntry> {
    +  return new Observable((observer: Subscriber<IntersectionObserverEntry[]>) => {
    +    const intersectionObserver: IntersectionObserver = new IntersectionObserver(
    +      (entries: IntersectionObserverEntry[]) => observer.next(entries),
    +      {
    +        root,
    +        rootMargin,
    +        threshold: 1
    +      }
    +    );
    +    elements.forEach((element: HTMLElement) => intersectionObserver.observe(element));
    +    return () => {
    +      elements.forEach((element: HTMLElement) => intersectionObserver.unobserve(element));
    +      intersectionObserver.disconnect();
    +    };
    +  }).pipe(
    +    mergeMap((entries: IntersectionObserverEntry[]) => entries)
    +  );
    +}
    +
    +
    +
    +
    + + + + + + + + +
    +
    +

    results matching ""

    +
      +
      +
      +

      No results matching ""

      +
      +
      +
      + +
      +
      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/documentation/classes/GalleryRef.html b/documentation/classes/GalleryRef.html new file mode 100644 index 00000000..8a540ad0 --- /dev/null +++ b/documentation/classes/GalleryRef.html @@ -0,0 +1,2182 @@ + + + + + + ng-gallery-project documentation + + + + + + + + + + + + + +
      +
      + + +
      +
      + + + + + + + + + + + + + + + + +
      +
      +

      +

      File

      +

      +

      + projects/ng-gallery/src/lib/services/gallery-ref.ts +

      + + + + + + +
      +

      Index

      + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      +
      Properties
      +
      + +
      +
      Methods
      +
      + +
      +
      Accessors
      +
      + +
      +
      + +
      +

      Constructor

      + + + + + + + + + + + + + +
      +constructor(config: GalleryConfig, deleteInstance: () => void) +
      + +
      +
      + Parameters : + + + + + + + + + + + + + + + + + + + + + + + + + + +
      NameTypeOptional
      config + GalleryConfig + + No +
      deleteInstance + function + + No +
      +
      +
      +
      + +
      + +

      + Properties +

      + + + + + + + + + + + + + + + + + +
      + + + Private + Readonly + _config + + +
      + Type : BehaviorSubject<GalleryConfig> + +
      + +
      +

      Stream that emits gallery config

      +
      +
      + + + + + + + + + + + + + + + + + +
      + + + Private + Readonly + _state + + +
      + Type : BehaviorSubject<GalleryState> + +
      + +
      +

      Stream that emits gallery state

      +
      +
      + + + + + + + + + + + + + + + + + +
      + + + Readonly + config + + +
      + Type : Observable<GalleryConfig> + +
      + +
      +

      Stream that emits gallery config

      +
      +
      + + + + + + + + + + + + + + + + + +
      + + + Readonly + error + + +
      + Default value : new Subject<GalleryError>() +
      + +
      +

      Stream that emits on an error occurs

      +
      +
      + + + + + + + + + + + + + + + + + +
      + + + Readonly + itemClick + + +
      + Default value : new Subject<number>() +
      + +
      +

      Stream that emits on item click

      +
      +
      + + + + + + + + + + + + + + + + + +
      + + + Readonly + state + + +
      + Type : Observable<GalleryState> + +
      + +
      +

      Stream that emits gallery state

      +
      +
      + + + + + + + + + + + + + + + + + +
      + + + Readonly + thumbClick + + +
      + Default value : new Subject<number>() +
      + +
      +

      Stream that emits on thumbnail click

      +
      +
      +
      + +
      + +

      + Methods +

      + + + + + + + + + + + + + + + + + + + +
      + + + add + + +
      +add(item: GalleryItem, active?: boolean) +
      + +
      +

      Add gallery item

      +
      + +
      + Parameters : + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      NameTypeOptional
      item + GalleryItem + + No +
      active + boolean + + Yes +
      +
      +
      +
      +
      + Returns : void + +
      +
      + +
      +
      + + + + + + + + + + + + + + + + + + + +
      + + + addIframe + + +
      +addIframe(data: IframeItemData, active?: boolean) +
      + +
      +

      Add iframe item

      +
      + +
      + Parameters : + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      NameTypeOptional
      data + IframeItemData + + No +
      active + boolean + + Yes +
      +
      +
      +
      +
      + Returns : void + +
      +
      + +
      +
      + + + + + + + + + + + + + + + + + + + +
      + + + addImage + + +
      +addImage(data: ImageItemData, active?: boolean) +
      + +
      +

      Add image item

      +
      + +
      + Parameters : + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      NameTypeOptional
      data + ImageItemData + + No +
      active + boolean + + Yes +
      +
      +
      +
      +
      + Returns : void + +
      +
      + +
      +
      + + + + + + + + + + + + + + + + + + + +
      + + + addVideo + + +
      +addVideo(data: VideoItemData, active?: boolean) +
      + +
      +

      Add video item

      +
      + +
      + Parameters : + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      NameTypeOptional
      data + VideoItemData + + No +
      active + boolean + + Yes +
      +
      +
      +
      +
      + Returns : void + +
      +
      + +
      +
      + + + + + + + + + + + + + + + + + + + +
      + + + addYoutube + + +
      +addYoutube(data: YoutubeItemData, active?: boolean) +
      + +
      +

      Add Youtube item

      +
      + +
      + Parameters : + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      NameTypeOptional
      data + YoutubeItemData + + No +
      active + boolean + + Yes +
      +
      +
      +
      +
      + Returns : void + +
      +
      + +
      +
      + + + + + + + + + + + + + + + + + + + +
      + + + destroy + + +
      +destroy() +
      + +
      +

      Destroy gallery

      +
      + +
      + Returns : void + +
      +
      + + + + + + + + + + + + + + + + + + + +
      + + + load + + +
      +load(items: GalleryItem[]) +
      + +
      +

      Load items and reset the state

      +
      + +
      + Parameters : + + + + + + + + + + + + + + + + + + + +
      NameTypeOptional
      items + GalleryItem[] + + No +
      +
      +
      +
      +
      + Returns : void + +
      +
      + +
      +
      + + + + + + + + + + + + + + + + + + + +
      + + + next + + +
      +next(behavior: ScrollBehavior, loop: boolean) +
      + +
      +

      Next item

      +
      + +
      + Parameters : + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      NameTypeOptionalDefault value
      behavior + ScrollBehavior + + No + + this._config.value.scrollBehavior +
      loop + boolean + + No + + true +
      +
      +
      +
      +
      + Returns : void + +
      +
      + +
      +
      + + + + + + + + + + + + + + + + + + + +
      + + + play + + +
      +play(interval?: number) +
      + +
      +

      Start gallery player

      +
      + +
      + Parameters : + + + + + + + + + + + + + + + + + + + +
      NameTypeOptional
      interval + number + + Yes +
      +
      +
      +
      +
      + Returns : void + +
      +
      + +
      +
      + + + + + + + + + + + + + + + + + + + +
      + + + prev + + +
      +prev(behavior: ScrollBehavior, loop: boolean) +
      + +
      +

      Prev item

      +
      + +
      + Parameters : + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      NameTypeOptionalDefault value
      behavior + ScrollBehavior + + No + + this._config.value.scrollBehavior +
      loop + boolean + + No + + true +
      +
      +
      +
      +
      + Returns : void + +
      +
      + +
      +
      + + + + + + + + + + + + + + + + + + + +
      + + + remove + + +
      +remove(i: number) +
      + +
      +

      Remove gallery item

      +
      + +
      + Parameters : + + + + + + + + + + + + + + + + + + + +
      NameTypeOptional
      i + number + + No +
      +
      +
      +
      +
      + Returns : void + +
      +
      + +
      +
      + + + + + + + + + + + + + + + + + + + +
      + + + reset + + +
      +reset() +
      + +
      +

      Reset gallery to initial state

      +
      + +
      + Returns : void + +
      +
      + + + + + + + + + + + + + + + + + + + +
      + + + set + + +
      +set(i: number, behavior: ScrollBehavior) +
      + +
      +

      Set active item

      +
      + +
      + Parameters : + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      NameTypeOptionalDefault value
      i + number + + No + +
      behavior + ScrollBehavior + + No + + this._config.value.scrollBehavior +
      +
      +
      +
      +
      + Returns : void + +
      +
      + +
      +
      + + + + + + + + + + + + + + + + + + + +
      + + + setConfig + + +
      +setConfig(config: GalleryConfig) +
      + +
      +

      Set gallery config

      +
      + +
      + Parameters : + + + + + + + + + + + + + + + + + + + +
      NameTypeOptional
      config + GalleryConfig + + No +
      +
      +
      +
      +
      + Returns : void + +
      +
      + +
      +
      + + + + + + + + + + + + + + + + + + + +
      + + + Private + setState + + +
      + + setState(state: GalleryState) +
      + +
      +

      Set gallery state

      +
      + +
      + Parameters : + + + + + + + + + + + + + + + + + + + +
      NameTypeOptional
      state + GalleryState + + No +
      +
      +
      +
      +
      + Returns : void + +
      +
      + +
      +
      + + + + + + + + + + + + + + + + + + + +
      + + + stop + + +
      +stop() +
      + +
      +

      Stop gallery player

      +
      + +
      + Returns : void + +
      +
      +
      + + + + + +
      +

      + Accessors +

      + + + + + + + + + + + + + + +
      + + stateSnapshot +
      + getstateSnapshot() +
      + +
      + + + + + + + + + + + + + + +
      + + configSnapshot +
      + getconfigSnapshot() +
      + +
      + + + + + + + + + + + + + + + + + +
      + + initialized +
      + getinitialized() +
      + +
      +

      Stream that emits when gallery is initialized/reset

      +
      + +
      + Returns : Observable<GalleryState> + +
      +
      + + + + + + + + + + + + + + + + + +
      + + itemsChanged +
      + getitemsChanged() +
      + +
      +

      Stream that emits when items is changed (items loaded, item added, item removed)

      +
      + +
      + Returns : Observable<GalleryState> + +
      +
      + + + + + + + + + + + + + + + + + +
      + + indexChanged +
      + getindexChanged() +
      + +
      +

      Stream that emits when current item is changed

      +
      + +
      + Returns : Observable<GalleryState> + +
      +
      + + + + + + + + + + + + + + + + + +
      + + playingChanged +
      + getplayingChanged() +
      + +
      +

      Stream that emits when the player should start or stop

      +
      + +
      + Returns : Observable<GalleryState> + +
      +
      +
      +
      + + +
      +
      import { BehaviorSubject, Subject, Observable, filter } from 'rxjs';
      +import { defaultState } from '../utils/gallery.default';
      +import { GalleryError, GalleryItem, GalleryState } from '../models/gallery.model';
      +import { GalleryConfig } from '../models/config.model';
      +import { GalleryAction } from '../models/constants';
      +import {
      +  IframeItem,
      +  IframeItemData,
      +  ImageItem,
      +  ImageItemData,
      +  VideoItem,
      +  VideoItemData,
      +  YoutubeItem,
      +  YoutubeItemData
      +} from '../components/templates/items.model';
      +
      +const filterActions = (actions: string[]) => {
      +  return filter((state: GalleryState) => actions.indexOf(state.action) > -1);
      +};
      +
      +export class GalleryRef {
      +
      +  /** Stream that emits gallery state */
      +  private readonly _state: BehaviorSubject<GalleryState>;
      +
      +  /** Stream that emits gallery config */
      +  private readonly _config: BehaviorSubject<GalleryConfig>;
      +
      +  /** Stream that emits on item click */
      +  readonly itemClick = new Subject<number>();
      +
      +  /** Stream that emits on thumbnail click */
      +  readonly thumbClick = new Subject<number>();
      +
      +  /** Stream that emits on an error occurs */
      +  readonly error = new Subject<GalleryError>();
      +
      +  /** Gallery Events */
      +
      +  /** Stream that emits gallery state */
      +  readonly state: Observable<GalleryState>;
      +
      +  /** Stream that emits gallery config */
      +  readonly config: Observable<GalleryConfig>;
      +
      +  get stateSnapshot(): GalleryState {
      +    return this._state.value;
      +  }
      +
      +  get configSnapshot(): GalleryConfig {
      +    return this._config.value;
      +  }
      +
      +  /** Stream that emits when gallery is initialized/reset */
      +  get initialized(): Observable<GalleryState> {
      +    return this.state.pipe(filterActions([GalleryAction.INITIALIZED]));
      +  }
      +
      +  /** Stream that emits when items is changed (items loaded, item added, item removed) */
      +  get itemsChanged(): Observable<GalleryState> {
      +    return this.state.pipe(filterActions([GalleryAction.ITEMS_CHANGED]));
      +  }
      +
      +  /** Stream that emits when current item is changed */
      +  get indexChanged(): Observable<GalleryState> {
      +    return this.state.pipe(filterActions([GalleryAction.INDEX_CHANGED]));
      +  }
      +
      +  /** Stream that emits when the player should start or stop */
      +  get playingChanged(): Observable<GalleryState> {
      +    return this.state.pipe(filterActions([GalleryAction.PLAY, GalleryAction.STOP]));
      +  }
      +
      +  constructor(config: GalleryConfig, private deleteInstance: () => void) {
      +    this._state = new BehaviorSubject<GalleryState>(defaultState);
      +    this._config = new BehaviorSubject<GalleryConfig>(config);
      +    this.state = this._state.asObservable();
      +    this.config = this._config.asObservable();
      +  }
      +
      +  /**
      +   * Set gallery state
      +   */
      +  private setState(state: GalleryState): void {
      +    this._state.next({ ...this.stateSnapshot, ...state });
      +  }
      +
      +  /**
      +   * Set gallery config
      +   */
      +  setConfig(config: GalleryConfig): void {
      +    this._config.next({ ...this._config.value, ...config });
      +  }
      +
      +  /**
      +   * Add gallery item
      +   */
      +  add(item: GalleryItem, active?: boolean): void {
      +    const items: GalleryItem[] = [...this.stateSnapshot.items, item];
      +    this.setState({
      +      action: GalleryAction.ITEMS_CHANGED,
      +      items,
      +      hasNext: items.length > 1,
      +      currIndex: active ? items.length - 1 : this.stateSnapshot.currIndex
      +    });
      +  }
      +
      +  /**
      +   * Add image item
      +   */
      +  addImage(data: ImageItemData, active?: boolean): void {
      +    this.add(new ImageItem(data), active);
      +  }
      +
      +  /**
      +   * Add video item
      +   */
      +  addVideo(data: VideoItemData, active?: boolean): void {
      +    this.add(new VideoItem(data), active);
      +  }
      +
      +  /**
      +   * Add iframe item
      +   */
      +  addIframe(data: IframeItemData, active?: boolean): void {
      +    this.add(new IframeItem(data), active);
      +  }
      +
      +  /**
      +   * Add Youtube item
      +   */
      +  addYoutube(data: YoutubeItemData, active?: boolean): void {
      +    this.add(new YoutubeItem(data), active);
      +  }
      +
      +  /**
      +   * Remove gallery item
      +   */
      +  remove(i: number): void {
      +    const state: GalleryState = this.stateSnapshot;
      +    const items: GalleryItem[] = [
      +      ...state.items.slice(0, i),
      +      ...state.items.slice(i + 1, state.items.length)
      +    ];
      +    this.setState({
      +      action: GalleryAction.ITEMS_CHANGED,
      +      currIndex: i < 1 ? state.currIndex : i - 1,
      +      items,
      +      hasNext: items.length > 1,
      +      hasPrev: i > 0
      +    });
      +  }
      +
      +  /**
      +   * Load items and reset the state
      +   */
      +  load(items: GalleryItem[]): void {
      +    if (items) {
      +      this.setState({
      +        action: GalleryAction.ITEMS_CHANGED,
      +        items,
      +        hasNext: items.length > 1,
      +        hasPrev: false
      +      });
      +    }
      +  }
      +
      +  /**
      +   * Set active item
      +   */
      +  set(i: number, behavior: ScrollBehavior = this._config.value.scrollBehavior): void {
      +    if (i < 0 || i >= this.stateSnapshot.items.length) {
      +      console.error(`[NgGallery]: Unable to set the active item because the given index (${ i }) is outside the items range!`);
      +      return;
      +    }
      +    if (i !== this.stateSnapshot.currIndex) {
      +      this.setState({
      +        behavior,
      +        action: GalleryAction.INDEX_CHANGED,
      +        currIndex: i,
      +        hasNext: i < this.stateSnapshot.items.length - 1,
      +        hasPrev: i > 0
      +      });
      +    }
      +  }
      +
      +  /**
      +   * Next item
      +   */
      +  next(behavior: ScrollBehavior = this._config.value.scrollBehavior, loop: boolean = true): void {
      +    if (this.stateSnapshot.hasNext) {
      +      this.set(this.stateSnapshot.currIndex + 1, behavior);
      +    } else if (loop && this._config.value.loop) {
      +      this.set(0, behavior);
      +    }
      +  }
      +
      +  /**
      +   * Prev item
      +   */
      +  prev(behavior: ScrollBehavior = this._config.value.scrollBehavior, loop: boolean = true): void {
      +    if (this.stateSnapshot.hasPrev) {
      +      this.set(this.stateSnapshot.currIndex - 1, behavior);
      +    } else if (loop && this._config.value.loop) {
      +      this.set(this.stateSnapshot.items.length - 1, behavior);
      +    }
      +  }
      +
      +  /**
      +   * Start gallery player
      +   */
      +  play(interval?: number): void {
      +    if (interval) {
      +      this.setConfig({ playerInterval: interval });
      +    }
      +    this.setState({ action: GalleryAction.PLAY, isPlaying: true });
      +  }
      +
      +  /**
      +   * Stop gallery player
      +   */
      +  stop(): void {
      +    this.setState({ action: GalleryAction.STOP, isPlaying: false });
      +  }
      +
      +  /**
      +   * Reset gallery to initial state
      +   */
      +  reset(): void {
      +    this.setState(defaultState);
      +  }
      +
      +  /**
      +   * Destroy gallery
      +   */
      +  destroy(): void {
      +    this._state.complete();
      +    this._config.complete();
      +    this.itemClick.complete();
      +    this.thumbClick.complete();
      +    this.deleteInstance();
      +  }
      +
      +}
      +
      +
      +
      + + + + + + + + +
      +
      +

      results matching ""

      +
        +
        +
        +

        No results matching ""

        +
        +
        +
        + +
        +
        + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/documentation/classes/HorizontalAdapter.html b/documentation/classes/HorizontalAdapter.html new file mode 100644 index 00000000..e26990e4 --- /dev/null +++ b/documentation/classes/HorizontalAdapter.html @@ -0,0 +1,1109 @@ + + + + + + ng-gallery-project documentation + + + + + + + + + + + + + +
        +
        + + +
        +
        + + + + + + + + + + + + + + + + +
        +
        +

        +

        File

        +

        +

        + projects/ng-gallery/src/lib/components/adapters/main-adapters.ts +

        + + + + +

        +

        Implements

        +

        +

        + SliderAdapter +

        + + +
        +

        Index

        + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +
        Properties
        +
        + +
        +
        Methods
        +
        + +
        +
        Accessors
        +
        + +
        +
        + +
        +

        Constructor

        + + + + + + + + + + + + + +
        +constructor(slider: HTMLElement, config: GalleryConfig) +
        + +
        +
        + Parameters : + + + + + + + + + + + + + + + + + + + + + + + + + + +
        NameTypeOptional
        slider + HTMLElement + + No +
        config + GalleryConfig + + No +
        +
        +
        +
        + +
        + +

        + Properties +

        + + + + + + + + + + + + + + +
        + + + Public + config + + +
        + Type : GalleryConfig + +
        + +
        + + + + + + + + + + + + + + + + + +
        + + + Readonly + hammerDirection + + +
        + Type : number + +
        + Default value : Hammer?.DIRECTION_HORIZONTAL +
        + +
        + + + + + + + + + + + + + + + + + +
        + + + Readonly + scrollSnapType + + +
        + Type : string + +
        + Default value : 'x mandatory' +
        + +
        + + + + + + + + + + + + + + +
        + + + Public + slider + + +
        + Type : HTMLElement + +
        + +
        +
        + +
        + +

        + Methods +

        + + + + + + + + + + + + + + + + + + + +
        + + + getCentralizerEndSize + + +
        +getCentralizerEndSize() +
        + +
        + +
        + Returns : number + +
        +
        + + + + + + + + + + + + + + + + + + + +
        + + + getCentralizerStartSize + + +
        +getCentralizerStartSize() +
        + +
        + +
        + Returns : number + +
        +
        + + + + + + + + + + + + + + + + + + + +
        + + + getElementRootMargin + + +
        +getElementRootMargin(viewport: HTMLElement, el: HTMLElement) +
        + +
        + +
        + Parameters : + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        NameTypeOptional
        viewport + HTMLElement + + No +
        el + HTMLElement + + No +
        +
        +
        +
        +
        + Returns : string + +
        +
        + +
        +
        + + + + + + + + + + + + + + + + + + + +
        + + + getHammerValue + + +
        +getHammerValue(value: number, e: any, behavior: ScrollBehavior) +
        + +
        + +
        + Parameters : + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        NameTypeOptional
        value + number + + No +
        e + any + + No +
        behavior + ScrollBehavior + + No +
        +
        +
        +
        +
        + Returns : ScrollToOptions + +
        +
        + +
        +
        + + + + + + + + + + + + + + + + + + + +
        + + + getHammerVelocity + + +
        +getHammerVelocity(e: any) +
        + +
        + +
        + Parameters : + + + + + + + + + + + + + + + + + + + +
        NameTypeOptional
        e + any + + No +
        +
        +
        +
        +
        + Returns : number + +
        +
        + +
        +
        + + + + + + + + + + + + + + + + + + + +
        + + + getRootMargin + + +
        +getRootMargin() +
        + +
        + +
        + Returns : string + +
        +
        + + + + + + + + + + + + + + + + + + + +
        + + + getScrollToValue + + +
        +getScrollToValue(el: HTMLElement, behavior: ScrollBehavior) +
        + +
        + +
        + Parameters : + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        NameTypeOptional
        el + HTMLElement + + No +
        behavior + ScrollBehavior + + No +
        +
        +
        +
        +
        + Returns : SmoothScrollToOptions + +
        +
        + +
        +
        +
        + + + + + +
        +

        + Accessors +

        + + + + + + + + + + + + + + +
        + + scrollValue +
        + getscrollValue() +
        + +
        + + + + + + + + + + + + + + +
        + + clientSize +
        + getclientSize() +
        + +
        + + + + + + + + + + + + + + +
        + + isContentLessThanContainer +
        + getisContentLessThanContainer() +
        + +
        +
        +
        + + +
        +
        import { GalleryConfig } from '../../models/config.model';
        +import { SliderAdapter } from './base-adapter';
        +import { SmoothScrollToOptions } from '../../smooth-scroll';
        +
        +declare const Hammer: any;
        +
        +export class HorizontalAdapter implements SliderAdapter {
        +
        +  readonly hammerDirection: number = Hammer?.DIRECTION_HORIZONTAL;
        +
        +  readonly scrollSnapType: string = 'x mandatory';
        +
        +  get scrollValue(): number {
        +    return this.slider.scrollLeft;
        +  }
        +
        +  get clientSize(): number {
        +    return this.slider.clientWidth;
        +  }
        +
        +  get isContentLessThanContainer(): boolean {
        +    return this.clientSize >= this.slider.firstElementChild.clientWidth;
        +  }
        +
        +  constructor(public slider: HTMLElement, public config: GalleryConfig) {
        +  }
        +
        +  getScrollToValue(el: HTMLElement, behavior: ScrollBehavior): SmoothScrollToOptions {
        +    const position: number = el.offsetLeft - ((this.clientSize - el.clientWidth) / 2);
        +    return {
        +      start: position,
        +      duration: behavior === 'smooth' ? this.config.slidingDuration : 0,
        +      easing: this.config.slidingEase
        +    };
        +  }
        +
        +  getRootMargin(): string {
        +    return `1000px 1px 1000px 1px`;
        +  }
        +
        +  getElementRootMargin(viewport: HTMLElement, el: HTMLElement): string {
        +    const rootMargin: number = -1 * ((viewport.clientWidth - el.clientWidth) / 2) + 1;
        +    return `0px ${ rootMargin }px 0px ${ rootMargin }px`;
        +  }
        +
        +  getCentralizerStartSize(): number {
        +    if (this.isContentLessThanContainer) {
        +      const size: number = this.clientSize - this.slider.firstElementChild.clientWidth;
        +      return size / 2;
        +    }
        +    return (this.clientSize / 2) - (this.slider.firstElementChild.firstElementChild?.clientWidth / 2);
        +  }
        +
        +  getCentralizerEndSize(): number {
        +    if (this.isContentLessThanContainer) {
        +      const size: number = this.clientSize - this.slider.firstElementChild.clientWidth;
        +      return size / 2;
        +    }
        +    return (this.clientSize / 2) - (this.slider.firstElementChild.lastElementChild?.clientWidth / 2);
        +  }
        +
        +  getHammerVelocity(e: any): number {
        +    return e.velocityX;
        +  }
        +
        +  getHammerValue(value: number, e: any, behavior: ScrollBehavior): ScrollToOptions {
        +    return {
        +      behavior,
        +      left: value - e.deltaX
        +    };
        +  }
        +
        +  // getDraggingProperty(e: MouseEvent): number {
        +  //   return e.clientX;
        +  // }
        +
        +  // getDraggingValue(value: number, delta: number, behavior: ScrollBehavior): ScrollToOptions {
        +  //   return {
        +  //     behavior,
        +  //     left: value - delta
        +  //   };
        +  // }
        +}
        +
        +export class VerticalAdapter implements SliderAdapter {
        +
        +  readonly hammerDirection: number = Hammer?.DIRECTION_VERTICAL;
        +
        +  readonly scrollSnapType: string = 'y mandatory';
        +
        +  get scrollValue(): number {
        +    return this.slider.scrollTop;
        +  }
        +
        +  get clientSize(): number {
        +    return this.slider.clientHeight;
        +  }
        +
        +  get isContentLessThanContainer(): boolean {
        +    return this.clientSize >= this.slider.firstElementChild.clientHeight;
        +  }
        +
        +  constructor(public slider: HTMLElement, public config: GalleryConfig) {
        +  }
        +
        +  getScrollToValue(el: HTMLElement, behavior: ScrollBehavior): SmoothScrollToOptions {
        +    const position: number = el.offsetTop - ((this.clientSize - el.clientHeight) / 2);
        +    return {
        +      top: position,
        +      duration: behavior === 'smooth' ? this.config.slidingDuration : 0,
        +      easing: this.config.slidingEase
        +    };
        +  }
        +
        +  getRootMargin(): string {
        +    return `1px 1000px 1px 1000px`;
        +  }
        +
        +  getElementRootMargin(viewport: HTMLElement, el: HTMLElement): string {
        +    const rootMargin: number = -1 * ((viewport.clientHeight - el.clientHeight) / 2) + 1;
        +    return `${ rootMargin }px 0px ${ rootMargin }px 0px`;
        +  }
        +
        +  getCentralizerStartSize(): number {
        +    if (this.isContentLessThanContainer) {
        +      const size = this.clientSize - this.slider.firstElementChild.clientHeight;
        +      return size / 2;
        +    }
        +    return (this.clientSize / 2) - (this.slider.firstElementChild.firstElementChild?.clientHeight / 2);
        +  }
        +
        +  getCentralizerEndSize(): number {
        +    if (this.isContentLessThanContainer) {
        +      const size = this.clientSize - this.slider.firstElementChild.clientHeight;
        +      return size / 2;
        +    }
        +    return (this.clientSize / 2) - (this.slider.firstElementChild.lastElementChild?.clientHeight / 2);
        +  }
        +
        +  getHammerVelocity(e: any): number {
        +    return e.velocityY;
        +  }
        +
        +  getHammerValue(value: number, e: any, behavior: ScrollBehavior): ScrollToOptions {
        +    return {
        +      behavior,
        +      top: value - e.deltaY
        +    };
        +  }
        +
        +  // getDraggingProperty(e: MouseEvent): number {
        +  //   return e.clientY;
        +  // }
        +
        +  // getDraggingValue(value: number, delta: number, behavior: ScrollBehavior): ScrollToOptions {
        +  //   return {
        +  //     behavior,
        +  //     top: value - delta
        +  //   };
        +  // }
        +}
        +
        +
        +
        + + + + + + + + +
        +
        +

        results matching ""

        +
          +
          +
          +

          No results matching ""

          +
          +
          +
          + +
          +
          + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/documentation/classes/IframeItem.html b/documentation/classes/IframeItem.html new file mode 100644 index 00000000..acdce5a6 --- /dev/null +++ b/documentation/classes/IframeItem.html @@ -0,0 +1,385 @@ + + + + + + ng-gallery-project documentation + + + + + + + + + + + + + +
          +
          + + +
          +
          + + + + + + + + + + + + + + + + +
          +
          +

          +

          File

          +

          +

          + projects/ng-gallery/src/lib/components/templates/items.model.ts +

          + + + + +

          +

          Implements

          +

          +

          + GalleryItem +

          + + +
          +

          Index

          + + + + + + + + + + + + + + + +
          +
          Properties
          +
          +
            +
          • + Readonly + data +
          • +
          • + Readonly + type +
          • +
          +
          +
          + +
          +

          Constructor

          + + + + + + + + + + + + + +
          +constructor(data: IframeItemData) +
          + +
          +
          + Parameters : + + + + + + + + + + + + + + + + + + +
          NameTypeOptional
          data + IframeItemData + + No +
          +
          +
          +
          + +
          + +

          + Properties +

          + + + + + + + + + + + + + + +
          + + + Readonly + data + + +
          + Type : IframeItemData + +
          + +
          + + + + + + + + + + + + + + +
          + + + Readonly + type + + +
          + Type : GalleryItemType + +
          + +
          +
          + + + + + + + +
          + + +
          +
          import { GalleryItem } from '../../models/gallery.model';
          +import { GalleryItemType, GalleryItemTypes } from '../../models/constants';
          +
          +export class ImageItem implements GalleryItem {
          +  readonly type: GalleryItemType;
          +  readonly data: ImageItemData;
          +
          +  constructor(data: ImageItemData) {
          +    this.data = data;
          +    this.type = GalleryItemTypes.Image;
          +  }
          +}
          +
          +export class VideoItem implements GalleryItem {
          +  readonly type: GalleryItemType;
          +  readonly data: VideoItemData;
          +
          +  constructor(data: VideoItemData) {
          +    this.data = data;
          +    this.type = GalleryItemTypes.Video;
          +  }
          +}
          +
          +export class IframeItem implements GalleryItem {
          +  readonly type: GalleryItemType;
          +  readonly data: IframeItemData;
          +
          +  constructor(data: IframeItemData) {
          +    this.data = data;
          +    this.type = GalleryItemTypes.Iframe;
          +  }
          +}
          +
          +export class YoutubeItem implements GalleryItem {
          +  readonly type: GalleryItemType;
          +  readonly data: YoutubeItemData;
          +
          +  constructor(data: YoutubeItemData) {
          +    this.data = {
          +      ...data,
          +      ...{
          +        src: `https://youtube.com/embed/${ data.src }`,
          +        thumb: data.thumb ? data.thumb : `//img.youtube.com/vi/${ data.src }/default.jpg`
          +      }
          +    };
          +    this.type = GalleryItemTypes.Youtube;
          +  }
          +}
          +
          +type GalleryItemModel = {
          +  type?: GalleryItemType;
          +  src?: string | { url: string, type: string }[];
          +  thumb?: string;
          +  args?: any;
          +};
          +
          +export type ImageItemData = GalleryItemModel & {
          +  alt?: string;
          +};
          +
          +export type IframeItemData = GalleryItemModel & {
          +  params?: any;
          +};
          +
          +export type YoutubeItemData = IframeItemData & {
          +  autoplay?: boolean;
          +};
          +
          +export type VideoItemData = GalleryItemModel & {
          +  poster?: string;
          +  loop?: boolean;
          +  // The only option for boolean video attributes is 'true', because false will still be evaluated to true in attributes binding
          +  mute?: true;
          +  disablePictureInPicture?: true;
          +  controls?: boolean;
          +  autoplay?: boolean;
          +  preload?: 'none' | 'metadata' | 'auto' | '';
          +  controlsList?: 'nodownload' | 'nofullscreen' | 'noremoteplayback';
          +  disableRemotePlayback?: boolean;
          +};
          +
          +export type GalleryItemData = ImageItemData | VideoItemData | IframeItemData | YoutubeItemData;
          +
          +export type ItemState = 'success' | 'loading' | 'failed';
          +
          +
          +
          + + + + + + + + +
          +
          +

          results matching ""

          +
            +
            +
            +

            No results matching ""

            +
            +
            +
            + +
            +
            + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/documentation/classes/ImageItem.html b/documentation/classes/ImageItem.html new file mode 100644 index 00000000..14643c34 --- /dev/null +++ b/documentation/classes/ImageItem.html @@ -0,0 +1,385 @@ + + + + + + ng-gallery-project documentation + + + + + + + + + + + + + +
            +
            + + +
            +
            + + + + + + + + + + + + + + + + +
            +
            +

            +

            File

            +

            +

            + projects/ng-gallery/src/lib/components/templates/items.model.ts +

            + + + + +

            +

            Implements

            +

            +

            + GalleryItem +

            + + +
            +

            Index

            + + + + + + + + + + + + + + + +
            +
            Properties
            +
            +
              +
            • + Readonly + data +
            • +
            • + Readonly + type +
            • +
            +
            +
            + +
            +

            Constructor

            + + + + + + + + + + + + + +
            +constructor(data: ImageItemData) +
            + +
            +
            + Parameters : + + + + + + + + + + + + + + + + + + +
            NameTypeOptional
            data + ImageItemData + + No +
            +
            +
            +
            + +
            + +

            + Properties +

            + + + + + + + + + + + + + + +
            + + + Readonly + data + + +
            + Type : ImageItemData + +
            + +
            + + + + + + + + + + + + + + +
            + + + Readonly + type + + +
            + Type : GalleryItemType + +
            + +
            +
            + + + + + + + +
            + + +
            +
            import { GalleryItem } from '../../models/gallery.model';
            +import { GalleryItemType, GalleryItemTypes } from '../../models/constants';
            +
            +export class ImageItem implements GalleryItem {
            +  readonly type: GalleryItemType;
            +  readonly data: ImageItemData;
            +
            +  constructor(data: ImageItemData) {
            +    this.data = data;
            +    this.type = GalleryItemTypes.Image;
            +  }
            +}
            +
            +export class VideoItem implements GalleryItem {
            +  readonly type: GalleryItemType;
            +  readonly data: VideoItemData;
            +
            +  constructor(data: VideoItemData) {
            +    this.data = data;
            +    this.type = GalleryItemTypes.Video;
            +  }
            +}
            +
            +export class IframeItem implements GalleryItem {
            +  readonly type: GalleryItemType;
            +  readonly data: IframeItemData;
            +
            +  constructor(data: IframeItemData) {
            +    this.data = data;
            +    this.type = GalleryItemTypes.Iframe;
            +  }
            +}
            +
            +export class YoutubeItem implements GalleryItem {
            +  readonly type: GalleryItemType;
            +  readonly data: YoutubeItemData;
            +
            +  constructor(data: YoutubeItemData) {
            +    this.data = {
            +      ...data,
            +      ...{
            +        src: `https://youtube.com/embed/${ data.src }`,
            +        thumb: data.thumb ? data.thumb : `//img.youtube.com/vi/${ data.src }/default.jpg`
            +      }
            +    };
            +    this.type = GalleryItemTypes.Youtube;
            +  }
            +}
            +
            +type GalleryItemModel = {
            +  type?: GalleryItemType;
            +  src?: string | { url: string, type: string }[];
            +  thumb?: string;
            +  args?: any;
            +};
            +
            +export type ImageItemData = GalleryItemModel & {
            +  alt?: string;
            +};
            +
            +export type IframeItemData = GalleryItemModel & {
            +  params?: any;
            +};
            +
            +export type YoutubeItemData = IframeItemData & {
            +  autoplay?: boolean;
            +};
            +
            +export type VideoItemData = GalleryItemModel & {
            +  poster?: string;
            +  loop?: boolean;
            +  // The only option for boolean video attributes is 'true', because false will still be evaluated to true in attributes binding
            +  mute?: true;
            +  disablePictureInPicture?: true;
            +  controls?: boolean;
            +  autoplay?: boolean;
            +  preload?: 'none' | 'metadata' | 'auto' | '';
            +  controlsList?: 'nodownload' | 'nofullscreen' | 'noremoteplayback';
            +  disableRemotePlayback?: boolean;
            +};
            +
            +export type GalleryItemData = ImageItemData | VideoItemData | IframeItemData | YoutubeItemData;
            +
            +export type ItemState = 'success' | 'loading' | 'failed';
            +
            +
            +
            + + + + + + + + +
            +
            +

            results matching ""

            +
              +
              +
              +

              No results matching ""

              +
              +
              +
              + +
              +
              + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/documentation/classes/SliderAdapter.html b/documentation/classes/SliderAdapter.html new file mode 100644 index 00000000..ffc21b13 --- /dev/null +++ b/documentation/classes/SliderAdapter.html @@ -0,0 +1,861 @@ + + + + + + ng-gallery-project documentation + + + + + + + + + + + + + +
              +
              + + +
              +
              + + + + + + + + + + + + + + + + +
              +
              +

              +

              File

              +

              +

              + projects/ng-gallery/src/lib/components/adapters/base-adapter.ts +

              + + + + + + +
              +

              Index

              + + + + + + + + + + + + + + + + + + + + + + + + + + + +
              +
              Properties
              +
              + +
              +
              Methods
              +
              + +
              +
              Accessors
              +
              + +
              +
              + + +
              + +

              + Properties +

              + + + + + + + + + + + + + + +
              + + + Readonly + Abstract + hammerDirection + + +
              + Type : number + +
              + +
              + + + + + + + + + + + + + + +
              + + + Readonly + Abstract + scrollSnapType + + +
              + Type : string + +
              + +
              +
              + +
              + +

              + Methods +

              + + + + + + + + + + + + + + + + + + + +
              + + + Abstract + getCentralizerEndSize + + +
              + + getCentralizerEndSize() +
              + +
              + +
              + Returns : number + +
              +
              + + + + + + + + + + + + + + + + + + + +
              + + + Abstract + getCentralizerStartSize + + +
              + + getCentralizerStartSize() +
              + +
              + +
              + Returns : number + +
              +
              + + + + + + + + + + + + + + + + + + + +
              + + + Abstract + getElementRootMargin + + +
              + + getElementRootMargin(viewport: HTMLElement, el: HTMLElement) +
              + +
              + +
              + Parameters : + + + + + + + + + + + + + + + + + + + + + + + + + + + +
              NameTypeOptional
              viewport + HTMLElement + + No +
              el + HTMLElement + + No +
              +
              +
              +
              +
              + Returns : string + +
              +
              + +
              +
              + + + + + + + + + + + + + + + + + + + +
              + + + Abstract + getHammerValue + + +
              + + getHammerValue(value: number, delta: number, behavior: ScrollBehavior) +
              + +
              + +
              + Parameters : + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
              NameTypeOptional
              value + number + + No +
              delta + number + + No +
              behavior + ScrollBehavior + + No +
              +
              +
              +
              +
              + Returns : ScrollToOptions + +
              +
              + +
              +
              + + + + + + + + + + + + + + + + + + + +
              + + + Abstract + getHammerVelocity + + +
              + + getHammerVelocity(e) +
              + +
              + +
              + Parameters : + + + + + + + + + + + + + + + + + +
              NameOptional
              e + No +
              +
              +
              +
              +
              + Returns : number + +
              +
              + +
              +
              + + + + + + + + + + + + + + + + + + + +
              + + + Abstract + getRootMargin + + +
              + + getRootMargin() +
              + +
              + +
              + Returns : string + +
              +
              + + + + + + + + + + + + + + + + + + + +
              + + + Abstract + getScrollToValue + + +
              + + getScrollToValue(el: Element, behavior: ScrollBehavior) +
              + +
              + +
              + Parameters : + + + + + + + + + + + + + + + + + + + + + + + + + + + +
              NameTypeOptional
              el + Element + + No +
              behavior + ScrollBehavior + + No +
              +
              +
              +
              +
              + Returns : ScrollToOptions + +
              +
              + +
              +
              +
              + + + + + +
              +

              + Accessors +

              + + + + + + + + + + + + + + +
              + + scrollValue +
              + getscrollValue() +
              + +
              + + + + + + + + + + + + + + +
              + + clientSize +
              + getclientSize() +
              + +
              + + + + + + + + + + + + + + +
              + + isContentLessThanContainer +
              + getisContentLessThanContainer() +
              + +
              +
              +
              + + +
              +
              export abstract class SliderAdapter {
              +
              +  readonly abstract hammerDirection: number;
              +
              +  readonly abstract scrollSnapType: string;
              +
              +  abstract get scrollValue(): number;
              +
              +  abstract get clientSize(): number;
              +
              +  abstract get isContentLessThanContainer(): boolean;
              +
              +  abstract getScrollToValue(el: Element, behavior: ScrollBehavior): ScrollToOptions;
              +
              +  abstract getCentralizerStartSize(): number;
              +
              +  abstract getCentralizerEndSize(): number;
              +
              +  abstract getRootMargin(): string;
              +
              +  abstract getElementRootMargin(viewport: HTMLElement, el: HTMLElement): string;
              +
              +  abstract getHammerVelocity(e): number;
              +
              +  abstract getHammerValue(value: number, delta: number, behavior: ScrollBehavior): ScrollToOptions;
              +
              +  // abstract getDraggingValue(value: number, delta: number, behavior: ScrollBehavior): ScrollToOptions;
              +
              +  // abstract getDraggingProperty(e: MouseEvent): number;
              +}
              +
              +
              +
              + + + + + + + + +
              +
              +

              results matching ""

              +
                +
                +
                +

                No results matching ""

                +
                +
                +
                + +
                +
                + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/documentation/classes/VerticalAdapter.html b/documentation/classes/VerticalAdapter.html new file mode 100644 index 00000000..60684322 --- /dev/null +++ b/documentation/classes/VerticalAdapter.html @@ -0,0 +1,1109 @@ + + + + + + ng-gallery-project documentation + + + + + + + + + + + + + +
                +
                + + +
                +
                + + + + + + + + + + + + + + + + +
                +
                +

                +

                File

                +

                +

                + projects/ng-gallery/src/lib/components/adapters/main-adapters.ts +

                + + + + +

                +

                Implements

                +

                +

                + SliderAdapter +

                + + +
                +

                Index

                + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                +
                Properties
                +
                + +
                +
                Methods
                +
                + +
                +
                Accessors
                +
                + +
                +
                + +
                +

                Constructor

                + + + + + + + + + + + + + +
                +constructor(slider: HTMLElement, config: GalleryConfig) +
                + +
                +
                + Parameters : + + + + + + + + + + + + + + + + + + + + + + + + + + +
                NameTypeOptional
                slider + HTMLElement + + No +
                config + GalleryConfig + + No +
                +
                +
                +
                + +
                + +

                + Properties +

                + + + + + + + + + + + + + + +
                + + + Public + config + + +
                + Type : GalleryConfig + +
                + +
                + + + + + + + + + + + + + + + + + +
                + + + Readonly + hammerDirection + + +
                + Type : number + +
                + Default value : Hammer?.DIRECTION_VERTICAL +
                + +
                + + + + + + + + + + + + + + + + + +
                + + + Readonly + scrollSnapType + + +
                + Type : string + +
                + Default value : 'y mandatory' +
                + +
                + + + + + + + + + + + + + + +
                + + + Public + slider + + +
                + Type : HTMLElement + +
                + +
                +
                + +
                + +

                + Methods +

                + + + + + + + + + + + + + + + + + + + +
                + + + getCentralizerEndSize + + +
                +getCentralizerEndSize() +
                + +
                + +
                + Returns : number + +
                +
                + + + + + + + + + + + + + + + + + + + +
                + + + getCentralizerStartSize + + +
                +getCentralizerStartSize() +
                + +
                + +
                + Returns : number + +
                +
                + + + + + + + + + + + + + + + + + + + +
                + + + getElementRootMargin + + +
                +getElementRootMargin(viewport: HTMLElement, el: HTMLElement) +
                + +
                + +
                + Parameters : + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                NameTypeOptional
                viewport + HTMLElement + + No +
                el + HTMLElement + + No +
                +
                +
                +
                +
                + Returns : string + +
                +
                + +
                +
                + + + + + + + + + + + + + + + + + + + +
                + + + getHammerValue + + +
                +getHammerValue(value: number, e: any, behavior: ScrollBehavior) +
                + +
                + +
                + Parameters : + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                NameTypeOptional
                value + number + + No +
                e + any + + No +
                behavior + ScrollBehavior + + No +
                +
                +
                +
                +
                + Returns : ScrollToOptions + +
                +
                + +
                +
                + + + + + + + + + + + + + + + + + + + +
                + + + getHammerVelocity + + +
                +getHammerVelocity(e: any) +
                + +
                + +
                + Parameters : + + + + + + + + + + + + + + + + + + + +
                NameTypeOptional
                e + any + + No +
                +
                +
                +
                +
                + Returns : number + +
                +
                + +
                +
                + + + + + + + + + + + + + + + + + + + +
                + + + getRootMargin + + +
                +getRootMargin() +
                + +
                + +
                + Returns : string + +
                +
                + + + + + + + + + + + + + + + + + + + +
                + + + getScrollToValue + + +
                +getScrollToValue(el: HTMLElement, behavior: ScrollBehavior) +
                + +
                + +
                + Parameters : + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                NameTypeOptional
                el + HTMLElement + + No +
                behavior + ScrollBehavior + + No +
                +
                +
                +
                +
                + Returns : SmoothScrollToOptions + +
                +
                + +
                +
                +
                + + + + + +
                +

                + Accessors +

                + + + + + + + + + + + + + + +
                + + scrollValue +
                + getscrollValue() +
                + +
                + + + + + + + + + + + + + + +
                + + clientSize +
                + getclientSize() +
                + +
                + + + + + + + + + + + + + + +
                + + isContentLessThanContainer +
                + getisContentLessThanContainer() +
                + +
                +
                +
                + + +
                +
                import { GalleryConfig } from '../../models/config.model';
                +import { SliderAdapter } from './base-adapter';
                +import { SmoothScrollToOptions } from '../../smooth-scroll';
                +
                +declare const Hammer: any;
                +
                +export class HorizontalAdapter implements SliderAdapter {
                +
                +  readonly hammerDirection: number = Hammer?.DIRECTION_HORIZONTAL;
                +
                +  readonly scrollSnapType: string = 'x mandatory';
                +
                +  get scrollValue(): number {
                +    return this.slider.scrollLeft;
                +  }
                +
                +  get clientSize(): number {
                +    return this.slider.clientWidth;
                +  }
                +
                +  get isContentLessThanContainer(): boolean {
                +    return this.clientSize >= this.slider.firstElementChild.clientWidth;
                +  }
                +
                +  constructor(public slider: HTMLElement, public config: GalleryConfig) {
                +  }
                +
                +  getScrollToValue(el: HTMLElement, behavior: ScrollBehavior): SmoothScrollToOptions {
                +    const position: number = el.offsetLeft - ((this.clientSize - el.clientWidth) / 2);
                +    return {
                +      start: position,
                +      duration: behavior === 'smooth' ? this.config.slidingDuration : 0,
                +      easing: this.config.slidingEase
                +    };
                +  }
                +
                +  getRootMargin(): string {
                +    return `1000px 1px 1000px 1px`;
                +  }
                +
                +  getElementRootMargin(viewport: HTMLElement, el: HTMLElement): string {
                +    const rootMargin: number = -1 * ((viewport.clientWidth - el.clientWidth) / 2) + 1;
                +    return `0px ${ rootMargin }px 0px ${ rootMargin }px`;
                +  }
                +
                +  getCentralizerStartSize(): number {
                +    if (this.isContentLessThanContainer) {
                +      const size: number = this.clientSize - this.slider.firstElementChild.clientWidth;
                +      return size / 2;
                +    }
                +    return (this.clientSize / 2) - (this.slider.firstElementChild.firstElementChild?.clientWidth / 2);
                +  }
                +
                +  getCentralizerEndSize(): number {
                +    if (this.isContentLessThanContainer) {
                +      const size: number = this.clientSize - this.slider.firstElementChild.clientWidth;
                +      return size / 2;
                +    }
                +    return (this.clientSize / 2) - (this.slider.firstElementChild.lastElementChild?.clientWidth / 2);
                +  }
                +
                +  getHammerVelocity(e: any): number {
                +    return e.velocityX;
                +  }
                +
                +  getHammerValue(value: number, e: any, behavior: ScrollBehavior): ScrollToOptions {
                +    return {
                +      behavior,
                +      left: value - e.deltaX
                +    };
                +  }
                +
                +  // getDraggingProperty(e: MouseEvent): number {
                +  //   return e.clientX;
                +  // }
                +
                +  // getDraggingValue(value: number, delta: number, behavior: ScrollBehavior): ScrollToOptions {
                +  //   return {
                +  //     behavior,
                +  //     left: value - delta
                +  //   };
                +  // }
                +}
                +
                +export class VerticalAdapter implements SliderAdapter {
                +
                +  readonly hammerDirection: number = Hammer?.DIRECTION_VERTICAL;
                +
                +  readonly scrollSnapType: string = 'y mandatory';
                +
                +  get scrollValue(): number {
                +    return this.slider.scrollTop;
                +  }
                +
                +  get clientSize(): number {
                +    return this.slider.clientHeight;
                +  }
                +
                +  get isContentLessThanContainer(): boolean {
                +    return this.clientSize >= this.slider.firstElementChild.clientHeight;
                +  }
                +
                +  constructor(public slider: HTMLElement, public config: GalleryConfig) {
                +  }
                +
                +  getScrollToValue(el: HTMLElement, behavior: ScrollBehavior): SmoothScrollToOptions {
                +    const position: number = el.offsetTop - ((this.clientSize - el.clientHeight) / 2);
                +    return {
                +      top: position,
                +      duration: behavior === 'smooth' ? this.config.slidingDuration : 0,
                +      easing: this.config.slidingEase
                +    };
                +  }
                +
                +  getRootMargin(): string {
                +    return `1px 1000px 1px 1000px`;
                +  }
                +
                +  getElementRootMargin(viewport: HTMLElement, el: HTMLElement): string {
                +    const rootMargin: number = -1 * ((viewport.clientHeight - el.clientHeight) / 2) + 1;
                +    return `${ rootMargin }px 0px ${ rootMargin }px 0px`;
                +  }
                +
                +  getCentralizerStartSize(): number {
                +    if (this.isContentLessThanContainer) {
                +      const size = this.clientSize - this.slider.firstElementChild.clientHeight;
                +      return size / 2;
                +    }
                +    return (this.clientSize / 2) - (this.slider.firstElementChild.firstElementChild?.clientHeight / 2);
                +  }
                +
                +  getCentralizerEndSize(): number {
                +    if (this.isContentLessThanContainer) {
                +      const size = this.clientSize - this.slider.firstElementChild.clientHeight;
                +      return size / 2;
                +    }
                +    return (this.clientSize / 2) - (this.slider.firstElementChild.lastElementChild?.clientHeight / 2);
                +  }
                +
                +  getHammerVelocity(e: any): number {
                +    return e.velocityY;
                +  }
                +
                +  getHammerValue(value: number, e: any, behavior: ScrollBehavior): ScrollToOptions {
                +    return {
                +      behavior,
                +      top: value - e.deltaY
                +    };
                +  }
                +
                +  // getDraggingProperty(e: MouseEvent): number {
                +  //   return e.clientY;
                +  // }
                +
                +  // getDraggingValue(value: number, delta: number, behavior: ScrollBehavior): ScrollToOptions {
                +  //   return {
                +  //     behavior,
                +  //     top: value - delta
                +  //   };
                +  // }
                +}
                +
                +
                +
                + + + + + + + + +
                +
                +

                results matching ""

                +
                  +
                  +
                  +

                  No results matching ""

                  +
                  +
                  +
                  + +
                  +
                  + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/documentation/classes/VideoItem.html b/documentation/classes/VideoItem.html new file mode 100644 index 00000000..aa55a9d9 --- /dev/null +++ b/documentation/classes/VideoItem.html @@ -0,0 +1,385 @@ + + + + + + ng-gallery-project documentation + + + + + + + + + + + + + +
                  +
                  + + +
                  +
                  + + + + + + + + + + + + + + + + +
                  +
                  +

                  +

                  File

                  +

                  +

                  + projects/ng-gallery/src/lib/components/templates/items.model.ts +

                  + + + + +

                  +

                  Implements

                  +

                  +

                  + GalleryItem +

                  + + +
                  +

                  Index

                  + + + + + + + + + + + + + + + +
                  +
                  Properties
                  +
                  +
                    +
                  • + Readonly + data +
                  • +
                  • + Readonly + type +
                  • +
                  +
                  +
                  + +
                  +

                  Constructor

                  + + + + + + + + + + + + + +
                  +constructor(data: VideoItemData) +
                  + +
                  +
                  + Parameters : + + + + + + + + + + + + + + + + + + +
                  NameTypeOptional
                  data + VideoItemData + + No +
                  +
                  +
                  +
                  + +
                  + +

                  + Properties +

                  + + + + + + + + + + + + + + +
                  + + + Readonly + data + + +
                  + Type : VideoItemData + +
                  + +
                  + + + + + + + + + + + + + + +
                  + + + Readonly + type + + +
                  + Type : GalleryItemType + +
                  + +
                  +
                  + + + + + + + +
                  + + +
                  +
                  import { GalleryItem } from '../../models/gallery.model';
                  +import { GalleryItemType, GalleryItemTypes } from '../../models/constants';
                  +
                  +export class ImageItem implements GalleryItem {
                  +  readonly type: GalleryItemType;
                  +  readonly data: ImageItemData;
                  +
                  +  constructor(data: ImageItemData) {
                  +    this.data = data;
                  +    this.type = GalleryItemTypes.Image;
                  +  }
                  +}
                  +
                  +export class VideoItem implements GalleryItem {
                  +  readonly type: GalleryItemType;
                  +  readonly data: VideoItemData;
                  +
                  +  constructor(data: VideoItemData) {
                  +    this.data = data;
                  +    this.type = GalleryItemTypes.Video;
                  +  }
                  +}
                  +
                  +export class IframeItem implements GalleryItem {
                  +  readonly type: GalleryItemType;
                  +  readonly data: IframeItemData;
                  +
                  +  constructor(data: IframeItemData) {
                  +    this.data = data;
                  +    this.type = GalleryItemTypes.Iframe;
                  +  }
                  +}
                  +
                  +export class YoutubeItem implements GalleryItem {
                  +  readonly type: GalleryItemType;
                  +  readonly data: YoutubeItemData;
                  +
                  +  constructor(data: YoutubeItemData) {
                  +    this.data = {
                  +      ...data,
                  +      ...{
                  +        src: `https://youtube.com/embed/${ data.src }`,
                  +        thumb: data.thumb ? data.thumb : `//img.youtube.com/vi/${ data.src }/default.jpg`
                  +      }
                  +    };
                  +    this.type = GalleryItemTypes.Youtube;
                  +  }
                  +}
                  +
                  +type GalleryItemModel = {
                  +  type?: GalleryItemType;
                  +  src?: string | { url: string, type: string }[];
                  +  thumb?: string;
                  +  args?: any;
                  +};
                  +
                  +export type ImageItemData = GalleryItemModel & {
                  +  alt?: string;
                  +};
                  +
                  +export type IframeItemData = GalleryItemModel & {
                  +  params?: any;
                  +};
                  +
                  +export type YoutubeItemData = IframeItemData & {
                  +  autoplay?: boolean;
                  +};
                  +
                  +export type VideoItemData = GalleryItemModel & {
                  +  poster?: string;
                  +  loop?: boolean;
                  +  // The only option for boolean video attributes is 'true', because false will still be evaluated to true in attributes binding
                  +  mute?: true;
                  +  disablePictureInPicture?: true;
                  +  controls?: boolean;
                  +  autoplay?: boolean;
                  +  preload?: 'none' | 'metadata' | 'auto' | '';
                  +  controlsList?: 'nodownload' | 'nofullscreen' | 'noremoteplayback';
                  +  disableRemotePlayback?: boolean;
                  +};
                  +
                  +export type GalleryItemData = ImageItemData | VideoItemData | IframeItemData | YoutubeItemData;
                  +
                  +export type ItemState = 'success' | 'loading' | 'failed';
                  +
                  +
                  +
                  + + + + + + + + +
                  +
                  +

                  results matching ""

                  +
                    +
                    +
                    +

                    No results matching ""

                    +
                    +
                    +
                    + +
                    +
                    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/documentation/classes/YoutubeItem.html b/documentation/classes/YoutubeItem.html new file mode 100644 index 00000000..621d9cf5 --- /dev/null +++ b/documentation/classes/YoutubeItem.html @@ -0,0 +1,385 @@ + + + + + + ng-gallery-project documentation + + + + + + + + + + + + + +
                    +
                    + + +
                    +
                    + + + + + + + + + + + + + + + + +
                    +
                    +

                    +

                    File

                    +

                    +

                    + projects/ng-gallery/src/lib/components/templates/items.model.ts +

                    + + + + +

                    +

                    Implements

                    +

                    +

                    + GalleryItem +

                    + + +
                    +

                    Index

                    + + + + + + + + + + + + + + + +
                    +
                    Properties
                    +
                    +
                      +
                    • + Readonly + data +
                    • +
                    • + Readonly + type +
                    • +
                    +
                    +
                    + +
                    +

                    Constructor

                    + + + + + + + + + + + + + +
                    +constructor(data: YoutubeItemData) +
                    + +
                    +
                    + Parameters : + + + + + + + + + + + + + + + + + + +
                    NameTypeOptional
                    data + YoutubeItemData + + No +
                    +
                    +
                    +
                    + +
                    + +

                    + Properties +

                    + + + + + + + + + + + + + + +
                    + + + Readonly + data + + +
                    + Type : YoutubeItemData + +
                    + +
                    + + + + + + + + + + + + + + +
                    + + + Readonly + type + + +
                    + Type : GalleryItemType + +
                    + +
                    +
                    + + + + + + + +
                    + + +
                    +
                    import { GalleryItem } from '../../models/gallery.model';
                    +import { GalleryItemType, GalleryItemTypes } from '../../models/constants';
                    +
                    +export class ImageItem implements GalleryItem {
                    +  readonly type: GalleryItemType;
                    +  readonly data: ImageItemData;
                    +
                    +  constructor(data: ImageItemData) {
                    +    this.data = data;
                    +    this.type = GalleryItemTypes.Image;
                    +  }
                    +}
                    +
                    +export class VideoItem implements GalleryItem {
                    +  readonly type: GalleryItemType;
                    +  readonly data: VideoItemData;
                    +
                    +  constructor(data: VideoItemData) {
                    +    this.data = data;
                    +    this.type = GalleryItemTypes.Video;
                    +  }
                    +}
                    +
                    +export class IframeItem implements GalleryItem {
                    +  readonly type: GalleryItemType;
                    +  readonly data: IframeItemData;
                    +
                    +  constructor(data: IframeItemData) {
                    +    this.data = data;
                    +    this.type = GalleryItemTypes.Iframe;
                    +  }
                    +}
                    +
                    +export class YoutubeItem implements GalleryItem {
                    +  readonly type: GalleryItemType;
                    +  readonly data: YoutubeItemData;
                    +
                    +  constructor(data: YoutubeItemData) {
                    +    this.data = {
                    +      ...data,
                    +      ...{
                    +        src: `https://youtube.com/embed/${ data.src }`,
                    +        thumb: data.thumb ? data.thumb : `//img.youtube.com/vi/${ data.src }/default.jpg`
                    +      }
                    +    };
                    +    this.type = GalleryItemTypes.Youtube;
                    +  }
                    +}
                    +
                    +type GalleryItemModel = {
                    +  type?: GalleryItemType;
                    +  src?: string | { url: string, type: string }[];
                    +  thumb?: string;
                    +  args?: any;
                    +};
                    +
                    +export type ImageItemData = GalleryItemModel & {
                    +  alt?: string;
                    +};
                    +
                    +export type IframeItemData = GalleryItemModel & {
                    +  params?: any;
                    +};
                    +
                    +export type YoutubeItemData = IframeItemData & {
                    +  autoplay?: boolean;
                    +};
                    +
                    +export type VideoItemData = GalleryItemModel & {
                    +  poster?: string;
                    +  loop?: boolean;
                    +  // The only option for boolean video attributes is 'true', because false will still be evaluated to true in attributes binding
                    +  mute?: true;
                    +  disablePictureInPicture?: true;
                    +  controls?: boolean;
                    +  autoplay?: boolean;
                    +  preload?: 'none' | 'metadata' | 'auto' | '';
                    +  controlsList?: 'nodownload' | 'nofullscreen' | 'noremoteplayback';
                    +  disableRemotePlayback?: boolean;
                    +};
                    +
                    +export type GalleryItemData = ImageItemData | VideoItemData | IframeItemData | YoutubeItemData;
                    +
                    +export type ItemState = 'success' | 'loading' | 'failed';
                    +
                    +
                    +
                    + + + + + + + + +
                    +
                    +

                    results matching ""

                    +
                      +
                      +
                      +

                      No results matching ""

                      +
                      +
                      +
                      + +
                      +
                      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/documentation/components/CustomTemplateComponent.html b/documentation/components/CustomTemplateComponent.html new file mode 100644 index 00000000..4dc29973 --- /dev/null +++ b/documentation/components/CustomTemplateComponent.html @@ -0,0 +1,469 @@ + + + + + + ng-gallery-project documentation + + + + + + + + + + + + + +
                      +
                      + + +
                      +
                      + + + + + + +
                      +

                      +

                      File

                      +

                      +

                      + projects/ng-gallery/src/stories/custom-templates/custom-template.component.ts +

                      + + +

                      +

                      Description

                      +

                      +

                      +

                      This section demonstrate how to extend the image template, like displaying a text over the image item

                      + +

                      + + +
                      +

                      Metadata

                      + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                      + +
                      +

                      Index

                      + + + + + + + + + + + +
                      +
                      Properties
                      +
                      + +
                      +
                      + +
                      +

                      Constructor

                      + + + + + + + + + + + + + +
                      + constructor(pixabay: Pixabay) +
                      + +
                      +
                      + Parameters : + + + + + + + + + + + + + + + + + + +
                      NameTypeOptional
                      pixabay + Pixabay + + No +
                      +
                      +
                      +
                      + + +
                      + +

                      + Properties +

                      + + + + + + + + + + + + + + +
                      + + + Readonly + items$ + + +
                      + Type : Observable<GalleryItem[]> + +
                      + +
                      +
                      + +
                      + + +
                      +
                      import {
                      +          Component, ChangeDetectionStrategy } from '@angular/core';
                      +import { CommonModule } from '@angular / common ';
                      +            import { GalleryModule, GalleryItem, } from 'ng-gallery';
                      +import { Observable } from 'rxjs';
                      +import { Pixabay } from '../pixabay/pixabay.service';
                      +
                      +/**
                      + * This section demonstrate how to extend the image template, like displaying a text over the image item
                      + */
                      +@Component({
                      +          selector: 'custom-templates-example',
                      +  template: `
                      +    <gallery *ngIf="items$ | async">
                      +      <ng-container *galleryImageDef="let item">
                      +        <div class="item-text">
                      +          {{ item?.alt }}
                      +        </div>
                      +      </ng-container>
                      +    </gallery>
                      +  `,
                      +  styles: [`
                      +    .item-text {
                      +      position: absolute;
                      +      top: 0;
                      +      left: 0;
                      +      right: 0;
                      +      margin: 3em auto 0;
                      +      width: 100%;
                      +      max-width: 500px;
                      +      padding: 20px 25px;
                      +      text-align: justify;
                      +      letter-spacing: 1px;
                      +      filter: drop-shadow(0px 0px 2px rgba(0, 0, 0, 0.3));
                      +      background: #ffffffd9;
                      +      color: black;
                      +      border-radius: 8px;
                      +    }
                      +  `],
                      +  changeDetection: ChangeDetectionStrategy.OnPush,
                      +  standalone: true,
                      +  imports: [CommonModule, GalleryModule]
                      +})
                      +export class CustomTemplateComponent {
                      +
                      +          readonly items$: Observable<GalleryItem[]>;
                      +
                      +  constructor(pixabay: Pixabay) {
                      +    this.items$ = pixabay.getHDImages('massages');
                      +  }
                      +}
                      +
                      +
                      + + +
                      +
                      
                      +    .item-text {
                      +              position: absolute;
                      +              top: 0;
                      +              left: 0;
                      +              right: 0;
                      +              margin: 3em auto 0;
                      +              width: 100%;
                      +              max-width: 500px;
                      +              padding: 20px 25px;
                      +              text-align: justify;
                      +              letter-spacing: 1px;
                      +              filter: drop-shadow(0px 0px 2px rgba(0, 0, 0, 0.3));
                      +              background: #ffffffd9;
                      +              color: black;
                      +              border-radius: 8px;
                      +    }
                      +
                      +
                      +
                      + +
                      +
                      +
                      +
                      + Legend +
                      +
                      +
                      + Html element +
                      +
                      +
                      + Component +
                      +
                      +
                      + Html element with directive +
                      +
                      +
                      + + +
                      + + + + + + + + +
                      +
                      +
                      +

                      results matching ""

                      +
                        +
                        +
                        +

                        No results matching ""

                        +
                        +
                        +
                        + +
                        +
                        + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/documentation/components/GalleryComponent.html b/documentation/components/GalleryComponent.html new file mode 100644 index 00000000..ed410359 --- /dev/null +++ b/documentation/components/GalleryComponent.html @@ -0,0 +1,3717 @@ + + + + + + ng-gallery-project documentation + + + + + + + + + + + + + +
                        +
                        + + +
                        +
                        + + + + + + + + +
                        +

                        +

                        File

                        +

                        +

                        + projects/ng-gallery/src/lib/components/gallery.component.ts +

                        + + + + +

                        +

                        Implements

                        +

                        +

                        + OnInit + AfterContentInit + OnChanges + OnDestroy +

                        + + +
                        +

                        Metadata

                        + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                        + +
                        +

                        Index

                        + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                        +
                        Properties
                        +
                        + +
                        +
                        Methods
                        +
                        + +
                        +
                        Inputs
                        +
                        + +
                        +
                        Outputs
                        +
                        + +
                        +
                        + +
                        +

                        Constructor

                        + + + + + + + + + + + + + +
                        +constructor(_gallery: Gallery) +
                        + +
                        +
                        + Parameters : + + + + + + + + + + + + + + + + + + +
                        NameTypeOptional
                        _gallery + Gallery + + No +
                        +
                        +
                        +
                        + +
                        +

                        Inputs

                        + + + + + + + + + + + + + + + +
                        + + counterPosition +
                        + Type : "top" | "bottom" + +
                        + Default value : this._gallery.config.counterPosition +
                        + +
                        + + + + + + + + + + + + + + + + + + +
                        + + destroyRef +
                        + Type : boolean + +
                        + Default value : true +
                        + +
                        +

                        Destroy gallery ref on component destroy event

                        +
                        +
                        + + + + + + + + + + + + + + + +
                        + + bulletsPosition +
                        + Type : "top" | "bottom" + +
                        + Default value : this._gallery.config.bulletsPosition +
                        + +
                        + + + + + + + + + + + + + + + +
                        + + id +
                        + Type : string + +
                        + Default value : 'root' +
                        + +
                        + + + + + + + + + + + + + + + + + + +
                        + + imageSize +
                        + Type : "cover" | "contain" + +
                        + Default value : this._gallery.config.imageSize +
                        + +
                        +

                        Set image size. +Default: contain

                        +
                        +
                        + + + + + + + + + + + + +
                        + + items +
                        + Type : GalleryItem[] + +
                        + +
                        + + + + + + + + + + + + + + + +
                        + + loadingAttr +
                        + Type : "eager" | "lazy" + +
                        + Default value : this._gallery.config.loadingAttr +
                        + +
                        + + + + + + + + + + + + + + + +
                        + + loadingStrategy +
                        + Type : "preload" | "lazy" | "default" + +
                        + Default value : this._gallery.config.loadingStrategy +
                        + +
                        + + + + + + + + + + + + + + + +
                        + + navScrollBehavior +
                        + Type : ScrollBehavior + +
                        + Default value : this._gallery.config.navScrollBehavior +
                        + +
                        + + + + + + + + + + + + + + + +
                        + + scrollBehavior +
                        + Type : ScrollBehavior + +
                        + Default value : this._gallery.config.scrollBehavior +
                        + +
                        + + + + + + + + + + + + + + + + + + +
                        + + skipInitConfig +
                        + Type : boolean + +
                        + Default value : false +
                        + +
                        +

                        Skip initializing the config with components inputs (Lightbox mode)

                        +
                        +
                        + + + + + + + + + + + + + + + +
                        + + slidingDirection +
                        + Type : "horizontal" | "vertical" + +
                        + Default value : this._gallery.config.slidingDirection +
                        + +
                        + + + + + + + + + + + + + + + +
                        + + slidingEase +
                        + Type : BezierEasingOptions + +
                        + Default value : this._gallery.config.slidingEase +
                        + +
                        + + + + + + + + + + + + + + + +
                        + + thumbImageSize +
                        + Type : "cover" | "contain" + +
                        + Default value : this._gallery.config.thumbImageSize +
                        + +
                        + + + + + + + + + + + + + + + +
                        + + thumbPosition +
                        + Type : "top" | "left" | "right" | "bottom" + +
                        + Default value : this._gallery.config.thumbPosition +
                        + +
                        + + + + + + + + + + + + + + + +
                        + + thumbView +
                        + Type : "default" | "contain" + +
                        + Default value : this._gallery.config.thumbView +
                        + +
                        + + + + + + + + + + + + + + + +
                        + + +
                        + Type : boolean + +
                        + Default value : this._gallery.config.nav +
                        + +
                        + + + + + + + + + + + + + + + +
                        + + +
                        + Type : boolean + +
                        + Default value : this._gallery.config.dots +
                        + +
                        + + + + + + + + + + + + + + + +
                        + + +
                        + Type : boolean + +
                        + Default value : this._gallery.config.loop +
                        + +
                        + + + + + + + + + + + + + + + +
                        + + +
                        + Type : boolean + +
                        + Default value : this._gallery.config.debug +
                        + +
                        + + + + + + + + + + + + + + + +
                        + + +
                        + Type : boolean + +
                        + Default value : this._gallery.config.thumb +
                        + +
                        + + + + + + + + + + + + + + + +
                        + + +
                        + Type : boolean + +
                        + Default value : this._gallery.config.counter +
                        + +
                        + + + + + + + + + + + + + + + +
                        + + +
                        + Type : boolean + +
                        + Default value : this._gallery.config.thumbDetached +
                        + +
                        + + + + + + + + + + + + + + + +
                        + + +
                        + Type : boolean + +
                        + Default value : this._gallery.config.thumbAutosize +
                        + +
                        + + + + + + + + + + + + + + + +
                        + + +
                        + Type : boolean + +
                        + Default value : this._gallery.config.itemAutosize +
                        + +
                        + + + + + + + + + + + + + + + +
                        + + +
                        + Type : boolean + +
                        + Default value : this._gallery.config.autoHeight +
                        + +
                        + + + + + + + + + + + + + + + +
                        + + +
                        + Type : boolean + +
                        + Default value : this._gallery.config.autoplay +
                        + +
                        + + + + + + + + + + + + + + + +
                        + + +
                        + Type : boolean + +
                        + Default value : this._gallery.config.disableThumb +
                        + +
                        + + + + + + + + + + + + + + + +
                        + + +
                        + Type : boolean + +
                        + Default value : this._gallery.config.slidingDisabled +
                        + +
                        + + + + + + + + + + + + + + + +
                        + + +
                        + Type : boolean + +
                        + Default value : this._gallery.config.thumbSlidingDisabled +
                        + +
                        + + + + + + + + + + + + + + + +
                        + + +
                        + Type : boolean + +
                        + Default value : this._gallery.config.mouseSlidingDisabled +
                        + +
                        + + + + + + + + + + + + + + + +
                        + + +
                        + Type : boolean + +
                        + Default value : this._gallery.config.thumbMouseSlidingDisabled +
                        + +
                        + + + + + + + + + + + + + + + +
                        + + +
                        + Type : number + +
                        + Default value : this._gallery.config.dotsSize +
                        + +
                        + + + + + + + + + + + + + + + +
                        + + +
                        + Type : number + +
                        + Default value : this._gallery.config.thumbWidth +
                        + +
                        + + + + + + + + + + + + + + + +
                        + + +
                        + Type : number + +
                        + Default value : this._gallery.config.thumbHeight +
                        + +
                        + + + + + + + + + + + + + + + +
                        + + +
                        + Type : number + +
                        + Default value : this._gallery.config.playerInterval +
                        + +
                        + + + + + + + + + + + + + + + +
                        + + +
                        + Type : number + +
                        + Default value : this._gallery.config.slidingDuration +
                        + +
                        + + + + + + + + + + + + + + + +
                        + + +
                        + Type : number + +
                        + Default value : this._gallery.config.resizeDebounceTime +
                        + +
                        +
                        +
                        +

                        Outputs

                        + + + + + + + + + + + + +
                        + + error +
                        + Type : EventEmitter<GalleryError> + +
                        + +
                        + + + + + + + + + + + + +
                        + + indexChange +
                        + Type : EventEmitter<GalleryState> + +
                        + +
                        + + + + + + + + + + + + +
                        + + itemClick +
                        + Type : EventEmitter<number> + +
                        + +
                        + + + + + + + + + + + + +
                        + + itemsChange +
                        + Type : EventEmitter<GalleryState> + +
                        + +
                        + + + + + + + + + + + + +
                        + + playingChange +
                        + Type : EventEmitter<GalleryState> + +
                        + +
                        + + + + + + + + + + + + +
                        + + thumbClick +
                        + Type : EventEmitter<number> + +
                        + +
                        +
                        + + +
                        + +

                        + Methods +

                        + + + + + + + + + + + + + + + + + + + +
                        + + + add + + +
                        +add(item: GalleryItem, active?: boolean) +
                        + +
                        + +
                        + Parameters : + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                        NameTypeOptional
                        item + GalleryItem + + No +
                        active + boolean + + Yes +
                        +
                        +
                        +
                        +
                        + Returns : void + +
                        +
                        + +
                        +
                        + + + + + + + + + + + + + + + + + + + +
                        + + + addIframe + + +
                        +addIframe(data: IframeItemData, active?: boolean) +
                        + +
                        + +
                        + Parameters : + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                        NameTypeOptional
                        data + IframeItemData + + No +
                        active + boolean + + Yes +
                        +
                        +
                        +
                        +
                        + Returns : void + +
                        +
                        + +
                        +
                        + + + + + + + + + + + + + + + + + + + +
                        + + + addImage + + +
                        +addImage(data: ImageItemData, active?: boolean) +
                        + +
                        + +
                        + Parameters : + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                        NameTypeOptional
                        data + ImageItemData + + No +
                        active + boolean + + Yes +
                        +
                        +
                        +
                        +
                        + Returns : void + +
                        +
                        + +
                        +
                        + + + + + + + + + + + + + + + + + + + +
                        + + + addVideo + + +
                        +addVideo(data: VideoItemData, active?: boolean) +
                        + +
                        + +
                        + Parameters : + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                        NameTypeOptional
                        data + VideoItemData + + No +
                        active + boolean + + Yes +
                        +
                        +
                        +
                        +
                        + Returns : void + +
                        +
                        + +
                        +
                        + + + + + + + + + + + + + + + + + + + +
                        + + + addYoutube + + +
                        +addYoutube(data: YoutubeItemData, active?: boolean) +
                        + +
                        + +
                        + Parameters : + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                        NameTypeOptional
                        data + YoutubeItemData + + No +
                        active + boolean + + Yes +
                        +
                        +
                        +
                        +
                        + Returns : void + +
                        +
                        + +
                        +
                        + + + + + + + + + + + + + + + + + + + +
                        + + + Private + getConfig + + +
                        + + getConfig() +
                        + +
                        + +
                        + Returns : GalleryConfig + +
                        +
                        + + + + + + + + + + + + + + + + + + + +
                        + + + load + + +
                        +load(items: GalleryItem[]) +
                        + +
                        + +
                        + Parameters : + + + + + + + + + + + + + + + + + + + +
                        NameTypeOptional
                        items + GalleryItem[] + + No +
                        +
                        +
                        +
                        +
                        + Returns : void + +
                        +
                        + +
                        +
                        + + + + + + + + + + + + + + + + + + + +
                        + + + next + + +
                        +next(behavior?: ScrollBehavior, loop?: boolean) +
                        + +
                        + +
                        + Parameters : + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                        NameTypeOptional
                        behavior + ScrollBehavior + + Yes +
                        loop + boolean + + Yes +
                        +
                        +
                        +
                        +
                        + Returns : void + +
                        +
                        + +
                        +
                        + + + + + + + + + + + + + + + + + + + +
                        + + + ngAfterContentInit + + +
                        +ngAfterContentInit() +
                        + +
                        + +
                        + Returns : void + +
                        +
                        + + + + + + + + + + + + + + + + + + + +
                        + + + ngOnChanges + + +
                        +ngOnChanges(changes: SimpleChanges) +
                        + +
                        + +
                        + Parameters : + + + + + + + + + + + + + + + + + + + +
                        NameTypeOptional
                        changes + SimpleChanges + + No +
                        +
                        +
                        +
                        +
                        + Returns : void + +
                        +
                        + +
                        +
                        + + + + + + + + + + + + + + + + + + + +
                        + + + ngOnDestroy + + +
                        +ngOnDestroy() +
                        + +
                        + +
                        + Returns : void + +
                        +
                        + + + + + + + + + + + + + + + + + + + +
                        + + + ngOnInit + + +
                        +ngOnInit() +
                        + +
                        + +
                        + Returns : void + +
                        +
                        + + + + + + + + + + + + + + + + + + + +
                        + + + onError + + +
                        +onError(err: GalleryError) +
                        + +
                        + +
                        + Parameters : + + + + + + + + + + + + + + + + + + + +
                        NameTypeOptional
                        err + GalleryError + + No +
                        +
                        +
                        +
                        +
                        + Returns : void + +
                        +
                        + +
                        +
                        + + + + + + + + + + + + + + + + + + + +
                        + + + onItemClick + + +
                        +onItemClick(i: number) +
                        + +
                        + +
                        + Parameters : + + + + + + + + + + + + + + + + + + + +
                        NameTypeOptional
                        i + number + + No +
                        +
                        +
                        +
                        +
                        + Returns : void + +
                        +
                        + +
                        +
                        + + + + + + + + + + + + + + + + + + + +
                        + + + onThumbClick + + +
                        +onThumbClick(i: number) +
                        + +
                        + +
                        + Parameters : + + + + + + + + + + + + + + + + + + + +
                        NameTypeOptional
                        i + number + + No +
                        +
                        +
                        +
                        +
                        + Returns : void + +
                        +
                        + +
                        +
                        + + + + + + + + + + + + + + + + + + + +
                        + + + play + + +
                        +play(interval?: number) +
                        + +
                        + +
                        + Parameters : + + + + + + + + + + + + + + + + + + + +
                        NameTypeOptional
                        interval + number + + Yes +
                        +
                        +
                        +
                        +
                        + Returns : void + +
                        +
                        + +
                        +
                        + + + + + + + + + + + + + + + + + + + +
                        + + + prev + + +
                        +prev(behavior?: ScrollBehavior, loop?: boolean) +
                        + +
                        + +
                        + Parameters : + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                        NameTypeOptional
                        behavior + ScrollBehavior + + Yes +
                        loop + boolean + + Yes +
                        +
                        +
                        +
                        +
                        + Returns : void + +
                        +
                        + +
                        +
                        + + + + + + + + + + + + + + + + + + + +
                        + + + remove + + +
                        +remove(i: number) +
                        + +
                        + +
                        + Parameters : + + + + + + + + + + + + + + + + + + + +
                        NameTypeOptional
                        i + number + + No +
                        +
                        +
                        +
                        +
                        + Returns : void + +
                        +
                        + +
                        +
                        + + + + + + + + + + + + + + + + + + + +
                        + + + reset + + +
                        +reset() +
                        + +
                        + +
                        + Returns : void + +
                        +
                        + + + + + + + + + + + + + + + + + + + +
                        + + + set + + +
                        +set(i: number, behavior?: ScrollBehavior) +
                        + +
                        + +
                        + Parameters : + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                        NameTypeOptional
                        i + number + + No +
                        behavior + ScrollBehavior + + Yes +
                        +
                        +
                        +
                        +
                        + Returns : void + +
                        +
                        + +
                        +
                        + + + + + + + + + + + + + + + + + + + +
                        + + + stop + + +
                        +stop() +
                        + +
                        + +
                        + Returns : void + +
                        +
                        +
                        +
                        + +

                        + Properties +

                        + + + + + + + + + + + + + + +
                        + + + Private + _indexChange$ + + +
                        + Type : Subscription + +
                        + +
                        + + + + + + + + + + + + + + +
                        + + + Private + _itemChange$ + + +
                        + Type : Subscription + +
                        + +
                        + + + + + + + + + + + + + + +
                        + + + Private + _itemClick$ + + +
                        + Type : Subscription + +
                        + +
                        + + + + + + + + + + + + + + +
                        + + + Private + _playingChange$ + + +
                        + Type : Subscription + +
                        + +
                        + + + + + + + + + + + + + + +
                        + + + Private + _thumbClick$ + + +
                        + Type : Subscription + +
                        + +
                        + + + + + + + + + + + + + + + + + +
                        + + + galleryBoxDef + + +
                        + Type : GalleryBoxDef + +
                        + Decorators : +
                        + + @ContentChild(GalleryBoxDef)
                        +
                        +
                        + +
                        + + + + + + + + + + + + + + + + + +
                        + + + galleryImageDef + + +
                        + Type : GalleryImageDef + +
                        + Decorators : +
                        + + @ContentChild(GalleryImageDef)
                        +
                        +
                        + +
                        + + + + + + + + + + + + + + + + + +
                        + + + galleryItemDef + + +
                        + Type : GalleryItemDef + +
                        + Decorators : +
                        + + @ContentChild(GalleryItemDef)
                        +
                        +
                        + +
                        + + + + + + + + + + + + + + +
                        + + + galleryRef + + +
                        + Type : GalleryRef + +
                        + +
                        + + + + + + + + + + + + + + + + + +
                        + + + galleryThumbDef + + +
                        + Type : GalleryThumbDef + +
                        + Decorators : +
                        + + @ContentChild(GalleryThumbDef)
                        +
                        +
                        + +
                        +
                        + +
                        + + +
                        +
                        import {
                        +  Component,
                        +  Input,
                        +  Output,
                        +  ContentChild,
                        +  OnInit,
                        +  AfterContentInit,
                        +  OnChanges,
                        +  OnDestroy,
                        +  SimpleChanges,
                        +  EventEmitter,
                        +  booleanAttribute,
                        +  numberAttribute,
                        +  ChangeDetectionStrategy
                        +} from '@angular/core';
                        +import { CommonModule } from '@angular/common';
                        +import { Subscription } from 'rxjs';
                        +import { GalleryCoreComponent } from './gallery-core.component';
                        +import { Gallery } from '../services/gallery.service';
                        +import { GalleryRef } from '../services/gallery-ref';
                        +import { GalleryError, GalleryItem, GalleryState } from '../models/gallery.model';
                        +import { IframeItemData, ImageItemData, VideoItemData, YoutubeItemData } from './templates/items.model';
                        +import { GalleryConfig } from '../models/config.model';
                        +import { BezierEasingOptions } from '../smooth-scroll';
                        +import { GalleryImageDef } from '../directives/gallery-image-def.directive';
                        +import { GalleryThumbDef } from '../directives/gallery-thumb-def.directive';
                        +import { GalleryItemDef } from '../directives/gallery-item-def.directive';
                        +import { GalleryBoxDef } from '../directives/gallery-box-def.directive';
                        +import { ImgManager } from '../utils/img-manager';
                        +import { AutoplayDirective } from '../autoplay/autoplay.directive';
                        +
                        +@Component({
                        +  selector: 'gallery',
                        +  changeDetection: ChangeDetectionStrategy.OnPush,
                        +  styleUrls: ['./gallery.scss'],
                        +  template: `
                        +    <gallery-core autoplay
                        +                  [galleryId]="id"
                        +                  [state]="galleryRef.state | async"
                        +                  [config]="galleryRef.config | async"
                        +                  (itemClick)="onItemClick($event)"
                        +                  (thumbClick)="onThumbClick($event)"
                        +                  (error)="onError($event)"/>
                        +  `,
                        +  standalone: true,
                        +  imports: [CommonModule, GalleryCoreComponent, AutoplayDirective],
                        +  providers: [ImgManager]
                        +})
                        +export class GalleryComponent implements OnInit, AfterContentInit, OnChanges, OnDestroy {
                        +
                        +  galleryRef: GalleryRef;
                        +  @Input() id: string = 'root';
                        +  @Input() items: GalleryItem [];
                        +  @Input({ transform: booleanAttribute }) nav: boolean = this._gallery.config.nav;
                        +  @Input({ transform: booleanAttribute }) dots: boolean = this._gallery.config.dots;
                        +  @Input({ transform: booleanAttribute }) loop: boolean = this._gallery.config.loop;
                        +  @Input({ transform: booleanAttribute }) debug: boolean = this._gallery.config.debug;
                        +  @Input({ transform: booleanAttribute }) thumb: boolean = this._gallery.config.thumb;
                        +  @Input({ transform: booleanAttribute }) counter: boolean = this._gallery.config.counter;
                        +  @Input({ transform: booleanAttribute }) thumbDetached: boolean = this._gallery.config.thumbDetached;
                        +  @Input({ transform: booleanAttribute }) thumbAutosize: boolean = this._gallery.config.thumbAutosize;
                        +  @Input({ transform: booleanAttribute }) itemAutosize: boolean = this._gallery.config.itemAutosize;
                        +  @Input({ transform: booleanAttribute }) autoHeight: boolean = this._gallery.config.autoHeight;
                        +  @Input({ transform: booleanAttribute }) autoplay: boolean = this._gallery.config.autoplay;
                        +  @Input({ transform: booleanAttribute }) disableThumb: boolean = this._gallery.config.disableThumb;
                        +  @Input({ transform: booleanAttribute }) slidingDisabled: boolean = this._gallery.config.slidingDisabled;
                        +  @Input({ transform: booleanAttribute }) thumbSlidingDisabled: boolean = this._gallery.config.thumbSlidingDisabled;
                        +  @Input({ transform: booleanAttribute }) mouseSlidingDisabled: boolean = this._gallery.config.mouseSlidingDisabled;
                        +  @Input({ transform: booleanAttribute }) thumbMouseSlidingDisabled: boolean = this._gallery.config.thumbMouseSlidingDisabled;
                        +  @Input({ transform: numberAttribute }) dotsSize: number = this._gallery.config.dotsSize;
                        +  @Input({ transform: numberAttribute }) thumbWidth: number = this._gallery.config.thumbWidth;
                        +  @Input({ transform: numberAttribute }) thumbHeight: number = this._gallery.config.thumbHeight;
                        +  @Input({ transform: numberAttribute }) playerInterval: number = this._gallery.config.playerInterval;
                        +  @Input({ transform: numberAttribute }) slidingDuration: number = this._gallery.config.slidingDuration;
                        +  @Input({ transform: numberAttribute }) resizeDebounceTime: number = this._gallery.config.resizeDebounceTime;
                        +  @Input() scrollBehavior: ScrollBehavior = this._gallery.config.scrollBehavior;
                        +  @Input() navScrollBehavior: ScrollBehavior = this._gallery.config.navScrollBehavior;
                        +  @Input() slidingEase: BezierEasingOptions = this._gallery.config.slidingEase;
                        +
                        +  /**
                        +   * Set image size.
                        +   * Default: contain
                        +   *
                        +   */
                        +  @Input() imageSize: 'cover' | 'contain' = this._gallery.config.imageSize;
                        +  @Input() thumbImageSize: 'cover' | 'contain' = this._gallery.config.thumbImageSize;
                        +  @Input() bulletsPosition: 'top' | 'bottom' = this._gallery.config.bulletsPosition;
                        +  @Input() counterPosition: 'top' | 'bottom' = this._gallery.config.counterPosition;
                        +  @Input() slidingDirection: 'horizontal' | 'vertical' = this._gallery.config.slidingDirection;
                        +  @Input() loadingAttr: 'eager' | 'lazy' = this._gallery.config.loadingAttr;
                        +  @Input() loadingStrategy: 'preload' | 'lazy' | 'default' = this._gallery.config.loadingStrategy;
                        +  @Input() thumbPosition: 'top' | 'left' | 'right' | 'bottom' = this._gallery.config.thumbPosition;
                        +  @Input() thumbView: 'default' | 'contain' = this._gallery.config.thumbView;
                        +
                        +  // Inputs used by the lightbox
                        +
                        +  /** Destroy gallery ref on component destroy event */
                        +  @Input() destroyRef: boolean = true;
                        +
                        +  /** Skip initializing the config with components inputs (Lightbox mode) */
                        +  @Input() skipInitConfig: boolean = false;
                        +
                        +  @Output() itemClick: EventEmitter<number> = new EventEmitter<number>();
                        +  @Output() thumbClick: EventEmitter<number> = new EventEmitter<number>();
                        +  @Output() playingChange: EventEmitter<GalleryState> = new EventEmitter<GalleryState>();
                        +  @Output() indexChange: EventEmitter<GalleryState> = new EventEmitter<GalleryState>();
                        +  @Output() itemsChange: EventEmitter<GalleryState> = new EventEmitter<GalleryState>();
                        +  @Output() error: EventEmitter<GalleryError> = new EventEmitter<GalleryError>();
                        +
                        +  @ContentChild(GalleryItemDef) galleryItemDef: GalleryItemDef;
                        +  @ContentChild(GalleryImageDef) galleryImageDef: GalleryImageDef;
                        +  @ContentChild(GalleryThumbDef) galleryThumbDef: GalleryThumbDef;
                        +  @ContentChild(GalleryBoxDef) galleryBoxDef: GalleryBoxDef;
                        +
                        +  private _itemClick$: Subscription;
                        +  private _thumbClick$: Subscription;
                        +  private _itemChange$: Subscription;
                        +  private _indexChange$: Subscription;
                        +  private _playingChange$: Subscription;
                        +
                        +  constructor(private _gallery: Gallery) {
                        +  }
                        +
                        +  private getConfig(): GalleryConfig {
                        +    return {
                        +      nav: this.nav,
                        +      dots: this.dots,
                        +      loop: this.loop,
                        +      debug: this.debug,
                        +      thumb: this.thumb,
                        +      counter: this.counter,
                        +      autoplay: this.autoplay,
                        +      dotsSize: this.dotsSize,
                        +      imageSize: this.imageSize,
                        +      thumbImageSize: this.thumbImageSize,
                        +      scrollBehavior: this.scrollBehavior,
                        +      navScrollBehavior: this.navScrollBehavior,
                        +      thumbView: this.thumbView,
                        +      thumbWidth: this.thumbWidth,
                        +      thumbHeight: this.thumbHeight,
                        +      slidingEase: this.slidingEase,
                        +      disableThumb: this.disableThumb,
                        +      bulletsPosition: this.bulletsPosition,
                        +      loadingAttr: this.loadingAttr,
                        +      thumbDetached: this.thumbDetached,
                        +      thumbPosition: this.thumbPosition,
                        +      playerInterval: this.playerInterval,
                        +      counterPosition: this.counterPosition,
                        +      loadingStrategy: this.loadingStrategy,
                        +      slidingDuration: this.slidingDuration,
                        +      slidingDirection: this.slidingDirection,
                        +      resizeDebounceTime: this.resizeDebounceTime,
                        +      slidingDisabled: this.slidingDisabled,
                        +      thumbSlidingDisabled: this.thumbSlidingDisabled,
                        +      mouseSlidingDisabled: this.mouseSlidingDisabled,
                        +      thumbMouseSlidingDisabled: this.thumbMouseSlidingDisabled,
                        +      thumbAutosize: this.thumbAutosize,
                        +      itemAutosize: this.itemAutosize,
                        +      autoHeight: this.autoHeight,
                        +    };
                        +  }
                        +
                        +  ngOnChanges(changes: SimpleChanges): void {
                        +    if (this.galleryRef) {
                        +      this.galleryRef.setConfig(this.getConfig());
                        +
                        +      if (changes.items && changes.items.currentValue !== changes.items.previousValue) {
                        +        this.load(this.items);
                        +      }
                        +    }
                        +  }
                        +
                        +  ngOnInit(): void {
                        +    // Get gallery instance by id
                        +    if (this.skipInitConfig) {
                        +      this.galleryRef = this._gallery.ref(this.id);
                        +    } else {
                        +      this.galleryRef = this._gallery.ref(this.id, this.getConfig());
                        +    }
                        +
                        +    // Load gallery items
                        +    this.load(this.items);
                        +
                        +    // Subscribes to events on demand
                        +    if (this.indexChange.observed) {
                        +      this._indexChange$ = this.galleryRef.indexChanged.subscribe((state: GalleryState) => this.indexChange.emit(state));
                        +    }
                        +    if (this.itemsChange.observed) {
                        +      this._itemChange$ = this.galleryRef.itemsChanged.subscribe((state: GalleryState) => this.itemsChange.emit(state));
                        +    }
                        +    if (this.playingChange.observed) {
                        +      this._playingChange$ = this.galleryRef.playingChanged.subscribe((state: GalleryState) => this.playingChange.emit(state));
                        +    }
                        +  }
                        +
                        +  ngAfterContentInit(): void {
                        +    const templateConfig: GalleryConfig = {};
                        +    if (this.galleryItemDef) {
                        +      templateConfig.itemTemplate = this.galleryItemDef.templateRef;
                        +    }
                        +    if (this.galleryImageDef) {
                        +      templateConfig.imageTemplate = this.galleryImageDef.templateRef;
                        +    }
                        +    if (this.galleryThumbDef) {
                        +      templateConfig.thumbTemplate = this.galleryThumbDef.templateRef;
                        +    }
                        +    if (this.galleryBoxDef) {
                        +      templateConfig.boxTemplate = this.galleryBoxDef.templateRef;
                        +    }
                        +    if (Object.keys(templateConfig).length) {
                        +      this.galleryRef.setConfig(templateConfig);
                        +    }
                        +  }
                        +
                        +  ngOnDestroy(): void {
                        +    this._itemClick$?.unsubscribe();
                        +    this._thumbClick$?.unsubscribe();
                        +    this._itemChange$?.unsubscribe();
                        +    this._indexChange$?.unsubscribe();
                        +    this._playingChange$?.unsubscribe();
                        +    if (this.destroyRef) {
                        +      this.galleryRef?.destroy();
                        +    }
                        +  }
                        +
                        +  onItemClick(i: number): void {
                        +    this.itemClick.emit(i);
                        +    this.galleryRef.itemClick.next(i);
                        +  }
                        +
                        +  onThumbClick(i: number): void {
                        +    this.galleryRef.set(i);
                        +    this.thumbClick.emit(i);
                        +    this.galleryRef.thumbClick.next(i);
                        +  }
                        +
                        +  onError(err: GalleryError): void {
                        +    this.error.emit(err);
                        +    this.galleryRef.error.next(err);
                        +  }
                        +
                        +  load(items: GalleryItem[]): void {
                        +    this.galleryRef.load(items);
                        +  }
                        +
                        +  add(item: GalleryItem, active?: boolean): void {
                        +    this.galleryRef.add(item, active);
                        +  }
                        +
                        +  addImage(data: ImageItemData, active?: boolean): void {
                        +    this.galleryRef.addImage(data, active);
                        +  }
                        +
                        +  addVideo(data: VideoItemData, active?: boolean): void {
                        +    this.galleryRef.addVideo(data, active);
                        +  }
                        +
                        +  addIframe(data: IframeItemData, active?: boolean): void {
                        +    this.galleryRef.addIframe(data, active);
                        +  }
                        +
                        +  addYoutube(data: YoutubeItemData, active?: boolean): void {
                        +    this.galleryRef.addYoutube(data, active);
                        +  }
                        +
                        +  remove(i: number): void {
                        +    this.galleryRef.remove(i);
                        +  }
                        +
                        +  next(behavior?: ScrollBehavior, loop?: boolean): void {
                        +    this.galleryRef.next(behavior, loop);
                        +  }
                        +
                        +  prev(behavior?: ScrollBehavior, loop?: boolean): void {
                        +    this.galleryRef.prev(behavior, loop);
                        +  }
                        +
                        +  set(i: number, behavior?: ScrollBehavior): void {
                        +    this.galleryRef.set(i, behavior);
                        +  }
                        +
                        +  reset(): void {
                        +    this.galleryRef.reset();
                        +  }
                        +
                        +  play(interval?: number): void {
                        +    this.galleryRef.play(interval);
                        +  }
                        +
                        +  stop(): void {
                        +    this.galleryRef.stop();
                        +  }
                        +}
                        +
                        +
                        + + +
                        +

                        + ./gallery.scss +

                        +
                        :host {
                        +  position: relative;
                        +  overflow: hidden;
                        +  z-index: 1;
                        +  display: flex;
                        +  justify-content: center;
                        +  align-items: center;
                        +  background-color: black;
                        +
                        +  --g-height-transition: height 468ms cubic-bezier(0.42, 0, 0.58, 1);
                        +  --g-nav-drop-shadow: drop-shadow(0 0 2px rgba(0, 0, 0, 0.6));
                        +  --g-box-shadow: 0 0 3px rgba(0, 0, 0, 0.6);
                        +  --g-font-color: #000;
                        +  --g-overlay-color: #fff;
                        +  --g-gutter-size: 1px;
                        +
                        +  &[gallerize] {
                        +    --g-item-cursor: pointer;
                        +  }
                        +}
                        +
                        +
                        + +
                        +
                        +
                        +
                        + Legend +
                        +
                        +
                        Html element +
                        +
                        +
                        Component +
                        +
                        +
                        Html element with directive +
                        +
                        +
                        + + +
                        + + + + + + + + + + + + + + + + + + + + + + +
                        +
                        +

                        results matching ""

                        +
                          +
                          +
                          +

                          No results matching ""

                          +
                          +
                          +
                          + +
                          +
                          + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/documentation/components/GalleryCoreComponent.html b/documentation/components/GalleryCoreComponent.html new file mode 100644 index 00000000..7b1c9622 --- /dev/null +++ b/documentation/components/GalleryCoreComponent.html @@ -0,0 +1,2015 @@ + + + + + + ng-gallery-project documentation + + + + + + + + + + + + + +
                          +
                          + + +
                          +
                          + + + + + + + + +
                          +

                          +

                          File

                          +

                          +

                          + projects/ng-gallery/src/lib/components/gallery-core.component.ts +

                          + + + + +

                          +

                          Implements

                          +

                          +

                          + OnChanges +

                          + + +
                          +

                          Metadata

                          + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                          + +
                          +

                          Index

                          + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                          +
                          Methods
                          +
                          + +
                          +
                          Inputs
                          +
                          + +
                          +
                          Outputs
                          +
                          + +
                          +
                          HostBindings
                          +
                          + +
                          +
                          Accessors
                          +
                          + +
                          +
                          + +
                          +

                          Constructor

                          + + + + + + + + + + + + + +
                          +constructor(el: ElementRef) +
                          + +
                          +
                          + Parameters : + + + + + + + + + + + + + + + + + + +
                          NameTypeOptional
                          el + ElementRef<HTMLElement> + + No +
                          +
                          +
                          +
                          + +
                          +

                          Inputs

                          + + + + + + + + + + + + +
                          + + config +
                          + Type : GalleryConfig + +
                          + +
                          + + + + + + + + + + + + +
                          + + galleryId +
                          + Type : string + +
                          + +
                          + + + + + + + + + + + + +
                          + + state +
                          + Type : GalleryState + +
                          + +
                          +
                          +
                          +

                          Outputs

                          + + + + + + + + + + + + +
                          + + error +
                          + Type : EventEmitter<GalleryError> + +
                          + +
                          + + + + + + + + + + + + +
                          + + itemClick +
                          + Type : EventEmitter<number> + +
                          + +
                          + + + + + + + + + + + + +
                          + + thumbClick +
                          + Type : EventEmitter<number> + +
                          + +
                          +
                          +
                          +

                          HostBindings

                          + + + + + + + + + + + + + + + + +
                          + + + attr.autoHeight + + +
                          + Type : boolean + +
                          + +
                          +

                          Set gallery slider autoHeight style

                          +
                          +
                          + + + + + + + + + + + + + + + + + +
                          + + + attr.counterPosition + + +
                          + Type : "top" | "bottom" + +
                          + +
                          +

                          Set gallery counter position

                          +
                          +
                          + + + + + + + + + + + + + + + + + +
                          + + + attr.debug + + +
                          + Type : boolean + +
                          + +
                          +

                          Set debug style

                          +
                          +
                          + + + + + + + + + + + + + + + + + +
                          + + + attr.disableThumb + + +
                          + Type : boolean + +
                          + +
                          +

                          Disable thumbnails clicks

                          +
                          +
                          + + + + + + + + + + + + + + + + + +
                          + + + attr.bulletsPosition + + +
                          + Type : "top" | "bottom" + +
                          + +
                          +

                          Set gallery dots position

                          +
                          +
                          + + + + + + + + + + + + + + + + + +
                          + + + attr.imageSize + + +
                          + Type : "cover" | "contain" + +
                          + +
                          +

                          Set gallery image size

                          +
                          +
                          + + + + + + + + + + + + + + + + + +
                          + + + attr.itemAutosize + + +
                          + Type : boolean + +
                          + +
                          +

                          Set gallery slider itemAutosize style

                          +
                          +
                          + + + + + + + + + + + + + + + + + +
                          + + + attr.slidingDirection + + +
                          + Type : "horizontal" | "vertical" + +
                          + +
                          +

                          Set sliding direction

                          +
                          +
                          + + + + + + + + + + + + + + + + + +
                          + + + attr.slidingDisabled + + +
                          + Type : boolean + +
                          + +
                          +

                          Set gallery counter position

                          +
                          +
                          + + + + + + + + + + + + + + + + + +
                          + + + attr.thumbAutosize + + +
                          + Type : boolean + +
                          + +
                          +

                          Set gallery slider thumbAutosize style

                          +
                          +
                          + + + + + + + + + + + + + + +
                          + + + attr.thumbImageSize + + +
                          + Type : "contain" | "cover" + +
                          + +
                          + + + + + + + + + + + + + + + + + +
                          + + + attr.thumbPosition + + +
                          + Type : "top" | "left" | "right" | "bottom" + +
                          + +
                          +

                          Set thumbnails position

                          +
                          +
                          + + + + + + + + + + + + + + + + + +
                          + + + attr.thumbSlidingDisabled + + +
                          + Type : boolean + +
                          + +
                          +

                          Set gallery counter position

                          +
                          +
                          +
                          + + +
                          + +

                          + Methods +

                          + + + + + + + + + + + + + + + + + + + +
                          + + + ngOnChanges + + +
                          +ngOnChanges(changes: SimpleChanges) +
                          + +
                          + +
                          + Parameters : + + + + + + + + + + + + + + + + + + + +
                          NameTypeOptional
                          changes + SimpleChanges + + No +
                          +
                          +
                          +
                          +
                          + Returns : void + +
                          +
                          + +
                          +
                          +
                          + +
                          +

                          + Accessors +

                          + + + + + + + + + + + + + + + + + +
                          + + thumbPosition +
                          + getthumbPosition() +
                          + +
                          +

                          Set thumbnails position

                          +
                          + +
                          + Returns : "top" | "left" | "right" | "bottom" + +
                          +
                          + + + + + + + + + + + + + + + + + +
                          + + slidingDirection +
                          + getslidingDirection() +
                          + +
                          +

                          Set sliding direction

                          +
                          + +
                          + Returns : "horizontal" | "vertical" + +
                          +
                          + + + + + + + + + + + + + + + + + +
                          + + disableThumb +
                          + getdisableThumb() +
                          + +
                          +

                          Disable thumbnails clicks

                          +
                          + +
                          + Returns : boolean + +
                          +
                          + + + + + + + + + + + + + + + + + +
                          + + imageSize +
                          + getimageSize() +
                          + +
                          +

                          Set gallery image size

                          +
                          + +
                          + Returns : "cover" | "contain" + +
                          +
                          + + + + + + + + + + + + + + +
                          + + thumbImageSize +
                          + getthumbImageSize() +
                          + +
                          + + + + + + + + + + + + + + + + + +
                          + + bulletsPosition +
                          + getbulletsPosition() +
                          + +
                          +

                          Set gallery dots position

                          +
                          + +
                          + Returns : "top" | "bottom" + +
                          +
                          + + + + + + + + + + + + + + + + + +
                          + + counterPosition +
                          + getcounterPosition() +
                          + +
                          +

                          Set gallery counter position

                          +
                          + +
                          + Returns : "top" | "bottom" + +
                          +
                          + + + + + + + + + + + + + + + + + +
                          + + slidingDisabled +
                          + getslidingDisabled() +
                          + +
                          +

                          Set gallery counter position

                          +
                          + +
                          + Returns : boolean + +
                          +
                          + + + + + + + + + + + + + + + + + +
                          + + thumbSlidingDisabled +
                          + getthumbSlidingDisabled() +
                          + +
                          +

                          Set gallery counter position

                          +
                          + +
                          + Returns : boolean + +
                          +
                          + + + + + + + + + + + + + + + + + +
                          + + itemAutosize +
                          + getitemAutosize() +
                          + +
                          +

                          Set gallery slider itemAutosize style

                          +
                          + +
                          + Returns : boolean + +
                          +
                          + + + + + + + + + + + + + + + + + +
                          + + autoHeight +
                          + getautoHeight() +
                          + +
                          +

                          Set gallery slider autoHeight style

                          +
                          + +
                          + Returns : boolean + +
                          +
                          + + + + + + + + + + + + + + + + + +
                          + + thumbAutosize +
                          + getthumbAutosize() +
                          + +
                          +

                          Set gallery slider thumbAutosize style

                          +
                          + +
                          + Returns : boolean + +
                          +
                          + + + + + + + + + + + + + + + + + +
                          + + debug +
                          + getdebug() +
                          + +
                          +

                          Set debug style

                          +
                          + +
                          + Returns : boolean + +
                          +
                          +
                          +
                          + + +
                          +
                          import {
                          +  Component,
                          +  Input,
                          +  Output,
                          +  HostBinding,
                          +  EventEmitter,
                          +  OnChanges,
                          +  SimpleChanges,
                          +  ElementRef,
                          +  ChangeDetectionStrategy
                          +} from '@angular/core';
                          +import { CommonModule } from '@angular/common';
                          +import { coerceCssPixelValue } from '@angular/cdk/coercion';
                          +import { GalleryCounterComponent } from './gallery-counter.component';
                          +import { GalleryBulletsComponent } from './gallery-dots.component';
                          +import { GalleryNavComponent } from './gallery-nav.component';
                          +import { GallerySliderComponent } from './gallery-slider.component';
                          +import { GalleryThumbsComponent } from './gallery-thumbs.component';
                          +import { GalleryError, GalleryState } from '../models/gallery.model';
                          +import { GalleryConfig } from '../models/config.model';
                          +
                          +@Component({
                          +  selector: 'gallery-core',
                          +  changeDetection: ChangeDetectionStrategy.OnPush,
                          +  styleUrls: ['./gallery-core.scss', '../styles/debug.scss'],
                          +  template: `
                          +    <gallery-thumbs *ngIf="config.thumb"
                          +                    [state]="state"
                          +                    [config]="config"
                          +                    [galleryId]="galleryId"
                          +                    (thumbClick)="thumbClick.emit($event)"
                          +                    (error)="error.emit($event)">
                          +    </gallery-thumbs>
                          +
                          +    <div class="g-box">
                          +      <gallery-slider [class.g-debug]="config.debug"
                          +                      [state]="state"
                          +                      [config]="config"
                          +                      [galleryId]="galleryId"
                          +                      (itemClick)="itemClick.emit($event)"
                          +                      (error)="error.emit($event)">
                          +
                          +        <gallery-nav *ngIf="config.nav && state.items.length > 1"
                          +                     [state]="state"
                          +                     [config]="config"
                          +                     [galleryId]="galleryId">
                          +        </gallery-nav>
                          +
                          +      </gallery-slider>
                          +
                          +      <gallery-dots *ngIf="config.dots"
                          +                    [state]="state"
                          +                    [config]="config"
                          +                    [galleryId]="galleryId">
                          +      </gallery-dots>
                          +
                          +      <gallery-counter *ngIf="config.counter"
                          +                       [state]="state">
                          +      </gallery-counter>
                          +
                          +      <div class="g-box-template">
                          +        <ng-container *ngTemplateOutlet="config.boxTemplate; context: { state: state, config: config }"></ng-container>
                          +      </div>
                          +    </div>
                          +  `,
                          +  standalone: true,
                          +  imports: [CommonModule, GalleryThumbsComponent, GallerySliderComponent, GalleryNavComponent, GalleryBulletsComponent, GalleryCounterComponent]
                          +})
                          +export class GalleryCoreComponent implements OnChanges {
                          +
                          +  @Input() galleryId: string;
                          +  @Input() state: GalleryState;
                          +  @Input() config: GalleryConfig;
                          +  @Output() itemClick: EventEmitter<number> = new EventEmitter<number>();
                          +  @Output() thumbClick: EventEmitter<number> = new EventEmitter<number>();
                          +  @Output() error: EventEmitter<GalleryError> = new EventEmitter<GalleryError>();
                          +
                          +  /** Set thumbnails position */
                          +  @HostBinding('attr.thumbPosition') get thumbPosition(): 'top' | 'left' | 'right' | 'bottom' {
                          +    return this.config.thumbPosition;
                          +  }
                          +
                          +  /** Set sliding direction */
                          +  @HostBinding('attr.slidingDirection') get slidingDirection(): 'horizontal' | 'vertical' {
                          +    return this.config.slidingDirection;
                          +  }
                          +
                          +  /** Disable thumbnails clicks */
                          +  @HostBinding('attr.disableThumb') get disableThumb(): boolean {
                          +    return this.config.disableThumb;
                          +  }
                          +
                          +  /** Set gallery image size */
                          +  @HostBinding('attr.imageSize') get imageSize(): 'cover' | 'contain' {
                          +    return this.config.imageSize;
                          +  }
                          +
                          +  @HostBinding('attr.thumbImageSize') get thumbImageSize(): 'contain' | 'cover' {
                          +    return this.config.thumbImageSize;
                          +  }
                          +
                          +  /** Set gallery dots position */
                          +  @HostBinding('attr.bulletsPosition') get bulletsPosition(): 'top' | 'bottom' {
                          +    return this.config.bulletsPosition;
                          +  }
                          +
                          +  /** Set gallery counter position */
                          +  @HostBinding('attr.counterPosition') get counterPosition(): 'top' | 'bottom' {
                          +    return this.config.counterPosition;
                          +  }
                          +
                          +  /** Set gallery counter position */
                          +  @HostBinding('attr.slidingDisabled') get slidingDisabled(): boolean {
                          +    return this.config.slidingDisabled;
                          +  }
                          +
                          +  /** Set gallery counter position */
                          +  @HostBinding('attr.thumbSlidingDisabled') get thumbSlidingDisabled(): boolean {
                          +    return this.config.thumbSlidingDisabled;
                          +  }
                          +
                          +  /** Set gallery slider itemAutosize style  */
                          +  @HostBinding('attr.itemAutosize') get itemAutosize(): boolean {
                          +    return this.config.itemAutosize;
                          +  }
                          +
                          +  /** Set gallery slider autoHeight style  */
                          +  @HostBinding('attr.autoHeight') get autoHeight(): boolean {
                          +    return this.config.autoHeight;
                          +  }
                          +
                          +  /** Set gallery slider thumbAutosize style  */
                          +  @HostBinding('attr.thumbAutosize') get thumbAutosize(): boolean {
                          +    return this.config.thumbAutosize;
                          +  }
                          +
                          +  /** Set debug style  */
                          +  @HostBinding('attr.debug') get debug(): boolean {
                          +    return this.config.debug;
                          +  }
                          +
                          +  constructor(private el: ElementRef<HTMLElement>) {
                          +  }
                          +
                          +  ngOnChanges(changes: SimpleChanges): void {
                          +    if (changes.config) {
                          +      if (changes.config.currentValue?.thumbWidth !== changes.config.previousValue?.thumbWidth) {
                          +        this.el.nativeElement.style.setProperty('--g-thumb-width', coerceCssPixelValue(changes.config.currentValue.thumbWidth));
                          +      }
                          +      if (changes.config.currentValue?.thumbHeight !== changes.config.previousValue?.thumbHeight) {
                          +        this.el.nativeElement.style.setProperty('--g-thumb-height', coerceCssPixelValue(changes.config.currentValue.thumbHeight));
                          +      }
                          +    }
                          +  }
                          +}
                          +
                          +
                          + + +
                          +

                          + ./gallery-core.scss +

                          +
                          :host {
                          +  position: relative;
                          +  overflow: hidden;
                          +  display: flex;
                          +  gap: var(--g-gutter-size);
                          +  width: 100%;
                          +  height: 500px;
                          +  min-height: 100%;
                          +  max-height: 100%;
                          +
                          +  &[thumbPosition='top'] {
                          +    flex-direction: column;
                          +  }
                          +
                          +  &[thumbPosition='left'] {
                          +    flex-direction: row;
                          +  }
                          +
                          +  &[thumbPosition='right'] {
                          +    flex-direction: row-reverse;
                          +  }
                          +
                          +  &[thumbPosition='bottom'] {
                          +    flex-direction: column-reverse;
                          +  }
                          +
                          +  // Gallery auto-height variables
                          +  &[autoHeight='true'][itemAutoSize='false'][slidingDirection='horizontal'] {
                          +    &[thumbPosition='top'], &[thumbPosition='bottom'] {
                          +      // if auto-height, use fit-content
                          +      height: fit-content;
                          +      --g-item-height: auto !important;
                          +      --g-item-max-height: auto;
                          +    }
                          +  }
                          +
                          +  // Gallery image variables
                          +  --image-object-fit: unset;
                          +
                          +  &[imageSize='contain'] gallery-slider,
                          +  &[thumbImageSize='contain'] gallery-thumbs {
                          +    --image-object-fit: contain;
                          +  }
                          +
                          +  &[imageSize='cover'] gallery-slider,
                          +  &[thumbImageSize='cover'] gallery-thumbs {
                          +    --image-object-fit: cover;
                          +  }
                          +
                          +  // Gallery thumbs variables
                          +  --slider-thumb-height: unset;
                          +  --slider-thumb-width: unset;
                          +  --thumb-slider-left: unset;
                          +  --thumb-slider-overflow: unset;
                          +  --thumb-slider-flex-direction: unset;
                          +  --g-thumb-width: unset;
                          +  --g-thumb-height: unset;
                          +
                          +  &[thumbPosition='top'],
                          +  &[thumbPosition='bottom'] {
                          +    --thumb-slider-top: 0;
                          +    --thumb-slider-overflow: auto hidden;
                          +    --thumb-slider-flex-direction: row;
                          +    --g-thumb-height: 100%;
                          +
                          +    &[thumbAutosize="true"] {
                          +      --g-thumb-width: auto !important;
                          +    }
                          +  }
                          +
                          +  &[thumbPosition='left'],
                          +  &[thumbPosition='right'] {
                          +    --thumb-slider-left: 0;
                          +    --thumb-slider-overflow: hidden auto;
                          +    --thumb-slider-flex-direction: column;
                          +    --g-thumb-width: 100%;
                          +
                          +    &[thumbAutosize="true"] {
                          +      --g-thumb-height: auto !important;
                          +    }
                          +  }
                          +
                          +  --g-thumb-cursor: pointer;
                          +
                          +  &[disableThumb='true'] {
                          +    --g-thumb-cursor: default;
                          +  }
                          +
                          +  &[thumbSlidingDisabled='true'] {
                          +    --thumb-slider-overflow: hidden !important;
                          +  }
                          +
                          +  // Gallery slider variables
                          +  --slider-scroll-snap-type: unset;
                          +  --slider-overflow: unset;
                          +  --slider-flex-direction: unset;
                          +  --slider-width: unset;
                          +  --slider-height: unset;
                          +  --slider-content-width: unset;
                          +  --slider-content-height: unset;
                          +
                          +  &[slidingDirection='horizontal'] {
                          +    --slider-overflow: auto hidden;
                          +    --slider-scroll-snap-type: x mandatory;
                          +    --slider-flex-direction: row;
                          +    --slider-content-height: 100%;
                          +  }
                          +
                          +  &[slidingDirection='vertical'] {
                          +    --slider-overflow: hidden auto;
                          +    --slider-scroll-snap-type: y mandatory;
                          +    --slider-flex-direction: column;
                          +    --slider-content-width: 100%;
                          +  }
                          +
                          +  &[slidingDisabled='true'] {
                          +    --slider-overflow: hidden !important;
                          +  }
                          +
                          +  // Gallery items variables
                          +  --g-item-width: unset;
                          +  --g-item-height: unset;
                          +  --g-item-max-height: var(--slider-height);
                          +
                          +  &[slidingDirection='horizontal'] {
                          +    --g-item-width: var(--slider-width);
                          +    --g-item-height: 100%;
                          +
                          +    &[itemAutoSize='true'] {
                          +      --g-item-width: auto;
                          +    }
                          +  }
                          +
                          +  &[slidingDirection='vertical'] {
                          +    --g-item-width: 100%;
                          +    --g-item-height: var(--slider-height);
                          +
                          +    &[itemAutoSize='true'] {
                          +      --g-item-height: auto;
                          +    }
                          +  }
                          +
                          +  // Gallery dots variables
                          +  --dots-top: unset;
                          +  --dots-bottom: unset;
                          +
                          +  &[bulletsPosition='top'] {
                          +    --dots-top: 15px;
                          +  }
                          +
                          +  &[bulletsPosition='bottom'] {
                          +    --dots-bottom: 15px;
                          +  }
                          +
                          +  // Gallery position variables
                          +  --counter-top: unset;
                          +  --counter-bottom: unset;
                          +  --counter-border-radius: unset;
                          +
                          +  &[counterPosition='top'] {
                          +    --counter-top: 0;
                          +    --counter-border-radius: 0 0 4px 4px;
                          +  }
                          +
                          +  &[counterPosition='bottom'] {
                          +    --counter-bottom: 0;
                          +    --counter-border-radius: 4px 4px 0 0;
                          +  }
                          +}
                          +
                          +.g-box {
                          +  overflow: hidden;
                          +  position: relative;
                          +  display: flex;
                          +  flex-direction: column;
                          +  order: 1;
                          +  flex: 1;
                          +}
                          +
                          +.g-box-template {
                          +  position: absolute;
                          +  z-index: 10;
                          +}
                          +
                          +

                          + ../styles/debug.scss +

                          +
                          :host[debug='true'] {
                          +  ::ng-deep {
                          +    .g-sliding, .g-resizing, .g-scrolling {
                          +      gallery-item.g-item-highlight {
                          +        visibility: hidden;
                          +      }
                          +    }
                          +  }
                          +
                          +  ::ng-deep {
                          +    gallery-slider {
                          +      &:after, &:before {
                          +        position: absolute;
                          +        content: '';
                          +        z-index: 12;
                          +      }
                          +
                          +      &:before {
                          +        width: 100%;
                          +        height: 0;
                          +        border-top: 1px dashed lime;
                          +      }
                          +
                          +      &:after {
                          +        height: 100%;
                          +        width: 0;
                          +        border-left: 1px dashed lime;
                          +      }
                          +
                          +      gallery-item {
                          +        outline: 1px solid darkorange;
                          +
                          +        &.g-item-highlight {
                          +          &:after {
                          +            content: '';
                          +            position: absolute;
                          +            width: 100%;
                          +            height: 100%;
                          +            border: 3px solid lime;
                          +            box-sizing: border-box;
                          +            z-index: 10;
                          +          }
                          +        }
                          +      }
                          +    }
                          +
                          +    .g-sliding {
                          +      .g-slider-sliding {
                          +        display: block;
                          +      }
                          +    }
                          +
                          +    .g-scrolling {
                          +      .g-slider-scrolling {
                          +        display: block;
                          +      }
                          +    }
                          +
                          +    .g-resizing {
                          +      .g-slider-resizing {
                          +        display: block;
                          +      }
                          +    }
                          +
                          +    .g-slider-debug {
                          +      position: absolute;
                          +      top: 0;
                          +      left: 0;
                          +      display: flex;
                          +      gap: 5px;
                          +      padding: 10px;
                          +
                          +      .g-slider-resizing {
                          +        background: rgba(245, 76, 40);
                          +      }
                          +
                          +      .g-slider-scrolling {
                          +        background: rgb(255, 133, 36);
                          +      }
                          +
                          +      .g-slider-sliding {
                          +        background: rgb(31, 108, 185);
                          +      }
                          +
                          +      div, &:before {
                          +        display: none;
                          +        color: white;
                          +        font-family: monospace;
                          +        z-index: 12;
                          +        padding: 2px 6px;
                          +        border-radius: 3px;
                          +      }
                          +    }
                          +  }
                          +
                          +  &[itemAutoSize='false'] {
                          +    ::ng-deep {
                          +      .g-slider-debug {
                          +        &:before {
                          +          content: var(--intersection-margin);
                          +          background: rgba(236, 236, 236, 0.84);
                          +          color: #363636;
                          +          display: block;
                          +        }
                          +      }
                          +    }
                          +  }
                          +
                          +  &[itemAutoSize='true'] {
                          +    ::ng-deep {
                          +      gallery-item {
                          +        &:before {
                          +          position: absolute;
                          +          margin: 10px;
                          +          content: var(--item-intersection-margin);
                          +          background: rgba(236, 236, 236, 0.84);
                          +          color: #363636;
                          +          display: block;
                          +          width: 270px;
                          +          font-family: monospace;
                          +          z-index: 12;
                          +          padding: 2px 6px;
                          +          border-radius: 3px;
                          +        }
                          +      }
                          +    }
                          +  }
                          +}
                          +
                          +
                          + +
                          +
                          +
                          +
                          + Legend +
                          +
                          +
                          Html element +
                          +
                          +
                          Component +
                          +
                          +
                          Html element with directive +
                          +
                          +
                          + + +
                          + + + + + + + + + + + + + + + + + + + + + + +
                          +
                          +

                          results matching ""

                          +
                            +
                            +
                            +

                            No results matching ""

                            +
                            +
                            +
                            + +
                            +
                            + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/documentation/components/GalleryCounterComponent.html b/documentation/components/GalleryCounterComponent.html new file mode 100644 index 00000000..11a58a59 --- /dev/null +++ b/documentation/components/GalleryCounterComponent.html @@ -0,0 +1,336 @@ + + + + + + ng-gallery-project documentation + + + + + + + + + + + + + +
                            +
                            + + +
                            +
                            + + + + + + + + +
                            +

                            +

                            File

                            +

                            +

                            + projects/ng-gallery/src/lib/components/gallery-counter.component.ts +

                            + + + + + + +
                            +

                            Metadata

                            + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                            + +
                            +

                            Index

                            + + + + + + + + + + + + + + + +
                            +
                            Inputs
                            +
                            + +
                            +
                            + + +
                            +

                            Inputs

                            + + + + + + + + + + + + +
                            + + state +
                            + Type : GalleryState + +
                            + +
                            +
                            + + + + + +
                            + + +
                            +
                            import { Component, Input, ChangeDetectionStrategy } from '@angular/core';
                            +import { GalleryState } from '../models/gallery.model';
                            +
                            +@Component({
                            +  selector: 'gallery-counter',
                            +  changeDetection: ChangeDetectionStrategy.OnPush,
                            +  styleUrls: ['./gallery-counter.scss'],
                            +  template: `
                            +    <div class="g-counter">{{ (state.currIndex + 1) + ' / ' + state.items.length }}</div>
                            +  `,
                            +  standalone: true
                            +})
                            +export class GalleryCounterComponent {
                            +  @Input() state: GalleryState;
                            +}
                            +
                            +
                            + + +
                            +

                            + ./gallery-counter.scss +

                            +
                            .g-counter {
                            +  font-weight: bold;
                            +  user-select: none;
                            +  opacity: 0.6;
                            +  transition: opacity linear 150ms;
                            +  z-index: 50;
                            +  position: absolute;
                            +  left: 50%;
                            +  transform: translateX(-50%) perspective(1px);
                            +  font-size: 12px;
                            +  padding: 4px 10px;
                            +  color: var(--g-font-color);
                            +  background-color: var(--g-overlay-color);
                            +  box-shadow: var(--g-box-shadow);
                            +
                            +  top: var(--counter-top);
                            +  bottom: var(--counter-bottom);
                            +  border-radius: var(--counter-border-radius);
                            +
                            +  &:hover {
                            +    opacity: 0.8;
                            +  }
                            +}
                            +
                            +
                            + +
                            +
                            +
                            +
                            + Legend +
                            +
                            +
                            Html element +
                            +
                            +
                            Component +
                            +
                            +
                            Html element with directive +
                            +
                            +
                            + + +
                            + + + + + + + + + + + + + + + + + + + + + + +
                            +
                            +

                            results matching ""

                            +
                              +
                              +
                              +

                              No results matching ""

                              +
                              +
                              +
                              + +
                              +
                              + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/documentation/components/GalleryDotsComponent.html b/documentation/components/GalleryDotsComponent.html new file mode 100644 index 00000000..3a3cb702 --- /dev/null +++ b/documentation/components/GalleryDotsComponent.html @@ -0,0 +1,520 @@ + + + + + + ng-gallery-project documentation + + + + + + + + + + + + + +
                              +
                              + + +
                              +
                              + + + + + + + + +
                              +

                              +

                              File

                              +

                              +

                              + projects/ng-gallery/src/lib/components/gallery-bullets.component.ts +

                              + + + + + + +
                              +

                              Metadata

                              + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                              + +
                              +

                              Index

                              + + + + + + + + + + + + + + + + + + + + + +
                              +
                              Properties
                              +
                              + +
                              +
                              Inputs
                              +
                              + +
                              +
                              + +
                              +

                              Constructor

                              + + + + + + + + + + + + + +
                              +constructor(gallery: Gallery) +
                              + +
                              +
                              + Parameters : + + + + + + + + + + + + + + + + + + +
                              NameTypeOptional
                              gallery + Gallery + + No +
                              +
                              +
                              +
                              + +
                              +

                              Inputs

                              + + + + + + + + + + + + +
                              + + config +
                              + Type : GalleryConfig + +
                              + +
                              + + + + + + + + + + + + +
                              + + galleryId +
                              + Type : string + +
                              + +
                              + + + + + + + + + + + + +
                              + + state +
                              + Type : GalleryState + +
                              + +
                              +
                              + + + + +
                              + +

                              + Properties +

                              + + + + + + + + + + + + + + +
                              + + + Public + gallery + + +
                              + Type : Gallery + +
                              + +
                              +
                              + +
                              + + +
                              +
                              import { Component, Input, ChangeDetectionStrategy } from '@angular/core';
                              +import { CommonModule } from '@angular/common';
                              +import { Gallery } from '../services/gallery.service';
                              +import { GalleryState } from '../models/gallery.model';
                              +import { GalleryConfig } from '../models/config.model';
                              +
                              +@Component({
                              +  selector: 'gallery-dots',
                              +  changeDetection: ChangeDetectionStrategy.OnPush,
                              +  styleUrls: ['./gallery-dots.scss'],
                              +  template: `
                              +    <div class="g-dot"
                              +         *ngFor="let item of state.items; let i = index"
                              +         [class.g-dot-active]="i === state.currIndex"
                              +         [style.width.px]="config?.dotsSize"
                              +         [style.height.px]="config?.dotsSize"
                              +         (click)="gallery.ref(this.galleryId).set(i)">
                              +      <div class="g-dot-inner"></div>
                              +    </div>
                              +  `,
                              +  standalone: true,
                              +  imports: [CommonModule]
                              +})
                              +export class GalleryBulletsComponent {
                              +  @Input() galleryId: string;
                              +  @Input() state: GalleryState;
                              +  @Input() config: GalleryConfig;
                              +
                              +  constructor(public gallery: Gallery) {
                              +  }
                              +}
                              +
                              +
                              + + +
                              +

                              + ./gallery-dots.scss +

                              +
                              :host {
                              +  position: absolute;
                              +  left: 50%;
                              +  z-index: 99;
                              +  transform: translateX(-50%);
                              +  display: flex;
                              +  gap: 6px;
                              +  top: var(--dots-top);
                              +  bottom: var(--dots-bottom);
                              +}
                              +
                              +:host,
                              +.g-dot,
                              +.g-dot-inner {
                              +  display: flex;
                              +  justify-content: center;
                              +  align-items: center;
                              +}
                              +
                              +.g-dot {
                              +  cursor: pointer;
                              +  z-index: 20;
                              +
                              +  &:hover .g-dot-inner {
                              +    opacity: 1;
                              +  }
                              +}
                              +
                              +.g-dot-active .g-dot-inner {
                              +  opacity: 1;
                              +}
                              +
                              +.g-dot-inner {
                              +  background-color: var(--g-overlay-color);
                              +  opacity: 0.4;
                              +  width: 100%;
                              +  height: 100%;
                              +  border-radius: 50%;
                              +  transition: opacity linear 150ms;
                              +}
                              +
                              +
                              + +
                              +
                              +
                              +
                              + Legend +
                              +
                              +
                              Html element +
                              +
                              +
                              Component +
                              +
                              +
                              Html element with directive +
                              +
                              +
                              + + +
                              + + + + + + + + + + + + + + + + + + + + + + +
                              +
                              +

                              results matching ""

                              +
                                +
                                +
                                +

                                No results matching ""

                                +
                                +
                                +
                                + +
                                +
                                + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/documentation/components/GalleryExampleComponent.html b/documentation/components/GalleryExampleComponent.html new file mode 100644 index 00000000..60a7a05f --- /dev/null +++ b/documentation/components/GalleryExampleComponent.html @@ -0,0 +1,1432 @@ + + + + + + ng-gallery-project documentation + + + + + + + + + + + + + +
                                +
                                + + +
                                +
                                + + + + + + + + +
                                +

                                +

                                File

                                +

                                +

                                + projects/ng-gallery/src/stories/basic/gallery-example.component.ts +

                                + + +

                                +

                                Description

                                +

                                +

                                +

                                It should be possible to write a description here

                                + +

                                + + + + +
                                +

                                Metadata

                                + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                + +
                                +

                                Index

                                + + + + + + + + + + + + + + + + + + + + + +
                                +
                                Properties
                                +
                                + +
                                +
                                Inputs
                                +
                                + +
                                +
                                + +
                                +

                                Constructor

                                + + + + + + + + + + + + + +
                                +constructor(pixabay: Pixabay) +
                                + +
                                +
                                + Parameters : + + + + + + + + + + + + + + + + + + +
                                NameTypeOptional
                                pixabay + Pixabay + + No +
                                +
                                +
                                +
                                + +
                                +

                                Inputs

                                + + + + + + + + + + + + + + + +
                                + + autoHeight +
                                + Type : boolean + +
                                + +
                                +

                                This is a test

                                +
                                +
                                + + + + + + + + + + + + +
                                + + autoplay +
                                + Type : boolean + +
                                + +
                                + + + + + + + + + + + + +
                                + + counter +
                                + Type : boolean + +
                                + +
                                + + + + + + + + + + + + + + + +
                                + + counterPosition +
                                + Type : "top" | "bottom" + +
                                + Default value : CounterPosition.Top +
                                + +
                                + + + + + + + + + + + + +
                                + + debug +
                                + Type : boolean + +
                                + +
                                + + + + + + + + + + + + +
                                + + disableThumb +
                                + Type : boolean + +
                                + +
                                + + + + + + + + + + + + +
                                + + dots +
                                + Type : boolean + +
                                + +
                                + + + + + + + + + + + + + + + +
                                + + bulletsPosition +
                                + Type : "top" | "bottom" + +
                                + Default value : bulletsPosition.Bottom +
                                + +
                                + + + + + + + + + + + + + + + +
                                + + dotsSize +
                                + Type : number + +
                                + Default value : 6 +
                                + +
                                + + + + + + + + + + + + + + + +
                                + + imageSize +
                                + Type : "cover" | "contain" + +
                                + Default value : ImageSize.Contain +
                                + +
                                + + + + + + + + + + + + +
                                + + itemAutosize +
                                + Type : boolean + +
                                + +
                                + + + + + + + + + + + + + + + +
                                + + loadingAttr +
                                + Type : "eager" | "lazy" + +
                                + Default value : LoadingAttr.Lazy +
                                + +
                                + + + + + + + + + + + + + + + +
                                + + loadingStrategy +
                                + Type : "preload" | "lazy" | "default" + +
                                + Default value : LoadingStrategy.Default +
                                + +
                                + + + + + + + + + + + + +
                                + + loop +
                                + Type : boolean + +
                                + +
                                + + + + + + + + + + + + +
                                + + mouseSlidingDisabled +
                                + Type : boolean + +
                                + +
                                + + + + + + + + + + + + +
                                + + nav +
                                + Type : boolean + +
                                + +
                                + + + + + + + + + + + + + + + +
                                + + navScrollBehavior +
                                + Type : "smooth" | "auto" + +
                                + Default value : 'smooth' +
                                + +
                                + + + + + + + + + + + + + + + +
                                + + playerInterval +
                                + Type : number + +
                                + Default value : 3000 +
                                + +
                                + + + + + + + + + + + + + + + +
                                + + resizeDebounceTime +
                                + Type : number + +
                                + Default value : 0 +
                                + +
                                + + + + + + + + + + + + + + + +
                                + + scrollBehavior +
                                + Type : "smooth" | "auto" + +
                                + Default value : 'smooth' +
                                + +
                                + + + + + + + + + + + + + + + +
                                + + slidingDirection +
                                + Type : "horizontal" | "vertical" + +
                                + Default value : SlidingDirection.Horizontal +
                                + +
                                + + + + + + + + + + + + +
                                + + slidingDisabled +
                                + Type : boolean + +
                                + +
                                + + + + + + + + + + + + + + + +
                                + + slidingDuration +
                                + Type : number + +
                                + Default value : 468 +
                                + +
                                + + + + + + + + + + + + + + + +
                                + + slidingEase +
                                + Type : BezierEasingOptions + +
                                + Default value : { + x1: 0.42, + y1: 0, + x2: 0.58, + y2: 1 + } +
                                + +
                                + + + + + + + + + + + + +
                                + + thumb +
                                + Type : boolean + +
                                + +
                                + + + + + + + + + + + + +
                                + + thumbAutosize +
                                + Type : boolean + +
                                + +
                                + + + + + + + + + + + + +
                                + + thumbDetached +
                                + Type : boolean + +
                                + +
                                + + + + + + + + + + + + + + + +
                                + + thumbHeight +
                                + Type : number + +
                                + Default value : 90 +
                                + +
                                + + + + + + + + + + + + + + + +
                                + + thumbImageSize +
                                + Type : "cover" | "contain" + +
                                + Default value : ImageSize.Cover +
                                + +
                                + + + + + + + + + + + + +
                                + + thumbMouseSlidingDisabled +
                                + Type : boolean + +
                                + +
                                + + + + + + + + + + + + + + + +
                                + + thumbPosition +
                                + Type : "top" | "left" | "right" | "bottom" + +
                                + Default value : ThumbnailsPosition.Bottom +
                                + +
                                + + + + + + + + + + + + +
                                + + thumbSlidingDisabled +
                                + Type : boolean + +
                                + +
                                + + + + + + + + + + + + + + + +
                                + + thumbView +
                                + Type : "default" | "contain" + +
                                + Default value : ThumbnailsView.Default +
                                + +
                                + + + + + + + + + + + + + + + +
                                + + thumbWidth +
                                + Type : number + +
                                + Default value : 120 +
                                + +
                                +
                                + + + + +
                                + +

                                + Properties +

                                + + + + + + + + + + + + + + +
                                + + + Readonly + items$ + + +
                                + Type : Observable<GalleryItem[]> + +
                                + +
                                +
                                + +
                                + + +
                                +
                                import { Component, ChangeDetectionStrategy, Input } from '@angular/core';
                                +import { CommonModule } from '@angular/common';
                                +import {
                                +  GalleryModule,
                                +  GalleryItem,
                                +  LoadingAttr,
                                +  ImageSize,
                                +  ThumbnailsPosition,
                                +  LoadingStrategy,
                                +  SlidingDirection,
                                +  CounterPosition,
                                +  bulletsPosition,
                                +  ThumbnailsView
                                +} from 'ng-gallery';
                                +import { Observable } from 'rxjs';
                                +import { Pixabay } from '../pixabay/pixabay.service';
                                +import { BezierEasingOptions } from '../../lib/smooth-scroll';
                                +
                                +/**
                                + * It should be possible to write a description here
                                + */
                                +@Component({
                                +  selector: 'gallery-example',
                                +  template: `
                                +    <gallery [items]="items$ | async"
                                +             [imageSize]="imageSize"
                                +             [thumbImageSize]="thumbImageSize"
                                +             [bulletsPosition]="bulletsPosition"
                                +             [counterPosition]="counterPosition"
                                +             [slidingDirection]="slidingDirection"
                                +             [loadingAttr]="loadingAttr"
                                +             [loadingStrategy]="loadingStrategy"
                                +             [thumbPosition]="thumbPosition"
                                +             [thumbView]="thumbView"
                                +             [scrollBehavior]="scrollBehavior"
                                +             [navScrollBehavior]="navScrollBehavior"
                                +             [dotsSize]="dotsSize"
                                +             [thumbWidth]="thumbWidth"
                                +             [thumbHeight]="thumbHeight"
                                +             [playerInterval]="playerInterval"
                                +             [slidingDuration]="slidingDuration"
                                +             [resizeDebounceTime]="resizeDebounceTime"
                                +             [nav]="nav"
                                +             [dots]="dots"
                                +             [loop]="loop"
                                +             [debug]="debug"
                                +             [thumb]="thumb"
                                +             [counter]="counter"
                                +             [autoplay]="autoplay"
                                +             [autoHeight]="autoHeight"
                                +             [itemAutosize]="itemAutosize"
                                +             [disableThumb]="disableThumb"
                                +             [thumbDetached]="thumbDetached"
                                +             [thumbAutosize]="thumbAutosize"
                                +             [slidingDisabled]="slidingDisabled"
                                +             [thumbSlidingDisabled]="thumbSlidingDisabled"
                                +             [mouseSlidingDisabled]="mouseSlidingDisabled"
                                +             [thumbMouseSlidingDisabled]="thumbMouseSlidingDisabled"
                                +    />
                                +  `,
                                +  changeDetection: ChangeDetectionStrategy.OnPush,
                                +  standalone: true,
                                +  imports: [CommonModule, GalleryModule]
                                +})
                                +export class GalleryExampleComponent {
                                +
                                +  readonly items$: Observable<GalleryItem[]>;
                                +
                                +  @Input() nav: boolean;
                                +  @Input() dots: boolean;
                                +  @Input() loop: boolean;
                                +  @Input() debug: boolean;
                                +  @Input() thumb: boolean;
                                +  @Input() counter: boolean;
                                +  @Input() thumbDetached: boolean;
                                +  @Input() thumbAutosize: boolean;
                                +  @Input() itemAutosize: boolean;
                                +
                                +  /** This is a test */
                                +  @Input() autoHeight: boolean;
                                +
                                +  @Input() autoplay: boolean;
                                +
                                +  @Input() disableThumb: boolean;
                                +
                                +  @Input() slidingDisabled: boolean;
                                +  @Input() thumbSlidingDisabled: boolean;
                                +  @Input() mouseSlidingDisabled: boolean;
                                +  @Input() thumbMouseSlidingDisabled: boolean;
                                +  @Input() dotsSize: number = 6;
                                +  @Input() thumbWidth: number = 120;
                                +  @Input() thumbHeight: number = 90;
                                +  @Input() playerInterval: number = 3000;
                                +  @Input() slidingDuration: number = 468;
                                +  @Input() resizeDebounceTime: number = 0;
                                +  @Input() scrollBehavior: 'smooth' | 'auto' = 'smooth';
                                +  @Input() navScrollBehavior: 'smooth' | 'auto' = 'smooth';
                                +  @Input() slidingEase: BezierEasingOptions = {
                                +    x1: 0.42,
                                +    y1: 0,
                                +    x2: 0.58,
                                +    y2: 1
                                +  };
                                +  @Input() imageSize: 'cover' | 'contain' = ImageSize.Contain;
                                +  @Input() thumbImageSize: 'cover' | 'contain' = ImageSize.Cover;
                                +  @Input() bulletsPosition: 'top' | 'bottom' = bulletsPosition.Bottom;
                                +  @Input() counterPosition: 'top' | 'bottom' = CounterPosition.Top;
                                +  @Input() slidingDirection: 'horizontal' | 'vertical' = SlidingDirection.Horizontal;
                                +  @Input() loadingAttr: 'eager' | 'lazy' = LoadingAttr.Lazy;
                                +  @Input() loadingStrategy: 'preload' | 'lazy' | 'default' = LoadingStrategy.Default;
                                +  @Input() thumbPosition: 'top' | 'left' | 'right' | 'bottom' = ThumbnailsPosition.Bottom;
                                +  @Input() thumbView: 'default' | 'contain' = ThumbnailsView.Default;
                                +
                                +  constructor(pixabay: Pixabay) {
                                +    this.items$ = pixabay.getHDImages('vegetables');
                                +  }
                                +}
                                +
                                +
                                + + + +
                                +
                                +
                                +
                                + Legend +
                                +
                                +
                                Html element +
                                +
                                +
                                Component +
                                +
                                +
                                Html element with directive +
                                +
                                +
                                + + +
                                + + + + + + + + + + + + + + + + + + + + + + +
                                +
                                +

                                results matching ""

                                +
                                  +
                                  +
                                  +

                                  No results matching ""

                                  +
                                  +
                                  +
                                  + +
                                  +
                                  + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/documentation/components/GalleryIframeComponent.html b/documentation/components/GalleryIframeComponent.html new file mode 100644 index 00000000..ea80259d --- /dev/null +++ b/documentation/components/GalleryIframeComponent.html @@ -0,0 +1,733 @@ + + + + + + ng-gallery-project documentation + + + + + + + + + + + + + +
                                  +
                                  + + +
                                  +
                                  + + + + + + + + +
                                  +

                                  +

                                  File

                                  +

                                  +

                                  + projects/ng-gallery/src/lib/components/templates/gallery-iframe.component.ts +

                                  + + + + + + +
                                  +

                                  Metadata

                                  + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                  + +
                                  +

                                  Index

                                  + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                  +
                                  Properties
                                  +
                                  + +
                                  +
                                  Inputs
                                  +
                                  + +
                                  +
                                  Accessors
                                  +
                                  + +
                                  +
                                  + +
                                  +

                                  Constructor

                                  + + + + + + + + + + + + + +
                                  +constructor(_sanitizer: DomSanitizer) +
                                  + +
                                  +
                                  + Parameters : + + + + + + + + + + + + + + + + + + +
                                  NameTypeOptional
                                  _sanitizer + DomSanitizer + + No +
                                  +
                                  +
                                  +
                                  + +
                                  +

                                  Inputs

                                  + + + + + + + + + + + + +
                                  + + autoplay +
                                  + Type : boolean + +
                                  + +
                                  + + + + + + + + + + + + +
                                  + + loadingAttr +
                                  + Type : "eager" | "lazy" + +
                                  + +
                                  + + + + + + + + + + + + +
                                  + + pause +
                                  + Type : boolean + +
                                  + +
                                  + + + + + + + + + + + + +
                                  + + src +
                                  + Type : string + +
                                  + +
                                  +
                                  + + + + +
                                  + +

                                  + Properties +

                                  + + + + + + + + + + + + + + + + + +
                                  + + + iframe + + +
                                  + Type : ElementRef + +
                                  + Decorators : +
                                  + + @ViewChild('iframe')
                                  +
                                  +
                                  + +
                                  + + + + + + + + + + + + + + +
                                  + + + iframeSrc + + +
                                  + Type : SafeResourceUrl + +
                                  + +
                                  + + + + + + + + + + + + + + +
                                  + + + videoSrc + + +
                                  + Type : string + +
                                  + +
                                  +
                                  + +
                                  +

                                  + Accessors +

                                  + + + + + + + + + + + + + + + + + +
                                  + + src +
                                  + setsrc(src: string) +
                                  + +
                                  + +
                                  + Parameters : + + + + + + + + + + + + + + + + + + +
                                  NameTypeOptional
                                  src + string + + No +
                                  +
                                  +
                                  +
                                  +
                                  + Returns : void + +
                                  +
                                  + + + + + + + + + + + + + + + + + +
                                  + + pauseVideo +
                                  + setpauseVideo(shouldPause: boolean) +
                                  + +
                                  + +
                                  + Parameters : + + + + + + + + + + + + + + + + + + +
                                  NameTypeOptional
                                  shouldPause + boolean + + No +
                                  +
                                  +
                                  +
                                  +
                                  + Returns : void + +
                                  +
                                  +
                                  +
                                  + + +
                                  +
                                  import { Component, Input, ViewChild, ElementRef, ChangeDetectionStrategy } from '@angular/core';
                                  +import { NgIf } from '@angular/common';
                                  +import { DomSanitizer, SafeResourceUrl } from '@angular/platform-browser';
                                  +
                                  +@Component({
                                  +  selector: 'gallery-iframe',
                                  +  changeDetection: ChangeDetectionStrategy.OnPush,
                                  +  template: `
                                  +    <iframe *ngIf="autoplay; else default"
                                  +            #iframe
                                  +            [attr.loading]="loadingAttr"
                                  +            allowfullscreen
                                  +            allow
                                  +            style="border:none"
                                  +            [src]="iframeSrc">
                                  +    </iframe>
                                  +    <ng-template #default>
                                  +      <iframe #iframe
                                  +              [attr.loading]="loadingAttr"
                                  +              allowfullscreen
                                  +              style="border:none"
                                  +              [src]="iframeSrc">
                                  +      </iframe>
                                  +    </ng-template>
                                  +  `,
                                  +  standalone: true,
                                  +  imports: [NgIf]
                                  +})
                                  +export class GalleryIframeComponent {
                                  +
                                  +  iframeSrc: SafeResourceUrl;
                                  +  videoSrc: string;
                                  +
                                  +  @Input('src') set src(src: string) {
                                  +    this.videoSrc = src;
                                  +    this.iframeSrc = this._sanitizer.bypassSecurityTrustResourceUrl(src);
                                  +  }
                                  +
                                  +  @Input('pause') set pauseVideo(shouldPause: boolean) {
                                  +    if (this.iframe?.nativeElement) {
                                  +      if (shouldPause) {
                                  +        const iframe: HTMLIFrameElement = this.iframe.nativeElement;
                                  +        iframe.src = null;
                                  +
                                  +        if (!this.autoplay && this.videoSrc) {
                                  +          this.iframeSrc = this._sanitizer.bypassSecurityTrustResourceUrl(this.videoSrc);
                                  +        }
                                  +      }
                                  +    }
                                  +  }
                                  +
                                  +  @Input() autoplay: boolean;
                                  +
                                  +  @Input() loadingAttr: 'eager' | 'lazy';
                                  +
                                  +  @ViewChild('iframe') iframe: ElementRef;
                                  +
                                  +  constructor(private _sanitizer: DomSanitizer) {
                                  +  }
                                  +}
                                  +
                                  +
                                  + + + +
                                  +
                                  +
                                  +
                                  + Legend +
                                  +
                                  +
                                  Html element +
                                  +
                                  +
                                  Component +
                                  +
                                  +
                                  Html element with directive +
                                  +
                                  +
                                  + + +
                                  + + + + + + + + + + + + + + + + + + + + + + +
                                  +
                                  +

                                  results matching ""

                                  +
                                    +
                                    +
                                    +

                                    No results matching ""

                                    +
                                    +
                                    +
                                    + +
                                    +
                                    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/documentation/components/GalleryImageComponent.html b/documentation/components/GalleryImageComponent.html new file mode 100644 index 00000000..b8017d2c --- /dev/null +++ b/documentation/components/GalleryImageComponent.html @@ -0,0 +1,1203 @@ + + + + + + ng-gallery-project documentation + + + + + + + + + + + + + +
                                    +
                                    + + +
                                    +
                                    + + + + + + + + +
                                    +

                                    +

                                    File

                                    +

                                    +

                                    + projects/ng-gallery/src/lib/components/templates/gallery-image.component.ts +

                                    + + + + +

                                    +

                                    Implements

                                    +

                                    +

                                    + OnInit +

                                    + + +
                                    +

                                    Metadata

                                    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                    + +
                                    +

                                    Index

                                    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                    +
                                    Properties
                                    +
                                    + +
                                    +
                                    Methods
                                    +
                                    + +
                                    +
                                    Inputs
                                    +
                                    + +
                                    +
                                    Outputs
                                    +
                                    + +
                                    +
                                    HostBindings
                                    +
                                    + +
                                    +
                                    Accessors
                                    +
                                    + +
                                    +
                                    + +
                                    +

                                    Constructor

                                    + + + + + + + + + + + + + +
                                    +constructor(_sanitizer: DomSanitizer) +
                                    + +
                                    +
                                    + Parameters : + + + + + + + + + + + + + + + + + + +
                                    NameTypeOptional
                                    _sanitizer + DomSanitizer + + No +
                                    +
                                    +
                                    +
                                    + +
                                    +

                                    Inputs

                                    + + + + + + + + + + + + + + + +
                                    + + alt +
                                    + Type : string + +
                                    + +
                                    +

                                    Image alt

                                    +
                                    +
                                    + + + + + + + + + + + + + + + +
                                    + + errorIcon +
                                    + Type : string + +
                                    + Default value : imageFailedSvg +
                                    + +
                                    + + + + + + + + + + + + +
                                    + + index +
                                    + Type : number + +
                                    + +
                                    + + + + + + + + + + + + + + + +
                                    + + isThumbnail +
                                    + Type : boolean + +
                                    + +
                                    +

                                    Is thumbnail

                                    +
                                    +
                                    + + + + + + + + + + + + + + + +
                                    + + loadingAttr +
                                    + Type : "eager" | "lazy" + +
                                    + +
                                    +

                                    Image loading attribute

                                    +
                                    +
                                    + + + + + + + + + + + + + + + +
                                    + + loadingError +
                                    + Type : string + +
                                    + +
                                    +

                                    Custom error template

                                    +
                                    +
                                    + + + + + + + + + + + + + + + +
                                    + + loadingIcon +
                                    + Type : string + +
                                    + +
                                    +

                                    Custom loader template

                                    +
                                    +
                                    + + + + + + + + + + + + + + + +
                                    + + src +
                                    + Type : string + +
                                    + +
                                    +

                                    Image source URL

                                    +
                                    +
                                    +
                                    +
                                    +

                                    Outputs

                                    + + + + + + + + + + + + + + + +
                                    + + error +
                                    + Type : EventEmitter<ErrorEvent> + +
                                    + +
                                    +

                                    Stream that emits when an error occurs

                                    +
                                    +
                                    +
                                    +
                                    +

                                    HostBindings

                                    + + + + + + + + + + + + + +
                                    + + + attr.imageState + + +
                                    + Type : string + +
                                    + +
                                    +
                                    + + +
                                    + +

                                    + Methods +

                                    + + + + + + + + + + + + + + + + + + + +
                                    + + + ngOnInit + + +
                                    +ngOnInit() +
                                    + +
                                    + +
                                    + Returns : void + +
                                    +
                                    +
                                    +
                                    + +

                                    + Properties +

                                    + + + + + + + + + + + + + + +
                                    + + + errorSvg + + +
                                    + Type : SafeHtml + +
                                    + +
                                    + + + + + + + + + + + + + + + + + +
                                    + + + errorTemplate + + +
                                    + Type : SafeHtml + +
                                    + +
                                    +

                                    Custom error safe template

                                    +
                                    +
                                    + + + + + + + + + + + + + + + + + +
                                    + + + loaderTemplate + + +
                                    + Type : SafeHtml + +
                                    + +
                                    +

                                    Custom loader safe template

                                    +
                                    +
                                    + + + + + + + + + + + + + + + + + +
                                    + + + state + + +
                                    + Type : ItemState + +
                                    + Default value : 'loading' +
                                    + +
                                    +
                                    + +
                                    +

                                    + Accessors +

                                    + + + + + + + + + + + + + + +
                                    + + imageState +
                                    + getimageState() +
                                    + +
                                    +
                                    +
                                    + + +
                                    +
                                    import {
                                    +  Component,
                                    +  Input,
                                    +  Output,
                                    +  HostBinding,
                                    +  EventEmitter,
                                    +  OnInit,
                                    +  ChangeDetectionStrategy
                                    +} from '@angular/core';
                                    +import { NgSwitch, NgSwitchCase, NgIf } from '@angular/common';
                                    +import { DomSanitizer, SafeHtml } from '@angular/platform-browser';
                                    +import { animate, style, transition, trigger } from '@angular/animations';
                                    +import { imageFailedSvg } from './svg-assets';
                                    +import { ImgRecognizer } from '../../utils/img-recognizer';
                                    +import { ItemState } from './items.model';
                                    +
                                    +@Component({
                                    +  selector: 'gallery-image',
                                    +  changeDetection: ChangeDetectionStrategy.OnPush,
                                    +  styleUrls: ['./gallery-image.scss'],
                                    +  animations: [
                                    +    trigger('fadeIn', [
                                    +      transition('* => success', [
                                    +        style({ opacity: 0 }),
                                    +        animate('300ms ease-in', style({ opacity: 1 }))
                                    +      ])
                                    +    ])
                                    +  ],
                                    +  template: `
                                    +    <ng-container [ngSwitch]="state">
                                    +
                                    +      <ng-container *ngIf="isThumbnail; else main">
                                    +        <img [@fadeIn]="state"
                                    +             [src]="src"
                                    +             [attr.alt]="alt"
                                    +             [attr.loading]="loadingAttr"
                                    +             [style.visibility]="state === 'success' ? 'visible' : 'hidden'"
                                    +             class="g-image-item"
                                    +             (load)="state = 'success'"
                                    +             (error)="state = 'failed'; error.emit($event)"/>
                                    +      </ng-container>
                                    +      <ng-template #main>
                                    +        <img [galleryImage]="index"
                                    +             [@fadeIn]="state"
                                    +             [src]="src"
                                    +             [attr.alt]="alt"
                                    +             [attr.loading]="loadingAttr"
                                    +             [style.visibility]="state === 'success' ? 'visible' : 'hidden'"
                                    +             class="g-image-item"
                                    +             (load)="state = 'success'"
                                    +             (error)="state = 'failed'; error.emit($event)"/>
                                    +      </ng-template>
                                    +
                                    +      <div *ngSwitchCase="'failed'"
                                    +           class="g-image-error-message">
                                    +        <div *ngIf="errorTemplate; else defaultError"
                                    +             [innerHTML]="errorTemplate"></div>
                                    +        <ng-template #defaultError>
                                    +          <ng-container *ngIf="isThumbnail; else isLarge">
                                    +            <h4>
                                    +              <div class="gallery-thumb-error" [innerHTML]="errorSvg"></div>
                                    +            </h4>
                                    +          </ng-container>
                                    +          <ng-template #isLarge>
                                    +            <h2>
                                    +              <div class="gallery-image-error" [innerHTML]="errorSvg"></div>
                                    +            </h2>
                                    +            <p>Unable to load the image!</p>
                                    +          </ng-template>
                                    +        </ng-template>
                                    +      </div>
                                    +
                                    +      <ng-container *ngSwitchCase="'loading'">
                                    +        <div *ngIf="loaderTemplate; else defaultLoader"
                                    +             class="g-loading"
                                    +             [innerHTML]="loaderTemplate">
                                    +        </div>
                                    +        <ng-template #defaultLoader>
                                    +          <div *ngIf="isThumbnail" class="g-thumb-loading"></div>
                                    +        </ng-template>
                                    +      </ng-container>
                                    +    </ng-container>
                                    +  `,
                                    +  standalone: true,
                                    +  imports: [NgSwitch, NgSwitchCase, NgIf, ImgRecognizer]
                                    +})
                                    +
                                    +export class GalleryImageComponent implements OnInit {
                                    +
                                    +  state: ItemState = 'loading';
                                    +
                                    +  /** Is thumbnail */
                                    +  @Input() isThumbnail: boolean;
                                    +
                                    +  @Input() index: number;
                                    +
                                    +  /** Image loading attribute */
                                    +  @Input() loadingAttr: 'eager' | 'lazy';
                                    +
                                    +  /** Image alt */
                                    +  @Input() alt: string;
                                    +
                                    +  /** Image source URL */
                                    +  @Input() src: string;
                                    +
                                    +  /** Custom loader template */
                                    +  @Input() loadingIcon: string;
                                    +  /** Custom loader safe template */
                                    +  loaderTemplate: SafeHtml;
                                    +
                                    +  /** Custom error template */
                                    +  @Input() loadingError: string;
                                    +  /** Custom error safe template */
                                    +  errorTemplate: SafeHtml;
                                    +
                                    +  @Input() errorIcon: string = imageFailedSvg;
                                    +  errorSvg: SafeHtml;
                                    +
                                    +  /** Stream that emits when an error occurs */
                                    +  @Output() error: EventEmitter<ErrorEvent> = new EventEmitter<ErrorEvent>();
                                    +
                                    +  @HostBinding('attr.imageState') get imageState(): string {
                                    +    return this.state;
                                    +  }
                                    +
                                    +  constructor(private _sanitizer: DomSanitizer) {
                                    +  }
                                    +
                                    +  ngOnInit() {
                                    +    if (this.loadingIcon) {
                                    +      this.loaderTemplate = this._sanitizer.bypassSecurityTrustHtml(this.loadingIcon);
                                    +    }
                                    +    if (this.loadingError) {
                                    +      this.errorTemplate = this._sanitizer.bypassSecurityTrustHtml(this.loadingError);
                                    +    }
                                    +    if (this.errorIcon) {
                                    +      this.errorSvg = this._sanitizer.bypassSecurityTrustHtml(this.errorIcon);
                                    +    }
                                    +  }
                                    +}
                                    +
                                    +
                                    + + +
                                    +

                                    + ./gallery-image.scss +

                                    +
                                    :host {
                                    +  display: flex;
                                    +  width: 100%;
                                    +  height: 100%;
                                    +  max-height: 100%;
                                    +  max-width: 100%;
                                    +  transition: opacity 300ms cubic-bezier(0.5, 0, 0.5, 1);
                                    +  opacity: var(--g-thumb-opacity);
                                    +
                                    +  &[imageState='success'] {
                                    +    align-self: center;
                                    +  }
                                    +
                                    +  ::ng-deep {
                                    +    svg {
                                    +      width: 100%;
                                    +      height: 100%;
                                    +    }
                                    +  }
                                    +}
                                    +
                                    +.gallery-image-error {
                                    +  width: 100px;
                                    +  height: 100px;
                                    +}
                                    +
                                    +.gallery-thumb-error {
                                    +  width: 40px;
                                    +  height: 40px;
                                    +}
                                    +
                                    +img.g-image-item {
                                    +  object-fit: var(--image-object-fit);
                                    +  width: 100%;
                                    +  height: 100%;
                                    +  pointer-events: none;
                                    +  max-height: 100%;
                                    +  max-width: 100%;
                                    +}
                                    +
                                    +.g-image-error-message {
                                    +  position: absolute;
                                    +  z-index: 10;
                                    +  left: 0;
                                    +  top: 0;
                                    +  right: 0;
                                    +  bottom: 0;
                                    +  color: white;
                                    +  display: flex;
                                    +  align-items: center;
                                    +  justify-content: center;
                                    +  flex-direction: column;
                                    +}
                                    +
                                    +h2, h4 {
                                    +  color: coral;
                                    +  margin: 0;
                                    +}
                                    +
                                    +h2 {
                                    +  font-size: 3.5em;
                                    +  margin-bottom: 0.3em;
                                    +}
                                    +
                                    +h4 {
                                    +  font-size: 1.6em;
                                    +}
                                    +
                                    +.g-loading {
                                    +  position: absolute;
                                    +  transform: translate3d(-50%, -50%, 0);
                                    +  left: 50%;
                                    +  top: 50%;
                                    +  width: 80px;
                                    +  height: 80px;
                                    +}
                                    +
                                    +// Thumbnail loading
                                    +
                                    +$loading-color: #fff !default;
                                    +$placeholder-ng: #262626 !default;
                                    +
                                    +.g-active-thumb {
                                    +  .g-thumb-loading {
                                    +    background-color: #464646;
                                    +  }
                                    +}
                                    +
                                    +.g-thumb-loading {
                                    +  position: relative;
                                    +  overflow: hidden;
                                    +  width: 100%;
                                    +  height: 100%;
                                    +  background-color: $placeholder-ng;
                                    +
                                    +  &::before {
                                    +    content: "";
                                    +    position: absolute;
                                    +    top: 0;
                                    +    right: 0;
                                    +    bottom: 0;
                                    +    left: 50%;
                                    +    z-index: 1;
                                    +    width: 500%;
                                    +    margin-left: -250%;
                                    +    animation: phAnimation .8s linear infinite;
                                    +    background: linear-gradient(to right, rgba($loading-color, 0) 46%, rgba($loading-color, .35) 50%, rgba($loading-color, 0) 54%) 50% 50%;
                                    +  }
                                    +}
                                    +
                                    +@keyframes phAnimation {
                                    +  0% {
                                    +    transform: translate3d(-30%, 0, 0);
                                    +  }
                                    +  100% {
                                    +    transform: translate3d(30%, 0, 0);
                                    +  }
                                    +}
                                    +
                                    +
                                    + +
                                    +
                                    +
                                    +
                                    + Legend +
                                    +
                                    +
                                    Html element +
                                    +
                                    +
                                    Component +
                                    +
                                    +
                                    Html element with directive +
                                    +
                                    +
                                    + + +
                                    + + + + + + + + + + + + + + + + + + + + + + +
                                    +
                                    +

                                    results matching ""

                                    +
                                      +
                                      +
                                      +

                                      No results matching ""

                                      +
                                      +
                                      +
                                      + +
                                      +
                                      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/documentation/components/GalleryItemComponent.html b/documentation/components/GalleryItemComponent.html new file mode 100644 index 00000000..e704b185 --- /dev/null +++ b/documentation/components/GalleryItemComponent.html @@ -0,0 +1,1414 @@ + + + + + + ng-gallery-project documentation + + + + + + + + + + + + + +
                                      +
                                      + + +
                                      +
                                      + + + + + + + + +
                                      +

                                      +

                                      File

                                      +

                                      +

                                      + projects/ng-gallery/src/lib/components/gallery-item.component.ts +

                                      + + + + +

                                      +

                                      Implements

                                      +

                                      +

                                      + AfterViewInit +

                                      + + +
                                      +

                                      Metadata

                                      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                      + +
                                      +

                                      Index

                                      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                      +
                                      Properties
                                      +
                                      + +
                                      +
                                      Methods
                                      +
                                      + +
                                      +
                                      Inputs
                                      +
                                      + +
                                      +
                                      Outputs
                                      +
                                      + +
                                      +
                                      HostBindings
                                      +
                                      + +
                                      +
                                      Accessors
                                      +
                                      + +
                                      +
                                      + +
                                      +

                                      Constructor

                                      + + + + + + + + + + + + + +
                                      +constructor(el: ElementRef) +
                                      + +
                                      +
                                      + Parameters : + + + + + + + + + + + + + + + + + + +
                                      NameTypeOptional
                                      el + ElementRef + + No +
                                      +
                                      +
                                      +
                                      + +
                                      +

                                      Inputs

                                      + + + + + + + + + + + + + + + +
                                      + + config +
                                      + Type : GalleryConfig + +
                                      + +
                                      +

                                      Gallery config

                                      +
                                      +
                                      + + + + + + + + + + + + + + + +
                                      + + count +
                                      + Type : number + +
                                      + +
                                      +

                                      The number of total items

                                      +
                                      +
                                      + + + + + + + + + + + + + + + +
                                      + + currIndex +
                                      + Type : number + +
                                      + +
                                      +

                                      Gallery current index

                                      +
                                      +
                                      + + + + + + + + + + + + + + + +
                                      + + data +
                                      + Type : GalleryItemData + +
                                      + +
                                      +

                                      Item's data, this object contains the data required to display the content (e.g. src path)

                                      +
                                      +
                                      + + + + + + + + + + + + + + + +
                                      + + index +
                                      + Type : number + +
                                      + +
                                      +

                                      Item's index in the gallery

                                      +
                                      +
                                      + + + + + + + + + + + + + + + +
                                      + + type +
                                      + Type : GalleryItemType + +
                                      + +
                                      +

                                      Item's type 'image', 'video', 'youtube', 'iframe'

                                      +
                                      +
                                      +
                                      +
                                      +

                                      Outputs

                                      + + + + + + + + + + + + + + + +
                                      + + error +
                                      + Type : EventEmitter<ErrorEvent> + +
                                      + +
                                      +

                                      Stream that emits when an error occurs

                                      +
                                      +
                                      +
                                      +
                                      +

                                      HostBindings

                                      + + + + + + + + + + + + + +
                                      + + + attr.galleryIndex + + +
                                      + Type : number + +
                                      + +
                                      + + + + + + + + + + + + + + +
                                      + + + attr.itemState + + +
                                      + Type : ItemState + +
                                      + +
                                      + + + + + + + + + + + + + + +
                                      + + + class.g-active-item + + +
                                      + Type : boolean + +
                                      + +
                                      +
                                      + + +
                                      + +

                                      + Methods +

                                      + + + + + + + + + + + + + + + + + + + +
                                      + + + ngAfterViewInit + + +
                                      +ngAfterViewInit() +
                                      + +
                                      + +
                                      + Returns : void + +
                                      +
                                      +
                                      +
                                      + +

                                      + Properties +

                                      + + + + + + + + + + + + + + + + + +
                                      + + + isItemContainImage + + +
                                      + Type : boolean + +
                                      + +
                                      +

                                      A flag that indicates if the item is type of image, it can be a custom template by the user, +The img recognizer directive will set it to true

                                      +
                                      +
                                      + + + + + + + + + + + + + + + + + + + + +
                                      + + + Readonly + state$ + + +
                                      + Type : BehaviorSubject<ItemState> + +
                                      + Default value : new BehaviorSubject<ItemState>('loading') +
                                      + +
                                      +

                                      A stream that indicates that the height was emitted after the image is loaded, used only for gallery image types

                                      +
                                      +
                                      + + + + + + + + + + + + + + +
                                      + + + Readonly + Types + + +
                                      + Default value : GalleryItemTypes +
                                      + +
                                      +
                                      + +
                                      +

                                      + Accessors +

                                      + + + + + + + + + + + + + + +
                                      + + isActive +
                                      + getisActive() +
                                      + +
                                      + + + + + + + + + + + + + + +
                                      + + isIndexAttr +
                                      + getisIndexAttr() +
                                      + +
                                      + + + + + + + + + + + + + + +
                                      + + itemState +
                                      + getitemState() +
                                      + +
                                      + + + + + + + + + + + + + + +
                                      + + imageContext +
                                      + getimageContext() +
                                      + +
                                      + + + + + + + + + + + + + + +
                                      + + itemContext +
                                      + getitemContext() +
                                      + +
                                      + + + + + + + + + + + + + + +
                                      + + nativeElement +
                                      + getnativeElement() +
                                      + +
                                      + + + + + + + + + + + + + + +
                                      + + isAutoPlay +
                                      + getisAutoPlay() +
                                      + +
                                      + + + + + + + + + + + + + + +
                                      + + youtubeSrc +
                                      + getyoutubeSrc() +
                                      + +
                                      + + + + + + + + + + + + + + +
                                      + + load +
                                      + getload() +
                                      + +
                                      + + + + + + + + + + + + + + +
                                      + + imageData +
                                      + getimageData() +
                                      + +
                                      + + + + + + + + + + + + + + +
                                      + + videoData +
                                      + getvideoData() +
                                      + +
                                      +
                                      +
                                      + + +
                                      +
                                      import {
                                      +  Component,
                                      +  HostBinding,
                                      +  Input,
                                      +  Output,
                                      +  EventEmitter,
                                      +  ElementRef,
                                      +  AfterViewInit,
                                      +  ChangeDetectionStrategy
                                      +} from '@angular/core';
                                      +import { CommonModule } from '@angular/common';
                                      +import { BehaviorSubject } from 'rxjs';
                                      +import { GalleryItemContext } from '../directives/gallery-item-def.directive';
                                      +import { GalleryIframeComponent } from './templates/gallery-iframe.component';
                                      +import { GalleryVideoComponent } from './templates/gallery-video.component';
                                      +import { GalleryImageComponent } from './templates/gallery-image.component';
                                      +import { GalleryConfig } from '../models/config.model';
                                      +import { GalleryItemType, GalleryItemTypes, LoadingStrategy } from '../models/constants';
                                      +import { GalleryItemData, ImageItemData, ItemState, VideoItemData, YoutubeItemData } from './templates/items.model';
                                      +
                                      +@Component({
                                      +  selector: 'gallery-item',
                                      +  changeDetection: ChangeDetectionStrategy.OnPush,
                                      +  styleUrls: ['./gallery-item.scss'],
                                      +  template: `
                                      +    <ng-container *ngIf="load" [ngSwitch]="type">
                                      +      <ng-container *ngSwitchCase="Types.Image">
                                      +        <gallery-image [src]="imageData.src"
                                      +                       [alt]="imageData.alt"
                                      +                       [index]="index"
                                      +                       [loadingAttr]="config.loadingAttr"
                                      +                       [loadingIcon]="config.loadingIcon"
                                      +                       [loadingError]="config.loadingError"
                                      +                       (error)="error.emit($event)"></gallery-image>
                                      +
                                      +        <div *ngIf="config.imageTemplate" class="g-template g-item-template">
                                      +          <ng-container *ngTemplateOutlet="config.imageTemplate; context: imageContext"></ng-container>
                                      +        </div>
                                      +      </ng-container>
                                      +
                                      +      <gallery-video *ngSwitchCase="Types.Video"
                                      +                     [src]="videoData.src"
                                      +                     [mute]="videoData.mute"
                                      +                     [poster]="videoData.poster"
                                      +                     [controls]="videoData.controls"
                                      +                     [controlsList]="videoData.controlsList"
                                      +                     [disablePictureInPicture]="videoData.disablePictureInPicture"
                                      +                     [play]="isAutoPlay"
                                      +                     [pause]="currIndex !== index"
                                      +                     (error)="error.emit($event)"></gallery-video>
                                      +
                                      +      <gallery-iframe *ngSwitchCase="Types.Youtube"
                                      +                      [src]="youtubeSrc"
                                      +                      [autoplay]="isAutoPlay"
                                      +                      [loadingAttr]="config.loadingAttr"
                                      +                      [pause]="currIndex !== index"></gallery-iframe>
                                      +
                                      +      <gallery-iframe *ngSwitchCase="Types.Iframe"
                                      +                      [src]="data.src"
                                      +                      [loadingAttr]="config.loadingAttr"></gallery-iframe>
                                      +
                                      +      <ng-container *ngSwitchDefault>
                                      +        <div *ngIf="config.itemTemplate" class="g-template g-item-template">
                                      +          <ng-container *ngTemplateOutlet="config.itemTemplate; context: itemContext"></ng-container>
                                      +        </div>
                                      +      </ng-container>
                                      +    </ng-container>
                                      +  `,
                                      +  standalone: true,
                                      +  imports: [CommonModule, GalleryImageComponent, GalleryVideoComponent, GalleryIframeComponent]
                                      +})
                                      +export class GalleryItemComponent implements AfterViewInit {
                                      +
                                      +  readonly Types = GalleryItemTypes;
                                      +
                                      +  /** A stream that indicates that the height was emitted after the image is loaded, used only for gallery image types */
                                      +  readonly state$: BehaviorSubject<ItemState> = new BehaviorSubject<ItemState>('loading');
                                      +
                                      +  /** A flag that indicates if the item is type of image, it can be a custom template by the user,
                                      +   * The img recognizer directive will set it to true*/
                                      +  isItemContainImage: boolean;
                                      +
                                      +  /** Gallery config */
                                      +  @Input() config: GalleryConfig;
                                      +
                                      +  /** Item's index in the gallery */
                                      +  @Input() index: number;
                                      +
                                      +  /** The number of total items */
                                      +  @Input() count: number;
                                      +
                                      +  /** Gallery current index */
                                      +  @Input() currIndex: number;
                                      +
                                      +  /** Item's type 'image', 'video', 'youtube', 'iframe' */
                                      +  @Input() type: GalleryItemType;
                                      +
                                      +  /** Item's data, this object contains the data required to display the content (e.g. src path) */
                                      +  @Input() data: GalleryItemData;
                                      +
                                      +  /** Stream that emits when an error occurs */
                                      +  @Output() error: EventEmitter<ErrorEvent> = new EventEmitter<ErrorEvent>();
                                      +
                                      +  @HostBinding('class.g-active-item') get isActive(): boolean {
                                      +    return this.index === this.currIndex;
                                      +  }
                                      +
                                      +  @HostBinding('attr.galleryIndex') get isIndexAttr(): number {
                                      +    return this.index;
                                      +  }
                                      +
                                      +  @HostBinding('attr.itemState') get itemState(): ItemState {
                                      +    return this.state$.value;
                                      +  }
                                      +
                                      +  get imageContext(): GalleryItemContext<ImageItemData> {
                                      +    return {
                                      +      $implicit: this.imageData,
                                      +      index: this.index,
                                      +      type: this.type,
                                      +      active: this.isActive,
                                      +      count: this.count,
                                      +      first: this.index === 0,
                                      +      last: this.index === this.count - 1
                                      +    };
                                      +  }
                                      +
                                      +  get itemContext(): GalleryItemContext<GalleryItemData> {
                                      +    return {
                                      +      $implicit: this.data,
                                      +      index: this.index,
                                      +      type: this.type,
                                      +      active: this.isActive,
                                      +      count: this.count,
                                      +      first: this.index === 0,
                                      +      last: this.index === this.count - 1
                                      +    };
                                      +  }
                                      +
                                      +  get nativeElement(): HTMLElement {
                                      +    return this.el.nativeElement;
                                      +  }
                                      +
                                      +  get isAutoPlay(): boolean {
                                      +    if (this.isActive) {
                                      +      if (this.type === GalleryItemTypes.Video || this.type === GalleryItemTypes.Youtube) {
                                      +        return this.videoData.autoplay;
                                      +      }
                                      +    }
                                      +  }
                                      +
                                      +  get youtubeSrc(): string {
                                      +    let autoplay: 1 | 0 = 0;
                                      +    if (this.isActive && this.type === GalleryItemTypes.Youtube && (this.data as YoutubeItemData).autoplay) {
                                      +      autoplay = 1;
                                      +    }
                                      +    const url: URL = new URL(this.data.src as string);
                                      +    url.search = new URLSearchParams({
                                      +      wmode: 'transparent',
                                      +      ...(this.data as YoutubeItemData).params,
                                      +      autoplay
                                      +    }).toString();
                                      +    return url.href;
                                      +  }
                                      +
                                      +  get load(): boolean {
                                      +    switch (this.config.loadingStrategy) {
                                      +      case LoadingStrategy.Preload:
                                      +        return true;
                                      +      case LoadingStrategy.Lazy:
                                      +        return this.currIndex === this.index;
                                      +      default:
                                      +        return this.currIndex === this.index || this.currIndex === this.index - 1 || this.currIndex === this.index + 1;
                                      +    }
                                      +  }
                                      +
                                      +  get imageData(): ImageItemData {
                                      +    return this.data;
                                      +  }
                                      +
                                      +  get videoData(): VideoItemData {
                                      +    return this.data;
                                      +  }
                                      +
                                      +  constructor(private el: ElementRef) {
                                      +  }
                                      +
                                      +  ngAfterViewInit(): void {
                                      +    // If item does not contain an image, then set the state to DONE
                                      +    if (!this.isItemContainImage) {
                                      +      this.state$.next('success');
                                      +    }
                                      +  }
                                      +}
                                      +
                                      +
                                      +
                                      + + +
                                      +

                                      + ./gallery-item.scss +

                                      +
                                      :host {
                                      +  cursor: var(--g-item-cursor);
                                      +  height: var(--g-item-height);
                                      +  width: var(--g-item-width);
                                      +  max-height: var(--g-item-max-height);
                                      +  max-width: var(--slider-width);
                                      +  z-index: 10;
                                      +  position: relative;
                                      +  overflow: hidden;
                                      +  display: flex;
                                      +  flex-direction: column;
                                      +  flex: 0 0 auto;
                                      +  scroll-snap-align: center;
                                      +
                                      +  // Disable highlighting the elements on mouse move or click
                                      +  user-select: none;
                                      +  -webkit-user-drag: none;
                                      +  -webkit-tap-highlight-color: rgba(0, 0, 0, 0);
                                      +
                                      +  // In itemAutoSize is true, item size will be zero until it is loaded, fallback to the slider size
                                      +  &[itemState='loading'] {
                                      +    width: var(--slider-width);
                                      +    height: var(--slider-height);
                                      +  }
                                      +
                                      +  > * {
                                      +    height: 100%;
                                      +  }
                                      +
                                      +  ::ng-deep {
                                      +    video, iframe {
                                      +      width: 100%;
                                      +      height: 100%;
                                      +    }
                                      +  }
                                      +}
                                      +
                                      +gallery-image {
                                      +  width: var(--g-item-width);
                                      +  height: var(--g-item-height);
                                      +}
                                      +
                                      +.g-template {
                                      +  position: absolute;
                                      +  z-index: 10;
                                      +  left: 0;
                                      +  top: 0;
                                      +  right: 0;
                                      +  bottom: 0;
                                      +  color: white;
                                      +  display: flex;
                                      +  align-items: center;
                                      +  justify-content: center;
                                      +  flex-direction: column;
                                      +}
                                      +
                                      +
                                      + +
                                      +
                                      +
                                      +
                                      + Legend +
                                      +
                                      +
                                      Html element +
                                      +
                                      +
                                      Component +
                                      +
                                      +
                                      Html element with directive +
                                      +
                                      +
                                      + + +
                                      + + + + + + + + + + + + + + + + + + + + + + +
                                      +
                                      +

                                      results matching ""

                                      +
                                        +
                                        +
                                        +

                                        No results matching ""

                                        +
                                        +
                                        +
                                        + +
                                        +
                                        + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/documentation/components/GalleryNavComponent.html b/documentation/components/GalleryNavComponent.html new file mode 100644 index 00000000..71435d68 --- /dev/null +++ b/documentation/components/GalleryNavComponent.html @@ -0,0 +1,652 @@ + + + + + + ng-gallery-project documentation + + + + + + + + + + + + + +
                                        +
                                        + + +
                                        +
                                        + + + + + + + + +
                                        +

                                        +

                                        File

                                        +

                                        +

                                        + projects/ng-gallery/src/lib/components/gallery-nav.component.ts +

                                        + + + + +

                                        +

                                        Implements

                                        +

                                        +

                                        + OnInit +

                                        + + +
                                        +

                                        Metadata

                                        + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                        + +
                                        +

                                        Index

                                        + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                        +
                                        Properties
                                        +
                                        + +
                                        +
                                        Methods
                                        +
                                        + +
                                        +
                                        Inputs
                                        +
                                        + +
                                        +
                                        + +
                                        +

                                        Constructor

                                        + + + + + + + + + + + + + +
                                        +constructor(gallery: Gallery, _sanitizer: DomSanitizer) +
                                        + +
                                        +
                                        + Parameters : + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                        NameTypeOptional
                                        gallery + Gallery + + No +
                                        _sanitizer + DomSanitizer + + No +
                                        +
                                        +
                                        +
                                        + +
                                        +

                                        Inputs

                                        + + + + + + + + + + + + +
                                        + + config +
                                        + Type : GalleryConfig + +
                                        + +
                                        + + + + + + + + + + + + +
                                        + + galleryId +
                                        + Type : string + +
                                        + +
                                        + + + + + + + + + + + + +
                                        + + state +
                                        + Type : GalleryState + +
                                        + +
                                        +
                                        + + + +
                                        + +

                                        + Methods +

                                        + + + + + + + + + + + + + + + + + + + +
                                        + + + ngOnInit + + +
                                        +ngOnInit() +
                                        + +
                                        + +
                                        + Returns : void + +
                                        +
                                        +
                                        +
                                        + +

                                        + Properties +

                                        + + + + + + + + + + + + + + +
                                        + + + Public + gallery + + +
                                        + Type : Gallery + +
                                        + +
                                        + + + + + + + + + + + + + + +
                                        + + + navIcon + + +
                                        + Type : SafeHtml + +
                                        + +
                                        +
                                        + +
                                        + + +
                                        +
                                        import { Component, OnInit, Input, ChangeDetectionStrategy } from '@angular/core';
                                        +import { CommonModule } from '@angular/common';
                                        +import { DomSanitizer, SafeHtml } from '@angular/platform-browser';
                                        +import { Gallery } from '../services/gallery.service';
                                        +import { GalleryState } from '../models/gallery.model';
                                        +import { GalleryConfig } from '../models/config.model';
                                        +
                                        +@Component({
                                        +  selector: 'gallery-nav',
                                        +  changeDetection: ChangeDetectionStrategy.OnPush,
                                        +  styleUrls: ['./gallery-nav.scss'],
                                        +  template: `
                                        +    <i *ngIf="config.loop || state.hasPrev"
                                        +       class="g-nav-prev"
                                        +       aria-label="Previous"
                                        +       role="button"
                                        +       (click)="gallery.ref(this.galleryId).prev(config.navScrollBehavior)"
                                        +       [innerHtml]="navIcon"></i>
                                        +
                                        +    <i *ngIf="config.loop || state.hasNext"
                                        +       class="g-nav-next"
                                        +       aria-label="Next"
                                        +       role="button"
                                        +       (click)="gallery.ref(this.galleryId).next(config.navScrollBehavior)"
                                        +       [innerHtml]="navIcon"></i>
                                        +  `,
                                        +  standalone: true,
                                        +  imports: [CommonModule]
                                        +})
                                        +export class GalleryNavComponent implements OnInit {
                                        +
                                        +  navIcon: SafeHtml;
                                        +  @Input() galleryId: string;
                                        +  @Input() state: GalleryState;
                                        +  @Input() config: GalleryConfig;
                                        +
                                        +  constructor(public gallery: Gallery, private _sanitizer: DomSanitizer) {
                                        +  }
                                        +
                                        +  ngOnInit() {
                                        +    this.navIcon = this._sanitizer.bypassSecurityTrustHtml(this.config.navIcon);
                                        +  }
                                        +}
                                        +
                                        +
                                        + + +
                                        +

                                        + ./gallery-nav.scss +

                                        +
                                        .g-nav-next,
                                        +.g-nav-prev {
                                        +  position: absolute;
                                        +  top: 50%;
                                        +  display: flex;
                                        +  padding: 16px 8px;
                                        +  cursor: pointer;
                                        +  z-index: 999;
                                        +  opacity: 0.6;
                                        +  transition: opacity linear 150ms, right linear 150ms, left linear 150ms;
                                        +
                                        +  &:hover {
                                        +    opacity: 1;
                                        +  }
                                        +
                                        +  ::ng-deep {
                                        +    svg {
                                        +      filter: var(--g-nav-drop-shadow);
                                        +      width: 28px;
                                        +      height: 28px;
                                        +      fill: #fff;
                                        +    }
                                        +  }
                                        +}
                                        +
                                        +.g-nav-next {
                                        +  right: 0.5em;
                                        +  transform: translateY(-50%) perspective(1px);
                                        +
                                        +  &:hover {
                                        +    right: 0.4em;
                                        +  }
                                        +}
                                        +
                                        +.g-nav-prev {
                                        +  left: 0.5em;
                                        +  transform: translateY(-50%) perspective(1px) scale(-1, -1); //invert icon horizontally
                                        +
                                        +  &:hover {
                                        +    left: 0.4em;
                                        +  }
                                        +}
                                        +
                                        +@media only screen and (max-width: 480px) {
                                        +  .g-nav-next {
                                        +    right: 0.2em;
                                        +  }
                                        +
                                        +  .g-nav-prev {
                                        +    left: 0.2em;
                                        +  }
                                        +}
                                        +
                                        +
                                        + +
                                        +
                                        +
                                        +
                                        + Legend +
                                        +
                                        +
                                        Html element +
                                        +
                                        +
                                        Component +
                                        +
                                        +
                                        Html element with directive +
                                        +
                                        +
                                        + + +
                                        + + + + + + + + + + + + + + + + + + + + + + +
                                        +
                                        +

                                        results matching ""

                                        +
                                          +
                                          +
                                          +

                                          No results matching ""

                                          +
                                          +
                                          +
                                          + +
                                          +
                                          + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/documentation/components/GallerySliderComponent.html b/documentation/components/GallerySliderComponent.html new file mode 100644 index 00000000..6ff009dc --- /dev/null +++ b/documentation/components/GallerySliderComponent.html @@ -0,0 +1,1494 @@ + + + + + + ng-gallery-project documentation + + + + + + + + + + + + + +
                                          +
                                          + + +
                                          +
                                          + + + + + + + + +
                                          +

                                          +

                                          File

                                          +

                                          +

                                          + projects/ng-gallery/src/lib/components/gallery-slider.component.ts +

                                          + + + + +

                                          +

                                          Implements

                                          +

                                          +

                                          + AfterViewInit + OnChanges +

                                          + + +
                                          +

                                          Metadata

                                          + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                          + +
                                          +

                                          Index

                                          + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                          +
                                          Properties
                                          +
                                          + +
                                          +
                                          Methods
                                          +
                                          + +
                                          +
                                          Inputs
                                          +
                                          + +
                                          +
                                          Outputs
                                          +
                                          + +
                                          +
                                          Accessors
                                          +
                                          + +
                                          +
                                          + +
                                          +

                                          Constructor

                                          + + + + + + + + + + + + + +
                                          +constructor(_gallery: Gallery) +
                                          + +
                                          +
                                          + Parameters : + + + + + + + + + + + + + + + + + + +
                                          NameTypeOptional
                                          _gallery + Gallery + + No +
                                          +
                                          +
                                          +
                                          + +
                                          +

                                          Inputs

                                          + + + + + + + + + + + + + + + +
                                          + + config +
                                          + Type : GalleryConfig + +
                                          + +
                                          +

                                          Gallery config

                                          +
                                          +
                                          + + + + + + + + + + + + + + + +
                                          + + galleryId +
                                          + Type : string + +
                                          + +
                                          +

                                          Gallery ID

                                          +
                                          +
                                          + + + + + + + + + + + + + + + +
                                          + + state +
                                          + Type : GalleryState + +
                                          + +
                                          +

                                          Gallery state

                                          +
                                          +
                                          +
                                          +
                                          +

                                          Outputs

                                          + + + + + + + + + + + + + + + +
                                          + + error +
                                          + Type : EventEmitter<GalleryError> + +
                                          + +
                                          +

                                          Stream that emits when an error occurs

                                          +
                                          +
                                          + + + + + + + + + + + + + + + +
                                          + + itemClick +
                                          + Type : EventEmitter<number> + +
                                          + +
                                          +

                                          Stream that emits when item is clicked

                                          +
                                          +
                                          +
                                          + + +
                                          + +

                                          + Methods +

                                          + + + + + + + + + + + + + + + + + + + +
                                          + + + ngAfterViewInit + + +
                                          +ngAfterViewInit() +
                                          + +
                                          + +
                                          + Returns : void + +
                                          +
                                          + + + + + + + + + + + + + + + + + + + +
                                          + + + ngOnChanges + + +
                                          +ngOnChanges(changes: SimpleChanges) +
                                          + +
                                          + +
                                          + Parameters : + + + + + + + + + + + + + + + + + + + +
                                          NameTypeOptional
                                          changes + SimpleChanges + + No +
                                          +
                                          +
                                          +
                                          +
                                          + Returns : void + +
                                          +
                                          + +
                                          +
                                          + + + + + + + + + + + + + + + + + + + +
                                          + + + onActiveIndexChange + + +
                                          +onActiveIndexChange(index: number) +
                                          + +
                                          + +
                                          + Parameters : + + + + + + + + + + + + + + + + + + + +
                                          NameTypeOptional
                                          index + number + + No +
                                          +
                                          +
                                          +
                                          +
                                          + Returns : void + +
                                          +
                                          + +
                                          +
                                          + + + + + + + + + + + + + + + + + + + +
                                          + + + Private + scrollToIndex + + +
                                          + + scrollToIndex(index: number, behavior: ScrollBehavior) +
                                          + +
                                          + +
                                          + Parameters : + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                          NameTypeOptional
                                          index + number + + No +
                                          behavior + ScrollBehavior + + No +
                                          +
                                          +
                                          +
                                          +
                                          + Returns : void + +
                                          +
                                          + +
                                          +
                                          + + + + + + + + + + + + + + + + + + + +
                                          + + + trackByFn + + +
                                          +trackByFn(index: number, item: any) +
                                          + +
                                          + +
                                          + Parameters : + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                          NameTypeOptional
                                          index + number + + No +
                                          item + any + + No +
                                          +
                                          +
                                          +
                                          +
                                          + Returns : any + +
                                          +
                                          + +
                                          +
                                          +
                                          +
                                          + +

                                          + Properties +

                                          + + + + + + + + + + + + + + + + + +
                                          + + + adapter + + +
                                          + Type : SliderAdapter + +
                                          + +
                                          +

                                          Slider adapter

                                          +
                                          +
                                          + + + + + + + + + + + + + + +
                                          + + + isResizing + + +
                                          + Type : boolean + +
                                          + +
                                          + + + + + + + + + + + + + + +
                                          + + + isScrolling + + +
                                          + Type : boolean + +
                                          + +
                                          + + + + + + + + + + + + + + +
                                          + + + isSliding + + +
                                          + Type : boolean + +
                                          + +
                                          + + + + + + + + + + + + + + + + + + + + +
                                          + + + items + + +
                                          + Type : QueryList<GalleryItemComponent> + +
                                          + Default value : new QueryList<GalleryItemComponent>() +
                                          + Decorators : +
                                          + + @ViewChildren(GalleryItemComponent)
                                          +
                                          +
                                          + +
                                          + + + + + + + + + + + + + + + + + +
                                          + + + items$ + + +
                                          + Type : Observable<GalleryItemComponent[]> + +
                                          + +
                                          +

                                          Stream that emits the item components once they're initialized

                                          +
                                          +
                                          + + + + + + + + + + + + + + + + + + + + +
                                          + + + Readonly + position$ + + +
                                          + Type : Subject<SmoothScrollToOptions> + +
                                          + Default value : new Subject<SmoothScrollToOptions>() +
                                          + +
                                          +

                                          Stream that emits the slider position

                                          +
                                          +
                                          + + + + + + + + + + + + + + + + + + + + +
                                          + + + sliderEl + + +
                                          + Type : ElementRef<HTMLElement> + +
                                          + Decorators : +
                                          + + @ViewChild('slider', {static: true})
                                          +
                                          +
                                          + +
                                          +

                                          Slider ElementRef

                                          +
                                          +
                                          +
                                          + +
                                          +

                                          + Accessors +

                                          + + + + + + + + + + + + + + +
                                          + + slider +
                                          + getslider() +
                                          + +
                                          +
                                          +
                                          + + +
                                          +
                                          import {
                                          +  Component,
                                          +  Input,
                                          +  Output,
                                          +  ViewChild,
                                          +  ViewChildren,
                                          +  EventEmitter,
                                          +  AfterViewInit,
                                          +  OnChanges,
                                          +  SimpleChanges,
                                          +  ElementRef,
                                          +  QueryList,
                                          +  ChangeDetectionStrategy
                                          +} from '@angular/core';
                                          +import { CommonModule } from '@angular/common';
                                          +import { Observable, Subject, map, startWith } from 'rxjs';
                                          +import { Gallery } from '../services/gallery.service';
                                          +import { GalleryState, GalleryError } from '../models/gallery.model';
                                          +import { GalleryConfig } from '../models/config.model';
                                          +import { SlidingDirection } from '../models/constants';
                                          +import { SliderAdapter, HorizontalAdapter, VerticalAdapter } from './adapters';
                                          +import { SmoothScroll, SmoothScrollToOptions } from '../smooth-scroll';
                                          +import { HammerSliding } from '../gestures/hammer-sliding.directive';
                                          +import { SliderIntersectionObserver } from '../observers/slider-intersection-observer.directive';
                                          +import { ItemIntersectionObserver } from '../observers/item-intersection-observer.directive';
                                          +import { GalleryItemComponent } from './gallery-item.component';
                                          +import { SliderResizeObserver } from '../observers/slider-resize-observer.directive';
                                          +
                                          +@Component({
                                          +  selector: 'gallery-slider',
                                          +  changeDetection: ChangeDetectionStrategy.OnPush,
                                          +  styleUrls: ['./gallery-slider.scss'],
                                          +  template: `
                                          +    <div #slider
                                          +         class="g-slider"
                                          +         [attr.centralised]="config.itemAutosize"
                                          +         [smoothScroll]="position$ | async"
                                          +         [smoothScrollInterruptOnMousemove]="!config.mouseSlidingDisabled"
                                          +         sliderIntersectionObserver
                                          +         [sliderIntersectionObserverDisabled]="isScrolling || isSliding || isResizing"
                                          +         hammerSliding
                                          +         [adapter]="adapter"
                                          +         [items]="items$ | async"
                                          +         [config]="config"
                                          +         [state]="state"
                                          +         [galleryId]="galleryId"
                                          +         (isScrollingChange)="isScrolling = $event"
                                          +         (isSlidingChange)="isSliding = $event"
                                          +         (activeIndexChange)="onActiveIndexChange($event)"
                                          +         (isResizingChange)="isResizing = $event"
                                          +         sliderResizeObserver>
                                          +      <div class="g-slider-content">
                                          +        <gallery-item *ngFor="let item of state.items; trackBy: trackByFn index as i"
                                          +                      [attr.galleryId]="galleryId"
                                          +                      [type]="item.type"
                                          +                      [config]="config"
                                          +                      [data]="item.data"
                                          +                      [currIndex]="state.currIndex"
                                          +                      [index]="i"
                                          +                      [count]="state.items.length"
                                          +                      itemIntersectionObserver
                                          +                      [itemIntersectionObserverDisabled]="isScrolling || isSliding || isResizing"
                                          +                      [adapter]="adapter"
                                          +                      (activeIndexChange)="onActiveIndexChange($event)"
                                          +                      (click)="itemClick.emit(i)"
                                          +                      (error)="error.emit({ itemIndex: i, error: $event })"/>
                                          +      </div>
                                          +
                                          +      <div *ngIf="config.debug" class="g-slider-debug">
                                          +        <div class="g-slider-resizing">RESIZING</div>
                                          +        <div class="g-slider-scrolling">SCROLLING</div>
                                          +        <div class="g-slider-sliding">SLIDING</div>
                                          +      </div>
                                          +    </div>
                                          +    <ng-content></ng-content>
                                          +  `,
                                          +  standalone: true,
                                          +  imports: [CommonModule, GalleryItemComponent, SmoothScroll, HammerSliding, SliderIntersectionObserver, ItemIntersectionObserver, SliderResizeObserver]
                                          +})
                                          +export class GallerySliderComponent implements AfterViewInit, OnChanges {
                                          +
                                          +  /** Stream that emits the slider position */
                                          +  readonly position$: Subject<SmoothScrollToOptions> = new Subject<SmoothScrollToOptions>();
                                          +
                                          +  /** Slider adapter */
                                          +  adapter: SliderAdapter;
                                          +
                                          +  /** Stream that emits the item components once they're initialized */
                                          +  items$: Observable<GalleryItemComponent[]>;
                                          +
                                          +  isScrolling: boolean;
                                          +
                                          +  isSliding: boolean;
                                          +
                                          +  isResizing: boolean;
                                          +
                                          +  /** Gallery ID */
                                          +  @Input() galleryId: string;
                                          +
                                          +  /** Gallery state */
                                          +  @Input() state: GalleryState;
                                          +
                                          +  /** Gallery config */
                                          +  @Input() config: GalleryConfig;
                                          +
                                          +  /** Stream that emits when item is clicked */
                                          +  @Output() itemClick: EventEmitter<number> = new EventEmitter<number>();
                                          +
                                          +  /** Stream that emits when an error occurs */
                                          +  @Output() error: EventEmitter<GalleryError> = new EventEmitter<GalleryError>();
                                          +
                                          +  /** Slider ElementRef */
                                          +  @ViewChild('slider', { static: true }) sliderEl: ElementRef<HTMLElement>;
                                          +
                                          +  @ViewChildren(GalleryItemComponent) items: QueryList<GalleryItemComponent> = new QueryList<GalleryItemComponent>();
                                          +
                                          +  get slider(): HTMLElement {
                                          +    return this.sliderEl.nativeElement;
                                          +  }
                                          +
                                          +  constructor(private _gallery: Gallery) {
                                          +  }
                                          +
                                          +  ngOnChanges(changes: SimpleChanges): void {
                                          +    if (changes.config) {
                                          +      if (changes.config.currentValue?.slidingDirection !== changes.config.previousValue?.slidingDirection) {
                                          +        switch (this.config.slidingDirection) {
                                          +          case SlidingDirection.Horizontal:
                                          +            this.adapter = new HorizontalAdapter(this.slider, this.config);
                                          +            break;
                                          +          case SlidingDirection.Vertical:
                                          +            this.adapter = new VerticalAdapter(this.slider, this.config);
                                          +            break;
                                          +        }
                                          +      }
                                          +      if (!changes.config.firstChange) {
                                          +        // Keep the correct sliding position when direction changes
                                          +        requestAnimationFrame(() => {
                                          +          this.scrollToIndex(this.state.currIndex, 'auto');
                                          +        });
                                          +      }
                                          +    }
                                          +
                                          +    // Scroll to current index
                                          +    if (changes.state) {
                                          +      if(changes.state.currentValue?.currIndex !== changes.state.previousValue?.currIndex) {
                                          +        requestAnimationFrame(() => {
                                          +          this.scrollToIndex(this.state.currIndex, changes.state.firstChange ? 'auto' : this.state.behavior);
                                          +        });
                                          +      }
                                          +    }
                                          +  }
                                          +
                                          +  ngAfterViewInit(): void {
                                          +    this.items.notifyOnChanges();
                                          +    this.items$ = this.items.changes.pipe(
                                          +      // In some cases, items is not notified at first, need to force start the stream
                                          +      startWith(null),
                                          +      map(() => this.items.toArray())
                                          +    );
                                          +  }
                                          +
                                          +  trackByFn(index: number, item: any) {
                                          +    return item.type;
                                          +  }
                                          +
                                          +  onActiveIndexChange(index: number): void {
                                          +    if (index === -1) {
                                          +      // Reset active index position
                                          +      this.scrollToIndex(this.state.currIndex, 'smooth');
                                          +    } else {
                                          +      this._gallery.ref(this.galleryId).set(index, 'smooth');
                                          +    }
                                          +  }
                                          +
                                          +  private scrollToIndex(index: number, behavior: ScrollBehavior): void {
                                          +    const el: HTMLElement = this.items.get(index)?.nativeElement;
                                          +    if (el) {
                                          +      console.log('🟢 Scroll to', index)
                                          +      const pos: SmoothScrollToOptions = this.adapter.getScrollToValue(el, behavior || this.config.scrollBehavior);
                                          +      this.position$.next(pos);
                                          +    }
                                          +  }
                                          +}
                                          +
                                          +
                                          + + +
                                          +

                                          + ./gallery-slider.scss +

                                          +
                                          :host {
                                          +  position: relative;
                                          +  display: flex;
                                          +  align-items: center;
                                          +  justify-content: center;
                                          +  overflow: hidden;
                                          +  order: 1;
                                          +  flex: 1;
                                          +}
                                          +
                                          +.g-slider {
                                          +  display: flex;
                                          +  align-items: center;
                                          +  transition: var(--g-height-transition);
                                          +  min-height: 100%;
                                          +  min-width: 100%;
                                          +  max-height: 100%;
                                          +  max-width: 100%;
                                          +  height: var(--slider-height, 100%);
                                          +  width: var(--slider-width, 100%);
                                          +
                                          +  overflow: var(--slider-overflow);
                                          +  scroll-snap-type: var(--slider-scroll-snap-type);
                                          +  flex-direction: var(--slider-flex-direction);
                                          +
                                          +  scrollbar-width: none;
                                          +
                                          +  &::-webkit-scrollbar {
                                          +    display: none;
                                          +  }
                                          +
                                          +  &.g-sliding, &.g-scrolling {
                                          +    // Disable mouse click on gallery items/thumbnails when the slider is being dragged using the mouse
                                          +    .g-slider-content {
                                          +      pointer-events: none;
                                          +    }
                                          +  }
                                          +
                                          +  &[centralised="true"] {
                                          +    &:before, &:after {
                                          +      content: '';
                                          +    }
                                          +
                                          +    &:before {
                                          +      flex: 0 0 var(--slider-centralize-start-size);
                                          +    }
                                          +
                                          +    &:after {
                                          +      flex: 0 0 var(--slider-centralize-end-size);
                                          +    }
                                          +  }
                                          +}
                                          +
                                          +.g-slider-content {
                                          +  flex: 0 0 auto;
                                          +  display: flex;
                                          +  align-items: center;
                                          +  gap: 1px;
                                          +  width: var(--slider-content-width, unset);
                                          +  height: var(--slider-content-height, unset);
                                          +  flex-direction: var(--slider-flex-direction);
                                          +}
                                          +
                                          +
                                          + +
                                          +
                                          +
                                          +
                                          + Legend +
                                          +
                                          +
                                          Html element +
                                          +
                                          +
                                          Component +
                                          +
                                          +
                                          Html element with directive +
                                          +
                                          +
                                          + + +
                                          + + + + + + + + + + + + + + + + + + + + + + +
                                          +
                                          +

                                          results matching ""

                                          +
                                            +
                                            +
                                            +

                                            No results matching ""

                                            +
                                            +
                                            +
                                            + +
                                            +
                                            + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/documentation/components/GalleryThumbComponent.html b/documentation/components/GalleryThumbComponent.html new file mode 100644 index 00000000..7243fad0 --- /dev/null +++ b/documentation/components/GalleryThumbComponent.html @@ -0,0 +1,851 @@ + + + + + + ng-gallery-project documentation + + + + + + + + + + + + + +
                                            +
                                            + + +
                                            +
                                            + + + + + + + + +
                                            +

                                            +

                                            File

                                            +

                                            +

                                            + projects/ng-gallery/src/lib/components/gallery-thumb.component.ts +

                                            + + + + + + +
                                            +

                                            Metadata

                                            + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                            + +
                                            +

                                            Index

                                            + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                            +
                                            Inputs
                                            +
                                            + +
                                            +
                                            Outputs
                                            +
                                            + +
                                            +
                                            HostBindings
                                            +
                                            + +
                                            +
                                            Accessors
                                            +
                                            + +
                                            +
                                            + +
                                            +

                                            Constructor

                                            + + + + + + + + + + + + + +
                                            +constructor(el: ElementRef) +
                                            + +
                                            +
                                            + Parameters : + + + + + + + + + + + + + + + + + + +
                                            NameTypeOptional
                                            el + ElementRef<HTMLElement> + + No +
                                            +
                                            +
                                            +
                                            + +
                                            +

                                            Inputs

                                            + + + + + + + + + + + + +
                                            + + config +
                                            + Type : GalleryConfig + +
                                            + +
                                            + + + + + + + + + + + + + + + +
                                            + + count +
                                            + Type : number + +
                                            + +
                                            +

                                            The number of total items

                                            +
                                            +
                                            + + + + + + + + + + + + + + + +
                                            + + currIndex +
                                            + Type : number + +
                                            + +
                                            +

                                            Gallery current index

                                            +
                                            +
                                            + + + + + + + + + + + + + + + +
                                            + + data +
                                            + Type : ImageItemData + +
                                            + +
                                            +

                                            Item's data, this object contains the data required to display the content (e.g. src path)

                                            +
                                            +
                                            + + + + + + + + + + + + + + + +
                                            + + index +
                                            + Type : number + +
                                            + +
                                            +

                                            Item's index in the gallery

                                            +
                                            +
                                            + + + + + + + + + + + + + + + +
                                            + + type +
                                            + Type : GalleryItemType + +
                                            + +
                                            +

                                            Item's type 'image', 'video', 'youtube', 'iframe'

                                            +
                                            +
                                            +
                                            +
                                            +

                                            Outputs

                                            + + + + + + + + + + + + +
                                            + + error +
                                            + Type : EventEmitter<ErrorEvent> + +
                                            + +
                                            +
                                            +
                                            +

                                            HostBindings

                                            + + + + + + + + + + + + + +
                                            + + + attr.galleryIndex + + +
                                            + Type : number + +
                                            + +
                                            + + + + + + + + + + + + + + +
                                            + + + class.g-active-thumb + + +
                                            + Type : boolean + +
                                            + +
                                            +
                                            + + + + +
                                            +

                                            + Accessors +

                                            + + + + + + + + + + + + + + +
                                            + + isActive +
                                            + getisActive() +
                                            + +
                                            + + + + + + + + + + + + + + +
                                            + + isIndexAttr +
                                            + getisIndexAttr() +
                                            + +
                                            + + + + + + + + + + + + + + +
                                            + + imageContext +
                                            + getimageContext() +
                                            + +
                                            + + + + + + + + + + + + + + +
                                            + + nativeElement +
                                            + getnativeElement() +
                                            + +
                                            +
                                            +
                                            + + +
                                            +
                                            import {
                                            +  Component,
                                            +  Input,
                                            +  Output,
                                            +  HostBinding,
                                            +  EventEmitter,
                                            +  ElementRef,
                                            +  ChangeDetectionStrategy
                                            +} from '@angular/core';
                                            +import { CommonModule } from '@angular/common';
                                            +import { GalleryItemContext } from '../directives/gallery-item-def.directive';
                                            +import { GalleryImageComponent } from './templates/gallery-image.component';
                                            +import { ImageItemData } from './templates/items.model';
                                            +import { GalleryConfig } from '../models/config.model';
                                            +import { GalleryItemType } from '../models/constants';
                                            +
                                            +@Component({
                                            +  selector: 'gallery-thumb',
                                            +  changeDetection: ChangeDetectionStrategy.OnPush,
                                            +  styleUrls: ['./gallery-thumb.scss'],
                                            +  template: `
                                            +    <gallery-image [src]="data.thumb"
                                            +                   [alt]="data.alt + '-thumbnail'"
                                            +                   [isThumbnail]="true"
                                            +                   [loadingIcon]="config.thumbLoadingIcon"
                                            +                   [loadingError]="config.thumbLoadingError"
                                            +                   (error)="error.emit($event)"></gallery-image>
                                            +
                                            +    <div *ngIf="config.thumbTemplate" class="g-template g-thumb-template">
                                            +      <ng-container *ngTemplateOutlet="config.thumbTemplate; context: imageContext"></ng-container>
                                            +    </div>
                                            +  `,
                                            +  standalone: true,
                                            +  imports: [CommonModule, GalleryImageComponent]
                                            +})
                                            +export class GalleryThumbComponent {
                                            +
                                            +  @Input() config: GalleryConfig;
                                            +
                                            +  /** Item's index in the gallery */
                                            +  @Input() index: number;
                                            +
                                            +  /** The number of total items */
                                            +  @Input() count: number;
                                            +
                                            +  /** Gallery current index */
                                            +  @Input() currIndex: number;
                                            +
                                            +  /** Item's type 'image', 'video', 'youtube', 'iframe' */
                                            +  @Input() type: GalleryItemType;
                                            +
                                            +  /** Item's data, this object contains the data required to display the content (e.g. src path) */
                                            +  @Input() data: ImageItemData;
                                            +
                                            +  @Output() error: EventEmitter<ErrorEvent> = new EventEmitter<ErrorEvent>();
                                            +
                                            +  @HostBinding('class.g-active-thumb') get isActive() {
                                            +    return this.index === this.currIndex;
                                            +  }
                                            +
                                            +  @HostBinding('attr.galleryIndex') get isIndexAttr(): number {
                                            +    return this.index;
                                            +  }
                                            +
                                            +  get imageContext(): GalleryItemContext<ImageItemData> {
                                            +    return {
                                            +      $implicit: this.data,
                                            +      index: this.index,
                                            +      type: this.type,
                                            +      active: this.isActive,
                                            +      count: this.count,
                                            +      first: this.index === 0,
                                            +      last: this.index === this.count - 1
                                            +    }
                                            +  }
                                            +
                                            +  get nativeElement(): HTMLElement {
                                            +    return this.el.nativeElement;
                                            +  }
                                            +
                                            +  constructor(private el: ElementRef<HTMLElement>) {
                                            +  }
                                            +}
                                            +
                                            +
                                            + + +
                                            +

                                            + ./gallery-thumb.scss +

                                            +
                                            :host {
                                            +  cursor: var(--g-thumb-cursor);
                                            +  height: var(--g-thumb-height);
                                            +  width: var(--g-thumb-width);
                                            +  max-height: var(--g-thumb-height);
                                            +  max-width: var(--g-thumb-width);
                                            +  align-self: center;
                                            +  background: black;
                                            +  position: relative;
                                            +  display: flex;
                                            +  overflow: hidden;
                                            +  flex-direction: column;
                                            +  flex: 0 0 auto;
                                            +  scroll-snap-align: center;
                                            +  // Disable highlighting the elements on mouse move or click
                                            +  user-select: none;
                                            +  -webkit-user-drag: none;
                                            +  -webkit-tap-highlight-color: rgba(0, 0, 0, 0);
                                            +
                                            +  --g-thumb-opacity: 0.5;
                                            +
                                            +  &.g-active-thumb {
                                            +    --g-thumb-opacity: 1;
                                            +  }
                                            +}
                                            +
                                            +.g-template {
                                            +  position: absolute;
                                            +  z-index: 10;
                                            +  left: 0;
                                            +  top: 0;
                                            +  right: 0;
                                            +  bottom: 0;
                                            +  color: white;
                                            +  display: flex;
                                            +  align-items: center;
                                            +  justify-content: center;
                                            +  flex-direction: column;
                                            +}
                                            +
                                            +
                                            + +
                                            +
                                            +
                                            +
                                            + Legend +
                                            +
                                            +
                                            Html element +
                                            +
                                            +
                                            Component +
                                            +
                                            +
                                            Html element with directive +
                                            +
                                            +
                                            + + +
                                            + + + + + + + + + + + + + + + + + + + + + + +
                                            +
                                            +

                                            results matching ""

                                            +
                                              +
                                              +
                                              +

                                              No results matching ""

                                              +
                                              +
                                              +
                                              + +
                                              +
                                              + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/documentation/components/GalleryThumbsComponent.html b/documentation/components/GalleryThumbsComponent.html new file mode 100644 index 00000000..c67ec37c --- /dev/null +++ b/documentation/components/GalleryThumbsComponent.html @@ -0,0 +1,1350 @@ + + + + + + ng-gallery-project documentation + + + + + + + + + + + + + +
                                              +
                                              + + +
                                              +
                                              + + + + + + + + +
                                              +

                                              +

                                              File

                                              +

                                              +

                                              + projects/ng-gallery/src/lib/components/gallery-thumbs.component.ts +

                                              + + + + +

                                              +

                                              Implements

                                              +

                                              +

                                              + AfterViewInit + OnChanges +

                                              + + +
                                              +

                                              Metadata

                                              + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                              + +
                                              +

                                              Index

                                              + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                              +
                                              Properties
                                              +
                                              + +
                                              +
                                              Methods
                                              +
                                              + +
                                              +
                                              Inputs
                                              +
                                              + +
                                              +
                                              Outputs
                                              +
                                              + +
                                              +
                                              Accessors
                                              +
                                              + +
                                              +
                                              + + +
                                              +

                                              Inputs

                                              + + + + + + + + + + + + + + + +
                                              + + config +
                                              + Type : GalleryConfig + +
                                              + +
                                              +

                                              Gallery config

                                              +
                                              +
                                              + + + + + + + + + + + + + + + +
                                              + + galleryId +
                                              + Type : string + +
                                              + +
                                              +

                                              Gallery ID

                                              +
                                              +
                                              + + + + + + + + + + + + + + + +
                                              + + state +
                                              + Type : GalleryState + +
                                              + +
                                              +

                                              Gallery state

                                              +
                                              +
                                              +
                                              +
                                              +

                                              Outputs

                                              + + + + + + + + + + + + + + + +
                                              + + error +
                                              + Type : EventEmitter<GalleryError> + +
                                              + +
                                              +

                                              Stream that emits when an error occurs

                                              +
                                              +
                                              + + + + + + + + + + + + + + + +
                                              + + thumbClick +
                                              + Type : EventEmitter<number> + +
                                              + +
                                              +

                                              Stream that emits when thumb is clicked

                                              +
                                              +
                                              +
                                              + + +
                                              + +

                                              + Methods +

                                              + + + + + + + + + + + + + + + + + + + +
                                              + + + ngAfterViewInit + + +
                                              +ngAfterViewInit() +
                                              + +
                                              + +
                                              + Returns : void + +
                                              +
                                              + + + + + + + + + + + + + + + + + + + +
                                              + + + ngOnChanges + + +
                                              +ngOnChanges(changes: SimpleChanges) +
                                              + +
                                              + +
                                              + Parameters : + + + + + + + + + + + + + + + + + + + +
                                              NameTypeOptional
                                              changes + SimpleChanges + + No +
                                              +
                                              +
                                              +
                                              +
                                              + Returns : void + +
                                              +
                                              + +
                                              +
                                              + + + + + + + + + + + + + + + + + + + +
                                              + + + onActiveIndexChange + + +
                                              +onActiveIndexChange(index: number) +
                                              + +
                                              + +
                                              + Parameters : + + + + + + + + + + + + + + + + + + + +
                                              NameTypeOptional
                                              index + number + + No +
                                              +
                                              +
                                              +
                                              +
                                              + Returns : void + +
                                              +
                                              + +
                                              +
                                              + + + + + + + + + + + + + + + + + + + +
                                              + + + scrollToIndex + + +
                                              +scrollToIndex(value: number, behavior: ScrollBehavior) +
                                              + +
                                              + +
                                              + Parameters : + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                              NameTypeOptional
                                              value + number + + No +
                                              behavior + ScrollBehavior + + No +
                                              +
                                              +
                                              +
                                              +
                                              + Returns : void + +
                                              +
                                              + +
                                              +
                                              + + + + + + + + + + + + + + + + + + + +
                                              + + + trackByFn + + +
                                              +trackByFn(index: number, item: any) +
                                              + +
                                              + +
                                              + Parameters : + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                              NameTypeOptional
                                              index + number + + No +
                                              item + any + + No +
                                              +
                                              +
                                              +
                                              +
                                              + Returns : any + +
                                              +
                                              + +
                                              +
                                              +
                                              +
                                              + +

                                              + Properties +

                                              + + + + + + + + + + + + + + + + + +
                                              + + + adapter + + +
                                              + Type : SliderAdapter + +
                                              + +
                                              +

                                              Slider adapter

                                              +
                                              +
                                              + + + + + + + + + + + + + + + + + + + + +
                                              + + + items + + +
                                              + Type : QueryList<GalleryThumbComponent> + +
                                              + Default value : new QueryList<GalleryThumbComponent>() +
                                              + Decorators : +
                                              + + @ViewChildren(GalleryThumbComponent)
                                              +
                                              +
                                              + +
                                              + + + + + + + + + + + + + + + + + +
                                              + + + items$ + + +
                                              + Type : Observable<GalleryThumbComponent[]> + +
                                              + +
                                              +

                                              Stream that emits the thumb components once they're initialized

                                              +
                                              +
                                              + + + + + + + + + + + + + + + + + + + + +
                                              + + + Readonly + position$ + + +
                                              + Type : Subject<SmoothScrollToOptions> + +
                                              + Default value : new Subject<SmoothScrollToOptions>() +
                                              + +
                                              +

                                              Stream that emits the slider position

                                              +
                                              +
                                              + + + + + + + + + + + + + + + + + + + + +
                                              + + + sliderEl + + +
                                              + Type : ElementRef + +
                                              + Decorators : +
                                              + + @ViewChild('slider', {static: true})
                                              +
                                              +
                                              + +
                                              +

                                              Slider ElementRef

                                              +
                                              +
                                              + + + + + + + + + + + + + + + + + +
                                              + + + Readonly + thumbnailsView + + +
                                              + Default value : ThumbnailsView +
                                              + +
                                              +

                                              Thumbnails view enum

                                              +
                                              +
                                              +
                                              + +
                                              +

                                              + Accessors +

                                              + + + + + + + + + + + + + + +
                                              + + slider +
                                              + getslider() +
                                              + +
                                              +
                                              +
                                              + + +
                                              +
                                              import {
                                              +  Component,
                                              +  Input,
                                              +  Output,
                                              +  ViewChild,
                                              +  ViewChildren,
                                              +  EventEmitter,
                                              +  AfterViewInit,
                                              +  OnChanges,
                                              +  QueryList,
                                              +  SimpleChanges,
                                              +  ElementRef,
                                              +  ChangeDetectionStrategy
                                              +} from '@angular/core';
                                              +import { CommonModule } from '@angular/common';
                                              +import { Observable, Subject, map, startWith } from 'rxjs';
                                              +import { GalleryConfig } from '../models/config.model';
                                              +import { GalleryState, GalleryError } from '../models/gallery.model';
                                              +import { ThumbnailsPosition, ThumbnailsView } from '../models/constants';
                                              +import { VerticalAdapter, HorizontalAdapter, SliderAdapter } from './adapters';
                                              +import { SmoothScroll, SmoothScrollToOptions } from '../smooth-scroll';
                                              +import { GalleryThumbComponent } from './gallery-thumb.component';
                                              +import { HammerSliding } from '../gestures/hammer-sliding.directive';
                                              +import { ThumbResizeObserver } from '../observers/thumb-resize-observer.directive';
                                              +
                                              +@Component({
                                              +  selector: 'gallery-thumbs',
                                              +  changeDetection: ChangeDetectionStrategy.OnPush,
                                              +  styleUrls: ['./gallery-thumbs.scss'],
                                              +  template: `
                                              +    <div #slider
                                              +         class="g-slider"
                                              +         [smoothScroll]="position$ | async"
                                              +         [smoothScrollInterruptOnMousemove]="!config.thumbMouseSlidingDisabled"
                                              +         [attr.centralised]="config.thumbView === thumbnailsView.Contain || adapter.isContentLessThanContainer"
                                              +         hammerSliding
                                              +         [galleryId]="galleryId"
                                              +         [items]="items$ | async"
                                              +         [state]="state"
                                              +         [config]="config"
                                              +         [adapter]="adapter"
                                              +         (thumbResizeObserver)="scrollToIndex(state.currIndex, 'auto')"
                                              +         (activeIndexChange)="onActiveIndexChange($event)">
                                              +      <div class="g-slider-content">
                                              +        <gallery-thumb *ngFor="let item of state.items; trackBy: trackByFn; index as i"
                                              +                       [attr.galleryId]="galleryId"
                                              +                       [type]="item.type"
                                              +                       [config]="config"
                                              +                       [data]="item.data"
                                              +                       [currIndex]="state.currIndex"
                                              +                       [index]="i"
                                              +                       [count]="state.items.length"
                                              +                       (click)="config.disableThumb ? null : thumbClick.emit(i)"
                                              +                       (error)="error.emit({ itemIndex: i, error: $event })"/>
                                              +      </div>
                                              +    </div>
                                              +  `,
                                              +  standalone: true,
                                              +  imports: [CommonModule, GalleryThumbComponent, SmoothScroll, HammerSliding, ThumbResizeObserver]
                                              +})
                                              +export class GalleryThumbsComponent implements AfterViewInit, OnChanges {
                                              +
                                              +  /** Stream that emits the slider position */
                                              +  readonly position$: Subject<SmoothScrollToOptions> = new Subject<SmoothScrollToOptions>();
                                              +
                                              +  /** Thumbnails view enum */
                                              +  readonly thumbnailsView = ThumbnailsView;
                                              +
                                              +  /** Slider adapter */
                                              +  adapter: SliderAdapter;
                                              +
                                              +  /** Stream that emits the thumb components once they're initialized */
                                              +  items$: Observable<GalleryThumbComponent[]>;
                                              +
                                              +  /** Gallery ID */
                                              +  @Input() galleryId: string;
                                              +
                                              +  /** Gallery state */
                                              +  @Input() state: GalleryState;
                                              +
                                              +  /** Gallery config */
                                              +  @Input() config: GalleryConfig;
                                              +
                                              +  /** Stream that emits when thumb is clicked */
                                              +  @Output() thumbClick: EventEmitter<number> = new EventEmitter<number>();
                                              +
                                              +  /** Stream that emits when an error occurs */
                                              +  @Output() error: EventEmitter<GalleryError> = new EventEmitter<GalleryError>();
                                              +
                                              +  /** Slider ElementRef */
                                              +  @ViewChild('slider', { static: true }) sliderEl: ElementRef;
                                              +
                                              +  @ViewChildren(GalleryThumbComponent) items: QueryList<GalleryThumbComponent> = new QueryList<GalleryThumbComponent>();
                                              +
                                              +  get slider(): HTMLElement {
                                              +    return this.sliderEl.nativeElement;
                                              +  }
                                              +
                                              +  ngOnChanges(changes: SimpleChanges): void {
                                              +    if (changes.config) {
                                              +      // Sets sliding direction
                                              +      if (changes.config.currentValue?.thumbPosition !== changes.config.previousValue?.thumbPosition) {
                                              +        switch (this.config.thumbPosition) {
                                              +          case ThumbnailsPosition.Right:
                                              +          case ThumbnailsPosition.Left:
                                              +            this.adapter = new VerticalAdapter(this.slider, this.config);
                                              +            break;
                                              +          case ThumbnailsPosition.Top:
                                              +          case ThumbnailsPosition.Bottom:
                                              +            this.adapter = new HorizontalAdapter(this.slider, this.config);
                                              +            break;
                                              +        }
                                              +
                                              +        if (!changes.config.firstChange) {
                                              +          // Keep the correct sliding position when direction changes
                                              +          requestAnimationFrame(() => {
                                              +            this.scrollToIndex(this.state.currIndex, 'auto');
                                              +          });
                                              +        }
                                              +      }
                                              +    }
                                              +
                                              +    if (changes.state && (changes.state.firstChange || !this.config.thumbDetached)) {
                                              +      if (changes.state.currentValue?.currIndex !== changes.state.previousValue?.currIndex) {
                                              +        // Scroll slide to item when current index changes.
                                              +        requestAnimationFrame(() => {
                                              +          this.scrollToIndex(this.state.currIndex, changes.state?.firstChange ? 'auto' : 'smooth');
                                              +        });
                                              +      }
                                              +    }
                                              +  }
                                              +
                                              +  ngAfterViewInit(): void {
                                              +    this.items.notifyOnChanges();
                                              +    this.items$ = this.items.changes.pipe(
                                              +      // In some cases, items is not notified at first, need to force start the stream
                                              +      startWith(null),
                                              +      map(() => this.items.toArray())
                                              +    );
                                              +  }
                                              +
                                              +  trackByFn(index: number, item: any) {
                                              +    return item.type;
                                              +  }
                                              +
                                              +  onActiveIndexChange(index: number): void {
                                              +    if (index === -1) {
                                              +      // Reset active index position
                                              +      this.scrollToIndex(this.state.currIndex, 'smooth');
                                              +    } else {
                                              +      this.scrollToIndex(index, 'smooth');
                                              +    }
                                              +  }
                                              +
                                              +  scrollToIndex(value: number, behavior: ScrollBehavior): void {
                                              +    const el: HTMLElement = this.items.get(value)?.nativeElement;
                                              +    if (el) {
                                              +      const pos: SmoothScrollToOptions = this.adapter.getScrollToValue(el, behavior);
                                              +      this.position$.next(pos);
                                              +    }
                                              +  }
                                              +}
                                              +
                                              +
                                              + + +
                                              +

                                              + ./gallery-thumbs.scss +

                                              +
                                              :host {
                                              +  max-height: 100%;
                                              +  max-width: 100%;
                                              +  display: block;
                                              +  z-index: 100;
                                              +}
                                              +
                                              +.g-slider {
                                              +  display: flex;
                                              +  align-items: center;
                                              +  transition: var(--g-height-transition);
                                              +  max-height: 100%;
                                              +  min-width: 100%;
                                              +  height: var(--thumb-slider-height);
                                              +  width: var(--thumb-slider-width);
                                              +
                                              +  top: var(--thumb-slider-top);
                                              +  left: var(--thumb-slider-left);
                                              +  overflow: var(--thumb-slider-overflow);
                                              +  scroll-snap-type: var(--slider-scroll-snap-type);
                                              +  flex-direction: var(--thumb-slider-flex-direction);
                                              +
                                              +  scrollbar-width: none;
                                              +
                                              +  &::-webkit-scrollbar {
                                              +    display: none;
                                              +  }
                                              +
                                              +  // Disable mouse click on gallery items/thumbnails when the slider is being dragged using the mouse
                                              +  &.g-sliding {
                                              +    // Disable mouse click on gallery items/thumbnails when the slider is being dragged using the mouse
                                              +    .g-slider-content {
                                              +      pointer-events: none;
                                              +    }
                                              +  }
                                              +
                                              +  &[centralised="true"] {
                                              +    &:before, &:after {
                                              +      content: '';
                                              +    }
                                              +
                                              +    &:before {
                                              +      flex: 0 0 var(--thumb-centralize-start-size);
                                              +    }
                                              +
                                              +    &:after {
                                              +      flex: 0 0 var(--thumb-centralize-end-size);
                                              +    }
                                              +  }
                                              +}
                                              +
                                              +.g-slider-content {
                                              +  flex: 0 0 auto;
                                              +  display: flex;
                                              +  flex-direction: var(--thumb-slider-flex-direction);
                                              +  align-items: center;
                                              +  gap: 1px;
                                              +}
                                              +
                                              +
                                              + +
                                              +
                                              +
                                              +
                                              + Legend +
                                              +
                                              +
                                              Html element +
                                              +
                                              +
                                              Component +
                                              +
                                              +
                                              Html element with directive +
                                              +
                                              +
                                              + + +
                                              + + + + + + + + + + + + + + + + + + + + + + +
                                              +
                                              +

                                              results matching ""

                                              +
                                                +
                                                +
                                                +

                                                No results matching ""

                                                +
                                                +
                                                +
                                                + +
                                                +
                                                + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/documentation/components/GalleryVideoComponent.html b/documentation/components/GalleryVideoComponent.html new file mode 100644 index 00000000..6e7ef525 --- /dev/null +++ b/documentation/components/GalleryVideoComponent.html @@ -0,0 +1,917 @@ + + + + + + ng-gallery-project documentation + + + + + + + + + + + + + +
                                                +
                                                + + +
                                                +
                                                + + + + + + + + +
                                                +

                                                +

                                                File

                                                +

                                                +

                                                + projects/ng-gallery/src/lib/components/templates/gallery-video.component.ts +

                                                + + + + +

                                                +

                                                Implements

                                                +

                                                +

                                                + OnInit +

                                                + + +
                                                +

                                                Metadata

                                                + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                                + +
                                                +

                                                Index

                                                + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                                +
                                                Properties
                                                +
                                                + +
                                                +
                                                Methods
                                                +
                                                + +
                                                +
                                                Inputs
                                                +
                                                + +
                                                +
                                                Outputs
                                                +
                                                + +
                                                +
                                                Accessors
                                                +
                                                + +
                                                +
                                                + + +
                                                +

                                                Inputs

                                                + + + + + + + + + + + + +
                                                + + controls +
                                                + Type : boolean + +
                                                + +
                                                + + + + + + + + + + + + +
                                                + + controlsList +
                                                + Type : "nodownload" | "nofullscreen" | "noremoteplayback" + +
                                                + +
                                                + + + + + + + + + + + + +
                                                + + disablePictureInPicture +
                                                + Type : boolean + +
                                                + +
                                                + + + + + + + + + + + + +
                                                + + disableRemotePlayback +
                                                + Type : boolean + +
                                                + +
                                                + + + + + + + + + + + + +
                                                + + loop +
                                                + Type : boolean + +
                                                + +
                                                + + + + + + + + + + + + +
                                                + + mute +
                                                + Type : boolean + +
                                                + +
                                                + + + + + + + + + + + + +
                                                + + pause +
                                                + Type : boolean + +
                                                + +
                                                + + + + + + + + + + + + +
                                                + + play +
                                                + Type : boolean + +
                                                + +
                                                + + + + + + + + + + + + +
                                                + + poster +
                                                + Type : string + +
                                                + +
                                                + + + + + + + + + + + + +
                                                + + src +
                                                + Type : string | literal type[] + +
                                                + +
                                                +
                                                +
                                                +

                                                Outputs

                                                + + + + + + + + + + + + + + + +
                                                + + error +
                                                + Type : EventEmitter + +
                                                + +
                                                +

                                                Stream that emits when an error occurs

                                                +
                                                +
                                                +
                                                + + +
                                                + +

                                                + Methods +

                                                + + + + + + + + + + + + + + + + + + + +
                                                + + + ngOnInit + + +
                                                +ngOnInit() +
                                                + +
                                                + +
                                                + Returns : void + +
                                                +
                                                +
                                                +
                                                + +

                                                + Properties +

                                                + + + + + + + + + + + + + + + + + +
                                                + + + video + + +
                                                + Type : ElementRef + +
                                                + Decorators : +
                                                + + @ViewChild('video', {static: true})
                                                +
                                                +
                                                + +
                                                + + + + + + + + + + + + + + +
                                                + + + videoSources + + +
                                                + Type : literal type[] + +
                                                + +
                                                +
                                                + +
                                                +

                                                + Accessors +

                                                + + + + + + + + + + + + + + + + + +
                                                + + pauseVideo +
                                                + setpauseVideo(shouldPause: boolean) +
                                                + +
                                                + +
                                                + Parameters : + + + + + + + + + + + + + + + + + + +
                                                NameTypeOptional
                                                shouldPause + boolean + + No +
                                                +
                                                +
                                                +
                                                +
                                                + Returns : void + +
                                                +
                                                + + + + + + + + + + + + + + + + + +
                                                + + playVideo +
                                                + setplayVideo(shouldPlay: boolean) +
                                                + +
                                                + +
                                                + Parameters : + + + + + + + + + + + + + + + + + + +
                                                NameTypeOptional
                                                shouldPlay + boolean + + No +
                                                +
                                                +
                                                +
                                                +
                                                + Returns : void + +
                                                +
                                                +
                                                +
                                                + + +
                                                +
                                                import { Component, Input, Output, EventEmitter, OnInit, ViewChild, ElementRef, ChangeDetectionStrategy } from '@angular/core';
                                                +import { NgFor, NgIf } from '@angular/common';
                                                +
                                                +@Component({
                                                +  selector: 'gallery-video',
                                                +  changeDetection: ChangeDetectionStrategy.OnPush,
                                                +  template: `
                                                +    <video #video
                                                +           [attr.mute]="mute"
                                                +           [attr.controlsList]="controlsList"
                                                +           [attr.disablePictureInPicture]="disablePictureInPicture"
                                                +           [disableRemotePlayback]="disableRemotePlayback"
                                                +           [controls]="controls"
                                                +           [loop]="loop"
                                                +           [poster]="poster"
                                                +           (error)="error.emit($event)">
                                                +      <ng-container *ngFor="let src of videoSources">
                                                +        <source *ngIf="src?.type; else noType" [src]="src?.url" [type]="src.type"/>
                                                +        <ng-template #noType>
                                                +          <source [src]="src?.url"/>
                                                +        </ng-template>
                                                +      </ng-container>
                                                +    </video>
                                                +  `,
                                                +  standalone: true,
                                                +  imports: [NgFor, NgIf]
                                                +})
                                                +export class GalleryVideoComponent implements OnInit {
                                                +
                                                +  videoSources: { url: string, type?: string }[];
                                                +
                                                +  @Input() src: string | { url: string, type?: string }[];
                                                +  @Input() poster: string;
                                                +  @Input() mute: boolean;
                                                +  @Input() loop: boolean;
                                                +  @Input() controls: boolean;
                                                +  @Input() controlsList: 'nodownload' | 'nofullscreen' | 'noremoteplayback';
                                                +  @Input() disableRemotePlayback: boolean;
                                                +  @Input() disablePictureInPicture: boolean;
                                                +
                                                +  @Input('pause') set pauseVideo(shouldPause: boolean) {
                                                +    if (this.video.nativeElement) {
                                                +      const video: HTMLVideoElement = this.video.nativeElement;
                                                +      if (shouldPause && !video.paused) {
                                                +        video.pause();
                                                +      }
                                                +    }
                                                +  }
                                                +
                                                +  @Input('play') set playVideo(shouldPlay: boolean) {
                                                +    if (this.video.nativeElement) {
                                                +      const video: HTMLVideoElement = this.video.nativeElement;
                                                +      if (shouldPlay) {
                                                +        video.play();
                                                +      }
                                                +    }
                                                +  }
                                                +
                                                +  /** Stream that emits when an error occurs */
                                                +  @Output() error = new EventEmitter<ErrorEvent>();
                                                +
                                                +  @ViewChild('video', { static: true }) video: ElementRef;
                                                +
                                                +  ngOnInit() {
                                                +    if (this.src instanceof Array) {
                                                +      // If video has multiple sources
                                                +      this.videoSources = [...this.src];
                                                +    } else {
                                                +      this.videoSources = [{ url: this.src }];
                                                +    }
                                                +  }
                                                +}
                                                +
                                                +
                                                + + + +
                                                +
                                                +
                                                +
                                                + Legend +
                                                +
                                                +
                                                Html element +
                                                +
                                                +
                                                Component +
                                                +
                                                +
                                                Html element with directive +
                                                +
                                                +
                                                + + +
                                                + + + + + + + + + + + + + + + + + + + + + + +
                                                +
                                                +

                                                results matching ""

                                                +
                                                  +
                                                  +
                                                  +

                                                  No results matching ""

                                                  +
                                                  +
                                                  +
                                                  + +
                                                  +
                                                  + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/documentation/components/LightboxComponent.html b/documentation/components/LightboxComponent.html new file mode 100644 index 00000000..7fe2681e --- /dev/null +++ b/documentation/components/LightboxComponent.html @@ -0,0 +1,1223 @@ + + + + + + ng-gallery-project documentation + + + + + + + + + + + + + +
                                                  +
                                                  + + +
                                                  +
                                                  + + + + + + + + +
                                                  +

                                                  +

                                                  File

                                                  +

                                                  +

                                                  + projects/ng-gallery/lightbox/src/lightbox.component.ts +

                                                  + + + + + + +
                                                  +

                                                  Metadata

                                                  + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                                  + +
                                                  +

                                                  Index

                                                  + + + + + + + + + + + + + + + + + + + + + +
                                                  +
                                                  Properties
                                                  +
                                                  + +
                                                  +
                                                  Methods
                                                  +
                                                  + +
                                                  +
                                                  + +
                                                  +

                                                  Constructor

                                                  + + + + + + + + + + + + + +
                                                  +constructor(_document: any, _focusTrapFactory: ConfigurableFocusTrapFactory, _elementRef: ElementRef) +
                                                  + +
                                                  +
                                                  + Parameters : + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                                  NameTypeOptional
                                                  _document + any + + No +
                                                  _focusTrapFactory + ConfigurableFocusTrapFactory + + No +
                                                  _elementRef + ElementRef + + No +
                                                  +
                                                  +
                                                  +
                                                  + + + + + +
                                                  + +

                                                  + Methods +

                                                  + + + + + + + + + + + + + + + + + + + +
                                                  + + + Private + _restoreFocus + + +
                                                  + + _restoreFocus() +
                                                  + +
                                                  +

                                                  Restores focus to the element that was focused before the lightbox opened.

                                                  +
                                                  + +
                                                  + Returns : void + +
                                                  +
                                                  + + + + + + + + + + + + + + + + + + + +
                                                  + + + Private + _savePreviouslyFocusedElement + + +
                                                  + + _savePreviouslyFocusedElement() +
                                                  + +
                                                  +

                                                  Saves a reference to the element that was focused before the lightbox was opened.

                                                  +
                                                  + +
                                                  + Returns : void + +
                                                  +
                                                  + + + + + + + + + + + + + + + + + + + +
                                                  + + + Private + _trapFocus + + +
                                                  + + _trapFocus() +
                                                  + +
                                                  +

                                                  Moves the focus inside the focus trap.

                                                  +
                                                  + +
                                                  + Returns : void + +
                                                  +
                                                  + + + + + + + + + + + + + + + + + + + +
                                                  + + + onAnimationDone + + +
                                                  +onAnimationDone(event: AnimationEvent) +
                                                  + +
                                                  +

                                                  Callback, invoked whenever an animation on the host completes.

                                                  +
                                                  + +
                                                  + Parameters : + + + + + + + + + + + + + + + + + + + +
                                                  NameTypeOptional
                                                  event + AnimationEvent + + No +
                                                  +
                                                  +
                                                  +
                                                  +
                                                  + Returns : void + +
                                                  +
                                                  + +
                                                  +
                                                  +
                                                  +
                                                  + +

                                                  + Properties +

                                                  + + + + + + + + + + + + + + + + + +
                                                  + + + Private + _elementFocusedBeforeDialogWasOpened + + +
                                                  + Type : HTMLElement + +
                                                  + +
                                                  +

                                                  Element that was focused before the lightbox was opened. Save this to restore upon close.

                                                  +
                                                  +
                                                  + + + + + + + + + + + + + + + + + +
                                                  + + + Private + _focusTrap + + +
                                                  + Type : ConfigurableFocusTrap + +
                                                  + +
                                                  +

                                                  The class that traps and manages focus within the lightbox.

                                                  +
                                                  +
                                                  + + + + + + + + + + + + + + + + + +
                                                  + + + ariaDescribedBy + + +
                                                  + Type : string + +
                                                  + +
                                                  +

                                                  ID of the element that describes the lightbox.

                                                  +
                                                  +
                                                  + + + + + + + + + + + + + + + + + +
                                                  + + + ariaLabel + + +
                                                  + Type : string + +
                                                  + +
                                                  +

                                                  Aria label to assign to the lightbox element

                                                  +
                                                  +
                                                  + + + + + + + + + + + + + + + + + +
                                                  + + + ariaLabelledBy + + +
                                                  + Type : string + +
                                                  + +
                                                  +

                                                  ID of the element that should be considered as the lightbox's label.

                                                  +
                                                  +
                                                  + + + + + + + + + + + + + + + + + +
                                                  + + + closeIcon + + +
                                                  + Type : SafeHtml + +
                                                  + +
                                                  +

                                                  Close button svg data

                                                  +
                                                  +
                                                  + + + + + + + + + + + + + + + + + +
                                                  + + + exitAnimationTime + + +
                                                  + Type : number + +
                                                  + +
                                                  +

                                                  The lightbox exit animation time in ms

                                                  +
                                                  +
                                                  + + + + + + + + + + + + + + + + + +
                                                  + + + id + + +
                                                  + Type : string + +
                                                  + +
                                                  +

                                                  Gallery ref id

                                                  +
                                                  +
                                                  + + + + + + + + + + + + + + + + + +
                                                  + + + overlayRef + + +
                                                  + Type : OverlayRef + +
                                                  + +
                                                  +

                                                  Overlay ref to close the lightbox

                                                  +
                                                  +
                                                  + + + + + + + + + + + + + + + + + +
                                                  + + + role + + +
                                                  + Type : string + +
                                                  + +
                                                  +

                                                  The ARIA role of the lightbox element.

                                                  +
                                                  +
                                                  + + + + + + + + + + + + + + + + + +
                                                  + + + startAnimationTime + + +
                                                  + Type : number + +
                                                  + +
                                                  +

                                                  The lightbox start animation time in ms

                                                  +
                                                  +
                                                  + + + + + + + + + + + + + + + + + + + + +
                                                  + + + state + + +
                                                  + Type : "void" | "enter" | "exit" + +
                                                  + Default value : 'enter' +
                                                  + +
                                                  +

                                                  State of the lightbox animation.

                                                  +
                                                  +
                                                  +
                                                  + +
                                                  + + +
                                                  +
                                                  import { Component, Optional, Inject, ElementRef, ChangeDetectionStrategy } from '@angular/core';
                                                  +import { SafeHtml } from '@angular/platform-browser';
                                                  +import { DOCUMENT } from '@angular/common';
                                                  +import { AnimationEvent } from '@angular/animations';
                                                  +import { OverlayRef } from '@angular/cdk/overlay';
                                                  +import { ConfigurableFocusTrap, ConfigurableFocusTrapFactory } from '@angular/cdk/a11y';
                                                  +import { GalleryComponent } from 'ng-gallery';
                                                  +import { lightboxAnimation } from './lightbox.animation';
                                                  +
                                                  +@Component({
                                                  +  selector: 'lightbox',
                                                  +  changeDetection: ChangeDetectionStrategy.OnPush,
                                                  +  animations: [lightboxAnimation],
                                                  +  styleUrls: ['./lightbox.component.scss'],
                                                  +  template: `
                                                  +    <i class="g-btn-close" aria-label="Close" [innerHTML]="closeIcon" (click)="overlayRef.detach()"></i>
                                                  +    <gallery [id]="id" [destroyRef]="false" [skipInitConfig]="true"></gallery>
                                                  +  `,
                                                  +  host: {
                                                  +    'tabindex': '-1',
                                                  +    'aria-modal': 'true',
                                                  +    '[attr.id]': '"lightbox-" + id',
                                                  +    '[attr.role]': 'role',
                                                  +    '[attr.aria-labelledby]': 'ariaLabel ? null : ariaLabelledBy',
                                                  +    '[attr.aria-label]': 'ariaLabel',
                                                  +    '[attr.aria-describedby]': 'ariaDescribedBy || null',
                                                  +    '[@lightbox]': '{ value: state, params: { startAnimationTime: startAnimationTime, exitAnimationTime: exitAnimationTime } }',
                                                  +    '(@lightbox.done)': 'onAnimationDone($event)',
                                                  +  },
                                                  +  standalone: true,
                                                  +  imports: [GalleryComponent]
                                                  +})
                                                  +export class LightboxComponent {
                                                  +
                                                  +  /** Gallery ref id */
                                                  +  id: string;
                                                  +
                                                  +  /** Overlay ref to close the lightbox */
                                                  +  overlayRef: OverlayRef;
                                                  +
                                                  +  /** Close button svg data */
                                                  +  closeIcon: SafeHtml;
                                                  +
                                                  +  /** State of the lightbox animation. */
                                                  +  state: 'void' | 'enter' | 'exit' = 'enter';
                                                  +
                                                  +  /** The ARIA role of the lightbox element. */
                                                  +  role: string;
                                                  +
                                                  +  /** Aria label to assign to the lightbox element */
                                                  +  ariaLabel: string;
                                                  +
                                                  +  /** ID of the element that should be considered as the lightbox's label. */
                                                  +  ariaLabelledBy: string;
                                                  +
                                                  +  /** ID of the element that describes the lightbox. */
                                                  +  ariaDescribedBy: string;
                                                  +
                                                  +  /** The lightbox start animation time in ms */
                                                  +  startAnimationTime: number;
                                                  +
                                                  +  /** The lightbox exit animation time in ms */
                                                  +  exitAnimationTime: number;
                                                  +
                                                  +  /** The class that traps and manages focus within the lightbox. */
                                                  +  private _focusTrap: ConfigurableFocusTrap;
                                                  +
                                                  +  /** Element that was focused before the lightbox was opened. Save this to restore upon close. */
                                                  +  private _elementFocusedBeforeDialogWasOpened: HTMLElement;
                                                  +
                                                  +  constructor(@Optional() @Inject(DOCUMENT) private _document: any,
                                                  +              private _focusTrapFactory: ConfigurableFocusTrapFactory,
                                                  +              private _elementRef: ElementRef) {
                                                  +    this._savePreviouslyFocusedElement();
                                                  +  }
                                                  +
                                                  +  /** Callback, invoked whenever an animation on the host completes. */
                                                  +  onAnimationDone(event: AnimationEvent) {
                                                  +    if (event.toState === 'enter') {
                                                  +      this._trapFocus();
                                                  +    } else {
                                                  +      this.overlayRef.dispose();
                                                  +      this._restoreFocus();
                                                  +    }
                                                  +  }
                                                  +
                                                  +  /** Moves the focus inside the focus trap. */
                                                  +  private _trapFocus() {
                                                  +    if (!this._focusTrap) {
                                                  +      this._focusTrap = this._focusTrapFactory.create(this._elementRef.nativeElement);
                                                  +    }
                                                  +    // If were to attempt to focus immediately, then the content of the lightbox would not yet be
                                                  +    // ready in instances where change detection has to run first. To deal with this, we simply
                                                  +    // wait for the microtask queue to be empty.
                                                  +    this._focusTrap.focusInitialElementWhenReady();
                                                  +  }
                                                  +
                                                  +  /** Saves a reference to the element that was focused before the lightbox was opened. */
                                                  +  private _savePreviouslyFocusedElement() {
                                                  +    if (this._document) {
                                                  +      this._elementFocusedBeforeDialogWasOpened = this._document.activeElement as HTMLElement;
                                                  +
                                                  +      // Note that there is no focus method when rendering on the server.
                                                  +      if (this._elementRef.nativeElement.focus) {
                                                  +        // Move focus onto the lightbox immediately in order to prevent the user from accidentally
                                                  +        // opening multiple dialogs at the same time. Needs to be async, because the element
                                                  +        // may not be focusable immediately.
                                                  +        Promise.resolve().then(() => this._elementRef.nativeElement.focus());
                                                  +      }
                                                  +    }
                                                  +  }
                                                  +
                                                  +  /** Restores focus to the element that was focused before the lightbox opened. */
                                                  +  private _restoreFocus() {
                                                  +    const toFocus = this._elementFocusedBeforeDialogWasOpened;
                                                  +
                                                  +    // We need the extra check, because IE can set the `activeElement` to null in some cases.
                                                  +    if (toFocus && typeof toFocus.focus === 'function') {
                                                  +      toFocus.focus();
                                                  +    }
                                                  +
                                                  +    if (this._focusTrap) {
                                                  +      this._focusTrap.destroy();
                                                  +    }
                                                  +  }
                                                  +}
                                                  +
                                                  +
                                                  + + +
                                                  +

                                                  + ./lightbox.component.scss +

                                                  +
                                                  @mixin fullscreen() {
                                                  +  width: 100%;
                                                  +  ::ng-deep {
                                                  +    lightbox {
                                                  +      max-width: unset;
                                                  +      max-height: unset;
                                                  +      position: fixed;
                                                  +      top: 0;
                                                  +      left: 0;
                                                  +      bottom: 0;
                                                  +      right: 0;
                                                  +      height: 100%;
                                                  +      width: 100%;
                                                  +      border-radius: 0;
                                                  +    }
                                                  +  }
                                                  +}
                                                  +
                                                  +::ng-deep {
                                                  +  lightbox {
                                                  +    position: relative;
                                                  +    display: block;
                                                  +    width: 1100px;
                                                  +    height: 800px;
                                                  +    max-width: 94vw;
                                                  +    max-height: 90vh;
                                                  +    border-radius: 4px;
                                                  +    overflow: hidden;
                                                  +    box-shadow: 0 11px 15px -7px rgba(0, 0, 0, .2), 0 24px 38px 3px rgba(0, 0, 0, .14), 0 9px 46px 8px rgba(0, 0, 0, .12);
                                                  +
                                                  +    &:focus {
                                                  +      outline: none;
                                                  +    }
                                                  +
                                                  +    gallery {
                                                  +      height: 100%;
                                                  +      width: 100%;
                                                  +      overflow: hidden;
                                                  +      margin: 0;
                                                  +
                                                  +      gallery-core {
                                                  +        height: 100% !important;
                                                  +      }
                                                  +    }
                                                  +  }
                                                  +
                                                  +  .g-backdrop {
                                                  +    background-color: rgba(0, 0, 0, .32);
                                                  +  }
                                                  +
                                                  +  .fullscreen {
                                                  +    @include fullscreen();
                                                  +  }
                                                  +
                                                  +  .g-overlay {
                                                  +    margin: auto;
                                                  +
                                                  +    @media only screen and (max-width: 480px) {
                                                  +      @include fullscreen();
                                                  +    }
                                                  +  }
                                                  +
                                                  +  .g-btn-close {
                                                  +    position: absolute;
                                                  +    right: 0.9em;
                                                  +    top: 0.9em;
                                                  +    z-index: 60;
                                                  +    cursor: pointer;
                                                  +    width: 20px;
                                                  +    height: 20px;
                                                  +    @media only screen and (max-width: 480px) {
                                                  +      right: 0.7em;
                                                  +      top: 0.7em;
                                                  +    }
                                                  +
                                                  +    svg {
                                                  +      width: 100%;
                                                  +      height: 100%;
                                                  +      opacity: 0.6;
                                                  +      transition: opacity linear 150ms;
                                                  +      filter: drop-shadow(0px 0px 2px rgba(0, 0, 0, 0.8));
                                                  +
                                                  +      &:hover {
                                                  +        opacity: 1;
                                                  +      }
                                                  +    }
                                                  +  }
                                                  +}
                                                  +
                                                  +
                                                  + +
                                                  +
                                                  +
                                                  +
                                                  + Legend +
                                                  +
                                                  +
                                                  Html element +
                                                  +
                                                  +
                                                  Component +
                                                  +
                                                  +
                                                  Html element with directive +
                                                  +
                                                  +
                                                  + + +
                                                  + + + + + + + + + + + + + + + + + + + + + + +
                                                  +
                                                  +

                                                  results matching ""

                                                  +
                                                    +
                                                    +
                                                    +

                                                    No results matching ""

                                                    +
                                                    +
                                                    +
                                                    + +
                                                    +
                                                    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/documentation/components/LightboxExampleComponent.html b/documentation/components/LightboxExampleComponent.html new file mode 100644 index 00000000..d104c7bf --- /dev/null +++ b/documentation/components/LightboxExampleComponent.html @@ -0,0 +1,378 @@ + + + + + + ng-gallery-project documentation + + + + + + + + + + + + + +
                                                    +
                                                    + + +
                                                    +
                                                    + + + + + + + + +
                                                    +

                                                    +

                                                    File

                                                    +

                                                    +

                                                    + projects/ng-gallery/src/stories/lightbox/lightbox-example.component.ts +

                                                    + + +

                                                    +

                                                    Description

                                                    +

                                                    +

                                                    +

                                                    This section demonstrate how to extend the image template, like displaying a text over the image item

                                                    + +

                                                    + + + + +
                                                    +

                                                    Metadata

                                                    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                                    + +
                                                    +

                                                    Index

                                                    + + + + + + + + + + + + + + + +
                                                    +
                                                    Properties
                                                    +
                                                    + +
                                                    +
                                                    + +
                                                    +

                                                    Constructor

                                                    + + + + + + + + + + + + + +
                                                    +constructor(pixabay: Pixabay) +
                                                    + +
                                                    +
                                                    + Parameters : + + + + + + + + + + + + + + + + + + +
                                                    NameTypeOptional
                                                    pixabay + Pixabay + + No +
                                                    +
                                                    +
                                                    +
                                                    + + + + + + +
                                                    + +

                                                    + Properties +

                                                    + + + + + + + + + + + + + + +
                                                    + + + Readonly + items$ + + +
                                                    + Type : Observable<GalleryItem[]> + +
                                                    + +
                                                    +
                                                    + +
                                                    + + +
                                                    +
                                                    import { Component, ChangeDetectionStrategy } from '@angular/core';
                                                    +import { CommonModule } from '@angular/common';
                                                    +import { GalleryItem, } from 'ng-gallery';
                                                    +import { LightboxModule } from 'ng-gallery/lightbox';
                                                    +import { Observable } from 'rxjs';
                                                    +import { Pixabay } from '../pixabay/pixabay.service';
                                                    +
                                                    +/**
                                                    + * This section demonstrate how to extend the image template, like displaying a text over the image item
                                                    + */
                                                    +@Component({
                                                    +  selector: 'lightbox-example',
                                                    +  template: `
                                                    +
                                                    +  `,
                                                    +  changeDetection: ChangeDetectionStrategy.OnPush,
                                                    +  standalone: true,
                                                    +  imports: [CommonModule, LightboxModule]
                                                    +})
                                                    +export class LightboxExampleComponent {
                                                    +
                                                    +  readonly items$: Observable<GalleryItem[]>;
                                                    +
                                                    +  constructor(pixabay: Pixabay) {
                                                    +    this.items$ = pixabay.getHDImages('massages');
                                                    +  }
                                                    +}
                                                    +
                                                    +
                                                    + + + +
                                                    +
                                                    +
                                                    +
                                                    + Legend +
                                                    +
                                                    +
                                                    Html element +
                                                    +
                                                    +
                                                    Component +
                                                    +
                                                    +
                                                    Html element with directive +
                                                    +
                                                    +
                                                    + + +
                                                    + + + + + + + + + + + + + + + + + + + + + + +
                                                    +
                                                    +

                                                    results matching ""

                                                    +
                                                      +
                                                      +
                                                      +

                                                      No results matching ""

                                                      +
                                                      +
                                                      +
                                                      + +
                                                      +
                                                      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/documentation/coverage.html b/documentation/coverage.html new file mode 100644 index 00000000..b631d608 --- /dev/null +++ b/documentation/coverage.html @@ -0,0 +1,1360 @@ + + + + + + ng-gallery-project documentation + + + + + + + + + + + + + +
                                                      +
                                                      + + +
                                                      +
                                                      + + + + + + + + + + + + + + + + + + + + +
                                                      + +
                                                      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                                      FileTypeIdentifierStatements
                                                      + + projects/ng-gallery/.storybook/main.ts + variableconfig + 0 % + (0/1) +
                                                      + + projects/ng-gallery/.storybook/preview.ts + variablepreview + 0 % + (0/1) +
                                                      + + projects/ng-gallery/lightbox/src/gallerize.directive.ts + directiveGallerizeDirective + 64 % + (9/14) +
                                                      + + projects/ng-gallery/lightbox/src/lightbox.animation.ts + variablelightboxAnimation + 0 % + (0/1) +
                                                      + + projects/ng-gallery/lightbox/src/lightbox.component.ts + componentLightboxComponent + 88 % + (16/18) +
                                                      + + projects/ng-gallery/lightbox/src/lightbox.default.ts + variabledefaultConfig + 0 % + (0/1) +
                                                      + + projects/ng-gallery/lightbox/src/lightbox.directive.ts + directiveLightboxDirective + 0 % + (0/7) +
                                                      + + projects/ng-gallery/lightbox/src/lightbox.model.ts + interfaceLightboxConfig + 0 % + (0/12) +
                                                      + + projects/ng-gallery/lightbox/src/lightbox.model.ts + variableLIGHTBOX_CONFIG + 0 % + (0/1) +
                                                      + + projects/ng-gallery/lightbox/src/lightbox.service.ts + injectableLightbox + 77 % + (7/9) +
                                                      + + projects/ng-gallery/src/lib/autoplay/autoplay.directive.ts + directiveAutoplayDirective + 0 % + (0/11) +
                                                      + + projects/ng-gallery/src/lib/components/adapters/base-adapter.ts + classSliderAdapter + 0 % + (0/10) +
                                                      + + projects/ng-gallery/src/lib/components/adapters/main-adapters.ts + classHorizontalAdapter + 0 % + (0/13) +
                                                      + + projects/ng-gallery/src/lib/components/adapters/main-adapters.ts + classVerticalAdapter + 0 % + (0/13) +
                                                      + + projects/ng-gallery/src/lib/components/adapters/main-adapters.ts + variableHammer + 0 % + (0/1) +
                                                      + + projects/ng-gallery/src/lib/components/gallery-core.component.ts + componentGalleryCoreComponent + 54 % + (12/22) +
                                                      + + projects/ng-gallery/src/lib/components/gallery-counter.component.ts + componentGalleryCounterComponent + 0 % + (0/2) +
                                                      + + projects/ng-gallery/src/lib/components/gallery-bullets.component.ts + componentGalleryBulletsComponent + 0 % + (0/6) +
                                                      + + projects/ng-gallery/src/lib/components/gallery-item.component.ts + componentGalleryItemComponent + 56 % + (9/16) +
                                                      + + projects/ng-gallery/src/lib/components/gallery-nav.component.ts + componentGalleryNavComponent + 0 % + (0/8) +
                                                      + + projects/ng-gallery/src/lib/components/gallery-slider.component.ts + componentGallerySliderComponent + 45 % + (9/20) +
                                                      + + projects/ng-gallery/src/lib/components/gallery-thumb.component.ts + componentGalleryThumbComponent + 45 % + (5/11) +
                                                      + + projects/ng-gallery/src/lib/components/gallery-thumbs.component.ts + componentGalleryThumbsComponent + 58 % + (10/17) +
                                                      + + projects/ng-gallery/src/lib/components/gallery.component.ts + componentGalleryComponent + 3 % + (3/77) +
                                                      + + projects/ng-gallery/src/lib/components/templates/gallery-iframe.component.ts + componentGalleryIframeComponent + 0 % + (0/9) +
                                                      + + projects/ng-gallery/src/lib/components/templates/gallery-image.component.ts + componentGalleryImageComponent + 52 % + (9/17) +
                                                      + + projects/ng-gallery/src/lib/components/templates/gallery-video.component.ts + componentGalleryVideoComponent + 6 % + (1/15) +
                                                      + + projects/ng-gallery/src/lib/components/templates/items.model.ts + classIframeItem + 0 % + (0/4) +
                                                      + + projects/ng-gallery/src/lib/components/templates/items.model.ts + classImageItem + 0 % + (0/4) +
                                                      + + projects/ng-gallery/src/lib/components/templates/items.model.ts + classVideoItem + 0 % + (0/4) +
                                                      + + projects/ng-gallery/src/lib/components/templates/items.model.ts + classYoutubeItem + 0 % + (0/4) +
                                                      + + projects/ng-gallery/src/lib/components/templates/svg-assets.ts + variableimageFailedSvg + 0 % + (0/1) +
                                                      + + projects/ng-gallery/src/lib/directives/gallery-box-def.directive.ts + directiveGalleryBoxDef + 0 % + (0/4) +
                                                      + + projects/ng-gallery/src/lib/directives/gallery-box-def.directive.ts + interfaceGalleryStateContext + 0 % + (0/3) +
                                                      + + projects/ng-gallery/src/lib/directives/gallery-image-def.directive.ts + directiveGalleryImageDef + 0 % + (0/4) +
                                                      + + projects/ng-gallery/src/lib/directives/gallery-item-def.directive.ts + directiveGalleryItemDef + 0 % + (0/4) +
                                                      + + projects/ng-gallery/src/lib/directives/gallery-item-def.directive.ts + interfaceGalleryItemContext + 87 % + (7/8) +
                                                      + + projects/ng-gallery/src/lib/directives/gallery-thumb-def.directive.ts + directiveGalleryThumbDef + 0 % + (0/4) +
                                                      + + projects/ng-gallery/src/lib/gestures/hammer-sliding.directive.ts + directiveHammerSliding + 6 % + (1/16) +
                                                      + + projects/ng-gallery/src/lib/gestures/hammer-sliding.directive.ts + variableHammer + 0 % + (0/1) +
                                                      + + projects/ng-gallery/src/lib/models/config.model.ts + interfaceGalleryConfig + 0 % + (0/44) +
                                                      + + projects/ng-gallery/src/lib/models/config.model.ts + variableGALLERY_CONFIG + 0 % + (0/1) +
                                                      + + projects/ng-gallery/src/lib/models/gallery.model.ts + interfaceGalleryError + 0 % + (0/3) +
                                                      + + projects/ng-gallery/src/lib/models/gallery.model.ts + interfaceGalleryItem + 0 % + (0/3) +
                                                      + + projects/ng-gallery/src/lib/models/gallery.model.ts + interfaceGalleryState + 0 % + (0/8) +
                                                      + + projects/ng-gallery/src/lib/models/slider.model.ts + interfaceSliderState + 0 % + (0/3) +
                                                      + + projects/ng-gallery/src/lib/models/slider.model.ts + interfaceWorkerState + 0 % + (0/3) +
                                                      + + projects/ng-gallery/src/lib/observers/active-item-observer.ts + classActiveItemObserver + 0 % + (0/2) +
                                                      + + projects/ng-gallery/src/lib/observers/active-item-observer.ts + functioncreateIntersectionObserver + 0 % + (0/1) +
                                                      + + projects/ng-gallery/src/lib/observers/item-intersection-observer.directive.ts + directiveItemIntersectionObserver + 0 % + (0/12) +
                                                      + + projects/ng-gallery/src/lib/observers/slider-intersection-observer.directive.ts + directiveSliderIntersectionObserver + 0 % + (0/13) +
                                                      + + projects/ng-gallery/src/lib/observers/slider-resize-observer.directive.ts + directiveSliderResizeObserver + 0 % + (0/21) +
                                                      + + projects/ng-gallery/src/lib/observers/thumb-resize-observer.directive.ts + directiveThumbResizeObserver + 0 % + (0/10) +
                                                      + + projects/ng-gallery/src/lib/services/gallery-ref.ts + classGalleryRef + 92 % + (23/25) +
                                                      + + projects/ng-gallery/src/lib/services/gallery-ref.ts + variablefilterActions + 0 % + (0/1) +
                                                      + + projects/ng-gallery/src/lib/services/gallery.service.ts + injectableGallery + 77 % + (7/9) +
                                                      + + projects/ng-gallery/src/lib/smooth-scroll/bezier-easing.ts + functionA + 0 % + (0/1) +
                                                      + + projects/ng-gallery/src/lib/smooth-scroll/bezier-easing.ts + functionB + 0 % + (0/1) +
                                                      + + projects/ng-gallery/src/lib/smooth-scroll/bezier-easing.ts + functionbezier + 0 % + (0/1) +
                                                      + + projects/ng-gallery/src/lib/smooth-scroll/bezier-easing.ts + functionbinarySubdivide + 0 % + (0/1) +
                                                      + + projects/ng-gallery/src/lib/smooth-scroll/bezier-easing.ts + functionC + 0 % + (0/1) +
                                                      + + projects/ng-gallery/src/lib/smooth-scroll/bezier-easing.ts + functioncalcBezier + 0 % + (0/1) +
                                                      + + projects/ng-gallery/src/lib/smooth-scroll/bezier-easing.ts + functiongetSlope + 0 % + (0/1) +
                                                      + + projects/ng-gallery/src/lib/smooth-scroll/bezier-easing.ts + functionLinearEasing + 0 % + (0/1) +
                                                      + + projects/ng-gallery/src/lib/smooth-scroll/bezier-easing.ts + functionnewtonRaphsonIterate + 0 % + (0/1) +
                                                      + + projects/ng-gallery/src/lib/smooth-scroll/bezier-easing.ts + variablefloat32ArraySupported + 0 % + (0/1) +
                                                      + + projects/ng-gallery/src/lib/smooth-scroll/bezier-easing.ts + variablekSampleStepSize + 0 % + (0/1) +
                                                      + + projects/ng-gallery/src/lib/smooth-scroll/bezier-easing.ts + variablekSplineTableSize + 0 % + (0/1) +
                                                      + + projects/ng-gallery/src/lib/smooth-scroll/bezier-easing.ts + variableNEWTON_ITERATIONS + 100 % + (1/1) +
                                                      + + projects/ng-gallery/src/lib/smooth-scroll/bezier-easing.ts + variableNEWTON_MIN_SLOPE + 0 % + (0/1) +
                                                      + + projects/ng-gallery/src/lib/smooth-scroll/bezier-easing.ts + variableSUBDIVISION_MAX_ITERATIONS + 0 % + (0/1) +
                                                      + + projects/ng-gallery/src/lib/smooth-scroll/bezier-easing.ts + variableSUBDIVISION_PRECISION + 0 % + (0/1) +
                                                      + + projects/ng-gallery/src/lib/smooth-scroll/smooth-scroll.directive.ts + directiveSmoothScroll + 27 % + (6/22) +
                                                      + + projects/ng-gallery/src/lib/smooth-scroll/smooth-scroll.directive.ts + variableHammer + 0 % + (0/1) +
                                                      + + projects/ng-gallery/src/lib/smooth-scroll/smooth-scroll.model.ts + interfaceBezierEasingOptions + 0 % + (0/5) +
                                                      + + projects/ng-gallery/src/lib/smooth-scroll/smooth-scroll.model.ts + interfaceSmoothScrollOptions + 0 % + (0/3) +
                                                      + + projects/ng-gallery/src/lib/smooth-scroll/smooth-scroll.model.ts + interfaceSmoothScrollStep + 0 % + (0/11) +
                                                      + + projects/ng-gallery/src/lib/smooth-scroll/smooth-scroll.model.ts + variableSMOOTH_SCROLL_OPTIONS + 0 % + (0/1) +
                                                      + + projects/ng-gallery/src/lib/utils/gallery.default.ts + variabledefaultConfig + 0 % + (0/1) +
                                                      + + projects/ng-gallery/src/lib/utils/gallery.default.ts + variabledefaultState + 100 % + (1/1) +
                                                      + + projects/ng-gallery/src/lib/utils/img-manager.ts + injectableImgManager + 0 % + (0/6) +
                                                      + + projects/ng-gallery/src/lib/utils/img-manager.ts + interfaceImageRegistry + 0 % + (0/3) +
                                                      + + projects/ng-gallery/src/lib/utils/img-recognizer.ts + directiveImgRecognizer + 0 % + (0/9) +
                                                      + + projects/ng-gallery/src/lib/utils/resize-observer.ts + functionresizeObservable + 0 % + (0/1) +
                                                      + + projects/ng-gallery/src/stories/basic/Gallery.stories.ts + variableAll + 100 % + (1/1) +
                                                      + + projects/ng-gallery/src/stories/basic/Gallery.stories.ts + variableCounter + 0 % + (0/1) +
                                                      + + projects/ng-gallery/src/stories/basic/Gallery.stories.ts + variableDots + 0 % + (0/1) +
                                                      + + projects/ng-gallery/src/stories/basic/Gallery.stories.ts + variablemeta + 0 % + (0/1) +
                                                      + + projects/ng-gallery/src/stories/basic/Gallery.stories.ts + variableNavigation + 0 % + (0/1) +
                                                      + + projects/ng-gallery/src/stories/basic/Gallery.stories.ts + variableThumbnails + 0 % + (0/1) +
                                                      + + projects/ng-gallery/src/stories/basic/gallery-example.component.ts + componentGalleryExampleComponent + 5 % + (2/37) +
                                                      + + projects/ng-gallery/src/stories/custom-templates/CustomTemplates.stories.ts + variableAll + 100 % + (1/1) +
                                                      + + projects/ng-gallery/src/stories/custom-templates/CustomTemplates.stories.ts + variablemeta + 0 % + (0/1) +
                                                      + + projects/ng-gallery/src/stories/custom-templates/custom-template.component.ts + componentCustomTemplateComponent + 33 % + (1/3) +
                                                      + + projects/ng-gallery/src/stories/lightbox/Lightbox.stories.ts + variableAll + 100 % + (1/1) +
                                                      + + projects/ng-gallery/src/stories/lightbox/Lightbox.stories.ts + variablemeta + 0 % + (0/1) +
                                                      + + projects/ng-gallery/src/stories/lightbox/lightbox-example.component.ts + componentLightboxExampleComponent + 33 % + (1/3) +
                                                      + + projects/ng-gallery/src/stories/pixabay/pixabay.model.ts + interfaceHit + 0 % + (0/22) +
                                                      + + projects/ng-gallery/src/stories/pixabay/pixabay.model.ts + interfaceHit2 + 0 % + (0/18) +
                                                      + + projects/ng-gallery/src/stories/pixabay/pixabay.model.ts + interfacePixabayHDModel + 0 % + (0/4) +
                                                      + + projects/ng-gallery/src/stories/pixabay/pixabay.model.ts + interfacePixabayModel + 0 % + (0/4) +
                                                      + + projects/ng-gallery/src/stories/pixabay/pixabay.service.ts + injectablePixabay + 0 % + (0/4) +
                                                      + + + + + +
                                                      +
                                                      +

                                                      results matching ""

                                                      +
                                                        +
                                                        +
                                                        +

                                                        No results matching ""

                                                        +
                                                        +
                                                        +
                                                        + +
                                                        +
                                                        + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/documentation/dependencies.html b/documentation/dependencies.html new file mode 100644 index 00000000..b033dfe1 --- /dev/null +++ b/documentation/dependencies.html @@ -0,0 +1,169 @@ + + + + + + ng-gallery-project documentation + + + + + + + + + + + + + +
                                                        +
                                                        + + +
                                                        +
                                                        + + + + + + + + + + + + + + + + +
                                                          +
                                                        • + @angular/animations : ^16.2.7
                                                        • +
                                                        • + @angular/cdk : ^16.2.6
                                                        • +
                                                        • + @angular/common : ^16.2.7
                                                        • +
                                                        • + @angular/compiler : ^16.2.7
                                                        • +
                                                        • + @angular/core : ^16.2.7
                                                        • +
                                                        • + @angular/flex-layout : ^15.0.0-beta.42
                                                        • +
                                                        • + @angular/forms : ^16.2.7
                                                        • +
                                                        • + @angular/material : ^16.2.6
                                                        • +
                                                        • + @angular/platform-browser : ^16.2.7
                                                        • +
                                                        • + @angular/platform-browser-dynamic : ^16.2.7
                                                        • +
                                                        • + @angular/platform-server : ^16.2.7
                                                        • +
                                                        • + @angular/router : ^16.2.7
                                                        • +
                                                        • + @fortawesome/angular-fontawesome : ^0.13.0
                                                        • +
                                                        • + @fortawesome/fontawesome-svg-core : ^6.4.0
                                                        • +
                                                        • + @fortawesome/free-brands-svg-icons : ^6.4.0
                                                        • +
                                                        • + @fortawesome/free-solid-svg-icons : ^6.4.0
                                                        • +
                                                        • + @nguniversal/express-engine : ^16.2.0
                                                        • +
                                                        • + express : ^4.15.2
                                                        • +
                                                        • + hammerjs : ^2.0.8
                                                        • +
                                                        • + highlight.js : ^11.8.0
                                                        • +
                                                        • + ngx-highlightjs : ^9.0.0
                                                        • +
                                                        • + ngx-progressbar : ^11.0.0
                                                        • +
                                                        • + ngx-scrollbar : ^12.0.0
                                                        • +
                                                        • + rxjs : ~7.5.6
                                                        • +
                                                        • + tslib : ^2.3.0
                                                        • +
                                                        • + zone.js : ~0.13.0
                                                        • +
                                                        + + + + + + +
                                                        +
                                                        +

                                                        results matching ""

                                                        +
                                                          +
                                                          +
                                                          +

                                                          No results matching ""

                                                          +
                                                          +
                                                          +
                                                          + +
                                                          +
                                                          + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/documentation/directives/AutoplayDirective.html b/documentation/directives/AutoplayDirective.html new file mode 100644 index 00000000..254370e1 --- /dev/null +++ b/documentation/directives/AutoplayDirective.html @@ -0,0 +1,675 @@ + + + + + + ng-gallery-project documentation + + + + + + + + + + + + + +
                                                          +
                                                          + + +
                                                          +
                                                          + + + + + + + + + + + +
                                                          +
                                                          +

                                                          +

                                                          File

                                                          +

                                                          +

                                                          + projects/ng-gallery/src/lib/autoplay/autoplay.directive.ts +

                                                          + + + +

                                                          +

                                                          Implements

                                                          +

                                                          +

                                                          + OnInit + OnChanges + OnDestroy +

                                                          + + +
                                                          +

                                                          Metadata

                                                          + + + + + + + + + + +
                                                          + +
                                                          +

                                                          Index

                                                          + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                                          +
                                                          Properties
                                                          +
                                                          + +
                                                          +
                                                          Methods
                                                          +
                                                          + +
                                                          +
                                                          Inputs
                                                          +
                                                          + +
                                                          +
                                                          + +
                                                          +

                                                          Constructor

                                                          + + + + + + + + + + + + + +
                                                          +constructor(_gallery: Gallery, _imgManager: ImgManager) +
                                                          + +
                                                          +
                                                          + Parameters : + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                                          NameTypeOptional
                                                          _gallery + Gallery + + No +
                                                          _imgManager + ImgManager + + No +
                                                          +
                                                          +
                                                          +
                                                          + +
                                                          +

                                                          Inputs

                                                          + + + + + + + + + + + + +
                                                          + + config +
                                                          + Type : GalleryConfig + +
                                                          + +
                                                          + + + + + + + + + + + + +
                                                          + + galleryId +
                                                          + Type : string + +
                                                          + +
                                                          +
                                                          + + + +
                                                          + +

                                                          + Methods +

                                                          + + + + + + + + + + + + + + + + + + + +
                                                          + + + Private + _subscribe + + +
                                                          + + _subscribe() +
                                                          + +
                                                          + +
                                                          + Returns : void + +
                                                          +
                                                          + + + + + + + + + + + + + + + + + + + +
                                                          + + + Private + _unsubscribe + + +
                                                          + + _unsubscribe() +
                                                          + +
                                                          + +
                                                          + Returns : void + +
                                                          +
                                                          + + + + + + + + + + + + + + + + + + + +
                                                          + + + ngOnChanges + + +
                                                          +ngOnChanges() +
                                                          + +
                                                          + +
                                                          + Returns : void + +
                                                          +
                                                          + + + + + + + + + + + + + + + + + + + +
                                                          + + + ngOnDestroy + + +
                                                          +ngOnDestroy() +
                                                          + +
                                                          + +
                                                          + Returns : void + +
                                                          +
                                                          + + + + + + + + + + + + + + + + + + + +
                                                          + + + ngOnInit + + +
                                                          +ngOnInit() +
                                                          + +
                                                          + +
                                                          + Returns : void + +
                                                          +
                                                          +
                                                          +
                                                          + +

                                                          + Properties +

                                                          + + + + + + + + + + + + + + +
                                                          + + + Private + _currentSubscription + + +
                                                          + Type : Subscription + +
                                                          + +
                                                          + + + + + + + + + + + + + + +
                                                          + + + Private + _galleryRef + + +
                                                          + Type : GalleryRef + +
                                                          + +
                                                          +
                                                          + + +
                                                          + + +
                                                          +
                                                          import { Directive, Input, OnInit, OnChanges, OnDestroy } from '@angular/core';
                                                          +import { Subscription, delay, of, switchMap, tap, EMPTY } from 'rxjs';
                                                          +import { ImgManager } from '../utils/img-manager';
                                                          +import { Gallery } from '../services/gallery.service';
                                                          +import { GalleryRef } from '../services/gallery-ref';
                                                          +import { GalleryState } from '../models/gallery.model';
                                                          +import { GalleryConfig } from '../models/config.model';
                                                          +
                                                          +@Directive({
                                                          +  selector: 'gallery-core[autoplay]',
                                                          +  standalone: true
                                                          +})
                                                          +export class AutoplayDirective implements OnInit, OnChanges, OnDestroy {
                                                          +
                                                          +  private _currentSubscription: Subscription;
                                                          +
                                                          +  private _galleryRef: GalleryRef;
                                                          +
                                                          +  @Input() config: GalleryConfig;
                                                          +
                                                          +  @Input() galleryId: string;
                                                          +
                                                          +  constructor(private _gallery: Gallery, private _imgManager: ImgManager) {
                                                          +  }
                                                          +
                                                          +  ngOnInit(): void {
                                                          +    this._galleryRef = this._gallery.ref(this.galleryId);
                                                          +    this._subscribe();
                                                          +  }
                                                          +
                                                          +  ngOnChanges(): void {
                                                          +    if (this._galleryRef) {
                                                          +      this.config.autoplay ? this._galleryRef.play() : this._galleryRef.stop();
                                                          +    }
                                                          +  }
                                                          +
                                                          +  ngOnDestroy(): void {
                                                          +    this._unsubscribe();
                                                          +  }
                                                          +
                                                          +
                                                          +  private _subscribe(): void {
                                                          +    this._unsubscribe();
                                                          +
                                                          +    this._currentSubscription = this._galleryRef.playingChanged.pipe(
                                                          +      switchMap((state: GalleryState) => {
                                                          +        if(state.isPlaying) {
                                                          +          return this._imgManager.getActiveItem(this._galleryRef.state).pipe(
                                                          +            switchMap(() => of({}).pipe(
                                                          +              delay(this.config.playerInterval),
                                                          +              tap(() => this._galleryRef.next(this.config.scrollBehavior))
                                                          +            ))
                                                          +          );
                                                          +        }
                                                          +        return EMPTY;
                                                          +      })
                                                          +    ).subscribe();
                                                          +  }
                                                          +
                                                          +  private _unsubscribe(): void {
                                                          +    this._currentSubscription?.unsubscribe();
                                                          +  }
                                                          +}
                                                          +
                                                          +
                                                          + +
                                                          + + + + + + + + + + + + + +
                                                          +
                                                          +

                                                          results matching ""

                                                          +
                                                            +
                                                            +
                                                            +

                                                            No results matching ""

                                                            +
                                                            +
                                                            +
                                                            + +
                                                            +
                                                            + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/documentation/directives/GallerizeDirective.html b/documentation/directives/GallerizeDirective.html new file mode 100644 index 00000000..7dc8d9ca --- /dev/null +++ b/documentation/directives/GallerizeDirective.html @@ -0,0 +1,1030 @@ + + + + + + ng-gallery-project documentation + + + + + + + + + + + + + +
                                                            +
                                                            + + +
                                                            +
                                                            + + + + + + + + + + + +
                                                            +
                                                            +

                                                            +

                                                            File

                                                            +

                                                            +

                                                            + projects/ng-gallery/lightbox/src/gallerize.directive.ts +

                                                            + + + +

                                                            +

                                                            Implements

                                                            +

                                                            +

                                                            + OnInit + OnDestroy +

                                                            + + +
                                                            +

                                                            Metadata

                                                            + + + + + + + + + + +
                                                            + +
                                                            +

                                                            Index

                                                            + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                                            +
                                                            Properties
                                                            +
                                                            + +
                                                            +
                                                            Methods
                                                            +
                                                            + +
                                                            +
                                                            Inputs
                                                            +
                                                            + +
                                                            +
                                                            + +
                                                            +

                                                            Constructor

                                                            + + + + + + + + + + + + + +
                                                            +constructor(_zone: NgZone, _el: ElementRef, _gallery: Gallery, _lightbox: Lightbox, _document: any, _galleryCmp: GalleryComponent) +
                                                            + +
                                                            +
                                                            + Parameters : + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                                            NameTypeOptional
                                                            _zone + NgZone + + No +
                                                            _el + ElementRef + + No +
                                                            _gallery + Gallery + + No +
                                                            _lightbox + Lightbox + + No +
                                                            _document + any + + No +
                                                            _galleryCmp + GalleryComponent + + No +
                                                            +
                                                            +
                                                            +
                                                            + +
                                                            +

                                                            Inputs

                                                            + + + + + + + + + + + + + + + +
                                                            + + gallerize +
                                                            + Type : string + +
                                                            + +
                                                            +

                                                            If set, it will become the gallery id

                                                            +
                                                            +
                                                            + + + + + + + + + + + + + + + + + + +
                                                            + + selector +
                                                            + Type : string + +
                                                            + Default value : 'img' +
                                                            + +
                                                            +

                                                            The selector used to query images elements

                                                            +
                                                            +
                                                            +
                                                            + + + +
                                                            + +

                                                            + Methods +

                                                            + + + + + + + + + + + + + + + + + + + +
                                                            + + + Private + detectorMode + + +
                                                            + + detectorMode(galleryRef: GalleryRef) +
                                                            + +
                                                            +

                                                            Detector mode: means gallerize directive is used on a normal HTMLElement + Detects images and adds a click event to each image, so it opens in the lightbox

                                                            +
                                                            + +
                                                            + Parameters : + + + + + + + + + + + + + + + + + + + +
                                                            NameTypeOptional
                                                            galleryRef + GalleryRef + + No +
                                                            +
                                                            +
                                                            +
                                                            +
                                                            + Returns : void + +
                                                            +
                                                            + +
                                                            +
                                                            + + + + + + + + + + + + + + + + + + + +
                                                            + + + Private + galleryMode + + +
                                                            + + galleryMode(galleryRef: GalleryRef) +
                                                            + +
                                                            +

                                                            Gallery mode: means gallerize directive is used on <gallery> component +Adds a click event to each gallery item so it opens in lightbox

                                                            +
                                                            + +
                                                            + Parameters : + + + + + + + + + + + + + + + + + + + +
                                                            NameTypeOptional
                                                            galleryRef + GalleryRef + + No +
                                                            +
                                                            +
                                                            +
                                                            +
                                                            + Returns : void + +
                                                            +
                                                            + +
                                                            +
                                                            + + + + + + + + + + + + + + + + + + + +
                                                            + + + ngOnDestroy + + +
                                                            +ngOnDestroy() +
                                                            + +
                                                            + +
                                                            + Returns : void + +
                                                            +
                                                            + + + + + + + + + + + + + + + + + + + +
                                                            + + + ngOnInit + + +
                                                            +ngOnInit() +
                                                            + +
                                                            + +
                                                            + Returns : void + +
                                                            +
                                                            +
                                                            +
                                                            + +

                                                            + Properties +

                                                            + + + + + + + + + + + + + + + + + +
                                                            + + + Private + _detector$ + + +
                                                            + Type : Subject<void> + +
                                                            + +
                                                            +

                                                            Stream that emits when image is discover

                                                            +
                                                            +
                                                            + + + + + + + + + + + + + + + + + + + + +
                                                            + + + Private + _galleryId + + +
                                                            + Type : string + +
                                                            + Default value : 'lightbox' +
                                                            + +
                                                            +

                                                            Default gallery id

                                                            +
                                                            +
                                                            + + + + + + + + + + + + + + +
                                                            + + + Private + _itemChange$ + + +
                                                            + Type : Subscription + +
                                                            + +
                                                            + + + + + + + + + + + + + + + + + +
                                                            + + + Private + _itemClick$ + + +
                                                            + Type : Subscription + +
                                                            + +
                                                            +

                                                            Gallery events (if used on a gallery component)

                                                            +
                                                            +
                                                            + + + + + + + + + + + + + + + + + +
                                                            + + + Private + Readonly + _mode + + +
                                                            + Type : GallerizeMode + +
                                                            + +
                                                            +

                                                            Gallerize mode

                                                            +
                                                            +
                                                            + + + + + + + + + + + + + + + + + +
                                                            + + + Private + _observer$ + + +
                                                            + Type : MutationObserver + +
                                                            + +
                                                            +

                                                            Stream that emits to fire the detection stream the image elements has changed

                                                            +
                                                            +
                                                            +
                                                            + + +
                                                            + + +
                                                            +
                                                            import {
                                                            +  Directive,
                                                            +  Input,
                                                            +  OnInit,
                                                            +  OnDestroy,
                                                            +  Inject,
                                                            +  Optional,
                                                            +  Self,
                                                            +  Host,
                                                            +  NgZone,
                                                            +  ElementRef,
                                                            +} from '@angular/core';
                                                            +import { DOCUMENT } from '@angular/common';
                                                            +import { Gallery, GalleryRef, ImageItem, GalleryComponent, GalleryState, GalleryItem } from 'ng-gallery';
                                                            +import { Subject, Subscription, from, tap, map, switchMap, finalize, debounceTime, EMPTY } from 'rxjs';
                                                            +
                                                            +import { Lightbox } from './lightbox.service';
                                                            +
                                                            +/**
                                                            + * This directive has 2 modes:
                                                            + * 1 - If host element is a HTMLElement, it detects the images and hooks their clicks to lightbox
                                                            + * 2 - If host element is a GalleryComponent, it hooks the images click to the lightbox
                                                            + */
                                                            +
                                                            +const enum GallerizeMode {
                                                            +  Detector = 'detector',
                                                            +  Gallery = 'gallery'
                                                            +}
                                                            +
                                                            +@Directive({
                                                            +  selector: '[gallerize]',
                                                            +  standalone: true
                                                            +})
                                                            +export class GallerizeDirective implements OnInit, OnDestroy {
                                                            +
                                                            +  /** Default gallery id */
                                                            +  private _galleryId: string = 'lightbox';
                                                            +
                                                            +  /** Gallerize mode */
                                                            +  private readonly _mode: GallerizeMode;
                                                            +
                                                            +  /** If host element is a HTMLElement, will use the following variables: */
                                                            +
                                                            +  /** Stream that emits to fire the detection stream the image elements has changed */
                                                            +  private _observer$: MutationObserver;
                                                            +
                                                            +  /** Stream that emits when image is discover */
                                                            +  private _detector$: Subject<void>;
                                                            +
                                                            +  /** If host element is a GalleryComponent, will use the following variables: */
                                                            +
                                                            +  /** Gallery events (if used on a gallery component) */
                                                            +  private _itemClick$: Subscription;
                                                            +  private _itemChange$: Subscription;
                                                            +
                                                            +  // ======================================================
                                                            +
                                                            +  /** If set, it will become the gallery id */
                                                            +  @Input() gallerize: string;
                                                            +
                                                            +  /** The selector used to query images elements */
                                                            +  @Input() selector: string = 'img';
                                                            +
                                                            +  constructor(private _zone: NgZone,
                                                            +              private _el: ElementRef,
                                                            +              private _gallery: Gallery,
                                                            +              private _lightbox: Lightbox,
                                                            +              @Inject(DOCUMENT) private _document: any,
                                                            +              @Host() @Self() @Optional() private _galleryCmp: GalleryComponent) {
                                                            +
                                                            +    // Set gallerize mode
                                                            +    this._mode = _galleryCmp ? GallerizeMode.Gallery : GallerizeMode.Detector;
                                                            +  }
                                                            +
                                                            +  ngOnInit(): void {
                                                            +    this._zone.runOutsideAngular(() => {
                                                            +      this._galleryId = this.gallerize || this._galleryId;
                                                            +      const ref: GalleryRef = this._gallery.ref(this._galleryId);
                                                            +
                                                            +      switch (this._mode) {
                                                            +        case GallerizeMode.Detector:
                                                            +          this.detectorMode(ref);
                                                            +          break;
                                                            +        case GallerizeMode.Gallery:
                                                            +          this.galleryMode(ref);
                                                            +      }
                                                            +    });
                                                            +  }
                                                            +
                                                            +  ngOnDestroy(): void {
                                                            +    switch (this._mode) {
                                                            +      case GallerizeMode.Detector:
                                                            +        this._detector$.complete();
                                                            +        this._observer$.disconnect();
                                                            +        break;
                                                            +      case GallerizeMode.Gallery:
                                                            +        this._itemClick$.unsubscribe();
                                                            +        this._itemChange$.unsubscribe();
                                                            +    }
                                                            +  }
                                                            +
                                                            +  /** Gallery mode: means `gallerize` directive is used on `<gallery>` component
                                                            +   * Adds a click event to each gallery item so it opens in lightbox */
                                                            +  private galleryMode(galleryRef: GalleryRef): void {
                                                            +    // Clone its items to the new gallery instance
                                                            +    this._itemClick$ = this._galleryCmp.galleryRef.itemClick.subscribe((i: number) => this._lightbox.open(i, this._galleryId));
                                                            +    this._itemChange$ = this._galleryCmp.galleryRef.itemsChanged.subscribe((state: GalleryState) => galleryRef.load(state.items));
                                                            +  }
                                                            +
                                                            +  /** Detector mode: means `gallerize` directive is used on a normal HTMLElement
                                                            +   *  Detects images and adds a click event to each image, so it opens in the lightbox */
                                                            +  private detectorMode(galleryRef: GalleryRef): void {
                                                            +    this._detector$ = new Subject();
                                                            +    // Query image elements
                                                            +    this._detector$.pipe(
                                                            +      debounceTime(300),
                                                            +      switchMap(() => {
                                                            +
                                                            +        /** get all img elements from content */
                                                            +        const imageElements = this._el.nativeElement.querySelectorAll(this.selector);
                                                            +
                                                            +        if (imageElements && imageElements.length) {
                                                            +
                                                            +          const images: GalleryItem[] = [];
                                                            +
                                                            +          return from(imageElements).pipe(
                                                            +            map((el: HTMLElement, i: number) => {
                                                            +              // Add click event to the image
                                                            +              el.style.cursor = 'pointer';
                                                            +              el.addEventListener('click', () => {
                                                            +                this._zone.run(() => this._lightbox.open(i, this._galleryId));
                                                            +              });
                                                            +
                                                            +              if (el instanceof HTMLImageElement) {
                                                            +                // If element is type of img use the src property
                                                            +                return {
                                                            +                  src: el.getAttribute('imageSrc') || el.src,
                                                            +                  thumb: el.getAttribute('thumbSrc') || el.src
                                                            +                };
                                                            +              } else {
                                                            +                // Otherwise, use element background-image url
                                                            +                const elStyle = this._document.defaultView.getComputedStyle(el, null);
                                                            +                const background = elStyle.backgroundImage.slice(4, -1).replace(/"/g, '');
                                                            +                return {
                                                            +                  src: el.getAttribute('imageSrc') || background,
                                                            +                  thumb: el.getAttribute('thumbSrc') || background
                                                            +                };
                                                            +              }
                                                            +            }),
                                                            +            tap((data: any) => images.push(new ImageItem(data))),
                                                            +            finalize(() => galleryRef.load(images))
                                                            +          );
                                                            +        } else {
                                                            +          return EMPTY;
                                                            +        }
                                                            +      })
                                                            +    ).subscribe();
                                                            +
                                                            +    // Observe content changes
                                                            +    this._observer$ = new MutationObserver(() => this._detector$.next());
                                                            +    this._observer$.observe(this._el.nativeElement, { childList: true, subtree: true });
                                                            +  }
                                                            +}
                                                            +
                                                            +
                                                            + +
                                                            + + + + + + + + + + + + + +
                                                            +
                                                            +

                                                            results matching ""

                                                            +
                                                              +
                                                              +
                                                              +

                                                              No results matching ""

                                                              +
                                                              +
                                                              +
                                                              + +
                                                              +
                                                              + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/documentation/directives/GalleryBoxDef.html b/documentation/directives/GalleryBoxDef.html new file mode 100644 index 00000000..ea80b91d --- /dev/null +++ b/documentation/directives/GalleryBoxDef.html @@ -0,0 +1,408 @@ + + + + + + ng-gallery-project documentation + + + + + + + + + + + + + +
                                                              +
                                                              + + +
                                                              +
                                                              + + + + + + + + + + + +
                                                              +
                                                              +

                                                              +

                                                              File

                                                              +

                                                              +

                                                              + projects/ng-gallery/src/lib/directives/gallery-box-def.directive.ts +

                                                              + + + + + +
                                                              +

                                                              Metadata

                                                              + + + + + + + + + + +
                                                              + +
                                                              +

                                                              Index

                                                              + + + + + + + + + + + + + + + + + + + + + +
                                                              +
                                                              Properties
                                                              +
                                                              + +
                                                              +
                                                              Methods
                                                              +
                                                              + +
                                                              +
                                                              + +
                                                              +

                                                              Constructor

                                                              + + + + + + + + + + + + + +
                                                              +constructor(templateRef: TemplateRef<GalleryStateContext>) +
                                                              + +
                                                              +
                                                              + Parameters : + + + + + + + + + + + + + + + + + + +
                                                              NameTypeOptional
                                                              templateRef + TemplateRef<GalleryStateContext> + + No +
                                                              +
                                                              +
                                                              +
                                                              + + + + + +
                                                              + +

                                                              + Methods +

                                                              + + + + + + + + + + + + + + + + + + + +
                                                              + + + Static + ngTemplateContextGuard + + +
                                                              + + ngTemplateContextGuard(directive: GalleryBoxDef, context) +
                                                              + +
                                                              + +
                                                              + Parameters : + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                                              NameTypeOptional
                                                              directive + GalleryBoxDef + + No +
                                                              context + + No +
                                                              +
                                                              +
                                                              +
                                                              +
                                                              + Returns : GalleryStateContext + +
                                                              +
                                                              + +
                                                              +
                                                              +
                                                              +
                                                              + +

                                                              + Properties +

                                                              + + + + + + + + + + + + + + +
                                                              + + + Public + templateRef + + +
                                                              + Type : TemplateRef<GalleryStateContext> + +
                                                              + +
                                                              +
                                                              + + +
                                                              + + +
                                                              +
                                                              import { Directive, TemplateRef } from '@angular/core';
                                                              +import { GalleryState } from '../models/gallery.model';
                                                              +import { GalleryConfig } from '../models/config.model';
                                                              +
                                                              +
                                                              +@Directive({
                                                              +  standalone: true,
                                                              +  selector: '[galleryBoxDef]'
                                                              +})
                                                              +export class GalleryBoxDef {
                                                              +
                                                              +  constructor(public templateRef: TemplateRef<GalleryStateContext>) {
                                                              +  }
                                                              +
                                                              +  // Make sure the template checker knows the type of the context with which the
                                                              +  // template of this directive will be rendered
                                                              +  static ngTemplateContextGuard(
                                                              +    directive: GalleryBoxDef,
                                                              +    context: unknown
                                                              +  ): context is GalleryStateContext {
                                                              +    return true;
                                                              +  }
                                                              +}
                                                              +
                                                              +export interface GalleryStateContext {
                                                              +  state?: GalleryState;
                                                              +  config?: GalleryConfig;
                                                              +}
                                                              +
                                                              +
                                                              + +
                                                              + + + + + + + + + + + + + +
                                                              +
                                                              +

                                                              results matching ""

                                                              +
                                                                +
                                                                +
                                                                +

                                                                No results matching ""

                                                                +
                                                                +
                                                                +
                                                                + +
                                                                +
                                                                + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/documentation/directives/GalleryImageDef.html b/documentation/directives/GalleryImageDef.html new file mode 100644 index 00000000..4b8aff48 --- /dev/null +++ b/documentation/directives/GalleryImageDef.html @@ -0,0 +1,402 @@ + + + + + + ng-gallery-project documentation + + + + + + + + + + + + + +
                                                                +
                                                                + + +
                                                                +
                                                                + + + + + + + + + + + +
                                                                +
                                                                +

                                                                +

                                                                File

                                                                +

                                                                +

                                                                + projects/ng-gallery/src/lib/directives/gallery-image-def.directive.ts +

                                                                + + + + + +
                                                                +

                                                                Metadata

                                                                + + + + + + + + + + +
                                                                + +
                                                                +

                                                                Index

                                                                + + + + + + + + + + + + + + + + + + + + + +
                                                                +
                                                                Properties
                                                                +
                                                                + +
                                                                +
                                                                Methods
                                                                +
                                                                + +
                                                                +
                                                                + +
                                                                +

                                                                Constructor

                                                                + + + + + + + + + + + + + +
                                                                +constructor(templateRef: TemplateRef<GalleryItemContext<ImageItemData>>) +
                                                                + +
                                                                +
                                                                + Parameters : + + + + + + + + + + + + + + + + + + +
                                                                NameTypeOptional
                                                                templateRef + TemplateRef<GalleryItemContext<ImageItemData>> + + No +
                                                                +
                                                                +
                                                                +
                                                                + + + + + +
                                                                + +

                                                                + Methods +

                                                                + + + + + + + + + + + + + + + + + + + +
                                                                + + + Static + ngTemplateContextGuard + + +
                                                                + + ngTemplateContextGuard(directive: GalleryImageDef, context) +
                                                                + +
                                                                + +
                                                                + Parameters : + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                                                NameTypeOptional
                                                                directive + GalleryImageDef + + No +
                                                                context + + No +
                                                                +
                                                                +
                                                                +
                                                                + +
                                                                + +
                                                                +
                                                                +
                                                                +
                                                                + +

                                                                + Properties +

                                                                + + + + + + + + + + + + + + +
                                                                + + + Public + templateRef + + +
                                                                + Type : TemplateRef<GalleryItemContext<ImageItemData>> + +
                                                                + +
                                                                +
                                                                + + +
                                                                + + +
                                                                +
                                                                import { Directive, TemplateRef } from '@angular/core';
                                                                +import { ImageItemData } from '../components/templates/items.model';
                                                                +import { GalleryItemContext } from './gallery-item-def.directive';
                                                                +
                                                                +@Directive({
                                                                +  standalone: true,
                                                                +  selector: '[galleryImageDef]'
                                                                +})
                                                                +export class GalleryImageDef {
                                                                +
                                                                +  constructor(public templateRef: TemplateRef<GalleryItemContext<ImageItemData>>) {
                                                                +  }
                                                                +
                                                                +  // Make sure the template checker knows the type of the context with which the
                                                                +  // template of this directive will be rendered
                                                                +  static ngTemplateContextGuard(
                                                                +    directive: GalleryImageDef,
                                                                +    context: unknown
                                                                +  ): context is GalleryItemContext<ImageItemData> {
                                                                +    return true;
                                                                +  }
                                                                +}
                                                                +
                                                                +
                                                                + +
                                                                + + + + + + + + + + + + + +
                                                                +
                                                                +

                                                                results matching ""

                                                                +
                                                                  +
                                                                  +
                                                                  +

                                                                  No results matching ""

                                                                  +
                                                                  +
                                                                  +
                                                                  + +
                                                                  +
                                                                  + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/documentation/directives/GalleryItemDef.html b/documentation/directives/GalleryItemDef.html new file mode 100644 index 00000000..63efc0a6 --- /dev/null +++ b/documentation/directives/GalleryItemDef.html @@ -0,0 +1,424 @@ + + + + + + ng-gallery-project documentation + + + + + + + + + + + + + +
                                                                  +
                                                                  + + +
                                                                  +
                                                                  + + + + + + + + + + + +
                                                                  +
                                                                  +

                                                                  +

                                                                  File

                                                                  +

                                                                  +

                                                                  + projects/ng-gallery/src/lib/directives/gallery-item-def.directive.ts +

                                                                  + + + + + +
                                                                  +

                                                                  Metadata

                                                                  + + + + + + + + + + +
                                                                  + +
                                                                  +

                                                                  Index

                                                                  + + + + + + + + + + + + + + + + + + + + + +
                                                                  +
                                                                  Properties
                                                                  +
                                                                  + +
                                                                  +
                                                                  Methods
                                                                  +
                                                                  + +
                                                                  +
                                                                  + +
                                                                  +

                                                                  Constructor

                                                                  + + + + + + + + + + + + + +
                                                                  +constructor(templateRef: TemplateRef<GalleryItemContext<GalleryItemDef>>) +
                                                                  + +
                                                                  +
                                                                  + Parameters : + + + + + + + + + + + + + + + + + + +
                                                                  NameTypeOptional
                                                                  templateRef + TemplateRef<GalleryItemContext<GalleryItemDef>> + + No +
                                                                  +
                                                                  +
                                                                  +
                                                                  + + + + + +
                                                                  + +

                                                                  + Methods +

                                                                  + + + + + + + + + + + + + + + + + + + +
                                                                  + + + Static + ngTemplateContextGuard + + +
                                                                  + + ngTemplateContextGuard(directive: GalleryItemDef, context) +
                                                                  + +
                                                                  + +
                                                                  + Parameters : + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                                                  NameTypeOptional
                                                                  directive + GalleryItemDef + + No +
                                                                  context + + No +
                                                                  +
                                                                  +
                                                                  +
                                                                  + +
                                                                  + +
                                                                  +
                                                                  +
                                                                  +
                                                                  + +

                                                                  + Properties +

                                                                  + + + + + + + + + + + + + + +
                                                                  + + + Public + templateRef + + +
                                                                  + Type : TemplateRef<GalleryItemContext<GalleryItemDef>> + +
                                                                  + +
                                                                  +
                                                                  + + +
                                                                  + + +
                                                                  +
                                                                  import { Directive, TemplateRef } from '@angular/core';
                                                                  +import { GalleryItemData } from '../components/templates/items.model';
                                                                  +import { GalleryItemType } from '../models/constants';
                                                                  +
                                                                  +@Directive({
                                                                  +  standalone: true,
                                                                  +  selector: '[galleryItemDef]'
                                                                  +})
                                                                  +export class GalleryItemDef {
                                                                  +  constructor(public templateRef: TemplateRef<GalleryItemContext<GalleryItemDef>>) {
                                                                  +  }
                                                                  +
                                                                  +  // Make sure the template checker knows the type of the context with which the
                                                                  +  // template of this directive will be rendered
                                                                  +  static ngTemplateContextGuard(
                                                                  +    directive: GalleryItemDef,
                                                                  +    context: unknown
                                                                  +  ): context is GalleryItemContext<GalleryItemData> {
                                                                  +    return true;
                                                                  +  }
                                                                  +}
                                                                  +
                                                                  +export interface GalleryItemContext<T> {
                                                                  +  /** Data for the row that this cell is located within. */
                                                                  +  $implicit?: T;
                                                                  +
                                                                  +  /** Index of the item. */
                                                                  +  index?: number;
                                                                  +
                                                                  +  /** The type of the item. */
                                                                  +  type?: GalleryItemType;
                                                                  +
                                                                  +  /** True if this item is the active one. */
                                                                  +  active?: boolean;
                                                                  +
                                                                  +  /** The number of total items. */
                                                                  +  count?: number;
                                                                  +
                                                                  +  /** True if this item is first. */
                                                                  +  first?: boolean;
                                                                  +
                                                                  +  /** True if this item is last. */
                                                                  +  last?: boolean;
                                                                  +}
                                                                  +
                                                                  +
                                                                  + +
                                                                  + + + + + + + + + + + + + +
                                                                  +
                                                                  +

                                                                  results matching ""

                                                                  +
                                                                    +
                                                                    +
                                                                    +

                                                                    No results matching ""

                                                                    +
                                                                    +
                                                                    +
                                                                    + +
                                                                    +
                                                                    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/documentation/directives/GalleryThumbDef.html b/documentation/directives/GalleryThumbDef.html new file mode 100644 index 00000000..05dfd17e --- /dev/null +++ b/documentation/directives/GalleryThumbDef.html @@ -0,0 +1,401 @@ + + + + + + ng-gallery-project documentation + + + + + + + + + + + + + +
                                                                    +
                                                                    + + +
                                                                    +
                                                                    + + + + + + + + + + + +
                                                                    +
                                                                    +

                                                                    +

                                                                    File

                                                                    +

                                                                    +

                                                                    + projects/ng-gallery/src/lib/directives/gallery-thumb-def.directive.ts +

                                                                    + + + + + +
                                                                    +

                                                                    Metadata

                                                                    + + + + + + + + + + +
                                                                    + +
                                                                    +

                                                                    Index

                                                                    + + + + + + + + + + + + + + + + + + + + + +
                                                                    +
                                                                    Properties
                                                                    +
                                                                    + +
                                                                    +
                                                                    Methods
                                                                    +
                                                                    + +
                                                                    +
                                                                    + +
                                                                    +

                                                                    Constructor

                                                                    + + + + + + + + + + + + + +
                                                                    +constructor(templateRef: TemplateRef<GalleryItemContext<ImageItemData>>) +
                                                                    + +
                                                                    +
                                                                    + Parameters : + + + + + + + + + + + + + + + + + + +
                                                                    NameTypeOptional
                                                                    templateRef + TemplateRef<GalleryItemContext<ImageItemData>> + + No +
                                                                    +
                                                                    +
                                                                    +
                                                                    + + + + + +
                                                                    + +

                                                                    + Methods +

                                                                    + + + + + + + + + + + + + + + + + + + +
                                                                    + + + Static + ngTemplateContextGuard + + +
                                                                    + + ngTemplateContextGuard(directive: GalleryThumbDef, context) +
                                                                    + +
                                                                    + +
                                                                    + Parameters : + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                                                    NameTypeOptional
                                                                    directive + GalleryThumbDef + + No +
                                                                    context + + No +
                                                                    +
                                                                    +
                                                                    +
                                                                    + +
                                                                    + +
                                                                    +
                                                                    +
                                                                    +
                                                                    + +

                                                                    + Properties +

                                                                    + + + + + + + + + + + + + + +
                                                                    + + + Public + templateRef + + +
                                                                    + Type : TemplateRef<GalleryItemContext<ImageItemData>> + +
                                                                    + +
                                                                    +
                                                                    + + +
                                                                    + + +
                                                                    +
                                                                    import { Directive, TemplateRef } from '@angular/core';
                                                                    +import { ImageItemData } from '../components/templates/items.model';
                                                                    +import { GalleryItemContext } from './gallery-item-def.directive';
                                                                    +
                                                                    +@Directive({
                                                                    +  standalone: true,
                                                                    +  selector: '[galleryThumbDef]'
                                                                    +})
                                                                    +export class GalleryThumbDef {
                                                                    +
                                                                    +  constructor(public templateRef: TemplateRef<GalleryItemContext<ImageItemData>>) {
                                                                    +  }
                                                                    +  // Make sure the template checker knows the type of the context with which the
                                                                    +  // template of this directive will be rendered
                                                                    +  static ngTemplateContextGuard(
                                                                    +    directive: GalleryThumbDef,
                                                                    +    context: unknown
                                                                    +  ): context is GalleryItemContext<ImageItemData> {
                                                                    +    return true;
                                                                    +  }
                                                                    +}
                                                                    +
                                                                    +
                                                                    + +
                                                                    + + + + + + + + + + + + + +
                                                                    +
                                                                    +

                                                                    results matching ""

                                                                    +
                                                                      +
                                                                      +
                                                                      +

                                                                      No results matching ""

                                                                      +
                                                                      +
                                                                      +
                                                                      + +
                                                                      +
                                                                      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/documentation/directives/HammerSliding.html b/documentation/directives/HammerSliding.html new file mode 100644 index 00000000..d8280b20 --- /dev/null +++ b/documentation/directives/HammerSliding.html @@ -0,0 +1,1031 @@ + + + + + + ng-gallery-project documentation + + + + + + + + + + + + + +
                                                                      +
                                                                      + + +
                                                                      +
                                                                      + + + + + + + + + + + +
                                                                      +
                                                                      +

                                                                      +

                                                                      File

                                                                      +

                                                                      +

                                                                      + projects/ng-gallery/src/lib/gestures/hammer-sliding.directive.ts +

                                                                      + + + +

                                                                      +

                                                                      Implements

                                                                      +

                                                                      +

                                                                      + OnChanges + OnDestroy +

                                                                      + + +
                                                                      +

                                                                      Metadata

                                                                      + + + + + + + + + + +
                                                                      + +
                                                                      +

                                                                      Index

                                                                      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                                                      +
                                                                      Properties
                                                                      +
                                                                      + +
                                                                      +
                                                                      Methods
                                                                      +
                                                                      + +
                                                                      +
                                                                      Inputs
                                                                      +
                                                                      + +
                                                                      +
                                                                      Outputs
                                                                      +
                                                                      + +
                                                                      +
                                                                      Accessors
                                                                      +
                                                                      + +
                                                                      +
                                                                      + +
                                                                      +

                                                                      Constructor

                                                                      + + + + + + + + + + + + + +
                                                                      +constructor(_document: Document, _el: ElementRef, _platform: Platform, _zone: NgZone) +
                                                                      + +
                                                                      +
                                                                      + Parameters : + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                                                      NameTypeOptional
                                                                      _document + Document + + No +
                                                                      _el + ElementRef<HTMLElement> + + No +
                                                                      _platform + Platform + + No +
                                                                      _zone + NgZone + + No +
                                                                      +
                                                                      +
                                                                      +
                                                                      + +
                                                                      +

                                                                      Inputs

                                                                      + + + + + + + + + + + + +
                                                                      + + adapter +
                                                                      + Type : SliderAdapter + +
                                                                      + +
                                                                      + + + + + + + + + + + + +
                                                                      + + config +
                                                                      + Type : GalleryConfig + +
                                                                      + +
                                                                      + + + + + + + + + + + + +
                                                                      + + galleryId +
                                                                      + Type : string + +
                                                                      + +
                                                                      + + + + + + + + + + + + +
                                                                      + + items +
                                                                      + Type : GalleryItemComponent[] | GalleryThumbComponent[] + +
                                                                      + +
                                                                      + + + + + + + + + + + + +
                                                                      + + state +
                                                                      + Type : GalleryState + +
                                                                      + +
                                                                      +
                                                                      +
                                                                      +

                                                                      Outputs

                                                                      + + + + + + + + + + + + +
                                                                      + + activeIndexChange +
                                                                      + Type : EventEmitter<number> + +
                                                                      + +
                                                                      + + + + + + + + + + + + +
                                                                      + + isSlidingChange +
                                                                      + Type : EventEmitter<boolean> + +
                                                                      + +
                                                                      +
                                                                      + + +
                                                                      + +

                                                                      + Methods +

                                                                      + + + + + + + + + + + + + + + + + + + +
                                                                      + + + Private + _subscribe + + +
                                                                      + + _subscribe() +
                                                                      + +
                                                                      + +
                                                                      + Returns : void + +
                                                                      +
                                                                      + + + + + + + + + + + + + + + + + + + +
                                                                      + + + Private + _unsubscribe + + +
                                                                      + + _unsubscribe() +
                                                                      + +
                                                                      + +
                                                                      + Returns : void + +
                                                                      +
                                                                      + + + + + + + + + + + + + + + + + + + +
                                                                      + + + Private + getElementFromViewportCenter + + +
                                                                      + + getElementFromViewportCenter() +
                                                                      + +
                                                                      + +
                                                                      + Returns : Element + +
                                                                      +
                                                                      + + + + + + + + + + + + + + + + + + + +
                                                                      + + + Private + getIndexOnMouseUp + + +
                                                                      + + getIndexOnMouseUp(e: any) +
                                                                      + +
                                                                      + +
                                                                      + Parameters : + + + + + + + + + + + + + + + + + + + +
                                                                      NameTypeOptional
                                                                      e + any + + No +
                                                                      +
                                                                      +
                                                                      +
                                                                      +
                                                                      + Returns : number + +
                                                                      +
                                                                      + +
                                                                      +
                                                                      + + + + + + + + + + + + + + + + + + + +
                                                                      + + + ngOnChanges + + +
                                                                      +ngOnChanges(changes: SimpleChanges) +
                                                                      + +
                                                                      + +
                                                                      + Parameters : + + + + + + + + + + + + + + + + + + + +
                                                                      NameTypeOptional
                                                                      changes + SimpleChanges + + No +
                                                                      +
                                                                      +
                                                                      +
                                                                      +
                                                                      + Returns : void + +
                                                                      +
                                                                      + +
                                                                      +
                                                                      + + + + + + + + + + + + + + + + + + + +
                                                                      + + + ngOnDestroy + + +
                                                                      +ngOnDestroy() +
                                                                      + +
                                                                      + +
                                                                      + Returns : void + +
                                                                      +
                                                                      +
                                                                      +
                                                                      + +

                                                                      + Properties +

                                                                      + + + + + + + + + + + + + + + + + +
                                                                      + + + Private + _hammer + + +
                                                                      + Type : any + +
                                                                      + +
                                                                      +

                                                                      HammerJS instance

                                                                      +
                                                                      +
                                                                      +
                                                                      + +
                                                                      +

                                                                      + Accessors +

                                                                      + + + + + + + + + + + + + + +
                                                                      + + _viewport +
                                                                      + get_viewport() +
                                                                      + +
                                                                      +
                                                                      + +
                                                                      + + +
                                                                      +
                                                                      import { Directive, Inject, Input, Output, OnChanges, OnDestroy, SimpleChanges, NgZone, ElementRef, EventEmitter } from '@angular/core';
                                                                      +import { DOCUMENT } from '@angular/common';
                                                                      +import { Platform } from '@angular/cdk/platform';
                                                                      +import { SliderAdapter } from '../components/adapters';
                                                                      +import { GalleryConfig } from '../models/config.model';
                                                                      +import { GalleryState } from '../models/gallery.model';
                                                                      +import { GalleryItemComponent } from '../components/gallery-item.component';
                                                                      +import { GalleryThumbComponent } from '../components/gallery-thumb.component';
                                                                      +
                                                                      +declare const Hammer: any;
                                                                      +
                                                                      +@Directive({
                                                                      +  selector: '[hammerSliding]',
                                                                      +  standalone: true
                                                                      +})
                                                                      +export class HammerSliding implements OnChanges, OnDestroy {
                                                                      +
                                                                      +  /** HammerJS instance */
                                                                      +  private _hammer: any;
                                                                      +
                                                                      +  get _viewport(): HTMLElement {
                                                                      +    return this._el.nativeElement;
                                                                      +  }
                                                                      +
                                                                      +  @Input() galleryId: string;
                                                                      +
                                                                      +  @Input() items: GalleryItemComponent[] | GalleryThumbComponent[];
                                                                      +
                                                                      +  @Input() adapter: SliderAdapter;
                                                                      +
                                                                      +  @Input() state: GalleryState;
                                                                      +
                                                                      +  @Input() config: GalleryConfig;
                                                                      +
                                                                      +  @Output() activeIndexChange: EventEmitter<number> = new EventEmitter<number>();
                                                                      +
                                                                      +  @Output() isSlidingChange: EventEmitter<boolean> = new EventEmitter<boolean>();
                                                                      +
                                                                      +  constructor(@Inject(DOCUMENT) private _document: Document,
                                                                      +              private _el: ElementRef<HTMLElement>,
                                                                      +              private _platform: Platform,
                                                                      +              private _zone: NgZone) {
                                                                      +  }
                                                                      +
                                                                      +
                                                                      +  ngOnChanges(changes: SimpleChanges): void {
                                                                      +    if (changes.config && changes.config.currentValue?.mouseSlidingDisabled !== changes.config.previousValue?.mouseSlidingDisabled) {
                                                                      +      changes.config.currentValue.mouseSlidingDisabled ? this._unsubscribe() : this._subscribe();
                                                                      +    }
                                                                      +    if (!changes.adapter?.firstChange && changes.adapter?.currentValue !== changes.adapter?.previousValue) {
                                                                      +      this._subscribe();
                                                                      +    }
                                                                      +  }
                                                                      +
                                                                      +  ngOnDestroy(): void {
                                                                      +    this._unsubscribe();
                                                                      +  }
                                                                      +
                                                                      +  private _subscribe(): void {
                                                                      +    this._unsubscribe();
                                                                      +
                                                                      +    if (!this._platform.ANDROID && !this._platform.IOS && typeof Hammer !== 'undefined') {
                                                                      +      this._zone.runOutsideAngular(() => {
                                                                      +
                                                                      +        const direction: number = this.adapter.hammerDirection;
                                                                      +        this._hammer = new Hammer(this._el.nativeElement, { inputClass: Hammer.MouseInput });
                                                                      +        this._hammer.get('pan').set({ direction });
                                                                      +
                                                                      +        let offset: number;
                                                                      +
                                                                      +        // Set panOffset for sliding on pan start event
                                                                      +        this._hammer.on('panstart', () => {
                                                                      +          this._zone.run(() => {
                                                                      +            this.isSlidingChange.emit(true);
                                                                      +          });
                                                                      +
                                                                      +          offset = this.adapter.scrollValue;
                                                                      +          this._viewport.classList.add('g-sliding');
                                                                      +          this._viewport.style.setProperty('--slider-scroll-snap-type', 'none');
                                                                      +        });
                                                                      +
                                                                      +        this._hammer.on('panmove', (e: any) => this._viewport.scrollTo(this.adapter.getHammerValue(offset, e, 'auto')));
                                                                      +
                                                                      +        this._hammer.on('panend', (e: any) => {
                                                                      +          this._document.onselectstart = null;
                                                                      +          this._viewport.classList.remove('g-sliding');
                                                                      +          const index: number = this.getIndexOnMouseUp(e);
                                                                      +
                                                                      +          this._zone.run(() => {
                                                                      +            this.isSlidingChange.emit(false);
                                                                      +            this.activeIndexChange.emit(index);
                                                                      +          });
                                                                      +        });
                                                                      +      });
                                                                      +    }
                                                                      +  }
                                                                      +
                                                                      +  private _unsubscribe(): void {
                                                                      +    this._hammer?.destroy();
                                                                      +  }
                                                                      +
                                                                      +  private getIndexOnMouseUp(e: any): number {
                                                                      +    // Check if scrolled item is great enough to navigate
                                                                      +    const currElement: Element = this.items[this.state.currIndex].nativeElement;
                                                                      +
                                                                      +    // Find the gallery item element in the center elements
                                                                      +    const elementAtCenter: Element = this.getElementFromViewportCenter();
                                                                      +
                                                                      +    // Check if center item can be taken from element using
                                                                      +    if (elementAtCenter && elementAtCenter !== currElement) {
                                                                      +      return +elementAtCenter.getAttribute('galleryIndex');
                                                                      +    }
                                                                      +
                                                                      +    const velocity: number = this.adapter.getHammerVelocity(e);
                                                                      +    // Check if velocity is great enough to navigate
                                                                      +    if (Math.abs(velocity) > 0.3) {
                                                                      +      return velocity > 0 ? this.state.currIndex - 1 : this.state.currIndex + 1;
                                                                      +    }
                                                                      +
                                                                      +    // Reset position to the current index
                                                                      +    return -1;
                                                                      +  }
                                                                      +
                                                                      +  private getElementFromViewportCenter(): Element {
                                                                      +    // Get slider position relative to the document
                                                                      +    const sliderRect: DOMRect = this._viewport.getBoundingClientRect();
                                                                      +    // Try look for the center item using `elementsFromPoint` function
                                                                      +    const centerElements: Element[] = this._document.elementsFromPoint(
                                                                      +      sliderRect.x + (sliderRect.width / 2),
                                                                      +      sliderRect.y + (sliderRect.height / 2)
                                                                      +    );
                                                                      +    // Find the gallery item element in the center elements
                                                                      +    return centerElements.find((element: Element) => {
                                                                      +      return element.getAttribute('galleryId') === this.galleryId;
                                                                      +    });
                                                                      +  }
                                                                      +}
                                                                      +
                                                                      +
                                                                      + +
                                                                      + + + + + + + + + + + + + +
                                                                      +
                                                                      +

                                                                      results matching ""

                                                                      +
                                                                        +
                                                                        +
                                                                        +

                                                                        No results matching ""

                                                                        +
                                                                        +
                                                                        +
                                                                        + +
                                                                        +
                                                                        + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/documentation/directives/ImgRecognizer.html b/documentation/directives/ImgRecognizer.html new file mode 100644 index 00000000..d8bb51a4 --- /dev/null +++ b/documentation/directives/ImgRecognizer.html @@ -0,0 +1,608 @@ + + + + + + ng-gallery-project documentation + + + + + + + + + + + + + +
                                                                        +
                                                                        + + +
                                                                        +
                                                                        + + + + + + + + + + + +
                                                                        +
                                                                        +

                                                                        +

                                                                        File

                                                                        +

                                                                        +

                                                                        + projects/ng-gallery/src/lib/utils/img-recognizer.ts +

                                                                        + + + +

                                                                        +

                                                                        Implements

                                                                        +

                                                                        +

                                                                        + OnInit + OnDestroy +

                                                                        + + +
                                                                        +

                                                                        Metadata

                                                                        + + + + + + + + + + +
                                                                        + +
                                                                        +

                                                                        Index

                                                                        + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                                                        +
                                                                        Methods
                                                                        +
                                                                        + +
                                                                        +
                                                                        Inputs
                                                                        +
                                                                        + +
                                                                        +
                                                                        HostListeners
                                                                        +
                                                                        + +
                                                                        +
                                                                        + +
                                                                        +

                                                                        Constructor

                                                                        + + + + + + + + + + + + + +
                                                                        +constructor(el: ElementRef, manager: ImgManager, item: GalleryItemComponent) +
                                                                        + +
                                                                        +
                                                                        + Parameters : + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                                                        NameTypeOptional
                                                                        el + ElementRef<HTMLImageElement> + + No +
                                                                        manager + ImgManager + + No +
                                                                        item + GalleryItemComponent + + No +
                                                                        +
                                                                        +
                                                                        +
                                                                        + +
                                                                        +

                                                                        Inputs

                                                                        + + + + + + + + + + + + +
                                                                        + + galleryImage +
                                                                        + Type : number + +
                                                                        + +
                                                                        +
                                                                        + + +
                                                                        +

                                                                        HostListeners

                                                                        + + + + + + + + + + + + + + + +
                                                                        + + + + error + + + +
                                                                        + Arguments : '$event' +
                                                                        + +
                                                                        + + + + + + + + + + + + + + + + +
                                                                        + + + + load + + + +
                                                                        + Arguments : '$event' +
                                                                        + +
                                                                        +
                                                                        +
                                                                        + +

                                                                        + Methods +

                                                                        + + + + + + + + + + + + + + + + + + + +
                                                                        + + + ngOnDestroy + + +
                                                                        +ngOnDestroy() +
                                                                        + +
                                                                        + +
                                                                        + Returns : void + +
                                                                        +
                                                                        + + + + + + + + + + + + + + + + + + + +
                                                                        + + + ngOnInit + + +
                                                                        +ngOnInit() +
                                                                        + +
                                                                        + +
                                                                        + Returns : void + +
                                                                        +
                                                                        + + + + + + + + + + + + + + + + + + + + + + +
                                                                        + + + onError + + +
                                                                        +onError() +
                                                                        + Decorators : +
                                                                        + @HostListener('error', ['$event'])
                                                                        +
                                                                        + +
                                                                        + +
                                                                        + Returns : void + +
                                                                        +
                                                                        + + + + + + + + + + + + + + + + + + + + + + +
                                                                        + + + onLoad + + +
                                                                        +onLoad() +
                                                                        + Decorators : +
                                                                        + @HostListener('load', ['$event'])
                                                                        +
                                                                        + +
                                                                        + +
                                                                        + Returns : void + +
                                                                        +
                                                                        +
                                                                        + + +
                                                                        + + +
                                                                        +
                                                                        import { Directive, Input, HostListener, OnInit, OnDestroy, ElementRef } from '@angular/core';
                                                                        +import { ImgManager } from './img-manager';
                                                                        +import { GalleryItemComponent } from '../components/gallery-item.component';
                                                                        +
                                                                        +@Directive({
                                                                        +  selector: 'img[galleryImage]',
                                                                        +  standalone: true
                                                                        +})
                                                                        +export class ImgRecognizer implements OnInit, OnDestroy {
                                                                        +
                                                                        +  @Input('galleryImage') index: number;
                                                                        +
                                                                        +  @HostListener('load', ['$event'])
                                                                        +  onLoad() {
                                                                        +    this.item.state$.next('success');
                                                                        +  }
                                                                        +
                                                                        +  @HostListener('error', ['$event'])
                                                                        +  onError() {
                                                                        +    this.item.state$.next('failed');
                                                                        +  }
                                                                        +
                                                                        +  constructor(private el: ElementRef<HTMLImageElement>, private manager: ImgManager, private item: GalleryItemComponent) {
                                                                        +    if (item) {
                                                                        +      // Mark the gallery-item component as an image item
                                                                        +      item.isItemContainImage = true;
                                                                        +    } else {
                                                                        +      throw new Error('[NgGallery]: galleryImage directive should be only used inside gallery item templates!')
                                                                        +    }
                                                                        +  }
                                                                        +
                                                                        +  ngOnInit(): void {
                                                                        +    this.manager.addItem(this.index, {
                                                                        +      state: this.item.state$.asObservable(),
                                                                        +      target: this.el.nativeElement
                                                                        +    });
                                                                        +  }
                                                                        +
                                                                        +  ngOnDestroy(): void {
                                                                        +    this.manager.deleteItem(this.index);
                                                                        +  }
                                                                        +}
                                                                        +
                                                                        +
                                                                        + +
                                                                        + + + + + + + + + + + + + +
                                                                        +
                                                                        +

                                                                        results matching ""

                                                                        +
                                                                          +
                                                                          +
                                                                          +

                                                                          No results matching ""

                                                                          +
                                                                          +
                                                                          +
                                                                          + +
                                                                          +
                                                                          + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/documentation/directives/ItemIntersectionObserver.html b/documentation/directives/ItemIntersectionObserver.html new file mode 100644 index 00000000..8c3fca97 --- /dev/null +++ b/documentation/directives/ItemIntersectionObserver.html @@ -0,0 +1,755 @@ + + + + + + ng-gallery-project documentation + + + + + + + + + + + + + +
                                                                          +
                                                                          + + +
                                                                          +
                                                                          + + + + + + + + + + + +
                                                                          +
                                                                          +

                                                                          +

                                                                          File

                                                                          +

                                                                          +

                                                                          + projects/ng-gallery/src/lib/observers/item-intersection-observer.directive.ts +

                                                                          + + + +

                                                                          +

                                                                          Implements

                                                                          +

                                                                          +

                                                                          + OnChanges + OnDestroy +

                                                                          + + +
                                                                          +

                                                                          Metadata

                                                                          + + + + + + + + + + +
                                                                          + +
                                                                          +

                                                                          Index

                                                                          + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                                                          +
                                                                          Properties
                                                                          +
                                                                          + +
                                                                          +
                                                                          Methods
                                                                          +
                                                                          + +
                                                                          +
                                                                          Inputs
                                                                          +
                                                                          + +
                                                                          +
                                                                          Outputs
                                                                          +
                                                                          + +
                                                                          +
                                                                          Accessors
                                                                          +
                                                                          + +
                                                                          +
                                                                          + +
                                                                          +

                                                                          Constructor

                                                                          + + + + + + + + + + + + + +
                                                                          +constructor(_zone: NgZone, _item: GalleryItemComponent) +
                                                                          + +
                                                                          +
                                                                          + Parameters : + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                                                          NameTypeOptional
                                                                          _zone + NgZone + + No +
                                                                          _item + GalleryItemComponent + + No +
                                                                          +
                                                                          +
                                                                          +
                                                                          + +
                                                                          +

                                                                          Inputs

                                                                          + + + + + + + + + + + + +
                                                                          + + adapter +
                                                                          + Type : SliderAdapter + +
                                                                          + +
                                                                          + + + + + + + + + + + + +
                                                                          + + config +
                                                                          + Type : GalleryConfig + +
                                                                          + +
                                                                          + + + + + + + + + + + + +
                                                                          + + itemIntersectionObserverDisabled +
                                                                          + Type : boolean + +
                                                                          + +
                                                                          +
                                                                          +
                                                                          +

                                                                          Outputs

                                                                          + + + + + + + + + + + + +
                                                                          + + activeIndexChange +
                                                                          + Type : EventEmitter<number> + +
                                                                          + +
                                                                          +
                                                                          + + +
                                                                          + +

                                                                          + Methods +

                                                                          + + + + + + + + + + + + + + + + + + + +
                                                                          + + + Private + _subscribe + + +
                                                                          + + _subscribe() +
                                                                          + +
                                                                          + +
                                                                          + Returns : void + +
                                                                          +
                                                                          + + + + + + + + + + + + + + + + + + + +
                                                                          + + + Private + _unsubscribe + + +
                                                                          + + _unsubscribe() +
                                                                          + +
                                                                          + +
                                                                          + Returns : void + +
                                                                          +
                                                                          + + + + + + + + + + + + + + + + + + + +
                                                                          + + + ngOnChanges + + +
                                                                          +ngOnChanges() +
                                                                          + +
                                                                          + +
                                                                          + Returns : void + +
                                                                          +
                                                                          + + + + + + + + + + + + + + + + + + + +
                                                                          + + + ngOnDestroy + + +
                                                                          +ngOnDestroy() +
                                                                          + +
                                                                          + +
                                                                          + Returns : void + +
                                                                          +
                                                                          +
                                                                          +
                                                                          + +

                                                                          + Properties +

                                                                          + + + + + + + + + + + + + + +
                                                                          + + + Private + _currentSubscription + + +
                                                                          + Type : Subscription + +
                                                                          + +
                                                                          + + + + + + + + + + + + + + + + + +
                                                                          + + + Private + _sensor + + +
                                                                          + Type : ActiveItemObserver + +
                                                                          + Default value : new ActiveItemObserver() +
                                                                          + +
                                                                          +
                                                                          + +
                                                                          +

                                                                          + Accessors +

                                                                          + + + + + + + + + + + + + + +
                                                                          + + _viewport +
                                                                          + get_viewport() +
                                                                          + +
                                                                          +
                                                                          + +
                                                                          + + +
                                                                          +
                                                                          import { Directive, Input, Output, OnChanges, OnDestroy, NgZone, EventEmitter } from '@angular/core';
                                                                          +import { Subscription, combineLatest, filter, switchMap } from 'rxjs';
                                                                          +import { GalleryConfig } from '../models/config.model';
                                                                          +import { ActiveItemObserver } from './active-item-observer';
                                                                          +import { resizeObservable } from '../utils/resize-observer';
                                                                          +import { SliderAdapter } from '../components/adapters';
                                                                          +import { GalleryItemComponent } from '../components/gallery-item.component';
                                                                          +import { ItemState } from '../components/templates/items.model';
                                                                          +
                                                                          +@Directive({
                                                                          +  selector: '[itemIntersectionObserver]',
                                                                          +  standalone: true
                                                                          +})
                                                                          +export class ItemIntersectionObserver implements OnChanges, OnDestroy {
                                                                          +
                                                                          +  private _currentSubscription: Subscription;
                                                                          +
                                                                          +  private _sensor: ActiveItemObserver = new ActiveItemObserver();
                                                                          +
                                                                          +  private get _viewport(): HTMLElement {
                                                                          +    return this._item.nativeElement.parentElement.parentElement;
                                                                          +  }
                                                                          +
                                                                          +  @Input() adapter: SliderAdapter;
                                                                          +
                                                                          +  @Input() config: GalleryConfig;
                                                                          +
                                                                          +  @Input('itemIntersectionObserverDisabled') disabled: boolean;
                                                                          +
                                                                          +  @Output() activeIndexChange: EventEmitter<number> = new EventEmitter<number>();
                                                                          +
                                                                          +  constructor(private _zone: NgZone, private _item: GalleryItemComponent) {
                                                                          +  }
                                                                          +
                                                                          +  ngOnChanges(): void {
                                                                          +    (this.config.itemAutosize && !this.disabled) ? this._subscribe() : this._unsubscribe();
                                                                          +  }
                                                                          +
                                                                          +  ngOnDestroy(): void {
                                                                          +    this._unsubscribe();
                                                                          +  }
                                                                          +
                                                                          +  private _subscribe(): void {
                                                                          +    this._unsubscribe();
                                                                          +
                                                                          +    if (!!this.adapter) {
                                                                          +      this._zone.runOutsideAngular(() => {
                                                                          +        this._currentSubscription = combineLatest([
                                                                          +          resizeObservable(this._viewport),
                                                                          +          resizeObservable(this._item.nativeElement)
                                                                          +        ]).pipe(
                                                                          +          switchMap(() => this._item.state$),
                                                                          +          filter((state: ItemState) => state !== 'loading'),
                                                                          +          switchMap(() => {
                                                                          +            const rootMargin: string = this.adapter.getElementRootMargin(this._viewport, this._item.nativeElement);
                                                                          +            if (this.config.debug) {
                                                                          +              this._item.nativeElement.style.setProperty('--item-intersection-margin', `"VIEWPORT(${ this._viewport.clientWidth }x${ this._viewport.clientHeight }) ITEM(${ this._item.nativeElement.clientWidth }x${ this._item.nativeElement.clientHeight }) INTERSECTION(${ rootMargin })"`);
                                                                          +            }
                                                                          +
                                                                          +            return this._sensor.observe(
                                                                          +              this._viewport,
                                                                          +              [this._item.nativeElement],
                                                                          +              rootMargin
                                                                          +            );
                                                                          +          }
                                                                          +          )
                                                                          +        ).subscribe((index: number) => {
                                                                          +          this._zone.run(() => this.activeIndexChange.emit(index));
                                                                          +        });
                                                                          +      });
                                                                          +    }
                                                                          +  }
                                                                          +
                                                                          +  private _unsubscribe(): void {
                                                                          +    this._currentSubscription?.unsubscribe();
                                                                          +  }
                                                                          +}
                                                                          +
                                                                          +
                                                                          + +
                                                                          + + + + + + + + + + + + + +
                                                                          +
                                                                          +

                                                                          results matching ""

                                                                          +
                                                                            +
                                                                            +
                                                                            +

                                                                            No results matching ""

                                                                            +
                                                                            +
                                                                            +
                                                                            + +
                                                                            +
                                                                            + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/documentation/directives/LightboxDirective.html b/documentation/directives/LightboxDirective.html new file mode 100644 index 00000000..61c959d7 --- /dev/null +++ b/documentation/directives/LightboxDirective.html @@ -0,0 +1,508 @@ + + + + + + ng-gallery-project documentation + + + + + + + + + + + + + +
                                                                            +
                                                                            + + +
                                                                            +
                                                                            + + + + + + + + + + + +
                                                                            +
                                                                            +

                                                                            +

                                                                            File

                                                                            +

                                                                            +

                                                                            + projects/ng-gallery/lightbox/src/lightbox.directive.ts +

                                                                            + + + +

                                                                            +

                                                                            Implements

                                                                            +

                                                                            +

                                                                            + OnInit + OnDestroy +

                                                                            + + +
                                                                            +

                                                                            Metadata

                                                                            + + + + + + + + + + +
                                                                            + +
                                                                            +

                                                                            Index

                                                                            + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                                                            +
                                                                            Properties
                                                                            +
                                                                            + +
                                                                            +
                                                                            Methods
                                                                            +
                                                                            + +
                                                                            +
                                                                            Inputs
                                                                            +
                                                                            + +
                                                                            +
                                                                            + +
                                                                            +

                                                                            Constructor

                                                                            + + + + + + + + + + + + + +
                                                                            +constructor(_lightbox: Lightbox, _el: ElementRef, _renderer: Renderer2) +
                                                                            + +
                                                                            +
                                                                            + Parameters : + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                                                            NameTypeOptional
                                                                            _lightbox + Lightbox + + No +
                                                                            _el + ElementRef + + No +
                                                                            _renderer + Renderer2 + + No +
                                                                            +
                                                                            +
                                                                            +
                                                                            + +
                                                                            +

                                                                            Inputs

                                                                            + + + + + + + + + + + + + + + +
                                                                            + + gallery +
                                                                            + Type : string + +
                                                                            + Default value : 'root' +
                                                                            + +
                                                                            + + + + + + + + + + + + + + + +
                                                                            + + lightbox +
                                                                            + Type : number + +
                                                                            + Default value : 0 +
                                                                            + +
                                                                            +
                                                                            + + + +
                                                                            + +

                                                                            + Methods +

                                                                            + + + + + + + + + + + + + + + + + + + +
                                                                            + + + ngOnDestroy + + +
                                                                            +ngOnDestroy() +
                                                                            + +
                                                                            + +
                                                                            + Returns : void + +
                                                                            +
                                                                            + + + + + + + + + + + + + + + + + + + +
                                                                            + + + ngOnInit + + +
                                                                            +ngOnInit() +
                                                                            + +
                                                                            + +
                                                                            + Returns : void + +
                                                                            +
                                                                            +
                                                                            +
                                                                            + +

                                                                            + Properties +

                                                                            + + + + + + + + + + + + + + + + + +
                                                                            + + + clickEvent + + +
                                                                            + Type : SubscriptionLike + +
                                                                            + Default value : Subscription.EMPTY +
                                                                            + +
                                                                            +
                                                                            + + +
                                                                            + + +
                                                                            +
                                                                            import { Directive, Input, ElementRef, OnInit, OnDestroy, Renderer2 } from '@angular/core';
                                                                            +import { fromEvent, tap, SubscriptionLike, Subscription } from 'rxjs';
                                                                            +import { Lightbox } from './lightbox.service';
                                                                            +
                                                                            +@Directive({
                                                                            +  selector: '[lightbox]',
                                                                            +  standalone: true
                                                                            +})
                                                                            +export class LightboxDirective implements OnInit, OnDestroy {
                                                                            +
                                                                            +  clickEvent: SubscriptionLike = Subscription.EMPTY;
                                                                            +
                                                                            +  @Input('lightbox') index = 0;
                                                                            +  @Input('gallery') id = 'root';
                                                                            +
                                                                            +  constructor(private _lightbox: Lightbox, private _el: ElementRef, private _renderer: Renderer2) {
                                                                            +  }
                                                                            +
                                                                            +  ngOnInit() {
                                                                            +    this._renderer.setStyle(this._el.nativeElement, 'cursor', 'pointer');
                                                                            +    this.clickEvent = fromEvent(this._el.nativeElement, 'click').pipe(
                                                                            +      tap(() => this._lightbox.open(this.index, this.id))
                                                                            +    ).subscribe();
                                                                            +  }
                                                                            +
                                                                            +  ngOnDestroy() {
                                                                            +    this.clickEvent.unsubscribe();
                                                                            +  }
                                                                            +}
                                                                            +
                                                                            +
                                                                            + +
                                                                            + + + + + + + + + + + + + +
                                                                            +
                                                                            +

                                                                            results matching ""

                                                                            +
                                                                              +
                                                                              +
                                                                              +

                                                                              No results matching ""

                                                                              +
                                                                              +
                                                                              +
                                                                              + +
                                                                              +
                                                                              + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/documentation/directives/SliderIntersectionObserver.html b/documentation/directives/SliderIntersectionObserver.html new file mode 100644 index 00000000..f7331230 --- /dev/null +++ b/documentation/directives/SliderIntersectionObserver.html @@ -0,0 +1,770 @@ + + + + + + ng-gallery-project documentation + + + + + + + + + + + + + +
                                                                              +
                                                                              + + +
                                                                              +
                                                                              + + + + + + + + + + + +
                                                                              +
                                                                              +

                                                                              +

                                                                              File

                                                                              +

                                                                              +

                                                                              + projects/ng-gallery/src/lib/observers/slider-intersection-observer.directive.ts +

                                                                              + + + +

                                                                              +

                                                                              Implements

                                                                              +

                                                                              +

                                                                              + OnChanges + OnDestroy +

                                                                              + + +
                                                                              +

                                                                              Metadata

                                                                              + + + + + + + + + + +
                                                                              + +
                                                                              +

                                                                              Index

                                                                              + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                                                              +
                                                                              Properties
                                                                              +
                                                                              + +
                                                                              +
                                                                              Methods
                                                                              +
                                                                              + +
                                                                              +
                                                                              Inputs
                                                                              +
                                                                              + +
                                                                              +
                                                                              Outputs
                                                                              +
                                                                              + +
                                                                              +
                                                                              Accessors
                                                                              +
                                                                              + +
                                                                              +
                                                                              + +
                                                                              +

                                                                              Constructor

                                                                              + + + + + + + + + + + + + +
                                                                              +constructor(_zone: NgZone, _el: ElementRef) +
                                                                              + +
                                                                              +
                                                                              + Parameters : + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                                                              NameTypeOptional
                                                                              _zone + NgZone + + No +
                                                                              _el + ElementRef<HTMLElement> + + No +
                                                                              +
                                                                              +
                                                                              +
                                                                              + +
                                                                              +

                                                                              Inputs

                                                                              + + + + + + + + + + + + +
                                                                              + + adapter +
                                                                              + Type : SliderAdapter + +
                                                                              + +
                                                                              + + + + + + + + + + + + +
                                                                              + + config +
                                                                              + Type : GalleryConfig + +
                                                                              + +
                                                                              + + + + + + + + + + + + +
                                                                              + + items +
                                                                              + Type : GalleryItemComponent[] + +
                                                                              + +
                                                                              + + + + + + + + + + + + +
                                                                              + + sliderIntersectionObserverDisabled +
                                                                              + Type : boolean + +
                                                                              + +
                                                                              +
                                                                              +
                                                                              +

                                                                              Outputs

                                                                              + + + + + + + + + + + + +
                                                                              + + activeIndexChange +
                                                                              + Type : EventEmitter<number> + +
                                                                              + +
                                                                              +
                                                                              + + +
                                                                              + +

                                                                              + Methods +

                                                                              + + + + + + + + + + + + + + + + + + + +
                                                                              + + + Private + _subscribe + + +
                                                                              + + _subscribe() +
                                                                              + +
                                                                              + +
                                                                              + Returns : void + +
                                                                              +
                                                                              + + + + + + + + + + + + + + + + + + + +
                                                                              + + + Private + _unsubscribe + + +
                                                                              + + _unsubscribe() +
                                                                              + +
                                                                              + +
                                                                              + Returns : void + +
                                                                              +
                                                                              + + + + + + + + + + + + + + + + + + + +
                                                                              + + + ngOnChanges + + +
                                                                              +ngOnChanges() +
                                                                              + +
                                                                              + +
                                                                              + Returns : void + +
                                                                              +
                                                                              + + + + + + + + + + + + + + + + + + + +
                                                                              + + + ngOnDestroy + + +
                                                                              +ngOnDestroy() +
                                                                              + +
                                                                              + +
                                                                              + Returns : void + +
                                                                              +
                                                                              +
                                                                              +
                                                                              + +

                                                                              + Properties +

                                                                              + + + + + + + + + + + + + + +
                                                                              + + + Private + _currentSubscription + + +
                                                                              + Type : Subscription + +
                                                                              + +
                                                                              + + + + + + + + + + + + + + + + + +
                                                                              + + + Private + _sensor + + +
                                                                              + Type : ActiveItemObserver + +
                                                                              + Default value : new ActiveItemObserver() +
                                                                              + +
                                                                              +
                                                                              + +
                                                                              +

                                                                              + Accessors +

                                                                              + + + + + + + + + + + + + + +
                                                                              + + _viewport +
                                                                              + get_viewport() +
                                                                              + +
                                                                              +
                                                                              + +
                                                                              + + +
                                                                              +
                                                                              import { Directive, Input, Output, OnChanges, OnDestroy, NgZone, ElementRef, EventEmitter } from '@angular/core';
                                                                              +import { skip, Subscription } from 'rxjs';
                                                                              +import { GalleryConfig } from '../models/config.model';
                                                                              +import { ActiveItemObserver } from './active-item-observer';
                                                                              +import { SliderAdapter } from '../components/adapters';
                                                                              +import { GalleryItemComponent } from '../components/gallery-item.component';
                                                                              +
                                                                              +@Directive({
                                                                              +  selector: '[sliderIntersectionObserver]',
                                                                              +  standalone: true
                                                                              +})
                                                                              +export class SliderIntersectionObserver implements OnChanges, OnDestroy {
                                                                              +
                                                                              +  private _currentSubscription: Subscription;
                                                                              +
                                                                              +  private _sensor: ActiveItemObserver = new ActiveItemObserver();
                                                                              +
                                                                              +  private get _viewport(): HTMLElement {
                                                                              +    return this._el.nativeElement;
                                                                              +  }
                                                                              +
                                                                              +  @Input() adapter: SliderAdapter;
                                                                              +
                                                                              +  @Input() items: GalleryItemComponent[];
                                                                              +
                                                                              +  @Input() config: GalleryConfig;
                                                                              +
                                                                              +  @Input('sliderIntersectionObserverDisabled') disabled: boolean;
                                                                              +
                                                                              +  @Output() activeIndexChange: EventEmitter<number> = new EventEmitter<number>();
                                                                              +
                                                                              +  constructor(private _zone: NgZone, private _el: ElementRef<HTMLElement>) {
                                                                              +  }
                                                                              +
                                                                              +  ngOnChanges(): void {
                                                                              +    (this.config.itemAutosize || this.disabled) ? this._unsubscribe() : this._subscribe();
                                                                              +  }
                                                                              +
                                                                              +  ngOnDestroy(): void {
                                                                              +    this._unsubscribe();
                                                                              +  }
                                                                              +
                                                                              +  private _subscribe(): void {
                                                                              +    this._unsubscribe();
                                                                              +
                                                                              +    if (!!this.adapter && !!this.items?.length) {
                                                                              +      const rootMargin: string = this.adapter.getRootMargin();
                                                                              +      if (this.config.debug) {
                                                                              +        this._viewport.style.setProperty('--intersection-margin', `"INTERSECTION(${ rootMargin })"`);
                                                                              +      }
                                                                              +
                                                                              +      this._zone.runOutsideAngular(() => {
                                                                              +        this._currentSubscription = this._sensor.observe(
                                                                              +          this._viewport,
                                                                              +          this.items.map((item: GalleryItemComponent) => item.nativeElement),
                                                                              +          rootMargin
                                                                              +        ).subscribe((index: number) => {
                                                                              +          console.log('⛩️', index)
                                                                              +          this._zone.run(() => this.activeIndexChange.emit(index));
                                                                              +        });
                                                                              +      });
                                                                              +    }
                                                                              +  }
                                                                              +
                                                                              +  private _unsubscribe(): void {
                                                                              +    this._currentSubscription?.unsubscribe();
                                                                              +  }
                                                                              +}
                                                                              +
                                                                              +
                                                                              + +
                                                                              + + + + + + + + + + + + + +
                                                                              +
                                                                              +

                                                                              results matching ""

                                                                              +
                                                                                +
                                                                                +
                                                                                +

                                                                                No results matching ""

                                                                                +
                                                                                +
                                                                                +
                                                                                + +
                                                                                +
                                                                                + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/documentation/directives/SliderResizeObserver.html b/documentation/directives/SliderResizeObserver.html new file mode 100644 index 00000000..4a7aeede --- /dev/null +++ b/documentation/directives/SliderResizeObserver.html @@ -0,0 +1,1383 @@ + + + + + + ng-gallery-project documentation + + + + + + + + + + + + + +
                                                                                +
                                                                                + + +
                                                                                +
                                                                                + + + + + + + + + + + +
                                                                                +
                                                                                +

                                                                                +

                                                                                File

                                                                                +

                                                                                +

                                                                                + projects/ng-gallery/src/lib/observers/slider-resize-observer.directive.ts +

                                                                                + + + +

                                                                                +

                                                                                Implements

                                                                                +

                                                                                +

                                                                                + AfterViewChecked + OnChanges + OnInit + OnDestroy +

                                                                                + + +
                                                                                +

                                                                                Metadata

                                                                                + + + + + + + + + + +
                                                                                + +
                                                                                +

                                                                                Index

                                                                                + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                                                                +
                                                                                Properties
                                                                                +
                                                                                + +
                                                                                +
                                                                                Methods
                                                                                +
                                                                                + +
                                                                                +
                                                                                Inputs
                                                                                +
                                                                                + +
                                                                                +
                                                                                Outputs
                                                                                +
                                                                                + +
                                                                                +
                                                                                Accessors
                                                                                +
                                                                                + +
                                                                                +
                                                                                + +
                                                                                +

                                                                                Constructor

                                                                                + + + + + + + + + + + + + +
                                                                                +constructor(_el: ElementRef, _zone: NgZone, _gallery: Gallery, _imgManager: ImgManager) +
                                                                                + +
                                                                                +
                                                                                + Parameters : + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                                                                NameTypeOptional
                                                                                _el + ElementRef<HTMLElement> + + No +
                                                                                _zone + NgZone + + No +
                                                                                _gallery + Gallery + + No +
                                                                                _imgManager + ImgManager + + No +
                                                                                +
                                                                                +
                                                                                +
                                                                                + +
                                                                                +

                                                                                Inputs

                                                                                + + + + + + + + + + + + +
                                                                                + + adapter +
                                                                                + Type : SliderAdapter + +
                                                                                + +
                                                                                + + + + + + + + + + + + +
                                                                                + + config +
                                                                                + Type : GalleryConfig + +
                                                                                + +
                                                                                + + + + + + + + + + + + +
                                                                                + + galleryId +
                                                                                + Type : string + +
                                                                                + +
                                                                                +
                                                                                +
                                                                                +

                                                                                Outputs

                                                                                + + + + + + + + + + + + +
                                                                                + + isResizingChange +
                                                                                + Type : EventEmitter<boolean> + +
                                                                                + +
                                                                                +
                                                                                + + +
                                                                                + +

                                                                                + Methods +

                                                                                + + + + + + + + + + + + + + + + + + + +
                                                                                + + + Private + _subscribeAutoHeight + + +
                                                                                + + _subscribeAutoHeight() +
                                                                                + +
                                                                                + +
                                                                                + Returns : void + +
                                                                                +
                                                                                + + + + + + + + + + + + + + + + + + + +
                                                                                + + + Private + _unsubscribeAutoHeight + + +
                                                                                + + _unsubscribeAutoHeight() +
                                                                                + +
                                                                                + +
                                                                                + Returns : void + +
                                                                                +
                                                                                + + + + + + + + + + + + + + + + + + + +
                                                                                + + + ngAfterViewChecked + + +
                                                                                +ngAfterViewChecked() +
                                                                                + +
                                                                                + +
                                                                                + Returns : void + +
                                                                                +
                                                                                + + + + + + + + + + + + + + + + + + + +
                                                                                + + + ngOnChanges + + +
                                                                                +ngOnChanges() +
                                                                                + +
                                                                                + +
                                                                                + Returns : void + +
                                                                                +
                                                                                + + + + + + + + + + + + + + + + + + + +
                                                                                + + + ngOnDestroy + + +
                                                                                +ngOnDestroy() +
                                                                                + +
                                                                                + +
                                                                                + Returns : void + +
                                                                                +
                                                                                + + + + + + + + + + + + + + + + + + + +
                                                                                + + + ngOnInit + + +
                                                                                +ngOnInit() +
                                                                                + +
                                                                                + +
                                                                                + Returns : void + +
                                                                                +
                                                                                + + + + + + + + + + + + + + + + + + + +
                                                                                + + + Private + resetResizingState + + +
                                                                                + + resetResizingState(undefined: literal type) +
                                                                                + +
                                                                                + +
                                                                                + Parameters : + + + + + + + + + + + + + + + + + + + + +
                                                                                NameTypeOptionalDefault value
                                                                                + literal type + + No + + {} +
                                                                                +
                                                                                +
                                                                                +
                                                                                +
                                                                                + Returns : void + +
                                                                                +
                                                                                + +
                                                                                +
                                                                                + + + + + + + + + + + + + + + + + + + +
                                                                                + + + Private + setResizingState + + +
                                                                                + + setResizingState(undefined: literal type) +
                                                                                + +
                                                                                + +
                                                                                + Parameters : + + + + + + + + + + + + + + + + + + + + +
                                                                                NameTypeOptionalDefault value
                                                                                + literal type + + No + + {} +
                                                                                +
                                                                                +
                                                                                +
                                                                                +
                                                                                + Returns : void + +
                                                                                +
                                                                                + +
                                                                                +
                                                                                + + + + + + + + + + + + + + + + + + + +
                                                                                + + + Private + updateCentralizeCSSVariables + + +
                                                                                + + updateCentralizeCSSVariables() +
                                                                                + +
                                                                                + +
                                                                                + Returns : void + +
                                                                                +
                                                                                + + + + + + + + + + + + + + + + + + + +
                                                                                + + + Private + updateSliderSize + + +
                                                                                + + updateSliderSize() +
                                                                                + +
                                                                                + +
                                                                                + Returns : void + +
                                                                                +
                                                                                +
                                                                                +
                                                                                + +

                                                                                + Properties +

                                                                                + + + + + + + + + + + + + + +
                                                                                + + + Private + _afterHeightChanged$ + + +
                                                                                + Type : Observable<any> + +
                                                                                + +
                                                                                + + + + + + + + + + + + + + +
                                                                                + + + Private + _autoHeightSubscription + + +
                                                                                + Type : Subscription + +
                                                                                + +
                                                                                + + + + + + + + + + + + + + +
                                                                                + + + Private + _resizeObserver + + +
                                                                                + Type : ResizeObserver + +
                                                                                + +
                                                                                + + + + + + + + + + + + + + +
                                                                                + + + Private + _resizeSubscription + + +
                                                                                + Type : Subscription + +
                                                                                + +
                                                                                + + + + + + + + + + + + + + +
                                                                                + + + Private + _shouldSkip + + +
                                                                                + Type : boolean + +
                                                                                + +
                                                                                +
                                                                                + +
                                                                                +

                                                                                + Accessors +

                                                                                + + + + + + + + + + + + + + +
                                                                                + + _viewport +
                                                                                + get_viewport() +
                                                                                + +
                                                                                + + + + + + + + + + + + + + +
                                                                                + + _galleryCore +
                                                                                + get_galleryCore() +
                                                                                + +
                                                                                + + + + + + + + + + + + + + +
                                                                                + + _isAutoHeight +
                                                                                + get_isAutoHeight() +
                                                                                + +
                                                                                +
                                                                                + +
                                                                                + + +
                                                                                +
                                                                                import {
                                                                                +  Directive,
                                                                                +  Input,
                                                                                +  Output,
                                                                                +  NgZone,
                                                                                +  ElementRef,
                                                                                +  AfterViewChecked,
                                                                                +  OnInit,
                                                                                +  OnChanges,
                                                                                +  OnDestroy,
                                                                                +  EventEmitter
                                                                                +} from '@angular/core';
                                                                                +import {
                                                                                +  Observable,
                                                                                +  Subscription,
                                                                                +  of,
                                                                                +  tap,
                                                                                +  take,
                                                                                +  filter,
                                                                                +  fromEvent,
                                                                                +  switchMap,
                                                                                +  debounceTime,
                                                                                +  firstValueFrom,
                                                                                +  distinctUntilChanged,
                                                                                +  EMPTY,
                                                                                +  animationFrameScheduler
                                                                                +} from 'rxjs';
                                                                                +import { ImgManager } from '../utils/img-manager';
                                                                                +import { resizeObservable } from '../utils/resize-observer';
                                                                                +import { SliderAdapter } from '../components/adapters';
                                                                                +import { Gallery } from '../services/gallery.service';
                                                                                +import { GalleryRef } from '../services/gallery-ref';
                                                                                +import { GalleryConfig } from '../models/config.model';
                                                                                +import { GalleryState } from 'ng-gallery';
                                                                                +
                                                                                +@Directive({
                                                                                +  selector: '[sliderResizeObserver]',
                                                                                +  standalone: true
                                                                                +})
                                                                                +export class SliderResizeObserver implements AfterViewChecked, OnChanges, OnInit, OnDestroy {
                                                                                +
                                                                                +  private _resizeObserver: ResizeObserver;
                                                                                +
                                                                                +  private _autoHeightSubscription: Subscription;
                                                                                +
                                                                                +  private _resizeSubscription: Subscription;
                                                                                +
                                                                                +  private _shouldSkip: boolean;
                                                                                +
                                                                                +  // Stream that emits after the transition to the new height is completed
                                                                                +  private _afterHeightChanged$: Observable<any>;
                                                                                +
                                                                                +  private get _viewport(): HTMLElement {
                                                                                +    return this._el.nativeElement;
                                                                                +  }
                                                                                +
                                                                                +  private get _galleryCore(): HTMLElement {
                                                                                +    return this._el.nativeElement.parentElement.parentElement.parentElement;
                                                                                +  }
                                                                                +
                                                                                +  private get _isAutoHeight(): boolean {
                                                                                +    return this.config.autoHeight &&
                                                                                +      !this.config.itemAutosize &&
                                                                                +      this.config.slidingDirection === 'horizontal' &&
                                                                                +      (this.config.thumbPosition === 'top' || this.config.thumbPosition === 'bottom');
                                                                                +  }
                                                                                +
                                                                                +  @Input() galleryId: string;
                                                                                +
                                                                                +  @Input() adapter: SliderAdapter;
                                                                                +
                                                                                +  @Input() config: GalleryConfig;
                                                                                +
                                                                                +  @Output() isResizingChange: EventEmitter<boolean> = new EventEmitter<boolean>();
                                                                                +
                                                                                +  constructor(private _el: ElementRef<HTMLElement>,
                                                                                +              private _zone: NgZone,
                                                                                +              private _gallery: Gallery,
                                                                                +              private _imgManager: ImgManager) {
                                                                                +  }
                                                                                +
                                                                                +  ngOnInit(): void {
                                                                                +    const galleryRef: GalleryRef = this._gallery.ref(this.galleryId);
                                                                                +
                                                                                +    // Check if height has transition for the auto-height feature
                                                                                +    const transitionDuration: string = getComputedStyle(this._viewport).getPropertyValue('transition-duration');
                                                                                +    if (parseFloat(transitionDuration) === 0) {
                                                                                +      this._afterHeightChanged$ = of(null);
                                                                                +    } else {
                                                                                +      this._afterHeightChanged$ = fromEvent(this._viewport, 'transitionend');
                                                                                +    }
                                                                                +
                                                                                +    this._zone.runOutsideAngular(() => {
                                                                                +
                                                                                +      // Detect if the size of the slider has changed detecting current index on scroll
                                                                                +      this._resizeSubscription = resizeObservable(this._viewport, (observer: ResizeObserver) => this._resizeObserver = observer).pipe(
                                                                                +        // Check if resize should skip due to re-observing the slider
                                                                                +        filter(() => !this._shouldSkip || !(this._shouldSkip = false)),
                                                                                +        // Immediately set visibility to hidden to avoid changing the active item caused by appearance of other items when size is expanded
                                                                                +        tap(() => this.setResizingState()),
                                                                                +        debounceTime(this.config.resizeDebounceTime, animationFrameScheduler),
                                                                                +        tap(async (entry: ResizeObserverEntry) => {
                                                                                +          // Update CSS variables with the proper values
                                                                                +          this.updateSliderSize();
                                                                                +
                                                                                +          if (this._isAutoHeight) {
                                                                                +            const img: HTMLImageElement = await firstValueFrom(this._imgManager.getActiveItem(galleryRef.state));
                                                                                +            // If img height is identical to the viewport height then skip
                                                                                +            if (img.height === this._viewport.clientHeight) {
                                                                                +              this.resetResizingState();
                                                                                +            } else {
                                                                                +              // Unobserve the slider while the height is being changed
                                                                                +              this.setResizingState({ unobserve: true });
                                                                                +              // Change the height
                                                                                +              this._galleryCore.style.setProperty('--slider-height', `${ img.height }px`);
                                                                                +              // Wait until height transition ends
                                                                                +              await firstValueFrom(this._afterHeightChanged$);
                                                                                +              this.resetResizingState({
                                                                                +                // Mark to skip first emit after re-observing the slider if height content rect height and client height are identical
                                                                                +                shouldSkip: entry.contentRect.height === this._viewport.clientHeight,
                                                                                +                observe: true
                                                                                +              });
                                                                                +            }
                                                                                +          } else {
                                                                                +            requestAnimationFrame(() => this.resetResizingState({ shouldSkip: true }));
                                                                                +          }
                                                                                +        })
                                                                                +      ).subscribe();
                                                                                +    });
                                                                                +  }
                                                                                +
                                                                                +  ngOnChanges(): void {
                                                                                +    this._isAutoHeight ? this._subscribeAutoHeight() : this._unsubscribeAutoHeight();
                                                                                +  }
                                                                                +
                                                                                +  ngOnDestroy(): void {
                                                                                +    this._resizeSubscription?.unsubscribe();
                                                                                +    this._unsubscribeAutoHeight();
                                                                                +  }
                                                                                +
                                                                                +  ngAfterViewChecked(): void {
                                                                                +    this.updateSliderSize();
                                                                                +  }
                                                                                +
                                                                                +  private updateSliderSize(): void {
                                                                                +    // Update slider width and height CSS variables
                                                                                +    this._galleryCore.style.setProperty('--slider-width', `${ this._viewport.clientWidth }px`);
                                                                                +
                                                                                +    // Only update height if auto-height is false, because when it's true, another function will take care of it
                                                                                +    if (!this.config.autoHeight) {
                                                                                +      this._galleryCore.style.setProperty('--slider-height', `${ this._viewport.clientHeight }px`);
                                                                                +    }
                                                                                +
                                                                                +    this.updateCentralizeCSSVariables();
                                                                                +  }
                                                                                +
                                                                                +  private updateCentralizeCSSVariables(): void {
                                                                                +    if (this.config.itemAutosize) {
                                                                                +      this._galleryCore.style.setProperty('--slider-centralize-start-size', `${ this.adapter.getCentralizerStartSize() }px`);
                                                                                +      this._galleryCore.style.setProperty('--slider-centralize-end-size', `${ this.adapter.getCentralizerEndSize() }px`);
                                                                                +    }
                                                                                +  }
                                                                                +
                                                                                +  private _subscribeAutoHeight(): void {
                                                                                +    this._unsubscribeAutoHeight();
                                                                                +
                                                                                +    this._shouldSkip = false;
                                                                                +    this._zone.runOutsideAngular(() => {
                                                                                +
                                                                                +      const galleryRef: GalleryRef = this._gallery.ref(this.galleryId);
                                                                                +
                                                                                +      // TODO: Why is galleryRef.state emits when screen size changes?
                                                                                +      const state: Observable<GalleryState> = galleryRef.state.pipe(distinctUntilChanged((a: GalleryState, b: GalleryState) => a.currIndex === b.currIndex))
                                                                                +      this._autoHeightSubscription = this._imgManager.getActiveItem(state).pipe(
                                                                                +        switchMap((img: HTMLImageElement) => {
                                                                                +          this.setResizingState({ unobserve: true });
                                                                                +          this._galleryCore.style.setProperty('--slider-height', `${ img.clientHeight }px`);
                                                                                +
                                                                                +          // Check if the new item height is equal to the current height, there will be no transition,
                                                                                +          // So reset resizing state
                                                                                +          if (img.height === this._viewport.clientHeight) {
                                                                                +            this.resetResizingState({ shouldSkip: true, observe: true });
                                                                                +            return EMPTY;
                                                                                +          }
                                                                                +          return this._afterHeightChanged$.pipe(
                                                                                +            tap(() => this.resetResizingState({ shouldSkip: true, observe: true })),
                                                                                +            take(1)
                                                                                +          );
                                                                                +        })
                                                                                +      ).subscribe();
                                                                                +    });
                                                                                +  }
                                                                                +
                                                                                +  private _unsubscribeAutoHeight(): void {
                                                                                +    this._autoHeightSubscription?.unsubscribe();
                                                                                +  }
                                                                                +
                                                                                +  private setResizingState({ unobserve }: { unobserve?: boolean } = {}): void {
                                                                                +    this._zone.run(() => {
                                                                                +      this.isResizingChange.emit(true);
                                                                                +    })
                                                                                +    this._viewport.classList.add('g-resizing');
                                                                                +    if (unobserve) {
                                                                                +      // Unobserve the slider while the height is being changed
                                                                                +      this._resizeObserver.unobserve(this._viewport);
                                                                                +    }
                                                                                +  }
                                                                                +
                                                                                +  private resetResizingState({ shouldSkip, observe }: { shouldSkip?: boolean, observe?: boolean } = {}): void {
                                                                                +    this._zone.run(() => {
                                                                                +      this.isResizingChange.emit(false);
                                                                                +    })
                                                                                +    this._viewport.classList.remove('g-resizing');
                                                                                +    this._shouldSkip = shouldSkip;
                                                                                +    if (observe) {
                                                                                +      this._resizeObserver.observe(this._viewport);
                                                                                +    }
                                                                                +  }
                                                                                +}
                                                                                +
                                                                                +
                                                                                + +
                                                                                + + + + + + + + + + + + + +
                                                                                +
                                                                                +

                                                                                results matching ""

                                                                                +
                                                                                  +
                                                                                  +
                                                                                  +

                                                                                  No results matching ""

                                                                                  +
                                                                                  +
                                                                                  +
                                                                                  + +
                                                                                  +
                                                                                  + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/documentation/directives/SmoothScroll.html b/documentation/directives/SmoothScroll.html new file mode 100644 index 00000000..2f45bc44 --- /dev/null +++ b/documentation/directives/SmoothScroll.html @@ -0,0 +1,1675 @@ + + + + + + ng-gallery-project documentation + + + + + + + + + + + + + +
                                                                                  +
                                                                                  + + +
                                                                                  +
                                                                                  + + + + + + + + + + + +
                                                                                  +
                                                                                  +

                                                                                  +

                                                                                  File

                                                                                  +

                                                                                  +

                                                                                  + projects/ng-gallery/src/lib/smooth-scroll/smooth-scroll.directive.ts +

                                                                                  + + + +

                                                                                  +

                                                                                  Implements

                                                                                  +

                                                                                  +

                                                                                  + OnDestroy +

                                                                                  + + +
                                                                                  +

                                                                                  Metadata

                                                                                  + + + + + + + + + + + + + + +
                                                                                  + +
                                                                                  +

                                                                                  Index

                                                                                  + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                                                                  +
                                                                                  Properties
                                                                                  +
                                                                                  + +
                                                                                  +
                                                                                  Methods
                                                                                  +
                                                                                  + +
                                                                                  +
                                                                                  Inputs
                                                                                  +
                                                                                  + +
                                                                                  +
                                                                                  Outputs
                                                                                  +
                                                                                  + +
                                                                                  +
                                                                                  Accessors
                                                                                  +
                                                                                  + +
                                                                                  +
                                                                                  + +
                                                                                  +

                                                                                  Constructor

                                                                                  + + + + + + + + + + + + + +
                                                                                  +constructor(_document: Document, customDefaultOptions: SmoothScrollToOptions, _zone: NgZone, _dir: Dir, _el: ElementRef) +
                                                                                  + +
                                                                                  +
                                                                                  + Parameters : + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                                                                  NameTypeOptional
                                                                                  _document + Document + + No +
                                                                                  customDefaultOptions + SmoothScrollToOptions + + No +
                                                                                  _zone + NgZone + + No +
                                                                                  _dir + Dir + + No +
                                                                                  _el + ElementRef<HTMLElement> + + No +
                                                                                  +
                                                                                  +
                                                                                  +
                                                                                  + +
                                                                                  +

                                                                                  Inputs

                                                                                  + + + + + + + + + + + + +
                                                                                  + + adapter +
                                                                                  + Type : SliderAdapter + +
                                                                                  + +
                                                                                  + + + + + + + + + +
                                                                                  + + smoothScroll +
                                                                                  + +
                                                                                  + + + + + + + + + + + + +
                                                                                  + + smoothScrollInterruptOnMousemove +
                                                                                  + Type : boolean + +
                                                                                  + +
                                                                                  +
                                                                                  +
                                                                                  +

                                                                                  Outputs

                                                                                  + + + + + + + + + + + + +
                                                                                  + + isScrollingChange +
                                                                                  + Type : EventEmitter<boolean> + +
                                                                                  + +
                                                                                  +
                                                                                  + + +
                                                                                  + +

                                                                                  + Methods +

                                                                                  + + + + + + + + + + + + + + + + + + + +
                                                                                  + + + Private + _applyScrollToOptions + + +
                                                                                  + + _applyScrollToOptions(options: SmoothScrollToOptions) +
                                                                                  + +
                                                                                  + +
                                                                                  + Parameters : + + + + + + + + + + + + + + + + + + + +
                                                                                  NameTypeOptional
                                                                                  options + SmoothScrollToOptions + + No +
                                                                                  +
                                                                                  +
                                                                                  +
                                                                                  +
                                                                                  + Returns : void + +
                                                                                  +
                                                                                  + +
                                                                                  +
                                                                                  + + + + + + + + + + + + + + + + + + + +
                                                                                  + + + Private + _interrupted + + +
                                                                                  + + _interrupted() +
                                                                                  + +
                                                                                  +

                                                                                  Terminates an ongoing smooth scroll

                                                                                  +
                                                                                  + +
                                                                                  + Returns : Observable<Event | void> + +
                                                                                  +
                                                                                  + + + + + + + + + + + + + + + + + + + +
                                                                                  + + + Private + _isFinished + + +
                                                                                  + + _isFinished(context: SmoothScrollStep) +
                                                                                  + +
                                                                                  +

                                                                                  Checks if smooth scroll has reached, cleans up the smooth scroll stream and resolves its promise

                                                                                  +
                                                                                  + +
                                                                                  + Parameters : + + + + + + + + + + + + + + + + + + + +
                                                                                  NameTypeOptional
                                                                                  context + SmoothScrollStep + + No +
                                                                                  +
                                                                                  +
                                                                                  +
                                                                                  +
                                                                                  + Returns : boolean + +
                                                                                  +
                                                                                  + +
                                                                                  +
                                                                                  + + + + + + + + + + + + + + + + + + + +
                                                                                  + + + Private + _scrollElement + + +
                                                                                  + + _scrollElement(x: number, y: number) +
                                                                                  + +
                                                                                  +

                                                                                  changes scroll position inside an element

                                                                                  +
                                                                                  + +
                                                                                  + Parameters : + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                                                                  NameTypeOptional
                                                                                  x + number + + No +
                                                                                  y + number + + No +
                                                                                  +
                                                                                  +
                                                                                  +
                                                                                  +
                                                                                  + Returns : void + +
                                                                                  +
                                                                                  + +
                                                                                  +
                                                                                  + + + + + + + + + + + + + + + + + + + +
                                                                                  + + + Private + _step + + +
                                                                                  + + _step(context: SmoothScrollStep) +
                                                                                  + +
                                                                                  +

                                                                                  A function called recursively that, given a context, steps through scrolling

                                                                                  +
                                                                                  + +
                                                                                  + Parameters : + + + + + + + + + + + + + + + + + + + +
                                                                                  NameTypeOptional
                                                                                  context + SmoothScrollStep + + No +
                                                                                  +
                                                                                  +
                                                                                  +
                                                                                  + +
                                                                                  + +
                                                                                  +
                                                                                  + + + + + + + + + + + + + + + + + + + +
                                                                                  + + + ngOnDestroy + + +
                                                                                  +ngOnDestroy() +
                                                                                  + +
                                                                                  + +
                                                                                  + Returns : void + +
                                                                                  +
                                                                                  + + + + + + + + + + + + + + + + + + + +
                                                                                  + + + ngOnInit + + +
                                                                                  +ngOnInit() +
                                                                                  + +
                                                                                  + +
                                                                                  + Returns : void + +
                                                                                  +
                                                                                  + + + + + + + + + + + + + + + + + + + +
                                                                                  + + + Private + resetElement + + +
                                                                                  + + resetElement() +
                                                                                  + +
                                                                                  + +
                                                                                  + Returns : void + +
                                                                                  +
                                                                                  + + + + + + + + + + + + + + + + + + + +
                                                                                  + + + scrollTo + + +
                                                                                  +scrollTo(customOptions: SmoothScrollToOptions) +
                                                                                  + +
                                                                                  +

                                                                                  Scrolls to the specified offsets. This is a normalized version of the browser's native scrollTo +method, since browsers are not consistent about what scrollLeft means in RTL. For this method +left and right always refer to the left and right side of the scrolling container irrespective +of the layout direction. start and end refer to left and right in an LTR context and vice-versa +in an RTL context.

                                                                                  +
                                                                                  + +
                                                                                  + Parameters : + + + + + + + + + + + + + + + + + + + + + +
                                                                                  NameTypeOptionalDescription
                                                                                  customOptions + SmoothScrollToOptions + + No + +

                                                                                  specified the offsets to scroll to.

                                                                                  + +
                                                                                  +
                                                                                  +
                                                                                  +
                                                                                  +
                                                                                  + Returns : void + +
                                                                                  +
                                                                                  + +
                                                                                  +
                                                                                  +
                                                                                  +
                                                                                  + +

                                                                                  + Properties +

                                                                                  + + + + + + + + + + + + + + +
                                                                                  + + + Private + Readonly + _defaultOptions + + +
                                                                                  + Type : SmoothScrollToOptions + +
                                                                                  + +
                                                                                  + + + + + + + + + + + + + + +
                                                                                  + + + Private + Readonly + _el + + +
                                                                                  + Type : HTMLElement + +
                                                                                  + +
                                                                                  + + + + + + + + + + + + + + + + + +
                                                                                  + + + Private + Readonly + _finished + + +
                                                                                  + Type : Subject<void> + +
                                                                                  + Default value : new Subject<void>() +
                                                                                  + +
                                                                                  + + + + + + + + + + + + + + + + + +
                                                                                  + + + Private + _hammer + + +
                                                                                  + Type : any + +
                                                                                  + +
                                                                                  +

                                                                                  HammerJS instance

                                                                                  +
                                                                                  +
                                                                                  + + + + + + + + + + + + + + +
                                                                                  + + + Private + _isInterruptedByMouse + + +
                                                                                  + Type : boolean + +
                                                                                  + +
                                                                                  + + + + + + + + + + + + + + + + + +
                                                                                  + + + Private + Readonly + _scrollController + + +
                                                                                  + Type : Subject<SmoothScrollStep> + +
                                                                                  + Default value : new Subject<SmoothScrollStep>() +
                                                                                  + +
                                                                                  + + + + + + + + + + + + + + +
                                                                                  + + + Private + _subscription + + +
                                                                                  + Type : Subscription + +
                                                                                  + +
                                                                                  +
                                                                                  + +
                                                                                  +

                                                                                  + Accessors +

                                                                                  + + + + + + + + + + + + + + +
                                                                                  + + _w +
                                                                                  + get_w() +
                                                                                  + +
                                                                                  + + + + + + + + + + + + + + + + + +
                                                                                  + + _now +
                                                                                  + get_now() +
                                                                                  + +
                                                                                  +

                                                                                  Timing method

                                                                                  +
                                                                                  + +
                                                                                  + Returns : number + +
                                                                                  +
                                                                                  + + + + + + + + + + + + + + + + + +
                                                                                  + + smoothScroll +
                                                                                  + setsmoothScroll(value: SmoothScrollToOptions) +
                                                                                  + +
                                                                                  + +
                                                                                  + Parameters : + + + + + + + + + + + + + + + + + + +
                                                                                  NameTypeOptional
                                                                                  value + SmoothScrollToOptions + + No +
                                                                                  +
                                                                                  +
                                                                                  +
                                                                                  +
                                                                                  + Returns : void + +
                                                                                  +
                                                                                  +
                                                                                  + +
                                                                                  + + +
                                                                                  +
                                                                                  import {
                                                                                  +  Directive,
                                                                                  +  Inject,
                                                                                  +  Input,
                                                                                  +  Output,
                                                                                  +  Optional,
                                                                                  +  NgZone,
                                                                                  +  OnDestroy,
                                                                                  +  ElementRef,
                                                                                  +  EventEmitter
                                                                                  +} from '@angular/core';
                                                                                  +import { SMOOTH_SCROLL_OPTIONS, SmoothScrollStep, SmoothScrollToOptions } from './index';
                                                                                  +import { DOCUMENT } from '@angular/common';
                                                                                  +import { Dir } from '@angular/cdk/bidi';
                                                                                  +import { _Bottom, _Left, _Right, _Top, _Without } from '@angular/cdk/scrolling';
                                                                                  +import { getRtlScrollAxisType, RtlScrollAxisType } from '@angular/cdk/platform';
                                                                                  +import {
                                                                                  +  Observable,
                                                                                  +  Subject,
                                                                                  +  Subscriber,
                                                                                  +  Subscription,
                                                                                  +  of,
                                                                                  +  take,
                                                                                  +  merge,
                                                                                  +  expand,
                                                                                  +  fromEvent,
                                                                                  +  switchMap,
                                                                                  +  takeUntil,
                                                                                  +  takeWhile,
                                                                                  +  finalize
                                                                                  +} from 'rxjs';
                                                                                  +import BezierEasing from './bezier-easing';
                                                                                  +import { SliderAdapter } from '../components/adapters';
                                                                                  +
                                                                                  +declare const Hammer: any;
                                                                                  +
                                                                                  +@Directive({
                                                                                  +  selector: '[smoothScroll]',
                                                                                  +  standalone: true,
                                                                                  +  providers: [Dir]
                                                                                  +})
                                                                                  +export class SmoothScroll implements OnDestroy {
                                                                                  +
                                                                                  +  /** HammerJS instance */
                                                                                  +  private _hammer: any;
                                                                                  +
                                                                                  +  // Default options
                                                                                  +  private readonly _defaultOptions: SmoothScrollToOptions;
                                                                                  +
                                                                                  +  private readonly _scrollController: Subject<SmoothScrollStep> = new Subject<SmoothScrollStep>();
                                                                                  +
                                                                                  +  private readonly _finished: Subject<void> = new Subject<void>();
                                                                                  +
                                                                                  +  private readonly _el: HTMLElement;
                                                                                  +
                                                                                  +  private _isInterruptedByMouse: boolean;
                                                                                  +
                                                                                  +  private _subscription: Subscription;
                                                                                  +
                                                                                  +  private get _w(): Window {
                                                                                  +    return this._document.defaultView;
                                                                                  +  }
                                                                                  +
                                                                                  +  /**
                                                                                  +   * Timing method
                                                                                  +   */
                                                                                  +  private get _now(): () => number {
                                                                                  +    return this._w.performance?.now?.bind(this._w.performance) || Date.now;
                                                                                  +  }
                                                                                  +
                                                                                  +  @Input()
                                                                                  +  set smoothScroll(value: SmoothScrollToOptions) {
                                                                                  +    if (value) {
                                                                                  +      this._zone.runOutsideAngular(() => {
                                                                                  +        this.scrollTo(value);
                                                                                  +      });
                                                                                  +    }
                                                                                  +  }
                                                                                  +
                                                                                  +  @Input() adapter: SliderAdapter;
                                                                                  +
                                                                                  +  @Input('smoothScrollInterruptOnMousemove') interruptOnMousemove: boolean;
                                                                                  +
                                                                                  +  @Output() isScrollingChange: EventEmitter<boolean> = new EventEmitter<boolean>();
                                                                                  +
                                                                                  +  constructor(@Inject(DOCUMENT) private _document: Document,
                                                                                  +              @Optional() @Inject(SMOOTH_SCROLL_OPTIONS) customDefaultOptions: SmoothScrollToOptions,
                                                                                  +              private _zone: NgZone,
                                                                                  +              private _dir: Dir,
                                                                                  +              _el: ElementRef<HTMLElement>) {
                                                                                  +    this._el = _el.nativeElement;
                                                                                  +    this._defaultOptions = {
                                                                                  +      duration: 468,
                                                                                  +      easing: {
                                                                                  +        x1: 0.42,
                                                                                  +        y1: 0,
                                                                                  +        x2: 0.58,
                                                                                  +        y2: 1
                                                                                  +      },
                                                                                  +      ...customDefaultOptions,
                                                                                  +    };
                                                                                  +  }
                                                                                  +
                                                                                  +  ngOnInit(): void {
                                                                                  +    this._subscription = this._scrollController.pipe(
                                                                                  +      switchMap((context: SmoothScrollStep) => {
                                                                                  +        this._zone.run(() => {
                                                                                  +          this.isScrollingChange.emit(true);
                                                                                  +        });
                                                                                  +
                                                                                  +        this._el.classList.add('g-scrolling');
                                                                                  +        this._el.style.setProperty('--slider-scroll-snap-type', 'none');
                                                                                  +
                                                                                  +        // Scroll each step recursively
                                                                                  +        return of(null).pipe(
                                                                                  +          expand(() => this._step(context).pipe(
                                                                                  +            takeWhile((currContext: SmoothScrollStep) => this._isFinished(currContext)),
                                                                                  +            takeUntil(this._finished)
                                                                                  +          )),
                                                                                  +          finalize(() => this.resetElement()),
                                                                                  +          takeUntil(this._interrupted()),
                                                                                  +        );
                                                                                  +      })
                                                                                  +    ).subscribe();
                                                                                  +  }
                                                                                  +
                                                                                  +  ngOnDestroy(): void {
                                                                                  +    this._subscription?.unsubscribe();
                                                                                  +    this._scrollController.complete();
                                                                                  +  }
                                                                                  +
                                                                                  +  /**
                                                                                  +   * changes scroll position inside an element
                                                                                  +   */
                                                                                  +  private _scrollElement(x: number, y: number): void {
                                                                                  +    this._el.scrollLeft = x;
                                                                                  +    this._el.scrollTop = y;
                                                                                  +  }
                                                                                  +
                                                                                  +  private resetElement(): void {
                                                                                  +    this._zone.run(() => {
                                                                                  +      this.isScrollingChange.emit(false);
                                                                                  +    });
                                                                                  +
                                                                                  +    this._el.classList.remove('g-scrolling');
                                                                                  +    if (!this._isInterruptedByMouse) {
                                                                                  +      this._el.style.setProperty('--slider-scroll-snap-type', this.adapter.scrollSnapType);
                                                                                  +    }
                                                                                  +    this._isInterruptedByMouse = false;
                                                                                  +  }
                                                                                  +
                                                                                  +  /**
                                                                                  +   * Checks if smooth scroll has reached, cleans up the smooth scroll stream and resolves its promise
                                                                                  +   */
                                                                                  +  private _isFinished(context: SmoothScrollStep): boolean {
                                                                                  +    if (context.currentX !== context.x || context.currentY !== context.y) {
                                                                                  +      return true;
                                                                                  +    }
                                                                                  +    this._finished.next();
                                                                                  +    return false;
                                                                                  +  }
                                                                                  +
                                                                                  +  /**
                                                                                  +   * Terminates an ongoing smooth scroll
                                                                                  +   */
                                                                                  +  private _interrupted(): Observable<Event | void> {
                                                                                  +    let interrupt$: Observable<Event | void>;
                                                                                  +    if (this.interruptOnMousemove && typeof Hammer !== 'undefined') {
                                                                                  +      this._hammer = new Hammer(this._el, { inputClass: Hammer.MouseInput });
                                                                                  +      this._hammer.get('pan').set({ direction: this.adapter.hammerDirection });
                                                                                  +
                                                                                  +      // For gallery thumb slider, dragging thumbnails should cancel the ongoing scroll
                                                                                  +      interrupt$ = merge(
                                                                                  +        new Observable<void>((subscriber: Subscriber<void>) => {
                                                                                  +          this._hammer.on('panstart', () => {
                                                                                  +            this._isInterruptedByMouse = true;
                                                                                  +            subscriber.next();
                                                                                  +            subscriber.complete();
                                                                                  +          });
                                                                                  +          return () => {
                                                                                  +            this._hammer.destroy();
                                                                                  +          }
                                                                                  +        }),
                                                                                  +        fromEvent(this._el, 'wheel', { passive: true, capture: true }),
                                                                                  +        fromEvent(this._el, 'touchmove', { passive: true, capture: true }),
                                                                                  +      )
                                                                                  +    } else {
                                                                                  +      interrupt$ = merge(
                                                                                  +        fromEvent(this._el, 'wheel', { passive: true, capture: true }),
                                                                                  +        fromEvent(this._el, 'touchmove', { passive: true, capture: true }),
                                                                                  +      )
                                                                                  +    }
                                                                                  +    return interrupt$.pipe(take(1));
                                                                                  +  }
                                                                                  +
                                                                                  +  /**
                                                                                  +   * A function called recursively that, given a context, steps through scrolling
                                                                                  +   */
                                                                                  +  private _step(context: SmoothScrollStep): Observable<SmoothScrollStep> {
                                                                                  +    return new Observable((subscriber: Subscriber<SmoothScrollStep>) => {
                                                                                  +      let elapsed: number = (this._now() - context.startTime) / context.duration;
                                                                                  +
                                                                                  +      // avoid elapsed times higher than one
                                                                                  +      elapsed = elapsed > 1 ? 1 : elapsed;
                                                                                  +
                                                                                  +      // apply easing to elapsed time
                                                                                  +      const value: number = context.easing(elapsed);
                                                                                  +
                                                                                  +      context.currentX = context.startX + (context.x - context.startX) * value;
                                                                                  +      context.currentY = context.startY + (context.y - context.startY) * value;
                                                                                  +
                                                                                  +      this._scrollElement(context.currentX, context.currentY);
                                                                                  +      // Proceed to the step
                                                                                  +      requestAnimationFrame(() => {
                                                                                  +        subscriber.next(context);
                                                                                  +        subscriber.complete();
                                                                                  +      });
                                                                                  +    });
                                                                                  +  }
                                                                                  +
                                                                                  +  private _applyScrollToOptions(options: SmoothScrollToOptions): void {
                                                                                  +    if (!options.duration) {
                                                                                  +      this._scrollElement(options.left, options.top);
                                                                                  +    }
                                                                                  +
                                                                                  +    const context: SmoothScrollStep = {
                                                                                  +      scrollable: this._el,
                                                                                  +      startTime: this._now(),
                                                                                  +      startX: this._el.scrollLeft,
                                                                                  +      startY: this._el.scrollTop,
                                                                                  +      x: options.left == null ? this._el.scrollLeft : ~~options.left,
                                                                                  +      y: options.top == null ? this._el.scrollTop : ~~options.top,
                                                                                  +      duration: options.duration,
                                                                                  +      easing: BezierEasing(options.easing.x1, options.easing.y1, options.easing.x2, options.easing.y2)
                                                                                  +    };
                                                                                  +
                                                                                  +    this._scrollController.next(context);
                                                                                  +  }
                                                                                  +
                                                                                  +  /**
                                                                                  +   * Scrolls to the specified offsets. This is a normalized version of the browser's native scrollTo
                                                                                  +   * method, since browsers are not consistent about what scrollLeft means in RTL. For this method
                                                                                  +   * left and right always refer to the left and right side of the scrolling container irrespective
                                                                                  +   * of the layout direction. start and end refer to left and right in an LTR context and vice-versa
                                                                                  +   * in an RTL context.
                                                                                  +   * @param customOptions specified the offsets to scroll to.
                                                                                  +   */
                                                                                  +  scrollTo(customOptions: SmoothScrollToOptions): void {
                                                                                  +    const isRtl: boolean = this._dir.value === 'rtl';
                                                                                  +    const rtlScrollAxisType: RtlScrollAxisType = getRtlScrollAxisType();
                                                                                  +
                                                                                  +    const options: SmoothScrollToOptions = {
                                                                                  +      ...(this._defaultOptions as _Without<_Bottom & _Top>),
                                                                                  +      ...customOptions,
                                                                                  +      ...({
                                                                                  +        // Rewrite start & end offsets as right or left offsets.
                                                                                  +        left: customOptions.left == null ? (isRtl ? customOptions.end : customOptions.start) : customOptions.left,
                                                                                  +        right: customOptions.right == null ? (isRtl ? customOptions.start : customOptions.end) : customOptions.right
                                                                                  +      } as _Without<_Bottom & _Top>)
                                                                                  +    };
                                                                                  +
                                                                                  +    // Rewrite the bottom offset as a top offset.
                                                                                  +    if (options.bottom != null) {
                                                                                  +      (options as _Without<_Bottom> & _Top).top = this._el.scrollHeight - this._el.clientHeight - options.bottom;
                                                                                  +    }
                                                                                  +
                                                                                  +    // Rewrite the right offset as a left offset.
                                                                                  +    if (isRtl && rtlScrollAxisType !== RtlScrollAxisType.NORMAL) {
                                                                                  +      if (options.left != null) {
                                                                                  +        (options as _Without<_Left> & _Right).right = this._el.scrollWidth - this._el.clientWidth - options.left;
                                                                                  +      }
                                                                                  +
                                                                                  +      if (rtlScrollAxisType === RtlScrollAxisType.INVERTED) {
                                                                                  +        options.left = options.right;
                                                                                  +      } else if (rtlScrollAxisType === RtlScrollAxisType.NEGATED) {
                                                                                  +        options.left = options.right ? -options.right : options.right;
                                                                                  +      }
                                                                                  +    } else {
                                                                                  +      if (options.right != null) {
                                                                                  +        (options as _Without<_Right> & _Left).left = this._el.scrollWidth - this._el.clientWidth - options.right;
                                                                                  +      }
                                                                                  +    }
                                                                                  +    return this._applyScrollToOptions(options);
                                                                                  +  }
                                                                                  +}
                                                                                  +
                                                                                  +
                                                                                  + +
                                                                                  + + + + + + + + + + + + + +
                                                                                  +
                                                                                  +

                                                                                  results matching ""

                                                                                  +
                                                                                    +
                                                                                    +
                                                                                    +

                                                                                    No results matching ""

                                                                                    +
                                                                                    +
                                                                                    +
                                                                                    + +
                                                                                    +
                                                                                    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/documentation/directives/ThumbResizeObserver.html b/documentation/directives/ThumbResizeObserver.html new file mode 100644 index 00000000..74d3564a --- /dev/null +++ b/documentation/directives/ThumbResizeObserver.html @@ -0,0 +1,713 @@ + + + + + + ng-gallery-project documentation + + + + + + + + + + + + + +
                                                                                    +
                                                                                    + + +
                                                                                    +
                                                                                    + + + + + + + + + + + +
                                                                                    +
                                                                                    +

                                                                                    +

                                                                                    File

                                                                                    +

                                                                                    +

                                                                                    + projects/ng-gallery/src/lib/observers/thumb-resize-observer.directive.ts +

                                                                                    + + + +

                                                                                    +

                                                                                    Implements

                                                                                    +

                                                                                    +

                                                                                    + OnChanges + OnInit + OnDestroy +

                                                                                    + + +
                                                                                    +

                                                                                    Metadata

                                                                                    + + + + + + + + + + +
                                                                                    + +
                                                                                    +

                                                                                    Index

                                                                                    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                                                                    +
                                                                                    Properties
                                                                                    +
                                                                                    + +
                                                                                    +
                                                                                    Methods
                                                                                    +
                                                                                    + +
                                                                                    +
                                                                                    Inputs
                                                                                    +
                                                                                    + +
                                                                                    +
                                                                                    Outputs
                                                                                    +
                                                                                    + +
                                                                                    +
                                                                                    Accessors
                                                                                    +
                                                                                    + +
                                                                                    +
                                                                                    + +
                                                                                    +

                                                                                    Constructor

                                                                                    + + + + + + + + + + + + + +
                                                                                    +constructor(_el: ElementRef, _zone: NgZone) +
                                                                                    + +
                                                                                    +
                                                                                    + Parameters : + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                                                                    NameTypeOptional
                                                                                    _el + ElementRef<HTMLElement> + + No +
                                                                                    _zone + NgZone + + No +
                                                                                    +
                                                                                    +
                                                                                    +
                                                                                    + +
                                                                                    +

                                                                                    Inputs

                                                                                    + + + + + + + + + + + + +
                                                                                    + + adapter +
                                                                                    + Type : SliderAdapter + +
                                                                                    + +
                                                                                    + + + + + + + + + + + + +
                                                                                    + + config +
                                                                                    + Type : GalleryConfig + +
                                                                                    + +
                                                                                    +
                                                                                    +
                                                                                    +

                                                                                    Outputs

                                                                                    + + + + + + + + + + + + +
                                                                                    + + thumbResizeObserver +
                                                                                    + Type : EventEmitter<void> + +
                                                                                    + +
                                                                                    +
                                                                                    + + +
                                                                                    + +

                                                                                    + Methods +

                                                                                    + + + + + + + + + + + + + + + + + + + +
                                                                                    + + + ngOnChanges + + +
                                                                                    +ngOnChanges(changes: SimpleChanges) +
                                                                                    + +
                                                                                    + +
                                                                                    + Parameters : + + + + + + + + + + + + + + + + + + + +
                                                                                    NameTypeOptional
                                                                                    changes + SimpleChanges + + No +
                                                                                    +
                                                                                    +
                                                                                    +
                                                                                    +
                                                                                    + Returns : void + +
                                                                                    +
                                                                                    + +
                                                                                    +
                                                                                    + + + + + + + + + + + + + + + + + + + +
                                                                                    + + + ngOnDestroy + + +
                                                                                    +ngOnDestroy() +
                                                                                    + +
                                                                                    + +
                                                                                    + Returns : void + +
                                                                                    +
                                                                                    + + + + + + + + + + + + + + + + + + + +
                                                                                    + + + ngOnInit + + +
                                                                                    +ngOnInit() +
                                                                                    + +
                                                                                    + +
                                                                                    + Returns : void + +
                                                                                    +
                                                                                    + + + + + + + + + + + + + + + + + + + +
                                                                                    + + + Private + updateSliderSize + + +
                                                                                    + + updateSliderSize() +
                                                                                    + +
                                                                                    + +
                                                                                    + Returns : void + +
                                                                                    +
                                                                                    +
                                                                                    +
                                                                                    + +

                                                                                    + Properties +

                                                                                    + + + + + + + + + + + + + + +
                                                                                    + + + Private + _resizeSubscription + + +
                                                                                    + Type : Subscription + +
                                                                                    + +
                                                                                    +
                                                                                    + +
                                                                                    +

                                                                                    + Accessors +

                                                                                    + + + + + + + + + + + + + + +
                                                                                    + + _viewport +
                                                                                    + get_viewport() +
                                                                                    + +
                                                                                    +
                                                                                    + +
                                                                                    + + +
                                                                                    +
                                                                                    import {
                                                                                    +  Directive,
                                                                                    +  Input,
                                                                                    +  Output,
                                                                                    +  OnInit,
                                                                                    +  OnChanges,
                                                                                    +  OnDestroy,
                                                                                    +  NgZone,
                                                                                    +  ElementRef,
                                                                                    +  SimpleChanges,
                                                                                    +  EventEmitter
                                                                                    +} from '@angular/core';
                                                                                    +import { Subscription, tap, auditTime, animationFrameScheduler, debounceTime } from 'rxjs';
                                                                                    +import { resizeObservable } from '../utils/resize-observer';
                                                                                    +import { GalleryConfig } from '../models/config.model';
                                                                                    +import { SliderAdapter } from '../components/adapters';
                                                                                    +
                                                                                    +@Directive({
                                                                                    +  selector: '[thumbResizeObserver]',
                                                                                    +  standalone: true
                                                                                    +})
                                                                                    +export class ThumbResizeObserver implements OnChanges, OnInit, OnDestroy {
                                                                                    +
                                                                                    +  private _resizeSubscription: Subscription;
                                                                                    +
                                                                                    +  private get _viewport(): HTMLElement {
                                                                                    +    return this._el.nativeElement;
                                                                                    +  }
                                                                                    +
                                                                                    +  @Input() config: GalleryConfig;
                                                                                    +
                                                                                    +  @Input() adapter: SliderAdapter;
                                                                                    +
                                                                                    +  @Output('thumbResizeObserver') resized: EventEmitter<void> = new EventEmitter();
                                                                                    +
                                                                                    +  constructor(private _el: ElementRef<HTMLElement>, private _zone: NgZone) {
                                                                                    +  }
                                                                                    +
                                                                                    +  ngOnInit(): void {
                                                                                    +    this._zone.runOutsideAngular(() => {
                                                                                    +      this._resizeSubscription = resizeObservable(this._viewport).pipe(
                                                                                    +        debounceTime(this.config.resizeDebounceTime, animationFrameScheduler),
                                                                                    +        tap(() => {
                                                                                    +          this.updateSliderSize();
                                                                                    +          this.resized.emit();
                                                                                    +        })
                                                                                    +      ).subscribe();
                                                                                    +    });
                                                                                    +  }
                                                                                    +
                                                                                    +  ngOnChanges(changes: SimpleChanges): void {
                                                                                    +    if (!changes.config.firstChange) {
                                                                                    +      this.updateSliderSize();
                                                                                    +    }
                                                                                    +  }
                                                                                    +
                                                                                    +  ngOnDestroy(): void {
                                                                                    +    this._resizeSubscription?.unsubscribe();
                                                                                    +  }
                                                                                    +
                                                                                    +  private updateSliderSize(): void {
                                                                                    +    this._viewport.style.setProperty('--thumb-centralize-start-size', this.adapter.getCentralizerStartSize() + 'px');
                                                                                    +    this._viewport.style.setProperty('--thumb-centralize-end-size', this.adapter.getCentralizerEndSize() + 'px');
                                                                                    +  }
                                                                                    +}
                                                                                    +
                                                                                    +
                                                                                    + +
                                                                                    + + + + + + + + + + + + + +
                                                                                    +
                                                                                    +

                                                                                    results matching ""

                                                                                    +
                                                                                      +
                                                                                      +
                                                                                      +

                                                                                      No results matching ""

                                                                                      +
                                                                                      +
                                                                                      +
                                                                                      + +
                                                                                      +
                                                                                      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/documentation/fonts/ionicons.eot b/documentation/fonts/ionicons.eot new file mode 100644 index 0000000000000000000000000000000000000000..4b1fd0f48c9fa50401fa6dd1514fac66c0e92b06 GIT binary patch literal 112650 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

                                                                                      r&t+fbm-y)Mex|N>O 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Ξr(#{P@A|12cYl|U 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 N_m}q|`XJmc_+R198#n*} literal 0 HcmV?d00001 diff --git a/documentation/fonts/ionicons.svg b/documentation/fonts/ionicons.svg new file mode 100644 index 00000000..ba35c41f --- /dev/null +++ b/documentation/fonts/ionicons.svg @@ -0,0 +1,2090 @@ + + + + + +Created by FontForge 20160407 at Thu Jun 14 08:50:34 2018 + By Adam Bradley +Copyright (c) 2018, Adam Bradley + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/documentation/fonts/ionicons.ttf b/documentation/fonts/ionicons.ttf new file mode 100644 index 0000000000000000000000000000000000000000..67bd84202ad5b2e307d3b6fac1731c2a5d963e0b GIT binary patch literal 112472 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 Tk%-c1X!zdJ9z-96+av!M=V=Jy literal 0 HcmV?d00001 diff --git a/documentation/fonts/ionicons.woff b/documentation/fonts/ionicons.woff new file mode 100644 index 0000000000000000000000000000000000000000..ec1c1f879567793545e1a00ae1dabde12a7fd96f GIT binary patch literal 65912 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 GcK$C}BGQQf literal 0 HcmV?d00001 diff --git a/documentation/fonts/roboto-v15-latin-300.svg b/documentation/fonts/roboto-v15-latin-300.svg new file mode 100644 index 00000000..52b28327 --- /dev/null +++ b/documentation/fonts/roboto-v15-latin-300.svg @@ -0,0 +1,314 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/documentation/fonts/roboto-v15-latin-300.ttf b/documentation/fonts/roboto-v15-latin-300.ttf new file mode 100644 index 0000000000000000000000000000000000000000..66bc5ab8e299e9948a6fce6b7867cc638bc703c7 GIT binary patch literal 32664 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 z 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 N69Ue10BL+3|3BR=Qi%Wn literal 0 HcmV?d00001 diff --git a/documentation/fonts/roboto-v15-latin-700.svg b/documentation/fonts/roboto-v15-latin-700.svg new file mode 100644 index 00000000..fc8d42f9 --- /dev/null +++ b/documentation/fonts/roboto-v15-latin-700.svg @@ -0,0 +1,310 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/documentation/fonts/roboto-v15-latin-700.ttf b/documentation/fonts/roboto-v15-latin-700.ttf new file mode 100644 index 0000000000000000000000000000000000000000..19090afb10e101b0524a4dbe1f5af074dcd2a1d3 GIT binary patch literal 32500 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%0D$XrKy88VgC}G`wV# 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�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 a0Ynt=GnQ`R7YB;vi!+u207`fxkN^PiJMWMH literal 0 HcmV?d00001 diff --git a/documentation/fonts/roboto-v15-latin-700.woff2 b/documentation/fonts/roboto-v15-latin-700.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..11cde5d04c470947b1c88e42a684fcf0d5b396b0 GIT binary patch literal 14552 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 C(C%db literal 0 HcmV?d00001 diff --git a/documentation/fonts/roboto-v15-latin-italic.eot b/documentation/fonts/roboto-v15-latin-italic.eot new file mode 100644 index 0000000000000000000000000000000000000000..f2d020a8741fd850a1480bab13d0e11f6e914025 GIT binary patch literal 17534 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 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/documentation/fonts/roboto-v15-latin-italic.ttf b/documentation/fonts/roboto-v15-latin-italic.ttf new file mode 100644 index 0000000000000000000000000000000000000000..b0dd4a1e528f513a5261baa536e6a226200a2bb6 GIT binary patch literal 33404 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 RR;p6MN{V@9tNe#1{sOTsz$*X% literal 0 HcmV?d00001 diff --git a/documentation/fonts/roboto-v15-latin-italic.woff b/documentation/fonts/roboto-v15-latin-italic.woff new file mode 100644 index 0000000000000000000000000000000000000000..a2b770481888875242d97551db61ceab992b14b8 GIT binary patch literal 19880 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%0D|EBaVS5|Rd`%aFD6>_@f zUCHoi8qQmuvm}0?eW0w_zcQN)-mibJb;#vp2P`%^=6z>U`(hBlV4+|!(qZ*N+%WTp z$Vh|L2!<+igMIg@|5WMsJ2RZ6Bkw+f>7LV=O7XokmRJJg>Ay z%qeL+3MbNif+03ieg|(9ZLY$){vo1NCvbK;k8CAa*Aqj=4gd8H{{Ms^4zI z8!VQS&Y0jj(fP7@wm*+o6{GEVC=_w1>}h#RTaMWcd$pu%3zbePgSkxvGFzGb0~rmgMuwle||^N(Rw88Og^~GWrV{YIrZWj{@ANUX;ik6`-`Uq$%YQ zlt0FzH33m|^ZEPqs6djU;XNx(%f!uy5kG|n{lLrU4kgY~>KOGfhGNc#{~%SjURhb3 z5sNwB&ZK6@Q)Tq(W-avO#6rC9o9Y@ z25GPOVs>g_1V3nTpLSZG0URL(Xy3G0Vj#VL^s*fuZU+_g4wfxP=6BV+MqSE--?M|}v_BOt3;Sxx5;IRF4vcbH%IXJ%)b2_?BgP)VK?Wp_U?@iN=r%}th8EB9YAF{0tz_;t21wRo+f*Y zcnY6i;1X?gdF>c~{nO3dqHxeADuS4y&oF)?pO1|N2y`PV)^>#hH<$BDVW`exnI}yU zTOAe*B;hg=PYEi1K;eep=*y|SUp&b~mx;_9Q5xLuo=Qce#*z$nQ26YtAMLd2lnhx2 zE!H!oO)H@T-u$ZsAOnT*X8z?zBpJm0(Sx3>(@*TjqoQ$N@Sk^Z=;ly$pvwx9$9}Yp zbTp^a2*O#MvXFLsX9v^5FKZIKuDcHO!@&;W_;Nzdne;I83MtxdmsF=qw@7eGZqKAU zs;M5{y*aKPBW`SXj2aP^I%{bxGNCJVUKCCoq;O25t9TmQV)p$xd;5;+ty?pdhNGibKlxhs$@v#h7wNfufi z*k{*6sI;CcvD|iJ`R1Ms_s|x8J~po~rod7D3vRL6E%SFE^OHjOm#%JS_Uhn8?gjl6 zky0G&UqXBV{9lcWEQ?qRDjs#WrKwKmO2FTO1OpASooY%0DBtP*gV?bR+Xd=HFXCog`pD(Kw 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 w1=re4371U5b_;_(00bZff+hzb8;wM>qO9-Y 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 v#g4%>=-%`rNTT$Q3+IGsv=@uepU+g& + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/documentation/fonts/roboto-v15-latin-regular.ttf b/documentation/fonts/roboto-v15-latin-regular.ttf new file mode 100644 index 0000000000000000000000000000000000000000..7b25f3ce940cbba3001420d38b7d0f12fb7f2142 GIT binary patch literal 32652 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 N6K0jQ!xePm{|7p>-q!#C literal 0 HcmV?d00001 diff --git a/documentation/fonts/roboto-v15-latin-regular.woff b/documentation/fonts/roboto-v15-latin-regular.woff new file mode 100644 index 0000000000000000000000000000000000000000..941dfa4bae83483cf1784641063ce1deceda1406 GIT binary patch literal 18520 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 literal 0 HcmV?d00001 diff --git a/documentation/graph/dependencies.svg b/documentation/graph/dependencies.svg new file mode 100644 index 00000000..317932d5 --- /dev/null +++ b/documentation/graph/dependencies.svg @@ -0,0 +1,236 @@ + + + + + + +dependencies + +dependencies + +cluster_GalleryModule + + + +cluster_GalleryModule_imports + + + +cluster_GalleryModule_exports + + + +cluster_LightboxModule + + + +cluster_LightboxModule_imports + + + +cluster_LightboxModule_exports + + + + +GalleryBoxDef + +GalleryBoxDef + + + +GalleryModule + +GalleryModule + + + +GalleryBoxDef->GalleryModule + + + + + +GalleryComponent + +GalleryComponent + + + +GalleryComponent->GalleryModule + + + + + +GalleryImageDef + +GalleryImageDef + + + +GalleryImageDef->GalleryModule + + + + + +GalleryItemDef + +GalleryItemDef + + + +GalleryItemDef->GalleryModule + + + + + +GalleryThumbDef + +GalleryThumbDef + + + +GalleryThumbDef->GalleryModule + + + + + +GalleryBoxDef + +GalleryBoxDef + + + +GalleryModule->GalleryBoxDef + + + + + +GalleryComponent + +GalleryComponent + + + +GalleryModule->GalleryComponent + + + + + +GalleryImageDef + +GalleryImageDef + + + +GalleryModule->GalleryImageDef + + + + + +GalleryItemDef + +GalleryItemDef + + + +GalleryModule->GalleryItemDef + + + + + +GalleryThumbDef + +GalleryThumbDef + + + +GalleryModule->GalleryThumbDef + + + + + +LightboxModule + +LightboxModule + + + +GalleryModule->LightboxModule + + + + + +GallerizeDirective + +GallerizeDirective + + + +GallerizeDirective->LightboxModule + + + + + +LightboxDirective + +LightboxDirective + + + +LightboxDirective->LightboxModule + + + + + +GallerizeDirective + +GallerizeDirective + + + +LightboxModule->GallerizeDirective + + + + + +GalleryModule + +GalleryModule + + + +LightboxModule->GalleryModule + + + + + +LightboxDirective + +LightboxDirective + + + +LightboxModule->LightboxDirective + + + + + diff --git a/documentation/images/compodoc-vectorise-inverted.png b/documentation/images/compodoc-vectorise-inverted.png new file mode 100644 index 0000000000000000000000000000000000000000..e95ccfb06cb8d81c827263438e91851ff27a2ead GIT binary patch literal 21782 zcmdqJcQl+^8#sy(B9TFegfMyyqW2b2MlV4`i$sYYy_ZO0^wAkc38M$mi5Ah@h~A0b zd++xh=X~d!-(Bn8zwf%%vc{VC-TUd!e%cnKrXojxPmYg)fk6O~f1!bafdxkY;@t+m z`E5|&2YlRqt0?yZ_ym4VrE7eFk2@dabsd2fBj{hu=gdiNz?ZmA5M>$MIegIFr*y=D zoAVeL)EJN#QZL=cH zpxlz}Yf)+Q+#~B%>+Mg&nT46tsY`f&PqhzIP>YlVN!}tLFwipa)H3rrhIPhecb65Juqzm8^-=J_yZHtdPsV9$_r!MWX>LKYmJQDs zpV^keo-{@T2*WSAzx>VEd9vem@{XkdygD@+jD-eL`*91km`|UK7(Tm>07qG!_?({^ z)i)F2N{VBog}Z0&A58IdiqWw=ZCYvvVKUQULNPGB=rcCHm=c4+Y}!=p`%QanX73s# zclrFTd$Y=trMNs@Uq!7P*6r1O9@g5l=1z!cP?5#MS?tSuBmj=JB`Z8&59 zt4 z-B639WILrni}WQ<5z1(q=(dNthE?W7RL>$Wd05PJM-&)q=e8S^660bu;`uQZxLG>N zAx_yu%⁡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 + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/documentation/images/compodoc-vectorise.png b/documentation/images/compodoc-vectorise.png new file mode 100644 index 0000000000000000000000000000000000000000..8137403549b3c75b477151c50079e72c67be879d GIT binary patch literal 21325 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

                                                                                      rDyEFG=J1n~GGY}B}aNyqxGRbYf; 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 + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/documentation/images/coverage-badge-documentation.svg b/documentation/images/coverage-badge-documentation.svg new file mode 100644 index 00000000..94eca357 --- /dev/null +++ b/documentation/images/coverage-badge-documentation.svg @@ -0,0 +1,9 @@ + + + + + + documentation + 13% + + diff --git a/documentation/images/favicon.ico b/documentation/images/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..4144ee4613af4c20b9775c0923f0216e19b63cf9 GIT binary patch literal 1150 zcmbW0T}V@57{?z|GAcJq$#9h>nA1?Vw&Tt@EazM(=i`0;|MRkQUZMzGv9W}E zGBrmL?IR*1KntDqJ^~Te;&!bQs<*yHU^#N@k-w|a$TEQ$SU?7_fl9!7j6|>>B!GAj z?j48v45$ZJ!3}U-jn@zx0SByrJtqZ(>)BrQV2>J^zgFwioW;F>?Ulha8-AB66e{Fb zsqFYKoh!%ha&q5Oo!qw#Gn*B9DL^Xmqy(di1iA49H~-Ua8t^1GJ|Lasm!%TXZ;qAZflTkT|I|po^YlnBB}sFkxl*f~CRQ!an=Z? zJ%5pk_%GDn@Q`lR_c$+>yzxUnnC+c%-5YM1>h;w0J@(WZ02PTcosV9MvNf#qSnFja zmtSbiwfpFOCr2MTt%)DI%)Q?B%IT((@q+uqEd(tO-3)jN4r(67LZI4hTm0>^zJ8LO zbawlvE{g&BKJXSE!r1LnVzVj&;sj`7b-6f5WrD|0DcpQl#+_Tr%WBJ-?LJlq?F0}3 z+e_#js(R*g80cADD;^@nO;j#Cy6euFQ5=@9&B_4ngeEy$yV>`|dNy9c|F{BHO>RC= zhxcH}vo26Rx9~5?fA!ZCqE?&)jUT8#`-nU^ajh4KcAJO}@awS+bE7zQ3?&I*_7AEe BD+d4o literal 0 HcmV?d00001 diff --git a/documentation/index.html b/documentation/index.html new file mode 100644 index 00000000..2d68e81e --- /dev/null +++ b/documentation/index.html @@ -0,0 +1,139 @@ + + + + + + ng-gallery-project documentation + + + + + + + + + +

                                                                                      + + + +
                                                                                      +
                                                                                      + + +
                                                                                      +
                                                                                      + +

                                                                                      + +

                                                                                      +

                                                                                      Angular Gallery

                                                                                      + +

                                                                                      Simplifies the process of creating beautiful image galleries for the web and mobile devices.

                                                                                      + + +

                                                                                      npm +npm +npm +tests +npm +npm

                                                                                      +
                                                                                      +

                                                                                      The documentation is available at the wiki page 📚

                                                                                      +
                                                                                      +

                                                                                      Support

                                                                                      +

                                                                                      npm

                                                                                      +

                                                                                      Issues

                                                                                      +

                                                                                      If you identify any errors in this module, or have an idea for an improvement, please open an issue.

                                                                                      +

                                                                                      Author

                                                                                      +

                                                                                      Murhaf Sousli

                                                                                      + + + + + + + + + + + + + + + + + + + + + +
                                                                                      +
                                                                                      +

                                                                                      results matching ""

                                                                                      +
                                                                                        +
                                                                                        +
                                                                                        +

                                                                                        No results matching ""

                                                                                        +
                                                                                        +
                                                                                        +
                                                                                        + +
                                                                                        +
                                                                                        + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/documentation/injectables/Gallery.html b/documentation/injectables/Gallery.html new file mode 100644 index 00000000..6d0b8d4e --- /dev/null +++ b/documentation/injectables/Gallery.html @@ -0,0 +1,717 @@ + + + + + + ng-gallery-project documentation + + + + + + + + + + + + + +
                                                                                        +
                                                                                        + + +
                                                                                        +
                                                                                        + + + + + + + + + + + + +
                                                                                        +
                                                                                        +

                                                                                        +

                                                                                        File

                                                                                        +

                                                                                        +

                                                                                        + projects/ng-gallery/src/lib/services/gallery.service.ts +

                                                                                        + + + + + +
                                                                                        +

                                                                                        Index

                                                                                        + + + + + + + + + + + + + + + + + + + + + +
                                                                                        +
                                                                                        Properties
                                                                                        +
                                                                                        + +
                                                                                        +
                                                                                        Methods
                                                                                        +
                                                                                        + +
                                                                                        +
                                                                                        + +
                                                                                        +

                                                                                        Constructor

                                                                                        + + + + + + + + + + + + + +
                                                                                        +constructor(config: GalleryConfig) +
                                                                                        + +
                                                                                        +
                                                                                        + Parameters : + + + + + + + + + + + + + + + + + + +
                                                                                        NameTypeOptional
                                                                                        config + GalleryConfig + + No +
                                                                                        +
                                                                                        +
                                                                                        +
                                                                                        + +
                                                                                        + +

                                                                                        + Methods +

                                                                                        + + + + + + + + + + + + + + + + + + + +
                                                                                        + + + debugConsole + + +
                                                                                        +debugConsole(...data: any[]) +
                                                                                        + +
                                                                                        +

                                                                                        Logger for debugging

                                                                                        +
                                                                                        + +
                                                                                        + Parameters : + + + + + + + + + + + + + + + + + + + +
                                                                                        NameTypeOptional
                                                                                        data + any[] + + No +
                                                                                        +
                                                                                        +
                                                                                        +
                                                                                        +
                                                                                        + Returns : void + +
                                                                                        +
                                                                                        + +
                                                                                        +
                                                                                        + + + + + + + + + + + + + + + + + + + +
                                                                                        + + + Private + deleteInstance + + +
                                                                                        + + deleteInstance(id: string) +
                                                                                        + +
                                                                                        +

                                                                                        A destroyer function for each gallery instance

                                                                                        +
                                                                                        + +
                                                                                        + Parameters : + + + + + + + + + + + + + + + + + + + +
                                                                                        NameTypeOptional
                                                                                        id + string + + No +
                                                                                        +
                                                                                        +
                                                                                        +
                                                                                        +
                                                                                        + Returns : () => void + +
                                                                                        +
                                                                                        + +
                                                                                        +
                                                                                        + + + + + + + + + + + + + + + + + + + +
                                                                                        + + + destroyAll + + +
                                                                                        +destroyAll() +
                                                                                        + +
                                                                                        +

                                                                                        Destroy all gallery instances

                                                                                        +
                                                                                        + +
                                                                                        + Returns : void + +
                                                                                        +
                                                                                        + + + + + + + + + + + + + + + + + + + +
                                                                                        + + + ref + + +
                                                                                        +ref(id: string, config?: GalleryConfig) +
                                                                                        + +
                                                                                        +

                                                                                        Get or create gallery by ID

                                                                                        +
                                                                                        + +
                                                                                        + Parameters : + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                                                                        NameTypeOptionalDefault value
                                                                                        id + string + + No + + 'root' +
                                                                                        config + GalleryConfig + + Yes + +
                                                                                        +
                                                                                        +
                                                                                        +
                                                                                        +
                                                                                        + Returns : GalleryRef + +
                                                                                        +
                                                                                        + +
                                                                                        +
                                                                                        + + + + + + + + + + + + + + + + + + + +
                                                                                        + + + resetAll + + +
                                                                                        +resetAll() +
                                                                                        + +
                                                                                        +

                                                                                        Reset all gallery instances

                                                                                        +
                                                                                        + +
                                                                                        + Returns : void + +
                                                                                        +
                                                                                        +
                                                                                        +
                                                                                        + +

                                                                                        + Properties +

                                                                                        + + + + + + + + + + + + + + + + + +
                                                                                        + + + Private + Readonly + _instances + + +
                                                                                        + Default value : new Map<string, GalleryRef>() +
                                                                                        + +
                                                                                        +

                                                                                        Store gallery instances

                                                                                        +
                                                                                        +
                                                                                        + + + + + + + + + + + + + + + + + +
                                                                                        + + + config + + +
                                                                                        + Type : GalleryConfig + +
                                                                                        + +
                                                                                        +

                                                                                        Global config

                                                                                        +
                                                                                        +
                                                                                        +
                                                                                        + +
                                                                                        + + +
                                                                                        +
                                                                                        import { Inject, Injectable, Optional } from '@angular/core';
                                                                                        +
                                                                                        +import { GalleryRef } from './gallery-ref';
                                                                                        +import { GalleryConfig, GALLERY_CONFIG } from '../models/config.model';
                                                                                        +import { defaultConfig } from '../utils/gallery.default';
                                                                                        +
                                                                                        +@Injectable({
                                                                                        +  providedIn: 'root'
                                                                                        +})
                                                                                        +export class Gallery {
                                                                                        +
                                                                                        +  /** Store gallery instances */
                                                                                        +  private readonly _instances = new Map<string, GalleryRef>();
                                                                                        +
                                                                                        +  /** Global config */
                                                                                        +  config: GalleryConfig;
                                                                                        +
                                                                                        +  constructor(@Optional() @Inject(GALLERY_CONFIG) config: GalleryConfig) {
                                                                                        +    this.config = config ? { ...defaultConfig, ...config } : defaultConfig;
                                                                                        +  }
                                                                                        +
                                                                                        +  /**
                                                                                        +   * Get or create gallery by ID
                                                                                        +   * @param id
                                                                                        +   * @param config
                                                                                        +   */
                                                                                        +  ref(id = 'root', config?: GalleryConfig): GalleryRef {
                                                                                        +    if (this._instances.has(id)) {
                                                                                        +      const galleryRef = this._instances.get(id);
                                                                                        +      if (config) {
                                                                                        +        galleryRef.setConfig({ ...this.config, ...config });
                                                                                        +      }
                                                                                        +      return galleryRef;
                                                                                        +    } else {
                                                                                        +      return this._instances.set(id, new GalleryRef({ ...this.config, ...config }, this.deleteInstance(id))).get(id);
                                                                                        +    }
                                                                                        +  }
                                                                                        +
                                                                                        +  /**
                                                                                        +   * Destroy all gallery instances
                                                                                        +   */
                                                                                        +  destroyAll() {
                                                                                        +    this._instances.forEach((ref: GalleryRef) => ref.destroy());
                                                                                        +  }
                                                                                        +
                                                                                        +  /**
                                                                                        +   * Reset all gallery instances
                                                                                        +   */
                                                                                        +  resetAll() {
                                                                                        +    this._instances.forEach((ref: GalleryRef) => ref.reset());
                                                                                        +  }
                                                                                        +
                                                                                        +  /**
                                                                                        +   * Logger for debugging
                                                                                        +   */
                                                                                        +  debugConsole(...data: any[]): void {
                                                                                        +    if (this.config.debug) {
                                                                                        +      console.log(...data)
                                                                                        +    }
                                                                                        +  }
                                                                                        +
                                                                                        +  /**
                                                                                        +   * A destroyer function for each gallery instance
                                                                                        +   */
                                                                                        +  private deleteInstance(id: string) {
                                                                                        +    return () => {
                                                                                        +      if (this._instances.has(id)) {
                                                                                        +        this._instances.delete(id);
                                                                                        +      }
                                                                                        +    };
                                                                                        +  }
                                                                                        +
                                                                                        +}
                                                                                        +
                                                                                        +
                                                                                        + +
                                                                                        + + + + + + + + + + + + +
                                                                                        +
                                                                                        +

                                                                                        results matching ""

                                                                                        +
                                                                                          +
                                                                                          +
                                                                                          +

                                                                                          No results matching ""

                                                                                          +
                                                                                          +
                                                                                          +
                                                                                          + +
                                                                                          +
                                                                                          + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/documentation/injectables/ImgManager.html b/documentation/injectables/ImgManager.html new file mode 100644 index 00000000..bafd2e74 --- /dev/null +++ b/documentation/injectables/ImgManager.html @@ -0,0 +1,546 @@ + + + + + + ng-gallery-project documentation + + + + + + + + + + + + + +
                                                                                          +
                                                                                          + + +
                                                                                          +
                                                                                          + + + + + + + + + + + + +
                                                                                          +
                                                                                          +

                                                                                          +

                                                                                          File

                                                                                          +

                                                                                          +

                                                                                          + projects/ng-gallery/src/lib/utils/img-manager.ts +

                                                                                          + + + + + +
                                                                                          +

                                                                                          Index

                                                                                          + + + + + + + + + + + + + + + + + + + + + +
                                                                                          +
                                                                                          Properties
                                                                                          +
                                                                                          +
                                                                                            +
                                                                                          • + Private + Readonly + images +
                                                                                          • +
                                                                                          • + Private + Readonly + trigger$ +
                                                                                          • +
                                                                                          +
                                                                                          +
                                                                                          Methods
                                                                                          +
                                                                                          + +
                                                                                          +
                                                                                          + + +
                                                                                          + +

                                                                                          + Methods +

                                                                                          + + + + + + + + + + + + + + + + + + + +
                                                                                          + + + addItem + + +
                                                                                          +addItem(index: number, payload: ImageRegistry) +
                                                                                          + +
                                                                                          + +
                                                                                          + Parameters : + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                                                                          NameTypeOptional
                                                                                          index + number + + No +
                                                                                          payload + ImageRegistry + + No +
                                                                                          +
                                                                                          +
                                                                                          +
                                                                                          +
                                                                                          + Returns : void + +
                                                                                          +
                                                                                          + +
                                                                                          +
                                                                                          + + + + + + + + + + + + + + + + + + + +
                                                                                          + + + deleteItem + + +
                                                                                          +deleteItem(index: number) +
                                                                                          + +
                                                                                          + +
                                                                                          + Parameters : + + + + + + + + + + + + + + + + + + + +
                                                                                          NameTypeOptional
                                                                                          index + number + + No +
                                                                                          +
                                                                                          +
                                                                                          +
                                                                                          +
                                                                                          + Returns : void + +
                                                                                          +
                                                                                          + +
                                                                                          +
                                                                                          + + + + + + + + + + + + + + + + + + + +
                                                                                          + + + getActiveItem + + +
                                                                                          +getActiveItem(state$: Observable<GalleryState>) +
                                                                                          + +
                                                                                          + +
                                                                                          + Parameters : + + + + + + + + + + + + + + + + + + + +
                                                                                          NameTypeOptional
                                                                                          state$ + Observable<GalleryState> + + No +
                                                                                          +
                                                                                          +
                                                                                          +
                                                                                          +
                                                                                          + Returns : Observable<HTMLImageElement> + +
                                                                                          +
                                                                                          + +
                                                                                          +
                                                                                          +
                                                                                          +
                                                                                          + +

                                                                                          + Properties +

                                                                                          + + + + + + + + + + + + + + + + + +
                                                                                          + + + Private + Readonly + images + + +
                                                                                          + Type : Map<number | ImageRegistry> + +
                                                                                          + Default value : new Map<number, ImageRegistry>() +
                                                                                          + +
                                                                                          + + + + + + + + + + + + + + + + + +
                                                                                          + + + Private + Readonly + trigger$ + + +
                                                                                          + Type : BehaviorSubject<void> + +
                                                                                          + Default value : new BehaviorSubject<void>(null) +
                                                                                          + +
                                                                                          +
                                                                                          + +
                                                                                          + + +
                                                                                          +
                                                                                          import { Injectable } from '@angular/core';
                                                                                          +import { Observable, BehaviorSubject, filter, map, switchMap, EMPTY } from 'rxjs';
                                                                                          +import { GalleryState } from '../models/gallery.model';
                                                                                          +import { ItemState } from '../components/templates/items.model';
                                                                                          +
                                                                                          +interface ImageRegistry {
                                                                                          +  state: Observable<ItemState>;
                                                                                          +  target: HTMLImageElement;
                                                                                          +}
                                                                                          +
                                                                                          +@Injectable()
                                                                                          +export class ImgManager {
                                                                                          +
                                                                                          +  private readonly trigger$: BehaviorSubject<void> = new BehaviorSubject<void>(null);
                                                                                          +
                                                                                          +  private readonly images: Map<number, ImageRegistry> = new Map<number, ImageRegistry>();
                                                                                          +
                                                                                          +  getActiveItem(state$: Observable<GalleryState>): Observable<HTMLImageElement> {
                                                                                          +    return this.trigger$.pipe(
                                                                                          +      switchMap(() => state$.pipe(
                                                                                          +        switchMap((state: GalleryState) => {
                                                                                          +          const img: ImageRegistry = this.images.get(state.currIndex);
                                                                                          +          if (img) {
                                                                                          +            return img.state.pipe(
                                                                                          +              filter((state: ItemState) => state !== 'loading'),
                                                                                          +              map(() => img.target)
                                                                                          +            )
                                                                                          +          }
                                                                                          +          return EMPTY;
                                                                                          +        })
                                                                                          +      ))
                                                                                          +    );
                                                                                          +  }
                                                                                          +
                                                                                          +  addItem(index: number, payload: ImageRegistry): void {
                                                                                          +    this.images.set(index, payload);
                                                                                          +    this.trigger$.next();
                                                                                          +  }
                                                                                          +
                                                                                          +  deleteItem(index: number): void {
                                                                                          +    if (this.images.has(index)) {
                                                                                          +      this.images.delete(index);
                                                                                          +      this.trigger$.next();
                                                                                          +    }
                                                                                          +  }
                                                                                          +}
                                                                                          +
                                                                                          +
                                                                                          + +
                                                                                          + + + + + + + + + + + + +
                                                                                          +
                                                                                          +

                                                                                          results matching ""

                                                                                          +
                                                                                            +
                                                                                            +
                                                                                            +

                                                                                            No results matching ""

                                                                                            +
                                                                                            +
                                                                                            +
                                                                                            + +
                                                                                            +
                                                                                            + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/documentation/injectables/Lightbox.html b/documentation/injectables/Lightbox.html new file mode 100644 index 00000000..e8607d46 --- /dev/null +++ b/documentation/injectables/Lightbox.html @@ -0,0 +1,786 @@ + + + + + + ng-gallery-project documentation + + + + + + + + + + + + + +
                                                                                            +
                                                                                            + + +
                                                                                            +
                                                                                            + + + + + + + + + + + + +
                                                                                            +
                                                                                            +

                                                                                            +

                                                                                            File

                                                                                            +

                                                                                            +

                                                                                            + projects/ng-gallery/lightbox/src/lightbox.service.ts +

                                                                                            + + + + + +
                                                                                            +

                                                                                            Index

                                                                                            + + + + + + + + + + + + + + + + + + + + + +
                                                                                            +
                                                                                            Properties
                                                                                            +
                                                                                            + +
                                                                                            +
                                                                                            Methods
                                                                                            +
                                                                                            + +
                                                                                            +
                                                                                            + +
                                                                                            +

                                                                                            Constructor

                                                                                            + + + + + + + + + + + + + +
                                                                                            +constructor(config: LightboxConfig, _gallery: Gallery, _overlay: Overlay, _sanitizer: DomSanitizer) +
                                                                                            + +
                                                                                            +
                                                                                            + Parameters : + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                                                                            NameTypeOptional
                                                                                            config + LightboxConfig + + No +
                                                                                            _gallery + Gallery + + No +
                                                                                            _overlay + Overlay + + No +
                                                                                            _sanitizer + DomSanitizer + + No +
                                                                                            +
                                                                                            +
                                                                                            +
                                                                                            + +
                                                                                            + +

                                                                                            + Methods +

                                                                                            + + + + + + + + + + + + + + + + + + + +
                                                                                            + + + close + + +
                                                                                            +close() +
                                                                                            + +
                                                                                            +

                                                                                            Close Lightbox Overlay

                                                                                            +
                                                                                            + +
                                                                                            + Returns : void + +
                                                                                            +
                                                                                            + + + + + + + + + + + + + + + + + + + +
                                                                                            + + + open + + +
                                                                                            +open(i: number, id: string, config?: LightboxConfig) +
                                                                                            + +
                                                                                            +

                                                                                            Open Lightbox Overlay

                                                                                            +
                                                                                            + +
                                                                                            + Parameters : + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                                                                            NameTypeOptionalDefault valueDescription
                                                                                            i + number + + No + + 0 + +
                                                                                              +
                                                                                            • Current Index
                                                                                            • +
                                                                                            + +
                                                                                            id + string + + No + + 'lightbox' + +
                                                                                              +
                                                                                            • Gallery ID
                                                                                            • +
                                                                                            + +
                                                                                            config + LightboxConfig + + Yes + + +
                                                                                              +
                                                                                            • Lightbox Config
                                                                                            • +
                                                                                            + +
                                                                                            +
                                                                                            +
                                                                                            +
                                                                                            +
                                                                                            + Returns : void + +
                                                                                            +
                                                                                            + +
                                                                                            +
                                                                                            + + + + + + + + + + + + + + + + + + + +
                                                                                            + + + setConfig + + +
                                                                                            +setConfig(config: LightboxConfig) +
                                                                                            + +
                                                                                            +

                                                                                            Set Lightbox Config

                                                                                            +
                                                                                            + +
                                                                                            + Parameters : + + + + + + + + + + + + + + + + + + + + + +
                                                                                            NameTypeOptionalDescription
                                                                                            config + LightboxConfig + + No + +
                                                                                              +
                                                                                            • LightboxConfig
                                                                                            • +
                                                                                            + +
                                                                                            +
                                                                                            +
                                                                                            +
                                                                                            +
                                                                                            + Returns : void + +
                                                                                            +
                                                                                            + +
                                                                                            +
                                                                                            +
                                                                                            +
                                                                                            + +

                                                                                            + Properties +

                                                                                            + + + + + + + + + + + + + + + + + +
                                                                                            + + + Private + _config + + +
                                                                                            + Type : LightboxConfig + +
                                                                                            + +
                                                                                            +

                                                                                            Global config

                                                                                            +
                                                                                            +
                                                                                            + + + + + + + + + + + + + + + + + +
                                                                                            + + + Private + _overlayRef + + +
                                                                                            + Type : OverlayRef + +
                                                                                            + +
                                                                                            +

                                                                                            Gallery overlay ref

                                                                                            +
                                                                                            +
                                                                                            + + + + + + + + + + + + + + + + + +
                                                                                            + + + closed + + +
                                                                                            + Default value : new Subject<string>() +
                                                                                            + +
                                                                                            +

                                                                                            Stream that emits when lightbox is closed

                                                                                            +
                                                                                            +
                                                                                            + + + + + + + + + + + + + + + + + +
                                                                                            + + + opened + + +
                                                                                            + Default value : new Subject<string>() +
                                                                                            + +
                                                                                            +

                                                                                            Stream that emits when lightbox is opened

                                                                                            +
                                                                                            +
                                                                                            +
                                                                                            + +
                                                                                            + + +
                                                                                            +
                                                                                            import { ComponentRef, Inject, Injectable, Optional } from '@angular/core';
                                                                                            +import { DomSanitizer } from '@angular/platform-browser';
                                                                                            +import { ComponentPortal } from '@angular/cdk/portal';
                                                                                            +import { Overlay, OverlayRef, OverlayConfig } from '@angular/cdk/overlay';
                                                                                            +import { LEFT_ARROW, RIGHT_ARROW, ESCAPE } from '@angular/cdk/keycodes';
                                                                                            +import { Gallery } from 'ng-gallery';
                                                                                            +import { Subject } from 'rxjs';
                                                                                            +
                                                                                            +import { LightboxConfig, LIGHTBOX_CONFIG } from './lightbox.model';
                                                                                            +import { defaultConfig } from './lightbox.default';
                                                                                            +import { LightboxComponent } from './lightbox.component';
                                                                                            +
                                                                                            +@Injectable({
                                                                                            +  providedIn: 'root'
                                                                                            +})
                                                                                            +export class Lightbox {
                                                                                            +
                                                                                            +  /** Gallery overlay ref */
                                                                                            +  private _overlayRef: OverlayRef;
                                                                                            +
                                                                                            +  /** Global config */
                                                                                            +  private _config: LightboxConfig;
                                                                                            +
                                                                                            +  /** Stream that emits when lightbox is opened */
                                                                                            +  opened = new Subject<string>();
                                                                                            +
                                                                                            +  /** Stream that emits when lightbox is closed */
                                                                                            +  closed = new Subject<string>();
                                                                                            +
                                                                                            +  constructor(@Optional() @Inject(LIGHTBOX_CONFIG) config: LightboxConfig, private _gallery: Gallery, private _overlay: Overlay, private _sanitizer: DomSanitizer) {
                                                                                            +    this._config = config ? { ...defaultConfig, ...config } : defaultConfig;
                                                                                            +  }
                                                                                            +
                                                                                            +  /**
                                                                                            +   * Set Lightbox Config
                                                                                            +   * @param config - LightboxConfig
                                                                                            +   */
                                                                                            +  setConfig(config: LightboxConfig) {
                                                                                            +    this._config = { ...this._config, ...config };
                                                                                            +  }
                                                                                            +
                                                                                            +  /**
                                                                                            +   * Open Lightbox Overlay
                                                                                            +   * @param i - Current Index
                                                                                            +   * @param id - Gallery ID
                                                                                            +   * @param config - Lightbox Config
                                                                                            +   */
                                                                                            +  open(i = 0, id = 'lightbox', config?: LightboxConfig) {
                                                                                            +
                                                                                            +    const _config: LightboxConfig = config ? { ...this._config, ...config } : this._config;
                                                                                            +
                                                                                            +    const overlayConfig: OverlayConfig = {
                                                                                            +      backdropClass: _config.backdropClass,
                                                                                            +      panelClass: _config.panelClass,
                                                                                            +      hasBackdrop: _config.hasBackdrop,
                                                                                            +      positionStrategy: this._overlay.position().global().centerHorizontally().centerVertically(),
                                                                                            +      scrollStrategy: this._overlay.scrollStrategies.block(),
                                                                                            +      disposeOnNavigation: true
                                                                                            +    };
                                                                                            +
                                                                                            +    const galleryRef = this._gallery.ref(id);
                                                                                            +    galleryRef.set(i);
                                                                                            +
                                                                                            +    this._overlayRef = this._overlay.create(overlayConfig);
                                                                                            +
                                                                                            +    // overlay opened event
                                                                                            +    this._overlayRef.attachments().subscribe(() => this.opened.next(id));
                                                                                            +
                                                                                            +    // overlay closed event
                                                                                            +    this._overlayRef.detachments().subscribe(() => this.closed.next(id));
                                                                                            +
                                                                                            +    // Attach gallery to the overlay
                                                                                            +    const galleryPortal = new ComponentPortal(LightboxComponent);
                                                                                            +    const lightboxRef: ComponentRef<LightboxComponent> = this._overlayRef.attach(galleryPortal);
                                                                                            +
                                                                                            +    lightboxRef.instance.id = id;
                                                                                            +    lightboxRef.instance.overlayRef = this._overlayRef;
                                                                                            +    lightboxRef.instance.closeIcon = this._sanitizer.bypassSecurityTrustHtml(this._config.closeIcon);
                                                                                            +    lightboxRef.instance.role = this._config.role;
                                                                                            +    lightboxRef.instance.ariaLabel = this._config.ariaLabel;
                                                                                            +    lightboxRef.instance.ariaLabelledBy = this._config.ariaLabelledBy;
                                                                                            +    lightboxRef.instance.ariaDescribedBy = this._config.ariaDescribedBy;
                                                                                            +    lightboxRef.instance.startAnimationTime = this._config.startAnimationTime;
                                                                                            +    lightboxRef.instance.exitAnimationTime = this._config.exitAnimationTime;
                                                                                            +
                                                                                            +    if (_config.hasBackdrop) {
                                                                                            +      this._overlayRef.backdropClick().subscribe(() => this.close());
                                                                                            +    }
                                                                                            +
                                                                                            +    // Add keyboard shortcuts
                                                                                            +    if (_config.keyboardShortcuts) {
                                                                                            +      this._overlayRef.keydownEvents().subscribe((event: any) => {
                                                                                            +        switch (event.keyCode) {
                                                                                            +          case LEFT_ARROW:
                                                                                            +            galleryRef.prev();
                                                                                            +            break;
                                                                                            +          case RIGHT_ARROW:
                                                                                            +            galleryRef.next();
                                                                                            +            break;
                                                                                            +          case ESCAPE:
                                                                                            +            this.close();
                                                                                            +        }
                                                                                            +      });
                                                                                            +    }
                                                                                            +  }
                                                                                            +
                                                                                            +  /**
                                                                                            +   * Close Lightbox Overlay
                                                                                            +   */
                                                                                            +  close() {
                                                                                            +    if (this._overlayRef.hasAttached()) {
                                                                                            +      this._overlayRef.detach();
                                                                                            +    }
                                                                                            +  }
                                                                                            +}
                                                                                            +
                                                                                            +
                                                                                            + +
                                                                                            + + + + + + + + + + + + +
                                                                                            +
                                                                                            +

                                                                                            results matching ""

                                                                                            +
                                                                                              +
                                                                                              +
                                                                                              +

                                                                                              No results matching ""

                                                                                              +
                                                                                              +
                                                                                              +
                                                                                              + +
                                                                                              +
                                                                                              + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/documentation/injectables/Pixabay.html b/documentation/injectables/Pixabay.html new file mode 100644 index 00000000..46f3a92f --- /dev/null +++ b/documentation/injectables/Pixabay.html @@ -0,0 +1,382 @@ + + + + + + ng-gallery-project documentation + + + + + + + + + + + + + +
                                                                                              +
                                                                                              + + +
                                                                                              +
                                                                                              + + + + + + + + + + + + +
                                                                                              +
                                                                                              +

                                                                                              +

                                                                                              File

                                                                                              +

                                                                                              +

                                                                                              + projects/ng-gallery/src/stories/pixabay/pixabay.service.ts +

                                                                                              + + + + + +
                                                                                              +

                                                                                              Index

                                                                                              + + + + + + + + + + + + + + + + + + + + + +
                                                                                              +
                                                                                              Properties
                                                                                              +
                                                                                              +
                                                                                                +
                                                                                              • + Private + Readonly + API_KEY +
                                                                                              • +
                                                                                              +
                                                                                              +
                                                                                              Methods
                                                                                              +
                                                                                              + +
                                                                                              +
                                                                                              + +
                                                                                              +

                                                                                              Constructor

                                                                                              + + + + + + + + + + + + + +
                                                                                              +constructor(_http: HttpClient) +
                                                                                              + +
                                                                                              +
                                                                                              + Parameters : + + + + + + + + + + + + + + + + + + +
                                                                                              NameTypeOptional
                                                                                              _http + HttpClient + + No +
                                                                                              +
                                                                                              +
                                                                                              +
                                                                                              + +
                                                                                              + +

                                                                                              + Methods +

                                                                                              + + + + + + + + + + + + + + + + + + + +
                                                                                              + + + getHDImages + + +
                                                                                              +getHDImages(key: string) +
                                                                                              + +
                                                                                              + +
                                                                                              + Parameters : + + + + + + + + + + + + + + + + + + + +
                                                                                              NameTypeOptional
                                                                                              key + string + + No +
                                                                                              +
                                                                                              +
                                                                                              +
                                                                                              +
                                                                                              + Returns : Observable<GalleryItem[]> + +
                                                                                              +
                                                                                              + +
                                                                                              +
                                                                                              +
                                                                                              +
                                                                                              + +

                                                                                              + Properties +

                                                                                              + + + + + + + + + + + + + + + + + +
                                                                                              + + + Private + Readonly + API_KEY + + +
                                                                                              + Type : string + +
                                                                                              + Default value : '560162-704dd2880c027f22c62ab7941' +
                                                                                              + +
                                                                                              +
                                                                                              + +
                                                                                              + + +
                                                                                              +
                                                                                              import { Injectable } from '@angular/core';
                                                                                              +import { HttpClient } from '@angular/common/http';
                                                                                              +import { Observable, shareReplay, map } from 'rxjs';
                                                                                              +
                                                                                              +import { ImageItem, GalleryItem } from 'ng-gallery';
                                                                                              +
                                                                                              +import { Hit2, PixabayHDModel } from './pixabay.model';
                                                                                              +
                                                                                              +@Injectable({
                                                                                              +  providedIn: 'root'
                                                                                              +})
                                                                                              +export class Pixabay {
                                                                                              +
                                                                                              +  private readonly API_KEY: string = '560162-704dd2880c027f22c62ab7941';
                                                                                              +
                                                                                              +  constructor(private _http: HttpClient) {
                                                                                              +  }
                                                                                              +
                                                                                              +  getHDImages(key: string): Observable<GalleryItem[]> {
                                                                                              +    const URL = `https://pixabay.com/api/?key=${ this.API_KEY }&q=${ encodeURIComponent(key) }&response_group=high_resolution&editors_choice=true&per_page=18&image_type=photo`;
                                                                                              +    return this._http.get(URL).pipe(
                                                                                              +      map((res: PixabayHDModel) => {
                                                                                              +        return res.hits.map((item: Hit2, i: number) => new ImageItem({ src: item.largeImageURL, thumb: item.previewURL, alt: `photo-${ i }` }));
                                                                                              +      }),
                                                                                              +      shareReplay(1)
                                                                                              +    );
                                                                                              +  }
                                                                                              +}
                                                                                              +
                                                                                              +
                                                                                              + +
                                                                                              + + + + + + + + + + + + +
                                                                                              +
                                                                                              +

                                                                                              results matching ""

                                                                                              +
                                                                                                +
                                                                                                +
                                                                                                +

                                                                                                No results matching ""

                                                                                                +
                                                                                                +
                                                                                                +
                                                                                                + +
                                                                                                +
                                                                                                + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/documentation/interfaces/BezierEasingOptions.html b/documentation/interfaces/BezierEasingOptions.html new file mode 100644 index 00000000..5af1a696 --- /dev/null +++ b/documentation/interfaces/BezierEasingOptions.html @@ -0,0 +1,357 @@ + + + + + + ng-gallery-project documentation + + + + + + + + + + + + + +
                                                                                                +
                                                                                                + + +
                                                                                                +
                                                                                                + + + + + + + + + + + + + + + + + +
                                                                                                +
                                                                                                +

                                                                                                +

                                                                                                File

                                                                                                +

                                                                                                +

                                                                                                + projects/ng-gallery/src/lib/smooth-scroll/smooth-scroll.model.ts +

                                                                                                + + + + +
                                                                                                +

                                                                                                Index

                                                                                                + + + + + + + + + +
                                                                                                +
                                                                                                Properties
                                                                                                +
                                                                                                + +
                                                                                                +
                                                                                                + + + +
                                                                                                +

                                                                                                Properties

                                                                                                + + + + + + + + + + + + + + + + + + + +
                                                                                                + + x1 + + + + +
                                                                                                + x1: number + +
                                                                                                + Type : number + +
                                                                                                + + + + + + + + + + + + + + + + + + + +
                                                                                                + + x2 + + + + +
                                                                                                + x2: number + +
                                                                                                + Type : number + +
                                                                                                + + + + + + + + + + + + + + + + + + + +
                                                                                                + + y1 + + + + +
                                                                                                + y1: number + +
                                                                                                + Type : number + +
                                                                                                + + + + + + + + + + + + + + + + + + + +
                                                                                                + + y2 + + + + +
                                                                                                + y2: number + +
                                                                                                + Type : number + +
                                                                                                +
                                                                                                +
                                                                                                + + +
                                                                                                +
                                                                                                import { InjectionToken } from '@angular/core';
                                                                                                +import { _XAxis, _YAxis } from '@angular/cdk/scrolling';
                                                                                                +
                                                                                                +export const SMOOTH_SCROLL_OPTIONS: InjectionToken<SmoothScrollOptions> = new InjectionToken<SmoothScrollOptions>('SMOOTH_SCROLL_OPTIONS');
                                                                                                +
                                                                                                +export type SmoothScrollToOptions = _XAxis & _YAxis & SmoothScrollOptions;
                                                                                                +
                                                                                                +export interface SmoothScrollOptions {
                                                                                                +  duration?: number;
                                                                                                +  easing?: BezierEasingOptions;
                                                                                                +}
                                                                                                +
                                                                                                +export interface SmoothScrollStep {
                                                                                                +  scrollable: HTMLElement;
                                                                                                +  startTime: number;
                                                                                                +  startX: number;
                                                                                                +  startY: number;
                                                                                                +  x: number;
                                                                                                +  y: number;
                                                                                                +  duration: number;
                                                                                                +  easing: (k: number) => number;
                                                                                                +  currentX?: number;
                                                                                                +  currentY?: number;
                                                                                                +}
                                                                                                +
                                                                                                +export interface BezierEasingOptions {
                                                                                                +  x1: number;
                                                                                                +  y1: number;
                                                                                                +  x2: number;
                                                                                                +  y2: number;
                                                                                                +}
                                                                                                +
                                                                                                +
                                                                                                +
                                                                                                + + + + + + + +
                                                                                                +
                                                                                                +

                                                                                                results matching ""

                                                                                                +
                                                                                                  +
                                                                                                  +
                                                                                                  +

                                                                                                  No results matching ""

                                                                                                  +
                                                                                                  +
                                                                                                  +
                                                                                                  + +
                                                                                                  +
                                                                                                  + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/documentation/interfaces/GalleryConfig.html b/documentation/interfaces/GalleryConfig.html new file mode 100644 index 00000000..be6ae556 --- /dev/null +++ b/documentation/interfaces/GalleryConfig.html @@ -0,0 +1,2155 @@ + + + + + + ng-gallery-project documentation + + + + + + + + + + + + + +
                                                                                                  +
                                                                                                  + + +
                                                                                                  +
                                                                                                  + + + + + + + + + + + + + + + + + +
                                                                                                  +
                                                                                                  +

                                                                                                  +

                                                                                                  File

                                                                                                  +

                                                                                                  +

                                                                                                  + projects/ng-gallery/src/lib/models/config.model.ts +

                                                                                                  + + + + +
                                                                                                  +

                                                                                                  Index

                                                                                                  + + + + + + + + + +
                                                                                                  +
                                                                                                  Properties
                                                                                                  +
                                                                                                  + +
                                                                                                  +
                                                                                                  + + + +
                                                                                                  +

                                                                                                  Properties

                                                                                                  + + + + + + + + + + + + + + + + + + + + + + +
                                                                                                  + + autoHeight + + + + +
                                                                                                  + autoHeight: boolean + +
                                                                                                  + Type : boolean + +
                                                                                                  + Optional +
                                                                                                  + + + + + + + + + + + + + + + + + + + + + + +
                                                                                                  + + autoplay + + + + +
                                                                                                  + autoplay: boolean + +
                                                                                                  + Type : boolean + +
                                                                                                  + Optional +
                                                                                                  + + + + + + + + + + + + + + + + + + + + + + +
                                                                                                  + + boxTemplate + + + + +
                                                                                                  + boxTemplate: TemplateRef<any> + +
                                                                                                  + Type : TemplateRef<any> + +
                                                                                                  + Optional +
                                                                                                  + + + + + + + + + + + + + + + + + + + + + + +
                                                                                                  + + counter + + + + +
                                                                                                  + counter: boolean + +
                                                                                                  + Type : boolean + +
                                                                                                  + Optional +
                                                                                                  + + + + + + + + + + + + + + + + + + + + + + +
                                                                                                  + + counterPosition + + + + +
                                                                                                  + counterPosition: "top" | "bottom" + +
                                                                                                  + Type : "top" | "bottom" + +
                                                                                                  + Optional +
                                                                                                  + + + + + + + + + + + + + + + + + + + + + + +
                                                                                                  + + debug + + + + +
                                                                                                  + debug: boolean + +
                                                                                                  + Type : boolean + +
                                                                                                  + Optional +
                                                                                                  + + + + + + + + + + + + + + + + + + + + + + +
                                                                                                  + + disableThumb + + + + +
                                                                                                  + disableThumb: boolean + +
                                                                                                  + Type : boolean + +
                                                                                                  + Optional +
                                                                                                  + + + + + + + + + + + + + + + + + + + + + + +
                                                                                                  + + dots + + + + +
                                                                                                  + dots: boolean + +
                                                                                                  + Type : boolean + +
                                                                                                  + Optional +
                                                                                                  + + + + + + + + + + + + + + + + + + + + + + +
                                                                                                  + + bulletsPosition + + + + +
                                                                                                  + bulletsPosition: "top" | "bottom" + +
                                                                                                  + Type : "top" | "bottom" + +
                                                                                                  + Optional +
                                                                                                  + + + + + + + + + + + + + + + + + + + + + + +
                                                                                                  + + dotsSize + + + + +
                                                                                                  + dotsSize: number + +
                                                                                                  + Type : number + +
                                                                                                  + Optional +
                                                                                                  + + + + + + + + + + + + + + + + + + + + + + +
                                                                                                  + + imageSize + + + + +
                                                                                                  + imageSize: "cover" | "contain" + +
                                                                                                  + Type : "cover" | "contain" + +
                                                                                                  + Optional +
                                                                                                  + + + + + + + + + + + + + + + + + + + + + + +
                                                                                                  + + imageTemplate + + + + +
                                                                                                  + imageTemplate: TemplateRef<any> + +
                                                                                                  + Type : TemplateRef<any> + +
                                                                                                  + Optional +
                                                                                                  + + + + + + + + + + + + + + + + + + + + + + +
                                                                                                  + + itemAutosize + + + + +
                                                                                                  + itemAutosize: boolean + +
                                                                                                  + Type : boolean + +
                                                                                                  + Optional +
                                                                                                  + + + + + + + + + + + + + + + + + + + + + + +
                                                                                                  + + itemTemplate + + + + +
                                                                                                  + itemTemplate: TemplateRef<any> + +
                                                                                                  + Type : TemplateRef<any> + +
                                                                                                  + Optional +
                                                                                                  + + + + + + + + + + + + + + + + + + + + + + +
                                                                                                  + + loadingAttr + + + + +
                                                                                                  + loadingAttr: "eager" | "lazy" + +
                                                                                                  + Type : "eager" | "lazy" + +
                                                                                                  + Optional +
                                                                                                  + + + + + + + + + + + + + + + + + + + + + + +
                                                                                                  + + loadingError + + + + +
                                                                                                  + loadingError: string + +
                                                                                                  + Type : string + +
                                                                                                  + Optional +
                                                                                                  + + + + + + + + + + + + + + + + + + + + + + +
                                                                                                  + + loadingIcon + + + + +
                                                                                                  + loadingIcon: string + +
                                                                                                  + Type : string + +
                                                                                                  + Optional +
                                                                                                  + + + + + + + + + + + + + + + + + + + + + + +
                                                                                                  + + loadingStrategy + + + + +
                                                                                                  + loadingStrategy: "preload" | "lazy" | "default" + +
                                                                                                  + Type : "preload" | "lazy" | "default" + +
                                                                                                  + Optional +
                                                                                                  + + + + + + + + + + + + + + + + + + + + + + +
                                                                                                  + + loop + + + + +
                                                                                                  + loop: boolean + +
                                                                                                  + Type : boolean + +
                                                                                                  + Optional +
                                                                                                  + + + + + + + + + + + + + + + + + + + + + + +
                                                                                                  + + mouseSlidingDisabled + + + + +
                                                                                                  + mouseSlidingDisabled: boolean + +
                                                                                                  + Type : boolean + +
                                                                                                  + Optional +
                                                                                                  + + + + + + + + + + + + + + + + + + + + + + +
                                                                                                  + + nav + + + + +
                                                                                                  + nav: boolean + +
                                                                                                  + Type : boolean + +
                                                                                                  + Optional +
                                                                                                  + + + + + + + + + + + + + + + + + + + + + + +
                                                                                                  + + navIcon + + + + +
                                                                                                  + navIcon: string + +
                                                                                                  + Type : string + +
                                                                                                  + Optional +
                                                                                                  + + + + + + + + + + + + + + + + + + + + + + +
                                                                                                  + + navScrollBehavior + + + + +
                                                                                                  + navScrollBehavior: ScrollBehavior + +
                                                                                                  + Type : ScrollBehavior + +
                                                                                                  + Optional +
                                                                                                  + + + + + + + + + + + + + + + + + + + + + + +
                                                                                                  + + playerInterval + + + + +
                                                                                                  + playerInterval: number + +
                                                                                                  + Type : number + +
                                                                                                  + Optional +
                                                                                                  + + + + + + + + + + + + + + + + + + + + + + +
                                                                                                  + + resizeDebounceTime + + + + +
                                                                                                  + resizeDebounceTime: number + +
                                                                                                  + Type : number + +
                                                                                                  + Optional +
                                                                                                  + + + + + + + + + + + + + + + + + + + + + + +
                                                                                                  + + scrollBehavior + + + + +
                                                                                                  + scrollBehavior: ScrollBehavior + +
                                                                                                  + Type : ScrollBehavior + +
                                                                                                  + Optional +
                                                                                                  + + + + + + + + + + + + + + + + + + + + + + +
                                                                                                  + + slidingDirection + + + + +
                                                                                                  + slidingDirection: "horizontal" | "vertical" + +
                                                                                                  + Type : "horizontal" | "vertical" + +
                                                                                                  + Optional +
                                                                                                  + + + + + + + + + + + + + + + + + + + + + + +
                                                                                                  + + slidingDisabled + + + + +
                                                                                                  + slidingDisabled: boolean + +
                                                                                                  + Type : boolean + +
                                                                                                  + Optional +
                                                                                                  + + + + + + + + + + + + + + + + + + + + + + +
                                                                                                  + + slidingDuration + + + + +
                                                                                                  + slidingDuration: number + +
                                                                                                  + Type : number + +
                                                                                                  + Optional +
                                                                                                  + + + + + + + + + + + + + + + + + + + + + + +
                                                                                                  + + slidingEase + + + + +
                                                                                                  + slidingEase: BezierEasingOptions + +
                                                                                                  + Type : BezierEasingOptions + +
                                                                                                  + Optional +
                                                                                                  + + + + + + + + + + + + + + + + + + + + + + +
                                                                                                  + + thumb + + + + +
                                                                                                  + thumb: boolean + +
                                                                                                  + Type : boolean + +
                                                                                                  + Optional +
                                                                                                  + + + + + + + + + + + + + + + + + + + + + + +
                                                                                                  + + thumbAutosize + + + + +
                                                                                                  + thumbAutosize: boolean + +
                                                                                                  + Type : boolean + +
                                                                                                  + Optional +
                                                                                                  + + + + + + + + + + + + + + + + + + + + + + +
                                                                                                  + + thumbDetached + + + + +
                                                                                                  + thumbDetached: boolean + +
                                                                                                  + Type : boolean + +
                                                                                                  + Optional +
                                                                                                  + + + + + + + + + + + + + + + + + + + + + + +
                                                                                                  + + thumbHeight + + + + +
                                                                                                  + thumbHeight: number + +
                                                                                                  + Type : number + +
                                                                                                  + Optional +
                                                                                                  + + + + + + + + + + + + + + + + + + + + + + +
                                                                                                  + + thumbImageSize + + + + +
                                                                                                  + thumbImageSize: "cover" | "contain" + +
                                                                                                  + Type : "cover" | "contain" + +
                                                                                                  + Optional +
                                                                                                  + + + + + + + + + + + + + + + + + + + + + + +
                                                                                                  + + thumbLoadingError + + + + +
                                                                                                  + thumbLoadingError: string + +
                                                                                                  + Type : string + +
                                                                                                  + Optional +
                                                                                                  + + + + + + + + + + + + + + + + + + + + + + +
                                                                                                  + + thumbLoadingIcon + + + + +
                                                                                                  + thumbLoadingIcon: string + +
                                                                                                  + Type : string + +
                                                                                                  + Optional +
                                                                                                  + + + + + + + + + + + + + + + + + + + + + + +
                                                                                                  + + thumbMouseSlidingDisabled + + + + +
                                                                                                  + thumbMouseSlidingDisabled: boolean + +
                                                                                                  + Type : boolean + +
                                                                                                  + Optional +
                                                                                                  + + + + + + + + + + + + + + + + + + + + + + +
                                                                                                  + + thumbPosition + + + + +
                                                                                                  + thumbPosition: "top" | "left" | "right" | "bottom" + +
                                                                                                  + Type : "top" | "left" | "right" | "bottom" + +
                                                                                                  + Optional +
                                                                                                  + + + + + + + + + + + + + + + + + + + + + + +
                                                                                                  + + thumbSlidingDisabled + + + + +
                                                                                                  + thumbSlidingDisabled: boolean + +
                                                                                                  + Type : boolean + +
                                                                                                  + Optional +
                                                                                                  + + + + + + + + + + + + + + + + + + + + + + +
                                                                                                  + + thumbTemplate + + + + +
                                                                                                  + thumbTemplate: TemplateRef<any> + +
                                                                                                  + Type : TemplateRef<any> + +
                                                                                                  + Optional +
                                                                                                  + + + + + + + + + + + + + + + + + + + + + + +
                                                                                                  + + thumbView + + + + +
                                                                                                  + thumbView: "default" | "contain" + +
                                                                                                  + Type : "default" | "contain" + +
                                                                                                  + Optional +
                                                                                                  + + + + + + + + + + + + + + + + + + + + + + +
                                                                                                  + + thumbWidth + + + + +
                                                                                                  + thumbWidth: number + +
                                                                                                  + Type : number + +
                                                                                                  + Optional +
                                                                                                  +
                                                                                                  +
                                                                                                  + + +
                                                                                                  +
                                                                                                  import { InjectionToken, TemplateRef } from '@angular/core';
                                                                                                  +import { BezierEasingOptions } from '../smooth-scroll';
                                                                                                  +
                                                                                                  +export const GALLERY_CONFIG = new InjectionToken<GalleryConfig>('GALLERY_CONFIG');
                                                                                                  +
                                                                                                  +export interface GalleryConfig {
                                                                                                  +  scrollBehavior?: ScrollBehavior;
                                                                                                  +  navScrollBehavior?: ScrollBehavior;
                                                                                                  +  nav?: boolean;
                                                                                                  +  dots?: boolean;
                                                                                                  +  loop?: boolean;
                                                                                                  +  thumb?: boolean;
                                                                                                  +  navIcon?: string;
                                                                                                  +  counter?: boolean;
                                                                                                  +  dotsSize?: number;
                                                                                                  +  autoplay?: boolean;
                                                                                                  +  thumbWidth?: number;
                                                                                                  +  thumbHeight?: number;
                                                                                                  +  loadingIcon?: string;
                                                                                                  +  loadingError?: string;
                                                                                                  +  thumbLoadingIcon?: string;
                                                                                                  +  thumbLoadingError?: string;
                                                                                                  +  disableThumb?: boolean;
                                                                                                  +  slidingDuration?: number;
                                                                                                  +  slidingEase?: BezierEasingOptions;
                                                                                                  +  slidingDisabled?: boolean;
                                                                                                  +  thumbSlidingDisabled?: boolean;
                                                                                                  +  mouseSlidingDisabled?: boolean;
                                                                                                  +  thumbMouseSlidingDisabled?: boolean;
                                                                                                  +  resizeDebounceTime?: number;
                                                                                                  +  playerInterval?: number;
                                                                                                  +  boxTemplate?: TemplateRef<any>;
                                                                                                  +  itemTemplate?: TemplateRef<any>;
                                                                                                  +  imageTemplate?: TemplateRef<any>;
                                                                                                  +  thumbTemplate?: TemplateRef<any>;
                                                                                                  +  thumbDetached?: boolean;
                                                                                                  +  imageSize?: 'cover' | 'contain';
                                                                                                  +  thumbImageSize?: 'cover' | 'contain';
                                                                                                  +  bulletsPosition?: 'top' | 'bottom';
                                                                                                  +  counterPosition?: 'top' | 'bottom';
                                                                                                  +  slidingDirection?: 'horizontal' | 'vertical';
                                                                                                  +  loadingStrategy?: 'preload' | 'lazy' | 'default';
                                                                                                  +  loadingAttr?: 'eager' | 'lazy';
                                                                                                  +  thumbPosition?: 'top' | 'left' | 'right' | 'bottom';
                                                                                                  +  thumbView?: 'default' | 'contain';
                                                                                                  +  thumbAutosize?: boolean;
                                                                                                  +  itemAutosize?: boolean;
                                                                                                  +  autoHeight?: boolean;
                                                                                                  +  debug?: boolean;
                                                                                                  +}
                                                                                                  +
                                                                                                  +
                                                                                                  +
                                                                                                  + + + + + + + +
                                                                                                  +
                                                                                                  +

                                                                                                  results matching ""

                                                                                                  +
                                                                                                    +
                                                                                                    +
                                                                                                    +

                                                                                                    No results matching ""

                                                                                                    +
                                                                                                    +
                                                                                                    +
                                                                                                    + +
                                                                                                    +
                                                                                                    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/documentation/interfaces/GalleryError.html b/documentation/interfaces/GalleryError.html new file mode 100644 index 00000000..d99dc908 --- /dev/null +++ b/documentation/interfaces/GalleryError.html @@ -0,0 +1,270 @@ + + + + + + ng-gallery-project documentation + + + + + + + + + + + + + +
                                                                                                    +
                                                                                                    + + +
                                                                                                    +
                                                                                                    + + + + + + + + + + + + + + + + + +
                                                                                                    +
                                                                                                    +

                                                                                                    +

                                                                                                    File

                                                                                                    +

                                                                                                    +

                                                                                                    + projects/ng-gallery/src/lib/models/gallery.model.ts +

                                                                                                    + + + + +
                                                                                                    +

                                                                                                    Index

                                                                                                    + + + + + + + + + +
                                                                                                    +
                                                                                                    Properties
                                                                                                    +
                                                                                                    + +
                                                                                                    +
                                                                                                    + + + +
                                                                                                    +

                                                                                                    Properties

                                                                                                    + + + + + + + + + + + + + + + + + + + +
                                                                                                    + + error + + + + +
                                                                                                    + error: ErrorEvent + +
                                                                                                    + Type : ErrorEvent + +
                                                                                                    + + + + + + + + + + + + + + + + + + + +
                                                                                                    + + itemIndex + + + + +
                                                                                                    + itemIndex: number + +
                                                                                                    + Type : number + +
                                                                                                    +
                                                                                                    +
                                                                                                    + + +
                                                                                                    +
                                                                                                    import { GalleryAction, GalleryItemType } from './constants';
                                                                                                    +import { GalleryItemData } from '../components/templates/items.model';
                                                                                                    +
                                                                                                    +export interface GalleryState {
                                                                                                    +  action?: GalleryAction;
                                                                                                    +  items?: GalleryItem[];
                                                                                                    +  behavior?: ScrollBehavior;
                                                                                                    +  currIndex?: number;
                                                                                                    +  hasNext?: boolean;
                                                                                                    +  hasPrev?: boolean;
                                                                                                    +  isPlaying?: boolean;
                                                                                                    +}
                                                                                                    +
                                                                                                    +export interface GalleryItem {
                                                                                                    +  data?: GalleryItemData;
                                                                                                    +  type?: GalleryItemType;
                                                                                                    +}
                                                                                                    +
                                                                                                    +export interface GalleryError {
                                                                                                    +  itemIndex: number;
                                                                                                    +  error: ErrorEvent;
                                                                                                    +}
                                                                                                    +
                                                                                                    +
                                                                                                    +
                                                                                                    + + + + + + + +
                                                                                                    +
                                                                                                    +

                                                                                                    results matching ""

                                                                                                    +
                                                                                                      +
                                                                                                      +
                                                                                                      +

                                                                                                      No results matching ""

                                                                                                      +
                                                                                                      +
                                                                                                      +
                                                                                                      + +
                                                                                                      +
                                                                                                      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/documentation/interfaces/GalleryItem.html b/documentation/interfaces/GalleryItem.html new file mode 100644 index 00000000..80ee2fc7 --- /dev/null +++ b/documentation/interfaces/GalleryItem.html @@ -0,0 +1,282 @@ + + + + + + ng-gallery-project documentation + + + + + + + + + + + + + +
                                                                                                      +
                                                                                                      + + +
                                                                                                      +
                                                                                                      + + + + + + + + + + + + + + + + + +
                                                                                                      +
                                                                                                      +

                                                                                                      +

                                                                                                      File

                                                                                                      +

                                                                                                      +

                                                                                                      + projects/ng-gallery/src/lib/models/gallery.model.ts +

                                                                                                      + + + + +
                                                                                                      +

                                                                                                      Index

                                                                                                      + + + + + + + + + +
                                                                                                      +
                                                                                                      Properties
                                                                                                      +
                                                                                                      + +
                                                                                                      +
                                                                                                      + + + +
                                                                                                      +

                                                                                                      Properties

                                                                                                      + + + + + + + + + + + + + + + + + + + + + + +
                                                                                                      + + data + + + + +
                                                                                                      + data: GalleryItemData + +
                                                                                                      + Type : GalleryItemData + +
                                                                                                      + Optional +
                                                                                                      + + + + + + + + + + + + + + + + + + + + + + +
                                                                                                      + + type + + + + +
                                                                                                      + type: GalleryItemType + +
                                                                                                      + Type : GalleryItemType + +
                                                                                                      + Optional +
                                                                                                      +
                                                                                                      +
                                                                                                      + + +
                                                                                                      +
                                                                                                      import { GalleryAction, GalleryItemType } from './constants';
                                                                                                      +import { GalleryItemData } from '../components/templates/items.model';
                                                                                                      +
                                                                                                      +export interface GalleryState {
                                                                                                      +  action?: GalleryAction;
                                                                                                      +  items?: GalleryItem[];
                                                                                                      +  behavior?: ScrollBehavior;
                                                                                                      +  currIndex?: number;
                                                                                                      +  hasNext?: boolean;
                                                                                                      +  hasPrev?: boolean;
                                                                                                      +  isPlaying?: boolean;
                                                                                                      +}
                                                                                                      +
                                                                                                      +export interface GalleryItem {
                                                                                                      +  data?: GalleryItemData;
                                                                                                      +  type?: GalleryItemType;
                                                                                                      +}
                                                                                                      +
                                                                                                      +export interface GalleryError {
                                                                                                      +  itemIndex: number;
                                                                                                      +  error: ErrorEvent;
                                                                                                      +}
                                                                                                      +
                                                                                                      +
                                                                                                      +
                                                                                                      + + + + + + + +
                                                                                                      +
                                                                                                      +

                                                                                                      results matching ""

                                                                                                      +
                                                                                                        +
                                                                                                        +
                                                                                                        +

                                                                                                        No results matching ""

                                                                                                        +
                                                                                                        +
                                                                                                        +
                                                                                                        + +
                                                                                                        +
                                                                                                        + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/documentation/interfaces/GalleryItemContext.html b/documentation/interfaces/GalleryItemContext.html new file mode 100644 index 00000000..796fdd5b --- /dev/null +++ b/documentation/interfaces/GalleryItemContext.html @@ -0,0 +1,571 @@ + + + + + + ng-gallery-project documentation + + + + + + + + + + + + + +
                                                                                                        +
                                                                                                        + + +
                                                                                                        +
                                                                                                        + + + + + + + + + + + + + + + + + +
                                                                                                        +
                                                                                                        +

                                                                                                        +

                                                                                                        File

                                                                                                        +

                                                                                                        +

                                                                                                        + projects/ng-gallery/src/lib/directives/gallery-item-def.directive.ts +

                                                                                                        + + + + +
                                                                                                        +

                                                                                                        Index

                                                                                                        + + + + + + + + + +
                                                                                                        +
                                                                                                        Properties
                                                                                                        +
                                                                                                        + +
                                                                                                        +
                                                                                                        + + + +
                                                                                                        +

                                                                                                        Properties

                                                                                                        + + + + + + + + + + + + + + + + + + + + + + + + + +
                                                                                                        + + $implicit + + + + +
                                                                                                        + $implicit: T + +
                                                                                                        + Type : T + +
                                                                                                        + Optional +
                                                                                                        +

                                                                                                        Data for the row that this cell is located within.

                                                                                                        +
                                                                                                        +
                                                                                                        + + + + + + + + + + + + + + + + + + + + + + + + + +
                                                                                                        + + active + + + + +
                                                                                                        + active: boolean + +
                                                                                                        + Type : boolean + +
                                                                                                        + Optional +
                                                                                                        +

                                                                                                        True if this item is the active one.

                                                                                                        +
                                                                                                        +
                                                                                                        + + + + + + + + + + + + + + + + + + + + + + + + + +
                                                                                                        + + count + + + + +
                                                                                                        + count: number + +
                                                                                                        + Type : number + +
                                                                                                        + Optional +
                                                                                                        +

                                                                                                        The number of total items.

                                                                                                        +
                                                                                                        +
                                                                                                        + + + + + + + + + + + + + + + + + + + + + + + + + +
                                                                                                        + + first + + + + +
                                                                                                        + first: boolean + +
                                                                                                        + Type : boolean + +
                                                                                                        + Optional +
                                                                                                        +

                                                                                                        True if this item is first.

                                                                                                        +
                                                                                                        +
                                                                                                        + + + + + + + + + + + + + + + + + + + + + + + + + +
                                                                                                        + + index + + + + +
                                                                                                        + index: number + +
                                                                                                        + Type : number + +
                                                                                                        + Optional +
                                                                                                        +

                                                                                                        Index of the item.

                                                                                                        +
                                                                                                        +
                                                                                                        + + + + + + + + + + + + + + + + + + + + + + + + + +
                                                                                                        + + last + + + + +
                                                                                                        + last: boolean + +
                                                                                                        + Type : boolean + +
                                                                                                        + Optional +
                                                                                                        +

                                                                                                        True if this item is last.

                                                                                                        +
                                                                                                        +
                                                                                                        + + + + + + + + + + + + + + + + + + + + + + + + + +
                                                                                                        + + type + + + + +
                                                                                                        + type: GalleryItemType + +
                                                                                                        + Type : GalleryItemType + +
                                                                                                        + Optional +
                                                                                                        +

                                                                                                        The type of the item.

                                                                                                        +
                                                                                                        +
                                                                                                        +
                                                                                                        +
                                                                                                        + + +
                                                                                                        +
                                                                                                        import { Directive, TemplateRef } from '@angular/core';
                                                                                                        +import { GalleryItemData } from '../components/templates/items.model';
                                                                                                        +import { GalleryItemType } from '../models/constants';
                                                                                                        +
                                                                                                        +@Directive({
                                                                                                        +  standalone: true,
                                                                                                        +  selector: '[galleryItemDef]'
                                                                                                        +})
                                                                                                        +export class GalleryItemDef {
                                                                                                        +  constructor(public templateRef: TemplateRef<GalleryItemContext<GalleryItemDef>>) {
                                                                                                        +  }
                                                                                                        +
                                                                                                        +  // Make sure the template checker knows the type of the context with which the
                                                                                                        +  // template of this directive will be rendered
                                                                                                        +  static ngTemplateContextGuard(
                                                                                                        +    directive: GalleryItemDef,
                                                                                                        +    context: unknown
                                                                                                        +  ): context is GalleryItemContext<GalleryItemData> {
                                                                                                        +    return true;
                                                                                                        +  }
                                                                                                        +}
                                                                                                        +
                                                                                                        +export interface GalleryItemContext<T> {
                                                                                                        +  /** Data for the row that this cell is located within. */
                                                                                                        +  $implicit?: T;
                                                                                                        +
                                                                                                        +  /** Index of the item. */
                                                                                                        +  index?: number;
                                                                                                        +
                                                                                                        +  /** The type of the item. */
                                                                                                        +  type?: GalleryItemType;
                                                                                                        +
                                                                                                        +  /** True if this item is the active one. */
                                                                                                        +  active?: boolean;
                                                                                                        +
                                                                                                        +  /** The number of total items. */
                                                                                                        +  count?: number;
                                                                                                        +
                                                                                                        +  /** True if this item is first. */
                                                                                                        +  first?: boolean;
                                                                                                        +
                                                                                                        +  /** True if this item is last. */
                                                                                                        +  last?: boolean;
                                                                                                        +}
                                                                                                        +
                                                                                                        +
                                                                                                        +
                                                                                                        + + + + + + + +
                                                                                                        +
                                                                                                        +

                                                                                                        results matching ""

                                                                                                        +
                                                                                                          +
                                                                                                          +
                                                                                                          +

                                                                                                          No results matching ""

                                                                                                          +
                                                                                                          +
                                                                                                          +
                                                                                                          + +
                                                                                                          +
                                                                                                          + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/documentation/interfaces/GalleryState.html b/documentation/interfaces/GalleryState.html new file mode 100644 index 00000000..29c7bdd5 --- /dev/null +++ b/documentation/interfaces/GalleryState.html @@ -0,0 +1,507 @@ + + + + + + ng-gallery-project documentation + + + + + + + + + + + + + +
                                                                                                          +
                                                                                                          + + +
                                                                                                          +
                                                                                                          + + + + + + + + + + + + + + + + + +
                                                                                                          +
                                                                                                          +

                                                                                                          +

                                                                                                          File

                                                                                                          +

                                                                                                          +

                                                                                                          + projects/ng-gallery/src/lib/models/gallery.model.ts +

                                                                                                          + + + + +
                                                                                                          +

                                                                                                          Index

                                                                                                          + + + + + + + + + +
                                                                                                          +
                                                                                                          Properties
                                                                                                          +
                                                                                                          + +
                                                                                                          +
                                                                                                          + + + +
                                                                                                          +

                                                                                                          Properties

                                                                                                          + + + + + + + + + + + + + + + + + + + + + + +
                                                                                                          + + action + + + + +
                                                                                                          + action: GalleryAction + +
                                                                                                          + Type : GalleryAction + +
                                                                                                          + Optional +
                                                                                                          + + + + + + + + + + + + + + + + + + + + + + +
                                                                                                          + + behavior + + + + +
                                                                                                          + behavior: ScrollBehavior + +
                                                                                                          + Type : ScrollBehavior + +
                                                                                                          + Optional +
                                                                                                          + + + + + + + + + + + + + + + + + + + + + + +
                                                                                                          + + currIndex + + + + +
                                                                                                          + currIndex: number + +
                                                                                                          + Type : number + +
                                                                                                          + Optional +
                                                                                                          + + + + + + + + + + + + + + + + + + + + + + +
                                                                                                          + + hasNext + + + + +
                                                                                                          + hasNext: boolean + +
                                                                                                          + Type : boolean + +
                                                                                                          + Optional +
                                                                                                          + + + + + + + + + + + + + + + + + + + + + + +
                                                                                                          + + hasPrev + + + + +
                                                                                                          + hasPrev: boolean + +
                                                                                                          + Type : boolean + +
                                                                                                          + Optional +
                                                                                                          + + + + + + + + + + + + + + + + + + + + + + +
                                                                                                          + + isPlaying + + + + +
                                                                                                          + isPlaying: boolean + +
                                                                                                          + Type : boolean + +
                                                                                                          + Optional +
                                                                                                          + + + + + + + + + + + + + + + + + + + + + + +
                                                                                                          + + items + + + + +
                                                                                                          + items: GalleryItem[] + +
                                                                                                          + Type : GalleryItem[] + +
                                                                                                          + Optional +
                                                                                                          +
                                                                                                          +
                                                                                                          + + +
                                                                                                          +
                                                                                                          import { GalleryAction, GalleryItemType } from './constants';
                                                                                                          +import { GalleryItemData } from '../components/templates/items.model';
                                                                                                          +
                                                                                                          +export interface GalleryState {
                                                                                                          +  action?: GalleryAction;
                                                                                                          +  items?: GalleryItem[];
                                                                                                          +  behavior?: ScrollBehavior;
                                                                                                          +  currIndex?: number;
                                                                                                          +  hasNext?: boolean;
                                                                                                          +  hasPrev?: boolean;
                                                                                                          +  isPlaying?: boolean;
                                                                                                          +}
                                                                                                          +
                                                                                                          +export interface GalleryItem {
                                                                                                          +  data?: GalleryItemData;
                                                                                                          +  type?: GalleryItemType;
                                                                                                          +}
                                                                                                          +
                                                                                                          +export interface GalleryError {
                                                                                                          +  itemIndex: number;
                                                                                                          +  error: ErrorEvent;
                                                                                                          +}
                                                                                                          +
                                                                                                          +
                                                                                                          +
                                                                                                          + + + + + + + +
                                                                                                          +
                                                                                                          +

                                                                                                          results matching ""

                                                                                                          +
                                                                                                            +
                                                                                                            +
                                                                                                            +

                                                                                                            No results matching ""

                                                                                                            +
                                                                                                            +
                                                                                                            +
                                                                                                            + +
                                                                                                            +
                                                                                                            + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/documentation/interfaces/GalleryStateContext.html b/documentation/interfaces/GalleryStateContext.html new file mode 100644 index 00000000..4a669adc --- /dev/null +++ b/documentation/interfaces/GalleryStateContext.html @@ -0,0 +1,288 @@ + + + + + + ng-gallery-project documentation + + + + + + + + + + + + + +
                                                                                                            +
                                                                                                            + + +
                                                                                                            +
                                                                                                            + + + + + + + + + + + + + + + + + +
                                                                                                            +
                                                                                                            +

                                                                                                            +

                                                                                                            File

                                                                                                            +

                                                                                                            +

                                                                                                            + projects/ng-gallery/src/lib/directives/gallery-box-def.directive.ts +

                                                                                                            + + + + +
                                                                                                            +

                                                                                                            Index

                                                                                                            + + + + + + + + + +
                                                                                                            +
                                                                                                            Properties
                                                                                                            +
                                                                                                            + +
                                                                                                            +
                                                                                                            + + + +
                                                                                                            +

                                                                                                            Properties

                                                                                                            + + + + + + + + + + + + + + + + + + + + + + +
                                                                                                            + + config + + + + +
                                                                                                            + config: GalleryConfig + +
                                                                                                            + Type : GalleryConfig + +
                                                                                                            + Optional +
                                                                                                            + + + + + + + + + + + + + + + + + + + + + + +
                                                                                                            + + state + + + + +
                                                                                                            + state: GalleryState + +
                                                                                                            + Type : GalleryState + +
                                                                                                            + Optional +
                                                                                                            +
                                                                                                            +
                                                                                                            + + +
                                                                                                            +
                                                                                                            import { Directive, TemplateRef } from '@angular/core';
                                                                                                            +import { GalleryState } from '../models/gallery.model';
                                                                                                            +import { GalleryConfig } from '../models/config.model';
                                                                                                            +
                                                                                                            +
                                                                                                            +@Directive({
                                                                                                            +  standalone: true,
                                                                                                            +  selector: '[galleryBoxDef]'
                                                                                                            +})
                                                                                                            +export class GalleryBoxDef {
                                                                                                            +
                                                                                                            +  constructor(public templateRef: TemplateRef<GalleryStateContext>) {
                                                                                                            +  }
                                                                                                            +
                                                                                                            +  // Make sure the template checker knows the type of the context with which the
                                                                                                            +  // template of this directive will be rendered
                                                                                                            +  static ngTemplateContextGuard(
                                                                                                            +    directive: GalleryBoxDef,
                                                                                                            +    context: unknown
                                                                                                            +  ): context is GalleryStateContext {
                                                                                                            +    return true;
                                                                                                            +  }
                                                                                                            +}
                                                                                                            +
                                                                                                            +export interface GalleryStateContext {
                                                                                                            +  state?: GalleryState;
                                                                                                            +  config?: GalleryConfig;
                                                                                                            +}
                                                                                                            +
                                                                                                            +
                                                                                                            +
                                                                                                            + + + + + + + +
                                                                                                            +
                                                                                                            +

                                                                                                            results matching ""

                                                                                                            +
                                                                                                              +
                                                                                                              +
                                                                                                              +

                                                                                                              No results matching ""

                                                                                                              +
                                                                                                              +
                                                                                                              +
                                                                                                              + +
                                                                                                              +
                                                                                                              + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/documentation/interfaces/Hit.html b/documentation/interfaces/Hit.html new file mode 100644 index 00000000..ad5d1eee --- /dev/null +++ b/documentation/interfaces/Hit.html @@ -0,0 +1,1043 @@ + + + + + + ng-gallery-project documentation + + + + + + + + + + + + + +
                                                                                                              +
                                                                                                              + + +
                                                                                                              +
                                                                                                              + + + + + + + + + + + + + + + + + +
                                                                                                              +
                                                                                                              +

                                                                                                              +

                                                                                                              File

                                                                                                              +

                                                                                                              +

                                                                                                              + projects/ng-gallery/src/stories/pixabay/pixabay.model.ts +

                                                                                                              + + + + +
                                                                                                              +

                                                                                                              Index

                                                                                                              + + + + + + + + + +
                                                                                                              +
                                                                                                              Properties
                                                                                                              +
                                                                                                              + +
                                                                                                              +
                                                                                                              + + + +
                                                                                                              +

                                                                                                              Properties

                                                                                                              + + + + + + + + + + + + + + + + + + + +
                                                                                                              + + comments + + + + +
                                                                                                              + comments: number + +
                                                                                                              + Type : number + +
                                                                                                              + + + + + + + + + + + + + + + + + + + +
                                                                                                              + + downloads + + + + +
                                                                                                              + downloads: number + +
                                                                                                              + Type : number + +
                                                                                                              + + + + + + + + + + + + + + + + + + + +
                                                                                                              + + favorites + + + + +
                                                                                                              + favorites: number + +
                                                                                                              + Type : number + +
                                                                                                              + + + + + + + + + + + + + + + + + + + +
                                                                                                              + + id + + + + +
                                                                                                              + id: number + +
                                                                                                              + Type : number + +
                                                                                                              + + + + + + + + + + + + + + + + + + + +
                                                                                                              + + imageHeight + + + + +
                                                                                                              + imageHeight: number + +
                                                                                                              + Type : number + +
                                                                                                              + + + + + + + + + + + + + + + + + + + +
                                                                                                              + + imageSize + + + + +
                                                                                                              + imageSize: number + +
                                                                                                              + Type : number + +
                                                                                                              + + + + + + + + + + + + + + + + + + + +
                                                                                                              + + imageWidth + + + + +
                                                                                                              + imageWidth: number + +
                                                                                                              + Type : number + +
                                                                                                              + + + + + + + + + + + + + + + + + + + +
                                                                                                              + + likes + + + + +
                                                                                                              + likes: number + +
                                                                                                              + Type : number + +
                                                                                                              + + + + + + + + + + + + + + + + + + + +
                                                                                                              + + pageURL + + + + +
                                                                                                              + pageURL: string + +
                                                                                                              + Type : string + +
                                                                                                              + + + + + + + + + + + + + + + + + + + +
                                                                                                              + + previewHeight + + + + +
                                                                                                              + previewHeight: number + +
                                                                                                              + Type : number + +
                                                                                                              + + + + + + + + + + + + + + + + + + + +
                                                                                                              + + previewURL + + + + +
                                                                                                              + previewURL: string + +
                                                                                                              + Type : string + +
                                                                                                              + + + + + + + + + + + + + + + + + + + +
                                                                                                              + + previewWidth + + + + +
                                                                                                              + previewWidth: number + +
                                                                                                              + Type : number + +
                                                                                                              + + + + + + + + + + + + + + + + + + + +
                                                                                                              + + tags + + + + +
                                                                                                              + tags: string[] + +
                                                                                                              + Type : string[] + +
                                                                                                              + + + + + + + + + + + + + + + + + + + +
                                                                                                              + + type + + + + +
                                                                                                              + type: string + +
                                                                                                              + Type : string + +
                                                                                                              + + + + + + + + + + + + + + + + + + + +
                                                                                                              + + user + + + + +
                                                                                                              + user: string + +
                                                                                                              + Type : string + +
                                                                                                              + + + + + + + + + + + + + + + + + + + +
                                                                                                              + + user_id + + + + +
                                                                                                              + user_id: number + +
                                                                                                              + Type : number + +
                                                                                                              + + + + + + + + + + + + + + + + + + + +
                                                                                                              + + userImageURL + + + + +
                                                                                                              + userImageURL: string + +
                                                                                                              + Type : string + +
                                                                                                              + + + + + + + + + + + + + + + + + + + +
                                                                                                              + + views + + + + +
                                                                                                              + views: number + +
                                                                                                              + Type : number + +
                                                                                                              + + + + + + + + + + + + + + + + + + + +
                                                                                                              + + webformatHeight + + + + +
                                                                                                              + webformatHeight: number + +
                                                                                                              + Type : number + +
                                                                                                              + + + + + + + + + + + + + + + + + + + +
                                                                                                              + + webformatURL + + + + +
                                                                                                              + webformatURL: string + +
                                                                                                              + Type : string + +
                                                                                                              + + + + + + + + + + + + + + + + + + + +
                                                                                                              + + webformatWidth + + + + +
                                                                                                              + webformatWidth: number + +
                                                                                                              + Type : number + +
                                                                                                              +
                                                                                                              +
                                                                                                              + + +
                                                                                                              +
                                                                                                              export interface PixabayModel {
                                                                                                              +  total: number;
                                                                                                              +  totalHits: number;
                                                                                                              +  hits: Hit[];
                                                                                                              +}
                                                                                                              +
                                                                                                              +export interface Hit {
                                                                                                              +  id: number;
                                                                                                              +  pageURL: string;
                                                                                                              +  type: string;
                                                                                                              +  tags: string[];
                                                                                                              +  previewURL: string;
                                                                                                              +  previewWidth: number;
                                                                                                              +  previewHeight: number;
                                                                                                              +  webformatURL: string;
                                                                                                              +  webformatWidth: number;
                                                                                                              +  webformatHeight: number;
                                                                                                              +  imageWidth: number;
                                                                                                              +  imageHeight: number;
                                                                                                              +  imageSize: number;
                                                                                                              +  views: number;
                                                                                                              +  downloads: number;
                                                                                                              +  favorites: number;
                                                                                                              +  likes: number;
                                                                                                              +  comments: number;
                                                                                                              +  user_id: number;
                                                                                                              +  user: string;
                                                                                                              +  userImageURL: string;
                                                                                                              +}
                                                                                                              +export interface PixabayHDModel {
                                                                                                              +  total: number;
                                                                                                              +  totalHits: number;
                                                                                                              +  hits: Hit2[];
                                                                                                              +}
                                                                                                              +
                                                                                                              +export interface Hit2 {
                                                                                                              +  id_hash: string;
                                                                                                              +  type: string;
                                                                                                              +  previewURL: string;
                                                                                                              +  previewWidth: number;
                                                                                                              +  previewHeight: number;
                                                                                                              +  webformatURL: string;
                                                                                                              +  webformatWidth: number;
                                                                                                              +  webformatHeight: number;
                                                                                                              +  largeImageURL: string;
                                                                                                              +  fullHDURL: string;
                                                                                                              +  imageWidth: number;
                                                                                                              +  imageHeight: number;
                                                                                                              +  imageSize: number;
                                                                                                              +  imageURL: string;
                                                                                                              +  user_id: number;
                                                                                                              +  user: string;
                                                                                                              +  userImageURL: string;
                                                                                                              +}
                                                                                                              +
                                                                                                              +
                                                                                                              +
                                                                                                              + + + + + + + +
                                                                                                              +
                                                                                                              +

                                                                                                              results matching ""

                                                                                                              +
                                                                                                                +
                                                                                                                +
                                                                                                                +

                                                                                                                No results matching ""

                                                                                                                +
                                                                                                                +
                                                                                                                +
                                                                                                                + +
                                                                                                                +
                                                                                                                + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/documentation/interfaces/Hit2.html b/documentation/interfaces/Hit2.html new file mode 100644 index 00000000..c227cdfd --- /dev/null +++ b/documentation/interfaces/Hit2.html @@ -0,0 +1,887 @@ + + + + + + ng-gallery-project documentation + + + + + + + + + + + + + +
                                                                                                                +
                                                                                                                + + +
                                                                                                                +
                                                                                                                + + + + + + + + + + + + + + + + + +
                                                                                                                +
                                                                                                                +

                                                                                                                +

                                                                                                                File

                                                                                                                +

                                                                                                                +

                                                                                                                + projects/ng-gallery/src/stories/pixabay/pixabay.model.ts +

                                                                                                                + + + + +
                                                                                                                +

                                                                                                                Index

                                                                                                                + + + + + + + + + +
                                                                                                                +
                                                                                                                Properties
                                                                                                                +
                                                                                                                + +
                                                                                                                +
                                                                                                                + + + +
                                                                                                                +

                                                                                                                Properties

                                                                                                                + + + + + + + + + + + + + + + + + + + +
                                                                                                                + + fullHDURL + + + + +
                                                                                                                + fullHDURL: string + +
                                                                                                                + Type : string + +
                                                                                                                + + + + + + + + + + + + + + + + + + + +
                                                                                                                + + id_hash + + + + +
                                                                                                                + id_hash: string + +
                                                                                                                + Type : string + +
                                                                                                                + + + + + + + + + + + + + + + + + + + +
                                                                                                                + + imageHeight + + + + +
                                                                                                                + imageHeight: number + +
                                                                                                                + Type : number + +
                                                                                                                + + + + + + + + + + + + + + + + + + + +
                                                                                                                + + imageSize + + + + +
                                                                                                                + imageSize: number + +
                                                                                                                + Type : number + +
                                                                                                                + + + + + + + + + + + + + + + + + + + +
                                                                                                                + + imageURL + + + + +
                                                                                                                + imageURL: string + +
                                                                                                                + Type : string + +
                                                                                                                + + + + + + + + + + + + + + + + + + + +
                                                                                                                + + imageWidth + + + + +
                                                                                                                + imageWidth: number + +
                                                                                                                + Type : number + +
                                                                                                                + + + + + + + + + + + + + + + + + + + +
                                                                                                                + + largeImageURL + + + + +
                                                                                                                + largeImageURL: string + +
                                                                                                                + Type : string + +
                                                                                                                + + + + + + + + + + + + + + + + + + + +
                                                                                                                + + previewHeight + + + + +
                                                                                                                + previewHeight: number + +
                                                                                                                + Type : number + +
                                                                                                                + + + + + + + + + + + + + + + + + + + +
                                                                                                                + + previewURL + + + + +
                                                                                                                + previewURL: string + +
                                                                                                                + Type : string + +
                                                                                                                + + + + + + + + + + + + + + + + + + + +
                                                                                                                + + previewWidth + + + + +
                                                                                                                + previewWidth: number + +
                                                                                                                + Type : number + +
                                                                                                                + + + + + + + + + + + + + + + + + + + +
                                                                                                                + + type + + + + +
                                                                                                                + type: string + +
                                                                                                                + Type : string + +
                                                                                                                + + + + + + + + + + + + + + + + + + + +
                                                                                                                + + user + + + + +
                                                                                                                + user: string + +
                                                                                                                + Type : string + +
                                                                                                                + + + + + + + + + + + + + + + + + + + +
                                                                                                                + + user_id + + + + +
                                                                                                                + user_id: number + +
                                                                                                                + Type : number + +
                                                                                                                + + + + + + + + + + + + + + + + + + + +
                                                                                                                + + userImageURL + + + + +
                                                                                                                + userImageURL: string + +
                                                                                                                + Type : string + +
                                                                                                                + + + + + + + + + + + + + + + + + + + +
                                                                                                                + + webformatHeight + + + + +
                                                                                                                + webformatHeight: number + +
                                                                                                                + Type : number + +
                                                                                                                + + + + + + + + + + + + + + + + + + + +
                                                                                                                + + webformatURL + + + + +
                                                                                                                + webformatURL: string + +
                                                                                                                + Type : string + +
                                                                                                                + + + + + + + + + + + + + + + + + + + +
                                                                                                                + + webformatWidth + + + + +
                                                                                                                + webformatWidth: number + +
                                                                                                                + Type : number + +
                                                                                                                +
                                                                                                                +
                                                                                                                + + +
                                                                                                                +
                                                                                                                export interface PixabayModel {
                                                                                                                +  total: number;
                                                                                                                +  totalHits: number;
                                                                                                                +  hits: Hit[];
                                                                                                                +}
                                                                                                                +
                                                                                                                +export interface Hit {
                                                                                                                +  id: number;
                                                                                                                +  pageURL: string;
                                                                                                                +  type: string;
                                                                                                                +  tags: string[];
                                                                                                                +  previewURL: string;
                                                                                                                +  previewWidth: number;
                                                                                                                +  previewHeight: number;
                                                                                                                +  webformatURL: string;
                                                                                                                +  webformatWidth: number;
                                                                                                                +  webformatHeight: number;
                                                                                                                +  imageWidth: number;
                                                                                                                +  imageHeight: number;
                                                                                                                +  imageSize: number;
                                                                                                                +  views: number;
                                                                                                                +  downloads: number;
                                                                                                                +  favorites: number;
                                                                                                                +  likes: number;
                                                                                                                +  comments: number;
                                                                                                                +  user_id: number;
                                                                                                                +  user: string;
                                                                                                                +  userImageURL: string;
                                                                                                                +}
                                                                                                                +export interface PixabayHDModel {
                                                                                                                +  total: number;
                                                                                                                +  totalHits: number;
                                                                                                                +  hits: Hit2[];
                                                                                                                +}
                                                                                                                +
                                                                                                                +export interface Hit2 {
                                                                                                                +  id_hash: string;
                                                                                                                +  type: string;
                                                                                                                +  previewURL: string;
                                                                                                                +  previewWidth: number;
                                                                                                                +  previewHeight: number;
                                                                                                                +  webformatURL: string;
                                                                                                                +  webformatWidth: number;
                                                                                                                +  webformatHeight: number;
                                                                                                                +  largeImageURL: string;
                                                                                                                +  fullHDURL: string;
                                                                                                                +  imageWidth: number;
                                                                                                                +  imageHeight: number;
                                                                                                                +  imageSize: number;
                                                                                                                +  imageURL: string;
                                                                                                                +  user_id: number;
                                                                                                                +  user: string;
                                                                                                                +  userImageURL: string;
                                                                                                                +}
                                                                                                                +
                                                                                                                +
                                                                                                                +
                                                                                                                + + + + + + + +
                                                                                                                +
                                                                                                                +

                                                                                                                results matching ""

                                                                                                                +
                                                                                                                  +
                                                                                                                  +
                                                                                                                  +

                                                                                                                  No results matching ""

                                                                                                                  +
                                                                                                                  +
                                                                                                                  +
                                                                                                                  + +
                                                                                                                  +
                                                                                                                  + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/documentation/interfaces/ImageRegistry.html b/documentation/interfaces/ImageRegistry.html new file mode 100644 index 00000000..c30330a3 --- /dev/null +++ b/documentation/interfaces/ImageRegistry.html @@ -0,0 +1,294 @@ + + + + + + ng-gallery-project documentation + + + + + + + + + + + + + +
                                                                                                                  +
                                                                                                                  + + +
                                                                                                                  +
                                                                                                                  + + + + + + + + + + + + + + + + + +
                                                                                                                  +
                                                                                                                  +

                                                                                                                  +

                                                                                                                  File

                                                                                                                  +

                                                                                                                  +

                                                                                                                  + projects/ng-gallery/src/lib/utils/img-manager.ts +

                                                                                                                  + + + + +
                                                                                                                  +

                                                                                                                  Index

                                                                                                                  + + + + + + + + + +
                                                                                                                  +
                                                                                                                  Properties
                                                                                                                  +
                                                                                                                  + +
                                                                                                                  +
                                                                                                                  + + + +
                                                                                                                  +

                                                                                                                  Properties

                                                                                                                  + + + + + + + + + + + + + + + + + + + +
                                                                                                                  + + state + + + + +
                                                                                                                  + state: Observable<ItemState> + +
                                                                                                                  + Type : Observable<ItemState> + +
                                                                                                                  + + + + + + + + + + + + + + + + + + + +
                                                                                                                  + + target + + + + +
                                                                                                                  + target: HTMLImageElement + +
                                                                                                                  + Type : HTMLImageElement + +
                                                                                                                  +
                                                                                                                  +
                                                                                                                  + + +
                                                                                                                  +
                                                                                                                  import { Injectable } from '@angular/core';
                                                                                                                  +import { Observable, BehaviorSubject, filter, map, switchMap, EMPTY } from 'rxjs';
                                                                                                                  +import { GalleryState } from '../models/gallery.model';
                                                                                                                  +import { ItemState } from '../components/templates/items.model';
                                                                                                                  +
                                                                                                                  +interface ImageRegistry {
                                                                                                                  +  state: Observable<ItemState>;
                                                                                                                  +  target: HTMLImageElement;
                                                                                                                  +}
                                                                                                                  +
                                                                                                                  +@Injectable()
                                                                                                                  +export class ImgManager {
                                                                                                                  +
                                                                                                                  +  private readonly trigger$: BehaviorSubject<void> = new BehaviorSubject<void>(null);
                                                                                                                  +
                                                                                                                  +  private readonly images: Map<number, ImageRegistry> = new Map<number, ImageRegistry>();
                                                                                                                  +
                                                                                                                  +  getActiveItem(state$: Observable<GalleryState>): Observable<HTMLImageElement> {
                                                                                                                  +    return this.trigger$.pipe(
                                                                                                                  +      switchMap(() => state$.pipe(
                                                                                                                  +        switchMap((state: GalleryState) => {
                                                                                                                  +          const img: ImageRegistry = this.images.get(state.currIndex);
                                                                                                                  +          if (img) {
                                                                                                                  +            return img.state.pipe(
                                                                                                                  +              filter((state: ItemState) => state !== 'loading'),
                                                                                                                  +              map(() => img.target)
                                                                                                                  +            )
                                                                                                                  +          }
                                                                                                                  +          return EMPTY;
                                                                                                                  +        })
                                                                                                                  +      ))
                                                                                                                  +    );
                                                                                                                  +  }
                                                                                                                  +
                                                                                                                  +  addItem(index: number, payload: ImageRegistry): void {
                                                                                                                  +    this.images.set(index, payload);
                                                                                                                  +    this.trigger$.next();
                                                                                                                  +  }
                                                                                                                  +
                                                                                                                  +  deleteItem(index: number): void {
                                                                                                                  +    if (this.images.has(index)) {
                                                                                                                  +      this.images.delete(index);
                                                                                                                  +      this.trigger$.next();
                                                                                                                  +    }
                                                                                                                  +  }
                                                                                                                  +}
                                                                                                                  +
                                                                                                                  +
                                                                                                                  +
                                                                                                                  + + + + + + + +
                                                                                                                  +
                                                                                                                  +

                                                                                                                  results matching ""

                                                                                                                  +
                                                                                                                    +
                                                                                                                    +
                                                                                                                    +

                                                                                                                    No results matching ""

                                                                                                                    +
                                                                                                                    +
                                                                                                                    +
                                                                                                                    + +
                                                                                                                    +
                                                                                                                    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/documentation/interfaces/LightboxConfig.html b/documentation/interfaces/LightboxConfig.html new file mode 100644 index 00000000..bd218332 --- /dev/null +++ b/documentation/interfaces/LightboxConfig.html @@ -0,0 +1,682 @@ + + + + + + ng-gallery-project documentation + + + + + + + + + + + + + +
                                                                                                                    +
                                                                                                                    + + +
                                                                                                                    +
                                                                                                                    + + + + + + + + + + + + + + + + + +
                                                                                                                    +
                                                                                                                    +

                                                                                                                    +

                                                                                                                    File

                                                                                                                    +

                                                                                                                    +

                                                                                                                    + projects/ng-gallery/lightbox/src/lightbox.model.ts +

                                                                                                                    + + + + +
                                                                                                                    +

                                                                                                                    Index

                                                                                                                    + + + + + + + + + +
                                                                                                                    +
                                                                                                                    Properties
                                                                                                                    +
                                                                                                                    + +
                                                                                                                    +
                                                                                                                    + + + +
                                                                                                                    +

                                                                                                                    Properties

                                                                                                                    + + + + + + + + + + + + + + + + + + + + + + +
                                                                                                                    + + ariaDescribedBy + + + + +
                                                                                                                    + ariaDescribedBy: string + +
                                                                                                                    + Type : string + +
                                                                                                                    + Optional +
                                                                                                                    + + + + + + + + + + + + + + + + + + + + + + +
                                                                                                                    + + ariaLabel + + + + +
                                                                                                                    + ariaLabel: string + +
                                                                                                                    + Type : string + +
                                                                                                                    + Optional +
                                                                                                                    + + + + + + + + + + + + + + + + + + + + + + +
                                                                                                                    + + ariaLabelledBy + + + + +
                                                                                                                    + ariaLabelledBy: string + +
                                                                                                                    + Type : string + +
                                                                                                                    + Optional +
                                                                                                                    + + + + + + + + + + + + + + + + + + + + + + +
                                                                                                                    + + backdropClass + + + + +
                                                                                                                    + backdropClass: string | string[] + +
                                                                                                                    + Type : string | string[] + +
                                                                                                                    + Optional +
                                                                                                                    + + + + + + + + + + + + + + + + + + + + + + +
                                                                                                                    + + closeIcon + + + + +
                                                                                                                    + closeIcon: string + +
                                                                                                                    + Type : string + +
                                                                                                                    + Optional +
                                                                                                                    + + + + + + + + + + + + + + + + + + + + + + +
                                                                                                                    + + exitAnimationTime + + + + +
                                                                                                                    + exitAnimationTime: number + +
                                                                                                                    + Type : number + +
                                                                                                                    + Optional +
                                                                                                                    + + + + + + + + + + + + + + + + + + + + + + +
                                                                                                                    + + hasBackdrop + + + + +
                                                                                                                    + hasBackdrop: boolean + +
                                                                                                                    + Type : boolean + +
                                                                                                                    + Optional +
                                                                                                                    + + + + + + + + + + + + + + + + + + + + + + +
                                                                                                                    + + keyboardShortcuts + + + + +
                                                                                                                    + keyboardShortcuts: boolean + +
                                                                                                                    + Type : boolean + +
                                                                                                                    + Optional +
                                                                                                                    + + + + + + + + + + + + + + + + + + + + + + +
                                                                                                                    + + panelClass + + + + +
                                                                                                                    + panelClass: string | string[] + +
                                                                                                                    + Type : string | string[] + +
                                                                                                                    + Optional +
                                                                                                                    + + + + + + + + + + + + + + + + + + + + + + +
                                                                                                                    + + role + + + + +
                                                                                                                    + role: string + +
                                                                                                                    + Type : string + +
                                                                                                                    + Optional +
                                                                                                                    + + + + + + + + + + + + + + + + + + + + + + +
                                                                                                                    + + startAnimationTime + + + + +
                                                                                                                    + startAnimationTime: number + +
                                                                                                                    + Type : number + +
                                                                                                                    + Optional +
                                                                                                                    +
                                                                                                                    +
                                                                                                                    + + +
                                                                                                                    +
                                                                                                                    import { InjectionToken } from '@angular/core';
                                                                                                                    +
                                                                                                                    +export const LIGHTBOX_CONFIG = new InjectionToken<LightboxConfig>('LIGHTBOX_CONFIG');
                                                                                                                    +
                                                                                                                    +export interface LightboxConfig {
                                                                                                                    +  backdropClass?: string | string[];
                                                                                                                    +  panelClass?: string | string[];
                                                                                                                    +  hasBackdrop?: boolean;
                                                                                                                    +  keyboardShortcuts?: boolean;
                                                                                                                    +  closeIcon?: string;
                                                                                                                    +  role?: string;
                                                                                                                    +  ariaLabelledBy?: string;
                                                                                                                    +  ariaLabel?: string;
                                                                                                                    +  ariaDescribedBy?: string;
                                                                                                                    +  startAnimationTime?: number;
                                                                                                                    +  exitAnimationTime?: number;
                                                                                                                    +}
                                                                                                                    +
                                                                                                                    +
                                                                                                                    +
                                                                                                                    + + + + + + + +
                                                                                                                    +
                                                                                                                    +

                                                                                                                    results matching ""

                                                                                                                    +
                                                                                                                      +
                                                                                                                      +
                                                                                                                      +

                                                                                                                      No results matching ""

                                                                                                                      +
                                                                                                                      +
                                                                                                                      +
                                                                                                                      + +
                                                                                                                      +
                                                                                                                      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/documentation/interfaces/PixabayHDModel.html b/documentation/interfaces/PixabayHDModel.html new file mode 100644 index 00000000..6a41d884 --- /dev/null +++ b/documentation/interfaces/PixabayHDModel.html @@ -0,0 +1,341 @@ + + + + + + ng-gallery-project documentation + + + + + + + + + + + + + +
                                                                                                                      +
                                                                                                                      + + +
                                                                                                                      +
                                                                                                                      + + + + + + + + + + + + + + + + + +
                                                                                                                      +
                                                                                                                      +

                                                                                                                      +

                                                                                                                      File

                                                                                                                      +

                                                                                                                      +

                                                                                                                      + projects/ng-gallery/src/stories/pixabay/pixabay.model.ts +

                                                                                                                      + + + + +
                                                                                                                      +

                                                                                                                      Index

                                                                                                                      + + + + + + + + + +
                                                                                                                      +
                                                                                                                      Properties
                                                                                                                      +
                                                                                                                      + +
                                                                                                                      +
                                                                                                                      + + + +
                                                                                                                      +

                                                                                                                      Properties

                                                                                                                      + + + + + + + + + + + + + + + + + + + +
                                                                                                                      + + hits + + + + +
                                                                                                                      + hits: Hit2[] + +
                                                                                                                      + Type : Hit2[] + +
                                                                                                                      + + + + + + + + + + + + + + + + + + + +
                                                                                                                      + + total + + + + +
                                                                                                                      + total: number + +
                                                                                                                      + Type : number + +
                                                                                                                      + + + + + + + + + + + + + + + + + + + +
                                                                                                                      + + totalHits + + + + +
                                                                                                                      + totalHits: number + +
                                                                                                                      + Type : number + +
                                                                                                                      +
                                                                                                                      +
                                                                                                                      + + +
                                                                                                                      +
                                                                                                                      export interface PixabayModel {
                                                                                                                      +  total: number;
                                                                                                                      +  totalHits: number;
                                                                                                                      +  hits: Hit[];
                                                                                                                      +}
                                                                                                                      +
                                                                                                                      +export interface Hit {
                                                                                                                      +  id: number;
                                                                                                                      +  pageURL: string;
                                                                                                                      +  type: string;
                                                                                                                      +  tags: string[];
                                                                                                                      +  previewURL: string;
                                                                                                                      +  previewWidth: number;
                                                                                                                      +  previewHeight: number;
                                                                                                                      +  webformatURL: string;
                                                                                                                      +  webformatWidth: number;
                                                                                                                      +  webformatHeight: number;
                                                                                                                      +  imageWidth: number;
                                                                                                                      +  imageHeight: number;
                                                                                                                      +  imageSize: number;
                                                                                                                      +  views: number;
                                                                                                                      +  downloads: number;
                                                                                                                      +  favorites: number;
                                                                                                                      +  likes: number;
                                                                                                                      +  comments: number;
                                                                                                                      +  user_id: number;
                                                                                                                      +  user: string;
                                                                                                                      +  userImageURL: string;
                                                                                                                      +}
                                                                                                                      +export interface PixabayHDModel {
                                                                                                                      +  total: number;
                                                                                                                      +  totalHits: number;
                                                                                                                      +  hits: Hit2[];
                                                                                                                      +}
                                                                                                                      +
                                                                                                                      +export interface Hit2 {
                                                                                                                      +  id_hash: string;
                                                                                                                      +  type: string;
                                                                                                                      +  previewURL: string;
                                                                                                                      +  previewWidth: number;
                                                                                                                      +  previewHeight: number;
                                                                                                                      +  webformatURL: string;
                                                                                                                      +  webformatWidth: number;
                                                                                                                      +  webformatHeight: number;
                                                                                                                      +  largeImageURL: string;
                                                                                                                      +  fullHDURL: string;
                                                                                                                      +  imageWidth: number;
                                                                                                                      +  imageHeight: number;
                                                                                                                      +  imageSize: number;
                                                                                                                      +  imageURL: string;
                                                                                                                      +  user_id: number;
                                                                                                                      +  user: string;
                                                                                                                      +  userImageURL: string;
                                                                                                                      +}
                                                                                                                      +
                                                                                                                      +
                                                                                                                      +
                                                                                                                      + + + + + + + +
                                                                                                                      +
                                                                                                                      +

                                                                                                                      results matching ""

                                                                                                                      +
                                                                                                                        +
                                                                                                                        +
                                                                                                                        +

                                                                                                                        No results matching ""

                                                                                                                        +
                                                                                                                        +
                                                                                                                        +
                                                                                                                        + +
                                                                                                                        +
                                                                                                                        + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/documentation/interfaces/PixabayModel.html b/documentation/interfaces/PixabayModel.html new file mode 100644 index 00000000..afca5f8d --- /dev/null +++ b/documentation/interfaces/PixabayModel.html @@ -0,0 +1,341 @@ + + + + + + ng-gallery-project documentation + + + + + + + + + + + + + +
                                                                                                                        +
                                                                                                                        + + +
                                                                                                                        +
                                                                                                                        + + + + + + + + + + + + + + + + + +
                                                                                                                        +
                                                                                                                        +

                                                                                                                        +

                                                                                                                        File

                                                                                                                        +

                                                                                                                        +

                                                                                                                        + projects/ng-gallery/src/stories/pixabay/pixabay.model.ts +

                                                                                                                        + + + + +
                                                                                                                        +

                                                                                                                        Index

                                                                                                                        + + + + + + + + + +
                                                                                                                        +
                                                                                                                        Properties
                                                                                                                        +
                                                                                                                        + +
                                                                                                                        +
                                                                                                                        + + + +
                                                                                                                        +

                                                                                                                        Properties

                                                                                                                        + + + + + + + + + + + + + + + + + + + +
                                                                                                                        + + hits + + + + +
                                                                                                                        + hits: Hit[] + +
                                                                                                                        + Type : Hit[] + +
                                                                                                                        + + + + + + + + + + + + + + + + + + + +
                                                                                                                        + + total + + + + +
                                                                                                                        + total: number + +
                                                                                                                        + Type : number + +
                                                                                                                        + + + + + + + + + + + + + + + + + + + +
                                                                                                                        + + totalHits + + + + +
                                                                                                                        + totalHits: number + +
                                                                                                                        + Type : number + +
                                                                                                                        +
                                                                                                                        +
                                                                                                                        + + +
                                                                                                                        +
                                                                                                                        export interface PixabayModel {
                                                                                                                        +  total: number;
                                                                                                                        +  totalHits: number;
                                                                                                                        +  hits: Hit[];
                                                                                                                        +}
                                                                                                                        +
                                                                                                                        +export interface Hit {
                                                                                                                        +  id: number;
                                                                                                                        +  pageURL: string;
                                                                                                                        +  type: string;
                                                                                                                        +  tags: string[];
                                                                                                                        +  previewURL: string;
                                                                                                                        +  previewWidth: number;
                                                                                                                        +  previewHeight: number;
                                                                                                                        +  webformatURL: string;
                                                                                                                        +  webformatWidth: number;
                                                                                                                        +  webformatHeight: number;
                                                                                                                        +  imageWidth: number;
                                                                                                                        +  imageHeight: number;
                                                                                                                        +  imageSize: number;
                                                                                                                        +  views: number;
                                                                                                                        +  downloads: number;
                                                                                                                        +  favorites: number;
                                                                                                                        +  likes: number;
                                                                                                                        +  comments: number;
                                                                                                                        +  user_id: number;
                                                                                                                        +  user: string;
                                                                                                                        +  userImageURL: string;
                                                                                                                        +}
                                                                                                                        +export interface PixabayHDModel {
                                                                                                                        +  total: number;
                                                                                                                        +  totalHits: number;
                                                                                                                        +  hits: Hit2[];
                                                                                                                        +}
                                                                                                                        +
                                                                                                                        +export interface Hit2 {
                                                                                                                        +  id_hash: string;
                                                                                                                        +  type: string;
                                                                                                                        +  previewURL: string;
                                                                                                                        +  previewWidth: number;
                                                                                                                        +  previewHeight: number;
                                                                                                                        +  webformatURL: string;
                                                                                                                        +  webformatWidth: number;
                                                                                                                        +  webformatHeight: number;
                                                                                                                        +  largeImageURL: string;
                                                                                                                        +  fullHDURL: string;
                                                                                                                        +  imageWidth: number;
                                                                                                                        +  imageHeight: number;
                                                                                                                        +  imageSize: number;
                                                                                                                        +  imageURL: string;
                                                                                                                        +  user_id: number;
                                                                                                                        +  user: string;
                                                                                                                        +  userImageURL: string;
                                                                                                                        +}
                                                                                                                        +
                                                                                                                        +
                                                                                                                        +
                                                                                                                        + + + + + + + +
                                                                                                                        +
                                                                                                                        +

                                                                                                                        results matching ""

                                                                                                                        +
                                                                                                                          +
                                                                                                                          +
                                                                                                                          +

                                                                                                                          No results matching ""

                                                                                                                          +
                                                                                                                          +
                                                                                                                          +
                                                                                                                          + +
                                                                                                                          +
                                                                                                                          + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/documentation/interfaces/SliderState.html b/documentation/interfaces/SliderState.html new file mode 100644 index 00000000..0fa0d33b --- /dev/null +++ b/documentation/interfaces/SliderState.html @@ -0,0 +1,257 @@ + + + + + + ng-gallery-project documentation + + + + + + + + + + + + + +
                                                                                                                          +
                                                                                                                          + + +
                                                                                                                          +
                                                                                                                          + + + + + + + + + + + + + + + + + +
                                                                                                                          +
                                                                                                                          +

                                                                                                                          +

                                                                                                                          File

                                                                                                                          +

                                                                                                                          +

                                                                                                                          + projects/ng-gallery/src/lib/models/slider.model.ts +

                                                                                                                          + + + + +
                                                                                                                          +

                                                                                                                          Index

                                                                                                                          + + + + + + + + + +
                                                                                                                          +
                                                                                                                          Properties
                                                                                                                          +
                                                                                                                          + +
                                                                                                                          +
                                                                                                                          + + + +
                                                                                                                          +

                                                                                                                          Properties

                                                                                                                          + + + + + + + + + + + + + + + + + + + +
                                                                                                                          + + instant + + + + +
                                                                                                                          + instant: boolean + +
                                                                                                                          + Type : boolean + +
                                                                                                                          + + + + + + + + + + + + + + + + + + + +
                                                                                                                          + + style + + + + +
                                                                                                                          + style: any + +
                                                                                                                          + Type : any + +
                                                                                                                          +
                                                                                                                          +
                                                                                                                          + + +
                                                                                                                          +
                                                                                                                          export interface SliderState {
                                                                                                                          +  style: any;
                                                                                                                          +  instant: boolean;
                                                                                                                          +}
                                                                                                                          +
                                                                                                                          +export interface WorkerState {
                                                                                                                          +  value: number;
                                                                                                                          +  instant: boolean;
                                                                                                                          +}
                                                                                                                          +
                                                                                                                          +
                                                                                                                          +
                                                                                                                          + + + + + + + +
                                                                                                                          +
                                                                                                                          +

                                                                                                                          results matching ""

                                                                                                                          +
                                                                                                                            +
                                                                                                                            +
                                                                                                                            +

                                                                                                                            No results matching ""

                                                                                                                            +
                                                                                                                            +
                                                                                                                            +
                                                                                                                            + +
                                                                                                                            +
                                                                                                                            + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/documentation/interfaces/SmoothScrollOptions.html b/documentation/interfaces/SmoothScrollOptions.html new file mode 100644 index 00000000..fbb8a2bd --- /dev/null +++ b/documentation/interfaces/SmoothScrollOptions.html @@ -0,0 +1,291 @@ + + + + + + ng-gallery-project documentation + + + + + + + + + + + + + +
                                                                                                                            +
                                                                                                                            + + +
                                                                                                                            +
                                                                                                                            + + + + + + + + + + + + + + + + + +
                                                                                                                            +
                                                                                                                            +

                                                                                                                            +

                                                                                                                            File

                                                                                                                            +

                                                                                                                            +

                                                                                                                            + projects/ng-gallery/src/lib/smooth-scroll/smooth-scroll.model.ts +

                                                                                                                            + + + + +
                                                                                                                            +

                                                                                                                            Index

                                                                                                                            + + + + + + + + + +
                                                                                                                            +
                                                                                                                            Properties
                                                                                                                            +
                                                                                                                            + +
                                                                                                                            +
                                                                                                                            + + + +
                                                                                                                            +

                                                                                                                            Properties

                                                                                                                            + + + + + + + + + + + + + + + + + + + + + + +
                                                                                                                            + + duration + + + + +
                                                                                                                            + duration: number + +
                                                                                                                            + Type : number + +
                                                                                                                            + Optional +
                                                                                                                            + + + + + + + + + + + + + + + + + + + + + + +
                                                                                                                            + + easing + + + + +
                                                                                                                            + easing: BezierEasingOptions + +
                                                                                                                            + Type : BezierEasingOptions + +
                                                                                                                            + Optional +
                                                                                                                            +
                                                                                                                            +
                                                                                                                            + + +
                                                                                                                            +
                                                                                                                            import { InjectionToken } from '@angular/core';
                                                                                                                            +import { _XAxis, _YAxis } from '@angular/cdk/scrolling';
                                                                                                                            +
                                                                                                                            +export const SMOOTH_SCROLL_OPTIONS: InjectionToken<SmoothScrollOptions> = new InjectionToken<SmoothScrollOptions>('SMOOTH_SCROLL_OPTIONS');
                                                                                                                            +
                                                                                                                            +export type SmoothScrollToOptions = _XAxis & _YAxis & SmoothScrollOptions;
                                                                                                                            +
                                                                                                                            +export interface SmoothScrollOptions {
                                                                                                                            +  duration?: number;
                                                                                                                            +  easing?: BezierEasingOptions;
                                                                                                                            +}
                                                                                                                            +
                                                                                                                            +export interface SmoothScrollStep {
                                                                                                                            +  scrollable: HTMLElement;
                                                                                                                            +  startTime: number;
                                                                                                                            +  startX: number;
                                                                                                                            +  startY: number;
                                                                                                                            +  x: number;
                                                                                                                            +  y: number;
                                                                                                                            +  duration: number;
                                                                                                                            +  easing: (k: number) => number;
                                                                                                                            +  currentX?: number;
                                                                                                                            +  currentY?: number;
                                                                                                                            +}
                                                                                                                            +
                                                                                                                            +export interface BezierEasingOptions {
                                                                                                                            +  x1: number;
                                                                                                                            +  y1: number;
                                                                                                                            +  x2: number;
                                                                                                                            +  y2: number;
                                                                                                                            +}
                                                                                                                            +
                                                                                                                            +
                                                                                                                            +
                                                                                                                            + + + + + + + +
                                                                                                                            +
                                                                                                                            +

                                                                                                                            results matching ""

                                                                                                                            +
                                                                                                                              +
                                                                                                                              +
                                                                                                                              +

                                                                                                                              No results matching ""

                                                                                                                              +
                                                                                                                              +
                                                                                                                              +
                                                                                                                              + +
                                                                                                                              +
                                                                                                                              + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/documentation/interfaces/SmoothScrollStep.html b/documentation/interfaces/SmoothScrollStep.html new file mode 100644 index 00000000..cfd9e792 --- /dev/null +++ b/documentation/interfaces/SmoothScrollStep.html @@ -0,0 +1,603 @@ + + + + + + ng-gallery-project documentation + + + + + + + + + + + + + +
                                                                                                                              +
                                                                                                                              + + +
                                                                                                                              +
                                                                                                                              + + + + + + + + + + + + + + + + + +
                                                                                                                              +
                                                                                                                              +

                                                                                                                              +

                                                                                                                              File

                                                                                                                              +

                                                                                                                              +

                                                                                                                              + projects/ng-gallery/src/lib/smooth-scroll/smooth-scroll.model.ts +

                                                                                                                              + + + + +
                                                                                                                              +

                                                                                                                              Index

                                                                                                                              + + + + + + + + + +
                                                                                                                              +
                                                                                                                              Properties
                                                                                                                              +
                                                                                                                              + +
                                                                                                                              +
                                                                                                                              + + + +
                                                                                                                              +

                                                                                                                              Properties

                                                                                                                              + + + + + + + + + + + + + + + + + + + + + + +
                                                                                                                              + + currentX + + + + +
                                                                                                                              + currentX: number + +
                                                                                                                              + Type : number + +
                                                                                                                              + Optional +
                                                                                                                              + + + + + + + + + + + + + + + + + + + + + + +
                                                                                                                              + + currentY + + + + +
                                                                                                                              + currentY: number + +
                                                                                                                              + Type : number + +
                                                                                                                              + Optional +
                                                                                                                              + + + + + + + + + + + + + + + + + + + +
                                                                                                                              + + duration + + + + +
                                                                                                                              + duration: number + +
                                                                                                                              + Type : number + +
                                                                                                                              + + + + + + + + + + + + + + + + + + + +
                                                                                                                              + + easing + + + + +
                                                                                                                              + easing: function + +
                                                                                                                              + Type : function + +
                                                                                                                              + + + + + + + + + + + + + + + + + + + +
                                                                                                                              + + scrollable + + + + +
                                                                                                                              + scrollable: HTMLElement + +
                                                                                                                              + Type : HTMLElement + +
                                                                                                                              + + + + + + + + + + + + + + + + + + + +
                                                                                                                              + + startTime + + + + +
                                                                                                                              + startTime: number + +
                                                                                                                              + Type : number + +
                                                                                                                              + + + + + + + + + + + + + + + + + + + +
                                                                                                                              + + startX + + + + +
                                                                                                                              + startX: number + +
                                                                                                                              + Type : number + +
                                                                                                                              + + + + + + + + + + + + + + + + + + + +
                                                                                                                              + + startY + + + + +
                                                                                                                              + startY: number + +
                                                                                                                              + Type : number + +
                                                                                                                              + + + + + + + + + + + + + + + + + + + +
                                                                                                                              + + x + + + + +
                                                                                                                              + x: number + +
                                                                                                                              + Type : number + +
                                                                                                                              + + + + + + + + + + + + + + + + + + + +
                                                                                                                              + + y + + + + +
                                                                                                                              + y: number + +
                                                                                                                              + Type : number + +
                                                                                                                              +
                                                                                                                              +
                                                                                                                              + + +
                                                                                                                              +
                                                                                                                              import { InjectionToken } from '@angular/core';
                                                                                                                              +import { _XAxis, _YAxis } from '@angular/cdk/scrolling';
                                                                                                                              +
                                                                                                                              +export const SMOOTH_SCROLL_OPTIONS: InjectionToken<SmoothScrollOptions> = new InjectionToken<SmoothScrollOptions>('SMOOTH_SCROLL_OPTIONS');
                                                                                                                              +
                                                                                                                              +export type SmoothScrollToOptions = _XAxis & _YAxis & SmoothScrollOptions;
                                                                                                                              +
                                                                                                                              +export interface SmoothScrollOptions {
                                                                                                                              +  duration?: number;
                                                                                                                              +  easing?: BezierEasingOptions;
                                                                                                                              +}
                                                                                                                              +
                                                                                                                              +export interface SmoothScrollStep {
                                                                                                                              +  scrollable: HTMLElement;
                                                                                                                              +  startTime: number;
                                                                                                                              +  startX: number;
                                                                                                                              +  startY: number;
                                                                                                                              +  x: number;
                                                                                                                              +  y: number;
                                                                                                                              +  duration: number;
                                                                                                                              +  easing: (k: number) => number;
                                                                                                                              +  currentX?: number;
                                                                                                                              +  currentY?: number;
                                                                                                                              +}
                                                                                                                              +
                                                                                                                              +export interface BezierEasingOptions {
                                                                                                                              +  x1: number;
                                                                                                                              +  y1: number;
                                                                                                                              +  x2: number;
                                                                                                                              +  y2: number;
                                                                                                                              +}
                                                                                                                              +
                                                                                                                              +
                                                                                                                              +
                                                                                                                              + + + + + + + +
                                                                                                                              +
                                                                                                                              +

                                                                                                                              results matching ""

                                                                                                                              +
                                                                                                                                +
                                                                                                                                +
                                                                                                                                +

                                                                                                                                No results matching ""

                                                                                                                                +
                                                                                                                                +
                                                                                                                                +
                                                                                                                                + +
                                                                                                                                +
                                                                                                                                + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/documentation/interfaces/WorkerState.html b/documentation/interfaces/WorkerState.html new file mode 100644 index 00000000..f62bae5b --- /dev/null +++ b/documentation/interfaces/WorkerState.html @@ -0,0 +1,257 @@ + + + + + + ng-gallery-project documentation + + + + + + + + + + + + + +
                                                                                                                                +
                                                                                                                                + + +
                                                                                                                                +
                                                                                                                                + + + + + + + + + + + + + + + + + +
                                                                                                                                +
                                                                                                                                +

                                                                                                                                +

                                                                                                                                File

                                                                                                                                +

                                                                                                                                +

                                                                                                                                + projects/ng-gallery/src/lib/models/slider.model.ts +

                                                                                                                                + + + + +
                                                                                                                                +

                                                                                                                                Index

                                                                                                                                + + + + + + + + + +
                                                                                                                                +
                                                                                                                                Properties
                                                                                                                                +
                                                                                                                                + +
                                                                                                                                +
                                                                                                                                + + + +
                                                                                                                                +

                                                                                                                                Properties

                                                                                                                                + + + + + + + + + + + + + + + + + + + +
                                                                                                                                + + instant + + + + +
                                                                                                                                + instant: boolean + +
                                                                                                                                + Type : boolean + +
                                                                                                                                + + + + + + + + + + + + + + + + + + + +
                                                                                                                                + + value + + + + +
                                                                                                                                + value: number + +
                                                                                                                                + Type : number + +
                                                                                                                                +
                                                                                                                                +
                                                                                                                                + + +
                                                                                                                                +
                                                                                                                                export interface SliderState {
                                                                                                                                +  style: any;
                                                                                                                                +  instant: boolean;
                                                                                                                                +}
                                                                                                                                +
                                                                                                                                +export interface WorkerState {
                                                                                                                                +  value: number;
                                                                                                                                +  instant: boolean;
                                                                                                                                +}
                                                                                                                                +
                                                                                                                                +
                                                                                                                                +
                                                                                                                                + + + + + + + +
                                                                                                                                +
                                                                                                                                +

                                                                                                                                results matching ""

                                                                                                                                +
                                                                                                                                  +
                                                                                                                                  +
                                                                                                                                  +

                                                                                                                                  No results matching ""

                                                                                                                                  +
                                                                                                                                  +
                                                                                                                                  +
                                                                                                                                  + +
                                                                                                                                  +
                                                                                                                                  + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/documentation/js/compodoc.js b/documentation/js/compodoc.js new file mode 100644 index 00000000..8cc41d33 --- /dev/null +++ b/documentation/js/compodoc.js @@ -0,0 +1,14 @@ +var compodoc = { + EVENTS: { + READY: 'compodoc.ready', + SEARCH_READY: 'compodoc.search.ready' + } +}; + +Object.assign( compodoc, EventDispatcher.prototype ); + +document.addEventListener('DOMContentLoaded', function() { + compodoc.dispatchEvent({ + type: compodoc.EVENTS.READY + }); +}); diff --git a/documentation/js/lazy-load-graphs.js b/documentation/js/lazy-load-graphs.js new file mode 100644 index 00000000..2ef47cab --- /dev/null +++ b/documentation/js/lazy-load-graphs.js @@ -0,0 +1,44 @@ +document.addEventListener('DOMContentLoaded', function() { + var lazyGraphs = [].slice.call(document.querySelectorAll('[lazy]')); + var active = false; + + var lazyLoad = function() { + if (active === false) { + active = true; + + setTimeout(function() { + lazyGraphs.forEach(function(lazyGraph) { + if ( + lazyGraph.getBoundingClientRect().top <= window.innerHeight && + lazyGraph.getBoundingClientRect().bottom >= 0 && + getComputedStyle(lazyGraph).display !== 'none' + ) { + lazyGraph.data = lazyGraph.getAttribute('lazy'); + lazyGraph.removeAttribute('lazy'); + + lazyGraphs = lazyGraphs.filter(function(image) { return image !== lazyGraph}); + + if (lazyGraphs.length === 0) { + document.removeEventListener('scroll', lazyLoad); + window.removeEventListener('resize', lazyLoad); + window.removeEventListener('orientationchange', lazyLoad); + } + } + }); + + active = false; + }, 200); + } + }; + + // initial load + lazyLoad(); + + var container = document.querySelector('.container-fluid.modules'); + if (container) { + container.addEventListener('scroll', lazyLoad); + window.addEventListener('resize', lazyLoad); + window.addEventListener('orientationchange', lazyLoad); + } + +}); diff --git a/documentation/js/libs/EventDispatcher.js b/documentation/js/libs/EventDispatcher.js new file mode 100644 index 00000000..f112877d --- /dev/null +++ b/documentation/js/libs/EventDispatcher.js @@ -0,0 +1,5 @@ +/** + * @author mrdoob / http://mrdoob.com/ + */ + +var EventDispatcher=function(){};Object.assign(EventDispatcher.prototype,{addEventListener:function(i,t){void 0===this._listeners&&(this._listeners={});var e=this._listeners;void 0===e[i]&&(e[i]=[]),-1===e[i].indexOf(t)&&e[i].push(t)},hasEventListener:function(i,t){if(void 0===this._listeners)return!1;var e=this._listeners;return void 0!==e[i]&&-1!==e[i].indexOf(t)},removeEventListener:function(i,t){if(void 0!==this._listeners){var e=this._listeners[i];if(void 0!==e){var s=e.indexOf(t);-1!==s&&e.splice(s,1)}}},dispatchEvent:function(i){if(void 0!==this._listeners){var t=this._listeners[i.type];if(void 0!==t){i.target=this;var e=[],s=0,n=t.length;for(s=0;s1?t[t.length-1]:void 0:t[0]},this.getActiveContent=function(){var t=this.getActiveTab().getElementsByTagName("A")[0].getAttribute("href").replace("#","");return t&&document.getElementById("c-"+t)},this.tab.addEventListener("click",this.handle,!1)},d=document.querySelectorAll("[data-toggle='tab'], [data-toggle='pill']"),u=0,h=d.length;u0&&void 0!==arguments[0]?arguments[0]:{};this.action=t.action,this.container=t.container,this.emitter=t.emitter,this.target=t.target,this.text=t.text,this.trigger=t.trigger,this.selectedText=""}},{key:"initSelection",value:function(){this.text?this.selectFake():this.target&&this.selectTarget()}},{key:"selectFake",value:function(){var t=this,e="rtl"==document.documentElement.getAttribute("dir");this.removeFake(),this.fakeHandlerCallback=function(){return t.removeFake()},this.fakeHandler=this.container.addEventListener("click",this.fakeHandlerCallback)||!0,this.fakeElem=document.createElement("textarea"),this.fakeElem.style.fontSize="12pt",this.fakeElem.style.border="0",this.fakeElem.style.padding="0",this.fakeElem.style.margin="0",this.fakeElem.style.position="absolute",this.fakeElem.style[e?"right":"left"]="-9999px";var n=window.pageYOffset||document.documentElement.scrollTop;this.fakeElem.style.top=n+"px",this.fakeElem.setAttribute("readonly",""),this.fakeElem.value=this.text,this.container.appendChild(this.fakeElem),this.selectedText=(0,o.default)(this.fakeElem),this.copyText()}},{key:"removeFake",value:function(){this.fakeHandler&&(this.container.removeEventListener("click",this.fakeHandlerCallback),this.fakeHandler=null,this.fakeHandlerCallback=null),this.fakeElem&&(this.container.removeChild(this.fakeElem),this.fakeElem=null)}},{key:"selectTarget",value:function(){this.selectedText=(0,o.default)(this.target),this.copyText()}},{key:"copyText",value:function(){var t=void 0;try{t=document.execCommand(this.action)}catch(e){t=!1}this.handleResult(t)}},{key:"handleResult",value:function(t){this.emitter.emit(t?"success":"error",{action:this.action,text:this.selectedText,trigger:this.trigger,clearSelection:this.clearSelection.bind(this)})}},{key:"clearSelection",value:function(){this.trigger&&this.trigger.focus(),window.getSelection().removeAllRanges()}},{key:"destroy",value:function(){this.removeFake()}},{key:"action",set:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"copy";if(this._action=t,"copy"!==this._action&&"cut"!==this._action)throw new Error('Invalid "action" value, use either "copy" or "cut"')},get:function(){return this._action}},{key:"target",set:function(t){if(void 0!==t){if(!t||"object"!==(void 0===t?"undefined":r(t))||1!==t.nodeType)throw new Error('Invalid "target" value, use a valid Element');if("copy"===this.action&&t.hasAttribute("disabled"))throw new Error('Invalid "target" attribute. Please use "readonly" instead of "disabled" attribute');if("cut"===this.action&&(t.hasAttribute("readonly")||t.hasAttribute("disabled")))throw new Error('Invalid "target" attribute. You can\'t cut text from elements with "readonly" or "disabled" attributes');this._target=t}},get:function(){return this._target}}]),t}();t.exports=a})},function(t,e,n){function o(t,e,n){if(!t&&!e&&!n)throw new Error("Missing required arguments");if(!c.string(e))throw new TypeError("Second argument must be a String");if(!c.fn(n))throw new TypeError("Third argument must be a Function");if(c.node(t))return r(t,e,n);if(c.nodeList(t))return i(t,e,n);if(c.string(t))return a(t,e,n);throw new TypeError("First argument must be a String, HTMLElement, HTMLCollection, or NodeList")}function r(t,e,n){return t.addEventListener(e,n),{destroy:function(){t.removeEventListener(e,n)}}}function i(t,e,n){return Array.prototype.forEach.call(t,function(t){t.addEventListener(e,n)}),{destroy:function(){Array.prototype.forEach.call(t,function(t){t.removeEventListener(e,n)})}}}function a(t,e,n){return u(document.body,t,e,n)}var c=n(6),u=n(5);t.exports=o},function(t,e){function n(){}n.prototype={on:function(t,e,n){var o=this.e||(this.e={});return(o[t]||(o[t]=[])).push({fn:e,ctx:n}),this},once:function(t,e,n){function o(){r.off(t,o),e.apply(n,arguments)}var r=this;return o._=e,this.on(t,o,n)},emit:function(t){var e=[].slice.call(arguments,1),n=((this.e||(this.e={}))[t]||[]).slice(),o=0,r=n.length;for(o;o0&&void 0!==arguments[0]?arguments[0]:{};this.action="function"==typeof t.action?t.action:this.defaultAction,this.target="function"==typeof t.target?t.target:this.defaultTarget,this.text="function"==typeof t.text?t.text:this.defaultText,this.container="object"===d(t.container)?t.container:document.body}},{key:"listenClick",value:function(t){var e=this;this.listener=(0,f.default)(t,"click",function(t){return e.onClick(t)})}},{key:"onClick",value:function(t){var e=t.delegateTarget||t.currentTarget;this.clipboardAction&&(this.clipboardAction=null),this.clipboardAction=new l.default({action:this.action(e),target:this.target(e),text:this.text(e),container:this.container,trigger:e,emitter:this})}},{key:"defaultAction",value:function(t){return u("action",t)}},{key:"defaultTarget",value:function(t){var e=u("target",t);if(e)return document.querySelector(e)}},{key:"defaultText",value:function(t){return u("text",t)}},{key:"destroy",value:function(){this.listener.destroy(),this.clipboardAction&&(this.clipboardAction.destroy(),this.clipboardAction=null)}}],[{key:"isSupported",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:["copy","cut"],e="string"==typeof t?[t]:t,n=!!document.queryCommandSupported;return e.forEach(function(t){n=n&&!!document.queryCommandSupported(t)}),n}}]),e}(s.default);t.exports=p})},function(t,e){function n(t,e){for(;t&&t.nodeType!==o;){if("function"==typeof t.matches&&t.matches(e))return t;t=t.parentNode}}var o=9;if("undefined"!=typeof Element&&!Element.prototype.matches){var r=Element.prototype;r.matches=r.matchesSelector||r.mozMatchesSelector||r.msMatchesSelector||r.oMatchesSelector||r.webkitMatchesSelector}t.exports=n},function(t,e,n){function o(t,e,n,o,r){var a=i.apply(this,arguments);return t.addEventListener(n,a,r),{destroy:function(){t.removeEventListener(n,a,r)}}}function r(t,e,n,r,i){return"function"==typeof t.addEventListener?o.apply(null,arguments):"function"==typeof n?o.bind(null,document).apply(null,arguments):("string"==typeof t&&(t=document.querySelectorAll(t)),Array.prototype.map.call(t,function(t){return o(t,e,n,r,i)}))}function i(t,e,n,o){return function(n){n.delegateTarget=a(n.target,e),n.delegateTarget&&o.call(t,n)}}var a=n(4);t.exports=r},function(t,e){e.node=function(t){return void 0!==t&&t instanceof HTMLElement&&1===t.nodeType},e.nodeList=function(t){var n=Object.prototype.toString.call(t);return void 0!==t&&("[object NodeList]"===n||"[object HTMLCollection]"===n)&&"length"in t&&(0===t.length||e.node(t[0]))},e.string=function(t){return"string"==typeof t||t instanceof String},e.fn=function(t){return"[object Function]"===Object.prototype.toString.call(t)}},function(t,e){function n(t){var e;if("SELECT"===t.nodeName)t.focus(),e=t.value;else if("INPUT"===t.nodeName||"TEXTAREA"===t.nodeName){var n=t.hasAttribute("readonly");n||t.setAttribute("readonly",""),t.select(),t.setSelectionRange(0,t.value.length),n||t.removeAttribute("readonly"),e=t.value}else{t.hasAttribute("contenteditable")&&t.focus();var o=window.getSelection(),r=document.createRange();r.selectNodeContents(t),o.removeAllRanges(),o.addRange(r),e=o.toString()}return e}t.exports=n}])}); \ No newline at end of file diff --git a/documentation/js/libs/custom-elements-es5-adapter.js b/documentation/js/libs/custom-elements-es5-adapter.js new file mode 100644 index 00000000..3a694b8f --- /dev/null +++ b/documentation/js/libs/custom-elements-es5-adapter.js @@ -0,0 +1,15 @@ +/** +@license @nocompile +Copyright (c) 2018 The Polymer Project Authors. All rights reserved. +This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt +The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt +The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt +Code distributed by Google as part of the polymer project is also +subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt +*/ +(function () { + 'use strict'; + + (function(){if(void 0===window.Reflect||void 0===window.customElements||window.customElements.hasOwnProperty('polyfillWrapFlushCallback'))return;const a=HTMLElement;window.HTMLElement=function(){return Reflect.construct(a,[],this.constructor)},HTMLElement.prototype=a.prototype,HTMLElement.prototype.constructor=HTMLElement,Object.setPrototypeOf(HTMLElement,a);})(); + +}()); diff --git a/documentation/js/libs/custom-elements.min.js b/documentation/js/libs/custom-elements.min.js new file mode 100644 index 00000000..9b64a23c --- /dev/null +++ b/documentation/js/libs/custom-elements.min.js @@ -0,0 +1,38 @@ +(function(){ + 'use strict';var h=new function(){};var aa=new Set("annotation-xml color-profile font-face font-face-src font-face-uri font-face-format font-face-name missing-glyph".split(" "));function m(b){var a=aa.has(b);b=/^[a-z][.0-9_a-z]*-[\-.0-9_a-z]*$/.test(b);return!a&&b}function n(b){var a=b.isConnected;if(void 0!==a)return a;for(;b&&!(b.__CE_isImportDocument||b instanceof Document);)b=b.parentNode||(window.ShadowRoot&&b instanceof ShadowRoot?b.host:void 0);return!(!b||!(b.__CE_isImportDocument||b instanceof Document))} + function p(b,a){for(;a&&a!==b&&!a.nextSibling;)a=a.parentNode;return a&&a!==b?a.nextSibling:null} + function t(b,a,c){c=c?c:new Set;for(var d=b;d;){if(d.nodeType===Node.ELEMENT_NODE){var e=d;a(e);var f=e.localName;if("link"===f&&"import"===e.getAttribute("rel")){d=e.import;if(d instanceof Node&&!c.has(d))for(c.add(d),d=d.firstChild;d;d=d.nextSibling)t(d,a,c);d=p(b,e);continue}else if("template"===f){d=p(b,e);continue}if(e=e.__CE_shadowRoot)for(e=e.firstChild;e;e=e.nextSibling)t(e,a,c)}d=d.firstChild?d.firstChild:p(b,d)}}function u(b,a,c){b[a]=c};function v(){this.a=new Map;this.s=new Map;this.f=[];this.b=!1}function ba(b,a,c){b.a.set(a,c);b.s.set(c.constructor,c)}function w(b,a){b.b=!0;b.f.push(a)}function x(b,a){b.b&&t(a,function(a){return y(b,a)})}function y(b,a){if(b.b&&!a.__CE_patched){a.__CE_patched=!0;for(var c=0;ct?1:n>=t?0:NaN}function r(n){return null===n?NaN:+n}function i(n){return!isNaN(n)}function u(n){return{left:function(t,e,r,i){for(arguments.length<3&&(r=0),arguments.length<4&&(i=t.length);r>>1;n(t[u],e)<0?r=u+1:i=u}return r},right:function(t,e,r,i){for(arguments.length<3&&(r=0),arguments.length<4&&(i=t.length);r>>1;n(t[u],e)>0?i=u:r=u+1}return r}}}function o(n){return n.length}function a(n){for(var t=1;n*t%1;)t*=10;return t}function l(n,t){for(var e in t)Object.defineProperty(n.prototype,e,{value:t[e],enumerable:!1})}function c(){this._=Object.create(null)}function f(n){return(n+="")===ho||n[0]===po?po+n:n}function s(n){return(n+="")[0]===po?n.slice(1):n}function h(n){return f(n)in this._}function p(n){return(n=f(n))in this._&&delete this._[n]}function g(){var n=[];for(var t in this._)n.push(s(t));return n}function d(){var n=0;for(var t in this._)++n;return n}function v(){for(var n in this._)return!1;return!0}function y(){this._=Object.create(null)}function m(n){return n}function x(n,t,e){return function(){var r=e.apply(t,arguments);return r===t?n:r}}function M(n,t){if(t in n)return t;t=t.charAt(0).toUpperCase()+t.slice(1);for(var e=0,r=go.length;e=t&&(t=i+1);!(o=a[t])&&++t0&&(n=n.slice(0,a));var c=ko.get(n);return c&&(n=c,l=B),a?t?i:r:t?_:u}function $(n,t){return function(e){var r=to.event;to.event=e,t[0]=this.__data__;try{n.apply(this,t)}finally{to.event=r}}}function B(n,t){var e=$(n,t);return function(n){var t=this,r=n.relatedTarget;r&&(r===t||8&r.compareDocumentPosition(t))||e.call(t,n)}}function W(e){var r=".dragsuppress-"+ ++Eo,i="click"+r,u=to.select(t(e)).on("touchmove"+r,S).on("dragstart"+r,S).on("selectstart"+r,S);if(null==No&&(No=!("onselectstart"in e)&&M(e.style,"userSelect")),No){var o=n(e).style,a=o[No];o[No]="none"}return function(n){if(u.on(r,null),No&&(o[No]=a),n){var t=function(){u.on(i,null)};u.on(i,function(){S(),t()},!0),setTimeout(t,0)}}}function J(n,e){e.changedTouches&&(e=e.changedTouches[0]);var r=n.ownerSVGElement||n;if(r.createSVGPoint){var i=r.createSVGPoint();if(Ao<0){var u=t(n);if(u.scrollX||u.scrollY){var o=(r=to.select("body").append("svg").style({position:"absolute",top:0,left:0,margin:0,padding:0,border:"none"},"important"))[0][0].getScreenCTM();Ao=!(o.f||o.e),r.remove()}}return Ao?(i.x=e.pageX,i.y=e.pageY):(i.x=e.clientX,i.y=e.clientY),i=i.matrixTransform(n.getScreenCTM().inverse()),[i.x,i.y]}var a=n.getBoundingClientRect();return[e.clientX-a.left-n.clientLeft,e.clientY-a.top-n.clientTop]}function G(){return to.event.changedTouches[0].identifier}function K(n){return n>0?1:n<0?-1:0}function Q(n,t,e){return(t[0]-n[0])*(e[1]-n[1])-(t[1]-n[1])*(e[0]-n[0])}function nn(n){return n>1?0:n<-1?Lo:Math.acos(n)}function tn(n){return n>1?Ro:n<-1?-Ro:Math.asin(n)}function en(n){return((n=Math.exp(n))-1/n)/2}function rn(n){return((n=Math.exp(n))+1/n)/2}function un(n){return((n=Math.exp(2*n))-1)/(n+1)}function on(n){return(n=Math.sin(n/2))*n}function an(){}function ln(n,t,e){return this instanceof ln?(this.h=+n,this.s=+t,void(this.l=+e)):arguments.length<2?n instanceof ln?new ln(n.h,n.s,n.l):bn(""+n,wn,ln):new ln(n,t,e)}function cn(n,t,e){function r(n){return n>360?n-=360:n<0&&(n+=360),n<60?u+(o-u)*n/60:n<180?o:n<240?u+(o-u)*(240-n)/60:u}function i(n){return Math.round(255*r(n))}var u,o;return n=isNaN(n)?0:(n%=360)<0?n+360:n,t=isNaN(t)?0:t<0?0:t>1?1:t,e=e<0?0:e>1?1:e,o=e<=.5?e*(1+t):e+t-e*t,u=2*e-o,new mn(i(n+120),i(n),i(n-120))}function fn(n,t,e){return this instanceof fn?(this.h=+n,this.c=+t,void(this.l=+e)):arguments.length<2?n instanceof fn?new fn(n.h,n.c,n.l):n instanceof hn?gn(n.l,n.a,n.b):gn((n=Sn((n=to.rgb(n)).r,n.g,n.b)).l,n.a,n.b):new fn(n,t,e)}function sn(n,t,e){return isNaN(n)&&(n=0),isNaN(t)&&(t=0),new hn(e,Math.cos(n*=Do)*t,Math.sin(n)*t)}function hn(n,t,e){return this instanceof hn?(this.l=+n,this.a=+t,void(this.b=+e)):arguments.length<2?n instanceof hn?new hn(n.l,n.a,n.b):n instanceof fn?sn(n.h,n.c,n.l):Sn((n=mn(n)).r,n.g,n.b):new hn(n,t,e)}function pn(n,t,e){var r=(n+16)/116,i=r+t/500,u=r-e/200;return i=dn(i)*Zo,r=dn(r)*Vo,u=dn(u)*Xo,new mn(yn(3.2404542*i-1.5371385*r-.4985314*u),yn(-.969266*i+1.8760108*r+.041556*u),yn(.0556434*i-.2040259*r+1.0572252*u))}function gn(n,t,e){return n>0?new fn(Math.atan2(e,t)*Po,Math.sqrt(t*t+e*e),n):new fn(NaN,NaN,n)}function dn(n){return n>.206893034?n*n*n:(n-4/29)/7.787037}function vn(n){return n>.008856?Math.pow(n,1/3):7.787037*n+4/29}function yn(n){return Math.round(255*(n<=.00304?12.92*n:1.055*Math.pow(n,1/2.4)-.055))}function mn(n,t,e){return this instanceof mn?(this.r=~~n,this.g=~~t,void(this.b=~~e)):arguments.length<2?n instanceof mn?new mn(n.r,n.g,n.b):bn(""+n,mn,cn):new mn(n,t,e)}function xn(n){return new mn(n>>16,n>>8&255,255&n)}function Mn(n){return xn(n)+""}function _n(n){return n<16?"0"+Math.max(0,n).toString(16):Math.min(255,n).toString(16)}function bn(n,t,e){var r,i,u,o=0,a=0,l=0;if(r=/([a-z]+)\((.*)\)/.exec(n=n.toLowerCase()))switch(i=r[2].split(","),r[1]){case"hsl":return e(parseFloat(i[0]),parseFloat(i[1])/100,parseFloat(i[2])/100);case"rgb":return t(Nn(i[0]),Nn(i[1]),Nn(i[2]))}return(u=Wo.get(n))?t(u.r,u.g,u.b):(null==n||"#"!==n.charAt(0)||isNaN(u=parseInt(n.slice(1),16))||(4===n.length?(o=(3840&u)>>4,o|=o>>4,a=240&u,a|=a>>4,l=15&u,l|=l<<4):7===n.length&&(o=(16711680&u)>>16,a=(65280&u)>>8,l=255&u)),t(o,a,l))}function wn(n,t,e){var r,i,u=Math.min(n/=255,t/=255,e/=255),o=Math.max(n,t,e),a=o-u,l=(o+u)/2;return a?(i=l<.5?a/(o+u):a/(2-o-u),r=n==o?(t-e)/a+(t0&&l<1?0:r),new ln(r,i,l)}function Sn(n,t,e){var r=vn((.4124564*(n=kn(n))+.3575761*(t=kn(t))+.1804375*(e=kn(e)))/Zo),i=vn((.2126729*n+.7151522*t+.072175*e)/Vo);return hn(116*i-16,500*(r-i),200*(i-vn((.0193339*n+.119192*t+.9503041*e)/Xo)))}function kn(n){return(n/=255)<=.04045?n/12.92:Math.pow((n+.055)/1.055,2.4)}function Nn(n){var t=parseFloat(n);return"%"===n.charAt(n.length-1)?Math.round(2.55*t):t}function En(n){return"function"==typeof n?n:function(){return n}}function An(n){return function(t,e,r){return 2===arguments.length&&"function"==typeof e&&(r=e,e=null),Cn(t,e,n,r)}}function Cn(n,t,e,r){function i(){var n,t=l.status;if(!t&&Ln(l)||t>=200&&t<300||304===t){try{n=e.call(u,l)}catch(n){return void o.error.call(u,n)}o.load.call(u,n)}else o.error.call(u,l)}var u={},o=to.dispatch("beforesend","progress","load","error"),a={},l=new XMLHttpRequest,c=null;return!this.XDomainRequest||"withCredentials"in l||!/^(http(s)?:)?\/\//.test(n)||(l=new XDomainRequest),"onload"in l?l.onload=l.onerror=i:l.onreadystatechange=function(){l.readyState>3&&i()},l.onprogress=function(n){var t=to.event;to.event=n;try{o.progress.call(u,l)}finally{to.event=t}},u.header=function(n,t){return n=(n+"").toLowerCase(),arguments.length<2?a[n]:(null==t?delete a[n]:a[n]=t+"",u)},u.mimeType=function(n){return arguments.length?(t=null==n?null:n+"",u):t},u.responseType=function(n){return arguments.length?(c=n,u):c},u.response=function(n){return e=n,u},["get","post"].forEach(function(n){u[n]=function(){return u.send.apply(u,[n].concat(ro(arguments)))}}),u.send=function(e,r,i){if(2===arguments.length&&"function"==typeof r&&(i=r,r=null),l.open(e,n,!0),null==t||"accept"in a||(a.accept=t+",*/*"),l.setRequestHeader)for(var f in a)l.setRequestHeader(f,a[f]);return null!=t&&l.overrideMimeType&&l.overrideMimeType(t),null!=c&&(l.responseType=c),null!=i&&u.on("error",i).on("load",function(n){i(null,n)}),o.beforesend.call(u,l),l.send(null==r?null:r),u},u.abort=function(){return l.abort(),u},to.rebind(u,o,"on"),null==r?u:u.get(zn(r))}function zn(n){return 1===n.length?function(t,e){n(null==t?e:null)}:n}function Ln(n){var t=n.responseType;return t&&"text"!==t?n.response:n.responseText}function qn(n,t,e){var r=arguments.length;r<2&&(t=0),r<3&&(e=Date.now());var i={c:n,t:e+t,n:null};return Go?Go.n=i:Jo=i,Go=i,Ko||(Qo=clearTimeout(Qo),Ko=1,na(Tn)),i}function Tn(){var n=Rn(),t=Dn()-n;t>24?(isFinite(t)&&(clearTimeout(Qo),Qo=setTimeout(Tn,t)),Ko=0):(Ko=1,na(Tn))}function Rn(){for(var n=Date.now(),t=Jo;t;)n>=t.t&&t.c(n-t.t)&&(t.c=null),t=t.n;return n}function Dn(){for(var n,t=Jo,e=1/0;t;)t.c?(t.t8?function(n){return n/e}:function(n){return n*e},symbol:n}}function Un(n){var t=n.decimal,e=n.thousands,r=n.grouping,i=n.currency,u=r&&e?function(n,t){for(var i=n.length,u=[],o=0,a=r[0],l=0;i>0&&a>0&&(l+a+1>t&&(a=Math.max(1,t-l)),u.push(n.substring(i-=a,i+a)),!((l+=a+1)>t));)a=r[o=(o+1)%r.length];return u.reverse().join(e)}:m;return function(n){var e=ea.exec(n),r=e[1]||" ",o=e[2]||">",a=e[3]||"-",l=e[4]||"",c=e[5],f=+e[6],s=e[7],h=e[8],p=e[9],g=1,d="",v="",y=!1,m=!0;switch(h&&(h=+h.substring(1)),(c||"0"===r&&"="===o)&&(c=r="0",o="="),p){case"n":s=!0,p="g";break;case"%":g=100,v="%",p="f";break;case"p":g=100,v="%",p="r";break;case"b":case"o":case"x":case"X":"#"===l&&(d="0"+p.toLowerCase());case"c":m=!1;case"d":y=!0,h=0;break;case"s":g=-1,p="r"}"$"===l&&(d=i[0],v=i[1]),"r"!=p||h||(p="g"),null!=h&&("g"==p?h=Math.max(1,Math.min(21,h)):"e"!=p&&"f"!=p||(h=Math.max(0,Math.min(20,h)))),p=ra.get(p)||Fn;var x=c&&s;return function(n){var e=v;if(y&&n%1)return"";var i=n<0||0===n&&1/n<0?(n=-n,"-"):"-"===a?"":a;if(g<0){var l=to.formatPrefix(n,h);n=l.scale(n),e=l.symbol+v}else n*=g;var M,_,b=(n=p(n,h)).lastIndexOf(".");if(b<0){var w=m?n.lastIndexOf("e"):-1;w<0?(M=n,_=""):(M=n.substring(0,w),_=n.substring(w))}else M=n.substring(0,b),_=t+n.substring(b+1);!c&&s&&(M=u(M,1/0));var S=d.length+M.length+_.length+(x?0:i.length),k=S"===o?k+i+n:"^"===o?k.substring(0,S>>=1)+i+n+k.substring(S):i+(x?n:k+n))+e}}}function Fn(n){return n+""}function Hn(){this._=new Date(arguments.length>1?Date.UTC.apply(this,arguments):arguments[0])}function On(n,t,e){function r(t){var e=n(t),r=u(e,1);return t-e1)for(;o=c)return-1;if(37===(i=t.charCodeAt(a++))){if(o=t.charAt(a++),!(u=C[o in aa?t.charAt(a++):o])||(r=u(n,e,r))<0)return-1}else if(i!=e.charCodeAt(r++))return-1}return r}function r(n,t,e){b.lastIndex=0;var r=b.exec(t.slice(e));return r?(n.w=w.get(r[0].toLowerCase()),e+r[0].length):-1}function i(n,t,e){M.lastIndex=0;var r=M.exec(t.slice(e));return r?(n.w=_.get(r[0].toLowerCase()),e+r[0].length):-1}function u(n,t,e){N.lastIndex=0;var r=N.exec(t.slice(e));return r?(n.m=E.get(r[0].toLowerCase()),e+r[0].length):-1}function o(n,t,e){S.lastIndex=0;var r=S.exec(t.slice(e));return r?(n.m=k.get(r[0].toLowerCase()),e+r[0].length):-1}function a(n,t,r){return e(n,A.c.toString(),t,r)}function l(n,t,r){return e(n,A.x.toString(),t,r)}function c(n,t,r){return e(n,A.X.toString(),t,r)}function f(n,t,e){var r=x.get(t.slice(e,e+=2).toLowerCase());return null==r?-1:(n.p=r,e)}var s=n.dateTime,h=n.date,p=n.time,g=n.periods,d=n.days,v=n.shortDays,y=n.months,m=n.shortMonths;t.utc=function(n){function e(n){try{var t=new(ua=Hn);return t._=n,r(t)}finally{ua=Date}}var r=t(n);return e.parse=function(n){try{ua=Hn;var t=r.parse(n);return t&&t._}finally{ua=Date}},e.toString=r.toString,e},t.multi=t.utc.multi=ct;var x=to.map(),M=Vn(d),_=Xn(d),b=Vn(v),w=Xn(v),S=Vn(y),k=Xn(y),N=Vn(m),E=Xn(m);g.forEach(function(n,t){x.set(n.toLowerCase(),t)});var A={a:function(n){return v[n.getDay()]},A:function(n){return d[n.getDay()]},b:function(n){return m[n.getMonth()]},B:function(n){return y[n.getMonth()]},c:t(s),d:function(n,t){return Zn(n.getDate(),t,2)},e:function(n,t){return Zn(n.getDate(),t,2)},H:function(n,t){return Zn(n.getHours(),t,2)},I:function(n,t){return Zn(n.getHours()%12||12,t,2)},j:function(n,t){return Zn(1+ia.dayOfYear(n),t,3)},L:function(n,t){return Zn(n.getMilliseconds(),t,3)},m:function(n,t){return Zn(n.getMonth()+1,t,2)},M:function(n,t){return Zn(n.getMinutes(),t,2)},p:function(n){return g[+(n.getHours()>=12)]},S:function(n,t){return Zn(n.getSeconds(),t,2)},U:function(n,t){return Zn(ia.sundayOfYear(n),t,2)},w:function(n){return n.getDay()},W:function(n,t){return Zn(ia.mondayOfYear(n),t,2)},x:t(h),X:t(p),y:function(n,t){return Zn(n.getFullYear()%100,t,2)},Y:function(n,t){return Zn(n.getFullYear()%1e4,t,4)},Z:at,"%":function(){return"%"}},C={a:r,A:i,b:u,B:o,c:a,d:tt,e:tt,H:rt,I:rt,j:et,L:ot,m:nt,M:it,p:f,S:ut,U:Bn,w:$n,W:Wn,x:l,X:c,y:Gn,Y:Jn,Z:Kn,"%":lt};return t}function Zn(n,t,e){var r=n<0?"-":"",i=(r?-n:n)+"",u=i.length;return r+(u68?1900:2e3)}function nt(n,t,e){la.lastIndex=0;var r=la.exec(t.slice(e,e+2));return r?(n.m=r[0]-1,e+r[0].length):-1}function tt(n,t,e){la.lastIndex=0;var r=la.exec(t.slice(e,e+2));return r?(n.d=+r[0],e+r[0].length):-1}function et(n,t,e){la.lastIndex=0;var r=la.exec(t.slice(e,e+3));return r?(n.j=+r[0],e+r[0].length):-1}function rt(n,t,e){la.lastIndex=0;var r=la.exec(t.slice(e,e+2));return r?(n.H=+r[0],e+r[0].length):-1}function it(n,t,e){la.lastIndex=0;var r=la.exec(t.slice(e,e+2));return r?(n.M=+r[0],e+r[0].length):-1}function ut(n,t,e){la.lastIndex=0;var r=la.exec(t.slice(e,e+2));return r?(n.S=+r[0],e+r[0].length):-1}function ot(n,t,e){la.lastIndex=0;var r=la.exec(t.slice(e,e+3));return r?(n.L=+r[0],e+r[0].length):-1}function at(n){var t=n.getTimezoneOffset(),e=t>0?"-":"+",r=so(t)/60|0,i=so(t)%60;return e+Zn(r,"0",2)+Zn(i,"0",2)}function lt(n,t,e){ca.lastIndex=0;var r=ca.exec(t.slice(e,e+1));return r?e+r[0].length:-1}function ct(n){for(var t=n.length,e=-1;++e=0?1:-1,a=o*e,l=Math.cos(t),c=Math.sin(t),f=u*c,s=i*l+f*Math.cos(a),h=f*o*Math.sin(a);da.add(Math.atan2(h,s)),r=n,i=l,u=c}var t,e,r,i,u;va.point=function(o,a){va.point=n,r=(t=o)*Do,i=Math.cos(a=(e=a)*Do/2+Lo/4),u=Math.sin(a)},va.lineEnd=function(){n(t,e)}}function vt(n){var t=n[0],e=n[1],r=Math.cos(e);return[r*Math.cos(t),r*Math.sin(t),Math.sin(e)]}function yt(n,t){return n[0]*t[0]+n[1]*t[1]+n[2]*t[2]}function mt(n,t){return[n[1]*t[2]-n[2]*t[1],n[2]*t[0]-n[0]*t[2],n[0]*t[1]-n[1]*t[0]]}function xt(n,t){n[0]+=t[0],n[1]+=t[1],n[2]+=t[2]}function Mt(n,t){return[n[0]*t,n[1]*t,n[2]*t]}function _t(n){var t=Math.sqrt(n[0]*n[0]+n[1]*n[1]+n[2]*n[2]);n[0]/=t,n[1]/=t,n[2]/=t}function bt(n){return[Math.atan2(n[1],n[0]),tn(n[2])]}function wt(n,t){return so(n[0]-t[0])=0;--a)i.point((s=f[a])[0],s[1]);else r(p.x,p.p.x,-1,i);p=p.p}f=(p=p.o).z,g=!g}while(!p.v);i.lineEnd()}}}function qt(n){if(t=n.length){for(var t,e,r=0,i=n[0];++r0){for(_||(u.polygonStart(),_=!0),u.lineStart();++o1&&2&t&&e.push(e.pop().concat(e.shift())),p.push(e.filter(Dt))}var p,g,d,v=t(u),y=i.invert(r[0],r[1]),m={point:o,lineStart:l,lineEnd:c,polygonStart:function(){m.point=f,m.lineStart=s,m.lineEnd=h,p=[],g=[]},polygonEnd:function(){m.point=o,m.lineStart=l,m.lineEnd=c,p=to.merge(p);var n=Ot(y,g);p.length?(_||(u.polygonStart(),_=!0),Lt(p,jt,n,e,u)):n&&(_||(u.polygonStart(),_=!0),u.lineStart(),e(null,null,1,u),u.lineEnd()),_&&(u.polygonEnd(),_=!1),p=g=null},sphere:function(){u.polygonStart(),u.lineStart(),e(null,null,1,u),u.lineEnd(),u.polygonEnd()}},x=Pt(),M=t(x),_=!1;return m}}function Dt(n){return n.length>1}function Pt(){var n,t=[];return{lineStart:function(){t.push(n=[])},point:function(t,e){n.push([t,e])},lineEnd:_,buffer:function(){var e=t;return t=[],n=null,e},rejoin:function(){t.length>1&&t.push(t.pop().concat(t.shift()))}}}function jt(n,t){return((n=n.x)[0]<0?n[1]-Ro-Co:Ro-n[1])-((t=t.x)[0]<0?t[1]-Ro-Co:Ro-t[1])}function Ut(n){var t,e=NaN,r=NaN,i=NaN;return{lineStart:function(){n.lineStart(),t=1},point:function(u,o){var a=u>0?Lo:-Lo,l=so(u-e);so(l-Lo)0?Ro:-Ro),n.point(i,r),n.lineEnd(),n.lineStart(),n.point(a,r),n.point(u,r),t=0):i!==a&&l>=Lo&&(so(e-i)Co?Math.atan((Math.sin(t)*(u=Math.cos(r))*Math.sin(e)-Math.sin(r)*(i=Math.cos(t))*Math.sin(n))/(i*u*o)):(t+r)/2}function Ht(n,t,e,r){var i;if(null==n)i=e*Ro,r.point(-Lo,i),r.point(0,i),r.point(Lo,i),r.point(Lo,0),r.point(Lo,-i),r.point(0,-i),r.point(-Lo,-i),r.point(-Lo,0),r.point(-Lo,i);else if(so(n[0]-t[0])>Co){var u=n[0]=0?1:-1,w=b*_,S=w>Lo,k=g*x;if(da.add(Math.atan2(k*b*Math.sin(w),d*M+k*Math.cos(w))),u+=S?_+b*qo:_,S^h>=e^y>=e){var N=mt(vt(s),vt(n));_t(N);var E=mt(i,N);_t(E);var A=(S^_>=0?-1:1)*tn(E[2]);(r>A||r===A&&(N[0]||N[1]))&&(o+=S^_>=0?1:-1)}if(!v++)break;h=y,g=x,d=M,s=n}}return(u<-Co||uu}function e(n){var e,u,l,c,f;return{lineStart:function(){c=l=!1,f=1},point:function(s,h){var p,g=[s,h],d=t(s,h),v=o?d?0:i(s,h):d?i(s+(s<0?Lo:-Lo),h):0;if(!e&&(c=l=d)&&n.lineStart(),d!==l&&(p=r(e,g),(wt(e,p)||wt(g,p))&&(g[0]+=Co,g[1]+=Co,d=t(g[0],g[1]))),d!==l)f=0,d?(n.lineStart(),p=r(g,e),n.point(p[0],p[1])):(p=r(e,g),n.point(p[0],p[1]),n.lineEnd()),e=p;else if(a&&e&&o^d){var y;v&u||!(y=r(g,e,!0))||(f=0,o?(n.lineStart(),n.point(y[0][0],y[0][1]),n.point(y[1][0],y[1][1]),n.lineEnd()):(n.point(y[1][0],y[1][1]),n.lineEnd(),n.lineStart(),n.point(y[0][0],y[0][1])))}!d||e&&wt(e,g)||n.point(g[0],g[1]),e=g,l=d,u=v},lineEnd:function(){l&&n.lineEnd(),e=null},clean:function(){return f|(c&&l)<<1}}}function r(n,t,e){var r=[1,0,0],i=mt(vt(n),vt(t)),o=yt(i,i),a=i[0],l=o-a*a;if(!l)return!e&&n;var c=u*o/l,f=-u*a/l,s=mt(r,i),h=Mt(r,c);xt(h,Mt(i,f));var p=s,g=yt(h,p),d=yt(p,p),v=g*g-d*(yt(h,h)-1);if(!(v<0)){var y=Math.sqrt(v),m=Mt(p,(-g-y)/d);if(xt(m,h),m=bt(m),!e)return m;var x,M=n[0],_=t[0],b=n[1],w=t[1];_0^m[1]<(so(m[0]-M)Lo^(M<=m[0]&&m[0]<=_)){var E=Mt(p,(-g+y)/d);return xt(E,h),[m,bt(E)]}}}function i(t,e){var r=o?n:Lo-n,i=0;return t<-r?i|=1:t>r&&(i|=2),e<-r?i|=4:e>r&&(i|=8),i}var u=Math.cos(n),o=u>0,a=so(u)>Co;return Rt(t,e,de(n,6*Do),o?[0,-n]:[-Lo,n-Lo])}function It(n,t,e,r){return function(i){var u,o=i.a,a=i.b,l=o.x,c=o.y,f=0,s=1,h=a.x-l,p=a.y-c;if(u=n-l,h||!(u>0)){if(u/=h,h<0){if(u0){if(u>s)return;u>f&&(f=u)}if(u=e-l,h||!(u<0)){if(u/=h,h<0){if(u>s)return;u>f&&(f=u)}else if(h>0){if(u0)){if(u/=p,p<0){if(u0){if(u>s)return;u>f&&(f=u)}if(u=r-c,p||!(u<0)){if(u/=p,p<0){if(u>s)return;u>f&&(f=u)}else if(p>0){if(u0&&(i.a={x:l+f*h,y:c+f*p}),s<1&&(i.b={x:l+s*h,y:c+s*p}),i}}}}}}function Zt(n,t,e,r){function i(r,i){return so(r[0]-n)0?0:3:so(r[0]-e)0?2:1:so(r[1]-t)0?1:0:i>0?3:2}function u(n,t){return o(n.x,t.x)}function o(n,t){var e=i(n,1),r=i(t,1);return e!==r?e-r:0===e?t[1]-n[1]:1===e?n[0]-t[0]:2===e?n[1]-t[1]:t[0]-n[0]}return function(a){function l(n){for(var t=0,e=v.length,r=n[1],i=0;ir&&Q(c,u,n)>0&&++t:u[1]<=r&&Q(c,u,n)<0&&--t,c=u;return 0!==t}function c(u,a,l,c){var f=0,s=0;if(null==u||(f=i(u,l))!==(s=i(a,l))||o(u,a)<0^l>0)do{c.point(0===f||3===f?n:e,f>1?r:t)}while((f=(f+l+4)%4)!==s);else c.point(a[0],a[1])}function f(i,u){return n<=i&&i<=e&&t<=u&&u<=r}function s(n,t){f(n,t)&&a.point(n,t)}function h(){C.point=g,v&&v.push(y=[]),S=!0,w=!1,_=b=NaN}function p(){d&&(g(m,x),M&&w&&E.rejoin(),d.push(E.buffer())),C.point=s,w&&a.lineEnd()}function g(n,t){var e=f(n=Math.max(-za,Math.min(za,n)),t=Math.max(-za,Math.min(za,t)));if(v&&y.push([n,t]),S)m=n,x=t,M=e,S=!1,e&&(a.lineStart(),a.point(n,t));else if(e&&w)a.point(n,t);else{var r={a:{x:_,y:b},b:{x:n,y:t}};A(r)?(w||(a.lineStart(),a.point(r.a.x,r.a.y)),a.point(r.b.x,r.b.y),e||a.lineEnd(),k=!1):e&&(a.lineStart(),a.point(n,t),k=!1)}_=n,b=t,w=e}var d,v,y,m,x,M,_,b,w,S,k,N=a,E=Pt(),A=It(n,t,e,r),C={point:s,lineStart:h,lineEnd:p,polygonStart:function(){a=E,d=[],v=[],k=!0},polygonEnd:function(){a=N,d=to.merge(d);var t=l([n,r]),e=k&&t,i=d.length;(e||i)&&(a.polygonStart(),e&&(a.lineStart(),c(null,null,1,a),a.lineEnd()),i&&Lt(d,u,t,c,a),a.polygonEnd()),d=v=y=null}};return C}}function Vt(n){var t=0,e=Lo/3,r=ae(n),i=r(t,e);return i.parallels=function(n){return arguments.length?r(t=n[0]*Lo/180,e=n[1]*Lo/180):[t/Lo*180,e/Lo*180]},i}function Xt(n,t){function e(n,t){var e=Math.sqrt(u-2*i*Math.sin(t))/i;return[e*Math.sin(n*=i),o-e*Math.cos(n)]}var r=Math.sin(n),i=(r+Math.sin(t))/2,u=1+r*(2*i-r),o=Math.sqrt(u)/i;return e.invert=function(n,t){var e=o-t;return[Math.atan2(n,e)/i,tn((u-(n*n+e*e)*i*i)/(2*i))]},e}function $t(){function n(n,t){qa+=i*n-r*t,r=n,i=t}var t,e,r,i;ja.point=function(u,o){ja.point=n,t=r=u,e=i=o},ja.lineEnd=function(){n(t,e)}}function Bt(n,t){nDa&&(Da=n),tPa&&(Pa=t)}function Wt(){function n(n,t){o.push("M",n,",",t,u)}function t(n,t){o.push("M",n,",",t),a.point=e}function e(n,t){o.push("L",n,",",t)}function r(){a.point=n}function i(){o.push("Z")}var u=Jt(4.5),o=[],a={point:n,lineStart:function(){a.point=t},lineEnd:r,polygonStart:function(){a.lineEnd=i},polygonEnd:function(){a.lineEnd=r,a.point=n},pointRadius:function(n){return u=Jt(n),a},result:function(){if(o.length){var n=o.join("");return o=[],n}}};return a}function Jt(n){return"m0,"+n+"a"+n+","+n+" 0 1,1 0,"+-2*n+"a"+n+","+n+" 0 1,1 0,"+2*n+"z"}function Gt(n,t){xa+=n,Ma+=t,++_a}function Kt(){function n(n,r){var i=n-t,u=r-e,o=Math.sqrt(i*i+u*u);ba+=o*(t+n)/2,wa+=o*(e+r)/2,Sa+=o,Gt(t=n,e=r)}var t,e;Fa.point=function(r,i){Fa.point=n,Gt(t=r,e=i)}}function Qt(){Fa.point=Gt}function ne(){function n(n,t){var e=n-r,u=t-i,o=Math.sqrt(e*e+u*u);ba+=o*(r+n)/2,wa+=o*(i+t)/2,Sa+=o,ka+=(o=i*n-r*t)*(r+n),Na+=o*(i+t),Ea+=3*o,Gt(r=n,i=t)}var t,e,r,i;Fa.point=function(u,o){Fa.point=n,Gt(t=r=u,e=i=o)},Fa.lineEnd=function(){n(t,e)}}function te(n){function t(t,e){n.moveTo(t+o,e),n.arc(t,e,o,0,qo)}function e(t,e){n.moveTo(t,e),a.point=r}function r(t,e){n.lineTo(t,e)}function i(){a.point=t}function u(){n.closePath()}var o=4.5,a={point:t,lineStart:function(){a.point=e},lineEnd:i,polygonStart:function(){a.lineEnd=u},polygonEnd:function(){a.lineEnd=i,a.point=t},pointRadius:function(n){return o=n,a},result:_};return a}function ee(n){function t(n){return(a?r:e)(n)}function e(t){return ue(t,function(e,r){e=n(e,r),t.point(e[0],e[1])})}function r(t){function e(e,r){e=n(e,r),t.point(e[0],e[1])}function r(){x=NaN,S.point=u,t.lineStart()}function u(e,r){var u=vt([e,r]),o=n(e,r);i(x,M,m,_,b,w,x=o[0],M=o[1],m=e,_=u[0],b=u[1],w=u[2],a,t),t.point(x,M)}function o(){S.point=e,t.lineEnd()}function l(){r(),S.point=c,S.lineEnd=f}function c(n,t){u(s=n,h=t),p=x,g=M,d=_,v=b,y=w,S.point=u}function f(){i(x,M,m,_,b,w,p,g,s,d,v,y,a,t),S.lineEnd=o,o()}var s,h,p,g,d,v,y,m,x,M,_,b,w,S={point:e,lineStart:r,lineEnd:o,polygonStart:function(){t.polygonStart(),S.lineStart=l},polygonEnd:function(){t.polygonEnd(),S.lineStart=r}};return S}function i(t,e,r,a,l,c,f,s,h,p,g,d,v,y){var m=f-t,x=s-e,M=m*m+x*x;if(M>4*u&&v--){var _=a+p,b=l+g,w=c+d,S=Math.sqrt(_*_+b*b+w*w),k=Math.asin(w/=S),N=so(so(w)-1)u||so((m*z+x*L)/M-.5)>.3||a*p+l*g+c*d0&&16,t):Math.sqrt(u)},t}function re(n){var t=ee(function(t,e){return n([t*Po,e*Po])});return function(n){return le(t(n))}}function ie(n){this.stream=n}function ue(n,t){return{point:t,sphere:function(){n.sphere()},lineStart:function(){n.lineStart()},lineEnd:function(){n.lineEnd()},polygonStart:function(){n.polygonStart()},polygonEnd:function(){n.polygonEnd()}}}function oe(n){return ae(function(){return n})()}function ae(n){function t(n){return n=a(n[0]*Do,n[1]*Do),[n[0]*h+l,c-n[1]*h]}function e(n){return(n=a.invert((n[0]-l)/h,(c-n[1])/h))&&[n[0]*Po,n[1]*Po]}function r(){a=Ct(o=se(y,x,M),u);var n=u(d,v);return l=p-n[0]*h,c=g+n[1]*h,i()}function i(){return f&&(f.valid=!1,f=null),t}var u,o,a,l,c,f,s=ee(function(n,t){return n=u(n,t),[n[0]*h+l,c-n[1]*h]}),h=150,p=480,g=250,d=0,v=0,y=0,x=0,M=0,_=Ca,b=m,w=null,S=null;return t.stream=function(n){return f&&(f.valid=!1),f=le(_(o,s(b(n)))),f.valid=!0,f},t.clipAngle=function(n){return arguments.length?(_=null==n?(w=n,Ca):Yt((w=+n)*Do),i()):w},t.clipExtent=function(n){return arguments.length?(S=n,b=n?Zt(n[0][0],n[0][1],n[1][0],n[1][1]):m,i()):S},t.scale=function(n){return arguments.length?(h=+n,r()):h},t.translate=function(n){return arguments.length?(p=+n[0],g=+n[1],r()):[p,g]},t.center=function(n){return arguments.length?(d=n[0]%360*Do,v=n[1]%360*Do,r()):[d*Po,v*Po]},t.rotate=function(n){return arguments.length?(y=n[0]%360*Do,x=n[1]%360*Do,M=n.length>2?n[2]%360*Do:0,r()):[y*Po,x*Po,M*Po]},to.rebind(t,s,"precision"),function(){return u=n.apply(this,arguments),t.invert=u.invert&&e,r()}}function le(n){return ue(n,function(t,e){n.point(t*Do,e*Do)})}function ce(n,t){return[n,t]}function fe(n,t){return[n>Lo?n-qo:n<-Lo?n+qo:n,t]}function se(n,t,e){return n?t||e?Ct(pe(n),ge(t,e)):pe(n):t||e?ge(t,e):fe}function he(n){return function(t,e){return t+=n,[t>Lo?t-qo:t<-Lo?t+qo:t,e]}}function pe(n){var t=he(n);return t.invert=he(-n),t}function ge(n,t){function e(n,t){var e=Math.cos(t),a=Math.cos(n)*e,l=Math.sin(n)*e,c=Math.sin(t),f=c*r+a*i;return[Math.atan2(l*u-f*o,a*r-c*i),tn(f*u+l*o)]}var r=Math.cos(n),i=Math.sin(n),u=Math.cos(t),o=Math.sin(t);return e.invert=function(n,t){var e=Math.cos(t),a=Math.cos(n)*e,l=Math.sin(n)*e,c=Math.sin(t),f=c*u-l*o;return[Math.atan2(l*u+c*o,a*r+f*i),tn(f*r-a*i)]},e}function de(n,t){var e=Math.cos(n),r=Math.sin(n);return function(i,u,o,a){var l=o*t;null!=i?(i=ve(e,i),u=ve(e,u),(o>0?iu)&&(i+=o*qo)):(i=n+o*qo,u=n-.5*l);for(var c,f=i;o>0?f>u:f0?t<-Ro+Co&&(t=-Ro+Co):t>Ro-Co&&(t=Ro-Co);var e=o/Math.pow(i(t),u);return[e*Math.sin(u*n),o-e*Math.cos(u*n)]}var r=Math.cos(n),i=function(n){return Math.tan(Lo/4+n/2)},u=n===t?Math.sin(n):Math.log(r/Math.cos(t))/Math.log(i(t)/i(n)),o=r*Math.pow(i(n),u)/u;return u?(e.invert=function(n,t){var e=o-t,r=K(u)*Math.sqrt(n*n+e*e);return[Math.atan2(n,e)/u,2*Math.atan(Math.pow(o/r,1/u))-Ro]},e):Ne}function ke(n,t){function e(n,t){var e=u-t;return[e*Math.sin(i*n),u-e*Math.cos(i*n)]}var r=Math.cos(n),i=n===t?Math.sin(n):(r-Math.cos(t))/(t-n),u=r/i+n;return so(i)1&&Q(n[e[r-2]],n[e[r-1]],n[i])<=0;)--r;e[r++]=i}return e.slice(0,r)}function qe(n,t){return n[0]-t[0]||n[1]-t[1]}function Te(n,t,e){return(e[0]-t[0])*(n[1]-t[1])<(e[1]-t[1])*(n[0]-t[0])}function Re(n,t,e,r){var i=n[0],u=e[0],o=t[0]-i,a=r[0]-u,l=n[1],c=e[1],f=t[1]-l,s=r[1]-c,h=(a*(l-c)-s*(i-u))/(s*o-a*f);return[i+h*o,l+h*f]}function De(n){var t=n[0],e=n[n.length-1];return!(t[0]-e[0]||t[1]-e[1])}function Pe(){rr(this),this.edge=this.site=this.circle=null}function je(n){var t=Qa.pop()||new Pe;return t.site=n,t}function Ue(n){Be(n),Ja.remove(n),Qa.push(n),rr(n)}function Fe(n){var t=n.circle,e=t.x,r=t.cy,i={x:e,y:r},u=n.P,o=n.N,a=[n];Ue(n);for(var l=u;l.circle&&so(e-l.circle.x)Co)a=a.L;else{if(!((i=u-Ye(a,o))>Co)){r>-Co?(t=a.P,e=a):i>-Co?(t=a,e=a.N):t=e=a;break}if(!a.R){t=a;break}a=a.R}var l=je(n);if(Ja.insert(t,l),t||e){if(t===e)return Be(t),e=je(t.site),Ja.insert(l,e),l.edge=e.edge=Ke(t.site,l.site),$e(t),void $e(e);if(e){Be(t),Be(e);var c=t.site,f=c.x,s=c.y,h=n.x-f,p=n.y-s,g=e.site,d=g.x-f,v=g.y-s,y=2*(h*v-p*d),m=h*h+p*p,x=d*d+v*v,M={x:(v*m-p*x)/y+f,y:(h*x-d*m)/y+s};nr(e.edge,c,g,M),l.edge=Ke(c,n,null,M),e.edge=Ke(n,g,null,M),$e(t),$e(e)}else l.edge=Ke(t.site,l.site)}}function Oe(n,t){var e=n.site,r=e.x,i=e.y,u=i-t;if(!u)return r;var o=n.P;if(!o)return-1/0;var a=(e=o.site).x,l=e.y,c=l-t;if(!c)return a;var f=a-r,s=1/u-1/c,h=f/c;return s?(-h+Math.sqrt(h*h-2*s*(f*f/(-2*c)-l+c/2+i-u/2)))/s+r:(r+a)/2}function Ye(n,t){var e=n.N;if(e)return Oe(e,t);var r=n.site;return r.y===t?r.x:1/0}function Ie(n){this.site=n,this.edges=[]}function Ze(n){for(var t,e,r,i,u,o,a,l,c,f,s=n[0][0],h=n[1][0],p=n[0][1],g=n[1][1],d=Wa,v=d.length;v--;)if((u=d[v])&&u.prepare())for(l=(a=u.edges).length,o=0;oCo||so(i-e)>Co)&&(a.splice(o,0,new tr(Qe(u.site,f,so(r-s)Co?{x:s,y:so(t-s)Co?{x:so(e-g)Co?{x:h,y:so(t-h)Co?{x:so(e-p)=-zo)){var h=l*l+c*c,p=f*f+v*v,g=(v*h-c*p)/s,d=(l*p-f*h)/s,v=d+a,y=nl.pop()||new Xe;y.arc=n,y.site=i,y.x=g+o,y.y=v+Math.sqrt(g*g+d*d),y.cy=v,n.circle=y;for(var m=null,x=Ka._;x;)if(y.y=a)return;if(h>g){if(u){if(u.y>=c)return}else u={x:v,y:l};e={x:v,y:c}}else{if(u){if(u.y1)if(h>g){if(u){if(u.y>=c)return}else u={x:(l-i)/r,y:l};e={x:(c-i)/r,y:c}}else{if(u){if(u.y=a)return}else u={x:o,y:r*o+i};e={x:a,y:r*a+i}}else{if(u){if(u.xu||s>o||h=_)<<1|t>=M,w=b+4;bu&&(i=t.slice(u,i),a[o]?a[o]+=i:a[++o]=i),(e=e[0])===(r=r[0])?a[o]?a[o]+=r:a[++o]=r:(a[++o]=null,l.push({i:o,x:vr(e,r)})),u=rl.lastIndex;return u=0&&!(e=to.interpolators[r](n,t)););return e}function xr(n,t){var e,r=[],i=[],u=n.length,o=t.length,a=Math.min(n.length,t.length);for(e=0;e=1?1:n(t)}}function _r(n){return function(t){return 1-n(1-t)}}function br(n){return function(t){return.5*(t<.5?n(2*t):2-n(2-2*t))}}function wr(n){return n*n}function Sr(n){return n*n*n}function kr(n){if(n<=0)return 0;if(n>=1)return 1;var t=n*n,e=t*n;return 4*(n<.5?e:3*(n-t)+e-.75)}function Nr(n){return function(t){return Math.pow(t,n)}}function Er(n){return 1-Math.cos(n*Ro)}function Ar(n){return Math.pow(2,10*(n-1))}function Cr(n){return 1-Math.sqrt(1-n*n)}function zr(n,t){var e;return arguments.length<2&&(t=.45),arguments.length?e=t/qo*Math.asin(1/n):(n=1,e=t/4),function(r){return 1+n*Math.pow(2,-10*r)*Math.sin((r-e)*qo/t)}}function Lr(n){return n||(n=1.70158),function(t){return t*t*((n+1)*t-n)}}function qr(n){return n<1/2.75?7.5625*n*n:n<2/2.75?7.5625*(n-=1.5/2.75)*n+.75:n<2.5/2.75?7.5625*(n-=2.25/2.75)*n+.9375:7.5625*(n-=2.625/2.75)*n+.984375}function Tr(n,t){n=to.hcl(n),t=to.hcl(t);var e=n.h,r=n.c,i=n.l,u=t.h-e,o=t.c-r,a=t.l-i;return isNaN(o)&&(o=0,r=isNaN(r)?t.c:r),isNaN(u)?(u=0,e=isNaN(e)?t.h:e):u>180?u-=360:u<-180&&(u+=360),function(n){return sn(e+u*n,r+o*n,i+a*n)+""}}function Rr(n,t){n=to.hsl(n),t=to.hsl(t);var e=n.h,r=n.s,i=n.l,u=t.h-e,o=t.s-r,a=t.l-i;return isNaN(o)&&(o=0,r=isNaN(r)?t.s:r),isNaN(u)?(u=0,e=isNaN(e)?t.h:e):u>180?u-=360:u<-180&&(u+=360),function(n){return cn(e+u*n,r+o*n,i+a*n)+""}}function Dr(n,t){n=to.lab(n),t=to.lab(t);var e=n.l,r=n.a,i=n.b,u=t.l-e,o=t.a-r,a=t.b-i;return function(n){return pn(e+u*n,r+o*n,i+a*n)+""}}function Pr(n,t){return t-=n,function(e){return Math.round(n+t*e)}}function jr(n){var t=[n.a,n.b],e=[n.c,n.d],r=Fr(t),i=Ur(t,e),u=Fr(Hr(e,t,-i))||0;t[0]*e[1]180?t+=360:t-n>180&&(n+=360),r.push({i:e.push(Or(e)+"rotate(",null,")")-2,x:vr(n,t)})):t&&e.push(Or(e)+"rotate("+t+")")}function Zr(n,t,e,r){n!==t?r.push({i:e.push(Or(e)+"skewX(",null,")")-2,x:vr(n,t)}):t&&e.push(Or(e)+"skewX("+t+")")}function Vr(n,t,e,r){if(n[0]!==t[0]||n[1]!==t[1]){var i=e.push(Or(e)+"scale(",null,",",null,")");r.push({i:i-4,x:vr(n[0],t[0])},{i:i-2,x:vr(n[1],t[1])})}else 1===t[0]&&1===t[1]||e.push(Or(e)+"scale("+t+")")}function Xr(n,t){var e=[],r=[];return n=to.transform(n),t=to.transform(t),Yr(n.translate,t.translate,e,r),Ir(n.rotate,t.rotate,e,r),Zr(n.skew,t.skew,e,r),Vr(n.scale,t.scale,e,r),n=t=null,function(n){for(var t,i=-1,u=r.length;++i=0;)e.push(i[r])}function ui(n,t){for(var e=[n],r=[];null!=(n=e.pop());)if(r.push(n),(u=n.children)&&(i=u.length))for(var i,u,o=-1;++oi&&(r=e,i=t);return r}function vi(n){return n.reduce(yi,0)}function yi(n,t){return n+t[1]}function mi(n,t){return xi(n,Math.ceil(Math.log(t.length)/Math.LN2+1))}function xi(n,t){for(var e=-1,r=+n[0],i=(n[1]-r)/t,u=[];++e<=t;)u[e]=i*e+r;return u}function Mi(n){return[to.min(n),to.max(n)]}function _i(n,t){return n.value-t.value}function bi(n,t){var e=n._pack_next;n._pack_next=t,t._pack_prev=n,t._pack_next=e,e._pack_prev=t}function wi(n,t){n._pack_next=t,t._pack_prev=n}function Si(n,t){var e=t.x-n.x,r=t.y-n.y,i=n.r+t.r;return.999*i*i>e*e+r*r}function ki(n){function t(n){f=Math.min(n.x-n.r,f),s=Math.max(n.x+n.r,s),h=Math.min(n.y-n.r,h),p=Math.max(n.y+n.r,p)}if((e=n.children)&&(c=e.length)){var e,r,i,u,o,a,l,c,f=1/0,s=-1/0,h=1/0,p=-1/0;if(e.forEach(Ni),r=e[0],r.x=-r.r,r.y=0,t(r),c>1&&(i=e[1],i.x=i.r,i.y=0,t(i),c>2))for(Ci(r,i,u=e[2]),t(u),bi(r,u),r._pack_prev=u,bi(u,i),i=r._pack_next,o=3;o2?Yi:Fi,l=r?Br:$r;return o=i(n,t,l,e),a=i(t,n,l,mr),u}function u(n){return o(n)}var o,a;return u.invert=function(n){return a(n)},u.domain=function(t){return arguments.length?(n=t.map(Number),i()):n},u.range=function(n){return arguments.length?(t=n,i()):t},u.rangeRound=function(n){return u.range(n).interpolate(Pr)},u.clamp=function(n){return arguments.length?(r=n,i()):r},u.interpolate=function(n){return arguments.length?(e=n,i()):e},u.ticks=function(t){return $i(n,t)},u.tickFormat=function(t,e){return Bi(n,t,e)},u.nice=function(t){return Vi(n,t),i()},u.copy=function(){return Ii(n,t,e,r)},i()}function Zi(n,t){return to.rebind(n,t,"range","rangeRound","interpolate","clamp")}function Vi(n,t){return Hi(n,Oi(Xi(n,t)[2])),Hi(n,Oi(Xi(n,t)[2])),n}function Xi(n,t){null==t&&(t=10);var e=ji(n),r=e[1]-e[0],i=Math.pow(10,Math.floor(Math.log(r/t)/Math.LN10)),u=t/r*i;return u<=.15?i*=10:u<=.35?i*=5:u<=.75&&(i*=2),e[0]=Math.ceil(e[0]/i)*i,e[1]=Math.floor(e[1]/i)*i+.5*i,e[2]=i,e}function $i(n,t){return to.range.apply(to,Xi(n,t))}function Bi(n,t,e){var r=Xi(n,t);if(e){var i=ea.exec(e);if(i.shift(),"s"===i[8]){var u=to.formatPrefix(Math.max(so(r[0]),so(r[1])));return i[7]||(i[7]="."+Wi(u.scale(r[2]))),i[8]="f",e=to.format(i.join("")),function(n){return e(u.scale(n))+u.symbol}}i[7]||(i[7]="."+Ji(i[8],r)),e=i.join("")}else e=",."+Wi(r[2])+"f";return to.format(e)}function Wi(n){return-Math.floor(Math.log(n)/Math.LN10+.01)}function Ji(n,t){var e=Wi(t[2]);return n in dl?Math.abs(e-Wi(Math.max(so(t[0]),so(t[1]))))+ +("e"!==n):e-2*("%"===n)}function Gi(n,t,e,r){function i(n){return(e?Math.log(n<0?0:n):-Math.log(n>0?0:-n))/Math.log(t)}function u(n){return e?Math.pow(t,n):-Math.pow(t,-n)}function o(t){return n(i(t))}return o.invert=function(t){return u(n.invert(t))},o.domain=function(t){return arguments.length?(e=t[0]>=0,n.domain((r=t.map(Number)).map(i)),o):r},o.base=function(e){return arguments.length?(t=+e,n.domain(r.map(i)),o):t},o.nice=function(){var t=Hi(r.map(i),e?Math:yl);return n.domain(t),r=t.map(u),o},o.ticks=function(){var n=ji(r),o=[],a=n[0],l=n[1],c=Math.floor(i(a)),f=Math.ceil(i(l)),s=t%1?2:t;if(isFinite(f-c)){if(e){for(;c0;h--)o.push(u(c)*h);for(c=0;o[c]l;f--);o=o.slice(c,f)}return o},o.tickFormat=function(n,e){if(!arguments.length)return vl;arguments.length<2?e=vl:"function"!=typeof e&&(e=to.format(e));var r=Math.max(1,t*n/o.ticks().length);return function(n){var o=n/u(Math.round(i(n)));return o*t0?a[e-1]:n[0],e0?0:1}function hu(n,t,e,r,i){var u=n[0]-t[0],o=n[1]-t[1],a=(i?r:-r)/Math.sqrt(u*u+o*o),l=a*o,c=-a*u,f=n[0]+l,s=n[1]+c,h=t[0]+l,p=t[1]+c,g=(f+h)/2,d=(s+p)/2,v=h-f,y=p-s,m=v*v+y*y,x=e-r,M=f*p-h*s,_=(y<0?-1:1)*Math.sqrt(Math.max(0,x*x*m-M*M)),b=(M*y-v*_)/m,w=(-M*v-y*_)/m,S=(M*y+v*_)/m,k=(-M*v+y*_)/m,N=b-g,E=w-d,A=S-g,C=k-d;return N*N+E*E>A*A+C*C&&(b=S,w=k),[[b-l,w-c],[b*e/x,w*e/x]]}function pu(n){function t(t){function o(){c.push("M",u(n(f),a))}for(var l,c=[],f=[],s=-1,h=t.length,p=En(e),g=En(r);++s1?n.join("L"):n+"Z"}function du(n){return n.join("L")+"Z"}function vu(n){for(var t=0,e=n.length,r=n[0],i=[r[0],",",r[1]];++t1&&i.push("H",r[0]),i.join("")}function yu(n){for(var t=0,e=n.length,r=n[0],i=[r[0],",",r[1]];++t1){a=t[1],u=n[l],l++,r+="C"+(i[0]+o[0])+","+(i[1]+o[1])+","+(u[0]-a[0])+","+(u[1]-a[1])+","+u[0]+","+u[1];for(var c=2;c9&&(i=3*t/Math.sqrt(i),o[a]=i*e,o[a+1]=i*r);for(a=-1;++a<=l;)i=(n[Math.min(l,a+1)][0]-n[Math.max(0,a-1)][0])/(6*(1+o[a]*o[a])),u.push([i||0,o[a]*i||0]);return u}function Tu(n){return n.length<3?gu(n):n[0]+bu(n,qu(n))}function Ru(n){for(var t,e,r,i=-1,u=n.length;++i0;)p[--a].call(n,o);if(u>=1)return d.event&&d.event.end.call(n,n.__data__,t),--g.count?delete g[r]:delete n[e],1}var l,f,s,h,p,g=n[e]||(n[e]={active:0,count:0}),d=g[r];d||(l=i.time,f=qn(u,0,l),d=g[r]={tween:new c,time:l,timer:f,delay:i.delay,duration:i.duration,ease:i.ease,index:t},i=null,++g.count)}function Bu(n,t,e){n.attr("transform",function(n){var r=t(n);return"translate("+(isFinite(r)?r:e(n))+",0)"})}function Wu(n,t,e){n.attr("transform",function(n){var r=t(n);return"translate(0,"+(isFinite(r)?r:e(n))+")"})}function Ju(n){return n.toISOString()}function Gu(n,t,e){function r(t){return n(t)}function i(n,e){var r=(n[1]-n[0])/e,i=to.bisect(Yl,r);return i==Yl.length?[t.year,Xi(n.map(function(n){return n/31536e6}),e)[2]]:i?t[r/Yl[i-1]1?{floor:function(t){for(;e(t=n.floor(t));)t=Ku(t-1);return t},ceil:function(t){for(;e(t=n.ceil(t));)t=Ku(+t+1);return t}}:n))},r.ticks=function(n,t){var e=ji(r.domain()),u=null==n?i(e,10):"number"==typeof n?i(e,n):!n.range&&[{range:n},t];return u&&(n=u[0],t=u[1]),n.range(e[0],Ku(+e[1]+1),t<1?1:t)},r.tickFormat=function(){return e},r.copy=function(){return Gu(n.copy(),t,e)},Zi(r,n)}function Ku(n){return new Date(n)}function Qu(n){return JSON.parse(n.responseText)}function no(n){var t=io.createRange();return t.selectNode(io.body),t.createContextualFragment(n.responseText)}var to={version:"3.5.17"},eo=[].slice,ro=function(n){return eo.call(n)},io=this.document;if(io)try{ro(io.documentElement.childNodes)[0].nodeType}catch(n){ro=function(n){for(var t=n.length,e=new Array(t);t--;)e[t]=n[t];return e}}if(Date.now||(Date.now=function(){return+new Date}),io)try{io.createElement("DIV").style.setProperty("opacity",0,"")}catch(n){var uo=this.Element.prototype,oo=uo.setAttribute,ao=uo.setAttributeNS,lo=this.CSSStyleDeclaration.prototype,co=lo.setProperty;uo.setAttribute=function(n,t){oo.call(this,n,t+"")},uo.setAttributeNS=function(n,t,e){ao.call(this,n,t,e+"")},lo.setProperty=function(n,t,e){co.call(this,n,t+"",e)}}to.ascending=e,to.descending=function(n,t){return tn?1:t>=n?0:NaN},to.min=function(n,t){var e,r,i=-1,u=n.length;if(1===arguments.length){for(;++i=r){e=r;break}for(;++ir&&(e=r)}else{for(;++i=r){e=r;break}for(;++ir&&(e=r)}return e},to.max=function(n,t){var e,r,i=-1,u=n.length;if(1===arguments.length){for(;++i=r){e=r;break}for(;++ie&&(e=r)}else{for(;++i=r){e=r;break}for(;++ie&&(e=r)}return e},to.extent=function(n,t){var e,r,i,u=-1,o=n.length;if(1===arguments.length){for(;++u=r){e=i=r;break}for(;++ur&&(e=r),i=r){e=i=r;break}for(;++ur&&(e=r),i1)return l/(f-1)},to.deviation=function(){var n=to.variance.apply(this,arguments);return n?Math.sqrt(n):n};var fo=u(e);to.bisectLeft=fo.left,to.bisect=to.bisectRight=fo.right,to.bisector=function(n){return u(1===n.length?function(t,r){return e(n(t),r)}:n)},to.shuffle=function(n,t,e){(u=arguments.length)<3&&(e=n.length,u<2&&(t=0));for(var r,i,u=e-t;u;)i=Math.random()*u--|0,r=n[u+t],n[u+t]=n[i+t],n[i+t]=r;return n},to.permute=function(n,t){for(var e=t.length,r=new Array(e);e--;)r[e]=n[t[e]];return r},to.pairs=function(n){for(var t=0,e=n.length-1,r=n[0],i=new Array(e<0?0:e);t=0;)for(t=(r=n[i]).length;--t>=0;)e[--o]=r[t];return e};var so=Math.abs;to.range=function(n,t,e){if(arguments.length<3&&(e=1,arguments.length<2&&(t=n,n=0)),(t-n)/e==1/0)throw new Error("infinite range");var r,i=[],u=a(so(e)),o=-1;if(n*=u,t*=u,(e*=u)<0)for(;(r=n+e*++o)>t;)i.push(r/u);else for(;(r=n+e*++o)=u.length)return r?r.call(i,o):e?o.sort(e):o;for(var l,f,s,h,p=-1,g=o.length,d=u[a++],v=new c;++p=u.length)return n;var r=[],i=o[e++];return n.forEach(function(n,i){r.push({key:n,values:t(i,e)})}),i?r.sort(function(n,t){return i(n.key,t.key)}):r}var e,r,i={},u=[],o=[];return i.map=function(t,e){return n(e,t,0)},i.entries=function(e){return t(n(to.map,e,0),0)},i.key=function(n){return u.push(n),i},i.sortKeys=function(n){return o[u.length-1]=n,i},i.sortValues=function(n){return e=n,i},i.rollup=function(n){return r=n,i},i},to.set=function(n){var t=new y;if(n)for(var e=0,r=n.length;e=0&&(r=n.slice(e+1),n=n.slice(0,e)),n)return arguments.length<2?this[n].on(r):this[n].on(r,t);if(2===arguments.length){if(null==t)for(n in this)this.hasOwnProperty(n)&&this[n].on(r,null);return this}},to.event=null,to.requote=function(n){return n.replace(vo,"\\$&")};var vo=/[\\\^\$\*\+\?\|\[\]\(\)\.\{\}]/g,yo={}.__proto__?function(n,t){n.__proto__=t}:function(n,t){for(var e in t)n[e]=t[e]},mo=function(n,t){return t.querySelector(n)},xo=function(n,t){return t.querySelectorAll(n)},Mo=function(n,t){var e=n.matches||n[M(n,"matchesSelector")];return(Mo=function(n,t){return e.call(n,t)})(n,t)};"function"==typeof Sizzle&&(mo=function(n,t){return Sizzle(n,t)[0]||null},xo=Sizzle,Mo=Sizzle.matchesSelector),to.selection=function(){return to.select(io.documentElement)};var _o=to.selection.prototype=[];_o.select=function(n){var t,e,r,i,u=[];n=A(n);for(var o=-1,a=this.length;++o=0&&"xmlns"!==(e=n.slice(0,t))&&(n=n.slice(t+1)),wo.hasOwnProperty(e)?{space:wo[e],local:n}:n}},_o.attr=function(n,t){if(arguments.length<2){if("string"==typeof n){var e=this.node();return n=to.ns.qualify(n),n.local?e.getAttributeNS(n.space,n.local):e.getAttribute(n)}for(t in n)this.each(z(t,n[t]));return this}return this.each(z(n,t))},_o.classed=function(n,t){if(arguments.length<2){if("string"==typeof n){var e=this.node(),r=(n=T(n)).length,i=-1;if(t=e.classList){for(;++i=0;)(e=r[i])&&(u&&u!==e.nextSibling&&u.parentNode.insertBefore(e,u),u=e);return this},_o.sort=function(n){n=Y.apply(this,arguments);for(var t=-1,e=this.length;++t0&&(t=t.transition().duration(C)),t.call(n.event)}function a(){_&&_.domain(M.range().map(function(n){return(n-k.x)/k.k}).map(M.invert)),w&&w.domain(b.range().map(function(n){return(n-k.y)/k.k}).map(b.invert))}function l(n){z++||n({type:"zoomstart"})}function c(n){a(),n({type:"zoom",scale:k.k,translate:[k.x,k.y]})}function f(n){--z||(n({type:"zoomend"}),v=null)}function s(){function n(){a=1,u(to.mouse(i),h),c(o)}function r(){s.on(q,null).on(T,null),p(a),f(o)}var i=this,o=D.of(i,arguments),a=0,s=to.select(t(i)).on(q,n).on(T,r),h=e(to.mouse(i)),p=W(i);ql.call(i),l(o)}function h(){function n(){var n=to.touches(g);return p=k.k,n.forEach(function(n){n.identifier in v&&(v[n.identifier]=e(n))}),n}function t(){var t=to.event.target;to.select(t).on(M,r).on(_,a),b.push(t);for(var e=to.event.changedTouches,i=0,u=e.length;i1){var f=l[0],s=l[1],h=f[0]-s[0],p=f[1]-s[1];y=h*h+p*p}}function r(){var n,t,e,r,o=to.touches(g);ql.call(g);for(var a=0,l=o.length;a=c)return o;if(i)return i=!1,u;var t=f;if(34===n.charCodeAt(t)){for(var e=t;e++=^]))?([+\- ])?([$#])?(0)?(\d+)?(,)?(\.-?\d+)?([a-z%])?/i,ra=to.map({b:function(n){return n.toString(2)},c:function(n){return String.fromCharCode(n)},o:function(n){return n.toString(8)},x:function(n){return n.toString(16)},X:function(n){return n.toString(16).toUpperCase()},g:function(n,t){return n.toPrecision(t)},e:function(n,t){return n.toExponential(t)},f:function(n,t){return n.toFixed(t)},r:function(n,t){return(n=to.round(n,Pn(n,t))).toFixed(Math.max(0,Math.min(20,Pn(n*(1+1e-15),t))))}}),ia=to.time={},ua=Date;Hn.prototype={getDate:function(){return this._.getUTCDate()},getDay:function(){return this._.getUTCDay()},getFullYear:function(){return this._.getUTCFullYear()},getHours:function(){return this._.getUTCHours()},getMilliseconds:function(){return this._.getUTCMilliseconds()},getMinutes:function(){return this._.getUTCMinutes()},getMonth:function(){return this._.getUTCMonth()},getSeconds:function(){return this._.getUTCSeconds()},getTime:function(){return this._.getTime()},getTimezoneOffset:function(){return 0},valueOf:function(){return this._.valueOf()},setDate:function(){oa.setUTCDate.apply(this._,arguments)},setDay:function(){oa.setUTCDay.apply(this._,arguments)},setFullYear:function(){oa.setUTCFullYear.apply(this._,arguments)},setHours:function(){oa.setUTCHours.apply(this._,arguments)},setMilliseconds:function(){oa.setUTCMilliseconds.apply(this._,arguments)},setMinutes:function(){oa.setUTCMinutes.apply(this._,arguments)},setMonth:function(){oa.setUTCMonth.apply(this._,arguments)},setSeconds:function(){oa.setUTCSeconds.apply(this._,arguments)},setTime:function(){oa.setTime.apply(this._,arguments)}};var oa=Date.prototype;ia.year=On(function(n){return(n=ia.day(n)).setMonth(0,1),n},function(n,t){n.setFullYear(n.getFullYear()+t)},function(n){return n.getFullYear()}),ia.years=ia.year.range,ia.years.utc=ia.year.utc.range,ia.day=On(function(n){var t=new ua(2e3,0);return t.setFullYear(n.getFullYear(),n.getMonth(),n.getDate()),t},function(n,t){n.setDate(n.getDate()+t)},function(n){return n.getDate()-1}),ia.days=ia.day.range,ia.days.utc=ia.day.utc.range,ia.dayOfYear=function(n){var t=ia.year(n);return Math.floor((n-t-6e4*(n.getTimezoneOffset()-t.getTimezoneOffset()))/864e5)},["sunday","monday","tuesday","wednesday","thursday","friday","saturday"].forEach(function(n,t){t=7-t;var e=ia[n]=On(function(n){return(n=ia.day(n)).setDate(n.getDate()-(n.getDay()+t)%7),n},function(n,t){n.setDate(n.getDate()+7*Math.floor(t))},function(n){var e=ia.year(n).getDay();return Math.floor((ia.dayOfYear(n)+(e+t)%7)/7)-(e!==t)});ia[n+"s"]=e.range,ia[n+"s"].utc=e.utc.range,ia[n+"OfYear"]=function(n){var e=ia.year(n).getDay();return Math.floor((ia.dayOfYear(n)+(e+t)%7)/7)}}),ia.week=ia.sunday,ia.weeks=ia.sunday.range,ia.weeks.utc=ia.sunday.utc.range,ia.weekOfYear=ia.sundayOfYear;var aa={"-":"",_:" ",0:"0"},la=/^\s*\d+/,ca=/^%/;to.locale=function(n){return{numberFormat:Un(n),timeFormat:In(n)}};var fa=to.locale({decimal:".",thousands:",",grouping:[3],currency:["$",""],dateTime:"%a %b %e %X %Y",date:"%m/%d/%Y",time:"%H:%M:%S",periods:["AM","PM"],days:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],shortDays:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],months:["January","February","March","April","May","June","July","August","September","October","November","December"],shortMonths:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"]});to.format=fa.numberFormat,to.geo={},ft.prototype={s:0,t:0,add:function(n){st(n,this.t,sa),st(sa.s,this.s,this),this.s?this.t+=sa.t:this.s=sa.t},reset:function(){this.s=this.t=0},valueOf:function(){return this.s}};var sa=new ft;to.geo.stream=function(n,t){n&&ha.hasOwnProperty(n.type)?ha[n.type](n,t):ht(n,t)};var ha={Feature:function(n,t){ht(n.geometry,t)},FeatureCollection:function(n,t){for(var e=n.features,r=-1,i=e.length;++rp&&(p=t)}function t(t,e){var r=vt([t*Do,e*Do]);if(y){var i=mt(y,r),u=mt([i[1],-i[0],0],i);_t(u),u=bt(u);var o=t-g,l=o>0?1:-1,c=u[0]*Po*l,d=so(o)>180;if(d^(l*gp&&(p=v);else if(c=(c+360)%360-180,d^(l*gp&&(p=e);d?ta(f,h)&&(h=t):a(t,h)>a(f,h)&&(f=t):h>=f?(th&&(h=t)):t>g?a(f,t)>a(f,h)&&(h=t):a(t,h)>a(f,h)&&(f=t)}else n(t,e);y=r,g=t}function e(){_.point=t}function r(){M[0]=f,M[1]=h,_.point=n,y=null}function i(n,e){if(y){var r=n-g;m+=so(r)>180?r+(r>0?360:-360):r}else d=n,v=e;va.point(n,e),t(n,e)}function u(){va.lineStart()}function o(){i(d,v),va.lineEnd(),so(m)>Co&&(f=-(h=180)),M[0]=f,M[1]=h,y=null}function a(n,t){return(t-=n)<0?t+360:t}function l(n,t){return n[0]-t[0]}function c(n,t){return t[0]<=t[1]?t[0]<=n&&n<=t[1]:nCo?p=90:m<-Co&&(s=-90),M[0]=f,M[1]=h}};return function(n){p=h=-(f=s=1/0),x=[],to.geo.stream(n,_);var t=x.length;if(t){x.sort(l);for(var e=1,r=[g=x[0]];ea(g[0],g[1])&&(g[1]=u[1]),a(u[0],g[1])>a(g[0],g[1])&&(g[0]=u[0])):r.push(g=u);for(var i,u,o=-1/0,e=0,g=r[t=r.length-1];e<=t;g=u,++e)u=r[e],(i=a(g[1],u[0]))>o&&(o=i,f=u[0],h=g[1])}return x=M=null,f===1/0||s===1/0?[[NaN,NaN],[NaN,NaN]]:[[f,s],[h,p]]}}(),to.geo.centroid=function(n){ya=ma=xa=Ma=_a=ba=wa=Sa=ka=Na=Ea=0,to.geo.stream(n,Aa);var t=ka,e=Na,r=Ea,i=t*t+e*e+r*r;return i=.12&&i<.234&&r>=-.425&&r<-.214?o:i>=.166&&i<.234&&r>=-.214&&r<-.115?a:u).invert(n)},n.stream=function(n){var t=u.stream(n),e=o.stream(n),r=a.stream(n);return{point:function(n,i){t.point(n,i),e.point(n,i),r.point(n,i)},sphere:function(){t.sphere(),e.sphere(),r.sphere()},lineStart:function(){t.lineStart(),e.lineStart(),r.lineStart()},lineEnd:function(){t.lineEnd(),e.lineEnd(),r.lineEnd()},polygonStart:function(){t.polygonStart(),e.polygonStart(),r.polygonStart()},polygonEnd:function(){t.polygonEnd(),e.polygonEnd(),r.polygonEnd()}}},n.precision=function(t){return arguments.length?(u.precision(t),o.precision(t),a.precision(t),n):u.precision()},n.scale=function(t){return arguments.length?(u.scale(t),o.scale(.35*t),a.scale(t),n.translate(u.translate())):u.scale()},n.translate=function(t){if(!arguments.length)return u.translate();var c=u.scale(),f=+t[0],s=+t[1];return e=u.translate(t).clipExtent([[f-.455*c,s-.238*c],[f+.455*c,s+.238*c]]).stream(l).point,r=o.translate([f-.307*c,s+.201*c]).clipExtent([[f-.425*c+Co,s+.12*c+Co],[f-.214*c-Co,s+.234*c-Co]]).stream(l).point,i=a.translate([f-.205*c,s+.212*c]).clipExtent([[f-.214*c+Co,s+.166*c+Co],[f-.115*c-Co,s+.234*c-Co]]).stream(l).point,n},n.scale(1070)};var La,qa,Ta,Ra,Da,Pa,ja={point:_,lineStart:_,lineEnd:_,polygonStart:function(){qa=0,ja.lineStart=$t},polygonEnd:function(){ja.lineStart=ja.lineEnd=ja.point=_,La+=so(qa/2)}},Ua={point:Bt,lineStart:_,lineEnd:_,polygonStart:_,polygonEnd:_},Fa={point:Gt,lineStart:Kt,lineEnd:Qt,polygonStart:function(){Fa.lineStart=ne},polygonEnd:function(){Fa.point=Gt,Fa.lineStart=Kt,Fa.lineEnd=Qt}};to.geo.path=function(){function n(n){return n&&("function"==typeof a&&u.pointRadius(+a.apply(this,arguments)),o&&o.valid||(o=i(u)),to.geo.stream(n,o)),u.result()}function t(){return o=null,n}var e,r,i,u,o,a=4.5;return n.area=function(n){return La=0,to.geo.stream(n,i(ja)),La},n.centroid=function(n){return xa=Ma=_a=ba=wa=Sa=ka=Na=Ea=0,to.geo.stream(n,i(Fa)),Ea?[ka/Ea,Na/Ea]:Sa?[ba/Sa,wa/Sa]:_a?[xa/_a,Ma/_a]:[NaN,NaN]},n.bounds=function(n){return Da=Pa=-(Ta=Ra=1/0),to.geo.stream(n,i(Ua)),[[Ta,Ra],[Da,Pa]]},n.projection=function(n){return arguments.length?(i=(e=n)?n.stream||re(n):m,t()):e},n.context=function(n){return arguments.length?(u=null==(r=n)?new Wt:new te(n),"function"!=typeof a&&u.pointRadius(a),t()):r},n.pointRadius=function(t){return arguments.length?(a="function"==typeof t?t:(u.pointRadius(+t),+t),n):a},n.projection(to.geo.albersUsa()).context(null)},to.geo.transform=function(n){return{stream:function(t){var e=new ie(t);for(var r in n)e[r]=n[r];return e}}},ie.prototype={point:function(n,t){this.stream.point(n,t)},sphere:function(){this.stream.sphere()},lineStart:function(){this.stream.lineStart()},lineEnd:function(){this.stream.lineEnd()},polygonStart:function(){this.stream.polygonStart()},polygonEnd:function(){this.stream.polygonEnd()}},to.geo.projection=oe,to.geo.projectionMutator=ae,(to.geo.equirectangular=function(){return oe(ce)}).raw=ce.invert=ce,to.geo.rotation=function(n){function t(t){return t=n(t[0]*Do,t[1]*Do),t[0]*=Po,t[1]*=Po,t}return n=se(n[0]%360*Do,n[1]*Do,n.length>2?n[2]*Do:0),t.invert=function(t){return t=n.invert(t[0]*Do,t[1]*Do),t[0]*=Po,t[1]*=Po,t},t},fe.invert=ce,to.geo.circle=function(){function n(){var n="function"==typeof r?r.apply(this,arguments):r,t=se(-n[0]*Do,-n[1]*Do,0).invert,i=[];return e(null,null,1,{point:function(n,e){i.push(n=t(n,e)),n[0]*=Po,n[1]*=Po}}),{type:"Polygon",coordinates:[i]}}var t,e,r=[0,0],i=6;return n.origin=function(t){return arguments.length?(r=t,n):r},n.angle=function(r){return arguments.length?(e=de((t=+r)*Do,i*Do),n):t},n.precision=function(r){return arguments.length?(e=de(t*Do,(i=+r)*Do),n):i},n.angle(90)},to.geo.distance=function(n,t){var e,r=(t[0]-n[0])*Do,i=n[1]*Do,u=t[1]*Do,o=Math.sin(r),a=Math.cos(r),l=Math.sin(i),c=Math.cos(i),f=Math.sin(u),s=Math.cos(u);return Math.atan2(Math.sqrt((e=s*o)*e+(e=c*f-l*s*a)*e),l*f+c*s*a)},to.geo.graticule=function(){function n(){return{type:"MultiLineString",coordinates:t()}}function t(){return to.range(Math.ceil(u/v)*v,i,v).map(h).concat(to.range(Math.ceil(c/y)*y,l,y).map(p)).concat(to.range(Math.ceil(r/g)*g,e,g).filter(function(n){return so(n%v)>Co}).map(f)).concat(to.range(Math.ceil(a/d)*d,o,d).filter(function(n){return so(n%y)>Co}).map(s))}var e,r,i,u,o,a,l,c,f,s,h,p,g=10,d=g,v=90,y=360,m=2.5;return n.lines=function(){return t().map(function(n){return{type:"LineString",coordinates:n}})},n.outline=function(){return{type:"Polygon",coordinates:[h(u).concat(p(l).slice(1),h(i).reverse().slice(1),p(c).reverse().slice(1))]}},n.extent=function(t){return arguments.length?n.majorExtent(t).minorExtent(t):n.minorExtent()},n.majorExtent=function(t){return arguments.length?(u=+t[0][0],i=+t[1][0],c=+t[0][1],l=+t[1][1],u>i&&(t=u,u=i,i=t),c>l&&(t=c,c=l,l=t),n.precision(m)):[[u,c],[i,l]]},n.minorExtent=function(t){return arguments.length?(r=+t[0][0],e=+t[1][0],a=+t[0][1],o=+t[1][1],r>e&&(t=r,r=e,e=t),a>o&&(t=a,a=o,o=t),n.precision(m)):[[r,a],[e,o]]},n.step=function(t){return arguments.length?n.majorStep(t).minorStep(t):n.minorStep()},n.majorStep=function(t){return arguments.length?(v=+t[0],y=+t[1],n):[v,y]},n.minorStep=function(t){return arguments.length?(g=+t[0],d=+t[1],n):[g,d]},n.precision=function(t){return arguments.length?(m=+t,f=ye(a,o,90),s=me(r,e,m),h=ye(c,l,90),p=me(u,i,m),n):m},n.majorExtent([[-180,-90+Co],[180,90-Co]]).minorExtent([[-180,-80-Co],[180,80+Co]])},to.geo.greatArc=function(){function n(){return{type:"LineString",coordinates:[t||r.apply(this,arguments),e||i.apply(this,arguments)]}}var t,e,r=xe,i=Me;return n.distance=function(){return to.geo.distance(t||r.apply(this,arguments),e||i.apply(this,arguments))},n.source=function(e){return arguments.length?(r=e,t="function"==typeof e?null:e,n):r},n.target=function(t){return arguments.length?(i=t,e="function"==typeof t?null:t,n):i},n.precision=function(){return arguments.length?n:0},n},to.geo.interpolate=function(n,t){return _e(n[0]*Do,n[1]*Do,t[0]*Do,t[1]*Do)},to.geo.length=function(n){return Ha=0,to.geo.stream(n,Oa),Ha};var Ha,Oa={sphere:_,point:_,lineStart:be,lineEnd:_,polygonStart:_,polygonEnd:_},Ya=we(function(n){return Math.sqrt(2/(1+n))},function(n){return 2*Math.asin(n/2)});(to.geo.azimuthalEqualArea=function(){return oe(Ya)}).raw=Ya;var Ia=we(function(n){var t=Math.acos(n);return t&&t/Math.sin(t)},m);(to.geo.azimuthalEquidistant=function(){return oe(Ia)}).raw=Ia,(to.geo.conicConformal=function(){return Vt(Se)}).raw=Se,(to.geo.conicEquidistant=function(){return Vt(ke)}).raw=ke;var Za=we(function(n){return 1/n},Math.atan);(to.geo.gnomonic=function(){return oe(Za)}).raw=Za,Ne.invert=function(n,t){return[n,2*Math.atan(Math.exp(t))-Ro]},(to.geo.mercator=function(){return Ee(Ne)}).raw=Ne;var Va=we(function(){return 1},Math.asin);(to.geo.orthographic=function(){return oe(Va)}).raw=Va;var Xa=we(function(n){return 1/(1+n)},function(n){return 2*Math.atan(n)});(to.geo.stereographic=function(){return oe(Xa)}).raw=Xa,Ae.invert=function(n,t){return[-t,2*Math.atan(Math.exp(n))-Ro]},(to.geo.transverseMercator=function(){var n=Ee(Ae),t=n.center,e=n.rotate;return n.center=function(n){return n?t([-n[1],n[0]]):(n=t(),[n[1],-n[0]])},n.rotate=function(n){return n?e([n[0],n[1],n.length>2?n[2]+90:90]):(n=e(),[n[0],n[1],n[2]-90])},e([0,0,90])}).raw=Ae,to.geom={},to.geom.hull=function(n){function t(n){if(n.length<3)return[];var t,i=En(e),u=En(r),o=n.length,a=[],l=[];for(t=0;t=0;--t)p.push(n[a[c[t]][2]]);for(t=+s;t=r&&c.x<=u&&c.y>=i&&c.y<=o?[[r,o],[u,o],[u,i],[r,i]]:[]).point=n[a]}),t}function e(n){return n.map(function(n,t){return{x:Math.round(u(n,t)/Co)*Co,y:Math.round(o(n,t)/Co)*Co,i:t}})}var r=Ce,i=ze,u=r,o=i,a=tl;return n?t(n):(t.links=function(n){return ar(e(n)).edges.filter(function(n){return n.l&&n.r}).map(function(t){return{source:n[t.l.i],target:n[t.r.i]}})},t.triangles=function(n){var t=[];return ar(e(n)).cells.forEach(function(e,r){for(var i,u=e.site,o=e.edges.sort(Ve),a=-1,l=o.length,c=o[l-1].edge,f=c.l===u?c.r:c.l;++a=c,h=r>=f,p=h<<1|s;n.leaf=!1,n=n.nodes[p]||(n.nodes[p]={leaf:!0,nodes:[],point:null,x:null,y:null}),s?i=c:a=c,h?o=f:l=f,u(n,t,e,r,i,o,a,l)}var f,s,h,p,g,d,v,y,m,x=En(a),M=En(l);if(null!=t)d=t,v=e,y=r,m=i;else if(y=m=-(d=v=1/0),s=[],h=[],g=n.length,o)for(p=0;py&&(y=f.x),f.y>m&&(m=f.y),s.push(f.x),h.push(f.y);else for(p=0;py&&(y=_),b>m&&(m=b),s.push(_),h.push(b)}var w=y-d,S=m-v;w>S?m=v+w:y=d+S;var k={leaf:!0,nodes:[],point:null,x:null,y:null};if(k.add=function(n){u(k,n,+x(n,++p),+M(n,p),d,v,y,m)},k.visit=function(n){hr(n,k,d,v,y,m)},k.find=function(n){return pr(k,n[0],n[1],d,v,y,m)},p=-1,null==t){for(;++p=0?n.slice(0,t):n,r=t>=0?n.slice(t+1):"in";return e=ul.get(e)||il,r=ol.get(r)||m,Mr(r(e.apply(null,eo.call(arguments,1))))},to.interpolateHcl=Tr,to.interpolateHsl=Rr,to.interpolateLab=Dr,to.interpolateRound=Pr,to.transform=function(n){var t=io.createElementNS(to.ns.prefix.svg,"g");return(to.transform=function(n){if(null!=n){t.setAttribute("transform",n);var e=t.transform.baseVal.consolidate()}return new jr(e?e.matrix:al)})(n)},jr.prototype.toString=function(){return"translate("+this.translate+")rotate("+this.rotate+")skewX("+this.skew+")scale("+this.scale+")"};var al={a:1,b:0,c:0,d:1,e:0,f:0};to.interpolateTransform=Xr,to.layout={},to.layout.bundle=function(){return function(n){for(var t=[],e=-1,r=n.length;++e0?i=n:(e.c=null,e.t=NaN,e=null,c.end({type:"end",alpha:i=0})):n>0&&(c.start({type:"start",alpha:i=n}),e=qn(l.tick)),l):i},l.start=function(){function n(n,r){if(!e){for(e=new Array(i),l=0;l=0;)o.push(f=c[l]),f.parent=u,f.depth=u.depth+1;r&&(u.value=0),u.children=c}else r&&(u.value=+r.call(n,u,u.depth)||0),delete u.children;return ui(i,function(n){var e,i;t&&(e=n.children)&&e.sort(t),r&&(i=n.parent)&&(i.value+=n.value)}),a}var t=li,e=oi,r=ai;return n.sort=function(e){return arguments.length?(t=e,n):t},n.children=function(t){return arguments.length?(e=t,n):e},n.value=function(t){return arguments.length?(r=t,n):r},n.revalue=function(t){return r&&(ii(t,function(n){n.children&&(n.value=0)}),ui(t,function(t){var e;t.children||(t.value=+r.call(n,t,t.depth)||0),(e=t.parent)&&(e.value+=t.value)})),t},n},to.layout.partition=function(){function n(t,e,r,i){var u=t.children;if(t.x=e,t.y=t.depth*i,t.dx=r,t.dy=i,u&&(o=u.length)){var o,a,l,c=-1;for(r=t.value?r/t.value:0;++ca&&(a=r),o.push(r)}for(e=0;e0)for(u=-1;++u=f[0]&&a<=f[1]&&((o=l[to.bisect(s,a,1,p)-1]).y+=g,o.push(n[u]));return l}var t=!0,e=Number,r=Mi,i=mi;return n.value=function(t){return arguments.length?(e=t,n):e},n.range=function(t){return arguments.length?(r=En(t),n):r},n.bins=function(t){return arguments.length?(i="number"==typeof t?function(n){return xi(n,t)}:En(t),n):i},n.frequency=function(e){return arguments.length?(t=!!e,n):t},n},to.layout.pack=function(){function n(n,u){var o=e.call(this,n,u),a=o[0],l=i[0],c=i[1],f=null==t?Math.sqrt:"function"==typeof t?t:function(){return t};if(a.x=a.y=0,ui(a,function(n){n.r=+f(n.value)}),ui(a,ki),r){var s=r*(t?1:Math.max(2*a.r/l,2*a.r/c))/2;ui(a,function(n){n.r+=s}),ui(a,ki),ui(a,function(n){n.r-=s})}return Ai(a,l/2,c/2,t?1:1/Math.max(2*a.r/l,2*a.r/c)),o}var t,e=to.layout.hierarchy().sort(_i),r=0,i=[1,1];return n.size=function(t){return arguments.length?(i=t,n):i},n.radius=function(e){return arguments.length?(t=null==e||"function"==typeof e?e:+e,n):t},n.padding=function(t){return arguments.length?(r=+t,n):r},ri(n,e)},to.layout.tree=function(){function n(n,r){var u=M.call(this,n,r),o=t(u[0]);return N=o,e(o,0),i(o),g(o,0),m(o),u}function t(n){var e={t:n,prelim:0,mod:0,shift:0,change:0,msel:0,mser:0};if(n.x=0,n.y=0,w)e.x_size=1,e.y_size=1;else if("object"==typeof S)e.x_size=S[0],e.y_size=S[1];else{var r=S(n);e.x_size=r[0],e.y_size=r[1]}k&&(n.x_size=e.x_size,n.y_size=e.y_size);for(var i=[],u=n.children?n.children.length:0,o=0;oe.lowY&&(e=e.nxt);var p=i+r.prelim-(o+u.prelim);null!=_?p+=_(r.t,u.t)*N.x_size:null!=b&&(p+=r.x_size/2+u.x_size/2+b(r.t,u.t)),p>0?(o+=p,a(n,t,e.index,p)):1===t&&0===o&&0===r.num_children&&u.num_children>1&&p<0&&(o+=p,a(n,t,e.index,p));var g=f(r),d=f(u);g<=d&&null!=(r=c(r))&&(i+=r.mod),g>=d&&null!=(u=l(u))&&(o+=u.mod)}null==r&&null!=u?s(n,t,u,o):null!=r&&null==u&&h(n,t,r,i)}function a(n,t,e,r){n.children[t].mod+=r,n.children[t].msel+=r,n.children[t].mser+=r,d(n,t,e,r)}function l(n){return 0==n.num_children?n.tl:n.children[0]}function c(n){return 0==n.num_children?n.tr:n.children[n.num_children-1]}function f(n){return n.t.y+n.y_size}function s(n,t,e,r){var i=n.children[0].el;i.tl=e;var u=r-e.mod-n.children[0].msel;i.mod+=u,i.prelim-=u,n.children[0].el=n.children[t].el,n.children[0].msel=n.children[t].msel}function h(n,t,e,r){var i=n.children[t].er;i.tr=e;var u=r-e.mod-n.children[t].mser;i.mod+=u,i.prelim-=u,n.children[t].er=n.children[t-1].er,n.children[t].mser=n.children[t-1].mser}function p(n){n.prelim=(n.children[0].prelim+n.children[0].mod-n.children[0].x_size/2+n.children[n.num_children-1].mod+n.children[n.num_children-1].prelim+n.children[n.num_children-1].x_size/2)/2}function g(n,t){t+=n.mod,n.t.x=n.prelim+t,v(n);for(var e=0;e=e.lowY;)e=e.nxt;return{lowY:n,index:t,nxt:e}}function m(n){if(null!=w){for(var t,e=n,r=n,i=n,u=[n];t=u.pop();)(f=t.t).xr.t.x&&(r=t),f.depth>i.t.depth&&(i=t),t.children&&(u=u.concat(t.children));var o=null==_?.5:_(e.t,r.t)/2,a=o-e.t.x,l=w[0]/(r.t.x+o+a),c=w[1]/(i.t.depth>0?i.t.depth:1);for(u=[n];t=u.pop();){var f=t.t;f.x=(f.x+a)*l,f.y=f.depth*c,k&&(f.x_size*=l,f.y_size*=c),t.children&&(u=u.concat(t.children))}}else x(n,-n.t.x)}function x(n,t){n.t.x+=t;for(var e=0;e0;)f.push(o=h[l-1]),f.area+=o.area,"squarify"!==p||(a=r(f,d))<=g?(h.pop(),g=a):(f.area-=f.pop().area,i(f,d,c,!1),d=Math.min(c.dx,c.dy),f.length=f.area=0,g=1/0);f.length&&(i(f,d,c,!0),f.length=f.area=0),u.forEach(t)}}function e(t){var r=t.children;if(r&&r.length){var u,o=s(t),a=r.slice(),l=[];for(n(a,o.dx*o.dy/t.value),l.area=0;u=a.pop();)l.push(u),l.area+=u.area,null!=u.z&&(i(l,u.z?o.dx:o.dy,o,!a.length),l.length=l.area=0);r.forEach(e)}}function r(n,t){for(var e,r=n.area,i=0,u=1/0,o=-1,a=n.length;++oi&&(i=e));return r*=r,t*=t,r?Math.max(t*i*g/r,r/(t*u*g)):1/0}function i(n,t,e,r){var i,u=-1,o=n.length,a=e.x,c=e.y,f=t?l(n.area/t):0;if(t==e.dx){for((r||f>e.dy)&&(f=e.dy);++ue.dx)&&(f=e.dx);++u1);return n+t*e*Math.sqrt(-2*Math.log(i)/i)}},logNormal:function(){var n=to.random.normal.apply(to,arguments);return function(){return Math.exp(n())}},bates:function(n){var t=to.random.irwinHall(n);return function(){return t()/n}},irwinHall:function(n){return function(){for(var t=0,e=0;es?0:1;if(c=To)return t(c,p)+(n?t(n,1-p):"")+"Z";var g,d,v,y,m,x,M,_,b,w,S,k,N=0,E=0,A=[];if((y=(+l.apply(this,arguments)||0)/2)&&(v=u===bl?Math.sqrt(n*n+c*c):+u.apply(this,arguments),p||(E*=-1),c&&(E=tn(v/c*Math.sin(y))),n&&(N=tn(v/n*Math.sin(y)))),c){m=c*Math.cos(f+E),x=c*Math.sin(f+E),M=c*Math.cos(s-E),_=c*Math.sin(s-E);var C=Math.abs(s-f-2*E)<=Lo?0:1;if(E&&su(m,x,M,_)===p^C){var z=(f+s)/2;m=c*Math.cos(z),x=c*Math.sin(z),M=_=null}}else m=x=0;if(n){b=n*Math.cos(s-N),w=n*Math.sin(s-N),S=n*Math.cos(f+N),k=n*Math.sin(f+N);var L=Math.abs(f-s+2*N)<=Lo?0:1;if(N&&su(b,w,S,k)===1-p^L){var q=(f+s)/2;b=n*Math.cos(q),w=n*Math.sin(q),S=k=null}}else b=w=0;if(h>Co&&(g=Math.min(Math.abs(c-n)/2,+i.apply(this,arguments)))>.001){d=nLo)+",1 "+t}function i(n,t,e,r){return"Q 0,0 "+r}var u=xe,o=Me,a=Pu,l=lu,c=cu;return n.radius=function(t){return arguments.length?(a=En(t),n):a},n.source=function(t){return arguments.length?(u=En(t),n):u},n.target=function(t){return arguments.length?(o=En(t),n):o},n.startAngle=function(t){return arguments.length?(l=En(t),n):l},n.endAngle=function(t){return arguments.length?(c=En(t),n):c},n},to.svg.diagonal=function(){function n(n,i){var u=t.call(this,n,i),o=e.call(this,n,i),a=(u.y+o.y)/2,l=[u,{x:u.x,y:a},{x:o.x,y:a},o];return"M"+(l=l.map(r))[0]+"C"+l[1]+" "+l[2]+" "+l[3]}var t=xe,e=Me,r=ju;return n.source=function(e){return arguments.length?(t=En(e),n):t},n.target=function(t){return arguments.length?(e=En(t),n):e},n.projection=function(t){return arguments.length?(r=t,n):r},n},to.svg.diagonal.radial=function(){var n=to.svg.diagonal(),t=ju,e=n.projection;return n.projection=function(n){return arguments.length?e(Uu(t=n)):t},n},to.svg.symbol=function(){function n(n,r){return(El.get(t.call(this,n,r))||Ou)(e.call(this,n,r))}var t=Hu,e=Fu;return n.type=function(e){return arguments.length?(t=En(e),n):t},n.size=function(t){return arguments.length?(e=En(t),n):e},n};var El=to.map({circle:Ou,cross:function(n){var t=Math.sqrt(n/5)/2;return"M"+-3*t+","+-t+"H"+-t+"V"+-3*t+"H"+t+"V"+-t+"H"+3*t+"V"+t+"H"+t+"V"+3*t+"H"+-t+"V"+t+"H"+-3*t+"Z"},diamond:function(n){var t=Math.sqrt(n/(2*Cl)),e=t*Cl;return"M0,"+-t+"L"+e+",0 0,"+t+" "+-e+",0Z"},square:function(n){var t=Math.sqrt(n)/2;return"M"+-t+","+-t+"L"+t+","+-t+" "+t+","+t+" "+-t+","+t+"Z"},"triangle-down":function(n){var t=Math.sqrt(n/Al),e=t*Al/2;return"M0,"+e+"L"+t+","+-e+" "+-t+","+-e+"Z"},"triangle-up":function(n){var t=Math.sqrt(n/Al),e=t*Al/2;return"M0,"+-e+"L"+t+","+e+" "+-t+","+e+"Z"}});to.svg.symbolTypes=El.keys();var Al=Math.sqrt(3),Cl=Math.tan(30*Do);_o.transition=function(n){for(var t,e,r=zl||++Rl,i=Xu(n),u=[],o=Ll||{time:Date.now(),ease:kr,delay:0,duration:250},a=-1,l=this.length;++arect,.s>rect").attr("width",s[1]-s[0])}function i(n){n.select(".extent").attr("y",h[0]),n.selectAll(".extent,.e>rect,.w>rect").attr("height",h[1]-h[0])}function u(){function u(){32==to.event.keyCode&&(C||(x=null,L[0]-=s[1],L[1]-=h[1],C=2),S())}function d(){32==to.event.keyCode&&2==C&&(L[0]+=s[1],L[1]+=h[1],C=0,S())}function v(){var n=to.mouse(_),t=!1;M&&(n[0]+=M[0],n[1]+=M[1]),C||(to.event.altKey?(x||(x=[(s[0]+s[1])/2,(h[0]+h[1])/2]),L[0]=s[+(n[0]1)for(var r=1;r1&&void 0!==arguments[1]?arguments[1]:{};return u.default.wrap(function(i){for(;;)switch(i.prev=i.next){case 0:if(t={onlyLeaves:!1,circularReference:"leaf",search:"dfsPreOrder",iterateOverObject:!0,skipIteration:function(){return!1}},void 0!==o.onlyLeaves&&(t.onlyLeaves=o.onlyLeaves),void 0!==o.circularReference&&(t.circularReference=o.circularReference),void 0!==o.iterateOverObject&&(t.iterateOverObject=o.iterateOverObject),void 0!==o.skipIteration&&(t.skipIteration=o.skipIteration),void 0===o.search){i.next=9;break}if(o.search in s){i.next=8;break}throw new Error("The search algorithm "+o.search+" is incorrect.");case 8:t.search=o.search;case 9:return r=new l.default(e,t),n=(0,d.default)(t.circularReference),i.delegateYield(s[t.search](r,t.onlyLeaves,n),"t0",12);case 12:case"end":return i.stop()}},_[0],this)}Object.defineProperty(r,"__esModule",{value:!0});var a=e("babel-runtime/regenerator"),u=o(a);r.default=i;var c=e("./search"),s=n(c),f=e("./root-node"),l=o(f),p=e("./seen"),d=o(p),_=[i].map(u.default.mark)},{"./root-node":5,"./search":6,"./seen":7,"babel-runtime/regenerator":115}],3:[function(e,t,r){"use strict";function n(e){return e&&e.__esModule?e:{default:e}}function o(e){var t;return l.default.wrap(function(r){for(;;)switch(r.prev=r.next){case 0:r.t0=l.default.keys(e);case 1:if((r.t1=r.t0()).done){r.next=7;break}return t=r.t1.value,r.next=5,[t,e[t]];case 5:r.next=1;break;case 7:case"end":return r.stop()}},p[0],this)}function i(e){var t;return l.default.wrap(function(r){for(;;)switch(r.prev=r.next){case 0:t=0;case 1:if(!(tf;)if(u=c[f++],u!=u)return!0}else for(;s>f;f++)if((e||f in c)&&c[f]===r)return e||f||0;return!e&&-1}}},{"./_to-index":88,"./_to-iobject":90,"./_to-length":91}],39:[function(e,t,r){var n=e("./_cof"),o=e("./_wks")("toStringTag"),i="Arguments"==n(function(){return arguments}()),a=function(e,t){try{return e[t]}catch(e){}};t.exports=function(e){var t,r,u;return void 0===e?"Undefined":null===e?"Null":"string"==typeof(r=a(t=Object(e),o))?r:i?n(t):"Object"==(u=n(t))&&"function"==typeof t.callee?"Arguments":u}},{"./_cof":40,"./_wks":97}],40:[function(e,t,r){var n={}.toString;t.exports=function(e){return n.call(e).slice(8,-1)}},{}],41:[function(e,t,r){var n=t.exports={version:"2.4.0"};"number"==typeof __e&&(__e=n)},{}],42:[function(e,t,r){"use strict";var n=e("./_object-dp"),o=e("./_property-desc");t.exports=function(e,t,r){t in e?n.f(e,t,o(0,r)):e[t]=r}},{"./_object-dp":70,"./_property-desc":81}],43:[function(e,t,r){var n=e("./_a-function");t.exports=function(e,t,r){if(n(e),void 0===t)return e;switch(r){case 1:return function(r){return e.call(t,r)};case 2:return function(r,n){return e.call(t,r,n)};case 3:return function(r,n,o){return e.call(t,r,n,o)}}return function(){return e.apply(t,arguments)}}},{"./_a-function":35}],44:[function(e,t,r){t.exports=function(e){if(void 0==e)throw TypeError("Can't call method on "+e);return e}},{}],45:[function(e,t,r){t.exports=!e("./_fails")(function(){return 7!=Object.defineProperty({},"a",{get:function(){return 7}}).a})},{"./_fails":50}],46:[function(e,t,r){var n=e("./_is-object"),o=e("./_global").document,i=n(o)&&n(o.createElement);t.exports=function(e){return i?o.createElement(e):{}}},{"./_global":51,"./_is-object":59}],47:[function(e,t,r){t.exports="constructor,hasOwnProperty,isPrototypeOf,propertyIsEnumerable,toLocaleString,toString,valueOf".split(",")},{}],48:[function(e,t,r){var n=e("./_object-keys"),o=e("./_object-gops"),i=e("./_object-pie");t.exports=function(e){var t=n(e),r=o.f;if(r)for(var a,u=r(e),c=i.f,s=0;u.length>s;)c.call(e,a=u[s++])&&t.push(a);return t}},{"./_object-gops":75,"./_object-keys":78,"./_object-pie":79}],49:[function(e,t,r){var n=e("./_global"),o=e("./_core"),i=e("./_ctx"),a=e("./_hide"),u="prototype",c=function(e,t,r){var s,f,l,p=e&c.F,d=e&c.G,_=e&c.S,b=e&c.P,h=e&c.B,y=e&c.W,v=d?o:o[t]||(o[t]={}),m=v[u],g=d?n:_?n[t]:(n[t]||{})[u];d&&(r=t);for(s in r)f=!p&&g&&void 0!==g[s],f&&s in v||(l=f?g[s]:r[s],v[s]=d&&"function"!=typeof g[s]?r[s]:h&&f?i(l,n):y&&g[s]==l?function(e){var t=function(t,r,n){if(this instanceof e){switch(arguments.length){case 0:return new e;case 1:return new e(t);case 2:return new e(t,r)}return new e(t,r,n)}return e.apply(this,arguments)};return t[u]=e[u],t}(l):b&&"function"==typeof l?i(Function.call,l):l,b&&((v.virtual||(v.virtual={}))[s]=l,e&c.R&&m&&!m[s]&&a(m,s,l)))};c.F=1,c.G=2,c.S=4,c.P=8,c.B=16,c.W=32,c.U=64,c.R=128,t.exports=c},{"./_core":41,"./_ctx":43,"./_global":51,"./_hide":53}],50:[function(e,t,r){t.exports=function(e){try{return!!e()}catch(e){return!0}}},{}],51:[function(e,t,r){var n=t.exports="undefined"!=typeof window&&window.Math==Math?window:"undefined"!=typeof self&&self.Math==Math?self:Function("return this")();"number"==typeof __g&&(__g=n)},{}],52:[function(e,t,r){var n={}.hasOwnProperty;t.exports=function(e,t){return n.call(e,t)}},{}],53:[function(e,t,r){var n=e("./_object-dp"),o=e("./_property-desc");t.exports=e("./_descriptors")?function(e,t,r){return n.f(e,t,o(1,r))}:function(e,t,r){return e[t]=r,e}},{"./_descriptors":45,"./_object-dp":70,"./_property-desc":81}],54:[function(e,t,r){t.exports=e("./_global").document&&document.documentElement},{"./_global":51}],55:[function(e,t,r){t.exports=!e("./_descriptors")&&!e("./_fails")(function(){return 7!=Object.defineProperty(e("./_dom-create")("div"),"a",{get:function(){return 7}}).a})},{"./_descriptors":45,"./_dom-create":46,"./_fails":50}],56:[function(e,t,r){var n=e("./_cof");t.exports=Object("z").propertyIsEnumerable(0)?Object:function(e){return"String"==n(e)?e.split(""):Object(e)}},{"./_cof":40}],57:[function(e,t,r){var n=e("./_iterators"),o=e("./_wks")("iterator"),i=Array.prototype;t.exports=function(e){return void 0!==e&&(n.Array===e||i[o]===e)}},{"./_iterators":65,"./_wks":97}],58:[function(e,t,r){var n=e("./_cof");t.exports=Array.isArray||function(e){return"Array"==n(e)}},{"./_cof":40}],59:[function(e,t,r){t.exports=function(e){return"object"==typeof e?null!==e:"function"==typeof e}},{}],60:[function(e,t,r){var n=e("./_an-object");t.exports=function(e,t,r,o){try{return o?t(n(r)[0],r[1]):t(r)}catch(t){var i=e.return;throw void 0!==i&&n(i.call(e)),t}}},{"./_an-object":37}],61:[function(e,t,r){"use strict";var n=e("./_object-create"),o=e("./_property-desc"),i=e("./_set-to-string-tag"),a={};e("./_hide")(a,e("./_wks")("iterator"),function(){return this}),t.exports=function(e,t,r){e.prototype=n(a,{next:o(1,r)}),i(e,t+" Iterator")}},{"./_hide":53,"./_object-create":69,"./_property-desc":81,"./_set-to-string-tag":84,"./_wks":97}],62:[function(e,t,r){"use strict";var n=e("./_library"),o=e("./_export"),i=e("./_redefine"),a=e("./_hide"),u=e("./_has"),c=e("./_iterators"),s=e("./_iter-create"),f=e("./_set-to-string-tag"),l=e("./_object-gpo"),p=e("./_wks")("iterator"),d=!([].keys&&"next"in[].keys()),_="@@iterator",b="keys",h="values",y=function(){return this};t.exports=function(e,t,r,v,m,g,j){s(r,t,v);var w,x,k,O=function(e){if(!d&&e in M)return M[e];switch(e){case b:return function(){return new r(this,e)};case h:return function(){return new r(this,e)}}return function(){return new r(this,e)}},E=t+" Iterator",S=m==h,L=!1,M=e.prototype,A=M[p]||M[_]||m&&M[m],P=A||O(m),T=m?S?O("entries"):P:void 0,F="Array"==t?M.entries||A:A;if(F&&(k=l(F.call(new e)),k!==Object.prototype&&(f(k,E,!0),n||u(k,p)||a(k,p,y))),S&&A&&A.name!==h&&(L=!0,P=function(){return A.call(this)}),n&&!j||!d&&!L&&M[p]||a(M,p,P),c[t]=P,c[E]=y,m)if(w={values:S?P:O(h),keys:g?P:O(b),entries:T},j)for(x in w)x in M||i(M,x,w[x]);else o(o.P+o.F*(d||L),t,w);return w}},{"./_export":49,"./_has":52,"./_hide":53,"./_iter-create":61,"./_iterators":65,"./_library":67,"./_object-gpo":76,"./_redefine":82,"./_set-to-string-tag":84,"./_wks":97}],63:[function(e,t,r){var n=e("./_wks")("iterator"),o=!1;try{var i=[7][n]();i.return=function(){o=!0},Array.from(i,function(){throw 2})}catch(e){}t.exports=function(e,t){if(!t&&!o)return!1;var r=!1;try{var i=[7],a=i[n]();a.next=function(){return{done:r=!0}},i[n]=function(){return a},e(i)}catch(e){}return r}},{"./_wks":97}],64:[function(e,t,r){t.exports=function(e,t){return{value:t,done:!!e}}},{}],65:[function(e,t,r){t.exports={}},{}],66:[function(e,t,r){var n=e("./_object-keys"),o=e("./_to-iobject");t.exports=function(e,t){for(var r,i=o(e),a=n(i),u=a.length,c=0;u>c;)if(i[r=a[c++]]===t)return r}},{"./_object-keys":78,"./_to-iobject":90}],67:[function(e,t,r){t.exports=!0},{}],68:[function(e,t,r){var n=e("./_uid")("meta"),o=e("./_is-object"),i=e("./_has"),a=e("./_object-dp").f,u=0,c=Object.isExtensible||function(){return!0},s=!e("./_fails")(function(){return c(Object.preventExtensions({}))}),f=function(e){a(e,n,{value:{i:"O"+ ++u,w:{}}})},l=function(e,t){if(!o(e))return"symbol"==typeof e?e:("string"==typeof e?"S":"P")+e;if(!i(e,n)){if(!c(e))return"F";if(!t)return"E";f(e)}return e[n].i},p=function(e,t){if(!i(e,n)){if(!c(e))return!0;if(!t)return!1;f(e)}return e[n].w},d=function(e){return s&&_.NEED&&c(e)&&!i(e,n)&&f(e),e},_=t.exports={KEY:n,NEED:!1,fastKey:l,getWeak:p,onFreeze:d}},{"./_fails":50,"./_has":52,"./_is-object":59,"./_object-dp":70,"./_uid":94}],69:[function(e,t,r){var n=e("./_an-object"),o=e("./_object-dps"),i=e("./_enum-bug-keys"),a=e("./_shared-key")("IE_PROTO"),u=function(){},c="prototype",s=function(){var t,r=e("./_dom-create")("iframe"),n=i.length,o="<",a=">";for(r.style.display="none",e("./_html").appendChild(r),r.src="javascript:",t=r.contentWindow.document,t.open(),t.write(o+"script"+a+"document.F=Object"+o+"/script"+a),t.close(),s=t.F;n--;)delete s[c][i[n]];return s()};t.exports=Object.create||function(e,t){var r;return null!==e?(u[c]=n(e),r=new u,u[c]=null,r[a]=e):r=s(),void 0===t?r:o(r,t)}},{"./_an-object":37,"./_dom-create":46,"./_enum-bug-keys":47,"./_html":54,"./_object-dps":71,"./_shared-key":85}],70:[function(e,t,r){var n=e("./_an-object"),o=e("./_ie8-dom-define"),i=e("./_to-primitive"),a=Object.defineProperty;r.f=e("./_descriptors")?Object.defineProperty:function(e,t,r){if(n(e),t=i(t,!0),n(r),o)try{return a(e,t,r)}catch(e){}if("get"in r||"set"in r)throw TypeError("Accessors not supported!");return"value"in r&&(e[t]=r.value),e}},{"./_an-object":37,"./_descriptors":45,"./_ie8-dom-define":55,"./_to-primitive":93}],71:[function(e,t,r){var n=e("./_object-dp"),o=e("./_an-object"),i=e("./_object-keys");t.exports=e("./_descriptors")?Object.defineProperties:function(e,t){o(e);for(var r,a=i(t),u=a.length,c=0;u>c;)n.f(e,r=a[c++],t[r]);return e}},{"./_an-object":37,"./_descriptors":45,"./_object-dp":70,"./_object-keys":78}],72:[function(e,t,r){ +var n=e("./_object-pie"),o=e("./_property-desc"),i=e("./_to-iobject"),a=e("./_to-primitive"),u=e("./_has"),c=e("./_ie8-dom-define"),s=Object.getOwnPropertyDescriptor;r.f=e("./_descriptors")?s:function(e,t){if(e=i(e),t=a(t,!0),c)try{return s(e,t)}catch(e){}if(u(e,t))return o(!n.f.call(e,t),e[t])}},{"./_descriptors":45,"./_has":52,"./_ie8-dom-define":55,"./_object-pie":79,"./_property-desc":81,"./_to-iobject":90,"./_to-primitive":93}],73:[function(e,t,r){var n=e("./_to-iobject"),o=e("./_object-gopn").f,i={}.toString,a="object"==typeof window&&window&&Object.getOwnPropertyNames?Object.getOwnPropertyNames(window):[],u=function(e){try{return o(e)}catch(e){return a.slice()}};t.exports.f=function(e){return a&&"[object Window]"==i.call(e)?u(e):o(n(e))}},{"./_object-gopn":74,"./_to-iobject":90}],74:[function(e,t,r){var n=e("./_object-keys-internal"),o=e("./_enum-bug-keys").concat("length","prototype");r.f=Object.getOwnPropertyNames||function(e){return n(e,o)}},{"./_enum-bug-keys":47,"./_object-keys-internal":77}],75:[function(e,t,r){r.f=Object.getOwnPropertySymbols},{}],76:[function(e,t,r){var n=e("./_has"),o=e("./_to-object"),i=e("./_shared-key")("IE_PROTO"),a=Object.prototype;t.exports=Object.getPrototypeOf||function(e){return e=o(e),n(e,i)?e[i]:"function"==typeof e.constructor&&e instanceof e.constructor?e.constructor.prototype:e instanceof Object?a:null}},{"./_has":52,"./_shared-key":85,"./_to-object":92}],77:[function(e,t,r){var n=e("./_has"),o=e("./_to-iobject"),i=e("./_array-includes")(!1),a=e("./_shared-key")("IE_PROTO");t.exports=function(e,t){var r,u=o(e),c=0,s=[];for(r in u)r!=a&&n(u,r)&&s.push(r);for(;t.length>c;)n(u,r=t[c++])&&(~i(s,r)||s.push(r));return s}},{"./_array-includes":38,"./_has":52,"./_shared-key":85,"./_to-iobject":90}],78:[function(e,t,r){var n=e("./_object-keys-internal"),o=e("./_enum-bug-keys");t.exports=Object.keys||function(e){return n(e,o)}},{"./_enum-bug-keys":47,"./_object-keys-internal":77}],79:[function(e,t,r){r.f={}.propertyIsEnumerable},{}],80:[function(e,t,r){var n=e("./_export"),o=e("./_core"),i=e("./_fails");t.exports=function(e,t){var r=(o.Object||{})[e]||Object[e],a={};a[e]=t(r),n(n.S+n.F*i(function(){r(1)}),"Object",a)}},{"./_core":41,"./_export":49,"./_fails":50}],81:[function(e,t,r){t.exports=function(e,t){return{enumerable:!(1&e),configurable:!(2&e),writable:!(4&e),value:t}}},{}],82:[function(e,t,r){t.exports=e("./_hide")},{"./_hide":53}],83:[function(e,t,r){var n=e("./_is-object"),o=e("./_an-object"),i=function(e,t){if(o(e),!n(t)&&null!==t)throw TypeError(t+": can't set as prototype!")};t.exports={set:Object.setPrototypeOf||("__proto__"in{}?function(t,r,n){try{n=e("./_ctx")(Function.call,e("./_object-gopd").f(Object.prototype,"__proto__").set,2),n(t,[]),r=!(t instanceof Array)}catch(e){r=!0}return function(e,t){return i(e,t),r?e.__proto__=t:n(e,t),e}}({},!1):void 0),check:i}},{"./_an-object":37,"./_ctx":43,"./_is-object":59,"./_object-gopd":72}],84:[function(e,t,r){var n=e("./_object-dp").f,o=e("./_has"),i=e("./_wks")("toStringTag");t.exports=function(e,t,r){e&&!o(e=r?e:e.prototype,i)&&n(e,i,{configurable:!0,value:t})}},{"./_has":52,"./_object-dp":70,"./_wks":97}],85:[function(e,t,r){var n=e("./_shared")("keys"),o=e("./_uid");t.exports=function(e){return n[e]||(n[e]=o(e))}},{"./_shared":86,"./_uid":94}],86:[function(e,t,r){var n=e("./_global"),o="__core-js_shared__",i=n[o]||(n[o]={});t.exports=function(e){return i[e]||(i[e]={})}},{"./_global":51}],87:[function(e,t,r){var n=e("./_to-integer"),o=e("./_defined");t.exports=function(e){return function(t,r){var i,a,u=String(o(t)),c=n(r),s=u.length;return c<0||c>=s?e?"":void 0:(i=u.charCodeAt(c),i<55296||i>56319||c+1===s||(a=u.charCodeAt(c+1))<56320||a>57343?e?u.charAt(c):i:e?u.slice(c,c+2):(i-55296<<10)+(a-56320)+65536)}}},{"./_defined":44,"./_to-integer":89}],88:[function(e,t,r){var n=e("./_to-integer"),o=Math.max,i=Math.min;t.exports=function(e,t){return e=n(e),e<0?o(e+t,0):i(e,t)}},{"./_to-integer":89}],89:[function(e,t,r){var n=Math.ceil,o=Math.floor;t.exports=function(e){return isNaN(e=+e)?0:(e>0?o:n)(e)}},{}],90:[function(e,t,r){var n=e("./_iobject"),o=e("./_defined");t.exports=function(e){return n(o(e))}},{"./_defined":44,"./_iobject":56}],91:[function(e,t,r){var n=e("./_to-integer"),o=Math.min;t.exports=function(e){return e>0?o(n(e),9007199254740991):0}},{"./_to-integer":89}],92:[function(e,t,r){var n=e("./_defined");t.exports=function(e){return Object(n(e))}},{"./_defined":44}],93:[function(e,t,r){var n=e("./_is-object");t.exports=function(e,t){if(!n(e))return e;var r,o;if(t&&"function"==typeof(r=e.toString)&&!n(o=r.call(e)))return o;if("function"==typeof(r=e.valueOf)&&!n(o=r.call(e)))return o;if(!t&&"function"==typeof(r=e.toString)&&!n(o=r.call(e)))return o;throw TypeError("Can't convert object to primitive value")}},{"./_is-object":59}],94:[function(e,t,r){var n=0,o=Math.random();t.exports=function(e){return"Symbol(".concat(void 0===e?"":e,")_",(++n+o).toString(36))}},{}],95:[function(e,t,r){var n=e("./_global"),o=e("./_core"),i=e("./_library"),a=e("./_wks-ext"),u=e("./_object-dp").f;t.exports=function(e){var t=o.Symbol||(o.Symbol=i?{}:n.Symbol||{});"_"==e.charAt(0)||e in t||u(t,e,{value:a.f(e)})}},{"./_core":41,"./_global":51,"./_library":67,"./_object-dp":70,"./_wks-ext":96}],96:[function(e,t,r){r.f=e("./_wks")},{"./_wks":97}],97:[function(e,t,r){var n=e("./_shared")("wks"),o=e("./_uid"),i=e("./_global").Symbol,a="function"==typeof i,u=t.exports=function(e){return n[e]||(n[e]=a&&i[e]||(a?i:o)("Symbol."+e))};u.store=n},{"./_global":51,"./_shared":86,"./_uid":94}],98:[function(e,t,r){var n=e("./_classof"),o=e("./_wks")("iterator"),i=e("./_iterators");t.exports=e("./_core").getIteratorMethod=function(e){if(void 0!=e)return e[o]||e["@@iterator"]||i[n(e)]}},{"./_classof":39,"./_core":41,"./_iterators":65,"./_wks":97}],99:[function(e,t,r){var n=e("./_an-object"),o=e("./core.get-iterator-method");t.exports=e("./_core").getIterator=function(e){var t=o(e);if("function"!=typeof t)throw TypeError(e+" is not iterable!");return n(t.call(e))}},{"./_an-object":37,"./_core":41,"./core.get-iterator-method":98}],100:[function(e,t,r){var n=e("./_classof"),o=e("./_wks")("iterator"),i=e("./_iterators");t.exports=e("./_core").isIterable=function(e){var t=Object(e);return void 0!==t[o]||"@@iterator"in t||i.hasOwnProperty(n(t))}},{"./_classof":39,"./_core":41,"./_iterators":65,"./_wks":97}],101:[function(e,t,r){"use strict";var n=e("./_ctx"),o=e("./_export"),i=e("./_to-object"),a=e("./_iter-call"),u=e("./_is-array-iter"),c=e("./_to-length"),s=e("./_create-property"),f=e("./core.get-iterator-method");o(o.S+o.F*!e("./_iter-detect")(function(e){Array.from(e)}),"Array",{from:function(e){var t,r,o,l,p=i(e),d="function"==typeof this?this:Array,_=arguments.length,b=_>1?arguments[1]:void 0,h=void 0!==b,y=0,v=f(p);if(h&&(b=n(b,_>2?arguments[2]:void 0,2)),void 0==v||d==Array&&u(v))for(t=c(p.length),r=new d(t);t>y;y++)s(r,y,h?b(p[y],y):p[y]);else for(l=v.call(p),r=new d;!(o=l.next()).done;y++)s(r,y,h?a(l,b,[o.value,y],!0):o.value);return r.length=y,r}})},{"./_create-property":42,"./_ctx":43,"./_export":49,"./_is-array-iter":57,"./_iter-call":60,"./_iter-detect":63,"./_to-length":91,"./_to-object":92,"./core.get-iterator-method":98}],102:[function(e,t,r){"use strict";var n=e("./_add-to-unscopables"),o=e("./_iter-step"),i=e("./_iterators"),a=e("./_to-iobject");t.exports=e("./_iter-define")(Array,"Array",function(e,t){this._t=a(e),this._i=0,this._k=t},function(){var e=this._t,t=this._k,r=this._i++;return!e||r>=e.length?(this._t=void 0,o(1)):"keys"==t?o(0,r):"values"==t?o(0,e[r]):o(0,[r,e[r]])},"values"),i.Arguments=i.Array,n("keys"),n("values"),n("entries")},{"./_add-to-unscopables":36,"./_iter-define":62,"./_iter-step":64,"./_iterators":65,"./_to-iobject":90}],103:[function(e,t,r){var n=e("./_export");n(n.S,"Object",{create:e("./_object-create")})},{"./_export":49,"./_object-create":69}],104:[function(e,t,r){var n=e("./_export");n(n.S+n.F*!e("./_descriptors"),"Object",{defineProperty:e("./_object-dp").f})},{"./_descriptors":45,"./_export":49,"./_object-dp":70}],105:[function(e,t,r){var n=e("./_to-object"),o=e("./_object-gpo");e("./_object-sap")("getPrototypeOf",function(){return function(e){return o(n(e))}})},{"./_object-gpo":76,"./_object-sap":80,"./_to-object":92}],106:[function(e,t,r){var n=e("./_export");n(n.S,"Object",{setPrototypeOf:e("./_set-proto").set})},{"./_export":49,"./_set-proto":83}],107:[function(e,t,r){},{}],108:[function(e,t,r){"use strict";var n=e("./_string-at")(!0);e("./_iter-define")(String,"String",function(e){this._t=String(e),this._i=0},function(){var e,t=this._t,r=this._i;return r>=t.length?{value:void 0,done:!0}:(e=n(t,r),this._i+=e.length,{value:e,done:!1})})},{"./_iter-define":62,"./_string-at":87}],109:[function(e,t,r){"use strict";var n=e("./_global"),o=e("./_has"),i=e("./_descriptors"),a=e("./_export"),u=e("./_redefine"),c=e("./_meta").KEY,s=e("./_fails"),f=e("./_shared"),l=e("./_set-to-string-tag"),p=e("./_uid"),d=e("./_wks"),_=e("./_wks-ext"),b=e("./_wks-define"),h=e("./_keyof"),y=e("./_enum-keys"),v=e("./_is-array"),m=e("./_an-object"),g=e("./_to-iobject"),j=e("./_to-primitive"),w=e("./_property-desc"),x=e("./_object-create"),k=e("./_object-gopn-ext"),O=e("./_object-gopd"),E=e("./_object-dp"),S=e("./_object-keys"),L=O.f,M=E.f,A=k.f,P=n.Symbol,T=n.JSON,F=T&&T.stringify,I="prototype",C=d("_hidden"),N=d("toPrimitive"),R={}.propertyIsEnumerable,G=f("symbol-registry"),D=f("symbols"),U=f("op-symbols"),Y=Object[I],W="function"==typeof P,B=n.QObject,q=!B||!B[I]||!B[I].findChild,J=i&&s(function(){return 7!=x(M({},"a",{get:function(){return M(this,"a",{value:7}).a}})).a})?function(e,t,r){var n=L(Y,t);n&&delete Y[t],M(e,t,r),n&&e!==Y&&M(Y,t,n)}:M,K=function(e){var t=D[e]=x(P[I]);return t._k=e,t},z=W&&"symbol"==typeof P.iterator?function(e){return"symbol"==typeof e}:function(e){return e instanceof P},Q=function(e,t,r){return e===Y&&Q(U,t,r),m(e),t=j(t,!0),m(r),o(D,t)?(r.enumerable?(o(e,C)&&e[C][t]&&(e[C][t]=!1),r=x(r,{enumerable:w(0,!1)})):(o(e,C)||M(e,C,w(1,{})),e[C][t]=!0),J(e,t,r)):M(e,t,r)},H=function(e,t){m(e);for(var r,n=y(t=g(t)),o=0,i=n.length;i>o;)Q(e,r=n[o++],t[r]);return e},V=function(e,t){return void 0===t?x(e):H(x(e),t)},X=function(e){var t=R.call(this,e=j(e,!0));return!(this===Y&&o(D,e)&&!o(U,e))&&(!(t||!o(this,e)||!o(D,e)||o(this,C)&&this[C][e])||t)},Z=function(e,t){if(e=g(e),t=j(t,!0),e!==Y||!o(D,t)||o(U,t)){var r=L(e,t);return!r||!o(D,t)||o(e,C)&&e[C][t]||(r.enumerable=!0),r}},$=function(e){for(var t,r=A(g(e)),n=[],i=0;r.length>i;)o(D,t=r[i++])||t==C||t==c||n.push(t);return n},ee=function(e){for(var t,r=e===Y,n=A(r?U:g(e)),i=[],a=0;n.length>a;)!o(D,t=n[a++])||r&&!o(Y,t)||i.push(D[t]);return i};W||(P=function(){if(this instanceof P)throw TypeError("Symbol is not a constructor!");var e=p(arguments.length>0?arguments[0]:void 0),t=function(r){this===Y&&t.call(U,r),o(this,C)&&o(this[C],e)&&(this[C][e]=!1),J(this,e,w(1,r))};return i&&q&&J(Y,e,{configurable:!0,set:t}),K(e)},u(P[I],"toString",function(){return this._k}),O.f=Z,E.f=Q,e("./_object-gopn").f=k.f=$,e("./_object-pie").f=X,e("./_object-gops").f=ee,i&&!e("./_library")&&u(Y,"propertyIsEnumerable",X,!0),_.f=function(e){return K(d(e))}),a(a.G+a.W+a.F*!W,{Symbol:P});for(var te="hasInstance,isConcatSpreadable,iterator,match,replace,search,species,split,toPrimitive,toStringTag,unscopables".split(","),re=0;te.length>re;)d(te[re++]);for(var te=S(d.store),re=0;te.length>re;)b(te[re++]);a(a.S+a.F*!W,"Symbol",{for:function(e){return o(G,e+="")?G[e]:G[e]=P(e)},keyFor:function(e){if(z(e))return h(G,e);throw TypeError(e+" is not a symbol!")},useSetter:function(){q=!0},useSimple:function(){q=!1}}),a(a.S+a.F*!W,"Object",{create:V,defineProperty:Q,defineProperties:H,getOwnPropertyDescriptor:Z,getOwnPropertyNames:$,getOwnPropertySymbols:ee}),T&&a(a.S+a.F*(!W||s(function(){var e=P();return"[null]"!=F([e])||"{}"!=F({a:e})||"{}"!=F(Object(e))})),"JSON",{stringify:function(e){if(void 0!==e&&!z(e)){for(var t,r,n=[e],o=1;arguments.length>o;)n.push(arguments[o++]);return t=n[1],"function"==typeof t&&(r=t),!r&&v(t)||(t=function(e,t){if(r&&(t=r.call(this,e,t)),!z(t))return t}),n[1]=t,F.apply(T,n)}}}),P[I][N]||e("./_hide")(P[I],N,P[I].valueOf),l(P,"Symbol"),l(Math,"Math",!0),l(n.JSON,"JSON",!0)},{"./_an-object":37,"./_descriptors":45,"./_enum-keys":48,"./_export":49,"./_fails":50,"./_global":51,"./_has":52,"./_hide":53,"./_is-array":58,"./_keyof":66,"./_library":67,"./_meta":68,"./_object-create":69,"./_object-dp":70,"./_object-gopd":72,"./_object-gopn":74,"./_object-gopn-ext":73,"./_object-gops":75,"./_object-keys":78,"./_object-pie":79,"./_property-desc":81,"./_redefine":82,"./_set-to-string-tag":84,"./_shared":86,"./_to-iobject":90,"./_to-primitive":93,"./_uid":94,"./_wks":97,"./_wks-define":95,"./_wks-ext":96}],110:[function(e,t,r){e("./_wks-define")("asyncIterator")},{"./_wks-define":95}],111:[function(e,t,r){e("./_wks-define")("observable")},{"./_wks-define":95}],112:[function(e,t,r){e("./es6.array.iterator");for(var n=e("./_global"),o=e("./_hide"),i=e("./_iterators"),a=e("./_wks")("toStringTag"),u=["NodeList","DOMTokenList","MediaList","StyleSheetList","CSSRuleList"],c=0;c<5;c++){var s=u[c],f=n[s],l=f&&f.prototype;l&&!l[a]&&o(l,a,s),i[s]=i.Array}},{"./_global":51,"./_hide":53,"./_iterators":65,"./_wks":97,"./es6.array.iterator":102}],113:[function(e,t,r){(function(r){var n="object"==typeof r?r:"object"==typeof window?window:"object"==typeof self?self:this,o=n.regeneratorRuntime&&Object.getOwnPropertyNames(n).indexOf("regeneratorRuntime")>=0,i=o&&n.regeneratorRuntime;if(n.regeneratorRuntime=void 0,t.exports=e("./runtime"),o)n.regeneratorRuntime=i;else try{delete n.regeneratorRuntime}catch(e){n.regeneratorRuntime=void 0}}).call(this,"undefined"!=typeof global?global:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{"./runtime":114}],114:[function(e,t,r){(function(e,r){!function(r){"use strict";function n(e,t,r,n){var o=t&&t.prototype instanceof i?t:i,a=Object.create(o.prototype),u=new _(n||[]);return a._invoke=f(e,r,u),a}function o(e,t,r){try{return{type:"normal",arg:e.call(t,r)}}catch(e){return{type:"throw",arg:e}}}function i(){}function a(){}function u(){}function c(e){["next","throw","return"].forEach(function(t){e[t]=function(e){return this._invoke(t,e)}})}function s(t){function r(e,n,i,a){var u=o(t[e],t,n);if("throw"!==u.type){var c=u.arg,s=c.value;return s&&"object"==typeof s&&m.call(s,"__await")?Promise.resolve(s.__await).then(function(e){r("next",e,i,a)},function(e){r("throw",e,i,a)}):Promise.resolve(s).then(function(e){c.value=e,i(c)},a)}a(u.arg)}function n(e,t){function n(){return new Promise(function(n,o){r(e,t,n,o)})}return i=i?i.then(n,n):n()}"object"==typeof e&&e.domain&&(r=e.domain.bind(r));var i;this._invoke=n}function f(e,t,r){var n=O;return function(i,a){if(n===S)throw new Error("Generator is already running");if(n===L){if("throw"===i)throw a;return h()}for(r.method=i,r.arg=a;;){var u=r.delegate;if(u){var c=l(u,r);if(c){if(c===M)continue;return c}}if("next"===r.method)r.sent=r._sent=r.arg;else if("throw"===r.method){if(n===O)throw n=L,r.arg;r.dispatchException(r.arg)}else"return"===r.method&&r.abrupt("return",r.arg);n=S;var s=o(e,t,r);if("normal"===s.type){if(n=r.done?L:E,s.arg===M)continue;return{value:s.arg,done:r.done}}"throw"===s.type&&(n=L,r.method="throw",r.arg=s.arg)}}}function l(e,t){var r=e.iterator[t.method];if(r===y){if(t.delegate=null,"throw"===t.method){if(e.iterator.return&&(t.method="return",t.arg=y,l(e,t),"throw"===t.method))return M;t.method="throw",t.arg=new TypeError("The iterator does not provide a 'throw' method")}return M}var n=o(r,e.iterator,t.arg);if("throw"===n.type)return t.method="throw",t.arg=n.arg,t.delegate=null,M;var i=n.arg;return i?i.done?(t[e.resultName]=i.value,t.next=e.nextLoc,"return"!==t.method&&(t.method="next",t.arg=y),t.delegate=null,M):i:(t.method="throw",t.arg=new TypeError("iterator result is not an object"),t.delegate=null,M)}function p(e){var t={tryLoc:e[0]};1 in e&&(t.catchLoc=e[1]),2 in e&&(t.finallyLoc=e[2],t.afterLoc=e[3]),this.tryEntries.push(t)}function d(e){var t=e.completion||{};t.type="normal",delete t.arg,e.completion=t}function _(e){this.tryEntries=[{tryLoc:"root"}],e.forEach(p,this),this.reset(!0)}function b(e){if(e){var t=e[j];if(t)return t.call(e);if("function"==typeof e.next)return e;if(!isNaN(e.length)){var r=-1,n=function t(){for(;++r=0;--n){var o=this.tryEntries[n],i=o.completion;if("root"===o.tryLoc)return t("end");if(o.tryLoc<=this.prev){var a=m.call(o,"catchLoc"),u=m.call(o,"finallyLoc");if(a&&u){if(this.prev=0;--r){var n=this.tryEntries[r];if(n.tryLoc<=this.prev&&m.call(n,"finallyLoc")&&this.prev=0;--t){var r=this.tryEntries[t];if(r.finallyLoc===e)return this.complete(r.completion,r.afterLoc),d(r),M}},catch:function(e){for(var t=this.tryEntries.length-1;t>=0;--t){var r=this.tryEntries[t];if(r.tryLoc===e){var n=r.completion;if("throw"===n.type){var o=n.arg;d(r)}return o}}throw new Error("illegal catch attempt")},delegateYield:function(e,t,r){return this.delegate={iterator:b(e),resultName:t,nextLoc:r},"next"===this.method&&(this.arg=y),M}}}("object"==typeof r?r:"object"==typeof window?window:"object"==typeof self?self:this)}).call(this,e("_process"),"undefined"!=typeof global?global:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{_process:1}],115:[function(e,t,r){t.exports=e("regenerator-runtime")},{"regenerator-runtime":113}]},{},[2])(2)}); diff --git a/documentation/js/libs/es6-shim.min.js b/documentation/js/libs/es6-shim.min.js new file mode 100644 index 00000000..1c2d15c0 --- /dev/null +++ b/documentation/js/libs/es6-shim.min.js @@ -0,0 +1,11 @@ +/*! + * https://github.com/paulmillr/es6-shim + * @license es6-shim Copyright 2013-2016 by Paul Miller (http://paulmillr.com) + * and contributors, MIT License + * es6-shim: v0.35.1 + * see https://github.com/paulmillr/es6-shim/blob/0.35.1/LICENSE + * Details and documentation: + * https://github.com/paulmillr/es6-shim/ + */ +(function(e,t){if(typeof define==="function"&&define.amd){define(t)}else if(typeof exports==="object"){module.exports=t()}else{e.returnExports=t()}})(this,function(){"use strict";var e=Function.call.bind(Function.apply);var t=Function.call.bind(Function.call);var r=Array.isArray;var n=Object.keys;var o=function notThunker(t){return function notThunk(){return!e(t,this,arguments)}};var i=function(e){try{e();return false}catch(t){return true}};var a=function valueOrFalseIfThrows(e){try{return e()}catch(t){return false}};var u=o(i);var f=function(){return!i(function(){Object.defineProperty({},"x",{get:function(){}})})};var s=!!Object.defineProperty&&f();var c=function foo(){}.name==="foo";var l=Function.call.bind(Array.prototype.forEach);var p=Function.call.bind(Array.prototype.reduce);var v=Function.call.bind(Array.prototype.filter);var y=Function.call.bind(Array.prototype.some);var h=function(e,t,r,n){if(!n&&t in e){return}if(s){Object.defineProperty(e,t,{configurable:true,enumerable:false,writable:true,value:r})}else{e[t]=r}};var b=function(e,t,r){l(n(t),function(n){var o=t[n];h(e,n,o,!!r)})};var g=Function.call.bind(Object.prototype.toString);var d=typeof/abc/==="function"?function IsCallableSlow(e){return typeof e==="function"&&g(e)==="[object Function]"}:function IsCallableFast(e){return typeof e==="function"};var O={getter:function(e,t,r){if(!s){throw new TypeError("getters require true ES5 support")}Object.defineProperty(e,t,{configurable:true,enumerable:false,get:r})},proxy:function(e,t,r){if(!s){throw new TypeError("getters require true ES5 support")}var n=Object.getOwnPropertyDescriptor(e,t);Object.defineProperty(r,t,{configurable:n.configurable,enumerable:n.enumerable,get:function getKey(){return e[t]},set:function setKey(r){e[t]=r}})},redefine:function(e,t,r){if(s){var n=Object.getOwnPropertyDescriptor(e,t);n.value=r;Object.defineProperty(e,t,n)}else{e[t]=r}},defineByDescriptor:function(e,t,r){if(s){Object.defineProperty(e,t,r)}else if("value"in r){e[t]=r.value}},preserveToString:function(e,t){if(t&&d(t.toString)){h(e,"toString",t.toString.bind(t),true)}}};var m=Object.create||function(e,t){var r=function Prototype(){};r.prototype=e;var o=new r;if(typeof t!=="undefined"){n(t).forEach(function(e){O.defineByDescriptor(o,e,t[e])})}return o};var w=function(e,t){if(!Object.setPrototypeOf){return false}return a(function(){var r=function Subclass(t){var r=new e(t);Object.setPrototypeOf(r,Subclass.prototype);return r};Object.setPrototypeOf(r,e);r.prototype=m(e.prototype,{constructor:{value:r}});return t(r)})};var j=function(){if(typeof self!=="undefined"){return self}if(typeof window!=="undefined"){return window}if(typeof global!=="undefined"){return global}throw new Error("unable to locate global object")};var S=j();var T=S.isFinite;var I=Function.call.bind(String.prototype.indexOf);var E=Function.apply.bind(Array.prototype.indexOf);var P=Function.call.bind(Array.prototype.concat);var C=Function.call.bind(String.prototype.slice);var M=Function.call.bind(Array.prototype.push);var x=Function.apply.bind(Array.prototype.push);var N=Function.call.bind(Array.prototype.shift);var A=Math.max;var R=Math.min;var _=Math.floor;var k=Math.abs;var F=Math.exp;var L=Math.log;var D=Math.sqrt;var z=Function.call.bind(Object.prototype.hasOwnProperty);var q;var W=function(){};var G=S.Symbol||{};var H=G.species||"@@species";var V=Number.isNaN||function isNaN(e){return e!==e};var B=Number.isFinite||function isFinite(e){return typeof e==="number"&&T(e)};var $=d(Math.sign)?Math.sign:function sign(e){var t=Number(e);if(t===0){return t}if(V(t)){return t}return t<0?-1:1};var U=function isArguments(e){return g(e)==="[object Arguments]"};var J=function isArguments(e){return e!==null&&typeof e==="object"&&typeof e.length==="number"&&e.length>=0&&g(e)!=="[object Array]"&&g(e.callee)==="[object Function]"};var X=U(arguments)?U:J;var K={primitive:function(e){return e===null||typeof e!=="function"&&typeof e!=="object"},string:function(e){return g(e)==="[object String]"},regex:function(e){return g(e)==="[object RegExp]"},symbol:function(e){return typeof S.Symbol==="function"&&typeof e==="symbol"}};var Z=function overrideNative(e,t,r){var n=e[t];h(e,t,r,true);O.preserveToString(e[t],n)};var Y=typeof G==="function"&&typeof G["for"]==="function"&&K.symbol(G());var Q=K.symbol(G.iterator)?G.iterator:"_es6-shim iterator_";if(S.Set&&typeof(new S.Set)["@@iterator"]==="function"){Q="@@iterator"}if(!S.Reflect){h(S,"Reflect",{},true)}var ee=S.Reflect;var te=String;var re={Call:function Call(t,r){var n=arguments.length>2?arguments[2]:[];if(!re.IsCallable(t)){throw new TypeError(t+" is not a function")}return e(t,r,n)},RequireObjectCoercible:function(e,t){if(e==null){throw new TypeError(t||"Cannot call method on "+e)}return e},TypeIsObject:function(e){if(e===void 0||e===null||e===true||e===false){return false}return typeof e==="function"||typeof e==="object"},ToObject:function(e,t){return Object(re.RequireObjectCoercible(e,t))},IsCallable:d,IsConstructor:function(e){return re.IsCallable(e)},ToInt32:function(e){return re.ToNumber(e)>>0},ToUint32:function(e){return re.ToNumber(e)>>>0},ToNumber:function(e){if(g(e)==="[object Symbol]"){throw new TypeError("Cannot convert a Symbol value to a number")}return+e},ToInteger:function(e){var t=re.ToNumber(e);if(V(t)){return 0}if(t===0||!B(t)){return t}return(t>0?1:-1)*_(k(t))},ToLength:function(e){var t=re.ToInteger(e);if(t<=0){return 0}if(t>Number.MAX_SAFE_INTEGER){return Number.MAX_SAFE_INTEGER}return t},SameValue:function(e,t){if(e===t){if(e===0){return 1/e===1/t}return true}return V(e)&&V(t)},SameValueZero:function(e,t){return e===t||V(e)&&V(t)},IsIterable:function(e){return re.TypeIsObject(e)&&(typeof e[Q]!=="undefined"||X(e))},GetIterator:function(e){if(X(e)){return new q(e,"value")}var t=re.GetMethod(e,Q);if(!re.IsCallable(t)){throw new TypeError("value is not an iterable")}var r=re.Call(t,e);if(!re.TypeIsObject(r)){throw new TypeError("bad iterator")}return r},GetMethod:function(e,t){var r=re.ToObject(e)[t];if(r===void 0||r===null){return void 0}if(!re.IsCallable(r)){throw new TypeError("Method not callable: "+t)}return r},IteratorComplete:function(e){return!!e.done},IteratorClose:function(e,t){var r=re.GetMethod(e,"return");if(r===void 0){return}var n,o;try{n=re.Call(r,e)}catch(i){o=i}if(t){return}if(o){throw o}if(!re.TypeIsObject(n)){throw new TypeError("Iterator's return method returned a non-object.")}},IteratorNext:function(e){var t=arguments.length>1?e.next(arguments[1]):e.next();if(!re.TypeIsObject(t)){throw new TypeError("bad iterator")}return t},IteratorStep:function(e){var t=re.IteratorNext(e);var r=re.IteratorComplete(t);return r?false:t},Construct:function(e,t,r,n){var o=typeof r==="undefined"?e:r;if(!n&&ee.construct){return ee.construct(e,t,o)}var i=o.prototype;if(!re.TypeIsObject(i)){i=Object.prototype}var a=m(i);var u=re.Call(e,a,t);return re.TypeIsObject(u)?u:a},SpeciesConstructor:function(e,t){var r=e.constructor;if(r===void 0){return t}if(!re.TypeIsObject(r)){throw new TypeError("Bad constructor")}var n=r[H];if(n===void 0||n===null){return t}if(!re.IsConstructor(n)){throw new TypeError("Bad @@species")}return n},CreateHTML:function(e,t,r,n){var o=re.ToString(e);var i="<"+t;if(r!==""){var a=re.ToString(n);var u=a.replace(/"/g,""");i+=" "+r+'="'+u+'"'}var f=i+">";var s=f+o;return s+""},IsRegExp:function IsRegExp(e){if(!re.TypeIsObject(e)){return false}var t=e[G.match];if(typeof t!=="undefined"){return!!t}return K.regex(e)},ToString:function ToString(e){return te(e)}};if(s&&Y){var ne=function defineWellKnownSymbol(e){if(K.symbol(G[e])){return G[e]}var t=G["for"]("Symbol."+e);Object.defineProperty(G,e,{configurable:false,enumerable:false,writable:false,value:t});return t};if(!K.symbol(G.search)){var oe=ne("search");var ie=String.prototype.search;h(RegExp.prototype,oe,function search(e){return re.Call(ie,e,[this])});var ae=function search(e){var t=re.RequireObjectCoercible(this);if(e!==null&&typeof e!=="undefined"){var r=re.GetMethod(e,oe);if(typeof r!=="undefined"){return re.Call(r,e,[t])}}return re.Call(ie,t,[re.ToString(e)])};Z(String.prototype,"search",ae)}if(!K.symbol(G.replace)){var ue=ne("replace");var fe=String.prototype.replace;h(RegExp.prototype,ue,function replace(e,t){return re.Call(fe,e,[this,t])});var se=function replace(e,t){var r=re.RequireObjectCoercible(this);if(e!==null&&typeof e!=="undefined"){var n=re.GetMethod(e,ue);if(typeof n!=="undefined"){return re.Call(n,e,[r,t])}}return re.Call(fe,r,[re.ToString(e),t])};Z(String.prototype,"replace",se)}if(!K.symbol(G.split)){var ce=ne("split");var le=String.prototype.split;h(RegExp.prototype,ce,function split(e,t){return re.Call(le,e,[this,t])});var pe=function split(e,t){var r=re.RequireObjectCoercible(this);if(e!==null&&typeof e!=="undefined"){var n=re.GetMethod(e,ce);if(typeof n!=="undefined"){return re.Call(n,e,[r,t])}}return re.Call(le,r,[re.ToString(e),t])};Z(String.prototype,"split",pe)}var ve=K.symbol(G.match);var ye=ve&&function(){var e={};e[G.match]=function(){return 42};return"a".match(e)!==42}();if(!ve||ye){var he=ne("match");var be=String.prototype.match;h(RegExp.prototype,he,function match(e){return re.Call(be,e,[this])});var ge=function match(e){var t=re.RequireObjectCoercible(this);if(e!==null&&typeof e!=="undefined"){var r=re.GetMethod(e,he);if(typeof r!=="undefined"){return re.Call(r,e,[t])}}return re.Call(be,t,[re.ToString(e)])};Z(String.prototype,"match",ge)}}var de=function wrapConstructor(e,t,r){O.preserveToString(t,e);if(Object.setPrototypeOf){Object.setPrototypeOf(e,t)}if(s){l(Object.getOwnPropertyNames(e),function(n){if(n in W||r[n]){return}O.proxy(e,n,t)})}else{l(Object.keys(e),function(n){if(n in W||r[n]){return}t[n]=e[n]})}t.prototype=e.prototype;O.redefine(e.prototype,"constructor",t)};var Oe=function(){return this};var me=function(e){if(s&&!z(e,H)){O.getter(e,H,Oe)}};var we=function(e,t){var r=t||function iterator(){return this};h(e,Q,r);if(!e[Q]&&K.symbol(Q)){e[Q]=r}};var je=function createDataProperty(e,t,r){if(s){Object.defineProperty(e,t,{configurable:true,enumerable:true,writable:true,value:r})}else{e[t]=r}};var Se=function createDataPropertyOrThrow(e,t,r){je(e,t,r);if(!re.SameValue(e[t],r)){throw new TypeError("property is nonconfigurable")}};var Te=function(e,t,r,n){if(!re.TypeIsObject(e)){throw new TypeError("Constructor requires `new`: "+t.name)}var o=t.prototype;if(!re.TypeIsObject(o)){o=r}var i=m(o);for(var a in n){if(z(n,a)){var u=n[a];h(i,a,u,true)}}return i};if(String.fromCodePoint&&String.fromCodePoint.length!==1){var Ie=String.fromCodePoint;Z(String,"fromCodePoint",function fromCodePoint(e){return re.Call(Ie,this,arguments)})}var Ee={fromCodePoint:function fromCodePoint(e){var t=[];var r;for(var n=0,o=arguments.length;n1114111){throw new RangeError("Invalid code point "+r)}if(r<65536){M(t,String.fromCharCode(r))}else{r-=65536;M(t,String.fromCharCode((r>>10)+55296));M(t,String.fromCharCode(r%1024+56320))}}return t.join("")},raw:function raw(e){var t=re.ToObject(e,"bad callSite");var r=re.ToObject(t.raw,"bad raw value");var n=r.length;var o=re.ToLength(n);if(o<=0){return""}var i=[];var a=0;var u,f,s,c;while(a=o){break}f=a+1=Ce){throw new RangeError("repeat count must be less than infinity and not overflow maximum string size")}return Pe(t,r)},startsWith:function startsWith(e){var t=re.ToString(re.RequireObjectCoercible(this));if(re.IsRegExp(e)){throw new TypeError('Cannot call method "startsWith" with a regex')}var r=re.ToString(e);var n;if(arguments.length>1){n=arguments[1]}var o=A(re.ToInteger(n),0);return C(t,o,o+r.length)===r},endsWith:function endsWith(e){var t=re.ToString(re.RequireObjectCoercible(this));if(re.IsRegExp(e)){throw new TypeError('Cannot call method "endsWith" with a regex')}var r=re.ToString(e);var n=t.length;var o;if(arguments.length>1){o=arguments[1]}var i=typeof o==="undefined"?n:re.ToInteger(o);var a=R(A(i,0),n);return C(t,a-r.length,a)===r},includes:function includes(e){if(re.IsRegExp(e)){throw new TypeError('"includes" does not accept a RegExp')}var t=re.ToString(e);var r;if(arguments.length>1){r=arguments[1]}return I(this,t,r)!==-1},codePointAt:function codePointAt(e){var t=re.ToString(re.RequireObjectCoercible(this));var r=re.ToInteger(e);var n=t.length;if(r>=0&&r56319||i){return o}var a=t.charCodeAt(r+1);if(a<56320||a>57343){return o}return(o-55296)*1024+(a-56320)+65536}}};if(String.prototype.includes&&"a".includes("a",Infinity)!==false){Z(String.prototype,"includes",Me.includes)}if(String.prototype.startsWith&&String.prototype.endsWith){var xe=i(function(){"/a/".startsWith(/a/)});var Ne=a(function(){return"abc".startsWith("a",Infinity)===false});if(!xe||!Ne){Z(String.prototype,"startsWith",Me.startsWith);Z(String.prototype,"endsWith",Me.endsWith)}}if(Y){var Ae=a(function(){var e=/a/;e[G.match]=false;return"/a/".startsWith(e)});if(!Ae){Z(String.prototype,"startsWith",Me.startsWith)}var Re=a(function(){var e=/a/;e[G.match]=false;return"/a/".endsWith(e)});if(!Re){Z(String.prototype,"endsWith",Me.endsWith)}var _e=a(function(){var e=/a/;e[G.match]=false;return"/a/".includes(e)});if(!_e){Z(String.prototype,"includes",Me.includes)}}b(String.prototype,Me);var ke=[" \n\x0B\f\r \xa0\u1680\u180e\u2000\u2001\u2002\u2003","\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000\u2028","\u2029\ufeff"].join("");var Fe=new RegExp("(^["+ke+"]+)|(["+ke+"]+$)","g");var Le=function trim(){return re.ToString(re.RequireObjectCoercible(this)).replace(Fe,"")};var De=["\x85","\u200b","\ufffe"].join("");var ze=new RegExp("["+De+"]","g");var qe=/^[\-+]0x[0-9a-f]+$/i;var We=De.trim().length!==De.length;h(String.prototype,"trim",Le,We);var Ge=function(e){return{value:e,done:arguments.length===0}};var He=function(e){re.RequireObjectCoercible(e);this._s=re.ToString(e);this._i=0};He.prototype.next=function(){var e=this._s;var t=this._i;if(typeof e==="undefined"||t>=e.length){this._s=void 0;return Ge()}var r=e.charCodeAt(t);var n,o;if(r<55296||r>56319||t+1===e.length){o=1}else{n=e.charCodeAt(t+1);o=n<56320||n>57343?1:2}this._i=t+o;return Ge(e.substr(t,o))};we(He.prototype);we(String.prototype,function(){return new He(this)});var Ve={from:function from(e){var r=this;var n;if(arguments.length>1){n=arguments[1]}var o,i;if(typeof n==="undefined"){o=false}else{if(!re.IsCallable(n)){throw new TypeError("Array.from: when provided, the second argument must be a function")}if(arguments.length>2){i=arguments[2]}o=true}var a=typeof(X(e)||re.GetMethod(e,Q))!=="undefined";var u,f,s;if(a){f=re.IsConstructor(r)?Object(new r):[];var c=re.GetIterator(e);var l,p;s=0;while(true){l=re.IteratorStep(c);if(l===false){break}p=l.value;try{if(o){p=typeof i==="undefined"?n(p,s):t(n,i,p,s)}f[s]=p}catch(v){re.IteratorClose(c,true);throw v}s+=1}u=s}else{var y=re.ToObject(e);u=re.ToLength(y.length);f=re.IsConstructor(r)?Object(new r(u)):new Array(u);var h;for(s=0;s2){f=arguments[2]}var s=typeof f==="undefined"?n:re.ToInteger(f);var c=s<0?A(n+s,0):R(s,n);var l=R(c-u,n-a);var p=1;if(u0){if(u in r){r[a]=r[u]}else{delete r[a]}u+=p;a+=p;l-=1}return r},fill:function fill(e){var t;if(arguments.length>1){t=arguments[1]}var r;if(arguments.length>2){r=arguments[2]}var n=re.ToObject(this);var o=re.ToLength(n.length);t=re.ToInteger(typeof t==="undefined"?0:t);r=re.ToInteger(typeof r==="undefined"?o:r);var i=t<0?A(o+t,0):R(t,o);var a=r<0?o+r:r;for(var u=i;u1?arguments[1]:null;for(var i=0,a;i1?arguments[1]:null;for(var i=0;i1&&typeof arguments[1]!=="undefined"){return re.Call(Ze,this,arguments)}else{return t(Ze,this,e)}})}var Ye=-(Math.pow(2,32)-1);var Qe=function(e,r){var n={length:Ye};n[r?(n.length>>>0)-1:0]=true;return a(function(){t(e,n,function(){throw new RangeError("should not reach here")},[]);return true})};if(!Qe(Array.prototype.forEach)){var et=Array.prototype.forEach;Z(Array.prototype,"forEach",function forEach(e){return re.Call(et,this.length>=0?this:[],arguments)},true)}if(!Qe(Array.prototype.map)){var tt=Array.prototype.map;Z(Array.prototype,"map",function map(e){return re.Call(tt,this.length>=0?this:[],arguments)},true)}if(!Qe(Array.prototype.filter)){var rt=Array.prototype.filter;Z(Array.prototype,"filter",function filter(e){return re.Call(rt,this.length>=0?this:[],arguments)},true)}if(!Qe(Array.prototype.some)){var nt=Array.prototype.some;Z(Array.prototype,"some",function some(e){return re.Call(nt,this.length>=0?this:[],arguments)},true)}if(!Qe(Array.prototype.every)){var ot=Array.prototype.every;Z(Array.prototype,"every",function every(e){return re.Call(ot,this.length>=0?this:[],arguments)},true)}if(!Qe(Array.prototype.reduce)){var it=Array.prototype.reduce;Z(Array.prototype,"reduce",function reduce(e){return re.Call(it,this.length>=0?this:[],arguments)},true)}if(!Qe(Array.prototype.reduceRight,true)){var at=Array.prototype.reduceRight;Z(Array.prototype,"reduceRight",function reduceRight(e){return re.Call(at,this.length>=0?this:[],arguments)},true)}var ut=Number("0o10")!==8;var ft=Number("0b10")!==2;var st=y(De,function(e){return Number(e+0+e)===0});if(ut||ft||st){var ct=Number;var lt=/^0b[01]+$/i;var pt=/^0o[0-7]+$/i;var vt=lt.test.bind(lt);var yt=pt.test.bind(pt);var ht=function(e){var t;if(typeof e.valueOf==="function"){t=e.valueOf();if(K.primitive(t)){return t}}if(typeof e.toString==="function"){t=e.toString();if(K.primitive(t)){return t}}throw new TypeError("No default value")};var bt=ze.test.bind(ze);var gt=qe.test.bind(qe);var dt=function(){var e=function Number(t){var r;if(arguments.length>0){r=K.primitive(t)?t:ht(t,"number")}else{r=0}if(typeof r==="string"){r=re.Call(Le,r);if(vt(r)){r=parseInt(C(r,2),2)}else if(yt(r)){r=parseInt(C(r,2),8)}else if(bt(r)||gt(r)){r=NaN}}var n=this;var o=a(function(){ct.prototype.valueOf.call(n);return true});if(n instanceof e&&!o){return new ct(r)}return ct(r)};return e}();de(ct,dt,{});b(dt,{NaN:ct.NaN,MAX_VALUE:ct.MAX_VALUE,MIN_VALUE:ct.MIN_VALUE,NEGATIVE_INFINITY:ct.NEGATIVE_INFINITY,POSITIVE_INFINITY:ct.POSITIVE_INFINITY});Number=dt;O.redefine(S,"Number",dt)}var Ot=Math.pow(2,53)-1;b(Number,{MAX_SAFE_INTEGER:Ot,MIN_SAFE_INTEGER:-Ot,EPSILON:2.220446049250313e-16,parseInt:S.parseInt,parseFloat:S.parseFloat,isFinite:B,isInteger:function isInteger(e){return B(e)&&re.ToInteger(e)===e},isSafeInteger:function isSafeInteger(e){return Number.isInteger(e)&&k(e)<=Number.MAX_SAFE_INTEGER},isNaN:V});h(Number,"parseInt",S.parseInt,Number.parseInt!==S.parseInt);if(![,1].find(function(e,t){return t===0})){Z(Array.prototype,"find",$e.find)}if([,1].findIndex(function(e,t){return t===0})!==0){Z(Array.prototype,"findIndex",$e.findIndex)}var mt=Function.bind.call(Function.bind,Object.prototype.propertyIsEnumerable);var wt=function ensureEnumerable(e,t){if(s&&mt(e,t)){Object.defineProperty(e,t,{enumerable:false})}};var jt=function sliceArgs(){var e=Number(this);var t=arguments.length;var r=t-e;var n=new Array(r<0?0:r);for(var o=e;o1){return NaN}if(t===-1){return-Infinity}if(t===1){return Infinity}if(t===0){return t}return.5*L((1+t)/(1-t))},cbrt:function cbrt(e){var t=Number(e);if(t===0){return t}var r=t<0;var n;if(r){t=-t}if(t===Infinity){n=Infinity}else{n=F(L(t)/3);n=(t/(n*n)+2*n)/3}return r?-n:n},clz32:function clz32(e){var t=Number(e);var r=re.ToUint32(t);if(r===0){return 32}return Or?re.Call(Or,r):31-_(L(r+.5)*gr)},cosh:function cosh(e){var t=Number(e);if(t===0){return 1}if(V(t)){return NaN}if(!T(t)){return Infinity}if(t<0){t=-t}if(t>21){return F(t)/2}return(F(t)+F(-t))/2},expm1:function expm1(e){var t=Number(e);if(t===-Infinity){return-1}if(!T(t)||t===0){return t}if(k(t)>.5){return F(t)-1}var r=t;var n=0;var o=1;while(n+r!==n){n+=r;o+=1;r*=t/o}return n},hypot:function hypot(e,t){var r=0;var n=0;for(var o=0;o0?i/n*(i/n):i}}return n===Infinity?Infinity:n*D(r)},log2:function log2(e){return L(e)*gr},log10:function log10(e){return L(e)*dr},log1p:function log1p(e){var t=Number(e);if(t<-1||V(t)){return NaN}if(t===0||t===Infinity){return t}if(t===-1){return-Infinity}return 1+t-1===0?t:t*(L(1+t)/(1+t-1))},sign:$,sinh:function sinh(e){var t=Number(e);if(!T(t)||t===0){return t}if(k(t)<1){return(Math.expm1(t)-Math.expm1(-t))/2}return(F(t-1)-F(-t-1))*br/2},tanh:function tanh(e){var t=Number(e);if(V(t)||t===0){return t}if(t>=20){return 1}if(t<=-20){return-1}return(Math.expm1(t)-Math.expm1(-t))/(F(t)+F(-t))},trunc:function trunc(e){var t=Number(e);return t<0?-_(-t):_(t)},imul:function imul(e,t){var r=re.ToUint32(e);var n=re.ToUint32(t);var o=r>>>16&65535;var i=r&65535;var a=n>>>16&65535;var u=n&65535;return i*u+(o*u+i*a<<16>>>0)|0},fround:function fround(e){var t=Number(e);if(t===0||t===Infinity||t===-Infinity||V(t)){return t}var r=$(t);var n=k(t);if(nyr||V(i)){return r*Infinity}return r*i}};b(Math,mr);h(Math,"log1p",mr.log1p,Math.log1p(-1e-17)!==-1e-17);h(Math,"asinh",mr.asinh,Math.asinh(-1e7)!==-Math.asinh(1e7));h(Math,"tanh",mr.tanh,Math.tanh(-2e-17)!==-2e-17);h(Math,"acosh",mr.acosh,Math.acosh(Number.MAX_VALUE)===Infinity);h(Math,"cbrt",mr.cbrt,Math.abs(1-Math.cbrt(1e-300)/1e-100)/Number.EPSILON>8);h(Math,"sinh",mr.sinh,Math.sinh(-2e-17)!==-2e-17);var wr=Math.expm1(10);h(Math,"expm1",mr.expm1,wr>22025.465794806718||wr<22025.465794806718);var jr=Math.round;var Sr=Math.round(.5-Number.EPSILON/4)===0&&Math.round(-.5+Number.EPSILON/3.99)===1;var Tr=lr+1;var Ir=2*lr-1;var Er=[Tr,Ir].every(function(e){return Math.round(e)===e});h(Math,"round",function round(e){var t=_(e);var r=t===-1?-0:t+1;return e-t<.5?t:r},!Sr||!Er);O.preserveToString(Math.round,jr);var Pr=Math.imul;if(Math.imul(4294967295,5)!==-5){Math.imul=mr.imul;O.preserveToString(Math.imul,Pr)}if(Math.imul.length!==2){Z(Math,"imul",function imul(e,t){return re.Call(Pr,Math,arguments); +})}var Cr=function(){var e=S.setTimeout;if(typeof e!=="function"&&typeof e!=="object"){return}re.IsPromise=function(e){if(!re.TypeIsObject(e)){return false}if(typeof e._promise==="undefined"){return false}return true};var r=function(e){if(!re.IsConstructor(e)){throw new TypeError("Bad promise constructor")}var t=this;var r=function(e,r){if(t.resolve!==void 0||t.reject!==void 0){throw new TypeError("Bad Promise implementation!")}t.resolve=e;t.reject=r};t.resolve=void 0;t.reject=void 0;t.promise=new e(r);if(!(re.IsCallable(t.resolve)&&re.IsCallable(t.reject))){throw new TypeError("Bad promise constructor")}};var n;if(typeof window!=="undefined"&&re.IsCallable(window.postMessage)){n=function(){var e=[];var t="zero-timeout-message";var r=function(r){M(e,r);window.postMessage(t,"*")};var n=function(r){if(r.source===window&&r.data===t){r.stopPropagation();if(e.length===0){return}var n=N(e);n()}};window.addEventListener("message",n,true);return r}}var o=function(){var e=S.Promise;var t=e&&e.resolve&&e.resolve();return t&&function(e){return t.then(e)}};var i=re.IsCallable(S.setImmediate)?S.setImmediate:typeof process==="object"&&process.nextTick?process.nextTick:o()||(re.IsCallable(n)?n():function(t){e(t,0)});var a=function(e){return e};var u=function(e){throw e};var f=0;var s=1;var c=2;var l=0;var p=1;var v=2;var y={};var h=function(e,t,r){i(function(){g(e,t,r)})};var g=function(e,t,r){var n,o;if(t===y){return e(r)}try{n=e(r);o=t.resolve}catch(i){n=i;o=t.reject}o(n)};var d=function(e,t){var r=e._promise;var n=r.reactionLength;if(n>0){h(r.fulfillReactionHandler0,r.reactionCapability0,t);r.fulfillReactionHandler0=void 0;r.rejectReactions0=void 0;r.reactionCapability0=void 0;if(n>1){for(var o=1,i=0;o0){h(r.rejectReactionHandler0,r.reactionCapability0,t);r.fulfillReactionHandler0=void 0;r.rejectReactions0=void 0;r.reactionCapability0=void 0;if(n>1){for(var o=1,i=0;o2&&arguments[2]===y;if(b&&o===E){i=y}else{i=new r(o)}var g=re.IsCallable(e)?e:a;var d=re.IsCallable(t)?t:u;var O=n._promise;var m;if(O.state===f){if(O.reactionLength===0){O.fulfillReactionHandler0=g;O.rejectReactionHandler0=d;O.reactionCapability0=i}else{var w=3*(O.reactionLength-1);O[w+l]=g;O[w+p]=d;O[w+v]=i}O.reactionLength+=1}else if(O.state===s){m=O.result;h(g,i,m)}else if(O.state===c){m=O.result;h(d,i,m)}else{throw new TypeError("unexpected Promise state")}return i.promise}});y=new r(E);I=T.then;return E}();if(S.Promise){delete S.Promise.accept;delete S.Promise.defer;delete S.Promise.prototype.chain}if(typeof Cr==="function"){b(S,{Promise:Cr});var Mr=w(S.Promise,function(e){return e.resolve(42).then(function(){})instanceof e});var xr=!i(function(){S.Promise.reject(42).then(null,5).then(null,W)});var Nr=i(function(){S.Promise.call(3,W)});var Ar=function(e){var t=e.resolve(5);t.constructor={};var r=e.resolve(t);try{r.then(null,W).then(null,W)}catch(n){return true}return t===r}(S.Promise);var Rr=s&&function(){var e=0;var t=Object.defineProperty({},"then",{get:function(){e+=1}});Promise.resolve(t);return e===1}();var _r=function BadResolverPromise(e){var t=new Promise(e);e(3,function(){});this.then=t.then;this.constructor=BadResolverPromise};_r.prototype=Promise.prototype;_r.all=Promise.all;var kr=a(function(){return!!_r.all([1,2])});if(!Mr||!xr||!Nr||Ar||!Rr||kr){Promise=Cr;Z(S,"Promise",Cr)}if(Promise.all.length!==1){var Fr=Promise.all;Z(Promise,"all",function all(e){return re.Call(Fr,this,arguments)})}if(Promise.race.length!==1){var Lr=Promise.race;Z(Promise,"race",function race(e){return re.Call(Lr,this,arguments)})}if(Promise.resolve.length!==1){var Dr=Promise.resolve;Z(Promise,"resolve",function resolve(e){return re.Call(Dr,this,arguments)})}if(Promise.reject.length!==1){var zr=Promise.reject;Z(Promise,"reject",function reject(e){return re.Call(zr,this,arguments)})}wt(Promise,"all");wt(Promise,"race");wt(Promise,"resolve");wt(Promise,"reject");me(Promise)}var qr=function(e){var t=n(p(e,function(e,t){e[t]=true;return e},{}));return e.join(":")===t.join(":")};var Wr=qr(["z","a","bb"]);var Gr=qr(["z",1,"a","3",2]);if(s){var Hr=function fastkey(e){if(!Wr){return null}if(typeof e==="undefined"||e===null){return"^"+re.ToString(e)}else if(typeof e==="string"){return"$"+e}else if(typeof e==="number"){if(!Gr){return"n"+e}return e}else if(typeof e==="boolean"){return"b"+e}return null};var Vr=function emptyObject(){return Object.create?Object.create(null):{}};var Br=function addIterableToMap(e,n,o){if(r(o)||K.string(o)){l(o,function(e){if(!re.TypeIsObject(e)){throw new TypeError("Iterator value "+e+" is not an entry object")}n.set(e[0],e[1])})}else if(o instanceof e){t(e.prototype.forEach,o,function(e,t){n.set(t,e)})}else{var i,a;if(o!==null&&typeof o!=="undefined"){a=n.set;if(!re.IsCallable(a)){throw new TypeError("bad map")}i=re.GetIterator(o)}if(typeof i!=="undefined"){while(true){var u=re.IteratorStep(i);if(u===false){break}var f=u.value;try{if(!re.TypeIsObject(f)){throw new TypeError("Iterator value "+f+" is not an entry object")}t(a,n,f[0],f[1])}catch(s){re.IteratorClose(i,true);throw s}}}}};var $r=function addIterableToSet(e,n,o){if(r(o)||K.string(o)){l(o,function(e){n.add(e)})}else if(o instanceof e){t(e.prototype.forEach,o,function(e){n.add(e)})}else{var i,a;if(o!==null&&typeof o!=="undefined"){a=n.add;if(!re.IsCallable(a)){throw new TypeError("bad set")}i=re.GetIterator(o)}if(typeof i!=="undefined"){while(true){var u=re.IteratorStep(i);if(u===false){break}var f=u.value;try{t(a,n,f)}catch(s){re.IteratorClose(i,true);throw s}}}}};var Ur={Map:function(){var e={};var r=function MapEntry(e,t){this.key=e;this.value=t;this.next=null;this.prev=null};r.prototype.isRemoved=function isRemoved(){return this.key===e};var n=function isMap(e){return!!e._es6map};var o=function requireMapSlot(e,t){if(!re.TypeIsObject(e)||!n(e)){throw new TypeError("Method Map.prototype."+t+" called on incompatible receiver "+re.ToString(e))}};var i=function MapIterator(e,t){o(e,"[[MapIterator]]");this.head=e._head;this.i=this.head;this.kind=t};i.prototype={next:function next(){var e=this.i;var t=this.kind;var r=this.head;if(typeof this.i==="undefined"){return Ge()}while(e.isRemoved()&&e!==r){e=e.prev}var n;while(e.next!==r){e=e.next;if(!e.isRemoved()){if(t==="key"){n=e.key}else if(t==="value"){n=e.value}else{n=[e.key,e.value]}this.i=e;return Ge(n)}}this.i=void 0;return Ge()}};we(i.prototype);var a;var u=function Map(){if(!(this instanceof Map)){throw new TypeError('Constructor Map requires "new"')}if(this&&this._es6map){throw new TypeError("Bad construction")}var e=Te(this,Map,a,{_es6map:true,_head:null,_storage:Vr(),_size:0});var t=new r(null,null);t.next=t.prev=t;e._head=t;if(arguments.length>0){Br(Map,e,arguments[0])}return e};a=u.prototype;O.getter(a,"size",function(){if(typeof this._size==="undefined"){throw new TypeError("size method called on incompatible Map")}return this._size});b(a,{get:function get(e){o(this,"get");var t=Hr(e);if(t!==null){var r=this._storage[t];if(r){return r.value}else{return}}var n=this._head;var i=n;while((i=i.next)!==n){if(re.SameValueZero(i.key,e)){return i.value}}},has:function has(e){o(this,"has");var t=Hr(e);if(t!==null){return typeof this._storage[t]!=="undefined"}var r=this._head;var n=r;while((n=n.next)!==r){if(re.SameValueZero(n.key,e)){return true}}return false},set:function set(e,t){o(this,"set");var n=this._head;var i=n;var a;var u=Hr(e);if(u!==null){if(typeof this._storage[u]!=="undefined"){this._storage[u].value=t;return this}else{a=this._storage[u]=new r(e,t);i=n.prev}}while((i=i.next)!==n){if(re.SameValueZero(i.key,e)){i.value=t;return this}}a=a||new r(e,t);if(re.SameValue(-0,e)){a.key=+0}a.next=this._head;a.prev=this._head.prev;a.prev.next=a;a.next.prev=a;this._size+=1;return this},"delete":function(t){o(this,"delete");var r=this._head;var n=r;var i=Hr(t);if(i!==null){if(typeof this._storage[i]==="undefined"){return false}n=this._storage[i].prev;delete this._storage[i]}while((n=n.next)!==r){if(re.SameValueZero(n.key,t)){n.key=n.value=e;n.prev.next=n.next;n.next.prev=n.prev;this._size-=1;return true}}return false},clear:function clear(){o(this,"clear");this._size=0;this._storage=Vr();var t=this._head;var r=t;var n=r.next;while((r=n)!==t){r.key=r.value=e;n=r.next;r.next=r.prev=t}t.next=t.prev=t},keys:function keys(){o(this,"keys");return new i(this,"key")},values:function values(){o(this,"values");return new i(this,"value")},entries:function entries(){o(this,"entries");return new i(this,"key+value")},forEach:function forEach(e){o(this,"forEach");var r=arguments.length>1?arguments[1]:null;var n=this.entries();for(var i=n.next();!i.done;i=n.next()){if(r){t(e,r,i.value[1],i.value[0],this)}else{e(i.value[1],i.value[0],this)}}}});we(a,a.entries);return u}(),Set:function(){var e=function isSet(e){return e._es6set&&typeof e._storage!=="undefined"};var r=function requireSetSlot(t,r){if(!re.TypeIsObject(t)||!e(t)){throw new TypeError("Set.prototype."+r+" called on incompatible receiver "+re.ToString(t))}};var o;var i=function Set(){if(!(this instanceof Set)){throw new TypeError('Constructor Set requires "new"')}if(this&&this._es6set){throw new TypeError("Bad construction")}var e=Te(this,Set,o,{_es6set:true,"[[SetData]]":null,_storage:Vr()});if(!e._es6set){throw new TypeError("bad set")}if(arguments.length>0){$r(Set,e,arguments[0])}return e};o=i.prototype;var a=function(e){var t=e;if(t==="^null"){return null}else if(t==="^undefined"){return void 0}else{var r=t.charAt(0);if(r==="$"){return C(t,1)}else if(r==="n"){return+C(t,1)}else if(r==="b"){return t==="btrue"}}return+t};var u=function ensureMap(e){if(!e["[[SetData]]"]){var t=e["[[SetData]]"]=new Ur.Map;l(n(e._storage),function(e){var r=a(e);t.set(r,r)});e["[[SetData]]"]=t}e._storage=null};O.getter(i.prototype,"size",function(){r(this,"size");if(this._storage){return n(this._storage).length}u(this);return this["[[SetData]]"].size});b(i.prototype,{has:function has(e){r(this,"has");var t;if(this._storage&&(t=Hr(e))!==null){return!!this._storage[t]}u(this);return this["[[SetData]]"].has(e)},add:function add(e){r(this,"add");var t;if(this._storage&&(t=Hr(e))!==null){this._storage[t]=true;return this}u(this);this["[[SetData]]"].set(e,e);return this},"delete":function(e){r(this,"delete");var t;if(this._storage&&(t=Hr(e))!==null){var n=z(this._storage,t);return delete this._storage[t]&&n}u(this);return this["[[SetData]]"]["delete"](e)},clear:function clear(){r(this,"clear");if(this._storage){this._storage=Vr()}if(this["[[SetData]]"]){this["[[SetData]]"].clear()}},values:function values(){r(this,"values");u(this);return this["[[SetData]]"].values()},entries:function entries(){r(this,"entries");u(this);return this["[[SetData]]"].entries()},forEach:function forEach(e){r(this,"forEach");var n=arguments.length>1?arguments[1]:null;var o=this;u(o);this["[[SetData]]"].forEach(function(r,i){if(n){t(e,n,i,i,o)}else{e(i,i,o)}})}});h(i.prototype,"keys",i.prototype.values,true);we(i.prototype,i.prototype.values);return i}()};if(S.Map||S.Set){var Jr=a(function(){return new Map([[1,2]]).get(1)===2});if(!Jr){var Xr=S.Map;S.Map=function Map(){if(!(this instanceof Map)){throw new TypeError('Constructor Map requires "new"')}var e=new Xr;if(arguments.length>0){Br(Map,e,arguments[0])}delete e.constructor;Object.setPrototypeOf(e,S.Map.prototype);return e};S.Map.prototype=m(Xr.prototype);h(S.Map.prototype,"constructor",S.Map,true);O.preserveToString(S.Map,Xr)}var Kr=new Map;var Zr=function(){var e=new Map([[1,0],[2,0],[3,0],[4,0]]);e.set(-0,e);return e.get(0)===e&&e.get(-0)===e&&e.has(0)&&e.has(-0)}();var Yr=Kr.set(1,2)===Kr;if(!Zr||!Yr){var Qr=Map.prototype.set;Z(Map.prototype,"set",function set(e,r){t(Qr,this,e===0?0:e,r);return this})}if(!Zr){var en=Map.prototype.get;var tn=Map.prototype.has;b(Map.prototype,{get:function get(e){return t(en,this,e===0?0:e)},has:function has(e){return t(tn,this,e===0?0:e)}},true);O.preserveToString(Map.prototype.get,en);O.preserveToString(Map.prototype.has,tn)}var rn=new Set;var nn=function(e){e["delete"](0);e.add(-0);return!e.has(0)}(rn);var on=rn.add(1)===rn;if(!nn||!on){var an=Set.prototype.add;Set.prototype.add=function add(e){t(an,this,e===0?0:e);return this};O.preserveToString(Set.prototype.add,an)}if(!nn){var un=Set.prototype.has;Set.prototype.has=function has(e){return t(un,this,e===0?0:e)};O.preserveToString(Set.prototype.has,un);var fn=Set.prototype["delete"];Set.prototype["delete"]=function SetDelete(e){return t(fn,this,e===0?0:e)};O.preserveToString(Set.prototype["delete"],fn)}var sn=w(S.Map,function(e){var t=new e([]);t.set(42,42);return t instanceof e});var cn=Object.setPrototypeOf&&!sn;var ln=function(){try{return!(S.Map()instanceof S.Map)}catch(e){return e instanceof TypeError}}();if(S.Map.length!==0||cn||!ln){var pn=S.Map;S.Map=function Map(){if(!(this instanceof Map)){throw new TypeError('Constructor Map requires "new"')}var e=new pn;if(arguments.length>0){Br(Map,e,arguments[0])}delete e.constructor;Object.setPrototypeOf(e,Map.prototype);return e};S.Map.prototype=pn.prototype;h(S.Map.prototype,"constructor",S.Map,true);O.preserveToString(S.Map,pn)}var vn=w(S.Set,function(e){var t=new e([]);t.add(42,42);return t instanceof e});var yn=Object.setPrototypeOf&&!vn;var hn=function(){try{return!(S.Set()instanceof S.Set)}catch(e){return e instanceof TypeError}}();if(S.Set.length!==0||yn||!hn){var bn=S.Set;S.Set=function Set(){if(!(this instanceof Set)){throw new TypeError('Constructor Set requires "new"')}var e=new bn;if(arguments.length>0){$r(Set,e,arguments[0])}delete e.constructor;Object.setPrototypeOf(e,Set.prototype);return e};S.Set.prototype=bn.prototype;h(S.Set.prototype,"constructor",S.Set,true);O.preserveToString(S.Set,bn)}var gn=new S.Map;var dn=!a(function(){return gn.keys().next().done});if(typeof S.Map.prototype.clear!=="function"||(new S.Set).size!==0||gn.size!==0||typeof S.Map.prototype.keys!=="function"||typeof S.Set.prototype.keys!=="function"||typeof S.Map.prototype.forEach!=="function"||typeof S.Set.prototype.forEach!=="function"||u(S.Map)||u(S.Set)||typeof gn.keys().next!=="function"||dn||!sn){b(S,{Map:Ur.Map,Set:Ur.Set},true)}if(S.Set.prototype.keys!==S.Set.prototype.values){h(S.Set.prototype,"keys",S.Set.prototype.values,true)}we(Object.getPrototypeOf((new S.Map).keys()));we(Object.getPrototypeOf((new S.Set).keys()));if(c&&S.Set.prototype.has.name!=="has"){var On=S.Set.prototype.has;Z(S.Set.prototype,"has",function has(e){return t(On,this,e)})}}b(S,Ur);me(S.Map);me(S.Set)}var mn=function throwUnlessTargetIsObject(e){if(!re.TypeIsObject(e)){throw new TypeError("target must be an object")}};var wn={apply:function apply(){return re.Call(re.Call,null,arguments)},construct:function construct(e,t){if(!re.IsConstructor(e)){throw new TypeError("First argument must be a constructor.")}var r=arguments.length>2?arguments[2]:e;if(!re.IsConstructor(r)){throw new TypeError("new.target must be a constructor.")}return re.Construct(e,t,r,"internal")},deleteProperty:function deleteProperty(e,t){mn(e);if(s){var r=Object.getOwnPropertyDescriptor(e,t);if(r&&!r.configurable){return false}}return delete e[t]},has:function has(e,t){mn(e);return t in e}};if(Object.getOwnPropertyNames){Object.assign(wn,{ownKeys:function ownKeys(e){mn(e);var t=Object.getOwnPropertyNames(e);if(re.IsCallable(Object.getOwnPropertySymbols)){x(t,Object.getOwnPropertySymbols(e))}return t}})}var jn=function ConvertExceptionToBoolean(e){return!i(e)};if(Object.preventExtensions){Object.assign(wn,{isExtensible:function isExtensible(e){mn(e);return Object.isExtensible(e)},preventExtensions:function preventExtensions(e){mn(e);return jn(function(){Object.preventExtensions(e)})}})}if(s){var Sn=function get(e,t,r){var n=Object.getOwnPropertyDescriptor(e,t);if(!n){var o=Object.getPrototypeOf(e);if(o===null){return void 0}return Sn(o,t,r)}if("value"in n){return n.value}if(n.get){return re.Call(n.get,r)}return void 0};var Tn=function set(e,r,n,o){var i=Object.getOwnPropertyDescriptor(e,r);if(!i){var a=Object.getPrototypeOf(e);if(a!==null){return Tn(a,r,n,o)}i={value:void 0,writable:true,enumerable:true,configurable:true}}if("value"in i){if(!i.writable){return false}if(!re.TypeIsObject(o)){return false}var u=Object.getOwnPropertyDescriptor(o,r);if(u){return ee.defineProperty(o,r,{value:n})}else{return ee.defineProperty(o,r,{value:n,writable:true,enumerable:true,configurable:true})}}if(i.set){t(i.set,o,n);return true}return false};Object.assign(wn,{defineProperty:function defineProperty(e,t,r){mn(e);return jn(function(){Object.defineProperty(e,t,r)})},getOwnPropertyDescriptor:function getOwnPropertyDescriptor(e,t){mn(e);return Object.getOwnPropertyDescriptor(e,t)},get:function get(e,t){mn(e);var r=arguments.length>2?arguments[2]:e;return Sn(e,t,r)},set:function set(e,t,r){mn(e);var n=arguments.length>3?arguments[3]:e;return Tn(e,t,r,n)}})}if(Object.getPrototypeOf){var In=Object.getPrototypeOf;wn.getPrototypeOf=function getPrototypeOf(e){mn(e);return In(e)}}if(Object.setPrototypeOf&&wn.getPrototypeOf){var En=function(e,t){var r=t;while(r){if(e===r){return true}r=wn.getPrototypeOf(r)}return false};Object.assign(wn,{setPrototypeOf:function setPrototypeOf(e,t){mn(e);if(t!==null&&!re.TypeIsObject(t)){throw new TypeError("proto must be an object or null")}if(t===ee.getPrototypeOf(e)){return true}if(ee.isExtensible&&!ee.isExtensible(e)){return false}if(En(e,t)){return false}Object.setPrototypeOf(e,t);return true}})}var Pn=function(e,t){if(!re.IsCallable(S.Reflect[e])){h(S.Reflect,e,t)}else{var r=a(function(){S.Reflect[e](1);S.Reflect[e](NaN);S.Reflect[e](true);return true});if(r){Z(S.Reflect,e,t)}}};Object.keys(wn).forEach(function(e){Pn(e,wn[e])});var Cn=S.Reflect.getPrototypeOf;if(c&&Cn&&Cn.name!=="getPrototypeOf"){Z(S.Reflect,"getPrototypeOf",function getPrototypeOf(e){return t(Cn,S.Reflect,e)})}if(S.Reflect.setPrototypeOf){if(a(function(){S.Reflect.setPrototypeOf(1,{});return true})){Z(S.Reflect,"setPrototypeOf",wn.setPrototypeOf)}}if(S.Reflect.defineProperty){if(!a(function(){var e=!S.Reflect.defineProperty(1,"test",{value:1});var t=typeof Object.preventExtensions!=="function"||!S.Reflect.defineProperty(Object.preventExtensions({}),"test",{});return e&&t})){Z(S.Reflect,"defineProperty",wn.defineProperty)}}if(S.Reflect.construct){if(!a(function(){var e=function F(){};return S.Reflect.construct(function(){},[],e)instanceof e})){Z(S.Reflect,"construct",wn.construct)}}if(String(new Date(NaN))!=="Invalid Date"){var Mn=Date.prototype.toString;var xn=function toString(){var e=+this;if(e!==e){return"Invalid Date"}return re.Call(Mn,this)};Z(Date.prototype,"toString",xn)}var Nn={anchor:function anchor(e){return re.CreateHTML(this,"a","name",e)},big:function big(){return re.CreateHTML(this,"big","","")},blink:function blink(){return re.CreateHTML(this,"blink","","")},bold:function bold(){return re.CreateHTML(this,"b","","")},fixed:function fixed(){return re.CreateHTML(this,"tt","","")},fontcolor:function fontcolor(e){return re.CreateHTML(this,"font","color",e)},fontsize:function fontsize(e){return re.CreateHTML(this,"font","size",e)},italics:function italics(){return re.CreateHTML(this,"i","","")},link:function link(e){return re.CreateHTML(this,"a","href",e)},small:function small(){return re.CreateHTML(this,"small","","")},strike:function strike(){return re.CreateHTML(this,"strike","","")},sub:function sub(){return re.CreateHTML(this,"sub","","")},sup:function sub(){return re.CreateHTML(this,"sup","","")}};l(Object.keys(Nn),function(e){var r=String.prototype[e];var n=false;if(re.IsCallable(r)){var o=t(r,"",' " ');var i=P([],o.match(/"/g)).length;n=o!==o.toLowerCase()||i>2}else{n=true}if(n){Z(String.prototype,e,Nn[e])}});var An=function(){if(!Y){return false}var e=typeof JSON==="object"&&typeof JSON.stringify==="function"?JSON.stringify:null;if(!e){return false}if(typeof e(G())!=="undefined"){return true}if(e([G()])!=="[null]"){return true}var t={a:G()};t[G()]=true;if(e(t)!=="{}"){return true}return false}();var Rn=a(function(){if(!Y){return true}return JSON.stringify(Object(G()))==="{}"&&JSON.stringify([Object(G())])==="[{}]"});if(An||!Rn){var _n=JSON.stringify;Z(JSON,"stringify",function stringify(e){if(typeof e==="symbol"){return}var n;if(arguments.length>1){n=arguments[1]}var o=[e];if(!r(n)){var i=re.IsCallable(n)?n:null;var a=function(e,r){var n=i?t(i,this,e,r):r;if(typeof n!=="symbol"){if(K.symbol(n)){return St({})(n)}else{return n}}};o.push(a)}else{o.push(n)}if(arguments.length>2){o.push(arguments[2])}return _n.apply(this,o)})}return S}); \ No newline at end of file diff --git a/documentation/js/libs/htmlparser.js b/documentation/js/libs/htmlparser.js new file mode 100644 index 00000000..522b39ca --- /dev/null +++ b/documentation/js/libs/htmlparser.js @@ -0,0 +1,23 @@ +/*********************************************** +Copyright 2010 - 2012 Chris Winberry . All rights reserved. +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to +deal in the Software without restriction, including without limitation the +rights to use, copy, modify, merge, publish, distribute, sublicense, and/or +sell copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS +IN THE SOFTWARE. +***********************************************/ +/* v2.0.0 */ + +!function(){function t(t,e){var a=function(){};a.prototype=e.prototype,t.super_=e,t.prototype=new a,t.prototype.constructor=t}function e(t,e){this._options=e||{},this._validateBuilder(t);this._builder=t,this.reset()}function a(t,e){this.reset(),this._options=e||{},void 0===this._options.ignoreWhitespace&&(this._options.ignoreWhitespace=!1),void 0===this._options.includeLocation&&(this._options.includeLocation=!1),void 0===this._options.verbose&&(this._options.verbose=!0),void 0===this._options.enforceEmptyTags&&(this._options.enforceEmptyTags=!0),void 0===this._options.caseSensitiveTags&&(this._options.caseSensitiveTags=!1),void 0===this._options.caseSensitiveAttr&&(this._options.caseSensitiveAttr=!1),"function"==typeof t&&(this._callback=t)}function n(t){n.super_.call(this,t,{ignoreWhitespace:!0,verbose:!1,enforceEmptyTags:!1,caseSensitiveTags:!0})}var i;if("undefined"!=typeof module&&void 0!==module.exports)i=module.exports;else{if(i={},this.Tautologistics||(this.Tautologistics={}),this.Tautologistics.NodeHtmlParser)return;this.Tautologistics.NodeHtmlParser=i}var s={Text:"text",Tag:"tag",Attr:"attr",CData:"cdata",Doctype:"doctype",Comment:"comment"};"undefined"!=typeof module&&void 0!==module.exports&&(t(e,require("stream")),e.prototype.writable=!0,e.prototype.write=function(t){t instanceof Buffer&&(t=t.toString()),this.parseChunk(t)},e.prototype.end=function(t){arguments.length&&this.write(t),this.writable=!1,this.done()},e.prototype.destroy=function(){this.writable=!1}),e.prototype.reset=function(){this._state={mode:s.Text,pos:0,data:null,pendingText:null,pendingWrite:null,lastTag:null,isScript:!1,needData:!1,output:[],done:!1},this._builder.reset()},e.prototype.parseChunk=function(t){for(this._state.needData=!1,this._state.data=null!==this._state.data?this._state.data.substr(this.pos)+t:t;this._state.pos\/]+)(\s*)\??(>?)/g,e.prototype._parseTag=function(){var t=this._state;e.re_parseTag.lastIndex=t.pos;var a=e.re_parseTag.exec(t.data);if(a){if(!a[1]&&"!--"===a[2].substr(0,3))return t.mode=s.Comment,void(t.pos+=3);if(!a[1]&&"![CDATA["===a[2].substr(0,8))return t.mode=s.CData,void(t.pos+=8);if(!a[1]&&"!DOCTYPE"===a[2].substr(0,8))return t.mode=s.Doctype,void(t.pos+=8);if(!t.done&&t.pos+a[0].length===t.data.length)return void(t.needData=!0);var n;">"===a[4]?(t.mode=s.Text,n=a[0].substr(0,a[0].length-1)):(t.mode=s.Attr,n=a[0]),t.pos+=a[0].length;var i={type:s.Tag,name:a[1]+a[2],raw:n};t.mode===s.Attr&&(t.lastTag=i),"script"===i.name.toLowerCase()?t.isScript=!0:"/script"===i.name.toLowerCase()&&(t.isScript=!1),t.mode===s.Attr?this._writePending(i):this._write(i)}else t.needData=!0},e.re_parseAttr_findName=/\s*([^=<>\s'"\/]+)\s*/g,e.prototype._parseAttr_findName=function(){e.re_parseAttr_findName.lastIndex=this._state.pos;var t=e.re_parseAttr_findName.exec(this._state.data);return t?this._state.pos+t[0].length!==e.re_parseAttr_findName.lastIndex?null:{match:t[0],name:t[1]}:null},e.re_parseAttr_findValue=/\s*=\s*(?:'([^']*)'|"([^"]*)"|([^'"\s\/>]+))\s*/g,e.re_parseAttr_findValue_last=/\s*=\s*['"]?(.*)$/g,e.prototype._parseAttr_findValue=function(){var t=this._state;e.re_parseAttr_findValue.lastIndex=t.pos;var a=e.re_parseAttr_findValue.exec(t.data);return a?t.pos+a[0].length!==e.re_parseAttr_findValue.lastIndex?null:{match:a[0],value:a[1]||a[2]||a[3]}:t.done?(e.re_parseAttr_findValue_last.lastIndex=t.pos,a=e.re_parseAttr_findValue_last.exec(t.data),a?{match:a[0],value:""!==a[1]?a[1]:null}:null):null},e.re_parseAttr_splitValue=/\s*=\s*['"]?/g,e.re_parseAttr_selfClose=/(\s*\/\s*)(>?)/g,e.prototype._parseAttr=function(){var t=this._state,a=this._parseAttr_findName(t);if(a&&"?"!==a.name){if(!t.done&&t.pos+a.match.length===t.data.length)return t.needData=!0,null;t.pos+=a.match.length;var n=this._parseAttr_findValue(t);t.data.indexOf(" ",t.pos);if(n){if(!t.done&&t.pos+n.match.length===t.data.length)return t.needData=!0,void(t.pos-=a.match.length);t.pos+=n.match.length}else if(t.data.indexOf(" ",t.pos-1))n={match:"",value:a.name};else{if(e.re_parseAttr_splitValue.lastIndex=t.pos,e.re_parseAttr_splitValue.exec(t.data))return t.needData=!0,void(t.pos-=a.match.length);n={match:"",value:null}}t.lastTag.raw+=a.match+n.match,this._writePending({type:s.Attr,name:a.name,data:n.value})}else{e.re_parseAttr_selfClose.lastIndex=t.pos;var i=e.re_parseAttr_selfClose.exec(t.data);if(i&&i.index===t.pos){if(!t.done&&!i[2]&&t.pos+i[0].length===t.data.length)return void(t.needData=!0);t.lastTag.raw+=i[1],this._write({type:s.Tag,name:"/"+t.lastTag.name,raw:null}),t.pos+=i[1].length}var r=t.data.indexOf(">",t.pos);if(r<0){if(t.done)return t.lastTag.raw+=t.data.substr(t.pos),void(t.pos=t.data.length);t.needData=!0}else t.pos=r+1,t.mode=s.Text}},e.re_parseCData_findEnding=/\]{1,2}$/,e.prototype._parseCData=function(){var t=this._state,a=t.data.indexOf("]]>",t.pos);if(a<0&&t.done&&(a=t.data.length),a<0){if(e.re_parseCData_findEnding.lastIndex=t.pos,e.re_parseCData_findEnding.exec(t.data))return void(t.needData=!0);t.pendingText||(t.pendingText=[]),t.pendingText.push(t.data.substr(t.pos,t.data.length)),t.pos=t.data.length,t.needData=!0}else{var n;t.pendingText?(t.pendingText.push(t.data.substring(t.pos,a)),n=t.pendingText.join(""),t.pendingText=null):n=t.data.substring(t.pos,a),this._write({type:s.CData,data:n}),t.mode=s.Text,t.pos=a+3}},e.prototype._parseDoctype=function(){var t=this._state,a=t.data.indexOf(">",t.pos);if(a<0&&t.done&&(a=t.data.length),a<0)e.re_parseCData_findEnding.lastIndex=t.pos,t.pendingText||(t.pendingText=[]),t.pendingText.push(t.data.substr(t.pos,t.data.length)),t.pos=t.data.length,t.needData=!0;else{var n;t.pendingText?(t.pendingText.push(t.data.substring(t.pos,a)),n=t.pendingText.join(""),t.pendingText=null):n=t.data.substring(t.pos,a),this._write({type:s.Doctype,data:n}),t.mode=s.Text,t.pos=a+1}},e.re_parseComment_findEnding=/\-{1,2}$/,e.prototype._parseComment=function(){var t=this._state,a=t.data.indexOf("--\x3e",t.pos);if(a<0&&t.done&&(a=t.data.length),a<0){if(e.re_parseComment_findEnding.lastIndex=t.pos,e.re_parseComment_findEnding.exec(t.data))return void(t.needData=!0);t.pendingText||(t.pendingText=[]),t.pendingText.push(t.data.substr(t.pos,t.data.length)),t.pos=t.data.length,t.needData=!0}else{var n;t.pendingText?(t.pendingText.push(t.data.substring(t.pos,a)),n=t.pendingText.join(""),t.pendingText=null):n=t.data.substring(t.pos,a),this._write({type:s.Comment,data:n}),t.mode=s.Text,t.pos=a+3}},a._emptyTags={area:1,base:1,basefont:1,br:1,col:1,frame:1,hr:1,img:1,input:1,isindex:1,link:1,meta:1,param:1,embed:1,"?xml":1},a.reWhitespace=/^\s*$/,a.prototype.dom=null,a.prototype.reset=function(){this.dom=[],this._done=!1,this._tagStack=[],this._lastTag=null,this._tagStack.last=function(){return this.length?this[this.length-1]:null},this._line=1,this._col=1},a.prototype.done=function(){this._done=!0,this.handleCallback(null)},a.prototype.error=function(t){this.handleCallback(t)},a.prototype.handleCallback=function(t){if("function"==typeof this._callback)this._callback(t,this.dom);else if(t)throw t},a.prototype.isEmptyTag=function(t){var e=t.name.toLowerCase();return"?"==e.charAt(0)||("/"==e.charAt(0)&&(e=e.substring(1)),this._options.enforceEmptyTags&&!!a._emptyTags[e])},a.prototype._getLocation=function(){return{line:this._line,col:this._col}},a.prototype._updateLocation=function(t){var e=t.type===s.Tag?t.raw:t.data;if(null!==e){var a=e.split("\n");this._line+=a.length-1,a.length>1&&(this._col=1),this._col+=a[a.length-1].length,t.type===s.Tag?this._col+=2:t.type===s.Comment?this._col+=7:t.type===s.CData&&(this._col+=12)}},a.prototype._copyElement=function(t){var e={type:t.type};if(this._options.verbose&&void 0!==t.raw&&(e.raw=t.raw),void 0!==t.name)switch(t.type){case s.Tag:e.name=this._options.caseSensitiveTags?t.name:t.name.toLowerCase();break;case s.Attr:e.name=this._options.caseSensitiveAttr?t.name:t.name.toLowerCase();break;default:e.name=this._options.caseSensitiveTags?t.name:t.name.toLowerCase()}return void 0!==t.data&&(e.data=t.data),t.location&&(e.location={line:t.location.line,col:t.location.col}),e},a.prototype.write=function(t){if(this._done&&this.handleCallback(new Error("Writing to the builder after done() called is not allowed without a reset()")),this._options.includeLocation&&t.type!==s.Attr&&(t.location=this._getLocation(),this._updateLocation(t)),t.type!==s.Text||!this._options.ignoreWhitespace||!a.reWhitespace.test(t.data)){var e,n;if(this._tagStack.last())if(t.type===s.Tag)if("/"==t.name.charAt(0)){var i=this._options.caseSensitiveTags?t.name.substring(1):t.name.substring(1).toLowerCase();if(!this.isEmptyTag(t)){for(var r=this._tagStack.length-1;r>-1&&this._tagStack[r--].name!=i;);if(r>-1||this._tagStack[0].name==i)for(;r=0&&s.length>=n)return s;if(a&&e.children)i=e.children;else{if(!(e instanceof Array))return s;i=e}for(var d=0;d=0&&s.length>=n));d++);return s},getElementById:function(t,e,a){var n=r.getElements({id:t},e,a,1);return n.length?n[0]:null},getElementsByTagName:function(t,e,a,n){return r.getElements({tag_name:t},e,a,n)},getElementsByTagType:function(t,e,a,n){return r.getElements({tag_type:t},e,a,n)}};i.Parser=e,i.HtmlBuilder=a,i.RssBuilder=n,i.ElementType=s,i.DomUtils=r}(); diff --git a/documentation/js/libs/innersvg.js b/documentation/js/libs/innersvg.js new file mode 100644 index 00000000..b1099deb --- /dev/null +++ b/documentation/js/libs/innersvg.js @@ -0,0 +1,9 @@ +/** + * innerHTML property for SVGElement + * Copyright(c) 2010, Jeff Schiller + * + * Licensed under the Apache License, Version 2 + * + * Minor modifications by Chris Price to only polyfill when required. + */ +!function(e){if(e&&!("innerHTML"in e.prototype)){var t=function(e,r){var i=e.nodeType;if(3==i)r.push(e.textContent.replace(/&/,"&").replace(/",">"));else if(1==i){if(r.push("<",e.tagName),e.hasAttributes())for(var n=e.attributes,s=0,o=n.length;s");for(var h=e.childNodes,s=0,o=h.length;s")}else r.push("/>")}else{if(8!=i)throw"Error serializing XML. Unhandled node of type: "+i;r.push("\x3c!--",e.nodeValue,"--\x3e")}};Object.defineProperty(e.prototype,"innerHTML",{get:function(){for(var e=[],r=this.firstChild;r;)t(r,e),r=r.nextSibling;return e.join("")},set:function(e){for(;this.firstChild;)this.removeChild(this.firstChild);try{var t=new DOMParser;t.async=!1,sXML=""+e+"";for(var r=t.parseFromString(sXML,"text/xml").documentElement.firstChild;r;)this.appendChild(this.ownerDocument.importNode(r,!0)),r=r.nextSibling}catch(e){throw new Error("Error parsing XML string")}}})}}((0,eval)("this").SVGElement); \ No newline at end of file diff --git a/documentation/js/libs/lit-html.js b/documentation/js/libs/lit-html.js new file mode 100644 index 00000000..743deea1 --- /dev/null +++ b/documentation/js/libs/lit-html.js @@ -0,0 +1 @@ +"use strict";function _possibleConstructorReturn(self,call){if(call&&(_typeof(call)==="object"||typeof call==="function")){return call}return _assertThisInitialized(self)}function _assertThisInitialized(self){if(self===void 0){throw new ReferenceError("this hasn't been initialised - super() hasn't been called")}return self}function _get(target,property,receiver){if(typeof Reflect!=="undefined"&&Reflect.get){_get=Reflect.get}else{_get=function _get(target,property,receiver){var base=_superPropBase(target,property);if(!base)return;var desc=Object.getOwnPropertyDescriptor(base,property);if(desc.get){return desc.get.call(receiver)}return desc.value}}return _get(target,property,receiver||target)}function _superPropBase(object,property){while(!Object.prototype.hasOwnProperty.call(object,property)){object=_getPrototypeOf(object);if(object===null)break}return object}function _getPrototypeOf(o){_getPrototypeOf=Object.setPrototypeOf?Object.getPrototypeOf:function _getPrototypeOf(o){return o.__proto__||Object.getPrototypeOf(o)};return _getPrototypeOf(o)}function _inherits(subClass,superClass){if(typeof superClass!=="function"&&superClass!==null){throw new TypeError("Super expression must either be null or a function")}subClass.prototype=Object.create(superClass&&superClass.prototype,{constructor:{value:subClass,writable:true,configurable:true}});if(superClass)_setPrototypeOf(subClass,superClass)}function _setPrototypeOf(o,p){_setPrototypeOf=Object.setPrototypeOf||function _setPrototypeOf(o,p){o.__proto__=p;return o};return _setPrototypeOf(o,p)}function _toConsumableArray(arr){return _arrayWithoutHoles(arr)||_iterableToArray(arr)||_nonIterableSpread()}function _nonIterableSpread(){throw new TypeError("Invalid attempt to spread non-iterable instance")}function _iterableToArray(iter){if(Symbol.iterator in Object(iter)||Object.prototype.toString.call(iter)==="[object Arguments]")return Array.from(iter)}function _arrayWithoutHoles(arr){if(Array.isArray(arr)){for(var i=0,arr2=new Array(arr.length);i2&&arguments[2]!==undefined?arguments[2]:null;var i=arguments.length>3&&arguments[3]!==undefined?arguments[3]:null;var n=e;for(;n!==s;){var _e=n.nextSibling;t.insertBefore(n,i),n=_e}},o=function o(t,e){var s=arguments.length>2&&arguments[2]!==undefined?arguments[2]:null;var i=e;for(;i!==s;){var _e2=i.nextSibling;t.removeChild(i),i=_e2}},r={},a={},l="{{lit-".concat(String(Math.random()).slice(2),"}}"),h="\x3c!--".concat(l,"--\x3e"),d=new RegExp("".concat(l,"|").concat(h)),c="$lit$";var u=function u(t,e){var _this=this;_classCallCheck(this,u);this.parts=[],this.element=e;var s=-1,i=0;var n=[],o=function o(e){var r=e.content,a=document.createTreeWalker(r,133,null,!1);var h=0;for(;a.nextNode();){s++;var _e3=a.currentNode;if(1===_e3.nodeType){if(_e3.hasAttributes()){var _n=_e3.attributes;var _o=0;for(var _t=0;_t<_n.length;_t++){_n[_t].value.indexOf(l)>=0&&_o++}for(;_o-- >0;){var _n2=t.strings[i],_o2=g.exec(_n2)[2],_r=_o2.toLowerCase()+c,_a=_e3.getAttribute(_r).split(d);_this.parts.push({type:"attribute",index:s,name:_o2,strings:_a}),_e3.removeAttribute(_r),i+=_a.length-1}}"TEMPLATE"===_e3.tagName&&o(_e3)}else if(3===_e3.nodeType){var _t2=_e3.data;if(_t2.indexOf(l)>=0){var _o3=_e3.parentNode,_r2=_t2.split(d),_a2=_r2.length-1;for(var _t3=0;_t3<_a2;_t3++){_o3.insertBefore(""===_r2[_t3]?m():document.createTextNode(_r2[_t3]),_e3),_this.parts.push({type:"node",index:++s})}""===_r2[_a2]?(_o3.insertBefore(m(),_e3),n.push(_e3)):_e3.data=_r2[_a2],i+=_a2}}else if(8===_e3.nodeType)if(_e3.data===l){var _t4=_e3.parentNode;null!==_e3.previousSibling&&s!==h||(s++,_t4.insertBefore(m(),_e3)),h=s,_this.parts.push({type:"node",index:s}),null===_e3.nextSibling?_e3.data="":(n.push(_e3),s--),i++}else{var _t5=-1;for(;-1!==(_t5=_e3.data.indexOf(l,_t5+1));){_this.parts.push({type:"node",index:-1})}}}};o(e);for(var _i=0;_i=\/]+)([ \x09\x0a\x0c\x0d]*=[ \x09\x0a\x0c\x0d]*(?:[^ \x09\x0a\x0c\x0d"'`<>=]*|"[^"]*|'[^']*))$/;var v=function(){function v(t,e,s){_classCallCheck(this,v);this._parts=[],this.template=t,this.processor=e,this.options=s}_createClass(v,[{key:"update",value:function update(t){var e=0;var _iteratorNormalCompletion=true;var _didIteratorError=false;var _iteratorError=undefined;try{for(var _iterator=this._parts[Symbol.iterator](),_step;!(_iteratorNormalCompletion=(_step=_iterator.next()).done);_iteratorNormalCompletion=true){var _s=_step.value;void 0!==_s&&_s.setValue(t[e]),e++}}catch(err){_didIteratorError=true;_iteratorError=err}finally{try{if(!_iteratorNormalCompletion&&_iterator.return!=null){_iterator.return()}}finally{if(_didIteratorError){throw _iteratorError}}}var _iteratorNormalCompletion2=true;var _didIteratorError2=false;var _iteratorError2=undefined;try{for(var _iterator2=this._parts[Symbol.iterator](),_step2;!(_iteratorNormalCompletion2=(_step2=_iterator2.next()).done);_iteratorNormalCompletion2=true){var _t7=_step2.value;void 0!==_t7&&_t7.commit()}}catch(err){_didIteratorError2=true;_iteratorError2=err}finally{try{if(!_iteratorNormalCompletion2&&_iterator2.return!=null){_iterator2.return()}}finally{if(_didIteratorError2){throw _iteratorError2}}}}},{key:"_clone",value:function _clone(){var _this2=this;var t=i?this.template.element.content.cloneNode(!0):document.importNode(this.template.element.content,!0),e=this.template.parts;var s=0,n=0;var o=function o(t){var i=document.createTreeWalker(t,133,null,!1);var r=i.nextNode();for(;s".concat(_get(_getPrototypeOf(x.prototype),"getHTML",this).call(this),"")}},{key:"getTemplateElement",value:function getTemplateElement(){var t=_get(_getPrototypeOf(x.prototype),"getTemplateElement",this).call(this),e=t.content,s=e.firstChild;return e.removeChild(s),n(e,s.firstChild),t}}]);return x}(f);var _=function _(t){return null===t||!("object"==_typeof(t)||"function"==typeof t)};var y=function(){function y(t,e,s){_classCallCheck(this,y);this.dirty=!0,this.element=t,this.name=e,this.strings=s,this.parts=[];for(var _t11=0;_t110&&arguments[0]!==undefined?arguments[0]:this.startNode;o(this.startNode.parentNode,t.nextSibling,this.endNode)}}]);return V}();var b=function(){function b(t,e,s){_classCallCheck(this,b);if(this.value=void 0,this._pendingValue=void 0,2!==s.length||""!==s[0]||""!==s[1])throw new Error("Boolean attributes can only contain a single expression");this.element=t,this.name=e,this.strings=s}_createClass(b,[{key:"setValue",value:function setValue(t){this._pendingValue=t}},{key:"commit",value:function commit(){for(;s(this._pendingValue);){var _t15=this._pendingValue;this._pendingValue=r,_t15(this)}if(this._pendingValue===r)return;var t=!!this._pendingValue;this.value!==t&&(t?this.element.setAttribute(this.name,""):this.element.removeAttribute(this.name)),this.value=t,this._pendingValue=r}}]);return b}();var w=function(_y){_inherits(w,_y);function w(t,e,s){var _this3;_classCallCheck(this,w);_this3=_possibleConstructorReturn(this,_getPrototypeOf(w).call(this,t,e,s)),_this3.single=2===s.length&&""===s[0]&&""===s[1];return _this3}_createClass(w,[{key:"_createPart",value:function _createPart(){return new T(this)}},{key:"_getValue",value:function _getValue(){return this.single?this.parts[0].value:_get(_getPrototypeOf(w.prototype),"_getValue",this).call(this)}},{key:"commit",value:function commit(){this.dirty&&(this.dirty=!1,this.element[this.name]=this._getValue())}}]);return w}(y);var T=function(_N){_inherits(T,_N);function T(){_classCallCheck(this,T);return _possibleConstructorReturn(this,_getPrototypeOf(T).apply(this,arguments))}return T}(N);var E=!1;try{var _t16={get capture(){return E=!0,!1}};window.addEventListener("test",_t16,_t16),window.removeEventListener("test",_t16,_t16)}catch(t){}var A=function(){function A(t,e,s){var _this4=this;_classCallCheck(this,A);this.value=void 0,this._pendingValue=void 0,this.element=t,this.eventName=e,this.eventContext=s,this._boundHandleEvent=function(t){return _this4.handleEvent(t)}}_createClass(A,[{key:"setValue",value:function setValue(t){this._pendingValue=t}},{key:"commit",value:function commit(){for(;s(this._pendingValue);){var _t17=this._pendingValue;this._pendingValue=r,_t17(this)}if(this._pendingValue===r)return;var t=this._pendingValue,e=this.value,i=null==t||null!=e&&(t.capture!==e.capture||t.once!==e.once||t.passive!==e.passive),n=null!=t&&(null==e||i);i&&this.element.removeEventListener(this.eventName,this._boundHandleEvent,this._options),n&&(this._options=P(t),this.element.addEventListener(this.eventName,this._boundHandleEvent,this._options)),this.value=t,this._pendingValue=r}},{key:"handleEvent",value:function handleEvent(t){"function"==typeof this.value?this.value.call(this.eventContext||this.element,t):this.value.handleEvent(t)}}]);return A}();var P=function P(t){return t&&(E?{capture:t.capture,passive:t.passive,once:t.once}:t.capture)};var S=function(){function S(){_classCallCheck(this,S)}_createClass(S,[{key:"handleAttributeExpressions",value:function handleAttributeExpressions(t,e,s,i){var n=e[0];if("."===n){return new w(t,e.slice(1),s).parts}return"@"===n?[new A(t,e.slice(1),i.eventContext)]:"?"===n?[new b(t,e.slice(1),s)]:new y(t,e,s).parts}},{key:"handleTextExpression",value:function handleTextExpression(t){return new V(t)}}]);return S}();var C=new S;function M(t){var e=L.get(t.type);void 0===e&&(e={stringsArray:new WeakMap,keyString:new Map},L.set(t.type,e));var s=e.stringsArray.get(t.strings);if(void 0!==s)return s;var i=t.strings.join(l);return void 0===(s=e.keyString.get(i))&&(s=new u(t,t.getTemplateElement()),e.keyString.set(i,s)),e.stringsArray.set(t.strings,s),s}var L=new Map,k=new WeakMap;(window.litHtmlVersions||(window.litHtmlVersions=[])).push("1.0.0");t.html=function(t){for(var _len=arguments.length,e=new Array(_len>1?_len-1:0),_key=1;_key<_len;_key++){e[_key-1]=arguments[_key]}return new f(t,e,"html",C)},t.svg=function(t){for(var _len2=arguments.length,e=new Array(_len2>1?_len2-1:0),_key2=1;_key2<_len2;_key2++){e[_key2-1]=arguments[_key2]}return new x(t,e,"svg",C)},t.DefaultTemplateProcessor=S,t.defaultTemplateProcessor=C,t.directive=function(t){return function(){var i=t.apply(void 0,arguments);return e.set(i,!0),i}},t.isDirective=s,t.removeNodes=o,t.reparentNodes=n,t.noChange=r,t.nothing=a,t.AttributeCommitter=y,t.AttributePart=N,t.BooleanAttributePart=b,t.EventPart=A,t.isPrimitive=_,t.NodePart=V,t.PropertyCommitter=w,t.PropertyPart=T,t.parts=k,t.render=function(t,e,s){var i=k.get(e);void 0===i&&(o(e,e.firstChild),k.set(e,i=new V(Object.assign({templateFactory:M},s))),i.appendInto(e)),i.setValue(t),i.commit()},t.templateCaches=L,t.templateFactory=M,t.TemplateInstance=v,t.SVGTemplateResult=x,t.TemplateResult=f,t.createMarker=m,t.isTemplatePartActive=p,t.Template=u,Object.defineProperty(t,"__esModule",{value:!0})}); \ No newline at end of file diff --git a/documentation/js/libs/prism.js b/documentation/js/libs/prism.js new file mode 100644 index 00000000..bb9d7ebb --- /dev/null +++ b/documentation/js/libs/prism.js @@ -0,0 +1,46 @@ +/* PrismJS 1.23.0 +https://prismjs.com/download.html?#themes=prism&languages=markup+css+clike+javascript+apacheconf+aspnet+bash+c+csharp+cpp+coffeescript+dart+docker+elm+git+go+graphql+handlebars+haskell+http+ignore+java+json+kotlin+less+markdown+markup-templating+nginx+php+powershell+ruby+rust+sass+scss+sql+swift+typescript+wasm+yaml&plugins=line-highlight+line-numbers+toolbar+copy-to-clipboard */ +var _self="undefined"!=typeof window?window:"undefined"!=typeof WorkerGlobalScope&&self instanceof WorkerGlobalScope?self:{},Prism=function(u){var c=/\blang(?:uage)?-([\w-]+)\b/i,n=0,e={},M={manual:u.Prism&&u.Prism.manual,disableWorkerMessageHandler:u.Prism&&u.Prism.disableWorkerMessageHandler,util:{encode:function e(n){return n instanceof W?new W(n.type,e(n.content),n.alias):Array.isArray(n)?n.map(e):n.replace(/&/g,"&").replace(/=l.reach);y+=m.value.length,m=m.next){var b=m.value;if(t.length>n.length)return;if(!(b instanceof W)){var k,x=1;if(h){if(!(k=z(v,y,n,f)))break;var w=k.index,A=k.index+k[0].length,P=y;for(P+=m.value.length;P<=w;)m=m.next,P+=m.value.length;if(P-=m.value.length,y=P,m.value instanceof W)continue;for(var E=m;E!==t.tail&&(Pl.reach&&(l.reach=N);var j=m.prev;O&&(j=I(t,j,O),y+=O.length),q(t,j,x);var C=new W(o,g?M.tokenize(S,g):S,d,S);if(m=I(t,j,C),L&&I(t,m,L),1l.reach&&(l.reach=_.reach)}}}}}}(e,a,n,a.head,0),function(e){var n=[],t=e.head.next;for(;t!==e.tail;)n.push(t.value),t=t.next;return n}(a)},hooks:{all:{},add:function(e,n){var t=M.hooks.all;t[e]=t[e]||[],t[e].push(n)},run:function(e,n){var t=M.hooks.all[e];if(t&&t.length)for(var r,a=0;r=t[a++];)r(n)}},Token:W};function W(e,n,t,r){this.type=e,this.content=n,this.alias=t,this.length=0|(r||"").length}function z(e,n,t,r){e.lastIndex=n;var a=e.exec(t);if(a&&r&&a[1]){var i=a[1].length;a.index+=i,a[0]=a[0].slice(i)}return a}function i(){var e={value:null,prev:null,next:null},n={value:null,prev:e,next:null};e.next=n,this.head=e,this.tail=n,this.length=0}function I(e,n,t){var r=n.next,a={value:t,prev:n,next:r};return n.next=a,r.prev=a,e.length++,a}function q(e,n,t){for(var r=n.next,a=0;a"+a.content+""},!u.document)return u.addEventListener&&(M.disableWorkerMessageHandler||u.addEventListener("message",function(e){var n=JSON.parse(e.data),t=n.language,r=n.code,a=n.immediateClose;u.postMessage(M.highlight(r,M.languages[t],t)),a&&u.close()},!1)),M;var t=M.util.currentScript();function r(){M.manual||M.highlightAll()}if(t&&(M.filename=t.src,t.hasAttribute("data-manual")&&(M.manual=!0)),!M.manual){var a=document.readyState;"loading"===a||"interactive"===a&&t&&t.defer?document.addEventListener("DOMContentLoaded",r):window.requestAnimationFrame?window.requestAnimationFrame(r):window.setTimeout(r,16)}return M}(_self);"undefined"!=typeof module&&module.exports&&(module.exports=Prism),"undefined"!=typeof global&&(global.Prism=Prism); +Prism.languages.markup={comment://,prolog:/<\?[\s\S]+?\?>/,doctype:{pattern:/"'[\]]|"[^"]*"|'[^']*')+(?:\[(?:[^<"'\]]|"[^"]*"|'[^']*'|<(?!!--)|)*\]\s*)?>/i,greedy:!0,inside:{"internal-subset":{pattern:/(\[)[\s\S]+(?=\]>$)/,lookbehind:!0,greedy:!0,inside:null},string:{pattern:/"[^"]*"|'[^']*'/,greedy:!0},punctuation:/^$|[[\]]/,"doctype-tag":/^DOCTYPE/,name:/[^\s<>'"]+/}},cdata://i,tag:{pattern:/<\/?(?!\d)[^\s>\/=$<%]+(?:\s(?:\s*[^\s>\/=]+(?:\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+(?=[\s>]))|(?=[\s/>])))+)?\s*\/?>/,greedy:!0,inside:{tag:{pattern:/^<\/?[^\s>\/]+/,inside:{punctuation:/^<\/?/,namespace:/^[^\s>\/:]+:/}},"special-attr":[],"attr-value":{pattern:/=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+)/,inside:{punctuation:[{pattern:/^=/,alias:"attr-equals"},/"|'/]}},punctuation:/\/?>/,"attr-name":{pattern:/[^\s>\/]+/,inside:{namespace:/^[^\s>\/:]+:/}}}},entity:[{pattern:/&[\da-z]{1,8};/i,alias:"named-entity"},/&#x?[\da-f]{1,8};/i]},Prism.languages.markup.tag.inside["attr-value"].inside.entity=Prism.languages.markup.entity,Prism.languages.markup.doctype.inside["internal-subset"].inside=Prism.languages.markup,Prism.hooks.add("wrap",function(a){"entity"===a.type&&(a.attributes.title=a.content.replace(/&/,"&"))}),Object.defineProperty(Prism.languages.markup.tag,"addInlined",{value:function(a,e){var s={};s["language-"+e]={pattern:/(^$)/i,lookbehind:!0,inside:Prism.languages[e]},s.cdata=/^$/i;var t={"included-cdata":{pattern://i,inside:s}};t["language-"+e]={pattern:/[\s\S]+/,inside:Prism.languages[e]};var n={};n[a]={pattern:RegExp("(<__[^>]*>)(?:))*\\]\\]>|(?!)".replace(/__/g,function(){return a}),"i"),lookbehind:!0,greedy:!0,inside:t},Prism.languages.insertBefore("markup","cdata",n)}}),Object.defineProperty(Prism.languages.markup.tag,"addAttribute",{value:function(a,e){Prism.languages.markup.tag.inside["special-attr"].push({pattern:RegExp("(^|[\"'\\s])(?:"+a+")\\s*=\\s*(?:\"[^\"]*\"|'[^']*'|[^\\s'\">=]+(?=[\\s>]))","i"),lookbehind:!0,inside:{"attr-name":/^[^\s=]+/,"attr-value":{pattern:/=[\s\S]+/,inside:{value:{pattern:/(=\s*(["']|(?!["'])))\S[\s\S]*(?=\2$)/,lookbehind:!0,alias:[e,"language-"+e],inside:Prism.languages[e]},punctuation:[{pattern:/^=/,alias:"attr-equals"},/"|'/]}}}})}}),Prism.languages.html=Prism.languages.markup,Prism.languages.mathml=Prism.languages.markup,Prism.languages.svg=Prism.languages.markup,Prism.languages.xml=Prism.languages.extend("markup",{}),Prism.languages.ssml=Prism.languages.xml,Prism.languages.atom=Prism.languages.xml,Prism.languages.rss=Prism.languages.xml; +!function(s){var e=/("|')(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/;s.languages.css={comment:/\/\*[\s\S]*?\*\//,atrule:{pattern:/@[\w-](?:[^;{\s]|\s+(?![\s{]))*(?:;|(?=\s*\{))/,inside:{rule:/^@[\w-]+/,"selector-function-argument":{pattern:/(\bselector\s*\(\s*(?![\s)]))(?:[^()\s]|\s+(?![\s)])|\((?:[^()]|\([^()]*\))*\))+(?=\s*\))/,lookbehind:!0,alias:"selector"},keyword:{pattern:/(^|[^\w-])(?:and|not|only|or)(?![\w-])/,lookbehind:!0}}},url:{pattern:RegExp("\\burl\\((?:"+e.source+"|(?:[^\\\\\r\n()\"']|\\\\[^])*)\\)","i"),greedy:!0,inside:{function:/^url/i,punctuation:/^\(|\)$/,string:{pattern:RegExp("^"+e.source+"$"),alias:"url"}}},selector:RegExp("[^{}\\s](?:[^{};\"'\\s]|\\s+(?![\\s{])|"+e.source+")*(?=\\s*\\{)"),string:{pattern:e,greedy:!0},property:/(?!\s)[-_a-z\xA0-\uFFFF](?:(?!\s)[-\w\xA0-\uFFFF])*(?=\s*:)/i,important:/!important\b/i,function:/[-a-z0-9]+(?=\()/i,punctuation:/[(){};:,]/},s.languages.css.atrule.inside.rest=s.languages.css;var t=s.languages.markup;t&&(t.tag.addInlined("style","css"),t.tag.addAttribute("style","css"))}(Prism); +Prism.languages.clike={comment:[{pattern:/(^|[^\\])\/\*[\s\S]*?(?:\*\/|$)/,lookbehind:!0,greedy:!0},{pattern:/(^|[^\\:])\/\/.*/,lookbehind:!0,greedy:!0}],string:{pattern:/(["'])(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,greedy:!0},"class-name":{pattern:/(\b(?:class|interface|extends|implements|trait|instanceof|new)\s+|\bcatch\s+\()[\w.\\]+/i,lookbehind:!0,inside:{punctuation:/[.\\]/}},keyword:/\b(?:if|else|while|do|for|return|in|instanceof|function|new|try|throw|catch|finally|null|break|continue)\b/,boolean:/\b(?:true|false)\b/,function:/\w+(?=\()/,number:/\b0x[\da-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e[+-]?\d+)?/i,operator:/[<>]=?|[!=]=?=?|--?|\+\+?|&&?|\|\|?|[?*/~^%]/,punctuation:/[{}[\];(),.:]/}; +Prism.languages.javascript=Prism.languages.extend("clike",{"class-name":[Prism.languages.clike["class-name"],{pattern:/(^|[^$\w\xA0-\uFFFF])(?!\s)[_$A-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\.(?:prototype|constructor))/,lookbehind:!0}],keyword:[{pattern:/((?:^|})\s*)catch\b/,lookbehind:!0},{pattern:/(^|[^.]|\.\.\.\s*)\b(?:as|async(?=\s*(?:function\b|\(|[$\w\xA0-\uFFFF]|$))|await|break|case|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally(?=\s*(?:\{|$))|for|from(?=\s*(?:['"]|$))|function|(?:get|set)(?=\s*(?:[#\[$\w\xA0-\uFFFF]|$))|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)\b/,lookbehind:!0}],function:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*(?:\.\s*(?:apply|bind|call)\s*)?\()/,number:/\b(?:(?:0[xX](?:[\dA-Fa-f](?:_[\dA-Fa-f])?)+|0[bB](?:[01](?:_[01])?)+|0[oO](?:[0-7](?:_[0-7])?)+)n?|(?:\d(?:_\d)?)+n|NaN|Infinity)\b|(?:\b(?:\d(?:_\d)?)+\.?(?:\d(?:_\d)?)*|\B\.(?:\d(?:_\d)?)+)(?:[Ee][+-]?(?:\d(?:_\d)?)+)?/,operator:/--|\+\+|\*\*=?|=>|&&=?|\|\|=?|[!=]==|<<=?|>>>?=?|[-+*/%&|^!=<>]=?|\.{3}|\?\?=?|\?\.?|[~:]/}),Prism.languages.javascript["class-name"][0].pattern=/(\b(?:class|interface|extends|implements|instanceof|new)\s+)[\w.\\]+/,Prism.languages.insertBefore("javascript","keyword",{regex:{pattern:/((?:^|[^$\w\xA0-\uFFFF."'\])\s]|\b(?:return|yield))\s*)\/(?:\[(?:[^\]\\\r\n]|\\.)*]|\\.|[^/\\\[\r\n])+\/[gimyus]{0,6}(?=(?:\s|\/\*(?:[^*]|\*(?!\/))*\*\/)*(?:$|[\r\n,.;:})\]]|\/\/))/,lookbehind:!0,greedy:!0,inside:{"regex-source":{pattern:/^(\/)[\s\S]+(?=\/[a-z]*$)/,lookbehind:!0,alias:"language-regex",inside:Prism.languages.regex},"regex-flags":/[a-z]+$/,"regex-delimiter":/^\/|\/$/}},"function-variable":{pattern:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*[=:]\s*(?:async\s*)?(?:\bfunction\b|(?:\((?:[^()]|\([^()]*\))*\)|(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)\s*=>))/,alias:"function"},parameter:[{pattern:/(function(?:\s+(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)?\s*\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\))/,lookbehind:!0,inside:Prism.languages.javascript},{pattern:/(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*=>)/i,inside:Prism.languages.javascript},{pattern:/(\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\)\s*=>)/,lookbehind:!0,inside:Prism.languages.javascript},{pattern:/((?:\b|\s|^)(?!(?:as|async|await|break|case|catch|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally|for|from|function|get|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|set|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)(?![$\w\xA0-\uFFFF]))(?:(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*\s*)\(\s*|\]\s*\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\)\s*\{)/,lookbehind:!0,inside:Prism.languages.javascript}],constant:/\b[A-Z](?:[A-Z_]|\dx?)*\b/}),Prism.languages.insertBefore("javascript","string",{hashbang:{pattern:/^#!.*/,greedy:!0,alias:"comment"},"template-string":{pattern:/`(?:\\[\s\S]|\${(?:[^{}]|{(?:[^{}]|{[^}]*})*})+}|(?!\${)[^\\`])*`/,greedy:!0,inside:{"template-punctuation":{pattern:/^`|`$/,alias:"string"},interpolation:{pattern:/((?:^|[^\\])(?:\\{2})*)\${(?:[^{}]|{(?:[^{}]|{[^}]*})*})+}/,lookbehind:!0,inside:{"interpolation-punctuation":{pattern:/^\${|}$/,alias:"punctuation"},rest:Prism.languages.javascript}},string:/[\s\S]+/}}}),Prism.languages.markup&&(Prism.languages.markup.tag.addInlined("script","javascript"),Prism.languages.markup.tag.addAttribute("on(?:abort|blur|change|click|composition(?:end|start|update)|dblclick|error|focus(?:in|out)?|key(?:down|up)|load|mouse(?:down|enter|leave|move|out|over|up)|reset|resize|scroll|select|slotchange|submit|unload|wheel)","javascript")),Prism.languages.js=Prism.languages.javascript; +Prism.languages.apacheconf={comment:/#.*/,"directive-inline":{pattern:/(^\s*)\b(?:AcceptFilter|AcceptPathInfo|AccessFileName|Action|Add(?:Alt|AltByEncoding|AltByType|Charset|DefaultCharset|Description|Encoding|Handler|Icon|IconByEncoding|IconByType|InputFilter|Language|ModuleInfo|OutputFilter|OutputFilterByType|Type)|Alias|AliasMatch|Allow(?:CONNECT|EncodedSlashes|Methods|Override|OverrideList)?|Anonymous(?:_LogEmail|_MustGiveEmail|_NoUserID|_VerifyEmail)?|AsyncRequestWorkerFactor|Auth(?:BasicAuthoritative|BasicFake|BasicProvider|BasicUseDigestAlgorithm|DBDUserPWQuery|DBDUserRealmQuery|DBMGroupFile|DBMType|DBMUserFile|Digest(?:Algorithm|Domain|NonceLifetime|Provider|Qop|ShmemSize)|Form(?:Authoritative|Body|DisableNoStore|FakeBasicAuth|Location|LoginRequiredLocation|LoginSuccessLocation|LogoutLocation|Method|Mimetype|Password|Provider|SitePassphrase|Size|Username)|GroupFile|LDAP(?:AuthorizePrefix|BindAuthoritative|BindDN|BindPassword|CharsetConfig|CompareAsUser|CompareDNOnServer|DereferenceAliases|GroupAttribute|GroupAttributeIsDN|InitialBindAsUser|InitialBindPattern|MaxSubGroupDepth|RemoteUserAttribute|RemoteUserIsDN|SearchAsUser|SubGroupAttribute|SubGroupClass|Url)|Merging|Name|Type|UserFile|nCache(?:Context|Enable|ProvideFor|SOCache|Timeout)|nzFcgiCheckAuthnProvider|nzFcgiDefineProvider|zDBDLoginToReferer|zDBDQuery|zDBDRedirectQuery|zDBMType|zSendForbiddenOnFailure)|BalancerGrowth|BalancerInherit|BalancerMember|BalancerPersist|BrowserMatch|BrowserMatchNoCase|BufferSize|BufferedLogs|CGIDScriptTimeout|CGIMapExtension|Cache(?:DefaultExpire|DetailHeader|DirLength|DirLevels|Disable|Enable|File|Header|IgnoreCacheControl|IgnoreHeaders|IgnoreNoLastMod|IgnoreQueryString|IgnoreURLSessionIdentifiers|KeyBaseURL|LastModifiedFactor|Lock|LockMaxAge|LockPath|MaxExpire|MaxFileSize|MinExpire|MinFileSize|NegotiatedDocs|QuickHandler|ReadSize|ReadTime|Root|Socache(?:MaxSize|MaxTime|MinTime|ReadSize|ReadTime)?|StaleOnError|StoreExpired|StoreNoStore|StorePrivate)|CharsetDefault|CharsetOptions|CharsetSourceEnc|CheckCaseOnly|CheckSpelling|ChrootDir|ContentDigest|CookieDomain|CookieExpires|CookieName|CookieStyle|CookieTracking|CoreDumpDirectory|CustomLog|DBDExptime|DBDInitSQL|DBDKeep|DBDMax|DBDMin|DBDParams|DBDPersist|DBDPrepareSQL|DBDriver|DTracePrivileges|Dav|DavDepthInfinity|DavGenericLockDB|DavLockDB|DavMinTimeout|DefaultIcon|DefaultLanguage|DefaultRuntimeDir|DefaultType|Define|Deflate(?:BufferSize|CompressionLevel|FilterNote|InflateLimitRequestBody|InflateRatio(?:Burst|Limit)|MemLevel|WindowSize)|Deny|DirectoryCheckHandler|DirectoryIndex|DirectoryIndexRedirect|DirectorySlash|DocumentRoot|DumpIOInput|DumpIOOutput|EnableExceptionHook|EnableMMAP|EnableSendfile|Error|ErrorDocument|ErrorLog|ErrorLogFormat|Example|ExpiresActive|ExpiresByType|ExpiresDefault|ExtFilterDefine|ExtFilterOptions|ExtendedStatus|FallbackResource|FileETag|FilterChain|FilterDeclare|FilterProtocol|FilterProvider|FilterTrace|ForceLanguagePriority|ForceType|ForensicLog|GprofDir|GracefulShutdownTimeout|Group|Header|HeaderName|Heartbeat(?:Address|Listen|MaxServers|Storage)|HostnameLookups|ISAPI(?:AppendLogToErrors|AppendLogToQuery|CacheFile|FakeAsync|LogNotSupported|ReadAheadBuffer)|IdentityCheck|IdentityCheckTimeout|ImapBase|ImapDefault|ImapMenu|Include|IncludeOptional|Index(?:HeadInsert|Ignore|IgnoreReset|Options|OrderDefault|StyleSheet)|InputSed|KeepAlive|KeepAliveTimeout|KeptBodySize|LDAP(?:CacheEntries|CacheTTL|ConnectionPoolTTL|ConnectionTimeout|LibraryDebug|OpCacheEntries|OpCacheTTL|ReferralHopLimit|Referrals|Retries|RetryDelay|SharedCacheFile|SharedCacheSize|Timeout|TrustedClientCert|TrustedGlobalCert|TrustedMode|VerifyServerCert)|LanguagePriority|Limit(?:InternalRecursion|Request(?:Body|FieldSize|Fields|Line)|XMLRequestBody)|Listen|ListenBackLog|LoadFile|LoadModule|LogFormat|LogLevel|LogMessage|LuaAuthzProvider|LuaCodeCache|Lua(?:Hook(?:AccessChecker|AuthChecker|CheckUserID|Fixups|InsertFilter|Log|MapToStorage|TranslateName|TypeChecker)|Inherit|InputFilter|MapHandler|OutputFilter|PackageCPath|PackagePath|QuickHandler|Root|Scope)|MMapFile|Max(?:ConnectionsPerChild|KeepAliveRequests|MemFree|RangeOverlaps|RangeReversals|Ranges|RequestWorkers|SpareServers|SpareThreads|Threads)|MergeTrailers|MetaDir|MetaFiles|MetaSuffix|MimeMagicFile|MinSpareServers|MinSpareThreads|ModMimeUsePathInfo|ModemStandard|MultiviewsMatch|Mutex|NWSSLTrustedCerts|NWSSLUpgradeable|NameVirtualHost|NoProxy|Options|Order|OutputSed|PassEnv|PidFile|PrivilegesMode|Protocol|ProtocolEcho|Proxy(?:AddHeaders|BadHeader|Block|Domain|ErrorOverride|ExpressDBMFile|ExpressDBMType|ExpressEnable|FtpDirCharset|FtpEscapeWildcards|FtpListOnWildcard|HTML(?:BufSize|CharsetOut|DocType|Enable|Events|Extended|Fixups|Interp|Links|Meta|StripComments|URLMap)|IOBufferSize|MaxForwards|Pass(?:Inherit|InterpolateEnv|Match|Reverse|ReverseCookieDomain|ReverseCookiePath)?|PreserveHost|ReceiveBufferSize|Remote|RemoteMatch|Requests|SCGIInternalRedirect|SCGISendfile|Set|SourceAddress|Status|Timeout|Via)|RLimitCPU|RLimitMEM|RLimitNPROC|ReadmeName|ReceiveBufferSize|Redirect|RedirectMatch|RedirectPermanent|RedirectTemp|ReflectorHeader|RemoteIP(?:Header|InternalProxy|InternalProxyList|ProxiesHeader|TrustedProxy|TrustedProxyList)|RemoveCharset|RemoveEncoding|RemoveHandler|RemoveInputFilter|RemoveLanguage|RemoveOutputFilter|RemoveType|RequestHeader|RequestReadTimeout|Require|Rewrite(?:Base|Cond|Engine|Map|Options|Rule)|SSIETag|SSIEndTag|SSIErrorMsg|SSILastModified|SSILegacyExprParser|SSIStartTag|SSITimeFormat|SSIUndefinedEcho|SSL(?:CACertificateFile|CACertificatePath|CADNRequestFile|CADNRequestPath|CARevocationCheck|CARevocationFile|CARevocationPath|CertificateChainFile|CertificateFile|CertificateKeyFile|CipherSuite|Compression|CryptoDevice|Engine|FIPS|HonorCipherOrder|InsecureRenegotiation|OCSP(?:DefaultResponder|Enable|OverrideResponder|ResponderTimeout|ResponseMaxAge|ResponseTimeSkew|UseRequestNonce)|OpenSSLConfCmd|Options|PassPhraseDialog|Protocol|Proxy(?:CACertificateFile|CACertificatePath|CARevocation(?:Check|File|Path)|CheckPeer(?:CN|Expire|Name)|CipherSuite|Engine|MachineCertificate(?:ChainFile|File|Path)|Protocol|Verify|VerifyDepth)|RandomSeed|RenegBufferSize|Require|RequireSSL|SRPUnknownUserSeed|SRPVerifierFile|Session(?:Cache|CacheTimeout|TicketKeyFile|Tickets)|Stapling(?:Cache|ErrorCacheTimeout|FakeTryLater|ForceURL|ResponderTimeout|ResponseMaxAge|ResponseTimeSkew|ReturnResponderErrors|StandardCacheTimeout)|StrictSNIVHostCheck|UseStapling|UserName|VerifyClient|VerifyDepth)|Satisfy|ScoreBoardFile|Script(?:Alias|AliasMatch|InterpreterSource|Log|LogBuffer|LogLength|Sock)?|SecureListen|SeeRequestTail|SendBufferSize|Server(?:Admin|Alias|Limit|Name|Path|Root|Signature|Tokens)|Session(?:Cookie(?:Name|Name2|Remove)|Crypto(?:Cipher|Driver|Passphrase|PassphraseFile)|DBD(?:CookieName|CookieName2|CookieRemove|DeleteLabel|InsertLabel|PerUser|SelectLabel|UpdateLabel)|Env|Exclude|Header|Include|MaxAge)?|SetEnv|SetEnvIf|SetEnvIfExpr|SetEnvIfNoCase|SetHandler|SetInputFilter|SetOutputFilter|StartServers|StartThreads|Substitute|Suexec|SuexecUserGroup|ThreadLimit|ThreadStackSize|ThreadsPerChild|TimeOut|TraceEnable|TransferLog|TypesConfig|UnDefine|UndefMacro|UnsetEnv|Use|UseCanonicalName|UseCanonicalPhysicalPort|User|UserDir|VHostCGIMode|VHostCGIPrivs|VHostGroup|VHostPrivs|VHostSecure|VHostUser|Virtual(?:DocumentRoot|ScriptAlias)(?:IP)?|WatchdogInterval|XBitHack|xml2EncAlias|xml2EncDefault|xml2StartParse)\b/im,lookbehind:!0,alias:"property"},"directive-block":{pattern:/<\/?\b(?:Auth[nz]ProviderAlias|Directory|DirectoryMatch|Else|ElseIf|Files|FilesMatch|If|IfDefine|IfModule|IfVersion|Limit|LimitExcept|Location|LocationMatch|Macro|Proxy|Require(?:All|Any|None)|VirtualHost)\b.*>/i,inside:{"directive-block":{pattern:/^<\/?\w+/,inside:{punctuation:/^<\/?/},alias:"tag"},"directive-block-parameter":{pattern:/.*[^>]/,inside:{punctuation:/:/,string:{pattern:/("|').*\1/,inside:{variable:/[$%]\{?(?:\w\.?[-+:]?)+\}?/}}},alias:"attr-value"},punctuation:/>/},alias:"tag"},"directive-flags":{pattern:/\[(?:[\w=],?)+\]/,alias:"keyword"},string:{pattern:/("|').*\1/,inside:{variable:/[$%]\{?(?:\w\.?[-+:]?)+\}?/}},variable:/[$%]\{?(?:\w\.?[-+:]?)+\}?/,regex:/\^?.*\$|\^.*\$?/}; +!function(s){function a(e,s){return e.replace(/<<(\d+)>>/g,function(e,n){return"(?:"+s[+n]+")"})}function t(e,n,s){return RegExp(a(e,n),s||"")}function e(e,n){for(var s=0;s>/g,function(){return"(?:"+e+")"});return e.replace(/<>/g,"[^\\s\\S]")}var n="bool byte char decimal double dynamic float int long object sbyte short string uint ulong ushort var void",i="class enum interface struct",r="add alias and ascending async await by descending from get global group into join let nameof not notnull on or orderby partial remove select set unmanaged value when where",o="abstract as base break case catch checked const continue default delegate do else event explicit extern finally fixed for foreach goto if implicit in internal is lock namespace new null operator out override params private protected public readonly ref return sealed sizeof stackalloc static switch this throw try typeof unchecked unsafe using virtual volatile while yield";function l(e){return"\\b(?:"+e.trim().replace(/ /g,"|")+")\\b"}var d=l(i),p=RegExp(l(n+" "+i+" "+r+" "+o)),c=l(i+" "+r+" "+o),u=l(n+" "+i+" "+o),g=e("<(?:[^<>;=+\\-*/%&|^]|<>)*>",2),b=e("\\((?:[^()]|<>)*\\)",2),h="@?\\b[A-Za-z_]\\w*\\b",f=a("<<0>>(?:\\s*<<1>>)?",[h,g]),m=a("(?!<<0>>)<<1>>(?:\\s*\\.\\s*<<1>>)*",[c,f]),k="\\[\\s*(?:,\\s*)*\\]",y=a("<<0>>(?:\\s*(?:\\?\\s*)?<<1>>)*(?:\\s*\\?)?",[m,k]),w=a("(?:<<0>>|<<1>>)(?:\\s*(?:\\?\\s*)?<<2>>)*(?:\\s*\\?)?",[a("\\(<<0>>+(?:,<<0>>+)+\\)",[a("[^,()<>[\\];=+\\-*/%&|^]|<<0>>|<<1>>|<<2>>",[g,b,k])]),m,k]),v={keyword:p,punctuation:/[<>()?,.:[\]]/},x="'(?:[^\r\n'\\\\]|\\\\.|\\\\[Uux][\\da-fA-F]{1,8})'",$='"(?:\\\\.|[^\\\\"\r\n])*"';s.languages.csharp=s.languages.extend("clike",{string:[{pattern:t("(^|[^$\\\\])<<0>>",['@"(?:""|\\\\[^]|[^\\\\"])*"(?!")']),lookbehind:!0,greedy:!0},{pattern:t("(^|[^@$\\\\])<<0>>",[$]),lookbehind:!0,greedy:!0},{pattern:RegExp(x),greedy:!0,alias:"character"}],"class-name":[{pattern:t("(\\busing\\s+static\\s+)<<0>>(?=\\s*;)",[m]),lookbehind:!0,inside:v},{pattern:t("(\\busing\\s+<<0>>\\s*=\\s*)<<1>>(?=\\s*;)",[h,w]),lookbehind:!0,inside:v},{pattern:t("(\\busing\\s+)<<0>>(?=\\s*=)",[h]),lookbehind:!0},{pattern:t("(\\b<<0>>\\s+)<<1>>",[d,f]),lookbehind:!0,inside:v},{pattern:t("(\\bcatch\\s*\\(\\s*)<<0>>",[m]),lookbehind:!0,inside:v},{pattern:t("(\\bwhere\\s+)<<0>>",[h]),lookbehind:!0},{pattern:t("(\\b(?:is(?:\\s+not)?|as)\\s+)<<0>>",[y]),lookbehind:!0,inside:v},{pattern:t("\\b<<0>>(?=\\s+(?!<<1>>)<<2>>(?:\\s*[=,;:{)\\]]|\\s+(?:in|when)\\b))",[w,u,h]),inside:v}],keyword:p,number:/(?:\b0(?:x[\da-f_]*[\da-f]|b[01_]*[01])|(?:\B\.\d+(?:_+\d+)*|\b\d+(?:_+\d+)*(?:\.\d+(?:_+\d+)*)?)(?:e[-+]?\d+(?:_+\d+)*)?)(?:ul|lu|[dflmu])?\b/i,operator:/>>=?|<<=?|[-=]>|([-+&|])\1|~|\?\?=?|[-+*/%&|^!=<>]=?/,punctuation:/\?\.?|::|[{}[\];(),.:]/}),s.languages.insertBefore("csharp","number",{range:{pattern:/\.\./,alias:"operator"}}),s.languages.insertBefore("csharp","punctuation",{"named-parameter":{pattern:t("([(,]\\s*)<<0>>(?=\\s*:)",[h]),lookbehind:!0,alias:"punctuation"}}),s.languages.insertBefore("csharp","class-name",{namespace:{pattern:t("(\\b(?:namespace|using)\\s+)<<0>>(?:\\s*\\.\\s*<<0>>)*(?=\\s*[;{])",[h]),lookbehind:!0,inside:{punctuation:/\./}},"type-expression":{pattern:t("(\\b(?:default|typeof|sizeof)\\s*\\(\\s*(?!\\s))(?:[^()\\s]|\\s(?!\\s)|<<0>>)*(?=\\s*\\))",[b]),lookbehind:!0,alias:"class-name",inside:v},"return-type":{pattern:t("<<0>>(?=\\s+(?:<<1>>\\s*(?:=>|[({]|\\.\\s*this\\s*\\[)|this\\s*\\[))",[w,m]),inside:v,alias:"class-name"},"constructor-invocation":{pattern:t("(\\bnew\\s+)<<0>>(?=\\s*[[({])",[w]),lookbehind:!0,inside:v,alias:"class-name"},"generic-method":{pattern:t("<<0>>\\s*<<1>>(?=\\s*\\()",[h,g]),inside:{function:t("^<<0>>",[h]),generic:{pattern:RegExp(g),alias:"class-name",inside:v}}},"type-list":{pattern:t("\\b((?:<<0>>\\s+<<1>>|where\\s+<<2>>)\\s*:\\s*)(?:<<3>>|<<4>>)(?:\\s*,\\s*(?:<<3>>|<<4>>))*(?=\\s*(?:where|[{;]|=>|$))",[d,f,h,w,p.source]),lookbehind:!0,inside:{keyword:p,"class-name":{pattern:RegExp(w),greedy:!0,inside:v},punctuation:/,/}},preprocessor:{pattern:/(^\s*)#.*/m,lookbehind:!0,alias:"property",inside:{directive:{pattern:/(\s*#)\b(?:define|elif|else|endif|endregion|error|if|line|pragma|region|undef|warning)\b/,lookbehind:!0,alias:"keyword"}}}});var _=$+"|"+x,B=a("/(?![*/])|//[^\r\n]*[\r\n]|/\\*(?:[^*]|\\*(?!/))*\\*/|<<0>>",[_]),E=e(a("[^\"'/()]|<<0>>|\\(<>*\\)",[B]),2),R="\\b(?:assembly|event|field|method|module|param|property|return|type)\\b",P=a("<<0>>(?:\\s*\\(<<1>>*\\))?",[m,E]);s.languages.insertBefore("csharp","class-name",{attribute:{pattern:t("((?:^|[^\\s\\w>)?])\\s*\\[\\s*)(?:<<0>>\\s*:\\s*)?<<1>>(?:\\s*,\\s*<<1>>)*(?=\\s*\\])",[R,P]),lookbehind:!0,greedy:!0,inside:{target:{pattern:t("^<<0>>(?=\\s*:)",[R]),alias:"keyword"},"attribute-arguments":{pattern:t("\\(<<0>>*\\)",[E]),inside:s.languages.csharp},"class-name":{pattern:RegExp(m),inside:{punctuation:/\./}},punctuation:/[:,]/}}});var z=":[^}\r\n]+",S=e(a("[^\"'/()]|<<0>>|\\(<>*\\)",[B]),2),j=a("\\{(?!\\{)(?:(?![}:])<<0>>)*<<1>>?\\}",[S,z]),A=e(a("[^\"'/()]|/(?!\\*)|/\\*(?:[^*]|\\*(?!/))*\\*/|<<0>>|\\(<>*\\)",[_]),2),F=a("\\{(?!\\{)(?:(?![}:])<<0>>)*<<1>>?\\}",[A,z]);function U(e,n){return{interpolation:{pattern:t("((?:^|[^{])(?:\\{\\{)*)<<0>>",[e]),lookbehind:!0,inside:{"format-string":{pattern:t("(^\\{(?:(?![}:])<<0>>)*)<<1>>(?=\\}$)",[n,z]),lookbehind:!0,inside:{punctuation:/^:/}},punctuation:/^\{|\}$/,expression:{pattern:/[\s\S]+/,alias:"language-csharp",inside:s.languages.csharp}}},string:/[\s\S]+/}}s.languages.insertBefore("csharp","string",{"interpolation-string":[{pattern:t('(^|[^\\\\])(?:\\$@|@\\$)"(?:""|\\\\[^]|\\{\\{|<<0>>|[^\\\\{"])*"',[j]),lookbehind:!0,greedy:!0,inside:U(j,S)},{pattern:t('(^|[^@\\\\])\\$"(?:\\\\.|\\{\\{|<<0>>|[^\\\\"{])*"',[F]),lookbehind:!0,greedy:!0,inside:U(F,A)}]})}(Prism),Prism.languages.dotnet=Prism.languages.cs=Prism.languages.csharp; +Prism.languages.aspnet=Prism.languages.extend("markup",{"page-directive":{pattern:/<%\s*@.*%>/i,alias:"tag",inside:{"page-directive":{pattern:/<%\s*@\s*(?:Assembly|Control|Implements|Import|Master(?:Type)?|OutputCache|Page|PreviousPageType|Reference|Register)?|%>/i,alias:"tag"},rest:Prism.languages.markup.tag.inside}},directive:{pattern:/<%.*%>/i,alias:"tag",inside:{directive:{pattern:/<%\s*?[$=%#:]{0,2}|%>/i,alias:"tag"},rest:Prism.languages.csharp}}}),Prism.languages.aspnet.tag.pattern=/<(?!%)\/?[^\s>\/]+(?:\s+[^\s>\/=]+(?:=(?:("|')(?:\\[\s\S]|(?!\1)[^\\])*\1|[^\s'">=]+))?)*\s*\/?>/i,Prism.languages.insertBefore("inside","punctuation",{directive:Prism.languages.aspnet.directive},Prism.languages.aspnet.tag.inside["attr-value"]),Prism.languages.insertBefore("aspnet","comment",{"asp-comment":{pattern:/<%--[\s\S]*?--%>/,alias:["asp","comment"]}}),Prism.languages.insertBefore("aspnet",Prism.languages.javascript?"script":"tag",{"asp-script":{pattern:/(]*>)[\s\S]*?(?=<\/script>)/i,lookbehind:!0,alias:["asp","script"],inside:Prism.languages.csharp||{}}}); +!function(e){var t="\\b(?:BASH|BASHOPTS|BASH_ALIASES|BASH_ARGC|BASH_ARGV|BASH_CMDS|BASH_COMPLETION_COMPAT_DIR|BASH_LINENO|BASH_REMATCH|BASH_SOURCE|BASH_VERSINFO|BASH_VERSION|COLORTERM|COLUMNS|COMP_WORDBREAKS|DBUS_SESSION_BUS_ADDRESS|DEFAULTS_PATH|DESKTOP_SESSION|DIRSTACK|DISPLAY|EUID|GDMSESSION|GDM_LANG|GNOME_KEYRING_CONTROL|GNOME_KEYRING_PID|GPG_AGENT_INFO|GROUPS|HISTCONTROL|HISTFILE|HISTFILESIZE|HISTSIZE|HOME|HOSTNAME|HOSTTYPE|IFS|INSTANCE|JOB|LANG|LANGUAGE|LC_ADDRESS|LC_ALL|LC_IDENTIFICATION|LC_MEASUREMENT|LC_MONETARY|LC_NAME|LC_NUMERIC|LC_PAPER|LC_TELEPHONE|LC_TIME|LESSCLOSE|LESSOPEN|LINES|LOGNAME|LS_COLORS|MACHTYPE|MAILCHECK|MANDATORY_PATH|NO_AT_BRIDGE|OLDPWD|OPTERR|OPTIND|ORBIT_SOCKETDIR|OSTYPE|PAPERSIZE|PATH|PIPESTATUS|PPID|PS1|PS2|PS3|PS4|PWD|RANDOM|REPLY|SECONDS|SELINUX_INIT|SESSION|SESSIONTYPE|SESSION_MANAGER|SHELL|SHELLOPTS|SHLVL|SSH_AUTH_SOCK|TERM|UID|UPSTART_EVENTS|UPSTART_INSTANCE|UPSTART_JOB|UPSTART_SESSION|USER|WINDOWID|XAUTHORITY|XDG_CONFIG_DIRS|XDG_CURRENT_DESKTOP|XDG_DATA_DIRS|XDG_GREETER_DATA_DIR|XDG_MENU_PREFIX|XDG_RUNTIME_DIR|XDG_SEAT|XDG_SEAT_PATH|XDG_SESSION_DESKTOP|XDG_SESSION_ID|XDG_SESSION_PATH|XDG_SESSION_TYPE|XDG_VTNR|XMODIFIERS)\\b",n={pattern:/(^(["']?)\w+\2)[ \t]+\S.*/,lookbehind:!0,alias:"punctuation",inside:null},a={bash:n,environment:{pattern:RegExp("\\$"+t),alias:"constant"},variable:[{pattern:/\$?\(\([\s\S]+?\)\)/,greedy:!0,inside:{variable:[{pattern:/(^\$\(\([\s\S]+)\)\)/,lookbehind:!0},/^\$\(\(/],number:/\b0x[\dA-Fa-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:[Ee]-?\d+)?/,operator:/--?|-=|\+\+?|\+=|!=?|~|\*\*?|\*=|\/=?|%=?|<<=?|>>=?|<=?|>=?|==?|&&?|&=|\^=?|\|\|?|\|=|\?|:/,punctuation:/\(\(?|\)\)?|,|;/}},{pattern:/\$\((?:\([^)]+\)|[^()])+\)|`[^`]+`/,greedy:!0,inside:{variable:/^\$\(|^`|\)$|`$/}},{pattern:/\$\{[^}]+\}/,greedy:!0,inside:{operator:/:[-=?+]?|[!\/]|##?|%%?|\^\^?|,,?/,punctuation:/[\[\]]/,environment:{pattern:RegExp("(\\{)"+t),lookbehind:!0,alias:"constant"}}},/\$(?:\w+|[#?*!@$])/],entity:/\\(?:[abceEfnrtv\\"]|O?[0-7]{1,3}|x[0-9a-fA-F]{1,2}|u[0-9a-fA-F]{4}|U[0-9a-fA-F]{8})/};e.languages.bash={shebang:{pattern:/^#!\s*\/.*/,alias:"important"},comment:{pattern:/(^|[^"{\\$])#.*/,lookbehind:!0},"function-name":[{pattern:/(\bfunction\s+)[\w-]+(?=(?:\s*\(?:\s*\))?\s*\{)/,lookbehind:!0,alias:"function"},{pattern:/\b[\w-]+(?=\s*\(\s*\)\s*\{)/,alias:"function"}],"for-or-select":{pattern:/(\b(?:for|select)\s+)\w+(?=\s+in\s)/,alias:"variable",lookbehind:!0},"assign-left":{pattern:/(^|[\s;|&]|[<>]\()\w+(?=\+?=)/,inside:{environment:{pattern:RegExp("(^|[\\s;|&]|[<>]\\()"+t),lookbehind:!0,alias:"constant"}},alias:"variable",lookbehind:!0},string:[{pattern:/((?:^|[^<])<<-?\s*)(\w+?)\s[\s\S]*?(?:\r?\n|\r)\2/,lookbehind:!0,greedy:!0,inside:a},{pattern:/((?:^|[^<])<<-?\s*)(["'])(\w+)\2\s[\s\S]*?(?:\r?\n|\r)\3/,lookbehind:!0,greedy:!0,inside:{bash:n}},{pattern:/(^|[^\\](?:\\\\)*)"(?:\\[\s\S]|\$\([^)]+\)|\$(?!\()|`[^`]+`|[^"\\`$])*"/,lookbehind:!0,greedy:!0,inside:a},{pattern:/(^|[^$\\])'[^']*'/,lookbehind:!0,greedy:!0},{pattern:/\$'(?:[^'\\]|\\[\s\S])*'/,greedy:!0,inside:{entity:a.entity}}],environment:{pattern:RegExp("\\$?"+t),alias:"constant"},variable:a.variable,function:{pattern:/(^|[\s;|&]|[<>]\()(?:add|apropos|apt|aptitude|apt-cache|apt-get|aspell|automysqlbackup|awk|basename|bash|bc|bconsole|bg|bzip2|cal|cat|cfdisk|chgrp|chkconfig|chmod|chown|chroot|cksum|clear|cmp|column|comm|composer|cp|cron|crontab|csplit|curl|cut|date|dc|dd|ddrescue|debootstrap|df|diff|diff3|dig|dir|dircolors|dirname|dirs|dmesg|du|egrep|eject|env|ethtool|expand|expect|expr|fdformat|fdisk|fg|fgrep|file|find|fmt|fold|format|free|fsck|ftp|fuser|gawk|git|gparted|grep|groupadd|groupdel|groupmod|groups|grub-mkconfig|gzip|halt|head|hg|history|host|hostname|htop|iconv|id|ifconfig|ifdown|ifup|import|install|ip|jobs|join|kill|killall|less|link|ln|locate|logname|logrotate|look|lpc|lpr|lprint|lprintd|lprintq|lprm|ls|lsof|lynx|make|man|mc|mdadm|mkconfig|mkdir|mke2fs|mkfifo|mkfs|mkisofs|mknod|mkswap|mmv|more|most|mount|mtools|mtr|mutt|mv|nano|nc|netstat|nice|nl|nohup|notify-send|npm|nslookup|op|open|parted|passwd|paste|pathchk|ping|pkill|pnpm|popd|pr|printcap|printenv|ps|pushd|pv|quota|quotacheck|quotactl|ram|rar|rcp|reboot|remsync|rename|renice|rev|rm|rmdir|rpm|rsync|scp|screen|sdiff|sed|sendmail|seq|service|sftp|sh|shellcheck|shuf|shutdown|sleep|slocate|sort|split|ssh|stat|strace|su|sudo|sum|suspend|swapon|sync|tac|tail|tar|tee|time|timeout|top|touch|tr|traceroute|tsort|tty|umount|uname|unexpand|uniq|units|unrar|unshar|unzip|update-grub|uptime|useradd|userdel|usermod|users|uudecode|uuencode|v|vdir|vi|vim|virsh|vmstat|wait|watch|wc|wget|whereis|which|who|whoami|write|xargs|xdg-open|yarn|yes|zenity|zip|zsh|zypper)(?=$|[)\s;|&])/,lookbehind:!0},keyword:{pattern:/(^|[\s;|&]|[<>]\()(?:if|then|else|elif|fi|for|while|in|case|esac|function|select|do|done|until)(?=$|[)\s;|&])/,lookbehind:!0},builtin:{pattern:/(^|[\s;|&]|[<>]\()(?:\.|:|break|cd|continue|eval|exec|exit|export|getopts|hash|pwd|readonly|return|shift|test|times|trap|umask|unset|alias|bind|builtin|caller|command|declare|echo|enable|help|let|local|logout|mapfile|printf|read|readarray|source|type|typeset|ulimit|unalias|set|shopt)(?=$|[)\s;|&])/,lookbehind:!0,alias:"class-name"},boolean:{pattern:/(^|[\s;|&]|[<>]\()(?:true|false)(?=$|[)\s;|&])/,lookbehind:!0},"file-descriptor":{pattern:/\B&\d\b/,alias:"important"},operator:{pattern:/\d?<>|>\||\+=|==?|!=?|=~|<<[<-]?|[&\d]?>>|\d?[<>]&?|&[>&]?|\|[&|]?|<=?|>=?/,inside:{"file-descriptor":{pattern:/^\d/,alias:"important"}}},punctuation:/\$?\(\(?|\)\)?|\.\.|[{}[\];\\]/,number:{pattern:/(^|\s)(?:[1-9]\d*|0)(?:[.,]\d+)?\b/,lookbehind:!0}},n.inside=e.languages.bash;for(var s=["comment","function-name","for-or-select","assign-left","string","environment","function","keyword","builtin","boolean","file-descriptor","operator","punctuation","number"],i=a.variable[1].inside,o=0;o>=?|<<=?|->|([-+&|:])\1|[?:~]|[-+*/%&|^!=<>]=?/}),Prism.languages.insertBefore("c","string",{macro:{pattern:/(^\s*)#\s*[a-z](?:[^\r\n\\/]|\/(?!\*)|\/\*(?:[^*]|\*(?!\/))*\*\/|\\(?:\r\n|[\s\S]))*/im,lookbehind:!0,greedy:!0,alias:"property",inside:{string:[{pattern:/^(#\s*include\s*)<[^>]+>/,lookbehind:!0},Prism.languages.c.string],comment:Prism.languages.c.comment,"macro-name":[{pattern:/(^#\s*define\s+)\w+\b(?!\()/i,lookbehind:!0},{pattern:/(^#\s*define\s+)\w+\b(?=\()/i,lookbehind:!0,alias:"function"}],directive:{pattern:/^(#\s*)[a-z]+/,lookbehind:!0,alias:"keyword"},"directive-hash":/^#/,punctuation:/##|\\(?=[\r\n])/,expression:{pattern:/\S[\s\S]*/,inside:Prism.languages.c}}},constant:/\b(?:__FILE__|__LINE__|__DATE__|__TIME__|__TIMESTAMP__|__func__|EOF|NULL|SEEK_CUR|SEEK_END|SEEK_SET|stdin|stdout|stderr)\b/}),delete Prism.languages.c.boolean; +!function(e){var t=/\b(?:alignas|alignof|asm|auto|bool|break|case|catch|char|char8_t|char16_t|char32_t|class|compl|concept|const|consteval|constexpr|constinit|const_cast|continue|co_await|co_return|co_yield|decltype|default|delete|do|double|dynamic_cast|else|enum|explicit|export|extern|final|float|for|friend|goto|if|import|inline|int|int8_t|int16_t|int32_t|int64_t|uint8_t|uint16_t|uint32_t|uint64_t|long|module|mutable|namespace|new|noexcept|nullptr|operator|override|private|protected|public|register|reinterpret_cast|requires|return|short|signed|sizeof|static|static_assert|static_cast|struct|switch|template|this|thread_local|throw|try|typedef|typeid|typename|union|unsigned|using|virtual|void|volatile|wchar_t|while)\b/,n="\\b(?!)\\w+(?:\\s*\\.\\s*\\w+)*\\b".replace(//g,function(){return t.source});e.languages.cpp=e.languages.extend("c",{"class-name":[{pattern:RegExp("(\\b(?:class|concept|enum|struct|typename)\\s+)(?!)\\w+".replace(//g,function(){return t.source})),lookbehind:!0},/\b[A-Z]\w*(?=\s*::\s*\w+\s*\()/,/\b[A-Z_]\w*(?=\s*::\s*~\w+\s*\()/i,/\w+(?=\s*<(?:[^<>]|<(?:[^<>]|<[^<>]*>)*>)*>\s*::\s*\w+\s*\()/],keyword:t,number:{pattern:/(?:\b0b[01']+|\b0x(?:[\da-f']+(?:\.[\da-f']*)?|\.[\da-f']+)(?:p[+-]?[\d']+)?|(?:\b[\d']+(?:\.[\d']*)?|\B\.[\d']+)(?:e[+-]?[\d']+)?)[ful]{0,4}/i,greedy:!0},operator:/>>=?|<<=?|->|--|\+\+|&&|\|\||[?:~]|<=>|[-+*/%&|^!=<>]=?|\b(?:and|and_eq|bitand|bitor|not|not_eq|or|or_eq|xor|xor_eq)\b/,boolean:/\b(?:true|false)\b/}),e.languages.insertBefore("cpp","string",{module:{pattern:RegExp('(\\b(?:module|import)\\s+)(?:"(?:\\\\(?:\r\n|[^])|[^"\\\\\r\n])*"|<[^<>\r\n]*>|'+"(?:\\s*:\\s*)?|:\\s*".replace(//g,function(){return n})+")"),lookbehind:!0,greedy:!0,inside:{string:/^[<"][\s\S]+/,operator:/:/,punctuation:/\./}},"raw-string":{pattern:/R"([^()\\ ]{0,16})\([\s\S]*?\)\1"/,alias:"string",greedy:!0}}),e.languages.insertBefore("cpp","keyword",{"generic-function":{pattern:/\b[a-z_]\w*\s*<(?:[^<>]|<(?:[^<>])*>)*>(?=\s*\()/i,inside:{function:/^\w+/,generic:{pattern:/<[\s\S]+/,alias:"class-name",inside:e.languages.cpp}}}}),e.languages.insertBefore("cpp","operator",{"double-colon":{pattern:/::/,alias:"punctuation"}}),e.languages.insertBefore("cpp","class-name",{"base-clause":{pattern:/(\b(?:class|struct)\s+\w+\s*:\s*)[^;{}"'\s]+(?:\s+[^;{}"'\s]+)*(?=\s*[;{])/,lookbehind:!0,greedy:!0,inside:e.languages.extend("cpp",{})}}),e.languages.insertBefore("inside","double-colon",{"class-name":/\b[a-z_]\w*\b(?!\s*::)/i},e.languages.cpp["base-clause"])}(Prism); +!function(e){var t=/#(?!\{).+/,n={pattern:/#\{[^}]+\}/,alias:"variable"};e.languages.coffeescript=e.languages.extend("javascript",{comment:t,string:[{pattern:/'(?:\\[\s\S]|[^\\'])*'/,greedy:!0},{pattern:/"(?:\\[\s\S]|[^\\"])*"/,greedy:!0,inside:{interpolation:n}}],keyword:/\b(?:and|break|by|catch|class|continue|debugger|delete|do|each|else|extend|extends|false|finally|for|if|in|instanceof|is|isnt|let|loop|namespace|new|no|not|null|of|off|on|or|own|return|super|switch|then|this|throw|true|try|typeof|undefined|unless|until|when|while|window|with|yes|yield)\b/,"class-member":{pattern:/@(?!\d)\w+/,alias:"variable"}}),e.languages.insertBefore("coffeescript","comment",{"multiline-comment":{pattern:/###[\s\S]+?###/,alias:"comment"},"block-regex":{pattern:/\/{3}[\s\S]*?\/{3}/,alias:"regex",inside:{comment:t,interpolation:n}}}),e.languages.insertBefore("coffeescript","string",{"inline-javascript":{pattern:/`(?:\\[\s\S]|[^\\`])*`/,inside:{delimiter:{pattern:/^`|`$/,alias:"punctuation"},script:{pattern:/[\s\S]+/,alias:"language-javascript",inside:e.languages.javascript}}},"multiline-string":[{pattern:/'''[\s\S]*?'''/,greedy:!0,alias:"string"},{pattern:/"""[\s\S]*?"""/,greedy:!0,alias:"string",inside:{interpolation:n}}]}),e.languages.insertBefore("coffeescript","keyword",{property:/(?!\d)\w+(?=\s*:(?!:))/}),delete e.languages.coffeescript["template-string"],e.languages.coffee=e.languages.coffeescript}(Prism); +!function(e){var a=[/\b(?:async|sync|yield)\*/,/\b(?:abstract|assert|async|await|break|case|catch|class|const|continue|covariant|default|deferred|do|dynamic|else|enum|export|extension|external|extends|factory|final|finally|for|get|hide|if|implements|interface|import|in|library|mixin|new|null|on|operator|part|rethrow|return|set|show|static|super|switch|sync|this|throw|try|typedef|var|void|while|with|yield)\b/],t="(^|[^\\w.])(?:[a-z]\\w*\\s*\\.\\s*)*(?:[A-Z]\\w*\\s*\\.\\s*)*",s={pattern:RegExp(t+"[A-Z](?:[\\d_A-Z]*[a-z]\\w*)?\\b"),lookbehind:!0,inside:{namespace:{pattern:/^[a-z]\w*(?:\s*\.\s*[a-z]\w*)*(?:\s*\.)?/,inside:{punctuation:/\./}}}};e.languages.dart=e.languages.extend("clike",{string:[{pattern:/r?("""|''')[\s\S]*?\1/,greedy:!0},{pattern:/r?(["'])(?:\\.|(?!\1)[^\\\r\n])*\1/,greedy:!0}],"class-name":[s,{pattern:RegExp(t+"[A-Z]\\w*(?=\\s+\\w+\\s*[;,=()])"),lookbehind:!0,inside:s.inside}],keyword:a,operator:/\bis!|\b(?:as|is)\b|\+\+|--|&&|\|\||<<=?|>>=?|~(?:\/=?)?|[+\-*\/%&^|=!<>]=?|\?/}),e.languages.insertBefore("dart","function",{metadata:{pattern:/@\w+/,alias:"symbol"}}),e.languages.insertBefore("dart","class-name",{generics:{pattern:/<(?:[\w\s,.&?]|<(?:[\w\s,.&?]|<(?:[\w\s,.&?]|<[\w\s,.&?]*>)*>)*>)*>/,inside:{"class-name":s,keyword:a,punctuation:/[<>(),.:]/,operator:/[?&|]/}}})}(Prism); +!function(e){var r="(?:[ \t]+(?![ \t])(?:)?|)".replace(//g,function(){return"\\\\[\r\n](?:\\s|\\\\[\r\n]|#.*(?!.))*(?![\\s#]|\\\\[\r\n])"}),n="\"(?:[^\"\\\\\r\n]|\\\\(?:\r\n|[^]))*\"|'(?:[^'\\\\\r\n]|\\\\(?:\r\n|[^]))*'",t="--[\\w-]+=(?:|(?![\"'])(?:[^\\s\\\\]|\\\\.)+)".replace(//g,function(){return n}),o={pattern:RegExp(n),greedy:!0},i={pattern:/(^[ \t]*)#.*/m,lookbehind:!0,greedy:!0};function a(e,n){return e=e.replace(//g,function(){return t}).replace(//g,function(){return r}),RegExp(e,n)}e.languages.docker={instruction:{pattern:/(^[ \t]*)(?:ADD|ARG|CMD|COPY|ENTRYPOINT|ENV|EXPOSE|FROM|HEALTHCHECK|LABEL|MAINTAINER|ONBUILD|RUN|SHELL|STOPSIGNAL|USER|VOLUME|WORKDIR)(?=\s)(?:\\.|[^\r\n\\])*(?:\\$(?:\s|#.*$)*(?![\s#])(?:\\.|[^\r\n\\])*)*/im,lookbehind:!0,greedy:!0,inside:{options:{pattern:a("(^(?:ONBUILD)?\\w+)(?:)*","i"),lookbehind:!0,greedy:!0,inside:{property:{pattern:/(^|\s)--[\w-]+/,lookbehind:!0},string:[o,{pattern:/(=)(?!["'])(?:[^\s\\]|\\.)+/,lookbehind:!0}],operator:/\\$/m,punctuation:/=/}},keyword:[{pattern:a("(^(?:ONBUILD)?HEALTHCHECK(?:)*)(?:CMD|NONE)\\b","i"),lookbehind:!0,greedy:!0},{pattern:a("(^(?:ONBUILD)?FROM(?:)*(?!--)[^ \t\\\\]+)AS","i"),lookbehind:!0,greedy:!0},{pattern:a("(^ONBUILD)\\w+","i"),lookbehind:!0,greedy:!0},{pattern:/^\w+/,greedy:!0}],comment:i,string:o,variable:/\$(?:\w+|\{[^{}"'\\]*\})/,operator:/\\$/m}},comment:i},e.languages.dockerfile=e.languages.docker}(Prism); +Prism.languages.elm={comment:/--.*|{-[\s\S]*?-}/,char:{pattern:/'(?:[^\\'\r\n]|\\(?:[abfnrtv\\']|\d+|x[0-9a-fA-F]+))'/,greedy:!0},string:[{pattern:/"""[\s\S]*?"""/,greedy:!0},{pattern:/"(?:[^\\"\r\n]|\\.)*"/,greedy:!0}],"import-statement":{pattern:/^\s*import\s+[A-Z]\w*(?:\.[A-Z]\w*)*(?:\s+as\s+(?:[A-Z]\w*)(?:\.[A-Z]\w*)*)?(?:\s+exposing\s+)?/m,inside:{keyword:/\b(?:import|as|exposing)\b/}},keyword:/\b(?:alias|as|case|else|exposing|if|in|infixl|infixr|let|module|of|then|type)\b/,builtin:/\b(?:abs|acos|always|asin|atan|atan2|ceiling|clamp|compare|cos|curry|degrees|e|flip|floor|fromPolar|identity|isInfinite|isNaN|logBase|max|min|negate|never|not|pi|radians|rem|round|sin|sqrt|tan|toFloat|toPolar|toString|truncate|turns|uncurry|xor)\b/,number:/\b(?:\d+(?:\.\d+)?(?:e[+-]?\d+)?|0x[0-9a-f]+)\b/i,operator:/\s\.\s|[+\-/*=.$<>:&|^?%#@~!]{2,}|[+\-/*=$<>:&|^?%#@~!]/,hvariable:/\b(?:[A-Z]\w*\.)*[a-z]\w*\b/,constant:/\b(?:[A-Z]\w*\.)*[A-Z]\w*\b/,punctuation:/[{}[\]|(),.:]/}; +Prism.languages.git={comment:/^#.*/m,deleted:/^[-–].*/m,inserted:/^\+.*/m,string:/("|')(?:\\.|(?!\1)[^\\\r\n])*\1/m,command:{pattern:/^.*\$ git .*$/m,inside:{parameter:/\s--?\w+/m}},coord:/^@@.*@@$/m,"commit-sha1":/^commit \w{40}$/m}; +Prism.languages.go=Prism.languages.extend("clike",{string:{pattern:/(["'`])(?:\\[\s\S]|(?!\1)[^\\])*\1/,greedy:!0},keyword:/\b(?:break|case|chan|const|continue|default|defer|else|fallthrough|for|func|go(?:to)?|if|import|interface|map|package|range|return|select|struct|switch|type|var)\b/,boolean:/\b(?:_|iota|nil|true|false)\b/,number:/(?:\b0x[a-f\d]+|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e[-+]?\d+)?)i?/i,operator:/[*\/%^!=]=?|\+[=+]?|-[=-]?|\|[=|]?|&(?:=|&|\^=?)?|>(?:>=?|=)?|<(?:<=?|=|-)?|:=|\.\.\./,builtin:/\b(?:bool|byte|complex(?:64|128)|error|float(?:32|64)|rune|string|u?int(?:8|16|32|64)?|uintptr|append|cap|close|complex|copy|delete|imag|len|make|new|panic|print(?:ln)?|real|recover)\b/}),delete Prism.languages.go["class-name"]; +Prism.languages.graphql={comment:/#.*/,description:{pattern:/(?:"""(?:[^"]|(?!""")")*"""|"(?:\\.|[^\\"\r\n])*")(?=\s*[a-z_])/i,greedy:!0,alias:"string",inside:{"language-markdown":{pattern:/(^"(?:"")?)(?!\1)[\s\S]+(?=\1$)/,lookbehind:!0,inside:Prism.languages.markdown}}},string:{pattern:/"""(?:[^"]|(?!""")")*"""|"(?:\\.|[^\\"\r\n])*"/,greedy:!0},number:/(?:\B-|\b)\d+(?:\.\d+)?(?:e[+-]?\d+)?\b/i,boolean:/\b(?:true|false)\b/,variable:/\$[a-z_]\w*/i,directive:{pattern:/@[a-z_]\w*/i,alias:"function"},"attr-name":{pattern:/[a-z_]\w*(?=\s*(?:\((?:[^()"]|"(?:\\.|[^\\"\r\n])*")*\))?:)/i,greedy:!0},"class-name":{pattern:/(\b(?:enum|implements|interface|on|scalar|type|union)\s+|&\s*)[a-zA-Z_]\w*/,lookbehind:!0},fragment:{pattern:/(\bfragment\s+|\.{3}\s*(?!on\b))[a-zA-Z_]\w*/,lookbehind:!0,alias:"function"},keyword:/\b(?:directive|enum|extend|fragment|implements|input|interface|mutation|on|query|repeatable|scalar|schema|subscription|type|union)\b/,operator:/[!=|&]|\.{3}/,punctuation:/[!(){}\[\]:=,]/,constant:/\b(?!ID\b)[A-Z][A-Z_\d]*\b/}; +!function(h){function v(e,n){return"___"+e.toUpperCase()+n+"___"}Object.defineProperties(h.languages["markup-templating"]={},{buildPlaceholders:{value:function(a,r,e,o){if(a.language===r){var c=a.tokenStack=[];a.code=a.code.replace(e,function(e){if("function"==typeof o&&!o(e))return e;for(var n,t=c.length;-1!==a.code.indexOf(n=v(r,t));)++t;return c[t]=e,n}),a.grammar=h.languages.markup}}},tokenizePlaceholders:{value:function(p,k){if(p.language===k&&p.tokenStack){p.grammar=h.languages[k];var m=0,d=Object.keys(p.tokenStack);!function e(n){for(var t=0;t=d.length);t++){var a=n[t];if("string"==typeof a||a.content&&"string"==typeof a.content){var r=d[m],o=p.tokenStack[r],c="string"==typeof a?a:a.content,i=v(k,r),u=c.indexOf(i);if(-1@\[\\\]^`{|}~]/,variable:/[^!"#%&'()*+,\/;<=>@\[\\\]^`{|}~\s]+/},e.hooks.add("before-tokenize",function(a){e.languages["markup-templating"].buildPlaceholders(a,"handlebars",/\{\{\{[\s\S]+?\}\}\}|\{\{[\s\S]+?\}\}/g)}),e.hooks.add("after-tokenize",function(a){e.languages["markup-templating"].tokenizePlaceholders(a,"handlebars")})}(Prism); +Prism.languages.haskell={comment:{pattern:/(^|[^-!#$%*+=?&@|~.:<>^\\\/])(?:--(?:(?=.)[^-!#$%*+=?&@|~.:<>^\\\/].*|$)|{-[\s\S]*?-})/m,lookbehind:!0},char:{pattern:/'(?:[^\\']|\\(?:[abfnrtv\\"'&]|\^[A-Z@[\]^_]|NUL|SOH|STX|ETX|EOT|ENQ|ACK|BEL|BS|HT|LF|VT|FF|CR|SO|SI|DLE|DC1|DC2|DC3|DC4|NAK|SYN|ETB|CAN|EM|SUB|ESC|FS|GS|RS|US|SP|DEL|\d+|o[0-7]+|x[0-9a-fA-F]+))'/,alias:"string"},string:{pattern:/"(?:[^\\"]|\\(?:\S|\s+\\))*"/,greedy:!0},keyword:/\b(?:case|class|data|deriving|do|else|if|in|infixl|infixr|instance|let|module|newtype|of|primitive|then|type|where)\b/,"import-statement":{pattern:/(^\s*)import\s+(?:qualified\s+)?(?:[A-Z][\w']*)(?:\.[A-Z][\w']*)*(?:\s+as\s+(?:[A-Z][\w']*)(?:\.[A-Z][\w']*)*)?(?:\s+hiding\b)?/m,lookbehind:!0,inside:{keyword:/\b(?:import|qualified|as|hiding)\b/}},builtin:/\b(?:abs|acos|acosh|all|and|any|appendFile|approxRational|asTypeOf|asin|asinh|atan|atan2|atanh|basicIORun|break|catch|ceiling|chr|compare|concat|concatMap|const|cos|cosh|curry|cycle|decodeFloat|denominator|digitToInt|div|divMod|drop|dropWhile|either|elem|encodeFloat|enumFrom|enumFromThen|enumFromThenTo|enumFromTo|error|even|exp|exponent|fail|filter|flip|floatDigits|floatRadix|floatRange|floor|fmap|foldl|foldl1|foldr|foldr1|fromDouble|fromEnum|fromInt|fromInteger|fromIntegral|fromRational|fst|gcd|getChar|getContents|getLine|group|head|id|inRange|index|init|intToDigit|interact|ioError|isAlpha|isAlphaNum|isAscii|isControl|isDenormalized|isDigit|isHexDigit|isIEEE|isInfinite|isLower|isNaN|isNegativeZero|isOctDigit|isPrint|isSpace|isUpper|iterate|last|lcm|length|lex|lexDigits|lexLitChar|lines|log|logBase|lookup|map|mapM|mapM_|max|maxBound|maximum|maybe|min|minBound|minimum|mod|negate|not|notElem|null|numerator|odd|or|ord|otherwise|pack|pi|pred|primExitWith|print|product|properFraction|putChar|putStr|putStrLn|quot|quotRem|range|rangeSize|read|readDec|readFile|readFloat|readHex|readIO|readInt|readList|readLitChar|readLn|readOct|readParen|readSigned|reads|readsPrec|realToFrac|recip|rem|repeat|replicate|return|reverse|round|scaleFloat|scanl|scanl1|scanr|scanr1|seq|sequence|sequence_|show|showChar|showInt|showList|showLitChar|showParen|showSigned|showString|shows|showsPrec|significand|signum|sin|sinh|snd|sort|span|splitAt|sqrt|subtract|succ|sum|tail|take|takeWhile|tan|tanh|threadToIOResult|toEnum|toInt|toInteger|toLower|toRational|toUpper|truncate|uncurry|undefined|unlines|until|unwords|unzip|unzip3|userError|words|writeFile|zip|zip3|zipWith|zipWith3)\b/,number:/\b(?:\d+(?:\.\d+)?(?:e[+-]?\d+)?|0o[0-7]+|0x[0-9a-f]+)\b/i,operator:/\s\.\s|[-!#$%*+=?&@|~:<>^\\\/]*\.[-!#$%*+=?&@|~.:<>^\\\/]+|[-!#$%*+=?&@|~.:<>^\\\/]+\.[-!#$%*+=?&@|~:<>^\\\/]*|[-!#$%*+=?&@|~:<>^\\\/]+|`(?:[A-Z][\w']*\.)*[_a-z][\w']*`/,hvariable:/\b(?:[A-Z][\w']*\.)*[_a-z][\w']*\b/,constant:/\b(?:[A-Z][\w']*\.)*[A-Z][\w']*\b/,punctuation:/[{}[\];(),.:]/},Prism.languages.hs=Prism.languages.haskell; +!function(t){t.languages.http={"request-line":{pattern:/^(?:GET|HEAD|POST|PUT|DELETE|CONNECT|OPTIONS|TRACE|PATCH|PRI|SEARCH)\s(?:https?:\/\/|\/)\S*\sHTTP\/[0-9.]+/m,inside:{method:{pattern:/^[A-Z]+\b/,alias:"property"},"request-target":{pattern:/^(\s)(?:https?:\/\/|\/)\S*(?=\s)/,lookbehind:!0,alias:"url",inside:t.languages.uri},"http-version":{pattern:/^(\s)HTTP\/[0-9.]+/,lookbehind:!0,alias:"property"}}},"response-status":{pattern:/^HTTP\/[0-9.]+ \d+ .+/m,inside:{"http-version":{pattern:/^HTTP\/[0-9.]+/,alias:"property"},"status-code":{pattern:/^(\s)\d+(?=\s)/,lookbehind:!0,alias:"number"},"reason-phrase":{pattern:/^(\s).+/,lookbehind:!0,alias:"string"}}},"header-name":{pattern:/^[\w-]+:(?=.)/m,alias:"keyword"}};var a,e,s,n=t.languages,r={"application/javascript":n.javascript,"application/json":n.json||n.javascript,"application/xml":n.xml,"text/xml":n.xml,"text/html":n.html,"text/css":n.css},i={"application/json":!0,"application/xml":!0};for(var p in r)if(r[p]){a=a||{};var o=i[p]?(void 0,s=(e=p).replace(/^[a-z]+\//,""),"(?:"+e+"|\\w+/(?:[\\w.-]+\\+)+"+s+"(?![+\\w.-]))"):p;a[p.replace(/\//g,"-")]={pattern:RegExp("(content-type:\\s*"+o+"(?:(?:\\r\\n?|\\n).+)*)(?:\\r?\\n|\\r){2}[\\s\\S]*","i"),lookbehind:!0,inside:r[p]}}a&&t.languages.insertBefore("http","header-name",a)}(Prism); +!function(n){n.languages.ignore={comment:/^#.*/m,entry:{pattern:/\S(?:.*(?:(?:\\ )|\S))?/,alias:"string",inside:{operator:/^!|\*\*?|\?/,regex:{pattern:/(^|[^\\])\[[^\[\]]*\]/,lookbehind:!0},punctuation:/\//}}},n.languages.gitignore=n.languages.ignore,n.languages.hgignore=n.languages.ignore,n.languages.npmignore=n.languages.ignore}(Prism); +!function(e){var t=/\b(?:abstract|assert|boolean|break|byte|case|catch|char|class|const|continue|default|do|double|else|enum|exports|extends|final|finally|float|for|goto|if|implements|import|instanceof|int|interface|long|module|native|new|non-sealed|null|open|opens|package|permits|private|protected|provides|public|record|requires|return|sealed|short|static|strictfp|super|switch|synchronized|this|throw|throws|to|transient|transitive|try|uses|var|void|volatile|while|with|yield)\b/,n="(^|[^\\w.])(?:[a-z]\\w*\\s*\\.\\s*)*(?:[A-Z]\\w*\\s*\\.\\s*)*",a={pattern:RegExp(n+"[A-Z](?:[\\d_A-Z]*[a-z]\\w*)?\\b"),lookbehind:!0,inside:{namespace:{pattern:/^[a-z]\w*(?:\s*\.\s*[a-z]\w*)*(?:\s*\.)?/,inside:{punctuation:/\./}},punctuation:/\./}};e.languages.java=e.languages.extend("clike",{"class-name":[a,{pattern:RegExp(n+"[A-Z]\\w*(?=\\s+\\w+\\s*[;,=())])"),lookbehind:!0,inside:a.inside}],keyword:t,function:[e.languages.clike.function,{pattern:/(\:\:\s*)[a-z_]\w*/,lookbehind:!0}],number:/\b0b[01][01_]*L?\b|\b0x(?:\.[\da-f_p+-]+|[\da-f_]+(?:\.[\da-f_p+-]+)?)\b|(?:\b\d[\d_]*(?:\.[\d_]*)?|\B\.\d[\d_]*)(?:e[+-]?\d[\d_]*)?[dfl]?/i,operator:{pattern:/(^|[^.])(?:<<=?|>>>?=?|->|--|\+\+|&&|\|\||::|[?:~]|[-+*/%&|^!=<>]=?)/m,lookbehind:!0}}),e.languages.insertBefore("java","string",{"triple-quoted-string":{pattern:/"""[ \t]*[\r\n](?:(?:"|"")?(?:\\.|[^"\\]))*"""/,greedy:!0,alias:"string"}}),e.languages.insertBefore("java","class-name",{annotation:{pattern:/(^|[^.])@\w+(?:\s*\.\s*\w+)*/,lookbehind:!0,alias:"punctuation"},generics:{pattern:/<(?:[\w\s,.?]|&(?!&)|<(?:[\w\s,.?]|&(?!&)|<(?:[\w\s,.?]|&(?!&)|<(?:[\w\s,.?]|&(?!&))*>)*>)*>)*>/,inside:{"class-name":a,keyword:t,punctuation:/[<>(),.:]/,operator:/[?&|]/}},namespace:{pattern:RegExp("(\\b(?:exports|import(?:\\s+static)?|module|open|opens|package|provides|requires|to|transitive|uses|with)\\s+)(?!)[a-z]\\w*(?:\\.[a-z]\\w*)*\\.?".replace(//g,function(){return t.source})),lookbehind:!0,inside:{punctuation:/\./}}})}(Prism); +Prism.languages.json={property:{pattern:/(^|[^\\])"(?:\\.|[^\\"\r\n])*"(?=\s*:)/,lookbehind:!0,greedy:!0},string:{pattern:/(^|[^\\])"(?:\\.|[^\\"\r\n])*"(?!\s*:)/,lookbehind:!0,greedy:!0},comment:{pattern:/\/\/.*|\/\*[\s\S]*?(?:\*\/|$)/,greedy:!0},number:/-?\b\d+(?:\.\d+)?(?:e[+-]?\d+)?\b/i,punctuation:/[{}[\],]/,operator:/:/,boolean:/\b(?:true|false)\b/,null:{pattern:/\bnull\b/,alias:"keyword"}},Prism.languages.webmanifest=Prism.languages.json; +!function(e){e.languages.kotlin=e.languages.extend("clike",{keyword:{pattern:/(^|[^.])\b(?:abstract|actual|annotation|as|break|by|catch|class|companion|const|constructor|continue|crossinline|data|do|dynamic|else|enum|expect|external|final|finally|for|fun|get|if|import|in|infix|init|inline|inner|interface|internal|is|lateinit|noinline|null|object|open|operator|out|override|package|private|protected|public|reified|return|sealed|set|super|suspend|tailrec|this|throw|to|try|typealias|val|var|vararg|when|where|while)\b/,lookbehind:!0},function:[{pattern:/(?:`[^\r\n`]+`|\w+)(?=\s*\()/,greedy:!0},{pattern:/(\.)(?:`[^\r\n`]+`|\w+)(?=\s*\{)/,lookbehind:!0,greedy:!0}],number:/\b(?:0[xX][\da-fA-F]+(?:_[\da-fA-F]+)*|0[bB][01]+(?:_[01]+)*|\d+(?:_\d+)*(?:\.\d+(?:_\d+)*)?(?:[eE][+-]?\d+(?:_\d+)*)?[fFL]?)\b/,operator:/\+[+=]?|-[-=>]?|==?=?|!(?:!|==?)?|[\/*%<>]=?|[?:]:?|\.\.|&&|\|\||\b(?:and|inv|or|shl|shr|ushr|xor)\b/}),delete e.languages.kotlin["class-name"],e.languages.insertBefore("kotlin","string",{"raw-string":{pattern:/("""|''')[\s\S]*?\1/,alias:"string"}}),e.languages.insertBefore("kotlin","keyword",{annotation:{pattern:/\B@(?:\w+:)?(?:[A-Z]\w*|\[[^\]]+\])/,alias:"builtin"}}),e.languages.insertBefore("kotlin","function",{label:{pattern:/\w+@|@\w+/,alias:"symbol"}});var n=[{pattern:/\$\{[^}]+\}/,inside:{delimiter:{pattern:/^\$\{|\}$/,alias:"variable"},rest:e.languages.kotlin}},{pattern:/\$\w+/,alias:"variable"}];e.languages.kotlin.string.inside=e.languages.kotlin["raw-string"].inside={interpolation:n},e.languages.kt=e.languages.kotlin,e.languages.kts=e.languages.kotlin}(Prism); +Prism.languages.less=Prism.languages.extend("css",{comment:[/\/\*[\s\S]*?\*\//,{pattern:/(^|[^\\])\/\/.*/,lookbehind:!0}],atrule:{pattern:/@[\w-](?:\((?:[^(){}]|\([^(){}]*\))*\)|[^(){};\s]|\s+(?!\s))*?(?=\s*\{)/,inside:{punctuation:/[:()]/}},selector:{pattern:/(?:@\{[\w-]+\}|[^{};\s@])(?:@\{[\w-]+\}|\((?:[^(){}]|\([^(){}]*\))*\)|[^(){};@\s]|\s+(?!\s))*?(?=\s*\{)/,inside:{variable:/@+[\w-]+/}},property:/(?:@\{[\w-]+\}|[\w-])+(?:\+_?)?(?=\s*:)/i,operator:/[+\-*\/]/}),Prism.languages.insertBefore("less","property",{variable:[{pattern:/@[\w-]+\s*:/,inside:{punctuation:/:/}},/@@?[\w-]+/],"mixin-usage":{pattern:/([{;]\s*)[.#](?!\d)[\w-].*?(?=[(;])/,lookbehind:!0,alias:"function"}}); +!function(u){function n(n){return n=n.replace(//g,function(){return"(?:\\\\.|[^\\\\\n\r]|(?:\n|\r\n?)(?!\n|\r\n?))"}),RegExp("((?:^|[^\\\\])(?:\\\\{2})*)(?:"+n+")")}var e="(?:\\\\.|``(?:[^`\r\n]|`(?!`))+``|`[^`\r\n]+`|[^\\\\|\r\n`])+",t="\\|?__(?:\\|__)+\\|?(?:(?:\n|\r\n?)|(?![^]))".replace(/__/g,function(){return e}),a="\\|?[ \t]*:?-{3,}:?[ \t]*(?:\\|[ \t]*:?-{3,}:?[ \t]*)+\\|?(?:\n|\r\n?)";u.languages.markdown=u.languages.extend("markup",{}),u.languages.insertBefore("markdown","prolog",{"front-matter-block":{pattern:/(^(?:\s*[\r\n])?)---(?!.)[\s\S]*?[\r\n]---(?!.)/,lookbehind:!0,greedy:!0,inside:{punctuation:/^---|---$/,"font-matter":{pattern:/\S+(?:\s+\S+)*/,alias:["yaml","language-yaml"],inside:u.languages.yaml}}},blockquote:{pattern:/^>(?:[\t ]*>)*/m,alias:"punctuation"},table:{pattern:RegExp("^"+t+a+"(?:"+t+")*","m"),inside:{"table-data-rows":{pattern:RegExp("^("+t+a+")(?:"+t+")*$"),lookbehind:!0,inside:{"table-data":{pattern:RegExp(e),inside:u.languages.markdown},punctuation:/\|/}},"table-line":{pattern:RegExp("^("+t+")"+a+"$"),lookbehind:!0,inside:{punctuation:/\||:?-{3,}:?/}},"table-header-row":{pattern:RegExp("^"+t+"$"),inside:{"table-header":{pattern:RegExp(e),alias:"important",inside:u.languages.markdown},punctuation:/\|/}}}},code:[{pattern:/((?:^|\n)[ \t]*\n|(?:^|\r\n?)[ \t]*\r\n?)(?: {4}|\t).+(?:(?:\n|\r\n?)(?: {4}|\t).+)*/,lookbehind:!0,alias:"keyword"},{pattern:/``.+?``|`[^`\r\n]+`/,alias:"keyword"},{pattern:/^```[\s\S]*?^```$/m,greedy:!0,inside:{"code-block":{pattern:/^(```.*(?:\n|\r\n?))[\s\S]+?(?=(?:\n|\r\n?)^```$)/m,lookbehind:!0},"code-language":{pattern:/^(```).+/,lookbehind:!0},punctuation:/```/}}],title:[{pattern:/\S.*(?:\n|\r\n?)(?:==+|--+)(?=[ \t]*$)/m,alias:"important",inside:{punctuation:/==+$|--+$/}},{pattern:/(^\s*)#.+/m,lookbehind:!0,alias:"important",inside:{punctuation:/^#+|#+$/}}],hr:{pattern:/(^\s*)([*-])(?:[\t ]*\2){2,}(?=\s*$)/m,lookbehind:!0,alias:"punctuation"},list:{pattern:/(^\s*)(?:[*+-]|\d+\.)(?=[\t ].)/m,lookbehind:!0,alias:"punctuation"},"url-reference":{pattern:/!?\[[^\]]+\]:[\t ]+(?:\S+|<(?:\\.|[^>\\])+>)(?:[\t ]+(?:"(?:\\.|[^"\\])*"|'(?:\\.|[^'\\])*'|\((?:\\.|[^)\\])*\)))?/,inside:{variable:{pattern:/^(!?\[)[^\]]+/,lookbehind:!0},string:/(?:"(?:\\.|[^"\\])*"|'(?:\\.|[^'\\])*'|\((?:\\.|[^)\\])*\))$/,punctuation:/^[\[\]!:]|[<>]/},alias:"url"},bold:{pattern:n("\\b__(?:(?!_)|_(?:(?!_))+_)+__\\b|\\*\\*(?:(?!\\*)|\\*(?:(?!\\*))+\\*)+\\*\\*"),lookbehind:!0,greedy:!0,inside:{content:{pattern:/(^..)[\s\S]+(?=..$)/,lookbehind:!0,inside:{}},punctuation:/\*\*|__/}},italic:{pattern:n("\\b_(?:(?!_)|__(?:(?!_))+__)+_\\b|\\*(?:(?!\\*)|\\*\\*(?:(?!\\*))+\\*\\*)+\\*"),lookbehind:!0,greedy:!0,inside:{content:{pattern:/(^.)[\s\S]+(?=.$)/,lookbehind:!0,inside:{}},punctuation:/[*_]/}},strike:{pattern:n("(~~?)(?:(?!~))+?\\2"),lookbehind:!0,greedy:!0,inside:{content:{pattern:/(^~~?)[\s\S]+(?=\1$)/,lookbehind:!0,inside:{}},punctuation:/~~?/}},url:{pattern:n('!?\\[(?:(?!\\]))+\\](?:\\([^\\s)]+(?:[\t ]+"(?:\\\\.|[^"\\\\])*")?\\)|[ \t]?\\[(?:(?!\\]))+\\])'),lookbehind:!0,greedy:!0,inside:{operator:/^!/,content:{pattern:/(^\[)[^\]]+(?=\])/,lookbehind:!0,inside:{}},variable:{pattern:/(^\][ \t]?\[)[^\]]+(?=\]$)/,lookbehind:!0},url:{pattern:/(^\]\()[^\s)]+/,lookbehind:!0},string:{pattern:/(^[ \t]+)"(?:\\.|[^"\\])*"(?=\)$)/,lookbehind:!0}}}}),["url","bold","italic","strike"].forEach(function(e){["url","bold","italic","strike"].forEach(function(n){e!==n&&(u.languages.markdown[e].inside.content.inside[n]=u.languages.markdown[n])})}),u.hooks.add("after-tokenize",function(n){"markdown"!==n.language&&"md"!==n.language||!function n(e){if(e&&"string"!=typeof e)for(var t=0,a=e.length;t|\?\?=?|\.{3}|\??->|[!=]=?=?|::|\*\*=?|--|\+\+|&&|\|\||<<|>>|[?~]|[/^|%*&<>.+-]=?/,s=/[{}\[\](),:;]/;a.languages.php={delimiter:{pattern:/\?>$|^<\?(?:php(?=\s)|=)?/i,alias:"important"},comment:e,variable:/\$+(?:\w+\b|(?={))/i,package:{pattern:/(namespace\s+|use\s+(?:function\s+)?)(?:\\?\b[a-z_]\w*)+\b(?!\\)/i,lookbehind:!0,inside:{punctuation:/\\/}},"class-name-definition":{pattern:/(\b(?:class|enum|interface|trait)\s+)\b[a-z_]\w*(?!\\)\b/i,lookbehind:!0,alias:"class-name"},"function-definition":{pattern:/(\bfunction\s+)[a-z_]\w*(?=\s*\()/i,lookbehind:!0,alias:"function"},keyword:[{pattern:/(\(\s*)\b(?:bool|boolean|int|integer|float|string|object|array)\b(?=\s*\))/i,alias:"type-casting",greedy:!0,lookbehind:!0},{pattern:/([(,?]\s*)\b(?:bool|int|float|string|object|array(?!\s*\()|mixed|self|static|callable|iterable|(?:null|false)(?=\s*\|))\b(?=\s*\$)/i,alias:"type-hint",greedy:!0,lookbehind:!0},{pattern:/([(,?]\s*[a-z0-9_|]\|\s*)(?:null|false)\b(?=\s*\$)/i,alias:"type-hint",greedy:!0,lookbehind:!0},{pattern:/(\)\s*:\s*(?:\?\s*)?)\b(?:bool|int|float|string|object|void|array(?!\s*\()|mixed|self|static|callable|iterable|(?:null|false)(?=\s*\|))\b/i,alias:"return-type",greedy:!0,lookbehind:!0},{pattern:/(\)\s*:\s*(?:\?\s*)?[a-z0-9_|]\|\s*)(?:null|false)\b/i,alias:"return-type",greedy:!0,lookbehind:!0},{pattern:/\b(?:bool|int|float|string|object|void|array(?!\s*\()|mixed|iterable|(?:null|false)(?=\s*\|))\b/i,alias:"type-declaration",greedy:!0},{pattern:/(\|\s*)(?:null|false)\b/i,alias:"type-declaration",greedy:!0,lookbehind:!0},{pattern:/\b(?:parent|self|static)(?=\s*::)/i,alias:"static-context",greedy:!0},{pattern:/(\byield\s+)from\b/i,lookbehind:!0},/\bclass\b/i,{pattern:/((?:^|[^\s>:]|(?:^|[^-])>|(?:^|[^:]):)\s*)\b(?:__halt_compiler|abstract|and|array|as|break|callable|case|catch|clone|const|continue|declare|default|die|do|echo|else|elseif|empty|enddeclare|endfor|endforeach|endif|endswitch|endwhile|enum|eval|exit|extends|final|finally|fn|for|foreach|function|global|goto|if|implements|include|include_once|instanceof|insteadof|interface|isset|list|namespace|match|new|or|parent|print|private|protected|public|require|require_once|return|self|static|switch|throw|trait|try|unset|use|var|while|xor|yield)\b/i,lookbehind:!0}],"argument-name":{pattern:/([(,]\s+)\b[a-z_]\w*(?=\s*:(?!:))/i,lookbehind:!0},"class-name":[{pattern:/(\b(?:extends|implements|instanceof|new(?!\s+self|\s+static))\s+|\bcatch\s*\()\b[a-z_]\w*(?!\\)\b/i,greedy:!0,lookbehind:!0},{pattern:/(\|\s*)\b[a-z_]\w*(?!\\)\b/i,greedy:!0,lookbehind:!0},{pattern:/\b[a-z_]\w*(?!\\)\b(?=\s*\|)/i,greedy:!0},{pattern:/(\|\s*)(?:\\?\b[a-z_]\w*)+\b/i,alias:"class-name-fully-qualified",greedy:!0,lookbehind:!0,inside:{punctuation:/\\/}},{pattern:/(?:\\?\b[a-z_]\w*)+\b(?=\s*\|)/i,alias:"class-name-fully-qualified",greedy:!0,inside:{punctuation:/\\/}},{pattern:/(\b(?:extends|implements|instanceof|new(?!\s+self\b|\s+static\b))\s+|\bcatch\s*\()(?:\\?\b[a-z_]\w*)+\b(?!\\)/i,alias:"class-name-fully-qualified",greedy:!0,lookbehind:!0,inside:{punctuation:/\\/}},{pattern:/\b[a-z_]\w*(?=\s*\$)/i,alias:"type-declaration",greedy:!0},{pattern:/(?:\\?\b[a-z_]\w*)+(?=\s*\$)/i,alias:["class-name-fully-qualified","type-declaration"],greedy:!0,inside:{punctuation:/\\/}},{pattern:/\b[a-z_]\w*(?=\s*::)/i,alias:"static-context",greedy:!0},{pattern:/(?:\\?\b[a-z_]\w*)+(?=\s*::)/i,alias:["class-name-fully-qualified","static-context"],greedy:!0,inside:{punctuation:/\\/}},{pattern:/([(,?]\s*)[a-z_]\w*(?=\s*\$)/i,alias:"type-hint",greedy:!0,lookbehind:!0},{pattern:/([(,?]\s*)(?:\\?\b[a-z_]\w*)+(?=\s*\$)/i,alias:["class-name-fully-qualified","type-hint"],greedy:!0,lookbehind:!0,inside:{punctuation:/\\/}},{pattern:/(\)\s*:\s*(?:\?\s*)?)\b[a-z_]\w*(?!\\)\b/i,alias:"return-type",greedy:!0,lookbehind:!0},{pattern:/(\)\s*:\s*(?:\?\s*)?)(?:\\?\b[a-z_]\w*)+\b(?!\\)/i,alias:["class-name-fully-qualified","return-type"],greedy:!0,lookbehind:!0,inside:{punctuation:/\\/}}],constant:t,function:/\b\w+(?=\s*\()/,property:{pattern:/(->\s*)\w+/,lookbehind:!0},number:i,operator:n,punctuation:s};var l={pattern:/{\$(?:{(?:{[^{}]+}|[^{}]+)}|[^{}])+}|(^|[^\\{])\$+(?:\w+(?:\[[^\r\n\[\]]+\]|->\w+)*)/,lookbehind:!0,inside:a.languages.php},r=[{pattern:/<<<'([^']+)'[\r\n](?:.*[\r\n])*?\1;/,alias:"nowdoc-string",greedy:!0,inside:{delimiter:{pattern:/^<<<'[^']+'|[a-z_]\w*;$/i,alias:"symbol",inside:{punctuation:/^<<<'?|[';]$/}}}},{pattern:/<<<(?:"([^"]+)"[\r\n](?:.*[\r\n])*?\1;|([a-z_]\w*)[\r\n](?:.*[\r\n])*?\2;)/i,alias:"heredoc-string",greedy:!0,inside:{delimiter:{pattern:/^<<<(?:"[^"]+"|[a-z_]\w*)|[a-z_]\w*;$/i,alias:"symbol",inside:{punctuation:/^<<<"?|[";]$/}},interpolation:l}},{pattern:/`(?:\\[\s\S]|[^\\`])*`/,alias:"backtick-quoted-string",greedy:!0},{pattern:/'(?:\\[\s\S]|[^\\'])*'/,alias:"single-quoted-string",greedy:!0},{pattern:/"(?:\\[\s\S]|[^\\"])*"/,alias:"double-quoted-string",greedy:!0,inside:{interpolation:l}}];a.languages.insertBefore("php","variable",{string:r,attribute:{pattern:/#\[(?:[^"'\/#]|\/(?![*/])|\/\/.*$|#(?!\[).*$|\/\*(?:[^*]|\*(?!\/))*\*\/|"(?:\\[\s\S]|[^\\"])*"|'(?:\\[\s\S]|[^\\'])*')+\](?=\s*[a-z$#])/im,greedy:!0,inside:{"attribute-content":{pattern:/^(#\[)[\s\S]+(?=]$)/,lookbehind:!0,inside:{comment:e,string:r,"attribute-class-name":[{pattern:/([^:]|^)\b[a-z_]\w*(?!\\)\b/i,alias:"class-name",greedy:!0,lookbehind:!0},{pattern:/([^:]|^)(?:\\?\b[a-z_]\w*)+/i,alias:["class-name","class-name-fully-qualified"],greedy:!0,lookbehind:!0,inside:{punctuation:/\\/}}],constant:t,number:i,operator:n,punctuation:s}},delimiter:{pattern:/^#\[|]$/,alias:"punctuation"}}}}),a.hooks.add("before-tokenize",function(e){if(/<\?/.test(e.code)){a.languages["markup-templating"].buildPlaceholders(e,"php",/<\?(?:[^"'/#]|\/(?![*/])|("|')(?:\\[\s\S]|(?!\1)[^\\])*\1|(?:\/\/|#(?!\[))(?:[^?\n\r]|\?(?!>))*(?=$|\?>|[\r\n])|#\[|\/\*(?:[^*]|\*(?!\/))*(?:\*\/|$))*?(?:\?>|$)/gi)}}),a.hooks.add("after-tokenize",function(e){a.languages["markup-templating"].tokenizePlaceholders(e,"php")})}(Prism); +!function(e){var i=Prism.languages.powershell={comment:[{pattern:/(^|[^`])<#[\s\S]*?#>/,lookbehind:!0},{pattern:/(^|[^`])#.*/,lookbehind:!0}],string:[{pattern:/"(?:`[\s\S]|[^`"])*"/,greedy:!0,inside:{function:{pattern:/(^|[^`])\$\((?:\$\([^\r\n()]*\)|(?!\$\()[^\r\n)])*\)/,lookbehind:!0,inside:{}}}},{pattern:/'(?:[^']|'')*'/,greedy:!0}],namespace:/\[[a-z](?:\[(?:\[[^\]]*]|[^\[\]])*]|[^\[\]])*]/i,boolean:/\$(?:true|false)\b/i,variable:/\$\w+\b/,function:[/\b(?:Add|Approve|Assert|Backup|Block|Checkpoint|Clear|Close|Compare|Complete|Compress|Confirm|Connect|Convert|ConvertFrom|ConvertTo|Copy|Debug|Deny|Disable|Disconnect|Dismount|Edit|Enable|Enter|Exit|Expand|Export|Find|ForEach|Format|Get|Grant|Group|Hide|Import|Initialize|Install|Invoke|Join|Limit|Lock|Measure|Merge|Move|New|Open|Optimize|Out|Ping|Pop|Protect|Publish|Push|Read|Receive|Redo|Register|Remove|Rename|Repair|Request|Reset|Resize|Resolve|Restart|Restore|Resume|Revoke|Save|Search|Select|Send|Set|Show|Skip|Sort|Split|Start|Step|Stop|Submit|Suspend|Switch|Sync|Tee|Test|Trace|Unblock|Undo|Uninstall|Unlock|Unprotect|Unpublish|Unregister|Update|Use|Wait|Watch|Where|Write)-[a-z]+\b/i,/\b(?:ac|cat|chdir|clc|cli|clp|clv|compare|copy|cp|cpi|cpp|cvpa|dbp|del|diff|dir|ebp|echo|epal|epcsv|epsn|erase|fc|fl|ft|fw|gal|gbp|gc|gci|gcs|gdr|gi|gl|gm|gp|gps|group|gsv|gu|gv|gwmi|iex|ii|ipal|ipcsv|ipsn|irm|iwmi|iwr|kill|lp|ls|measure|mi|mount|move|mp|mv|nal|ndr|ni|nv|ogv|popd|ps|pushd|pwd|rbp|rd|rdr|ren|ri|rm|rmdir|rni|rnp|rp|rv|rvpa|rwmi|sal|saps|sasv|sbp|sc|select|set|shcm|si|sl|sleep|sls|sort|sp|spps|spsv|start|sv|swmi|tee|trcm|type|write)\b/i],keyword:/\b(?:Begin|Break|Catch|Class|Continue|Data|Define|Do|DynamicParam|Else|ElseIf|End|Exit|Filter|Finally|For|ForEach|From|Function|If|InlineScript|Parallel|Param|Process|Return|Sequence|Switch|Throw|Trap|Try|Until|Using|Var|While|Workflow)\b/i,operator:{pattern:/(\W?)(?:!|-(?:eq|ne|gt|ge|lt|le|sh[lr]|not|b?(?:and|x?or)|(?:Not)?(?:Like|Match|Contains|In)|Replace|Join|is(?:Not)?|as)\b|-[-=]?|\+[+=]?|[*\/%]=?)/i,lookbehind:!0},punctuation:/[|{}[\];(),.]/},r=i.string[0].inside;r.boolean=i.boolean,r.variable=i.variable,r.function.inside=i}(); +!function(e){e.languages.ruby=e.languages.extend("clike",{comment:[/#.*/,{pattern:/^=begin\s[\s\S]*?^=end/m,greedy:!0}],"class-name":{pattern:/(\b(?:class)\s+|\bcatch\s+\()[\w.\\]+/i,lookbehind:!0,inside:{punctuation:/[.\\]/}},keyword:/\b(?:alias|and|BEGIN|begin|break|case|class|def|define_method|defined|do|each|else|elsif|END|end|ensure|extend|for|if|in|include|module|new|next|nil|not|or|prepend|protected|private|public|raise|redo|require|rescue|retry|return|self|super|then|throw|undef|unless|until|when|while|yield)\b/});var n={pattern:/#\{[^}]+\}/,inside:{delimiter:{pattern:/^#\{|\}$/,alias:"tag"},rest:e.languages.ruby}};delete e.languages.ruby.function,e.languages.insertBefore("ruby","keyword",{regex:[{pattern:RegExp("%r(?:"+["([^a-zA-Z0-9\\s{(\\[<])(?:(?!\\1)[^\\\\]|\\\\[^])*\\1","\\((?:[^()\\\\]|\\\\[^])*\\)","\\{(?:[^#{}\\\\]|#(?:\\{[^}]+\\})?|\\\\[^])*\\}","\\[(?:[^\\[\\]\\\\]|\\\\[^])*\\]","<(?:[^<>\\\\]|\\\\[^])*>"].join("|")+")[egimnosux]{0,6}"),greedy:!0,inside:{interpolation:n}},{pattern:/(^|[^/])\/(?!\/)(?:\[[^\r\n\]]+\]|\\.|[^[/\\\r\n])+\/[egimnosux]{0,6}(?=\s*(?:$|[\r\n,.;})#]))/,lookbehind:!0,greedy:!0,inside:{interpolation:n}}],variable:/[@$]+[a-zA-Z_]\w*(?:[?!]|\b)/,symbol:{pattern:/(^|[^:]):[a-zA-Z_]\w*(?:[?!]|\b)/,lookbehind:!0},"method-definition":{pattern:/(\bdef\s+)[\w.]+/,lookbehind:!0,inside:{function:/\w+$/,rest:e.languages.ruby}}}),e.languages.insertBefore("ruby","number",{builtin:/\b(?:Array|Bignum|Binding|Class|Continuation|Dir|Exception|FalseClass|File|Stat|Fixnum|Float|Hash|Integer|IO|MatchData|Method|Module|NilClass|Numeric|Object|Proc|Range|Regexp|String|Struct|TMS|Symbol|ThreadGroup|Thread|Time|TrueClass)\b/,constant:/\b[A-Z]\w*(?:[?!]|\b)/}),e.languages.ruby.string=[{pattern:RegExp("%[qQiIwWxs]?(?:"+["([^a-zA-Z0-9\\s{(\\[<])(?:(?!\\1)[^\\\\]|\\\\[^])*\\1","\\((?:[^()\\\\]|\\\\[^])*\\)","\\{(?:[^#{}\\\\]|#(?:\\{[^}]+\\})?|\\\\[^])*\\}","\\[(?:[^\\[\\]\\\\]|\\\\[^])*\\]","<(?:[^<>\\\\]|\\\\[^])*>"].join("|")+")"),greedy:!0,inside:{interpolation:n}},{pattern:/("|')(?:#\{[^}]+\}|#(?!\{)|\\(?:\r\n|[\s\S])|(?!\1)[^\\#\r\n])*\1/,greedy:!0,inside:{interpolation:n}}],e.languages.rb=e.languages.ruby}(Prism); +!function(e){for(var a="/\\*(?:[^*/]|\\*(?!/)|/(?!\\*)|)*\\*/",t=0;t<2;t++)a=a.replace(//g,function(){return a});a=a.replace(//g,function(){return"[^\\s\\S]"}),e.languages.rust={comment:[{pattern:RegExp("(^|[^\\\\])"+a),lookbehind:!0,greedy:!0},{pattern:/(^|[^\\:])\/\/.*/,lookbehind:!0,greedy:!0}],string:{pattern:/b?"(?:\\[\s\S]|[^\\"])*"|b?r(#*)"(?:[^"]|"(?!\1))*"\1/,greedy:!0},char:{pattern:/b?'(?:\\(?:x[0-7][\da-fA-F]|u\{(?:[\da-fA-F]_*){1,6}\}|.)|[^\\\r\n\t'])'/,greedy:!0,alias:"string"},attribute:{pattern:/#!?\[(?:[^\[\]"]|"(?:\\[\s\S]|[^\\"])*")*\]/,greedy:!0,alias:"attr-name",inside:{string:null}},"closure-params":{pattern:/([=(,:]\s*|\bmove\s*)\|[^|]*\||\|[^|]*\|(?=\s*(?:\{|->))/,lookbehind:!0,greedy:!0,inside:{"closure-punctuation":{pattern:/^\||\|$/,alias:"punctuation"},rest:null}},"lifetime-annotation":{pattern:/'\w+/,alias:"symbol"},"fragment-specifier":{pattern:/(\$\w+:)[a-z]+/,lookbehind:!0,alias:"punctuation"},variable:/\$\w+/,"function-definition":{pattern:/(\bfn\s+)\w+/,lookbehind:!0,alias:"function"},"type-definition":{pattern:/(\b(?:enum|struct|union)\s+)\w+/,lookbehind:!0,alias:"class-name"},"module-declaration":[{pattern:/(\b(?:crate|mod)\s+)[a-z][a-z_\d]*/,lookbehind:!0,alias:"namespace"},{pattern:/(\b(?:crate|self|super)\s*)::\s*[a-z][a-z_\d]*\b(?:\s*::(?:\s*[a-z][a-z_\d]*\s*::)*)?/,lookbehind:!0,alias:"namespace",inside:{punctuation:/::/}}],keyword:[/\b(?:abstract|as|async|await|become|box|break|const|continue|crate|do|dyn|else|enum|extern|final|fn|for|if|impl|in|let|loop|macro|match|mod|move|mut|override|priv|pub|ref|return|self|Self|static|struct|super|trait|try|type|typeof|union|unsafe|unsized|use|virtual|where|while|yield)\b/,/\b(?:[ui](?:8|16|32|64|128|size)|f(?:32|64)|bool|char|str)\b/],function:/\b[a-z_]\w*(?=\s*(?:::\s*<|\())/,macro:{pattern:/\w+!/,alias:"property"},constant:/\b[A-Z_][A-Z_\d]+\b/,"class-name":/\b[A-Z]\w*\b/,namespace:{pattern:/(?:\b[a-z][a-z_\d]*\s*::\s*)*\b[a-z][a-z_\d]*\s*::(?!\s*<)/,inside:{punctuation:/::/}},number:/\b(?:0x[\dA-Fa-f](?:_?[\dA-Fa-f])*|0o[0-7](?:_?[0-7])*|0b[01](?:_?[01])*|(?:(?:\d(?:_?\d)*)?\.)?\d(?:_?\d)*(?:[Ee][+-]?\d+)?)(?:_?(?:[iu](?:8|16|32|64|size)?|f32|f64))?\b/,boolean:/\b(?:false|true)\b/,punctuation:/->|\.\.=|\.{1,3}|::|[{}[\];(),:]/,operator:/[-+*\/%!^]=?|=[=>]?|&[&=]?|\|[|=]?|<>?=?|[@?]/},e.languages.rust["closure-params"].inside.rest=e.languages.rust,e.languages.rust.attribute.inside.string=e.languages.rust.string}(Prism); +!function(e){e.languages.sass=e.languages.extend("css",{comment:{pattern:/^([ \t]*)\/[\/*].*(?:(?:\r?\n|\r)\1[ \t].+)*/m,lookbehind:!0}}),e.languages.insertBefore("sass","atrule",{"atrule-line":{pattern:/^(?:[ \t]*)[@+=].+/m,inside:{atrule:/(?:@[\w-]+|[+=])/m}}}),delete e.languages.sass.atrule;var t=/\$[-\w]+|#\{\$[-\w]+\}/,a=[/[+*\/%]|[=!]=|<=?|>=?|\b(?:and|or|not)\b/,{pattern:/(\s+)-(?=\s)/,lookbehind:!0}];e.languages.insertBefore("sass","property",{"variable-line":{pattern:/^[ \t]*\$.+/m,inside:{punctuation:/:/,variable:t,operator:a}},"property-line":{pattern:/^[ \t]*(?:[^:\s]+ *:.*|:[^:\s].*)/m,inside:{property:[/[^:\s]+(?=\s*:)/,{pattern:/(:)[^:\s]+/,lookbehind:!0}],punctuation:/:/,variable:t,operator:a,important:e.languages.sass.important}}}),delete e.languages.sass.property,delete e.languages.sass.important,e.languages.insertBefore("sass","punctuation",{selector:{pattern:/([ \t]*)\S(?:,[^,\r\n]+|[^,\r\n]*)(?:,[^,\r\n]+)*(?:,(?:\r?\n|\r)\1[ \t]+\S(?:,[^,\r\n]+|[^,\r\n]*)(?:,[^,\r\n]+)*)*/,lookbehind:!0}})}(Prism); +Prism.languages.scss=Prism.languages.extend("css",{comment:{pattern:/(^|[^\\])(?:\/\*[\s\S]*?\*\/|\/\/.*)/,lookbehind:!0},atrule:{pattern:/@[\w-](?:\([^()]+\)|[^()\s]|\s+(?!\s))*?(?=\s+[{;])/,inside:{rule:/@[\w-]+/}},url:/(?:[-a-z]+-)?url(?=\()/i,selector:{pattern:/(?=\S)[^@;{}()]?(?:[^@;{}()\s]|\s+(?!\s)|#\{\$[-\w]+\})+(?=\s*\{(?:\}|\s|[^}][^:{}]*[:{][^}]+))/m,inside:{parent:{pattern:/&/,alias:"important"},placeholder:/%[-\w]+/,variable:/\$[-\w]+|#\{\$[-\w]+\}/}},property:{pattern:/(?:[-\w]|\$[-\w]|#\{\$[-\w]+\})+(?=\s*:)/,inside:{variable:/\$[-\w]+|#\{\$[-\w]+\}/}}}),Prism.languages.insertBefore("scss","atrule",{keyword:[/@(?:if|else(?: if)?|forward|for|each|while|import|use|extend|debug|warn|mixin|include|function|return|content)\b/i,{pattern:/( +)(?:from|through)(?= )/,lookbehind:!0}]}),Prism.languages.insertBefore("scss","important",{variable:/\$[-\w]+|#\{\$[-\w]+\}/}),Prism.languages.insertBefore("scss","function",{"module-modifier":{pattern:/\b(?:as|with|show|hide)\b/i,alias:"keyword"},placeholder:{pattern:/%[-\w]+/,alias:"selector"},statement:{pattern:/\B!(?:default|optional)\b/i,alias:"keyword"},boolean:/\b(?:true|false)\b/,null:{pattern:/\bnull\b/,alias:"keyword"},operator:{pattern:/(\s)(?:[-+*\/%]|[=!]=|<=?|>=?|and|or|not)(?=\s)/,lookbehind:!0}}),Prism.languages.scss.atrule.inside.rest=Prism.languages.scss; +Prism.languages.sql={comment:{pattern:/(^|[^\\])(?:\/\*[\s\S]*?\*\/|(?:--|\/\/|#).*)/,lookbehind:!0},variable:[{pattern:/@(["'`])(?:\\[\s\S]|(?!\1)[^\\])+\1/,greedy:!0},/@[\w.$]+/],string:{pattern:/(^|[^@\\])("|')(?:\\[\s\S]|(?!\2)[^\\]|\2\2)*\2/,greedy:!0,lookbehind:!0},function:/\b(?:AVG|COUNT|FIRST|FORMAT|LAST|LCASE|LEN|MAX|MID|MIN|MOD|NOW|ROUND|SUM|UCASE)(?=\s*\()/i,keyword:/\b(?:ACTION|ADD|AFTER|ALGORITHM|ALL|ALTER|ANALYZE|ANY|APPLY|AS|ASC|AUTHORIZATION|AUTO_INCREMENT|BACKUP|BDB|BEGIN|BERKELEYDB|BIGINT|BINARY|BIT|BLOB|BOOL|BOOLEAN|BREAK|BROWSE|BTREE|BULK|BY|CALL|CASCADED?|CASE|CHAIN|CHAR(?:ACTER|SET)?|CHECK(?:POINT)?|CLOSE|CLUSTERED|COALESCE|COLLATE|COLUMNS?|COMMENT|COMMIT(?:TED)?|COMPUTE|CONNECT|CONSISTENT|CONSTRAINT|CONTAINS(?:TABLE)?|CONTINUE|CONVERT|CREATE|CROSS|CURRENT(?:_DATE|_TIME|_TIMESTAMP|_USER)?|CURSOR|CYCLE|DATA(?:BASES?)?|DATE(?:TIME)?|DAY|DBCC|DEALLOCATE|DEC|DECIMAL|DECLARE|DEFAULT|DEFINER|DELAYED|DELETE|DELIMITERS?|DENY|DESC|DESCRIBE|DETERMINISTIC|DISABLE|DISCARD|DISK|DISTINCT|DISTINCTROW|DISTRIBUTED|DO|DOUBLE|DROP|DUMMY|DUMP(?:FILE)?|DUPLICATE|ELSE(?:IF)?|ENABLE|ENCLOSED|END|ENGINE|ENUM|ERRLVL|ERRORS|ESCAPED?|EXCEPT|EXEC(?:UTE)?|EXISTS|EXIT|EXPLAIN|EXTENDED|FETCH|FIELDS|FILE|FILLFACTOR|FIRST|FIXED|FLOAT|FOLLOWING|FOR(?: EACH ROW)?|FORCE|FOREIGN|FREETEXT(?:TABLE)?|FROM|FULL|FUNCTION|GEOMETRY(?:COLLECTION)?|GLOBAL|GOTO|GRANT|GROUP|HANDLER|HASH|HAVING|HOLDLOCK|HOUR|IDENTITY(?:_INSERT|COL)?|IF|IGNORE|IMPORT|INDEX|INFILE|INNER|INNODB|INOUT|INSERT|INT|INTEGER|INTERSECT|INTERVAL|INTO|INVOKER|ISOLATION|ITERATE|JOIN|KEYS?|KILL|LANGUAGE|LAST|LEAVE|LEFT|LEVEL|LIMIT|LINENO|LINES|LINESTRING|LOAD|LOCAL|LOCK|LONG(?:BLOB|TEXT)|LOOP|MATCH(?:ED)?|MEDIUM(?:BLOB|INT|TEXT)|MERGE|MIDDLEINT|MINUTE|MODE|MODIFIES|MODIFY|MONTH|MULTI(?:LINESTRING|POINT|POLYGON)|NATIONAL|NATURAL|NCHAR|NEXT|NO|NONCLUSTERED|NULLIF|NUMERIC|OFF?|OFFSETS?|ON|OPEN(?:DATASOURCE|QUERY|ROWSET)?|OPTIMIZE|OPTION(?:ALLY)?|ORDER|OUT(?:ER|FILE)?|OVER|PARTIAL|PARTITION|PERCENT|PIVOT|PLAN|POINT|POLYGON|PRECEDING|PRECISION|PREPARE|PREV|PRIMARY|PRINT|PRIVILEGES|PROC(?:EDURE)?|PUBLIC|PURGE|QUICK|RAISERROR|READS?|REAL|RECONFIGURE|REFERENCES|RELEASE|RENAME|REPEAT(?:ABLE)?|REPLACE|REPLICATION|REQUIRE|RESIGNAL|RESTORE|RESTRICT|RETURN(?:S|ING)?|REVOKE|RIGHT|ROLLBACK|ROUTINE|ROW(?:COUNT|GUIDCOL|S)?|RTREE|RULE|SAVE(?:POINT)?|SCHEMA|SECOND|SELECT|SERIAL(?:IZABLE)?|SESSION(?:_USER)?|SET(?:USER)?|SHARE|SHOW|SHUTDOWN|SIMPLE|SMALLINT|SNAPSHOT|SOME|SONAME|SQL|START(?:ING)?|STATISTICS|STATUS|STRIPED|SYSTEM_USER|TABLES?|TABLESPACE|TEMP(?:ORARY|TABLE)?|TERMINATED|TEXT(?:SIZE)?|THEN|TIME(?:STAMP)?|TINY(?:BLOB|INT|TEXT)|TOP?|TRAN(?:SACTIONS?)?|TRIGGER|TRUNCATE|TSEQUAL|TYPES?|UNBOUNDED|UNCOMMITTED|UNDEFINED|UNION|UNIQUE|UNLOCK|UNPIVOT|UNSIGNED|UPDATE(?:TEXT)?|USAGE|USE|USER|USING|VALUES?|VAR(?:BINARY|CHAR|CHARACTER|YING)|VIEW|WAITFOR|WARNINGS|WHEN|WHERE|WHILE|WITH(?: ROLLUP|IN)?|WORK|WRITE(?:TEXT)?|YEAR)\b/i,boolean:/\b(?:TRUE|FALSE|NULL)\b/i,number:/\b0x[\da-f]+\b|\b\d+(?:\.\d*)?|\B\.\d+\b/i,operator:/[-+*\/=%^~]|&&?|\|\|?|!=?|<(?:=>?|<|>)?|>[>=]?|\b(?:AND|BETWEEN|DIV|IN|ILIKE|IS|LIKE|NOT|OR|REGEXP|RLIKE|SOUNDS LIKE|XOR)\b/i,punctuation:/[;[\]()`,.]/}; +Prism.languages.swift=Prism.languages.extend("clike",{string:{pattern:/("|')(?:\\(?:\((?:[^()]|\([^)]+\))+\)|\r\n|[^(])|(?!\1)[^\\\r\n])*\1/,greedy:!0,inside:{interpolation:{pattern:/\\\((?:[^()]|\([^)]+\))+\)/,inside:{delimiter:{pattern:/^\\\(|\)$/,alias:"variable"}}}}},keyword:/\b(?:as|associativity|break|case|catch|class|continue|convenience|default|defer|deinit|didSet|do|dynamic(?:Type)?|else|enum|extension|fallthrough|final|for|func|get|guard|if|import|in|infix|init|inout|internal|is|lazy|left|let|mutating|new|none|nonmutating|operator|optional|override|postfix|precedence|prefix|private|protocol|public|repeat|required|rethrows|return|right|safe|self|Self|set|some|static|struct|subscript|super|switch|throws?|try|Type|typealias|unowned|unsafe|var|weak|where|while|willSet|__(?:COLUMN__|FILE__|FUNCTION__|LINE__))\b/,number:/\b(?:[\d_]+(?:\.[\de_]+)?|0x[a-f0-9_]+(?:\.[a-f0-9p_]+)?|0b[01_]+|0o[0-7_]+)\b/i,constant:/\b(?:nil|[A-Z_]{2,}|k[A-Z][A-Za-z_]+)\b/,atrule:/@\b(?:IB(?:Outlet|Designable|Action|Inspectable)|class_protocol|exported|noreturn|NS(?:Copying|Managed)|objc|UIApplicationMain|auto_closure)\b/,builtin:/\b(?:[A-Z]\S+|abs|advance|alignof(?:Value)?|assert|contains|count(?:Elements)?|debugPrint(?:ln)?|distance|drop(?:First|Last)|dump|enumerate|equal|filter|find|first|getVaList|indices|isEmpty|join|last|lexicographicalCompare|map|max(?:Element)?|min(?:Element)?|numericCast|overlaps|partition|print(?:ln)?|reduce|reflect|reverse|sizeof(?:Value)?|sort(?:ed)?|split|startsWith|stride(?:of(?:Value)?)?|suffix|swap|toDebugString|toString|transcode|underestimateCount|unsafeBitCast|with(?:ExtendedLifetime|Unsafe(?:MutablePointers?|Pointers?)|VaList))\b/}),Prism.languages.swift.string.inside.interpolation.inside.rest=Prism.languages.swift; +!function(e){e.languages.typescript=e.languages.extend("javascript",{"class-name":{pattern:/(\b(?:class|extends|implements|instanceof|interface|new|type)\s+)(?!keyof\b)(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?:\s*<(?:[^<>]|<(?:[^<>]|<[^<>]*>)*>)*>)?/,lookbehind:!0,greedy:!0,inside:null},keyword:/\b(?:abstract|as|asserts|async|await|break|case|catch|class|const|constructor|continue|debugger|declare|default|delete|do|else|enum|export|extends|finally|for|from|function|get|if|implements|import|in|instanceof|interface|is|keyof|let|module|namespace|new|null|of|package|private|protected|public|readonly|return|require|set|static|super|switch|this|throw|try|type|typeof|undefined|var|void|while|with|yield)\b/,builtin:/\b(?:string|Function|any|number|boolean|Array|symbol|console|Promise|unknown|never)\b/}),delete e.languages.typescript.parameter;var t=e.languages.extend("typescript",{});delete t["class-name"],e.languages.typescript["class-name"].inside=t,e.languages.insertBefore("typescript","function",{decorator:{pattern:/@[$\w\xA0-\uFFFF]+/,inside:{at:{pattern:/^@/,alias:"operator"},function:/^[\s\S]+/}},"generic-function":{pattern:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*\s*<(?:[^<>]|<(?:[^<>]|<[^<>]*>)*>)*>(?=\s*\()/,greedy:!0,inside:{function:/^#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*/,generic:{pattern:/<[\s\S]+/,alias:"class-name",inside:t}}}}),e.languages.ts=e.languages.typescript}(Prism); +Prism.languages.wasm={comment:[/\(;[\s\S]*?;\)/,{pattern:/;;.*/,greedy:!0}],string:{pattern:/"(?:\\[\s\S]|[^"\\])*"/,greedy:!0},keyword:[{pattern:/\b(?:align|offset)=/,inside:{operator:/=/}},{pattern:/\b(?:(?:f32|f64|i32|i64)(?:\.(?:abs|add|and|ceil|clz|const|convert_[su]\/i(?:32|64)|copysign|ctz|demote\/f64|div(?:_[su])?|eqz?|extend_[su]\/i32|floor|ge(?:_[su])?|gt(?:_[su])?|le(?:_[su])?|load(?:(?:8|16|32)_[su])?|lt(?:_[su])?|max|min|mul|nearest|neg?|or|popcnt|promote\/f32|reinterpret\/[fi](?:32|64)|rem_[su]|rot[lr]|shl|shr_[su]|store(?:8|16|32)?|sqrt|sub|trunc(?:_[su]\/f(?:32|64))?|wrap\/i64|xor))?|memory\.(?:grow|size))\b/,inside:{punctuation:/\./}},/\b(?:anyfunc|block|br(?:_if|_table)?|call(?:_indirect)?|data|drop|elem|else|end|export|func|get_(?:global|local)|global|if|import|local|loop|memory|module|mut|nop|offset|param|result|return|select|set_(?:global|local)|start|table|tee_local|then|type|unreachable)\b/],variable:/\$[\w!#$%&'*+\-./:<=>?@\\^_`|~]+/i,number:/[+-]?\b(?:\d(?:_?\d)*(?:\.\d(?:_?\d)*)?(?:[eE][+-]?\d(?:_?\d)*)?|0x[\da-fA-F](?:_?[\da-fA-F])*(?:\.[\da-fA-F](?:_?[\da-fA-D])*)?(?:[pP][+-]?\d(?:_?\d)*)?)\b|\binf\b|\bnan(?::0x[\da-fA-F](?:_?[\da-fA-D])*)?\b/,punctuation:/[()]/}; +!function(e){var n=/[*&][^\s[\]{},]+/,r=/!(?:<[\w\-%#;/?:@&=+$,.!~*'()[\]]+>|(?:[a-zA-Z\d-]*!)?[\w\-%#;/?:@&=+$.~*'()]+)?/,t="(?:"+r.source+"(?:[ \t]+"+n.source+")?|"+n.source+"(?:[ \t]+"+r.source+")?)",a="(?:[^\\s\\x00-\\x08\\x0e-\\x1f!\"#%&'*,\\-:>?@[\\]`{|}\\x7f-\\x84\\x86-\\x9f\\ud800-\\udfff\\ufffe\\uffff]|[?:-])(?:[ \t]*(?:(?![#:])|:))*".replace(//g,function(){return"[^\\s\\x00-\\x08\\x0e-\\x1f,[\\]{}\\x7f-\\x84\\x86-\\x9f\\ud800-\\udfff\\ufffe\\uffff]"}),d="\"(?:[^\"\\\\\r\n]|\\\\.)*\"|'(?:[^'\\\\\r\n]|\\\\.)*'";function o(e,n){n=(n||"").replace(/m/g,"")+"m";var r="([:\\-,[{]\\s*(?:\\s<>[ \t]+)?)(?:<>)(?=[ \t]*(?:$|,|]|}|(?:[\r\n]\\s*)?#))".replace(/<>/g,function(){return t}).replace(/<>/g,function(){return e});return RegExp(r,n)}e.languages.yaml={scalar:{pattern:RegExp("([\\-:]\\s*(?:\\s<>[ \t]+)?[|>])[ \t]*(?:((?:\r?\n|\r)[ \t]+)\\S[^\r\n]*(?:\\2[^\r\n]+)*)".replace(/<>/g,function(){return t})),lookbehind:!0,alias:"string"},comment:/#.*/,key:{pattern:RegExp("((?:^|[:\\-,[{\r\n?])[ \t]*(?:<>[ \t]+)?)<>(?=\\s*:\\s)".replace(/<>/g,function(){return t}).replace(/<>/g,function(){return"(?:"+a+"|"+d+")"})),lookbehind:!0,greedy:!0,alias:"atrule"},directive:{pattern:/(^[ \t]*)%.+/m,lookbehind:!0,alias:"important"},datetime:{pattern:o("\\d{4}-\\d\\d?-\\d\\d?(?:[tT]|[ \t]+)\\d\\d?:\\d{2}:\\d{2}(?:\\.\\d*)?(?:[ \t]*(?:Z|[-+]\\d\\d?(?::\\d{2})?))?|\\d{4}-\\d{2}-\\d{2}|\\d\\d?:\\d{2}(?::\\d{2}(?:\\.\\d*)?)?"),lookbehind:!0,alias:"number"},boolean:{pattern:o("true|false","i"),lookbehind:!0,alias:"important"},null:{pattern:o("null|~","i"),lookbehind:!0,alias:"important"},string:{pattern:o(d),lookbehind:!0,greedy:!0},number:{pattern:o("[+-]?(?:0x[\\da-f]+|0o[0-7]+|(?:\\d+(?:\\.\\d*)?|\\.?\\d+)(?:e[+-]?\\d+)?|\\.inf|\\.nan)","i"),lookbehind:!0},tag:r,important:n,punctuation:/---|[:[\]{}\-,|>?]|\.\.\./},e.languages.yml=e.languages.yaml}(Prism); +!function(){if("undefined"!=typeof Prism&&"undefined"!=typeof document&&document.querySelector){var t,o="line-numbers",s="linkable-line-numbers",a=function(){if(void 0===t){var e=document.createElement("div");e.style.fontSize="13px",e.style.lineHeight="1.5",e.style.padding="0",e.style.border="0",e.innerHTML=" 
                                                                                                                                   ",document.body.appendChild(e),t=38===e.offsetHeight,document.body.removeChild(e)}return t},l=!0,u=0;Prism.hooks.add("before-sanity-check",function(e){var t=e.element.parentElement;if(c(t)){var n=0;v(".line-highlight",t).forEach(function(e){n+=e.textContent.length,e.parentNode.removeChild(e)}),n&&/^( \n)+$/.test(e.code.slice(-n))&&(e.code=e.code.slice(0,-n))}}),Prism.hooks.add("complete",function e(t){var n=t.element.parentElement;if(c(n)){clearTimeout(u);var i=Prism.plugins.lineNumbers,r=t.plugins&&t.plugins.lineNumbers;if(b(n,o)&&i&&!r)Prism.hooks.add("line-numbers",e);else d(n)(),u=setTimeout(f,1)}}),window.addEventListener("hashchange",f),window.addEventListener("resize",function(){v("pre").filter(c).map(function(e){return d(e)}).forEach(y)})}function v(e,t){return Array.prototype.slice.call((t||document).querySelectorAll(e))}function b(e,t){return e.classList.contains(t)}function y(e){e()}function c(e){return!(!e||!/pre/i.test(e.nodeName))&&(!!e.hasAttribute("data-line")||!(!e.id||!Prism.util.isActive(e,s)))}function d(u,e,c){var t=(e="string"==typeof e?e:u.getAttribute("data-line")||"").replace(/\s+/g,"").split(",").filter(Boolean),d=+u.getAttribute("data-line-offset")||0,f=(a()?parseInt:parseFloat)(getComputedStyle(u).lineHeight),p=Prism.util.isActive(u,o),n=u.querySelector("code"),h=p?u:n||u,m=[],g=n&&h!=n?function(e,t){var n=getComputedStyle(e),i=getComputedStyle(t);function r(e){return+e.substr(0,e.length-2)}return t.offsetTop+r(i.borderTopWidth)+r(i.paddingTop)-r(n.paddingTop)}(u,n):0;t.forEach(function(e){var t=e.split("-"),n=+t[0],i=+t[1]||n,r=u.querySelector('.line-highlight[data-range="'+e+'"]')||document.createElement("div");if(m.push(function(){r.setAttribute("aria-hidden","true"),r.setAttribute("data-range",e),r.className=(c||"")+" line-highlight"}),p&&Prism.plugins.lineNumbers){var o=Prism.plugins.lineNumbers.getLine(u,n),s=Prism.plugins.lineNumbers.getLine(u,i);if(o){var a=o.offsetTop+g+"px";m.push(function(){r.style.top=a})}if(s){var l=s.offsetTop-o.offsetTop+s.offsetHeight+"px";m.push(function(){r.style.height=l})}}else m.push(function(){r.setAttribute("data-start",String(n)),n span",u).forEach(function(e,t){var n=t+r;e.onclick=function(){var e=i+"."+n;l=!1,location.hash=e,setTimeout(function(){l=!0},1)}})}return function(){m.forEach(y)}}function f(){var e=location.hash.slice(1);v(".temporary.line-highlight").forEach(function(e){e.parentNode.removeChild(e)});var t=(e.match(/\.([\d,-]+)$/)||[,""])[1];if(t&&!document.getElementById(e)){var n=e.slice(0,e.lastIndexOf(".")),i=document.getElementById(n);if(i)i.hasAttribute("data-line")||i.setAttribute("data-line",""),d(i,t,"temporary ")(),l&&document.querySelector(".temporary.line-highlight").scrollIntoView()}}}(); +!function(){if("undefined"!=typeof Prism&&"undefined"!=typeof document){var o="line-numbers",a=/\n(?!$)/g,e=Prism.plugins.lineNumbers={getLine:function(e,n){if("PRE"===e.tagName&&e.classList.contains(o)){var t=e.querySelector(".line-numbers-rows");if(t){var i=parseInt(e.getAttribute("data-start"),10)||1,r=i+(t.children.length-1);n");(i=document.createElement("span")).setAttribute("aria-hidden","true"),i.className="line-numbers-rows",i.innerHTML=l,t.hasAttribute("data-start")&&(t.style.counterReset="linenumber "+(parseInt(t.getAttribute("data-start"),10)-1)),e.element.appendChild(i),u([t]),Prism.hooks.run("line-numbers",e)}}}),Prism.hooks.add("line-numbers",function(e){e.plugins=e.plugins||{},e.plugins.lineNumbers=!0})}function u(e){if(0!=(e=e.filter(function(e){var n=t(e)["white-space"];return"pre-wrap"===n||"pre-line"===n})).length){var n=e.map(function(e){var n=e.querySelector("code"),t=e.querySelector(".line-numbers-rows");if(n&&t){var i=e.querySelector(".line-numbers-sizer"),r=n.textContent.split(a);i||((i=document.createElement("span")).className="line-numbers-sizer",n.appendChild(i)),i.innerHTML="0",i.style.display="block";var s=i.getBoundingClientRect().height;return i.innerHTML="",{element:e,lines:r,lineHeights:[],oneLinerHeight:s,sizer:i}}}).filter(Boolean);n.forEach(function(e){var i=e.sizer,n=e.lines,r=e.lineHeights,s=e.oneLinerHeight;r[n.length-1]=void 0,n.forEach(function(e,n){if(e&&1 + * Licensed under the New BSD License. + * https://github.com/stackp/promisejs + */ +(function(a){function b(){this._callbacks=[];}b.prototype.then=function(a,c){var d;if(this._isdone)d=a.apply(c,this.result);else{d=new b();this._callbacks.push(function(){var b=a.apply(c,arguments);if(b&&typeof b.then==='function')b.then(d.done,d);});}return d;};b.prototype.done=function(){this.result=arguments;this._isdone=true;for(var a=0;a=300)&&j.status!==304);h.done(a,j.responseText,j);}};j.send(k);return h;}function h(a){return function(b,c,d){return g(a,b,c,d);};}var i={Promise:b,join:c,chain:d,ajax:g,get:h('GET'),post:h('POST'),put:h('PUT'),del:h('DELETE'),ENOXHR:1,ETIMEOUT:2,ajaxTimeout:0};if(typeof define==='function'&&define.amd)define(function(){return i;});else a.promise=i;})(this); \ No newline at end of file diff --git a/documentation/js/libs/svg-pan-zoom.min.js b/documentation/js/libs/svg-pan-zoom.min.js new file mode 100644 index 00000000..807f0e44 --- /dev/null +++ b/documentation/js/libs/svg-pan-zoom.min.js @@ -0,0 +1,3 @@ +// svg-pan-zoom v3.6.0 +// https://github.com/ariutta/svg-pan-zoom +!function t(e,o,n){function i(r,a){if(!o[r]){if(!e[r]){var l="function"==typeof require&&require;if(!a&&l)return l(r,!0);if(s)return s(r,!0);var u=new Error("Cannot find module '"+r+"'");throw u.code="MODULE_NOT_FOUND",u}var h=o[r]={exports:{}};e[r][0].call(h.exports,function(t){var o=e[r][1][t];return i(o?o:t)},h,h.exports,t,e,o,n)}return o[r].exports}for(var s="function"==typeof require&&require,r=0;r=0;n--)this.eventListeners.hasOwnProperty(o[n])&&delete this.eventListeners[o[n]]}for(var i in this.eventListeners)(this.options.eventsListenerElement||this.svg).addEventListener(i,this.eventListeners[i],!this.options.preventMouseEventsDefault&&h);this.options.mouseWheelZoomEnabled&&(this.options.mouseWheelZoomEnabled=!1,this.enableMouseWheelZoom())},l.prototype.enableMouseWheelZoom=function(){if(!this.options.mouseWheelZoomEnabled){var t=this;this.wheelListener=function(e){return t.handleMouseWheel(e)};var e=!this.options.preventMouseEventsDefault;n.on(this.options.eventsListenerElement||this.svg,this.wheelListener,e),this.options.mouseWheelZoomEnabled=!0}},l.prototype.disableMouseWheelZoom=function(){if(this.options.mouseWheelZoomEnabled){var t=!this.options.preventMouseEventsDefault;n.off(this.options.eventsListenerElement||this.svg,this.wheelListener,t),this.options.mouseWheelZoomEnabled=!1}},l.prototype.handleMouseWheel=function(t){if(this.options.zoomEnabled&&"none"===this.state){this.options.preventMouseEventsDefault&&(t.preventDefault?t.preventDefault():t.returnValue=!1);var e=t.deltaY||1,o=Date.now()-this.lastMouseWheelEventTime,n=3+Math.max(0,30-o);this.lastMouseWheelEventTime=Date.now(),"deltaMode"in t&&0===t.deltaMode&&t.wheelDelta&&(e=0===t.deltaY?0:Math.abs(t.wheelDelta)/t.deltaY),e=-.30?1:-1)*Math.log(Math.abs(e)+10)/n;var i=this.svg.getScreenCTM().inverse(),s=r.getEventPoint(t,this.svg).matrixTransform(i),a=Math.pow(1+this.options.zoomScaleSensitivity,-1*e);this.zoomAtPoint(a,s)}},l.prototype.zoomAtPoint=function(t,e,o){var n=this.viewport.getOriginalState();o?(t=Math.max(this.options.minZoom*n.zoom,Math.min(this.options.maxZoom*n.zoom,t)),t/=this.getZoom()):this.getZoom()*tthis.options.maxZoom*n.zoom&&(t=this.options.maxZoom*n.zoom/this.getZoom());var i=this.viewport.getCTM(),s=e.matrixTransform(i.inverse()),r=this.svg.createSVGMatrix().translate(s.x,s.y).scale(t).translate(-s.x,-s.y),a=i.multiply(r);a.a!==i.a&&this.viewport.setCTM(a)},l.prototype.zoom=function(t,e){this.zoomAtPoint(t,r.getSvgCenterPoint(this.svg,this.width,this.height),e)},l.prototype.publicZoom=function(t,e){e&&(t=this.computeFromRelativeZoom(t)),this.zoom(t,e)},l.prototype.publicZoomAtPoint=function(t,e,o){if(o&&(t=this.computeFromRelativeZoom(t)),"SVGPoint"!==s.getType(e)){if(!("x"in e&&"y"in e))throw new Error("Given point is invalid");e=r.createSVGPoint(this.svg,e.x,e.y)}this.zoomAtPoint(t,e,o)},l.prototype.getZoom=function(){return this.viewport.getZoom()},l.prototype.getRelativeZoom=function(){return this.viewport.getRelativeZoom()},l.prototype.computeFromRelativeZoom=function(t){return t*this.viewport.getOriginalState().zoom},l.prototype.resetZoom=function(){var t=this.viewport.getOriginalState();this.zoom(t.zoom,!0)},l.prototype.resetPan=function(){this.pan(this.viewport.getOriginalState())},l.prototype.reset=function(){this.resetZoom(),this.resetPan()},l.prototype.handleDblClick=function(t){if(this.options.preventMouseEventsDefault&&(t.preventDefault?t.preventDefault():t.returnValue=!1),this.options.controlIconsEnabled){var e=t.target.getAttribute("class")||"";if(e.indexOf("svg-pan-zoom-control")>-1)return!1}var o;o=t.shiftKey?1/(2*(1+this.options.zoomScaleSensitivity)):2*(1+this.options.zoomScaleSensitivity);var n=r.getEventPoint(t,this.svg).matrixTransform(this.svg.getScreenCTM().inverse());this.zoomAtPoint(o,n)},l.prototype.handleMouseDown=function(t,e){this.options.preventMouseEventsDefault&&(t.preventDefault?t.preventDefault():t.returnValue=!1),s.mouseAndTouchNormalize(t,this.svg),this.options.dblClickZoomEnabled&&s.isDblClick(t,e)?this.handleDblClick(t):(this.state="pan",this.firstEventCTM=this.viewport.getCTM(),this.stateOrigin=r.getEventPoint(t,this.svg).matrixTransform(this.firstEventCTM.inverse()))},l.prototype.handleMouseMove=function(t){if(this.options.preventMouseEventsDefault&&(t.preventDefault?t.preventDefault():t.returnValue=!1),"pan"===this.state&&this.options.panEnabled){var e=r.getEventPoint(t,this.svg).matrixTransform(this.firstEventCTM.inverse()),o=this.firstEventCTM.translate(e.x-this.stateOrigin.x,e.y-this.stateOrigin.y);this.viewport.setCTM(o)}},l.prototype.handleMouseUp=function(t){this.options.preventMouseEventsDefault&&(t.preventDefault?t.preventDefault():t.returnValue=!1),"pan"===this.state&&(this.state="none")},l.prototype.fit=function(){var t=this.viewport.getViewBox(),e=Math.min(this.width/t.width,this.height/t.height);this.zoom(e,!0)},l.prototype.contain=function(){var t=this.viewport.getViewBox(),e=Math.max(this.width/t.width,this.height/t.height);this.zoom(e,!0)},l.prototype.center=function(){var t=this.viewport.getViewBox(),e=.5*(this.width-(t.width+2*t.x)*this.getZoom()),o=.5*(this.height-(t.height+2*t.y)*this.getZoom());this.getPublicInstance().pan({x:e,y:o})},l.prototype.updateBBox=function(){this.viewport.simpleViewBoxCache()},l.prototype.pan=function(t){var e=this.viewport.getCTM();e.e=t.x,e.f=t.y,this.viewport.setCTM(e)},l.prototype.panBy=function(t){var e=this.viewport.getCTM();e.e+=t.x,e.f+=t.y,this.viewport.setCTM(e)},l.prototype.getPan=function(){var t=this.viewport.getState();return{x:t.x,y:t.y}},l.prototype.resize=function(){var t=r.getBoundingClientRectNormalized(this.svg);this.width=t.width,this.height=t.height;var e=this.viewport;e.options.width=this.width,e.options.height=this.height,e.processCTM(),this.options.controlIconsEnabled&&(this.getPublicInstance().disableControlIcons(),this.getPublicInstance().enableControlIcons())},l.prototype.destroy=function(){var t=this;this.beforeZoom=null,this.onZoom=null,this.beforePan=null,this.onPan=null,this.onUpdatedCTM=null,null!=this.options.customEventsHandler&&this.options.customEventsHandler.destroy({svgElement:this.svg,eventsListenerElement:this.options.eventsListenerElement,instance:this.getPublicInstance()});for(var e in this.eventListeners)(this.options.eventsListenerElement||this.svg).removeEventListener(e,this.eventListeners[e],!this.options.preventMouseEventsDefault&&h);this.disableMouseWheelZoom(),this.getPublicInstance().disableControlIcons(),this.reset(),c=c.filter(function(e){return e.svg!==t.svg}),delete this.options,delete this.viewport,delete this.publicInstance,delete this.pi,this.getPublicInstance=function(){return null}},l.prototype.getPublicInstance=function(){var t=this;return this.publicInstance||(this.publicInstance=this.pi={enablePan:function(){return t.options.panEnabled=!0,t.pi},disablePan:function(){return t.options.panEnabled=!1,t.pi},isPanEnabled:function(){return!!t.options.panEnabled},pan:function(e){return t.pan(e),t.pi},panBy:function(e){return t.panBy(e),t.pi},getPan:function(){return t.getPan()},setBeforePan:function(e){return t.options.beforePan=null===e?null:s.proxy(e,t.publicInstance),t.pi},setOnPan:function(e){return t.options.onPan=null===e?null:s.proxy(e,t.publicInstance),t.pi},enableZoom:function(){return t.options.zoomEnabled=!0,t.pi},disableZoom:function(){return t.options.zoomEnabled=!1,t.pi},isZoomEnabled:function(){return!!t.options.zoomEnabled},enableControlIcons:function(){return t.options.controlIconsEnabled||(t.options.controlIconsEnabled=!0,i.enable(t)),t.pi},disableControlIcons:function(){return t.options.controlIconsEnabled&&(t.options.controlIconsEnabled=!1,i.disable(t)),t.pi},isControlIconsEnabled:function(){return!!t.options.controlIconsEnabled},enableDblClickZoom:function(){return t.options.dblClickZoomEnabled=!0,t.pi},disableDblClickZoom:function(){return t.options.dblClickZoomEnabled=!1,t.pi},isDblClickZoomEnabled:function(){return!!t.options.dblClickZoomEnabled},enableMouseWheelZoom:function(){return t.enableMouseWheelZoom(),t.pi},disableMouseWheelZoom:function(){return t.disableMouseWheelZoom(),t.pi},isMouseWheelZoomEnabled:function(){return!!t.options.mouseWheelZoomEnabled},setZoomScaleSensitivity:function(e){return t.options.zoomScaleSensitivity=e,t.pi},setMinZoom:function(e){return t.options.minZoom=e,t.pi},setMaxZoom:function(e){return t.options.maxZoom=e,t.pi},setBeforeZoom:function(e){return t.options.beforeZoom=null===e?null:s.proxy(e,t.publicInstance),t.pi},setOnZoom:function(e){return t.options.onZoom=null===e?null:s.proxy(e,t.publicInstance),t.pi},zoom:function(e){return t.publicZoom(e,!0),t.pi},zoomBy:function(e){return t.publicZoom(e,!1),t.pi},zoomAtPoint:function(e,o){return t.publicZoomAtPoint(e,o,!0),t.pi},zoomAtPointBy:function(e,o){return t.publicZoomAtPoint(e,o,!1),t.pi},zoomIn:function(){return this.zoomBy(1+t.options.zoomScaleSensitivity),t.pi},zoomOut:function(){return this.zoomBy(1/(1+t.options.zoomScaleSensitivity)),t.pi},getZoom:function(){return t.getRelativeZoom()},setOnUpdatedCTM:function(e){return t.options.onUpdatedCTM=null===e?null:s.proxy(e,t.publicInstance),t.pi},resetZoom:function(){return t.resetZoom(),t.pi},resetPan:function(){return t.resetPan(),t.pi},reset:function(){return t.reset(),t.pi},fit:function(){return t.fit(),t.pi},contain:function(){return t.contain(),t.pi},center:function(){return t.center(),t.pi},updateBBox:function(){return t.updateBBox(),t.pi},resize:function(){return t.resize(),t.pi},getSizes:function(){return{width:t.width,height:t.height,realZoom:t.getZoom(),viewBox:t.viewport.getViewBox()}},destroy:function(){return t.destroy(),t.pi}}),this.publicInstance};var c=[],p=function(t,e){var o=s.getSvg(t);if(null===o)return null;for(var n=c.length-1;n>=0;n--)if(c[n].svg===o)return c[n].instance.getPublicInstance();return c.push({svg:o,instance:new l(o,e)}),c[c.length-1].instance.getPublicInstance()};e.exports=p},{"./control-icons":2,"./shadow-viewport":3,"./svg-utilities":5,"./uniwheel":6,"./utilities":7}],5:[function(t,e,o){var n=t("./utilities"),i="unknown";document.documentMode&&(i="ie"),e.exports={svgNS:"http://www.w3.org/2000/svg",xmlNS:"http://www.w3.org/XML/1998/namespace",xmlnsNS:"http://www.w3.org/2000/xmlns/",xlinkNS:"http://www.w3.org/1999/xlink",evNS:"http://www.w3.org/2001/xml-events",getBoundingClientRectNormalized:function(t){if(t.clientWidth&&t.clientHeight)return{width:t.clientWidth,height:t.clientHeight};if(t.getBoundingClientRect())return t.getBoundingClientRect();throw new Error("Cannot get BoundingClientRect for SVG.")},getOrCreateViewport:function(t,e){var o=null;if(o=n.isElement(e)?e:t.querySelector(e),!o){var i=Array.prototype.slice.call(t.childNodes||t.children).filter(function(t){return"defs"!==t.nodeName&&"#text"!==t.nodeName});1===i.length&&"g"===i[0].nodeName&&null===i[0].getAttribute("transform")&&(o=i[0])}if(!o){var s="viewport-"+(new Date).toISOString().replace(/\D/g,"");o=document.createElementNS(this.svgNS,"g"),o.setAttribute("id",s);var r=t.childNodes||t.children;if(r&&r.length>0)for(var a=r.length;a>0;a--)"defs"!==r[r.length-a].nodeName&&o.appendChild(r[r.length-a]);t.appendChild(o)}var l=[];return o.getAttribute("class")&&(l=o.getAttribute("class").split(" ")),~l.indexOf("svg-pan-zoom_viewport")||(l.push("svg-pan-zoom_viewport"),o.setAttribute("class",l.join(" "))),o},setupSvgAttributes:function(t){if(t.setAttribute("xmlns",this.svgNS),t.setAttributeNS(this.xmlnsNS,"xmlns:xlink",this.xlinkNS),t.setAttributeNS(this.xmlnsNS,"xmlns:ev",this.evNS),null!==t.parentNode){var e=t.getAttribute("style")||"";e.toLowerCase().indexOf("overflow")===-1&&t.setAttribute("style","overflow: hidden; "+e)}},internetExplorerRedisplayInterval:300,refreshDefsGlobal:n.throttle(function(){for(var t=document.querySelectorAll("defs"),e=t.length,o=0;oe?(clearTimeout(a),a=null,l=h,s=t.apply(n,i),a||(n=i=null)):a||o.trailing===!1||(a=setTimeout(u,c)),s}},createRequestAnimationFrame:function(t){var e=null;return"auto"!==t&&t<60&&t>1&&(e=Math.floor(1e3/t)),null===e?window.requestAnimationFrame||n(33):n(e)}}},{}]},{},[1]); \ No newline at end of file diff --git a/documentation/js/libs/tablesort.min.js b/documentation/js/libs/tablesort.min.js new file mode 100644 index 00000000..09de2aed --- /dev/null +++ b/documentation/js/libs/tablesort.min.js @@ -0,0 +1,6 @@ +/*! + * tablesort v5.1.0 (2018-09-14) + * http://tristen.ca/tablesort/demo/ + * Copyright (c) 2018 ; Licensed MIT +*/ +!function(){function a(b,c){if(!(this instanceof a))return new a(b,c);if(!b||"TABLE"!==b.tagName)throw new Error("Element must be a table");this.init(b,c||{})}var b=[],c=function(a){var b;return window.CustomEvent&&"function"==typeof window.CustomEvent?b=new CustomEvent(a):(b=document.createEvent("CustomEvent"),b.initCustomEvent(a,!1,!1,void 0)),b},d=function(a){return a.getAttribute("data-sort")||a.textContent||a.innerText||""},e=function(a,b){return a=a.trim().toLowerCase(),b=b.trim().toLowerCase(),a===b?0:a0)if(a.tHead&&a.tHead.rows.length>0){for(e=0;e0&&l.push(k),m++;if(!l)return}for(m=0;m2&&void 0!==arguments[2]&&arguments[2];for(var s in t)void 0!==i[s]&&(null===i[s]||"object"!==(0,c.default)(i[s])?n(t,i,s,o):"object"===(0,c.default)(t[s])&&e.fillIfDefined(t[s],i[s],o))},e.extend=function(t,e){for(var i=1;i3&&void 0!==arguments[3]&&arguments[3];if(Array.isArray(o))throw new TypeError("Arrays are not supported by deepExtend");for(var r=0;r3&&void 0!==arguments[3]&&arguments[3];if(Array.isArray(o))throw new TypeError("Arrays are not supported by deepExtend");for(var r in o)if(o.hasOwnProperty(r)&&-1===t.indexOf(r))if(o[r]&&o[r].constructor===Object)void 0===i[r]&&(i[r]={}),i[r].constructor===Object?e.deepExtend(i[r],o[r]):n(i,o,r,s);else if(Array.isArray(o[r])){i[r]=[];for(var a=0;a2&&void 0!==arguments[2]&&arguments[2],s=arguments.length>3&&void 0!==arguments[3]&&arguments[3];for(var r in i)if(i.hasOwnProperty(r)||!0===o)if(i[r]&&i[r].constructor===Object)void 0===t[r]&&(t[r]={}),t[r].constructor===Object?e.deepExtend(t[r],i[r],o):n(t,i,r,s);else if(Array.isArray(i[r])){t[r]=[];for(var a=0;a=0&&(e="DOMMouseScroll"),t.addEventListener(e,i,o)):t.attachEvent("on"+e,i)},e.removeEventListener=function(t,e,i,o){t.removeEventListener?(void 0===o&&(o=!1),"mousewheel"===e&&navigator.userAgent.indexOf("Firefox")>=0&&(e="DOMMouseScroll"),t.removeEventListener(e,i,o)):t.detachEvent("on"+e,i)},e.preventDefault=function(t){t||(t=window.event),t.preventDefault?t.preventDefault():t.returnValue=!1},e.getTarget=function(t){t||(t=window.event);var e;return t.target?e=t.target:t.srcElement&&(e=t.srcElement),void 0!=e.nodeType&&3==e.nodeType&&(e=e.parentNode),e},e.hasParent=function(t,e){for(var i=t;i;){if(i===e)return!0;i=i.parentNode}return!1},e.option={},e.option.asBoolean=function(t,e){return"function"==typeof t&&(t=t()),null!=t?0!=t:e||null},e.option.asNumber=function(t,e){return"function"==typeof t&&(t=t()),null!=t?Number(t)||e||null:e||null},e.option.asString=function(t,e){return"function"==typeof t&&(t=t()),null!=t?String(t):e||null},e.option.asSize=function(t,i){return"function"==typeof t&&(t=t()),e.isString(t)?t:e.isNumber(t)?t+"px":i||null},e.option.asElement=function(t,e){return"function"==typeof t&&(t=t()),t||e||null},e.hexToRGB=function(t){var e=/^#?([a-f\d])([a-f\d])([a-f\d])$/i;t=t.replace(e,function(t,e,i,o){return e+e+i+i+o+o});var i=/^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(t);return i?{r:parseInt(i[1],16),g:parseInt(i[2],16),b:parseInt(i[3],16)}:null},e.overrideOpacity=function(t,i){var o;return-1!=t.indexOf("rgba")?t:-1!=t.indexOf("rgb")?(o=t.substr(t.indexOf("(")+1).replace(")","").split(","),"rgba("+o[0]+","+o[1]+","+o[2]+","+i+")"):(o=e.hexToRGB(t),null==o?t:"rgba("+o.r+","+o.g+","+o.b+","+i+")")},e.RGBToHex=function(t,e,i){return"#"+((1<<24)+(t<<16)+(e<<8)+i).toString(16).slice(1)},e.parseColor=function(t){var i;if(!0===e.isString(t)){if(!0===e.isValidRGB(t)){var o=t.substr(4).substr(0,t.length-5).split(",").map(function(t){return parseInt(t)});t=e.RGBToHex(o[0],o[1],o[2])}if(!0===e.isValidHex(t)){var n=e.hexToHSV(t),s={h:n.h,s:.8*n.s,v:Math.min(1,1.02*n.v)},r={h:n.h,s:Math.min(1,1.25*n.s),v:.8*n.v},a=e.HSVToHex(r.h,r.s,r.v),h=e.HSVToHex(s.h,s.s,s.v);i={background:t,border:a,highlight:{background:h,border:a},hover:{background:h,border:a}}}else i={background:t,border:t,highlight:{background:t,border:t},hover:{background:t,border:t}}}else i={},i.background=t.background||void 0,i.border=t.border||void 0,e.isString(t.highlight)?i.highlight={border:t.highlight,background:t.highlight}:(i.highlight={},i.highlight.background=t.highlight&&t.highlight.background||void 0,i.highlight.border=t.highlight&&t.highlight.border||void 0),e.isString(t.hover)?i.hover={border:t.hover,background:t.hover}:(i.hover={},i.hover.background=t.hover&&t.hover.background||void 0,i.hover.border=t.hover&&t.hover.border||void 0);return i},e.RGBToHSV=function(t,e,i){t/=255,e/=255,i/=255;var o=Math.min(t,Math.min(e,i)),n=Math.max(t,Math.max(e,i));if(o==n)return{h:0,s:0,v:o};var s=t==o?e-i:i==o?t-e:i-t;return{h:60*((t==o?3:i==o?1:5)-s/(n-o))/360,s:(n-o)/n,v:n}};var v={split:function(t){var e={};return t.split(";").forEach(function(t){if(""!=t.trim()){var i=t.split(":"),o=i[0].trim(),n=i[1].trim();e[o]=n}}),e},join:function(t){return(0,l.default)(t).map(function(e){return e+": "+t[e]}).join("; ")}};e.addCssText=function(t,i){var o=v.split(t.style.cssText),n=v.split(i),s=e.extend(o,n);t.style.cssText=v.join(s)},e.removeCssText=function(t,e){var i=v.split(t.style.cssText),o=v.split(e);for(var n in o)o.hasOwnProperty(n)&&delete i[n];t.style.cssText=v.join(i)},e.HSVToRGB=function(t,e,i){var o,n,s,r=Math.floor(6*t),a=6*t-r,h=i*(1-e),d=i*(1-a*e),l=i*(1-(1-a)*e);switch(r%6){case 0:o=i,n=l,s=h;break;case 1:o=d,n=i,s=h;break;case 2:o=h,n=i,s=l;break;case 3:o=h,n=d,s=i;break;case 4:o=l,n=h,s=i;break;case 5:o=i,n=h,s=d}return{r:Math.floor(255*o),g:Math.floor(255*n),b:Math.floor(255*s)}},e.HSVToHex=function(t,i,o){var n=e.HSVToRGB(t,i,o);return e.RGBToHex(n.r,n.g,n.b)},e.hexToHSV=function(t){var i=e.hexToRGB(t);return e.RGBToHSV(i.r,i.g,i.b)},e.isValidHex=function(t){return/(^#[0-9A-F]{6}$)|(^#[0-9A-F]{3}$)/i.test(t)},e.isValidRGB=function(t){return t=t.replace(" ",""),/rgb\((\d{1,3}),(\d{1,3}),(\d{1,3})\)/i.test(t)},e.isValidRGBA=function(t){return t=t.replace(" ",""),/rgba\((\d{1,3}),(\d{1,3}),(\d{1,3}),(.{1,3})\)/i.test(t)},e.selectiveBridgeObject=function(t,i){if(null!==i&&"object"===(void 0===i?"undefined":(0,c.default)(i))){for(var o=(0,h.default)(i),n=0;n0&&e(o,t[n-1])<0;n--)t[n]=t[n-1];t[n]=o}return t},e.mergeOptions=function(t,e,i){var o=arguments.length>3&&void 0!==arguments[3]?arguments[3]:{},n=function(t){return null!==t&&void 0!==t},s=function(t){return null!==t&&"object"===(void 0===t?"undefined":(0,c.default)(t))};if(!s(t))throw new Error("Parameter mergeTarget must be an object");if(!s(e))throw new Error("Parameter options must be an object");if(!n(i))throw new Error("Parameter option must have a value");if(!s(o))throw new Error("Parameter globalOptions must be an object");var r=e[i],a=s(o)&&!function(t){for(var e in t)if(t.hasOwnProperty(e))return!1;return!0}(o),d=a?o[i]:void 0,l=d?d.enabled:void 0;if(void 0!==r){if("boolean"==typeof r)return s(t[i])||(t[i]={}),void(t[i].enabled=r);if(null===r&&!s(t[i])){if(!n(d))return;t[i]=(0,h.default)(d)}if(s(r)){var u=!0;void 0!==r.enabled?u=r.enabled:void 0!==l&&(u=d.enabled),function(t,e,i){s(t[i])||(t[i]={});var o=e[i],n=t[i];for(var r in o)o.hasOwnProperty(r)&&(n[r]=o[r])}(t,e,i),t[i].enabled=u}}},e.binarySearchCustom=function(t,e,i,o){for(var n=0,s=0,r=t.length-1;s<=r&&n<1e4;){var a=Math.floor((s+r)/2),h=t[a],d=void 0===o?h[i]:h[i][o],l=e(d);if(0==l)return a;-1==l?s=a+1:r=a-1,n++}return-1},e.binarySearchValue=function(t,e,i,o,n){var s,r,a,h,d=0,l=0,u=t.length-1;for(n=void 0!=n?n:function(t,e){return t==e?0:t0)return"before"==o?Math.max(0,h-1):h;if(n(r,e)<0&&n(a,e)>0)return"before"==o?h:Math.min(t.length-1,h+1);n(r,e)<0?l=h+1:u=h-1,d++}return-1},e.easingFunctions={linear:function(t){return t},easeInQuad:function(t){return t*t},easeOutQuad:function(t){return t*(2-t)},easeInOutQuad:function(t){return t<.5?2*t*t:(4-2*t)*t-1},easeInCubic:function(t){return t*t*t},easeOutCubic:function(t){return--t*t*t+1},easeInOutCubic:function(t){return t<.5?4*t*t*t:(t-1)*(2*t-2)*(2*t-2)+1},easeInQuart:function(t){return t*t*t*t},easeOutQuart:function(t){return 1- --t*t*t*t},easeInOutQuart:function(t){return t<.5?8*t*t*t*t:1-8*--t*t*t*t},easeInQuint:function(t){return t*t*t*t*t},easeOutQuint:function(t){return 1+--t*t*t*t*t},easeInOutQuint:function(t){return t<.5?16*t*t*t*t*t:1+16*--t*t*t*t*t}},e.getScrollBarWidth=function(){var t=document.createElement("p");t.style.width="100%",t.style.height="200px";var e=document.createElement("div");e.style.position="absolute",e.style.top="0px",e.style.left="0px",e.style.visibility="hidden",e.style.width="200px",e.style.height="150px",e.style.overflow="hidden",e.appendChild(t),document.body.appendChild(e);var i=t.offsetWidth;e.style.overflow="scroll";var o=t.offsetWidth;return i==o&&(o=e.clientWidth),document.body.removeChild(e),i-o},e.topMost=function(t,e){var i=void 0;Array.isArray(e)||(e=[e]);var o=!0,n=!1,s=void 0;try{for(var a,h=(0,r.default)(t);!(o=(a=h.next()).done);o=!0){var d=a.value;if(d){i=d[e[0]];for(var l=1;ln?1:or)&&(s=h,r=d)}return s},n.prototype.min=function(t){var e,i,o=this._data,n=(0,l.default)(o),s=null,r=null;for(e=0,i=n.length;e0?(o=e[t].redundant[0],e[t].redundant.shift()):(o=document.createElementNS("http://www.w3.org/2000/svg",t),i.appendChild(o)):(o=document.createElementNS("http://www.w3.org/2000/svg",t),e[t]={used:[],redundant:[]},i.appendChild(o)),e[t].used.push(o),o},e.getDOMElement=function(t,e,i,o){var n;return e.hasOwnProperty(t)?e[t].redundant.length>0?(n=e[t].redundant[0],e[t].redundant.shift()):(n=document.createElement(t),void 0!==o?i.insertBefore(n,o):i.appendChild(n)):(n=document.createElement(t),e[t]={used:[],redundant:[]},void 0!==o?i.insertBefore(n,o):i.appendChild(n)),e[t].used.push(n),n},e.drawPoint=function(t,i,o,n,s,r){var a;if("circle"==o.style?(a=e.getSVGElement("circle",n,s),a.setAttributeNS(null,"cx",t),a.setAttributeNS(null,"cy",i),a.setAttributeNS(null,"r",.5*o.size)):(a=e.getSVGElement("rect",n,s),a.setAttributeNS(null,"x",t-.5*o.size),a.setAttributeNS(null,"y",i-.5*o.size),a.setAttributeNS(null,"width",o.size),a.setAttributeNS(null,"height",o.size)),void 0!==o.styles&&a.setAttributeNS(null,"style",o.styles),a.setAttributeNS(null,"class",o.className+" vis-point"),r){var h=e.getSVGElement("text",n,s);r.xOffset&&(t+=r.xOffset),r.yOffset&&(i+=r.yOffset),r.content&&(h.textContent=r.content),r.className&&h.setAttributeNS(null,"class",r.className+" vis-label"),h.setAttributeNS(null,"x",t),h.setAttributeNS(null,"y",i)}return a},e.drawBar=function(t,i,o,n,s,r,a,h){if(0!=n){n<0&&(n*=-1,i-=n);var d=e.getSVGElement("rect",r,a);d.setAttributeNS(null,"x",t-.5*o),d.setAttributeNS(null,"y",i),d.setAttributeNS(null,"width",o),d.setAttributeNS(null,"height",n),d.setAttributeNS(null,"class",s),h&&d.setAttributeNS(null,"style",h)}}},function(t,e,i){function o(t){return t&&t.__esModule?t:{default:t}}Object.defineProperty(e,"__esModule",{value:!0}),e.printStyle=void 0;var n=i(19),s=o(n),r=i(6),a=o(r),h=i(8),d=o(h),l=i(0),u=o(l),c=i(1),p=o(c),f=i(2),m=!1,v=void 0,g="background: #FFeeee; color: #dd0000",y=function(){function t(){(0,u.default)(this,t)}return(0,p.default)(t,null,[{key:"validate",value:function(e,i,o){m=!1,v=i;var n=i;return void 0!==o&&(n=i[o]),t.parse(e,n,[]),m}},{key:"parse",value:function(e,i,o){for(var n in e)e.hasOwnProperty(n)&&t.check(n,e,i,o)}},{key:"check",value:function(e,i,o,n){if(void 0===o[e]&&void 0===o.__any__)return void t.getSuggestion(e,o,n);var s=e,r=!0;void 0===o[e]&&void 0!==o.__any__&&(s="__any__",r="object"===t.getType(i[e]));var a=o[s];r&&void 0!==a.__type__&&(a=a.__type__),t.checkFields(e,i,o,s,a,n)}},{key:"checkFields",value:function(e,i,o,n,s,r){var a=function(i){console.log("%c"+i+t.printLocation(r,e),g)},h=t.getType(i[e]),l=s[h];void 0!==l?"array"===t.getType(l)&&-1===l.indexOf(i[e])?(a('Invalid option detected in "'+e+'". Allowed values are:'+t.print(l)+' not "'+i[e]+'". '),m=!0):"object"===h&&"__any__"!==n&&(r=f.copyAndExtendArray(r,e),t.parse(i[e],o[n],r)):void 0===s.any&&(a('Invalid type received for "'+e+'". Expected: '+t.print((0,d.default)(s))+". Received ["+h+'] "'+i[e]+'"'),m=!0)}},{key:"getType",value:function(t){var e=void 0===t?"undefined":(0,a.default)(t);return"object"===e?null===t?"null":t instanceof Boolean?"boolean":t instanceof Number?"number":t instanceof String?"string":Array.isArray(t)?"array":t instanceof Date?"date":void 0!==t.nodeType?"dom":!0===t._isAMomentObject?"moment":"object":"number"===e?"number":"boolean"===e?"boolean":"string"===e?"string":void 0===e?"undefined":e}},{key:"getSuggestion",value:function(e,i,o){var n=t.findInOptions(e,i,o,!1),s=t.findInOptions(e,v,[],!0),r=void 0 +;r=void 0!==n.indexMatch?" in "+t.printLocation(n.path,e,"")+'Perhaps it was incomplete? Did you mean: "'+n.indexMatch+'"?\n\n':s.distance<=4&&n.distance>s.distance?" in "+t.printLocation(n.path,e,"")+"Perhaps it was misplaced? Matching option found at: "+t.printLocation(s.path,s.closestMatch,""):n.distance<=8?'. Did you mean "'+n.closestMatch+'"?'+t.printLocation(n.path,e):". Did you mean one of these: "+t.print((0,d.default)(i))+t.printLocation(o,e),console.log('%cUnknown option detected: "'+e+'"'+r,g),m=!0}},{key:"findInOptions",value:function(e,i,o){var n=arguments.length>3&&void 0!==arguments[3]&&arguments[3],s=1e9,r="",a=[],h=e.toLowerCase(),d=void 0;for(var l in i){var u=void 0;if(void 0!==i[l].__type__&&!0===n){var c=t.findInOptions(e,i[l],f.copyAndExtendArray(o,l));s>c.distance&&(r=c.closestMatch,a=c.path,s=c.distance,d=c.indexMatch)}else-1!==l.toLowerCase().indexOf(h)&&(d=l),u=t.levenshteinDistance(e,l),s>u&&(r=l,a=f.copyArray(o),s=u)}return{closestMatch:r,path:a,distance:s,indexMatch:d}}},{key:"printLocation",value:function(t,e){for(var i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:"Problem value found at: \n",o="\n\n"+i+"options = {\n",n=0;n0&&(this.enableBorderDashes(t,e),t.stroke(),this.disableBorderDashes(t,e)),t.restore()}},{key:"performFill",value:function(t,e){this.enableShadow(t,e),t.fill(),this.disableShadow(t,e),this.performStroke(t,e)}},{key:"_addBoundingBoxMargin",value:function(t){this.boundingBox.left-=t,this.boundingBox.top-=t,this.boundingBox.bottom+=t,this.boundingBox.right+=t}},{key:"_updateBoundingBox",value:function(t,e,i,o,n){void 0!==i&&this.resize(i,o,n),this.left=t-this.width/2,this.top=e-this.height/2,this.boundingBox.left=this.left,this.boundingBox.top=this.top,this.boundingBox.bottom=this.top+this.height,this.boundingBox.right=this.left+this.width}},{key:"updateBoundingBox",value:function(t,e,i,o,n){this._updateBoundingBox(t,e,i,o,n)}},{key:"getDimensionsFromLabel",value:function(t,e,i){this.textSize=this.labelModule.getTextSize(t,e,i);var o=this.textSize.width,n=this.textSize.height;return 0===o&&(o=14,n=14),{width:o,height:n}}}]),t}();e.default=l},function(t,e,i){function o(t){return t&&t.__esModule?t:{default:t}}Object.defineProperty(e,"__esModule",{value:!0});var n=i(3),s=o(n),r=i(0),a=o(r),h=i(1),d=o(h),l=i(4),u=o(l),c=i(5),p=o(c),f=i(23),m=o(f),v=function(t){function e(t,i,o){return(0,a.default)(this,e),(0,u.default)(this,(e.__proto__||(0,s.default)(e)).call(this,t,i,o))}return(0,p.default)(e,t),(0,d.default)(e,[{key:"resize",value:function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:this.selected,i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:this.hover,o=arguments.length>3&&void 0!==arguments[3]?arguments[3]:{size:this.options.size};if(this.needsRefresh(e,i)){this.labelModule.getTextSize(t,e,i);var n=2*o.size;this.width=n,this.height=n,this.radius=.5*this.width}}},{key:"_drawShape",value:function(t,e,i,o,n,s,r,a){if(this.resize(t,s,r,a),this.left=o-this.width/2,this.top=n-this.height/2,this.initContextForDraw(t,a),t[e](o,n,a.size),this.performFill(t,a),void 0!==this.options.label){this.labelModule.calculateLabelSize(t,s,r,o,n,"hanging");var h=n+.5*this.height+.5*this.labelModule.size.height;this.labelModule.draw(t,o,h,s,r,"hanging")}this.updateBoundingBox(o,n)}},{key:"updateBoundingBox",value:function(t,e){this.boundingBox.top=e-this.options.size,this.boundingBox.left=t-this.options.size,this.boundingBox.right=t+this.options.size,this.boundingBox.bottom=e+this.options.size,void 0!==this.options.label&&this.labelModule.size.width>0&&(this.boundingBox.left=Math.min(this.boundingBox.left,this.labelModule.size.left),this.boundingBox.right=Math.max(this.boundingBox.right,this.labelModule.size.left+this.labelModule.size.width),this.boundingBox.bottom=Math.max(this.boundingBox.bottom,this.boundingBox.bottom+this.labelModule.size.height))}}]),e}(m.default);e.default=v},function(t,e,i){var o=i(78),n=i(51);t.exports=function(t){return o(n(t))}},function(t,e,i){var o=i(20),n=i(39);t.exports=i(21)?function(t,e,i){return o.f(t,e,n(1,i))}:function(t,e,i){return t[e]=i,t}},function(t,e,i){var o=i(32);t.exports=function(t){if(!o(t))throw TypeError(t+" is not an object!");return t}},function(t,e){t.exports=function(t){try{return!!t()}catch(t){return!0}}},function(t,e,i){t.exports={default:i(138),__esModule:!0}},function(t,e,i){function o(t){return t&&t.__esModule?t:{default:t}}e.__esModule=!0;var n=i(188),s=o(n),r=i(77),a=o(r);e.default=function(){function t(t,e){var i=[],o=!0,n=!1,s=void 0;try{for(var r,h=(0,a.default)(t);!(o=(r=h.next()).done)&&(i.push(r.value),!e||i.length!==e);o=!0);}catch(t){n=!0,s=t}finally{try{!o&&h.return&&h.return()}finally{if(n)throw s}}return i}return function(e,i){if(Array.isArray(e))return e;if((0,s.default)(Object(e)))return t(e,i);throw new TypeError("Invalid attempt to destructure non-iterable instance")}}()},function(t,e){t.exports={}},function(t,e){t.exports=function(t){return"object"==typeof t?null!==t:"function"==typeof t}},function(t,e,i){var o=i(84),n=i(58);t.exports=Object.keys||function(t){return o(t,n)}},function(t,e,i){function o(t,e,i){this.x=void 0!==t?t:0,this.y=void 0!==e?e:0,this.z=void 0!==i?i:0}o.subtract=function(t,e){var i=new o;return i.x=t.x-e.x,i.y=t.y-e.y,i.z=t.z-e.z,i},o.add=function(t,e){var i=new o;return i.x=t.x+e.x,i.y=t.y+e.y,i.z=t.z+e.z,i},o.avg=function(t,e){return new o((t.x+e.x)/2,(t.y+e.y)/2,(t.z+e.z)/2)},o.crossProduct=function(t,e){var i=new o;return i.x=t.y*e.z-t.z*e.y,i.y=t.z*e.x-t.x*e.z,i.z=t.x*e.y-t.y*e.x,i},o.prototype.length=function(){return Math.sqrt(this.x*this.x+this.y*this.y+this.z*this.z)},t.exports=o},function(t,e,i){var o,n,s;!function(i,r){n=[],o=r,void 0!==(s="function"==typeof o?o.apply(e,n):o)&&(t.exports=s)}(0,function(){function t(t){var e,i=t&&t.preventDefault||!1,o=t&&t.container||window,n={},s={keydown:{},keyup:{}},r={};for(e=97;e<=122;e++)r[String.fromCharCode(e)]={code:e-97+65,shift:!1};for(e=65;e<=90;e++)r[String.fromCharCode(e)]={code:e,shift:!0};for(e=0;e<=9;e++)r[""+e]={code:48+e,shift:!1};for(e=1;e<=12;e++)r["F"+e]={code:111+e,shift:!1};for(e=0;e<=9;e++)r["num"+e]={code:96+e,shift:!1};r["num*"]={code:106,shift:!1},r["num+"]={code:107,shift:!1},r["num-"]={code:109,shift:!1},r["num/"]={code:111,shift:!1},r["num."]={code:110,shift:!1},r.left={code:37,shift:!1},r.up={code:38,shift:!1},r.right={code:39,shift:!1},r.down={code:40,shift:!1},r.space={code:32,shift:!1},r.enter={code:13,shift:!1},r.shift={code:16,shift:void 0},r.esc={code:27,shift:!1},r.backspace={code:8,shift:!1},r.tab={code:9,shift:!1},r.ctrl={code:17,shift:!1},r.alt={code:18,shift:!1},r.delete={code:46,shift:!1},r.pageup={code:33,shift:!1},r.pagedown={code:34,shift:!1},r["="]={code:187,shift:!1},r["-"]={code:189,shift:!1},r["]"]={code:221,shift:!1},r["["]={code:219,shift:!1};var a=function(t){d(t,"keydown")},h=function(t){d(t,"keyup")},d=function(t,e){if(void 0!==s[e][t.keyCode]){for(var o=s[e][t.keyCode],n=0;n=4*a){var c=0,p=s.clone();switch(o[h].repeat){case"daily":d.day()!=l.day()&&(c=1),d.dayOfYear(n.dayOfYear()),d.year(n.year()),d.subtract(7,"days"),l.dayOfYear(n.dayOfYear()),l.year(n.year()),l.subtract(7-c,"days"),p.add(1,"weeks");break;case"weekly":var f=l.diff(d,"days"),m=d.day();d.date(n.date()),d.month(n.month()),d.year(n.year()),l=d.clone(),d.day(m),l.day(m),l.add(f,"days"),d.subtract(1,"weeks"),l.subtract(1,"weeks"),p.add(1,"weeks");break;case"monthly":d.month()!=l.month()&&(c=1),d.month(n.month()),d.year(n.year()),d.subtract(1,"months"),l.month(n.month()),l.year(n.year()),l.subtract(1,"months"),l.add(c,"months"),p.add(1,"months");break;case"yearly":d.year()!=l.year()&&(c=1),d.year(n.year()),d.subtract(1,"years"),l.year(n.year()),l.subtract(1,"years"),l.add(c,"years"),p.add(1,"years");break;default:return void console.log("Wrong repeat format, allowed are: daily, weekly, monthly, yearly. Given:",o[h].repeat)}for(;d=e[o].start&&e[n].end<=e[o].end?e[n].remove=!0:e[n].start>=e[o].start&&e[n].start<=e[o].end?(e[o].end=e[n].end,e[n].remove=!0):e[n].end>=e[o].start&&e[n].end<=e[o].end&&(e[o].start=e[n].start,e[n].remove=!0));for(o=0;o=r&&nt.range.end){var h={start:t.range.start,end:i};return i=e.correctTimeForHidden(t.options.moment,t.body.hiddenDates,h,i),n=t.range.conversion(o,r),(i.valueOf()-n.offset)*n.scale}return i=e.correctTimeForHidden(t.options.moment,t.body.hiddenDates,t.range,i),n=t.range.conversion(o,r),(i.valueOf()-n.offset)*n.scale},e.toTime=function(t,i,o){if(0==t.body.hiddenDates.length){var n=t.range.conversion(o);return new Date(i/n.scale+n.offset)}var s=e.getHiddenDurationBetween(t.body.hiddenDates,t.range.start,t.range.end),r=t.range.end-t.range.start-s,a=r*i/o,h=e.getAccumulatedHiddenDuration(t.body.hiddenDates,t.range,a);return new Date(h+a+t.range.start)},e.getHiddenDurationBetween=function(t,e,i){for(var o=0,n=0;n=e&&r=e&&r<=i&&(o+=r-s)}return o},e.correctTimeForHidden=function(t,i,o,n){return n=t(n).toDate().valueOf(),n-=e.getHiddenDurationBefore(t,i,o,n)},e.getHiddenDurationBefore=function(t,e,i,o){var n=0;o=t(o).toDate().valueOf();for(var s=0;s=i.start&&a=a&&(n+=a-r)}return n},e.getAccumulatedHiddenDuration=function(t,e,i){for(var o=0,n=0,s=e.start,r=0;r=e.start&&h=i)break;o+=h-a}}return o},e.snapAwayFromHidden=function(t,i,o,n){var s=e.isHidden(i,t);return 1==s.hidden?o<0?1==n?s.startDate-(s.endDate-i)-1:s.startDate-1:1==n?s.endDate+(i-s.startDate)+1:s.endDate+1:i},e.isHidden=function(t,e){for(var i=0;i=o&&t0){var e=[];if(Array.isArray(this.options.dataAttributes))e=this.options.dataAttributes;else{if("all"!=this.options.dataAttributes)return;e=(0,h.default)(this.data)}for(var i=0;ithis.max&&this.flush(),clearTimeout(this._timeout),this.queue.length>0&&"number"==typeof this.delay){var t=this;this._timeout=setTimeout(function(){t.flush()},this.delay)}},o.prototype.flush=function(){for(;this._queue.length>0;){var t=this._queue.shift();t.fn.apply(t.context||t.fn,t.args||[])}},t.exports=o},function(t,e){function i(t){if(t)return o(t)}function o(t){for(var e in i.prototype)t[e]=i.prototype[e];return t}t.exports=i,i.prototype.on=i.prototype.addEventListener=function(t,e){return this._callbacks=this._callbacks||{},(this._callbacks[t]=this._callbacks[t]||[]).push(e),this},i.prototype.once=function(t,e){function i(){o.off(t,i),e.apply(this,arguments)}var o=this;return this._callbacks=this._callbacks||{},i.fn=e,this.on(t,i),this},i.prototype.off=i.prototype.removeListener=i.prototype.removeAllListeners=i.prototype.removeEventListener=function(t,e){if(this._callbacks=this._callbacks||{},0==arguments.length)return this._callbacks={},this;var i=this._callbacks[t];if(!i)return this;if(1==arguments.length)return delete this._callbacks[t],this;for(var o,n=0;n=.4*v}if(this.options.showMinorLabels&&m){var k=this._repaintMinorText(c,y,t,b);k.style.width=_+"px"}f&&this.options.showMajorLabels?(c>0&&(void 0==w&&(w=c),k=this._repaintMajorText(c,s.getLabelMajor(),t,b)),g=this._repaintMajorLine(c,_,t,b)):m?g=this._repaintMinorLine(c,_,t,b):g&&(g.style.width=parseInt(g.style.width)+_+"px")}if(1e3!==x||u||(console.warn("Something is wrong with the Timeline scale. Limited drawing of grid lines to 1000 lines."),u=!0),this.options.showMajorLabels){var S=this.body.util.toTime(0),D=s.getLabelMajor(S),M=D.length*(this.props.majorCharWidth||10)+10;(void 0==w||Mt.left&&this.shape.topt.top}},{key:"isBoundingBoxOverlappingWith",value:function(t){return this.shape.boundingBox.leftt.left&&this.shape.boundingBox.topt.top}}],[{key:"updateGroupOptions",value:function(t,e,i){if(void 0!==i){var o=t.group;if(void 0!==e&&void 0!==e.group&&o!==e.group)throw new Error("updateGroupOptions: group values in options don't match.");if("number"==typeof o||"string"==typeof o&&""!=o){var n=i.get(o);h.selectiveNotDeepExtend(["font"],t,n),t.color=h.parseColor(t.color)}}}},{key:"parseOptions",value:function(e,i){var o=arguments.length>2&&void 0!==arguments[2]&&arguments[2],n=arguments.length>3&&void 0!==arguments[3]?arguments[3]:{},s=arguments[4],r=["color","fixed","shadow"];if(h.selectiveNotDeepExtend(r,e,i,o),t.checkMass(i),h.mergeOptions(e,i,"shadow",n),void 0!==i.color&&null!==i.color){var a=h.parseColor(i.color);h.fillIfDefined(e.color,a)}else!0===o&&null===i.color&&(e.color=h.bridgeObject(n.color));void 0!==i.fixed&&null!==i.fixed&&("boolean"==typeof i.fixed?(e.fixed.x=i.fixed,e.fixed.y=i.fixed):(void 0!==i.fixed.x&&"boolean"==typeof i.fixed.x&&(e.fixed.x=i.fixed.x),void 0!==i.fixed.y&&"boolean"==typeof i.fixed.y&&(e.fixed.y=i.fixed.y))),!0===o&&null===i.font&&(e.font=h.bridgeObject(n.font)),t.updateGroupOptions(e,i,s),void 0!==i.scaling&&h.mergeOptions(e.scaling,i.scaling,"label",n.scaling)}},{key:"checkMass",value:function(t,e){if(void 0!==t.mass&&t.mass<=0){var i="";void 0!==e&&(i=" in node id: "+e),console.log("%cNegative or zero mass disallowed"+i+", setting mass to 1.",C),t.mass=1}}}]),t}();e.default=O},function(t,e,i){function o(t){return t&&t.__esModule?t:{default:t}}Object.defineProperty(e,"__esModule",{value:!0});var n=i(6),s=o(n),r=i(0),a=o(r),h=i(1),d=o(h),l=i(2),u=function(){function t(){(0,a.default)(this,t)}return(0,d.default)(t,null,[{key:"choosify",value:function(t,e){var i=["node","edge","label"],o=!0,n=l.topMost(e,"chosen");if("boolean"==typeof n)o=n;else if("object"===(void 0===n?"undefined":(0,s.default)(n))){if(-1===i.indexOf(t))throw new Error("choosify: subOption '"+t+"' should be one of '"+i.join("', '")+"'");var r=l.topMost(e,["chosen",t]);"boolean"!=typeof r&&"function"!=typeof r||(o=r)}return o}},{key:"pointInRect",value:function(t,e,i){if(t.width<=0||t.height<=0)return!1;if(void 0!==i){var o={x:e.x-i.x,y:e.y-i.y};if(0!==i.angle){var n=-i.angle;e={x:Math.cos(n)*o.x-Math.sin(n)*o.y,y:Math.sin(n)*o.x+Math.cos(n)*o.y}}else e=o}var s=t.x+t.width,r=t.y+t.width;return t.lefte.x&&t.tope.y}},{key:"isValidLabel",value:function(t){return"string"==typeof t&&""!==t}}]),t}();e.default=u},function(t,e,i){i(125);for(var o=i(18),n=i(26),s=i(31),r=i(13)("toStringTag"),a="CSSRuleList,CSSStyleDeclaration,CSSValueList,ClientRectList,DOMRectList,DOMStringList,DOMTokenList,DataTransferItemList,FileList,HTMLAllCollection,HTMLCollection,HTMLFormElement,HTMLSelectElement,MediaList,MimeTypeArray,NamedNodeMap,NodeList,PaintRequestList,Plugin,PluginArray,SVGLengthList,SVGNumberList,SVGPathSegList,SVGPointList,SVGStringList,SVGTransformList,SourceBufferList,StyleSheetList,TextTrackCueList,TextTrackList,TouchList".split(","),h=0;hdocument.F=Object<\/script>"),t.close(),h=t.F;o--;)delete h.prototype[s[o]];return h()};t.exports=Object.create||function(t,e){var i;return null!==t?(a.prototype=o(t),i=new a,a.prototype=null,i[r]=t):i=h(),void 0===e?i:n(i,e)}},function(t,e){var i=Math.ceil,o=Math.floor;t.exports=function(t){return isNaN(t=+t)?0:(t>0?o:i)(t)}},function(t,e,i){var o=i(57)("keys"),n=i(40);t.exports=function(t){return o[t]||(o[t]=n(t))}},function(t,e,i){var o=i(18),n=o["__core-js_shared__"]||(o["__core-js_shared__"]={});t.exports=function(t){return n[t]||(n[t]={})}},function(t,e){t.exports="constructor,hasOwnProperty,isPrototypeOf,propertyIsEnumerable,toLocaleString,toString,valueOf".split(",")},function(t,e,i){var o=i(20).f,n=i(22),s=i(13)("toStringTag");t.exports=function(t,e,i){t&&!n(t=i?t:t.prototype,s)&&o(t,s,{configurable:!0,value:e})}},function(t,e,i){var o=i(135)(!0);i(79)(String,"String",function(t){this._t=String(t),this._i=0},function(){var t,e=this._t,i=this._i;return i>=e.length?{value:void 0,done:!0}:(t=o(e,i),this._i+=t.length,{value:t,done:!1})})},function(t,e,i){e.f=i(13)},function(t,e,i){var o=i(18),n=i(7),s=i(52),r=i(61),a=i(20).f;t.exports=function(t){var e=n.Symbol||(n.Symbol=s?{}:o.Symbol||{});"_"==t.charAt(0)||t in e||a(e,t,{value:r.f(t)})}},function(t,e){e.f=Object.getOwnPropertySymbols},function(t,e,i){function o(t){return t&&t.__esModule?t:{default:t}}function n(t,e){var i=p().hours(0).minutes(0).seconds(0).milliseconds(0),o=i.clone().add(-3,"days").valueOf(),n=i.clone().add(3,"days").valueOf();this.millisecondsPerPixelCache=void 0,void 0===e?(this.start=o,this.end=n):(this.start=e.start||o,this.end=e.end||n),this.rolling=!1,this.body=t,this.deltaDifference=0,this.scaleOffset=0,this.startToFront=!1,this.endToFront=!0,this.defaultOptions={rtl:!1,start:null,end:null,moment:p,direction:"horizontal",moveable:!0,zoomable:!0,min:null,max:null,zoomMin:10,zoomMax:31536e10,rollingMode:{follow:!1,offset:.5}},this.options=c.extend({},this.defaultOptions),this.props={touch:{}},this.animationTimer=null,this.body.emitter.on("panstart",this._onDragStart.bind(this)),this.body.emitter.on("panmove",this._onDrag.bind(this)),this.body.emitter.on("panend",this._onDragEnd.bind(this)),this.body.emitter.on("mousewheel",this._onMouseWheel.bind(this)),this.body.emitter.on("touch",this._onTouch.bind(this)),this.body.emitter.on("pinch",this._onPinch.bind(this)),this.body.dom.rollingModeBtn.addEventListener("click",this.startRolling.bind(this)),this.setOptions(e)}function s(t){if("horizontal"!=t&&"vertical"!=t)throw new TypeError('Unknown direction "'+t+'". Choose "horizontal" or "vertical".')}var r=i(8),a=o(r),h=i(19),d=o(h),l=i(6),u=o(l),c=i(2),p=i(9),f=i(16),m=i(36);n.prototype=new f,n.prototype.setOptions=function(t){if(t){var e=["animation","direction","min","max","zoomMin","zoomMax","moveable","zoomable","moment","activate","hiddenDates","zoomKey","rtl","showCurrentTime","rollingMode","horizontalScroll"];c.selectiveExtend(e,this.options,t),t.rollingMode&&t.rollingMode.follow&&this.startRolling(),("start"in t||"end"in t)&&this.setRange(t.start,t.end)}},n.prototype.startRolling=function(){function t(){e.stopRolling(),e.rolling=!0;var i=e.end-e.start,o=c.convert(new Date,"Date").valueOf(),n=o-i*e.options.rollingMode.offset,s=o+i*(1-e.options.rollingMode.offset),r={animation:!1};e.setRange(n,s,r),i=1/e.conversion(e.body.domProps.center.width).scale/10,i<30&&(i=30),i>1e3&&(i=1e3),e.body.dom.rollingModeBtn.style.visibility="hidden",e.currentTimeTimer=setTimeout(t,i)}var e=this;t()},n.prototype.stopRolling=function(){void 0!==this.currentTimeTimer&&(clearTimeout(this.currentTimeTimer),this.rolling=!1,this.body.dom.rollingModeBtn.style.visibility="visible")},n.prototype.setRange=function(t,e,i,o,n){i||(i={}),!0!==i.byUser&&(i.byUser=!1);var s=this,r=void 0!=t?c.convert(t,"Date").valueOf():null,h=void 0!=e?c.convert(e,"Date").valueOf():null;if(this._cancelAnimation(),this.millisecondsPerPixelCache=void 0,i.animation){var l=this.start,p=this.end,f="object"===(0,u.default)(i.animation)&&"duration"in i.animation?i.animation.duration:500,v="object"===(0,u.default)(i.animation)&&"easingFunction"in i.animation?i.animation.easingFunction:"easeInOutQuad",g=c.easingFunctions[v];if(!g)throw new Error("Unknown easing function "+(0,d.default)(v)+". Choose from: "+(0,a.default)(c.easingFunctions).join(", "));var y=(new Date).valueOf(),b=!1;return function t(){if(!s.props.touch.dragging){var e=(new Date).valueOf(),a=e-y,d=g(a/f),u=a>f,c=u||null===r?r:l+(r-l)*d,v=u||null===h?h:p+(h-p)*d;_=s._applyRange(c,v),m.updateHiddenDates(s.options.moment,s.body,s.options.hiddenDates),b=b||_;var w={start:new Date(s.start),end:new Date(s.end),byUser:i.byUser,event:i.event};if(n&&n(d,_,u),_&&s.body.emitter.emit("rangechange",w),u){if(b&&(s.body.emitter.emit("rangechanged",w),o))return o()}else s.animationTimer=setTimeout(t,20)}}()}var _=this._applyRange(r,h);if(m.updateHiddenDates(this.options.moment,this.body,this.options.hiddenDates),_){var w={start:new Date(this.start),end:new Date(this.end),byUser:i.byUser,event:i.event};if(this.body.emitter.emit("rangechange",w),clearTimeout(s.timeoutID),s.timeoutID=setTimeout(function(){s.body.emitter.emit("rangechanged",w)},200),o)return o()}},n.prototype.getMillisecondsPerPixel=function(){return void 0===this.millisecondsPerPixelCache&&(this.millisecondsPerPixelCache=(this.end-this.start)/this.body.dom.center.clientWidth),this.millisecondsPerPixelCache},n.prototype._cancelAnimation=function(){this.animationTimer&&(clearTimeout(this.animationTimer),this.animationTimer=null)},n.prototype._applyRange=function(t,e){var i,o=null!=t?c.convert(t,"Date").valueOf():this.start,n=null!=e?c.convert(e,"Date").valueOf():this.end,s=null!=this.options.max?c.convert(this.options.max,"Date").valueOf():null,r=null!=this.options.min?c.convert(this.options.min,"Date").valueOf():null;if(isNaN(o)||null===o)throw new Error('Invalid start "'+t+'"');if(isNaN(n)||null===n)throw new Error('Invalid end "'+e+'"');if(ns&&(n=s)),null!==s&&n>s&&(i=n-s,o-=i,n-=i,null!=r&&o=this.start-.5&&n<=this.end?(o=this.start,n=this.end):(i=a-(n-o),o-=i/2,n+=i/2)}}if(null!==this.options.zoomMax){var h=parseFloat(this.options.zoomMax);h<0&&(h=0),n-o>h&&(this.end-this.start===h&&othis.end?(o=this.start,n=this.end):(i=n-o-h,o+=i/2,n-=i/2))}var d=this.start!=o||this.end!=n;return o>=this.start&&o<=this.end||n>=this.start&&n<=this.end||this.start>=o&&this.start<=n||this.end>=o&&this.end<=n||this.body.emitter.emit("checkRangedItems"),this.start=o,this.end=n,d},n.prototype.getRange=function(){return{start:this.start,end:this.end}},n.prototype.conversion=function(t,e){return n.conversion(this.start,this.end,t,e)},n.conversion=function(t,e,i,o){return void 0===o&&(o=0),0!=i&&e-t!=0?{offset:t,scale:i/(e-t-o)}:{offset:0,scale:1}},n.prototype._onDragStart=function(t){this.deltaDifference=0,this.previousDelta=0,this.options.moveable&&this._isInsideRange(t)&&this.props.touch.allowDragging&&(this.stopRolling(),this.props.touch.start=this.start,this.props.touch.end=this.end,this.props.touch.dragging=!0,this.body.dom.root&&(this.body.dom.root.style.cursor="move"))},n.prototype._onDrag=function(t){if(t&&this.props.touch.dragging&&this.options.moveable&&this.props.touch.allowDragging){var e=this.options.direction;s(e);var i="horizontal"==e?t.deltaX:t.deltaY;i-=this.deltaDifference;var o=this.props.touch.end-this.props.touch.start;o-=m.getHiddenDurationBetween(this.body.hiddenDates,this.start,this.end);var n,r="horizontal"==e?this.body.domProps.center.width:this.body.domProps.center.height;n=this.options.rtl?i/r*o:-i/r*o;var a=this.props.touch.start+n,h=this.props.touch.end+n,d=m.snapAwayFromHidden(this.body.hiddenDates,a,this.previousDelta-i,!0),l=m.snapAwayFromHidden(this.body.hiddenDates,h,this.previousDelta-i,!0);if(d!=a||l!=h)return this.deltaDifference+=i,this.props.touch.start=d,this.props.touch.end=l,void this._onDrag(t);this.previousDelta=i,this._applyRange(a,h);var u=new Date(this.start),c=new Date(this.end);this.body.emitter.emit("rangechange",{start:u,end:c,byUser:!0,event:t}),this.body.emitter.emit("panmove")}},n.prototype._onDragEnd=function(t){this.props.touch.dragging&&this.options.moveable&&this.props.touch.allowDragging&&(this.props.touch.dragging=!1,this.body.dom.root&&(this.body.dom.root.style.cursor="auto"),this.body.emitter.emit("rangechanged",{start:new Date(this.start),end:new Date(this.end),byUser:!0,event:t}))},n.prototype._onMouseWheel=function(t){var e=0;if(t.wheelDelta?e=t.wheelDelta/120:t.detail&&(e=-t.detail/3),!(this.options.zoomKey&&!t[this.options.zoomKey]&&this.options.zoomable||!this.options.zoomable&&this.options.moveable)&&this.options.zoomable&&this.options.moveable&&this._isInsideRange(t)&&e){var i;i=e<0?1-e/5:1/(1+e/5);var o;if(this.rolling)o=this.start+(this.end-this.start)*this.options.rollingMode.offset;else{var n=this.getPointer({x:t.clientX,y:t.clientY},this.body.dom.center);o=this._pointerToDate(n)}this.zoom(i,o,e,t),t.preventDefault()}},n.prototype._onTouch=function(t){this.props.touch.start=this.start,this.props.touch.end=this.end,this.props.touch.allowDragging=!0,this.props.touch.center=null,this.scaleOffset=0,this.deltaDifference=0,c.preventDefault(t)},n.prototype._onPinch=function(t){if(this.options.zoomable&&this.options.moveable){c.preventDefault(t),this.props.touch.allowDragging=!1,this.props.touch.center||(this.props.touch.center=this.getPointer(t.center,this.body.dom.center)),this.stopRolling();var e=1/(t.scale+this.scaleOffset),i=this._pointerToDate(this.props.touch.center),o=m.getHiddenDurationBetween(this.body.hiddenDates,this.start,this.end),n=m.getHiddenDurationBefore(this.options.moment,this.body.hiddenDates,this,i),s=o-n,r=i-n+(this.props.touch.start-(i-n))*e,a=i+s+(this.props.touch.end-(i+s))*e;this.startToFront=1-e<=0,this.endToFront=e-1<=0;var h=m.snapAwayFromHidden(this.body.hiddenDates,r,1-e,!0),d=m.snapAwayFromHidden(this.body.hiddenDates,a,e-1,!0);h==r&&d==a||(this.props.touch.start=h,this.props.touch.end=d,this.scaleOffset=1-t.scale,r=h,a=d);var l={animation:!1,byUser:!0,event:t};this.setRange(r,a,l),this.startToFront=!1,this.endToFront=!0}},n.prototype._isInsideRange=function(t){var e,i=t.center?t.center.x:t.clientX;e=this.options.rtl?i-c.getAbsoluteLeft(this.body.dom.centerContainer):c.getAbsoluteRight(this.body.dom.centerContainer)-i;var o=this.body.util.toTime(e);return o>=this.start&&o<=this.end},n.prototype._pointerToDate=function(t){var e,i=this.options.direction;if(s(i),"horizontal"==i)return this.body.util.toTime(t.x).valueOf();var o=this.body.domProps.center.height;return e=this.conversion(o),t.y/e.scale+e.offset},n.prototype.getPointer=function(t,e){return this.options.rtl?{x:c.getAbsoluteRight(e)-t.x,y:t.y-c.getAbsoluteTop(e)}:{x:t.x-c.getAbsoluteLeft(e),y:t.y-c.getAbsoluteTop(e)}},n.prototype.zoom=function(t,e,i,o){null==e&&(e=(this.start+this.end)/2);var n=m.getHiddenDurationBetween(this.body.hiddenDates,this.start,this.end),s=m.getHiddenDurationBefore(this.options.moment,this.body.hiddenDates,this,e),r=n-s,a=e-s+(this.start-(e-s))*t,h=e+r+(this.end-(e+r))*t;this.startToFront=!(i>0),this.endToFront=!(-i>0) +;var d=m.snapAwayFromHidden(this.body.hiddenDates,a,i,!0),l=m.snapAwayFromHidden(this.body.hiddenDates,h,-i,!0);d==a&&l==h||(a=d,h=l);var u={animation:!1,byUser:!0,event:o};this.setRange(a,h,u),this.startToFront=!1,this.endToFront=!0},n.prototype.move=function(t){var e=this.end-this.start,i=this.start+e*t,o=this.end+e*t;this.start=i,this.end=o},n.prototype.moveTo=function(t){var e=(this.start+this.end)/2,i=e-t,o=this.start-i,n=this.end-i,s={animation:!1,byUser:!0,event:null};this.setRange(o,n,s)},t.exports=n},function(t,e,i){function o(t){return t&&t.__esModule?t:{default:t}}function n(){}var s=i(19),r=o(s),a=i(6),h=o(a),d=i(44),l=i(10),u=i(37),c=i(2),p=i(45),f=i(97),m=i(36),v=i(46);d(n.prototype),n.prototype._create=function(t){function e(t){this.isActive()&&this.emit("mousewheel",t);var e=0,i=0;if("detail"in t&&(i=-1*t.detail),"wheelDelta"in t&&(i=t.wheelDelta),"wheelDeltaY"in t&&(i=t.wheelDeltaY),"wheelDeltaX"in t&&(e=-1*t.wheelDeltaX),"axis"in t&&t.axis===t.HORIZONTAL_AXIS&&(e=-1*i,i=0),"deltaY"in t&&(i=-1*t.deltaY),"deltaX"in t&&(e=t.deltaX),this.options.zoomKey&&!t[this.options.zoomKey])if(t.preventDefault(),this.options.verticalScroll&&Math.abs(i)>=Math.abs(e)){var o=this.props.scrollTop,n=o+i;this.isActive()&&(this._setScrollTop(n),this._redraw(),this.emit("scroll",t))}else if(this.options.horizontalScroll){var s=Math.abs(e)>=Math.abs(i)?e:i,r=s/120*(this.range.end-this.range.start)/20,a=this.range.start+r,h=this.range.end+r,d={animation:!1,byUser:!0,event:t};this.range.setRange(a,h,d)}}function i(t){if(s.options.verticalScroll&&(t.preventDefault(),s.isActive())){var e=-t.target.scrollTop;s._setScrollTop(e),s._redraw(),s.emit("scrollSide",t)}}function o(t){if(t.preventDefault&&t.preventDefault(),!(!t.target.className.indexOf("vis")>-1||a))return t.dataTransfer.dropEffect="move",a=!0,!1}function n(t){t.preventDefault&&t.preventDefault(),t.stopPropagation&&t.stopPropagation();try{var e=JSON.parse(t.dataTransfer.getData("text"));if(!e||!e.content)return}catch(t){return!1}return a=!1,t.center={x:t.clientX,y:t.clientY},"item"!==e.target?s.itemSet._onAddItem(t):s.itemSet._onDropObjectOnItem(t),s.emit("drop",s.getEventProperties(t)),!1}this.dom={},this.dom.container=t,this.dom.root=document.createElement("div"),this.dom.background=document.createElement("div"),this.dom.backgroundVertical=document.createElement("div"),this.dom.backgroundHorizontal=document.createElement("div"),this.dom.centerContainer=document.createElement("div"),this.dom.leftContainer=document.createElement("div"),this.dom.rightContainer=document.createElement("div"),this.dom.center=document.createElement("div"),this.dom.left=document.createElement("div"),this.dom.right=document.createElement("div"),this.dom.top=document.createElement("div"),this.dom.bottom=document.createElement("div"),this.dom.shadowTop=document.createElement("div"),this.dom.shadowBottom=document.createElement("div"),this.dom.shadowTopLeft=document.createElement("div"),this.dom.shadowBottomLeft=document.createElement("div"),this.dom.shadowTopRight=document.createElement("div"),this.dom.shadowBottomRight=document.createElement("div"),this.dom.rollingModeBtn=document.createElement("div"),this.dom.root.className="vis-timeline",this.dom.background.className="vis-panel vis-background",this.dom.backgroundVertical.className="vis-panel vis-background vis-vertical",this.dom.backgroundHorizontal.className="vis-panel vis-background vis-horizontal",this.dom.centerContainer.className="vis-panel vis-center",this.dom.leftContainer.className="vis-panel vis-left",this.dom.rightContainer.className="vis-panel vis-right",this.dom.top.className="vis-panel vis-top",this.dom.bottom.className="vis-panel vis-bottom",this.dom.left.className="vis-content",this.dom.center.className="vis-content",this.dom.right.className="vis-content",this.dom.shadowTop.className="vis-shadow vis-top",this.dom.shadowBottom.className="vis-shadow vis-bottom",this.dom.shadowTopLeft.className="vis-shadow vis-top",this.dom.shadowBottomLeft.className="vis-shadow vis-bottom",this.dom.shadowTopRight.className="vis-shadow vis-top",this.dom.shadowBottomRight.className="vis-shadow vis-bottom",this.dom.rollingModeBtn.className="vis-rolling-mode-btn",this.dom.root.appendChild(this.dom.background),this.dom.root.appendChild(this.dom.backgroundVertical),this.dom.root.appendChild(this.dom.backgroundHorizontal),this.dom.root.appendChild(this.dom.centerContainer),this.dom.root.appendChild(this.dom.leftContainer),this.dom.root.appendChild(this.dom.rightContainer),this.dom.root.appendChild(this.dom.top),this.dom.root.appendChild(this.dom.bottom),this.dom.root.appendChild(this.dom.bottom),this.dom.root.appendChild(this.dom.rollingModeBtn),this.dom.centerContainer.appendChild(this.dom.center),this.dom.leftContainer.appendChild(this.dom.left),this.dom.rightContainer.appendChild(this.dom.right),this.dom.centerContainer.appendChild(this.dom.shadowTop),this.dom.centerContainer.appendChild(this.dom.shadowBottom),this.dom.leftContainer.appendChild(this.dom.shadowTopLeft),this.dom.leftContainer.appendChild(this.dom.shadowBottomLeft),this.dom.rightContainer.appendChild(this.dom.shadowTopRight),this.dom.rightContainer.appendChild(this.dom.shadowBottomRight),this.props={root:{},background:{},centerContainer:{},leftContainer:{},rightContainer:{},center:{},left:{},right:{},top:{},bottom:{},border:{},scrollTop:0,scrollTopMin:0},this.on("rangechange",function(){!0===this.initialDrawDone&&this._redraw()}.bind(this)),this.on("rangechanged",function(){this.initialRangeChangeDone||(this.initialRangeChangeDone=!0)}.bind(this)),this.on("touch",this._onTouch.bind(this)),this.on("panmove",this._onDrag.bind(this));var s=this;this._origRedraw=this._redraw.bind(this),this._redraw=c.throttle(this._origRedraw),this.on("_change",function(t){s.itemSet&&s.itemSet.initialItemSetDrawn&&t&&1==t.queue?s._redraw():s._origRedraw()}),this.hammer=new l(this.dom.root);var r=this.hammer.get("pinch").set({enable:!0});u.disablePreventDefaultVertically(r),this.hammer.get("pan").set({threshold:5,direction:l.DIRECTION_HORIZONTAL}),this.listeners={},["tap","doubletap","press","pinch","pan","panstart","panmove","panend"].forEach(function(t){var e=function(e){s.isActive()&&s.emit(t,e)};s.hammer.on(t,e),s.listeners[t]=e}),u.onTouch(this.hammer,function(t){s.emit("touch",t)}.bind(this)),u.onRelease(this.hammer,function(t){s.emit("release",t)}.bind(this)),this.dom.centerContainer.addEventListener?(this.dom.centerContainer.addEventListener("mousewheel",e.bind(this),!1),this.dom.centerContainer.addEventListener("DOMMouseScroll",e.bind(this),!1)):this.dom.centerContainer.attachEvent("onmousewheel",e.bind(this)),this.dom.left.parentNode.addEventListener("scroll",i.bind(this)),this.dom.right.parentNode.addEventListener("scroll",i.bind(this));var a=!1;if(this.dom.center.addEventListener("dragover",o.bind(this),!1),this.dom.center.addEventListener("drop",n.bind(this),!1),this.customTimes=[],this.touch={},this.redrawCount=0,this.initialDrawDone=!1,this.initialRangeChangeDone=!1,!t)throw new Error("No container provided");t.appendChild(this.dom.root)},n.prototype.setOptions=function(t){if(t){var e=["width","height","minHeight","maxHeight","autoResize","start","end","clickToUse","dataAttributes","hiddenDates","locale","locales","moment","rtl","zoomKey","horizontalScroll","verticalScroll"];if(c.selectiveExtend(e,this.options,t),this.dom.rollingModeBtn.style.visibility="hidden",this.options.rtl&&(this.dom.container.style.direction="rtl",this.dom.backgroundVertical.className="vis-panel vis-background vis-vertical-rtl"),this.options.verticalScroll&&(this.options.rtl?this.dom.rightContainer.className="vis-panel vis-right vis-vertical-scroll":this.dom.leftContainer.className="vis-panel vis-left vis-vertical-scroll"),"object"!==(0,h.default)(this.options.orientation)&&(this.options.orientation={item:void 0,axis:void 0}),"orientation"in t&&("string"==typeof t.orientation?this.options.orientation={item:t.orientation,axis:t.orientation}:"object"===(0,h.default)(t.orientation)&&("item"in t.orientation&&(this.options.orientation.item=t.orientation.item),"axis"in t.orientation&&(this.options.orientation.axis=t.orientation.axis))),"both"===this.options.orientation.axis){if(!this.timeAxis2){var i=this.timeAxis2=new p(this.body);i.setOptions=function(t){var e=t?c.extend({},t):{};e.orientation="top",p.prototype.setOptions.call(i,e)},this.components.push(i)}}else if(this.timeAxis2){var o=this.components.indexOf(this.timeAxis2);-1!==o&&this.components.splice(o,1),this.timeAxis2.destroy(),this.timeAxis2=null}if("function"==typeof t.drawPoints&&(t.drawPoints={onRender:t.drawPoints}),"hiddenDates"in this.options&&m.convertHiddenOptions(this.options.moment,this.body,this.options.hiddenDates),"clickToUse"in t&&(t.clickToUse?this.activator||(this.activator=new f(this.dom.root)):this.activator&&(this.activator.destroy(),delete this.activator)),"showCustomTime"in t)throw new Error("Option `showCustomTime` is deprecated. Create a custom time bar via timeline.addCustomTime(time [, id])");this._initAutoResize()}if(this.components.forEach(function(e){return e.setOptions(t)}),"configure"in t){this.configurator||(this.configurator=this._createConfigurator()),this.configurator.setOptions(t.configure);var n=c.deepExtend({},this.options);this.components.forEach(function(t){c.deepExtend(n,t.options)}),this.configurator.setModuleOptions({global:n})}this._redraw()},n.prototype.isActive=function(){return!this.activator||this.activator.active},n.prototype.destroy=function(){this.setItems(null),this.setGroups(null),this.off(),this._stopAutoResize(),this.dom.root.parentNode&&this.dom.root.parentNode.removeChild(this.dom.root),this.dom=null,this.activator&&(this.activator.destroy(),delete this.activator);for(var t in this.listeners)this.listeners.hasOwnProperty(t)&&delete this.listeners[t];this.listeners=null,this.hammer=null,this.components.forEach(function(t){return t.destroy()}),this.body=null},n.prototype.setCustomTime=function(t,e){var i=this.customTimes.filter(function(t){return e===t.options.id});if(0===i.length)throw new Error("No custom time bar found with id "+(0,r.default)(e));i.length>0&&i[0].setCustomTime(t)},n.prototype.getCustomTime=function(t){var e=this.customTimes.filter(function(e){return e.options.id===t});if(0===e.length)throw new Error("No custom time bar found with id "+(0,r.default)(t));return e[0].getCustomTime()},n.prototype.setCustomTimeTitle=function(t,e){var i=this.customTimes.filter(function(t){return t.options.id===e});if(0===i.length)throw new Error("No custom time bar found with id "+(0,r.default)(e));if(i.length>0)return i[0].setCustomTitle(t)},n.prototype.getEventProperties=function(t){return{event:t}},n.prototype.addCustomTime=function(t,e){var i=void 0!==t?c.convert(t,"Date").valueOf():new Date;if(this.customTimes.some(function(t){return t.options.id===e}))throw new Error("A custom time with id "+(0,r.default)(e)+" already exists");var o=new v(this.body,c.extend({},this.options,{time:i,id:e}));return this.customTimes.push(o),this.components.push(o),this._redraw(),e},n.prototype.removeCustomTime=function(t){var e=this.customTimes.filter(function(e){return e.options.id===t});if(0===e.length)throw new Error("No custom time bar found with id "+(0,r.default)(t));e.forEach(function(t){this.customTimes.splice(this.customTimes.indexOf(t),1),this.components.splice(this.components.indexOf(t),1),t.destroy()}.bind(this))},n.prototype.getVisibleItems=function(){return this.itemSet&&this.itemSet.getVisibleItems()||[]},n.prototype.fit=function(t,e){var i=this.getDataRange();if(null!==i.min||null!==i.max){var o=i.max-i.min,n=new Date(i.min.valueOf()-.01*o),s=new Date(i.max.valueOf()+.01*o),r=!t||void 0===t.animation||t.animation;this.range.setRange(n,s,{animation:r},e)}},n.prototype.getDataRange=function(){throw new Error("Cannot invoke abstract method getDataRange")},n.prototype.setWindow=function(t,e,i,o){"function"==typeof arguments[2]&&(o=arguments[2],i={});var n,s;1==arguments.length?(s=arguments[0],n=void 0===s.animation||s.animation,this.range.setRange(s.start,s.end,{animation:n})):2==arguments.length&&"function"==typeof arguments[1]?(s=arguments[0],o=arguments[1],n=void 0===s.animation||s.animation,this.range.setRange(s.start,s.end,{animation:n},o)):(n=!i||void 0===i.animation||i.animation,this.range.setRange(t,e,{animation:n},o))},n.prototype.moveTo=function(t,e,i){"function"==typeof arguments[1]&&(i=arguments[1],e={});var o=this.range.end-this.range.start,n=c.convert(t,"Date").valueOf(),s=n-o/2,r=n+o/2,a=!e||void 0===e.animation||e.animation;this.range.setRange(s,r,{animation:a},i)},n.prototype.getWindow=function(){var t=this.range.getRange();return{start:new Date(t.start),end:new Date(t.end)}},n.prototype.zoomIn=function(t,e,i){if(!(!t||t<0||t>1)){"function"==typeof arguments[1]&&(i=arguments[1],e={});var o=this.getWindow(),n=o.start.valueOf(),s=o.end.valueOf(),r=s-n,a=r/(1+t),h=(r-a)/2,d=n+h,l=s-h;this.setWindow(d,l,e,i)}},n.prototype.zoomOut=function(t,e,i){if(!(!t||t<0||t>1)){"function"==typeof arguments[1]&&(i=arguments[1],e={});var o=this.getWindow(),n=o.start.valueOf(),s=o.end.valueOf(),r=s-n,a=n-r*t/2,h=s+r*t/2;this.setWindow(a,h,e,i)}},n.prototype.redraw=function(){this._redraw()},n.prototype._redraw=function(){this.redrawCount++;var t=!1,e=this.options,i=this.props,o=this.dom;if(o&&o.container&&0!=o.root.offsetWidth){m.updateHiddenDates(this.options.moment,this.body,this.options.hiddenDates),"top"==e.orientation?(c.addClassName(o.root,"vis-top"),c.removeClassName(o.root,"vis-bottom")):(c.removeClassName(o.root,"vis-top"),c.addClassName(o.root,"vis-bottom")),o.root.style.maxHeight=c.option.asSize(e.maxHeight,""),o.root.style.minHeight=c.option.asSize(e.minHeight,""),o.root.style.width=c.option.asSize(e.width,""),i.border.left=(o.centerContainer.offsetWidth-o.centerContainer.clientWidth)/2,i.border.right=i.border.left,i.border.top=(o.centerContainer.offsetHeight-o.centerContainer.clientHeight)/2,i.border.bottom=i.border.top,i.borderRootHeight=o.root.offsetHeight-o.root.clientHeight,i.borderRootWidth=o.root.offsetWidth-o.root.clientWidth,0===o.centerContainer.clientHeight&&(i.border.left=i.border.top,i.border.right=i.border.left),0===o.root.clientHeight&&(i.borderRootWidth=i.borderRootHeight),i.center.height=o.center.offsetHeight,i.left.height=o.left.offsetHeight,i.right.height=o.right.offsetHeight,i.top.height=o.top.clientHeight||-i.border.top,i.bottom.height=o.bottom.clientHeight||-i.border.bottom;var n=Math.max(i.left.height,i.center.height,i.right.height),s=i.top.height+n+i.bottom.height+i.borderRootHeight+i.border.top+i.border.bottom;o.root.style.height=c.option.asSize(e.height,s+"px"),i.root.height=o.root.offsetHeight,i.background.height=i.root.height-i.borderRootHeight;var r=i.root.height-i.top.height-i.bottom.height-i.borderRootHeight;i.centerContainer.height=r,i.leftContainer.height=r,i.rightContainer.height=i.leftContainer.height,i.root.width=o.root.offsetWidth,i.background.width=i.root.width-i.borderRootWidth,this.initialDrawDone||(i.scrollbarWidth=c.getScrollBarWidth()),e.verticalScroll?e.rtl?(i.left.width=o.leftContainer.clientWidth||-i.border.left,i.right.width=o.rightContainer.clientWidth+i.scrollbarWidth||-i.border.right):(i.left.width=o.leftContainer.clientWidth+i.scrollbarWidth||-i.border.left,i.right.width=o.rightContainer.clientWidth||-i.border.right):(i.left.width=o.leftContainer.clientWidth||-i.border.left,i.right.width=o.rightContainer.clientWidth||-i.border.right),this._setDOM();var a=this._updateScrollTop();"top"!=e.orientation.item&&(a+=Math.max(i.centerContainer.height-i.center.height-i.border.top-i.border.bottom,0)),o.center.style.top=a+"px";var h=0==i.scrollTop?"hidden":"",d=i.scrollTop==i.scrollTopMin?"hidden":"";o.shadowTop.style.visibility=h,o.shadowBottom.style.visibility=d,o.shadowTopLeft.style.visibility=h,o.shadowBottomLeft.style.visibility=d,o.shadowTopRight.style.visibility=h,o.shadowBottomRight.style.visibility=d,e.verticalScroll&&(o.rightContainer.className="vis-panel vis-right vis-vertical-scroll",o.leftContainer.className="vis-panel vis-left vis-vertical-scroll",o.shadowTopRight.style.visibility="hidden",o.shadowBottomRight.style.visibility="hidden",o.shadowTopLeft.style.visibility="hidden",o.shadowBottomLeft.style.visibility="hidden",o.left.style.top="0px",o.right.style.top="0px"),(!e.verticalScroll||i.center.heighti.centerContainer.height;this.hammer.get("pan").set({direction:u?l.DIRECTION_ALL:l.DIRECTION_HORIZONTAL}),this.components.forEach(function(e){t=e.redraw()||t});if(t){if(this.redrawCount<5)return void this.body.emitter.emit("_change");console.log("WARNING: infinite loop in redraw?")}else this.redrawCount=0;this.body.emitter.emit("changed")}},n.prototype._setDOM=function(){var t=this.props,e=this.dom;t.leftContainer.width=t.left.width,t.rightContainer.width=t.right.width;var i=t.root.width-t.left.width-t.right.width-t.borderRootWidth;t.center.width=i,t.centerContainer.width=i,t.top.width=i,t.bottom.width=i,e.background.style.height=t.background.height+"px",e.backgroundVertical.style.height=t.background.height+"px",e.backgroundHorizontal.style.height=t.centerContainer.height+"px",e.centerContainer.style.height=t.centerContainer.height+"px",e.leftContainer.style.height=t.leftContainer.height+"px",e.rightContainer.style.height=t.rightContainer.height+"px",e.background.style.width=t.background.width+"px",e.backgroundVertical.style.width=t.centerContainer.width+"px",e.backgroundHorizontal.style.width=t.background.width+"px",e.centerContainer.style.width=t.center.width+"px",e.top.style.width=t.top.width+"px",e.bottom.style.width=t.bottom.width+"px",e.background.style.left="0",e.background.style.top="0",e.backgroundVertical.style.left=t.left.width+t.border.left+"px",e.backgroundVertical.style.top="0",e.backgroundHorizontal.style.left="0",e.backgroundHorizontal.style.top=t.top.height+"px",e.centerContainer.style.left=t.left.width+"px",e.centerContainer.style.top=t.top.height+"px",e.leftContainer.style.left="0",e.leftContainer.style.top=t.top.height+"px",e.rightContainer.style.left=t.left.width+t.center.width+"px",e.rightContainer.style.top=t.top.height+"px",e.top.style.left=t.left.width+"px",e.top.style.top="0",e.bottom.style.left=t.left.width+"px",e.bottom.style.top=t.top.height+t.centerContainer.height+"px",e.center.style.left="0",e.left.style.left="0",e.right.style.left="0"},n.prototype.repaint=function(){throw new Error("Function repaint is deprecated. Use redraw instead.")},n.prototype.setCurrentTime=function(t){if(!this.currentTime)throw new Error("Option showCurrentTime must be true");this.currentTime.setCurrentTime(t)},n.prototype.getCurrentTime=function(){if(!this.currentTime)throw new Error("Option showCurrentTime must be true");return this.currentTime.getCurrentTime()},n.prototype._toTime=function(t){return m.toTime(this,t,this.props.center.width)},n.prototype._toGlobalTime=function(t){return m.toTime(this,t,this.props.root.width)},n.prototype._toScreen=function(t){return m.toScreen(this,t,this.props.center.width)},n.prototype._toGlobalScreen=function(t){return m.toScreen(this,t,this.props.root.width)},n.prototype._initAutoResize=function(){1==this.options.autoResize?this._startAutoResize():this._stopAutoResize()},n.prototype._startAutoResize=function(){var t=this;this._stopAutoResize(),this._onResize=function(){if(1!=t.options.autoResize)return void t._stopAutoResize();t.dom.root&&(t.dom.root.offsetWidth==t.props.lastWidth&&t.dom.root.offsetHeight==t.props.lastHeight||(t.props.lastWidth=t.dom.root.offsetWidth,t.props.lastHeight=t.dom.root.offsetHeight,t.props.scrollbarWidth=c.getScrollBarWidth(),t.body.emitter.emit("_change")))},c.addEventListener(window,"resize",this._onResize),t.dom.root&&(t.props.lastWidth=t.dom.root.offsetWidth,t.props.lastHeight=t.dom.root.offsetHeight),this.watchTimer=setInterval(this._onResize,1e3)},n.prototype._stopAutoResize=function(){this.watchTimer&&(clearInterval(this.watchTimer),this.watchTimer=void 0),this._onResize&&(c.removeEventListener(window,"resize",this._onResize),this._onResize=null)},n.prototype._onTouch=function(t){this.touch.allowDragging=!0,this.touch.initialScrollTop=this.props.scrollTop},n.prototype._onPinch=function(t){this.touch.allowDragging=!1},n.prototype._onDrag=function(t){if(t&&this.touch.allowDragging){var e=t.deltaY,i=this._getScrollTop(),o=this._setScrollTop(this.touch.initialScrollTop+e);this.options.verticalScroll&&(this.dom.left.parentNode.scrollTop=-this.props.scrollTop,this.dom.right.parentNode.scrollTop=-this.props.scrollTop),o!=i&&this.emit("verticalDrag")}},n.prototype._setScrollTop=function(t){return this.props.scrollTop=t,this._updateScrollTop(),this.props.scrollTop},n.prototype._updateScrollTop=function(){var t=Math.min(this.props.centerContainer.height-this.props.center.height,0);return t!=this.props.scrollTopMin&&("top"!=this.options.orientation.item&&(this.props.scrollTop+=t-this.props.scrollTopMin),this.props.scrollTopMin=t),this.props.scrollTop>0&&(this.props.scrollTop=0),this.props.scrollTop0&&this.current.milliseconds()0&&this.current.seconds()0&&this.current.minutes()0&&this.current.hours()0?t.step:1,this.autoScale=!1)},o.prototype.setAutoScale=function(t){this.autoScale=t},o.prototype.setMinimumStep=function(t){if(void 0!=t){31104e9>t&&(this.scale="year",this.step=1e3),15552e9>t&&(this.scale="year",this.step=500),31104e8>t&&(this.scale="year",this.step=100),15552e8>t&&(this.scale="year",this.step=50),31104e7>t&&(this.scale="year",this.step=10),15552e7>t&&(this.scale="year",this.step=5),31104e6>t&&(this.scale="year",this.step=1),7776e6>t&&(this.scale="month",this.step=3),2592e6>t&&(this.scale="month",this.step=1),432e6>t&&(this.scale="day",this.step=5),1728e5>t&&(this.scale="day",this.step=2),864e5>t&&(this.scale="day",this.step=1),432e5>t&&(this.scale="weekday",this.step=1),144e5>t&&(this.scale="hour",this.step=4),36e5>t&&(this.scale="hour",this.step=1),9e5>t&&(this.scale="minute",this.step=15),6e5>t&&(this.scale="minute",this.step=10),3e5>t&&(this.scale="minute",this.step=5),6e4>t&&(this.scale="minute",this.step=1),15e3>t&&(this.scale="second",this.step=15),1e4>t&&(this.scale="second",this.step=10),5e3>t&&(this.scale="second",this.step=5),1e3>t&&(this.scale="second",this.step=1),200>t&&(this.scale="millisecond",this.step=200),100>t&&(this.scale="millisecond",this.step=100),50>t&&(this.scale="millisecond",this.step=50),10>t&&(this.scale="millisecond",this.step=10),5>t&&(this.scale="millisecond",this.step=5),1>t&&(this.scale="millisecond",this.step=1)}},o.snap=function(t,e,i){var o=n(t);if("year"==e){var s=o.year()+Math.round(o.month()/12);o.year(Math.round(s/i)*i),o.month(0),o.date(0),o.hours(0),o.minutes(0),o.seconds(0),o.milliseconds(0)}else if("month"==e)o.date()>15?(o.date(1),o.add(1,"month")):o.date(1),o.hours(0),o.minutes(0),o.seconds(0),o.milliseconds(0);else if("week"==e)o.weekday()>2?(o.weekday(0),o.add(1,"week")):o.weekday(0),o.hours(0),o.minutes(0),o.seconds(0),o.milliseconds(0);else if("day"==e){switch(i){case 5:case 2:o.hours(24*Math.round(o.hours()/24));break;default:o.hours(12*Math.round(o.hours()/12))}o.minutes(0),o.seconds(0),o.milliseconds(0)}else if("weekday"==e){switch(i){case 5:case 2:o.hours(12*Math.round(o.hours()/12));break;default:o.hours(6*Math.round(o.hours()/6))}o.minutes(0),o.seconds(0),o.milliseconds(0)}else if("hour"==e){switch(i){case 4:o.minutes(60*Math.round(o.minutes()/60));break;default:o.minutes(30*Math.round(o.minutes()/30))}o.seconds(0),o.milliseconds(0)}else if("minute"==e){switch(i){case 15:case 10:o.minutes(5*Math.round(o.minutes()/5)),o.seconds(0);break;case 5:o.seconds(60*Math.round(o.seconds()/60));break;default:o.seconds(30*Math.round(o.seconds()/30))}o.milliseconds(0)}else if("second"==e)switch(i){case 15:case 10:o.seconds(5*Math.round(o.seconds()/5)),o.milliseconds(0);break;case 5:o.milliseconds(1e3*Math.round(o.milliseconds()/1e3));break;default:o.milliseconds(500*Math.round(o.milliseconds()/500))}else if("millisecond"==e){var r=i>5?i/2:1;o.milliseconds(Math.round(o.milliseconds()/r)*r)}return o},o.prototype.isMajor=function(){if(1==this.switchedYear)switch(this.scale){case"year":case"month":case"week":case"weekday":case"day":case"hour":case"minute":case"second":case"millisecond":return!0;default:return!1}else if(1==this.switchedMonth)switch(this.scale){case"week":case"weekday":case"day":case"hour":case"minute":case"second":case"millisecond":return!0;default:return!1}else if(1==this.switchedDay)switch(this.scale){case"millisecond":case"second":case"minute":case"hour":return!0;default:return!1}var t=this.moment(this.current);switch(this.scale){case"millisecond":return 0==t.milliseconds();case"second":return 0==t.seconds();case"minute":return 0==t.hours()&&0==t.minutes();case"hour":return 0==t.hours();case"weekday":case"day":case"week":return 1==t.date();case"month":return 0==t.month();case"year":default:return!1}},o.prototype.getLabelMinor=function(t){if(void 0==t&&(t=this.current),t instanceof Date&&(t=this.moment(t)),"function"==typeof this.format.minorLabels)return this.format.minorLabels(t,this.scale,this.step);var e=this.format.minorLabels[this.scale];switch(this.scale){case"week":if(this.isMajor()&&0!==t.weekday())return"";default:return e&&e.length>0?this.moment(t).format(e):""}},o.prototype.getLabelMajor=function(t){if(void 0==t&&(t=this.current),t instanceof Date&&(t=this.moment(t)),"function"==typeof this.format.majorLabels)return this.format.majorLabels(t,this.scale,this.step);var e=this.format.majorLabels[this.scale];return e&&e.length>0?this.moment(t).format(e):""},o.prototype.getClassName=function(){function t(t){return t/a%2==0?" vis-even":" vis-odd"}function e(t){return t.isSame(new Date,"day")?" vis-today":t.isSame(n().add(1,"day"),"day")?" vis-tomorrow":t.isSame(n().add(-1,"day"),"day")?" vis-yesterday":""}function i(t){return t.isSame(new Date,"week")?" vis-current-week":""}function o(t){return t.isSame(new Date,"month")?" vis-current-month":""}var n=this.moment,s=this.moment(this.current),r=s.locale?s.locale("en"):s.lang("en"),a=this.step,h=[];switch(this.scale){case"millisecond":h.push(e(r)),h.push(t(r.milliseconds()));break;case"second":h.push(e(r)),h.push(t(r.seconds()));break;case"minute":h.push(e(r)),h.push(t(r.minutes()));break;case"hour":h.push("vis-h"+r.hours()+(4==this.step?"-h"+(r.hours()+4):"")),h.push(e(r)),h.push(t(r.hours()));break;case"weekday":h.push("vis-"+r.format("dddd").toLowerCase()),h.push(e(r)),h.push(i(r)),h.push(t(r.date()));break;case"day":h.push("vis-day"+r.date()),h.push("vis-"+r.format("MMMM").toLowerCase()),h.push(e(r)),h.push(o(r)),h.push(this.step<=2?e(r):""),h.push(this.step<=2?"vis-"+r.format("dddd").toLowerCase():""), +h.push(t(r.date()-1));break;case"week":h.push("vis-week"+r.format("w")),h.push(i(r)),h.push(t(r.week()));break;case"month":h.push("vis-"+r.format("MMMM").toLowerCase()),h.push(o(r)),h.push(t(r.month()));break;case"year":h.push("vis-year"+r.year()),h.push(function(t){return t.isSame(new Date,"year")?" vis-current-year":""}(r)),h.push(t(r.year()))}return h.filter(String).join(" ")},t.exports=o},function(t,e,i){function o(t,e){this.body=t,this.defaultOptions={rtl:!1,showCurrentTime:!0,moment:r,locales:a,locale:"en"},this.options=n.extend({},this.defaultOptions),this.offset=0,this._create(),this.setOptions(e)}var n=i(2),s=i(16),r=i(9),a=i(98);o.prototype=new s,o.prototype._create=function(){var t=document.createElement("div");t.className="vis-current-time",t.style.position="absolute",t.style.top="0px",t.style.height="100%",this.bar=t},o.prototype.destroy=function(){this.options.showCurrentTime=!1,this.redraw(),this.body=null},o.prototype.setOptions=function(t){t&&n.selectiveExtend(["rtl","showCurrentTime","moment","locale","locales"],this.options,t)},o.prototype.redraw=function(){if(this.options.showCurrentTime){var t=this.body.dom.backgroundVertical;this.bar.parentNode!=t&&(this.bar.parentNode&&this.bar.parentNode.removeChild(this.bar),t.appendChild(this.bar),this.start());var e=this.options.moment((new Date).valueOf()+this.offset),i=this.body.util.toScreen(e),o=this.options.locales[this.options.locale];o||(this.warned||(console.log("WARNING: options.locales['"+this.options.locale+"'] not found. See http://visjs.org/docs/timeline/#Localization"),this.warned=!0),o=this.options.locales.en);var n=o.current+" "+o.time+": "+e.format("dddd, MMMM Do YYYY, H:mm:ss");n=n.charAt(0).toUpperCase()+n.substring(1),this.options.rtl?this.bar.style.right=i+"px":this.bar.style.left=i+"px",this.bar.title=n}else this.bar.parentNode&&this.bar.parentNode.removeChild(this.bar),this.stop();return!1},o.prototype.start=function(){function t(){e.stop();var i=e.body.range.conversion(e.body.domProps.center.width).scale,o=1/i/10;o<30&&(o=30),o>1e3&&(o=1e3),e.redraw(),e.body.emitter.emit("currentTimeTick"),e.currentTimeTimer=setTimeout(t,o)}var e=this;t()},o.prototype.stop=function(){void 0!==this.currentTimeTimer&&(clearTimeout(this.currentTimeTimer),delete this.currentTimeTimer)},o.prototype.setCurrentTime=function(t){var e=n.convert(t,"Date").valueOf(),i=(new Date).valueOf();this.offset=e-i,this.redraw()},o.prototype.getCurrentTime=function(){return new Date((new Date).valueOf()+this.offset)},t.exports=o},function(t,e,i){function o(t,e,i){if(this.groupId=t,this.subgroups={},this.subgroupStack={},this.subgroupStackAll=!1,this.doInnerStack=!1,this.subgroupIndex=0,this.subgroupOrderer=e&&e.subgroupOrder,this.itemSet=i,this.isVisible=null,this.stackDirty=!0,e&&e.nestedGroups&&(this.nestedGroups=e.nestedGroups,0==e.showNested?this.showNested=!1:this.showNested=!0),e&&e.subgroupStack)if("boolean"==typeof e.subgroupStack)this.doInnerStack=e.subgroupStack,this.subgroupStackAll=e.subgroupStack;else for(var o in e.subgroupStack)this.subgroupStack[o]=e.subgroupStack[o],this.doInnerStack=this.doInnerStack||e.subgroupStack[o];this.nestedInGroup=null,this.dom={},this.props={label:{width:0,height:0}},this.className=null,this.items={},this.visibleItems=[],this.itemsInRange=[],this.orderedItems={byStart:[],byEnd:[]},this.checkRangedItems=!1;var n=this;this.itemSet.body.emitter.on("checkRangedItems",function(){n.checkRangedItems=!0}),this._create(),this.setData(e)}var n=i(8),s=function(t){return t&&t.__esModule?t:{default:t}}(n),r=i(2),a=i(100);o.prototype._create=function(){var t=document.createElement("div");this.itemSet.options.groupEditable.order?t.className="vis-label draggable":t.className="vis-label",this.dom.label=t;var e=document.createElement("div");e.className="vis-inner",t.appendChild(e),this.dom.inner=e;var i=document.createElement("div");i.className="vis-group",i["timeline-group"]=this,this.dom.foreground=i,this.dom.background=document.createElement("div"),this.dom.background.className="vis-group",this.dom.axis=document.createElement("div"),this.dom.axis.className="vis-group",this.dom.marker=document.createElement("div"),this.dom.marker.style.visibility="hidden",this.dom.marker.style.position="absolute",this.dom.marker.innerHTML="",this.dom.background.appendChild(this.dom.marker)},o.prototype.setData=function(t){var e,i;if(this.itemSet.options&&this.itemSet.options.groupTemplate?(i=this.itemSet.options.groupTemplate.bind(this),e=i(t,this.dom.inner)):e=t&&t.content,e instanceof Element){for(this.dom.inner.appendChild(e);this.dom.inner.firstChild;)this.dom.inner.removeChild(this.dom.inner.firstChild);this.dom.inner.appendChild(e)}else e instanceof Object?i(t,this.dom.inner):this.dom.inner.innerHTML=void 0!==e&&null!==e?e:this.groupId||"";if(this.dom.label.title=t&&t.title||"",this.dom.inner.firstChild?r.removeClassName(this.dom.inner,"vis-hidden"):r.addClassName(this.dom.inner,"vis-hidden"),t&&t.nestedGroups){this.nestedGroups&&this.nestedGroups==t.nestedGroups||(this.nestedGroups=t.nestedGroups),void 0===t.showNested&&void 0!==this.showNested||(0==t.showNested?this.showNested=!1:this.showNested=!0),r.addClassName(this.dom.label,"vis-nesting-group");var o=this.itemSet.options.rtl?"collapsed-rtl":"collapsed";this.showNested?(r.removeClassName(this.dom.label,o),r.addClassName(this.dom.label,"expanded")):(r.removeClassName(this.dom.label,"expanded"),r.addClassName(this.dom.label,o))}else this.nestedGroups&&(this.nestedGroups=null,o=this.itemSet.options.rtl?"collapsed-rtl":"collapsed",r.removeClassName(this.dom.label,o),r.removeClassName(this.dom.label,"expanded"),r.removeClassName(this.dom.label,"vis-nesting-group"));t&&t.nestedInGroup&&(r.addClassName(this.dom.label,"vis-nested-group"),this.itemSet.options&&this.itemSet.options.rtl?this.dom.inner.style.paddingRight="30px":this.dom.inner.style.paddingLeft="30px");var n=t&&t.className||null;n!=this.className&&(this.className&&(r.removeClassName(this.dom.label,this.className),r.removeClassName(this.dom.foreground,this.className),r.removeClassName(this.dom.background,this.className),r.removeClassName(this.dom.axis,this.className)),r.addClassName(this.dom.label,n),r.addClassName(this.dom.foreground,n),r.addClassName(this.dom.background,n),r.addClassName(this.dom.axis,n),this.className=n),this.style&&(r.removeCssText(this.dom.label,this.style),this.style=null),t&&t.style&&(r.addCssText(this.dom.label,t.style),this.style=t.style)},o.prototype.getLabelWidth=function(){return this.props.label.width},o.prototype._didMarkerHeightChange=function(){var t=this.dom.marker.clientHeight;if(t!=this.lastMarkerHeight){this.lastMarkerHeight=t;var e={},i=0;r.forEach(this.items,function(t,o){if(t.dirty=!0,t.displayed){e[o]=t.redraw(!0),i=e[o].length}});if(i>0)for(var o=0;o0)for(var u=0;u0){var e=this;this.resetSubgroups(),r.forEach(this.visibleItems,function(i){void 0!==i.data.subgroup&&(e.subgroups[i.data.subgroup].height=Math.max(e.subgroups[i.data.subgroup].height,i.height+t.item.vertical),e.subgroups[i.data.subgroup].visible=!0)})}},o.prototype._isGroupVisible=function(t,e){return this.top<=t.body.domProps.centerContainer.height-t.body.domProps.scrollTop+e.axis&&this.top+this.height+e.axis>=-t.body.domProps.scrollTop},o.prototype._calculateHeight=function(t){var e,i=this.visibleItems;if(i.length>0){var o=i[0].top,n=i[0].top+i[0].height;if(r.forEach(i,function(t){o=Math.min(o,t.top),n=Math.max(n,t.top+t.height)}),o>t.axis){var s=o-t.axis;n-=s,r.forEach(i,function(t){t.top-=s})}e=n+t.item.vertical/2}else e=0;return e=Math.max(e,this.props.label.height)},o.prototype.show=function(){this.dom.label.parentNode||this.itemSet.dom.labelSet.appendChild(this.dom.label),this.dom.foreground.parentNode||this.itemSet.dom.foreground.appendChild(this.dom.foreground),this.dom.background.parentNode||this.itemSet.dom.background.appendChild(this.dom.background),this.dom.axis.parentNode||this.itemSet.dom.axis.appendChild(this.dom.axis)},o.prototype.hide=function(){var t=this.dom.label;t.parentNode&&t.parentNode.removeChild(t);var e=this.dom.foreground;e.parentNode&&e.parentNode.removeChild(e);var i=this.dom.background;i.parentNode&&i.parentNode.removeChild(i);var o=this.dom.axis;o.parentNode&&o.parentNode.removeChild(o)},o.prototype.add=function(t){if(this.items[t.id]=t,t.setParent(this),this.stackDirty=!0,void 0!==t.data.subgroup&&(this._addToSubgroup(t),this.orderSubgroups()),-1==this.visibleItems.indexOf(t)){var e=this.itemSet.body.range;this._checkIfVisible(t,this.visibleItems,e)}},o.prototype._addToSubgroup=function(t,e){e=e||t.data.subgroup,void 0!=e&&void 0===this.subgroups[e]&&(this.subgroups[e]={height:0,top:0,start:t.data.start,end:t.data.end||t.data.start,visible:!1,index:this.subgroupIndex,items:[],stack:this.subgroupStackAll||this.subgroupStack[e]||!1},this.subgroupIndex++),new Date(t.data.start)new Date(this.subgroups[e].end)&&(this.subgroups[e].end=i),this.subgroups[e].items.push(t)},o.prototype._updateSubgroupsSizes=function(){var t=this;if(t.subgroups)for(var e in t.subgroups){var i=t.subgroups[e].items[0].data.end||t.subgroups[e].items[0].data.start,o=t.subgroups[e].items[0].data.start,n=i-1;t.subgroups[e].items.forEach(function(t){new Date(t.data.start)new Date(n)&&(n=e)}),t.subgroups[e].start=o,t.subgroups[e].end=new Date(n-1)}},o.prototype.orderSubgroups=function(){if(void 0!==this.subgroupOrderer){var t,e=[];if("string"==typeof this.subgroupOrderer){for(t in this.subgroups)e.push({subgroup:t,sortField:this.subgroups[t].items[0].data[this.subgroupOrderer]});e.sort(function(t,e){return t.sortField-e.sortField})}else if("function"==typeof this.subgroupOrderer){for(t in this.subgroups)e.push(this.subgroups[t].items[0].data);e.sort(this.subgroupOrderer)}if(e.length>0)for(var i=0;i=0&&(i.items.splice(o,1),i.items.length?this._updateSubgroupsSizes():delete this.subgroups[e])}}},o.prototype.removeFromDataSet=function(t){this.itemSet.removeItem(t.id)},o.prototype.order=function(){for(var t=r.toArray(this.items),e=[],i=[],o=0;o0)for(var l=0;lh}),1==this.checkRangedItems)for(this.checkRangedItems=!1,l=0;lh})}var p={},f=0;for(l=0;l0)for(var v=0;v=0&&(r=e[s],!n(r));s--)void 0===o[r.id]&&(o[r.id]=!0,i.push(r));for(s=t+1;st.start},o.prototype._createDomElement=function(){this.dom||(this.dom={},this.dom.box=document.createElement("div"),this.dom.frame=document.createElement("div"),this.dom.frame.className="vis-item-overflow",this.dom.box.appendChild(this.dom.frame),this.dom.visibleFrame=document.createElement("div"),this.dom.visibleFrame.className="vis-item-visible-frame",this.dom.box.appendChild(this.dom.visibleFrame),this.dom.content=document.createElement("div"),this.dom.content.className="vis-item-content",this.dom.frame.appendChild(this.dom.content),this.dom.box["timeline-item"]=this,this.dirty=!0)},o.prototype._appendDomElement=function(){if(!this.parent)throw new Error("Cannot redraw item: no parent attached");if(!this.dom.box.parentNode){var t=this.parent.dom.foreground;if(!t)throw new Error("Cannot redraw item: parent has no foreground container element");t.appendChild(this.dom.box)}this.displayed=!0},o.prototype._updateDirtyDomComponents=function(){if(this.dirty){this._updateContents(this.dom.content),this._updateDataAttributes(this.dom.box),this._updateStyle(this.dom.box);var t=this.editable.updateTime||this.editable.updateGroup,e=(this.data.className?" "+this.data.className:"")+(this.selected?" vis-selected":"")+(t?" vis-editable":" vis-readonly");this.dom.box.className=this.baseClassName+e,this.dom.content.style.maxWidth="none"}},o.prototype._getDomComponentsSizes=function(){return this.overflow="hidden"!==window.getComputedStyle(this.dom.frame).overflow,{content:{width:this.dom.content.offsetWidth},box:{height:this.dom.box.offsetHeight}}},o.prototype._updateDomComponentsSizes=function(t){this.props.content.width=t.content.width,this.height=t.box.height,this.dom.content.style.maxWidth="",this.dirty=!1},o.prototype._repaintDomAdditionals=function(){this._repaintOnItemUpdateTimeTooltip(this.dom.box),this._repaintDeleteButton(this.dom.box),this._repaintDragCenter(),this._repaintDragLeft(),this._repaintDragRight()},o.prototype.redraw=function(t){var e,i=[this._createDomElement.bind(this),this._appendDomElement.bind(this),this._updateDirtyDomComponents.bind(this),function(){this.dirty&&(e=this._getDomComponentsSizes.bind(this)())}.bind(this),function(){this.dirty&&this._updateDomComponentsSizes.bind(this)(e)}.bind(this),this._repaintDomAdditionals.bind(this)];if(t)return i;var o;return i.forEach(function(t){o=t()}),o},o.prototype.show=function(){this.displayed||this.redraw()},o.prototype.hide=function(){if(this.displayed){var t=this.dom.box;t.parentNode&&t.parentNode.removeChild(t),this.displayed=!1}},o.prototype.repositionX=function(t){var e,i,o=this.parent.width,n=this.conversion.toScreen(this.data.start),s=this.conversion.toScreen(this.data.end),r=void 0===this.data.align?this.options.align:this.data.align;!1===this.data.limitSize||void 0!==t&&!0!==t||(n<-o&&(n=-o),s>2*o&&(s=2*o));var a=Math.max(s-n+.5,1);switch(this.overflow?(this.options.rtl?this.right=n:this.left=n,this.width=a+this.props.content.width,i=this.props.content.width):(this.options.rtl?this.right=n:this.left=n,this.width=a,i=Math.min(s-n,this.props.content.width)),this.options.rtl?this.dom.box.style.right=this.right+"px":this.dom.box.style.left=this.left+"px",this.dom.box.style.width=a+"px",r){case"left":this.options.rtl?this.dom.content.style.right="0":this.dom.content.style.left="0";break;case"right":this.options.rtl?this.dom.content.style.right=Math.max(a-i,0)+"px":this.dom.content.style.left=Math.max(a-i,0)+"px";break;case"center":this.options.rtl?this.dom.content.style.right=Math.max((a-i)/2,0)+"px":this.dom.content.style.left=Math.max((a-i)/2,0)+"px";break;default:e=this.overflow?s>0?Math.max(-n,0):-i:n<0?-n:0,this.options.rtl?this.dom.content.style.right=e+"px":(this.dom.content.style.left=e+"px",this.dom.content.style.width="calc(100% - "+e+"px)")}},o.prototype.repositionY=function(){var t=this.options.orientation.item,e=this.dom.box;e.style.top="top"==t?this.top+"px":this.parent.height-this.top-this.height+"px"},o.prototype._repaintDragLeft=function(){if((this.selected||this.options.itemsAlwaysDraggable.range)&&this.options.editable.updateTime&&!this.dom.dragLeft){var t=document.createElement("div");t.className="vis-drag-left",t.dragLeftItem=this,this.dom.box.appendChild(t),this.dom.dragLeft=t}else this.selected||this.options.itemsAlwaysDraggable.range||!this.dom.dragLeft||(this.dom.dragLeft.parentNode&&this.dom.dragLeft.parentNode.removeChild(this.dom.dragLeft),this.dom.dragLeft=null)},o.prototype._repaintDragRight=function(){if((this.selected||this.options.itemsAlwaysDraggable.range)&&this.options.editable.updateTime&&!this.dom.dragRight){var t=document.createElement("div");t.className="vis-drag-right",t.dragRightItem=this,this.dom.box.appendChild(t),this.dom.dragRight=t}else this.selected||this.options.itemsAlwaysDraggable.range||!this.dom.dragRight||(this.dom.dragRight.parentNode&&this.dom.dragRight.parentNode.removeChild(this.dom.dragRight),this.dom.dragRight=null)},t.exports=o},function(t,e,i){function o(t){return t&&t.__esModule?t:{default:t}}Object.defineProperty(e,"__esModule",{value:!0});var n=i(19),s=o(n),r=i(6),a=o(r),h=i(0),d=o(h),l=i(1),u=o(l),c=i(2),p=i(179).default,f=function(){function t(e,i,o){var n=arguments.length>3&&void 0!==arguments[3]?arguments[3]:1;(0,d.default)(this,t),this.parent=e,this.changedOptions=[],this.container=i,this.allowCreation=!1,this.options={},this.initialized=!1,this.popupCounter=0,this.defaultOptions={enabled:!1,filter:!0,container:void 0,showButton:!0},c.extend(this.options,this.defaultOptions),this.configureOptions=o,this.moduleOptions={},this.domElements=[],this.popupDiv={},this.popupLimit=5,this.popupHistory={},this.colorPicker=new p(n),this.wrapper=void 0}return(0,u.default)(t,[{key:"setOptions",value:function(t){if(void 0!==t){this.popupHistory={},this._removePopup();var e=!0;"string"==typeof t?this.options.filter=t:t instanceof Array?this.options.filter=t.join():"object"===(void 0===t?"undefined":(0,a.default)(t))?(void 0!==t.container&&(this.options.container=t.container),void 0!==t.filter&&(this.options.filter=t.filter),void 0!==t.showButton&&(this.options.showButton=t.showButton),void 0!==t.enabled&&(e=t.enabled)):"boolean"==typeof t?(this.options.filter=!0,e=t):"function"==typeof t&&(this.options.filter=t,e=!0),!1===this.options.filter&&(e=!1),this.options.enabled=e}this._clean()}},{key:"setModuleOptions",value:function(t){this.moduleOptions=t,!0===this.options.enabled&&(this._clean(),void 0!==this.options.container&&(this.container=this.options.container),this._create())}},{key:"_create",value:function(){var t=this;this._clean(),this.changedOptions=[];var e=this.options.filter,i=0,o=!1;for(var n in this.configureOptions)this.configureOptions.hasOwnProperty(n)&&(this.allowCreation=!1,o=!1,"function"==typeof e?(o=e(n,[]),o=o||this._handleObject(this.configureOptions[n],[n],!0)):!0!==e&&-1===e.indexOf(n)||(o=!0),!1!==o&&(this.allowCreation=!0,i>0&&this._makeItem([]),this._makeHeader(n),this._handleObject(this.configureOptions[n],[n])),i++);if(!0===this.options.showButton){var s=document.createElement("div");s.className="vis-configuration vis-config-button",s.innerHTML="generate options",s.onclick=function(){t._printOptions()},s.onmouseover=function(){s.className="vis-configuration vis-config-button hover"},s.onmouseout=function(){s.className="vis-configuration vis-config-button"},this.optionsContainer=document.createElement("div"),this.optionsContainer.className="vis-configuration vis-config-option-container",this.domElements.push(this.optionsContainer),this.domElements.push(s)}this._push()}},{key:"_push",value:function(){this.wrapper=document.createElement("div"),this.wrapper.className="vis-configuration-wrapper",this.container.appendChild(this.wrapper);for(var t=0;t1?i-1:0),n=1;n2&&void 0!==arguments[2]&&arguments[2],o=document.createElement("div");return o.className="vis-configuration vis-config-label vis-config-s"+e.length,o.innerHTML=!0===i?""+t+":":t+":",o}},{key:"_makeDropdown",value:function(t,e,i){var o=document.createElement("select");o.className="vis-configuration vis-config-select";var n=0;void 0!==e&&-1!==t.indexOf(e)&&(n=t.indexOf(e));for(var s=0;ss&&1!==s&&(a.max=Math.ceil(1.2*e),d=a.max,h="range increased"),a.value=e}else a.value=o;var l=document.createElement("input");l.className="vis-configuration vis-config-rangeinput",l.value=a.value;var u=this;a.onchange=function(){l.value=this.value,u._update(Number(this.value),i)},a.oninput=function(){l.value=this.value};var c=this._makeLabel(i[i.length-1],i),p=this._makeItem(i,c,a,l);""!==h&&this.popupHistory[p]!==d&&(this.popupHistory[p]=d,this._setupPopup(h,p))}},{key:"_setupPopup",value:function(t,e){var i=this;if(!0===this.initialized&&!0===this.allowCreation&&this.popupCounter1&&void 0!==arguments[1]?arguments[1]:[],i=arguments.length>2&&void 0!==arguments[2]&&arguments[2],o=!1,n=this.options.filter,s=!1;for(var r in t)if(t.hasOwnProperty(r)){o=!0;var a=t[r],h=c.copyAndExtendArray(e,r);if("function"==typeof n&&!1===(o=n(r,e))&&!(a instanceof Array)&&"string"!=typeof a&&"boolean"!=typeof a&&a instanceof Object&&(this.allowCreation=!1,o=this._handleObject(a,h,!0),this.allowCreation=!1===i),!1!==o){s=!0;var d=this._getValue(h);if(a instanceof Array)this._handleArray(a,d,h);else if("string"==typeof a)this._makeTextInput(a,d,h);else if("boolean"==typeof a)this._makeCheckbox(a,d,h);else if(a instanceof Object){var l=!0;if(-1!==e.indexOf("physics")&&this.moduleOptions.physics.solver!==r&&(l=!1),!0===l)if(void 0!==a.enabled){var u=c.copyAndExtendArray(h,"enabled"),p=this._getValue(u);if(!0===p){var f=this._makeLabel(r,h,!0);this._makeItem(h,f),s=this._handleObject(a,h)||s}else this._makeCheckbox(a,p,h)}else{var m=this._makeLabel(r,h,!0);this._makeItem(h,m),s=this._handleObject(a,h)||s}}else console.error("dont know how to handle",a,r,h)}}return s}},{key:"_handleArray",value:function(t,e,i){"string"==typeof t[0]&&"color"===t[0]?(this._makeColorField(t,e,i),t[1]!==e&&this.changedOptions.push({path:i,value:e})):"string"==typeof t[0]?(this._makeDropdown(t,e,i),t[0]!==e&&this.changedOptions.push({path:i,value:e})):"number"==typeof t[0]&&(this._makeRange(t,e,i),t[0]!==e&&this.changedOptions.push({path:i,value:Number(e)}))}},{key:"_update",value:function(t,e){var i=this._constructOptions(t,e);this.parent.body&&this.parent.body.emitter&&this.parent.body.emitter.emit&&this.parent.body.emitter.emit("configChange",i),this.initialized=!0,this.parent.setOptions(i)}},{key:"_constructOptions",value:function(t,e){var i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},o=i;t="true"===t||t,t="false"!==t&&t;for(var n=0;nvar options = "+(0,s.default)(t,null,2)+""}},{key:"getOptions",value:function(){for(var t={},e=0;ethis.imageObj.height?i=this.imageObj.width/this.imageObj.height:o=this.imageObj.height/this.imageObj.width),t=2*this.options.size*i,e=2*this.options.size*o}else t=this.imageObj.width,e=this.imageObj.height;this.width=t,this.height=e,this.radius=.5*this.width}},{key:"_drawRawCircle",value:function(t,e,i,o){this.initContextForDraw(t,o),t.circle(e,i,o.size),this.performFill(t,o)}},{key:"_drawImageAtPosition",value:function(t,e){if(0!=this.imageObj.width){t.globalAlpha=1,this.enableShadow(t,e);var i=1;!0===this.options.shapeProperties.interpolation&&(i=this.imageObj.width/this.width/this.body.view.scale),this.imageObj.drawImageAtPosition(t,i,this.left,this.top,this.width,this.height),this.disableShadow(t,e)}}},{key:"_drawImageLabel",value:function(t,e,i,o,n){var s,r=0;if(void 0!==this.height){r=.5*this.height;var a=this.labelModule.getTextSize(t,o,n);a.lineCount>=1&&(r+=a.height/2)}s=i+r,this.options.label&&(this.labelOffset=r),this.labelModule.draw(t,e,s,o,n,"hanging")}}]),e}(m.default);e.default=v},function(t,e,i){function o(t){return t&&t.__esModule?t:{default:t}}Object.defineProperty(e,"__esModule",{value:!0});var n=i(19),s=o(n),r=i(6),a=o(r),h=i(29),d=o(h),l=i(0),u=o(l),c=i(1),p=o(c),f=i(2),m=i(117).default,v=i(48).default,g=i(215).default,y=i(217).default,b=i(218).default,_=i(219).default,w=function(){function t(e,i,o,n){if((0,u.default)(this,t),void 0===i)throw new Error("No body provided");this.options=f.bridgeObject(o),this.globalOptions=o,this.defaultOptions=n,this.body=i,this.id=void 0,this.fromId=void 0,this.toId=void 0,this.selected=!1,this.hover=!1,this.labelDirty=!0,this.baseWidth=this.options.width,this.baseFontSize=this.options.font.size,this.from=void 0,this.to=void 0,this.edgeType=void 0,this.connected=!1,this.labelModule=new m(this.body,this.options,!0),this.setOptions(e)}return(0,p.default)(t,[{key:"setOptions",value:function(e){if(e){t.parseOptions(this.options,e,!0,this.globalOptions),void 0!==e.id&&(this.id=e.id),void 0!==e.from&&(this.fromId=e.from),void 0!==e.to&&(this.toId=e.to),void 0!==e.title&&(this.title=e.title),void 0!==e.value&&(e.value=parseFloat(e.value));var i=[e,this.options,this.defaultOptions];this.chooser=v.choosify("edge",i),this.updateLabelModule(e);var o=this.updateEdgeType();return this._setInteractionWidths(),this.connect(),void 0===e.hidden&&void 0===e.physics||(o=!0),o}}},{key:"getFormattingValues",value:function(){var t=!0===this.options.arrows.to||!0===this.options.arrows.to.enabled,e=!0===this.options.arrows.from||!0===this.options.arrows.from.enabled,i=!0===this.options.arrows.middle||!0===this.options.arrows.middle.enabled,o=this.options.color.inherit,n={toArrow:t,toArrowScale:this.options.arrows.to.scaleFactor,toArrowType:this.options.arrows.to.type,middleArrow:i,middleArrowScale:this.options.arrows.middle.scaleFactor,middleArrowType:this.options.arrows.middle.type,fromArrow:e,fromArrowScale:this.options.arrows.from.scaleFactor,fromArrowType:this.options.arrows.from.type,arrowStrikethrough:this.options.arrowStrikethrough,color:o?void 0:this.options.color.color,inheritsColor:o,opacity:this.options.color.opacity,hidden:this.options.hidden,length:this.options.length,shadow:this.options.shadow.enabled,shadowColor:this.options.shadow.color,shadowSize:this.options.shadow.size,shadowX:this.options.shadow.x,shadowY:this.options.shadow.y,dashes:this.options.dashes,width:this.options.width};if(this.selected||this.hover)if(!0===this.chooser){if(this.selected){var s=this.options.selectionWidth;"function"==typeof s?n.width=s(n.width):"number"==typeof s&&(n.width+=s),n.width=Math.max(n.width,.3/this.body.view.scale),n.color=this.options.color.highlight,n.shadow=this.options.shadow.enabled}else if(this.hover){var r=this.options.hoverWidth;"function"==typeof r?n.width=r(n.width):"number"==typeof r&&(n.width+=r),n.width=Math.max(n.width,.3/this.body.view.scale),n.color=this.options.color.hover,n.shadow=this.options.shadow.enabled}}else"function"==typeof this.chooser&&(this.chooser(n,this.options.id,this.selected,this.hover),void 0!==n.color&&(n.inheritsColor=!1),!1===n.shadow&&(n.shadowColor===this.options.shadow.color&&n.shadowSize===this.options.shadow.size&&n.shadowX===this.options.shadow.x&&n.shadowY===this.options.shadow.y||(n.shadow=!0)));else n.shadow=this.options.shadow.enabled,n.width=Math.max(n.width,.3/this.body.view.scale);return n}},{key:"updateLabelModule",value:function(t){var e=[t,this.options,this.globalOptions,this.defaultOptions];this.labelModule.update(this.options,e),void 0!==this.labelModule.baseSize&&(this.baseFontSize=this.labelModule.baseSize)}},{key:"updateEdgeType",value:function(){var t=this.options.smooth,e=!1,i=!0;return void 0!==this.edgeType&&((this.edgeType instanceof y&&!0===t.enabled&&"dynamic"===t.type||this.edgeType instanceof g&&!0===t.enabled&&"cubicBezier"===t.type||this.edgeType instanceof b&&!0===t.enabled&&"dynamic"!==t.type&&"cubicBezier"!==t.type||this.edgeType instanceof _&&!1===t.type.enabled)&&(i=!1),!0===i&&(e=this.cleanup())),!0===i?!0===t.enabled?"dynamic"===t.type?(e=!0,this.edgeType=new y(this.options,this.body,this.labelModule)):"cubicBezier"===t.type?this.edgeType=new g(this.options,this.body,this.labelModule):this.edgeType=new b(this.options,this.body,this.labelModule):this.edgeType=new _(this.options,this.body,this.labelModule):this.edgeType.setOptions(this.options),e}},{key:"connect",value:function(){this.disconnect(),this.from=this.body.nodes[this.fromId]||void 0,this.to=this.body.nodes[this.toId]||void 0,this.connected=void 0!==this.from&&void 0!==this.to,!0===this.connected?(this.from.attachEdge(this),this.to.attachEdge(this)):(this.from&&this.from.detachEdge(this),this.to&&this.to.detachEdge(this)),this.edgeType.connect()}},{key:"disconnect",value:function(){this.from&&(this.from.detachEdge(this),this.from=void 0),this.to&&(this.to.detachEdge(this),this.to=void 0),this.connected=!1}},{key:"getTitle",value:function(){return this.title}},{key:"isSelected",value:function(){return this.selected}},{key:"getValue",value:function(){return this.options.value}},{key:"setValueRange",value:function(t,e,i){if(void 0!==this.options.value){var o=this.options.scaling.customScalingFunction(t,e,i,this.options.value),n=this.options.scaling.max-this.options.scaling.min;if(!0===this.options.scaling.label.enabled){var s=this.options.scaling.label.max-this.options.scaling.label.min;this.options.font.size=this.options.scaling.label.min+o*s}this.options.width=this.options.scaling.min+o*n}else this.options.width=this.baseWidth,this.options.font.size=this.baseFontSize;this._setInteractionWidths(),this.updateLabelModule()}},{key:"_setInteractionWidths",value:function(){"function"==typeof this.options.hoverWidth?this.edgeType.hoverWidth=this.options.hoverWidth(this.options.width):this.edgeType.hoverWidth=this.options.hoverWidth+this.options.width,"function"==typeof this.options.selectionWidth?this.edgeType.selectionWidth=this.options.selectionWidth(this.options.width):this.edgeType.selectionWidth=this.options.selectionWidth+this.options.width}},{key:"draw",value:function(t){var e=this.getFormattingValues();if(!e.hidden){var i=this.edgeType.getViaNode(),o={};this.edgeType.fromPoint=this.edgeType.from,this.edgeType.toPoint=this.edgeType.to,e.fromArrow&&(o.from=this.edgeType.getArrowData(t,"from",i,this.selected,this.hover,e),!1===e.arrowStrikethrough&&(this.edgeType.fromPoint=o.from.core)),e.toArrow&&(o.to=this.edgeType.getArrowData(t,"to",i,this.selected,this.hover,e),!1===e.arrowStrikethrough&&(this.edgeType.toPoint=o.to.core)),e.middleArrow&&(o.middle=this.edgeType.getArrowData(t,"middle",i,this.selected,this.hover,e)),this.edgeType.drawLine(t,e,this.selected,this.hover,i),this.drawArrows(t,o,e),this.drawLabel(t,i)}}},{key:"drawArrows",value:function(t,e,i){i.fromArrow&&this.edgeType.drawArrowHead(t,i,this.selected,this.hover,e.from),i.middleArrow&&this.edgeType.drawArrowHead(t,i,this.selected,this.hover,e.middle),i.toArrow&&this.edgeType.drawArrowHead(t,i,this.selected,this.hover,e.to)}},{key:"drawLabel",value:function(t,e){if(void 0!==this.options.label){var i=this.from,o=this.to;if(this.labelModule.differentState(this.selected,this.hover)&&this.labelModule.getTextSize(t,this.selected,this.hover),i.id!=o.id){this.labelModule.pointToSelf=!1;var n=this.edgeType.getPoint(.5,e);t.save();var s=this._getRotation(t);0!=s.angle&&(t.translate(s.x,s.y),t.rotate(s.angle)),this.labelModule.draw(t,n.x,n.y,this.selected,this.hover),t.restore()}else{this.labelModule.pointToSelf=!0;var r,a,h=this.options.selfReferenceSize;i.shape.width>i.shape.height?(r=i.x+.5*i.shape.width,a=i.y-h):(r=i.x+h,a=i.y-.5*i.shape.height),n=this._pointOnCircle(r,a,h,.125),this.labelModule.draw(t,n.x,n.y,this.selected,this.hover)}}}},{key:"getItemsOnPoint",value:function(t){var e=[];if(this.labelModule.visible()){var i=this._getRotation();v.pointInRect(this.labelModule.getSize(),t,i)&&e.push({edgeId:this.id,labelId:0})}var o={left:t.x,top:t.y};return this.isOverlappingWith(o)&&e.push({edgeId:this.id}),e}},{key:"isOverlappingWith",value:function(t){if(this.connected){var e=this.from.x,i=this.from.y,o=this.to.x,n=this.to.y,s=t.left,r=t.top;return this.edgeType.getDistanceToEdge(e,i,o,n,s,r)<10}return!1}},{key:"_getRotation",value:function(t){var e=this.edgeType.getViaNode(),i=this.edgeType.getPoint(.5,e);void 0!==t&&this.labelModule.calculateLabelSize(t,this.selected,this.hover,i.x,i.y);var o={x:i.x,y:this.labelModule.size.yLine,angle:0};if(!this.labelModule.visible())return o;if("horizontal"===this.options.font.align)return o;var n=this.from.y-this.to.y,s=this.from.x-this.to.x,r=Math.atan2(n,s);return(r<-1&&s<0||r>0&&s<0)&&(r+=Math.PI),o.angle=r,o}},{key:"_pointOnCircle",value:function(t,e,i,o){var n=2*o*Math.PI;return{x:t+i*Math.cos(n),y:e-i*Math.sin(n)}}},{key:"select",value:function(){this.selected=!0}},{key:"unselect",value:function(){this.selected=!1}},{key:"cleanup",value:function(){return this.edgeType.cleanup()}},{key:"remove",value:function(){this.cleanup(),this.disconnect(),delete this.body.edges[this.id]}},{key:"endPointsValid",value:function(){return void 0!==this.body.nodes[this.fromId]&&void 0!==this.body.nodes[this.toId]}}],[{key:"parseOptions",value:function(t,e){var i=arguments.length>2&&void 0!==arguments[2]&&arguments[2],o=arguments.length>3&&void 0!==arguments[3]?arguments[3]:{},n=arguments.length>4&&void 0!==arguments[4]&&arguments[4],r=["arrowStrikethrough","id","from","hidden","hoverWidth","labelHighlightBold","length","line","opacity","physics","scaling","selectionWidth","selfReferenceSize","to","title","value","width","font","chosen","widthConstraint"];if(f.selectiveDeepExtend(r,t,e,i),v.isValidLabel(e.label)?t.label=e.label:t.label=void 0,f.mergeOptions(t,e,"smooth",o),f.mergeOptions(t,e,"shadow",o),void 0!==e.dashes&&null!==e.dashes?t.dashes=e.dashes:!0===i&&null===e.dashes&&(t.dashes=(0,d.default)(o.dashes)),void 0!==e.scaling&&null!==e.scaling?(void 0!==e.scaling.min&&(t.scaling.min=e.scaling.min),void 0!==e.scaling.max&&(t.scaling.max=e.scaling.max),f.mergeOptions(t.scaling,e.scaling,"label",o.scaling)):!0===i&&null===e.scaling&&(t.scaling=(0,d.default)(o.scaling)),void 0!==e.arrows&&null!==e.arrows)if("string"==typeof e.arrows){var h=e.arrows.toLowerCase();t.arrows.to.enabled=-1!=h.indexOf("to"),t.arrows.middle.enabled=-1!=h.indexOf("middle"),t.arrows.from.enabled=-1!=h.indexOf("from")}else{if("object"!==(0,a.default)(e.arrows))throw new Error("The arrow newOptions can only be an object or a string. Refer to the documentation. You used:"+(0,s.default)(e.arrows));f.mergeOptions(t.arrows,e.arrows,"to",o.arrows),f.mergeOptions(t.arrows,e.arrows,"middle",o.arrows),f.mergeOptions(t.arrows,e.arrows,"from",o.arrows)}else!0===i&&null===e.arrows&&(t.arrows=(0,d.default)(o.arrows));if(void 0!==e.color&&null!==e.color){var l=e.color,u=t.color;if(n)f.deepExtend(u,o.color,!1,i);else for(var c in u)u.hasOwnProperty(c)&&delete u[c];if(f.isString(u))u.color=u,u.highlight=u,u.hover=u,u.inherit=!1,void 0===l.opacity&&(u.opacity=1);else{var p=!1;void 0!==l.color&&(u.color=l.color,p=!0),void 0!==l.highlight&&(u.highlight=l.highlight,p=!0),void 0!==l.hover&&(u.hover=l.hover,p=!0),void 0!==l.inherit&&(u.inherit=l.inherit),void 0!==l.opacity&&(u.opacity=Math.min(1,Math.max(0,l.opacity))),!0===p?u.inherit=!1:void 0===u.inherit&&(u.inherit="from")}}else!0===i&&null===e.color&&(t.color=f.bridgeObject(o.color));!0===i&&null===e.font&&(t.font=f.bridgeObject(o.font))}}]),t}();e.default=w},function(t,e,i){function o(t){return t&&t.__esModule?t:{default:t}}Object.defineProperty(e,"__esModule",{value:!0});var n=i(3),s=o(n),r=i(0),a=o(r),h=i(1),d=o(h),l=i(4),u=o(l),c=i(5),p=o(c),f=i(118),m=o(f),v=function(t){function e(t,i,o){return(0,a.default)(this,e),(0,u.default)(this,(e.__proto__||(0,s.default)(e)).call(this,t,i,o))}return(0,p.default)(e,t),(0,d.default)(e,[{key:"_findBorderPositionBezier",value:function(t,e){var i,o,n,s,r,a=arguments.length>2&&void 0!==arguments[2]?arguments[2]:this._getViaCoordinates(),h=0,d=0,l=1,u=this.to,c=!1;for(t.id===this.from.id&&(u=this.from,c=!0);d<=l&&h<10;){var p=.5*(d+l);if(i=this.getPoint(p,a),o=Math.atan2(u.y-i.y,u.x-i.x),n=u.distanceToBorder(e,o),s=Math.sqrt(Math.pow(i.x-u.x,2)+Math.pow(i.y-u.y,2)),r=n-s,Math.abs(r)<.2)break;r<0?!1===c?d=p:l=p:!1===c?l=p:d=p,h++}return i.t=p,i}},{key:"_getDistanceToBezierEdge",value:function(t,e,i,o,n,s,r){var a=1e9,h=void 0,d=void 0,l=void 0,u=void 0,c=void 0,p=t,f=e;for(d=1;d<10;d++)l=.1*d,u=Math.pow(1-l,2)*t+2*l*(1-l)*r.x+Math.pow(l,2)*i,c=Math.pow(1-l,2)*e+2*l*(1-l)*r.y+Math.pow(l,2)*o,d>0&&(h=this._getDistanceToLine(p,f,u,c,n,s),a=h1&&void 0!==arguments[1]?arguments[1]:[],o=1e9,n=-1e9,s=1e9,r=-1e9;if(i.length>0)for(var a=0;ae.shape.boundingBox.left&&(s=e.shape.boundingBox.left),re.shape.boundingBox.top&&(o=e.shape.boundingBox.top),n1&&void 0!==arguments[1]?arguments[1]:[],o=1e9,n=-1e9,s=1e9,r=-1e9;if(i.length>0)for(var a=0;ae.x&&(s=e.x),re.y&&(o=e.y),nh;)o(a,i=e[h++])&&(~s(d,i)||d.push(i));return d}},function(t,e,i){var o=i(22),n=i(41),s=i(56)("IE_PROTO"),r=Object.prototype;t.exports=Object.getPrototypeOf||function(t){return t=n(t),o(t,s)?t[s]:"function"==typeof t.constructor&&t instanceof t.constructor?t.constructor.prototype:t instanceof Object?r:null}},function(t,e,i){var o=i(50),n=i(13)("toStringTag"),s="Arguments"==o(function(){return arguments}()),r=function(t,e){try{return t[e]}catch(t){}};t.exports=function(t){var e,i,a;return void 0===t?"Undefined":null===t?"Null":"string"==typeof(i=r(e=Object(t),n))?i:s?o(e):"Object"==(a=o(e))&&"function"==typeof e.callee?"Arguments":a}},function(t,e,i){var o=i(17),n=i(7),s=i(28);t.exports=function(t,e){var i=(n.Object||{})[t]||Object[t],r={};r[t]=e(i),o(o.S+o.F*s(function(){i(1)}),"Object",r)}},function(t,e,i){var o=i(84),n=i(58).concat("length","prototype");e.f=Object.getOwnPropertyNames||function(t){return o(t,n)}},function(t,e,i){var o=i(42),n=i(39),s=i(25),r=i(53),a=i(22),h=i(81),d=Object.getOwnPropertyDescriptor;e.f=i(21)?d:function(t,e){if(t=s(t),e=r(e,!0),h)try{return d(t,e)}catch(t){}if(a(t,e))return n(!o.f.call(t,e),t[e])}},function(t,e,i){t.exports={default:i(162),__esModule:!0}},function(t,e,i){function o(t,e){this.x=void 0!==t?t:0,this.y=void 0!==e?e:0}t.exports=o},function(t,e,i){function o(t,e){if(void 0===t)throw new Error("No container element defined");if(this.container=t,this.visible=!e||void 0==e.visible||e.visible,this.visible){this.frame=document.createElement("DIV"),this.frame.style.width="100%",this.frame.style.position="relative",this.container.appendChild(this.frame),this.frame.prev=document.createElement("INPUT"),this.frame.prev.type="BUTTON",this.frame.prev.value="Prev",this.frame.appendChild(this.frame.prev),this.frame.play=document.createElement("INPUT"),this.frame.play.type="BUTTON",this.frame.play.value="Play",this.frame.appendChild(this.frame.play),this.frame.next=document.createElement("INPUT"),this.frame.next.type="BUTTON",this.frame.next.value="Next",this.frame.appendChild(this.frame.next),this.frame.bar=document.createElement("INPUT"),this.frame.bar.type="BUTTON",this.frame.bar.style.position="absolute",this.frame.bar.style.border="1px solid red",this.frame.bar.style.width="100px",this.frame.bar.style.height="6px",this.frame.bar.style.borderRadius="2px",this.frame.bar.style.MozBorderRadius="2px",this.frame.bar.style.border="1px solid #7F7F7F",this.frame.bar.style.backgroundColor="#E5E5E5",this.frame.appendChild(this.frame.bar),this.frame.slide=document.createElement("INPUT"),this.frame.slide.type="BUTTON",this.frame.slide.style.margin="0px",this.frame.slide.value=" ",this.frame.slide.style.position="relative",this.frame.slide.style.left="-100px",this.frame.appendChild(this.frame.slide);var i=this;this.frame.slide.onmousedown=function(t){i._onMouseDown(t)},this.frame.prev.onclick=function(t){i.prev(t)},this.frame.play.onclick=function(t){i.togglePlay(t)},this.frame.next.onclick=function(t){i.next(t)}}this.onChangeCallback=void 0,this.values=[],this.index=void 0,this.playTimeout=void 0,this.playInterval=1e3,this.playLoop=!0}var n=i(2);o.prototype.prev=function(){var t=this.getIndex();t>0&&(t--,this.setIndex(t))},o.prototype.next=function(){var t=this.getIndex();t0?this.setIndex(0):this.index=void 0},o.prototype.setIndex=function(t){if(!(tthis.values.length-1&&(o=this.values.length-1),o},o.prototype.indexToLeft=function(t){var e=parseFloat(this.frame.bar.style.width)-this.frame.slide.clientWidth-10;return t/(this.values.length-1)*e+3},o.prototype._onMouseMove=function(t){var e=t.clientX-this.startClientX,i=this.startSlideX+e,o=this.leftToIndex(i);this.setIndex(o),n.preventDefault()},o.prototype._onMouseUp=function(t){this.frame.style.cursor="auto",n.removeEventListener(document,"mousemove",this.onmousemove),n.removeEventListener(document,"mouseup",this.onmouseup),n.preventDefault()},t.exports=o},function(t,e,i){function o(t,e,i,o){this._start=0,this._end=0,this._step=1,this.prettyStep=!0,this.precision=5,this._current=0,this.setRange(t,e,i,o)}o.prototype.isNumeric=function(t){return!isNaN(parseFloat(t))&&isFinite(t)},o.prototype.setRange=function(t,e,i,o){if(!this.isNumeric(t))throw new Error("Parameter 'start' is not numeric; value: "+t);if(!this.isNumeric(e))throw new Error("Parameter 'end' is not numeric; value: "+t);if(!this.isNumeric(i))throw new Error("Parameter 'step' is not numeric; value: "+t);this._start=t||0,this._end=e||0,this.setStep(i,o)},o.prototype.setStep=function(t,e){void 0===t||t<=0||(void 0!==e&&(this.prettyStep=e),!0===this.prettyStep?this._step=o.calculatePrettyStep(t):this._step=t)},o.calculatePrettyStep=function(t){var e=function(t){return Math.log(t)/Math.LN10},i=Math.pow(10,Math.round(e(t))),o=2*Math.pow(10,Math.round(e(t/2))),n=5*Math.pow(10,Math.round(e(t/5))),s=i;return Math.abs(o-t)<=Math.abs(s-t)&&(s=o),Math.abs(n-t)<=Math.abs(s-t)&&(s=n),s<=0&&(s=1),s},o.prototype.getCurrent=function(){return parseFloat(this._current.toPrecision(this.precision))},o.prototype.getStep=function(){return this._step},o.prototype.start=function(t){void 0===t&&(t=!1),this._current=this._start-this._start%this._step,t&&this.getCurrent()this._end},t.exports=o},function(t,e,i){function o(t){for(var e in t)if(t.hasOwnProperty(e))return!1;return!0}function n(t){return void 0===t||""===t||"string"!=typeof t?t:t.charAt(0).toUpperCase()+t.slice(1)}function s(t,e){return void 0===t||""===t?e:t+n(e)}function r(t,e,i,o){for(var n,r,a=0;ar&&(t=o(t)*r),i(e)>r&&(e=o(e)*r),this.cameraOffset.x=t,this.cameraOffset.y=e,this.calculateCameraOrientation()},o.prototype.getOffset=function(){return this.cameraOffset},o.prototype.setArmLocation=function(t,e,i){this.armLocation.x=t,this.armLocation.y=e,this.armLocation.z=i,this.calculateCameraOrientation()},o.prototype.setArmRotation=function(t,e){void 0!==t&&(this.armRotation.horizontal=t),void 0!==e&&(this.armRotation.vertical=e,this.armRotation.vertical<0&&(this.armRotation.vertical=0),this.armRotation.vertical>.5*Math.PI&&(this.armRotation.vertical=.5*Math.PI)),void 0===t&&void 0===e||this.calculateCameraOrientation()},o.prototype.getArmRotation=function(){var t={};return t.horizontal=this.armRotation.horizontal,t.vertical=this.armRotation.vertical,t},o.prototype.setArmLength=function(t){void 0!==t&&(this.armLength=t,this.armLength<.71&&(this.armLength=.71),this.armLength>5&&(this.armLength=5),this.setOffset(this.cameraOffset.x,this.cameraOffset.y),this.calculateCameraOrientation())}, +o.prototype.getArmLength=function(){return this.armLength},o.prototype.getCameraLocation=function(){return this.cameraLocation},o.prototype.getCameraRotation=function(){return this.cameraRotation},o.prototype.calculateCameraOrientation=function(){this.cameraLocation.x=this.armLocation.x-this.armLength*Math.sin(this.armRotation.horizontal)*Math.cos(this.armRotation.vertical),this.cameraLocation.y=this.armLocation.y-this.armLength*Math.cos(this.armRotation.horizontal)*Math.cos(this.armRotation.vertical),this.cameraLocation.z=this.armLocation.z+this.armLength*Math.sin(this.armRotation.vertical),this.cameraRotation.x=Math.PI/2-this.armRotation.vertical,this.cameraRotation.y=0,this.cameraRotation.z=-this.armRotation.horizontal;var t=this.cameraRotation.x,e=this.cameraRotation.z,i=this.cameraOffset.x,o=this.cameraOffset.y,n=Math.sin,s=Math.cos;this.cameraLocation.x=this.cameraLocation.x+i*s(e)+o*-n(e)*s(t),this.cameraLocation.y=this.cameraLocation.y+i*n(e)+o*s(e)*s(t),this.cameraLocation.z=this.cameraLocation.z+o*n(t)},t.exports=o},function(t,e,i){function o(t,e,i){this.dataGroup=t,this.column=e,this.graph=i,this.index=void 0,this.value=void 0,this.values=t.getDistinctValues(this.column),this.values.length>0&&this.selectValue(0),this.dataPoints=[],this.loaded=!1,this.onLoadCallback=void 0,i.animationPreload?(this.loaded=!1,this.loadInBackground()):this.loaded=!0}var n=i(12);o.prototype.isLoaded=function(){return this.loaded},o.prototype.getLoadedProgress=function(){for(var t=this.values.length,e=0;this.dataPoints[e];)e++;return Math.round(e/t*100)},o.prototype.getLabel=function(){return this.graph.filterLabel},o.prototype.getColumn=function(){return this.column},o.prototype.getSelectedValue=function(){if(void 0!==this.index)return this.values[this.index]},o.prototype.getValues=function(){return this.values},o.prototype.getValue=function(t){if(t>=this.values.length)throw new Error("Index out of range");return this.values[t]},o.prototype._getDataPoints=function(t){if(void 0===t&&(t=this.index),void 0===t)return[];var e;if(this.dataPoints[t])e=this.dataPoints[t];else{var i={};i.column=this.column,i.value=this.values[t];var o=new n(this.dataGroup.getDataSet(),{filter:function(t){return t[i.column]==i.value}}).get();e=this.dataGroup._getDataPoints(o),this.dataPoints[t]=e}return e},o.prototype.setOnLoadCallback=function(t){this.onLoadCallback=t},o.prototype.selectValue=function(t){if(t>=this.values.length)throw new Error("Index out of range");this.index=t,this.value=this.values[t]},o.prototype.loadInBackground=function(t){void 0===t&&(t=0);var e=this.graph.frame;if(t0){var n=i.groupsData.getDataSet();n.get().forEach(function(t){if(t.nestedGroups){0!=t.showNested&&(t.showNested=!0);var e=[];t.nestedGroups.forEach(function(i){var o=n.get(i);o&&(o.nestedInGroup=t.id,0==t.showNested&&(o.visible=!1),e=e.concat(o))}),n.update(e,o)}})}},update:function(t,e,o){i._onUpdateGroups(e.items)},remove:function(t,e,o){i._onRemoveGroups(e.items)}},this.items={},this.groups={},this.groupIds=[],this.selection=[],this.popup=null,this.touchParams={},this.groupTouchParams={},this._create(),this.setOptions(e)}var s=i(29),r=o(s),a=i(6),h=o(a),d=i(10),l=i(2),u=i(11),c=i(12),p=i(66),f=i(16),m=i(68),v=i(69),g=i(101),y=i(102),b=i(70),_=i(103),w=i(104).default,x="__ungrouped__",k="__background__";n.prototype=new f,n.types={background:_,box:g,range:b,point:y},n.prototype._create=function(){var t=document.createElement("div");t.className="vis-itemset",t["timeline-itemset"]=this,this.dom.frame=t;var e=document.createElement("div");e.className="vis-background",t.appendChild(e),this.dom.background=e;var i=document.createElement("div");i.className="vis-foreground",t.appendChild(i),this.dom.foreground=i;var o=document.createElement("div");o.className="vis-axis",this.dom.axis=o;var n=document.createElement("div");n.className="vis-labelset",this.dom.labelSet=n,this._updateUngrouped();var s=new v(k,null,this);s.show(),this.groups[k]=s,this.hammer=new d(this.body.dom.centerContainer),this.hammer.on("hammer.input",function(t){t.isFirst&&this._onTouch(t)}.bind(this)),this.hammer.on("panstart",this._onDragStart.bind(this)),this.hammer.on("panmove",this._onDrag.bind(this)),this.hammer.on("panend",this._onDragEnd.bind(this)),this.hammer.get("pan").set({threshold:5,direction:d.DIRECTION_HORIZONTAL}),this.hammer.on("tap",this._onSelectItem.bind(this)),this.hammer.on("press",this._onMultiSelectItem.bind(this)),this.hammer.on("doubletap",this._onAddItem.bind(this)),this.options.rtl?this.groupHammer=new d(this.body.dom.rightContainer):this.groupHammer=new d(this.body.dom.leftContainer),this.groupHammer.on("tap",this._onGroupClick.bind(this)),this.groupHammer.on("panstart",this._onGroupDragStart.bind(this)),this.groupHammer.on("panmove",this._onGroupDrag.bind(this)),this.groupHammer.on("panend",this._onGroupDragEnd.bind(this)),this.groupHammer.get("pan").set({threshold:5,direction:d.DIRECTION_VERTICAL}),this.body.dom.centerContainer.addEventListener("mouseover",this._onMouseOver.bind(this)),this.body.dom.centerContainer.addEventListener("mouseout",this._onMouseOut.bind(this)),this.body.dom.centerContainer.addEventListener("mousemove",this._onMouseMove.bind(this)),this.body.dom.centerContainer.addEventListener("contextmenu",this._onDragEnd.bind(this)),this.body.dom.centerContainer.addEventListener("mousewheel",this._onMouseWheel.bind(this)),this.show()},n.prototype.setOptions=function(t){if(t){var e=["type","rtl","align","order","stack","stackSubgroups","selectable","multiselect","multiselectPerGroup","groupOrder","dataAttributes","template","groupTemplate","visibleFrameTemplate","hide","snap","groupOrderSwap","showTooltips","tooltip","tooltipOnItemUpdateTime"];l.selectiveExtend(e,this.options,t),"itemsAlwaysDraggable"in t&&("boolean"==typeof t.itemsAlwaysDraggable?(this.options.itemsAlwaysDraggable.item=t.itemsAlwaysDraggable,this.options.itemsAlwaysDraggable.range=!1):"object"===(0,h.default)(t.itemsAlwaysDraggable)&&(l.selectiveExtend(["item","range"],this.options.itemsAlwaysDraggable,t.itemsAlwaysDraggable),this.options.itemsAlwaysDraggable.item||(this.options.itemsAlwaysDraggable.range=!1))),"orientation"in t&&("string"==typeof t.orientation?this.options.orientation.item="top"===t.orientation?"top":"bottom":"object"===(0,h.default)(t.orientation)&&"item"in t.orientation&&(this.options.orientation.item=t.orientation.item)),"margin"in t&&("number"==typeof t.margin?(this.options.margin.axis=t.margin,this.options.margin.item.horizontal=t.margin,this.options.margin.item.vertical=t.margin):"object"===(0,h.default)(t.margin)&&(l.selectiveExtend(["axis"],this.options.margin,t.margin),"item"in t.margin&&("number"==typeof t.margin.item?(this.options.margin.item.horizontal=t.margin.item,this.options.margin.item.vertical=t.margin.item):"object"===(0,h.default)(t.margin.item)&&l.selectiveExtend(["horizontal","vertical"],this.options.margin.item,t.margin.item)))),"editable"in t&&("boolean"==typeof t.editable?(this.options.editable.updateTime=t.editable,this.options.editable.updateGroup=t.editable,this.options.editable.add=t.editable,this.options.editable.remove=t.editable,this.options.editable.overrideItems=!1):"object"===(0,h.default)(t.editable)&&l.selectiveExtend(["updateTime","updateGroup","add","remove","overrideItems"],this.options.editable,t.editable)),"groupEditable"in t&&("boolean"==typeof t.groupEditable?(this.options.groupEditable.order=t.groupEditable,this.options.groupEditable.add=t.groupEditable,this.options.groupEditable.remove=t.groupEditable):"object"===(0,h.default)(t.groupEditable)&&l.selectiveExtend(["order","add","remove"],this.options.groupEditable,t.groupEditable));["onDropObjectOnItem","onAdd","onUpdate","onRemove","onMove","onMoving","onAddGroup","onMoveGroup","onRemoveGroup"].forEach(function(e){var i=t[e];if(i){if(!(i instanceof Function))throw new Error("option "+e+" must be a function "+e+"(item, callback)");this.options[e]=i}}.bind(this)),this.markDirty()}},n.prototype.markDirty=function(t){this.groupIds=[],t&&t.refreshItems&&l.forEach(this.items,function(t){t.dirty=!0,t.displayed&&t.redraw()})},n.prototype.destroy=function(){this.hide(),this.setItems(null),this.setGroups(null),this.hammer=null,this.body=null,this.conversion=null},n.prototype.hide=function(){this.dom.frame.parentNode&&this.dom.frame.parentNode.removeChild(this.dom.frame),this.dom.axis.parentNode&&this.dom.axis.parentNode.removeChild(this.dom.axis),this.dom.labelSet.parentNode&&this.dom.labelSet.parentNode.removeChild(this.dom.labelSet)},n.prototype.show=function(){this.dom.frame.parentNode||this.body.dom.center.appendChild(this.dom.frame),this.dom.axis.parentNode||this.body.dom.backgroundVertical.appendChild(this.dom.axis),this.dom.labelSet.parentNode||(this.options.rtl?this.body.dom.right.appendChild(this.dom.labelSet):this.body.dom.left.appendChild(this.dom.labelSet))},n.prototype.setSelection=function(t){var e,i,o,n;for(void 0==t&&(t=[]),Array.isArray(t)||(t=[t]),e=0,i=this.selection.length;et&&o.push(h.id):h.lefte&&o.push(h.id)}return o},n.prototype._deselect=function(t){for(var e=this.selection,i=0,o=e.length;i0){for(var w={},x=0;x<_;x++)l.forEach(b,function(t,e){w[e]=t[x]()});l.forEach(this.groups,function(t,e){if(e!==k){var i=w[e];s=i||s,g+=t.height}}),g=Math.max(g,y)}return g=Math.max(g,y),r.style.height=i(g),this.props.width=r.offsetWidth,this.props.height=g,this.dom.axis.style.top=i("top"==n?this.body.domProps.top.height+this.body.domProps.border.top:this.body.domProps.top.height+this.body.domProps.centerContainer.height),this.options.rtl?this.dom.axis.style.right="0":this.dom.axis.style.left="0",this.initialItemSetDrawn=!0,s=this._isResized()||s},n.prototype._firstGroup=function(){var t="top"==this.options.orientation.item?0:this.groupIds.length-1,e=this.groupIds[t];return this.groups[e]||this.groups[x]||null},n.prototype._updateUngrouped=function(){var t,e,i=this.groups[x];if(this.groupsData){if(i){i.hide(),delete this.groups[x];for(e in this.items)if(this.items.hasOwnProperty(e)){t=this.items[e],t.parent&&t.parent.remove(t);var o=this._getGroupId(t.data),n=this.groups[o];n&&n.add(t)||t.hide()}}}else if(!i){i=new m(null,null,this),this.groups[x]=i;for(e in this.items)this.items.hasOwnProperty(e)&&(t=this.items[e],i.add(t));i.show()}},n.prototype.getLabelSet=function(){return this.dom.labelSet},n.prototype.setItems=function(t){var e,i=this,o=this.itemsData;if(t){if(!(t instanceof u||t instanceof c))throw new TypeError("Data must be an instance of DataSet or DataView");this.itemsData=t}else this.itemsData=null;if(o&&(l.forEach(this.itemListeners,function(t,e){o.off(e,t)}),e=o.getIds(),this._onRemove(e)),this.itemsData){var n=this.id;l.forEach(this.itemListeners,function(t,e){i.itemsData.on(e,t,n)}),e=this.itemsData.getIds(),this._onAdd(e),this._updateUngrouped()}this.body.emitter.emit("_change",{queue:!0})},n.prototype.getItems=function(){return this.itemsData},n.prototype.setGroups=function(t){var e,i=this;if(this.groupsData&&(l.forEach(this.groupListeners,function(t,e){i.groupsData.off(e,t)}),e=this.groupsData.getIds(),this.groupsData=null,this._onRemoveGroups(e)),t){if(!(t instanceof u||t instanceof c))throw new TypeError("Data must be an instance of DataSet or DataView");this.groupsData=t}else this.groupsData=null;if(this.groupsData){var o=this.groupsData;this.groupsData instanceof c&&(o=this.groupsData.getDataSet()),o.get().forEach(function(t){t.nestedGroups&&t.nestedGroups.forEach(function(e){var i=o.get(e);i.nestedInGroup=t.id,0==t.showNested&&(i.visible=!1),o.update(i)})});var n=this.id;l.forEach(this.groupListeners,function(t,e){i.groupsData.on(e,t,n)}),e=this.groupsData.getIds(),this._onAddGroups(e)}this._updateUngrouped(),this._order(),this.body.emitter.emit("_change",{queue:!0})},n.prototype.getGroups=function(){return this.groupsData},n.prototype.removeItem=function(t){var e=this.itemsData.get(t),i=this.itemsData.getDataSet();e&&this.options.onRemove(e,function(e){e&&i.remove(t)})},n.prototype._getType=function(t){return t.type||this.options.type||(t.end?"range":"box")},n.prototype._getGroupId=function(t){return"background"==this._getType(t)&&void 0==t.group?k:this.groupsData?t.group:x},n.prototype._onUpdate=function(t){var e=this;t.forEach(function(t){var i,o=e.itemsData.get(t,e.itemOptions),s=e.items[t],r=o?e._getType(o):null,a=n.types[r];if(s&&(a&&s instanceof a?e._updateItem(s,o):(i=s.selected,e._removeItem(s),s=null)),!s&&o){if(!a)throw"rangeoverflow"==r?new TypeError('Item type "rangeoverflow" is deprecated. Use css styling instead: .vis-item.vis-range .vis-item-content {overflow: visible;}'):new TypeError('Unknown item type "'+r+'"');s=new a(o,e.conversion,e.options),s.id=t,e._addItem(s),i&&(this.selection.push(t),s.select())}}.bind(this)),this._order(),this.body.emitter.emit("_change",{queue:!0})},n.prototype._onAdd=n.prototype._onUpdate,n.prototype._onRemove=function(t){var e=0,i=this;t.forEach(function(t){var o=i.items[t];o&&(e++,i._removeItem(o))}),e&&(this._order(),this.body.emitter.emit("_change",{queue:!0}))},n.prototype._order=function(){l.forEach(this.groups,function(t){t.order()})},n.prototype._onUpdateGroups=function(t){this._onAddGroups(t)},n.prototype._onAddGroups=function(t){var e=this;t.forEach(function(t){var i=e.groupsData.get(t),o=e.groups[t];if(o)o.setData(i);else{if(t==x||t==k)throw new Error("Illegal group id. "+t+" is a reserved id.");var n=(0,r.default)(e.options);l.extend(n,{height:null}),o=new m(t,i,e),e.groups[t]=o;for(var s in e.items)if(e.items.hasOwnProperty(s)){var a=e.items[s];a.data.group==t&&o.add(a)}o.order(),o.show()}}),this.body.emitter.emit("_change",{queue:!0})},n.prototype._onRemoveGroups=function(t){var e=this.groups;t.forEach(function(t){var i=e[t];i&&(i.hide(),delete e[t])}),this.markDirty(),this.body.emitter.emit("_change",{queue:!0})},n.prototype._orderGroups=function(){if(this.groupsData){var t=this.groupsData.getIds({order:this.options.groupOrder});t=this._orderNestedGroups(t);var e=!l.equalArray(t,this.groupIds);if(e){var i=this.groups;t.forEach(function(t){i[t].hide()}),t.forEach(function(t){i[t].show()}),this.groupIds=t}return e}return!1},n.prototype._orderNestedGroups=function(t){var e=[];return t.forEach(function(t){var i=this.groupsData.get(t);if(i.nestedInGroup||e.push(t),i.nestedGroups){var o=this.groupsData.get({filter:function(e){return e.nestedInGroup==t},order:this.options.groupOrder}),n=o.map(function(t){return t.id});e=e.concat(n)}},this),e},n.prototype._addItem=function(t){this.items[t.id]=t;var e=this._getGroupId(t.data),i=this.groups[e];i?i&&i.data&&i.data.showNested&&(t.groupShowing=!0):t.groupShowing=!1,i&&i.add(t)},n.prototype._updateItem=function(t,e){t.setData(e);var i=this._getGroupId(t.data),o=this.groups[i];o?o&&o.data&&o.data.showNested&&(t.groupShowing=!0):t.groupShowing=!1},n.prototype._removeItem=function(t){t.hide(),delete this.items[t.id];var e=this.selection.indexOf(t.id);-1!=e&&this.selection.splice(e,1),t.parent&&t.parent.remove(t)},n.prototype._constructByEndArray=function(t){for(var e=[],i=0;in)return}}if(i&&i!=this.groupTouchParams.group){var a=e.get(i.groupId),h=e.get(this.groupTouchParams.group.groupId);h&&a&&(this.options.groupOrderSwap(h,a,e),e.update(h),e.update(a));var d=e.getIds({order:this.options.groupOrder});if(!l.equalArray(d,this.groupTouchParams.originalOrder))for(var u=this.groupTouchParams.originalOrder,p=this.groupTouchParams.group.groupId,f=Math.min(u.length,d.length),m=0,v=0,g=0;m=f)break;if(d[m+v]==p)v=1;else if(u[m+g]==p)g=1;else{var y=d.indexOf(u[m+g]),b=e.get(d[m+v]),_=e.get(u[m+g]);this.options.groupOrderSwap(b,_,e),e.update(b),e.update(_);var w=d[m+v];d[m+v]=u[m+g],d[y]=w,m++}}}}},n.prototype._onGroupDragEnd=function(t){if(this.options.groupEditable.order&&this.groupTouchParams.group){t.stopPropagation();var e=this,i=e.groupTouchParams.group.groupId,o=e.groupsData.getDataSet(),n=l.extend({},o.get(i));e.options.onMoveGroup(n,function(t){if(t)t[o._fieldId]=i,o.update(t);else{var n=o.getIds({order:e.options.groupOrder});if(!l.equalArray(n,e.groupTouchParams.originalOrder))for(var s=e.groupTouchParams.originalOrder,r=Math.min(s.length,n.length),a=0;a=r)break;var h=n.indexOf(s[a]),d=o.get(n[a]),u=o.get(s[a]);e.options.groupOrderSwap(d,u,o),o.update(d),o.update(u);var c=n[a];n[a]=s[a],n[h]=c,a++}}}),e.body.emitter.emit("groupDragged",{groupId:i})}},n.prototype._onSelectItem=function(t){if(this.options.selectable){var e=t.srcEvent&&(t.srcEvent.ctrlKey||t.srcEvent.metaKey),i=t.srcEvent&&t.srcEvent.shiftKey;if(e||i)return void this._onMultiSelectItem(t);var o=this.getSelection(),n=this.itemFromTarget(t),s=n?[n.id]:[];this.setSelection(s);var r=this.getSelection();(r.length>0||o.length>0)&&this.body.emitter.emit("select",{items:r,event:t})}},n.prototype._onMouseOver=function(t){var e=this.itemFromTarget(t);if(e){if(e!==this.itemFromRelatedTarget(t)){var i=e.getTitle();if(this.options.showTooltips&&i){null==this.popup&&(this.popup=new w(this.body.dom.root,this.options.tooltip.overflowMethod||"flip")),this.popup.setText(i);var o=this.body.dom.centerContainer;this.popup.setPosition(t.clientX-l.getAbsoluteLeft(o)+o.offsetLeft,t.clientY-l.getAbsoluteTop(o)+o.offsetTop),this.popup.show()}else null!=this.popup&&this.popup.hide();this.body.emitter.emit("itemover",{item:e.id,event:t})}}},n.prototype._onMouseOut=function(t){var e=this.itemFromTarget(t);if(e){e!==this.itemFromRelatedTarget(t)&&(null!=this.popup&&this.popup.hide(),this.body.emitter.emit("itemout",{item:e.id,event:t}))}},n.prototype._onMouseMove=function(t){if(this.itemFromTarget(t)&&this.options.showTooltips&&this.options.tooltip.followMouse&&this.popup&&!this.popup.hidden){var e=this.body.dom.centerContainer;this.popup.setPosition(t.clientX-l.getAbsoluteLeft(e)+e.offsetLeft,t.clientY-l.getAbsoluteTop(e)+e.offsetTop),this.popup.show()}},n.prototype._onMouseWheel=function(t){this.touchParams.itemIsDragging&&this._onDragEnd(t)},n.prototype._onUpdateItem=function(t){if(this.options.selectable&&this.options.editable.add){var e=this;if(t){var i=e.itemsData.get(t.id);this.options.onUpdate(i,function(t){t&&e.itemsData.getDataSet().update(t)})}}},n.prototype._onDropObjectOnItem=function(t){var e=this.itemFromTarget(t),i=JSON.parse(t.dataTransfer.getData("text"));this.options.onDropObjectOnItem(i,e)},n.prototype._onAddItem=function(t){if(this.options.selectable&&this.options.editable.add){var e,i,o=this,n=this.options.snap||null;this.options.rtl?(e=l.getAbsoluteRight(this.dom.frame),i=e-t.center.x):(e=l.getAbsoluteLeft(this.dom.frame),i=t.center.x-e);var s,r,a=this.body.util.toTime(i),h=this.body.util.getScale(),d=this.body.util.getStep();"drop"==t.type?(r=JSON.parse(t.dataTransfer.getData("text")),r.content=r.content?r.content:"new item",r.start=r.start?r.start:n?n(a,h,d):a,r.type=r.type||"box",r[this.itemsData._fieldId]=r.id||l.randomUUID(),"range"!=r.type||r.end||(s=this.body.util.toTime(i+this.props.width/5),r.end=n?n(s,h,d):s)):(r={start:n?n(a,h,d):a,content:"new item"},r[this.itemsData._fieldId]=l.randomUUID(),"range"===this.options.type&&(s=this.body.util.toTime(i+this.props.width/5),r.end=n?n(s,h,d):s));var u=this.groupFromTarget(t);u&&(r.group=u.groupId),r=this._cloneItemData(r),this.options.onAdd(r,function(e){e&&(o.itemsData.getDataSet().add(e),"drop"==t.type&&o.setSelection([e.id]))})}},n.prototype._onMultiSelectItem=function(t){if(this.options.selectable){var e=this.itemFromTarget(t);if(e){ +var i=this.options.multiselect?this.getSelection():[];if((t.srcEvent&&t.srcEvent.shiftKey||!1)&&this.options.multiselect){var o=this.itemsData.get(e.id).group,s=void 0;this.options.multiselectPerGroup&&i.length>0&&(s=this.itemsData.get(i[0]).group),this.options.multiselectPerGroup&&void 0!=s&&s!=o||i.push(e.id);var r=n._getItemRange(this.itemsData.get(i,this.itemOptions));if(!this.options.multiselectPerGroup||s==o){i=[];for(var a in this.items)if(this.items.hasOwnProperty(a)){var h=this.items[a],d=h.data.start,l=void 0!==h.data.end?h.data.end:d;!(d>=r.min&&l<=r.max)||this.options.multiselectPerGroup&&s!=this.itemsData.get(h.id).group||h instanceof _||i.push(h.id)}}}else{var u=i.indexOf(e.id);-1==u?i.push(e.id):i.splice(u,1)}this.setSelection(i),this.body.emitter.emit("select",{items:this.getSelection(),event:t})}}},n._getItemRange=function(t){var e=null,i=null;return t.forEach(function(t){(null==i||t.starte)&&(e=t.end):(null==e||t.start>e)&&(e=t.start)}),{min:i,max:e}},n.prototype.itemFromElement=function(t){for(var e=t;e;){if(e.hasOwnProperty("timeline-item"))return e["timeline-item"];e=e.parentNode}return null},n.prototype.itemFromTarget=function(t){return this.itemFromElement(t.target)},n.prototype.itemFromRelatedTarget=function(t){return this.itemFromElement(t.relatedTarget)},n.prototype.groupFromTarget=function(t){var e=t.center?t.center.y:t.clientY,i=this.groupIds;i.length<=0&&this.groupsData&&(i=this.groupsData.getIds({order:this.options.groupOrder}));for(var o=0;oa&&ea)return s}else if(0===o&&es&&(s=r.top+r.height)}while(a)}}o.height=s-o.top+.5*i.item.vertical},e.nostack=function(t,i,o,n){for(var s=0;so[r].index&&e.collisionByTimes(o[n],o[r])){s=o[r];break}null!=s&&(o[n].top=s.top+s.height)}while(s)}for(var a=0;ao[h].index&&(o[r].top+=o[h].height);for(var d=t[r],l=0;le.right&&t.top-i.vertical+.001e.top:t.left-i.horizontal+.001e.left&&t.top-i.vertical+.001e.top},e.collisionByTimes=function(t,e){return t.start<=e.start&&t.end>=e.start&&t.tope.top||e.start<=t.start&&e.end>=t.start&&e.topt.top}},function(t,e,i){function o(t,e,i){if(this.props={dot:{width:0,height:0},line:{width:0,height:0}},this.options=i,t&&void 0==t.start)throw new Error('Property "start" missing in item '+t);n.call(this,t,e,i)}var n=i(38);o.prototype=new n(null,null,null),o.prototype.isVisible=function(t){var e=this.options.align,i=this.width*t.getMillisecondsPerPixel();return"right"==e?this.data.start.getTime()>t.start&&this.data.start.getTime()-it.start&&this.data.start.getTime()t.start&&this.data.start.getTime()-i/2t.start&&this.data.startt.start},o.prototype._createDomElement=function(){this.dom||(this.dom={},this.dom.box=document.createElement("div"),this.dom.frame=document.createElement("div"),this.dom.frame.className="vis-item-overflow",this.dom.box.appendChild(this.dom.frame),this.dom.content=document.createElement("div"),this.dom.content.className="vis-item-content",this.dom.frame.appendChild(this.dom.content),this.dirty=!0)},o.prototype._appendDomElement=function(){if(!this.parent)throw new Error("Cannot redraw item: no parent attached");if(!this.dom.box.parentNode){var t=this.parent.dom.background;if(!t)throw new Error("Cannot redraw item: parent has no background container element");t.appendChild(this.dom.box)}this.displayed=!0},o.prototype._updateDirtyDomComponents=function(){if(this.dirty){this._updateContents(this.dom.content),this._updateDataAttributes(this.dom.content),this._updateStyle(this.dom.box);var t=(this.data.className?" "+this.data.className:"")+(this.selected?" vis-selected":"");this.dom.box.className=this.baseClassName+t}},o.prototype._getDomComponentsSizes=function(){return this.overflow="hidden"!==window.getComputedStyle(this.dom.content).overflow,{content:{width:this.dom.content.offsetWidth}}},o.prototype._updateDomComponentsSizes=function(t){this.props.content.width=t.content.width,this.height=0,this.dirty=!1},o.prototype._repaintDomAdditionals=function(){},o.prototype.redraw=function(t){var e,i=[this._createDomElement.bind(this),this._appendDomElement.bind(this),this._updateDirtyDomComponents.bind(this),function(){this.dirty&&(e=this._getDomComponentsSizes.bind(this)())}.bind(this),function(){this.dirty&&this._updateDomComponentsSizes.bind(this)(e)}.bind(this),this._repaintDomAdditionals.bind(this)];if(t)return i;var o;return i.forEach(function(t){o=t()}),o},o.prototype.show=r.prototype.show,o.prototype.hide=r.prototype.hide,o.prototype.repositionX=r.prototype.repositionX,o.prototype.repositionY=function(t){var e,i=this.options.orientation.item;if(void 0!==this.data.subgroup){var o=this.data.subgroup;this.dom.box.style.height=this.parent.subgroups[o].height+"px",this.dom.box.style.top="top"==i?this.parent.top+this.parent.subgroups[o].top+"px":this.parent.top+this.parent.height-this.parent.subgroups[o].top-this.parent.subgroups[o].height+"px",this.dom.box.style.bottom=""}else this.parent instanceof s?(e=Math.max(this.parent.height,this.parent.itemSet.body.domProps.center.height,this.parent.itemSet.body.domProps.centerContainer.height),this.dom.box.style.bottom="bottom"==i?"0":"",this.dom.box.style.top="top"==i?"0":""):(e=this.parent.height,this.dom.box.style.top=this.parent.top+"px",this.dom.box.style.bottom="");this.dom.box.style.height=e+"px"},t.exports=o},function(t,e,i){function o(t){return t&&t.__esModule?t:{default:t}}Object.defineProperty(e,"__esModule",{value:!0});var n=i(0),s=o(n),r=i(1),a=o(r),h=function(){function t(e,i){(0,s.default)(this,t),this.container=e,this.overflowMethod=i||"cap",this.x=0,this.y=0,this.padding=5,this.hidden=!1,this.frame=document.createElement("div"),this.frame.className="vis-tooltip",this.container.appendChild(this.frame)}return(0,a.default)(t,[{key:"setPosition",value:function(t,e){this.x=parseInt(t),this.y=parseInt(e)}},{key:"setText",value:function(t){t instanceof Element?(this.frame.innerHTML="",this.frame.appendChild(t)):this.frame.innerHTML=t}},{key:"show",value:function(t){if(void 0===t&&(t=!0),!0===t){var e=this.frame.clientHeight,i=this.frame.clientWidth,o=this.frame.parentNode.clientHeight,n=this.frame.parentNode.clientWidth,s=0,r=0;if("flip"==this.overflowMethod){var a=!1,h=!0;this.y-en-this.padding&&(a=!0),s=a?this.x-i:this.x,r=h?this.y-e:this.y}else r=this.y-e,r+e+this.padding>o&&(r=o-e-this.padding),rn&&(s=n-i-this.padding),s0){var r={};for(this._getRelevantData(s,r,o,n),this._applySampling(s,r),e=0;e0)switch(t.options.style){case"line":d.hasOwnProperty(s[e])||(d[s[e]]=m.calcPath(r[s[e]],t)),m.draw(d[s[e]],t,this.framework);case"point":case"points":"point"!=t.options.style&&"points"!=t.options.style&&1!=t.options.drawPoints.enabled||v.draw(r[s[e]],t,this.framework)}}}return a.cleanupElements(this.svgElements),!1},o.prototype._stack=function(t,e){var i,o,n,s,r;i=0;for(var a=0;at[a].x){r=e[h],s=0==h?r:e[h-1],i=h;break}}void 0===r&&(s=e[e.length-1],r=e[e.length-1]),o=r.x-s.x,n=r.y-s.y,t[a].y=0==o?t[a].orginalY+r.y:t[a].orginalY+n/o*(t[a].x-s.x)+s.y}},o.prototype._getRelevantData=function(t,e,i,o){var n,s,a,h;if(t.length>0)for(s=0;s0)for(var o=0;o0){var s=1,r=n.length,a=this.body.util.toGlobalScreen(n[n.length-1].x)-this.body.util.toGlobalScreen(n[0].x),h=r/a;s=Math.min(Math.ceil(.2*r),Math.max(1,Math.round(h)));for(var d=new Array(r),l=0;l0){for(s=0;s0&&(n=this.groups[t[s]],!0===r.stack&&"bar"===r.style?"left"===r.yAxisOrientation?a=a.concat(o):h=h.concat(o):i[t[s]]=n.getYRange(o,t[s]));f.getStackedYRange(a,i,t,"__barStackLeft","left"),f.getStackedYRange(h,i,t,"__barStackRight","right")}},o.prototype._updateYAxis=function(t,e){var i,o,n=!1,s=!1,r=!1,a=1e9,h=1e9,d=-1e9,l=-1e9;if(t.length>0){for(var u=0;ui?i:a,d=di?i:h,l=l=0&&t._redrawLabel(o-2,e.val,i,"vis-y-axis vis-major",t.props.majorCharHeight),!0===t.master&&(n?t._redrawLine(o,i,"vis-grid vis-horizontal vis-major",t.options.majorLinesOffset,t.props.majorLineWidth):t._redrawLine(o,i,"vis-grid vis-horizontal vis-minor",t.options.minorLinesOffset,t.props.minorLineWidth))});var r=0;void 0!==this.options[i].title&&void 0!==this.options[i].title.text&&(r=this.props.titleCharHeight);var h=!0===this.options.icons?Math.max(this.options.iconWidth,r)+this.options.labelOffsetX+15:r+this.options.labelOffsetX+15;return this.maxLabelSize>this.width-h&&!0===this.options.visible?(this.width=this.maxLabelSize+h,this.options.width=this.width+"px",a.cleanupElements(this.DOMelements.lines),a.cleanupElements(this.DOMelements.labels),this.redraw(),e=!0):this.maxLabelSizethis.minWidth?(this.width=Math.max(this.minWidth,this.maxLabelSize+h),this.options.width=this.width+"px",a.cleanupElements(this.DOMelements.lines),a.cleanupElements(this.DOMelements.labels),this.redraw(),e=!0):(a.cleanupElements(this.DOMelements.lines),a.cleanupElements(this.DOMelements.labels),e=!1),e},o.prototype.convertValue=function(t){return this.scale.convertValue(t)},o.prototype.screenToValue=function(t){return this.scale.screenToValue(t)},o.prototype._redrawLabel=function(t,e,i,o,n){var s=a.getDOMElement("div",this.DOMelements.labels,this.dom.frame);s.className=o,s.innerHTML=e,"left"===i?(s.style.left="-"+this.options.labelOffsetX+"px",s.style.textAlign="right"):(s.style.right="-"+this.options.labelOffsetX+"px",s.style.textAlign="left"),s.style.top=t-.5*n+this.options.labelOffsetY+"px",e+="";var r=Math.max(this.props.majorCharWidth,this.props.minorCharWidth);this.maxLabelSize6&&void 0!==arguments[6]&&arguments[6],a=arguments.length>7&&void 0!==arguments[7]&&arguments[7];if(this.majorSteps=[1,2,5,10],this.minorSteps=[.25,.5,1,2],this.customLines=null,this.containerHeight=n,this.majorCharHeight=s,this._start=t,this._end=e,this.scale=1,this.minorStepIdx=-1,this.magnitudefactor=1,this.determineScale(),this.zeroAlign=r,this.autoScaleStart=i,this.autoScaleEnd=o,this.formattingFunction=a,i||o){var h=this,d=function(t){var e=t-t%(h.magnitudefactor*h.minorSteps[h.minorStepIdx]);return t%(h.magnitudefactor*h.minorSteps[h.minorStepIdx])>h.magnitudefactor*h.minorSteps[h.minorStepIdx]*.5?e+h.magnitudefactor*h.minorSteps[h.minorStepIdx]:e};i&&(this._start-=2*this.magnitudefactor*this.minorSteps[this.minorStepIdx],this._start=d(this._start)),o&&(this._end+=this.magnitudefactor*this.minorSteps[this.minorStepIdx],this._end=d(this._end)),this.determineScale()}}o.prototype.setCharHeight=function(t){this.majorCharHeight=t},o.prototype.setHeight=function(t){this.containerHeight=t},o.prototype.determineScale=function(){var t=this._end-this._start;this.scale=this.containerHeight/t;var e=this.majorCharHeight/this.scale,i=t>0?Math.round(Math.log(t)/Math.LN10):0;this.minorStepIdx=-1,this.magnitudefactor=Math.pow(10,i);var o=0;i<0&&(o=i);for(var n=!1,s=o;Math.abs(s)<=Math.abs(i);s++){this.magnitudefactor=Math.pow(10,s);for(var r=0;r=e){n=!0,this.minorStepIdx=r;break}}if(!0===n)break}},o.prototype.is_major=function(t){return t%(this.magnitudefactor*this.majorSteps[this.minorStepIdx])==0},o.prototype.getStep=function(){return this.magnitudefactor*this.minorSteps[this.minorStepIdx]},o.prototype.getFirstMajor=function(){var t=this.magnitudefactor*this.majorSteps[this.minorStepIdx];return this.convertValue(this._start+(t-this._start%t)%t)},o.prototype.formatValue=function(t){var e=t.toPrecision(5);return"function"==typeof this.formattingFunction&&(e=this.formattingFunction(t)),"number"==typeof e?""+e:"string"==typeof e?e:t.toPrecision(5)},o.prototype.getLines=function(){for(var t=[],e=this.getStep(),i=(e-this._start%e)%e,o=this._start+i;this._end-o>1e-5;o+=e)o!=this._start&&t.push({major:this.is_major(o),y:this.convertValue(o),val:this.formatValue(o)});return t},o.prototype.followScale=function(t){var e=this.minorStepIdx,i=this._start,o=this._end,n=this,s=function(){n.magnitudefactor*=2},r=function(){n.magnitudefactor/=2};t.minorStepIdx<=1&&this.minorStepIdx<=1||t.minorStepIdx>1&&this.minorStepIdx>1||(t.minorStepIdxo+1e-5)r(),d=!1;else{if(!this.autoScaleStart&&this._start=0)){r(),d=!1;continue}console.warn("Can't adhere to given 'min' range, due to zeroalign")}this.autoScaleStart&&this.autoScaleEnd&&ue.x?1:-1})):this.itemsData=[]},o.prototype.getItems=function(){return this.itemsData},o.prototype.setZeroPosition=function(t){this.zeroPosition=t},o.prototype.setOptions=function(t){if(void 0!==t){var e=["sampling","style","sort","yAxisOrientation","barChart","zIndex","excludeFromStacking","excludeFromLegend"];r.selectiveDeepExtend(e,this.options,t),"function"==typeof t.drawPoints&&(t.drawPoints={onRender:t.drawPoints}),r.mergeOptions(this.options,t,"interpolation"),r.mergeOptions(this.options,t,"drawPoints"),r.mergeOptions(this.options,t,"shaded"),t.interpolation&&"object"==(0,s.default)(t.interpolation)&&t.interpolation.parametrization&&("uniform"==t.interpolation.parametrization?this.options.interpolation.alpha=0:"chordal"==t.interpolation.parametrization?this.options.interpolation.alpha=1:(this.options.interpolation.parametrization="centripetal",this.options.interpolation.alpha=.5))}},o.prototype.update=function(t){this.group=t,this.content=t.content||"graph",this.className=t.className||this.className||"vis-graph-group"+this.groupsUsingDefaultStyles[0]%10,this.visible=void 0===t.visible||t.visible,this.style=t.style,this.setOptions(t.options)},o.prototype.getLegend=function(t,e,i,o,n){if(void 0==i||null==i){i={svg:document.createElementNS("http://www.w3.org/2000/svg","svg"),svgElements:{},options:this.options,groups:[this]}}switch(void 0!=o&&null!=o||(o=0),void 0!=n&&null!=n||(n=.5*e),this.options.style){case"line":h.drawIcon(this,o,n,t,e,i);break;case"points":case"point":d.drawIcon(this,o,n,t,e,i);break;case"bar":a.drawIcon(this,o,n,t,e,i)}return{icon:i.svg,label:this.content,orientation:this.options.yAxisOrientation}},o.prototype.getYRange=function(t){for(var e=t[0].y,i=t[0].y,o=0;ot[o].y?t[o].y:e,i=i0&&(i=Math.min(i,Math.abs(e[o-1].screen_x-e[o].screen_x))),0===i&&(void 0===t[e[o].screen_x]&&(t[e[o].screen_x]={amount:0,resolved:0,accumulatedPositive:0,accumulatedNegative:0}),t[e[o].screen_x].amount+=1)},o._getSafeDrawData=function(t,e,i){var o,n;return t0?(o=t0){t.sort(function(t,e){return t.screen_x===e.screen_x?t.groupIde[s].screen_y?e[s].screen_y:o,n=nt[r].accumulatedNegative?t[r].accumulatedNegative:o,o=o>t[r].accumulatedPositive?t[r].accumulatedPositive:o,n=n0){return 1==e.options.interpolation.enabled?o._catmullRom(t,e):o._linear(t)}},o.drawIcon=function(t,e,i,o,s,r){var a,h,d=.5*s,l=n.getSVGElement("rect",r.svgElements,r.svg);if(l.setAttributeNS(null,"x",e),l.setAttributeNS(null,"y",i-d),l.setAttributeNS(null,"width",o),l.setAttributeNS(null,"height",2*d),l.setAttributeNS(null,"class","vis-outline"),a=n.getSVGElement("path",r.svgElements,r.svg),a.setAttributeNS(null,"class",t.className),void 0!==t.style&&a.setAttributeNS(null,"style",t.style),a.setAttributeNS(null,"d","M"+e+","+i+" L"+(e+o)+","+i),1==t.options.shaded.enabled&&(h=n.getSVGElement("path",r.svgElements,r.svg),"top"==t.options.shaded.orientation?h.setAttributeNS(null,"d","M"+e+", "+(i-d)+"L"+e+","+i+" L"+(e+o)+","+i+" L"+(e+o)+","+(i-d)):h.setAttributeNS(null,"d","M"+e+","+i+" L"+e+","+(i+d)+" L"+(e+o)+","+(i+d)+"L"+(e+o)+","+i),h.setAttributeNS(null,"class",t.className+" vis-icon-fill"),void 0!==t.options.shaded.style&&""!==t.options.shaded.style&&h.setAttributeNS(null,"style",t.options.shaded.style)),1==t.options.drawPoints.enabled){var u={style:t.options.drawPoints.style,styles:t.options.drawPoints.styles,size:t.options.drawPoints.size,className:t.className};n.drawPoint(e+.5*o,i,u,r.svgElements,r.svg)}},o.drawShading=function(t,e,i,o){if(1==e.options.shaded.enabled){var s=Number(o.svg.style.height.replace("px","")),r=n.getSVGElement("path",o.svgElements,o.svg),a="L";1==e.options.interpolation.enabled&&(a="C");var h,d=0;d="top"==e.options.shaded.orientation?0:"bottom"==e.options.shaded.orientation?s:Math.min(Math.max(0,e.zeroPosition),s),h="group"==e.options.shaded.orientation&&null!=i&&void 0!=i?"M"+t[0][0]+","+t[0][1]+" "+this.serializePath(t,a,!1)+" L"+i[i.length-1][0]+","+i[i.length-1][1]+" "+this.serializePath(i,a,!0)+i[0][0]+","+i[0][1]+" Z":"M"+t[0][0]+","+t[0][1]+" "+this.serializePath(t,a,!1)+" V"+d+" H"+t[0][0]+" Z",r.setAttributeNS(null,"class",e.className+" vis-fill"),void 0!==e.options.shaded.style&&r.setAttributeNS(null,"style",e.options.shaded.style),r.setAttributeNS(null,"d",h)}},o.draw=function(t,e,i){if(null!=t&&void 0!=t){var o=n.getSVGElement("path",i.svgElements,i.svg);o.setAttributeNS(null,"class",e.className),void 0!==e.style&&o.setAttributeNS(null,"style",e.style);var s="L";1==e.options.interpolation.enabled&&(s="C"),o.setAttributeNS(null,"d","M"+t[0][0]+","+t[0][1]+" "+this.serializePath(t,s,!1))}},o.serializePath=function(t,e,i){if(t.length<2)return"";var o,n=e;if(i)for(o=t.length-2;o>0;o--)n+=t[o][0]+","+t[o][1]+" ";else for(o=1;o0&&(f=1/f),m=3*v*(v+g),m>0&&(m=1/m),a={screen_x:(-b*o.screen_x+c*n.screen_x+_*s.screen_x)*f,screen_y:(-b*o.screen_y+c*n.screen_y+_*s.screen_y)*f},h={screen_x:(y*n.screen_x+p*s.screen_x-b*r.screen_x)*m,screen_y:(y*n.screen_y+p*s.screen_y-b*r.screen_y)*m},0==a.screen_x&&0==a.screen_y&&(a=n),0==h.screen_x&&0==h.screen_y&&(h=s),x.push([a.screen_x,a.screen_y]),x.push([h.screen_x,h.screen_y]),x.push([s.screen_x,s.screen_y]);return x},o._linear=function(t){for(var e=[],i=0;i");this.dom.textArea.innerHTML=r,this.dom.textArea.style.lineHeight=.75*this.options.iconSize+this.options.iconSpacing+"px"}},o.prototype.drawLegendIcons=function(){if(this.dom.frame.parentNode){var t=(0,s.default)(this.groups);t.sort(function(t,e){return t=0;i--){var a=s[i];a.nodes||(a.nodes=[]),-1===a.nodes.indexOf(n)&&a.nodes.push(n)}e.attr&&(n.attr=h(n.attr,e.attr))}function u(t,e){if(t.edges||(t.edges=[]),t.edges.push(e),t.edge){var i=h({},t.edge);e.attr=h(i,e.attr)}}function c(t,e,i,o,n){var s={from:e,to:i,type:o};return t.edge&&(s.attr=h({},t.edge)),s.attr=h(s.attr||{},n),s}function p(){for(F=I.NULL,L="";" "===z||"\t"===z||"\n"===z||"\r"===z;)s();do{var t=!1;if("#"===z){for(var e=A-1;" "===R.charAt(e)||"\t"===R.charAt(e);)e--;if("\n"===R.charAt(e)||""===R.charAt(e)){for(;""!=z&&"\n"!=z;)s();t=!0}}if("/"===z&&"/"===r()){for(;""!=z&&"\n"!=z;)s();t=!0}if("/"===z&&"*"===r()){for(;""!=z;){if("*"===z&&"/"===r()){s(),s();break}s()}t=!0}for(;" "===z||"\t"===z||"\n"===z||"\r"===z;)s()}while(t);if(""===z)return void(F=I.DELIMITER);var i=z+r();if(N[i])return F=I.DELIMITER,L=i,s(),void s();if(N[z])return F=I.DELIMITER,L=z,void s();if(a(z)||"-"===z){for(L+=z,s();a(z);)L+=z,s();return"false"===L?L=!1:"true"===L?L=!0:isNaN(Number(L))||(L=Number(L)),void(F=I.IDENTIFIER)}if('"'===z){for(s();""!=z&&('"'!=z||'"'===z&&'"'===r());)'"'===z?(L+=z,s()):"\\"===z&&"n"===r()?(L+="\n",s()):L+=z,s();if('"'!=z)throw x('End of string " expected');return s(),void(F=I.IDENTIFIER)}for(F=I.UNKNOWN;""!=z;)L+=z,s();throw new SyntaxError('Syntax error in part "'+k(L,30)+'"')}function f(){var t={};if(n(),p(),"strict"===L&&(t.strict=!0,p()),"graph"!==L&&"digraph"!==L||(t.type=L,p()),F===I.IDENTIFIER&&(t.id=L,p()),"{"!=L)throw x("Angle bracket { expected");if(p(),m(t),"}"!=L)throw x("Angle bracket } expected");if(p(),""!==L)throw x("End of file expected");return p(),delete t.node,delete t.edge,delete t.graph,t}function m(t){for(;""!==L&&"}"!=L;)v(t),";"===L&&p()}function v(t){var e=g(t);if(e)return void _(t,e);if(!y(t)){if(F!=I.IDENTIFIER)throw x("Identifier expected");var i=L;if(p(),"="===L){if(p(),F!=I.IDENTIFIER)throw x("Identifier expected");t[i]=L,p()}else b(t,i)}}function g(t){var e=null;if("subgraph"===L&&(e={},e.type="subgraph",p(),F===I.IDENTIFIER&&(e.id=L,p())),"{"===L){if(p(),e||(e={}),e.parent=t,e.node=t.node,e.edge=t.edge,e.graph=t.graph,m(e),"}"!=L)throw x("Angle bracket } expected");p(),delete e.node,delete e.edge,delete e.graph,delete e.parent,t.subgraphs||(t.subgraphs=[]),t.subgraphs.push(e)}return e}function y(t){return"node"===L?(p(),t.node=w(),"node"):"edge"===L?(p(),t.edge=w(),"edge"):"graph"===L?(p(),t.graph=w(),"graph"):null}function b(t,e){var i={id:e},o=w();o&&(i.attr=o),l(t,i),_(t,e)}function _(t,e){for(;"->"===L||"--"===L;){var i,o=L;p();var n=g(t);if(n)i=n;else{if(F!=I.IDENTIFIER)throw x("Identifier or subgraph expected");i=L,l(t,{id:i}),p()}u(t,c(t,e,i,o,w())),e=i}}function w(){for(var t=null,e={dashed:!0,solid:!1,dotted:[1,5]};"["===L;){for(p(),t={};""!==L&&"]"!=L;){if(F!=I.IDENTIFIER)throw x("Attribute name expected");var i=L;if(p(),"="!=L)throw x("Equal sign = expected");if(p(),F!=I.IDENTIFIER)throw x("Attribute value expected");var o=L;"style"===i&&(o=e[o]),d(t,i,o),p(),","==L&&p()}if("]"!=L)throw x("Bracket ] expected");p()}return t}function x(t){return new SyntaxError(t+', got "'+k(L,30)+'" (char '+A+")")}function k(t,e){return t.length<=e?t:t.substr(0,27)+"..."}function S(t,e,i){Array.isArray(t)?t.forEach(function(t){Array.isArray(e)?e.forEach(function(e){i(t,e)}):i(t,e)}):Array.isArray(e)?e.forEach(function(e){i(t,e)}):i(t,e)}function D(t,e,i){for(var o=e.split("."),n=o.pop(),s=t,r=0;r":!0,"--":!0},R="",A=0,z="",L="",F=I.NULL,B=/[a-zA-Z_0-9.:#]/;e.parseDOT=o,e.DOTToGraph=C},function(t,e,i){function o(t,e){var i=[],o=[],n={edges:{inheritColor:!1},nodes:{fixed:!1,parseColor:!1}};void 0!==e&&(void 0!==e.fixed&&(n.nodes.fixed=e.fixed),void 0!==e.parseColor&&(n.nodes.parseColor=e.parseColor),void 0!==e.inheritColor&&(n.edges.inheritColor=e.inheritColor));for(var s=t.edges,r=t.nodes,a=0;a2&&void 0!==arguments[2]&&arguments[2];(0,d.default)(this,t),this.body=e,this.pointToSelf=!1,this.baseSize=void 0,this.fontOptions={},this.setOptions(i),this.size={top:0,left:0,width:0,height:0,yLine:0},this.isEdgeLabel=o}return(0,u.default)(t,[{key:"setOptions",value:function(t){if(this.elementOptions=t,this.initFontOptions(t.font),p.isValidLabel(t.label)?this.labelDirty=!0:t.label="",void 0!==t.font&&null!==t.font)if("string"==typeof t.font)this.baseSize=this.fontOptions.size;else if("object"===(0,a.default)(t.font)){var e=t.font.size;void 0!==e&&(this.baseSize=e)}}},{key:"initFontOptions",value:function(e){var i=this;if(c.forEach(m,function(t){i.fontOptions[t]={}}),t.parseFontString(this.fontOptions,e))return void(this.fontOptions.vadjust=0);c.forEach(e,function(t,e){void 0!==t&&null!==t&&"object"!==(void 0===t?"undefined":(0,a.default)(t))&&(i.fontOptions[e]=t)})}},{key:"constrain",value:function(t){var e={constrainWidth:!1,maxWdt:-1,minWdt:-1,constrainHeight:!1,minHgt:-1,valign:"middle"},i=c.topMost(t,"widthConstraint");if("number"==typeof i)e.maxWdt=Number(i),e.minWdt=Number(i);else if("object"===(void 0===i?"undefined":(0,a.default)(i))){var o=c.topMost(t,["widthConstraint","maximum"]);"number"==typeof o&&(e.maxWdt=Number(o));var n=c.topMost(t,["widthConstraint","minimum"]);"number"==typeof n&&(e.minWdt=Number(n))}var s=c.topMost(t,"heightConstraint");if("number"==typeof s)e.minHgt=Number(s);else if("object"===(void 0===s?"undefined":(0,a.default)(s))){var r=c.topMost(t,["heightConstraint","minimum"]);"number"==typeof r&&(e.minHgt=Number(r));var h=c.topMost(t,["heightConstraint","valign"]);"string"==typeof h&&("top"!==h&&"bottom"!==h||(e.valign=h))}return e}},{key:"update",value:function(t,e){this.setOptions(t,!0),this.propagateFonts(e),c.deepExtend(this.fontOptions,this.constrain(e)),this.fontOptions.chooser=p.choosify("label",e)}},{key:"adjustSizes",value:function(t){var e=t?t.right+t.left:0;this.fontOptions.constrainWidth&&(this.fontOptions.maxWdt-=e,this.fontOptions.minWdt-=e);var i=t?t.top+t.bottom:0;this.fontOptions.constrainHeight&&(this.fontOptions.minHgt-=i)}},{key:"addFontOptionsToPile",value:function(t,e){for(var i=0;i5&&void 0!==arguments[5]?arguments[5]:"middle";if(void 0!==this.elementOptions.label){var r=this.fontOptions.size*this.body.view.scale;this.elementOptions.label&&r=this.elementOptions.scaling.label.maxVisible&&(r=Number(this.elementOptions.scaling.label.maxVisible)/this.body.view.scale),this.calculateLabelSize(t,o,n,e,i,s),this._drawBackground(t),this._drawText(t,e,this.size.yLine,s,r))}}},{key:"_drawBackground",value:function(t){if(void 0!==this.fontOptions.background&&"none"!==this.fontOptions.background){t.fillStyle=this.fontOptions.background;var e=this.getSize();t.fillRect(e.left,e.top,e.width,e.height)}}},{key:"_drawText",value:function(t,e,i){var o=arguments.length>3&&void 0!==arguments[3]?arguments[3]:"middle",n=arguments[4],r=this._setAlignment(t,e,i,o),a=(0,s.default)(r,2);e=a[0],i=a[1],t.textAlign="left",e-=this.size.width/2,this.fontOptions.valign&&this.size.height>this.size.labelHeight&&("top"===this.fontOptions.valign&&(i-=(this.size.height-this.size.labelHeight)/2),"bottom"===this.fontOptions.valign&&(i+=(this.size.height-this.size.labelHeight)/2));for(var h=0;h0&&(t.lineWidth=c.strokeWidth,t.strokeStyle=v,t.lineJoin="round"),t.fillStyle=m,c.strokeWidth>0&&t.strokeText(c.text,e+l,i+c.vadjust),t.fillText(c.text,e+l,i+c.vadjust),l+=c.width}i+=d.height}}}},{key:"_setAlignment",value:function(t,e,i,o){if(this.isEdgeLabel&&"horizontal"!==this.fontOptions.align&&!1===this.pointToSelf){e=0,i=0;"top"===this.fontOptions.align?(t.textBaseline="alphabetic",i-=4):"bottom"===this.fontOptions.align?(t.textBaseline="hanging",i+=4):t.textBaseline="middle"}else t.textBaseline=o;return[e,i]}},{key:"_getColor",value:function(t,e,i){var o=t||"#000000",n=i||"#ffffff";if(e<=this.elementOptions.scaling.label.drawThreshold){var s=Math.max(0,Math.min(1,1-(this.elementOptions.scaling.label.drawThreshold-e)));o=c.overrideOpacity(o,s),n=c.overrideOpacity(n,s)}return[o,n]}},{key:"getTextSize",value:function(t){var e=arguments.length>1&&void 0!==arguments[1]&&arguments[1],i=arguments.length>2&&void 0!==arguments[2]&&arguments[2];return this._processLabel(t,e,i),{width:this.size.width,height:this.size.height,lineCount:this.lineCount}}},{key:"getSize",value:function(){var t=this.size.left,e=this.size.top-1;if(this.isEdgeLabel){var i=.5*-this.size.width;switch(this.fontOptions.align){case"middle":t=i,e=.5*-this.size.height;break;case"top":t=i,e=-(this.size.height+2);break;case"bottom":t=i,e=2}}return{left:t,top:e,width:this.size.width,height:this.size.height}}},{key:"calculateLabelSize",value:function(t,e,i){var o=arguments.length>3&&void 0!==arguments[3]?arguments[3]:0,n=arguments.length>4&&void 0!==arguments[4]?arguments[4]:0,s=arguments.length>5&&void 0!==arguments[5]?arguments[5]:"middle";this._processLabel(t,e,i),this.size.left=o-.5*this.size.width,this.size.top=n-.5*this.size.height,this.size.yLine=n+.5*(1-this.lineCount)*this.fontOptions.size,"hanging"===s&&(this.size.top+=.5*this.fontOptions.size,this.size.top+=4,this.size.yLine+=4)}},{key:"getFormattingValues",value:function(t,e,i,o){var n=function(t,e,i){return"normal"===e?"mod"===i?"":t[i]:void 0!==t[e][i]?t[e][i]:t[i]},s={color:n(this.fontOptions,o,"color"),size:n(this.fontOptions,o,"size"),face:n(this.fontOptions,o,"face"),mod:n(this.fontOptions,o,"mod"),vadjust:n(this.fontOptions,o,"vadjust"),strokeWidth:this.fontOptions.strokeWidth,strokeColor:this.fontOptions.strokeColor};(e||i)&&("normal"===o&&!0===this.fontOptions.chooser&&this.elementOptions.labelHighlightBold?s.mod="bold":"function"==typeof this.fontOptions.chooser&&this.fontOptions.chooser(s,this.elementOptions.id,e,i));var r="";return void 0!==s.mod&&""!==s.mod&&(r+=s.mod+" "),r+=s.size+"px "+s.face,t.font=r.replace(/"/g,""),s.font=t.font,s.height=s.size,s}},{key:"differentState",value:function(t,e){return t!==this.selectedState||e!==this.hoverState}},{key:"_processLabelText",value:function(t,e,i,o){return new f(t,this,e,i).process(o)}},{key:"_processLabel",value:function(t,e,i){if(!1!==this.labelDirty||this.differentState(e,i)){var o=this._processLabelText(t,e,i,this.elementOptions.label);this.fontOptions.minWdt>0&&o.width0&&o.heighto.shape.height?(e=o.x+.5*o.shape.width,i=o.y-n):(e=o.x+n,i=o.y-.5*o.shape.height),[e,i,n]}},{key:"_pointOnCircle",value:function(t,e,i,o){var n=2*o*Math.PI;return{x:t+i*Math.cos(n),y:e-i*Math.sin(n)}}},{key:"_findBorderPositionCircle",value:function(t,e,i){for(var o=i.x,n=i.y,s=i.low,r=i.high,a=i.direction,h=0,d=this.options.selfReferenceSize,l=void 0,u=void 0,c=void 0,p=void 0,f=void 0,m=.5*(s+r);s<=r&&h<10&&(m=.5*(s+r),l=this._pointOnCircle(o,n,d,m),u=Math.atan2(t.y-l.y,t.x-l.x),c=t.distanceToBorder(e,u),p=Math.sqrt(Math.pow(l.x-t.x,2)+Math.pow(l.y-t.y,2)),f=c-p,!(Math.abs(f)<.05));)f>0?a>0?s=m:r=m:a>0?r=m:s=m,h++;return l.t=m,l}},{key:"getLineWidth",value:function(t,e){return!0===t?Math.max(this.selectionWidth,.3/this.body.view.scale):!0===e?Math.max(this.hoverWidth,.3/this.body.view.scale):Math.max(this.options.width,.3/this.body.view.scale)}},{key:"getColor",value:function(t,e,i,o){if(!1!==e.inheritsColor){if("both"===e.inheritsColor&&this.from.id!==this.to.id){var n=t.createLinearGradient(this.from.x,this.from.y,this.to.x,this.to.y),s=void 0,r=void 0;return s=this.from.options.color.highlight.border,r=this.to.options.color.highlight.border,!1===this.from.selected&&!1===this.to.selected?(s=l.overrideOpacity(this.from.options.color.border,e.opacity),r=l.overrideOpacity(this.to.options.color.border,e.opacity)):!0===this.from.selected&&!1===this.to.selected?r=this.to.options.color.border:!1===this.from.selected&&!0===this.to.selected&&(s=this.from.options.color.border),n.addColorStop(0,s),n.addColorStop(1,r),n}return"to"===e.inheritsColor?l.overrideOpacity(this.to.options.color.border,e.opacity):l.overrideOpacity(this.from.options.color.border,e.opacity)}return l.overrideOpacity(e.color,e.opacity)}},{key:"_circle", +value:function(t,e,i,o,n){this.enableShadow(t,e),t.beginPath(),t.arc(i,o,n,0,2*Math.PI,!1),t.stroke(),this.disableShadow(t,e)}},{key:"getDistanceToEdge",value:function(t,e,i,o,n,r,a,h){var d=0;if(this.from!=this.to)d=this._getDistanceToEdge(t,e,i,o,n,r,a);else{var l=this._getCircleData(void 0),u=(0,s.default)(l,3),c=u[0],p=u[1],f=u[2],m=c-n,v=p-r;d=Math.abs(Math.sqrt(m*m+v*v)-f)}return d}},{key:"_getDistanceToLine",value:function(t,e,i,o,n,s){var r=i-t,a=o-e,h=r*r+a*a,d=((n-t)*r+(s-e)*a)/h;d>1?d=1:d<0&&(d=0);var l=t+d*r,u=e+d*a,c=l-n,p=u-s;return Math.sqrt(c*c+p*p)}},{key:"getArrowData",value:function(t,e,i,o,n,r){var a=void 0,h=void 0,d=void 0,l=void 0,u=void 0,c=void 0,p=void 0,f=r.width;if("from"===e?(d=this.from,l=this.to,u=.1,c=r.fromArrowScale,p=r.fromArrowType):"to"===e?(d=this.to,l=this.from,u=-.1,c=r.toArrowScale,p=r.toArrowType):(d=this.to,l=this.from,c=r.middleArrowScale,p=r.middleArrowType),d!=l)if("middle"!==e)if(!0===this.options.smooth.enabled){h=this.findBorderPosition(d,t,{via:i});var m=this.getPoint(Math.max(0,Math.min(1,h.t+u)),i);a=Math.atan2(h.y-m.y,h.x-m.x)}else a=Math.atan2(d.y-l.y,d.x-l.x),h=this.findBorderPosition(d,t);else a=Math.atan2(d.y-l.y,d.x-l.x),h=this.getPoint(.5,i);else{var v=this._getCircleData(t),g=(0,s.default)(v,3),y=g[0],b=g[1],_=g[2];"from"===e?(h=this.findBorderPosition(this.from,t,{x:y,y:b,low:.25,high:.6,direction:-1}),a=-2*h.t*Math.PI+1.5*Math.PI+.1*Math.PI):"to"===e?(h=this.findBorderPosition(this.from,t,{x:y,y:b,low:.6,high:1,direction:1}),a=-2*h.t*Math.PI+1.5*Math.PI-1.1*Math.PI):(h=this._pointOnCircle(y,b,_,.175),a=3.9269908169872414)}"middle"===e&&c<0&&(f*=-1);var w=15*c+3*f;return{point:h,core:{x:h.x-.9*w*Math.cos(a),y:h.y-.9*w*Math.sin(a)},angle:a,length:w,type:p}}},{key:"drawArrowHead",value:function(t,e,i,o,n){t.strokeStyle=this.getColor(t,e,i,o),t.fillStyle=t.strokeStyle,t.lineWidth=e.width,u.draw(t,n),this.enableShadow(t,e),t.fill(),this.disableShadow(t,e)}},{key:"enableShadow",value:function(t,e){!0===e.shadow&&(t.shadowColor=e.shadowColor,t.shadowBlur=e.shadowSize,t.shadowOffsetX=e.shadowX,t.shadowOffsetY=e.shadowY)}},{key:"disableShadow",value:function(t,e){!0===e.shadow&&(t.shadowColor="rgba(0,0,0,0)",t.shadowBlur=0,t.shadowOffsetX=0,t.shadowOffsetY=0)}}]),t}();e.default=c},function(t,e,i){function o(t){return t&&t.__esModule?t:{default:t}}Object.defineProperty(e,"__esModule",{value:!0});var n=i(3),s=o(n),r=i(4),a=o(r),h=i(5),d=o(h),l=i(0),u=o(l),c=i(1),p=o(c),f=function(){function t(){(0,u.default)(this,t)}return(0,p.default)(t,null,[{key:"transform",value:function(t,e){t instanceof Array||(t=[t]);for(var i=e.point.x,o=e.point.y,n=e.angle,s=e.length,r=0;r0){var t=void 0,e=this.body.nodes,i=this.physicsBody.physicsNodeIndices,o=i.length,n=this._formBarnesHutTree(e,i);this.barnesHutTree=n;for(var s=0;s0&&this._getForceContributions(n.root,t)}}},{key:"_getForceContributions",value:function(t,e){this._getForceContribution(t.children.NW,e),this._getForceContribution(t.children.NE,e),this._getForceContribution(t.children.SW,e),this._getForceContribution(t.children.SE,e)}},{key:"_getForceContribution",value:function(t,e){if(t.childrenCount>0){var i=void 0,o=void 0,n=void 0;i=t.centerOfMass.x-e.x,o=t.centerOfMass.y-e.y,n=Math.sqrt(i*i+o*o),n*t.calcSize>this.thetaInversed?this._calculateForces(n,i,o,e,t):4===t.childrenCount?this._getForceContributions(t,e):t.children.data.id!=e.id&&this._calculateForces(n,i,o,e,t)}}},{key:"_calculateForces",value:function(t,e,i,o,n){0===t&&(t=.1,e=t),this.overlapAvoidanceFactor<1&&o.shape.radius&&(t=Math.max(.1+this.overlapAvoidanceFactor*o.shape.radius,t-o.shape.radius));var s=this.options.gravitationalConstant*n.mass*o.options.mass/Math.pow(t,3),r=e*s,a=i*s;this.physicsBody.forces[o.id].x+=r,this.physicsBody.forces[o.id].y+=a}},{key:"_formBarnesHutTree",value:function(t,e){for(var i=void 0,o=e.length,n=t[e[0]].x,s=t[e[0]].y,r=t[e[0]].x,a=t[e[0]].y,h=1;h0&&(lr&&(r=l),ua&&(a=u))}var c=Math.abs(r-n)-Math.abs(a-s);c>0?(s-=.5*c,a+=.5*c):(n+=.5*c,r-=.5*c);var p=Math.max(1e-5,Math.abs(r-n)),f=.5*p,m=.5*(n+r),v=.5*(s+a),g={root:{centerOfMass:{x:0,y:0},mass:0,range:{minX:m-f,maxX:m+f,minY:v-f,maxY:v+f},size:p,calcSize:1/p,children:{data:null},maxWidth:0,level:0,childrenCount:4}};this._splitBranch(g.root);for(var y=0;y0&&this._placeInTree(g.root,i);return g}},{key:"_updateBranchMass",value:function(t,e){var i=t.centerOfMass,o=t.mass+e.options.mass,n=1/o;i.x=i.x*t.mass+e.x*e.options.mass,i.x*=n,i.y=i.y*t.mass+e.y*e.options.mass,i.y*=n,t.mass=o;var s=Math.max(Math.max(e.height,e.radius),e.width);t.maxWidth=t.maxWidthe.x?o.maxY>e.y?"NW":"SW":o.maxY>e.y?"NE":"SE",this._placeInRegion(t,e,n)}},{key:"_placeInRegion",value:function(t,e,i){var o=t.children[i];switch(o.childrenCount){case 0:o.children.data=e,o.childrenCount=1,this._updateBranchMass(o,e);break;case 1:o.children.data.x===e.x&&o.children.data.y===e.y?(e.x+=this.seededRandom(),e.y+=this.seededRandom()):(this._splitBranch(o),this._placeInTree(o,e));break;case 4:this._placeInTree(o,e)}}},{key:"_splitBranch",value:function(t){var e=null;1===t.childrenCount&&(e=t.children.data,t.mass=0,t.centerOfMass.x=0,t.centerOfMass.y=0),t.childrenCount=4,t.children.data=null,this._insertRegion(t,"NW"),this._insertRegion(t,"NE"),this._insertRegion(t,"SW"),this._insertRegion(t,"SE"),null!=e&&this._placeInTree(t,e)}},{key:"_insertRegion",value:function(t,e){var i=void 0,o=void 0,n=void 0,s=void 0,r=.5*t.size;switch(e){case"NW":i=t.range.minX,o=t.range.minX+r,n=t.range.minY,s=t.range.minY+r;break;case"NE":i=t.range.minX+r,o=t.range.maxX,n=t.range.minY,s=t.range.minY+r;break;case"SW":i=t.range.minX,o=t.range.minX+r,n=t.range.minY+r,s=t.range.maxY;break;case"SE":i=t.range.minX+r,o=t.range.maxX,n=t.range.minY+r,s=t.range.maxY}t.children[e]={centerOfMass:{x:0,y:0},mass:0,range:{minX:i,maxX:o,minY:n,maxY:s},size:.5*t.size,calcSize:2*t.calcSize,children:{data:null},maxWidth:0,level:t.level+1,childrenCount:0}}},{key:"_debug",value:function(t,e){void 0!==this.barnesHutTree&&(t.lineWidth=1,this._drawBranch(this.barnesHutTree.root,t,e))}},{key:"_drawBranch",value:function(t,e,i){void 0===i&&(i="#FF0000"),4===t.childrenCount&&(this._drawBranch(t.children.NW,e),this._drawBranch(t.children.NE,e),this._drawBranch(t.children.SE,e),this._drawBranch(t.children.SW,e)),e.strokeStyle=i,e.beginPath(),e.moveTo(t.range.minX,t.range.minY),e.lineTo(t.range.maxX,t.range.minY),e.stroke(),e.beginPath(),e.moveTo(t.range.maxX,t.range.minY),e.lineTo(t.range.maxX,t.range.maxY),e.stroke(),e.beginPath(),e.moveTo(t.range.maxX,t.range.maxY),e.lineTo(t.range.minX,t.range.maxY),e.stroke(),e.beginPath(),e.moveTo(t.range.minX,t.range.maxY),e.lineTo(t.range.minX,t.range.minY),e.stroke()}}]),t}();e.default=h},function(t,e,i){function o(t){return t&&t.__esModule?t:{default:t}}Object.defineProperty(e,"__esModule",{value:!0});var n=i(0),s=o(n),r=i(1),a=o(r),h=function(){function t(e,i,o){(0,s.default)(this,t),this.body=e,this.physicsBody=i,this.setOptions(o)}return(0,a.default)(t,[{key:"setOptions",value:function(t){this.options=t}},{key:"solve",value:function(){for(var t=void 0,e=void 0,i=void 0,o=void 0,n=this.body.nodes,s=this.physicsBody.physicsNodeIndices,r=this.physicsBody.forces,a=0;a=t.length?(this._t=void 0,n(1)):"keys"==e?n(0,i):"values"==e?n(0,t[i]):n(0,[i,t[i]])},"values"),s.Arguments=s.Array,o("keys"),o("values"),o("entries")},function(t,e){t.exports=function(){}},function(t,e){t.exports=function(t,e){return{value:e,done:!!t}}},function(t,e){t.exports=function(t){if("function"!=typeof t)throw TypeError(t+" is not a function!");return t}},function(t,e,i){var o=i(54),n=i(39),s=i(59),r={};i(26)(r,i(13)("iterator"),function(){return this}),t.exports=function(t,e,i){t.prototype=o(r,{next:n(1,i)}),s(t,e+" Iterator")}},function(t,e,i){var o=i(20),n=i(27),s=i(33);t.exports=i(21)?Object.defineProperties:function(t,e){n(t);for(var i,r=s(e),a=r.length,h=0;a>h;)o.f(t,i=r[h++],e[i]);return t}},function(t,e,i){var o=i(25),n=i(132),s=i(133);t.exports=function(t){return function(e,i,r){var a,h=o(e),d=n(h.length),l=s(r,d);if(t&&i!=i){for(;d>l;)if((a=h[l++])!=a)return!0}else for(;d>l;l++)if((t||l in h)&&h[l]===i)return t||l||0;return!t&&-1}}},function(t,e,i){var o=i(55),n=Math.min;t.exports=function(t){return t>0?n(o(t),9007199254740991):0}},function(t,e,i){var o=i(55),n=Math.max,s=Math.min;t.exports=function(t,e){return t=o(t),t<0?n(t+e,0):s(t,e)}},function(t,e,i){var o=i(18).document;t.exports=o&&o.documentElement},function(t,e,i){var o=i(55),n=i(51);t.exports=function(t){return function(e,i){var s,r,a=String(n(e)),h=o(i),d=a.length;return h<0||h>=d?t?"":void 0:(s=a.charCodeAt(h),s<55296||s>56319||h+1===d||(r=a.charCodeAt(h+1))<56320||r>57343?t?a.charAt(h):s:t?a.slice(h,h+2):r-56320+(s-55296<<10)+65536)}}},function(t,e,i){var o=i(27),n=i(137);t.exports=i(7).getIterator=function(t){var e=n(t);if("function"!=typeof e)throw TypeError(t+" is not iterable!");return o(e.call(t))}},function(t,e,i){var o=i(86),n=i(13)("iterator"),s=i(31);t.exports=i(7).getIteratorMethod=function(t){if(void 0!=t)return t[n]||t["@@iterator"]||s[o(t)]}},function(t,e,i){i(139);var o=i(7).Object;t.exports=function(t,e){return o.create(t,e)}},function(t,e,i){var o=i(17);o(o.S,"Object",{create:i(54)})},function(t,e,i){i(141),t.exports=i(7).Object.keys},function(t,e,i){var o=i(41),n=i(33);i(87)("keys",function(){return function(t){return n(o(t))}})},function(t,e,i){t.exports={default:i(143),__esModule:!0}},function(t,e,i){i(60),i(49),t.exports=i(61).f("iterator")},function(t,e,i){t.exports={default:i(145),__esModule:!0}},function(t,e,i){i(146),i(151),i(152),i(153),t.exports=i(7).Symbol},function(t,e,i){var o=i(18),n=i(22),s=i(21),r=i(17),a=i(83),h=i(147).KEY,d=i(28),l=i(57),u=i(59),c=i(40),p=i(13),f=i(61),m=i(62),v=i(148),g=i(149),y=i(27),b=i(25),_=i(53),w=i(39),x=i(54),k=i(150),S=i(89),D=i(20),M=i(33),C=S.f,O=D.f,E=k.f,T=o.Symbol,P=o.JSON,I=P&&P.stringify,N=p("_hidden"),R=p("toPrimitive"),A={}.propertyIsEnumerable,z=l("symbol-registry"),L=l("symbols"),F=l("op-symbols"),B=Object.prototype,j="function"==typeof T,H=o.QObject,W=!H||!H.prototype||!H.prototype.findChild,Y=s&&d(function(){return 7!=x(O({},"a",{get:function(){return O(this,"a",{value:7}).a}})).a})?function(t,e,i){var o=C(B,e);o&&delete B[e],O(t,e,i),o&&t!==B&&O(B,e,o)}:O,G=function(t){var e=L[t]=x(T.prototype);return e._k=t,e},V=j&&"symbol"==typeof T.iterator?function(t){return"symbol"==typeof t}:function(t){return t instanceof T},U=function(t,e,i){return t===B&&U(F,e,i),y(t),e=_(e,!0),y(i),n(L,e)?(i.enumerable?(n(t,N)&&t[N][e]&&(t[N][e]=!1),i=x(i,{enumerable:w(0,!1)})):(n(t,N)||O(t,N,w(1,{})),t[N][e]=!0),Y(t,e,i)):O(t,e,i)},q=function(t,e){y(t);for(var i,o=v(e=b(e)),n=0,s=o.length;s>n;)U(t,i=o[n++],e[i]);return t},X=function(t,e){return void 0===e?x(t):q(x(t),e)},Z=function(t){var e=A.call(this,t=_(t,!0));return!(this===B&&n(L,t)&&!n(F,t))&&(!(e||!n(this,t)||!n(L,t)||n(this,N)&&this[N][t])||e)},K=function(t,e){if(t=b(t),e=_(e,!0),t!==B||!n(L,e)||n(F,e)){var i=C(t,e);return!i||!n(L,e)||n(t,N)&&t[N][e]||(i.enumerable=!0),i}},J=function(t){for(var e,i=E(b(t)),o=[],s=0;i.length>s;)n(L,e=i[s++])||e==N||e==h||o.push(e);return o},$=function(t){for(var e,i=t===B,o=E(i?F:b(t)),s=[],r=0;o.length>r;)!n(L,e=o[r++])||i&&!n(B,e)||s.push(L[e]);return s};j||(T=function(){if(this instanceof T)throw TypeError("Symbol is not a constructor!");var t=c(arguments.length>0?arguments[0]:void 0),e=function(i){this===B&&e.call(F,i),n(this,N)&&n(this[N],t)&&(this[N][t]=!1),Y(this,t,w(1,i))};return s&&W&&Y(B,t,{configurable:!0,set:e}),G(t)},a(T.prototype,"toString",function(){return this._k}),S.f=K,D.f=U,i(88).f=k.f=J,i(42).f=Z,i(63).f=$,s&&!i(52)&&a(B,"propertyIsEnumerable",Z,!0),f.f=function(t){return G(p(t))}),r(r.G+r.W+r.F*!j,{Symbol:T});for(var Q="hasInstance,isConcatSpreadable,iterator,match,replace,search,species,split,toPrimitive,toStringTag,unscopables".split(","),tt=0;Q.length>tt;)p(Q[tt++]);for(var et=M(p.store),it=0;et.length>it;)m(et[it++]);r(r.S+r.F*!j,"Symbol",{for:function(t){return n(z,t+="")?z[t]:z[t]=T(t)},keyFor:function(t){if(!V(t))throw TypeError(t+" is not a symbol!");for(var e in z)if(z[e]===t)return e},useSetter:function(){W=!0},useSimple:function(){W=!1}}),r(r.S+r.F*!j,"Object",{create:X,defineProperty:U,defineProperties:q,getOwnPropertyDescriptor:K,getOwnPropertyNames:J,getOwnPropertySymbols:$}),P&&r(r.S+r.F*(!j||d(function(){var t=T();return"[null]"!=I([t])||"{}"!=I({a:t})||"{}"!=I(Object(t))})),"JSON",{stringify:function(t){if(void 0!==t&&!V(t)){for(var e,i,o=[t],n=1;arguments.length>n;)o.push(arguments[n++]);return e=o[1],"function"==typeof e&&(i=e),!i&&g(e)||(e=function(t,e){if(i&&(e=i.call(this,t,e)),!V(e))return e}),o[1]=e,I.apply(P,o)}}}),T.prototype[R]||i(26)(T.prototype,R,T.prototype.valueOf),u(T,"Symbol"),u(Math,"Math",!0),u(o.JSON,"JSON",!0)},function(t,e,i){var o=i(40)("meta"),n=i(32),s=i(22),r=i(20).f,a=0,h=Object.isExtensible||function(){return!0},d=!i(28)(function(){return h(Object.preventExtensions({}))}),l=function(t){r(t,o,{value:{i:"O"+ ++a,w:{}}})},u=function(t,e){if(!n(t))return"symbol"==typeof t?t:("string"==typeof t?"S":"P")+t;if(!s(t,o)){if(!h(t))return"F";if(!e)return"E";l(t)}return t[o].i},c=function(t,e){if(!s(t,o)){if(!h(t))return!0;if(!e)return!1;l(t)}return t[o].w},p=function(t){return d&&f.NEED&&h(t)&&!s(t,o)&&l(t),t},f=t.exports={KEY:o,NEED:!1,fastKey:u,getWeak:c,onFreeze:p}},function(t,e,i){var o=i(33),n=i(63),s=i(42);t.exports=function(t){var e=o(t),i=n.f;if(i)for(var r,a=i(t),h=s.f,d=0;a.length>d;)h.call(t,r=a[d++])&&e.push(r);return e}},function(t,e,i){var o=i(50);t.exports=Array.isArray||function(t){return"Array"==o(t)}},function(t,e,i){var o=i(25),n=i(88).f,s={}.toString,r="object"==typeof window&&window&&Object.getOwnPropertyNames?Object.getOwnPropertyNames(window):[],a=function(t){try{return n(t)}catch(t){return r.slice()}};t.exports.f=function(t){return r&&"[object Window]"==s.call(t)?a(t):n(o(t))}},function(t,e){},function(t,e,i){i(62)("asyncIterator")},function(t,e,i){i(62)("observable")},function(t,e,i){(function(t){!function(e,i){t.exports=i()}(0,function(){function e(){return Co.apply(null,arguments)}function i(t){return t instanceof Array||"[object Array]"===Object.prototype.toString.call(t)}function o(t){return null!=t&&"[object Object]"===Object.prototype.toString.call(t)}function n(t){if(Object.getOwnPropertyNames)return 0===Object.getOwnPropertyNames(t).length;var e;for(e in t)if(t.hasOwnProperty(e))return!1;return!0}function s(t){return void 0===t}function r(t){return"number"==typeof t||"[object Number]"===Object.prototype.toString.call(t)}function a(t){return t instanceof Date||"[object Date]"===Object.prototype.toString.call(t)}function h(t,e){var i,o=[];for(i=0;i0)for(i=0;i0?"future":"past"];return D(i)?i(e):i.replace(/%s/i,e)}function A(t,e){var i=t.toLowerCase();Lo[i]=Lo[i+"s"]=Lo[e]=t}function z(t){return"string"==typeof t?Lo[t]||Lo[t.toLowerCase()]:void 0}function L(t){var e,i,o={};for(i in t)d(t,i)&&(e=z(i))&&(o[e]=t[i]);return o}function F(t,e){Fo[t]=e}function B(t){var e=[];for(var i in t)e.push({unit:i,priority:Fo[i]});return e.sort(function(t,e){return t.priority-e.priority}),e}function j(t,e,i){var o=""+Math.abs(t),n=e-o.length;return(t>=0?i?"+":"":"-")+Math.pow(10,Math.max(0,n)).toString().substr(1)+o}function H(t,e,i,o){var n=o;"string"==typeof o&&(n=function(){return this[o]()}),t&&(Wo[t]=n),e&&(Wo[e[0]]=function(){return j(n.apply(this,arguments),e[1],e[2])}),i&&(Wo[i]=function(){return this.localeData().ordinal(n.apply(this,arguments),t)})}function W(t){return t.match(/\[[\s\S]/)?t.replace(/^\[|\]$/g,""):t.replace(/\\/g,"")}function Y(t){var e,i,o=t.match(Bo);for(e=0,i=o.length;e=0&&jo.test(t);)t=t.replace(jo,i),jo.lastIndex=0,o-=1;return t}function U(t,e,i){an[t]=D(e)?e:function(t,o){return t&&i?i:e}}function q(t,e){return d(an,t)?an[t](e._strict,e._locale):new RegExp(X(t))}function X(t){return Z(t.replace("\\","").replace(/\\(\[)|\\(\])|\[([^\]\[]*)\]|\\(.)/g,function(t,e,i,o,n){return e||i||o||n}))}function Z(t){return t.replace(/[-\/\\^$*+?.()|[\]{}]/g,"\\$&")}function K(t,e){var i,o=e;for("string"==typeof t&&(t=[t]),r(e)&&(o=function(t,i){i[e]=_(t)}),i=0;i=0&&isFinite(a.getFullYear())&&a.setFullYear(t),a}function _t(t){var e=new Date(Date.UTC.apply(null,arguments));return t<100&&t>=0&&isFinite(e.getUTCFullYear())&&e.setUTCFullYear(t),e}function wt(t,e,i){var o=7+e-i;return-(7+_t(t,0,o).getUTCDay()-e)%7+o-1}function xt(t,e,i,o,n){var s,r,a=(7+i-o)%7,h=wt(t,o,n),d=1+7*(e-1)+a+h;return d<=0?(s=t-1,r=Q(s)+d):d>Q(t)?(s=t+1,r=d-Q(t)):(s=t,r=d),{year:s,dayOfYear:r}}function kt(t,e,i){var o,n,s=wt(t.year(),e,i),r=Math.floor((t.dayOfYear()-s-1)/7)+1;return r<1?(n=t.year()-1,o=r+St(n,e,i)):r>St(t.year(),e,i)?(o=r-St(t.year(),e,i),n=t.year()+1):(n=t.year(),o=r),{week:o,year:n}}function St(t,e,i){var o=wt(t,e,i),n=wt(t+1,e,i);return(Q(t)-o+n)/7}function Dt(t){return kt(t,this._week.dow,this._week.doy).week}function Mt(){return this._week.dow}function Ct(){return this._week.doy}function Ot(t){var e=this.localeData().week(this);return null==t?e:this.add(7*(t-e),"d")}function Et(t){var e=kt(this,1,4).week;return null==t?e:this.add(7*(t-e),"d")}function Tt(t,e){return"string"!=typeof t?t:isNaN(t)?(t=e.weekdaysParse(t),"number"==typeof t?t:null):parseInt(t,10)}function Pt(t,e){return"string"==typeof t?e.weekdaysParse(t)%7||7:isNaN(t)?null:t}function It(t,e){return t?i(this._weekdays)?this._weekdays[t.day()]:this._weekdays[this._weekdays.isFormat.test(e)?"format":"standalone"][t.day()]:i(this._weekdays)?this._weekdays:this._weekdays.standalone}function Nt(t){return t?this._weekdaysShort[t.day()]:this._weekdaysShort}function Rt(t){return t?this._weekdaysMin[t.day()]:this._weekdaysMin}function At(t,e,i){var o,n,s,r=t.toLocaleLowerCase();if(!this._weekdaysParse)for(this._weekdaysParse=[],this._shortWeekdaysParse=[],this._minWeekdaysParse=[],o=0;o<7;++o)s=u([2e3,1]).day(o),this._minWeekdaysParse[o]=this.weekdaysMin(s,"").toLocaleLowerCase(),this._shortWeekdaysParse[o]=this.weekdaysShort(s,"").toLocaleLowerCase(),this._weekdaysParse[o]=this.weekdays(s,"").toLocaleLowerCase();return i?"dddd"===e?(n=yn.call(this._weekdaysParse,r),-1!==n?n:null):"ddd"===e?(n=yn.call(this._shortWeekdaysParse,r),-1!==n?n:null):(n=yn.call(this._minWeekdaysParse,r),-1!==n?n:null):"dddd"===e?-1!==(n=yn.call(this._weekdaysParse,r))?n:-1!==(n=yn.call(this._shortWeekdaysParse,r))?n:(n=yn.call(this._minWeekdaysParse,r),-1!==n?n:null):"ddd"===e?-1!==(n=yn.call(this._shortWeekdaysParse,r))?n:-1!==(n=yn.call(this._weekdaysParse,r))?n:(n=yn.call(this._minWeekdaysParse,r),-1!==n?n:null):-1!==(n=yn.call(this._minWeekdaysParse,r))?n:-1!==(n=yn.call(this._weekdaysParse,r))?n:(n=yn.call(this._shortWeekdaysParse,r),-1!==n?n:null)}function zt(t,e,i){var o,n,s;if(this._weekdaysParseExact)return At.call(this,t,e,i);for(this._weekdaysParse||(this._weekdaysParse=[],this._minWeekdaysParse=[],this._shortWeekdaysParse=[],this._fullWeekdaysParse=[]),o=0;o<7;o++){if(n=u([2e3,1]).day(o),i&&!this._fullWeekdaysParse[o]&&(this._fullWeekdaysParse[o]=new RegExp("^"+this.weekdays(n,"").replace(".",".?")+"$","i"),this._shortWeekdaysParse[o]=new RegExp("^"+this.weekdaysShort(n,"").replace(".",".?")+"$","i"),this._minWeekdaysParse[o]=new RegExp("^"+this.weekdaysMin(n,"").replace(".",".?")+"$","i")),this._weekdaysParse[o]||(s="^"+this.weekdays(n,"")+"|^"+this.weekdaysShort(n,"")+"|^"+this.weekdaysMin(n,""),this._weekdaysParse[o]=new RegExp(s.replace(".",""),"i")),i&&"dddd"===e&&this._fullWeekdaysParse[o].test(t))return o;if(i&&"ddd"===e&&this._shortWeekdaysParse[o].test(t))return o;if(i&&"dd"===e&&this._minWeekdaysParse[o].test(t))return o;if(!i&&this._weekdaysParse[o].test(t))return o}}function Lt(t){if(!this.isValid())return null!=t?this:NaN;var e=this._isUTC?this._d.getUTCDay():this._d.getDay();return null!=t?(t=Tt(t,this.localeData()),this.add(t-e,"d")):e}function Ft(t){if(!this.isValid())return null!=t?this:NaN;var e=(this.day()+7-this.localeData()._week.dow)%7;return null==t?e:this.add(t-e,"d")}function Bt(t){if(!this.isValid())return null!=t?this:NaN;if(null!=t){var e=Pt(t,this.localeData());return this.day(this.day()%7?e:e-7)}return this.day()||7}function jt(t){return this._weekdaysParseExact?(d(this,"_weekdaysRegex")||Yt.call(this),t?this._weekdaysStrictRegex:this._weekdaysRegex):(d(this,"_weekdaysRegex")||(this._weekdaysRegex=En),this._weekdaysStrictRegex&&t?this._weekdaysStrictRegex:this._weekdaysRegex)}function Ht(t){return this._weekdaysParseExact?(d(this,"_weekdaysRegex")||Yt.call(this),t?this._weekdaysShortStrictRegex:this._weekdaysShortRegex):(d(this,"_weekdaysShortRegex")||(this._weekdaysShortRegex=Tn),this._weekdaysShortStrictRegex&&t?this._weekdaysShortStrictRegex:this._weekdaysShortRegex)}function Wt(t){return this._weekdaysParseExact?(d(this,"_weekdaysRegex")||Yt.call(this),t?this._weekdaysMinStrictRegex:this._weekdaysMinRegex):(d(this,"_weekdaysMinRegex")||(this._weekdaysMinRegex=Pn),this._weekdaysMinStrictRegex&&t?this._weekdaysMinStrictRegex:this._weekdaysMinRegex)}function Yt(){function t(t,e){return e.length-t.length}var e,i,o,n,s,r=[],a=[],h=[],d=[];for(e=0;e<7;e++)i=u([2e3,1]).day(e),o=this.weekdaysMin(i,""),n=this.weekdaysShort(i,""),s=this.weekdays(i,""),r.push(o),a.push(n),h.push(s),d.push(o),d.push(n),d.push(s);for(r.sort(t),a.sort(t),h.sort(t),d.sort(t),e=0;e<7;e++)a[e]=Z(a[e]),h[e]=Z(h[e]),d[e]=Z(d[e]);this._weekdaysRegex=new RegExp("^("+d.join("|")+")","i"),this._weekdaysShortRegex=this._weekdaysRegex,this._weekdaysMinRegex=this._weekdaysRegex,this._weekdaysStrictRegex=new RegExp("^("+h.join("|")+")","i"),this._weekdaysShortStrictRegex=new RegExp("^("+a.join("|")+")","i"),this._weekdaysMinStrictRegex=new RegExp("^("+r.join("|")+")","i")}function Gt(){return this.hours()%12||12}function Vt(){return this.hours()||24}function Ut(t,e){H(t,0,0,function(){return this.localeData().meridiem(this.hours(),this.minutes(),e)})}function qt(t,e){return e._meridiemParse}function Xt(t){return"p"===(t+"").toLowerCase().charAt(0)}function Zt(t,e,i){return t>11?i?"pm":"PM":i?"am":"AM"}function Kt(t){return t?t.toLowerCase().replace("_","-"):t}function Jt(t){for(var e,i,o,n,s=0;s0;){if(o=$t(n.slice(0,e).join("-")))return o;if(i&&i.length>=e&&w(n,i,!0)>=e-1)break;e--}s++}return null}function $t(e){var i=null;if(!zn[e]&&void 0!==t&&t&&t.exports)try{i=In._abbr;!function(){var t=new Error('Cannot find module "./locale"');throw t.code="MODULE_NOT_FOUND",t}(),Qt(i)}catch(t){}return zn[e]}function Qt(t,e){var i;return t&&(i=s(e)?ie(t):te(t,e))&&(In=i),In._abbr}function te(t,e){if(null!==e){var i=An;if(e.abbr=t,null!=zn[t])S("defineLocaleOverride","use moment.updateLocale(localeName, config) to change an existing locale. moment.defineLocale(localeName, config) should only be used for creating a new locale See http://momentjs.com/guides/#/warnings/define-locale/ for more info."),i=zn[t]._config;else if(null!=e.parentLocale){if(null==zn[e.parentLocale])return Ln[e.parentLocale]||(Ln[e.parentLocale]=[]),Ln[e.parentLocale].push({name:t,config:e}),null;i=zn[e.parentLocale]._config}return zn[t]=new O(C(i,e)),Ln[t]&&Ln[t].forEach(function(t){te(t.name,t.config)}),Qt(t),zn[t]}return delete zn[t],null}function ee(t,e){if(null!=e){var i,o=An;null!=zn[t]&&(o=zn[t]._config),e=C(o,e),i=new O(e),i.parentLocale=zn[t],zn[t]=i,Qt(t)}else null!=zn[t]&&(null!=zn[t].parentLocale?zn[t]=zn[t].parentLocale:null!=zn[t]&&delete zn[t]);return zn[t]}function ie(t){var e;if(t&&t._locale&&t._locale._abbr&&(t=t._locale._abbr),!t)return In;if(!i(t)){if(e=$t(t))return e;t=[t]}return Jt(t)}function oe(){return Io(zn)}function ne(t){var e,i=t._a;return i&&-2===p(t).overflow&&(e=i[ln]<0||i[ln]>11?ln:i[un]<1||i[un]>ht(i[dn],i[ln])?un:i[cn]<0||i[cn]>24||24===i[cn]&&(0!==i[pn]||0!==i[fn]||0!==i[mn])?cn:i[pn]<0||i[pn]>59?pn:i[fn]<0||i[fn]>59?fn:i[mn]<0||i[mn]>999?mn:-1,p(t)._overflowDayOfYear&&(eun)&&(e=un),p(t)._overflowWeeks&&-1===e&&(e=vn),p(t)._overflowWeekday&&-1===e&&(e=gn),p(t).overflow=e),t}function se(t,e,i){return null!=t?t:null!=e?e:i}function re(t){var i=new Date(e.now());return t._useUTC?[i.getUTCFullYear(),i.getUTCMonth(),i.getUTCDate()]:[i.getFullYear(),i.getMonth(),i.getDate()]}function ae(t){var e,i,o,n,s=[];if(!t._d){for(o=re(t),t._w&&null==t._a[un]&&null==t._a[ln]&&he(t),null!=t._dayOfYear&&(n=se(t._a[dn],o[dn]),(t._dayOfYear>Q(n)||0===t._dayOfYear)&&(p(t)._overflowDayOfYear=!0),i=_t(n,0,t._dayOfYear),t._a[ln]=i.getUTCMonth(),t._a[un]=i.getUTCDate()),e=0;e<3&&null==t._a[e];++e)t._a[e]=s[e]=o[e];for(;e<7;e++)t._a[e]=s[e]=null==t._a[e]?2===e?1:0:t._a[e];24===t._a[cn]&&0===t._a[pn]&&0===t._a[fn]&&0===t._a[mn]&&(t._nextDay=!0,t._a[cn]=0),t._d=(t._useUTC?_t:bt).apply(null,s),null!=t._tzm&&t._d.setUTCMinutes(t._d.getUTCMinutes()-t._tzm),t._nextDay&&(t._a[cn]=24),t._w&&void 0!==t._w.d&&t._w.d!==t._d.getDay()&&(p(t).weekdayMismatch=!0)}}function he(t){var e,i,o,n,s,r,a,h;if(e=t._w,null!=e.GG||null!=e.W||null!=e.E)s=1,r=4,i=se(e.GG,t._a[dn],kt(De(),1,4).year),o=se(e.W,1),((n=se(e.E,1))<1||n>7)&&(h=!0);else{s=t._locale._week.dow,r=t._locale._week.doy;var d=kt(De(),s,r);i=se(e.gg,t._a[dn],d.year),o=se(e.w,d.week),null!=e.d?((n=e.d)<0||n>6)&&(h=!0):null!=e.e?(n=e.e+s,(e.e<0||e.e>6)&&(h=!0)):n=s}o<1||o>St(i,s,r)?p(t)._overflowWeeks=!0:null!=h?p(t)._overflowWeekday=!0:(a=xt(i,o,n,s,r),t._a[dn]=a.year,t._dayOfYear=a.dayOfYear)}function de(t){var e,i,o,n,s,r,a=t._i,h=Fn.exec(a)||Bn.exec(a);if(h){for(p(t).iso=!0,e=0,i=Hn.length;e0&&p(t).unusedInput.push(r),a=a.slice(a.indexOf(o)+o.length),d+=o.length),Wo[s]?(o?p(t).empty=!1:p(t).unusedTokens.push(s),$(s,o,t)):t._strict&&!o&&p(t).unusedTokens.push(s);p(t).charsLeftOver=h-d,a.length>0&&p(t).unusedInput.push(a),t._a[cn]<=12&&!0===p(t).bigHour&&t._a[cn]>0&&(p(t).bigHour=void 0),p(t).parsedDateParts=t._a.slice(0),p(t).meridiem=t._meridiem,t._a[cn]=ye(t._locale,t._a[cn],t._meridiem),ae(t),ne(t)}function ye(t,e,i){var o;return null==i?e:null!=t.meridiemHour?t.meridiemHour(e,i):null!=t.isPM?(o=t.isPM(i),o&&e<12&&(e+=12),o||12!==e||(e=0),e):e}function be(t){var e,i,o,n,s;if(0===t._f.length)return p(t).invalidFormat=!0,void(t._d=new Date(NaN));for(n=0;nthis.clone().month(0).utcOffset()||this.utcOffset()>this.clone().month(5).utcOffset()}function Ue(){if(!s(this._isDSTShifted))return this._isDSTShifted;var t={};if(v(t,this),t=xe(t),t._a){var e=t._isUTC?u(t._a):De(t._a);this._isDSTShifted=this.isValid()&&w(t._a,e.toArray())>0}else this._isDSTShifted=!1;return this._isDSTShifted}function qe(){return!!this.isValid()&&!this._isUTC}function Xe(){return!!this.isValid()&&this._isUTC}function Ze(){return!!this.isValid()&&(this._isUTC&&0===this._offset)}function Ke(t,e){var i,o,n,s=t,a=null;return Ne(t)?s={ms:t._milliseconds,d:t._days,M:t._months}:r(t)?(s={},e?s[e]=t:s.milliseconds=t):(a=Jn.exec(t))?(i="-"===a[1]?-1:1,s={y:0,d:_(a[un])*i,h:_(a[cn])*i,m:_(a[pn])*i,s:_(a[fn])*i,ms:_(Re(1e3*a[mn]))*i}):(a=$n.exec(t))?(i="-"===a[1]?-1:(a[1],1),s={y:Je(a[2],i),M:Je(a[3],i),w:Je(a[4],i),d:Je(a[5],i),h:Je(a[6],i),m:Je(a[7],i),s:Je(a[8],i)}):null==s?s={}:"object"==typeof s&&("from"in s||"to"in s)&&(n=Qe(De(s.from),De(s.to)),s={},s.ms=n.milliseconds,s.M=n.months),o=new Ie(s),Ne(t)&&d(t,"_locale")&&(o._locale=t._locale),o}function Je(t,e){var i=t&&parseFloat(t.replace(",","."));return(isNaN(i)?0:i)*e}function $e(t,e){var i={milliseconds:0,months:0};return i.months=e.month()-t.month()+12*(e.year()-t.year()),t.clone().add(i.months,"M").isAfter(e)&&--i.months,i.milliseconds=+e-+t.clone().add(i.months,"M"),i}function Qe(t,e){var i;return t.isValid()&&e.isValid()?(e=Le(e,t),t.isBefore(e)?i=$e(t,e):(i=$e(e,t),i.milliseconds=-i.milliseconds,i.months=-i.months),i):{milliseconds:0,months:0}}function ti(t,e){return function(i,o){var n,s;return null===o||isNaN(+o)||(S(e,"moment()."+e+"(period, number) is deprecated. Please use moment()."+e+"(number, period). See http://momentjs.com/guides/#/warnings/add-inverted-param/ for more info."),s=i,i=o,o=s),i="string"==typeof i?+i:i,n=Ke(i,o),ei(this,n,t),this}}function ei(t,i,o,n){var s=i._milliseconds,r=Re(i._days),a=Re(i._months);t.isValid()&&(n=null==n||n,a&&pt(t,ot(t,"Month")+a*o),r&&nt(t,"Date",ot(t,"Date")+r*o),s&&t._d.setTime(t._d.valueOf()+s*o),n&&e.updateOffset(t,r||a))}function ii(t,e){var i=t.diff(e,"days",!0);return i<-6?"sameElse":i<-1?"lastWeek":i<0?"lastDay":i<1?"sameDay":i<2?"nextDay":i<7?"nextWeek":"sameElse"}function oi(t,i){var o=t||De(),n=Le(o,this).startOf("day"),s=e.calendarFormat(this,n)||"sameElse",r=i&&(D(i[s])?i[s].call(this,o):i[s]);return this.format(r||this.localeData().calendar(s,this,De(o)))}function ni(){return new g(this)}function si(t,e){var i=y(t)?t:De(t);return!(!this.isValid()||!i.isValid())&&(e=z(s(e)?"millisecond":e),"millisecond"===e?this.valueOf()>i.valueOf():i.valueOf()9999?G(t,"YYYYYY-MM-DD[T]HH:mm:ss.SSS[Z]"):D(Date.prototype.toISOString)?this.toDate().toISOString():G(t,"YYYY-MM-DD[T]HH:mm:ss.SSS[Z]")}function mi(){if(!this.isValid())return"moment.invalid(/* "+this._i+" */)";var t="moment",e="";this.isLocal()||(t=0===this.utcOffset()?"moment.utc":"moment.parseZone",e="Z");var i="["+t+'("]',o=0<=this.year()&&this.year()<=9999?"YYYY":"YYYYYY",n=e+'[")]';return this.format(i+o+"-MM-DD[T]HH:mm:ss.SSS"+n)}function vi(t){t||(t=this.isUtc()?e.defaultFormatUtc:e.defaultFormat);var i=G(this,t);return this.localeData().postformat(i)}function gi(t,e){return this.isValid()&&(y(t)&&t.isValid()||De(t).isValid())?Ke({to:this,from:t}).locale(this.locale()).humanize(!e):this.localeData().invalidDate()}function yi(t){return this.from(De(),t)}function bi(t,e){return this.isValid()&&(y(t)&&t.isValid()||De(t).isValid())?Ke({from:this,to:t}).locale(this.locale()).humanize(!e):this.localeData().invalidDate()}function _i(t){return this.to(De(),t)}function wi(t){var e;return void 0===t?this._locale._abbr:(e=ie(t),null!=e&&(this._locale=e),this)}function xi(){return this._locale}function ki(t){switch(t=z(t)){case"year":this.month(0);case"quarter":case"month":this.date(1);case"week":case"isoWeek":case"day":case"date":this.hours(0);case"hour":this.minutes(0);case"minute":this.seconds(0);case"second":this.milliseconds(0)}return"week"===t&&this.weekday(0),"isoWeek"===t&&this.isoWeekday(1),"quarter"===t&&this.month(3*Math.floor(this.month()/3)),this}function Si(t){return void 0===(t=z(t))||"millisecond"===t?this:("date"===t&&(t="day"),this.startOf(t).add(1,"isoWeek"===t?"week":t).subtract(1,"ms"))}function Di(){return this._d.valueOf()-6e4*(this._offset||0)}function Mi(){return Math.floor(this.valueOf()/1e3)}function Ci(){return new Date(this.valueOf())}function Oi(){var t=this;return[t.year(),t.month(),t.date(),t.hour(),t.minute(),t.second(),t.millisecond()]}function Ei(){var t=this;return{years:t.year(),months:t.month(),date:t.date(),hours:t.hours(),minutes:t.minutes(),seconds:t.seconds(),milliseconds:t.milliseconds()}}function Ti(){return this.isValid()?this.toISOString():null}function Pi(){return f(this)}function Ii(){return l({},p(this))}function Ni(){return p(this).overflow}function Ri(){return{input:this._i,format:this._f,locale:this._locale,isUTC:this._isUTC,strict:this._strict}}function Ai(t,e){H(0,[t,t.length],0,e)}function zi(t){return ji.call(this,t,this.week(),this.weekday(),this.localeData()._week.dow,this.localeData()._week.doy)}function Li(t){return ji.call(this,t,this.isoWeek(),this.isoWeekday(),1,4)}function Fi(){return St(this.year(),1,4)}function Bi(){var t=this.localeData()._week;return St(this.year(),t.dow,t.doy)}function ji(t,e,i,o,n){var s;return null==t?kt(this,o,n).year:(s=St(t,o,n),e>s&&(e=s),Hi.call(this,t,e,i,o,n))}function Hi(t,e,i,o,n){var s=xt(t,e,i,o,n),r=_t(s.year,0,s.dayOfYear);return this.year(r.getUTCFullYear()),this.month(r.getUTCMonth()),this.date(r.getUTCDate()),this}function Wi(t){return null==t?Math.ceil((this.month()+1)/3):this.month(3*(t-1)+this.month()%3)}function Yi(t){var e=Math.round((this.clone().startOf("day")-this.clone().startOf("year"))/864e5)+1;return null==t?e:this.add(t-e,"d")}function Gi(t,e){e[mn]=_(1e3*("0."+t))}function Vi(){return this._isUTC?"UTC":""}function Ui(){return this._isUTC?"Coordinated Universal Time":""}function qi(t){return De(1e3*t)}function Xi(){return De.apply(null,arguments).parseZone()}function Zi(t){return t}function Ki(t,e,i,o){var n=ie(),s=u().set(o,e);return n[i](s,t)}function Ji(t,e,i){if(r(t)&&(e=t,t=void 0),t=t||"",null!=e)return Ki(t,e,i,"month");var o,n=[];for(o=0;o<12;o++)n[o]=Ki(t,o,i,"month");return n}function $i(t,e,i,o){"boolean"==typeof t?(r(e)&&(i=e,e=void 0),e=e||""):(e=t,i=e,t=!1,r(e)&&(i=e,e=void 0),e=e||"");var n=ie(),s=t?n._week.dow:0;if(null!=i)return Ki(e,(i+s)%7,o,"day");var a,h=[];for(a=0;a<7;a++)h[a]=Ki(e,(a+s)%7,o,"day");return h}function Qi(t,e){return Ji(t,e,"months")}function to(t,e){return Ji(t,e,"monthsShort")}function eo(t,e,i){return $i(t,e,i,"weekdays")}function io(t,e,i){return $i(t,e,i,"weekdaysShort")}function oo(t,e,i){return $i(t,e,i,"weekdaysMin")}function no(){var t=this._data;return this._milliseconds=ds(this._milliseconds),this._days=ds(this._days),this._months=ds(this._months),t.milliseconds=ds(t.milliseconds),t.seconds=ds(t.seconds),t.minutes=ds(t.minutes),t.hours=ds(t.hours),t.months=ds(t.months),t.years=ds(t.years),this}function so(t,e,i,o){var n=Ke(e,i);return t._milliseconds+=o*n._milliseconds,t._days+=o*n._days,t._months+=o*n._months,t._bubble()}function ro(t,e){return so(this,t,e,1)}function ao(t,e){return so(this,t,e,-1)}function ho(t){return t<0?Math.floor(t):Math.ceil(t)}function lo(){var t,e,i,o,n,s=this._milliseconds,r=this._days,a=this._months,h=this._data;return s>=0&&r>=0&&a>=0||s<=0&&r<=0&&a<=0||(s+=864e5*ho(co(a)+r),r=0,a=0),h.milliseconds=s%1e3,t=b(s/1e3),h.seconds=t%60,e=b(t/60),h.minutes=e%60,i=b(e/60),h.hours=i%24,r+=b(i/24),n=b(uo(r)),a+=n, +r-=ho(co(n)),o=b(a/12),a%=12,h.days=r,h.months=a,h.years=o,this}function uo(t){return 4800*t/146097}function co(t){return 146097*t/4800}function po(t){if(!this.isValid())return NaN;var e,i,o=this._milliseconds;if("month"===(t=z(t))||"year"===t)return e=this._days+o/864e5,i=this._months+uo(e),"month"===t?i:i/12;switch(e=this._days+Math.round(co(this._months)),t){case"week":return e/7+o/6048e5;case"day":return e+o/864e5;case"hour":return 24*e+o/36e5;case"minute":return 1440*e+o/6e4;case"second":return 86400*e+o/1e3;case"millisecond":return Math.floor(864e5*e)+o;default:throw new Error("Unknown unit "+t)}}function fo(){return this.isValid()?this._milliseconds+864e5*this._days+this._months%12*2592e6+31536e6*_(this._months/12):NaN}function mo(t){return function(){return this.as(t)}}function vo(){return Ke(this)}function go(t){return t=z(t),this.isValid()?this[t+"s"]():NaN}function yo(t){return function(){return this.isValid()?this._data[t]:NaN}}function bo(){return b(this.days()/7)}function _o(t,e,i,o,n){return n.relativeTime(e||1,!!i,t,o)}function wo(t,e,i){var o=Ke(t).abs(),n=Ds(o.as("s")),s=Ds(o.as("m")),r=Ds(o.as("h")),a=Ds(o.as("d")),h=Ds(o.as("M")),d=Ds(o.as("y")),l=n<=Ms.ss&&["s",n]||n0,l[4]=i,_o.apply(null,l)}function xo(t){return void 0===t?Ds:"function"==typeof t&&(Ds=t,!0)}function ko(t,e){return void 0!==Ms[t]&&(void 0===e?Ms[t]:(Ms[t]=e,"s"===t&&(Ms.ss=e-1),!0))}function So(t){if(!this.isValid())return this.localeData().invalidDate();var e=this.localeData(),i=wo(this,!t,e);return t&&(i=e.pastFuture(+this,i)),e.postformat(i)}function Do(t){return(t>0)-(t<0)||+t}function Mo(){if(!this.isValid())return this.localeData().invalidDate();var t,e,i,o=Cs(this._milliseconds)/1e3,n=Cs(this._days),s=Cs(this._months);t=b(o/60),e=b(t/60),o%=60,t%=60,i=b(s/12),s%=12;var r=i,a=s,h=n,d=e,l=t,u=o?o.toFixed(3).replace(/\.?0+$/,""):"",c=this.asSeconds();if(!c)return"P0D";var p=c<0?"-":"",f=Do(this._months)!==Do(c)?"-":"",m=Do(this._days)!==Do(c)?"-":"",v=Do(this._milliseconds)!==Do(c)?"-":"";return p+"P"+(r?f+r+"Y":"")+(a?f+a+"M":"")+(h?m+h+"D":"")+(d||l||u?"T":"")+(d?v+d+"H":"")+(l?v+l+"M":"")+(u?v+u+"S":"")}var Co,Oo;Oo=Array.prototype.some?Array.prototype.some:function(t){for(var e=Object(this),i=e.length>>>0,o=0;o68?1900:2e3)};var yn,bn=it("FullYear",!0);yn=Array.prototype.indexOf?Array.prototype.indexOf:function(t){var e;for(e=0;ethis?this:t:m()}),Xn=function(){return Date.now?Date.now():+new Date},Zn=["year","quarter","month","week","day","hour","minute","second","millisecond"];Ae("Z",":"),Ae("ZZ",""),U("Z",nn),U("ZZ",nn),K(["Z","ZZ"],function(t,e,i){i._useUTC=!0,i._tzm=ze(nn,t)});var Kn=/([\+\-]|\d\d)/gi;e.updateOffset=function(){};var Jn=/^(\-|\+)?(?:(\d*)[. ])?(\d+)\:(\d+)(?:\:(\d+)(\.\d*)?)?$/,$n=/^(-|\+)?P(?:([-+]?[0-9,.]*)Y)?(?:([-+]?[0-9,.]*)M)?(?:([-+]?[0-9,.]*)W)?(?:([-+]?[0-9,.]*)D)?(?:T(?:([-+]?[0-9,.]*)H)?(?:([-+]?[0-9,.]*)M)?(?:([-+]?[0-9,.]*)S)?)?$/;Ke.fn=Ie.prototype,Ke.invalid=Pe;var Qn=ti(1,"add"),ts=ti(-1,"subtract");e.defaultFormat="YYYY-MM-DDTHH:mm:ssZ",e.defaultFormatUtc="YYYY-MM-DDTHH:mm:ss[Z]";var es=k("moment().lang() is deprecated. Instead, use moment().localeData() to get the language configuration. Use moment().locale() to change languages.",function(t){return void 0===t?this.localeData():this.locale(t)});H(0,["gg",2],0,function(){return this.weekYear()%100}),H(0,["GG",2],0,function(){return this.isoWeekYear()%100}),Ai("gggg","weekYear"),Ai("ggggg","weekYear"),Ai("GGGG","isoWeekYear"),Ai("GGGGG","isoWeekYear"),A("weekYear","gg"),A("isoWeekYear","GG"),F("weekYear",1),F("isoWeekYear",1),U("G",en),U("g",en),U("GG",Xo,Go),U("gg",Xo,Go),U("GGGG",$o,Uo),U("gggg",$o,Uo),U("GGGGG",Qo,qo),U("ggggg",Qo,qo),J(["gggg","ggggg","GGGG","GGGGG"],function(t,e,i,o){e[o.substr(0,2)]=_(t)}),J(["gg","GG"],function(t,i,o,n){i[n]=e.parseTwoDigitYear(t)}),H("Q",0,"Qo","quarter"),A("quarter","Q"),F("quarter",7),U("Q",Yo),K("Q",function(t,e){e[ln]=3*(_(t)-1)}),H("D",["DD",2],"Do","date"),A("date","D"),F("date",9),U("D",Xo),U("DD",Xo,Go),U("Do",function(t,e){return t?e._dayOfMonthOrdinalParse||e._ordinalParse:e._dayOfMonthOrdinalParseLenient}),K(["D","DD"],un),K("Do",function(t,e){e[un]=_(t.match(Xo)[0],10)});var is=it("Date",!0);H("DDD",["DDDD",3],"DDDo","dayOfYear"),A("dayOfYear","DDD"),F("dayOfYear",4),U("DDD",Jo),U("DDDD",Vo),K(["DDD","DDDD"],function(t,e,i){i._dayOfYear=_(t)}),H("m",["mm",2],0,"minute"),A("minute","m"),F("minute",14),U("m",Xo),U("mm",Xo,Go),K(["m","mm"],pn);var os=it("Minutes",!1);H("s",["ss",2],0,"second"),A("second","s"),F("second",15),U("s",Xo),U("ss",Xo,Go),K(["s","ss"],fn);var ns=it("Seconds",!1);H("S",0,0,function(){return~~(this.millisecond()/100)}),H(0,["SS",2],0,function(){return~~(this.millisecond()/10)}),H(0,["SSS",3],0,"millisecond"),H(0,["SSSS",4],0,function(){return 10*this.millisecond()}),H(0,["SSSSS",5],0,function(){return 100*this.millisecond()}),H(0,["SSSSSS",6],0,function(){return 1e3*this.millisecond()}),H(0,["SSSSSSS",7],0,function(){return 1e4*this.millisecond()}),H(0,["SSSSSSSS",8],0,function(){return 1e5*this.millisecond()}),H(0,["SSSSSSSSS",9],0,function(){return 1e6*this.millisecond()}),A("millisecond","ms"),F("millisecond",16),U("S",Jo,Yo),U("SS",Jo,Go),U("SSS",Jo,Vo);var ss;for(ss="SSSS";ss.length<=9;ss+="S")U(ss,tn);for(ss="S";ss.length<=9;ss+="S")K(ss,Gi);var rs=it("Milliseconds",!1);H("z",0,0,"zoneAbbr"),H("zz",0,0,"zoneName");var as=g.prototype;as.add=Qn,as.calendar=oi,as.clone=ni,as.diff=ui,as.endOf=Si,as.format=vi,as.from=gi,as.fromNow=yi,as.to=bi,as.toNow=_i,as.get=st,as.invalidAt=Ni,as.isAfter=si,as.isBefore=ri,as.isBetween=ai,as.isSame=hi,as.isSameOrAfter=di,as.isSameOrBefore=li,as.isValid=Pi,as.lang=es,as.locale=wi,as.localeData=xi,as.max=qn,as.min=Un,as.parsingFlags=Ii,as.set=rt,as.startOf=ki,as.subtract=ts,as.toArray=Oi,as.toObject=Ei,as.toDate=Ci,as.toISOString=fi,as.inspect=mi,as.toJSON=Ti,as.toString=pi,as.unix=Mi,as.valueOf=Di,as.creationData=Ri,as.year=bn,as.isLeapYear=et,as.weekYear=zi,as.isoWeekYear=Li,as.quarter=as.quarters=Wi,as.month=ft,as.daysInMonth=mt,as.week=as.weeks=Ot,as.isoWeek=as.isoWeeks=Et,as.weeksInYear=Bi,as.isoWeeksInYear=Fi,as.date=is,as.day=as.days=Lt,as.weekday=Ft,as.isoWeekday=Bt,as.dayOfYear=Yi,as.hour=as.hours=Rn,as.minute=as.minutes=os,as.second=as.seconds=ns,as.millisecond=as.milliseconds=rs,as.utcOffset=Be,as.utc=He,as.local=We,as.parseZone=Ye,as.hasAlignedHourOffset=Ge,as.isDST=Ve,as.isLocal=qe,as.isUtcOffset=Xe,as.isUtc=Ze,as.isUTC=Ze,as.zoneAbbr=Vi,as.zoneName=Ui,as.dates=k("dates accessor is deprecated. Use date instead.",is),as.months=k("months accessor is deprecated. Use month instead",ft),as.years=k("years accessor is deprecated. Use year instead",bn),as.zone=k("moment().zone is deprecated, use moment().utcOffset instead. http://momentjs.com/guides/#/warnings/zone/",je),as.isDSTShifted=k("isDSTShifted is deprecated. See http://momentjs.com/guides/#/warnings/dst-shifted/ for more information",Ue);var hs=O.prototype;hs.calendar=E,hs.longDateFormat=T,hs.invalidDate=P,hs.ordinal=I,hs.preparse=Zi,hs.postformat=Zi,hs.relativeTime=N,hs.pastFuture=R,hs.set=M,hs.months=dt,hs.monthsShort=lt,hs.monthsParse=ct,hs.monthsRegex=gt,hs.monthsShortRegex=vt,hs.week=Dt,hs.firstDayOfYear=Ct,hs.firstDayOfWeek=Mt,hs.weekdays=It,hs.weekdaysMin=Rt,hs.weekdaysShort=Nt,hs.weekdaysParse=zt,hs.weekdaysRegex=jt,hs.weekdaysShortRegex=Ht,hs.weekdaysMinRegex=Wt,hs.isPM=Xt,hs.meridiem=Zt,Qt("en",{dayOfMonthOrdinalParse:/\d{1,2}(th|st|nd|rd)/,ordinal:function(t){var e=t%10;return t+(1===_(t%100/10)?"th":1===e?"st":2===e?"nd":3===e?"rd":"th")}}),e.lang=k("moment.lang is deprecated. Use moment.locale instead.",Qt),e.langData=k("moment.langData is deprecated. Use moment.localeData instead.",ie);var ds=Math.abs,ls=mo("ms"),us=mo("s"),cs=mo("m"),ps=mo("h"),fs=mo("d"),ms=mo("w"),vs=mo("M"),gs=mo("y"),ys=yo("milliseconds"),bs=yo("seconds"),_s=yo("minutes"),ws=yo("hours"),xs=yo("days"),ks=yo("months"),Ss=yo("years"),Ds=Math.round,Ms={ss:44,s:45,m:45,h:22,d:26,M:11},Cs=Math.abs,Os=Ie.prototype;return Os.isValid=Te,Os.abs=no,Os.add=ro,Os.subtract=ao,Os.as=po,Os.asMilliseconds=ls,Os.asSeconds=us,Os.asMinutes=cs,Os.asHours=ps,Os.asDays=fs,Os.asWeeks=ms,Os.asMonths=vs,Os.asYears=gs,Os.valueOf=fo,Os._bubble=lo,Os.clone=vo,Os.get=go,Os.milliseconds=ys,Os.seconds=bs,Os.minutes=_s,Os.hours=ws,Os.days=xs,Os.weeks=bo,Os.months=ks,Os.years=Ss,Os.humanize=So,Os.toISOString=Mo,Os.toString=Mo,Os.toJSON=Mo,Os.locale=wi,Os.localeData=xi,Os.toIsoString=k("toIsoString() is deprecated. Please use toISOString() instead (notice the capitals)",Mo),Os.lang=es,H("X",0,0,"unix"),H("x",0,0,"valueOf"),U("x",en),U("X",sn),K("X",function(t,e,i){i._d=new Date(1e3*parseFloat(t,10))}),K("x",function(t,e,i){i._d=new Date(_(t))}),e.version="2.19.1",function(t){Co=t}(De),e.fn=as,e.min=Ce,e.max=Oe,e.now=Xn,e.utc=u,e.unix=qi,e.months=Qi,e.isDate=a,e.locale=Qt,e.invalid=m,e.duration=Ke,e.isMoment=y,e.weekdays=eo,e.parseZone=Xi,e.localeData=ie,e.isDuration=Ne,e.monthsShort=to,e.weekdaysMin=oo,e.defineLocale=te,e.updateLocale=ee,e.locales=oe,e.weekdaysShort=io,e.normalizeUnits=z,e.relativeTimeRounding=xo,e.relativeTimeThreshold=ko,e.calendarFormat=ii,e.prototype=as,e})}).call(e,i(155)(t))},function(t,e){t.exports=function(t){return t.webpackPolyfill||(t.deprecate=function(){},t.paths=[],t.children||(t.children=[]),Object.defineProperty(t,"loaded",{enumerable:!0,get:function(){return t.l}}),Object.defineProperty(t,"id",{enumerable:!0,get:function(){return t.i}}),t.webpackPolyfill=1),t}},function(t,e){function i(t){throw new Error("Cannot find module '"+t+"'.")}i.keys=function(){return[]},i.resolve=i,t.exports=i,i.id=156},function(t,e,i){(function(e){function i(t,e,i){var o=e&&i||0,n=0;for(e=e||[],t.toLowerCase().replace(/[0-9a-f]{2}/g,function(t){n<16&&(e[o+n++]=u[t])});n<16;)e[o+n++]=0;return e}function o(t,e){var i=e||0,o=l;return o[t[i++]]+o[t[i++]]+o[t[i++]]+o[t[i++]]+"-"+o[t[i++]]+o[t[i++]]+"-"+o[t[i++]]+o[t[i++]]+"-"+o[t[i++]]+o[t[i++]]+"-"+o[t[i++]]+o[t[i++]]+o[t[i++]]+o[t[i++]]+o[t[i++]]+o[t[i++]]}function n(t,e,i){var n=e&&i||0,s=e||[];t=t||{};var r=void 0!==t.clockseq?t.clockseq:m,a=void 0!==t.msecs?t.msecs:(new Date).getTime(),h=void 0!==t.nsecs?t.nsecs:g+1,d=a-v+(h-g)/1e4;if(d<0&&void 0===t.clockseq&&(r=r+1&16383),(d<0||a>v)&&void 0===t.nsecs&&(h=0),h>=1e4)throw new Error("uuid.v1(): Can't create more than 10M uuids/sec");v=a,g=h,m=r,a+=122192928e5;var l=(1e4*(268435455&a)+h)%4294967296;s[n++]=l>>>24&255,s[n++]=l>>>16&255,s[n++]=l>>>8&255,s[n++]=255&l;var u=a/4294967296*1e4&268435455;s[n++]=u>>>8&255,s[n++]=255&u,s[n++]=u>>>24&15|16,s[n++]=u>>>16&255,s[n++]=r>>>8|128,s[n++]=255&r;for(var c=t.node||f,p=0;p<6;p++)s[n+p]=c[p];return e||o(s)}function s(t,e,i){var n=e&&i||0;"string"==typeof t&&(e="binary"==t?new Array(16):null,t=null),t=t||{};var s=t.random||(t.rng||r)();if(s[6]=15&s[6]|64,s[8]=63&s[8]|128,e)for(var a=0;a<16;a++)e[n+a]=s[a];return e||o(s)}var r,a="undefined"!=typeof window?window:void 0!==e?e:null;if(a&&a.crypto&&crypto.getRandomValues){var h=new Uint8Array(16);r=function(){return crypto.getRandomValues(h),h}}if(!r){var d=new Array(16);r=function(){for(var t,e=0;e<16;e++)0==(3&e)&&(t=4294967296*Math.random()),d[e]=t>>>((3&e)<<3)&255;return d}}for(var l=[],u={},c=0;c<256;c++)l[c]=(c+256).toString(16).substr(1),u[l[c]]=c;var p=r(),f=[1|p[0],p[1],p[2],p[3],p[4],p[5]],m=16383&(p[6]<<8|p[7]),v=0,g=0,y=s;y.v1=n,y.v4=s,y.parse=i,y.unparse=o,t.exports=y}).call(e,i(158))},function(t,e){var i;i=function(){return this}();try{i=i||Function("return this")()||(0,eval)("this")}catch(t){"object"==typeof window&&(i=window)}t.exports=i},function(t,e,i){e.util=i(2),e.DOMutil=i(14),e.DataSet=i(11),e.DataView=i(12),e.Queue=i(43),e.Graph3d=i(161),e.graph3d={Camera:i(95),Filter:i(96),Point2d:i(91),Point3d:i(34),Slider:i(92),StepNumber:i(93)},e.moment=i(9),e.Hammer=i(10),e.keycharm=i(35)},function(t,e,i){var o=i(7),n=o.JSON||(o.JSON={stringify:JSON.stringify});t.exports=function(t){return n.stringify.apply(n,arguments)}},function(t,e,i){function o(t,e,i){if(!(this instanceof o))throw new SyntaxError("Constructor must be called with the new operator");this.containerElement=t,this.dataGroup=new _,this.dataPoints=null,this.create(),f.setDefaults(o.DEFAULTS,this),this.colX=void 0,this.colY=void 0,this.colZ=void 0,this.colValue=void 0,this.setOptions(i),this.setData(e)}function n(t){return"clientX"in t?t.clientX:t.targetTouches[0]&&t.targetTouches[0].clientX||0}function s(t){return"clientY"in t?t.clientY:t.targetTouches[0]&&t.targetTouches[0].clientY||0}var r=i(90),a=function(t){return t&&t.__esModule?t:{default:t}}(r),h=i(44),d=i(2),l=i(34),u=i(91),c=i(92),p=i(93),f=i(94),m=i(15).default,v=i(15),g=v.printStyle,y=i(172),b=y.allOptions,_=i(173);o.STYLE=f.STYLE;o.DEFAULTS={width:"400px",height:"400px",filterLabel:"time",legendLabel:"value",xLabel:"x",yLabel:"y",zLabel:"z",xValueLabel:function(t){return t},yValueLabel:function(t){return t},zValueLabel:function(t){return t},showXAxis:!0,showYAxis:!0,showZAxis:!0,showGrid:!0,showPerspective:!0,showShadow:!1,keepAspectRatio:!0,verticalRatio:.5,dotSizeRatio:.02,dotSizeMinFraction:.5,dotSizeMaxFraction:2.5,showAnimationControls:void 0,animationInterval:1e3,animationPreload:!1,animationAutoStart:void 0,axisColor:"#4D4D4D",gridColor:"#D3D3D3",xCenter:"55%",yCenter:"50%",style:o.STYLE.DOT,tooltip:!1,tooltipStyle:{content:{padding:"10px",border:"1px solid #4d4d4d",color:"#1a1a1a",background:"rgba(255,255,255,0.7)",borderRadius:"2px",boxShadow:"5px 5px 10px rgba(128,128,128,0.5)"},line:{height:"40px",width:"0",borderLeft:"1px solid #4d4d4d"},dot:{height:"0",width:"0",border:"5px solid #4d4d4d",borderRadius:"5px"}},dataColor:{fill:"#7DC1FF",stroke:"#3267D2",strokeWidth:1},cameraPosition:{horizontal:1,vertical:.5,distance:1.7},showLegend:void 0,backgroundColor:void 0,xBarWidth:void 0,yBarWidth:void 0,valueMin:void 0,valueMax:void 0,xMin:void 0,xMax:void 0,xStep:void 0,yMin:void 0,yMax:void 0,yStep:void 0,zMin:void 0,zMax:void 0,zStep:void 0},h(o.prototype),o.prototype._setScale=function(){this.scale=new l(1/this.xRange.range(),1/this.yRange.range(),1/this.zRange.range()),this.keepAspectRatio&&(this.scale.x0&&(r[n-1].pointNext=r[n]);return r},o.prototype.create=function(){for(;this.containerElement.hasChildNodes();)this.containerElement.removeChild(this.containerElement.firstChild);this.frame=document.createElement("div"),this.frame.style.position="relative",this.frame.style.overflow="hidden",this.frame.canvas=document.createElement("canvas"),this.frame.canvas.style.position="relative",this.frame.appendChild(this.frame.canvas);var t=document.createElement("DIV");t.style.color="red",t.style.fontWeight="bold",t.style.padding="10px",t.innerHTML="Error: your browser does not support HTML canvas",this.frame.canvas.appendChild(t),this.frame.filter=document.createElement("div"),this.frame.filter.style.position="absolute",this.frame.filter.style.bottom="0px",this.frame.filter.style.left="0px",this.frame.filter.style.width="100%",this.frame.appendChild(this.frame.filter);var e=this,i=function(t){e._onMouseDown(t)},o=function(t){e._onTouchStart(t)},n=function(t){e._onWheel(t)},s=function(t){e._onTooltip(t)},r=function(t){e._onClick(t)};d.addEventListener(this.frame.canvas,"mousedown",i),d.addEventListener(this.frame.canvas,"touchstart",o),d.addEventListener(this.frame.canvas,"mousewheel",n),d.addEventListener(this.frame.canvas,"mousemove",s),d.addEventListener(this.frame.canvas,"click",r),this.containerElement.appendChild(this.frame)},o.prototype._setSize=function(t,e){this.frame.style.width=t,this.frame.style.height=e,this._resizeCanvas()},o.prototype._resizeCanvas=function(){this.frame.canvas.style.width="100%",this.frame.canvas.style.height="100%",this.frame.canvas.width=this.frame.canvas.clientWidth,this.frame.canvas.height=this.frame.canvas.clientHeight,this.frame.filter.style.width=this.frame.canvas.clientWidth-20+"px"},o.prototype.animationStart=function(){if(this.animationAutoStart&&this.dataGroup.dataFilter){if(!this.frame.filter||!this.frame.filter.slider)throw new Error("No animation available");this.frame.filter.slider.play()}},o.prototype.animationStop=function(){this.frame.filter&&this.frame.filter.slider&&this.frame.filter.slider.stop()},o.prototype._resizeCenter=function(){"%"===this.xCenter.charAt(this.xCenter.length-1)?this.currentXCenter=parseFloat(this.xCenter)/100*this.frame.canvas.clientWidth:this.currentXCenter=parseFloat(this.xCenter),"%"===this.yCenter.charAt(this.yCenter.length-1)?this.currentYCenter=parseFloat(this.yCenter)/100*(this.frame.canvas.clientHeight-this.frame.filter.clientHeight):this.currentYCenter=parseFloat(this.yCenter)},o.prototype.getCameraPosition=function(){var t=this.camera.getArmRotation();return t.distance=this.camera.getArmLength(),t},o.prototype._readData=function(t){this.dataPoints=this.dataGroup.initializeData(this,t,this.style),this._initializeRanges(),this._redrawFilter()},o.prototype.setData=function(t){void 0!==t&&null!==t&&(this._readData(t),this.redraw(),this.animationStart())},o.prototype.setOptions=function(t){if(void 0!==t){!0===m.validate(t,b)&&console.log("%cErrors have been found in the supplied options object.",g),this.animationStop(),f.setOptions(t,this),this.setPointDrawingMethod(),this._setSize(this.width,this.height),this.setData(this.dataGroup.getDataTable()),this.animationStart()}},o.prototype.setPointDrawingMethod=function(){var t=void 0;switch(this.style){case o.STYLE.BAR:t=o.prototype._redrawBarGraphPoint;break;case o.STYLE.BARCOLOR:t=o.prototype._redrawBarColorGraphPoint;break;case o.STYLE.BARSIZE:t=o.prototype._redrawBarSizeGraphPoint;break;case o.STYLE.DOT:t=o.prototype._redrawDotGraphPoint;break;case o.STYLE.DOTLINE:t=o.prototype._redrawDotLineGraphPoint;break;case o.STYLE.DOTCOLOR:t=o.prototype._redrawDotColorGraphPoint;break;case o.STYLE.DOTSIZE:t=o.prototype._redrawDotSizeGraphPoint;break;case o.STYLE.SURFACE:t=o.prototype._redrawSurfaceGraphPoint;break;case o.STYLE.GRID:t=o.prototype._redrawGridGraphPoint;break;case o.STYLE.LINE:t=o.prototype._redrawLineGraphPoint;break;default:throw new Error("Can not determine point drawing method for graph style '"+this.style+"'")}this._pointDrawingMethod=t},o.prototype.redraw=function(){if(void 0===this.dataPoints)throw new Error("Graph data not initialized");this._resizeCanvas(),this._resizeCenter(),this._redrawSlider(),this._redrawClear(),this._redrawAxis(),this._redrawDataGraph(),this._redrawInfo(),this._redrawLegend()},o.prototype._getContext=function(){var t=this.frame.canvas,e=t.getContext("2d");return e.lineJoin="round",e.lineCap="round",e},o.prototype._redrawClear=function(){var t=this.frame.canvas;t.getContext("2d").clearRect(0,0,t.width,t.height)},o.prototype._dotSize=function(){return this.frame.clientWidth*this.dotSizeRatio},o.prototype._getLegendWidth=function(){var t;if(this.style===o.STYLE.DOTSIZE){t=this._dotSize()*this.dotSizeMaxFraction}else t=this.style===o.STYLE.BARSIZE?this.xBarWidth:20;return t},o.prototype._redrawLegend=function(){if(!0===this.showLegend&&this.style!==o.STYLE.LINE&&this.style!==o.STYLE.BARSIZE){var t=this.style===o.STYLE.BARSIZE||this.style===o.STYLE.DOTSIZE,e=this.style===o.STYLE.DOTSIZE||this.style===o.STYLE.DOTCOLOR||this.style===o.STYLE.BARCOLOR,i=Math.max(.25*this.frame.clientHeight,100),n=this.margin,s=this._getLegendWidth(),r=this.frame.clientWidth-this.margin,a=r-s,h=n+i,d=this._getContext();if(d.lineWidth=1,d.font="14px arial",!1===t){var l,c=i;for(l=0;l0?(t.textAlign="center",t.textBaseline="top",s.y+=n):Math.sin(2*o)<0?(t.textAlign="right",t.textBaseline="middle"):(t.textAlign="left",t.textBaseline="middle"),t.fillStyle=this.axisColor,t.fillText(i,s.x,s.y)},o.prototype.drawAxisLabelY=function(t,e,i,o,n){void 0===n&&(n=0);var s=this._convert3Dto2D(e);Math.cos(2*o)<0?(t.textAlign="center",t.textBaseline="top",s.y+=n):Math.sin(2*o)>0?(t.textAlign="right",t.textBaseline="middle"):(t.textAlign="left",t.textBaseline="middle"),t.fillStyle=this.axisColor,t.fillText(i,s.x,s.y)},o.prototype.drawAxisLabelZ=function(t,e,i,o){void 0===o&&(o=0);var n=this._convert3Dto2D(e);t.textAlign="right",t.textBaseline="middle",t.fillStyle=this.axisColor,t.fillText(i,n.x-o,n.y)},o.prototype._line3d=function(t,e,i,o){var n=this._convert3Dto2D(e),s=this._convert3Dto2D(i);this._line(t,n,s,o)},o.prototype._redrawAxis=function(){var t,e,i,o,n,s,r,a,h,d,c,f=this._getContext();f.font=24/this.camera.getArmLength()+"px arial";var m,v=.025/this.scale.x,g=.025/this.scale.y,y=5/this.camera.getArmLength(),b=this.camera.getArmRotation().horizontal,_=new u(Math.cos(b),Math.sin(b)),w=this.xRange,x=this.yRange,k=this.zRange;for(f.lineWidth=1,o=void 0===this.defaultXStep,i=new p(w.min,w.max,this.xStep,o),i.start(!0);!i.end();){var S=i.getCurrent();if(this.showGrid?(t=new l(S,x.min,k.min),e=new l(S,x.max,k.min),this._line3d(f,t,e,this.gridColor)):this.showXAxis&&(t=new l(S,x.min,k.min),e=new l(S,x.min+v,k.min),this._line3d(f,t,e,this.axisColor),t=new l(S,x.max,k.min),e=new l(S,x.max-v,k.min),this._line3d(f,t,e,this.axisColor)),this.showXAxis){r=_.x>0?x.min:x.max,m=new l(S,r,k.min);var D=" "+this.xValueLabel(S)+" ";this.drawAxisLabelX(f,m,D,b,y)}i.next()}for(f.lineWidth=1,o=void 0===this.defaultYStep,i=new p(x.min,x.max,this.yStep,o),i.start(!0);!i.end();){var M=i.getCurrent();if(this.showGrid?(t=new l(w.min,M,k.min),e=new l(w.max,M,k.min),this._line3d(f,t,e,this.gridColor)):this.showYAxis&&(t=new l(w.min,M,k.min),e=new l(w.min+g,M,k.min),this._line3d(f,t,e,this.axisColor),t=new l(w.max,M,k.min),e=new l(w.max-g,M,k.min),this._line3d(f,t,e,this.axisColor)),this.showYAxis){s=_.y>0?w.min:w.max,m=new l(s,M,k.min);var C=" "+this.yValueLabel(M)+" ";this.drawAxisLabelY(f,m,C,b,y)}i.next()}if(this.showZAxis){for(f.lineWidth=1,o=void 0===this.defaultZStep,i=new p(k.min,k.max,this.zStep,o),i.start(!0),s=_.x>0?w.min:w.max,r=_.y<0?x.min:x.max;!i.end();){var O=i.getCurrent(),E=new l(s,r,O),T=this._convert3Dto2D(E);e=new u(T.x-y,T.y),this._line(f,T,e,this.axisColor);var P=this.zValueLabel(O)+" ";this.drawAxisLabelZ(f,E,P,5),i.next()}f.lineWidth=1,t=new l(s,r,k.min),e=new l(s,r,k.max),this._line3d(f,t,e,this.axisColor)}if(this.showXAxis){var I,N;f.lineWidth=1,I=new l(w.min,x.min,k.min),N=new l(w.max,x.min,k.min),this._line3d(f,I,N,this.axisColor),I=new l(w.min,x.max,k.min),N=new l(w.max,x.max,k.min),this._line3d(f,I,N,this.axisColor)}this.showYAxis&&(f.lineWidth=1,t=new l(w.min,x.min,k.min),e=new l(w.min,x.max,k.min),this._line3d(f,t,e,this.axisColor),t=new l(w.max,x.min,k.min),e=new l(w.max,x.max,k.min),this._line3d(f,t,e,this.axisColor));var R=this.xLabel;R.length>0&&this.showXAxis&&(c=.1/this.scale.y,s=(w.max+3*w.min)/4,r=_.x>0?x.min-c:x.max+c,n=new l(s,r,k.min),this.drawAxisLabelX(f,n,R,b));var A=this.yLabel;A.length>0&&this.showYAxis&&(d=.1/this.scale.x,s=_.y>0?w.min-d:w.max+d,r=(x.max+3*x.min)/4,n=new l(s,r,k.min),this.drawAxisLabelY(f,n,A,b));var z=this.zLabel;z.length>0&&this.showZAxis&&(h=30,s=_.x>0?w.min:w.max,r=_.y<0?x.min:x.max,a=(k.max+3*k.min)/4,n=new l(s,r,a),this.drawAxisLabelZ(f,n,z,h))},o.prototype._hsv2rgb=function(t,e,i){var o,n,s,r,a,h;switch(r=i*e,a=Math.floor(t/60),h=r*(1-Math.abs(t/60%2-1)),a){case 0:o=r,n=h,s=0;break;case 1:o=h,n=r,s=0;break;case 2:o=0,n=r,s=h;break;case 3:o=0,n=h,s=r;break;case 4:o=h,n=0,s=r;break;case 5:o=r,n=0,s=h;break;default:o=0,n=0,s=0}return"RGB("+parseInt(255*o)+","+parseInt(255*n)+","+parseInt(255*s)+")"},o.prototype._getStrokeWidth=function(t){return void 0!==t?this.showPerspective?1/-t.trans.z*this.dataColor.strokeWidth:-this.eye.z/this.camera.getArmLength()*this.dataColor.strokeWidth:this.dataColor.strokeWidth},o.prototype._redrawBar=function(t,e,i,o,n,s){var r,a=this,h=e.point,d=this.zRange.min,u=[{point:new l(h.x-i,h.y-o,h.z)},{point:new l(h.x+i,h.y-o,h.z)},{point:new l(h.x+i,h.y+o,h.z)},{point:new l(h.x-i,h.y+o,h.z)}],c=[{point:new l(h.x-i,h.y-o,d)},{point:new l(h.x+i,h.y-o,d)},{point:new l(h.x+i,h.y+o,d)},{point:new l(h.x-i,h.y+o,d)}];u.forEach(function(t){t.screen=a._convert3Dto2D(t.point)}),c.forEach(function(t){t.screen=a._convert3Dto2D(t.point)});var p=[{corners:u,center:l.avg(c[0].point,c[2].point)},{corners:[u[0],u[1],c[1],c[0]],center:l.avg(c[1].point,c[0].point)},{corners:[u[1],u[2],c[2],c[1]],center:l.avg(c[2].point,c[1].point)},{corners:[u[2],u[3],c[3],c[2]],center:l.avg(c[3].point,c[2].point)},{corners:[u[3],u[0],c[0],c[3]],center:l.avg(c[0].point,c[3].point)}];e.surfaces=p;for(var f=0;f0}if(a){var p,f=(e.point.z+i.point.z+o.point.z+n.point.z)/4,m=240*(1-(f-this.zRange.min)*this.scale.z/this.verticalRatio);this.showShadow?(p=Math.min(1+u.x/c/2,1),s=this._hsv2rgb(m,1,p),r=s):(p=1,s=this._hsv2rgb(m,1,p),r=this.axisColor)}else s="gray",r=this.axisColor;t.lineWidth=this._getStrokeWidth(e);var v=[e,i,n,o];this._polygon(t,v,s,r)}},o.prototype._drawGridLine=function(t,e,i){if(void 0!==e&&void 0!==i){var o=(e.point.z+i.point.z)/2,n=240*(1-(o-this.zRange.min)*this.scale.z/this.verticalRatio);t.lineWidth=2*this._getStrokeWidth(e),t.strokeStyle=this._hsv2rgb(n,1,1),this._line(t,e.screen,i.screen)}},o.prototype._redrawGridGraphPoint=function(t,e){this._drawGridLine(t,e,e.pointRight),this._drawGridLine(t,e,e.pointTop)},o.prototype._redrawLineGraphPoint=function(t,e){void 0!==e.pointNext&&(t.lineWidth=this._getStrokeWidth(e),t.strokeStyle=this.dataColor.stroke,this._line(t,e.screen,e.pointNext.screen))},o.prototype._redrawDataGraph=function(){var t,e=this._getContext();if(!(void 0===this.dataPoints||this.dataPoints.length<=0))for(this._calcTranslations(this.dataPoints),t=0;t0?1:t<0?-1:0}var o=e[0],n=e[1],s=e[2],r=i((n.x-o.x)*(t.y-o.y)-(n.y-o.y)*(t.x-o.x)),a=i((s.x-n.x)*(t.y-n.y)-(s.y-n.y)*(t.x-n.x)),h=i((o.x-s.x)*(t.y-s.y)-(o.y-s.y)*(t.x-s.x));return!(0!=r&&0!=a&&r!=a||0!=a&&0!=h&&a!=h||0!=r&&0!=h&&r!=h)},o.prototype._dataPointFromXY=function(t,e){var i,n=null,s=null,r=null,a=new u(t,e);if(this.style===o.STYLE.BAR||this.style===o.STYLE.BARCOLOR||this.style===o.STYLE.BARSIZE)for(i=this.dataPoints.length-1;i>=0;i--){n=this.dataPoints[i];var h=n.surfaces;if(h)for(var d=h.length-1;d>=0;d--){var l=h[d],c=l.corners,p=[c[0].screen,c[1].screen,c[2].screen],f=[c[2].screen,c[3].screen,c[0].screen];if(this._insideTriangle(a,p)||this._insideTriangle(a,f))return n}}else for(i=0;i"+this.xLabel+":"+t.point.x+""+this.yLabel+":"+t.point.y+""+this.zLabel+":"+t.point.z+"",e.style.left="0",e.style.top="0",this.frame.appendChild(e),this.frame.appendChild(i),this.frame.appendChild(o);var n=e.offsetWidth,s=e.offsetHeight,r=i.offsetHeight,h=o.offsetWidth,d=o.offsetHeight,l=t.screen.x-n/2;l=Math.min(Math.max(l,10),this.frame.clientWidth-10-n),i.style.left=t.screen.x+"px",i.style.top=t.screen.y-r+"px",e.style.left=l+"px",e.style.top=t.screen.y-r-s+"px",o.style.left=t.screen.x-h/2+"px",o.style.top=t.screen.y-d/2+"px"},o.prototype._hideTooltip=function(){if(this.tooltip){this.tooltip.dataPoint=null;for(var t in this.tooltip.dom)if(this.tooltip.dom.hasOwnProperty(t)){var e=this.tooltip.dom[t];e&&e.parentNode&&e.parentNode.removeChild(e)}}},o.prototype.setCameraPosition=function(t){f.setCameraPosition(t,this),this.redraw()},o.prototype.setSize=function(t,e){this._setSize(t,e),this.redraw()},t.exports=o},function(t,e,i){i(163),t.exports=i(7).Object.assign},function(t,e,i){var o=i(17);o(o.S+o.F,"Object",{assign:i(164)})},function(t,e,i){var o=i(33),n=i(63),s=i(42),r=i(41),a=i(78),h=Object.assign;t.exports=!h||i(28)(function(){var t={},e={},i=Symbol(),o="abcdefghijklmnopqrst";return t[i]=7,o.split("").forEach(function(t){e[t]=t}),7!=h({},t)[i]||Object.keys(h({},e)).join("")!=o})?function(t,e){for(var i=r(t),h=arguments.length,d=1,l=n.f,u=s.f;h>d;)for(var c,p=a(arguments[d++]),f=l?o(p).concat(l(p)):o(p),m=f.length,v=0;m>v;)u.call(p,c=f[v++])&&(i[c]=p[c]);return i}:h},function(t,e,i){t.exports={default:i(166),__esModule:!0}},function(t,e,i){i(167),t.exports=i(7).Math.sign},function(t,e,i){var o=i(17);o(o.S,"Math",{sign:i(168)})},function(t,e){t.exports=Math.sign||function(t){return 0==(t=+t)||t!=t?t:t<0?-1:1}},function(t,e,i){t.exports={default:i(170),__esModule:!0}},function(t,e,i){i(171);var o=i(7).Object;t.exports=function(t,e,i){return o.defineProperty(t,e,i)}},function(t,e,i){var o=i(17);o(o.S+o.F*!i(21),"Object",{defineProperty:i(20).f})},function(t,e,i){Object.defineProperty(e,"__esModule",{value:!0});var o="string",n="boolean",s="number",r={fill:{string:o},stroke:{string:o},strokeWidth:{number:s},__type__:{string:o,object:"object",undefined:"undefined"}},a={animationAutoStart:{boolean:n,undefined:"undefined"},animationInterval:{number:s},animationPreload:{boolean:n},axisColor:{string:o},backgroundColor:r,xBarWidth:{number:s,undefined:"undefined"},yBarWidth:{number:s,undefined:"undefined"},cameraPosition:{distance:{number:s},horizontal:{number:s},vertical:{number:s},__type__:{object:"object"}},xCenter:{string:o},yCenter:{string:o},dataColor:r,dotSizeMinFraction:{number:s},dotSizeMaxFraction:{number:s},dotSizeRatio:{number:s},filterLabel:{string:o},gridColor:{string:o},onclick:{function:"function"},keepAspectRatio:{boolean:n},xLabel:{string:o},yLabel:{string:o},zLabel:{string:o},legendLabel:{string:o},xMin:{number:s,undefined:"undefined"},yMin:{number:s,undefined:"undefined"},zMin:{number:s,undefined:"undefined"},xMax:{number:s,undefined:"undefined"},yMax:{number:s,undefined:"undefined"},zMax:{number:s,undefined:"undefined"},showAnimationControls:{boolean:n,undefined:"undefined"},showGrid:{boolean:n},showLegend:{boolean:n,undefined:"undefined"},showPerspective:{boolean:n},showShadow:{boolean:n},showXAxis:{boolean:n},showYAxis:{boolean:n},showZAxis:{boolean:n},xStep:{number:s,undefined:"undefined"},yStep:{number:s,undefined:"undefined"},zStep:{number:s,undefined:"undefined"},style:{number:s,string:["bar","bar-color","bar-size","dot","dot-line","dot-color","dot-size","line","grid","surface"]},tooltip:{boolean:n,function:"function"},tooltipStyle:{content:{color:{string:o},background:{string:o},border:{string:o},borderRadius:{string:o},boxShadow:{string:o},padding:{string:o},__type__:{object:"object"}},line:{borderLeft:{string:o},height:{string:o},width:{string:o},__type__:{object:"object"}},dot:{border:{string:o},borderRadius:{string:o},height:{string:o},width:{string:o},__type__:{object:"object"}},__type__:{object:"object"}},xValueLabel:{function:"function"},yValueLabel:{function:"function"},zValueLabel:{function:"function"},valueMax:{number:s,undefined:"undefined"},valueMin:{number:s,undefined:"undefined"},verticalRatio:{number:s},height:{string:o},width:{string:o},__type__:{object:"object"}};e.allOptions=a},function(t,e,i){function o(){this.dataTable=null}var n=i(11),s=i(12),r=i(174),a=i(96),h=i(94),d=i(34);o.prototype.initializeData=function(t,e,i){if(void 0!==e){Array.isArray(e)&&(e=new n(e));var o;if(!(e instanceof n||e instanceof s))throw new Error("Array, DataSet, or DataView expected");if(o=e.get(),0!=o.length){this.style=i,this.dataSet&&this.dataSet.off("*",this._onChange),this.dataSet=e,this.dataTable=o;var r=this;this._onChange=function(){t.setData(r.dataSet)},this.dataSet.on("*",this._onChange),this.colX="x",this.colY="y",this.colZ="z";var h=t.hasBars(i);if(h&&(void 0!==t.defaultXBarWidth?this.xBarWidth=t.defaultXBarWidth:this.xBarWidth=this.getSmallestDifference(o,this.colX)||1,void 0!==t.defaultYBarWidth?this.yBarWidth=t.defaultYBarWidth:this.yBarWidth=this.getSmallestDifference(o,this.colY)||1),this._initializeRange(o,this.colX,t,h),this._initializeRange(o,this.colY,t,h),this._initializeRange(o,this.colZ,t,!1),o[0].hasOwnProperty("style")){this.colValue="style";var d=this.getColumnRange(o,this.colValue);this._setRangeDefaults(d,t.defaultValueMin,t.defaultValueMax),this.valueRange=d}this.getDataTable()[0].hasOwnProperty("filter")&&void 0===this.dataFilter&&(this.dataFilter=new a(this,"filter",t),this.dataFilter.setOnLoadCallback(function(){t.redraw()}));return this.dataFilter?this.dataFilter._getDataPoints():this._getDataPoints(this.getDataTable())}}},o.prototype._collectRangeSettings=function(t,e){if(-1==["x","y","z"].indexOf(t))throw new Error("Column '"+t+"' invalid");var i=t.toUpperCase();return{barWidth:this[t+"BarWidth"],min:e["default"+i+"Min"],max:e["default"+i+"Max"],step:e["default"+i+"Step"],range_label:t+"Range",step_label:t+"Step"}},o.prototype._initializeRange=function(t,e,i,o){var n=this._collectRangeSettings(e,i),s=this.getColumnRange(t,e);o&&"z"!=e&&s.expand(n.barWidth/2),this._setRangeDefaults(s,n.min,n.max),this[n.range_label]=s,this[n.step_label]=void 0!==n.step?n.step:s.range()/5},o.prototype.getDistinctValues=function(t,e){void 0===e&&(e=this.dataTable);for(var i=[],o=0;os)&&(o=s)}return o},o.prototype.getColumnRange=function(t,e){for(var i=new r,o=0;o0&&(e[i-1].pointNext=e[i]);return e},o.prototype._checkValueField=function(t){if(this.style===h.STYLE.BARCOLOR||this.style===h.STYLE.BARSIZE||this.style===h.STYLE.DOTCOLOR||this.style===h.STYLE.DOTSIZE){if(void 0===this.colValue)throw new Error("Expected data to have field 'style' for graph style '"+this.style+"'");if(void 0===t[0][this.colValue])throw new Error("Expected data to have field '"+this.colValue+"' for graph style '"+this.style+"'")}},t.exports=o},function(t,e,i){function o(){this.min=void 0,this.max=void 0}o.prototype.adjust=function(t){void 0!==t&&((void 0===this.min||this.min>t)&&(this.min=t),(void 0===this.max||this.maxi)throw new Error("Passed expansion value makes range invalid");this.min=e,this.max=i}},o.prototype.range=function(){return this.max-this.min},o.prototype.center=function(){return(this.min+this.max)/2},t.exports=o},function(t,e,i){var o,n,s;!function(i){n=[],o=i,void 0!==(s="function"==typeof o?o.apply(e,n):o)&&(t.exports=s)}(function(){var t=null;return function e(i,o){function n(t){return t.match(/[^ ]+/g)}function s(e){if("hammer.input"!==e.type){if(e.srcEvent._handled||(e.srcEvent._handled={}),e.srcEvent._handled[e.type])return;e.srcEvent._handled[e.type]=!0}var i=!1;e.stopPropagation=function(){i=!0};var o=e.srcEvent.stopPropagation.bind(e.srcEvent);"function"==typeof o&&(e.srcEvent.stopPropagation=function(){o(),e.stopPropagation()}),e.firstTarget=t;for(var n=t;n&&!i;){var s=n.hammer;if(s)for(var r,a=0;a0?d._handlers[t]=o:(i.off(t,s),delete d._handlers[t]))}),d},d.emit=function(e,o){t=o.target,i.emit(e,o)},d.destroy=function(){var t=i.element.hammer,e=t.indexOf(d);-1!==e&&t.splice(e,1),t.length||delete i.element.hammer,d._handlers={},i.destroy()},d}})},function(t,e,i){var o;!function(n,s,r,a){function h(t,e,i){return setTimeout(p(t,i),e)}function d(t,e,i){return!!Array.isArray(t)&&(l(t,i[e],i),!0)}function l(t,e,i){var o;if(t)if(t.forEach)t.forEach(e,i);else if(t.length!==a)for(o=0;o\s*\(/gm,"{anonymous}()@"):"Unknown Stack Trace",s=n.console&&(n.console.warn||n.console.log);return s&&s.call(n.console,o,i),t.apply(this,arguments)}}function c(t,e,i){var o,n=e.prototype;o=t.prototype=Object.create(n),o.constructor=t,o._super=n,i&&ft(o,i)}function p(t,e){return function(){return t.apply(e,arguments)}}function f(t,e){return typeof t==gt?t.apply(e?e[0]||a:a,e):t}function m(t,e){return t===a?e:t}function v(t,e,i){l(_(e),function(e){t.addEventListener(e,i,!1)})}function g(t,e,i){l(_(e),function(e){t.removeEventListener(e,i,!1)})}function y(t,e){for(;t;){if(t==e)return!0;t=t.parentNode}return!1}function b(t,e){return t.indexOf(e)>-1}function _(t){return t.trim().split(/\s+/g)}function w(t,e,i){if(t.indexOf&&!i)return t.indexOf(e);for(var o=0;oi[e]}):o.sort()),o}function S(t,e){for(var i,o,n=e[0].toUpperCase()+e.slice(1),s=0;s1&&!i.firstMultiple?i.firstMultiple=N(e):1===n&&(i.firstMultiple=!1);var s=i.firstInput,r=i.firstMultiple,a=r?r.center:s.center,h=e.center=R(o);e.timeStamp=_t(),e.deltaTime=e.timeStamp-s.timeStamp,e.angle=F(a,h),e.distance=L(a,h),P(i,e),e.offsetDirection=z(e.deltaX,e.deltaY);var d=A(e.deltaTime,e.deltaX,e.deltaY);e.overallVelocityX=d.x,e.overallVelocityY=d.y,e.overallVelocity=bt(d.x)>bt(d.y)?d.x:d.y,e.scale=r?j(r.pointers,o):1,e.rotation=r?B(r.pointers,o):0,e.maxPointers=i.prevInput?e.pointers.length>i.prevInput.maxPointers?e.pointers.length:i.prevInput.maxPointers:e.pointers.length,I(i,e);var l=t.element;y(e.srcEvent.target,l)&&(l=e.srcEvent.target),e.target=l}function P(t,e){var i=e.center,o=t.offsetDelta||{},n=t.prevDelta||{},s=t.prevInput||{};e.eventType!==Et&&s.eventType!==Pt||(n=t.prevDelta={x:s.deltaX||0,y:s.deltaY||0},o=t.offsetDelta={x:i.x,y:i.y}),e.deltaX=n.x+(i.x-o.x),e.deltaY=n.y+(i.y-o.y)}function I(t,e){var i,o,n,s,r=t.lastInterval||e,h=e.timeStamp-r.timeStamp;if(e.eventType!=It&&(h>Ot||r.velocity===a)){var d=e.deltaX-r.deltaX,l=e.deltaY-r.deltaY,u=A(h,d,l);o=u.x,n=u.y,i=bt(u.x)>bt(u.y)?u.x:u.y,s=z(d,l),t.lastInterval=e}else i=r.velocity,o=r.velocityX,n=r.velocityY,s=r.direction;e.velocity=i,e.velocityX=o,e.velocityY=n,e.direction=s}function N(t){for(var e=[],i=0;i=bt(e)?t<0?Rt:At:e<0?zt:Lt}function L(t,e,i){i||(i=Ht);var o=e[i[0]]-t[i[0]],n=e[i[1]]-t[i[1]];return Math.sqrt(o*o+n*n)}function F(t,e,i){i||(i=Ht);var o=e[i[0]]-t[i[0]],n=e[i[1]]-t[i[1]];return 180*Math.atan2(n,o)/Math.PI}function B(t,e){return F(e[1],e[0],Wt)+F(t[1],t[0],Wt)}function j(t,e){return L(e[0],e[1],Wt)/L(t[0],t[1],Wt)}function H(){this.evEl=Gt,this.evWin=Vt,this.pressed=!1,C.apply(this,arguments)}function W(){this.evEl=Xt,this.evWin=Zt,C.apply(this,arguments),this.store=this.manager.session.pointerEvents=[]}function Y(){this.evTarget=Jt,this.evWin=$t,this.started=!1,C.apply(this,arguments)}function G(t,e){var i=x(t.touches),o=x(t.changedTouches);return e&(Pt|It)&&(i=k(i.concat(o),"identifier",!0)),[i,o]}function V(){this.evTarget=te,this.targetIds={},C.apply(this,arguments)}function U(t,e){var i=x(t.touches),o=this.targetIds;if(e&(Et|Tt)&&1===i.length)return o[i[0].identifier]=!0,[i,i];var n,s,r=x(t.changedTouches),a=[],h=this.target;if(s=i.filter(function(t){return y(t.target,h)}),e===Et)for(n=0;n-1&&o.splice(t,1)};setTimeout(n,ee)}}function K(t){for(var e=t.srcEvent.clientX,i=t.srcEvent.clientY,o=0;o-1&&this.requireFail.splice(e,1),this},hasRequireFailures:function(){return this.requireFail.length>0},canRecognizeWith:function(t){return!!this.simultaneous[t.id]},emit:function(t){function e(e){i.manager.emit(e,t)}var i=this,o=this.state;o=fe&&e(i.options.event+tt(o))},tryEmit:function(t){if(this.canEmit())return this.emit(t);this.state=32},canEmit:function(){for(var t=0;te.threshold&&n&e.direction},attrTest:function(t){return ot.prototype.attrTest.call(this,t)&&(this.state&ce||!(this.state&ce)&&this.directionTest(t))},emit:function(t){this.pX=t.deltaX,this.pY=t.deltaY;var e=et(t.direction);e&&(t.additionalEvent=this.options.event+e),this._super.emit.call(this,t)}}),c(st,ot,{defaults:{event:"pinch",threshold:0,pointers:2},getTouchAction:function(){return[ae]},attrTest:function(t){return this._super.attrTest.call(this,t)&&(Math.abs(t.scale-1)>this.options.threshold||this.state&ce)},emit:function(t){if(1!==t.scale){var e=t.scale<1?"in":"out";t.additionalEvent=this.options.event+e}this._super.emit.call(this,t)}}),c(rt,Q,{defaults:{event:"press",pointers:1,time:251,threshold:9},getTouchAction:function(){return[se]},process:function(t){var e=this.options,i=t.pointers.length===e.pointers,o=t.distancee.time;if(this._input=t,!o||!i||t.eventType&(Pt|It)&&!n)this.reset();else if(t.eventType&Et)this.reset(),this._timer=h(function(){this.state=me,this.tryEmit()},e.time,this);else if(t.eventType&Pt)return me;return 32},reset:function(){clearTimeout(this._timer)},emit:function(t){this.state===me&&(t&&t.eventType&Pt?this.manager.emit(this.options.event+"up",t):(this._input.timeStamp=_t(),this.manager.emit(this.options.event,this._input)))}}),c(at,ot,{defaults:{event:"rotate",threshold:0,pointers:2},getTouchAction:function(){return[ae]},attrTest:function(t){return this._super.attrTest.call(this,t)&&(Math.abs(t.rotation)>this.options.threshold||this.state&ce)}}),c(ht,ot,{defaults:{event:"swipe",threshold:10,velocity:.3,direction:Ft|Bt,pointers:1},getTouchAction:function(){return nt.prototype.getTouchAction.call(this)},attrTest:function(t){var e,i=this.options.direction;return i&(Ft|Bt)?e=t.overallVelocity:i&Ft?e=t.overallVelocityX:i&Bt&&(e=t.overallVelocityY),this._super.attrTest.call(this,t)&&i&t.offsetDirection&&t.distance>this.options.threshold&&t.maxPointers==this.options.pointers&&bt(e)>this.options.velocity&&t.eventType&Pt},emit:function(t){var e=et(t.offsetDirection);e&&this.manager.emit(this.options.event+e,t),this.manager.emit(this.options.event,t)}}),c(dt,Q,{defaults:{event:"tap",pointers:1,taps:1,interval:300,time:250,threshold:9,posThreshold:10},getTouchAction:function(){return[re]},process:function(t){var e=this.options,i=t.pointers.length===e.pointers,o=t.distanced+i?s+=h()+u-i+t.itemSet.options.margin.item.vertical:r=!1,s=Math.min(s,o-i),{shouldScroll:r,scrollOffset:s,itemTop:l}}var a=i(9),h=i(2),d=i(11),l=i(12),u=i(64),c=i(65),p=i(45),f=i(67),m=i(46),v=i(99),g=i(15).printStyle,y=i(105).allOptions,b=i(105).configureOptions,_=i(71).default,w=i(15).default;o.prototype=new c,o.prototype._createConfigurator=function(){return new _(this,this.dom.container,b)},o.prototype.redraw=function(){this.itemSet&&this.itemSet.markDirty({refreshItems:!0}),this._redraw()},o.prototype.setOptions=function(t){if(!0===w.validate(t,y)&&console.log("%cErrors have been found in the supplied options object.",g),c.prototype.setOptions.call(this,t),"type"in t&&t.type!==this.options.type){this.options.type=t.type;var e=this.itemsData;if(e){var i=this.getSelection();this.setItems(null),this.setItems(e),this.setSelection(i)}}},o.prototype.setItems=function(t){var e;e=t?t instanceof d||t instanceof l?t:new d(t,{type:{start:"Date",end:"Date"}}):null,this.itemsData=e,this.itemSet&&this.itemSet.setItems(e)},o.prototype.setGroups=function(t){var e;if(t){var i=function(t){return!1!==t.visible};e=t instanceof d||t instanceof l?new l(t,{filter:i}):new d(t.filter(i))}else e=null;this.groupsData=e,this.itemSet.setGroups(e)},o.prototype.setData=function(t){t&&t.groups&&this.setGroups(t.groups),t&&t.items&&this.setItems(t.items)},o.prototype.setSelection=function(t,e){this.itemSet&&this.itemSet.setSelection(t),e&&e.focus&&this.focus(t,e)},o.prototype.getSelection=function(){return this.itemSet&&this.itemSet.getSelection()||[]},o.prototype.focus=function(t,e){if(this.itemsData&&void 0!=t){var i=Array.isArray(t)?t:[t],o=this.itemsData.getDataSet().get(i,{type:{start:"Date",end:"Date"}}),n=null,s=null;if(o.forEach(function(t){var e=t.start.valueOf(),i="end"in t?t.end.valueOf():t.start.valueOf();(null===n||es)&&(s=i)}),null!==n&&null!==s){var a=this,h=this.itemSet.items[i[0]],d=-1*this._getScrollTop(),l=null,u=function(t,e,i){var o=r(a,h);if(l||(l=o),l.itemTop!=o.itemTop||l.shouldScroll){l.itemTop!=o.itemTop&&o.shouldScroll&&(l=o,d=-1*a._getScrollTop());var n=d,s=l.scrollOffset,u=i?s:n+(s-n)*t;a._setScrollTop(-u),e||a._redraw()}},c=function(){var t=r(a,h);t.shouldScroll&&t.itemTop!=l.itemTop&&(a._setScrollTop(-t.scrollOffset),a._redraw())},p=function(){c(),setTimeout(c,100)},f=(n+s)/2,m=Math.max(this.range.end-this.range.start,1.1*(s-n)),v=!e||void 0===e.animation||e.animation;v||(l={shouldScroll:!1,scrollOffset:-1,itemTop:-1}),this.range.setRange(f-m/2,f+m/2,{animation:v},p,u)}}},o.prototype.fit=function(t,e){var i,o=!t||void 0===t.animation||t.animation,n=this.itemsData&&this.itemsData.getDataSet();1===n.length&&void 0===n.get()[0].end?(i=this.getDataRange(),this.moveTo(i.min.valueOf(),{animation:o},e)):(i=this.getItemRange(),this.range.setRange(i.min,i.max,{animation:o},e))},o.prototype.getItemRange=function(){var t=this.getDataRange(),e=null!==t.min?t.min.valueOf():null,i=null!==t.max?t.max.valueOf():null,o=null,r=null;if(null!=e&&null!=i){var a=i-e;a<=0&&(a=10);var d=a/this.props.center.width,l={},u=0;h.forEach(this.itemSet.items,function(t,e){if(t.groupShowing){l[e]=t.redraw(!0),u=l[e].length}});if(u>0)for(var c=0;ci&&(i=h,r=t)}.bind(this)),o&&r){var p=o.getWidthLeft()+10,f=r.getWidthRight()+10,m=this.props.center.width-p-f;m>0&&(this.options.rtl?(e=n(o)-f*a/m,i=s(r)+p*a/m):(e=n(o)-p*a/m,i=s(r)+f*a/m))}}return{min:null!=e?new Date(e):null,max:null!=i?new Date(i):null}},o.prototype.getDataRange=function(){var t=null,e=null,i=this.itemsData&&this.itemsData.getDataSet();return i&&i.forEach(function(i){var o=h.convert(i.start,"Date").valueOf(),n=h.convert(void 0!=i.end?i.end:i.start,"Date").valueOf();(null===t||oe)&&(e=n)}),{min:null!=t?new Date(t):null,max:null!=e?new Date(e):null}},o.prototype.getEventProperties=function(t){var e,i=t.center?t.center.x:t.clientX,o=t.center?t.center.y:t.clientY;e=this.options.rtl?h.getAbsoluteRight(this.dom.centerContainer)-i:i-h.getAbsoluteLeft(this.dom.centerContainer);var n=o-h.getAbsoluteTop(this.dom.centerContainer),s=this.itemSet.itemFromTarget(t),r=this.itemSet.groupFromTarget(t),a=m.customTimeFromTarget(t),d=this.itemSet.options.snap||null,l=this.body.util.getScale(),u=this.body.util.getStep(),c=this._toTime(e),p=d?d(c,l,u):c,f=h.getTarget(t),v=null;return null!=s?v="item":null!=a?v="custom-time":h.hasParent(f,this.timeAxis.dom.foreground)?v="axis":this.timeAxis2&&h.hasParent(f,this.timeAxis2.dom.foreground)?v="axis":h.hasParent(f,this.itemSet.dom.labelSet)?v="group-label":h.hasParent(f,this.currentTime.bar)?v="current-time":h.hasParent(f,this.dom.center)&&(v="background"),{event:t,item:s?s.id:null,group:r?r.groupId:null,what:v,pageX:t.srcEvent?t.srcEvent.pageX:t.pageX,pageY:t.srcEvent?t.srcEvent.pageY:t.pageY,x:e,y:n,time:c,snappedTime:p}},o.prototype.toggleRollingMode=function(){this.range.rolling?this.range.stopRolling():(void 0==this.options.rollingMode&&this.setOptions(this.options),this.range.startRolling())},t.exports=o},function(t,e,i){function o(t){return t&&t.__esModule?t:{default:t}}Object.defineProperty(e,"__esModule",{value:!0});var n=i(19),s=o(n),r=i(0),a=o(r),h=i(1),d=o(h),l=i(10),u=i(37),c=i(2),p=function(){function t(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:1;(0,a.default)(this,t),this.pixelRatio=e,this.generated=!1,this.centerCoordinates={x:144.5,y:144.5},this.r=289*.49,this.color={r:255,g:255,b:255,a:1},this.hueCircle=void 0,this.initialColor={r:255,g:255,b:255,a:1},this.previousColor=void 0,this.applied=!1,this.updateCallback=function(){},this.closeCallback=function(){},this._create()}return(0,d.default)(t,[{key:"insertTo",value:function(t){void 0!==this.hammer&&(this.hammer.destroy(),this.hammer=void 0),this.container=t,this.container.appendChild(this.frame),this._bindHammer(),this._setSize()}},{key:"setUpdateCallback",value:function(t){if("function"!=typeof t)throw new Error("Function attempted to set as colorPicker update callback is not a function.");this.updateCallback=t}},{key:"setCloseCallback",value:function(t){if("function"!=typeof t)throw new Error("Function attempted to set as colorPicker closing callback is not a function.");this.closeCallback=t}},{key:"_isColorString",value:function(t){var e={black:"#000000",navy:"#000080",darkblue:"#00008B",mediumblue:"#0000CD",blue:"#0000FF",darkgreen:"#006400",green:"#008000",teal:"#008080",darkcyan:"#008B8B",deepskyblue:"#00BFFF",darkturquoise:"#00CED1",mediumspringgreen:"#00FA9A",lime:"#00FF00",springgreen:"#00FF7F",aqua:"#00FFFF",cyan:"#00FFFF",midnightblue:"#191970",dodgerblue:"#1E90FF",lightseagreen:"#20B2AA",forestgreen:"#228B22",seagreen:"#2E8B57",darkslategray:"#2F4F4F",limegreen:"#32CD32",mediumseagreen:"#3CB371",turquoise:"#40E0D0",royalblue:"#4169E1",steelblue:"#4682B4",darkslateblue:"#483D8B",mediumturquoise:"#48D1CC",indigo:"#4B0082",darkolivegreen:"#556B2F",cadetblue:"#5F9EA0",cornflowerblue:"#6495ED",mediumaquamarine:"#66CDAA",dimgray:"#696969",slateblue:"#6A5ACD",olivedrab:"#6B8E23",slategray:"#708090",lightslategray:"#778899",mediumslateblue:"#7B68EE",lawngreen:"#7CFC00",chartreuse:"#7FFF00",aquamarine:"#7FFFD4",maroon:"#800000",purple:"#800080",olive:"#808000",gray:"#808080",skyblue:"#87CEEB",lightskyblue:"#87CEFA",blueviolet:"#8A2BE2",darkred:"#8B0000",darkmagenta:"#8B008B",saddlebrown:"#8B4513",darkseagreen:"#8FBC8F",lightgreen:"#90EE90",mediumpurple:"#9370D8",darkviolet:"#9400D3",palegreen:"#98FB98",darkorchid:"#9932CC",yellowgreen:"#9ACD32",sienna:"#A0522D",brown:"#A52A2A",darkgray:"#A9A9A9",lightblue:"#ADD8E6",greenyellow:"#ADFF2F",paleturquoise:"#AFEEEE",lightsteelblue:"#B0C4DE",powderblue:"#B0E0E6",firebrick:"#B22222",darkgoldenrod:"#B8860B",mediumorchid:"#BA55D3",rosybrown:"#BC8F8F",darkkhaki:"#BDB76B",silver:"#C0C0C0",mediumvioletred:"#C71585",indianred:"#CD5C5C",peru:"#CD853F",chocolate:"#D2691E",tan:"#D2B48C",lightgrey:"#D3D3D3",palevioletred:"#D87093",thistle:"#D8BFD8",orchid:"#DA70D6",goldenrod:"#DAA520",crimson:"#DC143C",gainsboro:"#DCDCDC",plum:"#DDA0DD",burlywood:"#DEB887",lightcyan:"#E0FFFF",lavender:"#E6E6FA",darksalmon:"#E9967A",violet:"#EE82EE",palegoldenrod:"#EEE8AA",lightcoral:"#F08080",khaki:"#F0E68C",aliceblue:"#F0F8FF",honeydew:"#F0FFF0",azure:"#F0FFFF",sandybrown:"#F4A460",wheat:"#F5DEB3",beige:"#F5F5DC",whitesmoke:"#F5F5F5",mintcream:"#F5FFFA",ghostwhite:"#F8F8FF",salmon:"#FA8072",antiquewhite:"#FAEBD7",linen:"#FAF0E6",lightgoldenrodyellow:"#FAFAD2",oldlace:"#FDF5E6",red:"#FF0000",fuchsia:"#FF00FF",magenta:"#FF00FF",deeppink:"#FF1493",orangered:"#FF4500",tomato:"#FF6347",hotpink:"#FF69B4",coral:"#FF7F50",darkorange:"#FF8C00",lightsalmon:"#FFA07A",orange:"#FFA500",lightpink:"#FFB6C1",pink:"#FFC0CB",gold:"#FFD700",peachpuff:"#FFDAB9",navajowhite:"#FFDEAD",moccasin:"#FFE4B5",bisque:"#FFE4C4",mistyrose:"#FFE4E1",blanchedalmond:"#FFEBCD",papayawhip:"#FFEFD5",lavenderblush:"#FFF0F5",seashell:"#FFF5EE",cornsilk:"#FFF8DC",lemonchiffon:"#FFFACD",floralwhite:"#FFFAF0",snow:"#FFFAFA",yellow:"#FFFF00",lightyellow:"#FFFFE0",ivory:"#FFFFF0",white:"#FFFFFF"};if("string"==typeof t)return e[t]}},{key:"setColor",value:function(t){var e=!(arguments.length>1&&void 0!==arguments[1])||arguments[1];if("none"!==t){var i=void 0,o=this._isColorString(t);if(void 0!==o&&(t=o),!0===c.isString(t)){if(!0===c.isValidRGB(t)){var n=t.substr(4).substr(0,t.length-5).split(",");i={r:n[0],g:n[1],b:n[2],a:1}}else if(!0===c.isValidRGBA(t)){var r=t.substr(5).substr(0,t.length-6).split(",");i={r:r[0],g:r[1],b:r[2],a:r[3]}}else if(!0===c.isValidHex(t)){var a=c.hexToRGB(t);i={r:a.r,g:a.g,b:a.b,a:1}}}else if(t instanceof Object&&void 0!==t.r&&void 0!==t.g&&void 0!==t.b){var h=void 0!==t.a?t.a:"1.0";i={r:t.r,g:t.g,b:t.b,a:h}}if(void 0===i)throw new Error("Unknown color passed to the colorPicker. Supported are strings: rgb, hex, rgba. Object: rgb ({r:r,g:g,b:b,[a:a]}). Supplied: "+(0,s.default)(t));this._setColor(i,e)}}},{key:"show",value:function(){void 0!==this.closeCallback&&(this.closeCallback(),this.closeCallback=void 0),this.applied=!1,this.frame.style.display="block",this._generateHueCircle()}},{key:"_hide",value:function(){var t=this;!0===(!(arguments.length>0&&void 0!==arguments[0])||arguments[0])&&(this.previousColor=c.extend({},this.color)),!0===this.applied&&this.updateCallback(this.initialColor),this.frame.style.display="none",setTimeout(function(){void 0!==t.closeCallback&&(t.closeCallback(),t.closeCallback=void 0)},0)}},{key:"_save",value:function(){this.updateCallback(this.color),this.applied=!1,this._hide()}},{key:"_apply",value:function(){this.applied=!0,this.updateCallback(this.color),this._updatePicker(this.color)}},{key:"_loadLast",value:function(){void 0!==this.previousColor?this.setColor(this.previousColor,!1):alert("There is no last color to load...")}},{key:"_setColor",value:function(t){!0===(!(arguments.length>1&&void 0!==arguments[1])||arguments[1])&&(this.initialColor=c.extend({},t)),this.color=t;var e=c.RGBToHSV(t.r,t.g,t.b),i=2*Math.PI,o=this.r*e.s,n=this.centerCoordinates.x+o*Math.sin(i*e.h),s=this.centerCoordinates.y+o*Math.cos(i*e.h);this.colorPickerSelector.style.left=n-.5*this.colorPickerSelector.clientWidth+"px",this.colorPickerSelector.style.top=s-.5*this.colorPickerSelector.clientHeight+"px",this._updatePicker(t)}},{key:"_setOpacity",value:function(t){this.color.a=t/100,this._updatePicker(this.color)}},{key:"_setBrightness",value:function(t){var e=c.RGBToHSV(this.color.r,this.color.g,this.color.b);e.v=t/100;var i=c.HSVToRGB(e.h,e.s,e.v);i.a=this.color.a,this.color=i,this._updatePicker()}},{key:"_updatePicker",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:this.color,e=c.RGBToHSV(t.r,t.g,t.b),i=this.colorPickerCanvas.getContext("2d");void 0===this.pixelRation&&(this.pixelRatio=(window.devicePixelRatio||1)/(i.webkitBackingStorePixelRatio||i.mozBackingStorePixelRatio||i.msBackingStorePixelRatio||i.oBackingStorePixelRatio||i.backingStorePixelRatio||1)),i.setTransform(this.pixelRatio,0,0,this.pixelRatio,0,0);var o=this.colorPickerCanvas.clientWidth,n=this.colorPickerCanvas.clientHeight;i.clearRect(0,0,o,n),i.putImageData(this.hueCircle,0,0),i.fillStyle="rgba(0,0,0,"+(1-e.v)+")",i.circle(this.centerCoordinates.x,this.centerCoordinates.y,this.r),i.fill(),this.brightnessRange.value=100*e.v,this.opacityRange.value=100*t.a,this.initialColorDiv.style.backgroundColor="rgba("+this.initialColor.r+","+this.initialColor.g+","+this.initialColor.b+","+this.initialColor.a+")",this.newColorDiv.style.backgroundColor="rgba("+this.color.r+","+this.color.g+","+this.color.b+","+this.color.a+")"}},{key:"_setSize",value:function(){this.colorPickerCanvas.style.width="100%",this.colorPickerCanvas.style.height="100%",this.colorPickerCanvas.width=289*this.pixelRatio,this.colorPickerCanvas.height=289*this.pixelRatio}},{key:"_create",value:function(){if(this.frame=document.createElement("div"),this.frame.className="vis-color-picker",this.colorPickerDiv=document.createElement("div"),this.colorPickerSelector=document.createElement("div"),this.colorPickerSelector.className="vis-selector",this.colorPickerDiv.appendChild(this.colorPickerSelector),this.colorPickerCanvas=document.createElement("canvas"),this.colorPickerDiv.appendChild(this.colorPickerCanvas),this.colorPickerCanvas.getContext){var t=this.colorPickerCanvas.getContext("2d") +;this.pixelRatio=(window.devicePixelRatio||1)/(t.webkitBackingStorePixelRatio||t.mozBackingStorePixelRatio||t.msBackingStorePixelRatio||t.oBackingStorePixelRatio||t.backingStorePixelRatio||1),this.colorPickerCanvas.getContext("2d").setTransform(this.pixelRatio,0,0,this.pixelRatio,0,0)}else{var e=document.createElement("DIV");e.style.color="red",e.style.fontWeight="bold",e.style.padding="10px",e.innerHTML="Error: your browser does not support HTML canvas",this.colorPickerCanvas.appendChild(e)}this.colorPickerDiv.className="vis-color",this.opacityDiv=document.createElement("div"),this.opacityDiv.className="vis-opacity",this.brightnessDiv=document.createElement("div"),this.brightnessDiv.className="vis-brightness",this.arrowDiv=document.createElement("div"),this.arrowDiv.className="vis-arrow",this.opacityRange=document.createElement("input");try{this.opacityRange.type="range",this.opacityRange.min="0",this.opacityRange.max="100"}catch(t){}this.opacityRange.value="100",this.opacityRange.className="vis-range",this.brightnessRange=document.createElement("input");try{this.brightnessRange.type="range",this.brightnessRange.min="0",this.brightnessRange.max="100"}catch(t){}this.brightnessRange.value="100",this.brightnessRange.className="vis-range",this.opacityDiv.appendChild(this.opacityRange),this.brightnessDiv.appendChild(this.brightnessRange);var i=this;this.opacityRange.onchange=function(){i._setOpacity(this.value)},this.opacityRange.oninput=function(){i._setOpacity(this.value)},this.brightnessRange.onchange=function(){i._setBrightness(this.value)},this.brightnessRange.oninput=function(){i._setBrightness(this.value)},this.brightnessLabel=document.createElement("div"),this.brightnessLabel.className="vis-label vis-brightness",this.brightnessLabel.innerHTML="brightness:",this.opacityLabel=document.createElement("div"),this.opacityLabel.className="vis-label vis-opacity",this.opacityLabel.innerHTML="opacity:",this.newColorDiv=document.createElement("div"),this.newColorDiv.className="vis-new-color",this.newColorDiv.innerHTML="new",this.initialColorDiv=document.createElement("div"),this.initialColorDiv.className="vis-initial-color",this.initialColorDiv.innerHTML="initial",this.cancelButton=document.createElement("div"),this.cancelButton.className="vis-button vis-cancel",this.cancelButton.innerHTML="cancel",this.cancelButton.onclick=this._hide.bind(this,!1),this.applyButton=document.createElement("div"),this.applyButton.className="vis-button vis-apply",this.applyButton.innerHTML="apply",this.applyButton.onclick=this._apply.bind(this),this.saveButton=document.createElement("div"),this.saveButton.className="vis-button vis-save",this.saveButton.innerHTML="save",this.saveButton.onclick=this._save.bind(this),this.loadButton=document.createElement("div"),this.loadButton.className="vis-button vis-load",this.loadButton.innerHTML="load last",this.loadButton.onclick=this._loadLast.bind(this),this.frame.appendChild(this.colorPickerDiv),this.frame.appendChild(this.arrowDiv),this.frame.appendChild(this.brightnessLabel),this.frame.appendChild(this.brightnessDiv),this.frame.appendChild(this.opacityLabel),this.frame.appendChild(this.opacityDiv),this.frame.appendChild(this.newColorDiv),this.frame.appendChild(this.initialColorDiv),this.frame.appendChild(this.cancelButton),this.frame.appendChild(this.applyButton),this.frame.appendChild(this.saveButton),this.frame.appendChild(this.loadButton)}},{key:"_bindHammer",value:function(){var t=this;this.drag={},this.pinch={},this.hammer=new l(this.colorPickerCanvas),this.hammer.get("pinch").set({enable:!0}),u.onTouch(this.hammer,function(e){t._moveSelector(e)}),this.hammer.on("tap",function(e){t._moveSelector(e)}),this.hammer.on("panstart",function(e){t._moveSelector(e)}),this.hammer.on("panmove",function(e){t._moveSelector(e)}),this.hammer.on("panend",function(e){t._moveSelector(e)})}},{key:"_generateHueCircle",value:function(){if(!1===this.generated){var t=this.colorPickerCanvas.getContext("2d");void 0===this.pixelRation&&(this.pixelRatio=(window.devicePixelRatio||1)/(t.webkitBackingStorePixelRatio||t.mozBackingStorePixelRatio||t.msBackingStorePixelRatio||t.oBackingStorePixelRatio||t.backingStorePixelRatio||1)),t.setTransform(this.pixelRatio,0,0,this.pixelRatio,0,0);var e=this.colorPickerCanvas.clientWidth,i=this.colorPickerCanvas.clientHeight;t.clearRect(0,0,e,i);var o=void 0,n=void 0,s=void 0,r=void 0;this.centerCoordinates={x:.5*e,y:.5*i},this.r=.49*e;var a=2*Math.PI/360,h=1/this.r,d=void 0;for(s=0;s<360;s++)for(r=0;rr?r:t,e=null==e?r:e0&&l.push(u.screenToValue(n)),!p.hidden&&this.itemsData.length>0&&l.push(p.screenToValue(n)),{event:t,what:d,pageX:t.srcEvent?t.srcEvent.pageX:t.pageX,pageY:t.srcEvent?t.srcEvent.pageY:t.pageY,x:o,y:n,time:r,value:l}},o.prototype._createConfigurator=function(){return new g(this,this.dom.container,v)},t.exports=o},function(t,e,i){e.util=i(2),e.DOMutil=i(14),e.DataSet=i(11),e.DataView=i(12),e.Queue=i(43),e.Network=i(182),e.network={Images:i(116),dotparser:i(114),gephiParser:i(115),allOptions:i(122)},e.network.convertDot=function(t){return e.network.dotparser.DOTToGraph(t)},e.network.convertGephi=function(t,i){return e.network.gephiParser.parseGephi(t,i)},e.moment=i(9),e.Hammer=i(10),e.keycharm=i(35)},function(t,e,i){function o(t,e,i){var n=this;if(!(this instanceof o))throw new SyntaxError("Constructor must be called with the new operator");this.options={},this.defaultOptions={locale:"en",locales:d,clickToUse:!1},s.extend(this.options,this.defaultOptions),this.body={container:t,nodes:{},nodeIndices:[],edges:{},edgeIndices:[],emitter:{on:this.on.bind(this),off:this.off.bind(this),emit:this.emit.bind(this),once:this.once.bind(this)},eventListeners:{onTap:function(){},onTouch:function(){},onDoubleTap:function(){},onHold:function(){},onDragStart:function(){},onDrag:function(){},onDragEnd:function(){},onMouseWheel:function(){},onPinch:function(){},onMouseMove:function(){},onRelease:function(){},onContext:function(){}},data:{nodes:null,edges:null},functions:{createNode:function(){},createEdge:function(){},getPointer:function(){}},modules:{},view:{scale:1,translation:{x:0,y:0}}},this.bindEventListeners(),this.images=new l(function(){return n.body.emitter.emit("_requestRedraw")}),this.groups=new u,this.canvas=new g(this.body),this.selectionHandler=new _(this.body,this.canvas),this.interactionHandler=new b(this.body,this.canvas,this.selectionHandler),this.view=new y(this.body,this.canvas),this.renderer=new v(this.body,this.canvas),this.physics=new f(this.body),this.layoutEngine=new w(this.body),this.clustering=new m(this.body),this.manipulation=new x(this.body,this.canvas,this.selectionHandler),this.nodesHandler=new c(this.body,this.images,this.groups,this.layoutEngine),this.edgesHandler=new p(this.body,this.images,this.groups),this.body.modules.kamadaKawai=new T(this.body,150,.05),this.body.modules.clustering=this.clustering,this.canvas._create(),this.setOptions(i),this.setData(e)}i(183);var n=i(44),s=i(2),r=i(114),a=i(115),h=i(97),d=i(184),l=i(116).default,u=i(186).default,c=i(187).default,p=i(214).default,f=i(220).default,m=i(227).default,v=i(229).default,g=i(230).default,y=i(231).default,b=i(232).default,_=i(234).default,w=i(235).default,x=i(237).default,k=i(71).default,S=i(15).default,D=i(15),M=D.printStyle,C=i(122),O=C.allOptions,E=C.configureOptions,T=i(238).default;n(o.prototype),o.prototype.setOptions=function(t){var e=this;if(void 0!==t){!0===S.validate(t,O)&&console.log("%cErrors have been found in the supplied options object.",M);var i=["locale","locales","clickToUse"];if(s.selectiveDeepExtend(i,this.options,t),t=this.layoutEngine.setOptions(t.layout,t),this.canvas.setOptions(t),this.groups.setOptions(t.groups),this.nodesHandler.setOptions(t.nodes),this.edgesHandler.setOptions(t.edges),this.physics.setOptions(t.physics),this.manipulation.setOptions(t.manipulation,t,this.options),this.interactionHandler.setOptions(t.interaction),this.renderer.setOptions(t.interaction),this.selectionHandler.setOptions(t.interaction),void 0!==t.groups&&this.body.emitter.emit("refreshNodes"),"configure"in t&&(this.configurator||(this.configurator=new k(this,this.body.container,E,this.canvas.pixelRatio)),this.configurator.setOptions(t.configure)),this.configurator&&!0===this.configurator.options.enabled){var o={nodes:{},edges:{},layout:{},interaction:{},manipulation:{},physics:{},global:{}};s.deepExtend(o.nodes,this.nodesHandler.options),s.deepExtend(o.edges,this.edgesHandler.options),s.deepExtend(o.layout,this.layoutEngine.options),s.deepExtend(o.interaction,this.selectionHandler.options),s.deepExtend(o.interaction,this.renderer.options),s.deepExtend(o.interaction,this.interactionHandler.options),s.deepExtend(o.manipulation,this.manipulation.options),s.deepExtend(o.physics,this.physics.options),s.deepExtend(o.global,this.canvas.options),s.deepExtend(o.global,this.options),this.configurator.setModuleOptions(o)}void 0!==t.clickToUse?!0===t.clickToUse?void 0===this.activator&&(this.activator=new h(this.canvas.frame),this.activator.on("change",function(){e.body.emitter.emit("activate")})):(void 0!==this.activator&&(this.activator.destroy(),delete this.activator),this.body.emitter.emit("activate")):this.body.emitter.emit("activate"),this.canvas.setSize(),this.body.emitter.emit("startSimulation")}},o.prototype._updateVisibleIndices=function(){var t=this.body.nodes,e=this.body.edges;this.body.nodeIndices=[],this.body.edgeIndices=[];for(var i in t)t.hasOwnProperty(i)&&(this.clustering._isClusteredNode(i)||!1!==t[i].options.hidden||this.body.nodeIndices.push(t[i].id));for(var o in e)if(e.hasOwnProperty(o)){var n=e[o],s=t[n.fromId],r=t[n.toId],a=void 0!==s&&void 0!==r,h=!this.clustering._isClusteredEdge(o)&&!1===n.options.hidden&&a&&!1===s.options.hidden&&!1===r.options.hidden;h&&this.body.edgeIndices.push(n.id)}},o.prototype.bindEventListeners=function(){var t=this;this.body.emitter.on("_dataChanged",function(){t.edgesHandler._updateState(),t.body.emitter.emit("_dataUpdated")}),this.body.emitter.on("_dataUpdated",function(){t.clustering._updateState(),t._updateVisibleIndices(),t._updateValueRange(t.body.nodes),t._updateValueRange(t.body.edges),t.body.emitter.emit("startSimulation"),t.body.emitter.emit("_requestRedraw")})},o.prototype.setData=function(t){if(this.body.emitter.emit("resetPhysics"),this.body.emitter.emit("_resetData"),this.selectionHandler.unselectAll(),t&&t.dot&&(t.nodes||t.edges))throw new SyntaxError('Data must contain either parameter "dot" or parameter pair "nodes" and "edges", but not both.');if(this.setOptions(t&&t.options),t&&t.dot){console.log("The dot property has been deprecated. Please use the static convertDot method to convert DOT into vis.network format and use the normal data format with nodes and edges. This converter is used like this: var data = vis.network.convertDot(dotString);");var e=r.DOTToGraph(t.dot);return void this.setData(e)}if(t&&t.gephi){console.log("The gephi property has been deprecated. Please use the static convertGephi method to convert gephi into vis.network format and use the normal data format with nodes and edges. This converter is used like this: var data = vis.network.convertGephi(gephiJson);");var i=a.parseGephi(t.gephi);return void this.setData(i)}this.nodesHandler.setData(t&&t.nodes,!0),this.edgesHandler.setData(t&&t.edges,!0),this.body.emitter.emit("_dataChanged"),this.body.emitter.emit("_dataLoaded"),this.body.emitter.emit("initPhysics")},o.prototype.destroy=function(){this.body.emitter.emit("destroy"),this.body.emitter.off(),this.off(),delete this.groups,delete this.canvas,delete this.selectionHandler,delete this.interactionHandler,delete this.view,delete this.renderer,delete this.physics,delete this.layoutEngine,delete this.clustering,delete this.manipulation,delete this.nodesHandler,delete this.edgesHandler,delete this.configurator,delete this.images;for(var t in this.body.nodes)this.body.nodes.hasOwnProperty(t)&&delete this.body.nodes[t];for(var e in this.body.edges)this.body.edges.hasOwnProperty(e)&&delete this.body.edges[e];s.recursiveDOMDelete(this.body.container)},o.prototype._updateValueRange=function(t){var e,i=void 0,o=void 0,n=0;for(e in t)if(t.hasOwnProperty(e)){var s=t[e].getValue();void 0!==s&&(i=void 0===i?s:Math.min(s,i),o=void 0===o?s:Math.max(s,o),n+=s)}if(void 0!==i&&void 0!==o)for(e in t)t.hasOwnProperty(e)&&t[e].setValueRange(i,o,n)},o.prototype.isActive=function(){return!this.activator||this.activator.active},o.prototype.setSize=function(){return this.canvas.setSize.apply(this.canvas,arguments)},o.prototype.canvasToDOM=function(){return this.canvas.canvasToDOM.apply(this.canvas,arguments)},o.prototype.DOMtoCanvas=function(){return this.canvas.DOMtoCanvas.apply(this.canvas,arguments)},o.prototype.findNode=function(){return this.clustering.findNode.apply(this.clustering,arguments)},o.prototype.isCluster=function(){return this.clustering.isCluster.apply(this.clustering,arguments)},o.prototype.openCluster=function(){return this.clustering.openCluster.apply(this.clustering,arguments)},o.prototype.cluster=function(){return this.clustering.cluster.apply(this.clustering,arguments)},o.prototype.getNodesInCluster=function(){return this.clustering.getNodesInCluster.apply(this.clustering,arguments)},o.prototype.clusterByConnection=function(){return this.clustering.clusterByConnection.apply(this.clustering,arguments)},o.prototype.clusterByHubsize=function(){return this.clustering.clusterByHubsize.apply(this.clustering,arguments)},o.prototype.clusterOutliers=function(){return this.clustering.clusterOutliers.apply(this.clustering,arguments)},o.prototype.getSeed=function(){return this.layoutEngine.getSeed.apply(this.layoutEngine,arguments)},o.prototype.enableEditMode=function(){return this.manipulation.enableEditMode.apply(this.manipulation,arguments)},o.prototype.disableEditMode=function(){return this.manipulation.disableEditMode.apply(this.manipulation,arguments)},o.prototype.addNodeMode=function(){return this.manipulation.addNodeMode.apply(this.manipulation,arguments)},o.prototype.editNode=function(){return this.manipulation.editNode.apply(this.manipulation,arguments)},o.prototype.editNodeMode=function(){return console.log("Deprecated: Please use editNode instead of editNodeMode."),this.manipulation.editNode.apply(this.manipulation,arguments)},o.prototype.addEdgeMode=function(){return this.manipulation.addEdgeMode.apply(this.manipulation,arguments)},o.prototype.editEdgeMode=function(){return this.manipulation.editEdgeMode.apply(this.manipulation,arguments)},o.prototype.deleteSelected=function(){return this.manipulation.deleteSelected.apply(this.manipulation,arguments)},o.prototype.getPositions=function(){return this.nodesHandler.getPositions.apply(this.nodesHandler,arguments)},o.prototype.storePositions=function(){return this.nodesHandler.storePositions.apply(this.nodesHandler,arguments)},o.prototype.moveNode=function(){return this.nodesHandler.moveNode.apply(this.nodesHandler,arguments)},o.prototype.getBoundingBox=function(){return this.nodesHandler.getBoundingBox.apply(this.nodesHandler,arguments)},o.prototype.getConnectedNodes=function(t){return void 0!==this.body.nodes[t]?this.nodesHandler.getConnectedNodes.apply(this.nodesHandler,arguments):this.edgesHandler.getConnectedNodes.apply(this.edgesHandler,arguments)},o.prototype.getConnectedEdges=function(){return this.nodesHandler.getConnectedEdges.apply(this.nodesHandler,arguments)},o.prototype.startSimulation=function(){return this.physics.startSimulation.apply(this.physics,arguments)},o.prototype.stopSimulation=function(){return this.physics.stopSimulation.apply(this.physics,arguments)},o.prototype.stabilize=function(){return this.physics.stabilize.apply(this.physics,arguments)},o.prototype.getSelection=function(){return this.selectionHandler.getSelection.apply(this.selectionHandler,arguments)},o.prototype.setSelection=function(){return this.selectionHandler.setSelection.apply(this.selectionHandler,arguments)},o.prototype.getSelectedNodes=function(){return this.selectionHandler.getSelectedNodes.apply(this.selectionHandler,arguments)},o.prototype.getSelectedEdges=function(){return this.selectionHandler.getSelectedEdges.apply(this.selectionHandler,arguments)},o.prototype.getNodeAt=function(){var t=this.selectionHandler.getNodeAt.apply(this.selectionHandler,arguments);return void 0!==t&&void 0!==t.id?t.id:t},o.prototype.getEdgeAt=function(){var t=this.selectionHandler.getEdgeAt.apply(this.selectionHandler,arguments);return void 0!==t&&void 0!==t.id?t.id:t},o.prototype.selectNodes=function(){return this.selectionHandler.selectNodes.apply(this.selectionHandler,arguments)},o.prototype.selectEdges=function(){return this.selectionHandler.selectEdges.apply(this.selectionHandler,arguments)},o.prototype.unselectAll=function(){this.selectionHandler.unselectAll.apply(this.selectionHandler,arguments),this.redraw()},o.prototype.redraw=function(){return this.renderer.redraw.apply(this.renderer,arguments)},o.prototype.getScale=function(){return this.view.getScale.apply(this.view,arguments)},o.prototype.getViewPosition=function(){return this.view.getViewPosition.apply(this.view,arguments)},o.prototype.fit=function(){return this.view.fit.apply(this.view,arguments)},o.prototype.moveTo=function(){return this.view.moveTo.apply(this.view,arguments)},o.prototype.focus=function(){return this.view.focus.apply(this.view,arguments)},o.prototype.releaseNode=function(){return this.view.releaseNode.apply(this.view,arguments)},o.prototype.getOptionsFromConfigurator=function(){var t={};return this.configurator&&(t=this.configurator.getOptions.apply(this.configurator)),t},t.exports=o},function(t,e,i){"undefined"!=typeof CanvasRenderingContext2D&&(CanvasRenderingContext2D.prototype.circle=function(t,e,i){this.beginPath(),this.arc(t,e,i,0,2*Math.PI,!1),this.closePath()},CanvasRenderingContext2D.prototype.square=function(t,e,i){this.beginPath(),this.rect(t-i,e-i,2*i,2*i),this.closePath()},CanvasRenderingContext2D.prototype.triangle=function(t,e,i){this.beginPath(),i*=1.15,e+=.275*i;var o=2*i,n=o/2,s=Math.sqrt(3)/6*o,r=Math.sqrt(o*o-n*n);this.moveTo(t,e-(r-s)),this.lineTo(t+n,e+s),this.lineTo(t-n,e+s),this.lineTo(t,e-(r-s)),this.closePath()},CanvasRenderingContext2D.prototype.triangleDown=function(t,e,i){this.beginPath(),i*=1.15,e-=.275*i;var o=2*i,n=o/2,s=Math.sqrt(3)/6*o,r=Math.sqrt(o*o-n*n);this.moveTo(t,e+(r-s)),this.lineTo(t+n,e-s),this.lineTo(t-n,e-s),this.lineTo(t,e+(r-s)),this.closePath()},CanvasRenderingContext2D.prototype.star=function(t,e,i){this.beginPath(),i*=.82,e+=.1*i;for(var o=0;o<10;o++){var n=o%2==0?1.3*i:.5*i;this.lineTo(t+n*Math.sin(2*o*Math.PI/10),e-n*Math.cos(2*o*Math.PI/10))}this.closePath()},CanvasRenderingContext2D.prototype.diamond=function(t,e,i){this.beginPath(),this.lineTo(t,e+i),this.lineTo(t+i,e),this.lineTo(t,e-i),this.lineTo(t-i,e),this.closePath()},CanvasRenderingContext2D.prototype.roundRect=function(t,e,i,o,n){var s=Math.PI/180;i-2*n<0&&(n=i/2),o-2*n<0&&(n=o/2),this.beginPath(),this.moveTo(t+n,e),this.lineTo(t+i-n,e),this.arc(t+i-n,e+n,n,270*s,360*s,!1),this.lineTo(t+i,e+o-n),this.arc(t+i-n,e+o-n,n,0,90*s,!1),this.lineTo(t+n,e+o),this.arc(t+n,e+o-n,n,90*s,180*s,!1),this.lineTo(t,e+n),this.arc(t+n,e+n,n,180*s,270*s,!1),this.closePath()},CanvasRenderingContext2D.prototype.ellipse_vis=function(t,e,i,o){var n=i/2*.5522848,s=o/2*.5522848,r=t+i,a=e+o,h=t+i/2,d=e+o/2;this.beginPath(),this.moveTo(t,d),this.bezierCurveTo(t,d-s,h-n,e,h,e),this.bezierCurveTo(h+n,e,r,d-s,r,d),this.bezierCurveTo(r,d+s,h+n,a,h,a),this.bezierCurveTo(h-n,a,t,d+s,t,d),this.closePath()},CanvasRenderingContext2D.prototype.database=function(t,e,i,o){var n=i,s=o*(1/3),r=n/2*.5522848,a=s/2*.5522848,h=t+n,d=e+s,l=t+n/2,u=e+s/2,c=e+(o-s/2),p=e+o;this.beginPath(),this.moveTo(h,u),this.bezierCurveTo(h,u+a,l+r,d,l,d),this.bezierCurveTo(l-r,d,t,u+a,t,u),this.bezierCurveTo(t,u-a,l-r,e,l,e),this.bezierCurveTo(l+r,e,h,u-a,h,u),this.lineTo(h,c),this.bezierCurveTo(h,c+a,l+r,p,l,p),this.bezierCurveTo(l-r,p,t,c+a,t,c),this.lineTo(t,u)},CanvasRenderingContext2D.prototype.dashedLine=function(t,e,i,o,n){this.beginPath(),this.moveTo(t,e);for(var s=n.length,r=i-t,a=o-e,h=a/r,d=Math.sqrt(r*r+a*a),l=0,u=!0,c=0,p=n[0];d>=.1;)p=n[l++%s],p>d&&(p=d),c=Math.sqrt(p*p/(1+h*h)),c=r<0?-c:c,t+=c,e+=h*c,!0===u?this.lineTo(t,e):this.moveTo(t,e),d-=p,u=!u},CanvasRenderingContext2D.prototype.hexagon=function(t,e,i){this.beginPath();var o=2*Math.PI/6;this.moveTo(t+i,e);for(var n=1;n<6;n++)this.lineTo(t+i*Math.cos(o*n),e+i*Math.sin(o*n));this.closePath()})},function(t,e,i){e.en={edit:"Edit",del:"Delete selected",back:"Back",addNode:"Add Node",addEdge:"Add Edge",editNode:"Edit Node",editEdge:"Edit Edge",addDescription:"Click in an empty space to place a new node.",edgeDescription:"Click on a node and drag the edge to another node to connect them.",editEdgeDescription:"Click on the control points and drag them to a node to connect to it.",createEdgeError:"Cannot link edges to a cluster.",deleteClusterError:"Clusters cannot be deleted.",editClusterError:"Clusters cannot be edited."},e.en_EN=e.en,e.en_US=e.en,e.de={edit:"Editieren",del:"Lösche Auswahl",back:"Zurück",addNode:"Knoten hinzufügen",addEdge:"Kante hinzufügen",editNode:"Knoten editieren",editEdge:"Kante editieren",addDescription:"Klicke auf eine freie Stelle, um einen neuen Knoten zu plazieren.",edgeDescription:"Klicke auf einen Knoten und ziehe die Kante zu einem anderen Knoten, um diese zu verbinden.",editEdgeDescription:"Klicke auf die Verbindungspunkte und ziehe diese auf einen Knoten, um sie zu verbinden.",createEdgeError:"Es ist nicht möglich, Kanten mit Clustern zu verbinden.",deleteClusterError:"Cluster können nicht gelöscht werden.",editClusterError:"Cluster können nicht editiert werden."},e.de_DE=e.de,e.es={edit:"Editar",del:"Eliminar selección",back:"Átras",addNode:"Añadir nodo",addEdge:"Añadir arista",editNode:"Editar nodo",editEdge:"Editar arista",addDescription:"Haga clic en un lugar vacío para colocar un nuevo nodo.",edgeDescription:"Haga clic en un nodo y arrastre la arista hacia otro nodo para conectarlos.",editEdgeDescription:"Haga clic en un punto de control y arrastrelo a un nodo para conectarlo.",createEdgeError:"No se puede conectar una arista a un grupo.",deleteClusterError:"No es posible eliminar grupos.",editClusterError:"No es posible editar grupos."},e.es_ES=e.es,e.it={edit:"Modifica",del:"Cancella la selezione",back:"Indietro",addNode:"Aggiungi un nodo",addEdge:"Aggiungi un vertice",editNode:"Modifica il nodo",editEdge:"Modifica il vertice",addDescription:"Clicca per aggiungere un nuovo nodo",edgeDescription:"Clicca su un nodo e trascinalo ad un altro nodo per connetterli.",editEdgeDescription:"Clicca sui Punti di controllo e trascinali ad un nodo per connetterli.",createEdgeError:"Non si possono collegare vertici ad un cluster",deleteClusterError:"I cluster non possono essere cancellati",editClusterError:"I clusters non possono essere modificati."},e.it_IT=e.it,e.nl={edit:"Wijzigen",del:"Selectie verwijderen",back:"Terug",addNode:"Node toevoegen",addEdge:"Link toevoegen",editNode:"Node wijzigen",editEdge:"Link wijzigen",addDescription:"Klik op een leeg gebied om een nieuwe node te maken.",edgeDescription:"Klik op een node en sleep de link naar een andere node om ze te verbinden.",editEdgeDescription:"Klik op de verbindingspunten en sleep ze naar een node om daarmee te verbinden.",createEdgeError:"Kan geen link maken naar een cluster.",deleteClusterError:"Clusters kunnen niet worden verwijderd.",editClusterError:"Clusters kunnen niet worden aangepast."},e.nl_NL=e.nl,e.nl_BE=e.nl,e["pt-br"]={edit:"Editar",del:"Remover selecionado",back:"Voltar",addNode:"Adicionar nó",addEdge:"Adicionar aresta",editNode:"Editar nó",editEdge:"Editar aresta",addDescription:"Clique em um espaço em branco para adicionar um novo nó",edgeDescription:"Clique em um nó e arraste a aresta até outro nó para conectá-los",editEdgeDescription:"Clique nos pontos de controle e os arraste para um nó para conectá-los",createEdgeError:"Não foi possível linkar arestas a um cluster.",deleteClusterError:"Clusters não puderam ser removidos.",editClusterError:"Clusters não puderam ser editados."},e["pt-BR"]=e["pt-br"],e.pt_BR=e["pt-br"],e.pt_br=e["pt-br"],e.ru={edit:"Редактировать",del:"Удалить выбранное",back:"Назад",addNode:"Добавить узел",addEdge:"Добавить ребро",editNode:"Редактировать узел",editEdge:"Редактировать ребро",addDescription:"Кликните в свободное место, чтобы добавить новый узел.",edgeDescription:"Кликните на узел и протяните ребро к другому узлу, чтобы соединить их.",editEdgeDescription:"Кликните на контрольные точки и перетащите их в узел, чтобы подключиться к нему.",createEdgeError:"Невозможно соединить ребра в кластер.",deleteClusterError:"Кластеры не могут быть удалены",editClusterError:"Кластеры недоступны для редактирования."},e.ru_RU=e.ru,e.cn={edit:"编辑",del:"åˆ é™¤é€‰å®š",back:"返回",addNode:"æ·»åŠ èŠ‚ç‚¹",addEdge:"æ·»åŠ è¿žæŽ¥çº¿",editNode:"编辑节点",editEdge:"编辑连接线",addDescription:"单击空白处放置新节点。",edgeDescription:"单击某个节点并将该连接线拖动到另一个节点以连接它们。",editEdgeDescription:"单击控制节点并将它们拖到节点上连接。",createEdgeError:"æ— æ³•å°†è¿žæŽ¥çº¿è¿žæŽ¥åˆ°ç¾¤é›†ã€‚",deleteClusterError:"æ— æ³•åˆ é™¤ç¾¤é›†ã€‚",editClusterError:"æ— æ³•ç¼–è¾‘ç¾¤é›†ã€‚"},e.zh_CN=e.cn},function(t,e,i){function o(t){return t&&t.__esModule?t:{default:t}}Object.defineProperty(e,"__esModule",{value:!0});var n=i(0),s=o(n),r=i(1),a=o(r),h=function(){function t(){(0,s.default)(this,t),this.NUM_ITERATIONS=4,this.image=new Image,this.canvas=document.createElement("canvas")}return(0,a.default)(t,[{key:"init",value:function(){if(!this.initialized()){this.src=this.image.src;var t=this.image.width,e=this.image.height;this.width=t,this.height=e;var i=Math.floor(e/2),o=Math.floor(e/4),n=Math.floor(e/8),s=Math.floor(e/16),r=Math.floor(t/2),a=Math.floor(t/4),h=Math.floor(t/8),d=Math.floor(t/16);this.canvas.width=3*a,this.canvas.height=i,this.coordinates=[[0,0,r,i],[r,0,a,o],[r,o,h,n],[5*h,o,d,s]],this._fillMipMap()}}},{key:"initialized",value:function(){return void 0!==this.coordinates}},{key:"_fillMipMap",value:function(){var t=this.canvas.getContext("2d"),e=this.coordinates[0];t.drawImage(this.image,e[0],e[1],e[2],e[3]);for(var i=1;i2){e*=.5;for(var r=0;e>2&&r=this.NUM_ITERATIONS&&(r=this.NUM_ITERATIONS-1);var a=this.coordinates[r];t.drawImage(this.canvas,a[0],a[1],a[2],a[3],i,o,n,s)}else t.drawImage(this.image,i,o,n,s)}}]),t}();e.default=h},function(t,e,i){ +function o(t){return t&&t.__esModule?t:{default:t}}Object.defineProperty(e,"__esModule",{value:!0});var n=i(0),s=o(n),r=i(1),a=o(r),h=i(2),d=function(){function t(){(0,s.default)(this,t),this.clear(),this.defaultIndex=0,this.groupsArray=[],this.groupIndex=0,this.defaultGroups=[{border:"#2B7CE9",background:"#97C2FC",highlight:{border:"#2B7CE9",background:"#D2E5FF"},hover:{border:"#2B7CE9",background:"#D2E5FF"}},{border:"#FFA500",background:"#FFFF00",highlight:{border:"#FFA500",background:"#FFFFA3"},hover:{border:"#FFA500",background:"#FFFFA3"}},{border:"#FA0A10",background:"#FB7E81",highlight:{border:"#FA0A10",background:"#FFAFB1"},hover:{border:"#FA0A10",background:"#FFAFB1"}},{border:"#41A906",background:"#7BE141",highlight:{border:"#41A906",background:"#A1EC76"},hover:{border:"#41A906",background:"#A1EC76"}},{border:"#E129F0",background:"#EB7DF4",highlight:{border:"#E129F0",background:"#F0B3F5"},hover:{border:"#E129F0",background:"#F0B3F5"}},{border:"#7C29F0",background:"#AD85E4",highlight:{border:"#7C29F0",background:"#D3BDF0"},hover:{border:"#7C29F0",background:"#D3BDF0"}},{border:"#C37F00",background:"#FFA807",highlight:{border:"#C37F00",background:"#FFCA66"},hover:{border:"#C37F00",background:"#FFCA66"}},{border:"#4220FB",background:"#6E6EFD",highlight:{border:"#4220FB",background:"#9B9BFD"},hover:{border:"#4220FB",background:"#9B9BFD"}},{border:"#FD5A77",background:"#FFC0CB",highlight:{border:"#FD5A77",background:"#FFD1D9"},hover:{border:"#FD5A77",background:"#FFD1D9"}},{border:"#4AD63A",background:"#C2FABC",highlight:{border:"#4AD63A",background:"#E6FFE3"},hover:{border:"#4AD63A",background:"#E6FFE3"}},{border:"#990000",background:"#EE0000",highlight:{border:"#BB0000",background:"#FF3333"},hover:{border:"#BB0000",background:"#FF3333"}},{border:"#FF6000",background:"#FF6000",highlight:{border:"#FF6000",background:"#FF6000"},hover:{border:"#FF6000",background:"#FF6000"}},{border:"#97C2FC",background:"#2B7CE9",highlight:{border:"#D2E5FF",background:"#2B7CE9"},hover:{border:"#D2E5FF",background:"#2B7CE9"}},{border:"#399605",background:"#255C03",highlight:{border:"#399605",background:"#255C03"},hover:{border:"#399605",background:"#255C03"}},{border:"#B70054",background:"#FF007E",highlight:{border:"#B70054",background:"#FF007E"},hover:{border:"#B70054",background:"#FF007E"}},{border:"#AD85E4",background:"#7C29F0",highlight:{border:"#D3BDF0",background:"#7C29F0"},hover:{border:"#D3BDF0",background:"#7C29F0"}},{border:"#4557FA",background:"#000EA1",highlight:{border:"#6E6EFD",background:"#000EA1"},hover:{border:"#6E6EFD",background:"#000EA1"}},{border:"#FFC0CB",background:"#FD5A77",highlight:{border:"#FFD1D9",background:"#FD5A77"},hover:{border:"#FFD1D9",background:"#FD5A77"}},{border:"#C2FABC",background:"#74D66A",highlight:{border:"#E6FFE3",background:"#74D66A"},hover:{border:"#E6FFE3",background:"#74D66A"}},{border:"#EE0000",background:"#990000",highlight:{border:"#FF3333",background:"#BB0000"},hover:{border:"#FF3333",background:"#BB0000"}}],this.options={},this.defaultOptions={useDefaultGroups:!0},h.extend(this.options,this.defaultOptions)}return(0,a.default)(t,[{key:"setOptions",value:function(t){var e=["useDefaultGroups"];if(void 0!==t)for(var i in t)if(t.hasOwnProperty(i)&&-1===e.indexOf(i)){var o=t[i];this.add(i,o)}}},{key:"clear",value:function(){this.groups={},this.groupsArray=[]}},{key:"get",value:function(t){var e=!(arguments.length>1&&void 0!==arguments[1])||arguments[1],i=this.groups[t];if(void 0===i&&e)if(!1===this.options.useDefaultGroups&&this.groupsArray.length>0){var o=this.groupIndex%this.groupsArray.length;this.groupIndex++,i={},i.color=this.groups[this.groupsArray[o]],this.groups[t]=i}else{var n=this.defaultIndex%this.defaultGroups.length;this.defaultIndex++,i={},i.color=this.defaultGroups[n],this.groups[t]=i}return i}},{key:"add",value:function(t,e){return this.groups[t]=e,this.groupsArray.push(t),e}}]),t}();e.default=d},function(t,e,i){function o(t){return t&&t.__esModule?t:{default:t}}Object.defineProperty(e,"__esModule",{value:!0});var n=i(0),s=o(n),r=i(1),a=o(r),h=i(2),d=i(11),l=i(12),u=i(47).default,c=function(){function t(e,i,o,n){var r=this;if((0,s.default)(this,t),this.body=e,this.images=i,this.groups=o,this.layoutEngine=n,this.body.functions.createNode=this.create.bind(this),this.nodesListeners={add:function(t,e){r.add(e.items)},update:function(t,e){r.update(e.items,e.data,e.oldData)},remove:function(t,e){r.remove(e.items)}},this.defaultOptions={borderWidth:1,borderWidthSelected:2,brokenImage:void 0,color:{border:"#2B7CE9",background:"#97C2FC",highlight:{border:"#2B7CE9",background:"#D2E5FF"},hover:{border:"#2B7CE9",background:"#D2E5FF"}},fixed:{x:!1,y:!1},font:{color:"#343434",size:14,face:"arial",background:"none",strokeWidth:0,strokeColor:"#ffffff",align:"center",vadjust:0,multi:!1,bold:{mod:"bold"},boldital:{mod:"bold italic"},ital:{mod:"italic"},mono:{mod:"",size:15,face:"monospace",vadjust:2}},group:void 0,hidden:!1,icon:{face:"FontAwesome",code:void 0,size:50,color:"#2B7CE9"},image:void 0,label:void 0,labelHighlightBold:!0,level:void 0,margin:{top:5,right:5,bottom:5,left:5},mass:1,physics:!0,scaling:{min:10,max:30,label:{enabled:!1,min:14,max:30,maxVisible:30,drawThreshold:5},customScalingFunction:function(t,e,i,o){if(e===t)return.5;var n=1/(e-t);return Math.max(0,(o-t)*n)}},shadow:{enabled:!1,color:"rgba(0,0,0,0.5)",size:10,x:5,y:5},shape:"ellipse",shapeProperties:{borderDashes:!1,borderRadius:6,interpolation:!0,useImageSize:!1,useBorderWithImage:!1},size:25,title:void 0,value:void 0,x:void 0,y:void 0},this.defaultOptions.mass<=0)throw"Internal error: mass in defaultOptions of NodesHandler may not be zero or negative";this.options=h.bridgeObject(this.defaultOptions),this.bindEventListeners()}return(0,a.default)(t,[{key:"bindEventListeners",value:function(){var t=this;this.body.emitter.on("refreshNodes",this.refresh.bind(this)),this.body.emitter.on("refresh",this.refresh.bind(this)),this.body.emitter.on("destroy",function(){h.forEach(t.nodesListeners,function(e,i){t.body.data.nodes&&t.body.data.nodes.off(i,e)}),delete t.body.functions.createNode,delete t.nodesListeners.add,delete t.nodesListeners.update,delete t.nodesListeners.remove,delete t.nodesListeners})}},{key:"setOptions",value:function(t){if(void 0!==t){if(u.parseOptions(this.options,t),void 0!==t.shape)for(var e in this.body.nodes)this.body.nodes.hasOwnProperty(e)&&this.body.nodes[e].updateShape();if(void 0!==t.font)for(var i in this.body.nodes)this.body.nodes.hasOwnProperty(i)&&(this.body.nodes[i].updateLabelModule(),this.body.nodes[i].needsRefresh());if(void 0!==t.size)for(var o in this.body.nodes)this.body.nodes.hasOwnProperty(o)&&this.body.nodes[o].needsRefresh();void 0===t.hidden&&void 0===t.physics||this.body.emitter.emit("_dataChanged")}}},{key:"setData",value:function(t){var e=arguments.length>1&&void 0!==arguments[1]&&arguments[1],i=this.body.data.nodes;if(t instanceof d||t instanceof l)this.body.data.nodes=t;else if(Array.isArray(t))this.body.data.nodes=new d,this.body.data.nodes.add(t);else{if(t)throw new TypeError("Array or DataSet expected");this.body.data.nodes=new d}if(i&&h.forEach(this.nodesListeners,function(t,e){i.off(e,t)}),this.body.nodes={},this.body.data.nodes){var o=this;h.forEach(this.nodesListeners,function(t,e){o.body.data.nodes.on(e,t)});var n=this.body.data.nodes.getIds();this.add(n,!0)}!1===e&&this.body.emitter.emit("_dataChanged")}},{key:"add",value:function(t){for(var e=arguments.length>1&&void 0!==arguments[1]&&arguments[1],i=void 0,o=[],n=0;n1&&void 0!==arguments[1]?arguments[1]:u)(t,this.body,this.images,this.groups,this.options,this.defaultOptions)}},{key:"refresh",value:function(){var t=this,e=arguments.length>0&&void 0!==arguments[0]&&arguments[0];h.forEach(this.body.nodes,function(i,o){var n=t.body.data.nodes.get(o);void 0!==n&&(!0===e&&i.setOptions({x:null,y:null}),i.setOptions({fixed:!1}),i.setOptions(n))})}},{key:"getPositions",value:function(t){var e={};if(void 0!==t){if(!0===Array.isArray(t)){for(var i=0;i0)for(var r=0;r0)for(var p=0;p0&&void 0!==arguments[0]&&arguments[0];this.spacing&&(this.add(" "),this.spacing=!1),this.buffer.length>0&&(e.push({text:this.buffer,mod:this.modName()}),this.buffer="")},i.add=function(t){" "===t&&(i.spacing=!0),i.spacing&&(this.buffer+=" ",this.spacing=!1)," "!=t&&(this.buffer+=t)};i.position/.test(t.substr(i.position,3))?i.mono||i.ital||!//.test(t.substr(i.position,3))?!i.mono&&//.test(t.substr(i.position,6))?(i.emitBlock(),i.mono=!0,i.modStack.unshift("mono"),i.position+=5):!i.mono&&"bold"===i.mod()&&/<\/b>/.test(t.substr(i.position,4))?(i.emitBlock(),i.bold=!1,i.modStack.shift(),i.position+=3):!i.mono&&"ital"===i.mod()&&/<\/i>/.test(t.substr(i.position,4))?(i.emitBlock(),i.ital=!1,i.modStack.shift(),i.position+=3):"mono"===i.mod()&&/<\/code>/.test(t.substr(i.position,7))?(i.emitBlock(),i.mono=!1,i.modStack.shift(),i.position+=6):i.add(o):(i.emitBlock(),i.ital=!0,i.modStack.unshift("ital"),i.position+=2):(i.emitBlock(),i.bold=!0,i.modStack.unshift("bold"),i.position+=2):/&/.test(o)?/</.test(t.substr(i.position,4))?(i.add("<"),i.position+=3):/&/.test(t.substr(i.position,5))?(i.add("&"),i.position+=4):i.add("&"):i.add(o),i.position++}return i.emitBlock(),e}},{key:"splitMarkdownBlocks",value:function(t){var e=[],i={bold:!1,ital:!1,mono:!1,beginable:!0,spacing:!1,position:0,buffer:"",modStack:[]};for(i.mod=function(){return 0===this.modStack.length?"normal":this.modStack[0]},i.modName=function(){return 0===this.modStack.length?"normal":"mono"===this.modStack[0]?"mono":i.bold&&i.ital?"boldital":i.bold?"bold":i.ital?"ital":void 0},i.emitBlock=function(){arguments.length>0&&void 0!==arguments[0]&&arguments[0];this.spacing&&(this.add(" "),this.spacing=!1),this.buffer.length>0&&(e.push({text:this.buffer,mod:this.modName()}),this.buffer="")},i.add=function(t){" "===t&&(i.spacing=!0),i.spacing&&(this.buffer+=" ",this.spacing=!1)," "!=t&&(this.buffer+=t)};i.positionthis.parent.fontOptions.maxWdt}},{key:"getLongestFit",value:function(t){for(var e="",i=0;i1&&void 0!==arguments[1]?arguments[1]:"normal",i=arguments.length>2&&void 0!==arguments[2]&&arguments[2];t=t.replace(/^( +)/g,"$1\r"),t=t.replace(/([^\r][^ ]*)( +)/g,"$1\r$2\r");for(var o=t.split("\r");o.length>0;){var n=this.getLongestFit(o);if(0===n){var s=o[0],r=this.getLongestFitWord(s);this.lines.newLine(s.slice(0,r),e),o[0]=s.slice(r)}else{var a=n;" "===o[n-1]?n--:" "===o[a]&&a++;var h=o.slice(0,n).join("");n==o.length&&i?this.lines.append(h,e):this.lines.newLine(h,e),o=o.slice(a)}}}}]),t}();e.default=l},function(t,e,i){function o(t){return t&&t.__esModule?t:{default:t}}Object.defineProperty(e,"__esModule",{value:!0});var n=i(90),s=o(n),r=i(0),a=o(r),h=i(1),d=o(h),l=function(){function t(e){(0,a.default)(this,t),this.measureText=e,this.current=0,this.width=0,this.height=0,this.lines=[]}return(0,d.default)(t,[{key:"_add",value:function(t,e){var i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:"normal";void 0===this.lines[t]&&(this.lines[t]={width:0,height:0,blocks:[]});var o=e;void 0!==e&&""!==e||(o=" ");var n=this.measureText(o,i),r=(0,s.default)({},n.values);r.text=e,r.width=n.width,r.mod=i,void 0!==e&&""!==e||(r.width=0),this.lines[t].blocks.push(r),this.lines[t].width+=r.width}},{key:"curWidth",value:function(){var t=this.lines[this.current];return void 0===t?0:t.width}},{key:"append",value:function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"normal";this._add(this.current,t,e)}},{key:"newLine",value:function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"normal";this._add(this.current,t,e),this.current++}},{key:"determineLineHeights",value:function(){for(var t=0;tt&&(t=o.width),e+=o.height}this.width=t,this.height=e}},{key:"removeEmptyBlocks",value:function(){for(var t=[],e=0;e1&&void 0!==arguments[1]?arguments[1]:this.selected,i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:this.hover;if(this.needsRefresh(e,i)){var o=this.getDimensionsFromLabel(t,e,i);this.width=o.width+this.margin.right+this.margin.left,this.height=o.height+this.margin.top+this.margin.bottom,this.radius=this.width/2}}},{key:"draw",value:function(t,e,i,o,n,s){this.resize(t,o,n),this.left=e-this.width/2,this.top=i-this.height/2,this.initContextForDraw(t,s),t.roundRect(this.left,this.top,this.width,this.height,s.borderRadius),this.performFill(t,s),this.updateBoundingBox(e,i,t,o,n),this.labelModule.draw(t,this.left+this.textSize.width/2+this.margin.left,this.top+this.textSize.height/2+this.margin.top,o,n)}},{key:"updateBoundingBox",value:function(t,e,i,o,n){this._updateBoundingBox(t,e,i,o,n);var s=this.options.shapeProperties.borderRadius;this._addBoundingBoxMargin(s)}},{key:"distanceToBorder",value:function(t,e){this.resize(t);var i=this.options.borderWidth;return Math.min(Math.abs(this.width/2/Math.cos(e)),Math.abs(this.height/2/Math.sin(e)))+i}}]),e}(m.default);e.default=v},function(t,e,i){i(195),t.exports=i(7).Object.getPrototypeOf},function(t,e,i){var o=i(41),n=i(85);i(87)("getPrototypeOf",function(){return function(t){return n(o(t))}})},function(t,e,i){t.exports={default:i(197),__esModule:!0}},function(t,e,i){i(198),t.exports=i(7).Object.setPrototypeOf},function(t,e,i){var o=i(17);o(o.S,"Object",{setPrototypeOf:i(199).set})},function(t,e,i){var o=i(32),n=i(27),s=function(t,e){if(n(t),!o(e)&&null!==e)throw TypeError(e+": can't set as prototype!")};t.exports={set:Object.setPrototypeOf||("__proto__"in{}?function(t,e,o){try{o=i(80)(Function.call,i(89).f(Object.prototype,"__proto__").set,2),o(t,[]),e=!(t instanceof Array)}catch(t){e=!0}return function(t,i){return s(t,i),e?t.__proto__=i:o(t,i),t}}({},!1):void 0),check:s}},function(t,e,i){function o(t){return t&&t.__esModule?t:{default:t}}Object.defineProperty(e,"__esModule",{value:!0});var n=i(3),s=o(n),r=i(0),a=o(r),h=i(1),d=o(h),l=i(4),u=o(l),c=i(5),p=o(c),f=i(73),m=o(f),v=function(t){function e(t,i,o){(0,a.default)(this,e);var n=(0,u.default)(this,(e.__proto__||(0,s.default)(e)).call(this,t,i,o));return n._setMargins(o),n}return(0,p.default)(e,t),(0,d.default)(e,[{key:"resize",value:function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:this.selected,i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:this.hover;if(this.needsRefresh(e,i)){var o=this.getDimensionsFromLabel(t,e,i),n=Math.max(o.width+this.margin.right+this.margin.left,o.height+this.margin.top+this.margin.bottom);this.options.size=n/2,this.width=n,this.height=n,this.radius=this.width/2}}},{key:"draw",value:function(t,e,i,o,n,s){this.resize(t,o,n),this.left=e-this.width/2,this.top=i-this.height/2,this._drawRawCircle(t,e,i,s),this.updateBoundingBox(e,i),this.labelModule.draw(t,this.left+this.textSize.width/2+this.margin.left,i,o,n)}},{key:"updateBoundingBox",value:function(t,e){this.boundingBox.top=e-this.options.size,this.boundingBox.left=t-this.options.size,this.boundingBox.right=t+this.options.size,this.boundingBox.bottom=e+this.options.size}},{key:"distanceToBorder",value:function(t,e){return this.resize(t),.5*this.width}}]),e}(m.default);e.default=v},function(t,e,i){function o(t){return t&&t.__esModule?t:{default:t}}Object.defineProperty(e,"__esModule",{value:!0});var n=i(3),s=o(n),r=i(0),a=o(r),h=i(1),d=o(h),l=i(4),u=o(l),c=i(5),p=o(c),f=i(73),m=o(f),v=function(t){function e(t,i,o,n,r){(0,a.default)(this,e);var h=(0,u.default)(this,(e.__proto__||(0,s.default)(e)).call(this,t,i,o));return h.setImages(n,r),h}return(0,p.default)(e,t),(0,d.default)(e,[{key:"resize",value:function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:this.selected,i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:this.hover;if(void 0===this.imageObj.src||void 0===this.imageObj.width||void 0===this.imageObj.height){var o=2*this.options.size;return this.width=o,this.height=o,void(this.radius=.5*this.width)}this.needsRefresh(e,i)&&this._resizeImage()}},{key:"draw",value:function(t,e,i,o,n,s){this.switchImages(o),this.resize(),this.left=e-this.width/2,this.top=i-this.height/2,this._drawRawCircle(t,e,i,s),t.save(),t.clip(),this._drawImageAtPosition(t,s),t.restore(),this._drawImageLabel(t,e,i,o,n),this.updateBoundingBox(e,i)}},{key:"updateBoundingBox",value:function(t,e){this.boundingBox.top=e-this.options.size,this.boundingBox.left=t-this.options.size,this.boundingBox.right=t+this.options.size,this.boundingBox.bottom=e+this.options.size,this.boundingBox.left=Math.min(this.boundingBox.left,this.labelModule.size.left),this.boundingBox.right=Math.max(this.boundingBox.right,this.labelModule.size.left+this.labelModule.size.width),this.boundingBox.bottom=Math.max(this.boundingBox.bottom,this.boundingBox.bottom+this.labelOffset)}},{key:"distanceToBorder",value:function(t,e){return this.resize(t),.5*this.width}}]),e}(m.default);e.default=v},function(t,e,i){function o(t){return t&&t.__esModule?t:{default:t}}Object.defineProperty(e,"__esModule",{value:!0});var n=i(3),s=o(n),r=i(0),a=o(r),h=i(1),d=o(h),l=i(4),u=o(l),c=i(5),p=o(c),f=i(23),m=o(f),v=function(t){function e(t,i,o){(0,a.default)(this,e);var n=(0,u.default)(this,(e.__proto__||(0,s.default)(e)).call(this,t,i,o));return n._setMargins(o),n}return(0,p.default)(e,t),(0,d.default)(e,[{key:"resize",value:function(t,e,i){if(this.needsRefresh(e,i)){var o=this.getDimensionsFromLabel(t,e,i),n=o.width+this.margin.right+this.margin.left;this.width=n,this.height=n,this.radius=this.width/2}}},{key:"draw",value:function(t,e,i,o,n,s){this.resize(t,o,n),this.left=e-this.width/2,this.top=i-this.height/2,this.initContextForDraw(t,s),t.database(e-this.width/2,i-this.height/2,this.width,this.height),this.performFill(t,s),this.updateBoundingBox(e,i,t,o,n),this.labelModule.draw(t,this.left+this.textSize.width/2+this.margin.left,this.top+this.textSize.height/2+this.margin.top,o,n)}},{key:"distanceToBorder",value:function(t,e){return this._distanceToBorder(t,e)}}]),e}(m.default);e.default=v},function(t,e,i){function o(t){return t&&t.__esModule?t:{default:t}}Object.defineProperty(e,"__esModule",{value:!0});var n=i(3),s=o(n),r=i(0),a=o(r),h=i(1),d=o(h),l=i(4),u=o(l),c=i(5),p=o(c),f=i(24),m=o(f),v=function(t){function e(t,i,o){return(0,a.default)(this,e),(0,u.default)(this,(e.__proto__||(0,s.default)(e)).call(this,t,i,o))}return(0,p.default)(e,t),(0,d.default)(e,[{key:"draw",value:function(t,e,i,o,n,s){this._drawShape(t,"diamond",4,e,i,o,n,s)}},{key:"distanceToBorder",value:function(t,e){return this._distanceToBorder(t,e)}}]),e}(m.default);e.default=v},function(t,e,i){function o(t){return t&&t.__esModule?t:{default:t}}Object.defineProperty(e,"__esModule",{value:!0});var n=i(3),s=o(n),r=i(0),a=o(r),h=i(1),d=o(h),l=i(4),u=o(l),c=i(5),p=o(c),f=i(24),m=o(f),v=function(t){function e(t,i,o){return(0,a.default)(this,e),(0,u.default)(this,(e.__proto__||(0,s.default)(e)).call(this,t,i,o))}return(0,p.default)(e,t),(0,d.default)(e,[{key:"draw",value:function(t,e,i,o,n,s){this._drawShape(t,"circle",2,e,i,o,n,s)}},{key:"distanceToBorder",value:function(t,e){return this.resize(t),this.options.size}}]),e}(m.default);e.default=v},function(t,e,i){function o(t){return t&&t.__esModule?t:{default:t}}Object.defineProperty(e,"__esModule",{value:!0});var n=i(3),s=o(n),r=i(0),a=o(r),h=i(1),d=o(h),l=i(4),u=o(l),c=i(5),p=o(c),f=i(23),m=o(f),v=function(t){function e(t,i,o){return(0,a.default)(this,e),(0,u.default)(this,(e.__proto__||(0,s.default)(e)).call(this,t,i,o))}return(0,p.default)(e,t),(0,d.default)(e,[{key:"resize",value:function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:this.selected,i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:this.hover;if(this.needsRefresh(e,i)){var o=this.getDimensionsFromLabel(t,e,i);this.height=2*o.height,this.width=o.width+o.height,this.radius=.5*this.width}}},{key:"draw",value:function(t,e,i,o,n,s){this.resize(t,o,n),this.left=e-.5*this.width,this.top=i-.5*this.height,this.initContextForDraw(t,s),t.ellipse_vis(this.left,this.top,this.width,this.height),this.performFill(t,s),this.updateBoundingBox(e,i,t,o,n),this.labelModule.draw(t,e,i,o,n)}},{key:"distanceToBorder",value:function(t,e){this.resize(t);var i=.5*this.width,o=.5*this.height,n=Math.sin(e)*i,s=Math.cos(e)*o;return i*o/Math.sqrt(n*n+s*s)}}]),e}(m.default);e.default=v},function(t,e,i){function o(t){return t&&t.__esModule?t:{default:t}}Object.defineProperty(e,"__esModule",{value:!0});var n=i(3),s=o(n),r=i(0),a=o(r),h=i(1),d=o(h),l=i(4),u=o(l),c=i(5),p=o(c),f=i(23),m=o(f),v=function(t){function e(t,i,o){(0,a.default)(this,e);var n=(0,u.default)(this,(e.__proto__||(0,s.default)(e)).call(this,t,i,o));return n._setMargins(o),n}return(0,p.default)(e,t),(0,d.default)(e,[{key:"resize",value:function(t,e,i){this.needsRefresh(e,i)&&(this.iconSize={width:Number(this.options.icon.size),height:Number(this.options.icon.size)},this.width=this.iconSize.width+this.margin.right+this.margin.left,this.height=this.iconSize.height+this.margin.top+this.margin.bottom,this.radius=.5*this.width)}},{key:"draw",value:function(t,e,i,o,n,s){if(this.resize(t,o,n),this.options.icon.size=this.options.icon.size||50,this.left=e-this.width/2,this.top=i-this.height/2,this._icon(t,e,i,o,n,s),void 0!==this.options.label){this.labelModule.draw(t,this.left+this.iconSize.width/2+this.margin.left,i+this.height/2+5,o)}this.updateBoundingBox(e,i)}},{key:"updateBoundingBox",value:function(t,e){if(this.boundingBox.top=e-.5*this.options.icon.size,this.boundingBox.left=t-.5*this.options.icon.size,this.boundingBox.right=t+.5*this.options.icon.size,this.boundingBox.bottom=e+.5*this.options.icon.size,void 0!==this.options.label&&this.labelModule.size.width>0){this.boundingBox.left=Math.min(this.boundingBox.left,this.labelModule.size.left),this.boundingBox.right=Math.max(this.boundingBox.right,this.labelModule.size.left+this.labelModule.size.width),this.boundingBox.bottom=Math.max(this.boundingBox.bottom,this.boundingBox.bottom+this.labelModule.size.height+5)}}},{key:"_icon",value:function(t,e,i,o,n,s){var r=Number(this.options.icon.size);void 0!==this.options.icon.code?(t.font=(o?"bold ":"")+r+"px "+this.options.icon.face,t.fillStyle=this.options.icon.color||"black",t.textAlign="center",t.textBaseline="middle",this.enableShadow(t,s),t.fillText(this.options.icon.code,e,i),this.disableShadow(t,s)):console.error("When using the icon shape, you need to define the code in the icon options object. This can be done per node or globally.")}},{key:"distanceToBorder",value:function(t,e){return this._distanceToBorder(t,e)}}]),e}(m.default);e.default=v},function(t,e,i){function o(t){return t&&t.__esModule?t:{default:t}}Object.defineProperty(e,"__esModule",{value:!0});var n=i(3),s=o(n),r=i(0),a=o(r),h=i(1),d=o(h),l=i(4),u=o(l),c=i(5),p=o(c),f=i(73),m=o(f),v=function(t){function e(t,i,o,n,r){(0,a.default)(this,e);var h=(0,u.default)(this,(e.__proto__||(0,s.default)(e)).call(this,t,i,o));return h.setImages(n,r),h}return(0,p.default)(e,t),(0,d.default)(e,[{key:"resize",value:function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:this.selected,i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:this.hover;if(void 0===this.imageObj.src||void 0===this.imageObj.width||void 0===this.imageObj.height){var o=2*this.options.size;return this.width=o,void(this.height=o)}this.needsRefresh(e,i)&&this._resizeImage()}},{key:"draw",value:function(t,e,i,o,n,s){if(this.switchImages(o),this.resize(),this.left=e-this.width/2,this.top=i-this.height/2,!0===this.options.shapeProperties.useBorderWithImage){var r=this.options.borderWidth,a=this.options.borderWidthSelected||2*this.options.borderWidth,h=(o?a:r)/this.body.view.scale;t.lineWidth=Math.min(this.width,h),t.beginPath(),t.strokeStyle=o?this.options.color.highlight.border:n?this.options.color.hover.border:this.options.color.border,t.fillStyle=o?this.options.color.highlight.background:n?this.options.color.hover.background:this.options.color.background,t.rect(this.left-.5*t.lineWidth,this.top-.5*t.lineWidth,this.width+t.lineWidth,this.height+t.lineWidth),t.fill(),this.performStroke(t,s),t.closePath()}this._drawImageAtPosition(t,s),this._drawImageLabel(t,e,i,o,n),this.updateBoundingBox(e,i)}},{key:"updateBoundingBox",value:function(t,e){this.resize(),this._updateBoundingBox(t,e),void 0!==this.options.label&&this.labelModule.size.width>0&&(this.boundingBox.left=Math.min(this.boundingBox.left,this.labelModule.size.left),this.boundingBox.right=Math.max(this.boundingBox.right,this.labelModule.size.left+this.labelModule.size.width),this.boundingBox.bottom=Math.max(this.boundingBox.bottom,this.boundingBox.bottom+this.labelOffset))}},{key:"distanceToBorder",value:function(t,e){return this._distanceToBorder(t,e)} +}]),e}(m.default);e.default=v},function(t,e,i){function o(t){return t&&t.__esModule?t:{default:t}}Object.defineProperty(e,"__esModule",{value:!0});var n=i(3),s=o(n),r=i(0),a=o(r),h=i(1),d=o(h),l=i(4),u=o(l),c=i(5),p=o(c),f=i(24),m=o(f),v=function(t){function e(t,i,o){return(0,a.default)(this,e),(0,u.default)(this,(e.__proto__||(0,s.default)(e)).call(this,t,i,o))}return(0,p.default)(e,t),(0,d.default)(e,[{key:"draw",value:function(t,e,i,o,n,s){this._drawShape(t,"square",2,e,i,o,n,s)}},{key:"distanceToBorder",value:function(t,e){return this._distanceToBorder(t,e)}}]),e}(m.default);e.default=v},function(t,e,i){function o(t){return t&&t.__esModule?t:{default:t}}Object.defineProperty(e,"__esModule",{value:!0});var n=i(3),s=o(n),r=i(0),a=o(r),h=i(1),d=o(h),l=i(4),u=o(l),c=i(5),p=o(c),f=i(24),m=o(f),v=function(t){function e(t,i,o){return(0,a.default)(this,e),(0,u.default)(this,(e.__proto__||(0,s.default)(e)).call(this,t,i,o))}return(0,p.default)(e,t),(0,d.default)(e,[{key:"draw",value:function(t,e,i,o,n,s){this._drawShape(t,"hexagon",4,e,i,o,n,s)}},{key:"distanceToBorder",value:function(t,e){return this._distanceToBorder(t,e)}}]),e}(m.default);e.default=v},function(t,e,i){function o(t){return t&&t.__esModule?t:{default:t}}Object.defineProperty(e,"__esModule",{value:!0});var n=i(3),s=o(n),r=i(0),a=o(r),h=i(1),d=o(h),l=i(4),u=o(l),c=i(5),p=o(c),f=i(24),m=o(f),v=function(t){function e(t,i,o){return(0,a.default)(this,e),(0,u.default)(this,(e.__proto__||(0,s.default)(e)).call(this,t,i,o))}return(0,p.default)(e,t),(0,d.default)(e,[{key:"draw",value:function(t,e,i,o,n,s){this._drawShape(t,"star",4,e,i,o,n,s)}},{key:"distanceToBorder",value:function(t,e){return this._distanceToBorder(t,e)}}]),e}(m.default);e.default=v},function(t,e,i){function o(t){return t&&t.__esModule?t:{default:t}}Object.defineProperty(e,"__esModule",{value:!0});var n=i(3),s=o(n),r=i(0),a=o(r),h=i(1),d=o(h),l=i(4),u=o(l),c=i(5),p=o(c),f=i(23),m=o(f),v=function(t){function e(t,i,o){(0,a.default)(this,e);var n=(0,u.default)(this,(e.__proto__||(0,s.default)(e)).call(this,t,i,o));return n._setMargins(o),n}return(0,p.default)(e,t),(0,d.default)(e,[{key:"resize",value:function(t,e,i){this.needsRefresh(e,i)&&(this.textSize=this.labelModule.getTextSize(t,e,i),this.width=this.textSize.width+this.margin.right+this.margin.left,this.height=this.textSize.height+this.margin.top+this.margin.bottom,this.radius=.5*this.width)}},{key:"draw",value:function(t,e,i,o,n,s){this.resize(t,o,n),this.left=e-this.width/2,this.top=i-this.height/2,this.enableShadow(t,s),this.labelModule.draw(t,this.left+this.textSize.width/2+this.margin.left,this.top+this.textSize.height/2+this.margin.top,o,n),this.disableShadow(t,s),this.updateBoundingBox(e,i,t,o,n)}},{key:"distanceToBorder",value:function(t,e){return this._distanceToBorder(t,e)}}]),e}(m.default);e.default=v},function(t,e,i){function o(t){return t&&t.__esModule?t:{default:t}}Object.defineProperty(e,"__esModule",{value:!0});var n=i(3),s=o(n),r=i(0),a=o(r),h=i(1),d=o(h),l=i(4),u=o(l),c=i(5),p=o(c),f=i(24),m=o(f),v=function(t){function e(t,i,o){return(0,a.default)(this,e),(0,u.default)(this,(e.__proto__||(0,s.default)(e)).call(this,t,i,o))}return(0,p.default)(e,t),(0,d.default)(e,[{key:"draw",value:function(t,e,i,o,n,s){this._drawShape(t,"triangle",3,e,i,o,n,s)}},{key:"distanceToBorder",value:function(t,e){return this._distanceToBorder(t,e)}}]),e}(m.default);e.default=v},function(t,e,i){function o(t){return t&&t.__esModule?t:{default:t}}Object.defineProperty(e,"__esModule",{value:!0});var n=i(3),s=o(n),r=i(0),a=o(r),h=i(1),d=o(h),l=i(4),u=o(l),c=i(5),p=o(c),f=i(24),m=o(f),v=function(t){function e(t,i,o){return(0,a.default)(this,e),(0,u.default)(this,(e.__proto__||(0,s.default)(e)).call(this,t,i,o))}return(0,p.default)(e,t),(0,d.default)(e,[{key:"draw",value:function(t,e,i,o,n,s){this._drawShape(t,"triangleDown",3,e,i,o,n,s)}},{key:"distanceToBorder",value:function(t,e){return this._distanceToBorder(t,e)}}]),e}(m.default);e.default=v},function(t,e,i){function o(t){return t&&t.__esModule?t:{default:t}}Object.defineProperty(e,"__esModule",{value:!0});var n=i(0),s=o(n),r=i(1),a=o(r),h=i(2),d=i(11),l=i(12),u=i(74).default,c=function(){function t(e,i,o){var n=this;(0,s.default)(this,t),this.body=e,this.images=i,this.groups=o,this.body.functions.createEdge=this.create.bind(this),this.edgesListeners={add:function(t,e){n.add(e.items)},update:function(t,e){n.update(e.items)},remove:function(t,e){n.remove(e.items)}},this.options={},this.defaultOptions={arrows:{to:{enabled:!1,scaleFactor:1,type:"arrow"},middle:{enabled:!1,scaleFactor:1,type:"arrow"},from:{enabled:!1,scaleFactor:1,type:"arrow"}},arrowStrikethrough:!0,color:{color:"#848484",highlight:"#848484",hover:"#848484",inherit:"from",opacity:1},dashes:!1,font:{color:"#343434",size:14,face:"arial",background:"none",strokeWidth:2,strokeColor:"#ffffff",align:"horizontal",multi:!1,vadjust:0,bold:{mod:"bold"},boldital:{mod:"bold italic"},ital:{mod:"italic"},mono:{mod:"",size:15,face:"courier new",vadjust:2}},hidden:!1,hoverWidth:1.5,label:void 0,labelHighlightBold:!0,length:void 0,physics:!0,scaling:{min:1,max:15,label:{enabled:!0,min:14,max:30,maxVisible:30,drawThreshold:5},customScalingFunction:function(t,e,i,o){if(e===t)return.5;var n=1/(e-t);return Math.max(0,(o-t)*n)}},selectionWidth:1.5,selfReferenceSize:20,shadow:{enabled:!1,color:"rgba(0,0,0,0.5)",size:10,x:5,y:5},smooth:{enabled:!0,type:"dynamic",forceDirection:"none",roundness:.5},title:void 0,width:1,value:void 0},h.deepExtend(this.options,this.defaultOptions),this.bindEventListeners()}return(0,a.default)(t,[{key:"bindEventListeners",value:function(){var t=this;this.body.emitter.on("_forceDisableDynamicCurves",function(e){var i=!(arguments.length>1&&void 0!==arguments[1])||arguments[1];"dynamic"===e&&(e="continuous");var o=!1;for(var n in t.body.edges)if(t.body.edges.hasOwnProperty(n)){var s=t.body.edges[n],r=t.body.data.edges._data[n];if(void 0!==r){var a=r.smooth;void 0!==a&&!0===a.enabled&&"dynamic"===a.type&&(void 0===e?s.setOptions({smooth:!1}):s.setOptions({smooth:{type:e}}),o=!0)}}!0===i&&!0===o&&t.body.emitter.emit("_dataChanged")}),this.body.emitter.on("_dataUpdated",function(){t.reconnectEdges()}),this.body.emitter.on("refreshEdges",this.refresh.bind(this)),this.body.emitter.on("refresh",this.refresh.bind(this)),this.body.emitter.on("destroy",function(){h.forEach(t.edgesListeners,function(e,i){t.body.data.edges&&t.body.data.edges.off(i,e)}),delete t.body.functions.createEdge,delete t.edgesListeners.add,delete t.edgesListeners.update,delete t.edgesListeners.remove,delete t.edgesListeners})}},{key:"setOptions",value:function(t){if(void 0!==t){u.parseOptions(this.options,t,!0,this.defaultOptions,!0);var e=!1;if(void 0!==t.smooth)for(var i in this.body.edges)this.body.edges.hasOwnProperty(i)&&(e=this.body.edges[i].updateEdgeType()||e);if(void 0!==t.font)for(var o in this.body.edges)this.body.edges.hasOwnProperty(o)&&this.body.edges[o].updateLabelModule();void 0===t.hidden&&void 0===t.physics&&!0!==e||this.body.emitter.emit("_dataChanged")}}},{key:"setData",value:function(t){var e=this,i=arguments.length>1&&void 0!==arguments[1]&&arguments[1],o=this.body.data.edges;if(t instanceof d||t instanceof l)this.body.data.edges=t;else if(Array.isArray(t))this.body.data.edges=new d,this.body.data.edges.add(t);else{if(t)throw new TypeError("Array or DataSet expected");this.body.data.edges=new d}if(o&&h.forEach(this.edgesListeners,function(t,e){o.off(e,t)}),this.body.edges={},this.body.data.edges){h.forEach(this.edgesListeners,function(t,i){e.body.data.edges.on(i,t)});var n=this.body.data.edges.getIds();this.add(n,!0)}this.body.emitter.emit("_adjustEdgesForHierarchicalLayout"),!1===i&&this.body.emitter.emit("_dataChanged")}},{key:"add",value:function(t){for(var e=arguments.length>1&&void 0!==arguments[1]&&arguments[1],i=this.body.edges,o=this.body.data.edges,n=0;n1&&void 0!==arguments[1])||arguments[1];if(0!==t.length){var i=this.body.edges;h.forEach(t,function(t){var e=i[t];void 0!==e&&e.remove()}),e&&this.body.emitter.emit("_dataChanged")}}},{key:"refresh",value:function(){var t=this;h.forEach(this.body.edges,function(e,i){var o=t.body.data.edges._data[i];void 0!==o&&e.setOptions(o)})}},{key:"create",value:function(t){return new u(t,this.body,this.options,this.defaultOptions)}},{key:"reconnectEdges",value:function(){var t,e=this.body.nodes,i=this.body.edges;for(t in e)e.hasOwnProperty(t)&&(e[t].edges=[]);for(t in i)if(i.hasOwnProperty(t)){var o=i[t];o.from=null,o.to=null,o.connect()}}},{key:"getConnectedNodes",value:function(t){var e=[];if(void 0!==this.body.edges[t]){var i=this.body.edges[t];void 0!==i.fromId&&e.push(i.fromId),void 0!==i.toId&&e.push(i.toId)}return e}},{key:"_updateState",value:function(){this._addMissingEdges(),this._removeInvalidEdges()}},{key:"_removeInvalidEdges",value:function(){var t=this,e=[];h.forEach(this.body.edges,function(i,o){var n=t.body.nodes[i.toId],s=t.body.nodes[i.fromId];void 0!==n&&!0===n.isCluster||void 0!==s&&!0===s.isCluster||void 0!==n&&void 0!==s||e.push(o)}),this.remove(e,!1)}},{key:"_addMissingEdges",value:function(){var t=this.body.edges,e=this.body.data.edges,i=[];e.forEach(function(e,o){void 0===t[o]&&i.push(o)}),this.add(i,!0)}}]),t}();e.default=c},function(t,e,i){function o(t){return t&&t.__esModule?t:{default:t}}Object.defineProperty(e,"__esModule",{value:!0});var n=i(30),s=o(n),r=i(3),a=o(r),h=i(0),d=o(h),l=i(1),u=o(l),c=i(4),p=o(c),f=i(5),m=o(f),v=i(216),g=o(v),y=function(t){function e(t,i,o){return(0,d.default)(this,e),(0,p.default)(this,(e.__proto__||(0,a.default)(e)).call(this,t,i,o))}return(0,m.default)(e,t),(0,u.default)(e,[{key:"_line",value:function(t,e,i){var o=i[0],n=i[1];this._bezierCurve(t,e,o,n)}},{key:"_getViaCoordinates",value:function(){var t=this.from.x-this.to.x,e=this.from.y-this.to.y,i=void 0,o=void 0,n=void 0,s=void 0,r=this.options.smooth.roundness;return(Math.abs(t)>Math.abs(e)||!0===this.options.smooth.forceDirection||"horizontal"===this.options.smooth.forceDirection)&&"vertical"!==this.options.smooth.forceDirection?(o=this.from.y,s=this.to.y,i=this.from.x-r*t,n=this.to.x+r*t):(o=this.from.y-r*e,s=this.to.y+r*e,i=this.from.x,n=this.to.x),[{x:i,y:o},{x:n,y:s}]}},{key:"getViaNode",value:function(){return this._getViaCoordinates()}},{key:"_findBorderPosition",value:function(t,e){return this._findBorderPositionBezier(t,e)}},{key:"_getDistanceToEdge",value:function(t,e,i,o,n,r){var a=arguments.length>6&&void 0!==arguments[6]?arguments[6]:this._getViaCoordinates(),h=(0,s.default)(a,2),d=h[0],l=h[1];return this._getDistanceToBezierEdge(t,e,i,o,n,r,d,l)}},{key:"getPoint",value:function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:this._getViaCoordinates(),i=(0,s.default)(e,2),o=i[0],n=i[1],r=t,a=[];return a[0]=Math.pow(1-r,3),a[1]=3*r*Math.pow(1-r,2),a[2]=3*Math.pow(r,2)*(1-r),a[3]=Math.pow(r,3),{x:a[0]*this.fromPoint.x+a[1]*o.x+a[2]*n.x+a[3]*this.toPoint.x,y:a[0]*this.fromPoint.y+a[1]*o.y+a[2]*n.y+a[3]*this.toPoint.y}}}]),e}(g.default);e.default=y},function(t,e,i){function o(t){return t&&t.__esModule?t:{default:t}}Object.defineProperty(e,"__esModule",{value:!0});var n=i(3),s=o(n),r=i(0),a=o(r),h=i(1),d=o(h),l=i(4),u=o(l),c=i(5),p=o(c),f=i(75),m=o(f),v=function(t){function e(t,i,o){return(0,a.default)(this,e),(0,u.default)(this,(e.__proto__||(0,s.default)(e)).call(this,t,i,o))}return(0,p.default)(e,t),(0,d.default)(e,[{key:"_getDistanceToBezierEdge",value:function(t,e,i,o,n,s,r,a){var h=1e9,d=void 0,l=void 0,u=void 0,c=void 0,p=void 0,f=t,m=e,v=[0,0,0,0];for(l=1;l<10;l++)u=.1*l,v[0]=Math.pow(1-u,3),v[1]=3*u*Math.pow(1-u,2),v[2]=3*Math.pow(u,2)*(1-u),v[3]=Math.pow(u,3),c=v[0]*t+v[1]*r.x+v[2]*a.x+v[3]*i,p=v[0]*e+v[1]*r.y+v[2]*a.y+v[3]*o,l>0&&(d=this._getDistanceToLine(f,m,c,p,n,s),h=d1&&void 0!==arguments[1]?arguments[1]:this.via,i=t,o=void 0,n=void 0;if(this.from===this.to){var r=this._getCircleData(this.from),a=(0,s.default)(r,3),h=a[0],d=a[1],l=a[2],u=2*Math.PI*(1-i);o=h+l*Math.sin(u),n=d+l-l*(1-Math.cos(u))}else o=Math.pow(1-i,2)*this.fromPoint.x+2*i*(1-i)*e.x+Math.pow(i,2)*this.toPoint.x,n=Math.pow(1-i,2)*this.fromPoint.y+2*i*(1-i)*e.y+Math.pow(i,2)*this.toPoint.y;return{x:o,y:n}}},{key:"_findBorderPosition",value:function(t,e){return this._findBorderPositionBezier(t,e,this.via)}},{key:"_getDistanceToEdge",value:function(t,e,i,o,n,s){return this._getDistanceToBezierEdge(t,e,i,o,n,s,this.via)}}]),e}(g.default);e.default=y},function(t,e,i){function o(t){return t&&t.__esModule?t:{default:t}}Object.defineProperty(e,"__esModule",{value:!0});var n=i(3),s=o(n),r=i(0),a=o(r),h=i(1),d=o(h),l=i(4),u=o(l),c=i(5),p=o(c),f=i(75),m=o(f),v=function(t){function e(t,i,o){return(0,a.default)(this,e),(0,u.default)(this,(e.__proto__||(0,s.default)(e)).call(this,t,i,o))}return(0,p.default)(e,t),(0,d.default)(e,[{key:"_line",value:function(t,e,i){this._bezierCurve(t,e,i)}},{key:"getViaNode",value:function(){return this._getViaCoordinates()}},{key:"_getViaCoordinates",value:function(){var t=void 0,e=void 0,i=this.options.smooth.roundness,o=this.options.smooth.type,n=Math.abs(this.from.x-this.to.x),s=Math.abs(this.from.y-this.to.y);if("discrete"===o||"diagonalCross"===o){var r=void 0,a=void 0;r=a=n<=s?i*s:i*n,this.from.x>this.to.x&&(r=-r),this.from.y>=this.to.y&&(a=-a),t=this.from.x+r,e=this.from.y+a,"discrete"===o&&(n<=s?t=nthis.to.x&&(_=-_),this.from.y>=this.to.y&&(w=-w),t=this.from.x+_,e=this.from.y+w,n<=s?t=this.from.x<=this.to.x?this.to.xt?this.to.x:t:e=this.from.y>=this.to.y?this.to.y>e?this.to.y:e:this.to.y2&&void 0!==arguments[2]?arguments[2]:{};return this._findBorderPositionBezier(t,e,i.via)}},{key:"_getDistanceToEdge",value:function(t,e,i,o,n,s){var r=arguments.length>6&&void 0!==arguments[6]?arguments[6]:this._getViaCoordinates();return this._getDistanceToBezierEdge(t,e,i,o,n,s,r)}},{key:"getPoint",value:function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:this._getViaCoordinates(),i=t;return{x:Math.pow(1-i,2)*this.fromPoint.x+2*i*(1-i)*e.x+Math.pow(i,2)*this.toPoint.x,y:Math.pow(1-i,2)*this.fromPoint.y+2*i*(1-i)*e.y+Math.pow(i,2)*this.toPoint.y}}}]),e}(m.default);e.default=v},function(t,e,i){function o(t){return t&&t.__esModule?t:{default:t}}Object.defineProperty(e,"__esModule",{value:!0});var n=i(3),s=o(n),r=i(0),a=o(r),h=i(1),d=o(h),l=i(4),u=o(l),c=i(5),p=o(c),f=i(118),m=o(f),v=function(t){function e(t,i,o){return(0,a.default)(this,e),(0,u.default)(this,(e.__proto__||(0,s.default)(e)).call(this,t,i,o))}return(0,p.default)(e,t),(0,d.default)(e,[{key:"_line",value:function(t,e){t.beginPath(),t.moveTo(this.fromPoint.x,this.fromPoint.y),t.lineTo(this.toPoint.x,this.toPoint.y),this.enableShadow(t,e),t.stroke(),this.disableShadow(t,e)}},{key:"getViaNode",value:function(){}},{key:"getPoint",value:function(t){return{x:(1-t)*this.fromPoint.x+t*this.toPoint.x,y:(1-t)*this.fromPoint.y+t*this.toPoint.y}}},{key:"_findBorderPosition",value:function(t,e){var i=this.to,o=this.from;t.id===this.from.id&&(i=this.from,o=this.to);var n=Math.atan2(i.y-o.y,i.x-o.x),s=i.x-o.x,r=i.y-o.y,a=Math.sqrt(s*s+r*r),h=t.distanceToBorder(e,n),d=(a-h)/a,l={};return l.x=(1-d)*o.x+d*i.x,l.y=(1-d)*o.y+d*i.y,l}},{key:"_getDistanceToEdge",value:function(t,e,i,o,n,s){return this._getDistanceToLine(t,e,i,o,n,s)}}]),e}(m.default);e.default=v},function(t,e,i){function o(t){return t&&t.__esModule?t:{default:t}}Object.defineProperty(e,"__esModule",{value:!0});var n=i(8),s=o(n),r=i(0),a=o(r),h=i(1),d=o(h),l=i(120).default,u=i(221).default,c=i(222).default,p=i(223).default,f=i(224).default,m=i(121).default,v=i(225).default,g=i(226).default,y=i(2),b=i(119).default,_=function(){function t(e){(0,a.default)(this,t),this.body=e,this.physicsBody={physicsNodeIndices:[],physicsEdgeIndices:[],forces:{},velocities:{}},this.physicsEnabled=!0,this.simulationInterval=1e3/60,this.requiresTimeout=!0,this.previousStates={},this.referenceState={},this.freezeCache={},this.renderTimer=void 0,this.adaptiveTimestep=!1,this.adaptiveTimestepEnabled=!1,this.adaptiveCounter=0,this.adaptiveInterval=3,this.stabilized=!1,this.startedStabilization=!1,this.stabilizationIterations=0,this.ready=!1,this.options={},this.defaultOptions={enabled:!0,barnesHut:{theta:.5,gravitationalConstant:-2e3,centralGravity:.3,springLength:95,springConstant:.04,damping:.09,avoidOverlap:0},forceAtlas2Based:{theta:.5,gravitationalConstant:-50,centralGravity:.01,springConstant:.08,springLength:100,damping:.4,avoidOverlap:0},repulsion:{centralGravity:.2,springLength:200,springConstant:.05,nodeDistance:100,damping:.09,avoidOverlap:0},hierarchicalRepulsion:{centralGravity:0,springLength:100,springConstant:.01,nodeDistance:120,damping:.09},maxVelocity:50,minVelocity:.75,solver:"barnesHut",stabilization:{enabled:!0,iterations:1e3,updateInterval:50,onlyDynamicEdges:!1,fit:!0},timestep:.5,adaptiveTimestep:!0},y.extend(this.options,this.defaultOptions),this.timestep=.5,this.layoutFailed=!1,this.bindEventListeners()}return(0,d.default)(t,[{key:"bindEventListeners",value:function(){var t=this;this.body.emitter.on("initPhysics",function(){t.initPhysics()}),this.body.emitter.on("_layoutFailed",function(){t.layoutFailed=!0}),this.body.emitter.on("resetPhysics",function(){t.stopSimulation(),t.ready=!1}),this.body.emitter.on("disablePhysics",function(){t.physicsEnabled=!1,t.stopSimulation()}),this.body.emitter.on("restorePhysics",function(){t.setOptions(t.options),!0===t.ready&&t.startSimulation()}),this.body.emitter.on("startSimulation",function(){!0===t.ready&&t.startSimulation()}),this.body.emitter.on("stopSimulation",function(){t.stopSimulation()}),this.body.emitter.on("destroy",function(){t.stopSimulation(!1),t.body.emitter.off()}),this.body.emitter.on("_dataChanged",function(){t.updatePhysicsData()})}},{key:"setOptions",value:function(t){void 0!==t&&(!1===t?(this.options.enabled=!1,this.physicsEnabled=!1,this.stopSimulation()):!0===t?(this.options.enabled=!0,this.physicsEnabled=!0,this.startSimulation()):(this.physicsEnabled=!0,y.selectiveNotDeepExtend(["stabilization"],this.options,t),y.mergeOptions(this.options,t,"stabilization"),void 0===t.enabled&&(this.options.enabled=!0),!1===this.options.enabled&&(this.physicsEnabled=!1,this.stopSimulation()),this.timestep=this.options.timestep)),this.init()}},{key:"init",value:function(){var t;"forceAtlas2Based"===this.options.solver?(t=this.options.forceAtlas2Based,this.nodesSolver=new v(this.body,this.physicsBody,t),this.edgesSolver=new p(this.body,this.physicsBody,t),this.gravitySolver=new g(this.body,this.physicsBody,t)):"repulsion"===this.options.solver?(t=this.options.repulsion,this.nodesSolver=new u(this.body,this.physicsBody,t),this.edgesSolver=new p(this.body,this.physicsBody,t),this.gravitySolver=new m(this.body,this.physicsBody,t)):"hierarchicalRepulsion"===this.options.solver?(t=this.options.hierarchicalRepulsion,this.nodesSolver=new c(this.body,this.physicsBody,t),this.edgesSolver=new f(this.body,this.physicsBody,t),this.gravitySolver=new m(this.body,this.physicsBody,t)):(t=this.options.barnesHut,this.nodesSolver=new l(this.body,this.physicsBody,t),this.edgesSolver=new p(this.body,this.physicsBody,t),this.gravitySolver=new m(this.body,this.physicsBody,t)),this.modelOptions=t}},{key:"initPhysics",value:function(){!0===this.physicsEnabled&&!0===this.options.enabled?!0===this.options.stabilization.enabled?this.stabilize():(this.stabilized=!1,this.ready=!0,this.body.emitter.emit("fit",{},this.layoutFailed),this.startSimulation()):(this.ready=!0,this.body.emitter.emit("fit"))}},{key:"startSimulation",value:function(){!0===this.physicsEnabled&&!0===this.options.enabled?(this.stabilized=!1,this.adaptiveTimestep=!1,this.body.emitter.emit("_resizeNodes"),void 0===this.viewFunction&&(this.viewFunction=this.simulationStep.bind(this),this.body.emitter.on("initRedraw",this.viewFunction),this.body.emitter.emit("_startRendering"))):this.body.emitter.emit("_redraw")}},{key:"stopSimulation",value:function(){var t=!(arguments.length>0&&void 0!==arguments[0])||arguments[0];this.stabilized=!0,!0===t&&this._emitStabilized(),void 0!==this.viewFunction&&(this.body.emitter.off("initRedraw",this.viewFunction),this.viewFunction=void 0,!0===t&&this.body.emitter.emit("_stopRendering"))}},{key:"simulationStep",value:function(){var t=Date.now();this.physicsTick(),(Date.now()-t<.4*this.simulationInterval||!0===this.runDoubleSpeed)&&!1===this.stabilized&&(this.physicsTick(),this.runDoubleSpeed=!0),!0===this.stabilized&&this.stopSimulation()}},{key:"_emitStabilized",value:function(){var t=this,e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:this.stabilizationIterations;(this.stabilizationIterations>1||!0===this.startedStabilization)&&setTimeout(function(){t.body.emitter.emit("stabilized",{iterations:e}),t.startedStabilization=!1,t.stabilizationIterations=0},0)}},{key:"physicsStep",value:function(){this.gravitySolver.solve(),this.nodesSolver.solve(),this.edgesSolver.solve(),this.moveNodes()}},{key:"adjustTimeStep",value:function(){!0===this._evaluateStepQuality()?this.timestep=1.2*this.timestep:this.timestep/1.2.3))return!1;return!0}},{key:"moveNodes",value:function(){for(var t=this.physicsBody.physicsNodeIndices,e=0,i=0,o=0;oo&&(t=t>0?o:-o),t}},{key:"_performStep",value:function(t){var e=this.body.nodes[t],i=this.physicsBody.forces[t],o=this.physicsBody.velocities[t];return this.previousStates[t]={x:e.x,y:e.y,vx:o.x,vy:o.y},!1===e.options.fixed.x?(o.x=this.calculateComponentVelocity(o.x,i.x,e.options.mass),e.x+=o.x*this.timestep):(i.x=0,o.x=0),!1===e.options.fixed.y?(o.y=this.calculateComponentVelocity(o.y,i.y,e.options.mass),e.y+=o.y*this.timestep):(i.y=0,o.y=0),Math.sqrt(Math.pow(o.x,2)+Math.pow(o.y,2))}},{key:"_freezeNodes",value:function(){var t=this.body.nodes;for(var e in t)if(t.hasOwnProperty(e)&&t[e].x&&t[e].y){var i=t[e].options.fixed;this.freezeCache[e]={x:i.x,y:i.y},i.x=!0,i.y=!0}}},{key:"_restoreFrozenNodes",value:function(){var t=this.body.nodes;for(var e in t)t.hasOwnProperty(e)&&void 0!==this.freezeCache[e]&&(t[e].options.fixed.x=this.freezeCache[e].x,t[e].options.fixed.y=this.freezeCache[e].y);this.freezeCache={}}},{key:"stabilize",value:function(){var t=this,e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:this.options.stabilization.iterations;if("number"!=typeof e&&(e=this.options.stabilization.iterations,console.log("The stabilize method needs a numeric amount of iterations. Switching to default: ",e)),0===this.physicsBody.physicsNodeIndices.length)return void(this.ready=!0);this.adaptiveTimestep=this.options.adaptiveTimestep,this.body.emitter.emit("_resizeNodes"),this.stopSimulation(),this.stabilized=!1,this.body.emitter.emit("_blockRedraw"),this.targetIterations=e,!0===this.options.stabilization.onlyDynamicEdges&&this._freezeNodes(),this.stabilizationIterations=0,setTimeout(function(){return t._stabilizationBatch()},0)}},{key:"_startStabilizing",value:function(){return!0!==this.startedStabilization&&(this.body.emitter.emit("startStabilizing"),this.startedStabilization=!0,!0)}},{key:"_stabilizationBatch",value:function(){var t=this,e=function(){return!1===t.stabilized&&t.stabilizationIterations0){var s=n.edges.length+1,r=this.options.centralGravity*s*n.options.mass;o[n.id].x=e*r,o[n.id].y=i*r}}}]),e}(m.default);e.default=v},function(t,e,i){function o(t){return t&&t.__esModule?t:{default:t}}Object.defineProperty(e,"__esModule",{value:!0});var n=i(8),s=o(n),r=i(6),a=o(r),h=i(0),d=o(h),l=i(1),u=o(l),c=i(2),p=i(76).default,f=i(228).default,m=i(74).default,v=i(47).default,g=function(){function t(e){var i=this;(0,d.default)(this,t),this.body=e,this.clusteredNodes={},this.clusteredEdges={},this.options={},this.defaultOptions={},c.extend(this.options,this.defaultOptions),this.body.emitter.on("_resetData",function(){i.clusteredNodes={},i.clusteredEdges={}})}return(0,u.default)(t,[{key:"clusterByHubsize",value:function(t,e){void 0===t?t=this._getHubSize():"object"===(void 0===t?"undefined":(0,a.default)(t))&&(e=this._checkOptions(t),t=this._getHubSize());for(var i=[],o=0;o=t&&i.push(n.id)}for(var s=0;s0&&void 0!==arguments[0]?arguments[0]:{},i=!(arguments.length>1&&void 0!==arguments[1])||arguments[1];if(void 0===e.joinCondition)throw new Error("Cannot call clusterByNodeData without a joinCondition function in the options.");e=this._checkOptions(e);var o={},n={};c.forEach(this.body.nodes,function(i,s){var r=p.cloneOptions(i);!0===e.joinCondition(r)&&(o[s]=i,c.forEach(i.edges,function(e){void 0===t.clusteredEdges[e.id]&&(n[e.id]=e)}))}),this._cluster(o,n,e,i)}},{key:"clusterByEdgeCount",value:function(t,e){var i=this,o=!(arguments.length>2&&void 0!==arguments[2])||arguments[2];e=this._checkOptions(e);for(var n=[],r={},a=void 0,h=void 0,d=void 0,l=0;l0&&(0,s.default)(m).length>0&&!0===b)if(c=function(){for(var t=0;t1&&void 0!==arguments[1])||arguments[1];this.clusterByEdgeCount(1,t,e)}},{key:"clusterBridges",value:function(t){var e=!(arguments.length>1&&void 0!==arguments[1])||arguments[1];this.clusterByEdgeCount(2,t,e)}},{key:"clusterByConnection",value:function(t,e){var i=!(arguments.length>2&&void 0!==arguments[2])||arguments[2];if(void 0===t)throw new Error("No nodeId supplied to clusterByConnection!");if(void 0===this.body.nodes[t])throw new Error("The nodeId given to clusterByConnection does not exist!");var o=this.body.nodes[t];e=this._checkOptions(e,o),void 0===e.clusterNodeProperties.x&&(e.clusterNodeProperties.x=o.x),void 0===e.clusterNodeProperties.y&&(e.clusterNodeProperties.y=o.y),void 0===e.clusterNodeProperties.fixed&&(e.clusterNodeProperties.fixed={},e.clusterNodeProperties.fixed.x=o.options.fixed.x,e.clusterNodeProperties.fixed.y=o.options.fixed.y);var n={},r={},a=o.id,h=p.cloneOptions(o);n[a]=o;for(var d=0;d-1&&(r[g.id]=g)}this._cluster(n,r,e,i)}},{key:"_createClusterEdges",value:function(t,e,i,o){for(var n=void 0,r=void 0,a=void 0,h=void 0,d=void 0,l=void 0,u=(0,s.default)(t),c=[],p=0;p0&&void 0!==arguments[0]?arguments[0]:{};return void 0===t.clusterEdgeProperties&&(t.clusterEdgeProperties={}),void 0===t.clusterNodeProperties&&(t.clusterNodeProperties={}),t}},{key:"_cluster",value:function(t,e,i){var o=!(arguments.length>3&&void 0!==arguments[3])||arguments[3];if(0!=(0,s.default)(t).length&&(1!=(0,s.default)(t).length||1==i.clusterNodeProperties.allowSingleNodeCluster)){for(var n in t)if(t.hasOwnProperty(n)&&void 0!==this.clusteredNodes[n])return;var r=c.deepExtend({},i.clusterNodeProperties);if(void 0!==i.processProperties){var a=[];for(var h in t)if(t.hasOwnProperty(h)){var d=p.cloneOptions(t[h]);a.push(d)}var l=[];for(var u in e)if(e.hasOwnProperty(u)&&"clusterEdge:"!==u.substr(0,12)){var m=p.cloneOptions(e[u],"edge");l.push(m)}if(!(r=i.processProperties(r,a,l)))throw new Error("The processProperties function does not return properties!")}void 0===r.id&&(r.id="cluster:"+c.randomUUID());var v=r.id;void 0===r.label&&(r.label="cluster");var g=void 0;void 0===r.x&&(g=this._getClusterPosition(t),r.x=g.x),void 0===r.y&&(void 0===g&&(g=this._getClusterPosition(t)),r.y=g.y),r.id=v;var y=this.body.functions.createNode(r,f);y.containedNodes=t,y.containedEdges=e,y.clusterEdgeProperties=i.clusterEdgeProperties,this.body.nodes[r.id]=y,this._clusterEdges(t,e,r,i.clusterEdgeProperties),r.id=void 0,!0===o&&this.body.emitter.emit("_dataChanged")}}},{key:"_backupEdgeOptions",value:function(t){void 0===this.clusteredEdges[t.id]&&(this.clusteredEdges[t.id]={physics:t.options.physics})}},{key:"_restoreEdge",value:function(t){var e=this.clusteredEdges[t.id];void 0!==e&&(t.setOptions({physics:e.physics}),delete this.clusteredEdges[t.id])}},{key:"isCluster",value:function(t){return void 0!==this.body.nodes[t]?!0===this.body.nodes[t].isCluster:(console.log("Node does not exist."),!1)}},{key:"_getClusterPosition",value:function(t){for(var e=(0,s.default)(t),i=t[e[0]].x,o=t[e[0]].x,n=t[e[0]].y,r=t[e[0]].y,a=void 0,h=1;ho?a.x:o,n=a.yr?a.y:r;return{x:.5*(i+o),y:.5*(n+r)}}},{key:"openCluster",value:function(t,e){var i=!(arguments.length>2&&void 0!==arguments[2])||arguments[2];if(void 0===t)throw new Error("No clusterNodeId supplied to openCluster.");var o=this.body.nodes[t];if(void 0===o)throw new Error("The clusterNodeId supplied to openCluster does not exist.");if(!0!==o.isCluster||void 0===o.containedNodes||void 0===o.containedEdges)throw new Error("The node:"+t+" is not a valid cluster.");var n=this.findNode(t),s=n.indexOf(t)-1;if(s>=0){var r=n[s];return this.body.nodes[r]._openChildCluster(t),delete this.body.nodes[t],void(!0===i&&this.body.emitter.emit("_dataChanged"))}var a=o.containedNodes,h=o.containedEdges;if(void 0!==e&&void 0!==e.releaseFunction&&"function"==typeof e.releaseFunction){var d={},l={x:o.x,y:o.y};for(var u in a)if(a.hasOwnProperty(u)){var p=this.body.nodes[u];d[u]={x:p.x,y:p.y}}var f=e.releaseFunction(l,d);for(var m in a)if(a.hasOwnProperty(m)){var v=this.body.nodes[m];void 0!==f[m]&&(v.x=void 0===f[m].x?o.x:f[m].x,v.y=void 0===f[m].y?o.y:f[m].y)}}else c.forEach(a,function(t){!1===t.options.fixed.x&&(t.x=o.x),!1===t.options.fixed.y&&(t.y=o.y)});for(var g in a)if(a.hasOwnProperty(g)){var y=this.body.nodes[g];y.vx=o.vx,y.vy=o.vy,y.setOptions({physics:!0}),delete this.clusteredNodes[g]}for(var b=[],_=0;_0&&n<100;){var s=e.pop();if(void 0!==s){var r=this.body.edges[s];if(void 0!==r){n++;var a=r.clusteringEdgeReplacingIds;if(void 0===a)o.push(s);else for(var h=0;ho&&(o=s.edges.length),t+=s.edges.length,e+=Math.pow(s.edges.length,2),i+=1}t/=i,e/=i;var r=e-Math.pow(t,2),a=Math.sqrt(r),h=Math.floor(t+2*a);return h>o&&(h=o),h}},{key:"_createClusteredEdge",value:function(t,e,i,o,n){var s=p.cloneOptions(i,"edge");c.deepExtend(s,o),s.from=t,s.to=e,s.id="clusterEdge:"+c.randomUUID(),void 0!==n&&c.deepExtend(s,n);var r=this.body.functions.createEdge(s);return r.clusteringEdgeReplacingIds=[i.id],r.connect(),this.body.edges[r.id]=r,r}},{key:"_clusterEdges",value:function(t,e,i,o){if(e instanceof m){var n=e,s={};s[n.id]=n,e=s}if(t instanceof v){var r=t,a={};a[r.id]=r,t=a}if(void 0===i||null===i)throw new Error("_clusterEdges: parameter clusterNode required");void 0===o&&(o=i.clusterEdgeProperties),this._createClusterEdges(t,e,i,o);for(var h in e)if(e.hasOwnProperty(h)&&void 0!==this.body.edges[h]){var d=this.body.edges[h];this._backupEdgeOptions(d),d.setOptions({physics:!1})}for(var l in t)t.hasOwnProperty(l)&&(this.clusteredNodes[l]={clusterId:i.id,node:this.body.nodes[l]},this.body.nodes[l].setOptions({physics:!1}))}},{key:"_getClusterNodeForNode",value:function(t){if(void 0!==t){var e=this.clusteredNodes[t];if(void 0!==e){var i=e.clusterId;if(void 0!==i)return this.body.nodes[i]}}}},{key:"_filter",value:function(t,e){var i=[];return c.forEach(t,function(t){e(t)&&i.push(t)}),i}},{key:"_updateState",value:function(){var t=this,e=void 0,i=[],o=[],n=function(e){c.forEach(t.body.nodes,function(t){!0===t.isCluster&&e(t)})};for(e in this.clusteredNodes)if(this.clusteredNodes.hasOwnProperty(e)){var r=this.body.nodes[e];void 0===r&&i.push(e)}n(function(t){for(var e=0;e0}e.endPointsValid()&&n||o.push(i)}),n(function(e){c.forEach(o,function(i){delete e.containedEdges[i],c.forEach(e.edges,function(n,s){if(n.id===i)return void(e.edges[s]=null);n.clusteringEdgeReplacingIds=t._filter(n.clusteringEdgeReplacingIds,function(t){return-1===o.indexOf(t)})}),e.edges=t._filter(e.edges,function(t){return null!==t})})}),c.forEach(o,function(e){delete t.clusteredEdges[e]}),c.forEach(o,function(e){delete t.body.edges[e]});var h=(0,s.default)(this.body.edges);c.forEach(h,function(e){var i=t.body.edges[e],o=t._isClusteredNode(i.fromId)||t._isClusteredNode(i.toId);if(o!==t._isClusteredEdge(i.id)){if(!o)throw new Error("remove edge from clustering not implemented!");var n=t._getClusterNodeForNode(i.fromId);void 0!==n&&t._clusterEdges(t.body.nodes[i.fromId],i,n);var s=t._getClusterNodeForNode(i.toId);void 0!==s&&t._clusterEdges(t.body.nodes[i.toId],i,s)}});for(var d=!1,l=!0;l;)!function(){var e=[];n(function(t){var i=(0,s.default)(t.containedNodes).length,o=!0===t.options.allowSingleNodeCluster;(o&&i<1||!o&&i<2)&&e.push(t.id)});for(var i=0;i0,d=d||l}();d&&this._updateState()}},{key:"_isClusteredNode",value:function(t){return void 0!==this.clusteredNodes[t]}},{key:"_isClusteredEdge",value:function(t){return void 0!==this.clusteredEdges[t]}}]),t}();e.default=g},function(t,e,i){function o(t){return t&&t.__esModule?t:{default:t}}Object.defineProperty(e,"__esModule",{value:!0});var n=i(3),s=o(n),r=i(0),a=o(r),h=i(1),d=o(h),l=i(4),u=o(l),c=i(5),p=o(c),f=i(2),m=i(47).default,v=function(t){function e(t,i,o,n,r,h){(0,a.default)(this,e);var d=(0,u.default)(this,(e.__proto__||(0,s.default)(e)).call(this,t,i,o,n,r,h));return d.isCluster=!0,d.containedNodes={},d.containedEdges={},d}return(0,p.default)(e,t),(0,d.default)(e,[{key:"_openChildCluster",value:function(t){var e=this,i=this.body.nodes[t];if(void 0===this.containedNodes[t])throw new Error("node with id: "+t+" not in current cluster");if(!i.isCluster)throw new Error("node with id: "+t+" is not a cluster");delete this.containedNodes[t],f.forEach(i.edges,function(t){delete e.containedEdges[t.id]}),f.forEach(i.containedNodes,function(t,i){e.containedNodes[i]=t}),i.containedNodes={},f.forEach(i.containedEdges,function(t,i){e.containedEdges[i]=t}),i.containedEdges={},f.forEach(i.edges,function(t){f.forEach(e.edges,function(i){var o=i.clusteringEdgeReplacingIds.indexOf(t.id);-1!==o&&(f.forEach(t.clusteringEdgeReplacingIds,function(t){i.clusteringEdgeReplacingIds.push(t),e.body.edges[t].edgeReplacedById=i.id}),i.clusteringEdgeReplacingIds.splice(o,1))})}),i.edges=[]}}]),e}(m);e.default=v},function(t,e,i){function o(t){return t&&t.__esModule?t:{default:t}}function n(){var t;void 0!==window&&(t=window.requestAnimationFrame||window.mozRequestAnimationFrame||window.webkitRequestAnimationFrame||window.msRequestAnimationFrame),window.requestAnimationFrame=void 0===t?function(t){t()}:t}Object.defineProperty(e,"__esModule",{value:!0});var s=i(0),r=o(s),a=i(1),h=o(a),d=i(2),l=function(){function t(e,i){(0,r.default)(this,t),n(),this.body=e,this.canvas=i,this.redrawRequested=!1,this.renderTimer=void 0,this.requiresTimeout=!0,this.renderingActive=!1,this.renderRequests=0,this.allowRedraw=!0,this.dragging=!1,this.options={},this.defaultOptions={hideEdgesOnDrag:!1,hideNodesOnDrag:!1},d.extend(this.options,this.defaultOptions),this._determineBrowserMethod(),this.bindEventListeners()}return(0,h.default)(t,[{key:"bindEventListeners",value:function(){var t=this;this.body.emitter.on("dragStart",function(){t.dragging=!0}),this.body.emitter.on("dragEnd",function(){t.dragging=!1}),this.body.emitter.on("_resizeNodes",function(){t._resizeNodes()}),this.body.emitter.on("_redraw",function(){!1===t.renderingActive&&t._redraw()}),this.body.emitter.on("_blockRedraw",function(){t.allowRedraw=!1}),this.body.emitter.on("_allowRedraw",function(){t.allowRedraw=!0,t.redrawRequested=!1}),this.body.emitter.on("_requestRedraw",this._requestRedraw.bind(this)),this.body.emitter.on("_startRendering",function(){t.renderRequests+=1,t.renderingActive=!0,t._startRendering()}),this.body.emitter.on("_stopRendering",function(){t.renderRequests-=1,t.renderingActive=t.renderRequests>0,t.renderTimer=void 0}),this.body.emitter.on("destroy",function(){t.renderRequests=0,t.allowRedraw=!1,t.renderingActive=!1,!0===t.requiresTimeout?clearTimeout(t.renderTimer):window.cancelAnimationFrame(t.renderTimer),t.body.emitter.off()})}},{key:"setOptions",value:function(t){if(void 0!==t){var e=["hideEdgesOnDrag","hideNodesOnDrag"];d.selectiveDeepExtend(e,this.options,t)}}},{key:"_requestNextFrame",value:function(t,e){if("undefined"!=typeof window){var i=void 0,o=window;return!0===this.requiresTimeout?i=o.setTimeout(t,e):o.requestAnimationFrame&&(i=o.requestAnimationFrame(t)),i}}},{key:"_startRendering",value:function(){!0===this.renderingActive&&void 0===this.renderTimer&&(this.renderTimer=this._requestNextFrame(this._renderStep.bind(this),this.simulationInterval))}},{key:"_renderStep",value:function(){!0===this.renderingActive&&(this.renderTimer=void 0,!0===this.requiresTimeout&&this._startRendering(),this._redraw(),!1===this.requiresTimeout&&this._startRendering())}},{key:"redraw",value:function(){this.body.emitter.emit("setSize"),this._redraw()}},{key:"_requestRedraw",value:function(){var t=this;!0!==this.redrawRequested&&!1===this.renderingActive&&!0===this.allowRedraw&&(this.redrawRequested=!0,this._requestNextFrame(function(){t._redraw(!1)},0))}},{key:"_redraw",value:function(){var t=arguments.length>0&&void 0!==arguments[0]&&arguments[0];if(!0===this.allowRedraw){this.body.emitter.emit("initRedraw"),this.redrawRequested=!1,0!==this.canvas.frame.canvas.width&&0!==this.canvas.frame.canvas.height||this.canvas.setSize(),this.canvas.setTransform();var e=this.canvas.getContext(),i=this.canvas.frame.canvas.clientWidth,o=this.canvas.frame.canvas.clientHeight;if(e.clearRect(0,0,i,o),0===this.canvas.frame.clientWidth)return;e.save(),e.translate(this.body.view.translation.x,this.body.view.translation.y),e.scale(this.body.view.scale,this.body.view.scale),e.beginPath(),this.body.emitter.emit("beforeDrawing",e),e.closePath(),!1===t&&(!1===this.dragging||!0===this.dragging&&!1===this.options.hideEdgesOnDrag)&&this._drawEdges(e),(!1===this.dragging||!0===this.dragging&&!1===this.options.hideNodesOnDrag)&&this._drawNodes(e,t),e.beginPath(),this.body.emitter.emit("afterDrawing",e),e.closePath(),e.restore(),!0===t&&e.clearRect(0,0,i,o)}}},{key:"_resizeNodes",value:function(){this.canvas.setTransform();var t=this.canvas.getContext();t.save(),t.translate(this.body.view.translation.x,this.body.view.translation.y),t.scale(this.body.view.scale,this.body.view.scale);var e=this.body.nodes,i=void 0;for(var o in e)e.hasOwnProperty(o)&&(i=e[o],i.resize(t),i.updateBoundingBox(t,i.selected));t.restore()}},{key:"_drawNodes",value:function(t){for(var e=arguments.length>1&&void 0!==arguments[1]&&arguments[1],i=this.body.nodes,o=this.body.nodeIndices,n=void 0,s=[],r=this.canvas.DOMtoCanvas({x:-20,y:-20}),a=this.canvas.DOMtoCanvas({x:this.canvas.frame.canvas.clientWidth+20,y:this.canvas.frame.canvas.clientHeight+20}),h={top:r.y,left:r.x,bottom:a.y,right:a.x},d=0;d0&&void 0!==arguments[0]?arguments[0]:this.pixelRatio;!0===this.initialized&&(this.cameraState.previousWidth=this.frame.canvas.width/t,this.cameraState.previousHeight=this.frame.canvas.height/t,this.cameraState.scale=this.body.view.scale,this.cameraState.position=this.DOMtoCanvas({x:.5*this.frame.canvas.width/t,y:.5*this.frame.canvas.height/t}))}},{key:"_setCameraState",value:function(){if(void 0!==this.cameraState.scale&&0!==this.frame.canvas.clientWidth&&0!==this.frame.canvas.clientHeight&&0!==this.pixelRatio&&this.cameraState.previousWidth>0){var t=this.frame.canvas.width/this.pixelRatio/this.cameraState.previousWidth,e=this.frame.canvas.height/this.pixelRatio/this.cameraState.previousHeight,i=this.cameraState.scale;1!=t&&1!=e?i=.5*this.cameraState.scale*(t+e):1!=t?i=this.cameraState.scale*t:1!=e&&(i=this.cameraState.scale*e),this.body.view.scale=i;var o=this.DOMtoCanvas({x:.5*this.frame.canvas.clientWidth,y:.5*this.frame.canvas.clientHeight}),n={x:o.x-this.cameraState.position.x,y:o.y-this.cameraState.position.y};this.body.view.translation.x+=n.x*this.body.view.scale,this.body.view.translation.y+=n.y*this.body.view.scale}}},{key:"_prepareValue",value:function(t){if("number"==typeof t)return t+"px";if("string"==typeof t){if(-1!==t.indexOf("%")||-1!==t.indexOf("px"))return t;if(-1===t.indexOf("%"))return t+"px"}throw new Error("Could not use the value supplied for width or height:"+t)}},{key:"_create",value:function(){for(;this.body.container.hasChildNodes();)this.body.container.removeChild(this.body.container.firstChild);if(this.frame=document.createElement("div"),this.frame.className="vis-network",this.frame.style.position="relative",this.frame.style.overflow="hidden",this.frame.tabIndex=900,this.frame.canvas=document.createElement("canvas"),this.frame.canvas.style.position="relative",this.frame.appendChild(this.frame.canvas),this.frame.canvas.getContext)this._setPixelRatio(),this.setTransform();else{var t=document.createElement("DIV");t.style.color="red",t.style.fontWeight="bold",t.style.padding="10px",t.innerHTML="Error: your browser does not support HTML canvas",this.frame.canvas.appendChild(t)}this.body.container.appendChild(this.frame),this.body.view.scale=1,this.body.view.translation={x:.5*this.frame.canvas.clientWidth,y:.5*this.frame.canvas.clientHeight},this._bindHammer()}},{key:"_bindHammer",value:function(){var t=this;void 0!==this.hammer&&this.hammer.destroy(),this.drag={},this.pinch={},this.hammer=new h(this.frame.canvas),this.hammer.get("pinch").set({enable:!0}),this.hammer.get("pan").set({threshold:5,direction:h.DIRECTION_ALL}),d.onTouch(this.hammer,function(e){t.body.eventListeners.onTouch(e)}),this.hammer.on("tap",function(e){t.body.eventListeners.onTap(e)}),this.hammer.on("doubletap",function(e){t.body.eventListeners.onDoubleTap(e)}),this.hammer.on("press",function(e){t.body.eventListeners.onHold(e)}),this.hammer.on("panstart",function(e){t.body.eventListeners.onDragStart(e)}),this.hammer.on("panmove",function(e){t.body.eventListeners.onDrag(e)}),this.hammer.on("panend",function(e){t.body.eventListeners.onDragEnd(e)}),this.hammer.on("pinch",function(e){t.body.eventListeners.onPinch(e)}),this.frame.canvas.addEventListener("mousewheel",function(e){t.body.eventListeners.onMouseWheel(e)}),this.frame.canvas.addEventListener("DOMMouseScroll",function(e){t.body.eventListeners.onMouseWheel(e)}),this.frame.canvas.addEventListener("mousemove",function(e){t.body.eventListeners.onMouseMove(e)}),this.frame.canvas.addEventListener("contextmenu",function(e){t.body.eventListeners.onContext(e)}),this.hammerFrame=new h(this.frame),d.onRelease(this.hammerFrame,function(e){t.body.eventListeners.onRelease(e)})}},{key:"setSize",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:this.options.width,e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:this.options.height;t=this._prepareValue(t),e=this._prepareValue(e);var i=!1,o=this.frame.canvas.width,n=this.frame.canvas.height,s=this.pixelRatio;if(this._setPixelRatio(),t!=this.options.width||e!=this.options.height||this.frame.style.width!=t||this.frame.style.height!=e)this._getCameraState(s),this.frame.style.width=t,this.frame.style.height=e,this.frame.canvas.style.width="100%",this.frame.canvas.style.height="100%",this.frame.canvas.width=Math.round(this.frame.canvas.clientWidth*this.pixelRatio),this.frame.canvas.height=Math.round(this.frame.canvas.clientHeight*this.pixelRatio),this.options.width=t,this.options.height=e,this.canvasViewCenter={x:.5*this.frame.clientWidth,y:.5*this.frame.clientHeight},i=!0;else{var r=Math.round(this.frame.canvas.clientWidth*this.pixelRatio),a=Math.round(this.frame.canvas.clientHeight*this.pixelRatio);this.frame.canvas.width===r&&this.frame.canvas.height===a||this._getCameraState(s), +this.frame.canvas.width!==r&&(this.frame.canvas.width=r,i=!0),this.frame.canvas.height!==a&&(this.frame.canvas.height=a,i=!0)}return!0===i&&(this.body.emitter.emit("resize",{width:Math.round(this.frame.canvas.width/this.pixelRatio),height:Math.round(this.frame.canvas.height/this.pixelRatio),oldWidth:Math.round(o/this.pixelRatio),oldHeight:Math.round(n/this.pixelRatio)}),this._setCameraState()),this.initialized=!0,i}},{key:"getContext",value:function(){return this.frame.canvas.getContext("2d")}},{key:"_determinePixelRatio",value:function(){var t=this.getContext();if(void 0===t)throw new Error("Could not get canvax context");var e=1;return"undefined"!=typeof window&&(e=window.devicePixelRatio||1),e/(t.webkitBackingStorePixelRatio||t.mozBackingStorePixelRatio||t.msBackingStorePixelRatio||t.oBackingStorePixelRatio||t.backingStorePixelRatio||1)}},{key:"_setPixelRatio",value:function(){this.pixelRatio=this._determinePixelRatio()}},{key:"setTransform",value:function(){var t=this.getContext();if(void 0===t)throw new Error("Could not get canvax context");t.setTransform(this.pixelRatio,0,0,this.pixelRatio,0,0)}},{key:"_XconvertDOMtoCanvas",value:function(t){return(t-this.body.view.translation.x)/this.body.view.scale}},{key:"_XconvertCanvasToDOM",value:function(t){return t*this.body.view.scale+this.body.view.translation.x}},{key:"_YconvertDOMtoCanvas",value:function(t){return(t-this.body.view.translation.y)/this.body.view.scale}},{key:"_YconvertCanvasToDOM",value:function(t){return t*this.body.view.scale+this.body.view.translation.y}},{key:"canvasToDOM",value:function(t){return{x:this._XconvertCanvasToDOM(t.x),y:this._YconvertCanvasToDOM(t.y)}}},{key:"DOMtoCanvas",value:function(t){return{x:this._XconvertDOMtoCanvas(t.x),y:this._YconvertDOMtoCanvas(t.y)}}}]),t}();e.default=u},function(t,e,i){function o(t){return t&&t.__esModule?t:{default:t}}Object.defineProperty(e,"__esModule",{value:!0});var n=i(0),s=o(n),r=i(1),a=o(r),h=i(2),d=i(76).default,l=function(){function t(e,i){var o=this;(0,s.default)(this,t),this.body=e,this.canvas=i,this.animationSpeed=1/this.renderRefreshRate,this.animationEasingFunction="easeInOutQuint",this.easingTime=0,this.sourceScale=0,this.targetScale=0,this.sourceTranslation=0,this.targetTranslation=0,this.lockedOnNodeId=void 0,this.lockedOnNodeOffset=void 0,this.touchTime=0,this.viewFunction=void 0,this.body.emitter.on("fit",this.fit.bind(this)),this.body.emitter.on("animationFinished",function(){o.body.emitter.emit("_stopRendering")}),this.body.emitter.on("unlockNode",this.releaseNode.bind(this))}return(0,a.default)(t,[{key:"setOptions",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};this.options=t}},{key:"fit",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{nodes:[]},e=arguments.length>1&&void 0!==arguments[1]&&arguments[1],i=void 0,o=void 0;if(void 0!==t.nodes&&0!==t.nodes.length||(t.nodes=this.body.nodeIndices),!0===e){var n=0;for(var s in this.body.nodes)if(this.body.nodes.hasOwnProperty(s)){var r=this.body.nodes[s];!0===r.predefinedPosition&&(n+=1)}if(n>.5*this.body.nodeIndices.length)return void this.fit(t,!1);i=d.getRange(this.body.nodes,t.nodes);o=12.662/(this.body.nodeIndices.length+7.4147)+.0964822;o*=Math.min(this.canvas.frame.canvas.clientWidth/600,this.canvas.frame.canvas.clientHeight/600)}else{this.body.emitter.emit("_resizeNodes"),i=d.getRange(this.body.nodes,t.nodes);var a=1.1*Math.abs(i.maxX-i.minX),h=1.1*Math.abs(i.maxY-i.minY),l=this.canvas.frame.canvas.clientWidth/a,u=this.canvas.frame.canvas.clientHeight/h;o=l<=u?l:u}o>1?o=1:0===o&&(o=1);var c=d.findCenter(i),p={position:c,scale:o,animation:t.animation};this.moveTo(p)}},{key:"focus",value:function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};if(void 0!==this.body.nodes[t]){var i={x:this.body.nodes[t].x,y:this.body.nodes[t].y};e.position=i,e.lockedOnNode=t,this.moveTo(e)}else console.log("Node: "+t+" cannot be found.")}},{key:"moveTo",value:function(t){if(void 0===t)return void(t={});void 0===t.offset&&(t.offset={x:0,y:0}),void 0===t.offset.x&&(t.offset.x=0),void 0===t.offset.y&&(t.offset.y=0),void 0===t.scale&&(t.scale=this.body.view.scale),void 0===t.position&&(t.position=this.getViewPosition()),void 0===t.animation&&(t.animation={duration:0}),!1===t.animation&&(t.animation={duration:0}),!0===t.animation&&(t.animation={}),void 0===t.animation.duration&&(t.animation.duration=1e3),void 0===t.animation.easingFunction&&(t.animation.easingFunction="easeInOutQuad"),this.animateView(t)}},{key:"animateView",value:function(t){if(void 0!==t){this.animationEasingFunction=t.animation.easingFunction,this.releaseNode(),!0===t.locked&&(this.lockedOnNodeId=t.lockedOnNode,this.lockedOnNodeOffset=t.offset),0!=this.easingTime&&this._transitionRedraw(!0),this.sourceScale=this.body.view.scale,this.sourceTranslation=this.body.view.translation,this.targetScale=t.scale,this.body.view.scale=this.targetScale;var e=this.canvas.DOMtoCanvas({x:.5*this.canvas.frame.canvas.clientWidth,y:.5*this.canvas.frame.canvas.clientHeight}),i={x:e.x-t.position.x,y:e.y-t.position.y};this.targetTranslation={x:this.sourceTranslation.x+i.x*this.targetScale+t.offset.x,y:this.sourceTranslation.y+i.y*this.targetScale+t.offset.y},0===t.animation.duration?void 0!=this.lockedOnNodeId?(this.viewFunction=this._lockedRedraw.bind(this),this.body.emitter.on("initRedraw",this.viewFunction)):(this.body.view.scale=this.targetScale,this.body.view.translation=this.targetTranslation,this.body.emitter.emit("_requestRedraw")):(this.animationSpeed=1/(60*t.animation.duration*.001)||1/60,this.animationEasingFunction=t.animation.easingFunction,this.viewFunction=this._transitionRedraw.bind(this),this.body.emitter.on("initRedraw",this.viewFunction),this.body.emitter.emit("_startRendering"))}}},{key:"_lockedRedraw",value:function(){var t={x:this.body.nodes[this.lockedOnNodeId].x,y:this.body.nodes[this.lockedOnNodeId].y},e=this.canvas.DOMtoCanvas({x:.5*this.canvas.frame.canvas.clientWidth,y:.5*this.canvas.frame.canvas.clientHeight}),i={x:e.x-t.x,y:e.y-t.y},o=this.body.view.translation,n={x:o.x+i.x*this.body.view.scale+this.lockedOnNodeOffset.x,y:o.y+i.y*this.body.view.scale+this.lockedOnNodeOffset.y};this.body.view.translation=n}},{key:"releaseNode",value:function(){void 0!==this.lockedOnNodeId&&void 0!==this.viewFunction&&(this.body.emitter.off("initRedraw",this.viewFunction),this.lockedOnNodeId=void 0,this.lockedOnNodeOffset=void 0)}},{key:"_transitionRedraw",value:function(){var t=arguments.length>0&&void 0!==arguments[0]&&arguments[0];this.easingTime+=this.animationSpeed,this.easingTime=!0===t?1:this.easingTime;var e=h.easingFunctions[this.animationEasingFunction](this.easingTime);this.body.view.scale=this.sourceScale+(this.targetScale-this.sourceScale)*e,this.body.view.translation={x:this.sourceTranslation.x+(this.targetTranslation.x-this.sourceTranslation.x)*e,y:this.sourceTranslation.y+(this.targetTranslation.y-this.sourceTranslation.y)*e},this.easingTime>=1&&(this.body.emitter.off("initRedraw",this.viewFunction),this.easingTime=0,void 0!=this.lockedOnNodeId&&(this.viewFunction=this._lockedRedraw.bind(this),this.body.emitter.on("initRedraw",this.viewFunction)),this.body.emitter.emit("animationFinished"))}},{key:"getScale",value:function(){return this.body.view.scale}},{key:"getViewPosition",value:function(){return this.canvas.DOMtoCanvas({x:.5*this.canvas.frame.canvas.clientWidth,y:.5*this.canvas.frame.canvas.clientHeight})}}]),t}();e.default=l},function(t,e,i){function o(t){return t&&t.__esModule?t:{default:t}}Object.defineProperty(e,"__esModule",{value:!0});var n=i(0),s=o(n),r=i(1),a=o(r),h=i(2),d=i(233).default,l=i(104).default,u=function(){function t(e,i,o){(0,s.default)(this,t),this.body=e,this.canvas=i,this.selectionHandler=o,this.navigationHandler=new d(e,i),this.body.eventListeners.onTap=this.onTap.bind(this),this.body.eventListeners.onTouch=this.onTouch.bind(this),this.body.eventListeners.onDoubleTap=this.onDoubleTap.bind(this),this.body.eventListeners.onHold=this.onHold.bind(this),this.body.eventListeners.onDragStart=this.onDragStart.bind(this),this.body.eventListeners.onDrag=this.onDrag.bind(this),this.body.eventListeners.onDragEnd=this.onDragEnd.bind(this),this.body.eventListeners.onMouseWheel=this.onMouseWheel.bind(this),this.body.eventListeners.onPinch=this.onPinch.bind(this),this.body.eventListeners.onMouseMove=this.onMouseMove.bind(this),this.body.eventListeners.onRelease=this.onRelease.bind(this),this.body.eventListeners.onContext=this.onContext.bind(this),this.touchTime=0,this.drag={},this.pinch={},this.popup=void 0,this.popupObj=void 0,this.popupTimer=void 0,this.body.functions.getPointer=this.getPointer.bind(this),this.options={},this.defaultOptions={dragNodes:!0,dragView:!0,hover:!1,keyboard:{enabled:!1,speed:{x:10,y:10,zoom:.02},bindToWindow:!0},navigationButtons:!1,tooltipDelay:300,zoomView:!0},h.extend(this.options,this.defaultOptions),this.bindEventListeners()}return(0,a.default)(t,[{key:"bindEventListeners",value:function(){var t=this;this.body.emitter.on("destroy",function(){clearTimeout(t.popupTimer),delete t.body.functions.getPointer})}},{key:"setOptions",value:function(t){if(void 0!==t){var e=["hideEdgesOnDrag","hideNodesOnDrag","keyboard","multiselect","selectable","selectConnectedEdges"];h.selectiveNotDeepExtend(e,this.options,t),h.mergeOptions(this.options,t,"keyboard"),t.tooltip&&(h.extend(this.options.tooltip,t.tooltip),t.tooltip.color&&(this.options.tooltip.color=h.parseColor(t.tooltip.color)))}this.navigationHandler.setOptions(this.options)}},{key:"getPointer",value:function(t){return{x:t.x-h.getAbsoluteLeft(this.canvas.frame.canvas),y:t.y-h.getAbsoluteTop(this.canvas.frame.canvas)}}},{key:"onTouch",value:function(t){(new Date).valueOf()-this.touchTime>50&&(this.drag.pointer=this.getPointer(t.center),this.drag.pinched=!1,this.pinch.scale=this.body.view.scale,this.touchTime=(new Date).valueOf())}},{key:"onTap",value:function(t){var e=this.getPointer(t.center),i=this.selectionHandler.options.multiselect&&(t.changedPointers[0].ctrlKey||t.changedPointers[0].metaKey);this.checkSelectionChanges(e,t,i),this.selectionHandler._generateClickEvent("click",t,e)}},{key:"onDoubleTap",value:function(t){var e=this.getPointer(t.center);this.selectionHandler._generateClickEvent("doubleClick",t,e)}},{key:"onHold",value:function(t){var e=this.getPointer(t.center),i=this.selectionHandler.options.multiselect;this.checkSelectionChanges(e,t,i),this.selectionHandler._generateClickEvent("click",t,e),this.selectionHandler._generateClickEvent("hold",t,e)}},{key:"onRelease",value:function(t){if((new Date).valueOf()-this.touchTime>10){var e=this.getPointer(t.center);this.selectionHandler._generateClickEvent("release",t,e),this.touchTime=(new Date).valueOf()}}},{key:"onContext",value:function(t){var e=this.getPointer({x:t.clientX,y:t.clientY});this.selectionHandler._generateClickEvent("oncontext",t,e)}},{key:"checkSelectionChanges",value:function(t,e){var i=arguments.length>2&&void 0!==arguments[2]&&arguments[2],o=this.selectionHandler.getSelection(),n=!1;n=!0===i?this.selectionHandler.selectAdditionalOnPoint(t):this.selectionHandler.selectOnPoint(t);var s=this.selectionHandler.getSelection(),r=this._determineDifference(o,s),a=this._determineDifference(s,o);r.edges.length>0&&(this.selectionHandler._generateClickEvent("deselectEdge",e,t,o),n=!0),r.nodes.length>0&&(this.selectionHandler._generateClickEvent("deselectNode",e,t,o),n=!0),a.nodes.length>0&&(this.selectionHandler._generateClickEvent("selectNode",e,t),n=!0),a.edges.length>0&&(this.selectionHandler._generateClickEvent("selectEdge",e,t),n=!0),!0===n&&this.selectionHandler._generateClickEvent("select",e,t)}},{key:"_determineDifference",value:function(t,e){var i=function(t,e){for(var i=[],o=0;o10&&(t=10);var o=void 0;void 0!==this.drag&&!0===this.drag.dragging&&(o=this.canvas.DOMtoCanvas(this.drag.pointer));var n=this.body.view.translation,s=t/i,r=(1-s)*e.x+n.x*s,a=(1-s)*e.y+n.y*s;if(this.body.view.scale=t,this.body.view.translation={x:r,y:a},void 0!=o){var h=this.canvas.canvasToDOM(o);this.drag.pointer.x=h.x,this.drag.pointer.y=h.y}this.body.emitter.emit("_requestRedraw"),i0&&(this.popupObj=h[u[u.length-1]],s=!0)}if(void 0===this.popupObj&&!1===s){for(var p=this.body.edgeIndices,f=this.body.edges,m=void 0,v=[],g=0;g0&&(this.popupObj=f[v[v.length-1]],r="edge")}void 0!==this.popupObj?this.popupObj.id!==n&&(void 0===this.popup&&(this.popup=new l(this.canvas.frame)),this.popup.popupTargetType=r,this.popup.popupTargetId=this.popupObj.id,this.popup.setPosition(t.x+3,t.y-5),this.popup.setText(this.popupObj.getTitle()),this.popup.show(),this.body.emitter.emit("showPopup",this.popupObj.id)):void 0!==this.popup&&(this.popup.hide(),this.body.emitter.emit("hidePopup"))}},{key:"_checkHidePopup",value:function(t){var e=this.selectionHandler._pointerToPositionObject(t),i=!1;if("node"===this.popup.popupTargetType){if(void 0!==this.body.nodes[this.popup.popupTargetId]&&!0===(i=this.body.nodes[this.popup.popupTargetId].isOverlappingWith(e))){var o=this.selectionHandler.getNodeAt(t);i=void 0!==o&&o.id===this.popup.popupTargetId}}else void 0===this.selectionHandler.getNodeAt(t)&&void 0!==this.body.edges[this.popup.popupTargetId]&&(i=this.body.edges[this.popup.popupTargetId].isOverlappingWith(e));!1===i&&(this.popupObj=void 0,this.popup.hide(),this.body.emitter.emit("hidePopup"))}}]),t}();e.default=u},function(t,e,i){function o(t){return t&&t.__esModule?t:{default:t}}Object.defineProperty(e,"__esModule",{value:!0});var n=i(0),s=o(n),r=i(1),a=o(r),h=i(10),d=i(37),l=i(35),u=function(){function t(e,i){var o=this;(0,s.default)(this,t),this.body=e,this.canvas=i,this.iconsCreated=!1,this.navigationHammers=[],this.boundFunctions={},this.touchTime=0,this.activated=!1,this.body.emitter.on("activate",function(){o.activated=!0,o.configureKeyboardBindings()}),this.body.emitter.on("deactivate",function(){o.activated=!1,o.configureKeyboardBindings()}),this.body.emitter.on("destroy",function(){void 0!==o.keycharm&&o.keycharm.destroy()}),this.options={}}return(0,a.default)(t,[{key:"setOptions",value:function(t){void 0!==t&&(this.options=t,this.create())}},{key:"create",value:function(){!0===this.options.navigationButtons?!1===this.iconsCreated&&this.loadNavigationElements():!0===this.iconsCreated&&this.cleanNavigation(),this.configureKeyboardBindings()}},{key:"cleanNavigation",value:function(){if(0!=this.navigationHammers.length){for(var t=0;t700&&(this.body.emitter.emit("fit",{duration:700}),this.touchTime=(new Date).valueOf())}},{key:"_stopMovement",value:function(){for(var t in this.boundFunctions)this.boundFunctions.hasOwnProperty(t)&&(this.body.emitter.off("initRedraw",this.boundFunctions[t]),this.body.emitter.emit("_stopRendering"));this.boundFunctions={}}},{key:"_moveUp",value:function(){this.body.view.translation.y+=this.options.keyboard.speed.y}},{key:"_moveDown",value:function(){this.body.view.translation.y-=this.options.keyboard.speed.y}},{key:"_moveLeft",value:function(){this.body.view.translation.x+=this.options.keyboard.speed.x}},{key:"_moveRight",value:function(){this.body.view.translation.x-=this.options.keyboard.speed.x}},{key:"_zoomIn",value:function(){var t=this.body.view.scale,e=this.body.view.scale*(1+this.options.keyboard.speed.zoom),i=this.body.view.translation,o=e/t,n=(1-o)*this.canvas.canvasViewCenter.x+i.x*o,s=(1-o)*this.canvas.canvasViewCenter.y+i.y*o;this.body.view.scale=e,this.body.view.translation={x:n,y:s},this.body.emitter.emit("zoom",{direction:"+",scale:this.body.view.scale,pointer:null})}},{key:"_zoomOut",value:function(){var t=this.body.view.scale,e=this.body.view.scale/(1+this.options.keyboard.speed.zoom),i=this.body.view.translation,o=e/t,n=(1-o)*this.canvas.canvasViewCenter.x+i.x*o,s=(1-o)*this.canvas.canvasViewCenter.y+i.y*o;this.body.view.scale=e,this.body.view.translation={x:n,y:s},this.body.emitter.emit("zoom",{direction:"-",scale:this.body.view.scale,pointer:null})}},{key:"configureKeyboardBindings",value:function(){var t=this;void 0!==this.keycharm&&this.keycharm.destroy(),!0===this.options.keyboard.enabled&&(!0===this.options.keyboard.bindToWindow?this.keycharm=l({container:window,preventDefault:!0}):this.keycharm=l({container:this.canvas.frame,preventDefault:!0}),this.keycharm.reset(),!0===this.activated&&(this.keycharm.bind("up",function(){t.bindToRedraw("_moveUp")},"keydown"),this.keycharm.bind("down",function(){t.bindToRedraw("_moveDown")},"keydown"),this.keycharm.bind("left",function(){t.bindToRedraw("_moveLeft")},"keydown"),this.keycharm.bind("right",function(){t.bindToRedraw("_moveRight")},"keydown"),this.keycharm.bind("=",function(){t.bindToRedraw("_zoomIn")},"keydown"),this.keycharm.bind("num+",function(){t.bindToRedraw("_zoomIn")},"keydown"),this.keycharm.bind("num-",function(){t.bindToRedraw("_zoomOut")},"keydown"),this.keycharm.bind("-",function(){t.bindToRedraw("_zoomOut")},"keydown"),this.keycharm.bind("[",function(){t.bindToRedraw("_zoomOut")},"keydown"),this.keycharm.bind("]",function(){t.bindToRedraw("_zoomIn")},"keydown"),this.keycharm.bind("pageup",function(){t.bindToRedraw("_zoomIn")},"keydown"),this.keycharm.bind("pagedown",function(){t.bindToRedraw("_zoomOut")},"keydown"),this.keycharm.bind("up",function(){t.unbindFromRedraw("_moveUp")},"keyup"),this.keycharm.bind("down",function(){t.unbindFromRedraw("_moveDown")},"keyup"),this.keycharm.bind("left",function(){t.unbindFromRedraw("_moveLeft")},"keyup"),this.keycharm.bind("right",function(){t.unbindFromRedraw("_moveRight")},"keyup"),this.keycharm.bind("=",function(){t.unbindFromRedraw("_zoomIn")},"keyup"),this.keycharm.bind("num+",function(){t.unbindFromRedraw("_zoomIn")},"keyup"),this.keycharm.bind("num-",function(){t.unbindFromRedraw("_zoomOut")},"keyup"),this.keycharm.bind("-",function(){t.unbindFromRedraw("_zoomOut")},"keyup"),this.keycharm.bind("[",function(){t.unbindFromRedraw("_zoomOut")},"keyup"),this.keycharm.bind("]",function(){t.unbindFromRedraw("_zoomIn")},"keyup"),this.keycharm.bind("pageup",function(){t.unbindFromRedraw("_zoomIn")},"keyup"),this.keycharm.bind("pagedown",function(){t.unbindFromRedraw("_zoomOut")},"keyup")))}}]),t}();e.default=u},function(t,e,i){function o(t){return t&&t.__esModule?t:{default:t}}Object.defineProperty(e,"__esModule",{value:!0});var n=i(0),s=o(n),r=i(1),a=o(r),h=i(47).default,d=i(74).default,l=i(2),u=function(){function t(e,i){var o=this;(0,s.default)(this,t),this.body=e,this.canvas=i,this.selectionObj={nodes:[],edges:[]},this.hoverObj={nodes:{},edges:{}},this.options={},this.defaultOptions={multiselect:!1,selectable:!0,selectConnectedEdges:!0,hoverConnectedEdges:!0},l.extend(this.options,this.defaultOptions),this.body.emitter.on("_dataChanged",function(){o.updateSelection()})}return(0,a.default)(t,[{key:"setOptions",value:function(t){if(void 0!==t){var e=["multiselect","hoverConnectedEdges","selectable","selectConnectedEdges"];l.selectiveDeepExtend(e,this.options,t)}}},{key:"selectOnPoint",value:function(t){var e=!1;if(!0===this.options.selectable){var i=this.getNodeAt(t)||this.getEdgeAt(t);this.unselectAll(),void 0!==i&&(e=this.selectObject(i)),this.body.emitter.emit("_requestRedraw")}return e}},{key:"selectAdditionalOnPoint",value:function(t){var e=!1;if(!0===this.options.selectable){var i=this.getNodeAt(t)||this.getEdgeAt(t);void 0!==i&&(e=!0,!0===i.isSelected()?this.deselectObject(i):this.selectObject(i),this.body.emitter.emit("_requestRedraw"))}return e}},{key:"_initBaseEvent",value:function(t,e){var i={};return i.pointer={DOM:{x:e.x,y:e.y},canvas:this.canvas.DOMtoCanvas(e)},i.event=t,i}},{key:"_generateClickEvent",value:function(t,e,i,o){var n=arguments.length>4&&void 0!==arguments[4]&&arguments[4],s=this._initBaseEvent(e,i);if(!0===n)s.nodes=[],s.edges=[];else{var r=this.getSelection();s.nodes=r.nodes,s.edges=r.edges}void 0!==o&&(s.previousSelection=o),"click"==t&&(s.items=this.getClickedItems(i)),this.body.emitter.emit(t,s)}},{key:"selectObject",value:function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:this.options.selectConnectedEdges;return void 0!==t&&(t instanceof h&&!0===e&&this._selectConnectedEdges(t),t.select(),this._addToSelection(t),!0)}},{key:"deselectObject",value:function(t){!0===t.isSelected()&&(t.selected=!1,this._removeFromSelection(t))}},{key:"_getAllNodesOverlappingWith",value:function(t){for(var e=[],i=this.body.nodes,o=0;o1&&void 0!==arguments[1])||arguments[1],i=this._pointerToPositionObject(t),o=this._getAllNodesOverlappingWith(i);return o.length>0?!0===e?this.body.nodes[o[o.length-1]]:o[o.length-1]:void 0}},{key:"_getEdgesOverlappingWith",value:function(t,e){for(var i=this.body.edges,o=0;o1&&void 0!==arguments[1])||arguments[1],i=this.canvas.DOMtoCanvas(t),o=10,n=null,s=this.body.edges,r=0;r1)return!0;return!1}},{key:"_selectConnectedEdges",value:function(t){for(var e=0;e1&&void 0!==arguments[1]?arguments[1]:{},i=void 0,o=void 0;if(!t||!t.nodes&&!t.edges)throw"Selection must be an object with nodes and/or edges properties" +;if((e.unselectAll||void 0===e.unselectAll)&&this.unselectAll(),t.nodes)for(i=0;i1&&void 0!==arguments[1])||arguments[1];if(!t||void 0===t.length)throw"Selection must be an array with ids";this.setSelection({nodes:t},{highlightEdges:e})}},{key:"selectEdges",value:function(t){if(!t||void 0===t.length)throw"Selection must be an array with ids";this.setSelection({edges:t})}},{key:"updateSelection",value:function(){for(var t in this.selectionObj.nodes)this.selectionObj.nodes.hasOwnProperty(t)&&(this.body.nodes.hasOwnProperty(t)||delete this.selectionObj.nodes[t]);for(var e in this.selectionObj.edges)this.selectionObj.edges.hasOwnProperty(e)&&(this.body.edges.hasOwnProperty(e)||delete this.selectionObj.edges[e])}},{key:"getClickedItems",value:function(t){for(var e=this.canvas.DOMtoCanvas(t),i=[],o=this.body.nodeIndices,n=this.body.nodes,s=o.length-1;s>=0;s--){var r=n[o[s]],a=r.getItemsOnPoint(e);i.push.apply(i,a)}for(var h=this.body.edgeIndices,d=this.body.edges,l=h.length-1;l>=0;l--){var u=d[h[l]],c=u.getItemsOnPoint(e);i.push.apply(i,c)}return i}}]),t}();e.default=u},function(t,e,i){function o(t){return t&&t.__esModule?t:{default:t}}Object.defineProperty(e,"__esModule",{value:!0});var n=i(30),s=o(n),r=i(6),a=o(r),h=i(8),d=o(h),l=i(0),u=o(l),c=i(1),p=o(c),f=i(2),m=i(76).default,v=i(236),g=v.HorizontalStrategy,y=v.VerticalStrategy,b=function(){function t(){(0,u.default)(this,t),this.childrenReference={},this.parentReference={},this.trees={},this.distributionOrdering={},this.levels={},this.distributionIndex={},this.isTree=!1,this.treeIndex=-1}return(0,p.default)(t,[{key:"addRelation",value:function(t,e){void 0===this.childrenReference[t]&&(this.childrenReference[t]=[]),this.childrenReference[t].push(e),void 0===this.parentReference[e]&&(this.parentReference[e]=[]),this.parentReference[e].push(t)}},{key:"checkIfTree",value:function(){for(var t in this.parentReference)if(this.parentReference[t].length>1)return void(this.isTree=!1);this.isTree=!0}},{key:"numTrees",value:function(){return this.treeIndex+1}},{key:"setTreeIndex",value:function(t,e){void 0!==e&&void 0===this.trees[t.id]&&(this.trees[t.id]=e,this.treeIndex=Math.max(e,this.treeIndex))}},{key:"ensureLevel",value:function(t){void 0===this.levels[t]&&(this.levels[t]=0)}},{key:"getMaxLevel",value:function(t){var e=this,i={};return function t(o){if(void 0!==i[o])return i[o];var n=e.levels[o];if(e.childrenReference[o]){var s=e.childrenReference[o];if(s.length>0)for(var r=0;r0&&(i.levelSeparation*=-1):i.levelSeparation<0&&(i.levelSeparation*=-1),this.setDirectionStrategy(),this.body.emitter.emit("_resetHierarchicalLayout"),this.adaptAllOptionsForHierarchicalLayout(e);if(!0===o)return this.body.emitter.emit("refresh"),f.deepExtend(e,this.optionsBackup)}return e}},{key:"adaptAllOptionsForHierarchicalLayout",value:function(t){if(!0===this.options.hierarchical.enabled){var e=this.optionsBackup.physics;void 0===t.physics||!0===t.physics?(t.physics={enabled:void 0===e.enabled||e.enabled,solver:"hierarchicalRepulsion"},e.enabled=void 0===e.enabled||e.enabled,e.solver=e.solver||"barnesHut"):"object"===(0,a.default)(t.physics)?(e.enabled=void 0===t.physics.enabled||t.physics.enabled,e.solver=t.physics.solver||"barnesHut",t.physics.solver="hierarchicalRepulsion"):!1!==t.physics&&(e.solver="barnesHut",t.physics={solver:"hierarchicalRepulsion"});var i=this.direction.curveType();if(void 0===t.edges)this.optionsBackup.edges={smooth:{enabled:!0,type:"dynamic"}},t.edges={smooth:!1};else if(void 0===t.edges.smooth)this.optionsBackup.edges={smooth:{enabled:!0,type:"dynamic"}},t.edges.smooth=!1;else if("boolean"==typeof t.edges.smooth)this.optionsBackup.edges={smooth:t.edges.smooth},t.edges.smooth={enabled:t.edges.smooth,type:i};else{var o=t.edges.smooth;void 0!==o.type&&"dynamic"!==o.type&&(i=o.type),this.optionsBackup.edges={smooth:void 0===o.enabled||o.enabled,type:void 0===o.type?"dynamic":o.type,roundness:void 0===o.roundness?.5:o.roundness,forceDirection:void 0!==o.forceDirection&&o.forceDirection},t.edges.smooth={enabled:void 0===o.enabled||o.enabled,type:i,roundness:void 0===o.roundness?.5:o.roundness,forceDirection:void 0!==o.forceDirection&&o.forceDirection}}this.body.emitter.emit("_forceDisableDynamicCurves",i)}return t}},{key:"seededRandom",value:function(){var t=1e4*Math.sin(this.randomSeed++);return t-Math.floor(t)}},{key:"positionInitially",value:function(t){if(!0!==this.options.hierarchical.enabled){this.randomSeed=this.initialRandomSeed;for(var e=t.length+50,i=0;i150){for(var s=t.length;t.length>150&&o<=10;){o+=1;var r=t.length;o%3==0?this.body.modules.clustering.clusterBridges(n):this.body.modules.clustering.clusterOutliers(n);if(r==t.length&&o%3!=0)return this._declusterAll(),this.body.emitter.emit("_layoutFailed"),void console.info("This network could not be positioned by this version of the improved layout algorithm. Please disable improvedLayout for better performance.")}this.body.modules.kamadaKawai.setOptions({springLength:Math.max(150,2*s)})}o>10&&console.info("The clustering didn't succeed within the amount of interations allowed, progressing with partial result."),this.body.modules.kamadaKawai.solve(t,this.body.edgeIndices,!0),this._shiftToCenter();for(var a=0;a0){var t=void 0,e=void 0,i=!1,o=!1;this.lastNodeOnLevel={},this.hierarchical=new b;for(e in this.body.nodes)this.body.nodes.hasOwnProperty(e)&&(t=this.body.nodes[e],void 0!==t.options.level?(i=!0,this.hierarchical.levels[e]=t.options.level):o=!0);if(!0===o&&!0===i)throw new Error("To use the hierarchical layout, nodes require either no predefined levels or levels have to be defined for all nodes.");if(!0===o){var n=this.options.hierarchical.sortMethod;"hubsize"===n?this._determineLevelsByHubsize():"directed"===n?this._determineLevelsDirected():"custom"===n&&this._determineLevelsCustomCallback()}for(var s in this.body.nodes)this.body.nodes.hasOwnProperty(s)&&this.hierarchical.ensureLevel(s);var r=this._getDistribution();this._generateMap(),this._placeNodesByHierarchy(r),this._condenseHierarchy(),this._shiftToCenter()}}},{key:"_condenseHierarchy",value:function(){var t=this,e=!1,i={},o=function(e,i){var o=t.hierarchical.trees;for(var n in o)o.hasOwnProperty(n)&&o[n]===e&&t.direction.shift(n,i)},n=function(){for(var e=[],i=0;i0)for(var s=0;s1&&void 0!==arguments[1]?arguments[1]:1e9,o=1e9,n=1e9,r=1e9,a=-1e9;for(var h in e)if(e.hasOwnProperty(h)){var d=t.body.nodes[h],l=t.hierarchical.levels[d.id],u=t.direction.getPosition(d),c=t._getSpaceAroundNode(d,e),p=(0,s.default)(c,2),f=p[0],m=p[1];o=Math.min(f,o),n=Math.min(m,n),l<=i&&(r=Math.min(u,r),a=Math.max(u,a))}return[r,a,o,n]},h=function(e,i){var o=t.hierarchical.getMaxLevel(e.id),n=t.hierarchical.getMaxLevel(i.id);return Math.min(o,n)},d=function(e,i,o){for(var n=t.hierarchical,s=0;s1)for(var h=0;h2&&void 0!==arguments[2]&&arguments[2],s=t.direction.getPosition(i),d=t.direction.getPosition(o),l=Math.abs(d-s),u=t.options.hierarchical.nodeSpacing;if(l>u){var c={},p={};r(i,c),r(o,p);var f=h(i,o),m=a(c,f),v=a(p,f),g=m[1],y=v[0],b=v[2];if(Math.abs(g-y)>u){var _=g-y+u;_<-b+u&&(_=-b+u),_<0&&(t._shiftBlock(o.id,_),e=!0,!0===n&&t._centerParent(o))}}},u=function(o,n){for(var h=n.id,d=n.edges,l=t.hierarchical.levels[n.id],u=t.options.hierarchical.levelSeparation*t.options.hierarchical.levelSeparation,c={},p=[],f=0;f0?p=Math.min(c,u-t.options.hierarchical.nodeSpacing):c<0&&(p=-Math.min(-c,l-t.options.hierarchical.nodeSpacing)),0!=p&&(t._shiftBlock(n.id,p),e=!0)}(_),_=b(o,d),function(i){var o=t.direction.getPosition(n),r=t._getSpaceAroundNode(n),a=(0,s.default)(r,2),h=a[0],d=a[1],l=i-o,u=o;l>0?u=Math.min(o+(d-t.options.hierarchical.nodeSpacing),i):l<0&&(u=Math.max(o-(h-t.options.hierarchical.nodeSpacing),i)),u!==o&&(t.direction.setPosition(n,u),e=!0)}(_)};!0===this.options.hierarchical.blockShifting&&(function(i){var o=t.hierarchical.getLevels();o=o.reverse();for(var n=0;n0&&Math.abs(p)0&&(a=this.direction.getPosition(i[n-1])+r),this.direction.setPosition(s,a,e),this._validatePositionAndContinue(s,e,a),o++}}}}},{key:"_placeBranchNodes",value:function(t,e){var i=this.hierarchical.childrenReference[t];if(void 0!==i){for(var o=[],n=0;ne&&void 0===this.positionedNodes[r.id]))return;var h=this.options.hierarchical.nodeSpacing,d=void 0;d=0===s?this.direction.getPosition(this.body.nodes[t]):this.direction.getPosition(o[s-1])+h,this.direction.setPosition(r,d,a),this._validatePositionAndContinue(r,a,d)}var l=this._getCenterPosition(o);this.direction.setPosition(this.body.nodes[t],l,e)}}},{key:"_validatePositionAndContinue",value:function(t,e,i){if(this.hierarchical.isTree){if(void 0!==this.lastNodeOnLevel[e]){var o=this.direction.getPosition(this.body.nodes[this.lastNodeOnLevel[e]]);if(i-ot.hierarchical.levels[e.id]&&t.hierarchical.addRelation(e.id,i.id)};this._crawlNetwork(e),this.hierarchical.checkIfTree()}},{key:"_crawlNetwork",value:function(){var t=this,e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:function(){},i=arguments[1],o={},n=function i(n,s){if(void 0===o[n.id]){t.hierarchical.setTreeIndex(n,s),o[n.id]=!0;for(var r=void 0,a=t._getActiveEdges(n),h=0;h2&&void 0!==arguments[2]?arguments[2]:void 0;this.fake_use(t,e,i),this.abstract()}},{key:"getTreeSize",value:function(t){return this.fake_use(t),this.abstract()}},{key:"sort",value:function(t){this.fake_use(t),this.abstract()}},{key:"fix",value:function(t,e){this.fake_use(t,e),this.abstract()}},{key:"shift",value:function(t,e){this.fake_use(t,e),this.abstract()}}]),t}(),m=function(t){function e(t){(0,u.default)(this,e);var i=(0,a.default)(this,(e.__proto__||(0,s.default)(e)).call(this));return i.layout=t,i}return(0,d.default)(e,t),(0,p.default)(e,[{key:"curveType",value:function(){return"horizontal"}},{key:"getPosition",value:function(t){return t.x}},{key:"setPosition",value:function(t,e){var i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:void 0;void 0!==i&&this.layout.hierarchical.addToOrdering(t,i),t.x=e}},{key:"getTreeSize",value:function(t){var e=this.layout.hierarchical.getTreeSize(this.layout.body.nodes,t);return{min:e.min_x,max:e.max_x}}},{key:"sort",value:function(t){t.sort(function(t,e){return void 0===t.x||void 0===e.x?0:t.x-e.x})}},{key:"fix",value:function(t,e){t.y=this.layout.options.hierarchical.levelSeparation*e,t.options.fixed.y=!0}},{key:"shift",value:function(t,e){this.layout.body.nodes[t].x+=e}}]),e}(f),v=function(t){function e(t){(0,u.default)(this,e);var i=(0,a.default)(this,(e.__proto__||(0,s.default)(e)).call(this));return i.layout=t,i}return(0,d.default)(e,t),(0,p.default)(e,[{key:"curveType",value:function(){return"vertical"}},{key:"getPosition",value:function(t){return t.y}},{key:"setPosition",value:function(t,e){var i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:void 0;void 0!==i&&this.layout.hierarchical.addToOrdering(t,i),t.y=e}},{key:"getTreeSize",value:function(t){var e=this.layout.hierarchical.getTreeSize(this.layout.body.nodes,t);return{min:e.min_y,max:e.max_y}}},{key:"sort",value:function(t){t.sort(function(t,e){return void 0===t.y||void 0===e.y?0:t.y-e.y})}},{key:"fix",value:function(t,e){t.x=this.layout.options.hierarchical.levelSeparation*e,t.options.fixed.x=!0}},{key:"shift",value:function(t,e){this.layout.body.nodes[t].y+=e}}]),e}(f);e.HorizontalStrategy=v,e.VerticalStrategy=m},function(t,e,i){function o(t){return t&&t.__esModule?t:{default:t}}Object.defineProperty(e,"__esModule",{value:!0});var n=i(8),s=o(n),r=i(19),a=o(r),h=i(6),d=o(h),l=i(0),u=o(l),c=i(1),p=o(c),f=i(2),m=i(10),v=i(37),g=function(){function t(e,i,o){var n=this;(0,u.default)(this,t),this.body=e,this.canvas=i,this.selectionHandler=o,this.editMode=!1,this.manipulationDiv=void 0,this.editModeDiv=void 0,this.closeDiv=void 0,this.manipulationHammers=[],this.temporaryUIFunctions={},this.temporaryEventFunctions=[],this.touchTime=0,this.temporaryIds={nodes:[],edges:[]},this.guiEnabled=!1,this.inMode=!1,this.selectedControlNode=void 0,this.options={},this.defaultOptions={enabled:!1,initiallyActive:!1,addNode:!0,addEdge:!0,editNode:void 0,editEdge:!0,deleteNode:!0,deleteEdge:!0,controlNodeStyle:{shape:"dot",size:6,color:{background:"#ff0000",border:"#3c3c3c",highlight:{background:"#07f968",border:"#3c3c3c"}},borderWidth:2,borderWidthSelected:2}},f.extend(this.options,this.defaultOptions),this.body.emitter.on("destroy",function(){n._clean()}),this.body.emitter.on("_dataChanged",this._restore.bind(this)),this.body.emitter.on("_resetData",this._restore.bind(this))}return(0,p.default)(t,[{key:"_restore",value:function(){!1!==this.inMode&&(!0===this.options.initiallyActive?this.enableEditMode():this.disableEditMode())}},{key:"setOptions",value:function(t,e,i){void 0!==e&&(void 0!==e.locale?this.options.locale=e.locale:this.options.locale=i.locale,void 0!==e.locales?this.options.locales=e.locales:this.options.locales=i.locales),void 0!==t&&("boolean"==typeof t?this.options.enabled=t:(this.options.enabled=!0,f.deepExtend(this.options,t)),!0===this.options.initiallyActive&&(this.editMode=!0),this._setup())}},{key:"toggleEditMode",value:function(){!0===this.editMode?this.disableEditMode():this.enableEditMode()}},{key:"enableEditMode",value:function(){this.editMode=!0,this._clean(),!0===this.guiEnabled&&(this.manipulationDiv.style.display="block",this.closeDiv.style.display="block",this.editModeDiv.style.display="none",this.showManipulatorToolbar())}},{key:"disableEditMode",value:function(){this.editMode=!1,this._clean(),!0===this.guiEnabled&&(this.manipulationDiv.style.display="none",this.closeDiv.style.display="none",this.editModeDiv.style.display="block",this._createEditButton())}},{key:"showManipulatorToolbar",value:function(){if(this._clean(),this.manipulationDOM={},!0===this.guiEnabled){this.editMode=!0,this.manipulationDiv.style.display="block",this.closeDiv.style.display="block";var t=this.selectionHandler._getSelectedNodeCount(),e=this.selectionHandler._getSelectedEdgeCount(),i=t+e,o=this.options.locales[this.options.locale],n=!1;!1!==this.options.addNode&&(this._createAddNodeButton(o),n=!0),!1!==this.options.addEdge&&(!0===n?this._createSeperator(1):n=!0,this._createAddEdgeButton(o)),1===t&&"function"==typeof this.options.editNode?(!0===n?this._createSeperator(2):n=!0,this._createEditNodeButton(o)):1===e&&0===t&&!1!==this.options.editEdge&&(!0===n?this._createSeperator(3):n=!0,this._createEditEdgeButton(o)),0!==i&&(t>0&&!1!==this.options.deleteNode?(!0===n&&this._createSeperator(4),this._createDeleteButton(o)):0===t&&!1!==this.options.deleteEdge&&(!0===n&&this._createSeperator(4),this._createDeleteButton(o))),this._bindHammerToDiv(this.closeDiv,this.toggleEditMode.bind(this)),this._temporaryBindEvent("select",this.showManipulatorToolbar.bind(this))}this.body.emitter.emit("_redraw")}},{key:"addNodeMode",value:function(){if(!0!==this.editMode&&this.enableEditMode(),this._clean(),this.inMode="addNode",!0===this.guiEnabled){var t=this.options.locales[this.options.locale];this.manipulationDOM={},this._createBackButton(t),this._createSeperator(),this._createDescription(t.addDescription||this.options.locales.en.addDescription),this._bindHammerToDiv(this.closeDiv,this.toggleEditMode.bind(this))}this._temporaryBindEvent("click",this._performAddNode.bind(this))}},{key:"editNode",value:function(){var t=this;!0!==this.editMode&&this.enableEditMode(),this._clean();var e=this.selectionHandler._getSelectedNode();if(void 0!==e){if(this.inMode="editNode","function"!=typeof this.options.editNode)throw new Error("No function has been configured to handle the editing of nodes.");if(!0!==e.isCluster){var i=f.deepExtend({},e.options,!1);if(i.x=e.x,i.y=e.y,2!==this.options.editNode.length)throw new Error("The function for edit does not support two arguments (data, callback)");this.options.editNode(i,function(e){null!==e&&void 0!==e&&"editNode"===t.inMode&&t.body.data.nodes.getDataSet().update(e),t.showManipulatorToolbar()})}else alert(this.options.locales[this.options.locale].editClusterError||this.options.locales.en.editClusterError)}else this.showManipulatorToolbar()}},{key:"addEdgeMode",value:function(){if(!0!==this.editMode&&this.enableEditMode(),this._clean(),this.inMode="addEdge",!0===this.guiEnabled){var t=this.options.locales[this.options.locale];this.manipulationDOM={},this._createBackButton(t),this._createSeperator(),this._createDescription(t.edgeDescription||this.options.locales.en.edgeDescription),this._bindHammerToDiv(this.closeDiv,this.toggleEditMode.bind(this))}this._temporaryBindUI("onTouch",this._handleConnect.bind(this)),this._temporaryBindUI("onDragEnd",this._finishConnect.bind(this)),this._temporaryBindUI("onDrag",this._dragControlNode.bind(this)),this._temporaryBindUI("onRelease",this._finishConnect.bind(this)),this._temporaryBindUI("onDragStart",this._dragStartEdge.bind(this)),this._temporaryBindUI("onHold",function(){})}},{key:"editEdgeMode",value:function(){if(!0!==this.editMode&&this.enableEditMode(),this._clean(),this.inMode="editEdge","object"===(0,d.default)(this.options.editEdge)&&"function"==typeof this.options.editEdge.editWithoutDrag&&(this.edgeBeingEditedId=this.selectionHandler.getSelectedEdges()[0],void 0!==this.edgeBeingEditedId)){var t=this.body.edges[this.edgeBeingEditedId];return void this._performEditEdge(t.from,t.to)}if(!0===this.guiEnabled){var e=this.options.locales[this.options.locale];this.manipulationDOM={},this._createBackButton(e),this._createSeperator(),this._createDescription(e.editEdgeDescription||this.options.locales.en.editEdgeDescription),this._bindHammerToDiv(this.closeDiv,this.toggleEditMode.bind(this))}if(this.edgeBeingEditedId=this.selectionHandler.getSelectedEdges()[0],void 0!==this.edgeBeingEditedId){var i=this.body.edges[this.edgeBeingEditedId],o=this._getNewTargetNode(i.from.x,i.from.y),n=this._getNewTargetNode(i.to.x,i.to.y);this.temporaryIds.nodes.push(o.id),this.temporaryIds.nodes.push(n.id),this.body.nodes[o.id]=o,this.body.nodeIndices.push(o.id),this.body.nodes[n.id]=n,this.body.nodeIndices.push(n.id),this._temporaryBindUI("onTouch",this._controlNodeTouch.bind(this)),this._temporaryBindUI("onTap",function(){}),this._temporaryBindUI("onHold",function(){}),this._temporaryBindUI("onDragStart",this._controlNodeDragStart.bind(this)),this._temporaryBindUI("onDrag",this._controlNodeDrag.bind(this)),this._temporaryBindUI("onDragEnd",this._controlNodeDragEnd.bind(this)),this._temporaryBindUI("onMouseMove",function(){}),this._temporaryBindEvent("beforeDrawing",function(t){var e=i.edgeType.findBorderPositions(t);!1===o.selected&&(o.x=e.from.x,o.y=e.from.y),!1===n.selected&&(n.x=e.to.x,n.y=e.to.y)}),this.body.emitter.emit("_redraw")}else this.showManipulatorToolbar()}},{key:"deleteSelected",value:function(){var t=this;!0!==this.editMode&&this.enableEditMode(),this._clean(),this.inMode="delete";var e=this.selectionHandler.getSelectedNodes(),i=this.selectionHandler.getSelectedEdges(),o=void 0;if(e.length>0){for(var n=0;n0&&"function"==typeof this.options.deleteEdge&&(o=this.options.deleteEdge);if("function"==typeof o){var s={nodes:e,edges:i} +;if(2!==o.length)throw new Error("The function for delete does not support two arguments (data, callback)");o(s,function(e){null!==e&&void 0!==e&&"delete"===t.inMode?(t.body.data.edges.getDataSet().remove(e.edges),t.body.data.nodes.getDataSet().remove(e.nodes),t.body.emitter.emit("startSimulation"),t.showManipulatorToolbar()):(t.body.emitter.emit("startSimulation"),t.showManipulatorToolbar())})}else this.body.data.edges.getDataSet().remove(i),this.body.data.nodes.getDataSet().remove(e),this.body.emitter.emit("startSimulation"),this.showManipulatorToolbar()}},{key:"_setup",value:function(){!0===this.options.enabled?(this.guiEnabled=!0,this._createWrappers(),!1===this.editMode?this._createEditButton():this.showManipulatorToolbar()):(this._removeManipulationDOM(),this.guiEnabled=!1)}},{key:"_createWrappers",value:function(){void 0===this.manipulationDiv&&(this.manipulationDiv=document.createElement("div"),this.manipulationDiv.className="vis-manipulation",!0===this.editMode?this.manipulationDiv.style.display="block":this.manipulationDiv.style.display="none",this.canvas.frame.appendChild(this.manipulationDiv)),void 0===this.editModeDiv&&(this.editModeDiv=document.createElement("div"),this.editModeDiv.className="vis-edit-mode",!0===this.editMode?this.editModeDiv.style.display="none":this.editModeDiv.style.display="block",this.canvas.frame.appendChild(this.editModeDiv)),void 0===this.closeDiv&&(this.closeDiv=document.createElement("div"),this.closeDiv.className="vis-close",this.closeDiv.style.display=this.manipulationDiv.style.display,this.canvas.frame.appendChild(this.closeDiv))}},{key:"_getNewTargetNode",value:function(t,e){var i=f.deepExtend({},this.options.controlNodeStyle);i.id="targetNode"+f.randomUUID(),i.hidden=!1,i.physics=!1,i.x=t,i.y=e;var o=this.body.functions.createNode(i);return o.shape.boundingBox={left:t,right:t,top:e,bottom:e},o}},{key:"_createEditButton",value:function(){this._clean(),this.manipulationDOM={},f.recursiveDOMDelete(this.editModeDiv);var t=this.options.locales[this.options.locale],e=this._createButton("editMode","vis-button vis-edit vis-edit-mode",t.edit||this.options.locales.en.edit);this.editModeDiv.appendChild(e),this._bindHammerToDiv(e,this.toggleEditMode.bind(this))}},{key:"_clean",value:function(){this.inMode=!1,!0===this.guiEnabled&&(f.recursiveDOMDelete(this.editModeDiv),f.recursiveDOMDelete(this.manipulationDiv),this._cleanManipulatorHammers()),this._cleanupTemporaryNodesAndEdges(),this._unbindTemporaryUIs(),this._unbindTemporaryEvents(),this.body.emitter.emit("restorePhysics")}},{key:"_cleanManipulatorHammers",value:function(){if(0!=this.manipulationHammers.length){for(var t=0;t0&&void 0!==arguments[0]?arguments[0]:1;this.manipulationDOM["seperatorLineDiv"+t]=document.createElement("div"),this.manipulationDOM["seperatorLineDiv"+t].className="vis-separator-line",this.manipulationDiv.appendChild(this.manipulationDOM["seperatorLineDiv"+t])}},{key:"_createAddNodeButton",value:function(t){var e=this._createButton("addNode","vis-button vis-add",t.addNode||this.options.locales.en.addNode);this.manipulationDiv.appendChild(e),this._bindHammerToDiv(e,this.addNodeMode.bind(this))}},{key:"_createAddEdgeButton",value:function(t){var e=this._createButton("addEdge","vis-button vis-connect",t.addEdge||this.options.locales.en.addEdge);this.manipulationDiv.appendChild(e),this._bindHammerToDiv(e,this.addEdgeMode.bind(this))}},{key:"_createEditNodeButton",value:function(t){var e=this._createButton("editNode","vis-button vis-edit",t.editNode||this.options.locales.en.editNode);this.manipulationDiv.appendChild(e),this._bindHammerToDiv(e,this.editNode.bind(this))}},{key:"_createEditEdgeButton",value:function(t){var e=this._createButton("editEdge","vis-button vis-edit",t.editEdge||this.options.locales.en.editEdge);this.manipulationDiv.appendChild(e),this._bindHammerToDiv(e,this.editEdgeMode.bind(this))}},{key:"_createDeleteButton",value:function(t){var e;e=this.options.rtl?"vis-button vis-delete-rtl":"vis-button vis-delete";var i=this._createButton("delete",e,t.del||this.options.locales.en.del);this.manipulationDiv.appendChild(i),this._bindHammerToDiv(i,this.deleteSelected.bind(this))}},{key:"_createBackButton",value:function(t){var e=this._createButton("back","vis-button vis-back",t.back||this.options.locales.en.back);this.manipulationDiv.appendChild(e),this._bindHammerToDiv(e,this.showManipulatorToolbar.bind(this))}},{key:"_createButton",value:function(t,e,i){var o=arguments.length>3&&void 0!==arguments[3]?arguments[3]:"vis-label";return this.manipulationDOM[t+"Div"]=document.createElement("div"),this.manipulationDOM[t+"Div"].className=e,this.manipulationDOM[t+"Label"]=document.createElement("div"),this.manipulationDOM[t+"Label"].className=o,this.manipulationDOM[t+"Label"].innerHTML=i,this.manipulationDOM[t+"Div"].appendChild(this.manipulationDOM[t+"Label"]),this.manipulationDOM[t+"Div"]}},{key:"_createDescription",value:function(t){this.manipulationDiv.appendChild(this._createButton("description","vis-button vis-none",t))}},{key:"_temporaryBindEvent",value:function(t,e){this.temporaryEventFunctions.push({event:t,boundFunction:e}),this.body.emitter.on(t,e)}},{key:"_temporaryBindUI",value:function(t,e){if(void 0===this.body.eventListeners[t])throw new Error("This UI function does not exist. Typo? You tried: "+t+" possible are: "+(0,a.default)((0,s.default)(this.body.eventListeners)));this.temporaryUIFunctions[t]=this.body.eventListeners[t],this.body.eventListeners[t]=e}},{key:"_unbindTemporaryUIs",value:function(){for(var t in this.temporaryUIFunctions)this.temporaryUIFunctions.hasOwnProperty(t)&&(this.body.eventListeners[t]=this.temporaryUIFunctions[t],delete this.temporaryUIFunctions[t]);this.temporaryUIFunctions={}}},{key:"_unbindTemporaryEvents",value:function(){for(var t=0;t=0;r--)if(n[r]!==this.selectedControlNode.id){s=this.body.nodes[n[r]];break}if(void 0!==s&&void 0!==this.selectedControlNode)if(!0===s.isCluster)alert(this.options.locales[this.options.locale].createEdgeError||this.options.locales.en.createEdgeError);else{var a=this.body.nodes[this.temporaryIds.nodes[0]];this.selectedControlNode.id===a.id?this._performEditEdge(s.id,o.to.id):this._performEditEdge(o.from.id,s.id)}else o.updateEdgeType(),this.body.emitter.emit("restorePhysics");this.body.emitter.emit("_redraw")}}},{key:"_handleConnect",value:function(t){if((new Date).valueOf()-this.touchTime>100){this.lastTouch=this.body.functions.getPointer(t.center),this.lastTouch.translation=f.extend({},this.body.view.translation);var e=this.lastTouch,i=this.selectionHandler.getNodeAt(e);if(void 0!==i)if(!0===i.isCluster)alert(this.options.locales[this.options.locale].createEdgeError||this.options.locales.en.createEdgeError);else{var o=this._getNewTargetNode(i.x,i.y);this.body.nodes[o.id]=o,this.body.nodeIndices.push(o.id);var n=this.body.functions.createEdge({id:"connectionEdge"+f.randomUUID(),from:i.id,to:o.id,physics:!1,smooth:{enabled:!0,type:"continuous",roundness:.5}});this.body.edges[n.id]=n,this.body.edgeIndices.push(n.id),this.temporaryIds.nodes.push(o.id),this.temporaryIds.edges.push(n.id)}this.touchTime=(new Date).valueOf()}}},{key:"_dragControlNode",value:function(t){var e=this.body.functions.getPointer(t.center);if(void 0!==this.temporaryIds.nodes[0]){var i=this.body.nodes[this.temporaryIds.nodes[0]];i.x=this.canvas._XconvertDOMtoCanvas(e.x),i.y=this.canvas._YconvertDOMtoCanvas(e.y),this.body.emitter.emit("_redraw")}else{var o=e.x-this.lastTouch.x,n=e.y-this.lastTouch.y;this.body.view.translation={x:this.lastTouch.translation.x+o,y:this.lastTouch.translation.y+n}}}},{key:"_finishConnect",value:function(t){var e=this.body.functions.getPointer(t.center),i=this.selectionHandler._pointerToPositionObject(e),o=void 0;void 0!==this.temporaryIds.edges[0]&&(o=this.body.edges[this.temporaryIds.edges[0]].fromId);for(var n=this.selectionHandler._getAllNodesOverlappingWith(i),s=void 0,r=n.length-1;r>=0;r--)if(-1===this.temporaryIds.nodes.indexOf(n[r])){s=this.body.nodes[n[r]];break}this._cleanupTemporaryNodesAndEdges(),void 0!==s&&(!0===s.isCluster?alert(this.options.locales[this.options.locale].createEdgeError||this.options.locales.en.createEdgeError):void 0!==this.body.nodes[o]&&void 0!==this.body.nodes[s.id]&&this._performAddEdge(o,s.id)),this.body.emitter.emit("_redraw")}},{key:"_dragStartEdge",value:function(t){var e=this.lastTouch;this.selectionHandler._generateClickEvent("dragStart",t,e,void 0,!0)}},{key:"_performAddNode",value:function(t){var e=this,i={id:f.randomUUID(),x:t.pointer.canvas.x,y:t.pointer.canvas.y,label:"new"};if("function"==typeof this.options.addNode){if(2!==this.options.addNode.length)throw this.showManipulatorToolbar(),new Error("The function for add does not support two arguments (data,callback)");this.options.addNode(i,function(t){null!==t&&void 0!==t&&"addNode"===e.inMode&&(e.body.data.nodes.getDataSet().add(t),e.showManipulatorToolbar())})}else this.body.data.nodes.getDataSet().add(i),this.showManipulatorToolbar()}},{key:"_performAddEdge",value:function(t,e){var i=this,o={from:t,to:e};if("function"==typeof this.options.addEdge){if(2!==this.options.addEdge.length)throw new Error("The function for connect does not support two arguments (data,callback)");this.options.addEdge(o,function(t){null!==t&&void 0!==t&&"addEdge"===i.inMode&&(i.body.data.edges.getDataSet().add(t),i.selectionHandler.unselectAll(),i.showManipulatorToolbar())})}else this.body.data.edges.getDataSet().add(o),this.selectionHandler.unselectAll(),this.showManipulatorToolbar()}},{key:"_performEditEdge",value:function(t,e){var i=this,o={id:this.edgeBeingEditedId,from:t,to:e,label:this.body.data.edges._data[this.edgeBeingEditedId].label},n=this.options.editEdge;if("object"===(void 0===n?"undefined":(0,d.default)(n))&&(n=n.editWithoutDrag),"function"==typeof n){if(2!==n.length)throw new Error("The function for edit does not support two arguments (data, callback)");n(o,function(t){null===t||void 0===t||"editEdge"!==i.inMode?(i.body.edges[o.id].updateEdgeType(),i.body.emitter.emit("_redraw"),i.showManipulatorToolbar()):(i.body.data.edges.getDataSet().update(t),i.selectionHandler.unselectAll(),i.showManipulatorToolbar())})}else this.body.data.edges.getDataSet().update(o),this.selectionHandler.unselectAll(),this.showManipulatorToolbar()}}]),t}();e.default=g},function(t,e,i){function o(t){return t&&t.__esModule?t:{default:t}}Object.defineProperty(e,"__esModule",{value:!0});var n=i(30),s=o(n),r=i(0),a=o(r),h=i(1),d=o(h),l=i(239),u=o(l),c=function(){function t(e,i,o){(0,a.default)(this,t),this.body=e,this.springLength=i,this.springConstant=o,this.distanceSolver=new u.default}return(0,d.default)(t,[{key:"setOptions",value:function(t){t&&(t.springLength&&(this.springLength=t.springLength),t.springConstant&&(this.springConstant=t.springConstant))}},{key:"solve",value:function(t,e){var i=arguments.length>2&&void 0!==arguments[2]&&arguments[2],o=this.distanceSolver.getDistances(this.body,t,e);this._createL_matrix(o),this._createK_matrix(o),this._createE_matrix();for(var n=0,r=Math.max(1e3,Math.min(10*this.body.nodeIndices.length,6e3)),a=1e9,h=0,d=0,l=0,u=0,c=0;a>.01&&n1&&c<5;){c+=1,this._moveNode(h,d,l);var m=this._getEnergy(h),v=(0,s.default)(m,3);u=v[0],d=v[1],l=v[2]}}}},{key:"_getHighestEnergyNode",value:function(t){for(var e=this.body.nodeIndices,i=this.body.nodes,o=0,n=e[0],r=0,a=0,h=0;h0&&e-1 in t)}function q(t){return a.call(t,function(t){return null!=t})}function H(t){return t.length>0?r.fn.concat.apply([],t):t}function I(t){return t.replace(/::/g,"/").replace(/([A-Z]+)([A-Z][a-z])/g,"$1_$2").replace(/([a-z\d])([A-Z])/g,"$1_$2").replace(/_/g,"-").toLowerCase()}function V(t){return t in l?l[t]:l[t]=new RegExp("(^|\\s)"+t+"(\\s|$)")}function _(t,e){return"number"!=typeof e||h[I(t)]?e:e+"px"}function B(t){var e,n;return c[t]||(e=f.createElement(t),f.body.appendChild(e),n=getComputedStyle(e,"").getPropertyValue("display"),e.parentNode.removeChild(e),"none"==n&&(n="block"),c[t]=n),c[t]}function U(t){return"children"in t?u.call(t.children):r.map(t.childNodes,function(t){return 1==t.nodeType?t:void 0})}function X(t,e){var n,r=t?t.length:0;for(n=0;r>n;n++)this[n]=t[n];this.length=r,this.selector=e||""}function J(t,r,i){for(n in r)i&&(Z(r[n])||L(r[n]))?(Z(r[n])&&!Z(t[n])&&(t[n]={}),L(r[n])&&!L(t[n])&&(t[n]=[]),J(t[n],r[n],i)):r[n]!==e&&(t[n]=r[n])}function W(t,e){return null==e?r(t):r(t).filter(e)}function Y(t,e,n,r){return F(e)?e.call(t,n,r):e}function G(t,e,n){null==n?t.removeAttribute(e):t.setAttribute(e,n)}function K(t,n){var r=t.className||"",i=r&&r.baseVal!==e;return n===e?i?r.baseVal:r:void(i?r.baseVal=n:t.className=n)}function Q(t){try{return t?"true"==t||("false"==t?!1:"null"==t?null:+t+""==t?+t:/^[\[\{]/.test(t)?r.parseJSON(t):t):t}catch(e){return t}}function tt(t,e){e(t);for(var n=0,r=t.childNodes.length;r>n;n++)tt(t.childNodes[n],e)}var e,n,r,i,O,P,o=[],s=o.concat,a=o.filter,u=o.slice,f=t.document,c={},l={},h={"column-count":1,columns:1,"font-weight":1,"line-height":1,opacity:1,"z-index":1,zoom:1},p=/^\s*<(\w+|!)[^>]*>/,d=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,m=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,g=/^(?:body|html)$/i,v=/([A-Z])/g,y=["val","css","html","text","data","width","height","offset"],x=["after","prepend","before","append"],b=f.createElement("table"),E=f.createElement("tr"),j={tr:f.createElement("tbody"),tbody:b,thead:b,tfoot:b,td:E,th:E,"*":f.createElement("div")},w=/complete|loaded|interactive/,T=/^[\w-]*$/,S={},C=S.toString,N={},A=f.createElement("div"),D={tabindex:"tabIndex",readonly:"readOnly","for":"htmlFor","class":"className",maxlength:"maxLength",cellspacing:"cellSpacing",cellpadding:"cellPadding",rowspan:"rowSpan",colspan:"colSpan",usemap:"useMap",frameborder:"frameBorder",contenteditable:"contentEditable"},L=Array.isArray||function(t){return t instanceof Array};return N.matches=function(t,e){if(!e||!t||1!==t.nodeType)return!1;var n=t.matches||t.webkitMatchesSelector||t.mozMatchesSelector||t.oMatchesSelector||t.matchesSelector;if(n)return n.call(t,e);var r,i=t.parentNode,o=!i;return o&&(i=A).appendChild(t),r=~N.qsa(i,e).indexOf(t),o&&A.removeChild(t),r},O=function(t){return t.replace(/-+(.)?/g,function(t,e){return e?e.toUpperCase():""})},P=function(t){return a.call(t,function(e,n){return t.indexOf(e)==n})},N.fragment=function(t,n,i){var o,s,a;return d.test(t)&&(o=r(f.createElement(RegExp.$1))),o||(t.replace&&(t=t.replace(m,"<$1>")),n===e&&(n=p.test(t)&&RegExp.$1),n in j||(n="*"),a=j[n],a.innerHTML=""+t,o=r.each(u.call(a.childNodes),function(){a.removeChild(this)})),Z(i)&&(s=r(o),r.each(i,function(t,e){y.indexOf(t)>-1?s[t](e):s.attr(t,e)})),o},N.Z=function(t,e){return new X(t,e)},N.isZ=function(t){return t instanceof N.Z},N.init=function(t,n){var i;if(!t)return N.Z();if("string"==typeof t)if(t=t.trim(),"<"==t[0]&&p.test(t))i=N.fragment(t,RegExp.$1,n),t=null;else{if(n!==e)return r(n).find(t);i=N.qsa(f,t)}else{if(F(t))return r(f).ready(t);if(N.isZ(t))return t;if(L(t))i=q(t);else if(R(t))i=[t],t=null;else if(p.test(t))i=N.fragment(t.trim(),RegExp.$1,n),t=null;else{if(n!==e)return r(n).find(t);i=N.qsa(f,t)}}return N.Z(i,t)},r=function(t,e){return N.init(t,e)},r.extend=function(t){var e,n=u.call(arguments,1);return"boolean"==typeof t&&(e=t,t=n.shift()),n.forEach(function(n){J(t,n,e)}),t},N.qsa=function(t,e){var n,r="#"==e[0],i=!r&&"."==e[0],o=r||i?e.slice(1):e,s=T.test(o);return t.getElementById&&s&&r?(n=t.getElementById(o))?[n]:[]:1!==t.nodeType&&9!==t.nodeType&&11!==t.nodeType?[]:u.call(s&&!r&&t.getElementsByClassName?i?t.getElementsByClassName(o):t.getElementsByTagName(e):t.querySelectorAll(e))},r.contains=f.documentElement.contains?function(t,e){return t!==e&&t.contains(e)}:function(t,e){for(;e&&(e=e.parentNode);)if(e===t)return!0;return!1},r.type=$,r.isFunction=F,r.isWindow=k,r.isArray=L,r.isPlainObject=Z,r.isEmptyObject=function(t){var e;for(e in t)return!1;return!0},r.isNumeric=function(t){var e=Number(t),n=typeof t;return null!=t&&"boolean"!=n&&("string"!=n||t.length)&&!isNaN(e)&&isFinite(e)||!1},r.inArray=function(t,e,n){return o.indexOf.call(e,t,n)},r.camelCase=O,r.trim=function(t){return null==t?"":String.prototype.trim.call(t)},r.uuid=0,r.support={},r.expr={},r.noop=function(){},r.map=function(t,e){var n,i,o,r=[];if(z(t))for(i=0;i=0?t:t+this.length]},toArray:function(){return this.get()},size:function(){return this.length},remove:function(){return this.each(function(){null!=this.parentNode&&this.parentNode.removeChild(this)})},each:function(t){return o.every.call(this,function(e,n){return t.call(e,n,e)!==!1}),this},filter:function(t){return F(t)?this.not(this.not(t)):r(a.call(this,function(e){return N.matches(e,t)}))},add:function(t,e){return r(P(this.concat(r(t,e))))},is:function(t){return this.length>0&&N.matches(this[0],t)},not:function(t){var n=[];if(F(t)&&t.call!==e)this.each(function(e){t.call(this,e)||n.push(this)});else{var i="string"==typeof t?this.filter(t):z(t)&&F(t.item)?u.call(t):r(t);this.forEach(function(t){i.indexOf(t)<0&&n.push(t)})}return r(n)},has:function(t){return this.filter(function(){return R(t)?r.contains(this,t):r(this).find(t).size()})},eq:function(t){return-1===t?this.slice(t):this.slice(t,+t+1)},first:function(){var t=this[0];return t&&!R(t)?t:r(t)},last:function(){var t=this[this.length-1];return t&&!R(t)?t:r(t)},find:function(t){var e,n=this;return e=t?"object"==typeof t?r(t).filter(function(){var t=this;return o.some.call(n,function(e){return r.contains(e,t)})}):1==this.length?r(N.qsa(this[0],t)):this.map(function(){return N.qsa(this,t)}):r()},closest:function(t,e){var n=[],i="object"==typeof t&&r(t);return this.each(function(r,o){for(;o&&!(i?i.indexOf(o)>=0:N.matches(o,t));)o=o!==e&&!M(o)&&o.parentNode;o&&n.indexOf(o)<0&&n.push(o)}),r(n)},parents:function(t){for(var e=[],n=this;n.length>0;)n=r.map(n,function(t){return(t=t.parentNode)&&!M(t)&&e.indexOf(t)<0?(e.push(t),t):void 0});return W(e,t)},parent:function(t){return W(P(this.pluck("parentNode")),t)},children:function(t){return W(this.map(function(){return U(this)}),t)},contents:function(){return this.map(function(){return this.contentDocument||u.call(this.childNodes)})},siblings:function(t){return W(this.map(function(t,e){return a.call(U(e.parentNode),function(t){return t!==e})}),t)},empty:function(){return this.each(function(){this.innerHTML=""})},pluck:function(t){return r.map(this,function(e){return e[t]})},show:function(){return this.each(function(){"none"==this.style.display&&(this.style.display=""),"none"==getComputedStyle(this,"").getPropertyValue("display")&&(this.style.display=B(this.nodeName))})},replaceWith:function(t){return this.before(t).remove()},wrap:function(t){var e=F(t);if(this[0]&&!e)var n=r(t).get(0),i=n.parentNode||this.length>1;return this.each(function(o){r(this).wrapAll(e?t.call(this,o):i?n.cloneNode(!0):n)})},wrapAll:function(t){if(this[0]){r(this[0]).before(t=r(t));for(var e;(e=t.children()).length;)t=e.first();r(t).append(this)}return this},wrapInner:function(t){var e=F(t);return this.each(function(n){var i=r(this),o=i.contents(),s=e?t.call(this,n):t;o.length?o.wrapAll(s):i.append(s)})},unwrap:function(){return this.parent().each(function(){r(this).replaceWith(r(this).children())}),this},clone:function(){return this.map(function(){return this.cloneNode(!0)})},hide:function(){return this.css("display","none")},toggle:function(t){return this.each(function(){var n=r(this);(t===e?"none"==n.css("display"):t)?n.show():n.hide()})},prev:function(t){return r(this.pluck("previousElementSibling")).filter(t||"*")},next:function(t){return r(this.pluck("nextElementSibling")).filter(t||"*")},html:function(t){return 0 in arguments?this.each(function(e){var n=this.innerHTML;r(this).empty().append(Y(this,t,e,n))}):0 in this?this[0].innerHTML:null},text:function(t){return 0 in arguments?this.each(function(e){var n=Y(this,t,e,this.textContent);this.textContent=null==n?"":""+n}):0 in this?this.pluck("textContent").join(""):null},attr:function(t,r){var i;return"string"!=typeof t||1 in arguments?this.each(function(e){if(1===this.nodeType)if(R(t))for(n in t)G(this,n,t[n]);else G(this,t,Y(this,r,e,this.getAttribute(t)))}):0 in this&&1==this[0].nodeType&&null!=(i=this[0].getAttribute(t))?i:e},removeAttr:function(t){return this.each(function(){1===this.nodeType&&t.split(" ").forEach(function(t){G(this,t)},this)})},prop:function(t,e){return t=D[t]||t,1 in arguments?this.each(function(n){this[t]=Y(this,e,n,this[t])}):this[0]&&this[0][t]},removeProp:function(t){return t=D[t]||t,this.each(function(){delete this[t]})},data:function(t,n){var r="data-"+t.replace(v,"-$1").toLowerCase(),i=1 in arguments?this.attr(r,n):this.attr(r);return null!==i?Q(i):e},val:function(t){return 0 in arguments?(null==t&&(t=""),this.each(function(e){this.value=Y(this,t,e,this.value)})):this[0]&&(this[0].multiple?r(this[0]).find("option").filter(function(){return this.selected}).pluck("value"):this[0].value)},offset:function(e){if(e)return this.each(function(t){var n=r(this),i=Y(this,e,t,n.offset()),o=n.offsetParent().offset(),s={top:i.top-o.top,left:i.left-o.left};"static"==n.css("position")&&(s.position="relative"),n.css(s)});if(!this.length)return null;if(f.documentElement!==this[0]&&!r.contains(f.documentElement,this[0]))return{top:0,left:0};var n=this[0].getBoundingClientRect();return{left:n.left+t.pageXOffset,top:n.top+t.pageYOffset,width:Math.round(n.width),height:Math.round(n.height)}},css:function(t,e){if(arguments.length<2){var i=this[0];if("string"==typeof t){if(!i)return;return i.style[O(t)]||getComputedStyle(i,"").getPropertyValue(t)}if(L(t)){if(!i)return;var o={},s=getComputedStyle(i,"");return r.each(t,function(t,e){o[e]=i.style[O(e)]||s.getPropertyValue(e)}),o}}var a="";if("string"==$(t))e||0===e?a=I(t)+":"+_(t,e):this.each(function(){this.style.removeProperty(I(t))});else for(n in t)t[n]||0===t[n]?a+=I(n)+":"+_(n,t[n])+";":this.each(function(){this.style.removeProperty(I(n))});return this.each(function(){this.style.cssText+=";"+a})},index:function(t){return t?this.indexOf(r(t)[0]):this.parent().children().indexOf(this[0])},hasClass:function(t){return t?o.some.call(this,function(t){return this.test(K(t))},V(t)):!1},addClass:function(t){return t?this.each(function(e){if("className"in this){i=[];var n=K(this),o=Y(this,t,e,n);o.split(/\s+/g).forEach(function(t){r(this).hasClass(t)||i.push(t)},this),i.length&&K(this,n+(n?" ":"")+i.join(" "))}}):this},removeClass:function(t){return this.each(function(n){if("className"in this){if(t===e)return K(this,"");i=K(this),Y(this,t,n,i).split(/\s+/g).forEach(function(t){i=i.replace(V(t)," ")}),K(this,i.trim())}})},toggleClass:function(t,n){return t?this.each(function(i){var o=r(this),s=Y(this,t,i,K(this));s.split(/\s+/g).forEach(function(t){(n===e?!o.hasClass(t):n)?o.addClass(t):o.removeClass(t)})}):this},scrollTop:function(t){if(this.length){var n="scrollTop"in this[0];return t===e?n?this[0].scrollTop:this[0].pageYOffset:this.each(n?function(){this.scrollTop=t}:function(){this.scrollTo(this.scrollX,t)})}},scrollLeft:function(t){if(this.length){var n="scrollLeft"in this[0];return t===e?n?this[0].scrollLeft:this[0].pageXOffset:this.each(n?function(){this.scrollLeft=t}:function(){this.scrollTo(t,this.scrollY)})}},position:function(){if(this.length){var t=this[0],e=this.offsetParent(),n=this.offset(),i=g.test(e[0].nodeName)?{top:0,left:0}:e.offset();return n.top-=parseFloat(r(t).css("margin-top"))||0,n.left-=parseFloat(r(t).css("margin-left"))||0,i.top+=parseFloat(r(e[0]).css("border-top-width"))||0,i.left+=parseFloat(r(e[0]).css("border-left-width"))||0,{top:n.top-i.top,left:n.left-i.left}}},offsetParent:function(){return this.map(function(){for(var t=this.offsetParent||f.body;t&&!g.test(t.nodeName)&&"static"==r(t).css("position");)t=t.offsetParent;return t})}},r.fn.detach=r.fn.remove,["width","height"].forEach(function(t){var n=t.replace(/./,function(t){return t[0].toUpperCase()});r.fn[t]=function(i){var o,s=this[0];return i===e?k(s)?s["inner"+n]:M(s)?s.documentElement["scroll"+n]:(o=this.offset())&&o[t]:this.each(function(e){s=r(this),s.css(t,Y(this,i,e,s[t]()))})}}),x.forEach(function(n,i){var o=i%2;r.fn[n]=function(){var n,a,s=r.map(arguments,function(t){var i=[];return n=$(t),"array"==n?(t.forEach(function(t){return t.nodeType!==e?i.push(t):r.zepto.isZ(t)?i=i.concat(t.get()):void(i=i.concat(N.fragment(t)))}),i):"object"==n||null==t?t:N.fragment(t)}),u=this.length>1;return s.length<1?this:this.each(function(e,n){a=o?n:n.parentNode,n=0==i?n.nextSibling:1==i?n.firstChild:2==i?n:null;var c=r.contains(f.documentElement,a);s.forEach(function(e){if(u)e=e.cloneNode(!0);else if(!a)return r(e).remove();a.insertBefore(e,n),c&&tt(e,function(e){if(!(null==e.nodeName||"SCRIPT"!==e.nodeName.toUpperCase()||e.type&&"text/javascript"!==e.type||e.src)){var n=e.ownerDocument?e.ownerDocument.defaultView:t;n.eval.call(n,e.innerHTML)}})})})},r.fn[o?n+"To":"insert"+(i?"Before":"After")]=function(t){return r(t)[n](this),this}}),N.Z.prototype=X.prototype=r.fn,N.uniq=P,N.deserializeValue=Q,r.zepto=N,r}();return t.Zepto=e,void 0===t.$&&(t.$=e),function(e){function h(t){return t._zid||(t._zid=n++)}function p(t,e,n,r){if(e=d(e),e.ns)var i=m(e.ns);return(a[h(t)]||[]).filter(function(t){return t&&(!e.e||t.e==e.e)&&(!e.ns||i.test(t.ns))&&(!n||h(t.fn)===h(n))&&(!r||t.sel==r)})}function d(t){var e=(""+t).split(".");return{e:e[0],ns:e.slice(1).sort().join(" ")}}function m(t){return new RegExp("(?:^| )"+t.replace(" "," .* ?")+"(?: |$)")}function g(t,e){return t.del&&!f&&t.e in c||!!e}function v(t){return l[t]||f&&c[t]||t}function y(t,n,i,o,s,u,f){var c=h(t),p=a[c]||(a[c]=[]);n.split(/\s/).forEach(function(n){if("ready"==n)return e(document).ready(i);var a=d(n);a.fn=i,a.sel=s,a.e in l&&(i=function(t){var n=t.relatedTarget;return!n||n!==this&&!e.contains(this,n)?a.fn.apply(this,arguments):void 0}),a.del=u;var c=u||i;a.proxy=function(e){if(e=T(e),!e.isImmediatePropagationStopped()){e.data=o;var n=c.apply(t,e._args==r?[e]:[e].concat(e._args));return n===!1&&(e.preventDefault(),e.stopPropagation()),n}},a.i=p.length,p.push(a),"addEventListener"in t&&t.addEventListener(v(a.e),a.proxy,g(a,f))})}function x(t,e,n,r,i){var o=h(t);(e||"").split(/\s/).forEach(function(e){p(t,e,n,r).forEach(function(e){delete a[o][e.i],"removeEventListener"in t&&t.removeEventListener(v(e.e),e.proxy,g(e,i))})})}function T(t,n){return(n||!t.isDefaultPrevented)&&(n||(n=t),e.each(w,function(e,r){var i=n[e];t[e]=function(){return this[r]=b,i&&i.apply(n,arguments)},t[r]=E}),t.timeStamp||(t.timeStamp=Date.now()),(n.defaultPrevented!==r?n.defaultPrevented:"returnValue"in n?n.returnValue===!1:n.getPreventDefault&&n.getPreventDefault())&&(t.isDefaultPrevented=b)),t}function S(t){var e,n={originalEvent:t};for(e in t)j.test(e)||t[e]===r||(n[e]=t[e]);return T(n,t)}var r,n=1,i=Array.prototype.slice,o=e.isFunction,s=function(t){return"string"==typeof t},a={},u={},f="onfocusin"in t,c={focus:"focusin",blur:"focusout"},l={mouseenter:"mouseover",mouseleave:"mouseout"};u.click=u.mousedown=u.mouseup=u.mousemove="MouseEvents",e.event={add:y,remove:x},e.proxy=function(t,n){var r=2 in arguments&&i.call(arguments,2);if(o(t)){var a=function(){return t.apply(n,r?r.concat(i.call(arguments)):arguments)};return a._zid=h(t),a}if(s(n))return r?(r.unshift(t[n],t),e.proxy.apply(null,r)):e.proxy(t[n],t);throw new TypeError("expected function")},e.fn.bind=function(t,e,n){return this.on(t,e,n)},e.fn.unbind=function(t,e){return this.off(t,e)},e.fn.one=function(t,e,n,r){return this.on(t,e,n,r,1)};var b=function(){return!0},E=function(){return!1},j=/^([A-Z]|returnValue$|layer[XY]$|webkitMovement[XY]$)/,w={preventDefault:"isDefaultPrevented",stopImmediatePropagation:"isImmediatePropagationStopped",stopPropagation:"isPropagationStopped"};e.fn.delegate=function(t,e,n){return this.on(e,t,n)},e.fn.undelegate=function(t,e,n){return this.off(e,t,n)},e.fn.live=function(t,n){return e(document.body).delegate(this.selector,t,n),this},e.fn.die=function(t,n){return e(document.body).undelegate(this.selector,t,n),this},e.fn.on=function(t,n,a,u,f){var c,l,h=this;return t&&!s(t)?(e.each(t,function(t,e){h.on(t,n,a,e,f)}),h):(s(n)||o(u)||u===!1||(u=a,a=n,n=r),(u===r||a===!1)&&(u=a,a=r),u===!1&&(u=E),h.each(function(r,o){f&&(c=function(t){return x(o,t.type,u),u.apply(this,arguments)}),n&&(l=function(t){var r,s=e(t.target).closest(n,o).get(0);return s&&s!==o?(r=e.extend(S(t),{currentTarget:s,liveFired:o}),(c||u).apply(s,[r].concat(i.call(arguments,1)))):void 0}),y(o,t,u,a,n,l||c)}))},e.fn.off=function(t,n,i){var a=this;return t&&!s(t)?(e.each(t,function(t,e){a.off(t,n,e)}),a):(s(n)||o(i)||i===!1||(i=n,n=r),i===!1&&(i=E),a.each(function(){x(this,t,i,n)}))},e.fn.trigger=function(t,n){return t=s(t)||e.isPlainObject(t)?e.Event(t):T(t),t._args=n,this.each(function(){t.type in c&&"function"==typeof this[t.type]?this[t.type]():"dispatchEvent"in this?this.dispatchEvent(t):e(this).triggerHandler(t,n)})},e.fn.triggerHandler=function(t,n){var r,i;return this.each(function(o,a){r=S(s(t)?e.Event(t):t),r._args=n,r.target=a,e.each(p(a,t.type||t),function(t,e){return i=e.proxy(r),r.isImmediatePropagationStopped()?!1:void 0})}),i},"focusin focusout focus blur load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select keydown keypress keyup error".split(" ").forEach(function(t){e.fn[t]=function(e){return 0 in arguments?this.bind(t,e):this.trigger(t)}}),e.Event=function(t,e){s(t)||(e=t,t=e.type);var n=document.createEvent(u[t]||"Events"),r=!0;if(e)for(var i in e)"bubbles"==i?r=!!e[i]:n[i]=e[i];return n.initEvent(t,r,!0),T(n)}}(e),function(e){function p(t,n,r){var i=e.Event(n);return e(t).trigger(i,r),!i.isDefaultPrevented()}function d(t,e,n,i){return t.global?p(e||r,n,i):void 0}function m(t){t.global&&0===e.active++&&d(t,null,"ajaxStart")}function g(t){t.global&&!--e.active&&d(t,null,"ajaxStop")}function v(t,e){var n=e.context;return e.beforeSend.call(n,t,e)===!1||d(e,n,"ajaxBeforeSend",[t,e])===!1?!1:void d(e,n,"ajaxSend",[t,e])}function y(t,e,n,r){var i=n.context,o="success";n.success.call(i,t,o,e),r&&r.resolveWith(i,[t,o,e]),d(n,i,"ajaxSuccess",[e,n,t]),b(o,e,n)}function x(t,e,n,r,i){var o=r.context;r.error.call(o,n,e,t),i&&i.rejectWith(o,[n,e,t]),d(r,o,"ajaxError",[n,r,t||e]),b(e,n,r)}function b(t,e,n){var r=n.context;n.complete.call(r,e,t),d(n,r,"ajaxComplete",[e,n]),g(n)}function E(t,e,n){if(n.dataFilter==j)return t;var r=n.context;return n.dataFilter.call(r,t,e)}function j(){}function w(t){return t&&(t=t.split(";",2)[0]),t&&(t==c?"html":t==f?"json":a.test(t)?"script":u.test(t)&&"xml")||"text"}function T(t,e){return""==e?t:(t+"&"+e).replace(/[&?]{1,2}/,"?")}function S(t){t.processData&&t.data&&"string"!=e.type(t.data)&&(t.data=e.param(t.data,t.traditional)),!t.data||t.type&&"GET"!=t.type.toUpperCase()&&"jsonp"!=t.dataType||(t.url=T(t.url,t.data),t.data=void 0)}function C(t,n,r,i){return e.isFunction(n)&&(i=r,r=n,n=void 0),e.isFunction(r)||(i=r,r=void 0),{url:t,data:n,success:r,dataType:i}}function O(t,n,r,i){var o,s=e.isArray(n),a=e.isPlainObject(n);e.each(n,function(n,u){o=e.type(u),i&&(n=r?i:i+"["+(a||"object"==o||"array"==o?n:"")+"]"),!i&&s?t.add(u.name,u.value):"array"==o||!r&&"object"==o?O(t,u,r,n):t.add(n,u)})}var i,o,n=+new Date,r=t.document,s=/)<[^<]*)*<\/script>/gi,a=/^(?:text|application)\/javascript/i,u=/^(?:text|application)\/xml/i,f="application/json",c="text/html",l=/^\s*$/,h=r.createElement("a");h.href=t.location.href,e.active=0,e.ajaxJSONP=function(i,o){if(!("type"in i))return e.ajax(i);var c,p,s=i.jsonpCallback,a=(e.isFunction(s)?s():s)||"Zepto"+n++,u=r.createElement("script"),f=t[a],l=function(t){e(u).triggerHandler("error",t||"abort")},h={abort:l};return o&&o.promise(h),e(u).on("load error",function(n,r){clearTimeout(p),e(u).off().remove(),"error"!=n.type&&c?y(c[0],h,i,o):x(null,r||"error",h,i,o),t[a]=f,c&&e.isFunction(f)&&f(c[0]),f=c=void 0}),v(h,i)===!1?(l("abort"),h):(t[a]=function(){c=arguments},u.src=i.url.replace(/\?(.+)=\?/,"?$1="+a),r.head.appendChild(u),i.timeout>0&&(p=setTimeout(function(){l("timeout")},i.timeout)),h)},e.ajaxSettings={type:"GET",beforeSend:j,success:j,error:j,complete:j,context:null,global:!0,xhr:function(){return new t.XMLHttpRequest},accepts:{script:"text/javascript, application/javascript, application/x-javascript",json:f,xml:"application/xml, text/xml",html:c,text:"text/plain"},crossDomain:!1,timeout:0,processData:!0,cache:!0,dataFilter:j},e.ajax=function(n){var u,f,s=e.extend({},n||{}),a=e.Deferred&&e.Deferred();for(i in e.ajaxSettings)void 0===s[i]&&(s[i]=e.ajaxSettings[i]);m(s),s.crossDomain||(u=r.createElement("a"),u.href=s.url,u.href=u.href,s.crossDomain=h.protocol+"//"+h.host!=u.protocol+"//"+u.host),s.url||(s.url=t.location.toString()),(f=s.url.indexOf("#"))>-1&&(s.url=s.url.slice(0,f)),S(s);var c=s.dataType,p=/\?.+=\?/.test(s.url);if(p&&(c="jsonp"),s.cache!==!1&&(n&&n.cache===!0||"script"!=c&&"jsonp"!=c)||(s.url=T(s.url,"_="+Date.now())),"jsonp"==c)return p||(s.url=T(s.url,s.jsonp?s.jsonp+"=?":s.jsonp===!1?"":"callback=?")),e.ajaxJSONP(s,a);var P,d=s.accepts[c],g={},b=function(t,e){g[t.toLowerCase()]=[t,e]},C=/^([\w-]+:)\/\//.test(s.url)?RegExp.$1:t.location.protocol,N=s.xhr(),O=N.setRequestHeader;if(a&&a.promise(N),s.crossDomain||b("X-Requested-With","XMLHttpRequest"),b("Accept",d||"*/*"),(d=s.mimeType||d)&&(d.indexOf(",")>-1&&(d=d.split(",",2)[0]),N.overrideMimeType&&N.overrideMimeType(d)),(s.contentType||s.contentType!==!1&&s.data&&"GET"!=s.type.toUpperCase())&&b("Content-Type",s.contentType||"application/x-www-form-urlencoded"),s.headers)for(o in s.headers)b(o,s.headers[o]);if(N.setRequestHeader=b,N.onreadystatechange=function(){if(4==N.readyState){N.onreadystatechange=j,clearTimeout(P);var t,n=!1;if(N.status>=200&&N.status<300||304==N.status||0==N.status&&"file:"==C){if(c=c||w(s.mimeType||N.getResponseHeader("content-type")),"arraybuffer"==N.responseType||"blob"==N.responseType)t=N.response;else{t=N.responseText;try{t=E(t,c,s),"script"==c?(1,eval)(t):"xml"==c?t=N.responseXML:"json"==c&&(t=l.test(t)?null:e.parseJSON(t))}catch(r){n=r}if(n)return x(n,"parsererror",N,s,a)}y(t,N,s,a)}else x(N.statusText||null,N.status?"error":"abort",N,s,a)}},v(N,s)===!1)return N.abort(),x(null,"abort",N,s,a),N;var A="async"in s?s.async:!0;if(N.open(s.type,s.url,A,s.username,s.password),s.xhrFields)for(o in s.xhrFields)N[o]=s.xhrFields[o];for(o in g)O.apply(N,g[o]);return s.timeout>0&&(P=setTimeout(function(){N.onreadystatechange=j,N.abort(),x(null,"timeout",N,s,a)},s.timeout)),N.send(s.data?s.data:null),N},e.get=function(){return e.ajax(C.apply(null,arguments))},e.post=function(){var t=C.apply(null,arguments);return t.type="POST",e.ajax(t)},e.getJSON=function(){var t=C.apply(null,arguments);return t.dataType="json",e.ajax(t)},e.fn.load=function(t,n,r){if(!this.length)return this;var a,i=this,o=t.split(/\s/),u=C(t,n,r),f=u.success;return o.length>1&&(u.url=o[0],a=o[1]),u.success=function(t){i.html(a?e("
                                                                                                                                  ").html(t.replace(s,"")).find(a):t),f&&f.apply(i,arguments)},e.ajax(u),this};var N=encodeURIComponent;e.param=function(t,n){var r=[];return r.add=function(t,n){e.isFunction(n)&&(n=n()),null==n&&(n=""),this.push(N(t)+"="+N(n))},O(r,t,n),r.join("&").replace(/%20/g,"+")}}(e),function(t){t.fn.serializeArray=function(){var e,n,r=[],i=function(t){return t.forEach?t.forEach(i):void r.push({name:e,value:t})};return this[0]&&t.each(this[0].elements,function(r,o){n=o.type,e=o.name,e&&"fieldset"!=o.nodeName.toLowerCase()&&!o.disabled&&"submit"!=n&&"reset"!=n&&"button"!=n&&"file"!=n&&("radio"!=n&&"checkbox"!=n||o.checked)&&i(t(o).val())}),r},t.fn.serialize=function(){var t=[];return this.serializeArray().forEach(function(e){t.push(encodeURIComponent(e.name)+"="+encodeURIComponent(e.value))}),t.join("&")},t.fn.submit=function(e){if(0 in arguments)this.bind("submit",e);else if(this.length){var n=t.Event("submit");this.eq(0).trigger(n),n.isDefaultPrevented()||this.get(0).submit()}return this}}(e),function(){try{getComputedStyle(void 0)}catch(e){var n=getComputedStyle;t.getComputedStyle=function(t,e){try{return n(t,e)}catch(r){return null}}}}(),e}); \ No newline at end of file diff --git a/documentation/js/menu-wc.js b/documentation/js/menu-wc.js new file mode 100644 index 00000000..0851cf1b --- /dev/null +++ b/documentation/js/menu-wc.js @@ -0,0 +1,391 @@ +'use strict'; + +customElements.define('compodoc-menu', class extends HTMLElement { + constructor() { + super(); + this.isNormalMode = this.getAttribute('mode') === 'normal'; + } + + connectedCallback() { + this.render(this.isNormalMode); + } + + render(isNormalMode) { + let tp = lithtml.html(` + + `); + this.innerHTML = tp.strings; + } +}); \ No newline at end of file diff --git a/documentation/js/menu-wc_es5.js b/documentation/js/menu-wc_es5.js new file mode 100644 index 00000000..902225ea --- /dev/null +++ b/documentation/js/menu-wc_es5.js @@ -0,0 +1,60 @@ +'use strict'; + +function _typeof(obj) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, _typeof(obj); } + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, "prototype", { writable: false }); if (superClass) _setPrototypeOf(subClass, superClass); } + +function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; } + +function _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === "object" || typeof call === "function")) { return call; } else if (call !== void 0) { throw new TypeError("Derived constructors may only return object or undefined"); } return _assertThisInitialized(self); } + +function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } + +function _wrapNativeSuper(Class) { var _cache = typeof Map === "function" ? new Map() : undefined; _wrapNativeSuper = function _wrapNativeSuper(Class) { if (Class === null || !_isNativeFunction(Class)) return Class; if (typeof Class !== "function") { throw new TypeError("Super expression must either be null or a function"); } if (typeof _cache !== "undefined") { if (_cache.has(Class)) return _cache.get(Class); _cache.set(Class, Wrapper); } function Wrapper() { return _construct(Class, arguments, _getPrototypeOf(this).constructor); } Wrapper.prototype = Object.create(Class.prototype, { constructor: { value: Wrapper, enumerable: false, writable: true, configurable: true } }); return _setPrototypeOf(Wrapper, Class); }; return _wrapNativeSuper(Class); } + +function _construct(Parent, args, Class) { if (_isNativeReflectConstruct()) { _construct = Reflect.construct; } else { _construct = function _construct(Parent, args, Class) { var a = [null]; a.push.apply(a, args); var Constructor = Function.bind.apply(Parent, a); var instance = new Constructor(); if (Class) _setPrototypeOf(instance, Class.prototype); return instance; }; } return _construct.apply(null, arguments); } + +function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } } + +function _isNativeFunction(fn) { return Function.toString.call(fn).indexOf("[native code]") !== -1; } + +function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); } + +function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); } + +customElements.define('compodoc-menu', /*#__PURE__*/function (_HTMLElement) { + _inherits(_class, _HTMLElement); + + var _super = _createSuper(_class); + + function _class() { + var _this; + + _classCallCheck(this, _class); + + _this = _super.call(this); + _this.isNormalMode = _this.getAttribute('mode') === 'normal'; + return _this; + } + + _createClass(_class, [{ + key: "connectedCallback", + value: function connectedCallback() { + this.render(this.isNormalMode); + } + }, { + key: "render", + value: function render(isNormalMode) { + var tp = lithtml.html("\n \n ")); + this.innerHTML = tp.strings; + } + }]); + + return _class; +}( /*#__PURE__*/_wrapNativeSuper(HTMLElement))); diff --git a/documentation/js/menu.js b/documentation/js/menu.js new file mode 100644 index 00000000..1d2b1def --- /dev/null +++ b/documentation/js/menu.js @@ -0,0 +1,319 @@ +document.addEventListener('DOMContentLoaded', function () { + var menuCollapsed = false, + mobileMenu = document.getElementById('mobile-menu'); + + var localContextInUrl = ''; + + if (COMPODOC_CURRENT_PAGE_CONTEXT !== '') { + switch (COMPODOC_CURRENT_PAGE_CONTEXT) { + case 'additional-page': + localContextInUrl = 'additional-documentation'; + break; + case 'class': + localContextInUrl = 'classes'; + break; + case 'miscellaneous-functions': + case 'miscellaneous-variables': + case 'miscellaneous-typealiases': + case 'miscellaneous-enumerations': + localContextInUrl = 'miscellaneous'; + default: + break; + } + } + + function hasClass(el, cls) { + return el.className && new RegExp('(\\s|^)' + cls + '(\\s|$)').test(el.className); + } + + var processLink = function (link, url) { + if (url.charAt(0) !== '.') { + var prefix = ''; + switch (COMPODOC_CURRENT_PAGE_DEPTH) { + case 5: + prefix = '../../../../../'; + break; + case 4: + prefix = '../../../../'; + break; + case 3: + prefix = '../../../'; + break; + case 2: + prefix = '../../'; + break; + case 1: + prefix = '../'; + break; + case 0: + prefix = './'; + break; + } + link.setAttribute('href', prefix + url); + } + }; + + var processMenuLinks = function (links, dontAddClass) { + for (var i = 0; i < links.length; i++) { + var link = links[i]; + var linkHref = link.getAttribute('href'); + if (linkHref) { + var linkHrefFile = linkHref.substr(linkHref.lastIndexOf('/') + 1, linkHref.length); + if ( + linkHrefFile.toLowerCase() === COMPODOC_CURRENT_PAGE_URL.toLowerCase() && + link.innerHTML.indexOf('Getting started') == -1 && + !dontAddClass && + linkHref.toLowerCase().indexOf(localContextInUrl.toLowerCase()) !== -1 + ) { + link.classList.add('active'); + } + processLink(link, linkHref); + } + } + }; + var chapterLinks = document.querySelectorAll('[data-type="chapter-link"]'); + processMenuLinks(chapterLinks); + var entityLinks = document.querySelectorAll('[data-type="entity-link"]'); + processMenuLinks(entityLinks); + var indexLinks = document.querySelectorAll('[data-type="index-link"]'); + processMenuLinks(indexLinks, true); + var entityLogos = document.querySelectorAll('[data-type="compodoc-logo"]'); + var processLogos = function (entityLogo) { + for (var i = 0; i < entityLogos.length; i++) { + var entityLogo = entityLogos[i]; + if (entityLogo) { + var url = entityLogo.getAttribute('data-src'); + // Dark mode + logo + let isDarkMode = window.matchMedia('(prefers-color-scheme: dark)').matches; + if (isDarkMode) { + url = 'images/compodoc-vectorise-inverted.png'; + } + if (url.charAt(0) !== '.') { + var prefix = ''; + switch (COMPODOC_CURRENT_PAGE_DEPTH) { + case 5: + prefix = '../../../../../'; + break; + case 4: + prefix = '../../../../'; + break; + case 3: + prefix = '../../../'; + break; + case 2: + prefix = '../../'; + break; + case 1: + prefix = '../'; + break; + case 0: + prefix = './'; + break; + } + entityLogo.src = prefix + url; + } + } + } + }; + processLogos(entityLogos); + + setTimeout(function () { + document.getElementById('btn-menu').addEventListener('click', function () { + if (menuCollapsed) { + mobileMenu.style.display = 'none'; + } else { + mobileMenu.style.display = 'block'; + document.getElementsByTagName('body')[0].style['overflow-y'] = 'hidden'; + } + menuCollapsed = !menuCollapsed; + }); + + /** + * Native bootstrap doesn't wait DOMContentLoaded event to start his job, re do it here + */ + var Collapses = document.querySelectorAll('[data-toggle="collapse"]'); + for (var o = 0, cll = Collapses.length; o < cll; o++) { + var collapse = Collapses[o], + options = {}; + options.duration = collapse.getAttribute('data-duration'); + var c = new Collapse(collapse, options); + } + + // collapse menu + var classnameMenuToggler = document.getElementsByClassName('menu-toggler'), + faAngleUpClass = 'ion-ios-arrow-up', + faAngleDownClass = 'ion-ios-arrow-down', + toggleItemMenu = function (e) { + var element = $(e.target), + parent = element[0].parentNode, + parentLink, + elementIconChild; + if (parent) { + if (!$(parent).hasClass('linked')) { + e.preventDefault(); + } else { + parentLink = parent.parentNode; + if (parentLink && element.hasClass('link-name')) { + $(parentLink).trigger('click'); + } + } + elementIconChild = parent.getElementsByClassName(faAngleUpClass)[0]; + if (!elementIconChild) { + elementIconChild = parent.getElementsByClassName(faAngleDownClass)[0]; + } + if (elementIconChild) { + elementIconChild = $(elementIconChild); + if (elementIconChild.hasClass(faAngleUpClass)) { + elementIconChild.addClass(faAngleDownClass); + elementIconChild.removeClass(faAngleUpClass); + } else { + elementIconChild.addClass(faAngleUpClass); + elementIconChild.removeClass(faAngleDownClass); + } + } + } + }; + + for (var i = 0; i < classnameMenuToggler.length; i++) { + classnameMenuToggler[i].addEventListener('click', toggleItemMenu, false); + } + + // Scroll to active link + var menus = document.querySelectorAll('.menu'), + i = 0, + len = menus.length, + activeMenu, + activeMenuClass, + activeLink; + + for (i; i < len; i++) { + if (getComputedStyle(menus[i]).display != 'none') { + activeMenu = menus[i]; + activeMenuClass = activeMenu.getAttribute('class').split(' ')[0]; + } + } + + if (activeMenu) { + activeLink = document.querySelector('.' + activeMenuClass + ' .active'); + if (activeLink) { + var linkType = activeLink.getAttribute('data-type'); + var linkContext = activeLink.getAttribute('data-context'); + if (linkType === 'entity-link') { + var parentLi = activeLink.parentNode, + parentUl, + parentChapterMenu; + if (parentLi) { + parentUl = parentLi.parentNode; + if (parentUl) { + parentChapterMenu = parentUl.parentNode; + if (parentChapterMenu) { + var toggler = parentChapterMenu.querySelector('.menu-toggler'), + elementIconChild = + toggler.getElementsByClassName(faAngleUpClass)[0]; + if (toggler && !elementIconChild) { + toggler.click(); + } + } + } + } + if (linkContext && linkContext === 'sub-entity') { + // Toggle also the master parent menu + var linkContextId = activeLink.getAttribute('data-context-id'); + var toggler = activeMenu.querySelector( + '.chapter.' + linkContextId + ' a .menu-toggler' + ); + if (toggler) { + toggler.click(); + } + if (linkContextId === 'additional') { + var mainToggler = activeMenu.querySelector( + '.chapter.' + linkContextId + ' div.menu-toggler' + ); + if (mainToggler) { + mainToggler.click(); + } + } + } + } else if (linkType === 'chapter-link') { + var linkContextId = activeLink.getAttribute('data-context-id'); + var toggler = activeLink.querySelector('.menu-toggler'); + if (toggler) { + toggler.click(); + } + if (linkContextId === 'additional') { + var mainToggler = activeMenu.querySelector( + '.chapter.' + linkContextId + ' div.menu-toggler' + ); + if (mainToggler) { + mainToggler.click(); + } + } + } + setTimeout(function () { + activeMenu.scrollTop = activeLink.offsetTop; + if ( + activeLink.innerHTML.toLowerCase().indexOf('readme') != -1 || + activeLink.innerHTML.toLowerCase().indexOf('overview') != -1 + ) { + activeMenu.scrollTop = 0; + } + }, 300); + } + } + // Dark mode toggle button + var useDark = window.matchMedia('(prefers-color-scheme: dark)'); + var darkModeState = useDark.matches; + var $darkModeToggleSwitchers = document.querySelectorAll('.dark-mode-switch input'); + var $darkModeToggles = document.querySelectorAll('.dark-mode-switch'); + var darkModeStateLocal = localStorage.getItem('compodoc_darkmode-state'); + + function checkToggle(check) { + for (var i = 0; i < $darkModeToggleSwitchers.length; i++) { + $darkModeToggleSwitchers[i].checked = check; + } + } + + function toggleDarkMode(state) { + if (window.localStorage) { + localStorage.setItem('compodoc_darkmode-state', state); + } + + checkToggle(state); + + const hasClass = document.body.classList.contains('dark'); + + if (state) { + for (var i = 0; i < $darkModeToggles.length; i++) { + $darkModeToggles[i].classList.add('dark'); + } + if (!hasClass) { + document.body.classList.add('dark'); + } + } else { + for (var i = 0; i < $darkModeToggles.length; i++) { + $darkModeToggles[i].classList.remove('dark'); + } + if (hasClass) { + document.body.classList.remove('dark'); + } + } + } + + useDark.addEventListener('change', function (evt) { + toggleDarkMode(evt.matches); + }); + if (darkModeStateLocal) { + darkModeState = darkModeStateLocal === 'true'; + } + toggleDarkMode(darkModeState); + + if ($darkModeToggles.length > 0) { + for (var i = 0; i < $darkModeToggleSwitchers.length; i++) { + $darkModeToggleSwitchers[i].addEventListener('change', function (event) { + darkModeState = !darkModeState; + toggleDarkMode(darkModeState); + }); + } + } + }, 0); +}); diff --git a/documentation/js/routes.js b/documentation/js/routes.js new file mode 100644 index 00000000..bfd875cc --- /dev/null +++ b/documentation/js/routes.js @@ -0,0 +1,280 @@ +document.addEventListener('DOMContentLoaded', function() { + + function htmlEntities(str) { + return String(str).replace(/&/g, '&').replace(//g, '>').replace(/"/g, '"'); + } + + function foundLazyModuleWithPath(path) { + //path is like app/customers/customers.module#CustomersModule + var split = path.split('#'), + lazyModulePath = split[0], + lazyModuleName = split[1]; + return lazyModuleName; + } + + function getBB(selection) { + selection.each(function(d){d.bbox = this.getBBox();}) + } + + var test_cases, + test_case, + test_case_num, + engine; + + var tree = ROUTES_INDEX; + + function cleanStringChildren(obj) { + for (var property in obj) { + if (obj.hasOwnProperty(property)) { + if (property === 'children' && typeof obj[property] === 'object') { + for (var i = obj[property].length - 1; i >= 0 ; i--) { + if (typeof obj[property][i] === 'string') { + obj[property].splice(i, 1); + } + } + } + if (typeof obj[property] === 'object') { + cleanStringChildren(obj[property]); + } + } + } + } + cleanStringChildren(tree); + + engine = d3.layout.tree().setNodeSizes(true); + + engine.spacing(function(a, b) { + return a.parent == b.parent ? + 0 : engine.rootXSize(); + }) + + engine.nodeSize(function(d) { + return [document.getElementById(d.id).getBBox()["height"] + 70, document.getElementById(d.id).getBBox()["width"] + 30]; + }); + + var nodes = d3.layout.hierarchy()(tree), + + svg = d3.select("#body-routes").append('svg'), + svg_g = svg.append("g"), + svg_p = svg.append("g"), + last_id = 0, + + node = svg_g.selectAll(".node") + .data(nodes, function(d) { + return d.id || (d.id = ++last_id); + }) + .enter().append("g") + .attr("class", "node"); + + svg + .attr('id', 'main') + + svg_g + .attr("transform", "translate(20,0)") + .attr('id', 'main-group') + + svg_p + .attr("transform", "translate(20,0)") + .attr('id', 'paths') + + var infos_group = node.append("g") + .attr({ + "id": function(d) { + return d.id; + }, + dx: 0, + dy: 0, + }) + + //Node icon + infos_group.append("text") + .attr('font-family', 'Ionicons') + .attr("y", 5) + .attr("x", 0) + .attr('class', function(d) { + return d.children || d._children + ? "icon has-children" + : "icon"; + }) + .attr('font-size', function(d) { + return '15px' + }).text(function(d) { + return '\uf183' + }); + + //node infos + infos_group.append("svg:text") + .attr("x", function(d) { + return 0; + }) + .attr("y", function(d) { + return 10; + }) + .attr("dy", ".35em") + .attr('class', 'text') + .attr("text-anchor", function(d) { + return "start"; + }).html(function(d) { + // if kind === module name + module + // if kind === component component + path + var _name = ''; + if (d.kind === 'module') { + if (d.module) { + _name += '' + d.module + ''; + if (d.name) { + _name += '' + d.name + ''; + } + } else { + _name += '' + htmlEntities(d.name) + ''; + } + } else if (d.kind === 'component') { + _name += '' + d.path + '' + _name += '' + d.component + '' + if (d.outlet) { + _name += '<outlet> : ' + d.outlet + '' + } + } else { + _name += '/' + d.path + '' + if (d.component) { + _name += '' + d.component + '' + } + if (d.loadChildren) { + var moduleName = foundLazyModuleWithPath(d.loadChildren); + _name += '' + moduleName + '' + } + if (d.canActivate) { + _name += '✓ canActivate' + } + if (d.canDeactivate) { + _name += '×  canDeactivate' + } + if (d.canActivateChild) { + _name += '✓ canActivateChild' + } + if (d.canLoad) { + _name += '→ canLoad' + } + if (d.redirectTo) { + _name += '→ ' + d.redirectTo + '' + } + if (d.pathMatch) { + _name += '> ' + d.pathMatch + '' + } + if (d.outlet) { + _name += '<outlet> : ' + d.outlet + '' + } + } + return _name; + }) + .call(getBB); + + // + // Node lazy loaded ? + // + infos_group.append('svg:text') + .attr("y", function(d) { + return 45; + }) + .attr("x", function(d) { + return -18; + }) + .attr('font-family', 'Ionicons') + .attr('class', function(d) { + return "icon"; + }) + .attr('font-size', function(d) { + return '15px' + }).text(function(d) { + var _text = ''; + if (d.loadChildren) { + _text = '\uf4c1'; + } + if (d.guarded) { + _text = '\uf1b0'; + } + return _text; + }); + + //Node text background + infos_group.insert("rect","text") + .attr("width", function(d){ + return d.bbox.width; + }) + .attr("height", function(d){ + return d.bbox.height; + }) + .attr("y", function(d) { + return 15; + }) + .style("fill", "white") + .style("fill-opacity", 0.75); + + nodes = engine.nodes(tree); + + function node_extents(n) { + return [n.x - n.x_size / 2, n.y, + n.x + n.x_size / 2, n.y + n.y_size + ]; + } + var root_extents = node_extents(nodes[0]); + var xmin = root_extents[0], + ymin = root_extents[1], + xmax = root_extents[2], + ymax = root_extents[3], + area_sum = (xmax - xmin) * (ymax - ymin), + x_size_min = nodes[0].x_size, + y_size_min = nodes[0].y_size; + + nodes.slice(1).forEach(function(n) { + var ne = node_extents(n); + xmin = Math.min(xmin, ne[0]); + ymin = Math.min(ymin, ne[1]); + xmax = Math.max(xmax, ne[2]); + ymax = Math.max(ymax, ne[3]); + area_sum += (ne[2] - ne[0]) * (ne[3] - ne[1]); + x_size_min = Math.min(x_size_min, n.x_size); + y_size_min = Math.min(y_size_min, n.y_size); + }); + + var area_ave = area_sum / nodes.length; + var scale = 80 / Math.sqrt(area_ave); + + function svg_x(node_y) { + return (node_y - ymin); + } + + function svg_y(node_x) { + return (node_x - xmin) * scale; + } + + + var nodebox_right_margin = Math.min(x_size_min * scale, 10); + var nodebox_vertical_margin = Math.min(y_size_min * scale, 3); + + node.attr("transform", function(d) { + return "translate(" + svg_x(d.y) + "," + svg_y(d.x) + ")"; + }) + + var diagonal = d3.svg.diagonal() + .projection(function(d) { + return [svg_x(d.y), svg_y(d.x)]; + }); + + var links = engine.links(nodes); + var links = svg_p.selectAll(".link") + .data(links) + .enter().append("path") + .attr("class", "link") + .attr("d", diagonal); + + var _svg = document.getElementById('main'), + main_g = _svg.childNodes[0] + + _svg.removeChild(main_g); + _svg.appendChild(main_g); + + svg.attr({ + width: document.getElementById('main-group').getBBox()['width'] + 30, + height: document.getElementById('main-group').getBBox()['height'] + 50, + }); +}); diff --git a/documentation/js/search/lunr.min.js b/documentation/js/search/lunr.min.js new file mode 100644 index 00000000..cdc94cd3 --- /dev/null +++ b/documentation/js/search/lunr.min.js @@ -0,0 +1,6 @@ +/** + * lunr - http://lunrjs.com - A bit like Solr, but much smaller and not as bright - 2.3.9 + * Copyright (C) 2020 Oliver Nightingale + * @license MIT + */ +!function(){var e=function(t){var r=new e.Builder;return r.pipeline.add(e.trimmer,e.stopWordFilter,e.stemmer),r.searchPipeline.add(e.stemmer),t.call(r,r),r.build()};e.version="2.3.9",e.utils={},e.utils.warn=function(e){return function(t){e.console&&console.warn&&console.warn(t)}}(this),e.utils.asString=function(e){return void 0===e||null===e?"":e.toString()},e.utils.clone=function(e){if(null===e||void 0===e)return e;for(var t=Object.create(null),r=Object.keys(e),i=0;i0){var c=e.utils.clone(r)||{};c.position=[a,l],c.index=s.length,s.push(new e.Token(i.slice(a,o),c))}a=o+1}}return s},e.tokenizer.separator=/[\s\-]+/,e.Pipeline=function(){this._stack=[]},e.Pipeline.registeredFunctions=Object.create(null),e.Pipeline.registerFunction=function(t,r){r in this.registeredFunctions&&e.utils.warn("Overwriting existing registered function: "+r),t.label=r,e.Pipeline.registeredFunctions[t.label]=t},e.Pipeline.warnIfFunctionNotRegistered=function(t){var r=t.label&&t.label in this.registeredFunctions;r||e.utils.warn("Function is not registered with pipeline. This may cause problems when serialising the index.\n",t)},e.Pipeline.load=function(t){var r=new e.Pipeline;return t.forEach(function(t){var i=e.Pipeline.registeredFunctions[t];if(!i)throw new Error("Cannot load unregistered function: "+t);r.add(i)}),r},e.Pipeline.prototype.add=function(){var t=Array.prototype.slice.call(arguments);t.forEach(function(t){e.Pipeline.warnIfFunctionNotRegistered(t),this._stack.push(t)},this)},e.Pipeline.prototype.after=function(t,r){e.Pipeline.warnIfFunctionNotRegistered(r);var i=this._stack.indexOf(t);if(i==-1)throw new Error("Cannot find existingFn");i+=1,this._stack.splice(i,0,r)},e.Pipeline.prototype.before=function(t,r){e.Pipeline.warnIfFunctionNotRegistered(r);var i=this._stack.indexOf(t);if(i==-1)throw new Error("Cannot find existingFn");this._stack.splice(i,0,r)},e.Pipeline.prototype.remove=function(e){var t=this._stack.indexOf(e);t!=-1&&this._stack.splice(t,1)},e.Pipeline.prototype.run=function(e){for(var t=this._stack.length,r=0;r1&&(se&&(r=n),s!=e);)i=r-t,n=t+Math.floor(i/2),s=this.elements[2*n];return s==e?2*n:s>e?2*n:sa?l+=2:o==a&&(t+=r[u+1]*i[l+1],u+=2,l+=2);return t},e.Vector.prototype.similarity=function(e){return this.dot(e)/this.magnitude()||0},e.Vector.prototype.toArray=function(){for(var e=new Array(this.elements.length/2),t=1,r=0;t0){var o,a=s.str.charAt(0);a in s.node.edges?o=s.node.edges[a]:(o=new e.TokenSet,s.node.edges[a]=o),1==s.str.length&&(o["final"]=!0),n.push({node:o,editsRemaining:s.editsRemaining,str:s.str.slice(1)})}if(0!=s.editsRemaining){if("*"in s.node.edges)var u=s.node.edges["*"];else{var u=new e.TokenSet;s.node.edges["*"]=u}if(0==s.str.length&&(u["final"]=!0),n.push({node:u,editsRemaining:s.editsRemaining-1,str:s.str}),s.str.length>1&&n.push({node:s.node,editsRemaining:s.editsRemaining-1,str:s.str.slice(1)}),1==s.str.length&&(s.node["final"]=!0),s.str.length>=1){if("*"in s.node.edges)var l=s.node.edges["*"];else{var l=new e.TokenSet;s.node.edges["*"]=l}1==s.str.length&&(l["final"]=!0),n.push({node:l,editsRemaining:s.editsRemaining-1,str:s.str.slice(1)})}if(s.str.length>1){var c,h=s.str.charAt(0),d=s.str.charAt(1);d in s.node.edges?c=s.node.edges[d]:(c=new e.TokenSet,s.node.edges[d]=c),1==s.str.length&&(c["final"]=!0),n.push({node:c,editsRemaining:s.editsRemaining-1,str:h+s.str.slice(2)})}}}return i},e.TokenSet.fromString=function(t){for(var r=new e.TokenSet,i=r,n=0,s=t.length;n=e;t--){var r=this.uncheckedNodes[t],i=r.child.toString();i in this.minimizedNodes?r.parent.edges[r["char"]]=this.minimizedNodes[i]:(r.child._str=i,this.minimizedNodes[i]=r.child),this.uncheckedNodes.pop()}},e.Index=function(e){this.invertedIndex=e.invertedIndex,this.fieldVectors=e.fieldVectors,this.tokenSet=e.tokenSet,this.fields=e.fields,this.pipeline=e.pipeline},e.Index.prototype.search=function(t){return this.query(function(r){var i=new e.QueryParser(t,r);i.parse()})},e.Index.prototype.query=function(t){for(var r=new e.Query(this.fields),i=Object.create(null),n=Object.create(null),s=Object.create(null),o=Object.create(null),a=Object.create(null),u=0;u1?this._b=1:this._b=e},e.Builder.prototype.k1=function(e){this._k1=e},e.Builder.prototype.add=function(t,r){var i=t[this._ref],n=Object.keys(this._fields);this._documents[i]=r||{},this.documentCount+=1;for(var s=0;s=this.length)return e.QueryLexer.EOS;var t=this.str.charAt(this.pos);return this.pos+=1,t},e.QueryLexer.prototype.width=function(){return this.pos-this.start},e.QueryLexer.prototype.ignore=function(){this.start==this.pos&&(this.pos+=1),this.start=this.pos},e.QueryLexer.prototype.backup=function(){this.pos-=1},e.QueryLexer.prototype.acceptDigitRun=function(){var t,r;do t=this.next(),r=t.charCodeAt(0);while(r>47&&r<58);t!=e.QueryLexer.EOS&&this.backup()},e.QueryLexer.prototype.more=function(){return this.pos1&&(t.backup(),t.emit(e.QueryLexer.TERM)),t.ignore(),t.more())return e.QueryLexer.lexText},e.QueryLexer.lexEditDistance=function(t){return t.ignore(),t.acceptDigitRun(),t.emit(e.QueryLexer.EDIT_DISTANCE),e.QueryLexer.lexText},e.QueryLexer.lexBoost=function(t){return t.ignore(),t.acceptDigitRun(),t.emit(e.QueryLexer.BOOST),e.QueryLexer.lexText},e.QueryLexer.lexEOS=function(t){t.width()>0&&t.emit(e.QueryLexer.TERM)},e.QueryLexer.termSeparator=e.tokenizer.separator,e.QueryLexer.lexText=function(t){for(;;){var r=t.next();if(r==e.QueryLexer.EOS)return e.QueryLexer.lexEOS;if(92!=r.charCodeAt(0)){if(":"==r)return e.QueryLexer.lexField;if("~"==r)return t.backup(),t.width()>0&&t.emit(e.QueryLexer.TERM),e.QueryLexer.lexEditDistance;if("^"==r)return t.backup(),t.width()>0&&t.emit(e.QueryLexer.TERM),e.QueryLexer.lexBoost;if("+"==r&&1===t.width())return t.emit(e.QueryLexer.PRESENCE),e.QueryLexer.lexText;if("-"==r&&1===t.width())return t.emit(e.QueryLexer.PRESENCE),e.QueryLexer.lexText;if(r.match(e.QueryLexer.termSeparator))return e.QueryLexer.lexTerm}else t.escapeCharacter()}},e.QueryParser=function(t,r){this.lexer=new e.QueryLexer(t),this.query=r,this.currentClause={},this.lexemeIdx=0},e.QueryParser.prototype.parse=function(){this.lexer.run(),this.lexemes=this.lexer.lexemes;for(var t=e.QueryParser.parseClause;t;)t=t(this);return this.query},e.QueryParser.prototype.peekLexeme=function(){return this.lexemes[this.lexemeIdx]},e.QueryParser.prototype.consumeLexeme=function(){var e=this.peekLexeme();return this.lexemeIdx+=1,e},e.QueryParser.prototype.nextClause=function(){var e=this.currentClause;this.query.clause(e),this.currentClause={}},e.QueryParser.parseClause=function(t){var r=t.peekLexeme();if(void 0!=r)switch(r.type){case e.QueryLexer.PRESENCE:return e.QueryParser.parsePresence;case e.QueryLexer.FIELD:return e.QueryParser.parseField;case e.QueryLexer.TERM:return e.QueryParser.parseTerm;default:var i="expected either a field or a term, found "+r.type;throw r.str.length>=1&&(i+=" with value '"+r.str+"'"),new e.QueryParseError(i,r.start,r.end)}},e.QueryParser.parsePresence=function(t){var r=t.consumeLexeme();if(void 0!=r){switch(r.str){case"-":t.currentClause.presence=e.Query.presence.PROHIBITED;break;case"+":t.currentClause.presence=e.Query.presence.REQUIRED;break;default:var i="unrecognised presence operator'"+r.str+"'";throw new e.QueryParseError(i,r.start,r.end)}var n=t.peekLexeme();if(void 0==n){var i="expecting term or field, found nothing";throw new e.QueryParseError(i,r.start,r.end)}switch(n.type){case e.QueryLexer.FIELD:return e.QueryParser.parseField;case e.QueryLexer.TERM:return e.QueryParser.parseTerm;default:var i="expecting term or field, found '"+n.type+"'";throw new e.QueryParseError(i,n.start,n.end)}}},e.QueryParser.parseField=function(t){var r=t.consumeLexeme();if(void 0!=r){if(t.query.allFields.indexOf(r.str)==-1){var i=t.query.allFields.map(function(e){return"'"+e+"'"}).join(", "),n="unrecognised field '"+r.str+"', possible fields: "+i;throw new e.QueryParseError(n,r.start,r.end)}t.currentClause.fields=[r.str];var s=t.peekLexeme();if(void 0==s){var n="expecting term, found nothing";throw new e.QueryParseError(n,r.start,r.end)}switch(s.type){case e.QueryLexer.TERM:return e.QueryParser.parseTerm;default:var n="expecting term, found '"+s.type+"'";throw new e.QueryParseError(n,s.start,s.end)}}},e.QueryParser.parseTerm=function(t){var r=t.consumeLexeme();if(void 0!=r){t.currentClause.term=r.str.toLowerCase(),r.str.indexOf("*")!=-1&&(t.currentClause.usePipeline=!1);var i=t.peekLexeme();if(void 0==i)return void t.nextClause();switch(i.type){case e.QueryLexer.TERM:return t.nextClause(),e.QueryParser.parseTerm;case e.QueryLexer.FIELD:return t.nextClause(),e.QueryParser.parseField;case e.QueryLexer.EDIT_DISTANCE:return e.QueryParser.parseEditDistance;case e.QueryLexer.BOOST:return e.QueryParser.parseBoost;case e.QueryLexer.PRESENCE:return t.nextClause(),e.QueryParser.parsePresence;default:var n="Unexpected lexeme type '"+i.type+"'";throw new e.QueryParseError(n,i.start,i.end)}}},e.QueryParser.parseEditDistance=function(t){var r=t.consumeLexeme();if(void 0!=r){var i=parseInt(r.str,10);if(isNaN(i)){var n="edit distance must be numeric";throw new e.QueryParseError(n,r.start,r.end)}t.currentClause.editDistance=i;var s=t.peekLexeme();if(void 0==s)return void t.nextClause();switch(s.type){case e.QueryLexer.TERM:return t.nextClause(),e.QueryParser.parseTerm;case e.QueryLexer.FIELD:return t.nextClause(),e.QueryParser.parseField;case e.QueryLexer.EDIT_DISTANCE:return e.QueryParser.parseEditDistance;case e.QueryLexer.BOOST:return e.QueryParser.parseBoost;case e.QueryLexer.PRESENCE:return t.nextClause(),e.QueryParser.parsePresence;default:var n="Unexpected lexeme type '"+s.type+"'";throw new e.QueryParseError(n,s.start,s.end)}}},e.QueryParser.parseBoost=function(t){var r=t.consumeLexeme();if(void 0!=r){var i=parseInt(r.str,10);if(isNaN(i)){var n="boost must be numeric";throw new e.QueryParseError(n,r.start,r.end)}t.currentClause.boost=i;var s=t.peekLexeme();if(void 0==s)return void t.nextClause();switch(s.type){case e.QueryLexer.TERM:return t.nextClause(),e.QueryParser.parseTerm;case e.QueryLexer.FIELD:return t.nextClause(),e.QueryParser.parseField;case e.QueryLexer.EDIT_DISTANCE:return e.QueryParser.parseEditDistance;case e.QueryLexer.BOOST:return e.QueryParser.parseBoost;case e.QueryLexer.PRESENCE:return t.nextClause(),e.QueryParser.parsePresence;default:var n="Unexpected lexeme type '"+s.type+"'";throw new e.QueryParseError(n,s.start,s.end)}}},function(e,t){"function"==typeof define&&define.amd?define(t):"object"==typeof exports?module.exports=t():e.lunr=t()}(this,function(){return e})}(); diff --git a/documentation/js/search/search-lunr.js b/documentation/js/search/search-lunr.js new file mode 100644 index 00000000..35e7dde1 --- /dev/null +++ b/documentation/js/search/search-lunr.js @@ -0,0 +1,67 @@ +(function(compodoc) { + + function LunrSearchEngine() { + this.index = undefined; + this.store = {}; + this.name = 'LunrSearchEngine'; + } + + LunrSearchEngine.prototype.init = function() { + var that = this, + d = new promise.Promise(); + + that.index = lunr.Index.load(COMPODOC_SEARCH_INDEX.index); + that.store = COMPODOC_SEARCH_INDEX.store; + d.done(); + + return d; + }; + + LunrSearchEngine.prototype.search = function(q, offset, length) { + var that = this, + results = [], + d = new promise.Promise(); + + if (this.index) { + results = $.map(this.index.search('*' + q + '*'), function(result) { + var doc = that.store[result.ref]; + + return { + title: doc.title, + url: doc.url, + body: doc.summary || doc.body + }; + }); + } + + d.done({ + query: q, + results: length === 0 ? results : results.slice(0, length), + count: results.length + }); + + return d; + }; + + compodoc.addEventListener(compodoc.EVENTS.READY, function(event) { + var engine = new LunrSearchEngine(), + initialized = false; + + function query(q, offset, length) { + if (!initialized) throw new Error('Search has not been initialized'); + return engine.search(q, offset, length); + } + + compodoc.search = { + query: query + }; + + engine.init() + .then(function() { + initialized = true; + compodoc.dispatchEvent({ + type: compodoc.EVENTS.SEARCH_READY + }); + }); + }); +})(compodoc); diff --git a/documentation/js/search/search.js b/documentation/js/search/search.js new file mode 100644 index 00000000..6451d3d7 --- /dev/null +++ b/documentation/js/search/search.js @@ -0,0 +1,268 @@ +(function(compodoc) { + var usePushState = (typeof history.pushState !== 'undefined'), + + // DOM Elements + $body = $('body'), + $searchResults, + $searchInput, + $searchList, + $searchTitle, + $searchResultsCount, + $searchQuery, + $mainContainer, + $xsMenu; + + // Throttle search + function throttle(fn, wait) { + var timeout; + + return function() { + var ctx = this, args = arguments; + if (!timeout) { + timeout = setTimeout(function() { + timeout = undefined; + fn.apply(ctx, args); + }, wait); + } + }; + } + + function displayResults(res) { + var noResults = res.count == 0; + var groups = {}; + $searchResults.toggleClass('no-results', noResults); + + // Clear old results + $searchList.empty(); + + // Display title for research + $searchResultsCount.text(res.count); + $searchQuery.text(res.query); + + // Group result by context + res.results.forEach(function(res) { + var context = res.title.split(' - ')[0]; + if (typeof groups[context] === 'undefined') { + groups[context] = { + results: [res] + } + } else { + groups[context].results.push(res) + } + }); + + var sortedGroups = Object.keys(groups).sort(); + + for (var i = 0; i < sortedGroups.length; i++) { + var property = sortedGroups[i]; + + var $li = $('
                                                                                                                                • ', { + 'class': 'search-results-group' + }); + var finalPropertyLabel = ''; + var propertyLabels = property.split('-'); + + if (propertyLabels.length === 2 && propertyLabels[0] !== 'miscellaneous' && propertyLabels[0] !== 'additional') { + finalPropertyLabel = propertyLabels[0].charAt(0).toUpperCase() + propertyLabels[0].substring(1) + ' - ' + propertyLabels[1].charAt(0).toUpperCase() + propertyLabels[1].substring(1) + ' (' + groups[property].results.length + ')'; + } else if (propertyLabels[0] === 'additional') { + finalPropertyLabel = 'Additional pages' + ' (' + groups[property].results.length + ')' + } else { + finalPropertyLabel = propertyLabels[0].charAt(0).toUpperCase() + propertyLabels[0].substring(1) + ' (' + groups[property].results.length + ')' + } + var $groupTitle = $('

                                                                                                                                  ', { + 'text': finalPropertyLabel + }); + $groupTitle.appendTo($li); + + var $ulResults = $('

                                                                                                                                • `, - onGallery: `` + onGallery: `` }; diff --git a/projects/ng-gallery-demo/src/app/pages/gallery-example/gallery-example.component.html b/projects/ng-gallery-demo/src/app/pages/gallery-example/gallery-example.component.html index d317913e..b46afe12 100644 --- a/projects/ng-gallery-demo/src/app/pages/gallery-example/gallery-example.component.html +++ b/projects/ng-gallery-demo/src/app/pages/gallery-example/gallery-example.component.html @@ -62,7 +62,8 @@

                                                                                                                                  Example

                                                                                                                                  diff --git a/projects/ng-gallery-demo/src/app/pages/home/home.component.html b/projects/ng-gallery-demo/src/app/pages/home/home.component.html index 7f1a0c46..b3d1c838 100644 --- a/projects/ng-gallery-demo/src/app/pages/home/home.component.html +++ b/projects/ng-gallery-demo/src/app/pages/home/home.component.html @@ -14,9 +14,11 @@

                                                                                                                                  Simplifies the process of creating beautiful galleries.

                                                                                                                                  ngStyle.lg="height: 540px" itemAutosize="true" imageSize="contain" - autoPlay="true" thumbPosition="top" - thumbView="contain">
                                                                                                                                  + thumbs + loop + thumbCentralized + autoplay/>
                                                                                                                                  diff --git a/projects/ng-gallery-demo/src/app/pages/lab/lab.component.html b/projects/ng-gallery-demo/src/app/pages/lab/lab.component.html index cbf65a50..13e83924 100644 --- a/projects/ng-gallery-demo/src/app/pages/lab/lab.component.html +++ b/projects/ng-gallery-demo/src/app/pages/lab/lab.component.html @@ -7,35 +7,37 @@

                                                                                                                                  - - Sliding directions - - {{direction}} + + Orientation + + {{orientation}}
                                                                                                                                  @@ -113,9 +115,9 @@

                                                                                                                                  - Thumbnails View - - {{view}} + Thumbnails image size + + {{size}}
                                                                                                                                  @@ -123,7 +125,7 @@

                                                                                                                                  Thumbnails Position - + {{position}} @@ -141,7 +143,7 @@

                                                                                                                                  Dots Position - + {{position}} @@ -160,20 +162,20 @@

                                                                                                                                  Item autosize

                                                                                                                                  - Thumb autosize + Thumb autosize
                                                                                                                                  - Sliding duration - + Scroll duration +
                                                                                                                                  Player interval - +
                                                                                                                                  @@ -194,9 +196,11 @@

                                                                                                                                  - Nav Scroll Behavior - - {{behavior}} + Loading Attr + + + {{config.itemAutosize ? 'eager' : loadingAttr}} +
                                                                                                                                  @@ -210,39 +214,42 @@

                                                                                                                                  Show navigation

                                                                                                                                  - Show dots + Show dots
                                                                                                                                  Show counter
                                                                                                                                  - Show thumbnails + Show thumbnails +
                                                                                                                                  +
                                                                                                                                  + Centralize Thumbnails
                                                                                                                                  - Detach thumbnails + Detach thumbnails
                                                                                                                                  - Disable thumbnails' clicks + Disable thumbnails' clicks
                                                                                                                                  - Auto-play + Auto-play
                                                                                                                                  - Sliding Disabled + Disable Scroll
                                                                                                                                  - Thumb Sliding Disabled + Disable Thumb Scroll
                                                                                                                                  - Mouse Sliding Disabled + Disable Mouse Scroll
                                                                                                                                  - Thumb Mouse Sliding Disabled + Disable Thumb Mouse Scroll

                                                                                                                                  diff --git a/projects/ng-gallery-demo/src/app/pages/lab/lab.component.ts b/projects/ng-gallery-demo/src/app/pages/lab/lab.component.ts index 8b85d0d9..9855b088 100644 --- a/projects/ng-gallery-demo/src/app/pages/lab/lab.component.ts +++ b/projects/ng-gallery-demo/src/app/pages/lab/lab.component.ts @@ -6,9 +6,8 @@ import { GalleryItem, GalleryConfig, LoadingStrategy, - SlidingDirection, + Orientation, ThumbnailsPosition, - ThumbnailsView, GalleryComponent } from 'ng-gallery'; import { MatInputModule } from '@angular/material/input'; @@ -44,11 +43,10 @@ export class LabComponent implements OnInit { imageSizes = ['cover', 'contain']; thumbPositions = ['top', 'left', 'right', 'bottom']; loadingStrategies = ['default', 'lazy', 'preload']; - thumbModes = ['strict', 'free']; - thumbViews = ['default', 'contain']; - slidingDirections = ['vertical', 'horizontal']; + orientations = ['vertical', 'horizontal']; dotsCounterPositions = ['top', 'bottom']; scrollBehaviors = ['auto', 'smooth']; + loadingAttrs = ['eager', 'lazy']; player$ = new BehaviorSubject({ active: false }); itemClick$ = new BehaviorSubject({ active: false }); @@ -64,33 +62,34 @@ export class LabComponent implements OnInit { this.config = { nav: true, loop: true, - dots: true, - dotsPosition: 'bottom', + bullets: true, + bulletPosition: 'bottom', counterPosition: 'top', - resizeDebounceTime: 50, - slidingDuration: 468, - thumb: true, + resizeDebounceTime: 0, + scrollDuration: 468, + thumbs: true, counter: true, - autoPlay: false, - slidingDisabled: false, - thumbSlidingDisabled: false, - mouseSlidingDisabled: false, - thumbMouseSlidingDisabled: false, + autoplay: false, + disableScroll: false, + disableThumbScroll: false, + disableMouseScroll: false, + disableThumbMouseScroll: false, thumbWidth: 120, thumbHeight: 90, imageSize: 'contain', - disableThumb: false, - playerInterval: 3000, - thumbView: ThumbnailsView.Contain, + thumbImageSize: 'cover', + disableThumbs: false, + autoplayInterval: 3000, + thumbCentralized: false, thumbPosition: ThumbnailsPosition.Bottom, loadingStrategy: LoadingStrategy.Preload, - slidingDirection: SlidingDirection.Horizontal, + orientation: Orientation.Horizontal, autoHeight: false, itemAutosize: false, thumbAutosize: false, scrollBehavior: 'smooth', - navScrollBehavior: 'smooth', - debug: false + loadingAttr: 'lazy', + debug: true }; } diff --git a/projects/ng-gallery-demo/src/app/pages/lightbox-example/lightbox-example.component.ts b/projects/ng-gallery-demo/src/app/pages/lightbox-example/lightbox-example.component.ts index 37fd3f5f..b893b3be 100644 --- a/projects/ng-gallery-demo/src/app/pages/lightbox-example/lightbox-example.component.ts +++ b/projects/ng-gallery-demo/src/app/pages/lightbox-example/lightbox-example.component.ts @@ -61,7 +61,6 @@ export class LightboxExampleComponent implements OnInit, OnDestroy { ngOnDestroy() { this.gallery.ref('lightbox').destroy(); } - } const code = { @@ -74,7 +73,7 @@ galleryRef.load(items)`, `, ex: `import { Component, OnInit } from '@angular/core'; -import { NgFor, AsyncPipe } from '@angular/common'; +import { CommonModule } from '@angular/common'; import { GalleryModule, Gallery, GalleryItem } from 'ng-gallery'; import { LightboxModule } from 'ng-gallery/lightbox'; @@ -90,7 +89,7 @@ import { LightboxModule } from 'ng-gallery/lightbox'; \`, standalone: true, - imports: [LightboxModule, NgFor, AsyncPipe] + imports: [CommonModule, LightboxModule] }) export class AppComponent implements OnInit { diff --git a/projects/ng-gallery-demo/src/app/pages/templates-example/templates-example.component.html b/projects/ng-gallery-demo/src/app/pages/templates-example/templates-example.component.html index 6d92bcf1..d35fad36 100644 --- a/projects/ng-gallery-demo/src/app/pages/templates-example/templates-example.component.html +++ b/projects/ng-gallery-demo/src/app/pages/templates-example/templates-example.component.html @@ -13,21 +13,22 @@

                                                                                                                                  Custom Templates Example

                                                                                                                                  - - {{ item?.alt }} - + + {{ item?.alt }} + - - - + + + - - + + diff --git a/projects/ng-gallery-demo/src/main.server.ts b/projects/ng-gallery-demo/src/main.server.ts new file mode 100644 index 00000000..4b9d4d15 --- /dev/null +++ b/projects/ng-gallery-demo/src/main.server.ts @@ -0,0 +1,7 @@ +import { bootstrapApplication } from '@angular/platform-browser'; +import { AppComponent } from './app/app.component'; +import { config } from './app/app.config.server'; + +const bootstrap = () => bootstrapApplication(AppComponent, config); + +export default bootstrap; diff --git a/projects/ng-gallery-demo/src/main.ts b/projects/ng-gallery-demo/src/main.ts index 5f51ca71..58f3ec93 100644 --- a/projects/ng-gallery-demo/src/main.ts +++ b/projects/ng-gallery-demo/src/main.ts @@ -1,49 +1,11 @@ -import { enableProdMode, importProvidersFrom } from '@angular/core'; -import { withInterceptorsFromDi, provideHttpClient } from '@angular/common/http'; -import { BrowserModule, bootstrapApplication } from '@angular/platform-browser'; -import { provideAnimations } from '@angular/platform-browser/animations'; -import { NgProgressRouterModule } from 'ngx-progressbar/router'; -import { NgProgressHttpModule } from 'ngx-progressbar/http'; -import { NgProgressModule } from 'ngx-progressbar'; -import { NG_SCROLLBAR_OPTIONS } from 'ngx-scrollbar'; -import { HIGHLIGHT_OPTIONS } from 'ngx-highlightjs'; -import { GALLERY_CONFIG, GalleryConfig } from 'ng-gallery'; - -import { AppRoutingModule } from './app/routing.module'; +import { enableProdMode } from '@angular/core'; +import { bootstrapApplication } from '@angular/platform-browser'; import { environment } from './environments/environment'; import { AppComponent } from './app/app.component'; +import { appConfig } from './app/app.config'; if (environment.production) { enableProdMode(); } -bootstrapApplication(AppComponent, { - providers: [ - importProvidersFrom(BrowserModule, AppRoutingModule, NgProgressModule, NgProgressHttpModule, NgProgressRouterModule), - { - provide: GALLERY_CONFIG, - useValue: { - imageSize: 'cover' - } as GalleryConfig - }, - { - provide: HIGHLIGHT_OPTIONS, - useValue: { - coreLibraryLoader: () => import('highlight.js/lib/core'), - languages: { - typescript: () => import('highlight.js/lib/languages/typescript'), - css: () => import('highlight.js/lib/languages/css'), - xml: () => import('highlight.js/lib/languages/xml') - } - } - }, - { - provide: NG_SCROLLBAR_OPTIONS, - useValue: { - appearance: 'compact' - } - }, - provideAnimations(), - provideHttpClient(withInterceptorsFromDi()) - ] -}).catch(err => console.error(err)); +bootstrapApplication(AppComponent, appConfig).catch(err => console.error(err)); diff --git a/projects/ng-gallery-demo/tsconfig.server.json b/projects/ng-gallery-demo/tsconfig.server.json new file mode 100644 index 00000000..0f56b0af --- /dev/null +++ b/projects/ng-gallery-demo/tsconfig.server.json @@ -0,0 +1,14 @@ +/* To learn more about this file see: https://angular.io/config/tsconfig. */ +{ + "extends": "./tsconfig.app.json", + "compilerOptions": { + "outDir": "../../out-tsc/server", + "types": [ + "node" + ] + }, + "files": [ + "src/main.server.ts", + "server.ts" + ] +} diff --git a/projects/ng-gallery/.storybook/colors.mdx b/projects/ng-gallery/.storybook/colors.mdx new file mode 100644 index 00000000..65f13dbd --- /dev/null +++ b/projects/ng-gallery/.storybook/colors.mdx @@ -0,0 +1,33 @@ +{/* Colors.mdx */} + +import { Meta, ColorPalette, ColorItem } from '@storybook/blocks'; + + + + + + + + + diff --git a/projects/ng-gallery/.storybook/main.ts b/projects/ng-gallery/.storybook/main.ts new file mode 100644 index 00000000..69c0f813 --- /dev/null +++ b/projects/ng-gallery/.storybook/main.ts @@ -0,0 +1,18 @@ +import type { StorybookConfig } from "@storybook/angular"; + +const config: StorybookConfig = { + stories: ["../src/**/*.mdx", "../src/**/*.stories.@(js|jsx|mjs|ts|tsx)"], + addons: [ + "@storybook/addon-links", + "@storybook/addon-essentials", + "@storybook/addon-interactions" + ], + framework: { + name: "@storybook/angular", + options: {}, + }, + docs: { + autodocs: 'tag', + } +}; +export default config; diff --git a/projects/ng-gallery/.storybook/manager.js b/projects/ng-gallery/.storybook/manager.js new file mode 100644 index 00000000..baf80b25 --- /dev/null +++ b/projects/ng-gallery/.storybook/manager.js @@ -0,0 +1,6 @@ +import { addons } from '@storybook/manager-api'; +import theme from './theme'; + +addons.setConfig({ + theme: theme, +}); diff --git a/projects/ng-gallery/.storybook/preview.ts b/projects/ng-gallery/.storybook/preview.ts new file mode 100644 index 00000000..b7e6941d --- /dev/null +++ b/projects/ng-gallery/.storybook/preview.ts @@ -0,0 +1,20 @@ +import type { Preview } from "@storybook/angular"; +import { setCompodocJson } from "@storybook/addon-docs/angular"; + +import docJson from "../documentation.json"; +setCompodocJson(docJson); + +const preview: Preview = { + parameters: { + layout: 'fullscreen', + actions: { argTypesRegex: "^on[A-Z].*" }, + controls: { + matchers: { + color: /(background|color)$/i, + date: /Date$/i, + } + } + }, +}; + +export default preview; diff --git a/projects/ng-gallery/.storybook/storybook-logo-dark.png b/projects/ng-gallery/.storybook/storybook-logo-dark.png new file mode 100644 index 0000000000000000000000000000000000000000..e6540e5aea650878db858d2149f4e43f7412af91 GIT binary patch literal 3665 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 R;twOj+0l)4&i;qp{{gfF!s-A3 literal 0 HcmV?d00001 diff --git a/projects/ng-gallery/.storybook/storybook-logo.png b/projects/ng-gallery/.storybook/storybook-logo.png new file mode 100644 index 0000000000000000000000000000000000000000..3251a47dec03687bdb97285b4e88802463077ea1 GIT binary patch literal 3456 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 MF7C_{r{F#R1{y(k&;S4c literal 0 HcmV?d00001 diff --git a/projects/ng-gallery/.storybook/theme.js b/projects/ng-gallery/.storybook/theme.js new file mode 100644 index 00000000..ed5eec88 --- /dev/null +++ b/projects/ng-gallery/.storybook/theme.js @@ -0,0 +1,38 @@ +import { create } from '@storybook/theming/create'; + +export default create({ + base: 'dark', + // Typography + fontBase: '"Open Sans", sans-serif', + fontCode: 'monospace', + + brandTitle: 'Angular Gallery', + brandUrl: 'https://github.com/MurhafSousli/ngx-gallery', + brandImage: 'https://github.com/MurhafSousli/ngx-gallery/assets/8130692/f9a4a981-7a61-4f3d-9e00-06ec3b2efd1c', + brandTarget: '_self', + + // + colorPrimary: '#3a95ff', + colorSecondary: '#c2c6ce', + + // UI + // appBg: '#ffffff', + appContentBg: '#797979', + // appBorderColor: '#585C6D', + // appBorderRadius: 4, + + // Text colors + // textColor: '#10162F', + // textInverseColor: '#ffffff', + + // Toolbar default and active colors + // barTextColor: '#9E9E9E', + // barSelectedColor: '#585C6D', + // barBg: '#ffffff', + + // Form colors + // inputBg: '#ffffff', + // inputBorder: '#10162F', + // inputTextColor: '#10162F', + // inputBorderRadius: 2, +}); diff --git a/projects/ng-gallery/.storybook/tsconfig.json b/projects/ng-gallery/.storybook/tsconfig.json new file mode 100644 index 00000000..59daf738 --- /dev/null +++ b/projects/ng-gallery/.storybook/tsconfig.json @@ -0,0 +1,11 @@ +{ + "extends": "../tsconfig.lib.json", + "compilerOptions": { + "types": ["node"], + "allowSyntheticDefaultImports": true, + "resolveJsonModule": true + }, + "exclude": ["../src/test.ts", "../src/**/*.spec.ts"], + "include": ["../src/**/*", "./preview.ts"], + "files": ["./typings.d.ts"] +} diff --git a/projects/ng-gallery/.storybook/typings.d.ts b/projects/ng-gallery/.storybook/typings.d.ts new file mode 100644 index 00000000..f73d61b3 --- /dev/null +++ b/projects/ng-gallery/.storybook/typings.d.ts @@ -0,0 +1,4 @@ +declare module '*.md' { + const content: string; + export default content; +} diff --git a/projects/ng-gallery/README.md b/projects/ng-gallery/README.md index 59cac248..8a758cff 100644 --- a/projects/ng-gallery/README.md +++ b/projects/ng-gallery/README.md @@ -16,7 +16,13 @@ ___ -### The documentation is available at the [wiki page](https://github.com/MurhafSousli/ngx-gallery/wiki) 📚 +### Explore ngx-gallery Documentation + +- **For stable version (v11):** Visit our [wiki page](https://github.com/MurhafSousli/ngx-gallery/wiki) 📚. + +- **For the latest features (v12 Beta):** Check out our [storybook documentation](https://ngx-gallery-next.netlify.app/) + +We value your feedback and appreciate your support in testing this beta release! ___ diff --git a/projects/ng-gallery/documentation.json b/projects/ng-gallery/documentation.json new file mode 100644 index 00000000..d33aeaf3 --- /dev/null +++ b/projects/ng-gallery/documentation.json @@ -0,0 +1,14949 @@ +{ + "pipes": [], + "interfaces": [ + { + "name": "BezierEasingOptions", + "id": "interface-BezierEasingOptions-d5eb67d1ecb7e4a497bc40fcef2fe77cbb5c20ac2db236be86ebd414c779eaa102f061d231cd6f4b9e7eccafc0caec3de14b9637f33374309f5e2e1e76ff7548", + "file": "projects/ng-gallery/src/lib/smooth-scroll/smooth-scroll.model.ts", + "deprecated": false, + "deprecationMessage": "", + "type": "interface", + "sourceCode": "import { _XAxis, _YAxis } from '@angular/cdk/scrolling';\r\n\r\nexport type SmoothScrollOptions = _XAxis & _YAxis & {\r\n behavior?: ScrollBehavior;\r\n}\r\n\r\nexport type SmoothScrollToOptions = _XAxis & _YAxis & {\r\n duration?: number;\r\n easing?: BezierEasingOptions;\r\n};\r\n\r\nexport interface SmoothScrollStep {\r\n scrollable: HTMLElement;\r\n startTime: number;\r\n startX: number;\r\n startY: number;\r\n x: number;\r\n y: number;\r\n duration: number;\r\n easing: (k: number) => number;\r\n currentX?: number;\r\n currentY?: number;\r\n}\r\n\r\nexport interface BezierEasingOptions {\r\n x1: number;\r\n y1: number;\r\n x2: number;\r\n y2: number;\r\n}\r\n", + "properties": [ + { + "name": "x1", + "deprecated": false, + "deprecationMessage": "", + "type": "number", + "optional": false, + "description": "", + "line": 26 + }, + { + "name": "x2", + "deprecated": false, + "deprecationMessage": "", + "type": "number", + "optional": false, + "description": "", + "line": 28 + }, + { + "name": "y1", + "deprecated": false, + "deprecationMessage": "", + "type": "number", + "optional": false, + "description": "", + "line": 27 + }, + { + "name": "y2", + "deprecated": false, + "deprecationMessage": "", + "type": "number", + "optional": false, + "description": "", + "line": 29 + } + ], + "indexSignatures": [], + "kind": 168, + "methods": [] + }, + { + "name": "BulletsConfig", + "id": "interface-BulletsConfig-6f9fdbcb39c24b0d29450ee3ef7d2371630be5c1f946773304ae58c3414ed67b990c7b6f65447311539eda65a179e0088235c46b7a44e65008d279b9ef79431e", + "file": "projects/ng-gallery/src/lib/models/config.model.ts", + "deprecated": false, + "deprecationMessage": "", + "type": "interface", + "sourceCode": "import { InjectionToken, TemplateRef } from '@angular/core';\r\nimport { BezierEasingOptions } from '../smooth-scroll';\r\n\r\nexport const GALLERY_CONFIG: InjectionToken = new InjectionToken('GALLERY_CONFIG');\r\n\r\ntype ImageSize = 'contain' | 'cover';\r\n\r\ntype Orientation = 'horizontal' | 'vertical';\r\n\r\ntype ThumbsPosition = 'top' | 'left' | 'right' | 'bottom';\r\n\r\ntype HorizontalPosition = 'top' | 'bottom';\r\n\r\ntype LoadingStrategy = 'preload' | 'lazy' | 'default';\r\n\r\ntype LoadingAttr = 'eager' | 'lazy';\r\n\r\ninterface ThumbConfig {\r\n thumbs?: boolean;\r\n thumbWidth?: number;\r\n thumbHeight?: number;\r\n thumbLoadingIcon?: string;\r\n thumbLoadingError?: string;\r\n disableThumbs?: boolean;\r\n detachThumbs?: boolean;\r\n thumbAutosize?: boolean;\r\n disableThumbScroll?: boolean;\r\n disableThumbMouseScroll?: boolean;\r\n thumbCentralized?: boolean;\r\n thumbPosition?: ThumbsPosition;\r\n thumbImageSize?: ImageSize;\r\n thumbTemplate?: TemplateRef;\r\n}\r\n\r\ninterface NavConfig {\r\n nav?: boolean;\r\n navIcon?: string;\r\n}\r\n\r\ninterface BulletsConfig {\r\n bullets?: boolean;\r\n disableBullets?: boolean;\r\n bulletSize?: number;\r\n bulletPosition?: HorizontalPosition;\r\n}\r\n\r\ninterface CounterConfig {\r\n counter?: boolean;\r\n counterPosition?: HorizontalPosition;\r\n}\r\n\r\ninterface PlayerConfig {\r\n autoplay?: boolean;\r\n autoplayInterval?: number;\r\n}\r\n\r\ninterface SliderConfig {\r\n loop?: boolean;\r\n disableScroll?: boolean;\r\n disableMouseScroll?: boolean;\r\n itemAutosize?: boolean;\r\n autoHeight?: boolean;\r\n loadingIcon?: string;\r\n loadingError?: string;\r\n scrollDuration?: number;\r\n scrollEase?: BezierEasingOptions;\r\n orientation?: Orientation;\r\n imageSize?: ImageSize;\r\n loadingStrategy?: LoadingStrategy;\r\n loadingAttr?: LoadingAttr;\r\n boxTemplate?: TemplateRef;\r\n itemTemplate?: TemplateRef;\r\n imageTemplate?: TemplateRef;\r\n}\r\n\r\nexport type GalleryConfig = SliderConfig\r\n & ThumbConfig\r\n & NavConfig\r\n & BulletsConfig\r\n & CounterConfig\r\n & PlayerConfig\r\n & {\r\n scrollBehavior?: ScrollBehavior;\r\n resizeDebounceTime?: number;\r\n debug?: boolean;\r\n}\r\n", + "properties": [ + { + "name": "bulletPosition", + "deprecated": false, + "deprecationMessage": "", + "type": "HorizontalPosition", + "optional": true, + "description": "", + "line": 44 + }, + { + "name": "bullets", + "deprecated": false, + "deprecationMessage": "", + "type": "boolean", + "optional": true, + "description": "", + "line": 41 + }, + { + "name": "bulletSize", + "deprecated": false, + "deprecationMessage": "", + "type": "number", + "optional": true, + "description": "", + "line": 43 + }, + { + "name": "disableBullets", + "deprecated": false, + "deprecationMessage": "", + "type": "boolean", + "optional": true, + "description": "", + "line": 42 + } + ], + "indexSignatures": [], + "kind": 168, + "methods": [] + }, + { + "name": "CounterConfig", + "id": "interface-CounterConfig-6f9fdbcb39c24b0d29450ee3ef7d2371630be5c1f946773304ae58c3414ed67b990c7b6f65447311539eda65a179e0088235c46b7a44e65008d279b9ef79431e", + "file": "projects/ng-gallery/src/lib/models/config.model.ts", + "deprecated": false, + "deprecationMessage": "", + "type": "interface", + "sourceCode": "import { InjectionToken, TemplateRef } from '@angular/core';\r\nimport { BezierEasingOptions } from '../smooth-scroll';\r\n\r\nexport const GALLERY_CONFIG: InjectionToken = new InjectionToken('GALLERY_CONFIG');\r\n\r\ntype ImageSize = 'contain' | 'cover';\r\n\r\ntype Orientation = 'horizontal' | 'vertical';\r\n\r\ntype ThumbsPosition = 'top' | 'left' | 'right' | 'bottom';\r\n\r\ntype HorizontalPosition = 'top' | 'bottom';\r\n\r\ntype LoadingStrategy = 'preload' | 'lazy' | 'default';\r\n\r\ntype LoadingAttr = 'eager' | 'lazy';\r\n\r\ninterface ThumbConfig {\r\n thumbs?: boolean;\r\n thumbWidth?: number;\r\n thumbHeight?: number;\r\n thumbLoadingIcon?: string;\r\n thumbLoadingError?: string;\r\n disableThumbs?: boolean;\r\n detachThumbs?: boolean;\r\n thumbAutosize?: boolean;\r\n disableThumbScroll?: boolean;\r\n disableThumbMouseScroll?: boolean;\r\n thumbCentralized?: boolean;\r\n thumbPosition?: ThumbsPosition;\r\n thumbImageSize?: ImageSize;\r\n thumbTemplate?: TemplateRef;\r\n}\r\n\r\ninterface NavConfig {\r\n nav?: boolean;\r\n navIcon?: string;\r\n}\r\n\r\ninterface BulletsConfig {\r\n bullets?: boolean;\r\n disableBullets?: boolean;\r\n bulletSize?: number;\r\n bulletPosition?: HorizontalPosition;\r\n}\r\n\r\ninterface CounterConfig {\r\n counter?: boolean;\r\n counterPosition?: HorizontalPosition;\r\n}\r\n\r\ninterface PlayerConfig {\r\n autoplay?: boolean;\r\n autoplayInterval?: number;\r\n}\r\n\r\ninterface SliderConfig {\r\n loop?: boolean;\r\n disableScroll?: boolean;\r\n disableMouseScroll?: boolean;\r\n itemAutosize?: boolean;\r\n autoHeight?: boolean;\r\n loadingIcon?: string;\r\n loadingError?: string;\r\n scrollDuration?: number;\r\n scrollEase?: BezierEasingOptions;\r\n orientation?: Orientation;\r\n imageSize?: ImageSize;\r\n loadingStrategy?: LoadingStrategy;\r\n loadingAttr?: LoadingAttr;\r\n boxTemplate?: TemplateRef;\r\n itemTemplate?: TemplateRef;\r\n imageTemplate?: TemplateRef;\r\n}\r\n\r\nexport type GalleryConfig = SliderConfig\r\n & ThumbConfig\r\n & NavConfig\r\n & BulletsConfig\r\n & CounterConfig\r\n & PlayerConfig\r\n & {\r\n scrollBehavior?: ScrollBehavior;\r\n resizeDebounceTime?: number;\r\n debug?: boolean;\r\n}\r\n", + "properties": [ + { + "name": "counter", + "deprecated": false, + "deprecationMessage": "", + "type": "boolean", + "optional": true, + "description": "", + "line": 48 + }, + { + "name": "counterPosition", + "deprecated": false, + "deprecationMessage": "", + "type": "HorizontalPosition", + "optional": true, + "description": "", + "line": 49 + } + ], + "indexSignatures": [], + "kind": 168, + "methods": [] + }, + { + "name": "GalleryError", + "id": "interface-GalleryError-bccc61a9106233b10cea13d16a36070bc93ff42f88a7f805e345e1617af3cfd049400f126fa7362585b75441e4bc42e59899a526d56d21bee91bd073bec24a6c", + "file": "projects/ng-gallery/src/lib/models/gallery.model.ts", + "deprecated": false, + "deprecationMessage": "", + "type": "interface", + "sourceCode": "import { GalleryAction, GalleryItemType } from './constants';\r\nimport { GalleryItemData } from '../components/templates/items.model';\r\n\r\nexport interface GalleryState {\r\n action?: GalleryAction;\r\n items?: GalleryItem[];\r\n behavior?: ScrollBehavior;\r\n currIndex?: number;\r\n hasNext?: boolean;\r\n hasPrev?: boolean;\r\n isPlaying?: boolean;\r\n}\r\n\r\nexport interface GalleryItem {\r\n data?: GalleryItemData;\r\n type?: GalleryItemType;\r\n}\r\n\r\nexport interface GalleryError {\r\n itemIndex: number;\r\n error: ErrorEvent;\r\n}\r\n", + "properties": [ + { + "name": "error", + "deprecated": false, + "deprecationMessage": "", + "type": "ErrorEvent", + "optional": false, + "description": "", + "line": 21 + }, + { + "name": "itemIndex", + "deprecated": false, + "deprecationMessage": "", + "type": "number", + "optional": false, + "description": "", + "line": 20 + } + ], + "indexSignatures": [], + "kind": 168, + "methods": [] + }, + { + "name": "GalleryItem", + "id": "interface-GalleryItem-bccc61a9106233b10cea13d16a36070bc93ff42f88a7f805e345e1617af3cfd049400f126fa7362585b75441e4bc42e59899a526d56d21bee91bd073bec24a6c", + "file": "projects/ng-gallery/src/lib/models/gallery.model.ts", + "deprecated": false, + "deprecationMessage": "", + "type": "interface", + "sourceCode": "import { GalleryAction, GalleryItemType } from './constants';\r\nimport { GalleryItemData } from '../components/templates/items.model';\r\n\r\nexport interface GalleryState {\r\n action?: GalleryAction;\r\n items?: GalleryItem[];\r\n behavior?: ScrollBehavior;\r\n currIndex?: number;\r\n hasNext?: boolean;\r\n hasPrev?: boolean;\r\n isPlaying?: boolean;\r\n}\r\n\r\nexport interface GalleryItem {\r\n data?: GalleryItemData;\r\n type?: GalleryItemType;\r\n}\r\n\r\nexport interface GalleryError {\r\n itemIndex: number;\r\n error: ErrorEvent;\r\n}\r\n", + "properties": [ + { + "name": "data", + "deprecated": false, + "deprecationMessage": "", + "type": "GalleryItemData", + "optional": true, + "description": "", + "line": 15 + }, + { + "name": "type", + "deprecated": false, + "deprecationMessage": "", + "type": "GalleryItemType", + "optional": true, + "description": "", + "line": 16 + } + ], + "indexSignatures": [], + "kind": 168, + "methods": [] + }, + { + "name": "GalleryItemContext", + "id": "interface-GalleryItemContext-26e1a2a9cd6d60ca99303fc991011e44a915536a91e7fffb302ad20298ea1600095dac2bbb811adb2767e9c07b63f913c60fab3c81fff80a56796b65a8136cba", + "file": "projects/ng-gallery/src/lib/directives/gallery-item-def.directive.ts", + "deprecated": false, + "deprecationMessage": "", + "type": "interface", + "sourceCode": "import { Directive, TemplateRef } from '@angular/core';\r\nimport { GalleryItemData } from '../components/templates/items.model';\r\nimport { GalleryItemType } from '../models/constants';\r\n\r\n@Directive({\r\n standalone: true,\r\n selector: '[galleryItemDef]'\r\n})\r\nexport class GalleryItemDef {\r\n constructor(public templateRef: TemplateRef>) {\r\n }\r\n\r\n // Make sure the template checker knows the type of the context with which the\r\n // template of this directive will be rendered\r\n static ngTemplateContextGuard(\r\n directive: GalleryItemDef,\r\n context: unknown\r\n ): context is GalleryItemContext {\r\n return true;\r\n }\r\n}\r\n\r\nexport interface GalleryItemContext {\r\n /** Data for the row that this cell is located within. */\r\n $implicit?: T;\r\n\r\n /** Index of the item. */\r\n index?: number;\r\n\r\n /** The type of the item. */\r\n type?: GalleryItemType;\r\n\r\n /** True if this item is the active one. */\r\n active?: boolean;\r\n\r\n /** The number of total items. */\r\n count?: number;\r\n\r\n /** True if this item is first. */\r\n first?: boolean;\r\n\r\n /** True if this item is last. */\r\n last?: boolean;\r\n}\r\n", + "properties": [ + { + "name": "$implicit", + "deprecated": false, + "deprecationMessage": "", + "type": "T", + "optional": true, + "description": "

                                                                                                                                  Data for the row that this cell is located within.

                                                                                                                                  \n", + "line": 25, + "rawdescription": "\nData for the row that this cell is located within." + }, + { + "name": "active", + "deprecated": false, + "deprecationMessage": "", + "type": "boolean", + "optional": true, + "description": "

                                                                                                                                  True if this item is the active one.

                                                                                                                                  \n", + "line": 34, + "rawdescription": "\nTrue if this item is the active one." + }, + { + "name": "count", + "deprecated": false, + "deprecationMessage": "", + "type": "number", + "optional": true, + "description": "

                                                                                                                                  The number of total items.

                                                                                                                                  \n", + "line": 37, + "rawdescription": "\nThe number of total items." + }, + { + "name": "first", + "deprecated": false, + "deprecationMessage": "", + "type": "boolean", + "optional": true, + "description": "

                                                                                                                                  True if this item is first.

                                                                                                                                  \n", + "line": 40, + "rawdescription": "\nTrue if this item is first." + }, + { + "name": "index", + "deprecated": false, + "deprecationMessage": "", + "type": "number", + "optional": true, + "description": "

                                                                                                                                  Index of the item.

                                                                                                                                  \n", + "line": 28, + "rawdescription": "\nIndex of the item." + }, + { + "name": "last", + "deprecated": false, + "deprecationMessage": "", + "type": "boolean", + "optional": true, + "description": "

                                                                                                                                  True if this item is last.

                                                                                                                                  \n", + "line": 43, + "rawdescription": "\nTrue if this item is last." + }, + { + "name": "type", + "deprecated": false, + "deprecationMessage": "", + "type": "GalleryItemType", + "optional": true, + "description": "

                                                                                                                                  The type of the item.

                                                                                                                                  \n", + "line": 31, + "rawdescription": "\nThe type of the item." + } + ], + "indexSignatures": [], + "kind": 168, + "methods": [] + }, + { + "name": "GalleryState", + "id": "interface-GalleryState-bccc61a9106233b10cea13d16a36070bc93ff42f88a7f805e345e1617af3cfd049400f126fa7362585b75441e4bc42e59899a526d56d21bee91bd073bec24a6c", + "file": "projects/ng-gallery/src/lib/models/gallery.model.ts", + "deprecated": false, + "deprecationMessage": "", + "type": "interface", + "sourceCode": "import { GalleryAction, GalleryItemType } from './constants';\r\nimport { GalleryItemData } from '../components/templates/items.model';\r\n\r\nexport interface GalleryState {\r\n action?: GalleryAction;\r\n items?: GalleryItem[];\r\n behavior?: ScrollBehavior;\r\n currIndex?: number;\r\n hasNext?: boolean;\r\n hasPrev?: boolean;\r\n isPlaying?: boolean;\r\n}\r\n\r\nexport interface GalleryItem {\r\n data?: GalleryItemData;\r\n type?: GalleryItemType;\r\n}\r\n\r\nexport interface GalleryError {\r\n itemIndex: number;\r\n error: ErrorEvent;\r\n}\r\n", + "properties": [ + { + "name": "action", + "deprecated": false, + "deprecationMessage": "", + "type": "GalleryAction", + "optional": true, + "description": "", + "line": 5 + }, + { + "name": "behavior", + "deprecated": false, + "deprecationMessage": "", + "type": "ScrollBehavior", + "optional": true, + "description": "", + "line": 7 + }, + { + "name": "currIndex", + "deprecated": false, + "deprecationMessage": "", + "type": "number", + "optional": true, + "description": "", + "line": 8 + }, + { + "name": "hasNext", + "deprecated": false, + "deprecationMessage": "", + "type": "boolean", + "optional": true, + "description": "", + "line": 9 + }, + { + "name": "hasPrev", + "deprecated": false, + "deprecationMessage": "", + "type": "boolean", + "optional": true, + "description": "", + "line": 10 + }, + { + "name": "isPlaying", + "deprecated": false, + "deprecationMessage": "", + "type": "boolean", + "optional": true, + "description": "", + "line": 11 + }, + { + "name": "items", + "deprecated": false, + "deprecationMessage": "", + "type": "GalleryItem[]", + "optional": true, + "description": "", + "line": 6 + } + ], + "indexSignatures": [], + "kind": 168, + "methods": [] + }, + { + "name": "GalleryStateContext", + "id": "interface-GalleryStateContext-dc42fc50e33dfef0b09f6091971bf663a23f56cdc21288a1d462bdbc08634bd1b5b282ac3be9fcd63e7a7bf9dbb0caf078fe0cc1be3b3bee6b6030f88eb947cf", + "file": "projects/ng-gallery/src/lib/directives/gallery-box-def.directive.ts", + "deprecated": false, + "deprecationMessage": "", + "type": "interface", + "sourceCode": "import { Directive, TemplateRef } from '@angular/core';\r\nimport { GalleryState } from '../models/gallery.model';\r\nimport { GalleryConfig } from '../models/config.model';\r\n\r\n\r\n@Directive({\r\n standalone: true,\r\n selector: '[galleryBoxDef]'\r\n})\r\nexport class GalleryBoxDef {\r\n\r\n constructor(public templateRef: TemplateRef) {\r\n }\r\n\r\n // Make sure the template checker knows the type of the context with which the\r\n // template of this directive will be rendered\r\n static ngTemplateContextGuard(\r\n directive: GalleryBoxDef,\r\n context: unknown\r\n ): context is GalleryStateContext {\r\n return true;\r\n }\r\n}\r\n\r\nexport interface GalleryStateContext {\r\n state?: GalleryState;\r\n config?: GalleryConfig;\r\n}\r\n", + "properties": [ + { + "name": "config", + "deprecated": false, + "deprecationMessage": "", + "type": "GalleryConfig", + "optional": true, + "description": "", + "line": 27 + }, + { + "name": "state", + "deprecated": false, + "deprecationMessage": "", + "type": "GalleryState", + "optional": true, + "description": "", + "line": 26 + } + ], + "indexSignatures": [], + "kind": 168, + "methods": [] + }, + { + "name": "Hit", + "id": "interface-Hit-9963e215a72986d46269a7e039737f6c6e55bc470c7ac76575d708b4130365d8f7c49083162f6e62f4513eb9bdb38e41e5a145ecf64a471b5a64bc6912546195", + "file": "projects/ng-gallery/src/stories/pixabay/pixabay.model.ts", + "deprecated": false, + "deprecationMessage": "", + "type": "interface", + "sourceCode": "export interface PixabayModel {\r\n total: number;\r\n totalHits: number;\r\n hits: Hit[];\r\n}\r\n\r\nexport interface Hit {\r\n id: number;\r\n pageURL: string;\r\n type: string;\r\n tags: string[];\r\n previewURL: string;\r\n previewWidth: number;\r\n previewHeight: number;\r\n webformatURL: string;\r\n webformatWidth: number;\r\n webformatHeight: number;\r\n imageWidth: number;\r\n imageHeight: number;\r\n imageSize: number;\r\n views: number;\r\n downloads: number;\r\n favorites: number;\r\n likes: number;\r\n comments: number;\r\n user_id: number;\r\n user: string;\r\n userImageURL: string;\r\n}\r\nexport interface PixabayHDModel {\r\n total: number;\r\n totalHits: number;\r\n hits: Hit2[];\r\n}\r\n\r\nexport interface Hit2 {\r\n id_hash: string;\r\n type: string;\r\n previewURL: string;\r\n previewWidth: number;\r\n previewHeight: number;\r\n webformatURL: string;\r\n webformatWidth: number;\r\n webformatHeight: number;\r\n largeImageURL: string;\r\n fullHDURL: string;\r\n imageWidth: number;\r\n imageHeight: number;\r\n imageSize: number;\r\n imageURL: string;\r\n user_id: number;\r\n user: string;\r\n userImageURL: string;\r\n}\r\n", + "properties": [ + { + "name": "comments", + "deprecated": false, + "deprecationMessage": "", + "type": "number", + "optional": false, + "description": "", + "line": 25 + }, + { + "name": "downloads", + "deprecated": false, + "deprecationMessage": "", + "type": "number", + "optional": false, + "description": "", + "line": 22 + }, + { + "name": "favorites", + "deprecated": false, + "deprecationMessage": "", + "type": "number", + "optional": false, + "description": "", + "line": 23 + }, + { + "name": "id", + "deprecated": false, + "deprecationMessage": "", + "type": "number", + "optional": false, + "description": "", + "line": 8 + }, + { + "name": "imageHeight", + "deprecated": false, + "deprecationMessage": "", + "type": "number", + "optional": false, + "description": "", + "line": 19 + }, + { + "name": "imageSize", + "deprecated": false, + "deprecationMessage": "", + "type": "number", + "optional": false, + "description": "", + "line": 20 + }, + { + "name": "imageWidth", + "deprecated": false, + "deprecationMessage": "", + "type": "number", + "optional": false, + "description": "", + "line": 18 + }, + { + "name": "likes", + "deprecated": false, + "deprecationMessage": "", + "type": "number", + "optional": false, + "description": "", + "line": 24 + }, + { + "name": "pageURL", + "deprecated": false, + "deprecationMessage": "", + "type": "string", + "optional": false, + "description": "", + "line": 9 + }, + { + "name": "previewHeight", + "deprecated": false, + "deprecationMessage": "", + "type": "number", + "optional": false, + "description": "", + "line": 14 + }, + { + "name": "previewURL", + "deprecated": false, + "deprecationMessage": "", + "type": "string", + "optional": false, + "description": "", + "line": 12 + }, + { + "name": "previewWidth", + "deprecated": false, + "deprecationMessage": "", + "type": "number", + "optional": false, + "description": "", + "line": 13 + }, + { + "name": "tags", + "deprecated": false, + "deprecationMessage": "", + "type": "string[]", + "optional": false, + "description": "", + "line": 11 + }, + { + "name": "type", + "deprecated": false, + "deprecationMessage": "", + "type": "string", + "optional": false, + "description": "", + "line": 10 + }, + { + "name": "user", + "deprecated": false, + "deprecationMessage": "", + "type": "string", + "optional": false, + "description": "", + "line": 27 + }, + { + "name": "user_id", + "deprecated": false, + "deprecationMessage": "", + "type": "number", + "optional": false, + "description": "", + "line": 26 + }, + { + "name": "userImageURL", + "deprecated": false, + "deprecationMessage": "", + "type": "string", + "optional": false, + "description": "", + "line": 28 + }, + { + "name": "views", + "deprecated": false, + "deprecationMessage": "", + "type": "number", + "optional": false, + "description": "", + "line": 21 + }, + { + "name": "webformatHeight", + "deprecated": false, + "deprecationMessage": "", + "type": "number", + "optional": false, + "description": "", + "line": 17 + }, + { + "name": "webformatURL", + "deprecated": false, + "deprecationMessage": "", + "type": "string", + "optional": false, + "description": "", + "line": 15 + }, + { + "name": "webformatWidth", + "deprecated": false, + "deprecationMessage": "", + "type": "number", + "optional": false, + "description": "", + "line": 16 + } + ], + "indexSignatures": [], + "kind": 168, + "methods": [] + }, + { + "name": "Hit2", + "id": "interface-Hit2-9963e215a72986d46269a7e039737f6c6e55bc470c7ac76575d708b4130365d8f7c49083162f6e62f4513eb9bdb38e41e5a145ecf64a471b5a64bc6912546195", + "file": "projects/ng-gallery/src/stories/pixabay/pixabay.model.ts", + "deprecated": false, + "deprecationMessage": "", + "type": "interface", + "sourceCode": "export interface PixabayModel {\r\n total: number;\r\n totalHits: number;\r\n hits: Hit[];\r\n}\r\n\r\nexport interface Hit {\r\n id: number;\r\n pageURL: string;\r\n type: string;\r\n tags: string[];\r\n previewURL: string;\r\n previewWidth: number;\r\n previewHeight: number;\r\n webformatURL: string;\r\n webformatWidth: number;\r\n webformatHeight: number;\r\n imageWidth: number;\r\n imageHeight: number;\r\n imageSize: number;\r\n views: number;\r\n downloads: number;\r\n favorites: number;\r\n likes: number;\r\n comments: number;\r\n user_id: number;\r\n user: string;\r\n userImageURL: string;\r\n}\r\nexport interface PixabayHDModel {\r\n total: number;\r\n totalHits: number;\r\n hits: Hit2[];\r\n}\r\n\r\nexport interface Hit2 {\r\n id_hash: string;\r\n type: string;\r\n previewURL: string;\r\n previewWidth: number;\r\n previewHeight: number;\r\n webformatURL: string;\r\n webformatWidth: number;\r\n webformatHeight: number;\r\n largeImageURL: string;\r\n fullHDURL: string;\r\n imageWidth: number;\r\n imageHeight: number;\r\n imageSize: number;\r\n imageURL: string;\r\n user_id: number;\r\n user: string;\r\n userImageURL: string;\r\n}\r\n", + "properties": [ + { + "name": "fullHDURL", + "deprecated": false, + "deprecationMessage": "", + "type": "string", + "optional": false, + "description": "", + "line": 46 + }, + { + "name": "id_hash", + "deprecated": false, + "deprecationMessage": "", + "type": "string", + "optional": false, + "description": "", + "line": 37 + }, + { + "name": "imageHeight", + "deprecated": false, + "deprecationMessage": "", + "type": "number", + "optional": false, + "description": "", + "line": 48 + }, + { + "name": "imageSize", + "deprecated": false, + "deprecationMessage": "", + "type": "number", + "optional": false, + "description": "", + "line": 49 + }, + { + "name": "imageURL", + "deprecated": false, + "deprecationMessage": "", + "type": "string", + "optional": false, + "description": "", + "line": 50 + }, + { + "name": "imageWidth", + "deprecated": false, + "deprecationMessage": "", + "type": "number", + "optional": false, + "description": "", + "line": 47 + }, + { + "name": "largeImageURL", + "deprecated": false, + "deprecationMessage": "", + "type": "string", + "optional": false, + "description": "", + "line": 45 + }, + { + "name": "previewHeight", + "deprecated": false, + "deprecationMessage": "", + "type": "number", + "optional": false, + "description": "", + "line": 41 + }, + { + "name": "previewURL", + "deprecated": false, + "deprecationMessage": "", + "type": "string", + "optional": false, + "description": "", + "line": 39 + }, + { + "name": "previewWidth", + "deprecated": false, + "deprecationMessage": "", + "type": "number", + "optional": false, + "description": "", + "line": 40 + }, + { + "name": "type", + "deprecated": false, + "deprecationMessage": "", + "type": "string", + "optional": false, + "description": "", + "line": 38 + }, + { + "name": "user", + "deprecated": false, + "deprecationMessage": "", + "type": "string", + "optional": false, + "description": "", + "line": 52 + }, + { + "name": "user_id", + "deprecated": false, + "deprecationMessage": "", + "type": "number", + "optional": false, + "description": "", + "line": 51 + }, + { + "name": "userImageURL", + "deprecated": false, + "deprecationMessage": "", + "type": "string", + "optional": false, + "description": "", + "line": 53 + }, + { + "name": "webformatHeight", + "deprecated": false, + "deprecationMessage": "", + "type": "number", + "optional": false, + "description": "", + "line": 44 + }, + { + "name": "webformatURL", + "deprecated": false, + "deprecationMessage": "", + "type": "string", + "optional": false, + "description": "", + "line": 42 + }, + { + "name": "webformatWidth", + "deprecated": false, + "deprecationMessage": "", + "type": "number", + "optional": false, + "description": "", + "line": 43 + } + ], + "indexSignatures": [], + "kind": 168, + "methods": [] + }, + { + "name": "ImageRegistry", + "id": "interface-ImageRegistry-1e866edcdaf413ff6b97d6c0d28de27c02d86d2541f0037c4ee618a37f046e7657dfe08ed0dfdffcc7fc468817c0fc1ddb92feaec87cc5069cccc55780a4f395", + "file": "projects/ng-gallery/src/lib/utils/img-manager.ts", + "deprecated": false, + "deprecationMessage": "", + "type": "interface", + "sourceCode": "import { Injectable } from '@angular/core';\r\nimport { Observable, BehaviorSubject, filter, map, switchMap, EMPTY } from 'rxjs';\r\nimport { GalleryState } from '../models/gallery.model';\r\nimport { ItemState } from '../components/templates/items.model';\r\n\r\ninterface ImageRegistry {\r\n state: Observable;\r\n target: HTMLImageElement;\r\n}\r\n\r\n@Injectable()\r\nexport class ImgManager {\r\n\r\n private readonly trigger$: BehaviorSubject = new BehaviorSubject(null);\r\n\r\n private readonly images: Map = new Map();\r\n\r\n getActiveItem(state$: Observable): Observable {\r\n return this.trigger$.pipe(\r\n switchMap(() => state$.pipe(\r\n switchMap((state: GalleryState) => {\r\n const img: ImageRegistry = this.images.get(state.currIndex);\r\n if (img) {\r\n return img.state.pipe(\r\n filter((state: ItemState) => state !== 'loading'),\r\n map(() => img.target)\r\n )\r\n }\r\n return EMPTY;\r\n })\r\n ))\r\n );\r\n }\r\n\r\n addItem(index: number, payload: ImageRegistry): void {\r\n this.images.set(index, payload);\r\n this.trigger$.next();\r\n }\r\n\r\n deleteItem(index: number): void {\r\n if (this.images.has(index)) {\r\n this.images.delete(index);\r\n this.trigger$.next();\r\n }\r\n }\r\n}\r\n", + "properties": [ + { + "name": "state", + "deprecated": false, + "deprecationMessage": "", + "type": "Observable", + "optional": false, + "description": "", + "line": 7 + }, + { + "name": "target", + "deprecated": false, + "deprecationMessage": "", + "type": "HTMLImageElement", + "optional": false, + "description": "", + "line": 8 + } + ], + "indexSignatures": [], + "kind": 168, + "methods": [] + }, + { + "name": "NavConfig", + "id": "interface-NavConfig-6f9fdbcb39c24b0d29450ee3ef7d2371630be5c1f946773304ae58c3414ed67b990c7b6f65447311539eda65a179e0088235c46b7a44e65008d279b9ef79431e", + "file": "projects/ng-gallery/src/lib/models/config.model.ts", + "deprecated": false, + "deprecationMessage": "", + "type": "interface", + "sourceCode": "import { InjectionToken, TemplateRef } from '@angular/core';\r\nimport { BezierEasingOptions } from '../smooth-scroll';\r\n\r\nexport const GALLERY_CONFIG: InjectionToken = new InjectionToken('GALLERY_CONFIG');\r\n\r\ntype ImageSize = 'contain' | 'cover';\r\n\r\ntype Orientation = 'horizontal' | 'vertical';\r\n\r\ntype ThumbsPosition = 'top' | 'left' | 'right' | 'bottom';\r\n\r\ntype HorizontalPosition = 'top' | 'bottom';\r\n\r\ntype LoadingStrategy = 'preload' | 'lazy' | 'default';\r\n\r\ntype LoadingAttr = 'eager' | 'lazy';\r\n\r\ninterface ThumbConfig {\r\n thumbs?: boolean;\r\n thumbWidth?: number;\r\n thumbHeight?: number;\r\n thumbLoadingIcon?: string;\r\n thumbLoadingError?: string;\r\n disableThumbs?: boolean;\r\n detachThumbs?: boolean;\r\n thumbAutosize?: boolean;\r\n disableThumbScroll?: boolean;\r\n disableThumbMouseScroll?: boolean;\r\n thumbCentralized?: boolean;\r\n thumbPosition?: ThumbsPosition;\r\n thumbImageSize?: ImageSize;\r\n thumbTemplate?: TemplateRef;\r\n}\r\n\r\ninterface NavConfig {\r\n nav?: boolean;\r\n navIcon?: string;\r\n}\r\n\r\ninterface BulletsConfig {\r\n bullets?: boolean;\r\n disableBullets?: boolean;\r\n bulletSize?: number;\r\n bulletPosition?: HorizontalPosition;\r\n}\r\n\r\ninterface CounterConfig {\r\n counter?: boolean;\r\n counterPosition?: HorizontalPosition;\r\n}\r\n\r\ninterface PlayerConfig {\r\n autoplay?: boolean;\r\n autoplayInterval?: number;\r\n}\r\n\r\ninterface SliderConfig {\r\n loop?: boolean;\r\n disableScroll?: boolean;\r\n disableMouseScroll?: boolean;\r\n itemAutosize?: boolean;\r\n autoHeight?: boolean;\r\n loadingIcon?: string;\r\n loadingError?: string;\r\n scrollDuration?: number;\r\n scrollEase?: BezierEasingOptions;\r\n orientation?: Orientation;\r\n imageSize?: ImageSize;\r\n loadingStrategy?: LoadingStrategy;\r\n loadingAttr?: LoadingAttr;\r\n boxTemplate?: TemplateRef;\r\n itemTemplate?: TemplateRef;\r\n imageTemplate?: TemplateRef;\r\n}\r\n\r\nexport type GalleryConfig = SliderConfig\r\n & ThumbConfig\r\n & NavConfig\r\n & BulletsConfig\r\n & CounterConfig\r\n & PlayerConfig\r\n & {\r\n scrollBehavior?: ScrollBehavior;\r\n resizeDebounceTime?: number;\r\n debug?: boolean;\r\n}\r\n", + "properties": [ + { + "name": "nav", + "deprecated": false, + "deprecationMessage": "", + "type": "boolean", + "optional": true, + "description": "", + "line": 36 + }, + { + "name": "navIcon", + "deprecated": false, + "deprecationMessage": "", + "type": "string", + "optional": true, + "description": "", + "line": 37 + } + ], + "indexSignatures": [], + "kind": 168, + "methods": [] + }, + { + "name": "PixabayHDModel", + "id": "interface-PixabayHDModel-9963e215a72986d46269a7e039737f6c6e55bc470c7ac76575d708b4130365d8f7c49083162f6e62f4513eb9bdb38e41e5a145ecf64a471b5a64bc6912546195", + "file": "projects/ng-gallery/src/stories/pixabay/pixabay.model.ts", + "deprecated": false, + "deprecationMessage": "", + "type": "interface", + "sourceCode": "export interface PixabayModel {\r\n total: number;\r\n totalHits: number;\r\n hits: Hit[];\r\n}\r\n\r\nexport interface Hit {\r\n id: number;\r\n pageURL: string;\r\n type: string;\r\n tags: string[];\r\n previewURL: string;\r\n previewWidth: number;\r\n previewHeight: number;\r\n webformatURL: string;\r\n webformatWidth: number;\r\n webformatHeight: number;\r\n imageWidth: number;\r\n imageHeight: number;\r\n imageSize: number;\r\n views: number;\r\n downloads: number;\r\n favorites: number;\r\n likes: number;\r\n comments: number;\r\n user_id: number;\r\n user: string;\r\n userImageURL: string;\r\n}\r\nexport interface PixabayHDModel {\r\n total: number;\r\n totalHits: number;\r\n hits: Hit2[];\r\n}\r\n\r\nexport interface Hit2 {\r\n id_hash: string;\r\n type: string;\r\n previewURL: string;\r\n previewWidth: number;\r\n previewHeight: number;\r\n webformatURL: string;\r\n webformatWidth: number;\r\n webformatHeight: number;\r\n largeImageURL: string;\r\n fullHDURL: string;\r\n imageWidth: number;\r\n imageHeight: number;\r\n imageSize: number;\r\n imageURL: string;\r\n user_id: number;\r\n user: string;\r\n userImageURL: string;\r\n}\r\n", + "properties": [ + { + "name": "hits", + "deprecated": false, + "deprecationMessage": "", + "type": "Hit2[]", + "optional": false, + "description": "", + "line": 33 + }, + { + "name": "total", + "deprecated": false, + "deprecationMessage": "", + "type": "number", + "optional": false, + "description": "", + "line": 31 + }, + { + "name": "totalHits", + "deprecated": false, + "deprecationMessage": "", + "type": "number", + "optional": false, + "description": "", + "line": 32 + } + ], + "indexSignatures": [], + "kind": 168, + "methods": [] + }, + { + "name": "PixabayModel", + "id": "interface-PixabayModel-9963e215a72986d46269a7e039737f6c6e55bc470c7ac76575d708b4130365d8f7c49083162f6e62f4513eb9bdb38e41e5a145ecf64a471b5a64bc6912546195", + "file": "projects/ng-gallery/src/stories/pixabay/pixabay.model.ts", + "deprecated": false, + "deprecationMessage": "", + "type": "interface", + "sourceCode": "export interface PixabayModel {\r\n total: number;\r\n totalHits: number;\r\n hits: Hit[];\r\n}\r\n\r\nexport interface Hit {\r\n id: number;\r\n pageURL: string;\r\n type: string;\r\n tags: string[];\r\n previewURL: string;\r\n previewWidth: number;\r\n previewHeight: number;\r\n webformatURL: string;\r\n webformatWidth: number;\r\n webformatHeight: number;\r\n imageWidth: number;\r\n imageHeight: number;\r\n imageSize: number;\r\n views: number;\r\n downloads: number;\r\n favorites: number;\r\n likes: number;\r\n comments: number;\r\n user_id: number;\r\n user: string;\r\n userImageURL: string;\r\n}\r\nexport interface PixabayHDModel {\r\n total: number;\r\n totalHits: number;\r\n hits: Hit2[];\r\n}\r\n\r\nexport interface Hit2 {\r\n id_hash: string;\r\n type: string;\r\n previewURL: string;\r\n previewWidth: number;\r\n previewHeight: number;\r\n webformatURL: string;\r\n webformatWidth: number;\r\n webformatHeight: number;\r\n largeImageURL: string;\r\n fullHDURL: string;\r\n imageWidth: number;\r\n imageHeight: number;\r\n imageSize: number;\r\n imageURL: string;\r\n user_id: number;\r\n user: string;\r\n userImageURL: string;\r\n}\r\n", + "properties": [ + { + "name": "hits", + "deprecated": false, + "deprecationMessage": "", + "type": "Hit[]", + "optional": false, + "description": "", + "line": 4 + }, + { + "name": "total", + "deprecated": false, + "deprecationMessage": "", + "type": "number", + "optional": false, + "description": "", + "line": 2 + }, + { + "name": "totalHits", + "deprecated": false, + "deprecationMessage": "", + "type": "number", + "optional": false, + "description": "", + "line": 3 + } + ], + "indexSignatures": [], + "kind": 168, + "methods": [] + }, + { + "name": "PlayerConfig", + "id": "interface-PlayerConfig-6f9fdbcb39c24b0d29450ee3ef7d2371630be5c1f946773304ae58c3414ed67b990c7b6f65447311539eda65a179e0088235c46b7a44e65008d279b9ef79431e", + "file": "projects/ng-gallery/src/lib/models/config.model.ts", + "deprecated": false, + "deprecationMessage": "", + "type": "interface", + "sourceCode": "import { InjectionToken, TemplateRef } from '@angular/core';\r\nimport { BezierEasingOptions } from '../smooth-scroll';\r\n\r\nexport const GALLERY_CONFIG: InjectionToken = new InjectionToken('GALLERY_CONFIG');\r\n\r\ntype ImageSize = 'contain' | 'cover';\r\n\r\ntype Orientation = 'horizontal' | 'vertical';\r\n\r\ntype ThumbsPosition = 'top' | 'left' | 'right' | 'bottom';\r\n\r\ntype HorizontalPosition = 'top' | 'bottom';\r\n\r\ntype LoadingStrategy = 'preload' | 'lazy' | 'default';\r\n\r\ntype LoadingAttr = 'eager' | 'lazy';\r\n\r\ninterface ThumbConfig {\r\n thumbs?: boolean;\r\n thumbWidth?: number;\r\n thumbHeight?: number;\r\n thumbLoadingIcon?: string;\r\n thumbLoadingError?: string;\r\n disableThumbs?: boolean;\r\n detachThumbs?: boolean;\r\n thumbAutosize?: boolean;\r\n disableThumbScroll?: boolean;\r\n disableThumbMouseScroll?: boolean;\r\n thumbCentralized?: boolean;\r\n thumbPosition?: ThumbsPosition;\r\n thumbImageSize?: ImageSize;\r\n thumbTemplate?: TemplateRef;\r\n}\r\n\r\ninterface NavConfig {\r\n nav?: boolean;\r\n navIcon?: string;\r\n}\r\n\r\ninterface BulletsConfig {\r\n bullets?: boolean;\r\n disableBullets?: boolean;\r\n bulletSize?: number;\r\n bulletPosition?: HorizontalPosition;\r\n}\r\n\r\ninterface CounterConfig {\r\n counter?: boolean;\r\n counterPosition?: HorizontalPosition;\r\n}\r\n\r\ninterface PlayerConfig {\r\n autoplay?: boolean;\r\n autoplayInterval?: number;\r\n}\r\n\r\ninterface SliderConfig {\r\n loop?: boolean;\r\n disableScroll?: boolean;\r\n disableMouseScroll?: boolean;\r\n itemAutosize?: boolean;\r\n autoHeight?: boolean;\r\n loadingIcon?: string;\r\n loadingError?: string;\r\n scrollDuration?: number;\r\n scrollEase?: BezierEasingOptions;\r\n orientation?: Orientation;\r\n imageSize?: ImageSize;\r\n loadingStrategy?: LoadingStrategy;\r\n loadingAttr?: LoadingAttr;\r\n boxTemplate?: TemplateRef;\r\n itemTemplate?: TemplateRef;\r\n imageTemplate?: TemplateRef;\r\n}\r\n\r\nexport type GalleryConfig = SliderConfig\r\n & ThumbConfig\r\n & NavConfig\r\n & BulletsConfig\r\n & CounterConfig\r\n & PlayerConfig\r\n & {\r\n scrollBehavior?: ScrollBehavior;\r\n resizeDebounceTime?: number;\r\n debug?: boolean;\r\n}\r\n", + "properties": [ + { + "name": "autoplay", + "deprecated": false, + "deprecationMessage": "", + "type": "boolean", + "optional": true, + "description": "", + "line": 53 + }, + { + "name": "autoplayInterval", + "deprecated": false, + "deprecationMessage": "", + "type": "number", + "optional": true, + "description": "", + "line": 54 + } + ], + "indexSignatures": [], + "kind": 168, + "methods": [] + }, + { + "name": "SliderConfig", + "id": "interface-SliderConfig-6f9fdbcb39c24b0d29450ee3ef7d2371630be5c1f946773304ae58c3414ed67b990c7b6f65447311539eda65a179e0088235c46b7a44e65008d279b9ef79431e", + "file": "projects/ng-gallery/src/lib/models/config.model.ts", + "deprecated": false, + "deprecationMessage": "", + "type": "interface", + "sourceCode": "import { InjectionToken, TemplateRef } from '@angular/core';\r\nimport { BezierEasingOptions } from '../smooth-scroll';\r\n\r\nexport const GALLERY_CONFIG: InjectionToken = new InjectionToken('GALLERY_CONFIG');\r\n\r\ntype ImageSize = 'contain' | 'cover';\r\n\r\ntype Orientation = 'horizontal' | 'vertical';\r\n\r\ntype ThumbsPosition = 'top' | 'left' | 'right' | 'bottom';\r\n\r\ntype HorizontalPosition = 'top' | 'bottom';\r\n\r\ntype LoadingStrategy = 'preload' | 'lazy' | 'default';\r\n\r\ntype LoadingAttr = 'eager' | 'lazy';\r\n\r\ninterface ThumbConfig {\r\n thumbs?: boolean;\r\n thumbWidth?: number;\r\n thumbHeight?: number;\r\n thumbLoadingIcon?: string;\r\n thumbLoadingError?: string;\r\n disableThumbs?: boolean;\r\n detachThumbs?: boolean;\r\n thumbAutosize?: boolean;\r\n disableThumbScroll?: boolean;\r\n disableThumbMouseScroll?: boolean;\r\n thumbCentralized?: boolean;\r\n thumbPosition?: ThumbsPosition;\r\n thumbImageSize?: ImageSize;\r\n thumbTemplate?: TemplateRef;\r\n}\r\n\r\ninterface NavConfig {\r\n nav?: boolean;\r\n navIcon?: string;\r\n}\r\n\r\ninterface BulletsConfig {\r\n bullets?: boolean;\r\n disableBullets?: boolean;\r\n bulletSize?: number;\r\n bulletPosition?: HorizontalPosition;\r\n}\r\n\r\ninterface CounterConfig {\r\n counter?: boolean;\r\n counterPosition?: HorizontalPosition;\r\n}\r\n\r\ninterface PlayerConfig {\r\n autoplay?: boolean;\r\n autoplayInterval?: number;\r\n}\r\n\r\ninterface SliderConfig {\r\n loop?: boolean;\r\n disableScroll?: boolean;\r\n disableMouseScroll?: boolean;\r\n itemAutosize?: boolean;\r\n autoHeight?: boolean;\r\n loadingIcon?: string;\r\n loadingError?: string;\r\n scrollDuration?: number;\r\n scrollEase?: BezierEasingOptions;\r\n orientation?: Orientation;\r\n imageSize?: ImageSize;\r\n loadingStrategy?: LoadingStrategy;\r\n loadingAttr?: LoadingAttr;\r\n boxTemplate?: TemplateRef;\r\n itemTemplate?: TemplateRef;\r\n imageTemplate?: TemplateRef;\r\n}\r\n\r\nexport type GalleryConfig = SliderConfig\r\n & ThumbConfig\r\n & NavConfig\r\n & BulletsConfig\r\n & CounterConfig\r\n & PlayerConfig\r\n & {\r\n scrollBehavior?: ScrollBehavior;\r\n resizeDebounceTime?: number;\r\n debug?: boolean;\r\n}\r\n", + "properties": [ + { + "name": "autoHeight", + "deprecated": false, + "deprecationMessage": "", + "type": "boolean", + "optional": true, + "description": "", + "line": 62 + }, + { + "name": "boxTemplate", + "deprecated": false, + "deprecationMessage": "", + "type": "TemplateRef", + "optional": true, + "description": "", + "line": 71 + }, + { + "name": "disableMouseScroll", + "deprecated": false, + "deprecationMessage": "", + "type": "boolean", + "optional": true, + "description": "", + "line": 60 + }, + { + "name": "disableScroll", + "deprecated": false, + "deprecationMessage": "", + "type": "boolean", + "optional": true, + "description": "", + "line": 59 + }, + { + "name": "imageSize", + "deprecated": false, + "deprecationMessage": "", + "type": "ImageSize", + "optional": true, + "description": "", + "line": 68 + }, + { + "name": "imageTemplate", + "deprecated": false, + "deprecationMessage": "", + "type": "TemplateRef", + "optional": true, + "description": "", + "line": 73 + }, + { + "name": "itemAutosize", + "deprecated": false, + "deprecationMessage": "", + "type": "boolean", + "optional": true, + "description": "", + "line": 61 + }, + { + "name": "itemTemplate", + "deprecated": false, + "deprecationMessage": "", + "type": "TemplateRef", + "optional": true, + "description": "", + "line": 72 + }, + { + "name": "loadingAttr", + "deprecated": false, + "deprecationMessage": "", + "type": "LoadingAttr", + "optional": true, + "description": "", + "line": 70 + }, + { + "name": "loadingError", + "deprecated": false, + "deprecationMessage": "", + "type": "string", + "optional": true, + "description": "", + "line": 64 + }, + { + "name": "loadingIcon", + "deprecated": false, + "deprecationMessage": "", + "type": "string", + "optional": true, + "description": "", + "line": 63 + }, + { + "name": "loadingStrategy", + "deprecated": false, + "deprecationMessage": "", + "type": "LoadingStrategy", + "optional": true, + "description": "", + "line": 69 + }, + { + "name": "loop", + "deprecated": false, + "deprecationMessage": "", + "type": "boolean", + "optional": true, + "description": "", + "line": 58 + }, + { + "name": "orientation", + "deprecated": false, + "deprecationMessage": "", + "type": "Orientation", + "optional": true, + "description": "", + "line": 67 + }, + { + "name": "scrollDuration", + "deprecated": false, + "deprecationMessage": "", + "type": "number", + "optional": true, + "description": "", + "line": 65 + }, + { + "name": "scrollEase", + "deprecated": false, + "deprecationMessage": "", + "type": "BezierEasingOptions", + "optional": true, + "description": "", + "line": 66 + } + ], + "indexSignatures": [], + "kind": 168, + "methods": [] + }, + { + "name": "SliderState", + "id": "interface-SliderState-d22312f8a2fc91818c2306e7e2454008eef511221649d326d37fbdd06035ce34659a4234e92dad62f41e0298ff110bcd14a068c3054d8c83edefdd48daedc8f3", + "file": "projects/ng-gallery/src/lib/models/slider.model.ts", + "deprecated": false, + "deprecationMessage": "", + "type": "interface", + "sourceCode": "export interface SliderState {\r\n style: any;\r\n instant: boolean;\r\n}\r\n\r\nexport interface WorkerState {\r\n value: number;\r\n instant: boolean;\r\n}\r\n", + "properties": [ + { + "name": "instant", + "deprecated": false, + "deprecationMessage": "", + "type": "boolean", + "optional": false, + "description": "", + "line": 3 + }, + { + "name": "style", + "deprecated": false, + "deprecationMessage": "", + "type": "any", + "optional": false, + "description": "", + "line": 2 + } + ], + "indexSignatures": [], + "kind": 168, + "methods": [] + }, + { + "name": "SmoothScrollStep", + "id": "interface-SmoothScrollStep-d5eb67d1ecb7e4a497bc40fcef2fe77cbb5c20ac2db236be86ebd414c779eaa102f061d231cd6f4b9e7eccafc0caec3de14b9637f33374309f5e2e1e76ff7548", + "file": "projects/ng-gallery/src/lib/smooth-scroll/smooth-scroll.model.ts", + "deprecated": false, + "deprecationMessage": "", + "type": "interface", + "sourceCode": "import { _XAxis, _YAxis } from '@angular/cdk/scrolling';\r\n\r\nexport type SmoothScrollOptions = _XAxis & _YAxis & {\r\n behavior?: ScrollBehavior;\r\n}\r\n\r\nexport type SmoothScrollToOptions = _XAxis & _YAxis & {\r\n duration?: number;\r\n easing?: BezierEasingOptions;\r\n};\r\n\r\nexport interface SmoothScrollStep {\r\n scrollable: HTMLElement;\r\n startTime: number;\r\n startX: number;\r\n startY: number;\r\n x: number;\r\n y: number;\r\n duration: number;\r\n easing: (k: number) => number;\r\n currentX?: number;\r\n currentY?: number;\r\n}\r\n\r\nexport interface BezierEasingOptions {\r\n x1: number;\r\n y1: number;\r\n x2: number;\r\n y2: number;\r\n}\r\n", + "properties": [ + { + "name": "currentX", + "deprecated": false, + "deprecationMessage": "", + "type": "number", + "optional": true, + "description": "", + "line": 21 + }, + { + "name": "currentY", + "deprecated": false, + "deprecationMessage": "", + "type": "number", + "optional": true, + "description": "", + "line": 22 + }, + { + "name": "duration", + "deprecated": false, + "deprecationMessage": "", + "type": "number", + "optional": false, + "description": "", + "line": 19 + }, + { + "name": "easing", + "deprecated": false, + "deprecationMessage": "", + "type": "function", + "optional": false, + "description": "", + "line": 20 + }, + { + "name": "scrollable", + "deprecated": false, + "deprecationMessage": "", + "type": "HTMLElement", + "optional": false, + "description": "", + "line": 13 + }, + { + "name": "startTime", + "deprecated": false, + "deprecationMessage": "", + "type": "number", + "optional": false, + "description": "", + "line": 14 + }, + { + "name": "startX", + "deprecated": false, + "deprecationMessage": "", + "type": "number", + "optional": false, + "description": "", + "line": 15 + }, + { + "name": "startY", + "deprecated": false, + "deprecationMessage": "", + "type": "number", + "optional": false, + "description": "", + "line": 16 + }, + { + "name": "x", + "deprecated": false, + "deprecationMessage": "", + "type": "number", + "optional": false, + "description": "", + "line": 17 + }, + { + "name": "y", + "deprecated": false, + "deprecationMessage": "", + "type": "number", + "optional": false, + "description": "", + "line": 18 + } + ], + "indexSignatures": [], + "kind": 168, + "methods": [] + }, + { + "name": "ThumbConfig", + "id": "interface-ThumbConfig-6f9fdbcb39c24b0d29450ee3ef7d2371630be5c1f946773304ae58c3414ed67b990c7b6f65447311539eda65a179e0088235c46b7a44e65008d279b9ef79431e", + "file": "projects/ng-gallery/src/lib/models/config.model.ts", + "deprecated": false, + "deprecationMessage": "", + "type": "interface", + "sourceCode": "import { InjectionToken, TemplateRef } from '@angular/core';\r\nimport { BezierEasingOptions } from '../smooth-scroll';\r\n\r\nexport const GALLERY_CONFIG: InjectionToken = new InjectionToken('GALLERY_CONFIG');\r\n\r\ntype ImageSize = 'contain' | 'cover';\r\n\r\ntype Orientation = 'horizontal' | 'vertical';\r\n\r\ntype ThumbsPosition = 'top' | 'left' | 'right' | 'bottom';\r\n\r\ntype HorizontalPosition = 'top' | 'bottom';\r\n\r\ntype LoadingStrategy = 'preload' | 'lazy' | 'default';\r\n\r\ntype LoadingAttr = 'eager' | 'lazy';\r\n\r\ninterface ThumbConfig {\r\n thumbs?: boolean;\r\n thumbWidth?: number;\r\n thumbHeight?: number;\r\n thumbLoadingIcon?: string;\r\n thumbLoadingError?: string;\r\n disableThumbs?: boolean;\r\n detachThumbs?: boolean;\r\n thumbAutosize?: boolean;\r\n disableThumbScroll?: boolean;\r\n disableThumbMouseScroll?: boolean;\r\n thumbCentralized?: boolean;\r\n thumbPosition?: ThumbsPosition;\r\n thumbImageSize?: ImageSize;\r\n thumbTemplate?: TemplateRef;\r\n}\r\n\r\ninterface NavConfig {\r\n nav?: boolean;\r\n navIcon?: string;\r\n}\r\n\r\ninterface BulletsConfig {\r\n bullets?: boolean;\r\n disableBullets?: boolean;\r\n bulletSize?: number;\r\n bulletPosition?: HorizontalPosition;\r\n}\r\n\r\ninterface CounterConfig {\r\n counter?: boolean;\r\n counterPosition?: HorizontalPosition;\r\n}\r\n\r\ninterface PlayerConfig {\r\n autoplay?: boolean;\r\n autoplayInterval?: number;\r\n}\r\n\r\ninterface SliderConfig {\r\n loop?: boolean;\r\n disableScroll?: boolean;\r\n disableMouseScroll?: boolean;\r\n itemAutosize?: boolean;\r\n autoHeight?: boolean;\r\n loadingIcon?: string;\r\n loadingError?: string;\r\n scrollDuration?: number;\r\n scrollEase?: BezierEasingOptions;\r\n orientation?: Orientation;\r\n imageSize?: ImageSize;\r\n loadingStrategy?: LoadingStrategy;\r\n loadingAttr?: LoadingAttr;\r\n boxTemplate?: TemplateRef;\r\n itemTemplate?: TemplateRef;\r\n imageTemplate?: TemplateRef;\r\n}\r\n\r\nexport type GalleryConfig = SliderConfig\r\n & ThumbConfig\r\n & NavConfig\r\n & BulletsConfig\r\n & CounterConfig\r\n & PlayerConfig\r\n & {\r\n scrollBehavior?: ScrollBehavior;\r\n resizeDebounceTime?: number;\r\n debug?: boolean;\r\n}\r\n", + "properties": [ + { + "name": "detachThumbs", + "deprecated": false, + "deprecationMessage": "", + "type": "boolean", + "optional": true, + "description": "", + "line": 25 + }, + { + "name": "disableThumbMouseScroll", + "deprecated": false, + "deprecationMessage": "", + "type": "boolean", + "optional": true, + "description": "", + "line": 28 + }, + { + "name": "disableThumbs", + "deprecated": false, + "deprecationMessage": "", + "type": "boolean", + "optional": true, + "description": "", + "line": 24 + }, + { + "name": "disableThumbScroll", + "deprecated": false, + "deprecationMessage": "", + "type": "boolean", + "optional": true, + "description": "", + "line": 27 + }, + { + "name": "thumbAutosize", + "deprecated": false, + "deprecationMessage": "", + "type": "boolean", + "optional": true, + "description": "", + "line": 26 + }, + { + "name": "thumbCentralized", + "deprecated": false, + "deprecationMessage": "", + "type": "boolean", + "optional": true, + "description": "", + "line": 29 + }, + { + "name": "thumbHeight", + "deprecated": false, + "deprecationMessage": "", + "type": "number", + "optional": true, + "description": "", + "line": 21 + }, + { + "name": "thumbImageSize", + "deprecated": false, + "deprecationMessage": "", + "type": "ImageSize", + "optional": true, + "description": "", + "line": 31 + }, + { + "name": "thumbLoadingError", + "deprecated": false, + "deprecationMessage": "", + "type": "string", + "optional": true, + "description": "", + "line": 23 + }, + { + "name": "thumbLoadingIcon", + "deprecated": false, + "deprecationMessage": "", + "type": "string", + "optional": true, + "description": "", + "line": 22 + }, + { + "name": "thumbPosition", + "deprecated": false, + "deprecationMessage": "", + "type": "ThumbsPosition", + "optional": true, + "description": "", + "line": 30 + }, + { + "name": "thumbs", + "deprecated": false, + "deprecationMessage": "", + "type": "boolean", + "optional": true, + "description": "", + "line": 19 + }, + { + "name": "thumbTemplate", + "deprecated": false, + "deprecationMessage": "", + "type": "TemplateRef", + "optional": true, + "description": "", + "line": 32 + }, + { + "name": "thumbWidth", + "deprecated": false, + "deprecationMessage": "", + "type": "number", + "optional": true, + "description": "", + "line": 20 + } + ], + "indexSignatures": [], + "kind": 168, + "methods": [] + }, + { + "name": "WorkerState", + "id": "interface-WorkerState-d22312f8a2fc91818c2306e7e2454008eef511221649d326d37fbdd06035ce34659a4234e92dad62f41e0298ff110bcd14a068c3054d8c83edefdd48daedc8f3", + "file": "projects/ng-gallery/src/lib/models/slider.model.ts", + "deprecated": false, + "deprecationMessage": "", + "type": "interface", + "sourceCode": "export interface SliderState {\r\n style: any;\r\n instant: boolean;\r\n}\r\n\r\nexport interface WorkerState {\r\n value: number;\r\n instant: boolean;\r\n}\r\n", + "properties": [ + { + "name": "instant", + "deprecated": false, + "deprecationMessage": "", + "type": "boolean", + "optional": false, + "description": "", + "line": 8 + }, + { + "name": "value", + "deprecated": false, + "deprecationMessage": "", + "type": "number", + "optional": false, + "description": "", + "line": 7 + } + ], + "indexSignatures": [], + "kind": 168, + "methods": [] + } + ], + "injectables": [ + { + "name": "Gallery", + "id": "injectable-Gallery-5a22f71c73e3d73bdb0d70d243c246ee81e6ad9ed4f2db3fed877932e3a5417d5f42141b52cd8a3e3759288dfdb43d47d607cc442701be17aa01e323801eae82", + "file": "projects/ng-gallery/src/lib/services/gallery.service.ts", + "properties": [ + { + "name": "_instances", + "defaultValue": "new Map()", + "deprecated": false, + "deprecationMessage": "", + "type": "", + "optional": false, + "description": "

                                                                                                                                  Store gallery instances

                                                                                                                                  \n", + "line": 13, + "rawdescription": "\nStore gallery instances", + "modifierKind": [ + 121, + 146 + ] + }, + { + "name": "config", + "deprecated": false, + "deprecationMessage": "", + "type": "GalleryConfig", + "optional": false, + "description": "

                                                                                                                                  Global config

                                                                                                                                  \n", + "line": 16, + "rawdescription": "\nGlobal config" + } + ], + "methods": [ + { + "name": "debugConsole", + "args": [ + { + "name": "data", + "type": "any[]", + "deprecated": false, + "deprecationMessage": "", + "dotDotDotToken": true + } + ], + "optional": false, + "returnType": "void", + "typeParameters": [], + "line": 56, + "deprecated": false, + "deprecationMessage": "", + "rawdescription": "\n\nLogger for debugging\n", + "description": "

                                                                                                                                  Logger for debugging

                                                                                                                                  \n", + "jsdoctags": [ + { + "name": "data", + "type": "any[]", + "deprecated": false, + "deprecationMessage": "", + "dotDotDotToken": true, + "tagName": { + "text": "param" + } + } + ] + }, + { + "name": "deleteInstance", + "args": [ + { + "name": "id", + "type": "string", + "deprecated": false, + "deprecationMessage": "" + } + ], + "optional": false, + "returnType": "() => void", + "typeParameters": [], + "line": 65, + "deprecated": false, + "deprecationMessage": "", + "rawdescription": "\n\nA destroyer function for each gallery instance\n", + "description": "

                                                                                                                                  A destroyer function for each gallery instance

                                                                                                                                  \n", + "modifierKind": [ + 121 + ], + "jsdoctags": [ + { + "name": "id", + "type": "string", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + } + ] + }, + { + "name": "destroyAll", + "args": [], + "optional": false, + "returnType": "void", + "typeParameters": [], + "line": 42, + "deprecated": false, + "deprecationMessage": "", + "rawdescription": "\n\nDestroy all gallery instances\n", + "description": "

                                                                                                                                  Destroy all gallery instances

                                                                                                                                  \n" + }, + { + "name": "ref", + "args": [ + { + "name": "id", + "type": "string", + "deprecated": false, + "deprecationMessage": "", + "defaultValue": "'root'" + }, + { + "name": "config", + "type": "GalleryConfig", + "deprecated": false, + "deprecationMessage": "", + "optional": true + } + ], + "optional": false, + "returnType": "GalleryRef", + "typeParameters": [], + "line": 27, + "deprecated": false, + "deprecationMessage": "", + "rawdescription": "\n\nGet or create gallery by ID\n", + "description": "

                                                                                                                                  Get or create gallery by ID

                                                                                                                                  \n", + "jsdoctags": [ + { + "name": { + "pos": 676, + "end": 678, + "flags": 8421376, + "modifierFlagsCache": 0, + "transformFlags": 0, + "kind": 79, + "escapedText": "id" + }, + "type": "string", + "deprecated": false, + "deprecationMessage": "", + "defaultValue": "'root'", + "tagName": { + "pos": 670, + "end": 675, + "flags": 8421376, + "modifierFlagsCache": 0, + "transformFlags": 0, + "kind": 79, + "escapedText": "param" + }, + "comment": "" + }, + { + "name": { + "pos": 692, + "end": 698, + "flags": 8421376, + "modifierFlagsCache": 0, + "transformFlags": 0, + "kind": 79, + "escapedText": "config" + }, + "type": "GalleryConfig", + "deprecated": false, + "deprecationMessage": "", + "optional": true, + "tagName": { + "pos": 686, + "end": 691, + "flags": 8421376, + "modifierFlagsCache": 0, + "transformFlags": 0, + "kind": 79, + "escapedText": "param" + }, + "comment": "" + } + ] + }, + { + "name": "resetAll", + "args": [], + "optional": false, + "returnType": "void", + "typeParameters": [], + "line": 49, + "deprecated": false, + "deprecationMessage": "", + "rawdescription": "\n\nReset all gallery instances\n", + "description": "

                                                                                                                                  Reset all gallery instances

                                                                                                                                  \n" + } + ], + "deprecated": false, + "deprecationMessage": "", + "description": "", + "rawdescription": "\n", + "sourceCode": "import { Inject, Injectable, Optional } from '@angular/core';\r\n\r\nimport { GalleryRef } from './gallery-ref';\r\nimport { GalleryConfig, GALLERY_CONFIG } from '../models/config.model';\r\nimport { defaultConfig } from '../utils/gallery.default';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class Gallery {\r\n\r\n /** Store gallery instances */\r\n private readonly _instances = new Map();\r\n\r\n /** Global config */\r\n config: GalleryConfig;\r\n\r\n constructor(@Optional() @Inject(GALLERY_CONFIG) config: GalleryConfig) {\r\n this.config = config ? { ...defaultConfig, ...config } : defaultConfig;\r\n }\r\n\r\n /**\r\n * Get or create gallery by ID\r\n * @param id\r\n * @param config\r\n */\r\n ref(id = 'root', config?: GalleryConfig): GalleryRef {\r\n if (this._instances.has(id)) {\r\n const galleryRef: GalleryRef = this._instances.get(id);\r\n if (config) {\r\n galleryRef.setConfig(config);\r\n }\r\n return galleryRef;\r\n } else {\r\n return this._instances.set(id, new GalleryRef({ ...this.config, ...config }, this.deleteInstance(id))).get(id);\r\n }\r\n }\r\n\r\n /**\r\n * Destroy all gallery instances\r\n */\r\n destroyAll() {\r\n this._instances.forEach((ref: GalleryRef) => ref.destroy());\r\n }\r\n\r\n /**\r\n * Reset all gallery instances\r\n */\r\n resetAll() {\r\n this._instances.forEach((ref: GalleryRef) => ref.reset());\r\n }\r\n\r\n /**\r\n * Logger for debugging\r\n */\r\n debugConsole(...data: any[]): void {\r\n if (this.config.debug) {\r\n console.log(...data)\r\n }\r\n }\r\n\r\n /**\r\n * A destroyer function for each gallery instance\r\n */\r\n private deleteInstance(id: string) {\r\n return () => {\r\n if (this._instances.has(id)) {\r\n this._instances.delete(id);\r\n }\r\n };\r\n }\r\n\r\n}\r\n", + "constructorObj": { + "name": "constructor", + "description": "", + "deprecated": false, + "deprecationMessage": "", + "args": [ + { + "name": "config", + "type": "GalleryConfig", + "deprecated": false, + "deprecationMessage": "" + } + ], + "line": 16, + "jsdoctags": [ + { + "name": "config", + "type": "GalleryConfig", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + } + ] + }, + "type": "injectable" + }, + { + "name": "ImgManager", + "id": "injectable-ImgManager-1e866edcdaf413ff6b97d6c0d28de27c02d86d2541f0037c4ee618a37f046e7657dfe08ed0dfdffcc7fc468817c0fc1ddb92feaec87cc5069cccc55780a4f395", + "file": "projects/ng-gallery/src/lib/utils/img-manager.ts", + "properties": [ + { + "name": "images", + "defaultValue": "new Map()", + "deprecated": false, + "deprecationMessage": "", + "type": "Map", + "optional": false, + "description": "", + "line": 16, + "modifierKind": [ + 121, + 146 + ] + }, + { + "name": "trigger$", + "defaultValue": "new BehaviorSubject(null)", + "deprecated": false, + "deprecationMessage": "", + "type": "BehaviorSubject", + "optional": false, + "description": "", + "line": 14, + "modifierKind": [ + 121, + 146 + ] + } + ], + "methods": [ + { + "name": "addItem", + "args": [ + { + "name": "index", + "type": "number", + "deprecated": false, + "deprecationMessage": "" + }, + { + "name": "payload", + "type": "ImageRegistry", + "deprecated": false, + "deprecationMessage": "" + } + ], + "optional": false, + "returnType": "void", + "typeParameters": [], + "line": 35, + "deprecated": false, + "deprecationMessage": "", + "jsdoctags": [ + { + "name": "index", + "type": "number", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + }, + { + "name": "payload", + "type": "ImageRegistry", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + } + ] + }, + { + "name": "deleteItem", + "args": [ + { + "name": "index", + "type": "number", + "deprecated": false, + "deprecationMessage": "" + } + ], + "optional": false, + "returnType": "void", + "typeParameters": [], + "line": 40, + "deprecated": false, + "deprecationMessage": "", + "jsdoctags": [ + { + "name": "index", + "type": "number", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + } + ] + }, + { + "name": "getActiveItem", + "args": [ + { + "name": "state$", + "type": "Observable", + "deprecated": false, + "deprecationMessage": "" + } + ], + "optional": false, + "returnType": "Observable", + "typeParameters": [], + "line": 18, + "deprecated": false, + "deprecationMessage": "", + "jsdoctags": [ + { + "name": "state$", + "type": "Observable", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + } + ] + } + ], + "deprecated": false, + "deprecationMessage": "", + "description": "", + "rawdescription": "\n", + "sourceCode": "import { Injectable } from '@angular/core';\r\nimport { Observable, BehaviorSubject, filter, map, switchMap, EMPTY } from 'rxjs';\r\nimport { GalleryState } from '../models/gallery.model';\r\nimport { ItemState } from '../components/templates/items.model';\r\n\r\ninterface ImageRegistry {\r\n state: Observable;\r\n target: HTMLImageElement;\r\n}\r\n\r\n@Injectable()\r\nexport class ImgManager {\r\n\r\n private readonly trigger$: BehaviorSubject = new BehaviorSubject(null);\r\n\r\n private readonly images: Map = new Map();\r\n\r\n getActiveItem(state$: Observable): Observable {\r\n return this.trigger$.pipe(\r\n switchMap(() => state$.pipe(\r\n switchMap((state: GalleryState) => {\r\n const img: ImageRegistry = this.images.get(state.currIndex);\r\n if (img) {\r\n return img.state.pipe(\r\n filter((state: ItemState) => state !== 'loading'),\r\n map(() => img.target)\r\n )\r\n }\r\n return EMPTY;\r\n })\r\n ))\r\n );\r\n }\r\n\r\n addItem(index: number, payload: ImageRegistry): void {\r\n this.images.set(index, payload);\r\n this.trigger$.next();\r\n }\r\n\r\n deleteItem(index: number): void {\r\n if (this.images.has(index)) {\r\n this.images.delete(index);\r\n this.trigger$.next();\r\n }\r\n }\r\n}\r\n", + "type": "injectable" + } + ], + "guards": [], + "interceptors": [], + "classes": [ + { + "name": "ActiveItemObserver", + "id": "class-ActiveItemObserver-9180d1fd42bb564fafb7790f26d07a9aac1ae69ddab5986cfb4e40bc313416ec17d3a9b8b461ae3d18fbb987444aeee96f71c95fa6d3f7147b560221fef2e46b", + "file": "projects/ng-gallery/src/lib/observers/active-item-observer.ts", + "deprecated": false, + "deprecationMessage": "", + "type": "class", + "sourceCode": "import { Observable, Subscriber, mergeMap, filter, map } from 'rxjs';\r\n\r\nexport class ActiveItemObserver {\r\n\r\n observe(root: HTMLElement, elements: HTMLElement[], rootMargin: string): Observable {\r\n return createIntersectionObserver(root, elements, rootMargin).pipe(\r\n map((entry: IntersectionObserverEntry) => {\r\n if (entry.isIntersecting) {\r\n entry.target.classList.add('g-item-highlight');\r\n return +entry.target.getAttribute('galleryIndex');\r\n } else {\r\n entry.target.classList.remove('g-item-highlight');\r\n return -1;\r\n }\r\n }),\r\n filter((index: number) => index !== -1)\r\n );\r\n }\r\n}\r\n\r\nfunction createIntersectionObserver(root: HTMLElement, elements: HTMLElement[], rootMargin: string): Observable {\r\n return new Observable((observer: Subscriber) => {\r\n const intersectionObserver: IntersectionObserver = new IntersectionObserver(\r\n (entries: IntersectionObserverEntry[]) => observer.next(entries),\r\n {\r\n root,\r\n rootMargin,\r\n threshold: 1\r\n }\r\n );\r\n elements.forEach((element: HTMLElement) => intersectionObserver.observe(element));\r\n return () => {\r\n elements.forEach((element: HTMLElement) => intersectionObserver.unobserve(element));\r\n intersectionObserver.disconnect();\r\n };\r\n }).pipe(\r\n mergeMap((entries: IntersectionObserverEntry[]) => entries)\r\n );\r\n}\r\n\r\n", + "properties": [], + "methods": [ + { + "name": "observe", + "args": [ + { + "name": "root", + "type": "HTMLElement", + "deprecated": false, + "deprecationMessage": "" + }, + { + "name": "elements", + "type": "HTMLElement[]", + "deprecated": false, + "deprecationMessage": "" + }, + { + "name": "rootMargin", + "type": "string", + "deprecated": false, + "deprecationMessage": "" + } + ], + "optional": false, + "returnType": "Observable", + "typeParameters": [], + "line": 5, + "deprecated": false, + "deprecationMessage": "", + "jsdoctags": [ + { + "name": "root", + "type": "HTMLElement", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + }, + { + "name": "elements", + "type": "HTMLElement[]", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + }, + { + "name": "rootMargin", + "type": "string", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + } + ] + } + ], + "indexSignatures": [], + "inputsClass": [], + "outputsClass": [], + "hostBindings": [], + "hostListeners": [] + }, + { + "name": "GalleryRef", + "id": "class-GalleryRef-8ca5faf14b2f565232b54e8f226af10dede46ddefd46097283d024368d6c02b09ec52d9d6c770cc002b4d899679c38623f7948e4d6e8d322d95d70f337b837ba", + "file": "projects/ng-gallery/src/lib/services/gallery-ref.ts", + "deprecated": false, + "deprecationMessage": "", + "type": "class", + "sourceCode": "import { BehaviorSubject, Subject, Observable, filter } from 'rxjs';\r\nimport { defaultState } from '../utils/gallery.default';\r\nimport { GalleryError, GalleryItem, GalleryState } from '../models/gallery.model';\r\nimport { GalleryConfig } from '../models/config.model';\r\nimport { GalleryAction } from '../models/constants';\r\nimport {\r\n IframeItem,\r\n IframeItemData,\r\n ImageItem,\r\n ImageItemData,\r\n VideoItem,\r\n VideoItemData,\r\n YoutubeItem,\r\n YoutubeItemData\r\n} from '../components/templates/items.model';\r\n\r\nconst filterActions = (actions: string[]) => {\r\n return filter((state: GalleryState) => actions.indexOf(state.action) > -1);\r\n};\r\n\r\nexport class GalleryRef {\r\n\r\n /** Stream that emits gallery state */\r\n private readonly _state: BehaviorSubject;\r\n\r\n /** Stream that emits gallery config */\r\n private readonly _config: BehaviorSubject;\r\n\r\n /** Stream that emits on item click */\r\n readonly itemClick: Subject = new Subject();\r\n\r\n /** Stream that emits on thumbnail click */\r\n readonly thumbClick: Subject = new Subject();\r\n\r\n /** Stream that emits on an error occurs */\r\n readonly error: Subject = new Subject();\r\n\r\n /** Gallery Events */\r\n\r\n /** Stream that emits gallery state */\r\n readonly state: Observable;\r\n\r\n /** Stream that emits gallery config */\r\n readonly config: Observable;\r\n\r\n get stateSnapshot(): GalleryState {\r\n return this._state.value;\r\n }\r\n\r\n get configSnapshot(): GalleryConfig {\r\n return this._config.value;\r\n }\r\n\r\n /** Stream that emits when gallery is initialized/reset */\r\n get initialized(): Observable {\r\n return this.state.pipe(filterActions([GalleryAction.INITIALIZED]));\r\n }\r\n\r\n /** Stream that emits when items is changed (items loaded, item added, item removed) */\r\n get itemsChanged(): Observable {\r\n return this.state.pipe(filterActions([GalleryAction.ITEMS_CHANGED]));\r\n }\r\n\r\n /** Stream that emits when current item is changed */\r\n get indexChanged(): Observable {\r\n return this.state.pipe(filterActions([GalleryAction.INDEX_CHANGED]));\r\n }\r\n\r\n /** Stream that emits when the player should start or stop */\r\n get playingChanged(): Observable {\r\n return this.state.pipe(filterActions([GalleryAction.PLAY, GalleryAction.STOP]));\r\n }\r\n\r\n constructor(config: GalleryConfig, private deleteInstance: () => void) {\r\n this._state = new BehaviorSubject(defaultState);\r\n this._config = new BehaviorSubject(config);\r\n this.state = this._state.asObservable();\r\n this.config = this._config.asObservable();\r\n }\r\n\r\n /**\r\n * Set gallery state\r\n */\r\n private setState(state: GalleryState): void {\r\n this._state.next({ ...this.stateSnapshot, ...state });\r\n }\r\n\r\n /**\r\n * Set gallery config\r\n */\r\n setConfig(config: GalleryConfig): void {\r\n this._config.next({ ...this._config.value, ...config });\r\n }\r\n\r\n /**\r\n * Add gallery item\r\n */\r\n add(item: GalleryItem, active?: boolean): void {\r\n const items: GalleryItem[] = [...this.stateSnapshot.items, item];\r\n this.setState({\r\n action: GalleryAction.ITEMS_CHANGED,\r\n items,\r\n hasNext: items.length > 1,\r\n currIndex: active ? items.length - 1 : this.stateSnapshot.currIndex\r\n });\r\n }\r\n\r\n /**\r\n * Add image item\r\n */\r\n addImage(data: ImageItemData, active?: boolean): void {\r\n this.add(new ImageItem(data), active);\r\n }\r\n\r\n /**\r\n * Add video item\r\n */\r\n addVideo(data: VideoItemData, active?: boolean): void {\r\n this.add(new VideoItem(data), active);\r\n }\r\n\r\n /**\r\n * Add iframe item\r\n */\r\n addIframe(data: IframeItemData, active?: boolean): void {\r\n this.add(new IframeItem(data), active);\r\n }\r\n\r\n /**\r\n * Add Youtube item\r\n */\r\n addYoutube(data: YoutubeItemData, active?: boolean): void {\r\n this.add(new YoutubeItem(data), active);\r\n }\r\n\r\n /**\r\n * Remove gallery item\r\n */\r\n remove(i: number): void {\r\n const state: GalleryState = this.stateSnapshot;\r\n const items: GalleryItem[] = [\r\n ...state.items.slice(0, i),\r\n ...state.items.slice(i + 1, state.items.length)\r\n ];\r\n this.setState({\r\n action: GalleryAction.ITEMS_CHANGED,\r\n currIndex: i < 1 ? state.currIndex : i - 1,\r\n items,\r\n hasNext: items.length > 1,\r\n hasPrev: i > 0\r\n });\r\n }\r\n\r\n /**\r\n * Load items and reset the state\r\n */\r\n load(items: GalleryItem[]): void {\r\n if (items) {\r\n this.setState({\r\n action: GalleryAction.ITEMS_CHANGED,\r\n items,\r\n hasNext: items.length > 1,\r\n hasPrev: false\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * Set active item\r\n */\r\n set(i: number, behavior: ScrollBehavior = this._config.value.scrollBehavior): void {\r\n if (i < 0 || i >= this.stateSnapshot.items.length) {\r\n console.error(`[NgGallery]: Unable to set the active item because the given index (${ i }) is outside the items range!`);\r\n return;\r\n }\r\n if (i !== this.stateSnapshot.currIndex) {\r\n this.setState({\r\n behavior,\r\n action: GalleryAction.INDEX_CHANGED,\r\n currIndex: i,\r\n hasNext: i < this.stateSnapshot.items.length - 1,\r\n hasPrev: i > 0\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * Next item\r\n */\r\n next(behavior: ScrollBehavior = this._config.value.scrollBehavior, loop: boolean = true): void {\r\n if (this.stateSnapshot.hasNext) {\r\n this.set(this.stateSnapshot.currIndex + 1, behavior);\r\n } else if (loop && this._config.value.loop) {\r\n this.set(0, behavior);\r\n }\r\n }\r\n\r\n /**\r\n * Prev item\r\n */\r\n prev(behavior: ScrollBehavior = this._config.value.scrollBehavior, loop: boolean = true): void {\r\n if (this.stateSnapshot.hasPrev) {\r\n this.set(this.stateSnapshot.currIndex - 1, behavior);\r\n } else if (loop && this._config.value.loop) {\r\n this.set(this.stateSnapshot.items.length - 1, behavior);\r\n }\r\n }\r\n\r\n /**\r\n * Start gallery player\r\n */\r\n play(interval?: number): void {\r\n if (interval) {\r\n this.setConfig({ autoplayInterval: interval });\r\n }\r\n this.setState({ action: GalleryAction.PLAY, behavior: 'auto', isPlaying: true });\r\n }\r\n\r\n /**\r\n * Stop gallery player\r\n */\r\n stop(): void {\r\n this.setState({ action: GalleryAction.STOP, isPlaying: false });\r\n }\r\n\r\n /**\r\n * Reset gallery to initial state\r\n */\r\n reset(): void {\r\n this.setState(defaultState);\r\n }\r\n\r\n /**\r\n * Destroy gallery\r\n */\r\n destroy(): void {\r\n this._state.complete();\r\n this._config.complete();\r\n this.itemClick.complete();\r\n this.thumbClick.complete();\r\n this.deleteInstance();\r\n }\r\n\r\n}\r\n", + "constructorObj": { + "name": "constructor", + "description": "", + "deprecated": false, + "deprecationMessage": "", + "args": [ + { + "name": "config", + "type": "GalleryConfig", + "deprecated": false, + "deprecationMessage": "" + }, + { + "name": "deleteInstance", + "type": "function", + "deprecated": false, + "deprecationMessage": "", + "function": [] + } + ], + "line": 72, + "jsdoctags": [ + { + "name": "config", + "type": "GalleryConfig", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + }, + { + "name": "deleteInstance", + "type": "function", + "deprecated": false, + "deprecationMessage": "", + "function": [], + "tagName": { + "text": "param" + } + } + ] + }, + "properties": [ + { + "name": "_config", + "deprecated": false, + "deprecationMessage": "", + "type": "BehaviorSubject", + "optional": false, + "description": "

                                                                                                                                  Stream that emits gallery config

                                                                                                                                  \n", + "line": 27, + "rawdescription": "\nStream that emits gallery config", + "modifierKind": [ + 121, + 146 + ] + }, + { + "name": "_state", + "deprecated": false, + "deprecationMessage": "", + "type": "BehaviorSubject", + "optional": false, + "description": "

                                                                                                                                  Stream that emits gallery state

                                                                                                                                  \n", + "line": 24, + "rawdescription": "\nStream that emits gallery state", + "modifierKind": [ + 121, + 146 + ] + }, + { + "name": "config", + "deprecated": false, + "deprecationMessage": "", + "type": "Observable", + "optional": false, + "description": "

                                                                                                                                  Stream that emits gallery config

                                                                                                                                  \n", + "line": 44, + "rawdescription": "\nStream that emits gallery config", + "modifierKind": [ + 146 + ] + }, + { + "name": "error", + "defaultValue": "new Subject()", + "deprecated": false, + "deprecationMessage": "", + "type": "Subject", + "optional": false, + "description": "

                                                                                                                                  Stream that emits on an error occurs

                                                                                                                                  \n", + "line": 36, + "rawdescription": "\nStream that emits on an error occurs", + "modifierKind": [ + 146 + ] + }, + { + "name": "itemClick", + "defaultValue": "new Subject()", + "deprecated": false, + "deprecationMessage": "", + "type": "Subject", + "optional": false, + "description": "

                                                                                                                                  Stream that emits on item click

                                                                                                                                  \n", + "line": 30, + "rawdescription": "\nStream that emits on item click", + "modifierKind": [ + 146 + ] + }, + { + "name": "state", + "deprecated": false, + "deprecationMessage": "", + "type": "Observable", + "optional": false, + "description": "

                                                                                                                                  Stream that emits gallery state

                                                                                                                                  \n", + "line": 41, + "rawdescription": "\nStream that emits gallery state", + "modifierKind": [ + 146 + ] + }, + { + "name": "thumbClick", + "defaultValue": "new Subject()", + "deprecated": false, + "deprecationMessage": "", + "type": "Subject", + "optional": false, + "description": "

                                                                                                                                  Stream that emits on thumbnail click

                                                                                                                                  \n", + "line": 33, + "rawdescription": "\nStream that emits on thumbnail click", + "modifierKind": [ + 146 + ] + } + ], + "methods": [ + { + "name": "add", + "args": [ + { + "name": "item", + "type": "GalleryItem", + "deprecated": false, + "deprecationMessage": "" + }, + { + "name": "active", + "type": "boolean", + "deprecated": false, + "deprecationMessage": "", + "optional": true + } + ], + "optional": false, + "returnType": "void", + "typeParameters": [], + "line": 98, + "deprecated": false, + "deprecationMessage": "", + "rawdescription": "\n\nAdd gallery item\n", + "description": "

                                                                                                                                  Add gallery item

                                                                                                                                  \n", + "jsdoctags": [ + { + "name": "item", + "type": "GalleryItem", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + }, + { + "name": "active", + "type": "boolean", + "deprecated": false, + "deprecationMessage": "", + "optional": true, + "tagName": { + "text": "param" + } + } + ] + }, + { + "name": "addIframe", + "args": [ + { + "name": "data", + "type": "IframeItemData", + "deprecated": false, + "deprecationMessage": "" + }, + { + "name": "active", + "type": "boolean", + "deprecated": false, + "deprecationMessage": "", + "optional": true + } + ], + "optional": false, + "returnType": "void", + "typeParameters": [], + "line": 125, + "deprecated": false, + "deprecationMessage": "", + "rawdescription": "\n\nAdd iframe item\n", + "description": "

                                                                                                                                  Add iframe item

                                                                                                                                  \n", + "jsdoctags": [ + { + "name": "data", + "type": "IframeItemData", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + }, + { + "name": "active", + "type": "boolean", + "deprecated": false, + "deprecationMessage": "", + "optional": true, + "tagName": { + "text": "param" + } + } + ] + }, + { + "name": "addImage", + "args": [ + { + "name": "data", + "type": "ImageItemData", + "deprecated": false, + "deprecationMessage": "" + }, + { + "name": "active", + "type": "boolean", + "deprecated": false, + "deprecationMessage": "", + "optional": true + } + ], + "optional": false, + "returnType": "void", + "typeParameters": [], + "line": 111, + "deprecated": false, + "deprecationMessage": "", + "rawdescription": "\n\nAdd image item\n", + "description": "

                                                                                                                                  Add image item

                                                                                                                                  \n", + "jsdoctags": [ + { + "name": "data", + "type": "ImageItemData", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + }, + { + "name": "active", + "type": "boolean", + "deprecated": false, + "deprecationMessage": "", + "optional": true, + "tagName": { + "text": "param" + } + } + ] + }, + { + "name": "addVideo", + "args": [ + { + "name": "data", + "type": "VideoItemData", + "deprecated": false, + "deprecationMessage": "" + }, + { + "name": "active", + "type": "boolean", + "deprecated": false, + "deprecationMessage": "", + "optional": true + } + ], + "optional": false, + "returnType": "void", + "typeParameters": [], + "line": 118, + "deprecated": false, + "deprecationMessage": "", + "rawdescription": "\n\nAdd video item\n", + "description": "

                                                                                                                                  Add video item

                                                                                                                                  \n", + "jsdoctags": [ + { + "name": "data", + "type": "VideoItemData", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + }, + { + "name": "active", + "type": "boolean", + "deprecated": false, + "deprecationMessage": "", + "optional": true, + "tagName": { + "text": "param" + } + } + ] + }, + { + "name": "addYoutube", + "args": [ + { + "name": "data", + "type": "YoutubeItemData", + "deprecated": false, + "deprecationMessage": "" + }, + { + "name": "active", + "type": "boolean", + "deprecated": false, + "deprecationMessage": "", + "optional": true + } + ], + "optional": false, + "returnType": "void", + "typeParameters": [], + "line": 132, + "deprecated": false, + "deprecationMessage": "", + "rawdescription": "\n\nAdd Youtube item\n", + "description": "

                                                                                                                                  Add Youtube item

                                                                                                                                  \n", + "jsdoctags": [ + { + "name": "data", + "type": "YoutubeItemData", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + }, + { + "name": "active", + "type": "boolean", + "deprecated": false, + "deprecationMessage": "", + "optional": true, + "tagName": { + "text": "param" + } + } + ] + }, + { + "name": "destroy", + "args": [], + "optional": false, + "returnType": "void", + "typeParameters": [], + "line": 236, + "deprecated": false, + "deprecationMessage": "", + "rawdescription": "\n\nDestroy gallery\n", + "description": "

                                                                                                                                  Destroy gallery

                                                                                                                                  \n" + }, + { + "name": "load", + "args": [ + { + "name": "items", + "type": "GalleryItem[]", + "deprecated": false, + "deprecationMessage": "" + } + ], + "optional": false, + "returnType": "void", + "typeParameters": [], + "line": 157, + "deprecated": false, + "deprecationMessage": "", + "rawdescription": "\n\nLoad items and reset the state\n", + "description": "

                                                                                                                                  Load items and reset the state

                                                                                                                                  \n", + "jsdoctags": [ + { + "name": "items", + "type": "GalleryItem[]", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + } + ] + }, + { + "name": "next", + "args": [ + { + "name": "behavior", + "type": "ScrollBehavior", + "deprecated": false, + "deprecationMessage": "", + "defaultValue": "this._config.value.scrollBehavior" + }, + { + "name": "loop", + "type": "boolean", + "deprecated": false, + "deprecationMessage": "", + "defaultValue": "true" + } + ], + "optional": false, + "returnType": "void", + "typeParameters": [], + "line": 190, + "deprecated": false, + "deprecationMessage": "", + "rawdescription": "\n\nNext item\n", + "description": "

                                                                                                                                  Next item

                                                                                                                                  \n", + "jsdoctags": [ + { + "name": "behavior", + "type": "ScrollBehavior", + "deprecated": false, + "deprecationMessage": "", + "defaultValue": "this._config.value.scrollBehavior", + "tagName": { + "text": "param" + } + }, + { + "name": "loop", + "type": "boolean", + "deprecated": false, + "deprecationMessage": "", + "defaultValue": "true", + "tagName": { + "text": "param" + } + } + ] + }, + { + "name": "play", + "args": [ + { + "name": "interval", + "type": "number", + "deprecated": false, + "deprecationMessage": "", + "optional": true + } + ], + "optional": false, + "returnType": "void", + "typeParameters": [], + "line": 212, + "deprecated": false, + "deprecationMessage": "", + "rawdescription": "\n\nStart gallery player\n", + "description": "

                                                                                                                                  Start gallery player

                                                                                                                                  \n", + "jsdoctags": [ + { + "name": "interval", + "type": "number", + "deprecated": false, + "deprecationMessage": "", + "optional": true, + "tagName": { + "text": "param" + } + } + ] + }, + { + "name": "prev", + "args": [ + { + "name": "behavior", + "type": "ScrollBehavior", + "deprecated": false, + "deprecationMessage": "", + "defaultValue": "this._config.value.scrollBehavior" + }, + { + "name": "loop", + "type": "boolean", + "deprecated": false, + "deprecationMessage": "", + "defaultValue": "true" + } + ], + "optional": false, + "returnType": "void", + "typeParameters": [], + "line": 201, + "deprecated": false, + "deprecationMessage": "", + "rawdescription": "\n\nPrev item\n", + "description": "

                                                                                                                                  Prev item

                                                                                                                                  \n", + "jsdoctags": [ + { + "name": "behavior", + "type": "ScrollBehavior", + "deprecated": false, + "deprecationMessage": "", + "defaultValue": "this._config.value.scrollBehavior", + "tagName": { + "text": "param" + } + }, + { + "name": "loop", + "type": "boolean", + "deprecated": false, + "deprecationMessage": "", + "defaultValue": "true", + "tagName": { + "text": "param" + } + } + ] + }, + { + "name": "remove", + "args": [ + { + "name": "i", + "type": "number", + "deprecated": false, + "deprecationMessage": "" + } + ], + "optional": false, + "returnType": "void", + "typeParameters": [], + "line": 139, + "deprecated": false, + "deprecationMessage": "", + "rawdescription": "\n\nRemove gallery item\n", + "description": "

                                                                                                                                  Remove gallery item

                                                                                                                                  \n", + "jsdoctags": [ + { + "name": "i", + "type": "number", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + } + ] + }, + { + "name": "reset", + "args": [], + "optional": false, + "returnType": "void", + "typeParameters": [], + "line": 229, + "deprecated": false, + "deprecationMessage": "", + "rawdescription": "\n\nReset gallery to initial state\n", + "description": "

                                                                                                                                  Reset gallery to initial state

                                                                                                                                  \n" + }, + { + "name": "set", + "args": [ + { + "name": "i", + "type": "number", + "deprecated": false, + "deprecationMessage": "" + }, + { + "name": "behavior", + "type": "ScrollBehavior", + "deprecated": false, + "deprecationMessage": "", + "defaultValue": "this._config.value.scrollBehavior" + } + ], + "optional": false, + "returnType": "void", + "typeParameters": [], + "line": 171, + "deprecated": false, + "deprecationMessage": "", + "rawdescription": "\n\nSet active item\n", + "description": "

                                                                                                                                  Set active item

                                                                                                                                  \n", + "jsdoctags": [ + { + "name": "i", + "type": "number", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + }, + { + "name": "behavior", + "type": "ScrollBehavior", + "deprecated": false, + "deprecationMessage": "", + "defaultValue": "this._config.value.scrollBehavior", + "tagName": { + "text": "param" + } + } + ] + }, + { + "name": "setConfig", + "args": [ + { + "name": "config", + "type": "GalleryConfig", + "deprecated": false, + "deprecationMessage": "" + } + ], + "optional": false, + "returnType": "void", + "typeParameters": [], + "line": 91, + "deprecated": false, + "deprecationMessage": "", + "rawdescription": "\n\nSet gallery config\n", + "description": "

                                                                                                                                  Set gallery config

                                                                                                                                  \n", + "jsdoctags": [ + { + "name": "config", + "type": "GalleryConfig", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + } + ] + }, + { + "name": "setState", + "args": [ + { + "name": "state", + "type": "GalleryState", + "deprecated": false, + "deprecationMessage": "" + } + ], + "optional": false, + "returnType": "void", + "typeParameters": [], + "line": 84, + "deprecated": false, + "deprecationMessage": "", + "rawdescription": "\n\nSet gallery state\n", + "description": "

                                                                                                                                  Set gallery state

                                                                                                                                  \n", + "modifierKind": [ + 121 + ], + "jsdoctags": [ + { + "name": "state", + "type": "GalleryState", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + } + ] + }, + { + "name": "stop", + "args": [], + "optional": false, + "returnType": "void", + "typeParameters": [], + "line": 222, + "deprecated": false, + "deprecationMessage": "", + "rawdescription": "\n\nStop gallery player\n", + "description": "

                                                                                                                                  Stop gallery player

                                                                                                                                  \n" + } + ], + "indexSignatures": [], + "accessors": { + "stateSnapshot": { + "name": "stateSnapshot", + "getSignature": { + "name": "stateSnapshot", + "type": "", + "returnType": "GalleryState", + "line": 46 + } + }, + "configSnapshot": { + "name": "configSnapshot", + "getSignature": { + "name": "configSnapshot", + "type": "", + "returnType": "GalleryConfig", + "line": 50 + } + }, + "initialized": { + "name": "initialized", + "getSignature": { + "name": "initialized", + "type": "", + "returnType": "Observable", + "line": 55, + "rawdescription": "\nStream that emits when gallery is initialized/reset", + "description": "

                                                                                                                                  Stream that emits when gallery is initialized/reset

                                                                                                                                  \n" + } + }, + "itemsChanged": { + "name": "itemsChanged", + "getSignature": { + "name": "itemsChanged", + "type": "", + "returnType": "Observable", + "line": 60, + "rawdescription": "\nStream that emits when items is changed (items loaded, item added, item removed)", + "description": "

                                                                                                                                  Stream that emits when items is changed (items loaded, item added, item removed)

                                                                                                                                  \n" + } + }, + "indexChanged": { + "name": "indexChanged", + "getSignature": { + "name": "indexChanged", + "type": "", + "returnType": "Observable", + "line": 65, + "rawdescription": "\nStream that emits when current item is changed", + "description": "

                                                                                                                                  Stream that emits when current item is changed

                                                                                                                                  \n" + } + }, + "playingChanged": { + "name": "playingChanged", + "getSignature": { + "name": "playingChanged", + "type": "", + "returnType": "Observable", + "line": 70, + "rawdescription": "\nStream that emits when the player should start or stop", + "description": "

                                                                                                                                  Stream that emits when the player should start or stop

                                                                                                                                  \n" + } + } + }, + "inputsClass": [], + "outputsClass": [], + "hostBindings": [], + "hostListeners": [] + }, + { + "name": "HorizontalAdapter", + "id": "class-HorizontalAdapter-eb710e0d3b83fd4b491767dfef480d144ffbdd900f8fd7afd235d91c9e823b114bf1d0cabd18feee71238affb19db805a660f75519c5489f4eb969418ec62fe3", + "file": "projects/ng-gallery/src/lib/components/adapters/main-adapters.ts", + "deprecated": false, + "deprecationMessage": "", + "type": "class", + "sourceCode": "import { GalleryConfig } from '../../models/config.model';\r\nimport { SliderAdapter } from './base-adapter';\r\nimport { SmoothScrollOptions } from '../../smooth-scroll';\r\n\r\ndeclare const Hammer: any;\r\n\r\nexport class HorizontalAdapter implements SliderAdapter {\r\n\r\n readonly hammerDirection: number = Hammer?.DIRECTION_HORIZONTAL;\r\n\r\n readonly scrollSnapType: string = 'x mandatory';\r\n\r\n get scrollValue(): number {\r\n return this.slider.scrollLeft;\r\n }\r\n\r\n get clientSize(): number {\r\n return this.slider.clientWidth;\r\n }\r\n\r\n get isContentLessThanContainer(): boolean {\r\n return this.clientSize >= this.slider.firstElementChild.clientWidth;\r\n }\r\n\r\n constructor(public slider: HTMLElement, public config: GalleryConfig) {\r\n }\r\n\r\n getScrollToValue(el: HTMLElement, behavior: ScrollBehavior): SmoothScrollOptions {\r\n const position: number = el.offsetLeft - ((this.clientSize - el.clientWidth) / 2);\r\n return {\r\n behavior,\r\n start: position\r\n };\r\n }\r\n\r\n getRootMargin(): string {\r\n return `1000px 1px 1000px 1px`;\r\n }\r\n\r\n getElementRootMargin(viewport: HTMLElement, el: HTMLElement): string {\r\n const rootMargin: number = -1 * ((viewport.clientWidth - el.clientWidth) / 2) + 1;\r\n return `0px ${ rootMargin }px 0px ${ rootMargin }px`;\r\n }\r\n\r\n getCentralizerStartSize(): number {\r\n if (this.isContentLessThanContainer) {\r\n const size: number = this.clientSize - this.slider.firstElementChild.clientWidth;\r\n return size / 2;\r\n }\r\n return (this.clientSize / 2) - (this.slider.firstElementChild.firstElementChild?.clientWidth / 2);\r\n }\r\n\r\n getCentralizerEndSize(): number {\r\n if (this.isContentLessThanContainer) {\r\n const size: number = this.clientSize - this.slider.firstElementChild.clientWidth;\r\n return size / 2;\r\n }\r\n return (this.clientSize / 2) - (this.slider.firstElementChild.lastElementChild?.clientWidth / 2);\r\n }\r\n\r\n getHammerVelocity(e: any): number {\r\n return e.velocityX;\r\n }\r\n\r\n getHammerValue(value: number, e: any, behavior: ScrollBehavior): ScrollToOptions {\r\n return {\r\n behavior,\r\n left: value - e.deltaX\r\n };\r\n }\r\n\r\n // getDraggingProperty(e: MouseEvent): number {\r\n // return e.clientX;\r\n // }\r\n\r\n // getDraggingValue(value: number, delta: number, behavior: ScrollBehavior): ScrollToOptions {\r\n // return {\r\n // behavior,\r\n // left: value - delta\r\n // };\r\n // }\r\n}\r\n\r\nexport class VerticalAdapter implements SliderAdapter {\r\n\r\n readonly hammerDirection: number = Hammer?.DIRECTION_VERTICAL;\r\n\r\n readonly scrollSnapType: string = 'y mandatory';\r\n\r\n get scrollValue(): number {\r\n return this.slider.scrollTop;\r\n }\r\n\r\n get clientSize(): number {\r\n return this.slider.clientHeight;\r\n }\r\n\r\n get isContentLessThanContainer(): boolean {\r\n return this.clientSize >= this.slider.firstElementChild.clientHeight;\r\n }\r\n\r\n constructor(public slider: HTMLElement, public config: GalleryConfig) {\r\n }\r\n\r\n getScrollToValue(el: HTMLElement, behavior: ScrollBehavior): SmoothScrollOptions {\r\n const position: number = el.offsetTop - ((this.clientSize - el.clientHeight) / 2);\r\n return {\r\n behavior,\r\n top: position\r\n };\r\n }\r\n\r\n getRootMargin(): string {\r\n return `1px 1000px 1px 1000px`;\r\n }\r\n\r\n getElementRootMargin(viewport: HTMLElement, el: HTMLElement): string {\r\n const rootMargin: number = -1 * ((viewport.clientHeight - el.clientHeight) / 2) + 1;\r\n return `${ rootMargin }px 0px ${ rootMargin }px 0px`;\r\n }\r\n\r\n getCentralizerStartSize(): number {\r\n if (this.isContentLessThanContainer) {\r\n const size = this.clientSize - this.slider.firstElementChild.clientHeight;\r\n return size / 2;\r\n }\r\n return (this.clientSize / 2) - (this.slider.firstElementChild.firstElementChild?.clientHeight / 2);\r\n }\r\n\r\n getCentralizerEndSize(): number {\r\n if (this.isContentLessThanContainer) {\r\n const size = this.clientSize - this.slider.firstElementChild.clientHeight;\r\n return size / 2;\r\n }\r\n return (this.clientSize / 2) - (this.slider.firstElementChild.lastElementChild?.clientHeight / 2);\r\n }\r\n\r\n getHammerVelocity(e: any): number {\r\n return e.velocityY;\r\n }\r\n\r\n getHammerValue(value: number, e: any, behavior: ScrollBehavior): ScrollToOptions {\r\n return {\r\n behavior,\r\n top: value - e.deltaY\r\n };\r\n }\r\n\r\n // getDraggingProperty(e: MouseEvent): number {\r\n // return e.clientY;\r\n // }\r\n\r\n // getDraggingValue(value: number, delta: number, behavior: ScrollBehavior): ScrollToOptions {\r\n // return {\r\n // behavior,\r\n // top: value - delta\r\n // };\r\n // }\r\n}\r\n", + "constructorObj": { + "name": "constructor", + "description": "", + "deprecated": false, + "deprecationMessage": "", + "args": [ + { + "name": "slider", + "type": "HTMLElement", + "deprecated": false, + "deprecationMessage": "" + }, + { + "name": "config", + "type": "GalleryConfig", + "deprecated": false, + "deprecationMessage": "" + } + ], + "line": 23, + "jsdoctags": [ + { + "name": "slider", + "type": "HTMLElement", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + }, + { + "name": "config", + "type": "GalleryConfig", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + } + ] + }, + "properties": [ + { + "name": "config", + "deprecated": false, + "deprecationMessage": "", + "type": "GalleryConfig", + "optional": false, + "description": "", + "line": 25, + "modifierKind": [ + 123 + ] + }, + { + "name": "hammerDirection", + "defaultValue": "Hammer?.DIRECTION_HORIZONTAL", + "deprecated": false, + "deprecationMessage": "", + "type": "number", + "optional": false, + "description": "", + "line": 9, + "modifierKind": [ + 146 + ] + }, + { + "name": "scrollSnapType", + "defaultValue": "'x mandatory'", + "deprecated": false, + "deprecationMessage": "", + "type": "string", + "optional": false, + "description": "", + "line": 11, + "modifierKind": [ + 146 + ] + }, + { + "name": "slider", + "deprecated": false, + "deprecationMessage": "", + "type": "HTMLElement", + "optional": false, + "description": "", + "line": 25, + "modifierKind": [ + 123 + ] + } + ], + "methods": [ + { + "name": "getCentralizerEndSize", + "args": [], + "optional": false, + "returnType": "number", + "typeParameters": [], + "line": 53, + "deprecated": false, + "deprecationMessage": "" + }, + { + "name": "getCentralizerStartSize", + "args": [], + "optional": false, + "returnType": "number", + "typeParameters": [], + "line": 45, + "deprecated": false, + "deprecationMessage": "" + }, + { + "name": "getElementRootMargin", + "args": [ + { + "name": "viewport", + "type": "HTMLElement", + "deprecated": false, + "deprecationMessage": "" + }, + { + "name": "el", + "type": "HTMLElement", + "deprecated": false, + "deprecationMessage": "" + } + ], + "optional": false, + "returnType": "string", + "typeParameters": [], + "line": 40, + "deprecated": false, + "deprecationMessage": "", + "jsdoctags": [ + { + "name": "viewport", + "type": "HTMLElement", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + }, + { + "name": "el", + "type": "HTMLElement", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + } + ] + }, + { + "name": "getHammerValue", + "args": [ + { + "name": "value", + "type": "number", + "deprecated": false, + "deprecationMessage": "" + }, + { + "name": "e", + "type": "any", + "deprecated": false, + "deprecationMessage": "" + }, + { + "name": "behavior", + "type": "ScrollBehavior", + "deprecated": false, + "deprecationMessage": "" + } + ], + "optional": false, + "returnType": "ScrollToOptions", + "typeParameters": [], + "line": 65, + "deprecated": false, + "deprecationMessage": "", + "jsdoctags": [ + { + "name": "value", + "type": "number", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + }, + { + "name": "e", + "type": "any", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + }, + { + "name": "behavior", + "type": "ScrollBehavior", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + } + ] + }, + { + "name": "getHammerVelocity", + "args": [ + { + "name": "e", + "type": "any", + "deprecated": false, + "deprecationMessage": "" + } + ], + "optional": false, + "returnType": "number", + "typeParameters": [], + "line": 61, + "deprecated": false, + "deprecationMessage": "", + "jsdoctags": [ + { + "name": "e", + "type": "any", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + } + ] + }, + { + "name": "getRootMargin", + "args": [], + "optional": false, + "returnType": "string", + "typeParameters": [], + "line": 36, + "deprecated": false, + "deprecationMessage": "" + }, + { + "name": "getScrollToValue", + "args": [ + { + "name": "el", + "type": "HTMLElement", + "deprecated": false, + "deprecationMessage": "" + }, + { + "name": "behavior", + "type": "ScrollBehavior", + "deprecated": false, + "deprecationMessage": "" + } + ], + "optional": false, + "returnType": "SmoothScrollOptions", + "typeParameters": [], + "line": 28, + "deprecated": false, + "deprecationMessage": "", + "jsdoctags": [ + { + "name": "el", + "type": "HTMLElement", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + }, + { + "name": "behavior", + "type": "ScrollBehavior", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + } + ] + } + ], + "indexSignatures": [], + "accessors": { + "scrollValue": { + "name": "scrollValue", + "getSignature": { + "name": "scrollValue", + "type": "number", + "returnType": "number", + "line": 13 + } + }, + "clientSize": { + "name": "clientSize", + "getSignature": { + "name": "clientSize", + "type": "number", + "returnType": "number", + "line": 17 + } + }, + "isContentLessThanContainer": { + "name": "isContentLessThanContainer", + "getSignature": { + "name": "isContentLessThanContainer", + "type": "boolean", + "returnType": "boolean", + "line": 21 + } + } + }, + "inputsClass": [], + "outputsClass": [], + "hostBindings": [], + "hostListeners": [], + "implements": [ + "SliderAdapter" + ] + }, + { + "name": "IframeItem", + "id": "class-IframeItem-34d4be651a4e6f718dde28f397ec99c82360d81641da65c47a5499e3490da86d487d6fffea17cd93fbe36c8452006119cbc339e396218d25a91dedb22a7e837b", + "file": "projects/ng-gallery/src/lib/components/templates/items.model.ts", + "deprecated": false, + "deprecationMessage": "", + "type": "class", + "sourceCode": "import { GalleryItem } from '../../models/gallery.model';\r\nimport { GalleryItemType, GalleryItemTypes } from '../../models/constants';\r\n\r\nexport class ImageItem implements GalleryItem {\r\n readonly type: GalleryItemType;\r\n readonly data: ImageItemData;\r\n\r\n constructor(data: ImageItemData) {\r\n this.data = data;\r\n this.type = GalleryItemTypes.Image;\r\n }\r\n}\r\n\r\nexport class VideoItem implements GalleryItem {\r\n readonly type: GalleryItemType;\r\n readonly data: VideoItemData;\r\n\r\n constructor(data: VideoItemData) {\r\n this.data = data;\r\n this.type = GalleryItemTypes.Video;\r\n }\r\n}\r\n\r\nexport class IframeItem implements GalleryItem {\r\n readonly type: GalleryItemType;\r\n readonly data: IframeItemData;\r\n\r\n constructor(data: IframeItemData) {\r\n this.data = data;\r\n this.type = GalleryItemTypes.Iframe;\r\n }\r\n}\r\n\r\nexport class YoutubeItem implements GalleryItem {\r\n readonly type: GalleryItemType;\r\n readonly data: YoutubeItemData;\r\n\r\n constructor(data: YoutubeItemData) {\r\n this.data = {\r\n ...data,\r\n ...{\r\n src: `https://youtube.com/embed/${ data.src }`,\r\n thumb: data.thumb ? data.thumb : `//img.youtube.com/vi/${ data.src }/default.jpg`\r\n }\r\n };\r\n this.type = GalleryItemTypes.Youtube;\r\n }\r\n}\r\n\r\ntype GalleryItemModel = {\r\n type?: GalleryItemType;\r\n src?: string | { url: string, type: string }[];\r\n thumb?: string;\r\n args?: any;\r\n};\r\n\r\nexport type ImageItemData = GalleryItemModel & {\r\n alt?: string;\r\n};\r\n\r\nexport type IframeItemData = GalleryItemModel & {\r\n params?: any;\r\n};\r\n\r\nexport type YoutubeItemData = IframeItemData & {\r\n autoplay?: boolean;\r\n};\r\n\r\nexport type VideoItemData = GalleryItemModel & {\r\n poster?: string;\r\n loop?: boolean;\r\n // The only option for boolean video attributes is 'true', because false will still be evaluated to true in attributes binding\r\n mute?: true;\r\n disablePictureInPicture?: true;\r\n controls?: boolean;\r\n autoplay?: boolean;\r\n preload?: 'none' | 'metadata' | 'auto' | '';\r\n controlsList?: 'nodownload' | 'nofullscreen' | 'noremoteplayback';\r\n disableRemotePlayback?: boolean;\r\n};\r\n\r\nexport type GalleryItemData = ImageItemData | VideoItemData | IframeItemData | YoutubeItemData;\r\n\r\nexport type ItemState = 'success' | 'loading' | 'failed';\r\n", + "constructorObj": { + "name": "constructor", + "description": "", + "deprecated": false, + "deprecationMessage": "", + "args": [ + { + "name": "data", + "type": "IframeItemData", + "deprecated": false, + "deprecationMessage": "" + } + ], + "line": 26, + "jsdoctags": [ + { + "name": "data", + "type": "IframeItemData", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + } + ] + }, + "properties": [ + { + "name": "data", + "deprecated": false, + "deprecationMessage": "", + "type": "IframeItemData", + "optional": false, + "description": "", + "line": 26, + "modifierKind": [ + 146 + ] + }, + { + "name": "type", + "deprecated": false, + "deprecationMessage": "", + "type": "GalleryItemType", + "optional": false, + "description": "", + "line": 25, + "modifierKind": [ + 146 + ] + } + ], + "methods": [], + "indexSignatures": [], + "inputsClass": [], + "outputsClass": [], + "hostBindings": [], + "hostListeners": [], + "implements": [ + "GalleryItem" + ] + }, + { + "name": "ImageItem", + "id": "class-ImageItem-34d4be651a4e6f718dde28f397ec99c82360d81641da65c47a5499e3490da86d487d6fffea17cd93fbe36c8452006119cbc339e396218d25a91dedb22a7e837b", + "file": "projects/ng-gallery/src/lib/components/templates/items.model.ts", + "deprecated": false, + "deprecationMessage": "", + "type": "class", + "sourceCode": "import { GalleryItem } from '../../models/gallery.model';\r\nimport { GalleryItemType, GalleryItemTypes } from '../../models/constants';\r\n\r\nexport class ImageItem implements GalleryItem {\r\n readonly type: GalleryItemType;\r\n readonly data: ImageItemData;\r\n\r\n constructor(data: ImageItemData) {\r\n this.data = data;\r\n this.type = GalleryItemTypes.Image;\r\n }\r\n}\r\n\r\nexport class VideoItem implements GalleryItem {\r\n readonly type: GalleryItemType;\r\n readonly data: VideoItemData;\r\n\r\n constructor(data: VideoItemData) {\r\n this.data = data;\r\n this.type = GalleryItemTypes.Video;\r\n }\r\n}\r\n\r\nexport class IframeItem implements GalleryItem {\r\n readonly type: GalleryItemType;\r\n readonly data: IframeItemData;\r\n\r\n constructor(data: IframeItemData) {\r\n this.data = data;\r\n this.type = GalleryItemTypes.Iframe;\r\n }\r\n}\r\n\r\nexport class YoutubeItem implements GalleryItem {\r\n readonly type: GalleryItemType;\r\n readonly data: YoutubeItemData;\r\n\r\n constructor(data: YoutubeItemData) {\r\n this.data = {\r\n ...data,\r\n ...{\r\n src: `https://youtube.com/embed/${ data.src }`,\r\n thumb: data.thumb ? data.thumb : `//img.youtube.com/vi/${ data.src }/default.jpg`\r\n }\r\n };\r\n this.type = GalleryItemTypes.Youtube;\r\n }\r\n}\r\n\r\ntype GalleryItemModel = {\r\n type?: GalleryItemType;\r\n src?: string | { url: string, type: string }[];\r\n thumb?: string;\r\n args?: any;\r\n};\r\n\r\nexport type ImageItemData = GalleryItemModel & {\r\n alt?: string;\r\n};\r\n\r\nexport type IframeItemData = GalleryItemModel & {\r\n params?: any;\r\n};\r\n\r\nexport type YoutubeItemData = IframeItemData & {\r\n autoplay?: boolean;\r\n};\r\n\r\nexport type VideoItemData = GalleryItemModel & {\r\n poster?: string;\r\n loop?: boolean;\r\n // The only option for boolean video attributes is 'true', because false will still be evaluated to true in attributes binding\r\n mute?: true;\r\n disablePictureInPicture?: true;\r\n controls?: boolean;\r\n autoplay?: boolean;\r\n preload?: 'none' | 'metadata' | 'auto' | '';\r\n controlsList?: 'nodownload' | 'nofullscreen' | 'noremoteplayback';\r\n disableRemotePlayback?: boolean;\r\n};\r\n\r\nexport type GalleryItemData = ImageItemData | VideoItemData | IframeItemData | YoutubeItemData;\r\n\r\nexport type ItemState = 'success' | 'loading' | 'failed';\r\n", + "constructorObj": { + "name": "constructor", + "description": "", + "deprecated": false, + "deprecationMessage": "", + "args": [ + { + "name": "data", + "type": "ImageItemData", + "deprecated": false, + "deprecationMessage": "" + } + ], + "line": 6, + "jsdoctags": [ + { + "name": "data", + "type": "ImageItemData", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + } + ] + }, + "properties": [ + { + "name": "data", + "deprecated": false, + "deprecationMessage": "", + "type": "ImageItemData", + "optional": false, + "description": "", + "line": 6, + "modifierKind": [ + 146 + ] + }, + { + "name": "type", + "deprecated": false, + "deprecationMessage": "", + "type": "GalleryItemType", + "optional": false, + "description": "", + "line": 5, + "modifierKind": [ + 146 + ] + } + ], + "methods": [], + "indexSignatures": [], + "inputsClass": [], + "outputsClass": [], + "hostBindings": [], + "hostListeners": [], + "implements": [ + "GalleryItem" + ] + }, + { + "name": "SliderAdapter", + "id": "class-SliderAdapter-ea6462dbf17682e1faf5e410cb58035c08652806b5846d639d21f0eee660d97a47244af46d5fc39dce6cdb8040b9bc4b6e221faa6d764716fd505e3fb8219a0e", + "file": "projects/ng-gallery/src/lib/components/adapters/base-adapter.ts", + "deprecated": false, + "deprecationMessage": "", + "type": "class", + "sourceCode": "export abstract class SliderAdapter {\r\n\r\n readonly abstract hammerDirection: number;\r\n\r\n readonly abstract scrollSnapType: string;\r\n\r\n abstract get scrollValue(): number;\r\n\r\n abstract get clientSize(): number;\r\n\r\n abstract get isContentLessThanContainer(): boolean;\r\n\r\n abstract getScrollToValue(el: Element, behavior: ScrollBehavior): ScrollToOptions;\r\n\r\n abstract getCentralizerStartSize(): number;\r\n\r\n abstract getCentralizerEndSize(): number;\r\n\r\n abstract getRootMargin(): string;\r\n\r\n abstract getElementRootMargin(viewport: HTMLElement, el: HTMLElement): string;\r\n\r\n abstract getHammerVelocity(e): number;\r\n\r\n abstract getHammerValue(value: number, delta: number, behavior: ScrollBehavior): ScrollToOptions;\r\n\r\n // abstract getDraggingValue(value: number, delta: number, behavior: ScrollBehavior): ScrollToOptions;\r\n\r\n // abstract getDraggingProperty(e: MouseEvent): number;\r\n}\r\n", + "properties": [ + { + "name": "hammerDirection", + "deprecated": false, + "deprecationMessage": "", + "type": "number", + "optional": false, + "description": "", + "line": 3, + "modifierKind": [ + 146, + 126 + ] + }, + { + "name": "scrollSnapType", + "deprecated": false, + "deprecationMessage": "", + "type": "string", + "optional": false, + "description": "", + "line": 5, + "modifierKind": [ + 146, + 126 + ] + } + ], + "methods": [ + { + "name": "getCentralizerEndSize", + "args": [], + "optional": false, + "returnType": "number", + "typeParameters": [], + "line": 17, + "deprecated": false, + "deprecationMessage": "", + "modifierKind": [ + 126 + ] + }, + { + "name": "getCentralizerStartSize", + "args": [], + "optional": false, + "returnType": "number", + "typeParameters": [], + "line": 15, + "deprecated": false, + "deprecationMessage": "", + "modifierKind": [ + 126 + ] + }, + { + "name": "getElementRootMargin", + "args": [ + { + "name": "viewport", + "type": "HTMLElement", + "deprecated": false, + "deprecationMessage": "" + }, + { + "name": "el", + "type": "HTMLElement", + "deprecated": false, + "deprecationMessage": "" + } + ], + "optional": false, + "returnType": "string", + "typeParameters": [], + "line": 21, + "deprecated": false, + "deprecationMessage": "", + "modifierKind": [ + 126 + ], + "jsdoctags": [ + { + "name": "viewport", + "type": "HTMLElement", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + }, + { + "name": "el", + "type": "HTMLElement", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + } + ] + }, + { + "name": "getHammerValue", + "args": [ + { + "name": "value", + "type": "number", + "deprecated": false, + "deprecationMessage": "" + }, + { + "name": "delta", + "type": "number", + "deprecated": false, + "deprecationMessage": "" + }, + { + "name": "behavior", + "type": "ScrollBehavior", + "deprecated": false, + "deprecationMessage": "" + } + ], + "optional": false, + "returnType": "ScrollToOptions", + "typeParameters": [], + "line": 25, + "deprecated": false, + "deprecationMessage": "", + "modifierKind": [ + 126 + ], + "jsdoctags": [ + { + "name": "value", + "type": "number", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + }, + { + "name": "delta", + "type": "number", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + }, + { + "name": "behavior", + "type": "ScrollBehavior", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + } + ] + }, + { + "name": "getHammerVelocity", + "args": [ + { + "name": "e", + "type": "", + "deprecated": false, + "deprecationMessage": "" + } + ], + "optional": false, + "returnType": "number", + "typeParameters": [], + "line": 23, + "deprecated": false, + "deprecationMessage": "", + "modifierKind": [ + 126 + ], + "jsdoctags": [ + { + "name": "e", + "type": "", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + } + ] + }, + { + "name": "getRootMargin", + "args": [], + "optional": false, + "returnType": "string", + "typeParameters": [], + "line": 19, + "deprecated": false, + "deprecationMessage": "", + "modifierKind": [ + 126 + ] + }, + { + "name": "getScrollToValue", + "args": [ + { + "name": "el", + "type": "Element", + "deprecated": false, + "deprecationMessage": "" + }, + { + "name": "behavior", + "type": "ScrollBehavior", + "deprecated": false, + "deprecationMessage": "" + } + ], + "optional": false, + "returnType": "ScrollToOptions", + "typeParameters": [], + "line": 13, + "deprecated": false, + "deprecationMessage": "", + "modifierKind": [ + 126 + ], + "jsdoctags": [ + { + "name": "el", + "type": "Element", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + }, + { + "name": "behavior", + "type": "ScrollBehavior", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + } + ] + } + ], + "indexSignatures": [], + "accessors": { + "scrollValue": { + "name": "scrollValue", + "getSignature": { + "name": "scrollValue", + "type": "number", + "returnType": "number", + "line": 7 + } + }, + "clientSize": { + "name": "clientSize", + "getSignature": { + "name": "clientSize", + "type": "number", + "returnType": "number", + "line": 9 + } + }, + "isContentLessThanContainer": { + "name": "isContentLessThanContainer", + "getSignature": { + "name": "isContentLessThanContainer", + "type": "boolean", + "returnType": "boolean", + "line": 11 + } + } + }, + "inputsClass": [], + "outputsClass": [], + "hostBindings": [], + "hostListeners": [] + }, + { + "name": "VerticalAdapter", + "id": "class-VerticalAdapter-eb710e0d3b83fd4b491767dfef480d144ffbdd900f8fd7afd235d91c9e823b114bf1d0cabd18feee71238affb19db805a660f75519c5489f4eb969418ec62fe3", + "file": "projects/ng-gallery/src/lib/components/adapters/main-adapters.ts", + "deprecated": false, + "deprecationMessage": "", + "type": "class", + "sourceCode": "import { GalleryConfig } from '../../models/config.model';\r\nimport { SliderAdapter } from './base-adapter';\r\nimport { SmoothScrollOptions } from '../../smooth-scroll';\r\n\r\ndeclare const Hammer: any;\r\n\r\nexport class HorizontalAdapter implements SliderAdapter {\r\n\r\n readonly hammerDirection: number = Hammer?.DIRECTION_HORIZONTAL;\r\n\r\n readonly scrollSnapType: string = 'x mandatory';\r\n\r\n get scrollValue(): number {\r\n return this.slider.scrollLeft;\r\n }\r\n\r\n get clientSize(): number {\r\n return this.slider.clientWidth;\r\n }\r\n\r\n get isContentLessThanContainer(): boolean {\r\n return this.clientSize >= this.slider.firstElementChild.clientWidth;\r\n }\r\n\r\n constructor(public slider: HTMLElement, public config: GalleryConfig) {\r\n }\r\n\r\n getScrollToValue(el: HTMLElement, behavior: ScrollBehavior): SmoothScrollOptions {\r\n const position: number = el.offsetLeft - ((this.clientSize - el.clientWidth) / 2);\r\n return {\r\n behavior,\r\n start: position\r\n };\r\n }\r\n\r\n getRootMargin(): string {\r\n return `1000px 1px 1000px 1px`;\r\n }\r\n\r\n getElementRootMargin(viewport: HTMLElement, el: HTMLElement): string {\r\n const rootMargin: number = -1 * ((viewport.clientWidth - el.clientWidth) / 2) + 1;\r\n return `0px ${ rootMargin }px 0px ${ rootMargin }px`;\r\n }\r\n\r\n getCentralizerStartSize(): number {\r\n if (this.isContentLessThanContainer) {\r\n const size: number = this.clientSize - this.slider.firstElementChild.clientWidth;\r\n return size / 2;\r\n }\r\n return (this.clientSize / 2) - (this.slider.firstElementChild.firstElementChild?.clientWidth / 2);\r\n }\r\n\r\n getCentralizerEndSize(): number {\r\n if (this.isContentLessThanContainer) {\r\n const size: number = this.clientSize - this.slider.firstElementChild.clientWidth;\r\n return size / 2;\r\n }\r\n return (this.clientSize / 2) - (this.slider.firstElementChild.lastElementChild?.clientWidth / 2);\r\n }\r\n\r\n getHammerVelocity(e: any): number {\r\n return e.velocityX;\r\n }\r\n\r\n getHammerValue(value: number, e: any, behavior: ScrollBehavior): ScrollToOptions {\r\n return {\r\n behavior,\r\n left: value - e.deltaX\r\n };\r\n }\r\n\r\n // getDraggingProperty(e: MouseEvent): number {\r\n // return e.clientX;\r\n // }\r\n\r\n // getDraggingValue(value: number, delta: number, behavior: ScrollBehavior): ScrollToOptions {\r\n // return {\r\n // behavior,\r\n // left: value - delta\r\n // };\r\n // }\r\n}\r\n\r\nexport class VerticalAdapter implements SliderAdapter {\r\n\r\n readonly hammerDirection: number = Hammer?.DIRECTION_VERTICAL;\r\n\r\n readonly scrollSnapType: string = 'y mandatory';\r\n\r\n get scrollValue(): number {\r\n return this.slider.scrollTop;\r\n }\r\n\r\n get clientSize(): number {\r\n return this.slider.clientHeight;\r\n }\r\n\r\n get isContentLessThanContainer(): boolean {\r\n return this.clientSize >= this.slider.firstElementChild.clientHeight;\r\n }\r\n\r\n constructor(public slider: HTMLElement, public config: GalleryConfig) {\r\n }\r\n\r\n getScrollToValue(el: HTMLElement, behavior: ScrollBehavior): SmoothScrollOptions {\r\n const position: number = el.offsetTop - ((this.clientSize - el.clientHeight) / 2);\r\n return {\r\n behavior,\r\n top: position\r\n };\r\n }\r\n\r\n getRootMargin(): string {\r\n return `1px 1000px 1px 1000px`;\r\n }\r\n\r\n getElementRootMargin(viewport: HTMLElement, el: HTMLElement): string {\r\n const rootMargin: number = -1 * ((viewport.clientHeight - el.clientHeight) / 2) + 1;\r\n return `${ rootMargin }px 0px ${ rootMargin }px 0px`;\r\n }\r\n\r\n getCentralizerStartSize(): number {\r\n if (this.isContentLessThanContainer) {\r\n const size = this.clientSize - this.slider.firstElementChild.clientHeight;\r\n return size / 2;\r\n }\r\n return (this.clientSize / 2) - (this.slider.firstElementChild.firstElementChild?.clientHeight / 2);\r\n }\r\n\r\n getCentralizerEndSize(): number {\r\n if (this.isContentLessThanContainer) {\r\n const size = this.clientSize - this.slider.firstElementChild.clientHeight;\r\n return size / 2;\r\n }\r\n return (this.clientSize / 2) - (this.slider.firstElementChild.lastElementChild?.clientHeight / 2);\r\n }\r\n\r\n getHammerVelocity(e: any): number {\r\n return e.velocityY;\r\n }\r\n\r\n getHammerValue(value: number, e: any, behavior: ScrollBehavior): ScrollToOptions {\r\n return {\r\n behavior,\r\n top: value - e.deltaY\r\n };\r\n }\r\n\r\n // getDraggingProperty(e: MouseEvent): number {\r\n // return e.clientY;\r\n // }\r\n\r\n // getDraggingValue(value: number, delta: number, behavior: ScrollBehavior): ScrollToOptions {\r\n // return {\r\n // behavior,\r\n // top: value - delta\r\n // };\r\n // }\r\n}\r\n", + "constructorObj": { + "name": "constructor", + "description": "", + "deprecated": false, + "deprecationMessage": "", + "args": [ + { + "name": "slider", + "type": "HTMLElement", + "deprecated": false, + "deprecationMessage": "" + }, + { + "name": "config", + "type": "GalleryConfig", + "deprecated": false, + "deprecationMessage": "" + } + ], + "line": 100, + "jsdoctags": [ + { + "name": "slider", + "type": "HTMLElement", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + }, + { + "name": "config", + "type": "GalleryConfig", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + } + ] + }, + "properties": [ + { + "name": "config", + "deprecated": false, + "deprecationMessage": "", + "type": "GalleryConfig", + "optional": false, + "description": "", + "line": 102, + "modifierKind": [ + 123 + ] + }, + { + "name": "hammerDirection", + "defaultValue": "Hammer?.DIRECTION_VERTICAL", + "deprecated": false, + "deprecationMessage": "", + "type": "number", + "optional": false, + "description": "", + "line": 86, + "modifierKind": [ + 146 + ] + }, + { + "name": "scrollSnapType", + "defaultValue": "'y mandatory'", + "deprecated": false, + "deprecationMessage": "", + "type": "string", + "optional": false, + "description": "", + "line": 88, + "modifierKind": [ + 146 + ] + }, + { + "name": "slider", + "deprecated": false, + "deprecationMessage": "", + "type": "HTMLElement", + "optional": false, + "description": "", + "line": 102, + "modifierKind": [ + 123 + ] + } + ], + "methods": [ + { + "name": "getCentralizerEndSize", + "args": [], + "optional": false, + "returnType": "number", + "typeParameters": [], + "line": 130, + "deprecated": false, + "deprecationMessage": "" + }, + { + "name": "getCentralizerStartSize", + "args": [], + "optional": false, + "returnType": "number", + "typeParameters": [], + "line": 122, + "deprecated": false, + "deprecationMessage": "" + }, + { + "name": "getElementRootMargin", + "args": [ + { + "name": "viewport", + "type": "HTMLElement", + "deprecated": false, + "deprecationMessage": "" + }, + { + "name": "el", + "type": "HTMLElement", + "deprecated": false, + "deprecationMessage": "" + } + ], + "optional": false, + "returnType": "string", + "typeParameters": [], + "line": 117, + "deprecated": false, + "deprecationMessage": "", + "jsdoctags": [ + { + "name": "viewport", + "type": "HTMLElement", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + }, + { + "name": "el", + "type": "HTMLElement", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + } + ] + }, + { + "name": "getHammerValue", + "args": [ + { + "name": "value", + "type": "number", + "deprecated": false, + "deprecationMessage": "" + }, + { + "name": "e", + "type": "any", + "deprecated": false, + "deprecationMessage": "" + }, + { + "name": "behavior", + "type": "ScrollBehavior", + "deprecated": false, + "deprecationMessage": "" + } + ], + "optional": false, + "returnType": "ScrollToOptions", + "typeParameters": [], + "line": 142, + "deprecated": false, + "deprecationMessage": "", + "jsdoctags": [ + { + "name": "value", + "type": "number", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + }, + { + "name": "e", + "type": "any", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + }, + { + "name": "behavior", + "type": "ScrollBehavior", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + } + ] + }, + { + "name": "getHammerVelocity", + "args": [ + { + "name": "e", + "type": "any", + "deprecated": false, + "deprecationMessage": "" + } + ], + "optional": false, + "returnType": "number", + "typeParameters": [], + "line": 138, + "deprecated": false, + "deprecationMessage": "", + "jsdoctags": [ + { + "name": "e", + "type": "any", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + } + ] + }, + { + "name": "getRootMargin", + "args": [], + "optional": false, + "returnType": "string", + "typeParameters": [], + "line": 113, + "deprecated": false, + "deprecationMessage": "" + }, + { + "name": "getScrollToValue", + "args": [ + { + "name": "el", + "type": "HTMLElement", + "deprecated": false, + "deprecationMessage": "" + }, + { + "name": "behavior", + "type": "ScrollBehavior", + "deprecated": false, + "deprecationMessage": "" + } + ], + "optional": false, + "returnType": "SmoothScrollOptions", + "typeParameters": [], + "line": 105, + "deprecated": false, + "deprecationMessage": "", + "jsdoctags": [ + { + "name": "el", + "type": "HTMLElement", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + }, + { + "name": "behavior", + "type": "ScrollBehavior", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + } + ] + } + ], + "indexSignatures": [], + "accessors": { + "scrollValue": { + "name": "scrollValue", + "getSignature": { + "name": "scrollValue", + "type": "number", + "returnType": "number", + "line": 90 + } + }, + "clientSize": { + "name": "clientSize", + "getSignature": { + "name": "clientSize", + "type": "number", + "returnType": "number", + "line": 94 + } + }, + "isContentLessThanContainer": { + "name": "isContentLessThanContainer", + "getSignature": { + "name": "isContentLessThanContainer", + "type": "boolean", + "returnType": "boolean", + "line": 98 + } + } + }, + "inputsClass": [], + "outputsClass": [], + "hostBindings": [], + "hostListeners": [], + "implements": [ + "SliderAdapter" + ] + }, + { + "name": "VideoItem", + "id": "class-VideoItem-34d4be651a4e6f718dde28f397ec99c82360d81641da65c47a5499e3490da86d487d6fffea17cd93fbe36c8452006119cbc339e396218d25a91dedb22a7e837b", + "file": "projects/ng-gallery/src/lib/components/templates/items.model.ts", + "deprecated": false, + "deprecationMessage": "", + "type": "class", + "sourceCode": "import { GalleryItem } from '../../models/gallery.model';\r\nimport { GalleryItemType, GalleryItemTypes } from '../../models/constants';\r\n\r\nexport class ImageItem implements GalleryItem {\r\n readonly type: GalleryItemType;\r\n readonly data: ImageItemData;\r\n\r\n constructor(data: ImageItemData) {\r\n this.data = data;\r\n this.type = GalleryItemTypes.Image;\r\n }\r\n}\r\n\r\nexport class VideoItem implements GalleryItem {\r\n readonly type: GalleryItemType;\r\n readonly data: VideoItemData;\r\n\r\n constructor(data: VideoItemData) {\r\n this.data = data;\r\n this.type = GalleryItemTypes.Video;\r\n }\r\n}\r\n\r\nexport class IframeItem implements GalleryItem {\r\n readonly type: GalleryItemType;\r\n readonly data: IframeItemData;\r\n\r\n constructor(data: IframeItemData) {\r\n this.data = data;\r\n this.type = GalleryItemTypes.Iframe;\r\n }\r\n}\r\n\r\nexport class YoutubeItem implements GalleryItem {\r\n readonly type: GalleryItemType;\r\n readonly data: YoutubeItemData;\r\n\r\n constructor(data: YoutubeItemData) {\r\n this.data = {\r\n ...data,\r\n ...{\r\n src: `https://youtube.com/embed/${ data.src }`,\r\n thumb: data.thumb ? data.thumb : `//img.youtube.com/vi/${ data.src }/default.jpg`\r\n }\r\n };\r\n this.type = GalleryItemTypes.Youtube;\r\n }\r\n}\r\n\r\ntype GalleryItemModel = {\r\n type?: GalleryItemType;\r\n src?: string | { url: string, type: string }[];\r\n thumb?: string;\r\n args?: any;\r\n};\r\n\r\nexport type ImageItemData = GalleryItemModel & {\r\n alt?: string;\r\n};\r\n\r\nexport type IframeItemData = GalleryItemModel & {\r\n params?: any;\r\n};\r\n\r\nexport type YoutubeItemData = IframeItemData & {\r\n autoplay?: boolean;\r\n};\r\n\r\nexport type VideoItemData = GalleryItemModel & {\r\n poster?: string;\r\n loop?: boolean;\r\n // The only option for boolean video attributes is 'true', because false will still be evaluated to true in attributes binding\r\n mute?: true;\r\n disablePictureInPicture?: true;\r\n controls?: boolean;\r\n autoplay?: boolean;\r\n preload?: 'none' | 'metadata' | 'auto' | '';\r\n controlsList?: 'nodownload' | 'nofullscreen' | 'noremoteplayback';\r\n disableRemotePlayback?: boolean;\r\n};\r\n\r\nexport type GalleryItemData = ImageItemData | VideoItemData | IframeItemData | YoutubeItemData;\r\n\r\nexport type ItemState = 'success' | 'loading' | 'failed';\r\n", + "constructorObj": { + "name": "constructor", + "description": "", + "deprecated": false, + "deprecationMessage": "", + "args": [ + { + "name": "data", + "type": "VideoItemData", + "deprecated": false, + "deprecationMessage": "" + } + ], + "line": 16, + "jsdoctags": [ + { + "name": "data", + "type": "VideoItemData", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + } + ] + }, + "properties": [ + { + "name": "data", + "deprecated": false, + "deprecationMessage": "", + "type": "VideoItemData", + "optional": false, + "description": "", + "line": 16, + "modifierKind": [ + 146 + ] + }, + { + "name": "type", + "deprecated": false, + "deprecationMessage": "", + "type": "GalleryItemType", + "optional": false, + "description": "", + "line": 15, + "modifierKind": [ + 146 + ] + } + ], + "methods": [], + "indexSignatures": [], + "inputsClass": [], + "outputsClass": [], + "hostBindings": [], + "hostListeners": [], + "implements": [ + "GalleryItem" + ] + }, + { + "name": "YoutubeItem", + "id": "class-YoutubeItem-34d4be651a4e6f718dde28f397ec99c82360d81641da65c47a5499e3490da86d487d6fffea17cd93fbe36c8452006119cbc339e396218d25a91dedb22a7e837b", + "file": "projects/ng-gallery/src/lib/components/templates/items.model.ts", + "deprecated": false, + "deprecationMessage": "", + "type": "class", + "sourceCode": "import { GalleryItem } from '../../models/gallery.model';\r\nimport { GalleryItemType, GalleryItemTypes } from '../../models/constants';\r\n\r\nexport class ImageItem implements GalleryItem {\r\n readonly type: GalleryItemType;\r\n readonly data: ImageItemData;\r\n\r\n constructor(data: ImageItemData) {\r\n this.data = data;\r\n this.type = GalleryItemTypes.Image;\r\n }\r\n}\r\n\r\nexport class VideoItem implements GalleryItem {\r\n readonly type: GalleryItemType;\r\n readonly data: VideoItemData;\r\n\r\n constructor(data: VideoItemData) {\r\n this.data = data;\r\n this.type = GalleryItemTypes.Video;\r\n }\r\n}\r\n\r\nexport class IframeItem implements GalleryItem {\r\n readonly type: GalleryItemType;\r\n readonly data: IframeItemData;\r\n\r\n constructor(data: IframeItemData) {\r\n this.data = data;\r\n this.type = GalleryItemTypes.Iframe;\r\n }\r\n}\r\n\r\nexport class YoutubeItem implements GalleryItem {\r\n readonly type: GalleryItemType;\r\n readonly data: YoutubeItemData;\r\n\r\n constructor(data: YoutubeItemData) {\r\n this.data = {\r\n ...data,\r\n ...{\r\n src: `https://youtube.com/embed/${ data.src }`,\r\n thumb: data.thumb ? data.thumb : `//img.youtube.com/vi/${ data.src }/default.jpg`\r\n }\r\n };\r\n this.type = GalleryItemTypes.Youtube;\r\n }\r\n}\r\n\r\ntype GalleryItemModel = {\r\n type?: GalleryItemType;\r\n src?: string | { url: string, type: string }[];\r\n thumb?: string;\r\n args?: any;\r\n};\r\n\r\nexport type ImageItemData = GalleryItemModel & {\r\n alt?: string;\r\n};\r\n\r\nexport type IframeItemData = GalleryItemModel & {\r\n params?: any;\r\n};\r\n\r\nexport type YoutubeItemData = IframeItemData & {\r\n autoplay?: boolean;\r\n};\r\n\r\nexport type VideoItemData = GalleryItemModel & {\r\n poster?: string;\r\n loop?: boolean;\r\n // The only option for boolean video attributes is 'true', because false will still be evaluated to true in attributes binding\r\n mute?: true;\r\n disablePictureInPicture?: true;\r\n controls?: boolean;\r\n autoplay?: boolean;\r\n preload?: 'none' | 'metadata' | 'auto' | '';\r\n controlsList?: 'nodownload' | 'nofullscreen' | 'noremoteplayback';\r\n disableRemotePlayback?: boolean;\r\n};\r\n\r\nexport type GalleryItemData = ImageItemData | VideoItemData | IframeItemData | YoutubeItemData;\r\n\r\nexport type ItemState = 'success' | 'loading' | 'failed';\r\n", + "constructorObj": { + "name": "constructor", + "description": "", + "deprecated": false, + "deprecationMessage": "", + "args": [ + { + "name": "data", + "type": "YoutubeItemData", + "deprecated": false, + "deprecationMessage": "" + } + ], + "line": 36, + "jsdoctags": [ + { + "name": "data", + "type": "YoutubeItemData", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + } + ] + }, + "properties": [ + { + "name": "data", + "deprecated": false, + "deprecationMessage": "", + "type": "YoutubeItemData", + "optional": false, + "description": "", + "line": 36, + "modifierKind": [ + 146 + ] + }, + { + "name": "type", + "deprecated": false, + "deprecationMessage": "", + "type": "GalleryItemType", + "optional": false, + "description": "", + "line": 35, + "modifierKind": [ + 146 + ] + } + ], + "methods": [], + "indexSignatures": [], + "inputsClass": [], + "outputsClass": [], + "hostBindings": [], + "hostListeners": [], + "implements": [ + "GalleryItem" + ] + } + ], + "directives": [ + { + "name": "AutoplayDirective", + "id": "directive-AutoplayDirective-4af5917269fb330e83f2fcd8f86865c4d4d199976809347176711bbb3406e1b4bd8c3e81d2a5b0acf44d19904d49b06e8b98cfa68168f5eb655308373ef1edec", + "file": "projects/ng-gallery/src/lib/autoplay/autoplay.directive.ts", + "type": "directive", + "description": "", + "rawdescription": "\n", + "sourceCode": "import { Directive, Input, AfterViewInit, OnChanges, OnDestroy, SimpleChanges } from '@angular/core';\r\nimport { Subscription, delay, of, switchMap, tap, EMPTY } from 'rxjs';\r\nimport { ImgManager } from '../utils/img-manager';\r\nimport { Gallery } from '../services/gallery.service';\r\nimport { GalleryRef } from '../services/gallery-ref';\r\nimport { GalleryState } from '../models/gallery.model';\r\nimport { GalleryConfig } from '../models/config.model';\r\n\r\n@Directive({\r\n selector: 'gallery-core[autoplay]',\r\n standalone: true\r\n})\r\nexport class AutoplayDirective implements AfterViewInit, OnChanges, OnDestroy {\r\n\r\n private _currentSubscription: Subscription;\r\n\r\n private _galleryRef: GalleryRef;\r\n\r\n @Input() config: GalleryConfig;\r\n\r\n @Input() galleryId: string;\r\n\r\n constructor(private _gallery: Gallery, private _imgManager: ImgManager) {\r\n }\r\n\r\n ngAfterViewInit(): void {\r\n this._galleryRef = this._gallery.ref(this.galleryId);\r\n this._subscribe();\r\n if (this.config.autoplay) {\r\n this._galleryRef.play();\r\n }\r\n }\r\n\r\n ngOnChanges(changes: SimpleChanges): void {\r\n if (this._galleryRef && changes.config?.currentValue.autoplay !== changes.config?.previousValue.autoplay) {\r\n this.config.autoplay ? this._galleryRef.play() : this._galleryRef.stop();\r\n }\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this._unsubscribe();\r\n }\r\n\r\n\r\n private _subscribe(): void {\r\n this._unsubscribe();\r\n\r\n this._currentSubscription = this._galleryRef.playingChanged.pipe(\r\n switchMap((state: GalleryState) => {\r\n if (state.isPlaying) {\r\n return this._imgManager.getActiveItem(this._galleryRef.state).pipe(\r\n switchMap(() => of({}).pipe(\r\n delay(this.config.autoplayInterval),\r\n tap(() => {\r\n if (this._galleryRef.stateSnapshot.hasNext) {\r\n this._galleryRef.next(this.config.scrollBehavior);\r\n } else {\r\n this._galleryRef.set(0, this.config.scrollBehavior);\r\n }\r\n })\r\n ))\r\n );\r\n }\r\n return EMPTY;\r\n })\r\n ).subscribe();\r\n }\r\n\r\n private _unsubscribe(): void {\r\n this._currentSubscription?.unsubscribe();\r\n }\r\n}\r\n", + "selector": "gallery-core[autoplay]", + "providers": [], + "hostDirectives": [], + "standalone": true, + "inputsClass": [ + { + "name": "config", + "deprecated": false, + "deprecationMessage": "", + "line": 19, + "type": "GalleryConfig", + "decorators": [] + }, + { + "name": "galleryId", + "deprecated": false, + "deprecationMessage": "", + "line": 21, + "type": "string", + "decorators": [] + } + ], + "outputsClass": [], + "deprecated": false, + "deprecationMessage": "", + "hostBindings": [], + "hostListeners": [], + "propertiesClass": [ + { + "name": "_currentSubscription", + "deprecated": false, + "deprecationMessage": "", + "type": "Subscription", + "optional": false, + "description": "", + "line": 15, + "modifierKind": [ + 121 + ] + }, + { + "name": "_galleryRef", + "deprecated": false, + "deprecationMessage": "", + "type": "GalleryRef", + "optional": false, + "description": "", + "line": 17, + "modifierKind": [ + 121 + ] + } + ], + "methodsClass": [ + { + "name": "_subscribe", + "args": [], + "optional": false, + "returnType": "void", + "typeParameters": [], + "line": 45, + "deprecated": false, + "deprecationMessage": "", + "modifierKind": [ + 121 + ] + }, + { + "name": "_unsubscribe", + "args": [], + "optional": false, + "returnType": "void", + "typeParameters": [], + "line": 69, + "deprecated": false, + "deprecationMessage": "", + "modifierKind": [ + 121 + ] + }, + { + "name": "ngAfterViewInit", + "args": [], + "optional": false, + "returnType": "void", + "typeParameters": [], + "line": 26, + "deprecated": false, + "deprecationMessage": "" + }, + { + "name": "ngOnChanges", + "args": [ + { + "name": "changes", + "type": "SimpleChanges", + "deprecated": false, + "deprecationMessage": "" + } + ], + "optional": false, + "returnType": "void", + "typeParameters": [], + "line": 34, + "deprecated": false, + "deprecationMessage": "", + "jsdoctags": [ + { + "name": "changes", + "type": "SimpleChanges", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + } + ] + }, + { + "name": "ngOnDestroy", + "args": [], + "optional": false, + "returnType": "void", + "typeParameters": [], + "line": 40, + "deprecated": false, + "deprecationMessage": "" + } + ], + "implements": [ + "AfterViewInit", + "OnChanges", + "OnDestroy" + ], + "constructorObj": { + "name": "constructor", + "description": "", + "deprecated": false, + "deprecationMessage": "", + "args": [ + { + "name": "_gallery", + "type": "Gallery", + "deprecated": false, + "deprecationMessage": "" + }, + { + "name": "_imgManager", + "type": "ImgManager", + "deprecated": false, + "deprecationMessage": "" + } + ], + "line": 21, + "jsdoctags": [ + { + "name": "_gallery", + "type": "Gallery", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + }, + { + "name": "_imgManager", + "type": "ImgManager", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + } + ] + } + }, + { + "name": "GalleryBoxDef", + "id": "directive-GalleryBoxDef-dc42fc50e33dfef0b09f6091971bf663a23f56cdc21288a1d462bdbc08634bd1b5b282ac3be9fcd63e7a7bf9dbb0caf078fe0cc1be3b3bee6b6030f88eb947cf", + "file": "projects/ng-gallery/src/lib/directives/gallery-box-def.directive.ts", + "type": "directive", + "description": "", + "rawdescription": "\n", + "sourceCode": "import { Directive, TemplateRef } from '@angular/core';\r\nimport { GalleryState } from '../models/gallery.model';\r\nimport { GalleryConfig } from '../models/config.model';\r\n\r\n\r\n@Directive({\r\n standalone: true,\r\n selector: '[galleryBoxDef]'\r\n})\r\nexport class GalleryBoxDef {\r\n\r\n constructor(public templateRef: TemplateRef) {\r\n }\r\n\r\n // Make sure the template checker knows the type of the context with which the\r\n // template of this directive will be rendered\r\n static ngTemplateContextGuard(\r\n directive: GalleryBoxDef,\r\n context: unknown\r\n ): context is GalleryStateContext {\r\n return true;\r\n }\r\n}\r\n\r\nexport interface GalleryStateContext {\r\n state?: GalleryState;\r\n config?: GalleryConfig;\r\n}\r\n", + "selector": "[galleryBoxDef]", + "providers": [], + "hostDirectives": [], + "standalone": true, + "inputsClass": [], + "outputsClass": [], + "deprecated": false, + "deprecationMessage": "", + "hostBindings": [], + "hostListeners": [], + "propertiesClass": [ + { + "name": "templateRef", + "deprecated": false, + "deprecationMessage": "", + "type": "TemplateRef", + "optional": false, + "description": "", + "line": 12, + "modifierKind": [ + 123 + ] + } + ], + "methodsClass": [ + { + "name": "ngTemplateContextGuard", + "args": [ + { + "name": "directive", + "type": "GalleryBoxDef", + "deprecated": false, + "deprecationMessage": "" + }, + { + "name": "context", + "type": "", + "deprecated": false, + "deprecationMessage": "" + } + ], + "optional": false, + "returnType": "GalleryStateContext", + "typeParameters": [], + "line": 17, + "deprecated": false, + "deprecationMessage": "", + "modifierKind": [ + 124 + ], + "jsdoctags": [ + { + "name": "directive", + "type": "GalleryBoxDef", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + }, + { + "name": "context", + "type": "", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + } + ] + } + ], + "constructorObj": { + "name": "constructor", + "description": "", + "deprecated": false, + "deprecationMessage": "", + "args": [ + { + "name": "templateRef", + "type": "TemplateRef", + "deprecated": false, + "deprecationMessage": "" + } + ], + "line": 10, + "jsdoctags": [ + { + "name": "templateRef", + "type": "TemplateRef", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + } + ] + } + }, + { + "name": "GalleryImageDef", + "id": "directive-GalleryImageDef-ed5ba58045d4decff0e07e755dc0c225ab926051f1c25b914bd812eb0fb9a3969ead4cfbf96f0f1a82b37db87c29887edd98a66211d3949fe201fda6c8006b70", + "file": "projects/ng-gallery/src/lib/directives/gallery-image-def.directive.ts", + "type": "directive", + "description": "", + "rawdescription": "\n", + "sourceCode": "import { Directive, TemplateRef } from '@angular/core';\r\nimport { ImageItemData } from '../components/templates/items.model';\r\nimport { GalleryItemContext } from './gallery-item-def.directive';\r\n\r\n@Directive({\r\n standalone: true,\r\n selector: '[galleryImageDef]'\r\n})\r\nexport class GalleryImageDef {\r\n\r\n constructor(public templateRef: TemplateRef>) {\r\n }\r\n\r\n // Make sure the template checker knows the type of the context with which the\r\n // template of this directive will be rendered\r\n static ngTemplateContextGuard(\r\n directive: GalleryImageDef,\r\n context: unknown\r\n ): context is GalleryItemContext {\r\n return true;\r\n }\r\n}\r\n", + "selector": "[galleryImageDef]", + "providers": [], + "hostDirectives": [], + "standalone": true, + "inputsClass": [], + "outputsClass": [], + "deprecated": false, + "deprecationMessage": "", + "hostBindings": [], + "hostListeners": [], + "propertiesClass": [ + { + "name": "templateRef", + "deprecated": false, + "deprecationMessage": "", + "type": "TemplateRef>", + "optional": false, + "description": "", + "line": 11, + "modifierKind": [ + 123 + ] + } + ], + "methodsClass": [ + { + "name": "ngTemplateContextGuard", + "args": [ + { + "name": "directive", + "type": "GalleryImageDef", + "deprecated": false, + "deprecationMessage": "" + }, + { + "name": "context", + "type": "", + "deprecated": false, + "deprecationMessage": "" + } + ], + "optional": false, + "returnType": "GalleryItemContext", + "typeParameters": [], + "line": 16, + "deprecated": false, + "deprecationMessage": "", + "modifierKind": [ + 124 + ], + "jsdoctags": [ + { + "name": "directive", + "type": "GalleryImageDef", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + }, + { + "name": "context", + "type": "", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + } + ] + } + ], + "constructorObj": { + "name": "constructor", + "description": "", + "deprecated": false, + "deprecationMessage": "", + "args": [ + { + "name": "templateRef", + "type": "TemplateRef>", + "deprecated": false, + "deprecationMessage": "" + } + ], + "line": 9, + "jsdoctags": [ + { + "name": "templateRef", + "type": "TemplateRef>", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + } + ] + } + }, + { + "name": "GalleryItemDef", + "id": "directive-GalleryItemDef-26e1a2a9cd6d60ca99303fc991011e44a915536a91e7fffb302ad20298ea1600095dac2bbb811adb2767e9c07b63f913c60fab3c81fff80a56796b65a8136cba", + "file": "projects/ng-gallery/src/lib/directives/gallery-item-def.directive.ts", + "type": "directive", + "description": "", + "rawdescription": "\n", + "sourceCode": "import { Directive, TemplateRef } from '@angular/core';\r\nimport { GalleryItemData } from '../components/templates/items.model';\r\nimport { GalleryItemType } from '../models/constants';\r\n\r\n@Directive({\r\n standalone: true,\r\n selector: '[galleryItemDef]'\r\n})\r\nexport class GalleryItemDef {\r\n constructor(public templateRef: TemplateRef>) {\r\n }\r\n\r\n // Make sure the template checker knows the type of the context with which the\r\n // template of this directive will be rendered\r\n static ngTemplateContextGuard(\r\n directive: GalleryItemDef,\r\n context: unknown\r\n ): context is GalleryItemContext {\r\n return true;\r\n }\r\n}\r\n\r\nexport interface GalleryItemContext {\r\n /** Data for the row that this cell is located within. */\r\n $implicit?: T;\r\n\r\n /** Index of the item. */\r\n index?: number;\r\n\r\n /** The type of the item. */\r\n type?: GalleryItemType;\r\n\r\n /** True if this item is the active one. */\r\n active?: boolean;\r\n\r\n /** The number of total items. */\r\n count?: number;\r\n\r\n /** True if this item is first. */\r\n first?: boolean;\r\n\r\n /** True if this item is last. */\r\n last?: boolean;\r\n}\r\n", + "selector": "[galleryItemDef]", + "providers": [], + "hostDirectives": [], + "standalone": true, + "inputsClass": [], + "outputsClass": [], + "deprecated": false, + "deprecationMessage": "", + "hostBindings": [], + "hostListeners": [], + "propertiesClass": [ + { + "name": "templateRef", + "deprecated": false, + "deprecationMessage": "", + "type": "TemplateRef>", + "optional": false, + "description": "", + "line": 10, + "modifierKind": [ + 123 + ] + } + ], + "methodsClass": [ + { + "name": "ngTemplateContextGuard", + "args": [ + { + "name": "directive", + "type": "GalleryItemDef", + "deprecated": false, + "deprecationMessage": "" + }, + { + "name": "context", + "type": "", + "deprecated": false, + "deprecationMessage": "" + } + ], + "optional": false, + "returnType": "GalleryItemContext", + "typeParameters": [], + "line": 15, + "deprecated": false, + "deprecationMessage": "", + "modifierKind": [ + 124 + ], + "jsdoctags": [ + { + "name": "directive", + "type": "GalleryItemDef", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + }, + { + "name": "context", + "type": "", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + } + ] + } + ], + "constructorObj": { + "name": "constructor", + "description": "", + "deprecated": false, + "deprecationMessage": "", + "args": [ + { + "name": "templateRef", + "type": "TemplateRef>", + "deprecated": false, + "deprecationMessage": "" + } + ], + "line": 9, + "jsdoctags": [ + { + "name": "templateRef", + "type": "TemplateRef>", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + } + ] + } + }, + { + "name": "GalleryThumbDef", + "id": "directive-GalleryThumbDef-b6a21582967ca97fc62641838641bac7ceab9261c6d740a6cf2fee519d0caf4895136246fe2c47f8e521708a79f78b24ff01d43714a993eec105c40ea6f36666", + "file": "projects/ng-gallery/src/lib/directives/gallery-thumb-def.directive.ts", + "type": "directive", + "description": "", + "rawdescription": "\n", + "sourceCode": "import { Directive, TemplateRef } from '@angular/core';\r\nimport { ImageItemData } from '../components/templates/items.model';\r\nimport { GalleryItemContext } from './gallery-item-def.directive';\r\n\r\n@Directive({\r\n standalone: true,\r\n selector: '[galleryThumbDef]'\r\n})\r\nexport class GalleryThumbDef {\r\n\r\n constructor(public templateRef: TemplateRef>) {\r\n }\r\n // Make sure the template checker knows the type of the context with which the\r\n // template of this directive will be rendered\r\n static ngTemplateContextGuard(\r\n directive: GalleryThumbDef,\r\n context: unknown\r\n ): context is GalleryItemContext {\r\n return true;\r\n }\r\n}\r\n", + "selector": "[galleryThumbDef]", + "providers": [], + "hostDirectives": [], + "standalone": true, + "inputsClass": [], + "outputsClass": [], + "deprecated": false, + "deprecationMessage": "", + "hostBindings": [], + "hostListeners": [], + "propertiesClass": [ + { + "name": "templateRef", + "deprecated": false, + "deprecationMessage": "", + "type": "TemplateRef>", + "optional": false, + "description": "", + "line": 11, + "modifierKind": [ + 123 + ] + } + ], + "methodsClass": [ + { + "name": "ngTemplateContextGuard", + "args": [ + { + "name": "directive", + "type": "GalleryThumbDef", + "deprecated": false, + "deprecationMessage": "" + }, + { + "name": "context", + "type": "", + "deprecated": false, + "deprecationMessage": "" + } + ], + "optional": false, + "returnType": "GalleryItemContext", + "typeParameters": [], + "line": 15, + "deprecated": false, + "deprecationMessage": "", + "modifierKind": [ + 124 + ], + "jsdoctags": [ + { + "name": "directive", + "type": "GalleryThumbDef", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + }, + { + "name": "context", + "type": "", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + } + ] + } + ], + "constructorObj": { + "name": "constructor", + "description": "", + "deprecated": false, + "deprecationMessage": "", + "args": [ + { + "name": "templateRef", + "type": "TemplateRef>", + "deprecated": false, + "deprecationMessage": "" + } + ], + "line": 9, + "jsdoctags": [ + { + "name": "templateRef", + "type": "TemplateRef>", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + } + ] + } + }, + { + "name": "HammerSliding", + "id": "directive-HammerSliding-8e4f574e588240c89e9cb6a7a2e9074c48787b2109fc5d8a6facd287445d7e14e5da8c94ceed35201f55257548d74ea42709b688f2e6ec0a65caa754d6104759", + "file": "projects/ng-gallery/src/lib/gestures/hammer-sliding.directive.ts", + "type": "directive", + "description": "", + "rawdescription": "\n", + "sourceCode": "import {\r\n Directive,\r\n Inject,\r\n Input,\r\n Output,\r\n OnChanges,\r\n OnDestroy,\r\n SimpleChanges,\r\n NgZone,\r\n ElementRef,\r\n EventEmitter\r\n} from '@angular/core';\r\nimport { DOCUMENT } from '@angular/common';\r\nimport { Platform } from '@angular/cdk/platform';\r\nimport { Directionality } from '@angular/cdk/bidi';\r\nimport { SliderAdapter } from '../components/adapters';\r\nimport { GalleryState } from '../models/gallery.model';\r\nimport { GalleryConfig } from '../models/config.model';\r\nimport { Orientation } from '../models/constants';\r\nimport { GalleryItemComponent } from '../components/gallery-item.component';\r\nimport { GalleryThumbComponent } from '../components/gallery-thumb.component';\r\n\r\ndeclare const Hammer: any;\r\n\r\n@Directive({\r\n selector: '[hammerSliding]',\r\n standalone: true\r\n})\r\nexport class HammerSliding implements OnChanges, OnDestroy {\r\n\r\n /** HammerJS instance */\r\n private _hammer: any;\r\n\r\n get _viewport(): HTMLElement {\r\n return this._el.nativeElement;\r\n }\r\n\r\n @Input('hammerSliding') enabled: boolean;\r\n\r\n @Input() galleryId: string;\r\n\r\n @Input() items: GalleryItemComponent[] | GalleryThumbComponent[];\r\n\r\n @Input() adapter: SliderAdapter;\r\n\r\n @Input() state: GalleryState;\r\n\r\n @Input() config: GalleryConfig;\r\n\r\n @Output() activeIndexChange: EventEmitter = new EventEmitter();\r\n\r\n @Output() isSlidingChange: EventEmitter = new EventEmitter();\r\n\r\n constructor(@Inject(DOCUMENT) private _document: Document,\r\n private _el: ElementRef,\r\n private _dir: Directionality,\r\n private _platform: Platform,\r\n private _zone: NgZone) {\r\n }\r\n\r\n\r\n ngOnChanges(changes: SimpleChanges): void {\r\n if (changes.enabled && changes.enabled?.currentValue !== changes.enabled?.previousValue) {\r\n this.enabled ? this._subscribe() : this._unsubscribe();\r\n }\r\n if (!changes.adapter?.firstChange && changes.adapter?.currentValue !== changes.adapter?.previousValue) {\r\n this.enabled ? this._subscribe() : this._unsubscribe();\r\n }\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this._unsubscribe();\r\n }\r\n\r\n private _subscribe(): void {\r\n this._unsubscribe();\r\n\r\n if (!this._platform.ANDROID && !this._platform.IOS && typeof Hammer !== 'undefined') {\r\n this._zone.runOutsideAngular(() => {\r\n\r\n const direction: number = this.adapter.hammerDirection;\r\n this._hammer = new Hammer(this._el.nativeElement, { inputClass: Hammer.MouseInput });\r\n this._hammer.get('pan').set({ direction });\r\n\r\n let offset: number;\r\n\r\n // Set panOffset for sliding on pan start event\r\n this._hammer.on('panstart', () => {\r\n this._zone.run(() => {\r\n this.isSlidingChange.emit(true);\r\n });\r\n\r\n offset = this.adapter.scrollValue;\r\n this._viewport.classList.add('g-sliding');\r\n this._viewport.style.setProperty('--slider-scroll-snap-type', 'none');\r\n });\r\n\r\n this._hammer.on('panmove', (e: any) => this._viewport.scrollTo(this.adapter.getHammerValue(offset, e, 'auto')));\r\n\r\n this._hammer.on('panend', (e: any) => {\r\n this._document.onselectstart = null;\r\n this._viewport.classList.remove('g-sliding');\r\n const index: number = this.getIndexOnMouseUp(e);\r\n\r\n this._zone.run(() => {\r\n this.isSlidingChange.emit(false);\r\n this.activeIndexChange.emit(index);\r\n });\r\n });\r\n });\r\n }\r\n }\r\n\r\n private _unsubscribe(): void {\r\n this._hammer?.destroy();\r\n }\r\n\r\n private getIndexOnMouseUp(e: any): number {\r\n // Check if scrolled item is great enough to navigate\r\n const currElement: Element = this.items[this.state.currIndex].nativeElement;\r\n\r\n // Find the gallery item element in the center elements\r\n const elementAtCenter: Element = this.getElementFromViewportCenter();\r\n\r\n // Check if center item can be taken from element using\r\n if (elementAtCenter && elementAtCenter !== currElement) {\r\n return +elementAtCenter.getAttribute('galleryIndex');\r\n }\r\n\r\n const velocity: number = this.adapter.getHammerVelocity(e);\r\n // Check if velocity is great enough to navigate\r\n if (Math.abs(velocity) > 0.3) {\r\n if (this.config.orientation === Orientation.Horizontal) {\r\n if (velocity > 0) {\r\n return this._dir.value === 'rtl' ? this.state.currIndex + 1 : this.state.currIndex - 1;\r\n }\r\n return this._dir.value === 'rtl' ? this.state.currIndex - 1 : this.state.currIndex + 1;\r\n } else {\r\n return velocity > 0 ? this.state.currIndex - 1 : this.state.currIndex + 1;\r\n }\r\n }\r\n\r\n // Reset position to the current index\r\n return -1;\r\n }\r\n\r\n private getElementFromViewportCenter(): Element {\r\n // Get slider position relative to the document\r\n const sliderRect: DOMRect = this._viewport.getBoundingClientRect();\r\n // Try look for the center item using `elementsFromPoint` function\r\n const centerElements: Element[] = this._document.elementsFromPoint(\r\n sliderRect.x + (sliderRect.width / 2),\r\n sliderRect.y + (sliderRect.height / 2)\r\n );\r\n // Find the gallery item element in the center elements\r\n return centerElements.find((element: Element) => {\r\n return element.getAttribute('galleryId') === this.galleryId;\r\n });\r\n }\r\n}\r\n", + "selector": "[hammerSliding]", + "providers": [], + "hostDirectives": [], + "standalone": true, + "inputsClass": [ + { + "name": "adapter", + "deprecated": false, + "deprecationMessage": "", + "line": 44, + "type": "SliderAdapter", + "decorators": [] + }, + { + "name": "config", + "deprecated": false, + "deprecationMessage": "", + "line": 48, + "type": "GalleryConfig", + "decorators": [] + }, + { + "name": "galleryId", + "deprecated": false, + "deprecationMessage": "", + "line": 40, + "type": "string", + "decorators": [] + }, + { + "name": "hammerSliding", + "deprecated": false, + "deprecationMessage": "", + "line": 38, + "type": "boolean", + "decorators": [] + }, + { + "name": "items", + "deprecated": false, + "deprecationMessage": "", + "line": 42, + "type": "GalleryItemComponent[] | GalleryThumbComponent[]", + "decorators": [] + }, + { + "name": "state", + "deprecated": false, + "deprecationMessage": "", + "line": 46, + "type": "GalleryState", + "decorators": [] + } + ], + "outputsClass": [ + { + "name": "activeIndexChange", + "defaultValue": "new EventEmitter()", + "deprecated": false, + "deprecationMessage": "", + "line": 50, + "type": "EventEmitter" + }, + { + "name": "isSlidingChange", + "defaultValue": "new EventEmitter()", + "deprecated": false, + "deprecationMessage": "", + "line": 52, + "type": "EventEmitter" + } + ], + "deprecated": false, + "deprecationMessage": "", + "hostBindings": [], + "hostListeners": [], + "propertiesClass": [ + { + "name": "_hammer", + "deprecated": false, + "deprecationMessage": "", + "type": "any", + "optional": false, + "description": "

                                                                                                                                  HammerJS instance

                                                                                                                                  \n", + "line": 32, + "rawdescription": "\nHammerJS instance", + "modifierKind": [ + 121 + ] + } + ], + "methodsClass": [ + { + "name": "_subscribe", + "args": [], + "optional": false, + "returnType": "void", + "typeParameters": [], + "line": 75, + "deprecated": false, + "deprecationMessage": "", + "modifierKind": [ + 121 + ] + }, + { + "name": "_unsubscribe", + "args": [], + "optional": false, + "returnType": "void", + "typeParameters": [], + "line": 114, + "deprecated": false, + "deprecationMessage": "", + "modifierKind": [ + 121 + ] + }, + { + "name": "getElementFromViewportCenter", + "args": [], + "optional": false, + "returnType": "Element", + "typeParameters": [], + "line": 147, + "deprecated": false, + "deprecationMessage": "", + "modifierKind": [ + 121 + ] + }, + { + "name": "getIndexOnMouseUp", + "args": [ + { + "name": "e", + "type": "any", + "deprecated": false, + "deprecationMessage": "" + } + ], + "optional": false, + "returnType": "number", + "typeParameters": [], + "line": 118, + "deprecated": false, + "deprecationMessage": "", + "modifierKind": [ + 121 + ], + "jsdoctags": [ + { + "name": "e", + "type": "any", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + } + ] + }, + { + "name": "ngOnChanges", + "args": [ + { + "name": "changes", + "type": "SimpleChanges", + "deprecated": false, + "deprecationMessage": "" + } + ], + "optional": false, + "returnType": "void", + "typeParameters": [], + "line": 62, + "deprecated": false, + "deprecationMessage": "", + "jsdoctags": [ + { + "name": "changes", + "type": "SimpleChanges", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + } + ] + }, + { + "name": "ngOnDestroy", + "args": [], + "optional": false, + "returnType": "void", + "typeParameters": [], + "line": 71, + "deprecated": false, + "deprecationMessage": "" + } + ], + "implements": [ + "OnChanges", + "OnDestroy" + ], + "constructorObj": { + "name": "constructor", + "description": "", + "deprecated": false, + "deprecationMessage": "", + "args": [ + { + "name": "_document", + "type": "Document", + "deprecated": false, + "deprecationMessage": "" + }, + { + "name": "_el", + "type": "ElementRef", + "deprecated": false, + "deprecationMessage": "" + }, + { + "name": "_dir", + "type": "Directionality", + "deprecated": false, + "deprecationMessage": "" + }, + { + "name": "_platform", + "type": "Platform", + "deprecated": false, + "deprecationMessage": "" + }, + { + "name": "_zone", + "type": "NgZone", + "deprecated": false, + "deprecationMessage": "" + } + ], + "line": 52, + "jsdoctags": [ + { + "name": "_document", + "type": "Document", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + }, + { + "name": "_el", + "type": "ElementRef", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + }, + { + "name": "_dir", + "type": "Directionality", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + }, + { + "name": "_platform", + "type": "Platform", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + }, + { + "name": "_zone", + "type": "NgZone", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + } + ] + }, + "accessors": { + "_viewport": { + "name": "_viewport", + "getSignature": { + "name": "_viewport", + "type": "", + "returnType": "HTMLElement", + "line": 34 + } + } + } + }, + { + "name": "ImgRecognizer", + "id": "directive-ImgRecognizer-4c9d5a8c7a08b40e1e9d439399a05aec404513b8e889a789020d8e5175a205f816481633114970e3a3acc2b03986c1cf8e9d84cea50aec93a0147c934632f8ab", + "file": "projects/ng-gallery/src/lib/utils/img-recognizer.ts", + "type": "directive", + "description": "", + "rawdescription": "\n", + "sourceCode": "import { Directive, Input, HostListener, OnInit, OnDestroy, ElementRef } from '@angular/core';\r\nimport { ImgManager } from './img-manager';\r\nimport { GalleryItemComponent } from '../components/gallery-item.component';\r\n\r\n@Directive({\r\n selector: 'img[galleryImage]',\r\n standalone: true\r\n})\r\nexport class ImgRecognizer implements OnInit, OnDestroy {\r\n\r\n @Input('galleryImage') index: number;\r\n\r\n @HostListener('load', ['$event'])\r\n onLoad() {\r\n this.item.state$.next('success');\r\n }\r\n\r\n @HostListener('error', ['$event'])\r\n onError() {\r\n this.item.state$.next('failed');\r\n }\r\n\r\n constructor(private el: ElementRef, private manager: ImgManager, private item: GalleryItemComponent) {\r\n if (item) {\r\n // Mark the gallery-item component as an image item\r\n item.isItemContainImage = true;\r\n } else {\r\n throw new Error('[NgGallery]: galleryImage directive should be only used inside gallery item templates!')\r\n }\r\n }\r\n\r\n ngOnInit(): void {\r\n this.manager.addItem(this.index, {\r\n state: this.item.state$.asObservable(),\r\n target: this.el.nativeElement\r\n });\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.manager.deleteItem(this.index);\r\n }\r\n}\r\n", + "selector": "img[galleryImage]", + "providers": [], + "hostDirectives": [], + "standalone": true, + "inputsClass": [ + { + "name": "galleryImage", + "deprecated": false, + "deprecationMessage": "", + "line": 11, + "type": "number", + "decorators": [] + } + ], + "outputsClass": [], + "deprecated": false, + "deprecationMessage": "", + "hostBindings": [], + "hostListeners": [ + { + "name": "error", + "args": [], + "argsDecorator": [ + "$event" + ], + "deprecated": false, + "deprecationMessage": "", + "line": 19 + }, + { + "name": "load", + "args": [], + "argsDecorator": [ + "$event" + ], + "deprecated": false, + "deprecationMessage": "", + "line": 14 + } + ], + "propertiesClass": [], + "methodsClass": [ + { + "name": "ngOnDestroy", + "args": [], + "optional": false, + "returnType": "void", + "typeParameters": [], + "line": 39, + "deprecated": false, + "deprecationMessage": "" + }, + { + "name": "ngOnInit", + "args": [], + "optional": false, + "returnType": "void", + "typeParameters": [], + "line": 32, + "deprecated": false, + "deprecationMessage": "" + }, + { + "name": "onError", + "args": [], + "optional": false, + "returnType": "void", + "typeParameters": [], + "line": 19, + "deprecated": false, + "deprecationMessage": "", + "decorators": [ + { + "name": "HostListener", + "stringifiedArguments": "'error', ['$event']" + } + ], + "modifierKind": [ + 167 + ] + }, + { + "name": "onLoad", + "args": [], + "optional": false, + "returnType": "void", + "typeParameters": [], + "line": 14, + "deprecated": false, + "deprecationMessage": "", + "decorators": [ + { + "name": "HostListener", + "stringifiedArguments": "'load', ['$event']" + } + ], + "modifierKind": [ + 167 + ] + } + ], + "implements": [ + "OnInit", + "OnDestroy" + ], + "constructorObj": { + "name": "constructor", + "description": "", + "deprecated": false, + "deprecationMessage": "", + "args": [ + { + "name": "el", + "type": "ElementRef", + "deprecated": false, + "deprecationMessage": "" + }, + { + "name": "manager", + "type": "ImgManager", + "deprecated": false, + "deprecationMessage": "" + }, + { + "name": "item", + "type": "GalleryItemComponent", + "deprecated": false, + "deprecationMessage": "" + } + ], + "line": 21, + "jsdoctags": [ + { + "name": "el", + "type": "ElementRef", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + }, + { + "name": "manager", + "type": "ImgManager", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + }, + { + "name": "item", + "type": "GalleryItemComponent", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + } + ] + } + }, + { + "name": "ItemIntersectionObserver", + "id": "directive-ItemIntersectionObserver-0a3b2b78df343b3cbe0b7519ff88f8d37ab36f127b1e40cfba7e23f28b9ba9f67efdf206d6dcf1eb069ec9912a4641df91af4d5f9368d7b020c4a2a653f054cf", + "file": "projects/ng-gallery/src/lib/observers/item-intersection-observer.directive.ts", + "type": "directive", + "description": "", + "rawdescription": "\n", + "sourceCode": "import { Directive, Input, Output, OnChanges, OnDestroy, NgZone, EventEmitter } from '@angular/core';\r\nimport { Subscription, combineLatest, filter, switchMap } from 'rxjs';\r\nimport { GalleryConfig } from '../models/config.model';\r\nimport { ActiveItemObserver } from './active-item-observer';\r\nimport { resizeObservable } from '../utils/resize-observer';\r\nimport { SliderAdapter } from '../components/adapters';\r\nimport { GalleryItemComponent } from '../components/gallery-item.component';\r\nimport { ItemState } from '../components/templates/items.model';\r\n\r\n@Directive({\r\n selector: '[itemIntersectionObserver]',\r\n standalone: true\r\n})\r\nexport class ItemIntersectionObserver implements OnChanges, OnDestroy {\r\n\r\n private _currentSubscription: Subscription;\r\n\r\n private _sensor: ActiveItemObserver = new ActiveItemObserver();\r\n\r\n private get _viewport(): HTMLElement {\r\n return this._item.nativeElement.parentElement.parentElement;\r\n }\r\n\r\n @Input() adapter: SliderAdapter;\r\n\r\n @Input() config: GalleryConfig;\r\n\r\n @Input('itemIntersectionObserverDisabled') disabled: boolean;\r\n\r\n @Output() activeIndexChange: EventEmitter = new EventEmitter();\r\n\r\n constructor(private _zone: NgZone, private _item: GalleryItemComponent) {\r\n }\r\n\r\n ngOnChanges(): void {\r\n (this.config.itemAutosize && !this.disabled) ? this._subscribe() : this._unsubscribe();\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this._unsubscribe();\r\n }\r\n\r\n private _subscribe(): void {\r\n this._unsubscribe();\r\n\r\n if (!!this.adapter) {\r\n this._zone.runOutsideAngular(() => {\r\n this._currentSubscription = combineLatest([\r\n resizeObservable(this._viewport),\r\n resizeObservable(this._item.nativeElement)\r\n ]).pipe(\r\n switchMap(() => this._item.state$),\r\n filter((state: ItemState) => state !== 'loading'),\r\n switchMap(() => {\r\n const rootMargin: string = this.adapter.getElementRootMargin(this._viewport, this._item.nativeElement);\r\n if (this.config.debug) {\r\n this._item.nativeElement.style.setProperty('--item-intersection-margin', `\"VIEWPORT(${ this._viewport.clientWidth }x${ this._viewport.clientHeight }) ITEM(${ this._item.nativeElement.clientWidth }x${ this._item.nativeElement.clientHeight }) INTERSECTION(${ rootMargin })\"`);\r\n }\r\n\r\n return this._sensor.observe(\r\n this._viewport,\r\n [this._item.nativeElement],\r\n rootMargin\r\n );\r\n }\r\n )\r\n ).subscribe((index: number) => {\r\n this._zone.run(() => this.activeIndexChange.emit(index));\r\n });\r\n });\r\n }\r\n }\r\n\r\n private _unsubscribe(): void {\r\n this._currentSubscription?.unsubscribe();\r\n }\r\n}\r\n", + "selector": "[itemIntersectionObserver]", + "providers": [], + "hostDirectives": [], + "standalone": true, + "inputsClass": [ + { + "name": "adapter", + "deprecated": false, + "deprecationMessage": "", + "line": 24, + "type": "SliderAdapter", + "decorators": [] + }, + { + "name": "config", + "deprecated": false, + "deprecationMessage": "", + "line": 26, + "type": "GalleryConfig", + "decorators": [] + }, + { + "name": "itemIntersectionObserverDisabled", + "deprecated": false, + "deprecationMessage": "", + "line": 28, + "type": "boolean", + "decorators": [] + } + ], + "outputsClass": [ + { + "name": "activeIndexChange", + "defaultValue": "new EventEmitter()", + "deprecated": false, + "deprecationMessage": "", + "line": 30, + "type": "EventEmitter" + } + ], + "deprecated": false, + "deprecationMessage": "", + "hostBindings": [], + "hostListeners": [], + "propertiesClass": [ + { + "name": "_currentSubscription", + "deprecated": false, + "deprecationMessage": "", + "type": "Subscription", + "optional": false, + "description": "", + "line": 16, + "modifierKind": [ + 121 + ] + }, + { + "name": "_sensor", + "defaultValue": "new ActiveItemObserver()", + "deprecated": false, + "deprecationMessage": "", + "type": "ActiveItemObserver", + "optional": false, + "description": "", + "line": 18, + "modifierKind": [ + 121 + ] + } + ], + "methodsClass": [ + { + "name": "_subscribe", + "args": [], + "optional": false, + "returnType": "void", + "typeParameters": [], + "line": 43, + "deprecated": false, + "deprecationMessage": "", + "modifierKind": [ + 121 + ] + }, + { + "name": "_unsubscribe", + "args": [], + "optional": false, + "returnType": "void", + "typeParameters": [], + "line": 74, + "deprecated": false, + "deprecationMessage": "", + "modifierKind": [ + 121 + ] + }, + { + "name": "ngOnChanges", + "args": [], + "optional": false, + "returnType": "void", + "typeParameters": [], + "line": 35, + "deprecated": false, + "deprecationMessage": "" + }, + { + "name": "ngOnDestroy", + "args": [], + "optional": false, + "returnType": "void", + "typeParameters": [], + "line": 39, + "deprecated": false, + "deprecationMessage": "" + } + ], + "implements": [ + "OnChanges", + "OnDestroy" + ], + "constructorObj": { + "name": "constructor", + "description": "", + "deprecated": false, + "deprecationMessage": "", + "args": [ + { + "name": "_zone", + "type": "NgZone", + "deprecated": false, + "deprecationMessage": "" + }, + { + "name": "_item", + "type": "GalleryItemComponent", + "deprecated": false, + "deprecationMessage": "" + } + ], + "line": 30, + "jsdoctags": [ + { + "name": "_zone", + "type": "NgZone", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + }, + { + "name": "_item", + "type": "GalleryItemComponent", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + } + ] + }, + "accessors": { + "_viewport": { + "name": "_viewport", + "getSignature": { + "name": "_viewport", + "type": "", + "returnType": "HTMLElement", + "line": 20 + } + } + } + }, + { + "name": "SliderIntersectionObserver", + "id": "directive-SliderIntersectionObserver-59296fab6cf19b998ffcf73bd65f51d466a277818639722ee281fa993055678cbb9b8fa77f5f0234106cbc02d5a6dbc972d06329fa5eeb06598776d1d6bf0228", + "file": "projects/ng-gallery/src/lib/observers/slider-intersection-observer.directive.ts", + "type": "directive", + "description": "", + "rawdescription": "\n", + "sourceCode": "import { Directive, Input, Output, OnChanges, OnDestroy, NgZone, ElementRef, EventEmitter } from '@angular/core';\r\nimport { skip, Subscription } from 'rxjs';\r\nimport { GalleryConfig } from '../models/config.model';\r\nimport { ActiveItemObserver } from './active-item-observer';\r\nimport { SliderAdapter } from '../components/adapters';\r\nimport { GalleryItemComponent } from '../components/gallery-item.component';\r\n\r\n@Directive({\r\n selector: '[sliderIntersectionObserver]',\r\n standalone: true\r\n})\r\nexport class SliderIntersectionObserver implements OnChanges, OnDestroy {\r\n\r\n private _currentSubscription: Subscription;\r\n\r\n private _sensor: ActiveItemObserver = new ActiveItemObserver();\r\n\r\n private get _viewport(): HTMLElement {\r\n return this._el.nativeElement;\r\n }\r\n\r\n @Input() adapter: SliderAdapter;\r\n\r\n @Input() items: GalleryItemComponent[];\r\n\r\n @Input() config: GalleryConfig;\r\n\r\n @Input('sliderIntersectionObserverDisabled') disabled: boolean;\r\n\r\n @Output() activeIndexChange: EventEmitter = new EventEmitter();\r\n\r\n constructor(private _zone: NgZone, private _el: ElementRef) {\r\n }\r\n\r\n ngOnChanges(): void {\r\n (this.config.itemAutosize || this.disabled) ? this._unsubscribe() : this._subscribe();\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this._unsubscribe();\r\n }\r\n\r\n private _subscribe(): void {\r\n this._unsubscribe();\r\n\r\n if (!!this.adapter && !!this.items?.length) {\r\n const rootMargin: string = this.adapter.getRootMargin();\r\n if (this.config.debug) {\r\n this._viewport.style.setProperty('--intersection-margin', `\"INTERSECTION(${ rootMargin })\"`);\r\n }\r\n\r\n this._zone.runOutsideAngular(() => {\r\n this._currentSubscription = this._sensor.observe(\r\n this._viewport,\r\n this.items.map((item: GalleryItemComponent) => item.nativeElement),\r\n rootMargin\r\n ).subscribe((index: number) => {\r\n this._zone.run(() => this.activeIndexChange.emit(index));\r\n });\r\n });\r\n }\r\n }\r\n\r\n private _unsubscribe(): void {\r\n this._currentSubscription?.unsubscribe();\r\n }\r\n}\r\n", + "selector": "[sliderIntersectionObserver]", + "providers": [], + "hostDirectives": [], + "standalone": true, + "inputsClass": [ + { + "name": "adapter", + "deprecated": false, + "deprecationMessage": "", + "line": 22, + "type": "SliderAdapter", + "decorators": [] + }, + { + "name": "config", + "deprecated": false, + "deprecationMessage": "", + "line": 26, + "type": "GalleryConfig", + "decorators": [] + }, + { + "name": "items", + "deprecated": false, + "deprecationMessage": "", + "line": 24, + "type": "GalleryItemComponent[]", + "decorators": [] + }, + { + "name": "sliderIntersectionObserverDisabled", + "deprecated": false, + "deprecationMessage": "", + "line": 28, + "type": "boolean", + "decorators": [] + } + ], + "outputsClass": [ + { + "name": "activeIndexChange", + "defaultValue": "new EventEmitter()", + "deprecated": false, + "deprecationMessage": "", + "line": 30, + "type": "EventEmitter" + } + ], + "deprecated": false, + "deprecationMessage": "", + "hostBindings": [], + "hostListeners": [], + "propertiesClass": [ + { + "name": "_currentSubscription", + "deprecated": false, + "deprecationMessage": "", + "type": "Subscription", + "optional": false, + "description": "", + "line": 14, + "modifierKind": [ + 121 + ] + }, + { + "name": "_sensor", + "defaultValue": "new ActiveItemObserver()", + "deprecated": false, + "deprecationMessage": "", + "type": "ActiveItemObserver", + "optional": false, + "description": "", + "line": 16, + "modifierKind": [ + 121 + ] + } + ], + "methodsClass": [ + { + "name": "_subscribe", + "args": [], + "optional": false, + "returnType": "void", + "typeParameters": [], + "line": 43, + "deprecated": false, + "deprecationMessage": "", + "modifierKind": [ + 121 + ] + }, + { + "name": "_unsubscribe", + "args": [], + "optional": false, + "returnType": "void", + "typeParameters": [], + "line": 64, + "deprecated": false, + "deprecationMessage": "", + "modifierKind": [ + 121 + ] + }, + { + "name": "ngOnChanges", + "args": [], + "optional": false, + "returnType": "void", + "typeParameters": [], + "line": 35, + "deprecated": false, + "deprecationMessage": "" + }, + { + "name": "ngOnDestroy", + "args": [], + "optional": false, + "returnType": "void", + "typeParameters": [], + "line": 39, + "deprecated": false, + "deprecationMessage": "" + } + ], + "implements": [ + "OnChanges", + "OnDestroy" + ], + "constructorObj": { + "name": "constructor", + "description": "", + "deprecated": false, + "deprecationMessage": "", + "args": [ + { + "name": "_zone", + "type": "NgZone", + "deprecated": false, + "deprecationMessage": "" + }, + { + "name": "_el", + "type": "ElementRef", + "deprecated": false, + "deprecationMessage": "" + } + ], + "line": 30, + "jsdoctags": [ + { + "name": "_zone", + "type": "NgZone", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + }, + { + "name": "_el", + "type": "ElementRef", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + } + ] + }, + "accessors": { + "_viewport": { + "name": "_viewport", + "getSignature": { + "name": "_viewport", + "type": "", + "returnType": "HTMLElement", + "line": 18 + } + } + } + }, + { + "name": "SliderResizeObserver", + "id": "directive-SliderResizeObserver-e9e0114bce4aa05a4e4454ec9d6bc082f728bc27ce0c56ff97ca48b841d05577d1734afbcd0dc58c53953763bb0b005c4442de9d4b6f0cd556443d328614d8d1", + "file": "projects/ng-gallery/src/lib/observers/slider-resize-observer.directive.ts", + "type": "directive", + "description": "", + "rawdescription": "\n", + "sourceCode": "import {\r\n Directive,\r\n Input,\r\n Output,\r\n NgZone,\r\n ElementRef,\r\n AfterViewChecked,\r\n OnInit,\r\n OnChanges,\r\n OnDestroy,\r\n EventEmitter\r\n} from '@angular/core';\r\nimport {\r\n Observable,\r\n Subscription,\r\n of,\r\n tap,\r\n take,\r\n filter,\r\n fromEvent,\r\n switchMap,\r\n debounceTime,\r\n firstValueFrom,\r\n distinctUntilChanged,\r\n EMPTY,\r\n animationFrameScheduler\r\n} from 'rxjs';\r\nimport { ImgManager } from '../utils/img-manager';\r\nimport { resizeObservable } from '../utils/resize-observer';\r\nimport { SliderAdapter } from '../components/adapters';\r\nimport { Gallery } from '../services/gallery.service';\r\nimport { GalleryRef } from '../services/gallery-ref';\r\nimport { GalleryConfig } from '../models/config.model';\r\nimport { GalleryState } from '../models/gallery.model';\r\n\r\n@Directive({\r\n selector: '[sliderResizeObserver]',\r\n standalone: true\r\n})\r\nexport class SliderResizeObserver implements AfterViewChecked, OnChanges, OnInit, OnDestroy {\r\n\r\n private _resizeObserver: ResizeObserver;\r\n\r\n private _autoHeightSubscription: Subscription;\r\n\r\n private _resizeSubscription: Subscription;\r\n\r\n private _shouldSkip: boolean;\r\n\r\n // Stream that emits after the transition to the new height is completed\r\n private _afterHeightChanged$: Observable;\r\n\r\n private get _viewport(): HTMLElement {\r\n return this._el.nativeElement;\r\n }\r\n\r\n private get _galleryCore(): HTMLElement {\r\n return this._el.nativeElement.parentElement.parentElement.parentElement;\r\n }\r\n\r\n private get _isAutoHeight(): boolean {\r\n return this.config.autoHeight &&\r\n !this.config.itemAutosize &&\r\n this.config.orientation === 'horizontal' &&\r\n (this.config.thumbPosition === 'top' || this.config.thumbPosition === 'bottom');\r\n }\r\n\r\n @Input() galleryId: string;\r\n\r\n @Input() adapter: SliderAdapter;\r\n\r\n @Input() config: GalleryConfig;\r\n\r\n @Output() isResizingChange: EventEmitter = new EventEmitter();\r\n\r\n constructor(private _el: ElementRef,\r\n private _zone: NgZone,\r\n private _gallery: Gallery,\r\n private _imgManager: ImgManager) {\r\n }\r\n\r\n ngOnInit(): void {\r\n const galleryRef: GalleryRef = this._gallery.ref(this.galleryId);\r\n\r\n // Check if height has transition for the auto-height feature\r\n const transitionDuration: string = getComputedStyle(this._viewport).getPropertyValue('transition-duration');\r\n if (parseFloat(transitionDuration) === 0) {\r\n this._afterHeightChanged$ = of(null);\r\n } else {\r\n this._afterHeightChanged$ = fromEvent(this._viewport, 'transitionend');\r\n }\r\n\r\n this._zone.runOutsideAngular(() => {\r\n\r\n // Detect if the size of the slider has changed detecting current index on scroll\r\n this._resizeSubscription = resizeObservable(this._viewport, (observer: ResizeObserver) => this._resizeObserver = observer).pipe(\r\n // Check if resize should skip due to re-observing the slider\r\n filter(() => !this._shouldSkip || !(this._shouldSkip = false)),\r\n // Immediately set visibility to hidden to avoid changing the active item caused by appearance of other items when size is expanded\r\n tap(() => this.setResizingState()),\r\n debounceTime(this.config.resizeDebounceTime, animationFrameScheduler),\r\n tap(async (entry: ResizeObserverEntry) => {\r\n // Update CSS variables with the proper values\r\n this.updateSliderSize();\r\n\r\n if (this._isAutoHeight) {\r\n const img: HTMLImageElement = await firstValueFrom(this._imgManager.getActiveItem(galleryRef.state));\r\n // If img height is identical to the viewport height then skip\r\n if (img.height === this._viewport.clientHeight) {\r\n this.resetResizingState();\r\n } else {\r\n // Unobserve the slider while the height is being changed\r\n this.setResizingState({ unobserve: true });\r\n // Change the height\r\n this._galleryCore.style.setProperty('--slider-height', `${ img.height }px`);\r\n // Wait until height transition ends\r\n await firstValueFrom(this._afterHeightChanged$);\r\n this.resetResizingState({\r\n // Mark to skip first emit after re-observing the slider if height content rect height and client height are identical\r\n shouldSkip: entry.contentRect.height === this._viewport.clientHeight,\r\n observe: true\r\n });\r\n }\r\n } else {\r\n requestAnimationFrame(() => this.resetResizingState({ shouldSkip: true }));\r\n }\r\n })\r\n ).subscribe();\r\n });\r\n }\r\n\r\n ngOnChanges(): void {\r\n this._isAutoHeight ? this._subscribeAutoHeight() : this._unsubscribeAutoHeight();\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this._resizeSubscription?.unsubscribe();\r\n this._unsubscribeAutoHeight();\r\n }\r\n\r\n ngAfterViewChecked(): void {\r\n this.updateSliderSize();\r\n }\r\n\r\n private updateSliderSize(): void {\r\n // Update slider width and height CSS variables\r\n this._galleryCore.style.setProperty('--slider-width', `${ this._viewport.clientWidth }px`);\r\n\r\n // Only update height if auto-height is false, because when it's true, another function will take care of it\r\n if (!this.config.autoHeight) {\r\n this._galleryCore.style.setProperty('--slider-height', `${ this._viewport.clientHeight }px`);\r\n }\r\n\r\n this.updateCentralizeCSSVariables();\r\n }\r\n\r\n private updateCentralizeCSSVariables(): void {\r\n if (this.config.itemAutosize) {\r\n this._galleryCore.style.setProperty('--slider-centralize-start-size', `${ this.adapter.getCentralizerStartSize() }px`);\r\n this._galleryCore.style.setProperty('--slider-centralize-end-size', `${ this.adapter.getCentralizerEndSize() }px`);\r\n }\r\n }\r\n\r\n private _subscribeAutoHeight(): void {\r\n this._unsubscribeAutoHeight();\r\n\r\n this._shouldSkip = false;\r\n this._zone.runOutsideAngular(() => {\r\n\r\n const galleryRef: GalleryRef = this._gallery.ref(this.galleryId);\r\n\r\n // TODO: Why is galleryRef.state emits when screen size changes?\r\n const state: Observable = galleryRef.state.pipe(distinctUntilChanged((a: GalleryState, b: GalleryState) => a.currIndex === b.currIndex))\r\n this._autoHeightSubscription = this._imgManager.getActiveItem(state).pipe(\r\n switchMap((img: HTMLImageElement) => {\r\n this.setResizingState({ unobserve: true });\r\n this._galleryCore.style.setProperty('--slider-height', `${ img.clientHeight }px`);\r\n\r\n // Check if the new item height is equal to the current height, there will be no transition,\r\n // So reset resizing state\r\n if (img.height === this._viewport.clientHeight) {\r\n this.resetResizingState({ shouldSkip: true, observe: true });\r\n return EMPTY;\r\n }\r\n return this._afterHeightChanged$.pipe(\r\n tap(() => this.resetResizingState({ shouldSkip: true, observe: true })),\r\n take(1)\r\n );\r\n })\r\n ).subscribe();\r\n });\r\n }\r\n\r\n private _unsubscribeAutoHeight(): void {\r\n this._autoHeightSubscription?.unsubscribe();\r\n }\r\n\r\n private setResizingState({ unobserve }: { unobserve?: boolean } = {}): void {\r\n this._zone.run(() => {\r\n this.isResizingChange.emit(true);\r\n })\r\n this._viewport.classList.add('g-resizing');\r\n if (unobserve) {\r\n // Unobserve the slider while the height is being changed\r\n this._resizeObserver.unobserve(this._viewport);\r\n }\r\n }\r\n\r\n private resetResizingState({ shouldSkip, observe }: { shouldSkip?: boolean, observe?: boolean } = {}): void {\r\n this._zone.run(() => {\r\n this.isResizingChange.emit(false);\r\n })\r\n this._viewport.classList.remove('g-resizing');\r\n this._shouldSkip = shouldSkip;\r\n if (observe) {\r\n this._resizeObserver.observe(this._viewport);\r\n }\r\n }\r\n}\r\n", + "selector": "[sliderResizeObserver]", + "providers": [], + "hostDirectives": [], + "standalone": true, + "inputsClass": [ + { + "name": "adapter", + "deprecated": false, + "deprecationMessage": "", + "line": 70, + "type": "SliderAdapter", + "decorators": [] + }, + { + "name": "config", + "deprecated": false, + "deprecationMessage": "", + "line": 72, + "type": "GalleryConfig", + "decorators": [] + }, + { + "name": "galleryId", + "deprecated": false, + "deprecationMessage": "", + "line": 68, + "type": "string", + "decorators": [] + } + ], + "outputsClass": [ + { + "name": "isResizingChange", + "defaultValue": "new EventEmitter()", + "deprecated": false, + "deprecationMessage": "", + "line": 74, + "type": "EventEmitter" + } + ], + "deprecated": false, + "deprecationMessage": "", + "hostBindings": [], + "hostListeners": [], + "propertiesClass": [ + { + "name": "_afterHeightChanged$", + "deprecated": false, + "deprecationMessage": "", + "type": "Observable", + "optional": false, + "description": "", + "line": 51, + "modifierKind": [ + 121 + ] + }, + { + "name": "_autoHeightSubscription", + "deprecated": false, + "deprecationMessage": "", + "type": "Subscription", + "optional": false, + "description": "", + "line": 44, + "modifierKind": [ + 121 + ] + }, + { + "name": "_resizeObserver", + "deprecated": false, + "deprecationMessage": "", + "type": "ResizeObserver", + "optional": false, + "description": "", + "line": 42, + "modifierKind": [ + 121 + ] + }, + { + "name": "_resizeSubscription", + "deprecated": false, + "deprecationMessage": "", + "type": "Subscription", + "optional": false, + "description": "", + "line": 46, + "modifierKind": [ + 121 + ] + }, + { + "name": "_shouldSkip", + "deprecated": false, + "deprecationMessage": "", + "type": "boolean", + "optional": false, + "description": "", + "line": 48, + "modifierKind": [ + 121 + ] + } + ], + "methodsClass": [ + { + "name": "_subscribeAutoHeight", + "args": [], + "optional": false, + "returnType": "void", + "typeParameters": [], + "line": 164, + "deprecated": false, + "deprecationMessage": "", + "modifierKind": [ + 121 + ] + }, + { + "name": "_unsubscribeAutoHeight", + "args": [], + "optional": false, + "returnType": "void", + "typeParameters": [], + "line": 194, + "deprecated": false, + "deprecationMessage": "", + "modifierKind": [ + 121 + ] + }, + { + "name": "ngAfterViewChecked", + "args": [], + "optional": false, + "returnType": "void", + "typeParameters": [], + "line": 141, + "deprecated": false, + "deprecationMessage": "" + }, + { + "name": "ngOnChanges", + "args": [], + "optional": false, + "returnType": "void", + "typeParameters": [], + "line": 132, + "deprecated": false, + "deprecationMessage": "" + }, + { + "name": "ngOnDestroy", + "args": [], + "optional": false, + "returnType": "void", + "typeParameters": [], + "line": 136, + "deprecated": false, + "deprecationMessage": "" + }, + { + "name": "ngOnInit", + "args": [], + "optional": false, + "returnType": "void", + "typeParameters": [], + "line": 82, + "deprecated": false, + "deprecationMessage": "" + }, + { + "name": "resetResizingState", + "args": [ + { + "type": "literal type", + "deprecated": false, + "deprecationMessage": "", + "defaultValue": "{}" + } + ], + "optional": false, + "returnType": "void", + "typeParameters": [], + "line": 209, + "deprecated": false, + "deprecationMessage": "", + "modifierKind": [ + 121 + ], + "jsdoctags": [ + { + "type": "literal type", + "deprecated": false, + "deprecationMessage": "", + "defaultValue": "{}", + "tagName": { + "text": "param" + } + } + ] + }, + { + "name": "setResizingState", + "args": [ + { + "type": "literal type", + "deprecated": false, + "deprecationMessage": "", + "defaultValue": "{}" + } + ], + "optional": false, + "returnType": "void", + "typeParameters": [], + "line": 198, + "deprecated": false, + "deprecationMessage": "", + "modifierKind": [ + 121 + ], + "jsdoctags": [ + { + "type": "literal type", + "deprecated": false, + "deprecationMessage": "", + "defaultValue": "{}", + "tagName": { + "text": "param" + } + } + ] + }, + { + "name": "updateCentralizeCSSVariables", + "args": [], + "optional": false, + "returnType": "void", + "typeParameters": [], + "line": 157, + "deprecated": false, + "deprecationMessage": "", + "modifierKind": [ + 121 + ] + }, + { + "name": "updateSliderSize", + "args": [], + "optional": false, + "returnType": "void", + "typeParameters": [], + "line": 145, + "deprecated": false, + "deprecationMessage": "", + "modifierKind": [ + 121 + ] + } + ], + "implements": [ + "AfterViewChecked", + "OnChanges", + "OnInit", + "OnDestroy" + ], + "constructorObj": { + "name": "constructor", + "description": "", + "deprecated": false, + "deprecationMessage": "", + "args": [ + { + "name": "_el", + "type": "ElementRef", + "deprecated": false, + "deprecationMessage": "" + }, + { + "name": "_zone", + "type": "NgZone", + "deprecated": false, + "deprecationMessage": "" + }, + { + "name": "_gallery", + "type": "Gallery", + "deprecated": false, + "deprecationMessage": "" + }, + { + "name": "_imgManager", + "type": "ImgManager", + "deprecated": false, + "deprecationMessage": "" + } + ], + "line": 74, + "jsdoctags": [ + { + "name": "_el", + "type": "ElementRef", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + }, + { + "name": "_zone", + "type": "NgZone", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + }, + { + "name": "_gallery", + "type": "Gallery", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + }, + { + "name": "_imgManager", + "type": "ImgManager", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + } + ] + }, + "accessors": { + "_viewport": { + "name": "_viewport", + "getSignature": { + "name": "_viewport", + "type": "", + "returnType": "HTMLElement", + "line": 53 + } + }, + "_galleryCore": { + "name": "_galleryCore", + "getSignature": { + "name": "_galleryCore", + "type": "", + "returnType": "HTMLElement", + "line": 57 + } + }, + "_isAutoHeight": { + "name": "_isAutoHeight", + "getSignature": { + "name": "_isAutoHeight", + "type": "boolean", + "returnType": "boolean", + "line": 61 + } + } + } + }, + { + "name": "SmoothScroll", + "id": "directive-SmoothScroll-5bb27d460fc4a4e1ca2570fbc891c51a47834c7c6604af768ac261f9e520115f379926565a009c6aad180f99b311899a56030c3dcf739ffbf2539d9d56d6c38d", + "file": "projects/ng-gallery/src/lib/smooth-scroll/smooth-scroll.directive.ts", + "type": "directive", + "description": "", + "rawdescription": "\n", + "sourceCode": "import {\r\n Directive,\r\n Inject,\r\n Input,\r\n Output,\r\n NgZone,\r\n OnInit,\r\n OnDestroy,\r\n ElementRef,\r\n EventEmitter\r\n} from '@angular/core';\r\nimport { DOCUMENT } from '@angular/common';\r\nimport { Dir } from '@angular/cdk/bidi';\r\nimport { _Bottom, _Left, _Right, _Top, _Without } from '@angular/cdk/scrolling';\r\nimport { getRtlScrollAxisType, RtlScrollAxisType } from '@angular/cdk/platform';\r\nimport {\r\n Observable,\r\n Subject,\r\n Subscriber,\r\n Subscription,\r\n of,\r\n take,\r\n merge,\r\n expand,\r\n fromEvent,\r\n switchMap,\r\n takeUntil,\r\n takeWhile,\r\n finalize\r\n} from 'rxjs';\r\nimport BezierEasing from './bezier-easing';\r\nimport { GalleryConfig } from '../models/config.model';\r\nimport { SmoothScrollOptions, SmoothScrollStep, SmoothScrollToOptions } from './index';\r\nimport { SliderAdapter } from '../components/adapters';\r\n\r\ndeclare const Hammer: any;\r\n\r\n@Directive({\r\n selector: '[smoothScroll]',\r\n standalone: true,\r\n providers: [Dir]\r\n})\r\nexport class SmoothScroll implements OnInit, OnDestroy {\r\n\r\n /** HammerJS instance */\r\n private _hammer: any;\r\n\r\n private readonly _scrollController: Subject = new Subject();\r\n\r\n private readonly _finished: Subject = new Subject();\r\n\r\n private readonly _el: HTMLElement;\r\n\r\n private _isInterruptedByMouse: boolean;\r\n\r\n private _subscription: Subscription;\r\n\r\n private get _w(): Window {\r\n return this._document.defaultView;\r\n }\r\n\r\n /**\r\n * Timing method\r\n */\r\n private get _now(): () => number {\r\n return this._w.performance?.now?.bind(this._w.performance) || Date.now;\r\n }\r\n\r\n @Input()\r\n set smoothScroll(value: SmoothScrollOptions) {\r\n if (value) {\r\n this._zone.runOutsideAngular(() => {\r\n this.scrollTo(value);\r\n });\r\n }\r\n }\r\n\r\n @Input() adapter: SliderAdapter;\r\n\r\n @Input() config: GalleryConfig;\r\n\r\n @Input('smoothScrollInterruptOnMousemove') interruptOnMousemove: boolean;\r\n\r\n @Output() isScrollingChange: EventEmitter = new EventEmitter();\r\n\r\n constructor(@Inject(DOCUMENT) private _document: Document,\r\n private _zone: NgZone,\r\n private _dir: Dir,\r\n _el: ElementRef) {\r\n this._el = _el.nativeElement;\r\n }\r\n\r\n ngOnInit(): void {\r\n this._subscription = this._scrollController.pipe(\r\n switchMap((context: SmoothScrollStep) => {\r\n this._zone.run(() => {\r\n this.isScrollingChange.emit(true);\r\n });\r\n\r\n this._el.classList.add('g-scrolling');\r\n this._el.style.setProperty('--slider-scroll-snap-type', 'none');\r\n\r\n // Scroll each step recursively\r\n return of(null).pipe(\r\n expand(() => this._step(context).pipe(\r\n takeWhile((currContext: SmoothScrollStep) => this._isFinished(currContext)),\r\n takeUntil(this._finished)\r\n )),\r\n finalize(() => this.resetElement()),\r\n takeUntil(this._interrupted()),\r\n );\r\n })\r\n ).subscribe();\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this._subscription?.unsubscribe();\r\n this._scrollController.complete();\r\n }\r\n\r\n /**\r\n * changes scroll position inside an element\r\n */\r\n private _scrollElement(x: number, y: number): void {\r\n this._el.scrollLeft = x;\r\n this._el.scrollTop = y;\r\n }\r\n\r\n private resetElement(): void {\r\n this._zone.run(() => {\r\n this.isScrollingChange.emit(false);\r\n });\r\n\r\n this._el.classList.remove('g-scrolling');\r\n if (!this._isInterruptedByMouse) {\r\n this._el.style.setProperty('--slider-scroll-snap-type', this.adapter.scrollSnapType);\r\n }\r\n this._isInterruptedByMouse = false;\r\n }\r\n\r\n /**\r\n * Checks if smooth scroll has reached, cleans up the smooth scroll stream and resolves its promise\r\n */\r\n private _isFinished(context: SmoothScrollStep): boolean {\r\n if (context.currentX !== context.x || context.currentY !== context.y) {\r\n return true;\r\n }\r\n this._finished.next();\r\n return false;\r\n }\r\n\r\n /**\r\n * Terminates an ongoing smooth scroll\r\n */\r\n private _interrupted(): Observable {\r\n let interrupt$: Observable;\r\n if (this.interruptOnMousemove && typeof Hammer !== 'undefined') {\r\n this._hammer = new Hammer(this._el, { inputClass: Hammer.MouseInput });\r\n this._hammer.get('pan').set({ direction: this.adapter.hammerDirection });\r\n\r\n // For gallery thumb slider, dragging thumbnails should cancel the ongoing scroll\r\n interrupt$ = merge(\r\n new Observable((subscriber: Subscriber) => {\r\n this._hammer.on('panstart', () => {\r\n this._isInterruptedByMouse = true;\r\n subscriber.next();\r\n subscriber.complete();\r\n });\r\n return () => {\r\n this._hammer.destroy();\r\n }\r\n }),\r\n fromEvent(this._el, 'wheel', { passive: true, capture: true }),\r\n fromEvent(this._el, 'touchmove', { passive: true, capture: true }),\r\n )\r\n } else {\r\n interrupt$ = merge(\r\n fromEvent(this._el, 'wheel', { passive: true, capture: true }),\r\n fromEvent(this._el, 'touchmove', { passive: true, capture: true }),\r\n )\r\n }\r\n return interrupt$.pipe(take(1));\r\n }\r\n\r\n /**\r\n * A function called recursively that, given a context, steps through scrolling\r\n */\r\n private _step(context: SmoothScrollStep): Observable {\r\n return new Observable((subscriber: Subscriber) => {\r\n let elapsed: number = (this._now() - context.startTime) / context.duration;\r\n\r\n // avoid elapsed times higher than one\r\n elapsed = elapsed > 1 ? 1 : elapsed;\r\n\r\n // apply easing to elapsed time\r\n const value: number = context.easing(elapsed);\r\n\r\n context.currentX = context.startX + (context.x - context.startX) * value;\r\n context.currentY = context.startY + (context.y - context.startY) * value;\r\n\r\n this._scrollElement(context.currentX, context.currentY);\r\n // Proceed to the step\r\n requestAnimationFrame(() => {\r\n subscriber.next(context);\r\n subscriber.complete();\r\n });\r\n });\r\n }\r\n\r\n private _applyScrollToOptions(options: SmoothScrollToOptions): void {\r\n if (!options.duration) {\r\n this._scrollElement(options.left, options.top);\r\n }\r\n\r\n const context: SmoothScrollStep = {\r\n scrollable: this._el,\r\n startTime: this._now(),\r\n startX: this._el.scrollLeft,\r\n startY: this._el.scrollTop,\r\n x: options.left == null ? this._el.scrollLeft : ~~options.left,\r\n y: options.top == null ? this._el.scrollTop : ~~options.top,\r\n duration: options.duration,\r\n easing: BezierEasing(options.easing.x1, options.easing.y1, options.easing.x2, options.easing.y2)\r\n };\r\n\r\n this._scrollController.next(context);\r\n }\r\n\r\n /**\r\n * Scrolls to the specified offsets. This is a normalized version of the browser's native scrollTo\r\n * method, since browsers are not consistent about what scrollLeft means in RTL. For this method\r\n * left and right always refer to the left and right side of the scrolling container irrespective\r\n * of the layout direction. start and end refer to left and right in an LTR context and vice-versa\r\n * in an RTL context.\r\n * @param params specified the offsets to scroll to.\r\n */\r\n scrollTo(params: SmoothScrollOptions): void {\r\n const isRtl: boolean = this._dir.value === 'rtl';\r\n const rtlScrollAxisType: RtlScrollAxisType = getRtlScrollAxisType();\r\n\r\n const options: SmoothScrollToOptions = {\r\n ...params,\r\n ...({\r\n // Rewrite start & end offsets as right or left offsets.\r\n left: params.left == null ? (isRtl ? params.end : params.start) : params.left,\r\n right: params.right == null ? (isRtl ? params.start : params.end) : params.right\r\n } as _Without<_Bottom & _Top>),\r\n duration: params.behavior === 'smooth' ? this.config.scrollDuration : 0,\r\n easing: this.config.scrollEase,\r\n };\r\n\r\n // Rewrite the bottom offset as a top offset.\r\n if (options.bottom != null) {\r\n (options as _Without<_Bottom> & _Top).top = this._el.scrollHeight - this._el.clientHeight - options.bottom;\r\n }\r\n\r\n // Rewrite the right offset as a left offset.\r\n if (isRtl && rtlScrollAxisType !== RtlScrollAxisType.NORMAL) {\r\n if (options.left != null) {\r\n (options as _Without<_Left> & _Right).right = this._el.scrollWidth - this._el.clientWidth - options.left;\r\n }\r\n\r\n if (rtlScrollAxisType === RtlScrollAxisType.INVERTED) {\r\n options.left = options.right;\r\n } else if (rtlScrollAxisType === RtlScrollAxisType.NEGATED) {\r\n options.left = options.right ? -options.right : options.right;\r\n }\r\n } else {\r\n if (options.right != null) {\r\n (options as _Without<_Right> & _Left).left = this._el.scrollWidth - this._el.clientWidth - options.right;\r\n }\r\n }\r\n return this._applyScrollToOptions(options);\r\n }\r\n}\r\n", + "selector": "[smoothScroll]", + "providers": [ + { + "name": "Dir" + } + ], + "hostDirectives": [], + "standalone": true, + "inputsClass": [ + { + "name": "adapter", + "deprecated": false, + "deprecationMessage": "", + "line": 78, + "type": "SliderAdapter", + "decorators": [] + }, + { + "name": "config", + "deprecated": false, + "deprecationMessage": "", + "line": 80, + "type": "GalleryConfig", + "decorators": [] + }, + { + "name": "smoothScroll", + "deprecated": false, + "deprecationMessage": "", + "line": 70, + "type": "SmoothScrollOptions", + "decorators": [] + }, + { + "name": "smoothScrollInterruptOnMousemove", + "deprecated": false, + "deprecationMessage": "", + "line": 82, + "type": "boolean", + "decorators": [] + } + ], + "outputsClass": [ + { + "name": "isScrollingChange", + "defaultValue": "new EventEmitter()", + "deprecated": false, + "deprecationMessage": "", + "line": 84, + "type": "EventEmitter" + } + ], + "deprecated": false, + "deprecationMessage": "", + "hostBindings": [], + "hostListeners": [], + "propertiesClass": [ + { + "name": "_el", + "deprecated": false, + "deprecationMessage": "", + "type": "HTMLElement", + "optional": false, + "description": "", + "line": 52, + "modifierKind": [ + 121, + 146 + ] + }, + { + "name": "_finished", + "defaultValue": "new Subject()", + "deprecated": false, + "deprecationMessage": "", + "type": "Subject", + "optional": false, + "description": "", + "line": 50, + "modifierKind": [ + 121, + 146 + ] + }, + { + "name": "_hammer", + "deprecated": false, + "deprecationMessage": "", + "type": "any", + "optional": false, + "description": "

                                                                                                                                  HammerJS instance

                                                                                                                                  \n", + "line": 46, + "rawdescription": "\nHammerJS instance", + "modifierKind": [ + 121 + ] + }, + { + "name": "_isInterruptedByMouse", + "deprecated": false, + "deprecationMessage": "", + "type": "boolean", + "optional": false, + "description": "", + "line": 54, + "modifierKind": [ + 121 + ] + }, + { + "name": "_scrollController", + "defaultValue": "new Subject()", + "deprecated": false, + "deprecationMessage": "", + "type": "Subject", + "optional": false, + "description": "", + "line": 48, + "modifierKind": [ + 121, + 146 + ] + }, + { + "name": "_subscription", + "deprecated": false, + "deprecationMessage": "", + "type": "Subscription", + "optional": false, + "description": "", + "line": 56, + "modifierKind": [ + 121 + ] + } + ], + "methodsClass": [ + { + "name": "_applyScrollToOptions", + "args": [ + { + "name": "options", + "type": "SmoothScrollToOptions", + "deprecated": false, + "deprecationMessage": "" + } + ], + "optional": false, + "returnType": "void", + "typeParameters": [], + "line": 210, + "deprecated": false, + "deprecationMessage": "", + "modifierKind": [ + 121 + ], + "jsdoctags": [ + { + "name": "options", + "type": "SmoothScrollToOptions", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + } + ] + }, + { + "name": "_interrupted", + "args": [], + "optional": false, + "returnType": "Observable", + "typeParameters": [], + "line": 155, + "deprecated": false, + "deprecationMessage": "", + "rawdescription": "\n\nTerminates an ongoing smooth scroll\n", + "description": "

                                                                                                                                  Terminates an ongoing smooth scroll

                                                                                                                                  \n", + "modifierKind": [ + 121 + ] + }, + { + "name": "_isFinished", + "args": [ + { + "name": "context", + "type": "SmoothScrollStep", + "deprecated": false, + "deprecationMessage": "" + } + ], + "optional": false, + "returnType": "boolean", + "typeParameters": [], + "line": 144, + "deprecated": false, + "deprecationMessage": "", + "rawdescription": "\n\nChecks if smooth scroll has reached, cleans up the smooth scroll stream and resolves its promise\n", + "description": "

                                                                                                                                  Checks if smooth scroll has reached, cleans up the smooth scroll stream and resolves its promise

                                                                                                                                  \n", + "modifierKind": [ + 121 + ], + "jsdoctags": [ + { + "name": "context", + "type": "SmoothScrollStep", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + } + ] + }, + { + "name": "_scrollElement", + "args": [ + { + "name": "x", + "type": "number", + "deprecated": false, + "deprecationMessage": "" + }, + { + "name": "y", + "type": "number", + "deprecated": false, + "deprecationMessage": "" + } + ], + "optional": false, + "returnType": "void", + "typeParameters": [], + "line": 124, + "deprecated": false, + "deprecationMessage": "", + "rawdescription": "\n\nchanges scroll position inside an element\n", + "description": "

                                                                                                                                  changes scroll position inside an element

                                                                                                                                  \n", + "modifierKind": [ + 121 + ], + "jsdoctags": [ + { + "name": "x", + "type": "number", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + }, + { + "name": "y", + "type": "number", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + } + ] + }, + { + "name": "_step", + "args": [ + { + "name": "context", + "type": "SmoothScrollStep", + "deprecated": false, + "deprecationMessage": "" + } + ], + "optional": false, + "returnType": "Observable", + "typeParameters": [], + "line": 188, + "deprecated": false, + "deprecationMessage": "", + "rawdescription": "\n\nA function called recursively that, given a context, steps through scrolling\n", + "description": "

                                                                                                                                  A function called recursively that, given a context, steps through scrolling

                                                                                                                                  \n", + "modifierKind": [ + 121 + ], + "jsdoctags": [ + { + "name": "context", + "type": "SmoothScrollStep", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + } + ] + }, + { + "name": "ngOnDestroy", + "args": [], + "optional": false, + "returnType": "void", + "typeParameters": [], + "line": 116, + "deprecated": false, + "deprecationMessage": "" + }, + { + "name": "ngOnInit", + "args": [], + "optional": false, + "returnType": "void", + "typeParameters": [], + "line": 93, + "deprecated": false, + "deprecationMessage": "" + }, + { + "name": "resetElement", + "args": [], + "optional": false, + "returnType": "void", + "typeParameters": [], + "line": 129, + "deprecated": false, + "deprecationMessage": "", + "modifierKind": [ + 121 + ] + }, + { + "name": "scrollTo", + "args": [ + { + "name": "params", + "type": "SmoothScrollOptions", + "deprecated": false, + "deprecationMessage": "" + } + ], + "optional": false, + "returnType": "void", + "typeParameters": [], + "line": 237, + "deprecated": false, + "deprecationMessage": "", + "rawdescription": "\n\nScrolls to the specified offsets. This is a normalized version of the browser's native scrollTo\nmethod, since browsers are not consistent about what scrollLeft means in RTL. For this method\nleft and right always refer to the left and right side of the scrolling container irrespective\nof the layout direction. start and end refer to left and right in an LTR context and vice-versa\nin an RTL context.\n", + "description": "

                                                                                                                                  Scrolls to the specified offsets. This is a normalized version of the browser's native scrollTo\nmethod, since browsers are not consistent about what scrollLeft means in RTL. For this method\nleft and right always refer to the left and right side of the scrolling container irrespective\nof the layout direction. start and end refer to left and right in an LTR context and vice-versa\nin an RTL context.

                                                                                                                                  \n", + "jsdoctags": [ + { + "name": { + "pos": 7268, + "end": 7274, + "flags": 8421376, + "modifierFlagsCache": 0, + "transformFlags": 0, + "kind": 79, + "escapedText": "params" + }, + "type": "SmoothScrollOptions", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "pos": 7262, + "end": 7267, + "flags": 8421376, + "modifierFlagsCache": 0, + "transformFlags": 0, + "kind": 79, + "escapedText": "param" + }, + "comment": "

                                                                                                                                  specified the offsets to scroll to.

                                                                                                                                  \n" + } + ] + } + ], + "implements": [ + "OnInit", + "OnDestroy" + ], + "constructorObj": { + "name": "constructor", + "description": "", + "deprecated": false, + "deprecationMessage": "", + "args": [ + { + "name": "_document", + "type": "Document", + "deprecated": false, + "deprecationMessage": "" + }, + { + "name": "_zone", + "type": "NgZone", + "deprecated": false, + "deprecationMessage": "" + }, + { + "name": "_dir", + "type": "Dir", + "deprecated": false, + "deprecationMessage": "" + }, + { + "name": "_el", + "type": "ElementRef", + "deprecated": false, + "deprecationMessage": "" + } + ], + "line": 84, + "jsdoctags": [ + { + "name": "_document", + "type": "Document", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + }, + { + "name": "_zone", + "type": "NgZone", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + }, + { + "name": "_dir", + "type": "Dir", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + }, + { + "name": "_el", + "type": "ElementRef", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + } + ] + }, + "accessors": { + "_w": { + "name": "_w", + "getSignature": { + "name": "_w", + "type": "", + "returnType": "Window", + "line": 58 + } + }, + "_now": { + "name": "_now", + "getSignature": { + "name": "_now", + "type": "function", + "returnType": "number", + "line": 65, + "rawdescription": "\n\nTiming method\n", + "description": "

                                                                                                                                  Timing method

                                                                                                                                  \n" + } + }, + "smoothScroll": { + "name": "smoothScroll", + "setSignature": { + "name": "smoothScroll", + "type": "void", + "deprecated": false, + "deprecationMessage": "", + "args": [ + { + "name": "value", + "type": "SmoothScrollOptions", + "deprecated": false, + "deprecationMessage": "" + } + ], + "returnType": "void", + "line": 70, + "jsdoctags": [ + { + "name": "value", + "type": "SmoothScrollOptions", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + } + ] + } + } + } + }, + { + "name": "ThumbResizeObserver", + "id": "directive-ThumbResizeObserver-f4bec87bd1f6547135d967c65145c4e86b8754ad467189493e94811d9da357a949c08d5fe3245e0461721df30064e502335e86e3f947efa7efe6026daf1c754d", + "file": "projects/ng-gallery/src/lib/observers/thumb-resize-observer.directive.ts", + "type": "directive", + "description": "", + "rawdescription": "\n", + "sourceCode": "import {\r\n Directive,\r\n Input,\r\n Output,\r\n OnInit,\r\n OnChanges,\r\n OnDestroy,\r\n NgZone,\r\n ElementRef,\r\n SimpleChanges,\r\n EventEmitter\r\n} from '@angular/core';\r\nimport { Subscription, tap, auditTime, animationFrameScheduler, debounceTime } from 'rxjs';\r\nimport { resizeObservable } from '../utils/resize-observer';\r\nimport { GalleryConfig } from '../models/config.model';\r\nimport { SliderAdapter } from '../components/adapters';\r\n\r\n@Directive({\r\n selector: '[thumbResizeObserver]',\r\n standalone: true\r\n})\r\nexport class ThumbResizeObserver implements OnChanges, OnInit, OnDestroy {\r\n\r\n private _resizeSubscription: Subscription;\r\n\r\n private get _viewport(): HTMLElement {\r\n return this._el.nativeElement;\r\n }\r\n\r\n @Input() config: GalleryConfig;\r\n\r\n @Input() adapter: SliderAdapter;\r\n\r\n @Output('thumbResizeObserver') resized: EventEmitter = new EventEmitter();\r\n\r\n constructor(private _el: ElementRef, private _zone: NgZone) {\r\n }\r\n\r\n ngOnInit(): void {\r\n this._zone.runOutsideAngular(() => {\r\n this._resizeSubscription = resizeObservable(this._viewport).pipe(\r\n debounceTime(this.config.resizeDebounceTime, animationFrameScheduler),\r\n tap(() => {\r\n this.updateSliderSize();\r\n this.resized.emit();\r\n })\r\n ).subscribe();\r\n });\r\n }\r\n\r\n ngOnChanges(changes: SimpleChanges): void {\r\n if (!changes.config.firstChange) {\r\n this.updateSliderSize();\r\n }\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this._resizeSubscription?.unsubscribe();\r\n }\r\n\r\n private updateSliderSize(): void {\r\n this._viewport.style.setProperty('--thumb-centralize-start-size', this.adapter.getCentralizerStartSize() + 'px');\r\n this._viewport.style.setProperty('--thumb-centralize-end-size', this.adapter.getCentralizerEndSize() + 'px');\r\n }\r\n}\r\n", + "selector": "[thumbResizeObserver]", + "providers": [], + "hostDirectives": [], + "standalone": true, + "inputsClass": [ + { + "name": "adapter", + "deprecated": false, + "deprecationMessage": "", + "line": 32, + "type": "SliderAdapter", + "decorators": [] + }, + { + "name": "config", + "deprecated": false, + "deprecationMessage": "", + "line": 30, + "type": "GalleryConfig", + "decorators": [] + } + ], + "outputsClass": [ + { + "name": "thumbResizeObserver", + "defaultValue": "new EventEmitter()", + "deprecated": false, + "deprecationMessage": "", + "line": 34, + "type": "EventEmitter" + } + ], + "deprecated": false, + "deprecationMessage": "", + "hostBindings": [], + "hostListeners": [], + "propertiesClass": [ + { + "name": "_resizeSubscription", + "deprecated": false, + "deprecationMessage": "", + "type": "Subscription", + "optional": false, + "description": "", + "line": 24, + "modifierKind": [ + 121 + ] + } + ], + "methodsClass": [ + { + "name": "ngOnChanges", + "args": [ + { + "name": "changes", + "type": "SimpleChanges", + "deprecated": false, + "deprecationMessage": "" + } + ], + "optional": false, + "returnType": "void", + "typeParameters": [], + "line": 51, + "deprecated": false, + "deprecationMessage": "", + "jsdoctags": [ + { + "name": "changes", + "type": "SimpleChanges", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + } + ] + }, + { + "name": "ngOnDestroy", + "args": [], + "optional": false, + "returnType": "void", + "typeParameters": [], + "line": 57, + "deprecated": false, + "deprecationMessage": "" + }, + { + "name": "ngOnInit", + "args": [], + "optional": false, + "returnType": "void", + "typeParameters": [], + "line": 39, + "deprecated": false, + "deprecationMessage": "" + }, + { + "name": "updateSliderSize", + "args": [], + "optional": false, + "returnType": "void", + "typeParameters": [], + "line": 61, + "deprecated": false, + "deprecationMessage": "", + "modifierKind": [ + 121 + ] + } + ], + "implements": [ + "OnChanges", + "OnInit", + "OnDestroy" + ], + "constructorObj": { + "name": "constructor", + "description": "", + "deprecated": false, + "deprecationMessage": "", + "args": [ + { + "name": "_el", + "type": "ElementRef", + "deprecated": false, + "deprecationMessage": "" + }, + { + "name": "_zone", + "type": "NgZone", + "deprecated": false, + "deprecationMessage": "" + } + ], + "line": 34, + "jsdoctags": [ + { + "name": "_el", + "type": "ElementRef", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + }, + { + "name": "_zone", + "type": "NgZone", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + } + ] + }, + "accessors": { + "_viewport": { + "name": "_viewport", + "getSignature": { + "name": "_viewport", + "type": "", + "returnType": "HTMLElement", + "line": 26 + } + } + } + } + ], + "components": [ + { + "name": "CustomTemplateComponent", + "id": "component-CustomTemplateComponent-edc20b249ca659a17182a73d77c5802966c041e6796635ca5eccfcf01cc1194a0dca3423b64343dbbc632f79b7ecd2f2cf149030699a28aaa0985a9b731db844", + "file": "projects/ng-gallery/src/stories/custom-templates/custom-template.component.ts", + "changeDetection": "ChangeDetectionStrategy.OnPush", + "encapsulation": [], + "entryComponents": [], + "inputs": [], + "outputs": [], + "providers": [], + "selector": "custom-templates-example", + "styleUrls": [], + "styles": [ + "\n .item-text {\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n margin: 3em auto 0;\n width: 100%;\n max-width: 500px;\n padding: 20px 25px;\n text-align: justify;\n letter-spacing: 1px;\n filter: drop-shadow(0px 0px 2px rgba(0, 0, 0, 0.3));\n background: #ffffffd9;\n color: black;\n border-radius: 8px;\n }\n " + ], + "template": "\n \n
                                                                                                                                  \n {{ item?.alt }}\n
                                                                                                                                  \n
                                                                                                                                  \n
                                                                                                                                  \n", + "templateUrl": [], + "viewProviders": [], + "hostDirectives": [], + "inputsClass": [ + { + "name": "items", + "deprecated": false, + "deprecationMessage": "", + "line": 44, + "type": "GalleryItem[]", + "decorators": [] + } + ], + "outputsClass": [], + "propertiesClass": [], + "methodsClass": [], + "deprecated": false, + "deprecationMessage": "", + "hostBindings": [], + "hostListeners": [], + "standalone": true, + "imports": [ + { + "name": "CommonModule", + "type": "module" + }, + { + "name": "GalleryModule", + "type": "module" + } + ], + "description": "

                                                                                                                                  This section demonstrate how to extend the image template, like displaying a text over the image item

                                                                                                                                  \n", + "rawdescription": "\n\nThis section demonstrate how to extend the image template, like displaying a text over the image item\n", + "type": "component", + "sourceCode": "import { Component, ChangeDetectionStrategy, Input } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { GalleryModule, GalleryItem, } from 'ng-gallery';\r\nimport { Observable } from 'rxjs';\r\n\r\n/**\r\n * This section demonstrate how to extend the image template, like displaying a text over the image item\r\n */\r\n@Component({\r\n selector: 'custom-templates-example',\r\n template: `\r\n \r\n \r\n
                                                                                                                                  \r\n {{ item?.alt }}\r\n
                                                                                                                                  \r\n
                                                                                                                                  \r\n
                                                                                                                                  \r\n `,\r\n styles: [`\r\n .item-text {\r\n position: absolute;\r\n top: 0;\r\n left: 0;\r\n right: 0;\r\n margin: 3em auto 0;\r\n width: 100%;\r\n max-width: 500px;\r\n padding: 20px 25px;\r\n text-align: justify;\r\n letter-spacing: 1px;\r\n filter: drop-shadow(0px 0px 2px rgba(0, 0, 0, 0.3));\r\n background: #ffffffd9;\r\n color: black;\r\n border-radius: 8px;\r\n }\r\n `],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n standalone: true,\r\n imports: [CommonModule, GalleryModule]\r\n})\r\nexport class CustomTemplateComponent {\r\n\r\n @Input() items: GalleryItem[];\r\n\r\n}\r\n", + "assetsDirs": [], + "styleUrlsData": "", + "stylesData": "\n .item-text {\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n margin: 3em auto 0;\n width: 100%;\n max-width: 500px;\n padding: 20px 25px;\n text-align: justify;\n letter-spacing: 1px;\n filter: drop-shadow(0px 0px 2px rgba(0, 0, 0, 0.3));\n background: #ffffffd9;\n color: black;\n border-radius: 8px;\n }\n \n" + }, + { + "name": "GalleryBulletsComponent", + "id": "component-GalleryBulletsComponent-d6ea477fcfc6a33a12079db8a4ff27220eb72e6c2be718c39876bb3c5343d921414e3e0be1152a782a07ce92979f0a0612c538d6b94ddf3121d80d759299b90d", + "file": "projects/ng-gallery/src/lib/components/gallery-bullets.component.ts", + "changeDetection": "ChangeDetectionStrategy.OnPush", + "encapsulation": [], + "entryComponents": [], + "inputs": [], + "outputs": [], + "providers": [], + "selector": "gallery-bullets", + "styleUrls": [ + "./gallery-bullets.scss" + ], + "styles": [], + "template": "
                                                                                                                                  \n
                                                                                                                                  \n
                                                                                                                                  \n", + "templateUrl": [], + "viewProviders": [], + "hostDirectives": [], + "inputsClass": [ + { + "name": "config", + "deprecated": false, + "deprecationMessage": "", + "line": 28, + "type": "GalleryConfig", + "decorators": [] + }, + { + "name": "galleryId", + "deprecated": false, + "deprecationMessage": "", + "line": 26, + "type": "string", + "decorators": [] + }, + { + "name": "state", + "deprecated": false, + "deprecationMessage": "", + "line": 27, + "type": "GalleryState", + "decorators": [] + } + ], + "outputsClass": [], + "propertiesClass": [ + { + "name": "gallery", + "deprecated": false, + "deprecationMessage": "", + "type": "Gallery", + "optional": false, + "description": "", + "line": 30, + "modifierKind": [ + 123 + ] + } + ], + "methodsClass": [], + "deprecated": false, + "deprecationMessage": "", + "hostBindings": [], + "hostListeners": [], + "standalone": true, + "imports": [ + { + "name": "CommonModule", + "type": "module" + } + ], + "description": "", + "rawdescription": "\n", + "type": "component", + "sourceCode": "import { Component, Input, ChangeDetectionStrategy } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { Gallery } from '../services/gallery.service';\r\nimport { GalleryState } from '../models/gallery.model';\r\nimport { GalleryConfig } from '../models/config.model';\r\n\r\n@Component({\r\n selector: 'gallery-bullets',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n styleUrls: ['./gallery-bullets.scss'],\r\n template: `\r\n
                                                                                                                                  \r\n
                                                                                                                                  \r\n
                                                                                                                                  \r\n `,\r\n standalone: true,\r\n imports: [CommonModule]\r\n})\r\nexport class GalleryBulletsComponent {\r\n\r\n @Input() galleryId: string;\r\n @Input() state: GalleryState;\r\n @Input() config: GalleryConfig;\r\n\r\n constructor(public gallery: Gallery) {\r\n }\r\n}\r\n", + "assetsDirs": [], + "styleUrlsData": [ + { + "data": ":host {\r\n position: absolute;\r\n left: 50%;\r\n z-index: 99;\r\n transform: translateX(-50%);\r\n display: flex;\r\n gap: 6px;\r\n top: var(--bullets-top);\r\n bottom: var(--bullets-bottom);\r\n}\r\n\r\n:host,\r\n.g-bullet,\r\n.g-bullet-inner {\r\n display: flex;\r\n justify-content: center;\r\n align-items: center;\r\n}\r\n\r\n.g-bullet {\r\n cursor: var(--bullets-cursor);\r\n z-index: 20;\r\n\r\n &:hover .g-bullet-inner {\r\n opacity: var(--bullets-hover-opacity);\r\n }\r\n}\r\n\r\n.g-bullet-active .g-bullet-inner {\r\n opacity: var(--bullets-active-opacity);\r\n}\r\n\r\n.g-bullet-inner {\r\n background-color: var(--g-overlay-color);\r\n opacity: var(--bullets-opacity);\r\n width: 100%;\r\n height: 100%;\r\n border-radius: 50%;\r\n transition: opacity linear 150ms;\r\n}\r\n", + "styleUrl": "./gallery-bullets.scss" + } + ], + "stylesData": "", + "constructorObj": { + "name": "constructor", + "description": "", + "deprecated": false, + "deprecationMessage": "", + "args": [ + { + "name": "gallery", + "type": "Gallery", + "deprecated": false, + "deprecationMessage": "" + } + ], + "line": 28, + "jsdoctags": [ + { + "name": "gallery", + "type": "Gallery", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + } + ] + } + }, + { + "name": "GalleryComponent", + "id": "component-GalleryComponent-f3b9b0d77cae1496c5a5c79a0e7db4e8fedbebb04a0a06c6e0f96b3d2c5070592a99c09c2dcac483b020014785602acb85805507536bb2891fbd5a2bdf8e4238", + "file": "projects/ng-gallery/src/lib/components/gallery.component.ts", + "changeDetection": "ChangeDetectionStrategy.OnPush", + "encapsulation": [], + "entryComponents": [], + "inputs": [], + "outputs": [], + "providers": [ + { + "name": "ImgManager" + } + ], + "selector": "gallery", + "styleUrls": [ + "./gallery.scss" + ], + "styles": [], + "template": "\n", + "templateUrl": [], + "viewProviders": [], + "hostDirectives": [], + "inputsClass": [ + { + "required": false, + "name": "autoHeight", + "defaultValue": "this._gallery.config.autoHeight", + "deprecated": false, + "deprecationMessage": "", + "rawdescription": "\n\nAutomatically adjusts the gallery's height to fit the content\n", + "description": "

                                                                                                                                  Automatically adjusts the gallery's height to fit the content

                                                                                                                                  \n", + "line": 121, + "type": "boolean", + "decorators": [] + }, + { + "required": false, + "name": "autoplay", + "defaultValue": "this._gallery.config.autoplay", + "deprecated": false, + "deprecationMessage": "", + "rawdescription": "\n\nAutomatically cycle through items at time interval\n", + "description": "

                                                                                                                                  Automatically cycle through items at time interval

                                                                                                                                  \n", + "line": 126, + "type": "boolean", + "decorators": [] + }, + { + "required": false, + "name": "autoplayInterval", + "defaultValue": "this._gallery.config.autoplayInterval", + "deprecated": false, + "deprecationMessage": "", + "rawdescription": "\n\nSets the interval used for the autoplay feature\n", + "description": "

                                                                                                                                  Sets the interval used for the autoplay feature

                                                                                                                                  \n", + "line": 181, + "type": "number", + "decorators": [] + }, + { + "name": "bulletPosition", + "defaultValue": "this._gallery.config.bulletPosition", + "deprecated": false, + "deprecationMessage": "", + "rawdescription": "\n\nSets the bullets navigation position\n", + "description": "

                                                                                                                                  Sets the bullets navigation position

                                                                                                                                  \n", + "line": 216, + "type": "\"top\" | \"bottom\"", + "decorators": [] + }, + { + "required": false, + "name": "bullets", + "defaultValue": "this._gallery.config.bullets", + "deprecated": false, + "deprecationMessage": "", + "rawdescription": "\n\nDisplays the navigation bullets\n", + "description": "

                                                                                                                                  Displays the navigation bullets

                                                                                                                                  \n", + "line": 77, + "type": "boolean", + "decorators": [] + }, + { + "required": false, + "name": "bulletSize", + "defaultValue": "this._gallery.config.bulletSize", + "deprecated": false, + "deprecationMessage": "", + "rawdescription": "\n\nSets the size of the bullets navigation\n", + "description": "

                                                                                                                                  Sets the size of the bullets navigation

                                                                                                                                  \n", + "line": 166, + "type": "number", + "decorators": [] + }, + { + "required": false, + "name": "counter", + "defaultValue": "this._gallery.config.counter", + "deprecated": false, + "deprecationMessage": "", + "rawdescription": "\n\nDisplays the counter or pagination\n", + "description": "

                                                                                                                                  Displays the counter or pagination

                                                                                                                                  \n", + "line": 97, + "type": "boolean", + "decorators": [] + }, + { + "name": "counterPosition", + "defaultValue": "this._gallery.config.counterPosition", + "deprecated": false, + "deprecationMessage": "", + "rawdescription": "\n\nSets the counter navigation position\n", + "description": "

                                                                                                                                  Sets the counter navigation position

                                                                                                                                  \n", + "line": 221, + "type": "\"top\" | \"bottom\"", + "decorators": [] + }, + { + "required": false, + "name": "debug", + "defaultValue": "this._gallery.config.debug", + "deprecated": false, + "deprecationMessage": "", + "rawdescription": "\n\nShow visuals that helps debugging the component\n", + "description": "

                                                                                                                                  Show visuals that helps debugging the component

                                                                                                                                  \n", + "line": 87, + "type": "boolean", + "decorators": [] + }, + { + "required": false, + "name": "detachThumbs", + "defaultValue": "this._gallery.config.detachThumbs", + "deprecated": false, + "deprecationMessage": "", + "rawdescription": "\n\nDe-attaching the thumbnails from the main slider\nIf enabled - thumbnails won't automatically scroll to the active thumbnails\n", + "description": "

                                                                                                                                  De-attaching the thumbnails from the main slider\nIf enabled - thumbnails won't automatically scroll to the active thumbnails

                                                                                                                                  \n", + "line": 103, + "type": "boolean", + "decorators": [] + }, + { + "required": false, + "name": "disableBullets", + "defaultValue": "this._gallery.config.disableBullets", + "deprecated": false, + "deprecationMessage": "", + "rawdescription": "\n\nDisables bullets' clicks\n", + "description": "

                                                                                                                                  Disables bullets' clicks

                                                                                                                                  \n", + "line": 136, + "type": "boolean", + "decorators": [] + }, + { + "required": false, + "name": "disableMouseScroll", + "defaultValue": "this._gallery.config.disableMouseScroll", + "deprecated": false, + "deprecationMessage": "", + "rawdescription": "\n\nDisables sliding using the mouse\n", + "description": "

                                                                                                                                  Disables sliding using the mouse

                                                                                                                                  \n", + "line": 156, + "type": "boolean", + "decorators": [] + }, + { + "required": false, + "name": "disableScroll", + "defaultValue": "this._gallery.config.disableScroll", + "deprecated": false, + "deprecationMessage": "", + "rawdescription": "\n\nDisables sliding using mousewheel, touchpad, scroll and gestures on touch devices\n", + "description": "

                                                                                                                                  Disables sliding using mousewheel, touchpad, scroll and gestures on touch devices

                                                                                                                                  \n", + "line": 141, + "type": "boolean", + "decorators": [] + }, + { + "required": false, + "name": "disableThumbMouseScroll", + "defaultValue": "this._gallery.config.disableThumbMouseScroll", + "deprecated": false, + "deprecationMessage": "", + "rawdescription": "\n\nDisables sliding of thumbnails using the mouse\n", + "description": "

                                                                                                                                  Disables sliding of thumbnails using the mouse

                                                                                                                                  \n", + "line": 161, + "type": "boolean", + "decorators": [] + }, + { + "required": false, + "name": "disableThumbs", + "defaultValue": "this._gallery.config.disableThumbs", + "deprecated": false, + "deprecationMessage": "", + "rawdescription": "\n\nDisables thumbnails' clicks\n", + "description": "

                                                                                                                                  Disables thumbnails' clicks

                                                                                                                                  \n", + "line": 131, + "type": "boolean", + "decorators": [] + }, + { + "required": false, + "name": "disableThumbScroll", + "defaultValue": "this._gallery.config.disableThumbScroll", + "deprecated": false, + "deprecationMessage": "", + "rawdescription": "\n\nDisables sliding of thumbnails using touchpad, scroll and gestures on touch devices\n", + "description": "

                                                                                                                                  Disables sliding of thumbnails using touchpad, scroll and gestures on touch devices

                                                                                                                                  \n", + "line": 146, + "type": "boolean", + "decorators": [] + }, + { + "name": "id", + "defaultValue": "'root'", + "deprecated": false, + "deprecationMessage": "", + "rawdescription": "\n\nThe gallery instance unique id, required if more multiple gallery instances\n", + "description": "

                                                                                                                                  The gallery instance unique id, required if more multiple gallery instances

                                                                                                                                  \n", + "line": 62, + "type": "string", + "decorators": [] + }, + { + "name": "imageSize", + "defaultValue": "this._gallery.config.imageSize", + "deprecated": false, + "deprecationMessage": "", + "rawdescription": "\n\nSets the object-fit style applied on items' images\n", + "description": "

                                                                                                                                  Sets the object-fit style applied on items' images

                                                                                                                                  \n", + "line": 206, + "type": "\"cover\" | \"contain\"", + "decorators": [] + }, + { + "required": false, + "name": "itemAutosize", + "defaultValue": "this._gallery.config.itemAutosize", + "deprecated": false, + "deprecationMessage": "", + "rawdescription": "\n\nFits each item size to its content, This option should be used with:\n- Does not work if `autoHeight` is turned on\n- Does not work properly unless `loadingAttr=\"eager\"`\n- Does not work properly unless `loadingStrategy=\"preload\"`\n", + "description": "

                                                                                                                                  Fits each item size to its content, This option should be used with:

                                                                                                                                  \n
                                                                                                                                    \n
                                                                                                                                  • Does not work if autoHeight is turned on
                                                                                                                                  • \n
                                                                                                                                  • Does not work properly unless loadingAttr="eager"
                                                                                                                                  • \n
                                                                                                                                  • Does not work properly unless loadingStrategy="preload"
                                                                                                                                  • \n
                                                                                                                                  \n", + "line": 116, + "type": "boolean", + "decorators": [] + }, + { + "name": "items", + "deprecated": false, + "deprecationMessage": "", + "rawdescription": "\n\nLoads the items array into the gallery\n", + "description": "

                                                                                                                                  Loads the items array into the gallery

                                                                                                                                  \n", + "line": 67, + "type": "GalleryItem[]", + "decorators": [] + }, + { + "name": "loadingAttr", + "defaultValue": "this._gallery.config.loadingAttr", + "deprecated": false, + "deprecationMessage": "", + "rawdescription": "\n\nSets the loading attribute applied on the items' images\n", + "description": "

                                                                                                                                  Sets the loading attribute applied on the items' images

                                                                                                                                  \n", + "line": 231, + "type": "\"eager\" | \"lazy\"", + "decorators": [] + }, + { + "name": "loadingStrategy", + "defaultValue": "this._gallery.config.loadingStrategy", + "deprecated": false, + "deprecationMessage": "", + "rawdescription": "\n\nSets the loading strategy used for displaying the items\n- `lazy` renders only the active item\n- `default` renders only the active item, the previous item and the next item\n- `preload` renders all the items, this option is required for `thumbAutoSize` is enabled\n", + "description": "

                                                                                                                                  Sets the loading strategy used for displaying the items

                                                                                                                                  \n
                                                                                                                                    \n
                                                                                                                                  • lazy renders only the active item
                                                                                                                                  • \n
                                                                                                                                  • default renders only the active item, the previous item and the next item
                                                                                                                                  • \n
                                                                                                                                  • preload renders all the items, this option is required for thumbAutoSize is enabled
                                                                                                                                  • \n
                                                                                                                                  \n", + "line": 239, + "type": "\"preload\" | \"lazy\" | \"default\"", + "decorators": [] + }, + { + "required": false, + "name": "loop", + "defaultValue": "this._gallery.config.loop", + "deprecated": false, + "deprecationMessage": "", + "rawdescription": "\n\nEnables loop cycling\n", + "description": "

                                                                                                                                  Enables loop cycling

                                                                                                                                  \n", + "line": 82, + "type": "boolean", + "decorators": [] + }, + { + "required": false, + "name": "nav", + "defaultValue": "this._gallery.config.nav", + "deprecated": false, + "deprecationMessage": "", + "rawdescription": "\n\nDisplays the navigation buttons\n", + "description": "

                                                                                                                                  Displays the navigation buttons

                                                                                                                                  \n", + "line": 72, + "type": "boolean", + "decorators": [] + }, + { + "name": "orientation", + "defaultValue": "this._gallery.config.orientation", + "deprecated": false, + "deprecationMessage": "", + "rawdescription": "\n\nSets the sliding direction\n", + "description": "

                                                                                                                                  Sets the sliding direction

                                                                                                                                  \n", + "line": 226, + "type": "\"horizontal\" | \"vertical\"", + "decorators": [] + }, + { + "required": false, + "name": "resizeDebounceTime", + "defaultValue": "this._gallery.config.resizeDebounceTime", + "deprecated": false, + "deprecationMessage": "", + "rawdescription": "\n\nSets the debounce time used to throttle the gallery update after it is resized\n", + "description": "

                                                                                                                                  Sets the debounce time used to throttle the gallery update after it is resized

                                                                                                                                  \n", + "line": 191, + "type": "number", + "decorators": [] + }, + { + "name": "scrollBehavior", + "defaultValue": "this._gallery.config.scrollBehavior", + "deprecated": false, + "deprecationMessage": "", + "rawdescription": "\n\nSets the scroll behavior when the active item is changed\n", + "description": "

                                                                                                                                  Sets the scroll behavior when the active item is changed

                                                                                                                                  \n", + "line": 196, + "type": "ScrollBehavior", + "decorators": [] + }, + { + "required": false, + "name": "scrollDuration", + "defaultValue": "this._gallery.config.scrollDuration", + "deprecated": false, + "deprecationMessage": "", + "rawdescription": "\n\nSets the duration used for smooth navigation between the items\n", + "description": "

                                                                                                                                  Sets the duration used for smooth navigation between the items

                                                                                                                                  \n", + "line": 186, + "type": "number", + "decorators": [] + }, + { + "name": "scrollEase", + "defaultValue": "this._gallery.config.scrollEase", + "deprecated": false, + "deprecationMessage": "", + "rawdescription": "\n\nSets the ease function used for smooth navigation between the items\n", + "description": "

                                                                                                                                  Sets the ease function used for smooth navigation between the items

                                                                                                                                  \n", + "line": 201, + "type": "BezierEasingOptions", + "decorators": [] + }, + { + "required": false, + "name": "thumbAutosize", + "defaultValue": "this._gallery.config.thumbAutosize", + "deprecated": false, + "deprecationMessage": "", + "rawdescription": "\n\nFits each thumbnail size to its content\n", + "description": "

                                                                                                                                  Fits each thumbnail size to its content

                                                                                                                                  \n", + "line": 108, + "type": "boolean", + "decorators": [] + }, + { + "required": false, + "name": "thumbCentralized", + "defaultValue": "this._gallery.config.thumbCentralized", + "deprecated": false, + "deprecationMessage": "", + "rawdescription": "\n\nForce centralizing the active thumbnail\n", + "description": "

                                                                                                                                  Force centralizing the active thumbnail

                                                                                                                                  \n", + "line": 151, + "type": "boolean", + "decorators": [] + }, + { + "required": false, + "name": "thumbHeight", + "defaultValue": "this._gallery.config.thumbHeight", + "deprecated": false, + "deprecationMessage": "", + "rawdescription": "\n\nSets the thumbnail's height\n", + "description": "

                                                                                                                                  Sets the thumbnail's height

                                                                                                                                  \n", + "line": 176, + "type": "number", + "decorators": [] + }, + { + "name": "thumbImageSize", + "defaultValue": "this._gallery.config.thumbImageSize", + "deprecated": false, + "deprecationMessage": "", + "rawdescription": "\n\nSets the object-fit style applied on thumbnails' images\n", + "description": "

                                                                                                                                  Sets the object-fit style applied on thumbnails' images

                                                                                                                                  \n", + "line": 211, + "type": "\"cover\" | \"contain\"", + "decorators": [] + }, + { + "name": "thumbPosition", + "defaultValue": "this._gallery.config.thumbPosition", + "deprecated": false, + "deprecationMessage": "", + "rawdescription": "\n\nSets the thumbnails position, it also sets the sliding direction of the thumbnails accordingly\n", + "description": "

                                                                                                                                  Sets the thumbnails position, it also sets the sliding direction of the thumbnails accordingly

                                                                                                                                  \n", + "line": 244, + "type": "\"top\" | \"left\" | \"right\" | \"bottom\"", + "decorators": [] + }, + { + "required": false, + "name": "thumbs", + "defaultValue": "this._gallery.config.thumbs", + "deprecated": false, + "deprecationMessage": "", + "rawdescription": "\n\nDisplays the thumbnails\n", + "description": "

                                                                                                                                  Displays the thumbnails

                                                                                                                                  \n", + "line": 92, + "type": "boolean", + "decorators": [] + }, + { + "required": false, + "name": "thumbWidth", + "defaultValue": "this._gallery.config.thumbWidth", + "deprecated": false, + "deprecationMessage": "", + "rawdescription": "\n\nSets the thumbnail's width\n", + "description": "

                                                                                                                                  Sets the thumbnail's width

                                                                                                                                  \n", + "line": 171, + "type": "number", + "decorators": [] + } + ], + "outputsClass": [ + { + "name": "error", + "defaultValue": "new EventEmitter()", + "deprecated": false, + "deprecationMessage": "", + "rawdescription": "\n\nStream that emits when an error occurs, this would emit for loading errors of image and video items only\n", + "description": "

                                                                                                                                  Stream that emits when an error occurs, this would emit for loading errors of image and video items only

                                                                                                                                  \n", + "line": 288, + "type": "EventEmitter" + }, + { + "name": "indexChange", + "defaultValue": "new EventEmitter()", + "deprecated": false, + "deprecationMessage": "", + "rawdescription": "\n\nStream that emits when index is changed\n", + "description": "

                                                                                                                                  Stream that emits when index is changed

                                                                                                                                  \n", + "line": 278, + "type": "EventEmitter" + }, + { + "name": "itemClick", + "defaultValue": "new EventEmitter()", + "deprecated": false, + "deprecationMessage": "", + "rawdescription": "\n\nStream that emits when an item is clicked\n", + "description": "

                                                                                                                                  Stream that emits when an item is clicked

                                                                                                                                  \n", + "line": 263, + "type": "EventEmitter" + }, + { + "name": "itemsChange", + "defaultValue": "new EventEmitter()", + "deprecated": false, + "deprecationMessage": "", + "rawdescription": "\n\nStream that emits when items array is changed\n", + "description": "

                                                                                                                                  Stream that emits when items array is changed

                                                                                                                                  \n", + "line": 283, + "type": "EventEmitter" + }, + { + "name": "playingChange", + "defaultValue": "new EventEmitter()", + "deprecated": false, + "deprecationMessage": "", + "rawdescription": "\n\nStream that emits when player state is changed\n", + "description": "

                                                                                                                                  Stream that emits when player state is changed

                                                                                                                                  \n", + "line": 273, + "type": "EventEmitter" + }, + { + "name": "thumbClick", + "defaultValue": "new EventEmitter()", + "deprecated": false, + "deprecationMessage": "", + "rawdescription": "\n\nStream that emits when a thumbnail is clicked\n", + "description": "

                                                                                                                                  Stream that emits when a thumbnail is clicked

                                                                                                                                  \n", + "line": 268, + "type": "EventEmitter" + } + ], + "propertiesClass": [ + { + "name": "galleryRef", + "deprecated": false, + "deprecationMessage": "", + "type": "GalleryRef", + "optional": false, + "description": "

                                                                                                                                  The gallery reference instance

                                                                                                                                  \n", + "line": 57, + "rawdescription": "\n\nThe gallery reference instance\n" + } + ], + "methodsClass": [ + { + "name": "add", + "args": [ + { + "name": "item", + "type": "GalleryItem", + "deprecated": false, + "deprecationMessage": "" + }, + { + "name": "active", + "type": "boolean", + "deprecated": false, + "deprecationMessage": "", + "optional": true + } + ], + "optional": false, + "returnType": "void", + "typeParameters": [], + "line": 451, + "deprecated": false, + "deprecationMessage": "", + "rawdescription": "\n\nAdd gallery item, it can be any item, suitable to add item with a custom template\n", + "description": "

                                                                                                                                  Add gallery item, it can be any item, suitable to add item with a custom template

                                                                                                                                  \n", + "jsdoctags": [ + { + "name": "item", + "type": "GalleryItem", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + }, + { + "name": "active", + "type": "boolean", + "deprecated": false, + "deprecationMessage": "", + "optional": true, + "tagName": { + "text": "param" + } + } + ] + }, + { + "name": "addIframe", + "args": [ + { + "name": "data", + "type": "IframeItemData", + "deprecated": false, + "deprecationMessage": "" + }, + { + "name": "active", + "type": "boolean", + "deprecated": false, + "deprecationMessage": "", + "optional": true + } + ], + "optional": false, + "returnType": "void", + "typeParameters": [], + "line": 472, + "deprecated": false, + "deprecationMessage": "", + "rawdescription": "\n\nAdd iframe item\n", + "description": "

                                                                                                                                  Add iframe item

                                                                                                                                  \n", + "jsdoctags": [ + { + "name": "data", + "type": "IframeItemData", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + }, + { + "name": "active", + "type": "boolean", + "deprecated": false, + "deprecationMessage": "", + "optional": true, + "tagName": { + "text": "param" + } + } + ] + }, + { + "name": "addImage", + "args": [ + { + "name": "data", + "type": "ImageItemData", + "deprecated": false, + "deprecationMessage": "" + }, + { + "name": "active", + "type": "boolean", + "deprecated": false, + "deprecationMessage": "", + "optional": true + } + ], + "optional": false, + "returnType": "void", + "typeParameters": [], + "line": 458, + "deprecated": false, + "deprecationMessage": "", + "rawdescription": "\n\nAdd image item\n", + "description": "

                                                                                                                                  Add image item

                                                                                                                                  \n", + "jsdoctags": [ + { + "name": "data", + "type": "ImageItemData", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + }, + { + "name": "active", + "type": "boolean", + "deprecated": false, + "deprecationMessage": "", + "optional": true, + "tagName": { + "text": "param" + } + } + ] + }, + { + "name": "addVideo", + "args": [ + { + "name": "data", + "type": "VideoItemData", + "deprecated": false, + "deprecationMessage": "" + }, + { + "name": "active", + "type": "boolean", + "deprecated": false, + "deprecationMessage": "", + "optional": true + } + ], + "optional": false, + "returnType": "void", + "typeParameters": [], + "line": 465, + "deprecated": false, + "deprecationMessage": "", + "rawdescription": "\n\nAdd video item\n", + "description": "

                                                                                                                                  Add video item

                                                                                                                                  \n", + "jsdoctags": [ + { + "name": "data", + "type": "VideoItemData", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + }, + { + "name": "active", + "type": "boolean", + "deprecated": false, + "deprecationMessage": "", + "optional": true, + "tagName": { + "text": "param" + } + } + ] + }, + { + "name": "addYoutube", + "args": [ + { + "name": "data", + "type": "YoutubeItemData", + "deprecated": false, + "deprecationMessage": "" + }, + { + "name": "active", + "type": "boolean", + "deprecated": false, + "deprecationMessage": "", + "optional": true + } + ], + "optional": false, + "returnType": "void", + "typeParameters": [], + "line": 479, + "deprecated": false, + "deprecationMessage": "", + "rawdescription": "\n\nAdd Youtube item\n", + "description": "

                                                                                                                                  Add Youtube item

                                                                                                                                  \n", + "jsdoctags": [ + { + "name": "data", + "type": "YoutubeItemData", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + }, + { + "name": "active", + "type": "boolean", + "deprecated": false, + "deprecationMessage": "", + "optional": true, + "tagName": { + "text": "param" + } + } + ] + }, + { + "name": "load", + "args": [ + { + "name": "items", + "type": "GalleryItem[]", + "deprecated": false, + "deprecationMessage": "" + } + ], + "optional": false, + "returnType": "void", + "typeParameters": [], + "line": 444, + "deprecated": false, + "deprecationMessage": "", + "rawdescription": "\n\nLoad items and reset the state\n", + "description": "

                                                                                                                                  Load items and reset the state

                                                                                                                                  \n", + "jsdoctags": [ + { + "name": "items", + "type": "GalleryItem[]", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + } + ] + }, + { + "name": "next", + "args": [ + { + "name": "behavior", + "type": "ScrollBehavior", + "deprecated": false, + "deprecationMessage": "", + "optional": true + }, + { + "name": "loop", + "type": "boolean", + "deprecated": false, + "deprecationMessage": "", + "optional": true + } + ], + "optional": false, + "returnType": "void", + "typeParameters": [], + "line": 493, + "deprecated": false, + "deprecationMessage": "", + "rawdescription": "\n\nGo to next item\n", + "description": "

                                                                                                                                  Go to next item

                                                                                                                                  \n", + "jsdoctags": [ + { + "name": "behavior", + "type": "ScrollBehavior", + "deprecated": false, + "deprecationMessage": "", + "optional": true, + "tagName": { + "text": "param" + } + }, + { + "name": "loop", + "type": "boolean", + "deprecated": false, + "deprecationMessage": "", + "optional": true, + "tagName": { + "text": "param" + } + } + ] + }, + { + "name": "play", + "args": [ + { + "name": "interval", + "type": "number", + "deprecated": false, + "deprecationMessage": "", + "optional": true + } + ], + "optional": false, + "returnType": "void", + "typeParameters": [], + "line": 521, + "deprecated": false, + "deprecationMessage": "", + "rawdescription": "\n\nStart the player\n", + "description": "

                                                                                                                                  Start the player

                                                                                                                                  \n", + "jsdoctags": [ + { + "name": "interval", + "type": "number", + "deprecated": false, + "deprecationMessage": "", + "optional": true, + "tagName": { + "text": "param" + } + } + ] + }, + { + "name": "prev", + "args": [ + { + "name": "behavior", + "type": "ScrollBehavior", + "deprecated": false, + "deprecationMessage": "", + "optional": true + }, + { + "name": "loop", + "type": "boolean", + "deprecated": false, + "deprecationMessage": "", + "optional": true + } + ], + "optional": false, + "returnType": "void", + "typeParameters": [], + "line": 500, + "deprecated": false, + "deprecationMessage": "", + "rawdescription": "\n\nGo to prev item\n", + "description": "

                                                                                                                                  Go to prev item

                                                                                                                                  \n", + "jsdoctags": [ + { + "name": "behavior", + "type": "ScrollBehavior", + "deprecated": false, + "deprecationMessage": "", + "optional": true, + "tagName": { + "text": "param" + } + }, + { + "name": "loop", + "type": "boolean", + "deprecated": false, + "deprecationMessage": "", + "optional": true, + "tagName": { + "text": "param" + } + } + ] + }, + { + "name": "remove", + "args": [ + { + "name": "i", + "type": "number", + "deprecated": false, + "deprecationMessage": "" + } + ], + "optional": false, + "returnType": "void", + "typeParameters": [], + "line": 486, + "deprecated": false, + "deprecationMessage": "", + "rawdescription": "\n\nRemove gallery item by index\n", + "description": "

                                                                                                                                  Remove gallery item by index

                                                                                                                                  \n", + "jsdoctags": [ + { + "name": "i", + "type": "number", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + } + ] + }, + { + "name": "reset", + "args": [], + "optional": false, + "returnType": "void", + "typeParameters": [], + "line": 514, + "deprecated": false, + "deprecationMessage": "", + "rawdescription": "\n\nReset to initial state\n", + "description": "

                                                                                                                                  Reset to initial state

                                                                                                                                  \n" + }, + { + "name": "set", + "args": [ + { + "name": "i", + "type": "number", + "deprecated": false, + "deprecationMessage": "" + }, + { + "name": "behavior", + "type": "ScrollBehavior", + "deprecated": false, + "deprecationMessage": "", + "optional": true + } + ], + "optional": false, + "returnType": "void", + "typeParameters": [], + "line": 507, + "deprecated": false, + "deprecationMessage": "", + "rawdescription": "\n\nSet active item\n", + "description": "

                                                                                                                                  Set active item

                                                                                                                                  \n", + "jsdoctags": [ + { + "name": "i", + "type": "number", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + }, + { + "name": "behavior", + "type": "ScrollBehavior", + "deprecated": false, + "deprecationMessage": "", + "optional": true, + "tagName": { + "text": "param" + } + } + ] + }, + { + "name": "stop", + "args": [], + "optional": false, + "returnType": "void", + "typeParameters": [], + "line": 528, + "deprecated": false, + "deprecationMessage": "", + "rawdescription": "\n\nStop the player\n", + "description": "

                                                                                                                                  Stop the player

                                                                                                                                  \n" + } + ], + "deprecated": false, + "deprecationMessage": "", + "hostBindings": [], + "hostListeners": [], + "standalone": true, + "imports": [ + { + "name": "CommonModule", + "type": "module" + }, + { + "name": "GalleryCoreComponent", + "type": "component" + }, + { + "name": "AutoplayDirective", + "type": "directive" + } + ], + "description": "

                                                                                                                                  Gallery component

                                                                                                                                  \n", + "rawdescription": "\n\nGallery component\n", + "type": "component", + "sourceCode": "import {\r\n Component,\r\n Input,\r\n Output,\r\n ContentChild,\r\n booleanAttribute,\r\n numberAttribute,\r\n EventEmitter,\r\n OnInit,\r\n AfterContentInit,\r\n OnChanges,\r\n OnDestroy,\r\n SimpleChanges,\r\n ChangeDetectionStrategy\r\n} from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { Subscription } from 'rxjs';\r\nimport { GalleryCoreComponent } from './gallery-core.component';\r\nimport { Gallery } from '../services/gallery.service';\r\nimport { GalleryRef } from '../services/gallery-ref';\r\nimport { GalleryError, GalleryItem, GalleryState } from '../models/gallery.model';\r\nimport { IframeItemData, ImageItemData, VideoItemData, YoutubeItemData } from './templates/items.model';\r\nimport { GalleryConfig } from '../models/config.model';\r\nimport { BezierEasingOptions } from '../smooth-scroll';\r\nimport { GalleryImageDef } from '../directives/gallery-image-def.directive';\r\nimport { GalleryThumbDef } from '../directives/gallery-thumb-def.directive';\r\nimport { GalleryItemDef } from '../directives/gallery-item-def.directive';\r\nimport { GalleryBoxDef } from '../directives/gallery-box-def.directive';\r\nimport { ImgManager } from '../utils/img-manager';\r\nimport { AutoplayDirective } from '../autoplay/autoplay.directive';\r\n\r\n/**\r\n * Gallery component\r\n */\r\n@Component({\r\n selector: 'gallery',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n styleUrls: ['./gallery.scss'],\r\n template: `\r\n \r\n `,\r\n standalone: true,\r\n imports: [CommonModule, GalleryCoreComponent, AutoplayDirective],\r\n providers: [ImgManager]\r\n})\r\nexport class GalleryComponent implements OnInit, AfterContentInit, OnChanges, OnDestroy {\r\n\r\n /**\r\n * The gallery reference instance\r\n */\r\n galleryRef: GalleryRef;\r\n\r\n /**\r\n * The gallery instance unique id, required if more multiple gallery instances\r\n */\r\n @Input() id: string = 'root';\r\n\r\n /**\r\n * Loads the items array into the gallery\r\n */\r\n @Input() items: GalleryItem [];\r\n\r\n /**\r\n * Displays the navigation buttons\r\n */\r\n @Input({ transform: booleanAttribute }) nav: boolean = this._gallery.config.nav;\r\n\r\n /**\r\n * Displays the navigation bullets\r\n */\r\n @Input({ transform: booleanAttribute }) bullets: boolean = this._gallery.config.bullets;\r\n\r\n /**\r\n * Enables loop cycling\r\n */\r\n @Input({ transform: booleanAttribute }) loop: boolean = this._gallery.config.loop;\r\n\r\n /**\r\n * Show visuals that helps debugging the component\r\n */\r\n @Input({ transform: booleanAttribute }) debug: boolean = this._gallery.config.debug;\r\n\r\n /**\r\n * Displays the thumbnails\r\n */\r\n @Input({ transform: booleanAttribute }) thumbs: boolean = this._gallery.config.thumbs;\r\n\r\n /**\r\n * Displays the counter or pagination\r\n */\r\n @Input({ transform: booleanAttribute }) counter: boolean = this._gallery.config.counter;\r\n\r\n /**\r\n * De-attaching the thumbnails from the main slider\r\n * If enabled - thumbnails won't automatically scroll to the active thumbnails\r\n */\r\n @Input({ transform: booleanAttribute }) detachThumbs: boolean = this._gallery.config.detachThumbs;\r\n\r\n /**\r\n * Fits each thumbnail size to its content\r\n */\r\n @Input({ transform: booleanAttribute }) thumbAutosize: boolean = this._gallery.config.thumbAutosize;\r\n\r\n /**\r\n * Fits each item size to its content, This option should be used with:\r\n * - Does not work if `autoHeight` is turned on\r\n * - Does not work properly unless `loadingAttr=\"eager\"`\r\n * - Does not work properly unless `loadingStrategy=\"preload\"`\r\n */\r\n @Input({ transform: booleanAttribute }) itemAutosize: boolean = this._gallery.config.itemAutosize;\r\n\r\n /**\r\n * Automatically adjusts the gallery's height to fit the content\r\n */\r\n @Input({ transform: booleanAttribute }) autoHeight: boolean = this._gallery.config.autoHeight;\r\n\r\n /**\r\n * Automatically cycle through items at time interval\r\n */\r\n @Input({ transform: booleanAttribute }) autoplay: boolean = this._gallery.config.autoplay;\r\n\r\n /**\r\n * Disables thumbnails' clicks\r\n */\r\n @Input({ transform: booleanAttribute }) disableThumbs: boolean = this._gallery.config.disableThumbs;\r\n\r\n /**\r\n * Disables bullets' clicks\r\n */\r\n @Input({ transform: booleanAttribute }) disableBullets: boolean = this._gallery.config.disableBullets;\r\n\r\n /**\r\n * Disables sliding using mousewheel, touchpad, scroll and gestures on touch devices\r\n */\r\n @Input({ transform: booleanAttribute }) disableScroll: boolean = this._gallery.config.disableScroll;\r\n\r\n /**\r\n * Disables sliding of thumbnails using touchpad, scroll and gestures on touch devices\r\n */\r\n @Input({ transform: booleanAttribute }) disableThumbScroll: boolean = this._gallery.config.disableThumbScroll;\r\n\r\n /**\r\n * Force centralizing the active thumbnail\r\n */\r\n @Input({ transform: booleanAttribute }) thumbCentralized: boolean = this._gallery.config.thumbCentralized;\r\n\r\n /**\r\n * Disables sliding using the mouse\r\n */\r\n @Input({ transform: booleanAttribute }) disableMouseScroll: boolean = this._gallery.config.disableMouseScroll;\r\n\r\n /**\r\n * Disables sliding of thumbnails using the mouse\r\n */\r\n @Input({ transform: booleanAttribute }) disableThumbMouseScroll: boolean = this._gallery.config.disableThumbMouseScroll;\r\n\r\n /**\r\n * Sets the size of the bullets navigation\r\n */\r\n @Input({ transform: numberAttribute }) bulletSize: number = this._gallery.config.bulletSize;\r\n\r\n /**\r\n * Sets the thumbnail's width\r\n */\r\n @Input({ transform: numberAttribute }) thumbWidth: number = this._gallery.config.thumbWidth;\r\n\r\n /**\r\n * Sets the thumbnail's height\r\n */\r\n @Input({ transform: numberAttribute }) thumbHeight: number = this._gallery.config.thumbHeight;\r\n\r\n /**\r\n * Sets the interval used for the autoplay feature\r\n */\r\n @Input({ transform: numberAttribute }) autoplayInterval: number = this._gallery.config.autoplayInterval;\r\n\r\n /**\r\n * Sets the duration used for smooth navigation between the items\r\n */\r\n @Input({ transform: numberAttribute }) scrollDuration: number = this._gallery.config.scrollDuration;\r\n\r\n /**\r\n * Sets the debounce time used to throttle the gallery update after it is resized\r\n */\r\n @Input({ transform: numberAttribute }) resizeDebounceTime: number = this._gallery.config.resizeDebounceTime;\r\n\r\n /**\r\n * Sets the scroll behavior when the active item is changed\r\n */\r\n @Input() scrollBehavior: ScrollBehavior = this._gallery.config.scrollBehavior;\r\n\r\n /**\r\n * Sets the ease function used for smooth navigation between the items\r\n */\r\n @Input() scrollEase: BezierEasingOptions = this._gallery.config.scrollEase;\r\n\r\n /**\r\n * Sets the object-fit style applied on items' images\r\n */\r\n @Input() imageSize: 'cover' | 'contain' = this._gallery.config.imageSize;\r\n\r\n /**\r\n * Sets the object-fit style applied on thumbnails' images\r\n */\r\n @Input() thumbImageSize: 'cover' | 'contain' = this._gallery.config.thumbImageSize;\r\n\r\n /**\r\n * Sets the bullets navigation position\r\n */\r\n @Input() bulletPosition: 'top' | 'bottom' = this._gallery.config.bulletPosition;\r\n\r\n /**\r\n * Sets the counter navigation position\r\n */\r\n @Input() counterPosition: 'top' | 'bottom' = this._gallery.config.counterPosition;\r\n\r\n /**\r\n * Sets the sliding direction\r\n */\r\n @Input() orientation: 'horizontal' | 'vertical' = this._gallery.config.orientation;\r\n\r\n /**\r\n * Sets the loading attribute applied on the items' images\r\n */\r\n @Input() loadingAttr: 'eager' | 'lazy' = this._gallery.config.loadingAttr;\r\n\r\n /**\r\n * Sets the loading strategy used for displaying the items\r\n * - `lazy` renders only the active item\r\n * - `default` renders only the active item, the previous item and the next item\r\n * - `preload` renders all the items, this option is required for `thumbAutoSize` is enabled\r\n */\r\n @Input() loadingStrategy: 'preload' | 'lazy' | 'default' = this._gallery.config.loadingStrategy;\r\n\r\n /**\r\n * Sets the thumbnails position, it also sets the sliding direction of the thumbnails accordingly\r\n */\r\n @Input() thumbPosition: 'top' | 'left' | 'right' | 'bottom' = this._gallery.config.thumbPosition;\r\n\r\n /**\r\n * Destroy gallery ref on component destroy event\r\n * This intended to be used and disabled from the lightbox component\r\n * @ignore\r\n * */\r\n @Input() destroyRef: boolean = true;\r\n\r\n /**\r\n * Skip initializing the config with components inputs (Lightbox mode)\r\n * This intended to be used and enabled from the lightbox component\r\n * @ignore\r\n */\r\n @Input() skipInitConfig: boolean = false;\r\n\r\n /**\r\n * Stream that emits when an item is clicked\r\n */\r\n @Output() itemClick: EventEmitter = new EventEmitter();\r\n\r\n /**\r\n * Stream that emits when a thumbnail is clicked\r\n */\r\n @Output() thumbClick: EventEmitter = new EventEmitter();\r\n\r\n /**\r\n * Stream that emits when player state is changed\r\n */\r\n @Output() playingChange: EventEmitter = new EventEmitter();\r\n\r\n /**\r\n * Stream that emits when index is changed\r\n */\r\n @Output() indexChange: EventEmitter = new EventEmitter();\r\n\r\n /**\r\n * Stream that emits when items array is changed\r\n */\r\n @Output() itemsChange: EventEmitter = new EventEmitter();\r\n\r\n /**\r\n * Stream that emits when an error occurs, this would emit for loading errors of image and video items only\r\n */\r\n @Output() error: EventEmitter = new EventEmitter();\r\n\r\n /** @ignore */\r\n @ContentChild(GalleryItemDef) private _galleryItemDef: GalleryItemDef;\r\n /** @ignore */\r\n @ContentChild(GalleryImageDef) private _galleryImageDef: GalleryImageDef;\r\n /** @ignore */\r\n @ContentChild(GalleryThumbDef) private _galleryThumbDef: GalleryThumbDef;\r\n /** @ignore */\r\n @ContentChild(GalleryBoxDef) private _galleryBoxDef: GalleryBoxDef;\r\n\r\n /** @ignore */\r\n private _itemClick$: Subscription;\r\n /** @ignore */\r\n private _thumbClick$: Subscription;\r\n /** @ignore */\r\n private _itemChange$: Subscription;\r\n /** @ignore */\r\n private _indexChange$: Subscription;\r\n /** @ignore */\r\n private _playingChange$: Subscription;\r\n\r\n constructor(private _gallery: Gallery) {\r\n }\r\n\r\n /** @ignore */\r\n private getConfig(): GalleryConfig {\r\n return {\r\n nav: this.nav,\r\n bullets: this.bullets,\r\n loop: this.loop,\r\n debug: this.debug,\r\n thumbs: this.thumbs,\r\n counter: this.counter,\r\n autoplay: this.autoplay,\r\n bulletSize: this.bulletSize,\r\n imageSize: this.imageSize,\r\n thumbImageSize: this.thumbImageSize,\r\n scrollBehavior: this.scrollBehavior,\r\n thumbCentralized: this.thumbCentralized,\r\n thumbWidth: this.thumbWidth,\r\n thumbHeight: this.thumbHeight,\r\n scrollEase: this.scrollEase,\r\n bulletPosition: this.bulletPosition,\r\n loadingAttr: this.loadingAttr,\r\n detachThumbs: this.detachThumbs,\r\n thumbPosition: this.thumbPosition,\r\n autoplayInterval: this.autoplayInterval,\r\n counterPosition: this.counterPosition,\r\n loadingStrategy: this.loadingStrategy,\r\n scrollDuration: this.scrollDuration,\r\n orientation: this.orientation,\r\n resizeDebounceTime: this.resizeDebounceTime,\r\n disableBullets: this.disableBullets,\r\n disableThumbs: this.disableThumbs,\r\n disableScroll: this.disableScroll,\r\n disableThumbScroll: this.disableThumbScroll,\r\n disableMouseScroll: this.disableMouseScroll,\r\n disableThumbMouseScroll: this.disableThumbMouseScroll,\r\n thumbAutosize: this.thumbAutosize,\r\n itemAutosize: this.itemAutosize,\r\n autoHeight: this.autoHeight\r\n };\r\n }\r\n\r\n\r\n /** @ignore */\r\n ngOnChanges(changes: SimpleChanges): void {\r\n if (this.galleryRef) {\r\n this.galleryRef.setConfig(this.getConfig());\r\n\r\n if (changes.items && changes.items.currentValue !== changes.items.previousValue) {\r\n this.load(this.items);\r\n }\r\n }\r\n }\r\n\r\n\r\n /** @ignore */\r\n ngOnInit(): void {\r\n // Get gallery instance by id\r\n if (this.skipInitConfig) {\r\n this.galleryRef = this._gallery.ref(this.id);\r\n } else {\r\n this.galleryRef = this._gallery.ref(this.id, this.getConfig());\r\n }\r\n\r\n // Load gallery items\r\n this.load(this.items);\r\n\r\n // Subscribes to events on demand\r\n if (this.indexChange.observed) {\r\n this._indexChange$ = this.galleryRef.indexChanged.subscribe((state: GalleryState) => this.indexChange.emit(state));\r\n }\r\n if (this.itemsChange.observed) {\r\n this._itemChange$ = this.galleryRef.itemsChanged.subscribe((state: GalleryState) => this.itemsChange.emit(state));\r\n }\r\n if (this.playingChange.observed) {\r\n this._playingChange$ = this.galleryRef.playingChanged.subscribe((state: GalleryState) => this.playingChange.emit(state));\r\n }\r\n }\r\n\r\n /** @ignore */\r\n ngAfterContentInit(): void {\r\n const templateConfig: GalleryConfig = {};\r\n if (this._galleryItemDef) {\r\n templateConfig.itemTemplate = this._galleryItemDef.templateRef;\r\n }\r\n if (this._galleryImageDef) {\r\n templateConfig.imageTemplate = this._galleryImageDef.templateRef;\r\n }\r\n if (this._galleryThumbDef) {\r\n templateConfig.thumbTemplate = this._galleryThumbDef.templateRef;\r\n }\r\n if (this._galleryBoxDef) {\r\n templateConfig.boxTemplate = this._galleryBoxDef.templateRef;\r\n }\r\n if (Object.keys(templateConfig).length) {\r\n this.galleryRef.setConfig(templateConfig);\r\n }\r\n }\r\n\r\n /** @ignore */\r\n ngOnDestroy(): void {\r\n this._itemClick$?.unsubscribe();\r\n this._thumbClick$?.unsubscribe();\r\n this._itemChange$?.unsubscribe();\r\n this._indexChange$?.unsubscribe();\r\n this._playingChange$?.unsubscribe();\r\n if (this.destroyRef) {\r\n this.galleryRef?.destroy();\r\n }\r\n }\r\n\r\n /** @ignore */\r\n onItemClick(i: number): void {\r\n this.itemClick.emit(i);\r\n this.galleryRef.itemClick.next(i);\r\n }\r\n\r\n /** @ignore */\r\n onThumbClick(i: number): void {\r\n this.galleryRef.set(i);\r\n this.thumbClick.emit(i);\r\n this.galleryRef.thumbClick.next(i);\r\n }\r\n\r\n /** @ignore */\r\n onError(err: GalleryError): void {\r\n this.error.emit(err);\r\n this.galleryRef.error.next(err);\r\n }\r\n\r\n /**\r\n * Load items and reset the state\r\n */\r\n load(items: GalleryItem[]): void {\r\n this.galleryRef.load(items);\r\n }\r\n\r\n /**\r\n * Add gallery item, it can be any item, suitable to add item with a custom template\r\n */\r\n add(item: GalleryItem, active?: boolean): void {\r\n this.galleryRef.add(item, active);\r\n }\r\n\r\n /**\r\n * Add image item\r\n */\r\n addImage(data: ImageItemData, active?: boolean): void {\r\n this.galleryRef.addImage(data, active);\r\n }\r\n\r\n /**\r\n * Add video item\r\n */\r\n addVideo(data: VideoItemData, active?: boolean): void {\r\n this.galleryRef.addVideo(data, active);\r\n }\r\n\r\n /**\r\n * Add iframe item\r\n */\r\n addIframe(data: IframeItemData, active?: boolean): void {\r\n this.galleryRef.addIframe(data, active);\r\n }\r\n\r\n /**\r\n * Add Youtube item\r\n */\r\n addYoutube(data: YoutubeItemData, active?: boolean): void {\r\n this.galleryRef.addYoutube(data, active);\r\n }\r\n\r\n /**\r\n * Remove gallery item by index\r\n */\r\n remove(i: number): void {\r\n this.galleryRef.remove(i);\r\n }\r\n\r\n /**\r\n * Go to next item\r\n */\r\n next(behavior?: ScrollBehavior, loop?: boolean): void {\r\n this.galleryRef.next(behavior, loop);\r\n }\r\n\r\n /**\r\n * Go to prev item\r\n */\r\n prev(behavior?: ScrollBehavior, loop?: boolean): void {\r\n this.galleryRef.prev(behavior, loop);\r\n }\r\n\r\n /**\r\n * Set active item\r\n */\r\n set(i: number, behavior?: ScrollBehavior): void {\r\n this.galleryRef.set(i, behavior);\r\n }\r\n\r\n /**\r\n * Reset to initial state\r\n */\r\n reset(): void {\r\n this.galleryRef.reset();\r\n }\r\n\r\n /**\r\n * Start the player\r\n */\r\n play(interval?: number): void {\r\n this.galleryRef.play(interval);\r\n }\r\n\r\n /**\r\n * Stop the player\r\n */\r\n stop(): void {\r\n this.galleryRef.stop();\r\n }\r\n}\r\n", + "assetsDirs": [], + "styleUrlsData": [ + { + "data": ":host {\r\n position: relative;\r\n overflow: hidden;\r\n z-index: 1;\r\n display: flex;\r\n justify-content: center;\r\n align-items: center;\r\n background-color: black;\r\n\r\n --g-height-transition: height 468ms cubic-bezier(0.42, 0, 0.58, 1);\r\n --g-nav-drop-shadow: drop-shadow(0 0 2px rgba(0, 0, 0, 0.6));\r\n --g-box-shadow: 0 0 3px rgba(0, 0, 0, 0.6);\r\n --g-font-color: #000;\r\n --g-overlay-color: #fff;\r\n --g-gutter-size: 1px;\r\n\r\n &[gallerize] {\r\n --g-item-cursor: pointer;\r\n }\r\n}\r\n", + "styleUrl": "./gallery.scss" + } + ], + "stylesData": "", + "constructorObj": { + "name": "constructor", + "description": "", + "deprecated": false, + "deprecationMessage": "", + "args": [ + { + "name": "_gallery", + "type": "Gallery", + "deprecated": false, + "deprecationMessage": "" + } + ], + "line": 308, + "jsdoctags": [ + { + "name": "_gallery", + "type": "Gallery", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + } + ] + }, + "implements": [ + "OnInit", + "AfterContentInit", + "OnChanges", + "OnDestroy" + ] + }, + { + "name": "GalleryCoreComponent", + "id": "component-GalleryCoreComponent-514605865ce30ecc993dd769363ed85b2b4a73ad2e35e255bc6bf494a7fd417d17686b154afdb47ec6e1e2bfd947a7bf4bc8f1e5bbe16561c1540101ac9d6de1", + "file": "projects/ng-gallery/src/lib/components/gallery-core.component.ts", + "changeDetection": "ChangeDetectionStrategy.OnPush", + "encapsulation": [], + "entryComponents": [], + "inputs": [], + "outputs": [], + "providers": [], + "selector": "gallery-core", + "styleUrls": [ + "./gallery-core.scss", + "../styles/debug.scss" + ], + "styles": [], + "template": "\n\n
                                                                                                                                  \n \n\n 1\"\n [state]=\"state\"\n [config]=\"config\"\n [galleryId]=\"galleryId\"/>\n\n \n\n \n\n \n\n
                                                                                                                                  \n \n
                                                                                                                                  \n
                                                                                                                                  \n", + "templateUrl": [], + "viewProviders": [], + "hostDirectives": [], + "inputsClass": [ + { + "name": "config", + "deprecated": false, + "deprecationMessage": "", + "line": 71, + "type": "GalleryConfig", + "decorators": [] + }, + { + "name": "galleryId", + "deprecated": false, + "deprecationMessage": "", + "line": 69, + "type": "string", + "decorators": [] + }, + { + "name": "state", + "deprecated": false, + "deprecationMessage": "", + "line": 70, + "type": "GalleryState", + "decorators": [] + } + ], + "outputsClass": [ + { + "name": "error", + "defaultValue": "new EventEmitter()", + "deprecated": false, + "deprecationMessage": "", + "line": 74, + "type": "EventEmitter" + }, + { + "name": "itemClick", + "defaultValue": "new EventEmitter()", + "deprecated": false, + "deprecationMessage": "", + "line": 72, + "type": "EventEmitter" + }, + { + "name": "thumbClick", + "defaultValue": "new EventEmitter()", + "deprecated": false, + "deprecationMessage": "", + "line": 73, + "type": "EventEmitter" + } + ], + "propertiesClass": [], + "methodsClass": [ + { + "name": "ngOnChanges", + "args": [ + { + "name": "changes", + "type": "SimpleChanges", + "deprecated": false, + "deprecationMessage": "" + } + ], + "optional": false, + "returnType": "void", + "typeParameters": [], + "line": 154, + "deprecated": false, + "deprecationMessage": "", + "jsdoctags": [ + { + "name": "changes", + "type": "SimpleChanges", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + } + ] + } + ], + "deprecated": false, + "deprecationMessage": "", + "hostBindings": [ + { + "name": "attr.autoHeight", + "deprecated": false, + "deprecationMessage": "", + "rawdescription": "\nSet gallery autoHeight styles", + "description": "

                                                                                                                                  Set gallery autoHeight styles

                                                                                                                                  \n", + "line": 132, + "type": "boolean", + "decorators": [] + }, + { + "name": "attr.bulletDisabled", + "deprecated": false, + "deprecationMessage": "", + "rawdescription": "\nSet bullets' clicks", + "description": "

                                                                                                                                  Set bullets' clicks

                                                                                                                                  \n", + "line": 92, + "type": "boolean", + "decorators": [] + }, + { + "name": "attr.bulletPosition", + "deprecated": false, + "deprecationMessage": "", + "rawdescription": "\nSet gallery bullets position", + "description": "

                                                                                                                                  Set gallery bullets position

                                                                                                                                  \n", + "line": 97, + "type": "\"top\" | \"bottom\"", + "decorators": [] + }, + { + "name": "attr.counterPosition", + "deprecated": false, + "deprecationMessage": "", + "rawdescription": "\nSet gallery counter position", + "description": "

                                                                                                                                  Set gallery counter position

                                                                                                                                  \n", + "line": 112, + "type": "\"top\" | \"bottom\"", + "decorators": [] + }, + { + "name": "attr.debug", + "deprecated": false, + "deprecationMessage": "", + "rawdescription": "\nSet debug style", + "description": "

                                                                                                                                  Set debug style

                                                                                                                                  \n", + "line": 147, + "type": "boolean", + "decorators": [] + }, + { + "name": "attr.dir", + "deprecated": false, + "deprecationMessage": "", + "rawdescription": "\nSet direction", + "description": "

                                                                                                                                  Set direction

                                                                                                                                  \n", + "line": 142, + "type": "Direction", + "decorators": [] + }, + { + "name": "attr.imageSize", + "deprecated": false, + "deprecationMessage": "", + "rawdescription": "\nSet gallery image size property", + "description": "

                                                                                                                                  Set gallery image size property

                                                                                                                                  \n", + "line": 102, + "type": "\"cover\" | \"contain\"", + "decorators": [] + }, + { + "name": "attr.itemAutosize", + "deprecated": false, + "deprecationMessage": "", + "rawdescription": "\nSet items autosize styles", + "description": "

                                                                                                                                  Set items autosize styles

                                                                                                                                  \n", + "line": 127, + "type": "boolean", + "decorators": [] + }, + { + "name": "attr.orientation", + "deprecated": false, + "deprecationMessage": "", + "rawdescription": "\nSet sliding direction", + "description": "

                                                                                                                                  Set sliding direction

                                                                                                                                  \n", + "line": 82, + "type": "\"horizontal\" | \"vertical\"", + "decorators": [] + }, + { + "name": "attr.scrollDisabled", + "deprecated": false, + "deprecationMessage": "", + "rawdescription": "\nDisable sliding using sliding via touchpad, mousewheel and gestures", + "description": "

                                                                                                                                  Disable sliding using sliding via touchpad, mousewheel and gestures

                                                                                                                                  \n", + "line": 117, + "type": "boolean", + "decorators": [] + }, + { + "name": "attr.thumbAutosize", + "deprecated": false, + "deprecationMessage": "", + "rawdescription": "\nSet gallery thumb autosize styles", + "description": "

                                                                                                                                  Set gallery thumb autosize styles

                                                                                                                                  \n", + "line": 137, + "type": "boolean", + "decorators": [] + }, + { + "name": "attr.thumbDisabled", + "deprecated": false, + "deprecationMessage": "", + "rawdescription": "\nDisable thumbnails' clicks", + "description": "

                                                                                                                                  Disable thumbnails' clicks

                                                                                                                                  \n", + "line": 87, + "type": "boolean", + "decorators": [] + }, + { + "name": "attr.thumbImageSize", + "deprecated": false, + "deprecationMessage": "", + "rawdescription": "\nSet gallery thumb image size property", + "description": "

                                                                                                                                  Set gallery thumb image size property

                                                                                                                                  \n", + "line": 107, + "type": "\"contain\" | \"cover\"", + "decorators": [] + }, + { + "name": "attr.thumbPosition", + "deprecated": false, + "deprecationMessage": "", + "rawdescription": "\nSet thumbnails position", + "description": "

                                                                                                                                  Set thumbnails position

                                                                                                                                  \n", + "line": 77, + "type": "\"top\" | \"left\" | \"right\" | \"bottom\"", + "decorators": [] + }, + { + "name": "attr.thumbScrollDisabled", + "deprecated": false, + "deprecationMessage": "", + "rawdescription": "\nDisable thumb sliding using sliding via touchpad, mousewheel and gestures", + "description": "

                                                                                                                                  Disable thumb sliding using sliding via touchpad, mousewheel and gestures

                                                                                                                                  \n", + "line": 122, + "type": "boolean", + "decorators": [] + } + ], + "hostListeners": [], + "standalone": true, + "imports": [ + { + "name": "CommonModule", + "type": "module" + }, + { + "name": "GalleryThumbsComponent", + "type": "component" + }, + { + "name": "GallerySliderComponent", + "type": "component" + }, + { + "name": "GalleryNavComponent", + "type": "component" + }, + { + "name": "GalleryBulletsComponent", + "type": "component" + }, + { + "name": "GalleryCounterComponent", + "type": "component" + } + ], + "description": "", + "rawdescription": "\n", + "type": "component", + "sourceCode": "import {\r\n Component,\r\n Input,\r\n Output,\r\n HostBinding,\r\n EventEmitter,\r\n OnChanges,\r\n SimpleChanges,\r\n ElementRef,\r\n ChangeDetectionStrategy\r\n} from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { coerceCssPixelValue } from '@angular/cdk/coercion';\r\nimport { Direction, Directionality } from '@angular/cdk/bidi';\r\nimport { GalleryCounterComponent } from './gallery-counter.component';\r\nimport { GalleryBulletsComponent } from './gallery-bullets.component';\r\nimport { GalleryNavComponent } from './gallery-nav.component';\r\nimport { GallerySliderComponent } from './gallery-slider.component';\r\nimport { GalleryThumbsComponent } from './gallery-thumbs.component';\r\nimport { GalleryError, GalleryState } from '../models/gallery.model';\r\nimport { GalleryConfig } from '../models/config.model';\r\n\r\n@Component({\r\n selector: 'gallery-core',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n styleUrls: ['./gallery-core.scss', '../styles/debug.scss'],\r\n template: `\r\n \r\n\r\n
                                                                                                                                  \r\n \r\n\r\n 1\"\r\n [state]=\"state\"\r\n [config]=\"config\"\r\n [galleryId]=\"galleryId\"/>\r\n\r\n \r\n\r\n \r\n\r\n \r\n\r\n
                                                                                                                                  \r\n \r\n
                                                                                                                                  \r\n
                                                                                                                                  \r\n `,\r\n standalone: true,\r\n imports: [CommonModule, GalleryThumbsComponent, GallerySliderComponent, GalleryNavComponent, GalleryBulletsComponent, GalleryCounterComponent]\r\n})\r\nexport class GalleryCoreComponent implements OnChanges {\r\n\r\n @Input() galleryId: string;\r\n @Input() state: GalleryState;\r\n @Input() config: GalleryConfig;\r\n @Output() itemClick: EventEmitter = new EventEmitter();\r\n @Output() thumbClick: EventEmitter = new EventEmitter();\r\n @Output() error: EventEmitter = new EventEmitter();\r\n\r\n /** Set thumbnails position */\r\n @HostBinding('attr.thumbPosition') get thumbPosition(): 'top' | 'left' | 'right' | 'bottom' {\r\n return this.config.thumbPosition;\r\n }\r\n\r\n /** Set sliding direction */\r\n @HostBinding('attr.orientation') get orientation(): 'horizontal' | 'vertical' {\r\n return this.config.orientation;\r\n }\r\n\r\n /** Disable thumbnails' clicks */\r\n @HostBinding('attr.thumbDisabled') get disableThumb(): boolean {\r\n return this.config.disableThumbs;\r\n }\r\n\r\n /** Set bullets' clicks */\r\n @HostBinding('attr.bulletDisabled') get bulletDisabled(): boolean {\r\n return this.config.disableBullets;\r\n }\r\n\r\n /** Set gallery bullets position */\r\n @HostBinding('attr.bulletPosition') get bulletPosition(): 'top' | 'bottom' {\r\n return this.config.bulletPosition;\r\n }\r\n\r\n /** Set gallery image size property */\r\n @HostBinding('attr.imageSize') get imageSize(): 'cover' | 'contain' {\r\n return this.config.imageSize;\r\n }\r\n\r\n /** Set gallery thumb image size property */\r\n @HostBinding('attr.thumbImageSize') get thumbImageSize(): 'contain' | 'cover' {\r\n return this.config.thumbImageSize;\r\n }\r\n\r\n /** Set gallery counter position */\r\n @HostBinding('attr.counterPosition') get counterPosition(): 'top' | 'bottom' {\r\n return this.config.counterPosition;\r\n }\r\n\r\n /** Disable sliding using sliding via touchpad, mousewheel and gestures */\r\n @HostBinding('attr.scrollDisabled') get scrollDisabled(): boolean {\r\n return this.config.disableScroll;\r\n }\r\n\r\n /** Disable thumb sliding using sliding via touchpad, mousewheel and gestures */\r\n @HostBinding('attr.thumbScrollDisabled') get thumbScrollDisabled(): boolean {\r\n return this.config.disableThumbScroll;\r\n }\r\n\r\n /** Set items autosize styles */\r\n @HostBinding('attr.itemAutosize') get itemAutosize(): boolean {\r\n return this.config.itemAutosize;\r\n }\r\n\r\n /** Set gallery autoHeight styles */\r\n @HostBinding('attr.autoHeight') get autoHeight(): boolean {\r\n return this.config.autoHeight;\r\n }\r\n\r\n /** Set gallery thumb autosize styles */\r\n @HostBinding('attr.thumbAutosize') get thumbAutosize(): boolean {\r\n return this.config.thumbAutosize;\r\n }\r\n\r\n /** Set direction */\r\n @HostBinding('attr.dir') get direction(): Direction {\r\n return this.dir.value;\r\n }\r\n\r\n /** Set debug style */\r\n @HostBinding('attr.debug') get debug(): boolean {\r\n return this.config.debug;\r\n }\r\n\r\n constructor(private el: ElementRef, private dir: Directionality) {\r\n }\r\n\r\n ngOnChanges(changes: SimpleChanges): void {\r\n if (changes.config) {\r\n if (changes.config.currentValue?.thumbWidth !== changes.config.previousValue?.thumbWidth) {\r\n this.el.nativeElement.style.setProperty('--g-thumb-width', coerceCssPixelValue(changes.config.currentValue.thumbWidth));\r\n }\r\n if (changes.config.currentValue?.thumbHeight !== changes.config.previousValue?.thumbHeight) {\r\n this.el.nativeElement.style.setProperty('--g-thumb-height', coerceCssPixelValue(changes.config.currentValue.thumbHeight));\r\n }\r\n }\r\n }\r\n}\r\n", + "assetsDirs": [], + "styleUrlsData": [ + { + "data": ":host {\r\n position: relative;\r\n overflow: hidden;\r\n display: flex;\r\n gap: var(--g-gutter-size);\r\n width: 100%;\r\n height: 500px;\r\n min-height: 100%;\r\n max-height: 100%;\r\n\r\n &[thumbPosition='top'] {\r\n flex-direction: column;\r\n }\r\n\r\n &[thumbPosition='left'] {\r\n flex-direction: row;\r\n }\r\n\r\n &[thumbPosition='right'] {\r\n flex-direction: row-reverse;\r\n }\r\n\r\n &[thumbPosition='bottom'] {\r\n flex-direction: column-reverse;\r\n }\r\n\r\n // Gallery auto-height variables\r\n &[autoHeight='true'][itemAutoSize='false'][orientation='horizontal'] {\r\n &[thumbPosition='top'], &[thumbPosition='bottom'] {\r\n // if auto-height, use fit-content\r\n height: fit-content;\r\n --g-item-height: auto !important;\r\n --g-item-max-height: auto;\r\n }\r\n }\r\n\r\n // Gallery image variables\r\n --image-object-fit: unset;\r\n\r\n &[imageSize='contain'] gallery-slider,\r\n &[thumbImageSize='contain'] gallery-thumbs {\r\n --image-object-fit: contain;\r\n }\r\n\r\n &[imageSize='cover'] gallery-slider,\r\n &[thumbImageSize='cover'] gallery-thumbs {\r\n --image-object-fit: cover;\r\n }\r\n\r\n // Gallery thumbs variables\r\n --slider-thumb-height: unset;\r\n --slider-thumb-width: unset;\r\n --thumb-slider-left: unset;\r\n --thumb-slider-overflow: unset;\r\n --thumb-slider-flex-direction: unset;\r\n --g-thumb-width: unset;\r\n --g-thumb-height: unset;\r\n --g-thumb-cursor: pointer;\r\n\r\n &[thumbPosition='top'],\r\n &[thumbPosition='bottom'] {\r\n --thumb-slider-top: 0;\r\n --thumb-slider-overflow: auto hidden;\r\n --thumb-slider-flex-direction: row;\r\n --g-thumb-height: 100%;\r\n\r\n &[thumbAutosize=\"true\"] {\r\n --g-thumb-width: auto !important;\r\n }\r\n }\r\n\r\n &[thumbPosition='left'],\r\n &[thumbPosition='right'] {\r\n --thumb-slider-left: 0;\r\n --thumb-slider-overflow: hidden auto;\r\n --thumb-slider-flex-direction: column;\r\n --g-thumb-width: 100%;\r\n\r\n &[thumbAutosize=\"true\"] {\r\n --g-thumb-height: auto !important;\r\n }\r\n }\r\n\r\n &[thumbDisbled='true'] {\r\n --g-thumb-cursor: default;\r\n }\r\n\r\n &[thumbScrollDisabled='true'] {\r\n --thumb-slider-overflow: hidden !important;\r\n }\r\n\r\n // Gallery slider variables\r\n --slider-scroll-snap-type: unset;\r\n --slider-overflow: unset;\r\n --slider-flex-direction: unset;\r\n --slider-width: unset;\r\n --slider-height: unset;\r\n --slider-content-width: unset;\r\n --slider-content-height: unset;\r\n\r\n &[orientation='horizontal'] {\r\n --slider-overflow: auto hidden;\r\n --slider-scroll-snap-type: x mandatory;\r\n --slider-flex-direction: row;\r\n --slider-content-height: 100%;\r\n }\r\n\r\n &[orientation='vertical'] {\r\n --slider-overflow: hidden auto;\r\n --slider-scroll-snap-type: y mandatory;\r\n --slider-flex-direction: column;\r\n --slider-content-width: 100%;\r\n }\r\n\r\n &[scrollDisabled='true'] {\r\n --slider-overflow: hidden !important;\r\n }\r\n\r\n // Gallery items variables\r\n --g-item-width: unset;\r\n --g-item-height: unset;\r\n --g-item-max-height: var(--slider-height);\r\n\r\n &[orientation='horizontal'] {\r\n --g-item-width: var(--slider-width);\r\n --g-item-height: 100%;\r\n\r\n &[itemAutoSize='true'] {\r\n --g-item-width: auto;\r\n }\r\n }\r\n\r\n &[orientation='vertical'] {\r\n --g-item-width: 100%;\r\n --g-item-height: var(--slider-height);\r\n\r\n &[itemAutoSize='true'] {\r\n --g-item-height: auto;\r\n }\r\n }\r\n\r\n // Gallery bullets variables\r\n --bullets-top: unset;\r\n --bullets-bottom: unset;\r\n --bullets-cursor: pointer;\r\n --bullets-opacity: 0.4;\r\n --bullets-hover-opacity: 1;\r\n --bullets-active-opacity: 1;\r\n\r\n &[bulletPosition='top'] {\r\n --bullets-top: 15px;\r\n }\r\n\r\n &[bulletPosition='bottom'] {\r\n --bullets-bottom: 15px;\r\n }\r\n\r\n &[bulletDisabled='true'] {\r\n --bullets-cursor: default;\r\n --bullets-hover-opacity: var(--bullets-opacity);\r\n }\r\n\r\n // Gallery position variables\r\n --counter-top: unset;\r\n --counter-bottom: unset;\r\n --counter-border-radius: unset;\r\n\r\n &[counterPosition='top'] {\r\n --counter-top: 0;\r\n --counter-border-radius: 0 0 4px 4px;\r\n }\r\n\r\n &[counterPosition='bottom'] {\r\n --counter-bottom: 0;\r\n --counter-border-radius: 4px 4px 0 0;\r\n }\r\n\r\n // Gallery nav variables\r\n --nav-space: 8px;\r\n --nav-hover-space: 6.4px;\r\n --nav-next-right: unset;\r\n --nav-next-hover-right: unset;\r\n --nav-next-left: unset;\r\n --nav-next-hover-left: unset;\r\n\r\n &[dir='ltr'] {\r\n --nav-next-transform: translateY(-50%) perspective(1px);\r\n --nav-next-right: var(--nav-space);\r\n --nav-next-hover-right: var(--nav-hover-space);\r\n\r\n --nav-prev-transform: translateY(-50%) perspective(1px) scale(-1, -1);\r\n --nav-prev-left: var(--nav-space);\r\n --nav-prev-hover-left: var(--nav-hover-space);\r\n }\r\n\r\n &[dir='rtl'] {\r\n --nav-next-transform: translateY(-50%) perspective(1px) scale(-1, -1);\r\n --nav-next-left: var(--nav-space);\r\n --nav-next-hover-left: var(--nav-hover-space);\r\n\r\n --nav-prev-transform: translateY(-50%) perspective(1px);\r\n --nav-prev-right: var(--nav-space);\r\n --nav-prev-hover-right: var(--nav-hover-space);\r\n }\r\n}\r\n\r\n.g-box {\r\n overflow: hidden;\r\n position: relative;\r\n display: flex;\r\n flex-direction: column;\r\n order: 1;\r\n flex: 1;\r\n}\r\n\r\n.g-box-template {\r\n position: absolute;\r\n z-index: 10;\r\n}\r\n", + "styleUrl": "./gallery-core.scss" + }, + { + "data": ":host[debug='true'] {\r\n ::ng-deep {\r\n .g-sliding, .g-resizing, .g-scrolling {\r\n gallery-item.g-item-highlight {\r\n visibility: hidden;\r\n }\r\n }\r\n }\r\n\r\n ::ng-deep {\r\n gallery-slider {\r\n &:after, &:before {\r\n position: absolute;\r\n content: '';\r\n z-index: 12;\r\n }\r\n\r\n &:before {\r\n width: 100%;\r\n height: 0;\r\n border-top: 1px dashed lime;\r\n }\r\n\r\n &:after {\r\n height: 100%;\r\n width: 0;\r\n border-left: 1px dashed lime;\r\n }\r\n\r\n gallery-item {\r\n outline: 1px solid darkorange;\r\n\r\n &.g-item-highlight {\r\n &:after {\r\n content: '';\r\n position: absolute;\r\n width: 100%;\r\n height: 100%;\r\n border: 3px solid lime;\r\n box-sizing: border-box;\r\n z-index: 10;\r\n }\r\n }\r\n }\r\n }\r\n\r\n .g-sliding {\r\n .g-slider-sliding {\r\n display: block;\r\n }\r\n }\r\n\r\n .g-scrolling {\r\n .g-slider-scrolling {\r\n display: block;\r\n }\r\n }\r\n\r\n .g-resizing {\r\n .g-slider-resizing {\r\n display: block;\r\n }\r\n }\r\n\r\n .g-slider-debug {\r\n position: absolute;\r\n top: 0;\r\n left: 0;\r\n display: flex;\r\n gap: 5px;\r\n padding: 10px;\r\n\r\n .g-slider-resizing {\r\n background: rgba(245, 76, 40);\r\n }\r\n\r\n .g-slider-scrolling {\r\n background: rgb(255, 133, 36);\r\n }\r\n\r\n .g-slider-sliding {\r\n background: rgb(31, 108, 185);\r\n }\r\n\r\n div, &:before {\r\n display: none;\r\n color: white;\r\n font-family: monospace;\r\n z-index: 12;\r\n padding: 2px 6px;\r\n border-radius: 3px;\r\n }\r\n }\r\n }\r\n\r\n &[itemAutoSize='false'] {\r\n ::ng-deep {\r\n .g-slider-debug {\r\n &:before {\r\n content: var(--intersection-margin);\r\n background: rgba(236, 236, 236, 0.84);\r\n color: #363636;\r\n display: block;\r\n }\r\n }\r\n }\r\n }\r\n\r\n &[itemAutoSize='true'] {\r\n ::ng-deep {\r\n gallery-item {\r\n &:before {\r\n position: absolute;\r\n margin: 10px;\r\n content: var(--item-intersection-margin);\r\n background: rgba(236, 236, 236, 0.84);\r\n color: #363636;\r\n display: block;\r\n width: 270px;\r\n font-family: monospace;\r\n z-index: 12;\r\n padding: 2px 6px;\r\n border-radius: 3px;\r\n }\r\n }\r\n }\r\n }\r\n}\r\n", + "styleUrl": "../styles/debug.scss" + } + ], + "stylesData": "", + "constructorObj": { + "name": "constructor", + "description": "", + "deprecated": false, + "deprecationMessage": "", + "args": [ + { + "name": "el", + "type": "ElementRef", + "deprecated": false, + "deprecationMessage": "" + }, + { + "name": "dir", + "type": "Directionality", + "deprecated": false, + "deprecationMessage": "" + } + ], + "line": 149, + "jsdoctags": [ + { + "name": "el", + "type": "ElementRef", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + }, + { + "name": "dir", + "type": "Directionality", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + } + ] + }, + "implements": [ + "OnChanges" + ], + "accessors": { + "thumbPosition": { + "name": "thumbPosition", + "getSignature": { + "name": "thumbPosition", + "type": "", + "returnType": "\"top\" | \"left\" | \"right\" | \"bottom\"", + "line": 77, + "rawdescription": "\nSet thumbnails position", + "description": "

                                                                                                                                  Set thumbnails position

                                                                                                                                  \n" + } + }, + "orientation": { + "name": "orientation", + "getSignature": { + "name": "orientation", + "type": "", + "returnType": "\"horizontal\" | \"vertical\"", + "line": 82, + "rawdescription": "\nSet sliding direction", + "description": "

                                                                                                                                  Set sliding direction

                                                                                                                                  \n" + } + }, + "disableThumb": { + "name": "disableThumb", + "getSignature": { + "name": "disableThumb", + "type": "boolean", + "returnType": "boolean", + "line": 87, + "rawdescription": "\nDisable thumbnails' clicks", + "description": "

                                                                                                                                  Disable thumbnails' clicks

                                                                                                                                  \n" + } + }, + "bulletDisabled": { + "name": "bulletDisabled", + "getSignature": { + "name": "bulletDisabled", + "type": "boolean", + "returnType": "boolean", + "line": 92, + "rawdescription": "\nSet bullets' clicks", + "description": "

                                                                                                                                  Set bullets' clicks

                                                                                                                                  \n" + } + }, + "bulletPosition": { + "name": "bulletPosition", + "getSignature": { + "name": "bulletPosition", + "type": "", + "returnType": "\"top\" | \"bottom\"", + "line": 97, + "rawdescription": "\nSet gallery bullets position", + "description": "

                                                                                                                                  Set gallery bullets position

                                                                                                                                  \n" + } + }, + "imageSize": { + "name": "imageSize", + "getSignature": { + "name": "imageSize", + "type": "", + "returnType": "\"cover\" | \"contain\"", + "line": 102, + "rawdescription": "\nSet gallery image size property", + "description": "

                                                                                                                                  Set gallery image size property

                                                                                                                                  \n" + } + }, + "thumbImageSize": { + "name": "thumbImageSize", + "getSignature": { + "name": "thumbImageSize", + "type": "", + "returnType": "\"contain\" | \"cover\"", + "line": 107, + "rawdescription": "\nSet gallery thumb image size property", + "description": "

                                                                                                                                  Set gallery thumb image size property

                                                                                                                                  \n" + } + }, + "counterPosition": { + "name": "counterPosition", + "getSignature": { + "name": "counterPosition", + "type": "", + "returnType": "\"top\" | \"bottom\"", + "line": 112, + "rawdescription": "\nSet gallery counter position", + "description": "

                                                                                                                                  Set gallery counter position

                                                                                                                                  \n" + } + }, + "scrollDisabled": { + "name": "scrollDisabled", + "getSignature": { + "name": "scrollDisabled", + "type": "boolean", + "returnType": "boolean", + "line": 117, + "rawdescription": "\nDisable sliding using sliding via touchpad, mousewheel and gestures", + "description": "

                                                                                                                                  Disable sliding using sliding via touchpad, mousewheel and gestures

                                                                                                                                  \n" + } + }, + "thumbScrollDisabled": { + "name": "thumbScrollDisabled", + "getSignature": { + "name": "thumbScrollDisabled", + "type": "boolean", + "returnType": "boolean", + "line": 122, + "rawdescription": "\nDisable thumb sliding using sliding via touchpad, mousewheel and gestures", + "description": "

                                                                                                                                  Disable thumb sliding using sliding via touchpad, mousewheel and gestures

                                                                                                                                  \n" + } + }, + "itemAutosize": { + "name": "itemAutosize", + "getSignature": { + "name": "itemAutosize", + "type": "boolean", + "returnType": "boolean", + "line": 127, + "rawdescription": "\nSet items autosize styles", + "description": "

                                                                                                                                  Set items autosize styles

                                                                                                                                  \n" + } + }, + "autoHeight": { + "name": "autoHeight", + "getSignature": { + "name": "autoHeight", + "type": "boolean", + "returnType": "boolean", + "line": 132, + "rawdescription": "\nSet gallery autoHeight styles", + "description": "

                                                                                                                                  Set gallery autoHeight styles

                                                                                                                                  \n" + } + }, + "thumbAutosize": { + "name": "thumbAutosize", + "getSignature": { + "name": "thumbAutosize", + "type": "boolean", + "returnType": "boolean", + "line": 137, + "rawdescription": "\nSet gallery thumb autosize styles", + "description": "

                                                                                                                                  Set gallery thumb autosize styles

                                                                                                                                  \n" + } + }, + "direction": { + "name": "direction", + "getSignature": { + "name": "direction", + "type": "", + "returnType": "Direction", + "line": 142, + "rawdescription": "\nSet direction", + "description": "

                                                                                                                                  Set direction

                                                                                                                                  \n" + } + }, + "debug": { + "name": "debug", + "getSignature": { + "name": "debug", + "type": "boolean", + "returnType": "boolean", + "line": 147, + "rawdescription": "\nSet debug style", + "description": "

                                                                                                                                  Set debug style

                                                                                                                                  \n" + } + } + } + }, + { + "name": "GalleryCounterComponent", + "id": "component-GalleryCounterComponent-c248b3b0b6b8f0d3298ca31037cb1a504376fe2b67f55c2275da836b4d13b5540ae785d4fa76ddfce225a78c2490a8e8140bb2cd4138e8ebc19b17083481a5f7", + "file": "projects/ng-gallery/src/lib/components/gallery-counter.component.ts", + "changeDetection": "ChangeDetectionStrategy.OnPush", + "encapsulation": [], + "entryComponents": [], + "inputs": [], + "outputs": [], + "providers": [], + "selector": "gallery-counter", + "styleUrls": [ + "./gallery-counter.scss" + ], + "styles": [], + "template": "
                                                                                                                                  {{ (state.currIndex + 1) + ' / ' + state.items.length }}
                                                                                                                                  \n", + "templateUrl": [], + "viewProviders": [], + "hostDirectives": [], + "inputsClass": [ + { + "name": "state", + "deprecated": false, + "deprecationMessage": "", + "line": 14, + "type": "GalleryState", + "decorators": [] + } + ], + "outputsClass": [], + "propertiesClass": [], + "methodsClass": [], + "deprecated": false, + "deprecationMessage": "", + "hostBindings": [], + "hostListeners": [], + "standalone": true, + "imports": [], + "description": "", + "rawdescription": "\n", + "type": "component", + "sourceCode": "import { Component, Input, ChangeDetectionStrategy } from '@angular/core';\r\nimport { GalleryState } from '../models/gallery.model';\r\n\r\n@Component({\r\n selector: 'gallery-counter',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n styleUrls: ['./gallery-counter.scss'],\r\n template: `\r\n
                                                                                                                                  {{ (state.currIndex + 1) + ' / ' + state.items.length }}
                                                                                                                                  \r\n `,\r\n standalone: true\r\n})\r\nexport class GalleryCounterComponent {\r\n @Input() state: GalleryState;\r\n}\r\n", + "assetsDirs": [], + "styleUrlsData": [ + { + "data": ".g-counter {\r\n font-weight: bold;\r\n user-select: none;\r\n opacity: 0.6;\r\n transition: opacity linear 150ms;\r\n z-index: 50;\r\n position: absolute;\r\n left: 50%;\r\n transform: translateX(-50%) perspective(1px);\r\n font-size: 12px;\r\n padding: 4px 10px;\r\n color: var(--g-font-color);\r\n background-color: var(--g-overlay-color);\r\n box-shadow: var(--g-box-shadow);\r\n\r\n top: var(--counter-top);\r\n bottom: var(--counter-bottom);\r\n border-radius: var(--counter-border-radius);\r\n\r\n &:hover {\r\n opacity: 0.8;\r\n }\r\n}\r\n", + "styleUrl": "./gallery-counter.scss" + } + ], + "stylesData": "" + }, + { + "name": "GalleryIframeComponent", + "id": "component-GalleryIframeComponent-f80fe77d8a6d367c9515bf9b4da61d8c7535dc721032b9dc75e5bd532552daf36798da47e8ddfa9c551a720e012b267c2553c4a2ca0aab949041ccb52847a902", + "file": "projects/ng-gallery/src/lib/components/templates/gallery-iframe.component.ts", + "changeDetection": "ChangeDetectionStrategy.OnPush", + "encapsulation": [], + "entryComponents": [], + "inputs": [], + "outputs": [], + "providers": [], + "selector": "gallery-iframe", + "styleUrls": [], + "styles": [], + "template": "\n\n \n\n", + "templateUrl": [], + "viewProviders": [], + "hostDirectives": [], + "inputsClass": [ + { + "name": "autoplay", + "deprecated": false, + "deprecationMessage": "", + "line": 52, + "type": "boolean", + "decorators": [] + }, + { + "name": "loadingAttr", + "deprecated": false, + "deprecationMessage": "", + "line": 54, + "type": "\"eager\" | \"lazy\"", + "decorators": [] + }, + { + "name": "pause", + "deprecated": false, + "deprecationMessage": "", + "line": 39, + "type": "boolean", + "decorators": [] + }, + { + "name": "src", + "deprecated": false, + "deprecationMessage": "", + "line": 34, + "type": "string", + "decorators": [] + } + ], + "outputsClass": [], + "propertiesClass": [ + { + "name": "iframe", + "deprecated": false, + "deprecationMessage": "", + "type": "ElementRef", + "optional": false, + "description": "", + "line": 56, + "decorators": [ + { + "name": "ViewChild", + "stringifiedArguments": "'iframe'" + } + ], + "modifierKind": [ + 167 + ] + }, + { + "name": "iframeSrc", + "deprecated": false, + "deprecationMessage": "", + "type": "SafeResourceUrl", + "optional": false, + "description": "", + "line": 31 + }, + { + "name": "videoSrc", + "deprecated": false, + "deprecationMessage": "", + "type": "string", + "optional": false, + "description": "", + "line": 32 + } + ], + "methodsClass": [], + "deprecated": false, + "deprecationMessage": "", + "hostBindings": [], + "hostListeners": [], + "standalone": true, + "imports": [ + { + "name": "NgIf" + } + ], + "description": "", + "rawdescription": "\n", + "type": "component", + "sourceCode": "import { Component, Input, ViewChild, ElementRef, ChangeDetectionStrategy } from '@angular/core';\r\nimport { NgIf } from '@angular/common';\r\nimport { DomSanitizer, SafeResourceUrl } from '@angular/platform-browser';\r\n\r\n@Component({\r\n selector: 'gallery-iframe',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n template: `\r\n \r\n \r\n \r\n \r\n `,\r\n standalone: true,\r\n imports: [NgIf]\r\n})\r\nexport class GalleryIframeComponent {\r\n\r\n iframeSrc: SafeResourceUrl;\r\n videoSrc: string;\r\n\r\n @Input('src') set src(src: string) {\r\n this.videoSrc = src;\r\n this.iframeSrc = this._sanitizer.bypassSecurityTrustResourceUrl(src);\r\n }\r\n\r\n @Input('pause') set pauseVideo(shouldPause: boolean) {\r\n if (this.iframe?.nativeElement) {\r\n if (shouldPause) {\r\n const iframe: HTMLIFrameElement = this.iframe.nativeElement;\r\n iframe.src = null;\r\n\r\n if (!this.autoplay && this.videoSrc) {\r\n this.iframeSrc = this._sanitizer.bypassSecurityTrustResourceUrl(this.videoSrc);\r\n }\r\n }\r\n }\r\n }\r\n\r\n @Input() autoplay: boolean;\r\n\r\n @Input() loadingAttr: 'eager' | 'lazy';\r\n\r\n @ViewChild('iframe') iframe: ElementRef;\r\n\r\n constructor(private _sanitizer: DomSanitizer) {\r\n }\r\n}\r\n", + "assetsDirs": [], + "styleUrlsData": "", + "stylesData": "", + "constructorObj": { + "name": "constructor", + "description": "", + "deprecated": false, + "deprecationMessage": "", + "args": [ + { + "name": "_sanitizer", + "type": "DomSanitizer", + "deprecated": false, + "deprecationMessage": "" + } + ], + "line": 56, + "jsdoctags": [ + { + "name": "_sanitizer", + "type": "DomSanitizer", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + } + ] + }, + "accessors": { + "src": { + "name": "src", + "setSignature": { + "name": "src", + "type": "void", + "deprecated": false, + "deprecationMessage": "", + "args": [ + { + "name": "src", + "type": "string", + "deprecated": false, + "deprecationMessage": "" + } + ], + "returnType": "void", + "line": 34, + "jsdoctags": [ + { + "name": "src", + "type": "string", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + } + ] + } + }, + "pauseVideo": { + "name": "pauseVideo", + "setSignature": { + "name": "pauseVideo", + "type": "void", + "deprecated": false, + "deprecationMessage": "", + "args": [ + { + "name": "shouldPause", + "type": "boolean", + "deprecated": false, + "deprecationMessage": "" + } + ], + "returnType": "void", + "line": 39, + "jsdoctags": [ + { + "name": "shouldPause", + "type": "boolean", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + } + ] + } + } + } + }, + { + "name": "GalleryImageComponent", + "id": "component-GalleryImageComponent-2ecb40ba37998297cbb5c07d50509e1eb10d2408f3d8cf25b5736c7999f6701872985ee34f4f7483a0fd99bdfcf71149ac5b4d41b1ed2b2f467734f089840705", + "file": "projects/ng-gallery/src/lib/components/templates/gallery-image.component.ts", + "changeDetection": "ChangeDetectionStrategy.OnPush", + "encapsulation": [], + "entryComponents": [], + "inputs": [], + "outputs": [], + "providers": [], + "selector": "gallery-image", + "styleUrls": [ + "./gallery-image.scss" + ], + "styles": [], + "template": "\n\n \n \n \n \n \n \n\n
                                                                                                                                  \n
                                                                                                                                  \n \n \n

                                                                                                                                  \n
                                                                                                                                  \n

                                                                                                                                  \n
                                                                                                                                  \n \n

                                                                                                                                  \n
                                                                                                                                  \n

                                                                                                                                  \n

                                                                                                                                  Unable to load the image!

                                                                                                                                  \n
                                                                                                                                  \n
                                                                                                                                  \n
                                                                                                                                  \n\n \n
                                                                                                                                  \n
                                                                                                                                  \n \n
                                                                                                                                  \n
                                                                                                                                  \n
                                                                                                                                  \n
                                                                                                                                  \n", + "templateUrl": [], + "viewProviders": [], + "hostDirectives": [], + "inputsClass": [ + { + "name": "alt", + "deprecated": false, + "deprecationMessage": "", + "rawdescription": "\nImage alt", + "description": "

                                                                                                                                  Image alt

                                                                                                                                  \n", + "line": 101, + "type": "string", + "decorators": [] + }, + { + "name": "errorIcon", + "defaultValue": "imageFailedSvg", + "deprecated": false, + "deprecationMessage": "", + "line": 116, + "type": "string", + "decorators": [] + }, + { + "name": "index", + "deprecated": false, + "deprecationMessage": "", + "line": 95, + "type": "number", + "decorators": [] + }, + { + "name": "isThumbnail", + "deprecated": false, + "deprecationMessage": "", + "rawdescription": "\nIs thumbnail", + "description": "

                                                                                                                                  Is thumbnail

                                                                                                                                  \n", + "line": 93, + "type": "boolean", + "decorators": [] + }, + { + "name": "loadingAttr", + "deprecated": false, + "deprecationMessage": "", + "rawdescription": "\nImage loading attribute", + "description": "

                                                                                                                                  Image loading attribute

                                                                                                                                  \n", + "line": 98, + "type": "\"eager\" | \"lazy\"", + "decorators": [] + }, + { + "name": "loadingError", + "deprecated": false, + "deprecationMessage": "", + "rawdescription": "\nCustom error template", + "description": "

                                                                                                                                  Custom error template

                                                                                                                                  \n", + "line": 112, + "type": "string", + "decorators": [] + }, + { + "name": "loadingIcon", + "deprecated": false, + "deprecationMessage": "", + "rawdescription": "\nCustom loader template", + "description": "

                                                                                                                                  Custom loader template

                                                                                                                                  \n", + "line": 107, + "type": "string", + "decorators": [] + }, + { + "name": "src", + "deprecated": false, + "deprecationMessage": "", + "rawdescription": "\nImage source URL", + "description": "

                                                                                                                                  Image source URL

                                                                                                                                  \n", + "line": 104, + "type": "string", + "decorators": [] + } + ], + "outputsClass": [ + { + "name": "error", + "defaultValue": "new EventEmitter()", + "deprecated": false, + "deprecationMessage": "", + "rawdescription": "\nStream that emits when an error occurs", + "description": "

                                                                                                                                  Stream that emits when an error occurs

                                                                                                                                  \n", + "line": 120, + "type": "EventEmitter" + } + ], + "propertiesClass": [ + { + "name": "errorSvg", + "deprecated": false, + "deprecationMessage": "", + "type": "SafeHtml", + "optional": false, + "description": "", + "line": 117 + }, + { + "name": "errorTemplate", + "deprecated": false, + "deprecationMessage": "", + "type": "SafeHtml", + "optional": false, + "description": "

                                                                                                                                  Custom error safe template

                                                                                                                                  \n", + "line": 114, + "rawdescription": "\nCustom error safe template" + }, + { + "name": "loaderTemplate", + "deprecated": false, + "deprecationMessage": "", + "type": "SafeHtml", + "optional": false, + "description": "

                                                                                                                                  Custom loader safe template

                                                                                                                                  \n", + "line": 109, + "rawdescription": "\nCustom loader safe template" + }, + { + "name": "state", + "defaultValue": "'loading'", + "deprecated": false, + "deprecationMessage": "", + "type": "ItemState", + "optional": false, + "description": "", + "line": 90 + } + ], + "methodsClass": [ + { + "name": "ngOnInit", + "args": [], + "optional": false, + "returnType": "void", + "typeParameters": [], + "line": 129, + "deprecated": false, + "deprecationMessage": "" + } + ], + "deprecated": false, + "deprecationMessage": "", + "hostBindings": [ + { + "name": "attr.imageState", + "deprecated": false, + "deprecationMessage": "", + "line": 122, + "type": "string", + "decorators": [] + } + ], + "hostListeners": [], + "standalone": true, + "imports": [ + { + "name": "NgSwitch" + }, + { + "name": "NgSwitchCase" + }, + { + "name": "NgIf" + }, + { + "name": "ImgRecognizer" + } + ], + "description": "", + "rawdescription": "\n", + "type": "component", + "sourceCode": "import {\r\n Component,\r\n Input,\r\n Output,\r\n HostBinding,\r\n EventEmitter,\r\n OnInit,\r\n ChangeDetectionStrategy\r\n} from '@angular/core';\r\nimport { NgSwitch, NgSwitchCase, NgIf } from '@angular/common';\r\nimport { DomSanitizer, SafeHtml } from '@angular/platform-browser';\r\nimport { animate, style, transition, trigger } from '@angular/animations';\r\nimport { imageFailedSvg } from './svg-assets';\r\nimport { ImgRecognizer } from '../../utils/img-recognizer';\r\nimport { ItemState } from './items.model';\r\n\r\n@Component({\r\n selector: 'gallery-image',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n styleUrls: ['./gallery-image.scss'],\r\n animations: [\r\n trigger('fadeIn', [\r\n transition('* => success', [\r\n style({ opacity: 0 }),\r\n animate('300ms ease-in', style({ opacity: 1 }))\r\n ])\r\n ])\r\n ],\r\n template: `\r\n \r\n\r\n \r\n \r\n \r\n \r\n \r\n \r\n\r\n
                                                                                                                                  \r\n
                                                                                                                                  \r\n \r\n \r\n

                                                                                                                                  \r\n
                                                                                                                                  \r\n

                                                                                                                                  \r\n
                                                                                                                                  \r\n \r\n

                                                                                                                                  \r\n
                                                                                                                                  \r\n

                                                                                                                                  \r\n

                                                                                                                                  Unable to load the image!

                                                                                                                                  \r\n
                                                                                                                                  \r\n
                                                                                                                                  \r\n
                                                                                                                                  \r\n\r\n \r\n
                                                                                                                                  \r\n
                                                                                                                                  \r\n \r\n
                                                                                                                                  \r\n
                                                                                                                                  \r\n
                                                                                                                                  \r\n
                                                                                                                                  \r\n `,\r\n standalone: true,\r\n imports: [NgSwitch, NgSwitchCase, NgIf, ImgRecognizer]\r\n})\r\n\r\nexport class GalleryImageComponent implements OnInit {\r\n\r\n state: ItemState = 'loading';\r\n\r\n /** Is thumbnail */\r\n @Input() isThumbnail: boolean;\r\n\r\n @Input() index: number;\r\n\r\n /** Image loading attribute */\r\n @Input() loadingAttr: 'eager' | 'lazy';\r\n\r\n /** Image alt */\r\n @Input() alt: string;\r\n\r\n /** Image source URL */\r\n @Input() src: string;\r\n\r\n /** Custom loader template */\r\n @Input() loadingIcon: string;\r\n /** Custom loader safe template */\r\n loaderTemplate: SafeHtml;\r\n\r\n /** Custom error template */\r\n @Input() loadingError: string;\r\n /** Custom error safe template */\r\n errorTemplate: SafeHtml;\r\n\r\n @Input() errorIcon: string = imageFailedSvg;\r\n errorSvg: SafeHtml;\r\n\r\n /** Stream that emits when an error occurs */\r\n @Output() error: EventEmitter = new EventEmitter();\r\n\r\n @HostBinding('attr.imageState') get imageState(): string {\r\n return this.state;\r\n }\r\n\r\n constructor(private _sanitizer: DomSanitizer) {\r\n }\r\n\r\n ngOnInit() {\r\n if (this.loadingIcon) {\r\n this.loaderTemplate = this._sanitizer.bypassSecurityTrustHtml(this.loadingIcon);\r\n }\r\n if (this.loadingError) {\r\n this.errorTemplate = this._sanitizer.bypassSecurityTrustHtml(this.loadingError);\r\n }\r\n if (this.errorIcon) {\r\n this.errorSvg = this._sanitizer.bypassSecurityTrustHtml(this.errorIcon);\r\n }\r\n }\r\n}\r\n", + "assetsDirs": [], + "styleUrlsData": [ + { + "data": ":host {\r\n display: flex;\r\n width: 100%;\r\n height: 100%;\r\n max-height: 100%;\r\n max-width: 100%;\r\n transition: opacity 300ms cubic-bezier(0.5, 0, 0.5, 1);\r\n opacity: var(--g-thumb-opacity);\r\n\r\n &[imageState='success'] {\r\n align-self: center;\r\n }\r\n\r\n ::ng-deep {\r\n svg {\r\n width: 100%;\r\n height: 100%;\r\n }\r\n }\r\n}\r\n\r\n.gallery-image-error {\r\n width: 100px;\r\n height: 100px;\r\n}\r\n\r\n.gallery-thumb-error {\r\n width: 40px;\r\n height: 40px;\r\n}\r\n\r\nimg.g-image-item {\r\n object-fit: var(--image-object-fit);\r\n width: 100%;\r\n height: 100%;\r\n pointer-events: none;\r\n max-height: 100%;\r\n max-width: 100%;\r\n}\r\n\r\n.g-image-error-message {\r\n position: absolute;\r\n z-index: 10;\r\n left: 0;\r\n top: 0;\r\n right: 0;\r\n bottom: 0;\r\n color: white;\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n flex-direction: column;\r\n}\r\n\r\nh2, h4 {\r\n color: coral;\r\n margin: 0;\r\n}\r\n\r\nh2 {\r\n font-size: 3.5em;\r\n margin-bottom: 0.3em;\r\n}\r\n\r\nh4 {\r\n font-size: 1.6em;\r\n}\r\n\r\n.g-loading {\r\n position: absolute;\r\n transform: translate3d(-50%, -50%, 0);\r\n left: 50%;\r\n top: 50%;\r\n width: 80px;\r\n height: 80px;\r\n}\r\n\r\n// Thumbnail loading\r\n\r\n$loading-color: #fff !default;\r\n$placeholder-ng: #262626 !default;\r\n\r\n.g-active-thumb {\r\n .g-thumb-loading {\r\n background-color: #464646;\r\n }\r\n}\r\n\r\n.g-thumb-loading {\r\n position: relative;\r\n overflow: hidden;\r\n width: 100%;\r\n height: 100%;\r\n background-color: $placeholder-ng;\r\n\r\n &::before {\r\n content: \"\";\r\n position: absolute;\r\n top: 0;\r\n right: 0;\r\n bottom: 0;\r\n left: 50%;\r\n z-index: 1;\r\n width: 500%;\r\n margin-left: -250%;\r\n animation: phAnimation .8s linear infinite;\r\n background: linear-gradient(to right, rgba($loading-color, 0) 46%, rgba($loading-color, .35) 50%, rgba($loading-color, 0) 54%) 50% 50%;\r\n }\r\n}\r\n\r\n@keyframes phAnimation {\r\n 0% {\r\n transform: translate3d(-30%, 0, 0);\r\n }\r\n 100% {\r\n transform: translate3d(30%, 0, 0);\r\n }\r\n}\r\n", + "styleUrl": "./gallery-image.scss" + } + ], + "stylesData": "", + "constructorObj": { + "name": "constructor", + "description": "", + "deprecated": false, + "deprecationMessage": "", + "args": [ + { + "name": "_sanitizer", + "type": "DomSanitizer", + "deprecated": false, + "deprecationMessage": "" + } + ], + "line": 124, + "jsdoctags": [ + { + "name": "_sanitizer", + "type": "DomSanitizer", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + } + ] + }, + "implements": [ + "OnInit" + ], + "accessors": { + "imageState": { + "name": "imageState", + "getSignature": { + "name": "imageState", + "type": "string", + "returnType": "string", + "line": 122 + } + } + } + }, + { + "name": "GalleryItemComponent", + "id": "component-GalleryItemComponent-658b2eb839084d173eb340b21ce8e09f3515d46388ee03d9a284ac032974bcf745aac1a4b30c49fb4bc4ba7764ec7dc22475b6432ecf70d2d669140c172fba24", + "file": "projects/ng-gallery/src/lib/components/gallery-item.component.ts", + "changeDetection": "ChangeDetectionStrategy.OnPush", + "encapsulation": [], + "entryComponents": [], + "inputs": [], + "outputs": [], + "providers": [], + "selector": "gallery-item", + "styleUrls": [ + "./gallery-item.scss" + ], + "styles": [], + "template": "\n \n \n\n
                                                                                                                                  \n \n
                                                                                                                                  \n
                                                                                                                                  \n\n \n\n \n\n \n\n \n
                                                                                                                                  \n \n
                                                                                                                                  \n
                                                                                                                                  \n
                                                                                                                                  \n", + "templateUrl": [], + "viewProviders": [], + "hostDirectives": [], + "inputsClass": [ + { + "name": "config", + "deprecated": false, + "deprecationMessage": "", + "rawdescription": "\nGallery config", + "description": "

                                                                                                                                  Gallery config

                                                                                                                                  \n", + "line": 84, + "type": "GalleryConfig", + "decorators": [] + }, + { + "name": "count", + "deprecated": false, + "deprecationMessage": "", + "rawdescription": "\nThe number of total items", + "description": "

                                                                                                                                  The number of total items

                                                                                                                                  \n", + "line": 90, + "type": "number", + "decorators": [] + }, + { + "name": "currIndex", + "deprecated": false, + "deprecationMessage": "", + "rawdescription": "\nGallery current index", + "description": "

                                                                                                                                  Gallery current index

                                                                                                                                  \n", + "line": 93, + "type": "number", + "decorators": [] + }, + { + "name": "data", + "deprecated": false, + "deprecationMessage": "", + "rawdescription": "\nItem's data, this object contains the data required to display the content (e.g. src path)", + "description": "

                                                                                                                                  Item's data, this object contains the data required to display the content (e.g. src path)

                                                                                                                                  \n", + "line": 99, + "type": "GalleryItemData", + "decorators": [] + }, + { + "name": "index", + "deprecated": false, + "deprecationMessage": "", + "rawdescription": "\nItem's index in the gallery", + "description": "

                                                                                                                                  Item's index in the gallery

                                                                                                                                  \n", + "line": 87, + "type": "number", + "decorators": [] + }, + { + "name": "type", + "deprecated": false, + "deprecationMessage": "", + "rawdescription": "\nItem's type 'image', 'video', 'youtube', 'iframe'", + "description": "

                                                                                                                                  Item's type 'image', 'video', 'youtube', 'iframe'

                                                                                                                                  \n", + "line": 96, + "type": "GalleryItemType", + "decorators": [] + } + ], + "outputsClass": [ + { + "name": "error", + "defaultValue": "new EventEmitter()", + "deprecated": false, + "deprecationMessage": "", + "rawdescription": "\nStream that emits when an error occurs", + "description": "

                                                                                                                                  Stream that emits when an error occurs

                                                                                                                                  \n", + "line": 102, + "type": "EventEmitter" + } + ], + "propertiesClass": [ + { + "name": "isItemContainImage", + "deprecated": false, + "deprecationMessage": "", + "type": "boolean", + "optional": false, + "description": "

                                                                                                                                  A flag that indicates if the item is type of image, it can be a custom template by the user,\nThe img recognizer directive will set it to true

                                                                                                                                  \n", + "line": 81, + "rawdescription": "\nA flag that indicates if the item is type of image, it can be a custom template by the user,\nThe img recognizer directive will set it to true" + }, + { + "name": "state$", + "defaultValue": "new BehaviorSubject('loading')", + "deprecated": false, + "deprecationMessage": "", + "type": "BehaviorSubject", + "optional": false, + "description": "

                                                                                                                                  A stream that indicates that the height was emitted after the image is loaded, used only for gallery image types

                                                                                                                                  \n", + "line": 77, + "rawdescription": "\nA stream that indicates that the height was emitted after the image is loaded, used only for gallery image types", + "modifierKind": [ + 146 + ] + }, + { + "name": "Types", + "defaultValue": "GalleryItemTypes", + "deprecated": false, + "deprecationMessage": "", + "type": "", + "optional": false, + "description": "", + "line": 74, + "modifierKind": [ + 146 + ] + } + ], + "methodsClass": [ + { + "name": "ngAfterViewInit", + "args": [], + "optional": false, + "returnType": "void", + "typeParameters": [], + "line": 188, + "deprecated": false, + "deprecationMessage": "" + } + ], + "deprecated": false, + "deprecationMessage": "", + "hostBindings": [ + { + "name": "attr.galleryIndex", + "deprecated": false, + "deprecationMessage": "", + "line": 108, + "type": "number", + "decorators": [] + }, + { + "name": "attr.itemState", + "deprecated": false, + "deprecationMessage": "", + "line": 112, + "type": "ItemState", + "decorators": [] + }, + { + "name": "class.g-active-item", + "deprecated": false, + "deprecationMessage": "", + "line": 104, + "type": "boolean", + "decorators": [] + } + ], + "hostListeners": [], + "standalone": true, + "imports": [ + { + "name": "CommonModule", + "type": "module" + }, + { + "name": "GalleryImageComponent", + "type": "component" + }, + { + "name": "GalleryVideoComponent", + "type": "component" + }, + { + "name": "GalleryIframeComponent", + "type": "component" + } + ], + "description": "", + "rawdescription": "\n", + "type": "component", + "sourceCode": "import {\r\n Component,\r\n HostBinding,\r\n Input,\r\n Output,\r\n EventEmitter,\r\n ElementRef,\r\n AfterViewInit,\r\n ChangeDetectionStrategy\r\n} from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { BehaviorSubject } from 'rxjs';\r\nimport { GalleryItemContext } from '../directives/gallery-item-def.directive';\r\nimport { GalleryIframeComponent } from './templates/gallery-iframe.component';\r\nimport { GalleryVideoComponent } from './templates/gallery-video.component';\r\nimport { GalleryImageComponent } from './templates/gallery-image.component';\r\nimport { GalleryConfig } from '../models/config.model';\r\nimport { GalleryItemType, GalleryItemTypes, LoadingStrategy } from '../models/constants';\r\nimport { GalleryItemData, ImageItemData, ItemState, VideoItemData, YoutubeItemData } from './templates/items.model';\r\n\r\n@Component({\r\n selector: 'gallery-item',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n styleUrls: ['./gallery-item.scss'],\r\n template: `\r\n \r\n \r\n \r\n\r\n
                                                                                                                                  \r\n \r\n
                                                                                                                                  \r\n
                                                                                                                                  \r\n\r\n \r\n\r\n \r\n\r\n \r\n\r\n \r\n
                                                                                                                                  \r\n \r\n
                                                                                                                                  \r\n
                                                                                                                                  \r\n
                                                                                                                                  \r\n `,\r\n standalone: true,\r\n imports: [CommonModule, GalleryImageComponent, GalleryVideoComponent, GalleryIframeComponent]\r\n})\r\nexport class GalleryItemComponent implements AfterViewInit {\r\n\r\n readonly Types = GalleryItemTypes;\r\n\r\n /** A stream that indicates that the height was emitted after the image is loaded, used only for gallery image types */\r\n readonly state$: BehaviorSubject = new BehaviorSubject('loading');\r\n\r\n /** A flag that indicates if the item is type of image, it can be a custom template by the user,\r\n * The img recognizer directive will set it to true*/\r\n isItemContainImage: boolean;\r\n\r\n /** Gallery config */\r\n @Input() config: GalleryConfig;\r\n\r\n /** Item's index in the gallery */\r\n @Input() index: number;\r\n\r\n /** The number of total items */\r\n @Input() count: number;\r\n\r\n /** Gallery current index */\r\n @Input() currIndex: number;\r\n\r\n /** Item's type 'image', 'video', 'youtube', 'iframe' */\r\n @Input() type: GalleryItemType;\r\n\r\n /** Item's data, this object contains the data required to display the content (e.g. src path) */\r\n @Input() data: GalleryItemData;\r\n\r\n /** Stream that emits when an error occurs */\r\n @Output() error: EventEmitter = new EventEmitter();\r\n\r\n @HostBinding('class.g-active-item') get isActive(): boolean {\r\n return this.index === this.currIndex;\r\n }\r\n\r\n @HostBinding('attr.galleryIndex') get isIndexAttr(): number {\r\n return this.index;\r\n }\r\n\r\n @HostBinding('attr.itemState') get itemState(): ItemState {\r\n return this.state$.value;\r\n }\r\n\r\n get imageContext(): GalleryItemContext {\r\n return {\r\n $implicit: this.imageData,\r\n index: this.index,\r\n type: this.type,\r\n active: this.isActive,\r\n count: this.count,\r\n first: this.index === 0,\r\n last: this.index === this.count - 1\r\n };\r\n }\r\n\r\n get itemContext(): GalleryItemContext {\r\n return {\r\n $implicit: this.data,\r\n index: this.index,\r\n type: this.type,\r\n active: this.isActive,\r\n count: this.count,\r\n first: this.index === 0,\r\n last: this.index === this.count - 1\r\n };\r\n }\r\n\r\n get nativeElement(): HTMLElement {\r\n return this.el.nativeElement;\r\n }\r\n\r\n get isAutoPlay(): boolean {\r\n if (this.isActive) {\r\n if (this.type === GalleryItemTypes.Video || this.type === GalleryItemTypes.Youtube) {\r\n return this.videoData.autoplay;\r\n }\r\n }\r\n }\r\n\r\n get youtubeSrc(): string {\r\n let autoplay: 1 | 0 = 0;\r\n if (this.isActive && this.type === GalleryItemTypes.Youtube && (this.data as YoutubeItemData).autoplay) {\r\n autoplay = 1;\r\n }\r\n const url: URL = new URL(this.data.src as string);\r\n url.search = new URLSearchParams({\r\n wmode: 'transparent',\r\n ...(this.data as YoutubeItemData).params,\r\n autoplay\r\n }).toString();\r\n return url.href;\r\n }\r\n\r\n get load(): boolean {\r\n switch (this.config.loadingStrategy) {\r\n case LoadingStrategy.Preload:\r\n return true;\r\n case LoadingStrategy.Lazy:\r\n return this.currIndex === this.index;\r\n default:\r\n return this.currIndex === this.index || this.currIndex === this.index - 1 || this.currIndex === this.index + 1;\r\n }\r\n }\r\n\r\n get imageData(): ImageItemData {\r\n return this.data;\r\n }\r\n\r\n get videoData(): VideoItemData {\r\n return this.data;\r\n }\r\n\r\n constructor(private el: ElementRef) {\r\n }\r\n\r\n ngAfterViewInit(): void {\r\n // If item does not contain an image, then set the state to DONE\r\n if (!this.isItemContainImage) {\r\n this.state$.next('success');\r\n }\r\n }\r\n}\r\n\r\n", + "assetsDirs": [], + "styleUrlsData": [ + { + "data": ":host {\r\n cursor: var(--g-item-cursor);\r\n height: var(--g-item-height);\r\n width: var(--g-item-width);\r\n max-height: var(--g-item-max-height);\r\n max-width: var(--slider-width);\r\n z-index: 10;\r\n position: relative;\r\n overflow: hidden;\r\n display: flex;\r\n flex-direction: column;\r\n flex: 0 0 auto;\r\n scroll-snap-align: center;\r\n\r\n // Disable highlighting the elements on mouse move or click\r\n user-select: none;\r\n -webkit-user-drag: none;\r\n -webkit-tap-highlight-color: rgba(0, 0, 0, 0);\r\n\r\n // In itemAutoSize is true, item size will be zero until it is loaded, fallback to the slider size\r\n &[itemState='loading'] {\r\n width: var(--slider-width);\r\n height: var(--slider-height);\r\n }\r\n\r\n > * {\r\n height: 100%;\r\n }\r\n\r\n ::ng-deep {\r\n video, iframe {\r\n width: 100%;\r\n height: 100%;\r\n }\r\n }\r\n}\r\n\r\ngallery-image {\r\n width: var(--g-item-width);\r\n height: var(--g-item-height);\r\n}\r\n\r\n.g-template {\r\n position: absolute;\r\n z-index: 10;\r\n left: 0;\r\n top: 0;\r\n right: 0;\r\n bottom: 0;\r\n color: white;\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n flex-direction: column;\r\n}\r\n", + "styleUrl": "./gallery-item.scss" + } + ], + "stylesData": "", + "constructorObj": { + "name": "constructor", + "description": "", + "deprecated": false, + "deprecationMessage": "", + "args": [ + { + "name": "el", + "type": "ElementRef", + "deprecated": false, + "deprecationMessage": "" + } + ], + "line": 183, + "jsdoctags": [ + { + "name": "el", + "type": "ElementRef", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + } + ] + }, + "implements": [ + "AfterViewInit" + ], + "accessors": { + "isActive": { + "name": "isActive", + "getSignature": { + "name": "isActive", + "type": "boolean", + "returnType": "boolean", + "line": 104 + } + }, + "isIndexAttr": { + "name": "isIndexAttr", + "getSignature": { + "name": "isIndexAttr", + "type": "number", + "returnType": "number", + "line": 108 + } + }, + "itemState": { + "name": "itemState", + "getSignature": { + "name": "itemState", + "type": "", + "returnType": "ItemState", + "line": 112 + } + }, + "imageContext": { + "name": "imageContext", + "getSignature": { + "name": "imageContext", + "type": "", + "returnType": "GalleryItemContext", + "line": 116 + } + }, + "itemContext": { + "name": "itemContext", + "getSignature": { + "name": "itemContext", + "type": "", + "returnType": "GalleryItemContext", + "line": 128 + } + }, + "nativeElement": { + "name": "nativeElement", + "getSignature": { + "name": "nativeElement", + "type": "", + "returnType": "HTMLElement", + "line": 140 + } + }, + "isAutoPlay": { + "name": "isAutoPlay", + "getSignature": { + "name": "isAutoPlay", + "type": "boolean", + "returnType": "boolean", + "line": 144 + } + }, + "youtubeSrc": { + "name": "youtubeSrc", + "getSignature": { + "name": "youtubeSrc", + "type": "string", + "returnType": "string", + "line": 152 + } + }, + "load": { + "name": "load", + "getSignature": { + "name": "load", + "type": "boolean", + "returnType": "boolean", + "line": 166 + } + }, + "imageData": { + "name": "imageData", + "getSignature": { + "name": "imageData", + "type": "", + "returnType": "ImageItemData", + "line": 177 + } + }, + "videoData": { + "name": "videoData", + "getSignature": { + "name": "videoData", + "type": "", + "returnType": "VideoItemData", + "line": 181 + } + } + } + }, + { + "name": "GalleryNavComponent", + "id": "component-GalleryNavComponent-46e7626ad70c440670b8f602a5fec6ba6bcd1a7d8e5c34268aecdd68c82e1d1e0b21e5b6d3d83feaf9c2e67cdfeb1770ab4458dcd2b918546f1c4d7bb5294360", + "file": "projects/ng-gallery/src/lib/components/gallery-nav.component.ts", + "changeDetection": "ChangeDetectionStrategy.OnPush", + "encapsulation": [], + "entryComponents": [], + "inputs": [], + "outputs": [], + "providers": [], + "selector": "gallery-nav", + "styleUrls": [ + "./gallery-nav.scss" + ], + "styles": [], + "template": "\n\n\n", + "templateUrl": [], + "viewProviders": [], + "hostDirectives": [], + "inputsClass": [ + { + "name": "config", + "deprecated": false, + "deprecationMessage": "", + "line": 36, + "type": "GalleryConfig", + "decorators": [] + }, + { + "name": "galleryId", + "deprecated": false, + "deprecationMessage": "", + "line": 34, + "type": "string", + "decorators": [] + }, + { + "name": "state", + "deprecated": false, + "deprecationMessage": "", + "line": 35, + "type": "GalleryState", + "decorators": [] + } + ], + "outputsClass": [], + "propertiesClass": [ + { + "name": "dir", + "deprecated": false, + "deprecationMessage": "", + "type": "Directionality", + "optional": false, + "description": "", + "line": 38, + "modifierKind": [ + 123 + ] + }, + { + "name": "gallery", + "deprecated": false, + "deprecationMessage": "", + "type": "Gallery", + "optional": false, + "description": "", + "line": 38, + "modifierKind": [ + 123 + ] + }, + { + "name": "navIcon", + "deprecated": false, + "deprecationMessage": "", + "type": "SafeHtml", + "optional": false, + "description": "", + "line": 33 + } + ], + "methodsClass": [ + { + "name": "leftButton", + "args": [], + "optional": false, + "returnType": "void", + "typeParameters": [], + "line": 49, + "deprecated": false, + "deprecationMessage": "" + }, + { + "name": "ngOnInit", + "args": [], + "optional": false, + "returnType": "void", + "typeParameters": [], + "line": 41, + "deprecated": false, + "deprecationMessage": "" + }, + { + "name": "rightButton", + "args": [], + "optional": false, + "returnType": "void", + "typeParameters": [], + "line": 45, + "deprecated": false, + "deprecationMessage": "" + } + ], + "deprecated": false, + "deprecationMessage": "", + "hostBindings": [], + "hostListeners": [], + "standalone": true, + "imports": [ + { + "name": "CommonModule", + "type": "module" + } + ], + "description": "", + "rawdescription": "\n", + "type": "component", + "sourceCode": "import { Component, Input, OnInit, ChangeDetectionStrategy } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { DomSanitizer, SafeHtml } from '@angular/platform-browser';\r\nimport { Directionality } from '@angular/cdk/bidi';\r\nimport { Gallery } from '../services/gallery.service';\r\nimport { GalleryState } from '../models/gallery.model';\r\nimport { GalleryConfig } from '../models/config.model';\r\n\r\n@Component({\r\n selector: 'gallery-nav',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n styleUrls: ['./gallery-nav.scss'],\r\n template: `\r\n \r\n\r\n \r\n `,\r\n standalone: true,\r\n imports: [CommonModule]\r\n})\r\nexport class GalleryNavComponent implements OnInit {\r\n\r\n navIcon: SafeHtml;\r\n @Input('galleryId') id: string;\r\n @Input() state: GalleryState;\r\n @Input() config: GalleryConfig;\r\n\r\n constructor(public gallery: Gallery, private _sanitizer: DomSanitizer, public dir: Directionality) {\r\n }\r\n\r\n ngOnInit() {\r\n this.navIcon = this._sanitizer.bypassSecurityTrustHtml(this.config.navIcon);\r\n }\r\n\r\n rightButton() {\r\n\r\n }\r\n\r\n leftButton(): void {\r\n\r\n }\r\n}\r\n", + "assetsDirs": [], + "styleUrlsData": [ + { + "data": ".g-nav-next,\r\n.g-nav-prev {\r\n position: absolute;\r\n top: 50%;\r\n display: flex;\r\n padding: 16px 8px;\r\n cursor: pointer;\r\n z-index: 999;\r\n opacity: 0.6;\r\n transition: opacity linear 150ms, right linear 150ms, left linear 150ms;\r\n\r\n &:hover {\r\n opacity: 1;\r\n }\r\n\r\n ::ng-deep {\r\n svg {\r\n filter: var(--g-nav-drop-shadow);\r\n width: 28px;\r\n height: 28px;\r\n fill: #fff;\r\n }\r\n }\r\n}\r\n\r\n.g-nav-next {\r\n left: var(--nav-next-left);\r\n right: var(--nav-next-right);\r\n transform: var(--nav-next-transform);\r\n\r\n &:hover {\r\n left: var(--nav-next-hover-left);\r\n right: var(--nav-next-hover-right);\r\n }\r\n}\r\n\r\n.g-nav-prev {\r\n left: var(--nav-prev-left);\r\n right: var(--nav-prev-right);\r\n transform: var(--nav-prev-transform);\r\n\r\n &:hover {\r\n left: var(--nav-prev-hover-left);\r\n right: var(--nav-prev-hover-right);\r\n }\r\n}\r\n", + "styleUrl": "./gallery-nav.scss" + } + ], + "stylesData": "", + "constructorObj": { + "name": "constructor", + "description": "", + "deprecated": false, + "deprecationMessage": "", + "args": [ + { + "name": "gallery", + "type": "Gallery", + "deprecated": false, + "deprecationMessage": "" + }, + { + "name": "_sanitizer", + "type": "DomSanitizer", + "deprecated": false, + "deprecationMessage": "" + }, + { + "name": "dir", + "type": "Directionality", + "deprecated": false, + "deprecationMessage": "" + } + ], + "line": 36, + "jsdoctags": [ + { + "name": "gallery", + "type": "Gallery", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + }, + { + "name": "_sanitizer", + "type": "DomSanitizer", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + }, + { + "name": "dir", + "type": "Directionality", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + } + ] + }, + "implements": [ + "OnInit" + ] + }, + { + "name": "GallerySliderComponent", + "id": "component-GallerySliderComponent-8c5299b832f327bb20359ed9075c3ec50aa6d90b2a6dc31208ee1747da2edc10ae1f3542d9d4b43fefd90bb4361807e128b9f30704b3507f4fc014135c17251a", + "file": "projects/ng-gallery/src/lib/components/gallery-slider.component.ts", + "changeDetection": "ChangeDetectionStrategy.OnPush", + "encapsulation": [], + "entryComponents": [], + "inputs": [], + "outputs": [], + "providers": [], + "selector": "gallery-slider", + "styleUrls": [ + "./gallery-slider.scss" + ], + "styles": [], + "template": "
                                                                                                                                  \n
                                                                                                                                  \n \n
                                                                                                                                  \n\n
                                                                                                                                  \n
                                                                                                                                  RESIZING
                                                                                                                                  \n
                                                                                                                                  SCROLLING
                                                                                                                                  \n
                                                                                                                                  SLIDING
                                                                                                                                  \n
                                                                                                                                  \n
                                                                                                                                  \n\n", + "templateUrl": [], + "viewProviders": [], + "hostDirectives": [], + "inputsClass": [ + { + "name": "config", + "deprecated": false, + "deprecationMessage": "", + "rawdescription": "\nGallery config", + "description": "

                                                                                                                                  Gallery config

                                                                                                                                  \n", + "line": 104, + "type": "GalleryConfig", + "decorators": [] + }, + { + "name": "galleryId", + "deprecated": false, + "deprecationMessage": "", + "rawdescription": "\nGallery ID", + "description": "

                                                                                                                                  Gallery ID

                                                                                                                                  \n", + "line": 98, + "type": "string", + "decorators": [] + }, + { + "name": "state", + "deprecated": false, + "deprecationMessage": "", + "rawdescription": "\nGallery state", + "description": "

                                                                                                                                  Gallery state

                                                                                                                                  \n", + "line": 101, + "type": "GalleryState", + "decorators": [] + } + ], + "outputsClass": [ + { + "name": "error", + "defaultValue": "new EventEmitter()", + "deprecated": false, + "deprecationMessage": "", + "rawdescription": "\nStream that emits when an error occurs", + "description": "

                                                                                                                                  Stream that emits when an error occurs

                                                                                                                                  \n", + "line": 110, + "type": "EventEmitter" + }, + { + "name": "itemClick", + "defaultValue": "new EventEmitter()", + "deprecated": false, + "deprecationMessage": "", + "rawdescription": "\nStream that emits when item is clicked", + "description": "

                                                                                                                                  Stream that emits when item is clicked

                                                                                                                                  \n", + "line": 107, + "type": "EventEmitter" + } + ], + "propertiesClass": [ + { + "name": "adapter", + "deprecated": false, + "deprecationMessage": "", + "type": "SliderAdapter", + "optional": false, + "description": "

                                                                                                                                  Slider adapter

                                                                                                                                  \n", + "line": 86, + "rawdescription": "\nSlider adapter" + }, + { + "name": "isResizing", + "deprecated": false, + "deprecationMessage": "", + "type": "boolean", + "optional": false, + "description": "", + "line": 95 + }, + { + "name": "isScrolling", + "deprecated": false, + "deprecationMessage": "", + "type": "boolean", + "optional": false, + "description": "", + "line": 91 + }, + { + "name": "isSliding", + "deprecated": false, + "deprecationMessage": "", + "type": "boolean", + "optional": false, + "description": "", + "line": 93 + }, + { + "name": "items", + "defaultValue": "new QueryList()", + "deprecated": false, + "deprecationMessage": "", + "type": "QueryList", + "optional": false, + "description": "", + "line": 115, + "decorators": [ + { + "name": "ViewChildren", + "stringifiedArguments": "GalleryItemComponent" + } + ], + "modifierKind": [ + 167 + ] + }, + { + "name": "items$", + "deprecated": false, + "deprecationMessage": "", + "type": "Observable", + "optional": false, + "description": "

                                                                                                                                  Stream that emits the item components once they're initialized

                                                                                                                                  \n", + "line": 89, + "rawdescription": "\nStream that emits the item components once they're initialized" + }, + { + "name": "position$", + "defaultValue": "new Subject()", + "deprecated": false, + "deprecationMessage": "", + "type": "Subject", + "optional": false, + "description": "

                                                                                                                                  Stream that emits the slider position

                                                                                                                                  \n", + "line": 83, + "rawdescription": "\nStream that emits the slider position", + "modifierKind": [ + 146 + ] + }, + { + "name": "sliderEl", + "deprecated": false, + "deprecationMessage": "", + "type": "ElementRef", + "optional": false, + "description": "

                                                                                                                                  Slider ElementRef

                                                                                                                                  \n", + "line": 113, + "rawdescription": "\nSlider ElementRef", + "decorators": [ + { + "name": "ViewChild", + "stringifiedArguments": "'slider', {static: true}" + } + ], + "modifierKind": [ + 167 + ] + } + ], + "methodsClass": [ + { + "name": "ngAfterViewInit", + "args": [], + "optional": false, + "returnType": "void", + "typeParameters": [], + "line": 154, + "deprecated": false, + "deprecationMessage": "" + }, + { + "name": "ngOnChanges", + "args": [ + { + "name": "changes", + "type": "SimpleChanges", + "deprecated": false, + "deprecationMessage": "" + } + ], + "optional": false, + "returnType": "void", + "typeParameters": [], + "line": 124, + "deprecated": false, + "deprecationMessage": "", + "jsdoctags": [ + { + "name": "changes", + "type": "SimpleChanges", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + } + ] + }, + { + "name": "onActiveIndexChange", + "args": [ + { + "name": "index", + "type": "number", + "deprecated": false, + "deprecationMessage": "" + } + ], + "optional": false, + "returnType": "void", + "typeParameters": [], + "line": 167, + "deprecated": false, + "deprecationMessage": "", + "jsdoctags": [ + { + "name": "index", + "type": "number", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + } + ] + }, + { + "name": "scrollToIndex", + "args": [ + { + "name": "index", + "type": "number", + "deprecated": false, + "deprecationMessage": "" + }, + { + "name": "behavior", + "type": "ScrollBehavior", + "deprecated": false, + "deprecationMessage": "" + } + ], + "optional": false, + "returnType": "void", + "typeParameters": [], + "line": 176, + "deprecated": false, + "deprecationMessage": "", + "modifierKind": [ + 121 + ], + "jsdoctags": [ + { + "name": "index", + "type": "number", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + }, + { + "name": "behavior", + "type": "ScrollBehavior", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + } + ] + }, + { + "name": "trackByFn", + "args": [ + { + "name": "index", + "type": "number", + "deprecated": false, + "deprecationMessage": "" + }, + { + "name": "item", + "type": "any", + "deprecated": false, + "deprecationMessage": "" + } + ], + "optional": false, + "returnType": "any", + "typeParameters": [], + "line": 163, + "deprecated": false, + "deprecationMessage": "", + "jsdoctags": [ + { + "name": "index", + "type": "number", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + }, + { + "name": "item", + "type": "any", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + } + ] + } + ], + "deprecated": false, + "deprecationMessage": "", + "hostBindings": [], + "hostListeners": [], + "standalone": true, + "imports": [ + { + "name": "CommonModule", + "type": "module" + }, + { + "name": "GalleryItemComponent", + "type": "component" + }, + { + "name": "SmoothScroll" + }, + { + "name": "HammerSliding" + }, + { + "name": "SliderIntersectionObserver" + }, + { + "name": "ItemIntersectionObserver" + }, + { + "name": "SliderResizeObserver" + } + ], + "description": "", + "rawdescription": "\n", + "type": "component", + "sourceCode": "import {\r\n Component,\r\n Input,\r\n Output,\r\n ViewChild,\r\n ViewChildren,\r\n EventEmitter,\r\n AfterViewInit,\r\n OnChanges,\r\n SimpleChanges,\r\n ElementRef,\r\n QueryList,\r\n ChangeDetectionStrategy\r\n} from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { Observable, Subject, map, startWith } from 'rxjs';\r\nimport { Gallery } from '../services/gallery.service';\r\nimport { GalleryState, GalleryError } from '../models/gallery.model';\r\nimport { GalleryConfig } from '../models/config.model';\r\nimport { Orientation } from '../models/constants';\r\nimport { SliderAdapter, HorizontalAdapter, VerticalAdapter } from './adapters';\r\nimport { SmoothScroll, SmoothScrollOptions } from '../smooth-scroll';\r\nimport { HammerSliding } from '../gestures/hammer-sliding.directive';\r\nimport { SliderIntersectionObserver } from '../observers/slider-intersection-observer.directive';\r\nimport { ItemIntersectionObserver } from '../observers/item-intersection-observer.directive';\r\nimport { GalleryItemComponent } from './gallery-item.component';\r\nimport { SliderResizeObserver } from '../observers/slider-resize-observer.directive';\r\n\r\n@Component({\r\n selector: 'gallery-slider',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n styleUrls: ['./gallery-slider.scss'],\r\n template: `\r\n
                                                                                                                                  \r\n
                                                                                                                                  \r\n \r\n
                                                                                                                                  \r\n\r\n
                                                                                                                                  \r\n
                                                                                                                                  RESIZING
                                                                                                                                  \r\n
                                                                                                                                  SCROLLING
                                                                                                                                  \r\n
                                                                                                                                  SLIDING
                                                                                                                                  \r\n
                                                                                                                                  \r\n
                                                                                                                                  \r\n \r\n `,\r\n standalone: true,\r\n imports: [CommonModule, GalleryItemComponent, SmoothScroll, HammerSliding, SliderIntersectionObserver, ItemIntersectionObserver, SliderResizeObserver]\r\n})\r\nexport class GallerySliderComponent implements AfterViewInit, OnChanges {\r\n\r\n /** Stream that emits the slider position */\r\n readonly position$: Subject = new Subject();\r\n\r\n /** Slider adapter */\r\n adapter: SliderAdapter;\r\n\r\n /** Stream that emits the item components once they're initialized */\r\n items$: Observable;\r\n\r\n isScrolling: boolean;\r\n\r\n isSliding: boolean;\r\n\r\n isResizing: boolean;\r\n\r\n /** Gallery ID */\r\n @Input() galleryId: string;\r\n\r\n /** Gallery state */\r\n @Input() state: GalleryState;\r\n\r\n /** Gallery config */\r\n @Input() config: GalleryConfig;\r\n\r\n /** Stream that emits when item is clicked */\r\n @Output() itemClick: EventEmitter = new EventEmitter();\r\n\r\n /** Stream that emits when an error occurs */\r\n @Output() error: EventEmitter = new EventEmitter();\r\n\r\n /** Slider ElementRef */\r\n @ViewChild('slider', { static: true }) sliderEl: ElementRef;\r\n\r\n @ViewChildren(GalleryItemComponent) items: QueryList = new QueryList();\r\n\r\n get slider(): HTMLElement {\r\n return this.sliderEl.nativeElement;\r\n }\r\n\r\n constructor(private _gallery: Gallery) {\r\n }\r\n\r\n ngOnChanges(changes: SimpleChanges): void {\r\n if (changes.config) {\r\n if (changes.config.currentValue?.orientation !== changes.config.previousValue?.orientation) {\r\n switch (this.config.orientation) {\r\n case Orientation.Horizontal:\r\n this.adapter = new HorizontalAdapter(this.slider, this.config);\r\n break;\r\n case Orientation.Vertical:\r\n this.adapter = new VerticalAdapter(this.slider, this.config);\r\n break;\r\n }\r\n }\r\n if (!changes.config.firstChange) {\r\n // Keep the correct sliding position when direction changes\r\n requestAnimationFrame(() => {\r\n this.scrollToIndex(this.state.currIndex, 'auto');\r\n });\r\n }\r\n }\r\n\r\n // Scroll to current index\r\n if (changes.state) {\r\n if (changes.state.currentValue?.currIndex !== changes.state.previousValue?.currIndex) {\r\n requestAnimationFrame(() => {\r\n this.scrollToIndex(this.state.currIndex, changes.state.firstChange ? 'auto' : this.state.behavior);\r\n });\r\n }\r\n }\r\n }\r\n\r\n ngAfterViewInit(): void {\r\n this.items.notifyOnChanges();\r\n this.items$ = this.items.changes.pipe(\r\n // In some cases, items is not notified at first, need to force start the stream\r\n startWith(null),\r\n map(() => this.items.toArray())\r\n );\r\n }\r\n\r\n trackByFn(index: number, item: any) {\r\n return item.type;\r\n }\r\n\r\n onActiveIndexChange(index: number): void {\r\n if (index === -1) {\r\n // Reset active index position\r\n this.scrollToIndex(this.state.currIndex, 'smooth');\r\n } else {\r\n this._gallery.ref(this.galleryId).set(index, 'smooth');\r\n }\r\n }\r\n\r\n private scrollToIndex(index: number, behavior: ScrollBehavior): void {\r\n const el: HTMLElement = this.items.get(index)?.nativeElement;\r\n if (el) {\r\n const pos: SmoothScrollOptions = this.adapter.getScrollToValue(el, behavior || this.config.scrollBehavior);\r\n this.position$.next(pos);\r\n }\r\n }\r\n}\r\n", + "assetsDirs": [], + "styleUrlsData": [ + { + "data": ":host {\r\n position: relative;\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n overflow: hidden;\r\n order: 1;\r\n flex: 1;\r\n}\r\n\r\n.g-slider {\r\n display: flex;\r\n align-items: center;\r\n transition: var(--g-height-transition);\r\n min-height: 100%;\r\n min-width: 100%;\r\n max-height: 100%;\r\n max-width: 100%;\r\n height: var(--slider-height, 100%);\r\n width: var(--slider-width, 100%);\r\n\r\n overflow: var(--slider-overflow);\r\n scroll-snap-type: var(--slider-scroll-snap-type);\r\n flex-direction: var(--slider-flex-direction);\r\n\r\n scrollbar-width: none;\r\n\r\n &::-webkit-scrollbar {\r\n display: none;\r\n }\r\n\r\n &.g-sliding, &.g-scrolling {\r\n // Disable mouse click on gallery items/thumbnails when the slider is being dragged using the mouse\r\n .g-slider-content {\r\n pointer-events: none;\r\n }\r\n }\r\n\r\n &[centralised=\"true\"] {\r\n &:before, &:after {\r\n content: '';\r\n }\r\n\r\n &:before {\r\n flex: 0 0 var(--slider-centralize-start-size);\r\n }\r\n\r\n &:after {\r\n flex: 0 0 var(--slider-centralize-end-size);\r\n }\r\n }\r\n}\r\n\r\n.g-slider-content {\r\n flex: 0 0 auto;\r\n display: flex;\r\n align-items: center;\r\n gap: 1px;\r\n width: var(--slider-content-width, unset);\r\n height: var(--slider-content-height, unset);\r\n flex-direction: var(--slider-flex-direction);\r\n}\r\n", + "styleUrl": "./gallery-slider.scss" + } + ], + "stylesData": "", + "constructorObj": { + "name": "constructor", + "description": "", + "deprecated": false, + "deprecationMessage": "", + "args": [ + { + "name": "_gallery", + "type": "Gallery", + "deprecated": false, + "deprecationMessage": "" + } + ], + "line": 119, + "jsdoctags": [ + { + "name": "_gallery", + "type": "Gallery", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + } + ] + }, + "implements": [ + "AfterViewInit", + "OnChanges" + ], + "accessors": { + "slider": { + "name": "slider", + "getSignature": { + "name": "slider", + "type": "", + "returnType": "HTMLElement", + "line": 117 + } + } + } + }, + { + "name": "GalleryThumbComponent", + "id": "component-GalleryThumbComponent-319cc5375529a354d03dd248985279976b8f789f3f0ac96bd512add0afb24bbc9369c7922a86b7d84ec489068c9e7143c3d0ca5668ce2a70f90d12d9868f6436", + "file": "projects/ng-gallery/src/lib/components/gallery-thumb.component.ts", + "changeDetection": "ChangeDetectionStrategy.OnPush", + "encapsulation": [], + "entryComponents": [], + "inputs": [], + "outputs": [], + "providers": [], + "selector": "gallery-thumb", + "styleUrls": [ + "./gallery-thumb.scss" + ], + "styles": [], + "template": "\n\n
                                                                                                                                  \n \n
                                                                                                                                  \n", + "templateUrl": [], + "viewProviders": [], + "hostDirectives": [], + "inputsClass": [ + { + "name": "config", + "deprecated": false, + "deprecationMessage": "", + "line": 38, + "type": "GalleryConfig", + "decorators": [] + }, + { + "name": "count", + "deprecated": false, + "deprecationMessage": "", + "rawdescription": "\nThe number of total items", + "description": "

                                                                                                                                  The number of total items

                                                                                                                                  \n", + "line": 44, + "type": "number", + "decorators": [] + }, + { + "name": "currIndex", + "deprecated": false, + "deprecationMessage": "", + "rawdescription": "\nGallery current index", + "description": "

                                                                                                                                  Gallery current index

                                                                                                                                  \n", + "line": 47, + "type": "number", + "decorators": [] + }, + { + "name": "data", + "deprecated": false, + "deprecationMessage": "", + "rawdescription": "\nItem's data, this object contains the data required to display the content (e.g. src path)", + "description": "

                                                                                                                                  Item's data, this object contains the data required to display the content (e.g. src path)

                                                                                                                                  \n", + "line": 53, + "type": "ImageItemData", + "decorators": [] + }, + { + "name": "index", + "deprecated": false, + "deprecationMessage": "", + "rawdescription": "\nItem's index in the gallery", + "description": "

                                                                                                                                  Item's index in the gallery

                                                                                                                                  \n", + "line": 41, + "type": "number", + "decorators": [] + }, + { + "name": "type", + "deprecated": false, + "deprecationMessage": "", + "rawdescription": "\nItem's type 'image', 'video', 'youtube', 'iframe'", + "description": "

                                                                                                                                  Item's type 'image', 'video', 'youtube', 'iframe'

                                                                                                                                  \n", + "line": 50, + "type": "GalleryItemType", + "decorators": [] + } + ], + "outputsClass": [ + { + "name": "error", + "defaultValue": "new EventEmitter()", + "deprecated": false, + "deprecationMessage": "", + "line": 55, + "type": "EventEmitter" + } + ], + "propertiesClass": [], + "methodsClass": [], + "deprecated": false, + "deprecationMessage": "", + "hostBindings": [ + { + "name": "attr.galleryIndex", + "deprecated": false, + "deprecationMessage": "", + "line": 61, + "type": "number", + "decorators": [] + }, + { + "name": "class.g-active-thumb", + "deprecated": false, + "deprecationMessage": "", + "line": 57, + "type": "boolean", + "decorators": [] + } + ], + "hostListeners": [], + "standalone": true, + "imports": [ + { + "name": "CommonModule", + "type": "module" + }, + { + "name": "GalleryImageComponent", + "type": "component" + } + ], + "description": "", + "rawdescription": "\n", + "type": "component", + "sourceCode": "import {\r\n Component,\r\n Input,\r\n Output,\r\n HostBinding,\r\n EventEmitter,\r\n ElementRef,\r\n ChangeDetectionStrategy\r\n} from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { GalleryItemContext } from '../directives/gallery-item-def.directive';\r\nimport { GalleryImageComponent } from './templates/gallery-image.component';\r\nimport { ImageItemData } from './templates/items.model';\r\nimport { GalleryConfig } from '../models/config.model';\r\nimport { GalleryItemType } from '../models/constants';\r\n\r\n@Component({\r\n selector: 'gallery-thumb',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n styleUrls: ['./gallery-thumb.scss'],\r\n template: `\r\n \r\n\r\n
                                                                                                                                  \r\n \r\n
                                                                                                                                  \r\n `,\r\n standalone: true,\r\n imports: [CommonModule, GalleryImageComponent]\r\n})\r\nexport class GalleryThumbComponent {\r\n\r\n @Input() config: GalleryConfig;\r\n\r\n /** Item's index in the gallery */\r\n @Input() index: number;\r\n\r\n /** The number of total items */\r\n @Input() count: number;\r\n\r\n /** Gallery current index */\r\n @Input() currIndex: number;\r\n\r\n /** Item's type 'image', 'video', 'youtube', 'iframe' */\r\n @Input() type: GalleryItemType;\r\n\r\n /** Item's data, this object contains the data required to display the content (e.g. src path) */\r\n @Input() data: ImageItemData;\r\n\r\n @Output() error: EventEmitter = new EventEmitter();\r\n\r\n @HostBinding('class.g-active-thumb') get isActive() {\r\n return this.index === this.currIndex;\r\n }\r\n\r\n @HostBinding('attr.galleryIndex') get isIndexAttr(): number {\r\n return this.index;\r\n }\r\n\r\n get imageContext(): GalleryItemContext {\r\n return {\r\n $implicit: this.data,\r\n index: this.index,\r\n type: this.type,\r\n active: this.isActive,\r\n count: this.count,\r\n first: this.index === 0,\r\n last: this.index === this.count - 1\r\n }\r\n }\r\n\r\n get nativeElement(): HTMLElement {\r\n return this.el.nativeElement;\r\n }\r\n\r\n constructor(private el: ElementRef) {\r\n }\r\n}\r\n", + "assetsDirs": [], + "styleUrlsData": [ + { + "data": ":host {\r\n cursor: var(--g-thumb-cursor);\r\n height: var(--g-thumb-height);\r\n width: var(--g-thumb-width);\r\n max-height: var(--g-thumb-height);\r\n max-width: var(--g-thumb-width);\r\n align-self: center;\r\n background: black;\r\n position: relative;\r\n display: flex;\r\n overflow: hidden;\r\n flex-direction: column;\r\n flex: 0 0 auto;\r\n scroll-snap-align: center;\r\n // Disable highlighting the elements on mouse move or click\r\n user-select: none;\r\n -webkit-user-drag: none;\r\n -webkit-tap-highlight-color: rgba(0, 0, 0, 0);\r\n\r\n --g-thumb-opacity: 0.5;\r\n\r\n &.g-active-thumb {\r\n --g-thumb-opacity: 1;\r\n }\r\n}\r\n\r\n.g-template {\r\n position: absolute;\r\n z-index: 10;\r\n left: 0;\r\n top: 0;\r\n right: 0;\r\n bottom: 0;\r\n color: white;\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n flex-direction: column;\r\n}\r\n", + "styleUrl": "./gallery-thumb.scss" + } + ], + "stylesData": "", + "constructorObj": { + "name": "constructor", + "description": "", + "deprecated": false, + "deprecationMessage": "", + "args": [ + { + "name": "el", + "type": "ElementRef", + "deprecated": false, + "deprecationMessage": "" + } + ], + "line": 79, + "jsdoctags": [ + { + "name": "el", + "type": "ElementRef", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + } + ] + }, + "accessors": { + "isActive": { + "name": "isActive", + "getSignature": { + "name": "isActive", + "type": "", + "returnType": "", + "line": 57 + } + }, + "isIndexAttr": { + "name": "isIndexAttr", + "getSignature": { + "name": "isIndexAttr", + "type": "number", + "returnType": "number", + "line": 61 + } + }, + "imageContext": { + "name": "imageContext", + "getSignature": { + "name": "imageContext", + "type": "", + "returnType": "GalleryItemContext", + "line": 65 + } + }, + "nativeElement": { + "name": "nativeElement", + "getSignature": { + "name": "nativeElement", + "type": "", + "returnType": "HTMLElement", + "line": 77 + } + } + } + }, + { + "name": "GalleryThumbsComponent", + "id": "component-GalleryThumbsComponent-de19f00cdfd53eb5cbb332ead8da65e2cafd15883a14cfea3cbf114e4219ce6927795a87f8565ae004edbd11823b07479c9871236e2a1cd241dfd6a1bea65647", + "file": "projects/ng-gallery/src/lib/components/gallery-thumbs.component.ts", + "changeDetection": "ChangeDetectionStrategy.OnPush", + "encapsulation": [], + "entryComponents": [], + "inputs": [], + "outputs": [], + "providers": [], + "selector": "gallery-thumbs", + "styleUrls": [ + "./gallery-thumbs.scss" + ], + "styles": [], + "template": "
                                                                                                                                  \n
                                                                                                                                  \n \n
                                                                                                                                  \n
                                                                                                                                  \n", + "templateUrl": [], + "viewProviders": [], + "hostDirectives": [], + "inputsClass": [ + { + "name": "config", + "deprecated": false, + "deprecationMessage": "", + "rawdescription": "\nGallery config", + "description": "

                                                                                                                                  Gallery config

                                                                                                                                  \n", + "line": 79, + "type": "GalleryConfig", + "decorators": [] + }, + { + "name": "galleryId", + "deprecated": false, + "deprecationMessage": "", + "rawdescription": "\nGallery ID", + "description": "

                                                                                                                                  Gallery ID

                                                                                                                                  \n", + "line": 73, + "type": "string", + "decorators": [] + }, + { + "name": "state", + "deprecated": false, + "deprecationMessage": "", + "rawdescription": "\nGallery state", + "description": "

                                                                                                                                  Gallery state

                                                                                                                                  \n", + "line": 76, + "type": "GalleryState", + "decorators": [] + } + ], + "outputsClass": [ + { + "name": "error", + "defaultValue": "new EventEmitter()", + "deprecated": false, + "deprecationMessage": "", + "rawdescription": "\nStream that emits when an error occurs", + "description": "

                                                                                                                                  Stream that emits when an error occurs

                                                                                                                                  \n", + "line": 85, + "type": "EventEmitter" + }, + { + "name": "thumbClick", + "defaultValue": "new EventEmitter()", + "deprecated": false, + "deprecationMessage": "", + "rawdescription": "\nStream that emits when thumb is clicked", + "description": "

                                                                                                                                  Stream that emits when thumb is clicked

                                                                                                                                  \n", + "line": 82, + "type": "EventEmitter" + } + ], + "propertiesClass": [ + { + "name": "adapter", + "deprecated": false, + "deprecationMessage": "", + "type": "SliderAdapter", + "optional": false, + "description": "

                                                                                                                                  Slider adapter

                                                                                                                                  \n", + "line": 67, + "rawdescription": "\nSlider adapter" + }, + { + "name": "items", + "defaultValue": "new QueryList()", + "deprecated": false, + "deprecationMessage": "", + "type": "QueryList", + "optional": false, + "description": "", + "line": 90, + "decorators": [ + { + "name": "ViewChildren", + "stringifiedArguments": "GalleryThumbComponent" + } + ], + "modifierKind": [ + 167 + ] + }, + { + "name": "items$", + "deprecated": false, + "deprecationMessage": "", + "type": "Observable", + "optional": false, + "description": "

                                                                                                                                  Stream that emits the thumb components once they're initialized

                                                                                                                                  \n", + "line": 70, + "rawdescription": "\nStream that emits the thumb components once they're initialized" + }, + { + "name": "position$", + "defaultValue": "new Subject()", + "deprecated": false, + "deprecationMessage": "", + "type": "Subject", + "optional": false, + "description": "

                                                                                                                                  Stream that emits the slider position

                                                                                                                                  \n", + "line": 64, + "rawdescription": "\nStream that emits the slider position", + "modifierKind": [ + 146 + ] + }, + { + "name": "sliderEl", + "deprecated": false, + "deprecationMessage": "", + "type": "ElementRef", + "optional": false, + "description": "

                                                                                                                                  Slider ElementRef

                                                                                                                                  \n", + "line": 88, + "rawdescription": "\nSlider ElementRef", + "decorators": [ + { + "name": "ViewChild", + "stringifiedArguments": "'slider', {static: true}" + } + ], + "modifierKind": [ + 167 + ] + } + ], + "methodsClass": [ + { + "name": "ngAfterViewInit", + "args": [], + "optional": false, + "returnType": "void", + "typeParameters": [], + "line": 130, + "deprecated": false, + "deprecationMessage": "" + }, + { + "name": "ngOnChanges", + "args": [ + { + "name": "changes", + "type": "SimpleChanges", + "deprecated": false, + "deprecationMessage": "" + } + ], + "optional": false, + "returnType": "void", + "typeParameters": [], + "line": 96, + "deprecated": false, + "deprecationMessage": "", + "jsdoctags": [ + { + "name": "changes", + "type": "SimpleChanges", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + } + ] + }, + { + "name": "onActiveIndexChange", + "args": [ + { + "name": "index", + "type": "number", + "deprecated": false, + "deprecationMessage": "" + } + ], + "optional": false, + "returnType": "void", + "typeParameters": [], + "line": 143, + "deprecated": false, + "deprecationMessage": "", + "jsdoctags": [ + { + "name": "index", + "type": "number", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + } + ] + }, + { + "name": "scrollToIndex", + "args": [ + { + "name": "value", + "type": "number", + "deprecated": false, + "deprecationMessage": "" + }, + { + "name": "behavior", + "type": "ScrollBehavior", + "deprecated": false, + "deprecationMessage": "" + } + ], + "optional": false, + "returnType": "void", + "typeParameters": [], + "line": 152, + "deprecated": false, + "deprecationMessage": "", + "jsdoctags": [ + { + "name": "value", + "type": "number", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + }, + { + "name": "behavior", + "type": "ScrollBehavior", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + } + ] + }, + { + "name": "trackByFn", + "args": [ + { + "name": "index", + "type": "number", + "deprecated": false, + "deprecationMessage": "" + }, + { + "name": "item", + "type": "any", + "deprecated": false, + "deprecationMessage": "" + } + ], + "optional": false, + "returnType": "any", + "typeParameters": [], + "line": 139, + "deprecated": false, + "deprecationMessage": "", + "jsdoctags": [ + { + "name": "index", + "type": "number", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + }, + { + "name": "item", + "type": "any", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + } + ] + } + ], + "deprecated": false, + "deprecationMessage": "", + "hostBindings": [], + "hostListeners": [], + "standalone": true, + "imports": [ + { + "name": "CommonModule", + "type": "module" + }, + { + "name": "GalleryThumbComponent", + "type": "component" + }, + { + "name": "SmoothScroll" + }, + { + "name": "HammerSliding" + }, + { + "name": "ThumbResizeObserver" + } + ], + "description": "", + "rawdescription": "\n", + "type": "component", + "sourceCode": "import {\r\n Component,\r\n Input,\r\n Output,\r\n ViewChild,\r\n ViewChildren,\r\n EventEmitter,\r\n AfterViewInit,\r\n OnChanges,\r\n QueryList,\r\n SimpleChanges,\r\n ElementRef,\r\n ChangeDetectionStrategy\r\n} from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { Observable, Subject, map, startWith } from 'rxjs';\r\nimport { GalleryConfig } from '../models/config.model';\r\nimport { GalleryState, GalleryError } from '../models/gallery.model';\r\nimport { ThumbnailsPosition } from '../models/constants';\r\nimport { VerticalAdapter, HorizontalAdapter, SliderAdapter } from './adapters';\r\nimport { SmoothScroll, SmoothScrollOptions } from '../smooth-scroll';\r\nimport { GalleryThumbComponent } from './gallery-thumb.component';\r\nimport { HammerSliding } from '../gestures/hammer-sliding.directive';\r\nimport { ThumbResizeObserver } from '../observers/thumb-resize-observer.directive';\r\n\r\n@Component({\r\n selector: 'gallery-thumbs',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n styleUrls: ['./gallery-thumbs.scss'],\r\n template: `\r\n
                                                                                                                                  \r\n
                                                                                                                                  \r\n \r\n
                                                                                                                                  \r\n
                                                                                                                                  \r\n `,\r\n standalone: true,\r\n imports: [CommonModule, GalleryThumbComponent, SmoothScroll, HammerSliding, ThumbResizeObserver]\r\n})\r\nexport class GalleryThumbsComponent implements AfterViewInit, OnChanges {\r\n\r\n /** Stream that emits the slider position */\r\n readonly position$: Subject = new Subject();\r\n\r\n /** Slider adapter */\r\n adapter: SliderAdapter;\r\n\r\n /** Stream that emits the thumb components once they're initialized */\r\n items$: Observable;\r\n\r\n /** Gallery ID */\r\n @Input() galleryId: string;\r\n\r\n /** Gallery state */\r\n @Input() state: GalleryState;\r\n\r\n /** Gallery config */\r\n @Input() config: GalleryConfig;\r\n\r\n /** Stream that emits when thumb is clicked */\r\n @Output() thumbClick: EventEmitter = new EventEmitter();\r\n\r\n /** Stream that emits when an error occurs */\r\n @Output() error: EventEmitter = new EventEmitter();\r\n\r\n /** Slider ElementRef */\r\n @ViewChild('slider', { static: true }) sliderEl: ElementRef;\r\n\r\n @ViewChildren(GalleryThumbComponent) items: QueryList = new QueryList();\r\n\r\n get slider(): HTMLElement {\r\n return this.sliderEl.nativeElement;\r\n }\r\n\r\n ngOnChanges(changes: SimpleChanges): void {\r\n if (changes.config) {\r\n // Sets sliding direction\r\n if (changes.config.currentValue?.thumbPosition !== changes.config.previousValue?.thumbPosition) {\r\n switch (this.config.thumbPosition) {\r\n case ThumbnailsPosition.Right:\r\n case ThumbnailsPosition.Left:\r\n this.adapter = new VerticalAdapter(this.slider, this.config);\r\n break;\r\n case ThumbnailsPosition.Top:\r\n case ThumbnailsPosition.Bottom:\r\n this.adapter = new HorizontalAdapter(this.slider, this.config);\r\n break;\r\n }\r\n\r\n if (!changes.config.firstChange) {\r\n // Keep the correct sliding position when direction changes\r\n requestAnimationFrame(() => {\r\n this.scrollToIndex(this.state.currIndex, 'auto');\r\n });\r\n }\r\n }\r\n }\r\n\r\n if (changes.state && (changes.state.firstChange || !this.config.detachThumbs)) {\r\n if (changes.state.currentValue?.currIndex !== changes.state.previousValue?.currIndex) {\r\n // Scroll slide to item when current index changes.\r\n requestAnimationFrame(() => {\r\n this.scrollToIndex(this.state.currIndex, changes.state?.firstChange ? 'auto' : 'smooth');\r\n });\r\n }\r\n }\r\n }\r\n\r\n ngAfterViewInit(): void {\r\n this.items.notifyOnChanges();\r\n this.items$ = this.items.changes.pipe(\r\n // In some cases, items is not notified at first, need to force start the stream\r\n startWith(null),\r\n map(() => this.items.toArray())\r\n );\r\n }\r\n\r\n trackByFn(index: number, item: any) {\r\n return item.type;\r\n }\r\n\r\n onActiveIndexChange(index: number): void {\r\n if (index === -1) {\r\n // Reset active index position\r\n this.scrollToIndex(this.state.currIndex, 'smooth');\r\n } else {\r\n this.scrollToIndex(index, 'smooth');\r\n }\r\n }\r\n\r\n scrollToIndex(value: number, behavior: ScrollBehavior): void {\r\n const el: HTMLElement = this.items.get(value)?.nativeElement;\r\n if (el) {\r\n const pos: SmoothScrollOptions = this.adapter.getScrollToValue(el, behavior);\r\n this.position$.next(pos);\r\n }\r\n }\r\n}\r\n", + "assetsDirs": [], + "styleUrlsData": [ + { + "data": ":host {\r\n max-height: 100%;\r\n max-width: 100%;\r\n display: block;\r\n z-index: 100;\r\n}\r\n\r\n.g-slider {\r\n display: flex;\r\n align-items: center;\r\n transition: var(--g-height-transition);\r\n max-height: 100%;\r\n min-width: 100%;\r\n height: var(--thumb-slider-height);\r\n width: var(--thumb-slider-width);\r\n\r\n top: var(--thumb-slider-top);\r\n left: var(--thumb-slider-left);\r\n overflow: var(--thumb-slider-overflow);\r\n scroll-snap-type: var(--slider-scroll-snap-type);\r\n flex-direction: var(--thumb-slider-flex-direction);\r\n\r\n scrollbar-width: none;\r\n\r\n &::-webkit-scrollbar {\r\n display: none;\r\n }\r\n\r\n // Disable mouse click on gallery items/thumbnails when the slider is being dragged using the mouse\r\n &.g-sliding {\r\n // Disable mouse click on gallery items/thumbnails when the slider is being dragged using the mouse\r\n .g-slider-content {\r\n pointer-events: none;\r\n }\r\n }\r\n\r\n &[centralised=\"true\"] {\r\n &:before, &:after {\r\n content: '';\r\n }\r\n\r\n &:before {\r\n flex: 0 0 var(--thumb-centralize-start-size);\r\n }\r\n\r\n &:after {\r\n flex: 0 0 var(--thumb-centralize-end-size);\r\n }\r\n }\r\n}\r\n\r\n.g-slider-content {\r\n flex: 0 0 auto;\r\n display: flex;\r\n flex-direction: var(--thumb-slider-flex-direction);\r\n align-items: center;\r\n gap: 1px;\r\n}\r\n", + "styleUrl": "./gallery-thumbs.scss" + } + ], + "stylesData": "", + "implements": [ + "AfterViewInit", + "OnChanges" + ], + "accessors": { + "slider": { + "name": "slider", + "getSignature": { + "name": "slider", + "type": "", + "returnType": "HTMLElement", + "line": 92 + } + } + } + }, + { + "name": "GalleryVideoComponent", + "id": "component-GalleryVideoComponent-8373f3076bce537ab094b2f99b71fead7a20a6fa2e14f19abf4fa0edfd03f4d2d2465bbe8caf0ae8429a916cd68da813b72cc2466caf5d0b8d718d54c16c1475", + "file": "projects/ng-gallery/src/lib/components/templates/gallery-video.component.ts", + "changeDetection": "ChangeDetectionStrategy.OnPush", + "encapsulation": [], + "entryComponents": [], + "inputs": [], + "outputs": [], + "providers": [], + "selector": "gallery-video", + "styleUrls": [], + "styles": [], + "template": "\n", + "templateUrl": [], + "viewProviders": [], + "hostDirectives": [], + "inputsClass": [ + { + "name": "controls", + "deprecated": false, + "deprecationMessage": "", + "line": 36, + "type": "boolean", + "decorators": [] + }, + { + "name": "controlsList", + "deprecated": false, + "deprecationMessage": "", + "line": 37, + "type": "\"nodownload\" | \"nofullscreen\" | \"noremoteplayback\"", + "decorators": [] + }, + { + "name": "disablePictureInPicture", + "deprecated": false, + "deprecationMessage": "", + "line": 39, + "type": "boolean", + "decorators": [] + }, + { + "name": "disableRemotePlayback", + "deprecated": false, + "deprecationMessage": "", + "line": 38, + "type": "boolean", + "decorators": [] + }, + { + "name": "loop", + "deprecated": false, + "deprecationMessage": "", + "line": 35, + "type": "boolean", + "decorators": [] + }, + { + "name": "mute", + "deprecated": false, + "deprecationMessage": "", + "line": 34, + "type": "boolean", + "decorators": [] + }, + { + "name": "pause", + "deprecated": false, + "deprecationMessage": "", + "line": 41, + "type": "boolean", + "decorators": [] + }, + { + "name": "play", + "deprecated": false, + "deprecationMessage": "", + "line": 50, + "type": "boolean", + "decorators": [] + }, + { + "name": "poster", + "deprecated": false, + "deprecationMessage": "", + "line": 33, + "type": "string", + "decorators": [] + }, + { + "name": "src", + "deprecated": false, + "deprecationMessage": "", + "line": 32, + "type": "string | literal type[]", + "decorators": [] + } + ], + "outputsClass": [ + { + "name": "error", + "defaultValue": "new EventEmitter()", + "deprecated": false, + "deprecationMessage": "", + "rawdescription": "\nStream that emits when an error occurs", + "description": "

                                                                                                                                  Stream that emits when an error occurs

                                                                                                                                  \n", + "line": 60, + "type": "EventEmitter" + } + ], + "propertiesClass": [ + { + "name": "video", + "deprecated": false, + "deprecationMessage": "", + "type": "ElementRef", + "optional": false, + "description": "", + "line": 62, + "decorators": [ + { + "name": "ViewChild", + "stringifiedArguments": "'video', {static: true}" + } + ], + "modifierKind": [ + 167 + ] + }, + { + "name": "videoSources", + "deprecated": false, + "deprecationMessage": "", + "type": "literal type[]", + "optional": false, + "description": "", + "line": 30 + } + ], + "methodsClass": [ + { + "name": "ngOnInit", + "args": [], + "optional": false, + "returnType": "void", + "typeParameters": [], + "line": 64, + "deprecated": false, + "deprecationMessage": "" + } + ], + "deprecated": false, + "deprecationMessage": "", + "hostBindings": [], + "hostListeners": [], + "standalone": true, + "imports": [ + { + "name": "NgFor" + }, + { + "name": "NgIf" + } + ], + "description": "", + "rawdescription": "\n", + "type": "component", + "sourceCode": "import { Component, Input, Output, EventEmitter, OnInit, ViewChild, ElementRef, ChangeDetectionStrategy } from '@angular/core';\r\nimport { NgFor, NgIf } from '@angular/common';\r\n\r\n@Component({\r\n selector: 'gallery-video',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n template: `\r\n \r\n `,\r\n standalone: true,\r\n imports: [NgFor, NgIf]\r\n})\r\nexport class GalleryVideoComponent implements OnInit {\r\n\r\n videoSources: { url: string, type?: string }[];\r\n\r\n @Input() src: string | { url: string, type?: string }[];\r\n @Input() poster: string;\r\n @Input() mute: boolean;\r\n @Input() loop: boolean;\r\n @Input() controls: boolean;\r\n @Input() controlsList: 'nodownload' | 'nofullscreen' | 'noremoteplayback';\r\n @Input() disableRemotePlayback: boolean;\r\n @Input() disablePictureInPicture: boolean;\r\n\r\n @Input('pause') set pauseVideo(shouldPause: boolean) {\r\n if (this.video.nativeElement) {\r\n const video: HTMLVideoElement = this.video.nativeElement;\r\n if (shouldPause && !video.paused) {\r\n video.pause();\r\n }\r\n }\r\n }\r\n\r\n @Input('play') set playVideo(shouldPlay: boolean) {\r\n if (this.video.nativeElement) {\r\n const video: HTMLVideoElement = this.video.nativeElement;\r\n if (shouldPlay) {\r\n video.play();\r\n }\r\n }\r\n }\r\n\r\n /** Stream that emits when an error occurs */\r\n @Output() error = new EventEmitter();\r\n\r\n @ViewChild('video', { static: true }) video: ElementRef;\r\n\r\n ngOnInit() {\r\n if (this.src instanceof Array) {\r\n // If video has multiple sources\r\n this.videoSources = [...this.src];\r\n } else {\r\n this.videoSources = [{ url: this.src }];\r\n }\r\n }\r\n}\r\n", + "assetsDirs": [], + "styleUrlsData": "", + "stylesData": "", + "implements": [ + "OnInit" + ], + "accessors": { + "pauseVideo": { + "name": "pauseVideo", + "setSignature": { + "name": "pauseVideo", + "type": "void", + "deprecated": false, + "deprecationMessage": "", + "args": [ + { + "name": "shouldPause", + "type": "boolean", + "deprecated": false, + "deprecationMessage": "" + } + ], + "returnType": "void", + "line": 41, + "jsdoctags": [ + { + "name": "shouldPause", + "type": "boolean", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + } + ] + } + }, + "playVideo": { + "name": "playVideo", + "setSignature": { + "name": "playVideo", + "type": "void", + "deprecated": false, + "deprecationMessage": "", + "args": [ + { + "name": "shouldPlay", + "type": "boolean", + "deprecated": false, + "deprecationMessage": "" + } + ], + "returnType": "void", + "line": 50, + "jsdoctags": [ + { + "name": "shouldPlay", + "type": "boolean", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + } + ] + } + } + } + }, + { + "name": "LightboxExampleComponent", + "id": "component-LightboxExampleComponent-be406b9330227251e0d998f2d72189e3754f9e897029bddef8bf4ff2fa3efde370dc6248ccca9152a1768d358fda481c7b7a5427015371160f96d042bba32940", + "file": "projects/ng-gallery/src/stories/lightbox/lightbox-example.ts", + "changeDetection": "ChangeDetectionStrategy.OnPush", + "encapsulation": [], + "entryComponents": [], + "inputs": [], + "outputs": [], + "providers": [], + "selector": "lightbox-example", + "styleUrls": [], + "styles": [ + "\n .container {\n display: flex;\n flex-wrap: wrap;\n gap: 3px;\n margin: 0 auto;\n padding: 20px;\n max-width: 768px;\n }\n img {\n height: 90px;\n width: 125px;\n object-fit: cover;\n }\n " + ], + "template": "
                                                                                                                                  \n \n
                                                                                                                                  \n", + "templateUrl": [], + "viewProviders": [], + "hostDirectives": [], + "inputsClass": [ + { + "name": "items", + "deprecated": false, + "deprecationMessage": "", + "line": 42, + "type": "GalleryItem[]", + "decorators": [] + } + ], + "outputsClass": [], + "propertiesClass": [ + { + "name": "gallery", + "deprecated": false, + "deprecationMessage": "", + "type": "Gallery", + "optional": false, + "description": "", + "line": 44, + "modifierKind": [ + 123 + ] + }, + { + "name": "galleryId", + "defaultValue": "'lightbox'", + "deprecated": false, + "deprecationMessage": "", + "type": "string", + "optional": false, + "description": "", + "line": 38 + }, + { + "name": "galleryRef", + "deprecated": false, + "deprecationMessage": "", + "type": "GalleryRef", + "optional": false, + "description": "", + "line": 40 + }, + { + "name": "lightbox", + "deprecated": false, + "deprecationMessage": "", + "type": "Lightbox", + "optional": false, + "description": "", + "line": 44, + "modifierKind": [ + 123 + ] + } + ], + "methodsClass": [ + { + "name": "ngOnDestroy", + "args": [], + "optional": false, + "returnType": "void", + "typeParameters": [], + "line": 57, + "deprecated": false, + "deprecationMessage": "" + }, + { + "name": "ngOnInit", + "args": [], + "optional": false, + "returnType": "void", + "typeParameters": [], + "line": 47, + "deprecated": false, + "deprecationMessage": "" + } + ], + "deprecated": false, + "deprecationMessage": "", + "hostBindings": [], + "hostListeners": [], + "standalone": true, + "imports": [ + { + "name": "CommonModule", + "type": "module" + }, + { + "name": "LightboxModule", + "type": "module" + } + ], + "description": "", + "rawdescription": "\n", + "type": "component", + "sourceCode": "import { Component, Input, OnDestroy, OnInit, ChangeDetectionStrategy } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { Gallery, GalleryItem, GalleryRef } from 'ng-gallery';\r\nimport { Lightbox, LightboxModule } from 'ng-gallery/lightbox';\r\n\r\n@Component({\r\n selector: 'lightbox-example',\r\n template: `\r\n
                                                                                                                                  \r\n \r\n
                                                                                                                                  \r\n `,\r\n styles: [`\r\n .container {\r\n display: flex;\r\n flex-wrap: wrap;\r\n gap: 3px;\r\n margin: 0 auto;\r\n padding: 20px;\r\n max-width: 768px;\r\n }\r\n img {\r\n height: 90px;\r\n width: 125px;\r\n object-fit: cover;\r\n }\r\n `],\r\n imports: [CommonModule, LightboxModule],\r\n standalone: true,\r\n changeDetection: ChangeDetectionStrategy.OnPush\r\n})\r\nexport class LightboxExampleComponent implements OnInit, OnDestroy {\r\n\r\n galleryId: string = 'lightbox';\r\n\r\n galleryRef: GalleryRef;\r\n\r\n @Input() items: GalleryItem[];\r\n\r\n constructor(public gallery: Gallery, public lightbox: Lightbox) {\r\n }\r\n\r\n ngOnInit(): void {\r\n this.galleryRef = this.gallery.ref('lightbox', {\r\n thumbPosition: 'top',\r\n imageSize: 'cover',\r\n autoHeight: false\r\n });\r\n\r\n this.galleryRef.load(this.items);\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.galleryRef.destroy();\r\n }\r\n}\r\n", + "assetsDirs": [], + "styleUrlsData": "", + "stylesData": "\n .container {\n display: flex;\n flex-wrap: wrap;\n gap: 3px;\n margin: 0 auto;\n padding: 20px;\n max-width: 768px;\n }\n img {\n height: 90px;\n width: 125px;\n object-fit: cover;\n }\n \n", + "constructorObj": { + "name": "constructor", + "description": "", + "deprecated": false, + "deprecationMessage": "", + "args": [ + { + "name": "gallery", + "type": "Gallery", + "deprecated": false, + "deprecationMessage": "" + }, + { + "name": "lightbox", + "type": "Lightbox", + "deprecated": false, + "deprecationMessage": "" + } + ], + "line": 42, + "jsdoctags": [ + { + "name": "gallery", + "type": "Gallery", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + }, + { + "name": "lightbox", + "type": "Lightbox", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + } + ] + }, + "implements": [ + "OnInit", + "OnDestroy" + ] + } + ], + "modules": [ + { + "name": "GalleryModule", + "id": "module-GalleryModule-90f9d1f7efe4d47d235a2518dd69bdc5f50065fdc02b9aa3ebc79e364b001092de31ebe30487e7678eb04ad320c7ad562149c0fa066e2545945bf214e26ec8ed", + "description": "", + "deprecationMessage": "", + "deprecated": false, + "file": "projects/ng-gallery/src/lib/gallery.module.ts", + "methods": [], + "sourceCode": "import { NgModule } from '@angular/core';\r\nimport { GalleryComponent } from './components/gallery.component';\r\nimport { GalleryImageDef } from './directives/gallery-image-def.directive';\r\nimport { GalleryThumbDef } from './directives/gallery-thumb-def.directive';\r\nimport { GalleryItemDef } from './directives/gallery-item-def.directive';\r\nimport { GalleryBoxDef } from './directives/gallery-box-def.directive';\r\n\r\n@NgModule({\r\n imports: [\r\n GalleryComponent,\r\n GalleryItemDef,\r\n GalleryImageDef,\r\n GalleryThumbDef,\r\n GalleryBoxDef\r\n ],\r\n exports: [\r\n GalleryComponent,\r\n GalleryItemDef,\r\n GalleryImageDef,\r\n GalleryThumbDef,\r\n GalleryBoxDef\r\n ]\r\n})\r\nexport class GalleryModule {\r\n}\r\n", + "children": [ + { + "type": "providers", + "elements": [] + }, + { + "type": "declarations", + "elements": [] + }, + { + "type": "imports", + "elements": [ + { + "name": "GalleryBoxDef" + }, + { + "name": "GalleryComponent" + }, + { + "name": "GalleryImageDef" + }, + { + "name": "GalleryItemDef" + }, + { + "name": "GalleryThumbDef" + } + ] + }, + { + "type": "exports", + "elements": [ + { + "name": "GalleryBoxDef" + }, + { + "name": "GalleryComponent" + }, + { + "name": "GalleryImageDef" + }, + { + "name": "GalleryItemDef" + }, + { + "name": "GalleryThumbDef" + } + ] + }, + { + "type": "bootstrap", + "elements": [] + }, + { + "type": "classes", + "elements": [] + } + ] + } + ], + "miscellaneous": { + "variables": [ + { + "name": "API_KEY", + "ctype": "miscellaneous", + "subtype": "variable", + "file": "projects/ng-gallery/src/stories/pixabay/pixabay.service.ts", + "deprecated": false, + "deprecationMessage": "", + "type": "string", + "defaultValue": "'560162-704dd2880c027f22c62ab7941'" + }, + { + "name": "AutoHeightExample", + "ctype": "miscellaneous", + "subtype": "variable", + "file": "projects/ng-gallery/src/stories/basic/Gallery.stories.ts", + "deprecated": false, + "deprecationMessage": "", + "type": "Story", + "defaultValue": "{\r\n parameters:{ controls:{ exclude:/.*/g } },\r\n render: (args: GalleryComponent, { loaded: { items } }) => ({\r\n props: { ...args, items, },\r\n template: ``\r\n }),\r\n loaders: [\r\n async () => ({ items: await getHDImages('tigers') }),\r\n ]\r\n}" + }, + { + "name": "AutoplayExample", + "ctype": "miscellaneous", + "subtype": "variable", + "file": "projects/ng-gallery/src/stories/basic/Gallery.stories.ts", + "deprecated": false, + "deprecationMessage": "", + "type": "Story", + "defaultValue": "{\r\n parameters:{ controls:{ exclude:/.*/g } },\r\n render: (args: GalleryComponent, { loaded: { items } }) => ({\r\n props: { ...args, items, },\r\n template: ``\r\n }),\r\n loaders: [\r\n async () => ({ items: await getHDImages('airplane') }),\r\n ]\r\n}" + }, + { + "name": "BoxTemplateExample", + "ctype": "miscellaneous", + "subtype": "variable", + "file": "projects/ng-gallery/src/stories/custom-templates/CustomTemplates.stories.ts", + "deprecated": false, + "deprecationMessage": "", + "type": "Story", + "defaultValue": "{\r\n render: (args: CustomTemplateComponent, { loaded: { items } }) => ({\r\n props: { ...args, items, },\r\n template: `\r\n \r\n
                                                                                                                                  \r\n
                                                                                                                                  This is fixed overlay template
                                                                                                                                  \r\n \r\n
                                                                                                                                  \r\n
                                                                                                                                  \r\n `,\r\n styles: [`\r\n .my-box {\r\n width: 200px;\r\n height: 50px;\r\n color: white;\r\n }\r\n img {\r\n position: absolute;\r\n z-index: 999;\r\n width: 40px;\r\n height: 40px;\r\n top: 20px;\r\n left: 20px;\r\n }\r\n `]\r\n }),\r\n loaders: [\r\n async () => ({ items: await getHDImages('sea') }),\r\n ]\r\n}" + }, + { + "name": "BulletExample", + "ctype": "miscellaneous", + "subtype": "variable", + "file": "projects/ng-gallery/src/stories/basic/Gallery.stories.ts", + "deprecated": false, + "deprecationMessage": "", + "type": "Story", + "defaultValue": "{\r\n parameters:{ controls:{ exclude:/.*/g } },\r\n render: (args: GalleryComponent, { loaded: { items } }) => ({\r\n props: { ...args, items, },\r\n template: ``\r\n }),\r\n loaders: [\r\n async () => ({ items: await getHDImages('football') }),\r\n ]\r\n}" + }, + { + "name": "CounterExample", + "ctype": "miscellaneous", + "subtype": "variable", + "file": "projects/ng-gallery/src/stories/basic/Gallery.stories.ts", + "deprecated": false, + "deprecationMessage": "", + "type": "Story", + "defaultValue": "{\r\n parameters:{ controls:{ exclude:/.*/g } },\r\n render: (args: GalleryComponent, { loaded: { items } }) => ({\r\n props: { ...args, items, },\r\n template: ``\r\n }),\r\n loaders: [\r\n async () => ({ items: await getHDImages('patterns') }),\r\n ]\r\n}" + }, + { + "name": "defaultConfig", + "ctype": "miscellaneous", + "subtype": "variable", + "file": "projects/ng-gallery/src/lib/utils/gallery.default.ts", + "deprecated": false, + "deprecationMessage": "", + "type": "GalleryConfig", + "defaultValue": "{\r\n nav: true,\r\n loop: false,\r\n bullets: false,\r\n thumbs: false,\r\n debug: false,\r\n bulletSize: 6,\r\n counter: false,\r\n autoplay: false,\r\n thumbWidth: 120,\r\n thumbHeight: 90,\r\n disableBullets: false,\r\n disableThumbs: false,\r\n disableScroll: false,\r\n disableThumbScroll: false,\r\n disableMouseScroll: false,\r\n disableThumbMouseScroll: false,\r\n autoplayInterval: 3000,\r\n scrollDuration: 468,\r\n scrollEase: {\r\n x1: 0.42,\r\n y1: 0,\r\n x2: 0.58,\r\n y2: 1\r\n },\r\n thumbCentralized: false,\r\n thumbAutosize: false,\r\n itemAutosize: false,\r\n autoHeight: false,\r\n scrollBehavior: 'smooth',\r\n resizeDebounceTime: 0,\r\n loadingAttr: LoadingAttr.Lazy,\r\n imageSize: ImageSize.Contain,\r\n thumbImageSize: ImageSize.Cover,\r\n bulletPosition: BulletsPosition.Bottom,\r\n counterPosition: CounterPosition.Top,\r\n thumbPosition: ThumbnailsPosition.Bottom,\r\n loadingStrategy: LoadingStrategy.Preload,\r\n orientation: Orientation.Horizontal,\r\n navIcon: ``,\r\n // navIcon: ``,\r\n loadingIcon: ``\r\n}" + }, + { + "name": "defaultState", + "ctype": "miscellaneous", + "subtype": "variable", + "file": "projects/ng-gallery/src/lib/utils/gallery.default.ts", + "deprecated": false, + "deprecationMessage": "", + "type": "GalleryState", + "defaultValue": "{\r\n action: GalleryAction.INITIALIZED,\r\n isPlaying: false,\r\n hasNext: false,\r\n hasPrev: false,\r\n currIndex: 0,\r\n items: []\r\n}", + "rawdescription": "Initial state", + "description": "

                                                                                                                                  Initial state

                                                                                                                                  \n" + }, + { + "name": "filterActions", + "ctype": "miscellaneous", + "subtype": "variable", + "file": "projects/ng-gallery/src/lib/services/gallery-ref.ts", + "deprecated": false, + "deprecationMessage": "", + "type": "", + "defaultValue": "(actions: string[]) => {\r\n return filter((state: GalleryState) => actions.indexOf(state.action) > -1);\r\n}" + }, + { + "name": "float32ArraySupported", + "ctype": "miscellaneous", + "subtype": "variable", + "file": "projects/ng-gallery/src/lib/smooth-scroll/bezier-easing.ts", + "deprecated": false, + "deprecationMessage": "", + "type": "", + "defaultValue": "typeof Float32Array === 'function'" + }, + { + "name": "GallerizeExample", + "ctype": "miscellaneous", + "subtype": "variable", + "file": "projects/ng-gallery/src/stories/lightbox/Lightbox.stories.ts", + "deprecated": false, + "deprecationMessage": "", + "type": "Story", + "defaultValue": "{\r\n render: (args: LightboxExampleComponent, { loaded: { items } }) => ({\r\n props: { ...args, items, },\r\n template: `\r\n
                                                                                                                                  \r\n \r\n
                                                                                                                                  \r\n `,\r\n styles: [`\r\n .container {\r\n display: flex;\r\n flex-wrap: wrap;\r\n gap: 3px;\r\n margin: 0 auto;\r\n padding: 20px;\r\n max-width: 768px;\r\n }\r\n img {\r\n height: 90px;\r\n width: 125px;\r\n object-fit: cover;\r\n }\r\n `]\r\n }),\r\n loaders: [\r\n async () => ({ items: await getHDImages('ship') }),\r\n ]\r\n}" + }, + { + "name": "GallerizeGalleryExample", + "ctype": "miscellaneous", + "subtype": "variable", + "file": "projects/ng-gallery/src/stories/lightbox/Lightbox.stories.ts", + "deprecated": false, + "deprecationMessage": "", + "type": "Story", + "defaultValue": "{\r\n render: (args: LightboxExampleComponent, { loaded: { items } }) => ({\r\n props: { ...args, items, },\r\n template: `\r\n \r\n `\r\n }),\r\n loaders: [\r\n async () => ({ items: await getHDImages('ship') }),\r\n ]\r\n}" + }, + { + "name": "GALLERY_CONFIG", + "ctype": "miscellaneous", + "subtype": "variable", + "file": "projects/ng-gallery/src/lib/models/config.model.ts", + "deprecated": false, + "deprecationMessage": "", + "type": "InjectionToken", + "defaultValue": "new InjectionToken('GALLERY_CONFIG')" + }, + { + "name": "Hammer", + "ctype": "miscellaneous", + "subtype": "variable", + "file": "projects/ng-gallery/src/lib/gestures/hammer-sliding.directive.ts", + "deprecated": false, + "deprecationMessage": "", + "type": "any" + }, + { + "name": "Hammer", + "ctype": "miscellaneous", + "subtype": "variable", + "file": "projects/ng-gallery/src/lib/smooth-scroll/smooth-scroll.directive.ts", + "deprecated": false, + "deprecationMessage": "", + "type": "any" + }, + { + "name": "Hammer", + "ctype": "miscellaneous", + "subtype": "variable", + "file": "projects/ng-gallery/src/lib/components/adapters/main-adapters.ts", + "deprecated": false, + "deprecationMessage": "", + "type": "any" + }, + { + "name": "imageFailedSvg", + "ctype": "miscellaneous", + "subtype": "variable", + "file": "projects/ng-gallery/src/lib/components/templates/svg-assets.ts", + "deprecated": false, + "deprecationMessage": "", + "type": "", + "defaultValue": "`\r\n\r\n \r\n\\t\r\n \r\n \r\n \r\n\r\n\r\n`" + }, + { + "name": "ImageSizeExample", + "ctype": "miscellaneous", + "subtype": "variable", + "file": "projects/ng-gallery/src/stories/basic/Gallery.stories.ts", + "deprecated": false, + "deprecationMessage": "", + "type": "Story", + "defaultValue": "{\r\n parameters:{ controls:{ exclude:/.*/g } },\r\n render: (args: GalleryComponent, { loaded: { items } }) => ({\r\n props: { ...args, items, },\r\n template: ``\r\n }),\r\n loaders: [\r\n async () => ({ items: await getHDImages('tigers') }),\r\n ]\r\n}" + }, + { + "name": "ImageTemplateExample", + "ctype": "miscellaneous", + "subtype": "variable", + "file": "projects/ng-gallery/src/stories/custom-templates/CustomTemplates.stories.ts", + "deprecated": false, + "deprecationMessage": "", + "type": "Story", + "defaultValue": "{\r\n render: (args: CustomTemplateComponent, { loaded: { items } }) => ({\r\n props: { ...args, items, },\r\n template: `\r\n \r\n
                                                                                                                                  \r\n {{ item?.alt }}\r\n
                                                                                                                                  \r\n
                                                                                                                                  \r\n `\r\n }),\r\n loaders: [\r\n async () => ({ items: await getHDImages('sea') }),\r\n ]\r\n}" + }, + { + "name": "ItemAutosizeExample", + "ctype": "miscellaneous", + "subtype": "variable", + "file": "projects/ng-gallery/src/stories/basic/Gallery.stories.ts", + "deprecated": false, + "deprecationMessage": "", + "type": "Story", + "defaultValue": "{\r\n parameters:{ controls:{ exclude:/.*/g } },\r\n render: (args: GalleryComponent, { loaded: { items } }) => ({\r\n props: { ...args, items, },\r\n template: ``\r\n }),\r\n loaders: [\r\n async () => ({ items: await getHDImages('ship') }),\r\n ]\r\n}" + }, + { + "name": "ItemTemplateExample", + "ctype": "miscellaneous", + "subtype": "variable", + "file": "projects/ng-gallery/src/stories/custom-templates/CustomTemplates.stories.ts", + "deprecated": false, + "deprecationMessage": "", + "type": "Story", + "defaultValue": "{\r\n render: (args: CustomTemplateComponent, { loaded: { items } }) => ({\r\n props: { ...args, items, },\r\n template: `\r\n \r\n
                                                                                                                                  \r\n \r\n
                                                                                                                                  \r\n
                                                                                                                                  \r\n `,\r\n styles: [`\r\n img {\r\n object-fit: cover;\r\n border: 10px white solid;\r\n width: 400px;\r\n height: 400px;\r\n }\r\n `]\r\n }),\r\n loaders: [\r\n async () => ({ items: await getHDImagesForCustomTemplate('sand') }),\r\n ]\r\n}" + }, + { + "name": "kSampleStepSize", + "ctype": "miscellaneous", + "subtype": "variable", + "file": "projects/ng-gallery/src/lib/smooth-scroll/bezier-easing.ts", + "deprecated": false, + "deprecationMessage": "", + "type": "", + "defaultValue": "1.0 / (kSplineTableSize - 1.0)" + }, + { + "name": "kSplineTableSize", + "ctype": "miscellaneous", + "subtype": "variable", + "file": "projects/ng-gallery/src/lib/smooth-scroll/bezier-easing.ts", + "deprecated": false, + "deprecationMessage": "", + "type": "number", + "defaultValue": "11" + }, + { + "name": "Lab", + "ctype": "miscellaneous", + "subtype": "variable", + "file": "projects/ng-gallery/src/stories/basic/Gallery.stories.ts", + "deprecated": false, + "deprecationMessage": "", + "type": "Story", + "defaultValue": "{\r\n render: (args: GalleryComponent, { loaded: { items } }) => ({\r\n props: {\r\n ...args,\r\n items,\r\n },\r\n template: `\r\n \r\n `,\r\n }),\r\n loaders: [\r\n async () => ({\r\n items: await getHDImages('jet fighter')\r\n }),\r\n ]\r\n}", + "rawdescription": "First Example for gallery", + "description": "

                                                                                                                                  First Example for gallery

                                                                                                                                  \n" + }, + { + "name": "LightboxExample", + "ctype": "miscellaneous", + "subtype": "variable", + "file": "projects/ng-gallery/src/stories/lightbox/Lightbox.stories.ts", + "deprecated": false, + "deprecationMessage": "", + "type": "Story", + "defaultValue": "{\r\n parameters: {\r\n docs: {\r\n source: {\r\n code: `\r\n
                                                                                                                                  \r\n \r\n
                                                                                                                                  \r\n `,\r\n },\r\n },\r\n },\r\n render: (args: LightboxExampleComponent, { loaded: { items } }) => ({\r\n props: { ...args, items, },\r\n }),\r\n loaders: [\r\n async () => ({ items: await getHDImages('ship') }),\r\n ]\r\n}" + }, + { + "name": "meta", + "ctype": "miscellaneous", + "subtype": "variable", + "file": "projects/ng-gallery/src/stories/basic/Gallery.stories.ts", + "deprecated": false, + "deprecationMessage": "", + "type": "Meta", + "defaultValue": "{\r\n title: 'Documentations/Gallery',\r\n component: GalleryComponent,\r\n tags: ['autodocs'],\r\n render: (args: GalleryComponent) => ({\r\n props: {\r\n ...args,\r\n },\r\n }),\r\n decorators: [\r\n applicationConfig({\r\n providers: [provideAnimations()]\r\n })\r\n ],\r\n args: {\r\n id: 'root',\r\n scrollBehavior: 'smooth',\r\n imageSize: ImageSize.Contain,\r\n thumbImageSize: ImageSize.Cover,\r\n bulletPosition: BulletsPosition.Bottom,\r\n counterPosition: CounterPosition.Top,\r\n orientation: Orientation.Horizontal,\r\n loadingAttr: LoadingAttr.Lazy,\r\n loadingStrategy: LoadingStrategy.Default,\r\n thumbPosition: ThumbnailsPosition.Bottom,\r\n scrollEase: {\r\n x1: 0.42,\r\n y1: 0,\r\n x2: 0.58,\r\n y2: 1\r\n },\r\n bulletSize: 6,\r\n thumbWidth: 120,\r\n thumbHeight: 90,\r\n autoplayInterval: 3000,\r\n scrollDuration: 468,\r\n resizeDebounceTime: 0,\r\n nav: true,\r\n bullets: true,\r\n disableBullets: false,\r\n loop: true,\r\n debug: false,\r\n thumbs: true,\r\n counter: true,\r\n autoplay: false,\r\n autoHeight: false,\r\n itemAutosize: false,\r\n disableThumbs: false,\r\n detachThumbs: false,\r\n thumbAutosize: false,\r\n disableScroll: false,\r\n thumbCentralized: false,\r\n disableThumbScroll: false,\r\n disableMouseScroll: false,\r\n disableThumbMouseScroll: false,\r\n },\r\n // Disables the long useless control description\r\n argTypes: {\r\n scrollBehavior: {\r\n control: 'radio',\r\n options: ['smooth', 'auto'],\r\n table: {\r\n defaultValue: { summary: 'smooth' }\r\n }\r\n },\r\n imageSize: {\r\n table: {\r\n defaultValue: { summary: 'contain' }\r\n }\r\n },\r\n thumbImageSize: {\r\n table: {\r\n defaultValue: { summary: 'cover' }\r\n }\r\n },\r\n bulletPosition: {\r\n table: {\r\n defaultValue: { summary: 'bottom' }\r\n }\r\n },\r\n counterPosition: {\r\n table: {\r\n defaultValue: { summary: 'top' }\r\n }\r\n },\r\n orientation: {\r\n table: {\r\n defaultValue: { summary: 'horizontal' }\r\n }\r\n },\r\n loadingAttr: {\r\n table: {\r\n defaultValue: { summary: 'lazy' }\r\n }\r\n },\r\n loadingStrategy: {\r\n table: {\r\n defaultValue: { summary: 'default' }\r\n }\r\n },\r\n thumbPosition: {\r\n table: {\r\n defaultValue: { summary: 'bottom' }\r\n }\r\n },\r\n thumbCentralized: {\r\n table: {\r\n defaultValue: { summary: 'default' }\r\n }\r\n },\r\n scrollEase: {\r\n table: {\r\n defaultValue: { summary: '{ x1: 0.42, y1: 0, x2: 0.58, y2: 1 }' }\r\n }\r\n },\r\n nav: {\r\n table: {\r\n defaultValue: { summary: true }\r\n }\r\n },\r\n thumbs: {\r\n table: {\r\n defaultValue: { summary: true }\r\n }\r\n },\r\n loop: {\r\n table: {\r\n defaultValue: { summary: true }\r\n }\r\n },\r\n counter: {\r\n table: {\r\n defaultValue: { summary: true }\r\n }\r\n },\r\n bulletSize: {\r\n table: {\r\n defaultValue: { summary: 6 }\r\n }\r\n },\r\n thumbWidth: {\r\n table: {\r\n defaultValue: { summary: 120 }\r\n }\r\n },\r\n thumbHeight: {\r\n table: {\r\n defaultValue: { summary: 90 }\r\n }\r\n },\r\n autoplayInterval: {\r\n table: {\r\n defaultValue: { summary: 3000 }\r\n }\r\n },\r\n scrollDuration: {\r\n table: {\r\n defaultValue: { summary: 468 }\r\n }\r\n },\r\n resizeDebounceTime: {\r\n table: {\r\n defaultValue: { summary: 0 }\r\n }\r\n },\r\n error: {\r\n control: false\r\n },\r\n indexChange: {\r\n control: false\r\n },\r\n itemsChange: {\r\n control: false\r\n },\r\n itemClick: {\r\n control: false\r\n },\r\n thumbClick: {\r\n control: false\r\n },\r\n playingChange: {\r\n control: false\r\n },\r\n galleryRef: {\r\n control: false\r\n },\r\n load: {\r\n control: false\r\n },\r\n add: {\r\n control: false\r\n },\r\n addImage: {\r\n control: false\r\n },\r\n addVideo: {\r\n control: false\r\n },\r\n addIframe: {\r\n control: false\r\n },\r\n addYoutube: {\r\n control: false\r\n },\r\n remove: {\r\n control: false\r\n },\r\n next: {\r\n control: false\r\n },\r\n prev: {\r\n control: false\r\n },\r\n set: {\r\n control: false\r\n },\r\n reset: {\r\n control: false\r\n },\r\n play: {\r\n control: false\r\n },\r\n stop: {\r\n control: false\r\n }\r\n }\r\n}" + }, + { + "name": "meta", + "ctype": "miscellaneous", + "subtype": "variable", + "file": "projects/ng-gallery/src/stories/custom-templates/CustomTemplates.stories.ts", + "deprecated": false, + "deprecationMessage": "", + "type": "Meta", + "defaultValue": "{\r\n title: 'Documentations/CustomTemplates',\r\n component: CustomTemplateComponent,\r\n // tags: ['autodocs'],\r\n render: (args: CustomTemplateComponent) => ({\r\n props: {\r\n ...args,\r\n },\r\n }),\r\n decorators: [\r\n moduleMetadata({\r\n imports: [GalleryModule],\r\n }),\r\n applicationConfig({\r\n providers: [provideAnimations()],\r\n }),\r\n ]\r\n}" + }, + { + "name": "meta", + "ctype": "miscellaneous", + "subtype": "variable", + "file": "projects/ng-gallery/src/stories/lightbox/Lightbox.stories.ts", + "deprecated": false, + "deprecationMessage": "", + "type": "Meta", + "defaultValue": "{\r\n title: 'Documentations/Lightbox',\r\n component: LightboxExampleComponent,\r\n decorators: [\r\n moduleMetadata({\r\n imports: [LightboxModule],\r\n }),\r\n applicationConfig({\r\n providers: [provideAnimations()],\r\n }),\r\n ]\r\n}" + }, + { + "name": "NavExample", + "ctype": "miscellaneous", + "subtype": "variable", + "file": "projects/ng-gallery/src/stories/basic/Gallery.stories.ts", + "deprecated": false, + "deprecationMessage": "", + "type": "Story", + "defaultValue": "{\r\n parameters:{ controls:{ exclude:/.*/g } },\r\n render: (args: GalleryComponent, { loaded: { items } }) => ({\r\n props: { ...args, items, },\r\n template: ``\r\n }),\r\n loaders: [\r\n async () => ({ items: await getHDImages('lions') }),\r\n ]\r\n}" + }, + { + "name": "NavWithLoopExample", + "ctype": "miscellaneous", + "subtype": "variable", + "file": "projects/ng-gallery/src/stories/basic/Gallery.stories.ts", + "deprecated": false, + "deprecationMessage": "", + "type": "Story", + "defaultValue": "{\r\n parameters:{ controls:{ exclude:/.*/g } },\r\n render: (args: GalleryComponent, { loaded: { items } }) => ({\r\n props: { ...args, items, },\r\n template: ``\r\n }),\r\n loaders: [\r\n async () => ({ items: await getHDImages('tigers') }),\r\n ]\r\n}" + }, + { + "name": "NEWTON_ITERATIONS", + "ctype": "miscellaneous", + "subtype": "variable", + "file": "projects/ng-gallery/src/lib/smooth-scroll/bezier-easing.ts", + "deprecated": false, + "deprecationMessage": "", + "type": "number", + "defaultValue": "4", + "rawdescription": "https://github.com/gre/bezier-easing\r\nBezierEasing - use bezier curve for transition easing function\r\nby Gaëtan Renaudeau 2014 - 2015 – MIT License", + "description": "

                                                                                                                                  https://github.com/gre/bezier-easing\nBezierEasing - use bezier curve for transition easing function\nby Gaëtan Renaudeau 2014 - 2015 – MIT License

                                                                                                                                  \n" + }, + { + "name": "NEWTON_MIN_SLOPE", + "ctype": "miscellaneous", + "subtype": "variable", + "file": "projects/ng-gallery/src/lib/smooth-scroll/bezier-easing.ts", + "deprecated": false, + "deprecationMessage": "", + "type": "number", + "defaultValue": "0.001" + }, + { + "name": "preview", + "ctype": "miscellaneous", + "subtype": "variable", + "file": "projects/ng-gallery/.storybook/preview.ts", + "deprecated": false, + "deprecationMessage": "", + "type": "Preview", + "defaultValue": "{\n parameters: {\n layout: 'fullscreen',\n actions: { argTypesRegex: \"^on[A-Z].*\" },\n controls: {\n matchers: {\n color: /(background|color)$/i,\n date: /Date$/i,\n }\n }\n },\n}" + }, + { + "name": "SliderBehaviorExample", + "ctype": "miscellaneous", + "subtype": "variable", + "file": "projects/ng-gallery/src/stories/basic/Gallery.stories.ts", + "deprecated": false, + "deprecationMessage": "", + "type": "Story", + "defaultValue": "{\r\n parameters:{ controls:{ exclude:/.*/g } },\r\n render: (args: GalleryComponent, { loaded: { items } }) => ({\r\n props: { ...args, items, },\r\n template: ``\r\n }),\r\n loaders: [\r\n async () => ({ items: await getHDImages('chips') }),\r\n ]\r\n}" + }, + { + "name": "SliderDirectionExample", + "ctype": "miscellaneous", + "subtype": "variable", + "file": "projects/ng-gallery/src/stories/basic/Gallery.stories.ts", + "deprecated": false, + "deprecationMessage": "", + "type": "Story", + "defaultValue": "{\r\n parameters:{ controls:{ exclude:/.*/g } },\r\n render: (args: GalleryComponent, { loaded: { items } }) => ({\r\n props: { ...args, items, },\r\n template: ``\r\n }),\r\n loaders: [\r\n async () => ({ items: await getHDImages('tigers') }),\r\n ]\r\n}" + }, + { + "name": "SliderExample", + "ctype": "miscellaneous", + "subtype": "variable", + "file": "projects/ng-gallery/src/stories/basic/Gallery.stories.ts", + "deprecated": false, + "deprecationMessage": "", + "type": "Story", + "defaultValue": "{\r\n parameters:{ controls:{ exclude:/.*/g } },\r\n render: (args: GalleryComponent, { loaded: { items } }) => ({\r\n props: { ...args, items, },\r\n template: ``\r\n }),\r\n loaders: [\r\n async () => ({ items: await getHDImages('chips') }),\r\n ]\r\n}" + }, + { + "name": "SUBDIVISION_MAX_ITERATIONS", + "ctype": "miscellaneous", + "subtype": "variable", + "file": "projects/ng-gallery/src/lib/smooth-scroll/bezier-easing.ts", + "deprecated": false, + "deprecationMessage": "", + "type": "number", + "defaultValue": "10" + }, + { + "name": "SUBDIVISION_PRECISION", + "ctype": "miscellaneous", + "subtype": "variable", + "file": "projects/ng-gallery/src/lib/smooth-scroll/bezier-easing.ts", + "deprecated": false, + "deprecationMessage": "", + "type": "number", + "defaultValue": "0.0000001" + }, + { + "name": "ThumbAutosizeExample", + "ctype": "miscellaneous", + "subtype": "variable", + "file": "projects/ng-gallery/src/stories/basic/Gallery.stories.ts", + "deprecated": false, + "deprecationMessage": "", + "type": "Story", + "defaultValue": "{\r\n parameters:{ controls:{ exclude:/.*/g } },\r\n render: (args: GalleryComponent, { loaded: { items } }) => ({\r\n props: { ...args, items, },\r\n template: ``\r\n }),\r\n loaders: [\r\n async () => ({ items: await getHDImages('roads') }),\r\n ]\r\n}" + }, + { + "name": "ThumbDetachedExample", + "ctype": "miscellaneous", + "subtype": "variable", + "file": "projects/ng-gallery/src/stories/basic/Gallery.stories.ts", + "deprecated": false, + "deprecationMessage": "", + "type": "Story", + "defaultValue": "{\r\n parameters:{ controls:{ exclude:/.*/g } },\r\n render: (args: GalleryComponent, { loaded: { items } }) => ({\r\n props: { ...args, items, },\r\n template: ``\r\n }),\r\n loaders: [\r\n async () => ({ items: await getHDImages('flowers') }),\r\n ]\r\n}" + }, + { + "name": "ThumbPositionExample", + "ctype": "miscellaneous", + "subtype": "variable", + "file": "projects/ng-gallery/src/stories/basic/Gallery.stories.ts", + "deprecated": false, + "deprecationMessage": "", + "type": "Story", + "defaultValue": "{\r\n parameters:{ controls:{ exclude:/.*/g } },\r\n render: (args: GalleryComponent, { loaded: { items } }) => ({\r\n props: { ...args, items, },\r\n template: ``\r\n }),\r\n loaders: [\r\n async () => ({ items: await getHDImages('street') }),\r\n ]\r\n}" + }, + { + "name": "ThumbTemplateExample", + "ctype": "miscellaneous", + "subtype": "variable", + "file": "projects/ng-gallery/src/stories/custom-templates/CustomTemplates.stories.ts", + "deprecated": false, + "deprecationMessage": "", + "type": "Story", + "defaultValue": "{\r\n render: (args: CustomTemplateComponent, { loaded: { items } }) => ({\r\n props: { ...args, items, },\r\n template: `\r\n \r\n
                                                                                                                                  \r\n {{ thumb?.alt }}\r\n
                                                                                                                                  \r\n
                                                                                                                                  \r\n `\r\n }),\r\n loaders: [\r\n async () => ({ items: await getHDImages('sea') }),\r\n ]\r\n}" + }, + { + "name": "ThumbViewExample", + "ctype": "miscellaneous", + "subtype": "variable", + "file": "projects/ng-gallery/src/stories/basic/Gallery.stories.ts", + "deprecated": false, + "deprecationMessage": "", + "type": "Story", + "defaultValue": "{\r\n parameters:{ controls:{ exclude:/.*/g } },\r\n render: (args: GalleryComponent, { loaded: { items } }) => ({\r\n props: { ...args, items, },\r\n template: ``\r\n }),\r\n loaders: [\r\n async () => ({ items: await getHDImages('landscape') }),\r\n ]\r\n}" + } + ], + "functions": [ + { + "name": "A", + "file": "projects/ng-gallery/src/lib/smooth-scroll/bezier-easing.ts", + "ctype": "miscellaneous", + "subtype": "function", + "deprecated": false, + "deprecationMessage": "", + "description": "", + "args": [ + { + "name": "aA1", + "type": "", + "deprecated": false, + "deprecationMessage": "" + }, + { + "name": "aA2", + "type": "", + "deprecated": false, + "deprecationMessage": "" + } + ], + "jsdoctags": [ + { + "name": "aA1", + "type": "", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + }, + { + "name": "aA2", + "type": "", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + } + ] + }, + { + "name": "B", + "file": "projects/ng-gallery/src/lib/smooth-scroll/bezier-easing.ts", + "ctype": "miscellaneous", + "subtype": "function", + "deprecated": false, + "deprecationMessage": "", + "description": "", + "args": [ + { + "name": "aA1", + "type": "", + "deprecated": false, + "deprecationMessage": "" + }, + { + "name": "aA2", + "type": "", + "deprecated": false, + "deprecationMessage": "" + } + ], + "jsdoctags": [ + { + "name": "aA1", + "type": "", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + }, + { + "name": "aA2", + "type": "", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + } + ] + }, + { + "name": "bezier", + "file": "projects/ng-gallery/src/lib/smooth-scroll/bezier-easing.ts", + "ctype": "miscellaneous", + "subtype": "function", + "deprecated": false, + "deprecationMessage": "", + "description": "", + "args": [ + { + "name": "mX1", + "type": "", + "deprecated": false, + "deprecationMessage": "" + }, + { + "name": "mY1", + "type": "", + "deprecated": false, + "deprecationMessage": "" + }, + { + "name": "mX2", + "type": "", + "deprecated": false, + "deprecationMessage": "" + }, + { + "name": "mY2", + "type": "", + "deprecated": false, + "deprecationMessage": "" + } + ], + "jsdoctags": [ + { + "name": "mX1", + "type": "", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + }, + { + "name": "mY1", + "type": "", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + }, + { + "name": "mX2", + "type": "", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + }, + { + "name": "mY2", + "type": "", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + } + ] + }, + { + "name": "binarySubdivide", + "file": "projects/ng-gallery/src/lib/smooth-scroll/bezier-easing.ts", + "ctype": "miscellaneous", + "subtype": "function", + "deprecated": false, + "deprecationMessage": "", + "description": "", + "args": [ + { + "name": "aX", + "type": "", + "deprecated": false, + "deprecationMessage": "" + }, + { + "name": "aA", + "type": "", + "deprecated": false, + "deprecationMessage": "" + }, + { + "name": "aB", + "type": "", + "deprecated": false, + "deprecationMessage": "" + }, + { + "name": "mX1", + "type": "", + "deprecated": false, + "deprecationMessage": "" + }, + { + "name": "mX2", + "type": "", + "deprecated": false, + "deprecationMessage": "" + } + ], + "jsdoctags": [ + { + "name": "aX", + "type": "", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + }, + { + "name": "aA", + "type": "", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + }, + { + "name": "aB", + "type": "", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + }, + { + "name": "mX1", + "type": "", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + }, + { + "name": "mX2", + "type": "", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + } + ] + }, + { + "name": "C", + "file": "projects/ng-gallery/src/lib/smooth-scroll/bezier-easing.ts", + "ctype": "miscellaneous", + "subtype": "function", + "deprecated": false, + "deprecationMessage": "", + "description": "", + "args": [ + { + "name": "aA1", + "type": "", + "deprecated": false, + "deprecationMessage": "" + } + ], + "jsdoctags": [ + { + "name": "aA1", + "type": "", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + } + ] + }, + { + "name": "calcBezier", + "file": "projects/ng-gallery/src/lib/smooth-scroll/bezier-easing.ts", + "ctype": "miscellaneous", + "subtype": "function", + "deprecated": false, + "deprecationMessage": "", + "description": "", + "args": [ + { + "name": "aT", + "type": "", + "deprecated": false, + "deprecationMessage": "" + }, + { + "name": "aA1", + "type": "", + "deprecated": false, + "deprecationMessage": "" + }, + { + "name": "aA2", + "type": "", + "deprecated": false, + "deprecationMessage": "" + } + ], + "jsdoctags": [ + { + "name": "aT", + "type": "", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + }, + { + "name": "aA1", + "type": "", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + }, + { + "name": "aA2", + "type": "", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + } + ] + }, + { + "name": "createIntersectionObserver", + "file": "projects/ng-gallery/src/lib/observers/active-item-observer.ts", + "ctype": "miscellaneous", + "subtype": "function", + "deprecated": false, + "deprecationMessage": "", + "description": "", + "args": [ + { + "name": "root", + "type": "HTMLElement", + "deprecated": false, + "deprecationMessage": "" + }, + { + "name": "elements", + "deprecated": false, + "deprecationMessage": "" + }, + { + "name": "rootMargin", + "type": "string", + "deprecated": false, + "deprecationMessage": "" + } + ], + "returnType": "Observable", + "jsdoctags": [ + { + "name": "root", + "type": "HTMLElement", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + }, + { + "name": "elements", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + }, + { + "name": "rootMargin", + "type": "string", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + } + ] + }, + { + "name": "getHDImages", + "file": "projects/ng-gallery/src/stories/pixabay/pixabay.service.ts", + "ctype": "miscellaneous", + "subtype": "function", + "deprecated": false, + "deprecationMessage": "", + "description": "", + "args": [ + { + "name": "key", + "type": "string", + "deprecated": false, + "deprecationMessage": "" + } + ], + "returnType": "Promise", + "jsdoctags": [ + { + "name": "key", + "type": "string", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + } + ] + }, + { + "name": "getHDImagesForCustomTemplate", + "file": "projects/ng-gallery/src/stories/pixabay/pixabay.service.ts", + "ctype": "miscellaneous", + "subtype": "function", + "deprecated": false, + "deprecationMessage": "", + "description": "", + "args": [ + { + "name": "key", + "type": "string", + "deprecated": false, + "deprecationMessage": "" + } + ], + "returnType": "Promise", + "jsdoctags": [ + { + "name": "key", + "type": "string", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + } + ] + }, + { + "name": "getSlope", + "file": "projects/ng-gallery/src/lib/smooth-scroll/bezier-easing.ts", + "ctype": "miscellaneous", + "subtype": "function", + "deprecated": false, + "deprecationMessage": "", + "description": "", + "args": [ + { + "name": "aT", + "type": "", + "deprecated": false, + "deprecationMessage": "" + }, + { + "name": "aA1", + "type": "", + "deprecated": false, + "deprecationMessage": "" + }, + { + "name": "aA2", + "type": "", + "deprecated": false, + "deprecationMessage": "" + } + ], + "jsdoctags": [ + { + "name": "aT", + "type": "", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + }, + { + "name": "aA1", + "type": "", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + }, + { + "name": "aA2", + "type": "", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + } + ] + }, + { + "name": "LinearEasing", + "file": "projects/ng-gallery/src/lib/smooth-scroll/bezier-easing.ts", + "ctype": "miscellaneous", + "subtype": "function", + "deprecated": false, + "deprecationMessage": "", + "description": "", + "args": [ + { + "name": "x", + "type": "", + "deprecated": false, + "deprecationMessage": "" + } + ], + "jsdoctags": [ + { + "name": "x", + "type": "", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + } + ] + }, + { + "name": "newtonRaphsonIterate", + "file": "projects/ng-gallery/src/lib/smooth-scroll/bezier-easing.ts", + "ctype": "miscellaneous", + "subtype": "function", + "deprecated": false, + "deprecationMessage": "", + "description": "", + "args": [ + { + "name": "aX", + "type": "", + "deprecated": false, + "deprecationMessage": "" + }, + { + "name": "aGuessT", + "type": "", + "deprecated": false, + "deprecationMessage": "" + }, + { + "name": "mX1", + "type": "", + "deprecated": false, + "deprecationMessage": "" + }, + { + "name": "mX2", + "type": "", + "deprecated": false, + "deprecationMessage": "" + } + ], + "jsdoctags": [ + { + "name": "aX", + "type": "", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + }, + { + "name": "aGuessT", + "type": "", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + }, + { + "name": "mX1", + "type": "", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + }, + { + "name": "mX2", + "type": "", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + } + ] + }, + { + "name": "resizeObservable", + "file": "projects/ng-gallery/src/lib/utils/resize-observer.ts", + "ctype": "miscellaneous", + "subtype": "function", + "deprecated": false, + "deprecationMessage": "", + "description": "", + "args": [ + { + "name": "el", + "type": "HTMLElement", + "deprecated": false, + "deprecationMessage": "" + }, + { + "name": "setter", + "deprecated": false, + "deprecationMessage": "", + "optional": true + } + ], + "returnType": "Observable", + "jsdoctags": [ + { + "name": "el", + "type": "HTMLElement", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + }, + { + "name": "setter", + "deprecated": false, + "deprecationMessage": "", + "optional": true, + "tagName": { + "text": "param" + } + } + ] + } + ], + "typealiases": [ + { + "name": "GalleryConfig", + "ctype": "miscellaneous", + "subtype": "typealias", + "rawtype": "", + "file": "projects/ng-gallery/src/lib/models/config.model.ts", + "deprecated": false, + "deprecationMessage": "", + "description": "", + "kind": 190 + }, + { + "name": "GalleryItemData", + "ctype": "miscellaneous", + "subtype": "typealias", + "rawtype": "ImageItemData | VideoItemData | IframeItemData | YoutubeItemData", + "file": "projects/ng-gallery/src/lib/components/templates/items.model.ts", + "deprecated": false, + "deprecationMessage": "", + "description": "", + "kind": 189 + }, + { + "name": "GalleryItemModel", + "ctype": "miscellaneous", + "subtype": "typealias", + "rawtype": "literal type", + "file": "projects/ng-gallery/src/lib/components/templates/items.model.ts", + "deprecated": false, + "deprecationMessage": "", + "description": "", + "kind": 184 + }, + { + "name": "GalleryItemType", + "ctype": "miscellaneous", + "subtype": "typealias", + "rawtype": "GalleryItemTypes | string", + "file": "projects/ng-gallery/src/lib/models/constants.ts", + "deprecated": false, + "deprecationMessage": "", + "description": "", + "kind": 189 + }, + { + "name": "HorizontalPosition", + "ctype": "miscellaneous", + "subtype": "typealias", + "rawtype": "\"top\" | \"bottom\"", + "file": "projects/ng-gallery/src/lib/models/config.model.ts", + "deprecated": false, + "deprecationMessage": "", + "description": "", + "kind": 189 + }, + { + "name": "IframeItemData", + "ctype": "miscellaneous", + "subtype": "typealias", + "rawtype": "", + "file": "projects/ng-gallery/src/lib/components/templates/items.model.ts", + "deprecated": false, + "deprecationMessage": "", + "description": "", + "kind": 190 + }, + { + "name": "ImageItemData", + "ctype": "miscellaneous", + "subtype": "typealias", + "rawtype": "", + "file": "projects/ng-gallery/src/lib/components/templates/items.model.ts", + "deprecated": false, + "deprecationMessage": "", + "description": "", + "kind": 190 + }, + { + "name": "ImageSize", + "ctype": "miscellaneous", + "subtype": "typealias", + "rawtype": "\"contain\" | \"cover\"", + "file": "projects/ng-gallery/src/lib/models/config.model.ts", + "deprecated": false, + "deprecationMessage": "", + "description": "", + "kind": 189 + }, + { + "name": "ItemState", + "ctype": "miscellaneous", + "subtype": "typealias", + "rawtype": "\"success\" | \"loading\" | \"failed\"", + "file": "projects/ng-gallery/src/lib/components/templates/items.model.ts", + "deprecated": false, + "deprecationMessage": "", + "description": "", + "kind": 189 + }, + { + "name": "LoadingAttr", + "ctype": "miscellaneous", + "subtype": "typealias", + "rawtype": "\"eager\" | \"lazy\"", + "file": "projects/ng-gallery/src/lib/models/config.model.ts", + "deprecated": false, + "deprecationMessage": "", + "description": "", + "kind": 189 + }, + { + "name": "LoadingStrategy", + "ctype": "miscellaneous", + "subtype": "typealias", + "rawtype": "\"preload\" | \"lazy\" | \"default\"", + "file": "projects/ng-gallery/src/lib/models/config.model.ts", + "deprecated": false, + "deprecationMessage": "", + "description": "", + "kind": 189 + }, + { + "name": "Orientation", + "ctype": "miscellaneous", + "subtype": "typealias", + "rawtype": "\"horizontal\" | \"vertical\"", + "file": "projects/ng-gallery/src/lib/models/config.model.ts", + "deprecated": false, + "deprecationMessage": "", + "description": "", + "kind": 189 + }, + { + "name": "SmoothScrollOptions", + "ctype": "miscellaneous", + "subtype": "typealias", + "rawtype": "", + "file": "projects/ng-gallery/src/lib/smooth-scroll/smooth-scroll.model.ts", + "deprecated": false, + "deprecationMessage": "", + "description": "", + "kind": 190 + }, + { + "name": "SmoothScrollToOptions", + "ctype": "miscellaneous", + "subtype": "typealias", + "rawtype": "", + "file": "projects/ng-gallery/src/lib/smooth-scroll/smooth-scroll.model.ts", + "deprecated": false, + "deprecationMessage": "", + "description": "", + "kind": 190 + }, + { + "name": "Story", + "ctype": "miscellaneous", + "subtype": "typealias", + "rawtype": "StoryObj", + "file": "projects/ng-gallery/src/stories/basic/Gallery.stories.ts", + "deprecated": false, + "deprecationMessage": "", + "description": "", + "kind": 180 + }, + { + "name": "Story", + "ctype": "miscellaneous", + "subtype": "typealias", + "rawtype": "StoryObj", + "file": "projects/ng-gallery/src/stories/custom-templates/CustomTemplates.stories.ts", + "deprecated": false, + "deprecationMessage": "", + "description": "", + "kind": 180 + }, + { + "name": "Story", + "ctype": "miscellaneous", + "subtype": "typealias", + "rawtype": "StoryObj", + "file": "projects/ng-gallery/src/stories/lightbox/Lightbox.stories.ts", + "deprecated": false, + "deprecationMessage": "", + "description": "", + "kind": 180 + }, + { + "name": "ThumbsPosition", + "ctype": "miscellaneous", + "subtype": "typealias", + "rawtype": "\"top\" | \"left\" | \"right\" | \"bottom\"", + "file": "projects/ng-gallery/src/lib/models/config.model.ts", + "deprecated": false, + "deprecationMessage": "", + "description": "", + "kind": 189 + }, + { + "name": "VideoItemData", + "ctype": "miscellaneous", + "subtype": "typealias", + "rawtype": "", + "file": "projects/ng-gallery/src/lib/components/templates/items.model.ts", + "deprecated": false, + "deprecationMessage": "", + "description": "", + "kind": 190 + }, + { + "name": "YoutubeItemData", + "ctype": "miscellaneous", + "subtype": "typealias", + "rawtype": "", + "file": "projects/ng-gallery/src/lib/components/templates/items.model.ts", + "deprecated": false, + "deprecationMessage": "", + "description": "", + "kind": 190 + } + ], + "enumerations": [ + { + "name": "BulletsPosition", + "childs": [ + { + "name": "Top", + "deprecated": false, + "deprecationMessage": "", + "value": "top" + }, + { + "name": "Bottom", + "deprecated": false, + "deprecationMessage": "", + "value": "bottom" + } + ], + "ctype": "miscellaneous", + "subtype": "enum", + "deprecated": false, + "deprecationMessage": "", + "description": "", + "file": "projects/ng-gallery/src/lib/models/constants.ts" + }, + { + "name": "CounterPosition", + "childs": [ + { + "name": "Top", + "deprecated": false, + "deprecationMessage": "", + "value": "top" + }, + { + "name": "Bottom", + "deprecated": false, + "deprecationMessage": "", + "value": "bottom" + } + ], + "ctype": "miscellaneous", + "subtype": "enum", + "deprecated": false, + "deprecationMessage": "", + "description": "", + "file": "projects/ng-gallery/src/lib/models/constants.ts" + }, + { + "name": "GalleryAction", + "childs": [ + { + "name": "INITIALIZED", + "deprecated": false, + "deprecationMessage": "", + "value": "initialized" + }, + { + "name": "ITEMS_CHANGED", + "deprecated": false, + "deprecationMessage": "", + "value": "itemsChanged" + }, + { + "name": "INDEX_CHANGED", + "deprecated": false, + "deprecationMessage": "", + "value": "indexChanged" + }, + { + "name": "PLAY", + "deprecated": false, + "deprecationMessage": "", + "value": "play" + }, + { + "name": "STOP", + "deprecated": false, + "deprecationMessage": "", + "value": "stop" + } + ], + "ctype": "miscellaneous", + "subtype": "enum", + "deprecated": false, + "deprecationMessage": "", + "description": "", + "file": "projects/ng-gallery/src/lib/models/constants.ts" + }, + { + "name": "GalleryItemTypes", + "childs": [ + { + "name": "Image", + "deprecated": false, + "deprecationMessage": "", + "value": "image" + }, + { + "name": "Video", + "deprecated": false, + "deprecationMessage": "", + "value": "video" + }, + { + "name": "Youtube", + "deprecated": false, + "deprecationMessage": "", + "value": "youtube" + }, + { + "name": "Iframe", + "deprecated": false, + "deprecationMessage": "", + "value": "iframe" + } + ], + "ctype": "miscellaneous", + "subtype": "enum", + "deprecated": false, + "deprecationMessage": "", + "description": "", + "file": "projects/ng-gallery/src/lib/models/constants.ts" + }, + { + "name": "ImageSize", + "childs": [ + { + "name": "Cover", + "deprecated": false, + "deprecationMessage": "", + "value": "cover" + }, + { + "name": "Contain", + "deprecated": false, + "deprecationMessage": "", + "value": "contain" + } + ], + "ctype": "miscellaneous", + "subtype": "enum", + "deprecated": false, + "deprecationMessage": "", + "description": "", + "file": "projects/ng-gallery/src/lib/models/constants.ts" + }, + { + "name": "LoadingAttr", + "childs": [ + { + "name": "Eager", + "deprecated": false, + "deprecationMessage": "", + "value": "eager" + }, + { + "name": "Lazy", + "deprecated": false, + "deprecationMessage": "", + "value": "lazy" + } + ], + "ctype": "miscellaneous", + "subtype": "enum", + "deprecated": false, + "deprecationMessage": "", + "description": "", + "file": "projects/ng-gallery/src/lib/models/constants.ts" + }, + { + "name": "LoadingStrategy", + "childs": [ + { + "name": "Preload", + "deprecated": false, + "deprecationMessage": "", + "value": "preload" + }, + { + "name": "Lazy", + "deprecated": false, + "deprecationMessage": "", + "value": "lazy" + }, + { + "name": "Default", + "deprecated": false, + "deprecationMessage": "", + "value": "default" + } + ], + "ctype": "miscellaneous", + "subtype": "enum", + "deprecated": false, + "deprecationMessage": "", + "description": "", + "file": "projects/ng-gallery/src/lib/models/constants.ts" + }, + { + "name": "Orientation", + "childs": [ + { + "name": "Horizontal", + "deprecated": false, + "deprecationMessage": "", + "value": "horizontal" + }, + { + "name": "Vertical", + "deprecated": false, + "deprecationMessage": "", + "value": "vertical" + } + ], + "ctype": "miscellaneous", + "subtype": "enum", + "deprecated": false, + "deprecationMessage": "", + "description": "", + "file": "projects/ng-gallery/src/lib/models/constants.ts" + }, + { + "name": "ThumbnailsPosition", + "childs": [ + { + "name": "Top", + "deprecated": false, + "deprecationMessage": "", + "value": "top" + }, + { + "name": "Left", + "deprecated": false, + "deprecationMessage": "", + "value": "left" + }, + { + "name": "Right", + "deprecated": false, + "deprecationMessage": "", + "value": "right" + }, + { + "name": "Bottom", + "deprecated": false, + "deprecationMessage": "", + "value": "bottom" + } + ], + "ctype": "miscellaneous", + "subtype": "enum", + "deprecated": false, + "deprecationMessage": "", + "description": "", + "file": "projects/ng-gallery/src/lib/models/constants.ts" + } + ], + "groupedVariables": { + "projects/ng-gallery/src/stories/pixabay/pixabay.service.ts": [ + { + "name": "API_KEY", + "ctype": "miscellaneous", + "subtype": "variable", + "file": "projects/ng-gallery/src/stories/pixabay/pixabay.service.ts", + "deprecated": false, + "deprecationMessage": "", + "type": "string", + "defaultValue": "'560162-704dd2880c027f22c62ab7941'" + } + ], + "projects/ng-gallery/src/stories/basic/Gallery.stories.ts": [ + { + "name": "AutoHeightExample", + "ctype": "miscellaneous", + "subtype": "variable", + "file": "projects/ng-gallery/src/stories/basic/Gallery.stories.ts", + "deprecated": false, + "deprecationMessage": "", + "type": "Story", + "defaultValue": "{\r\n parameters:{ controls:{ exclude:/.*/g } },\r\n render: (args: GalleryComponent, { loaded: { items } }) => ({\r\n props: { ...args, items, },\r\n template: ``\r\n }),\r\n loaders: [\r\n async () => ({ items: await getHDImages('tigers') }),\r\n ]\r\n}" + }, + { + "name": "AutoplayExample", + "ctype": "miscellaneous", + "subtype": "variable", + "file": "projects/ng-gallery/src/stories/basic/Gallery.stories.ts", + "deprecated": false, + "deprecationMessage": "", + "type": "Story", + "defaultValue": "{\r\n parameters:{ controls:{ exclude:/.*/g } },\r\n render: (args: GalleryComponent, { loaded: { items } }) => ({\r\n props: { ...args, items, },\r\n template: ``\r\n }),\r\n loaders: [\r\n async () => ({ items: await getHDImages('airplane') }),\r\n ]\r\n}" + }, + { + "name": "BulletExample", + "ctype": "miscellaneous", + "subtype": "variable", + "file": "projects/ng-gallery/src/stories/basic/Gallery.stories.ts", + "deprecated": false, + "deprecationMessage": "", + "type": "Story", + "defaultValue": "{\r\n parameters:{ controls:{ exclude:/.*/g } },\r\n render: (args: GalleryComponent, { loaded: { items } }) => ({\r\n props: { ...args, items, },\r\n template: ``\r\n }),\r\n loaders: [\r\n async () => ({ items: await getHDImages('football') }),\r\n ]\r\n}" + }, + { + "name": "CounterExample", + "ctype": "miscellaneous", + "subtype": "variable", + "file": "projects/ng-gallery/src/stories/basic/Gallery.stories.ts", + "deprecated": false, + "deprecationMessage": "", + "type": "Story", + "defaultValue": "{\r\n parameters:{ controls:{ exclude:/.*/g } },\r\n render: (args: GalleryComponent, { loaded: { items } }) => ({\r\n props: { ...args, items, },\r\n template: ``\r\n }),\r\n loaders: [\r\n async () => ({ items: await getHDImages('patterns') }),\r\n ]\r\n}" + }, + { + "name": "ImageSizeExample", + "ctype": "miscellaneous", + "subtype": "variable", + "file": "projects/ng-gallery/src/stories/basic/Gallery.stories.ts", + "deprecated": false, + "deprecationMessage": "", + "type": "Story", + "defaultValue": "{\r\n parameters:{ controls:{ exclude:/.*/g } },\r\n render: (args: GalleryComponent, { loaded: { items } }) => ({\r\n props: { ...args, items, },\r\n template: ``\r\n }),\r\n loaders: [\r\n async () => ({ items: await getHDImages('tigers') }),\r\n ]\r\n}" + }, + { + "name": "ItemAutosizeExample", + "ctype": "miscellaneous", + "subtype": "variable", + "file": "projects/ng-gallery/src/stories/basic/Gallery.stories.ts", + "deprecated": false, + "deprecationMessage": "", + "type": "Story", + "defaultValue": "{\r\n parameters:{ controls:{ exclude:/.*/g } },\r\n render: (args: GalleryComponent, { loaded: { items } }) => ({\r\n props: { ...args, items, },\r\n template: ``\r\n }),\r\n loaders: [\r\n async () => ({ items: await getHDImages('ship') }),\r\n ]\r\n}" + }, + { + "name": "Lab", + "ctype": "miscellaneous", + "subtype": "variable", + "file": "projects/ng-gallery/src/stories/basic/Gallery.stories.ts", + "deprecated": false, + "deprecationMessage": "", + "type": "Story", + "defaultValue": "{\r\n render: (args: GalleryComponent, { loaded: { items } }) => ({\r\n props: {\r\n ...args,\r\n items,\r\n },\r\n template: `\r\n \r\n `,\r\n }),\r\n loaders: [\r\n async () => ({\r\n items: await getHDImages('jet fighter')\r\n }),\r\n ]\r\n}", + "rawdescription": "First Example for gallery", + "description": "

                                                                                                                                  First Example for gallery

                                                                                                                                  \n" + }, + { + "name": "meta", + "ctype": "miscellaneous", + "subtype": "variable", + "file": "projects/ng-gallery/src/stories/basic/Gallery.stories.ts", + "deprecated": false, + "deprecationMessage": "", + "type": "Meta", + "defaultValue": "{\r\n title: 'Documentations/Gallery',\r\n component: GalleryComponent,\r\n tags: ['autodocs'],\r\n render: (args: GalleryComponent) => ({\r\n props: {\r\n ...args,\r\n },\r\n }),\r\n decorators: [\r\n applicationConfig({\r\n providers: [provideAnimations()]\r\n })\r\n ],\r\n args: {\r\n id: 'root',\r\n scrollBehavior: 'smooth',\r\n imageSize: ImageSize.Contain,\r\n thumbImageSize: ImageSize.Cover,\r\n bulletPosition: BulletsPosition.Bottom,\r\n counterPosition: CounterPosition.Top,\r\n orientation: Orientation.Horizontal,\r\n loadingAttr: LoadingAttr.Lazy,\r\n loadingStrategy: LoadingStrategy.Default,\r\n thumbPosition: ThumbnailsPosition.Bottom,\r\n scrollEase: {\r\n x1: 0.42,\r\n y1: 0,\r\n x2: 0.58,\r\n y2: 1\r\n },\r\n bulletSize: 6,\r\n thumbWidth: 120,\r\n thumbHeight: 90,\r\n autoplayInterval: 3000,\r\n scrollDuration: 468,\r\n resizeDebounceTime: 0,\r\n nav: true,\r\n bullets: true,\r\n disableBullets: false,\r\n loop: true,\r\n debug: false,\r\n thumbs: true,\r\n counter: true,\r\n autoplay: false,\r\n autoHeight: false,\r\n itemAutosize: false,\r\n disableThumbs: false,\r\n detachThumbs: false,\r\n thumbAutosize: false,\r\n disableScroll: false,\r\n thumbCentralized: false,\r\n disableThumbScroll: false,\r\n disableMouseScroll: false,\r\n disableThumbMouseScroll: false,\r\n },\r\n // Disables the long useless control description\r\n argTypes: {\r\n scrollBehavior: {\r\n control: 'radio',\r\n options: ['smooth', 'auto'],\r\n table: {\r\n defaultValue: { summary: 'smooth' }\r\n }\r\n },\r\n imageSize: {\r\n table: {\r\n defaultValue: { summary: 'contain' }\r\n }\r\n },\r\n thumbImageSize: {\r\n table: {\r\n defaultValue: { summary: 'cover' }\r\n }\r\n },\r\n bulletPosition: {\r\n table: {\r\n defaultValue: { summary: 'bottom' }\r\n }\r\n },\r\n counterPosition: {\r\n table: {\r\n defaultValue: { summary: 'top' }\r\n }\r\n },\r\n orientation: {\r\n table: {\r\n defaultValue: { summary: 'horizontal' }\r\n }\r\n },\r\n loadingAttr: {\r\n table: {\r\n defaultValue: { summary: 'lazy' }\r\n }\r\n },\r\n loadingStrategy: {\r\n table: {\r\n defaultValue: { summary: 'default' }\r\n }\r\n },\r\n thumbPosition: {\r\n table: {\r\n defaultValue: { summary: 'bottom' }\r\n }\r\n },\r\n thumbCentralized: {\r\n table: {\r\n defaultValue: { summary: 'default' }\r\n }\r\n },\r\n scrollEase: {\r\n table: {\r\n defaultValue: { summary: '{ x1: 0.42, y1: 0, x2: 0.58, y2: 1 }' }\r\n }\r\n },\r\n nav: {\r\n table: {\r\n defaultValue: { summary: true }\r\n }\r\n },\r\n thumbs: {\r\n table: {\r\n defaultValue: { summary: true }\r\n }\r\n },\r\n loop: {\r\n table: {\r\n defaultValue: { summary: true }\r\n }\r\n },\r\n counter: {\r\n table: {\r\n defaultValue: { summary: true }\r\n }\r\n },\r\n bulletSize: {\r\n table: {\r\n defaultValue: { summary: 6 }\r\n }\r\n },\r\n thumbWidth: {\r\n table: {\r\n defaultValue: { summary: 120 }\r\n }\r\n },\r\n thumbHeight: {\r\n table: {\r\n defaultValue: { summary: 90 }\r\n }\r\n },\r\n autoplayInterval: {\r\n table: {\r\n defaultValue: { summary: 3000 }\r\n }\r\n },\r\n scrollDuration: {\r\n table: {\r\n defaultValue: { summary: 468 }\r\n }\r\n },\r\n resizeDebounceTime: {\r\n table: {\r\n defaultValue: { summary: 0 }\r\n }\r\n },\r\n error: {\r\n control: false\r\n },\r\n indexChange: {\r\n control: false\r\n },\r\n itemsChange: {\r\n control: false\r\n },\r\n itemClick: {\r\n control: false\r\n },\r\n thumbClick: {\r\n control: false\r\n },\r\n playingChange: {\r\n control: false\r\n },\r\n galleryRef: {\r\n control: false\r\n },\r\n load: {\r\n control: false\r\n },\r\n add: {\r\n control: false\r\n },\r\n addImage: {\r\n control: false\r\n },\r\n addVideo: {\r\n control: false\r\n },\r\n addIframe: {\r\n control: false\r\n },\r\n addYoutube: {\r\n control: false\r\n },\r\n remove: {\r\n control: false\r\n },\r\n next: {\r\n control: false\r\n },\r\n prev: {\r\n control: false\r\n },\r\n set: {\r\n control: false\r\n },\r\n reset: {\r\n control: false\r\n },\r\n play: {\r\n control: false\r\n },\r\n stop: {\r\n control: false\r\n }\r\n }\r\n}" + }, + { + "name": "NavExample", + "ctype": "miscellaneous", + "subtype": "variable", + "file": "projects/ng-gallery/src/stories/basic/Gallery.stories.ts", + "deprecated": false, + "deprecationMessage": "", + "type": "Story", + "defaultValue": "{\r\n parameters:{ controls:{ exclude:/.*/g } },\r\n render: (args: GalleryComponent, { loaded: { items } }) => ({\r\n props: { ...args, items, },\r\n template: ``\r\n }),\r\n loaders: [\r\n async () => ({ items: await getHDImages('lions') }),\r\n ]\r\n}" + }, + { + "name": "NavWithLoopExample", + "ctype": "miscellaneous", + "subtype": "variable", + "file": "projects/ng-gallery/src/stories/basic/Gallery.stories.ts", + "deprecated": false, + "deprecationMessage": "", + "type": "Story", + "defaultValue": "{\r\n parameters:{ controls:{ exclude:/.*/g } },\r\n render: (args: GalleryComponent, { loaded: { items } }) => ({\r\n props: { ...args, items, },\r\n template: ``\r\n }),\r\n loaders: [\r\n async () => ({ items: await getHDImages('tigers') }),\r\n ]\r\n}" + }, + { + "name": "SliderBehaviorExample", + "ctype": "miscellaneous", + "subtype": "variable", + "file": "projects/ng-gallery/src/stories/basic/Gallery.stories.ts", + "deprecated": false, + "deprecationMessage": "", + "type": "Story", + "defaultValue": "{\r\n parameters:{ controls:{ exclude:/.*/g } },\r\n render: (args: GalleryComponent, { loaded: { items } }) => ({\r\n props: { ...args, items, },\r\n template: ``\r\n }),\r\n loaders: [\r\n async () => ({ items: await getHDImages('chips') }),\r\n ]\r\n}" + }, + { + "name": "SliderDirectionExample", + "ctype": "miscellaneous", + "subtype": "variable", + "file": "projects/ng-gallery/src/stories/basic/Gallery.stories.ts", + "deprecated": false, + "deprecationMessage": "", + "type": "Story", + "defaultValue": "{\r\n parameters:{ controls:{ exclude:/.*/g } },\r\n render: (args: GalleryComponent, { loaded: { items } }) => ({\r\n props: { ...args, items, },\r\n template: ``\r\n }),\r\n loaders: [\r\n async () => ({ items: await getHDImages('tigers') }),\r\n ]\r\n}" + }, + { + "name": "SliderExample", + "ctype": "miscellaneous", + "subtype": "variable", + "file": "projects/ng-gallery/src/stories/basic/Gallery.stories.ts", + "deprecated": false, + "deprecationMessage": "", + "type": "Story", + "defaultValue": "{\r\n parameters:{ controls:{ exclude:/.*/g } },\r\n render: (args: GalleryComponent, { loaded: { items } }) => ({\r\n props: { ...args, items, },\r\n template: ``\r\n }),\r\n loaders: [\r\n async () => ({ items: await getHDImages('chips') }),\r\n ]\r\n}" + }, + { + "name": "ThumbAutosizeExample", + "ctype": "miscellaneous", + "subtype": "variable", + "file": "projects/ng-gallery/src/stories/basic/Gallery.stories.ts", + "deprecated": false, + "deprecationMessage": "", + "type": "Story", + "defaultValue": "{\r\n parameters:{ controls:{ exclude:/.*/g } },\r\n render: (args: GalleryComponent, { loaded: { items } }) => ({\r\n props: { ...args, items, },\r\n template: ``\r\n }),\r\n loaders: [\r\n async () => ({ items: await getHDImages('roads') }),\r\n ]\r\n}" + }, + { + "name": "ThumbDetachedExample", + "ctype": "miscellaneous", + "subtype": "variable", + "file": "projects/ng-gallery/src/stories/basic/Gallery.stories.ts", + "deprecated": false, + "deprecationMessage": "", + "type": "Story", + "defaultValue": "{\r\n parameters:{ controls:{ exclude:/.*/g } },\r\n render: (args: GalleryComponent, { loaded: { items } }) => ({\r\n props: { ...args, items, },\r\n template: ``\r\n }),\r\n loaders: [\r\n async () => ({ items: await getHDImages('flowers') }),\r\n ]\r\n}" + }, + { + "name": "ThumbPositionExample", + "ctype": "miscellaneous", + "subtype": "variable", + "file": "projects/ng-gallery/src/stories/basic/Gallery.stories.ts", + "deprecated": false, + "deprecationMessage": "", + "type": "Story", + "defaultValue": "{\r\n parameters:{ controls:{ exclude:/.*/g } },\r\n render: (args: GalleryComponent, { loaded: { items } }) => ({\r\n props: { ...args, items, },\r\n template: ``\r\n }),\r\n loaders: [\r\n async () => ({ items: await getHDImages('street') }),\r\n ]\r\n}" + }, + { + "name": "ThumbViewExample", + "ctype": "miscellaneous", + "subtype": "variable", + "file": "projects/ng-gallery/src/stories/basic/Gallery.stories.ts", + "deprecated": false, + "deprecationMessage": "", + "type": "Story", + "defaultValue": "{\r\n parameters:{ controls:{ exclude:/.*/g } },\r\n render: (args: GalleryComponent, { loaded: { items } }) => ({\r\n props: { ...args, items, },\r\n template: ``\r\n }),\r\n loaders: [\r\n async () => ({ items: await getHDImages('landscape') }),\r\n ]\r\n}" + } + ], + "projects/ng-gallery/src/stories/custom-templates/CustomTemplates.stories.ts": [ + { + "name": "BoxTemplateExample", + "ctype": "miscellaneous", + "subtype": "variable", + "file": "projects/ng-gallery/src/stories/custom-templates/CustomTemplates.stories.ts", + "deprecated": false, + "deprecationMessage": "", + "type": "Story", + "defaultValue": "{\r\n render: (args: CustomTemplateComponent, { loaded: { items } }) => ({\r\n props: { ...args, items, },\r\n template: `\r\n \r\n
                                                                                                                                  \r\n
                                                                                                                                  This is fixed overlay template
                                                                                                                                  \r\n \r\n
                                                                                                                                  \r\n
                                                                                                                                  \r\n `,\r\n styles: [`\r\n .my-box {\r\n width: 200px;\r\n height: 50px;\r\n color: white;\r\n }\r\n img {\r\n position: absolute;\r\n z-index: 999;\r\n width: 40px;\r\n height: 40px;\r\n top: 20px;\r\n left: 20px;\r\n }\r\n `]\r\n }),\r\n loaders: [\r\n async () => ({ items: await getHDImages('sea') }),\r\n ]\r\n}" + }, + { + "name": "ImageTemplateExample", + "ctype": "miscellaneous", + "subtype": "variable", + "file": "projects/ng-gallery/src/stories/custom-templates/CustomTemplates.stories.ts", + "deprecated": false, + "deprecationMessage": "", + "type": "Story", + "defaultValue": "{\r\n render: (args: CustomTemplateComponent, { loaded: { items } }) => ({\r\n props: { ...args, items, },\r\n template: `\r\n \r\n
                                                                                                                                  \r\n {{ item?.alt }}\r\n
                                                                                                                                  \r\n
                                                                                                                                  \r\n `\r\n }),\r\n loaders: [\r\n async () => ({ items: await getHDImages('sea') }),\r\n ]\r\n}" + }, + { + "name": "ItemTemplateExample", + "ctype": "miscellaneous", + "subtype": "variable", + "file": "projects/ng-gallery/src/stories/custom-templates/CustomTemplates.stories.ts", + "deprecated": false, + "deprecationMessage": "", + "type": "Story", + "defaultValue": "{\r\n render: (args: CustomTemplateComponent, { loaded: { items } }) => ({\r\n props: { ...args, items, },\r\n template: `\r\n \r\n
                                                                                                                                  \r\n \r\n
                                                                                                                                  \r\n
                                                                                                                                  \r\n `,\r\n styles: [`\r\n img {\r\n object-fit: cover;\r\n border: 10px white solid;\r\n width: 400px;\r\n height: 400px;\r\n }\r\n `]\r\n }),\r\n loaders: [\r\n async () => ({ items: await getHDImagesForCustomTemplate('sand') }),\r\n ]\r\n}" + }, + { + "name": "meta", + "ctype": "miscellaneous", + "subtype": "variable", + "file": "projects/ng-gallery/src/stories/custom-templates/CustomTemplates.stories.ts", + "deprecated": false, + "deprecationMessage": "", + "type": "Meta", + "defaultValue": "{\r\n title: 'Documentations/CustomTemplates',\r\n component: CustomTemplateComponent,\r\n // tags: ['autodocs'],\r\n render: (args: CustomTemplateComponent) => ({\r\n props: {\r\n ...args,\r\n },\r\n }),\r\n decorators: [\r\n moduleMetadata({\r\n imports: [GalleryModule],\r\n }),\r\n applicationConfig({\r\n providers: [provideAnimations()],\r\n }),\r\n ]\r\n}" + }, + { + "name": "ThumbTemplateExample", + "ctype": "miscellaneous", + "subtype": "variable", + "file": "projects/ng-gallery/src/stories/custom-templates/CustomTemplates.stories.ts", + "deprecated": false, + "deprecationMessage": "", + "type": "Story", + "defaultValue": "{\r\n render: (args: CustomTemplateComponent, { loaded: { items } }) => ({\r\n props: { ...args, items, },\r\n template: `\r\n \r\n
                                                                                                                                  \r\n {{ thumb?.alt }}\r\n
                                                                                                                                  \r\n
                                                                                                                                  \r\n `\r\n }),\r\n loaders: [\r\n async () => ({ items: await getHDImages('sea') }),\r\n ]\r\n}" + } + ], + "projects/ng-gallery/src/lib/utils/gallery.default.ts": [ + { + "name": "defaultConfig", + "ctype": "miscellaneous", + "subtype": "variable", + "file": "projects/ng-gallery/src/lib/utils/gallery.default.ts", + "deprecated": false, + "deprecationMessage": "", + "type": "GalleryConfig", + "defaultValue": "{\r\n nav: true,\r\n loop: false,\r\n bullets: false,\r\n thumbs: false,\r\n debug: false,\r\n bulletSize: 6,\r\n counter: false,\r\n autoplay: false,\r\n thumbWidth: 120,\r\n thumbHeight: 90,\r\n disableBullets: false,\r\n disableThumbs: false,\r\n disableScroll: false,\r\n disableThumbScroll: false,\r\n disableMouseScroll: false,\r\n disableThumbMouseScroll: false,\r\n autoplayInterval: 3000,\r\n scrollDuration: 468,\r\n scrollEase: {\r\n x1: 0.42,\r\n y1: 0,\r\n x2: 0.58,\r\n y2: 1\r\n },\r\n thumbCentralized: false,\r\n thumbAutosize: false,\r\n itemAutosize: false,\r\n autoHeight: false,\r\n scrollBehavior: 'smooth',\r\n resizeDebounceTime: 0,\r\n loadingAttr: LoadingAttr.Lazy,\r\n imageSize: ImageSize.Contain,\r\n thumbImageSize: ImageSize.Cover,\r\n bulletPosition: BulletsPosition.Bottom,\r\n counterPosition: CounterPosition.Top,\r\n thumbPosition: ThumbnailsPosition.Bottom,\r\n loadingStrategy: LoadingStrategy.Preload,\r\n orientation: Orientation.Horizontal,\r\n navIcon: ``,\r\n // navIcon: ``,\r\n loadingIcon: ``\r\n}" + }, + { + "name": "defaultState", + "ctype": "miscellaneous", + "subtype": "variable", + "file": "projects/ng-gallery/src/lib/utils/gallery.default.ts", + "deprecated": false, + "deprecationMessage": "", + "type": "GalleryState", + "defaultValue": "{\r\n action: GalleryAction.INITIALIZED,\r\n isPlaying: false,\r\n hasNext: false,\r\n hasPrev: false,\r\n currIndex: 0,\r\n items: []\r\n}", + "rawdescription": "Initial state", + "description": "

                                                                                                                                  Initial state

                                                                                                                                  \n" + } + ], + "projects/ng-gallery/src/lib/services/gallery-ref.ts": [ + { + "name": "filterActions", + "ctype": "miscellaneous", + "subtype": "variable", + "file": "projects/ng-gallery/src/lib/services/gallery-ref.ts", + "deprecated": false, + "deprecationMessage": "", + "type": "", + "defaultValue": "(actions: string[]) => {\r\n return filter((state: GalleryState) => actions.indexOf(state.action) > -1);\r\n}" + } + ], + "projects/ng-gallery/src/lib/smooth-scroll/bezier-easing.ts": [ + { + "name": "float32ArraySupported", + "ctype": "miscellaneous", + "subtype": "variable", + "file": "projects/ng-gallery/src/lib/smooth-scroll/bezier-easing.ts", + "deprecated": false, + "deprecationMessage": "", + "type": "", + "defaultValue": "typeof Float32Array === 'function'" + }, + { + "name": "kSampleStepSize", + "ctype": "miscellaneous", + "subtype": "variable", + "file": "projects/ng-gallery/src/lib/smooth-scroll/bezier-easing.ts", + "deprecated": false, + "deprecationMessage": "", + "type": "", + "defaultValue": "1.0 / (kSplineTableSize - 1.0)" + }, + { + "name": "kSplineTableSize", + "ctype": "miscellaneous", + "subtype": "variable", + "file": "projects/ng-gallery/src/lib/smooth-scroll/bezier-easing.ts", + "deprecated": false, + "deprecationMessage": "", + "type": "number", + "defaultValue": "11" + }, + { + "name": "NEWTON_ITERATIONS", + "ctype": "miscellaneous", + "subtype": "variable", + "file": "projects/ng-gallery/src/lib/smooth-scroll/bezier-easing.ts", + "deprecated": false, + "deprecationMessage": "", + "type": "number", + "defaultValue": "4", + "rawdescription": "https://github.com/gre/bezier-easing\r\nBezierEasing - use bezier curve for transition easing function\r\nby Gaëtan Renaudeau 2014 - 2015 – MIT License", + "description": "

                                                                                                                                  https://github.com/gre/bezier-easing\nBezierEasing - use bezier curve for transition easing function\nby Gaëtan Renaudeau 2014 - 2015 – MIT License

                                                                                                                                  \n" + }, + { + "name": "NEWTON_MIN_SLOPE", + "ctype": "miscellaneous", + "subtype": "variable", + "file": "projects/ng-gallery/src/lib/smooth-scroll/bezier-easing.ts", + "deprecated": false, + "deprecationMessage": "", + "type": "number", + "defaultValue": "0.001" + }, + { + "name": "SUBDIVISION_MAX_ITERATIONS", + "ctype": "miscellaneous", + "subtype": "variable", + "file": "projects/ng-gallery/src/lib/smooth-scroll/bezier-easing.ts", + "deprecated": false, + "deprecationMessage": "", + "type": "number", + "defaultValue": "10" + }, + { + "name": "SUBDIVISION_PRECISION", + "ctype": "miscellaneous", + "subtype": "variable", + "file": "projects/ng-gallery/src/lib/smooth-scroll/bezier-easing.ts", + "deprecated": false, + "deprecationMessage": "", + "type": "number", + "defaultValue": "0.0000001" + } + ], + "projects/ng-gallery/src/stories/lightbox/Lightbox.stories.ts": [ + { + "name": "GallerizeExample", + "ctype": "miscellaneous", + "subtype": "variable", + "file": "projects/ng-gallery/src/stories/lightbox/Lightbox.stories.ts", + "deprecated": false, + "deprecationMessage": "", + "type": "Story", + "defaultValue": "{\r\n render: (args: LightboxExampleComponent, { loaded: { items } }) => ({\r\n props: { ...args, items, },\r\n template: `\r\n
                                                                                                                                  \r\n \r\n
                                                                                                                                  \r\n `,\r\n styles: [`\r\n .container {\r\n display: flex;\r\n flex-wrap: wrap;\r\n gap: 3px;\r\n margin: 0 auto;\r\n padding: 20px;\r\n max-width: 768px;\r\n }\r\n img {\r\n height: 90px;\r\n width: 125px;\r\n object-fit: cover;\r\n }\r\n `]\r\n }),\r\n loaders: [\r\n async () => ({ items: await getHDImages('ship') }),\r\n ]\r\n}" + }, + { + "name": "GallerizeGalleryExample", + "ctype": "miscellaneous", + "subtype": "variable", + "file": "projects/ng-gallery/src/stories/lightbox/Lightbox.stories.ts", + "deprecated": false, + "deprecationMessage": "", + "type": "Story", + "defaultValue": "{\r\n render: (args: LightboxExampleComponent, { loaded: { items } }) => ({\r\n props: { ...args, items, },\r\n template: `\r\n \r\n `\r\n }),\r\n loaders: [\r\n async () => ({ items: await getHDImages('ship') }),\r\n ]\r\n}" + }, + { + "name": "LightboxExample", + "ctype": "miscellaneous", + "subtype": "variable", + "file": "projects/ng-gallery/src/stories/lightbox/Lightbox.stories.ts", + "deprecated": false, + "deprecationMessage": "", + "type": "Story", + "defaultValue": "{\r\n parameters: {\r\n docs: {\r\n source: {\r\n code: `\r\n
                                                                                                                                  \r\n \r\n
                                                                                                                                  \r\n `,\r\n },\r\n },\r\n },\r\n render: (args: LightboxExampleComponent, { loaded: { items } }) => ({\r\n props: { ...args, items, },\r\n }),\r\n loaders: [\r\n async () => ({ items: await getHDImages('ship') }),\r\n ]\r\n}" + }, + { + "name": "meta", + "ctype": "miscellaneous", + "subtype": "variable", + "file": "projects/ng-gallery/src/stories/lightbox/Lightbox.stories.ts", + "deprecated": false, + "deprecationMessage": "", + "type": "Meta", + "defaultValue": "{\r\n title: 'Documentations/Lightbox',\r\n component: LightboxExampleComponent,\r\n decorators: [\r\n moduleMetadata({\r\n imports: [LightboxModule],\r\n }),\r\n applicationConfig({\r\n providers: [provideAnimations()],\r\n }),\r\n ]\r\n}" + } + ], + "projects/ng-gallery/src/lib/models/config.model.ts": [ + { + "name": "GALLERY_CONFIG", + "ctype": "miscellaneous", + "subtype": "variable", + "file": "projects/ng-gallery/src/lib/models/config.model.ts", + "deprecated": false, + "deprecationMessage": "", + "type": "InjectionToken", + "defaultValue": "new InjectionToken('GALLERY_CONFIG')" + } + ], + "projects/ng-gallery/src/lib/gestures/hammer-sliding.directive.ts": [ + { + "name": "Hammer", + "ctype": "miscellaneous", + "subtype": "variable", + "file": "projects/ng-gallery/src/lib/gestures/hammer-sliding.directive.ts", + "deprecated": false, + "deprecationMessage": "", + "type": "any" + } + ], + "projects/ng-gallery/src/lib/smooth-scroll/smooth-scroll.directive.ts": [ + { + "name": "Hammer", + "ctype": "miscellaneous", + "subtype": "variable", + "file": "projects/ng-gallery/src/lib/smooth-scroll/smooth-scroll.directive.ts", + "deprecated": false, + "deprecationMessage": "", + "type": "any" + } + ], + "projects/ng-gallery/src/lib/components/adapters/main-adapters.ts": [ + { + "name": "Hammer", + "ctype": "miscellaneous", + "subtype": "variable", + "file": "projects/ng-gallery/src/lib/components/adapters/main-adapters.ts", + "deprecated": false, + "deprecationMessage": "", + "type": "any" + } + ], + "projects/ng-gallery/src/lib/components/templates/svg-assets.ts": [ + { + "name": "imageFailedSvg", + "ctype": "miscellaneous", + "subtype": "variable", + "file": "projects/ng-gallery/src/lib/components/templates/svg-assets.ts", + "deprecated": false, + "deprecationMessage": "", + "type": "", + "defaultValue": "`\r\n\r\n \r\n\\t\r\n \r\n \r\n \r\n\r\n\r\n`" + } + ], + "projects/ng-gallery/.storybook/preview.ts": [ + { + "name": "preview", + "ctype": "miscellaneous", + "subtype": "variable", + "file": "projects/ng-gallery/.storybook/preview.ts", + "deprecated": false, + "deprecationMessage": "", + "type": "Preview", + "defaultValue": "{\n parameters: {\n layout: 'fullscreen',\n actions: { argTypesRegex: \"^on[A-Z].*\" },\n controls: {\n matchers: {\n color: /(background|color)$/i,\n date: /Date$/i,\n }\n }\n },\n}" + } + ] + }, + "groupedFunctions": { + "projects/ng-gallery/src/lib/smooth-scroll/bezier-easing.ts": [ + { + "name": "A", + "file": "projects/ng-gallery/src/lib/smooth-scroll/bezier-easing.ts", + "ctype": "miscellaneous", + "subtype": "function", + "deprecated": false, + "deprecationMessage": "", + "description": "", + "args": [ + { + "name": "aA1", + "type": "", + "deprecated": false, + "deprecationMessage": "" + }, + { + "name": "aA2", + "type": "", + "deprecated": false, + "deprecationMessage": "" + } + ], + "jsdoctags": [ + { + "name": "aA1", + "type": "", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + }, + { + "name": "aA2", + "type": "", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + } + ] + }, + { + "name": "B", + "file": "projects/ng-gallery/src/lib/smooth-scroll/bezier-easing.ts", + "ctype": "miscellaneous", + "subtype": "function", + "deprecated": false, + "deprecationMessage": "", + "description": "", + "args": [ + { + "name": "aA1", + "type": "", + "deprecated": false, + "deprecationMessage": "" + }, + { + "name": "aA2", + "type": "", + "deprecated": false, + "deprecationMessage": "" + } + ], + "jsdoctags": [ + { + "name": "aA1", + "type": "", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + }, + { + "name": "aA2", + "type": "", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + } + ] + }, + { + "name": "bezier", + "file": "projects/ng-gallery/src/lib/smooth-scroll/bezier-easing.ts", + "ctype": "miscellaneous", + "subtype": "function", + "deprecated": false, + "deprecationMessage": "", + "description": "", + "args": [ + { + "name": "mX1", + "type": "", + "deprecated": false, + "deprecationMessage": "" + }, + { + "name": "mY1", + "type": "", + "deprecated": false, + "deprecationMessage": "" + }, + { + "name": "mX2", + "type": "", + "deprecated": false, + "deprecationMessage": "" + }, + { + "name": "mY2", + "type": "", + "deprecated": false, + "deprecationMessage": "" + } + ], + "jsdoctags": [ + { + "name": "mX1", + "type": "", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + }, + { + "name": "mY1", + "type": "", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + }, + { + "name": "mX2", + "type": "", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + }, + { + "name": "mY2", + "type": "", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + } + ] + }, + { + "name": "binarySubdivide", + "file": "projects/ng-gallery/src/lib/smooth-scroll/bezier-easing.ts", + "ctype": "miscellaneous", + "subtype": "function", + "deprecated": false, + "deprecationMessage": "", + "description": "", + "args": [ + { + "name": "aX", + "type": "", + "deprecated": false, + "deprecationMessage": "" + }, + { + "name": "aA", + "type": "", + "deprecated": false, + "deprecationMessage": "" + }, + { + "name": "aB", + "type": "", + "deprecated": false, + "deprecationMessage": "" + }, + { + "name": "mX1", + "type": "", + "deprecated": false, + "deprecationMessage": "" + }, + { + "name": "mX2", + "type": "", + "deprecated": false, + "deprecationMessage": "" + } + ], + "jsdoctags": [ + { + "name": "aX", + "type": "", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + }, + { + "name": "aA", + "type": "", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + }, + { + "name": "aB", + "type": "", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + }, + { + "name": "mX1", + "type": "", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + }, + { + "name": "mX2", + "type": "", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + } + ] + }, + { + "name": "C", + "file": "projects/ng-gallery/src/lib/smooth-scroll/bezier-easing.ts", + "ctype": "miscellaneous", + "subtype": "function", + "deprecated": false, + "deprecationMessage": "", + "description": "", + "args": [ + { + "name": "aA1", + "type": "", + "deprecated": false, + "deprecationMessage": "" + } + ], + "jsdoctags": [ + { + "name": "aA1", + "type": "", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + } + ] + }, + { + "name": "calcBezier", + "file": "projects/ng-gallery/src/lib/smooth-scroll/bezier-easing.ts", + "ctype": "miscellaneous", + "subtype": "function", + "deprecated": false, + "deprecationMessage": "", + "description": "", + "args": [ + { + "name": "aT", + "type": "", + "deprecated": false, + "deprecationMessage": "" + }, + { + "name": "aA1", + "type": "", + "deprecated": false, + "deprecationMessage": "" + }, + { + "name": "aA2", + "type": "", + "deprecated": false, + "deprecationMessage": "" + } + ], + "jsdoctags": [ + { + "name": "aT", + "type": "", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + }, + { + "name": "aA1", + "type": "", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + }, + { + "name": "aA2", + "type": "", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + } + ] + }, + { + "name": "getSlope", + "file": "projects/ng-gallery/src/lib/smooth-scroll/bezier-easing.ts", + "ctype": "miscellaneous", + "subtype": "function", + "deprecated": false, + "deprecationMessage": "", + "description": "", + "args": [ + { + "name": "aT", + "type": "", + "deprecated": false, + "deprecationMessage": "" + }, + { + "name": "aA1", + "type": "", + "deprecated": false, + "deprecationMessage": "" + }, + { + "name": "aA2", + "type": "", + "deprecated": false, + "deprecationMessage": "" + } + ], + "jsdoctags": [ + { + "name": "aT", + "type": "", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + }, + { + "name": "aA1", + "type": "", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + }, + { + "name": "aA2", + "type": "", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + } + ] + }, + { + "name": "LinearEasing", + "file": "projects/ng-gallery/src/lib/smooth-scroll/bezier-easing.ts", + "ctype": "miscellaneous", + "subtype": "function", + "deprecated": false, + "deprecationMessage": "", + "description": "", + "args": [ + { + "name": "x", + "type": "", + "deprecated": false, + "deprecationMessage": "" + } + ], + "jsdoctags": [ + { + "name": "x", + "type": "", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + } + ] + }, + { + "name": "newtonRaphsonIterate", + "file": "projects/ng-gallery/src/lib/smooth-scroll/bezier-easing.ts", + "ctype": "miscellaneous", + "subtype": "function", + "deprecated": false, + "deprecationMessage": "", + "description": "", + "args": [ + { + "name": "aX", + "type": "", + "deprecated": false, + "deprecationMessage": "" + }, + { + "name": "aGuessT", + "type": "", + "deprecated": false, + "deprecationMessage": "" + }, + { + "name": "mX1", + "type": "", + "deprecated": false, + "deprecationMessage": "" + }, + { + "name": "mX2", + "type": "", + "deprecated": false, + "deprecationMessage": "" + } + ], + "jsdoctags": [ + { + "name": "aX", + "type": "", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + }, + { + "name": "aGuessT", + "type": "", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + }, + { + "name": "mX1", + "type": "", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + }, + { + "name": "mX2", + "type": "", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + } + ] + } + ], + "projects/ng-gallery/src/lib/observers/active-item-observer.ts": [ + { + "name": "createIntersectionObserver", + "file": "projects/ng-gallery/src/lib/observers/active-item-observer.ts", + "ctype": "miscellaneous", + "subtype": "function", + "deprecated": false, + "deprecationMessage": "", + "description": "", + "args": [ + { + "name": "root", + "type": "HTMLElement", + "deprecated": false, + "deprecationMessage": "" + }, + { + "name": "elements", + "deprecated": false, + "deprecationMessage": "" + }, + { + "name": "rootMargin", + "type": "string", + "deprecated": false, + "deprecationMessage": "" + } + ], + "returnType": "Observable", + "jsdoctags": [ + { + "name": "root", + "type": "HTMLElement", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + }, + { + "name": "elements", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + }, + { + "name": "rootMargin", + "type": "string", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + } + ] + } + ], + "projects/ng-gallery/src/stories/pixabay/pixabay.service.ts": [ + { + "name": "getHDImages", + "file": "projects/ng-gallery/src/stories/pixabay/pixabay.service.ts", + "ctype": "miscellaneous", + "subtype": "function", + "deprecated": false, + "deprecationMessage": "", + "description": "", + "args": [ + { + "name": "key", + "type": "string", + "deprecated": false, + "deprecationMessage": "" + } + ], + "returnType": "Promise", + "jsdoctags": [ + { + "name": "key", + "type": "string", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + } + ] + }, + { + "name": "getHDImagesForCustomTemplate", + "file": "projects/ng-gallery/src/stories/pixabay/pixabay.service.ts", + "ctype": "miscellaneous", + "subtype": "function", + "deprecated": false, + "deprecationMessage": "", + "description": "", + "args": [ + { + "name": "key", + "type": "string", + "deprecated": false, + "deprecationMessage": "" + } + ], + "returnType": "Promise", + "jsdoctags": [ + { + "name": "key", + "type": "string", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + } + ] + } + ], + "projects/ng-gallery/src/lib/utils/resize-observer.ts": [ + { + "name": "resizeObservable", + "file": "projects/ng-gallery/src/lib/utils/resize-observer.ts", + "ctype": "miscellaneous", + "subtype": "function", + "deprecated": false, + "deprecationMessage": "", + "description": "", + "args": [ + { + "name": "el", + "type": "HTMLElement", + "deprecated": false, + "deprecationMessage": "" + }, + { + "name": "setter", + "deprecated": false, + "deprecationMessage": "", + "optional": true + } + ], + "returnType": "Observable", + "jsdoctags": [ + { + "name": "el", + "type": "HTMLElement", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + }, + { + "name": "setter", + "deprecated": false, + "deprecationMessage": "", + "optional": true, + "tagName": { + "text": "param" + } + } + ] + } + ] + }, + "groupedEnumerations": { + "projects/ng-gallery/src/lib/models/constants.ts": [ + { + "name": "BulletsPosition", + "childs": [ + { + "name": "Top", + "deprecated": false, + "deprecationMessage": "", + "value": "top" + }, + { + "name": "Bottom", + "deprecated": false, + "deprecationMessage": "", + "value": "bottom" + } + ], + "ctype": "miscellaneous", + "subtype": "enum", + "deprecated": false, + "deprecationMessage": "", + "description": "", + "file": "projects/ng-gallery/src/lib/models/constants.ts" + }, + { + "name": "CounterPosition", + "childs": [ + { + "name": "Top", + "deprecated": false, + "deprecationMessage": "", + "value": "top" + }, + { + "name": "Bottom", + "deprecated": false, + "deprecationMessage": "", + "value": "bottom" + } + ], + "ctype": "miscellaneous", + "subtype": "enum", + "deprecated": false, + "deprecationMessage": "", + "description": "", + "file": "projects/ng-gallery/src/lib/models/constants.ts" + }, + { + "name": "GalleryAction", + "childs": [ + { + "name": "INITIALIZED", + "deprecated": false, + "deprecationMessage": "", + "value": "initialized" + }, + { + "name": "ITEMS_CHANGED", + "deprecated": false, + "deprecationMessage": "", + "value": "itemsChanged" + }, + { + "name": "INDEX_CHANGED", + "deprecated": false, + "deprecationMessage": "", + "value": "indexChanged" + }, + { + "name": "PLAY", + "deprecated": false, + "deprecationMessage": "", + "value": "play" + }, + { + "name": "STOP", + "deprecated": false, + "deprecationMessage": "", + "value": "stop" + } + ], + "ctype": "miscellaneous", + "subtype": "enum", + "deprecated": false, + "deprecationMessage": "", + "description": "", + "file": "projects/ng-gallery/src/lib/models/constants.ts" + }, + { + "name": "GalleryItemTypes", + "childs": [ + { + "name": "Image", + "deprecated": false, + "deprecationMessage": "", + "value": "image" + }, + { + "name": "Video", + "deprecated": false, + "deprecationMessage": "", + "value": "video" + }, + { + "name": "Youtube", + "deprecated": false, + "deprecationMessage": "", + "value": "youtube" + }, + { + "name": "Iframe", + "deprecated": false, + "deprecationMessage": "", + "value": "iframe" + } + ], + "ctype": "miscellaneous", + "subtype": "enum", + "deprecated": false, + "deprecationMessage": "", + "description": "", + "file": "projects/ng-gallery/src/lib/models/constants.ts" + }, + { + "name": "ImageSize", + "childs": [ + { + "name": "Cover", + "deprecated": false, + "deprecationMessage": "", + "value": "cover" + }, + { + "name": "Contain", + "deprecated": false, + "deprecationMessage": "", + "value": "contain" + } + ], + "ctype": "miscellaneous", + "subtype": "enum", + "deprecated": false, + "deprecationMessage": "", + "description": "", + "file": "projects/ng-gallery/src/lib/models/constants.ts" + }, + { + "name": "LoadingAttr", + "childs": [ + { + "name": "Eager", + "deprecated": false, + "deprecationMessage": "", + "value": "eager" + }, + { + "name": "Lazy", + "deprecated": false, + "deprecationMessage": "", + "value": "lazy" + } + ], + "ctype": "miscellaneous", + "subtype": "enum", + "deprecated": false, + "deprecationMessage": "", + "description": "", + "file": "projects/ng-gallery/src/lib/models/constants.ts" + }, + { + "name": "LoadingStrategy", + "childs": [ + { + "name": "Preload", + "deprecated": false, + "deprecationMessage": "", + "value": "preload" + }, + { + "name": "Lazy", + "deprecated": false, + "deprecationMessage": "", + "value": "lazy" + }, + { + "name": "Default", + "deprecated": false, + "deprecationMessage": "", + "value": "default" + } + ], + "ctype": "miscellaneous", + "subtype": "enum", + "deprecated": false, + "deprecationMessage": "", + "description": "", + "file": "projects/ng-gallery/src/lib/models/constants.ts" + }, + { + "name": "Orientation", + "childs": [ + { + "name": "Horizontal", + "deprecated": false, + "deprecationMessage": "", + "value": "horizontal" + }, + { + "name": "Vertical", + "deprecated": false, + "deprecationMessage": "", + "value": "vertical" + } + ], + "ctype": "miscellaneous", + "subtype": "enum", + "deprecated": false, + "deprecationMessage": "", + "description": "", + "file": "projects/ng-gallery/src/lib/models/constants.ts" + }, + { + "name": "ThumbnailsPosition", + "childs": [ + { + "name": "Top", + "deprecated": false, + "deprecationMessage": "", + "value": "top" + }, + { + "name": "Left", + "deprecated": false, + "deprecationMessage": "", + "value": "left" + }, + { + "name": "Right", + "deprecated": false, + "deprecationMessage": "", + "value": "right" + }, + { + "name": "Bottom", + "deprecated": false, + "deprecationMessage": "", + "value": "bottom" + } + ], + "ctype": "miscellaneous", + "subtype": "enum", + "deprecated": false, + "deprecationMessage": "", + "description": "", + "file": "projects/ng-gallery/src/lib/models/constants.ts" + } + ] + }, + "groupedTypeAliases": { + "projects/ng-gallery/src/lib/models/config.model.ts": [ + { + "name": "GalleryConfig", + "ctype": "miscellaneous", + "subtype": "typealias", + "rawtype": "", + "file": "projects/ng-gallery/src/lib/models/config.model.ts", + "deprecated": false, + "deprecationMessage": "", + "description": "", + "kind": 190 + }, + { + "name": "HorizontalPosition", + "ctype": "miscellaneous", + "subtype": "typealias", + "rawtype": "\"top\" | \"bottom\"", + "file": "projects/ng-gallery/src/lib/models/config.model.ts", + "deprecated": false, + "deprecationMessage": "", + "description": "", + "kind": 189 + }, + { + "name": "ImageSize", + "ctype": "miscellaneous", + "subtype": "typealias", + "rawtype": "\"contain\" | \"cover\"", + "file": "projects/ng-gallery/src/lib/models/config.model.ts", + "deprecated": false, + "deprecationMessage": "", + "description": "", + "kind": 189 + }, + { + "name": "LoadingAttr", + "ctype": "miscellaneous", + "subtype": "typealias", + "rawtype": "\"eager\" | \"lazy\"", + "file": "projects/ng-gallery/src/lib/models/config.model.ts", + "deprecated": false, + "deprecationMessage": "", + "description": "", + "kind": 189 + }, + { + "name": "LoadingStrategy", + "ctype": "miscellaneous", + "subtype": "typealias", + "rawtype": "\"preload\" | \"lazy\" | \"default\"", + "file": "projects/ng-gallery/src/lib/models/config.model.ts", + "deprecated": false, + "deprecationMessage": "", + "description": "", + "kind": 189 + }, + { + "name": "Orientation", + "ctype": "miscellaneous", + "subtype": "typealias", + "rawtype": "\"horizontal\" | \"vertical\"", + "file": "projects/ng-gallery/src/lib/models/config.model.ts", + "deprecated": false, + "deprecationMessage": "", + "description": "", + "kind": 189 + }, + { + "name": "ThumbsPosition", + "ctype": "miscellaneous", + "subtype": "typealias", + "rawtype": "\"top\" | \"left\" | \"right\" | \"bottom\"", + "file": "projects/ng-gallery/src/lib/models/config.model.ts", + "deprecated": false, + "deprecationMessage": "", + "description": "", + "kind": 189 + } + ], + "projects/ng-gallery/src/lib/components/templates/items.model.ts": [ + { + "name": "GalleryItemData", + "ctype": "miscellaneous", + "subtype": "typealias", + "rawtype": "ImageItemData | VideoItemData | IframeItemData | YoutubeItemData", + "file": "projects/ng-gallery/src/lib/components/templates/items.model.ts", + "deprecated": false, + "deprecationMessage": "", + "description": "", + "kind": 189 + }, + { + "name": "GalleryItemModel", + "ctype": "miscellaneous", + "subtype": "typealias", + "rawtype": "literal type", + "file": "projects/ng-gallery/src/lib/components/templates/items.model.ts", + "deprecated": false, + "deprecationMessage": "", + "description": "", + "kind": 184 + }, + { + "name": "IframeItemData", + "ctype": "miscellaneous", + "subtype": "typealias", + "rawtype": "", + "file": "projects/ng-gallery/src/lib/components/templates/items.model.ts", + "deprecated": false, + "deprecationMessage": "", + "description": "", + "kind": 190 + }, + { + "name": "ImageItemData", + "ctype": "miscellaneous", + "subtype": "typealias", + "rawtype": "", + "file": "projects/ng-gallery/src/lib/components/templates/items.model.ts", + "deprecated": false, + "deprecationMessage": "", + "description": "", + "kind": 190 + }, + { + "name": "ItemState", + "ctype": "miscellaneous", + "subtype": "typealias", + "rawtype": "\"success\" | \"loading\" | \"failed\"", + "file": "projects/ng-gallery/src/lib/components/templates/items.model.ts", + "deprecated": false, + "deprecationMessage": "", + "description": "", + "kind": 189 + }, + { + "name": "VideoItemData", + "ctype": "miscellaneous", + "subtype": "typealias", + "rawtype": "", + "file": "projects/ng-gallery/src/lib/components/templates/items.model.ts", + "deprecated": false, + "deprecationMessage": "", + "description": "", + "kind": 190 + }, + { + "name": "YoutubeItemData", + "ctype": "miscellaneous", + "subtype": "typealias", + "rawtype": "", + "file": "projects/ng-gallery/src/lib/components/templates/items.model.ts", + "deprecated": false, + "deprecationMessage": "", + "description": "", + "kind": 190 + } + ], + "projects/ng-gallery/src/lib/models/constants.ts": [ + { + "name": "GalleryItemType", + "ctype": "miscellaneous", + "subtype": "typealias", + "rawtype": "GalleryItemTypes | string", + "file": "projects/ng-gallery/src/lib/models/constants.ts", + "deprecated": false, + "deprecationMessage": "", + "description": "", + "kind": 189 + } + ], + "projects/ng-gallery/src/lib/smooth-scroll/smooth-scroll.model.ts": [ + { + "name": "SmoothScrollOptions", + "ctype": "miscellaneous", + "subtype": "typealias", + "rawtype": "", + "file": "projects/ng-gallery/src/lib/smooth-scroll/smooth-scroll.model.ts", + "deprecated": false, + "deprecationMessage": "", + "description": "", + "kind": 190 + }, + { + "name": "SmoothScrollToOptions", + "ctype": "miscellaneous", + "subtype": "typealias", + "rawtype": "", + "file": "projects/ng-gallery/src/lib/smooth-scroll/smooth-scroll.model.ts", + "deprecated": false, + "deprecationMessage": "", + "description": "", + "kind": 190 + } + ], + "projects/ng-gallery/src/stories/basic/Gallery.stories.ts": [ + { + "name": "Story", + "ctype": "miscellaneous", + "subtype": "typealias", + "rawtype": "StoryObj", + "file": "projects/ng-gallery/src/stories/basic/Gallery.stories.ts", + "deprecated": false, + "deprecationMessage": "", + "description": "", + "kind": 180 + } + ], + "projects/ng-gallery/src/stories/custom-templates/CustomTemplates.stories.ts": [ + { + "name": "Story", + "ctype": "miscellaneous", + "subtype": "typealias", + "rawtype": "StoryObj", + "file": "projects/ng-gallery/src/stories/custom-templates/CustomTemplates.stories.ts", + "deprecated": false, + "deprecationMessage": "", + "description": "", + "kind": 180 + } + ], + "projects/ng-gallery/src/stories/lightbox/Lightbox.stories.ts": [ + { + "name": "Story", + "ctype": "miscellaneous", + "subtype": "typealias", + "rawtype": "StoryObj", + "file": "projects/ng-gallery/src/stories/lightbox/Lightbox.stories.ts", + "deprecated": false, + "deprecationMessage": "", + "description": "", + "kind": 180 + } + ] + } + }, + "routes": [], + "coverage": { + "count": 9, + "status": "low", + "files": [ + { + "filePath": "projects/ng-gallery/.storybook/preview.ts", + "type": "variable", + "linktype": "miscellaneous", + "linksubtype": "variable", + "name": "preview", + "coveragePercent": 0, + "coverageCount": "0/1", + "status": "low" + }, + { + "filePath": "projects/ng-gallery/src/lib/autoplay/autoplay.directive.ts", + "type": "directive", + "linktype": "directive", + "name": "AutoplayDirective", + "coveragePercent": 0, + "coverageCount": "0/11", + "status": "low" + }, + { + "filePath": "projects/ng-gallery/src/lib/components/adapters/base-adapter.ts", + "type": "class", + "linktype": "classe", + "name": "SliderAdapter", + "coveragePercent": 0, + "coverageCount": "0/10", + "status": "low" + }, + { + "filePath": "projects/ng-gallery/src/lib/components/adapters/main-adapters.ts", + "type": "class", + "linktype": "classe", + "name": "HorizontalAdapter", + "coveragePercent": 0, + "coverageCount": "0/13", + "status": "low" + }, + { + "filePath": "projects/ng-gallery/src/lib/components/adapters/main-adapters.ts", + "type": "class", + "linktype": "classe", + "name": "VerticalAdapter", + "coveragePercent": 0, + "coverageCount": "0/13", + "status": "low" + }, + { + "filePath": "projects/ng-gallery/src/lib/components/adapters/main-adapters.ts", + "type": "variable", + "linktype": "miscellaneous", + "linksubtype": "variable", + "name": "Hammer", + "coveragePercent": 0, + "coverageCount": "0/1", + "status": "low" + }, + { + "filePath": "projects/ng-gallery/src/lib/components/gallery-bullets.component.ts", + "type": "component", + "linktype": "component", + "name": "GalleryBulletsComponent", + "coveragePercent": 0, + "coverageCount": "0/6", + "status": "low" + }, + { + "filePath": "projects/ng-gallery/src/lib/components/gallery-core.component.ts", + "type": "component", + "linktype": "component", + "name": "GalleryCoreComponent", + "coveragePercent": 62, + "coverageCount": "15/24", + "status": "good" + }, + { + "filePath": "projects/ng-gallery/src/lib/components/gallery-counter.component.ts", + "type": "component", + "linktype": "component", + "name": "GalleryCounterComponent", + "coveragePercent": 0, + "coverageCount": "0/2", + "status": "low" + }, + { + "filePath": "projects/ng-gallery/src/lib/components/gallery-item.component.ts", + "type": "component", + "linktype": "component", + "name": "GalleryItemComponent", + "coveragePercent": 56, + "coverageCount": "9/16", + "status": "good" + }, + { + "filePath": "projects/ng-gallery/src/lib/components/gallery-nav.component.ts", + "type": "component", + "linktype": "component", + "name": "GalleryNavComponent", + "coveragePercent": 0, + "coverageCount": "0/11", + "status": "low" + }, + { + "filePath": "projects/ng-gallery/src/lib/components/gallery-slider.component.ts", + "type": "component", + "linktype": "component", + "name": "GallerySliderComponent", + "coveragePercent": 45, + "coverageCount": "9/20", + "status": "medium" + }, + { + "filePath": "projects/ng-gallery/src/lib/components/gallery-thumb.component.ts", + "type": "component", + "linktype": "component", + "name": "GalleryThumbComponent", + "coveragePercent": 45, + "coverageCount": "5/11", + "status": "medium" + }, + { + "filePath": "projects/ng-gallery/src/lib/components/gallery-thumbs.component.ts", + "type": "component", + "linktype": "component", + "name": "GalleryThumbsComponent", + "coveragePercent": 56, + "coverageCount": "9/16", + "status": "good" + }, + { + "filePath": "projects/ng-gallery/src/lib/components/gallery.component.ts", + "type": "component", + "linktype": "component", + "name": "GalleryComponent", + "coveragePercent": 98, + "coverageCount": "57/58", + "status": "very-good" + }, + { + "filePath": "projects/ng-gallery/src/lib/components/templates/gallery-iframe.component.ts", + "type": "component", + "linktype": "component", + "name": "GalleryIframeComponent", + "coveragePercent": 0, + "coverageCount": "0/9", + "status": "low" + }, + { + "filePath": "projects/ng-gallery/src/lib/components/templates/gallery-image.component.ts", + "type": "component", + "linktype": "component", + "name": "GalleryImageComponent", + "coveragePercent": 52, + "coverageCount": "9/17", + "status": "good" + }, + { + "filePath": "projects/ng-gallery/src/lib/components/templates/gallery-video.component.ts", + "type": "component", + "linktype": "component", + "name": "GalleryVideoComponent", + "coveragePercent": 6, + "coverageCount": "1/15", + "status": "low" + }, + { + "filePath": "projects/ng-gallery/src/lib/components/templates/items.model.ts", + "type": "class", + "linktype": "classe", + "name": "IframeItem", + "coveragePercent": 0, + "coverageCount": "0/4", + "status": "low" + }, + { + "filePath": "projects/ng-gallery/src/lib/components/templates/items.model.ts", + "type": "class", + "linktype": "classe", + "name": "ImageItem", + "coveragePercent": 0, + "coverageCount": "0/4", + "status": "low" + }, + { + "filePath": "projects/ng-gallery/src/lib/components/templates/items.model.ts", + "type": "class", + "linktype": "classe", + "name": "VideoItem", + "coveragePercent": 0, + "coverageCount": "0/4", + "status": "low" + }, + { + "filePath": "projects/ng-gallery/src/lib/components/templates/items.model.ts", + "type": "class", + "linktype": "classe", + "name": "YoutubeItem", + "coveragePercent": 0, + "coverageCount": "0/4", + "status": "low" + }, + { + "filePath": "projects/ng-gallery/src/lib/components/templates/svg-assets.ts", + "type": "variable", + "linktype": "miscellaneous", + "linksubtype": "variable", + "name": "imageFailedSvg", + "coveragePercent": 0, + "coverageCount": "0/1", + "status": "low" + }, + { + "filePath": "projects/ng-gallery/src/lib/directives/gallery-box-def.directive.ts", + "type": "directive", + "linktype": "directive", + "name": "GalleryBoxDef", + "coveragePercent": 0, + "coverageCount": "0/4", + "status": "low" + }, + { + "filePath": "projects/ng-gallery/src/lib/directives/gallery-box-def.directive.ts", + "type": "interface", + "linktype": "interface", + "name": "GalleryStateContext", + "coveragePercent": 0, + "coverageCount": "0/3", + "status": "low" + }, + { + "filePath": "projects/ng-gallery/src/lib/directives/gallery-image-def.directive.ts", + "type": "directive", + "linktype": "directive", + "name": "GalleryImageDef", + "coveragePercent": 0, + "coverageCount": "0/4", + "status": "low" + }, + { + "filePath": "projects/ng-gallery/src/lib/directives/gallery-item-def.directive.ts", + "type": "directive", + "linktype": "directive", + "name": "GalleryItemDef", + "coveragePercent": 0, + "coverageCount": "0/4", + "status": "low" + }, + { + "filePath": "projects/ng-gallery/src/lib/directives/gallery-item-def.directive.ts", + "type": "interface", + "linktype": "interface", + "name": "GalleryItemContext", + "coveragePercent": 87, + "coverageCount": "7/8", + "status": "very-good" + }, + { + "filePath": "projects/ng-gallery/src/lib/directives/gallery-thumb-def.directive.ts", + "type": "directive", + "linktype": "directive", + "name": "GalleryThumbDef", + "coveragePercent": 0, + "coverageCount": "0/4", + "status": "low" + }, + { + "filePath": "projects/ng-gallery/src/lib/gestures/hammer-sliding.directive.ts", + "type": "directive", + "linktype": "directive", + "name": "HammerSliding", + "coveragePercent": 5, + "coverageCount": "1/17", + "status": "low" + }, + { + "filePath": "projects/ng-gallery/src/lib/gestures/hammer-sliding.directive.ts", + "type": "variable", + "linktype": "miscellaneous", + "linksubtype": "variable", + "name": "Hammer", + "coveragePercent": 0, + "coverageCount": "0/1", + "status": "low" + }, + { + "filePath": "projects/ng-gallery/src/lib/models/config.model.ts", + "type": "interface", + "linktype": "interface", + "name": "BulletsConfig", + "coveragePercent": 0, + "coverageCount": "0/5", + "status": "low" + }, + { + "filePath": "projects/ng-gallery/src/lib/models/config.model.ts", + "type": "interface", + "linktype": "interface", + "name": "CounterConfig", + "coveragePercent": 0, + "coverageCount": "0/3", + "status": "low" + }, + { + "filePath": "projects/ng-gallery/src/lib/models/config.model.ts", + "type": "interface", + "linktype": "interface", + "name": "NavConfig", + "coveragePercent": 0, + "coverageCount": "0/3", + "status": "low" + }, + { + "filePath": "projects/ng-gallery/src/lib/models/config.model.ts", + "type": "interface", + "linktype": "interface", + "name": "PlayerConfig", + "coveragePercent": 0, + "coverageCount": "0/3", + "status": "low" + }, + { + "filePath": "projects/ng-gallery/src/lib/models/config.model.ts", + "type": "interface", + "linktype": "interface", + "name": "SliderConfig", + "coveragePercent": 0, + "coverageCount": "0/17", + "status": "low" + }, + { + "filePath": "projects/ng-gallery/src/lib/models/config.model.ts", + "type": "interface", + "linktype": "interface", + "name": "ThumbConfig", + "coveragePercent": 0, + "coverageCount": "0/15", + "status": "low" + }, + { + "filePath": "projects/ng-gallery/src/lib/models/config.model.ts", + "type": "variable", + "linktype": "miscellaneous", + "linksubtype": "variable", + "name": "GALLERY_CONFIG", + "coveragePercent": 0, + "coverageCount": "0/1", + "status": "low" + }, + { + "filePath": "projects/ng-gallery/src/lib/models/gallery.model.ts", + "type": "interface", + "linktype": "interface", + "name": "GalleryError", + "coveragePercent": 0, + "coverageCount": "0/3", + "status": "low" + }, + { + "filePath": "projects/ng-gallery/src/lib/models/gallery.model.ts", + "type": "interface", + "linktype": "interface", + "name": "GalleryItem", + "coveragePercent": 0, + "coverageCount": "0/3", + "status": "low" + }, + { + "filePath": "projects/ng-gallery/src/lib/models/gallery.model.ts", + "type": "interface", + "linktype": "interface", + "name": "GalleryState", + "coveragePercent": 0, + "coverageCount": "0/8", + "status": "low" + }, + { + "filePath": "projects/ng-gallery/src/lib/models/slider.model.ts", + "type": "interface", + "linktype": "interface", + "name": "SliderState", + "coveragePercent": 0, + "coverageCount": "0/3", + "status": "low" + }, + { + "filePath": "projects/ng-gallery/src/lib/models/slider.model.ts", + "type": "interface", + "linktype": "interface", + "name": "WorkerState", + "coveragePercent": 0, + "coverageCount": "0/3", + "status": "low" + }, + { + "filePath": "projects/ng-gallery/src/lib/observers/active-item-observer.ts", + "type": "class", + "linktype": "classe", + "name": "ActiveItemObserver", + "coveragePercent": 0, + "coverageCount": "0/2", + "status": "low" + }, + { + "filePath": "projects/ng-gallery/src/lib/observers/active-item-observer.ts", + "type": "function", + "linktype": "miscellaneous", + "linksubtype": "function", + "name": "createIntersectionObserver", + "coveragePercent": 0, + "coverageCount": "0/1", + "status": "low" + }, + { + "filePath": "projects/ng-gallery/src/lib/observers/item-intersection-observer.directive.ts", + "type": "directive", + "linktype": "directive", + "name": "ItemIntersectionObserver", + "coveragePercent": 0, + "coverageCount": "0/12", + "status": "low" + }, + { + "filePath": "projects/ng-gallery/src/lib/observers/slider-intersection-observer.directive.ts", + "type": "directive", + "linktype": "directive", + "name": "SliderIntersectionObserver", + "coveragePercent": 0, + "coverageCount": "0/13", + "status": "low" + }, + { + "filePath": "projects/ng-gallery/src/lib/observers/slider-resize-observer.directive.ts", + "type": "directive", + "linktype": "directive", + "name": "SliderResizeObserver", + "coveragePercent": 0, + "coverageCount": "0/21", + "status": "low" + }, + { + "filePath": "projects/ng-gallery/src/lib/observers/thumb-resize-observer.directive.ts", + "type": "directive", + "linktype": "directive", + "name": "ThumbResizeObserver", + "coveragePercent": 0, + "coverageCount": "0/10", + "status": "low" + }, + { + "filePath": "projects/ng-gallery/src/lib/services/gallery-ref.ts", + "type": "class", + "linktype": "classe", + "name": "GalleryRef", + "coveragePercent": 92, + "coverageCount": "23/25", + "status": "very-good" + }, + { + "filePath": "projects/ng-gallery/src/lib/services/gallery-ref.ts", + "type": "variable", + "linktype": "miscellaneous", + "linksubtype": "variable", + "name": "filterActions", + "coveragePercent": 0, + "coverageCount": "0/1", + "status": "low" + }, + { + "filePath": "projects/ng-gallery/src/lib/services/gallery.service.ts", + "type": "injectable", + "linktype": "injectable", + "name": "Gallery", + "coveragePercent": 77, + "coverageCount": "7/9", + "status": "very-good" + }, + { + "filePath": "projects/ng-gallery/src/lib/smooth-scroll/bezier-easing.ts", + "type": "function", + "linktype": "miscellaneous", + "linksubtype": "function", + "name": "A", + "coveragePercent": 0, + "coverageCount": "0/1", + "status": "low" + }, + { + "filePath": "projects/ng-gallery/src/lib/smooth-scroll/bezier-easing.ts", + "type": "function", + "linktype": "miscellaneous", + "linksubtype": "function", + "name": "B", + "coveragePercent": 0, + "coverageCount": "0/1", + "status": "low" + }, + { + "filePath": "projects/ng-gallery/src/lib/smooth-scroll/bezier-easing.ts", + "type": "function", + "linktype": "miscellaneous", + "linksubtype": "function", + "name": "bezier", + "coveragePercent": 0, + "coverageCount": "0/1", + "status": "low" + }, + { + "filePath": "projects/ng-gallery/src/lib/smooth-scroll/bezier-easing.ts", + "type": "function", + "linktype": "miscellaneous", + "linksubtype": "function", + "name": "binarySubdivide", + "coveragePercent": 0, + "coverageCount": "0/1", + "status": "low" + }, + { + "filePath": "projects/ng-gallery/src/lib/smooth-scroll/bezier-easing.ts", + "type": "function", + "linktype": "miscellaneous", + "linksubtype": "function", + "name": "C", + "coveragePercent": 0, + "coverageCount": "0/1", + "status": "low" + }, + { + "filePath": "projects/ng-gallery/src/lib/smooth-scroll/bezier-easing.ts", + "type": "function", + "linktype": "miscellaneous", + "linksubtype": "function", + "name": "calcBezier", + "coveragePercent": 0, + "coverageCount": "0/1", + "status": "low" + }, + { + "filePath": "projects/ng-gallery/src/lib/smooth-scroll/bezier-easing.ts", + "type": "function", + "linktype": "miscellaneous", + "linksubtype": "function", + "name": "getSlope", + "coveragePercent": 0, + "coverageCount": "0/1", + "status": "low" + }, + { + "filePath": "projects/ng-gallery/src/lib/smooth-scroll/bezier-easing.ts", + "type": "function", + "linktype": "miscellaneous", + "linksubtype": "function", + "name": "LinearEasing", + "coveragePercent": 0, + "coverageCount": "0/1", + "status": "low" + }, + { + "filePath": "projects/ng-gallery/src/lib/smooth-scroll/bezier-easing.ts", + "type": "function", + "linktype": "miscellaneous", + "linksubtype": "function", + "name": "newtonRaphsonIterate", + "coveragePercent": 0, + "coverageCount": "0/1", + "status": "low" + }, + { + "filePath": "projects/ng-gallery/src/lib/smooth-scroll/bezier-easing.ts", + "type": "variable", + "linktype": "miscellaneous", + "linksubtype": "variable", + "name": "float32ArraySupported", + "coveragePercent": 0, + "coverageCount": "0/1", + "status": "low" + }, + { + "filePath": "projects/ng-gallery/src/lib/smooth-scroll/bezier-easing.ts", + "type": "variable", + "linktype": "miscellaneous", + "linksubtype": "variable", + "name": "kSampleStepSize", + "coveragePercent": 0, + "coverageCount": "0/1", + "status": "low" + }, + { + "filePath": "projects/ng-gallery/src/lib/smooth-scroll/bezier-easing.ts", + "type": "variable", + "linktype": "miscellaneous", + "linksubtype": "variable", + "name": "kSplineTableSize", + "coveragePercent": 0, + "coverageCount": "0/1", + "status": "low" + }, + { + "filePath": "projects/ng-gallery/src/lib/smooth-scroll/bezier-easing.ts", + "type": "variable", + "linktype": "miscellaneous", + "linksubtype": "variable", + "name": "NEWTON_ITERATIONS", + "coveragePercent": 100, + "coverageCount": "1/1", + "status": "very-good" + }, + { + "filePath": "projects/ng-gallery/src/lib/smooth-scroll/bezier-easing.ts", + "type": "variable", + "linktype": "miscellaneous", + "linksubtype": "variable", + "name": "NEWTON_MIN_SLOPE", + "coveragePercent": 0, + "coverageCount": "0/1", + "status": "low" + }, + { + "filePath": "projects/ng-gallery/src/lib/smooth-scroll/bezier-easing.ts", + "type": "variable", + "linktype": "miscellaneous", + "linksubtype": "variable", + "name": "SUBDIVISION_MAX_ITERATIONS", + "coveragePercent": 0, + "coverageCount": "0/1", + "status": "low" + }, + { + "filePath": "projects/ng-gallery/src/lib/smooth-scroll/bezier-easing.ts", + "type": "variable", + "linktype": "miscellaneous", + "linksubtype": "variable", + "name": "SUBDIVISION_PRECISION", + "coveragePercent": 0, + "coverageCount": "0/1", + "status": "low" + }, + { + "filePath": "projects/ng-gallery/src/lib/smooth-scroll/smooth-scroll.directive.ts", + "type": "directive", + "linktype": "directive", + "name": "SmoothScroll", + "coveragePercent": 27, + "coverageCount": "6/22", + "status": "medium" + }, + { + "filePath": "projects/ng-gallery/src/lib/smooth-scroll/smooth-scroll.directive.ts", + "type": "variable", + "linktype": "miscellaneous", + "linksubtype": "variable", + "name": "Hammer", + "coveragePercent": 0, + "coverageCount": "0/1", + "status": "low" + }, + { + "filePath": "projects/ng-gallery/src/lib/smooth-scroll/smooth-scroll.model.ts", + "type": "interface", + "linktype": "interface", + "name": "BezierEasingOptions", + "coveragePercent": 0, + "coverageCount": "0/5", + "status": "low" + }, + { + "filePath": "projects/ng-gallery/src/lib/smooth-scroll/smooth-scroll.model.ts", + "type": "interface", + "linktype": "interface", + "name": "SmoothScrollStep", + "coveragePercent": 0, + "coverageCount": "0/11", + "status": "low" + }, + { + "filePath": "projects/ng-gallery/src/lib/utils/gallery.default.ts", + "type": "variable", + "linktype": "miscellaneous", + "linksubtype": "variable", + "name": "defaultConfig", + "coveragePercent": 0, + "coverageCount": "0/1", + "status": "low" + }, + { + "filePath": "projects/ng-gallery/src/lib/utils/gallery.default.ts", + "type": "variable", + "linktype": "miscellaneous", + "linksubtype": "variable", + "name": "defaultState", + "coveragePercent": 100, + "coverageCount": "1/1", + "status": "very-good" + }, + { + "filePath": "projects/ng-gallery/src/lib/utils/img-manager.ts", + "type": "injectable", + "linktype": "injectable", + "name": "ImgManager", + "coveragePercent": 0, + "coverageCount": "0/6", + "status": "low" + }, + { + "filePath": "projects/ng-gallery/src/lib/utils/img-manager.ts", + "type": "interface", + "linktype": "interface", + "name": "ImageRegistry", + "coveragePercent": 0, + "coverageCount": "0/3", + "status": "low" + }, + { + "filePath": "projects/ng-gallery/src/lib/utils/img-recognizer.ts", + "type": "directive", + "linktype": "directive", + "name": "ImgRecognizer", + "coveragePercent": 0, + "coverageCount": "0/9", + "status": "low" + }, + { + "filePath": "projects/ng-gallery/src/lib/utils/resize-observer.ts", + "type": "function", + "linktype": "miscellaneous", + "linksubtype": "function", + "name": "resizeObservable", + "coveragePercent": 0, + "coverageCount": "0/1", + "status": "low" + }, + { + "filePath": "projects/ng-gallery/src/stories/basic/Gallery.stories.ts", + "type": "variable", + "linktype": "miscellaneous", + "linksubtype": "variable", + "name": "AutoHeightExample", + "coveragePercent": 0, + "coverageCount": "0/1", + "status": "low" + }, + { + "filePath": "projects/ng-gallery/src/stories/basic/Gallery.stories.ts", + "type": "variable", + "linktype": "miscellaneous", + "linksubtype": "variable", + "name": "AutoplayExample", + "coveragePercent": 0, + "coverageCount": "0/1", + "status": "low" + }, + { + "filePath": "projects/ng-gallery/src/stories/basic/Gallery.stories.ts", + "type": "variable", + "linktype": "miscellaneous", + "linksubtype": "variable", + "name": "BulletExample", + "coveragePercent": 0, + "coverageCount": "0/1", + "status": "low" + }, + { + "filePath": "projects/ng-gallery/src/stories/basic/Gallery.stories.ts", + "type": "variable", + "linktype": "miscellaneous", + "linksubtype": "variable", + "name": "CounterExample", + "coveragePercent": 0, + "coverageCount": "0/1", + "status": "low" + }, + { + "filePath": "projects/ng-gallery/src/stories/basic/Gallery.stories.ts", + "type": "variable", + "linktype": "miscellaneous", + "linksubtype": "variable", + "name": "ImageSizeExample", + "coveragePercent": 0, + "coverageCount": "0/1", + "status": "low" + }, + { + "filePath": "projects/ng-gallery/src/stories/basic/Gallery.stories.ts", + "type": "variable", + "linktype": "miscellaneous", + "linksubtype": "variable", + "name": "ItemAutosizeExample", + "coveragePercent": 0, + "coverageCount": "0/1", + "status": "low" + }, + { + "filePath": "projects/ng-gallery/src/stories/basic/Gallery.stories.ts", + "type": "variable", + "linktype": "miscellaneous", + "linksubtype": "variable", + "name": "Lab", + "coveragePercent": 100, + "coverageCount": "1/1", + "status": "very-good" + }, + { + "filePath": "projects/ng-gallery/src/stories/basic/Gallery.stories.ts", + "type": "variable", + "linktype": "miscellaneous", + "linksubtype": "variable", + "name": "meta", + "coveragePercent": 0, + "coverageCount": "0/1", + "status": "low" + }, + { + "filePath": "projects/ng-gallery/src/stories/basic/Gallery.stories.ts", + "type": "variable", + "linktype": "miscellaneous", + "linksubtype": "variable", + "name": "NavExample", + "coveragePercent": 0, + "coverageCount": "0/1", + "status": "low" + }, + { + "filePath": "projects/ng-gallery/src/stories/basic/Gallery.stories.ts", + "type": "variable", + "linktype": "miscellaneous", + "linksubtype": "variable", + "name": "NavWithLoopExample", + "coveragePercent": 0, + "coverageCount": "0/1", + "status": "low" + }, + { + "filePath": "projects/ng-gallery/src/stories/basic/Gallery.stories.ts", + "type": "variable", + "linktype": "miscellaneous", + "linksubtype": "variable", + "name": "SliderBehaviorExample", + "coveragePercent": 0, + "coverageCount": "0/1", + "status": "low" + }, + { + "filePath": "projects/ng-gallery/src/stories/basic/Gallery.stories.ts", + "type": "variable", + "linktype": "miscellaneous", + "linksubtype": "variable", + "name": "SliderDirectionExample", + "coveragePercent": 0, + "coverageCount": "0/1", + "status": "low" + }, + { + "filePath": "projects/ng-gallery/src/stories/basic/Gallery.stories.ts", + "type": "variable", + "linktype": "miscellaneous", + "linksubtype": "variable", + "name": "SliderExample", + "coveragePercent": 0, + "coverageCount": "0/1", + "status": "low" + }, + { + "filePath": "projects/ng-gallery/src/stories/basic/Gallery.stories.ts", + "type": "variable", + "linktype": "miscellaneous", + "linksubtype": "variable", + "name": "ThumbAutosizeExample", + "coveragePercent": 0, + "coverageCount": "0/1", + "status": "low" + }, + { + "filePath": "projects/ng-gallery/src/stories/basic/Gallery.stories.ts", + "type": "variable", + "linktype": "miscellaneous", + "linksubtype": "variable", + "name": "ThumbDetachedExample", + "coveragePercent": 0, + "coverageCount": "0/1", + "status": "low" + }, + { + "filePath": "projects/ng-gallery/src/stories/basic/Gallery.stories.ts", + "type": "variable", + "linktype": "miscellaneous", + "linksubtype": "variable", + "name": "ThumbPositionExample", + "coveragePercent": 0, + "coverageCount": "0/1", + "status": "low" + }, + { + "filePath": "projects/ng-gallery/src/stories/basic/Gallery.stories.ts", + "type": "variable", + "linktype": "miscellaneous", + "linksubtype": "variable", + "name": "ThumbViewExample", + "coveragePercent": 0, + "coverageCount": "0/1", + "status": "low" + }, + { + "filePath": "projects/ng-gallery/src/stories/custom-templates/CustomTemplates.stories.ts", + "type": "variable", + "linktype": "miscellaneous", + "linksubtype": "variable", + "name": "BoxTemplateExample", + "coveragePercent": 0, + "coverageCount": "0/1", + "status": "low" + }, + { + "filePath": "projects/ng-gallery/src/stories/custom-templates/CustomTemplates.stories.ts", + "type": "variable", + "linktype": "miscellaneous", + "linksubtype": "variable", + "name": "ImageTemplateExample", + "coveragePercent": 0, + "coverageCount": "0/1", + "status": "low" + }, + { + "filePath": "projects/ng-gallery/src/stories/custom-templates/CustomTemplates.stories.ts", + "type": "variable", + "linktype": "miscellaneous", + "linksubtype": "variable", + "name": "ItemTemplateExample", + "coveragePercent": 0, + "coverageCount": "0/1", + "status": "low" + }, + { + "filePath": "projects/ng-gallery/src/stories/custom-templates/CustomTemplates.stories.ts", + "type": "variable", + "linktype": "miscellaneous", + "linksubtype": "variable", + "name": "meta", + "coveragePercent": 0, + "coverageCount": "0/1", + "status": "low" + }, + { + "filePath": "projects/ng-gallery/src/stories/custom-templates/CustomTemplates.stories.ts", + "type": "variable", + "linktype": "miscellaneous", + "linksubtype": "variable", + "name": "ThumbTemplateExample", + "coveragePercent": 0, + "coverageCount": "0/1", + "status": "low" + }, + { + "filePath": "projects/ng-gallery/src/stories/custom-templates/custom-template.component.ts", + "type": "component", + "linktype": "component", + "name": "CustomTemplateComponent", + "coveragePercent": 50, + "coverageCount": "1/2", + "status": "medium" + }, + { + "filePath": "projects/ng-gallery/src/stories/lightbox/Lightbox.stories.ts", + "type": "variable", + "linktype": "miscellaneous", + "linksubtype": "variable", + "name": "GallerizeExample", + "coveragePercent": 0, + "coverageCount": "0/1", + "status": "low" + }, + { + "filePath": "projects/ng-gallery/src/stories/lightbox/Lightbox.stories.ts", + "type": "variable", + "linktype": "miscellaneous", + "linksubtype": "variable", + "name": "GallerizeGalleryExample", + "coveragePercent": 0, + "coverageCount": "0/1", + "status": "low" + }, + { + "filePath": "projects/ng-gallery/src/stories/lightbox/Lightbox.stories.ts", + "type": "variable", + "linktype": "miscellaneous", + "linksubtype": "variable", + "name": "LightboxExample", + "coveragePercent": 0, + "coverageCount": "0/1", + "status": "low" + }, + { + "filePath": "projects/ng-gallery/src/stories/lightbox/Lightbox.stories.ts", + "type": "variable", + "linktype": "miscellaneous", + "linksubtype": "variable", + "name": "meta", + "coveragePercent": 0, + "coverageCount": "0/1", + "status": "low" + }, + { + "filePath": "projects/ng-gallery/src/stories/lightbox/lightbox-example.ts", + "type": "component", + "linktype": "component", + "name": "LightboxExampleComponent", + "coveragePercent": 0, + "coverageCount": "0/9", + "status": "low" + }, + { + "filePath": "projects/ng-gallery/src/stories/pixabay/pixabay.model.ts", + "type": "interface", + "linktype": "interface", + "name": "Hit", + "coveragePercent": 0, + "coverageCount": "0/22", + "status": "low" + }, + { + "filePath": "projects/ng-gallery/src/stories/pixabay/pixabay.model.ts", + "type": "interface", + "linktype": "interface", + "name": "Hit2", + "coveragePercent": 0, + "coverageCount": "0/18", + "status": "low" + }, + { + "filePath": "projects/ng-gallery/src/stories/pixabay/pixabay.model.ts", + "type": "interface", + "linktype": "interface", + "name": "PixabayHDModel", + "coveragePercent": 0, + "coverageCount": "0/4", + "status": "low" + }, + { + "filePath": "projects/ng-gallery/src/stories/pixabay/pixabay.model.ts", + "type": "interface", + "linktype": "interface", + "name": "PixabayModel", + "coveragePercent": 0, + "coverageCount": "0/4", + "status": "low" + }, + { + "filePath": "projects/ng-gallery/src/stories/pixabay/pixabay.service.ts", + "type": "function", + "linktype": "miscellaneous", + "linksubtype": "function", + "name": "getHDImages", + "coveragePercent": 0, + "coverageCount": "0/1", + "status": "low" + }, + { + "filePath": "projects/ng-gallery/src/stories/pixabay/pixabay.service.ts", + "type": "function", + "linktype": "miscellaneous", + "linksubtype": "function", + "name": "getHDImagesForCustomTemplate", + "coveragePercent": 0, + "coverageCount": "0/1", + "status": "low" + }, + { + "filePath": "projects/ng-gallery/src/stories/pixabay/pixabay.service.ts", + "type": "variable", + "linktype": "miscellaneous", + "linksubtype": "variable", + "name": "API_KEY", + "coveragePercent": 0, + "coverageCount": "0/1", + "status": "low" + } + ] + } +} \ No newline at end of file diff --git a/projects/ng-gallery/lightbox/src/gallerize.directive.ts b/projects/ng-gallery/lightbox/src/gallerize.directive.ts index 6177e040..9ccec6dd 100644 --- a/projects/ng-gallery/lightbox/src/gallerize.directive.ts +++ b/projects/ng-gallery/lightbox/src/gallerize.directive.ts @@ -9,9 +9,8 @@ import { Host, NgZone, ElementRef, - PLATFORM_ID } from '@angular/core'; -import { DOCUMENT, isPlatformBrowser } from '@angular/common'; +import { DOCUMENT } from '@angular/common'; import { Gallery, GalleryRef, ImageItem, GalleryComponent, GalleryState, GalleryItem } from 'ng-gallery'; import { Subject, Subscription, from, tap, map, switchMap, finalize, debounceTime, EMPTY } from 'rxjs'; @@ -35,7 +34,7 @@ const enum GallerizeMode { export class GallerizeDirective implements OnInit, OnDestroy { /** Default gallery id */ - private _galleryId = 'lightbox'; + private _galleryId: string = 'lightbox'; /** Gallerize mode */ private readonly _mode: GallerizeMode; @@ -43,7 +42,7 @@ export class GallerizeDirective implements OnInit, OnDestroy { /** If host element is a HTMLElement, will use the following variables: */ /** Stream that emits to fire the detection stream the image elements has changed */ - private _observer$: any; + private _observer$: MutationObserver; /** Stream that emits when image is discover */ private _detector$: Subject; @@ -60,26 +59,23 @@ export class GallerizeDirective implements OnInit, OnDestroy { @Input() gallerize: string; /** The selector used to query images elements */ - @Input() selector = 'img'; + @Input() selector: string = 'img'; constructor(private _zone: NgZone, private _el: ElementRef, private _gallery: Gallery, private _lightbox: Lightbox, - @Inject(PLATFORM_ID) platform: Object, @Inject(DOCUMENT) private _document: any, @Host() @Self() @Optional() private _galleryCmp: GalleryComponent) { // Set gallerize mode - if (isPlatformBrowser(platform)) { - this._mode = _galleryCmp ? GallerizeMode.Gallery : GallerizeMode.Detector; - } + this._mode = _galleryCmp ? GallerizeMode.Gallery : GallerizeMode.Detector; } - ngOnInit() { + ngOnInit(): void { this._zone.runOutsideAngular(() => { this._galleryId = this.gallerize || this._galleryId; - const ref = this._gallery.ref(this._galleryId); + const ref: GalleryRef = this._gallery.ref(this._galleryId); switch (this._mode) { case GallerizeMode.Detector: @@ -91,7 +87,7 @@ export class GallerizeDirective implements OnInit, OnDestroy { }); } - ngOnDestroy() { + ngOnDestroy(): void { switch (this._mode) { case GallerizeMode.Detector: this._detector$.complete(); @@ -105,7 +101,7 @@ export class GallerizeDirective implements OnInit, OnDestroy { /** Gallery mode: means `gallerize` directive is used on `` component * Adds a click event to each gallery item so it opens in lightbox */ - private galleryMode(galleryRef: GalleryRef) { + private galleryMode(galleryRef: GalleryRef): void { // Clone its items to the new gallery instance this._itemClick$ = this._galleryCmp.galleryRef.itemClick.subscribe((i: number) => this._lightbox.open(i, this._galleryId)); this._itemChange$ = this._galleryCmp.galleryRef.itemsChanged.subscribe((state: GalleryState) => galleryRef.load(state.items)); @@ -113,7 +109,7 @@ export class GallerizeDirective implements OnInit, OnDestroy { /** Detector mode: means `gallerize` directive is used on a normal HTMLElement * Detects images and adds a click event to each image, so it opens in the lightbox */ - private detectorMode(galleryRef: GalleryRef) { + private detectorMode(galleryRef: GalleryRef): void { this._detector$ = new Subject(); // Query image elements this._detector$.pipe( diff --git a/projects/ng-gallery/package.json b/projects/ng-gallery/package.json index cf388ebc..daab11b3 100644 --- a/projects/ng-gallery/package.json +++ b/projects/ng-gallery/package.json @@ -1,6 +1,6 @@ { "name": "ng-gallery", - "version": "11.0.0", + "version": "12.0.0-beta.0", "homepage": "https://ngx-gallery.netlify.com/", "author": { "name": "Murhaf Sousli", diff --git a/projects/ng-gallery/src/lib/autoplay/autoplay.directive.ts b/projects/ng-gallery/src/lib/autoplay/autoplay.directive.ts new file mode 100644 index 00000000..a30c57da --- /dev/null +++ b/projects/ng-gallery/src/lib/autoplay/autoplay.directive.ts @@ -0,0 +1,72 @@ +import { Directive, Input, AfterViewInit, OnChanges, OnDestroy, SimpleChanges } from '@angular/core'; +import { Subscription, delay, of, switchMap, tap, EMPTY } from 'rxjs'; +import { ImgManager } from '../utils/img-manager'; +import { Gallery } from '../services/gallery.service'; +import { GalleryRef } from '../services/gallery-ref'; +import { GalleryState } from '../models/gallery.model'; +import { GalleryConfig } from '../models/config.model'; + +@Directive({ + selector: 'gallery-core[autoplay]', + standalone: true +}) +export class AutoplayDirective implements AfterViewInit, OnChanges, OnDestroy { + + private _currentSubscription: Subscription; + + private _galleryRef: GalleryRef; + + @Input() config: GalleryConfig; + + @Input() galleryId: string; + + constructor(private _gallery: Gallery, private _imgManager: ImgManager) { + } + + ngAfterViewInit(): void { + this._galleryRef = this._gallery.ref(this.galleryId); + this._subscribe(); + if (this.config.autoplay) { + this._galleryRef.play(); + } + } + + ngOnChanges(changes: SimpleChanges): void { + if (this._galleryRef && changes.config?.currentValue.autoplay !== changes.config?.previousValue.autoplay) { + this.config.autoplay ? this._galleryRef.play() : this._galleryRef.stop(); + } + } + + ngOnDestroy(): void { + this._unsubscribe(); + } + + + private _subscribe(): void { + this._unsubscribe(); + + this._currentSubscription = this._galleryRef.playingChanged.pipe( + switchMap((state: GalleryState) => { + if (state.isPlaying) { + return this._imgManager.getActiveItem(this._galleryRef.state).pipe( + switchMap(() => of({}).pipe( + delay(this.config.autoplayInterval), + tap(() => { + if (this._galleryRef.stateSnapshot.hasNext) { + this._galleryRef.next(this.config.scrollBehavior); + } else { + this._galleryRef.set(0, this.config.scrollBehavior); + } + }) + )) + ); + } + return EMPTY; + }) + ).subscribe(); + } + + private _unsubscribe(): void { + this._currentSubscription?.unsubscribe(); + } +} diff --git a/projects/ng-gallery/src/lib/components/adapters/base-adapter.ts b/projects/ng-gallery/src/lib/components/adapters/base-adapter.ts index ad6c719f..0fc529d6 100644 --- a/projects/ng-gallery/src/lib/components/adapters/base-adapter.ts +++ b/projects/ng-gallery/src/lib/components/adapters/base-adapter.ts @@ -1,16 +1,8 @@ -/** - * A clone of HammerJs constants - */ -export const DIRECTION_LEFT = 2; -export const DIRECTION_RIGHT = 4; -export const DIRECTION_UP = 8; -export const DIRECTION_DOWN = 16; +export abstract class SliderAdapter { -export abstract class BaseSliderAdapter { + readonly abstract hammerDirection: number; - abstract scrollSnapType: string; - - abstract panDirection: number; + readonly abstract scrollSnapType: string; abstract get scrollValue(): number; @@ -18,31 +10,21 @@ export abstract class BaseSliderAdapter { abstract get isContentLessThanContainer(): boolean; - abstract getPanValue(value: number, e: any, behavior: ScrollBehavior): ScrollToOptions; - abstract getScrollToValue(el: Element, behavior: ScrollBehavior): ScrollToOptions; abstract getCentralizerStartSize(): number; abstract getCentralizerEndSize(): number; -} - - -export abstract class ThumbSliderAdapter extends BaseSliderAdapter { - - abstract get thumbSize(): number; -} - -export abstract class SliderAdapter extends BaseSliderAdapter { + abstract getRootMargin(): string; - abstract get measureIndex(): number; + abstract getElementRootMargin(viewport: HTMLElement, el: HTMLElement): string; - abstract getClientSize(el: HTMLElement): number; + abstract getHammerVelocity(e): number; - abstract getOffsetSize(el: HTMLElement): number; + abstract getHammerValue(value: number, delta: number, behavior: ScrollBehavior): ScrollToOptions; - abstract getPanDelta(e: any): number; + // abstract getDraggingValue(value: number, delta: number, behavior: ScrollBehavior): ScrollToOptions; - abstract getPanVelocity(e: any): number; + // abstract getDraggingProperty(e: MouseEvent): number; } diff --git a/projects/ng-gallery/src/lib/components/adapters/common-adapter.ts b/projects/ng-gallery/src/lib/components/adapters/common-adapter.ts deleted file mode 100644 index bd3bb890..00000000 --- a/projects/ng-gallery/src/lib/components/adapters/common-adapter.ts +++ /dev/null @@ -1,56 +0,0 @@ -import { DIRECTION_DOWN, DIRECTION_LEFT, DIRECTION_RIGHT, DIRECTION_UP } from './base-adapter'; -import { GalleryConfig } from '../../models/config.model'; - -/** - * Common properties for both MainAdapter and ThumbAdapter - */ - -export class HorizontalCommonAdapter { - - readonly panDirection = DIRECTION_LEFT | DIRECTION_RIGHT; - - readonly scrollSnapType: string = 'x mandatory'; - - get scrollValue(): number { - return this.slider.scrollLeft; - } - - get clientSize(): number { - return this.slider.clientWidth; - } - - constructor(public slider: HTMLElement, public config: GalleryConfig) { - } - - getPanValue(value: number, e: any, behavior: ScrollBehavior): ScrollToOptions { - return { - behavior, - left: value - e.deltaX - }; - } -} - -export class VerticalCommonAdapter { - - readonly scrollSnapType: string = 'y mandatory'; - - readonly panDirection = DIRECTION_UP | DIRECTION_DOWN; - - get scrollValue(): number { - return this.slider.scrollTop; - } - - get clientSize(): number { - return this.slider.clientHeight; - } - - constructor(public slider: HTMLElement, public config: GalleryConfig) { - } - - getPanValue(value: number, e: any, behavior: ScrollBehavior): ScrollToOptions { - return { - behavior, - top: value - e.deltaY - }; - } -} diff --git a/projects/ng-gallery/src/lib/components/adapters/index.ts b/projects/ng-gallery/src/lib/components/adapters/index.ts index 5c52f26a..b20382ab 100644 --- a/projects/ng-gallery/src/lib/components/adapters/index.ts +++ b/projects/ng-gallery/src/lib/components/adapters/index.ts @@ -1,3 +1,2 @@ -export * from './thumb-adapters'; export * from './main-adapters'; export * from './base-adapter'; diff --git a/projects/ng-gallery/src/lib/components/adapters/main-adapters.ts b/projects/ng-gallery/src/lib/components/adapters/main-adapters.ts index 092fefb8..6cc804ba 100644 --- a/projects/ng-gallery/src/lib/components/adapters/main-adapters.ts +++ b/projects/ng-gallery/src/lib/components/adapters/main-adapters.ts @@ -1,50 +1,50 @@ import { GalleryConfig } from '../../models/config.model'; import { SliderAdapter } from './base-adapter'; -import { HorizontalCommonAdapter, VerticalCommonAdapter } from './common-adapter'; -import { SmoothScrollToOptions } from '../../smooth-scroll'; +import { SmoothScrollOptions } from '../../smooth-scroll'; -export class HorizontalAdapter extends HorizontalCommonAdapter implements SliderAdapter { +declare const Hammer: any; - get measureIndex(): number { - return this.slider.scrollLeft / this.slider.clientWidth; - } +export class HorizontalAdapter implements SliderAdapter { - get isContentLessThanContainer(): boolean { - return this.slider.clientWidth >= this.slider.firstElementChild.clientWidth; + readonly hammerDirection: number = Hammer?.DIRECTION_HORIZONTAL; + + readonly scrollSnapType: string = 'x mandatory'; + + get scrollValue(): number { + return this.slider.scrollLeft; } - constructor(public slider: HTMLElement, public config: GalleryConfig) { - super(slider, config); + get clientSize(): number { + return this.slider.clientWidth; } - getClientSize(el: HTMLElement): number { - return el.clientWidth; + get isContentLessThanContainer(): boolean { + return this.clientSize >= this.slider.firstElementChild.clientWidth; } - getOffsetSize(el: HTMLElement): number { - return el.offsetLeft; + constructor(public slider: HTMLElement, public config: GalleryConfig) { } - getScrollToValue(el: HTMLElement, behavior: ScrollBehavior): SmoothScrollToOptions { - const position = el.offsetLeft - ((this.clientSize - el.clientWidth) / 2); + getScrollToValue(el: HTMLElement, behavior: ScrollBehavior): SmoothScrollOptions { + const position: number = el.offsetLeft - ((this.clientSize - el.clientWidth) / 2); return { - start: position, - duration: behavior === 'smooth' ? this.config.slidingDuration : 0, - easing: this.config.slidingEase + behavior, + start: position }; } - getPanDelta(e): number { - return e.deltaX; + getRootMargin(): string { + return `1000px 1px 1000px 1px`; } - getPanVelocity(e): number { - return e.velocityX; + getElementRootMargin(viewport: HTMLElement, el: HTMLElement): string { + const rootMargin: number = -1 * ((viewport.clientWidth - el.clientWidth) / 2) + 1; + return `0px ${ rootMargin }px 0px ${ rootMargin }px`; } getCentralizerStartSize(): number { if (this.isContentLessThanContainer) { - const size = this.clientSize - this.slider.firstElementChild.clientWidth; + const size: number = this.clientSize - this.slider.firstElementChild.clientWidth; return size / 2; } return (this.clientSize / 2) - (this.slider.firstElementChild.firstElementChild?.clientWidth / 2); @@ -52,50 +52,71 @@ export class HorizontalAdapter extends HorizontalCommonAdapter implements Slider getCentralizerEndSize(): number { if (this.isContentLessThanContainer) { - const size = this.clientSize - this.slider.firstElementChild.clientWidth; + const size: number = this.clientSize - this.slider.firstElementChild.clientWidth; return size / 2; } return (this.clientSize / 2) - (this.slider.firstElementChild.lastElementChild?.clientWidth / 2); } -} -export class VerticalAdapter extends VerticalCommonAdapter implements SliderAdapter { + getHammerVelocity(e: any): number { + return e.velocityX; + } - get measureIndex(): number { - return this.slider.scrollTop / this.slider.clientHeight; + getHammerValue(value: number, e: any, behavior: ScrollBehavior): ScrollToOptions { + return { + behavior, + left: value - e.deltaX + }; } - get isContentLessThanContainer(): boolean { - return this.slider.clientHeight >= this.slider.firstElementChild.clientHeight; + // getDraggingProperty(e: MouseEvent): number { + // return e.clientX; + // } + + // getDraggingValue(value: number, delta: number, behavior: ScrollBehavior): ScrollToOptions { + // return { + // behavior, + // left: value - delta + // }; + // } +} + +export class VerticalAdapter implements SliderAdapter { + + readonly hammerDirection: number = Hammer?.DIRECTION_VERTICAL; + + readonly scrollSnapType: string = 'y mandatory'; + + get scrollValue(): number { + return this.slider.scrollTop; } - constructor(public slider: HTMLElement, public config: GalleryConfig) { - super(slider, config); + get clientSize(): number { + return this.slider.clientHeight; } - getClientSize(el: HTMLElement): number { - return el.clientHeight; + get isContentLessThanContainer(): boolean { + return this.clientSize >= this.slider.firstElementChild.clientHeight; } - getOffsetSize(el: HTMLElement): number { - return el.offsetTop; + constructor(public slider: HTMLElement, public config: GalleryConfig) { } - getScrollToValue(el: HTMLElement, behavior: ScrollBehavior): SmoothScrollToOptions { - const position = el.offsetTop - ((this.clientSize - el.clientHeight) / 2); + getScrollToValue(el: HTMLElement, behavior: ScrollBehavior): SmoothScrollOptions { + const position: number = el.offsetTop - ((this.clientSize - el.clientHeight) / 2); return { - top: position, - duration: behavior === 'smooth' ? this.config.slidingDuration : 0, - easing: this.config.slidingEase + behavior, + top: position }; } - getPanDelta(e): number { - return e.deltaY; + getRootMargin(): string { + return `1px 1000px 1px 1000px`; } - getPanVelocity(e): number { - return e.velocityY; + getElementRootMargin(viewport: HTMLElement, el: HTMLElement): string { + const rootMargin: number = -1 * ((viewport.clientHeight - el.clientHeight) / 2) + 1; + return `${ rootMargin }px 0px ${ rootMargin }px 0px`; } getCentralizerStartSize(): number { @@ -113,4 +134,26 @@ export class VerticalAdapter extends VerticalCommonAdapter implements SliderAdap } return (this.clientSize / 2) - (this.slider.firstElementChild.lastElementChild?.clientHeight / 2); } + + getHammerVelocity(e: any): number { + return e.velocityY; + } + + getHammerValue(value: number, e: any, behavior: ScrollBehavior): ScrollToOptions { + return { + behavior, + top: value - e.deltaY + }; + } + + // getDraggingProperty(e: MouseEvent): number { + // return e.clientY; + // } + + // getDraggingValue(value: number, delta: number, behavior: ScrollBehavior): ScrollToOptions { + // return { + // behavior, + // top: value - delta + // }; + // } } diff --git a/projects/ng-gallery/src/lib/components/adapters/thumb-adapters.ts b/projects/ng-gallery/src/lib/components/adapters/thumb-adapters.ts deleted file mode 100644 index 031265f5..00000000 --- a/projects/ng-gallery/src/lib/components/adapters/thumb-adapters.ts +++ /dev/null @@ -1,110 +0,0 @@ -import { GalleryConfig } from '../../models/config.model'; -import { ThumbnailsView } from '../../models/constants'; -import { ThumbSliderAdapter } from './base-adapter'; -import { HorizontalCommonAdapter, VerticalCommonAdapter } from './common-adapter'; -import { SmoothScrollToOptions } from '../../smooth-scroll'; - - -export class HorizontalThumbAdapter extends HorizontalCommonAdapter implements ThumbSliderAdapter { - - get thumbSize(): number { - return this.config.thumbWidth; - } - - get isContentLessThanContainer(): boolean { - return this.slider.clientWidth >= this.slider.firstElementChild.clientWidth; - } - - constructor(public slider: HTMLElement, public config: GalleryConfig) { - super(slider, config); - } - - getCentralisedScrollToValue(el: HTMLElement, behavior: ScrollBehavior, thumbView: 'default' | 'contain'): SmoothScrollToOptions { - let position: number = el.offsetLeft; - if (thumbView === ThumbnailsView.Default) { - position -= (this.clientSize / 2) - (el.clientWidth / 2); - } - return { - start: position, - duration: behavior === 'smooth' ? this.config.slidingDuration : 0, - easing: this.config.slidingEase - }; - } - - getScrollToValue(el: HTMLElement, behavior: ScrollBehavior): SmoothScrollToOptions { - let position = el.offsetLeft - ((this.clientSize - el.clientWidth) / 2); - return { - start: position, - duration: behavior === 'smooth' ? this.config.slidingDuration : 0, - easing: this.config.slidingEase - }; - } - - getCentralizerStartSize(): number { - if (this.isContentLessThanContainer) { - const size = this.clientSize - this.slider.firstElementChild.clientWidth; - return size / 2; - } - return (this.clientSize / 2) - (this.slider.firstElementChild.firstElementChild?.clientWidth / 2); - } - - getCentralizerEndSize(): number { - if (this.isContentLessThanContainer) { - const size = this.clientSize - this.slider.firstElementChild.clientWidth; - return size / 2; - } - return (this.clientSize / 2) - (this.slider.firstElementChild.lastElementChild?.clientWidth / 2); - } -} - -export class VerticalThumbAdapter extends VerticalCommonAdapter implements ThumbSliderAdapter { - - get thumbSize(): number { - return this.config.thumbHeight; - } - - get isContentLessThanContainer(): boolean { - return this.slider.clientHeight >= this.slider.firstElementChild.clientHeight; - } - - constructor(public slider: HTMLElement, public config: GalleryConfig) { - super(slider, config); - } - - getCentralisedScrollToValue(el: HTMLElement, behavior: ScrollBehavior, thumbView: 'default' | 'contain'): SmoothScrollToOptions { - let position: number = el.offsetTop; - if (thumbView === ThumbnailsView.Default) { - position -= (this.clientSize / 2) - (el.clientHeight / 2); - } - return { - top: position, - duration: behavior === 'smooth' ? this.config.slidingDuration : 0, - easing: this.config.slidingEase - }; - } - - getScrollToValue(el: HTMLElement, behavior: ScrollBehavior): SmoothScrollToOptions { - const position = el.offsetTop - ((this.clientSize - el.clientHeight) / 2); - return { - top: position, - duration: behavior === 'smooth' ? this.config.slidingDuration : 0, - easing: this.config.slidingEase - }; - } - - getCentralizerStartSize(): number { - if (this.isContentLessThanContainer) { - const size = this.clientSize - this.slider.firstElementChild.clientHeight; - return size / 2; - } - return (this.clientSize / 2) - (this.slider.firstElementChild.firstElementChild?.clientHeight / 2); - } - - getCentralizerEndSize(): number { - if (this.isContentLessThanContainer) { - const size = this.clientSize - this.slider.firstElementChild.clientHeight; - return size / 2; - } - return (this.clientSize / 2) - (this.slider.firstElementChild.lastElementChild?.clientHeight / 2); - } -} diff --git a/projects/ng-gallery/src/lib/components/gallery-dots.component.ts b/projects/ng-gallery/src/lib/components/gallery-bullets.component.ts similarity index 60% rename from projects/ng-gallery/src/lib/components/gallery-dots.component.ts rename to projects/ng-gallery/src/lib/components/gallery-bullets.component.ts index 7ec73643..88358a34 100644 --- a/projects/ng-gallery/src/lib/components/gallery-dots.component.ts +++ b/projects/ng-gallery/src/lib/components/gallery-bullets.component.ts @@ -5,22 +5,24 @@ import { GalleryState } from '../models/gallery.model'; import { GalleryConfig } from '../models/config.model'; @Component({ - selector: 'gallery-dots', + selector: 'gallery-bullets', changeDetection: ChangeDetectionStrategy.OnPush, + styleUrls: ['./gallery-bullets.scss'], template: ` -
                                                                                                                                  -
                                                                                                                                  + [class.g-bullet-active]="i === state.currIndex" + [style.width.px]="config?.bulletSize" + [style.height.px]="config?.bulletSize" + (click)="config.disableBullets ? null : gallery.ref(this.galleryId).set(i)"> +
                                                                                                                                  `, standalone: true, imports: [CommonModule] }) -export class GalleryDotsComponent { +export class GalleryBulletsComponent { + @Input() galleryId: string; @Input() state: GalleryState; @Input() config: GalleryConfig; diff --git a/projects/ng-gallery/src/lib/components/gallery-bullets.scss b/projects/ng-gallery/src/lib/components/gallery-bullets.scss new file mode 100644 index 00000000..1b728cfe --- /dev/null +++ b/projects/ng-gallery/src/lib/components/gallery-bullets.scss @@ -0,0 +1,40 @@ +:host { + position: absolute; + left: 50%; + z-index: 99; + transform: translateX(-50%); + display: flex; + gap: 6px; + top: var(--bullets-top); + bottom: var(--bullets-bottom); +} + +:host, +.g-bullet, +.g-bullet-inner { + display: flex; + justify-content: center; + align-items: center; +} + +.g-bullet { + cursor: var(--bullets-cursor); + z-index: 20; + + &:hover .g-bullet-inner { + opacity: var(--bullets-hover-opacity); + } +} + +.g-bullet-active .g-bullet-inner { + opacity: var(--bullets-active-opacity); +} + +.g-bullet-inner { + background-color: var(--g-overlay-color); + opacity: var(--bullets-opacity); + width: 100%; + height: 100%; + border-radius: 50%; + transition: opacity linear 150ms; +} diff --git a/projects/ng-gallery/src/lib/components/gallery-core.component.ts b/projects/ng-gallery/src/lib/components/gallery-core.component.ts index 9bee6938..9e7a646d 100644 --- a/projects/ng-gallery/src/lib/components/gallery-core.component.ts +++ b/projects/ng-gallery/src/lib/components/gallery-core.component.ts @@ -1,7 +1,19 @@ -import { Component, Input, Output, HostBinding, ChangeDetectionStrategy, EventEmitter } from '@angular/core'; +import { + Component, + Input, + Output, + HostBinding, + EventEmitter, + OnChanges, + SimpleChanges, + ElementRef, + ChangeDetectionStrategy +} from '@angular/core'; import { CommonModule } from '@angular/common'; +import { coerceCssPixelValue } from '@angular/cdk/coercion'; +import { Direction, Directionality } from '@angular/cdk/bidi'; import { GalleryCounterComponent } from './gallery-counter.component'; -import { GalleryDotsComponent } from './gallery-dots.component'; +import { GalleryBulletsComponent } from './gallery-bullets.component'; import { GalleryNavComponent } from './gallery-nav.component'; import { GallerySliderComponent } from './gallery-slider.component'; import { GalleryThumbsComponent } from './gallery-thumbs.component'; @@ -11,16 +23,18 @@ import { GalleryConfig } from '../models/config.model'; @Component({ selector: 'gallery-core', changeDetection: ChangeDetectionStrategy.OnPush, + styleUrls: ['./gallery-core.scss', '../styles/debug.scss'], template: ` - - + (error)="error.emit($event)"/>
                                                                                                                                  - - + [galleryId]="galleryId"/> - - + - + [state]="state"/>
                                                                                                                                  - +
                                                                                                                                  `, standalone: true, - imports: [CommonModule, GalleryThumbsComponent, GallerySliderComponent, GalleryNavComponent, GalleryDotsComponent, GalleryCounterComponent] + imports: [CommonModule, GalleryThumbsComponent, GallerySliderComponent, GalleryNavComponent, GalleryBulletsComponent, GalleryCounterComponent] }) -export class GalleryCoreComponent { +export class GalleryCoreComponent implements OnChanges { @Input() galleryId: string; @Input() state: GalleryState; @Input() config: GalleryConfig; - @Output() itemClick = new EventEmitter(); - @Output() thumbClick = new EventEmitter(); - @Output() error = new EventEmitter(); + @Output() itemClick: EventEmitter = new EventEmitter(); + @Output() thumbClick: EventEmitter = new EventEmitter(); + @Output() error: EventEmitter = new EventEmitter(); /** Set thumbnails position */ @HostBinding('attr.thumbPosition') get thumbPosition(): 'top' | 'left' | 'right' | 'bottom' { @@ -67,61 +79,86 @@ export class GalleryCoreComponent { } /** Set sliding direction */ - @HostBinding('attr.slidingDirection') get slidingDirection(): 'horizontal' | 'vertical' { - return this.config.slidingDirection; + @HostBinding('attr.orientation') get orientation(): 'horizontal' | 'vertical' { + return this.config.orientation; + } + + /** Disable thumbnails' clicks */ + @HostBinding('attr.thumbDisabled') get disableThumb(): boolean { + return this.config.disableThumbs; } - /** Disable thumbnails clicks */ - @HostBinding('attr.disableThumb') get disableThumb(): boolean { - return this.config.disableThumb; + /** Set bullets' clicks */ + @HostBinding('attr.bulletDisabled') get bulletDisabled(): boolean { + return this.config.disableBullets; } - /** Set gallery image size */ + /** Set gallery bullets position */ + @HostBinding('attr.bulletPosition') get bulletPosition(): 'top' | 'bottom' { + return this.config.bulletPosition; + } + + /** Set gallery image size property */ @HostBinding('attr.imageSize') get imageSize(): 'cover' | 'contain' { return this.config.imageSize; } + /** Set gallery thumb image size property */ @HostBinding('attr.thumbImageSize') get thumbImageSize(): 'contain' | 'cover' { return this.config.thumbImageSize; } - /** Set gallery dots position */ - @HostBinding('attr.dotsPosition') get dotsPosition(): 'top' | 'bottom' { - return this.config.dotsPosition; - } - /** Set gallery counter position */ @HostBinding('attr.counterPosition') get counterPosition(): 'top' | 'bottom' { return this.config.counterPosition; } - /** Set gallery counter position */ - @HostBinding('attr.slidingDisabled') get slidingDisabled(): boolean { - return this.config.slidingDisabled; + /** Disable sliding using sliding via touchpad, mousewheel and gestures */ + @HostBinding('attr.scrollDisabled') get scrollDisabled(): boolean { + return this.config.disableScroll; } - /** Set gallery counter position */ - @HostBinding('attr.thumbSlidingDisabled') get thumbSlidingDisabled(): boolean { - return this.config.thumbSlidingDisabled; + /** Disable thumb sliding using sliding via touchpad, mousewheel and gestures */ + @HostBinding('attr.thumbScrollDisabled') get thumbScrollDisabled(): boolean { + return this.config.disableThumbScroll; } - /** Set gallery slider itemAutosize style */ + /** Set items autosize styles */ @HostBinding('attr.itemAutosize') get itemAutosize(): boolean { return this.config.itemAutosize; } - /** Set gallery slider autoHeight style */ + /** Set gallery autoHeight styles */ @HostBinding('attr.autoHeight') get autoHeight(): boolean { return this.config.autoHeight; } - /** Set gallery slider thumbAutosize style */ + /** Set gallery thumb autosize styles */ @HostBinding('attr.thumbAutosize') get thumbAutosize(): boolean { return this.config.thumbAutosize; } + /** Set direction */ + @HostBinding('attr.dir') get direction(): Direction { + return this.dir.value; + } + /** Set debug style */ @HostBinding('attr.debug') get debug(): boolean { return this.config.debug; } + + constructor(private el: ElementRef, private dir: Directionality) { + } + + ngOnChanges(changes: SimpleChanges): void { + if (changes.config) { + if (changes.config.currentValue?.thumbWidth !== changes.config.previousValue?.thumbWidth) { + this.el.nativeElement.style.setProperty('--g-thumb-width', coerceCssPixelValue(changes.config.currentValue.thumbWidth)); + } + if (changes.config.currentValue?.thumbHeight !== changes.config.previousValue?.thumbHeight) { + this.el.nativeElement.style.setProperty('--g-thumb-height', coerceCssPixelValue(changes.config.currentValue.thumbHeight)); + } + } + } } diff --git a/projects/ng-gallery/src/lib/components/gallery-core.scss b/projects/ng-gallery/src/lib/components/gallery-core.scss new file mode 100644 index 00000000..df1257a5 --- /dev/null +++ b/projects/ng-gallery/src/lib/components/gallery-core.scss @@ -0,0 +1,219 @@ +:host { + position: relative; + overflow: hidden; + display: flex; + gap: var(--g-gutter-size); + width: 100%; + height: 500px; + min-height: 100%; + max-height: 100%; + + &[thumbPosition='top'] { + flex-direction: column; + } + + &[thumbPosition='left'] { + flex-direction: row; + } + + &[thumbPosition='right'] { + flex-direction: row-reverse; + } + + &[thumbPosition='bottom'] { + flex-direction: column-reverse; + } + + // Gallery auto-height variables + &[autoHeight='true'][itemAutoSize='false'][orientation='horizontal'] { + &[thumbPosition='top'], &[thumbPosition='bottom'] { + // if auto-height, use fit-content + height: fit-content; + --g-item-height: auto !important; + --g-item-max-height: auto; + } + } + + // Gallery image variables + --image-object-fit: unset; + + &[imageSize='contain'] gallery-slider, + &[thumbImageSize='contain'] gallery-thumbs { + --image-object-fit: contain; + } + + &[imageSize='cover'] gallery-slider, + &[thumbImageSize='cover'] gallery-thumbs { + --image-object-fit: cover; + } + + // Gallery thumbs variables + --slider-thumb-height: unset; + --slider-thumb-width: unset; + --thumb-slider-left: unset; + --thumb-slider-overflow: unset; + --thumb-slider-flex-direction: unset; + --g-thumb-width: unset; + --g-thumb-height: unset; + --g-thumb-cursor: pointer; + + &[thumbPosition='top'], + &[thumbPosition='bottom'] { + --thumb-slider-top: 0; + --thumb-slider-overflow: auto hidden; + --thumb-slider-flex-direction: row; + --g-thumb-height: 100%; + + &[thumbAutosize="true"] { + --g-thumb-width: auto !important; + } + } + + &[thumbPosition='left'], + &[thumbPosition='right'] { + --thumb-slider-left: 0; + --thumb-slider-overflow: hidden auto; + --thumb-slider-flex-direction: column; + --g-thumb-width: 100%; + + &[thumbAutosize="true"] { + --g-thumb-height: auto !important; + } + } + + &[thumbDisbled='true'] { + --g-thumb-cursor: default; + } + + &[thumbScrollDisabled='true'] { + --thumb-slider-overflow: hidden !important; + } + + // Gallery slider variables + --slider-scroll-snap-type: unset; + --slider-overflow: unset; + --slider-flex-direction: unset; + --slider-width: unset; + --slider-height: unset; + --slider-content-width: unset; + --slider-content-height: unset; + + &[orientation='horizontal'] { + --slider-overflow: auto hidden; + --slider-scroll-snap-type: x mandatory; + --slider-flex-direction: row; + --slider-content-height: 100%; + } + + &[orientation='vertical'] { + --slider-overflow: hidden auto; + --slider-scroll-snap-type: y mandatory; + --slider-flex-direction: column; + --slider-content-width: 100%; + } + + &[scrollDisabled='true'] { + --slider-overflow: hidden !important; + } + + // Gallery items variables + --g-item-width: unset; + --g-item-height: unset; + --g-item-max-height: var(--slider-height); + + &[orientation='horizontal'] { + --g-item-width: var(--slider-width); + --g-item-height: 100%; + + &[itemAutoSize='true'] { + --g-item-width: auto; + } + } + + &[orientation='vertical'] { + --g-item-width: 100%; + --g-item-height: var(--slider-height); + + &[itemAutoSize='true'] { + --g-item-height: auto; + } + } + + // Gallery bullets variables + --bullets-top: unset; + --bullets-bottom: unset; + --bullets-cursor: pointer; + --bullets-opacity: 0.4; + --bullets-hover-opacity: 1; + --bullets-active-opacity: 1; + + &[bulletPosition='top'] { + --bullets-top: 15px; + } + + &[bulletPosition='bottom'] { + --bullets-bottom: 15px; + } + + &[bulletDisabled='true'] { + --bullets-cursor: default; + --bullets-hover-opacity: var(--bullets-opacity); + } + + // Gallery position variables + --counter-top: unset; + --counter-bottom: unset; + --counter-border-radius: unset; + + &[counterPosition='top'] { + --counter-top: 0; + --counter-border-radius: 0 0 4px 4px; + } + + &[counterPosition='bottom'] { + --counter-bottom: 0; + --counter-border-radius: 4px 4px 0 0; + } + + // Gallery nav variables + --nav-space: 8px; + --nav-hover-space: 6.4px; + --nav-next-right: unset; + --nav-next-hover-right: unset; + --nav-next-left: unset; + --nav-next-hover-left: unset; + + &[dir='ltr'] { + --nav-next-transform: translateY(-50%) perspective(1px); + --nav-next-right: var(--nav-space); + --nav-next-hover-right: var(--nav-hover-space); + + --nav-prev-transform: translateY(-50%) perspective(1px) scale(-1, -1); + --nav-prev-left: var(--nav-space); + --nav-prev-hover-left: var(--nav-hover-space); + } + + &[dir='rtl'] { + --nav-next-transform: translateY(-50%) perspective(1px) scale(-1, -1); + --nav-next-left: var(--nav-space); + --nav-next-hover-left: var(--nav-hover-space); + + --nav-prev-transform: translateY(-50%) perspective(1px); + --nav-prev-right: var(--nav-space); + --nav-prev-hover-right: var(--nav-hover-space); + } +} + +.g-box { + overflow: hidden; + position: relative; + display: flex; + flex-direction: column; + order: 1; + flex: 1; +} + +.g-box-template { + position: absolute; + z-index: 10; +} diff --git a/projects/ng-gallery/src/lib/components/gallery-counter.component.ts b/projects/ng-gallery/src/lib/components/gallery-counter.component.ts index b486746b..b828d031 100644 --- a/projects/ng-gallery/src/lib/components/gallery-counter.component.ts +++ b/projects/ng-gallery/src/lib/components/gallery-counter.component.ts @@ -2,8 +2,9 @@ import { Component, Input, ChangeDetectionStrategy } from '@angular/core'; import { GalleryState } from '../models/gallery.model'; @Component({ - selector: 'gallery-counter', + selector: 'gallery-counter', changeDetection: ChangeDetectionStrategy.OnPush, + styleUrls: ['./gallery-counter.scss'], template: `
                                                                                                                                  {{ (state.currIndex + 1) + ' / ' + state.items.length }}
                                                                                                                                  `, diff --git a/projects/ng-gallery/src/lib/components/gallery-counter.scss b/projects/ng-gallery/src/lib/components/gallery-counter.scss new file mode 100644 index 00000000..f5eadc11 --- /dev/null +++ b/projects/ng-gallery/src/lib/components/gallery-counter.scss @@ -0,0 +1,23 @@ +.g-counter { + font-weight: bold; + user-select: none; + opacity: 0.6; + transition: opacity linear 150ms; + z-index: 50; + position: absolute; + left: 50%; + transform: translateX(-50%) perspective(1px); + font-size: 12px; + padding: 4px 10px; + color: var(--g-font-color); + background-color: var(--g-overlay-color); + box-shadow: var(--g-box-shadow); + + top: var(--counter-top); + bottom: var(--counter-bottom); + border-radius: var(--counter-border-radius); + + &:hover { + opacity: 0.8; + } +} diff --git a/projects/ng-gallery/src/lib/components/gallery-item.component.ts b/projects/ng-gallery/src/lib/components/gallery-item.component.ts index 09f9e27f..e560dc7c 100644 --- a/projects/ng-gallery/src/lib/components/gallery-item.component.ts +++ b/projects/ng-gallery/src/lib/components/gallery-item.component.ts @@ -4,33 +4,33 @@ import { Input, Output, EventEmitter, - AfterViewChecked, ElementRef, - ChangeDetectorRef, + AfterViewInit, ChangeDetectionStrategy } from '@angular/core'; -import { Platform } from '@angular/cdk/platform'; import { CommonModule } from '@angular/common'; +import { BehaviorSubject } from 'rxjs'; import { GalleryItemContext } from '../directives/gallery-item-def.directive'; import { GalleryIframeComponent } from './templates/gallery-iframe.component'; import { GalleryVideoComponent } from './templates/gallery-video.component'; import { GalleryImageComponent } from './templates/gallery-image.component'; import { GalleryConfig } from '../models/config.model'; -import { LoadingStrategy, GalleryItemType, GalleryItemTypes, ThumbnailsPosition } from '../models/constants'; -import { GalleryItemData, ImageItemData, VideoItemData, YoutubeItemData } from './templates/items.model'; +import { GalleryItemType, GalleryItemTypes, LoadingStrategy } from '../models/constants'; +import { GalleryItemData, ImageItemData, ItemState, VideoItemData, YoutubeItemData } from './templates/items.model'; @Component({ selector: 'gallery-item', changeDetection: ChangeDetectionStrategy.OnPush, + styleUrls: ['./gallery-item.scss'], template: `
                                                                                                                                  @@ -69,12 +69,16 @@ import { GalleryItemData, ImageItemData, VideoItemData, YoutubeItemData } from ' standalone: true, imports: [CommonModule, GalleryImageComponent, GalleryVideoComponent, GalleryIframeComponent] }) -export class GalleryItemComponent implements AfterViewChecked { +export class GalleryItemComponent implements AfterViewInit { readonly Types = GalleryItemTypes; - /** A flag that ensure that the height was emitted after tbe image is loaded, used only for gallery image types */ - private imageLoadingState: 'IN_PROGRESS' | 'DONE' = 'IN_PROGRESS'; + /** A stream that indicates that the height was emitted after the image is loaded, used only for gallery image types */ + readonly state$: BehaviorSubject = new BehaviorSubject('loading'); + + /** A flag that indicates if the item is type of image, it can be a custom template by the user, + * The img recognizer directive will set it to true*/ + isItemContainImage: boolean; /** Gallery config */ @Input() config: GalleryConfig; @@ -95,7 +99,7 @@ export class GalleryItemComponent implements AfterViewChecked { @Input() data: GalleryItemData; /** Stream that emits when an error occurs */ - @Output() error = new EventEmitter(); + @Output() error: EventEmitter = new EventEmitter(); @HostBinding('class.g-active-item') get isActive(): boolean { return this.index === this.currIndex; @@ -105,8 +109,8 @@ export class GalleryItemComponent implements AfterViewChecked { return this.index; } - @HostBinding('attr.imageState') get imageState(): 'IN_PROGRESS' | 'DONE' { - return this.imageLoadingState; + @HostBinding('attr.itemState') get itemState(): ItemState { + return this.state$.value; } get imageContext(): GalleryItemContext { @@ -118,7 +122,7 @@ export class GalleryItemComponent implements AfterViewChecked { count: this.count, first: this.index === 0, last: this.index === this.count - 1 - } + }; } get itemContext(): GalleryItemContext { @@ -130,10 +134,10 @@ export class GalleryItemComponent implements AfterViewChecked { count: this.count, first: this.index === 0, last: this.index === this.count - 1 - } + }; } - get element(): HTMLElement { + get nativeElement(): HTMLElement { return this.el.nativeElement; } @@ -150,7 +154,7 @@ export class GalleryItemComponent implements AfterViewChecked { if (this.isActive && this.type === GalleryItemTypes.Youtube && (this.data as YoutubeItemData).autoplay) { autoplay = 1; } - const url = new URL(this.data.src as string); + const url: URL = new URL(this.data.src as string); url.search = new URLSearchParams({ wmode: 'transparent', ...(this.data as YoutubeItemData).params, @@ -178,61 +182,14 @@ export class GalleryItemComponent implements AfterViewChecked { return this.data; } - constructor(private el: ElementRef, private cd: ChangeDetectorRef, private _platform: Platform) { + constructor(private el: ElementRef) { } - ngAfterViewChecked(): void { - const height: number = this.getHeight(); - if (this._platform.isBrowser) { - this.element.style.setProperty('--g-item-width', `${ this.getWidth() }px`); - this.element.style.setProperty('--g-item-height', `${ height }px`); - } - if (this.currIndex === this.index) { - // Auto-height feature, only allowed when sliding direction is horizontal - const isThumbPositionHorizontal: boolean = - this.config.thumbPosition === ThumbnailsPosition.Top - || this.config.thumbPosition === ThumbnailsPosition.Bottom; - - if (this.config.autoHeight && height && isThumbPositionHorizontal) { - // Change slider height - this.element.parentElement.parentElement.style.height = `${ height }px`; - } - } - } - - onItemLoaded(): void { - if (this.imageLoadingState === 'IN_PROGRESS') { - this.imageLoadingState = 'DONE'; - // Detect changes to re-calculate item size - this.cd.detectChanges(); - } - } - - private getWidth(): number { - if (this.config.slidingDirection === 'horizontal') { - const firstElementChild: Element = this.element?.firstElementChild; - if (this.config.itemAutosize && this.imageLoadingState === 'DONE' && firstElementChild?.clientWidth) { - return firstElementChild.clientWidth; - } - } - return this.element.parentElement.parentElement.clientWidth; - } - - private getHeight(): number { - const firstElementChild: Element = this.element.firstElementChild; - if (firstElementChild) { - if (this.config.autoHeight) { - if (this.imageLoadingState === 'DONE' && firstElementChild.clientHeight) { - return firstElementChild.clientHeight; - } - } - if (this.config.slidingDirection === 'vertical') { - if (this.config.itemAutosize && this.imageLoadingState === 'DONE' && firstElementChild.clientHeight) { - return firstElementChild.clientHeight; - } - } + ngAfterViewInit(): void { + // If item does not contain an image, then set the state to DONE + if (!this.isItemContainImage) { + this.state$.next('success'); } - return this.element.parentElement.parentElement.clientHeight; } } diff --git a/projects/ng-gallery/src/lib/components/gallery-item.scss b/projects/ng-gallery/src/lib/components/gallery-item.scss new file mode 100644 index 00000000..7b3c7564 --- /dev/null +++ b/projects/ng-gallery/src/lib/components/gallery-item.scss @@ -0,0 +1,55 @@ +:host { + cursor: var(--g-item-cursor); + height: var(--g-item-height); + width: var(--g-item-width); + max-height: var(--g-item-max-height); + max-width: var(--slider-width); + z-index: 10; + position: relative; + overflow: hidden; + display: flex; + flex-direction: column; + flex: 0 0 auto; + scroll-snap-align: center; + + // Disable highlighting the elements on mouse move or click + user-select: none; + -webkit-user-drag: none; + -webkit-tap-highlight-color: rgba(0, 0, 0, 0); + + // In itemAutoSize is true, item size will be zero until it is loaded, fallback to the slider size + &[itemState='loading'] { + width: var(--slider-width); + height: var(--slider-height); + } + + > * { + height: 100%; + } + + ::ng-deep { + video, iframe { + width: 100%; + height: 100%; + } + } +} + +gallery-image { + width: var(--g-item-width); + height: var(--g-item-height); +} + +.g-template { + position: absolute; + z-index: 10; + left: 0; + top: 0; + right: 0; + bottom: 0; + color: white; + display: flex; + align-items: center; + justify-content: center; + flex-direction: column; +} diff --git a/projects/ng-gallery/src/lib/components/gallery-nav.component.ts b/projects/ng-gallery/src/lib/components/gallery-nav.component.ts index 2549e070..ebce4ae7 100644 --- a/projects/ng-gallery/src/lib/components/gallery-nav.component.ts +++ b/projects/ng-gallery/src/lib/components/gallery-nav.component.ts @@ -1,6 +1,7 @@ -import { Component, OnInit, Input, ChangeDetectionStrategy } from '@angular/core'; +import { Component, Input, OnInit, ChangeDetectionStrategy } from '@angular/core'; import { CommonModule } from '@angular/common'; import { DomSanitizer, SafeHtml } from '@angular/platform-browser'; +import { Directionality } from '@angular/cdk/bidi'; import { Gallery } from '../services/gallery.service'; import { GalleryState } from '../models/gallery.model'; import { GalleryConfig } from '../models/config.model'; @@ -8,19 +9,20 @@ import { GalleryConfig } from '../models/config.model'; @Component({ selector: 'gallery-nav', changeDetection: ChangeDetectionStrategy.OnPush, + styleUrls: ['./gallery-nav.scss'], template: ` `, standalone: true, @@ -29,14 +31,22 @@ import { GalleryConfig } from '../models/config.model'; export class GalleryNavComponent implements OnInit { navIcon: SafeHtml; - @Input() galleryId: string; + @Input('galleryId') id: string; @Input() state: GalleryState; @Input() config: GalleryConfig; - constructor(public gallery: Gallery, private _sanitizer: DomSanitizer) { + constructor(public gallery: Gallery, private _sanitizer: DomSanitizer, public dir: Directionality) { } ngOnInit() { this.navIcon = this._sanitizer.bypassSecurityTrustHtml(this.config.navIcon); } + + rightButton() { + + } + + leftButton(): void { + + } } diff --git a/projects/ng-gallery/src/lib/components/gallery-nav.scss b/projects/ng-gallery/src/lib/components/gallery-nav.scss new file mode 100644 index 00000000..ff611ff4 --- /dev/null +++ b/projects/ng-gallery/src/lib/components/gallery-nav.scss @@ -0,0 +1,46 @@ +.g-nav-next, +.g-nav-prev { + position: absolute; + top: 50%; + display: flex; + padding: 16px 8px; + cursor: pointer; + z-index: 999; + opacity: 0.6; + transition: opacity linear 150ms, right linear 150ms, left linear 150ms; + + &:hover { + opacity: 1; + } + + ::ng-deep { + svg { + filter: var(--g-nav-drop-shadow); + width: 28px; + height: 28px; + fill: #fff; + } + } +} + +.g-nav-next { + left: var(--nav-next-left); + right: var(--nav-next-right); + transform: var(--nav-next-transform); + + &:hover { + left: var(--nav-next-hover-left); + right: var(--nav-next-hover-right); + } +} + +.g-nav-prev { + left: var(--nav-prev-left); + right: var(--nav-prev-right); + transform: var(--nav-prev-transform); + + &:hover { + left: var(--nav-prev-hover-left); + right: var(--nav-prev-hover-right); + } +} diff --git a/projects/ng-gallery/src/lib/components/gallery-slider.component.ts b/projects/ng-gallery/src/lib/components/gallery-slider.component.ts index 6a2f4226..fcccb073 100644 --- a/projects/ng-gallery/src/lib/components/gallery-slider.component.ts +++ b/projects/ng-gallery/src/lib/components/gallery-slider.component.ts @@ -2,66 +2,55 @@ import { Component, Input, Output, + ViewChild, + ViewChildren, EventEmitter, AfterViewInit, - AfterViewChecked, - OnDestroy, - OnInit, OnChanges, - ViewChild, - ViewChildren, SimpleChanges, - NgZone, ElementRef, QueryList, - ChangeDetectorRef, ChangeDetectionStrategy } from '@angular/core'; import { CommonModule } from '@angular/common'; -import { Platform } from '@angular/cdk/platform'; -import { - from, - distinctUntilChanged, - fromEvent, - mergeMap, - startWith, - tap, - debounceTime, - filter, - takeUntil, - switchMap, - Observable, - Subject, - Subscriber, - EMPTY, - animationFrameScheduler -} from 'rxjs'; +import { Observable, Subject, map, startWith } from 'rxjs'; import { Gallery } from '../services/gallery.service'; import { GalleryState, GalleryError } from '../models/gallery.model'; import { GalleryConfig } from '../models/config.model'; -import { SlidingDirection } from '../models/constants'; +import { Orientation } from '../models/constants'; import { SliderAdapter, HorizontalAdapter, VerticalAdapter } from './adapters'; -import { SmoothScrollManager } from '../smooth-scroll'; -import { resizeObservable } from '../utils/resize-observer'; +import { SmoothScroll, SmoothScrollOptions } from '../smooth-scroll'; +import { HammerSliding } from '../gestures/hammer-sliding.directive'; +import { SliderIntersectionObserver } from '../observers/slider-intersection-observer.directive'; +import { ItemIntersectionObserver } from '../observers/item-intersection-observer.directive'; import { GalleryItemComponent } from './gallery-item.component'; - -interface ScrollObserver { - value: number; - behavior: ScrollBehavior; - onEnd: Function; -} - -declare const Hammer: any; +import { SliderResizeObserver } from '../observers/slider-resize-observer.directive'; @Component({ selector: 'gallery-slider', changeDetection: ChangeDetectionStrategy.OnPush, + styleUrls: ['./gallery-slider.scss'], template: `
                                                                                                                                  + [attr.centralised]="config.itemAutosize" + [smoothScroll]="position$ | async" + [smoothScrollInterruptOnMousemove]="!config.disableMouseScroll" + sliderIntersectionObserver + [sliderIntersectionObserverDisabled]="isScrolling || isSliding || isResizing" + [hammerSliding]="!config.disableMouseScroll" + [adapter]="adapter" + [items]="items$ | async" + [config]="config" + [state]="state" + [galleryId]="galleryId" + (isScrollingChange)="isScrolling = $event" + (isSlidingChange)="isSliding = $event" + (activeIndexChange)="onActiveIndexChange($event)" + (isResizingChange)="isResizing = $event" + sliderResizeObserver>
                                                                                                                                  - - + (error)="error.emit({ itemIndex: i, error: $event })"/> +
                                                                                                                                  + +
                                                                                                                                  +
                                                                                                                                  RESIZING
                                                                                                                                  +
                                                                                                                                  SCROLLING
                                                                                                                                  +
                                                                                                                                  SLIDING
                                                                                                                                  `, standalone: true, - imports: [CommonModule, GalleryItemComponent] + imports: [CommonModule, GalleryItemComponent, SmoothScroll, HammerSliding, SliderIntersectionObserver, ItemIntersectionObserver, SliderResizeObserver] }) -export class GallerySliderComponent implements OnInit, OnChanges, AfterViewInit, AfterViewChecked, OnDestroy { - - readonly scrollHandler$: Subject = new Subject(); +export class GallerySliderComponent implements AfterViewInit, OnChanges { - /** HammerJS instance */ - private _hammer: any; + /** Stream that emits the slider position */ + readonly position$: Subject = new Subject(); - private intersectionObserver: IntersectionObserver; + /** Slider adapter */ + adapter: SliderAdapter; - private visibleElements: Map = new Map(); + /** Stream that emits the item components once they're initialized */ + items$: Observable; - private readonly _destroyed$ = new Subject(); + isScrolling: boolean; - private _isPanning: boolean; + isSliding: boolean; - /** Slider adapter */ - adapter: SliderAdapter; + isResizing: boolean; /** Gallery ID */ @Input() galleryId: string; @@ -107,332 +104,80 @@ export class GallerySliderComponent implements OnInit, OnChanges, AfterViewInit, @Input() config: GalleryConfig; /** Stream that emits when item is clicked */ - @Output() itemClick = new EventEmitter(); + @Output() itemClick: EventEmitter = new EventEmitter(); /** Stream that emits when an error occurs */ - @Output() error = new EventEmitter(); + @Output() error: EventEmitter = new EventEmitter(); + /** Slider ElementRef */ @ViewChild('slider', { static: true }) sliderEl: ElementRef; - @ViewChildren(GalleryItemComponent) items = new QueryList(); + @ViewChildren(GalleryItemComponent) items: QueryList = new QueryList(); get slider(): HTMLElement { return this.sliderEl.nativeElement; } - constructor(private _el: ElementRef, - private _cd: ChangeDetectorRef, - private _zone: NgZone, - private _platform: Platform, - private _smoothScroll: SmoothScrollManager, - private _gallery: Gallery) { - - this.scrollHandler$.pipe( - debounceTime(0, animationFrameScheduler), - switchMap(({ value, behavior }: ScrollObserver) => { - this._gallery.debugConsole('[Gallery scrollHandler$] ', this.slider.style.scrollSnapType); - this.slider.style.scrollSnapType = 'unset'; - const el: HTMLElement = this.items.get(value)?.element; - - this._gallery.debugConsole('🤯 [Gallery scrollHandler$] scrollSnapType = unset, scrollTo element', !!el); - if (el) { - this.slider.classList.add('g-scrolling'); - const pos = this.adapter.getScrollToValue(el, behavior || this.config.scrollBehavior); - const index: number = +this.items.get(value)?.element.getAttribute('galleryIndex'); - this._gallery.debugConsole(`🚀 [Gallery scrollHandler$] Scroll start ===> index: ${ index }, position:`, pos); - this._gallery.debugConsole(`🚀 [Gallery scrollHandler$] slider scrollable`, this.adapter.scrollValue); - - return from(this._smoothScroll.scrollTo(this.slider, pos)).pipe( - tap(() => { - // Reset viewport properties on scroll end - this._isPanning = false; - this.slider.classList.remove('g-scrolling'); - this.slider.style.scrollSnapType = this.adapter.scrollSnapType; - this._gallery.debugConsole('✅ [Gallery scrollHandler$] Scroll end'); - }) - ); - } - this._gallery.debugConsole('😡 [Gallery scrollHandler$] Scroll element was not found!'); - return EMPTY; - }), - takeUntil(this._destroyed$) - ).subscribe(); + constructor(private _gallery: Gallery) { } ngOnChanges(changes: SimpleChanges): void { if (changes.config) { - if (changes.config.currentValue?.slidingDirection !== changes.config.previousValue?.slidingDirection) { - switch (this.config.slidingDirection) { - case SlidingDirection.Horizontal: + if (changes.config.currentValue?.orientation !== changes.config.previousValue?.orientation) { + switch (this.config.orientation) { + case Orientation.Horizontal: this.adapter = new HorizontalAdapter(this.slider, this.config); break; - case SlidingDirection.Vertical: + case Orientation.Vertical: this.adapter = new VerticalAdapter(this.slider, this.config); break; } - if (this._platform.isBrowser) { - if (!changes.config.firstChange) { - requestAnimationFrame(() => { - // Keep the correct sliding position when direction changes - this.scrollToIndex(this.state.currIndex, 'auto'); - }); - } - // Reactivate gestures - this.enableDisableGestures(); - } } - - if (this._platform.isBrowser && !changes.config.firstChange) { - if (changes.config.currentValue?.mouseSlidingDisabled !== changes.config.previousValue?.mouseSlidingDisabled) { - this.enableDisableGestures(); - } + if (!changes.config.firstChange) { + // Keep the correct sliding position when direction changes + requestAnimationFrame(() => { + this.scrollToIndex(this.state.currIndex, 'auto'); + }); } } // Scroll to current index - if (this._platform.isBrowser && changes.state && changes.state.currentValue?.currIndex !== changes.state.previousValue?.currIndex) { - requestAnimationFrame(() => { - this.scrollToIndex(this.state.currIndex, changes.state.firstChange ? 'auto' : this.state.behavior); - }); - } - } - - ngOnInit(): void { - if (this._platform.isBrowser) { - this._zone.runOutsideAngular(() => { - // We need to set the visibleElements in the viewport using intersection observer - this.createIntersectionObserver(this.slider).pipe( - tap((entry: IntersectionObserverEntry) => { - entry.target.classList.toggle('g-item-visible', entry.isIntersecting); - if (entry.isIntersecting) { - this.visibleElements.set(entry.target, entry); - } else { - this.visibleElements.delete(entry.target); - } - }), - takeUntil(this._destroyed$) - ).subscribe(); - - // Subscribe to slider scroll event - fromEvent(this.slider, 'scroll', { passive: true }).pipe( - debounceTime(50), - filter(() => !this._isPanning), - tap(() => this.onViewportScroll()), - takeUntil(this._destroyed$) - ).subscribe(); - - // Detect if the size of the slider has changed detecting current index on scroll - resizeObservable(this._el.nativeElement).pipe( - debounceTime(this.config.resizeDebounceTime), - tap(([entry]: ResizeObserverEntry[]) => this.onHostResize(entry)), - takeUntil(this._destroyed$) - ).subscribe(); - }); + if (changes.state) { + if (changes.state.currentValue?.currIndex !== changes.state.previousValue?.currIndex) { + requestAnimationFrame(() => { + this.scrollToIndex(this.state.currIndex, changes.state.firstChange ? 'auto' : this.state.behavior); + }); + } } } ngAfterViewInit(): void { - if (this._platform.isBrowser) { - this.items.notifyOnChanges(); - this.items.changes.pipe( - startWith(null), - tap(() => { - // Disconnect all and reconnect later - this.visibleElements.forEach((item: IntersectionObserverEntry) => { - this.intersectionObserver.unobserve(item.target); - }); - - // Connect with the new items - this.items.toArray().map((item: GalleryItemComponent) => { - this.intersectionObserver.observe(item.element); - }); - }), - takeUntil(this._destroyed$) - ).subscribe(); - } - } - - ngAfterViewChecked(): void { - if (this.config.itemAutosize && this._platform.isBrowser) { - this.slider.style.setProperty('--slider-centralize-start-size', this.adapter.getCentralizerStartSize() + 'px'); - this.slider.style.setProperty('--slider-centralize-end-size', this.adapter.getCentralizerEndSize() + 'px'); - } - } - - ngOnDestroy(): void { - this._destroyed$.next(); - this._destroyed$.complete(); - this.deactivateGestures(); + this.items.notifyOnChanges(); + this.items$ = this.items.changes.pipe( + // In some cases, items is not notified at first, need to force start the stream + startWith(null), + map(() => this.items.toArray()) + ); } trackByFn(index: number, item: any) { return item.type; } - private onHostResize(entry: ResizeObserverEntry): void { - const width: number = Math.ceil(entry.contentRect.width); - const height: number = Math.ceil(entry.contentRect.height); - this.slider.style.width = `${ width }px`; - this.slider.style.height = `${ height }px`; - this.scrollToIndex(this.state.currIndex, 'auto'); - // Detect changes on gallery-item components to re-calculate item size - this._cd.detectChanges(); - this._gallery.debugConsole('🦐 [Gallery OnHostResize]: set viewport width to absolute number'); - } - - private onViewportScroll(): void { - // Check if scrolled item is great enough to navigate - const currElement: Element = this.items.get(this.state.currIndex)?.element; - const elementAtCenter: Element = this.getElementFromViewportCenter(); - - if (elementAtCenter) { - // Check if the gallery-item element is not the active element - if (elementAtCenter !== currElement) { - this.tryScrollToElement(elementAtCenter as HTMLElement); - } + onActiveIndexChange(index: number): void { + if (index === -1) { + // Reset active index position + this.scrollToIndex(this.state.currIndex, 'smooth'); } else { - this._gallery.debugConsole('⁉ [Gallery onViewportScroll]: No center element was found'); - this.visibleElements.forEach((entry: IntersectionObserverEntry) => { - this.tryScrollToElement(entry.target as HTMLElement); - }); + this._gallery.ref(this.galleryId).set(index, 'smooth'); } } - private tryScrollToElement(elementAtCenter: HTMLElement): void { - const allowedMargin: number = 10; - const offsetDiff: number = (this.adapter.clientSize - this.adapter.getClientSize(elementAtCenter)) / 2; - const rangeStart: number = this.adapter.scrollValue + offsetDiff; - const rangeEnd: number = this.adapter.scrollValue + this.adapter.clientSize - offsetDiff; - const elStart: number = this.adapter.getOffsetSize(elementAtCenter); - const elEnd: number = elStart + this.adapter.getClientSize(elementAtCenter); - - const isStart: boolean = rangeStart + allowedMargin >= elStart && rangeStart - allowedMargin <= elStart; - const isEnd: boolean = rangeEnd + allowedMargin >= elEnd && rangeEnd - allowedMargin <= elEnd; - - // Reset position - this.slider.style.scrollSnapType = this.adapter.scrollSnapType; - - // Check if element is within the detection range - if (isStart && isEnd) { - // If element is within the range set it as the active gallery item - this._gallery.debugConsole('🍄 [Gallery onViewportScroll]: Set active gallery item'); - - const index: number = +elementAtCenter.getAttribute('galleryIndex'); - this._zone.run(() => this._gallery.ref(this.galleryId).set(index, 'smooth')); - } - } - - private scrollToIndex(value: number, behavior: ScrollBehavior, onEnd?: () => void): void { - this.scrollHandler$.next({ value, behavior, onEnd }); - } - - private enableDisableGestures(): void { - // Enable/Disable mouse sliding on desktop browser only - if (!this._platform.IOS && !this._platform.ANDROID) { - if (!this.config.mouseSlidingDisabled) { - this.activateGestures(); - } else { - this.deactivateGestures(); - } - } - } - - private activateGestures(): void { - if (typeof Hammer !== 'undefined') { - // Destroy hammer if a previous instance was created - this.deactivateGestures(); - - const direction: number = this.adapter.panDirection; - - // Activate gestures - this._zone.runOutsideAngular(() => { - this._hammer = new Hammer(this._el.nativeElement, { inputClass: Hammer.MouseInput }); - this._hammer.get('pan').set({ direction }); - - let panOffset: number; - - // Set panOffset for sliding on pan start event - this._hammer.on('panstart', () => { - this._smoothScroll.dismissOngoingScroll(this.slider); - panOffset = this.adapter.scrollValue; - // Disable scroll-snap-type functionality - this.slider.style.scrollSnapType = 'unset'; - this.slider.classList.add('g-sliding'); - this._isPanning = true; - }); - - this._hammer.on('panmove', (e: any) => this.slider.scrollTo(this.adapter.getPanValue(panOffset, e, 'auto'))); - - this._hammer.on('panend', (e: any) => this.onPanEnd(e)); - }); + private scrollToIndex(index: number, behavior: ScrollBehavior): void { + const el: HTMLElement = this.items.get(index)?.nativeElement; + if (el) { + const pos: SmoothScrollOptions = this.adapter.getScrollToValue(el, behavior || this.config.scrollBehavior); + this.position$.next(pos); } } - - private deactivateGestures(): void { - this._hammer?.destroy(); - } - - protected onPanEnd(e): void { - - this._gallery.debugConsole('🖱️ [Gallery]: onPanEnd', e); - - this.slider.classList.remove('g-sliding'); - const delta: number = this.adapter.getPanDelta(e); - const velocity: number = this.adapter.getPanVelocity(e); - - const galleryRef = this._gallery.ref(this.galleryId); - - this._zone.run(() => { - // Check if scrolled item is great enough to navigate - const currElement: Element = this.items.get(this.state.currIndex)?.element; - - // Find the gallery item element in the center elements - const elementAtCenter: Element = this.getElementFromViewportCenter(); - - // Check if center item can be taken from element using - if (elementAtCenter && elementAtCenter !== currElement) { - const index: number = +elementAtCenter.getAttribute('galleryIndex'); - this.scrollToIndex(index, 'smooth'); - return; - } - - // Check if delta is great enough to navigate - if (Math.abs(delta) > (currElement.clientWidth || this.adapter.clientSize) / 2) { - return delta > 0 ? galleryRef.prev('smooth', false) : galleryRef.next('smooth', false); - } - - // Check if velocity is great enough to navigate - if (Math.abs(velocity) > 0.3) { - return velocity > 0 ? galleryRef.prev('smooth', false) : galleryRef.next('smooth', false); - } - - // Reset position to the current index - this.scrollToIndex(this.state.currIndex, 'smooth'); - }); - } - - private getElementFromViewportCenter(): Element { - // Get slider position relative to the document - const sliderRect = this.slider.getBoundingClientRect(); - // Try look for the center item using `elementsFromPoint` function - const centerElements = document.elementsFromPoint(sliderRect.x + (sliderRect.width / 2), sliderRect.y + (sliderRect.height / 2)); - // Find the gallery item element in the center elements - const element = centerElements.find((element: Element) => element.localName === 'gallery-item' && element.getAttribute('galleryId') === this.galleryId); - - this._gallery.debugConsole('🪟 [Gallery]: getElementFromViewportCenter', element); - return element; - } - - private createIntersectionObserver(slider: HTMLElement): Observable { - return new Observable((observer: Subscriber) => { - this.intersectionObserver = new IntersectionObserver( - (entries: IntersectionObserverEntry[]) => observer.next(entries), - { root: slider } - ); - return () => this.intersectionObserver.disconnect(); - }).pipe( - mergeMap((entries: IntersectionObserverEntry[]) => entries), - distinctUntilChanged(), - ); - } } diff --git a/projects/ng-gallery/src/lib/components/gallery-slider.scss b/projects/ng-gallery/src/lib/components/gallery-slider.scss new file mode 100644 index 00000000..02adaddb --- /dev/null +++ b/projects/ng-gallery/src/lib/components/gallery-slider.scss @@ -0,0 +1,62 @@ +:host { + position: relative; + display: flex; + align-items: center; + justify-content: center; + overflow: hidden; + order: 1; + flex: 1; +} + +.g-slider { + display: flex; + align-items: center; + transition: var(--g-height-transition); + min-height: 100%; + min-width: 100%; + max-height: 100%; + max-width: 100%; + height: var(--slider-height, 100%); + width: var(--slider-width, 100%); + + overflow: var(--slider-overflow); + scroll-snap-type: var(--slider-scroll-snap-type); + flex-direction: var(--slider-flex-direction); + + scrollbar-width: none; + + &::-webkit-scrollbar { + display: none; + } + + &.g-sliding, &.g-scrolling { + // Disable mouse click on gallery items/thumbnails when the slider is being dragged using the mouse + .g-slider-content { + pointer-events: none; + } + } + + &[centralised="true"] { + &:before, &:after { + content: ''; + } + + &:before { + flex: 0 0 var(--slider-centralize-start-size); + } + + &:after { + flex: 0 0 var(--slider-centralize-end-size); + } + } +} + +.g-slider-content { + flex: 0 0 auto; + display: flex; + align-items: center; + gap: 1px; + width: var(--slider-content-width, unset); + height: var(--slider-content-height, unset); + flex-direction: var(--slider-flex-direction); +} diff --git a/projects/ng-gallery/src/lib/components/gallery-thumb.component.ts b/projects/ng-gallery/src/lib/components/gallery-thumb.component.ts index 68978c83..cae58bff 100644 --- a/projects/ng-gallery/src/lib/components/gallery-thumb.component.ts +++ b/projects/ng-gallery/src/lib/components/gallery-thumb.component.ts @@ -1,4 +1,12 @@ -import { Component, Input, HostBinding, Output, EventEmitter, ChangeDetectionStrategy } from '@angular/core'; +import { + Component, + Input, + Output, + HostBinding, + EventEmitter, + ElementRef, + ChangeDetectionStrategy +} from '@angular/core'; import { CommonModule } from '@angular/common'; import { GalleryItemContext } from '../directives/gallery-item-def.directive'; import { GalleryImageComponent } from './templates/gallery-image.component'; @@ -9,6 +17,7 @@ import { GalleryItemType } from '../models/constants'; @Component({ selector: 'gallery-thumb', changeDetection: ChangeDetectionStrategy.OnPush, + styleUrls: ['./gallery-thumb.scss'], template: ` (); + @Output() error: EventEmitter = new EventEmitter(); @HostBinding('class.g-active-thumb') get isActive() { return this.index === this.currIndex; } + @HostBinding('attr.galleryIndex') get isIndexAttr(): number { + return this.index; + } + get imageContext(): GalleryItemContext { return { $implicit: this.data, @@ -60,4 +73,11 @@ export class GalleryThumbComponent { last: this.index === this.count - 1 } } + + get nativeElement(): HTMLElement { + return this.el.nativeElement; + } + + constructor(private el: ElementRef) { + } } diff --git a/projects/ng-gallery/src/lib/components/gallery-thumb.scss b/projects/ng-gallery/src/lib/components/gallery-thumb.scss new file mode 100644 index 00000000..2fb702bf --- /dev/null +++ b/projects/ng-gallery/src/lib/components/gallery-thumb.scss @@ -0,0 +1,39 @@ +:host { + cursor: var(--g-thumb-cursor); + height: var(--g-thumb-height); + width: var(--g-thumb-width); + max-height: var(--g-thumb-height); + max-width: var(--g-thumb-width); + align-self: center; + background: black; + position: relative; + display: flex; + overflow: hidden; + flex-direction: column; + flex: 0 0 auto; + scroll-snap-align: center; + // Disable highlighting the elements on mouse move or click + user-select: none; + -webkit-user-drag: none; + -webkit-tap-highlight-color: rgba(0, 0, 0, 0); + + --g-thumb-opacity: 0.5; + + &.g-active-thumb { + --g-thumb-opacity: 1; + } +} + +.g-template { + position: absolute; + z-index: 10; + left: 0; + top: 0; + right: 0; + bottom: 0; + color: white; + display: flex; + align-items: center; + justify-content: center; + flex-direction: column; +} diff --git a/projects/ng-gallery/src/lib/components/gallery-thumbs.component.ts b/projects/ng-gallery/src/lib/components/gallery-thumbs.component.ts index 22b2cf7b..4a8cdb0c 100644 --- a/projects/ng-gallery/src/lib/components/gallery-thumbs.component.ts +++ b/projects/ng-gallery/src/lib/components/gallery-thumbs.component.ts @@ -2,69 +2,75 @@ import { Component, Input, Output, - AfterViewInit, - AfterViewChecked, - OnDestroy, - OnChanges, ViewChild, ViewChildren, + EventEmitter, + AfterViewInit, + OnChanges, QueryList, SimpleChanges, - NgZone, ElementRef, - EventEmitter, - ChangeDetectorRef, ChangeDetectionStrategy } from '@angular/core'; import { CommonModule } from '@angular/common'; -import { Platform } from '@angular/cdk/platform'; -import { Subject, debounceTime, takeUntil, tap } from 'rxjs'; +import { Observable, Subject, map, startWith } from 'rxjs'; import { GalleryConfig } from '../models/config.model'; import { GalleryState, GalleryError } from '../models/gallery.model'; -import { ThumbnailsPosition, ThumbnailsView } from '../models/constants'; -import { ThumbSliderAdapter, HorizontalThumbAdapter, VerticalThumbAdapter } from './adapters'; -import { SmoothScrollManager } from '../smooth-scroll'; -import { resizeObservable } from '../utils/resize-observer'; +import { ThumbnailsPosition } from '../models/constants'; +import { VerticalAdapter, HorizontalAdapter, SliderAdapter } from './adapters'; +import { SmoothScroll, SmoothScrollOptions } from '../smooth-scroll'; import { GalleryThumbComponent } from './gallery-thumb.component'; - -declare const Hammer: any; +import { HammerSliding } from '../gestures/hammer-sliding.directive'; +import { ThumbResizeObserver } from '../observers/thumb-resize-observer.directive'; @Component({ selector: 'gallery-thumbs', changeDetection: ChangeDetectionStrategy.OnPush, + styleUrls: ['./gallery-thumbs.scss'], template: `
                                                                                                                                  + [smoothScroll]="position$ | async" + [smoothScrollInterruptOnMousemove]="!config.disableThumbMouseScroll" + [attr.centralised]="config.thumbCentralized || adapter.isContentLessThanContainer" + [hammerSliding]="!config.disableThumbMouseScroll" + [galleryId]="galleryId" + [items]="items$ | async" + [state]="state" + [config]="config" + [adapter]="adapter" + (thumbResizeObserver)="scrollToIndex(state.currIndex, 'auto')" + (activeIndexChange)="onActiveIndexChange($event)">
                                                                                                                                  - + (click)="config.disableThumbs ? null : thumbClick.emit(i)" + (error)="error.emit({ itemIndex: i, error: $event })"/>
                                                                                                                                  `, standalone: true, - imports: [CommonModule, GalleryThumbComponent] + imports: [CommonModule, GalleryThumbComponent, SmoothScroll, HammerSliding, ThumbResizeObserver] }) -export class GalleryThumbsComponent implements AfterViewInit, AfterViewChecked, OnChanges, OnDestroy { +export class GalleryThumbsComponent implements AfterViewInit, OnChanges { - /** HammerJS instance */ - private _hammer: any; + /** Stream that emits the slider position */ + readonly position$: Subject = new Subject(); - /** Thumbnails view enum */ - readonly thumbnailsView = ThumbnailsView; + /** Slider adapter */ + adapter: SliderAdapter; - private readonly _destroyed$ = new Subject(); + /** Stream that emits the thumb components once they're initialized */ + items$: Observable; - /** Slider adapter */ - adapter: ThumbSliderAdapter; + /** Gallery ID */ + @Input() galleryId: string; /** Gallery state */ @Input() state: GalleryState; @@ -73,27 +79,20 @@ export class GalleryThumbsComponent implements AfterViewInit, AfterViewChecked, @Input() config: GalleryConfig; /** Stream that emits when thumb is clicked */ - @Output() thumbClick = new EventEmitter(); + @Output() thumbClick: EventEmitter = new EventEmitter(); /** Stream that emits when an error occurs */ - @Output() error = new EventEmitter(); + @Output() error: EventEmitter = new EventEmitter(); /** Slider ElementRef */ @ViewChild('slider', { static: true }) sliderEl: ElementRef; - @ViewChildren(GalleryThumbComponent, { read: ElementRef }) items = new QueryList>(); + @ViewChildren(GalleryThumbComponent) items: QueryList = new QueryList(); get slider(): HTMLElement { return this.sliderEl.nativeElement; } - constructor(private _el: ElementRef, - private _zone: NgZone, - private _smoothScroll: SmoothScrollManager, - private _cd: ChangeDetectorRef, - private _platform: Platform) { - } - ngOnChanges(changes: SimpleChanges): void { if (changes.config) { // Sets sliding direction @@ -101,37 +100,24 @@ export class GalleryThumbsComponent implements AfterViewInit, AfterViewChecked, switch (this.config.thumbPosition) { case ThumbnailsPosition.Right: case ThumbnailsPosition.Left: - this.adapter = new VerticalThumbAdapter(this.slider, this.config); + this.adapter = new VerticalAdapter(this.slider, this.config); break; case ThumbnailsPosition.Top: case ThumbnailsPosition.Bottom: - this.adapter = new HorizontalThumbAdapter(this.slider, this.config); + this.adapter = new HorizontalAdapter(this.slider, this.config); break; } - if (this._platform.isBrowser) { - if (!changes.config.firstChange) { - // Keep the correct sliding position when direction changes - requestAnimationFrame(() => { - this.scrollToIndex(this.state.currIndex, 'auto'); - }); - } - - // Reactivate gestures - this.enableDisableGestures(); + if (!changes.config.firstChange) { + // Keep the correct sliding position when direction changes + requestAnimationFrame(() => { + this.scrollToIndex(this.state.currIndex, 'auto'); + }); } } - if (this._platform.isBrowser) { - if (!changes.config.firstChange && changes.config.currentValue?.thumbMouseSlidingDisabled !== changes.config.previousValue?.thumbMouseSlidingDisabled) { - this.enableDisableGestures(); - } - - this.slider.style.setProperty('--thumb-height', `${ this.config.thumbHeight }px`); - this.slider.style.setProperty('--thumb-width', `${ this.config.thumbWidth }px`); - } } - if (this._platform.isBrowser && changes.state && (changes.state.firstChange || !this.config.thumbDetached)) { + if (changes.state && (changes.state.firstChange || !this.config.detachThumbs)) { if (changes.state.currentValue?.currIndex !== changes.state.previousValue?.currIndex) { // Scroll slide to item when current index changes. requestAnimationFrame(() => { @@ -142,101 +128,32 @@ export class GalleryThumbsComponent implements AfterViewInit, AfterViewChecked, } ngAfterViewInit(): void { - if (this._platform.isBrowser) { - // Workaround: opening a lightbox (centralised) with last index active, show in wrong position - setTimeout(() => this.scrollToIndex(this.state.currIndex, 'auto'), 200); - - this._zone.runOutsideAngular(() => { - // Update necessary calculation on host resize - resizeObservable(this._el.nativeElement).pipe( - debounceTime(this.config.resizeDebounceTime), - tap(() => { - // Update thumb centralize size - const el: HTMLElement = this.items.get(this.state.currIndex)?.nativeElement; - if (el) { - this.slider.style.setProperty('--thumb-centralize-start-size', this.adapter.getCentralizerStartSize() + 'px'); - this.slider.style.setProperty('--thumb-centralize-end-size', this.adapter.getCentralizerEndSize() + 'px'); - } - this._cd.detectChanges(); - this.scrollToIndex(this.state.currIndex, 'auto'); - }), - takeUntil(this._destroyed$) - ).subscribe(); - }); - } - } - - ngAfterViewChecked(): void { - const el: HTMLElement = this.items.get(this.state.currIndex)?.nativeElement; - if (el && this._platform.isBrowser) { - this.slider.style.setProperty('--thumb-centralize-start-size', this.adapter.getCentralizerStartSize() + 'px'); - this.slider.style.setProperty('--thumb-centralize-end-size', this.adapter.getCentralizerEndSize() + 'px'); - } - } - - ngOnDestroy(): void { - this.deactivateGestures(); - this._destroyed$.next(); - this._destroyed$.complete(); + this.items.notifyOnChanges(); + this.items$ = this.items.changes.pipe( + // In some cases, items is not notified at first, need to force start the stream + startWith(null), + map(() => this.items.toArray()) + ); } trackByFn(index: number, item: any) { return item.type; } - private scrollToIndex(value: number, behavior: ScrollBehavior): void { - this._zone.runOutsideAngular(() => { - this.slider.style.scrollSnapType = 'unset'; - - const el: HTMLElement = this.items.get(value)?.nativeElement; - if (el) { - this._smoothScroll.scrollTo(this.slider, this.adapter.getScrollToValue(el, behavior)).then(() => { - this.slider.style.scrollSnapType = this.adapter.scrollSnapType; - }); - } - }); - } - - private enableDisableGestures(): void { - if (!this._platform.IOS && !this._platform.ANDROID) { - // Enable/Disable mouse sliding on desktop browser only - if (!this.config.thumbMouseSlidingDisabled) { - this.activateGestures(); - } else { - this.deactivateGestures(); - } + onActiveIndexChange(index: number): void { + if (index === -1) { + // Reset active index position + this.scrollToIndex(this.state.currIndex, 'smooth'); + } else { + this.scrollToIndex(index, 'smooth'); } } - private activateGestures(): void { - if (typeof Hammer !== 'undefined' && !this.config.disableThumb) { - - const direction: number = this.adapter.panDirection; - - // Activate gestures - this._zone.runOutsideAngular(() => { - this._hammer = new Hammer(this._el.nativeElement, { inputClass: Hammer.MouseInput }); - this._hammer.get('pan').set({ direction }); - - let panOffset: number = 0; - - this._hammer.on('panstart', () => { - panOffset = this.adapter.scrollValue; - // Disable scroll-snap-type functionality - this.slider.style.scrollSnapType = 'unset'; - this.slider.classList.add('g-sliding'); - }); - this._hammer.on('panmove', (e) => this.slider.scrollTo(this.adapter.getPanValue(panOffset, e, 'auto'))); - this._hammer.on('panend', () => { - // Enable scroll-snap-type functionality - this.slider.style.scrollSnapType = this.adapter.scrollSnapType; - this.slider.classList.remove('g-sliding'); - }); - }); + scrollToIndex(value: number, behavior: ScrollBehavior): void { + const el: HTMLElement = this.items.get(value)?.nativeElement; + if (el) { + const pos: SmoothScrollOptions = this.adapter.getScrollToValue(el, behavior); + this.position$.next(pos); } } - - private deactivateGestures(): void { - this._hammer?.destroy(); - } } diff --git a/projects/ng-gallery/src/lib/components/gallery-thumbs.scss b/projects/ng-gallery/src/lib/components/gallery-thumbs.scss new file mode 100644 index 00000000..d9d5e290 --- /dev/null +++ b/projects/ng-gallery/src/lib/components/gallery-thumbs.scss @@ -0,0 +1,58 @@ +:host { + max-height: 100%; + max-width: 100%; + display: block; + z-index: 100; +} + +.g-slider { + display: flex; + align-items: center; + transition: var(--g-height-transition); + max-height: 100%; + min-width: 100%; + height: var(--thumb-slider-height); + width: var(--thumb-slider-width); + + top: var(--thumb-slider-top); + left: var(--thumb-slider-left); + overflow: var(--thumb-slider-overflow); + scroll-snap-type: var(--slider-scroll-snap-type); + flex-direction: var(--thumb-slider-flex-direction); + + scrollbar-width: none; + + &::-webkit-scrollbar { + display: none; + } + + // Disable mouse click on gallery items/thumbnails when the slider is being dragged using the mouse + &.g-sliding { + // Disable mouse click on gallery items/thumbnails when the slider is being dragged using the mouse + .g-slider-content { + pointer-events: none; + } + } + + &[centralised="true"] { + &:before, &:after { + content: ''; + } + + &:before { + flex: 0 0 var(--thumb-centralize-start-size); + } + + &:after { + flex: 0 0 var(--thumb-centralize-end-size); + } + } +} + +.g-slider-content { + flex: 0 0 auto; + display: flex; + flex-direction: var(--thumb-slider-flex-direction); + align-items: center; + gap: 1px; +} diff --git a/projects/ng-gallery/src/lib/components/gallery.component.ts b/projects/ng-gallery/src/lib/components/gallery.component.ts index 454ad186..d263bd76 100644 --- a/projects/ng-gallery/src/lib/components/gallery.component.ts +++ b/projects/ng-gallery/src/lib/components/gallery.component.ts @@ -3,16 +3,18 @@ import { Input, Output, ContentChild, + booleanAttribute, + numberAttribute, + EventEmitter, OnInit, AfterContentInit, OnChanges, OnDestroy, SimpleChanges, - EventEmitter, ChangeDetectionStrategy } from '@angular/core'; import { CommonModule } from '@angular/common'; -import { Subscription, SubscriptionLike } from 'rxjs'; +import { Subscription } from 'rxjs'; import { GalleryCoreComponent } from './gallery-core.component'; import { Gallery } from '../services/gallery.service'; import { GalleryRef } from '../services/gallery-ref'; @@ -24,131 +26,332 @@ import { GalleryImageDef } from '../directives/gallery-image-def.directive'; import { GalleryThumbDef } from '../directives/gallery-thumb-def.directive'; import { GalleryItemDef } from '../directives/gallery-item-def.directive'; import { GalleryBoxDef } from '../directives/gallery-box-def.directive'; +import { ImgManager } from '../utils/img-manager'; +import { AutoplayDirective } from '../autoplay/autoplay.directive'; +/** + * Gallery component + */ @Component({ selector: 'gallery', changeDetection: ChangeDetectionStrategy.OnPush, - styleUrls: ['../styles/gallery.scss'], + styleUrls: ['./gallery.scss'], template: ` - + (error)="onError($event)"/> `, standalone: true, - imports: [CommonModule, GalleryCoreComponent] + imports: [CommonModule, GalleryCoreComponent, AutoplayDirective], + providers: [ImgManager] }) export class GalleryComponent implements OnInit, AfterContentInit, OnChanges, OnDestroy { + /** + * The gallery reference instance + */ galleryRef: GalleryRef; - @Input() id: string; + + /** + * The gallery instance unique id, required if more multiple gallery instances + */ + @Input() id: string = 'root'; + + /** + * Loads the items array into the gallery + */ @Input() items: GalleryItem []; - @Input() nav: boolean = this._gallery.config.nav; - @Input() dots: boolean = this._gallery.config.dots; - @Input() loop: boolean = this._gallery.config.loop; - @Input() debug: boolean = this._gallery.config.debug; - @Input() thumb: boolean = this._gallery.config.thumb; - @Input() counter: boolean = this._gallery.config.counter; - @Input() dotsSize: number = this._gallery.config.dotsSize; - @Input() autoPlay: boolean = this._gallery.config.autoPlay; - @Input() thumbWidth: number = this._gallery.config.thumbWidth; - @Input() thumbHeight: number = this._gallery.config.thumbHeight; - @Input() disableThumb: boolean = this._gallery.config.disableThumb; + + /** + * Displays the navigation buttons + */ + @Input({ transform: booleanAttribute }) nav: boolean = this._gallery.config.nav; + + /** + * Displays the navigation bullets + */ + @Input({ transform: booleanAttribute }) bullets: boolean = this._gallery.config.bullets; + + /** + * Enables loop cycling + */ + @Input({ transform: booleanAttribute }) loop: boolean = this._gallery.config.loop; + + /** + * Show visuals that helps debugging the component + */ + @Input({ transform: booleanAttribute }) debug: boolean = this._gallery.config.debug; + + /** + * Displays the thumbnails + */ + @Input({ transform: booleanAttribute }) thumbs: boolean = this._gallery.config.thumbs; + + /** + * Displays the counter or pagination + */ + @Input({ transform: booleanAttribute }) counter: boolean = this._gallery.config.counter; + + /** + * De-attaching the thumbnails from the main slider + * If enabled - thumbnails won't automatically scroll to the active thumbnails + */ + @Input({ transform: booleanAttribute }) detachThumbs: boolean = this._gallery.config.detachThumbs; + + /** + * Fits each thumbnail size to its content + */ + @Input({ transform: booleanAttribute }) thumbAutosize: boolean = this._gallery.config.thumbAutosize; + + /** + * Fits each item size to its content, This option should be used with: + * - Does not work if `autoHeight` is turned on + * - Does not work properly unless `loadingAttr="eager"` + * - Does not work properly unless `loadingStrategy="preload"` + */ + @Input({ transform: booleanAttribute }) itemAutosize: boolean = this._gallery.config.itemAutosize; + + /** + * Automatically adjusts the gallery's height to fit the content + */ + @Input({ transform: booleanAttribute }) autoHeight: boolean = this._gallery.config.autoHeight; + + /** + * Automatically cycle through items at time interval + */ + @Input({ transform: booleanAttribute }) autoplay: boolean = this._gallery.config.autoplay; + + /** + * Disables thumbnails' clicks + */ + @Input({ transform: booleanAttribute }) disableThumbs: boolean = this._gallery.config.disableThumbs; + + /** + * Disables bullets' clicks + */ + @Input({ transform: booleanAttribute }) disableBullets: boolean = this._gallery.config.disableBullets; + + /** + * Disables sliding using mousewheel, touchpad, scroll and gestures on touch devices + */ + @Input({ transform: booleanAttribute }) disableScroll: boolean = this._gallery.config.disableScroll; + + /** + * Disables sliding of thumbnails using touchpad, scroll and gestures on touch devices + */ + @Input({ transform: booleanAttribute }) disableThumbScroll: boolean = this._gallery.config.disableThumbScroll; + + /** + * Force centralizing the active thumbnail + */ + @Input({ transform: booleanAttribute }) thumbCentralized: boolean = this._gallery.config.thumbCentralized; + + /** + * Disables sliding using the mouse + */ + @Input({ transform: booleanAttribute }) disableMouseScroll: boolean = this._gallery.config.disableMouseScroll; + + /** + * Disables sliding of thumbnails using the mouse + */ + @Input({ transform: booleanAttribute }) disableThumbMouseScroll: boolean = this._gallery.config.disableThumbMouseScroll; + + /** + * Sets the size of the bullets navigation + */ + @Input({ transform: numberAttribute }) bulletSize: number = this._gallery.config.bulletSize; + + /** + * Sets the thumbnail's width + */ + @Input({ transform: numberAttribute }) thumbWidth: number = this._gallery.config.thumbWidth; + + /** + * Sets the thumbnail's height + */ + @Input({ transform: numberAttribute }) thumbHeight: number = this._gallery.config.thumbHeight; + + /** + * Sets the interval used for the autoplay feature + */ + @Input({ transform: numberAttribute }) autoplayInterval: number = this._gallery.config.autoplayInterval; + + /** + * Sets the duration used for smooth navigation between the items + */ + @Input({ transform: numberAttribute }) scrollDuration: number = this._gallery.config.scrollDuration; + + /** + * Sets the debounce time used to throttle the gallery update after it is resized + */ + @Input({ transform: numberAttribute }) resizeDebounceTime: number = this._gallery.config.resizeDebounceTime; + + /** + * Sets the scroll behavior when the active item is changed + */ @Input() scrollBehavior: ScrollBehavior = this._gallery.config.scrollBehavior; - @Input() navScrollBehavior: ScrollBehavior = this._gallery.config.navScrollBehavior; - @Input() slidingDisabled: boolean = this._gallery.config.slidingDisabled; - @Input() thumbSlidingDisabled: boolean = this._gallery.config.thumbSlidingDisabled; - @Input() mouseSlidingDisabled: boolean = this._gallery.config.mouseSlidingDisabled; - @Input() thumbMouseSlidingDisabled: boolean = this._gallery.config.thumbMouseSlidingDisabled; - @Input() playerInterval: number = this._gallery.config.playerInterval; - @Input() slidingDuration: number = this._gallery.config.slidingDuration; - @Input() slidingEase: BezierEasingOptions = this._gallery.config.slidingEase; - @Input() resizeDebounceTime: number = this._gallery.config.resizeDebounceTime; + + /** + * Sets the ease function used for smooth navigation between the items + */ + @Input() scrollEase: BezierEasingOptions = this._gallery.config.scrollEase; + + /** + * Sets the object-fit style applied on items' images + */ @Input() imageSize: 'cover' | 'contain' = this._gallery.config.imageSize; + + /** + * Sets the object-fit style applied on thumbnails' images + */ @Input() thumbImageSize: 'cover' | 'contain' = this._gallery.config.thumbImageSize; - @Input() dotsPosition: 'top' | 'bottom' = this._gallery.config.dotsPosition; + + /** + * Sets the bullets navigation position + */ + @Input() bulletPosition: 'top' | 'bottom' = this._gallery.config.bulletPosition; + + /** + * Sets the counter navigation position + */ @Input() counterPosition: 'top' | 'bottom' = this._gallery.config.counterPosition; - @Input() slidingDirection: 'horizontal' | 'vertical' = this._gallery.config.slidingDirection; + + /** + * Sets the sliding direction + */ + @Input() orientation: 'horizontal' | 'vertical' = this._gallery.config.orientation; + + /** + * Sets the loading attribute applied on the items' images + */ @Input() loadingAttr: 'eager' | 'lazy' = this._gallery.config.loadingAttr; + + /** + * Sets the loading strategy used for displaying the items + * - `lazy` renders only the active item + * - `default` renders only the active item, the previous item and the next item + * - `preload` renders all the items, this option is required for `thumbAutoSize` is enabled + */ @Input() loadingStrategy: 'preload' | 'lazy' | 'default' = this._gallery.config.loadingStrategy; + + /** + * Sets the thumbnails position, it also sets the sliding direction of the thumbnails accordingly + */ @Input() thumbPosition: 'top' | 'left' | 'right' | 'bottom' = this._gallery.config.thumbPosition; - @Input() thumbView: 'default' | 'contain' = this._gallery.config.thumbView; - @Input() thumbDetached: boolean = this._gallery.config.thumbDetached; - @Input() thumbAutosize: boolean = this._gallery.config.thumbAutosize; - @Input() itemAutosize: boolean = this._gallery.config.itemAutosize; - @Input() autoHeight: boolean = this._gallery.config.autoHeight; - - // Inputs used by the lightbox - - /** Destroy gallery ref on component destroy event */ - @Input() destroyRef = true; - - /** Skip initializing the config with components inputs (Lightbox mode) */ - @Input() skipInitConfig = false; - - @Output() itemClick = new EventEmitter(); - @Output() thumbClick = new EventEmitter(); - @Output() playingChange = new EventEmitter(); - @Output() indexChange = new EventEmitter(); - @Output() itemsChange = new EventEmitter(); - @Output() error = new EventEmitter(); - - @ContentChild(GalleryItemDef) galleryItemDef: GalleryItemDef; - @ContentChild(GalleryImageDef) galleryImageDef: GalleryImageDef; - @ContentChild(GalleryThumbDef) galleryThumbDef: GalleryThumbDef; - @ContentChild(GalleryBoxDef) galleryBoxDef: GalleryBoxDef; - - private _itemClick$: SubscriptionLike = Subscription.EMPTY; - private _thumbClick$: SubscriptionLike = Subscription.EMPTY; - private _itemChange$: SubscriptionLike = Subscription.EMPTY; - private _indexChange$: SubscriptionLike = Subscription.EMPTY; - private _playingChange$: SubscriptionLike = Subscription.EMPTY; - private _playerListener$: SubscriptionLike = Subscription.EMPTY; + + /** + * Destroy gallery ref on component destroy event + * This intended to be used and disabled from the lightbox component + * @ignore + * */ + @Input() destroyRef: boolean = true; + + /** + * Skip initializing the config with components inputs (Lightbox mode) + * This intended to be used and enabled from the lightbox component + * @ignore + */ + @Input() skipInitConfig: boolean = false; + + /** + * Stream that emits when an item is clicked + */ + @Output() itemClick: EventEmitter = new EventEmitter(); + + /** + * Stream that emits when a thumbnail is clicked + */ + @Output() thumbClick: EventEmitter = new EventEmitter(); + + /** + * Stream that emits when player state is changed + */ + @Output() playingChange: EventEmitter = new EventEmitter(); + + /** + * Stream that emits when index is changed + */ + @Output() indexChange: EventEmitter = new EventEmitter(); + + /** + * Stream that emits when items array is changed + */ + @Output() itemsChange: EventEmitter = new EventEmitter(); + + /** + * Stream that emits when an error occurs, this would emit for loading errors of image and video items only + */ + @Output() error: EventEmitter = new EventEmitter(); + + /** @ignore */ + @ContentChild(GalleryItemDef) private _galleryItemDef: GalleryItemDef; + /** @ignore */ + @ContentChild(GalleryImageDef) private _galleryImageDef: GalleryImageDef; + /** @ignore */ + @ContentChild(GalleryThumbDef) private _galleryThumbDef: GalleryThumbDef; + /** @ignore */ + @ContentChild(GalleryBoxDef) private _galleryBoxDef: GalleryBoxDef; + + /** @ignore */ + private _itemClick$: Subscription; + /** @ignore */ + private _thumbClick$: Subscription; + /** @ignore */ + private _itemChange$: Subscription; + /** @ignore */ + private _indexChange$: Subscription; + /** @ignore */ + private _playingChange$: Subscription; constructor(private _gallery: Gallery) { } + /** @ignore */ private getConfig(): GalleryConfig { return { nav: this.nav, - dots: this.dots, + bullets: this.bullets, loop: this.loop, debug: this.debug, - thumb: this.thumb, + thumbs: this.thumbs, counter: this.counter, - autoPlay: this.autoPlay, - dotsSize: this.dotsSize, + autoplay: this.autoplay, + bulletSize: this.bulletSize, imageSize: this.imageSize, thumbImageSize: this.thumbImageSize, scrollBehavior: this.scrollBehavior, - navScrollBehavior: this.navScrollBehavior, - thumbView: this.thumbView, + thumbCentralized: this.thumbCentralized, thumbWidth: this.thumbWidth, thumbHeight: this.thumbHeight, - slidingEase: this.slidingEase, - disableThumb: this.disableThumb, - dotsPosition: this.dotsPosition, + scrollEase: this.scrollEase, + bulletPosition: this.bulletPosition, loadingAttr: this.loadingAttr, - thumbDetached: this.thumbDetached, + detachThumbs: this.detachThumbs, thumbPosition: this.thumbPosition, - playerInterval: this.playerInterval, + autoplayInterval: this.autoplayInterval, counterPosition: this.counterPosition, loadingStrategy: this.loadingStrategy, - slidingDuration: this.slidingDuration, - slidingDirection: this.slidingDirection, + scrollDuration: this.scrollDuration, + orientation: this.orientation, resizeDebounceTime: this.resizeDebounceTime, - slidingDisabled: this.slidingDisabled, - thumbSlidingDisabled: this.thumbSlidingDisabled, - mouseSlidingDisabled: this.mouseSlidingDisabled, - thumbMouseSlidingDisabled: this.thumbMouseSlidingDisabled, + disableBullets: this.disableBullets, + disableThumbs: this.disableThumbs, + disableScroll: this.disableScroll, + disableThumbScroll: this.disableThumbScroll, + disableMouseScroll: this.disableMouseScroll, + disableThumbMouseScroll: this.disableThumbMouseScroll, thumbAutosize: this.thumbAutosize, itemAutosize: this.itemAutosize, - autoHeight: this.autoHeight, + autoHeight: this.autoHeight }; } + + /** @ignore */ ngOnChanges(changes: SimpleChanges): void { if (this.galleryRef) { this.galleryRef.setConfig(this.getConfig()); @@ -159,6 +362,8 @@ export class GalleryComponent implements OnInit, AfterContentInit, OnChanges, On } } + + /** @ignore */ ngOnInit(): void { // Get gallery instance by id if (this.skipInitConfig) { @@ -170,9 +375,6 @@ export class GalleryComponent implements OnInit, AfterContentInit, OnChanges, On // Load gallery items this.load(this.items); - // Activate player listener - this._playerListener$ = this.galleryRef.activatePlayer().subscribe(); - // Subscribes to events on demand if (this.indexChange.observed) { this._indexChange$ = this.galleryRef.indexChanged.subscribe((state: GalleryState) => this.indexChange.emit(state)); @@ -183,108 +385,146 @@ export class GalleryComponent implements OnInit, AfterContentInit, OnChanges, On if (this.playingChange.observed) { this._playingChange$ = this.galleryRef.playingChanged.subscribe((state: GalleryState) => this.playingChange.emit(state)); } - - // Start playing if autoplay is set to true - if (this.autoPlay) { - this.play(); - } } + /** @ignore */ ngAfterContentInit(): void { const templateConfig: GalleryConfig = {}; - if (this.galleryItemDef) { - templateConfig.itemTemplate = this.galleryItemDef.templateRef; + if (this._galleryItemDef) { + templateConfig.itemTemplate = this._galleryItemDef.templateRef; } - if (this.galleryImageDef) { - templateConfig.imageTemplate = this.galleryImageDef.templateRef; + if (this._galleryImageDef) { + templateConfig.imageTemplate = this._galleryImageDef.templateRef; } - if (this.galleryThumbDef) { - templateConfig.thumbTemplate = this.galleryThumbDef.templateRef; + if (this._galleryThumbDef) { + templateConfig.thumbTemplate = this._galleryThumbDef.templateRef; } - if (this.galleryBoxDef) { - templateConfig.boxTemplate = this.galleryBoxDef.templateRef; + if (this._galleryBoxDef) { + templateConfig.boxTemplate = this._galleryBoxDef.templateRef; } if (Object.keys(templateConfig).length) { this.galleryRef.setConfig(templateConfig); } } + /** @ignore */ ngOnDestroy(): void { - this._itemClick$.unsubscribe(); - this._thumbClick$.unsubscribe(); - this._itemChange$.unsubscribe(); - this._indexChange$.unsubscribe(); - this._playingChange$.unsubscribe(); - this._playerListener$.unsubscribe(); + this._itemClick$?.unsubscribe(); + this._thumbClick$?.unsubscribe(); + this._itemChange$?.unsubscribe(); + this._indexChange$?.unsubscribe(); + this._playingChange$?.unsubscribe(); if (this.destroyRef) { - this.galleryRef.destroy(); + this.galleryRef?.destroy(); } } + /** @ignore */ onItemClick(i: number): void { this.itemClick.emit(i); this.galleryRef.itemClick.next(i); } + /** @ignore */ onThumbClick(i: number): void { this.galleryRef.set(i); this.thumbClick.emit(i); this.galleryRef.thumbClick.next(i); } + /** @ignore */ onError(err: GalleryError): void { this.error.emit(err); this.galleryRef.error.next(err); } + /** + * Load items and reset the state + */ load(items: GalleryItem[]): void { this.galleryRef.load(items); } + /** + * Add gallery item, it can be any item, suitable to add item with a custom template + */ add(item: GalleryItem, active?: boolean): void { this.galleryRef.add(item, active); } + /** + * Add image item + */ addImage(data: ImageItemData, active?: boolean): void { this.galleryRef.addImage(data, active); } + /** + * Add video item + */ addVideo(data: VideoItemData, active?: boolean): void { this.galleryRef.addVideo(data, active); } + /** + * Add iframe item + */ addIframe(data: IframeItemData, active?: boolean): void { this.galleryRef.addIframe(data, active); } + /** + * Add Youtube item + */ addYoutube(data: YoutubeItemData, active?: boolean): void { this.galleryRef.addYoutube(data, active); } + /** + * Remove gallery item by index + */ remove(i: number): void { this.galleryRef.remove(i); } + /** + * Go to next item + */ next(behavior?: ScrollBehavior, loop?: boolean): void { this.galleryRef.next(behavior, loop); } + /** + * Go to prev item + */ prev(behavior?: ScrollBehavior, loop?: boolean): void { this.galleryRef.prev(behavior, loop); } + /** + * Set active item + */ set(i: number, behavior?: ScrollBehavior): void { this.galleryRef.set(i, behavior); } + /** + * Reset to initial state + */ reset(): void { this.galleryRef.reset(); } + /** + * Start the player + */ play(interval?: number): void { this.galleryRef.play(interval); } + /** + * Stop the player + */ stop(): void { this.galleryRef.stop(); } diff --git a/projects/ng-gallery/src/lib/components/gallery.scss b/projects/ng-gallery/src/lib/components/gallery.scss new file mode 100644 index 00000000..dfe3bebb --- /dev/null +++ b/projects/ng-gallery/src/lib/components/gallery.scss @@ -0,0 +1,20 @@ +:host { + position: relative; + overflow: hidden; + z-index: 1; + display: flex; + justify-content: center; + align-items: center; + background-color: black; + + --g-height-transition: height 468ms cubic-bezier(0.42, 0, 0.58, 1); + --g-nav-drop-shadow: drop-shadow(0 0 2px rgba(0, 0, 0, 0.6)); + --g-box-shadow: 0 0 3px rgba(0, 0, 0, 0.6); + --g-font-color: #000; + --g-overlay-color: #fff; + --g-gutter-size: 1px; + + &[gallerize] { + --g-item-cursor: pointer; + } +} diff --git a/projects/ng-gallery/src/lib/components/templates/gallery-image.component.ts b/projects/ng-gallery/src/lib/components/templates/gallery-image.component.ts index af522a0e..566739a2 100644 --- a/projects/ng-gallery/src/lib/components/templates/gallery-image.component.ts +++ b/projects/ng-gallery/src/lib/components/templates/gallery-image.component.ts @@ -11,10 +11,13 @@ import { NgSwitch, NgSwitchCase, NgIf } from '@angular/common'; import { DomSanitizer, SafeHtml } from '@angular/platform-browser'; import { animate, style, transition, trigger } from '@angular/animations'; import { imageFailedSvg } from './svg-assets'; +import { ImgRecognizer } from '../../utils/img-recognizer'; +import { ItemState } from './items.model'; @Component({ selector: 'gallery-image', changeDetection: ChangeDetectionStrategy.OnPush, + styleUrls: ['./gallery-image.scss'], animations: [ trigger('fadeIn', [ transition('* => success', [ @@ -25,14 +28,28 @@ import { imageFailedSvg } from './svg-assets'; ], template: ` - + + + + + + +
                                                                                                                                  @@ -65,19 +82,18 @@ import { imageFailedSvg } from './svg-assets'; `, standalone: true, - imports: [NgSwitch, NgSwitchCase, NgIf] + imports: [NgSwitch, NgSwitchCase, NgIf, ImgRecognizer] }) export class GalleryImageComponent implements OnInit { - state: 'loading' | 'success' | 'failed' = 'loading'; - - /** Progress value */ - progress: number = 0; + state: ItemState = 'loading'; /** Is thumbnail */ @Input() isThumbnail: boolean; + @Input() index: number; + /** Image loading attribute */ @Input() loadingAttr: 'eager' | 'lazy'; @@ -101,9 +117,7 @@ export class GalleryImageComponent implements OnInit { errorSvg: SafeHtml; /** Stream that emits when an error occurs */ - @Output() error = new EventEmitter(); - - @Output() loaded = new EventEmitter(); + @Output() error: EventEmitter = new EventEmitter(); @HostBinding('attr.imageState') get imageState(): string { return this.state; diff --git a/projects/ng-gallery/src/lib/components/templates/gallery-image.scss b/projects/ng-gallery/src/lib/components/templates/gallery-image.scss new file mode 100644 index 00000000..9e106869 --- /dev/null +++ b/projects/ng-gallery/src/lib/components/templates/gallery-image.scss @@ -0,0 +1,118 @@ +:host { + display: flex; + width: 100%; + height: 100%; + max-height: 100%; + max-width: 100%; + transition: opacity 300ms cubic-bezier(0.5, 0, 0.5, 1); + opacity: var(--g-thumb-opacity); + + &[imageState='success'] { + align-self: center; + } + + ::ng-deep { + svg { + width: 100%; + height: 100%; + } + } +} + +.gallery-image-error { + width: 100px; + height: 100px; +} + +.gallery-thumb-error { + width: 40px; + height: 40px; +} + +img.g-image-item { + object-fit: var(--image-object-fit); + width: 100%; + height: 100%; + pointer-events: none; + max-height: 100%; + max-width: 100%; +} + +.g-image-error-message { + position: absolute; + z-index: 10; + left: 0; + top: 0; + right: 0; + bottom: 0; + color: white; + display: flex; + align-items: center; + justify-content: center; + flex-direction: column; +} + +h2, h4 { + color: coral; + margin: 0; +} + +h2 { + font-size: 3.5em; + margin-bottom: 0.3em; +} + +h4 { + font-size: 1.6em; +} + +.g-loading { + position: absolute; + transform: translate3d(-50%, -50%, 0); + left: 50%; + top: 50%; + width: 80px; + height: 80px; +} + +// Thumbnail loading + +$loading-color: #fff !default; +$placeholder-ng: #262626 !default; + +.g-active-thumb { + .g-thumb-loading { + background-color: #464646; + } +} + +.g-thumb-loading { + position: relative; + overflow: hidden; + width: 100%; + height: 100%; + background-color: $placeholder-ng; + + &::before { + content: ""; + position: absolute; + top: 0; + right: 0; + bottom: 0; + left: 50%; + z-index: 1; + width: 500%; + margin-left: -250%; + animation: phAnimation .8s linear infinite; + background: linear-gradient(to right, rgba($loading-color, 0) 46%, rgba($loading-color, .35) 50%, rgba($loading-color, 0) 54%) 50% 50%; + } +} + +@keyframes phAnimation { + 0% { + transform: translate3d(-30%, 0, 0); + } + 100% { + transform: translate3d(30%, 0, 0); + } +} diff --git a/projects/ng-gallery/src/lib/components/templates/items.model.ts b/projects/ng-gallery/src/lib/components/templates/items.model.ts index 623cd4dc..67071479 100644 --- a/projects/ng-gallery/src/lib/components/templates/items.model.ts +++ b/projects/ng-gallery/src/lib/components/templates/items.model.ts @@ -80,3 +80,5 @@ export type VideoItemData = GalleryItemModel & { }; export type GalleryItemData = ImageItemData | VideoItemData | IframeItemData | YoutubeItemData; + +export type ItemState = 'success' | 'loading' | 'failed'; diff --git a/projects/ng-gallery/src/lib/gestures/hammer-sliding.directive.ts b/projects/ng-gallery/src/lib/gestures/hammer-sliding.directive.ts new file mode 100644 index 00000000..3009431e --- /dev/null +++ b/projects/ng-gallery/src/lib/gestures/hammer-sliding.directive.ts @@ -0,0 +1,160 @@ +import { + Directive, + Inject, + Input, + Output, + OnChanges, + OnDestroy, + SimpleChanges, + NgZone, + ElementRef, + EventEmitter +} from '@angular/core'; +import { DOCUMENT } from '@angular/common'; +import { Platform } from '@angular/cdk/platform'; +import { Directionality } from '@angular/cdk/bidi'; +import { SliderAdapter } from '../components/adapters'; +import { GalleryState } from '../models/gallery.model'; +import { GalleryConfig } from '../models/config.model'; +import { Orientation } from '../models/constants'; +import { GalleryItemComponent } from '../components/gallery-item.component'; +import { GalleryThumbComponent } from '../components/gallery-thumb.component'; + +declare const Hammer: any; + +@Directive({ + selector: '[hammerSliding]', + standalone: true +}) +export class HammerSliding implements OnChanges, OnDestroy { + + /** HammerJS instance */ + private _hammer: any; + + get _viewport(): HTMLElement { + return this._el.nativeElement; + } + + @Input('hammerSliding') enabled: boolean; + + @Input() galleryId: string; + + @Input() items: GalleryItemComponent[] | GalleryThumbComponent[]; + + @Input() adapter: SliderAdapter; + + @Input() state: GalleryState; + + @Input() config: GalleryConfig; + + @Output() activeIndexChange: EventEmitter = new EventEmitter(); + + @Output() isSlidingChange: EventEmitter = new EventEmitter(); + + constructor(@Inject(DOCUMENT) private _document: Document, + private _el: ElementRef, + private _dir: Directionality, + private _platform: Platform, + private _zone: NgZone) { + } + + + ngOnChanges(changes: SimpleChanges): void { + if (changes.enabled && changes.enabled?.currentValue !== changes.enabled?.previousValue) { + this.enabled ? this._subscribe() : this._unsubscribe(); + } + if (!changes.adapter?.firstChange && changes.adapter?.currentValue !== changes.adapter?.previousValue) { + this.enabled ? this._subscribe() : this._unsubscribe(); + } + } + + ngOnDestroy(): void { + this._unsubscribe(); + } + + private _subscribe(): void { + this._unsubscribe(); + + if (!this._platform.ANDROID && !this._platform.IOS && typeof Hammer !== 'undefined') { + this._zone.runOutsideAngular(() => { + + const direction: number = this.adapter.hammerDirection; + this._hammer = new Hammer(this._el.nativeElement, { inputClass: Hammer.MouseInput }); + this._hammer.get('pan').set({ direction }); + + let offset: number; + + // Set panOffset for sliding on pan start event + this._hammer.on('panstart', () => { + this._zone.run(() => { + this.isSlidingChange.emit(true); + }); + + offset = this.adapter.scrollValue; + this._viewport.classList.add('g-sliding'); + this._viewport.style.setProperty('--slider-scroll-snap-type', 'none'); + }); + + this._hammer.on('panmove', (e: any) => this._viewport.scrollTo(this.adapter.getHammerValue(offset, e, 'auto'))); + + this._hammer.on('panend', (e: any) => { + this._document.onselectstart = null; + this._viewport.classList.remove('g-sliding'); + const index: number = this.getIndexOnMouseUp(e); + + this._zone.run(() => { + this.isSlidingChange.emit(false); + this.activeIndexChange.emit(index); + }); + }); + }); + } + } + + private _unsubscribe(): void { + this._hammer?.destroy(); + } + + private getIndexOnMouseUp(e: any): number { + // Check if scrolled item is great enough to navigate + const currElement: Element = this.items[this.state.currIndex].nativeElement; + + // Find the gallery item element in the center elements + const elementAtCenter: Element = this.getElementFromViewportCenter(); + + // Check if center item can be taken from element using + if (elementAtCenter && elementAtCenter !== currElement) { + return +elementAtCenter.getAttribute('galleryIndex'); + } + + const velocity: number = this.adapter.getHammerVelocity(e); + // Check if velocity is great enough to navigate + if (Math.abs(velocity) > 0.3) { + if (this.config.orientation === Orientation.Horizontal) { + if (velocity > 0) { + return this._dir.value === 'rtl' ? this.state.currIndex + 1 : this.state.currIndex - 1; + } + return this._dir.value === 'rtl' ? this.state.currIndex - 1 : this.state.currIndex + 1; + } else { + return velocity > 0 ? this.state.currIndex - 1 : this.state.currIndex + 1; + } + } + + // Reset position to the current index + return -1; + } + + private getElementFromViewportCenter(): Element { + // Get slider position relative to the document + const sliderRect: DOMRect = this._viewport.getBoundingClientRect(); + // Try look for the center item using `elementsFromPoint` function + const centerElements: Element[] = this._document.elementsFromPoint( + sliderRect.x + (sliderRect.width / 2), + sliderRect.y + (sliderRect.height / 2) + ); + // Find the gallery item element in the center elements + return centerElements.find((element: Element) => { + return element.getAttribute('galleryId') === this.galleryId; + }); + } +} diff --git a/projects/ng-gallery/src/lib/gestures/mouse-sliding.directive.ts b/projects/ng-gallery/src/lib/gestures/mouse-sliding.directive.ts new file mode 100644 index 00000000..db3041ec --- /dev/null +++ b/projects/ng-gallery/src/lib/gestures/mouse-sliding.directive.ts @@ -0,0 +1,142 @@ +// import { Directive, Inject, Input, Output, OnChanges, OnDestroy, SimpleChanges, NgZone, ElementRef, EventEmitter } from '@angular/core'; +// import { DOCUMENT } from '@angular/common'; +// import { Observable, Subscription, fromEvent, switchMap, take, takeUntil, tap } from 'rxjs'; +// import { SliderAdapter } from '../components/adapters'; +// import { GalleryConfig } from '../models/config.model'; +// import { GalleryState } from '../models/gallery.model'; +// +// @Directive({ +// selector: '[mouseSliding]', +// standalone: true +// }) +// export class MouseSliding implements OnChanges, OnDestroy { +// +// private _currentSubscription: Subscription; +// +// get _viewport(): HTMLElement { +// return this._el.nativeElement; +// } +// +// @Input('mouseSliding') galleryId: string; +// +// @Input() items: HTMLElement[]; +// +// @Input() adapter: SliderAdapter; +// +// @Input() state: GalleryState; +// +// @Input() config: GalleryConfig; +// +// @Output() activeIndexChange: EventEmitter = new EventEmitter(); +// +// constructor(@Inject(DOCUMENT) private _document: Document, +// private _zone: NgZone, +// private _el: ElementRef) { +// } +// +// +// ngOnChanges(changes: SimpleChanges): void { +// if (changes.config && changes.config.currentValue?.mouseScrollDisabled !== changes.config.previousValue?.mouseScrollDisabled) { +// changes.config.currentValue.mouseScrollDisabled ? this._unsubscribe() : this._subscribe(); +// } +// } +// +// ngOnDestroy(): void { +// this._unsubscribe(); +// } +// +// private _subscribe(): void { +// this._unsubscribe(); +// +// this._zone.runOutsideAngular(() => { +// this._currentSubscription = this.dragEvent().subscribe(); +// }); +// } +// +// private _unsubscribe(): void { +// this._currentSubscription?.unsubscribe(); +// } +// +// private dragEvent(): Observable { +// const mouseDown$: Observable = fromEvent(this._viewport, 'mousedown'); +// const mouseUp$: Observable = fromEvent(this._document, 'mouseup'); +// const mouseMove$: Observable = fromEvent(this._document, 'mousemove', { +// capture: true, +// passive: true +// }); +// +// let offset: number; +// let velocity: number; +// +// const dragStart: Observable = mouseDown$.pipe( +// tap((downEvent: MouseEvent) => { +// downEvent.preventDefault(); +// offset = this.adapter.scrollValue; +// this._viewport.style.scrollSnapType = 'unset'; +// this._viewport.classList.add('g-sliding'); +// this._document.onselectstart = () => false; +// }) +// ); +// +// const dragEnd: Observable = mouseUp$.pipe( +// tap((upEvent: MouseEvent) => { +// this._document.onselectstart = null; +// this._viewport.classList.remove('g-sliding'); +// const index: number = this.getIndexOnMouseUp(velocity); +// this._zone.run(() => this.activeIndexChange.emit(index)); +// }), +// take(1) +// ); +// +// return dragStart.pipe( +// switchMap((startEvent: MouseEvent) => { +// return mouseMove$.pipe( +// tap((moveEvent: MouseEvent) => { +// const start: number = this.adapter.getDraggingProperty(startEvent); +// const current: number = this.adapter.getDraggingProperty(moveEvent); +// const deltaTime: number = moveEvent.timeStamp - startEvent.timeStamp; +// const delta: number = current - start; +// velocity = delta / deltaTime; +// this._viewport.scrollTo(this.adapter.getDraggingValue(offset, delta, 'auto')); +// }), +// takeUntil(dragEnd) +// ); +// }) +// ); +// } +// +// private getIndexOnMouseUp(velocity: number): number { +// // Check if scrolled item is great enough to navigate +// const currElement: Element = this.items[this.state.currIndex]; +// +// // Find the gallery item element in the center elements +// const elementAtCenter: Element = this.getElementFromViewportCenter(); +// +// // Check if center item can be taken from element using +// if (elementAtCenter && elementAtCenter !== currElement) { +// return +elementAtCenter.getAttribute('galleryIndex'); +// } +// +// // Check if velocity is great enough to navigate +// if (Math.abs(velocity) > 0.3) { +// return velocity > 0 ? this.state.currIndex - 1 : this.state.currIndex + 1; +// } +// +// // Reset position to the current index +// return -1; +// } +// +// private getElementFromViewportCenter(): Element { +// // Get slider position relative to the document +// const sliderRect: DOMRect = this._viewport.getBoundingClientRect(); +// // Try look for the center item using `elementsFromPoint` function +// const centerElements: Element[] = this._document.elementsFromPoint( +// sliderRect.x + (sliderRect.width / 2), +// sliderRect.y + (sliderRect.height / 2) +// ); +// // Find the gallery item element in the center elements +// return centerElements.find((element: Element) => { +// return element.getAttribute('galleryId') === this.galleryId; +// }); +// } +// } diff --git a/projects/ng-gallery/src/lib/models/config.model.ts b/projects/ng-gallery/src/lib/models/config.model.ts index e02d89fd..acab8bb0 100644 --- a/projects/ng-gallery/src/lib/models/config.model.ts +++ b/projects/ng-gallery/src/lib/models/config.model.ts @@ -1,50 +1,86 @@ import { InjectionToken, TemplateRef } from '@angular/core'; import { BezierEasingOptions } from '../smooth-scroll'; -export const GALLERY_CONFIG = new InjectionToken('GALLERY_CONFIG'); +export const GALLERY_CONFIG: InjectionToken = new InjectionToken('GALLERY_CONFIG'); -export interface GalleryConfig { - scrollBehavior?: ScrollBehavior; - navScrollBehavior?: ScrollBehavior; +type ImageSize = 'contain' | 'cover'; + +type Orientation = 'horizontal' | 'vertical'; + +type ThumbsPosition = 'top' | 'left' | 'right' | 'bottom'; + +type HorizontalPosition = 'top' | 'bottom'; + +type LoadingStrategy = 'preload' | 'lazy' | 'default'; + +type LoadingAttr = 'eager' | 'lazy'; + +interface ThumbConfig { + thumbs?: boolean; + thumbWidth?: number; + thumbHeight?: number; + thumbLoadingIcon?: string; + thumbLoadingError?: string; + disableThumbs?: boolean; + detachThumbs?: boolean; + thumbAutosize?: boolean; + disableThumbScroll?: boolean; + disableThumbMouseScroll?: boolean; + thumbCentralized?: boolean; + thumbPosition?: ThumbsPosition; + thumbImageSize?: ImageSize; + thumbTemplate?: TemplateRef; +} + +interface NavConfig { nav?: boolean; - dots?: boolean; - loop?: boolean; - thumb?: boolean; navIcon?: string; +} + +interface BulletsConfig { + bullets?: boolean; + disableBullets?: boolean; + bulletSize?: number; + bulletPosition?: HorizontalPosition; +} + +interface CounterConfig { counter?: boolean; - dotsSize?: number; - autoPlay?: boolean; - thumbWidth?: number; - thumbHeight?: number; + counterPosition?: HorizontalPosition; +} + +interface PlayerConfig { + autoplay?: boolean; + autoplayInterval?: number; +} + +interface SliderConfig { + loop?: boolean; + disableScroll?: boolean; + disableMouseScroll?: boolean; + itemAutosize?: boolean; + autoHeight?: boolean; loadingIcon?: string; loadingError?: string; - thumbLoadingIcon?: string; - thumbLoadingError?: string; - disableThumb?: boolean; - slidingDuration?: number; - slidingEase?: BezierEasingOptions; - slidingDisabled?: boolean; - thumbSlidingDisabled?: boolean; - mouseSlidingDisabled?: boolean; - thumbMouseSlidingDisabled?: boolean; - resizeDebounceTime?: number; - playerInterval?: number; + scrollDuration?: number; + scrollEase?: BezierEasingOptions; + orientation?: Orientation; + imageSize?: ImageSize; + loadingStrategy?: LoadingStrategy; + loadingAttr?: LoadingAttr; boxTemplate?: TemplateRef; itemTemplate?: TemplateRef; imageTemplate?: TemplateRef; - thumbTemplate?: TemplateRef; - thumbDetached?: boolean; - imageSize?: 'cover' | 'contain'; - thumbImageSize?: 'cover' | 'contain'; - dotsPosition?: 'top' | 'bottom'; - counterPosition?: 'top' | 'bottom'; - slidingDirection?: 'horizontal' | 'vertical'; - loadingStrategy?: 'preload' | 'lazy' | 'default'; - loadingAttr?: 'eager' | 'lazy'; - thumbPosition?: 'top' | 'left' | 'right' | 'bottom'; - thumbView?: 'default' | 'contain'; - thumbAutosize?: boolean; - itemAutosize?: boolean; - autoHeight?: boolean; +} + +export type GalleryConfig = SliderConfig + & ThumbConfig + & NavConfig + & BulletsConfig + & CounterConfig + & PlayerConfig + & { + scrollBehavior?: ScrollBehavior; + resizeDebounceTime?: number; debug?: boolean; } diff --git a/projects/ng-gallery/src/lib/models/constants.ts b/projects/ng-gallery/src/lib/models/constants.ts index 18caeda2..84c8e7ab 100644 --- a/projects/ng-gallery/src/lib/models/constants.ts +++ b/projects/ng-gallery/src/lib/models/constants.ts @@ -29,7 +29,7 @@ export enum ThumbnailsPosition { Bottom = 'bottom' } -export enum DotsPosition { +export enum BulletsPosition { Top = 'top', Bottom = 'bottom' } @@ -39,7 +39,7 @@ export enum CounterPosition { Bottom = 'bottom' } -export enum SlidingDirection { +export enum Orientation { Horizontal = 'horizontal', Vertical = 'vertical' } @@ -51,9 +51,4 @@ export enum GalleryItemTypes { Iframe = 'iframe' } -export enum ThumbnailsView { - Default = 'default', - Contain = 'contain', -} - export type GalleryItemType = GalleryItemTypes | string; diff --git a/projects/ng-gallery/src/lib/observers/active-item-observer.ts b/projects/ng-gallery/src/lib/observers/active-item-observer.ts new file mode 100644 index 00000000..229c210a --- /dev/null +++ b/projects/ng-gallery/src/lib/observers/active-item-observer.ts @@ -0,0 +1,40 @@ +import { Observable, Subscriber, mergeMap, filter, map } from 'rxjs'; + +export class ActiveItemObserver { + + observe(root: HTMLElement, elements: HTMLElement[], rootMargin: string): Observable { + return createIntersectionObserver(root, elements, rootMargin).pipe( + map((entry: IntersectionObserverEntry) => { + if (entry.isIntersecting) { + entry.target.classList.add('g-item-highlight'); + return +entry.target.getAttribute('galleryIndex'); + } else { + entry.target.classList.remove('g-item-highlight'); + return -1; + } + }), + filter((index: number) => index !== -1) + ); + } +} + +function createIntersectionObserver(root: HTMLElement, elements: HTMLElement[], rootMargin: string): Observable { + return new Observable((observer: Subscriber) => { + const intersectionObserver: IntersectionObserver = new IntersectionObserver( + (entries: IntersectionObserverEntry[]) => observer.next(entries), + { + root, + rootMargin, + threshold: 1 + } + ); + elements.forEach((element: HTMLElement) => intersectionObserver.observe(element)); + return () => { + elements.forEach((element: HTMLElement) => intersectionObserver.unobserve(element)); + intersectionObserver.disconnect(); + }; + }).pipe( + mergeMap((entries: IntersectionObserverEntry[]) => entries) + ); +} + diff --git a/projects/ng-gallery/src/lib/observers/item-intersection-observer.directive.ts b/projects/ng-gallery/src/lib/observers/item-intersection-observer.directive.ts new file mode 100644 index 00000000..02085b66 --- /dev/null +++ b/projects/ng-gallery/src/lib/observers/item-intersection-observer.directive.ts @@ -0,0 +1,77 @@ +import { Directive, Input, Output, OnChanges, OnDestroy, NgZone, EventEmitter } from '@angular/core'; +import { Subscription, combineLatest, filter, switchMap } from 'rxjs'; +import { GalleryConfig } from '../models/config.model'; +import { ActiveItemObserver } from './active-item-observer'; +import { resizeObservable } from '../utils/resize-observer'; +import { SliderAdapter } from '../components/adapters'; +import { GalleryItemComponent } from '../components/gallery-item.component'; +import { ItemState } from '../components/templates/items.model'; + +@Directive({ + selector: '[itemIntersectionObserver]', + standalone: true +}) +export class ItemIntersectionObserver implements OnChanges, OnDestroy { + + private _currentSubscription: Subscription; + + private _sensor: ActiveItemObserver = new ActiveItemObserver(); + + private get _viewport(): HTMLElement { + return this._item.nativeElement.parentElement.parentElement; + } + + @Input() adapter: SliderAdapter; + + @Input() config: GalleryConfig; + + @Input('itemIntersectionObserverDisabled') disabled: boolean; + + @Output() activeIndexChange: EventEmitter = new EventEmitter(); + + constructor(private _zone: NgZone, private _item: GalleryItemComponent) { + } + + ngOnChanges(): void { + (this.config.itemAutosize && !this.disabled) ? this._subscribe() : this._unsubscribe(); + } + + ngOnDestroy(): void { + this._unsubscribe(); + } + + private _subscribe(): void { + this._unsubscribe(); + + if (!!this.adapter) { + this._zone.runOutsideAngular(() => { + this._currentSubscription = combineLatest([ + resizeObservable(this._viewport), + resizeObservable(this._item.nativeElement) + ]).pipe( + switchMap(() => this._item.state$), + filter((state: ItemState) => state !== 'loading'), + switchMap(() => { + const rootMargin: string = this.adapter.getElementRootMargin(this._viewport, this._item.nativeElement); + if (this.config.debug) { + this._item.nativeElement.style.setProperty('--item-intersection-margin', `"VIEWPORT(${ this._viewport.clientWidth }x${ this._viewport.clientHeight }) ITEM(${ this._item.nativeElement.clientWidth }x${ this._item.nativeElement.clientHeight }) INTERSECTION(${ rootMargin })"`); + } + + return this._sensor.observe( + this._viewport, + [this._item.nativeElement], + rootMargin + ); + } + ) + ).subscribe((index: number) => { + this._zone.run(() => this.activeIndexChange.emit(index)); + }); + }); + } + } + + private _unsubscribe(): void { + this._currentSubscription?.unsubscribe(); + } +} diff --git a/projects/ng-gallery/src/lib/observers/slider-intersection-observer.directive.ts b/projects/ng-gallery/src/lib/observers/slider-intersection-observer.directive.ts new file mode 100644 index 00000000..10593d2c --- /dev/null +++ b/projects/ng-gallery/src/lib/observers/slider-intersection-observer.directive.ts @@ -0,0 +1,67 @@ +import { Directive, Input, Output, OnChanges, OnDestroy, NgZone, ElementRef, EventEmitter } from '@angular/core'; +import { skip, Subscription } from 'rxjs'; +import { GalleryConfig } from '../models/config.model'; +import { ActiveItemObserver } from './active-item-observer'; +import { SliderAdapter } from '../components/adapters'; +import { GalleryItemComponent } from '../components/gallery-item.component'; + +@Directive({ + selector: '[sliderIntersectionObserver]', + standalone: true +}) +export class SliderIntersectionObserver implements OnChanges, OnDestroy { + + private _currentSubscription: Subscription; + + private _sensor: ActiveItemObserver = new ActiveItemObserver(); + + private get _viewport(): HTMLElement { + return this._el.nativeElement; + } + + @Input() adapter: SliderAdapter; + + @Input() items: GalleryItemComponent[]; + + @Input() config: GalleryConfig; + + @Input('sliderIntersectionObserverDisabled') disabled: boolean; + + @Output() activeIndexChange: EventEmitter = new EventEmitter(); + + constructor(private _zone: NgZone, private _el: ElementRef) { + } + + ngOnChanges(): void { + (this.config.itemAutosize || this.disabled) ? this._unsubscribe() : this._subscribe(); + } + + ngOnDestroy(): void { + this._unsubscribe(); + } + + private _subscribe(): void { + this._unsubscribe(); + + if (!!this.adapter && !!this.items?.length) { + const rootMargin: string = this.adapter.getRootMargin(); + if (this.config.debug) { + this._viewport.style.setProperty('--intersection-margin', `"INTERSECTION(${ rootMargin })"`); + } + + this._zone.runOutsideAngular(() => { + this._currentSubscription = this._sensor.observe( + this._viewport, + this.items.map((item: GalleryItemComponent) => item.nativeElement), + rootMargin + ).subscribe((index: number) => { + this._zone.run(() => this.activeIndexChange.emit(index)); + }); + }); + } + } + + private _unsubscribe(): void { + this._currentSubscription?.unsubscribe(); + } +} diff --git a/projects/ng-gallery/src/lib/observers/slider-resize-observer.directive.ts b/projects/ng-gallery/src/lib/observers/slider-resize-observer.directive.ts new file mode 100644 index 00000000..2a20b979 --- /dev/null +++ b/projects/ng-gallery/src/lib/observers/slider-resize-observer.directive.ts @@ -0,0 +1,219 @@ +import { + Directive, + Input, + Output, + NgZone, + ElementRef, + AfterViewChecked, + OnInit, + OnChanges, + OnDestroy, + EventEmitter +} from '@angular/core'; +import { + Observable, + Subscription, + of, + tap, + take, + filter, + fromEvent, + switchMap, + debounceTime, + firstValueFrom, + distinctUntilChanged, + EMPTY, + animationFrameScheduler +} from 'rxjs'; +import { ImgManager } from '../utils/img-manager'; +import { resizeObservable } from '../utils/resize-observer'; +import { SliderAdapter } from '../components/adapters'; +import { Gallery } from '../services/gallery.service'; +import { GalleryRef } from '../services/gallery-ref'; +import { GalleryConfig } from '../models/config.model'; +import { GalleryState } from '../models/gallery.model'; + +@Directive({ + selector: '[sliderResizeObserver]', + standalone: true +}) +export class SliderResizeObserver implements AfterViewChecked, OnChanges, OnInit, OnDestroy { + + private _resizeObserver: ResizeObserver; + + private _autoHeightSubscription: Subscription; + + private _resizeSubscription: Subscription; + + private _shouldSkip: boolean; + + // Stream that emits after the transition to the new height is completed + private _afterHeightChanged$: Observable; + + private get _viewport(): HTMLElement { + return this._el.nativeElement; + } + + private get _galleryCore(): HTMLElement { + return this._el.nativeElement.parentElement.parentElement.parentElement; + } + + private get _isAutoHeight(): boolean { + return this.config.autoHeight && + !this.config.itemAutosize && + this.config.orientation === 'horizontal' && + (this.config.thumbPosition === 'top' || this.config.thumbPosition === 'bottom'); + } + + @Input() galleryId: string; + + @Input() adapter: SliderAdapter; + + @Input() config: GalleryConfig; + + @Output() isResizingChange: EventEmitter = new EventEmitter(); + + constructor(private _el: ElementRef, + private _zone: NgZone, + private _gallery: Gallery, + private _imgManager: ImgManager) { + } + + ngOnInit(): void { + const galleryRef: GalleryRef = this._gallery.ref(this.galleryId); + + // Check if height has transition for the auto-height feature + const transitionDuration: string = getComputedStyle(this._viewport).getPropertyValue('transition-duration'); + if (parseFloat(transitionDuration) === 0) { + this._afterHeightChanged$ = of(null); + } else { + this._afterHeightChanged$ = fromEvent(this._viewport, 'transitionend'); + } + + this._zone.runOutsideAngular(() => { + + // Detect if the size of the slider has changed detecting current index on scroll + this._resizeSubscription = resizeObservable(this._viewport, (observer: ResizeObserver) => this._resizeObserver = observer).pipe( + // Check if resize should skip due to re-observing the slider + filter(() => !this._shouldSkip || !(this._shouldSkip = false)), + // Immediately set visibility to hidden to avoid changing the active item caused by appearance of other items when size is expanded + tap(() => this.setResizingState()), + debounceTime(this.config.resizeDebounceTime, animationFrameScheduler), + tap(async (entry: ResizeObserverEntry) => { + // Update CSS variables with the proper values + this.updateSliderSize(); + + if (this._isAutoHeight) { + const img: HTMLImageElement = await firstValueFrom(this._imgManager.getActiveItem(galleryRef.state)); + // If img height is identical to the viewport height then skip + if (img.height === this._viewport.clientHeight) { + this.resetResizingState(); + } else { + // Unobserve the slider while the height is being changed + this.setResizingState({ unobserve: true }); + // Change the height + this._galleryCore.style.setProperty('--slider-height', `${ img.height }px`); + // Wait until height transition ends + await firstValueFrom(this._afterHeightChanged$); + this.resetResizingState({ + // Mark to skip first emit after re-observing the slider if height content rect height and client height are identical + shouldSkip: entry.contentRect.height === this._viewport.clientHeight, + observe: true + }); + } + } else { + requestAnimationFrame(() => this.resetResizingState({ shouldSkip: true })); + } + }) + ).subscribe(); + }); + } + + ngOnChanges(): void { + this._isAutoHeight ? this._subscribeAutoHeight() : this._unsubscribeAutoHeight(); + } + + ngOnDestroy(): void { + this._resizeSubscription?.unsubscribe(); + this._unsubscribeAutoHeight(); + } + + ngAfterViewChecked(): void { + this.updateSliderSize(); + } + + private updateSliderSize(): void { + // Update slider width and height CSS variables + this._galleryCore.style.setProperty('--slider-width', `${ this._viewport.clientWidth }px`); + + // Only update height if auto-height is false, because when it's true, another function will take care of it + if (!this.config.autoHeight) { + this._galleryCore.style.setProperty('--slider-height', `${ this._viewport.clientHeight }px`); + } + + this.updateCentralizeCSSVariables(); + } + + private updateCentralizeCSSVariables(): void { + if (this.config.itemAutosize) { + this._galleryCore.style.setProperty('--slider-centralize-start-size', `${ this.adapter.getCentralizerStartSize() }px`); + this._galleryCore.style.setProperty('--slider-centralize-end-size', `${ this.adapter.getCentralizerEndSize() }px`); + } + } + + private _subscribeAutoHeight(): void { + this._unsubscribeAutoHeight(); + + this._shouldSkip = false; + this._zone.runOutsideAngular(() => { + + const galleryRef: GalleryRef = this._gallery.ref(this.galleryId); + + // TODO: Why is galleryRef.state emits when screen size changes? + const state: Observable = galleryRef.state.pipe(distinctUntilChanged((a: GalleryState, b: GalleryState) => a.currIndex === b.currIndex)) + this._autoHeightSubscription = this._imgManager.getActiveItem(state).pipe( + switchMap((img: HTMLImageElement) => { + this.setResizingState({ unobserve: true }); + this._galleryCore.style.setProperty('--slider-height', `${ img.clientHeight }px`); + + // Check if the new item height is equal to the current height, there will be no transition, + // So reset resizing state + if (img.height === this._viewport.clientHeight) { + this.resetResizingState({ shouldSkip: true, observe: true }); + return EMPTY; + } + return this._afterHeightChanged$.pipe( + tap(() => this.resetResizingState({ shouldSkip: true, observe: true })), + take(1) + ); + }) + ).subscribe(); + }); + } + + private _unsubscribeAutoHeight(): void { + this._autoHeightSubscription?.unsubscribe(); + } + + private setResizingState({ unobserve }: { unobserve?: boolean } = {}): void { + this._zone.run(() => { + this.isResizingChange.emit(true); + }) + this._viewport.classList.add('g-resizing'); + if (unobserve) { + // Unobserve the slider while the height is being changed + this._resizeObserver.unobserve(this._viewport); + } + } + + private resetResizingState({ shouldSkip, observe }: { shouldSkip?: boolean, observe?: boolean } = {}): void { + this._zone.run(() => { + this.isResizingChange.emit(false); + }) + this._viewport.classList.remove('g-resizing'); + this._shouldSkip = shouldSkip; + if (observe) { + this._resizeObserver.observe(this._viewport); + } + } +} diff --git a/projects/ng-gallery/src/lib/observers/thumb-resize-observer.directive.ts b/projects/ng-gallery/src/lib/observers/thumb-resize-observer.directive.ts new file mode 100644 index 00000000..2952d096 --- /dev/null +++ b/projects/ng-gallery/src/lib/observers/thumb-resize-observer.directive.ts @@ -0,0 +1,65 @@ +import { + Directive, + Input, + Output, + OnInit, + OnChanges, + OnDestroy, + NgZone, + ElementRef, + SimpleChanges, + EventEmitter +} from '@angular/core'; +import { Subscription, tap, auditTime, animationFrameScheduler, debounceTime } from 'rxjs'; +import { resizeObservable } from '../utils/resize-observer'; +import { GalleryConfig } from '../models/config.model'; +import { SliderAdapter } from '../components/adapters'; + +@Directive({ + selector: '[thumbResizeObserver]', + standalone: true +}) +export class ThumbResizeObserver implements OnChanges, OnInit, OnDestroy { + + private _resizeSubscription: Subscription; + + private get _viewport(): HTMLElement { + return this._el.nativeElement; + } + + @Input() config: GalleryConfig; + + @Input() adapter: SliderAdapter; + + @Output('thumbResizeObserver') resized: EventEmitter = new EventEmitter(); + + constructor(private _el: ElementRef, private _zone: NgZone) { + } + + ngOnInit(): void { + this._zone.runOutsideAngular(() => { + this._resizeSubscription = resizeObservable(this._viewport).pipe( + debounceTime(this.config.resizeDebounceTime, animationFrameScheduler), + tap(() => { + this.updateSliderSize(); + this.resized.emit(); + }) + ).subscribe(); + }); + } + + ngOnChanges(changes: SimpleChanges): void { + if (!changes.config.firstChange) { + this.updateSliderSize(); + } + } + + ngOnDestroy(): void { + this._resizeSubscription?.unsubscribe(); + } + + private updateSliderSize(): void { + this._viewport.style.setProperty('--thumb-centralize-start-size', this.adapter.getCentralizerStartSize() + 'px'); + this._viewport.style.setProperty('--thumb-centralize-end-size', this.adapter.getCentralizerEndSize() + 'px'); + } +} diff --git a/projects/ng-gallery/src/lib/services/gallery-ref.ts b/projects/ng-gallery/src/lib/services/gallery-ref.ts index 6dcde27b..e8110af8 100644 --- a/projects/ng-gallery/src/lib/services/gallery-ref.ts +++ b/projects/ng-gallery/src/lib/services/gallery-ref.ts @@ -1,4 +1,4 @@ -import { BehaviorSubject, Subject, Observable, of, EMPTY, delay, filter, switchMap, tap } from 'rxjs'; +import { BehaviorSubject, Subject, Observable, filter } from 'rxjs'; import { defaultState } from '../utils/gallery.default'; import { GalleryError, GalleryItem, GalleryState } from '../models/gallery.model'; import { GalleryConfig } from '../models/config.model'; @@ -27,13 +27,13 @@ export class GalleryRef { private readonly _config: BehaviorSubject; /** Stream that emits on item click */ - readonly itemClick = new Subject(); + readonly itemClick: Subject = new Subject(); /** Stream that emits on thumbnail click */ - readonly thumbClick = new Subject(); + readonly thumbClick: Subject = new Subject(); /** Stream that emits on an error occurs */ - readonly error = new Subject(); + readonly error: Subject = new Subject(); /** Gallery Events */ @@ -71,11 +71,6 @@ export class GalleryRef { return this.state.pipe(filterActions([GalleryAction.PLAY, GalleryAction.STOP])); } - /** Stream that emits when the player should start or stop */ - private get playerActions(): Observable { - return this.state.pipe(filterActions([GalleryAction.PLAY, GalleryAction.STOP, GalleryAction.INDEX_CHANGED])); - } - constructor(config: GalleryConfig, private deleteInstance: () => void) { this._state = new BehaviorSubject(defaultState); this._config = new BehaviorSubject(config); @@ -83,20 +78,6 @@ export class GalleryRef { this.config = this._config.asObservable(); } - /** - * Activate player actions listener - */ - activatePlayer(): Observable { - return this.playerActions.pipe( - switchMap((e: GalleryState) => - e.isPlaying ? of({}).pipe( - delay(this._config.value.playerInterval), - tap(() => this.next(this._config.value.scrollBehavior)) - ) : EMPTY - ) - ); - } - /** * Set gallery state */ @@ -230,9 +211,9 @@ export class GalleryRef { */ play(interval?: number): void { if (interval) { - this.setConfig({ playerInterval: interval }); + this.setConfig({ autoplayInterval: interval }); } - this.setState({ action: GalleryAction.PLAY, isPlaying: true }); + this.setState({ action: GalleryAction.PLAY, behavior: 'auto', isPlaying: true }); } /** diff --git a/projects/ng-gallery/src/lib/services/gallery.service.ts b/projects/ng-gallery/src/lib/services/gallery.service.ts index b736a38e..0a8df755 100644 --- a/projects/ng-gallery/src/lib/services/gallery.service.ts +++ b/projects/ng-gallery/src/lib/services/gallery.service.ts @@ -26,9 +26,9 @@ export class Gallery { */ ref(id = 'root', config?: GalleryConfig): GalleryRef { if (this._instances.has(id)) { - const galleryRef = this._instances.get(id); + const galleryRef: GalleryRef = this._instances.get(id); if (config) { - galleryRef.setConfig({ ...this.config, ...config }); + galleryRef.setConfig(config); } return galleryRef; } else { diff --git a/projects/ng-gallery/src/lib/smooth-scroll/index.ts b/projects/ng-gallery/src/lib/smooth-scroll/index.ts index 78e4f35f..a50b17ce 100644 --- a/projects/ng-gallery/src/lib/smooth-scroll/index.ts +++ b/projects/ng-gallery/src/lib/smooth-scroll/index.ts @@ -1,2 +1,2 @@ -export * from './smooth-scroll-manager'; +export * from './smooth-scroll.directive'; export * from './smooth-scroll.model'; diff --git a/projects/ng-gallery/src/lib/smooth-scroll/smooth-scroll-manager.ts b/projects/ng-gallery/src/lib/smooth-scroll/smooth-scroll-manager.ts deleted file mode 100644 index 4abac4e0..00000000 --- a/projects/ng-gallery/src/lib/smooth-scroll/smooth-scroll-manager.ts +++ /dev/null @@ -1,245 +0,0 @@ -import { ElementRef, Inject, Optional, Injectable } from '@angular/core'; -import { DOCUMENT } from '@angular/common'; -import { coerceElement } from '@angular/cdk/coercion'; -import { getRtlScrollAxisType, Platform, RtlScrollAxisType } from '@angular/cdk/platform'; -import { _Bottom, _Left, _Right, _Top, _Without } from '@angular/cdk/scrolling'; -import { Observable, Subject, Subscriber, fromEvent, merge, of, expand, finalize, take, takeUntil, takeWhile } from 'rxjs'; -import BezierEasing from './bezier-easing'; -import { - SMOOTH_SCROLL_OPTIONS, - SmoothScrollElement, - SmoothScrollStep, - SmoothScrollToElementOptions, - SmoothScrollToOptions -} from './smooth-scroll.model'; - -// @dynamic -@Injectable({ - providedIn: 'root' -}) -export class SmoothScrollManager { - - // Default options - private readonly _defaultOptions: SmoothScrollToOptions; - - // Keeps track of the ongoing SmoothScroll functions, so they can be handled in case of duplication. - // Each scrolled element gets a destroyer stream which gets deleted immediately after it completes. - // Purpose: If user called a scroll function again on the same element before the scrolls completes, - // it cancels the ongoing scroll and starts a new one - private _onGoingScrolls = new Map>(); - - private get _w(): Window { - return this._document.defaultView; - } - - /** - * Timing method - */ - private get _now(): () => number { - return this._w.performance?.now?.bind(this._w.performance) || Date.now; - } - - constructor(@Inject(DOCUMENT) private _document: Document, - @Optional() @Inject(SMOOTH_SCROLL_OPTIONS) customDefaultOptions: SmoothScrollToOptions, - private _platform: Platform) { - this._defaultOptions = { - duration: 468, - easing: { - x1: 0.42, - y1: 0, - x2: 0.58, - y2: 1 - }, - ...customDefaultOptions, - }; - } - - /** - * changes scroll position inside an element - */ - private _scrollElement(el: HTMLElement, x: number, y: number): void { - el.scrollLeft = x; - el.scrollTop = y; - } - - /** - * Handles a given parameter of type HTMLElement, ElementRef or selector - */ - private _getElement(el: HTMLElement | ElementRef | string, parent?: HTMLElement): HTMLElement { - if (typeof el === 'string') { - return (parent || this._document).querySelector(el); - } - return coerceElement(el); - } - - /** - * Initializes a destroyer stream, re-initializes it if the element is already being scrolled - */ - private _initSmoothScroll(el: HTMLElement): Subject { - if (this._onGoingScrolls.has(el)) { - this._onGoingScrolls.get(el).next(); - } - return this._onGoingScrolls.set(el, new Subject()).get(el)!; - } - - /** - * Checks if smooth scroll has reached, cleans up the smooth scroll stream and resolves its promise - */ - private _isFinished(context: SmoothScrollStep, destroyed: Subject, resolve: () => void): boolean { - if (context.currentX !== context.x || context.currentY !== context.y) { - return true; - } - destroyed.next(); - resolve(); - return false; - } - - /** - * Terminates an ongoing smooth scroll - */ - private _interrupted(el: HTMLElement, destroyed: Subject): Observable { - return merge( - fromEvent(el, 'wheel', { passive: true, capture: true }), - fromEvent(el, 'touchmove', { passive: true, capture: true }), - destroyed - ).pipe(take(1)); - } - - /** - * Deletes the destroyer function, runs if the smooth scroll has finished or interrupted - */ - private _destroy(el: HTMLElement, destroyed: Subject): void { - destroyed.complete(); - this._onGoingScrolls.delete(el); - } - - /** - * A function called recursively that, given a context, steps through scrolling - */ - private _step(context: SmoothScrollStep): Observable { - return new Observable((subscriber: Subscriber) => { - let elapsed = (this._now() - context.startTime) / context.duration; - - // avoid elapsed times higher than one - elapsed = elapsed > 1 ? 1 : elapsed; - - // apply easing to elapsed time - const value = context.easing(elapsed); - - context.currentX = context.startX + (context.x - context.startX) * value; - context.currentY = context.startY + (context.y - context.startY) * value; - - this._scrollElement(context.scrollable, context.currentX, context.currentY); - // Proceed to the step - requestAnimationFrame(() => subscriber.next(context)); - }); - } - - private _applyScrollToOptions(el: HTMLElement, options: SmoothScrollToOptions): Promise { - if (!options.duration) { - this._scrollElement(el, options.left, options.top); - return Promise.resolve(); - } - - // Initialize a destroyer stream, reinitialize it if the element is already being scrolled - const destroyed: Subject = this._initSmoothScroll(el); - - const context: SmoothScrollStep = { - scrollable: el, - startTime: this._now(), - startX: el.scrollLeft, - startY: el.scrollTop, - x: options.left == null ? el.scrollLeft : ~~options.left, - y: options.top == null ? el.scrollTop : ~~options.top, - duration: options.duration, - easing: BezierEasing(options.easing.x1, options.easing.y1, options.easing.x2, options.easing.y2) - }; - - return new Promise(resolve => { - // Scroll each step recursively - of(null).pipe( - expand(() => this._step(context).pipe( - takeWhile((currContext: SmoothScrollStep) => this._isFinished(currContext, destroyed, resolve)) - )), - takeUntil(this._interrupted(el, destroyed)), - finalize(() => this._destroy(el, destroyed)) - ).subscribe(); - }); - } - - /** - * Dismiss an ongoing scroll - * @param el - */ - dismissOngoingScroll(el: HTMLElement): void { - this._onGoingScrolls.get(el)?.next(); - } - - - /** - * Scrolls to the specified offsets. This is a normalized version of the browser's native scrollTo - * method, since browsers are not consistent about what scrollLeft means in RTL. For this method - * left and right always refer to the left and right side of the scrolling container irrespective - * of the layout direction. start and end refer to left and right in an LTR context and vice-versa - * in an RTL context. - * @param scrollable element - * @param customOptions specified the offsets to scroll to. - */ - scrollTo(scrollable: SmoothScrollElement, customOptions: SmoothScrollToOptions): Promise { - if (this._platform.isBrowser) { - const el: HTMLElement = this._getElement(scrollable); - const isRtl: boolean = getComputedStyle(el).direction === 'rtl'; - const rtlScrollAxisType: RtlScrollAxisType = getRtlScrollAxisType(); - - const options: SmoothScrollToOptions = { - ...(this._defaultOptions as _Without<_Bottom & _Top>), - ...customOptions, - ...({ - // Rewrite start & end offsets as right or left offsets. - left: customOptions.left == null ? (isRtl ? customOptions.end : customOptions.start) : customOptions.left, - right: customOptions.right == null ? (isRtl ? customOptions.start : customOptions.end) : customOptions.right - } as _Without<_Bottom & _Top>) - }; - - // Rewrite the bottom offset as a top offset. - if (options.bottom != null) { - (options as _Without<_Bottom> & _Top).top = el.scrollHeight - el.clientHeight - options.bottom; - } - - // Rewrite the right offset as a left offset. - if (isRtl && rtlScrollAxisType !== RtlScrollAxisType.NORMAL) { - if (options.left != null) { - (options as _Without<_Left> & _Right).right = el.scrollWidth - el.clientWidth - options.left; - } - - if (rtlScrollAxisType === RtlScrollAxisType.INVERTED) { - options.left = options.right; - } else if (rtlScrollAxisType === RtlScrollAxisType.NEGATED) { - options.left = options.right ? -options.right : options.right; - } - } else { - if (options.right != null) { - (options as _Without<_Right> & _Left).left = el.scrollWidth - el.clientWidth - options.right; - } - } - return this._applyScrollToOptions(el, options); - } - return Promise.resolve(); - } - - /** - * Scroll to element by reference or selector - */ - scrollToElement(scrollable: SmoothScrollElement, target: SmoothScrollElement, customOptions: SmoothScrollToElementOptions = {}): Promise { - const scrollableEl: HTMLElement = this._getElement(scrollable); - const targetEl: HTMLElement = this._getElement(target, scrollableEl); - const options: SmoothScrollToOptions = { - ...customOptions, - ...{ - left: targetEl.offsetLeft + (customOptions.left || 0), - top: targetEl.offsetTop + (customOptions.top || 0) - } - }; - return targetEl ? this.scrollTo(scrollableEl, options) : Promise.resolve(); - } -} diff --git a/projects/ng-gallery/src/lib/smooth-scroll/smooth-scroll.directive.ts b/projects/ng-gallery/src/lib/smooth-scroll/smooth-scroll.directive.ts new file mode 100644 index 00000000..733c5e9b --- /dev/null +++ b/projects/ng-gallery/src/lib/smooth-scroll/smooth-scroll.directive.ts @@ -0,0 +1,275 @@ +import { + Directive, + Inject, + Input, + Output, + NgZone, + OnInit, + OnDestroy, + ElementRef, + EventEmitter +} from '@angular/core'; +import { DOCUMENT } from '@angular/common'; +import { Dir } from '@angular/cdk/bidi'; +import { _Bottom, _Left, _Right, _Top, _Without } from '@angular/cdk/scrolling'; +import { getRtlScrollAxisType, RtlScrollAxisType } from '@angular/cdk/platform'; +import { + Observable, + Subject, + Subscriber, + Subscription, + of, + take, + merge, + expand, + fromEvent, + switchMap, + takeUntil, + takeWhile, + finalize +} from 'rxjs'; +import BezierEasing from './bezier-easing'; +import { GalleryConfig } from '../models/config.model'; +import { SmoothScrollOptions, SmoothScrollStep, SmoothScrollToOptions } from './index'; +import { SliderAdapter } from '../components/adapters'; + +declare const Hammer: any; + +@Directive({ + selector: '[smoothScroll]', + standalone: true, + providers: [Dir] +}) +export class SmoothScroll implements OnInit, OnDestroy { + + /** HammerJS instance */ + private _hammer: any; + + private readonly _scrollController: Subject = new Subject(); + + private readonly _finished: Subject = new Subject(); + + private readonly _el: HTMLElement; + + private _isInterruptedByMouse: boolean; + + private _subscription: Subscription; + + private get _w(): Window { + return this._document.defaultView; + } + + /** + * Timing method + */ + private get _now(): () => number { + return this._w.performance?.now?.bind(this._w.performance) || Date.now; + } + + @Input() + set smoothScroll(value: SmoothScrollOptions) { + if (value) { + this._zone.runOutsideAngular(() => { + this.scrollTo(value); + }); + } + } + + @Input() adapter: SliderAdapter; + + @Input() config: GalleryConfig; + + @Input('smoothScrollInterruptOnMousemove') interruptOnMousemove: boolean; + + @Output() isScrollingChange: EventEmitter = new EventEmitter(); + + constructor(@Inject(DOCUMENT) private _document: Document, + private _zone: NgZone, + private _dir: Dir, + _el: ElementRef) { + this._el = _el.nativeElement; + } + + ngOnInit(): void { + this._subscription = this._scrollController.pipe( + switchMap((context: SmoothScrollStep) => { + this._zone.run(() => { + this.isScrollingChange.emit(true); + }); + + this._el.classList.add('g-scrolling'); + this._el.style.setProperty('--slider-scroll-snap-type', 'none'); + + // Scroll each step recursively + return of(null).pipe( + expand(() => this._step(context).pipe( + takeWhile((currContext: SmoothScrollStep) => this._isFinished(currContext)), + takeUntil(this._finished) + )), + finalize(() => this.resetElement()), + takeUntil(this._interrupted()), + ); + }) + ).subscribe(); + } + + ngOnDestroy(): void { + this._subscription?.unsubscribe(); + this._scrollController.complete(); + } + + /** + * changes scroll position inside an element + */ + private _scrollElement(x: number, y: number): void { + this._el.scrollLeft = x; + this._el.scrollTop = y; + } + + private resetElement(): void { + this._zone.run(() => { + this.isScrollingChange.emit(false); + }); + + this._el.classList.remove('g-scrolling'); + if (!this._isInterruptedByMouse) { + this._el.style.setProperty('--slider-scroll-snap-type', this.adapter.scrollSnapType); + } + this._isInterruptedByMouse = false; + } + + /** + * Checks if smooth scroll has reached, cleans up the smooth scroll stream and resolves its promise + */ + private _isFinished(context: SmoothScrollStep): boolean { + if (context.currentX !== context.x || context.currentY !== context.y) { + return true; + } + this._finished.next(); + return false; + } + + /** + * Terminates an ongoing smooth scroll + */ + private _interrupted(): Observable { + let interrupt$: Observable; + if (this.interruptOnMousemove && typeof Hammer !== 'undefined') { + this._hammer = new Hammer(this._el, { inputClass: Hammer.MouseInput }); + this._hammer.get('pan').set({ direction: this.adapter.hammerDirection }); + + // For gallery thumb slider, dragging thumbnails should cancel the ongoing scroll + interrupt$ = merge( + new Observable((subscriber: Subscriber) => { + this._hammer.on('panstart', () => { + this._isInterruptedByMouse = true; + subscriber.next(); + subscriber.complete(); + }); + return () => { + this._hammer.destroy(); + } + }), + fromEvent(this._el, 'wheel', { passive: true, capture: true }), + fromEvent(this._el, 'touchmove', { passive: true, capture: true }), + ) + } else { + interrupt$ = merge( + fromEvent(this._el, 'wheel', { passive: true, capture: true }), + fromEvent(this._el, 'touchmove', { passive: true, capture: true }), + ) + } + return interrupt$.pipe(take(1)); + } + + /** + * A function called recursively that, given a context, steps through scrolling + */ + private _step(context: SmoothScrollStep): Observable { + return new Observable((subscriber: Subscriber) => { + let elapsed: number = (this._now() - context.startTime) / context.duration; + + // avoid elapsed times higher than one + elapsed = elapsed > 1 ? 1 : elapsed; + + // apply easing to elapsed time + const value: number = context.easing(elapsed); + + context.currentX = context.startX + (context.x - context.startX) * value; + context.currentY = context.startY + (context.y - context.startY) * value; + + this._scrollElement(context.currentX, context.currentY); + // Proceed to the step + requestAnimationFrame(() => { + subscriber.next(context); + subscriber.complete(); + }); + }); + } + + private _applyScrollToOptions(options: SmoothScrollToOptions): void { + if (!options.duration) { + this._scrollElement(options.left, options.top); + } + + const context: SmoothScrollStep = { + scrollable: this._el, + startTime: this._now(), + startX: this._el.scrollLeft, + startY: this._el.scrollTop, + x: options.left == null ? this._el.scrollLeft : ~~options.left, + y: options.top == null ? this._el.scrollTop : ~~options.top, + duration: options.duration, + easing: BezierEasing(options.easing.x1, options.easing.y1, options.easing.x2, options.easing.y2) + }; + + this._scrollController.next(context); + } + + /** + * Scrolls to the specified offsets. This is a normalized version of the browser's native scrollTo + * method, since browsers are not consistent about what scrollLeft means in RTL. For this method + * left and right always refer to the left and right side of the scrolling container irrespective + * of the layout direction. start and end refer to left and right in an LTR context and vice-versa + * in an RTL context. + * @param params specified the offsets to scroll to. + */ + scrollTo(params: SmoothScrollOptions): void { + const isRtl: boolean = this._dir.value === 'rtl'; + const rtlScrollAxisType: RtlScrollAxisType = getRtlScrollAxisType(); + + const options: SmoothScrollToOptions = { + ...params, + ...({ + // Rewrite start & end offsets as right or left offsets. + left: params.left == null ? (isRtl ? params.end : params.start) : params.left, + right: params.right == null ? (isRtl ? params.start : params.end) : params.right + } as _Without<_Bottom & _Top>), + duration: params.behavior === 'smooth' ? this.config.scrollDuration : 0, + easing: this.config.scrollEase, + }; + + // Rewrite the bottom offset as a top offset. + if (options.bottom != null) { + (options as _Without<_Bottom> & _Top).top = this._el.scrollHeight - this._el.clientHeight - options.bottom; + } + + // Rewrite the right offset as a left offset. + if (isRtl && rtlScrollAxisType !== RtlScrollAxisType.NORMAL) { + if (options.left != null) { + (options as _Without<_Left> & _Right).right = this._el.scrollWidth - this._el.clientWidth - options.left; + } + + if (rtlScrollAxisType === RtlScrollAxisType.INVERTED) { + options.left = options.right; + } else if (rtlScrollAxisType === RtlScrollAxisType.NEGATED) { + options.left = options.right ? -options.right : options.right; + } + } else { + if (options.right != null) { + (options as _Without<_Right> & _Left).left = this._el.scrollWidth - this._el.clientWidth - options.right; + } + } + return this._applyScrollToOptions(options); + } +} diff --git a/projects/ng-gallery/src/lib/smooth-scroll/smooth-scroll.model.ts b/projects/ng-gallery/src/lib/smooth-scroll/smooth-scroll.model.ts index f75be2a2..2d8dc9ab 100644 --- a/projects/ng-gallery/src/lib/smooth-scroll/smooth-scroll.model.ts +++ b/projects/ng-gallery/src/lib/smooth-scroll/smooth-scroll.model.ts @@ -1,18 +1,13 @@ -import { ElementRef, InjectionToken } from '@angular/core'; -import { _Left, _Top, _XAxis, _YAxis } from '@angular/cdk/scrolling'; +import { _XAxis, _YAxis } from '@angular/cdk/scrolling'; -export const SMOOTH_SCROLL_OPTIONS = new InjectionToken('SMOOTH_SCROLL_OPTIONS'); - -export type SmoothScrollElement = HTMLElement | ElementRef | string; - -export type SmoothScrollToOptions = _XAxis & _YAxis & SmoothScrollOptions; - -export type SmoothScrollToElementOptions = _Top & _Left & SmoothScrollOptions; +export type SmoothScrollOptions = _XAxis & _YAxis & { + behavior?: ScrollBehavior; +} -export interface SmoothScrollOptions { +export type SmoothScrollToOptions = _XAxis & _YAxis & { duration?: number; easing?: BezierEasingOptions; -} +}; export interface SmoothScrollStep { scrollable: HTMLElement; diff --git a/projects/ng-gallery/src/lib/styles/core.scss b/projects/ng-gallery/src/lib/styles/core.scss deleted file mode 100644 index 0dcad846..00000000 --- a/projects/ng-gallery/src/lib/styles/core.scss +++ /dev/null @@ -1,163 +0,0 @@ -::ng-deep { - gallery { - position: relative; - z-index: 1; - overflow: hidden; - display: flex; - justify-content: center; - align-items: center; - background-color: black; - --g-height-transition: height 400ms linear; - --g-nav-drop-shadow: drop-shadow(0 0 2px rgba(0, 0, 0, 0.6)); - --g-box-shadow: 0 0 3px rgba(0, 0, 0, 0.6); - --g-font-color: #000; - --g-overlay-color: #fff; - - * { - box-sizing: border-box; - } - } - - gallery, - gallery-core { - position: relative; - overflow: hidden; - } - - gallery-core { - max-height: 100%; - min-height: 100%; - height: 500px; - } - - gallery-core, - .g-box, - .g-slider { - display: flex; - width: 100%; - max-height: 100%; - } - - .g-box, - gallery-slider { - overflow: hidden; - position: relative; - display: flex; - flex-direction: column; - order: 1; - flex: 1; - } - - gallery-core[autoHeight='true'] { - &[thumbPosition='top'], - &[thumbPosition='bottom'] { - // if auto-height, use fit-content - height: fit-content !important; - - .g-slider { - height: 100%; - } - - gallery-slider, gallery-core { - height: 100%; - } - } - - gallery-item { - min-height: 100%; - } - } - - - gallery-core[autoHeight='true'] { - &[slidingDirection='horizontal'] { - gallery-item { - //height: 100%; - height: unset; - max-height: unset; - min-height: unset; - - gallery-image { - height: 100%; - width: auto; - } - } - } - - &[slidingDirection='vertical'] { - gallery-item { - // Allow getting the real image height - height: unset; - max-height: unset; - min-height: unset; - - gallery-image { - width: 100%; - height: auto; - } - } - } - } - - gallery-core[autoHeight='false'] { - &[slidingDirection='horizontal'] { - gallery-item, .g-slider { - height: 100%; - } - } - } - - gallery-core[itemAutoSize='true'] { - &[slidingDirection='horizontal'] { - gallery-item { - gallery-image { - height: 100%; - width: auto; - } - } - } - - &[slidingDirection='vertical'] { - gallery-item { - // Allow getting the real image height - height: auto; - - gallery-image { - width: 100%; - height: auto; - } - } - } - } - - gallery-core[debug='true'] { - gallery-slider { - &:after, &:before { - position: absolute; - content: ''; - background: lime; - box-shadow: 0 0 5px lime; - z-index: 99999; - } - - &:before { - width: 100%; - height: 1px; - } - - &:after { - height: 100%; - width: 1px; - } - - gallery-item { - outline: 1px solid darkorange; - } - } - } - - .g-box-template { - position: absolute; - z-index: 10; - } -} diff --git a/projects/ng-gallery/src/lib/styles/counter.scss b/projects/ng-gallery/src/lib/styles/counter.scss deleted file mode 100644 index 2fce938e..00000000 --- a/projects/ng-gallery/src/lib/styles/counter.scss +++ /dev/null @@ -1,33 +0,0 @@ -::ng-deep { - gallery-core[counterPosition='top'] .g-counter { - top: 0; - border-bottom-left-radius: 4px; - border-bottom-right-radius: 4px; - } - - gallery-core[counterPosition='bottom'] .g-counter { - bottom: 0; - border-top-left-radius: 4px; - border-top-right-radius: 4px; - } - - .g-counter { - font-weight: bold; - user-select: none; - opacity: 0.6; - transition: opacity linear 150ms; - z-index: 50; - position: absolute; - left: 50%; - transform: translateX(-50%) perspective(1px); - font-size: 12px; - padding: 4px 10px; - color: var(--g-font-color); - background-color: var(--g-overlay-color); - box-shadow: var(--g-box-shadow); - - &:hover { - opacity: 0.8; - } - } -} diff --git a/projects/ng-gallery/src/lib/styles/debug.scss b/projects/ng-gallery/src/lib/styles/debug.scss new file mode 100644 index 00000000..6d60c5fa --- /dev/null +++ b/projects/ng-gallery/src/lib/styles/debug.scss @@ -0,0 +1,128 @@ +:host[debug='true'] { + ::ng-deep { + .g-sliding, .g-resizing, .g-scrolling { + gallery-item.g-item-highlight { + visibility: hidden; + } + } + } + + ::ng-deep { + gallery-slider { + &:after, &:before { + position: absolute; + content: ''; + z-index: 12; + } + + &:before { + width: 100%; + height: 0; + border-top: 1px dashed lime; + } + + &:after { + height: 100%; + width: 0; + border-left: 1px dashed lime; + } + + gallery-item { + outline: 1px solid darkorange; + + &.g-item-highlight { + &:after { + content: ''; + position: absolute; + width: 100%; + height: 100%; + border: 3px solid lime; + box-sizing: border-box; + z-index: 10; + } + } + } + } + + .g-sliding { + .g-slider-sliding { + display: block; + } + } + + .g-scrolling { + .g-slider-scrolling { + display: block; + } + } + + .g-resizing { + .g-slider-resizing { + display: block; + } + } + + .g-slider-debug { + position: absolute; + top: 0; + left: 0; + display: flex; + gap: 5px; + padding: 10px; + + .g-slider-resizing { + background: rgba(245, 76, 40); + } + + .g-slider-scrolling { + background: rgb(255, 133, 36); + } + + .g-slider-sliding { + background: rgb(31, 108, 185); + } + + div, &:before { + display: none; + color: white; + font-family: monospace; + z-index: 12; + padding: 2px 6px; + border-radius: 3px; + } + } + } + + &[itemAutoSize='false'] { + ::ng-deep { + .g-slider-debug { + &:before { + content: var(--intersection-margin); + background: rgba(236, 236, 236, 0.84); + color: #363636; + display: block; + } + } + } + } + + &[itemAutoSize='true'] { + ::ng-deep { + gallery-item { + &:before { + position: absolute; + margin: 10px; + content: var(--item-intersection-margin); + background: rgba(236, 236, 236, 0.84); + color: #363636; + display: block; + width: 270px; + font-family: monospace; + z-index: 12; + padding: 2px 6px; + border-radius: 3px; + } + } + } + } +} diff --git a/projects/ng-gallery/src/lib/styles/dots.scss b/projects/ng-gallery/src/lib/styles/dots.scss deleted file mode 100644 index 8ee49fc5..00000000 --- a/projects/ng-gallery/src/lib/styles/dots.scss +++ /dev/null @@ -1,48 +0,0 @@ -::ng-deep { - gallery-core[dotsPosition='top'] gallery-dots { - top: 15px; - } - - gallery-core[dotsPosition='bottom'] gallery-dots { - bottom: 15px; - } - - gallery-dots { - position: absolute; - left: 50%; - z-index: 99; - transform: translateX(-50%); - display: flex; - gap: 6px; - } - - .g-dot { - cursor: pointer; - z-index: 20; - - &:hover .g-dot-inner { - opacity: 1; - } - } - - .g-dot-active .g-dot-inner { - opacity: 1; - } - - .g-dot-inner { - background-color: var(--g-overlay-color); - opacity: 0.4; - width: 100%; - height: 100%; - border-radius: 50%; - transition: opacity linear 150ms; - } - - gallery-dots, - .g-dot, - .g-dot-inner { - display: flex; - justify-content: center; - align-items: center; - } -} diff --git a/projects/ng-gallery/src/lib/styles/gallery.scss b/projects/ng-gallery/src/lib/styles/gallery.scss deleted file mode 100644 index b70e6c70..00000000 --- a/projects/ng-gallery/src/lib/styles/gallery.scss +++ /dev/null @@ -1,7 +0,0 @@ -@import 'dots'; -@import 'navigations'; -@import 'slider'; -@import 'thumbnails'; -@import 'counter'; -@import 'templates'; -@import 'core'; diff --git a/projects/ng-gallery/src/lib/styles/navigations.scss b/projects/ng-gallery/src/lib/styles/navigations.scss deleted file mode 100644 index dd5a1ba8..00000000 --- a/projects/ng-gallery/src/lib/styles/navigations.scss +++ /dev/null @@ -1,52 +0,0 @@ -::ng-deep { - .g-nav-next, - .g-nav-prev { - position: absolute; - top: 50%; - display: flex; - padding: 16px 8px; - cursor: pointer; - z-index: 999; - opacity: 0.6; - transition: opacity linear 150ms, right linear 150ms, left linear 150ms; - - &:hover { - opacity: 1; - } - - svg { - filter: var(--g-nav-drop-shadow); - width: 28px; - height: 28px; - fill: #fff; - } - } - - .g-nav-next { - right: 0.5em; - transform: translateY(-50%) perspective(1px); - - &:hover { - right: 0.4em; - } - } - - .g-nav-prev { - left: 0.5em; - transform: translateY(-50%) perspective(1px) scale(-1, -1); //invert icon horizontally - - &:hover { - left: 0.4em; - } - } - - @media only screen and (max-width: 480px) { - .g-nav-next { - right: 0.2em; - } - - .g-nav-prev { - left: 0.2em; - } - } -} diff --git a/projects/ng-gallery/src/lib/styles/slider.scss b/projects/ng-gallery/src/lib/styles/slider.scss deleted file mode 100644 index 9d20e439..00000000 --- a/projects/ng-gallery/src/lib/styles/slider.scss +++ /dev/null @@ -1,104 +0,0 @@ -::ng-deep { - gallery-slider { - position: relative; - display: flex; - align-items: center; - justify-content: center; - - .g-slider[centralised="true"] { - &:before, &:after { - content: ''; - } - - &:before { - flex: 0 0 var(--slider-centralize-start-size); - } - - &:after { - flex: 0 0 var(--slider-centralize-end-size); - } - } - } - - .g-slider-content { - flex: 0 0 auto; - display: flex; - align-items: center; - gap: 1px; - } - - gallery-core[slidingDirection='horizontal'] { - gallery-slider { - .g-slider { - overflow-x: auto; - overflow-y: hidden; - scroll-snap-type: x mandatory; - flex-direction: row; - } - - .g-slider-content { - flex-direction: row; - height: 100%; - } - } - } - - gallery-core[slidingDirection='vertical'] { - gallery-slider { - .g-slider { - overflow-x: hidden; - overflow-y: auto; - scroll-snap-type: y mandatory; - flex-direction: column; - } - - .g-slider-content { - flex-direction: column; - width: 100%; - } - } - } - - /** Disable sliding */ - gallery-core[slidingDisabled='true'] { - .g-slider { - overflow: hidden !important; - } - } - - .g-slider { - display: flex; - align-items: center; - width: 100%; - transition: var(--g-height-transition); - - scrollbar-width: none; /* Firefox 64 */ - -ms-overflow-style: none; /* Internet Explorer 11 */ - &::-webkit-scrollbar { /** WebKit */ - display: none; - } - - // Disable mouse click on gallery items/thumbnails when the slider is being dragged using the mouse - &.g-sliding, &.g-scrolling { - .g-slider-content { - pointer-events: none; - } - } - - gallery-thumb, - gallery-item { - display: flex; - flex-direction: column; - flex: 0 0 auto; - scroll-snap-align: center; - // Disable highlighting the elements on mouse move or click - user-select: none; - -webkit-user-drag: none; - -webkit-tap-highlight-color: rgba(0, 0, 0, 0); - - gallery-image[imageState='success'] { - align-self: center; - } - } - } -} diff --git a/projects/ng-gallery/src/lib/styles/templates.scss b/projects/ng-gallery/src/lib/styles/templates.scss deleted file mode 100644 index 7f4fc208..00000000 --- a/projects/ng-gallery/src/lib/styles/templates.scss +++ /dev/null @@ -1,149 +0,0 @@ -::ng-deep { - gallery[gallerize] { - gallery-item { - cursor: pointer; - } - } - - gallery-core { - gap: 1px; - } - - gallery-image { - img { - width: 100% !important; - } - } - - .gallery-image-error, - .gallery-thumb-error { - - svg { - width: 100%; - height: 100%; - } - } - - .gallery-thumb-error { - width: 40px; - height: 40px; - } - - .gallery-image-error { - width: 100px; - height: 100px; - } - - gallery-item, gallery-thumb { - position: relative; - display: block; - overflow: hidden; - - h2, h4 { - color: coral; - margin: 0; - } - - h2 { - font-size: 3.5em; - margin-bottom: 0.3em; - } - - h4 { - font-size: 1.6em; - } - - gallery-image { - transition: opacity 300ms cubic-bezier(0.5, 0, 0.5, 1); - } - } - - gallery-item { - --g-item-width: 'auto'; - --g-item-height: 100%; - height: var(--g-item-height); - width: var(--g-item-width); - max-height: var(--g-item-height); - max-width: 100%; - z-index: 10; - - gallery-image { - width: 100%; - height: 100%; - } - - &.g-active-item { - gallery-image { - opacity: 1; - } - } - - video, iframe { - position: absolute; - width: 100%; - height: 100%; - } - } - - gallery-thumb { - align-self: center; - cursor: pointer; - max-height: 100%; - - gallery-image { - opacity: 0.5; - } - - &.g-active-thumb { - gallery-image { - opacity: 1; - } - } - } - - gallery-image { - min-height: 100%; - display: flex; - } - - .g-image-item { - pointer-events: none; - max-height: 100%; - max-width: 100%; - } - - .g-template, .g-image-error-message { - position: absolute; - z-index: 10; - left: 0; - top: 0; - right: 0; - bottom: 0; - color: white; - display: flex; - align-items: center; - justify-content: center; - flex-direction: column; - } - - .g-loading { - position: absolute; - transform: translate3d(-50%, -50%, 0); - left: 50%; - top: 50%; - width: 80px; - height: 80px; - } - - gallery-core[imageSize='contain'] gallery-item .g-image-item { - object-fit: contain; - } - - gallery-core[imageSize='cover'] gallery-item .g-image-item { - object-fit: cover; - } - - gallery-core[thumbImageSize='cover'] gallery-thumb .g-image-item { - object-fit: cover; - } -} diff --git a/projects/ng-gallery/src/lib/styles/thumbnails.scss b/projects/ng-gallery/src/lib/styles/thumbnails.scss deleted file mode 100644 index 8d32e747..00000000 --- a/projects/ng-gallery/src/lib/styles/thumbnails.scss +++ /dev/null @@ -1,148 +0,0 @@ -::ng-deep { - gallery-thumbs { - max-height: 100%; - max-width: 100%; - display: block; - z-index: 100; - - .g-slider[centralised="true"] { - &:before, &:after { - content: ''; - } - - &:before { - flex: 0 0 var(--thumb-centralize-start-size); - } - - &:after { - flex: 0 0 var(--thumb-centralize-end-size); - } - } - - .g-slider gallery-thumb { - background: black; - height: var(--thumb-height); - width: var(--thumb-width); - max-height: var(--thumb-height); - max-width: var(--thumb-width); - - gallery-image, img { - width: 100%; - height: 100%; - } - } - } - - gallery-core[disableThumb='true'] { - gallery-thumb { - cursor: default; - } - } - - gallery-core[thumbPosition='top'], - gallery-core[thumbPosition='bottom'] { - gallery-thumbs { - .g-slider { - top: 0; - overflow-x: auto; - flex-direction: row; - } - - .g-slider-content { - flex-direction: row; - } - } - - &[thumbAutosize="true"] { - gallery-thumb { - width: initial; - max-width: unset; - } - } - } - - gallery-core[thumbPosition='left'], - gallery-core[thumbPosition='right'] { - gallery-thumbs { - .g-slider { - left: 0; - overflow-y: auto; - flex-direction: column; - } - - .g-slider-content { - flex-direction: column; - } - } - - &[thumbAutosize="true"] { - gallery-thumb { - height: initial; - max-height: unset; - } - } - } - - /** Disable sliding */ - gallery-core[thumbSlidingDisabled='true'] { - gallery-thumbs .g-slider { - overflow: hidden !important; - } - } - - gallery-core[thumbPosition='top'] { - flex-direction: column; - } - - gallery-core[thumbPosition='left'] { - flex-direction: row; - } - - gallery-core[thumbPosition='right'] { - flex-direction: row-reverse; - } - - gallery-core[thumbPosition='bottom'] { - flex-direction: column-reverse; - } - - $loading-color: #fff !default; - $placeholder-ng: #262626 !default; - - gallery-thumb.g-active-thumb { - .g-thumb-loading { - background-color: #464646; - } - } - - .g-thumb-loading { - position: relative; - overflow: hidden; - width: 100%; - height: 100%; - background-color: $placeholder-ng; - - &::before { - content: ""; - position: absolute; - top: 0; - right: 0; - bottom: 0; - left: 50%; - z-index: 1; - width: 500%; - margin-left: -250%; - animation: phAnimation .8s linear infinite; - background: linear-gradient(to right, rgba($loading-color, 0) 46%, rgba($loading-color, .35) 50%, rgba($loading-color, 0) 54%) 50% 50%; - } - } - - @keyframes phAnimation { - 0% { - transform: translate3d(-30%, 0, 0); - } - 100% { - transform: translate3d(30%, 0, 0); - } - } -} diff --git a/projects/ng-gallery/src/lib/utils/gallery.default.ts b/projects/ng-gallery/src/lib/utils/gallery.default.ts index d3e01d20..20f40b73 100644 --- a/projects/ng-gallery/src/lib/utils/gallery.default.ts +++ b/projects/ng-gallery/src/lib/utils/gallery.default.ts @@ -2,11 +2,10 @@ import { ImageSize, GalleryAction, LoadingStrategy, - SlidingDirection, + Orientation, ThumbnailsPosition, - DotsPosition, + BulletsPosition, CounterPosition, - ThumbnailsView, LoadingAttr } from '../models/constants'; import { GalleryState } from '../models/gallery.model'; @@ -24,43 +23,43 @@ export const defaultState: GalleryState = { export const defaultConfig: GalleryConfig = { nav: true, - loop: true, - dots: false, - thumb: true, + loop: false, + bullets: false, + thumbs: false, debug: false, - dotsSize: 6, - counter: true, - autoPlay: false, + bulletSize: 6, + counter: false, + autoplay: false, thumbWidth: 120, thumbHeight: 90, - disableThumb: false, - slidingDisabled: false, - thumbSlidingDisabled: false, - mouseSlidingDisabled: false, - thumbMouseSlidingDisabled: false, - playerInterval: 3000, - slidingDuration: 468, - slidingEase: { + disableBullets: false, + disableThumbs: false, + disableScroll: false, + disableThumbScroll: false, + disableMouseScroll: false, + disableThumbMouseScroll: false, + autoplayInterval: 3000, + scrollDuration: 468, + scrollEase: { x1: 0.42, y1: 0, x2: 0.58, y2: 1 }, + thumbCentralized: false, thumbAutosize: false, itemAutosize: false, autoHeight: false, scrollBehavior: 'smooth', - navScrollBehavior: 'smooth', - resizeDebounceTime: 50, + resizeDebounceTime: 0, loadingAttr: LoadingAttr.Lazy, imageSize: ImageSize.Contain, thumbImageSize: ImageSize.Cover, - thumbView: ThumbnailsView.Default, - dotsPosition: DotsPosition.Bottom, + bulletPosition: BulletsPosition.Bottom, counterPosition: CounterPosition.Top, thumbPosition: ThumbnailsPosition.Bottom, loadingStrategy: LoadingStrategy.Preload, - slidingDirection: SlidingDirection.Horizontal, + orientation: Orientation.Horizontal, navIcon: ``, // navIcon: ``, loadingIcon: `` diff --git a/projects/ng-gallery/src/lib/utils/img-manager.ts b/projects/ng-gallery/src/lib/utils/img-manager.ts new file mode 100644 index 00000000..78caaff3 --- /dev/null +++ b/projects/ng-gallery/src/lib/utils/img-manager.ts @@ -0,0 +1,46 @@ +import { Injectable } from '@angular/core'; +import { Observable, BehaviorSubject, filter, map, switchMap, EMPTY } from 'rxjs'; +import { GalleryState } from '../models/gallery.model'; +import { ItemState } from '../components/templates/items.model'; + +interface ImageRegistry { + state: Observable; + target: HTMLImageElement; +} + +@Injectable() +export class ImgManager { + + private readonly trigger$: BehaviorSubject = new BehaviorSubject(null); + + private readonly images: Map = new Map(); + + getActiveItem(state$: Observable): Observable { + return this.trigger$.pipe( + switchMap(() => state$.pipe( + switchMap((state: GalleryState) => { + const img: ImageRegistry = this.images.get(state.currIndex); + if (img) { + return img.state.pipe( + filter((state: ItemState) => state !== 'loading'), + map(() => img.target) + ) + } + return EMPTY; + }) + )) + ); + } + + addItem(index: number, payload: ImageRegistry): void { + this.images.set(index, payload); + this.trigger$.next(); + } + + deleteItem(index: number): void { + if (this.images.has(index)) { + this.images.delete(index); + this.trigger$.next(); + } + } +} diff --git a/projects/ng-gallery/src/lib/utils/img-recognizer.ts b/projects/ng-gallery/src/lib/utils/img-recognizer.ts new file mode 100644 index 00000000..348f752e --- /dev/null +++ b/projects/ng-gallery/src/lib/utils/img-recognizer.ts @@ -0,0 +1,42 @@ +import { Directive, Input, HostListener, OnInit, OnDestroy, ElementRef } from '@angular/core'; +import { ImgManager } from './img-manager'; +import { GalleryItemComponent } from '../components/gallery-item.component'; + +@Directive({ + selector: 'img[galleryImage]', + standalone: true +}) +export class ImgRecognizer implements OnInit, OnDestroy { + + @Input('galleryImage') index: number; + + @HostListener('load', ['$event']) + onLoad() { + this.item.state$.next('success'); + } + + @HostListener('error', ['$event']) + onError() { + this.item.state$.next('failed'); + } + + constructor(private el: ElementRef, private manager: ImgManager, private item: GalleryItemComponent) { + if (item) { + // Mark the gallery-item component as an image item + item.isItemContainImage = true; + } else { + throw new Error('[NgGallery]: galleryImage directive should be only used inside gallery item templates!') + } + } + + ngOnInit(): void { + this.manager.addItem(this.index, { + state: this.item.state$.asObservable(), + target: this.el.nativeElement + }); + } + + ngOnDestroy(): void { + this.manager.deleteItem(this.index); + } +} diff --git a/projects/ng-gallery/src/lib/utils/resize-observer.ts b/projects/ng-gallery/src/lib/utils/resize-observer.ts index a1ca4d4c..5a319c76 100644 --- a/projects/ng-gallery/src/lib/utils/resize-observer.ts +++ b/projects/ng-gallery/src/lib/utils/resize-observer.ts @@ -1,11 +1,15 @@ -import { Observable, Subscriber } from 'rxjs'; +import { Observable, Subscriber, mergeMap } from 'rxjs'; -export function resizeObservable(el: HTMLElement): Observable { +export function resizeObservable(el: HTMLElement, setter?: (ref: ResizeObserver) => void): Observable { return new Observable((subscriber: Subscriber) => { - const resizeObserver = new ResizeObserver((entries: ResizeObserverEntry[]) => subscriber.next(entries)); + const resizeObserver: ResizeObserver = new ResizeObserver((entries: ResizeObserverEntry[]) => subscriber.next(entries)); resizeObserver.observe(el); - return function unsubscribe() { - resizeObserver.disconnect(); - }; - }); + if (setter) { + setter(resizeObserver); + } + return () => resizeObserver.disconnect(); + }).pipe( + mergeMap((entries: ResizeObserverEntry[]) => entries) + ); } + diff --git a/projects/ng-gallery/src/stories/.eslintrc.json b/projects/ng-gallery/src/stories/.eslintrc.json new file mode 100644 index 00000000..57c1b324 --- /dev/null +++ b/projects/ng-gallery/src/stories/.eslintrc.json @@ -0,0 +1,5 @@ +{ + "rules": { + "@typescript-eslint/consistent-type-imports": ["error", { "disallowTypeAnnotations": false }] + } +} diff --git a/projects/ng-gallery/src/stories/GettingStarted.mdx b/projects/ng-gallery/src/stories/GettingStarted.mdx new file mode 100644 index 00000000..d15a1923 --- /dev/null +++ b/projects/ng-gallery/src/stories/GettingStarted.mdx @@ -0,0 +1,114 @@ +
                                                                                                                                  + Gallery Logo +

                                                                                                                                  Angular Gallery

                                                                                                                                  +
                                                                                                                                  + + +# Getting Started + +This library consists of 2 packages: + +- **ng-gallery:** This package includes a `` component and a gallery service. +- **ng-gallery/lightbox:** Within this package, you'll find a lightbox service and a `[lightbox]` directive, designed to facilitate the opening of the gallery within a modal window. +Additionally, this package offers a `[gallerize]` directive, which seamlessly integrates the images into the lightbox. + +## Installation + +The package can be installed alongside the `@angular/cdk` dependency using NPM. To do this, run the following command in your terminal: + +```bash +npm i ng-gallery @angular/cdk +``` + +## Usage + +The `GalleryModule` can be imported either globally in your application configuration or directly in your component imports. +It's important to note that importing the `provideAnimations` animation is required for the proper functioning of the gallery component. +Below is an example of setting up your Angular application: + +```ts +import { ApplicationConfig, importProvidersFrom } from '@angular/core'; +import { provideAnimations } from '@angular/platform-browser/animations'; +import { GalleryModule } from 'ng-gallery'; + +export const appConfig: ApplicationConfig = { + providers: [ + provideAnimations(), + importProvidersFrom(GalleryModule) + ] +}; +``` + +### Provide default options + +`DEFAULT_GALLERY_CONFIG` Injection token that can be used to provide the default options for the gallery. + +**Example** + + +```ts +import { ApplicationConfig } from '@angular/core'; +import { DEFAULT_GALLERY_CONFIG, GalleryConfig } from 'ng-gallery'; + +export const appConfig: ApplicationConfig = { + providers: [ + { + provide: DEFAULT_GALLERY_CONFIG, + useValue: { + imageSize: 'cover' + } as GalleryConfig + } + ] +}; +``` + +## Mouse Sliding (optional) + +The gallery relies on HammerJS to support dragging the slider using the mouse, if you don't want this feature you can skip installing HammerJS. + +*You can add HammerJS to your application via [npm](https://www.npmjs.com/package/hammerjs), a CDN (such as the [Google CDN](https://developers.google.com/speed/libraries/#hammerjs)), or served directly from your app.* + +To install via npm, use the following command: + +**NPM** + +```bash +npm i hammerjs +``` + +After installing, import it in `main.ts` + +```ts +import 'hammerjs'; +``` + + +## Issues + +If you identify any errors in this module or have an idea for an improvement, please open an [issue](https://github.com/MurhafSousli/ngx-gallery/issues). + + + + diff --git a/projects/ng-gallery/src/stories/LoadItems.mdx b/projects/ng-gallery/src/stories/LoadItems.mdx new file mode 100644 index 00000000..0cd6438a --- /dev/null +++ b/projects/ng-gallery/src/stories/LoadItems.mdx @@ -0,0 +1,192 @@ +# Usage + +There are several ways for configuring gallery items. Here are some examples: + +## Basic Example with Template Binding + +The most straightforward way to load items into the gallery is by using an array of type `GalleryItem[]` and applying the template binding. + +```ts +import { Component, OnInit } from '@angular/core'; +import { GalleryModule, GalleryItem, ImageItem, VideoItem, YoutubeItem, IframeItem } from 'ng-gallery'; + +@Component({ + template: ` + + `, + standalone: true, + imports: [GalleryModule] +}) +export class AppComponent implements OnInit { + + images: GalleryItem[]; + + ngOnInit() { + // Set items array + this.images = [ + new ImageItem({ + src: 'IMAGE_SRC_URL', + thumb: 'IMAGE_THUMBNAIL_URL' + }), + new VideoItem({ + src: 'VIDEO_URL', + poster: 'VIDEO_POSTER_URL', + thumb: 'IMAGE_THUMBNAIL_URL' + }), + new YoutubeItem({ + src: 'VIDEO_ID' + }), + new IframeItem({ + src: 'IFRAME_URL', + thumb: 'IMAGE_THUMBNAIL_URL' + }) + ]; + } +} +``` + +## Accessing via Component Reference + +Alternatively, you can access the gallery by referencing the `GalleryComponent`. +To do this, acquire the component reference using `@ViewChild(GalleryComponent)` and then add items accordingly. + +```ts +import { Component, ViewChild } from '@angular/core'; +import { GalleryModule, GalleryComponent, ImageItem, VideoItem, YoutubeItem, IframeItem } from 'ng-gallery'; + +@Component({ + template: ` + + `, + standalone: true, + imports: [GalleryModule] +}) +export class AppComponent { + + @ViewChild(GalleryComponent) myGallery: GalleryComponent; + + // Add items individually + addItemIndividually() { + this.myGallery.addImage({ + src: 'IMAGE_SRC_URL', + thumb: 'IMAGE_THUMBNAIL_URL' + }); + + this.myGallery.addVideo({ + src: 'VIDEO_URL', + poster: 'VIDEO_POSTER_URL', + thumb: 'IMAGE_THUMBNAIL_URL' + }); + + this.myGallery.addYoutube({ + src: 'VIDEO_ID' + }); + + this.myGallery.addIframe({ + src: 'IFRAME_URL', + thumb: 'IMAGE_THUMBNAIL_URL' + }); + } + + // Load a new set of items + loadItems() { + const items: GalleryItem[] = [ + new ImageItem({ + src: 'IMAGE_SRC_URL', + thumb: 'IMAGE_THUMBNAIL_URL' + }), + new VideoItem({ + src: 'VIDEO_URL', + poster: 'VIDEO_POSTER_URL', + thumb: 'IMAGE_THUMBNAIL_URL' + }), + new YoutubeItem({ + src: 'VIDEO_ID' + }), + new IframeItem({ + src: 'IFRAME_URL', + thumb: 'IMAGE_THUMBNAIL_URL' + }) + ] + + this.myGallery.load(items); + } +} +``` + +## Accessing via `Gallery` Service + +To access the gallery from any location within your application, utilize the `Gallery` service to obtain the `GalleryRef` by its unique identifier. + +```ts +import { Component, OnInit } from '@angular/core'; +import { GalleryModule, Gallery, GalleryRef, GalleryItem, ImageItem, VideoItem, YoutubeItem, IframeItem } from 'ng-gallery'; + +@Component({ + template: ` + + `, + standalone: true, + imports: [GalleryModule] +}) +export class AppComponent implements OnInit { + + galleryRef: GalleryRef; + + constructor(private gallery: Gallery) { + } + + ngOnInit() { + // Get the galleryRef by id + this.galleryRef = this.gallery.ref('myGallery'); + } + + // Add items individually + addItemIndividually() { + this.galleryRef.addImage({ + src: 'IMAGE_SRC_URL', + thumb: 'IMAGE_THUMBNAIL_URL' + }); + + this.galleryRef.addVideo({ + src: 'VIDEO_URL', + poster: 'VIDEO_POSTER_URL', + thumb: 'IMAGE_THUMBNAIL_URL' + }); + + this.galleryRef.addYoutube({ + src: 'VIDEO_ID' + }); + + this.galleryRef.addIframe({ + src: 'IFRAME_URL', + thumb: 'IMAGE_THUMBNAIL_URL' + }); + } + + // Load a new set of items + loadItems() { + const items: GalleryItem[] = [ + new ImageItem({ + src: 'IMAGE_SRC_URL', + thumb: 'IMAGE_THUMBNAIL_URL' + }), + new VideoItem({ + src: 'VIDEO_URL', + poster: 'VIDEO_POSTER_URL', + thumb: 'IMAGE_THUMBNAIL_URL' + }), + new YoutubeItem({ + src: 'VIDEO_ID' + }), + new IframeItem({ + src: 'IFRAME_URL', + thumb: 'IMAGE_THUMBNAIL_URL' + }) + ] + this.galleryRef.load(items); + } +} +``` + +These methods provide flexibility in setting up and configuring the gallery in your application. diff --git a/projects/ng-gallery/src/stories/Responsiveness.mdx b/projects/ng-gallery/src/stories/Responsiveness.mdx new file mode 100644 index 00000000..a113dac0 --- /dev/null +++ b/projects/ng-gallery/src/stories/Responsiveness.mdx @@ -0,0 +1,54 @@ +# Responsiveness + +To modify the gallery configuration for smaller screens, including adjustments to thumbnail positioning and size, +[Angular CDK](https://material.angular.io/cdk/layout/overview) provides an effective solution. + + +**Example** + +```ts +import { Component } from '@angular/core'; +import { CommonModule } from '@angular/common'; +import { BreakpointObserver, Breakpoints } from '@angular/cdk/layout'; +import { GalleryModule, GalleryConfig, ThumbnailPosition } from 'ng-gallery'; +import { Observable, map } from 'rxjs'; + +@Component({ + selector: 'gallery-example', + template: ` + + `, + standalone: true, + imports: [GalleryModule, CommonModule] +}) +class MyComponent { + + galleryConfig$: Observable; + + constructor(breakpointObserver: BreakpointObserver) { + + this.galleryConfig$ = breakpointObserver.observe([ + Breakpoints.HandsetPortrait + ]).pipe( + map(res => { + if (res.matches) { + return { + thumbPosition: ThumbnailPosition.Top, + thumbWidth: 80, + thumbHeight: 80 + }; + } + return { + thumbPosition: ThumbnailPosition.Left, + thumbWidth: 120, + thumbHeight: 90 + }; + }) + ); + } +} +``` diff --git a/projects/ng-gallery/src/stories/basic/Bullets.mdx b/projects/ng-gallery/src/stories/basic/Bullets.mdx new file mode 100644 index 00000000..811f5f5f --- /dev/null +++ b/projects/ng-gallery/src/stories/basic/Bullets.mdx @@ -0,0 +1,43 @@ +import { Meta, Canvas } from "@storybook/addon-docs"; +import * as GalleryStories from "./Gallery.stories"; + + + +# Gallery Bullets + +The bullets offer a straightforward way to navigate in the gallery. + + + +## Bullets position + +There are 2 positioning choices are available for bullets: `top` and `bottom`. + +**Example** + +```html + +``` + + +## Customizing bullet Size + +To change bullets size, use the `bulletSize` input + + +## Disabling bullet Clicks + +To prevent navigating to new items by clicking on bullets, use the following attribute: + +```html + +``` + + + +## List of options related to gallery bullets + +- bullets +- bulletSize +- bulletPosition +- disableBullets diff --git a/projects/ng-gallery/src/stories/basic/Counter.mdx b/projects/ng-gallery/src/stories/basic/Counter.mdx new file mode 100644 index 00000000..8e4e4ee9 --- /dev/null +++ b/projects/ng-gallery/src/stories/basic/Counter.mdx @@ -0,0 +1,29 @@ +import { Meta, Canvas } from "@storybook/addon-docs"; +import * as GalleryStories from "./Gallery.stories"; + + + +# Gallery Counter + +Indicates the number of the active value and the total amount of items in the gallery. + + + + + +## Counter position + +There are 2 choices for positioning the counter, `top` and `bottom`. + +**Example** + +```html + +``` + + + +## List of options related to gallery counter + +- counter +- counterPosition diff --git a/projects/ng-gallery/src/stories/basic/Gallery.stories.ts b/projects/ng-gallery/src/stories/basic/Gallery.stories.ts new file mode 100644 index 00000000..ee2569e9 --- /dev/null +++ b/projects/ng-gallery/src/stories/basic/Gallery.stories.ts @@ -0,0 +1,470 @@ +import type { Meta, StoryObj } from '@storybook/angular'; +import { applicationConfig } from '@storybook/angular'; +import { provideAnimations } from '@angular/platform-browser/animations'; +import { + CounterPosition, + BulletsPosition, + GalleryComponent, + ImageSize, + LoadingAttr, + LoadingStrategy, + Orientation, + ThumbnailsPosition +} from 'ng-gallery'; +import { getHDImages } from '../pixabay/pixabay.service'; + +import 'hammerjs'; + + +const meta: Meta = { + title: 'Documentations/Gallery', + component: GalleryComponent, + tags: ['autodocs'], + render: (args: GalleryComponent) => ({ + props: { + ...args, + }, + }), + decorators: [ + applicationConfig({ + providers: [provideAnimations()] + }) + ], + args: { + id: 'root', + scrollBehavior: 'smooth', + imageSize: ImageSize.Contain, + thumbImageSize: ImageSize.Cover, + bulletPosition: BulletsPosition.Bottom, + counterPosition: CounterPosition.Top, + orientation: Orientation.Horizontal, + loadingAttr: LoadingAttr.Lazy, + loadingStrategy: LoadingStrategy.Default, + thumbPosition: ThumbnailsPosition.Bottom, + scrollEase: { + x1: 0.42, + y1: 0, + x2: 0.58, + y2: 1 + }, + bulletSize: 6, + thumbWidth: 120, + thumbHeight: 90, + autoplayInterval: 3000, + scrollDuration: 468, + resizeDebounceTime: 0, + nav: true, + bullets: true, + disableBullets: false, + loop: true, + debug: false, + thumbs: true, + counter: true, + autoplay: false, + autoHeight: false, + itemAutosize: false, + disableThumbs: false, + detachThumbs: false, + thumbAutosize: false, + disableScroll: false, + thumbCentralized: false, + disableThumbScroll: false, + disableMouseScroll: false, + disableThumbMouseScroll: false, + }, + // Disables the long useless control description + argTypes: { + scrollBehavior: { + control: 'radio', + options: ['smooth', 'auto'], + table: { + defaultValue: { summary: 'smooth' } + } + }, + imageSize: { + table: { + defaultValue: { summary: 'contain' } + } + }, + thumbImageSize: { + table: { + defaultValue: { summary: 'cover' } + } + }, + bulletPosition: { + table: { + defaultValue: { summary: 'bottom' } + } + }, + counterPosition: { + table: { + defaultValue: { summary: 'top' } + } + }, + orientation: { + table: { + defaultValue: { summary: 'horizontal' } + } + }, + loadingAttr: { + table: { + defaultValue: { summary: 'lazy' } + } + }, + loadingStrategy: { + table: { + defaultValue: { summary: 'default' } + } + }, + thumbPosition: { + table: { + defaultValue: { summary: 'bottom' } + } + }, + thumbCentralized: { + table: { + defaultValue: { summary: 'default' } + } + }, + scrollEase: { + table: { + defaultValue: { summary: '{ x1: 0.42, y1: 0, x2: 0.58, y2: 1 }' } + } + }, + nav: { + table: { + defaultValue: { summary: true } + } + }, + thumbs: { + table: { + defaultValue: { summary: true } + } + }, + loop: { + table: { + defaultValue: { summary: true } + } + }, + counter: { + table: { + defaultValue: { summary: true } + } + }, + bulletSize: { + table: { + defaultValue: { summary: 6 } + } + }, + thumbWidth: { + table: { + defaultValue: { summary: 120 } + } + }, + thumbHeight: { + table: { + defaultValue: { summary: 90 } + } + }, + autoplayInterval: { + table: { + defaultValue: { summary: 3000 } + } + }, + scrollDuration: { + table: { + defaultValue: { summary: 468 } + } + }, + resizeDebounceTime: { + table: { + defaultValue: { summary: 0 } + } + }, + error: { + control: false + }, + indexChange: { + control: false + }, + itemsChange: { + control: false + }, + itemClick: { + control: false + }, + thumbClick: { + control: false + }, + playingChange: { + control: false + }, + galleryRef: { + control: false + }, + load: { + control: false + }, + add: { + control: false + }, + addImage: { + control: false + }, + addVideo: { + control: false + }, + addIframe: { + control: false + }, + addYoutube: { + control: false + }, + remove: { + control: false + }, + next: { + control: false + }, + prev: { + control: false + }, + set: { + control: false + }, + reset: { + control: false + }, + play: { + control: false + }, + stop: { + control: false + } + } +}; + +export default meta; +type Story = StoryObj; + + +/** First Example for gallery */ +export const Lab: Story = { + render: (args: GalleryComponent, { loaded: { items } }) => ({ + props: { + ...args, + items, + }, + template: ` + + `, + }), + loaders: [ + async () => ({ + items: await getHDImages('jet fighter') + }), + ] +}; + + +export const ThumbPositionExample: Story = { + parameters:{ controls:{ exclude:/.*/g } }, + render: (args: GalleryComponent, { loaded: { items } }) => ({ + props: { ...args, items, }, + template: `` + }), + loaders: [ + async () => ({ items: await getHDImages('street') }), + ] +}; + + +export const ThumbAutosizeExample: Story = { + parameters:{ controls:{ exclude:/.*/g } }, + render: (args: GalleryComponent, { loaded: { items } }) => ({ + props: { ...args, items, }, + template: `` + }), + loaders: [ + async () => ({ items: await getHDImages('roads') }), + ] +}; + +export const ThumbDetachedExample: Story = { + parameters:{ controls:{ exclude:/.*/g } }, + render: (args: GalleryComponent, { loaded: { items } }) => ({ + props: { ...args, items, }, + template: `` + }), + loaders: [ + async () => ({ items: await getHDImages('flowers') }), + ] +}; + +export const ThumbViewExample: Story = { + parameters:{ controls:{ exclude:/.*/g } }, + render: (args: GalleryComponent, { loaded: { items } }) => ({ + props: { ...args, items, }, + template: `` + }), + loaders: [ + async () => ({ items: await getHDImages('landscape') }), + ] +}; + + +export const AutoplayExample: Story = { + parameters:{ controls:{ exclude:/.*/g } }, + render: (args: GalleryComponent, { loaded: { items } }) => ({ + props: { ...args, items, }, + template: `` + }), + loaders: [ + async () => ({ items: await getHDImages('airplane') }), + ] +}; + + +export const BulletExample: Story = { + parameters:{ controls:{ exclude:/.*/g } }, + render: (args: GalleryComponent, { loaded: { items } }) => ({ + props: { ...args, items, }, + template: `` + }), + loaders: [ + async () => ({ items: await getHDImages('football') }), + ] +}; + +export const CounterExample: Story = { + parameters:{ controls:{ exclude:/.*/g } }, + render: (args: GalleryComponent, { loaded: { items } }) => ({ + props: { ...args, items, }, + template: `` + }), + loaders: [ + async () => ({ items: await getHDImages('basketball') }), + ] +}; + +export const NavExample: Story = { + parameters:{ controls:{ exclude:/.*/g } }, + render: (args: GalleryComponent, { loaded: { items } }) => ({ + props: { ...args, items, }, + template: `` + }), + loaders: [ + async () => ({ items: await getHDImages('lions') }), + ] +}; + +export const SliderExample: Story = { + parameters:{ controls:{ exclude:/.*/g } }, + render: (args: GalleryComponent, { loaded: { items } }) => ({ + props: { ...args, items, }, + template: `` + }), + loaders: [ + async () => ({ items: await getHDImages('chips') }), + ] +}; + +export const SliderBehaviorExample: Story = { + parameters:{ controls:{ exclude:/.*/g } }, + render: (args: GalleryComponent, { loaded: { items } }) => ({ + props: { ...args, items, }, + template: `` + }), + loaders: [ + async () => ({ items: await getHDImages('chips') }), + ] +}; + +export const NavWithLoopExample: Story = { + parameters:{ controls:{ exclude:/.*/g } }, + render: (args: GalleryComponent, { loaded: { items } }) => ({ + props: { ...args, items, }, + template: `` + }), + loaders: [ + async () => ({ items: await getHDImages('tigers') }), + ] +}; + +export const SliderDirectionExample: Story = { + parameters:{ controls:{ exclude:/.*/g } }, + render: (args: GalleryComponent, { loaded: { items } }) => ({ + props: { ...args, items, }, + template: `` + }), + loaders: [ + async () => ({ items: await getHDImages('tigers') }), + ] +}; + +export const ImageSizeExample: Story = { + parameters:{ controls:{ exclude:/.*/g } }, + render: (args: GalleryComponent, { loaded: { items } }) => ({ + props: { ...args, items, }, + template: `` + }), + loaders: [ + async () => ({ items: await getHDImages('tigers') }), + ] +}; + +export const AutoHeightExample: Story = { + parameters:{ controls:{ exclude:/.*/g } }, + render: (args: GalleryComponent, { loaded: { items } }) => ({ + props: { ...args, items, }, + template: `` + }), + loaders: [ + async () => ({ items: await getHDImages('tigers') }), + ] +}; + +export const ItemAutosizeExample: Story = { + parameters:{ controls:{ exclude:/.*/g } }, + render: (args: GalleryComponent, { loaded: { items } }) => ({ + props: { ...args, items, }, + template: `` + }), + loaders: [ + async () => ({ items: await getHDImages('ship') }), + ] +}; + diff --git a/projects/ng-gallery/src/stories/basic/Navigation.mdx b/projects/ng-gallery/src/stories/basic/Navigation.mdx new file mode 100644 index 00000000..15bea6dc --- /dev/null +++ b/projects/ng-gallery/src/stories/basic/Navigation.mdx @@ -0,0 +1,20 @@ +import { Meta, Canvas } from "@storybook/addon-docs"; +import * as GalleryStories from "./Gallery.stories"; + + + +# Gallery Nav + +This feature provide navigation buttons designed to facilitate movement between next and previous items. + + + + +### Navigation loop + + + + +## List of options related to gallery nav + +- nav diff --git a/projects/ng-gallery/src/stories/basic/Player.mdx b/projects/ng-gallery/src/stories/basic/Player.mdx new file mode 100644 index 00000000..3ed8a0f8 --- /dev/null +++ b/projects/ng-gallery/src/stories/basic/Player.mdx @@ -0,0 +1,101 @@ +import { Meta, Canvas } from "@storybook/addon-docs"; +import * as GalleryStories from "./Gallery.stories"; + + + +# Gallery Player + +This feature facilitates automatic cycling through items like a slideshow. + +## Using the component inputs + +To initiate the player, use the `autoplay` input. +You can specify the player's interval using the `autoplayInterval` input, which accepts a value in milliseconds. The default interval is set to 3000. + + + + +You can also toggle playing by binding the input to a boolean value, as the following example: + +```html + +``` + + +## Using `GalleryComponent` reference + +Obtain the gallery component reference using `ViewChild(GalleryComponent)`. This reference grants access to the component's functions. + + +**Example** + +```ts +import { Component, ViewChild } from '@angular/core'; +import { GalleryModule, GalleryComponent } from 'ng-gallery'; + +@Component({ + template: ` + + `, + standalone: true, + imports: [GalleryModule] +}) +export class AppComponent { + + @ViewChild(GalleryComponent) myGallery: GalleryComponent; + + play() { + this.myGallery.play(); + } + + stop() { + this.myGallery.stop(); + } +} +``` + +## Using `GalleryRef` reference + +Alternatively, you can access the `GalleryRef` by its identifier, providing a flexible means to start or stop the player from any part of your code. + + +**Example** + +```ts +import { Component, OnInit } from '@angular/core'; +import { GalleryModule, Gallery, GalleryRef } from 'ng-gallery'; + +@Component({ + template: ` + + `, + standalone: true, + imports: [GalleryModule] +}) +export class AppComponent implements OnInit { + + myGalleryRef: GalleryRef; + + constructor(private gallery: Gallery) { + } + + ngOnInit() { + this.myGalleryRef = this.gallery.ref('myGallery'); + } + + play() { + this.myGalleryRef.play(); + } + + stop() { + this.myGalleryRef.stop(); + } +} +``` + + + +## List of options related to gallery player + +- autoplay +- autoplayInterval diff --git a/projects/ng-gallery/src/stories/basic/Slider.mdx b/projects/ng-gallery/src/stories/basic/Slider.mdx new file mode 100644 index 00000000..d98c125c --- /dev/null +++ b/projects/ng-gallery/src/stories/basic/Slider.mdx @@ -0,0 +1,127 @@ +import {Meta, Canvas} from "@storybook/addon-docs"; +import * as GalleryStories from "./Gallery.stories"; + + + +# Slider + +In this section, we'll cover the main options of the main slider which contains the items + + + + +The slider navigates through items using scrolling mechanism, it can be scrolled using the mouse wheel, touchpad on desktop or gestures on touch devices. + +### Slide using mouse drag + +The slider can be scrolled using mouse drag which requires hammerjs + +> Sliding using mouse drag is optional, the gallery doesn't depend on hammerjs +> This feature is turned on by default when hammerjs is loaded in the app. +> You can turn off this feature by adding `mouseSlidingDisabled` attribute. + +**Example** + +```html +`` +``` + + +### Orientation + +There are two choices for the gallery orientation `horizontal` and `vertical`, the default is `horizontal`. + +**Example of a vertical orientation** + + + + + + +### Loading strategy + +There are 3 choices for loading strategy of the main slider + +- `default` renders only the active item, the previous item and the next item +- `lazy`: renders only the active item +- `preload` renders all the items, this option is required for `thumbAutoSize` is enabled + +**Note** + +> `preload` should be chosen if `itemAutoSize` is turned on + + + + +### Image size + +By default, the image in item is contained in the slide, to make the image covers the slide +Sets the object-fit style applied on items' images + + + + + + +### Auto-height + +Automatically adjusts the gallery's height to fit the content + + + + + + + +### Scroll behavior + +There are two distinct navigation modes to choose from: + +- **Smooth:** When you opt for the `smooth` mode which is the default, the gallery will smoothly scroll to the desired item, +with the scrolling duration determined by the `slidingDuration`. +- **Auto:** If you select the `auto` mode, the gallery will instantaneously transition to the desired item without any intermediate scrolling. + +**Example** + + + + + + +### Autosize feature + +When Use `autosize` attribute is set, it allows each thumbnail to fit its content size. + + +**Example** + + + + +You can turn on this feature like ` + +- In `horizontal` slide direction, item's width will automatically fit its content width. +- In `vertical` slide direction, item's height will automatically fit its content height. + +> **Note** +> - Does not work when `autoHeight` is on +> - Does not work properly unless `loadingAttr="eager"` +> - Does not work properly unless `loadingStrategy="preload"` + + + + +## List of options related to gallery main slider + +- orientation +- scrollEase +- scrollBehavior +- disableScroll +- disableMouseScroll +- loadingStrategy +- imageSize +- debug +- resizeDebounceTime +- autoHeight +- autoItemSize +- loop diff --git a/projects/ng-gallery/src/stories/basic/Thumbnails.mdx b/projects/ng-gallery/src/stories/basic/Thumbnails.mdx new file mode 100644 index 00000000..0d2abeb2 --- /dev/null +++ b/projects/ng-gallery/src/stories/basic/Thumbnails.mdx @@ -0,0 +1,89 @@ +import { Meta, Canvas } from "@storybook/addon-docs"; +import * as GalleryStories from "./Gallery.stories"; + + + +# Gallery Thumbnails + +Thumbnails are an integral part of the gallery component, offering multiple customization options for appearance and behavior. + + + +## Displaying thumbnails + +To display thumbnails, add the following attribute: + +```html + +``` + + +## Thumbnail position + +There are 4 positioning choices are available for thumbnails: `top`, `left`, `bottom` and `right`. + +The chosen position also dictates the slide direction: horizontal for `top` and `bottom`, and vertical for `left` and `right`. + + + + + +## Customizing thumbnail size + +Thumbnails can be resized using the `thumbWidth` and `thumbHeight` inputs: + +- For `top` or `bottom` positions, `thumbHeight` determines the height of the thumbnails' slider. +- For `left` or `right` positions, `thumbWidth` determines the width of the thumbnails' slider. + + +## Automatic thumbnail sizing + +The `thumbAutosize` attribute enables automatic thumbnail sizing, ensuring each thumbnail fits its content size. + +- In `top` or `bottom` positions, the width of each thumbnail adjusts to its content. +- In `left` or `right` positions, the height of each thumbnail adjusts to its content. + + + + +## Disabling thumbnail clicks + +To prevent navigating to new items by clicking on thumbnails, use the following attribute: + +```html + +``` + + + +## Detaching thumbnails + +Typically, thumbnails adjust to centralize the active item. To disable this behavior `detachThumbs` as follows: + + + + + +## Centralized thumbnails + +By default, the active thumbnail is centrally positioned in the slider. However, if it's located at the beginning or end, it remains in place. To enforce centralization, utilize the `thumbView` attribute: + + + + + +## List of options related to gallery thumbnails + +- thumbs +- thumbPosition +- thumbWidth +- thumbHeight +- thumbAutosize +- thumbCentralized +- thumbImageSize +- detachThumbs +- disableThumbs +- disableThumbMouseScroll +- disableThumbMouseScroll + +The API table is available [here](/docs/documentations-gallery--lab). diff --git a/projects/ng-gallery/src/stories/custom-templates/CustomTemplates.stories.ts b/projects/ng-gallery/src/stories/custom-templates/CustomTemplates.stories.ts new file mode 100644 index 00000000..69a31bb0 --- /dev/null +++ b/projects/ng-gallery/src/stories/custom-templates/CustomTemplates.stories.ts @@ -0,0 +1,119 @@ +import type { Meta, StoryObj } from '@storybook/angular'; +import { applicationConfig, moduleMetadata } from '@storybook/angular'; +import { provideAnimations } from '@angular/platform-browser/animations'; +import { GalleryModule } from 'ng-gallery'; +import { CustomTemplateComponent } from './custom-template.component'; +import { getHDImages, getHDImagesForCustomTemplate } from '../pixabay/pixabay.service'; + +import 'hammerjs'; + +const meta: Meta = { + title: 'Documentations/CustomTemplates', + component: CustomTemplateComponent, + // tags: ['autodocs'], + render: (args: CustomTemplateComponent) => ({ + props: { + ...args, + }, + }), + decorators: [ + moduleMetadata({ + imports: [GalleryModule], + }), + applicationConfig({ + providers: [provideAnimations()], + }), + ] +}; + +export default meta; +type Story = StoryObj; + +export const ImageTemplateExample: Story = { + render: (args: CustomTemplateComponent, { loaded: { items } }) => ({ + props: { ...args, items, }, + template: ` + +
                                                                                                                                  + {{ item?.alt }} +
                                                                                                                                  +
                                                                                                                                  + ` + }), + loaders: [ + async () => ({ items: await getHDImages('sea') }), + ] +}; + + +export const ItemTemplateExample: Story = { + render: (args: CustomTemplateComponent, { loaded: { items } }) => ({ + props: { ...args, items, }, + template: ` + +
                                                                                                                                  + +
                                                                                                                                  +
                                                                                                                                  + `, + styles: [` + img { + object-fit: cover; + border: 10px white solid; + width: 400px; + height: 400px; + } + `] + }), + loaders: [ + async () => ({ items: await getHDImagesForCustomTemplate('sand') }), + ] +}; + +export const ThumbTemplateExample: Story = { + render: (args: CustomTemplateComponent, { loaded: { items } }) => ({ + props: { ...args, items, }, + template: ` + +
                                                                                                                                  + {{ thumb?.alt }} +
                                                                                                                                  +
                                                                                                                                  + ` + }), + loaders: [ + async () => ({ items: await getHDImages('sea') }), + ] +}; + +export const BoxTemplateExample: Story = { + render: (args: CustomTemplateComponent, { loaded: { items } }) => ({ + props: { ...args, items, }, + template: ` + +
                                                                                                                                  +
                                                                                                                                  This is fixed overlay template
                                                                                                                                  + +
                                                                                                                                  +
                                                                                                                                  + `, + styles: [` + .my-box { + width: 200px; + height: 50px; + color: white; + } + img { + position: absolute; + z-index: 999; + width: 40px; + height: 40px; + top: 20px; + left: 20px; + } + `] + }), + loaders: [ + async () => ({ items: await getHDImages('sea') }), + ] +}; diff --git a/projects/ng-gallery/src/stories/custom-templates/CustomTemplatesUsage.mdx b/projects/ng-gallery/src/stories/custom-templates/CustomTemplatesUsage.mdx new file mode 100644 index 00000000..0101d2ab --- /dev/null +++ b/projects/ng-gallery/src/stories/custom-templates/CustomTemplatesUsage.mdx @@ -0,0 +1,144 @@ +import {Meta, Canvas} from "@storybook/addon-docs"; +import * as CustomTemplatesStories from "./CustomTemplates.stories"; + + + +# Custom Templates + + + + +The directives are: `*galleryItemDef`, `*galleryImageDef`, `*galleryThumbDef`, `*galleryBoxDef` + +## GalleryImageDef + +`*galleryImageDef`: applies only on image items - the image will still be displayed, but this adds an custom inner template, useful to add text overlay on top of the image. + + + + +**Example:** + +```html + + +
                                                                                                                                  + {{ item?.alt }} +
                                                                                                                                  +
                                                                                                                                  +
                                                                                                                                  +``` + +## GalleryThumbDef + +`*galleryThumbDef`: applies on all thumbnails types, image will still displayed, but adds an custom inner template. + + + + +**Example:** the following adds a Youtube icon on Youtube thumbnail and video icon on video thumbnails: + +```html + + + + + + + + + + +``` + + +## GalleryItemDef + +`*galleryItemDef`: overrides gallery item template, useful if you want create your own gallery template for any type from scratch. + + + +**Example:** + +```html + +
                                                                                                                                  +
                                                                                                                                  + +
                                                                                                                                  +
                                                                                                                                  + +
                                                                                                                                  +
                                                                                                                                  +
                                                                                                                                  +``` + + > When using `galleryItemDef` you will need to add the items differently + +```ts +galleryRef.add({ + type: 'my-image-template', + data: { + src: 'IMAGE_SRC_URL', + thumb: 'IMAGE_THUMBNAIL_URL' + alt: 'Test' + } +}) + +// or using items array +const items: GalleryItem[] = [ + { + type: 'my-image-template' + data: { + src: 'IMAGE_SRC_URL', + thumb: 'IMAGE_THUMBNAIL_URL' + } + } + // more items +]; +``` + + +#### Additional context properties that comes with `GalleryItemDef`, `GalleryImageDef` and `GalleryThumbDef` are: + +```ts +{ + /** Index of the item. */ + index?: number; + + /** Type of the item, default ones are 'image', 'video', 'youtube', 'iframe' */ + type?: string; + + /** True if this item is the active one. */ + active?: boolean; + + /** The number of total items. */ + count?: number; + + /** True if this item is first. */ + first?: boolean; + + /** True if this item is last. */ + last?: boolean; +} +``` + +## GalleryBoxDef + +`*galleryBoxDef` Adds a single static template on top of the gallery items + + + +```html + +
                                                                                                                                  + {{ state.currIndex + 1 }} / {{ state.items.length }} +
                                                                                                                                  +
                                                                                                                                  +``` + +Available context variables are `state` and `config` + +> You can use these directives on DOM elements and components or even `ng-container` and `ng-template` diff --git a/projects/ng-gallery/src/stories/custom-templates/custom-template.component.ts b/projects/ng-gallery/src/stories/custom-templates/custom-template.component.ts new file mode 100644 index 00000000..bf055928 --- /dev/null +++ b/projects/ng-gallery/src/stories/custom-templates/custom-template.component.ts @@ -0,0 +1,46 @@ +import { Component, ChangeDetectionStrategy, Input } from '@angular/core'; +import { CommonModule } from '@angular/common'; +import { GalleryModule, GalleryItem, } from 'ng-gallery'; +import { Observable } from 'rxjs'; + +/** + * This section demonstrate how to extend the image template, like displaying a text over the image item + */ +@Component({ + selector: 'custom-templates-example', + template: ` + + +
                                                                                                                                  + {{ item?.alt }} +
                                                                                                                                  +
                                                                                                                                  +
                                                                                                                                  + `, + styles: [` + .item-text { + position: absolute; + top: 0; + left: 0; + right: 0; + margin: 3em auto 0; + width: 100%; + max-width: 500px; + padding: 20px 25px; + text-align: justify; + letter-spacing: 1px; + filter: drop-shadow(0px 0px 2px rgba(0, 0, 0, 0.3)); + background: #ffffffd9; + color: black; + border-radius: 8px; + } + `], + changeDetection: ChangeDetectionStrategy.OnPush, + standalone: true, + imports: [CommonModule, GalleryModule] +}) +export class CustomTemplateComponent { + + @Input() items: GalleryItem[]; + +} diff --git a/projects/ng-gallery/src/stories/lightbox/CustomTemplates.mdx b/projects/ng-gallery/src/stories/lightbox/CustomTemplates.mdx new file mode 100644 index 00000000..f9d6bea8 --- /dev/null +++ b/projects/ng-gallery/src/stories/lightbox/CustomTemplates.mdx @@ -0,0 +1,48 @@ +import {Meta, Canvas} from "@storybook/addon-docs"; +import * as LightboxStories from "./Lightbox.stories"; + + + +# Custom templates with the Lightbox + +The usage is similar to usage of custom templates in the gallery, however, we need to get a reference to the template and pass it to the gallery config. + +**Example:** + +```ts +import {Component, ViewChild } from '@angular/core'; +import { Gallery, GalleryImageDef } from 'ng-gallery'; + +@Component({ ... }) +export class LightboxExampleComponent { + + // Reference to the image template + @ViewChild(GalleryImageDef) imageDef: GalleryImageDef; + + constructor(public gallery: Gallery) { + } + + ngAfterViewInit() { + this.gallery.ref('lightbox', { + imageTemplate: this.imageDef.templateRef + }).load(this.items); + } +} +``` + +in the template: + +```html +
                                                                                                                                  + {{ item.alt }} +
                                                                                                                                  +``` + +The templates can also be set using `galleryRef.setConfig()` as needed + +```ts +this.galleryRef.setConfig({ + thumbTemplate: this.thumbDef.templateRef, + boxTemplate: this.boxDef.templateRef +}); +``` diff --git a/projects/ng-gallery/src/stories/lightbox/Gallerize.mdx b/projects/ng-gallery/src/stories/lightbox/Gallerize.mdx new file mode 100644 index 00000000..26a843c4 --- /dev/null +++ b/projects/ng-gallery/src/stories/lightbox/Gallerize.mdx @@ -0,0 +1,120 @@ +import {Meta, Canvas} from "@storybook/addon-docs"; +import * as GalleryStories from "./Lightbox.stories"; + + + + +# Gallerize + + + +### Basic usage + +Wrap elements inside a `gallerize` directive + +```html +
                                                                                                                                  + + + + +
                                                                                                                                  +``` +You can also use normal element background instead of `img` + +```html +
                                                                                                                                  +
                                                                                                                                  +
                                                                                                                                  +
                                                                                                                                  +
                                                                                                                                  +
                                                                                                                                  +``` + +### Define image's full and thumbnail sources + +Use the attributes `imageSrc` and `thumbSrc` to set image full size and thumbnail size + +```html +
                                                                                                                                  + +
                                                                                                                                  +``` + +### Gallerize specific elements + +Use the input `[selector]` to gallerize specific elements + +```html +
                                                                                                                                  + +
                                                                                                                                  +``` + +### Multiple galleries + +To use multiple galleries, just set a unique id, e.g. `gallerize="gallery-123"` + +```html +

                                                                                                                                  Gallery 1

                                                                                                                                  + +
                                                                                                                                  + +
                                                                                                                                  + +

                                                                                                                                  Gallery 2

                                                                                                                                  + +
                                                                                                                                  + +
                                                                                                                                  +``` + +Here is a [multiple gallerize stackblitz](https://stackblitz.com/edit/ngx-gallery-multiple-gallerize). + +*** + +### Gallerize on `` component + +**Gallerize** can also be used on `` component, This will trigger the lightbox on a gallery item's click. + + + +Here is a [Gallerize on gallery stackblitz](https://stackblitz.com/edit/ngx-gallery-nqudkt?file=src%2Fapp%2Fhome%2Fhome.component.html) + +*** + +### Set custom config when using `gallerize` + + +```ts +GalleryModule.withConfig({ + thumbPosition: 'bottom' +}), +``` +Here is a demo https://stackblitz.com/edit/ngx-gallery-multiple-gallerize + +```ts +constructor(gallery: Gallery) { + gallery.ref('gallery-1').setConfig({ + thumbPosition: 'bottom' + }) +} +``` diff --git a/projects/ng-gallery/src/stories/lightbox/GettingStarted.mdx b/projects/ng-gallery/src/stories/lightbox/GettingStarted.mdx new file mode 100644 index 00000000..b9c6058c --- /dev/null +++ b/projects/ng-gallery/src/stories/lightbox/GettingStarted.mdx @@ -0,0 +1,49 @@ +import {Meta, Canvas} from "@storybook/addon-docs"; +import * as LightboxStories from "./Lightbox.stories"; + + + +## Installation + +**NPM** + +```bash +npm i ng-gallery @angular/cdk +``` + +## Usage + +- Import the CDK overlay-prebuilt CSS file in your global styles. + +```css +@import '~@angular/cdk/overlay-prebuilt.css'; +``` + + > If you're already using Material, you can skip importing the prebuilt overlay styles. + +- For lightbox usage, see [Lightbox Usage](https://github.com/MurhafSousli/ngx-gallery/wiki/Lightbox-Usage) | [Lightbox Usage Demo](https://ngx-gallery.netlify.app/#/lightbox). +- For gallerize usage, see [Gallerize usage](https://github.com/MurhafSousli/ngx-gallery/wiki/Gallerize-Examples) | [Gallerize Usage Demo](https://ngx-gallery.netlify.app/#/gallerize). + + + +### Global Configuration + +To set global configuration that applies on all lightbox overlays across the app, set the config value using `LIGHTBOX_CONFIG` token + +**Example:** + +```ts +import { LIGHTBOX_CONFIG, LightboxConfig } from 'ng-gallery/lightbox'; + +bootstrapApplication(AppComponent, { + providers: [ + { + provide: LIGHTBOX_CONFIG, + useValue: { + keyboardShortcuts: false, + exitAnimationTime: 1000 + } as LightboxConfig + } + ] +}) +``` diff --git a/projects/ng-gallery/src/stories/lightbox/Lightbox.mdx b/projects/ng-gallery/src/stories/lightbox/Lightbox.mdx new file mode 100644 index 00000000..63d530d6 --- /dev/null +++ b/projects/ng-gallery/src/stories/lightbox/Lightbox.mdx @@ -0,0 +1,123 @@ +import {Meta, Canvas} from "@storybook/addon-docs"; +import * as LightboxStories from "./Lightbox.stories"; + + + +# Lightbox + + + +The usage of the lightbox is pretty straight forward + +### 1. Create gallery items + +```ts +// Assume you have the following data +const data = [ + { + srcUrl: 'https://preview.ibb.co/jrsA6R/img12.jpg', + previewUrl: 'https://preview.ibb.co/jrsA6R/img12.jpg' + }, + { + srcUrl: 'https://preview.ibb.co/kPE1D6/clouds.jpg', + previewUrl: 'https://preview.ibb.co/kPE1D6/clouds.jpg' + } +]; + +// Map the data to gallery image items +let items = data.map(item => + new ImageItem({ src: item.srcUrl, thumb: item.previewUrl }) +); +``` + +### 2. Load them in the gallery + +```ts +this.gallery.ref().load(this.items); +``` + +### 3. Add `[lightbox]` on each thumbnail in your template + +```html + +``` + +Now every image element click will open the lightbox to the proper item + +**Full example:** + +```ts +import { Component, OnInit } from '@angular/core'; +import { Gallery, GalleryItem } from '@ngx-gallery/core'; + +@Component({ + template: ` + + ` +}) +export class AppComponent implements OnInit { + + // Map the data to gallery image items + items: GalleryItem[] = data.map(item => + new ImageItem({ src: item.srcUrl, thumb: item.previewUrl }) + ); + + constructor(public gallery: Gallery) { + } + + ngOnInit() { + // Load items into the gallery + this.gallery.ref().load(this.items); + } +} +``` + +See [Lightbox Example](https://murhafsousli.github.io/ngx-gallery/#/lightbox), [Lightbox Stackblitz](https://stackblitz.com/edit/ngx-gallery-lightbox) + +### Open the lightbox manually + +```ts +import { Lightbox } from '@ngx-gallery/lightbox'; + +constructor(public lightbox: Lightbox) { +} + +openLightbox(index: number) { + this.lightbox.open(index); +} +``` + + +### For fullscreen mode + +By default fullscreen is obtained on small size screen (mobile) but you can set it as the default for all screen sizes + +**Example:** + +```ts +GalleryModule, +LightboxModule.withConfig({ + panelClass: 'fullscreen' +}) +``` + +Or straight through the open function + +```ts +openLightbox() { + this.lightbox.open(0, 'lightboxId', { + panelClass: 'fullscreen' + }); +} +``` +See [Lightbox-API](https://github.com/MurhafSousli/ngx-gallery/wiki/Lightbox-API) + +*** + +Moreover, There is a directive `[gallerize]` that loads the images from the template and opens the lightbox on thumbnails click, check [Galleries example](https://github.com/MurhafSousli/ngx-gallery/wiki/Gallerize-directive) + + diff --git a/projects/ng-gallery/src/stories/lightbox/Lightbox.stories.ts b/projects/ng-gallery/src/stories/lightbox/Lightbox.stories.ts new file mode 100644 index 00000000..06386972 --- /dev/null +++ b/projects/ng-gallery/src/stories/lightbox/Lightbox.stories.ts @@ -0,0 +1,94 @@ +import type { Meta, StoryObj } from '@storybook/angular'; +import { applicationConfig, moduleMetadata } from '@storybook/angular'; +import { provideAnimations } from '@angular/platform-browser/animations'; +import { LightboxModule } from 'ng-gallery/lightbox'; +import { getHDImages } from '../pixabay/pixabay.service'; +import { LightboxExampleComponent } from './lightbox-example'; + +import 'hammerjs'; + +const meta: Meta = { + title: 'Documentations/Lightbox', + component: LightboxExampleComponent, + decorators: [ + moduleMetadata({ + imports: [LightboxModule], + }), + applicationConfig({ + providers: [provideAnimations()], + }), + ] +}; + +export default meta; +type Story = StoryObj; + + +export const LightboxExample: Story = { + parameters: { + docs: { + source: { + code: ` +
                                                                                                                                  + +
                                                                                                                                  + `, + }, + }, + }, + render: (args: LightboxExampleComponent, { loaded: { items } }) => ({ + props: { ...args, items, }, + }), + loaders: [ + async () => ({ items: await getHDImages('ship') }), + ] +}; + + +export const GallerizeExample: Story = { + render: (args: LightboxExampleComponent, { loaded: { items } }) => ({ + props: { ...args, items, }, + template: ` +
                                                                                                                                  + +
                                                                                                                                  + `, + styles: [` + .container { + display: flex; + flex-wrap: wrap; + gap: 3px; + margin: 0 auto; + padding: 20px; + max-width: 768px; + } + img { + height: 90px; + width: 125px; + object-fit: cover; + } + `] + }), + loaders: [ + async () => ({ items: await getHDImages('ship') }), + ] +}; + + +export const GallerizeGalleryExample: Story = { + render: (args: LightboxExampleComponent, { loaded: { items } }) => ({ + props: { ...args, items, }, + template: ` + + ` + }), + loaders: [ + async () => ({ items: await getHDImages('ship') }), + ] +}; diff --git a/projects/ng-gallery/src/stories/lightbox/lightbox-example.ts b/projects/ng-gallery/src/stories/lightbox/lightbox-example.ts new file mode 100644 index 00000000..819bc174 --- /dev/null +++ b/projects/ng-gallery/src/stories/lightbox/lightbox-example.ts @@ -0,0 +1,60 @@ +import { Component, Input, OnDestroy, OnInit, ChangeDetectionStrategy } from '@angular/core'; +import { CommonModule } from '@angular/common'; +import { Gallery, GalleryItem, GalleryRef } from 'ng-gallery'; +import { Lightbox, LightboxModule } from 'ng-gallery/lightbox'; + +@Component({ + selector: 'lightbox-example', + template: ` +
                                                                                                                                  + +
                                                                                                                                  + `, + styles: [` + .container { + display: flex; + flex-wrap: wrap; + gap: 3px; + margin: 0 auto; + padding: 20px; + max-width: 768px; + } + img { + height: 90px; + width: 125px; + object-fit: cover; + } + `], + imports: [CommonModule, LightboxModule], + standalone: true, + changeDetection: ChangeDetectionStrategy.OnPush +}) +export class LightboxExampleComponent implements OnInit, OnDestroy { + + galleryId: string = 'lightbox'; + + galleryRef: GalleryRef; + + @Input() items: GalleryItem[]; + + constructor(public gallery: Gallery, public lightbox: Lightbox) { + } + + ngOnInit(): void { + this.galleryRef = this.gallery.ref('lightbox', { + thumbPosition: 'top', + imageSize: 'cover', + autoHeight: false + }); + + this.galleryRef.load(this.items); + } + + ngOnDestroy(): void { + this.galleryRef.destroy(); + } +} diff --git a/projects/ng-gallery/src/stories/pixabay/pixabay.model.ts b/projects/ng-gallery/src/stories/pixabay/pixabay.model.ts new file mode 100644 index 00000000..845e3376 --- /dev/null +++ b/projects/ng-gallery/src/stories/pixabay/pixabay.model.ts @@ -0,0 +1,54 @@ +export interface PixabayModel { + total: number; + totalHits: number; + hits: Hit[]; +} + +export interface Hit { + id: number; + pageURL: string; + type: string; + tags: string[]; + previewURL: string; + previewWidth: number; + previewHeight: number; + webformatURL: string; + webformatWidth: number; + webformatHeight: number; + imageWidth: number; + imageHeight: number; + imageSize: number; + views: number; + downloads: number; + favorites: number; + likes: number; + comments: number; + user_id: number; + user: string; + userImageURL: string; +} +export interface PixabayHDModel { + total: number; + totalHits: number; + hits: Hit2[]; +} + +export interface Hit2 { + id_hash: string; + type: string; + previewURL: string; + previewWidth: number; + previewHeight: number; + webformatURL: string; + webformatWidth: number; + webformatHeight: number; + largeImageURL: string; + fullHDURL: string; + imageWidth: number; + imageHeight: number; + imageSize: number; + imageURL: string; + user_id: number; + user: string; + userImageURL: string; +} diff --git a/projects/ng-gallery/src/stories/pixabay/pixabay.service.ts b/projects/ng-gallery/src/stories/pixabay/pixabay.service.ts new file mode 100644 index 00000000..2b2b6009 --- /dev/null +++ b/projects/ng-gallery/src/stories/pixabay/pixabay.service.ts @@ -0,0 +1,30 @@ +import { ImageItem, GalleryItem } from 'ng-gallery'; +import { Hit2, PixabayHDModel } from './pixabay.model'; + +const API_KEY: string = '560162-704dd2880c027f22c62ab7941'; + +export function getHDImages(key: string): Promise { + const url: string = `https://pixabay.com/api/?key=${ API_KEY }&q=${ encodeURIComponent(key) }&response_group=high_resolution&editors_choice=true&per_page=18&image_type=photo`; + + return fetch(url).then((r: Response) => r.json()).then((data: PixabayHDModel) => { + return data.hits.map((item: Hit2, i: number) => { + return new ImageItem({ src: item.largeImageURL, thumb: item.previewURL, alt: `photo-${ i }` }) + }); + }) +} + +export function getHDImagesForCustomTemplate(key: string): Promise { + const url: string = `https://pixabay.com/api/?key=${ API_KEY }&q=${ encodeURIComponent(key) }&response_group=high_resolution&editors_choice=true&per_page=18&image_type=photo`; + + return fetch(url).then((r: Response) => r.json()).then((data: PixabayHDModel) => { + return data.hits.map((item: Hit2, i: number) => { + return { + type: 'custom', + data: { + src: item.largeImageURL, + thumb: item.previewURL, alt: `photo-${ i }` + } + } + }); + }) +}