@internetarchive/elements 1.1.2 → 1.1.3-l10n-demo.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 +34 -1
- 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/analytics.d.ts +12 -0
- package/dist/src/elements/ia-donation-form/analytics.d.ts.map +1 -0
- package/dist/src/elements/ia-donation-form/analytics.js +2 -0
- package/dist/src/elements/ia-donation-form/analytics.js.map +1 -0
- package/dist/src/elements/ia-donation-form/braintree/braintree-manager-interface.d.ts +79 -0
- package/dist/src/elements/ia-donation-form/braintree/braintree-manager-interface.d.ts.map +1 -0
- package/dist/src/elements/ia-donation-form/braintree/braintree-manager-interface.js +2 -0
- package/dist/src/elements/ia-donation-form/braintree/braintree-manager-interface.js.map +1 -0
- package/dist/src/elements/ia-donation-form/braintree/braintree-manager.d.ts +73 -0
- package/dist/src/elements/ia-donation-form/braintree/braintree-manager.d.ts.map +1 -0
- package/dist/src/elements/ia-donation-form/braintree/braintree-manager.js +126 -0
- package/dist/src/elements/ia-donation-form/braintree/braintree-manager.js.map +1 -0
- package/dist/src/elements/ia-donation-form/braintree/hosting-environment.d.ts +10 -0
- package/dist/src/elements/ia-donation-form/braintree/hosting-environment.d.ts.map +1 -0
- package/dist/src/elements/ia-donation-form/braintree/hosting-environment.js +9 -0
- package/dist/src/elements/ia-donation-form/braintree/hosting-environment.js.map +1 -0
- package/dist/src/elements/ia-donation-form/braintree/payment-clients.d.ts +47 -0
- package/dist/src/elements/ia-donation-form/braintree/payment-clients.d.ts.map +1 -0
- package/dist/src/elements/ia-donation-form/braintree/payment-clients.js +104 -0
- package/dist/src/elements/ia-donation-form/braintree/payment-clients.js.map +1 -0
- package/dist/src/elements/ia-donation-form/braintree/payment-providers/apple-pay/apple-pay-interface.d.ts +11 -0
- package/dist/src/elements/ia-donation-form/braintree/payment-providers/apple-pay/apple-pay-interface.d.ts.map +1 -0
- package/dist/src/elements/ia-donation-form/braintree/payment-providers/apple-pay/apple-pay-interface.js +2 -0
- package/dist/src/elements/ia-donation-form/braintree/payment-providers/apple-pay/apple-pay-interface.js.map +1 -0
- package/dist/src/elements/ia-donation-form/braintree/payment-providers/apple-pay/apple-pay-session-datasource-interface.d.ts +20 -0
- package/dist/src/elements/ia-donation-form/braintree/payment-providers/apple-pay/apple-pay-session-datasource-interface.d.ts.map +1 -0
- package/dist/src/elements/ia-donation-form/braintree/payment-providers/apple-pay/apple-pay-session-datasource-interface.js +2 -0
- package/dist/src/elements/ia-donation-form/braintree/payment-providers/apple-pay/apple-pay-session-datasource-interface.js.map +1 -0
- package/dist/src/elements/ia-donation-form/braintree/payment-providers/apple-pay/apple-pay-session-datasource.d.ts +21 -0
- package/dist/src/elements/ia-donation-form/braintree/payment-providers/apple-pay/apple-pay-session-datasource.d.ts.map +1 -0
- package/dist/src/elements/ia-donation-form/braintree/payment-providers/apple-pay/apple-pay-session-datasource.js +83 -0
- package/dist/src/elements/ia-donation-form/braintree/payment-providers/apple-pay/apple-pay-session-datasource.js.map +1 -0
- package/dist/src/elements/ia-donation-form/braintree/payment-providers/apple-pay/apple-pay-session-manager.d.ts +11 -0
- package/dist/src/elements/ia-donation-form/braintree/payment-providers/apple-pay/apple-pay-session-manager.d.ts.map +1 -0
- package/dist/src/elements/ia-donation-form/braintree/payment-providers/apple-pay/apple-pay-session-manager.js +13 -0
- package/dist/src/elements/ia-donation-form/braintree/payment-providers/apple-pay/apple-pay-session-manager.js.map +1 -0
- package/dist/src/elements/ia-donation-form/braintree/payment-providers/apple-pay/apple-pay.d.ts +27 -0
- package/dist/src/elements/ia-donation-form/braintree/payment-providers/apple-pay/apple-pay.d.ts.map +1 -0
- package/dist/src/elements/ia-donation-form/braintree/payment-providers/apple-pay/apple-pay.js +67 -0
- package/dist/src/elements/ia-donation-form/braintree/payment-providers/apple-pay/apple-pay.js.map +1 -0
- package/dist/src/elements/ia-donation-form/braintree/payment-providers/credit-card/credit-card-interface.d.ts +18 -0
- package/dist/src/elements/ia-donation-form/braintree/payment-providers/credit-card/credit-card-interface.d.ts.map +1 -0
- package/dist/src/elements/ia-donation-form/braintree/payment-providers/credit-card/credit-card-interface.js +2 -0
- package/dist/src/elements/ia-donation-form/braintree/payment-providers/credit-card/credit-card-interface.js.map +1 -0
- package/dist/src/elements/ia-donation-form/braintree/payment-providers/credit-card/credit-card.d.ts +41 -0
- package/dist/src/elements/ia-donation-form/braintree/payment-providers/credit-card/credit-card.d.ts.map +1 -0
- package/dist/src/elements/ia-donation-form/braintree/payment-providers/credit-card/credit-card.js +95 -0
- package/dist/src/elements/ia-donation-form/braintree/payment-providers/credit-card/credit-card.js.map +1 -0
- package/dist/src/elements/ia-donation-form/braintree/payment-providers/credit-card/hosted-field-configuration.d.ts +14 -0
- package/dist/src/elements/ia-donation-form/braintree/payment-providers/credit-card/hosted-field-configuration.d.ts.map +1 -0
- package/dist/src/elements/ia-donation-form/braintree/payment-providers/credit-card/hosted-field-configuration.js +9 -0
- package/dist/src/elements/ia-donation-form/braintree/payment-providers/credit-card/hosted-field-configuration.js.map +1 -0
- package/dist/src/elements/ia-donation-form/braintree/payment-providers/credit-card/hosted-field-container.d.ts +40 -0
- package/dist/src/elements/ia-donation-form/braintree/payment-providers/credit-card/hosted-field-container.d.ts.map +1 -0
- package/dist/src/elements/ia-donation-form/braintree/payment-providers/credit-card/hosted-field-container.js +58 -0
- package/dist/src/elements/ia-donation-form/braintree/payment-providers/credit-card/hosted-field-container.js.map +1 -0
- package/dist/src/elements/ia-donation-form/braintree/payment-providers/google-pay/google-pay-interface.d.ts +8 -0
- package/dist/src/elements/ia-donation-form/braintree/payment-providers/google-pay/google-pay-interface.d.ts.map +1 -0
- package/dist/src/elements/ia-donation-form/braintree/payment-providers/google-pay/google-pay-interface.js +2 -0
- package/dist/src/elements/ia-donation-form/braintree/payment-providers/google-pay/google-pay-interface.js.map +1 -0
- package/dist/src/elements/ia-donation-form/braintree/payment-providers/google-pay/google-pay.d.ts +19 -0
- package/dist/src/elements/ia-donation-form/braintree/payment-providers/google-pay/google-pay.d.ts.map +1 -0
- package/dist/src/elements/ia-donation-form/braintree/payment-providers/google-pay/google-pay.js +45 -0
- package/dist/src/elements/ia-donation-form/braintree/payment-providers/google-pay/google-pay.js.map +1 -0
- package/dist/src/elements/ia-donation-form/braintree/payment-providers/paypal/paypal-button-datasource.d.ts +57 -0
- package/dist/src/elements/ia-donation-form/braintree/payment-providers/paypal/paypal-button-datasource.d.ts.map +1 -0
- package/dist/src/elements/ia-donation-form/braintree/payment-providers/paypal/paypal-button-datasource.js +44 -0
- package/dist/src/elements/ia-donation-form/braintree/payment-providers/paypal/paypal-button-datasource.js.map +1 -0
- package/dist/src/elements/ia-donation-form/braintree/payment-providers/paypal/paypal-interface.d.ts +14 -0
- package/dist/src/elements/ia-donation-form/braintree/payment-providers/paypal/paypal-interface.d.ts.map +1 -0
- package/dist/src/elements/ia-donation-form/braintree/payment-providers/paypal/paypal-interface.js +2 -0
- package/dist/src/elements/ia-donation-form/braintree/payment-providers/paypal/paypal-interface.js.map +1 -0
- package/dist/src/elements/ia-donation-form/braintree/payment-providers/paypal/paypal.d.ts +27 -0
- package/dist/src/elements/ia-donation-form/braintree/payment-providers/paypal/paypal.d.ts.map +1 -0
- package/dist/src/elements/ia-donation-form/braintree/payment-providers/paypal/paypal.js +44 -0
- package/dist/src/elements/ia-donation-form/braintree/payment-providers/paypal/paypal.js.map +1 -0
- package/dist/src/elements/ia-donation-form/braintree/payment-providers/venmo/venmo-interface.d.ts +8 -0
- package/dist/src/elements/ia-donation-form/braintree/payment-providers/venmo/venmo-interface.d.ts.map +1 -0
- package/dist/src/elements/ia-donation-form/braintree/payment-providers/venmo/venmo-interface.js +2 -0
- package/dist/src/elements/ia-donation-form/braintree/payment-providers/venmo/venmo-interface.js.map +1 -0
- package/dist/src/elements/ia-donation-form/braintree/payment-providers/venmo/venmo-restoration-state-handler.d.ts +40 -0
- package/dist/src/elements/ia-donation-form/braintree/payment-providers/venmo/venmo-restoration-state-handler.d.ts.map +1 -0
- package/dist/src/elements/ia-donation-form/braintree/payment-providers/venmo/venmo-restoration-state-handler.js +65 -0
- package/dist/src/elements/ia-donation-form/braintree/payment-providers/venmo/venmo-restoration-state-handler.js.map +1 -0
- package/dist/src/elements/ia-donation-form/braintree/payment-providers/venmo/venmo.d.ts +25 -0
- package/dist/src/elements/ia-donation-form/braintree/payment-providers/venmo/venmo.d.ts.map +1 -0
- package/dist/src/elements/ia-donation-form/braintree/payment-providers/venmo/venmo.js +42 -0
- package/dist/src/elements/ia-donation-form/braintree/payment-providers/venmo/venmo.js.map +1 -0
- package/dist/src/elements/ia-donation-form/braintree/payment-providers-interface.d.ts +18 -0
- package/dist/src/elements/ia-donation-form/braintree/payment-providers-interface.d.ts.map +1 -0
- package/dist/src/elements/ia-donation-form/braintree/payment-providers-interface.js +2 -0
- package/dist/src/elements/ia-donation-form/braintree/payment-providers-interface.js.map +1 -0
- package/dist/src/elements/ia-donation-form/braintree/payment-providers.d.ts +42 -0
- package/dist/src/elements/ia-donation-form/braintree/payment-providers.d.ts.map +1 -0
- package/dist/src/elements/ia-donation-form/braintree/payment-providers.js +99 -0
- package/dist/src/elements/ia-donation-form/braintree/payment-providers.js.map +1 -0
- 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/donation-form-error.d.ts +5 -0
- package/dist/src/elements/ia-donation-form/donation-form-error.d.ts.map +1 -0
- package/dist/src/elements/ia-donation-form/donation-form-error.js +8 -0
- package/dist/src/elements/ia-donation-form/donation-form-error.js.map +1 -0
- package/dist/src/elements/ia-donation-form/flow-handlers/donation-flow-modal-manager.d.ts +118 -0
- package/dist/src/elements/ia-donation-form/flow-handlers/donation-flow-modal-manager.d.ts.map +1 -0
- package/dist/src/elements/ia-donation-form/flow-handlers/donation-flow-modal-manager.js +194 -0
- package/dist/src/elements/ia-donation-form/flow-handlers/donation-flow-modal-manager.js.map +1 -0
- package/dist/src/elements/ia-donation-form/flow-handlers/handlers/apple-pay-flow-handler.d.ts +24 -0
- package/dist/src/elements/ia-donation-form/flow-handlers/handlers/apple-pay-flow-handler.d.ts.map +1 -0
- package/dist/src/elements/ia-donation-form/flow-handlers/handlers/apple-pay-flow-handler.js +70 -0
- package/dist/src/elements/ia-donation-form/flow-handlers/handlers/apple-pay-flow-handler.js.map +1 -0
- package/dist/src/elements/ia-donation-form/flow-handlers/handlers/credit-card-flow-handler.d.ts +44 -0
- package/dist/src/elements/ia-donation-form/flow-handlers/handlers/credit-card-flow-handler.d.ts.map +1 -0
- package/dist/src/elements/ia-donation-form/flow-handlers/handlers/credit-card-flow-handler.js +110 -0
- package/dist/src/elements/ia-donation-form/flow-handlers/handlers/credit-card-flow-handler.js.map +1 -0
- package/dist/src/elements/ia-donation-form/flow-handlers/handlers/google-pay-flow-handler.d.ts +24 -0
- package/dist/src/elements/ia-donation-form/flow-handlers/handlers/google-pay-flow-handler.d.ts.map +1 -0
- package/dist/src/elements/ia-donation-form/flow-handlers/handlers/google-pay-flow-handler.js +74 -0
- package/dist/src/elements/ia-donation-form/flow-handlers/handlers/google-pay-flow-handler.js.map +1 -0
- package/dist/src/elements/ia-donation-form/flow-handlers/handlers/paypal-flow-handler.d.ts +47 -0
- package/dist/src/elements/ia-donation-form/flow-handlers/handlers/paypal-flow-handler.d.ts.map +1 -0
- package/dist/src/elements/ia-donation-form/flow-handlers/handlers/paypal-flow-handler.js +204 -0
- package/dist/src/elements/ia-donation-form/flow-handlers/handlers/paypal-flow-handler.js.map +1 -0
- package/dist/src/elements/ia-donation-form/flow-handlers/handlers/venmo-flow-handler.d.ts +30 -0
- package/dist/src/elements/ia-donation-form/flow-handlers/handlers/venmo-flow-handler.d.ts.map +1 -0
- package/dist/src/elements/ia-donation-form/flow-handlers/handlers/venmo-flow-handler.js +77 -0
- package/dist/src/elements/ia-donation-form/flow-handlers/handlers/venmo-flow-handler.js.map +1 -0
- package/dist/src/elements/ia-donation-form/flow-handlers/payment-flow-handlers.d.ts +80 -0
- package/dist/src/elements/ia-donation-form/flow-handlers/payment-flow-handlers.d.ts.map +1 -0
- package/dist/src/elements/ia-donation-form/flow-handlers/payment-flow-handlers.js +72 -0
- package/dist/src/elements/ia-donation-form/flow-handlers/payment-flow-handlers.js.map +1 -0
- package/dist/src/elements/ia-donation-form/form-elements/contact-form/autocomplete-field-options.d.ts +2 -0
- package/dist/src/elements/ia-donation-form/form-elements/contact-form/autocomplete-field-options.d.ts.map +1 -0
- package/dist/src/elements/ia-donation-form/form-elements/contact-form/autocomplete-field-options.js +2 -0
- package/dist/src/elements/ia-donation-form/form-elements/contact-form/autocomplete-field-options.js.map +1 -0
- package/dist/src/elements/ia-donation-form/form-elements/contact-form/countries.d.ts +3 -0
- package/dist/src/elements/ia-donation-form/form-elements/contact-form/countries.d.ts.map +1 -0
- package/dist/src/elements/ia-donation-form/form-elements/contact-form/countries.js +254 -0
- package/dist/src/elements/ia-donation-form/form-elements/contact-form/countries.js.map +1 -0
- package/dist/src/elements/ia-donation-form/form-elements/contact-form/ia-donation-contact-form.d.ts +70 -0
- package/dist/src/elements/ia-donation-form/form-elements/contact-form/ia-donation-contact-form.d.ts.map +1 -0
- package/dist/src/elements/ia-donation-form/form-elements/contact-form/ia-donation-contact-form.js +497 -0
- package/dist/src/elements/ia-donation-form/form-elements/contact-form/ia-donation-contact-form.js.map +1 -0
- package/dist/src/elements/ia-donation-form/form-elements/ia-donation-badged-input.d.ts +26 -0
- package/dist/src/elements/ia-donation-form/form-elements/ia-donation-badged-input.d.ts.map +1 -0
- package/dist/src/elements/ia-donation-form/form-elements/ia-donation-badged-input.js +163 -0
- package/dist/src/elements/ia-donation-form/form-elements/ia-donation-badged-input.js.map +1 -0
- package/dist/src/elements/ia-donation-form/form-elements/ia-donation-edit-donation.d.ts +118 -0
- package/dist/src/elements/ia-donation-form/form-elements/ia-donation-edit-donation.d.ts.map +1 -0
- package/dist/src/elements/ia-donation-form/form-elements/ia-donation-edit-donation.js +772 -0
- package/dist/src/elements/ia-donation-form/form-elements/ia-donation-edit-donation.js.map +1 -0
- package/dist/src/elements/ia-donation-form/form-elements/ia-donation-header.d.ts +31 -0
- package/dist/src/elements/ia-donation-form/form-elements/ia-donation-header.d.ts.map +1 -0
- package/dist/src/elements/ia-donation-form/form-elements/ia-donation-header.js +93 -0
- package/dist/src/elements/ia-donation-form/form-elements/ia-donation-header.js.map +1 -0
- package/dist/src/elements/ia-donation-form/form-elements/ia-donation-payment-selector.d.ts +33 -0
- package/dist/src/elements/ia-donation-form/form-elements/ia-donation-payment-selector.d.ts.map +1 -0
- package/dist/src/elements/ia-donation-form/form-elements/ia-donation-payment-selector.js +378 -0
- package/dist/src/elements/ia-donation-form/form-elements/ia-donation-payment-selector.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/form-elements/ia-donation-summary.d.ts +11 -0
- package/dist/src/elements/ia-donation-form/form-elements/ia-donation-summary.d.ts.map +1 -0
- package/dist/src/elements/ia-donation-form/form-elements/ia-donation-summary.js +60 -0
- package/dist/src/elements/ia-donation-form/form-elements/ia-donation-summary.js.map +1 -0
- package/dist/src/elements/ia-donation-form/form-elements/ia-donation-total-amount.d.ts +10 -0
- package/dist/src/elements/ia-donation-form/form-elements/ia-donation-total-amount.d.ts.map +1 -0
- package/dist/src/elements/ia-donation-form/form-elements/ia-donation-total-amount.js +76 -0
- package/dist/src/elements/ia-donation-form/form-elements/ia-donation-total-amount.js.map +1 -0
- package/dist/src/elements/ia-donation-form/ia-donation-form-controller.d.ts +114 -0
- package/dist/src/elements/ia-donation-form/ia-donation-form-controller.d.ts.map +1 -0
- package/dist/src/elements/ia-donation-form/ia-donation-form-controller.js +586 -0
- package/dist/src/elements/ia-donation-form/ia-donation-form-controller.js.map +1 -0
- package/dist/src/elements/ia-donation-form/ia-donation-form.d.ts +94 -0
- package/dist/src/elements/ia-donation-form/ia-donation-form.d.ts.map +1 -0
- package/dist/src/elements/ia-donation-form/ia-donation-form.js +516 -0
- package/dist/src/elements/ia-donation-form/ia-donation-form.js.map +1 -0
- package/dist/src/elements/ia-donation-form/icons/apple-pay.svg +22 -0
- package/dist/src/elements/ia-donation-form/icons/calendar.svg +15 -0
- package/dist/src/elements/ia-donation-form/icons/credit-card.svg +15 -0
- package/dist/src/elements/ia-donation-form/icons/email.svg +3 -0
- package/dist/src/elements/ia-donation-form/icons/google-pay.svg +38 -0
- package/dist/src/elements/ia-donation-form/icons/locale-pin.svg +7 -0
- package/dist/src/elements/ia-donation-form/icons/lock.svg +6 -0
- package/dist/src/elements/ia-donation-form/icons/paypal.svg +39 -0
- package/dist/src/elements/ia-donation-form/icons/user.svg +6 -0
- package/dist/src/elements/ia-donation-form/icons/venmo.svg +9 -0
- package/dist/src/elements/ia-donation-form/icons.d.ts +12 -0
- package/dist/src/elements/ia-donation-form/icons.d.ts.map +1 -0
- package/dist/src/elements/ia-donation-form/icons.js +33 -0
- package/dist/src/elements/ia-donation-form/icons.js.map +1 -0
- package/dist/src/elements/ia-donation-form/modals/ia-donation-confirm-modal.d.ts +27 -0
- package/dist/src/elements/ia-donation-form/modals/ia-donation-confirm-modal.d.ts.map +1 -0
- package/dist/src/elements/ia-donation-form/modals/ia-donation-confirm-modal.js +196 -0
- package/dist/src/elements/ia-donation-form/modals/ia-donation-confirm-modal.js.map +1 -0
- package/dist/src/elements/ia-donation-form/modals/ia-donation-error-modal-content.d.ts +7 -0
- package/dist/src/elements/ia-donation-form/modals/ia-donation-error-modal-content.d.ts.map +1 -0
- package/dist/src/elements/ia-donation-form/modals/ia-donation-error-modal-content.js +64 -0
- package/dist/src/elements/ia-donation-form/modals/ia-donation-error-modal-content.js.map +1 -0
- package/dist/src/elements/ia-donation-form/modals/ia-donation-upsell-modal-content.d.ts +28 -0
- package/dist/src/elements/ia-donation-form/modals/ia-donation-upsell-modal-content.d.ts.map +1 -0
- package/dist/src/elements/ia-donation-form/modals/ia-donation-upsell-modal-content.js +314 -0
- package/dist/src/elements/ia-donation-form/modals/ia-donation-upsell-modal-content.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-donation-form/recaptcha-manager.d.ts +36 -0
- package/dist/src/elements/ia-donation-form/recaptcha-manager.d.ts.map +1 -0
- package/dist/src/elements/ia-donation-form/recaptcha-manager.js +76 -0
- package/dist/src/elements/ia-donation-form/recaptcha-manager.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-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 +17 -0
- package/dist/src/elements/ia-topnav/data/menus.d.ts.map +1 -0
- package/dist/src/elements/ia-topnav/data/menus.js +756 -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 +309 -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 +287 -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 +214 -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 +21 -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 +278 -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 +88 -0
- package/dist/src/elements/ia-topnav/ia-topnav.d.ts.map +1 -0
- package/dist/src/elements/ia-topnav/ia-topnav.js +443 -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 +65 -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/index.d.ts +55 -0
- package/dist/src/elements/index.d.ts.map +1 -1
- package/dist/src/elements/index.js +55 -0
- package/dist/src/elements/index.js.map +1 -1
- package/dist/src/locales/es.d.ts +215 -0
- package/dist/src/locales/es.d.ts.map +1 -0
- package/dist/src/locales/es.js +247 -0
- package/dist/src/locales/es.js.map +1 -0
- package/package.json +38 -5
|
@@ -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
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ia-radio-player.js","sourceRoot":"","sources":["../../../../src/elements/ia-radio-player/ia-radio-player.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n css,\n html,\n LitElement,\n nothing,\n type CSSResultGroup,\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 { msg, str } from '@lit/localize';\n\nimport type { AudioSource } from '@src/elements/ia-audio-element/models';\nimport type { QuickSearchEntry } from '@src/elements/ia-expandable-search-bar/models';\nimport { PlaybackMode } from '@src/elements/ia-playback-controls/models';\nimport type {\n TranscriptConfig,\n TranscriptEntryConfig,\n} from '@src/elements/ia-transcript-view/models';\nimport type { IAAudioElement } from '@src/elements/ia-audio-element/ia-audio-element';\nimport type { IATranscriptView } from '@src/elements/ia-transcript-view/ia-transcript-view';\nimport type { ZoneOfSilence } from '@src/elements/ia-waveform-progress/models';\n\nimport type { MusicZone, RadioPlayerConfig } from './models';\nimport type { SearchHandlerInterface } from './search/search-handler';\nimport type { IASearchResultsSwitcher } from './ia-search-results-switcher';\n\nimport '@src/elements/ia-audio-element/ia-audio-element';\nimport '@src/elements/ia-expandable-search-bar/ia-expandable-search-bar';\nimport '@src/elements/ia-playback-controls/ia-playback-controls';\nimport '@src/elements/ia-scrubber-bar/ia-scrubber-bar';\nimport '@src/elements/ia-status-indicator/ia-status-indicator';\nimport '@src/elements/ia-transcript-view/ia-transcript-view';\nimport '@src/elements/ia-waveform-progress/ia-waveform-progress';\nimport './ia-search-results-switcher';\n\n/**\n * Event names emitted by this component\n */\nconst Events = {\n CanPlay: 'canplay',\n CurrentTimeChanged: 'currentTimeChanged',\n HighlightedSearchResultChanged: 'highlightedSearchResultChanged',\n JumpBackButtonPressed: 'jumpBackButtonPressed',\n JumpForwardButtonPressed: 'jumpForwardButtonPressed',\n NextSectionButtonPressed: 'nextSectionButtonPressed',\n PlaybackPaused: 'playbackPaused',\n PlaybackRateChanged: 'playbackRateChanged',\n PlaybackStarted: 'playbackStarted',\n PlayPauseButtonPressed: 'playPauseButtonPressed',\n PrevSectionButtonPressed: 'prevSectionButtonPressed',\n SearchCleared: 'searchCleared',\n SearchExecuted: 'searchExecuted',\n SearchFailed: 'searchFailed',\n SearchTermChanged: 'searchTermChanged',\n TimeChangedFromScrub: 'timeChangedFromScrub',\n TranscriptEntrySelected: 'transcriptEntrySelected',\n};\n\n/** How far the skip buttons move, in seconds */\nconst SKIP_SECONDS = 10;\n\n/** Shortest term worth searching for */\nconst MIN_SEARCH_LENGTH = 2;\n\n/**\n * Nudge past a section boundary when jumping to it, so playback lands inside\n * the next section rather than exactly on its edge.\n */\nconst SECTION_SEEK_NUDGE = 0.1;\n\n/**\n * A player for transcribed radio broadcasts.\n *\n * It owns no playback or search logic of its own. It wires the audio element,\n * transport controls, waveform, scrubber, search bar and transcript together,\n * and hands searching off to whatever `searchHandler` it is given.\n */\n@customElement('ia-radio-player')\nexport class IARadioPlayer extends LitElement {\n /** What is being played, and what to show about it */\n @property({ type: Object }) config?: RadioPlayerConfig;\n\n /** Where searches go. Without one, the search bar does nothing. */\n @property({ type: Object }) searchHandler?: SearchHandlerInterface;\n\n /** The transcript to show when no search is running */\n @property({ type: Object }) transcriptConfig?: TranscriptConfig;\n\n /** The transcript marked up with search results, shown while searching */\n @property({ type: Object }) searchResultsTranscript?: TranscriptConfig;\n\n /** Playback position, in seconds */\n @property({ type: Number }) currentTime = 0;\n\n /** What is currently in the search bar */\n @property({ type: String }) searchTerm = '';\n\n /** Whether to skip past the music sections rather than play them */\n @property({ type: Boolean }) skipMusicSections = false;\n\n /** Whether to shade the music sections on the waveform */\n @property({ type: Boolean }) showMusicZones = false;\n\n @state() private percentComplete = 0;\n\n @state() private isPlaying = false;\n\n @state() private duration = 0;\n\n @state() private playbackRate = 1;\n\n @state() private volume = 1;\n\n @state() private isSearching = false;\n\n /** Numbers each search so a stale one can be told from the current one. */\n private latestSearchId = 0;\n\n @query('ia-audio-element') private audioElement?: IAAudioElement | null;\n\n @query('ia-transcript-view') private transcriptView?: IATranscriptView | null;\n\n @query('ia-search-results-switcher')\n private searchResultsSwitcher?: IASearchResultsSwitcher | null;\n\n render(): TemplateResult {\n return html`\n ${this.audioElementTemplate}\n <section role=\"main\">\n ${this.titleDateTemplate} ${this.collectionLogoTemplate}\n ${this.playbackControlsTemplate}\n <div class=\"waveform-scrubber-container\">\n ${this.waveformProgressTemplate} ${this.scrubberBarTemplate}\n </div>\n ${this.searchSectionTemplate} ${this.transcriptViewTemplate}\n </section>\n `;\n }\n\n /** Starts playback */\n play(): void {\n this.audioElement?.play();\n }\n\n /** Pauses playback */\n pause(): void {\n this.audioElement?.pause();\n }\n\n /** Jumps to a position in the track, in seconds */\n seekTo(seconds: number): void {\n this.audioElement?.seekTo(seconds);\n }\n\n private get audioElementTemplate(): TemplateResult {\n return html`\n <ia-audio-element\n .sources=${this.audioSources}\n .playbackRate=${this.playbackRate}\n .volume=${this.volume}\n @timeupdate=${this.handleTimeChange}\n @durationchange=${this.handleDurationChange}\n @playbackStarted=${this.playbackStarted}\n @playbackPaused=${this.playbackPaused}\n @canplay=${this.canPlay}\n ></ia-audio-element>\n `;\n }\n\n private get titleDateTemplate(): TemplateResult {\n return html`\n <div class=\"title-date\">\n <div class=\"title\">${this.config?.title ?? ''}</div>\n <div class=\"date\">${this.config?.date ?? ''}</div>\n </div>\n `;\n }\n\n private get collectionLogoTemplate(): TemplateResult | typeof nothing {\n const logoUrl = this.config?.logoUrl;\n if (!logoUrl) return nothing;\n\n return html`\n <img\n class=\"collection-logo\"\n src=${logoUrl}\n alt=${msg('Collection logo')}\n />\n `;\n }\n\n private get playbackControlsTemplate(): TemplateResult {\n return html`\n <ia-playback-controls\n .playbackMode=${this.isPlaying\n ? PlaybackMode.playing\n : PlaybackMode.paused}\n .playbackRate=${this.playbackRate}\n .volume=${this.volume}\n @back-button-pressed=${this.handleBackButton}\n @play-pause-button-pressed=${this.handlePlayPauseButton}\n @forward-button-pressed=${this.handleForwardButton}\n @volumeChange=${this.handleVolumeChange}\n @playbackRateChange=${this.handlePlaybackRateChange}\n @next-section-button-pressed=${this.handleNextSectionButton}\n @prev-section-button-pressed=${this.handlePrevSectionButton}\n ></ia-playback-controls>\n `;\n }\n\n private get waveformProgressTemplate(): TemplateResult | typeof nothing {\n const waveformUrl = this.config?.waveformUrl;\n if (!waveformUrl) return nothing;\n\n return html`\n <ia-waveform-progress\n interactive\n .waveformUrl=${waveformUrl}\n .percentComplete=${this.percentComplete}\n .zonesOfSilence=${this.showMusicZones ? this.zonesOfSilence : []}\n @valuechange=${this.handleScrub}\n ></ia-waveform-progress>\n `;\n }\n\n private get scrubberBarTemplate(): TemplateResult {\n return html`\n <ia-scrubber-bar\n .sectionMarkerPercentages=${this.sectionMarkerPercentages}\n .value=${this.percentComplete}\n @valuechange=${this.handleScrub}\n ></ia-scrubber-bar>\n `;\n }\n\n private get transcriptViewTemplate(): TemplateResult {\n return html`\n <div class=\"transcript-container\">\n <ia-transcript-view\n .config=${this.currentTranscript}\n .currentTime=${this.currentTime}\n @transcriptEntrySelected=${this.handleTranscriptEntrySelected}\n ></ia-transcript-view>\n </div>\n `;\n }\n\n private get searchSectionTemplate(): TemplateResult {\n return html`\n <div class=\"search-section\">\n <ia-expandable-search-bar\n .searchTerm=${this.searchTerm}\n .quickSearches=${this.quickSearches}\n ?showsDisclosure=${this.quickSearches.length > 0}\n @inputchange=${this.handleSearchInput}\n @enterKeyPressed=${this.handleSearchSubmitted}\n @quickSearchSelected=${this.handleQuickSearchSelected}\n @searchCleared=${this.handleSearchCleared}\n ></ia-expandable-search-bar>\n\n <div class=\"search-results-info\">\n <!--\n Always rendered, so a screen reader is already watching it by the\n time the text changes. A live region added to the page with its\n text already in place is not announced.\n -->\n <div class=\"sr-only\" role=\"status\">${this.searchStatusMessage}</div>\n\n ${this.isSearching\n ? html`<ia-status-indicator\n mode=\"loading\"\n loadingTitle=${msg('Searching the transcript')}\n ></ia-status-indicator>`\n : this.searchOutcomeTemplate}\n </div>\n </div>\n `;\n }\n\n /** What to show once a search has come back: a counter, or nothing found. */\n private get searchOutcomeTemplate(): TemplateResult | typeof nothing {\n if (this.searchTerm.length === 0 || !this.searchResultsTranscript) {\n return nothing;\n }\n\n const resultCount = this.searchResults.length;\n if (resultCount === 0) {\n return html`\n <div class=\"no-search-results-message\" aria-hidden=\"true\">\n ${msg('No search results.')}\n </div>\n `;\n }\n\n return html`\n <ia-search-results-switcher\n .numberOfResults=${resultCount}\n @searchResultIndexChanged=${this.handleSearchResultIndexChanged}\n ></ia-search-results-switcher>\n `;\n }\n\n /** What the live region announces as a search runs and comes back. */\n private get searchStatusMessage(): string {\n if (this.isSearching) return msg('Searching the transcript');\n if (this.searchTerm.length === 0 || !this.searchResultsTranscript)\n return '';\n\n const count = this.searchResults.length;\n if (count === 0) return msg('No search results.');\n\n return msg(str`${count} search results`);\n }\n\n private get currentTranscript(): TranscriptConfig | undefined {\n return this.searchResultsTranscript ?? this.transcriptConfig;\n }\n\n private get transcriptEntries(): TranscriptEntryConfig[] {\n return this.currentTranscript?.entries ?? [];\n }\n\n private get searchResults(): TranscriptEntryConfig[] {\n return this.searchResultsTranscript?.searchResults ?? [];\n }\n\n private get audioSources(): AudioSource[] {\n return this.config?.audioSources ?? [];\n }\n\n private get quickSearches(): QuickSearchEntry[] {\n return (this.config?.quickSearches ?? []).map((displayText) => ({\n displayText,\n }));\n }\n\n private get musicEntries(): TranscriptEntryConfig[] {\n return this.transcriptEntries.filter((entry) => entry.isMusic);\n }\n\n /** The music stretches, as percentages, for marking on the waveform. */\n private get zonesOfSilence(): ZoneOfSilence[] {\n if (this.duration === 0) return [];\n\n return this.musicEntries.map((entry) => ({\n startPercent: (entry.start / this.duration) * 100,\n endPercent: (entry.end / this.duration) * 100,\n }));\n }\n\n /** The music stretches in seconds, for skipping past them. */\n private get musicZones(): MusicZone[] {\n return this.musicEntries.map((entry) => ({\n start: entry.start,\n end: entry.end,\n }));\n }\n\n /**\n * Every section boundary as a percentage, including the two ends.\n *\n * The section skip buttons step between these, and the scrubber draws a\n * marker at each.\n */\n private get sectionMarkerPercentages(): number[] {\n const percentages = [0];\n\n this.zonesOfSilence.forEach((zone) => {\n percentages.push(zone.startPercent, zone.endPercent);\n });\n percentages.push(100);\n\n return percentages;\n }\n\n updated(changedProperties: PropertyValues): void {\n if (changedProperties.has('searchResultsTranscript')) {\n this.resetSearchResultPosition();\n }\n\n if (changedProperties.has('searchHandler') && this.searchTerm) {\n this.executeSearch(this.searchTerm);\n }\n\n if (changedProperties.has('currentTime')) {\n this.dispatchEvent(\n new CustomEvent<{ currentTime: number }>(Events.CurrentTimeChanged, {\n detail: { currentTime: this.currentTime },\n }),\n );\n\n if (this.skipMusicSections) this.skipMusicZone();\n }\n }\n\n private handleTimeChange(e: CustomEvent<{ currentTime: number }>): void {\n const { currentTime } = e.detail;\n if (currentTime === undefined) return;\n\n this.currentTime = currentTime;\n // A duration of 0 means nothing has loaded yet, and dividing by it would\n // put NaN into the scrubber and the waveform.\n this.percentComplete =\n this.duration > 0 ? (currentTime / this.duration) * 100 : 0;\n }\n\n private handleDurationChange(e: CustomEvent<{ duration: number }>): void {\n const { duration } = e.detail;\n // A stream reports Infinity, and metadata that hasn't loaded reports NaN.\n if (!Number.isFinite(duration)) return;\n\n this.duration = duration;\n }\n\n private handlePlaybackRateChange(\n e: CustomEvent<{ playbackRate: number }>,\n ): void {\n const { playbackRate } = e.detail;\n if (playbackRate === undefined) return;\n\n this.playbackRate = playbackRate;\n this.dispatchEvent(\n new CustomEvent<{ playbackRate: number }>(Events.PlaybackRateChanged, {\n detail: { playbackRate },\n }),\n );\n }\n\n private handleVolumeChange(e: CustomEvent<{ volume: number }>): void {\n const { volume } = e.detail;\n if (volume === undefined) return;\n\n this.volume = volume;\n this.dispatchEvent(\n new CustomEvent<{ volume: number }>('volumeChanged', {\n detail: { volume },\n }),\n );\n }\n\n private handleBackButton(): void {\n this.audioElement?.seekBy(-SKIP_SECONDS);\n this.dispatchEvent(new Event(Events.JumpBackButtonPressed));\n }\n\n private handleForwardButton(): void {\n this.audioElement?.seekBy(SKIP_SECONDS);\n this.dispatchEvent(new Event(Events.JumpForwardButtonPressed));\n }\n\n private handlePlayPauseButton(): void {\n this.isPlaying = !this.isPlaying;\n\n if (this.isPlaying) this.audioElement?.play();\n else this.audioElement?.pause();\n\n this.dispatchEvent(\n new CustomEvent<{ isPlaying: boolean }>(Events.PlayPauseButtonPressed, {\n detail: { isPlaying: this.isPlaying },\n }),\n );\n }\n\n private handleNextSectionButton(): void {\n const ahead = this.sectionMarkerPercentages.filter(\n (percent) => percent > this.percentComplete + SECTION_SEEK_NUDGE,\n );\n this.seekToSectionBoundary(ahead, Math.min, SECTION_SEEK_NUDGE);\n\n this.dispatchEvent(new Event(Events.NextSectionButtonPressed));\n }\n\n private handlePrevSectionButton(): void {\n const behind = this.sectionMarkerPercentages.filter(\n (percent) => percent < this.percentComplete - SECTION_SEEK_NUDGE,\n );\n this.seekToSectionBoundary(behind, Math.max, -SECTION_SEEK_NUDGE);\n\n this.dispatchEvent(new Event(Events.PrevSectionButtonPressed));\n }\n\n /**\n * Seeks to the nearest of a set of boundaries.\n *\n * Does nothing when the set is empty, since `Math.min` of nothing is\n * `Infinity` and `Math.max` of nothing is `-Infinity`, either of which would\n * be handed straight to the audio element as a position.\n */\n private seekToSectionBoundary(\n percentages: number[],\n pick: (...values: number[]) => number,\n nudge: number,\n ): void {\n if (percentages.length === 0) return;\n\n const boundary = pick(...percentages);\n this.audioElement?.seekTo(this.duration * (boundary / 100) + nudge);\n }\n\n private handleScrub(e: CustomEvent<{ value: number }>): void {\n const percentage = e.detail.value;\n if (percentage === undefined) return;\n\n const newTime = this.duration * (percentage / 100);\n this.currentTime = newTime;\n this.percentComplete = percentage;\n this.audioElement?.seekTo(newTime);\n\n this.dispatchEvent(\n new CustomEvent<{ newTime: number }>(Events.TimeChangedFromScrub, {\n detail: { newTime },\n }),\n );\n }\n\n private handleTranscriptEntrySelected(\n e: CustomEvent<{ entry: TranscriptEntryConfig }>,\n ): void {\n const { entry } = e.detail;\n if (!entry) return;\n\n this.currentTime = entry.start;\n this.audioElement?.seekTo(entry.start);\n this.audioElement?.play();\n\n this.dispatchEvent(\n new CustomEvent<{ newTime: number }>(Events.TranscriptEntrySelected, {\n detail: { newTime: entry.start },\n }),\n );\n }\n\n private handleSearchInput(e: CustomEvent<{ value: string }>): void {\n const { value } = e.detail;\n if (value === undefined) return;\n\n this.searchTerm = value;\n\n // An empty box has nothing to show results for. The counter already hides\n // itself on an empty term, so without dropping the results too the\n // transcript keeps its outlines and offers no way to step between them.\n if (value.length === 0) {\n this.searchResultsTranscript = undefined;\n // Abandons whatever is in flight, so its results can't land afterwards.\n this.latestSearchId += 1;\n this.isSearching = false;\n this.resetSearchResultPosition();\n }\n\n this.emitSearchTermChanged(value);\n }\n\n private handleSearchSubmitted(e: CustomEvent<{ value: string }>): void {\n const { value } = e.detail;\n if (!value) return;\n\n this.executeSearch(value);\n }\n\n private handleQuickSearchSelected(\n e: CustomEvent<{ quickSearchEntry: QuickSearchEntry }>,\n ): void {\n const term = e.detail.quickSearchEntry?.displayText;\n if (!term) return;\n\n this.emitSearchTermChanged(term);\n this.executeSearch(term);\n }\n\n private handleSearchCleared(): void {\n this.searchTerm = '';\n this.searchResultsTranscript = undefined;\n // Abandons whatever is in flight, so its results can't arrive after this.\n this.latestSearchId += 1;\n this.isSearching = false;\n\n this.dispatchEvent(new Event(Events.SearchCleared));\n this.emitSearchTermChanged('');\n this.resetSearchResultPosition();\n }\n\n /**\n * Runs a search and shows its results.\n *\n * Each run is numbered, and only the newest one is allowed to report back.\n * Searches go over the network, so a slow one started earlier can land after\n * a fast one started later, and without this the older results would end up\n * on screen under the newer term.\n *\n * A failed search has to put the spinner away as surely as a successful one,\n * hence the `finally`. Leaving it up would hide the search UI for as long as\n * the page lives.\n */\n private async executeSearch(term: string): Promise<void> {\n if (!this.searchHandler || term.length < MIN_SEARCH_LENGTH) {\n this.searchResultsTranscript = undefined;\n return;\n }\n\n this.searchTerm = term;\n this.isSearching = true;\n this.dispatchEvent(new Event(Events.SearchExecuted));\n\n this.latestSearchId += 1;\n const searchId = this.latestSearchId;\n\n try {\n const results = await this.searchHandler.search(term);\n if (searchId !== this.latestSearchId) return;\n\n this.searchResultsTranscript = results;\n } catch {\n if (searchId !== this.latestSearchId) return;\n\n this.searchResultsTranscript = undefined;\n this.dispatchEvent(new Event(Events.SearchFailed));\n } finally {\n if (searchId === this.latestSearchId) this.isSearching = false;\n }\n }\n\n private handleSearchResultIndexChanged(\n e: CustomEvent<{ searchResultIndex: number }>,\n ): void {\n const { searchResultIndex } = e.detail;\n if (searchResultIndex === undefined || !this.transcriptView) return;\n\n this.transcriptView.selectedSearchResultIndex = searchResultIndex;\n this.transcriptView.scrollToSelectedSearchResult();\n\n this.dispatchEvent(\n new CustomEvent<{ searchResultIndex: number }>(\n Events.HighlightedSearchResultChanged,\n { detail: { searchResultIndex } },\n ),\n );\n }\n\n /** Puts both the transcript and the switcher back to the first result. */\n private resetSearchResultPosition(): void {\n if (this.transcriptView) this.transcriptView.selectedSearchResultIndex = 0;\n if (this.searchResultsSwitcher) {\n this.searchResultsSwitcher.currentResultIndex = 0;\n }\n }\n\n private emitSearchTermChanged(searchTerm: string): void {\n this.dispatchEvent(\n new CustomEvent<{ searchTerm: string }>(Events.SearchTermChanged, {\n detail: { searchTerm },\n }),\n );\n }\n\n private playbackPaused(): void {\n this.isPlaying = false;\n this.dispatchEvent(new Event(Events.PlaybackPaused));\n }\n\n private playbackStarted(): void {\n this.isPlaying = true;\n this.dispatchEvent(new Event(Events.PlaybackStarted));\n }\n\n private canPlay(): void {\n this.dispatchEvent(new Event(Events.CanPlay));\n }\n\n /** Jumps past a music stretch if playback has wandered into one. */\n private skipMusicZone(): void {\n const activeZone = this.musicZones.find(\n (zone) => this.currentTime > zone.start && this.currentTime < zone.end,\n );\n if (!activeZone) return;\n\n this.audioElement?.seekTo(activeZone.end + SECTION_SEEK_NUDGE);\n }\n\n static get styles(): CSSResultGroup {\n return css`\n :host {\n --radio-player-title-color--: var(\n --ia-theme-radio-player-title-color,\n #fff\n );\n --radio-player-title-font--: var(\n --ia-theme-radio-player-title-font,\n 1.5em sans-serif\n );\n --radio-player-date-color--: var(\n --ia-theme-radio-player-date-color,\n #fff\n );\n --radio-player-date-font--: var(\n --ia-theme-radio-player-date-font,\n 1em sans-serif\n );\n --radio-player-logo-max-height--: var(\n --ia-theme-radio-player-logo-max-height,\n 8rem\n );\n --radio-player-waveform-height--: var(\n --ia-theme-radio-player-waveform-height,\n 5rem\n );\n }\n\n section[role='main'] {\n display: grid;\n grid-gap: 0.5rem;\n }\n\n ia-status-indicator {\n --ia-theme-icon-width: 1.5em;\n --ia-theme-primary-text-color: #999;\n\n display: block;\n margin: auto;\n }\n\n /* mobile view */\n @media (max-width: 770px) {\n section[role='main'] {\n grid-template-columns: 25% 1fr;\n grid-template-areas:\n 'collection-logo title-date'\n 'waveform-scrubber waveform-scrubber'\n 'playback-controls playback-controls'\n 'search-section search-section'\n 'transcript-container transcript-container';\n }\n\n .date {\n text-align: left;\n }\n\n ia-transcript-view {\n --ia-theme-transcript-time-display: none;\n }\n\n ia-playback-controls {\n width: 75%;\n margin: auto;\n }\n\n .search-section {\n width: 75%;\n margin: auto;\n }\n }\n\n /* wide view */\n @media (min-width: 770px) {\n section[role='main'] {\n grid-template-columns: 192px 0 250px 1fr;\n grid-template-areas:\n 'title-date title-date title-date title-date'\n 'collection-logo . playback-controls waveform-scrubber'\n 'search-section transcript-container transcript-container transcript-container';\n }\n\n .title-date {\n display: flex;\n justify-content: space-between;\n align-items: baseline;\n }\n\n ia-transcript-view {\n --ia-theme-transcript-time-display: block;\n }\n }\n\n .title-date {\n grid-area: title-date;\n }\n\n .title {\n color: var(--radio-player-title-color--);\n font: var(--radio-player-title-font--);\n }\n\n .date {\n color: var(--radio-player-date-color--);\n font: var(--radio-player-date-font--);\n }\n\n ia-waveform-progress {\n width: 100%;\n height: var(--radio-player-waveform-height--);\n }\n\n ia-playback-controls {\n grid-area: playback-controls;\n }\n\n .transcript-container {\n grid-area: transcript-container;\n }\n\n ia-transcript-view {\n max-width: 600px;\n display: block;\n }\n\n .collection-logo {\n width: 100%;\n max-height: var(--radio-player-logo-max-height--);\n object-fit: contain;\n grid-area: collection-logo;\n align-self: center;\n }\n\n .waveform-scrubber-container {\n width: 100%;\n height: 100%;\n grid-area: waveform-scrubber;\n }\n\n .search-section {\n grid-area: search-section;\n }\n\n .search-results-info {\n margin-top: 0.5em;\n }\n\n ia-expandable-search-bar {\n display: block;\n margin: auto;\n }\n\n .no-search-results-message {\n text-align: center;\n }\n\n .sr-only {\n position: absolute;\n width: 1px;\n height: 1px;\n padding: 0;\n margin: -1px;\n overflow: hidden;\n clip: rect(0, 0, 0, 0);\n white-space: nowrap;\n border: 0;\n }\n `;\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"ia-radio-player.js","sourceRoot":"","sources":["../../../../src/elements/ia-radio-player/ia-radio-player.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n css,\n html,\n LitElement,\n nothing,\n type CSSResultGroup,\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 { localized, msg, str } from '@lit/localize';\n\nimport type { AudioSource } from '@src/elements/ia-audio-element/models';\nimport type { QuickSearchEntry } from '@src/elements/ia-expandable-search-bar/models';\nimport { PlaybackMode } from '@src/elements/ia-playback-controls/models';\nimport type {\n TranscriptConfig,\n TranscriptEntryConfig,\n} from '@src/elements/ia-transcript-view/models';\nimport type { IAAudioElement } from '@src/elements/ia-audio-element/ia-audio-element';\nimport type { IATranscriptView } from '@src/elements/ia-transcript-view/ia-transcript-view';\nimport type { ZoneOfSilence } from '@src/elements/ia-waveform-progress/models';\n\nimport type { MusicZone, RadioPlayerConfig } from './models';\nimport type { SearchHandlerInterface } from './search/search-handler';\nimport type { IASearchResultsSwitcher } from './ia-search-results-switcher';\n\nimport '@src/elements/ia-audio-element/ia-audio-element';\nimport '@src/elements/ia-expandable-search-bar/ia-expandable-search-bar';\nimport '@src/elements/ia-playback-controls/ia-playback-controls';\nimport '@src/elements/ia-scrubber-bar/ia-scrubber-bar';\nimport '@src/elements/ia-status-indicator/ia-status-indicator';\nimport '@src/elements/ia-transcript-view/ia-transcript-view';\nimport '@src/elements/ia-waveform-progress/ia-waveform-progress';\nimport './ia-search-results-switcher';\n\n/**\n * Event names emitted by this component\n */\nconst Events = {\n CanPlay: 'canplay',\n CurrentTimeChanged: 'currentTimeChanged',\n HighlightedSearchResultChanged: 'highlightedSearchResultChanged',\n JumpBackButtonPressed: 'jumpBackButtonPressed',\n JumpForwardButtonPressed: 'jumpForwardButtonPressed',\n NextSectionButtonPressed: 'nextSectionButtonPressed',\n PlaybackPaused: 'playbackPaused',\n PlaybackRateChanged: 'playbackRateChanged',\n PlaybackStarted: 'playbackStarted',\n PlayPauseButtonPressed: 'playPauseButtonPressed',\n PrevSectionButtonPressed: 'prevSectionButtonPressed',\n SearchCleared: 'searchCleared',\n SearchExecuted: 'searchExecuted',\n SearchFailed: 'searchFailed',\n SearchTermChanged: 'searchTermChanged',\n TimeChangedFromScrub: 'timeChangedFromScrub',\n TranscriptEntrySelected: 'transcriptEntrySelected',\n};\n\n/** How far the skip buttons move, in seconds */\nconst SKIP_SECONDS = 10;\n\n/** Shortest term worth searching for */\nconst MIN_SEARCH_LENGTH = 2;\n\n/**\n * Nudge past a section boundary when jumping to it, so playback lands inside\n * the next section rather than exactly on its edge.\n */\nconst SECTION_SEEK_NUDGE = 0.1;\n\n/**\n * A player for transcribed radio broadcasts.\n *\n * It owns no playback or search logic of its own. It wires the audio element,\n * transport controls, waveform, scrubber, search bar and transcript together,\n * and hands searching off to whatever `searchHandler` it is given.\n */\n@customElement('ia-radio-player')\n@localized()\nexport class IARadioPlayer extends LitElement {\n /** What is being played, and what to show about it */\n @property({ type: Object }) config?: RadioPlayerConfig;\n\n /** Where searches go. Without one, the search bar does nothing. */\n @property({ type: Object }) searchHandler?: SearchHandlerInterface;\n\n /** The transcript to show when no search is running */\n @property({ type: Object }) transcriptConfig?: TranscriptConfig;\n\n /** The transcript marked up with search results, shown while searching */\n @property({ type: Object }) searchResultsTranscript?: TranscriptConfig;\n\n /** Playback position, in seconds */\n @property({ type: Number }) currentTime = 0;\n\n /** What is currently in the search bar */\n @property({ type: String }) searchTerm = '';\n\n /** Whether to skip past the music sections rather than play them */\n @property({ type: Boolean }) skipMusicSections = false;\n\n /** Whether to shade the music sections on the waveform */\n @property({ type: Boolean }) showMusicZones = false;\n\n @state() private percentComplete = 0;\n\n @state() private isPlaying = false;\n\n @state() private duration = 0;\n\n @state() private playbackRate = 1;\n\n @state() private volume = 1;\n\n @state() private isSearching = false;\n\n /** Numbers each search so a stale one can be told from the current one. */\n private latestSearchId = 0;\n\n @query('ia-audio-element') private audioElement?: IAAudioElement | null;\n\n @query('ia-transcript-view') private transcriptView?: IATranscriptView | null;\n\n @query('ia-search-results-switcher')\n private searchResultsSwitcher?: IASearchResultsSwitcher | null;\n\n render(): TemplateResult {\n return html`\n ${this.audioElementTemplate}\n <section role=\"main\">\n ${this.titleDateTemplate} ${this.collectionLogoTemplate}\n ${this.playbackControlsTemplate}\n <div class=\"waveform-scrubber-container\">\n ${this.waveformProgressTemplate} ${this.scrubberBarTemplate}\n </div>\n ${this.searchSectionTemplate} ${this.transcriptViewTemplate}\n </section>\n `;\n }\n\n /** Starts playback */\n play(): void {\n this.audioElement?.play();\n }\n\n /** Pauses playback */\n pause(): void {\n this.audioElement?.pause();\n }\n\n /** Jumps to a position in the track, in seconds */\n seekTo(seconds: number): void {\n this.audioElement?.seekTo(seconds);\n }\n\n private get audioElementTemplate(): TemplateResult {\n return html`\n <ia-audio-element\n .sources=${this.audioSources}\n .playbackRate=${this.playbackRate}\n .volume=${this.volume}\n @timeupdate=${this.handleTimeChange}\n @durationchange=${this.handleDurationChange}\n @playbackStarted=${this.playbackStarted}\n @playbackPaused=${this.playbackPaused}\n @canplay=${this.canPlay}\n ></ia-audio-element>\n `;\n }\n\n private get titleDateTemplate(): TemplateResult {\n return html`\n <div class=\"title-date\">\n <div class=\"title\">${this.config?.title ?? ''}</div>\n <div class=\"date\">${this.config?.date ?? ''}</div>\n </div>\n `;\n }\n\n private get collectionLogoTemplate(): TemplateResult | typeof nothing {\n const logoUrl = this.config?.logoUrl;\n if (!logoUrl) return nothing;\n\n return html`\n <img\n class=\"collection-logo\"\n src=${logoUrl}\n alt=${msg('Collection logo')}\n />\n `;\n }\n\n private get playbackControlsTemplate(): TemplateResult {\n return html`\n <ia-playback-controls\n .playbackMode=${this.isPlaying\n ? PlaybackMode.playing\n : PlaybackMode.paused}\n .playbackRate=${this.playbackRate}\n .volume=${this.volume}\n @back-button-pressed=${this.handleBackButton}\n @play-pause-button-pressed=${this.handlePlayPauseButton}\n @forward-button-pressed=${this.handleForwardButton}\n @volumeChange=${this.handleVolumeChange}\n @playbackRateChange=${this.handlePlaybackRateChange}\n @next-section-button-pressed=${this.handleNextSectionButton}\n @prev-section-button-pressed=${this.handlePrevSectionButton}\n ></ia-playback-controls>\n `;\n }\n\n private get waveformProgressTemplate(): TemplateResult | typeof nothing {\n const waveformUrl = this.config?.waveformUrl;\n if (!waveformUrl) return nothing;\n\n return html`\n <ia-waveform-progress\n interactive\n .waveformUrl=${waveformUrl}\n .percentComplete=${this.percentComplete}\n .zonesOfSilence=${this.showMusicZones ? this.zonesOfSilence : []}\n @valuechange=${this.handleScrub}\n ></ia-waveform-progress>\n `;\n }\n\n private get scrubberBarTemplate(): TemplateResult {\n return html`\n <ia-scrubber-bar\n .sectionMarkerPercentages=${this.sectionMarkerPercentages}\n .value=${this.percentComplete}\n @valuechange=${this.handleScrub}\n ></ia-scrubber-bar>\n `;\n }\n\n private get transcriptViewTemplate(): TemplateResult {\n return html`\n <div class=\"transcript-container\">\n <ia-transcript-view\n .config=${this.currentTranscript}\n .currentTime=${this.currentTime}\n @transcriptEntrySelected=${this.handleTranscriptEntrySelected}\n ></ia-transcript-view>\n </div>\n `;\n }\n\n private get searchSectionTemplate(): TemplateResult {\n return html`\n <div class=\"search-section\">\n <ia-expandable-search-bar\n .searchTerm=${this.searchTerm}\n .quickSearches=${this.quickSearches}\n ?showsDisclosure=${this.quickSearches.length > 0}\n @inputchange=${this.handleSearchInput}\n @enterKeyPressed=${this.handleSearchSubmitted}\n @quickSearchSelected=${this.handleQuickSearchSelected}\n @searchCleared=${this.handleSearchCleared}\n ></ia-expandable-search-bar>\n\n <div class=\"search-results-info\">\n <!--\n Always rendered, so a screen reader is already watching it by the\n time the text changes. A live region added to the page with its\n text already in place is not announced.\n -->\n <div class=\"sr-only\" role=\"status\">${this.searchStatusMessage}</div>\n\n ${this.isSearching\n ? html`<ia-status-indicator\n mode=\"loading\"\n loadingTitle=${msg('Searching the transcript')}\n ></ia-status-indicator>`\n : this.searchOutcomeTemplate}\n </div>\n </div>\n `;\n }\n\n /** What to show once a search has come back: a counter, or nothing found. */\n private get searchOutcomeTemplate(): TemplateResult | typeof nothing {\n if (this.searchTerm.length === 0 || !this.searchResultsTranscript) {\n return nothing;\n }\n\n const resultCount = this.searchResults.length;\n if (resultCount === 0) {\n return html`\n <div class=\"no-search-results-message\" aria-hidden=\"true\">\n ${msg('No search results.')}\n </div>\n `;\n }\n\n return html`\n <ia-search-results-switcher\n .numberOfResults=${resultCount}\n @searchResultIndexChanged=${this.handleSearchResultIndexChanged}\n ></ia-search-results-switcher>\n `;\n }\n\n /** What the live region announces as a search runs and comes back. */\n private get searchStatusMessage(): string {\n if (this.isSearching) return msg('Searching the transcript');\n if (this.searchTerm.length === 0 || !this.searchResultsTranscript)\n return '';\n\n const count = this.searchResults.length;\n if (count === 0) return msg('No search results.');\n\n return msg(str`${count} search results`);\n }\n\n private get currentTranscript(): TranscriptConfig | undefined {\n return this.searchResultsTranscript ?? this.transcriptConfig;\n }\n\n private get transcriptEntries(): TranscriptEntryConfig[] {\n return this.currentTranscript?.entries ?? [];\n }\n\n private get searchResults(): TranscriptEntryConfig[] {\n return this.searchResultsTranscript?.searchResults ?? [];\n }\n\n private get audioSources(): AudioSource[] {\n return this.config?.audioSources ?? [];\n }\n\n private get quickSearches(): QuickSearchEntry[] {\n return (this.config?.quickSearches ?? []).map((displayText) => ({\n displayText,\n }));\n }\n\n private get musicEntries(): TranscriptEntryConfig[] {\n return this.transcriptEntries.filter((entry) => entry.isMusic);\n }\n\n /** The music stretches, as percentages, for marking on the waveform. */\n private get zonesOfSilence(): ZoneOfSilence[] {\n if (this.duration === 0) return [];\n\n return this.musicEntries.map((entry) => ({\n startPercent: (entry.start / this.duration) * 100,\n endPercent: (entry.end / this.duration) * 100,\n }));\n }\n\n /** The music stretches in seconds, for skipping past them. */\n private get musicZones(): MusicZone[] {\n return this.musicEntries.map((entry) => ({\n start: entry.start,\n end: entry.end,\n }));\n }\n\n /**\n * Every section boundary as a percentage, including the two ends.\n *\n * The section skip buttons step between these, and the scrubber draws a\n * marker at each.\n */\n private get sectionMarkerPercentages(): number[] {\n const percentages = [0];\n\n this.zonesOfSilence.forEach((zone) => {\n percentages.push(zone.startPercent, zone.endPercent);\n });\n percentages.push(100);\n\n return percentages;\n }\n\n updated(changedProperties: PropertyValues): void {\n if (changedProperties.has('searchResultsTranscript')) {\n this.resetSearchResultPosition();\n }\n\n if (changedProperties.has('searchHandler') && this.searchTerm) {\n this.executeSearch(this.searchTerm);\n }\n\n if (changedProperties.has('currentTime')) {\n this.dispatchEvent(\n new CustomEvent<{ currentTime: number }>(Events.CurrentTimeChanged, {\n detail: { currentTime: this.currentTime },\n }),\n );\n\n if (this.skipMusicSections) this.skipMusicZone();\n }\n }\n\n private handleTimeChange(e: CustomEvent<{ currentTime: number }>): void {\n const { currentTime } = e.detail;\n if (currentTime === undefined) return;\n\n this.currentTime = currentTime;\n // A duration of 0 means nothing has loaded yet, and dividing by it would\n // put NaN into the scrubber and the waveform.\n this.percentComplete =\n this.duration > 0 ? (currentTime / this.duration) * 100 : 0;\n }\n\n private handleDurationChange(e: CustomEvent<{ duration: number }>): void {\n const { duration } = e.detail;\n // A stream reports Infinity, and metadata that hasn't loaded reports NaN.\n if (!Number.isFinite(duration)) return;\n\n this.duration = duration;\n }\n\n private handlePlaybackRateChange(\n e: CustomEvent<{ playbackRate: number }>,\n ): void {\n const { playbackRate } = e.detail;\n if (playbackRate === undefined) return;\n\n this.playbackRate = playbackRate;\n this.dispatchEvent(\n new CustomEvent<{ playbackRate: number }>(Events.PlaybackRateChanged, {\n detail: { playbackRate },\n }),\n );\n }\n\n private handleVolumeChange(e: CustomEvent<{ volume: number }>): void {\n const { volume } = e.detail;\n if (volume === undefined) return;\n\n this.volume = volume;\n this.dispatchEvent(\n new CustomEvent<{ volume: number }>('volumeChanged', {\n detail: { volume },\n }),\n );\n }\n\n private handleBackButton(): void {\n this.audioElement?.seekBy(-SKIP_SECONDS);\n this.dispatchEvent(new Event(Events.JumpBackButtonPressed));\n }\n\n private handleForwardButton(): void {\n this.audioElement?.seekBy(SKIP_SECONDS);\n this.dispatchEvent(new Event(Events.JumpForwardButtonPressed));\n }\n\n private handlePlayPauseButton(): void {\n this.isPlaying = !this.isPlaying;\n\n if (this.isPlaying) this.audioElement?.play();\n else this.audioElement?.pause();\n\n this.dispatchEvent(\n new CustomEvent<{ isPlaying: boolean }>(Events.PlayPauseButtonPressed, {\n detail: { isPlaying: this.isPlaying },\n }),\n );\n }\n\n private handleNextSectionButton(): void {\n const ahead = this.sectionMarkerPercentages.filter(\n (percent) => percent > this.percentComplete + SECTION_SEEK_NUDGE,\n );\n this.seekToSectionBoundary(ahead, Math.min, SECTION_SEEK_NUDGE);\n\n this.dispatchEvent(new Event(Events.NextSectionButtonPressed));\n }\n\n private handlePrevSectionButton(): void {\n const behind = this.sectionMarkerPercentages.filter(\n (percent) => percent < this.percentComplete - SECTION_SEEK_NUDGE,\n );\n this.seekToSectionBoundary(behind, Math.max, -SECTION_SEEK_NUDGE);\n\n this.dispatchEvent(new Event(Events.PrevSectionButtonPressed));\n }\n\n /**\n * Seeks to the nearest of a set of boundaries.\n *\n * Does nothing when the set is empty, since `Math.min` of nothing is\n * `Infinity` and `Math.max` of nothing is `-Infinity`, either of which would\n * be handed straight to the audio element as a position.\n */\n private seekToSectionBoundary(\n percentages: number[],\n pick: (...values: number[]) => number,\n nudge: number,\n ): void {\n if (percentages.length === 0) return;\n\n const boundary = pick(...percentages);\n this.audioElement?.seekTo(this.duration * (boundary / 100) + nudge);\n }\n\n private handleScrub(e: CustomEvent<{ value: number }>): void {\n const percentage = e.detail.value;\n if (percentage === undefined) return;\n\n const newTime = this.duration * (percentage / 100);\n this.currentTime = newTime;\n this.percentComplete = percentage;\n this.audioElement?.seekTo(newTime);\n\n this.dispatchEvent(\n new CustomEvent<{ newTime: number }>(Events.TimeChangedFromScrub, {\n detail: { newTime },\n }),\n );\n }\n\n private handleTranscriptEntrySelected(\n e: CustomEvent<{ entry: TranscriptEntryConfig }>,\n ): void {\n const { entry } = e.detail;\n if (!entry) return;\n\n this.currentTime = entry.start;\n this.audioElement?.seekTo(entry.start);\n this.audioElement?.play();\n\n this.dispatchEvent(\n new CustomEvent<{ newTime: number }>(Events.TranscriptEntrySelected, {\n detail: { newTime: entry.start },\n }),\n );\n }\n\n private handleSearchInput(e: CustomEvent<{ value: string }>): void {\n const { value } = e.detail;\n if (value === undefined) return;\n\n this.searchTerm = value;\n\n // An empty box has nothing to show results for. The counter already hides\n // itself on an empty term, so without dropping the results too the\n // transcript keeps its outlines and offers no way to step between them.\n if (value.length === 0) {\n this.searchResultsTranscript = undefined;\n // Abandons whatever is in flight, so its results can't land afterwards.\n this.latestSearchId += 1;\n this.isSearching = false;\n this.resetSearchResultPosition();\n }\n\n this.emitSearchTermChanged(value);\n }\n\n private handleSearchSubmitted(e: CustomEvent<{ value: string }>): void {\n const { value } = e.detail;\n if (!value) return;\n\n this.executeSearch(value);\n }\n\n private handleQuickSearchSelected(\n e: CustomEvent<{ quickSearchEntry: QuickSearchEntry }>,\n ): void {\n const term = e.detail.quickSearchEntry?.displayText;\n if (!term) return;\n\n this.emitSearchTermChanged(term);\n this.executeSearch(term);\n }\n\n private handleSearchCleared(): void {\n this.searchTerm = '';\n this.searchResultsTranscript = undefined;\n // Abandons whatever is in flight, so its results can't arrive after this.\n this.latestSearchId += 1;\n this.isSearching = false;\n\n this.dispatchEvent(new Event(Events.SearchCleared));\n this.emitSearchTermChanged('');\n this.resetSearchResultPosition();\n }\n\n /**\n * Runs a search and shows its results.\n *\n * Each run is numbered, and only the newest one is allowed to report back.\n * Searches go over the network, so a slow one started earlier can land after\n * a fast one started later, and without this the older results would end up\n * on screen under the newer term.\n *\n * A failed search has to put the spinner away as surely as a successful one,\n * hence the `finally`. Leaving it up would hide the search UI for as long as\n * the page lives.\n */\n private async executeSearch(term: string): Promise<void> {\n if (!this.searchHandler || term.length < MIN_SEARCH_LENGTH) {\n this.searchResultsTranscript = undefined;\n return;\n }\n\n this.searchTerm = term;\n this.isSearching = true;\n this.dispatchEvent(new Event(Events.SearchExecuted));\n\n this.latestSearchId += 1;\n const searchId = this.latestSearchId;\n\n try {\n const results = await this.searchHandler.search(term);\n if (searchId !== this.latestSearchId) return;\n\n this.searchResultsTranscript = results;\n } catch {\n if (searchId !== this.latestSearchId) return;\n\n this.searchResultsTranscript = undefined;\n this.dispatchEvent(new Event(Events.SearchFailed));\n } finally {\n if (searchId === this.latestSearchId) this.isSearching = false;\n }\n }\n\n private handleSearchResultIndexChanged(\n e: CustomEvent<{ searchResultIndex: number }>,\n ): void {\n const { searchResultIndex } = e.detail;\n if (searchResultIndex === undefined || !this.transcriptView) return;\n\n this.transcriptView.selectedSearchResultIndex = searchResultIndex;\n this.transcriptView.scrollToSelectedSearchResult();\n\n this.dispatchEvent(\n new CustomEvent<{ searchResultIndex: number }>(\n Events.HighlightedSearchResultChanged,\n { detail: { searchResultIndex } },\n ),\n );\n }\n\n /** Puts both the transcript and the switcher back to the first result. */\n private resetSearchResultPosition(): void {\n if (this.transcriptView) this.transcriptView.selectedSearchResultIndex = 0;\n if (this.searchResultsSwitcher) {\n this.searchResultsSwitcher.currentResultIndex = 0;\n }\n }\n\n private emitSearchTermChanged(searchTerm: string): void {\n this.dispatchEvent(\n new CustomEvent<{ searchTerm: string }>(Events.SearchTermChanged, {\n detail: { searchTerm },\n }),\n );\n }\n\n private playbackPaused(): void {\n this.isPlaying = false;\n this.dispatchEvent(new Event(Events.PlaybackPaused));\n }\n\n private playbackStarted(): void {\n this.isPlaying = true;\n this.dispatchEvent(new Event(Events.PlaybackStarted));\n }\n\n private canPlay(): void {\n this.dispatchEvent(new Event(Events.CanPlay));\n }\n\n /** Jumps past a music stretch if playback has wandered into one. */\n private skipMusicZone(): void {\n const activeZone = this.musicZones.find(\n (zone) => this.currentTime > zone.start && this.currentTime < zone.end,\n );\n if (!activeZone) return;\n\n this.audioElement?.seekTo(activeZone.end + SECTION_SEEK_NUDGE);\n }\n\n static get styles(): CSSResultGroup {\n return css`\n :host {\n --radio-player-title-color--: var(\n --ia-theme-radio-player-title-color,\n #fff\n );\n --radio-player-title-font--: var(\n --ia-theme-radio-player-title-font,\n 1.5em sans-serif\n );\n --radio-player-date-color--: var(\n --ia-theme-radio-player-date-color,\n #fff\n );\n --radio-player-date-font--: var(\n --ia-theme-radio-player-date-font,\n 1em sans-serif\n );\n --radio-player-logo-max-height--: var(\n --ia-theme-radio-player-logo-max-height,\n 8rem\n );\n --radio-player-waveform-height--: var(\n --ia-theme-radio-player-waveform-height,\n 5rem\n );\n }\n\n section[role='main'] {\n display: grid;\n grid-gap: 0.5rem;\n }\n\n ia-status-indicator {\n --ia-theme-icon-width: 1.5em;\n --ia-theme-primary-text-color: #999;\n\n display: block;\n margin: auto;\n }\n\n /* mobile view */\n @media (max-width: 770px) {\n section[role='main'] {\n grid-template-columns: 25% 1fr;\n grid-template-areas:\n 'collection-logo title-date'\n 'waveform-scrubber waveform-scrubber'\n 'playback-controls playback-controls'\n 'search-section search-section'\n 'transcript-container transcript-container';\n }\n\n .date {\n text-align: left;\n }\n\n ia-transcript-view {\n --ia-theme-transcript-time-display: none;\n }\n\n ia-playback-controls {\n width: 75%;\n margin: auto;\n }\n\n .search-section {\n width: 75%;\n margin: auto;\n }\n }\n\n /* wide view */\n @media (min-width: 770px) {\n section[role='main'] {\n grid-template-columns: 192px 0 250px 1fr;\n grid-template-areas:\n 'title-date title-date title-date title-date'\n 'collection-logo . playback-controls waveform-scrubber'\n 'search-section transcript-container transcript-container transcript-container';\n }\n\n .title-date {\n display: flex;\n justify-content: space-between;\n align-items: baseline;\n }\n\n ia-transcript-view {\n --ia-theme-transcript-time-display: block;\n }\n }\n\n .title-date {\n grid-area: title-date;\n }\n\n .title {\n color: var(--radio-player-title-color--);\n font: var(--radio-player-title-font--);\n }\n\n .date {\n color: var(--radio-player-date-color--);\n font: var(--radio-player-date-font--);\n }\n\n ia-waveform-progress {\n width: 100%;\n height: var(--radio-player-waveform-height--);\n }\n\n ia-playback-controls {\n grid-area: playback-controls;\n }\n\n .transcript-container {\n grid-area: transcript-container;\n }\n\n ia-transcript-view {\n max-width: 600px;\n display: block;\n }\n\n .collection-logo {\n width: 100%;\n max-height: var(--radio-player-logo-max-height--);\n object-fit: contain;\n grid-area: collection-logo;\n align-self: center;\n }\n\n .waveform-scrubber-container {\n width: 100%;\n height: 100%;\n grid-area: waveform-scrubber;\n }\n\n .search-section {\n grid-area: search-section;\n }\n\n .search-results-info {\n margin-top: 0.5em;\n }\n\n ia-expandable-search-bar {\n display: block;\n margin: auto;\n }\n\n .no-search-results-message {\n text-align: center;\n }\n\n .sr-only {\n position: absolute;\n width: 1px;\n height: 1px;\n padding: 0;\n margin: -1px;\n overflow: hidden;\n clip: rect(0, 0, 0, 0);\n white-space: nowrap;\n border: 0;\n }\n `;\n }\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ia-search-results-switcher.d.ts","sourceRoot":"","sources":["../../../../src/elements/ia-radio-player/ia-search-results-switcher.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,UAAU,EACV,KAAK,cAAc,EACnB,KAAK,cAAc,EACnB,KAAK,cAAc,EACpB,MAAM,KAAK,CAAC;AAeb;;;;GAIG;AACH,
|
|
1
|
+
{"version":3,"file":"ia-search-results-switcher.d.ts","sourceRoot":"","sources":["../../../../src/elements/ia-radio-player/ia-search-results-switcher.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,UAAU,EACV,KAAK,cAAc,EACnB,KAAK,cAAc,EACnB,KAAK,cAAc,EACpB,MAAM,KAAK,CAAC;AAeb;;;;GAIG;AACH,qBAEa,uBAAwB,SAAQ,UAAU;IACrD,iDAAiD;IACrB,eAAe,SAAK;IAEhD,0DAA0D;IAC9B,kBAAkB,SAAK;IAEnD,MAAM,IAAI,cAAc;IAoCxB,OAAO,CAAC,iBAAiB,EAAE,cAAc,GAAG,IAAI;IAKhD,yDAAyD;IACzD,kBAAkB,IAAI,IAAI;IAS1B,wDAAwD;IACxD,cAAc,IAAI,IAAI;IAStB,OAAO,KAAK,aAAa,GAKxB;IAED,OAAO,CAAC,4BAA4B;IASpC,MAAM,KAAK,MAAM,IAAI,cAAc,CAmClC;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 nextResultIcon from './assets/next-result.js';
|
|
7
7
|
import previousResultIcon from './assets/previous-result.js';
|
|
8
8
|
/**
|
|
@@ -132,7 +132,8 @@ __decorate([
|
|
|
132
132
|
property({ type: Number })
|
|
133
133
|
], IASearchResultsSwitcher.prototype, "currentResultIndex", void 0);
|
|
134
134
|
IASearchResultsSwitcher = __decorate([
|
|
135
|
-
customElement('ia-search-results-switcher')
|
|
135
|
+
customElement('ia-search-results-switcher'),
|
|
136
|
+
localized()
|
|
136
137
|
], IASearchResultsSwitcher);
|
|
137
138
|
export { IASearchResultsSwitcher };
|
|
138
139
|
//# sourceMappingURL=ia-search-results-switcher.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ia-search-results-switcher.js","sourceRoot":"","sources":["../../../../src/elements/ia-radio-player/ia-search-results-switcher.ts"],"names":[],"mappings":";AAAA,OAAO,EACL,GAAG,EACH,IAAI,EACJ,UAAU,GAIX,MAAM,KAAK,CAAC;AACb,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAC7C,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AACzD,OAAO,EAAE,GAAG,EAAE,GAAG,EAAE,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"ia-search-results-switcher.js","sourceRoot":"","sources":["../../../../src/elements/ia-radio-player/ia-search-results-switcher.ts"],"names":[],"mappings":";AAAA,OAAO,EACL,GAAG,EACH,IAAI,EACJ,UAAU,GAIX,MAAM,KAAK,CAAC;AACb,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAC7C,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AACzD,OAAO,EAAE,SAAS,EAAE,GAAG,EAAE,GAAG,EAAE,MAAM,eAAe,CAAC;AAEpD,OAAO,cAAc,MAAM,sBAAsB,CAAC;AAClD,OAAO,kBAAkB,MAAM,0BAA0B,CAAC;AAE1D;;GAEG;AACH,MAAM,MAAM,GAAG;IACb,wBAAwB,EAAE,0BAA0B;CACrD,CAAC;AAEF;;;;GAIG;AAGI,IAAM,uBAAuB,GAA7B,MAAM,uBAAwB,SAAQ,UAAU;IAAhD;;QACL,iDAAiD;QACrB,oBAAe,GAAG,CAAC,CAAC;QAEhD,0DAA0D;QAC9B,uBAAkB,GAAG,CAAC,CAAC;IAmHrD,CAAC;IAjHC,MAAM;QACJ,OAAO,IAAI,CAAA;;;;;uBAKQ,GAAG,CAAC,wBAAwB,CAAC;mBACjC,IAAI,CAAC,kBAAkB;;YAE9B,kBAAkB;;;;sCAIQ,IAAI,CAAC,kBAAkB,GAAG,CAAC;yCACxB,IAAI,CAAC,eAAe;;;;;;uBAMtC,GAAG,CAAC,oBAAoB,CAAC;mBAC7B,IAAI,CAAC,cAAc;;YAE1B,cAAc;;;;;;;;;2CASiB,IAAI,CAAC,aAAa;KACxD,CAAC;IACJ,CAAC;IAED,OAAO,CAAC,iBAAiC;QACvC,gDAAgD;QAChD,IAAI,iBAAiB,CAAC,GAAG,CAAC,iBAAiB,CAAC;YAAE,IAAI,CAAC,kBAAkB,GAAG,CAAC,CAAC;IAC5E,CAAC;IAED,yDAAyD;IACzD,kBAAkB;QAChB,IAAI,CAAC,kBAAkB;YACrB,IAAI,CAAC,kBAAkB,GAAG,CAAC;gBACzB,CAAC,CAAC,IAAI,CAAC,eAAe,GAAG,CAAC;gBAC1B,CAAC,CAAC,IAAI,CAAC,kBAAkB,GAAG,CAAC,CAAC;QAElC,IAAI,CAAC,4BAA4B,EAAE,CAAC;IACtC,CAAC;IAED,wDAAwD;IACxD,cAAc;QACZ,IAAI,CAAC,kBAAkB;YACrB,IAAI,CAAC,kBAAkB,KAAK,IAAI,CAAC,eAAe,GAAG,CAAC;gBAClD,CAAC,CAAC,CAAC;gBACH,CAAC,CAAC,IAAI,CAAC,kBAAkB,GAAG,CAAC,CAAC;QAElC,IAAI,CAAC,4BAA4B,EAAE,CAAC;IACtC,CAAC;IAED,IAAY,aAAa;QACvB,MAAM,QAAQ,GAAG,IAAI,CAAC,kBAAkB,GAAG,CAAC,CAAC;QAC7C,MAAM,KAAK,GAAG,IAAI,CAAC,eAAe,CAAC;QAEnC,OAAO,GAAG,CAAC,GAAG,CAAA,iBAAiB,QAAQ,OAAO,KAAK,EAAE,CAAC,CAAC;IACzD,CAAC;IAEO,4BAA4B;QAClC,IAAI,CAAC,aAAa,CAChB,IAAI,WAAW,CACb,MAAM,CAAC,wBAAwB,EAC/B,EAAE,MAAM,EAAE,EAAE,iBAAiB,EAAE,IAAI,CAAC,kBAAkB,EAAE,EAAE,CAC3D,CACF,CAAC;IACJ,CAAC;IAED,MAAM,KAAK,MAAM;QACf,OAAO,GAAG,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;KAiCT,CAAC;IACJ,CAAC;CACF,CAAA;AAtH6B;IAA3B,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;gEAAqB;AAGpB;IAA3B,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;mEAAwB;AALxC,uBAAuB;IAFnC,aAAa,CAAC,4BAA4B,CAAC;IAC3C,SAAS,EAAE;GACC,uBAAuB,CAwHnC","sourcesContent":["import {\n css,\n html,\n LitElement,\n type CSSResultGroup,\n type PropertyValues,\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 nextResultIcon from './assets/next-result';\nimport previousResultIcon from './assets/previous-result';\n\n/**\n * Event names emitted by this component\n */\nconst Events = {\n SearchResultIndexChanged: 'searchResultIndexChanged',\n};\n\n/**\n * Steps through search results, reading `‹ 3 / 7 ›`.\n *\n * Both ends wrap around, so there is always somewhere to go.\n */\n@customElement('ia-search-results-switcher')\n@localized()\nexport class IASearchResultsSwitcher extends LitElement {\n /** How many results there are to step through */\n @property({ type: Number }) numberOfResults = 0;\n\n /** Which result is being looked at, counting from zero */\n @property({ type: Number }) currentResultIndex = 0;\n\n render(): TemplateResult {\n return html`\n <div class=\"container\">\n <button\n id=\"previous-button\"\n type=\"button\"\n aria-label=${msg('Previous search result')}\n @click=${this.goToPreviousResult}\n >\n ${previousResultIcon}\n </button>\n\n <span class=\"results-range\">\n <span id=\"current-result\">${this.currentResultIndex + 1}</span> /\n <span id=\"number-of-results\">${this.numberOfResults}</span>\n </span>\n\n <button\n id=\"next-button\"\n type=\"button\"\n aria-label=${msg('Next search result')}\n @click=${this.goToNextResult}\n >\n ${nextResultIcon}\n </button>\n </div>\n\n <!--\n The counter above is two bare numbers, which say nothing on their own.\n This says what they mean, and being a live region it is announced each\n time the reader moves between results.\n -->\n <div class=\"sr-only\" role=\"status\">${this.positionLabel}</div>\n `;\n }\n\n updated(changedProperties: PropertyValues): void {\n // A new set of results starts at the first one.\n if (changedProperties.has('numberOfResults')) this.currentResultIndex = 0;\n }\n\n /** Steps back one result, wrapping round to the last. */\n goToPreviousResult(): void {\n this.currentResultIndex =\n this.currentResultIndex < 1\n ? this.numberOfResults - 1\n : this.currentResultIndex - 1;\n\n this.emitSearchResultIndexChanged();\n }\n\n /** Steps on one result, wrapping round to the first. */\n goToNextResult(): void {\n this.currentResultIndex =\n this.currentResultIndex === this.numberOfResults - 1\n ? 0\n : this.currentResultIndex + 1;\n\n this.emitSearchResultIndexChanged();\n }\n\n private get positionLabel(): string {\n const position = this.currentResultIndex + 1;\n const total = this.numberOfResults;\n\n return msg(str`Search result ${position} of ${total}`);\n }\n\n private emitSearchResultIndexChanged(): void {\n this.dispatchEvent(\n new CustomEvent<{ searchResultIndex: number }>(\n Events.SearchResultIndexChanged,\n { detail: { searchResultIndex: this.currentResultIndex } },\n ),\n );\n }\n\n static get styles(): CSSResultGroup {\n return css`\n :host {\n --search-switcher-color--: var(--ia-theme-search-switcher-color, #fff);\n\n color: var(--search-switcher-color--);\n }\n\n .container {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 0.5em;\n }\n\n button {\n background: none;\n border: 0;\n padding: 0;\n color: inherit;\n cursor: pointer;\n }\n\n .sr-only {\n position: absolute;\n width: 1px;\n height: 1px;\n padding: 0;\n margin: -1px;\n overflow: hidden;\n clip: rect(0, 0, 0, 0);\n white-space: nowrap;\n border: 0;\n }\n `;\n }\n}\n"]}
|
|
@@ -17,8 +17,8 @@ export declare class IAScrubberBar extends LitElement {
|
|
|
17
17
|
sectionMarkerPercentages: number[];
|
|
18
18
|
/** Whether the markers either side of the playhead point towards it */
|
|
19
19
|
expandSectionMarkers: boolean;
|
|
20
|
-
/** The accessible name for the slider */
|
|
21
|
-
label
|
|
20
|
+
/** The accessible name for the slider. Defaults to "Playback position". */
|
|
21
|
+
label?: string;
|
|
22
22
|
/**
|
|
23
23
|
* The position actually shown.
|
|
24
24
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ia-scrubber-bar.d.ts","sourceRoot":"","sources":["../../../../src/elements/ia-scrubber-bar/ia-scrubber-bar.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,UAAU,EACV,KAAK,cAAc,EACnB,KAAK,cAAc,EACnB,KAAK,cAAc,EACpB,MAAM,KAAK,CAAC;AAOb,OAAO,qBAAqB,CAAC;AAuC7B;;;GAGG;AACH,
|
|
1
|
+
{"version":3,"file":"ia-scrubber-bar.d.ts","sourceRoot":"","sources":["../../../../src/elements/ia-scrubber-bar/ia-scrubber-bar.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,UAAU,EACV,KAAK,cAAc,EACnB,KAAK,cAAc,EACnB,KAAK,cAAc,EACpB,MAAM,KAAK,CAAC;AAOb,OAAO,qBAAqB,CAAC;AAuC7B;;;GAGG;AACH,qBAEa,aAAc,SAAQ,UAAU;IAC3C,2CAA2C;IACf,KAAK,SAAK;IAEtC,iDAAiD;IACrB,GAAG,SAAK;IAEpC,kDAAkD;IACtB,GAAG,SAAO;IAEtC,2CAA2C;IACf,IAAI,SAAO;IAEvC,oEAAoE;IACzC,wBAAwB,EAAE,MAAM,EAAE,CAAM;IAEnE,uEAAuE;IAC1C,oBAAoB,UAAS;IAE1D,2EAA2E;IAC/C,KAAK,CAAC,EAAE,MAAM,CAAC;IAE3C;;;;;;OAMG;IACM,OAAO,CAAC,YAAY,CAAK;IAElC,OAAO,CAAC,iBAAiB,CAAS;IAElC,+DAA+D;IAC/D,IAAI,UAAU,IAAI,MAAM,CAKvB;IAED,MAAM,IAAI,cAAc;IA0CxB,OAAO,CAAC,iBAAiB,EAAE,cAAc,GAAG,IAAI;IAMhD;;;;;OAKG;IACH,OAAO,KAAK,kBAAkB,GAS7B;IAED;;;;;;OAMG;IACH,OAAO,KAAK,aAAa,GAExB;IAED,OAAO,CAAC,aAAa;IAUrB,OAAO,CAAC,WAAW;IAUnB,OAAO,CAAC,kBAAkB;IAK1B;;;;;;;;;OASG;IACH,OAAO,CAAC,aAAa;IAMrB,OAAO,CAAC,WAAW;IAMnB;;;;;OAKG;IACH,OAAO,CAAC,UAAU;IAMlB;;;;;;OAMG;IACH,OAAO,CAAC,gBAAgB;IAKxB,MAAM,KAAK,MAAM,IAAI,cAAc,CAiKlC;CACF"}
|
|
@@ -2,7 +2,7 @@ import { __decorate } from "tslib";
|
|
|
2
2
|
import { css, html, LitElement, } from 'lit';
|
|
3
3
|
import { property, state } from 'lit/decorators.js';
|
|
4
4
|
import { customElement } from '../../util/custom-element.js';
|
|
5
|
-
import { msg } from '@lit/localize';
|
|
5
|
+
import { localized, msg } from '@lit/localize';
|
|
6
6
|
import { SectionMarkerMode } from './models.js';
|
|
7
7
|
import './ia-section-marker.js';
|
|
8
8
|
/**
|
|
@@ -48,8 +48,6 @@ let IAScrubberBar = class IAScrubberBar extends LitElement {
|
|
|
48
48
|
this.sectionMarkerPercentages = [];
|
|
49
49
|
/** Whether the markers either side of the playhead point towards it */
|
|
50
50
|
this.expandSectionMarkers = false;
|
|
51
|
-
/** The accessible name for the slider */
|
|
52
|
-
this.label = msg('Playback position');
|
|
53
51
|
/**
|
|
54
52
|
* The position actually shown.
|
|
55
53
|
*
|
|
@@ -86,7 +84,7 @@ let IAScrubberBar = class IAScrubberBar extends LitElement {
|
|
|
86
84
|
<input
|
|
87
85
|
id="slider"
|
|
88
86
|
type="range"
|
|
89
|
-
aria-label=${this.label}
|
|
87
|
+
aria-label=${this.label ?? msg('Playback position')}
|
|
90
88
|
min=${this.min}
|
|
91
89
|
max=${this.max}
|
|
92
90
|
step=${this.step}
|
|
@@ -382,7 +380,8 @@ __decorate([
|
|
|
382
380
|
state()
|
|
383
381
|
], IAScrubberBar.prototype, "currentValue", void 0);
|
|
384
382
|
IAScrubberBar = __decorate([
|
|
385
|
-
customElement('ia-scrubber-bar')
|
|
383
|
+
customElement('ia-scrubber-bar'),
|
|
384
|
+
localized()
|
|
386
385
|
], IAScrubberBar);
|
|
387
386
|
export { IAScrubberBar };
|
|
388
387
|
//# sourceMappingURL=ia-scrubber-bar.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ia-scrubber-bar.js","sourceRoot":"","sources":["../../../../src/elements/ia-scrubber-bar/ia-scrubber-bar.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n css,\n html,\n LitElement,\n type CSSResultGroup,\n type PropertyValues,\n type TemplateResult,\n} from 'lit';\nimport { property, state } from 'lit/decorators.js';\nimport { customElement } from '@src/util/custom-element';\nimport { msg } from '@lit/localize';\n\nimport { SectionMarkerMode } from './models';\n\nimport './ia-section-marker';\n\n/**\n * Event names emitted by this component\n */\nconst Events = {\n ValueChange: 'valuechange',\n UserInteractionStarted: 'userInteractionStarted',\n UserInteractionEnded: 'userInteractionEnded',\n};\n\n/**\n * The keys that move a range input.\n *\n * Only these count as scrubbing. Tab in particular must not, since it takes\n * focus away and its keyup lands on whatever it moved to, never here.\n */\nconst VALUE_KEYS = new Set([\n 'ArrowLeft',\n 'ArrowRight',\n 'ArrowUp',\n 'ArrowDown',\n 'Home',\n 'End',\n 'PageUp',\n 'PageDown',\n]);\n\n/**\n * The section boundaries either side of the playhead.\n *\n * `undefined` where there is no boundary on that side, which is the case at\n * the very start and the very end of the track.\n */\ninterface SurroundingMarkers {\n lower?: number;\n upper?: number;\n}\n\n/**\n * A range slider styled as a playback scrubber, with optional section markers\n * laid over the track.\n */\n@customElement('ia-scrubber-bar')\nexport class IAScrubberBar extends LitElement {\n /** The current position along the track */\n @property({ type: Number }) value = 0;\n\n /** The lowest position the scrubber can reach */\n @property({ type: Number }) min = 0;\n\n /** The highest position the scrubber can reach */\n @property({ type: Number }) max = 100;\n\n /** How finely the scrubber can be moved */\n @property({ type: Number }) step = 0.1;\n\n /** Where to draw section boundaries, as percentages of the track */\n @property({ type: Array }) sectionMarkerPercentages: number[] = [];\n\n /** Whether the markers either side of the playhead point towards it */\n @property({ type: Boolean }) expandSectionMarkers = false;\n\n /** The accessible name for the slider */\n @property({ type: String }) label = msg('Playback position');\n\n /**\n * The position actually shown.\n *\n * `value` is driven from outside by whatever is playing the audio, but while\n * the listener is scrubbing their position wins. Keeping the two apart is\n * what stops playback updates fighting the drag.\n */\n @state() private currentValue = 0;\n\n private userIsInteracting = false;\n\n /** How far along the track the playhead is, as a percentage */\n get percentage(): number {\n const range = this.max - this.min;\n if (range === 0) return 0;\n\n return ((this.currentValue - this.min) / range) * 100;\n }\n\n render(): TemplateResult {\n const surrounding = this.surroundingMarkers;\n\n return html`\n <div class=\"container\" style=\"--fill-percent--: ${this.percentage}%\">\n <div class=\"color-fill\"></div>\n\n <div class=\"marker-container\">\n ${this.sectionMarkerPercentages.map(\n (markerPercent) => html`\n <ia-section-marker\n data-location=${markerPercent}\n style=\"left: ${markerPercent}%\"\n .markerMode=${this.markerModeFor(markerPercent, surrounding)}\n ></ia-section-marker>\n `,\n )}\n </div>\n\n <input\n id=\"slider\"\n type=\"range\"\n aria-label=${this.label}\n min=${this.min}\n max=${this.max}\n step=${this.step}\n .value=${String(this.currentValue)}\n @mousedown=${this.interactionStarted}\n @mouseup=${this.interactionEnded}\n @touchstart=${this.interactionStarted}\n @touchend=${this.interactionEnded}\n @touchcancel=${this.interactionEnded}\n @keydown=${this.handleKeyDown}\n @keyup=${this.handleKeyUp}\n @blur=${this.handleBlur}\n @input=${this.handleSlide}\n @change=${this.handleSlide}\n />\n </div>\n `;\n }\n\n updated(changedProperties: PropertyValues): void {\n if (this.userIsInteracting || !changedProperties.has('value')) return;\n\n this.currentValue = this.value;\n }\n\n /**\n * The section boundaries immediately below and above the playhead.\n *\n * Returns nothing when the markers aren't meant to react to the playhead, so\n * every marker falls back to its resting state.\n */\n private get surroundingMarkers(): SurroundingMarkers {\n if (!this.expandSectionMarkers) return {};\n\n const sorted = this.sortedMarkers;\n\n return {\n lower: sorted.filter((percent) => percent <= this.currentValue).pop(),\n upper: sorted.find((percent) => percent > this.currentValue),\n };\n }\n\n /**\n * The marker percentages in ascending numeric order.\n *\n * Sorted on a copy with an explicit comparator: the default `sort()` orders\n * lexicographically, which puts 100 before 9, and it sorts in place, which\n * would reorder the caller's own array.\n */\n private get sortedMarkers(): number[] {\n return [...this.sectionMarkerPercentages].sort((a, b) => a - b);\n }\n\n private markerModeFor(\n markerPercent: number,\n surrounding: SurroundingMarkers,\n ): SectionMarkerMode {\n if (markerPercent === surrounding.upper) return SectionMarkerMode.left;\n if (markerPercent === surrounding.lower) return SectionMarkerMode.right;\n\n return SectionMarkerMode.neither;\n }\n\n private handleSlide(e: Event): void {\n this.currentValue = parseFloat((e.target as HTMLInputElement).value);\n\n this.dispatchEvent(\n new CustomEvent<{ value: number }>(Events.ValueChange, {\n detail: { value: this.currentValue },\n }),\n );\n }\n\n private interactionStarted(): void {\n this.userIsInteracting = true;\n this.dispatchEvent(new Event(Events.UserInteractionStarted));\n }\n\n /**\n * Starts an interaction when the slider is scrubbed from the keyboard.\n *\n * Without this, arrowing along the bar sets the value but leaves\n * `userIsInteracting` false, so the next playback tick snaps the thumb back\n * to the playhead mid-scrub.\n *\n * Guarded against the auto-repeat that holding a key produces, which would\n * otherwise emit a fresh `userInteractionStarted` on every repeat.\n */\n private handleKeyDown(e: KeyboardEvent): void {\n if (!VALUE_KEYS.has(e.key) || this.userIsInteracting) return;\n\n this.interactionStarted();\n }\n\n private handleKeyUp(e: KeyboardEvent): void {\n if (!VALUE_KEYS.has(e.key)) return;\n\n this.interactionEnded();\n }\n\n /**\n * Releases an interaction that focus left behind.\n *\n * A keyup can go missing, e.g. focus moves while the key is still down, and\n * an interaction left latched on would ignore playback updates for good.\n */\n private handleBlur(): void {\n if (!this.userIsInteracting) return;\n\n this.interactionEnded();\n }\n\n /**\n * Ends the interaction.\n *\n * Bound to `touchcancel` as well as `touchend`, because a touch the system\n * takes over never delivers `touchend`, and an interaction left latched on\n * would ignore playback updates from then on.\n */\n private interactionEnded(): void {\n this.userIsInteracting = false;\n this.dispatchEvent(new Event(Events.UserInteractionEnded));\n }\n\n static get styles(): CSSResultGroup {\n return css`\n :host {\n --scrubber-bar-height--: var(--ia-theme-scrubber-bar-height, 20px);\n --scrubber-marker-inset--: var(--ia-theme-scrubber-marker-inset, 10px);\n\n --scrubber-thumb-color--: var(--ia-theme-scrubber-thumb-color, #fff);\n --scrubber-thumb-diameter--: var(\n --ia-theme-scrubber-thumb-diameter,\n 20px\n );\n --scrubber-thumb-border--: var(\n --ia-theme-scrubber-thumb-border,\n 1px solid #000\n );\n --scrubber-thumb-border-radius--: var(\n --ia-theme-scrubber-thumb-border-radius,\n 50%\n );\n /*\n Centres the thumb on the track. The thumb is content-box, so its\n border adds 1px above and below the diameter, hence the extra -1px.\n Comes out at -6px for the default track and thumb sizes.\n */\n --scrubber-thumb-top-margin--: var(\n --ia-theme-scrubber-thumb-top-margin,\n calc(\n (\n var(--scrubber-track-height--) - var(\n --scrubber-thumb-diameter--\n )\n ) /\n 2 - 1px\n )\n );\n\n --scrubber-track-height--: var(--ia-theme-scrubber-track-height, 10px);\n --scrubber-track-border--: var(\n --ia-theme-scrubber-track-border,\n 1px solid #fff\n );\n --scrubber-track-border-radius--: var(\n --ia-theme-scrubber-track-border-radius,\n 5px\n );\n --scrubber-track-color--: var(\n --ia-theme-scrubber-track-color,\n rgba(0, 0, 0, 0.1)\n );\n --scrubber-track-fill-color--: var(\n --ia-theme-scrubber-track-fill-color,\n #3272b6\n );\n\n /*\n How far off the bottom the track sits. The fill and the section\n markers both line up against this, so they follow the track when its\n height is themed. Comes out at 7px for the default sizes.\n */\n --scrubber-track-offset--: calc(\n (var(--scrubber-bar-height--) - var(--scrubber-track-height--)) / 2 +\n 2px\n );\n }\n\n .container {\n position: relative;\n height: var(--scrubber-bar-height--);\n }\n\n /*\n The fill is a plain element rather than a track pseudo-element, so the\n played portion is just a hard gradient stop driven by a custom property.\n */\n .color-fill {\n height: var(--scrubber-track-height--);\n border-radius: 1em;\n position: absolute;\n bottom: var(--scrubber-track-offset--);\n left: 2px;\n right: -2px;\n background: linear-gradient(\n to right,\n var(--scrubber-track-fill-color--) 0%,\n var(--scrubber-track-fill-color--) var(--fill-percent--),\n var(--scrubber-track-color--) var(--fill-percent--),\n var(--scrubber-track-color--) 100%\n );\n }\n\n .marker-container {\n position: absolute;\n left: var(--scrubber-marker-inset--);\n right: var(--scrubber-marker-inset--);\n height: 100%;\n }\n\n ia-section-marker {\n position: absolute;\n width: 2rem;\n height: var(--scrubber-track-height--);\n bottom: var(--scrubber-track-offset--);\n /*\n The left offset puts the marker where it belongs, but the divider runs\n down the middle of the marker, so it shifts back by half its own width\n to line the divider up with that point.\n */\n transform: translateX(-50%);\n }\n\n input[type='range'] {\n -webkit-appearance: none;\n appearance: none;\n height: var(--scrubber-bar-height--);\n padding: 0;\n width: 100%;\n background: none;\n outline: none;\n position: absolute;\n bottom: 0;\n }\n\n input[type='range']::-webkit-slider-thumb {\n -webkit-appearance: none;\n appearance: none;\n box-sizing: content-box;\n margin-top: var(--scrubber-thumb-top-margin--);\n background-color: var(--scrubber-thumb-color--);\n height: var(--scrubber-thumb-diameter--);\n width: var(--scrubber-thumb-diameter--);\n border-radius: var(--scrubber-thumb-border-radius--);\n border: var(--scrubber-thumb-border--);\n cursor: pointer;\n }\n\n input[type='range']::-moz-range-thumb {\n background-color: var(--scrubber-thumb-color--);\n height: var(--scrubber-thumb-diameter--);\n width: var(--scrubber-thumb-diameter--);\n border-radius: var(--scrubber-thumb-border-radius--);\n border: var(--scrubber-thumb-border--);\n cursor: pointer;\n }\n\n input[type='range']::-webkit-slider-runnable-track {\n border: var(--scrubber-track-border--);\n height: var(--scrubber-track-height--);\n border-radius: var(--scrubber-track-border-radius--);\n }\n\n input[type='range']::-moz-range-track {\n border: var(--scrubber-track-border--);\n height: var(--scrubber-track-height--);\n border-radius: var(--scrubber-track-border-radius--);\n }\n\n input[type='range']::-moz-range-progress {\n height: var(--scrubber-track-height--);\n border-radius: var(--scrubber-track-border-radius--);\n }\n `;\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"ia-scrubber-bar.js","sourceRoot":"","sources":["../../../../src/elements/ia-scrubber-bar/ia-scrubber-bar.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n css,\n html,\n LitElement,\n type CSSResultGroup,\n type PropertyValues,\n type TemplateResult,\n} from 'lit';\nimport { property, state } from 'lit/decorators.js';\nimport { customElement } from '@src/util/custom-element';\nimport { localized, msg } from '@lit/localize';\n\nimport { SectionMarkerMode } from './models';\n\nimport './ia-section-marker';\n\n/**\n * Event names emitted by this component\n */\nconst Events = {\n ValueChange: 'valuechange',\n UserInteractionStarted: 'userInteractionStarted',\n UserInteractionEnded: 'userInteractionEnded',\n};\n\n/**\n * The keys that move a range input.\n *\n * Only these count as scrubbing. Tab in particular must not, since it takes\n * focus away and its keyup lands on whatever it moved to, never here.\n */\nconst VALUE_KEYS = new Set([\n 'ArrowLeft',\n 'ArrowRight',\n 'ArrowUp',\n 'ArrowDown',\n 'Home',\n 'End',\n 'PageUp',\n 'PageDown',\n]);\n\n/**\n * The section boundaries either side of the playhead.\n *\n * `undefined` where there is no boundary on that side, which is the case at\n * the very start and the very end of the track.\n */\ninterface SurroundingMarkers {\n lower?: number;\n upper?: number;\n}\n\n/**\n * A range slider styled as a playback scrubber, with optional section markers\n * laid over the track.\n */\n@customElement('ia-scrubber-bar')\n@localized()\nexport class IAScrubberBar extends LitElement {\n /** The current position along the track */\n @property({ type: Number }) value = 0;\n\n /** The lowest position the scrubber can reach */\n @property({ type: Number }) min = 0;\n\n /** The highest position the scrubber can reach */\n @property({ type: Number }) max = 100;\n\n /** How finely the scrubber can be moved */\n @property({ type: Number }) step = 0.1;\n\n /** Where to draw section boundaries, as percentages of the track */\n @property({ type: Array }) sectionMarkerPercentages: number[] = [];\n\n /** Whether the markers either side of the playhead point towards it */\n @property({ type: Boolean }) expandSectionMarkers = false;\n\n /** The accessible name for the slider. Defaults to \"Playback position\". */\n @property({ type: String }) label?: string;\n\n /**\n * The position actually shown.\n *\n * `value` is driven from outside by whatever is playing the audio, but while\n * the listener is scrubbing their position wins. Keeping the two apart is\n * what stops playback updates fighting the drag.\n */\n @state() private currentValue = 0;\n\n private userIsInteracting = false;\n\n /** How far along the track the playhead is, as a percentage */\n get percentage(): number {\n const range = this.max - this.min;\n if (range === 0) return 0;\n\n return ((this.currentValue - this.min) / range) * 100;\n }\n\n render(): TemplateResult {\n const surrounding = this.surroundingMarkers;\n\n return html`\n <div class=\"container\" style=\"--fill-percent--: ${this.percentage}%\">\n <div class=\"color-fill\"></div>\n\n <div class=\"marker-container\">\n ${this.sectionMarkerPercentages.map(\n (markerPercent) => html`\n <ia-section-marker\n data-location=${markerPercent}\n style=\"left: ${markerPercent}%\"\n .markerMode=${this.markerModeFor(markerPercent, surrounding)}\n ></ia-section-marker>\n `,\n )}\n </div>\n\n <input\n id=\"slider\"\n type=\"range\"\n aria-label=${this.label ?? msg('Playback position')}\n min=${this.min}\n max=${this.max}\n step=${this.step}\n .value=${String(this.currentValue)}\n @mousedown=${this.interactionStarted}\n @mouseup=${this.interactionEnded}\n @touchstart=${this.interactionStarted}\n @touchend=${this.interactionEnded}\n @touchcancel=${this.interactionEnded}\n @keydown=${this.handleKeyDown}\n @keyup=${this.handleKeyUp}\n @blur=${this.handleBlur}\n @input=${this.handleSlide}\n @change=${this.handleSlide}\n />\n </div>\n `;\n }\n\n updated(changedProperties: PropertyValues): void {\n if (this.userIsInteracting || !changedProperties.has('value')) return;\n\n this.currentValue = this.value;\n }\n\n /**\n * The section boundaries immediately below and above the playhead.\n *\n * Returns nothing when the markers aren't meant to react to the playhead, so\n * every marker falls back to its resting state.\n */\n private get surroundingMarkers(): SurroundingMarkers {\n if (!this.expandSectionMarkers) return {};\n\n const sorted = this.sortedMarkers;\n\n return {\n lower: sorted.filter((percent) => percent <= this.currentValue).pop(),\n upper: sorted.find((percent) => percent > this.currentValue),\n };\n }\n\n /**\n * The marker percentages in ascending numeric order.\n *\n * Sorted on a copy with an explicit comparator: the default `sort()` orders\n * lexicographically, which puts 100 before 9, and it sorts in place, which\n * would reorder the caller's own array.\n */\n private get sortedMarkers(): number[] {\n return [...this.sectionMarkerPercentages].sort((a, b) => a - b);\n }\n\n private markerModeFor(\n markerPercent: number,\n surrounding: SurroundingMarkers,\n ): SectionMarkerMode {\n if (markerPercent === surrounding.upper) return SectionMarkerMode.left;\n if (markerPercent === surrounding.lower) return SectionMarkerMode.right;\n\n return SectionMarkerMode.neither;\n }\n\n private handleSlide(e: Event): void {\n this.currentValue = parseFloat((e.target as HTMLInputElement).value);\n\n this.dispatchEvent(\n new CustomEvent<{ value: number }>(Events.ValueChange, {\n detail: { value: this.currentValue },\n }),\n );\n }\n\n private interactionStarted(): void {\n this.userIsInteracting = true;\n this.dispatchEvent(new Event(Events.UserInteractionStarted));\n }\n\n /**\n * Starts an interaction when the slider is scrubbed from the keyboard.\n *\n * Without this, arrowing along the bar sets the value but leaves\n * `userIsInteracting` false, so the next playback tick snaps the thumb back\n * to the playhead mid-scrub.\n *\n * Guarded against the auto-repeat that holding a key produces, which would\n * otherwise emit a fresh `userInteractionStarted` on every repeat.\n */\n private handleKeyDown(e: KeyboardEvent): void {\n if (!VALUE_KEYS.has(e.key) || this.userIsInteracting) return;\n\n this.interactionStarted();\n }\n\n private handleKeyUp(e: KeyboardEvent): void {\n if (!VALUE_KEYS.has(e.key)) return;\n\n this.interactionEnded();\n }\n\n /**\n * Releases an interaction that focus left behind.\n *\n * A keyup can go missing, e.g. focus moves while the key is still down, and\n * an interaction left latched on would ignore playback updates for good.\n */\n private handleBlur(): void {\n if (!this.userIsInteracting) return;\n\n this.interactionEnded();\n }\n\n /**\n * Ends the interaction.\n *\n * Bound to `touchcancel` as well as `touchend`, because a touch the system\n * takes over never delivers `touchend`, and an interaction left latched on\n * would ignore playback updates from then on.\n */\n private interactionEnded(): void {\n this.userIsInteracting = false;\n this.dispatchEvent(new Event(Events.UserInteractionEnded));\n }\n\n static get styles(): CSSResultGroup {\n return css`\n :host {\n --scrubber-bar-height--: var(--ia-theme-scrubber-bar-height, 20px);\n --scrubber-marker-inset--: var(--ia-theme-scrubber-marker-inset, 10px);\n\n --scrubber-thumb-color--: var(--ia-theme-scrubber-thumb-color, #fff);\n --scrubber-thumb-diameter--: var(\n --ia-theme-scrubber-thumb-diameter,\n 20px\n );\n --scrubber-thumb-border--: var(\n --ia-theme-scrubber-thumb-border,\n 1px solid #000\n );\n --scrubber-thumb-border-radius--: var(\n --ia-theme-scrubber-thumb-border-radius,\n 50%\n );\n /*\n Centres the thumb on the track. The thumb is content-box, so its\n border adds 1px above and below the diameter, hence the extra -1px.\n Comes out at -6px for the default track and thumb sizes.\n */\n --scrubber-thumb-top-margin--: var(\n --ia-theme-scrubber-thumb-top-margin,\n calc(\n (\n var(--scrubber-track-height--) - var(\n --scrubber-thumb-diameter--\n )\n ) /\n 2 - 1px\n )\n );\n\n --scrubber-track-height--: var(--ia-theme-scrubber-track-height, 10px);\n --scrubber-track-border--: var(\n --ia-theme-scrubber-track-border,\n 1px solid #fff\n );\n --scrubber-track-border-radius--: var(\n --ia-theme-scrubber-track-border-radius,\n 5px\n );\n --scrubber-track-color--: var(\n --ia-theme-scrubber-track-color,\n rgba(0, 0, 0, 0.1)\n );\n --scrubber-track-fill-color--: var(\n --ia-theme-scrubber-track-fill-color,\n #3272b6\n );\n\n /*\n How far off the bottom the track sits. The fill and the section\n markers both line up against this, so they follow the track when its\n height is themed. Comes out at 7px for the default sizes.\n */\n --scrubber-track-offset--: calc(\n (var(--scrubber-bar-height--) - var(--scrubber-track-height--)) / 2 +\n 2px\n );\n }\n\n .container {\n position: relative;\n height: var(--scrubber-bar-height--);\n }\n\n /*\n The fill is a plain element rather than a track pseudo-element, so the\n played portion is just a hard gradient stop driven by a custom property.\n */\n .color-fill {\n height: var(--scrubber-track-height--);\n border-radius: 1em;\n position: absolute;\n bottom: var(--scrubber-track-offset--);\n left: 2px;\n right: -2px;\n background: linear-gradient(\n to right,\n var(--scrubber-track-fill-color--) 0%,\n var(--scrubber-track-fill-color--) var(--fill-percent--),\n var(--scrubber-track-color--) var(--fill-percent--),\n var(--scrubber-track-color--) 100%\n );\n }\n\n .marker-container {\n position: absolute;\n left: var(--scrubber-marker-inset--);\n right: var(--scrubber-marker-inset--);\n height: 100%;\n }\n\n ia-section-marker {\n position: absolute;\n width: 2rem;\n height: var(--scrubber-track-height--);\n bottom: var(--scrubber-track-offset--);\n /*\n The left offset puts the marker where it belongs, but the divider runs\n down the middle of the marker, so it shifts back by half its own width\n to line the divider up with that point.\n */\n transform: translateX(-50%);\n }\n\n input[type='range'] {\n -webkit-appearance: none;\n appearance: none;\n height: var(--scrubber-bar-height--);\n padding: 0;\n width: 100%;\n background: none;\n outline: none;\n position: absolute;\n bottom: 0;\n }\n\n input[type='range']::-webkit-slider-thumb {\n -webkit-appearance: none;\n appearance: none;\n box-sizing: content-box;\n margin-top: var(--scrubber-thumb-top-margin--);\n background-color: var(--scrubber-thumb-color--);\n height: var(--scrubber-thumb-diameter--);\n width: var(--scrubber-thumb-diameter--);\n border-radius: var(--scrubber-thumb-border-radius--);\n border: var(--scrubber-thumb-border--);\n cursor: pointer;\n }\n\n input[type='range']::-moz-range-thumb {\n background-color: var(--scrubber-thumb-color--);\n height: var(--scrubber-thumb-diameter--);\n width: var(--scrubber-thumb-diameter--);\n border-radius: var(--scrubber-thumb-border-radius--);\n border: var(--scrubber-thumb-border--);\n cursor: pointer;\n }\n\n input[type='range']::-webkit-slider-runnable-track {\n border: var(--scrubber-track-border--);\n height: var(--scrubber-track-height--);\n border-radius: var(--scrubber-track-border-radius--);\n }\n\n input[type='range']::-moz-range-track {\n border: var(--scrubber-track-border--);\n height: var(--scrubber-track-height--);\n border-radius: var(--scrubber-track-border-radius--);\n }\n\n input[type='range']::-moz-range-progress {\n height: var(--scrubber-track-height--);\n border-radius: var(--scrubber-track-border-radius--);\n }\n `;\n }\n}\n"]}
|
|
@@ -16,9 +16,9 @@ export type MediaTypeIcon = 'audio' | 'collection' | 'etree' | 'images' | 'searc
|
|
|
16
16
|
* 4. three animated dots (the default)
|
|
17
17
|
*/
|
|
18
18
|
export declare class IAStatusIndicator extends LitElement {
|
|
19
|
-
loadingTitle
|
|
20
|
-
successTitle
|
|
21
|
-
errorTitle
|
|
19
|
+
loadingTitle?: string;
|
|
20
|
+
successTitle?: string;
|
|
21
|
+
errorTitle?: string;
|
|
22
22
|
mode: LoadingStatus;
|
|
23
23
|
mediatype?: MediaTypeIcon;
|
|
24
24
|
hideDots: boolean;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ia-status-indicator.d.ts","sourceRoot":"","sources":["../../../../src/elements/ia-status-indicator/ia-status-indicator.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,cAAc,EAEd,UAAU,EAIV,cAAc,EACf,MAAM,KAAK,CAAC;AAoBb,MAAM,MAAM,aAAa,GAAG,OAAO,GAAG,SAAS,GAAG,SAAS,GAAG,OAAO,CAAC;AAEtE;;;;GAIG;AACH,MAAM,MAAM,aAAa,GACrB,OAAO,GACP,YAAY,GACZ,OAAO,GACP,QAAQ,GACR,QAAQ,GACR,UAAU,GACV,OAAO,GACP,IAAI,GACJ,OAAO,GACP,KAAK,CAAC;AAeV;;;;;;;;GAQG;AACH,
|
|
1
|
+
{"version":3,"file":"ia-status-indicator.d.ts","sourceRoot":"","sources":["../../../../src/elements/ia-status-indicator/ia-status-indicator.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,cAAc,EAEd,UAAU,EAIV,cAAc,EACf,MAAM,KAAK,CAAC;AAoBb,MAAM,MAAM,aAAa,GAAG,OAAO,GAAG,SAAS,GAAG,SAAS,GAAG,OAAO,CAAC;AAEtE;;;;GAIG;AACH,MAAM,MAAM,aAAa,GACrB,OAAO,GACP,YAAY,GACZ,OAAO,GACP,QAAQ,GACR,QAAQ,GACR,UAAU,GACV,OAAO,GACP,IAAI,GACJ,OAAO,GACP,KAAK,CAAC;AAeV;;;;;;;;GAQG;AACH,qBAEa,iBAAkB,SAAQ,UAAU;IAEnB,YAAY,CAAC,EAAE,MAAM,CAAC;IAGtB,YAAY,CAAC,EAAE,MAAM,CAAC;IAGtB,UAAU,CAAC,EAAE,MAAM,CAAC;IAGpB,IAAI,EAAE,aAAa,CAAa;IAGhC,SAAS,CAAC,EAAE,aAAa,CAAC;IAGzB,QAAQ,UAAS;IAGrC,OAAO,CAAC,cAAc,CAAS;IAExC,MAAM,IAAI,cAAc;IASxB;;;OAGG;IACH,OAAO,KAAK,mBAAmB,GAE9B;IAED;;;;;OAKG;IACH,OAAO,KAAK,gBAAgB,GAG3B;IAED,6EAA6E;IAC7E,OAAO,KAAK,aAAa,GAExB;IAED;;;;;;OAMG;IACH,OAAO,KAAK,wBAAwB,GAYnC;IAED,oEAAoE;IACpE,OAAO,KAAK,aAAa,GA4BxB;IAED,8DAA8D;IAC9D,OAAO,KAAK,WAAW,GAoBtB;IAED;;;OAGG;IACH,OAAO,KAAK,qBAAqB,GAKhC;IAED,OAAO,CAAC,oBAAoB;IAK5B,wCAAwC;IACxC,OAAO,KAAK,wBAAwB,GAyBnC;IAED,gCAAgC;IAChC,OAAO,KAAK,sBAAsB,GAkBjC;IAED,MAAM,KAAK,MAAM,IAAI,cAAc,CA4HlC;CACF;AAED,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,qBAAqB;QAC7B,qBAAqB,EAAE,iBAAiB,CAAC;KAC1C;CACF"}
|
|
@@ -2,7 +2,7 @@ import { __decorate } from "tslib";
|
|
|
2
2
|
import { css, html, LitElement, nothing, svg, } from 'lit';
|
|
3
3
|
import { property, state } from 'lit/decorators.js';
|
|
4
4
|
import { customElement } from '../../util/custom-element.js';
|
|
5
|
-
import { msg } from '@lit/localize';
|
|
5
|
+
import { localized, msg } from '@lit/localize';
|
|
6
6
|
import { choose } from 'lit/directives/choose.js';
|
|
7
7
|
import themeStyles from '../../themes/theme-styles.js';
|
|
8
8
|
import { maskedIcon } from '../../util/masked-icon.js';
|
|
@@ -40,12 +40,6 @@ const MEDIATYPE_ICONS = {
|
|
|
40
40
|
let IAStatusIndicator = class IAStatusIndicator extends LitElement {
|
|
41
41
|
constructor() {
|
|
42
42
|
super(...arguments);
|
|
43
|
-
/* An optional title to use for the loading state of the indicator. Will be used for screen readers. */
|
|
44
|
-
this.loadingTitle = msg('Loading...');
|
|
45
|
-
/* An optional title to use for the success state of the indicator. Will be used for screen readers. */
|
|
46
|
-
this.successTitle = msg('Success');
|
|
47
|
-
/* An optional title to use for the error state of the indicator. Will be used for screen readers. */
|
|
48
|
-
this.errorTitle = msg('Error');
|
|
49
43
|
/* The state of the indicator that should be shown */
|
|
50
44
|
this.mode = 'loading';
|
|
51
45
|
/* Renders a bare ring, with no dots in the middle. Ignored when a center icon is present. */
|
|
@@ -115,7 +109,7 @@ let IAStatusIndicator = class IAStatusIndicator extends LitElement {
|
|
|
115
109
|
xmlns:xlink="http://www.w3.org/1999/xlink"
|
|
116
110
|
role="status"
|
|
117
111
|
>
|
|
118
|
-
<title>${this.loadingTitle}</title>
|
|
112
|
+
<title>${this.loadingTitle ?? msg('Loading...')}</title>
|
|
119
113
|
<g stroke="none" stroke-width="1" fill-rule="evenodd">
|
|
120
114
|
<path
|
|
121
115
|
class="loading-ring"
|
|
@@ -144,7 +138,7 @@ let IAStatusIndicator = class IAStatusIndicator extends LitElement {
|
|
|
144
138
|
xmlns:xlink="http://www.w3.org/1999/xlink"
|
|
145
139
|
role="status"
|
|
146
140
|
>
|
|
147
|
-
<title>${this.loadingTitle}</title>
|
|
141
|
+
<title>${this.loadingTitle ?? msg('Loading...')}</title>
|
|
148
142
|
<g fill-rule="evenodd">
|
|
149
143
|
<path
|
|
150
144
|
class="loading-ring"
|
|
@@ -181,7 +175,7 @@ let IAStatusIndicator = class IAStatusIndicator extends LitElement {
|
|
|
181
175
|
xmlns:xlink="http://www.w3.org/1999/xlink"
|
|
182
176
|
role="status"
|
|
183
177
|
>
|
|
184
|
-
<title>${this.successTitle}</title>
|
|
178
|
+
<title>${this.successTitle ?? msg('Success')}</title>
|
|
185
179
|
<g stroke="none" stroke-width="1" fill-rule="evenodd">
|
|
186
180
|
<path
|
|
187
181
|
class="success-icon"
|
|
@@ -208,7 +202,7 @@ let IAStatusIndicator = class IAStatusIndicator extends LitElement {
|
|
|
208
202
|
xmlns:xlink="http://www.w3.org/1999/xlink"
|
|
209
203
|
role="status"
|
|
210
204
|
>
|
|
211
|
-
<title>${this.errorTitle}</title>
|
|
205
|
+
<title>${this.errorTitle ?? msg('Error')}</title>
|
|
212
206
|
<path
|
|
213
207
|
class="error-icon"
|
|
214
208
|
d="m56.4612493 8.80450354 41.8901185 75.94632926c1.7706782 2.8433173 2.1150372 5.2623412 1.0330766 7.2570716-1.0819604 1.9947304-3.26978 2.9920956-6.5634587 2.9920956h-85.69973905c-3.29367873 0-5.46954894-.9973652-6.52761065-2.9920956-1.0580617-1.9947304-.70175345-4.4137543 1.06892476-7.2570716l41.89011844-75.12308969c1.8184757-2.84331737 3.9693609-4.37738627 6.4526556-4.60220671s4.6341799 1.03483527 6.4526556 3.77896714zm28.5387507 75.19549646-35.037482-62-34.962518 62zm-31-34.7484359v-10.2515641h-8v10.2515641l2.089172 14.7484359h3.8184713zm-8 19.7484359v8h8v-8z"
|
|
@@ -364,7 +358,8 @@ __decorate([
|
|
|
364
358
|
state()
|
|
365
359
|
], IAStatusIndicator.prototype, "hasSlottedIcon", void 0);
|
|
366
360
|
IAStatusIndicator = __decorate([
|
|
367
|
-
customElement('ia-status-indicator')
|
|
361
|
+
customElement('ia-status-indicator'),
|
|
362
|
+
localized()
|
|
368
363
|
], IAStatusIndicator);
|
|
369
364
|
export { IAStatusIndicator };
|
|
370
365
|
//# sourceMappingURL=ia-status-indicator.js.map
|