8.0.0 #3
@ -20,7 +20,6 @@
|
|||||||
"database",
|
"database",
|
||||||
"docs",
|
"docs",
|
||||||
"packages",
|
"packages",
|
||||||
"rules",
|
|
||||||
"web"
|
"web"
|
||||||
]
|
]
|
||||||
]
|
]
|
||||||
|
@ -28,9 +28,9 @@ Pull requests are welcome. For major changes, please open an issue first to disc
|
|||||||
|
|
||||||
## Resources
|
## Resources
|
||||||
|
|
||||||
- [FAQs](https://git.wanhose.dev/wanhose/cookie-dialog-monster/wiki/Welcome#faqs)
|
- [FAQs](https://git.wanhose.dev/wanhose/cookie-dialog-monster/wiki/Help-or-issues%3F#faqs)
|
||||||
- [Guides](https://git.wanhose.dev/wanhose/cookie-dialog-monster/wiki/Welcome#guides)
|
- [Guides](https://git.wanhose.dev/wanhose/cookie-dialog-monster/wiki/Help-or-issues%3F#guides)
|
||||||
- [Issues](https://git.wanhose.dev/wanhose/cookie-dialog-monster/issues)
|
- [Issues](https://git.wanhose.dev/wanhose/cookie-dialog-monster/issues)
|
||||||
- [Pull requests](https://git.wanhose.dev/wanhose/cookie-dialog-monster/pulls)
|
- [Pull requests](https://git.wanhose.dev/wanhose/cookie-dialog-monster/pulls)
|
||||||
- [Releases](https://git.wanhose.dev/wanhose/cookie-dialog-monster/releases)
|
- [Releases](https://git.wanhose.dev/wanhose/cookie-dialog-monster/releases)
|
||||||
- [Wiki](https://git.wanhose.dev/wanhose/cookie-dialog-monster/wiki/Welcome)
|
- [Wiki](https://git.wanhose.dev/wanhose/cookie-dialog-monster/wiki/Help-or-issues%3F)
|
||||||
|
@ -16,4 +16,4 @@
|
|||||||
|
|
||||||
## Installation
|
## Installation
|
||||||
|
|
||||||
Follow one of [these guides](https://git.wanhose.dev/wanhose/cookie-dialog-monster/wiki/Welcome#guides).
|
To install the extension, choose [the appropriate step-by-step guide](https://git.wanhose.dev/wanhose/cookie-dialog-monster/wiki/Help-or-issues%3F#guides) for your needs.
|
||||||
|
@ -32,6 +32,15 @@
|
|||||||
"options_importButton": {
|
"options_importButton": {
|
||||||
"message": "Liste importieren"
|
"message": "Liste importieren"
|
||||||
},
|
},
|
||||||
|
"popup_bannerIssueOpen": {
|
||||||
|
"message": "Ein Problem wurde für diese Seite gemeldet. Die Erweiterung funktioniert möglicherweise vorübergehend nicht wie erwartet. Verfolgen Sie das Problem oder fügen Sie weitere Informationen hinzu."
|
||||||
|
},
|
||||||
|
"popup_bannerIssueWontFix": {
|
||||||
|
"message": "Ein Problem wurde für diese Seite gemeldet, wird jedoch nicht behoben. Bitte beachten Sie, dass die Erweiterung auf dieser Seite möglicherweise nicht wie erwartet funktioniert. Wir empfehlen dringend, die Erweiterung über die Schaltfläche unten zu deaktivieren."
|
||||||
|
},
|
||||||
|
"popup_bannerUpdateAvailable": {
|
||||||
|
"message": "Update verfügbar. Bitte installieren Sie die neueste Version, um bekannte Probleme zu beheben, bevor Sie neue melden"
|
||||||
|
},
|
||||||
"popup_contributeOption": {
|
"popup_contributeOption": {
|
||||||
"message": "Zu diesem Projekt beitragen"
|
"message": "Zu diesem Projekt beitragen"
|
||||||
},
|
},
|
||||||
@ -47,28 +56,37 @@
|
|||||||
"popup_rateOption": {
|
"popup_rateOption": {
|
||||||
"message": "Bewerten Sie diese Erweiterung"
|
"message": "Bewerten Sie diese Erweiterung"
|
||||||
},
|
},
|
||||||
"reportDialog_bodyText": {
|
"report_bodyText": {
|
||||||
"message": "Bitte geben Sie in diesem Bericht keine persönlichen Informationen weiter. Wenn Sie weitere Details hinzufügen möchten, öffnen Sie das GitHub-Problem im nächsten Schritt und fügen Sie einen Kommentar hinzu."
|
"message": "Bitte geben Sie in diesem Bericht keine persönlichen Informationen weiter. Wenn Sie weitere Details hinzufügen möchten, öffnen Sie das GitHub-Problem im nächsten Schritt und fügen Sie einen Kommentar hinzu."
|
||||||
},
|
},
|
||||||
"reportDialog_reasonInputError": {
|
"report_cancelButtonText": {
|
||||||
|
"message": "Abbrechen"
|
||||||
|
},
|
||||||
|
"report_reasonInputError": {
|
||||||
"message": "Bitte geben Sie einen Grund mit mindestens 10 und höchstens 1000 Zeichen ein"
|
"message": "Bitte geben Sie einen Grund mit mindestens 10 und höchstens 1000 Zeichen ein"
|
||||||
},
|
},
|
||||||
"reportDialog_reasonInputLabel": {
|
"report_reasonInputLabel": {
|
||||||
"message": "Grund"
|
"message": "Grund"
|
||||||
},
|
},
|
||||||
"reportDialog_reasonInputPlaceholder": {
|
"report_reasonInputPlaceholder": {
|
||||||
"message": "Popup ist erschienen"
|
"message": "Popup ist erschienen"
|
||||||
},
|
},
|
||||||
"reportDialog_submitExtraText": {
|
"report_submitErrorExtraText": {
|
||||||
|
"message": "Es scheint, dass bereits ein Problem geöffnet ist oder als 'wontfix' markiert wurde. Bitte öffnen Sie das Problem und fügen Sie gegebenenfalls weitere Informationen hinzu, indem Sie den folgenden Button verwenden."
|
||||||
|
},
|
||||||
|
"report_submitErrorText": {
|
||||||
|
"message": "Bericht nicht gesendet?"
|
||||||
|
},
|
||||||
|
"report_submitSuccessExtraText": {
|
||||||
"message": "Während wir daran arbeiten, können Sie diese Website zur Ausschlussliste in den Erweiterungseinstellungen hinzufügen oder einfach die Erweiterung für diese Website deaktivieren, indem Sie auf das Erweiterungssymbol in Ihrer Browser-Symbolleiste klicken."
|
"message": "Während wir daran arbeiten, können Sie diese Website zur Ausschlussliste in den Erweiterungseinstellungen hinzufügen oder einfach die Erweiterung für diese Website deaktivieren, indem Sie auf das Erweiterungssymbol in Ihrer Browser-Symbolleiste klicken."
|
||||||
},
|
},
|
||||||
"reportDialog_submitText": {
|
"report_submitSuccessText": {
|
||||||
"message": "Bericht gesendet!"
|
"message": "Bericht gesendet!"
|
||||||
},
|
},
|
||||||
"reportDialog_urlInputError": {
|
"report_urlInputError": {
|
||||||
"message": "Bitte geben Sie eine gültige URL mit höchstens 1000 Zeichen ein"
|
"message": "Bitte geben Sie eine gültige URL mit höchstens 1000 Zeichen ein"
|
||||||
},
|
},
|
||||||
"reportDialog_urlInputLabel": {
|
"report_urlInputLabel": {
|
||||||
"message": "URL"
|
"message": "URL"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -32,6 +32,15 @@
|
|||||||
"options_importButton": {
|
"options_importButton": {
|
||||||
"message": "Import list"
|
"message": "Import list"
|
||||||
},
|
},
|
||||||
|
"popup_bannerIssueOpen": {
|
||||||
|
"message": "An issue has been reported for this page. The extension may not work as expected temporarily. Follow the issue, or add more information"
|
||||||
|
},
|
||||||
|
"popup_bannerIssueWontFix": {
|
||||||
|
"message": "An issue has been reported for this page, but it won't be fixed. Please be aware that the extension may not function as expected on this page. We highly recommend turning off the extension using the button below"
|
||||||
|
},
|
||||||
|
"popup_bannerUpdateAvailable": {
|
||||||
|
"message": "Update available. Please install the latest version to address known issues before reporting new ones"
|
||||||
|
},
|
||||||
"popup_contributeOption": {
|
"popup_contributeOption": {
|
||||||
"message": "Contribute to this project"
|
"message": "Contribute to this project"
|
||||||
},
|
},
|
||||||
@ -47,28 +56,37 @@
|
|||||||
"popup_rateOption": {
|
"popup_rateOption": {
|
||||||
"message": "Rate this extension"
|
"message": "Rate this extension"
|
||||||
},
|
},
|
||||||
"reportDialog_bodyText": {
|
"report_bodyText": {
|
||||||
"message": "Please, do not share any personal information in this report. If you want to add more details, open the GitHub issue in the next step and add a comment."
|
"message": "Please, do not share any personal information in this report. If you want to add more details, open the GitHub issue in the next step and add a comment."
|
||||||
},
|
},
|
||||||
"reportDialog_reasonInputError": {
|
"report_cancelButtonText": {
|
||||||
|
"message": "Cancel"
|
||||||
|
},
|
||||||
|
"report_reasonInputError": {
|
||||||
"message": "Please enter a reason with at least 10 characters and no more than 1000 characters"
|
"message": "Please enter a reason with at least 10 characters and no more than 1000 characters"
|
||||||
},
|
},
|
||||||
"reportDialog_reasonInputLabel": {
|
"report_reasonInputLabel": {
|
||||||
"message": "Reason"
|
"message": "Reason"
|
||||||
},
|
},
|
||||||
"reportDialog_reasonInputPlaceholder": {
|
"report_reasonInputPlaceholder": {
|
||||||
"message": "Popup showed up"
|
"message": "Popup showed up"
|
||||||
},
|
},
|
||||||
"reportDialog_submitExtraText": {
|
"report_submitErrorExtraText": {
|
||||||
|
"message": "It seems that there's an issue open already, or it is marked as 'wontfix'. Please enter the issue if you want to add more information using the following button."
|
||||||
|
},
|
||||||
|
"report_submitErrorText": {
|
||||||
|
"message": "Report not sent?"
|
||||||
|
},
|
||||||
|
"report_submitSuccessExtraText": {
|
||||||
"message": "While we are working on this, you can add this website to the exclusion list in the extension settings or just disable the extension for this website clicking on the extension icon in your browser toolbar"
|
"message": "While we are working on this, you can add this website to the exclusion list in the extension settings or just disable the extension for this website clicking on the extension icon in your browser toolbar"
|
||||||
},
|
},
|
||||||
"reportDialog_submitText": {
|
"report_submitSuccessText": {
|
||||||
"message": "Report sent!"
|
"message": "Report sent!"
|
||||||
},
|
},
|
||||||
"reportDialog_urlInputError": {
|
"report_urlInputError": {
|
||||||
"message": "Please enter a valid URL with no more than 1000 characters"
|
"message": "Please enter a valid URL with no more than 1000 characters"
|
||||||
},
|
},
|
||||||
"reportDialog_urlInputLabel": {
|
"report_urlInputLabel": {
|
||||||
"message": "URL"
|
"message": "URL"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -32,6 +32,15 @@
|
|||||||
"options_importButton": {
|
"options_importButton": {
|
||||||
"message": "Importar lista"
|
"message": "Importar lista"
|
||||||
},
|
},
|
||||||
|
"popup_bannerIssueOpen": {
|
||||||
|
"message": "Se ha informado de un problema en esta página. La extensión puede no funcionar como se espera temporalmente. Siga el problema o agregue más información."
|
||||||
|
},
|
||||||
|
"popup_bannerIssueWontFix": {
|
||||||
|
"message": "Se ha informado de un problema en esta página, pero no se solucionará. Tenga en cuenta que la extensión puede no funcionar como se espera en esta página. Recomendamos encarecidamente desactivar la extensión utilizando el botón a continuación."
|
||||||
|
},
|
||||||
|
"popup_bannerUpdateAvailable": {
|
||||||
|
"message": "Actualización disponible. Por favor, instale la última versión para solucionar problemas conocidos antes de informar nuevos"
|
||||||
|
},
|
||||||
"popup_contributeOption": {
|
"popup_contributeOption": {
|
||||||
"message": "Contribuir a este proyecto"
|
"message": "Contribuir a este proyecto"
|
||||||
},
|
},
|
||||||
@ -47,28 +56,37 @@
|
|||||||
"popup_rateOption": {
|
"popup_rateOption": {
|
||||||
"message": "Califica esta extensión"
|
"message": "Califica esta extensión"
|
||||||
},
|
},
|
||||||
"reportDialog_bodyText": {
|
"report_bodyText": {
|
||||||
"message": "Por favor, no compartas ninguna información personal en este informe. Si deseas agregar más detalles, abre el problema de GitHub en el siguiente paso y agrega un comentario."
|
"message": "Por favor, no compartas ninguna información personal en este informe. Si deseas agregar más detalles, abre el problema de GitHub en el siguiente paso y agrega un comentario."
|
||||||
},
|
},
|
||||||
"reportDialog_reasonInputError": {
|
"report_cancelButtonText": {
|
||||||
|
"message": "Cancelar"
|
||||||
|
},
|
||||||
|
"report_reasonInputError": {
|
||||||
"message": "Por favor, ingrese una razón con al menos 10 caracteres y no más de 1000 caracteres"
|
"message": "Por favor, ingrese una razón con al menos 10 caracteres y no más de 1000 caracteres"
|
||||||
},
|
},
|
||||||
"reportDialog_reasonInputLabel": {
|
"report_reasonInputLabel": {
|
||||||
"message": "Razón"
|
"message": "Razón"
|
||||||
},
|
},
|
||||||
"reportDialog_reasonInputPlaceholder": {
|
"report_reasonInputPlaceholder": {
|
||||||
"message": "Apareció un popup"
|
"message": "Apareció un popup"
|
||||||
},
|
},
|
||||||
"reportDialog_submitExtraText": {
|
"report_submitErrorExtraText": {
|
||||||
"message": "Mientras trabajamos en esto, puedes agregar este sitio web a la lista de exclusión en la configuración de la extensión o simplemente deshabilitar la extensión para este sitio web haciendo clic en el ícono de la extensión en la barra de herramientas de tu navegador."
|
"message": "Reporte no enviado?"
|
||||||
},
|
},
|
||||||
"reportDialog_submitText": {
|
"report_submitErrorText": {
|
||||||
"message": "¡Informe enviado!"
|
"message": "Parece que ya hay un problema abierto o está marcado como 'no se solucionará'. Por favor, ingrese al problema para agregar más información usando el siguiente botón."
|
||||||
},
|
},
|
||||||
"reportDialog_urlInputError": {
|
"report_submitSuccessExtraText": {
|
||||||
|
"message": "Mientras trabajamos en esto, puedes agregar este sitio web a la lista de exclusiones en la configuración de la extensión o simplemente deshabilitar la extensión para este sitio web haciendo clic en el icono de la extensión en la barra de herramientas de tu navegador."
|
||||||
|
},
|
||||||
|
"report_submitSuccessText": {
|
||||||
|
"message": "Reporte enviado!"
|
||||||
|
},
|
||||||
|
"report_urlInputError": {
|
||||||
"message": "Por favor, ingrese una URL válida con no más de 1000 caracteres"
|
"message": "Por favor, ingrese una URL válida con no más de 1000 caracteres"
|
||||||
},
|
},
|
||||||
"reportDialog_urlInputLabel": {
|
"report_urlInputLabel": {
|
||||||
"message": "URL"
|
"message": "URL"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -32,6 +32,15 @@
|
|||||||
"options_importButton": {
|
"options_importButton": {
|
||||||
"message": "Importer la liste"
|
"message": "Importer la liste"
|
||||||
},
|
},
|
||||||
|
"popup_bannerIssueOpen": {
|
||||||
|
"message": "Un problème a été signalé pour cette page. L'extension peut ne pas fonctionner comme prévu temporairement. Suivez le problème ou ajoutez plus d'informations."
|
||||||
|
},
|
||||||
|
"popup_bannerIssueWontFix": {
|
||||||
|
"message": "Un problème a été signalé pour cette page, mais il ne sera pas résolu. Veuillez noter que l'extension pourrait ne pas fonctionner comme prévu sur cette page. Nous vous recommandons vivement de désactiver l'extension en utilisant le bouton ci-dessous."
|
||||||
|
},
|
||||||
|
"popup_bannerUpdateAvailable": {
|
||||||
|
"message": "Mise à jour disponible. Veuillez installer la dernière version pour résoudre les problèmes connus avant d'en signaler de nouveaux"
|
||||||
|
},
|
||||||
"popup_contributeOption": {
|
"popup_contributeOption": {
|
||||||
"message": "Contribuer à ce projet"
|
"message": "Contribuer à ce projet"
|
||||||
},
|
},
|
||||||
@ -47,28 +56,37 @@
|
|||||||
"popup_rateOption": {
|
"popup_rateOption": {
|
||||||
"message": "Évaluer cette extension"
|
"message": "Évaluer cette extension"
|
||||||
},
|
},
|
||||||
"reportDialog_bodyText": {
|
"report_bodyText": {
|
||||||
"message": "Veuillez ne pas partager d'informations personnelles dans ce rapport. Si vous souhaitez ajouter plus de détails, ouvrez le problème GitHub à l'étape suivante et ajoutez un commentaire."
|
"message": "Veuillez ne pas partager d'informations personnelles dans ce rapport. Si vous souhaitez ajouter plus de détails, ouvrez le problème GitHub à l'étape suivante et ajoutez un commentaire."
|
||||||
},
|
},
|
||||||
"reportDialog_reasonInputError": {
|
"report_cancelButtonText": {
|
||||||
|
"message": "Annuler"
|
||||||
|
},
|
||||||
|
"report_reasonInputError": {
|
||||||
"message": "Veuillez entrer une raison d'au moins 10 caractères et de pas plus de 1000 caractères"
|
"message": "Veuillez entrer une raison d'au moins 10 caractères et de pas plus de 1000 caractères"
|
||||||
},
|
},
|
||||||
"reportDialog_reasonInputLabel": {
|
"report_reasonInputLabel": {
|
||||||
"message": "Raison"
|
"message": "Raison"
|
||||||
},
|
},
|
||||||
"reportDialog_reasonInputPlaceholder": {
|
"report_reasonInputPlaceholder": {
|
||||||
"message": "Le popup est apparu"
|
"message": "Le popup est apparu"
|
||||||
},
|
},
|
||||||
"reportDialog_submitExtraText": {
|
"report_submitErrorExtraText": {
|
||||||
|
"message": "Il semble qu'un problème soit déjà ouvert ou marqué comme 'ne sera pas corrigé'. Veuillez entrer dans le problème pour ajouter plus d'informations en utilisant le bouton suivant."
|
||||||
|
},
|
||||||
|
"report_submitErrorText": {
|
||||||
|
"message": "Rapport non envoyé?"
|
||||||
|
},
|
||||||
|
"report_submitSuccessExtraText": {
|
||||||
"message": "Pendant que nous travaillons sur ce point, vous pouvez ajouter ce site web à la liste d'exclusion dans les paramètres de l'extension ou simplement désactiver l'extension pour ce site web en cliquant sur l'icône de l'extension dans la barre d'outils de votre navigateur."
|
"message": "Pendant que nous travaillons sur ce point, vous pouvez ajouter ce site web à la liste d'exclusion dans les paramètres de l'extension ou simplement désactiver l'extension pour ce site web en cliquant sur l'icône de l'extension dans la barre d'outils de votre navigateur."
|
||||||
},
|
},
|
||||||
"reportDialog_submitText": {
|
"report_submitSuccessText": {
|
||||||
"message": "Rapport envoyé!"
|
"message": "Rapport envoyé!"
|
||||||
},
|
},
|
||||||
"reportDialog_urlInputError": {
|
"report_urlInputError": {
|
||||||
"message": "Veuillez entrer une URL valide de pas plus de 1000 caractères"
|
"message": "Veuillez entrer une URL valide de pas plus de 1000 caractères"
|
||||||
},
|
},
|
||||||
"reportDialog_urlInputLabel": {
|
"report_urlInputLabel": {
|
||||||
"message": "URL"
|
"message": "URL"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -32,6 +32,15 @@
|
|||||||
"options_importButton": {
|
"options_importButton": {
|
||||||
"message": "Importa lista"
|
"message": "Importa lista"
|
||||||
},
|
},
|
||||||
|
"popup_bannerIssueOpen": {
|
||||||
|
"message": "È stato segnalato un problema per questa pagina. L'estensione potrebbe non funzionare temporaneamente come previsto. Segui il problema o aggiungi ulteriori informazioni."
|
||||||
|
},
|
||||||
|
"popup_bannerIssueWontFix": {
|
||||||
|
"message": "È stato segnalato un problema per questa pagina, ma non verrà risolto. Si prega di notare che l'estensione potrebbe non funzionare come previsto su questa pagina. Si consiglia vivamente di disattivare l'estensione utilizzando il pulsante qui sotto."
|
||||||
|
},
|
||||||
|
"popup_bannerUpdateAvailable": {
|
||||||
|
"message": "Aggiornamento disponibile. Si prega di installare l'ultima versione per risolvere i problemi noti prima di segnalarne di nuovi"
|
||||||
|
},
|
||||||
"popup_contributeOption": {
|
"popup_contributeOption": {
|
||||||
"message": "Contribuisci a questo progetto"
|
"message": "Contribuisci a questo progetto"
|
||||||
},
|
},
|
||||||
@ -47,28 +56,37 @@
|
|||||||
"popup_rateOption": {
|
"popup_rateOption": {
|
||||||
"message": "Valuta questa estensione"
|
"message": "Valuta questa estensione"
|
||||||
},
|
},
|
||||||
"reportDialog_bodyText": {
|
"report_bodyText": {
|
||||||
"message": "Per favore, non condividere informazioni personali in questo rapporto. Se vuoi aggiungere più dettagli, apri il problema su GitHub nel passaggio successivo e aggiungi un commento."
|
"message": "Per favore, non condividere informazioni personali in questo rapporto. Se vuoi aggiungere più dettagli, apri il problema su GitHub nel passaggio successivo e aggiungi un commento."
|
||||||
},
|
},
|
||||||
"reportDialog_reasonInputError": {
|
"report_cancelButtonText": {
|
||||||
|
"message": "Annulla"
|
||||||
|
},
|
||||||
|
"report_reasonInputError": {
|
||||||
"message": "Inserisci una motivazione con almeno 10 caratteri e non più di 1000 caratteri"
|
"message": "Inserisci una motivazione con almeno 10 caratteri e non più di 1000 caratteri"
|
||||||
},
|
},
|
||||||
"reportDialog_reasonInputLabel": {
|
"report_reasonInputLabel": {
|
||||||
"message": "Motivo"
|
"message": "Motivo"
|
||||||
},
|
},
|
||||||
"reportDialog_reasonInputPlaceholder": {
|
"report_reasonInputPlaceholder": {
|
||||||
"message": "Popup apparso"
|
"message": "Popup apparso"
|
||||||
},
|
},
|
||||||
"reportDialog_submitExtraText": {
|
"report_submitErrorExtraText": {
|
||||||
|
"message": "Sembra che ci sia già un problema aperto o contrassegnato come 'non risolvibile'. Per favore, entra nel problema per aggiungere ulteriori informazioni usando il pulsante seguente."
|
||||||
|
},
|
||||||
|
"report_submitErrorText": {
|
||||||
|
"message": "Segnalazione non inviata?"
|
||||||
|
},
|
||||||
|
"report_submitSuccessExtraText": {
|
||||||
"message": "Mentre lavoriamo su questo, puoi aggiungere questo sito web alla lista di esclusione nelle impostazioni dell'estensione o semplicemente disattivare l'estensione per questo sito web cliccando sull'icona dell'estensione nella barra degli strumenti del browser."
|
"message": "Mentre lavoriamo su questo, puoi aggiungere questo sito web alla lista di esclusione nelle impostazioni dell'estensione o semplicemente disattivare l'estensione per questo sito web cliccando sull'icona dell'estensione nella barra degli strumenti del browser."
|
||||||
},
|
},
|
||||||
"reportDialog_submitText": {
|
"report_submitSuccessText": {
|
||||||
"message": "Rapporto inviato!"
|
"message": "Rapporto inviato!"
|
||||||
},
|
},
|
||||||
"reportDialog_urlInputError": {
|
"report_urlInputError": {
|
||||||
"message": "Inserisci un URL valido con non più di 1000 caratteri"
|
"message": "Inserisci un URL valido con non più di 1000 caratteri"
|
||||||
},
|
},
|
||||||
"reportDialog_urlInputLabel": {
|
"report_urlInputLabel": {
|
||||||
"message": "URL"
|
"message": "URL"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -32,6 +32,15 @@
|
|||||||
"options_importButton": {
|
"options_importButton": {
|
||||||
"message": "Importuj listę"
|
"message": "Importuj listę"
|
||||||
},
|
},
|
||||||
|
"popup_bannerIssueOpen": {
|
||||||
|
"message": "Zgłoszono problem z tą stroną. Rozszerzenie może tymczasowo nie działać zgodnie z oczekiwaniami. Śledź problem lub dodaj więcej informacji."
|
||||||
|
},
|
||||||
|
"popup_bannerIssueWontFix": {
|
||||||
|
"message": "Zgłoszono problem z tą stroną, ale nie zostanie on naprawiony. Należy pamiętać, że rozszerzenie może nie działać zgodnie z oczekiwaniami na tej stronie. Zdecydowanie zalecamy wyłączenie rozszerzenia za pomocą poniższego przycisku."
|
||||||
|
},
|
||||||
|
"popup_bannerUpdateAvailable": {
|
||||||
|
"message": "Dostępna aktualizacja. Zainstaluj najnowszą wersję, aby rozwiązać znane problemy przed zgłoszeniem nowych"
|
||||||
|
},
|
||||||
"popup_contributeOption": {
|
"popup_contributeOption": {
|
||||||
"message": "Wesprzyj ten projekt"
|
"message": "Wesprzyj ten projekt"
|
||||||
},
|
},
|
||||||
@ -47,28 +56,37 @@
|
|||||||
"popup_rateOption": {
|
"popup_rateOption": {
|
||||||
"message": "Oceń to rozszerzenie"
|
"message": "Oceń to rozszerzenie"
|
||||||
},
|
},
|
||||||
"reportDialog_bodyText": {
|
"report_bodyText": {
|
||||||
"message": "Prosimy, nie udostępniaj żadnych danych osobowych w tym raporcie. Jeśli chcesz dodać więcej szczegółów, otwórz zgłoszenie na GitHub w następnym kroku i dodaj komentarz."
|
"message": "Prosimy, nie udostępniaj żadnych danych osobowych w tym raporcie. Jeśli chcesz dodać więcej szczegółów, otwórz zgłoszenie na GitHub w następnym kroku i dodaj komentarz."
|
||||||
},
|
},
|
||||||
"reportDialog_reasonInputError": {
|
"report_cancelButtonText": {
|
||||||
|
"message": "Anuluj"
|
||||||
|
},
|
||||||
|
"report_reasonInputError": {
|
||||||
"message": "Proszę podać powód zawierający co najmniej 10 znaków i nie więcej niż 1000 znaków"
|
"message": "Proszę podać powód zawierający co najmniej 10 znaków i nie więcej niż 1000 znaków"
|
||||||
},
|
},
|
||||||
"reportDialog_reasonInputLabel": {
|
"report_reasonInputLabel": {
|
||||||
"message": "Powód"
|
"message": "Powód"
|
||||||
},
|
},
|
||||||
"reportDialog_reasonInputPlaceholder": {
|
"report_reasonInputPlaceholder": {
|
||||||
"message": "Pojawił się popup"
|
"message": "Pojawił się popup"
|
||||||
},
|
},
|
||||||
"reportDialog_submitExtraText": {
|
"report_submitErrorExtraText": {
|
||||||
|
"message": "Wygląda na to, że istnieje już otwarte zgłoszenie lub zostało oznaczone jako 'nie do rozwiązania'. Wprowadź zgłoszenie, aby dodać więcej informacji, używając poniższego przycisku."
|
||||||
|
},
|
||||||
|
"report_submitErrorText": {
|
||||||
|
"message": "Raport nie został wysłany?"
|
||||||
|
},
|
||||||
|
"report_submitSuccessExtraText": {
|
||||||
"message": "Podczas gdy nad tym pracujemy, możesz dodać tę stronę do listy wykluczeń w ustawieniach rozszerzenia lub po prostu wyłączyć rozszerzenie dla tej strony, klikając ikonę rozszerzenia na pasku narzędzi przeglądarki."
|
"message": "Podczas gdy nad tym pracujemy, możesz dodać tę stronę do listy wykluczeń w ustawieniach rozszerzenia lub po prostu wyłączyć rozszerzenie dla tej strony, klikając ikonę rozszerzenia na pasku narzędzi przeglądarki."
|
||||||
},
|
},
|
||||||
"reportDialog_submitText": {
|
"report_submitSuccessText": {
|
||||||
"message": "Zgłoszenie wysłane!"
|
"message": "Zgłoszenie wysłane!"
|
||||||
},
|
},
|
||||||
"reportDialog_urlInputError": {
|
"report_urlInputError": {
|
||||||
"message": "Proszę wprowadzić prawidłowy URL zawierający nie więcej niż 1000 znaków"
|
"message": "Proszę wprowadzić prawidłowy URL zawierający nie więcej niż 1000 znaków"
|
||||||
},
|
},
|
||||||
"reportDialog_urlInputLabel": {
|
"report_urlInputLabel": {
|
||||||
"message": "URL"
|
"message": "URL"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -32,6 +32,15 @@
|
|||||||
"options_importButton": {
|
"options_importButton": {
|
||||||
"message": "Importar lista"
|
"message": "Importar lista"
|
||||||
},
|
},
|
||||||
|
"popup_bannerIssueOpen": {
|
||||||
|
"message": "Um problema foi relatado para esta página. A extensão pode não funcionar conforme o esperado temporariamente. Acompanhe o problema ou adicione mais informações."
|
||||||
|
},
|
||||||
|
"popup_bannerIssueWontFix": {
|
||||||
|
"message": "Um problema foi relatado para esta página, mas não será corrigido. Esteja ciente de que a extensão pode não funcionar conforme o esperado nesta página. Recomendamos desativar a extensão usando o botão abaixo."
|
||||||
|
},
|
||||||
|
"popup_bannerUpdateAvailable": {
|
||||||
|
"message": "Atualização disponível. Por favor, instale a versão mais recente para corrigir problemas conhecidos antes de relatar novos"
|
||||||
|
},
|
||||||
"popup_contributeOption": {
|
"popup_contributeOption": {
|
||||||
"message": "Contribuir para este projeto"
|
"message": "Contribuir para este projeto"
|
||||||
},
|
},
|
||||||
@ -47,28 +56,37 @@
|
|||||||
"popup_rateOption": {
|
"popup_rateOption": {
|
||||||
"message": "Avalie esta extensão"
|
"message": "Avalie esta extensão"
|
||||||
},
|
},
|
||||||
"reportDialog_bodyText": {
|
"report_bodyText": {
|
||||||
"message": "Por favor, não compartilhe nenhuma informação pessoal neste relatório. Se você quiser adicionar mais detalhes, abra o problema no GitHub na próxima etapa e adicione um comentário."
|
"message": "Por favor, não compartilhe nenhuma informação pessoal neste relatório. Se você quiser adicionar mais detalhes, abra o problema no GitHub na próxima etapa e adicione um comentário."
|
||||||
},
|
},
|
||||||
"reportDialog_reasonInputError": {
|
"report_cancelButtonText": {
|
||||||
|
"message": "Cancelar"
|
||||||
|
},
|
||||||
|
"report_reasonInputError": {
|
||||||
"message": "Por favor, insira um motivo com pelo menos 10 caracteres e no máximo 1000 caracteres"
|
"message": "Por favor, insira um motivo com pelo menos 10 caracteres e no máximo 1000 caracteres"
|
||||||
},
|
},
|
||||||
"reportDialog_reasonInputLabel": {
|
"report_reasonInputLabel": {
|
||||||
"message": "Motivo"
|
"message": "Motivo"
|
||||||
},
|
},
|
||||||
"reportDialog_reasonInputPlaceholder": {
|
"report_reasonInputPlaceholder": {
|
||||||
"message": "Popup apareceu"
|
"message": "Popup apareceu"
|
||||||
},
|
},
|
||||||
"reportDialog_submitExtraText": {
|
"report_submitErrorExtraText": {
|
||||||
|
"message": "Parece que já existe um problema aberto ou marcado como 'não corrigido'. Por favor, acesse o problema para adicionar mais informações usando o botão a seguir."
|
||||||
|
},
|
||||||
|
"report_submitErrorText": {
|
||||||
|
"message": "Relatório não enviado?"
|
||||||
|
},
|
||||||
|
"report_submitSuccessExtraText": {
|
||||||
"message": "Enquanto estamos trabalhando nisso, você pode adicionar este site à lista de exclusão nas configurações da extensão ou simplesmente desativar a extensão para este site clicando no ícone da extensão na barra de ferramentas do navegador."
|
"message": "Enquanto estamos trabalhando nisso, você pode adicionar este site à lista de exclusão nas configurações da extensão ou simplesmente desativar a extensão para este site clicando no ícone da extensão na barra de ferramentas do navegador."
|
||||||
},
|
},
|
||||||
"reportDialog_submitText": {
|
"report_submitSuccessText": {
|
||||||
"message": "Relatório enviado!"
|
"message": "Relatório enviado!"
|
||||||
},
|
},
|
||||||
"reportDialog_urlInputError": {
|
"report_urlInputError": {
|
||||||
"message": "Por favor, insira uma URL válida com no máximo 1000 caracteres"
|
"message": "Por favor, insira uma URL válida com no máximo 1000 caracteres"
|
||||||
},
|
},
|
||||||
"reportDialog_urlInputLabel": {
|
"report_urlInputLabel": {
|
||||||
"message": "URL"
|
"message": "URL"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -32,6 +32,15 @@
|
|||||||
"options_importButton": {
|
"options_importButton": {
|
||||||
"message": "Importar lista"
|
"message": "Importar lista"
|
||||||
},
|
},
|
||||||
|
"popup_bannerIssueOpen": {
|
||||||
|
"message": "Foi relatado um problema para esta página. A extensão pode não funcionar conforme o esperado temporariamente. Siga o problema ou adicione mais informações."
|
||||||
|
},
|
||||||
|
"popup_bannerIssueWontFix": {
|
||||||
|
"message": "Foi relatado um problema para esta página, mas não será resolvido. Esteja ciente de que a extensão pode não funcionar conforme o esperado nesta página. Recomendamos desativar a extensão usando o botão abaixo."
|
||||||
|
},
|
||||||
|
"popup_bannerUpdateAvailable": {
|
||||||
|
"message": "Atualização disponível. Por favor, instale a versão mais recente para resolver problemas conhecidos antes de relatar novos"
|
||||||
|
},
|
||||||
"popup_contributeOption": {
|
"popup_contributeOption": {
|
||||||
"message": "Contribuir para este projeto"
|
"message": "Contribuir para este projeto"
|
||||||
},
|
},
|
||||||
@ -47,28 +56,37 @@
|
|||||||
"popup_rateOption": {
|
"popup_rateOption": {
|
||||||
"message": "Avalie esta extensão"
|
"message": "Avalie esta extensão"
|
||||||
},
|
},
|
||||||
"reportDialog_bodyText": {
|
"report_bodyText": {
|
||||||
"message": "Por favor, não partilhe nenhuma informação pessoal neste relatório. Se quiser adicionar mais detalhes, abra o problema no GitHub na próxima etapa e adicione um comentário."
|
"message": "Por favor, não partilhe nenhuma informação pessoal neste relatório. Se quiser adicionar mais detalhes, abra o problema no GitHub na próxima etapa e adicione um comentário."
|
||||||
},
|
},
|
||||||
"reportDialog_reasonInputError": {
|
"report_cancelButtonText": {
|
||||||
|
"message": "Cancelar"
|
||||||
|
},
|
||||||
|
"report_reasonInputError": {
|
||||||
"message": "Por favor, insira um motivo com pelo menos 10 caracteres e no máximo 1000 caracteres"
|
"message": "Por favor, insira um motivo com pelo menos 10 caracteres e no máximo 1000 caracteres"
|
||||||
},
|
},
|
||||||
"reportDialog_reasonInputLabel": {
|
"report_reasonInputLabel": {
|
||||||
"message": "Motivo"
|
"message": "Motivo"
|
||||||
},
|
},
|
||||||
"reportDialog_reasonInputPlaceholder": {
|
"report_reasonInputPlaceholder": {
|
||||||
"message": "Popup apareceu"
|
"message": "Popup apareceu"
|
||||||
},
|
},
|
||||||
"reportDialog_submitExtraText": {
|
"report_submitErrorExtraText": {
|
||||||
|
"message": "Parece que já existe um problema aberto ou marcado como 'não corrigido'. Por favor, aceda ao problema para adicionar mais informações usando o botão seguinte."
|
||||||
|
},
|
||||||
|
"report_submitErrorText": {
|
||||||
|
"message": "Relatório não enviado?"
|
||||||
|
},
|
||||||
|
"report_submitSuccessExtraText": {
|
||||||
"message": "Enquanto trabalhamos nisso, pode adicionar este site à lista de exclusão nas definições da extensão ou simplesmente desativar a extensão para este site clicando no ícone da extensão na barra de ferramentas do navegador."
|
"message": "Enquanto trabalhamos nisso, pode adicionar este site à lista de exclusão nas definições da extensão ou simplesmente desativar a extensão para este site clicando no ícone da extensão na barra de ferramentas do navegador."
|
||||||
},
|
},
|
||||||
"reportDialog_submitText": {
|
"report_submitSuccessText": {
|
||||||
"message": "Relatório enviado!"
|
"message": "Relatório enviado!"
|
||||||
},
|
},
|
||||||
"reportDialog_urlInputError": {
|
"report_urlInputError": {
|
||||||
"message": "Por favor, insira uma URL válida com no máximo 1000 caracteres"
|
"message": "Por favor, insira uma URL válida com no máximo 1000 caracteres"
|
||||||
},
|
},
|
||||||
"reportDialog_urlInputLabel": {
|
"report_urlInputLabel": {
|
||||||
"message": "URL"
|
"message": "URL"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -32,6 +32,15 @@
|
|||||||
"options_importButton": {
|
"options_importButton": {
|
||||||
"message": "Importă lista"
|
"message": "Importă lista"
|
||||||
},
|
},
|
||||||
|
"popup_bannerIssueOpen": {
|
||||||
|
"message": "A fost raportată o problemă pentru această pagină. Extensia poate să nu funcționeze temporar conform așteptărilor. Urmăriți problema sau adăugați mai multe informații."
|
||||||
|
},
|
||||||
|
"popup_bannerIssueWontFix": {
|
||||||
|
"message": "A fost raportată o problemă pentru această pagină, dar nu va fi rezolvată. Rețineți că extensia poate să nu funcționeze conform așteptărilor pe această pagină. Vă recomandăm cu insistență să dezactivați extensia folosind butonul de mai jos."
|
||||||
|
},
|
||||||
|
"popup_bannerUpdateAvailable": {
|
||||||
|
"message": "Actualizare disponibilă. Vă rugăm să instalați cea mai recentă versiune pentru a rezolva problemele cunoscute înainte de a raporta altele noi."
|
||||||
|
},
|
||||||
"popup_contributeOption": {
|
"popup_contributeOption": {
|
||||||
"message": "Contribuie la acest proiect"
|
"message": "Contribuie la acest proiect"
|
||||||
},
|
},
|
||||||
@ -47,28 +56,37 @@
|
|||||||
"popup_rateOption": {
|
"popup_rateOption": {
|
||||||
"message": "Evaluează această extensie"
|
"message": "Evaluează această extensie"
|
||||||
},
|
},
|
||||||
"reportDialog_bodyText": {
|
"report_bodyText": {
|
||||||
"message": "Te rugăm să nu împărtășești informații personale în acest raport. Dacă dorești să adaugi mai multe detalii, deschide problema GitHub în pasul următor și adaugă un comentariu."
|
"message": "Te rugăm să nu împărtășești informații personale în acest raport. Dacă dorești să adaugi mai multe detalii, deschide problema GitHub în pasul următor și adaugă un comentariu."
|
||||||
},
|
},
|
||||||
"reportDialog_reasonInputError": {
|
"report_cancelButtonText": {
|
||||||
|
"message": "Anulează"
|
||||||
|
},
|
||||||
|
"report_reasonInputError": {
|
||||||
"message": "Vă rugăm să introduceți un motiv cu cel puțin 10 caractere și maximum 1000 de caractere"
|
"message": "Vă rugăm să introduceți un motiv cu cel puțin 10 caractere și maximum 1000 de caractere"
|
||||||
},
|
},
|
||||||
"reportDialog_reasonInputLabel": {
|
"report_reasonInputLabel": {
|
||||||
"message": "Motiv"
|
"message": "Motiv"
|
||||||
},
|
},
|
||||||
"reportDialog_reasonInputPlaceholder": {
|
"report_reasonInputPlaceholder": {
|
||||||
"message": "A apărut un popup"
|
"message": "A apărut un popup"
|
||||||
},
|
},
|
||||||
"reportDialog_submitExtraText": {
|
"report_submitErrorExtraText": {
|
||||||
|
"message": "Se pare că există deja o problemă deschisă sau marcată ca 'nu va fi rezolvată'. Vă rugăm să intrați în problemă pentru a adăuga mai multe informații folosind butonul de mai jos."
|
||||||
|
},
|
||||||
|
"report_submitErrorText": {
|
||||||
|
"message": "Raportul nu a fost trimis?"
|
||||||
|
},
|
||||||
|
"report_submitSuccessExtraText": {
|
||||||
"message": "În timp ce lucrăm la acest aspect, poți adăuga acest site web la lista de excludere din setările extensiei sau poți dezactiva extensia pentru acest site web făcând clic pe pictograma extensiei din bara de instrumente a browserului."
|
"message": "În timp ce lucrăm la acest aspect, poți adăuga acest site web la lista de excludere din setările extensiei sau poți dezactiva extensia pentru acest site web făcând clic pe pictograma extensiei din bara de instrumente a browserului."
|
||||||
},
|
},
|
||||||
"reportDialog_submitText": {
|
"report_submitSuccessText": {
|
||||||
"message": "Raport trimis!"
|
"message": "Raport trimis!"
|
||||||
},
|
},
|
||||||
"reportDialog_urlInputError": {
|
"report_urlInputError": {
|
||||||
"message": "Vă rugăm să introduceți o adresă URL validă cu maximum 1000 de caractere"
|
"message": "Vă rugăm să introduceți o adresă URL validă cu maximum 1000 de caractere"
|
||||||
},
|
},
|
||||||
"reportDialog_urlInputLabel": {
|
"report_urlInputLabel": {
|
||||||
"message": "URL"
|
"message": "URL"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -32,6 +32,15 @@
|
|||||||
"options_importButton": {
|
"options_importButton": {
|
||||||
"message": "Импорт списка"
|
"message": "Импорт списка"
|
||||||
},
|
},
|
||||||
|
"popup_bannerIssueOpen": {
|
||||||
|
"message": "Для этой страницы было сообщено о проблеме. Расширение может временно не работать должным образом. Следите за проблемой или добавьте дополнительную информацию."
|
||||||
|
},
|
||||||
|
"popup_bannerIssueWontFix": {
|
||||||
|
"message": "Для этой страницы было сообщено о проблеме, но она не будет исправлена. Обратите внимание, что расширение может работать некорректно на этой странице. Мы настоятельно рекомендуем отключить расширение, используя кнопку ниже."
|
||||||
|
},
|
||||||
|
"popup_bannerUpdateAvailable": {
|
||||||
|
"message": "Доступно обновление. Установите последнюю версию, чтобы устранить известные проблемы перед отправкой новых отчётов."
|
||||||
|
},
|
||||||
"popup_contributeOption": {
|
"popup_contributeOption": {
|
||||||
"message": "Содействовать этому проекту"
|
"message": "Содействовать этому проекту"
|
||||||
},
|
},
|
||||||
@ -47,28 +56,37 @@
|
|||||||
"popup_rateOption": {
|
"popup_rateOption": {
|
||||||
"message": "Оцените это расширение"
|
"message": "Оцените это расширение"
|
||||||
},
|
},
|
||||||
"reportDialog_bodyText": {
|
"report_bodyText": {
|
||||||
"message": "Пожалуйста, не делитесь личной информацией в этом отчете. Если вы хотите добавить больше деталей, откройте вопрос на GitHub на следующем шаге и добавьте комментарий."
|
"message": "Пожалуйста, не делитесь личной информацией в этом отчете. Если вы хотите добавить больше деталей, откройте вопрос на GitHub на следующем шаге и добавьте комментарий."
|
||||||
},
|
},
|
||||||
"reportDialog_reasonInputError": {
|
"report_cancelButtonText": {
|
||||||
|
"message": "Отмена"
|
||||||
|
},
|
||||||
|
"report_reasonInputError": {
|
||||||
"message": "Пожалуйста, введите причину длиной не менее 10 и не более 1000 символов"
|
"message": "Пожалуйста, введите причину длиной не менее 10 и не более 1000 символов"
|
||||||
},
|
},
|
||||||
"reportDialog_reasonInputLabel": {
|
"report_reasonInputLabel": {
|
||||||
"message": "Причина"
|
"message": "Причина"
|
||||||
},
|
},
|
||||||
"reportDialog_reasonInputPlaceholder": {
|
"report_reasonInputPlaceholder": {
|
||||||
"message": "Появилось всплывающее окно"
|
"message": "Появилось всплывающее окно"
|
||||||
},
|
},
|
||||||
"reportDialog_submitExtraText": {
|
"report_submitErrorExtraText": {
|
||||||
|
"message": "Похоже, что уже существует открытая проблема или она помечена как 'не будет исправлено'. Пожалуйста, войдите в проблему, чтобы добавить больше информации, используя следующую кнопку."
|
||||||
|
},
|
||||||
|
"report_submitErrorText": {
|
||||||
|
"message": "Отчет не отправлен?"
|
||||||
|
},
|
||||||
|
"report_submitSuccessExtraText": {
|
||||||
"message": "Пока мы работаем над этим, вы можете добавить этот сайт в список исключений в настройках расширения или просто отключить расширение для этого сайта, нажав на значок расширения на панели инструментов вашего браузера."
|
"message": "Пока мы работаем над этим, вы можете добавить этот сайт в список исключений в настройках расширения или просто отключить расширение для этого сайта, нажав на значок расширения на панели инструментов вашего браузера."
|
||||||
},
|
},
|
||||||
"reportDialog_submitText": {
|
"report_submitSuccessText": {
|
||||||
"message": "Отчет отправлен!"
|
"message": "Отчет отправлен!"
|
||||||
},
|
},
|
||||||
"reportDialog_urlInputError": {
|
"report_urlInputError": {
|
||||||
"message": "Пожалуйста, введите корректный URL длиной не более 1000 символов"
|
"message": "Пожалуйста, введите корректный URL длиной не более 1000 символов"
|
||||||
},
|
},
|
||||||
"reportDialog_urlInputLabel": {
|
"report_urlInputLabel": {
|
||||||
"message": "URL"
|
"message": "URL"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Before Width: | Height: | Size: 2.4 KiB After Width: | Height: | Size: 2.4 KiB |
Before Width: | Height: | Size: 1.8 KiB After Width: | Height: | Size: 1.8 KiB |
BIN
packages/browser-extension/src/assets/icons/warn.png
Normal file
After Width: | Height: | Size: 1.5 KiB |
@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"manifest_version": 3,
|
"manifest_version": 3,
|
||||||
"name": "Cookie Dialog Monster",
|
"name": "Cookie Dialog Monster",
|
||||||
"version": "7.3.2",
|
"version": "8.0.0",
|
||||||
"default_locale": "en",
|
"default_locale": "en",
|
||||||
"description": "__MSG_appDesc__",
|
"description": "__MSG_appDesc__",
|
||||||
"icons": {
|
"icons": {
|
||||||
@ -10,7 +10,7 @@
|
|||||||
"128": "assets/icons/128.png"
|
"128": "assets/icons/128.png"
|
||||||
},
|
},
|
||||||
"action": {
|
"action": {
|
||||||
"default_icon": "assets/icons/disabled.png",
|
"default_icon": "assets/icons/off.png",
|
||||||
"default_title": "Cookie Dialog Monster"
|
"default_title": "Cookie Dialog Monster"
|
||||||
},
|
},
|
||||||
"options_page": "options.html",
|
"options_page": "options.html",
|
||||||
@ -51,7 +51,7 @@
|
|||||||
"*://translate.google.it/*",
|
"*://translate.google.it/*",
|
||||||
"*://www.cookie-dialog-monster.com/*"
|
"*://www.cookie-dialog-monster.com/*"
|
||||||
],
|
],
|
||||||
"js": ["scripts/content.js", "scripts/dialog.js"],
|
"js": ["scripts/content.js"],
|
||||||
"matches": ["http://*/*", "https://*/*"],
|
"matches": ["http://*/*", "https://*/*"],
|
||||||
"run_at": "document_start"
|
"run_at": "document_start"
|
||||||
}
|
}
|
||||||
|
@ -1,6 +1,8 @@
|
|||||||
|
<!doctype html>
|
||||||
<html lang="en">
|
<html lang="en">
|
||||||
<head>
|
<head>
|
||||||
<meta charset="UTF-8" />
|
<meta charset="UTF-8" />
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||||||
<title>Cookie Dialog Monster > Exclusion List</title>
|
<title>Cookie Dialog Monster > Exclusion List</title>
|
||||||
<link rel="stylesheet" href="/styles/reset.css" />
|
<link rel="stylesheet" href="/styles/reset.css" />
|
||||||
<link rel="stylesheet" href="/styles/options.css" />
|
<link rel="stylesheet" href="/styles/options.css" />
|
||||||
|
@ -1,6 +1,8 @@
|
|||||||
|
<!doctype html>
|
||||||
<html>
|
<html>
|
||||||
<head>
|
<head>
|
||||||
<meta charset="UTF-8" />
|
<meta charset="UTF-8" />
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||||||
<link rel="stylesheet" href="/styles/reset.css" />
|
<link rel="stylesheet" href="/styles/reset.css" />
|
||||||
<link rel="stylesheet" href="/styles/popup.css" />
|
<link rel="stylesheet" href="/styles/popup.css" />
|
||||||
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Inter" />
|
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Inter" />
|
||||||
@ -9,149 +11,317 @@
|
|||||||
<body>
|
<body>
|
||||||
<header>
|
<header>
|
||||||
<h1 class="header-title">Cookie Dialog Monster</h1>
|
<h1 class="header-title">Cookie Dialog Monster</h1>
|
||||||
<button id="settings-button">
|
<div class="header-actions">
|
||||||
<svg
|
<button disabled id="report-button">
|
||||||
aria-hidden="true"
|
<svg
|
||||||
fill="none"
|
aria-hidden="true"
|
||||||
height="18"
|
fill="none"
|
||||||
stroke-linecap="round"
|
height="18"
|
||||||
stroke-linejoin="round"
|
stroke-linecap="round"
|
||||||
stroke-width="2"
|
stroke-linejoin="round"
|
||||||
stroke="currentColor"
|
stroke-width="2"
|
||||||
viewBox="0 0 24 24"
|
stroke="currentColor"
|
||||||
width="18"
|
viewBox="0 0 24 24"
|
||||||
>
|
width="18"
|
||||||
<circle cx="12" cy="12" r="3"></circle>
|
>
|
||||||
<path
|
<path d="M4 15s1-1 4-1 5 2 8 2 4-1 4-1V3s-1 1-4 1-5-2-8-2-4 1-4 1z"></path>
|
||||||
d="M19.4 15a1.65 1.65 0 0 0 .33 1.82l.06.06a2 2 0 0 1 0 2.83 2 2 0 0 1-2.83 0l-.06-.06a1.65 1.65 0 0 0-1.82-.33 1.65 1.65 0 0 0-1 1.51V21a2 2 0 0 1-2 2 2 2 0 0 1-2-2v-.09A1.65 1.65 0 0 0 9 19.4a1.65 1.65 0 0 0-1.82.33l-.06.06a2 2 0 0 1-2.83 0 2 2 0 0 1 0-2.83l.06-.06a1.65 1.65 0 0 0 .33-1.82 1.65 1.65 0 0 0-1.51-1H3a2 2 0 0 1-2-2 2 2 0 0 1 2-2h.09A1.65 1.65 0 0 0 4.6 9a1.65 1.65 0 0 0-.33-1.82l-.06-.06a2 2 0 0 1 0-2.83 2 2 0 0 1 2.83 0l.06.06a1.65 1.65 0 0 0 1.82.33H9a1.65 1.65 0 0 0 1-1.51V3a2 2 0 0 1 2-2 2 2 0 0 1 2 2v.09a1.65 1.65 0 0 0 1 1.51 1.65 1.65 0 0 0 1.82-.33l.06-.06a2 2 0 0 1 2.83 0 2 2 0 0 1 0 2.83l-.06.06a1.65 1.65 0 0 0-.33 1.82V9a1.65 1.65 0 0 0 1.51 1H21a2 2 0 0 1 2 2 2 2 0 0 1-2 2h-.09a1.65 1.65 0 0 0-1.51 1z"
|
<line x1="4" y1="22" x2="4" y2="15"></line>
|
||||||
/>
|
</svg>
|
||||||
</svg>
|
</button>
|
||||||
</button>
|
<button id="settings-button">
|
||||||
|
<svg
|
||||||
|
aria-hidden="true"
|
||||||
|
fill="none"
|
||||||
|
height="18"
|
||||||
|
stroke-linecap="round"
|
||||||
|
stroke-linejoin="round"
|
||||||
|
stroke-width="2"
|
||||||
|
stroke="currentColor"
|
||||||
|
viewBox="0 0 24 24"
|
||||||
|
width="18"
|
||||||
|
>
|
||||||
|
<circle cx="12" cy="12" r="3"></circle>
|
||||||
|
<path
|
||||||
|
d="M19.4 15a1.65 1.65 0 0 0 .33 1.82l.06.06a2 2 0 0 1 0 2.83 2 2 0 0 1-2.83 0l-.06-.06a1.65 1.65 0 0 0-1.82-.33 1.65 1.65 0 0 0-1 1.51V21a2 2 0 0 1-2 2 2 2 0 0 1-2-2v-.09A1.65 1.65 0 0 0 9 19.4a1.65 1.65 0 0 0-1.82.33l-.06.06a2 2 0 0 1-2.83 0 2 2 0 0 1 0-2.83l.06-.06a1.65 1.65 0 0 0 .33-1.82 1.65 1.65 0 0 0-1.51-1H3a2 2 0 0 1-2-2 2 2 0 0 1 2-2h.09A1.65 1.65 0 0 0 4.6 9a1.65 1.65 0 0 0-.33-1.82l-.06-.06a2 2 0 0 1 0-2.83 2 2 0 0 1 2.83 0l.06.06a1.65 1.65 0 0 0 1.82.33H9a1.65 1.65 0 0 0 1-1.51V3a2 2 0 0 1 2-2 2 2 0 0 1 2 2v.09a1.65 1.65 0 0 0 1 1.51 1.65 1.65 0 0 0 1.82-.33l.06-.06a2 2 0 0 1 2.83 0 2 2 0 0 1 0 2.83l-.06.06a1.65 1.65 0 0 0-.33 1.82V9a1.65 1.65 0 0 0 1.51 1H21a2 2 0 0 1 2 2 2 2 0 0 1-2 2h-.09a1.65 1.65 0 0 0-1.51 1z"
|
||||||
|
/>
|
||||||
|
</svg>
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
</header>
|
</header>
|
||||||
<main>
|
<main>
|
||||||
<popup-button id="power-option" role="button" tabindex="0">
|
<p aria-hidden="true" class="banner" data-variant="warning" id="issue-banner" role="alert">
|
||||||
<svg
|
<span id="issue-banner-text"></span>
|
||||||
aria-hidden="true"
|
<a id="issue-banner-url" target="_blank">
|
||||||
fill="none"
|
<svg
|
||||||
height="32"
|
aria-hidden="true"
|
||||||
stroke-linecap="round"
|
fill="none"
|
||||||
stroke-linejoin="round"
|
height="12"
|
||||||
stroke-width="2"
|
stroke-linecap="round"
|
||||||
stroke="currentColor"
|
stroke-linejoin="round"
|
||||||
viewBox="0 0 24 24"
|
stroke-width="2"
|
||||||
width="32"
|
stroke="currentColor"
|
||||||
|
viewBox="0 0 24 24"
|
||||||
|
width="12"
|
||||||
|
>
|
||||||
|
<path d="M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6"></path>
|
||||||
|
<polyline points="15 3 21 3 21 9"></polyline>
|
||||||
|
<line x1="10" y1="14" x2="21" y2="3"></line>
|
||||||
|
</svg>
|
||||||
|
</a>
|
||||||
|
</p>
|
||||||
|
<p aria-hidden="true" class="banner" data-variant="notice" id="update-banner" role="alert">
|
||||||
|
<span data-i18n="popup_bannerUpdateAvailable"></span>
|
||||||
|
<a
|
||||||
|
href="https://git.wanhose.dev/wanhose/cookie-dialog-monster/releases"
|
||||||
|
id="update-banner-url"
|
||||||
|
target="_blank"
|
||||||
>
|
>
|
||||||
<path d="M18.36 6.64a9 9 0 1 1-12.73 0" />
|
<svg
|
||||||
<line x1="12" y1="2" x2="12" y2="12" />
|
aria-hidden="true"
|
||||||
</svg>
|
fill="none"
|
||||||
<span id="host"></span>
|
height="12"
|
||||||
</popup-button>
|
stroke-linecap="round"
|
||||||
<popup-button data-href="mailto:hello@wanhose.dev" id="help-option" role="link" tabindex="0">
|
stroke-linejoin="round"
|
||||||
<svg
|
stroke-width="2"
|
||||||
aria-hidden="true"
|
stroke="currentColor"
|
||||||
fill="none"
|
viewBox="0 0 24 24"
|
||||||
height="32"
|
width="12"
|
||||||
stroke-linecap="round"
|
>
|
||||||
stroke-linejoin="round"
|
<path d="M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6"></path>
|
||||||
stroke-width="2"
|
<polyline points="15 3 21 3 21 9"></polyline>
|
||||||
stroke="currentColor"
|
<line x1="10" y1="14" x2="21" y2="3"></line>
|
||||||
viewBox="0 0 24 24"
|
</svg>
|
||||||
width="32"
|
</a>
|
||||||
|
</p>
|
||||||
|
<div class="content">
|
||||||
|
<popup-button id="power-option" role="button" tabindex="0">
|
||||||
|
<svg
|
||||||
|
aria-hidden="true"
|
||||||
|
fill="none"
|
||||||
|
height="32"
|
||||||
|
stroke-linecap="round"
|
||||||
|
stroke-linejoin="round"
|
||||||
|
stroke-width="2"
|
||||||
|
stroke="currentColor"
|
||||||
|
viewBox="0 0 24 24"
|
||||||
|
width="32"
|
||||||
|
>
|
||||||
|
<path d="M18.36 6.64a9 9 0 1 1-12.73 0" />
|
||||||
|
<line x1="12" y1="2" x2="12" y2="12" />
|
||||||
|
</svg>
|
||||||
|
<span id="host"></span>
|
||||||
|
</popup-button>
|
||||||
|
<popup-button
|
||||||
|
data-href="https://git.wanhose.dev/wanhose/cookie-dialog-monster/wiki/Help-or-issues%3F"
|
||||||
|
id="help-option"
|
||||||
|
role="link"
|
||||||
|
tabindex="0"
|
||||||
>
|
>
|
||||||
<path
|
<svg
|
||||||
d="M21 11.5a8.38 8.38 0 0 1-.9 3.8 8.5 8.5 0 0 1-7.6 4.7 8.38 8.38 0 0 1-3.8-.9L3 21l1.9-5.7a8.38 8.38 0 0 1-.9-3.8 8.5 8.5 0 0 1 4.7-7.6 8.38 8.38 0 0 1 3.8-.9h.5a8.48 8.48 0 0 1 8 8v.5z"
|
aria-hidden="true"
|
||||||
/>
|
fill="none"
|
||||||
</svg>
|
height="32"
|
||||||
<span data-i18n="popup_helpOption"></span>
|
stroke-linecap="round"
|
||||||
</popup-button>
|
stroke-linejoin="round"
|
||||||
<popup-button
|
stroke-width="2"
|
||||||
data-href="https://github.com/wanhose/cookie-dialog-monster"
|
stroke="currentColor"
|
||||||
id="contribute-option"
|
viewBox="0 0 24 24"
|
||||||
role="link"
|
width="32"
|
||||||
tabindex="0"
|
>
|
||||||
>
|
<path
|
||||||
<svg
|
d="M21 11.5a8.38 8.38 0 0 1-.9 3.8 8.5 8.5 0 0 1-7.6 4.7 8.38 8.38 0 0 1-3.8-.9L3 21l1.9-5.7a8.38 8.38 0 0 1-.9-3.8 8.5 8.5 0 0 1 4.7-7.6 8.38 8.38 0 0 1 3.8-.9h.5a8.48 8.48 0 0 1 8 8v.5z"
|
||||||
aria-hidden="true"
|
/>
|
||||||
fill="none"
|
</svg>
|
||||||
height="32"
|
<span data-i18n="popup_helpOption"></span>
|
||||||
stroke-linecap="round"
|
</popup-button>
|
||||||
stroke-linejoin="round"
|
<popup-button
|
||||||
stroke-width="2"
|
data-href="https://git.wanhose.dev/wanhose/cookie-dialog-monster"
|
||||||
stroke="currentColor"
|
id="contribute-option"
|
||||||
viewBox="0 0 24 24"
|
role="link"
|
||||||
width="32"
|
tabindex="0"
|
||||||
>
|
>
|
||||||
<path
|
<svg
|
||||||
d="M9 19c-5 1.5-5-2.5-7-3m14 6v-3.87a3.37 3.37 0 0 0-.94-2.61c3.14-.35 6.44-1.54 6.44-7A5.44 5.44 0 0 0 20 4.77 5.07 5.07 0 0 0 19.91 1S18.73.65 16 2.48a13.38 13.38 0 0 0-7 0C6.27.65 5.09 1 5.09 1A5.07 5.07 0 0 0 5 4.77a5.44 5.44 0 0 0-1.5 3.78c0 5.42 3.3 6.61 6.44 7A3.37 3.37 0 0 0 9 18.13V22"
|
aria-hidden="true"
|
||||||
/>
|
fill="none"
|
||||||
</svg>
|
height="32"
|
||||||
<span data-i18n="popup_contributeOption"></span>
|
stroke-linecap="round"
|
||||||
</popup-button>
|
stroke-linejoin="round"
|
||||||
<popup-button data-href="#" id="rate-option" role="link" tabindex="0">
|
stroke-width="2"
|
||||||
<svg
|
stroke="currentColor"
|
||||||
aria-hidden="true"
|
viewBox="0 0 24 24"
|
||||||
fill="none"
|
width="32"
|
||||||
height="32"
|
>
|
||||||
stroke-linecap="round"
|
<circle cx="18" cy="18" r="3"></circle>
|
||||||
stroke-linejoin="round"
|
<circle cx="6" cy="6" r="3"></circle>
|
||||||
stroke-width="2"
|
<path d="M13 6h3a2 2 0 0 1 2 2v7"></path>
|
||||||
stroke="currentColor"
|
<line x1="6" y1="9" x2="6" y2="21"></line>
|
||||||
viewBox="0 0 24 24"
|
</svg>
|
||||||
width="32"
|
<span data-i18n="popup_contributeOption"></span>
|
||||||
>
|
</popup-button>
|
||||||
<polygon
|
<popup-button data-href="#" id="rate-option" role="link" tabindex="0">
|
||||||
points="12 2 15.09 8.26 22 9.27 17 14.14 18.18 21.02 12 17.77 5.82 21.02 7 14.14 2 9.27 8.91 8.26 12 2"
|
<svg
|
||||||
/>
|
aria-hidden="true"
|
||||||
</svg>
|
fill="none"
|
||||||
<span data-i18n="popup_rateOption"></span>
|
height="32"
|
||||||
</popup-button>
|
stroke-linecap="round"
|
||||||
<popup-data-container>
|
stroke-linejoin="round"
|
||||||
<popup-data>
|
stroke-width="2"
|
||||||
<strong data-i18n="popup_databaseVersion"></strong>
|
stroke="currentColor"
|
||||||
<span id="database-version"></span>
|
viewBox="0 0 24 24"
|
||||||
<popup-data-button
|
width="32"
|
||||||
data-animation="flip"
|
>
|
||||||
id="refresh-database-button"
|
<polygon
|
||||||
|
points="12 2 15.09 8.26 22 9.27 17 14.14 18.18 21.02 12 17.77 5.82 21.02 7 14.14 2 9.27 8.91 8.26 12 2"
|
||||||
|
/>
|
||||||
|
</svg>
|
||||||
|
<span data-i18n="popup_rateOption"></span>
|
||||||
|
</popup-button>
|
||||||
|
<popup-data-container>
|
||||||
|
<popup-data>
|
||||||
|
<strong data-i18n="popup_databaseVersion"></strong>
|
||||||
|
<span id="database-version"></span>
|
||||||
|
<popup-data-button
|
||||||
|
data-animation="flip"
|
||||||
|
id="refresh-database-button"
|
||||||
|
role="button"
|
||||||
|
tabindex="0"
|
||||||
|
>
|
||||||
|
<svg
|
||||||
|
aria-hidden="true"
|
||||||
|
fill="none"
|
||||||
|
height="12"
|
||||||
|
id="refresh-database-spinner"
|
||||||
|
stroke-linecap="round"
|
||||||
|
stroke-linejoin="round"
|
||||||
|
stroke-width="2"
|
||||||
|
stroke="currentColor"
|
||||||
|
viewBox="0 0 24 24"
|
||||||
|
width="12"
|
||||||
|
>
|
||||||
|
<polyline points="1 4 1 10 7 10"></polyline>
|
||||||
|
<polyline points="23 20 23 14 17 14"></polyline>
|
||||||
|
<path
|
||||||
|
d="M20.49 9A9 9 0 0 0 5.64 5.64L1 10m22 4l-4.64 4.36A9 9 0 0 1 3.51 15"
|
||||||
|
></path>
|
||||||
|
</svg>
|
||||||
|
<svg
|
||||||
|
aria-hidden="true"
|
||||||
|
fill="none"
|
||||||
|
height="12"
|
||||||
|
id="refresh-database-check"
|
||||||
|
stroke-linecap="round"
|
||||||
|
stroke-linejoin="round"
|
||||||
|
stroke-width="2"
|
||||||
|
stroke="var(--color-success)"
|
||||||
|
viewBox="0 0 24 24"
|
||||||
|
width="12"
|
||||||
|
>
|
||||||
|
<polyline points="20 6 9 17 4 12"></polyline>
|
||||||
|
</svg>
|
||||||
|
</popup-data-button>
|
||||||
|
</popup-data>
|
||||||
|
<popup-data>
|
||||||
|
<strong data-i18n="popup_extensionVersion"></strong>
|
||||||
|
<span id="extension-version"></span>
|
||||||
|
</popup-data>
|
||||||
|
</popup-data-container>
|
||||||
|
</div>
|
||||||
|
<div class="report" style="display: none">
|
||||||
|
<div class="report-form-view">
|
||||||
|
<div class="report-body-text" data-i18n="report_bodyText"></div>
|
||||||
|
<div class="report-form">
|
||||||
|
<div class="report-input-group">
|
||||||
|
<div class="report-input-label" id="report-label-url">
|
||||||
|
<span data-i18n="report_urlInputLabel"></span>
|
||||||
|
<span class="report-input-label-required">*</span>
|
||||||
|
</div>
|
||||||
|
<input
|
||||||
|
aria-labelledby="report-label-url"
|
||||||
|
aria-required="true"
|
||||||
|
class="report-input"
|
||||||
|
id="report-input-url"
|
||||||
|
/>
|
||||||
|
<div
|
||||||
|
class="report-input-error"
|
||||||
|
data-i18n="report_urlInputError"
|
||||||
|
id="report-input-url-error"
|
||||||
|
></div>
|
||||||
|
</div>
|
||||||
|
<div class="report-input-group">
|
||||||
|
<div class="report-input-label" id="report-label-reason">
|
||||||
|
<span data-i18n="report_reasonInputLabel"></span>
|
||||||
|
<span class="report-input-label-required">*</span>
|
||||||
|
</div>
|
||||||
|
<textarea
|
||||||
|
aria-labelledby="report-label-reason"
|
||||||
|
aria-required="true"
|
||||||
|
class="report-input"
|
||||||
|
data-i18n="report_reasonInputPlaceholder"
|
||||||
|
id="report-input-reason"
|
||||||
|
rows="4"
|
||||||
|
></textarea>
|
||||||
|
<div
|
||||||
|
class="report-input-error"
|
||||||
|
data-i18n="report_reasonInputError"
|
||||||
|
id="report-input-reason-error"
|
||||||
|
></div>
|
||||||
|
</div>
|
||||||
|
<div class="report-buttons">
|
||||||
|
<button class="report-submit-button" data-i18n="contextMenu_reportOption"></button>
|
||||||
|
<button class="report-cancel-button" data-i18n="report_cancelButtonText"></button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="report-submit-error-view" hidden>
|
||||||
|
<svg
|
||||||
|
aria-hidden="true"
|
||||||
|
fill="none"
|
||||||
|
height="48"
|
||||||
|
stroke-linecap="round"
|
||||||
|
stroke-linejoin="round"
|
||||||
|
stroke-width="2"
|
||||||
|
stroke="var(--color-error)"
|
||||||
|
viewBox="0 0 24 24"
|
||||||
|
width="48"
|
||||||
|
>
|
||||||
|
<circle cx="12" cy="12" r="10"></circle>
|
||||||
|
<line x1="12" y1="8" x2="12" y2="12"></line>
|
||||||
|
<line x1="12" y1="16" x2="12.01" y2="16"></line>
|
||||||
|
</svg>
|
||||||
|
<div class="report-submit-text" data-i18n="report_submitErrorText"></div>
|
||||||
|
<div class="report-submit-extra-text" data-i18n="report_submitErrorExtraText"></div>
|
||||||
|
<div
|
||||||
|
class="report-issue-button"
|
||||||
|
data-i18n="contextMenu_issueOption"
|
||||||
role="button"
|
role="button"
|
||||||
tabindex="0"
|
tabindex="0"
|
||||||
|
></div>
|
||||||
|
</div>
|
||||||
|
<div class="report-submit-success-view" hidden>
|
||||||
|
<svg
|
||||||
|
aria-hidden="true"
|
||||||
|
fill="none"
|
||||||
|
height="48"
|
||||||
|
stroke-linecap="round"
|
||||||
|
stroke-linejoin="round"
|
||||||
|
stroke-width="2"
|
||||||
|
stroke="var(--color-success)"
|
||||||
|
viewBox="0 0 24 24"
|
||||||
|
width="48"
|
||||||
>
|
>
|
||||||
<svg
|
<path d="M22 11.08V12a10 10 0 1 1-5.93-9.14" />
|
||||||
aria-hidden="true"
|
<polyline points="22 4 12 14.01 9 11.01" />
|
||||||
fill="none"
|
</svg>
|
||||||
height="12"
|
<div class="report-submit-text" data-i18n="report_submitSuccessText"></div>
|
||||||
id="refresh-database-spinner"
|
<div class="report-submit-extra-text" data-i18n="report_submitSuccessExtraText"></div>
|
||||||
stroke-linecap="round"
|
<div
|
||||||
stroke-linejoin="round"
|
class="report-issue-button"
|
||||||
stroke-width="2"
|
data-i18n="contextMenu_issueOption"
|
||||||
stroke="currentColor"
|
role="button"
|
||||||
viewBox="0 0 24 24"
|
tabindex="0"
|
||||||
width="12"
|
></div>
|
||||||
>
|
</div>
|
||||||
<polyline points="1 4 1 10 7 10"></polyline>
|
</div>
|
||||||
<polyline points="23 20 23 14 17 14"></polyline>
|
|
||||||
<path d="M20.49 9A9 9 0 0 0 5.64 5.64L1 10m22 4l-4.64 4.36A9 9 0 0 1 3.51 15"></path>
|
|
||||||
</svg>
|
|
||||||
<svg
|
|
||||||
aria-hidden="true"
|
|
||||||
fill="none"
|
|
||||||
height="12"
|
|
||||||
id="refresh-database-check"
|
|
||||||
stroke-linecap="round"
|
|
||||||
stroke-linejoin="round"
|
|
||||||
stroke-width="2"
|
|
||||||
stroke="var(--color-success)"
|
|
||||||
viewBox="0 0 24 24"
|
|
||||||
width="12"
|
|
||||||
>
|
|
||||||
<polyline points="20 6 9 17 4 12"></polyline>
|
|
||||||
</svg>
|
|
||||||
</popup-data-button>
|
|
||||||
</popup-data>
|
|
||||||
<popup-data>
|
|
||||||
<strong data-i18n="popup_extensionVersion"></strong>
|
|
||||||
<span id="extension-version"></span>
|
|
||||||
</popup-data>
|
|
||||||
</popup-data-container>
|
|
||||||
</main>
|
</main>
|
||||||
<footer></footer>
|
<footer></footer>
|
||||||
</body>
|
</body>
|
||||||
|
@ -1,12 +1,55 @@
|
|||||||
|
/**
|
||||||
|
* @typedef {Object} ExtensionIssue
|
||||||
|
* @property {number} [expiresIn]
|
||||||
|
* @property {string[]} [flags]
|
||||||
|
* @property {string} [url]
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @typedef {Object} ExtensionState
|
||||||
|
* @property {ExtensionIssue} [issue]
|
||||||
|
* @property {boolean} on
|
||||||
|
* @property {string} [updateAvailable]
|
||||||
|
*/
|
||||||
|
|
||||||
if (typeof browser === 'undefined') {
|
if (typeof browser === 'undefined') {
|
||||||
browser = chrome;
|
browser = chrome;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @description Class for request batching
|
||||||
|
*/
|
||||||
|
class RequestManager {
|
||||||
|
constructor() {
|
||||||
|
this.requests = new Map();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @description Fetch wrapper to play with the request map
|
||||||
|
* @param {string} input
|
||||||
|
* @param {RequestInit} [init]
|
||||||
|
* @returns {Promise<any>}
|
||||||
|
*/
|
||||||
|
fetch(input, init) {
|
||||||
|
if (this.requests.has(input)) {
|
||||||
|
return this.requests.get(input);
|
||||||
|
}
|
||||||
|
|
||||||
|
const promise = fetch(input, init)
|
||||||
|
.then((response) => response.json())
|
||||||
|
.finally(() => this.requests.delete(input));
|
||||||
|
|
||||||
|
this.requests.set(input, promise);
|
||||||
|
|
||||||
|
return promise;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @description API URL
|
* @description API URL
|
||||||
* @type {string}
|
* @type {string}
|
||||||
*/
|
*/
|
||||||
const apiUrl = 'https://api.cookie-dialog-monster.com/rest/v4';
|
const apiUrl = 'https://api.cookie-dialog-monster.com/rest/v5';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @description Context menu identifier
|
* @description Context menu identifier
|
||||||
@ -20,6 +63,11 @@ const extensionMenuItemId = 'CDM-MENU';
|
|||||||
*/
|
*/
|
||||||
const reportMenuItemId = 'CDM-REPORT';
|
const reportMenuItemId = 'CDM-REPORT';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @description Request manager instance
|
||||||
|
*/
|
||||||
|
const requestManager = new RequestManager();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @description Context menu identifier
|
* @description Context menu identifier
|
||||||
* @type {string}
|
* @type {string}
|
||||||
@ -32,9 +80,15 @@ const settingsMenuItemId = 'CDM-SETTINGS';
|
|||||||
*/
|
*/
|
||||||
const script = browser.scripting;
|
const script = browser.scripting;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @description Default value for extension state
|
||||||
|
* @type {ExtensionState}
|
||||||
|
*/
|
||||||
|
const stateByDefault = { issue: { expiresIn: 0 }, on: true };
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @description The storage to use
|
* @description The storage to use
|
||||||
* @type {browser.storage.LocalStorageArea}
|
* @type {browser.storage.StorageArea}
|
||||||
*/
|
*/
|
||||||
const storage = browser.storage.local;
|
const storage = browser.storage.local;
|
||||||
|
|
||||||
@ -44,7 +98,44 @@ const storage = browser.storage.local;
|
|||||||
const suppressLastError = () => void browser.runtime.lastError;
|
const suppressLastError = () => void browser.runtime.lastError;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @description Calculate current hostname
|
* @async
|
||||||
|
* @description Enable extension icon
|
||||||
|
* @param {number} tabId
|
||||||
|
* @returns {Promise<void>}
|
||||||
|
*/
|
||||||
|
async function enableIcon(hostname, tabId) {
|
||||||
|
const state = await getState(hostname);
|
||||||
|
const path = state.issue?.url ? '/assets/icons/warn.png' : '/assets/icons/on.png';
|
||||||
|
|
||||||
|
await browser.action.setIcon({ path, tabId }, suppressLastError);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @async
|
||||||
|
* @description Get database
|
||||||
|
* @returns {Promise<Object>}
|
||||||
|
*/
|
||||||
|
async function getData() {
|
||||||
|
const { data } = await storage.get('data');
|
||||||
|
|
||||||
|
if (!data) {
|
||||||
|
return await refreshData();
|
||||||
|
}
|
||||||
|
|
||||||
|
return data;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @async
|
||||||
|
* @description Disable report context menu option
|
||||||
|
* @returns {Promise<void>}
|
||||||
|
*/
|
||||||
|
async function disableReport() {
|
||||||
|
return browser.contextMenus.update(reportMenuItemId, { enabled: false });
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @description Get current hostname
|
||||||
* @param {string} url
|
* @param {string} url
|
||||||
* @returns {string}
|
* @returns {string}
|
||||||
*/
|
*/
|
||||||
@ -52,6 +143,34 @@ function getHostname(url) {
|
|||||||
return new URL(url).hostname.split('.').slice(-3).join('.').replace('www.', '');
|
return new URL(url).hostname.split('.').slice(-3).join('.').replace('www.', '');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @async
|
||||||
|
* @description Get current active tab
|
||||||
|
* @returns {Promise<browser.tabs.Tab>}
|
||||||
|
*/
|
||||||
|
async function getTab() {
|
||||||
|
const tabs = await browser.tabs.query({ active: true, currentWindow: true });
|
||||||
|
|
||||||
|
return tabs[0];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @async
|
||||||
|
* @description Get state for the given hostname
|
||||||
|
* @param {string} hostname
|
||||||
|
* @returns {Promise<ExtensionState>}
|
||||||
|
*/
|
||||||
|
async function getState(hostname) {
|
||||||
|
const keys = [hostname, 'updateAvailable'];
|
||||||
|
const { [hostname]: state = stateByDefault, updateAvailable } = await storage.get(keys);
|
||||||
|
|
||||||
|
if ((state.issue && Date.now() > state.issue.expiresIn) || !state.issue?.expiresIn) {
|
||||||
|
state.issue = await refreshIssue(hostname);
|
||||||
|
}
|
||||||
|
|
||||||
|
return { ...stateByDefault, ...state, updateAvailable };
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @description Format number to avoid errors
|
* @description Format number to avoid errors
|
||||||
* @param {number} [value]
|
* @param {number} [value]
|
||||||
@ -81,32 +200,67 @@ function matchToPattern(match) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
* @async
|
||||||
* @description Refresh data
|
* @description Refresh data
|
||||||
* @param {void?} callback
|
* @param {number} [attempt]
|
||||||
* @returns {void}
|
* @returns {Promise<void>}
|
||||||
*/
|
*/
|
||||||
function refreshData(callback) {
|
async function refreshData(attempt = 1) {
|
||||||
try {
|
if (attempt <= 3) {
|
||||||
fetch(`${apiUrl}/data/`).then((result) => {
|
try {
|
||||||
result.json().then(({ data }) => {
|
const { data } = await requestManager.fetch(`${apiUrl}/data/`);
|
||||||
storage.set({ data }, suppressLastError);
|
|
||||||
callback?.(data);
|
await updateStore('data', data);
|
||||||
});
|
|
||||||
});
|
return data;
|
||||||
} catch {
|
} catch {
|
||||||
refreshData(callback);
|
return await refreshData(attempt + 1);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @async
|
* @async
|
||||||
* @description Report active tab URL
|
* @description Refresh issues for the given hostname
|
||||||
|
* @param {string} hostname
|
||||||
|
* @param {number} [attempt]
|
||||||
|
* @returns {Promise<ExtensionIssue | undefined>}
|
||||||
|
*/
|
||||||
|
async function refreshIssue(hostname, attempt = 1) {
|
||||||
|
if (attempt <= 3) {
|
||||||
|
try {
|
||||||
|
const { data = {} } = await requestManager.fetch(`${apiUrl}/issues/${hostname}/`);
|
||||||
|
|
||||||
|
if (Object.keys(data).length === 0) {
|
||||||
|
await updateStore(hostname, { issue: { expiresIn: Date.now() + 8 * 60 * 60 * 1000 } });
|
||||||
|
|
||||||
|
return undefined;
|
||||||
|
}
|
||||||
|
|
||||||
|
const issue = {
|
||||||
|
expiresIn: Date.now() + 4 * 60 * 60 * 1000,
|
||||||
|
flags: data.flags,
|
||||||
|
url: data.url,
|
||||||
|
};
|
||||||
|
|
||||||
|
await updateStore(hostname, { issue });
|
||||||
|
|
||||||
|
return data;
|
||||||
|
} catch {
|
||||||
|
return await refreshIssue(hostname, attempt + 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @async
|
||||||
|
* @description Report given page
|
||||||
* @param {any} message
|
* @param {any} message
|
||||||
* @param {browser.tabs.Tab} tab
|
* @param {browser.tabs.Tab} tab
|
||||||
* @param {void?} callback
|
* @param {void?} callback
|
||||||
* @returns {void}
|
* @returns {Promise<void>}
|
||||||
*/
|
*/
|
||||||
async function report(message, tab, callback) {
|
async function report(message) {
|
||||||
try {
|
try {
|
||||||
const reason = message.reason;
|
const reason = message.reason;
|
||||||
const url = message.url;
|
const url = message.url;
|
||||||
@ -114,25 +268,36 @@ async function report(message, tab, callback) {
|
|||||||
const version = browser.runtime.getManifest().version;
|
const version = browser.runtime.getManifest().version;
|
||||||
const body = JSON.stringify({ reason, url, userAgent, version });
|
const body = JSON.stringify({ reason, url, userAgent, version });
|
||||||
const headers = { 'Cache-Control': 'no-cache', 'Content-type': 'application/json' };
|
const headers = { 'Cache-Control': 'no-cache', 'Content-type': 'application/json' };
|
||||||
|
const requestInit = { body, headers, method: 'POST' };
|
||||||
|
|
||||||
const response = await fetch(`${apiUrl}/report/`, { body, headers, method: 'POST' });
|
return await requestManager.fetch(`${apiUrl}/report/`, requestInit);
|
||||||
callback?.((await response.json()).data);
|
|
||||||
} catch {
|
} catch {
|
||||||
console.error("Can't send report");
|
console.error("Can't send report");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @async
|
||||||
|
* @description Update extension store for a given key
|
||||||
|
* @param {string} [key]
|
||||||
|
* @param {Object} value
|
||||||
|
* @returns {Promise<void>}
|
||||||
|
*/
|
||||||
|
async function updateStore(key, value) {
|
||||||
|
if (key) {
|
||||||
|
const { [key]: prev } = await storage.get(key);
|
||||||
|
|
||||||
|
await storage.set({ [key]: { ...prev, ...value } }, suppressLastError);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @description Listen to context menus clicked
|
* @description Listen to context menus clicked
|
||||||
*/
|
*/
|
||||||
browser.contextMenus.onClicked.addListener((info, tab) => {
|
browser.contextMenus.onClicked.addListener((info) => {
|
||||||
const tabId = tab?.id;
|
|
||||||
|
|
||||||
switch (info.menuItemId) {
|
switch (info.menuItemId) {
|
||||||
case reportMenuItemId:
|
case reportMenuItemId:
|
||||||
if (tabId !== undefined) {
|
browser.action.openPopup();
|
||||||
browser.tabs.sendMessage(tabId, { type: 'SHOW_REPORT_DIALOG' }, suppressLastError);
|
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
case settingsMenuItemId:
|
case settingsMenuItemId:
|
||||||
browser.runtime.openOptionsPage();
|
browser.runtime.openOptionsPage();
|
||||||
@ -151,14 +316,18 @@ browser.runtime.onMessage.addListener((message, sender, callback) => {
|
|||||||
const tabId = sender.tab?.id;
|
const tabId = sender.tab?.id;
|
||||||
|
|
||||||
switch (message.type) {
|
switch (message.type) {
|
||||||
|
case 'DISABLE_REPORT':
|
||||||
|
if (isPage && tabId !== undefined) disableReport();
|
||||||
|
break;
|
||||||
case 'DISABLE_ICON':
|
case 'DISABLE_ICON':
|
||||||
if (isPage && tabId !== undefined) {
|
if (isPage && tabId !== undefined) {
|
||||||
browser.action.setIcon({ path: '/assets/icons/disabled.png', tabId }, suppressLastError);
|
browser.action.setIcon({ path: '/assets/icons/off.png', tabId }, suppressLastError);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case 'ENABLE_ICON':
|
case 'ENABLE_ICON':
|
||||||
if (isPage && tabId !== undefined) {
|
if (isPage && tabId !== undefined) {
|
||||||
browser.action.setIcon({ path: '/assets/icons/enabled.png', tabId }, suppressLastError);
|
enableIcon(hostname, tabId).then(callback);
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case 'ENABLE_POPUP':
|
case 'ENABLE_POPUP':
|
||||||
@ -166,59 +335,47 @@ browser.runtime.onMessage.addListener((message, sender, callback) => {
|
|||||||
browser.action.setPopup({ popup: '/popup.html', tabId }, suppressLastError);
|
browser.action.setPopup({ popup: '/popup.html', tabId }, suppressLastError);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
case 'ENABLE_REPORT':
|
||||||
|
if (isPage && tabId !== undefined) {
|
||||||
|
browser.contextMenus.update(reportMenuItemId, { enabled: true });
|
||||||
|
}
|
||||||
|
break;
|
||||||
case 'GET_DATA':
|
case 'GET_DATA':
|
||||||
storage.get('data', ({ data }) => {
|
getData().then(callback);
|
||||||
if (data) callback(data);
|
|
||||||
else refreshData(callback);
|
|
||||||
});
|
|
||||||
return true;
|
return true;
|
||||||
case 'GET_EXCLUSION_LIST':
|
case 'GET_EXCLUSION_LIST':
|
||||||
storage.get(null, (exclusions) => {
|
storage.get(null, (exclusions) => {
|
||||||
const exclusionList = Object.entries(exclusions || {}).flatMap((exclusion) =>
|
const exclusionList = Object.entries(exclusions || {}).flatMap((exclusion) => {
|
||||||
exclusion[0] !== 'data' && !exclusion[1]?.enabled ? [exclusion[0]] : []
|
return exclusion[0] !== 'data' && exclusion[1].on === false ? [exclusion[0]] : [];
|
||||||
);
|
});
|
||||||
callback(exclusionList);
|
callback(exclusionList);
|
||||||
});
|
});
|
||||||
return true;
|
return true;
|
||||||
case 'GET_HOSTNAME_STATE':
|
case 'GET_STATE':
|
||||||
if (hostname) {
|
if (hostname) {
|
||||||
storage.get(hostname, (state) => {
|
getState(hostname).then(callback);
|
||||||
callback(state[hostname] ?? { enabled: true });
|
|
||||||
});
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case 'GET_TAB':
|
case 'GET_TAB':
|
||||||
browser.tabs.query({ active: true, currentWindow: true }, (tabs) => {
|
getTab().then(callback);
|
||||||
callback(tabs[0]);
|
|
||||||
});
|
|
||||||
return true;
|
return true;
|
||||||
case 'INSERT_DIALOG_CSS':
|
|
||||||
if (isPage && tabId !== undefined) {
|
|
||||||
script.insertCSS({ files: ['styles/dialog.css'], target: { tabId } });
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case 'REFRESH_DATA':
|
case 'REFRESH_DATA':
|
||||||
refreshData(callback);
|
refreshData().then(callback);
|
||||||
return true;
|
return true;
|
||||||
case 'REPORT':
|
case 'REPORT':
|
||||||
if (tabId !== undefined) {
|
report(message).then(callback);
|
||||||
report(message, sender.tab, callback);
|
return true;
|
||||||
return true;
|
|
||||||
}
|
case 'UPDATE_BADGE':
|
||||||
break;
|
|
||||||
case 'SET_BADGE':
|
|
||||||
if (isPage && tabId !== undefined) {
|
if (isPage && tabId !== undefined) {
|
||||||
browser.action.setBadgeBackgroundColor({ color: '#6b7280' });
|
browser.action.setBadgeBackgroundColor({ color: '#6b7280' });
|
||||||
browser.action.setBadgeText({ tabId, text: formatNumber(message.value) });
|
browser.action.setBadgeText({ tabId, text: formatNumber(message.value) });
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case 'SET_HOSTNAME_STATE':
|
case 'UPDATE_STORE':
|
||||||
if (hostname) {
|
updateStore(hostname, message.state).then(callback);
|
||||||
if (message.state.enabled === false) storage.set({ [hostname]: message.state });
|
return true;
|
||||||
else storage.remove(hostname);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@ -227,7 +384,7 @@ browser.runtime.onMessage.addListener((message, sender, callback) => {
|
|||||||
/**
|
/**
|
||||||
* @description Listens to extension installed
|
* @description Listens to extension installed
|
||||||
*/
|
*/
|
||||||
browser.runtime.onInstalled.addListener(() => {
|
browser.runtime.onInstalled.addListener((details) => {
|
||||||
const documentUrlPatterns = browser.runtime.getManifest().content_scripts[0].matches;
|
const documentUrlPatterns = browser.runtime.getManifest().content_scripts[0].matches;
|
||||||
|
|
||||||
browser.contextMenus.create(
|
browser.contextMenus.create(
|
||||||
@ -253,12 +410,24 @@ browser.runtime.onInstalled.addListener(() => {
|
|||||||
{
|
{
|
||||||
contexts: ['all'],
|
contexts: ['all'],
|
||||||
documentUrlPatterns,
|
documentUrlPatterns,
|
||||||
|
enabled: false,
|
||||||
id: reportMenuItemId,
|
id: reportMenuItemId,
|
||||||
parentId: extensionMenuItemId,
|
parentId: extensionMenuItemId,
|
||||||
title: browser.i18n.getMessage('contextMenu_reportOption'),
|
title: browser.i18n.getMessage('contextMenu_reportOption'),
|
||||||
},
|
},
|
||||||
suppressLastError
|
suppressLastError
|
||||||
);
|
);
|
||||||
|
|
||||||
|
if (details.reason === 'update') {
|
||||||
|
storage.remove('updateAvailable');
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @description Listen to available updates
|
||||||
|
*/
|
||||||
|
browser.runtime.onUpdateAvailable.addListener((details) => {
|
||||||
|
storage.set({ updateAvailable: details.version }, suppressLastError);
|
||||||
});
|
});
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -268,6 +437,13 @@ browser.runtime.onStartup.addListener(() => {
|
|||||||
refreshData();
|
refreshData();
|
||||||
});
|
});
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @description Listen to tab changes
|
||||||
|
*/
|
||||||
|
browser.tabs.onActivated.addListener(() => {
|
||||||
|
disableReport();
|
||||||
|
});
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @description Listen to the moment before a request is made to apply the rules
|
* @description Listen to the moment before a request is made to apply the rules
|
||||||
* @returns {Promise<void>}
|
* @returns {Promise<void>}
|
||||||
@ -285,8 +461,9 @@ browser.webRequest.onBeforeRequest.addListener(
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const data = await getData();
|
||||||
const hostname = getHostname(url);
|
const hostname = getHostname(url);
|
||||||
const { data, [hostname]: state = { enabled: true } } = await storage.get(['data', hostname]);
|
const state = await getState(hostname);
|
||||||
|
|
||||||
if (data?.rules?.length) {
|
if (data?.rules?.length) {
|
||||||
const rules = data.rules.map((rule) => ({
|
const rules = data.rules.map((rule) => ({
|
||||||
@ -295,7 +472,7 @@ browser.webRequest.onBeforeRequest.addListener(
|
|||||||
}));
|
}));
|
||||||
|
|
||||||
await browser.declarativeNetRequest.updateSessionRules({
|
await browser.declarativeNetRequest.updateSessionRules({
|
||||||
addRules: state.enabled ? rules : undefined,
|
addRules: state.on ? rules : undefined,
|
||||||
removeRuleIds: data.rules.map((rule) => rule.id),
|
removeRuleIds: data.rules.map((rule) => rule.id),
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@ -313,9 +490,9 @@ browser.webRequest.onErrorOccurred.addListener(
|
|||||||
|
|
||||||
if (error === 'net::ERR_BLOCKED_BY_CLIENT' && tabId > -1) {
|
if (error === 'net::ERR_BLOCKED_BY_CLIENT' && tabId > -1) {
|
||||||
const hostname = getHostname(url);
|
const hostname = getHostname(url);
|
||||||
const { [hostname]: state = { enabled: true } } = await storage.get(hostname);
|
const state = await getState(hostname);
|
||||||
|
|
||||||
if (state.enabled) {
|
if (state.on) {
|
||||||
await browser.tabs.sendMessage(tabId, { type: 'INCREASE_ACTIONS_COUNT' });
|
await browser.tabs.sendMessage(tabId, { type: 'INCREASE_ACTIONS_COUNT' });
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -6,6 +6,11 @@
|
|||||||
* @property {{ backdrops: string[], classes: string[], containers: string[], selectors: string[] }} tokens
|
* @property {{ backdrops: string[], classes: string[], containers: string[], selectors: string[] }} tokens
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @typedef {Object} ContentState
|
||||||
|
* @property {boolean} on
|
||||||
|
*/
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @typedef {Object} Fix
|
* @typedef {Object} Fix
|
||||||
* @property {string} action
|
* @property {string} action
|
||||||
@ -91,9 +96,9 @@ const seen = new Set();
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* @description Extension state
|
* @description Extension state
|
||||||
* @type {{ enabled: boolean }}
|
* @type {ContentState}
|
||||||
*/
|
*/
|
||||||
let state = { enabled: true };
|
let state = { on: true };
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @description Clean DOM
|
* @description Clean DOM
|
||||||
@ -115,8 +120,8 @@ function clean(elements, skipMatch) {
|
|||||||
if (element instanceof HTMLDialogElement) element.close();
|
if (element instanceof HTMLDialogElement) element.close();
|
||||||
hide(element);
|
hide(element);
|
||||||
|
|
||||||
actions.add(new Date().getTime().toString());
|
actions.add(`${Date.now()}`);
|
||||||
dispatch({ type: 'SET_BADGE', value: actions.size });
|
dispatch({ type: 'UPDATE_BADGE', value: actions.size });
|
||||||
}
|
}
|
||||||
|
|
||||||
seen.add(element);
|
seen.add(element);
|
||||||
@ -295,7 +300,7 @@ function fix() {
|
|||||||
|
|
||||||
for (const backdrop of backdrops) {
|
for (const backdrop of backdrops) {
|
||||||
if (backdrop.children.length === 0 && !seen.has(backdrop)) {
|
if (backdrop.children.length === 0 && !seen.has(backdrop)) {
|
||||||
actions.add(new Date().getTime().toString());
|
actions.add(`${Date.now()}`);
|
||||||
seen.add(backdrop);
|
seen.add(backdrop);
|
||||||
hide(backdrop);
|
hide(backdrop);
|
||||||
}
|
}
|
||||||
@ -366,7 +371,7 @@ function fix() {
|
|||||||
t4Wrapper.removeAttribute('inert');
|
t4Wrapper.removeAttribute('inert');
|
||||||
}
|
}
|
||||||
|
|
||||||
dispatch({ type: 'SET_BADGE', value: actions.size });
|
dispatch({ type: 'UPDATE_BADGE', value: actions.size });
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -390,7 +395,7 @@ function hide(element) {
|
|||||||
function run(params = {}) {
|
function run(params = {}) {
|
||||||
const { containers, elements, skipMatch } = params;
|
const { containers, elements, skipMatch } = params;
|
||||||
|
|
||||||
if (document.body?.children.length && state.enabled && tokens.selectors.length) {
|
if (document.body?.children.length && state.on && tokens.selectors.length) {
|
||||||
fix();
|
fix();
|
||||||
|
|
||||||
if (elements?.length) {
|
if (elements?.length) {
|
||||||
@ -409,10 +414,10 @@ function run(params = {}) {
|
|||||||
* @param {SetUpParams} [params]
|
* @param {SetUpParams} [params]
|
||||||
*/
|
*/
|
||||||
async function setUp(params = {}) {
|
async function setUp(params = {}) {
|
||||||
state = (await dispatch({ hostname, type: 'GET_HOSTNAME_STATE' })) ?? state;
|
state = await dispatch({ hostname, type: 'GET_STATE' });
|
||||||
dispatch({ type: 'ENABLE_POPUP' });
|
dispatch({ type: 'ENABLE_POPUP' });
|
||||||
|
|
||||||
if (state.enabled) {
|
if (state.on) {
|
||||||
const data = await dispatch({ hostname, type: 'GET_DATA' });
|
const data = await dispatch({ hostname, type: 'GET_DATA' });
|
||||||
|
|
||||||
commonWords = data?.commonWords ?? commonWords;
|
commonWords = data?.commonWords ?? commonWords;
|
||||||
@ -420,13 +425,15 @@ async function setUp(params = {}) {
|
|||||||
skips = data?.skips ?? skips;
|
skips = data?.skips ?? skips;
|
||||||
tokens = data?.tokens ?? tokens;
|
tokens = data?.tokens ?? tokens;
|
||||||
|
|
||||||
dispatch({ type: 'ENABLE_ICON' });
|
dispatch({ type: 'ENABLE_REPORT' });
|
||||||
dispatch({ type: 'SET_BADGE', value: actions.size });
|
dispatch({ hostname, type: 'ENABLE_ICON' });
|
||||||
|
dispatch({ type: 'UPDATE_BADGE', value: actions.size });
|
||||||
observer.observe(document.body ?? document.documentElement, options);
|
observer.observe(document.body ?? document.documentElement, options);
|
||||||
if (!params.skipRunFn) run({ containers: tokens.containers });
|
if (!params.skipRunFn) run({ containers: tokens.containers });
|
||||||
} else {
|
} else {
|
||||||
|
dispatch({ type: 'DISABLE_REPORT' });
|
||||||
dispatch({ type: 'DISABLE_ICON' });
|
dispatch({ type: 'DISABLE_ICON' });
|
||||||
dispatch({ type: 'SET_BADGE', value: actions.size });
|
dispatch({ type: 'UPDATE_BADGE', value: actions.size });
|
||||||
observer.disconnect();
|
observer.disconnect();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -449,7 +456,7 @@ async function setUpAfterWaitForBody() {
|
|||||||
* @type {MutationObserver}
|
* @type {MutationObserver}
|
||||||
*/
|
*/
|
||||||
const observer = new MutationObserver((mutations) => {
|
const observer = new MutationObserver((mutations) => {
|
||||||
if (!state.enabled || !tokens.selectors.length) {
|
if (!state.on || !tokens.selectors.length) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -466,7 +473,7 @@ const observer = new MutationObserver((mutations) => {
|
|||||||
browser.runtime.onMessage.addListener(async (message) => {
|
browser.runtime.onMessage.addListener(async (message) => {
|
||||||
switch (message.type) {
|
switch (message.type) {
|
||||||
case 'INCREASE_ACTIONS_COUNT': {
|
case 'INCREASE_ACTIONS_COUNT': {
|
||||||
actions.add(new Date().getTime().toString());
|
actions.add(`${Date.now()}`);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -490,9 +497,13 @@ window.addEventListener('pageshow', async (event) => {
|
|||||||
* @returns {void}
|
* @returns {void}
|
||||||
*/
|
*/
|
||||||
window.addEventListener('visibilitychange', async () => {
|
window.addEventListener('visibilitychange', async () => {
|
||||||
if (document.visibilityState === 'visible' && !initiallyVisible) {
|
if (document.visibilityState === 'visible') {
|
||||||
initiallyVisible = true;
|
if (!initiallyVisible) {
|
||||||
await setUp();
|
initiallyVisible = true;
|
||||||
|
await setUp();
|
||||||
|
}
|
||||||
|
|
||||||
|
dispatch({ type: state.on ? 'ENABLE_REPORT' : 'DISABLE_REPORT' });
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@ -1,272 +0,0 @@
|
|||||||
if (typeof browser === 'undefined') {
|
|
||||||
browser = chrome;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @description Report dialog ID
|
|
||||||
*/
|
|
||||||
const reportDialogId = 'report-dialog';
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @description Report dialog outer HTML
|
|
||||||
*/
|
|
||||||
const reportDialogHtml = `
|
|
||||||
<dialog id="${reportDialogId}" tabindex="0">
|
|
||||||
<div class="report-dialog-header">
|
|
||||||
<div class="report-dialog-header-title">Cookie Dialog Monster</div>
|
|
||||||
<div class="report-dialog-close-button" role="button" tabindex="0">
|
|
||||||
<svg
|
|
||||||
fill="none"
|
|
||||||
height="20"
|
|
||||||
stroke-linecap="round"
|
|
||||||
stroke-linejoin="round"
|
|
||||||
stroke-width="2"
|
|
||||||
viewBox="0 0 24 24"
|
|
||||||
width="20"
|
|
||||||
>
|
|
||||||
<line x1="18" y1="6" x2="6" y2="18" />
|
|
||||||
<line x1="6" y1="6" x2="18" y2="18" />
|
|
||||||
</svg>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="report-dialog-body">
|
|
||||||
<div class="report-dialog-form-view">
|
|
||||||
<div class="report-dialog-body-text">
|
|
||||||
${browser.i18n.getMessage('reportDialog_bodyText')}
|
|
||||||
</div>
|
|
||||||
<div class="report-dialog-form">
|
|
||||||
<div class="report-dialog-input-group">
|
|
||||||
<div class="report-dialog-input-label" id="report-dialog-label-url">
|
|
||||||
${browser.i18n.getMessage('reportDialog_urlInputLabel')}
|
|
||||||
<span class="report-dialog-input-label-required">*</span>
|
|
||||||
</div>
|
|
||||||
<input
|
|
||||||
aria-labelledby="report-dialog-label-url"
|
|
||||||
aria-required="true"
|
|
||||||
class="report-dialog-input"
|
|
||||||
id="report-dialog-input-url"
|
|
||||||
/>
|
|
||||||
<div class="report-dialog-input-error" id="report-dialog-input-url-error">
|
|
||||||
${browser.i18n.getMessage('reportDialog_urlInputError')}
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="report-dialog-input-group">
|
|
||||||
<div class="report-dialog-input-label" id="report-dialog-label-reason">
|
|
||||||
${browser.i18n.getMessage('reportDialog_reasonInputLabel')}
|
|
||||||
<span class="report-dialog-input-label-required">*</span>
|
|
||||||
</div>
|
|
||||||
<textarea
|
|
||||||
aria-labelledby="report-dialog-label-reason"
|
|
||||||
aria-required="true"
|
|
||||||
class="report-dialog-input"
|
|
||||||
id="report-dialog-input-reason"
|
|
||||||
rows="4"
|
|
||||||
>${browser.i18n.getMessage('reportDialog_reasonInputPlaceholder')}</textarea>
|
|
||||||
<div class="report-dialog-input-error" id="report-dialog-input-reason-error">
|
|
||||||
${browser.i18n.getMessage('reportDialog_reasonInputError')}
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="report-dialog-submit-button" role="button" tabindex="0">
|
|
||||||
${browser.i18n.getMessage('contextMenu_reportOption')?.replace('...', '')}
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="report-dialog-submit-view" hidden>
|
|
||||||
<svg
|
|
||||||
fill="none"
|
|
||||||
height="48"
|
|
||||||
stroke-linecap="round"
|
|
||||||
stroke-linejoin="round"
|
|
||||||
stroke-width="2"
|
|
||||||
stroke="var(--cookie-dialog-monster-color-success)"
|
|
||||||
viewBox="0 0 24 24"
|
|
||||||
width="48"
|
|
||||||
>
|
|
||||||
<path d="M22 11.08V12a10 10 0 1 1-5.93-9.14" />
|
|
||||||
<polyline points="22 4 12 14.01 9 11.01" />
|
|
||||||
</svg>
|
|
||||||
<div class="report-dialog-submit-text">
|
|
||||||
${browser.i18n.getMessage('reportDialog_submitText')}
|
|
||||||
</div>
|
|
||||||
<div class="report-dialog-submit-extra-text">
|
|
||||||
${browser.i18n.getMessage('reportDialog_submitExtraText')}
|
|
||||||
</div>
|
|
||||||
<div class="report-dialog-issue-button" role="button" tabindex="0">
|
|
||||||
${browser.i18n.getMessage('contextMenu_issueOption')}
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</dialog>
|
|
||||||
`;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @description Dialog close button click handler
|
|
||||||
* @param {MouseEvent} event
|
|
||||||
*/
|
|
||||||
function closeButtonClickHandler(event) {
|
|
||||||
const dialog = document.getElementById(reportDialogId);
|
|
||||||
|
|
||||||
event.preventDefault();
|
|
||||||
dialog?.remove();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @description Hide report dialog
|
|
||||||
*/
|
|
||||||
function hideReportDialog() {
|
|
||||||
document.getElementById(reportDialogId)?.remove();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @description Input change handler
|
|
||||||
* @param {InputEvent} event
|
|
||||||
*/
|
|
||||||
function inputChangeHandler(event) {
|
|
||||||
event.currentTarget.removeAttribute('aria-invalid');
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @description Input key down handler
|
|
||||||
* @param {KeyboardEvent} event
|
|
||||||
*/
|
|
||||||
function inputKeyDownHandler(event) {
|
|
||||||
if (event.key === 'Enter') {
|
|
||||||
event.preventDefault();
|
|
||||||
event.currentTarget.blur();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @description Show report dialog
|
|
||||||
*/
|
|
||||||
function showReportDialog() {
|
|
||||||
const existingDialog = document.getElementById(reportDialogId);
|
|
||||||
|
|
||||||
if (existingDialog) {
|
|
||||||
const submitButton = existingDialog.getElementsByClassName('report-dialog-submit-button')[0];
|
|
||||||
const urlInput = existingDialog.querySelector('#report-dialog-input-url');
|
|
||||||
|
|
||||||
existingDialog.showModal();
|
|
||||||
submitButton.setAttribute('aria-disabled', 'false');
|
|
||||||
urlInput.setAttribute('value', window.location.origin + window.location.pathname);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
const parser = new DOMParser();
|
|
||||||
const result = parser.parseFromString(reportDialogHtml, 'text/html');
|
|
||||||
const dialog = result.body.firstElementChild;
|
|
||||||
const closeButton = dialog.getElementsByClassName('report-dialog-close-button')[0];
|
|
||||||
const link = document.createElement('link');
|
|
||||||
const reasonInput = dialog?.querySelector('#report-dialog-input-reason');
|
|
||||||
const submitButton = dialog?.getElementsByClassName('report-dialog-submit-button')[0];
|
|
||||||
const urlInput = dialog?.querySelector('#report-dialog-input-url');
|
|
||||||
|
|
||||||
closeButton.addEventListener('click', closeButtonClickHandler);
|
|
||||||
urlInput.setAttribute('value', window.location.origin + window.location.pathname);
|
|
||||||
link.setAttribute('href', 'https://fonts.googleapis.com/css?family=Inter');
|
|
||||||
link.setAttribute('id', 'report-dialog-font');
|
|
||||||
link.setAttribute('rel', 'stylesheet');
|
|
||||||
reasonInput.addEventListener('input', inputChangeHandler);
|
|
||||||
reasonInput.addEventListener('keydown', inputKeyDownHandler);
|
|
||||||
submitButton.addEventListener('click', submitButtonClickHandler);
|
|
||||||
urlInput.addEventListener('input', inputChangeHandler);
|
|
||||||
urlInput.addEventListener('keydown', inputKeyDownHandler);
|
|
||||||
|
|
||||||
dispatch({ type: 'INSERT_DIALOG_CSS' });
|
|
||||||
document.body.appendChild(dialog);
|
|
||||||
document.head.appendChild(link);
|
|
||||||
dialog.showModal();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @description Dialog submit button click handler
|
|
||||||
* @param {MouseEvent} event
|
|
||||||
*/
|
|
||||||
async function submitButtonClickHandler(event) {
|
|
||||||
event.preventDefault();
|
|
||||||
|
|
||||||
if (event.currentTarget.getAttribute('aria-disabled') === 'true') {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
event.currentTarget.setAttribute('aria-disabled', 'true');
|
|
||||||
|
|
||||||
const dialog = document.getElementById(reportDialogId);
|
|
||||||
const reasonInput = dialog?.querySelector('#report-dialog-input-reason');
|
|
||||||
const reasonText = reasonInput?.value.trim();
|
|
||||||
const urlInput = dialog?.querySelector('#report-dialog-input-url');
|
|
||||||
const urlText = urlInput?.value.trim();
|
|
||||||
|
|
||||||
const errors = validateForm({ reason: reasonText, url: urlText });
|
|
||||||
|
|
||||||
if (errors) {
|
|
||||||
if (errors.reason) {
|
|
||||||
reasonInput?.setAttribute('aria-invalid', 'true');
|
|
||||||
reasonInput?.setAttribute('aria-errormessage', 'report-dialog-input-reason-error');
|
|
||||||
}
|
|
||||||
|
|
||||||
if (errors.url) {
|
|
||||||
urlInput?.setAttribute('aria-invalid', 'true');
|
|
||||||
urlInput?.setAttribute('aria-errormessage', 'report-dialog-input-url-error');
|
|
||||||
}
|
|
||||||
|
|
||||||
event.currentTarget.setAttribute('aria-disabled', 'false');
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
const formView = dialog?.getElementsByClassName('report-dialog-form-view')[0];
|
|
||||||
const issueButton = dialog?.getElementsByClassName('report-dialog-issue-button')[0];
|
|
||||||
const submitView = dialog?.getElementsByClassName('report-dialog-submit-view')[0];
|
|
||||||
const userAgent = window.navigator.userAgent;
|
|
||||||
const issueUrl = await dispatch({ userAgent, reason: reasonText, url: urlText, type: 'REPORT' });
|
|
||||||
|
|
||||||
formView?.setAttribute('hidden', 'true');
|
|
||||||
issueButton?.addEventListener('click', () => window.open(issueUrl, '_blank'));
|
|
||||||
submitView?.removeAttribute('hidden');
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @description Validate form
|
|
||||||
* @param {{ reason: string | undefined | undefined, url: string | undefined }} params
|
|
||||||
* @returns {{ reason: string | undefined, url: string | undefined } | undefined}
|
|
||||||
*/
|
|
||||||
function validateForm(params) {
|
|
||||||
const { reason, url } = params;
|
|
||||||
let errors = undefined;
|
|
||||||
|
|
||||||
if (!reason || reason.length < 10 || reason.length > 1000) {
|
|
||||||
errors = {
|
|
||||||
...(errors ?? {}),
|
|
||||||
reason: browser.i18n.getMessage('reportDialog_reasonInputError'),
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
try {
|
|
||||||
new URL(url);
|
|
||||||
} catch {
|
|
||||||
errors = {
|
|
||||||
...(errors ?? {}),
|
|
||||||
url: browser.i18n.getMessage('reportDialog_urlInputError'),
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
return errors;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @description Listen to messages
|
|
||||||
*/
|
|
||||||
browser.runtime.onMessage.addListener((message) => {
|
|
||||||
const isPage = window === window.top;
|
|
||||||
|
|
||||||
switch (message.type) {
|
|
||||||
case 'HIDE_REPORT_DIALOG':
|
|
||||||
if (isPage) hideReportDialog();
|
|
||||||
break;
|
|
||||||
case 'SHOW_REPORT_DIALOG':
|
|
||||||
if (isPage) showReportDialog();
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
});
|
|
@ -8,9 +8,9 @@ if (typeof browser === 'undefined') {
|
|||||||
const dispatch = browser.runtime.sendMessage;
|
const dispatch = browser.runtime.sendMessage;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @description Domain RegExp
|
* @description RegExp for matching domains
|
||||||
*/
|
*/
|
||||||
const domainRx = /^([a-z0-9]+(-[a-z0-9]+)*\.)+[a-z]{2,}$/g;
|
const domainRegExp = /^(?!-)[A-Za-z0-9]([A-Za-z0-9-]{0,61}[A-Za-z0-9])?(\.[A-Za-z]{2,})+$/;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @description Exclusion list, URLs where the user prefers to disable the extension
|
* @description Exclusion list, URLs where the user prefers to disable the extension
|
||||||
@ -58,14 +58,15 @@ function createList() {
|
|||||||
* @returns {Promise<void>}
|
* @returns {Promise<void>}
|
||||||
*/
|
*/
|
||||||
async function handleAddClick() {
|
async function handleAddClick() {
|
||||||
const exclusionValue = window.prompt(browser.i18n.getMessage('options_addPrompt'));
|
const message = browser.i18n.getMessage('options_addPrompt');
|
||||||
|
const value = window.prompt(message)?.trim().replace('www.', '');
|
||||||
|
|
||||||
if (exclusionValue?.trim() && (domainRx.test(exclusionValue) || exclusionValue === 'localhost')) {
|
if (value && (domainRegExp.test(value) || value === 'localhost')) {
|
||||||
const filterInputElement = document.getElementById('filter-input');
|
const filterInputElement = document.getElementById('filter-input');
|
||||||
const state = { enabled: false };
|
const state = { on: false };
|
||||||
await dispatch({ hostname: exclusionValue, state, type: 'SET_HOSTNAME_STATE' });
|
await dispatch({ hostname: value, state, type: 'UPDATE_STORE' });
|
||||||
|
|
||||||
exclusionList = [...new Set([...exclusionList, exclusionValue])].sort();
|
exclusionList = [...new Set([...exclusionList, value])].sort();
|
||||||
createList();
|
createList();
|
||||||
updateList(filterInputElement.value.trim());
|
updateList(filterInputElement.value.trim());
|
||||||
}
|
}
|
||||||
@ -80,8 +81,8 @@ async function handleClearClick() {
|
|||||||
const filterInputElement = document.getElementById('filter-input');
|
const filterInputElement = document.getElementById('filter-input');
|
||||||
|
|
||||||
for (const exclusionValue of exclusionList) {
|
for (const exclusionValue of exclusionList) {
|
||||||
const state = { enabled: true };
|
const state = { on: true };
|
||||||
await dispatch({ hostname: exclusionValue, state, type: 'SET_HOSTNAME_STATE' });
|
await dispatch({ hostname: exclusionValue, state, type: 'UPDATE_STORE' });
|
||||||
}
|
}
|
||||||
|
|
||||||
exclusionList = [];
|
exclusionList = [];
|
||||||
@ -128,9 +129,9 @@ async function handleDeleteClick(event) {
|
|||||||
const filterInputElement = document.getElementById('filter-input');
|
const filterInputElement = document.getElementById('filter-input');
|
||||||
const { value } = event.currentTarget.parentElement.dataset;
|
const { value } = event.currentTarget.parentElement.dataset;
|
||||||
const itemElement = document.querySelector(`[data-value="${value}"]`);
|
const itemElement = document.querySelector(`[data-value="${value}"]`);
|
||||||
const state = { enabled: true };
|
const state = { on: true };
|
||||||
|
|
||||||
await dispatch({ hostname: value, state, type: 'SET_HOSTNAME_STATE' });
|
await dispatch({ hostname: value, state, type: 'UPDATE_STORE' });
|
||||||
exclusionList = exclusionList.filter((exclusionValue) => exclusionValue !== value);
|
exclusionList = exclusionList.filter((exclusionValue) => exclusionValue !== value);
|
||||||
itemElement?.remove();
|
itemElement?.remove();
|
||||||
updateList(filterInputElement.value.trim());
|
updateList(filterInputElement.value.trim());
|
||||||
@ -169,18 +170,23 @@ function handleFileChange(event) {
|
|||||||
const reader = new FileReader();
|
const reader = new FileReader();
|
||||||
|
|
||||||
reader.addEventListener('load', async (event) => {
|
reader.addEventListener('load', async (event) => {
|
||||||
const newExclusionList = event.currentTarget.result.split('\n').filter((x) => x.trim());
|
const input = event.currentTarget.result.split('\n');
|
||||||
|
const exclusions = [];
|
||||||
|
|
||||||
for (const exclusionValue of newExclusionList) {
|
for (let value of input) {
|
||||||
const state = { enabled: false };
|
value = value.replace('www.', '');
|
||||||
await dispatch({ hostname: exclusionValue, state, type: 'SET_HOSTNAME_STATE' });
|
|
||||||
|
if (value && (domainRegExp.test(value) || value === 'localhost')) {
|
||||||
|
const state = { on: false };
|
||||||
|
|
||||||
|
await dispatch({ hostname: value, state, type: 'UPDATE_STORE' });
|
||||||
|
exclusions.push(value);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (newExclusionList.length) {
|
exclusionList = [...new Set([...exclusionList, ...exclusions])].sort();
|
||||||
exclusionList = [...new Set([...exclusionList, ...newExclusionList])].sort();
|
createList();
|
||||||
createList();
|
updateList(filterInputElement.value.trim());
|
||||||
updateList(filterInputElement.value.trim());
|
|
||||||
}
|
|
||||||
});
|
});
|
||||||
|
|
||||||
event.currentTarget.value = '';
|
event.currentTarget.value = '';
|
||||||
|
@ -1,3 +1,16 @@
|
|||||||
|
/**
|
||||||
|
* @typedef {Object} ExtensionState
|
||||||
|
* @property {ExtensionIssue} [issue]
|
||||||
|
* @property {boolean} on
|
||||||
|
* @property {string} [updateAvailable]
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @typedef {Object} PopupState
|
||||||
|
* @extends {ExtensionState}
|
||||||
|
* @property {number} [tabId]
|
||||||
|
*/
|
||||||
|
|
||||||
if (typeof browser === 'undefined') {
|
if (typeof browser === 'undefined') {
|
||||||
browser = chrome;
|
browser = chrome;
|
||||||
}
|
}
|
||||||
@ -8,6 +21,11 @@ if (typeof browser === 'undefined') {
|
|||||||
*/
|
*/
|
||||||
const chromeUrl = 'https://chrome.google.com/webstore/detail/djcbfpkdhdkaflcigibkbpboflaplabg';
|
const chromeUrl = 'https://chrome.google.com/webstore/detail/djcbfpkdhdkaflcigibkbpboflaplabg';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @description Shortcut to send messages to background script
|
||||||
|
*/
|
||||||
|
const dispatch = browser.runtime.sendMessage;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @description Edge Add-ons link
|
* @description Edge Add-ons link
|
||||||
* @type {string}
|
* @type {string}
|
||||||
@ -46,10 +64,24 @@ const isEdge = navigator.userAgent.indexOf('Edg') !== -1;
|
|||||||
const isFirefox = navigator.userAgent.indexOf('Firefox') !== -1;
|
const isFirefox = navigator.userAgent.indexOf('Firefox') !== -1;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @description Extension state
|
* @description Popup state
|
||||||
* @type {{ enabled: boolean, tabId: number | undefined }}
|
* @type {PopupState}
|
||||||
*/
|
*/
|
||||||
let state = { enabled: true, tabId: undefined };
|
let state = { on: true };
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @description Close report form
|
||||||
|
* @returns {void}
|
||||||
|
*/
|
||||||
|
function handleCancelClick() {
|
||||||
|
const content = document.getElementsByClassName('content')[0];
|
||||||
|
const report = document.getElementsByClassName('report')[0];
|
||||||
|
|
||||||
|
if (content instanceof HTMLElement && report instanceof HTMLElement) {
|
||||||
|
content.style.removeProperty('display');
|
||||||
|
report.style.display = 'none';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @async
|
* @async
|
||||||
@ -57,15 +89,56 @@ let state = { enabled: true, tabId: undefined };
|
|||||||
* @returns {Promise<void>}
|
* @returns {Promise<void>}
|
||||||
*/
|
*/
|
||||||
async function handleContentLoaded() {
|
async function handleContentLoaded() {
|
||||||
const tab = await browser.runtime.sendMessage({ type: 'GET_TAB' });
|
const tab = await dispatch({ type: 'GET_TAB' });
|
||||||
|
const tabUrl = tab?.url ? new URL(tab.url) : undefined;
|
||||||
|
|
||||||
hostname = tab?.url
|
hostname = tabUrl?.hostname.split('.').slice(-3).join('.').replace('www.', '');
|
||||||
? new URL(tab.url).hostname.split('.').slice(-3).join('.').replace('www.', '')
|
|
||||||
: undefined;
|
|
||||||
|
|
||||||
const next = await browser.runtime.sendMessage({ hostname, type: 'GET_HOSTNAME_STATE' });
|
const next = await dispatch({ hostname, type: 'GET_STATE' });
|
||||||
state = { ...(next ?? state), tabId: tab?.id };
|
state = { ...(next ?? state), tabId: tab?.id };
|
||||||
|
|
||||||
|
if (state.issue?.url) {
|
||||||
|
const issueBanner = document.getElementById('issue-banner');
|
||||||
|
issueBanner.removeAttribute('aria-hidden');
|
||||||
|
|
||||||
|
const issueBannerText = document.getElementById('issue-banner-text');
|
||||||
|
if (state.issue.flags.includes('wontfix'))
|
||||||
|
issueBannerText.innerText = browser.i18n.getMessage('popup_bannerIssueWontFix');
|
||||||
|
else issueBannerText.innerText = browser.i18n.getMessage('popup_bannerIssueOpen');
|
||||||
|
|
||||||
|
const issueBannerUrl = document.getElementById('issue-banner-url');
|
||||||
|
issueBannerUrl.setAttribute('href', state.issue.url);
|
||||||
|
} else {
|
||||||
|
const cancelButtonElement = document.getElementsByClassName('report-cancel-button')[0];
|
||||||
|
cancelButtonElement?.addEventListener('click', handleCancelClick);
|
||||||
|
|
||||||
|
const reasonInputElement = document.getElementById('report-input-reason');
|
||||||
|
reasonInputElement?.addEventListener('input', handleInputChange);
|
||||||
|
reasonInputElement?.addEventListener('keydown', handleInputKeyDown);
|
||||||
|
|
||||||
|
if (!state.updateAvailable) {
|
||||||
|
const reportButtonElement = document.getElementById('report-button');
|
||||||
|
reportButtonElement?.addEventListener('click', handleReportClick);
|
||||||
|
reportButtonElement?.removeAttribute('disabled');
|
||||||
|
}
|
||||||
|
|
||||||
|
const urlInputElement = document.getElementById('report-input-url');
|
||||||
|
urlInputElement?.addEventListener('input', handleInputChange);
|
||||||
|
urlInputElement?.addEventListener('keydown', handleInputKeyDown);
|
||||||
|
if (tabUrl) urlInputElement?.setAttribute('value', `${tabUrl.origin}${tabUrl.pathname}`);
|
||||||
|
|
||||||
|
const submitButtonElement = document.getElementsByClassName('report-submit-button')[0];
|
||||||
|
submitButtonElement?.addEventListener('click', handleSubmitButtonClick);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (state.updateAvailable) {
|
||||||
|
const updateBanner = document.getElementById('update-banner');
|
||||||
|
updateBanner.removeAttribute('aria-hidden');
|
||||||
|
|
||||||
|
const updateBannerUrl = document.getElementById('update-banner-url');
|
||||||
|
updateBannerUrl.href += `/tag/${state.updateAvailable}`;
|
||||||
|
}
|
||||||
|
|
||||||
const hostTextElement = document.getElementById('host');
|
const hostTextElement = document.getElementById('host');
|
||||||
hostTextElement.innerText = hostname ?? 'unknown';
|
hostTextElement.innerText = hostname ?? 'unknown';
|
||||||
|
|
||||||
@ -83,7 +156,7 @@ async function handleContentLoaded() {
|
|||||||
|
|
||||||
const powerButtonElement = document.getElementById('power-option');
|
const powerButtonElement = document.getElementById('power-option');
|
||||||
powerButtonElement?.addEventListener('click', handlePowerToggle);
|
powerButtonElement?.addEventListener('click', handlePowerToggle);
|
||||||
if (state.enabled) powerButtonElement?.setAttribute('data-value', 'on');
|
if (state.on) powerButtonElement?.setAttribute('data-value', 'on');
|
||||||
else powerButtonElement?.setAttribute('data-value', 'off');
|
else powerButtonElement?.setAttribute('data-value', 'off');
|
||||||
|
|
||||||
const rateButtonElement = document.getElementById('rate-option');
|
const rateButtonElement = document.getElementById('rate-option');
|
||||||
@ -93,10 +166,10 @@ async function handleContentLoaded() {
|
|||||||
else if (isFirefox) rateButtonElement?.setAttribute('data-href', firefoxUrl);
|
else if (isFirefox) rateButtonElement?.setAttribute('data-href', firefoxUrl);
|
||||||
|
|
||||||
const settingsButtonElement = document.getElementById('settings-button');
|
const settingsButtonElement = document.getElementById('settings-button');
|
||||||
settingsButtonElement.addEventListener('click', handleSettingsClick);
|
settingsButtonElement?.addEventListener('click', handleSettingsClick);
|
||||||
|
|
||||||
translate();
|
translate();
|
||||||
updateDatabaseVersion();
|
await updateDatabaseVersion();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -116,12 +189,12 @@ async function handleDatabaseRefresh(event) {
|
|||||||
|
|
||||||
target.setAttribute('data-refreshing', 'true');
|
target.setAttribute('data-refreshing', 'true');
|
||||||
target.setAttribute('aria-disabled', 'true');
|
target.setAttribute('aria-disabled', 'true');
|
||||||
await browser.runtime.sendMessage({ type: 'REFRESH_DATA' });
|
await dispatch({ type: 'REFRESH_DATA' });
|
||||||
checkIcon.style.setProperty('display', 'block');
|
checkIcon.style.setProperty('display', 'block');
|
||||||
spinnerIcon.style.setProperty('display', 'none');
|
spinnerIcon.style.setProperty('display', 'none');
|
||||||
target.removeAttribute('data-animation');
|
target.removeAttribute('data-animation');
|
||||||
target.removeAttribute('data-refreshing');
|
target.removeAttribute('data-refreshing');
|
||||||
updateDatabaseVersion();
|
await updateDatabaseVersion();
|
||||||
|
|
||||||
window.setTimeout(() => {
|
window.setTimeout(() => {
|
||||||
checkIcon.style.setProperty('display', 'none');
|
checkIcon.style.setProperty('display', 'none');
|
||||||
@ -131,6 +204,25 @@ async function handleDatabaseRefresh(event) {
|
|||||||
}, 5000);
|
}, 5000);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @description Input change handler
|
||||||
|
* @param {InputEvent} event
|
||||||
|
*/
|
||||||
|
function handleInputChange(event) {
|
||||||
|
event.currentTarget.removeAttribute('aria-invalid');
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @description Input key down handler
|
||||||
|
* @param {KeyboardEvent} event
|
||||||
|
*/
|
||||||
|
function handleInputKeyDown(event) {
|
||||||
|
if (event.key === 'Enter') {
|
||||||
|
event.preventDefault();
|
||||||
|
event.currentTarget.blur();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @async
|
* @async
|
||||||
* @description Open a new tab
|
* @description Open a new tab
|
||||||
@ -146,17 +238,32 @@ async function handleLinkRedirect(event) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
* @async
|
||||||
* @description Disable or enable extension on current page
|
* @description Disable or enable extension on current page
|
||||||
* @returns {void}
|
* @returns {void}
|
||||||
*/
|
*/
|
||||||
function handlePowerToggle() {
|
async function handlePowerToggle() {
|
||||||
const next = { enabled: !state.enabled };
|
const next = { on: !state.on };
|
||||||
|
|
||||||
browser.runtime.sendMessage({ hostname, state: next, type: 'SET_HOSTNAME_STATE' });
|
await dispatch({ hostname, state: next, type: 'UPDATE_STORE' });
|
||||||
browser.tabs.reload(state.tabId, { bypassCache: true });
|
await browser.tabs.reload(state.tabId, { bypassCache: true });
|
||||||
window.close();
|
window.close();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @description Show report form
|
||||||
|
* @returns {void}
|
||||||
|
*/
|
||||||
|
function handleReportClick() {
|
||||||
|
const content = document.getElementsByClassName('content')[0];
|
||||||
|
const report = document.getElementsByClassName('report')[0];
|
||||||
|
|
||||||
|
if (content instanceof HTMLElement && report instanceof HTMLElement) {
|
||||||
|
content.style.display = 'none';
|
||||||
|
report.style.removeProperty('display');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @async
|
* @async
|
||||||
* @description Open options page
|
* @description Open options page
|
||||||
@ -166,6 +273,76 @@ async function handleSettingsClick() {
|
|||||||
await browser.runtime.openOptionsPage();
|
await browser.runtime.openOptionsPage();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @async
|
||||||
|
* @description Report submit button click handler
|
||||||
|
* @param {MouseEvent} event
|
||||||
|
*/
|
||||||
|
async function handleSubmitButtonClick(event) {
|
||||||
|
event.preventDefault();
|
||||||
|
|
||||||
|
if (event.currentTarget.getAttribute('aria-disabled') === 'true') {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
event.currentTarget.setAttribute('aria-disabled', 'true');
|
||||||
|
|
||||||
|
const reasonInput = document.getElementById('report-input-reason');
|
||||||
|
const reasonText = reasonInput?.value.trim();
|
||||||
|
const urlInput = document.getElementById('report-input-url');
|
||||||
|
const urlText = urlInput?.value.trim();
|
||||||
|
const errors = validateForm({ reason: reasonText, url: urlText });
|
||||||
|
|
||||||
|
if (errors) {
|
||||||
|
if (errors.reason) {
|
||||||
|
reasonInput?.setAttribute('aria-invalid', 'true');
|
||||||
|
reasonInput?.setAttribute('aria-errormessage', 'report-input-reason-error');
|
||||||
|
}
|
||||||
|
|
||||||
|
if (errors.url) {
|
||||||
|
urlInput?.setAttribute('aria-invalid', 'true');
|
||||||
|
urlInput?.setAttribute('aria-errormessage', 'report-input-url-error');
|
||||||
|
}
|
||||||
|
|
||||||
|
event.currentTarget.setAttribute('aria-disabled', 'false');
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const issueButtons = document.getElementsByClassName('report-issue-button');
|
||||||
|
const formView = document.getElementsByClassName('report-form-view')[0];
|
||||||
|
const userAgent = window.navigator.userAgent;
|
||||||
|
const response = await dispatch({ userAgent, reason: reasonText, url: urlText, type: 'REPORT' });
|
||||||
|
const hostname = new URL(urlText).hostname.split('.').slice(-3).join('.').replace('www.', '');
|
||||||
|
const issue = { expiresIn: Date.now() + 8 * 60 * 60 * 1000, flags: ['bug'], url: response.data };
|
||||||
|
|
||||||
|
if (response.success) {
|
||||||
|
const successView = document.getElementsByClassName('report-submit-success-view')[0];
|
||||||
|
|
||||||
|
await dispatch({ hostname, state: { issue }, type: 'UPDATE_STORE' });
|
||||||
|
await dispatch({ hostname, type: 'ENABLE_ICON' });
|
||||||
|
formView?.setAttribute('hidden', 'true');
|
||||||
|
issueButtons[1]?.addEventListener('click', () => window.open(response.data, '_blank'));
|
||||||
|
successView?.removeAttribute('hidden');
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (response.data) {
|
||||||
|
const errorView = document.getElementsByClassName('report-submit-error-view')[0];
|
||||||
|
|
||||||
|
if (response.errors?.some((error) => error.includes('wontfix'))) {
|
||||||
|
issue.flags.push('wontfix');
|
||||||
|
}
|
||||||
|
|
||||||
|
await dispatch({ hostname, state: { issue }, type: 'UPDATE_STORE' });
|
||||||
|
errorView?.removeAttribute('hidden');
|
||||||
|
formView?.setAttribute('hidden', 'true');
|
||||||
|
issueButtons[0]?.addEventListener('click', () => window.open(response.data, '_blank'));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
window.close();
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @description Apply translations to tags with i18n data attribute
|
* @description Apply translations to tags with i18n data attribute
|
||||||
* @returns {void}
|
* @returns {void}
|
||||||
@ -193,13 +370,41 @@ function translate() {
|
|||||||
* @returns {Promise<void>}
|
* @returns {Promise<void>}
|
||||||
*/
|
*/
|
||||||
async function updateDatabaseVersion() {
|
async function updateDatabaseVersion() {
|
||||||
const data = await browser.runtime.sendMessage({ hostname, type: 'GET_DATA' });
|
const data = await dispatch({ hostname, type: 'GET_DATA' });
|
||||||
const databaseVersionElement = document.getElementById('database-version');
|
const databaseVersionElement = document.getElementById('database-version');
|
||||||
|
|
||||||
if (data.version) databaseVersionElement.innerText = data.version;
|
if (data.version) databaseVersionElement.innerText = data.version;
|
||||||
else databaseVersionElement.style.setProperty('display', 'none');
|
else databaseVersionElement.style.setProperty('display', 'none');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @description Validate form
|
||||||
|
* @param {{ reason: string | undefined | undefined, url: string | undefined }} params
|
||||||
|
* @returns {{ reason: string | undefined, url: string | undefined } | undefined}
|
||||||
|
*/
|
||||||
|
function validateForm(params) {
|
||||||
|
const { reason, url } = params;
|
||||||
|
let errors = undefined;
|
||||||
|
|
||||||
|
if (!reason || reason.length < 10 || reason.length > 1000) {
|
||||||
|
errors = {
|
||||||
|
...(errors ?? {}),
|
||||||
|
reason: browser.i18n.getMessage('report_reasonInputError'),
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
new URL(url);
|
||||||
|
} catch {
|
||||||
|
errors = {
|
||||||
|
...(errors ?? {}),
|
||||||
|
url: browser.i18n.getMessage('report_urlInputError'),
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
return errors;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @description Listen to document ready
|
* @description Listen to document ready
|
||||||
* @listens document#DOMContentLoaded
|
* @listens document#DOMContentLoaded
|
||||||
|
@ -1,276 +0,0 @@
|
|||||||
:root {
|
|
||||||
--cookie-dialog-monster-color-error: #cc0000;
|
|
||||||
--cookie-dialog-monster-color-primary: #3dd9eb;
|
|
||||||
--cookie-dialog-monster-color-secondary: #34495e;
|
|
||||||
--cookie-dialog-monster-color-success: #5cb85c;
|
|
||||||
--cookie-dialog-monster-color-tertiary: #6b7280;
|
|
||||||
--cookie-dialog-monster-color-white: #ffffff;
|
|
||||||
}
|
|
||||||
|
|
||||||
#report-dialog {
|
|
||||||
background-color: var(--cookie-dialog-monster-color-white);
|
|
||||||
border: none;
|
|
||||||
border-radius: 4px;
|
|
||||||
box-sizing: border-box;
|
|
||||||
color: var(--cookie-dialog-monster-color-secondary);
|
|
||||||
font-size: 100%;
|
|
||||||
letter-spacing: normal;
|
|
||||||
margin: auto;
|
|
||||||
padding: 0px;
|
|
||||||
text-align: left;
|
|
||||||
width: 320px;
|
|
||||||
}
|
|
||||||
|
|
||||||
#report-dialog::backdrop {
|
|
||||||
background-color: rgba(0, 0, 0, 0.5);
|
|
||||||
}
|
|
||||||
|
|
||||||
#report-dialog * {
|
|
||||||
box-sizing: border-box;
|
|
||||||
}
|
|
||||||
|
|
||||||
#report-dialog div {
|
|
||||||
all: unset;
|
|
||||||
display: block;
|
|
||||||
box-sizing: border-box;
|
|
||||||
}
|
|
||||||
|
|
||||||
#report-dialog *::-moz-selection {
|
|
||||||
color: var(--cookie-dialog-monster-color-white);
|
|
||||||
background: var(--cookie-dialog-monster-color-tertiary);
|
|
||||||
}
|
|
||||||
|
|
||||||
#report-dialog *::selection {
|
|
||||||
color: var(--cookie-dialog-monster-color-white);
|
|
||||||
background: var(--cookie-dialog-monster-color-tertiary);
|
|
||||||
}
|
|
||||||
|
|
||||||
#report-dialog .report-dialog-body {
|
|
||||||
display: block;
|
|
||||||
font-size: 14px;
|
|
||||||
line-height: 1.2;
|
|
||||||
padding: 16px;
|
|
||||||
}
|
|
||||||
|
|
||||||
#report-dialog .report-dialog-body-text {
|
|
||||||
display: block;
|
|
||||||
font-family: Inter, Arial, Helvetica, sans-serif;
|
|
||||||
font-size: 14px;
|
|
||||||
line-height: 1.2;
|
|
||||||
margin: 0px;
|
|
||||||
padding: 0px;
|
|
||||||
}
|
|
||||||
|
|
||||||
#report-dialog .report-dialog-close-button {
|
|
||||||
align-items: center;
|
|
||||||
background-color: transparent;
|
|
||||||
border: none;
|
|
||||||
border-radius: 4px;
|
|
||||||
cursor: pointer;
|
|
||||||
display: inline-flex;
|
|
||||||
justify-content: center;
|
|
||||||
margin: 0px;
|
|
||||||
outline: none;
|
|
||||||
padding: 0px;
|
|
||||||
}
|
|
||||||
|
|
||||||
#report-dialog .report-dialog-close-button {
|
|
||||||
stroke: var(--cookie-dialog-monster-color-white);
|
|
||||||
}
|
|
||||||
|
|
||||||
#report-dialog .report-dialog-close-button:focus,
|
|
||||||
#report-dialog .report-dialog-close-button:hover > svg {
|
|
||||||
stroke: var(--cookie-dialog-monster-color-secondary);
|
|
||||||
}
|
|
||||||
|
|
||||||
#report-dialog .report-dialog-close-button:focus-visible {
|
|
||||||
box-shadow: initial;
|
|
||||||
transition: initial;
|
|
||||||
}
|
|
||||||
|
|
||||||
#report-dialog .report-dialog-close-button:focus,
|
|
||||||
#report-dialog .report-dialog-close-button:hover {
|
|
||||||
background-color: var(--cookie-dialog-monster-color-white);
|
|
||||||
}
|
|
||||||
|
|
||||||
#report-dialog .report-dialog-form {
|
|
||||||
display: grid;
|
|
||||||
gap: 10px;
|
|
||||||
}
|
|
||||||
|
|
||||||
#report-dialog .report-dialog-form-view {
|
|
||||||
display: flex;
|
|
||||||
flex-direction: column;
|
|
||||||
gap: 24px;
|
|
||||||
}
|
|
||||||
|
|
||||||
#report-dialog .report-dialog-form-view[hidden] {
|
|
||||||
display: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
#report-dialog .report-dialog-header {
|
|
||||||
align-items: center;
|
|
||||||
background-color: var(--cookie-dialog-monster-color-secondary);
|
|
||||||
display: flex;
|
|
||||||
font-size: 16px;
|
|
||||||
height: 54px;
|
|
||||||
justify-content: space-between;
|
|
||||||
line-height: 1.2;
|
|
||||||
padding: 16px;
|
|
||||||
}
|
|
||||||
|
|
||||||
#report-dialog .report-dialog-header-title {
|
|
||||||
color: var(--cookie-dialog-monster-color-white);
|
|
||||||
font-family: Inter, Arial, Helvetica, sans-serif;
|
|
||||||
font-weight: 500;
|
|
||||||
}
|
|
||||||
|
|
||||||
#report-dialog .report-dialog-input {
|
|
||||||
all: unset;
|
|
||||||
border: 1px solid var(--cookie-dialog-monster-color-tertiary);
|
|
||||||
border-radius: 4px;
|
|
||||||
color: var(--cookie-dialog-monster-color-secondary);
|
|
||||||
cursor: text;
|
|
||||||
font-family: Inter, Arial, Helvetica, sans-serif;
|
|
||||||
font-size: 14px;
|
|
||||||
line-height: 1;
|
|
||||||
outline: none;
|
|
||||||
padding: 12px 8px;
|
|
||||||
}
|
|
||||||
|
|
||||||
#report-dialog .report-dialog-input:hover {
|
|
||||||
border-color: var(--cookie-dialog-monster-color-secondary);
|
|
||||||
}
|
|
||||||
|
|
||||||
#report-dialog .report-dialog-input:focus {
|
|
||||||
border-color: var(--cookie-dialog-monster-color-primary);
|
|
||||||
}
|
|
||||||
|
|
||||||
#report-dialog .report-dialog-input:focus-visible {
|
|
||||||
box-shadow: initial;
|
|
||||||
transition: initial;
|
|
||||||
}
|
|
||||||
|
|
||||||
#report-dialog .report-dialog-input::-webkit-scrollbar {
|
|
||||||
display: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
#report-dialog .report-dialog-input[aria-invalid='true'] {
|
|
||||||
border-color: var(--cookie-dialog-monster-color-error);
|
|
||||||
}
|
|
||||||
|
|
||||||
#report-dialog .report-dialog-input[aria-invalid='true'] + .report-dialog-input-error {
|
|
||||||
visibility: visible;
|
|
||||||
}
|
|
||||||
|
|
||||||
#report-dialog .report-dialog-input[aria-multiline='false'] {
|
|
||||||
-ms-overflow-style: none;
|
|
||||||
display: flex;
|
|
||||||
height: 40px;
|
|
||||||
overflow-x: auto;
|
|
||||||
scrollbar-width: none;
|
|
||||||
text-wrap: nowrap;
|
|
||||||
}
|
|
||||||
|
|
||||||
#report-dialog .report-dialog-input[aria-multiline='true'] {
|
|
||||||
-ms-overflow-style: none;
|
|
||||||
height: 120px;
|
|
||||||
overflow-y: auto;
|
|
||||||
scrollbar-width: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
#report-dialog .report-dialog-input-error {
|
|
||||||
color: var(--cookie-dialog-monster-color-error);
|
|
||||||
font-family: Inter, Arial, Helvetica, sans-serif;
|
|
||||||
font-size: 10px;
|
|
||||||
line-height: 1.2;
|
|
||||||
visibility: hidden;
|
|
||||||
}
|
|
||||||
|
|
||||||
#report-dialog .report-dialog-input-group {
|
|
||||||
display: grid;
|
|
||||||
gap: 4px;
|
|
||||||
}
|
|
||||||
|
|
||||||
#report-dialog .report-dialog-input-label {
|
|
||||||
color: var(--cookie-dialog-monster-color-secondary);
|
|
||||||
font-family: Inter, Arial, Helvetica, sans-serif;
|
|
||||||
font-size: 12px;
|
|
||||||
line-height: 1.2;
|
|
||||||
}
|
|
||||||
|
|
||||||
#report-dialog .report-dialog-input-label-required {
|
|
||||||
color: var(--cookie-dialog-monster-color-error);
|
|
||||||
}
|
|
||||||
|
|
||||||
#report-dialog .report-dialog-issue-button,
|
|
||||||
#report-dialog .report-dialog-submit-button {
|
|
||||||
align-items: center;
|
|
||||||
background-color: var(--cookie-dialog-monster-color-secondary);
|
|
||||||
border: 1px solid var(--cookie-dialog-monster-color-secondary);
|
|
||||||
border-radius: 4px;
|
|
||||||
color: var(--cookie-dialog-monster-color-white);
|
|
||||||
cursor: pointer;
|
|
||||||
display: flex;
|
|
||||||
font-family: Inter, Arial, Helvetica, sans-serif;
|
|
||||||
font-size: 14px;
|
|
||||||
height: 42px;
|
|
||||||
justify-content: center;
|
|
||||||
line-height: 1.2;
|
|
||||||
outline: none;
|
|
||||||
padding: 8px 16px;
|
|
||||||
text-align: center;
|
|
||||||
width: 100%;
|
|
||||||
}
|
|
||||||
|
|
||||||
#report-dialog .report-dialog-issue-button:focus,
|
|
||||||
#report-dialog .report-dialog-issue-button:hover,
|
|
||||||
#report-dialog .report-dialog-submit-button:focus,
|
|
||||||
#report-dialog .report-dialog-submit-button:hover {
|
|
||||||
background-color: var(--cookie-dialog-monster-color-white);
|
|
||||||
color: var(--cookie-dialog-monster-color-secondary);
|
|
||||||
}
|
|
||||||
|
|
||||||
#report-dialog .report-dialog-issue-button:focus-visible,
|
|
||||||
#report-dialog .report-dialog-submit-button:focus-visible {
|
|
||||||
box-shadow: initial;
|
|
||||||
transition: initial;
|
|
||||||
}
|
|
||||||
|
|
||||||
#report-dialog .report-dialog-issue-button[aria-disabled='true'],
|
|
||||||
#report-dialog .report-dialog-submit-button[aria-disabled='true'] {
|
|
||||||
background-color: var(--cookie-dialog-monster-color-tertiary);
|
|
||||||
border: 1px solid var(--cookie-dialog-monster-color-tertiary);
|
|
||||||
color: var(--cookie-dialog-monster-color-white);
|
|
||||||
cursor: not-allowed;
|
|
||||||
}
|
|
||||||
|
|
||||||
#report-dialog .report-dialog-submit-extra-text {
|
|
||||||
font-family: inherit;
|
|
||||||
font-size: 14px;
|
|
||||||
line-height: 1.2;
|
|
||||||
margin: 0px;
|
|
||||||
text-align: justify;
|
|
||||||
}
|
|
||||||
|
|
||||||
#report-dialog .report-dialog-submit-text {
|
|
||||||
font-family: inherit;
|
|
||||||
font-size: 18px;
|
|
||||||
line-height: 1.2;
|
|
||||||
margin: 0px;
|
|
||||||
text-align: center;
|
|
||||||
}
|
|
||||||
|
|
||||||
#report-dialog .report-dialog-submit-view {
|
|
||||||
align-items: center;
|
|
||||||
display: flex;
|
|
||||||
flex-direction: column;
|
|
||||||
font-family: Inter, Arial, Helvetica, sans-serif;
|
|
||||||
gap: 24px;
|
|
||||||
justify-content: center;
|
|
||||||
margin-top: 16px;
|
|
||||||
}
|
|
||||||
|
|
||||||
#report-dialog .report-dialog-submit-view[hidden] {
|
|
||||||
display: none;
|
|
||||||
}
|
|
@ -40,6 +40,12 @@ button[data-variant='large'] {
|
|||||||
padding: 8px;
|
padding: 8px;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@media only screen and (max-device-width: 768px) {
|
||||||
|
button[data-variant='large'] {
|
||||||
|
justify-content: flex-end;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
button:focus,
|
button:focus,
|
||||||
button:hover {
|
button:hover {
|
||||||
background-color: var(--color-secondary);
|
background-color: var(--color-secondary);
|
||||||
@ -104,11 +110,18 @@ main {
|
|||||||
|
|
||||||
.button-group {
|
.button-group {
|
||||||
display: flex;
|
display: flex;
|
||||||
justify-content: flex-end;
|
|
||||||
gap: 4px;
|
gap: 4px;
|
||||||
|
justify-content: flex-end;
|
||||||
margin-bottom: 4px;
|
margin-bottom: 4px;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@media only screen and (max-device-width: 768px) {
|
||||||
|
.button-group {
|
||||||
|
display: grid;
|
||||||
|
grid-template-columns: repeat(2, minmax(0px, 1fr));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#exclusion-list {
|
#exclusion-list {
|
||||||
font-size: 14px;
|
font-size: 14px;
|
||||||
list-style: none;
|
list-style: none;
|
||||||
|
@ -11,12 +11,16 @@
|
|||||||
body {
|
body {
|
||||||
box-sizing: border-box;
|
box-sizing: border-box;
|
||||||
color: var(--color-tertiary);
|
color: var(--color-tertiary);
|
||||||
display: flex;
|
|
||||||
flex-direction: column;
|
|
||||||
font-family: Inter, Arial, Helvetica, sans-serif;
|
font-family: Inter, Arial, Helvetica, sans-serif;
|
||||||
width: 320px;
|
width: 320px;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@media only screen and (max-device-width: 768px) {
|
||||||
|
body {
|
||||||
|
width: auto;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
body * {
|
body * {
|
||||||
box-sizing: border-box;
|
box-sizing: border-box;
|
||||||
}
|
}
|
||||||
@ -32,16 +36,22 @@ button {
|
|||||||
outline: none;
|
outline: none;
|
||||||
padding: 2px;
|
padding: 2px;
|
||||||
transition: 0.4s;
|
transition: 0.4s;
|
||||||
}
|
|
||||||
|
|
||||||
button:focus,
|
&:focus:not(:disabled),
|
||||||
button:hover {
|
&:hover:not(:disabled) {
|
||||||
background-color: var(--color-white);
|
background-color: var(--color-white);
|
||||||
color: var(--color-secondary);
|
color: var(--color-secondary);
|
||||||
|
}
|
||||||
|
|
||||||
|
&:disabled {
|
||||||
|
cursor: not-allowed;
|
||||||
|
opacity: 0.5;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
footer {
|
footer {
|
||||||
background-color: var(--color-secondary);
|
background-color: var(--color-secondary);
|
||||||
|
flex-shrink: 0;
|
||||||
font-size: 12px;
|
font-size: 12px;
|
||||||
height: 4px;
|
height: 4px;
|
||||||
margin-top: auto;
|
margin-top: auto;
|
||||||
@ -53,13 +63,58 @@ header {
|
|||||||
background-color: var(--color-secondary);
|
background-color: var(--color-secondary);
|
||||||
color: var(--color-white);
|
color: var(--color-white);
|
||||||
display: flex;
|
display: flex;
|
||||||
|
flex-shrink: 0;
|
||||||
font-size: 16px !important;
|
font-size: 16px !important;
|
||||||
height: 48px;
|
height: 48px;
|
||||||
justify-content: space-between;
|
justify-content: space-between;
|
||||||
padding: 0 16px;
|
padding: 0 16px;
|
||||||
|
|
||||||
|
& .header-actions {
|
||||||
|
display: flex;
|
||||||
|
gap: 8px;
|
||||||
|
|
||||||
|
& #report-button:focus:not(:disabled) > svg,
|
||||||
|
& #report-button:hover:not(:disabled) > svg {
|
||||||
|
color: var(--color-error);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
main {
|
@media only screen and (max-device-width: 768px) {
|
||||||
|
main {
|
||||||
|
margin: 0 auto;
|
||||||
|
max-width: 320px;
|
||||||
|
width: 100%;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
main > .banner {
|
||||||
|
margin: 0px;
|
||||||
|
padding: 16px;
|
||||||
|
|
||||||
|
&[aria-hidden='true'] {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
&[data-variant='notice'] {
|
||||||
|
background-color: #2196f3;
|
||||||
|
color: var(--color-white);
|
||||||
|
}
|
||||||
|
|
||||||
|
&[data-variant='warning'] {
|
||||||
|
background-color: #f39c12;
|
||||||
|
color: #c0392b;
|
||||||
|
}
|
||||||
|
|
||||||
|
& #issue-banner-url,
|
||||||
|
& #update-banner-url {
|
||||||
|
color: inherit;
|
||||||
|
display: inline-block;
|
||||||
|
vertical-align: middle;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
main > .content {
|
||||||
display: grid;
|
display: grid;
|
||||||
grid-template-columns: repeat(2, 1fr);
|
grid-template-columns: repeat(2, 1fr);
|
||||||
gap: 16px;
|
gap: 16px;
|
||||||
@ -142,6 +197,208 @@ popup-data-container {
|
|||||||
text-align: center;
|
text-align: center;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.report {
|
||||||
|
font-family: inherit;
|
||||||
|
font-size: 14px;
|
||||||
|
line-height: 1.2;
|
||||||
|
padding: 16px;
|
||||||
|
|
||||||
|
& .report-buttons {
|
||||||
|
margin-top: auto;
|
||||||
|
}
|
||||||
|
|
||||||
|
& .report-form {
|
||||||
|
display: grid;
|
||||||
|
gap: 10px;
|
||||||
|
}
|
||||||
|
|
||||||
|
& .report-form-view {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
gap: 16px;
|
||||||
|
}
|
||||||
|
|
||||||
|
& .report-form-view[hidden] {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
& .report-input {
|
||||||
|
all: unset;
|
||||||
|
border: 1px solid var(--color-tertiary);
|
||||||
|
border-radius: 4px;
|
||||||
|
color: var(--color-secondary);
|
||||||
|
cursor: text;
|
||||||
|
font-family: Inter, Arial, Helvetica, sans-serif;
|
||||||
|
font-size: 14px;
|
||||||
|
line-height: 1;
|
||||||
|
outline: none;
|
||||||
|
padding: 12px 8px;
|
||||||
|
}
|
||||||
|
|
||||||
|
& .report-input:hover {
|
||||||
|
border-color: var(--color-secondary);
|
||||||
|
}
|
||||||
|
|
||||||
|
& .report-input:focus {
|
||||||
|
border-color: var(--color-primary);
|
||||||
|
}
|
||||||
|
|
||||||
|
& .report-input:focus-visible {
|
||||||
|
box-shadow: initial;
|
||||||
|
transition: initial;
|
||||||
|
}
|
||||||
|
|
||||||
|
& .report-input::-webkit-scrollbar {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
& .report-input[aria-invalid='true'] {
|
||||||
|
border-color: var(--color-error);
|
||||||
|
}
|
||||||
|
|
||||||
|
& .report-input[aria-invalid='true'] + .report-input-error {
|
||||||
|
display: block;
|
||||||
|
}
|
||||||
|
|
||||||
|
& .report-input[aria-multiline='false'] {
|
||||||
|
-ms-overflow-style: none;
|
||||||
|
display: flex;
|
||||||
|
height: 40px;
|
||||||
|
overflow-x: auto;
|
||||||
|
scrollbar-width: none;
|
||||||
|
text-wrap: nowrap;
|
||||||
|
}
|
||||||
|
|
||||||
|
& .report-input[aria-multiline='true'] {
|
||||||
|
-ms-overflow-style: none;
|
||||||
|
height: 120px;
|
||||||
|
overflow-y: auto;
|
||||||
|
scrollbar-width: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
& .report-input-error {
|
||||||
|
color: var(--color-error);
|
||||||
|
display: none;
|
||||||
|
font-family: Inter, Arial, Helvetica, sans-serif;
|
||||||
|
font-size: 10px;
|
||||||
|
line-height: 1.2;
|
||||||
|
}
|
||||||
|
|
||||||
|
& .report-input-group {
|
||||||
|
display: grid;
|
||||||
|
gap: 4px;
|
||||||
|
}
|
||||||
|
|
||||||
|
& .report-input-label {
|
||||||
|
color: var(--color-secondary);
|
||||||
|
font-family: Inter, Arial, Helvetica, sans-serif;
|
||||||
|
font-size: 12px;
|
||||||
|
line-height: 1.2;
|
||||||
|
}
|
||||||
|
|
||||||
|
& .report-input-label-required {
|
||||||
|
color: var(--color-error);
|
||||||
|
}
|
||||||
|
|
||||||
|
& .report-cancel-button {
|
||||||
|
align-items: center;
|
||||||
|
background-color: var(--color-white);
|
||||||
|
color: var(--color-secondary);
|
||||||
|
cursor: pointer;
|
||||||
|
display: flex;
|
||||||
|
font-family: Inter, Arial, Helvetica, sans-serif;
|
||||||
|
font-size: 14px;
|
||||||
|
justify-content: center;
|
||||||
|
line-height: 1.2;
|
||||||
|
margin-left: auto;
|
||||||
|
margin-right: auto;
|
||||||
|
margin-top: 16px;
|
||||||
|
outline: none;
|
||||||
|
padding: 0px;
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
& .report-cancel-button:focus,
|
||||||
|
& .report-cancel-button:hover {
|
||||||
|
color: var(--color-error);
|
||||||
|
}
|
||||||
|
|
||||||
|
& .report-issue-button,
|
||||||
|
& .report-submit-button {
|
||||||
|
align-items: center;
|
||||||
|
background-color: var(--color-secondary);
|
||||||
|
border: 1px solid var(--color-secondary);
|
||||||
|
border-radius: 4px;
|
||||||
|
color: var(--color-white);
|
||||||
|
cursor: pointer;
|
||||||
|
display: flex;
|
||||||
|
font-family: Inter, Arial, Helvetica, sans-serif;
|
||||||
|
font-size: 14px;
|
||||||
|
height: 42px;
|
||||||
|
justify-content: center;
|
||||||
|
line-height: 1.2;
|
||||||
|
margin-top: 8px;
|
||||||
|
outline: none;
|
||||||
|
padding: 8px 16px;
|
||||||
|
text-align: center;
|
||||||
|
width: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
& .report-issue-button:focus,
|
||||||
|
& .report-issue-button:hover,
|
||||||
|
& .report-submit-button:focus,
|
||||||
|
& .report-submit-button:hover {
|
||||||
|
background-color: var(--color-white);
|
||||||
|
color: var(--color-secondary);
|
||||||
|
}
|
||||||
|
|
||||||
|
& .report-issue-button:focus-visible,
|
||||||
|
& .report-submit-button:focus-visible {
|
||||||
|
box-shadow: initial;
|
||||||
|
transition: initial;
|
||||||
|
}
|
||||||
|
|
||||||
|
& .report-issue-button[aria-disabled='true'],
|
||||||
|
& .report-submit-button[aria-disabled='true'] {
|
||||||
|
background-color: var(--color-tertiary);
|
||||||
|
border: 1px solid var(--color-tertiary);
|
||||||
|
color: var(--color-white);
|
||||||
|
cursor: not-allowed;
|
||||||
|
}
|
||||||
|
|
||||||
|
& .report-submit-extra-text {
|
||||||
|
font-family: inherit;
|
||||||
|
font-size: 14px;
|
||||||
|
line-height: 1.2;
|
||||||
|
margin: 0px;
|
||||||
|
text-align: justify;
|
||||||
|
}
|
||||||
|
|
||||||
|
& .report-submit-text {
|
||||||
|
font-family: inherit;
|
||||||
|
font-size: 18px;
|
||||||
|
line-height: 1.2;
|
||||||
|
margin: 0px;
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
& .report-submit-error-view,
|
||||||
|
& .report-submit-success-view {
|
||||||
|
align-items: center;
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
font-family: Inter, Arial, Helvetica, sans-serif;
|
||||||
|
gap: 24px;
|
||||||
|
justify-content: center;
|
||||||
|
margin-top: 16px;
|
||||||
|
}
|
||||||
|
|
||||||
|
& .report-submit-error-view[hidden],
|
||||||
|
& .report-submit-success-view[hidden] {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
strong {
|
strong {
|
||||||
font-weight: bold;
|
font-weight: bold;
|
||||||
}
|
}
|
||||||
|
BIN
packages/web/src/images/issue.png
Normal file
After Width: | Height: | Size: 12 KiB |
Before Width: | Height: | Size: 28 KiB After Width: | Height: | Size: 27 KiB |
Before Width: | Height: | Size: 15 KiB After Width: | Height: | Size: 28 KiB |
@ -35,6 +35,6 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
.image {
|
.image {
|
||||||
@apply self-center max-w-sm md:self-start rounded-lg shadow-2xl shrink-0 w-full;
|
@apply max-w-sm rounded-lg shadow-2xl shrink-0 w-full;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -216,8 +216,8 @@
|
|||||||
</a>
|
</a>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="flex flex-col gap-8 md:flex-row md:gap-20 md:py-20 py-10">
|
<div class="flex flex-col gap-8 items-center md:flex-row md:gap-20 md:py-20 py-10">
|
||||||
<div class="md:mt-14">
|
<div>
|
||||||
<h2>A powerful popup to manage all from a single place</h2>
|
<h2>A powerful popup to manage all from a single place</h2>
|
||||||
<p class="mt-8 text-gray-500 text-xl">
|
<p class="mt-8 text-gray-500 text-xl">
|
||||||
Disable the extension if you would like to accept cookies in a specific page, contribute
|
Disable the extension if you would like to accept cookies in a specific page, contribute
|
||||||
@ -227,9 +227,9 @@
|
|||||||
</div>
|
</div>
|
||||||
<img alt="Extension Popup" class="image" src="/images/popup.png" />
|
<img alt="Extension Popup" class="image" src="/images/popup.png" />
|
||||||
</div>
|
</div>
|
||||||
<div class="flex flex-col-reverse gap-8 md:flex-row md:gap-20 md:py-20 py-10">
|
<div class="flex flex-col-reverse gap-8 items-center md:flex-row md:gap-20 md:py-20 py-10">
|
||||||
<img alt="Extension Report Button" class="image" src="/images/report.png" />
|
<img alt="Extension Report Button" class="image" src="/images/report.png" />
|
||||||
<div class="md:mt-14">
|
<div>
|
||||||
<h2>We are not perfect but we try</h2>
|
<h2>We are not perfect but we try</h2>
|
||||||
<p class="mt-8 text-gray-500 text-xl">
|
<p class="mt-8 text-gray-500 text-xl">
|
||||||
Report any page that works bad with our extension, just right-click anywhere on the page
|
Report any page that works bad with our extension, just right-click anywhere on the page
|
||||||
@ -242,8 +242,23 @@
|
|||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="flex flex-col gap-8 md:flex-row md:gap-20 md:py-20 py-10">
|
<div class="flex flex-col-reverse gap-8 items-center md:flex-row md:gap-20 md:py-20 py-10">
|
||||||
<div class="md:mt-14">
|
<div>
|
||||||
|
<h2>Real-time issue tracking</h2>
|
||||||
|
<p class="mt-8 text-gray-500 text-xl">
|
||||||
|
Track issues as they happen with real-time GitHub updates. Each report submitted is
|
||||||
|
instantly recorded on our GitHub issues page, giving our team visibility to work on it
|
||||||
|
immediately.
|
||||||
|
</p>
|
||||||
|
<p class="mt-4 text-gray-500 text-xl">
|
||||||
|
You can view the progress, add comments, and even watch the repository to stay informed.
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
<img alt="GitHub Issue Tracking" class="image" src="/images/issue.png" />
|
||||||
|
</div>
|
||||||
|
<div class="flex flex-col gap-8 items-center md:flex-row md:gap-20 md:py-20 py-10">
|
||||||
|
<img alt="Extension Options" class="image" src="/images/options.png" />
|
||||||
|
<div>
|
||||||
<h2>Manage your exclusions</h2>
|
<h2>Manage your exclusions</h2>
|
||||||
<p class="mt-8 text-gray-500 text-xl">
|
<p class="mt-8 text-gray-500 text-xl">
|
||||||
Clear, import and export your preferences with one click. Users have full control over
|
Clear, import and export your preferences with one click. Users have full control over
|
||||||
@ -254,7 +269,6 @@
|
|||||||
implementations or where the extension may cause unintended side effects.
|
implementations or where the extension may cause unintended side effects.
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
<img alt="Extension Options" class="image" src="/images/options.png" />
|
|
||||||
</div>
|
</div>
|
||||||
<div class="md:py-20 py-10">
|
<div class="md:py-20 py-10">
|
||||||
<div class="md:text-center">
|
<div class="md:text-center">
|
||||||
|