@internetarchive/elements 1.1.5 → 1.1.7-webdev-9378.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +33 -0
- package/dist/src/elements/ia-button/ia-button.d.ts.map +1 -1
- package/dist/src/elements/ia-button/ia-button.js +2 -2
- package/dist/src/elements/ia-button/ia-button.js.map +1 -1
- package/dist/src/elements/ia-combo-box/ia-combo-box.d.ts.map +1 -1
- package/dist/src/elements/ia-combo-box/ia-combo-box.js +3 -2
- package/dist/src/elements/ia-combo-box/ia-combo-box.js.map +1 -1
- package/dist/src/elements/ia-donation-form/currency-validator.d.ts +16 -0
- package/dist/src/elements/ia-donation-form/currency-validator.d.ts.map +1 -0
- package/dist/src/elements/ia-donation-form/currency-validator.js +37 -0
- package/dist/src/elements/ia-donation-form/currency-validator.js.map +1 -0
- package/dist/src/elements/ia-donation-form/form-elements/ia-donation-section.d.ts +21 -0
- package/dist/src/elements/ia-donation-form/form-elements/ia-donation-section.d.ts.map +1 -0
- package/dist/src/elements/ia-donation-form/form-elements/ia-donation-section.js +182 -0
- package/dist/src/elements/ia-donation-form/form-elements/ia-donation-section.js.map +1 -0
- package/dist/src/elements/ia-donation-form/models/donation-payment-info.d.ts +34 -0
- package/dist/src/elements/ia-donation-form/models/donation-payment-info.d.ts.map +1 -0
- package/dist/src/elements/ia-donation-form/models/donation-payment-info.js +54 -0
- package/dist/src/elements/ia-donation-form/models/donation-payment-info.js.map +1 -0
- package/dist/src/elements/ia-donation-form/models/donation-request.d.ts +62 -0
- package/dist/src/elements/ia-donation-form/models/donation-request.d.ts.map +1 -0
- package/dist/src/elements/ia-donation-form/models/donation-request.js +35 -0
- package/dist/src/elements/ia-donation-form/models/donation-request.js.map +1 -0
- package/dist/src/elements/ia-donation-form/models/donation-response.d.ts +67 -0
- package/dist/src/elements/ia-donation-form/models/donation-response.d.ts.map +1 -0
- package/dist/src/elements/ia-donation-form/models/donation-response.js +57 -0
- package/dist/src/elements/ia-donation-form/models/donation-response.js.map +1 -0
- package/dist/src/elements/ia-donation-form/models/donation-type.d.ts +8 -0
- package/dist/src/elements/ia-donation-form/models/donation-type.d.ts.map +1 -0
- package/dist/src/elements/ia-donation-form/models/donation-type.js +7 -0
- package/dist/src/elements/ia-donation-form/models/donation-type.js.map +1 -0
- package/dist/src/elements/ia-donation-form/models/donor-contact-info.d.ts +38 -0
- package/dist/src/elements/ia-donation-form/models/donor-contact-info.d.ts.map +1 -0
- package/dist/src/elements/ia-donation-form/models/donor-contact-info.js +27 -0
- package/dist/src/elements/ia-donation-form/models/donor-contact-info.js.map +1 -0
- package/dist/src/elements/ia-donation-form/models/payment-provider.d.ts +10 -0
- package/dist/src/elements/ia-donation-form/models/payment-provider.d.ts.map +1 -0
- package/dist/src/elements/ia-donation-form/models/payment-provider.js +9 -0
- package/dist/src/elements/ia-donation-form/models/payment-provider.js.map +1 -0
- package/dist/src/elements/ia-dropdown-search-bar/ia-dropdown-search-bar.d.ts +2 -2
- package/dist/src/elements/ia-dropdown-search-bar/ia-dropdown-search-bar.d.ts.map +1 -1
- package/dist/src/elements/ia-dropdown-search-bar/ia-dropdown-search-bar.js +4 -5
- package/dist/src/elements/ia-dropdown-search-bar/ia-dropdown-search-bar.js.map +1 -1
- package/dist/src/elements/ia-expandable-search-bar/ia-expandable-search-bar.d.ts +4 -4
- package/dist/src/elements/ia-expandable-search-bar/ia-expandable-search-bar.d.ts.map +1 -1
- package/dist/src/elements/ia-expandable-search-bar/ia-expandable-search-bar.js +5 -8
- package/dist/src/elements/ia-expandable-search-bar/ia-expandable-search-bar.js.map +1 -1
- package/dist/src/elements/ia-image-viewer/ia-image-viewer.d.ts.map +1 -1
- package/dist/src/elements/ia-image-viewer/ia-image-viewer.js +3 -2
- package/dist/src/elements/ia-image-viewer/ia-image-viewer.js.map +1 -1
- package/dist/src/elements/ia-image-viewer/ia-imgview-controls.d.ts.map +1 -1
- package/dist/src/elements/ia-image-viewer/ia-imgview-controls.js +3 -2
- package/dist/src/elements/ia-image-viewer/ia-imgview-controls.js.map +1 -1
- package/dist/src/elements/ia-image-viewer/ia-imgview-slide.d.ts.map +1 -1
- package/dist/src/elements/ia-image-viewer/ia-imgview-slide.js +3 -2
- package/dist/src/elements/ia-image-viewer/ia-imgview-slide.js.map +1 -1
- package/dist/src/elements/ia-image-viewer/image-viewer-gestures.d.ts.map +1 -1
- package/dist/src/elements/ia-image-viewer/image-viewer-gestures.js +4 -2
- package/dist/src/elements/ia-image-viewer/image-viewer-gestures.js.map +1 -1
- package/dist/src/elements/ia-otp-form/ia-otp-form.d.ts.map +1 -1
- package/dist/src/elements/ia-otp-form/ia-otp-form.js +3 -2
- package/dist/src/elements/ia-otp-form/ia-otp-form.js.map +1 -1
- package/dist/src/elements/ia-playback-controls/ia-playback-controls.d.ts.map +1 -1
- package/dist/src/elements/ia-playback-controls/ia-playback-controls.js +3 -2
- package/dist/src/elements/ia-playback-controls/ia-playback-controls.js.map +1 -1
- package/dist/src/elements/ia-radio-player/ia-radio-player.d.ts.map +1 -1
- package/dist/src/elements/ia-radio-player/ia-radio-player.js +3 -2
- package/dist/src/elements/ia-radio-player/ia-radio-player.js.map +1 -1
- package/dist/src/elements/ia-radio-player/ia-search-results-switcher.d.ts.map +1 -1
- package/dist/src/elements/ia-radio-player/ia-search-results-switcher.js +3 -2
- package/dist/src/elements/ia-radio-player/ia-search-results-switcher.js.map +1 -1
- package/dist/src/elements/ia-scrubber-bar/ia-scrubber-bar.d.ts +2 -2
- package/dist/src/elements/ia-scrubber-bar/ia-scrubber-bar.d.ts.map +1 -1
- package/dist/src/elements/ia-scrubber-bar/ia-scrubber-bar.js +4 -5
- package/dist/src/elements/ia-scrubber-bar/ia-scrubber-bar.js.map +1 -1
- package/dist/src/elements/ia-status-indicator/ia-status-indicator.d.ts +3 -3
- package/dist/src/elements/ia-status-indicator/ia-status-indicator.d.ts.map +1 -1
- package/dist/src/elements/ia-status-indicator/ia-status-indicator.js +7 -12
- package/dist/src/elements/ia-status-indicator/ia-status-indicator.js.map +1 -1
- package/dist/src/elements/ia-topnav/assets/img/icon-audio.d.ts +3 -0
- package/dist/src/elements/ia-topnav/assets/img/icon-audio.d.ts.map +1 -0
- package/dist/src/elements/ia-topnav/assets/img/icon-audio.js +28 -0
- package/dist/src/elements/ia-topnav/assets/img/icon-audio.js.map +1 -0
- package/dist/src/elements/ia-topnav/assets/img/icon-close.d.ts +3 -0
- package/dist/src/elements/ia-topnav/assets/img/icon-close.d.ts.map +1 -0
- package/dist/src/elements/ia-topnav/assets/img/icon-close.js +20 -0
- package/dist/src/elements/ia-topnav/assets/img/icon-close.js.map +1 -0
- package/dist/src/elements/ia-topnav/assets/img/icon-donate-unpadded.d.ts +3 -0
- package/dist/src/elements/ia-topnav/assets/img/icon-donate-unpadded.d.ts.map +1 -0
- package/dist/src/elements/ia-topnav/assets/img/icon-donate-unpadded.js +19 -0
- package/dist/src/elements/ia-topnav/assets/img/icon-donate-unpadded.js.map +1 -0
- package/dist/src/elements/ia-topnav/assets/img/icon-donate.d.ts +3 -0
- package/dist/src/elements/ia-topnav/assets/img/icon-donate.d.ts.map +1 -0
- package/dist/src/elements/ia-topnav/assets/img/icon-donate.js +18 -0
- package/dist/src/elements/ia-topnav/assets/img/icon-donate.js.map +1 -0
- package/dist/src/elements/ia-topnav/assets/img/icon-ellipses.d.ts +3 -0
- package/dist/src/elements/ia-topnav/assets/img/icon-ellipses.d.ts.map +1 -0
- package/dist/src/elements/ia-topnav/assets/img/icon-ellipses.js +19 -0
- package/dist/src/elements/ia-topnav/assets/img/icon-ellipses.js.map +1 -0
- package/dist/src/elements/ia-topnav/assets/img/icon-ia-logo.d.ts +3 -0
- package/dist/src/elements/ia-topnav/assets/img/icon-ia-logo.d.ts.map +1 -0
- package/dist/src/elements/ia-topnav/assets/img/icon-ia-logo.js +30 -0
- package/dist/src/elements/ia-topnav/assets/img/icon-ia-logo.js.map +1 -0
- package/dist/src/elements/ia-topnav/assets/img/icon-images.d.ts +3 -0
- package/dist/src/elements/ia-topnav/assets/img/icon-images.d.ts.map +1 -0
- package/dist/src/elements/ia-topnav/assets/img/icon-images.js +19 -0
- package/dist/src/elements/ia-topnav/assets/img/icon-images.js.map +1 -0
- package/dist/src/elements/ia-topnav/assets/img/icon-search.d.ts +3 -0
- package/dist/src/elements/ia-topnav/assets/img/icon-search.d.ts.map +1 -0
- package/dist/src/elements/ia-topnav/assets/img/icon-search.js +19 -0
- package/dist/src/elements/ia-topnav/assets/img/icon-search.js.map +1 -0
- package/dist/src/elements/ia-topnav/assets/img/icon-software.d.ts +3 -0
- package/dist/src/elements/ia-topnav/assets/img/icon-software.d.ts.map +1 -0
- package/dist/src/elements/ia-topnav/assets/img/icon-software.js +18 -0
- package/dist/src/elements/ia-topnav/assets/img/icon-software.js.map +1 -0
- package/dist/src/elements/ia-topnav/assets/img/icon-texts.d.ts +3 -0
- package/dist/src/elements/ia-topnav/assets/img/icon-texts.d.ts.map +1 -0
- package/dist/src/elements/ia-topnav/assets/img/icon-texts.js +18 -0
- package/dist/src/elements/ia-topnav/assets/img/icon-texts.js.map +1 -0
- package/dist/src/elements/ia-topnav/assets/img/icon-upload-unpadded.d.ts +3 -0
- package/dist/src/elements/ia-topnav/assets/img/icon-upload-unpadded.d.ts.map +1 -0
- package/dist/src/elements/ia-topnav/assets/img/icon-upload-unpadded.js +18 -0
- package/dist/src/elements/ia-topnav/assets/img/icon-upload-unpadded.js.map +1 -0
- package/dist/src/elements/ia-topnav/assets/img/icon-upload.d.ts +3 -0
- package/dist/src/elements/ia-topnav/assets/img/icon-upload.d.ts.map +1 -0
- package/dist/src/elements/ia-topnav/assets/img/icon-upload.js +21 -0
- package/dist/src/elements/ia-topnav/assets/img/icon-upload.js.map +1 -0
- package/dist/src/elements/ia-topnav/assets/img/icon-user.d.ts +3 -0
- package/dist/src/elements/ia-topnav/assets/img/icon-user.d.ts.map +1 -0
- package/dist/src/elements/ia-topnav/assets/img/icon-user.js +19 -0
- package/dist/src/elements/ia-topnav/assets/img/icon-user.js.map +1 -0
- package/dist/src/elements/ia-topnav/assets/img/icon-video.d.ts +3 -0
- package/dist/src/elements/ia-topnav/assets/img/icon-video.d.ts.map +1 -0
- package/dist/src/elements/ia-topnav/assets/img/icon-video.js +19 -0
- package/dist/src/elements/ia-topnav/assets/img/icon-video.js.map +1 -0
- package/dist/src/elements/ia-topnav/assets/img/icon-web.d.ts +3 -0
- package/dist/src/elements/ia-topnav/assets/img/icon-web.d.ts.map +1 -0
- package/dist/src/elements/ia-topnav/assets/img/icon-web.js +19 -0
- package/dist/src/elements/ia-topnav/assets/img/icon-web.js.map +1 -0
- package/dist/src/elements/ia-topnav/assets/img/icon.d.ts +6 -0
- package/dist/src/elements/ia-topnav/assets/img/icon.d.ts.map +1 -0
- package/dist/src/elements/ia-topnav/assets/img/icon.js +17 -0
- package/dist/src/elements/ia-topnav/assets/img/icon.js.map +1 -0
- package/dist/src/elements/ia-topnav/assets/img/icons.d.ts +19 -0
- package/dist/src/elements/ia-topnav/assets/img/icons.d.ts.map +1 -0
- package/dist/src/elements/ia-topnav/assets/img/icons.js +33 -0
- package/dist/src/elements/ia-topnav/assets/img/icons.js.map +1 -0
- package/dist/src/elements/ia-topnav/assets/img/wayback-logo.d.ts +3 -0
- package/dist/src/elements/ia-topnav/assets/img/wayback-logo.d.ts.map +1 -0
- package/dist/src/elements/ia-topnav/assets/img/wayback-logo.js +21 -0
- package/dist/src/elements/ia-topnav/assets/img/wayback-logo.js.map +1 -0
- package/dist/src/elements/ia-topnav/assets/img/wordmark-stacked.d.ts +3 -0
- package/dist/src/elements/ia-topnav/assets/img/wordmark-stacked.d.ts.map +1 -0
- package/dist/src/elements/ia-topnav/assets/img/wordmark-stacked.js +13 -0
- package/dist/src/elements/ia-topnav/assets/img/wordmark-stacked.js.map +1 -0
- package/dist/src/elements/ia-topnav/data/menus.d.ts +14 -0
- package/dist/src/elements/ia-topnav/data/menus.d.ts.map +1 -0
- package/dist/src/elements/ia-topnav/data/menus.js +675 -0
- package/dist/src/elements/ia-topnav/data/menus.js.map +1 -0
- package/dist/src/elements/ia-topnav/dropdown-menu.d.ts +21 -0
- package/dist/src/elements/ia-topnav/dropdown-menu.d.ts.map +1 -0
- package/dist/src/elements/ia-topnav/dropdown-menu.js +315 -0
- package/dist/src/elements/ia-topnav/dropdown-menu.js.map +1 -0
- package/dist/src/elements/ia-topnav/ia-topnav-desktop-subnav.d.ts +11 -0
- package/dist/src/elements/ia-topnav/ia-topnav-desktop-subnav.d.ts.map +1 -0
- package/dist/src/elements/ia-topnav/ia-topnav-desktop-subnav.js +89 -0
- package/dist/src/elements/ia-topnav/ia-topnav-desktop-subnav.js.map +1 -0
- package/dist/src/elements/ia-topnav/ia-topnav-icon-hamburger.d.ts +6 -0
- package/dist/src/elements/ia-topnav/ia-topnav-icon-hamburger.d.ts.map +1 -0
- package/dist/src/elements/ia-topnav/ia-topnav-icon-hamburger.js +47 -0
- package/dist/src/elements/ia-topnav/ia-topnav-icon-hamburger.js.map +1 -0
- package/dist/src/elements/ia-topnav/ia-topnav-login-button.d.ts +20 -0
- package/dist/src/elements/ia-topnav/ia-topnav-login-button.d.ts.map +1 -0
- package/dist/src/elements/ia-topnav/ia-topnav-login-button.js +183 -0
- package/dist/src/elements/ia-topnav/ia-topnav-login-button.js.map +1 -0
- package/dist/src/elements/ia-topnav/ia-topnav-media-button.d.ts +31 -0
- package/dist/src/elements/ia-topnav/ia-topnav-media-button.d.ts.map +1 -0
- package/dist/src/elements/ia-topnav/ia-topnav-media-button.js +307 -0
- package/dist/src/elements/ia-topnav/ia-topnav-media-button.js.map +1 -0
- package/dist/src/elements/ia-topnav/ia-topnav-media-menu.d.ts +21 -0
- package/dist/src/elements/ia-topnav/ia-topnav-media-menu.d.ts.map +1 -0
- package/dist/src/elements/ia-topnav/ia-topnav-media-menu.js +222 -0
- package/dist/src/elements/ia-topnav/ia-topnav-media-menu.js.map +1 -0
- package/dist/src/elements/ia-topnav/ia-topnav-media-slider.d.ts +16 -0
- package/dist/src/elements/ia-topnav/ia-topnav-media-slider.d.ts.map +1 -0
- package/dist/src/elements/ia-topnav/ia-topnav-media-slider.js +221 -0
- package/dist/src/elements/ia-topnav/ia-topnav-media-slider.js.map +1 -0
- package/dist/src/elements/ia-topnav/ia-topnav-media-subnav.d.ts +20 -0
- package/dist/src/elements/ia-topnav/ia-topnav-media-subnav.d.ts.map +1 -0
- package/dist/src/elements/ia-topnav/ia-topnav-media-subnav.js +285 -0
- package/dist/src/elements/ia-topnav/ia-topnav-media-subnav.js.map +1 -0
- package/dist/src/elements/ia-topnav/ia-topnav-more-slider.d.ts +12 -0
- package/dist/src/elements/ia-topnav/ia-topnav-more-slider.d.ts.map +1 -0
- package/dist/src/elements/ia-topnav/ia-topnav-more-slider.js +65 -0
- package/dist/src/elements/ia-topnav/ia-topnav-more-slider.js.map +1 -0
- package/dist/src/elements/ia-topnav/ia-topnav-primary-nav.d.ts +53 -0
- package/dist/src/elements/ia-topnav/ia-topnav-primary-nav.d.ts.map +1 -0
- package/dist/src/elements/ia-topnav/ia-topnav-primary-nav.js +653 -0
- package/dist/src/elements/ia-topnav/ia-topnav-primary-nav.js.map +1 -0
- package/dist/src/elements/ia-topnav/ia-topnav-save-page-form.d.ts +12 -0
- package/dist/src/elements/ia-topnav/ia-topnav-save-page-form.d.ts.map +1 -0
- package/dist/src/elements/ia-topnav/ia-topnav-save-page-form.js +128 -0
- package/dist/src/elements/ia-topnav/ia-topnav-save-page-form.js.map +1 -0
- package/dist/src/elements/ia-topnav/ia-topnav-signed-out-dropdown.d.ts +4 -0
- package/dist/src/elements/ia-topnav/ia-topnav-signed-out-dropdown.d.ts.map +1 -0
- package/dist/src/elements/ia-topnav/ia-topnav-signed-out-dropdown.js +10 -0
- package/dist/src/elements/ia-topnav/ia-topnav-signed-out-dropdown.js.map +1 -0
- package/dist/src/elements/ia-topnav/ia-topnav-user-menu.d.ts +7 -0
- package/dist/src/elements/ia-topnav/ia-topnav-user-menu.d.ts.map +1 -0
- package/dist/src/elements/ia-topnav/ia-topnav-user-menu.js +39 -0
- package/dist/src/elements/ia-topnav/ia-topnav-user-menu.js.map +1 -0
- package/dist/src/elements/ia-topnav/ia-topnav-wayback-search.d.ts +10 -0
- package/dist/src/elements/ia-topnav/ia-topnav-wayback-search.d.ts.map +1 -0
- package/dist/src/elements/ia-topnav/ia-topnav-wayback-search.js +64 -0
- package/dist/src/elements/ia-topnav/ia-topnav-wayback-search.js.map +1 -0
- package/dist/src/elements/ia-topnav/ia-topnav-wayback-slider.d.ts +20 -0
- package/dist/src/elements/ia-topnav/ia-topnav-wayback-slider.d.ts.map +1 -0
- package/dist/src/elements/ia-topnav/ia-topnav-wayback-slider.js +131 -0
- package/dist/src/elements/ia-topnav/ia-topnav-wayback-slider.js.map +1 -0
- package/dist/src/elements/ia-topnav/ia-topnav.d.ts +91 -0
- package/dist/src/elements/ia-topnav/ia-topnav.d.ts.map +1 -0
- package/dist/src/elements/ia-topnav/ia-topnav.js +445 -0
- package/dist/src/elements/ia-topnav/ia-topnav.js.map +1 -0
- package/dist/src/elements/ia-topnav/lib/helpers.d.ts +13 -0
- package/dist/src/elements/ia-topnav/lib/helpers.d.ts.map +1 -0
- package/dist/src/elements/ia-topnav/lib/helpers.js +24 -0
- package/dist/src/elements/ia-topnav/lib/helpers.js.map +1 -0
- package/dist/src/elements/ia-topnav/lib/keyboard-navigation.d.ts +46 -0
- package/dist/src/elements/ia-topnav/lib/keyboard-navigation.d.ts.map +1 -0
- package/dist/src/elements/ia-topnav/lib/keyboard-navigation.js +136 -0
- package/dist/src/elements/ia-topnav/lib/keyboard-navigation.js.map +1 -0
- package/dist/src/elements/ia-topnav/models.d.ts +59 -0
- package/dist/src/elements/ia-topnav/models.d.ts.map +1 -0
- package/dist/src/elements/ia-topnav/models.js +10 -0
- package/dist/src/elements/ia-topnav/models.js.map +1 -0
- package/dist/src/elements/ia-topnav/subnav-list-styles.d.ts +2 -0
- package/dist/src/elements/ia-topnav/subnav-list-styles.d.ts.map +1 -0
- package/dist/src/elements/ia-topnav/subnav-list-styles.js +49 -0
- package/dist/src/elements/ia-topnav/subnav-list-styles.js.map +1 -0
- package/dist/src/elements/ia-topnav/tracked-element.d.ts +6 -0
- package/dist/src/elements/ia-topnav/tracked-element.d.ts.map +1 -0
- package/dist/src/elements/ia-topnav/tracked-element.js +29 -0
- package/dist/src/elements/ia-topnav/tracked-element.js.map +1 -0
- package/dist/src/elements/ia-transcript-view/ia-transcript-entry.d.ts.map +1 -1
- package/dist/src/elements/ia-transcript-view/ia-transcript-entry.js +4 -0
- package/dist/src/elements/ia-transcript-view/ia-transcript-entry.js.map +1 -1
- package/dist/src/elements/ia-transcript-view/ia-transcript-view.d.ts.map +1 -1
- package/dist/src/elements/ia-transcript-view/ia-transcript-view.js +3 -2
- package/dist/src/elements/ia-transcript-view/ia-transcript-view.js.map +1 -1
- package/dist/src/elements/ia-wayback-search-form/ia-wayback-search-form.d.ts +24 -0
- package/dist/src/elements/ia-wayback-search-form/ia-wayback-search-form.d.ts.map +1 -0
- package/dist/src/elements/ia-wayback-search-form/ia-wayback-search-form.js +240 -0
- package/dist/src/elements/ia-wayback-search-form/ia-wayback-search-form.js.map +1 -0
- package/dist/src/locales/es.d.ts +40 -0
- package/dist/src/locales/es.d.ts.map +1 -0
- package/dist/src/locales/es.js +45 -0
- package/dist/src/locales/es.js.map +1 -0
- package/package.json +25 -3
|
@@ -3,7 +3,7 @@ import { css, html, LitElement, nothing, } from 'lit';
|
|
|
3
3
|
import { property, query, state } from 'lit/decorators.js';
|
|
4
4
|
import { customElement } from '../../util/custom-element.js';
|
|
5
5
|
import { classMap } from 'lit/directives/class-map.js';
|
|
6
|
-
import { msg } from '@lit/localize';
|
|
6
|
+
import { localized, msg } from '@lit/localize';
|
|
7
7
|
import themeStyles from '../../themes/theme-styles.js';
|
|
8
8
|
/**
|
|
9
9
|
* A single image in the viewer's track.
|
|
@@ -208,7 +208,8 @@ __decorate([
|
|
|
208
208
|
state()
|
|
209
209
|
], IAImageViewerSlide.prototype, "failed", void 0);
|
|
210
210
|
IAImageViewerSlide = __decorate([
|
|
211
|
-
customElement('ia-imgview-slide')
|
|
211
|
+
customElement('ia-imgview-slide'),
|
|
212
|
+
localized()
|
|
212
213
|
], IAImageViewerSlide);
|
|
213
214
|
export { IAImageViewerSlide };
|
|
214
215
|
//# sourceMappingURL=ia-imgview-slide.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ia-imgview-slide.js","sourceRoot":"","sources":["../../../../src/elements/ia-image-viewer/ia-imgview-slide.ts"],"names":[],"mappings":";AAAA,OAAO,EACL,GAAG,EAEH,IAAI,EACJ,UAAU,EACV,OAAO,GAGR,MAAM,KAAK,CAAC;AACb,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAC3D,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AACzD,OAAO,EAAE,QAAQ,EAAE,MAAM,6BAA6B,CAAC;AACvD,OAAO,EAAE,GAAG,EAAE,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"ia-imgview-slide.js","sourceRoot":"","sources":["../../../../src/elements/ia-image-viewer/ia-imgview-slide.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n css,\n type CSSResultGroup,\n html,\n LitElement,\n nothing,\n type PropertyValues,\n type TemplateResult,\n} from 'lit';\nimport { property, query, state } from 'lit/decorators.js';\nimport { customElement } from '@src/util/custom-element';\nimport { classMap } from 'lit/directives/class-map.js';\nimport { localized, msg } from '@lit/localize';\n\nimport themeStyles from '@src/themes/theme-styles';\nimport type { ImageViewerImage } from './models';\n\n/**\n * A single image in the viewer's track.\n *\n * Owns everything about one image: its load state, its failure message, and\n * the link that opens the full-size file. The viewer creates these both from\n * its template and by hand during a drag, so the element works with no\n * per-instance setup beyond its properties.\n */\n@customElement('ia-imgview-slide')\n@localized()\nexport class IAImageViewerSlide extends LitElement {\n @property({ type: Object }) image?: ImageViewerImage;\n\n @query('.main-image') private imageElement?: HTMLImageElement;\n\n @state() private loaded = false;\n\n @state() private failed = false;\n\n protected willUpdate(changed: PropertyValues): void {\n if (changed.has('image')) {\n this.loaded = false;\n this.failed = false;\n }\n }\n\n protected updated(): void {\n this.checkAlreadyResolved();\n }\n\n render(): TemplateResult | typeof nothing {\n if (!this.image) return nothing;\n\n const imageClasses = { 'main-image': true, loaded: this.loaded };\n const linkClasses = { 'image-link': true, failed: this.failed };\n\n return html`\n <a\n class=${classMap(linkClasses)}\n href=${this.image.url}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n @click=${this.onClick}\n >\n <img\n class=${classMap(imageClasses)}\n src=${this.image.url}\n alt=${this.image.title ?? this.image.name}\n data-image-name=${this.image.name}\n draggable=\"false\"\n @load=${this.markLoaded}\n @error=${this.markFailed}\n />\n <div class=\"loading-spinner\"></div>\n ${this.failed\n ? html`<p class=\"image-failed\">\n ${msg('This image could not be loaded.')}\n </p>`\n : nothing}\n </a>\n `;\n }\n\n /**\n * Lets the viewer veto opening the image, which it does when the click is\n * the tail end of a swipe. A host can veto it too, to show the image its own\n * way instead of in a new tab.\n */\n private onClick(e: MouseEvent): void {\n if (!this.image) return;\n const allowed = this.dispatchEvent(\n new CustomEvent('imageActivated', {\n detail: { image: this.image },\n bubbles: true,\n cancelable: true,\n }),\n );\n if (!allowed) e.preventDefault();\n }\n\n private markLoaded = (): void => {\n this.loaded = true;\n this.failed = false;\n this.report('imageLoaded');\n };\n\n private markFailed = (): void => {\n this.loaded = false;\n this.failed = true;\n this.report('imageFailed');\n };\n\n /**\n * Tells the viewer what happened to this image, so it can pass failures on\n * to the host. Bubbles because the viewer listens on the track, which is\n * also where the slides it creates by hand during a drag end up.\n */\n private report(name: 'imageLoaded' | 'imageFailed'): void {\n if (!this.image) return;\n this.dispatchEvent(\n new CustomEvent(name, { detail: { image: this.image }, bubbles: true }),\n );\n }\n\n /**\n * Catches an image that finished before its listeners could fire, because\n * the browser had already resolved the request (from the cache or a\n * preload) by the time the element rendered.\n *\n * `complete` is true for a failed image as well as a loaded one, so the two\n * are told apart by `naturalWidth`, which stays 0 when the load failed.\n */\n private checkAlreadyResolved(): void {\n const img = this.imageElement;\n if (!img || this.loaded || this.failed || !img.complete) return;\n if (img.naturalWidth > 0) this.markLoaded();\n else this.markFailed();\n }\n\n static get styles(): CSSResultGroup {\n return [\n themeStyles,\n css`\n :host {\n --imgview-slide-text-color--: var(\n --image-viewer-text-color,\n var(--true-white)\n );\n\n flex: 0 0 100%;\n height: 100%;\n display: flex;\n align-items: center;\n justify-content: center;\n position: relative;\n }\n\n .image-link {\n display: flex;\n align-items: center;\n justify-content: center;\n height: 100%;\n cursor: pointer;\n }\n\n .main-image {\n display: block;\n max-height: 100%;\n max-width: 100%;\n object-fit: contain;\n opacity: 0;\n transition: opacity 0.2s ease;\n user-select: none;\n }\n\n .main-image.loaded {\n opacity: 1;\n }\n\n .main-image.loaded + .loading-spinner,\n .image-link.failed .loading-spinner {\n display: none;\n }\n\n .loading-spinner {\n position: absolute;\n width: 24px;\n height: 24px;\n border: 2px solid rgba(255, 255, 255, 0.15);\n border-top-color: rgba(255, 255, 255, 0.5);\n border-radius: 50%;\n animation: spin 0.8s linear infinite;\n }\n\n @keyframes spin {\n to {\n transform: rotate(360deg);\n }\n }\n\n .image-failed {\n position: absolute;\n margin: 0;\n padding: 0 1.6rem;\n color: var(--imgview-slide-text-color--);\n font-size: 1.4rem;\n text-align: center;\n }\n\n @media (prefers-reduced-motion: reduce) {\n .loading-spinner {\n animation: none;\n }\n\n .main-image {\n transition: none;\n }\n }\n `,\n ];\n }\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"image-viewer-gestures.d.ts","sourceRoot":"","sources":["../../../../src/elements/ia-image-viewer/image-viewer-gestures.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,sBAAsB,EAAE,MAAM,KAAK,CAAC;AAGtE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAE/C,mEAAmE;AACnE,MAAM,MAAM,sBAAsB,GAAG,sBAAsB,GAAG;IAC5D,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAE5B,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAE9B,sEAAsE;IACtE,QAAQ,CAAC,SAAS,CAAC,EAAE,WAAW,CAAC;IAEjC,qCAAqC;IACrC,QAAQ,CAAC,UAAU,CAAC,EAAE,WAAW,CAAC;IAElC,0EAA0E;IAC1E,iBAAiB,IAAI,IAAI,CAAC;IAE1B,QAAQ,IAAI,IAAI,CAAC;IAEjB,YAAY,IAAI,IAAI,CAAC;IAErB,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IAExC,kEAAkE;IAClE,gBAAgB,IAAI,IAAI,CAAC;IAEzB,gBAAgB,IAAI,IAAI,CAAC;IAEzB,qEAAqE;IACrE,UAAU,CAAC,SAAS,EAAE,cAAc,GAAG,IAAI,CAAC;CAC7C,CAAC;AA0BF;;;;;;;GAOG;AACH,qBAAa,mBAAoB,YAAW,kBAAkB;IAC5D,4EAA4E;IAC5E,QAAQ,UAAS;IAEjB,OAAO,CAAC,IAAI,CAAyB;IAErC;;;;;OAKG;IACH,OAAO,CAAC,WAAW,CAA4B;IAE/C,OAAO,CAAC,WAAW,CAAuB;IAE1C,OAAO,CAAC,WAAW,CAAuB;IAE1C,OAAO,CAAC,cAAc,CAAK;IAE3B,sEAAsE;IACtE,OAAO,CAAC,OAAO,CAAS;IAExB,+EAA+E;IAC/E,OAAO,CAAC,YAAY,CAAS;IAE7B,OAAO,CAAC,WAAW,CAAK;IAExB,OAAO,CAAC,WAAW,CAAK;IAExB,OAAO,CAAC,cAAc,CAAS;IAE/B,OAAO,CAAC,qBAAqB,CAAK;gBAEtB,IAAI,EAAE,sBAAsB;IAKxC,aAAa,IAAI,IAAI;IAOrB,WAAW,IAAI,IAAI;IAInB,gBAAgB,IAAI,IAAI;IAKxB;;;OAGG;IACH,eAAe,IAAI,OAAO;IAM1B,wEAAwE;IACxE,gBAAgB,IAAI,IAAI;IAMxB;;;;;OAKG;IACH,OAAO,CAAC,eAAe;IAavB,OAAO,CAAC,eAAe;IAUvB,OAAO,CAAC,YAAY,CASlB;IAEF,OAAO,CAAC,WAAW,CAmBjB;IAEF,OAAO,CAAC,UAAU,CAmFhB;IAEF,kEAAkE;IAClE,OAAO,CAAC,kBAAkB;IAM1B,OAAO,CAAC,OAAO,CAyBb;IAEF,OAAO,CAAC,SAAS,
|
|
1
|
+
{"version":3,"file":"image-viewer-gestures.d.ts","sourceRoot":"","sources":["../../../../src/elements/ia-image-viewer/image-viewer-gestures.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,sBAAsB,EAAE,MAAM,KAAK,CAAC;AAGtE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAE/C,mEAAmE;AACnE,MAAM,MAAM,sBAAsB,GAAG,sBAAsB,GAAG;IAC5D,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAE5B,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAE9B,sEAAsE;IACtE,QAAQ,CAAC,SAAS,CAAC,EAAE,WAAW,CAAC;IAEjC,qCAAqC;IACrC,QAAQ,CAAC,UAAU,CAAC,EAAE,WAAW,CAAC;IAElC,0EAA0E;IAC1E,iBAAiB,IAAI,IAAI,CAAC;IAE1B,QAAQ,IAAI,IAAI,CAAC;IAEjB,YAAY,IAAI,IAAI,CAAC;IAErB,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IAExC,kEAAkE;IAClE,gBAAgB,IAAI,IAAI,CAAC;IAEzB,gBAAgB,IAAI,IAAI,CAAC;IAEzB,qEAAqE;IACrE,UAAU,CAAC,SAAS,EAAE,cAAc,GAAG,IAAI,CAAC;CAC7C,CAAC;AA0BF;;;;;;;GAOG;AACH,qBAAa,mBAAoB,YAAW,kBAAkB;IAC5D,4EAA4E;IAC5E,QAAQ,UAAS;IAEjB,OAAO,CAAC,IAAI,CAAyB;IAErC;;;;;OAKG;IACH,OAAO,CAAC,WAAW,CAA4B;IAE/C,OAAO,CAAC,WAAW,CAAuB;IAE1C,OAAO,CAAC,WAAW,CAAuB;IAE1C,OAAO,CAAC,cAAc,CAAK;IAE3B,sEAAsE;IACtE,OAAO,CAAC,OAAO,CAAS;IAExB,+EAA+E;IAC/E,OAAO,CAAC,YAAY,CAAS;IAE7B,OAAO,CAAC,WAAW,CAAK;IAExB,OAAO,CAAC,WAAW,CAAK;IAExB,OAAO,CAAC,cAAc,CAAS;IAE/B,OAAO,CAAC,qBAAqB,CAAK;gBAEtB,IAAI,EAAE,sBAAsB;IAKxC,aAAa,IAAI,IAAI;IAOrB,WAAW,IAAI,IAAI;IAInB,gBAAgB,IAAI,IAAI;IAKxB;;;OAGG;IACH,eAAe,IAAI,OAAO;IAM1B,wEAAwE;IACxE,gBAAgB,IAAI,IAAI;IAMxB;;;;;OAKG;IACH,OAAO,CAAC,eAAe;IAavB,OAAO,CAAC,eAAe;IAUvB,OAAO,CAAC,YAAY,CASlB;IAEF,OAAO,CAAC,WAAW,CAmBjB;IAEF,OAAO,CAAC,UAAU,CAmFhB;IAEF,kEAAkE;IAClE,OAAO,CAAC,kBAAkB;IAM1B,OAAO,CAAC,OAAO,CAyBb;IAEF,OAAO,CAAC,SAAS,CASf;CACH"}
|
|
@@ -172,8 +172,10 @@ export class ImageViewerGestures {
|
|
|
172
172
|
this.onKeydown = (e) => {
|
|
173
173
|
if (this.host.imageCount <= 1)
|
|
174
174
|
return;
|
|
175
|
-
|
|
176
|
-
|
|
175
|
+
// A listener on `document` sees a shadow-DOM event retargeted to its
|
|
176
|
+
// outermost host, so the focused field is the first entry in the path.
|
|
177
|
+
const target = (e.composedPath()[0] ?? e.target);
|
|
178
|
+
if (['INPUT', 'TEXTAREA', 'SELECT'].includes(target.tagName))
|
|
177
179
|
return;
|
|
178
180
|
if (target.isContentEditable)
|
|
179
181
|
return;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"image-viewer-gestures.js","sourceRoot":"","sources":["../../../../src/elements/ia-image-viewer/image-viewer-gestures.ts"],"names":[],"mappings":"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","sourcesContent":["import type { ReactiveController, ReactiveControllerHost } from 'lit';\n\nimport { prefersReducedMotion } from '@src/util/prefers-reduced-motion';\nimport type { SlideDirection } from './models';\n\n/** What the gesture controller needs from the viewer it drives. */\nexport type ImageViewerGestureHost = ReactiveControllerHost & {\n readonly imageCount: number;\n\n readonly currentIndex: number;\n\n /** The element gestures are tracked against, once it has rendered. */\n readonly imageArea?: HTMLElement;\n\n /** The element a drag translates. */\n readonly slideTrack?: HTMLElement;\n\n /** Commits an in-flight slide animation so a new one starts from rest. */\n settleIfAnimating(): void;\n\n showNext(): void;\n\n showPrevious(): void;\n\n preloadAroundIndex(index: number): void;\n\n /** Adds the neighbouring slides a drag reveals on either side. */\n insertDragSlides(): void;\n\n removeDragSlides(): void;\n\n /** Advances to the neighbouring image a completed drag landed on. */\n commitDrag(direction: SlideDirection): void;\n};\n\n/** Minimum horizontal travel before a gesture counts as a swipe at all */\nconst SWIPE_THRESHOLD = 30;\n\n/** Minimum swipe distance (fraction of width) to commit navigation */\nconst SWIPE_COMMIT_FRACTION = 0.25;\n\n/** Minimum velocity (px/ms) for a flick to commit regardless of distance */\nconst SWIPE_FLICK_VELOCITY = 0.3;\n\n/** Longest the track takes to settle after the finger lifts */\nconst SETTLE_MAX_MS = 300;\n\n/** How long a snap-back takes when the swipe didn't go far enough */\nconst SNAP_BACK_MS = 200;\n\n/** Horizontal wheel travel that adds up to one navigation */\nconst WHEEL_THRESHOLD = 80;\n\n/** How long after an animation to keep ignoring wheel inertia */\nconst WHEEL_COOLDOWN_MS = 300;\n\n/** How far a finger travels before the gesture locks in as horizontal */\nconst SWIPE_LOCK_DISTANCE = 10;\n\n/**\n * Touch, wheel and keyboard navigation for the image viewer.\n *\n * A drag is driven imperatively: it translates the track directly and asks the\n * viewer to insert neighbouring slides by hand, because a re-render mid-gesture\n * would replace the element the touch started on and the browser would fire\n * touchcancel.\n */\nexport class ImageViewerGestures implements ReactiveController {\n /** Whether a drag is in progress. The viewer reads this while rendering. */\n dragging = false;\n\n private host: ImageViewerGestureHost;\n\n /**\n * The element the touch and wheel listeners are currently on, so they can\n * follow the image area when it's replaced. A boolean wouldn't: the area is\n * removed whenever the image list empties, and a later refill renders a\n * different element.\n */\n private listeningTo: HTMLElement | null = null;\n\n private touchStartX: number | null = null;\n\n private touchStartY: number | null = null;\n\n private touchStartTime = 0;\n\n /** Whether the current gesture has locked in as a horizontal swipe */\n private swiping = false;\n\n /** Set when a swipe completes, so the tap it ends on doesn't open the image */\n private swipeHandled = false;\n\n private dragOffsetX = 0;\n\n private wheelDeltaX = 0;\n\n private wheelAnimating = false;\n\n private wheelAnimationEndTime = 0;\n\n constructor(host: ImageViewerGestureHost) {\n this.host = host;\n host.addController(this);\n }\n\n hostConnected(): void {\n document.addEventListener('keydown', this.onKeydown);\n // Reconnecting doesn't schedule an update, so the gesture listeners have\n // to be put back here rather than waiting for one.\n this.attachListeners();\n }\n\n hostUpdated(): void {\n this.attachListeners();\n }\n\n hostDisconnected(): void {\n document.removeEventListener('keydown', this.onKeydown);\n this.detachListeners();\n }\n\n /**\n * Whether a swipe just ended on this tap, meaning the click that follows it\n * should be ignored rather than treated as opening the image.\n */\n consumeSwipeTap(): boolean {\n if (!this.swipeHandled) return false;\n this.swipeHandled = false;\n return true;\n }\n\n /** Lets wheel navigation resume once a slide animation has finished. */\n animationSettled(): void {\n this.wheelAnimating = false;\n this.wheelAnimationEndTime = performance.now();\n this.wheelDeltaX = 0;\n }\n\n /**\n * Points the gesture listeners at the current image area, moving them off\n * the previous one. The area isn't rendered until there are images to show,\n * and it's torn down and rebuilt whenever the list empties and refills, so\n * this runs on every update and re-attaches whenever the element changes.\n */\n private attachListeners(): void {\n const area = this.host.imageArea;\n if (area === this.listeningTo) return;\n this.detachListeners();\n if (!area) return;\n\n this.listeningTo = area;\n area.addEventListener('touchstart', this.onTouchStart, { passive: true });\n area.addEventListener('touchmove', this.onTouchMove, { passive: false });\n area.addEventListener('touchend', this.onTouchEnd, { passive: true });\n area.addEventListener('wheel', this.onWheel, { passive: false });\n }\n\n private detachListeners(): void {\n const area = this.listeningTo;\n if (!area) return;\n area.removeEventListener('touchstart', this.onTouchStart);\n area.removeEventListener('touchmove', this.onTouchMove);\n area.removeEventListener('touchend', this.onTouchEnd);\n area.removeEventListener('wheel', this.onWheel);\n this.listeningTo = null;\n }\n\n private onTouchStart = (e: TouchEvent): void => {\n if (this.host.imageCount <= 1) return;\n this.host.settleIfAnimating();\n const touch = e.touches[0];\n this.touchStartX = touch.clientX;\n this.touchStartY = touch.clientY;\n this.touchStartTime = e.timeStamp;\n this.swiping = false;\n this.dragOffsetX = 0;\n };\n\n private onTouchMove = (e: TouchEvent): void => {\n if (this.touchStartX === null || this.touchStartY === null) return;\n const dx = e.touches[0].clientX - this.touchStartX;\n const dy = e.touches[0].clientY - this.touchStartY;\n\n const locksHorizontal =\n Math.abs(dx) > Math.abs(dy) && Math.abs(dx) > SWIPE_LOCK_DISTANCE;\n if (!this.swiping && locksHorizontal) {\n this.swiping = true;\n this.dragging = true;\n this.host.preloadAroundIndex(this.host.currentIndex);\n this.host.insertDragSlides();\n }\n\n if (!this.swiping) return;\n e.preventDefault();\n\n this.dragOffsetX = dx;\n this.applyDragTransform();\n };\n\n private onTouchEnd = (e: TouchEvent): void => {\n if (this.touchStartX === null) return;\n const dx = e.changedTouches[0].clientX - this.touchStartX;\n const elapsed = e.timeStamp - this.touchStartTime;\n this.touchStartX = null;\n this.touchStartY = null;\n\n if (!this.swiping) return;\n this.swiping = false;\n\n const track = this.host.slideTrack;\n const area = this.host.imageArea;\n if (!track || !area) {\n this.dragging = false;\n return;\n }\n\n const width = area.offsetWidth;\n const velocity = Math.abs(dx) / Math.max(elapsed, 1);\n const pastThreshold = Math.abs(dx) > width * SWIPE_COMMIT_FRACTION;\n const flicked = velocity > SWIPE_FLICK_VELOCITY;\n const shouldCommit =\n (pastThreshold || flicked) && Math.abs(dx) >= SWIPE_THRESHOLD;\n const direction: SlideDirection = dx < 0 ? 'next' : 'prev';\n\n this.swipeHandled = true;\n\n // The rest of the way is proportional to how far the finger already got,\n // so a nearly complete swipe finishes almost instantly.\n const remainingFraction = (width - Math.abs(dx)) / width;\n const completionDuration = shouldCommit\n ? Math.round(\n Math.max(\n 100,\n Math.min(SETTLE_MAX_MS, remainingFraction * SETTLE_MAX_MS),\n ),\n )\n : SNAP_BACK_MS;\n\n const finalTransform = !shouldCommit\n ? 'translateX(-100%)'\n : direction === 'next'\n ? 'translateX(-200%)'\n : 'translateX(0%)';\n\n const finish = (): void => {\n track.style.transition = '';\n track.style.transform = '';\n\n if (shouldCommit) this.host.commitDrag(direction);\n\n this.dragging = false;\n this.dragOffsetX = 0;\n // Remove the hand-inserted slides before the viewer renders, since it\n // doesn't track them and would leave them in the track.\n this.host.removeDragSlides();\n this.host.preloadAroundIndex(this.host.currentIndex);\n this.host.requestUpdate();\n };\n\n // With reduced motion there's nothing to transition, and a zero-duration\n // transition doesn't fire transitionend, so settle straight away rather\n // than waiting on the timeout that would otherwise cover for it.\n if (prefersReducedMotion()) {\n track.style.transform = finalTransform;\n finish();\n return;\n }\n\n track.style.transition = `transform ${completionDuration}ms ease-out`;\n track.style.transform = finalTransform;\n\n let settled = false;\n const onTransitionDone = (): void => {\n if (settled) return;\n settled = true;\n track.removeEventListener('transitionend', onTransitionDone);\n finish();\n };\n\n track.addEventListener('transitionend', onTransitionDone);\n // Fallback in case transitionend doesn't fire\n setTimeout(onTransitionDone, completionDuration + 50);\n };\n\n /** Applies the drag offset to the track during touch gestures. */\n private applyDragTransform(): void {\n const track = this.host.slideTrack;\n if (!this.dragging || !track) return;\n track.style.transform = `translateX(calc(-100% + ${this.dragOffsetX}px))`;\n }\n\n private onWheel = (e: WheelEvent): void => {\n if (this.host.imageCount <= 1) return;\n\n // Ignore vertical-dominant scrolls\n if (Math.abs(e.deltaY) > Math.abs(e.deltaX)) return;\n if (e.deltaX === 0) return;\n\n e.preventDefault();\n\n // Block during animation and for a brief cooldown after to absorb inertia\n const inCooldown =\n performance.now() - this.wheelAnimationEndTime < WHEEL_COOLDOWN_MS;\n if (this.wheelAnimating || inCooldown) {\n this.wheelDeltaX = 0;\n return;\n }\n\n this.wheelDeltaX += e.deltaX;\n if (Math.abs(this.wheelDeltaX) < WHEEL_THRESHOLD) return;\n\n const forward = this.wheelDeltaX > 0;\n this.wheelDeltaX = 0;\n this.wheelAnimating = true;\n if (forward) this.host.showNext();\n else this.host.showPrevious();\n };\n\n private onKeydown = (e: KeyboardEvent): void => {\n if (this.host.imageCount <= 1) return;\n const target = e.target as HTMLElement;\n if (target.tagName === 'INPUT' || target.tagName === 'TEXTAREA') return;\n if (target.isContentEditable) return;\n if (e.key === 'ArrowLeft') this.host.showPrevious();\n else if (e.key === 'ArrowRight') this.host.showNext();\n };\n}\n"]}
|
|
1
|
+
{"version":3,"file":"image-viewer-gestures.js","sourceRoot":"","sources":["../../../../src/elements/ia-image-viewer/image-viewer-gestures.ts"],"names":[],"mappings":"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","sourcesContent":["import type { ReactiveController, ReactiveControllerHost } from 'lit';\n\nimport { prefersReducedMotion } from '@src/util/prefers-reduced-motion';\nimport type { SlideDirection } from './models';\n\n/** What the gesture controller needs from the viewer it drives. */\nexport type ImageViewerGestureHost = ReactiveControllerHost & {\n readonly imageCount: number;\n\n readonly currentIndex: number;\n\n /** The element gestures are tracked against, once it has rendered. */\n readonly imageArea?: HTMLElement;\n\n /** The element a drag translates. */\n readonly slideTrack?: HTMLElement;\n\n /** Commits an in-flight slide animation so a new one starts from rest. */\n settleIfAnimating(): void;\n\n showNext(): void;\n\n showPrevious(): void;\n\n preloadAroundIndex(index: number): void;\n\n /** Adds the neighbouring slides a drag reveals on either side. */\n insertDragSlides(): void;\n\n removeDragSlides(): void;\n\n /** Advances to the neighbouring image a completed drag landed on. */\n commitDrag(direction: SlideDirection): void;\n};\n\n/** Minimum horizontal travel before a gesture counts as a swipe at all */\nconst SWIPE_THRESHOLD = 30;\n\n/** Minimum swipe distance (fraction of width) to commit navigation */\nconst SWIPE_COMMIT_FRACTION = 0.25;\n\n/** Minimum velocity (px/ms) for a flick to commit regardless of distance */\nconst SWIPE_FLICK_VELOCITY = 0.3;\n\n/** Longest the track takes to settle after the finger lifts */\nconst SETTLE_MAX_MS = 300;\n\n/** How long a snap-back takes when the swipe didn't go far enough */\nconst SNAP_BACK_MS = 200;\n\n/** Horizontal wheel travel that adds up to one navigation */\nconst WHEEL_THRESHOLD = 80;\n\n/** How long after an animation to keep ignoring wheel inertia */\nconst WHEEL_COOLDOWN_MS = 300;\n\n/** How far a finger travels before the gesture locks in as horizontal */\nconst SWIPE_LOCK_DISTANCE = 10;\n\n/**\n * Touch, wheel and keyboard navigation for the image viewer.\n *\n * A drag is driven imperatively: it translates the track directly and asks the\n * viewer to insert neighbouring slides by hand, because a re-render mid-gesture\n * would replace the element the touch started on and the browser would fire\n * touchcancel.\n */\nexport class ImageViewerGestures implements ReactiveController {\n /** Whether a drag is in progress. The viewer reads this while rendering. */\n dragging = false;\n\n private host: ImageViewerGestureHost;\n\n /**\n * The element the touch and wheel listeners are currently on, so they can\n * follow the image area when it's replaced. A boolean wouldn't: the area is\n * removed whenever the image list empties, and a later refill renders a\n * different element.\n */\n private listeningTo: HTMLElement | null = null;\n\n private touchStartX: number | null = null;\n\n private touchStartY: number | null = null;\n\n private touchStartTime = 0;\n\n /** Whether the current gesture has locked in as a horizontal swipe */\n private swiping = false;\n\n /** Set when a swipe completes, so the tap it ends on doesn't open the image */\n private swipeHandled = false;\n\n private dragOffsetX = 0;\n\n private wheelDeltaX = 0;\n\n private wheelAnimating = false;\n\n private wheelAnimationEndTime = 0;\n\n constructor(host: ImageViewerGestureHost) {\n this.host = host;\n host.addController(this);\n }\n\n hostConnected(): void {\n document.addEventListener('keydown', this.onKeydown);\n // Reconnecting doesn't schedule an update, so the gesture listeners have\n // to be put back here rather than waiting for one.\n this.attachListeners();\n }\n\n hostUpdated(): void {\n this.attachListeners();\n }\n\n hostDisconnected(): void {\n document.removeEventListener('keydown', this.onKeydown);\n this.detachListeners();\n }\n\n /**\n * Whether a swipe just ended on this tap, meaning the click that follows it\n * should be ignored rather than treated as opening the image.\n */\n consumeSwipeTap(): boolean {\n if (!this.swipeHandled) return false;\n this.swipeHandled = false;\n return true;\n }\n\n /** Lets wheel navigation resume once a slide animation has finished. */\n animationSettled(): void {\n this.wheelAnimating = false;\n this.wheelAnimationEndTime = performance.now();\n this.wheelDeltaX = 0;\n }\n\n /**\n * Points the gesture listeners at the current image area, moving them off\n * the previous one. The area isn't rendered until there are images to show,\n * and it's torn down and rebuilt whenever the list empties and refills, so\n * this runs on every update and re-attaches whenever the element changes.\n */\n private attachListeners(): void {\n const area = this.host.imageArea;\n if (area === this.listeningTo) return;\n this.detachListeners();\n if (!area) return;\n\n this.listeningTo = area;\n area.addEventListener('touchstart', this.onTouchStart, { passive: true });\n area.addEventListener('touchmove', this.onTouchMove, { passive: false });\n area.addEventListener('touchend', this.onTouchEnd, { passive: true });\n area.addEventListener('wheel', this.onWheel, { passive: false });\n }\n\n private detachListeners(): void {\n const area = this.listeningTo;\n if (!area) return;\n area.removeEventListener('touchstart', this.onTouchStart);\n area.removeEventListener('touchmove', this.onTouchMove);\n area.removeEventListener('touchend', this.onTouchEnd);\n area.removeEventListener('wheel', this.onWheel);\n this.listeningTo = null;\n }\n\n private onTouchStart = (e: TouchEvent): void => {\n if (this.host.imageCount <= 1) return;\n this.host.settleIfAnimating();\n const touch = e.touches[0];\n this.touchStartX = touch.clientX;\n this.touchStartY = touch.clientY;\n this.touchStartTime = e.timeStamp;\n this.swiping = false;\n this.dragOffsetX = 0;\n };\n\n private onTouchMove = (e: TouchEvent): void => {\n if (this.touchStartX === null || this.touchStartY === null) return;\n const dx = e.touches[0].clientX - this.touchStartX;\n const dy = e.touches[0].clientY - this.touchStartY;\n\n const locksHorizontal =\n Math.abs(dx) > Math.abs(dy) && Math.abs(dx) > SWIPE_LOCK_DISTANCE;\n if (!this.swiping && locksHorizontal) {\n this.swiping = true;\n this.dragging = true;\n this.host.preloadAroundIndex(this.host.currentIndex);\n this.host.insertDragSlides();\n }\n\n if (!this.swiping) return;\n e.preventDefault();\n\n this.dragOffsetX = dx;\n this.applyDragTransform();\n };\n\n private onTouchEnd = (e: TouchEvent): void => {\n if (this.touchStartX === null) return;\n const dx = e.changedTouches[0].clientX - this.touchStartX;\n const elapsed = e.timeStamp - this.touchStartTime;\n this.touchStartX = null;\n this.touchStartY = null;\n\n if (!this.swiping) return;\n this.swiping = false;\n\n const track = this.host.slideTrack;\n const area = this.host.imageArea;\n if (!track || !area) {\n this.dragging = false;\n return;\n }\n\n const width = area.offsetWidth;\n const velocity = Math.abs(dx) / Math.max(elapsed, 1);\n const pastThreshold = Math.abs(dx) > width * SWIPE_COMMIT_FRACTION;\n const flicked = velocity > SWIPE_FLICK_VELOCITY;\n const shouldCommit =\n (pastThreshold || flicked) && Math.abs(dx) >= SWIPE_THRESHOLD;\n const direction: SlideDirection = dx < 0 ? 'next' : 'prev';\n\n this.swipeHandled = true;\n\n // The rest of the way is proportional to how far the finger already got,\n // so a nearly complete swipe finishes almost instantly.\n const remainingFraction = (width - Math.abs(dx)) / width;\n const completionDuration = shouldCommit\n ? Math.round(\n Math.max(\n 100,\n Math.min(SETTLE_MAX_MS, remainingFraction * SETTLE_MAX_MS),\n ),\n )\n : SNAP_BACK_MS;\n\n const finalTransform = !shouldCommit\n ? 'translateX(-100%)'\n : direction === 'next'\n ? 'translateX(-200%)'\n : 'translateX(0%)';\n\n const finish = (): void => {\n track.style.transition = '';\n track.style.transform = '';\n\n if (shouldCommit) this.host.commitDrag(direction);\n\n this.dragging = false;\n this.dragOffsetX = 0;\n // Remove the hand-inserted slides before the viewer renders, since it\n // doesn't track them and would leave them in the track.\n this.host.removeDragSlides();\n this.host.preloadAroundIndex(this.host.currentIndex);\n this.host.requestUpdate();\n };\n\n // With reduced motion there's nothing to transition, and a zero-duration\n // transition doesn't fire transitionend, so settle straight away rather\n // than waiting on the timeout that would otherwise cover for it.\n if (prefersReducedMotion()) {\n track.style.transform = finalTransform;\n finish();\n return;\n }\n\n track.style.transition = `transform ${completionDuration}ms ease-out`;\n track.style.transform = finalTransform;\n\n let settled = false;\n const onTransitionDone = (): void => {\n if (settled) return;\n settled = true;\n track.removeEventListener('transitionend', onTransitionDone);\n finish();\n };\n\n track.addEventListener('transitionend', onTransitionDone);\n // Fallback in case transitionend doesn't fire\n setTimeout(onTransitionDone, completionDuration + 50);\n };\n\n /** Applies the drag offset to the track during touch gestures. */\n private applyDragTransform(): void {\n const track = this.host.slideTrack;\n if (!this.dragging || !track) return;\n track.style.transform = `translateX(calc(-100% + ${this.dragOffsetX}px))`;\n }\n\n private onWheel = (e: WheelEvent): void => {\n if (this.host.imageCount <= 1) return;\n\n // Ignore vertical-dominant scrolls\n if (Math.abs(e.deltaY) > Math.abs(e.deltaX)) return;\n if (e.deltaX === 0) return;\n\n e.preventDefault();\n\n // Block during animation and for a brief cooldown after to absorb inertia\n const inCooldown =\n performance.now() - this.wheelAnimationEndTime < WHEEL_COOLDOWN_MS;\n if (this.wheelAnimating || inCooldown) {\n this.wheelDeltaX = 0;\n return;\n }\n\n this.wheelDeltaX += e.deltaX;\n if (Math.abs(this.wheelDeltaX) < WHEEL_THRESHOLD) return;\n\n const forward = this.wheelDeltaX > 0;\n this.wheelDeltaX = 0;\n this.wheelAnimating = true;\n if (forward) this.host.showNext();\n else this.host.showPrevious();\n };\n\n private onKeydown = (e: KeyboardEvent): void => {\n if (this.host.imageCount <= 1) return;\n // A listener on `document` sees a shadow-DOM event retargeted to its\n // outermost host, so the focused field is the first entry in the path.\n const target = (e.composedPath()[0] ?? e.target) as HTMLElement;\n if (['INPUT', 'TEXTAREA', 'SELECT'].includes(target.tagName)) return;\n if (target.isContentEditable) return;\n if (e.key === 'ArrowLeft') this.host.showPrevious();\n else if (e.key === 'ArrowRight') this.host.showNext();\n };\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ia-otp-form.d.ts","sourceRoot":"","sources":["../../../../src/elements/ia-otp-form/ia-otp-form.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,UAAU,EACV,cAAc,EACd,cAAc,EAGd,cAAc,EACf,MAAM,KAAK,CAAC;AAQb,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,uDAAuD,CAAC;AAE3F,OAAO,uDAAuD,CAAC;AAC/D,OAAO,yCAAyC,CAAC;AACjD,OAAO,mCAAmC,CAAC;AAU3C;;GAEG;AACH,
|
|
1
|
+
{"version":3,"file":"ia-otp-form.d.ts","sourceRoot":"","sources":["../../../../src/elements/ia-otp-form/ia-otp-form.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,UAAU,EACV,cAAc,EACd,cAAc,EAGd,cAAc,EACf,MAAM,KAAK,CAAC;AAQb,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,uDAAuD,CAAC;AAE3F,OAAO,uDAAuD,CAAC;AAC/D,OAAO,yCAAyC,CAAC;AACjD,OAAO,mCAAmC,CAAC;AAU3C;;GAEG;AACH,qBAEa,SAAU,SAAQ,UAAU;IAGvC,gBAAgB,EAAE,aAAa,CAAW;IAI1C,cAAc,EAAE,OAAO,CAAS;IAIhC,gBAAgB,EAAE,MAAM,CAAK;IAI7B,WAAW,EAAE,OAAO,CAAQ;IAG5B,OAAO,CAAC,QAAQ,CAAc;IAE9B,MAAM,IAAI,cAAc;IAuBxB,SAAS,CAAC,UAAU,CAAC,OAAO,EAAE,cAAc,GAAG,IAAI;IAenD,OAAO,KAAK,wBAAwB,GAiBnC;YAGa,sBAAsB;IAUpC,MAAM,KAAK,MAAM,IAAI,cAAc,CA8ClC;CACF"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { __decorate } from "tslib";
|
|
2
2
|
import { html, LitElement, css, nothing, } from 'lit';
|
|
3
|
-
import { msg } from '@lit/localize';
|
|
3
|
+
import { localized, msg } from '@lit/localize';
|
|
4
4
|
import { property, query } from 'lit/decorators.js';
|
|
5
5
|
import { customElement } from '../../util/custom-element.js';
|
|
6
6
|
import themeStyles from '../../themes/theme-styles.js';
|
|
@@ -152,7 +152,8 @@ __decorate([
|
|
|
152
152
|
query('ia-otp-input')
|
|
153
153
|
], IAOTPForm.prototype, "OTPInput", void 0);
|
|
154
154
|
IAOTPForm = __decorate([
|
|
155
|
-
customElement('ia-otp-form')
|
|
155
|
+
customElement('ia-otp-form'),
|
|
156
|
+
localized()
|
|
156
157
|
], IAOTPForm);
|
|
157
158
|
export { IAOTPForm };
|
|
158
159
|
//# sourceMappingURL=ia-otp-form.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ia-otp-form.js","sourceRoot":"","sources":["../../../../src/elements/ia-otp-form/ia-otp-form.ts"],"names":[],"mappings":";AAAA,OAAO,EACL,IAAI,EACJ,UAAU,EAGV,GAAG,EACH,OAAO,GAER,MAAM,KAAK,CAAC;AACb,OAAO,EAAE,GAAG,EAAE,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"ia-otp-form.js","sourceRoot":"","sources":["../../../../src/elements/ia-otp-form/ia-otp-form.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n html,\n LitElement,\n TemplateResult,\n CSSResultGroup,\n css,\n nothing,\n PropertyValues,\n} from 'lit';\nimport { localized, msg } from '@lit/localize';\nimport { property, query } from 'lit/decorators.js';\nimport { customElement } from '@src/util/custom-element';\n\nimport themeStyles from '@src/themes/theme-styles';\n\nimport type { IAOTPInput } from '@src/elements/ia-otp-input/ia-otp-input';\nimport type { LoadingStatus } from '@src/elements/ia-status-indicator/ia-status-indicator';\n\nimport '@src/elements/ia-status-indicator/ia-status-indicator';\nimport '@src/elements/ia-otp-input/ia-otp-input';\nimport '@src/elements/ia-button/ia-button';\n\n/**\n * Custom events fired by the component\n */\nconst Events = {\n NewCodeRequested: 'newCodeRequested',\n CodeSubmitted: 'codeSubmitted', // Bubbles up from ia-otp-input\n};\n\n/**\n * Form for entering OTP codes, including success/loading/error states and a request new code button\n */\n@customElement('ia-otp-form')\n@localized()\nexport class IAOTPForm extends LitElement {\n /* The state of the validation process */\n @property({ type: String })\n validationStatus: LoadingStatus = 'ready';\n\n /* Whether to display a loading indicator instead of the button text */\n @property({ type: Boolean })\n newCodeSending: boolean = false;\n\n /* Number of characters to expect for the passcode */\n @property({ type: Number })\n numPasscodeChars: number = 6;\n\n /* Whether to restrict entry to numeric characters */\n @property({ type: Boolean })\n numericOnly: boolean = true;\n\n @query('ia-otp-input')\n private OTPInput!: IAOTPInput;\n\n render(): TemplateResult {\n return html`\n <div class=\"input-section\">\n <ia-otp-input\n .numChars=${this.numPasscodeChars}\n ?numericOnly=${this.numericOnly}\n ?disabled=${this.validationStatus === 'loading' ||\n this.validationStatus === 'success'}\n ></ia-otp-input>\n <ia-status-indicator\n part=\"status-indicator\"\n .mode=${this.validationStatus}\n ></ia-status-indicator>\n </div>\n ${this.validationStatus === 'error'\n ? html`<p class=\"error-msg\">\n ${msg('The code entered is invalid or expired')}\n </p>`\n : nothing}\n ${this.resendCodeButtonTemplate}\n `;\n }\n\n protected willUpdate(changed: PropertyValues): void {\n if (\n changed.has('validationStatus') &&\n this.OTPInput &&\n this.validationStatus === 'error'\n ) {\n this.OTPInput.prefillValue = '';\n }\n\n if (changed.has('newCodeSending') && this.newCodeSending && this.OTPInput) {\n this.OTPInput.prefillValue = '';\n }\n }\n\n /* The button to display to send a new code */\n private get resendCodeButtonTemplate(): TemplateResult {\n return this.newCodeSending\n ? html`<span part=\"new-code-message\" class=\"new-code-msg\"\n >${msg('Emailing...')}</span\n >`\n : html`\n <ia-button\n mode=\"link\"\n class=\"new-code-btn\"\n part=\"new-code-button\"\n .disabled=${this.validationStatus === 'loading' ||\n this.validationStatus === 'success'}\n @click=${this.handleNewCodeRequested}\n >\n ${msg('Email me another code')}\n </ia-button>\n `;\n }\n\n /* Emits an event to request the new code */\n private async handleNewCodeRequested(): Promise<void> {\n this.dispatchEvent(\n new CustomEvent(Events.NewCodeRequested, {\n bubbles: true,\n composed: true,\n }),\n );\n this.OTPInput.prefillValue = '';\n }\n\n static get styles(): CSSResultGroup {\n return [\n themeStyles,\n css`\n :host {\n --font-size-standard--: var(--font-size-standard);\n --font-size-lg--: var(--font-size-lg);\n --color-success--: var(--color-success);\n --color-danger--: var(--color-danger);\n --link-color--: var(--link-color);\n\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n }\n\n .input-section {\n display: flex;\n flex-direction: row;\n align-items: center;\n justify-content: center;\n gap: 5px;\n }\n\n ia-status-indicator {\n --icon-width: calc(var(--font-size-lg--) * 1.33);\n }\n\n .error-msg {\n margin-top: 10px;\n font-size: var(--font-size-standard--);\n color: var(--color-danger--);\n margin-bottom: -10px;\n }\n\n .new-code-msg {\n margin-top: 10px;\n font-size: var(--font-size-standard--);\n color: var(--link-color--);\n display: flex;\n flex-direction: column;\n justify-content: center;\n }\n `,\n ];\n }\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ia-playback-controls.d.ts","sourceRoot":"","sources":["../../../../src/elements/ia-playback-controls/ia-playback-controls.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,UAAU,EACV,KAAK,cAAc,EACnB,KAAK,cAAc,EACpB,MAAM,KAAK,CAAC;AAKb,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAoCxC;;;;;;GAMG;AACH,
|
|
1
|
+
{"version":3,"file":"ia-playback-controls.d.ts","sourceRoot":"","sources":["../../../../src/elements/ia-playback-controls/ia-playback-controls.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,UAAU,EACV,KAAK,cAAc,EACnB,KAAK,cAAc,EACpB,MAAM,KAAK,CAAC;AAKb,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAoCxC;;;;;;GAMG;AACH,qBAEa,kBAAmB,SAAQ,UAAU;IAChD,6CAA6C;IACjB,YAAY,EAAE,YAAY,CAAuB;IAE7E,yDAAyD;IAC7B,YAAY,SAAK;IAE7C,kDAAkD;IACtB,MAAM,SAAK;IAEvC,MAAM,IAAI,cAAc;IAkFxB,OAAO,KAAK,SAAS,GAEpB;IAED;;;;;;;OAOG;IACH,OAAO,KAAK,aAAa,GAExB;IAED,uEAAuE;IACvE,OAAO,KAAK,aAAa,GAExB;IAED;;;;;;;OAOG;IACH,OAAO,KAAK,iBAAiB,GAE5B;IAED;;;;;OAKG;IACH,OAAO,KAAK,WAAW,GAEtB;IAED,OAAO,KAAK,mBAAmB,GAE9B;IAED,OAAO,KAAK,gBAAgB,GAI3B;IAED;;;;;;;OAOG;IACH,OAAO,CAAC,wBAAwB;IAiBhC,wEAAwE;IACxE,OAAO,CAAC,kBAAkB;IAW1B,OAAO,CAAC,gBAAgB;IAIxB,OAAO,CAAC,mBAAmB;IAI3B,OAAO,CAAC,uBAAuB;IAI/B,OAAO,CAAC,uBAAuB;IAI/B,OAAO,CAAC,qBAAqB;IAQ7B,MAAM,KAAK,MAAM,IAAI,cAAc,CAiGlC;CACF"}
|
|
@@ -2,7 +2,7 @@ import { __decorate } from "tslib";
|
|
|
2
2
|
import { css, html, LitElement, } from 'lit';
|
|
3
3
|
import { property } from 'lit/decorators.js';
|
|
4
4
|
import { customElement } from '../../util/custom-element.js';
|
|
5
|
-
import { msg, str } from '@lit/localize';
|
|
5
|
+
import { localized, msg, str } from '@lit/localize';
|
|
6
6
|
import { PlaybackMode } from './models.js';
|
|
7
7
|
import nextSectionIcon from './assets/next-section.js';
|
|
8
8
|
import pauseIcon from './assets/pause.js';
|
|
@@ -332,7 +332,8 @@ __decorate([
|
|
|
332
332
|
property({ type: Number })
|
|
333
333
|
], IAPlaybackControls.prototype, "volume", void 0);
|
|
334
334
|
IAPlaybackControls = __decorate([
|
|
335
|
-
customElement('ia-playback-controls')
|
|
335
|
+
customElement('ia-playback-controls'),
|
|
336
|
+
localized()
|
|
336
337
|
], IAPlaybackControls);
|
|
337
338
|
export { IAPlaybackControls };
|
|
338
339
|
//# sourceMappingURL=ia-playback-controls.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ia-playback-controls.js","sourceRoot":"","sources":["../../../../src/elements/ia-playback-controls/ia-playback-controls.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n css,\n html,\n LitElement,\n type CSSResultGroup,\n type TemplateResult,\n} from 'lit';\nimport { property } from 'lit/decorators.js';\nimport { customElement } from '@src/util/custom-element';\nimport { msg, str } from '@lit/localize';\n\nimport { PlaybackMode } from './models';\n\nimport nextSectionIcon from './assets/next-section';\nimport pauseIcon from './assets/pause';\nimport playIcon from './assets/play';\nimport playbackSpeedIcon from './assets/playback-speed';\nimport previousSectionIcon from './assets/previous-section';\nimport replayIcon from './assets/replay';\nimport skipAheadIcon from './assets/skip-ahead';\nimport volumeFullIcon from './assets/volume-full';\nimport volumeMediumIcon from './assets/volume-medium';\nimport volumeMuteIcon from './assets/volume-mute';\n\n/**\n * Event names emitted by this component\n */\nconst Events = {\n PlaybackRateChange: 'playbackRateChange',\n VolumeChange: 'volumeChange',\n BackButtonPressed: 'back-button-pressed',\n ForwardButtonPressed: 'forward-button-pressed',\n PlayPauseButtonPressed: 'play-pause-button-pressed',\n PrevSectionButtonPressed: 'prev-section-button-pressed',\n NextSectionButtonPressed: 'next-section-button-pressed',\n};\n\n/** How much one press of the speed button moves the playback rate */\nconst PLAYBACK_RATE_STEP = 0.25;\n\n/** The rate the speed button wraps back around to once it passes the top */\nconst MIN_PLAYBACK_RATE = 0.5;\nconst MAX_PLAYBACK_RATE = 2;\n\n/** How much one press of the volume button moves the volume */\nconst VOLUME_STEP = 0.25;\n\n/**\n * The transport controls for a player: play and pause, skip back and forward\n * ten seconds, jump between sections, and cycle the speed and volume.\n *\n * The element owns no playback itself. It reports presses and lets whatever is\n * playing the audio decide what to do with them.\n */\n@customElement('ia-playback-controls')\nexport class IAPlaybackControls extends LitElement {\n /** Whether the track is playing or paused */\n @property({ type: String }) playbackMode: PlaybackMode = PlaybackMode.paused;\n\n /** Playback speed multiplier, where 1 is normal speed */\n @property({ type: Number }) playbackRate = 1;\n\n /** Playback volume, from 0 (muted) to 1 (full) */\n @property({ type: Number }) volume = 1;\n\n render(): TemplateResult {\n return html`\n <div class=\"container\">\n <div class=\"vertical-button-stack playback-speed\">\n <div class=\"vertical-button-container\">\n <button\n id=\"playback-rate-btn\"\n class=\"unstyled-button\"\n aria-label=${this.playbackRateLabel}\n @click=${this.handlePlaybackRateChange}\n >\n ${playbackSpeedIcon}\n </button>\n </div>\n <div class=\"vertical-button-value\" aria-hidden=\"true\">\n ${this.playbackRate}x\n </div>\n </div>\n\n <button\n id=\"prev-section-btn\"\n class=\"jump-btn unstyled-button\"\n aria-label=${msg('Previous section')}\n @click=${this.handlePrevSectionButton}\n >\n ${previousSectionIcon}\n </button>\n\n <button\n id=\"back-btn\"\n class=\"jump-btn unstyled-button\"\n aria-label=${msg('Skip back ten seconds')}\n @click=${this.handleBackButton}\n >\n ${replayIcon}\n </button>\n\n <button\n id=\"play-pause-btn\"\n aria-label=${this.isPlaying ? msg('Pause') : msg('Play')}\n @click=${this.handlePlayPauseButton}\n >\n ${this.playPauseButtonIcon}\n </button>\n\n <button\n id=\"forward-btn\"\n class=\"jump-btn unstyled-button\"\n aria-label=${msg('Skip ahead ten seconds')}\n @click=${this.handleForwardButton}\n >\n ${skipAheadIcon}\n </button>\n\n <button\n id=\"next-section-btn\"\n class=\"jump-btn unstyled-button\"\n aria-label=${msg('Next section')}\n @click=${this.handleNextSectionButton}\n >\n ${nextSectionIcon}\n </button>\n\n <div class=\"vertical-button-stack volume\">\n <div class=\"vertical-button-container\">\n <button\n id=\"volume-control-btn\"\n class=\"unstyled-button\"\n aria-label=${this.volumeLabel}\n @click=${this.handleVolumeChange}\n >\n ${this.volumeButtonIcon}\n </button>\n </div>\n <div class=\"vertical-button-value\" aria-hidden=\"true\">\n ${this.volumePercent}%\n </div>\n </div>\n </div>\n `;\n }\n\n private get isPlaying(): boolean {\n return this.playbackMode === PlaybackMode.playing;\n }\n\n /**\n * The volume held to the 0 to 1 range the controls can represent.\n *\n * `volume` is a public property, so it can arrive out of range or as\n * something that isn't a number at all. Everything that displays, announces\n * or steps the volume reads it through here, so an impossible value never\n * reaches the screen reader.\n */\n private get clampedVolume(): number {\n return Math.min(Math.max(this.volume || 0, 0), 1);\n }\n\n /** The volume as a whole number, for display and for screen readers */\n private get volumePercent(): number {\n return Math.round(this.clampedVolume * 100);\n }\n\n /**\n * The accessible name for the speed button.\n *\n * The rate is left bare rather than followed by a unit like \"times\", because\n * `@lit/localize` has no plural support, so a unit baked into the string\n * reads wrong at 1 and translators have no way to correct it. The visible\n * label beside the button carries the \"x\".\n */\n private get playbackRateLabel(): string {\n return msg(str`Playback speed, currently ${this.playbackRate}`);\n }\n\n /**\n * The accessible name for the volume button.\n *\n * \"percent\" is safe to include, unlike a pluralised unit: it reads correctly\n * at every value.\n */\n private get volumeLabel(): string {\n return msg(str`Volume, currently ${this.volumePercent} percent`);\n }\n\n private get playPauseButtonIcon(): TemplateResult {\n return this.isPlaying ? pauseIcon : playIcon;\n }\n\n private get volumeButtonIcon(): TemplateResult {\n if (this.clampedVolume <= 0) return volumeMuteIcon;\n if (this.clampedVolume >= 1) return volumeFullIcon;\n return volumeMediumIcon;\n }\n\n /**\n * Steps the playback rate up, wrapping back to the slowest once it reaches\n * the fastest.\n *\n * The rate is clamped on the way in as well as the way out, so a rate set\n * from outside the range lands back on the documented steps rather than\n * drifting off the grid, overshooting the top, or climbing forever.\n */\n private handlePlaybackRateChange(): void {\n const current = Math.max(\n this.playbackRate || MIN_PLAYBACK_RATE,\n MIN_PLAYBACK_RATE,\n );\n this.playbackRate =\n current >= MAX_PLAYBACK_RATE\n ? MIN_PLAYBACK_RATE\n : Math.min(current + PLAYBACK_RATE_STEP, MAX_PLAYBACK_RATE);\n\n this.dispatchEvent(\n new CustomEvent<{ playbackRate: number }>(Events.PlaybackRateChange, {\n detail: { playbackRate: this.playbackRate },\n }),\n );\n }\n\n /** Steps the volume up, wrapping round to muted once it passes full. */\n private handleVolumeChange(): void {\n const current = this.clampedVolume;\n this.volume = current >= 1 ? 0 : Math.min(current + VOLUME_STEP, 1);\n\n this.dispatchEvent(\n new CustomEvent<{ volume: number }>(Events.VolumeChange, {\n detail: { volume: this.volume },\n }),\n );\n }\n\n private handleBackButton(): void {\n this.dispatchEvent(new Event(Events.BackButtonPressed));\n }\n\n private handleForwardButton(): void {\n this.dispatchEvent(new Event(Events.ForwardButtonPressed));\n }\n\n private handlePrevSectionButton(): void {\n this.dispatchEvent(new Event(Events.PrevSectionButtonPressed));\n }\n\n private handleNextSectionButton(): void {\n this.dispatchEvent(new Event(Events.NextSectionButtonPressed));\n }\n\n private handlePlayPauseButton(): void {\n this.playbackMode = this.isPlaying\n ? PlaybackMode.paused\n : PlaybackMode.playing;\n\n this.dispatchEvent(new Event(Events.PlayPauseButtonPressed));\n }\n\n static get styles(): CSSResultGroup {\n return css`\n :host {\n --playback-controls-icon-color--: var(\n --ia-theme-playback-controls-icon-color,\n #fff\n );\n --playback-controls-play-icon-color--: var(\n --ia-theme-playback-controls-play-icon-color,\n #333\n );\n --playback-controls-play-button-color--: var(\n --ia-theme-playback-controls-play-button-color,\n #fff\n );\n --playback-controls-play-button-diameter--: var(\n --ia-theme-playback-controls-play-button-diameter,\n 4rem\n );\n\n display: flex;\n justify-content: center;\n align-items: center;\n padding-left: 0.25rem;\n padding-right: 0.25rem;\n }\n\n .container {\n display: flex;\n justify-content: space-between;\n align-items: center;\n color: var(--playback-controls-icon-color--);\n width: 100%;\n }\n\n .vertical-button-stack {\n display: flex;\n flex-direction: column;\n justify-content: center;\n }\n\n .vertical-button-container {\n text-align: center;\n }\n\n .vertical-button-container button,\n .vertical-button-container svg {\n vertical-align: bottom;\n }\n\n .vertical-button-value {\n font-size: 0.7em;\n line-height: 1.4em;\n text-align: center;\n }\n\n #play-pause-btn {\n border-radius: 50%;\n /* Buttons are border-box, so the UA's default padding would eat into\n the icon's content box and shrink the glyph relative to the circle\n by a different amount at every diameter. */\n padding: 0;\n height: var(--playback-controls-play-button-diameter--);\n width: var(--playback-controls-play-button-diameter--);\n border: none;\n background-color: var(--playback-controls-play-button-color--);\n color: var(--playback-controls-play-icon-color--);\n vertical-align: middle;\n }\n\n #play-pause-btn:active {\n opacity: 0.75;\n }\n\n #play-pause-btn svg {\n width: 100%;\n height: 100%;\n }\n\n .unstyled-button {\n background: none;\n border: none;\n margin: 0;\n padding: 0;\n /* Buttons don't inherit color from their parent, so the icons'\n currentColor needs it passed down explicitly. */\n color: inherit;\n }\n\n button {\n cursor: pointer;\n }\n\n .jump-btn:active {\n opacity: 0.75;\n }\n `;\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"ia-playback-controls.js","sourceRoot":"","sources":["../../../../src/elements/ia-playback-controls/ia-playback-controls.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n css,\n html,\n LitElement,\n type CSSResultGroup,\n type TemplateResult,\n} from 'lit';\nimport { property } from 'lit/decorators.js';\nimport { customElement } from '@src/util/custom-element';\nimport { localized, msg, str } from '@lit/localize';\n\nimport { PlaybackMode } from './models';\n\nimport nextSectionIcon from './assets/next-section';\nimport pauseIcon from './assets/pause';\nimport playIcon from './assets/play';\nimport playbackSpeedIcon from './assets/playback-speed';\nimport previousSectionIcon from './assets/previous-section';\nimport replayIcon from './assets/replay';\nimport skipAheadIcon from './assets/skip-ahead';\nimport volumeFullIcon from './assets/volume-full';\nimport volumeMediumIcon from './assets/volume-medium';\nimport volumeMuteIcon from './assets/volume-mute';\n\n/**\n * Event names emitted by this component\n */\nconst Events = {\n PlaybackRateChange: 'playbackRateChange',\n VolumeChange: 'volumeChange',\n BackButtonPressed: 'back-button-pressed',\n ForwardButtonPressed: 'forward-button-pressed',\n PlayPauseButtonPressed: 'play-pause-button-pressed',\n PrevSectionButtonPressed: 'prev-section-button-pressed',\n NextSectionButtonPressed: 'next-section-button-pressed',\n};\n\n/** How much one press of the speed button moves the playback rate */\nconst PLAYBACK_RATE_STEP = 0.25;\n\n/** The rate the speed button wraps back around to once it passes the top */\nconst MIN_PLAYBACK_RATE = 0.5;\nconst MAX_PLAYBACK_RATE = 2;\n\n/** How much one press of the volume button moves the volume */\nconst VOLUME_STEP = 0.25;\n\n/**\n * The transport controls for a player: play and pause, skip back and forward\n * ten seconds, jump between sections, and cycle the speed and volume.\n *\n * The element owns no playback itself. It reports presses and lets whatever is\n * playing the audio decide what to do with them.\n */\n@customElement('ia-playback-controls')\n@localized()\nexport class IAPlaybackControls extends LitElement {\n /** Whether the track is playing or paused */\n @property({ type: String }) playbackMode: PlaybackMode = PlaybackMode.paused;\n\n /** Playback speed multiplier, where 1 is normal speed */\n @property({ type: Number }) playbackRate = 1;\n\n /** Playback volume, from 0 (muted) to 1 (full) */\n @property({ type: Number }) volume = 1;\n\n render(): TemplateResult {\n return html`\n <div class=\"container\">\n <div class=\"vertical-button-stack playback-speed\">\n <div class=\"vertical-button-container\">\n <button\n id=\"playback-rate-btn\"\n class=\"unstyled-button\"\n aria-label=${this.playbackRateLabel}\n @click=${this.handlePlaybackRateChange}\n >\n ${playbackSpeedIcon}\n </button>\n </div>\n <div class=\"vertical-button-value\" aria-hidden=\"true\">\n ${this.playbackRate}x\n </div>\n </div>\n\n <button\n id=\"prev-section-btn\"\n class=\"jump-btn unstyled-button\"\n aria-label=${msg('Previous section')}\n @click=${this.handlePrevSectionButton}\n >\n ${previousSectionIcon}\n </button>\n\n <button\n id=\"back-btn\"\n class=\"jump-btn unstyled-button\"\n aria-label=${msg('Skip back ten seconds')}\n @click=${this.handleBackButton}\n >\n ${replayIcon}\n </button>\n\n <button\n id=\"play-pause-btn\"\n aria-label=${this.isPlaying ? msg('Pause') : msg('Play')}\n @click=${this.handlePlayPauseButton}\n >\n ${this.playPauseButtonIcon}\n </button>\n\n <button\n id=\"forward-btn\"\n class=\"jump-btn unstyled-button\"\n aria-label=${msg('Skip ahead ten seconds')}\n @click=${this.handleForwardButton}\n >\n ${skipAheadIcon}\n </button>\n\n <button\n id=\"next-section-btn\"\n class=\"jump-btn unstyled-button\"\n aria-label=${msg('Next section')}\n @click=${this.handleNextSectionButton}\n >\n ${nextSectionIcon}\n </button>\n\n <div class=\"vertical-button-stack volume\">\n <div class=\"vertical-button-container\">\n <button\n id=\"volume-control-btn\"\n class=\"unstyled-button\"\n aria-label=${this.volumeLabel}\n @click=${this.handleVolumeChange}\n >\n ${this.volumeButtonIcon}\n </button>\n </div>\n <div class=\"vertical-button-value\" aria-hidden=\"true\">\n ${this.volumePercent}%\n </div>\n </div>\n </div>\n `;\n }\n\n private get isPlaying(): boolean {\n return this.playbackMode === PlaybackMode.playing;\n }\n\n /**\n * The volume held to the 0 to 1 range the controls can represent.\n *\n * `volume` is a public property, so it can arrive out of range or as\n * something that isn't a number at all. Everything that displays, announces\n * or steps the volume reads it through here, so an impossible value never\n * reaches the screen reader.\n */\n private get clampedVolume(): number {\n return Math.min(Math.max(this.volume || 0, 0), 1);\n }\n\n /** The volume as a whole number, for display and for screen readers */\n private get volumePercent(): number {\n return Math.round(this.clampedVolume * 100);\n }\n\n /**\n * The accessible name for the speed button.\n *\n * The rate is left bare rather than followed by a unit like \"times\", because\n * `@lit/localize` has no plural support, so a unit baked into the string\n * reads wrong at 1 and translators have no way to correct it. The visible\n * label beside the button carries the \"x\".\n */\n private get playbackRateLabel(): string {\n return msg(str`Playback speed, currently ${this.playbackRate}`);\n }\n\n /**\n * The accessible name for the volume button.\n *\n * \"percent\" is safe to include, unlike a pluralised unit: it reads correctly\n * at every value.\n */\n private get volumeLabel(): string {\n return msg(str`Volume, currently ${this.volumePercent} percent`);\n }\n\n private get playPauseButtonIcon(): TemplateResult {\n return this.isPlaying ? pauseIcon : playIcon;\n }\n\n private get volumeButtonIcon(): TemplateResult {\n if (this.clampedVolume <= 0) return volumeMuteIcon;\n if (this.clampedVolume >= 1) return volumeFullIcon;\n return volumeMediumIcon;\n }\n\n /**\n * Steps the playback rate up, wrapping back to the slowest once it reaches\n * the fastest.\n *\n * The rate is clamped on the way in as well as the way out, so a rate set\n * from outside the range lands back on the documented steps rather than\n * drifting off the grid, overshooting the top, or climbing forever.\n */\n private handlePlaybackRateChange(): void {\n const current = Math.max(\n this.playbackRate || MIN_PLAYBACK_RATE,\n MIN_PLAYBACK_RATE,\n );\n this.playbackRate =\n current >= MAX_PLAYBACK_RATE\n ? MIN_PLAYBACK_RATE\n : Math.min(current + PLAYBACK_RATE_STEP, MAX_PLAYBACK_RATE);\n\n this.dispatchEvent(\n new CustomEvent<{ playbackRate: number }>(Events.PlaybackRateChange, {\n detail: { playbackRate: this.playbackRate },\n }),\n );\n }\n\n /** Steps the volume up, wrapping round to muted once it passes full. */\n private handleVolumeChange(): void {\n const current = this.clampedVolume;\n this.volume = current >= 1 ? 0 : Math.min(current + VOLUME_STEP, 1);\n\n this.dispatchEvent(\n new CustomEvent<{ volume: number }>(Events.VolumeChange, {\n detail: { volume: this.volume },\n }),\n );\n }\n\n private handleBackButton(): void {\n this.dispatchEvent(new Event(Events.BackButtonPressed));\n }\n\n private handleForwardButton(): void {\n this.dispatchEvent(new Event(Events.ForwardButtonPressed));\n }\n\n private handlePrevSectionButton(): void {\n this.dispatchEvent(new Event(Events.PrevSectionButtonPressed));\n }\n\n private handleNextSectionButton(): void {\n this.dispatchEvent(new Event(Events.NextSectionButtonPressed));\n }\n\n private handlePlayPauseButton(): void {\n this.playbackMode = this.isPlaying\n ? PlaybackMode.paused\n : PlaybackMode.playing;\n\n this.dispatchEvent(new Event(Events.PlayPauseButtonPressed));\n }\n\n static get styles(): CSSResultGroup {\n return css`\n :host {\n --playback-controls-icon-color--: var(\n --ia-theme-playback-controls-icon-color,\n #fff\n );\n --playback-controls-play-icon-color--: var(\n --ia-theme-playback-controls-play-icon-color,\n #333\n );\n --playback-controls-play-button-color--: var(\n --ia-theme-playback-controls-play-button-color,\n #fff\n );\n --playback-controls-play-button-diameter--: var(\n --ia-theme-playback-controls-play-button-diameter,\n 4rem\n );\n\n display: flex;\n justify-content: center;\n align-items: center;\n padding-left: 0.25rem;\n padding-right: 0.25rem;\n }\n\n .container {\n display: flex;\n justify-content: space-between;\n align-items: center;\n color: var(--playback-controls-icon-color--);\n width: 100%;\n }\n\n .vertical-button-stack {\n display: flex;\n flex-direction: column;\n justify-content: center;\n }\n\n .vertical-button-container {\n text-align: center;\n }\n\n .vertical-button-container button,\n .vertical-button-container svg {\n vertical-align: bottom;\n }\n\n .vertical-button-value {\n font-size: 0.7em;\n line-height: 1.4em;\n text-align: center;\n }\n\n #play-pause-btn {\n border-radius: 50%;\n /* Buttons are border-box, so the UA's default padding would eat into\n the icon's content box and shrink the glyph relative to the circle\n by a different amount at every diameter. */\n padding: 0;\n height: var(--playback-controls-play-button-diameter--);\n width: var(--playback-controls-play-button-diameter--);\n border: none;\n background-color: var(--playback-controls-play-button-color--);\n color: var(--playback-controls-play-icon-color--);\n vertical-align: middle;\n }\n\n #play-pause-btn:active {\n opacity: 0.75;\n }\n\n #play-pause-btn svg {\n width: 100%;\n height: 100%;\n }\n\n .unstyled-button {\n background: none;\n border: none;\n margin: 0;\n padding: 0;\n /* Buttons don't inherit color from their parent, so the icons'\n currentColor needs it passed down explicitly. */\n color: inherit;\n }\n\n button {\n cursor: pointer;\n }\n\n .jump-btn:active {\n opacity: 0.75;\n }\n `;\n }\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ia-radio-player.d.ts","sourceRoot":"","sources":["../../../../src/elements/ia-radio-player/ia-radio-player.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,UAAU,EAEV,KAAK,cAAc,EACnB,KAAK,cAAc,EACnB,KAAK,cAAc,EACpB,MAAM,KAAK,CAAC;AAQb,OAAO,KAAK,EACV,gBAAgB,EAEjB,MAAM,yCAAyC,CAAC;AAKjD,OAAO,KAAK,EAAa,iBAAiB,EAAE,MAAM,UAAU,CAAC;AAC7D,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,yBAAyB,CAAC;AAGtE,OAAO,iDAAiD,CAAC;AACzD,OAAO,iEAAiE,CAAC;AACzE,OAAO,yDAAyD,CAAC;AACjE,OAAO,+CAA+C,CAAC;AACvD,OAAO,uDAAuD,CAAC;AAC/D,OAAO,qDAAqD,CAAC;AAC7D,OAAO,yDAAyD,CAAC;AACjE,OAAO,8BAA8B,CAAC;AAqCtC;;;;;;GAMG;AACH,
|
|
1
|
+
{"version":3,"file":"ia-radio-player.d.ts","sourceRoot":"","sources":["../../../../src/elements/ia-radio-player/ia-radio-player.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,7 +2,7 @@ import { __decorate } from "tslib";
|
|
|
2
2
|
import { css, html, LitElement, nothing, } from 'lit';
|
|
3
3
|
import { property, query, state } from 'lit/decorators.js';
|
|
4
4
|
import { customElement } from '../../util/custom-element.js';
|
|
5
|
-
import { msg, str } from '@lit/localize';
|
|
5
|
+
import { localized, msg, str } from '@lit/localize';
|
|
6
6
|
import { PlaybackMode } from '../../elements/ia-playback-controls/models.js';
|
|
7
7
|
import '../../elements/ia-audio-element/ia-audio-element.js';
|
|
8
8
|
import '../../elements/ia-expandable-search-bar/ia-expandable-search-bar.js';
|
|
@@ -748,7 +748,8 @@ __decorate([
|
|
|
748
748
|
query('ia-search-results-switcher')
|
|
749
749
|
], IARadioPlayer.prototype, "searchResultsSwitcher", void 0);
|
|
750
750
|
IARadioPlayer = __decorate([
|
|
751
|
-
customElement('ia-radio-player')
|
|
751
|
+
customElement('ia-radio-player'),
|
|
752
|
+
localized()
|
|
752
753
|
], IARadioPlayer);
|
|
753
754
|
export { IARadioPlayer };
|
|
754
755
|
//# sourceMappingURL=ia-radio-player.js.map
|